Initial commit: OCA Technical packages (595 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:03 +02:00
commit 2cc02aac6e
24950 changed files with 2318079 additions and 0 deletions

View file

@ -0,0 +1,46 @@
# Sale 0rder Line Position
Odoo addon: sale_order_line_position
## Installation
```bash
pip install odoo-bringout-oca-sale-reporting-sale_order_line_position
```
## Dependencies
This addon depends on:
- sale
## Manifest Information
- **Name**: Sale 0rder Line Position
- **Version**: 16.0.1.3.0
- **Category**: Sales
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/sale-reporting](https://github.com/OCA/sale-reporting) branch 16.0, addon `sale_order_line_position`.
## License
This package maintains the original AGPL-3 license from the upstream Odoo project.
## Documentation
- Overview: doc/OVERVIEW.md
- Architecture: doc/ARCHITECTURE.md
- Models: doc/MODELS.md
- Controllers: doc/CONTROLLERS.md
- Wizards: doc/WIZARDS.md
- Reports: doc/REPORTS.md
- Security: doc/SECURITY.md
- Install: doc/INSTALL.md
- Usage: doc/USAGE.md
- Configuration: doc/CONFIGURATION.md
- Dependencies: doc/DEPENDENCIES.md
- Troubleshooting: doc/TROUBLESHOOTING.md
- FAQ: doc/FAQ.md

View file

@ -0,0 +1,32 @@
# Architecture
```mermaid
flowchart TD
U[Users] -->|HTTP| V[Views and QWeb Templates]
V --> C[Controllers]
V --> W[Wizards Transient Models]
C --> M[Models and ORM]
W --> M
M --> R[Reports]
DX[Data XML] --> M
S[Security ACLs and Groups] -. enforces .-> M
subgraph Sale_order_line_position Module - sale_order_line_position
direction LR
M:::layer
W:::layer
C:::layer
V:::layer
R:::layer
S:::layer
DX:::layer
end
classDef layer fill:#eef8ff,stroke:#6ea8fe,stroke-width:1px
```
Notes
- Views include tree/form/kanban templates and report templates.
- Controllers provide website/portal routes when present.
- Wizards are UI flows implemented with `models.TransientModel`.
- Data XML loads data/demo records; Security defines groups and access.

View file

@ -0,0 +1,3 @@
# Configuration
Refer to Odoo settings for sale_order_line_position. Configure related models, access rights, and options as needed.

View file

@ -0,0 +1,3 @@
# Controllers
This module does not define custom HTTP controllers.

View file

@ -0,0 +1,5 @@
# Dependencies
This addon depends on:
- [sale](../../odoo-bringout-oca-ocb-sale)

View file

@ -0,0 +1,4 @@
# FAQ
- Q: Which Odoo version? A: 16.0 (OCA/OCB packaged).
- Q: How to enable? A: Start server with --addon sale_order_line_position or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-sale-reporting-sale_order_line_position"
# or
uv pip install odoo-bringout-oca-sale-reporting-sale_order_line_position"
```

View file

@ -0,0 +1,16 @@
# Models
Detected core models and extensions in sale_order_line_position.
```mermaid
classDiagram
class ir_actions_report
class res_company
class res_config_settings
class sale_order
class sale_order_line
```
Notes
- Classes show model technical names; fields omitted for brevity.
- Items listed under _inherit are extensions of existing models.

View file

@ -0,0 +1,6 @@
# Overview
Packaged Odoo addon: sale_order_line_position. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon sale_order_line_position
- License: LGPL-3

View file

@ -0,0 +1,22 @@
# Reports
Report definitions and templates in sale_order_line_position.
```mermaid
classDiagram
```
## Available Reports
No named reports found in XML files.
## Report Files
- **sale_order_report.xml** (XML template/definition)
## Notes
- Named reports above are accessible through Odoo's reporting menu
- Python files define report logic and data processing
- XML files contain report templates, definitions, and formatting
- Reports are integrated with Odoo's printing and email systems

View file

@ -0,0 +1,8 @@
# Security
This module does not define custom security rules or access controls beyond Odoo defaults.
Default Odoo security applies:
- Base user access through standard groups
- Model access inherited from dependencies
- No custom row-level security rules

View file

@ -0,0 +1,5 @@
# Troubleshooting
- Ensure Python and Odoo environment matches repo guidance.
- Check database connectivity and logs if startup fails.
- Validate that dependent addons listed in DEPENDENCIES.md are installed.

View file

@ -0,0 +1,7 @@
# Usage
Start Odoo including this addon (from repo root):
```bash
python3 scripts/nix_odoo_web_server.py --db-name mydb --addon sale_order_line_position
```

View file

@ -0,0 +1,3 @@
# Wizards
This module does not include UI wizards.

View file

@ -0,0 +1,42 @@
[project]
name = "odoo-bringout-oca-sale-reporting-sale_order_line_position"
version = "16.0.0"
description = "Sale 0rder Line Position - Adds position number on sale order line."
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-sale>=16.0.0",
"requests>=2.25.1"
]
readme = "README.md"
requires-python = ">= 3.11"
classifiers = [
"Development Status :: 5 - Production/Stable",
"Intended Audience :: Developers",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: Office/Business",
]
[project.urls]
homepage = "https://github.com/bringout/0"
repository = "https://github.com/bringout/0"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.metadata]
allow-direct-references = true
[tool.hatch.build.targets.wheel]
packages = ["sale_order_line_position"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]

View file

@ -0,0 +1,114 @@
========================
Sale 0rder Line Position
========================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:4462b10d9b62946809e838ab544244ba35bb671aaf38df2953ec2350f3e2f8f9
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fsale--reporting-lightgray.png?logo=github
:target: https://github.com/OCA/sale-reporting/tree/16.0/sale_order_line_position
:alt: OCA/sale-reporting
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/sale-reporting-16-0/sale-reporting-16-0-sale_order_line_position
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/sale-reporting&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
This module adds an auto computed position on sale order line.
This position number is also printed on the report.
The position can be used to keep track of each line during
the delivery and invoicing of the order with the customer.
This is why there are related modules on `account-invoice-reporting`
and `stock-logisics-reporting`.
The positions are recomputed when the sale order is printed, sent and set to confirm.
The positions are not changed on the line after the order has been confirmed, but if
new line are added they will receive a position number.
An action is also availabled to manually recompute the positions.
**Table of contents**
.. contents::
:local:
Known issues / Roadmap
======================
The way the positions are computed on the create of `sale.order.line`
record could lead to a performance issue. There is a few improvements
that have been suggested:
Remove it and handle the computation on the write and/or create
method of the `sale.order`.
Have a context key to enable/disable the recomputation.
Do not set any value in the position fields before the sale order lines
are locked (in the current implementation, before sending).
And add a recompute button in the UI.
Set the position values with an SQL query using a `TRIGGER`.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/sale-reporting/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/sale-reporting/issues/new?body=module:%20sale_order_line_position%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
Do not contact contributors directly about support or help with technical issues.
Credits
=======
Authors
~~~~~~~
* Camptocamp
Contributors
~~~~~~~~~~~~
* Thierry Ducrest <thierry.ducrest@camptocamp.com>
* `Trobz <https://trobz.com>`_:
* Nguyen Hoang Hiep <hiepnh@trobz.com>
Other credits
~~~~~~~~~~~~~
The migration of this module from 13.0 to 14.0 was financially supported by Camptocamp
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
This module is part of the `OCA/sale-reporting <https://github.com/OCA/sale-reporting/tree/16.0/sale_order_line_position>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,19 @@
# Copyright 2021 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl)
{
"name": "Sale 0rder Line Position",
"summary": "Adds position number on sale order line.",
"version": "16.0.1.3.0",
"category": "Sales",
"author": "Camptocamp, Odoo Community Association (OCA)",
"license": "AGPL-3",
"website": "https://github.com/OCA/sale-reporting",
"depends": ["sale"],
"data": [
"views/sale_order.xml",
"views/res_config_settings.xml",
"report/sale_order_report.xml",
],
"installable": True,
}

View file

@ -0,0 +1,81 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_line_position
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_res_company
msgid "Companies"
msgstr "Kompanije"
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_res_config_settings
msgid "Config Settings"
msgstr "Postavke"
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_res_company__disable_sale_position_recompute
#: model:ir.model.fields,field_description:sale_order_line_position.field_res_config_settings__disable_sale_position_recompute
msgid "Do not recompute positions on sale orders"
msgstr "Ne preračunaj pozicije na prodajnim nalozima"
#. module: sale_order_line_position
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.res_config_settings_view_form
msgid "Do not recompute positions when line is removed"
msgstr "Ne preračunaj pozicije kada se stavka uklanja"
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_sale_order__locked_positions
msgid "Locked Positions"
msgstr "Zaključane pozicije"
#. module: sale_order_line_position
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.report_saleorder_document
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.view_order_form_inherit
msgid "Pos"
msgstr "Poz"
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_sale_order_line__position
msgid "Position"
msgstr "Pozicija"
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_sale_order_line__position_formatted
msgid "Position Formatted"
msgstr "Formatirana pozicija"
#. module: sale_order_line_position
#: model:ir.actions.server,name:sale_order_line_position.action_compute_sale_position
msgid "Recompute positions"
msgstr "Preračunaj pozicije"
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_ir_actions_report
msgid "Report Action"
msgstr "Akcija izvještaja"
#. module: sale_order_line_position
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.res_config_settings_view_form
msgid "Sale Order Line Positions"
msgstr "Pozicije stavki prodajnog naloga"
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_sale_order
msgid "Sales Order"
msgstr "Prodajni nalog"
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_sale_order_line
msgid "Sales Order Line"
msgstr "Stavka prodajne narudžbe"

View file

@ -0,0 +1,84 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_line_position
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 15.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2022-06-03 10:05+0000\n"
"Last-Translator: jabelchi <jabelchi@gmail.com>\n"
"Language-Team: none\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_res_company
msgid "Companies"
msgstr ""
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_res_company__disable_sale_position_recompute
#: model:ir.model.fields,field_description:sale_order_line_position.field_res_config_settings__disable_sale_position_recompute
msgid "Do not recompute positions on sale orders"
msgstr ""
#. module: sale_order_line_position
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.res_config_settings_view_form
msgid "Do not recompute positions when line is removed"
msgstr ""
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_sale_order__locked_positions
msgid "Locked Positions"
msgstr "Posicions bloquejades"
#. module: sale_order_line_position
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.report_saleorder_document
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.view_order_form_inherit
msgid "Pos"
msgstr "Pos"
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_sale_order_line__position
msgid "Position"
msgstr "Posició"
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_sale_order_line__position_formatted
msgid "Position Formatted"
msgstr "Posició formatada"
#. module: sale_order_line_position
#: model:ir.actions.server,name:sale_order_line_position.action_compute_sale_position
msgid "Recompute positions"
msgstr "Recalcula posicions"
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_ir_actions_report
msgid "Report Action"
msgstr "Acció d'informe"
#. module: sale_order_line_position
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.res_config_settings_view_form
msgid "Sale Order Line Positions"
msgstr ""
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_sale_order
msgid "Sales Order"
msgstr "Comanda de venda"
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_sale_order_line
msgid "Sales Order Line"
msgstr "Línia de comanda de venda"

View file

@ -0,0 +1,93 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_line_position
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2022-05-11 12:05+0000\n"
"Last-Translator: Maria Sparenberg <maria.sparenberg@gmx.net>\n"
"Language-Team: none\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.3.2\n"
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_res_company
msgid "Companies"
msgstr ""
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_res_company__disable_sale_position_recompute
#: model:ir.model.fields,field_description:sale_order_line_position.field_res_config_settings__disable_sale_position_recompute
msgid "Do not recompute positions on sale orders"
msgstr ""
#. module: sale_order_line_position
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.res_config_settings_view_form
msgid "Do not recompute positions when line is removed"
msgstr ""
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_sale_order__locked_positions
msgid "Locked Positions"
msgstr "Gesperrte Positionen"
#. module: sale_order_line_position
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.report_saleorder_document
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.view_order_form_inherit
msgid "Pos"
msgstr "Pos"
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_sale_order_line__position
msgid "Position"
msgstr "Position"
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_sale_order_line__position_formatted
msgid "Position Formatted"
msgstr ""
#. module: sale_order_line_position
#: model:ir.actions.server,name:sale_order_line_position.action_compute_sale_position
msgid "Recompute positions"
msgstr "Positionen neuberechnen"
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_ir_actions_report
msgid "Report Action"
msgstr ""
#. module: sale_order_line_position
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.res_config_settings_view_form
msgid "Sale Order Line Positions"
msgstr ""
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_sale_order
msgid "Sales Order"
msgstr "Verkaufsauftrag"
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_sale_order_line
msgid "Sales Order Line"
msgstr "Auftragsposition"
#~ msgid "Display Name"
#~ msgstr "Anzeigename"
#~ msgid "ID"
#~ msgstr "ID"
#~ msgid "Last Modified on"
#~ msgstr "Zuletzt geändert am"

View file

@ -0,0 +1,84 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_line_position
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-07-01 11:47+0000\n"
"Last-Translator: mymage <stefano.consolaro@mymage.it>\n"
"Language-Team: none\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.17\n"
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_res_company
msgid "Companies"
msgstr "Aziende"
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_res_config_settings
msgid "Config Settings"
msgstr "Impostazioni configurazione"
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_res_company__disable_sale_position_recompute
#: model:ir.model.fields,field_description:sale_order_line_position.field_res_config_settings__disable_sale_position_recompute
msgid "Do not recompute positions on sale orders"
msgstr "Non ricalcolare le posizioni negli ordini di vendita"
#. module: sale_order_line_position
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.res_config_settings_view_form
msgid "Do not recompute positions when line is removed"
msgstr "Non ricalcolare le posizioni quando viene rimossa la riga"
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_sale_order__locked_positions
msgid "Locked Positions"
msgstr "Posizioni bloccate"
#. module: sale_order_line_position
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.report_saleorder_document
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.view_order_form_inherit
msgid "Pos"
msgstr "Pos"
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_sale_order_line__position
msgid "Position"
msgstr "Posizione"
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_sale_order_line__position_formatted
msgid "Position Formatted"
msgstr "Posizione formattata"
#. module: sale_order_line_position
#: model:ir.actions.server,name:sale_order_line_position.action_compute_sale_position
msgid "Recompute positions"
msgstr "Ricalcolo posizioni"
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_ir_actions_report
msgid "Report Action"
msgstr "Azione resoconto"
#. module: sale_order_line_position
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.res_config_settings_view_form
msgid "Sale Order Line Positions"
msgstr "Posizioni riga ordine di vendita"
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_sale_order
msgid "Sales Order"
msgstr "Ordine di vendita"
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_sale_order_line
msgid "Sales Order Line"
msgstr "Riga ordine di vendita"

View file

@ -0,0 +1,81 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * sale_order_line_position
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_res_company
msgid "Companies"
msgstr ""
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_res_company__disable_sale_position_recompute
#: model:ir.model.fields,field_description:sale_order_line_position.field_res_config_settings__disable_sale_position_recompute
msgid "Do not recompute positions on sale orders"
msgstr ""
#. module: sale_order_line_position
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.res_config_settings_view_form
msgid "Do not recompute positions when line is removed"
msgstr ""
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_sale_order__locked_positions
msgid "Locked Positions"
msgstr ""
#. module: sale_order_line_position
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.report_saleorder_document
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.view_order_form_inherit
msgid "Pos"
msgstr ""
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_sale_order_line__position
msgid "Position"
msgstr ""
#. module: sale_order_line_position
#: model:ir.model.fields,field_description:sale_order_line_position.field_sale_order_line__position_formatted
msgid "Position Formatted"
msgstr ""
#. module: sale_order_line_position
#: model:ir.actions.server,name:sale_order_line_position.action_compute_sale_position
msgid "Recompute positions"
msgstr ""
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_ir_actions_report
msgid "Report Action"
msgstr ""
#. module: sale_order_line_position
#: model_terms:ir.ui.view,arch_db:sale_order_line_position.res_config_settings_view_form
msgid "Sale Order Line Positions"
msgstr ""
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_sale_order
msgid "Sales Order"
msgstr ""
#. module: sale_order_line_position
#: model:ir.model,name:sale_order_line_position.model_sale_order_line
msgid "Sales Order Line"
msgstr ""

View file

@ -0,0 +1,5 @@
from . import ir_actions_report
from . import sale_order
from . import sale_order_line
from . import res_company
from . import res_config_settings

View file

@ -0,0 +1,17 @@
# Copyright 2021 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from odoo import models
class IrActionsReport(models.Model):
_inherit = "ir.actions.report"
def render_qweb_pdf(self, res_ids=None, data=None):
self.sale_recompute_positions(res_ids)
return super().render_qweb_pdf(res_ids, data)
def sale_recompute_positions(self, res_ids):
if self.model == "sale.order":
sales = self.env["sale.order"].browse(res_ids)
sales.recompute_positions()

View file

@ -0,0 +1,12 @@
# Copyright 2022 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from odoo import fields, models
class ResCompany(models.Model):
_inherit = "res.company"
disable_sale_position_recompute = fields.Boolean(
string="Do not recompute positions on sale orders"
)

View file

@ -0,0 +1,13 @@
# Copyright 2022 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"
disable_sale_position_recompute = fields.Boolean(
related="company_id.disable_sale_position_recompute",
readonly=False,
)

View file

@ -0,0 +1,32 @@
# Copyright 2021 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from odoo import api, fields, models
class SaleOrder(models.Model):
_inherit = "sale.order"
locked_positions = fields.Boolean(compute="_compute_locked_positions")
@api.depends("state")
def _compute_locked_positions(self):
for record in self:
record.locked_positions = record.state != "draft"
def action_confirm(self):
self.recompute_positions()
return super().action_confirm()
def action_quotation_send(self):
self.recompute_positions()
return super().action_quotation_send()
def recompute_positions(self):
for sale in self:
if sale.locked_positions or sale.company_id.disable_sale_position_recompute:
continue
lines = sale.order_line.filtered(lambda l: not l.display_type)
lines.sorted(key=lambda x: (x.sequence, x.id))
for position, line in enumerate(lines, start=1):
line.position = position

View file

@ -0,0 +1,59 @@
# Copyright 2021 Camptocamp SA
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html)
from odoo import api, fields, models
class SaleOrderLine(models.Model):
_inherit = "sale.order.line"
position = fields.Integer(readonly=True, index=True, default=False)
position_formatted = fields.Char(compute="_compute_position_formatted")
@api.depends("position")
def _compute_position_formatted(self):
for record in self:
record.position_formatted = record._format_position(record.position)
@api.model_create_multi
def create(self, vals_list):
vals_list = self._add_next_position_on_new_line(vals_list)
return super().create(vals_list)
def unlink(self):
sales = self.mapped("order_id")
res = super().unlink()
for sale in sales:
sale.recompute_positions()
return res
def _add_next_position_on_new_line(self, vals_list):
sale_ids = [
line["order_id"]
for line in vals_list
if not line.get("display_type") and line.get("order_id")
]
if sale_ids:
ids = tuple(set(sale_ids))
self.flush_model()
query = """
SELECT order_id, max(position) FROM sale_order_line
WHERE order_id in %s GROUP BY order_id;
"""
self.env.cr.execute(query, (ids,))
default_pos = {key: 1 for key in ids}
existing_pos = {
order_id: pos + 1 for order_id, pos in self.env.cr.fetchall()
}
sale_pos = {**default_pos, **existing_pos}
for line in vals_list:
if not line.get("display_type"):
line["position"] = sale_pos[line["order_id"]]
sale_pos[line["order_id"]] += 1
return vals_list
@api.model
def _format_position(self, position):
if not position:
return ""
return str(position).zfill(3)

View file

@ -0,0 +1,3 @@
* Thierry Ducrest <thierry.ducrest@camptocamp.com>
* `Trobz <https://trobz.com>`_:
* Nguyen Hoang Hiep <hiepnh@trobz.com>

View file

@ -0,0 +1 @@
The migration of this module from 13.0 to 14.0 was financially supported by Camptocamp

View file

@ -0,0 +1,14 @@
This module adds an auto computed position on sale order line.
This position number is also printed on the report.
The position can be used to keep track of each line during
the delivery and invoicing of the order with the customer.
This is why there are related modules on `account-invoice-reporting`
and `stock-logisics-reporting`.
The positions are recomputed when the sale order is printed, sent and set to confirm.
The positions are not changed on the line after the order has been confirmed, but if
new line are added they will receive a position number.
An action is also availabled to manually recompute the positions.

View file

@ -0,0 +1,14 @@
The way the positions are computed on the create of `sale.order.line`
record could lead to a performance issue. There is a few improvements
that have been suggested:
Remove it and handle the computation on the write and/or create
method of the `sale.order`.
Have a context key to enable/disable the recomputation.
Do not set any value in the position fields before the sale order lines
are locked (in the current implementation, before sending).
And add a recompute button in the UI.
Set the position values with an SQL query using a `TRIGGER`.

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<template
id="report_saleorder_document"
inherit_id="sale.report_saleorder_document"
priority="1"
>
<xpath expr="//table/thead/tr/th[@name='th_description']" position="before">
<th class="text-start">Pos</th>
</xpath>
<xpath
expr="//table/tbody[hasclass('sale_tbody')]//td[@name='td_name']"
position="before"
>
<td>
<span t-field="line.position_formatted" />
</td>
</xpath>
</template>
</odoo>

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,453 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="generator" content="Docutils: https://docutils.sourceforge.io/" />
<title>Sale 0rder Line Position</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.
See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
*/
/* used to remove borders from tables and images */
.borderless, table.borderless td, table.borderless th {
border: 0 }
table.borderless td, table.borderless th {
/* Override padding for "table.docutils td" with "! important".
The right padding separates the table cells. */
padding: 0 0.5em 0 0 ! important }
.first {
/* Override more specific margin styles with "! important". */
margin-top: 0 ! important }
.last, .with-subtitle {
margin-bottom: 0 ! important }
.hidden {
display: none }
.subscript {
vertical-align: sub;
font-size: smaller }
.superscript {
vertical-align: super;
font-size: smaller }
a.toc-backref {
text-decoration: none ;
color: black }
blockquote.epigraph {
margin: 2em 5em ; }
dl.docutils dd {
margin-bottom: 0.5em }
object[type="image/svg+xml"], object[type="application/x-shockwave-flash"] {
overflow: hidden;
}
/* Uncomment (and remove this text!) to get bold-faced definition list terms
dl.docutils dt {
font-weight: bold }
*/
div.abstract {
margin: 2em 5em }
div.abstract p.topic-title {
font-weight: bold ;
text-align: center }
div.admonition, div.attention, div.caution, div.danger, div.error,
div.hint, div.important, div.note, div.tip, div.warning {
margin: 2em ;
border: medium outset ;
padding: 1em }
div.admonition p.admonition-title, div.hint p.admonition-title,
div.important p.admonition-title, div.note p.admonition-title,
div.tip p.admonition-title {
font-weight: bold ;
font-family: sans-serif }
div.attention p.admonition-title, div.caution p.admonition-title,
div.danger p.admonition-title, div.error p.admonition-title,
div.warning p.admonition-title, .code .error {
color: red ;
font-weight: bold ;
font-family: sans-serif }
/* Uncomment (and remove this text!) to get reduced vertical space in
compound paragraphs.
div.compound .compound-first, div.compound .compound-middle {
margin-bottom: 0.5em }
div.compound .compound-last, div.compound .compound-middle {
margin-top: 0.5em }
*/
div.dedication {
margin: 2em 5em ;
text-align: center ;
font-style: italic }
div.dedication p.topic-title {
font-weight: bold ;
font-style: normal }
div.figure {
margin-left: 2em ;
margin-right: 2em }
div.footer, div.header {
clear: both;
font-size: smaller }
div.line-block {
display: block ;
margin-top: 1em ;
margin-bottom: 1em }
div.line-block div.line-block {
margin-top: 0 ;
margin-bottom: 0 ;
margin-left: 1.5em }
div.sidebar {
margin: 0 0 0.5em 1em ;
border: medium outset ;
padding: 1em ;
background-color: #ffffee ;
width: 40% ;
float: right ;
clear: right }
div.sidebar p.rubric {
font-family: sans-serif ;
font-size: medium }
div.system-messages {
margin: 5em }
div.system-messages h1 {
color: red }
div.system-message {
border: medium outset ;
padding: 1em }
div.system-message p.system-message-title {
color: red ;
font-weight: bold }
div.topic {
margin: 2em }
h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
margin-top: 0.4em }
h1.title {
text-align: center }
h2.subtitle {
text-align: center }
hr.docutils {
width: 75% }
img.align-left, .figure.align-left, object.align-left, table.align-left {
clear: left ;
float: left ;
margin-right: 1em }
img.align-right, .figure.align-right, object.align-right, table.align-right {
clear: right ;
float: right ;
margin-left: 1em }
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left }
.align-center {
clear: both ;
text-align: center }
.align-right {
text-align: right }
/* reset inner alignment in figures */
div.align-right {
text-align: inherit }
/* div.align-center * { */
/* text-align: left } */
.align-top {
vertical-align: top }
.align-middle {
vertical-align: middle }
.align-bottom {
vertical-align: bottom }
ol.simple, ul.simple {
margin-bottom: 1em }
ol.arabic {
list-style: decimal }
ol.loweralpha {
list-style: lower-alpha }
ol.upperalpha {
list-style: upper-alpha }
ol.lowerroman {
list-style: lower-roman }
ol.upperroman {
list-style: upper-roman }
p.attribution {
text-align: right ;
margin-left: 50% }
p.caption {
font-style: italic }
p.credits {
font-style: italic ;
font-size: smaller }
p.label {
white-space: nowrap }
p.rubric {
font-weight: bold ;
font-size: larger ;
color: maroon ;
text-align: center }
p.sidebar-title {
font-family: sans-serif ;
font-weight: bold ;
font-size: larger }
p.sidebar-subtitle {
font-family: sans-serif ;
font-weight: bold }
p.topic-title {
font-weight: bold }
pre.address {
margin-bottom: 0 ;
margin-top: 0 ;
font: inherit }
pre.literal-block, pre.doctest-block, pre.math, pre.code {
margin-left: 2em ;
margin-right: 2em }
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
pre.code .literal.string, code .literal.string { color: #0C5404 }
pre.code .name.builtin, code .name.builtin { color: #352B84 }
pre.code .deleted, code .deleted { background-color: #DEB0A1}
pre.code .inserted, code .inserted { background-color: #A3D289}
span.classifier {
font-family: sans-serif ;
font-style: oblique }
span.classifier-delimiter {
font-family: sans-serif ;
font-weight: bold }
span.interpreted {
font-family: sans-serif }
span.option {
white-space: nowrap }
span.pre {
white-space: pre }
span.problematic, pre.problematic {
color: red }
span.section-subtitle {
/* font-size relative to parent (h1..h6 element) */
font-size: 80% }
table.citation {
border-left: solid 1px gray;
margin-left: 1px }
table.docinfo {
margin: 2em 4em }
table.docutils {
margin-top: 0.5em ;
margin-bottom: 0.5em }
table.footnote {
border-left: solid 1px black;
margin-left: 1px }
table.docutils td, table.docutils th,
table.docinfo td, table.docinfo th {
padding-left: 0.5em ;
padding-right: 0.5em ;
vertical-align: top }
table.docutils th.field-name, table.docinfo th.docinfo-name {
font-weight: bold ;
text-align: left ;
white-space: nowrap ;
padding-left: 0 }
/* "booktabs" style (no vertical lines) */
table.docutils.booktabs {
border: 0px;
border-top: 2px solid;
border-bottom: 2px solid;
border-collapse: collapse;
}
table.docutils.booktabs * {
border: 0px;
}
table.docutils.booktabs th {
border-bottom: thin solid;
text-align: left;
}
h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
font-size: 100% }
ul.auto-toc {
list-style-type: none }
</style>
</head>
<body>
<div class="document" id="sale-0rder-line-position">
<h1 class="title">Sale 0rder Line Position</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:4462b10d9b62946809e838ab544244ba35bb671aaf38df2953ec2350f3e2f8f9
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<p><a class="reference external image-reference" href="https://odoo-community.org/page/development-status"><img alt="Beta" src="https://img.shields.io/badge/maturity-Beta-yellow.png" /></a> <a class="reference external image-reference" href="http://www.gnu.org/licenses/agpl-3.0-standalone.html"><img alt="License: AGPL-3" src="https://img.shields.io/badge/licence-AGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/sale-reporting/tree/16.0/sale_order_line_position"><img alt="OCA/sale-reporting" src="https://img.shields.io/badge/github-OCA%2Fsale--reporting-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/sale-reporting-16-0/sale-reporting-16-0-sale_order_line_position"><img alt="Translate me on Weblate" src="https://img.shields.io/badge/weblate-Translate%20me-F47D42.png" /></a> <a class="reference external image-reference" href="https://runboat.odoo-community.org/builds?repo=OCA/sale-reporting&amp;target_branch=16.0"><img alt="Try me on Runboat" src="https://img.shields.io/badge/runboat-Try%20me-875A7B.png" /></a></p>
<p>This module adds an auto computed position on sale order line.
This position number is also printed on the report.</p>
<p>The position can be used to keep track of each line during
the delivery and invoicing of the order with the customer.
This is why there are related modules on <cite>account-invoice-reporting</cite>
and <cite>stock-logisics-reporting</cite>.</p>
<p>The positions are recomputed when the sale order is printed, sent and set to confirm.</p>
<p>The positions are not changed on the line after the order has been confirmed, but if
new line are added they will receive a position number.</p>
<p>An action is also availabled to manually recompute the positions.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#known-issues-roadmap" id="toc-entry-1">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-5">Contributors</a></li>
<li><a class="reference internal" href="#other-credits" id="toc-entry-6">Other credits</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-7">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#toc-entry-1">Known issues / Roadmap</a></h1>
<p>The way the positions are computed on the create of <cite>sale.order.line</cite>
record could lead to a performance issue. There is a few improvements
that have been suggested:</p>
<p>Remove it and handle the computation on the write and/or create
method of the <cite>sale.order</cite>.</p>
<p>Have a context key to enable/disable the recomputation.</p>
<p>Do not set any value in the position fields before the sale order lines
are locked (in the current implementation, before sending).
And add a recompute button in the UI.</p>
<p>Set the position values with an SQL query using a <cite>TRIGGER</cite>.</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/sale-reporting/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
<a class="reference external" href="https://github.com/OCA/sale-reporting/issues/new?body=module:%20sale_order_line_position%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-4">Authors</a></h2>
<ul class="simple">
<li>Camptocamp</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
<ul class="simple">
<li>Thierry Ducrest &lt;<a class="reference external" href="mailto:thierry.ducrest&#64;camptocamp.com">thierry.ducrest&#64;camptocamp.com</a>&gt;</li>
<li><a class="reference external" href="https://trobz.com">Trobz</a>:</li>
<li>Nguyen Hoang Hiep &lt;<a class="reference external" href="mailto:hiepnh&#64;trobz.com">hiepnh&#64;trobz.com</a>&gt;</li>
</ul>
</div>
<div class="section" id="other-credits">
<h2><a class="toc-backref" href="#toc-entry-6">Other credits</a></h2>
<p>The migration of this module from 13.0 to 14.0 was financially supported by Camptocamp</p>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-7">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/sale-reporting/tree/16.0/sale_order_line_position">OCA/sale-reporting</a> project on GitHub.</p>
<p>You are welcome to contribute. To learn how please visit <a class="reference external" href="https://odoo-community.org/page/Contribute">https://odoo-community.org/page/Contribute</a>.</p>
</div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1 @@
from . import test_sale_order_line_position

View file

@ -0,0 +1,90 @@
# Copyright 2021 Camptocamp SA
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
from odoo.tests import TransactionCase
class TestSaleOrderLinePosition(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.env = cls.env(context=dict(cls.env.context, tracking_disable=True))
cls.partner = cls.env.ref("base.res_partner_12")
cls.product = cls.env.ref("product.product_product_9")
cls.order = cls.env["sale.order"].create(
{
"partner_id": cls.partner.id,
"order_line": [
(
0,
0,
{
"product_id": cls.product.id,
"product_uom": cls.product.uom_id.id,
"product_uom_qty": 3.0,
},
),
(0, 0, {"display_type": "line_section", "name": "Section"}),
(
0,
0,
{
"product_id": cls.product.id,
"product_uom": cls.product.uom_id.id,
"product_uom_qty": 5.0,
},
),
],
}
)
def test_new_line_position(self):
"""Check that new line created get a new incremental position number."""
line1 = self.order.order_line[0]
self.assertEqual(line1.position, 1)
self.assertEqual(line1.position_formatted, "001")
line2 = self.order.order_line[1]
self.assertEqual(line2.position, 0)
self.assertEqual(line2.position_formatted, "")
line3 = self.env["sale.order.line"].create(
[
{
"order_id": self.order.id,
"product_id": self.product.id,
"product_uom": self.product.uom_id.id,
"product_uom_qty": 9.0,
},
]
)
self.assertEqual(line3.position, 3)
self.assertEqual(line3.position_formatted, "003")
def test_unlink_line(self):
"""Check that when line are being removed position are recomputed."""
self.order.order_line[0].unlink()
self.assertEqual(len(self.order.order_line), 2)
self.assertEqual(self.order.order_line[1].position, 1)
def test_unlink_no_recompute_line(self):
"""Check that when parameter disable_sale_position_recompute is True
and line are being removed position are not recomputed."""
self.order.company_id.disable_sale_position_recompute = True
self.order.order_line[0].unlink()
self.assertEqual(len(self.order.order_line), 2)
self.assertEqual(self.order.order_line[1].position, 2)
def test_locked_positions(self):
"""Check that when order is sent, position are not recomputed."""
new_line = self.env["sale.order.line"].create(
[
{
"order_id": self.order.id,
"product_id": self.product.id,
"product_uom": self.product.uom_id.id,
"product_uom_qty": 15.0,
},
]
)
self.assertEqual(new_line.position, 3)
self.order.state = "sent"
self.order.order_line[0].unlink()
self.assertEqual(new_line.position, 3)

View file

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">sale.config.positioning.form</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="base.res_config_settings_view_form" />
<field name="arch" type="xml">
<div id="connectors_setting_container" position="after">
<h2>Sale Order Line Positions</h2>
<div
class="row mt16 o_settings_container"
name="line_positioning_setting_container"
>
<div
class="col-12 col-lg-6 o_setting_box"
id="line_positioning_options"
>
<div class="o_setting_left_pane">
<field name="disable_sale_position_recompute" />
</div>
<div class="o_setting_right_pane">
<label for="disable_sale_position_recompute" />
<div class="text-muted">
Do not recompute positions when line is removed
</div>
</div>
</div>
</div>
</div>
</field>
</record>
</odoo>

View file

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<record id="view_order_form_inherit" model="ir.ui.view">
<field name="name">sale.order.form.sale.inherit</field>
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form" />
<field name="priority">100</field>
<field name="arch" type="xml">
<xpath
expr="//field[@name='order_line']//form//field[@name='sequence']"
position="after"
>
<field name="position" force_save="1" />
</xpath>
<xpath
expr="//field[@name='order_line']//tree//field[@name='sequence']"
position="after"
>
<field name="position" string="Pos" force_save="1" optional="hide" />
</xpath>
</field>
</record>
<record model="ir.actions.server" id="action_compute_sale_position">
<field name="name">Recompute positions</field>
<field name="model_id" ref="sale.model_sale_order" />
<field name="binding_model_id" ref="sale.model_sale_order" />
<field name="state">code</field>
<field name="code">
records.recompute_positions()
</field>
</record>
</odoo>