mirror of
https://github.com/bringout/oca-mrp.git
synced 2026-04-25 05:31:58 +02:00
Initial commit: OCA Mrp packages (117 packages)
This commit is contained in:
commit
277e84fd7a
4403 changed files with 395154 additions and 0 deletions
|
|
@ -0,0 +1,137 @@
|
|||
.. image:: https://odoo-community.org/readme-banner-image
|
||||
:target: https://odoo-community.org/get-involved?utm_source=readme
|
||||
:alt: Odoo Community Association
|
||||
|
||||
===================
|
||||
Quality Control OCA
|
||||
===================
|
||||
|
||||
..
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! This file is generated by oca-gen-addon-readme !!
|
||||
!! changes will be overwritten. !!
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
!! source digest: sha256:ae0d8892fe8566e76f4d52dd57054f0d04b20f0f3c76e59ac12ed1529eb79ad9
|
||||
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
||||
.. |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/license-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/16.0/quality_control_oca
|
||||
:alt: OCA/manufacture
|
||||
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
|
||||
:target: https://translation.odoo-community.org/projects/manufacture-16-0/manufacture-16-0-quality_control_oca
|
||||
:alt: Translate me on Weblate
|
||||
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
|
||||
:target: https://runboat.odoo-community.org/builds?repo=OCA/manufacture&target_branch=16.0
|
||||
:alt: Try me on Runboat
|
||||
|
||||
|badge1| |badge2| |badge3| |badge4| |badge5|
|
||||
|
||||
This module provides a generic infrastructure for quality tests. The idea is
|
||||
that it can be later reused for doing quality inspections on production lots
|
||||
or any other area of the company.
|
||||
|
||||
**Table of contents**
|
||||
|
||||
.. contents::
|
||||
:local:
|
||||
|
||||
Configuration
|
||||
=============
|
||||
|
||||
* Question: The thing to be checked. We have two types of questions:
|
||||
|
||||
* Qualitative: The result is a description, color, yes, no...
|
||||
|
||||
* Quantitative: The result must be within a range.
|
||||
|
||||
* Possible values: The values chosen in qualitative questions.
|
||||
|
||||
* Test: The set of questions to be used in inspections.
|
||||
|
||||
* Once these values are set, we define the inspection.
|
||||
|
||||
We have a *generic* test that can be applied to any model: shipments,
|
||||
invoices or product, or a *test related*, making it specific to a particular
|
||||
product and that eg apply whenever food is sold or when creating a batch.
|
||||
|
||||
Once these parameters are set, we can just pass the test. We create a
|
||||
new inspection, selecting a relationship with the model (sale, stock move...),
|
||||
and pressing "Select test" button to choose the test to pass. Then, you must
|
||||
fill the lines depending on the chosen test.
|
||||
|
||||
The complete inspection workflow is:
|
||||
|
||||
Draft -> Confirmed -> Success
|
||||
|
|
||||
| -> Failure (Pending approval) -> Approved
|
||||
|
||||
Known issues / Roadmap
|
||||
======================
|
||||
|
||||
* Make translatable the trigger name.
|
||||
|
||||
Bug Tracker
|
||||
===========
|
||||
|
||||
Bugs are tracked on `GitHub Issues <https://github.com/OCA/manufacture/issues>`_.
|
||||
In case of trouble, please check there if your issue has already been reported.
|
||||
If you spotted it first, help us to smash it by providing a detailed and welcomed
|
||||
`feedback <https://github.com/OCA/manufacture/issues/new?body=module:%20quality_control_oca%0Aversion:%2016.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.
|
||||
|
||||
Do not contact contributors directly about support or help with technical issues.
|
||||
|
||||
Credits
|
||||
=======
|
||||
|
||||
Authors
|
||||
~~~~~~~
|
||||
|
||||
* AvanzOSC
|
||||
* Tecnativa
|
||||
|
||||
Contributors
|
||||
~~~~~~~~~~~~
|
||||
|
||||
* Oihane Crucelaegui <oihanecrucelaegi@avanzosc.es>
|
||||
* Ana Juaristi <anajuaristi@avanzosc.es>
|
||||
* Lois Rilo <lois.rilo@forgeflow.com>
|
||||
* Simone Rubino <simone.rubino@agilebg.com>
|
||||
* Juan Humanes <juan.humanes@guadaltech.es>
|
||||
* Ignacio José Alés López <ignacio.ales@guadaltech.es>
|
||||
* Pimolnat Suntian <pimolnats@ecosoft.co.th>
|
||||
* `Tecnativa <https://www.tecnativa.com>`_:
|
||||
|
||||
* Pedro M. Baeza
|
||||
* Carlos Roca
|
||||
|
||||
* `Trey Kilobytes de Soluciones SL <https://www.trey.es>`__:
|
||||
|
||||
* Vicent Cubells
|
||||
|
||||
Other credits
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
* Originally based on the old nan_quality_control_* modules from NaN·tic.
|
||||
|
||||
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 <https://github.com/OCA/manufacture/tree/16.0/quality_control_oca>`_ project on GitHub.
|
||||
|
||||
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
|
||||
|
|
@ -0,0 +1,4 @@
|
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from . import models
|
||||
from . import wizard
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
# Copyright 2010 NaN Projectes de Programari Lliure, S.L.
|
||||
# Copyright 2014-2021 Tecnativa Pedro M. Baeza
|
||||
# Copyright 2014 Oihane Crucelaegui - AvanzOSC
|
||||
# Copyright 2017-2020 ForgeFlow S.L.
|
||||
# Copyright 2017 Simone Rubino - Agile Business Group
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
{
|
||||
"name": "Quality Control OCA",
|
||||
"version": "16.0.1.5.1",
|
||||
"category": "Quality Control",
|
||||
"license": "AGPL-3",
|
||||
"summary": "Generic infrastructure for quality tests.",
|
||||
"author": "AvanzOSC, Tecnativa, Odoo Community Association (OCA)",
|
||||
"website": "https://github.com/OCA/manufacture",
|
||||
"depends": ["product"],
|
||||
"data": [
|
||||
"data/quality_control_data.xml",
|
||||
"security/quality_control_security.xml",
|
||||
"security/ir.model.access.csv",
|
||||
"wizard/qc_test_wizard_view.xml",
|
||||
"views/qc_menus.xml",
|
||||
"views/qc_inspection_view.xml",
|
||||
"views/qc_test_category_view.xml",
|
||||
"views/qc_test_view.xml",
|
||||
"views/qc_trigger_view.xml",
|
||||
"views/product_template_view.xml",
|
||||
"views/product_category_view.xml",
|
||||
],
|
||||
"demo": ["demo/quality_control_demo.xml"],
|
||||
"installable": True,
|
||||
}
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<!-- Copyright 2010 NaN Projectes de Programari Lliure, S.L.
|
||||
Copyright 2014 Serv. Tec. Avanzados - Pedro M. Baeza
|
||||
Copyright 2014 Oihane Crucelaegui - AvanzOSC
|
||||
Copyright 2017 ForgeFlow S.L.
|
||||
Copyright 2017 Simone Rubino - Agile Business Group
|
||||
Copyright 2021 Tecnativa - Carlos Roca
|
||||
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
|
||||
<odoo noupdate="1">
|
||||
<record id="qc_test_template_category_generic" model="qc.test.category">
|
||||
<field name="name">Generic</field>
|
||||
</record>
|
||||
<record id="qc_test_template_category_referenced" model="qc.test.category">
|
||||
<field name="name">Referenced</field>
|
||||
</record>
|
||||
<record forcecreate="True" id="decimal_quality_control" model="decimal.precision">
|
||||
<field name="name">Quality Control</field>
|
||||
<field name="digits">5</field>
|
||||
</record>
|
||||
<record id="seq_qc_inspection" model="ir.sequence">
|
||||
<field name="name">Quality inspection</field>
|
||||
<field name="code">qc.inspection</field>
|
||||
<field name="prefix">QC-</field>
|
||||
<field name="padding">6</field>
|
||||
<field name="company_id" eval="False" />
|
||||
</record>
|
||||
</odoo>
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<odoo noupdate="1">
|
||||
<record model="qc.test" id="qc_test_1">
|
||||
<field name="name">Generic Test (demo)</field>
|
||||
<field name="type">generic</field>
|
||||
<field name="active" eval="True" />
|
||||
<field name="category" ref="qc_test_template_category_generic" />
|
||||
</record>
|
||||
<record model="qc.test.question" id="qc_test_question_1">
|
||||
<field name="name">Overall quality</field>
|
||||
<field name="test" ref="qc_test_1" />
|
||||
<field name="type">qualitative</field>
|
||||
</record>
|
||||
<record model="qc.test.question.value" id="qc_test_question_value_1">
|
||||
<field name="name">Good</field>
|
||||
<field name="ok" eval="True" />
|
||||
<field name="test_line" ref="qc_test_question_1" />
|
||||
</record>
|
||||
<record model="qc.test.question.value" id="qc_test_question_value_2">
|
||||
<field name="name">Bad</field>
|
||||
<field name="ok" eval="False" />
|
||||
<field name="test_line" ref="qc_test_question_1" />
|
||||
</record>
|
||||
<record model="qc.test.question" id="qc_test_question_2">
|
||||
<field name="name">Size</field>
|
||||
<field name="test" ref="qc_test_1" />
|
||||
<field name="type">quantitative</field>
|
||||
<field name="min_value" eval="1.0" />
|
||||
<field name="max_value" eval="10.0" />
|
||||
<field name="uom_id" ref="uom.product_uom_unit" />
|
||||
</record>
|
||||
</odoo>
|
||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,973 @@
|
|||
# Translation of Odoo Server.
|
||||
# This file contains the translation of the following modules:
|
||||
# * quality_control
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Odoo Server 12.0\n"
|
||||
"Report-Msgid-Bugs-To: \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
|
||||
#: model:ir.model,name:quality_control.model_qc_trigger_line
|
||||
msgid "Abstract line for defining triggers"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.view_qc_test_set_test_form
|
||||
msgid "Accept"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__message_needaction
|
||||
msgid "Action Needed"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test__active
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_category__active
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger__active
|
||||
msgid "Active"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__activity_ids
|
||||
msgid "Activities"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__activity_state
|
||||
msgid "Activity State"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__possible_ql_values
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_test_question_form_view
|
||||
msgid "Answers"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_form_view
|
||||
msgid "Approve"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__message_attachment_count
|
||||
msgid "Attachment Count"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__auto_generated
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_search_view
|
||||
msgid "Auto-generated"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:qc.test.question.value,name:quality_control.qc_test_question_value_2
|
||||
msgid "Bad"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_form_view
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.view_qc_test_set_test_form
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: selection:qc.inspection,state:0
|
||||
msgid "Canceled"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__test_uom_category
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test__category
|
||||
msgid "Category"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_category__child_ids
|
||||
msgid "Child categories"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__company_id
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test__company_id
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger__company_id
|
||||
msgid "Company"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.ui.menu,name:quality_control.menu_qc_config
|
||||
msgid "Configuration"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_form_view
|
||||
msgid "Confirm"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_inspection_line__test_uom_category
|
||||
msgid "Conversion between Units of Measure can only occur if they belong to the same category. The conversion will be made based on the ratios."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_line_search_view
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_search_view
|
||||
msgid "Correct"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question_value__ok
|
||||
msgid "Correct answer?"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__create_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__create_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_set_test__create_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test__create_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_category__create_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question__create_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question_value__create_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger__create_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_category_line__create_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_line__create_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_template_line__create_uid
|
||||
msgid "Created by"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__create_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__create_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_set_test__create_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test__create_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_category__create_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question__create_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question_value__create_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger__create_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_category_line__create_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_line__create_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_template_line__create_date
|
||||
msgid "Created on"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__date
|
||||
msgid "Date"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__display_name
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__display_name
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_set_test__display_name
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test__display_name
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_category__display_name
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question__display_name
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question_value__display_name
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger__display_name
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_line__display_name
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_category_line__display_name
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_line__display_name
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_template_line__display_name
|
||||
msgid "Display Name"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_form_view
|
||||
#: selection:qc.inspection,state:0
|
||||
msgid "Draft"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: code:addons/quality_control/models/qc_test_category.py:36
|
||||
#, python-format
|
||||
msgid "Error! You can not create recursive categories."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__external_notes
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_form_view
|
||||
msgid "External notes"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__message_follower_ids
|
||||
msgid "Followers"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__message_channel_ids
|
||||
msgid "Followers (Channels)"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__message_partner_ids
|
||||
msgid "Followers (Partners)"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_category__complete_name
|
||||
msgid "Full name"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: selection:qc.test,type:0
|
||||
#: model:qc.test.category,name:quality_control.qc_test_template_category_generic
|
||||
msgid "Generic"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:qc.test,name:quality_control.qc_test_1
|
||||
msgid "Generic Test (demo)"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:qc.test.question.value,name:quality_control.qc_test_question_value_1
|
||||
msgid "Good"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_line_search_view
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_search_view
|
||||
msgid "Group by..."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__id
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__id
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_set_test__id
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test__id
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_category__id
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question__id
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question_value__id
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger__id
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_line__id
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_category_line__id
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_line__id
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_template_line__id
|
||||
msgid "ID"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_inspection__auto_generated
|
||||
msgid "If an inspection is auto-generated, it can be canceled but not removed."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_inspection__message_unread
|
||||
msgid "If checked new messages require your attention."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_inspection__message_needaction
|
||||
msgid "If checked, new messages require your attention."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_inspection__message_has_error
|
||||
msgid "If checked, some messages have a delivery error."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_trigger_line__partners
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_trigger_product_category_line__partners
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_trigger_product_line__partners
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_trigger_product_template_line__partners
|
||||
msgid "If filled, the test will only be created when the action is done for one of the specified partners. If empty, the test will always be created."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_line_search_view
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_search_view
|
||||
msgid "Incorrect"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__inspection_id
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_form_view
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_line_search_view
|
||||
msgid "Inspection"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.actions.act_window,name:quality_control.action_qc_inspection_line
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__inspection_lines
|
||||
#: model:ir.ui.menu,name:quality_control.qc_inspection_lines_menu
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_form_view
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_line_tree_view
|
||||
msgid "Inspection lines"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__name
|
||||
msgid "Inspection number"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.actions.act_window,name:quality_control.action_qc_inspection
|
||||
#: model:ir.ui.menu,name:quality_control.qc_inspection_menu
|
||||
#: model:ir.ui.menu,name:quality_control.qc_inspection_menu_parent
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_tree_view
|
||||
msgid "Inspections"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__internal_notes
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_form_view
|
||||
msgid "Internal notes"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__message_is_follower
|
||||
msgid "Is Follower"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection____last_update
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line____last_update
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_set_test____last_update
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test____last_update
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_category____last_update
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question____last_update
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question_value____last_update
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger____last_update
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_line____last_update
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_category_line____last_update
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_line____last_update
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_template_line____last_update
|
||||
msgid "Last Modified on"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__write_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__write_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_set_test__write_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test__write_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_category__write_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question__write_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question_value__write_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger__write_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_category_line__write_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_line__write_uid
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_template_line__write_uid
|
||||
msgid "Last Updated by"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__write_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__write_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_set_test__write_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test__write_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_category__write_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question__write_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question_value__write_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger__write_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_category_line__write_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_line__write_date
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_template_line__write_date
|
||||
msgid "Last Updated on"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__message_main_attachment_id
|
||||
msgid "Main Attachment"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:res.groups,name:quality_control.group_quality_control_manager
|
||||
msgid "Manager"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_form_view
|
||||
msgid "Mark todo"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__max_value
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question__max_value
|
||||
msgid "Max"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_inspection_line__max_value
|
||||
msgid "Maximum valid value for a quantitative question."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__message_has_error
|
||||
msgid "Message Delivery error"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__message_ids
|
||||
msgid "Messages"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__min_value
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question__min_value
|
||||
msgid "Min"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_inspection_line__min_value
|
||||
msgid "Minimum valid value for a quantitative question."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test__name
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_category__name
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question__name
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question_value__name
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger__name
|
||||
msgid "Name"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__activity_date_deadline
|
||||
msgid "Next Activity Deadline"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__activity_summary
|
||||
msgid "Next Activity Summary"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__activity_type_id
|
||||
msgid "Next Activity Type"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__notes
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question__notes
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_form_view
|
||||
msgid "Notes"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__message_needaction_counter
|
||||
msgid "Number of Actions"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__message_has_error_counter
|
||||
msgid "Number of error"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_inspection__message_needaction_counter
|
||||
msgid "Number of messages which requires an action"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_inspection__message_has_error_counter
|
||||
msgid "Number of messages with delivery error"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_inspection__message_unread_counter
|
||||
msgid "Number of unread messages"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:qc.test.question,name:quality_control.qc_test_question_1
|
||||
msgid "Overall quality"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: selection:qc.inspection,activity_state:0
|
||||
msgid "Overdue"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_category__parent_id
|
||||
msgid "Parent category"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_line__partners
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_category_line__partners
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_line__partners
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_template_line__partners
|
||||
msgid "Partners"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: selection:qc.inspection,activity_state:0
|
||||
msgid "Planned"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model,name:quality_control.model_qc_test_question_value
|
||||
msgid "Possible values for qualitative questions."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test__fill_correct_values
|
||||
msgid "Pre-fill with correct values"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model,name:quality_control.model_product_product
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__product_id
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__product_id
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_line__product
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_line_search_view
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_search_view
|
||||
msgid "Product"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model,name:quality_control.model_product_category
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_category_line__product_category
|
||||
msgid "Product Category"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model,name:quality_control.model_product_template
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_template_line__product_template
|
||||
msgid "Product Template"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_inspection__product_id
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_inspection_line__product_id
|
||||
msgid "Product associated with the inspection"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: selection:qc.inspection.line,question_type:0
|
||||
#: selection:qc.test.question,type:0
|
||||
msgid "Qualitative"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__qualitative_value
|
||||
msgid "Qualitative value"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question__ql_values
|
||||
msgid "Qualitative values"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.module.category,name:quality_control.module_category_quality_control
|
||||
#: model:ir.ui.menu,name:quality_control.qc_menu
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.product_category_qc_form_view
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.product_template_qc_form_view
|
||||
msgid "Quality control"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model,name:quality_control.model_qc_inspection
|
||||
msgid "Quality control inspection"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model,name:quality_control.model_qc_inspection_line
|
||||
msgid "Quality control inspection line"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model,name:quality_control.model_qc_test_question
|
||||
msgid "Quality control question"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model,name:quality_control.model_qc_test
|
||||
msgid "Quality control test"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model,name:quality_control.model_qc_trigger
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_trigger_form_view
|
||||
msgid "Quality control trigger"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_product_category__qc_triggers
|
||||
#: model:ir.model.fields,field_description:quality_control.field_product_product__qc_triggers
|
||||
#: model:ir.model.fields,field_description:quality_control.field_product_template__qc_triggers
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.product_category_qc_form_view
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.product_template_qc_form_view
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_trigger_tree_view
|
||||
msgid "Quality control triggers"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: selection:qc.inspection,state:0
|
||||
msgid "Quality failed"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: selection:qc.inspection,state:0
|
||||
msgid "Quality success"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: selection:qc.inspection.line,question_type:0
|
||||
#: selection:qc.test.question,type:0
|
||||
msgid "Quantitative"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__quantitative_value
|
||||
msgid "Quantitative value"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__qty
|
||||
msgid "Quantity"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__name
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_line_search_view
|
||||
msgid "Question"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: code:addons/quality_control/models/qc_test.py:71
|
||||
#, python-format
|
||||
msgid "Question '%s' is not valid: minimum value can't be higher than maximum value."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: code:addons/quality_control/models/qc_test.py:62
|
||||
#, python-format
|
||||
msgid "Question '%s' is not valid: you have to mark at least one value as OK."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__question_type
|
||||
msgid "Question type"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_test_question_form_view
|
||||
msgid "Question value"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test__test_lines
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_form_view
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_test_form_view
|
||||
msgid "Questions"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: selection:qc.inspection,state:0
|
||||
msgid "Ready"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__object_id
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_search_view
|
||||
msgid "Reference"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test__object_id
|
||||
msgid "Reference object"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:qc.test.category,name:quality_control.qc_test_template_category_referenced
|
||||
msgid "Referenced"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: selection:qc.test,type:0
|
||||
msgid "Related"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__user
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_line__user
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_category_line__user
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_line__user
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_template_line__user
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_search_view
|
||||
msgid "Responsible"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__activity_user_id
|
||||
msgid "Responsible User"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_search_view
|
||||
msgid "Search inspection"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_line_search_view
|
||||
msgid "Search inspection line"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.actions.act_window,name:quality_control.action_qc_inspection_set_test
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.view_qc_test_set_test_form
|
||||
msgid "Select test"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger__partner_selectable
|
||||
msgid "Selectable by partner"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question__sequence
|
||||
msgid "Sequence"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_form_view
|
||||
msgid "Set test"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model,name:quality_control.model_qc_inspection_set_test
|
||||
msgid "Set test for inspection"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:qc.test.question,name:quality_control.qc_test_question_2
|
||||
msgid "Size"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__state
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_search_view
|
||||
msgid "State"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_inspection__activity_state
|
||||
msgid "Status based on activities\n"
|
||||
"Overdue: Due date is already passed\n"
|
||||
"Today: Activity date is today\n"
|
||||
"Planned: Future activities."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__success
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_line_search_view
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_search_view
|
||||
msgid "Success"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__success
|
||||
msgid "Success?"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__test
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_set_test__test
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question__test
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_line__test
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_category_line__test
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_line__test
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_template_line__test
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_inspection_search_view
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_test_form_view
|
||||
msgid "Test"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__test_uom_id
|
||||
msgid "Test UoM"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.actions.act_window,name:quality_control.action_qc_test_category
|
||||
#: model:ir.ui.menu,name:quality_control.qc_test_category_menu
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_test_category_tree_view
|
||||
msgid "Test categories"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model,name:quality_control.model_qc_test_category
|
||||
msgid "Test category"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__test_line
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question_value__test_line
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_test_question_form_view
|
||||
msgid "Test question"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.actions.act_window,name:quality_control.action_qc_test
|
||||
#: model:ir.ui.menu,name:quality_control.qc_menu_test_parent
|
||||
#: model:ir.ui.menu,name:quality_control.qc_test_menu
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.qc_test_tree_view
|
||||
msgid "Tests"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_test_category__active
|
||||
msgid "This field allows you to hide the category without removing it."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_inspection__success
|
||||
msgid "This field will be marked if all tests have succeeded."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_trigger__partner_selectable
|
||||
msgid "This technical field is to allow to filter by partner in triggers"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: selection:qc.inspection,activity_state:0
|
||||
msgid "Today"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_line__trigger
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_category_line__trigger
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_line__trigger
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_trigger_product_template_line__trigger
|
||||
msgid "Trigger"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test__type
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question__type
|
||||
msgid "Type"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__message_unread
|
||||
msgid "Unread Messages"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__message_unread_counter
|
||||
msgid "Unread Messages Counter"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__uom_id
|
||||
msgid "UoM"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_inspection_line__test_uom_id
|
||||
msgid "UoM for minimum and maximum values for a quantitative question."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_inspection_line__uom_id
|
||||
msgid "UoM of the inspection value for a quantitative question."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_test_question__uom_id
|
||||
msgid "Uom"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:res.groups,name:quality_control.group_quality_control_user
|
||||
msgid "User"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection_line__valid_values
|
||||
msgid "Valid values"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_inspection_line__qualitative_value
|
||||
msgid "Value of the result for a qualitative question."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_inspection_line__quantitative_value
|
||||
msgid "Value of the result for a quantitative question."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: selection:qc.inspection,state:0
|
||||
msgid "Waiting supervisor approval"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,field_description:quality_control.field_qc_inspection__website_message_ids
|
||||
msgid "Website Messages"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_inspection__website_message_ids
|
||||
msgid "Website communication history"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model.fields,help:quality_control.field_qc_test_question_value__ok
|
||||
msgid "When this field is marked, the answer is considered correct."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: code:addons/quality_control/models/qc_inspection.py:106
|
||||
#, python-format
|
||||
msgid "You cannot remove an auto-generated inspection."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: code:addons/quality_control/models/qc_inspection.py:109
|
||||
#, python-format
|
||||
msgid "You cannot remove an inspection that is not in draft state."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: code:addons/quality_control/models/qc_inspection.py:122
|
||||
#, python-format
|
||||
msgid "You must first set the test to perform."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: code:addons/quality_control/models/qc_inspection.py:137
|
||||
#, python-format
|
||||
msgid "You should provide a unit of measure for quantitative questions."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: code:addons/quality_control/models/qc_inspection.py:132
|
||||
#, python-format
|
||||
msgid "You should provide an answer for all qualitative questions."
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model_terms:ir.ui.view,arch_db:quality_control.view_qc_test_set_test_form
|
||||
msgid "or"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model,name:quality_control.model_qc_trigger_product_category_line
|
||||
msgid "qc.trigger.product_category_line"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model,name:quality_control.model_qc_trigger_product_line
|
||||
msgid "qc.trigger.product_line"
|
||||
msgstr ""
|
||||
|
||||
#. module: quality_control
|
||||
#: model:ir.model,name:quality_control.model_qc_trigger_product_template_line
|
||||
msgid "qc.trigger.product_template_line"
|
||||
msgstr ""
|
||||
|
||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -0,0 +1,13 @@
|
|||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from . import qc_trigger
|
||||
from . import qc_trigger_line
|
||||
from . import qc_test_category
|
||||
from . import qc_test
|
||||
from . import qc_inspection
|
||||
from . import product_product
|
||||
from . import product_template
|
||||
from . import product_category
|
||||
from . import qc_trigger_product_category_line
|
||||
from . import qc_trigger_product_line
|
||||
from . import qc_trigger_product_template_line
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
# Copyright 2010 NaN Projectes de Programari Lliure, S.L.
|
||||
# Copyright 2014 Serv. Tec. Avanzados - Pedro M. Baeza
|
||||
# Copyright 2014 Oihane Crucelaegui - AvanzOSC
|
||||
# Copyright 2017 ForgeFlow S.L.
|
||||
# Copyright 2017 Simone Rubino - Agile Business Group
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class ProductCategory(models.Model):
|
||||
_inherit = "product.category"
|
||||
|
||||
qc_triggers = fields.One2many(
|
||||
comodel_name="qc.trigger.product_category_line",
|
||||
inverse_name="product_category",
|
||||
string="Quality control triggers",
|
||||
)
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
# Copyright 2010 NaN Projectes de Programari Lliure, S.L.
|
||||
# Copyright 2014 Serv. Tec. Avanzados - Pedro M. Baeza
|
||||
# Copyright 2014 Oihane Crucelaegui - AvanzOSC
|
||||
# Copyright 2017 ForgeFlow S.L.
|
||||
# Copyright 2017 Simone Rubino - Agile Business Group
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class ProductProduct(models.Model):
|
||||
_inherit = "product.product"
|
||||
|
||||
qc_triggers = fields.One2many(
|
||||
comodel_name="qc.trigger.product_line",
|
||||
inverse_name="product",
|
||||
string="Quality control triggers",
|
||||
)
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
# Copyright 2010 NaN Projectes de Programari Lliure, S.L.
|
||||
# Copyright 2014 Serv. Tec. Avanzados - Pedro M. Baeza
|
||||
# Copyright 2014 Oihane Crucelaegui - AvanzOSC
|
||||
# Copyright 2017 ForgeFlow S.L.
|
||||
# Copyright 2017 Simone Rubino - Agile Business Group
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class ProductTemplate(models.Model):
|
||||
_inherit = "product.template"
|
||||
|
||||
qc_triggers = fields.One2many(
|
||||
comodel_name="qc.trigger.product_template_line",
|
||||
inverse_name="product_template",
|
||||
string="Quality control triggers",
|
||||
)
|
||||
|
|
@ -0,0 +1,376 @@
|
|||
# Copyright 2010 NaN Projectes de Programari Lliure, S.L.
|
||||
# Copyright 2014 Serv. Tec. Avanzados - Pedro M. Baeza
|
||||
# Copyright 2014 Oihane Crucelaegui - AvanzOSC
|
||||
# Copyright 2017 ForgeFlow S.L.
|
||||
# Copyright 2017 Simone Rubino - Agile Business Group
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
from odoo import _, api, exceptions, fields, models
|
||||
from odoo.tools import formatLang
|
||||
|
||||
|
||||
class QcInspection(models.Model):
|
||||
_name = "qc.inspection"
|
||||
_description = "Quality control inspection"
|
||||
_inherit = ["mail.thread", "mail.activity.mixin"]
|
||||
|
||||
@api.depends("inspection_lines", "inspection_lines.success")
|
||||
def _compute_success(self):
|
||||
for i in self:
|
||||
i.success = all([x.success for x in i.inspection_lines])
|
||||
|
||||
def object_selection_values(self):
|
||||
"""
|
||||
Overridable method for adding more object models to an inspection.
|
||||
:return: A list with the selection's possible values.
|
||||
"""
|
||||
return [("product.product", "Product")]
|
||||
|
||||
@api.depends("object_id")
|
||||
def _compute_product_id(self):
|
||||
for i in self:
|
||||
if i.object_id and i.object_id._name == "product.product":
|
||||
i.product_id = i.object_id
|
||||
else:
|
||||
i.product_id = False
|
||||
|
||||
name = fields.Char(
|
||||
string="Inspection number",
|
||||
required=True,
|
||||
default="/",
|
||||
readonly=True,
|
||||
states={"draft": [("readonly", False)]},
|
||||
copy=False,
|
||||
)
|
||||
date = fields.Datetime(
|
||||
string="Plan Date",
|
||||
required=True,
|
||||
readonly=True,
|
||||
copy=False,
|
||||
default=fields.Datetime.now,
|
||||
states={"plan": [("readonly", False)], "draft": [("readonly", False)]},
|
||||
)
|
||||
date_done = fields.Datetime("Completion Date", readonly=True)
|
||||
object_id = fields.Reference(
|
||||
string="Reference",
|
||||
selection="object_selection_values",
|
||||
readonly=True,
|
||||
states={"draft": [("readonly", False)]},
|
||||
ondelete="set null",
|
||||
)
|
||||
product_id = fields.Many2one(
|
||||
comodel_name="product.product",
|
||||
compute="_compute_product_id",
|
||||
store=True,
|
||||
help="Product associated with the inspection",
|
||||
)
|
||||
qty = fields.Float(string="Quantity", default=1.0)
|
||||
test = fields.Many2one(comodel_name="qc.test", readonly=True)
|
||||
inspection_lines = fields.One2many(
|
||||
comodel_name="qc.inspection.line",
|
||||
inverse_name="inspection_id",
|
||||
readonly=True,
|
||||
states={"ready": [("readonly", False)]},
|
||||
)
|
||||
internal_notes = fields.Text(string="Internal notes")
|
||||
external_notes = fields.Text(
|
||||
states={"success": [("readonly", True)], "failed": [("readonly", True)]},
|
||||
)
|
||||
state = fields.Selection(
|
||||
[
|
||||
("plan", "Plan"),
|
||||
("draft", "Draft"),
|
||||
("ready", "Ready"),
|
||||
("waiting", "Waiting supervisor approval"),
|
||||
("success", "Quality success"),
|
||||
("failed", "Quality failed"),
|
||||
("canceled", "Canceled"),
|
||||
],
|
||||
readonly=True,
|
||||
default="draft",
|
||||
tracking=True,
|
||||
)
|
||||
success = fields.Boolean(
|
||||
compute="_compute_success",
|
||||
help="This field will be marked if all tests have succeeded.",
|
||||
store=True,
|
||||
)
|
||||
auto_generated = fields.Boolean(
|
||||
string="Auto-generated",
|
||||
readonly=True,
|
||||
copy=False,
|
||||
help="If an inspection is auto-generated, it can be canceled but not removed.",
|
||||
)
|
||||
company_id = fields.Many2one(
|
||||
comodel_name="res.company",
|
||||
string="Company",
|
||||
readonly=True,
|
||||
states={"draft": [("readonly", False)]},
|
||||
default=lambda self: self.env.company,
|
||||
)
|
||||
user = fields.Many2one(
|
||||
comodel_name="res.users",
|
||||
string="Responsible",
|
||||
tracking=True,
|
||||
default=lambda self: self.env.user,
|
||||
)
|
||||
|
||||
@api.model_create_multi
|
||||
def create(self, vals_list):
|
||||
for vals in vals_list:
|
||||
if vals.get("name", "/") == "/":
|
||||
vals["name"] = self.env["ir.sequence"].next_by_code("qc.inspection")
|
||||
return super().create(vals_list)
|
||||
|
||||
def write(self, vals):
|
||||
if "state" in vals:
|
||||
if vals["state"] in ["success", "failed"]:
|
||||
vals["date_done"] = datetime.now()
|
||||
elif vals["state"] == "draft":
|
||||
vals["date_done"] = False
|
||||
return super().write(vals)
|
||||
|
||||
@api.ondelete(at_uninstall=False)
|
||||
def _unlink_except_autogenerated_and_non_draft(self):
|
||||
if self.auto_generated and not self.env.is_superuser():
|
||||
raise exceptions.UserError(
|
||||
_("You cannot remove an auto-generated inspection.")
|
||||
)
|
||||
if self.state != "draft":
|
||||
raise exceptions.UserError(
|
||||
_("You cannot remove an inspection that is not in draft state.")
|
||||
)
|
||||
|
||||
def action_draft(self):
|
||||
self.write({"state": "draft"})
|
||||
|
||||
def action_todo(self):
|
||||
for inspection in self:
|
||||
if not inspection.test:
|
||||
raise exceptions.UserError(_("You must first set the test to perform."))
|
||||
self.write({"state": "ready"})
|
||||
|
||||
def action_confirm(self):
|
||||
for inspection in self:
|
||||
for line in inspection.inspection_lines:
|
||||
if line.question_type == "qualitative" and not line.qualitative_value:
|
||||
raise exceptions.UserError(
|
||||
_(
|
||||
"You should provide an answer for all "
|
||||
"qualitative questions."
|
||||
)
|
||||
)
|
||||
if line.question_type != "qualitative" and not line.uom_id:
|
||||
raise exceptions.UserError(
|
||||
_(
|
||||
"You should provide a unit of measure for "
|
||||
"quantitative questions."
|
||||
)
|
||||
)
|
||||
if inspection.success:
|
||||
inspection.state = "success"
|
||||
else:
|
||||
inspection.state = "waiting"
|
||||
|
||||
def action_approve(self):
|
||||
for inspection in self:
|
||||
if inspection.success:
|
||||
inspection.state = "success"
|
||||
else:
|
||||
inspection.state = "failed"
|
||||
|
||||
def action_cancel(self):
|
||||
self.write({"state": "canceled"})
|
||||
|
||||
def set_test(self, trigger_line, force_fill=False):
|
||||
for inspection in self:
|
||||
header = self._prepare_inspection_header(inspection.object_id, trigger_line)
|
||||
del header["state"] # don't change current status
|
||||
del header["auto_generated"] # don't change auto_generated flag
|
||||
del header["user"] # don't change current user
|
||||
inspection.write(header)
|
||||
inspection.inspection_lines.unlink()
|
||||
inspection.inspection_lines = inspection._prepare_inspection_lines(
|
||||
trigger_line.test, force_fill=force_fill
|
||||
)
|
||||
|
||||
def _make_inspection(self, object_ref, trigger_line, date=None):
|
||||
"""Overridable hook method for creating inspection from test.
|
||||
:param object_ref: Object instance
|
||||
:param trigger_line: Trigger line instance
|
||||
:return: Inspection object
|
||||
"""
|
||||
inspection = self.create(
|
||||
self._prepare_inspection_header(object_ref, trigger_line)
|
||||
)
|
||||
if date:
|
||||
inspection.date = date
|
||||
inspection.set_test(trigger_line)
|
||||
return inspection
|
||||
|
||||
def _prepare_inspection_header(self, object_ref, trigger_line):
|
||||
"""Overridable hook method for preparing inspection header.
|
||||
:param object_ref: Object instance
|
||||
:param trigger_line: Trigger line instance
|
||||
:return: List of values for creating the inspection
|
||||
"""
|
||||
return {
|
||||
"object_id": object_ref
|
||||
and "{},{}".format(object_ref._name, object_ref.id)
|
||||
or False,
|
||||
"state": trigger_line.timing == "plan_ahead" and "plan" or "ready",
|
||||
"test": trigger_line.test.id,
|
||||
"user": trigger_line.user.id,
|
||||
"auto_generated": True,
|
||||
}
|
||||
|
||||
def _prepare_inspection_lines(self, test, force_fill=False):
|
||||
new_data = []
|
||||
for line in test.test_lines:
|
||||
data = self._prepare_inspection_line(
|
||||
test, line, fill=test.fill_correct_values or force_fill
|
||||
)
|
||||
new_data.append((0, 0, data))
|
||||
return new_data
|
||||
|
||||
def _prepare_inspection_line(self, test, line, fill=None):
|
||||
data = {
|
||||
"name": line.name,
|
||||
"test_line": line.id,
|
||||
"notes": line.notes,
|
||||
"min_value": line.min_value,
|
||||
"max_value": line.max_value,
|
||||
"test_uom_id": line.uom_id.id,
|
||||
"uom_id": line.uom_id.id,
|
||||
"question_type": line.type,
|
||||
"possible_ql_values": [x.id for x in line.ql_values],
|
||||
}
|
||||
if fill:
|
||||
if line.type == "qualitative":
|
||||
# Fill with the first correct value found
|
||||
for value in line.ql_values:
|
||||
if value.ok:
|
||||
data["qualitative_value"] = value.id
|
||||
break
|
||||
else:
|
||||
# Fill with a value inside the interval
|
||||
data["quantitative_value"] = (line.min_value + line.max_value) * 0.5
|
||||
return data
|
||||
|
||||
def _get_existing_inspections(self, records):
|
||||
reference_vals = []
|
||||
for rec in records:
|
||||
reference_vals.append(",".join([rec._name, str(rec.id)]))
|
||||
return self.sudo().search([("object_id", "in", reference_vals)])
|
||||
|
||||
|
||||
class QcInspectionLine(models.Model):
|
||||
_name = "qc.inspection.line"
|
||||
_description = "Quality control inspection line"
|
||||
|
||||
@api.depends(
|
||||
"question_type",
|
||||
"uom_id",
|
||||
"test_uom_id",
|
||||
"max_value",
|
||||
"min_value",
|
||||
"quantitative_value",
|
||||
"qualitative_value",
|
||||
"possible_ql_values",
|
||||
)
|
||||
def _compute_quality_test_check(self):
|
||||
for insp_line in self:
|
||||
if insp_line.question_type == "qualitative":
|
||||
insp_line.success = insp_line.qualitative_value.ok
|
||||
else:
|
||||
if insp_line.uom_id.id == insp_line.test_uom_id.id:
|
||||
amount = insp_line.quantitative_value
|
||||
else:
|
||||
amount = self.env["uom.uom"]._compute_quantity(
|
||||
insp_line.quantitative_value, insp_line.test_uom_id.id
|
||||
)
|
||||
insp_line.success = insp_line.max_value >= amount >= insp_line.min_value
|
||||
|
||||
@api.depends(
|
||||
"possible_ql_values", "min_value", "max_value", "test_uom_id", "question_type"
|
||||
)
|
||||
def _compute_valid_values(self):
|
||||
for insp_line in self:
|
||||
if insp_line.question_type == "qualitative":
|
||||
insp_line.valid_values = ", ".join(
|
||||
[x.name for x in insp_line.possible_ql_values if x.ok]
|
||||
)
|
||||
else:
|
||||
insp_line.valid_values = "{} ~ {}".format(
|
||||
formatLang(self.env, insp_line.min_value),
|
||||
formatLang(self.env, insp_line.max_value),
|
||||
)
|
||||
if self.env.ref("uom.group_uom") in self.env.user.groups_id:
|
||||
insp_line.valid_values += " %s" % insp_line.test_uom_id.name
|
||||
|
||||
inspection_id = fields.Many2one(
|
||||
comodel_name="qc.inspection", string="Inspection", ondelete="cascade"
|
||||
)
|
||||
name = fields.Char(string="Question", readonly=True)
|
||||
product_id = fields.Many2one(
|
||||
comodel_name="product.product",
|
||||
related="inspection_id.product_id",
|
||||
store=True,
|
||||
)
|
||||
test_line = fields.Many2one(
|
||||
comodel_name="qc.test.question", string="Test question", readonly=True
|
||||
)
|
||||
possible_ql_values = fields.Many2many(
|
||||
comodel_name="qc.test.question.value", string="Answers"
|
||||
)
|
||||
quantitative_value = fields.Float(
|
||||
string="Quantitative value",
|
||||
digits="Quality Control",
|
||||
help="Value of the result for a quantitative question.",
|
||||
)
|
||||
qualitative_value = fields.Many2one(
|
||||
comodel_name="qc.test.question.value",
|
||||
string="Qualitative value",
|
||||
help="Value of the result for a qualitative question.",
|
||||
domain="[('id', 'in', possible_ql_values)]",
|
||||
)
|
||||
notes = fields.Text()
|
||||
min_value = fields.Float(
|
||||
string="Min",
|
||||
digits="Quality Control",
|
||||
readonly=True,
|
||||
help="Minimum valid value for a quantitative question.",
|
||||
)
|
||||
max_value = fields.Float(
|
||||
string="Max",
|
||||
digits="Quality Control",
|
||||
readonly=True,
|
||||
help="Maximum valid value for a quantitative question.",
|
||||
)
|
||||
test_uom_id = fields.Many2one(
|
||||
comodel_name="uom.uom",
|
||||
string="Test UoM",
|
||||
readonly=True,
|
||||
help="UoM for minimum and maximum values for a quantitative " "question.",
|
||||
)
|
||||
test_uom_category = fields.Many2one(
|
||||
comodel_name="uom.category", related="test_uom_id.category_id", store=True
|
||||
)
|
||||
uom_id = fields.Many2one(
|
||||
comodel_name="uom.uom",
|
||||
string="UoM",
|
||||
domain="[('category_id', '=', test_uom_category)]",
|
||||
help="UoM of the inspection value for a quantitative question.",
|
||||
)
|
||||
question_type = fields.Selection(
|
||||
[("qualitative", "Qualitative"), ("quantitative", "Quantitative")],
|
||||
readonly=True,
|
||||
)
|
||||
valid_values = fields.Char(
|
||||
string="Valid values", store=True, compute="_compute_valid_values"
|
||||
)
|
||||
success = fields.Boolean(
|
||||
compute="_compute_quality_test_check", string="Success?", store=True
|
||||
)
|
||||
|
|
@ -0,0 +1,116 @@
|
|||
# Copyright 2010 NaN Projectes de Programari Lliure, S.L.
|
||||
# Copyright 2014 Serv. Tec. Avanzados - Pedro M. Baeza
|
||||
# Copyright 2014 Oihane Crucelaegui - AvanzOSC
|
||||
# Copyright 2017 ForgeFlow S.L.
|
||||
# Copyright 2017 Simone Rubino - Agile Business Group
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import _, api, exceptions, fields, models
|
||||
|
||||
|
||||
class QcTest(models.Model):
|
||||
"""
|
||||
A test is a group of questions along with the values that make them valid.
|
||||
"""
|
||||
|
||||
_name = "qc.test"
|
||||
_description = "Quality control test"
|
||||
_inherit = "mail.thread"
|
||||
|
||||
def object_selection_values(self):
|
||||
return set()
|
||||
|
||||
@api.onchange("type")
|
||||
def onchange_type(self):
|
||||
if self.type == "generic":
|
||||
self.object_id = False
|
||||
|
||||
active = fields.Boolean(default=True)
|
||||
name = fields.Char(required=True, translate=True)
|
||||
test_lines = fields.One2many(
|
||||
comodel_name="qc.test.question",
|
||||
inverse_name="test",
|
||||
string="Questions",
|
||||
copy=True,
|
||||
)
|
||||
object_id = fields.Reference(
|
||||
string="Reference object",
|
||||
selection="object_selection_values",
|
||||
)
|
||||
fill_correct_values = fields.Boolean(string="Pre-fill with correct values")
|
||||
type = fields.Selection(
|
||||
[("generic", "Generic"), ("related", "Related")],
|
||||
required=True,
|
||||
default="generic",
|
||||
)
|
||||
category = fields.Many2one(comodel_name="qc.test.category")
|
||||
company_id = fields.Many2one(
|
||||
comodel_name="res.company",
|
||||
default=lambda self: self.env.company,
|
||||
)
|
||||
|
||||
|
||||
class QcTestQuestion(models.Model):
|
||||
"""Each test line is a question with its valid value(s)."""
|
||||
|
||||
_name = "qc.test.question"
|
||||
_description = "Quality control question"
|
||||
_order = "sequence, id"
|
||||
|
||||
@api.constrains("ql_values")
|
||||
def _check_valid_answers(self):
|
||||
for tc in self:
|
||||
if (
|
||||
tc.type == "qualitative"
|
||||
and tc.ql_values
|
||||
and not tc.ql_values.filtered("ok")
|
||||
):
|
||||
raise exceptions.ValidationError(
|
||||
_(
|
||||
"Question '%s' is not valid: "
|
||||
"you have to mark at least one value as OK."
|
||||
)
|
||||
% tc.name_get()[0][1]
|
||||
)
|
||||
|
||||
@api.constrains("min_value", "max_value")
|
||||
def _check_valid_range(self):
|
||||
for tc in self:
|
||||
if tc.type == "quantitative" and tc.min_value > tc.max_value:
|
||||
raise exceptions.ValidationError(
|
||||
_(
|
||||
"Question '%s' is not valid: "
|
||||
"minimum value can't be higher than maximum value."
|
||||
)
|
||||
% tc.name_get()[0][1]
|
||||
)
|
||||
|
||||
sequence = fields.Integer(required=True, default="10")
|
||||
test = fields.Many2one(comodel_name="qc.test")
|
||||
name = fields.Char(required=True, translate=True)
|
||||
type = fields.Selection(
|
||||
[("qualitative", "Qualitative"), ("quantitative", "Quantitative")],
|
||||
required=True,
|
||||
)
|
||||
ql_values = fields.One2many(
|
||||
comodel_name="qc.test.question.value",
|
||||
inverse_name="test_line",
|
||||
string="Qualitative values",
|
||||
copy=True,
|
||||
)
|
||||
notes = fields.Text()
|
||||
min_value = fields.Float(string="Min", digits="Quality Control")
|
||||
max_value = fields.Float(string="Max", digits="Quality Control")
|
||||
uom_id = fields.Many2one(comodel_name="uom.uom", string="Uom")
|
||||
|
||||
|
||||
class QcTestQuestionValue(models.Model):
|
||||
_name = "qc.test.question.value"
|
||||
_description = "Possible values for qualitative questions."
|
||||
|
||||
test_line = fields.Many2one(comodel_name="qc.test.question", string="Test question")
|
||||
name = fields.Char(required=True, translate=True)
|
||||
ok = fields.Boolean(
|
||||
string="Correct answer?",
|
||||
help="When this field is marked, the answer is considered correct.",
|
||||
)
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
# Copyright 2010 NaN Projectes de Programari Lliure, S.L.
|
||||
# Copyright 2014 Serv. Tec. Avanzados - Pedro M. Baeza
|
||||
# Copyright 2014 Oihane Crucelaegui - AvanzOSC
|
||||
# Copyright 2017 ForgeFlow S.L.
|
||||
# Copyright 2017 Simone Rubino - Agile Business Group
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import _, api, exceptions, fields, models
|
||||
|
||||
|
||||
class QcTestTemplateCategory(models.Model):
|
||||
_name = "qc.test.category"
|
||||
_description = "Test category"
|
||||
|
||||
@api.depends("name", "parent_id")
|
||||
def _compute_get_complete_name(self):
|
||||
for record in self:
|
||||
names = [record.name or ""]
|
||||
parent = record.parent_id
|
||||
while parent:
|
||||
names.append(parent.name)
|
||||
parent = parent.parent_id
|
||||
record.complete_name = " / ".join(reversed(names))
|
||||
|
||||
@api.constrains("parent_id")
|
||||
def _check_parent_id(self):
|
||||
if not self._check_recursion():
|
||||
raise exceptions.UserError(
|
||||
_("Error! You can not create recursive categories.")
|
||||
)
|
||||
|
||||
name = fields.Char(required=True, translate=True)
|
||||
parent_id = fields.Many2one(
|
||||
comodel_name="qc.test.category", string="Parent category"
|
||||
)
|
||||
complete_name = fields.Char(
|
||||
compute="_compute_get_complete_name", string="Full name"
|
||||
)
|
||||
child_ids = fields.One2many(
|
||||
comodel_name="qc.test.category",
|
||||
inverse_name="parent_id",
|
||||
string="Child categories",
|
||||
)
|
||||
active = fields.Boolean(
|
||||
default=True,
|
||||
help="This field allows you to hide the category without removing it.",
|
||||
)
|
||||
|
|
@ -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 ForgeFlow S.L.
|
||||
# Copyright 2017 Simone Rubino - Agile Business Group
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class QcTrigger(models.Model):
|
||||
_name = "qc.trigger"
|
||||
_description = "Quality control trigger"
|
||||
|
||||
name = fields.Char(required=True, translate=True)
|
||||
active = fields.Boolean(default=True)
|
||||
company_id = fields.Many2one(
|
||||
comodel_name="res.company",
|
||||
string="Company",
|
||||
default=lambda self: self.env.company,
|
||||
)
|
||||
partner_selectable = fields.Boolean(
|
||||
string="Selectable by partner",
|
||||
default=False,
|
||||
readonly=True,
|
||||
help="This technical field is to allow to filter by partner in triggers",
|
||||
)
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
# Copyright 2010 NaN Projectes de Programari Lliure, S.L.
|
||||
# Copyright 2014 Serv. Tec. Avanzados - Pedro M. Baeza
|
||||
# Copyright 2014 Oihane Crucelaegui - AvanzOSC
|
||||
# Copyright 2017 ForgeFlow S.L.
|
||||
# Copyright 2017 Simone Rubino - Agile Business Group
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
def _filter_trigger_lines(trigger_lines):
|
||||
filtered_trigger_lines = []
|
||||
unique_tests = []
|
||||
for trigger_line in trigger_lines:
|
||||
if trigger_line.test not in unique_tests:
|
||||
filtered_trigger_lines.append(trigger_line)
|
||||
unique_tests.append(trigger_line.test)
|
||||
return filtered_trigger_lines
|
||||
|
||||
|
||||
class QcTriggerLine(models.AbstractModel):
|
||||
_name = "qc.trigger.line"
|
||||
_inherit = "mail.thread"
|
||||
_description = "Abstract line for defining triggers"
|
||||
|
||||
trigger = fields.Many2one(comodel_name="qc.trigger", required=True)
|
||||
test = fields.Many2one(comodel_name="qc.test", required=True)
|
||||
user = fields.Many2one(
|
||||
comodel_name="res.users",
|
||||
string="Responsible",
|
||||
tracking=True,
|
||||
default=lambda self: self.env.user,
|
||||
)
|
||||
partners = fields.Many2many(
|
||||
comodel_name="res.partner",
|
||||
help="If filled, the test will only be created when the action is done"
|
||||
" for one of the specified partners. If empty, the test will always be"
|
||||
" created.",
|
||||
domain="[('parent_id', '=', False)]",
|
||||
)
|
||||
timing = fields.Selection(
|
||||
selection=[
|
||||
("before", "Before"),
|
||||
("after", "After"),
|
||||
("plan_ahead", "Plan Ahead"),
|
||||
],
|
||||
default="after",
|
||||
help="* Before: An executable inspection is generated before the record "
|
||||
"related to the trigger is completed (e.g. when picking is confirmed).\n"
|
||||
"* After: An executable inspection is generated when the record related to the "
|
||||
"trigger is completed (e.g. when picking is done).\n"
|
||||
"* Plan Ahead: A non-executable inspection is generated before the record "
|
||||
"related to the trigger is completed (e.g. when picking is confirmed), and the "
|
||||
"inspection becomes executable when the record related to the trigger is "
|
||||
"completed (e.g. when picking is done).",
|
||||
)
|
||||
|
||||
def get_trigger_line_for_product(self, trigger, timings, product, partner=False):
|
||||
"""Overridable method for getting trigger_line associated to a product.
|
||||
Each inherited model will complete this module to make the search by
|
||||
product, template or category.
|
||||
:param trigger: Trigger instance.
|
||||
:param product: Product instance.
|
||||
:return: Set of trigger_lines that matches to the given product and
|
||||
trigger.
|
||||
"""
|
||||
return set()
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
# Copyright 2010 NaN Projectes de Programari Lliure, S.L.
|
||||
# Copyright 2014 Serv. Tec. Avanzados - Pedro M. Baeza
|
||||
# Copyright 2014 Oihane Crucelaegui - AvanzOSC
|
||||
# Copyright 2017 ForgeFlow S.L.
|
||||
# Copyright 2017 Simone Rubino - Agile Business Group
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class QcTriggerProductCategoryLine(models.Model):
|
||||
_inherit = "qc.trigger.line"
|
||||
_name = "qc.trigger.product_category_line"
|
||||
_description = "Quality Control Trigger Product Category Line"
|
||||
|
||||
product_category = fields.Many2one(comodel_name="product.category")
|
||||
|
||||
def get_trigger_line_for_product(self, trigger, timings, product, partner=False):
|
||||
trigger_lines = super().get_trigger_line_for_product(
|
||||
trigger, timings, product, partner=partner
|
||||
)
|
||||
category = product.categ_id
|
||||
while category:
|
||||
for trigger_line in category.qc_triggers.filtered(
|
||||
lambda r: r.trigger == trigger
|
||||
and r.timing in timings
|
||||
and (
|
||||
not r.partners
|
||||
or not partner
|
||||
or partner.commercial_partner_id in r.partners
|
||||
)
|
||||
):
|
||||
trigger_lines.add(trigger_line)
|
||||
category = category.parent_id
|
||||
return trigger_lines
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
# Copyright 2010 NaN Projectes de Programari Lliure, S.L.
|
||||
# Copyright 2014 Serv. Tec. Avanzados - Pedro M. Baeza
|
||||
# Copyright 2014 Oihane Crucelaegui - AvanzOSC
|
||||
# Copyright 2017 ForgeFlow S.L.
|
||||
# Copyright 2017 Simone Rubino - Agile Business Group
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class QcTriggerProductLine(models.Model):
|
||||
_inherit = "qc.trigger.line"
|
||||
_name = "qc.trigger.product_line"
|
||||
_description = "Quality Control Trigger Product Line"
|
||||
|
||||
product = fields.Many2one(comodel_name="product.product")
|
||||
|
||||
def get_trigger_line_for_product(self, trigger, timings, product, partner=False):
|
||||
trigger_lines = super().get_trigger_line_for_product(
|
||||
trigger, timings, product, partner=partner
|
||||
)
|
||||
for trigger_line in product.qc_triggers.filtered(
|
||||
lambda r: r.trigger == trigger
|
||||
and r.timing in timings
|
||||
and (
|
||||
not r.partners
|
||||
or not partner
|
||||
or partner.commercial_partner_id in r.partners
|
||||
)
|
||||
and r.test.active
|
||||
):
|
||||
trigger_lines.add(trigger_line)
|
||||
return trigger_lines
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
# Copyright 2010 NaN Projectes de Programari Lliure, S.L.
|
||||
# Copyright 2014 Serv. Tec. Avanzados - Pedro M. Baeza
|
||||
# Copyright 2014 Oihane Crucelaegui - AvanzOSC
|
||||
# Copyright 2017 ForgeFlow S.L.
|
||||
# Copyright 2017 Simone Rubino - Agile Business Group
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class QcTriggerProductTemplateLine(models.Model):
|
||||
_inherit = "qc.trigger.line"
|
||||
_name = "qc.trigger.product_template_line"
|
||||
_description = "Quality Control Trigger Product Template Line"
|
||||
|
||||
product_template = fields.Many2one(comodel_name="product.template")
|
||||
|
||||
def get_trigger_line_for_product(self, trigger, timings, product, partner=False):
|
||||
trigger_lines = super().get_trigger_line_for_product(
|
||||
trigger, timings, product, partner=partner
|
||||
)
|
||||
for trigger_line in product.product_tmpl_id.qc_triggers.filtered(
|
||||
lambda r: r.trigger == trigger
|
||||
and r.timing in timings
|
||||
and (
|
||||
not r.partners
|
||||
or not partner
|
||||
or partner.commercial_partner_id in r.partners
|
||||
)
|
||||
and r.test.active
|
||||
):
|
||||
trigger_lines.add(trigger_line)
|
||||
return trigger_lines
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
* Question: The thing to be checked. We have two types of questions:
|
||||
|
||||
* Qualitative: The result is a description, color, yes, no...
|
||||
|
||||
* Quantitative: The result must be within a range.
|
||||
|
||||
* Possible values: The values chosen in qualitative questions.
|
||||
|
||||
* Test: The set of questions to be used in inspections.
|
||||
|
||||
* Once these values are set, we define the inspection.
|
||||
|
||||
We have a *generic* test that can be applied to any model: shipments,
|
||||
invoices or product, or a *test related*, making it specific to a particular
|
||||
product and that eg apply whenever food is sold or when creating a batch.
|
||||
|
||||
Once these parameters are set, we can just pass the test. We create a
|
||||
new inspection, selecting a relationship with the model (sale, stock move...),
|
||||
and pressing "Select test" button to choose the test to pass. Then, you must
|
||||
fill the lines depending on the chosen test.
|
||||
|
||||
The complete inspection workflow is:
|
||||
|
||||
Draft -> Confirmed -> Success
|
||||
|
|
||||
| -> Failure (Pending approval) -> Approved
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
* Oihane Crucelaegui <oihanecrucelaegi@avanzosc.es>
|
||||
* Ana Juaristi <anajuaristi@avanzosc.es>
|
||||
* Lois Rilo <lois.rilo@forgeflow.com>
|
||||
* Simone Rubino <simone.rubino@agilebg.com>
|
||||
* Juan Humanes <juan.humanes@guadaltech.es>
|
||||
* Ignacio José Alés López <ignacio.ales@guadaltech.es>
|
||||
* Pimolnat Suntian <pimolnats@ecosoft.co.th>
|
||||
* `Tecnativa <https://www.tecnativa.com>`_:
|
||||
|
||||
* Pedro M. Baeza
|
||||
* Carlos Roca
|
||||
|
||||
* `Trey Kilobytes de Soluciones SL <https://www.trey.es>`__:
|
||||
|
||||
* Vicent Cubells
|
||||
|
|
@ -0,0 +1 @@
|
|||
* Originally based on the old nan_quality_control_* modules from NaN·tic.
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
This module provides a generic infrastructure for quality tests. The idea is
|
||||
that it can be later reused for doing quality inspections on production lots
|
||||
or any other area of the company.
|
||||
|
|
@ -0,0 +1 @@
|
|||
* Make translatable the trigger name.
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
||||
access_user_qc_inspection,qc_inspection,model_qc_inspection,group_quality_control_user,1,1,1,1
|
||||
access_user_qc_inspection_line,qc_inspection_line,model_qc_inspection_line,group_quality_control_user,1,1,1,1
|
||||
access_user_qc_test,qc_test user,model_qc_test,group_quality_control_user,1,0,0,0
|
||||
access_manager_qc_test,qc_test manager,model_qc_test,group_quality_control_manager,1,1,1,1
|
||||
access_user_qc_test_question,qc_test_question user,model_qc_test_question,group_quality_control_user,1,0,0,0
|
||||
access_manager_qc_test_question,qc_test_question manager,model_qc_test_question,group_quality_control_manager,1,1,1,1
|
||||
access_user_qc_test_question_value,qc_test_question_value user,model_qc_test_question_value,group_quality_control_user,1,0,0,0
|
||||
access_manager_qc_test_question_value,qc_test_question_value manager,model_qc_test_question_value,group_quality_control_manager,1,1,1,1
|
||||
access_user_qc_test_category,qc_test_category user,model_qc_test_category,group_quality_control_user,1,0,0,0
|
||||
access_manager_qc_test_category,qc_test_category manager,model_qc_test_category,group_quality_control_manager,1,1,1,1
|
||||
access_user_qc_trigger,qc_trigger user,model_qc_trigger,group_quality_control_user,1,0,0,0
|
||||
access_manager_qc_trigger,qc_trigger manager,model_qc_trigger,group_quality_control_manager,1,1,1,1
|
||||
access_user_qc_trigger_product_category_line,qc_trigger_product_category_line user,model_qc_trigger_product_category_line,group_quality_control_user,1,0,0,0
|
||||
access_manager_qc_trigger_product_category_line,qc_trigger_product_category_line manager,model_qc_trigger_product_category_line,group_quality_control_manager,1,1,1,1
|
||||
access_user_qc_trigger_product_template_line,qc_trigger_product_template_line user,model_qc_trigger_product_template_line,group_quality_control_user,1,0,0,0
|
||||
access_manager_qc_trigger_product_template_line,qc_trigger_product_template_line manager,model_qc_trigger_product_template_line,group_quality_control_manager,1,1,1,1
|
||||
access_user_qc_trigger_product_line,qc_trigger_product_line user,model_qc_trigger_product_line,group_quality_control_user,1,0,0,0
|
||||
access_manager_qc_trigger_product_line,qc_trigger_product_line manager,model_qc_trigger_product_line,group_quality_control_manager,1,1,1,1
|
||||
access_user_qc_inspection_set_test,qc_inspection_set_test user,model_qc_inspection_set_test,group_quality_control_user,1,1,1,0
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<!-- Copyright 2010 NaN Projectes de Programari Lliure, S.L.
|
||||
Copyright 2014 Serv. Tec. Avanzados - Pedro M. Baeza
|
||||
Copyright 2014 Oihane Crucelaegui - AvanzOSC
|
||||
Copyright 2017 ForgeFlow S.L.
|
||||
Copyright 2017 Simone Rubino - Agile Business Group
|
||||
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
|
||||
<odoo>
|
||||
<record model="ir.module.category" id="module_category_quality_control">
|
||||
<field name="name">Quality control</field>
|
||||
</record>
|
||||
<record id="group_quality_control_user" model="res.groups">
|
||||
<field name="name">User</field>
|
||||
<field name="category_id" ref="module_category_quality_control" />
|
||||
</record>
|
||||
<record id="group_quality_control_manager" model="res.groups">
|
||||
<field name="name">Manager</field>
|
||||
<field name="category_id" ref="module_category_quality_control" />
|
||||
<field name="implied_ids" eval="[(4, ref('group_quality_control_user'))]" />
|
||||
<field
|
||||
name="users"
|
||||
eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"
|
||||
/>
|
||||
</record>
|
||||
<record id="qc_test_multi_company_rule" model="ir.rule">
|
||||
<field name="name">Quality control test multi-company</field>
|
||||
<field name="model_id" ref="model_qc_test" />
|
||||
<field name="global" eval="True" />
|
||||
<field
|
||||
name="domain_force"
|
||||
>['|', ('company_id', '=', False), ('company_id', 'in', company_ids)]</field>
|
||||
</record>
|
||||
<record id="qc_inspection_multi_company_rule" model="ir.rule">
|
||||
<field name="name">Quality control inspection multi-company</field>
|
||||
<field name="model_id" ref="model_qc_inspection" />
|
||||
<field name="global" eval="True" />
|
||||
<field
|
||||
name="domain_force"
|
||||
>['|', ('company_id', '=', False), ('company_id', 'in', company_ids)]</field>
|
||||
</record>
|
||||
<record id="qc_trigger_multi_company_rule" model="ir.rule">
|
||||
<field name="name">Quality control trigger multi-company</field>
|
||||
<field name="model_id" ref="model_qc_trigger" />
|
||||
<field name="global" eval="True" />
|
||||
<field
|
||||
name="domain_force"
|
||||
>['|', ('company_id', '=', False), ('company_id', 'in', company_ids)]</field>
|
||||
</record>
|
||||
</odoo>
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 5.8 KiB |
|
|
@ -0,0 +1,204 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
inkscape:export-ydpi="30"
|
||||
inkscape:export-xdpi="30"
|
||||
inkscape:export-filename="icon.png"
|
||||
sodipodi:docname="icon.svg"
|
||||
viewBox="0 0 256 256"
|
||||
height="256"
|
||||
width="256"
|
||||
inkscape:version="0.92.3 (2405546, 2018-03-11)"
|
||||
version="1.1"
|
||||
id="svg2">
|
||||
<sodipodi:namedview
|
||||
inkscape:current-layer="layer2"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:window-y="27"
|
||||
inkscape:window-x="67"
|
||||
inkscape:cy="127.07369"
|
||||
inkscape:cx="107.5354"
|
||||
inkscape:zoom="2.8284271"
|
||||
showguides="true"
|
||||
showgrid="false"
|
||||
id="namedview4"
|
||||
inkscape:window-height="1025"
|
||||
inkscape:window-width="1853"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
guidetolerance="10"
|
||||
gridtolerance="10"
|
||||
objecttolerance="10"
|
||||
borderopacity="1"
|
||||
bordercolor="#666666"
|
||||
pagecolor="#ffffff"
|
||||
inkscape:guide-bbox="true">
|
||||
<sodipodi:guide
|
||||
position="94.776276,202.08872"
|
||||
orientation="-0.70710678,0.70710678"
|
||||
id="guide37"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
position="165.52734,51.804688"
|
||||
orientation="-0.70710678,0.70710678"
|
||||
id="guide39"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
position="179.5,115.53516"
|
||||
orientation="-0.70710678,0.70710678"
|
||||
id="guide41"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
position="187.67187,135.85937"
|
||||
orientation="-0.70710678,0.70710678"
|
||||
id="guide43"
|
||||
inkscape:locked="false" />
|
||||
<sodipodi:guide
|
||||
position="114.09375,209.71875"
|
||||
orientation="-0.70710678,0.70710678"
|
||||
id="guide45"
|
||||
inkscape:locked="false" />
|
||||
</sodipodi:namedview>
|
||||
<metadata
|
||||
id="metadata8">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs6">
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath34371">
|
||||
<rect
|
||||
style="fill:#3771c8;fill-opacity:1;stroke:none;stroke-width:2.00009322;stroke-opacity:1"
|
||||
id="rect34373"
|
||||
width="256"
|
||||
height="256"
|
||||
x="0"
|
||||
y="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath34375">
|
||||
<rect
|
||||
style="fill:#3771c8;fill-opacity:1;stroke:none;stroke-width:2.00009322;stroke-opacity:1"
|
||||
id="rect34377"
|
||||
width="256"
|
||||
height="256"
|
||||
x="0"
|
||||
y="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath34379">
|
||||
<rect
|
||||
style="fill:#3771c8;fill-opacity:1;stroke:none;stroke-width:2.00009322;stroke-opacity:1"
|
||||
id="rect34381"
|
||||
width="256"
|
||||
height="256"
|
||||
x="0"
|
||||
y="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath34383">
|
||||
<rect
|
||||
style="fill:#3771c8;fill-opacity:1;stroke:none;stroke-width:2.00009322;stroke-opacity:1"
|
||||
id="rect34385"
|
||||
width="256"
|
||||
height="256"
|
||||
x="0"
|
||||
y="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath34387">
|
||||
<rect
|
||||
style="fill:#3771c8;fill-opacity:1;stroke:none;stroke-width:2.00009322;stroke-opacity:1"
|
||||
id="rect34389"
|
||||
width="256"
|
||||
height="256"
|
||||
x="0"
|
||||
y="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath34391">
|
||||
<rect
|
||||
style="fill:#3771c8;fill-opacity:1;stroke:none;stroke-width:2.00009322;stroke-opacity:1"
|
||||
id="rect34393"
|
||||
width="256"
|
||||
height="256"
|
||||
x="0"
|
||||
y="0" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
clipPathUnits="userSpaceOnUse"
|
||||
id="clipPath34395">
|
||||
<rect
|
||||
style="fill:#3771c8;fill-opacity:1;stroke:none;stroke-width:2.00009322;stroke-opacity:1"
|
||||
id="rect34397"
|
||||
width="256"
|
||||
height="256"
|
||||
x="0"
|
||||
y="0" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g
|
||||
inkscape:label="Background"
|
||||
id="layer1"
|
||||
inkscape:groupmode="layer">
|
||||
<rect
|
||||
y="0"
|
||||
x="0"
|
||||
height="256"
|
||||
width="256"
|
||||
id="rect1402"
|
||||
style="fill:#5f8dd3;fill-opacity:1;stroke:none;stroke-width:2.00009322;stroke-opacity:1" />
|
||||
</g>
|
||||
<g
|
||||
inkscape:label="Icon"
|
||||
id="layer2"
|
||||
inkscape:groupmode="layer">
|
||||
<path
|
||||
style="fill:#000000;fill-opacity:0.39215687;fill-rule:evenodd;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="M 93.274537,55.413019 -0.232492,148.92005 0,256 l 113.65983,0.0628 51.65772,-51.65734 -10.8795,-38.87869 24.53203,-24.53203 -0.65704,-11.49529 8.7558,-8.75581 -8.89934,-9.28603 -10.15043,-37.646183 -56.05389,-25.401624 -8.07323,8.073227 z"
|
||||
id="path35"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccccccccccccc" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.30461562"
|
||||
clip-path="url(#clipPath34391)"
|
||||
d="M 139.01367 45.707031 C 135.39131 45.632696 131.83894 49.968749 127.97656 49.96875 C 123.85669 49.96875 119.58846 45.096742 115.66016 45.892578 C 111.73185 46.688414 110.04842 52.717143 106.4043 54.220703 C 102.76018 55.724264 97.271068 52.682921 93.914062 54.910156 C 90.557058 57.13739 91.64247 63.610387 88.720703 66.519531 C 85.798935 69.428675 78.734925 68.970386 76.519531 72.3125 C 74.304136 75.654614 78.553541 81.177043 77.027344 84.810547 C 75.501146 88.44405 68.314747 90.07636 67.507812 94.070312 C 66.700879 98.064264 72.498047 101.56353 72.498047 105.70508 C 72.498047 109.84663 66.768712 114.86455 67.435547 118.27148 C 68.102381 121.67842 74.661791 123.75386 76.001953 127.54883 C 77.342117 131.3438 74.093851 136.73605 76.523438 140.40039 C 78.953025 144.06473 84.741221 142.22552 87.626953 145.21094 C 90.512685 148.19636 90.700537 155.67885 94.064453 157.89648 C 97.428368 160.11411 102.96871 156.62342 106.45898 158.14453 C 109.94926 159.66564 110.95664 165.81756 115.07227 166.69336 C 119.1879 167.56915 123.30016 162.21875 127.45898 162.21875 C 131.61781 162.21875 135.4702 167.72211 139.36914 166.99414 C 143.26808 166.26617 144.94335 159.11495 148.75391 157.56445 C 152.56447 156.01395 158.74247 159.99111 162.12305 157.74023 C 165.50364 155.48935 164.51689 148.36189 167.42188 145.47852 C 170.32687 142.59515 177.18724 143.77271 179.38867 140.46094 C 181.59009 137.14918 177.61995 131.09263 179.19531 127.39258 C 180.77066 123.69252 187.73538 122.27616 188.52539 118.22266 C 189.3154 114.16915 183.9707 110.39874 183.9707 106.35352 C 183.9707 102.30829 189.31459 98.557179 188.54297 94.568359 C 187.77135 90.579539 180.93909 88.570205 179.35156 84.773438 C 177.76402 80.976671 181.42005 75.249136 179.13281 71.863281 C 176.84557 68.477426 169.7821 68.768357 166.9707 66.001953 C 164.15931 63.235548 165.82319 57.466183 162.48438 55.208984 C 159.14555 52.951786 152.88328 56.010604 149.05859 54.460938 C 145.2339 52.911271 143.61386 46.531419 139.73828 45.783203 C 139.49606 45.73644 139.25516 45.711987 139.01367 45.707031 z M 127.97656 63.46875 A 42.883841 42.883841 0 0 1 170.85938 106.35352 A 42.883841 42.883841 0 0 1 127.97656 149.23633 A 42.883841 42.883841 0 0 1 85.091797 106.35352 A 42.883841 42.883841 0 0 1 127.97656 63.46875 z M 127.97656 71.257812 A 35.095012 35.095012 0 0 0 92.880859 106.35352 A 35.095012 35.095012 0 0 0 127.97656 141.44727 A 35.095012 35.095012 0 0 0 163.07031 106.35352 A 35.095012 35.095012 0 0 0 127.97656 71.257812 z M 127.83789 79.617188 C 127.96863 79.610895 128.09961 79.613943 128.22852 79.628906 C 128.84726 79.700731 129.42283 80.032851 129.75195 80.761719 L 135.9082 94.392578 L 151.2207 96.324219 C 153.30011 96.586438 153.10622 99.30251 152.1543 100.17578 L 141.24219 110.18555 L 144.13477 125.32617 C 144.39408 126.68389 142.58895 128.45503 140.61523 127.33984 L 127.87109 120.14062 L 114.84766 127.30469 C 113.39881 128.10162 111.06729 126.30454 111.39453 124.69141 L 114.27344 110.5 L 103.87109 100.73633 C 102.55305 99.499152 102.93224 96.453333 105.11719 96.203125 L 119.24023 94.587891 L 125.72852 80.789062 C 126.00804 80.194684 126.92268 79.661232 127.83789 79.617188 z "
|
||||
id="circle3368" />
|
||||
<path
|
||||
sodipodi:nodetypes="ccccccc"
|
||||
inkscape:connector-curvature="0"
|
||||
id="path3338"
|
||||
d="m 98.010569,165.89812 5.436331,-0.84134 c 6.11145,10.88609 11.13432,9.61647 16.24428,9.31943 l -7.31316,35.85391 -9.5783,-9.12527 -12.814214,3.23591 z"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.67500001px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
clip-path="url(#clipPath34379)" />
|
||||
<path
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.67500001px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
|
||||
d="m 157.29249,165.96284 -5.43634,-0.84134 c -6.11144,10.88609 -11.13431,9.61647 -16.24428,9.31943 l 7.31316,35.85391 9.57831,-9.12527 12.81421,3.23591 z"
|
||||
id="path3340"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccc"
|
||||
clip-path="url(#clipPath34375)" />
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9.6 KiB |
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue