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 Exception
Odoo addon: purchase_exception
## Installation
```bash
pip install odoo-bringout-oca-purchase-workflow-purchase_exception
```
## Dependencies
This addon depends on:
- purchase
- base_exception
## Manifest Information
- **Name**: Purchase Exception
- **Version**: 16.0.1.0.1
- **Category**: Generic Modules/Purchase
- **License**: AGPL-3
- **Installable**: True
## Source
Based on [OCA/purchase-workflow](https://github.com/OCA/purchase-workflow) branch 16.0, addon `purchase_exception`.
## 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_exception Module - purchase_exception
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_exception. 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)
- [base_exception](../../odoo-bringout-oca-server-tools-base_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_exception or install in UI.

View file

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

View file

@ -0,0 +1,14 @@
# Models
Detected core models and extensions in purchase_exception.
```mermaid
classDiagram
class purchase_order
class purchase_order_line
class exception_rule
```
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_exception. Provides features documented in upstream Odoo 16 under this addon.
- Source: OCA/OCB 16.0, addon purchase_exception
- 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_exception.
## Access Control Lists (ACLs)
Model access permissions defined in:
- **[ir.model.access.csv](../purchase_exception/security/ir.model.access.csv)**
- 1 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_exception/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_exception
```

View file

@ -0,0 +1,8 @@
# Wizards
Transient models exposed as UI wizards in purchase_exception.
```mermaid
classDiagram
class PurchaseExceptionConfirm
```

View file

@ -0,0 +1,83 @@
==================
Purchase Exception
==================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:97f88239a27ed104d1494d8aae2f9d907a644d49f44d9a745cdf6f4191e0acb5
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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_exception
: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_exception
: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|
This module allows you attach several customizable exceptions to your
purchase order in a way that you can filter orders by exceptions type and fix them.
This is especially useful in an scenario for mass purchases order import, because it's likely some orders have
errors when you import them (like product not found in Odoo, wrong line
format etc.)
**Table of contents**
.. contents::
:local:
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_exception%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
~~~~~~~
* Akretion
Contributors
~~~~~~~~~~~~
* Mourad EL HADJ MIMOUNE <mourad.elhadj.mimoune@akretion.com>
* Sudhir Arya <sudhir@erpharbor.com>
* Kitti U. <kittiu@ecosoft.co.th> (migration to v14)
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_exception>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1 @@
from . import models, wizard

View file

@ -0,0 +1,21 @@
# Copyright 2017 Akretion (http://www.akretion.com)
# Mourad EL HADJ MIMOUNE <mourad.elhadj.mimoune@akretion.com>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
"name": "Purchase Exception",
"summary": "Custom exceptions on purchase order",
"version": "16.0.1.0.1",
"category": "Generic Modules/Purchase",
"author": "Akretion, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/purchase-workflow",
"depends": ["purchase", "base_exception"],
"license": "AGPL-3",
"data": [
"security/ir.model.access.csv",
"data/purchase_exception_data.xml",
"wizard/purchase_exception_confirm_view.xml",
"views/purchase_view.xml",
],
"installable": True,
}

View file

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<!-- Test Purchase Exceptions Scheduler-->
<record model="ir.cron" forcecreate="True" id="ir_cron_test_po_order_except">
<field name="name">Purchase: Test Draft Orders Exception</field>
<field name="model_id" ref="purchase.model_purchase_order" />
<field name="state">code</field>
<field name="code">model.test_all_draft_orders()</field>
<field name="user_id" ref="base.user_root" />
<field name="interval_number">20</field>
<field name="interval_type">minutes</field>
<field name="numbercall">-1</field>
<field name="doall" eval="False" />
<field name="active" eval="False" />
</record>
<record id="po_excep_no_email" model="exception.rule">
<field name="name">No email on vendor</field>
<field name="description">No Email for Vendor</field>
<field name="sequence">50</field>
<field name="model">purchase.order</field>
<field name="code">if not self.partner_id.email:
failed=True</field>
<field name="active" eval="False" />
</record>
<record id="pol_excep_qty_check" model="exception.rule">
<field name="name">Quantity not positive</field>
<field name="description">Purchase line quantity must be positive</field>
<field name="sequence">50</field>
<field name="model">purchase.order.line</field>
<field name="code">if self.product_qty &lt; 0:
failed=True</field>
<field name="active" eval="False" />
</record>
</odoo>

View file

@ -0,0 +1,176 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_exception
#
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_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
msgid "<strong>There are exceptions blocking this Purchase Order:</strong>"
msgstr "<strong>Postoje izuzeci koji blokiraju ovaj nabavni nalog:</strong>"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_exception_rule__model
msgid "Apply on"
msgstr "Primjeni na"
#. module: purchase_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_purchase_order_filter
msgid "Blocked in Draft"
msgstr "Blokiran u nacrtu"
#. module: purchase_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
msgid ""
"Click here to be able to confirm this Agreement regardless of the "
"exceptions."
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__create_uid
msgid "Created by"
msgstr "Kreirao"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__create_date
msgid "Created on"
msgstr "Kreirano"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__display_name
msgid "Display Name"
msgstr "Prikazani naziv"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_exception_rule
msgid "Exception Rule"
msgstr "Pravilo izuzetka"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__exception_ids
msgid "Exceptions"
msgstr "Izuzeci"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__exceptions_summary
msgid "Exceptions Summary"
msgstr "Opis"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__exception_ids
msgid "Exceptions to resolve"
msgstr "Izuzeci za riješiti"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__id
msgid "ID"
msgstr "ID"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__ignore
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__ignore_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order_line__ignore_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
msgid "Ignore Exceptions"
msgstr "Ignoriraj izuzetke"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm____last_update
msgid "Last Modified on"
msgstr "Zadnje mijenjano"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__write_uid
msgid "Last Updated by"
msgstr "Zadnji ažurirao"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__write_date
msgid "Last Updated on"
msgstr "Zadnje ažurirano"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__main_exception_id
msgid "Main Exception"
msgstr "Glavni izuzetak"
#. module: purchase_exception
#: model:exception.rule,description:purchase_exception.po_excep_no_email
msgid "No Email for Vendor"
msgstr "Nema e-pošte za dobavljača"
#. module: purchase_exception
#: model:exception.rule,name:purchase_exception.po_excep_no_email
msgid "No email on vendor"
msgstr "Nema e-pošte na dobavljaču"
#. module: purchase_exception
#: model:ir.actions.act_window,name:purchase_exception.action_purchase_exception_confirm
msgid "Outstanding exceptions to manage"
msgstr "Izuzetci na čekanju za upravljanje"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__related_model_id
msgid "Purchase"
msgstr "Nabavke"
#. module: purchase_exception
#: model:ir.actions.act_window,name:purchase_exception.action_purchase_test_tree
#: model:ir.ui.menu,name:purchase_exception.menu_purchase_test
msgid "Purchase Exception Rules"
msgstr "Pravila izuzetaka nabavke"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_order
msgid "Purchase Order"
msgstr "Nalog za nabavu"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_order_line
msgid "Purchase Order Line"
msgstr "Stavka naloga za nabavu"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_exception_confirm
msgid "Purchase exception wizard"
msgstr "Čarobnjak izuzetaka nabavke"
#. module: purchase_exception
#: model:exception.rule,description:purchase_exception.pol_excep_qty_check
msgid "Purchase line quantity must be positive"
msgstr "Količina na nabavnoj liniji mora biti pozitivna"
#. module: purchase_exception
#: model:ir.model.fields.selection,name:purchase_exception.selection__exception_rule__model__purchase_order
msgid "Purchase order"
msgstr "Nabavni nalog"
#. module: purchase_exception
#: model:ir.model.fields.selection,name:purchase_exception.selection__exception_rule__model__purchase_order_line
msgid "Purchase order line"
msgstr "Linija nabavnog naloga"
#. module: purchase_exception
#: model:ir.actions.server,name:purchase_exception.ir_cron_test_po_order_except_ir_actions_server
#: model:ir.cron,cron_name:purchase_exception.ir_cron_test_po_order_except
msgid "Purchase: Test Draft Orders Exception"
msgstr "Nabavka: Test izuzetka nacrta naloga"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_exception_rule__purchase_ids
msgid "Purchases"
msgstr "Nabavke"
#. module: purchase_exception
#: model:exception.rule,name:purchase_exception.pol_excep_qty_check
msgid "Quantity not positive"
msgstr "Količina nije pozitivna"

View file

@ -0,0 +1,181 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_exception
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-02-21 14:26+0000\n"
"PO-Revision-Date: 2023-07-20 18:09+0000\n"
"Last-Translator: Ivorra78 <informatica@totmaterial.es>\n"
"Language-Team: \n"
"Language: es\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: purchase_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
msgid "<strong>There are exceptions blocking this Purchase Order:</strong>"
msgstr "<strong>Hay excepciones que bloquean este Pedido:</strong>"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_exception_rule__model
msgid "Apply on"
msgstr "Aplicar en"
#. module: purchase_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_purchase_order_filter
msgid "Blocked in Draft"
msgstr "Bloqueado en borrador"
#. module: purchase_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
msgid ""
"Click here to be able to confirm this Agreement regardless of the exceptions."
msgstr ""
"Haga clic aquí para poder confirmar este Acuerdo independientemente de las "
"excepciones."
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__create_date
msgid "Created on"
msgstr "Creado en"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__display_name
msgid "Display Name"
msgstr "Nombre"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_exception_rule
msgid "Exception Rule"
msgstr "Regla de excepción"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__exception_ids
msgid "Exceptions"
msgstr "Excepciones"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__exceptions_summary
msgid "Exceptions Summary"
msgstr "Resumen de excepciones"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__exception_ids
msgid "Exceptions to resolve"
msgstr "Excepciones a resolver"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__id
msgid "ID"
msgstr "ID (identificación)"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__ignore
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__ignore_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order_line__ignore_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
msgid "Ignore Exceptions"
msgstr "Ignorar excepciones"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm____last_update
msgid "Last Modified on"
msgstr "Última modificación el"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__write_uid
msgid "Last Updated by"
msgstr "Última actualización por"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__write_date
msgid "Last Updated on"
msgstr "Última actualización el"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__main_exception_id
msgid "Main Exception"
msgstr "Excepción principal"
#. module: purchase_exception
#: model:exception.rule,description:purchase_exception.po_excep_no_email
msgid "No Email for Vendor"
msgstr "no hay correo electrónico para el vendedor"
#. module: purchase_exception
#: model:exception.rule,name:purchase_exception.po_excep_no_email
msgid "No email on vendor"
msgstr "No hay correo electrónico sobre el vendedor"
#. module: purchase_exception
#: model:ir.actions.act_window,name:purchase_exception.action_purchase_exception_confirm
msgid "Outstanding exceptions to manage"
msgstr "Excepciones pendientes para administrar"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__related_model_id
msgid "Purchase"
msgstr "Compra"
#. module: purchase_exception
#: model:ir.actions.act_window,name:purchase_exception.action_purchase_test_tree
#: model:ir.ui.menu,name:purchase_exception.menu_purchase_test
msgid "Purchase Exception Rules"
msgstr "Reglas de excepción de compra"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_order
msgid "Purchase Order"
msgstr "Pedido de compra"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_order_line
msgid "Purchase Order Line"
msgstr "Línea de pedido de compra"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_exception_confirm
msgid "Purchase exception wizard"
msgstr "Asistente para excepciones de compra"
#. module: purchase_exception
#: model:exception.rule,description:purchase_exception.pol_excep_qty_check
msgid "Purchase line quantity must be positive"
msgstr "La cantidad de la línea de compra debe ser positiva"
#. module: purchase_exception
#: model:ir.model.fields.selection,name:purchase_exception.selection__exception_rule__model__purchase_order
msgid "Purchase order"
msgstr "Pedido de compra"
#. module: purchase_exception
#: model:ir.model.fields.selection,name:purchase_exception.selection__exception_rule__model__purchase_order_line
msgid "Purchase order line"
msgstr "Línea de pedido de compra"
#. module: purchase_exception
#: model:ir.actions.server,name:purchase_exception.ir_cron_test_po_order_except_ir_actions_server
#: model:ir.cron,cron_name:purchase_exception.ir_cron_test_po_order_except
msgid "Purchase: Test Draft Orders Exception"
msgstr "Compra: Excepción de borradores de órdenes de prueba"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_exception_rule__purchase_ids
msgid "Purchases"
msgstr "Compras"
#. module: purchase_exception
#: model:exception.rule,name:purchase_exception.pol_excep_qty_check
msgid "Quantity not positive"
msgstr "Cantidad no positiva"

View file

@ -0,0 +1,197 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_exception
#
# Translators:
# Quentin THEURET <odoo@kerpeo.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 11.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-02-23 17:50+0000\n"
"PO-Revision-Date: 2024-12-31 13:06+0000\n"
"Last-Translator: samibc2c <sami.bouzidi@camptocamp.com>\n"
"Language-Team: French (https://www.transifex.com/oca/teams/23907/fr/)\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_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
msgid "<strong>There are exceptions blocking this Purchase Order:</strong>"
msgstr "<strong>Des exceptions bloquent cet achat:</strong>"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_exception_rule__model
msgid "Apply on"
msgstr "Appliquer sur"
#. module: purchase_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_purchase_order_filter
msgid "Blocked in Draft"
msgstr "Bloquée en brouillon"
#. module: purchase_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
msgid ""
"Click here to be able to confirm this Agreement regardless of the exceptions."
msgstr "Cliquez ici pour confirmer, quelles que soient les exceptions."
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__create_uid
msgid "Created by"
msgstr "Créé par"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__create_date
msgid "Created on"
msgstr "Créé le"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__display_name
msgid "Display Name"
msgstr "Nom affiché"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_exception_rule
msgid "Exception Rule"
msgstr "Règles d'exception"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__exception_ids
msgid "Exceptions"
msgstr "Exceptions"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__exceptions_summary
msgid "Exceptions Summary"
msgstr "Résumé des axceptions"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__exception_ids
msgid "Exceptions to resolve"
msgstr "Exceptions à résoudre"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__id
msgid "ID"
msgstr "ID"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__ignore
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__ignore_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order_line__ignore_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
msgid "Ignore Exceptions"
msgstr "Ignorer les exceptions"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm____last_update
msgid "Last Modified on"
msgstr "Dernière modification le"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__write_uid
msgid "Last Updated by"
msgstr "Dernière mise à jour par"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__write_date
msgid "Last Updated on"
msgstr "Dernière mise à jour le"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__main_exception_id
msgid "Main Exception"
msgstr "Exception principale"
#. module: purchase_exception
#: model:exception.rule,description:purchase_exception.po_excep_no_email
msgid "No Email for Vendor"
msgstr "Pas de courriel pour le fournisseur"
#. module: purchase_exception
#: model:exception.rule,name:purchase_exception.po_excep_no_email
msgid "No email on vendor"
msgstr "Pas de courriel pour le fournisseur"
#. module: purchase_exception
#: model:ir.actions.act_window,name:purchase_exception.action_purchase_exception_confirm
msgid "Outstanding exceptions to manage"
msgstr "Exceptions non résolue à traiter"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__related_model_id
msgid "Purchase"
msgstr "Achat"
#. module: purchase_exception
#: model:ir.actions.act_window,name:purchase_exception.action_purchase_test_tree
#: model:ir.ui.menu,name:purchase_exception.menu_purchase_test
msgid "Purchase Exception Rules"
msgstr "Règles d'exception des achats"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_order
msgid "Purchase Order"
msgstr "Commande"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_order_line
msgid "Purchase Order Line"
msgstr "Ligne de commande d'achat"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_exception_confirm
msgid "Purchase exception wizard"
msgstr ""
#. module: purchase_exception
#: model:exception.rule,description:purchase_exception.pol_excep_qty_check
msgid "Purchase line quantity must be positive"
msgstr "La quantité sur la ligne doit être positive"
#. module: purchase_exception
#: model:ir.model.fields.selection,name:purchase_exception.selection__exception_rule__model__purchase_order
msgid "Purchase order"
msgstr "Commande d'achat"
#. module: purchase_exception
#: model:ir.model.fields.selection,name:purchase_exception.selection__exception_rule__model__purchase_order_line
msgid "Purchase order line"
msgstr "Ligne de commande d'achat"
#. module: purchase_exception
#: model:ir.actions.server,name:purchase_exception.ir_cron_test_po_order_except_ir_actions_server
#: model:ir.cron,cron_name:purchase_exception.ir_cron_test_po_order_except
msgid "Purchase: Test Draft Orders Exception"
msgstr "Achat : Test des exceptions des commandes en brouillon"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_exception_rule__purchase_ids
msgid "Purchases"
msgstr "Achat"
#. module: purchase_exception
#: model:exception.rule,name:purchase_exception.pol_excep_qty_check
msgid "Quantity not positive"
msgstr "Quantité non positive"
#~ msgid ""
#~ "You have an outstanding\n"
#~ " exception to manage:"
#~ msgstr ""
#~ "Vous avez une exception\n"
#~ " non résolue à traiter :"
#~ msgid "Quantity not negative"
#~ msgstr "Quantité non négative"
#~ msgid "purchase.exception.confirm"
#~ msgstr "purchase.exception.confirm"
#~ msgid "Rule Group"
#~ msgstr "Groupe de règle"

View file

@ -0,0 +1,183 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_exception
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-12-22 19:33+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: purchase_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
msgid "<strong>There are exceptions blocking this Purchase Order:</strong>"
msgstr ""
"<strong>Ci sono delle eccezioni che bloccano questo ordine di "
"acquisto:</strong>"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_exception_rule__model
msgid "Apply on"
msgstr "Applica a"
#. module: purchase_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_purchase_order_filter
msgid "Blocked in Draft"
msgstr "Bloccati in bozza"
#. module: purchase_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
msgid ""
"Click here to be able to confirm this Agreement regardless of the "
"exceptions."
msgstr ""
"Fare clic qui per poter confermare questo accordo indipendentemente dalle "
"eccezioni."
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__create_uid
msgid "Created by"
msgstr "Creato da"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__create_date
msgid "Created on"
msgstr "Creato il"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_exception_rule
msgid "Exception Rule"
msgstr "Regola eccezione"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__exception_ids
msgid "Exceptions"
msgstr "Eccezioni"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__exceptions_summary
msgid "Exceptions Summary"
msgstr "Riepilogo eccezioni"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__exception_ids
msgid "Exceptions to resolve"
msgstr "Eccezioni da risolvere"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__id
msgid "ID"
msgstr "ID"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__ignore
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__ignore_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order_line__ignore_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
msgid "Ignore Exceptions"
msgstr "Ignora eccezioni"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento di"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento il"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__main_exception_id
msgid "Main Exception"
msgstr "Eccezione principale"
#. module: purchase_exception
#: model:exception.rule,description:purchase_exception.po_excep_no_email
msgid "No Email for Vendor"
msgstr "Nessuna e-mail per il venditore"
#. module: purchase_exception
#: model:exception.rule,name:purchase_exception.po_excep_no_email
msgid "No email on vendor"
msgstr "Nessuna e-mail nel venditore"
#. module: purchase_exception
#: model:ir.actions.act_window,name:purchase_exception.action_purchase_exception_confirm
msgid "Outstanding exceptions to manage"
msgstr "Eccezione rilevante da gestire"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__related_model_id
msgid "Purchase"
msgstr "Acquisto"
#. module: purchase_exception
#: model:ir.actions.act_window,name:purchase_exception.action_purchase_test_tree
#: model:ir.ui.menu,name:purchase_exception.menu_purchase_test
msgid "Purchase Exception Rules"
msgstr "Regole eccezione acquisto"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_order
msgid "Purchase Order"
msgstr "Ordine di acquisto"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_order_line
msgid "Purchase Order Line"
msgstr "Riga ordine di acquisto"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_exception_confirm
msgid "Purchase exception wizard"
msgstr "Procedura guidata eccezione di acquisto"
#. module: purchase_exception
#: model:exception.rule,description:purchase_exception.pol_excep_qty_check
msgid "Purchase line quantity must be positive"
msgstr "La quantità della riga acquisto deve essere positiva"
#. module: purchase_exception
#: model:ir.model.fields.selection,name:purchase_exception.selection__exception_rule__model__purchase_order
msgid "Purchase order"
msgstr "Ordine di acquisto"
#. module: purchase_exception
#: model:ir.model.fields.selection,name:purchase_exception.selection__exception_rule__model__purchase_order_line
msgid "Purchase order line"
msgstr "Riga ordine di acquisto"
#. module: purchase_exception
#: model:ir.actions.server,name:purchase_exception.ir_cron_test_po_order_except_ir_actions_server
#: model:ir.cron,cron_name:purchase_exception.ir_cron_test_po_order_except
msgid "Purchase: Test Draft Orders Exception"
msgstr "Acquisto: test eccezione ordini bozza"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_exception_rule__purchase_ids
msgid "Purchases"
msgstr "Acquisti"
#. module: purchase_exception
#: model:exception.rule,name:purchase_exception.pol_excep_qty_check
msgid "Quantity not positive"
msgstr "Quantità non positiva"

View file

@ -0,0 +1,213 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_exception
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2025-04-08 16:23+0000\n"
"Last-Translator: marcos-mendez <mendez.foto@gmail.com>\n"
"Language-Team: none\n"
"Language: pt_BR\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.10.4\n"
#. module: purchase_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
#, fuzzy
msgid "<strong>There are exceptions blocking this Purchase Order:</strong>"
msgstr ""
"[PT] <strong>There are exceptions blocking this Purchase Order:</strong>"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_exception_rule__model
#, fuzzy
msgid "Apply on"
msgstr "Aplicar em"
#. module: purchase_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_purchase_order_filter
#, fuzzy
msgid "Blocked in Draft"
msgstr "Bloqueado no Rascunho"
#. module: purchase_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
#, fuzzy
msgid ""
"Click here to be able to confirm this Agreement regardless of the "
"exceptions."
msgstr ""
"[PT] Click here to be able to confirm this Agreement regardless of the "
"exceptions."
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__create_uid
#, fuzzy
msgid "Created by"
msgstr "[PT] Created by"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__create_date
#, fuzzy
msgid "Created on"
msgstr "[PT] Created on"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__display_name
#, fuzzy
msgid "Display Name"
msgstr "[PT] Display Name"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_exception_rule
#, fuzzy
msgid "Exception Rule"
msgstr "Regra de Exceção"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__exception_ids
#, fuzzy
msgid "Exceptions"
msgstr "Exceções"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__exceptions_summary
#, fuzzy
msgid "Exceptions Summary"
msgstr "[PT] Exceptions Summary"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__exception_ids
#, fuzzy
msgid "Exceptions to resolve"
msgstr "[PT] Exceptions to resolve"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__id
#, fuzzy
msgid "ID"
msgstr "[PT] ID"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__ignore
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__ignore_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order_line__ignore_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
#, fuzzy
msgid "Ignore Exceptions"
msgstr "[PT] Ignore Exceptions"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm____last_update
#, fuzzy
msgid "Last Modified on"
msgstr "[PT] Last Modified on"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__write_uid
#, fuzzy
msgid "Last Updated by"
msgstr "[PT] Last Updated by"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__write_date
#, fuzzy
msgid "Last Updated on"
msgstr "[PT] Last Updated on"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__main_exception_id
#, fuzzy
msgid "Main Exception"
msgstr "[PT] Main Exception"
#. module: purchase_exception
#: model:exception.rule,description:purchase_exception.po_excep_no_email
#, fuzzy
msgid "No Email for Vendor"
msgstr "[PT] No Email for Vendor"
#. module: purchase_exception
#: model:exception.rule,name:purchase_exception.po_excep_no_email
#, fuzzy
msgid "No email on vendor"
msgstr "[PT] No email on vendor"
#. module: purchase_exception
#: model:ir.actions.act_window,name:purchase_exception.action_purchase_exception_confirm
#, fuzzy
msgid "Outstanding exceptions to manage"
msgstr "[PT] Outstanding exceptions to manage"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__related_model_id
#, fuzzy
msgid "Purchase"
msgstr "Compra"
#. module: purchase_exception
#: model:ir.actions.act_window,name:purchase_exception.action_purchase_test_tree
#: model:ir.ui.menu,name:purchase_exception.menu_purchase_test
#, fuzzy
msgid "Purchase Exception Rules"
msgstr "[PT] Purchase Exception Rules"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_order
#, fuzzy
msgid "Purchase Order"
msgstr "Pedido de Compra"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_order_line
#, fuzzy
msgid "Purchase Order Line"
msgstr "[PT] Purchase Order Line"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_exception_confirm
#, fuzzy
msgid "Purchase exception wizard"
msgstr "[PT] Purchase exception wizard"
#. module: purchase_exception
#: model:exception.rule,description:purchase_exception.pol_excep_qty_check
#, fuzzy
msgid "Purchase line quantity must be positive"
msgstr "[PT] Purchase line quantity must be positive"
#. module: purchase_exception
#: model:ir.model.fields.selection,name:purchase_exception.selection__exception_rule__model__purchase_order
#, fuzzy
msgid "Purchase order"
msgstr "[PT] Purchase order"
#. module: purchase_exception
#: model:ir.model.fields.selection,name:purchase_exception.selection__exception_rule__model__purchase_order_line
#, fuzzy
msgid "Purchase order line"
msgstr "[PT] Purchase order line"
#. module: purchase_exception
#: model:ir.actions.server,name:purchase_exception.ir_cron_test_po_order_except_ir_actions_server
#: model:ir.cron,cron_name:purchase_exception.ir_cron_test_po_order_except
#, fuzzy
msgid "Purchase: Test Draft Orders Exception"
msgstr "[PT] Purchase: Test Draft Orders Exception"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_exception_rule__purchase_ids
#, fuzzy
msgid "Purchases"
msgstr "[PT] Purchases"
#. module: purchase_exception
#: model:exception.rule,name:purchase_exception.pol_excep_qty_check
#, fuzzy
msgid "Quantity not positive"
msgstr "[PT] Quantity not positive"

View file

@ -0,0 +1,176 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_exception
#
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_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
msgid "<strong>There are exceptions blocking this Purchase Order:</strong>"
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_exception_rule__model
msgid "Apply on"
msgstr ""
#. module: purchase_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_purchase_order_filter
msgid "Blocked in Draft"
msgstr ""
#. module: purchase_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
msgid ""
"Click here to be able to confirm this Agreement regardless of the "
"exceptions."
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__create_uid
msgid "Created by"
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__create_date
msgid "Created on"
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__display_name
msgid "Display Name"
msgstr ""
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_exception_rule
msgid "Exception Rule"
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__exception_ids
msgid "Exceptions"
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__exceptions_summary
msgid "Exceptions Summary"
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__exception_ids
msgid "Exceptions to resolve"
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__id
msgid "ID"
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__ignore
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__ignore_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order_line__ignore_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
msgid "Ignore Exceptions"
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm____last_update
msgid "Last Modified on"
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__write_uid
msgid "Last Updated by"
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__write_date
msgid "Last Updated on"
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__main_exception_id
msgid "Main Exception"
msgstr ""
#. module: purchase_exception
#: model:exception.rule,description:purchase_exception.po_excep_no_email
msgid "No Email for Vendor"
msgstr ""
#. module: purchase_exception
#: model:exception.rule,name:purchase_exception.po_excep_no_email
msgid "No email on vendor"
msgstr ""
#. module: purchase_exception
#: model:ir.actions.act_window,name:purchase_exception.action_purchase_exception_confirm
msgid "Outstanding exceptions to manage"
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__related_model_id
msgid "Purchase"
msgstr ""
#. module: purchase_exception
#: model:ir.actions.act_window,name:purchase_exception.action_purchase_test_tree
#: model:ir.ui.menu,name:purchase_exception.menu_purchase_test
msgid "Purchase Exception Rules"
msgstr ""
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_order
msgid "Purchase Order"
msgstr ""
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_order_line
msgid "Purchase Order Line"
msgstr ""
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_exception_confirm
msgid "Purchase exception wizard"
msgstr ""
#. module: purchase_exception
#: model:exception.rule,description:purchase_exception.pol_excep_qty_check
msgid "Purchase line quantity must be positive"
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields.selection,name:purchase_exception.selection__exception_rule__model__purchase_order
msgid "Purchase order"
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields.selection,name:purchase_exception.selection__exception_rule__model__purchase_order_line
msgid "Purchase order line"
msgstr ""
#. module: purchase_exception
#: model:ir.actions.server,name:purchase_exception.ir_cron_test_po_order_except_ir_actions_server
#: model:ir.cron,cron_name:purchase_exception.ir_cron_test_po_order_except
msgid "Purchase: Test Draft Orders Exception"
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_exception_rule__purchase_ids
msgid "Purchases"
msgstr ""
#. module: purchase_exception
#: model:exception.rule,name:purchase_exception.pol_excep_qty_check
msgid "Quantity not positive"
msgstr ""

View file

@ -0,0 +1,191 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_exception
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 12.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2019-09-02 14:40+0000\n"
"Last-Translator: 黎伟杰 <674416404@qq.com>\n"
"Language-Team: none\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 3.8\n"
#. module: purchase_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
msgid "<strong>There are exceptions blocking this Purchase Order:</strong>"
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_exception_rule__model
msgid "Apply on"
msgstr "应用于"
#. module: purchase_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_purchase_order_filter
msgid "Blocked in Draft"
msgstr "在草稿中阻止"
#. module: purchase_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
msgid ""
"Click here to be able to confirm this Agreement regardless of the exceptions."
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__create_uid
msgid "Created by"
msgstr "创建者"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__create_date
msgid "Created on"
msgstr "创建时间"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__display_name
msgid "Display Name"
msgstr "显示名称"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_exception_rule
msgid "Exception Rule"
msgstr "异常规则"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__exception_ids
msgid "Exceptions"
msgstr "异常"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__exceptions_summary
msgid "Exceptions Summary"
msgstr ""
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__exception_ids
msgid "Exceptions to resolve"
msgstr "解决的异常情况"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__id
msgid "ID"
msgstr "ID"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__ignore
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__ignore_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order_line__ignore_exception
#: model_terms:ir.ui.view,arch_db:purchase_exception.view_order_form
msgid "Ignore Exceptions"
msgstr "忽略异常"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm____last_update
msgid "Last Modified on"
msgstr "最后修改时间"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__write_uid
msgid "Last Updated by"
msgstr "最后更新者"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__write_date
msgid "Last Updated on"
msgstr "最后更新时间"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_order__main_exception_id
msgid "Main Exception"
msgstr ""
#. module: purchase_exception
#: model:exception.rule,description:purchase_exception.po_excep_no_email
msgid "No Email for Vendor"
msgstr "供应商没有Email"
#. module: purchase_exception
#: model:exception.rule,name:purchase_exception.po_excep_no_email
msgid "No email on vendor"
msgstr "供应商没有Email"
#. module: purchase_exception
#: model:ir.actions.act_window,name:purchase_exception.action_purchase_exception_confirm
msgid "Outstanding exceptions to manage"
msgstr "管理异常的情况"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_purchase_exception_confirm__related_model_id
msgid "Purchase"
msgstr "采购"
#. module: purchase_exception
#: model:ir.actions.act_window,name:purchase_exception.action_purchase_test_tree
#: model:ir.ui.menu,name:purchase_exception.menu_purchase_test
msgid "Purchase Exception Rules"
msgstr "采购异常规则"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_order
msgid "Purchase Order"
msgstr "采购订单"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_order_line
msgid "Purchase Order Line"
msgstr "采购订单行"
#. module: purchase_exception
#: model:ir.model,name:purchase_exception.model_purchase_exception_confirm
msgid "Purchase exception wizard"
msgstr ""
#. module: purchase_exception
#: model:exception.rule,description:purchase_exception.pol_excep_qty_check
msgid "Purchase line quantity must be positive"
msgstr "采购行数量必须为正数"
#. module: purchase_exception
#: model:ir.model.fields.selection,name:purchase_exception.selection__exception_rule__model__purchase_order
msgid "Purchase order"
msgstr "采购订单"
#. module: purchase_exception
#: model:ir.model.fields.selection,name:purchase_exception.selection__exception_rule__model__purchase_order_line
msgid "Purchase order line"
msgstr "采购订单行"
#. module: purchase_exception
#: model:ir.actions.server,name:purchase_exception.ir_cron_test_po_order_except_ir_actions_server
#: model:ir.cron,cron_name:purchase_exception.ir_cron_test_po_order_except
msgid "Purchase: Test Draft Orders Exception"
msgstr "购买:测试草稿订单异常"
#. module: purchase_exception
#: model:ir.model.fields,field_description:purchase_exception.field_exception_rule__purchase_ids
msgid "Purchases"
msgstr "采购"
#. module: purchase_exception
#: model:exception.rule,name:purchase_exception.pol_excep_qty_check
msgid "Quantity not positive"
msgstr ""
#~ msgid ""
#~ "You have an outstanding\n"
#~ " exception to manage:"
#~ msgstr ""
#~ "你有一个突出的\n"
#~ " 异常需要管理:"
#~ msgid "Quantity not negative"
#~ msgstr "数量不是负数"
#~ msgid "purchase.exception.confirm"
#~ msgstr "purchase.exception.confirm"

View file

@ -0,0 +1,3 @@
from . import exception_rule
from . import purchase
from . import purchase_line

View file

@ -0,0 +1,19 @@
# Copyright 2017 Akretion (http://www.akretion.com)
# Copyright 2020 Camptocamp SA
# Mourad EL HADJ MIMOUNE <mourad.elhadj.mimoune@akretion.com>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import fields, models
class ExceptionRule(models.Model):
_inherit = "exception.rule"
purchase_ids = fields.Many2many(comodel_name="purchase.order", string="Purchases")
model = fields.Selection(
selection_add=[
("purchase.order", "Purchase order"),
("purchase.order.line", "Purchase order line"),
],
ondelete={"purchase.order": "cascade", "purchase.order.line": "cascade"},
)

View file

@ -0,0 +1,75 @@
# Copyright 2017 Akretion (http://www.akretion.com)
# Copyright 2020 Camptocamp SA
# Mourad EL HADJ MIMOUNE <mourad.elhadj.mimoune@akretion.com>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import api, models
class PurchaseOrder(models.Model):
_inherit = ["purchase.order", "base.exception"]
_name = "purchase.order"
_order = "main_exception_id asc, date_order desc, name desc"
@api.model
def test_all_draft_orders(self):
order_set = self.search([("state", "=", "draft")])
order_set.detect_exceptions()
return True
@api.model
def _reverse_field(self):
return "purchase_ids"
def detect_exceptions(self):
all_exceptions = super().detect_exceptions()
lines = self.mapped("order_line")
all_exceptions += lines.detect_exceptions()
return all_exceptions
def _fields_trigger_check_exception(self):
return ["ignore_exception", "order_line", "state"]
def _check_purchase_check_exception(self, vals):
check_exceptions = any(
field in vals for field in self._fields_trigger_check_exception()
)
if check_exceptions:
self.purchase_check_exception()
def write(self, vals):
result = super().write(vals)
self._check_purchase_check_exception(vals)
return result
def purchase_check_exception(self):
orders = self.filtered(lambda s: s.state == "purchase")
if orders:
orders._check_exception()
def button_unlock(self):
return super(
PurchaseOrder, self.with_context(check_exception=False)
).button_unlock()
def button_confirm(self):
if self.detect_exceptions() and not self.ignore_exception:
return self._popup_exceptions()
return super().button_confirm()
def button_draft(self):
res = super().button_draft()
for order in self:
order.exception_ids = False
order.main_exception_id = False
order.ignore_exception = False
return res
def _purchase_get_lines(self):
self.ensure_one()
return self.order_line
@api.model
def _get_popup_action(self):
action = self.env.ref("purchase_exception.action_purchase_exception_confirm")
return action

View file

@ -0,0 +1,26 @@
# Copyright 2017 Akretion (http://www.akretion.com)
# Copyright 2020 Camptocamp SA
# Mourad EL HADJ MIMOUNE <mourad.elhadj.mimoune@akretion.com>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models
class PurchaseOrderLine(models.Model):
_inherit = ["purchase.order.line", "base.exception.method"]
_name = "purchase.order.line"
ignore_exception = fields.Boolean(
related="order_id.ignore_exception", store=True, string="Ignore Exceptions"
)
def _get_main_records(self):
return self.mapped("order_id")
@api.model
def _reverse_field(self):
return "purchase_ids"
def _detect_exceptions(self, rule):
records = super()._detect_exceptions(rule)
return records.mapped("order_id")

View file

@ -0,0 +1,3 @@
* Mourad EL HADJ MIMOUNE <mourad.elhadj.mimoune@akretion.com>
* Sudhir Arya <sudhir@erpharbor.com>
* Kitti U. <kittiu@ecosoft.co.th> (migration to v14)

View file

@ -0,0 +1,6 @@
This module allows you attach several customizable exceptions to your
purchase order in a way that you can filter orders by exceptions type and fix them.
This is especially useful in an scenario for mass purchases order import, because it's likely some orders have
errors when you import them (like product not found in Odoo, wrong line
format etc.)

View file

@ -0,0 +1,2 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_purchase_exception_confirm,access_purchase_exception_confirm,model_purchase_exception_confirm,base.group_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_exception_confirm access_purchase_exception_confirm model_purchase_exception_confirm base.group_user 1 1 1 1

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

View file

@ -0,0 +1,426 @@
<!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 Exception</title>
<style type="text/css">
/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
:Copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
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: grey; } /* 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 {
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-exception">
<h1 class="title">Purchase Exception</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:97f88239a27ed104d1494d8aae2f9d907a644d49f44d9a745cdf6f4191e0acb5
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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_exception"><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_exception"><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>This module allows you attach several customizable exceptions to your
purchase order in a way that you can filter orders by exceptions type and fix them.</p>
<p>This is especially useful in an scenario for mass purchases order import, because its likely some orders have
errors when you import them (like product not found in Odoo, wrong line
format etc.)</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-1">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-2">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-3">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-4">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-5">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-1">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_exception%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-2">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-3">Authors</a></h2>
<ul class="simple">
<li>Akretion</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-4">Contributors</a></h2>
<ul class="simple">
<li>Mourad EL HADJ MIMOUNE &lt;<a class="reference external" href="mailto:mourad.elhadj.mimoune&#64;akretion.com">mourad.elhadj.mimoune&#64;akretion.com</a>&gt;</li>
<li>Sudhir Arya &lt;<a class="reference external" href="mailto:sudhir&#64;erpharbor.com">sudhir&#64;erpharbor.com</a>&gt;</li>
<li>Kitti U. &lt;<a class="reference external" href="mailto:kittiu&#64;ecosoft.co.th">kittiu&#64;ecosoft.co.th</a>&gt; (migration to v14)</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-5">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_exception">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 @@
from . import test_purchase_exception

View file

@ -0,0 +1,163 @@
# Copyright 2017 Akretion (http://www.akretion.com)
# Copyright 2020 Camptocamp SA
# Mourad EL HADJ MIMOUNE <mourad.elhadj.mimoune@akretion.com>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from datetime import datetime
from odoo.exceptions import ValidationError
from odoo.tests.common import TransactionCase
from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT
class TestPurchaseException(TransactionCase):
@classmethod
def setUpClass(cls):
super().setUpClass()
# Useful models
cls.PurchaseOrder = cls.env["purchase.order"]
cls.PurchaseOrderLine = cls.env["purchase.order.line"]
cls.partner_id = cls.env.ref("base.res_partner_1")
cls.product_id_1 = cls.env.ref("product.product_product_6")
cls.product_id_2 = cls.env.ref("product.product_product_7")
cls.product_id_3 = cls.env.ref("product.product_product_7")
cls.date_planned = datetime.today().strftime(DEFAULT_SERVER_DATETIME_FORMAT)
cls.purchase_exception_confirm = cls.env["purchase.exception.confirm"]
cls.exception_noemail = cls.env.ref("purchase_exception.po_excep_no_email")
cls.exception_qtycheck = cls.env.ref("purchase_exception.pol_excep_qty_check")
cls.po_vals = {
"partner_id": cls.partner_id.id,
"order_line": [
(
0,
0,
{
"name": cls.product_id_1.name,
"product_id": cls.product_id_1.id,
"product_qty": 5.0,
"product_uom": cls.product_id_1.uom_po_id.id,
"price_unit": 500.0,
"date_planned": cls.date_planned,
},
),
(
0,
0,
{
"name": cls.product_id_2.name,
"product_id": cls.product_id_2.id,
"product_qty": 5.0,
"product_uom": cls.product_id_2.uom_po_id.id,
"price_unit": 250.0,
"date_planned": cls.date_planned,
},
),
],
}
cls.po_vals2 = {
"partner_id": cls.partner_id.id,
"order_line": [
(
0,
0,
{
"name": cls.product_id_3.name,
"product_id": cls.product_id_3.id,
"product_qty": -1.0,
"product_uom": cls.product_id_3.uom_po_id.id,
"price_unit": 20.0,
"date_planned": cls.date_planned,
},
),
],
}
def test_purchase_order_exception(self):
self.exception_noemail.active = True
self.exception_qtycheck.active = True
self.partner_id.email = False
self.po = self.PurchaseOrder.create(self.po_vals.copy())
# confirm quotation
self.po.button_confirm()
self.assertEqual(self.po.state, "draft")
# test all draft po
self.po2 = self.PurchaseOrder.create(self.po_vals.copy())
self.PurchaseOrder.test_all_draft_orders()
self.assertEqual(self.po2.state, "draft")
# Set ignore_exception flag (Done after ignore is selected at wizard)
self.po.ignore_exception = True
self.po.button_confirm()
self.assertEqual(self.po.state, "purchase")
# Add a order line to test after PO is confirmed
field_onchange = self.PurchaseOrder._onchange_spec()
self.assertEqual(field_onchange.get("order_line"), "1")
self.po3New = self.PurchaseOrder.new(self.po_vals.copy())
self.po3New.ignore_exception = True
self.po3New.state = "purchase"
self.po.write(
{
"order_line": [
(
0,
0,
{
"name": self.product_id_3.name,
"product_id": self.product_id_3.id,
"product_qty": 2,
"product_uom": self.product_id_3.uom_id.id,
"price_unit": 30,
"date_planned": self.date_planned,
},
)
]
}
)
# Set ignore exception True (Done manually by user)
self.po.ignore_exception = True
self.po.button_cancel()
self.po.button_draft()
self.assertEqual(self.po.state, "draft")
self.assertTrue(not self.po.ignore_exception)
self.po.button_confirm()
self.assertTrue(self.po.state, "to approve")
# Simulation the opening of the wizard purchase_exception_confirm and
# set ignore_exception to True
po_except_confirm = self.purchase_exception_confirm.with_context(
active_id=self.po.id,
active_ids=[self.po.id],
active_model=self.po._name,
).create({"ignore": True})
po_except_confirm.action_confirm()
def test_exception_qtycheck(self):
# No allow ignoring exceptions if the "is_blocking" field is checked
self.exception_qtycheck.active = True
self.exception_qtycheck.is_blocking = True
self.po = self.PurchaseOrder.create(self.po_vals2.copy())
po_except_confirm = self.purchase_exception_confirm.with_context(
**{
"active_id": self.po.id,
"active_ids": [self.po.id],
"active_model": self.po._name,
}
).create({"ignore": True})
po_except_confirm.exception_ids = self.exception_qtycheck
po_except_confirm.action_confirm()
def test_exception_no_validation_for_unlock(self):
self.partner_id.email = False
po = self.PurchaseOrder.create(self.po_vals.copy())
po.button_confirm()
self.assertEqual(po.state, "purchase")
po.button_done()
self.assertEqual(po.state, "done")
exception = self.env.ref("purchase_exception.po_excep_no_email")
exception.active = True
with self.assertRaises(ValidationError):
po.write({"state": "purchase"})
po.button_unlock()
self.assertEqual(po.state, "purchase")

View file

@ -0,0 +1,85 @@
<?xml version="1.0" ?>
<odoo>
<record id="action_purchase_test_tree" model="ir.actions.act_window">
<field name="name">Purchase Exception Rules</field>
<field name="res_model">exception.rule</field>
<field name="view_mode">tree,form</field>
<field name="view_id" ref="base_exception.view_exception_rule_tree" />
<field
name="domain"
>[('model', 'in', ['purchase.order', 'purchase.order.line'])]</field>
<field
name="context"
>{'active_test': False, 'default_model' : 'purchase.order'}</field>
</record>
<menuitem
action="action_purchase_test_tree"
id="menu_purchase_test"
parent="purchase.menu_purchase_config"
/>
<record id="view_order_form" model="ir.ui.view">
<field name="name">purchase_exception.view_order_form</field>
<field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase.purchase_order_form" />
<field name="arch" type="xml">
<sheet position="before">
<div
class="alert alert-danger"
role="alert"
style="margin-bottom:0px;"
attrs="{'invisible': [('exceptions_summary','=',False)]}"
>
<p>
<strong
>There are exceptions blocking this Purchase Order:</strong>
</p>
<field name="exceptions_summary" />
<button
name="action_ignore_exceptions"
type="object"
class="btn-danger"
string="Ignore Exceptions"
help="Click here to be able to confirm this Agreement regardless of the exceptions."
groups="base_exception.group_exception_rule_manager"
/>
</div>
</sheet>
<xpath expr="//field[@name='date_order']/.." position="inside">
<field
name="ignore_exception"
states="purchase"
groups='base_exception.group_exception_rule_manager'
/>
</xpath>
<xpath expr="//field[@name='company_id']" position="after">
<field name="exception_ids" widget="many2many_tags" readonly="True" />
</xpath>
</field>
</record>
<record id="view_order_tree" model="ir.ui.view">
<field name="name">purchase_exception.view_order_tree</field>
<field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase.purchase_order_tree" />
<field name="arch" type="xml">
<field name="state" position="after">
<field name="main_exception_id" />
</field>
</field>
</record>
<record id="view_purchase_order_filter" model="ir.ui.view">
<field name="name">purchase_exception.view_purchases_order_filter</field>
<field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase.view_purchase_order_filter" />
<field name="arch" type="xml">
<filter name="activities_exception" position="after">
<separator orientation="vertical" />
<filter
icon="fa-exclamation-circle"
name="tofix"
string="Blocked in Draft"
domain="[('main_exception_id','!=',False)]"
/>
</filter>
</field>
</record>
</odoo>

View file

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

View file

@ -0,0 +1,25 @@
# Copyright 2017 Akretion (http://www.akretion.com)
# Copyright 2020 Camptocamp SA
# Mourad EL HADJ MIMOUNE <mourad.elhadj.mimoune@akretion.com>
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import fields, models
class PurchaseExceptionConfirm(models.TransientModel):
_name = "purchase.exception.confirm"
_description = "Purchase exception wizard"
_inherit = ["exception.rule.confirm"]
related_model_id = fields.Many2one("purchase.order", "Purchase")
def action_confirm(self):
self.ensure_one()
exceptions_blocking = self.exception_ids.filtered("is_blocking")
if self.ignore and not exceptions_blocking:
self.related_model_id.button_draft()
self.related_model_id.ignore_exception = True
self.related_model_id.button_confirm()
else:
self.related_model_id.ignore_exception = False
return super().action_confirm()

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="action_purchase_exception_confirm" model="ir.actions.act_window">
<field name="name">Outstanding exceptions to manage</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">purchase.exception.confirm</field>
<field name="view_mode">form</field>
<field name="view_id" ref="base_exception.view_exception_rule_confirm" />
<field name="target">new</field>
</record>
</odoo>

View file

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