Compare commits

...

5 Commits

Author SHA1 Message Date
erjer-odoo
10e0f06f22 [IMP] Inventory: Bringing least packages current
closes odoo/documentation#15810

X-original-commit: 4986e56f20
Signed-off-by: Felicia Kuan (feku) <feku@odoo.com>
Signed-off-by: Erin Jerison (erjer) <erjer@odoo.com>
Co-authored-by: larm-odoo <121518652+larm-odoo@users.noreply.github.com>
Co-authored-by: larm-odoo <121518652+larm-odoo@users.noreply.github.com>
2025-12-20 00:43:55 +00:00
larm-odoo
5a31c48763 [IMP] Payroll - Salary rule form details
closes odoo/documentation#15802

X-original-commit: 9ff88695ce
Signed-off-by: Lara Martini (larm) <larm@odoo.com>
2025-12-19 19:15:40 +00:00
afma-odoo
a7977c8019 [ADD] l10n_OM: new omani localization page
task-5359713

closes odoo/documentation#15798

X-original-commit: 76ac3a76e7
Signed-off-by: Anne-Françoise Marcq (afma) <afma@odoo.com>
Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
2025-12-19 16:33:26 +00:00
Chrysanthe (chgo)
3369a800fb [IMP] reference/user_interface: update Odoo UI icons list
This commit updates the `Odoo UI icons` library in order to showcase all
the new icons recently added. This should ease adoptions by developers
as well as providing a clear overview about whether an icon is available
or not.

task-5430888

closes odoo/documentation#15796

Signed-off-by: Chrysanthe Gomrée (chgo) <chgo@odoo.com>
2025-12-19 16:33:17 +00:00
xpl-odoo
7a618ff0ca [IMP] odoo sh: settings update
closes odoo/documentation#15772

X-original-commit: fc1ab901b1
Signed-off-by: Audrey Vandromme (auva) <auva@odoo.com>
Signed-off-by: Xavier Platteau (xpl) <xpl@odoo.com>
2025-12-19 15:08:44 +00:00
36 changed files with 962 additions and 313 deletions

View File

@@ -28,7 +28,7 @@ and add them to your addons path automatically so you can install them in your d
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 <odoosh-gettingstarted-settings-submodules>`.
The procedure is detailed in the chapter :ref:`Settings > Submodules <odoo-sh/settings/submodules>`.
Adding a submodule
==================
@@ -38,7 +38,7 @@ 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 <odoosh-advanced-submodules-withgit>`.
do so :ref:`with Git <odoo-sh/settings/submodules>`.
On Odoo.sh, in the branches view of your project, choose the branch in which you want to add a submodule.

View File

@@ -2,7 +2,7 @@
Branches
========
The branches view provides an overview of the different branches in your repository.
The :guilabel:`Branches` view provides an overview of the different branches in your repository.
.. _odoo-sh/branches/stages:
@@ -109,9 +109,14 @@ documentation <odoo-sh/module/add>` to view examples.
Staging databases are not automatically backed up. Nevertheless, you can restore a backup of the
production database in a staging branch for testing purposes or to manually recover data that has
been accidently deleted from the production database. It is possible to create manual backups of
been accidentally deleted from the production database. It is possible to create manual backups of
staging databases.
.. warning::
Databases created for staging branches are intended to last up to three months. After that, they
can be automatically blocked without prior notice. Only rebuilding the branch will allow you to
use that specific branch again.
.. _odoo-sh/branches/stages/development:
Development
@@ -704,7 +709,9 @@ Clone
The clone command is used to create a local copy of your Git repository.
.. example::
:command:`git clone --recurse-submodules --branch development git@github.com:my-organization/my-repository.git`
.. code-block:: shell
git clone --recurse-submodules --branch development git@github.com:my-organization/my-repository.git
- `--recurse-submodules` to download the submodules of your repository
- `--branch main` to check out to a specific branch of the repository (e.g., `development`)
@@ -720,11 +727,13 @@ Fork
The fork command is used to create a new branch based on the current one.
.. example::
:command:`git checkout -b main-1 development && git push -u origin development-1`
.. code-block:: shell
- :command:`git checkout -b main-1 main` a command to create a new branch (e.g., `development-1`)
git checkout -b main-1 development && git push -u origin development-1
- `git checkout -b main-1 main` a command to create a new branch (e.g., `development-1`)
based on the current branch (e.g., `development`)
- :command:`git push -u origin development-1` a command to upload the new branch (e.g.,
- `git push -u origin development-1` a command to upload the new branch (e.g.,
`development-1`) to the remote repository
.. _odoo-sh/branches/shell-commands/merge:
@@ -735,11 +744,13 @@ Merge
The merge command is used to combine changes on one branch into another branch.
.. example::
:command:`git merge staging-1 && git push -u origin staging`
.. code-block:: shell
- :command:`git merge staging-1` a command to merge the changes of the current branch into
git merge staging-1 && git push -u origin staging
- `git merge staging-1` a command to merge the changes of the current branch into
another branch (e.g., `staging-1`)
- :command:`git push -u origin staging` a command to upload the merged changes to the remote
- `git push -u origin staging` a command to upload the merged changes to the remote
repository branch (e.g., `staging`)
.. _odoo-sh/branches/shell-commands/ssh:
@@ -764,13 +775,15 @@ To use the SSH command, it is necessary to set up an SSH key first. To do so:
:alt: Adding an SSH key manually
.. example::
:command:`ssh 25004381@my-user-my-repository-staging-25004381.dev.odoo.com`
.. code-block:: shell
ssh 25004381@my-user-my-repository-staging-25004381.dev.odoo.com
- `25004381` the build ID
- `my-user-my-repository-staging-25004381.dev.odoo.com` the domain used to connect to the build
Provided you have the necessary :ref:`access rights <odoosh-gettingstarted-settings-collaborators>`
on the project, you will be granted SSH access to the build.
Provided you have the necessary :ref:`access rights <odoo-sh/settings/collaborators>` on the
project, you will be granted SSH access to the build.
.. note::
Long-running SSH connections are not guaranteed. Idle connections can be disconnected to free up
@@ -788,13 +801,15 @@ submodule.
:doc:`Submodules documentation <../advanced/submodules>`
.. example::
:command:`git submodule add -b master <URL> <PATH> && git commit -a && git push -u origin staging`
.. code-block:: shell
- :command:`git submodule add -b master <URL> <PATH>` a command to add a specific branch (e.g.,
git submodule add -b master <URL> <PATH> && git commit -a && git push -u origin staging
- `git submodule add -b master <URL> <PATH>` a command to add a specific branch (e.g.,
`master`) of a repository (`<URL>`) as a submodule under the specified path (`<PATH>`) in
your current branch.
- :command:`git commit -a` a command to commit all current changes
- :command:`git push -u origin staging` a command to upload the changes of the current branch
- `git commit -a` a command to commit all current changes
- `git push -u origin staging` a command to upload the changes of the current branch
(e.g., `staging`) to the remote repository.
.. _odoo-sh/branches/shell-commands/delete:
@@ -809,11 +824,13 @@ The delete command is used to delete a branch from your repository.
are not automatically backed up, but can be manually. Development branches cannot be backed up.
.. example::
:command:`git push origin :staging && git branch -D staging`
.. code-block:: shell
- :command:`git push origin :staging` a command to delete a specific branch (e.g., `staging`) on
git push origin :staging && git branch -D staging
- `git push origin :staging` a command to delete a specific branch (e.g., `staging`) on
the remote repository
- :command:`git branch -D staging` a command to delete the specific branch on your local copy of
- `git branch -D staging` a command to delete the specific branch on your local copy of
the repository
.. warning::

View File

@@ -16,7 +16,7 @@ Overview
.. image:: builds/builds-overview.png
:alt: Overiew of the builds
In the :guilabel:`Builds` overview, a row represents a branch, and a cell within that row represents
In the :guilabel:`Builds` view, a row represents a branch, and a cell within that row represents
a build of that branch.
Most builds are created after pushes to your GitHub repository branches. They can also be created

View File

@@ -2,338 +2,375 @@
Settings
========
Overview
========
The :guilabel:`Settings` view allow you to manage the configuration of your project.
The settings allow you to manage the configuration of your project.
.. image:: settings/interface-settings.png
:align: center
.. _odoo-sh/settings/name:
Project name
============
The name of your project.
The name of your project defines the address used to access your production database. The addresses
of your staging and development builds are automatically derived from this name. If you change the
project name, only future builds will use the new name.
.. image:: settings/interface-settings-projectname.png
:align: center
.. image:: settings/project-name.png
:alt: The project name setting
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:
.. _odoo-sh/settings/collaborators:
Collaborators
=============
Manage the Github users who can access your project.
To grant access to a GitHub user, enter their username and click :guilabel:`Add`. By default, the
user is is granted the :guilabel:`Developer` role. Click the dropdown menu to select another one:
.. image:: settings/interface-settings-collaborators.png
:align: center
- :guilabel:`Admin`: full access to all Odoo.sh features and tools. This role is dedicated to
project management and has exclusive access to the project's settings.
- :guilabel:`Tester`: access to staging and development databases and their tools. This role is
intended for users performing user acceptance testing (UAT). Testers can work with copies of
production data, but they cannot access the production database through Odoo.sh's tools.
- :guilabel:`Developer`: no access to the production and staging databases. This role is intended
for users who modify the code but should not access production data. Developers cannot connect to
the production or staging databases and do not have access to the web shell or server logs.
There are three levels of users:
.. image:: settings/collaborators.png
:alt: The collaborators setting
- :guilabel:`Admin`: has access to all features of an Odoo.sh project.
.. _odoo-sh/settings/collaborators/table:
- :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.
Feature access by stage and role
--------------------------------
.. list-table::
:header-rows: 1
:stub-columns: 1
:widths: auto
* -
-
* - Stage
- Feature
- Developer
- Tester
- Admin
* - Development
- History
- Connect + / Connect as
- |green|
- |green|
- |green|
* -
- 1-click connect
- :ref:`History <odoo-sh/branches/tabs/history>`
- |green|
- |green|
- |green|
* -
- Logs
- :ref:`Mails <odoo-sh/branches/tabs/mails>`
- |green|
- |green|
- |green|
* -
- Shell/SSH
- :ref:`Editor <odoo-sh/branches/tabs/editor>`
- |green|
- |green|
- |green|
* -
- Mails
- :ref:`Monitor <odoo-sh/branches/tabs/monitor>`
- |green|
- |green|
- |green|
* -
- Settings
- :ref:`Logs <odoo-sh/branches/tabs/logs>`
- |green|
- |green|
- |green|
* -
- :ref:`Upgrade <odoo-sh/branches/tabs/upgrade>`
- |green|
- |green|
- |green|
* -
- :ref:`Settings <odoo-sh/branches/tabs/settings>`
- |green|
- |green|
- |green|
* -
- Status
- |green|
- |green|
- |green|
* - Staging
- History
- Connect + / Connect as
- |green|
- |green|
- |green|
* -
- 1-click connect
-
- :ref:`History <odoo-sh/branches/tabs/history>`
- |green|
- |green|
- |green|
* -
- Logs
-
- :ref:`Mails <odoo-sh/branches/tabs/mails>`
- |red|
- |green|
- |green|
* -
- Shell/SSH
-
- :ref:`Shell <odoo-sh/branches/tabs/shell>`
- |red|
- |green|
- |green|
* -
- Mails
-
- :ref:`Editor <odoo-sh/branches/tabs/editor>`
- |red|
- |green|
- |green|
* -
- Monitoring
-
- :ref:`Monitor <odoo-sh/branches/tabs/monitor>`
- |red|
- |green|
- |green|
* -
- Backups
-
-
- |green|
* -
- Upgrade
-
- :ref:`Logs <odoo-sh/branches/tabs/logs>`
- |red|
- |green|
- |green|
* -
- Settings
-
- :ref:`Upgrade <odoo-sh/branches/tabs/upgrade>`
- |red|
- |green|
- |green|
* -
- :ref:`Settings <odoo-sh/branches/tabs/settings>`
- |red|
- |green|
- |green|
* -
- Status
- |green|
- |green|
- |green|
* - Production
- History
- Connect + / Connect as
- |green|
- |green|
- |green|
* -
- 1-click connect
-
-
- :ref:`History <odoo-sh/branches/tabs/history>`
- |green|
- |green|
- |green|
* -
- Logs
-
-
- :ref:`Shell <odoo-sh/branches/tabs/shell>`
- |red|
- |red|
- |green|
* -
- Shell/SSH
-
-
- :ref:`Editor <odoo-sh/branches/tabs/editor>`
- |red|
- |red|
- |green|
* -
- Mails
-
-
- :ref:`Monitor <odoo-sh/branches/tabs/monitor>`
- |red|
- |red|
- |green|
* -
- Monitoring
-
-
- :ref:`Logs <odoo-sh/branches/tabs/logs>`
- |red|
- |red|
- |green|
* -
- Backups
-
-
- :ref:`Backups <odoo-sh/branches/tabs/backups>`
- |red|
- |red|
- |green|
* -
- Upgrade
-
-
- :ref:`Upgrade <odoo-sh/branches/tabs/upgrade>`
- |red|
- |red|
- |green|
* -
- Settings
-
-
- :ref:`Settings <odoo-sh/branches/tabs/settings>`
- |red|
- |red|
- |green|
* - Status
-
* -
- 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.
.. admonition:: Legend
|green| : Available
|red| : Not available
.. |green| raw:: html
<span class="text-success" style="font-size: 32px; line-height: 0.5">●</span>
.. |orange| raw:: html
<span class="text-warning" style="font-size: 32px; line-height: 0.5">●</span>
<span class="text-success" style="font-size: 32px; line-height: 32px; display: inline-block; vertical-align: middle;">●</span>
.. |red| raw:: html
<span class="text-danger" style="font-size: 32px; line-height: 0.5">●</span>
<span class="text-danger" style="font-size: 32px; line-height: 32px; display: inline-block; vertical-align: middle;">●</span>
Public Access
.. note::
- Only admins can access the audit logs and the project settings.
- All roles can access the :doc:`builds page <builds>`, but the features available are specific
to each role.
.. _odoo-sh/settings/public:
Public access
=============
Allow public access to your development builds.
When enabling :guilabel:`Allow public access`, the :doc:`builds page <builds>` becomes publicly
accessible, allowing visitors to connect to development builds. Visitors can also access :ref:`logs
<odoo-sh/branches/tabs/logs>`, the :ref:`shell <odoo-sh/branches/tabs/shell>`, and :ref:`mails
<odoo-sh/branches/tabs/mails>` for development builds. Production and staging builds remain private;
visitors can only view their status.
.. image:: settings/interface-settings-public.png
:align: center
.. image:: settings/public-access.png
:alt: The public access setting
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:
.. _odoo-sh/settings/commit:
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.
You can add a GitHub token to allow Odoo.sh to push commit statuses back to GitHub. The token must
have the *commit statuses (write)* repository permission.
.. image:: settings/commit-statuses.png
:alt: The GitHub commit statuses setting
.. seealso::
For more information, refer to `GitHubs documentation on managing access tokens <https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens>`_.
.. _odoo-sh/settings/key-webhook:
GitHub key and webhook
======================
A deploy key and a webhook are automatically created on your GitHub repository to allow Odoo.sh to
fetch code and receive commit notifications. As they can be unintentionally modified or deleted,
you can use the :guilabel:`Verify Deploy Key` and :guilabel:`Verify Webhook` buttons below to verify
their configuration.
.. image:: settings/key-webhook.png
:alt: The GitHub key and webhook setting
.. 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.
Administrative rights on the GitHub repository are necessary.
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
<odoo-sh/branches/tabs/settings>`.
.. _odoosh-gettingstarted-settings-submodules:
.. _odoo-sh/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.
The `git submodule` command allows you to `integrate other Git projects
<https://git-scm.com/book/en/v2/Git-Tools-Submodules>`_ into your codebase without copying the code
directly.
.. 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
<odoosh-advanced-submodules>` of this documentation.
.. image:: settings/submodules.png
:alt: The submodules setting
:scale: 50%
.. image:: settings/interface-settings-submodules.png
:align: center
.. note::
A Git repository containing Odoo modules, for example from the `Odoo Apps Store
<https://apps.odoo.com/apps>`_ or `community modules <https://github.com/OCA>`_, is necessary.
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.
.. admonition:: Private repositories
To configure the deploy key for a private repository, proceed as follows:
Before adding `private GitHub repository
<https://help.github.com/articles/making-a-public-repository-private/>`_ as a submodule, it is
necessary to add a deploy key:
* in the input, paste the SSH URL of your private sub-repository and click on *Add*,
#. Paste the SSH URL of the sub-repository (e.g., `git@github.com:USERNAME/REPOSITORY.git`) and
click :guilabel:`Add`.
#. Copy the generated :guilabel:`Public Key`.
#. On the sub-repository's GitHub, go to :menuselection:`Settings --> Deploy keys`.
#. Click :menuselection:`Add deploy key`, enter a :guilabel:`Title`, paste the public key into
the :guilabel:`Key` field, and click :guilabel:`Add key`.
* 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
To add a public repository or private repository with a deploy key as a submodule:
* copy the public key,
#. Add the submodule to your project.
* it should look like *ssh-rsa some...random...characters...here...==*
.. code-block:: shell
* in the settings of the private sub-repository, add the public key amongst the deploy keys.
git submodule add -b BRANCH git@github.com:USERNAME/REPOSITORY.git PATH
* 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 users authorized_keys file in its .ssh directory
#. Commit and push the change.
Storage Size
============
.. code-block:: shell
This section shows the storage size used by your project.
git commit -a && git push -u origin master
.. image:: settings/interface-settings-storage.png
:align: center
#. Wait for Odoo.sh to rebuild the project.
Storage size is computed as follows:
.. _odoo-sh/settings/storage:
* the size of the PostgreSQL database
Production database size
========================
* the size of the disk files available in your container: database filestore, sessions storage directory...
This section displays the total storage used by the project. It includes the PostgreSQL database
size and disk files in your container (database filestore, session storage, etc.). If the production
database exceeds the storage included in your subscription, the plan will be automatically adjusted.
.. 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.
.. image:: settings/database-size.png
:alt: The production database size setting
Should your production database size grow to exceed what's provisioned in your subscription, it
will automatically be synchronized with it.
.. tip::
To analyze disk usage, run the `Ncdu tool <https://dev.yorhel.nl/ncdu/man>`_ in the :ref:`web
shell <odoo-sh/branches/tabs/shell>`.
Database Workers
.. _odoo-sh/settings/workers:
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.
Additional database workers can be configured to allow your production database to handle higher
concurrent loads.
.. image:: settings/interface-settings-workers.png
:align: center
.. image:: settings/database-workers.png
:alt: The database workers setting
.. 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>`_.
To add more workers, contact your account manager. After payment, the new worker(s) will be added to
your project.
Staging Branches
.. note::
Adding more workers does not automatically fix performance issues. It only increases the number
of concurrent connections the server can handle. If some operations remain slow, the issue is
likely code-related. If it is not due to your customizations, contact `Odoo Support
<https://www.odoo.com/help>`_.
.. _odoo-sh/settings/staging:
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.
Additional staging branches allow you to develop and test multiple features simultaneously. To add
more staging branches, request a product increase directly from your Odoo.sh project. A widget will
guide you to the subscription portal to complete the purchase. After payment, synchronization with
Odoo.sh will occur automatically, and the number of available staging branches will be updated.
.. image:: settings/interface-settings-staging-branches.png
:align: center
.. image:: settings/staging-branches.png
:alt: The staging branches setting
.. _odoo-sh/settings/activation:
Activation
==========
Shows the status of the project's activation. You can change the project's activation code if
needed.
This section shows the activation status of the project. You can change the activation code if
necessary, provided the new code is not already assigned to another project.
.. image:: settings/interface-settings-activation.png
:align: center
.. image:: settings/activation.png
:alt: The staging branches setting
.. warning::
You cannot change the activation code to:
- A code already used in another project
- A trial code (downgrading from paid to trial is not allowed)
- An invalid code (not linked to an Odoo.sh custom plan)
For any other issue, contact `Odoo Support <https://www.odoo.com/help>`_.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View File

@@ -114,6 +114,7 @@ Fiscal localization modules are available for the countries listed below.
- Niger
- Nigeria
- Norway
- :doc:`Oman <fiscal_localizations/oman>`
- Pakistan
- Panama
- :doc:`Peru <fiscal_localizations/peru>`
@@ -176,6 +177,7 @@ Fiscal localization modules are available for the countries listed below.
fiscal_localizations/mexico
fiscal_localizations/netherlands
fiscal_localizations/new_zealand
fiscal_localizations/oman
fiscal_localizations/peru
fiscal_localizations/philippines
fiscal_localizations/romania

View File

@@ -0,0 +1,98 @@
====
Oman
====
.. _localizations/oman/modules:
Modules
=======
The following modules related to the Omani localization are available:
.. list-table::
:header-rows: 1
:widths: 25 25 50
* - Name
- Technical name
- Description
* - :guilabel:`Oman - Accounting`
- `l10n_om`
- Omani :ref:`fiscal localization package <fiscal_localizations/packages>`, complete with the
local chart of accounts, taxes, tax report, and fiscal positions.
* - :guilabel:`Oman - Accounting Reports`
- `l10n_om_reports`
- Accounting reports for Oman.
.. note::
The module automatically installs core configurations. A manual :doc:`update
</applications/general/apps_modules>` may be required for missing elements or updates.
.. _localizations/oman/loc-review:
Localization overview
=====================
The Omani localization package provides the necessary accounting setup for companies operating in
Oman, including a pre-configured chart of accounts, taxes, fiscal positions, and a standard tax
report format. It ensures alignment with Oman VAT regulations and Royal Decree requirements.
The Omani localization package provides the following key features to ensure compliance with local
fiscal and accounting regulations:
- :ref:`Chart of Accounts <localizations/oman/chart-of-accounts>`: based on Omani standards, with
mapped account groups and default account mappings.
- :ref:`Taxes <localizations/oman/taxes>`: standard 5% VAT, zero-rated domestic as well as exports,
exempt, imports, and reverse charge taxes.
- :doc:`Fiscal Positions <../accounting/taxes/fiscal_positions>`: automated tax adjustments based
on customer or supplier registration status.
- :ref:`Tax Report <localizations/oman/tax-report>`: structured according to the Oman VAT return
format, as issued by the Tax Authority.
.. _localizations/oman/chart-of-accounts:
Chart of accounts
-----------------
The Omani :doc:`chart of accounts <../accounting/get_started/chart_of_accounts>` is based on the
local rules and regulations. This includes pre-configured account groups and mapped default
accounts. Use the :ref:`predefined structure <chart-of-account/create>` or create new accounts, as
needed.
.. note::
Accounts are grouped under relevant categories such as assets, liabilities, income, and expenses
in line with local standards.
.. _localizations/oman/taxes:
Taxes
-----
The following :doc:`Taxes <../accounting/taxes>`, included in the Omani VAT system, are available by
default with the Omani localization package:
- Standard Rate 5%: Applies to the sale of most goods and services within Oman.
- Zero-Rated Supplies (0%): Applies to essential supplies where the seller can still reclaim input
VAT.
- Exports (0%): Applies to the supply of goods and services that are exported outside Oman.
- Exempt Supplies: Applies to supplies that are not subject to VAT, and for which the supplier
cannot reclaim input VAT on related purchases.
- Reverse Charge Mechanism (RCM): Applies to taxable businesses in Oman receiving services or goods
from non-resident suppliers not registered for VAT in Oman.
- Import VAT (5%): Applies to the importation of most goods into Oman, charged at the customs
point of entry.
.. _localizations/oman/tax-report:
Tax report
----------
The :ref:`VAT return <accounting/tax-returns/report>` provides a consolidated overview of the
taxable sales and purchases, VAT collected and paid, and the total amount owed or refundable for the
reporting period.
.. important::
- The tax return aligns with official declarations required by `Oman's Tax Authority
<https://tms.taxoman.gov.om/portal/web/taxportal/home>`_.
- `VAT Taxpayer Guide
<https://tms.taxoman.gov.om/portal/documents/20126/1414820/VAT+Taxpayer+Guide+-+VAT+Return+Filing.pdf/fae31d0c-e7e7-0014-9f28-a4c506b36614?t=1733169613409>`_.

View File

@@ -103,7 +103,7 @@ 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:`Flexible Hours`: Tick the checkbox to let employees adjust their start and end times
- :guilabel:`Flexible Hours`: Check the checkbox to let employees adjust their start and end times
while maintaining the same total daily hours.
- :guilabel:`Company Full Time`: Enter the number of hours per week an employee needs to work to be
considered a full-time employee. Typically, this is approximately 40 hours, and this number
@@ -184,73 +184,236 @@ pay. These rules are configured by the localization and affect the computation o
To view all the rules, go to :menuselection:`Payroll app --> Configuration --> 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. 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
continue to show it on the payslip, but skip the computation.
- :guilabel:`Appears on payslip`: Disabling the toggle will still show the rule on the payslip, it
will just not be computed.
- :guilabel:`View on Employer Cost Dashboard`: Tick the checkbox to have the rule appear on the
*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:: salaries/new-rule.png
: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), :guilabel:`Other Input` (the condition is entered beneath the
field), 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 (%)`, :guilabel:`Other Input`, or a :guilabel:`Python Code`.
Depending on what is selected, the fixed amount, percentage, other input, 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
Add a new rule
--------------
- :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:`Split account line based on name`: Tick the checkbox to split the accounting entry
according to the payslip line name.
- :guilabel:`Not computed in net accountability`: If checked, the amount of the rule is shown
independently from the net salary, to allow for better reporting in the **Accounting** app.
To make a new rule, click :guilabel:`New` and a blank :guilabel:`Salary Rules` form loads. Enter the
following information in the top half of the form:
- :guilabel:`Rule Name`: Enter a name for the rule. This is the name displayed in the payslip.
- :guilabel:`Code`: Enter a code to be used for the new rule. This is case sensitive and is used as
the *rule ID*. This field is **required**.
- :guilabel:`Category`: Using the drop-down menu, select the category the rule applies to, or enter
a new category. The category is used to group rules and access their total sum.
- :guilabel:`Salary Structure`: Using the drop-down menu, select the salary structure the rule
applies to, or enter a new one. This field is **required**.
- :guilabel:`Sequence`: Enter a number indicating *when* the rule is calculated, in the sequence of
all other rules. Rules are processed one after another based on their sequence number. Rules with
a lower sequence number are calculated first, and their results can be used by rules with a higher
sequence number. This field is **required**.
- :guilabel:`Appears on Payslip`: Check the checkbox to have the rule visible on the employee
payslip PDF.
- :guilabel:`Contributes to Employer Cost`: Check the checkbox to include the rule when computing
the *employer cost* of a payslip.
General tab
~~~~~~~~~~~
Fill out the following sections of the :guilabel:`General` tab. These configurations determine
*when* and *how* the rule is calculated.
Conditions
**********
- :guilabel:`Condition Based on`: Using the drop-down menu, select if the rule is calculated and
displayed as a line in the payslip form view. Choose from one of the following options:
- :guilabel:`Always True`: The rule is always calculated. No other configurations are needed for
this section.
- :guilabel:`Salary Input`: This introduces a dynamic benefit to the structure. This appears as a
field in the *Payroll* tab of the *Employee* form, the *Inputs* tab of the payslip, or both. The
value of this field is added to the amount of the rule. If selected, the following additional
fields appear and must be configured:
- :guilabel:`Input on`: Specify where this field should appear and which object it should belong
to, the :guilabel:`Employee`, the :guilabel:`Payslip`, or both. If both are selected, the
value on the payslip automatically defaults to the value from the employee record, but it can
be overwritten directly on the payslip for a specific payroll run.
- :guilabel:`Section`: This groups several inputs into one expandable section on the form view.
Only one option is available by default, :guilabel:`Inputs`.
- :guilabel:`Unit`: Click the corresponding radio button to determine how the benefit is
displayed. The available options are:
- :guilabel:`Monetary`: A number with currency.
- :guilabel:`Quantity`: A number.
- :guilabel:`Percentage`: A number with a % sign.
- :guilabel:`Checkbox`: Indicates boolean values.
- :guilabel:`Input Description`: Enter a short explanation of when the input is applicable.
- :guilabel:`Default Value`: Enter the default value, either a monetary amount, quantity, or
percentage. This is determined by what is selected for the :guilabel:`Unit`. If necessary, add
a :guilabel:`Suffix` in the field to the right of this value, such as `per km`.
.. note::
If :guilabel:`Checkbox` is selected for the :guilabel:`Unit`, this field changes to
:guilabel:`Selected by Default`. Click the checkbox to have the rule active by default.
- :guilabel:`Depends On`: Select another rule that has a salary input, and use its value to
determine whether this rule should be hidden.
- :guilabel:`Other Input`: Select this to check if a payslip line exists with the same *type*.
When selected, a :guilabel:`Condition Other Input` field appears. Using the drop-down menu,
select the type of input the rule is based on, such as :guilabel:`Deduction`,
:guilabel:`Reimbursement`, etc.
- :guilabel:`Python Expression`: Select this to have the rule calculated using a Python script.
The script is evaluated using the local dictionary. The right side lists the
:guilabel:`Available variables` and the :guilabel:`Output`:
- :guilabel:`Available variables`:
- :guilabel:`payslip`: The `hr.payslip` object.
- :guilabel:`employee`: The `hr.employee` object.
- :guilabel:`version`: The `hr.version` object.
- :guilabel:`result_rules`: A dictionary containing the rules amounts, quantities, rates and
totals (previously computed).
- :guilabel:`categories`: A dictionary containing the computed salary rule categories (the sum
of the amount of all the rules belonging to that category):
- :guilabel:`total`: rule total
- :guilabel:`amount`: rule amount
- :guilabel:`quantity`: rule quantity
- :guilabel:`rate`: rule rate
- :guilabel:`ytd`: rule year to date value
- :guilabel:`worked_days`: A dictionary containing the computed worked days, where each key is
a work entry type code, and each value is a `worked_days` object. This object contains many
variables, with the most important ones being:
- :guilabel:`number_of_days`: The number of days registered in the payslip duration with
this work entry type.
- :guilabel:`number_of_hours`: The number of hours registered in the payslip duration with
this work entry type.
- :guilabel:`is_paid`: Whether or not this work entry type is added as an unpaid work entry
on this payslip structure.
- :guilabel:`inputs`: A dictionary containing the computed inputs where *key* is the other
input type code and *value* is the sum of the payslip input lines with the same code.
- :guilabel:`Output`:
- :guilabel:`result`: The boolean is *True* if the rule should be calculated, or *False* if
otherwise.
- :guilabel:`Domain`: Select this option to apply the rule *only* if it matches the configured
:guilabel:`Applicability Domain`. Configure the :guilabel:`Applicability Domain` that appears
beneath this option when selected.
Computation
***********
This section determines the final value of the rule, which consists of the base amount, the
quantity, and the rate. The total of the rule is `total = amount * quantity * (rate/100)`.
.. important::
This field does **not** appear if the :guilabel:`Condition Based on` field is set to
:guilabel:`Salary Input`.
Using the drop-down menu, select one of the following options for the :guilabel:`Amount Type` field:
- :guilabel:`Percentage (%)`: Defines the values for the total calculation. When selected, configure
the following fields:
- :guilabel:`Percentage based on`: A Python expression is evaluated using the `localdict`, and its
value is assigned to the rule amount.
- :guilabel:`Quantity`: A Python expression is evaluated using the `localdict`, and its value is
assigned to the rule quantity.
- :guilabel:`Percentage (%)`: A decimal number assigned to the rule rate.
- :guilabel:`Fixed Amount`: The amount and quantity is defined, with a rate of 100%.
- :guilabel:`Quantity`: A Python expression is evaluated using the `localdict`, and its value is
assigned to the rule quantity.
- :guilabel:`Fixed Amount`: Enter a decimal number which is assigned to the rule amount.
- :guilabel:`Other Input`: Select this to fetch the rule amount from the payslip input lines that
have the same *other input type* with rate of `100%` and quantity of `1.0`. When selected, an
:guilabel:`Amount Other Input` field appears beneath it. Using the drop-down menu, select the
*type* of input it is, such as :guilabel:`Deduction`, :guilabel:`Tips`, or :guilabel:`Expenses`.
- :guilabel:`Python Code`: This is the more complex version of the :guilabel:`Percentage (%)`
option, where a whole Python script is written then evaluated using the `localdict`. This includes
a list of :guilabel:`Available variables` and an :guilabel:`Output` list.
- :guilabel:`Available variables`:
- :guilabel:`payslip`: hr.payslip object
- :guilabel:`employee`: hr.employee object
- :guilabel:`version`: hr.version object
- :guilabel:`result_rules`: A dict containing the rules amounts, quantities, rates and totals
(previously computed), where the key is the rule code, and the value is dict with the
following keys:
- :guilabel:`total`: rule total
- :guilabel:`amount`: rule amount
- :guilabel:`quantity`: rule quantity
- :guilabel:`rate`: rule rate
- :guilabel:`ytd`: rule year to date value
- :guilabel:`categories`: A dict containing the computed salary rule categories (sum of amount
of all rules belonging to that category) where key is the category code and value is the sum
of the rules total values.
- :guilabel:`worked_days`: A dict containing the computed worked days where *key* is the work
entry type code and *value* is the `worked_days` object contain many variables, but most
important ones are:
- :guilabel:`number_of_days`: The number of days registered in the payslip duration with this
work entry type.
- :guilabel:`number_of_hours`: The number of hours registered in the payslip duration with
this work entry type.
- :guilabel:`is_paid`: Dictates whether or not this work entry type is added as unpaid work
entry on this payslip structure.
- :guilabel:`inputs`: A dict containing the computed inputs Where *key** is the other input type
code and *value* is the sum of the payslip input lines with the same code.
- :guilabel:`Output`:
- :guilabel:`result`: float, base amount of the rule
- :guilabel:`result_rate`: float, which defaults to 100.0 (%)
- :guilabel:`result_qty`: float, quantity, which defaults to 1
- :guilabel:`result_name`: string, name of the line. This defaults to the name field of the
salary rule (useful if the name depends or should depend on something computed in the rule).
Company contribution
********************
Using the drop-down menu, select the eventual third party involved in the salary payment to the
employees.
Display tab
~~~~~~~~~~~
This section determines the appearance of the rule on the payslip PDF available to the employee, and
defines the rule aesthetics.
First, select a :guilabel:`Color` for the rule using the color picker. Next, check the
:guilabel:`Title` checkbox to **only** display the salary rule's *title* and *description*, and hide
any numerical values.
Check the :guilabel:`Indented`, :guilabel:`Space Above`, :guilabel:`Bold`, :guilabel:`Underline`,
and :guilabel:`Italic` checkboxes to activate the options.
Finally, enter a :guilabel:`Description` for the rule, which is displayed below the rule name.
Accounting tab
~~~~~~~~~~~~~~
This section determines how the rule affects the various accounting journals and how the Net salary
is calculated for employees. Configure the following fields in this section:
- :guilabel:`Debit Account`: Using the drop-down menu, select the debit account for the rule.
- :guilabel:`Credit Account`: Using the drop-down menu, select the credit account for the rule.
- :guilabel:`Split on names`: Enable this option to split the accounting entries for this rule
according to the payslip line name. Splitting the entries provides more visibility for deductions
and reimbursements, or for salary adjustments.
- :guilabel:`Excluded from Net`: Check this checkbox to exclude the rule's calculations from the net
salary rule in journal entries. A specific debit and credit account should be set to independently
classify it.
- :guilabel:`Set employee on account line`: Check this checkbox to have the employee's name visible
on the journal items.
.. important::
This tab is **only** available if the **Accounting** app is installed.
.. _payroll/rule-parameters:
@@ -286,7 +449,7 @@ If a new input type is needed that does not appear on the list, click the :guila
create a new input type. Enter the :guilabel:`Description`, the :guilabel:`Code`, and select which
structure it applies to in the :guilabel:`Availability in Structure` field.
Tick the :guilabel:`Available in attachments` checkbox if the input should be a salary attachment.
Check the :guilabel:`Available in attachments` checkbox if the input should be a salary attachment.
.. important::
The :guilabel:`Code` is used in the salary rules to compute payslips. If the

View File

@@ -5,68 +5,130 @@ 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:
.. example::
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 prevent possible loss of product due to spillage and repacking, the
least packages removal strategy is used to fill the order by opening the fewest packages of
flour, instead of opening multiple packages.
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.
When an order for `14 kg` of flour is placed, the package of `54 kg` is selected, leaving `40 kg`
of flour in the bag. Another order for `80 kg` of flour is placed. An unopened `100 kg` package
is used to fulfill the order.
While this temporarily results in two open packages, one for `40 kg` and another for `20 kg`,
these open packages are prioritized in the next pickings that are those sizes or smaller.
Enabling the least packages removal strategy
============================================
A *package* is a physical container holding one or more products. Packages can also be used to store
items in bulk.
The packages feature is used to group products together and is required for the *least packages*
removal strategy.
Navigate to :menuselection:`Inventory app --> Configuration --> Settings` and in the
:guilabel:`Operations` section, select the check box for the :guilabel:`Packages` feature.
Store products in packages
--------------------------
First, products are received either in packages or individually. Next, the received products are
stored in packages created :ref:`during a transfer <inventory/warehouses_storage/pack>`.
Set the removal strategy
------------------------
After you have configured your product inventory, set the removal strategy on the :ref:`storage
location <inventory/warehouses_storage/lp-location>` or :ref:`product category
<inventory/warehouses_storage/lp-category>`.
.. _inventory/warehouses_storage/lp-location:
On the storage location
~~~~~~~~~~~~~~~~~~~~~~~
To set a removal strategy on a storage location, you must first enable a couple settings in the
**Inventory** configuration settings. Open :menuselection:`Inventory app --> Configuration -->
Settings`, and in the :guilabel:`Warehouse` section, enable :guilabel:`Storage Locations` and
:guilabel:`Multi-Step Routes`.
Next, open :menuselection:`Inventory app --> Configuration --> Locations`. Open an existing location
or create a new location. On the location form, under the :guilabel:`Logistics` heading, set
the :guilabel:`Removal Strategy`. to :guilabel:`Least Packages`
.. image:: least_packages/location-removal-strategy.png
:alt: Set Least Packages as the location's removal strategy.
.. _inventory/warehouses_storage/lp-category:
On the product category
~~~~~~~~~~~~~~~~~~~~~~~
Configure removal strategies on product categories by going to :menuselection:`Inventory app -->
Configuration --> Categories` and selecting the intended product category. Next, in the
:guilabel:`Force Removal Strategy` field, select :guilabel:`Least Packages`.
.. image:: least_packages/category-removal-strategy.png
:alt: Set Least Packages as the category's removal strategy.
.. 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 product
category form is applied as top priority.
For example, flour is stored in 100-kilogram packages. It is stored in a location with other
heavy items. To minimize how far pickers have to walk, the location uses the :doc:`closest
location removal strategy <closest_location>`. To further optimize the picking time, and to
reduce the number of packages opened during picking, the flour's product category, `Baking
Materials`, uses the least packages removal strategy.
Workflow
========
Using the least package removal strategy, the fewest number of packages is used to fulfill an order.
Using the *least packages* removal strategy, the fewest number of packages is used to fulfill an
order.
.. important::
The :ref:`Packages feature <inventory/warehouses_storage/pack-setup>` **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 <inventory/warehouses_storage/removal-config>`
Consider the following example, featuring the product, `Flour (kg)`. The product's
:doc:`unit of measure <../../product_management/configure/uom>`, 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`.
.. tip::
To check the product's on-hand stock, navigate to the product form, and click the :guilabel:`On
Hand` smart button.
You can verify the product's on-hand stock in the :guilabel:`Locations` report. Open
:menuselection:`Inventory app --> Reporting --> Locations`. Click in the :guilabel:`Search` field
to filter by :guilabel:`On Hand`, as well as product.
.. image:: least_packages/on-hand-flour.png
:align: center
.. image:: least_packages/on-hand-quantities.png
:alt: Show on-hand stock in each package.
Create a :ref:`delivery order <inventory/delivery/one-step>` 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.
A sales order is created for eighty kilograms of flour by going to the :menuselection:`Sales app`
and creating a new quotation. After clicking :guilabel:`Confirm`, the :ref:`delivery order
<inventory/delivery/one-step>` 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.
For more details about *where* the units were picked, click :guilabel:`Details` on the product
line. Doing so opens the :guilabel:`Detailed Operations` 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
In the :guilabel:`Detailed Operations` pop-up window, the :guilabel:`Pick From` field displays where
the quantities to fulfill the :guilabel:`Demand` are picked. Because the order demands 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.
.. seealso::
- :doc:`About removal strategies <../removal_strategies>`
- `Odoo Tutorials: Least Packages <https://www.odoo.com/slides/slide/5477/share>`_

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 41 KiB

View File

@@ -294,6 +294,243 @@ class.
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-food-delivery h1 p-4"></i>
<code>oi-food-delivery</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-activity h1 p-4"></i>
<code>oi-activity</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-activity-plus h1 p-4"></i>
<code>oi-activity-plus</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-schedule-today h1 p-4"></i>
<code>oi-schedule-today</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-schedule-tomorrow h1 p-4"></i>
<code>oi-schedule-tomorrow</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-schedule-later h1 p-4"></i>
<code>oi-schedule-later</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-backspace-o h1 p-4"></i>
<code>oi-backspace-o</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-numpad h1 p-4"></i>
<code>oi-numpad</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-record h1 p-4"></i>
<code>oi-record</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-merge h1 p-4"></i>
<code>oi-merge</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-transfer h1 p-4"></i>
<code>oi-transfer</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-suitcase h1 p-4"></i>
<code>oi-suitcase</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-suitcase-plus h1 p-4"></i>
<code>oi-suitcase-plus</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-user h1 p-4"></i>
<code>oi-user</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-user-plus h1 p-4"></i>
<code>oi-user-plus</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-users h1 p-4"></i>
<code>oi-users</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-ellipsis-v h1 p-4"></i>
<code>oi-ellipsis-v</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-ellipsis-h h1 p-4"></i>
<code>oi-ellipsis-h</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-plus h1 p-4"></i>
<code>oi-plus</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-minus h1 p-4"></i>
<code>oi-minus</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-star-plus h1 p-4"></i>
<code>oi-star-plus</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-subtitle h1 p-4"></i>
<code>oi-subtitle</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-bluesky h1 p-4"></i>
<code>oi-bluesky</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-tiktok h1 p-4"></i>
<code>oi-tiktok</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-discord h1 p-4"></i>
<code>oi-discord</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-google-play h1 p-4"></i>
<code>oi-google-play</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-kickstarter h1 p-4"></i>
<code>oi-kickstarter</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-strava h1 p-4"></i>
<code>oi-strava</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-threads h1 p-4"></i>
<code>oi-threads</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-x h1 p-4"></i>
<code>oi-x</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-x-square h1 p-4"></i>
<code>oi-x-square</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-life-ring-plus h1 p-4"></i>
<code>oi-life-ring-plus</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-send-back h1 p-4"></i>
<code>oi-send-back</code>
</div>
</div>
<div class="o_icon_card col-6 col-sm-4 col-md-3 mb-3">
<div class="card text-center">
<i class="oi oi-bring-front h1 p-4"></i>
<code>oi-bring-front</code>
</div>
</div>
</section>
RTL adaptations

View File

@@ -60,6 +60,39 @@
.oi-smile-add:before { content: '\e84e'; }
.oi-close:before { content: '\e852'; }
.oi-food-delivery:before { content: '\e82a'; }
.oi-schedule-today:before { content: '\e82c'; }
.oi-schedule-tomorrow:before { content: '\e82d'; }
.oi-schedule-later:before { content: '\e804'; }
.oi-activity:before { content: '\e82f'; }
.oi-activity-plus:before { content: '\e830'; }
.oi-numpad:before { content: '\e833'; }
.oi-transfer:before { content: '\e834'; }
.oi-suitcase:before { content: '\e835'; }
.oi-suitcase-plus:before { content: '\e832'; }
.oi-merge:before { content: '\e836'; }
.oi-record:before { content: '\e837'; }
.oi-backspace-o:before { content: '\e838'; }
.oi-user:before { content: '\e805'; }
.oi-user-plus:before { content: '\e831'; }
.oi-users:before { content: '\e807'; }
.oi-ellipsis-h:before { content: '\e867'; }
.oi-ellipsis-v:before { content: '\e868'; }
.oi-plus:before { content: '\e809'; }
.oi-minus:before { content: '\e80b'; }
.oi-star-plus:before { content: '\e87c'; }
.oi-subtitle:before { content: '\e80e'; }
.oi-threads:before { content: '\e818'; }
.oi-kickstarter:before { content: '\e819'; }
.oi-x:before { content: '\e81a'; }
.oi-x-square:before { content: '\e848'; }
.oi-tiktok:before { content: '\e81b'; }
.oi-bluesky:before { content: '\e81c'; }
.oi-google-play:before { content: '\e81d'; }
.oi-strava:before { content: '\e80f'; }
.oi-discord:before { content: '\e811'; }
.oi-bring-front:before { content: '\e84c'; }
.oi-send-back:before { content: '\e84d'; }
.oi-life-ring-plus:before { content: '\e849'; }
/* RTL adaptations. */
/* Flip directional icons by 180 degree. */