From d648fd98c6ecaf640c0271b2a5e910ada5cee391 Mon Sep 17 00:00:00 2001 From: Stefano Consolaro Date: Sun, 16 Feb 2020 19:16:58 +0100 Subject: [PATCH] [ADD] new module quality_control_plan --- oca_dependencies.txt | 3 +- quality_control_plan/README.rst | 144 +++++ quality_control_plan/__init__.py | 4 + quality_control_plan/__manifest__.py | 35 ++ quality_control_plan/i18n/it.po | 263 +++++++++ .../i18n/quality_control_plan.pot | 262 +++++++++ quality_control_plan/models/__init__.py | 3 + .../mgmtsystem_nonconformity_inspection.py | 17 + .../models/partner_quality.py | 21 + .../models/product_trigger.py | 29 + .../models/qc_inspection_plan.py | 211 ++++++++ quality_control_plan/models/qc_plan.py | 86 +++ quality_control_plan/models/qc_trigger.py | 51 ++ .../models/qc_trigger_partner_line.py | 27 + .../models/stock_picking_inspection.py | 51 ++ quality_control_plan/readme/CONFIGURE.rst | 1 + quality_control_plan/readme/CONTRIBUTORS.rst | 2 + quality_control_plan/readme/DESCRIPTION.rst | 15 + quality_control_plan/readme/HISTORY.rst | 4 + quality_control_plan/readme/INSTALL.rst | 1 + quality_control_plan/readme/USAGE.rst | 34 ++ .../security/ir.model.access.csv | 7 + .../static/description/icon.png | Bin 0 -> 7674 bytes .../static/description/index.html | 512 ++++++++++++++++++ quality_control_plan/tests/__init__.py | 1 + quality_control_plan/tests/test_plan.py | 201 +++++++ .../views/mgmtsystem_nonconformity_view.xml | 20 + quality_control_plan/views/partner_view.xml | 30 + quality_control_plan/views/product_view.xml | 34 ++ .../views/qc_inspection_view.xml | 35 ++ quality_control_plan/views/qc_menu.xml | 40 ++ quality_control_plan/views/qc_plan_view.xml | 97 ++++ 32 files changed, 2240 insertions(+), 1 deletion(-) create mode 100644 quality_control_plan/README.rst create mode 100644 quality_control_plan/__init__.py create mode 100644 quality_control_plan/__manifest__.py create mode 100644 quality_control_plan/i18n/it.po create mode 100644 quality_control_plan/i18n/quality_control_plan.pot create mode 100644 quality_control_plan/models/__init__.py create mode 100644 quality_control_plan/models/mgmtsystem_nonconformity_inspection.py create mode 100644 quality_control_plan/models/partner_quality.py create mode 100644 quality_control_plan/models/product_trigger.py create mode 100644 quality_control_plan/models/qc_inspection_plan.py create mode 100644 quality_control_plan/models/qc_plan.py create mode 100644 quality_control_plan/models/qc_trigger.py create mode 100644 quality_control_plan/models/qc_trigger_partner_line.py create mode 100644 quality_control_plan/models/stock_picking_inspection.py create mode 100644 quality_control_plan/readme/CONFIGURE.rst create mode 100644 quality_control_plan/readme/CONTRIBUTORS.rst create mode 100644 quality_control_plan/readme/DESCRIPTION.rst create mode 100644 quality_control_plan/readme/HISTORY.rst create mode 100644 quality_control_plan/readme/INSTALL.rst create mode 100644 quality_control_plan/readme/USAGE.rst create mode 100644 quality_control_plan/security/ir.model.access.csv create mode 100644 quality_control_plan/static/description/icon.png create mode 100644 quality_control_plan/static/description/index.html create mode 100644 quality_control_plan/tests/__init__.py create mode 100644 quality_control_plan/tests/test_plan.py create mode 100644 quality_control_plan/views/mgmtsystem_nonconformity_view.xml create mode 100644 quality_control_plan/views/partner_view.xml create mode 100644 quality_control_plan/views/product_view.xml create mode 100644 quality_control_plan/views/qc_inspection_view.xml create mode 100644 quality_control_plan/views/qc_menu.xml create mode 100644 quality_control_plan/views/qc_plan_view.xml diff --git a/oca_dependencies.txt b/oca_dependencies.txt index aec8f1367..163e99506 100644 --- a/oca_dependencies.txt +++ b/oca_dependencies.txt @@ -2,4 +2,5 @@ # Add a repository url and branch if you need a forked version product-attribute purchase-workflow -stock-logistics-warehouse \ No newline at end of file +stock-logistics-warehouse +management-system \ No newline at end of file diff --git a/quality_control_plan/README.rst b/quality_control_plan/README.rst new file mode 100644 index 000000000..115b766d0 --- /dev/null +++ b/quality_control_plan/README.rst @@ -0,0 +1,144 @@ +============================== +Quality Control - Control Plan +============================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fmanufacture-lightgray.png?logo=github + :target: https://github.com/OCA/manufacture/tree/11.0/quality_control_plan + :alt: OCA/manufacture +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/manufacture-11-0/manufacture-11-0-quality_control_plan + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/129/11.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +These module manages the Control Plans for Quality Control, to define how many products to check on an inspection. + +It is possible to create a list of Control Plans with names and free pass flag. +Only one Plan a time can have the free pass flagged. + +For each Control Plan is possible to assign different levels of control each with +a minimum quantity, a value to check and the type of check value: the check +type can be an absolute number of pieces or a percentage. + +On Products, Product Category and Partner is possible to set a specific Control Plan. + +When Inspection is generated the Control Plan to use is selected trought Product-Partner, +Category-Partner, Product, Category, Partner. + +Creates a reference between Inspections and Nonconformities. + +**Table of contents** + +.. contents:: + :local: + +Installation +============ + +Istall with standar method + +Configuration +============= + +This module doesn't need configuration + +Usage +===== + +Steps to follow to use Control Plans: + +- create a list of Control Plans +- define levels of control for Control Pans + +**Control Plan** + * Go to Quality Control + * From Test menu select Control Plan + * Create a Control Plan with a name, description and eventually with Free Pass flag checked + +**Control Plan Levels** + +- Option A + * Go to Quality Control + * From Test menu select Control Plan + * Select a Control Plan + * Add rows with quantity level, value to check, type of value + +- Option B + * Go to Quality Control + * From Test menu select Control Plan Levels + * Create a new element selecting the Control Plan and filling other fields + +**Inspection → Nonconformity** + * Go to Qaulity Control + * From Inspection menu select Inspection + * Open or create an Inspection + * On tab Nonconformity add a new line, or click «Add Nonconformity» + +**Nonconformity → Inspection** + * Go to Management System + * From Management System menu select Nonconformity + * Open or create a Nonconformity + * On field Inspection select or create the relative Inspection + +Changelog +========= + +11.0.1.0.0 (2020-01-01) +~~~~~~~~~~~~~~~~~~~~~~~ + +* [INI] Initial development + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Associazione PNLUG - Gruppo Odoo + +Contributors +~~~~~~~~~~~~ + +* Marcelo Frare +* Stefano Consolaro + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +This module is part of the `OCA/manufacture `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/quality_control_plan/__init__.py b/quality_control_plan/__init__.py new file mode 100644 index 000000000..0792fc131 --- /dev/null +++ b/quality_control_plan/__init__.py @@ -0,0 +1,4 @@ + +from . import ( + models, +) diff --git a/quality_control_plan/__manifest__.py b/quality_control_plan/__manifest__.py new file mode 100644 index 000000000..b7c62fb7c --- /dev/null +++ b/quality_control_plan/__manifest__.py @@ -0,0 +1,35 @@ +# Copyright 2019 Marcelo Frare (Ass. PNLUG - Gruppo Odoo ) +# Copyright 2019 Stefano Consolaro (Ass. PNLUG - Gruppo Odoo ) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Quality Control - Control Plan", + "summary": "Control Plan for Inspection quantity definition.", + "version": "11.0.1.0.0", + + "author": "Associazione PNLUG - Gruppo Odoo, Odoo Community Association (OCA)", + "website": "https://gitlab.com/PNLUG/Odoo/management-system-improvements/tree/" + "11.0/quality_control_plan", + "license": "AGPL-3", + + "category": "Quality control", + + "depends": [ + 'stock', + 'product', + 'mgmtsystem', + 'mgmtsystem_nonconformity', + 'quality_control', + 'quality_control_stock', + ], + "data": [ + 'security/ir.model.access.csv', + 'views/qc_menu.xml', + 'views/qc_plan_view.xml', + 'views/qc_inspection_view.xml', + 'views/mgmtsystem_nonconformity_view.xml', + 'views/partner_view.xml', + 'views/product_view.xml', + ], + 'installable': True, +} diff --git a/quality_control_plan/i18n/it.po b/quality_control_plan/i18n/it.po new file mode 100644 index 000000000..5adb9dd0f --- /dev/null +++ b/quality_control_plan/i18n/it.po @@ -0,0 +1,263 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * quality_control_plan +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-04-08 20:35+0000\n" +"PO-Revision-Date: 2020-04-08 22:59+0200\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 2.3\n" +"Last-Translator: \n" +"Language: it\n" + +#. module: quality_control_plan +#: selection:qc.level,chk_type:0 +msgid "Absolute value" +msgstr "Valore assoluto" + +#. module: quality_control_plan +#: model:ir.ui.view,arch_db:quality_control_plan.qc_inspection_qty_checked +msgid "Add Nonconformity" +msgstr "Aggiungi non conformità" + +#. module: quality_control_plan +#: model:ir.model,name:quality_control_plan.model_res_partner +msgid "Contact" +msgstr "Contatto" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_inspection_plan_id +msgid "Control Plan" +msgstr "Piano di controllo" + +#. module: quality_control_plan +#: model:ir.actions.act_window,name:quality_control_plan.qc_level_action +#: model:ir.ui.menu,name:quality_control_plan.menu_qc_level +#: model:ir.ui.view,arch_db:quality_control_plan.view_form_plan +msgid "Control Plan Levels" +msgstr "Livelli piano di controllo" + +#. module: quality_control_plan +#: model:ir.actions.act_window,name:quality_control_plan.qc_plan_action +#: model:ir.ui.menu,name:quality_control_plan.menu_qc_plan +msgid "Control Plans" +msgstr "Piani di controllo" + +#. module: quality_control_plan +#: code:addons/quality_control_plan/models/qc_inspection_plan.py:193 +#, python-format +msgid "Create Nonconformity on not compliant Inspection" +msgstr "Crea una non conformità per una ispezione non conforme" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_create_uid +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_create_uid +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_partner_line_create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_create_date +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_create_date +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_partner_line_create_date +msgid "Created on" +msgstr "Creato il" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_description +msgid "Description" +msgstr "Descrizione" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_display_name +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_display_name +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_partner_line_display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_free_pass +msgid "Free pass" +msgstr "Fre pass" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_id +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_id +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_partner_line_id +msgid "ID" +msgstr "ID" + +#. module: quality_control_plan +#: model:ir.model.fields,help:quality_control_plan.field_qc_level_chk_type +msgid "Indicate how to use quantity checked value" +msgstr "Indica come considerare il valore della quantità da controllare" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_mgmtsystem_nonconformity_inspection_id +msgid "Inspection" +msgstr "Ispezione" + +#. module: quality_control_plan +#: code:addons/quality_control_plan/models/qc_inspection_plan.py:202 +#, python-format +msgid "Inspection not compliant" +msgstr "Ispezione non conforme" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level___last_update +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan___last_update +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_partner_line___last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_write_uid +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_write_uid +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_partner_line_write_uid +msgid "Last Updated by" +msgstr "Aggiornato da" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_write_date +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_write_date +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_partner_line_write_date +msgid "Last Updated on" +msgstr "Aggiornato il" + +#. module: quality_control_plan +#: model:ir.ui.view,arch_db:quality_control_plan.view_form_plan +msgid "Level lines" +msgstr "Linee livello" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_chk_type +msgid "Measure" +msgstr "Misura" + +#. module: quality_control_plan +#: model:ir.model.fields,help:quality_control_plan.field_qc_level_qty_received +msgid "Minimum received quantity reference" +msgstr "Riferimento minima quantità ricevuta" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_name +msgid "Name" +msgstr "Nome" + +#. module: quality_control_plan +#: model:ir.model,name:quality_control_plan.model_mgmtsystem_nonconformity +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_inspection_inspection_ids +#: model:ir.ui.view,arch_db:quality_control_plan.qc_inspection_qty_checked +msgid "Nonconformity" +msgstr "Non conformità" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_partner_line_partner +msgid "Partner" +msgstr "Fornitore" + +#. module: quality_control_plan +#: selection:qc.level,chk_type:0 +msgid "Percent" +msgstr "Percentuale" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_plan_id +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_plan_ids +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_partner_line_plan_id +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_product_category_line_plan_id +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_product_template_line_plan_id +#: model:ir.ui.view,arch_db:quality_control_plan.view_form_plan +msgid "Plan" +msgstr "Piano" + +#. module: quality_control_plan +#: model:ir.ui.view,arch_db:quality_control_plan.view_tree_plan +msgid "QC Plan" +msgstr "Piano QC" + +#. module: quality_control_plan +#: model:ir.ui.view,arch_db:quality_control_plan.view_form_level +#: model:ir.ui.view,arch_db:quality_control_plan.view_tree_level +msgid "QC level" +msgstr "Livello QC" + +#. module: quality_control_plan +#: model:ir.ui.view,arch_db:quality_control_plan.view_mgmtsystem_nonconformity_partner +msgid "Quality" +msgstr "Qualità" + +#. module: quality_control_plan +#: model:ir.model,name:quality_control_plan.model_qc_plan +msgid "Quality Control Plan" +msgstr "Piano controllo qualità" + +#. module: quality_control_plan +#: model:ir.model,name:quality_control_plan.model_qc_level +msgid "Quality Control Plan Levels" +msgstr "Livelli piano controllo qualità" + +#. module: quality_control_plan +#: model:ir.ui.view,arch_db:quality_control_plan.view_mgmtsystem_nonconformity_partner +msgid "Quality control" +msgstr "Controllo qualità" + +#. module: quality_control_plan +#: model:ir.model,name:quality_control_plan.model_qc_inspection +msgid "Quality control inspection" +msgstr "Ispezione controllo qualità" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_res_partner_qc_triggers +#: model:ir.model.fields,field_description:quality_control_plan.field_res_users_qc_triggers +#: model:ir.ui.view,arch_db:quality_control_plan.view_mgmtsystem_nonconformity_partner +msgid "Quality control triggers" +msgstr "Automatismi controllo qualità" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_inspection_qty_checked +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_qty_checked +msgid "Quantity checked" +msgstr "Quantità controllata" + +#. module: quality_control_plan +#: model:ir.model.fields,help:quality_control_plan.field_qc_level_qty_checked +msgid "Quantity to check if the received goods is higher than the reference" +msgstr "Quantità da controllare se la merce ricevuta è superiore al riferimento" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_qty_received +msgid "Quantity to inspect" +msgstr "Quantità da controllare" + +#. module: quality_control_plan +#: model:ir.ui.view,arch_db:quality_control_plan.qc_inspection_qty_checked +msgid "Total quantity" +msgstr "Quantità totale" + +#. module: quality_control_plan +#: model:ir.model,name:quality_control_plan.model_stock_picking +msgid "Transfer" +msgstr "Trasferimento" + +#. module: quality_control_plan +#: model:ir.model,name:quality_control_plan.model_qc_trigger_partner_line +msgid "qc.trigger.partner_line" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model,name:quality_control_plan.model_qc_trigger_product_category_line +msgid "qc.trigger.product_category_line" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model,name:quality_control_plan.model_qc_trigger_product_template_line +msgid "qc.trigger.product_template_line" +msgstr "" diff --git a/quality_control_plan/i18n/quality_control_plan.pot b/quality_control_plan/i18n/quality_control_plan.pot new file mode 100644 index 000000000..b87a46bbc --- /dev/null +++ b/quality_control_plan/i18n/quality_control_plan.pot @@ -0,0 +1,262 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * quality_control_plan +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2020-04-08 20:35+0000\n" +"PO-Revision-Date: 2020-04-08 20:35+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_plan +#: selection:qc.level,chk_type:0 +msgid "Absolute value" +msgstr "" + +#. module: quality_control_plan +#: model:ir.ui.view,arch_db:quality_control_plan.qc_inspection_qty_checked +msgid "Add Nonconformity" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model,name:quality_control_plan.model_res_partner +msgid "Contact" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_inspection_plan_id +msgid "Control Plan" +msgstr "" + +#. module: quality_control_plan +#: model:ir.actions.act_window,name:quality_control_plan.qc_level_action +#: model:ir.ui.menu,name:quality_control_plan.menu_qc_level +#: model:ir.ui.view,arch_db:quality_control_plan.view_form_plan +msgid "Control Plan Levels" +msgstr "" + +#. module: quality_control_plan +#: model:ir.actions.act_window,name:quality_control_plan.qc_plan_action +#: model:ir.ui.menu,name:quality_control_plan.menu_qc_plan +msgid "Control Plans" +msgstr "" + +#. module: quality_control_plan +#: code:addons/quality_control_plan/models/qc_inspection_plan.py:193 +#, python-format +msgid "Create Nonconformity on not compliant Inspection" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_create_uid +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_create_uid +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_partner_line_create_uid +msgid "Created by" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_create_date +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_create_date +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_partner_line_create_date +msgid "Created on" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_description +msgid "Description" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_display_name +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_display_name +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_partner_line_display_name +msgid "Display Name" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_free_pass +msgid "Free pass" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_id +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_id +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_partner_line_id +msgid "ID" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,help:quality_control_plan.field_qc_level_chk_type +msgid "Indicate how to use quantity checked value" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_mgmtsystem_nonconformity_inspection_id +msgid "Inspection" +msgstr "" + +#. module: quality_control_plan +#: code:addons/quality_control_plan/models/qc_inspection_plan.py:202 +#, python-format +msgid "Inspection not compliant" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level___last_update +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan___last_update +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_partner_line___last_update +msgid "Last Modified on" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_write_uid +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_write_uid +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_partner_line_write_uid +msgid "Last Updated by" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_write_date +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_write_date +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_partner_line_write_date +msgid "Last Updated on" +msgstr "" + +#. module: quality_control_plan +#: model:ir.ui.view,arch_db:quality_control_plan.view_form_plan +msgid "Level lines" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_chk_type +msgid "Measure" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,help:quality_control_plan.field_qc_level_qty_received +msgid "Minimum received quantity reference" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_name +msgid "Name" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model,name:quality_control_plan.model_mgmtsystem_nonconformity +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_inspection_inspection_ids +#: model:ir.ui.view,arch_db:quality_control_plan.qc_inspection_qty_checked +msgid "Nonconformity" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_partner_line_partner +msgid "Partner" +msgstr "" + +#. module: quality_control_plan +#: selection:qc.level,chk_type:0 +msgid "Percent" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_plan_id +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_plan_plan_ids +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_partner_line_plan_id +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_product_category_line_plan_id +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_trigger_product_template_line_plan_id +#: model:ir.ui.view,arch_db:quality_control_plan.view_form_plan +msgid "Plan" +msgstr "" + +#. module: quality_control_plan +#: model:ir.ui.view,arch_db:quality_control_plan.view_tree_plan +msgid "QC Plan" +msgstr "" + +#. module: quality_control_plan +#: model:ir.ui.view,arch_db:quality_control_plan.view_form_level +#: model:ir.ui.view,arch_db:quality_control_plan.view_tree_level +msgid "QC level" +msgstr "" + +#. module: quality_control_plan +#: model:ir.ui.view,arch_db:quality_control_plan.view_mgmtsystem_nonconformity_partner +msgid "Quality" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model,name:quality_control_plan.model_qc_plan +msgid "Quality Control Plan" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model,name:quality_control_plan.model_qc_level +msgid "Quality Control Plan Levels" +msgstr "" + +#. module: quality_control_plan +#: model:ir.ui.view,arch_db:quality_control_plan.view_mgmtsystem_nonconformity_partner +msgid "Quality control" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model,name:quality_control_plan.model_qc_inspection +msgid "Quality control inspection" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_res_partner_qc_triggers +#: model:ir.model.fields,field_description:quality_control_plan.field_res_users_qc_triggers +#: model:ir.ui.view,arch_db:quality_control_plan.view_mgmtsystem_nonconformity_partner +msgid "Quality control triggers" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_inspection_qty_checked +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_qty_checked +msgid "Quantity checked" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,help:quality_control_plan.field_qc_level_qty_checked +msgid "Quantity to check if the received goods is higher than the reference" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model.fields,field_description:quality_control_plan.field_qc_level_qty_received +msgid "Quantity to inspect" +msgstr "" + +#. module: quality_control_plan +#: model:ir.ui.view,arch_db:quality_control_plan.qc_inspection_qty_checked +msgid "Total quantity" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model,name:quality_control_plan.model_stock_picking +msgid "Transfer" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model,name:quality_control_plan.model_qc_trigger_partner_line +msgid "qc.trigger.partner_line" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model,name:quality_control_plan.model_qc_trigger_product_category_line +msgid "qc.trigger.product_category_line" +msgstr "" + +#. module: quality_control_plan +#: model:ir.model,name:quality_control_plan.model_qc_trigger_product_template_line +msgid "qc.trigger.product_template_line" +msgstr "" + diff --git a/quality_control_plan/models/__init__.py b/quality_control_plan/models/__init__.py new file mode 100644 index 000000000..b74fb1e4c --- /dev/null +++ b/quality_control_plan/models/__init__.py @@ -0,0 +1,3 @@ + +from . import mgmtsystem_nonconformity_inspection, partner_quality, \ + qc_inspection_plan, qc_plan, qc_trigger, stock_picking_inspection diff --git a/quality_control_plan/models/mgmtsystem_nonconformity_inspection.py b/quality_control_plan/models/mgmtsystem_nonconformity_inspection.py new file mode 100644 index 000000000..34481f280 --- /dev/null +++ b/quality_control_plan/models/mgmtsystem_nonconformity_inspection.py @@ -0,0 +1,17 @@ +# Copyright 2019 Marcelo Frare (Ass. PNLUG - Gruppo Odoo ) +# Copyright 2019 Stefano Consolaro (Ass. PNLUG - Gruppo Odoo ) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class MgmtsystemMgmInspection(models.Model): + """ + Extends nonconformity adding related inspection + """ + + _inherit = ['mgmtsystem.nonconformity'] + + # new field + # inspection reference + inspection_id = fields.Many2one('qc.inspection', 'Inspection') diff --git a/quality_control_plan/models/partner_quality.py b/quality_control_plan/models/partner_quality.py new file mode 100644 index 000000000..1bfe7635a --- /dev/null +++ b/quality_control_plan/models/partner_quality.py @@ -0,0 +1,21 @@ +# Copyright 2019 Marcelo Frare (Ass. PNLUG - Gruppo Odoo ) +# Copyright 2019 Stefano Consolaro (Ass. PNLUG - Gruppo Odoo ) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class MgmtsystemMgmPartner(models.Model): + """ + Extends partner with quality control triggers + """ + + _inherit = ['res.partner'] + + # new fields + # trigger to activate inspection + qc_triggers = fields.One2many( + comodel_name="qc.trigger.partner_line", + inverse_name="partner", + string="Quality control triggers" + ) diff --git a/quality_control_plan/models/product_trigger.py b/quality_control_plan/models/product_trigger.py new file mode 100644 index 000000000..167172277 --- /dev/null +++ b/quality_control_plan/models/product_trigger.py @@ -0,0 +1,29 @@ +# Copyright 2019 Marcelo Frare (Ass. PNLUG - Gruppo Odoo ) +# Copyright 2019 Stefano Consolaro (Ass. PNLUG - Gruppo Odoo ) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class QcProduct(models.Model): + """ + Extends product model with a field to store quality control plan assigned + """ + + _inherit = ['qc.trigger.product_template_line'] + + # new filed + # product's control plan + plan_id = fields.Many2one('qc.plan', 'Plan') + + +class QcCategory(models.Model): + """ + Extends product category model with a field to store quality control plan assigned + """ + + _inherit = ['qc.trigger.product_category_line'] + + # new filed + # sets product category's control plan + plan_id = fields.Many2one('qc.plan', 'Plan') diff --git a/quality_control_plan/models/qc_inspection_plan.py b/quality_control_plan/models/qc_inspection_plan.py new file mode 100644 index 000000000..cadc76b10 --- /dev/null +++ b/quality_control_plan/models/qc_inspection_plan.py @@ -0,0 +1,211 @@ +# Copyright 2019 Marcelo Frare (Ass. PNLUG - Gruppo Odoo ) +# Copyright 2019 Stefano Consolaro (Ass. PNLUG - Gruppo Odoo ) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models, api, _ + + +class QcInspection(models.Model): + """ + Extends inspection with: + - plan control + - nonconformity relations + - method to fill inspection with control plan data + - method create nonconformity from inspection + """ + + _inherit = ['qc.inspection'] + + # new fields + # the control plan to be used + plan_id = fields.Many2one('qc.plan', 'Control Plan') + # quantity to be checked + qty_checked = fields.Float('Quantity checked') + # nonconformity reference + inspection_ids = fields.One2many('mgmtsystem.nonconformity', + 'inspection_id', + 'Nonconformity' + ) + + @api.model + def create(self, values): + """ + Extends inspection method by integrating logic to determine the control plan + to be used and the calculation of the quantity to be checked + """ + + # calls original method + new_record = super(QcInspection, self).create(values) + + # gets product of the inspection + product_id = new_record.product_id + + # gets partner from picking if exists + if new_record.picking_id: + partner_id = self.env['stock.picking' + ].search([('id', '=', new_record.picking_id.id)], + limit=1 + ).partner_id.id + else: + partner_id = False + + # temporary presetted solutions + solution_art_prt = '' # plan for product (article) and partner + solution_cat_prt = '' # plan for product category and partner + solution_art = '' # plan for product (article) + solution_cat = '' # plan for product category + solution_prt = '' # plan for partner + + # tries to get plan for product and partner + solution_art_prt = self.env['qc.trigger.product_template_line' + ].search([('product_template', + '=', + product_id.product_tmpl_id.id), + ('partners', '!=', False), + ('partners', '=', partner_id) + ], + limit=1 + ) + + if (len(solution_art_prt) + == 0): + # tries to gets plan for category and partner + solution_cat_prt = self.env['qc.trigger.product_category_line' + ].search([('product_category', + '=', + product_id.categ_id.id), + ('partners', '!=', False), + ('partners', '=', partner_id) + ], + limit=1 + ) + + if (len(solution_art_prt) + + len(solution_cat_prt) + == 0): + # tries to get plan for product + solution_art = self.env['qc.trigger.product_template_line' + ].search([('product_template', + '=', + product_id.product_tmpl_id.id + ), + ('partners', '=', False) + ], + limit=1 + ) + + if (len(solution_art_prt) + + len(solution_cat_prt) + + len(solution_art) + == 0): + # tries to get plan for category + solution_cat = self.env['qc.trigger.product_category_line' + ].search([('product_category', + '=', + product_id.categ_id.id + ), + ('partners', '=', False) + ], + limit=1 + ) + + if (len(solution_art_prt) + + len(solution_cat_prt) + + len(solution_art) + + len(solution_cat) + == 0): + # tries to get plan for partner + solution_prt = self.env['qc.trigger.partner_line' + ].search([('partner', '=', partner_id) + ], + limit=1 + ) + + # gets the plan from the first positive try + if len(solution_art_prt): + plan_id = solution_art_prt.plan_id + elif len(solution_cat_prt): + plan_id = solution_cat_prt.plan_id + elif len(solution_art): + plan_id = solution_art.plan_id + elif len(solution_cat): + plan_id = solution_cat.plan_id + elif len(solution_prt): + plan_id = solution_prt.plan_id + else: + new_record.qty_checked = '1' + new_record.plan_id = '' + return new_record + + if plan_id: + # assigns plan to be used + new_record.plan_id = plan_id + + if new_record.plan_id.free_pass: + # for free pass doesn't check product + new_record.qty_checked = 0 + + else: + # gets check informations from levels + qty_related = self.env['qc.level' + ].search([('plan_id', '=', plan_id.id), + ('qty_received', '<', new_record.qty) + ], + limit=1, + order='qty_received desc' + ) + # assigns qty to check + if qty_related: + if qty_related.chk_type == 'percent': + # as percent of qty to check + new_record.qty_checked = int(new_record.qty + * qty_related.qty_checked + / 100 + ) + else: + # as absolute value + new_record.qty_checked = qty_related.qty_checked + + # verifies if enough pcs to check + if new_record.qty_checked > new_record.qty: + new_record.qty_checked = new_record.qty + + # checks and fix absolute minimum value lower to 1 + if new_record.qty_checked < 1: + new_record.qty_checked = 1 + + return new_record + + @api.multi + def create_nonconformity(self, **kwargs): + """ + Opens nonconformity form view prefilled with inspection data + """ + + # gets partner if exists + if self.picking_id.partner_id.id: + partner = self.picking_id.partner_id.id + else: + partner = False + + tmp_form_name = "mgmtsystem_nonconformity.view_mgmtsystem_nonconformity_form" + return { + # opens nonconformity form view + 'name' : _('Create Nonconformity on not compliant Inspection'), + 'view_type' : 'form', + 'view_mode' : 'form', + 'res_model' : 'mgmtsystem.nonconformity', + 'view_id' : self.env.ref(tmp_form_name).id, + 'type' : 'ir.actions.act_window', + + # fills fields with inspection data + 'context': { + 'default_name' : _('Inspection not compliant'), + 'default_product_id' : self.product_id.id, + 'default_partner_id' : partner, + 'default_qty_checked' : self.qty_checked, + 'default_inspection_id' : self.id + }, + + 'target': 'new' + } diff --git a/quality_control_plan/models/qc_plan.py b/quality_control_plan/models/qc_plan.py new file mode 100644 index 000000000..3c995385f --- /dev/null +++ b/quality_control_plan/models/qc_plan.py @@ -0,0 +1,86 @@ +# Copyright 2019 Marcelo Frare (Ass. PNLUG - Gruppo Odoo ) +# Copyright 2019 Stefano Consolaro (Ass. PNLUG - Gruppo Odoo ) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models, api, _ +from odoo.exceptions import ValidationError + + +class QcPlan(models.Model): + """ + Manages quality control plans + """ + + # model + _name = 'qc.plan' + _description = 'Quality Control Plan' + + _inherit = ['mail.thread'] + + # fields + # alphanumeric identification code + name = fields.Char('Name', required=True) + # description of plan calculation + description = fields.Char('Description') + # free pass option + free_pass = fields.Boolean('Free pass') + # control levels of the plan + plan_ids = fields.One2many('qc.level', 'plan_id', 'Plan') + + @api.onchange('free_pass') + def on_change_free_pass(self): + """ + Checks if there is only one free pass plan + Sets the last changed to false if another one exists + """ + + if self.free_pass: + free_p = self.env['qc.plan'].search([('free_pass', '=', True)])[0] + if free_p: + self.free_pass = False + raise ValidationError(_("A free pass plan already exists: %s.") + % free_p.name) + + @api.model + def create(self, vals): + """ + Avoids multiple free pass plans + """ + if vals['free_pass']: + if self.env['qc.plan'].search([('free_pass', '=', True)]): + return False + return super(QcPlan, self).create(vals) + + +class QcLevel(models.Model): + """ + Manages the lelevs for a control plan + """ + + # model + _name = 'qc.level' + _description = 'Quality Control Plan Levels' + + # fields + # plan reference + plan_id = fields.Many2one('qc.plan', 'Plan', required=True) + # minimum ingoing quantity + qty_received = fields.Float('Quantity to inspect', + help='Minimum received quantity reference' + ) + # quantity value to check + qty_checked = fields.Float( + 'Quantity checked', + help='Quantity to check if the received goods is higher than the reference' + ) + # chek value type: absolute or percent of ingoing quantity + chk_type = fields.Selection([('absolute', 'Absolute value'), + ('percent', 'Percent'), + ], + 'Measure', + default='absolute', + help='Indicate how to use quantity checked value' + ) + + # defines record name to display in form view + _rec_name = 'id' diff --git a/quality_control_plan/models/qc_trigger.py b/quality_control_plan/models/qc_trigger.py new file mode 100644 index 000000000..0531952b2 --- /dev/null +++ b/quality_control_plan/models/qc_trigger.py @@ -0,0 +1,51 @@ +# Copyright 2010 NaN Projectes de Programari Lliure, S.L. +# Copyright 2014 Serv. Tec. Avanzados - Pedro M. Baeza +# Copyright 2014 Oihane Crucelaegui - AvanzOSC +# Copyright 2017 Eficent Business and IT Consulting Services S.L. +# Copyright 2017 Simone Rubino - Agile Business Group +# Copyright 2019 Marcelo Frare (Ass. PNLUG - Gruppo Odoo ) +# Copyright 2019 Stefano Consolaro (Ass. PNLUG - Gruppo Odoo ) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class QcTriggerPartnerLine(models.Model): + """ + Extends quality trigger with partner control plan + """ + + _inherit = "qc.trigger.line" + + # model + _name = "qc.trigger.partner_line" + + # new fields + # reference partner + partner = fields.Many2one(comodel_name="res.partner") + # control plan to use + plan_id = fields.Many2one('qc.plan', 'Plan', required=True) + + +class QcTriggerProductLine(models.Model): + """ + Extends product model with a field to store quality control plan assigned + """ + + _inherit = ['qc.trigger.product_template_line'] + + # new filed + # product's control plan + plan_id = fields.Many2one('qc.plan', 'Plan') + + +class QcTriggerCategoryLine(models.Model): + """ + Extends product category model with a field to store quality control plan assigned + """ + + _inherit = ['qc.trigger.product_category_line'] + + # new filed + # sets product category's control plan + plan_id = fields.Many2one('qc.plan', 'Plan') diff --git a/quality_control_plan/models/qc_trigger_partner_line.py b/quality_control_plan/models/qc_trigger_partner_line.py new file mode 100644 index 000000000..da2d1b1b4 --- /dev/null +++ b/quality_control_plan/models/qc_trigger_partner_line.py @@ -0,0 +1,27 @@ +# Copyright 2010 NaN Projectes de Programari Lliure, S.L. +# Copyright 2014 Serv. Tec. Avanzados - Pedro M. Baeza +# Copyright 2014 Oihane Crucelaegui - AvanzOSC +# Copyright 2017 Eficent Business and IT Consulting Services S.L. +# Copyright 2017 Simone Rubino - Agile Business Group +# Copyright 2019 Marcelo Frare (Ass. PNLUG - Gruppo Odoo ) +# Copyright 2019 Stefano Consolaro (Ass. PNLUG - Gruppo Odoo ) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class QcTriggerPartnerLine(models.Model): + """ + Extend quality trigger with partner control plan + """ + + _inherit = "qc.trigger.line" + + # model + _name = "qc.trigger.partner_line" + + # new fields + # reference partner + partner = fields.Many2one(comodel_name="res.partner") + # control plan to use + plan_id = fields.Many2one('qc.plan', 'Plan', required=True) diff --git a/quality_control_plan/models/stock_picking_inspection.py b/quality_control_plan/models/stock_picking_inspection.py new file mode 100644 index 000000000..ca6e84cda --- /dev/null +++ b/quality_control_plan/models/stock_picking_inspection.py @@ -0,0 +1,51 @@ +# Copyright 2019 Marcelo Frare (Ass. PNLUG - Gruppo Odoo ) +# Copyright 2019 Stefano Consolaro (Ass. PNLUG - Gruppo Odoo ) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import models, api + + +class StockPicking(models.Model): + """ + Extend picking method + """ + + _inherit = 'stock.picking' + + @api.multi + def action_done(self): + """ + Extend actions on done stock move adding inspection defined on Partner + """ + + # does original action and memorize result + result = super(StockPicking, self).action_done() + + # gets model of the inspection + inspection_model = self.env['qc.inspection'] + + # for each line moved + for operation in self.move_lines: + # gets quality trigger associate to movement type + qc_trigger = self.env['qc.trigger' + ].search([('picking_type_id', + '=', + self.picking_type_id.id) + ]) + + # gets partner associate to movement + partner = (self.partner_id) + + # gets trigger for movement type on partner + trigger_line = self.env['qc.trigger.partner_line' + ].search([('partner', '=', partner.id), + ('trigger', '=', qc_trigger.id) + ], + limit=1 + ) + + # adds new ispection + if trigger_line: + inspection_model._make_inspection(operation, trigger_line) + + return result diff --git a/quality_control_plan/readme/CONFIGURE.rst b/quality_control_plan/readme/CONFIGURE.rst new file mode 100644 index 000000000..f2ecb9433 --- /dev/null +++ b/quality_control_plan/readme/CONFIGURE.rst @@ -0,0 +1 @@ +This module doesn't need configuration diff --git a/quality_control_plan/readme/CONTRIBUTORS.rst b/quality_control_plan/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..1434d6da1 --- /dev/null +++ b/quality_control_plan/readme/CONTRIBUTORS.rst @@ -0,0 +1,2 @@ +* Marcelo Frare +* Stefano Consolaro diff --git a/quality_control_plan/readme/DESCRIPTION.rst b/quality_control_plan/readme/DESCRIPTION.rst new file mode 100644 index 000000000..5274bacd7 --- /dev/null +++ b/quality_control_plan/readme/DESCRIPTION.rst @@ -0,0 +1,15 @@ +These module manages the Control Plans for Quality Control, to define how many products to check on an inspection. + +It is possible to create a list of Control Plans with names and free pass flag. +Only one Plan a time can have the free pass flagged. + +For each Control Plan is possible to assign different levels of control each with +a minimum quantity, a value to check and the type of check value: the check +type can be an absolute number of pieces or a percentage. + +On Products, Product Category and Partner is possible to set a specific Control Plan. + +When Inspection is generated the Control Plan to use is selected trought Product-Partner, +Category-Partner, Product, Category, Partner. + +Creates a reference between Inspections and Nonconformities. diff --git a/quality_control_plan/readme/HISTORY.rst b/quality_control_plan/readme/HISTORY.rst new file mode 100644 index 000000000..ec1cc4e3b --- /dev/null +++ b/quality_control_plan/readme/HISTORY.rst @@ -0,0 +1,4 @@ +11.0.1.0.0 (2020-01-01) +~~~~~~~~~~~~~~~~~~~~~~~ + +* [INI] Initial development diff --git a/quality_control_plan/readme/INSTALL.rst b/quality_control_plan/readme/INSTALL.rst new file mode 100644 index 000000000..65fa48f60 --- /dev/null +++ b/quality_control_plan/readme/INSTALL.rst @@ -0,0 +1 @@ +Istall with standar method diff --git a/quality_control_plan/readme/USAGE.rst b/quality_control_plan/readme/USAGE.rst new file mode 100644 index 000000000..56e87eaf4 --- /dev/null +++ b/quality_control_plan/readme/USAGE.rst @@ -0,0 +1,34 @@ +Steps to follow to use Control Plans: + +- create a list of Control Plans +- define levels of control for Control Pans + +**Control Plan** + * Go to Quality Control + * From Test menu select Control Plan + * Create a Control Plan with a name, description and eventually with Free Pass flag checked + +**Control Plan Levels** + +- Option A + * Go to Quality Control + * From Test menu select Control Plan + * Select a Control Plan + * Add rows with quantity level, value to check, type of value + +- Option B + * Go to Quality Control + * From Test menu select Control Plan Levels + * Create a new element selecting the Control Plan and filling other fields + +**Inspection → Nonconformity** + * Go to Qaulity Control + * From Inspection menu select Inspection + * Open or create an Inspection + * On tab Nonconformity add a new line, or click «Add Nonconformity» + +**Nonconformity → Inspection** + * Go to Management System + * From Management System menu select Nonconformity + * Open or create a Nonconformity + * On field Inspection select or create the relative Inspection diff --git a/quality_control_plan/security/ir.model.access.csv b/quality_control_plan/security/ir.model.access.csv new file mode 100644 index 000000000..aab3dffce --- /dev/null +++ b/quality_control_plan/security/ir.model.access.csv @@ -0,0 +1,7 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_qc_level_manager,access_qc_level_manager,model_qc_level,quality_control.group_quality_control_manager,1,1,1,1 +access_qc_level_user,access_qc_level_user,model_qc_level,quality_control.group_quality_control_user,1,0,0,0 +access_qc_plan_manager,access_qc_plan_manager,model_qc_plan,quality_control.group_quality_control_manager,1,1,1,1 +access_qc_plan_user,access_qc_plan_user,model_qc_plan,quality_control.group_quality_control_user,1,0,0,0 +access_qc_trigger_partner_line_manager,access_qc_trigger_partner_line_manager,model_qc_trigger_partner_line,quality_control.group_quality_control_manager,1,1,1,1 +access_qc_trigger_partner_line_user,access_qc_trigger_partner_line_user,model_qc_trigger_partner_line,quality_control.group_quality_control_user,1,0,0,0 diff --git a/quality_control_plan/static/description/icon.png b/quality_control_plan/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f42c5e4e5b91c6a40abf1bc80722ce6714e4ae2b GIT binary patch literal 7674 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 + + + + + +Quality Control - Control Plan + + + +
+

Quality Control - Control Plan

+ + +

Beta License: AGPL-3 OCA/manufacture Translate me on Weblate Try me on Runbot

+

These module manages the Control Plans for Quality Control, to define how many products to check on an inspection.

+

It is possible to create a list of Control Plans with names and free pass flag. +Only one Plan a time can have the free pass flagged.

+

For each Control Plan is possible to assign different levels of control each with +a minimum quantity, a value to check and the type of check value: the check +type can be an absolute number of pieces or a percentage.

+

On Products, Product Category and Partner is possible to set a specific Control Plan.

+

When Inspection is generated the Control Plan to use is selected trought Product-Partner, +Category-Partner, Product, Category, Partner.

+

Creates a reference between Inspections and Nonconformities.

+

Table of contents

+ +
+

Installation

+

Istall with standar method

+
+
+

Configuration

+

This module doesn’t need configuration

+
+
+

Usage

+

Steps to follow to use Control Plans:

+
    +
  • create a list of Control Plans
  • +
  • define levels of control for Control Pans
  • +
+
+
Control Plan
+
    +
  • Go to Quality Control
  • +
  • From Test menu select Control Plan
  • +
  • Create a Control Plan with a name, description and eventually with Free Pass flag checked
  • +
+
+
+

Control Plan Levels

+
    +
  • +
    Option A
    +
      +
    • Go to Quality Control
    • +
    • From Test menu select Control Plan
    • +
    • Select a Control Plan
    • +
    • Add rows with quantity level, value to check, type of value
    • +
    +
    +
    +
  • +
  • +
    Option B
    +
      +
    • Go to Quality Control
    • +
    • From Test menu select Control Plan Levels
    • +
    • Create a new element selecting the Control Plan and filling other fields
    • +
    +
    +
    +
  • +
+
+
Inspection → Nonconformity
+
    +
  • Go to Qaulity Control
  • +
  • From Inspection menu select Inspection
  • +
  • Open or create an Inspection
  • +
  • On tab Nonconformity add a new line, or click «Add Nonconformity»
  • +
+
+
Nonconformity → Inspection
+
    +
  • Go to Management System
  • +
  • From Management System menu select Nonconformity
  • +
  • Open or create a Nonconformity
  • +
  • On field Inspection select or create the relative Inspection
  • +
+
+
+
+
+

Changelog

+
+

11.0.1.0.0 (2020-01-01)

+
    +
  • [INI] Initial development
  • +
+
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Associazione PNLUG - Gruppo Odoo
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

This module is part of the OCA/manufacture project on GitHub.

+

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

+
+
+
+ + diff --git a/quality_control_plan/tests/__init__.py b/quality_control_plan/tests/__init__.py new file mode 100644 index 000000000..68859b0b7 --- /dev/null +++ b/quality_control_plan/tests/__init__.py @@ -0,0 +1 @@ +from . import test_plan \ No newline at end of file diff --git a/quality_control_plan/tests/test_plan.py b/quality_control_plan/tests/test_plan.py new file mode 100644 index 000000000..ca3a20756 --- /dev/null +++ b/quality_control_plan/tests/test_plan.py @@ -0,0 +1,201 @@ +from odoo.tests.common import TransactionCase +from odoo.exceptions import ValidationError + + +class TestQualityControl(TransactionCase): + + def setUp(self): + """ + Sets some enviroment + """ + super(TestQualityControl, self).setUp() + + self.plan_model = self.env['qc.plan'] + self.level_model = self.env['qc.level'] + self.inspection_model = self.env['qc.inspection'] + self.category_model = self.env['product.category'] + self.Trigger_product_model = self.env['qc.trigger.product_template_line'] + self.Trigger_category_model = self.env['qc.trigger.product_category_line'] + self.Trigger_partner_model = self.env['qc.trigger.partner_line'] + self.Partner_model = self.env['res.partner'] + + self.qc_trigger = self.env['qc.trigger'].create({ + 'name': 'Test Trigger', + 'active': True, + }) + self.test = self.env.ref('quality_control.qc_test_1') + self.product = self.env.ref('product.product_product_10') + self.product1 = self.env.ref('product.product_product_11') + self.product2 = self.env.ref('product.product_product_12') + self.product3 = self.env.ref('product.product_product_13') + self.category = self.category_model.create({'name': 'Plan test Category'}) + self.product1.categ_id = self.category.id + + def test_plan(self): + """ + Test Plan + """ + # creating plan + plan1 = self.plan_model.create({'name': 'Test', 'free_pass': False}) + self.assertEqual(plan1.id > 0, True) + self.assertEqual(plan1.name == 'Test', True) + self.assertEqual(plan1.free_pass is False, True) + # assigning a level to the plan + level = self.level_model.create({'plan_id': plan1.id, + 'qty_received': 10, + 'qty_checked': 3, + 'chk_type': 'percent'}) + self.assertEqual(level.plan_id.id == plan1.id, True) + + # adding second free pass plan + plan2 = self.plan_model.create({'name': 'Test2', 'free_pass': True}) + if plan2: + plan3 = self.plan_model.create({'name': 'Test3', 'free_pass': True}) + self.assertEqual(plan3, False) + + # setting another plan as free pass + plan3 = self.plan_model.create({'name': 'Test3', 'free_pass': False}) + plan3.free_pass = True + with self.assertRaises(ValidationError) as ve: + plan3.on_change_free_pass() + self.assertIn('A free pass plan already exists', str(ve.exception)) + + # create a the plan + plan2.free_pass = False + self.level_model.create({'plan_id': plan2.id, + 'qty_received': 10, + 'qty_checked': 7, + 'chk_type': 'absolute'}) + + partner = self.Partner_model.create({'name': 'Plan test Partner'}) + + # creating quality triggers + trigger_product = self.Trigger_product_model.create({ + 'product_template': self.product.product_tmpl_id.id, + 'trigger': self.qc_trigger.id, + 'test': self.test.id, + 'plan_id': plan1.id}) + + trigger_product_partner = self.Trigger_product_model.create({ + 'product_template': self.product.product_tmpl_id.id, + 'trigger': self.qc_trigger.id, + 'test': self.test.id, + 'plan_id': plan2.id}) + trigger_product_partner.partners = partner + + trigger_category = self.Trigger_category_model.create({ + 'product_category': self.category.id, + 'trigger': self.qc_trigger.id, + 'test': self.test.id, + 'plan_id': plan1.id}) + + trigger_category_partner = self.Trigger_category_model.create({ + 'product_category': self.category.id, + 'trigger': self.qc_trigger.id, + 'test': self.test.id, + 'plan_id': plan1.id}) + trigger_category_partner.partners = partner + + trigger_partner = self.Trigger_partner_model.create({ + 'trigger': self.qc_trigger.id, + 'test': self.test.id, + 'plan_id': plan1.id}) + trigger_partner.partner = partner + + self.assertEqual(trigger_product.id > 0, True) + self.assertEqual(trigger_product_partner.id > 0, True) + self.assertEqual(trigger_category.id > 0, True) + self.assertEqual(trigger_category_partner.id > 0, True) + self.assertEqual(trigger_partner.id > 0, True) + + # creates inspection for product + # get a move and a picking + get_move = self.env['stock.move'].search([])[0] + get_picking = self.env['stock.picking'].search([])[0] + # tests picking inherit + picking_ck = get_picking.action_done() + self.assertEqual(picking_ck, True) + + # creates inspection for free pass + # adapt move's attributes with used data + get_move.product_id = self.product.id + obj_id = 'stock.move,' + str(get_move.id) + plan1.free_pass = True + self.inspection2 = self.inspection_model.create({ + 'object_id': obj_id, + 'state': 'ready', + 'test': 1, + 'user': 1, + 'auto_generated': True, + 'qty': 300.0 + }) + self.assertEqual(self.inspection2.qty_checked == 0, True) + + # creates inspection for product + plan1.free_pass = False + self.inspection2 = self.inspection_model.create({ + 'object_id': obj_id, + 'state': 'ready', + 'test': 1, + 'user': 1, + 'auto_generated': True, + 'qty': 300.0 + }) + self.assertEqual(self.inspection2.qty_checked == 9, True) + + # creates inspection for product partner + get_move.picking_id = get_picking.id + get_picking.partner_id = partner + self.inspection2 = self.inspection_model.create({ + 'object_id': obj_id, + 'state': 'ready', + 'test': 1, + 'user': 1, + 'auto_generated': True, + 'qty': 300.0 + }) + self.assertEqual(self.inspection2.qty_checked == 7, True) + + # creates inspection for category + get_move.product_id = self.product1.id + get_move.picking_id = False + self.product.category = self.category.id + self.inspection2 = self.inspection_model.create({ + 'object_id': obj_id, + 'state': 'ready', + 'test': 1, + 'user': 1, + 'auto_generated': True, + 'qty': 150.0 + }) + self.assertEqual(self.inspection2.qty_checked == 4, True) + + # creates inspection for partner + # get a move from db + get_move.product_id = self.product2.id + get_move.picking_id = get_picking.id + get_picking.partner_id = partner + self.inspection2 = self.inspection_model.create({ + 'object_id': obj_id, + 'state': 'ready', + 'test': 1, + 'user': 1, + 'auto_generated': True, + 'qty': 400.0 + }) + self.assertEqual(self.inspection2.qty_checked == 12, True) + + # create inspection without plan + partner2 = self.Partner_model.create({'name': 'Plan test Partner2'}) + get_move.product_id = self.product3.id + get_move.picking_id = get_picking.id + get_picking.partner_id = partner2 + self.inspection2 = self.inspection_model.create({ + 'object_id': obj_id, + 'state': 'ready', + 'test': 1, + 'user': 1, + 'auto_generated': True, + 'qty': 400.0 + }) + self.assertEqual(self.inspection2.qty_checked == 1, True) diff --git a/quality_control_plan/views/mgmtsystem_nonconformity_view.xml b/quality_control_plan/views/mgmtsystem_nonconformity_view.xml new file mode 100644 index 000000000..e752f263a --- /dev/null +++ b/quality_control_plan/views/mgmtsystem_nonconformity_view.xml @@ -0,0 +1,20 @@ + + + + + + + + view.mgmtsystem.nonconformity.inspection + mgmtsystem.nonconformity + + + + + + + + diff --git a/quality_control_plan/views/partner_view.xml b/quality_control_plan/views/partner_view.xml new file mode 100644 index 000000000..c1c421eb6 --- /dev/null +++ b/quality_control_plan/views/partner_view.xml @@ -0,0 +1,30 @@ + + + + + + + + view.mgmtsystem.nonconformity.partner + res.partner + + + + + + + + + + + + + + + + + + + diff --git a/quality_control_plan/views/product_view.xml b/quality_control_plan/views/product_view.xml new file mode 100644 index 000000000..01cb97c8f --- /dev/null +++ b/quality_control_plan/views/product_view.xml @@ -0,0 +1,34 @@ + + + + + + + + view.product.template.plan + product.template + + + + + + + + + + + view.product.category.plan + product.category + + + + + + + + + diff --git a/quality_control_plan/views/qc_inspection_view.xml b/quality_control_plan/views/qc_inspection_view.xml new file mode 100644 index 000000000..76e0ce056 --- /dev/null +++ b/quality_control_plan/views/qc_inspection_view.xml @@ -0,0 +1,35 @@ + + + + + + + + + qc.inspection.qty.checked + qc.inspection + + + + 1 + Total quantity + + + + + + +