Files
test/quality_control/models/stock_move.py
qihao.gong@jikimo.com 3c89404543 质量模块和库存扫码
2023-07-24 11:42:15 +08:00

70 lines
3.0 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from collections import defaultdict
from odoo import models
class StockMove(models.Model):
_inherit = "stock.move"
def _action_confirm(self, merge=True, merge_into=False):
moves = super(StockMove, self)._action_confirm(merge=merge, merge_into=merge_into)
moves._create_quality_checks()
return moves
def _create_quality_checks(self):
# Groupby move by picking. Use it in order to generate missing quality checks.
pick_moves = defaultdict(lambda: self.env['stock.move'])
for move in self:
if move.picking_id:
pick_moves[move.picking_id] |= move
check_vals_list = self._create_operation_quality_checks(pick_moves)
for picking, moves in pick_moves.items():
# Quality checks by product
quality_points_domain = self.env['quality.point']._get_domain(moves.product_id, picking.picking_type_id, measure_on='product')
quality_points = self.env['quality.point'].sudo().search(quality_points_domain)
if not quality_points:
continue
picking_check_vals_list = quality_points._get_checks_values(moves.product_id, picking.company_id.id, existing_checks=picking.sudo().check_ids)
for check_value in picking_check_vals_list:
check_value.update({
'picking_id': picking.id,
})
check_vals_list += picking_check_vals_list
self.env['quality.check'].sudo().create(check_vals_list)
def _create_operation_quality_checks(self, pick_moves):
check_vals_list = []
for picking, moves in pick_moves.items():
quality_points_domain = self.env['quality.point']._get_domain(moves.product_id, picking.picking_type_id, measure_on='operation')
quality_points = self.env['quality.point'].sudo().search(quality_points_domain)
for point in quality_points:
if point.check_execute_now():
check_vals_list.append({
'point_id': point.id,
'team_id': point.team_id.id,
'measure_on': 'operation',
'picking_id': picking.id,
})
return check_vals_list
def _action_cancel(self):
res = super()._action_cancel()
to_unlink = self.env['quality.check'].sudo()
is_product_canceled = defaultdict(lambda: True)
for qc in self.picking_id.sudo().check_ids:
if qc.quality_state != 'none':
continue
if (qc.picking_id, qc.product_id) not in is_product_canceled:
for move in qc.picking_id.move_ids:
is_product_canceled[(move.picking_id, move.product_id)] &= move.state == 'cancel'
if is_product_canceled[(qc.picking_id, qc.product_id)]:
to_unlink |= qc
to_unlink.unlink()
return res