103 lines
4.6 KiB
Python
103 lines
4.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
from odoo import api, fields, models
|
|
|
|
|
|
class StockMoveLine(models.Model):
|
|
_inherit = "stock.move.line"
|
|
|
|
check_ids = fields.One2many('quality.check', 'move_line_id', 'Checks')
|
|
check_state = fields.Selection([
|
|
('no_checks', 'No checks'),
|
|
('in_progress', 'Some checks to be done'),
|
|
('pass', 'All checks passed'),
|
|
('fail', 'Some checks failed')], compute="_compute_check_state")
|
|
|
|
@api.depends('check_ids')
|
|
def _compute_check_state(self):
|
|
for line in self:
|
|
if not line.check_ids:
|
|
line.check_state = 'no_checks'
|
|
elif line.check_ids.filtered(lambda check: check.quality_state == 'none'):
|
|
line.check_state = 'in_progress'
|
|
elif line.check_ids.filtered(lambda check: check.quality_state == 'fail'):
|
|
line.check_state = "fail"
|
|
else:
|
|
line.check_state = "pass"
|
|
|
|
@api.model_create_multi
|
|
def create(self, vals_list):
|
|
lines = super().create(vals_list)
|
|
lines._filter_move_lines_applicable_for_quality_check()._create_check()
|
|
return lines
|
|
|
|
def write(self, vals):
|
|
if self._create_quality_check_at_write(vals):
|
|
self.filtered(lambda ml: not ml.qty_done)._create_check()
|
|
return super().write(vals)
|
|
|
|
def unlink(self):
|
|
self.sudo()._unlink_quality_check()
|
|
return super(StockMoveLine, self).unlink()
|
|
|
|
def action_open_quality_check_wizard(self):
|
|
return self.check_ids.action_open_quality_check_wizard()
|
|
|
|
def _unlink_quality_check(self):
|
|
self.check_ids.filtered(lambda qc: qc._check_to_unlink()).unlink()
|
|
|
|
def _create_quality_check_at_write(self, vals):
|
|
return vals.get('qty_done')
|
|
|
|
def _create_check(self):
|
|
check_values_list = []
|
|
quality_points_domain = self.env['quality.point']._get_domain(
|
|
self.product_id, self.move_id.picking_type_id, measure_on='move_line')
|
|
quality_points = self.env['quality.point'].sudo().search(quality_points_domain)
|
|
quality_points_by_product_picking_type = {}
|
|
for quality_point in quality_points:
|
|
for product in quality_point.product_ids:
|
|
for picking_type in quality_point.picking_type_ids:
|
|
quality_points_by_product_picking_type.setdefault(
|
|
(product, picking_type), set()).add(quality_point.id)
|
|
for categ in quality_point.product_category_ids:
|
|
categ_product = self.env['product.product'].search([
|
|
('categ_id', 'child_of', categ.id)
|
|
])
|
|
for product in categ_product & self.product_id:
|
|
for picking_type in quality_point.picking_type_ids:
|
|
quality_points_by_product_picking_type.setdefault(
|
|
(product, picking_type), set()).add(quality_point.id)
|
|
if not quality_point.product_ids:
|
|
for picking_type in quality_point.picking_type_ids:
|
|
quality_points_by_product_picking_type.setdefault(
|
|
(None, picking_type), set()).add(quality_point.id)
|
|
|
|
for ml in self:
|
|
quality_points_product = quality_points_by_product_picking_type.get((ml.product_id, ml.move_id.picking_type_id), set())
|
|
quality_points_all_products = ml._get_quality_points_all_products(quality_points_by_product_picking_type)
|
|
quality_points = self.env['quality.point'].sudo().search([('id', 'in', list(quality_points_product | quality_points_all_products))])
|
|
for quality_point in quality_points:
|
|
if quality_point.check_execute_now():
|
|
check_values = ml._get_check_values(quality_point)
|
|
check_values_list.append(check_values)
|
|
if check_values_list:
|
|
self.env['quality.check'].sudo().create(check_values_list)
|
|
|
|
def _filter_move_lines_applicable_for_quality_check(self):
|
|
return self.filtered(lambda line: line.qty_done != 0)
|
|
|
|
def _get_check_values(self, quality_point):
|
|
return {
|
|
'point_id': quality_point.id,
|
|
'measure_on': quality_point.measure_on,
|
|
'team_id': quality_point.team_id.id,
|
|
'product_id': self.product_id.id,
|
|
'picking_id': self.picking_id.id,
|
|
'move_line_id': self.id,
|
|
'lot_name': self.lot_name,
|
|
}
|
|
|
|
def _get_quality_points_all_products(self, quality_points_by_product_picking_type):
|
|
return quality_points_by_product_picking_type.get((None, self.move_id.picking_type_id), set())
|