From 85b3ed0962b109d38602dc6a545cbef85bc28aa8 Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Thu, 26 Nov 2015 16:57:39 +0100 Subject: [PATCH] [ADD] mrp_project ================ MRP Project Link ================ This module links projects and tasks to *manufacturing orders* (MO) and *work orders* (WO). Usage ===== In a manufacturing order (MO), you can select a project to be attached to it. If none is selected, a project is automatically created when the MO is confirmed. When the MO starts, a task is created and assigned to the order. --- mrp_project/README.rst | 71 +++++ mrp_project/__init__.py | 5 + mrp_project/__openerp__.py | 29 ++ mrp_project/i18n/es.po | 168 ++++++++++++ mrp_project/i18n/it.po | 168 ++++++++++++ mrp_project/i18n/pt_BR.po | 168 ++++++++++++ mrp_project/i18n/ro.po | 169 ++++++++++++ mrp_project/i18n/sl.po | 169 ++++++++++++ mrp_project/models/__init__.py | 10 + mrp_project/models/account_analytic_line.py | 18 ++ mrp_project/models/mrp_production.py | 93 +++++++ mrp_project/models/project_project.py | 18 ++ mrp_project/models/project_task.py | 31 +++ mrp_project/models/project_task_work.py | 30 +++ mrp_project/static/description/icon.png | Bin 0 -> 11580 bytes mrp_project/static/description/icon.svg | 254 ++++++++++++++++++ mrp_project/tests/__init__.py | 5 + mrp_project/tests/test_mrp_project.py | 77 ++++++ .../views/account_analytic_line_view.xml | 46 ++++ mrp_project/views/mrp_production_view.xml | 32 +++ mrp_project/views/project_project_view.xml | 23 ++ mrp_project/views/project_task_view.xml | 62 +++++ oca_dependencies.txt | 3 +- 23 files changed, 1648 insertions(+), 1 deletion(-) create mode 100644 mrp_project/README.rst create mode 100644 mrp_project/__init__.py create mode 100644 mrp_project/__openerp__.py create mode 100644 mrp_project/i18n/es.po create mode 100644 mrp_project/i18n/it.po create mode 100644 mrp_project/i18n/pt_BR.po create mode 100644 mrp_project/i18n/ro.po create mode 100644 mrp_project/i18n/sl.po create mode 100644 mrp_project/models/__init__.py create mode 100644 mrp_project/models/account_analytic_line.py create mode 100644 mrp_project/models/mrp_production.py create mode 100644 mrp_project/models/project_project.py create mode 100644 mrp_project/models/project_task.py create mode 100644 mrp_project/models/project_task_work.py create mode 100644 mrp_project/static/description/icon.png create mode 100644 mrp_project/static/description/icon.svg create mode 100644 mrp_project/tests/__init__.py create mode 100644 mrp_project/tests/test_mrp_project.py create mode 100644 mrp_project/views/account_analytic_line_view.xml create mode 100644 mrp_project/views/mrp_production_view.xml create mode 100644 mrp_project/views/project_project_view.xml create mode 100644 mrp_project/views/project_task_view.xml diff --git a/mrp_project/README.rst b/mrp_project/README.rst new file mode 100644 index 000000000..19c48965f --- /dev/null +++ b/mrp_project/README.rst @@ -0,0 +1,71 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +================ +MRP Project Link +================ + +This module links projects and tasks to *manufacturing orders* (MO) and +*work orders* (WO). + +Installation +============ + +It depends on the module *mrp_analytic*, that is hosted on +OCA/account-analytic: https://github.com/OCA/account-analytic + +Usage +===== + +In a manufacturing order (MO), you can select a project to be attached to it. +If none is selected, a project is automatically created when the MO is +confirmed. + +When the MO starts, a task is created and assigned to the order. + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/129/8.0 + +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 smashing it by providing a detailed and welcomed `feedback +`_. + +Credits +======= + +Images +------ + +* Original Odoo icons. +* Thanks to https://openclipart.org/detail/15193/Arrow%20set%20%28Comic%29 + +Contributors +------------ + +* Daniel Campos +* Pedro M. Baeza + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +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. + +To contribute to this module, please visit https://odoo-community.org. diff --git a/mrp_project/__init__.py b/mrp_project/__init__.py new file mode 100644 index 000000000..ba6a70dfa --- /dev/null +++ b/mrp_project/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# (c) 2015 Pedro M. Baeza - Serv. Tecnol. Avanzados +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from . import models diff --git a/mrp_project/__openerp__.py b/mrp_project/__openerp__.py new file mode 100644 index 000000000..d7b1ec4a2 --- /dev/null +++ b/mrp_project/__openerp__.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +# (c) 2014 Daniel Campos +# (c) 2015 Pedro M. Baeza - Serv. Tecnol. Avanzados +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +{ + "name": "MRP Project Link", + "summary": "Link production with projects", + "version": "8.0.1.1.0", + "depends": [ + "mrp_analytic", + "project", + ], + 'license': 'AGPL-3', + "author": "OdooMRP team," + "AvanzOSC," + "Serv. Tecnol. Avanzados - Pedro M. Baeza," + "Antiun Ingeniería," + "Odoo Community Association (OCA)", + "category": "Manufacturing", + 'data': [ + "views/mrp_production_view.xml", + "views/project_project_view.xml", + "views/account_analytic_line_view.xml", + "views/project_task_view.xml" + ], + 'installable': True, + 'auto_install': False, +} diff --git a/mrp_project/i18n/es.po b/mrp_project/i18n/es.po new file mode 100644 index 000000000..c1b8a0495 --- /dev/null +++ b/mrp_project/i18n/es.po @@ -0,0 +1,168 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_project +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: odoomrp-wip (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-07 10:44+0000\n" +"PO-Revision-Date: 2015-10-09 10:50+0000\n" +"Last-Translator: Pedro M. Baeza \n" +"Language-Team: Spanish (http://www.transifex.com/oca/odoomrp-wip-8-0/language/es/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: es\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: mrp_project +#: code:addons/mrp_project/models/mrp_production.py:51 +#, python-format +msgid "" +"\n" +" Manufacturing Order: %s\n" +" Product to Produce: [%s]%s\n" +" Quantity to Produce: %s\n" +" Bill of Material: %s\n" +" Planned Date: %s\n" +" " +msgstr "\n Orden de fabricación: %s\n Producto a producir: [%s]%s\n Cantidad a producir: %s\n Lista de materiales: %s\n Fecha planificada: %s\n " + +#. module: mrp_project +#: code:addons/mrp_project/models/mrp_production.py:103 +#, python-format +msgid "" +"\n" +" Manufacturing Order: %s\n" +" Work Order: %s\n" +" Workcenter: %s\n" +" Cycle: %s\n" +" Hour: %s\n" +" " +msgstr "\n Orden de fabricación: %s\n Orden de trabajo: %s\n Centro de producción: %s\n Ciclo: %s\n Hora: %s\n " + +#. module: mrp_project +#: code:addons/mrp_project/models/mrp_production.py:129 +#, python-format +msgid "%s:: WO%s-%s:: %s" +msgstr "%s:: OT%s-%s:: %s" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +#: field:mrp.production,analytic_account_id:0 +msgid "Analytic Account" +msgstr "Cuenta analítica" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_account_analytic_line +msgid "Analytic Line" +msgstr "Línea analítica" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_form_view +msgid "General Accounting" +msgstr "Contabilidad general" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_form_view +#: view:project.task:mrp_project.project_task_mrp_form_view +msgid "MRP Data" +msgstr "Información de fabricación" + +#. module: mrp_project +#: field:procurement.order,main_project_id:0 +#: field:stock.move,main_project_id:0 +msgid "Main Project" +msgstr "Proyecto principal" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +#: view:project.project:mrp_project.project_mrp_procurement_shortcut_form_view +#: view:project.task:mrp_project.project_task_mrp_inh_search_view +msgid "Manufacturing" +msgstr "Fabricación" + +#. module: mrp_project +#: field:account.analytic.line,mrp_production_id:0 +#: model:ir.model,name:mrp_project.model_mrp_production +#: field:project.task,mrp_production_id:0 +msgid "Manufacturing Order" +msgstr "Orden de fabricación" + +#. module: mrp_project +#: model:ir.actions.act_window,name:mrp_project.act_project_2_production_all +msgid "Manufacturing Orders" +msgstr "Órdenes de fabricación" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_procurement_order +msgid "Procurement" +msgstr "Abastecimiento" + +#. module: mrp_project +#: model:ir.actions.act_window,name:mrp_project.act_project_2_procurement_all +#: view:project.project:mrp_project.project_mrp_procurement_shortcut_form_view +msgid "Procurements" +msgstr "Abastecimientos" + +#. module: mrp_project +#: view:project.task:mrp_project.project_task_mrp_form_view +#: view:project.task:mrp_project.project_task_mrp_inh_tree_view +msgid "Product to Produce" +msgstr "Producto a producir" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_mrp_production_product_line +msgid "Production Scheduled Product" +msgstr "Producto planificado de la fabricación" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_project_project +#: field:mrp.production,project_id:0 +msgid "Project" +msgstr "Proyecto" + +#. module: mrp_project +#: field:account.analytic.line,task_id:0 +msgid "Project Task" +msgstr "Tarea de proyecto" + +#. module: mrp_project +#: view:project.task:mrp_project.project_task_mrp_form_view +msgid "Scheduled Products" +msgstr "Productos planificados" + +#. module: mrp_project +#: view:project.task:mrp_project.project_task_mrp_inh_search_view +msgid "Stage" +msgstr "Etapa" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_stock_move +msgid "Stock Move" +msgstr "Movimiento de stock" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_project_task +#: field:mrp.production.product.line,task_id:0 +msgid "Task" +msgstr "Tarea" + +#. module: mrp_project +#: field:account.analytic.line,workorder:0 +#: model:ir.model,name:mrp_project.model_mrp_production_workcenter_line +msgid "Work Order" +msgstr "Orden de trabajo" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +#: view:project.task:mrp_project.project_task_mrp_inh_search_view +msgid "Workorder" +msgstr "Orden de trabajo" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +msgid "group_analytic_account" +msgstr "" diff --git a/mrp_project/i18n/it.po b/mrp_project/i18n/it.po new file mode 100644 index 000000000..a22335367 --- /dev/null +++ b/mrp_project/i18n/it.po @@ -0,0 +1,168 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_project +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: odoomrp-wip (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-11-20 18:10+0000\n" +"PO-Revision-Date: 2015-09-10 16:44+0000\n" +"Last-Translator: <>\n" +"Language-Team: Italian (http://www.transifex.com/oca/odoomrp-wip-8-0/language/it/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: it\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. module: mrp_project +#: code:addons/mrp_project/models/mrp_production.py:51 +#, python-format +msgid "" +"\n" +" Manufacturing Order: %s\n" +" Product to Produce: [%s]%s\n" +" Quantity to Produce: %s\n" +" Bill of Material: %s\n" +" Planned Date: %s\n" +" " +msgstr "" + +#. module: mrp_project +#: code:addons/mrp_project/models/mrp_production.py:103 +#, python-format +msgid "" +"\n" +" Manufacturing Order: %s\n" +" Work Order: %s\n" +" Workcenter: %s\n" +" Cycle: %s\n" +" Hour: %s\n" +" " +msgstr "" + +#. module: mrp_project +#: code:addons/mrp_project/models/mrp_production.py:129 +#, python-format +msgid "%s:: WO%s-%s:: %s" +msgstr "" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +#: field:mrp.production,analytic_account_id:0 +msgid "Analytic Account" +msgstr "" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_account_analytic_line +msgid "Analytic Line" +msgstr "" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_form_view +msgid "General Accounting" +msgstr "" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_form_view +#: view:project.task:mrp_project.project_task_mrp_form_view +msgid "MRP Data" +msgstr "" + +#. module: mrp_project +#: field:procurement.order,main_project_id:0 +#: field:stock.move,main_project_id:0 +msgid "Main Project" +msgstr "" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +#: view:project.project:mrp_project.project_mrp_procurement_shortcut_form_view +#: view:project.task:mrp_project.project_task_mrp_inh_search_view +msgid "Manufacturing" +msgstr "" + +#. module: mrp_project +#: field:account.analytic.line,mrp_production_id:0 +#: model:ir.model,name:mrp_project.model_mrp_production +#: field:project.task,mrp_production_id:0 +msgid "Manufacturing Order" +msgstr "Ordine di produzione" + +#. module: mrp_project +#: model:ir.actions.act_window,name:mrp_project.act_project_2_production_all +msgid "Manufacturing Orders" +msgstr "" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_procurement_order +msgid "Procurement" +msgstr "" + +#. module: mrp_project +#: model:ir.actions.act_window,name:mrp_project.act_project_2_procurement_all +#: view:project.project:mrp_project.project_mrp_procurement_shortcut_form_view +msgid "Procurements" +msgstr "" + +#. module: mrp_project +#: view:project.task:mrp_project.project_task_mrp_form_view +#: view:project.task:mrp_project.project_task_mrp_inh_tree_view +msgid "Product to Produce" +msgstr "" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_mrp_production_product_line +msgid "Production Scheduled Product" +msgstr "" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_project_project +#: field:mrp.production,project_id:0 +msgid "Project" +msgstr "" + +#. module: mrp_project +#: field:account.analytic.line,task_id:0 +msgid "Project Task" +msgstr "" + +#. module: mrp_project +#: view:project.task:mrp_project.project_task_mrp_form_view +msgid "Scheduled Products" +msgstr "" + +#. module: mrp_project +#: view:project.task:mrp_project.project_task_mrp_inh_search_view +msgid "Stage" +msgstr "" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_stock_move +msgid "Stock Move" +msgstr "" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_project_task +#: field:mrp.production.product.line,task_id:0 +msgid "Task" +msgstr "" + +#. module: mrp_project +#: field:account.analytic.line,workorder:0 +#: model:ir.model,name:mrp_project.model_mrp_production_workcenter_line +msgid "Work Order" +msgstr "Ordine di lavorazione" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +#: view:project.task:mrp_project.project_task_mrp_inh_search_view +msgid "Workorder" +msgstr "" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +msgid "group_analytic_account" +msgstr "" diff --git a/mrp_project/i18n/pt_BR.po b/mrp_project/i18n/pt_BR.po new file mode 100644 index 000000000..ebe6ca7fe --- /dev/null +++ b/mrp_project/i18n/pt_BR.po @@ -0,0 +1,168 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_project +# +# Translators: +msgid "" +msgstr "" +"Project-Id-Version: odoomrp-wip (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-07 10:44+0000\n" +"PO-Revision-Date: 2015-10-09 03:38+0000\n" +"Last-Translator: danimaribeiro \n" +"Language-Team: Portuguese (Brazil) (http://www.transifex.com/oca/odoomrp-wip-8-0/language/pt_BR/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: pt_BR\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: mrp_project +#: code:addons/mrp_project/models/mrp_production.py:51 +#, python-format +msgid "" +"\n" +" Manufacturing Order: %s\n" +" Product to Produce: [%s]%s\n" +" Quantity to Produce: %s\n" +" Bill of Material: %s\n" +" Planned Date: %s\n" +" " +msgstr "" + +#. module: mrp_project +#: code:addons/mrp_project/models/mrp_production.py:103 +#, python-format +msgid "" +"\n" +" Manufacturing Order: %s\n" +" Work Order: %s\n" +" Workcenter: %s\n" +" Cycle: %s\n" +" Hour: %s\n" +" " +msgstr "" + +#. module: mrp_project +#: code:addons/mrp_project/models/mrp_production.py:129 +#, python-format +msgid "%s:: WO%s-%s:: %s" +msgstr "" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +#: field:mrp.production,analytic_account_id:0 +msgid "Analytic Account" +msgstr "" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_account_analytic_line +msgid "Analytic Line" +msgstr "" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_form_view +msgid "General Accounting" +msgstr "" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_form_view +#: view:project.task:mrp_project.project_task_mrp_form_view +msgid "MRP Data" +msgstr "" + +#. module: mrp_project +#: field:procurement.order,main_project_id:0 +#: field:stock.move,main_project_id:0 +msgid "Main Project" +msgstr "Projeto principal" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +#: view:project.project:mrp_project.project_mrp_procurement_shortcut_form_view +#: view:project.task:mrp_project.project_task_mrp_inh_search_view +msgid "Manufacturing" +msgstr "" + +#. module: mrp_project +#: field:account.analytic.line,mrp_production_id:0 +#: model:ir.model,name:mrp_project.model_mrp_production +#: field:project.task,mrp_production_id:0 +msgid "Manufacturing Order" +msgstr "Ordem de Produção" + +#. module: mrp_project +#: model:ir.actions.act_window,name:mrp_project.act_project_2_production_all +msgid "Manufacturing Orders" +msgstr "" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_procurement_order +msgid "Procurement" +msgstr "Aprovisionamento" + +#. module: mrp_project +#: model:ir.actions.act_window,name:mrp_project.act_project_2_procurement_all +#: view:project.project:mrp_project.project_mrp_procurement_shortcut_form_view +msgid "Procurements" +msgstr "" + +#. module: mrp_project +#: view:project.task:mrp_project.project_task_mrp_form_view +#: view:project.task:mrp_project.project_task_mrp_inh_tree_view +msgid "Product to Produce" +msgstr "" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_mrp_production_product_line +msgid "Production Scheduled Product" +msgstr "Produção de produto agendada" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_project_project +#: field:mrp.production,project_id:0 +msgid "Project" +msgstr "Projeto" + +#. module: mrp_project +#: field:account.analytic.line,task_id:0 +msgid "Project Task" +msgstr "" + +#. module: mrp_project +#: view:project.task:mrp_project.project_task_mrp_form_view +msgid "Scheduled Products" +msgstr "" + +#. module: mrp_project +#: view:project.task:mrp_project.project_task_mrp_inh_search_view +msgid "Stage" +msgstr "" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_stock_move +msgid "Stock Move" +msgstr "Movimentação de estoque" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_project_task +#: field:mrp.production.product.line,task_id:0 +msgid "Task" +msgstr "" + +#. module: mrp_project +#: field:account.analytic.line,workorder:0 +#: model:ir.model,name:mrp_project.model_mrp_production_workcenter_line +msgid "Work Order" +msgstr "Ordem de serviço" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +#: view:project.task:mrp_project.project_task_mrp_inh_search_view +msgid "Workorder" +msgstr "" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +msgid "group_analytic_account" +msgstr "" diff --git a/mrp_project/i18n/ro.po b/mrp_project/i18n/ro.po new file mode 100644 index 000000000..fc7c224ac --- /dev/null +++ b/mrp_project/i18n/ro.po @@ -0,0 +1,169 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_project +# +# Translators: +# Dorin Hongu , 2015 +msgid "" +msgstr "" +"Project-Id-Version: odoomrp-wip (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-11-20 18:10+0000\n" +"PO-Revision-Date: 2015-11-18 00:34+0000\n" +"Last-Translator: Dorin Hongu \n" +"Language-Team: Romanian (http://www.transifex.com/oca/odoomrp-wip-8-0/language/ro/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: ro\n" +"Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" + +#. module: mrp_project +#: code:addons/mrp_project/models/mrp_production.py:51 +#, python-format +msgid "" +"\n" +" Manufacturing Order: %s\n" +" Product to Produce: [%s]%s\n" +" Quantity to Produce: %s\n" +" Bill of Material: %s\n" +" Planned Date: %s\n" +" " +msgstr "" + +#. module: mrp_project +#: code:addons/mrp_project/models/mrp_production.py:103 +#, python-format +msgid "" +"\n" +" Manufacturing Order: %s\n" +" Work Order: %s\n" +" Workcenter: %s\n" +" Cycle: %s\n" +" Hour: %s\n" +" " +msgstr "" + +#. module: mrp_project +#: code:addons/mrp_project/models/mrp_production.py:129 +#, python-format +msgid "%s:: WO%s-%s:: %s" +msgstr "" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +#: field:mrp.production,analytic_account_id:0 +msgid "Analytic Account" +msgstr "Cont analitic" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_account_analytic_line +msgid "Analytic Line" +msgstr "" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_form_view +msgid "General Accounting" +msgstr "Contabilitate generală" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_form_view +#: view:project.task:mrp_project.project_task_mrp_form_view +msgid "MRP Data" +msgstr "" + +#. module: mrp_project +#: field:procurement.order,main_project_id:0 +#: field:stock.move,main_project_id:0 +msgid "Main Project" +msgstr "Proiect principal" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +#: view:project.project:mrp_project.project_mrp_procurement_shortcut_form_view +#: view:project.task:mrp_project.project_task_mrp_inh_search_view +msgid "Manufacturing" +msgstr "Fabricație" + +#. module: mrp_project +#: field:account.analytic.line,mrp_production_id:0 +#: model:ir.model,name:mrp_project.model_mrp_production +#: field:project.task,mrp_production_id:0 +msgid "Manufacturing Order" +msgstr "Comandă fabricație" + +#. module: mrp_project +#: model:ir.actions.act_window,name:mrp_project.act_project_2_production_all +msgid "Manufacturing Orders" +msgstr "Comenzi fabricație" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_procurement_order +msgid "Procurement" +msgstr "Aprovizionare" + +#. module: mrp_project +#: model:ir.actions.act_window,name:mrp_project.act_project_2_procurement_all +#: view:project.project:mrp_project.project_mrp_procurement_shortcut_form_view +msgid "Procurements" +msgstr "Aprovizionări" + +#. module: mrp_project +#: view:project.task:mrp_project.project_task_mrp_form_view +#: view:project.task:mrp_project.project_task_mrp_inh_tree_view +msgid "Product to Produce" +msgstr "" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_mrp_production_product_line +msgid "Production Scheduled Product" +msgstr "" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_project_project +#: field:mrp.production,project_id:0 +msgid "Project" +msgstr "Proiect" + +#. module: mrp_project +#: field:account.analytic.line,task_id:0 +msgid "Project Task" +msgstr "Sarcină proiect" + +#. module: mrp_project +#: view:project.task:mrp_project.project_task_mrp_form_view +msgid "Scheduled Products" +msgstr "" + +#. module: mrp_project +#: view:project.task:mrp_project.project_task_mrp_inh_search_view +msgid "Stage" +msgstr "Stadiu" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_stock_move +msgid "Stock Move" +msgstr "Mișcare stoc" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_project_task +#: field:mrp.production.product.line,task_id:0 +msgid "Task" +msgstr "Sarcină" + +#. module: mrp_project +#: field:account.analytic.line,workorder:0 +#: model:ir.model,name:mrp_project.model_mrp_production_workcenter_line +msgid "Work Order" +msgstr "Comandă de lucru" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +#: view:project.task:mrp_project.project_task_mrp_inh_search_view +msgid "Workorder" +msgstr "Comandă de lucru" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +msgid "group_analytic_account" +msgstr "group_analytic_account" diff --git a/mrp_project/i18n/sl.po b/mrp_project/i18n/sl.po new file mode 100644 index 000000000..ed9f67810 --- /dev/null +++ b/mrp_project/i18n/sl.po @@ -0,0 +1,169 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * mrp_project +# +# Translators: +# Matjaž Mozetič , 2015 +msgid "" +msgstr "" +"Project-Id-Version: odoomrp-wip (8.0)\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-10-07 10:44+0000\n" +"PO-Revision-Date: 2015-09-20 19:00+0000\n" +"Last-Translator: Matjaž Mozetič \n" +"Language-Team: Slovenian (http://www.transifex.com/oca/odoomrp-wip-8-0/language/sl/)\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Language: sl\n" +"Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);\n" + +#. module: mrp_project +#: code:addons/mrp_project/models/mrp_production.py:51 +#, python-format +msgid "" +"\n" +" Manufacturing Order: %s\n" +" Product to Produce: [%s]%s\n" +" Quantity to Produce: %s\n" +" Bill of Material: %s\n" +" Planned Date: %s\n" +" " +msgstr "\n Proizvodni nalog: %s\n Proizvodi za proizvodnjo: [%s]%s\n Količina za proizvodnjo: %s\n Kosovnica: %s\n Načrtovani datum: %s\n " + +#. module: mrp_project +#: code:addons/mrp_project/models/mrp_production.py:103 +#, python-format +msgid "" +"\n" +" Manufacturing Order: %s\n" +" Work Order: %s\n" +" Workcenter: %s\n" +" Cycle: %s\n" +" Hour: %s\n" +" " +msgstr "\n Proizvodni nalog: %s\n Delovni nalog: %s\n Delovni center: %s\n Cikel: %s\n Ur: %s\n " + +#. module: mrp_project +#: code:addons/mrp_project/models/mrp_production.py:129 +#, python-format +msgid "%s:: WO%s-%s:: %s" +msgstr "%s:: WO%s-%s:: %s" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +#: field:mrp.production,analytic_account_id:0 +msgid "Analytic Account" +msgstr "Analitični konto" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_account_analytic_line +msgid "Analytic Line" +msgstr "Analitična postavka" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_form_view +msgid "General Accounting" +msgstr "Glavna knjiga" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_form_view +#: view:project.task:mrp_project.project_task_mrp_form_view +msgid "MRP Data" +msgstr "Podatki upravljanja proizvodnje" + +#. module: mrp_project +#: field:procurement.order,main_project_id:0 +#: field:stock.move,main_project_id:0 +msgid "Main Project" +msgstr "Glavni projekt" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +#: view:project.project:mrp_project.project_mrp_procurement_shortcut_form_view +#: view:project.task:mrp_project.project_task_mrp_inh_search_view +msgid "Manufacturing" +msgstr "Proizvodnja" + +#. module: mrp_project +#: field:account.analytic.line,mrp_production_id:0 +#: model:ir.model,name:mrp_project.model_mrp_production +#: field:project.task,mrp_production_id:0 +msgid "Manufacturing Order" +msgstr "Proizvodni nalog" + +#. module: mrp_project +#: model:ir.actions.act_window,name:mrp_project.act_project_2_production_all +msgid "Manufacturing Orders" +msgstr "Proizvodni nalogi" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_procurement_order +msgid "Procurement" +msgstr "Oskrba" + +#. module: mrp_project +#: model:ir.actions.act_window,name:mrp_project.act_project_2_procurement_all +#: view:project.project:mrp_project.project_mrp_procurement_shortcut_form_view +msgid "Procurements" +msgstr "Oskrbe" + +#. module: mrp_project +#: view:project.task:mrp_project.project_task_mrp_form_view +#: view:project.task:mrp_project.project_task_mrp_inh_tree_view +msgid "Product to Produce" +msgstr "Proiz. za proizvodnjo" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_mrp_production_product_line +msgid "Production Scheduled Product" +msgstr "Proizvod načrtovan za proizvodnjo" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_project_project +#: field:mrp.production,project_id:0 +msgid "Project" +msgstr "Projekt" + +#. module: mrp_project +#: field:account.analytic.line,task_id:0 +msgid "Project Task" +msgstr "Projektno opravilo" + +#. module: mrp_project +#: view:project.task:mrp_project.project_task_mrp_form_view +msgid "Scheduled Products" +msgstr "Načrtovani proizvodi" + +#. module: mrp_project +#: view:project.task:mrp_project.project_task_mrp_inh_search_view +msgid "Stage" +msgstr "Stopnja" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_stock_move +msgid "Stock Move" +msgstr "Premik zaloge" + +#. module: mrp_project +#: model:ir.model,name:mrp_project.model_project_task +#: field:mrp.production.product.line,task_id:0 +msgid "Task" +msgstr "Opravilo" + +#. module: mrp_project +#: field:account.analytic.line,workorder:0 +#: model:ir.model,name:mrp_project.model_mrp_production_workcenter_line +msgid "Work Order" +msgstr "Delovni nalog" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +#: view:project.task:mrp_project.project_task_mrp_inh_search_view +msgid "Workorder" +msgstr "Delovni nalog" + +#. module: mrp_project +#: view:account.analytic.line:mrp_project.account_analytic_line_mrp_search_view +msgid "group_analytic_account" +msgstr "group_analytic_account" diff --git a/mrp_project/models/__init__.py b/mrp_project/models/__init__.py new file mode 100644 index 000000000..d5f8df4b3 --- /dev/null +++ b/mrp_project/models/__init__.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# (c) 2014 Daniel Campos +# (c) 2015 Pedro M. Baeza - Serv. Tecnol. Avanzados +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from . import mrp_production +from . import account_analytic_line +from . import project_project +from . import project_task +from . import project_task_work diff --git a/mrp_project/models/account_analytic_line.py b/mrp_project/models/account_analytic_line.py new file mode 100644 index 000000000..9f613a8fc --- /dev/null +++ b/mrp_project/models/account_analytic_line.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +# (c) 2014 Daniel Campos +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from openerp import models, fields + + +class AccountAnalyticLine(models.Model): + + _inherit = 'account.analytic.line' + + mrp_production_id = fields.Many2one( + comodel_name='mrp.production', string='Manufacturing Order', + related="task_id.mrp_production_id", store=True) + workorder = fields.Many2one( + comodel_name='mrp.production.workcenter.line', string='Work Order', + related="task_id.workorder", store=True) + task_id = fields.Many2one('project.task', 'Project Task') diff --git a/mrp_project/models/mrp_production.py b/mrp_project/models/mrp_production.py new file mode 100644 index 000000000..c43a16f79 --- /dev/null +++ b/mrp_project/models/mrp_production.py @@ -0,0 +1,93 @@ +# -*- coding: utf-8 -*- +# (c) 2014 Daniel Campos +# (c) 2015 Pedro M. Baeza - Serv. Tecnol. Avanzados +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from openerp import models, fields, api, _ + + +class MrpProduction(models.Model): + _inherit = 'mrp.production' + + project_id = fields.Many2one( + comodel_name="project.project", string="Project", copy=False, + readonly=True, states={'draft': [('readonly', False)]}) + analytic_account_id = fields.Many2one( + related="project_id.analytic_account_id", store=True) + + @api.model + def _prepare_project_vals(self, production): + return { + 'name': production.name, + 'use_tasks': True, + 'automatic_creation': True, + } + + @api.model + def _prepare_production_task(self, production): + product = production.product_id + task_name = "%s::%s%s" % ( + production.name, + "[%s] " % product.default_code if product.default_code else "", + product.name) + task_descr = _(""" + Manufacturing Order: %s + Product to Produce: [%s]%s + Quantity to Produce: %s + Bill of Material: %s + Planned Date: %s + """) % (production.name, production.product_id.default_code, + production.product_id.name, production.product_qty, + production.bom_id.name, production.date_planned) + return { + 'mrp_production_id': production.id, + 'user_id': production.user_id.id, + 'reviewer_id': production.user_id.id, + 'name': task_name, + 'project_id': production.project_id.id, + 'description': task_descr + } + + @api.multi + def action_in_production(self): + task_obj = self.env['project.task'] + for record in self: + task_domain = [('mrp_production_id', '=', record.id), + ('workorder', '=', False)] + tasks = task_obj.search(task_domain) + if not tasks: + task_obj.create(self._prepare_production_task(record)) + return super(MrpProduction, self).action_in_production() + + @api.multi + def action_confirm(self): + project_obj = self.env['project.project'] + result = super(MrpProduction, self).action_confirm() + for production in self: + if not production.project_id: + project_vals = self._prepare_project_vals(production) + project = project_obj.create(project_vals) + production.project_id = project.id + return result + + @api.multi + def unlink(self): + projects = self.mapped('project_id').filtered('automatic_creation') + tasks = self.env['project.task'].search( + [('project_id', 'in', projects.ids)]) + if not tasks.mapped('work_ids'): + child_tasks = tasks.filtered(lambda x: x.parent_ids) + child_tasks.unlink() + (tasks - child_tasks).unlink() + projects.unlink() + return super(MrpProduction, self).unlink() + + +class MrpProductionWorkcenterLine(models.Model): + _inherit = 'mrp.production.workcenter.line' + + task_ids = fields.One2many( + comodel_name="project.task", inverse_name="workorder", string="Tasks") + work_ids = fields.One2many( + comodel_name="project.task.work", inverse_name="workorder", + string="Task works") diff --git a/mrp_project/models/project_project.py b/mrp_project/models/project_project.py new file mode 100644 index 000000000..26915002c --- /dev/null +++ b/mrp_project/models/project_project.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- +# (c) 2014 Daniel Campos +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from openerp import models, fields, api + + +class ProjectProject(models.Model): + _inherit = 'project.project' + + @api.one + def _project_shortcut_count(self): + self.production_count = len( + self.env['mrp.production'].search([('project_id', '=', self.id)])) + + production_count = fields.Integer( + string='Manufacturing Count', compute=_project_shortcut_count) + automatic_creation = fields.Boolean('Automatic Creation') diff --git a/mrp_project/models/project_task.py b/mrp_project/models/project_task.py new file mode 100644 index 000000000..3679d583c --- /dev/null +++ b/mrp_project/models/project_task.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +# (c) 2014 Daniel Campos +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from openerp import models, fields, api + + +class ProjectTask(models.Model): + _inherit = 'project.task' + + workorder = fields.Many2one( + comodel_name='mrp.production.workcenter.line', string='Work Order', + oldname='wk_order') + mrp_production_id = fields.Many2one( + 'mrp.production', string='Manufacturing Order') + production_scheduled_products = fields.One2many( + comodel_name="mrp.production.product.line", inverse_name='task_id', + related='mrp_production_id.product_lines', string='Scheduled Products') + final_product = fields.Many2one( + comodel_name='product.product', string='Product to Produce', + store=False, related='mrp_production_id.product_id') + + @api.multi + def name_get(self): + if self.env.context.get('name_show_user'): + res = [] + for task in self: + res.append( + (task.id, "[%s] %s" % (task.user_id.name, task.name))) + return res + return super(ProjectTask, self).name_get() diff --git a/mrp_project/models/project_task_work.py b/mrp_project/models/project_task_work.py new file mode 100644 index 000000000..b7326b4f1 --- /dev/null +++ b/mrp_project/models/project_task_work.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# (c) 2015 Pedro M. Baeza - Serv. Tecnol. Avanzados +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from openerp import models, fields, api +from datetime import datetime + + +class ProjectTaskWork(models.Model): + _inherit = 'project.task.work' + + workorder = fields.Many2one( + comodel_name="mrp.production.workcenter.line", + related="task_id.workorder", store=True, string="Work order") + + @api.multi + def button_end_work(self): + end_date = datetime.now() + for work in self: + date = fields.Datetime.from_string(work.date) + work.hours = (end_date - date).total_seconds() / 3600 + return True + + @api.multi + def onchange_task_id(self, task_id): + res = {} + if task_id: + task = self.env['project.task'].browse(task_id) + res['value'] = {'user_id': task.user_id.id} + return res diff --git a/mrp_project/static/description/icon.png b/mrp_project/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a8d86ad8dd22e378a0637cdbb1bfc2b6fdcd8875 GIT binary patch literal 11580 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 + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/mrp_project/tests/__init__.py b/mrp_project/tests/__init__.py new file mode 100644 index 000000000..4c6c678ed --- /dev/null +++ b/mrp_project/tests/__init__.py @@ -0,0 +1,5 @@ +# -*- coding: utf-8 -*- +# (c) 2015 Pedro M. Baeza - Serv. Tecnol. Avanzados +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +from . import test_mrp_project diff --git a/mrp_project/tests/test_mrp_project.py b/mrp_project/tests/test_mrp_project.py new file mode 100644 index 000000000..cbc070785 --- /dev/null +++ b/mrp_project/tests/test_mrp_project.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +# (c) 2015 Pedro M. Baeza - Serv. Tecnol. Avanzados +# License AGPL-3 - See http://www.gnu.org/licenses/agpl-3.0.html + +import time +import openerp.tests.common as common +from openerp import fields + + +class TestMrpProject(common.TransactionCase): + def setUp(self): + super(TestMrpProject, self).setUp() + self.product = self.env['product.product'].create({'name': 'Test'}) + self.bom = self.env['mrp.bom'].create( + { + 'product_id': self.product.id, + 'product_tmpl_id': self.product.product_tmpl_id.id, + }) + self.production = self.env['mrp.production'].create( + { + 'product_id': self.product.id, + 'product_uom': self.env.ref('product.product_uom_unit').id, + 'bom_id': self.bom.id, + }) + self.task = self.env['project.task'].create({ + 'name': "Test", + 'user_id': self.env.uid, + }) + + def test_project_full(self): + self.assertFalse(self.production.project_id) + self.production.signal_workflow('button_confirm') + self.assertTrue(self.production.project_id) + self.assertEqual(self.production.project_id.production_count, 1) + self.production.force_production() + # start the MO (and this starts the first WO) + self.assertFalse(self.production.project_id.task_ids) + self.production.signal_workflow('button_produce') + self.assertEqual(len(self.production.project_id.task_ids), 1) + # Remove production to see if the project is removed + project = self.production.project_id + self.production.signal_workflow('button_cancel') + self.production.unlink() + self.assertFalse(project.exists()) + + def test_preservation_project_with_works(self): + self.production.signal_workflow('button_confirm') + self.production.force_production() + self.production.signal_workflow('button_produce') + work = self.env['project.task.work'].create( + {'task_id': self.production.project_id.task_ids[0].id, + 'name': 'Test work', + 'user_id': self.env.user.id, + 'hours': 1.0}) + # Remove production to see if the project is removed + project = self.production.project_id + self.production.signal_workflow('button_cancel') + self.production.unlink() + self.assertTrue(project.exists()) + self.assertTrue(work.exists()) + + def test_task_name(self): + self.assertEqual( + self.task.with_context(name_show_user=True).name_get()[0][1], + "[%s] Test" % self.env.user.name) + + def test_onchange_task(self): + res = self.env['project.task.work'].onchange_task_id(self.task.id) + self.assertEqual(res['value']['user_id'], self.task.user_id.id) + + def test_button_end_work(self): + work = self.env['project.task.work'].create( + {'task_id': self.task.id, + 'date': fields.Datetime.now()}) + time.sleep(1) + work.button_end_work() + self.assertNotEqual(work.hours, 0.0) diff --git a/mrp_project/views/account_analytic_line_view.xml b/mrp_project/views/account_analytic_line_view.xml new file mode 100644 index 000000000..24c95a737 --- /dev/null +++ b/mrp_project/views/account_analytic_line_view.xml @@ -0,0 +1,46 @@ + + + + account.analytic.line.mrp.inh.search + account.analytic.line + + + + + + + + + + + + group_analytic_account + + + + + account.analytic.line.mrp.inh.tree + account.analytic.line + + + + + + + + + + account.analytic.line.mrp.inh.form + account.analytic.line + + + + + + + + + + + + diff --git a/mrp_project/views/mrp_production_view.xml b/mrp_project/views/mrp_production_view.xml new file mode 100644 index 000000000..14b509399 --- /dev/null +++ b/mrp_project/views/mrp_production_view.xml @@ -0,0 +1,32 @@ + + + + + mrp.production.project.inh.form + mrp.production + + + + 1 + + + + + + + + + Manufacturing Orders + mrp.production + tree,form + { + 'search_default_project_id': [active_id], + 'default_project_id': active_id, + 'active_test': False, + } + + [('project_id', '=', active_id)] + + + + diff --git a/mrp_project/views/project_project_view.xml b/mrp_project/views/project_project_view.xml new file mode 100644 index 000000000..afa1ab7f2 --- /dev/null +++ b/mrp_project/views/project_project_view.xml @@ -0,0 +1,23 @@ + + + + + project.shortcuts.mrp.procurement.form + project.project + + +
+ +
+
+
+ +
+
diff --git a/mrp_project/views/project_task_view.xml b/mrp_project/views/project_task_view.xml new file mode 100644 index 000000000..c5c909a59 --- /dev/null +++ b/mrp_project/views/project_task_view.xml @@ -0,0 +1,62 @@ + + + + + project.task.mrp.inh.search + project.task + + + + + + + + + + + + + + + project.task.mrp.inh.tree + project.task + + + + + + + + + + + + project.task.mrp.inh.form + project.task + + + + + + + + + + + + + + + + + + diff --git a/oca_dependencies.txt b/oca_dependencies.txt index 0f49141ed..8e9d3e0ce 100644 --- a/oca_dependencies.txt +++ b/oca_dependencies.txt @@ -1,3 +1,4 @@ # List the OCA project dependencies, one per line # Add a repository url and branch if you need a forked version -product-attribute \ No newline at end of file +product-attribute +account-analytic