Initial commit: OCA Workflow Process packages (456 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:00 +02:00
commit d366e42934
18799 changed files with 1284507 additions and 0 deletions

View file

@ -0,0 +1,47 @@
# Purchase Transport Mode
Odoo addon: purchase_transport_mode
## Installation
```bash
pip install odoo-bringout-oca-purchase-workflow-purchase_transport_mode
```
## Dependencies
This addon depends on:
- purchase
- purchase_exception
## Manifest Information
- **Name**: Purchase Transport Mode
- **Version**: 16.0.1.1.0
- **Category**: Purchase
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/purchase-workflow](https://github.com/OCA/purchase-workflow) branch 16.0, addon `purchase_transport_mode`.
## 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 Purchase_transport_mode Module - purchase_transport_mode
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 purchase_transport_mode. 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,6 @@
# Dependencies
This addon depends on:
- [purchase](../../odoo-bringout-oca-ocb-purchase)
- [purchase_exception](../../odoo-bringout-oca-purchase-workflow-purchase_exception)

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 purchase_transport_mode or install in UI.

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-purchase-workflow-purchase_transport_mode"
# or
uv pip install odoo-bringout-oca-purchase-workflow-purchase_transport_mode"
```

View file

@ -0,0 +1,18 @@
# Models
Detected core models and extensions in purchase_transport_mode.
```mermaid
classDiagram
class purchase_order
class purchase_transport_mode
class purchase_transport_mode_constraint
class purchase_order
class res_company
class res_config_settings
class res_partner
```
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: purchase_transport_mode. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon purchase_transport_mode
- License: LGPL-3

View file

@ -0,0 +1,3 @@
# Reports
This module does not define custom reports.

View file

@ -0,0 +1,34 @@
# Security
Access control and security definitions in purchase_transport_mode.
## Access Control Lists (ACLs)
Model access permissions defined in:
- **[ir.model.access.csv](../purchase_transport_mode/security/ir.model.access.csv)**
- 2 model access rules
## Record Rules
Row-level security rules defined in:
```mermaid
graph TB
subgraph "Security Layers"
A[Users] --> B[Groups]
B --> C[Access Control Lists]
C --> D[Models]
B --> E[Record Rules]
E --> F[Individual Records]
end
```
Security files overview:
- **[ir.model.access.csv](../purchase_transport_mode/security/ir.model.access.csv)**
- Model access permissions (CRUD rights)
Notes
- Access Control Lists define which groups can access which models
- Record Rules provide row-level security (filter records by user/group)
- Security groups organize users and define permission sets
- All security is enforced at the ORM level by Odoo

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 purchase_transport_mode
```

View file

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

View file

@ -0,0 +1,92 @@
=======================
Purchase Transport Mode
=======================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:80a82ab02d672fe114f144f9c684b11684eafd9cf415670f955b64d44bca56f7
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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%2Fpurchase--workflow-lightgray.png?logo=github
:target: https://github.com/OCA/purchase-workflow/tree/16.0/purchase_transport_mode
:alt: OCA/purchase-workflow
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/purchase-workflow-16-0/purchase-workflow-16-0-purchase_transport_mode
: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/purchase-workflow&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
Purchases can be received by different modes of transport. For example, the transport can be done in a truck with a loading capacity of X tonnes or Y tonnes.
With this module it is possible to validate that the purchase complies with the requirements of a particular mode of transport.
**Table of contents**
.. contents::
:local:
Usage
=====
To use this module, you need to:
#. In Purchase settings enable purchase transport mode validation
#. Create a transport modes with contraints applied on PO
#. Select transport mode on PO
If the transport requirements are not met, a message in yellow will be displayed at the top of the form.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/purchase-workflow/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/purchase-workflow/issues/new?body=module:%20purchase_transport_mode%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
* BCIM
Contributors
~~~~~~~~~~~~
* Telmo Santos <telmo.santos@camptocamp.com>
* Cyril Jeanneret <cyril.jeanneret@camptocamp.com>
* Jacques-Etienne Baudoux (BCIM) <je@bcim.be>
* Simone Orsi <simone.orsi@camptocamp.com>
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/purchase-workflow <https://github.com/OCA/purchase-workflow/tree/16.0/purchase_transport_mode>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,27 @@
# Copyright 2023 Camptocamp (<https://www.camptocamp.com>).
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{
"name": "Purchase Transport Mode",
"version": "16.0.1.1.0",
"development_status": "Beta",
"summary": "Purchase expection based on constraints",
"author": "Camptocamp, BCIM, Odoo Community Association (OCA)",
"license": "AGPL-3",
"category": "Purchase",
"depends": [
"purchase",
"purchase_exception",
],
"website": "https://github.com/OCA/purchase-workflow",
"data": [
"security/ir.model.access.csv",
"templates/purchase_order_transport_mode_status.xml",
"views/res_partner_views.xml",
"views/purchase_transport_mode_views.xml",
"views/purchase_transport_mode_constraint_views.xml",
"views/purchase_order_view.xml",
"views/res_config_settings_views.xml",
"data/purchase_exception_data.xml",
],
"installable": True,
}

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="po_excep_transport_mode" model="exception.rule">
<field name="name">Transport mode</field>
<field name="description">Transport mode requirements not satisfied</field>
<field name="sequence">50</field>
<field name="model">purchase.order</field>
<field name="code">if not self.transport_mode_status_ok:
failed=True</field>
</record>
</odoo>

View file

@ -0,0 +1,188 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_transport_mode
#
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: purchase_transport_mode
#: model:ir.model.fields,help:purchase_transport_mode.field_purchase_order__transport_mode_status_ok
msgid "All transport mode requirements are satisfied"
msgstr "Svi zahtjevi načina transporta su zadovoljeni"
#. module: purchase_transport_mode
#: model:ir.model.fields,help:purchase_transport_mode.field_purchase_order__transport_mode_status
msgid ""
"Collect and validate order details to satisfy transport mode requirements"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_res_company
msgid "Companies"
msgstr "Kompanije"
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_res_partner
msgid "Contact"
msgstr "Kontakt"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__create_uid
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__create_uid
msgid "Created by"
msgstr "Kreirao"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__create_date
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__create_date
msgid "Created on"
msgstr "Kreirano"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__description
msgid "Description"
msgstr "Opis"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__display_name
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__display_name
msgid "Display Name"
msgstr "Prikazani naziv"
#. module: purchase_transport_mode
#: model:ir.model.fields,help:purchase_transport_mode.field_purchase_transport_mode_constraint__purchase_domain
msgid "Domain based on purchase"
msgstr "Domena zasnovana na nabavci"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__id
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__id
msgid "ID"
msgstr "ID"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode____last_update
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint____last_update
msgid "Last Modified on"
msgstr "Zadnje mijenjano"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__write_uid
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__write_uid
msgid "Last Updated by"
msgstr "Zadnji ažurirao"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__write_date
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__write_date
msgid "Last Updated on"
msgstr "Zadnje ažurirano"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__name
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__name
msgid "Name"
msgstr "Naziv:"
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_res_config_settings
msgid "Procurement purchase grouping settings"
msgstr "Postavke grupisanja nabavke"
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_purchase_order
msgid "Purchase Order"
msgstr "Nalog za nabavu"
#. module: purchase_transport_mode
#: model:ir.actions.act_window,name:purchase_transport_mode.purchase_transport_mode_action
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__purchase_transport_mode_id
#: model:ir.model.fields,field_description:purchase_transport_mode.field_res_partner__purchase_transport_mode_id
#: model:ir.model.fields,field_description:purchase_transport_mode.field_res_users__purchase_transport_mode_id
#: model:ir.ui.menu,name:purchase_transport_mode.menu_purchase_transport_mode_action
msgid "Purchase Transport Mode"
msgstr "Način transporta nabavke"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_res_company__purchase_transport_mode_contraint_enabled
msgid "Purchase Transport Mode Contraint Enabled"
msgstr "Ograničenje načina transporta nabavke omogućeno"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__constraint_ids
msgid "Purchase Transport mode Constraints"
msgstr "Ograničenja načina transporta nabavke"
#. module: purchase_transport_mode
#: model_terms:ir.ui.view,arch_db:purchase_transport_mode.purchase_transport_mode_form
msgid "Purchase transport constraints"
msgstr "Ograničenja transporta nabavke"
#. module: purchase_transport_mode
#: model:ir.model.fields,help:purchase_transport_mode.field_purchase_order__transport_mode_status_display
msgid "Render transport_mode_status in the UI"
msgstr "Prikaži transport_mode_status u korisničkom interfejsu"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__purchase_domain
msgid "Source Purchase Domain"
msgstr "Izvorna domena nabavke"
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_order__transport_mode_id
msgid "Transport Mode"
msgstr "Način transporta"
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_purchase_transport_mode_constraint
msgid "Transport Mode Constraint"
msgstr "Ograničenje načina transporta"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_order__transport_mode_status
msgid "Transport Mode Status"
msgstr "Status načina transporta"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_order__transport_mode_status_display
msgid "Transport Mode Status Display"
msgstr "Prikaz statusa načina transporta"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_order__transport_mode_status_ok
msgid "Transport Mode Status Ok"
msgstr "Status načina transporta OK"
#. module: purchase_transport_mode
#: model:exception.rule,name:purchase_transport_mode.po_excep_transport_mode
msgid "Transport mode"
msgstr "Način transporta"
#. module: purchase_transport_mode
#: model_terms:ir.ui.view,arch_db:purchase_transport_mode.purchase_order_transport_mode_status_display
msgid "Transport mode errors"
msgstr "Greške u načinu transporta"
#. module: purchase_transport_mode
#: model:exception.rule,description:purchase_transport_mode.po_excep_transport_mode
msgid "Transport mode requirements not satisfied"
msgstr "Zahtjevi načina transporta nisu zadovoljeni"
#. module: purchase_transport_mode
#: model_terms:ir.ui.view,arch_db:purchase_transport_mode.res_config_settings_view_form_purchase_inherit
msgid "Validate purchase order details to satisfy transport mode requirements"
msgstr "Validacija detalja narudžbenice kako bi se zadovoljili zahtjevi načina transporta"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_res_config_settings__purchase_transport_mode_contraint_enabled
msgid "Validate purchase transport mode"
msgstr "Validacija načina transporta nabavke"

View file

@ -0,0 +1,195 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_transport_mode
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-12-31 13:06+0000\n"
"Last-Translator: samibc2c <sami.bouzidi@camptocamp.com>\n"
"Language-Team: none\n"
"Language: fr\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 5.6.2\n"
#. module: purchase_transport_mode
#: model:ir.model.fields,help:purchase_transport_mode.field_purchase_order__transport_mode_status_ok
msgid "All transport mode requirements are satisfied"
msgstr "Toutes les exigences relatives au mode de transport sont satisfaites"
#. module: purchase_transport_mode
#: model:ir.model.fields,help:purchase_transport_mode.field_purchase_order__transport_mode_status
msgid ""
"Collect and validate order details to satisfy transport mode requirements"
msgstr ""
"Recueille et valide les détails de la commande pour satisfaire aux exigences "
"du mode de transport"
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_res_company
msgid "Companies"
msgstr "Société"
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_res_partner
msgid "Contact"
msgstr "Contact"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__create_uid
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__create_uid
msgid "Created by"
msgstr "Créé par"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__create_date
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__create_date
msgid "Created on"
msgstr "Créé le"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__description
msgid "Description"
msgstr "Description"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__display_name
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__display_name
msgid "Display Name"
msgstr "Nom affiché"
#. module: purchase_transport_mode
#: model:ir.model.fields,help:purchase_transport_mode.field_purchase_transport_mode_constraint__purchase_domain
msgid "Domain based on purchase"
msgstr "Domaine basé sur l'achat"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__id
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__id
msgid "ID"
msgstr "ID"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode____last_update
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint____last_update
msgid "Last Modified on"
msgstr "Dernière modification le"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__write_uid
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__write_uid
msgid "Last Updated by"
msgstr "Dernière mise à jour par"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__write_date
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__write_date
msgid "Last Updated on"
msgstr "Dernière mise à jour le"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__name
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__name
msgid "Name"
msgstr "Nom"
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_res_config_settings
msgid "Procurement purchase grouping settings"
msgstr "Paramètres de regroupement des achats"
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_purchase_order
msgid "Purchase Order"
msgstr "Commande d'achat"
#. module: purchase_transport_mode
#: model:ir.actions.act_window,name:purchase_transport_mode.purchase_transport_mode_action
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__purchase_transport_mode_id
#: model:ir.model.fields,field_description:purchase_transport_mode.field_res_partner__purchase_transport_mode_id
#: model:ir.model.fields,field_description:purchase_transport_mode.field_res_users__purchase_transport_mode_id
#: model:ir.ui.menu,name:purchase_transport_mode.menu_purchase_transport_mode_action
msgid "Purchase Transport Mode"
msgstr "Mode de transport des achats"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_res_company__purchase_transport_mode_contraint_enabled
msgid "Purchase Transport Mode Contraint Enabled"
msgstr "Mode de transport des achats Contraint activé"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__constraint_ids
msgid "Purchase Transport mode Constraints"
msgstr "Contraintes des modes de transport des achats"
#. module: purchase_transport_mode
#: model_terms:ir.ui.view,arch_db:purchase_transport_mode.purchase_transport_mode_form
msgid "Purchase transport constraints"
msgstr "Contraintes des modes de transport des achats"
#. module: purchase_transport_mode
#: model:ir.model.fields,help:purchase_transport_mode.field_purchase_order__transport_mode_status_display
msgid "Render transport_mode_status in the UI"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__purchase_domain
msgid "Source Purchase Domain"
msgstr "Domaine de l'achat source"
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_order__transport_mode_id
msgid "Transport Mode"
msgstr "Mode de transport"
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_purchase_transport_mode_constraint
msgid "Transport Mode Constraint"
msgstr "Contrainte du mode de transport"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_order__transport_mode_status
msgid "Transport Mode Status"
msgstr "Statut du mode de transport"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_order__transport_mode_status_display
msgid "Transport Mode Status Display"
msgstr "Affichage du statut du mode transport"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_order__transport_mode_status_ok
msgid "Transport Mode Status Ok"
msgstr "Statut du mode de transport Ok"
#. module: purchase_transport_mode
#: model:exception.rule,name:purchase_transport_mode.po_excep_transport_mode
msgid "Transport mode"
msgstr "Mode de transport"
#. module: purchase_transport_mode
#: model_terms:ir.ui.view,arch_db:purchase_transport_mode.purchase_order_transport_mode_status_display
msgid "Transport mode errors"
msgstr "Erreurs dans le mode de transport"
#. module: purchase_transport_mode
#: model:exception.rule,description:purchase_transport_mode.po_excep_transport_mode
msgid "Transport mode requirements not satisfied"
msgstr "Les exigences relatives au mode de transport ne sont pas satisfaites"
#. module: purchase_transport_mode
#: model_terms:ir.ui.view,arch_db:purchase_transport_mode.res_config_settings_view_form_purchase_inherit
msgid "Validate purchase order details to satisfy transport mode requirements"
msgstr ""
"Valider les détails du bon de commande d'achat pour satisfaire aux exigences "
"du mode de transport"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_res_config_settings__purchase_transport_mode_contraint_enabled
msgid "Validate purchase transport mode"
msgstr "Valider le mode de transport des achats"

View file

@ -0,0 +1,195 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_transport_mode
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-08-17 18:58+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 5.6.2\n"
#. module: purchase_transport_mode
#: model:ir.model.fields,help:purchase_transport_mode.field_purchase_order__transport_mode_status_ok
msgid "All transport mode requirements are satisfied"
msgstr "Tutti i requisiti dellla modalità di trasporto sono soddisfatti"
#. module: purchase_transport_mode
#: model:ir.model.fields,help:purchase_transport_mode.field_purchase_order__transport_mode_status
msgid ""
"Collect and validate order details to satisfy transport mode requirements"
msgstr ""
"Raccogliere e validare i dettagli dell'ordine per soddisfare i requisiti "
"dellla modalità di trasporto"
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_res_company
msgid "Companies"
msgstr "Aziende"
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_res_partner
msgid "Contact"
msgstr "Contatto"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__create_uid
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__create_uid
msgid "Created by"
msgstr "Creato da"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__create_date
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__create_date
msgid "Created on"
msgstr "Creato il"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__description
msgid "Description"
msgstr "Descrizione"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__display_name
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: purchase_transport_mode
#: model:ir.model.fields,help:purchase_transport_mode.field_purchase_transport_mode_constraint__purchase_domain
msgid "Domain based on purchase"
msgstr "Dominio in base all'acquisto"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__id
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__id
msgid "ID"
msgstr "ID"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode____last_update
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__write_uid
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento di"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__write_date
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento il"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__name
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__name
msgid "Name"
msgstr "Nome"
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_res_config_settings
msgid "Procurement purchase grouping settings"
msgstr "Impostazioni raggruppamento approvvigionamento acquisti"
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_purchase_order
msgid "Purchase Order"
msgstr "Ordine di acquisto"
#. module: purchase_transport_mode
#: model:ir.actions.act_window,name:purchase_transport_mode.purchase_transport_mode_action
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__purchase_transport_mode_id
#: model:ir.model.fields,field_description:purchase_transport_mode.field_res_partner__purchase_transport_mode_id
#: model:ir.model.fields,field_description:purchase_transport_mode.field_res_users__purchase_transport_mode_id
#: model:ir.ui.menu,name:purchase_transport_mode.menu_purchase_transport_mode_action
msgid "Purchase Transport Mode"
msgstr "Modalità di trasporto acquisto"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_res_company__purchase_transport_mode_contraint_enabled
msgid "Purchase Transport Mode Contraint Enabled"
msgstr "Limite modalità di trasporto acquisto abilitato"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__constraint_ids
msgid "Purchase Transport mode Constraints"
msgstr "Limiti modalità di trasporto acquisto"
#. module: purchase_transport_mode
#: model_terms:ir.ui.view,arch_db:purchase_transport_mode.purchase_transport_mode_form
msgid "Purchase transport constraints"
msgstr "Limiti trasporto acquisto"
#. module: purchase_transport_mode
#: model:ir.model.fields,help:purchase_transport_mode.field_purchase_order__transport_mode_status_display
msgid "Render transport_mode_status in the UI"
msgstr "Visualizza transport_mode_status nella UI"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__purchase_domain
msgid "Source Purchase Domain"
msgstr "Dominio acquisto origine"
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_order__transport_mode_id
msgid "Transport Mode"
msgstr "Modalità di trasporto"
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_purchase_transport_mode_constraint
msgid "Transport Mode Constraint"
msgstr "Limite modalità di trasporto"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_order__transport_mode_status
msgid "Transport Mode Status"
msgstr "Stato modalità di trasporto"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_order__transport_mode_status_display
msgid "Transport Mode Status Display"
msgstr "Visualizzazione stato modalità di trasporto"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_order__transport_mode_status_ok
msgid "Transport Mode Status Ok"
msgstr "Stato OK modalità di trasporto"
#. module: purchase_transport_mode
#: model:exception.rule,name:purchase_transport_mode.po_excep_transport_mode
msgid "Transport mode"
msgstr "Modalità di trasporto"
#. module: purchase_transport_mode
#: model_terms:ir.ui.view,arch_db:purchase_transport_mode.purchase_order_transport_mode_status_display
msgid "Transport mode errors"
msgstr "Errori modalità di trasporto"
#. module: purchase_transport_mode
#: model:exception.rule,description:purchase_transport_mode.po_excep_transport_mode
msgid "Transport mode requirements not satisfied"
msgstr "Specifiche modalità di trasporto non soddisfatte"
#. module: purchase_transport_mode
#: model_terms:ir.ui.view,arch_db:purchase_transport_mode.res_config_settings_view_form_purchase_inherit
msgid "Validate purchase order details to satisfy transport mode requirements"
msgstr ""
"Validare i dettagli dell'ordinei di acquisto per soddisfare i requisiti "
"della modalità di trasporto"
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_res_config_settings__purchase_transport_mode_contraint_enabled
msgid "Validate purchase transport mode"
msgstr "Validazione modalità di trasporto acquisti"

View file

@ -0,0 +1,188 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_transport_mode
#
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: purchase_transport_mode
#: model:ir.model.fields,help:purchase_transport_mode.field_purchase_order__transport_mode_status_ok
msgid "All transport mode requirements are satisfied"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,help:purchase_transport_mode.field_purchase_order__transport_mode_status
msgid ""
"Collect and validate order details to satisfy transport mode requirements"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_res_company
msgid "Companies"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_res_partner
msgid "Contact"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__create_uid
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__create_uid
msgid "Created by"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__create_date
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__create_date
msgid "Created on"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__description
msgid "Description"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__display_name
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__display_name
msgid "Display Name"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,help:purchase_transport_mode.field_purchase_transport_mode_constraint__purchase_domain
msgid "Domain based on purchase"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__id
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__id
msgid "ID"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode____last_update
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint____last_update
msgid "Last Modified on"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__write_uid
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__write_uid
msgid "Last Updated by"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__write_date
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__write_date
msgid "Last Updated on"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__name
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__name
msgid "Name"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_res_config_settings
msgid "Procurement purchase grouping settings"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_purchase_order
msgid "Purchase Order"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.actions.act_window,name:purchase_transport_mode.purchase_transport_mode_action
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__purchase_transport_mode_id
#: model:ir.model.fields,field_description:purchase_transport_mode.field_res_partner__purchase_transport_mode_id
#: model:ir.model.fields,field_description:purchase_transport_mode.field_res_users__purchase_transport_mode_id
#: model:ir.ui.menu,name:purchase_transport_mode.menu_purchase_transport_mode_action
msgid "Purchase Transport Mode"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_res_company__purchase_transport_mode_contraint_enabled
msgid "Purchase Transport Mode Contraint Enabled"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode__constraint_ids
msgid "Purchase Transport mode Constraints"
msgstr ""
#. module: purchase_transport_mode
#: model_terms:ir.ui.view,arch_db:purchase_transport_mode.purchase_transport_mode_form
msgid "Purchase transport constraints"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,help:purchase_transport_mode.field_purchase_order__transport_mode_status_display
msgid "Render transport_mode_status in the UI"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_transport_mode_constraint__purchase_domain
msgid "Source Purchase Domain"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_order__transport_mode_id
msgid "Transport Mode"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model,name:purchase_transport_mode.model_purchase_transport_mode_constraint
msgid "Transport Mode Constraint"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_order__transport_mode_status
msgid "Transport Mode Status"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_order__transport_mode_status_display
msgid "Transport Mode Status Display"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_purchase_order__transport_mode_status_ok
msgid "Transport Mode Status Ok"
msgstr ""
#. module: purchase_transport_mode
#: model:exception.rule,name:purchase_transport_mode.po_excep_transport_mode
msgid "Transport mode"
msgstr ""
#. module: purchase_transport_mode
#: model_terms:ir.ui.view,arch_db:purchase_transport_mode.purchase_order_transport_mode_status_display
msgid "Transport mode errors"
msgstr ""
#. module: purchase_transport_mode
#: model:exception.rule,description:purchase_transport_mode.po_excep_transport_mode
msgid "Transport mode requirements not satisfied"
msgstr ""
#. module: purchase_transport_mode
#: model_terms:ir.ui.view,arch_db:purchase_transport_mode.res_config_settings_view_form_purchase_inherit
msgid "Validate purchase order details to satisfy transport mode requirements"
msgstr ""
#. module: purchase_transport_mode
#: model:ir.model.fields,field_description:purchase_transport_mode.field_res_config_settings__purchase_transport_mode_contraint_enabled
msgid "Validate purchase transport mode"
msgstr ""

View file

@ -0,0 +1,6 @@
from . import purchase_transport_mode
from . import purchase_transport_mode_constraint
from . import res_partner
from . import purchase_order
from . import res_company
from . import res_config_settings

View file

@ -0,0 +1,75 @@
# Copyright 2023 Camptocamp (<https://www.camptocamp.com>).
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models
class PurchaseOrder(models.Model):
_inherit = "purchase.order"
_name = "purchase.order"
transport_mode_id = fields.Many2one(
"purchase.transport.mode",
compute="_compute_transport_mode_id",
store=True,
readonly=False,
)
transport_mode_status = fields.Json(
compute="_compute_transport_mode_validation_status",
help="Collect and validate order details to satisfy transport mode requirements",
default={},
)
transport_mode_status_display = fields.Html(
compute="_compute_transport_mode_validation_status",
help="Render transport_mode_status in the UI",
)
transport_mode_status_ok = fields.Boolean(
compute="_compute_transport_mode_validation_status",
help="All transport mode requirements are satisfied",
)
@api.depends("partner_id")
def _compute_transport_mode_id(self):
for rec in self:
rec.transport_mode_id = (
rec.partner_id.commercial_partner_id.purchase_transport_mode_id
)
@api.depends("transport_mode_id")
def _compute_transport_mode_validation_status(self):
for rec in self:
rec.transport_mode_status = rec._get_transport_mode_validation_status()
rec.transport_mode_status_display = (
rec._get_transport_mode_validation_status_display()
)
rec.transport_mode_status_ok = False if rec.transport_mode_status else True
def _get_transport_mode_validation_status(self):
self.ensure_one()
errors = []
if (
not self.company_id.purchase_transport_mode_contraint_enabled
or not isinstance(self.id, int) # Record is not saved yet
):
return {}
for constraint in self.transport_mode_id.constraint_ids:
if not constraint.filter_valid_purchase(self):
error_message = "{}: {}".format(
constraint.name, constraint.description or ""
)
errors.append(error_message)
if errors:
return {"errors": errors}
return {}
def _get_transport_mode_validation_status_display(self):
if not self.transport_mode_status:
return ""
errors = self.transport_mode_status.get("errors", [])
if errors:
return self.env["ir.qweb"]._render(
"purchase_transport_mode.purchase_order_transport_mode_status_display",
{"order": self, "errors": errors},
)
return ""

View file

@ -0,0 +1,18 @@
# Copyright 2023 Camptocamp (<https://www.camptocamp.com>).
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import fields, models
class PurchaseTransportMode(models.Model):
_name = "purchase.transport.mode"
_description = "Transport Mode"
name = fields.Char(required=True)
constraint_ids = fields.One2many(
comodel_name="purchase.transport.mode.constraint",
inverse_name="purchase_transport_mode_id",
string="Purchase Transport mode Constraints",
)

View file

@ -0,0 +1,30 @@
# Copyright 2023 Camptocamp (<https://www.camptocamp.com>).
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import fields, models
from odoo.tools.safe_eval import safe_eval
class PurchaseTransportModeConstraints(models.Model):
_name = "purchase.transport.mode.constraint"
_description = "Transport Mode Constraint"
name = fields.Char(required=True)
description = fields.Char()
purchase_domain = fields.Char(
string="Source Purchase Domain",
default=[],
copy=False,
help="Domain based on purchase",
)
purchase_transport_mode_id = fields.Many2one("purchase.transport.mode")
def filter_valid_purchase(self, purchase):
if not self.purchase_domain:
return purchase
domain = safe_eval(self.purchase_domain or "[]")
if not domain:
return purchase
return purchase.filtered_domain(domain)

View file

@ -0,0 +1,10 @@
# Copyright 2023 Camptocamp (<https://www.camptocamp.com>).
# 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"
purchase_transport_mode_contraint_enabled = fields.Boolean()

View file

@ -0,0 +1,13 @@
# Copyright 2023 Camptocamp (<https://www.camptocamp.com>).
# 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"
purchase_transport_mode_contraint_enabled = fields.Boolean(
related="company_id.purchase_transport_mode_contraint_enabled",
readonly=False,
string="Validate purchase transport mode",
)

View file

@ -0,0 +1,10 @@
# Copyright 2023 Camptocamp (<https://www.camptocamp.com>).
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import fields, models
class ResPartner(models.Model):
_inherit = "res.partner"
purchase_transport_mode_id = fields.Many2one("purchase.transport.mode")

View file

@ -0,0 +1,4 @@
* Telmo Santos <telmo.santos@camptocamp.com>
* Cyril Jeanneret <cyril.jeanneret@camptocamp.com>
* Jacques-Etienne Baudoux (BCIM) <je@bcim.be>
* Simone Orsi <simone.orsi@camptocamp.com>

View file

@ -0,0 +1,2 @@
Purchases can be received by different modes of transport. For example, the transport can be done in a truck with a loading capacity of X tonnes or Y tonnes.
With this module it is possible to validate that the purchase complies with the requirements of a particular mode of transport.

View file

@ -0,0 +1,7 @@
To use this module, you need to:
#. In Purchase settings enable purchase transport mode validation
#. Create a transport modes with contraints applied on PO
#. Select transport mode on PO
If the transport requirements are not met, a message in yellow will be displayed at the top of the form.

View file

@ -0,0 +1,3 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_purchase_transport_mode,access_purchase_transport_mode,model_purchase_transport_mode,purchase.group_purchase_user,1,1,1,1
access_purchase_transport_mode_constraint,access_purchase_transport_mode_constraint,model_purchase_transport_mode_constraint,purchase.group_purchase_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_purchase_transport_mode access_purchase_transport_mode model_purchase_transport_mode purchase.group_purchase_user 1 1 1 1
3 access_purchase_transport_mode_constraint access_purchase_transport_mode_constraint model_purchase_transport_mode_constraint purchase.group_purchase_user 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,439 @@
<!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>Purchase Transport Mode</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="purchase-transport-mode">
<h1 class="title">Purchase Transport Mode</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:80a82ab02d672fe114f144f9c684b11684eafd9cf415670f955b64d44bca56f7
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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/purchase-workflow/tree/16.0/purchase_transport_mode"><img alt="OCA/purchase-workflow" src="https://img.shields.io/badge/github-OCA%2Fpurchase--workflow-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/purchase-workflow-16-0/purchase-workflow-16-0-purchase_transport_mode"><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/purchase-workflow&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>Purchases can be received by different modes of transport. For example, the transport can be done in a truck with a loading capacity of X tonnes or Y tonnes.
With this module it is possible to validate that the purchase complies with the requirements of a particular mode of transport.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="toc-entry-1">Usage</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="#maintainers" id="toc-entry-6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
<p>To use this module, you need to:</p>
<ol class="arabic simple">
<li>In Purchase settings enable purchase transport mode validation</li>
<li>Create a transport modes with contraints applied on PO</li>
<li>Select transport mode on PO</li>
</ol>
<p>If the transport requirements are not met, a message in yellow will be displayed at the top of the form.</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/purchase-workflow/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/purchase-workflow/issues/new?body=module:%20purchase_transport_mode%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>
<li>BCIM</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
<ul class="simple">
<li>Telmo Santos &lt;<a class="reference external" href="mailto:telmo.santos&#64;camptocamp.com">telmo.santos&#64;camptocamp.com</a>&gt;</li>
<li>Cyril Jeanneret &lt;<a class="reference external" href="mailto:cyril.jeanneret&#64;camptocamp.com">cyril.jeanneret&#64;camptocamp.com</a>&gt;</li>
<li>Jacques-Etienne Baudoux (BCIM) &lt;<a class="reference external" href="mailto:je&#64;bcim.be">je&#64;bcim.be</a>&gt;</li>
<li>Simone Orsi &lt;<a class="reference external" href="mailto:simone.orsi&#64;camptocamp.com">simone.orsi&#64;camptocamp.com</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-6">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/purchase-workflow/tree/16.0/purchase_transport_mode">OCA/purchase-workflow</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,18 @@
<?xml version="1.0" ?>
<odoo>
<template id="purchase_order_transport_mode_status_display">
<div
class="alert alert-warning"
role="alert"
style="margin-bottom:0px;"
t-if="errors"
>
<h5 class="alert-heading">Transport mode errors</h5>
<ol class="pl-2">
<li t-foreach="errors" t-as="err">
<t t-esc="err" />
</li>
</ol>
</div>
</template>
</odoo>

View file

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

View file

@ -0,0 +1,102 @@
# Copyright 2023 Camptocamp (<https://www.camptocamp.com>).
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo.tests import TransactionCase
from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT
class TestPurchaseTransportMode(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
cls.env = cls.env["base"].with_context(**DISABLED_MAIL_CONTEXT).env
cls.product_a = cls.env.ref("product.consu_delivery_01")
cls.purchase_order = cls.env["purchase.order"].create(
{
"company_id": cls.env.company.id,
"partner_id": cls.env.ref("base.res_partner_12").id,
}
)
cls.env["purchase.order.line"].create(
{
"order_id": cls.purchase_order.id,
"name": cls.product_a.name,
"product_id": cls.product_a.id,
"product_qty": 5,
}
)
cls.transport_mode_a = cls.env["purchase.transport.mode"].create(
{"name": "Transport mode A"}
)
cls.constraint_a = cls.env["purchase.transport.mode.constraint"].create(
{
"name": "Constraint A",
"description": "The total amount of the order must be higher than 5000",
"purchase_transport_mode_id": cls.transport_mode_a.id,
"purchase_domain": [("amount_total", ">", 5000)],
}
)
def enable_purchase_transport_mode_validation(self):
self.settings = self.env["res.config.settings"].create({})
self.settings.purchase_transport_mode_contraint_enabled = True
self.settings.set_values()
def test_disabled_purchase_transport_mode_validation(self):
self.purchase_order.button_confirm()
self.assertEqual(self.purchase_order.state, "purchase")
def test_purchase_transport_mode_validation(self):
self.enable_purchase_transport_mode_validation()
self.purchase_order.transport_mode_id = self.transport_mode_a
self.purchase_order.button_confirm()
self.assertFalse(self.purchase_order.transport_mode_status_ok)
self.assertEqual(self.purchase_order.state, "draft")
self.assertEqual(
self.purchase_order.transport_mode_status,
{
"errors": [
"Constraint A: The total amount of the order must be higher than 5000"
]
},
)
self.purchase_order.order_line.product_qty = 500
self.purchase_order.invalidate_cache()
self.purchase_order.button_confirm()
self.assertEqual(self.purchase_order.state, "purchase")
def test_filter_valid_purchase(self):
self.assertEqual(
self.constraint_a.filter_valid_purchase(self.purchase_order),
self.env["purchase.order"],
)
self.constraint_a.purchase_domain = []
self.assertEqual(
self.constraint_a.filter_valid_purchase(self.purchase_order),
self.purchase_order,
)
def test_create_po_with_partner_transport_mode(self):
"""Test that the transport mode of the partner is set on the purchase order."""
no_transport_mode_po = self.env["purchase.order"].create(
{
"company_id": self.env.company.id,
"partner_id": self.env.ref("base.res_partner_12").id,
}
)
self.assertFalse(no_transport_mode_po.transport_mode_id)
self.env.ref(
"base.res_partner_12"
).purchase_transport_mode_id = self.transport_mode_a
with_transport_mode_po = self.env["purchase.order"].create(
{
"company_id": self.env.company.id,
"partner_id": self.env.ref("base.res_partner_12").id,
}
)
self.assertEqual(
with_transport_mode_po.transport_mode_id, self.transport_mode_a
)

View file

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="purchase_order_view_form_inherit" model="ir.ui.view">
<field name="name">purchase.order.form.inherit</field>
<field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase.purchase_order_form" />
<field name="arch" type="xml">
<xpath expr="//field[@name='currency_id']" position="after">
<field name="transport_mode_id" />
</xpath>
<xpath expr="//sheet" position="before">
<field name="transport_mode_status_ok" invisible="1" />
<field
name="transport_mode_status_display"
nolabel="1"
attrs="{'invisible': [('transport_mode_status_ok', '=', True)]}"
/>
</xpath>
</field>
</record>
<menuitem
action="purchase_transport_mode.purchase_transport_mode_action"
id="menu_purchase_transport_mode_action"
parent="purchase.menu_purchase_config"
/>
</odoo>

View file

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="purchase_transport_mode_constraint_form" model="ir.ui.view">
<field name="model">purchase.transport.mode.constraint</field>
<field name="arch" type="xml">
<form>
<sheet>
<div class="oe_title">
<label for="name" />
<h1><field name="name" /></h1>
</div>
<group>
<field name="description" />
<field
name="purchase_domain"
widget="domain"
options="{'model': 'purchase.order'}"
/>
<field name="purchase_transport_mode_id" />
</group>
</sheet>
</form>
</field>
</record>
<record id="purchase_transport_mode_constraint_tree" model="ir.ui.view">
<field name="model">purchase.transport.mode.constraint</field>
<field name="arch" type="xml">
<tree>
<field name="name" />
<field name="description" />
<field name="purchase_domain" />
</tree>
</field>
</record>
<record id="purchase_transport_mode_constraint_search" model="ir.ui.view">
<field name="model">purchase.transport.mode.constraint</field>
<field name="arch" type="xml">
<search>
<field name="name" />
</search>
</field>
</record>
</odoo>

View file

@ -0,0 +1,53 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="purchase_transport_mode_form" model="ir.ui.view">
<field name="model">purchase.transport.mode</field>
<field name="arch" type="xml">
<form>
<sheet>
<div class="oe_title">
<label for="name" />
<h1><field name="name" /></h1>
</div>
<group>
<field
name="constraint_ids"
string="Purchase transport constraints"
>
<tree>
<field name="name" />
<field name="purchase_domain" />
</tree>
</field>
</group>
</sheet>
</form>
</field>
</record>
<record id="purchase_transport_mode_tree" model="ir.ui.view">
<field name="model">purchase.transport.mode</field>
<field name="arch" type="xml">
<tree>
<field name="name" />
</tree>
</field>
</record>
<record id="purchase_transport_mode_search" model="ir.ui.view">
<field name="model">purchase.transport.mode</field>
<field name="arch" type="xml">
<search>
<field name="name" />
</search>
</field>
</record>
<record id="purchase_transport_mode_action" model="ir.actions.act_window">
<field name="name">Purchase Transport Mode</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">purchase.transport.mode</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="purchase_transport_mode_tree" />
</record>
</odoo>

View file

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="res_config_settings_view_form_purchase_inherit" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit</field>
<field name="model">res.config.settings</field>
<field name="priority" eval="25" />
<field
name="inherit_id"
ref="purchase.res_config_settings_view_form_purchase"
/>
<field name="arch" type="xml">
<xpath expr="//div[@id='auto_receipt_reminder']" position="after">
<div
class="col-12 col-lg-6 o_setting_box"
id="check_purchase_transport_mode_constraint"
>
<div class="o_setting_left_pane">
<field
name="purchase_transport_mode_contraint_enabled"
/>
</div>
<div class="o_setting_right_pane">
<label
for="purchase_transport_mode_contraint_enabled"
/>
<div class="text-muted">
Validate purchase order details to satisfy transport mode requirements
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="res_partner_form_inherit" model="ir.ui.view">
<field name="name">res.partner.form.inherit</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form" />
<field name="arch" type="xml">
<group name="purchase" position="inside">
<field name="purchase_transport_mode_id" />
</group>
</field>
</record>
</odoo>

View file

@ -0,0 +1,43 @@
[project]
name = "odoo-bringout-oca-purchase-workflow-purchase_transport_mode"
version = "16.0.0"
description = "Purchase Transport Mode - Purchase expection based on constraints"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-purchase>=16.0.0",
"odoo-bringout-oca-purchase-workflow-purchase_exception>=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 = ["purchase_transport_mode"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]