From ab9abc40c30e92bb517c6bee5e693f419dc3352b Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Wed, 10 Dec 2014 23:35:21 +0100 Subject: [PATCH] [IMP] Total refactorization of quality control modules with new API, README files, and new concepts. WIP of quality_control_tolerance [FIX] quality_control: Triggers for product category --- quality_control_mrp/README.rst | 11 +++ quality_control_mrp/__init__.py | 6 ++ quality_control_mrp/__openerp__.py | 42 +++++++++++ .../data/quality_control_mrp_data.xml | 16 +++++ quality_control_mrp/i18n/es.po | 39 ++++++++++ .../i18n/quality_control_mrp.pot | 39 ++++++++++ quality_control_mrp/models/__init__.py | 7 ++ quality_control_mrp/models/mrp_production.py | 58 +++++++++++++++ quality_control_mrp/models/qc_inspection.py | 45 ++++++++++++ .../static/description/icon.png | Bin 0 -> 11357 bytes .../views/qc_inspection_view.xml | 68 ++++++++++++++++++ 11 files changed, 331 insertions(+) create mode 100644 quality_control_mrp/README.rst create mode 100644 quality_control_mrp/__init__.py create mode 100644 quality_control_mrp/__openerp__.py create mode 100644 quality_control_mrp/data/quality_control_mrp_data.xml create mode 100644 quality_control_mrp/i18n/es.po create mode 100644 quality_control_mrp/i18n/quality_control_mrp.pot create mode 100644 quality_control_mrp/models/__init__.py create mode 100644 quality_control_mrp/models/mrp_production.py create mode 100644 quality_control_mrp/models/qc_inspection.py create mode 100644 quality_control_mrp/static/description/icon.png create mode 100644 quality_control_mrp/views/qc_inspection_view.xml diff --git a/quality_control_mrp/README.rst b/quality_control_mrp/README.rst new file mode 100644 index 000000000..22a06a73f --- /dev/null +++ b/quality_control_mrp/README.rst @@ -0,0 +1,11 @@ +MRP extension for quality control +================================= + +This module defines a trigger that creates inspections when a production order +is made. + +It also adds some shortcuts on production orders to these inspections. + +Contributors +------------ +* Pedro M. Baeza diff --git a/quality_control_mrp/__init__.py b/quality_control_mrp/__init__.py new file mode 100644 index 000000000..ad6c8186c --- /dev/null +++ b/quality_control_mrp/__init__.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +############################################################################## +# For copyright and license notices, see __openerp__.py file in root directory +############################################################################## + +from . import models diff --git a/quality_control_mrp/__openerp__.py b/quality_control_mrp/__openerp__.py new file mode 100644 index 000000000..3d98666dd --- /dev/null +++ b/quality_control_mrp/__openerp__.py @@ -0,0 +1,42 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Copyright (c) +# 2014 Serv. Tec. Avanzados - Pedro M. Baeza (http://www.serviciosbaeza.com) +# 2014 AvanzOsc (http://www.avanzosc.es) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +{ + "name": "Quality control - MRP", + "version": "1.0", + "author": "OdooMRP team", + "website": "http://www.odoomrp.com", + "contributors": [ + "Pedro M. Baeza + + + + + Production done + + + + + Manufacturing Order + mrp.production + + + + diff --git a/quality_control_mrp/i18n/es.po b/quality_control_mrp/i18n/es.po new file mode 100644 index 000000000..04e8522a7 --- /dev/null +++ b/quality_control_mrp/i18n/es.po @@ -0,0 +1,39 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * quality_control_mrp +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-12-10 17:45+0000\n" +"PO-Revision-Date: 2014-12-10 17:45+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: quality_control_mrp +#: help:mrp.production,qc_inspections:0 +msgid "Inspections related to this production." +msgstr "Inspecciones relativas a esta producción." + +#. module: quality_control_mrp +#: view:qc.inspection:quality_control_mrp.qc_inspection_search_view_production +#: field:qc.inspection,production:0 +msgid "Production" +msgstr "Producción" + +#. module: quality_control_mrp +#: model:qc.trigger,name:quality_control_mrp.qc_trigger_mrp +msgid "Production done" +msgstr "Producción realizada" + +#. module: quality_control_mrp +#: view:qc.inspection.line:quality_control_mrp.qc_inspection_line_search_production_view +#: field:qc.inspection.line,production:0 +msgid "Production order" +msgstr "Orden de producción" + diff --git a/quality_control_mrp/i18n/quality_control_mrp.pot b/quality_control_mrp/i18n/quality_control_mrp.pot new file mode 100644 index 000000000..65cb98ce8 --- /dev/null +++ b/quality_control_mrp/i18n/quality_control_mrp.pot @@ -0,0 +1,39 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * quality_control_mrp +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-12-10 17:45+0000\n" +"PO-Revision-Date: 2014-12-10 17:45+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: quality_control_mrp +#: help:mrp.production,qc_inspections:0 +msgid "Inspections related to this production." +msgstr "" + +#. module: quality_control_mrp +#: view:qc.inspection:quality_control_mrp.qc_inspection_search_view_production +#: field:qc.inspection,production:0 +msgid "Production" +msgstr "" + +#. module: quality_control_mrp +#: model:qc.trigger,name:quality_control_mrp.qc_trigger_mrp +msgid "Production done" +msgstr "" + +#. module: quality_control_mrp +#: view:qc.inspection.line:quality_control_mrp.qc_inspection_line_search_production_view +#: field:qc.inspection.line,production:0 +msgid "Production order" +msgstr "" + diff --git a/quality_control_mrp/models/__init__.py b/quality_control_mrp/models/__init__.py new file mode 100644 index 000000000..adf4739b2 --- /dev/null +++ b/quality_control_mrp/models/__init__.py @@ -0,0 +1,7 @@ +# -*- coding: utf-8 -*- +############################################################################## +# For copyright and license notices, see __openerp__.py file in root directory +############################################################################## + +from . import qc_inspection +from . import mrp_production diff --git a/quality_control_mrp/models/mrp_production.py b/quality_control_mrp/models/mrp_production.py new file mode 100644 index 000000000..58b1707b3 --- /dev/null +++ b/quality_control_mrp/models/mrp_production.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +############################################################################## +# For copyright and license notices, see __openerp__.py file in root directory +############################################################################## +from openerp import models, fields, api + + +class MrpProduction(models.Model): + _inherit = 'mrp.production' + + @api.one + @api.depends('qc_inspections', 'qc_inspections.state') + def _count_inspections(self): + self.created_inspections = len(self.qc_inspections) + self.passed_inspections = len([x for x in self.qc_inspections if + x.state == 'success']) + self.failed_inspections = len([x for x in self.qc_inspections if + x.state == 'failed']) + self.done_inspections = (self.passed_inspections + + self.failed_inspections) + + qc_inspections = fields.One2many( + comodel_name='qc.inspection', inverse_name='picking', copy=False, + string='Inspections', help="Inspections related to this production.") + created_inspections = fields.Integer( + compute="_count_inspections", string="Created inspections") + done_inspections = fields.Integer( + compute="_count_inspections", string="Done inspections") + passed_inspections = fields.Integer( + compute="_count_inspections", string="Inspections OK") + failed_inspections = fields.Integer( + compute="_count_inspections", string="Inspections failed") + + @api.v7 + def action_produce(self, cr, uid, production_id, production_qty, + production_mode, wiz=False, context=None): + production = self.browse(cr, uid, production_id, context=context) + production.action_produce( + production_id, production_qty, production_mode, wiz=wiz) + + @api.v8 + def action_produce(self, production_id, production_qty, production_mode, + wiz=False): + res = super(MrpProduction, self).action_produce( + production_id, production_qty, production_mode, wiz=wiz) + if production_mode == 'consume_produce': + inspection_model = self.env['qc.inspection'] + for move in self.move_created_ids2: + qc_trigger = self.env.ref('quality_control_mrp.qc_trigger_mrp') + tests = set() + for model in ['qc.trigger.product_category_line', + 'qc.trigger.product_template_line', + 'qc.trigger.product_line']: + tests = tests.union(self.env[model].get_test_for_product( + qc_trigger, move.product_id)) + for test in tests: + inspection_model._make_inspection(move, test) + return res diff --git a/quality_control_mrp/models/qc_inspection.py b/quality_control_mrp/models/qc_inspection.py new file mode 100644 index 000000000..cf7cc96bd --- /dev/null +++ b/quality_control_mrp/models/qc_inspection.py @@ -0,0 +1,45 @@ +# -*- coding: utf-8 -*- +############################################################################## +# For copyright and license notices, see __openerp__.py file in root directory +############################################################################## +from openerp import models, fields, api + + +class QcInspection(models.Model): + _inherit = 'qc.inspection' + + @api.one + @api.depends('object_id') + def get_production(self): + self.production = False + if self.object_id: + if self.object_id._name == 'mrp.production': + self.production = self.object_id + + @api.one + @api.depends('object_id') + def _get_product(self): + """Overriden for getting the product from a mrp.production.""" + super(QcInspection, self)._get_product() + if self.object_id: + if self.object_id._name == 'mrp.production': + self.product = self.object_id.product_id + + @api.one + @api.depends('object_id') + def _get_qty(self): + super(QcInspection, self)._get_qty() + if self.object_id: + if self.object_id._name == 'mrp.production': + self.qty = self.object_id.product_qty + + production = fields.Many2one( + comodel_name="mrp.production", compute="get_production", store=True) + + +class QcInspectionLine(models.Model): + _inherit = 'qc.inspection.line' + + production = fields.Many2one( + comodel_name="mrp.production", related="inspection_id.production", + store=True, string="Production order") diff --git a/quality_control_mrp/static/description/icon.png b/quality_control_mrp/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..10f1f876f701f5263215071b2497ae85b408aab4 GIT binary patch literal 11357 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 literal 0 HcmV?d00001 diff --git a/quality_control_mrp/views/qc_inspection_view.xml b/quality_control_mrp/views/qc_inspection_view.xml new file mode 100644 index 000000000..8f1ee8c8c --- /dev/null +++ b/quality_control_mrp/views/qc_inspection_view.xml @@ -0,0 +1,68 @@ + + + + + + qc.inspection.form.view.production + qc.inspection + + + + + + + + + + qc.inspection.tree.view.production + qc.inspection + + + + + + + + + + qc.inspection.search.view.production + qc.inspection + + + + + + + + + + qc.inspection.line.tree.production + qc.inspection.line + + + + + + + + + + qc.inspection.line.search.production + qc.inspection.line + + + + + + + + + + + + +