| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/manufacture |
| GIT | |
| GIT | https://github.com/OCA/manufacture.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/manufacture/tree/19.0/quality_control_oca |
| VERSION | |
| VERSION | 1.0.0 |
| CATEGORY | |
| CATEGORY | Quality Control |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Tecnativa, Odoo Community Association (OCA), AvanzOSC |
| MAINTAINERS | |
| MAINTAINERS | Tecnativa, Odoo Community Association (OCA), AvanzOSC |
| COMMITTERS | |
| COMMITTERS | Weblate, OCA-git-bot, oca-ci, Hotdgo9 |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/manufacture |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 19:40:49 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - product - base - base_setup - web - bus - web_tour - html_editor - uom |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | 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. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
product_category_qc_form_view |
product.category.qc | product.category | group | Inherits product.product_category_form_view |
product_template_form_view |
product.template.common.qc | product.template | page | Inherits product.product_template_form_view |
qc_inspection_form_view |
qc.inspection.form | qc.inspection | form | New |
qc_inspection_kanban_view |
qc.inspection.kanban | qc.inspection | kanban | New |
qc_inspection_line_kanban_view |
qc.inspection.line.kanban | qc.inspection.line | kanban | New |
qc_inspection_line_search_view |
qc.inspection.line.search | qc.inspection.line | search | New |
qc_inspection_line_tree_view |
qc.inspection.line.list | qc.inspection.line | list | New |
qc_inspection_search_view |
qc.inspection.search | qc.inspection | search | New |
qc_inspection_tree_view |
qc.inspection.list | qc.inspection | list | New |
qc_test_category_tree_view |
qc.test.category.list | qc.test.category | list | New |
qc_test_form_view |
qc.test.form | qc.test | form | New |
qc_test_question_form_view |
qc.test.question.form | qc.test.question | form | New |
qc_test_tree_view |
qc.test.list | qc.test | list | New |
qc_trigger_form_view |
qc.trigger.form | qc.trigger | form | New |
qc_trigger_tree_view |
qc.trigger.list | qc.trigger | list | New |
view_qc_test_set_test_form |
qc.inspection.set.test.form | qc.inspection.set.test | form | New |
qc_triggers
One2many → qc.trigger.product_category_line
comodel_name='qc.trigger.product_category_line'
inverse_name='product_category'
string='Quality control triggers'
No public methods.
qc_triggers
One2many → qc.trigger.product_line
comodel_name='qc.trigger.product_line'
inverse_name='product'
string='Quality control triggers'
No public methods.
qc_triggers
One2many → qc.trigger.product_template_line
comodel_name='qc.trigger.product_template_line'
inverse_name='product_template'
string='Quality control triggers'
No public methods.
auto_generated
Boolean
copy=False
help='If an inspection is auto-generated, it can be canceled but not removed.'
string='Auto-generated'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
date
Datetime
copy=False
default=fields.Datetime.now
required=True
string='Plan Date'
date_done
Datetime
readonly=True
args: 'Completion Date'
external_notes
Text
inspection_lines
One2many → qc.inspection.line
comodel_name='qc.inspection.line'
inverse_name='inspection_id'
internal_notes
Text
string='Internal notes'
name
Char
copy=False
default='/'
required=True
string='Inspection number'
object_id
Reference
ondelete='set null'
selection='object_selection_values'
string='Reference'
product_id
Many2one → product.product
comodel_name='product.product'
compute='_compute_product_id'
help='Product associated with the inspection'
store=True
qty
Float
default=1.0
string='Quantity'
state
Selection
default='draft'
tracking=True
args: [('plan', 'Plan'), ('draft', 'Draft'), ('ready', 'Ready'), ('waiting', 'Waiting supervisor approval'), ('success', 'Quality success'), ('failed', 'Quality failed'), ('canceled', 'Canceled')]
success
Boolean
compute='_compute_success'
help='This field will be marked if all tests have succeeded.'
store=True
test
Many2one → qc.test
comodel_name='qc.test'
user
Many2one → res.users
comodel_name='res.users'
default=<expr>
string='Responsible'
tracking=True
action_approve(self)
action_cancel(self)
action_confirm(self)
action_draft(self)
action_todo(self)
create(self, vals_list)
object_selection_values(self)
set_test(self, trigger_line, force_fill=False)
write(self, vals)
inspection_id
Many2one → qc.inspection
comodel_name='qc.inspection'
ondelete='cascade'
string='Inspection'
max_value
Float
digits='Quality Control'
help='Maximum valid value for a quantitative question.'
string='Max'
min_value
Float
digits='Quality Control'
help='Minimum valid value for a quantitative question.'
string='Min'
name
Char
string='Question'
notes
Text
possible_ql_values
Many2many → qc.test.question.value
comodel_name='qc.test.question.value'
string='Answers'
product_id
Many2one → product.product
comodel_name='product.product'
related='inspection_id.product_id'
store=True
qualitative_value
Many2one → qc.test.question.value
comodel_name='qc.test.question.value'
domain="[('id', 'in', possible_ql_values)]"
help='Value of the result for a qualitative question.'
string='Qualitative value'
quantitative_value
Float
digits='Quality Control'
help='Value of the result for a quantitative question.'
string='Quantitative value'
question_type
Selection
success
Boolean
compute='_compute_quality_test_check'
store=True
string='Success?'
test_line
Many2one → qc.test.question
comodel_name='qc.test.question'
string='Test question'
test_uom_category
Many2one → uom.uom
comodel_name='uom.uom'
compute='_compute_test_uom_category'
help="Root unit of the test UoM's family. Used to constrain the inspection UoM choice to units in the same measurement family. In Odoo 19, uom.category was removed in favor of a self-referential uom.uom tree via relative_uom_id; the root unit now serves as the implicit category."
store=True
string='Test UoM Reference'
test_uom_id
Many2one → uom.uom
comodel_name='uom.uom'
help='UoM for minimum and maximum values for a quantitative question.'
string='Test UoM'
uom_id
Many2one → uom.uom
comodel_name='uom.uom'
domain="[('id', 'child_of', test_uom_category)]"
help='UoM of the inspection value for a quantitative question.'
string='UoM'
valid_values
Char
compute='_compute_valid_values'
store=True
string='Valid values'
No public methods.
test
Many2one → qc.test
comodel_name='qc.test'
action_create_test(self)
active
Boolean
default=True
category
Many2one → qc.test.category
comodel_name='qc.test.category'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
fill_correct_values
Boolean
string='Pre-fill with correct values'
name
Char
required=True
translate=True
test_lines
One2many → qc.test.question
comodel_name='qc.test.question'
copy=True
inverse_name='test'
string='Questions'
No public methods.
active
Boolean
default=True
help='This field allows you to hide the category without removing it.'
child_ids
One2many → qc.test.category
comodel_name='qc.test.category'
inverse_name='parent_id'
string='Child categories'
complete_name
Char
compute='_compute_get_complete_name'
string='Full name'
name
Char
required=True
translate=True
parent_id
Many2one → qc.test.category
comodel_name='qc.test.category'
string='Parent category'
No public methods.
max_value
Float
digits='Quality Control'
string='Max'
min_value
Float
digits='Quality Control'
string='Min'
name
Char
required=True
translate=True
notes
Text
ql_values
One2many → qc.test.question.value
comodel_name='qc.test.question.value'
copy=True
inverse_name='test_line'
string='Qualitative values'
sequence
Integer
default='10'
required=True
test
Many2one → qc.test
comodel_name='qc.test'
type
Selection
required=True
args: [('qualitative', 'Qualitative'), ('quantitative', 'Quantitative')]
uom_id
Many2one → uom.uom
comodel_name='uom.uom'
string='Uom'
No public methods.
name
Char
required=True
translate=True
ok
Boolean
help='When this field is marked, the answer is considered correct.'
string='Correct answer?'
test_line
Many2one → qc.test.question
comodel_name='qc.test.question'
string='Test question'
No public methods.
active
Boolean
default=True
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
name
Char
required=True
translate=True
partner_selectable
Boolean
default=False
help='This technical field is to allow to filter by partner in triggers'
string='Selectable by partner'
No public methods.
partners
Many2many → res.partner
comodel_name='res.partner'
domain="[('parent_id', '=', False)]"
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.'
test
Many2one → qc.test
comodel_name='qc.test'
required=True
timing
Selection
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).'
selection=[('before', 'Before'), ('after', 'After'), ('plan_ahead', 'Plan Ahead')]
trigger
Many2one → qc.trigger
comodel_name='qc.trigger'
required=True
user
Many2one → res.users
comodel_name='res.users'
default=<expr>
string='Responsible'
tracking=True
get_trigger_line_for_product(self, trigger, timings, product, partner=False)
product_category
Many2one → product.category
comodel_name='product.category'
get_trigger_line_for_product(self, trigger, timings, product, partner=False)
product
Many2one → product.product
comodel_name='product.product'
get_trigger_line_for_product(self, trigger, timings, product, partner=False)
product_template
Many2one → product.template
comodel_name='product.template'
get_trigger_line_for_product(self, trigger, timings, product, partner=False)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/manufacture |
| GIT | |
| GIT | https://github.com/OCA/manufacture.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/manufacture/tree/18.0/quality_control_oca |
| VERSION | |
| VERSION | 1.4.0 |
| CATEGORY | |
| CATEGORY | Quality Control |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Tecnativa, Odoo Community Association (OCA), AvanzOSC |
| MAINTAINERS | |
| MAINTAINERS | Tecnativa, Odoo Community Association (OCA), AvanzOSC |
| COMMITTERS | |
| COMMITTERS | AaronHForgeFlow, Florian da Costa, Weblate, OCA-git-bot, Dimitrios T. Tanis, oca-ci, Saran440, Rémi - Le Filament |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/manufacture |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 19:30:14 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - product - base - base_setup - web - bus - web_tour - html_editor - uom |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | 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. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
product_category_qc_form_view |
product.category.qc | product.category | group | Inherits product.product_category_form_view |
product_template_form_view |
product.template.common.qc | product.template | page | Inherits product.product_template_form_view |
qc_inspection_form_view |
qc.inspection.form | qc.inspection | form | New |
qc_inspection_kanban_view |
qc.inspection.kanban | qc.inspection | kanban | New |
qc_inspection_line_kanban_view |
qc.inspection.line.kanban | qc.inspection.line | kanban | New |
qc_inspection_line_search_view |
qc.inspection.line.search | qc.inspection.line | search | New |
qc_inspection_line_tree_view |
qc.inspection.line.list | qc.inspection.line | list | New |
qc_inspection_search_view |
qc.inspection.search | qc.inspection | search | New |
qc_inspection_tree_view |
qc.inspection.list | qc.inspection | list | New |
qc_test_category_tree_view |
qc.test.category.list | qc.test.category | list | New |
qc_test_form_view |
qc.test.form | qc.test | form | New |
qc_test_question_form_view |
qc.test.question.form | qc.test.question | form | New |
qc_test_tree_view |
qc.test.list | qc.test | list | New |
qc_trigger_form_view |
qc.trigger.form | qc.trigger | form | New |
qc_trigger_tree_view |
qc.trigger.list | qc.trigger | list | New |
view_qc_test_set_test_form |
qc.inspection.set.test.form | qc.inspection.set.test | form | New |
qc_triggers
One2many → qc.trigger.product_category_line
comodel_name='qc.trigger.product_category_line'
inverse_name='product_category'
string='Quality control triggers'
No public methods.
qc_triggers
One2many → qc.trigger.product_line
comodel_name='qc.trigger.product_line'
inverse_name='product'
string='Quality control triggers'
No public methods.
qc_triggers
One2many → qc.trigger.product_template_line
comodel_name='qc.trigger.product_template_line'
inverse_name='product_template'
string='Quality control triggers'
No public methods.
auto_generated
Boolean
copy=False
help='If an inspection is auto-generated, it can be canceled but not removed.'
string='Auto-generated'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
date
Datetime
copy=False
default=fields.Datetime.now
required=True
string='Plan Date'
date_done
Datetime
readonly=True
args: 'Completion Date'
external_notes
Text
inspection_lines
One2many → qc.inspection.line
comodel_name='qc.inspection.line'
inverse_name='inspection_id'
internal_notes
Text
string='Internal notes'
name
Char
copy=False
default='/'
required=True
string='Inspection number'
object_id
Reference
ondelete='set null'
selection='object_selection_values'
string='Reference'
product_id
Many2one → product.product
comodel_name='product.product'
compute='_compute_product_id'
help='Product associated with the inspection'
store=True
qty
Float
default=1.0
string='Quantity'
state
Selection
default='draft'
tracking=True
args: [('plan', 'Plan'), ('draft', 'Draft'), ('ready', 'Ready'), ('waiting', 'Waiting supervisor approval'), ('success', 'Quality success'), ('failed', 'Quality failed'), ('canceled', 'Canceled')]
success
Boolean
compute='_compute_success'
help='This field will be marked if all tests have succeeded.'
store=True
test
Many2one → qc.test
comodel_name='qc.test'
user
Many2one → res.users
comodel_name='res.users'
default=<expr>
string='Responsible'
tracking=True
action_approve(self)
action_cancel(self)
action_confirm(self)
action_draft(self)
action_todo(self)
create(self, vals_list)
object_selection_values(self)
set_test(self, trigger_line, force_fill=False)
write(self, vals)
inspection_id
Many2one → qc.inspection
comodel_name='qc.inspection'
ondelete='cascade'
string='Inspection'
max_value
Float
digits='Quality Control'
help='Maximum valid value for a quantitative question.'
string='Max'
min_value
Float
digits='Quality Control'
help='Minimum valid value for a quantitative question.'
string='Min'
name
Char
string='Question'
notes
Text
possible_ql_values
Many2many → qc.test.question.value
comodel_name='qc.test.question.value'
string='Answers'
product_id
Many2one → product.product
comodel_name='product.product'
related='inspection_id.product_id'
store=True
qualitative_value
Many2one → qc.test.question.value
comodel_name='qc.test.question.value'
domain="[('id', 'in', possible_ql_values)]"
help='Value of the result for a qualitative question.'
string='Qualitative value'
quantitative_value
Float
digits='Quality Control'
help='Value of the result for a quantitative question.'
string='Quantitative value'
question_type
Selection
success
Boolean
compute='_compute_quality_test_check'
store=True
string='Success?'
test_line
Many2one → qc.test.question
comodel_name='qc.test.question'
string='Test question'
test_uom_category
Many2one → uom.category
comodel_name='uom.category'
related='test_uom_id.category_id'
store=True
test_uom_id
Many2one → uom.uom
comodel_name='uom.uom'
help='UoM for minimum and maximum values for a quantitative question.'
string='Test UoM'
uom_id
Many2one → uom.uom
comodel_name='uom.uom'
domain="[('category_id', '=', test_uom_category)]"
help='UoM of the inspection value for a quantitative question.'
string='UoM'
valid_values
Char
compute='_compute_valid_values'
store=True
string='Valid values'
No public methods.
test
Many2one → qc.test
comodel_name='qc.test'
action_create_test(self)
active
Boolean
default=True
category
Many2one → qc.test.category
comodel_name='qc.test.category'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
fill_correct_values
Boolean
string='Pre-fill with correct values'
name
Char
required=True
translate=True
test_lines
One2many → qc.test.question
comodel_name='qc.test.question'
copy=True
inverse_name='test'
string='Questions'
No public methods.
active
Boolean
default=True
help='This field allows you to hide the category without removing it.'
child_ids
One2many → qc.test.category
comodel_name='qc.test.category'
inverse_name='parent_id'
string='Child categories'
complete_name
Char
compute='_compute_get_complete_name'
string='Full name'
name
Char
required=True
translate=True
parent_id
Many2one → qc.test.category
comodel_name='qc.test.category'
string='Parent category'
No public methods.
max_value
Float
digits='Quality Control'
string='Max'
min_value
Float
digits='Quality Control'
string='Min'
name
Char
required=True
translate=True
notes
Text
ql_values
One2many → qc.test.question.value
comodel_name='qc.test.question.value'
copy=True
inverse_name='test_line'
string='Qualitative values'
sequence
Integer
default='10'
required=True
test
Many2one → qc.test
comodel_name='qc.test'
type
Selection
required=True
args: [('qualitative', 'Qualitative'), ('quantitative', 'Quantitative')]
uom_id
Many2one → uom.uom
comodel_name='uom.uom'
string='Uom'
No public methods.
name
Char
required=True
translate=True
ok
Boolean
help='When this field is marked, the answer is considered correct.'
string='Correct answer?'
test_line
Many2one → qc.test.question
comodel_name='qc.test.question'
string='Test question'
No public methods.
active
Boolean
default=True
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
name
Char
required=True
translate=True
partner_selectable
Boolean
default=False
help='This technical field is to allow to filter by partner in triggers'
string='Selectable by partner'
No public methods.
partners
Many2many → res.partner
comodel_name='res.partner'
domain="[('parent_id', '=', False)]"
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.'
test
Many2one → qc.test
comodel_name='qc.test'
required=True
timing
Selection
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).'
selection=[('before', 'Before'), ('after', 'After'), ('plan_ahead', 'Plan Ahead')]
trigger
Many2one → qc.trigger
comodel_name='qc.trigger'
required=True
user
Many2one → res.users
comodel_name='res.users'
default=<expr>
string='Responsible'
tracking=True
get_trigger_line_for_product(self, trigger, timings, product, partner=False)
product_category
Many2one → product.category
comodel_name='product.category'
get_trigger_line_for_product(self, trigger, timings, product, partner=False)
product
Many2one → product.product
comodel_name='product.product'
get_trigger_line_for_product(self, trigger, timings, product, partner=False)
product_template
Many2one → product.template
comodel_name='product.template'
get_trigger_line_for_product(self, trigger, timings, product, partner=False)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/manufacture |
| GIT | |
| GIT | https://github.com/OCA/manufacture.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/manufacture/tree/17.0/quality_control_oca |
| VERSION | |
| VERSION | 1.5.0 |
| CATEGORY | |
| CATEGORY | Quality Control |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Tecnativa, Odoo Community Association (OCA), AvanzOSC |
| MAINTAINERS | |
| MAINTAINERS | Tecnativa, Odoo Community Association (OCA), AvanzOSC |
| COMMITTERS | |
| COMMITTERS | Weblate, OCA-git-bot, oca-ci, Rémi - Le Filament, LauraCForgeFlow, sygel, Antoni Marroig Campomar |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/manufacture |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 19:20:07 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - product - base - base_setup - web - bus - web_tour - uom |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | 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. |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
product_category_qc_form_view |
product.category.qc | product.category | group | Inherits product.product_category_form_view |
product_template_form_view |
product.template.common.qc | product.template | page | Inherits product.product_template_form_view |
qc_inspection_form_view |
qc.inspection.form | qc.inspection | form | New |
qc_inspection_line_search_view |
qc.inspection.line.search | qc.inspection.line | search | New |
qc_inspection_line_tree_view |
qc.inspection.line.tree | qc.inspection.line | tree | New |
qc_inspection_search_view |
qc.inspection.search | qc.inspection | search | New |
qc_inspection_tree_view |
qc.inspection.tree | qc.inspection | tree | New |
qc_test_category_tree_view |
qc.test.category.tree | qc.test.category | tree | New |
qc_test_form_view |
qc.test.form | qc.test | form | New |
qc_test_question_form_view |
qc.test.question.form | qc.test.question | form | New |
qc_test_tree_view |
qc.test.tree | qc.test | tree | New |
qc_trigger_form_view |
qc.trigger.form | qc.trigger | form | New |
qc_trigger_tree_view |
qc.trigger.tree | qc.trigger | tree | New |
view_qc_test_set_test_form |
qc.inspection.set.test.form | qc.inspection.set.test | form | New |
qc_triggers
One2many → qc.trigger.product_category_line
comodel_name='qc.trigger.product_category_line'
inverse_name='product_category'
string='Quality control triggers'
No public methods.
qc_triggers
One2many → qc.trigger.product_line
comodel_name='qc.trigger.product_line'
inverse_name='product'
string='Quality control triggers'
No public methods.
qc_triggers
One2many → qc.trigger.product_template_line
comodel_name='qc.trigger.product_template_line'
inverse_name='product_template'
string='Quality control triggers'
No public methods.
auto_generated
Boolean
copy=False
help='If an inspection is auto-generated, it can be canceled but not removed.'
string='Auto-generated'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
date
Datetime
copy=False
default=fields.Datetime.now
required=True
string='Plan Date'
date_done
Datetime
external_notes
Text
inspection_lines
One2many → qc.inspection.line
comodel_name='qc.inspection.line'
inverse_name='inspection_id'
internal_notes
Text
string='Internal notes'
name
Char
copy=False
default='/'
required=True
string='Inspection number'
object_id
Reference
ondelete='set null'
selection='object_selection_values'
string='Reference'
product_id
Many2one → product.product
comodel_name='product.product'
compute='_compute_product_id'
help='Product associated with the inspection'
store=True
qty
Float
default=1.0
string='Quantity'
state
Selection
default='draft'
tracking=True
args: [('plan', 'Plan'), ('draft', 'Draft'), ('ready', 'Ready'), ('waiting', 'Waiting supervisor approval'), ('success', 'Quality success'), ('failed', 'Quality failed'), ('canceled', 'Canceled')]
success
Boolean
compute='_compute_success'
help='This field will be marked if all tests have succeeded.'
store=True
test
Many2one → qc.test
comodel_name='qc.test'
user
Many2one → res.users
comodel_name='res.users'
default=<expr>
string='Responsible'
tracking=True
action_approve(self)
action_cancel(self)
action_confirm(self)
action_draft(self)
action_todo(self)
create(self, val_list)
object_selection_values(self)
set_test(self, trigger_line, force_fill=False)
unlink(self)
write(self, vals)
inspection_id
Many2one → qc.inspection
comodel_name='qc.inspection'
ondelete='cascade'
string='Inspection'
max_value
Float
digits='Quality Control'
help='Maximum valid value for a quantitative question.'
string='Max'
min_value
Float
digits='Quality Control'
help='Minimum valid value for a quantitative question.'
string='Min'
name
Char
string='Question'
notes
Text
possible_ql_values
Many2many → qc.test.question.value
comodel_name='qc.test.question.value'
string='Answers'
product_id
Many2one → product.product
comodel_name='product.product'
related='inspection_id.product_id'
store=True
qualitative_value
Many2one → qc.test.question.value
comodel_name='qc.test.question.value'
domain="[('id', 'in', possible_ql_values)]"
help='Value of the result for a qualitative question.'
string='Qualitative value'
quantitative_value
Float
digits='Quality Control'
help='Value of the result for a quantitative question.'
string='Quantitative value'
question_type
Selection
success
Boolean
compute='_compute_quality_test_check'
store=True
string='Success?'
test_line
Many2one → qc.test.question
comodel_name='qc.test.question'
string='Test question'
test_uom_category
Many2one → uom.category
comodel_name='uom.category'
related='test_uom_id.category_id'
store=True
test_uom_id
Many2one → uom.uom
comodel_name='uom.uom'
help='UoM for minimum and maximum values for a quantitative question.'
string='Test UoM'
uom_id
Many2one → uom.uom
comodel_name='uom.uom'
domain="[('category_id', '=', test_uom_category)]"
help='UoM of the inspection value for a quantitative question.'
string='UoM'
valid_values
Char
compute='_compute_valid_values'
store=True
string='Valid values'
No public methods.
test
Many2one → qc.test
comodel_name='qc.test'
action_create_test(self)
active
Boolean
default=True
category
Many2one → qc.test.category
comodel_name='qc.test.category'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
fill_correct_values
Boolean
string='Pre-fill with correct values'
name
Char
required=True
translate=True
test_lines
One2many → qc.test.question
comodel_name='qc.test.question'
copy=True
inverse_name='test'
string='Questions'
No public methods.
active
Boolean
default=True
help='This field allows you to hide the category without removing it.'
child_ids
One2many → qc.test.category
comodel_name='qc.test.category'
inverse_name='parent_id'
string='Child categories'
complete_name
Char
compute='_compute_get_complete_name'
string='Full name'
name
Char
required=True
translate=True
parent_id
Many2one → qc.test.category
comodel_name='qc.test.category'
string='Parent category'
No public methods.
max_value
Float
digits='Quality Control'
string='Max'
min_value
Float
digits='Quality Control'
string='Min'
name
Char
required=True
translate=True
notes
Text
ql_values
One2many → qc.test.question.value
comodel_name='qc.test.question.value'
copy=True
inverse_name='test_line'
string='Qualitative values'
sequence
Integer
default='10'
required=True
test
Many2one → qc.test
comodel_name='qc.test'
type
Selection
required=True
args: [('qualitative', 'Qualitative'), ('quantitative', 'Quantitative')]
uom_id
Many2one → uom.uom
comodel_name='uom.uom'
string='Uom'
No public methods.
name
Char
required=True
translate=True
ok
Boolean
help='When this field is marked, the answer is considered correct.'
string='Correct answer?'
test_line
Many2one → qc.test.question
comodel_name='qc.test.question'
string='Test question'
No public methods.
active
Boolean
default=True
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
name
Char
required=True
translate=True
partner_selectable
Boolean
default=False
help='This technical field is to allow to filter by partner in triggers'
string='Selectable by partner'
No public methods.
partners
Many2many → res.partner
comodel_name='res.partner'
domain="[('parent_id', '=', False)]"
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.'
test
Many2one → qc.test
comodel_name='qc.test'
required=True
timing
Selection
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).'
selection=[('before', 'Before'), ('after', 'After'), ('plan_ahead', 'Plan Ahead')]
trigger
Many2one → qc.trigger
comodel_name='qc.trigger'
required=True
user
Many2one → res.users
comodel_name='res.users'
default=<expr>
string='Responsible'
tracking=True
get_trigger_line_for_product(self, trigger, timings, product, partner=False)
product_category
Many2one → product.category
comodel_name='product.category'
get_trigger_line_for_product(self, trigger, timings, product, partner=False)
product
Many2one → product.product
comodel_name='product.product'
get_trigger_line_for_product(self, trigger, timings, product, partner=False)
product_template
Many2one → product.template
comodel_name='product.template'
get_trigger_line_for_product(self, trigger, timings, product, partner=False)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/manufacture |
| GIT | |
| GIT | https://github.com/OCA/manufacture.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/manufacture/tree/16.0/quality_control_oca |
| VERSION | |
| VERSION | 1.8.0 |
| CATEGORY | |
| CATEGORY | Quality Control |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Tecnativa, Odoo Community Association (OCA), AvanzOSC |
| MAINTAINERS | |
| MAINTAINERS | Tecnativa, Odoo Community Association (OCA), AvanzOSC |
| COMMITTERS | |
| COMMITTERS | Pedro M. Baeza, Víctor Martínez, Weblate, OCA-git-bot, Dimitrios T. Tanis, oca-ci, Ugaitz Olaizola, Stefano Consolaro, Aungkokolin1997, LauraCForgeFlow, Kev-Roche, anusrinps96, Alfredo |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/manufacture |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:53:50 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - product - base - base_setup - web - bus - web_tour - uom |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
product_category_qc_form_view |
product.category.qc | product.category | group | Inherits product.product_category_form_view |
product_template_form_view |
product.template.common.qc | product.template | page | Inherits product.product_template_form_view |
qc_inspection_form_view |
qc.inspection.form | qc.inspection | form | New |
qc_inspection_kanban_view |
qc.inspection.kanban | qc.inspection | kanban | New |
qc_inspection_line_kanban_view |
qc.inspection.line.kanban | qc.inspection.line | kanban | New |
qc_inspection_line_search_view |
qc.inspection.line.search | qc.inspection.line | search | New |
qc_inspection_line_tree_view |
qc.inspection.line.tree | qc.inspection.line | tree | New |
qc_inspection_search_view |
qc.inspection.search | qc.inspection | search | New |
qc_inspection_tree_view |
qc.inspection.tree | qc.inspection | tree | New |
qc_test_category_tree_view |
qc.test.category.tree | qc.test.category | tree | New |
qc_test_form_view |
qc.test.form | qc.test | form | New |
qc_test_question_form_view |
qc.test.question.form | qc.test.question | form | New |
qc_test_tree_view |
qc.test.tree | qc.test | tree | New |
qc_trigger_form_view |
qc.trigger.form | qc.trigger | form | New |
qc_trigger_tree_view |
qc.trigger.tree | qc.trigger | tree | New |
view_qc_test_set_test_form |
qc.inspection.set.test.form | qc.inspection.set.test | form | New |
qc_triggers
One2many → qc.trigger.product_category_line
comodel_name='qc.trigger.product_category_line'
inverse_name='product_category'
string='Quality control triggers'
No public methods.
qc_triggers
One2many → qc.trigger.product_line
comodel_name='qc.trigger.product_line'
inverse_name='product'
string='Quality control triggers'
No public methods.
qc_triggers
One2many → qc.trigger.product_template_line
comodel_name='qc.trigger.product_template_line'
inverse_name='product_template'
string='Quality control triggers'
No public methods.
auto_generated
Boolean
copy=False
help='If an inspection is auto-generated, it can be canceled but not removed.'
readonly=True
string='Auto-generated'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
readonly=True
states={'draft': [('readonly', False)]}
string='Company'
date
Datetime
copy=False
default=fields.Datetime.now
readonly=True
required=True
states={'plan': [('readonly', False)], 'draft': [('readonly', False)]}
string='Plan Date'
date_done
Datetime
readonly=True
args: 'Completion Date'
external_notes
Text
states={'success': [('readonly', True)], 'failed': [('readonly', True)]}
inspection_lines
One2many → qc.inspection.line
comodel_name='qc.inspection.line'
inverse_name='inspection_id'
readonly=True
states={'ready': [('readonly', False)]}
internal_notes
Text
string='Internal notes'
name
Char
copy=False
default='/'
readonly=True
required=True
states={'draft': [('readonly', False)]}
string='Inspection number'
object_id
Reference
ondelete='set null'
readonly=True
selection='object_selection_values'
states={'draft': [('readonly', False)]}
string='Reference'
product_id
Many2one → product.product
comodel_name='product.product'
compute='_compute_product_id'
help='Product associated with the inspection'
store=True
product_image
Image
related='product_id.image_1920'
string='Product Image'
qty
Float
default=1.0
string='Quantity'
state
Selection
default='draft'
readonly=True
tracking=True
args: [('plan', 'Plan'), ('draft', 'Draft'), ('ready', 'Ready'), ('waiting', 'Waiting supervisor approval'), ('success', 'Quality success'), ('failed', 'Quality failed'), ('canceled', 'Canceled')]
success
Boolean
compute='_compute_success'
help='This field will be marked if all tests have succeeded.'
store=True
test
Many2one → qc.test
comodel_name='qc.test'
readonly=True
user
Many2one → res.users
comodel_name='res.users'
default=<expr>
string='Responsible'
tracking=True
action_approve(self)
action_cancel(self)
action_confirm(self)
action_draft(self)
action_todo(self)
create(self, vals_list)
object_selection_values(self)
set_test(self, trigger_line, force_fill=False)
write(self, vals)
inspection_id
Many2one → qc.inspection
comodel_name='qc.inspection'
ondelete='cascade'
string='Inspection'
max_value
Float
digits='Quality Control'
help='Maximum valid value for a quantitative question.'
readonly=True
string='Max'
min_value
Float
digits='Quality Control'
help='Minimum valid value for a quantitative question.'
readonly=True
string='Min'
name
Char
readonly=True
string='Question'
notes
Text
possible_ql_values
Many2many → qc.test.question.value
comodel_name='qc.test.question.value'
string='Answers'
product_id
Many2one → product.product
comodel_name='product.product'
related='inspection_id.product_id'
store=True
qualitative_value
Many2one → qc.test.question.value
comodel_name='qc.test.question.value'
domain="[('id', 'in', possible_ql_values)]"
help='Value of the result for a qualitative question.'
string='Qualitative value'
quantitative_value
Float
digits='Quality Control'
help='Value of the result for a quantitative question.'
string='Quantitative value'
question_type
Selection
readonly=True
args: [('qualitative', 'Qualitative'), ('quantitative', 'Quantitative')]
success
Boolean
compute='_compute_quality_test_check'
store=True
string='Success?'
test_line
Many2one → qc.test.question
comodel_name='qc.test.question'
readonly=True
string='Test question'
test_uom_category
Many2one → uom.category
comodel_name='uom.category'
related='test_uom_id.category_id'
store=True
test_uom_id
Many2one → uom.uom
comodel_name='uom.uom'
help='UoM for minimum and maximum values for a quantitative question.'
readonly=True
string='Test UoM'
uom_id
Many2one → uom.uom
comodel_name='uom.uom'
domain="[('category_id', '=', test_uom_category)]"
help='UoM of the inspection value for a quantitative question.'
string='UoM'
valid_values
Char
compute='_compute_valid_values'
store=True
string='Valid values'
No public methods.
test
Many2one → qc.test
comodel_name='qc.test'
action_create_test(self)
active
Boolean
default=True
category
Many2one → qc.test.category
comodel_name='qc.test.category'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
fill_correct_values
Boolean
string='Pre-fill with correct values'
name
Char
required=True
translate=True
object_id
Reference
selection='object_selection_values'
string='Reference object'
test_lines
One2many → qc.test.question
comodel_name='qc.test.question'
copy=True
inverse_name='test'
string='Questions'
type
Selection
default='generic'
required=True
args: [('generic', 'Generic'), ('related', 'Related')]
object_selection_values(self)
onchange_type(self)
active
Boolean
default=True
help='This field allows you to hide the category without removing it.'
child_ids
One2many → qc.test.category
comodel_name='qc.test.category'
inverse_name='parent_id'
string='Child categories'
complete_name
Char
compute='_compute_get_complete_name'
string='Full name'
name
Char
required=True
translate=True
parent_id
Many2one → qc.test.category
comodel_name='qc.test.category'
string='Parent category'
No public methods.
max_value
Float
digits='Quality Control'
string='Max'
min_value
Float
digits='Quality Control'
string='Min'
name
Char
required=True
translate=True
notes
Text
ql_values
One2many → qc.test.question.value
comodel_name='qc.test.question.value'
copy=True
inverse_name='test_line'
string='Qualitative values'
sequence
Integer
default='10'
required=True
test
Many2one → qc.test
comodel_name='qc.test'
type
Selection
required=True
args: [('qualitative', 'Qualitative'), ('quantitative', 'Quantitative')]
uom_id
Many2one → uom.uom
comodel_name='uom.uom'
string='Uom'
No public methods.
name
Char
required=True
translate=True
ok
Boolean
help='When this field is marked, the answer is considered correct.'
string='Correct answer?'
test_line
Many2one → qc.test.question
comodel_name='qc.test.question'
string='Test question'
No public methods.
active
Boolean
default=True
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
name
Char
required=True
translate=True
partner_selectable
Boolean
default=False
help='This technical field is to allow to filter by partner in triggers'
readonly=True
string='Selectable by partner'
No public methods.
partners
Many2many → res.partner
comodel_name='res.partner'
domain="[('parent_id', '=', False)]"
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.'
test
Many2one → qc.test
comodel_name='qc.test'
required=True
timing
Selection
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).'
selection=[('before', 'Before'), ('after', 'After'), ('plan_ahead', 'Plan Ahead')]
trigger
Many2one → qc.trigger
comodel_name='qc.trigger'
required=True
user
Many2one → res.users
comodel_name='res.users'
default=<expr>
string='Responsible'
tracking=True
get_trigger_line_for_product(self, trigger, timings, product, partner=False)
get_trigger_line_models(self)
product_category
Many2one → product.category
comodel_name='product.category'
get_trigger_line_for_product(self, trigger, timings, product, partner=False)
product
Many2one → product.product
comodel_name='product.product'
get_trigger_line_for_product(self, trigger, timings, product, partner=False)
product_template
Many2one → product.template
comodel_name='product.template'
get_trigger_line_for_product(self, trigger, timings, product, partner=False)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/manufacture |
| GIT | |
| GIT | https://github.com/OCA/manufacture.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/manufacture/tree/15.0/quality_control_oca |
| VERSION | |
| VERSION | 1.0.0 |
| CATEGORY | |
| CATEGORY | Quality Control |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Tecnativa, Odoo Community Association (OCA), AvanzOSC |
| MAINTAINERS | |
| MAINTAINERS | Tecnativa, Odoo Community Association (OCA), AvanzOSC |
| COMMITTERS | |
| COMMITTERS | Weblate, OCA-git-bot, oca-ci, Stefano Consolaro |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/manufacture |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:46:36 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - product - base - base_setup - web - bus - web_tour - uom |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
product_category_qc_form_view |
product.category.qc | product.category | group | Inherits product.product_category_form_view |
product_template_form_view |
product.template.common.qc | product.template | page | Inherits product.product_template_form_view |
qc_inspection_form_view |
qc.inspection.form | qc.inspection | form | New |
qc_inspection_line_search_view |
qc.inspection.line.search | qc.inspection.line | search | New |
qc_inspection_line_tree_view |
qc.inspection.line.tree | qc.inspection.line | tree | New |
qc_inspection_search_view |
qc.inspection.search | qc.inspection | search | New |
qc_inspection_tree_view |
qc.inspection.tree | qc.inspection | tree | New |
qc_test_category_tree_view |
qc.test.category.tree | qc.test.category | tree | New |
qc_test_form_view |
qc.test.form | qc.test | form | New |
qc_test_question_form_view |
qc.test.question.form | qc.test.question | form | New |
qc_test_tree_view |
qc.test.tree | qc.test | tree | New |
qc_trigger_form_view |
qc.trigger.form | qc.trigger | form | New |
qc_trigger_tree_view |
qc.trigger.tree | qc.trigger | tree | New |
view_qc_test_set_test_form |
qc.inspection.set.test.form | qc.inspection.set.test | form | New |
qc_triggers
One2many → qc.trigger.product_category_line
comodel_name='qc.trigger.product_category_line'
inverse_name='product_category'
string='Quality control triggers'
No public methods.
qc_triggers
One2many → qc.trigger.product_line
comodel_name='qc.trigger.product_line'
inverse_name='product'
string='Quality control triggers'
No public methods.
qc_triggers
One2many → qc.trigger.product_template_line
comodel_name='qc.trigger.product_template_line'
inverse_name='product_template'
string='Quality control triggers'
No public methods.
auto_generated
Boolean
copy=False
help='If an inspection is auto-generated, it can be canceled but not removed.'
readonly=True
string='Auto-generated'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
readonly=True
states={'draft': [('readonly', False)]}
string='Company'
date
Datetime
copy=False
default=fields.Datetime.now
readonly=True
required=True
states={'draft': [('readonly', False)]}
external_notes
Text
states={'success': [('readonly', True)], 'failed': [('readonly', True)]}
inspection_lines
One2many → qc.inspection.line
comodel_name='qc.inspection.line'
inverse_name='inspection_id'
readonly=True
states={'ready': [('readonly', False)]}
internal_notes
Text
string='Internal notes'
name
Char
copy=False
default='/'
readonly=True
required=True
states={'draft': [('readonly', False)]}
string='Inspection number'
object_id
Reference
ondelete='set null'
readonly=True
selection='object_selection_values'
states={'draft': [('readonly', False)]}
string='Reference'
product_id
Many2one → product.product
comodel_name='product.product'
compute='_compute_product_id'
help='Product associated with the inspection'
store=True
qty
Float
default=1.0
string='Quantity'
state
Selection
default='draft'
readonly=True
tracking=True
args: [('draft', 'Draft'), ('ready', 'Ready'), ('waiting', 'Waiting supervisor approval'), ('success', 'Quality success'), ('failed', 'Quality failed'), ('canceled', 'Canceled')]
success
Boolean
compute='_compute_success'
help='This field will be marked if all tests have succeeded.'
store=True
test
Many2one → qc.test
comodel_name='qc.test'
readonly=True
user
Many2one → res.users
comodel_name='res.users'
default=<expr>
string='Responsible'
tracking=True
action_approve(self)
action_cancel(self)
action_confirm(self)
action_draft(self)
action_todo(self)
create(self, val_list)
object_selection_values(self)
set_test(self, trigger_line, force_fill=False)
unlink(self)
inspection_id
Many2one → qc.inspection
comodel_name='qc.inspection'
ondelete='cascade'
string='Inspection'
max_value
Float
digits='Quality Control'
help='Maximum valid value for a quantitative question.'
readonly=True
string='Max'
min_value
Float
digits='Quality Control'
help='Minimum valid value for a quantitative question.'
readonly=True
string='Min'
name
Char
readonly=True
string='Question'
notes
Text
possible_ql_values
Many2many → qc.test.question.value
comodel_name='qc.test.question.value'
string='Answers'
product_id
Many2one → product.product
comodel_name='product.product'
related='inspection_id.product_id'
store=True
qualitative_value
Many2one → qc.test.question.value
comodel_name='qc.test.question.value'
domain="[('id', 'in', possible_ql_values)]"
help='Value of the result for a qualitative question.'
string='Qualitative value'
quantitative_value
Float
digits='Quality Control'
help='Value of the result for a quantitative question.'
string='Quantitative value'
question_type
Selection
readonly=True
args: [('qualitative', 'Qualitative'), ('quantitative', 'Quantitative')]
success
Boolean
compute='_compute_quality_test_check'
store=True
string='Success?'
test_line
Many2one → qc.test.question
comodel_name='qc.test.question'
readonly=True
string='Test question'
test_uom_category
Many2one → uom.category
comodel_name='uom.category'
related='test_uom_id.category_id'
store=True
test_uom_id
Many2one → uom.uom
comodel_name='uom.uom'
help='UoM for minimum and maximum values for a quantitative question.'
readonly=True
string='Test UoM'
uom_id
Many2one → uom.uom
comodel_name='uom.uom'
domain="[('category_id', '=', test_uom_category)]"
help='UoM of the inspection value for a quantitative question.'
string='UoM'
valid_values
Char
compute='_compute_valid_values'
store=True
string='Valid values'
No public methods.
test
Many2one → qc.test
comodel_name='qc.test'
action_create_test(self)
active
Boolean
default=True
category
Many2one → qc.test.category
comodel_name='qc.test.category'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
fill_correct_values
Boolean
string='Pre-fill with correct values'
name
Char
required=True
translate=True
object_id
Reference
selection='object_selection_values'
string='Reference object'
test_lines
One2many → qc.test.question
comodel_name='qc.test.question'
copy=True
inverse_name='test'
string='Questions'
type
Selection
default='generic'
required=True
args: [('generic', 'Generic'), ('related', 'Related')]
object_selection_values(self)
onchange_type(self)
active
Boolean
default=True
help='This field allows you to hide the category without removing it.'
child_ids
One2many → qc.test.category
comodel_name='qc.test.category'
inverse_name='parent_id'
string='Child categories'
complete_name
Char
compute='_compute_get_complete_name'
string='Full name'
name
Char
required=True
translate=True
parent_id
Many2one → qc.test.category
comodel_name='qc.test.category'
string='Parent category'
No public methods.
max_value
Float
digits='Quality Control'
string='Max'
min_value
Float
digits='Quality Control'
string='Min'
name
Char
required=True
translate=True
notes
Text
ql_values
One2many → qc.test.question.value
comodel_name='qc.test.question.value'
copy=True
inverse_name='test_line'
string='Qualitative values'
sequence
Integer
default='10'
required=True
test
Many2one → qc.test
comodel_name='qc.test'
type
Selection
required=True
args: [('qualitative', 'Qualitative'), ('quantitative', 'Quantitative')]
uom_id
Many2one → uom.uom
comodel_name='uom.uom'
string='Uom'
No public methods.
name
Char
required=True
translate=True
ok
Boolean
help='When this field is marked, the answer is considered correct.'
string='Correct answer?'
test_line
Many2one → qc.test.question
comodel_name='qc.test.question'
string='Test question'
No public methods.
active
Boolean
default=True
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
name
Char
required=True
translate=True
partner_selectable
Boolean
default=False
help='This technical field is to allow to filter by partner in triggers'
readonly=True
string='Selectable by partner'
No public methods.
partners
Many2many → res.partner
comodel_name='res.partner'
domain="[('parent_id', '=', False)]"
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.'
test
Many2one → qc.test
comodel_name='qc.test'
required=True
trigger
Many2one → qc.trigger
comodel_name='qc.trigger'
required=True
user
Many2one → res.users
comodel_name='res.users'
default=<expr>
string='Responsible'
tracking=True
get_trigger_line_for_product(self, trigger, product, partner=False)
product_category
Many2one → product.category
comodel_name='product.category'
get_trigger_line_for_product(self, trigger, product, partner=False)
product
Many2one → product.product
comodel_name='product.product'
get_trigger_line_for_product(self, trigger, product, partner=False)
product_template
Many2one → product.template
comodel_name='product.template'
get_trigger_line_for_product(self, trigger, product, partner=False)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/manufacture |
| GIT | |
| GIT | https://github.com/OCA/manufacture.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/manufacture/tree/14.0/quality_control_oca |
| VERSION | |
| VERSION | 1.4.2 |
| CATEGORY | |
| CATEGORY | Quality Control |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Tecnativa, Odoo Community Association (OCA), AvanzOSC |
| MAINTAINERS | |
| MAINTAINERS | Tecnativa, Odoo Community Association (OCA), AvanzOSC |
| COMMITTERS | |
| COMMITTERS | Pedro M. Baeza, cubells, OCA Transbot, AaronHForgeFlow, oca-travis, Weblate, OCA-git-bot, oca-ci, Enrique Martín, Alessandro Uffreduzzi |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/manufacture |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:41:03 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - product - base - base_setup - web - bus - web_tour - uom |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
product_category_qc_form_view |
product.category.qc | product.category | group | Inherits product.product_category_form_view |
product_template_form_view |
product.template.common.qc | product.template | page | Inherits product.product_template_form_view |
qc_inspection_form_view |
qc.inspection.form | qc.inspection | form | New |
qc_inspection_line_search_view |
qc.inspection.line.search | qc.inspection.line | search | New |
qc_inspection_line_tree_view |
qc.inspection.line.tree | qc.inspection.line | tree | New |
qc_inspection_search_view |
qc.inspection.search | qc.inspection | search | New |
qc_inspection_tree_view |
qc.inspection.tree | qc.inspection | tree | New |
qc_test_category_tree_view |
qc.test.category.tree | qc.test.category | tree | New |
qc_test_form_view |
qc.test.form | qc.test | form | New |
qc_test_question_form_view |
qc.test.question.form | qc.test.question | form | New |
qc_test_tree_view |
qc.test.tree | qc.test | tree | New |
qc_trigger_form_view |
qc.trigger.form | qc.trigger | form | New |
qc_trigger_tree_view |
qc.trigger.tree | qc.trigger | tree | New |
view_qc_test_set_test_form |
qc.inspection.set.test.form | qc.inspection.set.test | form | New |
qc_triggers
One2many → qc.trigger.product_category_line
comodel_name='qc.trigger.product_category_line'
inverse_name='product_category'
string='Quality control triggers'
No public methods.
qc_triggers
One2many → qc.trigger.product_line
comodel_name='qc.trigger.product_line'
inverse_name='product'
string='Quality control triggers'
No public methods.
qc_triggers
One2many → qc.trigger.product_template_line
comodel_name='qc.trigger.product_template_line'
inverse_name='product_template'
string='Quality control triggers'
No public methods.
auto_generated
Boolean
copy=False
help='If an inspection is auto-generated, it can be canceled but not removed.'
readonly=True
string='Auto-generated'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
readonly=True
states={'draft': [('readonly', False)]}
string='Company'
date
Datetime
copy=False
default=fields.Datetime.now
readonly=True
required=True
states={'draft': [('readonly', False)]}
string='Date'
external_notes
Text
states={'success': [('readonly', True)], 'failed': [('readonly', True)]}
string='External notes'
inspection_lines
One2many → qc.inspection.line
comodel_name='qc.inspection.line'
inverse_name='inspection_id'
readonly=True
states={'ready': [('readonly', False)]}
string='Inspection lines'
internal_notes
Text
string='Internal notes'
name
Char
copy=False
default='/'
readonly=True
required=True
states={'draft': [('readonly', False)]}
string='Inspection number'
object_id
Reference
ondelete='set null'
readonly=True
selection='object_selection_values'
states={'draft': [('readonly', False)]}
string='Reference'
product_id
Many2one → product.product
comodel_name='product.product'
compute='_compute_product_id'
help='Product associated with the inspection'
store=True
qty
Float
default=1.0
string='Quantity'
state
Selection
default='draft'
readonly=True
string='State'
tracking=True
args: [('draft', 'Draft'), ('ready', 'Ready'), ('waiting', 'Waiting supervisor approval'), ('success', 'Quality success'), ('failed', 'Quality failed'), ('canceled', 'Canceled')]
success
Boolean
compute='_compute_success'
help='This field will be marked if all tests have succeeded.'
store=True
string='Success'
test
Many2one → qc.test
comodel_name='qc.test'
readonly=True
string='Test'
user
Many2one → res.users
comodel_name='res.users'
default=<expr>
string='Responsible'
tracking=True
action_approve(self)
action_cancel(self)
action_confirm(self)
action_draft(self)
action_todo(self)
create(self, val_list)
object_selection_values(self)
set_test(self, trigger_line, force_fill=False)
unlink(self)
inspection_id
Many2one → qc.inspection
comodel_name='qc.inspection'
ondelete='cascade'
string='Inspection'
max_value
Float
digits='Quality Control'
help='Maximum valid value for a quantitative question.'
readonly=True
string='Max'
min_value
Float
digits='Quality Control'
help='Minimum valid value for a quantitative question.'
readonly=True
string='Min'
name
Char
readonly=True
string='Question'
notes
Text
string='Notes'
possible_ql_values
Many2many → qc.test.question.value
comodel_name='qc.test.question.value'
string='Answers'
product_id
Many2one → product.product
comodel_name='product.product'
related='inspection_id.product_id'
store=True
qualitative_value
Many2one → qc.test.question.value
comodel_name='qc.test.question.value'
domain="[('id', 'in', possible_ql_values)]"
help='Value of the result for a qualitative question.'
string='Qualitative value'
quantitative_value
Float
digits='Quality Control'
help='Value of the result for a quantitative question.'
string='Quantitative value'
question_type
Selection
readonly=True
string='Question type'
args: [('qualitative', 'Qualitative'), ('quantitative', 'Quantitative')]
success
Boolean
compute='_compute_quality_test_check'
store=True
string='Success?'
test_line
Many2one → qc.test.question
comodel_name='qc.test.question'
readonly=True
string='Test question'
test_uom_category
Many2one → uom.category
comodel_name='uom.category'
related='test_uom_id.category_id'
store=True
test_uom_id
Many2one → uom.uom
comodel_name='uom.uom'
help='UoM for minimum and maximum values for a quantitative question.'
readonly=True
string='Test UoM'
uom_id
Many2one → uom.uom
comodel_name='uom.uom'
domain="[('category_id', '=', test_uom_category)]"
help='UoM of the inspection value for a quantitative question.'
string='UoM'
valid_values
Char
compute='_compute_valid_values'
store=True
string='Valid values'
No public methods.
test
Many2one → qc.test
comodel_name='qc.test'
string='Test'
action_create_test(self)
active
Boolean
default=True
args: 'Active'
category
Many2one → qc.test.category
comodel_name='qc.test.category'
string='Category'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
fill_correct_values
Boolean
string='Pre-fill with correct values'
name
Char
required=True
string='Name'
translate=True
object_id
Reference
selection='object_selection_values'
string='Reference object'
test_lines
One2many → qc.test.question
comodel_name='qc.test.question'
copy=True
inverse_name='test'
string='Questions'
type
Selection
default='generic'
required=True
string='Type'
args: [('generic', 'Generic'), ('related', 'Related')]
object_selection_values(self)
onchange_type(self)
active
Boolean
default=True
help='This field allows you to hide the category without removing it.'
string='Active'
child_ids
One2many → qc.test.category
comodel_name='qc.test.category'
inverse_name='parent_id'
string='Child categories'
complete_name
Char
compute='_compute_get_complete_name'
string='Full name'
name
Char
required=True
translate=True
args: 'Name'
parent_id
Many2one → qc.test.category
comodel_name='qc.test.category'
string='Parent category'
No public methods.
max_value
Float
digits='Quality Control'
string='Max'
min_value
Float
digits='Quality Control'
string='Min'
name
Char
required=True
string='Name'
translate=True
notes
Text
string='Notes'
ql_values
One2many → qc.test.question.value
comodel_name='qc.test.question.value'
copy=True
inverse_name='test_line'
string='Qualitative values'
sequence
Integer
default='10'
required=True
string='Sequence'
test
Many2one → qc.test
comodel_name='qc.test'
string='Test'
type
Selection
required=True
string='Type'
args: [('qualitative', 'Qualitative'), ('quantitative', 'Quantitative')]
uom_id
Many2one → uom.uom
comodel_name='uom.uom'
string='Uom'
No public methods.
name
Char
required=True
string='Name'
translate=True
ok
Boolean
help='When this field is marked, the answer is considered correct.'
string='Correct answer?'
test_line
Many2one → qc.test.question
comodel_name='qc.test.question'
string='Test question'
No public methods.
active
Boolean
default=True
string='Active'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
name
Char
required=True
string='Name'
translate=True
partner_selectable
Boolean
default=False
help='This technical field is to allow to filter by partner in triggers'
readonly=True
string='Selectable by partner'
No public methods.
partners
Many2many → res.partner
comodel_name='res.partner'
domain="[('parent_id', '=', False)]"
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.'
string='Partners'
test
Many2one → qc.test
comodel_name='qc.test'
required=True
trigger
Many2one → qc.trigger
comodel_name='qc.trigger'
required=True
user
Many2one → res.users
comodel_name='res.users'
default=<expr>
string='Responsible'
tracking=True
get_trigger_line_for_product(self, trigger, product, partner=False)
product_category
Many2one → product.category
comodel_name='product.category'
get_trigger_line_for_product(self, trigger, product, partner=False)
product
Many2one → product.product
comodel_name='product.product'
get_trigger_line_for_product(self, trigger, product, partner=False)
product_template
Many2one → product.template
comodel_name='product.template'
get_trigger_line_for_product(self, trigger, product, partner=False)
| REPOSITORY | |
|---|---|
| REPOSITORY | OCA/manufacture |
| GIT | |
| GIT | https://github.com/OCA/manufacture.git |
| GIT FOLDER | |
| GIT FOLDER | https://github.com/OCA/manufacture/tree/13.0/quality_control_oca |
| VERSION | |
| VERSION | 2.2.0 |
| CATEGORY | |
| CATEGORY | Quality Control |
| LICENSE | |
| LICENSE | AGPL-3 |
| APPLICATION | |
| APPLICATION | No |
| AUTO-INSTALLABLE | |
| AUTO-INSTALLABLE | No |
| AUTHORS | |
| AUTHORS | Tecnativa, Odoo Community Association (OCA), AvanzOSC |
| MAINTAINERS | |
| MAINTAINERS | Tecnativa, Odoo Community Association (OCA), AvanzOSC |
| COMMITTERS | |
| COMMITTERS | Pedro M. Baeza, GitHub, cubells, OCA Transbot, Víctor Martínez, oca-travis, Weblate, OCA-git-bot, oca-ci, Carlos Roca |
| WEBSITE | |
| WEBSITE | https://github.com/OCA/manufacture |
| LAST TRACKING UPDATE | |
| LAST TRACKING UPDATE | 2026-07-06 00:34:15 |
| ODOO DEPENDENCIES | |
| ODOO DEPENDENCIES |
odoo/odoo: - product - base - base_setup - web - bus - web_tour - uom |
| PYTHON DEPENDENCIES | |
| PYTHON DEPENDENCIES | Not have |
| SYSTEM DEPENDENCIES | |
| SYSTEM DEPENDENCIES | Not have |
| DESCRIPTION | |
| DESCRIPTION | |
| XML ID | Name | Model | Type | Status |
|---|---|---|---|---|
product_category_qc_form_view |
product.category.qc | product.category | group | Inherits product.product_category_form_view |
product_template_form_view |
product.template.common.qc | product.template | page | Inherits product.product_template_form_view |
qc_inspection_form_view |
qc.inspection.form | qc.inspection | form | New |
qc_inspection_line_search_view |
qc.inspection.line.search | qc.inspection.line | search | New |
qc_inspection_line_tree_view |
qc.inspection.line.tree | qc.inspection.line | tree | New |
qc_inspection_search_view |
qc.inspection.search | qc.inspection | search | New |
qc_inspection_tree_view |
qc.inspection.tree | qc.inspection | tree | New |
qc_test_category_tree_view |
qc.test.category.tree | qc.test.category | tree | New |
qc_test_form_view |
qc.test.form | qc.test | form | New |
qc_test_question_form_view |
qc.test.question.form | qc.test.question | form | New |
qc_test_tree_view |
qc.test.tree | qc.test | tree | New |
qc_trigger_form_view |
qc.trigger.form | qc.trigger | form | New |
qc_trigger_tree_view |
qc.trigger.tree | qc.trigger | tree | New |
view_qc_test_set_test_form |
qc.inspection.set.test.form | qc.inspection.set.test | form | New |
qc_triggers
One2many → qc.trigger.product_category_line
comodel_name='qc.trigger.product_category_line'
inverse_name='product_category'
string='Quality control triggers'
No public methods.
qc_triggers
One2many → qc.trigger.product_line
comodel_name='qc.trigger.product_line'
inverse_name='product'
string='Quality control triggers'
No public methods.
qc_triggers
One2many → qc.trigger.product_template_line
comodel_name='qc.trigger.product_template_line'
inverse_name='product_template'
string='Quality control triggers'
No public methods.
auto_generated
Boolean
copy=False
help='If an inspection is auto-generated, it can be canceled but not removed.'
readonly=True
string='Auto-generated'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
readonly=True
states={'draft': [('readonly', False)]}
string='Company'
date
Datetime
copy=False
default=fields.Datetime.now
readonly=True
required=True
states={'draft': [('readonly', False)]}
string='Date'
external_notes
Text
states={'success': [('readonly', True)], 'failed': [('readonly', True)]}
string='External notes'
inspection_lines
One2many → qc.inspection.line
comodel_name='qc.inspection.line'
inverse_name='inspection_id'
readonly=True
states={'ready': [('readonly', False)]}
string='Inspection lines'
internal_notes
Text
string='Internal notes'
name
Char
copy=False
default='/'
readonly=True
required=True
states={'draft': [('readonly', False)]}
string='Inspection number'
object_id
Reference
ondelete='set null'
readonly=True
selection='object_selection_values'
states={'draft': [('readonly', False)]}
string='Reference'
product_id
Many2one → product.product
comodel_name='product.product'
compute='_compute_product_id'
help='Product associated with the inspection'
store=True
qty
Float
default=1.0
string='Quantity'
state
Selection
default='draft'
readonly=True
string='State'
tracking=True
args: [('draft', 'Draft'), ('ready', 'Ready'), ('waiting', 'Waiting supervisor approval'), ('success', 'Quality success'), ('failed', 'Quality failed'), ('canceled', 'Canceled')]
success
Boolean
compute='_compute_success'
help='This field will be marked if all tests have succeeded.'
store=True
string='Success'
test
Many2one → qc.test
comodel_name='qc.test'
readonly=True
string='Test'
user
Many2one → res.users
comodel_name='res.users'
default=<expr>
string='Responsible'
tracking=True
action_approve(self)
action_cancel(self)
action_confirm(self)
action_draft(self)
action_todo(self)
create(self, val_list)
object_selection_values(self)
set_test(self, trigger_line, force_fill=False)
unlink(self)
inspection_id
Many2one → qc.inspection
comodel_name='qc.inspection'
ondelete='cascade'
string='Inspection'
max_value
Float
digits='Quality Control'
help='Maximum valid value for a quantitative question.'
readonly=True
string='Max'
min_value
Float
digits='Quality Control'
help='Minimum valid value for a quantitative question.'
readonly=True
string='Min'
name
Char
readonly=True
string='Question'
notes
Text
string='Notes'
possible_ql_values
Many2many → qc.test.question.value
comodel_name='qc.test.question.value'
string='Answers'
product_id
Many2one → product.product
comodel_name='product.product'
related='inspection_id.product_id'
store=True
qualitative_value
Many2one → qc.test.question.value
comodel_name='qc.test.question.value'
domain="[('id', 'in', possible_ql_values)]"
help='Value of the result for a qualitative question.'
string='Qualitative value'
quantitative_value
Float
digits='Quality Control'
help='Value of the result for a quantitative question.'
string='Quantitative value'
question_type
Selection
readonly=True
string='Question type'
args: [('qualitative', 'Qualitative'), ('quantitative', 'Quantitative')]
success
Boolean
compute='_compute_quality_test_check'
store=True
string='Success?'
test_line
Many2one → qc.test.question
comodel_name='qc.test.question'
readonly=True
string='Test question'
test_uom_category
Many2one → uom.category
comodel_name='uom.category'
related='test_uom_id.category_id'
store=True
test_uom_id
Many2one → uom.uom
comodel_name='uom.uom'
help='UoM for minimum and maximum values for a quantitative question.'
readonly=True
string='Test UoM'
uom_id
Many2one → uom.uom
comodel_name='uom.uom'
domain="[('category_id', '=', test_uom_category)]"
help='UoM of the inspection value for a quantitative question.'
string='UoM'
valid_values
Char
compute='_compute_valid_values'
store=True
string='Valid values'
No public methods.
test
Many2one → qc.test
comodel_name='qc.test'
string='Test'
action_create_test(self)
active
Boolean
default=True
args: 'Active'
category
Many2one → qc.test.category
comodel_name='qc.test.category'
string='Category'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
fill_correct_values
Boolean
string='Pre-fill with correct values'
name
Char
required=True
string='Name'
translate=True
test_lines
One2many → qc.test.question
comodel_name='qc.test.question'
copy=True
inverse_name='test'
string='Questions'
No public methods.
active
Boolean
default=True
help='This field allows you to hide the category without removing it.'
string='Active'
child_ids
One2many → qc.test.category
comodel_name='qc.test.category'
inverse_name='parent_id'
string='Child categories'
complete_name
Char
compute='_compute_get_complete_name'
string='Full name'
name
Char
required=True
translate=True
args: 'Name'
parent_id
Many2one → qc.test.category
comodel_name='qc.test.category'
string='Parent category'
No public methods.
max_value
Float
digits='Quality Control'
string='Max'
min_value
Float
digits='Quality Control'
string='Min'
name
Char
required=True
string='Name'
translate=True
notes
Text
string='Notes'
ql_values
One2many → qc.test.question.value
comodel_name='qc.test.question.value'
copy=True
inverse_name='test_line'
string='Qualitative values'
sequence
Integer
default='10'
required=True
string='Sequence'
test
Many2one → qc.test
comodel_name='qc.test'
string='Test'
type
Selection
required=True
string='Type'
args: [('qualitative', 'Qualitative'), ('quantitative', 'Quantitative')]
uom_id
Many2one → uom.uom
comodel_name='uom.uom'
string='Uom'
No public methods.
name
Char
required=True
string='Name'
translate=True
ok
Boolean
help='When this field is marked, the answer is considered correct.'
string='Correct answer?'
test_line
Many2one → qc.test.question
comodel_name='qc.test.question'
string='Test question'
No public methods.
active
Boolean
default=True
string='Active'
company_id
Many2one → res.company
comodel_name='res.company'
default=<expr>
string='Company'
name
Char
required=True
string='Name'
translate=True
partner_selectable
Boolean
default=False
help='This technical field is to allow to filter by partner in triggers'
readonly=True
string='Selectable by partner'
No public methods.
partners
Many2many → res.partner
comodel_name='res.partner'
domain="[('parent_id', '=', False)]"
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.'
string='Partners'
test
Many2one → qc.test
comodel_name='qc.test'
required=True
trigger
Many2one → qc.trigger
comodel_name='qc.trigger'
required=True
user
Many2one → res.users
comodel_name='res.users'
default=<expr>
string='Responsible'
tracking=True
get_trigger_line_for_product(self, trigger, product, partner=False)
product_category
Many2one → product.category
comodel_name='product.category'
get_trigger_line_for_product(self, trigger, product, partner=False)
product
Many2one → product.product
comodel_name='product.product'
get_trigger_line_for_product(self, trigger, product, partner=False)
product_template
Many2one → product.template
comodel_name='product.template'
get_trigger_line_for_product(self, trigger, product, partner=False)