Merge PR #912 into 15.0

Signed-off-by max3903
This commit is contained in:
OCA-git-bot
2022-12-16 14:28:51 +00:00
115 changed files with 87164 additions and 0 deletions

View File

@@ -0,0 +1,130 @@
===================
Quality Control OCA
===================
.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fmanufacture-lightgray.png?logo=github
:target: https://github.com/OCA/manufacture/tree/14.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-14-0/manufacture-14-0-quality_control_oca
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png
:target: https://runbot.odoo-community.org/runbot/129/14.0
:alt: Try me on Runbot
|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 smashing it by providing a detailed and welcomed
`feedback <https://github.com/OCA/manufacture/issues/new?body=module:%20quality_control_oca%0Aversion:%2014.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/14.0/quality_control_oca>`_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

View File

@@ -0,0 +1,4 @@
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
from . import models
from . import wizard

View File

@@ -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": "15.0.1.0.0",
"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,
}

View File

@@ -0,0 +1,26 @@
<?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>
</record>
</odoo>

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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",
)

View File

@@ -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",
)

View File

@@ -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",
)

View File

@@ -0,0 +1,356 @@
# 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
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(
required=True,
readonly=True,
copy=False,
default=fields.Datetime.now,
states={"draft": [("readonly", False)]},
)
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(
[
("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, val_list):
for vals in val_list:
if vals.get("name", "/") == "/":
vals["name"] = self.env["ir.sequence"].next_by_code("qc.inspection")
return super().create(vals)
def unlink(self):
for inspection in self:
if inspection.auto_generated:
raise exceptions.UserError(
_("You cannot remove an auto-generated inspection.")
)
if inspection.state != "draft":
raise exceptions.UserError(
_("You cannot remove an inspection that is not in draft state.")
)
return super().unlink()
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."
)
)
elif 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):
"""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)
)
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": "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
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
)

View File

@@ -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.",
)

View File

@@ -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.",
)

View File

@@ -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",
)

View File

@@ -0,0 +1,51 @@
# Copyright 2010 NaN Projectes de Programari Lliure, S.L.
# Copyright 2014 Serv. Tec. Avanzados - Pedro M. Baeza
# Copyright 2014 Oihane Crucelaegui - AvanzOSC
# Copyright 2017 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)]",
)
def get_trigger_line_for_product(self, trigger, 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()

View File

@@ -0,0 +1,34 @@
# 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, product, partner=False):
trigger_lines = super().get_trigger_line_for_product(
trigger, product, partner=partner
)
category = product.categ_id
while category:
for trigger_line in category.qc_triggers.filtered(
lambda r: r.trigger == trigger
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

View File

@@ -0,0 +1,32 @@
# 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, product, partner=False):
trigger_lines = super().get_trigger_line_for_product(
trigger, product, partner=partner
)
for trigger_line in product.qc_triggers.filtered(
lambda r: r.trigger == trigger
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

View File

@@ -0,0 +1,32 @@
# 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, product, partner=False):
trigger_lines = super().get_trigger_line_for_product(
trigger, product, partner=partner
)
for trigger_line in product.product_tmpl_id.qc_triggers.filtered(
lambda r: r.trigger == trigger
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

View File

@@ -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

View File

@@ -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

View File

@@ -0,0 +1 @@
* Originally based on the old nan_quality_control_* modules from NaN·tic.

View File

@@ -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.

View File

@@ -0,0 +1 @@
* Make translatable the trigger name.

View File

@@ -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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_user_qc_inspection qc_inspection model_qc_inspection group_quality_control_user 1 1 1 1
3 access_user_qc_inspection_line qc_inspection_line model_qc_inspection_line group_quality_control_user 1 1 1 1
4 access_user_qc_test qc_test user model_qc_test group_quality_control_user 1 0 0 0
5 access_manager_qc_test qc_test manager model_qc_test group_quality_control_manager 1 1 1 1
6 access_user_qc_test_question qc_test_question user model_qc_test_question group_quality_control_user 1 0 0 0
7 access_manager_qc_test_question qc_test_question manager model_qc_test_question group_quality_control_manager 1 1 1 1
8 access_user_qc_test_question_value qc_test_question_value user model_qc_test_question_value group_quality_control_user 1 0 0 0
9 access_manager_qc_test_question_value qc_test_question_value manager model_qc_test_question_value group_quality_control_manager 1 1 1 1
10 access_user_qc_test_category qc_test_category user model_qc_test_category group_quality_control_user 1 0 0 0
11 access_manager_qc_test_category qc_test_category manager model_qc_test_category group_quality_control_manager 1 1 1 1
12 access_user_qc_trigger qc_trigger user model_qc_trigger group_quality_control_user 1 0 0 0
13 access_manager_qc_trigger qc_trigger manager model_qc_trigger group_quality_control_manager 1 1 1 1
14 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
15 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
16 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
17 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
18 access_user_qc_trigger_product_line qc_trigger_product_line user model_qc_trigger_product_line group_quality_control_user 1 0 0 0
19 access_manager_qc_trigger_product_line qc_trigger_product_line manager model_qc_trigger_product_line group_quality_control_manager 1 1 1 1
20 access_user_qc_inspection_set_test qc_inspection_set_test user model_qc_inspection_set_test group_quality_control_user 1 1 1 0

View File

@@ -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

View File

@@ -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