You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							111 lines
						
					
					
						
							5.5 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							111 lines
						
					
					
						
							5.5 KiB
						
					
					
				
								# -*- 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')
							 | 
						|
								
							 | 
						|
								    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'
							 | 
						|
								
							 |