From 1891090bedb5b3c0efdef6f28c03da75086f1451 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 Merge branch '8.0' of github.com:odoomrp/odoomrp-wip into 8.0 [FIX] quality_control_stock: * File missing * Triggers for product category --- quality_control_stock_oca/README.rst | 10 ++ quality_control_stock_oca/__init__.py | 16 +++ quality_control_stock_oca/__openerp__.py | 45 ++++++++ .../data/quality_control_stock_data.xml | 21 ++++ quality_control_stock_oca/i18n/es.po | 94 +++++++++++++++++ .../i18n/quality_control_stock.pot | 99 ++++++++++++++++++ quality_control_stock_oca/models/__init__.py | 10 ++ .../models/qc_inspection.py | 68 ++++++++++++ .../models/qc_trigger.py | 12 +++ .../models/stock_picking.py | 49 +++++++++ .../models/stock_picking_type.py | 41 ++++++++ .../models/stock_production_lot.py | 32 ++++++ .../static/description/icon.png | Bin 0 -> 10971 bytes .../views/qc_inspection_view.xml | 79 ++++++++++++++ .../views/stock_picking_view.xml | 70 +++++++++++++ .../views/stock_production_lot_view.xml | 72 +++++++++++++ 16 files changed, 718 insertions(+) create mode 100644 quality_control_stock_oca/README.rst create mode 100644 quality_control_stock_oca/__init__.py create mode 100644 quality_control_stock_oca/__openerp__.py create mode 100644 quality_control_stock_oca/data/quality_control_stock_data.xml create mode 100644 quality_control_stock_oca/i18n/es.po create mode 100644 quality_control_stock_oca/i18n/quality_control_stock.pot create mode 100644 quality_control_stock_oca/models/__init__.py create mode 100644 quality_control_stock_oca/models/qc_inspection.py create mode 100644 quality_control_stock_oca/models/qc_trigger.py create mode 100644 quality_control_stock_oca/models/stock_picking.py create mode 100644 quality_control_stock_oca/models/stock_picking_type.py create mode 100644 quality_control_stock_oca/models/stock_production_lot.py create mode 100644 quality_control_stock_oca/static/description/icon.png create mode 100644 quality_control_stock_oca/views/qc_inspection_view.xml create mode 100644 quality_control_stock_oca/views/stock_picking_view.xml create mode 100644 quality_control_stock_oca/views/stock_production_lot_view.xml diff --git a/quality_control_stock_oca/README.rst b/quality_control_stock_oca/README.rst new file mode 100644 index 000000000..937772c0e --- /dev/null +++ b/quality_control_stock_oca/README.rst @@ -0,0 +1,10 @@ +Stock extension for quality control +=================================== + +This module defines triggers that creates inspections when stock moves are done. + +It also adds some shortcuts on picking and lots to these inspections. + +Contributors +------------ +* Pedro M. Baeza diff --git a/quality_control_stock_oca/__init__.py b/quality_control_stock_oca/__init__.py new file mode 100644 index 000000000..86bcf7d2e --- /dev/null +++ b/quality_control_stock_oca/__init__.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +############################################################################## +# For copyright and license notices, see __openerp__.py file in root directory +############################################################################## + +from . import models +from openerp import SUPERUSER_ID + + +def post_init_hook(cr, registry): + # Create QC triggers + picking_type_ids = registry['stock.picking.type'].search( + cr, SUPERUSER_ID, []) + for picking_type_id in picking_type_ids: + registry['stock.picking.type']._create_qc_trigger( + cr, SUPERUSER_ID, picking_type_id) diff --git a/quality_control_stock_oca/__openerp__.py b/quality_control_stock_oca/__openerp__.py new file mode 100644 index 000000000..d0b38c80a --- /dev/null +++ b/quality_control_stock_oca/__openerp__.py @@ -0,0 +1,45 @@ +# -*- 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 - Stock", + "version": "1.0", + "author": "OdooMRP team", + "website": "http://www.odoomrp.com", + "contributors": [ + "Pedro M. Baeza + + + + + Stock Move + stock.move + + + + Picking List + stock.picking + + + + Lot + stock.production.lot + + + + diff --git a/quality_control_stock_oca/i18n/es.po b/quality_control_stock_oca/i18n/es.po new file mode 100644 index 000000000..203f5f67d --- /dev/null +++ b/quality_control_stock_oca/i18n/es.po @@ -0,0 +1,94 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * quality_control_stock +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-12-10 19:26+0000\n" +"PO-Revision-Date: 2014-12-10 19:26+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_stock +#: help:stock.production.lot,qc_inspections:0 +msgid "Inspections related to this lot." +msgstr "Inspecciones relativas a este lote." + +#. module: quality_control_stock +#: help:stock.picking,qc_inspections:0 +msgid "Inspections related to this picking." +msgstr "Inspecciones relativas a este albarán." + +#. module: quality_control_stock +#: view:qc.inspection:quality_control_stock.qc_inspection_search_view_picking +#: field:qc.inspection,lot:0 +#: view:qc.inspection.line:quality_control_stock.qc_inspection_line_search_stock_view +#: field:qc.inspection.line,lot:0 +msgid "Lot" +msgstr "Lote" + +#. module: quality_control_stock +#: view:qc.inspection:quality_control_stock.qc_inspection_search_view_picking +#: field:qc.inspection,picking:0 +#: view:qc.inspection.line:quality_control_stock.qc_inspection_line_search_stock_view +#: field:qc.inspection.line,picking:0 +msgid "Picking" +msgstr "Albarán" + +#. module: quality_control_stock +#: field:qc.trigger,picking_type:0 +msgid "Picking type" +msgstr "Tipo de albarán" + +#. module: quality_control_stock +#: model:ir.actions.act_window,name:quality_control_stock.action_qc_inspection_per_lot_done +msgid "Quality inspection from lot done" +msgstr "Inspecciones desde lote realizadas" + +#. module: quality_control_stock +#: model:ir.actions.act_window,name:quality_control_stock.action_qc_inspection_per_lot_passed +msgid "Quality inspection from lot passed" +msgstr "Inspecciones desde lote pasadas" + +#. module: quality_control_stock +#: model:ir.actions.act_window,name:quality_control_stock.action_qc_inspection_per_picking_done +msgid "Quality inspection from picking done" +msgstr "Inspecciones desde albarán realizadas" + +#. module: quality_control_stock +#: model:ir.actions.act_window,name:quality_control_stock.action_qc_inspection_per_picking_passed +msgid "Quality inspection from picking passed" +msgstr "Inspecciones desde albarán realizadas" + +#. module: quality_control_stock +#: model:ir.actions.act_window,name:quality_control_stock.action_qc_inspection_per_lot +msgid "Quality inspections from lot" +msgstr "Inspecciones desde lote" + +#. module: quality_control_stock +#: model:ir.actions.act_window,name:quality_control_stock.action_qc_inspection_per_lot_failed +msgid "Quality inspections from lot failed" +msgstr "Inspecciones desde lote fallidas" + +#. module: quality_control_stock +#: model:ir.actions.act_window,name:quality_control_stock.action_qc_inspection_per_picking +msgid "Quality inspections from picking" +msgstr "Inspecciones desde albarán" + +#. module: quality_control_stock +#: model:ir.actions.act_window,name:quality_control_stock.action_qc_inspection_per_picking_failed +msgid "Quality inspections from picking failed" +msgstr "Inspecciones desde albarán falladas" + +#. module: quality_control_stock +#: view:stock.picking:quality_control_stock.stock_picking_qc_view +#: view:stock.production.lot:quality_control_stock.stock_lot_qc_view +msgid "inspections" +msgstr "inspecciones" + diff --git a/quality_control_stock_oca/i18n/quality_control_stock.pot b/quality_control_stock_oca/i18n/quality_control_stock.pot new file mode 100644 index 000000000..2f4ec2a15 --- /dev/null +++ b/quality_control_stock_oca/i18n/quality_control_stock.pot @@ -0,0 +1,99 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * quality_control_stock +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2014-12-10 19:26+0000\n" +"PO-Revision-Date: 2014-12-10 19:26+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_stock +#: help:stock.production.lot,qc_inspections:0 +msgid "Inspections related to this lot." +msgstr "" + +#. module: quality_control_stock +#: help:stock.picking,qc_inspections:0 +msgid "Inspections related to this picking." +msgstr "" + +#. module: quality_control_stock +#: view:qc.inspection:quality_control_stock.qc_inspection_search_view_putvalid +#: field:qc.inspection,lot:0 +#: view:qc.inspection.line:quality_control_stock.qc_inspection_line_search_stock_view +#: field:qc.inspection.line,lot:0 +msgid "Lot" +msgstr "" + +#. module: quality_control_stock +#: model:ir.model,name:quality_control_stock.model_stock_production_lot +msgid "Lot/Serial" +msgstr "" + +#. module: quality_control_stock +#: view:qc.inspection:quality_control_stock.qc_inspection_search_view_putvalid +#: field:qc.inspection,picking:0 +#: view:qc.inspection.line:quality_control_stock.qc_inspection_line_search_stock_view +#: field:qc.inspection.line,picking:0 +msgid "Picking" +msgstr "" + +#. module: quality_control_stock +#: field:qc.trigger,picking_type:0 +msgid "Picking type" +msgstr "" + +#. module: quality_control_stock +#: model:ir.actions.act_window,name:quality_control_stock.action_qc_inspection_per_lot_done +msgid "Quality inspection from lot done" +msgstr "" + +#. module: quality_control_stock +#: model:ir.actions.act_window,name:quality_control_stock.action_qc_inspection_per_lot_passed +msgid "Quality inspection from lot passed" +msgstr "" + +#. module: quality_control_stock +#: model:ir.actions.act_window,name:quality_control_stock.action_qc_inspection_per_picking_done +msgid "Quality inspection from picking done" +msgstr "" + +#. module: quality_control_stock +#: model:ir.actions.act_window,name:quality_control_stock.action_qc_inspection_per_picking_passed +msgid "Quality inspection from picking passed" +msgstr "" + +#. module: quality_control_stock +#: model:ir.actions.act_window,name:quality_control_stock.action_qc_inspection_per_lot +msgid "Quality inspections from lot" +msgstr "" + +#. module: quality_control_stock +#: model:ir.actions.act_window,name:quality_control_stock.action_qc_inspection_per_lot_failed +msgid "Quality inspections from lot failed" +msgstr "" + +#. module: quality_control_stock +#: model:ir.actions.act_window,name:quality_control_stock.action_qc_inspection_per_picking +msgid "Quality inspections from picking" +msgstr "" + +#. module: quality_control_stock +#: model:ir.actions.act_window,name:quality_control_stock.action_qc_inspection_per_picking_failed +msgid "Quality inspections from picking failed" +msgstr "" + +#. module: quality_control_stock +#: view:stock.picking:quality_control_stock.stock_picking_qc_view +#: view:stock.production.lot:quality_control_stock.stock_lot_qc_view +msgid "inspections" +msgstr "" + diff --git a/quality_control_stock_oca/models/__init__.py b/quality_control_stock_oca/models/__init__.py new file mode 100644 index 000000000..bf7cb46e4 --- /dev/null +++ b/quality_control_stock_oca/models/__init__.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +############################################################################## +# For copyright and license notices, see __openerp__.py file in root directory +############################################################################## + +from . import qc_trigger +from . import qc_inspection +from . import stock_picking_type +from . import stock_picking +from . import stock_production_lot diff --git a/quality_control_stock_oca/models/qc_inspection.py b/quality_control_stock_oca/models/qc_inspection.py new file mode 100644 index 000000000..22b79396d --- /dev/null +++ b/quality_control_stock_oca/models/qc_inspection.py @@ -0,0 +1,68 @@ +# -*- 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_picking(self): + self.picking = False + if self.object_id: + if self.object_id._name == 'stock.move': + self.picking = self.object_id.picking_id + elif self.object_id._name == 'stock.picking': + self.picking = self.object_id + elif self.object_id._name == 'stock.pack.operation': + self.picking = self.object_id.picking_id + + @api.one + @api.depends('object_id') + def get_lot(self): + self.lot = False + if self.object_id: + if self.object_id._name == 'stock.pack.operation': + self.lot = self.object_id.lot_id + elif self.object_id._name == 'stock.move': + self.lot = self.object_id.lots_id[0] + + @api.one + @api.depends('object_id') + def _get_product(self): + """Overriden for getting the product from a stock move.""" + super(QcInspection, self)._get_product() + if self.object_id: + if self.object_id._name == 'stock.move': + self.product = self.object_id.product_id + elif self.object_id._name == 'stock.pack.operation': + 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 == 'stock.move': + self.qty = self.object_id.product_qty + elif self.object_id._name == 'stock.pack.operation': + self.qty = self.object_id.product_qty + + picking = fields.Many2one( + comodel_name="stock.picking", compute="get_picking", store=True) + lot = fields.Many2one( + comodel_name='stock.production.lot', compute="get_lot", store=True) + + +class QcInspectionLine(models.Model): + _inherit = 'qc.inspection.line' + + picking = fields.Many2one( + comodel_name="stock.picking", related="inspection_id.picking", + store=True) + lot = fields.Many2one( + comodel_name="stock.production.lot", related="inspection_id.lot", + store=True) diff --git a/quality_control_stock_oca/models/qc_trigger.py b/quality_control_stock_oca/models/qc_trigger.py new file mode 100644 index 000000000..e53003749 --- /dev/null +++ b/quality_control_stock_oca/models/qc_trigger.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +############################################################################## +# For copyright and license notices, see __openerp__.py file in root directory +############################################################################## +from openerp import models, fields + + +class QcTrigger(models.Model): + _inherit = 'qc.trigger' + + picking_type = fields.Many2one( + comodel_name="stock.picking.type", readonly=True) diff --git a/quality_control_stock_oca/models/stock_picking.py b/quality_control_stock_oca/models/stock_picking.py new file mode 100644 index 000000000..b3c14aca2 --- /dev/null +++ b/quality_control_stock_oca/models/stock_picking.py @@ -0,0 +1,49 @@ +# -*- coding: utf-8 -*- +############################################################################## +# For copyright and license notices, see __openerp__.py file in root directory +############################################################################## +from openerp import models, fields, api + + +class StockPicking(models.Model): + _inherit = 'stock.picking' + + @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 picking.") + 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.multi + def do_transfer(self): + res = super(StockPicking, self).do_transfer() + inspection_model = self.env['qc.inspection'] + for operation in self.pack_operation_ids: + qc_trigger = self.env['qc.trigger'].search( + [('picking_type', '=', self.picking_type_id.id)]) + 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, operation.product_id)) + for test in tests: + inspection_model._make_inspection(operation, test) + return res diff --git a/quality_control_stock_oca/models/stock_picking_type.py b/quality_control_stock_oca/models/stock_picking_type.py new file mode 100644 index 000000000..c09cae31a --- /dev/null +++ b/quality_control_stock_oca/models/stock_picking_type.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +############################################################################## +# For copyright and license notices, see __openerp__.py file in root directory +############################################################################## +from openerp import models, api + + +class StockPickingType(models.Model): + _inherit = 'stock.picking.type' + + @api.multi + def _create_qc_trigger(self): + qc_trigger = { + # Synchronize all translations + 'name': self.complete_name, + 'company_id': self.warehouse_id.company_id.id, + 'picking_type': self.id, + } + return self.env['qc.trigger'].sudo().create(qc_trigger) + + @api.model + def create(self, vals): + picking_type = super(StockPickingType, self).create(vals) + picking_type._create_qc_trigger() + return picking_type + + @api.multi + def write(self, vals): + res = super(StockPickingType, self).write(vals) + if vals.get('name') or vals.get('warehouse_id'): + qc_trigger_model = self.env['qc.trigger'].sudo() + qc_trigger = qc_trigger_model.search( + [('picking_type', '=', self.id)]) + qc_trigger.name = self.complete_name + return res + + @api.multi + def unlink(self): + self.env['qc.trigger'].sudo().search( + [('picking_type', '=', self.id)]).unlink() + return super(StockPickingType, self).unlink() diff --git a/quality_control_stock_oca/models/stock_production_lot.py b/quality_control_stock_oca/models/stock_production_lot.py new file mode 100644 index 000000000..ed67fb25f --- /dev/null +++ b/quality_control_stock_oca/models/stock_production_lot.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +############################################################################## +# For copyright and license notices, see __openerp__.py file in root directory +############################################################################## +from openerp import models, fields, api + + +class StockProductionLot(models.Model): + _inherit = 'stock.production.lot' + + @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='lot', copy=False, + string='Inspections', help="Inspections related to this lot.") + 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") diff --git a/quality_control_stock_oca/static/description/icon.png b/quality_control_stock_oca/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..26561d6c0b898ddfee4f4d67a22a89a346aa0e89 GIT binary patch literal 10971 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 xD`f? + + + + + qc.inspection.form.view.picking + qc.inspection + + + + + + + + + + + qc.inspection.tree.view.picking + qc.inspection + + + + + + + + + + + qc.inspection.search.view.picking + qc.inspection + + + + + + + + + + + qc.inspection.line.tree.stock + qc.inspection.line + + + + + + + + + + + qc.inspection.line.search.stock + qc.inspection.line + + + + + + + + + + + + + + + diff --git a/quality_control_stock_oca/views/stock_picking_view.xml b/quality_control_stock_oca/views/stock_picking_view.xml new file mode 100644 index 000000000..1c53c4d06 --- /dev/null +++ b/quality_control_stock_oca/views/stock_picking_view.xml @@ -0,0 +1,70 @@ + + + + + + Quality inspections from picking + qc.inspection + tree,form + [('picking', '=', active_id)] + + + + Quality inspection from picking done + qc.inspection + tree,form + [('picking', '=', active_id), ('state', 'not in', ['draft', 'waiting'])] + + + + Quality inspection from picking passed + qc.inspection + tree,form + [('picking', '=', active_id), ('state', '=', 'success')] + + + + Quality inspections from picking failed + qc.inspection + tree,form + [('picking', '=', active_id), ('state', '=', 'failed')] + + + + stock.picking.qc.view + stock.picking + + +
+ + + + +
+
+
+ +
+
\ No newline at end of file diff --git a/quality_control_stock_oca/views/stock_production_lot_view.xml b/quality_control_stock_oca/views/stock_production_lot_view.xml new file mode 100644 index 000000000..6b55c5402 --- /dev/null +++ b/quality_control_stock_oca/views/stock_production_lot_view.xml @@ -0,0 +1,72 @@ + + + + + + Quality inspections from lot + qc.inspection + tree,form + [('lot', '=', active_id)] + + + + Quality inspection from lot done + qc.inspection + tree,form + [('lot', '=', active_id), ('state', 'not in', ['draft', 'waiting'])] + + + + Quality inspection from lot passed + qc.inspection + tree,form + [('lot', '=', active_id), ('state', '=', 'success')] + + + + Quality inspections from lot failed + qc.inspection + tree,form + [('lot', '=', active_id), ('state', '=', 'failed')] + + + + stock.production.lot.qc.view + stock.production.lot + + +
+
+ + + + +
+
+
+
+ +
+
\ No newline at end of file