diff --git a/quality_assurance/__init__.py b/quality_assurance/__init__.py new file mode 100644 index 000000000..a0fdc10fe --- /dev/null +++ b/quality_assurance/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import models diff --git a/quality_assurance/__manifest__.py b/quality_assurance/__manifest__.py new file mode 100644 index 000000000..f9f75ddd9 --- /dev/null +++ b/quality_assurance/__manifest__.py @@ -0,0 +1,48 @@ +# -*- coding: utf-8 -*- +################################################################################### +# +# Cybrosys Technologies Pvt. Ltd. +# Copyright (C) 2021-TODAY Cybrosys Technologies(). +# Author: fasluca() +# +# 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': '12.0.1.0.0', + 'summary': 'Manage Your Quality Assurance Processes', + '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'], + 'data': [ + 'data/data.xml', + 'security/quality_security.xml', + 'security/ir.model.access.csv', + 'views/quality_view.xml', + 'views/stock_view.xml', + ], + 'demo': [], + 'images': ['static/description/banner.jpg'], + 'license': 'LGPL-3', + 'installable': True, + 'application': True +} diff --git a/quality_assurance/data/data.xml b/quality_assurance/data/data.xml new file mode 100644 index 000000000..506d91259 --- /dev/null +++ b/quality_assurance/data/data.xml @@ -0,0 +1,14 @@ + + + + + Quality alert sequence + quality.alert + QA + + + + 5 + + + \ No newline at end of file diff --git a/quality_assurance/models/__init__.py b/quality_assurance/models/__init__.py new file mode 100644 index 000000000..6ff22bfd1 --- /dev/null +++ b/quality_assurance/models/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +from . import quality +from . import stock +from . import purchase diff --git a/quality_assurance/models/purchase.py b/quality_assurance/models/purchase.py new file mode 100644 index 000000000..39be02d90 --- /dev/null +++ b/quality_assurance/models/purchase.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- +from odoo import api, models + + +class PurchaseOrder(models.Model): + _inherit = "purchase.order" + + @api.multi + def _create_picking(self): + 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_expected): + print(move.date_expected,"gfhgbvhgjyghj") + seq += 5 + move.sequence = seq + moves._action_assign() + picking.generate_quality_alert() + picking.message_post_with_view('mail.message_origin_link', + values={'self': picking, 'origin': order}, + subtype_id=self.env.ref('mail.mt_note').id) + return True diff --git a/quality_assurance/models/quality.py b/quality_assurance/models/quality.py new file mode 100644 index 000000000..5c4b8005a --- /dev/null +++ b/quality_assurance/models/quality.py @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- +from datetime import datetime +from odoo import api, fields, models + + +class QualityMeasure(models.Model): + _name = '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') + trigger_time = 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): + if self.type == 'quality': + self.quantity_min = 0.0 + self.quantity_max = 0.0 + + +class QualityAlert(models.Model): + _name = 'quality.alert' + _inherit = ['mail.thread'] + _order = "date asc, id desc" + + name = fields.Char('Name', required=True) + date = fields.Datetime(string='Date', default=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_status", + selection=[('wait', 'Waiting'), + ('pass', 'Passed'), + ('fail', 'Failed')], + store=True, string='Status', + default='fail', track_visibility='onchange') + + @api.multi + def generate_tests(self): + quality_measure = self.env['quality.measure'] + measures = quality_measure.search([('product_id', '=', self.product_id.id), + ('trigger_time', 'in', self.picking_id.picking_type_id.id)]) + for measure in measures: + self.env['quality.test'].create({ + 'quality_measure': measure.id, + 'alert_id': self.id, + }) + + @api.depends('tests', 'tests.test_status') + def _compute_status(self): + 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' + + +class QualityTest(models.Model): + _name = 'quality.test' + _inherit = ['mail.thread'] + _order = "id desc" + + quality_measure = 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.name", required=True) + product_id = fields.Many2one('product.product', string='Product', related='alert_id.product_id') + test_type = fields.Selection(related='quality_measure.type', string='Test Type', required=True, readonly=True) + quantity_min = fields.Float(related='quality_measure.quantity_min', string='Min-Value', store=True, readonly=True) + quantity_max = fields.Float(related='quality_measure.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_status", + selection=[('pass', 'Passed'), + ('fail', 'Failed')], + store=True, string='Status', track_visibility='onchange') + + @api.depends('test_result', 'test_result2') + def _compute_status(self): + 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.py b/quality_assurance/models/stock.py new file mode 100644 index 000000000..7a45f0986 --- /dev/null +++ b/quality_assurance/models/stock.py @@ -0,0 +1,115 @@ +# -*- coding: utf-8 -*- +from odoo import api, fields, models, _ +from odoo.exceptions import UserError + + +class StockPicking(models.Model): + _inherit = "stock.picking" + + @api.depends('move_lines') + def _compute_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) + + @api.multi + def quality_alert_action(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], []) + # choose the view_mode accordingly + 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_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_alert', string='Quality Alerts', default=0) + alert_ids = fields.Many2many('quality.alert', compute='_compute_alert', string='Quality Alerts', copy=False) + + @api.multi + def generate_quality_alert(self): + ''' + This function generates quality alerts for the products mentioned in move_lines of 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_lines: + measures = quality_measure.search([('product_id', '=', move.product_id.id), ('trigger_time', '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, + }) + + @api.multi + def action_confirm(self): + if self.alert_count == 0: + self.generate_quality_alert() + res = super(StockPicking, self).action_confirm() + return res + + @api.multi + def force_assign(self): + if self.alert_count == 0: + self.generate_quality_alert() + res = super(StockPicking, self).force_assign() + return res + + @api.multi + 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 + """ + # TDE FIXME: remove decorator when migration the remaining + # TDE FIXME: draft -> automatically done, if waiting ?? CLEAR ME + todo_moves = self.mapped('move_lines').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_lines.filtered(lambda x: x.product_id == ops.product_id) + if moves: # could search move that needs it the most (that has some quantities left) + 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 + # 'qty_done': ops.qty_done}) + + 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_security.xml b/quality_assurance/security/quality_security.xml new file mode 100644 index 000000000..3382a28e0 --- /dev/null +++ b/quality_assurance/security/quality_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/logo.png b/quality_assurance/static/description/assets/icons/logo.png new file mode 100644 index 000000000..478462d3e Binary files /dev/null and b/quality_assurance/static/description/assets/icons/logo.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/modules/approval_image.png b/quality_assurance/static/description/assets/modules/approval_image.png new file mode 100644 index 000000000..84fe94e80 Binary files /dev/null and b/quality_assurance/static/description/assets/modules/approval_image.png differ diff --git a/quality_assurance/static/description/assets/modules/budget_image.png b/quality_assurance/static/description/assets/modules/budget_image.png new file mode 100644 index 000000000..fe6aa6fe4 Binary files /dev/null and b/quality_assurance/static/description/assets/modules/budget_image.png differ diff --git a/quality_assurance/static/description/assets/modules/export_image.png b/quality_assurance/static/description/assets/modules/export_image.png new file mode 100644 index 000000000..4e4ea0e51 Binary files /dev/null and b/quality_assurance/static/description/assets/modules/export_image.png differ diff --git a/quality_assurance/static/description/assets/modules/magento_image.png b/quality_assurance/static/description/assets/modules/magento_image.png new file mode 100644 index 000000000..39de0820f Binary files /dev/null and b/quality_assurance/static/description/assets/modules/magento_image.png differ diff --git a/quality_assurance/static/description/assets/modules/pos_image.png b/quality_assurance/static/description/assets/modules/pos_image.png new file mode 100644 index 000000000..c5932894b Binary files /dev/null and b/quality_assurance/static/description/assets/modules/pos_image.png differ diff --git a/quality_assurance/static/description/assets/modules/shopify_image.png b/quality_assurance/static/description/assets/modules/shopify_image.png new file mode 100644 index 000000000..c6d92c16d Binary files /dev/null and b/quality_assurance/static/description/assets/modules/shopify_image.png differ diff --git a/quality_assurance/static/description/assets/screenshots/hero.png b/quality_assurance/static/description/assets/screenshots/hero.png new file mode 100644 index 000000000..0f9460a50 Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/hero.png differ diff --git a/quality_assurance/static/description/assets/screenshots/quality_assurance-1.png b/quality_assurance/static/description/assets/screenshots/quality_assurance-1.png new file mode 100644 index 000000000..3733f922c Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/quality_assurance-1.png differ diff --git a/quality_assurance/static/description/assets/screenshots/quality_assurance-2.png b/quality_assurance/static/description/assets/screenshots/quality_assurance-2.png new file mode 100644 index 000000000..675e32e10 Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/quality_assurance-2.png differ diff --git a/quality_assurance/static/description/assets/screenshots/quality_assurance-3.png b/quality_assurance/static/description/assets/screenshots/quality_assurance-3.png new file mode 100644 index 000000000..36d579285 Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/quality_assurance-3.png differ diff --git a/quality_assurance/static/description/assets/screenshots/quality_assurance-4.png b/quality_assurance/static/description/assets/screenshots/quality_assurance-4.png new file mode 100644 index 000000000..ae4f116a4 Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/quality_assurance-4.png differ diff --git a/quality_assurance/static/description/assets/screenshots/quality_assurance-5.png b/quality_assurance/static/description/assets/screenshots/quality_assurance-5.png new file mode 100644 index 000000000..e4239de9d Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/quality_assurance-5.png differ diff --git a/quality_assurance/static/description/assets/screenshots/quality_assurance-6.png b/quality_assurance/static/description/assets/screenshots/quality_assurance-6.png new file mode 100644 index 000000000..f11581703 Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/quality_assurance-6.png differ diff --git a/quality_assurance/static/description/assets/screenshots/quality_assurance-7.png b/quality_assurance/static/description/assets/screenshots/quality_assurance-7.png new file mode 100644 index 000000000..000707e26 Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/quality_assurance-7.png differ diff --git a/quality_assurance/static/description/assets/screenshots/quality_assurance-8.png b/quality_assurance/static/description/assets/screenshots/quality_assurance-8.png new file mode 100644 index 000000000..5baf66a1c Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/quality_assurance-8.png differ diff --git a/quality_assurance/static/description/assets/screenshots/quality_assurance-9.png b/quality_assurance/static/description/assets/screenshots/quality_assurance-9.png new file mode 100644 index 000000000..7e60015a1 Binary files /dev/null and b/quality_assurance/static/description/assets/screenshots/quality_assurance-9.png differ diff --git a/quality_assurance/static/description/banner.jpg b/quality_assurance/static/description/banner.jpg new file mode 100644 index 000000000..d048dde7d Binary files /dev/null and b/quality_assurance/static/description/banner.jpg differ diff --git a/quality_assurance/static/description/cybro_logo.png b/quality_assurance/static/description/cybro_logo.png new file mode 100644 index 000000000..bb309114c Binary files /dev/null and b/quality_assurance/static/description/cybro_logo.png differ diff --git a/quality_assurance/static/description/icon.png b/quality_assurance/static/description/icon.png new file mode 100644 index 000000000..6dbb126e0 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..2f29b6476 --- /dev/null +++ b/quality_assurance/static/description/index.html @@ -0,0 +1,639 @@ +
+
+
+
+ +
+
+
+ Community +
+
+
+
+
+ +
+
+
+

+ Quality Assurance

+

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

+ +
+
+ + + + +
+
+

+ Overview +

+
+ +
+

+ Quality assurance/control is not a new term in this industrial world. Almost everything has some + specific quality standards. and it varies with the different attributes like, who is using and where + is using.. etc. This module allows Odoo users to ensure quality specification of the items they are + using in their business. This module provides quality alerts and quality test along with control in + inventory moves based on the test result.

+ +
+
+ + +
+
+

+ Features +

+
+ +
+
+ +
+
+

+ Quality Measures

+
+
+
+
+ +
+
+

+ Quality Alert

+ +
+
+ +
+
+ +
+
+

+ Quality Tests

+ +
+
+ + +
+ +
+
+

+ Screenshots +

+
+
+

+ Qualitative And Quantitative

+ + +
+ +
+

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

+ + +
+ +
+

+ The user can access the Quality Alerts generated from the operation itself

+ + +
+ + +
+

+ Generate Tests button will create Quality Tests for the product based on Quality Measures.

+ + +
+ + +
+

+ Quality manager can assign Quality Tests to different users

+ + +
+ + +
+

+ Quality users will have a list of Quality Tests that are assigned to them. Now the user can update + the test result to the Quality Test record

+ + +
+ +
+

+ Important changes made on Quality Tests will be tracked by the system

+ + +
+ +
+

+ Result updated on the Quality Tests will reflect on related Quality Alerts

+ + +
+ +
+

+ Inventory user cannot proceed with an item that is failed in Quality Test. User will get a warning + message when they try

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

Suggested Products

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

Our Services

+
+
+ +
+
+ +
+
+ Odoo + Customization
+
+ +
+
+ +
+
+ Odoo + Implementation
+
+ +
+
+ +
+
+ Odoo + Support
+
+ + +
+
+ +
+
+ Hire + Odoo + Developer
+
+ +
+
+ +
+
+ Odoo + Integration
+
+ +
+
+ +
+
+ Odoo + Migration
+
+ + +
+
+ +
+
+ Odoo + Consultancy
+
+ +
+
+ +
+
+ Odoo + Implementation
+
+ +
+
+ +
+
+ Odoo + Licensing Consultancy
+
+
+
+ + + +
+
+
+

Our Industries

+
+
+ +
+
+ +
+ Trading +
+

+ Easily procure + and + sell your products

+
+
+ +
+
+ +
+ POS +
+

+ Easy + configuration + and convivial experience

+
+
+ +
+
+ +
+ Education +
+

+ A platform for + educational management

+
+
+ +
+
+ +
+ Manufacturing +
+

+ Plan, track and + schedule your operations

+
+
+ +
+
+ +
+ E-commerce & Website +
+

+ Mobile + friendly, + awe-inspiring product pages

+
+
+ +
+
+ +
+ Service Management +
+

+ Keep track of + services and invoice

+
+
+ +
+
+ +
+ Restaurant +
+

+ Run your bar or + restaurant methodically

+
+
+ +
+
+ +
+ Hotel Management +
+

+ An + all-inclusive + hotel management application

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

Need Help?

+
+
+
+ + +
+ +
+ +
+ +
+ WhatsApp +
+
+
+ +
+ +
+ +
+
+ +
+ +
+ +
+
+ +
+
+
+ + +
\ No newline at end of file diff --git a/quality_assurance/views/quality_view.xml b/quality_assurance/views/quality_view.xml new file mode 100644 index 000000000..2fe0c70f3 --- /dev/null +++ b/quality_assurance/views/quality_view.xml @@ -0,0 +1,269 @@ + + + + + + + + + + quality.measure.tree + quality.measure + + + + + + + + + + + + + quality.measure.form + quality.measure + +
+ + +
+ +
+
+
+ + + + + + + + + + + + + +
+
+ + +
+
+
+
+ + + quality.measure.search + quality.measure + + + + + + + + + + + + + + Quality Measure + quality.measure + form + tree,form + + +

+ Click here to add a new Quality Measure +

+
+
+ + + + + + + + + + + + quality.alert.tree + quality.alert + + + + + + + + + + + + quality.alert.form + quality.alert + +
+
+
+ +
+

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + +
+
+
+
+ + + quality.alert.search + quality.alert + + + + + + + + + + + + + + + + Quality Alerts + quality.alert + form + 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. +

+
+
+ + + + + + + quality.test.tree + quality.test + + + + + + + + + + + + quality.test.form + quality.test + +
+ +
+

+
+ + + + + + + + + + + + + + + + +
+
+ + +
+
+
+
+ + + quality.test.search + quality.test + + + + + + + + + + + Quality Tests + quality.test + form + tree,form + {'search_default_my_tests': 1} + + + +
+
\ No newline at end of file diff --git a/quality_assurance/views/stock_view.xml b/quality_assurance/views/stock_view.xml new file mode 100644 index 000000000..067cf45c6 --- /dev/null +++ b/quality_assurance/views/stock_view.xml @@ -0,0 +1,19 @@ + + + + quality.stock.picking.form + stock.picking + + + + + + + + \ No newline at end of file