质量模块和库存扫码
This commit is contained in:
102
quality_control/models/stock_move_line.py
Normal file
102
quality_control/models/stock_move_line.py
Normal file
@@ -0,0 +1,102 @@
|
||||
# -*- 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())
|
||||
Reference in New Issue
Block a user