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 Reqeust Exception
Odoo addon: purchase_request_exception
## Installation
```bash
pip install odoo-bringout-oca-purchase-workflow-purchase_request_exception
```
## Dependencies
This addon depends on:
- purchase_request
- base_exception
## Manifest Information
- **Name**: Purchase Reqeust Exception
- **Version**: 16.0.1.0.0
- **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_request_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_request_exception Module - purchase_request_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_request_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_request](../../odoo-bringout-oca-purchase-workflow-purchase_request)
- [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_request_exception or install in UI.

View file

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

View file

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

View file

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

View file

@ -0,0 +1,81 @@
==========================
Purchase Reqeust Exception
==========================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:42cf19a7548d97ff3f8a97027043da2ec9e2c04d87d7383833484acc967091c1
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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_request_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_request_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 request in a way that you can filter requests by exceptions type and fix them.
This is especially useful in an scenario for mass purchases requests 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_request_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
~~~~~~~
* Ecosoft
Contributors
~~~~~~~~~~~~
* Kitti U <kittiu@ecosoft.co.th>
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_request_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,20 @@
# Copyright 2021 Ecosoft (http://ecosoft.co.th)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
{
"name": "Purchase Reqeust Exception",
"summary": "Custom exceptions on purchase request",
"version": "16.0.1.0.0",
"category": "Generic Modules/Purchase",
"author": "Ecosoft, Odoo Community Association (OCA)",
"website": "https://github.com/OCA/purchase-workflow",
"depends": ["purchase_request", "base_exception"],
"license": "AGPL-3",
"data": [
"security/ir.model.access.csv",
"data/purchase_request_exception_data.xml",
"wizard/purchase_request_exception_confirm_view.xml",
"views/purchase_request_view.xml",
],
"installable": True,
}

View file

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<!-- Test Purchase Request Exceptions Scheduler-->
<record model="ir.cron" forcecreate="True" id="ir_cron_test_pr_request_except">
<field
name="name"
>Purchase Request: Test Draft Purchase Requests Exception</field>
<field name="model_id" ref="purchase_request.model_purchase_request" />
<field name="state">code</field>
<field name="code">model.test_all_draft_requests()</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="pr_excep_no_approver" model="exception.rule">
<field name="name">No approver</field>
<field name="description">No approver assigned for this request</field>
<field name="sequence">10</field>
<field name="model">purchase.request</field>
<field name="code">
if not self.assigned_to:
failed=True
</field>
<field name="active" eval="False" />
</record>
<record id="prl_excep_qty_check" model="exception.rule">
<field name="name">Quantity not positive</field>
<field
name="description"
>Purchase request line quantity must be positive</field>
<field name="sequence">20</field>
<field name="model">purchase.request.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,172 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_request_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_request_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_form
msgid "<strong>There are exceptions blocking this Purchase Order:</strong>"
msgstr "<strong>Postoje izuzeci koji blokiraju ovu narudžbenicu:</strong>"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_exception_rule__model
msgid "Apply on"
msgstr "Primjeni na"
#. module: purchase_request_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_search
msgid "Blocked in Draft"
msgstr "Blokirano u nacrtu"
#. module: purchase_request_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_form
msgid ""
"Click here to be able to confirm this Agreement regardless of the "
"exceptions."
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__create_uid
msgid "Created by"
msgstr "Kreirao"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__create_date
msgid "Created on"
msgstr "Kreirano"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__display_name
msgid "Display Name"
msgstr "Prikazani naziv"
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_exception_rule
msgid "Exception Rule"
msgstr "Pravilo izuzetka"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__exception_ids
msgid "Exceptions"
msgstr "Izuzeci"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__exceptions_summary
msgid "Exceptions Summary"
msgstr "Opis"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__exception_ids
msgid "Exceptions to resolve"
msgstr "Izuzeci za riješiti"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__id
msgid "ID"
msgstr "ID"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__ignore_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__ignore
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_line__ignore_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_form
msgid "Ignore Exceptions"
msgstr "Ignoriraj izuzetke"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm____last_update
msgid "Last Modified on"
msgstr "Zadnje mijenjano"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__write_uid
msgid "Last Updated by"
msgstr "Zadnji ažurirao"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__write_date
msgid "Last Updated on"
msgstr "Zadnje ažurirano"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__main_exception_id
msgid "Main Exception"
msgstr "Glavni izuzetak"
#. module: purchase_request_exception
#: model:exception.rule,name:purchase_request_exception.pr_excep_no_approver
msgid "No approver"
msgstr "Nema odobravatelja"
#. module: purchase_request_exception
#: model:exception.rule,description:purchase_request_exception.pr_excep_no_approver
msgid "No approver assigned for this request"
msgstr "Nije dodijeljen odobravatelj za ovaj zahtjev"
#. module: purchase_request_exception
#: model:ir.actions.act_window,name:purchase_request_exception.action_purchase_request_exception_confirm
msgid "Outstanding exceptions to manage"
msgstr "Neriješeni izuzeci za upravljanje"
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_purchase_request
msgid "Purchase Request"
msgstr "Zahtjev za nabavu"
#. module: purchase_request_exception
#: model:ir.actions.act_window,name:purchase_request_exception.action_purchase_request_test_tree
#: model:ir.ui.menu,name:purchase_request_exception.menu_purchase_request_test
msgid "Purchase Request Exception Rules"
msgstr "Pravila izuzetaka za zahtjeve za nabavku"
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_purchase_request_line
msgid "Purchase Request Line"
msgstr "Stavka zahtjeva za nabavu"
#. module: purchase_request_exception
#: model:ir.actions.server,name:purchase_request_exception.ir_cron_test_pr_request_except_ir_actions_server
#: model:ir.cron,cron_name:purchase_request_exception.ir_cron_test_pr_request_except
msgid "Purchase Request: Test Draft Purchase Requests Exception"
msgstr "Zahtjev za nabavku: Testiranje izuzetaka za nacrte zahtjeva za nabavku"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_exception_rule__purchase_request_ids
msgid "Purchase Requests"
msgstr "Zahtjevi za nabavom"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__related_model_id
#: model:ir.model.fields.selection,name:purchase_request_exception.selection__exception_rule__model__purchase_request
msgid "Purchase request"
msgstr "Zahtjev za nabavku"
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_purchase_request_exception_confirm
msgid "Purchase request exception wizard"
msgstr "Čarobnjak za izuzetke zahtjeva za nabavku"
#. module: purchase_request_exception
#: model:ir.model.fields.selection,name:purchase_request_exception.selection__exception_rule__model__purchase_request_line
msgid "Purchase request line"
msgstr "Stavka zahtjeva za nabavku"
#. module: purchase_request_exception
#: model:exception.rule,description:purchase_request_exception.prl_excep_qty_check
msgid "Purchase request line quantity must be positive"
msgstr "Količina stavke zahtjeva za nabavku mora biti pozitivna"
#. module: purchase_request_exception
#: model:exception.rule,name:purchase_request_exception.prl_excep_qty_check
msgid "Quantity not positive"
msgstr "Količina nije pozitivna"

View file

@ -0,0 +1,177 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_request_exception
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 15.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2023-07-20 10:10+0000\n"
"Last-Translator: Ivorra78 <informatica@totmaterial.es>\n"
"Language-Team: none\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_request_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_form
msgid "<strong>There are exceptions blocking this Purchase Order:</strong>"
msgstr "<strong>Hay excepciones que bloquean este Pedido:</strong>"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_exception_rule__model
msgid "Apply on"
msgstr "Aplicar en"
#. module: purchase_request_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_search
msgid "Blocked in Draft"
msgstr "Bloqueado en Borrador"
#. module: purchase_request_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_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_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__create_uid
msgid "Created by"
msgstr "Creado por"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__create_date
msgid "Created on"
msgstr "creado el"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__display_name
msgid "Display Name"
msgstr "nombre a mostrar"
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_exception_rule
msgid "Exception Rule"
msgstr "Regla de excepción"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__exception_ids
msgid "Exceptions"
msgstr "Excepciones"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__exceptions_summary
msgid "Exceptions Summary"
msgstr "Resumen de Excepciones"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__exception_ids
msgid "Exceptions to resolve"
msgstr "Excepciones a resolver"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__id
msgid "ID"
msgstr "ID (identificación)"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__ignore_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__ignore
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_line__ignore_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_form
msgid "Ignore Exceptions"
msgstr "Ignorar Excepciones"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm____last_update
msgid "Last Modified on"
msgstr "modificado por última vez el"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__write_uid
msgid "Last Updated by"
msgstr "actualizado por última vez por"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__write_date
msgid "Last Updated on"
msgstr "Última Actualización el"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__main_exception_id
msgid "Main Exception"
msgstr "excepción principal"
#. module: purchase_request_exception
#: model:exception.rule,name:purchase_request_exception.pr_excep_no_approver
msgid "No approver"
msgstr "Sin autorizador"
#. module: purchase_request_exception
#: model:exception.rule,description:purchase_request_exception.pr_excep_no_approver
msgid "No approver assigned for this request"
msgstr "No hay aprobador asignado para esta solicitud"
#. module: purchase_request_exception
#: model:ir.actions.act_window,name:purchase_request_exception.action_purchase_request_exception_confirm
msgid "Outstanding exceptions to manage"
msgstr "Excepciones pendientes de gestión"
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_purchase_request
msgid "Purchase Request"
msgstr "solicitud de compra"
#. module: purchase_request_exception
#: model:ir.actions.act_window,name:purchase_request_exception.action_purchase_request_test_tree
#: model:ir.ui.menu,name:purchase_request_exception.menu_purchase_request_test
msgid "Purchase Request Exception Rules"
msgstr "Normas de excepción para las solicitudes de compra"
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_purchase_request_line
msgid "Purchase Request Line"
msgstr "Línea de solicitud de compra"
#. module: purchase_request_exception
#: model:ir.actions.server,name:purchase_request_exception.ir_cron_test_pr_request_except_ir_actions_server
#: model:ir.cron,cron_name:purchase_request_exception.ir_cron_test_pr_request_except
msgid "Purchase Request: Test Draft Purchase Requests Exception"
msgstr ""
"Solicitud de compra: Borrador de prueba de solicitudes de compra de excepción"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_exception_rule__purchase_request_ids
msgid "Purchase Requests"
msgstr "Solicitudes de Compra"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__related_model_id
#: model:ir.model.fields.selection,name:purchase_request_exception.selection__exception_rule__model__purchase_request
msgid "Purchase request"
msgstr "Solicitudes de Compra"
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_purchase_request_exception_confirm
msgid "Purchase request exception wizard"
msgstr "Asistente para excepciones en las solicitudes de compra"
#. module: purchase_request_exception
#: model:ir.model.fields.selection,name:purchase_request_exception.selection__exception_rule__model__purchase_request_line
msgid "Purchase request line"
msgstr "Línea de solicitud de compra"
#. module: purchase_request_exception
#: model:exception.rule,description:purchase_request_exception.prl_excep_qty_check
msgid "Purchase request line quantity must be positive"
msgstr "La cantidad de la línea de solicitud de compra debe ser positiva"
#. module: purchase_request_exception
#: model:exception.rule,name:purchase_request_exception.prl_excep_qty_check
msgid "Quantity not positive"
msgstr "Cantidad no positiva"

View file

@ -0,0 +1,174 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_request_exception
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 14.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2022-08-15 13:07+0000\n"
"Last-Translator: Khalid Hazam <k.hazam@badep.ma>\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 4.3.2\n"
#. module: purchase_request_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_form
msgid "<strong>There are exceptions blocking this Purchase Order:</strong>"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_exception_rule__model
msgid "Apply on"
msgstr "Appliquer sur"
#. module: purchase_request_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_search
msgid "Blocked in Draft"
msgstr "Bloqué à l'état brouillon"
#. module: purchase_request_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_form
msgid ""
"Click here to be able to confirm this Agreement regardless of the exceptions."
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__create_uid
msgid "Created by"
msgstr "Créée par"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__create_date
msgid "Created on"
msgstr "Créée le"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__display_name
msgid "Display Name"
msgstr "Nom affiché"
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_exception_rule
msgid "Exception Rule"
msgstr "Règle de l'exception"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__exception_ids
msgid "Exceptions"
msgstr "Exceptions"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__exceptions_summary
msgid "Exceptions Summary"
msgstr "Gestionnaire d'exception"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__exception_ids
msgid "Exceptions to resolve"
msgstr "Règles de restriction"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__id
msgid "ID"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__ignore_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__ignore
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_line__ignore_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_form
msgid "Ignore Exceptions"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm____last_update
msgid "Last Modified on"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__write_uid
msgid "Last Updated by"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__write_date
msgid "Last Updated on"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__main_exception_id
msgid "Main Exception"
msgstr ""
#. module: purchase_request_exception
#: model:exception.rule,name:purchase_request_exception.pr_excep_no_approver
msgid "No approver"
msgstr ""
#. module: purchase_request_exception
#: model:exception.rule,description:purchase_request_exception.pr_excep_no_approver
msgid "No approver assigned for this request"
msgstr ""
#. module: purchase_request_exception
#: model:ir.actions.act_window,name:purchase_request_exception.action_purchase_request_exception_confirm
msgid "Outstanding exceptions to manage"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_purchase_request
msgid "Purchase Request"
msgstr ""
#. module: purchase_request_exception
#: model:ir.actions.act_window,name:purchase_request_exception.action_purchase_request_test_tree
#: model:ir.ui.menu,name:purchase_request_exception.menu_purchase_request_test
msgid "Purchase Request Exception Rules"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_purchase_request_line
msgid "Purchase Request Line"
msgstr ""
#. module: purchase_request_exception
#: model:ir.actions.server,name:purchase_request_exception.ir_cron_test_pr_request_except_ir_actions_server
#: model:ir.cron,cron_name:purchase_request_exception.ir_cron_test_pr_request_except
msgid "Purchase Request: Test Draft Purchase Requests Exception"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_exception_rule__purchase_request_ids
msgid "Purchase Requests"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__related_model_id
#: model:ir.model.fields.selection,name:purchase_request_exception.selection__exception_rule__model__purchase_request
msgid "Purchase request"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_purchase_request_exception_confirm
msgid "Purchase request exception wizard"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields.selection,name:purchase_request_exception.selection__exception_rule__model__purchase_request_line
msgid "Purchase request line"
msgstr ""
#. module: purchase_request_exception
#: model:exception.rule,description:purchase_request_exception.prl_excep_qty_check
msgid "Purchase request line quantity must be positive"
msgstr ""
#. module: purchase_request_exception
#: model:exception.rule,name:purchase_request_exception.prl_excep_qty_check
msgid "Quantity not positive"
msgstr ""

View file

@ -0,0 +1,179 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_request_exception
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-08-31 11:06+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_request_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_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_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_exception_rule__model
msgid "Apply on"
msgstr "Applica a"
#. module: purchase_request_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_search
msgid "Blocked in Draft"
msgstr "Bloccati in bozza"
#. module: purchase_request_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_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_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__create_uid
msgid "Created by"
msgstr "Creato da"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__create_date
msgid "Created on"
msgstr "Creato il"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__display_name
msgid "Display Name"
msgstr "Nome visualizzato"
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_exception_rule
msgid "Exception Rule"
msgstr "Regola eccezione"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__exception_ids
msgid "Exceptions"
msgstr "Eccezioni"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__exceptions_summary
msgid "Exceptions Summary"
msgstr "Riepilogo eccezioni"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__exception_ids
msgid "Exceptions to resolve"
msgstr "Eccezioni da risolvere"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__id
msgid "ID"
msgstr "ID"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__ignore_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__ignore
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_line__ignore_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_form
msgid "Ignore Exceptions"
msgstr "Ignora eccezioni"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm____last_update
msgid "Last Modified on"
msgstr "Ultima modifica il"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__write_uid
msgid "Last Updated by"
msgstr "Ultimo aggiornamento di"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__write_date
msgid "Last Updated on"
msgstr "Ultimo aggiornamento il"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__main_exception_id
msgid "Main Exception"
msgstr "Eccezione principale"
#. module: purchase_request_exception
#: model:exception.rule,name:purchase_request_exception.pr_excep_no_approver
msgid "No approver"
msgstr "Nessun approvatore"
#. module: purchase_request_exception
#: model:exception.rule,description:purchase_request_exception.pr_excep_no_approver
msgid "No approver assigned for this request"
msgstr "Nessun approvatore assegnato a questa richiesta"
#. module: purchase_request_exception
#: model:ir.actions.act_window,name:purchase_request_exception.action_purchase_request_exception_confirm
msgid "Outstanding exceptions to manage"
msgstr "Eccezione rilevante da gestire"
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_purchase_request
msgid "Purchase Request"
msgstr "Richiesta di acquisto"
#. module: purchase_request_exception
#: model:ir.actions.act_window,name:purchase_request_exception.action_purchase_request_test_tree
#: model:ir.ui.menu,name:purchase_request_exception.menu_purchase_request_test
msgid "Purchase Request Exception Rules"
msgstr "Regole eccezione richiesta acquisto"
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_purchase_request_line
msgid "Purchase Request Line"
msgstr "Riga richiesta di acquisto"
#. module: purchase_request_exception
#: model:ir.actions.server,name:purchase_request_exception.ir_cron_test_pr_request_except_ir_actions_server
#: model:ir.cron,cron_name:purchase_request_exception.ir_cron_test_pr_request_except
msgid "Purchase Request: Test Draft Purchase Requests Exception"
msgstr "Richiesta acquisto: testa eccezione richieste acquisto in bozza"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_exception_rule__purchase_request_ids
msgid "Purchase Requests"
msgstr "Richieste di acquisto"
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__related_model_id
#: model:ir.model.fields.selection,name:purchase_request_exception.selection__exception_rule__model__purchase_request
msgid "Purchase request"
msgstr "Richiesta di acquisto"
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_purchase_request_exception_confirm
msgid "Purchase request exception wizard"
msgstr "Procedura guidata eccezione richiesta di acquisto"
#. module: purchase_request_exception
#: model:ir.model.fields.selection,name:purchase_request_exception.selection__exception_rule__model__purchase_request_line
msgid "Purchase request line"
msgstr "Riga richiesta di acquisto"
#. module: purchase_request_exception
#: model:exception.rule,description:purchase_request_exception.prl_excep_qty_check
msgid "Purchase request line quantity must be positive"
msgstr "La quantità della riga di richiesta di acquisto deve essere positiva"
#. module: purchase_request_exception
#: model:exception.rule,name:purchase_request_exception.prl_excep_qty_check
msgid "Quantity not positive"
msgstr "Quantità non positiva"

View file

@ -0,0 +1,172 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * purchase_request_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_request_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_form
msgid "<strong>There are exceptions blocking this Purchase Order:</strong>"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_exception_rule__model
msgid "Apply on"
msgstr ""
#. module: purchase_request_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_search
msgid "Blocked in Draft"
msgstr ""
#. module: purchase_request_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_form
msgid ""
"Click here to be able to confirm this Agreement regardless of the "
"exceptions."
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__create_uid
msgid "Created by"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__create_date
msgid "Created on"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__display_name
msgid "Display Name"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_exception_rule
msgid "Exception Rule"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__exception_ids
msgid "Exceptions"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__exceptions_summary
msgid "Exceptions Summary"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__exception_ids
msgid "Exceptions to resolve"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__id
msgid "ID"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__ignore_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__ignore
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_line__ignore_exception
#: model_terms:ir.ui.view,arch_db:purchase_request_exception.view_purchase_request_form
msgid "Ignore Exceptions"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm____last_update
msgid "Last Modified on"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__write_uid
msgid "Last Updated by"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__write_date
msgid "Last Updated on"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request__main_exception_id
msgid "Main Exception"
msgstr ""
#. module: purchase_request_exception
#: model:exception.rule,name:purchase_request_exception.pr_excep_no_approver
msgid "No approver"
msgstr ""
#. module: purchase_request_exception
#: model:exception.rule,description:purchase_request_exception.pr_excep_no_approver
msgid "No approver assigned for this request"
msgstr ""
#. module: purchase_request_exception
#: model:ir.actions.act_window,name:purchase_request_exception.action_purchase_request_exception_confirm
msgid "Outstanding exceptions to manage"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_purchase_request
msgid "Purchase Request"
msgstr ""
#. module: purchase_request_exception
#: model:ir.actions.act_window,name:purchase_request_exception.action_purchase_request_test_tree
#: model:ir.ui.menu,name:purchase_request_exception.menu_purchase_request_test
msgid "Purchase Request Exception Rules"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_purchase_request_line
msgid "Purchase Request Line"
msgstr ""
#. module: purchase_request_exception
#: model:ir.actions.server,name:purchase_request_exception.ir_cron_test_pr_request_except_ir_actions_server
#: model:ir.cron,cron_name:purchase_request_exception.ir_cron_test_pr_request_except
msgid "Purchase Request: Test Draft Purchase Requests Exception"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_exception_rule__purchase_request_ids
msgid "Purchase Requests"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields,field_description:purchase_request_exception.field_purchase_request_exception_confirm__related_model_id
#: model:ir.model.fields.selection,name:purchase_request_exception.selection__exception_rule__model__purchase_request
msgid "Purchase request"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model,name:purchase_request_exception.model_purchase_request_exception_confirm
msgid "Purchase request exception wizard"
msgstr ""
#. module: purchase_request_exception
#: model:ir.model.fields.selection,name:purchase_request_exception.selection__exception_rule__model__purchase_request_line
msgid "Purchase request line"
msgstr ""
#. module: purchase_request_exception
#: model:exception.rule,description:purchase_request_exception.prl_excep_qty_check
msgid "Purchase request line quantity must be positive"
msgstr ""
#. module: purchase_request_exception
#: model:exception.rule,name:purchase_request_exception.prl_excep_qty_check
msgid "Quantity not positive"
msgstr ""

View file

@ -0,0 +1,3 @@
from . import exception_rule
from . import purchase_request
from . import purchase_request_line

View file

@ -0,0 +1,20 @@
# Copyright 2021 Ecosoft (http://ecosoft.co.th)
# 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_request_ids = fields.Many2many(
comodel_name="purchase.request",
string="Purchase Requests",
)
model = fields.Selection(
selection_add=[
("purchase.request", "Purchase request"),
("purchase.request.line", "Purchase request line"),
],
ondelete={"purchase.request": "cascade", "purchase.request.line": "cascade"},
)

View file

@ -0,0 +1,57 @@
# Copyright 2021 Ecosoft (http://ecosoft.co.th)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import api, models
class PurchaseRequest(models.Model):
_inherit = ["purchase.request", "base.exception"]
_name = "purchase.request"
_order = "main_exception_id asc, id desc"
@api.model
def test_all_draft_requests(self):
request_set = self.search([("state", "=", "draft")])
request_set.detect_exceptions()
return True
@api.model
def _reverse_field(self):
return "purchase_request_ids"
def detect_exceptions(self):
all_exceptions = super().detect_exceptions()
lines = self.mapped("line_ids")
all_exceptions += lines.detect_exceptions()
return all_exceptions
@api.constrains("ignore_exception", "line_ids", "state")
def purchase_request_check_exception(self):
requests = self.filtered(lambda s: s.state == "to_approve")
if requests:
requests._check_exception()
@api.onchange("line_ids")
def onchange_ignore_exception(self):
if self.state == "to_approve":
self.ignore_exception = False
def button_to_approve(self):
if self.detect_exceptions() and not self.ignore_exception:
return self._popup_exceptions()
return super().button_to_approve()
def button_draft(self):
res = super().button_draft()
for request in self:
request.exception_ids = False
request.main_exception_id = False
request.ignore_exception = False
return res
@api.model
def _get_popup_action(self):
action = self.env.ref(
"purchase_request_exception.action_purchase_request_exception_confirm"
)
return action

View file

@ -0,0 +1,24 @@
# Copyright 2021 Ecosoft (http://ecosoft.co.th)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import api, fields, models
class PurchaseRequestLine(models.Model):
_inherit = ["purchase.request.line", "base.exception.method"]
_name = "purchase.request.line"
ignore_exception = fields.Boolean(
related="request_id.ignore_exception", store=True, string="Ignore Exceptions"
)
def _get_main_records(self):
return self.mapped("request_id")
@api.model
def _reverse_field(self):
return "purchase_request_ids"
def _detect_exceptions(self, rule):
records = super()._detect_exceptions(rule)
return records.mapped("request_id")

View file

@ -0,0 +1,6 @@
This module allows you attach several customizable exceptions to your
purchase request in a way that you can filter requests by exceptions type and fix them.
This is especially useful in an scenario for mass purchases requests 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_request_exception_confirm,access_purchase_request_exception_confirm,model_purchase_request_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_request_exception_confirm access_purchase_request_exception_confirm model_purchase_request_exception_confirm base.group_user 1 1 1 1

View file

@ -0,0 +1,427 @@
<!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 Reqeust Exception</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-reqeust-exception">
<h1 class="title">Purchase Reqeust Exception</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:42cf19a7548d97ff3f8a97027043da2ec9e2c04d87d7383833484acc967091c1
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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_request_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_request_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 request in a way that you can filter requests by exceptions type and fix them.</p>
<p>This is especially useful in an scenario for mass purchases requests 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_request_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>Ecosoft</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-4">Contributors</a></h2>
<ul class="simple">
<li>Kitti U &lt;<a class="reference external" href="mailto:kittiu&#64;ecosoft.co.th">kittiu&#64;ecosoft.co.th</a>&gt;</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_request_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_request_exception

View file

@ -0,0 +1,113 @@
# Copyright 2021 Ecosoft (http://ecosoft.co.th)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from datetime import datetime
from odoo.tests.common import TransactionCase
from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT
class TestPurchaseRequestException(TransactionCase):
def setUp(self):
super(TestPurchaseRequestException, self).setUp()
# Useful models
self.PurchaseRequest = self.env["purchase.request"]
self.PurchaseRequestLine = self.env["purchase.request.line"]
self.request_user_id = self.env.ref("base.user_admin")
self.date_required = datetime.today().strftime(DEFAULT_SERVER_DATETIME_FORMAT)
self.purchase_request_exception_confirm = self.env[
"purchase.request.exception.confirm"
]
self.exception_noapprover = self.env.ref(
"purchase_request_exception.pr_excep_no_approver"
)
self.exception_qtycheck = self.env.ref(
"purchase_request_exception.prl_excep_qty_check"
)
self.pr_vals = {
"requested_by": self.request_user_id.id,
"line_ids": [
(
0,
0,
{
"name": "Pen",
"product_qty": 5.0,
"estimated_cost": 500.0,
"date_required": self.date_required,
},
),
(
0,
0,
{
"name": "Ink",
"product_qty": 5.0,
"estimated_cost": 250.0,
"date_required": self.date_required,
},
),
],
}
def test_purchase_request_exception(self):
self.exception_noapprover.active = True
self.exception_qtycheck.active = True
self.pr = self.PurchaseRequest.create(self.pr_vals.copy())
# confirm
self.pr.button_to_approve()
self.assertEqual(self.pr.state, "draft")
# test all draft pr
self.pr2 = self.PurchaseRequest.create(self.pr_vals.copy())
self.PurchaseRequest.test_all_draft_requests()
self.assertEqual(self.pr2.state, "draft")
# Set ignore_exception flag (Done after ignore is selected at wizard)
self.pr.ignore_exception = True
self.pr.button_to_approve()
self.assertEqual(self.pr.state, "to_approve")
# Add a request line to test after PR is confirmed
# set ignore_exception = False (Done by onchange of line_ids)
field_onchange = self.PurchaseRequest._onchange_spec()
self.assertEqual(field_onchange.get("line_ids"), "1")
self.env.cache.invalidate()
self.pr3New = self.PurchaseRequest.new(self.pr_vals.copy())
self.pr3New.ignore_exception = True
self.pr3New.state = "to_approve"
self.pr3New.onchange_ignore_exception()
self.assertFalse(self.pr3New.ignore_exception)
self.pr.write(
{
"line_ids": [
(
0,
0,
{
"name": "Pencil",
"product_qty": 2.0,
"estimated_cost": 30.0,
"date_required": self.date_required,
},
)
]
}
)
# Set ignore exception True (Done manually by user)
self.pr.ignore_exception = True
self.pr.button_rejected()
self.pr.button_draft()
self.assertEqual(self.pr.state, "draft")
self.assertTrue(not self.pr.ignore_exception)
# Simulation the opening of the wizard purchase_request_exception_confirm and
# set ignore_exception to True
pr_except_confirm = self.purchase_request_exception_confirm.with_context(
active_id=self.pr.id,
active_ids=[self.pr.id],
active_model=self.pr._name,
).create({"ignore": True})
pr_except_confirm.action_confirm()
self.assertTrue(self.pr.ignore_exception)

View file

@ -0,0 +1,85 @@
<?xml version="1.0" ?>
<odoo>
<record id="action_purchase_request_test_tree" model="ir.actions.act_window">
<field name="name">Purchase Request 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.request', 'purchase.request.line'])]</field>
<field
name="context"
>{'active_test': False, 'default_model' : 'purchase.request'}</field>
</record>
<menuitem
action="action_purchase_request_test_tree"
id="menu_purchase_request_test"
parent="purchase.menu_purchase_config"
/>
<record id="view_purchase_request_form" model="ir.ui.view">
<field name="name">purchase_request_exception.view_purchase_request_form</field>
<field name="model">purchase.request</field>
<field name="inherit_id" ref="purchase_request.view_purchase_request_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='origin']/.." position="inside">
<field
name="ignore_exception"
states="to_approve"
groups='base_exception.group_exception_rule_manager'
/>
<field name="exception_ids" widget="many2many_tags" readonly="True" />
</xpath>
</field>
</record>
<record id="view_purchase_request_tree" model="ir.ui.view">
<field name="name">purchase_request_exception.view_purchase_request_tree</field>
<field name="model">purchase.request</field>
<field name="inherit_id" ref="purchase_request.view_purchase_request_tree" />
<field name="arch" type="xml">
<field name="state" position="after">
<field name="main_exception_id" />
</field>
</field>
</record>
<record id="view_purchase_request_search" model="ir.ui.view">
<field
name="name"
>purchase_request_exception.view_purchase_request_search</field>
<field name="model">purchase.request</field>
<field name="inherit_id" ref="purchase_request.view_purchase_request_search" />
<field name="arch" type="xml">
<field name="picking_type_id" position="after">
<separator orientation="vertical" />
<filter
icon="fa-exclamation-circle"
name="tofix"
string="Blocked in Draft"
domain="[('main_exception_id','!=',False)]"
/>
</field>
</field>
</record>
</odoo>

View file

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

View file

@ -0,0 +1,20 @@
# Copyright 2021 Ecosoft (http://ecosoft.co.th)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from odoo import fields, models
class PurchaseRequestExceptionConfirm(models.TransientModel):
_name = "purchase.request.exception.confirm"
_description = "Purchase request exception wizard"
_inherit = ["exception.rule.confirm"]
related_model_id = fields.Many2one("purchase.request", "Purchase request")
def action_confirm(self):
self.ensure_one()
if self.ignore:
self.related_model_id.button_draft()
self.related_model_id.ignore_exception = True
self.related_model_id.button_to_approve()
return super().action_confirm()

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record
id="action_purchase_request_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.request.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_request_exception"
version = "16.0.0"
description = "Purchase Reqeust Exception - Custom exceptions on purchase request"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-purchase-workflow-purchase_request>=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_request_exception"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]