Browse Source

Aug 11 [ADD] : Initial Commit 'quality_assurance'

pull/313/merge
AjmalCybro 1 month ago
parent
commit
1f5e4aa251
  1. 48
      quality_assurance/README.rst
  2. 22
      quality_assurance/__init__.py
  3. 48
      quality_assurance/__manifest__.py
  4. 15
      quality_assurance/data/quality_alert_sequence.xml
  5. 10
      quality_assurance/doc/RELEASE_NOTES.md
  6. 26
      quality_assurance/models/__init__.py
  7. 56
      quality_assurance/models/purchase_order.py
  8. 79
      quality_assurance/models/quality_alert.py
  9. 58
      quality_assurance/models/quality_measure.py
  10. 78
      quality_assurance/models/quality_test.py
  11. 147
      quality_assurance/models/stock_picking.py
  12. 7
      quality_assurance/security/ir.model.access.csv
  13. 25
      quality_assurance/security/quality_assurance_security.xml
  14. BIN
      quality_assurance/static/description/assets/icons/check.png
  15. BIN
      quality_assurance/static/description/assets/icons/chevron.png
  16. BIN
      quality_assurance/static/description/assets/icons/cogs.png
  17. BIN
      quality_assurance/static/description/assets/icons/consultation.png
  18. BIN
      quality_assurance/static/description/assets/icons/ecom-black.png
  19. BIN
      quality_assurance/static/description/assets/icons/education-black.png
  20. BIN
      quality_assurance/static/description/assets/icons/hotel-black.png
  21. BIN
      quality_assurance/static/description/assets/icons/license.png
  22. BIN
      quality_assurance/static/description/assets/icons/lifebuoy.png
  23. BIN
      quality_assurance/static/description/assets/icons/manufacturing-black.png
  24. BIN
      quality_assurance/static/description/assets/icons/pos-black.png
  25. BIN
      quality_assurance/static/description/assets/icons/puzzle.png
  26. BIN
      quality_assurance/static/description/assets/icons/restaurant-black.png
  27. BIN
      quality_assurance/static/description/assets/icons/service-black.png
  28. BIN
      quality_assurance/static/description/assets/icons/trading-black.png
  29. BIN
      quality_assurance/static/description/assets/icons/training.png
  30. BIN
      quality_assurance/static/description/assets/icons/update.png
  31. BIN
      quality_assurance/static/description/assets/icons/user.png
  32. BIN
      quality_assurance/static/description/assets/icons/wrench.png
  33. BIN
      quality_assurance/static/description/assets/misc/Cybrosys R.png
  34. BIN
      quality_assurance/static/description/assets/misc/categories.png
  35. BIN
      quality_assurance/static/description/assets/misc/check-box.png
  36. BIN
      quality_assurance/static/description/assets/misc/compass.png
  37. BIN
      quality_assurance/static/description/assets/misc/corporate.png
  38. BIN
      quality_assurance/static/description/assets/misc/customer-support.png
  39. BIN
      quality_assurance/static/description/assets/misc/cybrosys-logo.png
  40. BIN
      quality_assurance/static/description/assets/misc/features.png
  41. BIN
      quality_assurance/static/description/assets/misc/logo.png
  42. BIN
      quality_assurance/static/description/assets/misc/pictures.png
  43. BIN
      quality_assurance/static/description/assets/misc/pie-chart.png
  44. BIN
      quality_assurance/static/description/assets/misc/right-arrow.png
  45. BIN
      quality_assurance/static/description/assets/misc/star.png
  46. BIN
      quality_assurance/static/description/assets/misc/support.png
  47. BIN
      quality_assurance/static/description/assets/misc/whatsapp.png
  48. BIN
      quality_assurance/static/description/assets/modules/1.png
  49. BIN
      quality_assurance/static/description/assets/modules/2.png
  50. BIN
      quality_assurance/static/description/assets/modules/3.jpg
  51. BIN
      quality_assurance/static/description/assets/modules/4.jpg
  52. BIN
      quality_assurance/static/description/assets/modules/5.png
  53. BIN
      quality_assurance/static/description/assets/modules/6.jpg
  54. BIN
      quality_assurance/static/description/assets/screenshots/hero.gif
  55. BIN
      quality_assurance/static/description/assets/screenshots/qqq1.png
  56. BIN
      quality_assurance/static/description/assets/screenshots/qqq2.png
  57. BIN
      quality_assurance/static/description/assets/screenshots/qqq3.png
  58. BIN
      quality_assurance/static/description/assets/screenshots/quality2.png
  59. BIN
      quality_assurance/static/description/assets/screenshots/quality3.png
  60. BIN
      quality_assurance/static/description/assets/screenshots/quality4.png
  61. BIN
      quality_assurance/static/description/assets/screenshots/quality5.png
  62. BIN
      quality_assurance/static/description/assets/screenshots/qualtiy1.png
  63. BIN
      quality_assurance/static/description/assets/screenshots/quslity6.png
  64. BIN
      quality_assurance/static/description/banner.jpg
  65. BIN
      quality_assurance/static/description/icon.png
  66. 769
      quality_assurance/static/description/index.html
  67. 108
      quality_assurance/views/quality_alert_views.xml
  68. 96
      quality_assurance/views/quality_measure_views.xml
  69. 74
      quality_assurance/views/quality_test_views.xml
  70. 20
      quality_assurance/views/stock_picking_views.xml

48
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 <https://cybrosys.com/>`__
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 <https://cybrosys.com/>`__
Further information
===================
HTML Description: `<static/description/index.html>`__

22
quality_assurance/__init__.py

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2025-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Dhanya B(<https://www.cybrosys.com>)
#
# 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 <http://www.gnu.org/licenses/>.
#
###############################################################################
from . import models

48
quality_assurance/__manifest__.py

@ -0,0 +1,48 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2025-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Dhanya B(<https://www.cybrosys.com>)
#
# 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 <http://www.gnu.org/licenses/>.
#
###############################################################################
{
'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
}

15
quality_assurance/data/quality_alert_sequence.xml

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Generating sequence number for quality alert.-->
<data noupdate="1">
<record id="sequence_quality_alert" model="ir.sequence">
<field name="name">Quality alert sequence</field>
<field name="code">quality.alert</field>
<field name="prefix">QA</field>
<field eval="1" name="number_next"/>
<field eval="1" name="number_increment"/>
<field eval="False" name="company_id"/>
<field name="padding">5</field>
</record>
</data>
</odoo>

10
quality_assurance/doc/RELEASE_NOTES.md

@ -0,0 +1,10 @@
## Module <quality_assurance>
#### 02.08.2025
#### Version 17.0.1.0.0
#### ADD
-Initial commit for Quality Assurance

26
quality_assurance/models/__init__.py

@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2025-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Dhanya B(<https://www.cybrosys.com>)
#
# 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 <http://www.gnu.org/licenses/>.
#
###############################################################################
from . import purchase_order
from . import quality_alert
from . import quality_measure
from . import quality_test
from . import stock_picking

56
quality_assurance/models/purchase_order.py

@ -0,0 +1,56 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2025-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Dhanya B(<https://www.cybrosys.com>)
#
# 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 <http://www.gnu.org/licenses/>.
#
###############################################################################
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

79
quality_assurance/models/quality_alert.py

@ -0,0 +1,79 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2025-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Dhanya B(<https://www.cybrosys.com>)
#
# 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 <http://www.gnu.org/licenses/>.
#
###############################################################################
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,
}])

58
quality_assurance/models/quality_measure.py

@ -0,0 +1,58 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2025-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Dhanya B(<https://www.cybrosys.com>)
#
# 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 <http://www.gnu.org/licenses/>.
#
###############################################################################
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

78
quality_assurance/models/quality_test.py

@ -0,0 +1,78 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2025-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Dhanya B(<https://www.cybrosys.com>)
#
# 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 <http://www.gnu.org/licenses/>.
#
###############################################################################
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'

147
quality_assurance/models/stock_picking.py

@ -0,0 +1,147 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
# Copyright (C) 2025-TODAY Cybrosys Technologies(<http://www.cybrosys.com>).
# Author: Dhanya B(<https://www.cybrosys.com>)
#
# 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 <http://www.gnu.org/licenses/>.
#
###############################################################################
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

7
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
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 quality_measure_all quality.measure quality_assurance.model_quality_measure base.group_user 1 0 0 0
3 quality_measure_user quality.measure quality_assurance.model_quality_measure quality_assurance.group_quality_user 1 1 1 1
4 quality_alert_stock quality.alert quality_assurance.model_quality_alert stock.group_stock_user 1 0 1 0
5 quality_alert_user quality.alert quality_assurance.model_quality_alert quality_assurance.group_quality_user 1 1 1 1
6 quality_test_stock quality.test quality_assurance.model_quality_test stock.group_stock_user 1 0 1 0
7 quality_test_all quality.test quality_assurance.model_quality_test quality_assurance.group_quality_user 1 1 1 1

25
quality_assurance/security/quality_assurance_security.xml

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="0">
<!-- Creates the Quality category-->
<record model="ir.module.category" id="module_category_quality_management">
<field name="name">Quality</field>
<field name="description">Helps you manage your quality assurance processes</field>
<field name="sequence">4</field>
</record>
<!-- Create User-->
<record id="group_quality_user" model="res.groups">
<field name="name">User</field>
<field name="category_id" ref="module_category_quality_management"/>
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
</record>
<!-- Create the quality manager-->
<record id="group_quality_manager" model="res.groups">
<field name="name">Manager</field>
<field name="category_id" ref="module_category_quality_management"/>
<field name="implied_ids" eval="[(4, ref('group_quality_user'))]"/>
<field name="users" eval="[(4, ref('base.user_root'))]"/>
</record>
</data>
</odoo>

BIN
quality_assurance/static/description/assets/icons/check.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
quality_assurance/static/description/assets/icons/chevron.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

BIN
quality_assurance/static/description/assets/icons/cogs.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

BIN
quality_assurance/static/description/assets/icons/consultation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
quality_assurance/static/description/assets/icons/ecom-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

BIN
quality_assurance/static/description/assets/icons/education-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

BIN
quality_assurance/static/description/assets/icons/hotel-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

BIN
quality_assurance/static/description/assets/icons/license.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
quality_assurance/static/description/assets/icons/lifebuoy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
quality_assurance/static/description/assets/icons/manufacturing-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

BIN
quality_assurance/static/description/assets/icons/pos-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

BIN
quality_assurance/static/description/assets/icons/puzzle.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

BIN
quality_assurance/static/description/assets/icons/restaurant-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
quality_assurance/static/description/assets/icons/service-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

BIN
quality_assurance/static/description/assets/icons/trading-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 427 B

BIN
quality_assurance/static/description/assets/icons/training.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 627 B

BIN
quality_assurance/static/description/assets/icons/update.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
quality_assurance/static/description/assets/icons/user.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

BIN
quality_assurance/static/description/assets/icons/wrench.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
quality_assurance/static/description/assets/misc/Cybrosys R.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
quality_assurance/static/description/assets/misc/categories.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
quality_assurance/static/description/assets/misc/check-box.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
quality_assurance/static/description/assets/misc/compass.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
quality_assurance/static/description/assets/misc/corporate.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
quality_assurance/static/description/assets/misc/customer-support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
quality_assurance/static/description/assets/misc/cybrosys-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

BIN
quality_assurance/static/description/assets/misc/features.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 589 B

BIN
quality_assurance/static/description/assets/misc/logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
quality_assurance/static/description/assets/misc/pictures.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
quality_assurance/static/description/assets/misc/pie-chart.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
quality_assurance/static/description/assets/misc/right-arrow.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 967 B

BIN
quality_assurance/static/description/assets/misc/star.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
quality_assurance/static/description/assets/misc/support.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
quality_assurance/static/description/assets/misc/whatsapp.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
quality_assurance/static/description/assets/modules/1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

BIN
quality_assurance/static/description/assets/modules/2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

BIN
quality_assurance/static/description/assets/modules/3.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

BIN
quality_assurance/static/description/assets/modules/4.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

BIN
quality_assurance/static/description/assets/modules/5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

BIN
quality_assurance/static/description/assets/modules/6.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

BIN
quality_assurance/static/description/assets/screenshots/hero.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

BIN
quality_assurance/static/description/assets/screenshots/qqq1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

BIN
quality_assurance/static/description/assets/screenshots/qqq2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 KiB

BIN
quality_assurance/static/description/assets/screenshots/qqq3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

BIN
quality_assurance/static/description/assets/screenshots/quality2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

BIN
quality_assurance/static/description/assets/screenshots/quality3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
quality_assurance/static/description/assets/screenshots/quality4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

BIN
quality_assurance/static/description/assets/screenshots/quality5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

BIN
quality_assurance/static/description/assets/screenshots/qualtiy1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

BIN
quality_assurance/static/description/assets/screenshots/quslity6.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 87 KiB

BIN
quality_assurance/static/description/banner.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

BIN
quality_assurance/static/description/icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

769
quality_assurance/static/description/index.html

@ -0,0 +1,769 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Odoo App 3 Index</title>
<!-- Bootstrap CSS -->
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css"
integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
crossorigin="anonymous">
<link rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.1/css/all.min.css">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap"
rel="stylesheet">
</head>
<body>
<section>
<div class="container"
style="font-family: 'Inter', sans-serif !important;background-color: #fff !important;">
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12 d-flex justify-content-between flex-wrap align-items-sm-center"
style="border-bottom:1px solid rgba(0, 0, 0, 0.22)">
<div class="my-3">
<img src="assets/misc/Cybrosys R.png"
style="width:auto !important; height:40px !important">
</div>
<div class="my-3 d-flex align-items-center">
<div class="text-center"
style="background-color:#017E84 !important;font-size: 0.8rem !important; color:#fff !important; font-weight:500 !important; padding:4px !important; margin:0 3px !important; border-radius:50px !important; min-width: 120px !important;">
Community
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12 col-md-12 col-lg-12 text-center d-flex align-items-center flex-column"
style="margin: 80px 0px !important;">
<h1 style="font-size: 2.8rem;font-weight: 700; color:
#1A202C;">
Quality Assurance</h1>
<p class="my-3 mb-4"
style="max-width: 80%; font-weight: 400 !important; line-height: 32px; color: #718096;">
Allows Odoo users to ensure quality specifications of the items they are using in their business
</p>
<div style="width: 80%; margin-top: 3rem;">
<img src="assets/screenshots/hero.gif"
class="img-responsive" width="100%" height="auto">
</div>
</div>
</div>
<div class="container mt-5 mb-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#714b67 !important">
Key Highlights
</p>
</div>
<div class="row py-4">
<div class="col-md-6 col-sm-12 p-3">
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px;
background: #FFF;
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); ">
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67;
display: flex; justify-content: center; align-items: center;
margin-right: 10px; flex-shrink: 0;">
<i class="fa-solid fa-star "
style="color: #fff;font-size:14px;"></i>
</div>
<div>
<p style="color: #1A202C;font-weight: 600;
font-size: 1.2rem; margin-bottom: 2px;">
Quality Measurement
</p>
</div>
</div>
</div>
<div class="col-md-6 col-sm-12 p-3">
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px;
background: #FFF;
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); ">
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67;
display: flex; justify-content: center; align-items: center;
margin-right: 10px; flex-shrink: 0;">
<i class="fa-solid fa-star "
style="color: #fff;font-size:14px;"></i>
</div>
<div>
<p style="color: #1A202C;font-weight: 600;
font-size: 1.2rem; margin-bottom: 2px;">
Quality Alert </p>
</div>
</div>
</div>
<div class="col-md-6 col-sm-12 p-3">
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px;
background: #FFF;
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); ">
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67;
display: flex; justify-content: center; align-items: center;
margin-right: 10px; flex-shrink: 0;">
<i class="fa-solid fa-star "
style="color: #fff;font-size:14px;"></i>
</div>
<div>
<p style="color: #1A202C;font-weight: 600;
font-size: 1.2rem; margin-bottom: 2px;">
Quality Test</p>
</div>
</div>
</div>
<div class="col-md-6 col-sm-12 p-3">
<div class="d-flex h-100" style="padding: 30px;border-radius: 12px;
background: #FFF;
box-shadow: 1px 2px 3px 0px rgba(0, 0, 0, 0.25); ">
<div style="width: 36px; height: 36px; border-radius: 50%; background: #714B67;
display: flex; justify-content: center; align-items: center;
margin-right: 10px; flex-shrink: 0;">
<i class="fa-solid fa-star "
style="color: #fff;font-size:14px;"></i>
</div>
<div>
<p style="color: #1A202C;font-weight: 600;
font-size: 1.2rem; margin-bottom: 2px;">
Quality Types</p>
</div>
</div>
</div>
</div>
</div>
<div class="container rounded">
<ul class="nav nav-tabs d-flex"
style="width: fit-content;margin: 0 auto;gap: 1rem;">
<li class="col text-center py-2 text-nowrap "
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;">
<a
class="active show" data-toggle="tab" href="#tab1"
style="color: #fff;font-weight: 500; background-color: #714B67; text-decoration: none;">
<i class="fa-regular fa-image pr-2"
style="color: #fff;"></i>
Screenshots</a></li>
<li class="col text-center py-2 text-nowrap "
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;">
<a
data-toggle="tab" href="#tab2"
style="color: #fff;font-weight: 500; text-decoration: none;"><i
class="fa-solid fa-star pr-2"
style="color: #fff;"></i>Features</a></li>
<li class="col text-center py-2 text-nowrap "
style="color: #fff; background-color: #714B67;border-radius: 6px 6px 0px 0px;">
<a
data-toggle="tab" href="#tab3"
style="color: #fff;font-weight: 500; text-decoration: none; background-color: #714B67;"><i
class="fa-solid fa-book-open pr-2"
style="color: #fff;"></i>Released Notes</a></li>
</ul>
<div class="tab-content"
style="background-color: rgba(121, 113, 119, 0.04);">
<div id="tab1" class="tab-pane fade in active show">
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/qualtiy1.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Set user group.</h4>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/quality2.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Create quality measure for products .Option for creating quantitative and
qualitative Quality check
</h4>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/qqq2.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
For Qualitative check
</h4>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/quality4.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
We can see the quality alerts in the smart button .</h4>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/quality3.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
If skip a Quality Test in an operation it will show popup alert to the user .
</h4>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/quality5.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Manager can set Quality alert for each transfer operation
.</h4>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/quslity6.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
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.
</h4>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/qqq3.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
For the qualitative check.
</h4>
</div>
</div>
</div>
<div class="col-lg-12 py-2"
style="padding: 1rem 4rem !important;">
<div
style="border: 1px solid #d8d6d6; border-radius: 4px; background: #fff; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="row justify-content-center p-3 w-100 m-0">
<img src="assets/screenshots/qqq1.png"
class="img-responsive" width="100%"
height="auto">
</div>
<div class="px-3">
<h4 class="mt-2"
style=" font-weight:600 !important; color:#282F33 !important; font-size:1.3rem !important">
Need to enable this button to perform this quality measure in each operations.
</h4>
</div>
</div>
</div>
</div>
<div id="tab3" class="tab-pane fade">
<div class="col-mg-12 active" style="padding: 1rem 4rem;">
<div class="py-3"
style="font-weight: 500;background-color: #fff; border-radius: 4px; padding: 1rem; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);">
<div class="d-flex mb-3"
style="font-size: 0.8rem; font-weight: 500;"><span>Version
17.0.1.0.0</span><span
class="px-2">|</span><span
style="color: #714B67;font-weight: 600;">Released on:15th January 2024</span>
</div>
<p class="m-0"
style=" color:#718096!important; font-size:1rem !important;line-height: 28px;">
Initial Commit for Quality Assurance.</p>
</div>
</div>
</div>
</div>
</div>
<div class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-5">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Related Products</p>
</div>
</div>
<div id="myCarousel" class="carousel slide py-3" data-ride="carousel">
<div class="carousel-inner">
<div class="carousel-item active">
<div class="row p-4">
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/invoice_stock_move/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/1.png"
alt="" width="100%"
height="auto">
<p class="text-center pt-2 text-black font-weight-bold">
Stock Picking From Invoice</p>
</div>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/product_barcode/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/2.png"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Product Barcode Generator</p>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/low_stocks_product_alert/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/3.jpg"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Product Low Stock Alert</p>
</div>
</a>
</div>
</div>
</div>
</div>
<div class="carousel-item">
<div class="row p-4">
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/purchase_product_history/#"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px; ">
<img src="assets/modules/4.jpg"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Purchase History Of Products</p>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/inventory_barcode_scanning/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px;">
<img src="assets/modules/5.png"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Barcode scanning in Inventory</p>
</div>
</a>
</div>
</div>
<div class="col">
<div class="p-3">
<a href="https://apps.odoo.com/apps/modules/17.0/multiple_reference_per_product/"
style="color: #000; text-decoration: none;">
<div style="border:1px solid #CBCBCB !important;border-radius: 4px;">
<div style="width: 300px;">
<img src="assets/modules/6.jpg"
alt="" width="100%"
height="auto">
</div>
<p class="text-center pt-2 text-black font-weight-bold">
Multiple Reference Per Product</p>
</div>
</a>
</div>
</div>
</div>
</div>
</div>
<div class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Our Services</p>
</div>
</div>
<div class="container my-5">
<div class="row py-3">
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#13EA36 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/cogs.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Customization</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#DBC711; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/wrench.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Implementation</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#FF6B6B ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/lifebuoy.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Support</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#FFA801 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/user.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Hire
Odoo Developer</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative; border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#54A0FF; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/puzzle.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Integration</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#6D7680 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/update.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Migration</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#786FA6 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/consultation.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Consultancy</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px;position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#F8A5C2 ; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/training.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Implementation</p>
</div>
</div>
<div class="col-md-4 col-sm-6 px-4 py-4">
<div
style="background-color: #fff; padding: 25px; text-align: center; box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 3px 0px, rgba(0, 0, 0, 0.06) 0px 1px 2px 0px; position: relative;border-radius: 4px;">
<div style="position: absolute; top: 0%; left: 50%; transform: translate(-50%, -50%);">
<div style="background-color:#E6BE26; border-radius: 50%; padding: 15px; width: 68px;
height: 68px; display: inline-block; box-shadow:0px 4px 4px rgba(0, 0, 0, 0.25);">
<img src="assets/icons/license.png"
alt="service-icon" width="38px"
height="auto">
</div>
</div>
<p style="margin-top: 20px; font-weight: bold;">Odoo
Licensing Consultancy</p>
</div>
</div>
</div>
</div>
<div class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-4">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Our Industries</p>
</div>
</div>
<div class="container">
<div class="row my-5 py-4">
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100 "
style="border-right: 1px solid rgb(209, 209, 209); border-bottom: 1px solid rgb(209, 209, 209); padding: 30px; box-shadow: 6px 0 10px rgba(228, 227, 227, 0.373);">
<img src="assets/icons/trading-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">Trading</p>
<p>Easily procure and sell your products</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209);border-bottom: 1px solid rgb(209, 209, 209); padding: 30px;">
<img src="assets/icons/pos-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">POS</p>
<p>Easy configuration and convivial experience</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209);border-bottom: 1px solid rgba(0, 0, 0, 0.2); padding: 30px; box-shadow: 0 5px 10px rgba(228, 227, 227, 0.373)">
<img src="assets/icons/education-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">
Education</p>
<p>A platform for educational management</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-bottom: 1px solid rgb(209, 209, 209); padding: 30px; ">
<img src="assets/icons/manufacturing-black.png"
width="42px" height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">
Manufacturing</p>
<p>Plan, track and schedule your operations</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px;">
<img src="assets/icons/ecom-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">E-commerce &
Website</p>
<p>Mobile friendly, awe-inspiring product pages</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px;box-shadow: 0 -5px 10px rgba(228, 227, 227, 0.373);">
<img src="assets/icons/service-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">Service
Management</p>
<p>Keep track of services and invoice</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style="border-right: 1px solid rgb(209, 209, 209); padding: 30px; ">
<img src="assets/icons/restaurant-black.png"
width="42px" height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">
Restaurant</p>
<p>Run your bar or restaurant methodically</p>
</div>
</div>
<div class="col-md-3 col-sm-6 p-0">
<div class="d-flex flex-column h-100"
style=" padding: 30px;box-shadow: -5px 0 10px rgba(228, 227, 227, 0.373);">
<img src="assets/icons/hotel-black.png" width="42px"
height="auto" alt="">
<p style="color: #714B67;font-weight: 600; margin-top: 10px;
font-size: 1.2rem; margin-bottom: 2px;">Hotel
Management</p>
<p>An all-inclusive hotel management application</p>
</div>
</div>
</div>
</div>
<div class="container mt-5">
<div class="col-lg-12 d-flex flex-column justify-content-center align-items-center mt-5">
<p class="m-0"
style="font-weight: 600; font-size: 24px; color:#000 !important">
Support</p>
</div>
</div>
<div class="container my-5">
<div class="row" style="background-color: #FFFAFE;">
<div class="col-md-6 pb-4 d-flex align-items-center justify-content-center"
style="border-right: 1px solid #D9D9D9;">
<div style="padding: 30px;">
<div class="d-flex align-items-center">
<img src="assets/misc/support (1) 1.svg" alt=""
width="60px" style="margin-right: 12px;">
<div style="padding: 0px 8px;">
<span
style="color: #714B67;font-size: 24px;font-weight: 600;padding-bottom: 1rem;">Need
Help?</span>
<p class="m-0" style="color:#718096;">Got
questions or need help? Get in touch.</p>
<div style="font-weight: 400;"><span><img
src="assets/misc/support-email.svg"
alt=""
width="18px"
style="filter: invert(1);margin-right: 0.8rem;"></span>odoo@cybrosys.com
</div>
</div>
</div>
</div>
</div>
<div class="col-md-6 pb-4 d-flex align-items-center justify-content-center">
<div style="padding: 30px;">
<div class="d-flex align-items-center">
<img src="assets/misc/whatsapp 1.svg" alt=""
width="60px" style="margin-right: 12px;">
<div>
<span style="color: #714B67;font-size: 24px;font-weight: 600;">WhatsApp</span>
<p class="m-0" style="color:#718096;">Say hi to
us on WhatsApp!</p>
<div style="font-weight: 400; font-size: 16px;"><span><img
src="assets/misc/phone.svg"
alt="" width="14px"
style="filter: invert(1); margin-right: 0.8rem;"></span>+91
99456767686
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Optional JavaScript -->
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</body>
</html>

108
quality_assurance/views/quality_alert_views.xml

@ -0,0 +1,108 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Tree view definition for Quality Alerts -->
<record id="quality_alert_view_tree" model="ir.ui.view">
<field name="name">quality.alert.view.tree</field>
<field name="model">quality.alert</field>
<field name="arch" type="xml">
<tree string="Quality Alerts">
<field name="name"/>
<field name="product_id"/>
<field name="origin"/>
<field name="date"/>
</tree>
</field>
</record>
<!-- Form view definition for Quality Alerts -->
<record id="quality_alert_view_form" model="ir.ui.view">
<field name="name">quality.alert.form</field>
<field name="model">quality.alert</field>
<field name="arch" type="xml">
<form string="Quality Alert">
<header>
<button name="action_generate_tests" string="Generate Tests" type="object" class="oe_highlight"
groups="quality_assurance.group_quality_user"/>
</header>
<sheet>
<div class="oe_title">
<h2>
<field name="name" placeholder="Name" readonly="1"/>
</h2>
</div>
<group>
<group>
<field name="product_id"/>
<field name="user_id"/>
</group>
<group>
<field name="date"/>
<field name="picking_id" readonly="1"/>
</group>
</group>
<notebook>
<page string="Tests">
<field name="tests" nolabel="1">
<tree create="false" editable="1">
<field name="name"/>
<field name="test_type" column_invisible="1"/>
<field name="quantity_min" column_invisible="1"/>
<field name="quantity_max" column_invisible="1"/>
<field name="test_user_id"/>
<field name="test_result" string="Quantitative Result"
readonly="test_type == 'quality'"/>
<field name="test_result2" string="Qualitative Result"
readonly="test_type == 'quantity'"/>
<field name="test_status"/>
</tree>
</field>
</page>
</notebook>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<!-- Search view definition for Quality Alerts -->
<record id="quality_alert_view_search" model="ir.ui.view">
<field name="name">quality.alert.view.search</field>
<field name="model">quality.alert</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<field name="origin"/>
<field name="product_id"/>
<group expand="0" string="Group By">
<filter string="Source Document" name="groupby_origin" domain="[]"
context="{'group_by':'origin'}"/>
<filter string="Product" name="groupby_product_id" domain="[]"
context="{'group_by':'product_id'}"/>
<filter string="Creation Date" name="groupby_createmonth" domain="[]"
context="{'group_by':'date'}"/>
</group>
</search>
</field>
</record>
<!-- Action definition for Quality Alerts -->
<record model="ir.actions.act_window" id="quality_alert_action">
<field name="name">Quality Alerts</field>
<field name="res_model">quality.alert</field>
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="quality_alert_view_search"/>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click here to add a new Quality Alert
</p>
<p>
Quality alerts will be created automatically when your inventory team try to process inventory
operations.
</p>
</field>
</record>
<!-- Menu item for Quality Assurance module. -->
<menuitem id="menu_quality_assurance" name="Quality Assurance" parent="quality_assurance.menu_quality_root"/>
<!-- Menu item for accessing Quality Alerts -->
<menuitem id="menu_quality_alert" name="Quality Alerts" parent="quality_assurance.menu_quality_assurance" sequence="1" action="quality_alert_action"/>
</odoo>

96
quality_assurance/views/quality_measure_views.xml

@ -0,0 +1,96 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Menu item for the root of the Quality module -->
<menuitem id="menu_quality_root" name="Quality" sequence="30"
groups="quality_assurance.group_quality_user" web_icon="quality_assurance,static/description/icon.png"/>
<!-- Tree view definition for Quality Measures -->
<record id="quality_measure_view_tree" model="ir.ui.view">
<field name="name">quality.measure.view.tree</field>
<field name="model">quality.measure</field>
<field name="arch" type="xml">
<tree string="Quality Alerts">
<field name="name"/>
<field name="product_id"/>
<field name="type"/>
<field name="quantity_min"/>
<field name="quantity_max"/>
</tree>
</field>
</record>
<!-- Form view definition for Quality Measures -->
<record id="quality_measure_view_form" model="ir.ui.view">
<field name="name">quality.measure.view.form</field>
<field name="model">quality.measure</field>
<field name="arch" type="xml">
<form string="Quality Measure">
<sheet>
<div class="oe_button_box" name="button_box">
<button name="toggle_active" type="object"
class="oe_stat_button" icon="fa-archive" string="active">
<field name="active" widget="boolean_button"
options='{"terminology": "archive"}' strin="active"/>
</button>
</div>
<div class="oe_title">
<h3>
<field name="name" placeholder="Name"/>
</h3>
</div>
<group>
<group>
<field name="product_id"/>
<field name="type"/>
</group>
<group>
<field name="quantity_min" invisible="type == 'quality'"/>
<field name="quantity_max" invisible="type == 'quality'"/>
</group>
</group>
<group>
<field name="picking_type_ids"/>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<!-- Form view definition for Quality Measures -->
<record id="quality_measure_view_search" model="ir.ui.view">
<field name="name">quality.measure.view.search</field>
<field name="model">quality.measure</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<field name="product_id"/>
<group expand="0" string="Group By">
<filter string="Product" name="group_by_product_id" domain="[]"
context="{'group_by':'product_id'}"/>
<filter string="Type" name="group_by_type" domain="[]" context="{'group_by':'type'}"/>
</group>
</search>
</field>
</record>
<!-- Action definition for Quality Measures -->
<record model="ir.actions.act_window" id="quality_measure_action">
<field name="name">Quality Measure</field>
<field name="res_model">quality.measure</field>
<field name="view_mode">tree,form</field>
<field name="search_view_id" ref="quality_measure_view_search"/>
<field name="help" type="html">
<p class="oe_view_nocontent_create">
Click here to add a new Quality Measure
</p>
</field>
</record>
<!--Menu's.-->
<menuitem id="menu_quality_config_settings" name="Configuration" parent="quality_assurance.menu_quality_root"
sequence="100"
groups="quality_assurance.group_quality_manager"/>
<menuitem id="menu_quality_measure" name="Quality Measures" parent="menu_quality_config_settings"
action="quality_measure_action"/>
</odoo>

74
quality_assurance/views/quality_test_views.xml

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Tree view definition for Quality Tests -->
<record id="quality_test_view_tree" model="ir.ui.view">
<field name="name">quality.test.view.tree</field>
<field name="model">quality.test</field>
<field name="arch" type="xml">
<tree string="Quality Tests">
<field name="name"/>
<field name="product_id"/>
<field name="test_type"/>
<field name="test_status"/>
</tree>
</field>
</record>
<!-- Form view definition for Quality Tests -->
<record id="quality_test_view_form" model="ir.ui.view">
<field name="name">quality.test.view.form</field>
<field name="model">quality.test</field>
<field name="arch" type="xml">
<form string="Quality Test">
<sheet>
<div class="oe_title">
<h2>
<field name="name" placeholder="Name" readonly="1"/>
</h2>
</div>
<group>
<group>
<field name="test_type"/>
<field name="quantity_min" invisible="test_type == 'quality'"/>
<field name="quantity_max" invisible="test_type =='quality'"/>
<field name="test_result" invisible="test_type=='quality'"/>
<field name="test_result2" invisible="test_type=='quantity'"/>
<field name="test_status"/>
</group>
<group>
<field name="quality_measure_id"/>
<field name="alert_id"/>
<field name="product_id"/>
<field name="test_user_id"/>
</group>
</group>
</sheet>
<div class="oe_chatter">
<field name="message_follower_ids" widget="mail_followers"/>
<field name="message_ids" widget="mail_thread"/>
</div>
</form>
</field>
</record>
<!-- Search view definition for Quality Tests -->
<record id="quality_test_view_search" model="ir.ui.view">
<field name="name">quality.test.search</field>
<field name="model">quality.test</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
<field name="product_id"/>
<filter string="My Tests" name="my_tests" domain="[('test_user_id','=',uid)]"/>
</search>
</field>
</record>
<!-- Action definition for Quality Tests -->
<record model="ir.actions.act_window" id="quality_test_action">
<field name="name">Quality Tests</field>
<field name="res_model">quality.test</field>
<field name="view_mode">tree,form</field>
<field name="context">{'search_default_my_tests': 1}</field>
</record>
<!-- Menu item for accessing Quality Tests under the Quality Assurance module -->
<menuitem id="menu_quality_test" name="Quality Tests" parent="quality_assurance.menu_quality_assurance"
sequence="2" action="quality_test_action"/>
</odoo>

20
quality_assurance/views/stock_picking_views.xml

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Adding smart button in stock picking.-->
<record id="view_picking_form" model="ir.ui.view">
<field name="name">stock.picking.view.form.inherit.quality.assurance</field>
<field name="model">stock.picking</field>
<field name="inherit_id" ref="stock.view_picking_form"/>
<field name="arch" type="xml">
<xpath expr="//div[hasclass('oe_button_box')]" position="inside">
<button type="object"
name="action_quality_alert"
class="oe_stat_button"
icon="fa-check-circle-o">
<field name="alert_count" widget="statinfo" string="Quality Alerts" help="Quality Alerts"/>
<field name="alert_ids" invisible="1"/>
</button>
</xpath>
</field>
</record>
</odoo>
Loading…
Cancel
Save