mirror of
https://github.com/OCA/stock-logistics-warehouse.git
synced 2025-01-21 14:27:28 +02:00
87 lines
3.1 KiB
Python
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
|