78 lines
2.5 KiB
Python
78 lines
2.5 KiB
Python
# Copyright 2016 Cyril Gaudin, Camptocamp SA
|
|
# Copyright 2018 Tecnativa - Carlos Dauden
|
|
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
|
|
|
from odoo import api, fields, models
|
|
|
|
|
|
class StockPicking(models.Model):
|
|
_inherit = "stock.picking"
|
|
|
|
batch_picking_id = fields.Many2one(
|
|
comodel_name='stock.batch.picking',
|
|
string='Batch',
|
|
copy=False,
|
|
domain="[('state', '=', 'draft')]",
|
|
help='In which batch picking this picking will be processed.'
|
|
)
|
|
|
|
@api.multi
|
|
def action_cancel(self):
|
|
"""In addition to what the method in the parent class does,
|
|
cancel the batches for which all pickings are cancelled
|
|
"""
|
|
result = super(StockPicking, self).action_cancel()
|
|
self.mapped('batch_picking_id').verify_state()
|
|
|
|
return result
|
|
|
|
@api.multi
|
|
def action_assign(self):
|
|
"""In addition to what the method in the parent class does,
|
|
Changed batches states to assigned if all picking are assigned.
|
|
"""
|
|
result = super(StockPicking, self).action_assign()
|
|
self.mapped('batch_picking_id').verify_state('assigned')
|
|
|
|
return result
|
|
|
|
@api.multi
|
|
def action_done(self):
|
|
"""In addition to what the method in the parent class does,
|
|
Changed batches states to done if all picking are done.
|
|
"""
|
|
result = super(StockPicking, self).action_done()
|
|
self.mapped('batch_picking_id').verify_state()
|
|
|
|
return result
|
|
|
|
def force_transfer(self, force_qty=True):
|
|
""" Do the picking transfer (by calling action_done)
|
|
|
|
If *force_qty* is True, force the transfer for all product_uom_qty
|
|
when qty_done is 0.
|
|
|
|
Otherwise, process only pack operation with qty_done.
|
|
If a picking has no qty_done filled, we released it from his batch
|
|
"""
|
|
for pick in self:
|
|
if pick.state != 'assigned':
|
|
pick.action_assign()
|
|
if pick.state != 'assigned':
|
|
continue
|
|
|
|
if force_qty:
|
|
for pack in pick.move_line_ids:
|
|
pack.qty_done = pack.product_uom_qty
|
|
else:
|
|
if all(pack.qty_done == 0 for pack in pick.move_line_ids):
|
|
# No qties to process, release out of the batch
|
|
pick.batch_picking_id = False
|
|
continue
|
|
else:
|
|
for pack in pick.move_line_ids:
|
|
if not pack.qty_done:
|
|
pack.unlink()
|
|
|
|
pick.action_done()
|