Files
stock-logistics-warehouse/stock_picking_completion_info/models/stock_picking.py
2020-04-27 11:24:54 +02:00

87 lines
3.1 KiB
Python

# Copyright 2019 Camptocamp SA
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
from odoo import api, fields, models
class PickingType(models.Model):
_inherit = "stock.picking.type"
display_completion_info = fields.Boolean(
help="Inform operator of a completed operation at processing and at"
" completion"
)
class StockPicking(models.Model):
_inherit = "stock.picking"
completion_info = fields.Selection(
[
("no", "No"),
(
"last_picking",
"Last picking: Completion of this operation allows next "
"operations to be processed.",
),
("next_picking_ready", "Next operations are ready to be processed."),
(
"full_order_picking",
"Full order picking: You are processing a full order picking "
"that will allow next operation to be processed",
),
],
compute="_compute_completion_info",
)
@api.depends(
"picking_type_id.display_completion_info",
"move_lines.common_dest_move_ids.state",
)
def _compute_completion_info(self):
for picking in self:
if (
picking.state == "draft"
or not picking.picking_type_id.display_completion_info
):
picking.completion_info = "no"
continue
# Depending moves are all the origin moves linked to the
# destination pickings' moves
depending_moves = picking.move_lines.mapped("common_dest_move_ids")
# If all the depending moves are done or canceled then next picking
# is ready to be processed
if picking.state == "done" and all(
m.state in ("done", "cancel") for m in depending_moves
):
picking.completion_info = "next_picking_ready"
continue
# If all the depending moves are the moves on the actual picking
# then it's a full order and next picking is ready to be processed
if depending_moves == picking.move_lines:
picking.completion_info = "full_order_picking"
continue
# If there aren't any depending move from another picking that is
# not done, then actual picking is the last to process
other_depending_moves = (depending_moves - picking.move_lines).filtered(
lambda m: m.state not in ("done", "cancel")
)
if not other_depending_moves:
picking.completion_info = "last_picking"
continue
picking.completion_info = "no"
class StockMove(models.Model):
_inherit = "stock.move"
def write(self, vals):
super().write(vals)
if "state" in vals:
# invalidate cache, the api.depends do not allow to find all
# the conditions to invalidate the field
self.env["stock.picking"].invalidate_cache(fnames=["completion_info"])
return True