Skip to content

Instantly share code, notes, and snippets.

/README Secret

Created January 12, 2018 17:36
Show Gist options
  • Select an option

  • Save anonymous/b2b31605b95d0ff8b98ab1aef70fecbd to your computer and use it in GitHub Desktop.

Select an option

Save anonymous/b2b31605b95d0ff8b98ab1aef70fecbd to your computer and use it in GitHub Desktop.
Difference between PLM commits in FlectraRepo2-3
This file contains a diff of the patches for the addition of the PLM module
in the flectrahq/flectra repository on the version of December 18 and the version
on December 25:
- The December 18 repo introduced the PLM module at f2c8307c0bbd06745c5785d26e1814397e79602a
- The December 25 repo introduced the PLM module at 1dc5938298ac15a33ab9028c10faa5358c8fc44d
Unfortunately there are too many changes and rewrite to make a normal recursive diff useful,
so this is a diff of patches - quite unusual and difficult to read. The bottom line of the
patch is the addition of a lot of files, so the different prefixes have these meanings:
- ' +' = lines that are present in both versions
- '-+' = lines removed in the newer version (1dc5938298ac15a33ab9028c10faa5358c8fc44d)
- '++' = lines added in the newer version (1dc5938298ac15a33ab9028c10faa5358c8fc44d)
--- /tmp/b4.patch 2017-12-26 02:36:57.706215174 +0100
+++ /tmp/after.patch 2017-12-26 02:37:32.126804547 +0100
@@ -1,14 +1,10 @@
-commit f2c8307c0bbd06745c5785d26e1814397e79602a
+commit 1dc5938298ac15a33ab9028c10faa5358c8fc44d
Author: Riddhi Kansara <riddhi@techreceptives.com>
-AuthorDate: 2017-12-12 14:49:28 +0530
-Commit: Parthiv Patel <parthivgls@gmail.com>
-CommitDate: 2017-12-14 06:37:37 +0530
+AuthorDate: 2017-11-30 14:00:00 +0100
+Commit: Siddharth Bhalgami <siddharth.bhalgami@techreceptives.com>
+CommitDate: 2017-12-23 15:36:05 +0530
- [ADD]ADD PLM module
-
- [FIX]manifest author for PLM
-
- [FIX]manifest author for PLM
+ [ADD]Add PLM module
diff --git addons/plm/__init__.py addons/plm/__init__.py
new file mode 100755
@@ -22,40 +18,43 @@
+from . import wizard
diff --git addons/plm/__manifest__.py addons/plm/__manifest__.py
new file mode 100644
-index 0000000..73f36ad
+index 0000000..e384239
--- /dev/null
+++ addons/plm/__manifest__.py
-@@ -0,0 +1,38 @@
+@@ -0,0 +1,41 @@
+# Part of Flectra. See LICENSE file for full copyright and licensing details.
+
+{
-+ 'name': 'PLM',
++ 'name': 'Manufacturing - Product Lifecycle Management',
+ 'version': "1.0",
-+ 'category': 'Product Life Cycle Management (PLM)',
-+ 'summary': 'Changes in Bill of Materials, Routings, Versions,'
-+ 'Engineering Change Orders',
-+ 'description': 'Changes in Bill of Materials, Routings, Versions,'
-+ 'Engineering Change Orders',
++ 'category': 'Manufacturing',
++ 'summary': 'Product Lifecycle Management for Flectra',
++ 'description': '''
++ Manage Product Lifecycle (PLM) along with following features:
++ - Engineering change requests
++ - Engineering change orders
++ - BoM versioning
++ - Routing versioning
++ ''',
+ "author": "Flectra",
+ 'website': 'https://flectrahq.com',
-+ 'depends': ['sale_management', 'mrp', 'document', 'mail', 'fetchmail',
-+ 'utm', ],
++ 'depends': ['sale_management', 'mrp', 'document'],
+ 'data': [
++ 'security/plm_security.xml',
++ 'security/ir.model.access.csv',
+ 'data/ir_sequence_data.xml',
-+ 'data/ecr_category_data.xml',
+ 'data/ecr_eco_data.xml',
++ 'data/ecr_category_data.xml',
++ 'data/mrp_bom_data.xml',
+ 'wizard/process_wizard_views.xml',
-+ 'security/plm_security.xml',
-+ 'security/ir.model.access.csv',
-+ 'views/plm_ecr_views.xml',
++ 'views/engineering_change_request_views.xml',
++ 'views/engineering_change_order_views.xml',
++ 'views/bom_views.xml',
++ 'views/production_views.xml',
++ 'views/routing_views.xml',
+ 'views/plm_category_views.xml',
-+ 'views/plm_eco_views.xml',
-+ 'views/mrp_bom_views.xml',
-+ 'data/mrp_bom_data.xml',
-+ 'views/mrp_production_views.xml',
-+ 'views/mrp_routing_views.xml',
++ 'views/plm_team_views.xml',
+ 'views/res_users_views.xml',
-+ 'views/plm_team_views.xml'
+ ],
+ 'demo': [
+ 'demo/plm_so_mo_demo.xml',
@@ -100,113 +99,113 @@
+</flectra>
diff --git addons/plm/data/ecr_eco_data.xml addons/plm/data/ecr_eco_data.xml
new file mode 100644
-index 0000000..9083cbd
+index 0000000..f08c0c3
--- /dev/null
+++ addons/plm/data/ecr_eco_data.xml
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
-+<flectra>
-+ <data noupdate="1">
++<flectra noupdate="1">
++
++ <record id="mt_ecr_create" model="mail.message.subtype">
++ <field name="name">ECR Create</field>
++ <field name="res_model">engineering.change.request</field>
++ <field name="default" eval="False"/>
++ <field name="description">ECR Create</field>
++ </record>
++
++ <record id="mt_ecr_team_create" model="mail.message.subtype">
++ <field name="name">ECR Create</field>
++ <field name="sequence">21</field>
++ <field name="res_model">plm.team</field>
++ <field name="parent_id" eval="ref('plm.mt_ecr_create')"/>
++ <field name="relation_field">requested_by</field>
++ </record>
++
++ <record id="mt_plm_review" model="mail.message.subtype">
++ <field name="name">ECR Review</field>
++ <field name="res_model">engineering.change.request</field>
++ <field name="default" eval="False"/>
++ <field name="description">ECR Review</field>
++ </record>
++
++ <record id="mt_plm_team_review" model="mail.message.subtype">
++ <field name="name">ECR Review</field>
++ <field name="sequence">21</field>
++ <field name="res_model">plm.team</field>
++ <field name="parent_id" eval="ref('plm.mt_plm_review')"/>
++ <field name="relation_field">category_ids.team_id</field>
++ </record>
++
++ <record id="mt_plm_approve" model="mail.message.subtype">
++ <field name="name">ECR Approve</field>
++ <field name="res_model">engineering.change.request</field>
++ <field name="default" eval="False"/>
++ <field name="description">ECR Approve</field>
++ </record>
++
++ <record id="mt_plm_team_approve" model="mail.message.subtype">
++ <field name="name">ECR Approve</field>
++ <field name="sequence">21</field>
++ <field name="res_model">plm.team</field>
++ <field name="parent_id" eval="ref('plm.mt_plm_approve')"/>
++ <field name="relation_field">category_ids.team_id</field>
++ </record>
++
++ <record id="mt_plm_reject" model="mail.message.subtype">
++ <field name="name">ECR Reject</field>
++ <field name="res_model">engineering.change.request</field>
++ <field name="default" eval="False"/>
++ <field name="description">ECR Reject</field>
++ </record>
++
++ <record id="mt_plm_team_reject" model="mail.message.subtype">
++ <field name="name">ECR Reject</field>
++ <field name="sequence">21</field>
++ <field name="res_model">plm.team</field>
++ <field name="parent_id" eval="ref('plm.mt_plm_reject')"/>
++ <field name="relation_field">category_ids.team_id</field>
++ </record>
++
++ <record id="mt_engineering_change_order_create"
++ model="mail.message.subtype">
++ <field name="name">ECO Create</field>
++ <field name="res_model">engineering.change.order</field>
++ <field name="default" eval="False"/>
++ <field name="description">ECO Create</field>
++ </record>
+
-+ <record id="mt_ecr_create" model="mail.message.subtype">
-+ <field name="name">ECR Create</field>
-+ <field name="res_model">plm.ecr</field>
-+ <field name="default" eval="False"/>
-+ <field name="description">ECR Create</field>
-+ </record>
-+
-+ <record id="mt_ecr_team_create" model="mail.message.subtype">
-+ <field name="name">ECR Create</field>
-+ <field name="sequence">21</field>
-+ <field name="res_model">plm.team</field>
-+ <field name="parent_id" eval="ref('plm.mt_ecr_create')"/>
-+ <field name="relation_field">requested_by</field>
-+ </record>
-+
-+ <record id="mt_plm_review" model="mail.message.subtype">
-+ <field name="name">ECR Review</field>
-+ <field name="res_model">plm.ecr</field>
-+ <field name="default" eval="False"/>
-+ <field name="description">ECR Review</field>
-+ </record>
-+
-+ <record id="mt_plm_team_review" model="mail.message.subtype">
-+ <field name="name">ECR Review</field>
-+ <field name="sequence">21</field>
-+ <field name="res_model">plm.team</field>
-+ <field name="parent_id" eval="ref('plm.mt_plm_review')"/>
-+ <field name="relation_field">category_ids.team_id</field>
-+ </record>
-+
-+ <record id="mt_plm_approve" model="mail.message.subtype">
-+ <field name="name">ECR Approve</field>
-+ <field name="res_model">plm.ecr</field>
-+ <field name="default" eval="False"/>
-+ <field name="description">ECR Approve</field>
-+ </record>
-+
-+ <record id="mt_plm_team_approve" model="mail.message.subtype">
-+ <field name="name">ECR Approve</field>
-+ <field name="sequence">21</field>
-+ <field name="res_model">plm.team</field>
-+ <field name="parent_id" eval="ref('plm.mt_plm_approve')"/>
-+ <field name="relation_field">category_ids.team_id</field>
-+ </record>
-+
-+ <record id="mt_plm_reject" model="mail.message.subtype">
-+ <field name="name">ECR Reject</field>
-+ <field name="res_model">plm.ecr</field>
-+ <field name="default" eval="False"/>
-+ <field name="description">ECR Reject</field>
-+ </record>
-+
-+ <record id="mt_plm_team_reject" model="mail.message.subtype">
-+ <field name="name">ECR Reject</field>
-+ <field name="sequence">21</field>
-+ <field name="res_model">plm.team</field>
-+ <field name="parent_id" eval="ref('plm.mt_plm_reject')"/>
-+ <field name="relation_field">category_ids.team_id</field>
-+ </record>
-+
-+ <record id="mt_plm_eco_create" model="mail.message.subtype">
-+ <field name="name">ECO Create</field>
-+ <field name="res_model">plm.eco</field>
-+ <field name="default" eval="False"/>
-+ <field name="description">ECO Create</field>
-+ </record>
-+
-+ <record id="mt_plm_team_eco_create" model="mail.message.subtype">
-+ <field name="name">ECO Create</field>
-+ <field name="sequence">21</field>
-+ <field name="res_model">plm.team</field>
-+ <field name="parent_id" eval="ref('plm.mt_plm_eco_create')"/>
-+ <field name="relation_field">ecr_id.category_ids.team_id</field>
-+ </record>
++ <record id="mt_plm_team_eco_create" model="mail.message.subtype">
++ <field name="name">ECO Create</field>
++ <field name="sequence">21</field>
++ <field name="res_model">plm.team</field>
++ <field name="parent_id"
++ eval="ref('plm.mt_engineering_change_order_create')"/>
++ <field name="relation_field">ecr_id.category_ids.team_id</field>
++ </record>
+
-+ </data>
+</flectra>
diff --git addons/plm/data/ir_sequence_data.xml addons/plm/data/ir_sequence_data.xml
new file mode 100644
-index 0000000..bb549bd
+index 0000000..a038cb5
--- /dev/null
+++ addons/plm/data/ir_sequence_data.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<flectra noupdate="1">
+
-+ <record id="seq_plm_ecr" model="ir.sequence">
-+ <field name="name">PLM ECR</field>
-+ <field name="code">plm.ecr</field>
-+ <field name="prefix">ECR</field>
++ <record id="seq_engineering_change_request" model="ir.sequence">
++ <field name="name">Engineering Change Request</field>
++ <field name="code">engineering.change.request</field>
++ <field name="prefix">ECR/%(range_year)s/</field>
+ <field name="padding">3</field>
+ <field name="company_id" eval="False"/>
+ </record>
+
-+ <record id="seq_plm_eco" model="ir.sequence">
-+ <field name="name">PLM ECO</field>
-+ <field name="code">plm.eco</field>
-+ <field name="prefix">ECO</field>
-+ <field name="padding">4</field>
++ <record id="seq_engineering_change_order" model="ir.sequence">
++ <field name="name">Engineering Change Order</field>
++ <field name="code">engineering.change.order</field>
++ <field name="prefix">ECO/%(range_year)s/</field>
++ <field name="padding">3</field>
+ <field name="company_id" eval="False"/>
+ </record>
+
@@ -285,7 +284,7 @@
+</flectra>
diff --git addons/plm/demo/plm_users_demo.xml addons/plm/demo/plm_users_demo.xml
new file mode 100644
-index 0000000..d23a1e6
+index 0000000..fc8851d
--- /dev/null
+++ addons/plm/demo/plm_users_demo.xml
@@ -0,0 +1,88 @@
@@ -313,7 +312,7 @@
+ </field>
+ <field name="company_id" ref="base.main_company"/>
+ <field name="groups_id"
-+ eval="[(4, ref('plm.group_plm_ecr_reviewer')),
++ eval="[(4, ref('plm.group_engineering_change_request_reviewer')),
+ (4,ref('base.group_partner_manager'))]"/>
+ <field name="image" type="base64"
+ file="base/static/img/user_demo-image.jpg"/>
@@ -340,7 +339,7 @@
+ </field>
+ <field name="company_id" ref="base.main_company"/>
+ <field name="groups_id"
-+ eval="[(4, ref('plm.group_plm_ecr_approver')),
++ eval="[(4, ref('plm.group_engineering_change_request_approver')),
+ (4,ref('base.group_partner_manager'))]"/>
+ <field name="image" type="base64"
+ file="base/static/img/user_demo-image.jpg"/>
@@ -367,7 +366,7 @@
+ </field>
+ <field name="company_id" ref="base.main_company"/>
+ <field name="groups_id"
-+ eval="[(4, ref('plm.group_plm_ecr_requester')),
++ eval="[(4, ref('plm.group_engineering_change_request_requester')),
+ (4, ref('sales_team.group_sale_manager')),
+ (4, ref('mrp.group_mrp_manager')),
+ (4, ref('stock.group_stock_user')),
@@ -379,10 +378,10 @@
+</flectra>
diff --git addons/plm/i18n/plm.pot addons/plm/i18n/plm.pot
new file mode 100644
-index 0000000..3350ac8
+index 0000000..9639dca
--- /dev/null
+++ addons/plm/i18n/plm.pot
-@@ -0,0 +1,1011 @@
+@@ -0,0 +1,1269 @@
+# Translation of Flectra Server.
+# This file contains the translation of the following modules:
+# * plm
@@ -391,8 +390,8 @@
+msgstr ""
+"Project-Id-Version: Flectra Server 1.0alpha\n"
+"Report-Msgid-Bugs-To: \n"
-+"POT-Creation-Date: 2017-11-17 12:42+0000\n"
-+"PO-Revision-Date: 2017-11-17 12:42+0000\n"
++"POT-Creation-Date: 2017-12-20 10:15+0000\n"
++"PO-Revision-Date: 2017-12-20 10:15+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
@@ -401,35 +400,50 @@
+"Plural-Forms: \n"
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_product_product_template_attachment_count
-+#: model:ir.model.fields,field_description:plm.field_product_template_template_attachment_count
-+msgid "# Attachments"
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_total_change_order
++msgid "# ECOs"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_mrp_bom_eco_count
-+#: model:ir.model.fields,field_description:plm.field_mrp_routing_eco_count
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_eco_count
-+#: model:ir.model.fields,field_description:plm.field_product_product_eco_count
-+#: model:ir.model.fields,field_description:plm.field_product_template_eco_count
-+msgid "# ECOs"
++#: model:ir.model.fields,help:plm.field_plm_team_alias_defaults
++msgid "A Python dictionary that will be evaluated to provide default values when creating new records for this alias."
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_acceptance_action
++#: model:ir.model.fields,field_description:plm.field_process_wizard_action
++msgid "Action"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_mrp_production_ecr_count
-+msgid "# ECRs"
++#: model:ir.model.fields,field_description:plm.field_plm_reason_action
++msgid "Action "
+msgstr ""
+
+#. module: plm
+#: model:ir.ui.view,arch_db:plm.mrp_bom_version_tree_view
-+#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_plm_eco
-+#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_plm_eco
++#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_engineering_change_order
++#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_engineering_change_order
+#: model:ir.ui.view,arch_db:plm.plm_bom_version_tree_view
+msgid "Activate"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_active
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_activation
++msgid "Activation"
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_activation
++msgid "Activation "
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_activated_on
++msgid "Activation Date "
++msgstr ""
++
++#. module: plm
+#: model:ir.model.fields,field_description:plm.field_plm_team_active
+#: selection:mrp.bom,state:0
+#: selection:mrp.routing,state:0
@@ -437,132 +451,184 @@
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_approval_active_approver
-+msgid "Active Approver"
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_active
++msgid "Active "
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_acceptance_active_approver
++msgid "Active Approver "
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_acceptance_active_reviewer
++msgid "Active Reviewer "
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_plm_team_alias_id
++msgid "Alias"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_approval_active_reviewer
-+msgid "Active Reviewer"
++#: model:ir.model.fields,field_description:plm.field_plm_team_alias_contact
++msgid "Alias Contact Security"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_type
-+msgid "Apply on"
++#: model:ir.model.fields,field_description:plm.field_plm_team_alias_name
++msgid "Alias Name"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_approval_ids
-+#: model:ir.ui.view,arch_db:plm.plm_ecr_form_view
++#: model:ir.model.fields,field_description:plm.field_plm_team_alias_domain
++msgid "Alias domain"
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_plm_team_alias_model_id
++msgid "Aliased Model"
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_applicability
++msgid "Applicability"
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_approval_ids
++#: model:ir.ui.view,arch_db:plm.engineering_change_request_form_view
+msgid "Approvals"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,help:plm.field_plm_ecr_approval_ids
++#: model:ir.model.fields,help:plm.field_engineering_change_request_approval_ids
+msgid "Approvals by stage"
+msgstr ""
+
+#. module: plm
-+#: model:ir.actions.act_window,name:plm.action_approve_wizard
-+#: model:ir.ui.view,arch_db:plm.approve_wizard_form_view
-+#: model:ir.ui.view,arch_db:plm.plm_ecr_form_view
++#: selection:engineering.change.request.acceptance,action:0
++#: model:ir.ui.view,arch_db:plm.engineering_change_request_form_view
++#: selection:plm.reason,action:0
++#: selection:process.wizard,action:0
+msgid "Approve"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_approval_approve_boolean
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_approved_boolean
-+#: selection:plm.ecr,state:0
++#: selection:engineering.change.request,state:0
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_approved_boolean
+msgid "Approved"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_category_approver
-+#: model:ir.model.fields,field_description:plm.field_res_users_approver_boolean
-+#: model:res.groups,name:plm.group_plm_ecr_approver
++#: code:addons/plm/wizard/process.py:35
++#, python-format
++msgid "Approved. Please select different category."
++msgstr ""
++
++#. module: plm
++#: selection:engineering.change.request.acceptance,name:0
++#: model:res.groups,name:plm.group_engineering_change_request_approver
+#: selection:res.users,type_of_user:0
+msgid "Approver"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_approve_wizard_approver_id
-+msgid "Approvers"
++#: model:ir.model.fields,field_description:plm.field_plm_category_approver
++msgid "Approver "
+msgstr ""
+
+#. module: plm
-+#: selection:plm.eco,effectivity:0
-+#: selection:plm.ecr,effectivity:0
++#: selection:engineering.change.request,activation:0
+msgid "As soon as possible"
+msgstr ""
+
+#. module: plm
-+#: selection:plm.eco,effectivity:0
-+#: selection:plm.ecr,effectivity:0
++#: selection:engineering.change.request,activation:0
+msgid "At Date"
+msgstr ""
+
+#. module: plm
++#: selection:engineering.change.order,activation:0
++msgid "At the Earliest"
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_bom_id
++msgid "BOM"
++msgstr ""
++
++#. module: plm
+#: model:ir.model,name:plm.model_mrp_bom
+msgid "Bill of Material"
+msgstr ""
+
+#. module: plm
-+#: model:ir.actions.act_window,help:plm.mrp_bom_action_kanban
-+#: model:ir.actions.act_window,name:plm.mrp_bom_action_kanban
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_bom_id
-+#: selection:plm.eco,type:0
++#: selection:engineering.change.order,applicability:0
+msgid "Bill of Materials"
+msgstr ""
+
+#. module: plm
-+#: selection:plm.eco,type:0
++#: selection:engineering.change.order,applicability:0
+msgid "BoM and Routing"
+msgstr ""
+
+#. module: plm
-+#: model:ir.ui.view,arch_db:plm.approve_wizard_form_view
-+#: model:ir.ui.view,arch_db:plm.plm_ecr_form_view
-+#: model:ir.ui.view,arch_db:plm.reject_wizard_form_view
-+#: model:ir.ui.view,arch_db:plm.review_wizard_form_view
++#: model:ir.ui.view,arch_db:plm.engineering_change_order_kanban_view_data
++msgid "BoM:"
++msgstr ""
++
++#. module: plm
++#: model:ir.ui.view,arch_db:plm.engineering_change_request_form_view
++#: model:ir.ui.view,arch_db:plm.process_wizard_form_view
+msgid "Cancel"
+msgstr ""
+
+#. module: plm
-+#: selection:plm.ecr,state:0
++#: selection:engineering.change.request,state:0
+msgid "Cancelled"
+msgstr ""
+
+#. module: plm
+#: model:ir.actions.act_window,name:plm.action_plm_category
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_category_ids
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_category_ids
+#: model:ir.ui.menu,name:plm.plm_categories_sub_menu
+#: model:ir.ui.view,arch_db:plm.plm_category_form_view
-+#: model:ir.ui.view,arch_db:plm.plm_category_tree_view
+msgid "Categories"
+msgstr ""
+
+#. module: plm
-+#: code:addons/plm/models/plm_ecr.py:244
++#: code:addons/plm/models/engineering_change_request.py:297
+#, python-format
+msgid "Categories must have Approver and Reviewer."
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_approve_wizard_category_ids
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_acceptance_category_ids
+#: model:ir.model.fields,field_description:plm.field_plm_category_name
-+#: model:ir.model.fields,field_description:plm.field_reject_wizard_category_ids
-+#: model:ir.model.fields,field_description:plm.field_review_wizard_category_ids
++#: model:ir.model.fields,field_description:plm.field_process_wizard_category_id
+msgid "Category"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_comments
-+msgid "Comments"
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_color
++msgid "Color"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_company_id
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_company_id
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_color
++#: model:ir.model.fields,field_description:plm.field_plm_category_color
++msgid "Color Index"
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_comments
++msgid "Comments "
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_company_id
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_company_id
+msgid "Company"
+msgstr ""
+
@@ -572,12 +638,12 @@
+msgstr ""
+
+#. module: plm
-+#: model:ir.ui.view,arch_db:plm.plm_ecr_form_view
++#: model:ir.ui.view,arch_db:plm.engineering_change_request_form_view
+msgid "Confirm"
+msgstr ""
+
+#. module: plm
-+#: selection:plm.ecr,state:0
++#: selection:engineering.change.request,state:0
+msgid "Confirmed"
+msgstr ""
+
@@ -587,146 +653,189 @@
+msgstr ""
+
+#. module: plm
-+#: model:ir.actions.act_window,help:plm.plm_eco_action_main
-+#: model:ir.actions.act_window,help:plm.plm_eco_action_product_tmpl
++#: model:ir.actions.act_window,help:plm.engineering_change_order_action_main
++#: model:ir.actions.act_window,help:plm.engineering_change_order_action_product_tmpl
+msgid "Create Engineering Change Orders"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_approve_wizard_create_uid
-+#: model:ir.model.fields,field_description:plm.field_plm_category_create_uid
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_approval_create_uid
++#: model:ir.actions.act_window,name:plm.create_engineering_change_order_form_view
++msgid "Create an ECO"
++msgstr ""
++
++#. module: plm
++#: model:ir.actions.act_window,name:plm.create_engineering_change_request_form_view
++msgid "Create an ECR"
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_plm_reason_create_uid
+#: model:ir.model.fields,field_description:plm.field_plm_team_create_uid
-+#: model:ir.model.fields,field_description:plm.field_reject_wizard_create_uid
-+#: model:ir.model.fields,field_description:plm.field_review_wizard_create_uid
++#: model:ir.model.fields,field_description:plm.field_process_wizard_create_uid
+msgid "Created by"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_approve_wizard_create_date
-+#: model:ir.model.fields,field_description:plm.field_plm_category_create_date
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_approval_create_date
++#: model:ir.model.fields,field_description:plm.field_plm_reason_create_date
+#: model:ir.model.fields,field_description:plm.field_plm_team_create_date
-+#: model:ir.model.fields,field_description:plm.field_reject_wizard_create_date
-+#: model:ir.model.fields,field_description:plm.field_review_wizard_create_date
++#: model:ir.model.fields,field_description:plm.field_process_wizard_create_date
+msgid "Created on"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_approval_date
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_ecr_date
++#: model:ir.model.fields,field_description:plm.field_process_wizard_process_date
+msgid "Date"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,help:plm.field_plm_eco_effectivity
-+msgid "Date on which the changes should be applied. For reference only."
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_acceptance_date
++msgid "Date "
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_plm_team_alias_defaults
++msgid "Default Values"
++msgstr ""
++
++#. module: plm
++#: model:ir.ui.view,arch_db:plm.engineering_change_order_kanban_view_data
++#: model:ir.ui.view,arch_db:plm.engineering_change_request_kanban_view_data
++msgid "Delete"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_description_request
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_description
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_description_request
++#: model:ir.ui.view,arch_db:plm.engineering_change_order_view_form
+msgid "Description"
+msgstr ""
+
+#. module: plm
-+#: model:ir.ui.view,arch_db:plm.plm_eco_view_form
-+msgid "Description of the change and its reason ..."
++#: model:ir.ui.view,arch_db:plm.engineering_change_order_view_form
++msgid "Description of the change and its reason ..."
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_approve_wizard_display_name
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_display_name
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_acceptance_display_name
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_display_name
+#: model:ir.model.fields,field_description:plm.field_plm_category_display_name
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_display_name
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_approval_display_name
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_display_name
++#: model:ir.model.fields,field_description:plm.field_plm_reason_display_name
+#: model:ir.model.fields,field_description:plm.field_plm_team_display_name
-+#: model:ir.model.fields,field_description:plm.field_reject_wizard_display_name
-+#: model:ir.model.fields,field_description:plm.field_review_wizard_display_name
++#: model:ir.model.fields,field_description:plm.field_process_wizard_display_name
+msgid "Display Name"
+msgstr ""
+
+#. module: plm
-+#: model:ir.ui.view,arch_db:plm.plm_eco_view_form
-+#: selection:plm.eco,eco_stage_id:0
++#: selection:engineering.change.order,state:0
++#: model:ir.ui.view,arch_db:plm.engineering_change_order_view_form
+msgid "Done"
+msgstr ""
+
+#. module: plm
++#: selection:engineering.change.order,state:0
++#: selection:engineering.change.request,state:0
+#: model:ir.ui.view,arch_db:plm.mrp_bom_version_tree_view
-+#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_plm_eco
-+#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_plm_eco
++#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_engineering_change_order
++#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_engineering_change_order
+#: model:ir.ui.view,arch_db:plm.plm_bom_version_tree_view
+#: selection:mrp.bom,state:0
+#: selection:mrp.routing,state:0
-+#: selection:plm.eco,eco_stage_id:0
-+#: selection:plm.ecr,state:0
+msgid "Draft"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_dwg_no
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_dwg_no
+msgid "Dwg. No."
+msgstr ""
+
+#. module: plm
-+#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_plm_eco
-+#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_plm_eco
++#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_engineering_change_order
++#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_engineering_change_order
+msgid "ECO"
+msgstr ""
+
+#. module: plm
-+#: model:ir.ui.view,arch_db:plm.plm_eco_view_graph
-+#: model:ir.ui.view,arch_db:plm.plm_eco_view_pivot
-+msgid "ECO Analysis"
++#: model:mail.message.subtype,description:plm.mt_engineering_change_order_create
++#: model:mail.message.subtype,name:plm.mt_engineering_change_order_create
++#: model:mail.message.subtype,name:plm.mt_plm_team_eco_create
++msgid "ECO Create"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_mrp_bom_eco_ids
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_eco_ids
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_change_order_ids
++#: model:ir.model.fields,field_description:plm.field_mrp_bom_change_order_ids
+msgid "ECO to be applied"
+msgstr ""
+
+#. module: plm
-+#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_plm_eco
-+#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_plm_eco
-+#: model:ir.ui.view,arch_db:plm.plm_ecr_form_view
++#: model:ir.ui.view,arch_db:plm.engineering_change_request_form_view
++#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_engineering_change_order
++#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_engineering_change_order
+msgid "ECO(s)"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_mrp_routing_eco_ids
-+#: model:ir.model.fields,field_description:plm.field_product_product_eco_ids
-+#: model:ir.model.fields,field_description:plm.field_product_template_eco_ids
-+#: model:ir.ui.view,arch_db:plm.plm_eco_view_calendar
-+#: model:ir.ui.view,arch_db:plm.product_template_view_form_inherit_plm_eco
++#: model:ir.model.fields,field_description:plm.field_mrp_routing_change_order_ids
++#: model:ir.model.fields,field_description:plm.field_product_product_change_order_ids
++#: model:ir.model.fields,field_description:plm.field_product_template_change_order_ids
++#: model:ir.ui.view,arch_db:plm.product_template_view_form_inherit_engineering_change_order
+msgid "ECOs"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_mrp_production_ecr_ids
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_ecr_id
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_approval_ecr_id
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_ecr_id
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_acceptance_ecr_id
++#: model:ir.model.fields,field_description:plm.field_mrp_production_change_request_ids
+msgid "ECR"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_ecr_date
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_ecr_date
++#: model:mail.message.subtype,description:plm.mt_plm_approve
++#: model:mail.message.subtype,name:plm.mt_plm_approve
++#: model:mail.message.subtype,name:plm.mt_plm_team_approve
++msgid "ECR Approve"
++msgstr ""
++
++#. module: plm
++#: model:mail.message.subtype,description:plm.mt_ecr_create
++#: model:mail.message.subtype,name:plm.mt_ecr_create
++#: model:mail.message.subtype,name:plm.mt_ecr_team_create
++msgid "ECR Create"
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_ecr_date
+msgid "ECR Date"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_name
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_name
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_name
+msgid "ECR No."
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_ecr_requester
++#: model:mail.message.subtype,description:plm.mt_plm_reject
++#: model:mail.message.subtype,name:plm.mt_plm_reject
++#: model:mail.message.subtype,name:plm.mt_plm_team_reject
++msgid "ECR Reject"
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_ecr_requester
+msgid "ECR Requester"
+msgstr ""
+
+#. module: plm
-+#: model:ir.ui.view,arch_db:plm.plm_ecr_form_view
++#: model:mail.message.subtype,description:plm.mt_plm_review
++#: model:mail.message.subtype,name:plm.mt_plm_review
++#: model:mail.message.subtype,name:plm.mt_plm_team_review
++msgid "ECR Review"
++msgstr ""
++
++#. module: plm
++#: model:ir.ui.view,arch_db:plm.engineering_change_request_form_view
+msgid "ECR approvals"
+msgstr ""
+
@@ -736,74 +845,71 @@
+msgstr ""
+
+#. module: plm
-+#: selection:plm.ecr,priority:0
++#: selection:engineering.change.request,priority:0
+msgid "EXTREMELY URGENT"
+msgstr ""
+
+#. module: plm
-+#: code:addons/plm/models/plm_eco.py:132
-+#: code:addons/plm/models/plm_eco.py:148
-+#, python-format
-+msgid "Eco BoM"
++#: model:ir.ui.view,arch_db:plm.engineering_change_order_kanban_view_data
++#: model:ir.ui.view,arch_db:plm.engineering_change_request_kanban_view_data
++msgid "Edit"
+msgstr ""
+
+#. module: plm
-+#: code:addons/plm/models/plm_eco.py:161
-+#: code:addons/plm/models/plm_eco.py:174
-+#, python-format
-+msgid "Eco Routing"
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_effective_date
++msgid "Effective Date "
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_effective_date
-+msgid "Effective Date"
++#: code:addons/plm/models/engineering_change_order.py:72
++#, python-format
++msgid "Effectivity Date Should be greater than ECR Date"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_effectivity
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_effectivity
-+msgid "Effectivity"
++#: code:addons/plm/models/engineering_change_request.py:289
++#, python-format
++msgid "Effectivity Date should be grater than ECR Date"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_effectivity_date
-+msgid "Effectivity Date"
++#: model:ir.ui.view,arch_db:plm.plm_team_form_view
++msgid "Email Alias"
+msgstr ""
+
+#. module: plm
-+#: code:addons/plm/models/plm_eco.py:60
-+#, python-format
-+msgid "Effectivity Date Should be greater than ECR Date"
++#: model:ir.model,name:plm.model_engineering_change_order
++msgid "Engineering Change Order"
+msgstr ""
+
+#. module: plm
-+#: code:addons/plm/models/plm_ecr.py:236
++#: code:addons/plm/models/engineering_change_order.py:144
+#, python-format
-+msgid "Effectivity Date should be grater than ECR Date"
++msgid "Engineering Change Order BoM"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model,name:plm.model_plm_eco
-+msgid "Engineering Change Order"
++#: code:addons/plm/models/engineering_change_order.py:168
++#, python-format
++msgid "Engineering Change Order Routing"
+msgstr ""
+
+#. module: plm
-+#: model:ir.actions.act_window,name:plm.plm_eco_action_main
-+#: model:ir.actions.act_window,name:plm.plm_eco_action_product_tmpl
-+#: model:ir.ui.menu,name:plm.menu_plm_ecos
++#: model:ir.actions.act_window,name:plm.engineering_change_order_action_main
++#: model:ir.actions.act_window,name:plm.engineering_change_order_action_product_tmpl
++#: model:ir.ui.menu,name:plm.menu_engineering_change_orders
+msgid "Engineering Change Orders"
+msgstr ""
+
+#. module: plm
-+#: model:ir.actions.act_window,name:plm.action_plm_ecr
-+#: model:ir.ui.menu,name:plm.plm_ecr_menu
-+#: model:ir.ui.view,arch_db:plm.plm_ecr_form_view
-+#: model:ir.ui.view,arch_db:plm.plm_ecr_tree_view
++#: model:ir.actions.act_window,name:plm.action_engineering_change_request
++#: model:ir.ui.menu,name:plm.engineering_change_request_menu
++#: model:ir.ui.view,arch_db:plm.engineering_change_request_form_view
+msgid "Engineering Change Request"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,help:plm.field_plm_eco_effectivity_date
++#: model:ir.model.fields,help:plm.field_engineering_change_order_activated_on
+msgid "For reference only."
+msgstr ""
+
@@ -813,19 +919,9 @@
+msgstr ""
+
+#. module: plm
-+#: model:ir.module.category,description:plm.module_category_plm_ecr
-+msgid "Helps you manage your product's lifecycles."
-+msgstr ""
-+
-+#. module: plm
-+#: selection:plm.eco,eco_priority:0
-+msgid "High"
-+msgstr ""
-+
-+#. module: plm
+#: model:ir.ui.view,arch_db:plm.mrp_bom_version_tree_view
-+#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_plm_eco
-+#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_plm_eco
++#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_engineering_change_order
++#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_engineering_change_order
+#: model:ir.ui.view,arch_db:plm.plm_bom_version_tree_view
+#: selection:mrp.bom,state:0
+#: selection:mrp.routing,state:0
@@ -835,70 +931,71 @@
+#. module: plm
+#: model:ir.model.fields,field_description:plm.field_mrp_bom_historical_date
+#: model:ir.model.fields,field_description:plm.field_mrp_routing_historical_date
-+msgid "Historical Date"
++msgid "Historical Date "
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_approve_wizard_id
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_id
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_acceptance_id
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_id
+#: model:ir.model.fields,field_description:plm.field_plm_category_id
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_id
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_approval_id
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_id
++#: model:ir.model.fields,field_description:plm.field_plm_reason_id
+#: model:ir.model.fields,field_description:plm.field_plm_team_id
-+#: model:ir.model.fields,field_description:plm.field_reject_wizard_id
-+#: model:ir.model.fields,field_description:plm.field_review_wizard_id
++#: model:ir.model.fields,field_description:plm.field_process_wizard_id
+msgid "ID"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,help:plm.field_plm_eco_active
-+msgid "If the active field is set to False, it will allow you to hide the engineering change order without removing it."
++#: model:ir.model.fields,help:plm.field_plm_team_alias_parent_thread_id
++msgid "ID of the parent record holding the alias (example: project holding the task creation alias)"
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,help:plm.field_engineering_change_order_active
++msgid "If the active field is set to False, itwill allow you to hide the engineeringchange order without removing it."
+msgstr ""
+
+#. module: plm
+#: model:ir.model.fields,help:plm.field_plm_team_active
-+msgid "If the active field is set to false, it will allow you to hide the plm team without removing it."
++msgid "If the active field is set to false,it will allow you to hide the plm teamwithout removing it."
+msgstr ""
+
+#. module: plm
-+#: model:ir.ui.view,arch_db:plm.plm_eco_view_form
-+#: selection:plm.eco,eco_stage_id:0
++#: selection:engineering.change.order,state:0
++#: model:ir.ui.view,arch_db:plm.engineering_change_order_view_form
+msgid "In Progress"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_approve_wizard___last_update
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order___last_update
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request___last_update
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_acceptance___last_update
+#: model:ir.model.fields,field_description:plm.field_plm_category___last_update
-+#: model:ir.model.fields,field_description:plm.field_plm_eco___last_update
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr___last_update
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_approval___last_update
++#: model:ir.model.fields,field_description:plm.field_plm_reason___last_update
+#: model:ir.model.fields,field_description:plm.field_plm_team___last_update
-+#: model:ir.model.fields,field_description:plm.field_reject_wizard___last_update
-+#: model:ir.model.fields,field_description:plm.field_review_wizard___last_update
++#: model:ir.model.fields,field_description:plm.field_process_wizard___last_update
+msgid "Last Modified on"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_approve_wizard_write_uid
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_write_uid
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_acceptance_write_uid
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_write_uid
+#: model:ir.model.fields,field_description:plm.field_plm_category_write_uid
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_write_uid
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_approval_write_uid
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_write_uid
++#: model:ir.model.fields,field_description:plm.field_plm_reason_write_uid
+#: model:ir.model.fields,field_description:plm.field_plm_team_write_uid
-+#: model:ir.model.fields,field_description:plm.field_reject_wizard_write_uid
-+#: model:ir.model.fields,field_description:plm.field_review_wizard_write_uid
++#: model:ir.model.fields,field_description:plm.field_process_wizard_write_uid
+msgid "Last Updated by"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_approve_wizard_write_date
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_write_date
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_acceptance_write_date
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_write_date
+#: model:ir.model.fields,field_description:plm.field_plm_category_write_date
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_write_date
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_approval_write_date
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_write_date
++#: model:ir.model.fields,field_description:plm.field_plm_reason_write_date
+#: model:ir.model.fields,field_description:plm.field_plm_team_write_date
-+#: model:ir.model.fields,field_description:plm.field_reject_wizard_write_date
-+#: model:ir.model.fields,field_description:plm.field_review_wizard_write_date
++#: model:ir.model.fields,field_description:plm.field_process_wizard_write_date
+msgid "Last Updated on"
+msgstr ""
+
@@ -909,329 +1006,429 @@
+msgstr ""
+
+#. module: plm
-+#: code:addons/plm/models/plm_ecr.py:272
-+#: code:addons/plm/models/plm_ecr.py:289
++#: model:ir.module.category,description:plm.module_category_engineering_change_request
++#: model:ir.module.category,description:plm.module_category_engineering_change_request111
++msgid "Maintain Product Lifecycle Management for\n"
++" BoM and Routing.\n"
++" "
++msgstr ""
++
++#. module: plm
++#: code:addons/plm/models/engineering_change_request.py:324
++#: code:addons/plm/models/engineering_change_request.py:339
+#, python-format
+msgid "Make To Order"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_res_users_manager_boolean
-+#: model:res.groups,name:plm.group_plm_ecr_manager
++#: model:res.groups,name:plm.group_engineering_change_request_manager
+#: selection:res.users,type_of_user:0
+msgid "Manager"
+msgstr ""
+
+#. module: plm
-+#: code:addons/plm/models/plm_ecr.py:272
-+#: code:addons/plm/models/plm_ecr.py:289
++#: selection:engineering.change.order,activation:0
++msgid "Manual"
++msgstr ""
++
++#. module: plm
++#: code:addons/plm/models/engineering_change_request.py:325
++#: code:addons/plm/models/engineering_change_request.py:340
+#, python-format
+msgid "Manufacture"
+msgstr ""
+
+#. module: plm
+#: model:ir.model,name:plm.model_mrp_production
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_manufacture_order
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_manufacture_order
+msgid "Manufacturing Order"
+msgstr ""
+
+#. module: plm
-+#: selection:plm.ecr,production_status:0
++#: selection:engineering.change.request,production_status:0
+msgid "Manufacturing Order On Hold"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_res_users_member_boolean
-+#: model:res.groups,name:plm.group_plm_ecr_member
++#: model:res.groups,name:plm.group_engineering_change_request_member
+#: selection:res.users,type_of_user:0
+msgid "Member"
+msgstr ""
+
+#. module: plm
-+#: code:addons/plm/models/plm_team.py:26
++#: model:res.groups,comment:plm.group_engineering_change_request_member
++msgid "Member who can view Change Orders and\n"
++" Change Requests"
++msgstr ""
++
++#. module: plm
++#: code:addons/plm/models/plm_team.py:48
+#, python-format
+msgid "More than one Approver is not allowed for Approve"
+msgstr ""
+
+#. module: plm
-+#: code:addons/plm/models/plm_team.py:23
++#: code:addons/plm/models/plm_team.py:45
+#, python-format
+msgid "More than one Reviewer is not allowed for Review"
+msgstr ""
+
+#. module: plm
-+#: code:addons/plm/models/plm_category.py:35
++#: code:addons/plm/models/plm_category.py:42
+#, python-format
-+msgid "Must be assign approver"
++msgid "Must be assign Approver"
+msgstr ""
+
+#. module: plm
-+#: code:addons/plm/models/plm_category.py:32
++#: code:addons/plm/models/plm_category.py:39
+#, python-format
-+msgid "Must be assign reviewer"
++msgid "Must be assign Reviewer"
+msgstr ""
+
+#. module: plm
-+#: selection:plm.ecr,priority:0
++#: selection:engineering.change.request,priority:0
+msgid "NORMAL"
+msgstr ""
+
+#. module: plm
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_name
+#: model:ir.model.fields,field_description:plm.field_mrp_bom_name
+msgid "Name"
+msgstr ""
+
+#. module: plm
-+#: code:addons/plm/models/plm_eco.py:15
-+#: code:addons/plm/models/plm_eco.py:101
-+#: code:addons/plm/models/plm_eco.py:104
-+#: code:addons/plm/models/plm_eco.py:107
-+#: code:addons/plm/models/plm_ecr.py:39
-+#: code:addons/plm/models/plm_ecr.py:253
-+#: code:addons/plm/models/plm_ecr.py:256
-+#: code:addons/plm/models/plm_ecr.py:259
++#: code:addons/plm/models/engineering_change_order.py:14
++#: code:addons/plm/models/engineering_change_order.py:106
++#: code:addons/plm/models/engineering_change_order.py:110
++#: code:addons/plm/models/engineering_change_order.py:113
++#: code:addons/plm/models/engineering_change_request.py:50
++#: code:addons/plm/models/engineering_change_request.py:306
++#: code:addons/plm/models/engineering_change_request.py:310
++#: code:addons/plm/models/engineering_change_request.py:313
+#, python-format
+msgid "New"
+msgstr ""
+
+#. module: plm
-+#: selection:plm.eco,type_id:0
-+#: selection:plm.ecr,type_id:0
++#: selection:engineering.change.order,type:0
++#: selection:engineering.change.request,type:0
++#: selection:mrp.bom,change_order_type:0
++#: selection:mrp.routing,change_order_type:0
+msgid "New Product Introduction"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_new_routing_id
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_latest_routing_id
+msgid "New Routing"
+msgstr ""
+
+#. module: plm
+#: model:ir.ui.view,arch_db:plm.mrp_bom_version_tree_view
-+#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_plm_eco
-+#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_plm_eco
++#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_engineering_change_order
++#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_engineering_change_order
+#: model:ir.ui.view,arch_db:plm.plm_bom_version_tree_view
+msgid "New version"
+msgstr ""
+
+#. module: plm
-+#: selection:plm.eco,eco_priority:0
-+msgid "Normal"
++#: model:ir.model.fields,field_description:plm.field_process_wizard_notes
++msgid "Notes "
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_notes
-+#: model:ir.ui.view,arch_db:plm.plm_eco_view_form
-+msgid "Note"
++#: model:ir.model.fields,field_description:plm.field_mrp_bom_old_versions
++#: model:ir.model.fields,field_description:plm.field_mrp_routing_old_versions
++msgid "Old Versions "
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_approve_wizard_notes
-+#: model:ir.model.fields,field_description:plm.field_reject_wizard_notes
-+#: model:ir.model.fields,field_description:plm.field_review_wizard_notes
-+msgid "Notes"
++#: model:res.groups,comment:plm.group_engineering_change_request_requester
++msgid "One who can request for ECR, ECO and also can\n"
++" manage Routing and BoM."
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_mrp_bom_old_versions
-+#: model:ir.model.fields,field_description:plm.field_mrp_routing_old_versions
-+msgid "Old Versions"
++#: model:ir.ui.view,arch_db:plm.engineering_change_order_view_form
++msgid "Open BOM"
+msgstr ""
+
+#. module: plm
-+#: model:ir.ui.view,arch_db:plm.plm_eco_view_form
-+msgid "Open BOM"
++#: model:ir.ui.view,arch_db:plm.engineering_change_order_view_form
++msgid "Open Routing"
+msgstr ""
+
+#. module: plm
-+#: model:ir.ui.view,arch_db:plm.plm_eco_view_form
-+msgid "Open Routing"
++#: model:ir.model.fields,help:plm.field_plm_team_alias_force_thread_id
++msgid "Optional ID of a thread (record) to which all incoming messages will be attached, even if they did not reply to it. If set, this will disable the creation of new records completely."
+msgstr ""
+
+#. module: plm
-+#: model:ir.ui.view,arch_db:plm.plm_ecr_form_view
++#: model:ir.ui.view,arch_db:plm.engineering_change_request_form_view
+msgid "Other Information"
+msgstr ""
+
+#. module: plm
-+#: model:ir.module.category,name:plm.module_category_plm_ecr
++#: model:ir.model.fields,field_description:plm.field_plm_team_alias_user_id
++msgid "Owner"
++msgstr ""
++
++#. module: plm
++#: model:ir.module.category,name:plm.module_category_engineering_change_request
++#: model:ir.module.category,name:plm.module_category_engineering_change_request111
+#: model:ir.ui.menu,name:plm.plm_menu
+#: model:ir.ui.menu,name:plm.plm_menu_root
+msgid "PLM"
+msgstr ""
+
+#. module: plm
++#: model:ir.model.fields,field_description:plm.field_plm_team_name
++msgid "PLM Team"
++msgstr ""
++
++#. module: plm
+#: model:ir.model.fields,field_description:plm.field_plm_team_member_ids
+msgid "PLM Team Members"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_mrp_bom_parent_bom
+#: model:ir.model.fields,field_description:plm.field_mrp_routing_parent_routing
+msgid "Parent BoM"
+msgstr ""
+
+#. module: plm
-+#: selection:plm.eco,type_id:0
-+#: selection:plm.ecr,type_id:0
++#: model:ir.model.fields,field_description:plm.field_mrp_bom_parent_bom
++msgid "Parent BoM "
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_plm_team_alias_parent_model_id
++msgid "Parent Model"
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_plm_team_alias_parent_thread_id
++msgid "Parent Record Thread ID"
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,help:plm.field_plm_team_alias_parent_model_id
++msgid "Parent model holding the alias. The model holding the alias reference is not necessarily the model given by alias_model_id (example: project (parent_model) and task (model))"
++msgstr ""
++
++#. module: plm
++#: selection:engineering.change.order,type:0
++#: selection:engineering.change.request,type:0
++#: selection:mrp.bom,change_order_type:0
++#: selection:mrp.routing,change_order_type:0
+msgid "Permanent"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_team_name
-+msgid "Plm Team"
++#: model:ir.model.fields,help:plm.field_plm_team_alias_contact
++msgid "Policy to post a message on the document using the mailgateway.\n"
++"- everyone: everyone can post\n"
++"- partners: only authenticated partners\n"
++"- followers: only followers of the related document or members of following channels\n"
++""
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_eco_priority
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_priority
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_priority
+msgid "Priority"
+msgstr ""
+
+#. module: plm
++#: model:ir.actions.act_window,name:plm.action_process_wizard
++#: model:ir.ui.view,arch_db:plm.process_wizard_form_view
++msgid "Process"
++msgstr ""
++
++#. module: plm
+#: model:ir.model,name:plm.model_product_product
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_product_tmpl_id
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_product_id
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_product_tmpl_id
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_product_id
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_product_tmpl_id
+msgid "Product"
+msgstr ""
+
+#. module: plm
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_product_tmpl_id
++msgid "Product "
++msgstr ""
++
++#. module: plm
+#: model:ir.model,name:plm.model_product_template
+msgid "Product Template"
+msgstr ""
+
+#. module: plm
-+#: selection:plm.ecr,production_status:0
++#: selection:engineering.change.request,production_status:0
+msgid "Production On Hold"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_production_status
-+msgid "Production Status"
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_production_status
++msgid "Production Status "
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_acceptance_reason_id
++#: model:ir.model.fields,field_description:plm.field_process_wizard_reason_id
++msgid "Reason"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_reason_request
++#: model:ir.model.fields,field_description:plm.field_plm_reason_name
++msgid "Reason "
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_reason_request
+msgid "Reason For Request"
+msgstr ""
+
+#. module: plm
-+#: model:ir.actions.act_window,name:plm.action_reject_wizard
-+#: model:ir.ui.view,arch_db:plm.plm_ecr_form_view
-+#: model:ir.ui.view,arch_db:plm.reject_wizard_form_view
++#: model:ir.actions.act_window,name:plm.action_plm_reason
++#: model:ir.ui.menu,name:plm.plm_reason_sub_menu
++#: model:ir.ui.view,arch_db:plm.plm_reason_form_view
++msgid "Reasons"
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_plm_team_alias_force_thread_id
++msgid "Record Thread ID"
++msgstr ""
++
++#. module: plm
++#: selection:engineering.change.request.acceptance,action:0
++#: model:ir.ui.view,arch_db:plm.engineering_change_request_form_view
++#: selection:plm.reason,action:0
++#: selection:process.wizard,action:0
+msgid "Reject"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_approval_reject_boolean
-+#: selection:plm.ecr,state:0
++#: selection:engineering.change.request,state:0
+msgid "Rejected"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_approval_user_id
-+msgid "Rejected/Approved by"
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_acceptance_reason
++#: model:ir.model.fields,field_description:plm.field_process_wizard_reason
++msgid "Remarks"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_requested_by
-+msgid "Requested By"
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_requested_by
++msgid "Requested By "
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_res_users_requester_boolean
-+#: model:res.groups,name:plm.group_plm_ecr_requester
++#: model:res.groups,name:plm.group_engineering_change_request_requester
+#: selection:res.users,type_of_user:0
+msgid "Requester"
+msgstr ""
+
+#. module: plm
-+#: code:addons/plm/models/plm_ecr.py:249
++#: code:addons/plm/models/engineering_change_request.py:301
+#, python-format
-+msgid "Requester and Approver or Reviewer of Categories must be different users."
++msgid "Requester and Approver or Reviewer ofCategories must be different users."
+msgstr ""
+
+#. module: plm
-+#: model:ir.ui.view,arch_db:plm.plm_ecr_form_view
++#: model:ir.ui.view,arch_db:plm.engineering_change_request_form_view
+msgid "Reset"
+msgstr ""
+
+#. module: plm
-+#: model:ir.ui.view,arch_db:plm.plm_ecr_form_view
++#: model:ir.ui.view,arch_db:plm.engineering_change_request_form_view
+msgid "Reset to draft"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_responsible_id
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_user_id
+msgid "Responsible"
+msgstr ""
+
+#. module: plm
-+#: model:ir.actions.act_window,name:plm.action_review_wizard
-+#: model:ir.ui.view,arch_db:plm.plm_ecr_form_view
-+#: model:ir.ui.view,arch_db:plm.review_wizard_form_view
++#: selection:engineering.change.request.acceptance,action:0
++#: model:ir.ui.view,arch_db:plm.engineering_change_request_form_view
++#: selection:plm.reason,action:0
++#: selection:process.wizard,action:0
+msgid "Review"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_approval_review_boolean
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_reviewed_boolean
-+#: selection:plm.ecr,state:0
++#: selection:engineering.change.request,state:0
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_reviewed_boolean
+msgid "Reviewed"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_category_reviewer
-+#: model:ir.model.fields,field_description:plm.field_res_users_reviewer_boolean
-+#: model:res.groups,name:plm.group_plm_ecr_reviewer
++#: code:addons/plm/wizard/process.py:40
++#, python-format
++msgid "Reviewed. Please select different category."
++msgstr ""
++
++#. module: plm
++#: selection:engineering.change.request.acceptance,name:0
++#: model:res.groups,name:plm.group_engineering_change_request_reviewer
+#: selection:res.users,type_of_user:0
+msgid "Reviewer"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_reject_wizard_reviewer_id
-+#: model:ir.model.fields,field_description:plm.field_review_wizard_reviewer_id
-+msgid "Reviewers"
++#: model:ir.model.fields,field_description:plm.field_plm_category_reviewer
++msgid "Reviewer "
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_approval_name
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_acceptance_name
+msgid "Role"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_routing_id
-+#: selection:plm.eco,type:0
++#: selection:engineering.change.order,applicability:0
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_routing_id
+msgid "Routing"
+msgstr ""
+
+#. module: plm
-+#: model:ir.actions.act_window,help:plm.mrp_routing_action_kanban
-+#: model:ir.actions.act_window,name:plm.mrp_routing_action_kanban
++#: model:ir.ui.view,arch_db:plm.engineering_change_order_kanban_view_data
++msgid "Routing:"
++msgstr ""
++
++#. module: plm
+#: model:ir.model,name:plm.model_mrp_routing
+msgid "Routings"
+msgstr ""
+
+#. module: plm
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_sale_id
+#: model:ir.model.fields,field_description:plm.field_mrp_production_sale_id
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_sale_id
+msgid "Sale Order"
+msgstr ""
+
+#. module: plm
++#: code:addons/plm/models/res_users.py:48
++#: code:addons/plm/models/res_users.py:65
++#, python-format
++msgid "Select either Approver or Reviewer"
++msgstr ""
++
++#. module: plm
+#: model:ir.model.fields,field_description:plm.field_mrp_routing_sequence
-+msgid "Sequence"
++msgid "Sequence "
+msgstr ""
+
+#. module: plm
+#: model:ir.model.fields,field_description:plm.field_mrp_bom_state
+#: model:ir.model.fields,field_description:plm.field_mrp_routing_state
-+msgid "State"
++msgid "State "
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_eco_stage_id
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_state
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_state
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_state
+msgid "Status"
+msgstr ""
+
@@ -1248,39 +1445,78 @@
+msgstr ""
+
+#. module: plm
-+#: selection:plm.eco,type_id:0
-+#: selection:plm.ecr,type_id:0
++#: selection:engineering.change.order,type:0
++#: selection:engineering.change.request,type:0
++#: selection:mrp.bom,change_order_type:0
++#: selection:mrp.routing,change_order_type:0
+msgid "Temporary"
+msgstr ""
+
+#. module: plm
-+#: model:res.groups,comment:plm.group_plm_ecr_manager
-+msgid "The PLM manager manages products lifecycle management"
++#: model:res.groups,comment:plm.group_engineering_change_request_approver
++msgid "The PLM user who has rights to 'Approve' and\n"
++" 'Reject' Change Requests.\n"
++" "
++msgstr ""
++
++#. module: plm
++#: model:res.groups,comment:plm.group_engineering_change_request_reviewer
++msgid "The PLM user who has rights to 'Review' and\n"
++" 'Reject' Change Requests."
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,help:plm.field_plm_team_alias_model_id
++msgid "The model (Flectra Document Kind) to which this alias corresponds. Any incoming email that does not reply to an existing record will cause the creation of a new record of this model (e.g. a Project Task)"
+msgstr ""
+
+#. module: plm
-+#: model:res.groups,comment:plm.group_plm_ecr_approver
-+#: model:res.groups,comment:plm.group_plm_ecr_member
-+#: model:res.groups,comment:plm.group_plm_ecr_requester
-+#: model:res.groups,comment:plm.group_plm_ecr_reviewer
-+msgid "The PLM user uses products lifecycle management"
++#: model:ir.model.fields,help:plm.field_plm_team_alias_name
++msgid "The name of the email alias, e.g. 'jobs' if you want to catch emails for <jobs@example.flectrahq.com>"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,field_description:plm.field_mrp_bom_type_id
-+#: model:ir.model.fields,field_description:plm.field_mrp_routing_type_id
-+#: model:ir.model.fields,field_description:plm.field_plm_eco_type_id
-+#: model:ir.model.fields,field_description:plm.field_plm_ecr_type_id
++#: model:ir.model.fields,help:plm.field_plm_team_alias_user_id
++msgid "The owner of records created upon receiving emails on this alias. If this field is not set the system will attempt to find the right owner based on the sender (From) address, or will use the Administrator account if no system user is found for that address."
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_mrp_bom_total_change_order
++#: model:ir.model.fields,field_description:plm.field_mrp_production_total_change_order
++#: model:ir.model.fields,field_description:plm.field_mrp_routing_total_change_order
++#: model:ir.model.fields,field_description:plm.field_product_product_total_change_order
++#: model:ir.model.fields,field_description:plm.field_product_template_total_change_order
++msgid "Total Change Orders"
++msgstr ""
++
++#. module: plm
++#: model:ir.model.fields,field_description:plm.field_engineering_change_order_type
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_type
++#: model:ir.model.fields,field_description:plm.field_mrp_bom_change_order_type
++#: model:ir.model.fields,field_description:plm.field_mrp_routing_change_order_type
+#: model:ir.model.fields,field_description:plm.field_res_users_type_of_user
+msgid "Type"
+msgstr ""
+
+#. module: plm
-+#: selection:plm.ecr,priority:0
++#: selection:engineering.change.request,priority:0
+msgid "URGENT"
+msgstr ""
+
+#. module: plm
++#: model:ir.model.fields,field_description:plm.field_engineering_change_request_acceptance_user_id
++#: model:ir.model.fields,field_description:plm.field_process_wizard_user_id
++msgid "User"
++msgstr ""
++
++#. module: plm
++#: model:res.groups,comment:plm.group_engineering_change_request_manager
++msgid "User who is able to manage BoM, Routing, ECR\n"
++" and ECO related entire processes.\n"
++" "
++msgstr ""
++
++#. module: plm
+#: model:ir.model,name:plm.model_res_users
+msgid "Users"
+msgstr ""
@@ -1288,135 +1524,156 @@
+#. module: plm
+#: model:ir.model.fields,field_description:plm.field_mrp_bom_version
+#: model:ir.model.fields,field_description:plm.field_mrp_routing_version
-+#: model:ir.model.fields,field_description:plm.field_product_product_version
-+#: model:ir.model.fields,field_description:plm.field_product_template_version
+msgid "Version"
+msgstr ""
+
+#. module: plm
-+#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_plm_eco
-+#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_plm_eco
++#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_engineering_change_order
++#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_engineering_change_order
+msgid "Versions"
+msgstr ""
+
+#. module: plm
++#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_engineering_change_order
++msgid "You are going to create a new version of this BoM. Are you sure?"
++msgstr ""
++
++#. module: plm
++#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_engineering_change_order
++msgid "You are going to create a new version of this Routing. Are you sure?"
++msgstr ""
++
++#. module: plm
+#: model:ir.ui.view,arch_db:plm.mrp_bom_version_tree_view
-+#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_plm_eco
-+msgid "You are going to create a new version of this BoM. Are you sure?"
++msgid "You are going to create a new version of this BoM. Are you sure?"
+msgstr ""
+
+#. module: plm
-+#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_plm_eco
+#: model:ir.ui.view,arch_db:plm.plm_bom_version_tree_view
-+msgid "You are going to create a new version of this Routing. Are you sure?"
++msgid "You are going to create a new version of this Routing. Are you sure?"
++msgstr ""
++
++#. module: plm
++#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_engineering_change_order
++msgid "You are going to historize an BoM. Doing, not be able to unlock it unless you make a copy. Are you sure you want to proceed?"
+msgstr ""
+
+#. module: plm
+#: model:ir.ui.view,arch_db:plm.mrp_bom_version_tree_view
-+#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_plm_eco
-+msgid "You are going to historize an BoM. Doing, not be able to unlock it unless you make a copy. Are you sure you want to proceed?"
++msgid "You are going to historize an BoM. Doing, not be able to unlock it unless you make a copy. Are you sure you want to proceed?"
++msgstr ""
++
++#. module: plm
++#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_engineering_change_order
++msgid "You are going to historize an Routing. Doing, not be able to unlock it unless you make a copy. Are you sure you want to proceed?"
+msgstr ""
+
+#. module: plm
-+#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_plm_eco
+#: model:ir.ui.view,arch_db:plm.plm_bom_version_tree_view
-+msgid "You are going to historize an Routing. Doing, not be able to unlock it unless you make a copy. Are you sure you want to proceed?"
++msgid "You are going to historize an Routing. Doing, not be able to unlock it unless you make a copy. Are you sure you want to proceed?"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model.fields,help:plm.field_plm_eco_type
++#: model:ir.model.fields,help:plm.field_engineering_change_order_type
++#: model:ir.model.fields,help:plm.field_engineering_change_request_type
+msgid "You can either upload a file from your computer or copy/paste an internet link to your file."
+msgstr ""
+
+#. module: plm
-+#: code:addons/plm/models/plm_eco.py:115
++#: code:addons/plm/models/engineering_change_order.py:121
+#, python-format
-+msgid "You can not delete a Confirmed ECO! Try to cancel it before."
++msgid "You can not delete a Confirmed ECO!Try to cancel it before."
+msgstr ""
+
+#. module: plm
-+#: code:addons/plm/models/plm_ecr.py:207
++#: code:addons/plm/models/engineering_change_request.py:260
+#, python-format
-+msgid "You can not delete a Confirmed ECR! Try to cancel it before."
++msgid "You can not delete aConfirmed ECR! Try to cancel it before."
+msgstr ""
+
+#. module: plm
+#: model:ir.ui.view,arch_db:plm.mrp_bom_version_tree_view
-+#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_plm_eco
-+msgid "You will activate the BoM. If you haven't set a route yet, then you won't be able to do it after this. Are you sure you want to proceed?"
++msgid "You will activate the BoM. If you haven't set a route yet, then you won't be able to do it after this. Are you sure you want to proceed?"
++msgstr ""
++
++#. module: plm
++#: model:ir.ui.view,arch_db:plm.mrp_bom_view_form_inherit_engineering_change_order
++msgid "You will activate the BoM. If you haven't set a route yet, then you won't be able to do it after this. Are you sure you want to proceed?"
++msgstr ""
++
++#. module: plm
++#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_engineering_change_order
++msgid "You will activate the Routing. If you haven't set a route yet, then you won't be able to do it after this. Are you sure you want to proceed?"
+msgstr ""
+
+#. module: plm
-+#: model:ir.ui.view,arch_db:plm.mrp_routing_view_form_inherit_plm_eco
+#: model:ir.ui.view,arch_db:plm.plm_bom_version_tree_view
-+msgid "You will activate the Routing. If you haven't set a route yet, then you won't be able to do it after this. Are you sure you want to proceed?"
++msgid "You will activate the Routing. If you haven't set a route yet, then you won't be able to do it after this. Are you sure you want to proceed?"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model,name:plm.model_approve_wizard
-+msgid "approve.wizard"
++#: model:ir.model,name:plm.model_engineering_change_request
++msgid "engineering.change.request"
+msgstr ""
+
+#. module: plm
-+#: model:ir.ui.view,arch_db:plm.approve_wizard_form_view
-+#: model:ir.ui.view,arch_db:plm.reject_wizard_form_view
-+#: model:ir.ui.view,arch_db:plm.review_wizard_form_view
-+msgid "or"
++#: model:ir.model,name:plm.model_engineering_change_request_acceptance
++msgid "engineering.change.request.acceptance"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model,name:plm.model_plm_category
-+msgid "plm.category"
++#: model:ir.ui.view,arch_db:plm.engineering_change_order_kanban_view_data
++msgid "oe_kanban_text_red"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model,name:plm.model_plm_ecr
-+msgid "plm.ecr"
++#: model:ir.ui.view,arch_db:plm.process_wizard_form_view
++msgid "or"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model,name:plm.model_plm_ecr_approval
-+msgid "plm.ecr.approval"
++#: model:ir.model,name:plm.model_plm_category
++msgid "plm.category"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model,name:plm.model_plm_team
-+msgid "plm.team"
++#: model:ir.model,name:plm.model_plm_reason
++msgid "plm.reason"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model,name:plm.model_reject_wizard
-+msgid "reject.wizard"
++#: model:ir.model,name:plm.model_plm_team
++msgid "plm.team"
+msgstr ""
+
+#. module: plm
-+#: model:ir.model,name:plm.model_review_wizard
-+msgid "review.wizard"
++#: model:ir.model,name:plm.model_process_wizard
++msgid "process.wizard"
+msgstr ""
+
diff --git addons/plm/models/__init__.py addons/plm/models/__init__.py
new file mode 100644
-index 0000000..7953f04
+index 0000000..e1605be
--- /dev/null
+++ addons/plm/models/__init__.py
@@ -0,0 +1,11 @@
+# Part of Flectra. See LICENSE file for full copyright and licensing details.
+
-+from . import mrp_bom
-+from . import mrp_routing
-+from . import mrp_production
-+from . import res_users
-+from . import plm_ecr
-+from . import plm_eco
++from . import engineering_change_request
++from . import engineering_change_order
+from . import plm_team
+from . import plm_category
+from . import plm_reason
-diff --git addons/plm/models/mrp_bom.py addons/plm/models/mrp_bom.py
++from . import bom
++from . import routing
++from . import production
++from . import res_users
+diff --git addons/plm/models/bom.py addons/plm/models/bom.py
new file mode 100644
-index 0000000..820dc2a
+index 0000000..7d5718c
--- /dev/null
-+++ addons/plm/models/mrp_bom.py
-@@ -0,0 +1,117 @@
++++ addons/plm/models/bom.py
+@@ -0,0 +1,125 @@
+# Part of Flectra. See LICENSE file for full copyright and licensing details.
+
+from flectra import api, fields, models
@@ -1436,17 +1693,18 @@
+ self.old_versions = old_version
+
+ @api.multi
-+ def _compute_plm_eco_data(self):
-+ for bom in self:
-+ bom.eco_count = len(bom.eco_ids)
++ def _compute_engineering_change_order_data(self):
++ self.ensure_one()
++ self.total_change_order = len(self.change_order_ids)
+
-+ name = fields.Char(
-+ states={'historical': [('readonly', True)]})
-+ code = fields.Char(
-+ states={'historical': [('readonly', True)]})
-+ eco_count = fields.Integer('# ECOs', compute='_compute_plm_eco_data')
-+ eco_ids = fields.One2many(
-+ 'plm.eco', 'bom_id', 'ECO to be applied')
++ name = fields.Char(string='Name',
++ states={'historical': [('readonly', True)]})
++ code = fields.Char(string='Code',
++ states={'historical': [('readonly', True)]})
++ total_change_order = fields.Integer('Total Change Orders',
++ compute='_compute_engineering_change_order_data')
++ change_order_ids = fields.One2many(
++ 'engineering.change.order', 'bom_id', 'ECO to be applied')
+ active = fields.Boolean(default=False, readonly=True,
+ states={'draft': [('readonly', False)]})
+ historical_date = fields.Date(string='Historical Date ', readonly=True)
@@ -1461,27 +1719,34 @@
+ compute='_get_old_versions')
+ product_tmpl_id = fields.Many2one(
+ readonly=True, states={'draft': [('readonly', False)]})
-+ type_id = fields.Selection(
++ change_order_type = fields.Selection(
+ [('permanent', 'Permanent'),
+ ('temporary', 'Temporary'),
+ ('new_product_intro', 'New Product Introduction')],
+ string='Type')
+
+ @api.onchange('product_tmpl_id')
-+ def onchange_product_tmpl_id(self):
++ def product_template_change(self):
+ if self.product_tmpl_id:
+ self.product_uom_id = self.product_tmpl_id.uom_id.id
+ self.name = self.product_tmpl_id.name
+
+ @api.multi
-+ def action_plm_eco(self):
++ def action_engineering_change_order(self):
+ self.ensure_one()
-+ action = self.env.ref('plm.plm_eco_action_main').read()[0]
-+ action['domain'] = [('bom_id', '=', self.id)]
-+ action['context'] = {
-+ 'default_bom_id': self.id,
-+ 'default_product_tmpl_id': self.product_tmpl_id.id
-+ }
++ change_orders = self.env['engineering.change.order'].search(
++ [('bom_id', '=', self.id)])
++ action = self.env.ref(
++ 'plm.engineering_change_order_action_main').read()[0]
++ if len(change_orders) > 1:
++ action['domain'] = [('id', 'in', change_orders.ids)]
++ elif len(change_orders) == 1:
++ action['views'] = [
++ (self.env.ref('plm.engineering_change_order_view_form').id,
++ 'form')]
++ action['res_id'] = change_orders.ids[0]
++ else:
++ action = {'type': 'ir.actions.act_window_close'}
+ return action
+
+ @api.multi
@@ -1534,305 +1799,81 @@
+ 'res_id': new_bom.id,
+ 'target': 'current',
+ }
-diff --git addons/plm/models/mrp_production.py addons/plm/models/mrp_production.py
-new file mode 100644
-index 0000000..4e09c2f
---- /dev/null
-+++ addons/plm/models/mrp_production.py
-@@ -0,0 +1,49 @@
-+# Part of Flectra. See LICENSE file for full copyright and licensing details.
-+
-+from datetime import datetime
-+
-+from flectra import api, fields, models
-+
-+
-+class MrpProduction(models.Model):
-+ _inherit = 'mrp.production'
-+
-+ sale_id = fields.Many2one('sale.order', string="Sale Order",
-+ compute="get_sale_id", store=True)
-+ ecr_ids = fields.One2many(
-+ 'plm.ecr', 'manufacture_order', 'ECR')
-+ ecr_count = fields.Integer('# ECRs', compute='_compute_ecr_data')
-+
-+ @api.multi
-+ def button_plm_ecr(self):
-+ self.ensure_one()
-+ action = self.env.ref('plm.action_plm_ecr').read()[0]
-+ action['domain'] = [('manufacture_order', '=', self.id)]
-+ action['context'] = {
-+ 'default_product_tmpl_id': self.product_tmpl_id.id,
-+ 'default_manufacture_order': self.id
-+ }
-+ return action
-+
-+ @api.multi
-+ def _compute_ecr_data(self):
-+ self.ensure_one()
-+ self.ecr_count = len(self.ecr_ids)
-+
-+ @api.depends('origin')
-+ def get_sale_id(self):
-+ sale_order = self.env['sale.order']
-+ for mo in self:
-+ mo.sale_id = sale_order.search([('name', '=', mo.origin)])
-+
-+ @api.multi
-+ def create_ecr(self):
-+ self.ensure_one()
-+ ecr = self.env['plm.ecr'].create({
-+ 'requested_by': self.env.user.id,
-+ 'ecr_date': datetime.today().date(),
-+ 'product_id': self.product_id.id,
-+ 'manufacture_order': self.id,
-+ 'sale_id': self.sale_id.id,
-+ })
-+ return ecr
-diff --git addons/plm/models/mrp_routing.py addons/plm/models/mrp_routing.py
-new file mode 100644
-index 0000000..321de4e
---- /dev/null
-+++ addons/plm/models/mrp_routing.py
-@@ -0,0 +1,106 @@
-+# Part of Flectra. See LICENSE file for full copyright and licensing details.
-+
-+from flectra import api, fields, models
-+
-+
-+class MrpRouting(models.Model):
-+ _inherit = 'mrp.routing'
-+
-+ @api.multi
-+ def _get_old_versions(self):
-+ self.ensure_one()
-+ parent = self.parent_routing
-+ old_version = self.env['mrp.routing']
-+ while parent:
-+ old_version += parent
-+ parent = parent.parent_routing
-+ self.old_versions = old_version
-+
-+ name = fields.Char(
-+ states={'historical': [('readonly', True)]})
-+ sequence = fields.Integer('Sequence ',
-+ help="Gives the sequence order "
-+ "when displaying a list of "
-+ "routing.")
-+ eco_ids = fields.One2many('plm.eco', 'new_routing_id', 'ECOs')
-+ eco_count = fields.Integer('# ECOs', compute='_compute_plm_eco_data')
-+ parent_routing = fields.Many2one('mrp.routing', string='Parent BoM',
-+ copy=False)
-+ active = fields.Boolean(readonly=True, default=False,
-+ states={'draft': [('readonly', False)]})
-+ historical_date = fields.Date(string='Historical Date ', readonly=True)
-+ state = fields.Selection(
-+ selection=[('draft', 'Draft'), ('active', 'Active'),
-+ ('historical', 'Historical')], string='State ',
-+ index=True, readonly=True, default='draft', copy=False)
-+ version = fields.Integer(states={'historical': [('readonly', True)]},
-+ copy=False, default=1)
-+ old_versions = fields.Many2many('mrp.routing', string='Old Versions ',
-+ compute='_get_old_versions')
-+ type_id = fields.Selection(
-+ [('permanent', 'Permanent'), ('temporary', 'Temporary'),
-+ ('new_product_intro', 'New Product Introduction')], string='Type')
-+
-+ @api.multi
-+ def _compute_plm_eco_data(self):
-+ self.ensure_one()
-+ self.eco_count = len(self.eco_ids)
-+
-+ @api.multi
-+ def action_plm_eco(self):
-+ self.ensure_one()
-+ action = self.env.ref('plm.plm_eco_action_main').read()[0]
-+ action['domain'] = [('new_routing_id', '=', self.id)]
-+ action['context'] = {
-+ 'default_new_routing_id': self.id,
-+ }
-+ return action
-+
-+ @api.multi
-+ def button_draft(self):
-+ self.ensure_one()
-+ self.write({
-+ 'active': False,
-+ 'state': 'draft',
-+ })
-+
-+ @api.multi
-+ def button_new_version(self):
-+ self.ensure_one()
-+ new_routing = self._copy_routing()
-+ self.button_historical()
-+ return {
-+ 'type': 'ir.actions.act_window',
-+ 'view_type': 'form, tree',
-+ 'view_mode': 'form',
-+ 'res_model': 'mrp.routing',
-+ 'res_id': new_routing.id,
-+ 'target': 'current',
-+ }
-+
-+ @api.multi
-+ def _copy_routing(self):
-+ self.ensure_one()
-+ new_routing = self.copy({
-+ 'version': self.version + 1,
-+ 'active': False,
-+ 'name': str(self.name) + "[" + str(self.version + 1) + "]",
-+ })
-+ return new_routing
-+
-+ @api.multi
-+ def button_activate(self):
-+ self.ensure_one()
-+ self.write({
-+ 'active': True,
-+ 'state': 'active'
-+ })
-+
-+ @api.multi
-+ def button_historical(self):
-+ self.ensure_one()
-+ self.write({
-+ 'active': False,
-+ 'state': 'historical',
-+ 'historical_date': fields.Date.today()
-+ })
-diff --git addons/plm/models/plm_category.py addons/plm/models/plm_category.py
-new file mode 100644
-index 0000000..1b3614c
---- /dev/null
-+++ addons/plm/models/plm_category.py
-@@ -0,0 +1,43 @@
-+# Part of Flectra. See LICENSE file for full copyright and licensing details.
-+
-+from flectra import api, fields, models, _
-+from flectra.exceptions import ValidationError
-+
-+
-+class PlmCategory(models.Model):
-+ _name = "plm.category"
-+ _inherit = ['mail.thread', 'mail.activity.mixin', 'utm.mixin',
-+ 'format.address.mixin', 'ir.attachment', 'portal.mixin']
-+ _decription = "PLM Category"
-+
-+ name = fields.Char(string="Category", track_visibility='always')
-+ team_id = fields.Many2one('plm.team', string="Team",
-+ track_visibility='always', store=True)
-+ reviewer = fields.Many2one('res.users', string="Reviewer ",
-+ compute='_get_reviewer_approver',
-+ store=True, track_visibility='always')
-+ approver = fields.Many2one('res.users', string="Approver ",
-+ compute='_get_reviewer_approver',
-+ store=True, track_visibility='always')
-+ color = fields.Integer('Color Index', default=10)
-+
-+ @api.depends('team_id')
-+ def _get_reviewer_approver(self):
-+ for categ in self:
-+ if categ.team_id:
-+ reivewers = categ.team_id.member_ids.filtered(
-+ lambda user: user.type_of_user == 'reviewer')
-+ approvers = categ.team_id.member_ids.filtered(
-+ lambda user: user.type_of_user == 'approver')
-+ categ.reviewer = reivewers
-+ categ.approver = approvers
-+
-+ @api.constrains('team_id')
-+ def _check_team_id(self):
-+ if self.team_id:
-+ if not self.reviewer:
-+ raise ValidationError(
-+ _("Must be assign Reviewer"))
-+ if not self.approver:
-+ raise ValidationError(
-+ _("Must be assign Approver"))
-diff --git addons/plm/models/plm_eco.py addons/plm/models/plm_eco.py
+diff --git addons/plm/models/engineering_change_order.py addons/plm/models/engineering_change_order.py
new file mode 100644
-index 0000000..b89f430
+index 0000000..c4f816c
--- /dev/null
-+++ addons/plm/models/plm_eco.py
-@@ -0,0 +1,189 @@
++++ addons/plm/models/engineering_change_order.py
+@@ -0,0 +1,184 @@
+# Part of Flectra. See LICENSE file for full copyright and licensing details.
+
+from flectra import api, fields, models, _
+from flectra.exceptions import UserError, ValidationError
+
+
-+class PlmEco(models.Model):
-+ _name = 'plm.eco'
++class EngineeringChangeOrder(models.Model):
++ _name = 'engineering.change.order'
+ _description = 'Engineering Change Order'
+ _inherit = ['mail.thread', 'mail.activity.mixin', 'portal.mixin',
+ 'ir.attachment']
+
-+ name = fields.Char(string='ECR No.', required=True,
-+ copy=False, readonly=True,
-+ eco_stage={'draft': [('readonly', False)]},
++ name = fields.Char(string='Name', required=True, copy=False, readonly=True,
+ default=lambda self: _('New'))
-+ ecr_id = fields.Many2one('plm.ecr', string="ECR")
++ ecr_id = fields.Many2one('engineering.change.request', string="ECR")
+ ecr_date = fields.Date(string="ECR Date")
+ ecr_requester = fields.Char(string="ECR Requester")
-+ type_id = fields.Selection([('permanent', 'Permanent'),
-+ ('temporary', 'Temporary'),
-+ ('new_product_intro',
-+ 'New Product Introduction')],
-+ string='Type')
-+ responsible_id = fields.Many2one('res.users', 'Responsible',
-+ default=lambda self: self.env.user,
-+ track_visibility='always')
-+ company_id = fields.Many2one('res.company', 'Company',
-+ default=lambda self: self.env.user.company_id)
-+ eco_priority = fields.Selection([('0', 'Normal'), ('1', 'High')],
-+ string='Priority', index=True,
-+ track_visibility='always')
-+ notes = fields.Text(string="Note")
-+ effectivity = fields.Selection([('asap', 'As soon as possible'),
-+ ('date', 'At Date')],
-+ string='Effectivity ',
-+ compute='_adjust_effectivity',
-+ inverse='_effectivity_date', store=True)
-+
-+ effectivity_date = fields.Date('Effectivity Date ',
-+ track_visibility='always',
-+ help="For reference only.", store=True)
-+ eco_stage = fields.Selection([('draft', 'Draft'),
-+ ('in_progress', 'In Progress'),
-+ ('done', 'Done')], track_visibility='always',
-+ default='draft', string='Status')
++ type = fields.Selection([('permanent', 'Permanent'),
++ ('temporary', 'Temporary'),
++ ('new_product_intro',
++ 'New Product Introduction')],
++ string='Type', default='permanent')
++ user_id = fields.Many2one('res.users', 'Responsible',
++ default=lambda self: self.env.user,
++ track_visibility='always')
++ description = fields.Text(string='Description')
++ activation = fields.Selection([('directly', 'At the Earliest'),
++ ('manual', 'Manual')],
++ string='Activation ',
++ compute='_adjust_activation',
++ inverse='_activation_date', store=True)
++ activated_on = fields.Date('Activation Date ',
++ track_visibility='always',
++ help="For reference only.", store=True)
++ state = fields.Selection([('draft', 'Draft'),
++ ('in_progress', 'In Progress'),
++ ('done', 'Done')], track_visibility='always',
++ default='draft', string='Status')
+ product_tmpl_id = fields.Many2one('product.template',
+ string="Product ", required=True)
+ active = fields.Boolean('Active ', default=True,
+ help="If the active field is set to False, it"
+ "will allow you to hide the engineering"
+ "change order without removing it.")
-+ type = fields.Selection([('bom', 'Bill of Materials'),
-+ ('routing', 'Routing'),
-+ ('both', 'BoM and Routing')],
-+ string='Apply on', default='bom',
-+ track_visibility='always', required=True)
-+ new_routing_id = fields.Many2one('mrp.routing', 'New Routing',
++ applicability = fields.Selection([('bom', 'Bill of Materials'),
++ ('routing', 'Routing'),
++ ('both', 'BoM and Routing')],
++ string='Applicability', default='bom',
++ track_visibility='always', required=True)
++ latest_routing_id = fields.Many2one('mrp.routing', 'New Routing',
+ track_visibility='always',
+ copy=False)
+ routing_id = fields.Many2one('mrp.routing', "Routing")
-+ bom_id = fields.Many2one('mrp.bom', "Bill of Materials",
-+ track_visibility='always',
-+ domain="[('product_tmpl_id', '=',"
-+ " product_tmpl_id)]")
++ bom_id = fields.Many2one('mrp.bom', "BOM",
++ track_visibility='always')
+ color = fields.Integer('Color Index', default=1)
++ company_id = fields.Many2one('res.company', 'Company',
++ default=lambda self: self.env.user.company_id)
+
+ @api.multi
+ def _track_subtype(self, init_values):
+ self.ensure_one()
-+ if 'eco_stage' in init_values and self.eco_stage == 'draft':
-+ return 'plm.mt_plm_eco_create'
-+ return super(PlmEco, self)._track_subtype(init_values)
++ if 'state' in init_values and self.state == 'draft':
++ return 'plm.mt_engineering_change_order_create'
++ return super(EngineeringChangeOrder, self)._track_subtype(init_values)
+
-+ @api.constrains('ecr_date', 'effectivity_date')
++ @api.constrains('ecr_date', 'activated_on')
+ def ecr_date_greater(self):
-+ eff_date = self.effectivity_date
++ eff_date = self.activated_on
+ if self.ecr_date and eff_date and eff_date <= self.ecr_date:
+ raise ValidationError(
+ _("Effectivity Date Should be greater than ECR Date"))
@@ -1843,27 +1884,28 @@
+ self.ecr_date = self.ecr_id.ecr_date or False
+ self.ecr_requester = self.ecr_id.requested_by.name
+ self.product_tmpl_id = self.ecr_id.product_id.product_tmpl_id.id
-+ self.type_id = self.ecr_id.type_id or False
-+ self.effectivity_date = self.ecr_id.effective_date or False
++ self.type = self.ecr_id.type or False
++ self.activated_on = self.ecr_id.effective_date or False
+
-+ @api.depends('effectivity_date')
-+ def _adjust_effectivity(self):
++ @api.depends('activated_on')
++ def _adjust_activation(self):
+ for eco in self:
-+ eco.effectivity = 'date' if eco.effectivity_date else 'asap'
++ eco.activation = 'manual' if eco.activated_on else 'directly'
+
-+ def _effectivity_date(self):
++ def _activation_date(self):
+ for eco in self:
-+ if eco.effectivity == 'asap':
-+ eco.effectivity_date = False
++ if eco.activation == 'directly':
++ eco.activated_on = False
+
+ @api.onchange('product_tmpl_id')
-+ def onchange_product_tmpl_id(self):
-+ self.bom_id = self.product_tmpl_id.bom_ids and \
-+ self.product_tmpl_id.bom_ids.ids[0] or False
-+
-+ @api.onchange('bom_id', 'type')
-+ def onchange_bom_id(self):
-+ if self.type == 'both':
++ def product_template_change(self):
++ if self.product_tmpl_id.bom_ids:
++ self.bom_id = self.product_tmpl_id.bom_ids and \
++ self.product_tmpl_id.bom_ids.ids[0] or False
++
++ @api.onchange('bom_id', 'applicability')
++ def bom_applicability_change(self):
++ if self.applicability == 'both':
+ self.routing_id = self.bom_id.routing_id
+
+ @api.model
@@ -1871,34 +1913,34 @@
+ if vals.get('name', _('New')) == _('New'):
+ if 'company_id' in vals:
+ vals['name'] = self.env['ir.sequence'].with_context(
-+ force_company=vals['company_id']).next_by_code('plm.eco') \
++ force_company=vals['company_id']).next_by_code('engineering.change.order') \
+ or _('New')
+ else:
+ vals['name'] = self.env['ir.sequence'].next_by_code(
-+ 'plm.eco') or _('New')
-+ result = super(PlmEco, self).create(vals)
++ 'engineering.change.order') or _('New')
++ result = super(EngineeringChangeOrder, self).create(vals)
+ return result
+
+ @api.multi
+ def unlink(self):
+ for eco in self:
-+ if eco.eco_stage not in ('draft', 'cancel'):
++ if eco.state not in ('draft', 'cancel'):
+ raise UserError(_('You can not delete a Confirmed ECO!'
+ 'Try to cancel it before.'))
-+ return super(PlmEco, self).unlink()
++ return super(EngineeringChangeOrder, self).unlink()
+
+ @api.multi
+ def action_in_progress(self):
+ self.ensure_one()
-+ self.write({'eco_stage': 'in_progress'})
++ self.write({'state': 'in_progress'})
+
+ @api.multi
+ def action_done(self):
+ self.ensure_one()
-+ self.write({'eco_stage': 'done'})
++ self.write({'state': 'done'})
+
+ @api.multi
-+ def open_bom(self):
++ def action_view_bill_of_materials(self):
+ self.ensure_one()
+ bom_id = self.env['mrp.bom'].search([('active', '=', True),
+ ('product_tmpl_id', '=',
@@ -1906,20 +1948,20 @@
+ limit=1)
+ if not bom_id:
+ return True
-+ result = {'name': _('Eco BoM'),
++ result = {'name': _('Engineering Change Order BoM'),
+ 'type': 'ir.actions.act_window',
+ 'view_type': 'form',
+ 'view_mode': 'form',
+ 'res_model': 'mrp.bom',
+ 'target': 'current',
+ 'res_id': False}
-+ if self.type_id == 'permanent':
++ if self.type == 'permanent':
+ result.update({'res_id': bom_id.id})
+ else:
+ new_bom = self.bom_id.copy({
+ 'active': False,
+ 'parent_bom': self.bom_id.id,
-+ 'type_id': self.type_id,
++ 'change_order_type': self.type,
+ 'code': self.ecr_id.manufacture_order.name,
+ 'version': self.bom_id.version or False
+ })
@@ -1927,30 +1969,32 @@
+ return result
+
+ @api.multi
-+ def open_routing(self):
++ def change_order_routing_details(self):
+ self.ensure_one()
-+ result = {'name': _('Eco Routing'),
-+ 'type': 'ir.actions.act_window',
-+ 'view_type': 'form',
-+ 'view_mode': 'form',
-+ 'res_model': 'mrp.routing',
-+ 'target': 'current',
-+ 'res_id': False}
-+ if self.type_id == 'permanent':
-+ result.update({'res_id': self.new_routing_id.id})
++ result = {
++ 'name': _('Engineering Change Order Routing'),
++ 'res_model': 'mrp.routing',
++ 'res_id': False,
++ 'target': 'current',
++ 'view_type': 'form',
++ 'view_mode': 'form',
++ 'type': 'ir.actions.act_window',
++ }
++ if self.type == 'permanent':
++ result.update({'res_id': self.latest_routing_id.id})
+ else:
-+ new_routing = self.new_routing_id.copy({
++ latest_routing_id = self.latest_routing_id.copy({
+ 'active': False,
-+ 'type_id': self.type_id
++ 'change_order_type': self.type
+ })
-+ result.update({'res_id': new_routing.id})
++ result.update({'res_id': latest_routing_id.id})
+ return result
-diff --git addons/plm/models/plm_ecr.py addons/plm/models/plm_ecr.py
+diff --git addons/plm/models/engineering_change_request.py addons/plm/models/engineering_change_request.py
new file mode 100644
-index 0000000..f2895f3
+index 0000000..fa27650
--- /dev/null
-+++ addons/plm/models/plm_ecr.py
-@@ -0,0 +1,348 @@
++++ addons/plm/models/engineering_change_request.py
+@@ -0,0 +1,346 @@
+# Part of Flectra. See LICENSE file for full copyright and licensing details.
+
+from datetime import datetime, timedelta
@@ -1959,13 +2003,12 @@
+from flectra.exceptions import UserError, ValidationError
+
+
-+class PlmEcrApproval(models.Model):
-+ _name = 'plm.ecr.approval'
++class EngineeringChangeRequestAcceptance(models.Model):
++ _name = 'engineering.change.request.acceptance'
+ _order = 'date desc, id desc'
-+ _inherit = ['mail.thread', 'mail.activity.mixin', 'utm.mixin',
-+ 'format.address.mixin', 'ir.attachment', 'portal.mixin']
++ _inherit = ['mail.thread', 'mail.activity.mixin', 'ir.attachment']
+
-+ ecr_id = fields.Many2one('plm.ecr', string="ECR")
++ ecr_id = fields.Many2one('engineering.change.request', string="ECR")
+ name = fields.Selection([('reviewer', 'Reviewer'),
+ ('approver', 'Approver')], required=True,
+ string="Role")
@@ -1994,10 +2037,9 @@
+ rec.active_approver = True
+
+
-+class PlmEcr(models.Model):
-+ _name = 'plm.ecr'
-+ _inherit = ['mail.thread', 'mail.activity.mixin', 'utm.mixin',
-+ 'format.address.mixin', 'ir.attachment', 'portal.mixin']
++class EngineeringChangeRequest(models.Model):
++ _name = 'engineering.change.request'
++ _inherit = ['mail.thread', 'mail.activity.mixin', 'ir.attachment']
+
+ name = fields.Char(string='ECR No.', required=True,
+ copy=False, readonly=True,
@@ -2015,11 +2057,11 @@
+ '=', 'manufacture_order.sale_id.name')])
+ ecr_date = fields.Datetime(string="Date", default=datetime.today())
+ dwg_no = fields.Char(string="Dwg. No.")
-+ type_id = fields.Selection([('permanent', 'Permanent'),
-+ ('temporary', 'Temporary'),
-+ ('new_product_intro',
-+ 'New Product Introduction')],
-+ string='Type')
++ type = fields.Selection([('permanent', 'Permanent'),
++ ('temporary', 'Temporary'),
++ ('new_product_intro',
++ 'New Product Introduction')],
++ string='Type', default='permanent')
+ production_status = fields.Selection([('manufacture_order_on_hold',
+ 'Manufacturing Order On Hold'),
+ ('production_on_hold',
@@ -2028,7 +2070,7 @@
+ description_request = fields.Text(string="Description")
+ reason_request = fields.Text(string="Reason For Request")
+ comments = fields.Text(string="Comments ")
-+ effectivity = fields.Selection([('asap', 'As soon as possible'),
++ activation = fields.Selection([('directly', 'As soon as possible'),
+ ('at_date', 'At Date')])
+ company_id = fields.Many2one('res.company', string="Company",
+ default=lambda self: self.env['res.company']
@@ -2036,7 +2078,7 @@
+ category_ids = fields.Many2many('plm.category', string="Categories")
+ priority = fields.Selection([('normal', 'NORMAL'), ('urgent', 'URGENT'),
+ ('externaly_urgent', 'EXTREMELY URGENT')])
-+ approval_ids = fields.One2many('plm.ecr.approval', 'ecr_id', 'Approvals',
++ approval_ids = fields.One2many('engineering.change.request.acceptance', 'ecr_id', 'Approvals',
+ help='Approvals by stage',
+ track_visibility='always')
+ product_id = fields.Many2one('product.product', string="Product",
@@ -2045,8 +2087,8 @@
+ related='product_id.product_tmpl_id',
+ string="Product", required=True)
+ effective_date = fields.Date(string="Effective Date ")
-+ eco_count = fields.Integer('# ECOs', compute='_compute_plm_eco_data')
-+ eco_ids = fields.One2many('plm.eco', 'ecr_id', 'ECO to be applied')
++ total_change_order = fields.Integer('# ECOs', compute='_compute_engineering_change_order_data')
++ change_order_ids = fields.One2many('engineering.change.order', 'ecr_id', 'ECO to be applied')
+ reviewed_boolean = fields.Boolean(string="Reviewed")
+ approved_boolean = fields.Boolean(string="Approved")
+ color = fields.Integer(compute='_check_color', string="Color")
@@ -2068,7 +2110,7 @@
+ return 'plm.mt_plm_approve'
+ elif 'state' in init_values and self.state == 'rejected':
+ return 'plm.mt_plm_reject'
-+ return super(PlmEcr, self)._track_subtype(init_values)
++ return super(EngineeringChangeRequest, self)._track_subtype(init_values)
+
+ @api.multi
+ def _check_color(self):
@@ -2081,15 +2123,15 @@
+ record.color = res.get(record.state, False)
+
+ @api.multi
-+ def _compute_plm_eco_data(self):
-+ eco_data = self.env['plm.eco'].read_group([
++ def _compute_engineering_change_order_data(self):
++ eco_data = self.env['engineering.change.order'].read_group([
+ ('product_tmpl_id', 'in', self.mapped('product_tmpl_id').ids),
-+ ('eco_stage', '=', 'in_progress')],
++ ('state', '=', 'in_progress')],
+ ['product_tmpl_id'], ['product_tmpl_id'])
+ result = dict((data['product_tmpl_id'][0],
+ data['product_tmpl_id_count']) for data in eco_data)
+ for bom in self:
-+ bom.eco_count = len(bom.eco_ids)
++ bom.total_change_order = len(bom.change_order_ids)
+ bom.eco_inprogress_count = result.get(bom.product_tmpl_id.id, 0)
+
+ @api.multi
@@ -2131,13 +2173,23 @@
+ self.write({'state': 'reject'})
+
+ @api.multi
-+ def action_plm_eco(self):
++ def action_engineering_change_order(self):
+ self.ensure_one()
-+ action = self.env.ref('plm.plm_eco_action_main').read()[0]
-+ action['domain'] = [('ecr_id', '=', self.id)]
-+ action['context'] = {'default_ecr_id': self.id,
-+ 'default_product_tmpl_id': self.product_tmpl_id.id
-+ }
++ change_orders = self.env['engineering.change.order'].search(
++ [('ecr_id', '=', self.id)])
++ action = self.env.ref(
++ 'plm.engineering_change_order_action_main').read()[0]
++ action['context'] = {
++ 'default_ecr_id': self.id,
++ 'default_product_tmpl_id': self.product_tmpl_id.id
++ }
++ if len(change_orders) > 1:
++ action['domain'] = [('id', 'in', change_orders.ids)]
++ elif len(change_orders) == 1:
++ action['views'] = [
++ (self.env.ref('plm.engineering_change_order_view_form').id,
++ 'form')]
++ action['res_id'] = change_orders.ids[0]
+ return action
+
+ @api.multi
@@ -2150,7 +2202,7 @@
+ @api.multi
+ def create_reviewer(self):
+ for category in self.category_ids:
-+ self.env['plm.ecr.approval'].create({
++ self.env['engineering.change.request.acceptance'].create({
+ 'name': 'reviewer',
+ 'user_id': category.reviewer.id,
+ 'ecr_id': self.id,
@@ -2161,7 +2213,7 @@
+ @api.multi
+ def create_approver(self):
+ for category in self.category_ids:
-+ self.env['plm.ecr.approval'].create({
++ self.env['engineering.change.request.acceptance'].create({
+ 'name': 'approver',
+ 'user_id': category.approver.id,
+ 'ecr_id': self.id,
@@ -2204,9 +2256,9 @@
+ if ecr.state not in ('draft', 'cancel'):
+ raise UserError(_('You can not delete a'
+ 'Confirmed ECR! Try to cancel it before.'))
-+ return super(PlmEcr, self).unlink()
++ return super(EngineeringChangeRequest, self).unlink()
+
-+ @api.onchange('product_id', 'effectivity')
++ @api.onchange('product_id', 'activation')
+ def onchange_product_id(self):
+ self.effective_date = None
+ if self.product_id.produce_delay:
@@ -2220,9 +2272,9 @@
+ if self.manufacture_order.sale_id:
+ self.sale_id = self.manufacture_order.sale_id.id
+
-+ @api.onchange('type_id')
++ @api.onchange('type')
+ def onchange_type_id(self):
-+ self.production_status = self.type_id == 'permanent' and \
++ self.production_status = self.type == 'permanent' and \
+ 'production_on_hold' or \
+ 'manufacture_order_on_hold'
+
@@ -2252,11 +2304,11 @@
+ if 'company_id' in vals:
+ vals['name'] = self.env['ir.sequence'].with_context(
+ force_company=vals['company_id']).next_by_code(
-+ 'plm.ecr') or _('New')
++ 'engineering.change.request') or _('New')
+ else:
+ vals['name'] = self.env['ir.sequence'].next_by_code(
-+ 'plm.ecr') or _('New')
-+ result = super(PlmEcr, self).create(vals)
++ 'engineering.change.request') or _('New')
++ result = super(EngineeringChangeRequest, self).create(vals)
+ return result
+
+
@@ -2274,11 +2326,9 @@
+class ProductTemplate(models.Model):
+ _inherit = 'product.template'
+
-+ version = fields.Integer('Version', default=1)
-+ eco_count = fields.Integer('# ECOs', compute='_compute_eco_count')
-+ eco_ids = fields.One2many('plm.eco', 'product_tmpl_id', 'ECOs')
-+ template_attachment_count = fields.Integer('# Attachments',
-+ compute='_compute_attachments')
++ total_change_order = fields.Integer('Total Change Orders',
++ compute='_compute_engineering_change_order_data')
++ change_order_ids = fields.One2many('engineering.change.order', 'product_tmpl_id', 'ECOs')
+
+ @api.model
+ def name_search(self, name, args=None, operator='ilike', limit=100):
@@ -2288,63 +2338,101 @@
+ return recs.name_get()
+
+ @api.multi
-+ def _compute_eco_count(self):
-+ for eco in self:
-+ eco.eco_count = len(eco.eco_ids)
-+
-+ @api.multi
-+ def _compute_attachments(self):
-+ for doc in self:
-+ attachments = self.env['mrp.document'].search(
-+ ['&', ('res_model', '=', 'product.template'),
-+ ('res_id', '=', doc.id)])
-+ doc.template_attachment_count = len(attachments)
-diff --git addons/plm/models/plm_reason.py addons/plm/models/plm_reason.py
-new file mode 100644
-index 0000000..28730df
---- /dev/null
-+++ addons/plm/models/plm_reason.py
-@@ -0,0 +1,14 @@
-+# Part of Flectra. See LICENSE file for full copyright and licensing details.
-+
-+from flectra import fields, models
-+
-+
-+class PlmReason(models.Model):
-+ _name = 'plm.reason'
-+ _decription = "PLM Reason"
-+ _inherit = ['mail.thread', 'mail.activity.mixin', 'portal.mixin']
-+
-+ name = fields.Char(string="Reason ", required=True, translate=True,
-+ track_visibility='always')
-+ action = fields.Selection([('review', 'Review'), ('approve', 'Approve'),
-+ ('reject', 'Reject')], string="Action ")
-diff --git addons/plm/models/plm_team.py addons/plm/models/plm_team.py
++ def _compute_engineering_change_order_data(self):
++ self.ensure_one()
++ self.total_change_order = len(self.change_order_ids)
+diff --git addons/plm/models/plm_category.py addons/plm/models/plm_category.py
new file mode 100644
-index 0000000..e33a397
+index 0000000..65be853
--- /dev/null
-+++ addons/plm/models/plm_team.py
-@@ -0,0 +1,58 @@
++++ addons/plm/models/plm_category.py
+@@ -0,0 +1,42 @@
+# Part of Flectra. See LICENSE file for full copyright and licensing details.
+
+from flectra import api, fields, models, _
+from flectra.exceptions import ValidationError
-+from flectra.tools.safe_eval import safe_eval
+
+
-+class PlmTeam(models.Model):
-+ _name = 'plm.team'
-+ _decription = "PLM Team"
-+ _inherit = ['mail.thread', 'mail.activity.mixin', 'utm.mixin',
-+ 'mail.alias.mixin', 'format.address.mixin', 'ir.attachment',
-+ 'portal.mixin']
++class PlmCategory(models.Model):
++ _name = "plm.category"
++ _inherit = ['mail.thread', 'mail.activity.mixin', 'ir.attachment']
++ _decription = "PLM Category"
+
-+ name = fields.Char('PLM Team', required=True, translate=True,
-+ track_visibility='always')
-+ active = fields.Boolean(default=True, track_visibility='always',
-+ help="If the active field is set to false,"
-+ "it will allow you to hide the plm team"
-+ "without removing it.")
++ name = fields.Char(string="Category", track_visibility='always')
++ team_id = fields.Many2one('plm.team', string="Team",
++ track_visibility='always', store=True)
++ reviewer = fields.Many2one('res.users', string="Reviewer ",
++ compute='_get_reviewer_approver',
++ store=True, track_visibility='always')
++ approver = fields.Many2one('res.users', string="Approver ",
++ compute='_get_reviewer_approver',
++ store=True, track_visibility='always')
++ color = fields.Integer('Color Index', default=10)
++
++ @api.depends('team_id')
++ def _get_reviewer_approver(self):
++ for categ in self:
++ if categ.team_id:
++ reivewers = categ.team_id.member_ids.filtered(
++ lambda user: user.type_of_user == 'reviewer')
++ approvers = categ.team_id.member_ids.filtered(
++ lambda user: user.type_of_user == 'approver')
++ categ.reviewer = reivewers
++ categ.approver = approvers
++
++ @api.constrains('team_id')
++ def _check_team_id(self):
++ if self.team_id:
++ if not self.reviewer:
++ raise ValidationError(
++ _("Must be assign Reviewer"))
++ if not self.approver:
++ raise ValidationError(
++ _("Must be assign Approver"))
+diff --git addons/plm/models/plm_reason.py addons/plm/models/plm_reason.py
+new file mode 100644
+index 0000000..4ea97dd
+--- /dev/null
++++ addons/plm/models/plm_reason.py
+@@ -0,0 +1,14 @@
++# Part of Flectra. See LICENSE file for full copyright and licensing details.
++
++from flectra import fields, models
++
++
++class PlmReason(models.Model):
++ _name = 'plm.reason'
++ _decription = "PLM Reason"
++ _inherit = ['mail.thread', 'mail.activity.mixin']
++
++ name = fields.Char(string="Reason ", required=True, translate=True,
++ track_visibility='always')
++ action = fields.Selection([('review', 'Review'), ('approve', 'Approve'),
++ ('reject', 'Reject')], string="Action ")
+diff --git addons/plm/models/plm_team.py addons/plm/models/plm_team.py
+new file mode 100644
+index 0000000..ff97485
+--- /dev/null
++++ addons/plm/models/plm_team.py
+@@ -0,0 +1,56 @@
++# Part of Flectra. See LICENSE file for full copyright and licensing details.
++
++from flectra import api, fields, models, _
++from flectra.exceptions import ValidationError
++from flectra.tools.safe_eval import safe_eval
++
++
++class PlmTeam(models.Model):
++ _name = 'plm.team'
++ _decription = "PLM Team"
++ _inherit = ['mail.thread', 'mail.activity.mixin', 'mail.alias.mixin']
++
++ name = fields.Char('PLM Team', required=True, translate=True,
++ track_visibility='always')
++ active = fields.Boolean(default=True, track_visibility='always',
++ help="If the active field is set to false,"
++ "it will allow you to hide the plm team"
++ "without removing it.")
+ member_ids = fields.Many2many('res.users', string='PLM Team Members',
+ track_visibility='always')
+ alias_id = fields.Many2one('mail.alias', 'Alias', ondelete='restrict',
@@ -2352,7 +2440,7 @@
+
+ @api.multi
+ def get_alias_model_name(self, vals):
-+ return vals.get('alias_model', 'plm.ecr')
++ return vals.get('alias_model', 'engineering.change.request')
+
+ @api.multi
+ def get_alias_values(self):
@@ -2383,9 +2471,75 @@
+ for team in self:
+ team.alias_id.write(team.get_alias_values())
+ return result
+diff --git addons/plm/models/production.py addons/plm/models/production.py
+new file mode 100644
+index 0000000..4c7b5c1
+--- /dev/null
++++ addons/plm/models/production.py
+@@ -0,0 +1,60 @@
++# Part of Flectra. See LICENSE file for full copyright and licensing details.
++
++from datetime import datetime
++
++from flectra import api, fields, models
++
++
++class MrpProduction(models.Model):
++ _inherit = 'mrp.production'
++
++ sale_id = fields.Many2one('sale.order', string="Sale Order",
++ compute="get_sale_id", store=True)
++ total_change_order = fields.Integer(
++ 'Total Change Orders',
++ compute='_compute_engineering_change_order_data')
++ change_request_ids = fields.One2many(
++ 'engineering.change.request', 'manufacture_order', 'ECR')
++
++ @api.multi
++ def button_engineering_change_request(self):
++ self.ensure_one()
++ change_request = self.env['engineering.change.request'].search(
++ [('manufacture_order', '=', self.id)])
++ action = self.env.ref(
++ 'plm.action_engineering_change_request').read()[0]
++ action['context'] = {
++ 'default_product_tmpl_id': self.product_tmpl_id.id,
++ 'default_manufacture_order': self.id
++ }
++ if len(change_request) > 1:
++ action['domain'] = [('id', 'in', change_request.ids)]
++ elif len(change_request) == 1:
++ action['views'] = [
++ (self.env.ref('plm.engineering_change_request_form_view').id,
++ 'form')]
++ action['res_id'] = change_request.ids[0]
++ return action
++
++ @api.multi
++ def _compute_engineering_change_order_data(self):
++ self.ensure_one()
++ self.total_change_order = len(self.change_request_ids)
++
++ @api.depends('origin')
++ def get_sale_id(self):
++ sale_order = self.env['sale.order']
++ for mo in self:
++ mo.sale_id = sale_order.search([('name', '=', mo.origin)])
++
++ @api.multi
++ def create_ecr(self):
++ self.ensure_one()
++ ecr = self.env['engineering.change.request'].create({
++ 'requested_by': self.env.user.id,
++ 'ecr_date': datetime.today().date(),
++ 'product_id': self.product_id.id,
++ 'manufacture_order': self.id,
++ 'sale_id': self.sale_id.id,
++ })
++ return ecr
diff --git addons/plm/models/res_users.py addons/plm/models/res_users.py
new file mode 100644
-index 0000000..1acd5bd
+index 0000000..ec282c8
--- /dev/null
+++ addons/plm/models/res_users.py
@@ -0,0 +1,66 @@
@@ -2409,16 +2563,16 @@
+ @api.depends('groups_id')
+ def _get_type_of_user(self):
+ for user in self:
-+ res = {'requester': user.has_group('plm.group_plm_ecr_requester'),
-+ 'reviewer': user.has_group('plm.group_plm_ecr_reviewer'),
-+ 'approver': user.has_group('plm.group_plm_ecr_approver')
++ res = {'requester': user.has_group('plm.group_engineering_change_request_requester'),
++ 'reviewer': user.has_group('plm.group_engineering_change_request_reviewer'),
++ 'approver': user.has_group('plm.group_engineering_change_request_approver')
+ }
+ for key in res:
+ if res[key]:
+ user.type_of_user = key
+ member = [res[i] for i in res]
-+ user_member = user.has_group('plm.group_plm_ecr_member')
-+ user_manager = user.has_group('plm.group_plm_ecr_manager')
++ user_member = user.has_group('plm.group_engineering_change_request_member')
++ user_manager = user.has_group('plm.group_engineering_change_request_manager')
+ if not any(member) and user_member:
+ user.type_of_user = 'member'
+ if user_manager:
@@ -2427,10 +2581,10 @@
+ @api.model
+ def create(self, values):
+ result = super(ResUsers, self).create(values)
-+ res = {'reviewer': result.has_group('plm.group_plm_ecr_reviewer'),
-+ 'approver': result.has_group('plm.group_plm_ecr_approver'),
-+ 'requester': result.has_group('plm.group_plm_ecr_requester'),
-+ 'manager': result.has_group('plm.group_plm_ecr_manager'),
++ res = {'reviewer': result.has_group('plm.group_engineering_change_request_reviewer'),
++ 'approver': result.has_group('plm.group_engineering_change_request_approver'),
++ 'requester': result.has_group('plm.group_engineering_change_request_requester'),
++ 'manager': result.has_group('plm.group_engineering_change_request_manager'),
+ }
+ if not res['manager']:
+ if res['reviewer'] and res['approver'] or res['requester'] and \
@@ -2443,10 +2597,10 @@
+ def write(self, values):
+ result = super(ResUsers, self).write(values)
+ for user in self:
-+ res = {'reviewer': user.has_group('plm.group_plm_ecr_reviewer'),
-+ 'approver': user.has_group('plm.group_plm_ecr_approver'),
-+ 'requester': user.has_group('plm.group_plm_ecr_requester'),
-+ 'manager': user.has_group('plm.group_plm_ecr_manager'),
++ res = {'reviewer': user.has_group('plm.group_engineering_change_request_reviewer'),
++ 'approver': user.has_group('plm.group_engineering_change_request_approver'),
++ 'requester': user.has_group('plm.group_engineering_change_request_requester'),
++ 'manager': user.has_group('plm.group_engineering_change_request_manager'),
+ }
+ if not res['manager']:
+ if res['reviewer'] and res['approver'] or \
@@ -2455,130 +2609,252 @@
+ raise ValidationError(
+ _("Select either Approver or Reviewer"))
+ return result
+diff --git addons/plm/models/routing.py addons/plm/models/routing.py
+new file mode 100644
+index 0000000..ddf0cdd
+--- /dev/null
++++ addons/plm/models/routing.py
+@@ -0,0 +1,115 @@
++# Part of Flectra. See LICENSE file for full copyright and licensing details.
++
++from flectra import api, fields, models
++
++
++class MrpRouting(models.Model):
++ _inherit = 'mrp.routing'
++
++ @api.multi
++ def _get_old_versions(self):
++ self.ensure_one()
++ parent = self.parent_routing
++ old_version = self.env['mrp.routing']
++ while parent:
++ old_version += parent
++ parent = parent.parent_routing
++ self.old_versions = old_version
++
++ name = fields.Char(
++ states={'historical': [('readonly', True)]})
++ sequence = fields.Integer('Sequence ',
++ help="Gives the sequence order "
++ "when displaying a list of "
++ "routing.")
++ change_order_ids = fields.One2many('engineering.change.order', 'latest_routing_id', 'ECOs')
++ total_change_order = fields.Integer('Total Change Orders',
++ compute='_compute_engineering_change_order_data')
++ parent_routing = fields.Many2one('mrp.routing', string='Parent BoM',
++ copy=False)
++ active = fields.Boolean(readonly=True, default=False,
++ states={'draft': [('readonly', False)]})
++ historical_date = fields.Date(string='Historical Date ', readonly=True)
++ state = fields.Selection(
++ selection=[('draft', 'Draft'), ('active', 'Active'),
++ ('historical', 'Historical')], string='State ',
++ index=True, readonly=True, default='draft', copy=False)
++ version = fields.Integer(states={'historical': [('readonly', True)]},
++ copy=False, default=1)
++ old_versions = fields.Many2many('mrp.routing', string='Old Versions ',
++ compute='_get_old_versions')
++ change_order_type = fields.Selection(
++ [('permanent', 'Permanent'), ('temporary', 'Temporary'),
++ ('new_product_intro', 'New Product Introduction')], string='Type')
++
++ @api.multi
++ def _compute_engineering_change_order_data(self):
++ self.ensure_one()
++ self.total_change_order = len(self.change_order_ids)
++
++ @api.multi
++ def action_engineering_change_order(self):
++ self.ensure_one()
++ change_orders = self.env['engineering.change.order'].search(
++ [('latest_routing_id', '=', self.id)])
++ action = self.env.ref(
++ 'plm.engineering_change_order_action_main').read()[0]
++ if len(change_orders) > 1:
++ action['domain'] = [('id', 'in', change_orders.ids)]
++ elif len(change_orders) == 1:
++ action['views'] = [
++ (self.env.ref('plm.engineering_change_order_view_form').id,
++ 'form')]
++ action['res_id'] = change_orders.ids[0]
++ else:
++ action = {'type': 'ir.actions.act_window_close'}
++ return action
++
++ @api.multi
++ def button_draft(self):
++ self.ensure_one()
++ self.write({
++ 'active': False,
++ 'state': 'draft',
++ })
++
++ @api.multi
++ def button_new_version(self):
++ self.ensure_one()
++ new_routing = self._copy_routing()
++ self.button_historical()
++ return {
++ 'type': 'ir.actions.act_window',
++ 'view_type': 'form, tree',
++ 'view_mode': 'form',
++ 'res_model': 'mrp.routing',
++ 'res_id': new_routing.id,
++ 'target': 'current',
++ }
++
++ @api.multi
++ def _copy_routing(self):
++ self.ensure_one()
++ new_routing = self.copy({
++ 'version': self.version + 1,
++ 'active': False,
++ 'name': str(self.name) + "[" + str(self.version + 1) + "]",
++ })
++ return new_routing
++
++ @api.multi
++ def button_activate(self):
++ self.ensure_one()
++ self.write({
++ 'active': True,
++ 'state': 'active'
++ })
++
++ @api.multi
++ def button_historical(self):
++ self.ensure_one()
++ self.write({
++ 'active': False,
++ 'state': 'historical',
++ 'historical_date': fields.Date.today()
++ })
diff --git addons/plm/security/ir.model.access.csv addons/plm/security/ir.model.access.csv
new file mode 100644
-index 0000000..254c9c7
+index 0000000..773708a
--- /dev/null
+++ addons/plm/security/ir.model.access.csv
@@ -0,0 +1,34 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
-+access_plm_category_requester,plm.category,plm.model_plm_category,plm.group_plm_ecr_requester,1,0,0,0
-+access_plm_category_reviewer,plm.category,plm.model_plm_category,plm.group_plm_ecr_reviewer,1,0,0,0
-+access_plm_category_approver,plm.category,plm.model_plm_category,plm.group_plm_ecr_approver,1,0,0,0
-+access_plm_category_member,plm.category,plm.model_plm_category,plm.group_plm_ecr_member,1,0,0,0
-+access_plm_category_manager,plm.category,plm.model_plm_category,plm.group_plm_ecr_manager,1,1,1,1
-+access_plm_ecr_approval_requester,plm.ecr.approval,plm.model_plm_ecr_approval,plm.group_plm_ecr_requester,1,1,1,1
-+access_plm_ecr_approval_reviewer,plm.ecr.approval,plm.model_plm_ecr_approval,plm.group_plm_ecr_reviewer,1,1,1,1
-+access_plm_ecr_approval_approver,plm.ecr.approval,plm.model_plm_ecr_approval,plm.group_plm_ecr_approver,1,1,1,1
-+access_plm_ecr_approval_member,plm.ecr.approval,plm.model_plm_ecr_approval,plm.group_plm_ecr_member,1,1,1,1
-+access_plm_ecr_approval_manager,plm.ecr.approval,plm.model_plm_ecr_approval,plm.group_plm_ecr_manager,1,1,1,1
-+access_plm_eco_requester,plm.eco,model_plm_eco,plm.group_plm_ecr_requester,1,1,1,1
-+access_plm_eco_reviewer,plm.eco,model_plm_eco,plm.group_plm_ecr_reviewer,1,0,0,0
-+access_plm_eco_approver,plm.eco,model_plm_eco,plm.group_plm_ecr_approver,1,0,0,0
-+access_plm_eco_manager,plm.eco,model_plm_eco,plm.group_plm_ecr_manager,1,1,1,1
-+access_plm_eco_member,plm.eco,model_plm_eco,plm.group_plm_ecr_member,1,0,0,0
-+access_plm_team_requester,plm.team,model_plm_team,plm.group_plm_ecr_requester,1,0,0,0
-+access_plm_team_reviewer,plm.team,model_plm_team,plm.group_plm_ecr_reviewer,1,0,0,0
-+access_plm_team_approver,plm.team,model_plm_team,plm.group_plm_ecr_approver,1,0,0,0
-+access_plm_team_manager,plm.team,model_plm_team,plm.group_plm_ecr_manager,1,1,1,1
-+access_plm_team_member,plm.team,model_plm_team,plm.group_plm_ecr_member,1,0,0,0
-+access_plm_ecr_requester,plm.ecr,plm.model_plm_ecr,plm.group_plm_ecr_requester,1,1,1,1
-+access_plm_ecr_reviewer,plm.ecr,plm.model_plm_ecr,plm.group_plm_ecr_reviewer,1,1,0,0
-+access_plm_ecr_approver,plm.ecr,plm.model_plm_ecr,plm.group_plm_ecr_approver,1,1,0,1
-+access_plm_ecr_manager,plm.ecr,plm.model_plm_ecr,plm.group_plm_ecr_manager,1,1,1,1
-+access_plm_ecr_member,plm.ecr,plm.model_plm_ecr,plm.group_plm_ecr_member,1,0,0,0
-+access_ir_rule_requester,ir.rule,base.model_ir_rule,plm.group_plm_ecr_requester,1,0,0,0
-+access_ir_config_parameter_requester,ir.config_parameter,base.model_ir_config_parameter,plm.group_plm_ecr_requester,1,0,0,0
-+access_ir_module_module_requester,ir.module.module,base.model_ir_module_module,plm.group_plm_ecr_requester,1,0,0,0
-+access_plm_reason_requester,plm.reason,model_plm_reason,plm.group_plm_ecr_requester,1,0,0,0
-+access_plm_reason_reviewer,plm.reason,model_plm_reason,plm.group_plm_ecr_reviewer,1,0,0,0
-+access_plm_reason_approver,plm.reason,model_plm_reason,plm.group_plm_ecr_approver,1,0,0,0
-+access_plm_reason_manager,plm.reason,model_plm_reason,plm.group_plm_ecr_manager,1,1,1,1
-+access_plm_reason_member,plm.reason,model_plm_reason,plm.group_plm_ecr_member,1,0,0,0
++access_plm_category_requester,plm.category,plm.model_plm_category,plm.group_engineering_change_request_requester,1,0,0,0
++access_plm_category_reviewer,plm.category,plm.model_plm_category,plm.group_engineering_change_request_reviewer,1,0,0,0
++access_plm_category_approver,plm.category,plm.model_plm_category,plm.group_engineering_change_request_approver,1,0,0,0
++access_plm_category_member,plm.category,plm.model_plm_category,plm.group_engineering_change_request_member,1,0,0,0
++access_plm_category_manager,plm.category,plm.model_plm_category,plm.group_engineering_change_request_manager,1,1,1,1
++access_engineering_change_request_acceptance_requester,engineering.change.request.acceptance,plm.model_engineering_change_request_acceptance,plm.group_engineering_change_request_requester,1,1,1,1
++access_engineering_change_request_acceptance_reviewer,engineering.change.request.acceptance,plm.model_engineering_change_request_acceptance,plm.group_engineering_change_request_reviewer,1,1,1,1
++access_engineering_change_request_acceptance_approver,engineering.change.request.acceptance,plm.model_engineering_change_request_acceptance,plm.group_engineering_change_request_approver,1,1,1,1
++access_engineering_change_request_acceptance_member,engineering.change.request.acceptance,plm.model_engineering_change_request_acceptance,plm.group_engineering_change_request_member,1,1,1,1
++access_engineering_change_request_acceptance_manager,engineering.change.request.acceptance,plm.model_engineering_change_request_acceptance,plm.group_engineering_change_request_manager,1,1,1,1
++access_engineering_change_order_requester,engineering.change.order,model_engineering_change_order,plm.group_engineering_change_request_requester,1,1,1,1
++access_engineering_change_order_reviewer,engineering.change.order,model_engineering_change_order,plm.group_engineering_change_request_reviewer,1,0,0,0
++access_engineering_change_order_approver,engineering.change.order,model_engineering_change_order,plm.group_engineering_change_request_approver,1,0,0,0
++access_engineering_change_order_manager,engineering.change.order,model_engineering_change_order,plm.group_engineering_change_request_manager,1,1,1,1
++access_engineering_change_order_member,engineering.change.order,model_engineering_change_order,plm.group_engineering_change_request_member,1,0,0,0
++access_plm_team_requester,plm.team,model_plm_team,plm.group_engineering_change_request_requester,1,0,0,0
++access_plm_team_reviewer,plm.team,model_plm_team,plm.group_engineering_change_request_reviewer,1,0,0,0
++access_plm_team_approver,plm.team,model_plm_team,plm.group_engineering_change_request_approver,1,0,0,0
++access_plm_team_manager,plm.team,model_plm_team,plm.group_engineering_change_request_manager,1,1,1,1
++access_plm_team_member,plm.team,model_plm_team,plm.group_engineering_change_request_member,1,0,0,0
++access_engineering_change_request_requester,engineering.change.request,plm.model_engineering_change_request,plm.group_engineering_change_request_requester,1,1,1,1
++access_engineering_change_request_reviewer,engineering.change.request,plm.model_engineering_change_request,plm.group_engineering_change_request_reviewer,1,1,0,0
++access_engineering_change_request_approver,engineering.change.request,plm.model_engineering_change_request,plm.group_engineering_change_request_approver,1,1,0,1
++access_engineering_change_request_manager,engineering.change.request,plm.model_engineering_change_request,plm.group_engineering_change_request_manager,1,1,1,1
++access_engineering_change_request_member,engineering.change.request,plm.model_engineering_change_request,plm.group_engineering_change_request_member,1,0,0,0
++access_ir_rule_requester,ir.rule,base.model_ir_rule,plm.group_engineering_change_request_requester,1,0,0,0
++access_ir_config_parameter_requester,ir.config_parameter,base.model_ir_config_parameter,plm.group_engineering_change_request_requester,1,0,0,0
++access_ir_module_module_requester,ir.module.module,base.model_ir_module_module,plm.group_engineering_change_request_requester,1,0,0,0
++access_plm_reason_requester,plm.reason,model_plm_reason,plm.group_engineering_change_request_requester,1,0,0,0
++access_plm_reason_reviewer,plm.reason,model_plm_reason,plm.group_engineering_change_request_reviewer,1,0,0,0
++access_plm_reason_approver,plm.reason,model_plm_reason,plm.group_engineering_change_request_approver,1,0,0,0
++access_plm_reason_manager,plm.reason,model_plm_reason,plm.group_engineering_change_request_manager,1,1,1,1
++access_plm_reason_member,plm.reason,model_plm_reason,plm.group_engineering_change_request_member,1,0,0,0
diff --git addons/plm/security/plm_security.xml addons/plm/security/plm_security.xml
new file mode 100644
-index 0000000..634729e
+index 0000000..8437c35
--- /dev/null
+++ addons/plm/security/plm_security.xml
-@@ -0,0 +1,78 @@
+@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<flectra>
-+ <!-- This group is meant to manage PLM stages -->
-+ <record model="ir.module.category" id="module_category_plm_ecr">
++
++ <record model="ir.module.category" id="module_category_engineering_change_request">
+ <field name="name">PLM</field>
-+ <field name="description">Helps you manage your product's
-+ lifecycles.
++ <field name="description">Maintain Product Lifecycle Management for
++ BoM and Routing.
+ </field>
+ <field name="sequence">5</field>
+ </record>
+
-+ <record model="ir.module.category" id="module_category_plm_ecr111">
++ <record model="ir.module.category" id="module_category_engineering_change_request111">
+ <field name="name">PLM</field>
-+ <field name="description">Helps you manage your product's
-+ lifecycles.
++ <field name="description">Maintain Product Lifecycle Management for
++ BoM and Routing.
+ </field>
+ <field name="sequence">5</field>
+ </record>
+
-+ <record id="group_plm_ecr_member" model="res.groups">
++ <record id="group_engineering_change_request_member" model="res.groups">
+ <field name="name">Member</field>
-+ <field name="category_id" ref="plm.module_category_plm_ecr"/>
++ <field name="category_id" ref="plm.module_category_engineering_change_request"/>
+ <field name="implied_ids" eval="[(4, ref('mrp.group_mrp_user'))]"/>
-+ <field name="comment">The PLM user uses products lifecycle
-+ management
-+ </field>
++ <field name="comment">Member who can view Change Orders and
++ Change Requests</field>
+ </record>
+
-+ <record id="group_plm_ecr_requester" model="res.groups">
++ <record id="group_engineering_change_request_requester" model="res.groups">
+ <field name="name">Requester</field>
-+ <field name="category_id" ref="plm.module_category_plm_ecr"/>
-+ <field name="implied_ids" eval="[(4, ref('plm.group_plm_ecr_member')),
++ <field name="category_id" ref="plm.module_category_engineering_change_request"/>
++ <field name="implied_ids" eval="[(4, ref('plm.group_engineering_change_request_member')),
+ (4,ref('mrp.group_mrp_user'))]"/>
-+ <field name="comment">The PLM user uses products lifecycle
-+ management
-+ </field>
++ <field name="comment">One who can request for ECR, ECO and also can
++ manage Routing and BoM.</field>
+ </record>
+
-+ <record id="group_plm_ecr_reviewer" model="res.groups">
++ <record id="group_engineering_change_request_reviewer" model="res.groups">
+ <field name="name">Reviewer</field>
-+ <field name="category_id" ref="plm.module_category_plm_ecr"/>
-+ <field name="implied_ids" eval="[(4, ref('plm.group_plm_ecr_member')),
++ <field name="category_id" ref="plm.module_category_engineering_change_request"/>
++ <field name="implied_ids" eval="[(4, ref('plm.group_engineering_change_request_member')),
+ (4, ref('mrp.group_mrp_user'))]"/>
-+ <field name="comment">The PLM user uses products lifecycle
-+ management
-+ </field>
++ <field name="comment">The PLM user who has rights to 'Review' and
++ 'Reject' Change Requests.</field>
+ </record>
+
-+ <record id="group_plm_ecr_approver" model="res.groups">
++ <record id="group_engineering_change_request_approver" model="res.groups">
+ <field name="name">Approver</field>
-+ <field name="category_id" ref="plm.module_category_plm_ecr"/>
-+ <field name="implied_ids" eval="[(4, ref('plm.group_plm_ecr_member')),
++ <field name="category_id" ref="plm.module_category_engineering_change_request"/>
++ <field name="implied_ids" eval="[(4, ref('plm.group_engineering_change_request_member')),
+ (4, ref('mrp.group_mrp_user'))]"/>
-+ <field name="comment">The PLM user uses products lifecycle
-+ management
++ <field name="comment">The PLM user who has rights to 'Approve' and
++ 'Reject' Change Requests.
+ </field>
+ </record>
+
-+ <record id="group_plm_ecr_manager" model="res.groups">
++ <record id="group_engineering_change_request_manager" model="res.groups">
+ <field name="name">Manager</field>
-+ <field name="category_id" ref="plm.module_category_plm_ecr"/>
++ <field name="category_id" ref="plm.module_category_engineering_change_request"/>
+ <field name="implied_ids" eval="[(4,ref('mrp.group_mrp_manager')),
-+ (4, ref('plm.group_plm_ecr_member')),
-+ (4, ref('plm.group_plm_ecr_requester')),
-+ (4, ref('plm.group_plm_ecr_reviewer')),
-+ (4, ref('plm.group_plm_ecr_approver'))]"/>
-+ <field name="comment">The PLM manager manages products lifecycle
-+ management
++ (4, ref('plm.group_engineering_change_request_member')),
++ (4, ref('plm.group_engineering_change_request_requester')),
++ (4, ref('plm.group_engineering_change_request_reviewer')),
++ (4, ref('plm.group_engineering_change_request_approver'))]"/>
++ <field name="comment">User who is able to manage BoM, Routing, ECR
++ and ECO related entire processes.
+ </field>
+ </record>
+
+ <record model="res.users" id="base.user_root">
-+ <field eval="[(4,ref('plm.group_plm_ecr_manager'))]"
++ <field eval="[(4,ref('plm.group_engineering_change_request_manager'))]"
+ name="groups_id"/>
+ </record>
+
+</flectra>
+diff --git addons/plm/static/description/icon.png addons/plm/static/description/icon.png
+new file mode 100644
+index 0000000..bb4c5a2
+Binary files /dev/null and addons/plm/static/description/icon.png differ
diff --git addons/plm/tests/__init__.py addons/plm/tests/__init__.py
new file mode 100644
index 0000000..dd81a97
@@ -2590,7 +2866,7 @@
+from . import test_plm_ecr_eco
diff --git addons/plm/tests/test_plm_ecr_eco.py addons/plm/tests/test_plm_ecr_eco.py
new file mode 100644
-index 0000000..e06a8f0
+index 0000000..f4072a1
--- /dev/null
+++ addons/plm/tests/test_plm_ecr_eco.py
@@ -0,0 +1,463 @@
@@ -2615,16 +2891,16 @@
+ self.product = self.env.ref('product.product_product_3')
+ self.routing = self.env.ref('mrp.mrp_routing_0')
+ self.temp_routing = self.env.ref('mrp.mrp_routing_1')
-+ self.ecr = self.env['plm.ecr']
-+ self.eco = self.env['plm.eco']
++ self.ecr = self.env['engineering.change.request']
++ self.eco = self.env['engineering.change.order']
+ self.plm_team = self.env['plm.team']
+ self.plm_category = self.env['plm.category']
+ self.plm_reason = self.env['plm.reason']
+ self.process_wizard = self.env['process.wizard']
-+ res_users_plm_requester = self.env.ref('plm.group_plm_ecr_requester')
-+ res_users_plm_member = self.env.ref('plm.group_plm_ecr_member')
-+ res_users_plm_reviewer = self.env.ref('plm.group_plm_ecr_reviewer')
-+ res_users_plm_approver = self.env.ref('plm.group_plm_ecr_approver')
++ res_users_plm_requester = self.env.ref('plm.group_engineering_change_request_requester')
++ res_users_plm_member = self.env.ref('plm.group_engineering_change_request_member')
++ res_users_plm_reviewer = self.env.ref('plm.group_engineering_change_request_reviewer')
++ res_users_plm_approver = self.env.ref('plm.group_engineering_change_request_approver')
+
+ self.ecr_requester = self.res_user_model.create(dict(
+ name="Julie",
@@ -2699,7 +2975,7 @@
+ self.assertTrue(mo_ids, 'Manufacture order not created')
+
+ mo.create_ecr()
-+ self.assertEqual(mo.ecr_count, 1, 'More than one ECR created')
++ self.assertEqual(mo.total_change_order, 1, 'More than one ECR created')
+ ecr_id = self.ecr.search([('manufacture_order', '=', mo.id)])
+ self.assertTrue(ecr_id, 'ECR not created from Manufacture Order')
+
@@ -2752,8 +3028,8 @@
+ ecr_date=datetime.today(),
+ product_id=self.product.id,
+ manufacture_order=mo_ids.id,
-+ type_id='permanent',
-+ effectivity='at_date',
++ type='permanent',
++ activation='at_date',
+ category_ids=[(6, 0, [self.ecr_category.id])],
+ description_request='TEST',
+ reason_request='TEST'
@@ -2765,8 +3041,8 @@
+ ecr_date=datetime.today(),
+ product_id=self.product.id,
+ manufacture_order=mo_ids.id,
-+ type_id='temporary',
-+ effectivity='at_date',
++ type='temporary',
++ activation='at_date',
+ category_ids=[(6, 0, [self.ecr_category.id])],
+ description_request='TEST',
+ reason_request='TEST'
@@ -2895,24 +3171,24 @@
+ self.eco_permanent_id = self.eco.create(dict(
+ name='Test ECO',
+ ecr_id=self.ecr_permanent_id.id,
-+ type='bom',
-+ type_id='permanent',
++ applicability='bom',
++ type='permanent',
+ product_tmpl_id=self.ecr_permanent_id.product_id.product_tmpl_id.id
+ ))
+ self.eco_validation(self.eco_permanent_id)
+ self.eco_temporary_id = self.eco.create(dict(
+ name='Test ECO',
+ ecr_id=self.ecr_temporary_id.id,
-+ type='bom',
-+ type_id='temporary',
++ applicability='bom',
++ type='temporary',
+ product_tmpl_id=self.ecr_temporary_id.product_id.product_tmpl_id.id
+ ))
+ self.eco_validation(self.eco_temporary_id)
+
+ def eco_validation(self, eco_id):
+ eco_id.onchange_ecr_id()
-+ eco_id.onchange_product_tmpl_id()
-+ eco_id.onchange_bom_id()
++ eco_id.product_template_change()
++ eco_id.bom_applicability_change()
+
+ def test_eco_inprogress_done(self):
+ self.create_ecr()
@@ -2920,18 +3196,18 @@
+
+ self.eco_id = self.eco_permanent_id
+ self.eco_id.action_in_progress()
-+ self.assertTrue(self.eco_id.eco_stage == 'in_progress',
++ self.assertTrue(self.eco_id.state == 'in_progress',
+ 'in_progress: state after In Progress is wrong.')
+ self.eco_id.action_done()
-+ self.assertTrue(self.eco_id.eco_stage == 'done', 'state is wrong.')
++ self.assertTrue(self.eco_id.state == 'done', 'state is wrong.')
+
+ def test_permanent_bom_versioning(self):
+ self.create_ecr()
+ self.create_eco()
-+ bom_dict = self.eco_permanent_id.open_bom()
++ bom_dict = self.eco_permanent_id.action_view_bill_of_materials()
+ bom_id = self.env[(bom_dict.get('res_model'))]. \
+ browse(bom_dict.get('res_id'))
-+ bom_id.onchange_product_tmpl_id()
++ bom_id.product_template_change()
+ version = bom_id.version
+ new_bom_dict = bom_id.button_new_version()
+ self.new_bom_id = self.env[(new_bom_dict.get('res_model'))]. \
@@ -2960,10 +3236,10 @@
+ def test_temporary_bom_versioning(self):
+ self.create_ecr()
+ self.create_eco()
-+ bom_dict = self.eco_temporary_id.open_bom()
++ bom_dict = self.eco_temporary_id.action_view_bill_of_materials()
+ self.new_bom_id = self.env[(bom_dict.get('res_model'))]. \
+ browse(bom_dict.get('res_id'))
-+ self.new_bom_id.onchange_product_tmpl_id()
++ self.new_bom_id.product_template_change()
+ version = self.eco_temporary_id.bom_id.version
+
+ self.assertEqual(
@@ -2989,80 +3265,80 @@
+ def test_permanent_routing_versioning(self):
+ self.create_ecr()
+ self.create_eco()
-+ self.eco_permanent_id.write({'type': 'routing',
-+ 'new_routing_id': self.routing.id
++ self.eco_permanent_id.write({'applicability': 'routing',
++ 'latest_routing_id': self.routing.id
+ })
-+ routing_dict = self.eco_permanent_id.open_routing()
++ routing_dict = self.eco_permanent_id.change_order_routing_details()
+ routing_id = self.env[(routing_dict.get('res_model'))]. \
+ browse(routing_dict.get('res_id'))
+ version = routing_id.version
+ new_routing_dict = routing_id.button_new_version()
-+ self.new_routing_id = self.env[(new_routing_dict.get('res_model'))]. \
++ self.latest_routing_id = self.env[(new_routing_dict.get('res_model'))]. \
+ browse(new_routing_dict.get('res_id'))
+
+ self.assertEqual(
-+ self.new_routing_id.state, 'draft',
++ self.latest_routing_id.state, 'draft',
+ "New Routing must be in state 'draft'")
+ self.assertEqual(
-+ self.new_routing_id.version, version + 1,
++ self.latest_routing_id.version, version + 1,
+ 'New Version is not created')
+ self.assertFalse(
-+ self.new_routing_id.active,
++ self.latest_routing_id.active,
+ 'New Routings must be created inactive')
-+ self.new_routing_id.button_activate()
++ self.latest_routing_id.button_activate()
+ self.assertTrue(
-+ self.new_routing_id.active,
++ self.latest_routing_id.active,
+ 'Incorrect activation, check must be True')
+ self.assertEqual(
-+ self.new_routing_id.state, 'active',
++ self.latest_routing_id.state, 'active',
+ "Incorrect state, it should be 'active'")
-+ self.new_routing_id.button_historical()
++ self.latest_routing_id.button_historical()
+ self.assertFalse(
-+ self.new_routing_id.active,
++ self.latest_routing_id.active,
+ 'Check must be False, after historification')
+ self.assertEqual(
-+ self.new_routing_id.state, 'historical',
++ self.latest_routing_id.state, 'historical',
+ "Incorrect state, it should be 'historical'")
+
+ def test_temporary_routing_versioning(self):
+ self.create_ecr()
+ self.create_eco()
-+ self.eco_temporary_id.write({'type': 'routing',
-+ 'new_routing_id': self.temp_routing.id
++ self.eco_temporary_id.write({'applicability': 'routing',
++ 'latest_routing_id': self.temp_routing.id
+ })
-+ self.new_routing_id = self.eco_temporary_id.new_routing_id.copy({
++ self.latest_routing_id = self.eco_temporary_id.latest_routing_id.copy({
+ 'active': False,
-+ 'type_id': self.eco_temporary_id.type_id})
-+ version = self.eco_temporary_id.new_routing_id.version
++ 'change_order_type': self.eco_temporary_id.type})
++ version = self.eco_temporary_id.latest_routing_id.version
+
+ self.assertEqual(
-+ self.new_routing_id.state, 'draft',
++ self.latest_routing_id.state, 'draft',
+ "New Routing must be in state 'draft'")
+ self.assertEqual(
-+ self.new_routing_id.version, version, 'New Version is created')
++ self.latest_routing_id.version, version, 'New Version is created')
+ self.assertFalse(
-+ self.new_routing_id.active,
++ self.latest_routing_id.active,
+ 'New Routings must be created inactive')
-+ self.new_routing_id.button_activate()
++ self.latest_routing_id.button_activate()
+ self.assertTrue(
-+ self.new_routing_id.active,
++ self.latest_routing_id.active,
+ 'Incorrect activation, check must be True')
+ self.assertEqual(
-+ self.new_routing_id.state, 'active',
++ self.latest_routing_id.state, 'active',
+ "Incorrect state, it should be 'active'")
-+ self.new_routing_id.button_historical()
++ self.latest_routing_id.button_historical()
+ self.assertFalse(
-+ self.new_routing_id.active,
++ self.latest_routing_id.active,
+ 'Check must be False, after historification')
+ self.assertEqual(
-+ self.new_routing_id.state, 'historical',
++ self.latest_routing_id.state, 'historical',
+ "Incorrect state, it should be 'historical'")
-diff --git addons/plm/views/mrp_bom_views.xml addons/plm/views/mrp_bom_views.xml
+diff --git addons/plm/views/bom_views.xml addons/plm/views/bom_views.xml
new file mode 100644
-index 0000000..7276369
+index 0000000..3b8a9b5
--- /dev/null
-+++ addons/plm/views/mrp_bom_views.xml
-@@ -0,0 +1,143 @@
++++ addons/plm/views/bom_views.xml
+@@ -0,0 +1,131 @@
+<?xml version="1.0" encoding="utf-8"?>
+<flectra>
+
@@ -3093,7 +3369,7 @@
+ <field name="version"/>
+ <field name="state"/>
+ <field name="historical_date"/>
-+ <field name="type_id"/>
++ <field name="change_order_type"/>
+ <button name="button_draft" type="object" string="Draft"
+ attrs="{'invisible':[('state','!=','active')]}"
+ class="oe_highlight"
@@ -3110,7 +3386,7 @@
+ string="New version"
+ attrs="{'invisible':['|',
+ ('state','==','historical'),
-+ ('type_id','=','temporary')]}"
++ ('change_order_type','=','temporary')]}"
+ class="oe_highlight"
+ icon="fa-check text-success"
+ confirm="You are going to create a new version
@@ -3127,8 +3403,8 @@
+ </field>
+ </record>
+
-+ <record id="mrp_bom_view_form_inherit_plm_eco" model="ir.ui.view">
-+ <field name="name">mrp.bom.view.form.inherit.plm</field>
++ <record id="mrp_bom_view_form_inherit_engineering_change_order" model="ir.ui.view">
++ <field name="name">mrp.bom.engineering.change.order</field>
+ <field name="model">mrp.bom</field>
+ <field name="inherit_id" ref="mrp.mrp_bom_form_view"/>
+ <field name="arch" type="xml">
@@ -3150,7 +3426,7 @@
+ string="New version"
+ attrs="{'invisible':['|',
+ ('state','==','historical'),
-+ ('type_id','=','temporary')]}"
++ ('change_order_type','=','temporary')]}"
+ class="oe_highlight"
+ confirm="You are going to create a new version
+ of this BoM. Are you sure?"/>
@@ -3168,16 +3444,16 @@
+ </header>
+ </xpath>
+ <button name="toggle_active" position="before">
-+ <button class="oe_stat_button" name="action_plm_eco"
++ <button class="oe_stat_button" name="action_engineering_change_order"
+ type="object" icon="fa-cogs">
-+ <field string="ECO(s)" name="eco_count" widget="statinfo"/>
++ <field string="ECO(s)" name="total_change_order" widget="statinfo"/>
+ </button>
+ </button>
+ <field name="routing_id" position="attributes">
+ <attribute name="invisible">1</attribute>
+ </field>
+ <field name="type" position="after">
-+ <field name="type_id"/>
++ <field name="change_order_type"/>
+ <field name="name"/>
+ <field name="version"/>
+ <field name="historical_date"/>
@@ -3187,384 +3463,80 @@
+ <field name="old_versions"/>
+ </page>
+ <page string="ECO">
-+ <field name="eco_ids"/>
++ <field name="change_order_ids"/>
+ </page>
+ </notebook>
+ </field>
+ </record>
+
-+ <record model="ir.actions.act_window" id="mrp_bom_action_kanban">
-+ <field name="name">Bill of Materials</field>
-+ <field name="res_model">mrp.bom</field>
-+ <field name="view_type">form</field>
-+ <field name="view_mode">tree,form</field>
-+ <field name="help" type="html">
-+ <p>
-+ Bill of Materials
-+ </p>
-+ </field>
-+ </record>
-+
+</flectra>
-diff --git addons/plm/views/mrp_production_views.xml addons/plm/views/mrp_production_views.xml
+diff --git addons/plm/views/engineering_change_order_views.xml addons/plm/views/engineering_change_order_views.xml
new file mode 100644
-index 0000000..748461c
+index 0000000..e64c9f5
--- /dev/null
-+++ addons/plm/views/mrp_production_views.xml
-@@ -0,0 +1,26 @@
++++ addons/plm/views/engineering_change_order_views.xml
+@@ -0,0 +1,266 @@
+<?xml version="1.0" encoding="utf-8"?>
+<flectra>
+
-+ <record id="mrp_production_form_view_inherit" model="ir.ui.view">
-+ <field name="name">mrp.production.form.inherit</field>
-+ <field name="model">mrp.production</field>
-+ <field name="inherit_id" ref="mrp.mrp_production_form_view"/>
++ <record id="engineering_change_order_view_tree" model="ir.ui.view">
++ <field name="name">engineering.change.order.view.tree</field>
++ <field name="model">engineering.change.order</field>
+ <field name="arch" type="xml">
-+ <div class="oe_button_box" position="inside">
-+ <button class="oe_stat_button" name="button_plm_ecr"
-+ type="object" icon="fa-cogs">
-+ <field string="ECR(s)" name="ecr_count" widget="statinfo"/>
-+ </button>
-+ </div>
-+ <button name="button_plan" position="after">
-+ <button name="create_ecr" type="object" attrs="{'invisible':
-+ ['|',('state', '!=', 'confirmed')]}"
-+ string="Create ECR" class="oe_highlight"/>
-+ </button>
-+ <field name="product_id" position="after">
-+ <field name="sale_id"/>
-+ </field>
++ <tree>
++ <field name="name"/>
++ <field name="ecr_id"/>
++ <field name="bom_id"/>
++ <field name="user_id"/>
++ <field name="activated_on"/>
++ <field name="state"/>
++ </tree>
+ </field>
+ </record>
+
-+</flectra>
-diff --git addons/plm/views/mrp_routing_views.xml addons/plm/views/mrp_routing_views.xml
-new file mode 100644
-index 0000000..71b7b48
---- /dev/null
-+++ addons/plm/views/mrp_routing_views.xml
-@@ -0,0 +1,140 @@
-+<?xml version="1.0" encoding="utf-8"?>
-+<flectra>
-+
-+ <record model="ir.actions.act_window" id="mrp.mrp_routing_action">
-+ <field name="domain">['|',('active','=',True),('active','=',False)]
-+ </field>
-+ </record>
-+
-+ <record id="mrp.mrp_routing_tree_view" model="ir.ui.view">
-+ <field name="name">mrp.routing.tree</field>
-+ <field name="model">mrp.routing</field>
-+ <field name="arch" type="xml">
-+ <tree>
-+ <field name="name"/>
-+ <field name="code"/>
-+ <field name="sequence"/>
-+ </tree>
-+ </field>
-+ </record>
-+
-+ <record model="ir.ui.view" id="plm_bom_version_tree_view">
-+ <field name="name">mrp.routing.tree</field>
-+ <field name="model">mrp.routing</field>
-+ <field name="inherit_id" ref="mrp.mrp_routing_tree_view"/>
-+ <field name="arch" type="xml">
-+ <field name="sequence" position="before">
-+ <field name="active"/>
-+ <field name="version"/>
-+ <field name="state"/>
-+ <field name="historical_date"/>
-+ <field name="type_id"/>
-+ <button name="button_draft" type="object" string="Draft"
-+ attrs="{'invisible':[('state','!=','active')]}"
-+ class="oe_highlight"
-+ icon="fa-times-circle text-success"/>
-+ <button name="button_activate" type="object"
-+ string="Activate"
-+ attrs="{'invisible':[
-+ ('state','not in',(False, 'draft'))]}"
-+ class="oe_highlight" icon="fa-archive"
-+ confirm="You will activate the Routing.
-+ If you haven't set a route yet, then you won't
-+ be able to do it after this.
-+ Are you sure you want to proceed?"/>
-+ <button name="button_new_version" type="object"
-+ string="New version"
-+ attrs="{'invisible':['|',
-+ ('state','==','historical'),
-+ ('type_id','=','temporary')]}"
-+ class="oe_highlight"
-+ icon="fa-check text-success"
-+ confirm="You are going to create a new version
-+ of this Routing. Are you sure?"/>
-+ <button name="button_historical" type="object"
-+ string="Historical"
-+ attrs="{'invisible':[('state','!=','active')]}"
-+ class="oe_highlight"
-+ icon="fa-times-circle text-danger"
-+ confirm="You are going to historize an Routing.
-+ Doing, not be able to unlock it unless you
-+ make a copy. Are you sure you want to
-+ proceed?"/>
-+ </field>
-+ </field>
-+ </record>
-+
-+ <record id="mrp_routing_view_form_inherit_plm_eco" model="ir.ui.view">
-+ <field name="name">mrp.routing.view.form.inherit.plm</field>
-+ <field name="model">mrp.routing</field>
-+ <field name="inherit_id" ref="mrp.mrp_routing_form_view"/>
-+ <field name="arch" type="xml">
-+ <xpath expr="//form/sheet" position="before">
-+ <header>
-+ <button name="button_draft" type="object" string="Draft"
-+ attrs="{'invisible':[('state','!=','active')]}"
-+ class="oe_highlight"/>
-+ <button name="button_activate" type="object"
-+ string="Activate"
-+ attrs="{'invisible':[
-+ ('state','not in',(False, 'draft'))]}"
-+ class="oe_highlight"
-+ confirm="You will activate the Routing.
-+ If you haven't set a route yet, then you won't
-+ be able to do it after this. Are you sure you
-+ want to proceed?"/>
-+ <button name="button_new_version" type="object"
-+ string="New version"
-+ attrs="{'invisible':['|',
-+ ('state','==','historical'),
-+ ('type_id','=','temporary')]}"
-+ class="oe_highlight"
-+ confirm="You are going to create a new version
-+ of this Routing. Are you sure?"/>
-+ <button name="button_historical" type="object"
-+ string="Historical"
-+ attrs="{'invisible':[('state','!=','active')]}"
-+ class="oe_highlight"
-+ confirm="You are going to historize an Routing.
-+ Doing, not be able to unlock it unless you make
-+ a copy. Are you sure you want to proceed?"/>
-+ <field name="state" widget="statusbar"
-+ statusbar_visible="draft,active,historical"/>
-+ </header>
-+ </xpath>
-+ <button name="toggle_active" position="before">
-+ <button class="oe_stat_button" name="action_plm_eco"
-+ type="object" icon="fa-cogs">
-+ <field string="ECO(s)" name="eco_count" widget="statinfo"/>
-+ </button>
-+ </button>
-+ <field name="company_id" position="after">
-+ <field name="type_id"/>
-+ <field name="version"/>
-+ <field name="historical_date" attrs="{'invisible': [
-+ ('state','!=','historical')]}"/>
-+ </field>
-+ <notebook position="inside">
-+ <page string="Versions">
-+ <field name="old_versions"/>
-+ </page>
-+ <page string="ECO">
-+ <field name="eco_ids"/>
-+ </page>
-+ </notebook>
-+ </field>
-+ </record>
-+
-+ <record model="ir.actions.act_window" id="mrp_routing_action_kanban">
-+ <field name="name">Routings</field>
-+ <field name="res_model">mrp.routing</field>
-+ <field name="view_type">form</field>
-+ <field name="view_mode">tree,form</field>
-+ <field name="help" type="html">
-+ <p>
-+ Routings
-+ </p>
-+ </field>
-+ </record>
-+
-+</flectra>
-diff --git addons/plm/views/plm_category_views.xml addons/plm/views/plm_category_views.xml
-new file mode 100644
-index 0000000..79fcb16
---- /dev/null
-+++ addons/plm/views/plm_category_views.xml
-@@ -0,0 +1,108 @@
-+<?xml version="1.0" encoding="utf-8"?>
-+<flectra>
-+
-+ <record id="plm_category_tree_view" model="ir.ui.view">
-+ <field name="name">plm.category.tree</field>
-+ <field name="model">plm.category</field>
-+ <field name="priority">2</field>
-+ <field name="arch" type="xml">
-+ <tree>
-+ <field name="name"/>
-+ <field name="team_id"/>
-+ <field name="reviewer"/>
-+ <field name="approver"/>
-+ </tree>
-+ </field>
-+ </record>
-+
-+ <record id="plm_category_form_view" model="ir.ui.view">
-+ <field name="name">plm.category.form</field>
-+ <field name="model">plm.category</field>
-+ <field name="priority">1</field>
-+ <field name="arch" type="xml">
-+ <form string="Categories">
-+ <sheet>
-+ <group>
-+ <field name="name"/>
-+ <field name="team_id"
-+ options="{'no_create': True}"/>
-+ <field name="reviewer" readonly="1"/>
-+ <field name="approver" readonly="1"/>
-+ <field name="color" invisible="1"/>
-+ </group>
-+ </sheet>
-+ <div class="oe_chatter">
-+ <field name="message_follower_ids" widget="mail_followers"/>
-+ <field name="activity_ids" widget="mail_activity"/>
-+ <field name="message_ids" widget="mail_thread" options="{'post_refresh': 'recipients'}"/>
-+ </div>
-+ </form>
-+ </field>
-+ </record>
-+
-+ <record id="action_plm_category" model="ir.actions.act_window">
-+ <field name="name">Categories</field>
-+ <field name="type">ir.actions.act_window</field>
-+ <field name="res_model">plm.category</field>
-+ <field name="view_type">form</field>
-+ <field name="view_mode">tree,form</field>
-+ <field name="context">{}</field>
-+ </record>
-+
-+ <!--PLM Reasons-->
-+ <record id="plm_reason_tree_view" model="ir.ui.view">
-+ <field name="name">plm.reason.tree</field>
-+ <field name="model">plm.reason</field>
-+ <field name="priority">2</field>
-+ <field name="arch" type="xml">
-+ <tree>
-+ <field name="name"/>
-+ <field name="action"/>
-+ </tree>
-+ </field>
-+ </record>
-+
-+ <record id="plm_reason_form_view" model="ir.ui.view">
-+ <field name="name">plm.reason.form</field>
-+ <field name="model">plm.reason</field>
-+ <field name="priority">1</field>
-+ <field name="arch" type="xml">
-+ <form string="Reasons">
-+ <sheet>
-+ <group>
-+ <field name="name"/>
-+ <field name="action"/>
-+ </group>
-+ </sheet>
-+ <div class="oe_chatter">
-+ <field name="message_follower_ids" widget="mail_followers"/>
-+ <field name="activity_ids" widget="mail_activity"/>
-+ <field name="message_ids" widget="mail_thread" options="{'post_refresh': 'recipients'}"/>
-+ </div>
-+ </form>
-+ </field>
-+ </record>
-+
-+ <record id="action_plm_reason" model="ir.actions.act_window">
-+ <field name="name">Reasons</field>
-+ <field name="type">ir.actions.act_window</field>
-+ <field name="res_model">plm.reason</field>
-+ <field name="view_type">form</field>
-+ <field name="view_mode">tree,form</field>
-+ <field name="context">{}</field>
-+ </record>
-+
-+ <menuitem id="plm_categories_main_menu"
-+ name="Configuration"
-+ parent="plm_menu_root"
-+ sequence="2"/>
-+ <menuitem id="plm_categories_sub_menu"
-+ parent="plm_categories_main_menu"
-+ action="action_plm_category"
-+ sequence="3"/>
-+ <menuitem id="plm_reason_sub_menu"
-+ parent="plm_categories_main_menu"
-+ action="action_plm_reason"
-+ sequence="4"/>
-+
-+</flectra>
-diff --git addons/plm/views/plm_eco_views.xml addons/plm/views/plm_eco_views.xml
-new file mode 100644
-index 0000000..1abcee3
---- /dev/null
-+++ addons/plm/views/plm_eco_views.xml
-@@ -0,0 +1,300 @@
-+<?xml version="1.0" encoding="utf-8"?>
-+<flectra>
-+ <!-- plm.ECO -->
-+ <record id="plm_eco_view_tree" model="ir.ui.view">
-+ <field name="name">plm.eco.view.tree</field>
-+ <field name="model">plm.eco</field>
-+ <field name="arch" type="xml">
-+ <tree>
-+ <field name="name"/>
-+ <field name="ecr_id"/>
-+ <field name="bom_id"/>
-+ <field name="responsible_id"/>
-+ <field name="effectivity_date"/>
-+ <field name="eco_stage"/>
-+ </tree>
-+ </field>
-+ </record>
-+
-+ <record id="plm_eco_view_form" model="ir.ui.view">
-+ <field name="name">plm.eco.view.form</field>
-+ <field name="model">plm.eco</field>
++ <record id="engineering_change_order_view_form" model="ir.ui.view">
++ <field name="name">engineering.change.order.view.form</field>
++ <field name="model">engineering.change.order</field>
+ <field name="arch" type="xml">
+ <form>
+ <header>
-+ <button name="open_bom" type="object" string="Open BOM"
++ <button name="action_view_bill_of_materials" type="object" string="Open BOM"
+ attrs="{'invisible':['|',
-+ ('eco_stage','!=','draft'),
-+ ('type','=','routing')]}"
++ ('state','!=','draft'),
++ ('applicability','=','routing')]}"
+ class="oe_highlight"
-+ groups="plm.group_plm_ecr_requester,
-+ plm.group_plm_ecr_manager"/>
-+ <button name="open_routing"
++ groups="plm.group_engineering_change_request_requester,
++ plm.group_engineering_change_request_manager"/>
++ <button name="change_order_routing_details"
+ type="object" string="Open Routing"
+ attrs="{'invisible':['|',
-+ ('eco_stage','!=','draft'),
-+ ('type','in',['bom'])]}"
++ ('state','!=','draft'),
++ ('applicability','in',['bom'])]}"
+ class="oe_highlight"
-+ groups="plm.group_plm_ecr_requester,
-+ plm.group_plm_ecr_manager"/>
++ groups="plm.group_engineering_change_request_requester,
++ plm.group_engineering_change_request_manager"/>
+ <button name="action_in_progress"
+ type="object" string="In Progress"
+ attrs="{'invisible':[
-+ ('eco_stage','!=','draft')]}"
++ ('state','!=','draft')]}"
+ class="oe_highlight"
-+ groups="plm.group_plm_ecr_requester,
-+ plm.group_plm_ecr_manager"/>
++ groups="plm.group_engineering_change_request_requester,
++ plm.group_engineering_change_request_manager"/>
+ <button name="action_done" type="object" string="Done"
+ attrs="{'invisible':[
-+ ('eco_stage','!=','in_progress')]}"
++ ('state','!=','in_progress')]}"
+ class="oe_highlight"
-+ groups="plm.group_plm_ecr_requester,
-+ plm.group_plm_ecr_manager"/>
-+ <field name="eco_stage" widget="statusbar"
++ groups="plm.group_engineering_change_request_requester,
++ plm.group_engineering_change_request_manager"/>
++ <field name="state" widget="statusbar"
+ statusbar_visible="draft,in_progress,done"/>
+ </header>
+ <sheet>
+ <div class="oe_button_box" name="button_box">
+ <button name="toggle_active" type="object"
+ class="oe_stat_button" icon="fa-archive"
-+ groups="plm.group_plm_ecr_requester,
-+ plm.group_plm_ecr_manager">
++ groups="plm.group_engineering_change_request_requester,
++ plm.group_engineering_change_request_manager">
+ <field name="active" widget="boolean_button"
+ options='{"terminology": "archive"}'/>
+ </button>
@@ -3577,52 +3549,53 @@
+ <group>
+ <group>
+ <field name="ecr_id" attrs="{'readonly':[
-+ ('eco_stage', '!=', 'draft')]}"
++ ('state', '!=', 'draft')]}"
+ domain="[('state', '=', 'approved')]"/>
+ <field name="ecr_date" attrs="{'readonly':[
-+ ('eco_stage', '!=', 'draft')]}"/>
++ ('state', '!=', 'draft')]}"/>
+ <field name="ecr_requester" attrs="{'readonly':[
-+ ('eco_stage', '!=', 'draft')]}"/>
-+ <field name="type_id" attrs="{'readonly':[
-+ ('eco_stage', '!=', 'draft')]}" required="1"/>
++ ('state', '!=', 'draft')]}"/>
++ <field name="type" attrs="{'readonly':[
++ ('state', '!=', 'draft')]}" required="1"/>
+ <field name="product_tmpl_id" attrs="{'readonly':[
-+ ('eco_stage', '!=', 'draft')], 'required': [
-+ ('type', 'in', ['bom', 'both'])]}"/>
++ ('state', '!=', 'draft')], 'required': [
++ ('applicability', 'in', ['bom', 'both'])]}"/>
+ <field name="company_id" attrs="{'readonly':[
-+ ('eco_stage', '!=', 'draft')]}"
++ ('state', '!=', 'draft')]}"
+ groups="base.group_multi_company"/>
+ </group>
+ <group>
-+ <field name="type" widget="radio"
++ <field name="applicability" widget="radio"
+ attrs="{'readonly':[
-+ ('eco_stage', '!=', 'draft')]}"/>
++ ('state', '!=', 'draft')]}"/>
+ <field name="bom_id"
+ context="{
+ 'default_product_tmpl_id': product_tmpl_id}"
+ attrs="{'readonly':[
-+ ('eco_stage', '!=', 'draft')],
-+ 'invisible': [('type', 'in', ('routing'))],
++ ('state', '!=', 'draft')],
++ 'invisible': [('applicability', 'in', ('routing'))],
+ 'required': [
-+ ('type', 'in', ('bom', 'both'))]}"/>
-+ <field name="new_routing_id" attrs="{'readonly':[
-+ ('eco_stage', '!=', 'draft')],'invisible': [
-+ ('type', '=', 'bom')], 'required': [
-+ ('type', 'in', ['routing', 'both'])]}"
++ ('applicability', 'in', ('bom', 'both'))]}"
++ domain="[('product_tmpl_id', '=', product_tmpl_id)]"/>
++ <field name="latest_routing_id" attrs="{'readonly':[
++ ('state', '!=', 'draft')],'invisible': [
++ ('applicability', '=', 'bom')], 'required': [
++ ('applicability', 'in', ['routing', 'both'])]}"
+ group="plm.group_plm_routings"/>
-+ <field name="responsible_id" attrs="{'readonly':[
-+ ('eco_stage', '!=', 'draft')]}"/>
-+ <field name="effectivity" attrs="{'readonly':[
-+ ('eco_stage', '!=', 'draft')]}"
++ <field name="user_id" attrs="{'readonly':[
++ ('state', '!=', 'draft')]}"/>
++ <field name="activation" attrs="{'readonly':[
++ ('state', '!=', 'draft')]}"
+ widget="radio" required="1"/>
-+ <field name="effectivity_date" attrs="{'readonly':[
-+ ('eco_stage', '!=', 'draft')], 'invisible': [
-+ ('effectivity', '=', 'asap')]}"/>
++ <field name="activated_on" attrs="{'readonly':[
++ ('state', '!=', 'draft')], 'invisible': [
++ ('activation', '=', 'directly')]}"/>
+ </group>
+ </group>
+ <notebook>
-+ <page string="Note">
-+ <field name="notes" attrs="{'readonly':[
-+ ('eco_stage', '!=', 'draft')]}"
++ <page string="Description">
++ <field name="description" attrs="{'readonly':[
++ ('state', '!=', 'draft')]}"
+ placeholder="Description of the change
+ and its reason ..."/>
+ </page>
@@ -3637,34 +3610,34 @@
+ </field>
+ </record>
+
-+ <record id="create_plm_eco_form_view" model="ir.actions.act_window">
++ <record id="create_engineering_change_order_form_view" model="ir.actions.act_window">
+ <field name="name">Create an ECO</field>
-+ <field name="res_model">plm.eco</field>
++ <field name="res_model">engineering.change.order</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">form</field>
-+ <field name="view_id" ref="plm_eco_view_form"/>
++ <field name="view_id" ref="engineering_change_order_view_form"/>
+ <field name="target">new</field>
+ </record>
+
-+ <record id="plm_eco_kanban_view_data" model="ir.ui.view">
-+ <field name="name">plm.eco.kanban</field>
-+ <field name="model">plm.eco</field>
++ <record id="engineering_change_order_kanban_view_data" model="ir.ui.view">
++ <field name="name">engineering.change.order.kanban</field>
++ <field name="model">engineering.change.order</field>
+ <field name="priority" eval="1"/>
+ <field name="arch" type="xml">
-+ <kanban default_group_by="eco_stage"
++ <kanban default_group_by="state"
+ class="o_kanban_small_column o_opportunity_kanban"
-+ on_create="plm.create_plm_eco_form_view">
-+ <field name="eco_stage"
++ on_create="plm.create_engineering_change_order_form_view">
++ <field name="state"
+ options='{"group_by_tooltip": {"requirements": "Description", "legend_priority": "Use of stars"}}'/>
+ <field name="name"/>
+ <field name="color"/>
+ <field name="ecr_id"/>
-+ <field name="responsible_id"/>
++ <field name="user_id"/>
+ <field name="bom_id"/>
+ <field name="routing_id"/>
+ <field name="product_tmpl_id"/>
-+ <field name="type"/>
-+ <field name="effectivity_date"/>
++ <field name="applicability"/>
++ <field name="activated_on"/>
+ <templates>
+ <t t-name="kanban-box">
+ <div t-attf-class="#{kanban_color(record.color.raw_value)} oe_kanban_global_click">
@@ -3700,18 +3673,18 @@
+ </strong>
+ </div>
+ <div>
-+ <field name="responsible_id"
++ <field name="user_id"
+ options="{'color_field': 'color'}"/>
+ </div>
+ <div t-if="record.product_tmpl_id.raw_value">
+ <field name="product_tmpl_id"/>
+ </div>
-+ <div t-if="record.type.raw_value == 'bom' or record.type.raw_value == 'both'">
++ <div t-if="record.applicability.raw_value == 'bom' or record.applicability.raw_value == 'both'">
+ <span>BoM:
+ <field name="bom_id"/>
+ </span>
+ </div>
-+ <div t-if="record.type.raw_value == 'routing' or record.type.raw_value == 'both'">
++ <div t-if="record.applicability.raw_value == 'routing' or record.applicability.raw_value == 'both'">
+ <span>Routing:
+ <field name="routing_id"/>
+ </span>
@@ -3723,19 +3696,19 @@
+ </div>
+ <div class="oe_kanban_bottom_right">
+ <img
-+ t-att-src="kanban_image('res.users', 'image_small', record.responsible_id.raw_value)"
-+ t-att-title="record.responsible_id.value"
++ t-att-src="kanban_image('res.users', 'image_small', record.user_id.raw_value)"
++ t-att-title="record.user_id.value"
+ width="24" height="24"
+ class="oe_kanban_avatar"/>
+ </div>
+ </div>
+ <div class="text-muted">
-+ <t t-if="record.effectivity_date.raw_value and record.effectivity_date.raw_value lt (new Date())"
++ <t t-if="record.activated_on.raw_value and record.activated_on.raw_value lt (new Date())"
+ t-set="red">oe_kanban_text_red
+ </t>
+ <span t-attf-class="#{red || ''}">
+ <i>
-+ <field name="effectivity_date"/>
++ <field name="activated_on"/>
+ </i>
+ </span>
+ </div>
@@ -3749,73 +3722,38 @@
+ </field>
+ </record>
+
-+ <record id="plm_eco_view_calendar" model="ir.ui.view">
-+ <field name="name">plm.eco.view.calendar</field>
-+ <field name="model">plm.eco</field>
-+ <field name="arch" type="xml">
-+ <calendar string="ECOs" date_start="create_date"
-+ date_stop="effectivity_date">
-+ <field name="name"/>
-+ <field name="product_tmpl_id"/>
-+ <field name="type"/>
-+ </calendar>
-+ </field>
-+ </record>
-+
-+ <record id="plm_eco_view_pivot" model="ir.ui.view">
-+ <field name="name">plm.eco.view.pivot</field>
-+ <field name="model">plm.eco</field>
-+ <field name="arch" type="xml">
-+ <pivot string="ECO Analysis">
-+ <field name="company_id" type="row"/>
-+ <field name="product_tmpl_id" type="row"/>
-+ </pivot>
-+ </field>
-+ </record>
-+
-+ <record id="plm_eco_view_graph" model="ir.ui.view">
-+ <field name="name">plm.eco.view.graph</field>
-+ <field name="model">plm.eco</field>
-+ <field name="arch" type="xml">
-+ <graph string="ECO Analysis">
-+ <field name="company_id" type="row"/>
-+ <field name="product_tmpl_id" type="col"/>
-+ </graph>
-+ </field>
-+ </record>
-+
-+ <record id="plm_eco_action_main" model="ir.actions.act_window">
++ <record id="engineering_change_order_action_main" model="ir.actions.act_window">
+ <field name="name">Engineering Change Orders</field>
-+ <field name="res_model">plm.eco</field>
++ <field name="res_model">engineering.change.order</field>
+ <field name="view_type">form</field>
-+ <field name="view_mode">kanban,tree,calendar,pivot,graph,form</field>
++ <field name="view_mode">kanban,tree,form</field>
+ <field name="help" type="html">
+ <p>
+ Create Engineering Change Orders
+ </p>
+ </field>
+ </record>
-+ <!-- MENUS -->
++
+ <menuitem
-+ id="menu_plm_ecos"
++ id="menu_engineering_change_orders"
+ name="Engineering Change Orders"
-+ action="plm_eco_action_main"
++ action="engineering_change_order_action_main"
+ parent="plm_menu"
+ sequence="6"/>
+
+</flectra>
-diff --git addons/plm/views/plm_ecr_views.xml addons/plm/views/plm_ecr_views.xml
+diff --git addons/plm/views/engineering_change_request_views.xml addons/plm/views/engineering_change_request_views.xml
new file mode 100644
-index 0000000..86bd4b3
+index 0000000..4898b94
--- /dev/null
-+++ addons/plm/views/plm_ecr_views.xml
-@@ -0,0 +1,340 @@
++++ addons/plm/views/engineering_change_request_views.xml
+@@ -0,0 +1,332 @@
+<?xml version="1.0" encoding="utf-8"?>
+<flectra>
+
-+ <record id="plm_ecr_tree_view" model="ir.ui.view">
-+ <field name="name">plm.ecr.tree</field>
-+ <field name="model">plm.ecr</field>
++ <record id="engineering_change_request_tree_view" model="ir.ui.view">
++ <field name="name">engineering.change.request.tree</field>
++ <field name="model">engineering.change.request</field>
+ <field name="priority">2</field>
+ <field name="arch" type="xml">
+ <tree>
@@ -3829,9 +3767,9 @@
+ </field>
+ </record>
+
-+ <record id="plm_ecr_form_view" model="ir.ui.view">
-+ <field name="name">plm.ecr.form</field>
-+ <field name="model">plm.ecr</field>
++ <record id="engineering_change_request_form_view" model="ir.ui.view">
++ <field name="name">engineering.change.request.form</field>
++ <field name="model">engineering.change.request</field>
+ <field name="priority">1</field>
+ <field name="arch" type="xml">
+ <form string="Engineering Change Request">
@@ -3840,36 +3778,37 @@
+ class="oe_highlight" string="Confirm"
+ type="object"
+ attrs="{'invisible': [('state', 'not in', ['draft'])]}"
-+ groups="plm.group_plm_ecr_requester, plm.group_plm_ecr_manager"/>
++ groups="plm.group_engineering_change_request_requester, plm.group_engineering_change_request_manager"/>
+ <button name="%(action_process_wizard)d"
+ class="oe_highlight" string="Review"
+ context="{'review':True}"
+ type="action"
+ attrs="{'invisible': [('state', 'not in', ['confirm'])]}"
-+ groups="plm.group_plm_ecr_reviewer, plm.group_plm_ecr_manager"/>
++ groups="plm.group_engineering_change_request_reviewer, plm.group_engineering_change_request_manager"/>
+ <button name="%(action_process_wizard)d"
+ class="oe_highlight" string="Approve"
+ type="action"
+ attrs="{'invisible': [('state', 'not in', ['reviewed'])]}"
+ context="{'approve':True}"
-+ groups="plm.group_plm_ecr_approver, plm.group_plm_ecr_manager"/>
++ groups="plm.group_engineering_change_request_approver, plm.group_engineering_change_request_manager"/>
+ <button name="%(action_process_wizard)d" type="action"
-+ attrs="{'invisible': [('state', 'not in', ['confirm','reviewed']),
++ attrs="{'invisible': [('state', 'not in',
++ ['confirm','reviewed']), '|',
+ ('reviewed_boolean','=',True),
+ ('approved_boolean','=',True)]}" string="Reject"
+ class="oe_highlight" context="{'reject':True}"
-+ groups="plm.group_plm_ecr_reviewer, plm.group_plm_ecr_approver, plm.group_plm_ecr_manager"/>
++ groups="plm.group_engineering_change_request_reviewer, plm.group_engineering_change_request_approver, plm.group_engineering_change_request_manager"/>
+ <button name="action_cancel" class="oe_highlight"
+ string="Cancel" type="object"
+ attrs="{'invisible':[('state', '=', 'cancel')]}"
-+ groups="plm.group_plm_ecr_manager, plm.group_plm_ecr_requester"/>
++ groups="plm.group_engineering_change_request_manager, plm.group_engineering_change_request_requester"/>
+ <button name="action_reset_to_draft" class="oe_highlight"
+ string="Reset to draft" type="object"
+ attrs="{'invisible': [('state', 'not in', ['cancel'])]}"/>
+ <button name="action_reset_to_confirm"
+ class="oe_highlight" string="Reset" type="object"
+ attrs="{'invisible': [('state', 'not in', ['rejected'])]}"
-+ groups="plm.group_plm_ecr_reviewer, plm.group_plm_ecr_approver, plm.group_plm_ecr_manager"/>
++ groups="plm.group_engineering_change_request_reviewer, plm.group_engineering_change_request_approver, plm.group_engineering_change_request_manager"/>
+ <field name="state" widget="statusbar"
+ statusbar_visible="draft,confirm,reviewed,approved"/>
+ </header>
@@ -3877,9 +3816,9 @@
+ <div class="oe_button_box" name="button_box">
+ <button class="oe_stat_button"
+ attrs="{'invisible':[('state', '!=', 'approved')]}"
-+ name="action_plm_eco"
++ name="action_engineering_change_order"
+ type="object" icon="fa-cogs">
-+ <field string="ECO(s)" name="eco_count"
++ <field string="ECO(s)" name="total_change_order"
+ widget="statinfo"/>
+ </button>
+ </div>
@@ -3907,7 +3846,7 @@
+ <field name="approved_boolean" invisible="1"/>
+ </group>
+ <group>
-+ <field name="type_id" required="1"
++ <field name="type" required="1"
+ attrs="{'readonly':[('state', '!=', 'draft')]}"/>
+ <field name="production_status"
+ attrs="{'readonly':[('state', '!=', 'draft')]}"/>
@@ -3916,10 +3855,10 @@
+ attrs="{'readonly':[('state', '!=', 'draft')]}"/>
+ <field name="dwg_no"
+ attrs="{'readonly':[('state', '!=', 'draft')]}"/>
-+ <field name="effectivity"
++ <field name="activation"
+ attrs="{'readonly':[('state', '!=', 'draft')]}"/>
+ <field name="effective_date"
-+ attrs="{'invisible': [('effectivity', '!=', 'at_date')], 'readonly':[
++ attrs="{'invisible': [('activation', '!=', 'at_date')], 'readonly':[
+ ('state', '!=', 'draft')]}"/>
+ </group>
+ </group>
@@ -3980,23 +3919,23 @@
+ </field>
+ </record>
+
-+ <record id="create_plm_ecr_form_view" model="ir.actions.act_window">
++ <record id="create_engineering_change_request_form_view" model="ir.actions.act_window">
+ <field name="name">Create an ECR</field>
-+ <field name="res_model">plm.ecr</field>
++ <field name="res_model">engineering.change.request</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">form</field>
-+ <field name="view_id" ref="plm_ecr_form_view"/>
++ <field name="view_id" ref="engineering_change_request_form_view"/>
+ <field name="target">new</field>
+ </record>
+
-+ <record id="plm_ecr_kanban_view_data" model="ir.ui.view">
-+ <field name="name">plm.ecr.kanban</field>
-+ <field name="model">plm.ecr</field>
++ <record id="engineering_change_request_kanban_view_data" model="ir.ui.view">
++ <field name="name">engineering.change.request.kanban</field>
++ <field name="model">engineering.change.request</field>
+ <field name="priority" eval="1"/>
+ <field name="arch" type="xml">
+ <kanban default_group_by="state"
+ class="o_kanban_small_column o_opportunity_kanban"
-+ on_create="plm.create_plm_ecr_form_view">
++ on_create="plm.create_engineering_change_request_form_view">
+ <field name="state"
+ options='{"group_by_tooltip": {"requirements": "Description", "legend_priority": "Use of stars"}}'/>
+ <field name="name"/>
@@ -4006,7 +3945,7 @@
+ <field name="ecr_date"/>
+ <field name="manufacture_order"/>
+ <field name="sale_id"/>
-+ <field name="type_id"/>
++ <field name="type"/>
+ <field name="production_status"/>
+ <field name="category_ids"/>
+ <field name="product_tmpl_id"/>
@@ -4082,75 +4021,179 @@
+ </field>
+ </record>
+
-+ <record id="action_plm_ecr" model="ir.actions.act_window">
-+ <field name="name">Engineering Change Request</field>
-+ <field name="type">ir.actions.act_window</field>
-+ <field name="res_model">plm.ecr</field>
-+ <field name="view_type">form</field>
-+ <field name="view_mode">kanban,tree,form</field>
-+ <field name="context">{}</field>
++ <record id="action_engineering_change_request" model="ir.actions.act_window">
++ <field name="name">Engineering Change Request</field>
++ <field name="type">ir.actions.act_window</field>
++ <field name="res_model">engineering.change.request</field>
++ <field name="view_type">form</field>
++ <field name="view_mode">kanban,tree,form</field>
++ <field name="context">{}</field>
++ </record>
++
++ <record id="engineering_change_order_action_product_tmpl" model="ir.actions.act_window">
++ <field name="name">Engineering Change Orders</field>
++ <field name="res_model">engineering.change.order</field>
++ <field name="view_type">form</field>
++ <field name="view_mode">tree,form</field>
++ <field name="domain">[('product_tmpl_id', '=', active_id)]</field>
++ <field name="help" type="html">
++ <p>
++ Create Engineering Change Orders
++ </p>
++ </field>
++ </record>
++
++ <record
++ id="product_template_view_form_inherit_engineering_change_order"
++ model="ir.ui.view">
++ <field name="name">product.template.view.form.inherit.plm</field>
++ <field name="inherit_id"
++ ref="mrp.product_template_form_view_bom_button"/>
++ <field name="model">product.template</field>
++ <field name="arch" type="xml">
++ <xpath expr="//button[@name='action_view_mos']"
++ position="before">
++ <button class="oe_stat_button"
++ name="%(engineering_change_order_action_product_tmpl)d"
++ type="action" icon="fa-wrench"
++ attrs="{'invisible': [('total_change_order', '=', 0)]}">
++ <field string="ECOs" name="total_change_order" widget="statinfo"/>
++ </button>
++ </xpath>
++ </field>
++ </record>
++
++ <menuitem id="plm_menu_root"
++ name="PLM"
++ web_icon="plm,static/description/icon.png"
++ sequence="7"/>
++
++ <menuitem id="plm_menu"
++ name="PLM"
++ parent="plm_menu_root"
++ sequence="2"/>
++
++ <menuitem id="engineering_change_request_menu"
++ parent="plm_menu"
++ action="action_engineering_change_request"
++ sequence="3"/>
++
++</flectra>
++
+\ No newline at end of file
+diff --git addons/plm/views/plm_category_views.xml addons/plm/views/plm_category_views.xml
+new file mode 100644
+index 0000000..2e14ae5
+--- /dev/null
++++ addons/plm/views/plm_category_views.xml
+@@ -0,0 +1,107 @@
++<?xml version="1.0" encoding="utf-8"?>
++<flectra>
++
++ <record id="plm_category_tree_view" model="ir.ui.view">
++ <field name="name">plm.category.tree</field>
++ <field name="model">plm.category</field>
++ <field name="priority">2</field>
++ <field name="arch" type="xml">
++ <tree>
++ <field name="name"/>
++ <field name="team_id"/>
++ <field name="reviewer"/>
++ <field name="approver"/>
++ </tree>
++ </field>
++ </record>
++
++ <record id="plm_category_form_view" model="ir.ui.view">
++ <field name="name">plm.category.form</field>
++ <field name="model">plm.category</field>
++ <field name="priority">1</field>
++ <field name="arch" type="xml">
++ <form string="Categories">
++ <sheet>
++ <group>
++ <field name="name"/>
++ <field name="team_id"
++ options="{'no_create': True}"/>
++ <field name="reviewer" readonly="1"/>
++ <field name="approver" readonly="1"/>
++ <field name="color" invisible="1"/>
++ </group>
++ </sheet>
++ <div class="oe_chatter">
++ <field name="message_follower_ids" widget="mail_followers"/>
++ <field name="activity_ids" widget="mail_activity"/>
++ <field name="message_ids" widget="mail_thread" options="{'post_refresh': 'recipients'}"/>
++ </div>
++ </form>
++ </field>
+ </record>
+
-+ <record id="plm_eco_action_product_tmpl" model="ir.actions.act_window">
-+ <field name="name">Engineering Change Orders</field>
-+ <field name="res_model">plm.eco</field>
++ <record id="action_plm_category" model="ir.actions.act_window">
++ <field name="name">Categories</field>
++ <field name="type">ir.actions.act_window</field>
++ <field name="res_model">plm.category</field>
+ <field name="view_type">form</field>
+ <field name="view_mode">tree,form</field>
-+ <field name="domain">[('product_tmpl_id', '=', active_id)]</field>
-+ <field name="help" type="html">
-+ <p>
-+ Create Engineering Change Orders
-+ </p>
-+ </field>
++ <field name="context">{}</field>
+ </record>
+
-+ <record id="product_template_view_form_inherit_plm_eco" model="ir.ui.view">
-+ <field name="name">product.template.view.form.inherit.plm</field>
-+ <field name="inherit_id"
-+ ref="mrp.product_template_form_view_bom_button"/>
-+ <field name="model">product.template</field>
++ <record id="plm_reason_tree_view" model="ir.ui.view">
++ <field name="name">plm.reason.tree</field>
++ <field name="model">plm.reason</field>
++ <field name="priority">2</field>
+ <field name="arch" type="xml">
-+ <button name="action_view_mos" position="before">
-+ <button class="oe_stat_button"
-+ name="%(plm_eco_action_product_tmpl)d"
-+ type="action" icon="fa-wrench"
-+ attrs="{'invisible': [('eco_count', '=', 0)]}">
-+ <field string="ECOs" name="eco_count" widget="statinfo"/>
-+ </button>
-+ </button>
++ <tree>
++ <field name="name"/>
++ <field name="action"/>
++ </tree>
+ </field>
+ </record>
+
-+ <record id="product_template_view_form_inherit_version_plm"
-+ model="ir.ui.view">
-+ <field name="name">product.template.view.form.inherit.version.plm
-+ </field>
-+ <field name="inherit_id" ref="product.product_template_form_view"/>
-+ <field name="model">product.template</field>
++ <record id="plm_reason_form_view" model="ir.ui.view">
++ <field name="name">plm.reason.form</field>
++ <field name="model">plm.reason</field>
++ <field name="priority">1</field>
+ <field name="arch" type="xml">
-+ <group name="group_general" position="inside">
-+ <field name="version"/>
-+ </group>
++ <form string="Reasons">
++ <sheet>
++ <group>
++ <field name="name"/>
++ <field name="action"/>
++ </group>
++ </sheet>
++ <div class="oe_chatter">
++ <field name="message_follower_ids" widget="mail_followers"/>
++ <field name="activity_ids" widget="mail_activity"/>
++ <field name="message_ids" widget="mail_thread" options="{'post_refresh': 'recipients'}"/>
++ </div>
++ </form>
+ </field>
+ </record>
+
-+ <menuitem id="plm_menu_root"
-+ name="PLM"
-+ sequence="7"/>
++ <record id="action_plm_reason" model="ir.actions.act_window">
++ <field name="name">Reasons</field>
++ <field name="type">ir.actions.act_window</field>
++ <field name="res_model">plm.reason</field>
++ <field name="view_type">form</field>
++ <field name="view_mode">tree,form</field>
++ <field name="context">{}</field>
++ </record>
+
-+ <menuitem id="plm_menu"
-+ name="PLM"
++ <menuitem id="plm_categories_main_menu"
++ name="Configuration"
+ parent="plm_menu_root"
+ sequence="2"/>
-+
-+ <menuitem id="plm_ecr_menu"
-+ parent="plm_menu"
-+ action="action_plm_ecr"
++ <menuitem id="plm_categories_sub_menu"
++ parent="plm_categories_main_menu"
++ action="action_plm_category"
+ sequence="3"/>
++ <menuitem id="plm_reason_sub_menu"
++ parent="plm_categories_main_menu"
++ action="action_plm_reason"
++ sequence="4"/>
+
+</flectra>
-+
-\ No newline at end of file
diff --git addons/plm/views/plm_team_views.xml addons/plm/views/plm_team_views.xml
new file mode 100644
index 0000000..5ebeade
@@ -4265,6 +4308,38 @@
+ sequence="3"/>
+
+</flectra>
+diff --git addons/plm/views/production_views.xml addons/plm/views/production_views.xml
+new file mode 100644
+index 0000000..bcf78f8
+--- /dev/null
++++ addons/plm/views/production_views.xml
+@@ -0,0 +1,26 @@
++<?xml version="1.0" encoding="utf-8"?>
++<flectra>
++
++ <record id="mrp_production_form_view_inherit" model="ir.ui.view">
++ <field name="name">mrp.production.form.inherit</field>
++ <field name="model">mrp.production</field>
++ <field name="inherit_id" ref="mrp.mrp_production_form_view"/>
++ <field name="arch" type="xml">
++ <div class="oe_button_box" position="inside">
++ <button class="oe_stat_button" name="button_engineering_change_request"
++ type="object" icon="fa-cogs">
++ <field string="ECR(s)" name="total_change_order" widget="statinfo"/>
++ </button>
++ </div>
++ <button name="button_plan" position="after">
++ <button name="create_ecr" type="object" attrs="{'invisible':
++ ['|',('state', '!=', 'confirmed')]}"
++ string="Create ECR" class="oe_highlight"/>
++ </button>
++ <field name="product_id" position="after">
++ <field name="sale_id"/>
++ </field>
++ </field>
++ </record>
++
++</flectra>
diff --git addons/plm/views/res_users_views.xml addons/plm/views/res_users_views.xml
new file mode 100644
index 0000000..36bdc60
@@ -4297,6 +4372,140 @@
+ </record>
+
+</flectra>
+diff --git addons/plm/views/routing_views.xml addons/plm/views/routing_views.xml
+new file mode 100644
+index 0000000..57c68ac
+--- /dev/null
++++ addons/plm/views/routing_views.xml
+@@ -0,0 +1,128 @@
++<?xml version="1.0" encoding="utf-8"?>
++<flectra>
++
++ <record model="ir.actions.act_window" id="mrp.mrp_routing_action">
++ <field name="domain">['|',('active','=',True),('active','=',False)]
++ </field>
++ </record>
++
++ <record id="mrp.mrp_routing_tree_view" model="ir.ui.view">
++ <field name="name">mrp.routing.tree</field>
++ <field name="model">mrp.routing</field>
++ <field name="arch" type="xml">
++ <tree>
++ <field name="name"/>
++ <field name="code"/>
++ <field name="sequence"/>
++ </tree>
++ </field>
++ </record>
++
++ <record model="ir.ui.view" id="plm_bom_version_tree_view">
++ <field name="name">mrp.routing.tree</field>
++ <field name="model">mrp.routing</field>
++ <field name="inherit_id" ref="mrp.mrp_routing_tree_view"/>
++ <field name="arch" type="xml">
++ <field name="sequence" position="before">
++ <field name="active"/>
++ <field name="version"/>
++ <field name="state"/>
++ <field name="historical_date"/>
++ <field name="change_order_type"/>
++ <button name="button_draft" type="object" string="Draft"
++ attrs="{'invisible':[('state','!=','active')]}"
++ class="oe_highlight"
++ icon="fa-times-circle text-success"/>
++ <button name="button_activate" type="object"
++ string="Activate"
++ attrs="{'invisible':[
++ ('state','not in',(False, 'draft'))]}"
++ class="oe_highlight" icon="fa-archive"
++ confirm="You will activate the Routing.
++ If you haven't set a route yet, then you won't
++ be able to do it after this.
++ Are you sure you want to proceed?"/>
++ <button name="button_new_version" type="object"
++ string="New version"
++ attrs="{'invisible':['|',
++ ('state','==','historical'),
++ ('change_order_type','=','temporary')]}"
++ class="oe_highlight"
++ icon="fa-check text-success"
++ confirm="You are going to create a new version
++ of this Routing. Are you sure?"/>
++ <button name="button_historical" type="object"
++ string="Historical"
++ attrs="{'invisible':[('state','!=','active')]}"
++ class="oe_highlight"
++ icon="fa-times-circle text-danger"
++ confirm="You are going to historize an Routing.
++ Doing, not be able to unlock it unless you
++ make a copy. Are you sure you want to
++ proceed?"/>
++ </field>
++ </field>
++ </record>
++
++ <record id="mrp_routing_view_form_inherit_engineering_change_order" model="ir.ui.view">
++ <field name="name">mrp.routing.view.form.inherit.plm</field>
++ <field name="model">mrp.routing</field>
++ <field name="inherit_id" ref="mrp.mrp_routing_form_view"/>
++ <field name="arch" type="xml">
++ <xpath expr="//form/sheet" position="before">
++ <header>
++ <button name="button_draft" type="object" string="Draft"
++ attrs="{'invisible':[('state','!=','active')]}"
++ class="oe_highlight"/>
++ <button name="button_activate" type="object"
++ string="Activate"
++ attrs="{'invisible':[
++ ('state','not in',(False, 'draft'))]}"
++ class="oe_highlight"
++ confirm="You will activate the Routing.
++ If you haven't set a route yet, then you won't
++ be able to do it after this. Are you sure you
++ want to proceed?"/>
++ <button name="button_new_version" type="object"
++ string="New version"
++ attrs="{'invisible':['|',
++ ('state','==','historical'),
++ ('change_order_type','=','temporary')]}"
++ class="oe_highlight"
++ confirm="You are going to create a new version
++ of this Routing. Are you sure?"/>
++ <button name="button_historical" type="object"
++ string="Historical"
++ attrs="{'invisible':[('state','!=','active')]}"
++ class="oe_highlight"
++ confirm="You are going to historize an Routing.
++ Doing, not be able to unlock it unless you make
++ a copy. Are you sure you want to proceed?"/>
++ <field name="state" widget="statusbar"
++ statusbar_visible="draft,active,historical"/>
++ </header>
++ </xpath>
++ <button name="toggle_active" position="before">
++ <button class="oe_stat_button" name="action_engineering_change_order"
++ type="object" icon="fa-cogs">
++ <field string="ECO(s)" name="total_change_order" widget="statinfo"/>
++ </button>
++ </button>
++ <field name="company_id" position="after">
++ <field name="change_order_type"/>
++ <field name="version"/>
++ <field name="historical_date" attrs="{'invisible': [
++ ('state','!=','historical')]}"/>
++ </field>
++ <notebook position="inside">
++ <page string="Versions">
++ <field name="old_versions"/>
++ </page>
++ <page string="ECO">
++ <field name="change_order_ids"/>
++ </page>
++ </notebook>
++ </field>
++ </record>
++
++</flectra>
diff --git addons/plm/wizard/__init__.py addons/plm/wizard/__init__.py
new file mode 100755
index 0000000..7eb0088
@@ -4308,7 +4517,7 @@
+from . import process
diff --git addons/plm/wizard/process.py addons/plm/wizard/process.py
new file mode 100644
-index 0000000..e636dd8
+index 0000000..4011c9c
--- /dev/null
+++ addons/plm/wizard/process.py
@@ -0,0 +1,103 @@
@@ -4336,10 +4545,10 @@
+ def ecr_category_id(self):
+ context = dict(self._context or {})
+ active_ids = context.get('active_ids', []) or []
-+ ecr_id = self.env['plm.ecr'].browse(active_ids)
-+ approve_line = self.env['plm.ecr.approval'].search(
++ ecr_id = self.env['engineering.change.request'].browse(active_ids)
++ approve_line = self.env['engineering.change.request.acceptance'].search(
+ [('ecr_id', '=', ecr_id.id), ('action', '=', 'approve')])
-+ review_line = self.env['plm.ecr.approval'].search(
++ review_line = self.env['engineering.change.request.acceptance'].search(
+ [('ecr_id', '=', ecr_id.id), ('action', '=', 'review')])
+ if self.action in ['review', 'approve']:
+ if self.category_id:
@@ -4372,8 +4581,8 @@
+ def action_send_for_process(self):
+ context = dict(self._context or {})
+ active_ids = context.get('active_ids', []) or []
-+ ecr_id = self.env['plm.ecr'].browse(active_ids)
-+ approval_obj = self.env['plm.ecr.approval']
++ ecr_id = self.env['engineering.change.request'].browse(active_ids)
++ approval_obj = self.env['engineering.change.request.acceptance']
+ approval_line = approval_obj.search([('ecr_id', '=', ecr_id.id),
+ ('category_ids', 'in',
+ self.category_id.id)])
@@ -4398,8 +4607,8 @@
+ def action_ecr_reject(self):
+ context = dict(self._context or {})
+ active_ids = context.get('active_ids', []) or []
-+ ecr_id = self.env['plm.ecr'].browse(active_ids)
-+ approval_obj = self.env['plm.ecr.approval']
++ ecr_id = self.env['engineering.change.request'].browse(active_ids)
++ approval_obj = self.env['engineering.change.request.acceptance']
+ approval_line = approval_obj.search([('ecr_id', '=', ecr_id.id),
+ ('category_ids', 'in',
+ self.category_id.id)])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment