diff --git a/mrp_planned_order_matrix/README.rst b/mrp_planned_order_matrix/README.rst new file mode 100644 index 0000000000..fb1194a520 --- /dev/null +++ b/mrp_planned_order_matrix/README.rst @@ -0,0 +1,101 @@ +======================== +MRP Planned Order Matrix +======================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:3ca7a03b19be36dcaeaf196fcd1d98c2c2cf35b7ceb9ecb285ca847fe787fa30 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Production%2FStable-green.png + :target: https://odoo-community.org/page/development-status + :alt: Production/Stable +.. |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%2Fmanufacture-lightgray.png?logo=github + :target: https://github.com/OCA/manufacture/tree/17.0/mrp_planned_order_matrix + :alt: OCA/manufacture +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/manufacture-17-0/manufacture-17-0-mrp_planned_order_matrix + :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=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows to create fixed planned orders using a grid view. + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +This module relies on: + +- The OCA module '2D matrix for x2many fields', and can be downloaded + from Github: + https://github.com/OCA/web/tree/15.0/web_widget_x2many_2d_matrix +- The OCA module 'Date Range', and can be downloaded from Github: + https://github.com/OCA/server-ux/tree/15.0/date_range + +Usage +===== + +- Go to *Inventory / Configuration / Date Ranges* and define your + estimating periods. +- Go to *Manufacturing / Planning / Create Fixed Planned Orders* to + create or update your fixed planned orders. +- Go to *Manufacturing / Planning / Planned Orders* to review the + planned orders in the system. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub 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 `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +------- + +* ForgeFlow + +Contributors +------------ + +- ForgeFlow, S.L. (https://www.forgeflow.com) + + - Jordi Ballester Alomar + - Lois Rilo + - Hector Villarreal + +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/manufacture `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/mrp_planned_order_matrix/__init__.py b/mrp_planned_order_matrix/__init__.py new file mode 100644 index 0000000000..5cb1c49143 --- /dev/null +++ b/mrp_planned_order_matrix/__init__.py @@ -0,0 +1 @@ +from . import wizards diff --git a/mrp_planned_order_matrix/__manifest__.py b/mrp_planned_order_matrix/__manifest__.py new file mode 100644 index 0000000000..1bf2beee87 --- /dev/null +++ b/mrp_planned_order_matrix/__manifest__.py @@ -0,0 +1,18 @@ +# Copyright 2019-22 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +{ + "name": "MRP Planned Order Matrix", + "summary": "Allows to create fixed planned orders on a grid view.", + "version": "17.0.1.0.0", + "development_status": "Production/Stable", + "author": "ForgeFlow, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/manufacture", + "category": "Warehouse Management", + "depends": ["mrp_multi_level", "web_widget_x2many_2d_matrix", "date_range"], + "data": [ + "security/ir.model.access.csv", + "wizards/mrp_planned_order_wizard_view.xml", + ], + "license": "AGPL-3", + "installable": True, +} diff --git a/mrp_planned_order_matrix/i18n/es.po b/mrp_planned_order_matrix/i18n/es.po new file mode 100644 index 0000000000..298d5e31aa --- /dev/null +++ b/mrp_planned_order_matrix/i18n/es.po @@ -0,0 +1,221 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_planned_order_matrix +# +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 \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_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.mrp_planned_order_wizard_view_form +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.stock_mrp_planned_order_sheet_view_form +msgid "Cancel" +msgstr "Cancelar" + +#. module: mrp_planned_order_matrix +#: model:ir.actions.act_window,name:mrp_planned_order_matrix.action_mrp_planned_order_wizard +#: model:ir.ui.menu,name:mrp_planned_order_matrix.menu_stock_mrp_planned_order_wizard +msgid "Create Fixed Planned Orders" +msgstr "Crear Órdenes Planificadas Fijas" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__create_uid +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__create_uid +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__create_date +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__create_date +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__date_start +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__date_start +msgid "Date From" +msgstr "Fecha Desde" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__date_range_id +msgid "Date Range" +msgstr "Rango Fechas" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__date_range_type_id +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__date_range_type_id +msgid "Date Range Type" +msgstr "Tipo de Rango de Fecha" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__date_end +msgid "Date To" +msgstr "Fecha Hasta" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__date_end +msgid "Date to" +msgstr "Fecha hasta" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__display_name +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__display_name +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__display_name +msgid "Display Name" +msgstr "Mostrar Nombre" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__id +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__id +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__id +msgid "ID" +msgstr "ID" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__line_ids +msgid "Items" +msgstr "Artículos" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet____last_update +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line____last_update +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard____last_update +msgid "Last Modified on" +msgstr "Última Modificación el" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__write_uid +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__write_uid +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__write_uid +msgid "Last Updated by" +msgstr "Última Actualización por" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__write_date +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__write_date +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__write_date +msgid "Last Updated on" +msgstr "Última Actualización el" + +#. module: mrp_planned_order_matrix +#. odoo-python +#: code:addons/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard.py:0 +#: model:ir.model,name:mrp_planned_order_matrix.model_mrp_planned_order_sheet +#, python-format +msgid "MPS Sheet" +msgstr "Hoja MPS" + +#. module: mrp_planned_order_matrix +#: model:ir.model,name:mrp_planned_order_matrix.model_mrp_planned_order_sheet_line +msgid "MPS Sheet Line" +msgstr "Línea Hoja MPS" + +#. module: mrp_planned_order_matrix +#: model:ir.model,name:mrp_planned_order_matrix.model_mrp_planned_order_wizard +msgid "MPS Wizard" +msgstr "Asistente MPS" + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.stock_mrp_planned_order_sheet_view_form +msgid "MPS quantity" +msgstr "Cantidad MPS" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__mrp_planned_order_ids +msgid "Mrp Planned Order" +msgstr "Orden Planificada Mrp" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__value_x +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.mrp_planned_order_wizard_view_form +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.stock_mrp_planned_order_sheet_view_form +msgid "Period" +msgstr "Periodo" + +#. module: mrp_planned_order_matrix +#. odoo-python +#: code:addons/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard.py:0 +#, python-format +msgid "Planned Orders" +msgstr "Órdenes Planificadas" + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.mrp_planned_order_wizard_view_form +msgid "Prepare" +msgstr "Preparar" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__value_y +msgid "Product" +msgstr "Producto" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__product_mrp_area_ids +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__product_mrp_area_id +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__product_mrp_area_ids +msgid "Product Parameters" +msgstr "Parámetros del Producto" + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.mrp_planned_order_wizard_view_form +msgid "Products" +msgstr "Productos" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__product_qty +msgid "Quantity" +msgstr "Cantidad" + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.stock_mrp_planned_order_sheet_view_form +msgid "TEST DOS" +msgstr "PRUEBA DOS" + +#. module: mrp_planned_order_matrix +#. odoo-python +#: code:addons/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard.py:0 +#, python-format +msgid "The start date cannot be later than the end date." +msgstr "La fecha de inicio no puede ser posterior a la fecha final." + +#. module: mrp_planned_order_matrix +#. odoo-python +#: code:addons/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard.py:0 +#, python-format +msgid "There are no date ranges created." +msgstr "No se han creado intervalos de fechas." + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.stock_mrp_planned_order_sheet_view_form +msgid "Validate" +msgstr "Validar" + +#. module: mrp_planned_order_matrix +#. odoo-python +#: code:addons/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard.py:0 +#, python-format +msgid "You must select at least one Product MRP parameter." +msgstr "Debe seleccionar al menos un parámetro MRP Producto." + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.mrp_planned_order_wizard_view_form +msgid "or" +msgstr "o" + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.mrp_planned_order_wizard_view_form +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.stock_mrp_planned_order_sheet_view_form +msgid "to" +msgstr "a" diff --git a/mrp_planned_order_matrix/i18n/it.po b/mrp_planned_order_matrix/i18n/it.po new file mode 100644 index 0000000000..43fdc9ccc2 --- /dev/null +++ b/mrp_planned_order_matrix/i18n/it.po @@ -0,0 +1,221 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_planned_order_matrix +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-11-16 12:43+0000\n" +"Last-Translator: mymage \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_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.mrp_planned_order_wizard_view_form +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.stock_mrp_planned_order_sheet_view_form +msgid "Cancel" +msgstr "Annulla" + +#. module: mrp_planned_order_matrix +#: model:ir.actions.act_window,name:mrp_planned_order_matrix.action_mrp_planned_order_wizard +#: model:ir.ui.menu,name:mrp_planned_order_matrix.menu_stock_mrp_planned_order_wizard +msgid "Create Fixed Planned Orders" +msgstr "Crea ordini pianificati fissi" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__create_uid +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__create_uid +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__create_date +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__create_date +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__date_start +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__date_start +msgid "Date From" +msgstr "Dalla data" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__date_range_id +msgid "Date Range" +msgstr "Intervallo data" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__date_range_type_id +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__date_range_type_id +msgid "Date Range Type" +msgstr "Tipo intervallo date" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__date_end +msgid "Date To" +msgstr "Alla data" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__date_end +msgid "Date to" +msgstr "Alla data" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__display_name +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__display_name +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__id +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__id +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__id +msgid "ID" +msgstr "ID" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__line_ids +msgid "Items" +msgstr "Elementi" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet____last_update +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line____last_update +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__write_uid +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__write_uid +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__write_date +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__write_date +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: mrp_planned_order_matrix +#. odoo-python +#: code:addons/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard.py:0 +#: model:ir.model,name:mrp_planned_order_matrix.model_mrp_planned_order_sheet +#, python-format +msgid "MPS Sheet" +msgstr "Foglio MPS" + +#. module: mrp_planned_order_matrix +#: model:ir.model,name:mrp_planned_order_matrix.model_mrp_planned_order_sheet_line +msgid "MPS Sheet Line" +msgstr "Riga foglio MPS" + +#. module: mrp_planned_order_matrix +#: model:ir.model,name:mrp_planned_order_matrix.model_mrp_planned_order_wizard +msgid "MPS Wizard" +msgstr "Procedura guidata MPS" + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.stock_mrp_planned_order_sheet_view_form +msgid "MPS quantity" +msgstr "Quantità MPS" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__mrp_planned_order_ids +msgid "Mrp Planned Order" +msgstr "Ordine MRP pianificato" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__value_x +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.mrp_planned_order_wizard_view_form +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.stock_mrp_planned_order_sheet_view_form +msgid "Period" +msgstr "Periodo" + +#. module: mrp_planned_order_matrix +#. odoo-python +#: code:addons/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard.py:0 +#, python-format +msgid "Planned Orders" +msgstr "Ordini pianificati" + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.mrp_planned_order_wizard_view_form +msgid "Prepare" +msgstr "Prepara" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__value_y +msgid "Product" +msgstr "Prodotto" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__product_mrp_area_ids +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__product_mrp_area_id +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__product_mrp_area_ids +msgid "Product Parameters" +msgstr "Parametri prodotto" + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.mrp_planned_order_wizard_view_form +msgid "Products" +msgstr "Prodotti" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__product_qty +msgid "Quantity" +msgstr "Quantità" + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.stock_mrp_planned_order_sheet_view_form +msgid "TEST DOS" +msgstr "DOS TEST" + +#. module: mrp_planned_order_matrix +#. odoo-python +#: code:addons/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard.py:0 +#, python-format +msgid "The start date cannot be later than the end date." +msgstr "La data di inizio non può essere successiva alla data di fine." + +#. module: mrp_planned_order_matrix +#. odoo-python +#: code:addons/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard.py:0 +#, python-format +msgid "There are no date ranges created." +msgstr "Non sono stati creati intervalli date." + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.stock_mrp_planned_order_sheet_view_form +msgid "Validate" +msgstr "Valida" + +#. module: mrp_planned_order_matrix +#. odoo-python +#: code:addons/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard.py:0 +#, python-format +msgid "You must select at least one Product MRP parameter." +msgstr "Bisogna selezionare almeno un parametro MRP prodotto." + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.mrp_planned_order_wizard_view_form +msgid "or" +msgstr "o" + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.mrp_planned_order_wizard_view_form +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.stock_mrp_planned_order_sheet_view_form +msgid "to" +msgstr "al" diff --git a/mrp_planned_order_matrix/i18n/mrp_planned_order_matrix.pot b/mrp_planned_order_matrix/i18n/mrp_planned_order_matrix.pot new file mode 100644 index 0000000000..580d808bcc --- /dev/null +++ b/mrp_planned_order_matrix/i18n/mrp_planned_order_matrix.pot @@ -0,0 +1,218 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_planned_order_matrix +# +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_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.mrp_planned_order_wizard_view_form +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.stock_mrp_planned_order_sheet_view_form +msgid "Cancel" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.actions.act_window,name:mrp_planned_order_matrix.action_mrp_planned_order_wizard +#: model:ir.ui.menu,name:mrp_planned_order_matrix.menu_stock_mrp_planned_order_wizard +msgid "Create Fixed Planned Orders" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__create_uid +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__create_uid +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__create_uid +msgid "Created by" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__create_date +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__create_date +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__create_date +msgid "Created on" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__date_start +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__date_start +msgid "Date From" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__date_range_id +msgid "Date Range" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__date_range_type_id +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__date_range_type_id +msgid "Date Range Type" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__date_end +msgid "Date To" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__date_end +msgid "Date to" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__display_name +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__display_name +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__display_name +msgid "Display Name" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__id +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__id +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__id +msgid "ID" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__line_ids +msgid "Items" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet____last_update +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line____last_update +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard____last_update +msgid "Last Modified on" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__write_uid +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__write_uid +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__write_date +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__write_date +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__write_date +msgid "Last Updated on" +msgstr "" + +#. module: mrp_planned_order_matrix +#. odoo-python +#: code:addons/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard.py:0 +#: model:ir.model,name:mrp_planned_order_matrix.model_mrp_planned_order_sheet +#, python-format +msgid "MPS Sheet" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model,name:mrp_planned_order_matrix.model_mrp_planned_order_sheet_line +msgid "MPS Sheet Line" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model,name:mrp_planned_order_matrix.model_mrp_planned_order_wizard +msgid "MPS Wizard" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.stock_mrp_planned_order_sheet_view_form +msgid "MPS quantity" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__mrp_planned_order_ids +msgid "Mrp Planned Order" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__value_x +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.mrp_planned_order_wizard_view_form +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.stock_mrp_planned_order_sheet_view_form +msgid "Period" +msgstr "" + +#. module: mrp_planned_order_matrix +#. odoo-python +#: code:addons/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard.py:0 +#, python-format +msgid "Planned Orders" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.mrp_planned_order_wizard_view_form +msgid "Prepare" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__value_y +msgid "Product" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet__product_mrp_area_ids +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__product_mrp_area_id +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_wizard__product_mrp_area_ids +msgid "Product Parameters" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.mrp_planned_order_wizard_view_form +msgid "Products" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model:ir.model.fields,field_description:mrp_planned_order_matrix.field_mrp_planned_order_sheet_line__product_qty +msgid "Quantity" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.stock_mrp_planned_order_sheet_view_form +msgid "TEST DOS" +msgstr "" + +#. module: mrp_planned_order_matrix +#. odoo-python +#: code:addons/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard.py:0 +#, python-format +msgid "The start date cannot be later than the end date." +msgstr "" + +#. module: mrp_planned_order_matrix +#. odoo-python +#: code:addons/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard.py:0 +#, python-format +msgid "There are no date ranges created." +msgstr "" + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.stock_mrp_planned_order_sheet_view_form +msgid "Validate" +msgstr "" + +#. module: mrp_planned_order_matrix +#. odoo-python +#: code:addons/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard.py:0 +#, python-format +msgid "You must select at least one Product MRP parameter." +msgstr "" + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.mrp_planned_order_wizard_view_form +msgid "or" +msgstr "" + +#. module: mrp_planned_order_matrix +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.mrp_planned_order_wizard_view_form +#: model_terms:ir.ui.view,arch_db:mrp_planned_order_matrix.stock_mrp_planned_order_sheet_view_form +msgid "to" +msgstr "" diff --git a/mrp_planned_order_matrix/pyproject.toml b/mrp_planned_order_matrix/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/mrp_planned_order_matrix/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/mrp_planned_order_matrix/readme/CONTRIBUTORS.md b/mrp_planned_order_matrix/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..5a82e6e8b5 --- /dev/null +++ b/mrp_planned_order_matrix/readme/CONTRIBUTORS.md @@ -0,0 +1,4 @@ +- ForgeFlow, S.L. () + - Jordi Ballester Alomar \<\> + - Lois Rilo \<\> + - Hector Villarreal \<\> diff --git a/mrp_planned_order_matrix/readme/DESCRIPTION.md b/mrp_planned_order_matrix/readme/DESCRIPTION.md new file mode 100644 index 0000000000..32a64eaa67 --- /dev/null +++ b/mrp_planned_order_matrix/readme/DESCRIPTION.md @@ -0,0 +1 @@ +This module allows to create fixed planned orders using a grid view. diff --git a/mrp_planned_order_matrix/readme/INSTALL.md b/mrp_planned_order_matrix/readme/INSTALL.md new file mode 100644 index 0000000000..c000faa18e --- /dev/null +++ b/mrp_planned_order_matrix/readme/INSTALL.md @@ -0,0 +1,7 @@ +This module relies on: + +- The OCA module '2D matrix for x2many fields', and can be downloaded + from Github: + +- The OCA module 'Date Range', and can be downloaded from Github: + diff --git a/mrp_planned_order_matrix/readme/USAGE.md b/mrp_planned_order_matrix/readme/USAGE.md new file mode 100644 index 0000000000..ccbbdeff61 --- /dev/null +++ b/mrp_planned_order_matrix/readme/USAGE.md @@ -0,0 +1,6 @@ +- Go to *Inventory / Configuration / Date Ranges* and define your + estimating periods. +- Go to *Manufacturing / Planning / Create Fixed Planned Orders* to + create or update your fixed planned orders. +- Go to *Manufacturing / Planning / Planned Orders* to review the + planned orders in the system. diff --git a/mrp_planned_order_matrix/security/ir.model.access.csv b/mrp_planned_order_matrix/security/ir.model.access.csv new file mode 100644 index 0000000000..552213fd7a --- /dev/null +++ b/mrp_planned_order_matrix/security/ir.model.access.csv @@ -0,0 +1,4 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_mrp_planned_order_wizard,mrp.planned.order.wizard user,model_mrp_planned_order_wizard,mrp.group_mrp_user,1,1,1,1 +access_mrp_planned_order_sheet,mrp.planned.order.sheet user,model_mrp_planned_order_sheet,mrp.group_mrp_user,1,1,1,1 +access_mrp_planned_order_sheet_line,mrp.planned.order.sheet.line user,model_mrp_planned_order_sheet_line,mrp.group_mrp_user,1,1,1,1 diff --git a/mrp_planned_order_matrix/static/description/icon.png b/mrp_planned_order_matrix/static/description/icon.png new file mode 100644 index 0000000000..3a0328b516 Binary files /dev/null and b/mrp_planned_order_matrix/static/description/icon.png differ diff --git a/mrp_planned_order_matrix/static/description/index.html b/mrp_planned_order_matrix/static/description/index.html new file mode 100644 index 0000000000..9f54573a89 --- /dev/null +++ b/mrp_planned_order_matrix/static/description/index.html @@ -0,0 +1,452 @@ + + + + + +MRP Planned Order Matrix + + + +
+

MRP Planned Order Matrix

+ + +

Production/Stable License: AGPL-3 OCA/manufacture Translate me on Weblate Try me on Runboat

+

This module allows to create fixed planned orders using a grid view.

+

Table of contents

+ +
+

Installation

+

This module relies on:

+ +
+
+

Usage

+
    +
  • Go to Inventory / Configuration / Date Ranges and define your +estimating periods.
  • +
  • Go to Manufacturing / Planning / Create Fixed Planned Orders to +create or update your fixed planned orders.
  • +
  • Go to Manufacturing / Planning / Planned Orders to review the +planned orders in the system.
  • +
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub 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.

+

Do not contact contributors directly about support or help with technical issues.

+
+
+

Credits

+
+

Authors

+
    +
  • ForgeFlow
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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/manufacture project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/mrp_planned_order_matrix/tests/__init__.py b/mrp_planned_order_matrix/tests/__init__.py new file mode 100644 index 0000000000..30b4f45b73 --- /dev/null +++ b/mrp_planned_order_matrix/tests/__init__.py @@ -0,0 +1 @@ +from . import test_mrp_planned_order_matrix diff --git a/mrp_planned_order_matrix/tests/test_mrp_planned_order_matrix.py b/mrp_planned_order_matrix/tests/test_mrp_planned_order_matrix.py new file mode 100644 index 0000000000..0d6121e2a5 --- /dev/null +++ b/mrp_planned_order_matrix/tests/test_mrp_planned_order_matrix.py @@ -0,0 +1,108 @@ +# Copyright 2020-21 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). + +from dateutil.rrule import MONTHLY + +from odoo import fields + +from odoo.addons.mrp_multi_level.tests.common import TestMrpMultiLevelCommon + + +class TestMrpPlannedOrderMatrix(TestMrpMultiLevelCommon): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.mrp_planned_order_matrix_wiz = cls.env["mrp.planned.order.wizard"] + cls.drt_monthly = cls.env["date.range.type"].create( + {"name": "Month", "allow_overlap": False} + ) + + generator = cls.env["date.range.generator"] + generator = generator.create( + { + "date_start": "1943-01-01", + "name_prefix": "1943-", + "type_id": cls.drt_monthly.id, + "duration_count": 1, + "unit_of_time": str(MONTHLY), + "count": 12, + } + ) + generator.action_apply() + + # Create a product: + cls.product_1 = cls.product_obj.create( + {"name": "Test Product 1", "type": "product", "default_code": "PROD1"} + ) + # Create a product mrp area: + cls.product_mrp_area_1 = cls.product_mrp_area_obj.create( + {"product_id": cls.product_1.id, "mrp_area_id": cls.mrp_area.id} + ) + + def test_01_mrp_planned_order_matrix(self): + """Tests creation of planned orders using matrix wizard.""" + wiz = self.mrp_planned_order_matrix_wiz + wiz = wiz.create( + { + "date_start": "1943-01-01", + "date_end": "1943-12-31", + "date_range_type_id": self.drt_monthly.id, + "product_mrp_area_ids": [(6, 0, [self.product_mrp_area_1.id])], + } + ) + wiz.create_sheet() + sheets = self.env["mrp.planned.order.sheet"].search([]) + for sheet in sheets: + self.assertEqual( + len(sheet.line_ids), + 12, + "There should be 12 lines.", + ) + self.assertEqual( + fields.Date.to_string(sheet.date_start), + "1943-01-01", + "The date start should be 1943-01-01", + ) + self.assertEqual( + fields.Date.to_string(sheet.date_end), + "1943-12-31", + "The date end should be 1943-12-31", + ) + for line in sheet.line_ids: + line.product_qty = 1 + self.assertEqual( + line.product_mrp_area_id.product_id.id, + self.product_1.id, + "The product does not match in the line", + ) + sheet.button_validate() + ranges = self.env["date.range"].search( + [("type_id", "=", self.drt_monthly.id)], + ) + mrp_planned_order_sheet_lines = self.env[ + "mrp.planned.order.sheet.line" + ].search([("date_range_id", "in", ranges.ids)]) + self.assertEqual( + len(mrp_planned_order_sheet_lines), + 12, + "There should be 12 estimate records.", + ) + for planned_order in mrp_planned_order_sheet_lines: + self.assertEqual( + planned_order.product_mrp_area_id.product_id.id, + self.product_1.id, + "The product does not match in the estimate", + ) + self.assertEqual( + planned_order.product_qty, + 1, + "The product qty does not match", + ) + mrp_planned_orders = self.env["mrp.planned.order"].search( + [("product_mrp_area_id", "=", self.product_mrp_area_1.id)] + ) + self.assertEqual( + len(mrp_planned_orders), + 12, + "There should be 12 planned order records.", + ) diff --git a/mrp_planned_order_matrix/wizards/__init__.py b/mrp_planned_order_matrix/wizards/__init__.py new file mode 100644 index 0000000000..534a2f6091 --- /dev/null +++ b/mrp_planned_order_matrix/wizards/__init__.py @@ -0,0 +1 @@ +from . import mrp_planned_order_wizard diff --git a/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard.py b/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard.py new file mode 100644 index 0000000000..804849642d --- /dev/null +++ b/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard.py @@ -0,0 +1,229 @@ +# Copyright 2020-21 ForgeFlow S.L. (https://www.forgeflow.com) +# - Jordi Ballester Alomar +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from datetime import timedelta +from itertools import zip_longest + +from odoo import _, api, fields, models +from odoo.exceptions import UserError, ValidationError +from odoo.osv import expression +from odoo.tools.float_utils import float_compare + + +class MrpPlannedOrderWizard(models.TransientModel): + _name = "mrp.planned.order.wizard" + _description = "MPS Wizard" + + date_start = fields.Date(string="Date From", required=True) + date_end = fields.Date(string="Date To", required=True) + date_range_type_id = fields.Many2one( + string="Date Range Type", + comodel_name="date.range.type", + required=True, + ) + product_mrp_area_ids = fields.Many2many( + string="Product Parameters", comodel_name="product.mrp.area", required=True + ) + + @api.constrains("date_start", "date_end") + def _check_start_end_dates(self): + self.ensure_one() + if self.date_start > self.date_end: + raise ValidationError( + _("The start date cannot be later than the end date.") + ) + + def create_sheet(self): + self.ensure_one() + if not self.product_mrp_area_ids: + raise ValidationError( + _("You must select at least one Product MRP parameter.") + ) + + # 2d matrix widget need real records to work + sheet = self.env["mrp.planned.order.sheet"].create( + { + "date_start": self.date_start, + "date_end": self.date_end, + "date_range_type_id": self.date_range_type_id.id, + "product_mrp_area_ids": [(6, 0, self.product_mrp_area_ids.ids)], + } + ) + sheet._onchange_dates() + res = { + "name": _("MPS Sheet"), + "src_model": "mrp.planned.order.wizard", + "view_mode": "form", + "target": "new", + "res_model": "mrp.planned.order.sheet", + "res_id": sheet.id, + "type": "ir.actions.act_window", + } + return res + + +class MprPlannedOrderSheet(models.TransientModel): + _name = "mrp.planned.order.sheet" + _description = "MPS Sheet" + + date_start = fields.Date(string="Date From", readonly=True) + date_end = fields.Date(string="Date to", readonly=True) + date_range_type_id = fields.Many2one( + string="Date Range Type", + comodel_name="date.range.type", + readonly=True, + ) + product_mrp_area_ids = fields.Many2many( + string="Product Parameters", comodel_name="product.mrp.area" + ) + line_ids = fields.Many2many( + string="Items", comodel_name="mrp.planned.order.sheet.line" + ) + + @api.onchange("date_start", "date_end", "date_range_type_id") + def _onchange_dates(self): + if not all([self.date_start, self.date_end, self.date_range_type_id]): + return + ranges = self._get_ranges() + if not ranges: + raise UserError(_("There are no date ranges created.")) + lines = [] + for rec in self.product_mrp_area_ids: + for d_range in ranges: + items = self.env["mrp.planned.order"].search( + [ + ("product_mrp_area_id", "=", rec.id), + ("due_date", ">=", d_range.date_start), + ("due_date", "<", d_range.date_end), + ("fixed", "=", True), + ] + ) + if items: + uom_qty = sum(items.mapped("mrp_qty")) + item_ids = items.ids + else: + uom_qty = 0.0 + item_ids = [] + lines.append( + [ + 0, + 0, + self._get_default_sheet_line(d_range, rec, uom_qty, item_ids), + ] + ) + self.line_ids = lines + + def _get_ranges(self): + domain_1 = [ + "&", + ("type_id", "=", self.date_range_type_id.id), + "|", + "&", + ("date_start", ">=", self.date_start), + ("date_start", "<=", self.date_end), + "&", + ("date_end", ">=", self.date_start), + ("date_end", "<=", self.date_end), + ] + domain_2 = [ + "&", + ("type_id", "=", self.date_range_type_id.id), + "&", + ("date_start", "<=", self.date_start), + ("date_end", ">=", self.date_start), + ] + domain = expression.OR([domain_1, domain_2]) + ranges = self.env["date.range"].search(domain) + return ranges + + def _get_default_sheet_line(self, d_range, product_mrp, uom_qty, item_ids): + name_y = f"{product_mrp.display_name} - {product_mrp.product_id.uom_id.name}" + values = { + "value_x": d_range.name, + "value_y": name_y, + "date_range_id": d_range.id, + "product_mrp_area_id": product_mrp.id, + "product_qty": uom_qty, + "mrp_planned_order_ids": [(6, 0, item_ids)], + } + return values + + @api.model + def _prepare_planned_order_data(self, line, qty): + calendar = line.product_mrp_area_id.mrp_area_id.calendar_id + due_date = line.date_range_id.date_start + lt = line.product_mrp_area_id.mrp_lead_time + due_date_dt = fields.Datetime.from_string(due_date) + if calendar: + res = calendar.plan_days(-1 * lt - 1, due_date_dt) + release_date = res.date() + else: + release_date = due_date_dt - timedelta(days=lt) + return { + "name": "Planned Order for %s" + % line.product_mrp_area_id.product_id.display_name, + "order_release_date": release_date, + "due_date": due_date, + "product_mrp_area_id": line.product_mrp_area_id.id, + "mrp_qty": qty, + "qty_released": 0.0, + "mrp_action": line.product_mrp_area_id.supply_method, + "fixed": True, + } + + def button_validate(self): + res_ids = [] + for line in self.line_ids: + quantities = [] + qty_to_order = line.product_qty + while qty_to_order > 0.0: + qty = line.product_mrp_area_id._adjust_qty_to_order(qty_to_order) + quantities.append(qty) + qty_to_order -= qty + rounding = line.product_mrp_area_id.product_id.uom_id.rounding + for proposed, current in zip_longest( + quantities, line.mrp_planned_order_ids + ): + if not proposed: + current.unlink() + elif not current: + data = self._prepare_planned_order_data(line, proposed) + item = self.env["mrp.planned.order"].create(data) + res_ids.append(item.id) + elif ( + float_compare( + proposed, current.mrp_qty, precision_rounding=rounding + ) + == 0 + ): + res_ids.append(current.id) + else: + current.mrp_qty = proposed + res_ids.append(current.id) + + res = { + "domain": [("id", "in", res_ids)], + "name": _("Planned Orders"), + "src_model": "mrp.planned.order.wizard", + "view_mode": "tree,form,pivot", + "res_model": "mrp.planned.order", + "type": "ir.actions.act_window", + } + return res + + +class MprPlannedOrderSheetLine(models.TransientModel): + _name = "mrp.planned.order.sheet.line" + _description = "MPS Sheet Line" + + mrp_planned_order_ids = fields.Many2many(comodel_name="mrp.planned.order") + product_mrp_area_id = fields.Many2one( + string="Product Parameters", comodel_name="product.mrp.area" + ) + date_range_id = fields.Many2one( + comodel_name="date.range", + string="Date Range", + ) + value_x = fields.Char(string="Period") + value_y = fields.Char(string="Product") + product_qty = fields.Float(string="Quantity", digits="Product UoM") diff --git a/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard_view.xml b/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard_view.xml new file mode 100644 index 0000000000..e61ff7b9a9 --- /dev/null +++ b/mrp_planned_order_matrix/wizards/mrp_planned_order_wizard_view.xml @@ -0,0 +1,110 @@ + + + + + mrp.planned.order.wizard.form + mrp.planned.order.wizard + +
+ + + + + + + + + + + + + + + + + +
+
+
+
+
+
+ + mrp.planned.order.sheet.form + mrp.planned.order.sheet + +
+ + + + + + + + + + + + + + + +
+
+ +
+
+ + Create Fixed Planned Orders + mrp.planned.order.wizard + form + new + + list + + +