Initial commit: OCA Mrp packages (117 packages)

This commit is contained in:
Ernad Husremovic 2025-08-29 15:43:05 +02:00
commit 277e84fd7a
4403 changed files with 395154 additions and 0 deletions

View file

@ -0,0 +1,45 @@
# MRP Default Workorder Time
Odoo addon: mrp_default_workorder_time
## Installation
```bash
pip install odoo-bringout-oca-manufacture-mrp_default_workorder_time
```
## Dependencies
This addon depends on:
- mrp
- stock
## Manifest Information
- **Name**: MRP Default Workorder Time
- **Version**: 16.0.1.0.0
- **Category**: Manufacturing
- **License**: LGPL-3
- **Installable**: True
## Source
Based on [OCA/manufacture](https://github.com/OCA/manufacture) branch 16.0, addon `mrp_default_workorder_time`.
## License
This package maintains the original LGPL-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
- 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 Mrp_default_workorder_time Module - mrp_default_workorder_time
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 mrp_default_workorder_time. 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:
- [mrp](../../odoo-bringout-oca-ocb-mrp)
- [stock](../../odoo-bringout-oca-ocb-stock)

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

View file

@ -0,0 +1,7 @@
# Install
```bash
pip install odoo-bringout-oca-manufacture-mrp_default_workorder_time"
# or
uv pip install odoo-bringout-oca-manufacture-mrp_default_workorder_time"
```

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -0,0 +1,89 @@
==========================
MRP Default Workorder Time
==========================
..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:beb803741965ff28f8c1834060d5369607aa38ab7cbe90d9169194803765a358
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |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-LGPL--3-blue.png
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fmanufacture-lightgray.png?logo=github
:target: https://github.com/OCA/manufacture/tree/16.0/mrp_default_workorder_time
:alt: OCA/manufacture
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/manufacture-16-0/manufacture-16-0-mrp_default_workorder_time
: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/manufacture&target_branch=16.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
There are occasions when the registration of work orders is not completed with the correct times, this module allows you to configure a threshold percentage that assigns the projected time as fully productive time if a work time less than this percentage is detected.
**Table of contents**
.. contents::
:local:
Usage
=====
In the production module configurations, the "Record standard projected order time" feature must be activated, by default the minimum percentage is ten but it can be changed as needed.
Bug Tracker
===========
Bugs are tracked on `GitHub Issues <https://github.com/OCA/manufacture/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/manufacture/issues/new?body=module:%20mrp_default_workorder_time%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
~~~~~~~
* ForgeFlow
Contributors
~~~~~~~~~~~~
* Christopher Ormaza <chris.ormaza@forgeflow.com>
Maintainers
~~~~~~~~~~~
This module is maintained by the OCA.
.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org
OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.
.. |maintainer-ChrisOForgeFlow| image:: https://github.com/ChrisOForgeFlow.png?size=40px
:target: https://github.com/ChrisOForgeFlow
:alt: ChrisOForgeFlow
Current `maintainer <https://odoo-community.org/page/maintainer-role>`__:
|maintainer-ChrisOForgeFlow|
This module is part of the `OCA/manufacture <https://github.com/OCA/manufacture/tree/16.0/mrp_default_workorder_time>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View file

@ -0,0 +1,21 @@
# Copyright 2022 ForgeFlow S.L. (https://www.forgeflow.com)
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
{
"name": "MRP Default Workorder Time",
"version": "16.0.1.0.0",
"development_status": "Beta",
"license": "LGPL-3",
"author": "ForgeFlow, Odoo Community Association (OCA)",
"maintainers": ["ChrisOForgeFlow"],
"summary": "Adds an MRP default workorder time",
"website": "https://github.com/OCA/manufacture",
"category": "Manufacturing",
"depends": ["mrp", "stock"],
"data": [
"views/res_config_settings_view.xml",
],
"demo": [],
"installable": True,
"application": True,
}

View file

@ -0,0 +1,95 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mrp_default_workorder_time
#
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: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid ""
"<span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-"
"specific.\" role=\"img\" aria-label=\"Values set here are company-"
"specific.\" groups=\"base.group_multi_company\"/>"
msgstr ""
#. module: mrp_default_workorder_time
#: model:ir.model,name:mrp_default_workorder_time.model_res_company
msgid "Companies"
msgstr "Tvrtke"
#. module: mrp_default_workorder_time
#: model:ir.model,name:mrp_default_workorder_time.model_res_config_settings
msgid "Config Settings"
msgstr "Konfiguracijske postavke"
#. module: mrp_default_workorder_time
#. odoo-python
#: code:addons/mrp_default_workorder_time/models/workorder.py:0
#, python-format
msgid ""
"Fully Productive Time is not configured on system, please contact with your "
"administrator"
msgstr ""
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid ""
"If time recorded on workorder is not between this percentages, projected "
"time will be used instead"
msgstr ""
#. module: mrp_default_workorder_time
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_company__maximum_order_time_threshold
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_config_settings__maximum_order_time_threshold
msgid "Maximum order time threshold(%)"
msgstr "Prag maksimalnog vremena naloga(%)"
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid "Maximum:"
msgstr "Maksimum:"
#. module: mrp_default_workorder_time
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_company__minimum_order_time_threshold
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_config_settings__minimum_order_time_threshold
msgid "Minimum order time threshold(%)"
msgstr "Prag minimalnog vremena naloga (%)"
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid "Minimum:"
msgstr "Minimum:"
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid "Record standard projected order time"
msgstr "Zabilježi standardno projecirano vrijeme naloga"
#. module: mrp_default_workorder_time
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_company__use_projected_time_work_orders
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_config_settings__use_projected_time_work_orders
msgid "Use projected time work orders?"
msgstr "Koristi projecirano vrijeme za radne naloge?"
#. module: mrp_default_workorder_time
#: model:ir.model,name:mrp_default_workorder_time.model_mrp_workorder
msgid "Work Order"
msgstr "Radni nalog"
#. module: mrp_default_workorder_time
#. odoo-python
#: code:addons/mrp_default_workorder_time/models/workorder.py:0
#, python-format
msgid ""
"You should plan orders to set default production time on work orders, please"
" check"
msgstr ""

View file

@ -0,0 +1,107 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mrp_default_workorder_time
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-03-25 21:33+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: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid ""
"<span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-"
"specific.\" role=\"img\" aria-label=\"Values set here are company-"
"specific.\" groups=\"base.group_multi_company\"/>"
msgstr ""
"<span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-"
"specific.\" role=\"img\" aria-label=\"Values set here are company-specific.\""
" groups=\"base.group_multi_company\"/>"
#. module: mrp_default_workorder_time
#: model:ir.model,name:mrp_default_workorder_time.model_res_company
msgid "Companies"
msgstr "Compañías"
#. module: mrp_default_workorder_time
#: model:ir.model,name:mrp_default_workorder_time.model_res_config_settings
msgid "Config Settings"
msgstr "Ajustes Config"
#. module: mrp_default_workorder_time
#. odoo-python
#: code:addons/mrp_default_workorder_time/models/workorder.py:0
#, python-format
msgid ""
"Fully Productive Time is not configured on system, please contact with your "
"administrator"
msgstr ""
"El Tiempo Productivo Completo no está configurado en el sistema, póngase en "
"contacto con su administrador"
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid ""
"If time recorded on workorder is not between this percentages, projected "
"time will be used instead"
msgstr ""
"Si el tiempo registrado en la orden de trabajo no se encuentra entre estos "
"porcentajes, se utilizará en su lugar el tiempo proyectado"
#. module: mrp_default_workorder_time
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_company__maximum_order_time_threshold
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_config_settings__maximum_order_time_threshold
msgid "Maximum order time threshold(%)"
msgstr "Umbral de tiempo máximo de pedido(%)"
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid "Maximum:"
msgstr "Máximo:"
#. module: mrp_default_workorder_time
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_company__minimum_order_time_threshold
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_config_settings__minimum_order_time_threshold
msgid "Minimum order time threshold(%)"
msgstr "Umbral de tiempo máximo de pedido(%)"
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid "Minimum:"
msgstr "Mínimo:"
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid "Record standard projected order time"
msgstr "Registrar el tiempo de pedido proyectado estándar"
#. module: mrp_default_workorder_time
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_company__use_projected_time_work_orders
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_config_settings__use_projected_time_work_orders
msgid "Use projected time work orders?"
msgstr "¿Utilizar órdenes de trabajo de tiempo proyectado?"
#. module: mrp_default_workorder_time
#: model:ir.model,name:mrp_default_workorder_time.model_mrp_workorder
msgid "Work Order"
msgstr "Orden de Trabajo"
#. module: mrp_default_workorder_time
#. odoo-python
#: code:addons/mrp_default_workorder_time/models/workorder.py:0
#, python-format
msgid ""
"You should plan orders to set default production time on work orders, please"
" check"
msgstr ""
"Usted debe planificar las órdenes para establecer el tiempo de producción "
"por defecto en las órdenes de trabajo, por favor revise"

View file

@ -0,0 +1,105 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mrp_default_workorder_time
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-06-17 15:35+0000\n"
"Last-Translator: Bole <bole@dajmi5.com>\n"
"Language-Team: none\n"
"Language: hr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
"n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.17\n"
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid ""
"<span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-"
"specific.\" role=\"img\" aria-label=\"Values set here are company-"
"specific.\" groups=\"base.group_multi_company\"/>"
msgstr ""
#. module: mrp_default_workorder_time
#: model:ir.model,name:mrp_default_workorder_time.model_res_company
msgid "Companies"
msgstr "Tvrtke"
#. module: mrp_default_workorder_time
#: model:ir.model,name:mrp_default_workorder_time.model_res_config_settings
msgid "Config Settings"
msgstr "Konfiguracijske postavke"
#. module: mrp_default_workorder_time
#. odoo-python
#: code:addons/mrp_default_workorder_time/models/workorder.py:0
#, python-format
msgid ""
"Fully Productive Time is not configured on system, please contact with your "
"administrator"
msgstr ""
"Potpuno produktivno vrijeme nije postavljeno u sustavu, molimo kontaktirajte "
"administratora"
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid ""
"If time recorded on workorder is not between this percentages, projected "
"time will be used instead"
msgstr ""
"Ako ubilježeno vrijeme na radnom nalogu nije između ovih postotaka, "
"projektno vrijeme će biti korišteno"
#. module: mrp_default_workorder_time
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_company__maximum_order_time_threshold
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_config_settings__maximum_order_time_threshold
msgid "Maximum order time threshold(%)"
msgstr "Prag maksimalnog vremena naloga(%)"
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid "Maximum:"
msgstr "Maksimum:"
#. module: mrp_default_workorder_time
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_company__minimum_order_time_threshold
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_config_settings__minimum_order_time_threshold
msgid "Minimum order time threshold(%)"
msgstr "Prag minimalnog vremena naloga (%)"
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid "Minimum:"
msgstr "Minimum:"
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid "Record standard projected order time"
msgstr "Zabilježi standardno projecirano vrijeme naloga"
#. module: mrp_default_workorder_time
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_company__use_projected_time_work_orders
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_config_settings__use_projected_time_work_orders
msgid "Use projected time work orders?"
msgstr "Koristi projecirano vrijeme za radne naloge?"
#. module: mrp_default_workorder_time
#: model:ir.model,name:mrp_default_workorder_time.model_mrp_workorder
msgid "Work Order"
msgstr "Radni nalog"
#. module: mrp_default_workorder_time
#. odoo-python
#: code:addons/mrp_default_workorder_time/models/workorder.py:0
#, python-format
msgid ""
"You should plan orders to set default production time on work orders, please"
" check"
msgstr ""
"Trebate planirati naloge za postavljanje vremena proizvodnje na radnim "
"nalozima, molimo provjerite"

View file

@ -0,0 +1,106 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mrp_default_workorder_time
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"PO-Revision-Date: 2024-03-04 15: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: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid ""
"<span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-"
"specific.\" role=\"img\" aria-label=\"Values set here are company-"
"specific.\" groups=\"base.group_multi_company\"/>"
msgstr ""
"<span class=\"fa fa-lg fa-building-o\" title=\"I valori impostati qui sono "
"specifici per azienda.\" role=\"img\" aria-label=\"I valori impostati qui "
"sono specifici per azienda.\" groups=\"base.group_multi_company\"/>"
#. module: mrp_default_workorder_time
#: model:ir.model,name:mrp_default_workorder_time.model_res_company
msgid "Companies"
msgstr "Aziende"
#. module: mrp_default_workorder_time
#: model:ir.model,name:mrp_default_workorder_time.model_res_config_settings
msgid "Config Settings"
msgstr "Impostazioni di configurazione"
#. module: mrp_default_workorder_time
#. odoo-python
#: code:addons/mrp_default_workorder_time/models/workorder.py:0
#, python-format
msgid ""
"Fully Productive Time is not configured on system, please contact with your "
"administrator"
msgstr ""
"L'orario di lavoro non è configurato nel sistema, contattare l'amministratore"
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid ""
"If time recorded on workorder is not between this percentages, projected "
"time will be used instead"
msgstr ""
"Se l'orario registrato negli ordini di lavoro non è all'interno di questa "
"percentuale, verrà utilizzato l'orario previsto"
#. module: mrp_default_workorder_time
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_company__maximum_order_time_threshold
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_config_settings__maximum_order_time_threshold
msgid "Maximum order time threshold(%)"
msgstr "Soglia orario ordine massimo (%)"
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid "Maximum:"
msgstr "Massimo:"
#. module: mrp_default_workorder_time
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_company__minimum_order_time_threshold
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_config_settings__minimum_order_time_threshold
msgid "Minimum order time threshold(%)"
msgstr "Soglia orario ordine minima (%)"
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid "Minimum:"
msgstr "Minimo:"
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid "Record standard projected order time"
msgstr "Registra orario ordine previsto standard"
#. module: mrp_default_workorder_time
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_company__use_projected_time_work_orders
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_config_settings__use_projected_time_work_orders
msgid "Use projected time work orders?"
msgstr "Usare orario previsto ordini di lavoro?"
#. module: mrp_default_workorder_time
#: model:ir.model,name:mrp_default_workorder_time.model_mrp_workorder
msgid "Work Order"
msgstr "Ordine di lavoro"
#. module: mrp_default_workorder_time
#. odoo-python
#: code:addons/mrp_default_workorder_time/models/workorder.py:0
#, python-format
msgid ""
"You should plan orders to set default production time on work orders, please"
" check"
msgstr ""
"Bisogna pianiicare gli ordini per impostare l'orario di produzione "
"predefinito negli ordini di lavoro, verificare"

View file

@ -0,0 +1,95 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * mrp_default_workorder_time
#
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: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid ""
"<span class=\"fa fa-lg fa-building-o\" title=\"Values set here are company-"
"specific.\" role=\"img\" aria-label=\"Values set here are company-"
"specific.\" groups=\"base.group_multi_company\"/>"
msgstr ""
#. module: mrp_default_workorder_time
#: model:ir.model,name:mrp_default_workorder_time.model_res_company
msgid "Companies"
msgstr ""
#. module: mrp_default_workorder_time
#: model:ir.model,name:mrp_default_workorder_time.model_res_config_settings
msgid "Config Settings"
msgstr ""
#. module: mrp_default_workorder_time
#. odoo-python
#: code:addons/mrp_default_workorder_time/models/workorder.py:0
#, python-format
msgid ""
"Fully Productive Time is not configured on system, please contact with your "
"administrator"
msgstr ""
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid ""
"If time recorded on workorder is not between this percentages, projected "
"time will be used instead"
msgstr ""
#. module: mrp_default_workorder_time
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_company__maximum_order_time_threshold
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_config_settings__maximum_order_time_threshold
msgid "Maximum order time threshold(%)"
msgstr ""
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid "Maximum:"
msgstr ""
#. module: mrp_default_workorder_time
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_company__minimum_order_time_threshold
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_config_settings__minimum_order_time_threshold
msgid "Minimum order time threshold(%)"
msgstr ""
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid "Minimum:"
msgstr ""
#. module: mrp_default_workorder_time
#: model_terms:ir.ui.view,arch_db:mrp_default_workorder_time.res_config_settings_view_form
msgid "Record standard projected order time"
msgstr ""
#. module: mrp_default_workorder_time
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_company__use_projected_time_work_orders
#: model:ir.model.fields,field_description:mrp_default_workorder_time.field_res_config_settings__use_projected_time_work_orders
msgid "Use projected time work orders?"
msgstr ""
#. module: mrp_default_workorder_time
#: model:ir.model,name:mrp_default_workorder_time.model_mrp_workorder
msgid "Work Order"
msgstr ""
#. module: mrp_default_workorder_time
#. odoo-python
#: code:addons/mrp_default_workorder_time/models/workorder.py:0
#, python-format
msgid ""
"You should plan orders to set default production time on work orders, please"
" check"
msgstr ""

View file

@ -0,0 +1,3 @@
from . import company
from . import res_config_settings
from . import workorder

View file

@ -0,0 +1,24 @@
# Copyright 2022 ForgeFlow S.L. (https://www.forgeflow.com)
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
from odoo import fields, models
class ResCompany(models.Model):
_inherit = "res.company"
use_projected_time_work_orders = fields.Boolean(
string="Use projected time work orders?",
default=True,
)
minimum_order_time_threshold = fields.Float(
string="Minimum order time threshold(%)",
required=False,
default=10,
)
maximum_order_time_threshold = fields.Float(
string="Maximum order time threshold(%)",
required=False,
default=150,
)

View file

@ -0,0 +1,19 @@
# Copyright 2022 ForgeFlow S.L. (https://www.forgeflow.com)
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
from odoo import fields, models
class ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"
use_projected_time_work_orders = fields.Boolean(
related="company_id.use_projected_time_work_orders", readonly=False
)
minimum_order_time_threshold = fields.Float(
related="company_id.minimum_order_time_threshold", readonly=False
)
maximum_order_time_threshold = fields.Float(
related="company_id.maximum_order_time_threshold", readonly=False
)

View file

@ -0,0 +1,92 @@
# Copyright 2022 ForgeFlow S.L. (https://www.forgeflow.com)
# License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html).
from dateutil.relativedelta import relativedelta
from odoo import _, models
from odoo.exceptions import UserError
from odoo.tools import float_compare
class MrpWorkOrder(models.Model):
_inherit = "mrp.workorder"
def add_time_to_work_order(self, fully_productive_time):
self.ensure_one()
# self._compute_duration()
date_start = self.date_planned_start
if not date_start:
raise UserError(
_(
"You should plan orders to set default "
"production time on work orders, please check"
)
)
date_end = self.date_planned_start + relativedelta(
minutes=self.duration_expected
)
if self.time_ids:
minutes_to_add = self.duration_expected - self.duration
if float_compare(minutes_to_add, 0, precision_digits=6) == -1:
return
date_start = max(self.time_ids.mapped("date_end"))
date_end = date_start + relativedelta(minutes=minutes_to_add)
self.write(
{
"time_ids": [
(
0,
0,
{
"user_id": self.env.user.id,
"date_start": date_start,
"date_end": date_end,
"loss_id": fully_productive_time.id,
"workcenter_id": self.workcenter_id.id,
"description": fully_productive_time.name,
},
)
]
}
)
def reduce_time_to_workorder(self, fully_productive_time):
self.ensure_one()
self.time_ids.filtered(
lambda x: x.loss_id.id == fully_productive_time.id
).sudo().unlink()
self.add_time_to_work_order(fully_productive_time)
def button_finish(self):
res = super().button_finish()
fully_productive_time = self.env["mrp.workcenter.productivity.loss"].search(
[("loss_type", "=", "performance")], limit=1
)
if not fully_productive_time:
raise UserError(
_(
"Fully Productive Time is not configured on system, "
"please contact with your administrator"
)
)
for workorder in self.filtered(
lambda x: x.state == "done"
and (
not x.time_ids
or (
(100 - x.duration_percent)
<= x.production_id.company_id.minimum_order_time_threshold
)
)
and x.production_id.company_id.use_projected_time_work_orders
):
# FIX ME: this is because duration expected use this field to compute
workorder.qty_production = workorder.qty_produced
workorder.duration_expected = workorder._get_duration_expected()
workorder.add_time_to_work_order(fully_productive_time)
if (
100 - workorder.duration_percent
) > workorder.production_id.company_id.maximum_order_time_threshold:
workorder.reduce_time_to_workorder(fully_productive_time)
return res

View file

@ -0,0 +1 @@
* Christopher Ormaza <chris.ormaza@forgeflow.com>

View file

@ -0,0 +1 @@
There are occasions when the registration of work orders is not completed with the correct times, this module allows you to configure a threshold percentage that assigns the projected time as fully productive time if a work time less than this percentage is detected.

View file

@ -0,0 +1 @@
In the production module configurations, the "Record standard projected order time" feature must be activated, by default the minimum percentage is ten but it can be changed as needed.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

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>MRP Default Workorder Time</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="mrp-default-workorder-time">
<h1 class="title">MRP Default Workorder Time</h1>
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:beb803741965ff28f8c1834060d5369607aa38ab7cbe90d9169194803765a358
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
<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/lgpl-3.0-standalone.html"><img alt="License: LGPL-3" src="https://img.shields.io/badge/licence-LGPL--3-blue.png" /></a> <a class="reference external image-reference" href="https://github.com/OCA/manufacture/tree/16.0/mrp_default_workorder_time"><img alt="OCA/manufacture" src="https://img.shields.io/badge/github-OCA%2Fmanufacture-lightgray.png?logo=github" /></a> <a class="reference external image-reference" href="https://translation.odoo-community.org/projects/manufacture-16-0/manufacture-16-0-mrp_default_workorder_time"><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/manufacture&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>There are occasions when the registration of work orders is not completed with the correct times, this module allows you to configure a threshold percentage that assigns the projected time as fully productive time if a work time less than this percentage is detected.</p>
<p><strong>Table of contents</strong></p>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="toc-entry-1">Usage</a></li>
<li><a class="reference internal" href="#bug-tracker" id="toc-entry-2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="toc-entry-3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="toc-entry-4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="toc-entry-5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="toc-entry-6">Maintainers</a></li>
</ul>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-1">Usage</a></h1>
<p>In the production module configurations, the “Record standard projected order time” feature must be activated, by default the minimum percentage is ten but it can be changed as needed.</p>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#toc-entry-2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/manufacture/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/manufacture/issues/new?body=module:%20mrp_default_workorder_time%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**">feedback</a>.</p>
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#toc-entry-3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#toc-entry-4">Authors</a></h2>
<ul class="simple">
<li>ForgeFlow</li>
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#toc-entry-5">Contributors</a></h2>
<ul class="simple">
<li>Christopher Ormaza &lt;<a class="reference external" href="mailto:chris.ormaza&#64;forgeflow.com">chris.ormaza&#64;forgeflow.com</a>&gt;</li>
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
<p>Current <a class="reference external" href="https://odoo-community.org/page/maintainer-role">maintainer</a>:</p>
<p><a class="reference external image-reference" href="https://github.com/ChrisOForgeFlow"><img alt="ChrisOForgeFlow" src="https://github.com/ChrisOForgeFlow.png?size=40px" /></a></p>
<p>This module is part of the <a class="reference external" href="https://github.com/OCA/manufacture/tree/16.0/mrp_default_workorder_time">OCA/manufacture</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_workorder_times

View file

@ -0,0 +1,132 @@
# Copyright 2022 ForgeFlow S.L. (https://www.forgeflow.com)
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
from dateutil.relativedelta import relativedelta
from odoo.fields import Datetime as Dt
from odoo.tests import Form
from odoo.addons.mrp.tests import common
class TestMrpDefaultWorkorderTime(common.TestMrpCommon):
def _crete_production_with_workorders(
self, product_qty=100, set_time=False, percent_time=False
):
fully_productive_time = self.env["mrp.workcenter.productivity.loss"].search(
[("loss_type", "=", "performance")], limit=1
)
mo_form = Form(self.env["mrp.production"])
mo_form.product_id = self.bom_2.product_id
mo_form.bom_id = self.bom_2
mo_form.product_qty = product_qty
mo = mo_form.save()
self.env["stock.quant"]._update_available_quantity(
self.product_4, self.stock_location, 200
)
self.env["stock.quant"]._update_available_quantity(
self.product_3, self.stock_location, 200
)
mo.date_planned_start = Dt.now()
mo.action_confirm()
mo.action_assign()
mo.button_plan()
if set_time:
date_start = Dt.now()
date_end = date_start + relativedelta(
minutes=mo.workorder_ids[0].duration_expected * (percent_time / 100.0)
)
mo.workorder_ids.write(
{
"time_ids": [
(
0,
0,
{
"user_id": self.env.user.id,
"date_start": date_start,
"date_end": date_end,
"loss_id": fully_productive_time.id,
"workcenter_id": mo.workorder_ids[0].workcenter_id.id,
"description": fully_productive_time.name,
},
)
]
}
)
return mo
def finish_production(self, mo):
res = mo.button_mark_done()
if res is not True:
ctx = {
"active_id": mo.id,
"active_ids": mo.ids,
"active_model": "mrp.production",
}
ctx.update(res.get("context", {}))
wizard_form = Form(self.env["mrp.immediate.production"].with_context(**ctx))
wizard = wizard_form.save()
if mo.company_id.use_projected_time_work_orders:
wizard.process()
def test_mrp_default_workorder_time(self):
self.stock_location = self.env.ref("stock.stock_location_stock")
mo = self._crete_production_with_workorders(1)
self.assertEqual(len(mo), 1, "MO should have been created")
self.finish_production(mo)
self.assertEqual(
mo.workorder_ids[0].duration, mo.workorder_ids[0].duration_expected
)
mo2 = self._crete_production_with_workorders(1)
mo2.company_id.use_projected_time_work_orders = False
self.assertEqual(len(mo2), 1, "MO should have been created")
self.finish_production(mo2)
self.assertNotEqual(
mo2.workorder_ids[0].duration, mo2.workorder_ids[0].duration_expected
)
mo3 = self._crete_production_with_workorders(
1, True, mo.company_id.minimum_order_time_threshold
)
mo3.company_id.use_projected_time_work_orders = True
mo3.company_id.minimum_order_time_threshold = 20
self.assertEqual(len(mo3), 1, "MO should have been created")
self.finish_production(mo3)
self.assertEqual(
mo3.workorder_ids[0].duration, mo3.workorder_ids[0].duration_expected
)
mo4 = self._crete_production_with_workorders(
1, True, mo.company_id.minimum_order_time_threshold + 1
)
mo4.company_id.use_projected_time_work_orders = True
mo4.company_id.minimum_order_time_threshold = 20
self.assertEqual(len(mo4), 1, "MO should have been created")
self.finish_production(mo4)
self.assertNotEqual(
mo4.workorder_ids[0].duration, mo4.workorder_ids[0].duration_expected
)
mo5 = self._crete_production_with_workorders(
1, True, mo.company_id.maximum_order_time_threshold
)
mo5.company_id.use_projected_time_work_orders = True
mo5.company_id.minimum_order_time_threshold = 20
self.assertEqual(len(mo5), 1, "MO should have been created")
self.finish_production(mo5)
self.assertNotEqual(
mo5.workorder_ids[0].duration, mo5.workorder_ids[0].duration_expected
)
mo6 = self._crete_production_with_workorders(
1, True, mo.company_id.maximum_order_time_threshold + 1
)
mo6.company_id.use_projected_time_work_orders = True
mo6.company_id.minimum_order_time_threshold = 20
self.assertEqual(len(mo6), 1, "MO should have been created")
self.finish_production(mo6)
self.assertNotEqual(
mo6.workorder_ids[0].duration, mo6.workorder_ids[0].duration_expected
)

View file

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.mrp</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="mrp.res_config_settings_view_form" />
<field name="arch" type="xml">
<xpath expr="//div[@id='security_lead_time']" position="after">
<div class="col-lg-6 col-12 o_setting_box" id="security_lead_time">
<div class="o_setting_left_pane">
<field name="use_projected_time_work_orders" />
</div>
<div class="o_setting_right_pane">
<label
string="Record standard projected order time"
for="minimum_order_time_threshold"
/>
<span
class="fa fa-lg fa-building-o"
title="Values set here are company-specific."
role="img"
aria-label="Values set here are company-specific."
groups="base.group_multi_company"
/>
<div class="text-muted">
If time recorded on workorder is not between this percentages, projected time will be used instead
</div>
<div
class="content-group"
attrs="{'invisible': [('use_projected_time_work_orders','=',False)]}"
>
<div class="mt16">
Minimum:
<field
name="minimum_order_time_threshold"
class="oe_inline"
/> %
</div>
<div class="mt16">
Maximum:
<field
name="maximum_order_time_threshold"
class="oe_inline"
/> %
</div>
</div>
</div>
</div>
</xpath>
</field>
</record>
</odoo>

View file

@ -0,0 +1,43 @@
[project]
name = "odoo-bringout-oca-manufacture-mrp_default_workorder_time"
version = "16.0.0"
description = "MRP Default Workorder Time - Adds an MRP default workorder time"
authors = [
{ name = "Ernad Husremovic", email = "hernad@bring.out.ba" }
]
dependencies = [
"odoo-bringout-oca-ocb-mrp>=16.0.0",
"odoo-bringout-oca-ocb-stock>=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 = ["mrp_default_workorder_time"]
[tool.rye]
managed = true
dev-dependencies = [
"pytest>=8.4.1",
]