mirror of
https://github.com/OCA/manufacture.git
synced 2025-01-28 16:37:15 +02:00
58 lines
2.3 KiB
Python
58 lines
2.3 KiB
Python
from collections import defaultdict
|
|
|
|
from odoo import _, models
|
|
from odoo.exceptions import UserError
|
|
from odoo.tools.float_utils import float_is_zero
|
|
|
|
|
|
class StockMove(models.Model):
|
|
_inherit = "stock.move"
|
|
|
|
def _action_confirm(self, merge=True, merge_into=False):
|
|
if self.origin_returned_move_id:
|
|
subcontract_details_per_picking = defaultdict(list)
|
|
move_to_not_merge = self.env["stock.move"]
|
|
for move in self:
|
|
if (
|
|
move.location_dest_id.usage == "supplier"
|
|
and move.location_id
|
|
== self.picking_id.picking_type_id.default_location_src_id
|
|
):
|
|
continue
|
|
if move.move_orig_ids.production_id:
|
|
continue
|
|
bom = move._get_subcontract_bom()
|
|
if not bom:
|
|
continue
|
|
if (
|
|
float_is_zero(
|
|
move.product_qty, precision_rounding=move.product_uom.rounding
|
|
)
|
|
and move.picking_id.immediate_transfer is True
|
|
):
|
|
raise UserError(_("To subcontract, use a planned transfer."))
|
|
subcontract_details_per_picking[move.picking_id].append((move, bom))
|
|
move.write(
|
|
{
|
|
"is_subcontract": True,
|
|
}
|
|
)
|
|
move_to_not_merge |= move
|
|
for picking, subcontract_details in subcontract_details_per_picking.items():
|
|
picking._subcontracted_produce_unbuild(subcontract_details)
|
|
|
|
# We avoid merging move due to complication with stock.rule.
|
|
res = super(StockMove, move_to_not_merge)._action_confirm(merge=False)
|
|
res |= super(StockMove, self - move_to_not_merge)._action_confirm(
|
|
merge=merge, merge_into=merge_into
|
|
)
|
|
if subcontract_details_per_picking:
|
|
self.env["stock.picking"].concat(
|
|
*list(subcontract_details_per_picking.keys())
|
|
).action_assign()
|
|
return res
|
|
result = super(StockMove, self)._action_confirm(
|
|
merge=merge, merge_into=merge_into
|
|
)
|
|
return result
|