diff --git a/quality_assurance/README.rst b/quality_assurance/README.rst new file mode 100644 index 000000000..1bf31e324 --- /dev/null +++ b/quality_assurance/README.rst @@ -0,0 +1,48 @@ +.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg + :target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html + :alt: License: LGPL-3 + +Quality Assurance +================= +Manage Our Quality Assurance Processes in odoo 17 community. + +Configuration +============= +* Set user group for the user + +Company +------- +* `Cybrosys Techno Solutions `__ + +License +------- +Lesser General Public License, Version 3 (LGPL v3). +(https://www.odoo.com/documentation/user/17.0/legal/licenses/licenses.html) + + +Credits +------- +Developer: (V17) Dhanya B, Contact : odoo@cybrosys.com + + +Contacts +-------- +* Mail Contact : odoo@cybrosys.com +* Website : https://cybrosys.com + +Bug Tracker +----------- +Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. + +Maintainer +========== +.. image:: https://cybrosys.com/images/logo.png + :target: https://cybrosys.com + +This module is maintained by Cybrosys Technologies. + +For support and more information, please visit `Our Website `__ + +Further information +=================== +HTML Description: ``__ diff --git a/quality_assurance/__init__.py b/quality_assurance/__init__.py new file mode 100644 index 000000000..413077e84 --- /dev/null +++ b/quality_assurance/__init__.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2025-TODAY Cybrosys Technologies(). +# Author: Dhanya B() +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################### +from . import models diff --git a/quality_assurance/__manifest__.py b/quality_assurance/__manifest__.py new file mode 100644 index 000000000..481658673 --- /dev/null +++ b/quality_assurance/__manifest__.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2025-TODAY Cybrosys Technologies(). +# Author: Dhanya B() +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################### +{ + 'name': 'Quality Assurance', + 'version': '17.0.1.0.0', + 'summary': 'Manage Our Quality Assurance Processes in odoo 17 community', + 'description': """ + This module provides features to manage basic quality assurance procedures. + """, + 'author': 'Cybrosys Techno Solutions', + 'company': 'Cybrosys Techno Solutions', + 'website': "https:www.cybrosys.com", + 'maintainer': 'Cybrosys Techno Solutions', + 'category': 'Inventory', + 'depends': ['product', 'stock', 'purchase_stock'], + 'data': [ + 'data/quality_alert_sequence.xml', + 'security/quality_assurance_security.xml', + 'views/quality_measure_views.xml', + 'security/ir.model.access.csv', + 'views/quality_alert_views.xml', + 'views/quality_test_views.xml', + 'views/stock_picking_views.xml', + ], + 'images': ['static/description/banner.jpg'], + 'license': 'AGPL-3', + 'installable': True, + 'application': True +} diff --git a/quality_assurance/data/quality_alert_sequence.xml b/quality_assurance/data/quality_alert_sequence.xml new file mode 100644 index 000000000..c9e626854 --- /dev/null +++ b/quality_assurance/data/quality_alert_sequence.xml @@ -0,0 +1,15 @@ + + + + + + Quality alert sequence + quality.alert + QA + + + + 5 + + + \ No newline at end of file diff --git a/quality_assurance/doc/RELEASE_NOTES.md b/quality_assurance/doc/RELEASE_NOTES.md new file mode 100644 index 000000000..e417f85bd --- /dev/null +++ b/quality_assurance/doc/RELEASE_NOTES.md @@ -0,0 +1,10 @@ +## Module + +#### 02.08.2025 +#### Version 17.0.1.0.0 +#### ADD +-Initial commit for Quality Assurance + + + + diff --git a/quality_assurance/models/__init__.py b/quality_assurance/models/__init__.py new file mode 100644 index 000000000..e88d4b4eb --- /dev/null +++ b/quality_assurance/models/__init__.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2025-TODAY Cybrosys Technologies(). +# Author: Dhanya B() +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################### +from . import purchase_order +from . import quality_alert +from . import quality_measure +from . import quality_test +from . import stock_picking diff --git a/quality_assurance/models/purchase_order.py b/quality_assurance/models/purchase_order.py new file mode 100644 index 000000000..048ca4ee1 --- /dev/null +++ b/quality_assurance/models/purchase_order.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2025-TODAY Cybrosys Technologies(). +# Author: Dhanya B() +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################### +from odoo import models + + +class PurchaseOrder(models.Model): + _inherit = "purchase.order" + + def _create_picking(self): + """Creates a stock picking for the order if applicable.""" + stock_picking = self.env['stock.picking'] + for order in self: + if any([ptype in ['product', 'consu'] for ptype in + order.order_line.mapped('product_id.type')]): + pickings = order.picking_ids.filtered( + lambda x: x.state not in ('done', 'cancel')) + if not pickings: + res = order._prepare_picking() + picking = stock_picking.create(res) + else: + picking = pickings[0] + moves = order.order_line._create_stock_moves(picking) + moves = moves.filtered(lambda x: x.state not in ('done', 'cancel'))._action_confirm() + seq = 0 + for move in sorted(moves, key=lambda move: move.date): + seq += 5 + move.sequence = seq + moves._action_assign() + picking.generate_quality_alert() + self.message_post_with_source( + 'mail.message_origin_link', + render_values={ + 'self': picking, + 'origin': order}, + subtype_xmlid='mail.mt_note', + ) + return True diff --git a/quality_assurance/models/quality_alert.py b/quality_assurance/models/quality_alert.py new file mode 100644 index 000000000..35bc57fec --- /dev/null +++ b/quality_assurance/models/quality_alert.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2025-TODAY Cybrosys Technologies(). +# Author: Dhanya B() +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################### +from odoo import api, fields, models, _ + + +class QualityAlert(models.Model): + _name = 'quality.alert' + _description = 'Quality Alert' + _inherit = ['mail.thread'] + _order = "date asc, id desc" + + name = fields.Char('Name', required=True) + date = fields.Datetime(string='Date', default=fields.Datetime.now(), + track_visibility='onchange') + product_id = fields.Many2one('product.product', string='Product', + index=True, ondelete='cascade') + picking_id = fields.Many2one('stock.picking', string='Source Operation') + origin = fields.Char(string='Source Document', + help="Reference of the document that produced this alert.", + readonly=True) + company_id = fields.Many2one('res.company', 'Company', + default=lambda + self: self.env.user.company_id.id, index=1) + user_id = fields.Many2one('res.users', string='Created by', + default=lambda self: self.env.user.id) + tests = fields.One2many('quality.test', + 'alert_id', string="Tests") + final_status = fields.Selection(compute="_compute_final_status", + selection=[('wait', 'Waiting'), + ('pass', 'Passed'), + ('fail', 'Failed')], + store=True, string='Status', + default='fail', track_visibility='onchange') + + @api.depends('tests', 'tests.test_status') + def _compute_final_status(self): + """Computes the `final_status` field based on the related tests' + statuses.""" + for alert in self: + failed_tests = [test for test in alert.tests if + test.test_status == 'fail'] + if not alert.tests: + alert.final_status = 'wait' + elif failed_tests: + alert.final_status = 'fail' + else: + alert.final_status = 'pass' + + def action_generate_tests(self): + """Generates quality tests for the product associated + with the current alert.""" + quality_measure = self.env['quality.measure'] + measures = quality_measure.search( + [('product_id', '=', self.product_id.id), + ('picking_type_ids', 'in', self.picking_id.picking_type_id.id)]) + for measure in measures: + self.env['quality.test'].create([{ + 'quality_measure_id': measure.id, + 'alert_id': self.id, + }]) diff --git a/quality_assurance/models/quality_measure.py b/quality_assurance/models/quality_measure.py new file mode 100644 index 000000000..e08cd7335 --- /dev/null +++ b/quality_assurance/models/quality_measure.py @@ -0,0 +1,58 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2025-TODAY Cybrosys Technologies(). +# Author: Dhanya B() +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################### +from odoo import api, fields, models + + +class QualityMeasure(models.Model): + _name = 'quality.measure' + _description = 'Quality Measure' + _inherit = ['mail.thread'] + _order = "id desc" + + name = fields.Char('Name', required=True) + product_id = fields.Many2one('product.product', string='Product', + index=True, ondelete='cascade', + track_visibility='onchange') + product_template_id = fields.Many2one('product.template', + string='Product Template', + related='product_id.product_tmpl_id') + type = fields.Selection( + [('quantity', 'Quantitative'), + ('quality', 'Qualitative')], + string='Test Type', default='quantity', required=True, + track_visibility='onchange') + quantity_min = fields.Float('Min-Value', track_visibility='onchange') + quantity_max = fields.Float('Max-Value', track_visibility='onchange') + picking_type_ids = fields.Many2many('stock.picking.type', + string='Trigger On') + active = fields.Boolean('Active', default=True, + track_visibility='onchange') + company_id = fields.Many2one('res.company', 'Company', + default=lambda + self: self.env.user.company_id.id, index=1) + + @api.onchange('type') + def onchange_type(self): + """Handles the onchange event for the `type` field.""" + if self.type == 'quality': + self.quantity_min = 0.0 + self.quantity_max = 0.0 diff --git a/quality_assurance/models/quality_test.py b/quality_assurance/models/quality_test.py new file mode 100644 index 000000000..74a86d1c0 --- /dev/null +++ b/quality_assurance/models/quality_test.py @@ -0,0 +1,78 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2025-TODAY Cybrosys Technologies(). +# Author: Dhanya B() +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################### +from odoo import api, fields, models + + +class QualityTest(models.Model): + _name = 'quality.test' + _description = 'Quality Test' + _inherit = ['mail.thread'] + _order = "id desc" + + quality_measure_id = fields.Many2one('quality.measure', + string='Measure', + index=True, ondelete='cascade', + track_visibility='onchange') + alert_id = fields.Many2one('quality.alert', + string="Quality Alert", + track_visibility='onchange') + name = fields.Char('Name', related="quality_measure_id.name", + required=True) + product_id = fields.Many2one('product.product', + string='Product', + related='alert_id.product_id') + test_type = fields.Selection(related='quality_measure_id.type', + string='Test Type', required=True, + readonly=True) + quantity_min = fields.Float(related='quality_measure_id.quantity_min', + string='Min-Value', store=True, readonly=True) + quantity_max = fields.Float(related='quality_measure_id.quantity_max', + string='Max-Value', store=True, readonly=True) + test_user_id = fields.Many2one('res.users', + string='Assigned to', + track_visibility='onchange') + test_result = fields.Float(string='Result', track_visibility='onchange') + test_result2 = fields.Selection([ + ('satisfied', 'Satisfied'), + ('unsatisfied', 'Unsatisfied')], string='Result', + track_visibility='onchange') + test_status = fields.Selection(compute="_compute_quality_test_status", + selection=[('pass', 'Passed'), + ('fail', 'Failed')], + store=True, string='Status', + track_visibility='onchange') + + @api.depends('test_result', 'test_result2') + def _compute_quality_test_status(self): + """ Computes the `test_status` field based on the + test type and its results.""" + for test in self: + if test.test_type == 'quantity': + if test.quantity_min <= test.test_result <= test.quantity_max: + test.test_status = 'pass' + else: + test.test_status = 'fail' + else: + if test.test_result2 == 'satisfied': + test.test_status = 'pass' + else: + test.test_status = 'fail' diff --git a/quality_assurance/models/stock_picking.py b/quality_assurance/models/stock_picking.py new file mode 100644 index 000000000..1bfe5ab3a --- /dev/null +++ b/quality_assurance/models/stock_picking.py @@ -0,0 +1,147 @@ +# -*- coding: utf-8 -*- +############################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2025-TODAY Cybrosys Technologies(). +# Author: Dhanya B() +# +# This program is free software: you can modify +# it under the terms of the GNU Affero General Public License (AGPL) as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################### +from odoo import api, fields, models, _ +from odoo.exceptions import UserError + + +class StockPicking(models.Model): + _inherit = "stock.picking" + + @api.depends('move_ids') + def _compute_quality_alert(self): + ''' + This function computes the number of + quality alerts generated from given picking. + ''' + for picking in self: + alerts = self.env['quality.alert'].search( + [('picking_id', '=', picking.id)]) + picking.alert_ids = alerts + picking.alert_count = len(alerts) + + def action_quality_alert(self): + """This function returns an action that + display existing quality alerts generated + from a given picking.""" + action = self.env.ref('quality_assurance.quality_alert_action') + result = action.read()[0] + # override the context to get rid of the default filtering on picking type + result.pop('id', None) + result['context'] = {} + alert_ids = sum([picking.alert_ids.ids for picking in self], []) + if len(alert_ids) > 1: + result['domain'] = "[('id','in',[" + ','.join( + map(str, alert_ids)) + "])]" + elif len(alert_ids) == 1: + res = self.env.ref('quality_assurance.quality_alert_view_form', + False) + result['views'] = [(res and res.id or False, 'form')] + result['res_id'] = alert_ids and alert_ids[0] or False + return result + + alert_count = fields.Integer(compute='_compute_quality_alert', + string='Quality Alerts', default=0) + alert_ids = fields.Many2many('quality.alert', + compute='_compute_quality_alert', + string='Quality Alerts', copy=False) + + def generate_quality_alert(self): + """ + This function generates quality alerts for the products mentioned in + `move_ids` of the given picking and also have quality measures configured. + """ + quality_alert = self.env['quality.alert'] + quality_measure = self.env['quality.measure'] + for move in self.move_ids: + measures = quality_measure.search([ + ('product_id', '=', move.product_id.id), + ('picking_type_ids', 'in', self.picking_type_id.id) + ]) + if measures: + quality_alert.create({ + 'name': self.env['ir.sequence'].next_by_code( + 'quality.alert') or _('New'), + 'product_id': move.product_id.id, + 'picking_id': self.id, + 'origin': self.name, + 'company_id': self.company_id.id, + }) + + def action_confirm(self): + """If `alert_count` is zero, it triggers the `generate_quality_alert` method + before proceeding with the standard `action_confirm` behavior.""" + if self.alert_count == 0: + self.generate_quality_alert() + return super(StockPicking, self).action_confirm() + + def force_assign(self): + """Forces the assignment of stock picking. + If `alert_count` is zero, it triggers the `generate_quality_alert` method + before proceeding with the standard `force_assign` behavior. + """ + if self.alert_count == 0: + self.generate_quality_alert() + return super(StockPicking, self).force_assign() + + def _action_done(self): + """Changes picking state to done by processing the Stock Moves of + the Picking + Normally that happens when the button "Done" is pressed on a + Picking view. + @return: True + """ + todo_moves = self.mapped('move_ids').filtered( + lambda self: self.state in ['draft', 'partially_available', + 'assigned', 'confirmed']) + # Check if there are ops not linked to moves yet + for pick in self: + for ops in pick.move_line_ids.filtered(lambda x: not x.move_id): + # Search move with this product + moves = pick.move_ids.filtered( + lambda x: x.product_id == ops.product_id) + if moves: + ops.move_id = moves[0].id + else: + new_move = self.env['stock.move'].create({ + 'name': _('New Move:') + ops.product_id.display_name, + 'product_id': ops.product_id.id, + 'product_uom_qty': ops.qty_done, + 'product_uom': ops.product_uom_id.id, + 'location_id': pick.location_id.id, + 'location_dest_id': pick.location_dest_id.id, + 'picking_id': pick.id, + }) + ops.move_id = new_move.id + new_move._action_confirm() + todo_moves |= new_move + for move in todo_moves: + alerts = self.env['quality.alert'].search( + [('picking_id', '=', self.id), + ('product_id', '=', move.product_id.id)]) + for alert in alerts: + if alert.final_status == 'wait': + raise UserError(_('There are items still in quality test')) + if alert.final_status == 'fail': + raise UserError(_('There are items failed in quality test')) + todo_moves._action_done() + self.write({'date_done': fields.Datetime.now()}) + return True diff --git a/quality_assurance/security/ir.model.access.csv b/quality_assurance/security/ir.model.access.csv new file mode 100644 index 000000000..0b5028e2e --- /dev/null +++ b/quality_assurance/security/ir.model.access.csv @@ -0,0 +1,7 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +quality_measure_all,quality.measure,quality_assurance.model_quality_measure,base.group_user,1,0,0,0 +quality_measure_user,quality.measure,quality_assurance.model_quality_measure,quality_assurance.group_quality_user,1,1,1,1 +quality_alert_stock,quality.alert,quality_assurance.model_quality_alert,stock.group_stock_user,1,0,1,0 +quality_alert_user,quality.alert,quality_assurance.model_quality_alert,quality_assurance.group_quality_user,1,1,1,1 +quality_test_stock,quality.test,quality_assurance.model_quality_test,stock.group_stock_user,1,0,1,0 +quality_test_all,quality.test,quality_assurance.model_quality_test,quality_assurance.group_quality_user,1,1,1,1 diff --git a/quality_assurance/security/quality_assurance_security.xml b/quality_assurance/security/quality_assurance_security.xml new file mode 100644 index 000000000..0a35cdca4 --- /dev/null +++ b/quality_assurance/security/quality_assurance_security.xml @@ -0,0 +1,25 @@ + + + + + + Quality + Helps you manage your quality assurance processes + 4 + + + + User + + + + + + Manager + + + + + + + \ No newline at end of file diff --git a/quality_assurance/static/description/assets/icons/check.png b/quality_assurance/static/description/assets/icons/check.png new file mode 100644 index 000000000..c8e85f51d Binary files /dev/null and b/quality_assurance/static/description/assets/icons/check.png differ diff --git a/quality_assurance/static/description/assets/icons/chevron.png b/quality_assurance/static/description/assets/icons/chevron.png new file mode 100644 index 000000000..2089293d6 Binary files /dev/null and b/quality_assurance/static/description/assets/icons/chevron.png differ diff --git a/quality_assurance/static/description/assets/icons/cogs.png b/quality_assurance/static/description/assets/icons/cogs.png new file mode 100644 index 000000000..95d0bad62 Binary files /dev/null and b/quality_assurance/static/description/assets/icons/cogs.png differ diff --git a/quality_assurance/static/description/assets/icons/consultation.png b/quality_assurance/static/description/assets/icons/consultation.png new file mode 100644 index 000000000..8319d4baa Binary files /dev/null and b/quality_assurance/static/description/assets/icons/consultation.png differ diff --git a/quality_assurance/static/description/assets/icons/ecom-black.png b/quality_assurance/static/description/assets/icons/ecom-black.png new file mode 100644 index 000000000..a9385ff13 Binary files /dev/null and b/quality_assurance/static/description/assets/icons/ecom-black.png differ diff --git a/quality_assurance/static/description/assets/icons/education-black.png b/quality_assurance/static/description/assets/icons/education-black.png new file mode 100644 index 000000000..3eb09b27b Binary files /dev/null and b/quality_assurance/static/description/assets/icons/education-black.png differ diff --git a/quality_assurance/static/description/assets/icons/hotel-black.png b/quality_assurance/static/description/assets/icons/hotel-black.png new file mode 100644 index 000000000..130f613be Binary files /dev/null and b/quality_assurance/static/description/assets/icons/hotel-black.png differ diff --git a/quality_assurance/static/description/assets/icons/license.png b/quality_assurance/static/description/assets/icons/license.png new file mode 100644 index 000000000..a5869797e Binary files /dev/null and b/quality_assurance/static/description/assets/icons/license.png differ diff --git a/quality_assurance/static/description/assets/icons/lifebuoy.png b/quality_assurance/static/description/assets/icons/lifebuoy.png new file mode 100644 index 000000000..658d56ccc Binary files /dev/null and b/quality_assurance/static/description/assets/icons/lifebuoy.png differ diff --git a/quality_assurance/static/description/assets/icons/manufacturing-black.png b/quality_assurance/static/description/assets/icons/manufacturing-black.png new file mode 100644 index 000000000..697eb0e9f Binary files /dev/null and b/quality_assurance/static/description/assets/icons/manufacturing-black.png differ diff --git a/quality_assurance/static/description/assets/icons/pos-black.png b/quality_assurance/static/description/assets/icons/pos-black.png new file mode 100644 index 000000000..97c0f90c1 Binary files /dev/null and b/quality_assurance/static/description/assets/icons/pos-black.png differ diff --git a/quality_assurance/static/description/assets/icons/puzzle.png b/quality_assurance/static/description/assets/icons/puzzle.png new file mode 100644 index 000000000..65cf854e7 Binary files /dev/null and b/quality_assurance/static/description/assets/icons/puzzle.png differ diff --git a/quality_assurance/static/description/assets/icons/restaurant-black.png b/quality_assurance/static/description/assets/icons/restaurant-black.png new file mode 100644 index 000000000..4a35eb939 Binary files /dev/null and b/quality_assurance/static/description/assets/icons/restaurant-black.png differ diff --git a/quality_assurance/static/description/assets/icons/service-black.png b/quality_assurance/static/description/assets/icons/service-black.png new file mode 100644 index 000000000..301ab51cb Binary files /dev/null and b/quality_assurance/static/description/assets/icons/service-black.png differ diff --git a/quality_assurance/static/description/assets/icons/trading-black.png b/quality_assurance/static/description/assets/icons/trading-black.png new file mode 100644 index 000000000..9398ba2f1 Binary files /dev/null and b/quality_assurance/static/description/assets/icons/trading-black.png differ diff --git a/quality_assurance/static/description/assets/icons/training.png b/quality_assurance/static/description/assets/icons/training.png new file mode 100644 index 000000000..884ca024d Binary files /dev/null and b/quality_assurance/static/description/assets/icons/training.png differ diff --git a/quality_assurance/static/description/assets/icons/update.png b/quality_assurance/static/description/assets/icons/update.png new file mode 100644 index 000000000..ecbc5a01a Binary files /dev/null and b/quality_assurance/static/description/assets/icons/update.png differ diff --git a/quality_assurance/static/description/assets/icons/user.png b/quality_assurance/static/description/assets/icons/user.png new file mode 100644 index 000000000..6ffb23d9f Binary files /dev/null and b/quality_assurance/static/description/assets/icons/user.png differ diff --git a/quality_assurance/static/description/assets/icons/wrench.png b/quality_assurance/static/description/assets/icons/wrench.png new file mode 100644 index 000000000..6c04dea0f Binary files /dev/null and b/quality_assurance/static/description/assets/icons/wrench.png differ diff --git a/quality_assurance/static/description/assets/misc/Cybrosys R.png b/quality_assurance/static/description/assets/misc/Cybrosys R.png new file mode 100644 index 000000000..da4058087 Binary files /dev/null and b/quality_assurance/static/description/assets/misc/Cybrosys R.png differ diff --git a/quality_assurance/static/description/assets/misc/categories.png b/quality_assurance/static/description/assets/misc/categories.png new file mode 100644 index 000000000..bedf1e0b1 Binary files /dev/null and b/quality_assurance/static/description/assets/misc/categories.png differ diff --git a/quality_assurance/static/description/assets/misc/check-box.png b/quality_assurance/static/description/assets/misc/check-box.png new file mode 100644 index 000000000..42caf24b9 Binary files /dev/null and b/quality_assurance/static/description/assets/misc/check-box.png differ diff --git a/quality_assurance/static/description/assets/misc/compass.png b/quality_assurance/static/description/assets/misc/compass.png new file mode 100644 index 000000000..d5fed8faa Binary files /dev/null and b/quality_assurance/static/description/assets/misc/compass.png differ diff --git a/quality_assurance/static/description/assets/misc/corporate.png b/quality_assurance/static/description/assets/misc/corporate.png new file mode 100644 index 000000000..2eb13edbf Binary files /dev/null and b/quality_assurance/static/description/assets/misc/corporate.png differ diff --git a/quality_assurance/static/description/assets/misc/customer-support.png b/quality_assurance/static/description/assets/misc/customer-support.png new file mode 100644 index 000000000..79efc72ed Binary files /dev/null and b/quality_assurance/static/description/assets/misc/customer-support.png differ diff --git a/quality_assurance/static/description/assets/misc/cybrosys-logo.png b/quality_assurance/static/description/assets/misc/cybrosys-logo.png new file mode 100644 index 000000000..cc3cc0ccf Binary files /dev/null and b/quality_assurance/static/description/assets/misc/cybrosys-logo.png differ diff --git a/quality_assurance/static/description/assets/misc/features.png b/quality_assurance/static/description/assets/misc/features.png new file mode 100644 index 000000000..b41769f77 Binary files /dev/null and b/quality_assurance/static/description/assets/misc/features.png differ diff --git a/quality_assurance/static/description/assets/misc/logo.png b/quality_assurance/static/description/assets/misc/logo.png new file mode 100644 index 000000000..478462d3e Binary files /dev/null and b/quality_assurance/static/description/assets/misc/logo.png differ diff --git a/quality_assurance/static/description/assets/misc/pictures.png b/quality_assurance/static/description/assets/misc/pictures.png new file mode 100644 index 000000000..56d255fe9 Binary files /dev/null and b/quality_assurance/static/description/assets/misc/pictures.png differ diff --git a/quality_assurance/static/description/assets/misc/pie-chart.png b/quality_assurance/static/description/assets/misc/pie-chart.png new file mode 100644 index 000000000..426e05244 Binary files /dev/null and b/quality_assurance/static/description/assets/misc/pie-chart.png differ diff --git a/quality_assurance/static/description/assets/misc/right-arrow.png b/quality_assurance/static/description/assets/misc/right-arrow.png new file mode 100644 index 000000000..730984a06 Binary files /dev/null and b/quality_assurance/static/description/assets/misc/right-arrow.png differ diff --git a/quality_assurance/static/description/assets/misc/star.png b/quality_assurance/static/description/assets/misc/star.png new file mode 100644 index 000000000..2eb9ab29f Binary files /dev/null and b/quality_assurance/static/description/assets/misc/star.png differ diff --git a/quality_assurance/static/description/assets/misc/support.png b/quality_assurance/static/description/assets/misc/support.png new file mode 100644 index 000000000..4f18b8b82 Binary files /dev/null and b/quality_assurance/static/description/assets/misc/support.png differ diff --git a/quality_assurance/static/description/assets/misc/whatsapp.png b/quality_assurance/static/description/assets/misc/whatsapp.png new file mode 100644 index 000000000..d513a5356 Binary files /dev/null and b/quality_assurance/static/description/assets/misc/whatsapp.png differ diff --git a/quality_assurance/static/description/assets/modules/1.png b/quality_assurance/static/description/assets/modules/1.png new file mode 100644 index 000000000..e9948d8a7 Binary files /dev/null and b/quality_assurance/static/description/assets/modules/1.png differ diff --git a/quality_assurance/static/description/assets/modules/2.png b/quality_assurance/static/description/assets/modules/2.png new file mode 100644 index 000000000..0e311ca87 Binary files /dev/null and b/quality_assurance/static/description/assets/modules/2.png differ diff --git a/quality_assurance/static/description/assets/modules/3.jpg b/quality_assurance/static/description/assets/modules/3.jpg new file mode 100644 index 000000000..a68431b9d Binary files /dev/null and b/quality_assurance/static/description/assets/modules/3.jpg differ diff --git a/quality_assurance/static/description/assets/modules/4.jpg b/quality_assurance/static/description/assets/modules/4.jpg new file mode 100644 index 000000000..fd64cf8ca Binary files /dev/null and b/quality_assurance/static/description/assets/modules/4.jpg differ diff --git a/quality_assurance/static/description/assets/modules/5.png b/quality_assurance/static/description/assets/modules/5.png new file mode 100644 index 000000000..cb17cf612 Binary files /dev/null and b/quality_assurance/static/description/assets/modules/5.png differ diff --git a/quality_assurance/static/description/assets/modules/6.jpg b/quality_assurance/static/description/assets/modules/6.jpg new file mode 100644 index 000000000..115e1eee1 Binary files /dev/null and b/quality_assurance/static/description/assets/modules/6.jpg differ diff --git a/quality_assurance/static/description/assets/screenshots/hero.gif b/quality_assurance/static/description/assets/screenshots/hero.gif new file mode 100644 index 000000000..a6c864cbc Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/hero.gif differ diff --git a/quality_assurance/static/description/assets/screenshots/qqq1.png b/quality_assurance/static/description/assets/screenshots/qqq1.png new file mode 100644 index 000000000..5fcdec7eb Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/qqq1.png differ diff --git a/quality_assurance/static/description/assets/screenshots/qqq2.png b/quality_assurance/static/description/assets/screenshots/qqq2.png new file mode 100644 index 000000000..2aee5a252 Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/qqq2.png differ diff --git a/quality_assurance/static/description/assets/screenshots/qqq3.png b/quality_assurance/static/description/assets/screenshots/qqq3.png new file mode 100644 index 000000000..17c775539 Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/qqq3.png differ diff --git a/quality_assurance/static/description/assets/screenshots/quality2.png b/quality_assurance/static/description/assets/screenshots/quality2.png new file mode 100644 index 000000000..8fbee7f27 Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/quality2.png differ diff --git a/quality_assurance/static/description/assets/screenshots/quality3.png b/quality_assurance/static/description/assets/screenshots/quality3.png new file mode 100644 index 000000000..dd0cc81e7 Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/quality3.png differ diff --git a/quality_assurance/static/description/assets/screenshots/quality4.png b/quality_assurance/static/description/assets/screenshots/quality4.png new file mode 100644 index 000000000..6da1f767f Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/quality4.png differ diff --git a/quality_assurance/static/description/assets/screenshots/quality5.png b/quality_assurance/static/description/assets/screenshots/quality5.png new file mode 100644 index 000000000..ccfbba09d Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/quality5.png differ diff --git a/quality_assurance/static/description/assets/screenshots/qualtiy1.png b/quality_assurance/static/description/assets/screenshots/qualtiy1.png new file mode 100644 index 000000000..c00c2ec4b Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/qualtiy1.png differ diff --git a/quality_assurance/static/description/assets/screenshots/quslity6.png b/quality_assurance/static/description/assets/screenshots/quslity6.png new file mode 100644 index 000000000..ee3b8a99d Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/quslity6.png differ diff --git a/quality_assurance/static/description/banner.jpg b/quality_assurance/static/description/banner.jpg new file mode 100644 index 000000000..116708f1e Binary files /dev/null and b/quality_assurance/static/description/banner.jpg differ diff --git a/quality_assurance/static/description/icon.png b/quality_assurance/static/description/icon.png new file mode 100644 index 000000000..3306bd991 Binary files /dev/null and b/quality_assurance/static/description/icon.png differ diff --git a/quality_assurance/static/description/index.html b/quality_assurance/static/description/index.html new file mode 100644 index 000000000..2affb5af9 --- /dev/null +++ b/quality_assurance/static/description/index.html @@ -0,0 +1,769 @@ + + + + + + Odoo App 3 Index + + + + + + + + +
+
+
+
+
+ +
+
+
+ Community +
+
+
+
+
+
+

+ Quality Assurance

+

+ Allows Odoo users to ensure quality specifications of the items they are using in their business +

+
+ +
+
+
+
+
+

+ Key Highlights +

+
+
+
+
+
+ +
+
+

+ Quality Measurement +

+
+
+
+
+
+
+ +
+
+

+ Quality Alert

+
+
+
+
+
+
+ +
+
+

+ Quality Test

+
+
+
+
+
+
+ +
+
+

+ Quality Types

+
+
+
+ +
+
+
+ +
+
+
+
+
+ +
+
+

+ Set user group.

+
+
+
+
+
+
+ +
+
+

+ Create quality measure for products .Option for creating quantitative and + qualitative Quality check +

+
+
+
+ +
+
+
+ +
+
+

+ For Qualitative check +

+
+
+
+ +
+
+
+ +
+
+

+ We can see the quality alerts in the smart button .

+
+
+
+
+
+
+ +
+
+

+ If skip a Quality Test in an operation it will show popup alert to the user . + +

+
+
+
+ + +
+
+
+ + +
+
+

+ Manager can set Quality alert for each transfer operation + .

+
+
+
+
+
+
+ +
+
+

+ If you have configured Quality Measure for a product, whenever the product undergoes + Trigger On operation, Odoo will create a Quality Alert. + Set the quantity for the product. +

+
+
+
+
+
+
+ +
+
+

+ For the qualitative check. +

+
+
+
+ +
+
+
+ +
+
+

+ Need to enable this button to perform this quality measure in each operations. +

+
+
+
+ +
+
+
+
+
Version + 17.0.1.0.0|Released on:15th January 2024 +
+

+ + Initial Commit for Quality Assurance.

+
+
+
+
+
+
+
+

+ Related Products

+
+
+ +
+
+ + + + + + diff --git a/quality_assurance/views/quality_alert_views.xml b/quality_assurance/views/quality_alert_views.xml new file mode 100644 index 000000000..eb985b663 --- /dev/null +++ b/quality_assurance/views/quality_alert_views.xml @@ -0,0 +1,108 @@ + + + + + quality.alert.view.tree + quality.alert + + + + + + + + + + + + quality.alert.form + quality.alert + +
+
+
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+
+
+ + + quality.alert.view.search + quality.alert + + + + + + + + + + + + + + + + Quality Alerts + quality.alert + tree,form + + +

+ Click here to add a new Quality Alert +

+

+ Quality alerts will be created automatically when your inventory team try to process inventory + operations. +

+
+
+ + + + +
diff --git a/quality_assurance/views/quality_measure_views.xml b/quality_assurance/views/quality_measure_views.xml new file mode 100644 index 000000000..64fa21229 --- /dev/null +++ b/quality_assurance/views/quality_measure_views.xml @@ -0,0 +1,96 @@ + + + + + + + + quality.measure.view.tree + quality.measure + + + + + + + + + + + + + quality.measure.view.form + quality.measure + +
+ +
+ +
+
+

+ +

+
+ + + + + + + + + + + + + +
+
+ + +
+
+
+
+ + + quality.measure.view.search + quality.measure + + + + + + + + + + + + + + Quality Measure + quality.measure + tree,form + + +

+ Click here to add a new Quality Measure +

+
+
+ + + + +
diff --git a/quality_assurance/views/quality_test_views.xml b/quality_assurance/views/quality_test_views.xml new file mode 100644 index 000000000..1c48cdcfd --- /dev/null +++ b/quality_assurance/views/quality_test_views.xml @@ -0,0 +1,74 @@ + + + + + quality.test.view.tree + quality.test + + + + + + + + + + + + quality.test.view.form + quality.test + +
+ +
+

+ +

+
+ + + + + + + + + + + + + + + + +
+
+ + +
+
+
+
+ + + quality.test.search + quality.test + + + + + + + + + + + Quality Tests + quality.test + tree,form + {'search_default_my_tests': 1} + + + +
diff --git a/quality_assurance/views/stock_picking_views.xml b/quality_assurance/views/stock_picking_views.xml new file mode 100644 index 000000000..71d794d1b --- /dev/null +++ b/quality_assurance/views/stock_picking_views.xml @@ -0,0 +1,20 @@ + + + + + stock.picking.view.form.inherit.quality.assurance + stock.picking + + + + + + + +