[REF] stock: adapt to rename of stock.pack.operation into stock.mode.line
This commit is contained in:
@@ -22,8 +22,8 @@ class StockQuantPackage(models.Model):
|
||||
shipping_weight = fields.Float(string='Shipping Weight', help="Can be changed during the 'put in pack' to adjust the weight of the shipping.")
|
||||
|
||||
|
||||
class StockPackOperation(models.Model):
|
||||
_inherit = 'stock.pack.operation'
|
||||
class StockMoveLine(models.Model):
|
||||
_inherit = 'stock.move.line'
|
||||
|
||||
@api.multi
|
||||
def manage_package_type(self):
|
||||
@@ -55,22 +55,22 @@ class StockPicking(models.Model):
|
||||
return weight_uom_id
|
||||
|
||||
@api.one
|
||||
@api.depends('pack_operation_ids')
|
||||
@api.depends('move_line_ids')
|
||||
def _compute_packages(self):
|
||||
self.ensure_one()
|
||||
packs = set()
|
||||
for packop in self.pack_operation_ids:
|
||||
if packop.result_package_id and packop.result_package_id.packaging_id:
|
||||
packs.add(packop.result_package_id.id)
|
||||
for move_line in self.move_line_ids:
|
||||
if move_line.result_package_id and move_line.result_package_id.packaging_id:
|
||||
packs.add(move_line.result_package_id.id)
|
||||
self.package_ids = list(packs)
|
||||
|
||||
@api.one
|
||||
@api.depends('pack_operation_ids')
|
||||
@api.depends('move_line_ids')
|
||||
def _compute_bulk_weight(self):
|
||||
weight = 0.0
|
||||
for packop in self.pack_operation_ids:
|
||||
if packop.product_id and not packop.result_package_id:
|
||||
weight += packop.product_uom_id._compute_quantity(packop.product_qty, packop.product_id.uom_id) * packop.product_id.weight
|
||||
for move_line in self.move_line_ids:
|
||||
if move_line.product_id and not move_line.result_package_id:
|
||||
weight += move_line.product_uom_id._compute_quantity(move_line.product_qty, move_line.product_id.uom_id) * move_line.product_id.weight
|
||||
self.weight_bulk = weight
|
||||
|
||||
@api.one
|
||||
|
||||
@@ -40,8 +40,8 @@ class ChooseDeliveryPackage(models.TransientModel):
|
||||
return stock_quant_package.shipping_weight
|
||||
else:
|
||||
picking_id = self.env['stock.picking'].browse(self.env.context['active_id'])
|
||||
pack_operation_ids = [po for po in picking_id.pack_operation_ids if po.qty_done > 0 and not po.result_package_id]
|
||||
total_weight = sum([po.qty_done * po.product_id.weight for po in pack_operation_ids])
|
||||
move_line_ids = [po for po in picking_id.move_line_ids if po.qty_done > 0 and not po.result_package_id]
|
||||
total_weight = sum([po.qty_done * po.product_id.weight for po in move_line_ids])
|
||||
return total_weight
|
||||
|
||||
def put_in_pack(self):
|
||||
|
||||
@@ -466,7 +466,7 @@ class MrpProduction(models.Model):
|
||||
if len(workorders) == len(bom.routing_id.operation_ids):
|
||||
moves_raw |= self.move_raw_ids.filtered(lambda move: not move.operation_id)
|
||||
moves_finished = self.move_finished_ids.filtered(lambda move: move.operation_id == operation) #TODO: code does nothing, unless maybe by_products?
|
||||
moves_raw.mapped('pack_operation_ids').write({'workorder_id': workorder.id})
|
||||
moves_raw.mapped('move_line_ids').write({'workorder_id': workorder.id})
|
||||
(moves_finished + moves_raw).write({'workorder_id': workorder.id})
|
||||
|
||||
workorder._generate_lot_ids()
|
||||
|
||||
@@ -90,7 +90,7 @@ class MrpUnbuild(models.Model):
|
||||
consume_move = self._generate_consume_moves()[0]
|
||||
produce_moves = self._generate_produce_moves()
|
||||
if consume_move.has_tracking != 'none':
|
||||
self.env['stock.pack.operation'].create({
|
||||
self.env['stock.move.line'].create({
|
||||
'move_id': consume_move.id,
|
||||
'lot_id': self.lot_id.id,
|
||||
'qty_done': consume_move.product_uom_qty,
|
||||
@@ -106,7 +106,7 @@ class MrpUnbuild(models.Model):
|
||||
for produce_move in produce_moves:
|
||||
if produce_move.has_tracking != 'none':
|
||||
original = original_quants.filtered(lambda quant: quant.product_id == produce_move.product_id)
|
||||
self.env['stock.pack.operation'].create({
|
||||
self.env['stock.move.line'].create({
|
||||
'move_id': produce_move.id,
|
||||
'lot_id': original.lot_id.id,
|
||||
'qty_done': produce_move.product_uom_qty,
|
||||
|
||||
@@ -102,11 +102,11 @@ class MrpWorkorder(models.Model):
|
||||
move_raw_ids = fields.One2many(
|
||||
'stock.move', 'workorder_id', 'Moves')
|
||||
move_line_ids = fields.One2many(
|
||||
'stock.pack.operation', 'workorder_id', 'Moves to Track',
|
||||
'stock.move.line', 'workorder_id', 'Moves to Track',
|
||||
domain=[('done_wo', '=', True)],
|
||||
help="Inventory moves for which you must scan a lot number at this work order")
|
||||
active_move_line_ids = fields.One2many(
|
||||
'stock.pack.operation', 'workorder_id',
|
||||
'stock.move.line', 'workorder_id',
|
||||
domain=[('done_wo', '=', False)])
|
||||
final_lot_id = fields.Many2one(
|
||||
'stock.production.lot', 'Current Lot', domain="[('product_id', '=', product_id)]",
|
||||
@@ -199,7 +199,7 @@ class MrpWorkorder(models.Model):
|
||||
qty_todo = new_qty - sum(move_lots.mapped('quantity'))
|
||||
if float_compare(qty_todo, 0.0, precision_rounding=move.product_uom.rounding) > 0:
|
||||
while float_compare(qty_todo, 0.0, precision_rounding=move.product_uom.rounding) > 0:
|
||||
self.active_move_line_ids += self.env['stock.pack.operation'].new({
|
||||
self.active_move_line_ids += self.env['stock.move.line'].new({
|
||||
'move_id': move.id,
|
||||
'product_id': move.product_id.id,
|
||||
'lot_id': False,
|
||||
@@ -236,7 +236,7 @@ class MrpWorkorder(models.Model):
|
||||
def _generate_lot_ids(self):
|
||||
""" Generate stock move lines """
|
||||
self.ensure_one()
|
||||
MoveLine = self.env['stock.pack.operation']
|
||||
MoveLine = self.env['stock.move.line']
|
||||
tracked_moves = self.move_raw_ids.filtered(
|
||||
lambda move: move.state not in ('done', 'cancel') and move.product_id.tracking != 'none' and move.product_id != self.production_id.product_id)
|
||||
for move in tracked_moves:
|
||||
@@ -322,7 +322,7 @@ class MrpWorkorder(models.Model):
|
||||
if not self.next_work_order_id:
|
||||
production_move = self.production_id.move_finished_ids.filtered(lambda x: (x.product_id.id == self.production_id.product_id.id) and (x.state not in ('done', 'cancel')))
|
||||
if production_move.has_tracking != 'none':
|
||||
move_line = production_move.pack_operation_ids.filtered(lambda x: x.lot_id.id == self.final_lot_id.id)
|
||||
move_line = production_move.move_line_ids.filtered(lambda x: x.lot_id.id == self.final_lot_id.id)
|
||||
if move_line:
|
||||
move_line.product_qty += self.qty_producing
|
||||
else:
|
||||
|
||||
@@ -7,8 +7,8 @@ from odoo.tools import float_compare, float_round
|
||||
from odoo.addons import decimal_precision as dp
|
||||
|
||||
|
||||
class StockPackOperation(models.Model):
|
||||
_inherit = 'stock.pack.operation'
|
||||
class StockMoveLine(models.Model):
|
||||
_inherit = 'stock.move.line'
|
||||
|
||||
workorder_id = fields.Many2one('mrp.workorder', 'Work Order')
|
||||
production_id = fields.Many2one('mrp.production', 'Production Order')
|
||||
@@ -33,10 +33,10 @@ class StockPackOperation(models.Model):
|
||||
def write(self, vals):
|
||||
if 'lot_id' in vals:
|
||||
for movelot in self:
|
||||
movelot.move_id.production_id.move_raw_ids.mapped('pack_operation_ids')\
|
||||
movelot.move_id.production_id.move_raw_ids.mapped('move_line_ids')\
|
||||
.filtered(lambda r: r.done_wo and not r.done_move and r.lot_produced_id == movelot.lot_id)\
|
||||
.write({'lot_produced_id': vals['lot_id']})
|
||||
return super(StockPackOperation, self).write(vals)
|
||||
return super(StockMoveLine, self).write(vals)
|
||||
|
||||
|
||||
class StockMove(models.Model):
|
||||
@@ -55,7 +55,7 @@ class StockMove(models.Model):
|
||||
workorder_id = fields.Many2one(
|
||||
'mrp.workorder', 'Work Order To Consume')
|
||||
# Quantities to process, in normalized UoMs
|
||||
active_move_line_ids = fields.One2many('stock.pack.operation', 'move_id', domain=[('done_wo', '=', True)], string='Lots')
|
||||
active_move_line_ids = fields.One2many('stock.move.line', 'move_id', domain=[('done_wo', '=', True)], string='Lots')
|
||||
bom_line_id = fields.Many2one('mrp.bom.line', 'BoM Line')
|
||||
unit_factor = fields.Float('Unit Factor')
|
||||
is_done = fields.Boolean(
|
||||
@@ -80,8 +80,8 @@ class StockMove(models.Model):
|
||||
def action_assign(self):
|
||||
res = super(StockMove, self).action_assign()
|
||||
for move in self.filtered(lambda x: x.production_id or x.raw_material_production_id):
|
||||
if move.pack_operation_ids:
|
||||
move.pack_operation_ids.write({'production_id': move.raw_material_production_id.id,
|
||||
if move.move_line_ids:
|
||||
move.move_line_ids.write({'production_id': move.raw_material_production_id.id,
|
||||
'workorder_id': move.workorder_id.id,})
|
||||
return res
|
||||
|
||||
@@ -99,7 +99,7 @@ class StockMove(models.Model):
|
||||
view = self.env.ref('mrp.view_stock_move_lots')
|
||||
serial = (self.has_tracking == 'serial')
|
||||
only_create = False # Check operation type in theory
|
||||
show_reserved = any([x for x in self.pack_operation_ids if x.product_qty > 0.0])
|
||||
show_reserved = any([x for x in self.move_line_ids if x.product_qty > 0.0])
|
||||
ctx.update({
|
||||
'serial': serial,
|
||||
'only_create': only_create,
|
||||
|
||||
@@ -79,7 +79,7 @@ class ChangeProductionQty(models.TransientModel):
|
||||
if wo == production.workorder_ids[-1]:
|
||||
moves_raw |= production.move_raw_ids.filtered(lambda move: not move.operation_id)
|
||||
moves_finished = production.move_finished_ids.filtered(lambda move: move.operation_id == operation) #TODO: code does nothing, unless maybe by_products?
|
||||
moves_raw.mapped('pack_operation_ids').write({'workorder_id': wo.id})
|
||||
moves_raw.mapped('move_line_ids').write({'workorder_id': wo.id})
|
||||
(moves_finished + moves_raw).write({'workorder_id': wo.id})
|
||||
if wo.move_raw_ids.filtered(lambda x: x.product_id.tracking != 'none') and not wo.active_move_line_ids:
|
||||
wo._generate_lot_ids()
|
||||
|
||||
@@ -29,7 +29,7 @@ class MrpProductProduce(models.TransientModel):
|
||||
lines = []
|
||||
existing_lines = []
|
||||
for move in production.move_raw_ids.filtered(lambda x: (x.product_id.tracking != 'none') and x.state not in ('done', 'cancel')):
|
||||
if not move.pack_operation_ids.filtered(lambda x: not x.lot_produced_id):
|
||||
if not move.move_line_ids.filtered(lambda x: not x.lot_produced_id):
|
||||
qty = quantity / move.bom_line_id.bom_id.product_qty * move.bom_line_id.product_qty
|
||||
if move.product_id.tracking == 'serial':
|
||||
while float_compare(qty, 0.0, precision_rounding=move.product_uom.rounding) > 0:
|
||||
@@ -56,7 +56,7 @@ class MrpProductProduce(models.TransientModel):
|
||||
'location_dest_id': move.location_dest_id.id,
|
||||
})
|
||||
else:
|
||||
existing_lines += move.pack_operation_ids.filtered(lambda x: not x.lot_produced_id).ids
|
||||
existing_lines += move.move_line_ids.filtered(lambda x: not x.lot_produced_id).ids
|
||||
|
||||
res['serial'] = serial
|
||||
res['production_id'] = production.id
|
||||
@@ -72,7 +72,7 @@ class MrpProductProduce(models.TransientModel):
|
||||
product_qty = fields.Float(string='Quantity', digits=dp.get_precision('Product Unit of Measure'), required=True)
|
||||
product_uom_id = fields.Many2one('product.uom', 'Unit of Measure')
|
||||
lot_id = fields.Many2one('stock.production.lot', string='Lot')
|
||||
consume_line_ids = fields.Many2many('stock.pack.operation', 'mrp_produce_stock_pack_operation', string='Product to Track')
|
||||
consume_line_ids = fields.Many2many('stock.move.line', 'mrp_produce_stock_move_line', string='Product to Track')
|
||||
product_tracking = fields.Selection(related="product_id.tracking")
|
||||
|
||||
@api.multi
|
||||
@@ -104,12 +104,12 @@ class MrpProductProduce(models.TransientModel):
|
||||
|
||||
@api.multi
|
||||
def check_finished_move_lots(self):
|
||||
packs = self.env['stock.pack.operation']
|
||||
packs = self.env['stock.move.line']
|
||||
produce_move = self.production_id.move_finished_ids.filtered(lambda x: x.product_id == self.product_id and x.state not in ('done', 'cancel'))
|
||||
if produce_move and produce_move.product_id.tracking != 'none':
|
||||
if not self.lot_id:
|
||||
raise UserError(_('You need to provide a lot for the finished product'))
|
||||
existing_move_line = produce_move.pack_operation_ids.filtered(lambda x: x.lot_id == self.lot_id)
|
||||
existing_move_line = produce_move.move_line_ids.filtered(lambda x: x.lot_id == self.lot_id)
|
||||
if existing_move_line:
|
||||
existing_move_line.product_qty += self.product_qty
|
||||
existing_move_line.qty_done += self.product_qty
|
||||
@@ -127,7 +127,7 @@ class MrpProductProduce(models.TransientModel):
|
||||
}
|
||||
packs.create(vals)
|
||||
for move in self.production_id.move_raw_ids:
|
||||
for moveline in move.pack_operation_ids.filtered(lambda x: not x.lot_produced_id):
|
||||
for moveline in move.move_line_ids.filtered(lambda x: not x.lot_produced_id):
|
||||
if moveline.qty_done and self.lot_id:
|
||||
#Possibly the entire move is selected
|
||||
remaining_qty = moveline.product_uom_qty - moveline.qty_done
|
||||
|
||||
@@ -432,8 +432,8 @@ class Repair(models.Model):
|
||||
'partner_id': repair.address_id.id,
|
||||
'location_id': operation.location_id.id,
|
||||
'location_dest_id': operation.location_dest_id.id,
|
||||
'pack_operation_ids': [(0, 0, {'product_id': operation.product_id.id,
|
||||
'lot_id': operation.lot_id.id,
|
||||
'move_line_ids': [(0, 0, {'product_id': operation.product_id.id,
|
||||
'lot_id': operation.lot_id.id,
|
||||
'product_uom_qty': 0, # bypass reservation here
|
||||
'product_uom_id': operation.product_uom.id,
|
||||
'qty_done': operation.product_uom_qty,
|
||||
@@ -453,8 +453,8 @@ class Repair(models.Model):
|
||||
'partner_id': repair.address_id.id,
|
||||
'location_id': repair.location_id.id,
|
||||
'location_dest_id': repair.location_dest_id.id,
|
||||
'pack_operation_ids': [(0, 0, {'product_id': repair.product_id.id,
|
||||
'lot_id': repair.lot_id.id,
|
||||
'move_line_ids': [(0, 0, {'product_id': repair.product_id.id,
|
||||
'lot_id': repair.lot_id.id,
|
||||
'product_uom_qty': 0, # bypass reservation here
|
||||
'product_uom_id': repair.product_uom.id or repair.product_id.uom_id.id,
|
||||
'qty_done': repair.product_qty,
|
||||
|
||||
@@ -724,7 +724,7 @@ class PosOrder(models.Model):
|
||||
has_wrong_lots = True
|
||||
for pack_lot in pack_lots:
|
||||
lot_id, qty = pack_lot['lot_id'], pack_lot['qty']
|
||||
self.env['stock.pack.operation'].create({
|
||||
self.env['stock.move.line'].create({
|
||||
'move_id': move.id,
|
||||
'product_id': move.product_id.id,
|
||||
'product_uom_id': move.product_uom.id,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<odoo>
|
||||
<template id="report_delivery_document_inherit_product_expiry" inherit_id="stock.report_delivery_document">
|
||||
<xpath expr="//th[@name='lot_serial']" position="inside">
|
||||
<t t-if="any([lot.lot_id.use_date for operation in o.pack_operation_ids for lot in operation.pack_lot_ids])">
|
||||
<t t-if="any([lot.lot_id.use_date for operation in o.move_line_ids for lot in operation.pack_lot_ids])">
|
||||
<span class="pull-right">Expiry Date</span>
|
||||
</t>
|
||||
</xpath>
|
||||
|
||||
@@ -54,7 +54,7 @@ class TestCreatePicking(common.TestProductCommon):
|
||||
# Validate first shipment
|
||||
self.picking = self.po.picking_ids[0]
|
||||
self.picking.force_assign()
|
||||
for ml in self.picking.pack_operation_ids:
|
||||
for ml in self.picking.move_line_ids:
|
||||
ml.qty_done = ml.product_uom_qty
|
||||
self.picking.action_done()
|
||||
self.assertEqual(self.po.order_line.mapped('qty_received'), [7.0], 'Purchase: all products should be received')
|
||||
|
||||
@@ -75,7 +75,7 @@ class TestPurchaseOrder(AccountingTestCase):
|
||||
self.assertEqual(self.po.picking_count, 1, 'Purchase: one picking should be created"')
|
||||
self.picking = self.po.picking_ids[0]
|
||||
self.picking.force_assign()
|
||||
self.picking.pack_operation_ids.write({'qty_done': 5.0})
|
||||
self.picking.move_line_ids.write({'qty_done': 5.0})
|
||||
self.picking.button_validate()
|
||||
self.assertEqual(self.po.order_line.mapped('qty_received'), [5.0, 5.0], 'Purchase: all products should be received"')
|
||||
|
||||
@@ -109,7 +109,7 @@ class TestPurchaseOrder(AccountingTestCase):
|
||||
self.assertEqual(self.po.picking_count, 1, 'Purchase: one picking should be created"')
|
||||
self.picking = self.po.picking_ids[0]
|
||||
self.picking.force_assign()
|
||||
self.picking.pack_operation_ids.write({'qty_done': 5.0})
|
||||
self.picking.move_line_ids.write({'qty_done': 5.0})
|
||||
self.picking.button_validate()
|
||||
self.assertEqual(self.po.order_line.mapped('qty_received'), [5.0, 5.0], 'Purchase: all products should be received"')
|
||||
|
||||
@@ -139,7 +139,7 @@ class TestPurchaseOrder(AccountingTestCase):
|
||||
|
||||
# Validate picking
|
||||
return_pick.force_assign()
|
||||
return_pick.pack_operation_ids.write({'qty_done': 2})
|
||||
return_pick.move_line_ids.write({'qty_done': 2})
|
||||
|
||||
return_pick.button_validate()
|
||||
|
||||
|
||||
@@ -91,7 +91,7 @@
|
||||
picking_type_id: stock.picking_type_out
|
||||
location_id: stock.stock_location_stock
|
||||
location_dest_id: stock.stock_location_customers
|
||||
pack_operation_ids:
|
||||
move_line_ids:
|
||||
- product_id: product.product_product_6
|
||||
qty_done: 100
|
||||
product_uom_id: product.product_uom_unit
|
||||
@@ -231,7 +231,7 @@
|
||||
location_id: stock.stock_location_suppliers
|
||||
location_dest_id: stock.stock_location_shop0
|
||||
state: done
|
||||
pack_operation_ids:
|
||||
move_line_ids:
|
||||
- product_id: product.product_delivery_01
|
||||
qty_done: 100
|
||||
product_uom_id: product.product_uom_unit
|
||||
@@ -296,7 +296,7 @@
|
||||
picking_type_id: chi_picking_type_out
|
||||
location_id: stock.stock_location_shop0
|
||||
location_dest_id: stock.stock_location_customers
|
||||
pack_operation_ids:
|
||||
move_line_ids:
|
||||
- product_id: product.product_product_6
|
||||
qty_done: 100
|
||||
product_uom_id: product.product_uom_unit
|
||||
|
||||
@@ -12,7 +12,7 @@ from . import stock_incoterms
|
||||
from . import stock_inventory
|
||||
from . import stock_location
|
||||
from . import stock_move
|
||||
from . import stock_pack_operation
|
||||
from . import stock_move_line
|
||||
from . import stock_production_lot
|
||||
from . import stock_picking
|
||||
from . import stock_quant
|
||||
|
||||
@@ -412,7 +412,7 @@ class InventoryLine(models.Model):
|
||||
'restrict_partner_id': self.partner_id.id,
|
||||
'location_id': location_id,
|
||||
'location_dest_id': location_dest_id,
|
||||
'pack_operation_ids': [(0, 0, {'product_id': self.product_id.id,
|
||||
'move_line_ids': [(0, 0, {'product_id': self.product_id.id,
|
||||
'lot_id': self.prod_lot_id.id,
|
||||
'product_uom_qty': 0, # bypass reservation here
|
||||
'product_uom_id': self.product_uom_id.id,
|
||||
|
||||
@@ -130,8 +130,8 @@ class StockMove(models.Model):
|
||||
help='If checked, when this move is cancelled, cancel the linked move too')
|
||||
picking_type_id = fields.Many2one('stock.picking.type', 'Operation Type')
|
||||
inventory_id = fields.Many2one('stock.inventory', 'Inventory')
|
||||
pack_operation_ids = fields.One2many('stock.pack.operation', 'move_id')
|
||||
pack_operation_nosuggest_ids = fields.One2many('stock.pack.operation', 'move_id', domain=[('product_qty', '=', 0.0)])
|
||||
move_line_ids = fields.One2many('stock.move.line', 'move_id')
|
||||
move_line_nosuggest_ids = fields.One2many('stock.move.line', 'move_id', domain=[('product_qty', '=', 0.0)])
|
||||
origin_returned_move_id = fields.Many2one('stock.move', 'Origin return move', copy=False, help='Move that created the return move')
|
||||
returned_move_ids = fields.One2many('stock.move', 'origin_returned_move_id', 'All returned moves', help='Optional: all returned moves created from this move')
|
||||
reserved_availability = fields.Float(
|
||||
@@ -161,7 +161,7 @@ class StockMove(models.Model):
|
||||
is_initial_demand_editable = fields.Boolean('Is initial demand editable', compute='_compute_is_initial_demand_editable')
|
||||
|
||||
@api.multi
|
||||
@api.depends('has_tracking', 'pack_operation_ids', 'location_id', 'location_dest_id', 'is_editable')
|
||||
@api.depends('has_tracking', 'move_line_ids', 'location_id', 'location_dest_id', 'is_editable')
|
||||
def _compute_show_details_visible(self):
|
||||
""" According to this field, the button that calls `action_show_details` will be displayed
|
||||
to work on a move from its picking form view, or not.
|
||||
@@ -178,10 +178,10 @@ class StockMove(models.Model):
|
||||
multi_locations_enabled = False
|
||||
if self.user_has_groups('stock.group_stock_multi_locations'):
|
||||
multi_locations_enabled = move.location_id.child_ids or move.location_dest_id.child_ids
|
||||
has_package = move.pack_operation_ids.mapped('package_id') | move.pack_operation_ids.mapped('result_package_id')
|
||||
has_package = move.move_line_ids.mapped('package_id') | move.move_line_ids.mapped('result_package_id')
|
||||
if move.picking_id.picking_type_id.show_operations is False\
|
||||
and move.state not in ['cancel', 'draft', 'confirmed']\
|
||||
and (multi_locations_enabled or move.has_tracking != 'none' or len(move.pack_operation_ids) > 1 or has_package):
|
||||
and (multi_locations_enabled or move.has_tracking != 'none' or len(move.move_line_ids) > 1 or has_package):
|
||||
move.show_details_visible = True
|
||||
else:
|
||||
move.show_details_visible = False
|
||||
@@ -216,10 +216,10 @@ class StockMove(models.Model):
|
||||
""" This will return the move lines to consider when applying _quantity_done_compute on a stock.move.
|
||||
In some context, such as MRP, it is necessary to compute quantity_done on filtered sock.move.line."""
|
||||
self.ensure_one()
|
||||
return self.pack_operation_ids
|
||||
return self.move_line_ids
|
||||
|
||||
@api.multi
|
||||
@api.depends('pack_operation_ids.qty_done', 'pack_operation_ids.product_uom_id')
|
||||
@api.depends('move_line_ids.qty_done', 'move_line_ids.product_uom_id')
|
||||
def _quantity_done_compute(self):
|
||||
for move in self:
|
||||
for move_line in move._get_move_lines():
|
||||
@@ -234,8 +234,8 @@ class StockMove(models.Model):
|
||||
if not move_lines:
|
||||
if quantity_done:
|
||||
# do not impact reservation here
|
||||
move_line = self.env['stock.pack.operation'].create(dict(move._prepare_move_line_vals(), qty_done=quantity_done))
|
||||
move.write({'pack_operation_ids': [(4, move_line.id)]})
|
||||
move_line = self.env['stock.move.line'].create(dict(move._prepare_move_line_vals(), qty_done=quantity_done))
|
||||
move.write({'move_line_ids': [(4, move_line.id)]})
|
||||
elif len(move_lines) == 1:
|
||||
move_lines[0].qty_done = quantity_done
|
||||
else:
|
||||
@@ -250,13 +250,13 @@ class StockMove(models.Model):
|
||||
|
||||
|
||||
@api.one
|
||||
@api.depends('pack_operation_ids.product_qty')
|
||||
@api.depends('move_line_ids.product_qty')
|
||||
def _compute_reserved_availability(self):
|
||||
""" Fill the `availability` field on a stock move, which is the actual reserved quantity
|
||||
and is represented by the aggregated `product_qty` on the linked move lines. If the move
|
||||
is force assigned, the value will be 0.
|
||||
"""
|
||||
self.reserved_availability = self.product_id.uom_id._compute_quantity(sum(self.pack_operation_ids.mapped('product_qty')), self.product_uom, rounding_method='HALF-UP')
|
||||
self.reserved_availability = self.product_id.uom_id._compute_quantity(sum(self.move_line_ids.mapped('product_qty')), self.product_uom, rounding_method='HALF-UP')
|
||||
|
||||
@api.one
|
||||
@api.depends('state', 'product_id', 'product_qty', 'location_id')
|
||||
@@ -407,7 +407,7 @@ class StockMove(models.Model):
|
||||
self.ensure_one()
|
||||
|
||||
# If "show suggestions" is not checked on the picking type, we have to filter out the
|
||||
# reserved move lines. We do this by displaying `pack_operation_nosuggest_ids`. We use
|
||||
# reserved move lines. We do this by displaying `move_line_nosuggest_ids`. We use
|
||||
# different views to display one field or another so that the webclient doesn't have to
|
||||
# fetch both.
|
||||
if self.picking_id.picking_type_id.show_reserved:
|
||||
@@ -639,14 +639,14 @@ class StockMove(models.Model):
|
||||
move.write({'state': 'assigned'})
|
||||
|
||||
@api.multi
|
||||
def check_tracking(self, pack_operation):
|
||||
def check_tracking(self, move_line):
|
||||
""" Checks if serial number is assigned to stock move or not and raise an error if it had to. """
|
||||
# TDE FIXME: I cannot able to understand
|
||||
for move in self:
|
||||
if move.picking_id and \
|
||||
(move.picking_id.picking_type_id.use_existing_lots or move.picking_id.picking_type_id.use_create_lots) and \
|
||||
move.product_id.tracking != 'none' and \
|
||||
not (move.restrict_lot_id or (pack_operation and (pack_operation.product_id and pack_operation.pack_lot_ids)) or (pack_operation and not pack_operation.product_id)):
|
||||
not (move.restrict_lot_id or (move_line and (move_line.product_id and move_line.pack_lot_ids)) or (move_line and not move_line.product_id)):
|
||||
raise UserError(_('You need to provide a Lot/Serial Number for product %s') % move.product_id.name)
|
||||
|
||||
def _prepare_move_line_vals(self, quantity=None, reserved_quant=None):
|
||||
@@ -694,15 +694,15 @@ class StockMove(models.Model):
|
||||
package_id=package_id, owner_id=owner_id, strict=strict
|
||||
)
|
||||
for reserved_quant, quantity in quants:
|
||||
to_update = self.pack_operation_ids.filtered(lambda m: m.location_id.id == reserved_quant.location_id.id and m.lot_id.id == reserved_quant.lot_id.id and m.package_id.id == reserved_quant.package_id.id and m.owner_id.id == reserved_quant.owner_id.id)
|
||||
to_update = self.move_line_ids.filtered(lambda m: m.location_id.id == reserved_quant.location_id.id and m.lot_id.id == reserved_quant.lot_id.id and m.package_id.id == reserved_quant.package_id.id and m.owner_id.id == reserved_quant.owner_id.id)
|
||||
if to_update:
|
||||
to_update[0].with_context(bypass_reservation_update=True).product_uom_qty += self.product_id.uom_id._compute_quantity(taken_quantity, self.product_uom, rounding_method='HALF-UP')
|
||||
else:
|
||||
if self.product_id.tracking == 'serial':
|
||||
for i in range(0, int(quantity)):
|
||||
self.env['stock.pack.operation'].create(self._prepare_move_line_vals(quantity=1, reserved_quant=reserved_quant))
|
||||
self.env['stock.move.line'].create(self._prepare_move_line_vals(quantity=1, reserved_quant=reserved_quant))
|
||||
else:
|
||||
self.env['stock.pack.operation'].create(self._prepare_move_line_vals(quantity=quantity, reserved_quant=reserved_quant))
|
||||
self.env['stock.move.line'].create(self._prepare_move_line_vals(quantity=quantity, reserved_quant=reserved_quant))
|
||||
return taken_quantity
|
||||
|
||||
@api.multi
|
||||
@@ -718,11 +718,11 @@ class StockMove(models.Model):
|
||||
# create the move line(s) but do not impact quants
|
||||
if move.product_id.tracking == 'serial':
|
||||
for i in range(0, int(move.product_qty)):
|
||||
move_line_id = self.env['stock.pack.operation'].create(move._prepare_move_line_vals(quantity=1))
|
||||
move.write({'pack_operation_ids': [(4, move_line_id.id, 0)]})
|
||||
move_line_id = self.env['stock.move.line'].create(move._prepare_move_line_vals(quantity=1))
|
||||
move.write({'move_line_ids': [(4, move_line_id.id, 0)]})
|
||||
else:
|
||||
move_line_id = self.env['stock.pack.operation'].create(move._prepare_move_line_vals(quantity=move.product_qty))
|
||||
move.write({'pack_operation_ids': [(4, move_line_id.id, 0)]})
|
||||
move_line_id = self.env['stock.move.line'].create(move._prepare_move_line_vals(quantity=move.product_qty))
|
||||
move.write({'move_line_ids': [(4, move_line_id.id, 0)]})
|
||||
move.write({'state': 'assigned'})
|
||||
else:
|
||||
if not move.move_orig_ids:
|
||||
@@ -741,24 +741,24 @@ class StockMove(models.Model):
|
||||
else:
|
||||
# Check what our parents brought and what our siblings took in order to
|
||||
# determine what we can distribute.
|
||||
move_lines_in = move.move_orig_ids.filtered(lambda m: m.state == 'done').mapped('pack_operation_ids')
|
||||
move_lines_in = move.move_orig_ids.filtered(lambda m: m.state == 'done').mapped('move_line_ids')
|
||||
keys_in = ['location_dest_id', 'lot_id', 'result_package_id', 'owner_id']
|
||||
grouped_move_lines_in = {}
|
||||
for k, g in groupby(sorted(move_lines_in, key=itemgetter(*keys_in)), key=itemgetter(*keys_in)):
|
||||
grouped_move_lines_in[k] = sum(self.env['stock.pack.operation'].concat(*list(g)).mapped('qty_done'))
|
||||
grouped_move_lines_in[k] = sum(self.env['stock.move.line'].concat(*list(g)).mapped('qty_done'))
|
||||
|
||||
move_lines_out_done = (move.move_orig_ids.mapped('move_dest_ids') - move)\
|
||||
.filtered(lambda m: m.state in ['done'])\
|
||||
.mapped('pack_operation_ids')
|
||||
.mapped('move_line_ids')
|
||||
move_lines_out_reserved = (move.move_orig_ids.mapped('move_dest_ids') - move)\
|
||||
.filtered(lambda m: m.state in ['partially_available', 'assigned'])\
|
||||
.mapped('pack_operation_ids')
|
||||
.mapped('move_line_ids')
|
||||
keys_out = ['location_id', 'lot_id', 'package_id', 'owner_id']
|
||||
grouped_move_lines_out = {}
|
||||
for k, g in groupby(sorted(move_lines_out_done, key=itemgetter(*keys_out)), key=itemgetter(*keys_out)):
|
||||
grouped_move_lines_out[k] = sum(self.env['stock.pack.operation'].concat(*list(g)).mapped('qty_done'))
|
||||
grouped_move_lines_out[k] = sum(self.env['stock.move.line'].concat(*list(g)).mapped('qty_done'))
|
||||
for k, g in groupby(sorted(move_lines_out_reserved, key=itemgetter(*keys_out)), key=itemgetter(*keys_out)):
|
||||
grouped_move_lines_out[k] = sum(self.env['stock.pack.operation'].concat(*list(g)).mapped('product_qty'))
|
||||
grouped_move_lines_out[k] = sum(self.env['stock.move.line'].concat(*list(g)).mapped('product_qty'))
|
||||
available_move_lines = {key: grouped_move_lines_in[key] - grouped_move_lines_out.get(key, 0) for key in grouped_move_lines_in.keys()}
|
||||
# pop key if the quantity available amount to 0
|
||||
available_move_lines = dict((k, v) for k, v in available_move_lines.iteritems() if v)
|
||||
@@ -769,7 +769,7 @@ class StockMove(models.Model):
|
||||
if available_move_lines.get((move_line.location_id, move_line.lot_id, move_line.result_package_id, move_line.owner_id)):
|
||||
available_move_lines[(move_line.location_id, move_line.lot_id, move_line.result_package_id, move_line.owner_id)] -= move_line.product_qty
|
||||
for (location_id, lot_id, package_id, owner_id), quantity in available_move_lines.items():
|
||||
need = move.product_qty - sum(move.pack_operation_ids.mapped('product_qty'))
|
||||
need = move.product_qty - sum(move.move_line_ids.mapped('product_qty'))
|
||||
taken_quantity = move._increase_reserved_quantity(need, quantity, location_id, lot_id, package_id, owner_id)
|
||||
if need - taken_quantity == 0.0:
|
||||
move.state = 'assigned'
|
||||
@@ -827,7 +827,7 @@ class StockMove(models.Model):
|
||||
extra_move = self.copy(default=extra_move_vals).action_confirm()
|
||||
|
||||
# link it to some move lines
|
||||
for move_line in self.pack_operation_ids.filtered(lambda ml: ml.qty_done):
|
||||
for move_line in self.move_line_ids.filtered(lambda ml: ml.qty_done):
|
||||
if float_compare(move_line.qty_done, extra_move_quantity, precision_rounding=rounding) <= 0:
|
||||
# move this move line to our extra move
|
||||
move_line.move_id = extra_move.id
|
||||
@@ -872,7 +872,7 @@ class StockMove(models.Model):
|
||||
# Need to do some kind of conversion here
|
||||
qty_split = move.product_uom._compute_quantity(move.product_uom_qty - move.quantity_done, move.product_id.uom_id)
|
||||
new_move = move.split(qty_split)
|
||||
for move_line in move.pack_operation_ids:
|
||||
for move_line in move.move_line_ids:
|
||||
if move_line.product_qty:
|
||||
# FIXME: there will be an issue if the move was partially available
|
||||
# By decreasing `product_qty`, we free the reservation.
|
||||
@@ -883,9 +883,9 @@ class StockMove(models.Model):
|
||||
pass
|
||||
|
||||
# If you were already putting stock.move.lots on the next one in the work order, transfer those to the new move
|
||||
move.pack_operation_ids.filtered(lambda x: x.qty_done == 0.0).write({'move_id': new_move})
|
||||
move.move_line_ids.filtered(lambda x: x.qty_done == 0.0).write({'move_id': new_move})
|
||||
self.browse(new_move).quantity_done = 0.0
|
||||
for packop in move.pack_operation_ids:
|
||||
for packop in move.move_line_ids:
|
||||
if float_compare(packop.qty_done, 0, precision_rounding=rounding) > 0:
|
||||
if move.has_tracking != 'none' and (move.picking_type_id.use_create_lots or move.picking_type_id.use_existing_lots):
|
||||
if packop.lot_name and not packop.lot_id:
|
||||
@@ -905,7 +905,7 @@ class StockMove(models.Model):
|
||||
backorder_picking = picking.copy({
|
||||
'name': '/',
|
||||
'move_lines': [],
|
||||
'pack_operation_ids': [],
|
||||
'move_line_ids': [],
|
||||
'backorder_id': picking.id
|
||||
})
|
||||
picking.message_post('Backorder Created') #message needs to be improved
|
||||
|
||||
@@ -9,8 +9,8 @@ from odoo.tools.pycompat import izip
|
||||
from odoo.tools.float_utils import float_round, float_compare, float_is_zero
|
||||
|
||||
|
||||
class PackOperation(models.Model):
|
||||
_name = "stock.pack.operation" #TODO: change to stock.move.operation
|
||||
class StockMoveLine(models.Model):
|
||||
_name = "stock.move.line"
|
||||
_description = "Packing Operation"
|
||||
_order = "result_package_id desc, id"
|
||||
|
||||
@@ -94,7 +94,7 @@ class PackOperation(models.Model):
|
||||
@api.model
|
||||
def create(self, vals):
|
||||
vals['ordered_qty'] = vals.get('product_uom_qty')
|
||||
ml = super(PackOperation, self).create(vals)
|
||||
ml = super(StockMoveLine, self).create(vals)
|
||||
if ml.state == 'done':
|
||||
Quant = self.env['stock.quant']
|
||||
quantity = ml.product_uom_id._compute_quantity(ml.qty_done, ml.move_id.product_id.uom_id,rounding_method='HALF-UP')
|
||||
@@ -121,7 +121,7 @@ class PackOperation(models.Model):
|
||||
the old quants and allocate the new ones.
|
||||
"""
|
||||
if self.env.context.get('bypass_reservation_update'):
|
||||
return super(PackOperation, self).write(vals)
|
||||
return super(StockMoveLine, self).write(vals)
|
||||
|
||||
Quant = self.env['stock.quant']
|
||||
# We forbid to change the reserved quantity in the interace, but it is needed in the
|
||||
@@ -219,7 +219,7 @@ class PackOperation(models.Model):
|
||||
Quant._increase_available_quantity(product_id, location_dest_id, quantity, lot_id=lot_id, package_id=result_package_id, owner_id=owner_id)
|
||||
# Unreserve and reserve following move in order to have the real reserved quantity on move_line.
|
||||
next_moves |= ml.move_id.move_dest_ids.filtered(lambda move: move.state not in ('done', 'cancel'))
|
||||
res = super(PackOperation, self).write(vals)
|
||||
res = super(StockMoveLine, self).write(vals)
|
||||
next_moves.do_unreserve()
|
||||
next_moves.action_assign()
|
||||
return res
|
||||
@@ -234,7 +234,7 @@ class PackOperation(models.Model):
|
||||
if ml.location_id.should_impact_quants() and ml.product_id.type == 'product' and not float_is_zero(ml.product_qty, precision_digits=precision):
|
||||
self.env['stock.quant']._decrease_reserved_quantity(ml.product_id, ml.location_id, ml.product_qty, lot_id=ml.lot_id,
|
||||
package_id=ml.package_id, owner_id=ml.owner_id)
|
||||
return super(PackOperation, self).unlink()
|
||||
return super(StockMoveLine, self).unlink()
|
||||
|
||||
def action_done(self):
|
||||
""" This method will finalize the work with a move line by "moving" quants to the
|
||||
@@ -296,7 +296,7 @@ class PackOperation(models.Model):
|
||||
('qty_done', '=', 0.0),
|
||||
('id', '!=', self.id),
|
||||
]
|
||||
oudated_candidates = self.env['stock.pack.operation'].search(oudated_move_lines_domain)
|
||||
oudated_candidates = self.env['stock.move.line'].search(oudated_move_lines_domain)
|
||||
|
||||
# As the move's state is not computed over the move lines, we'll have to manually
|
||||
# recompute the moves which we adapted their lines.
|
||||
|
||||
@@ -268,12 +268,12 @@ class Picking(models.Model):
|
||||
index=True, required=True,
|
||||
states={'done': [('readonly', True)], 'cancel': [('readonly', True)]})
|
||||
|
||||
pack_operation_ids = fields.One2many(
|
||||
'stock.pack.operation', 'picking_id', 'Operations',
|
||||
move_line_ids = fields.One2many(
|
||||
'stock.move.line', 'picking_id', 'Operations',
|
||||
states={'done': [('readonly', True)], 'cancel': [('readonly', True)]})
|
||||
|
||||
pack_operation_exist = fields.Boolean(
|
||||
'Has Pack Operations', compute='_compute_pack_operation_exist',
|
||||
move_line_exist = fields.Boolean(
|
||||
'Has Pack Operations', compute='_compute_move_line_exist',
|
||||
help='Check the existence of pack operation on the picking')
|
||||
|
||||
has_packages = fields.Boolean(
|
||||
@@ -370,13 +370,13 @@ class Picking(models.Model):
|
||||
self.has_scrap_move = bool(self.env['stock.move'].search_count([('picking_id', '=', self.id), ('scrapped', '=', True)]))
|
||||
|
||||
@api.one
|
||||
def _compute_pack_operation_exist(self):
|
||||
self.pack_operation_exist = bool(self.pack_operation_ids)
|
||||
def _compute_move_line_exist(self):
|
||||
self.move_line_exist = bool(self.move_line_ids)
|
||||
|
||||
@api.one
|
||||
def _compute_has_packages(self):
|
||||
has_packages = False
|
||||
for pack_op in self.pack_operation_ids:
|
||||
for pack_op in self.move_line_ids:
|
||||
if pack_op.result_package_id:
|
||||
has_packages = True
|
||||
break
|
||||
@@ -458,7 +458,7 @@ class Picking(models.Model):
|
||||
|
||||
@api.one
|
||||
def action_assign_owner(self):
|
||||
self.pack_operation_ids.write({'owner_id': self.owner_id.id})
|
||||
self.move_line_ids.write({'owner_id': self.owner_id.id})
|
||||
|
||||
@api.multi
|
||||
def do_print_picking(self):
|
||||
@@ -518,9 +518,9 @@ class Picking(models.Model):
|
||||
# Check if there are ops not linked to moves yet
|
||||
for pick in self:
|
||||
# # Explode manually added packages
|
||||
# for ops in pick.pack_operation_ids.filtered(lambda x: not x.move_id and not x.product_id):
|
||||
# for ops in pick.move_line_ids.filtered(lambda x: not x.move_id and not x.product_id):
|
||||
# for quant in ops.package_id.quant_ids: #Or use get_content for multiple levels
|
||||
# self.pack_operation_ids.create({'product_id': quant.product_id.id,
|
||||
# self.move_line_ids.create({'product_id': quant.product_id.id,
|
||||
# 'package_id': quant.package_id.id,
|
||||
# 'result_package_id': ops.result_package_id,
|
||||
# 'lot_id': quant.lot_id.id,
|
||||
@@ -533,7 +533,7 @@ class Picking(models.Model):
|
||||
# 'picking_id': pick.id
|
||||
# }) # Might change first element
|
||||
# # Link existing moves or add moves when no one is related
|
||||
for ops in pick.pack_operation_ids.filtered(lambda x: not x.move_id):
|
||||
for ops in pick.move_line_ids.filtered(lambda x: not x.move_id):
|
||||
# Search move with this product
|
||||
moves = pick.move_lines.filtered(lambda x: x.product_id == ops.product_id)
|
||||
if moves: #could search move that needs it the most (that has some quantities left)
|
||||
@@ -561,10 +561,10 @@ class Picking(models.Model):
|
||||
def _check_entire_pack(self):
|
||||
""" This function check if entire packs are moved in the picking"""
|
||||
for picking in self:
|
||||
origin_packages = picking.pack_operation_ids.mapped("package_id")
|
||||
origin_packages = picking.move_line_ids.mapped("package_id")
|
||||
for pack in origin_packages:
|
||||
all_in = True
|
||||
packops = picking.pack_operation_ids.filtered(lambda x: x.package_id == pack)
|
||||
packops = picking.move_line_ids.filtered(lambda x: x.package_id == pack)
|
||||
keys = ['product_id', 'lot_id']
|
||||
|
||||
grouped_quants = {}
|
||||
@@ -573,7 +573,7 @@ class Picking(models.Model):
|
||||
|
||||
grouped_ops = {}
|
||||
for k, g in groupby(sorted(packops, key=itemgetter(*keys)), key=itemgetter(*keys)):
|
||||
grouped_ops[k] = sum(self.env['stock.pack.operation'].concat(*list(g)).mapped('product_qty'))
|
||||
grouped_ops[k] = sum(self.env['stock.move.line'].concat(*list(g)).mapped('product_qty'))
|
||||
if any(grouped_quants[key] - grouped_ops.get(key, 0) != 0 for key in grouped_quants)\
|
||||
or any(grouped_ops[key] - grouped_quants[key] != 0 for key in grouped_ops):
|
||||
all_in = False
|
||||
@@ -590,15 +590,15 @@ class Picking(models.Model):
|
||||
@api.multi
|
||||
def button_validate(self):
|
||||
self.ensure_one()
|
||||
pack_operations_delete = self.env['stock.pack.operation']
|
||||
if not self.move_lines and not self.pack_operation_ids:
|
||||
move_line_delete = self.env['stock.move.line']
|
||||
if not self.move_lines and not self.move_line_ids:
|
||||
raise UserError(_('Please add some lines to move'))
|
||||
# In draft or with no pack operations edited yet, ask if we can just do everything
|
||||
if self.state == 'draft' or all([x.qty_done == 0.0 for x in self.pack_operation_ids]):
|
||||
if self.state == 'draft' or all([x.qty_done == 0.0 for x in self.move_line_ids]):
|
||||
# If no lots when needed, raise error
|
||||
picking_type = self.picking_type_id
|
||||
if (picking_type.use_create_lots or picking_type.use_existing_lots):
|
||||
for pack in self.pack_operation_ids:
|
||||
for pack in self.move_line_ids:
|
||||
if pack.product_id and pack.product_id.tracking != 'none':
|
||||
raise UserError(_('Some products require lots/serial numbers, so you need to specify those first!'))
|
||||
view = self.env.ref('stock.view_immediate_transfer')
|
||||
@@ -632,16 +632,16 @@ class Picking(models.Model):
|
||||
'res_id': wiz.id,
|
||||
'context': self.env.context,
|
||||
}
|
||||
for operation in self.pack_operation_ids:
|
||||
for operation in self.move_line_ids:
|
||||
if operation.qty_done < 0:
|
||||
raise UserError(_('No negative quantities allowed'))
|
||||
if operation.qty_done > 0:
|
||||
pass
|
||||
#operation.write({'product_qty': operation.qty_done})
|
||||
else:
|
||||
pack_operations_delete |= operation
|
||||
if pack_operations_delete:
|
||||
pack_operations_delete.unlink()
|
||||
move_line_delete |= operation
|
||||
if move_line_delete:
|
||||
move_line_delete.unlink()
|
||||
self.action_done()
|
||||
return
|
||||
|
||||
@@ -656,11 +656,11 @@ class Picking(models.Model):
|
||||
quantity_done.setdefault(move.product_id.id, 0)
|
||||
quantity_todo[move.product_id.id] += move.product_qty
|
||||
quantity_done[move.product_id.id] += move.quantity_done #TODO: convert to base units
|
||||
for ops in self.pack_operation_ids.filtered(lambda x: x.package_id and not x.product_id and not x.move_id):
|
||||
for ops in self.move_line_ids.filtered(lambda x: x.package_id and not x.product_id and not x.move_id):
|
||||
for quant in ops.package_id.quant_ids:
|
||||
quantity_done.setdefault(quant.product_id.id, 0)
|
||||
quantity_done[quant.product_id.id] += quant.qty
|
||||
for pack in self.pack_operation_ids.filtered(lambda x: x.product_id and not x.move_id):
|
||||
for pack in self.move_line_ids.filtered(lambda x: x.product_id and not x.move_id):
|
||||
quantity_done.setdefault(pack.product_id.id, 0)
|
||||
quantity_done[pack.product_id.id] += pack.qty_done
|
||||
return any(quantity_done[x] < quantity_todo.get(x, 0) for x in quantity_done)
|
||||
@@ -672,10 +672,10 @@ class Picking(models.Model):
|
||||
# TDE FIXME: move to batch
|
||||
self.ensure_one()
|
||||
moves = self.env['stock.move']
|
||||
for pack_operation in self.pack_operation_ids:
|
||||
for product, remaining_qty in pycompat.items(pack_operation._get_remaining_prod_quantities()):
|
||||
for move_line in self.move_line_ids:
|
||||
for product, remaining_qty in pycompat.items(move_line._get_remaining_prod_quantities()):
|
||||
if float_compare(remaining_qty, 0, precision_rounding=product.uom_id.rounding) > 0:
|
||||
vals = self._prepare_values_extra_move(pack_operation, product, remaining_qty)
|
||||
vals = self._prepare_values_extra_move(move_line, product, remaining_qty)
|
||||
moves |= moves.create(vals)
|
||||
if moves:
|
||||
moves.with_context(skip_check=True).action_confirm()
|
||||
@@ -733,7 +733,7 @@ class Picking(models.Model):
|
||||
backorder_picking = picking.copy({
|
||||
'name': '/',
|
||||
'move_lines': [],
|
||||
'pack_operation_ids': [],
|
||||
'move_line_ids': [],
|
||||
'backorder_id': picking.id
|
||||
})
|
||||
picking.message_post(body=_("Back order <em>%s</em> <b>created</b>.") % (backorder_picking.name))
|
||||
@@ -749,8 +749,8 @@ class Picking(models.Model):
|
||||
def _put_in_pack(self):
|
||||
package = False
|
||||
for pick in self:
|
||||
operations = pick.pack_operation_ids.filtered(lambda o: o.qty_done > 0 and not o.result_package_id)
|
||||
operation_ids = self.env['stock.pack.operation']
|
||||
operations = pick.move_line_ids.filtered(lambda o: o.qty_done > 0 and not o.result_package_id)
|
||||
operation_ids = self.env['stock.move.line']
|
||||
if operations:
|
||||
package = self.env['stock.quant.package'].create({})
|
||||
for operation in operations:
|
||||
@@ -779,7 +779,7 @@ class Picking(models.Model):
|
||||
def button_scrap(self):
|
||||
self.ensure_one()
|
||||
# only stockable products are scrapeable
|
||||
scrapeable_products = self.pack_operation_ids.mapped('product_id').filtered(lambda p: p.type == 'product')
|
||||
scrapeable_products = self.move_line_ids.mapped('product_id').filtered(lambda p: p.type == 'product')
|
||||
return {
|
||||
'name': _('Scrap'),
|
||||
'view_type': 'form',
|
||||
@@ -803,7 +803,7 @@ class Picking(models.Model):
|
||||
def action_see_packages(self):
|
||||
self.ensure_one()
|
||||
action = self.env.ref('stock.action_package_view').read()[0]
|
||||
packages = self.pack_operation_ids.mapped('result_package_id')
|
||||
packages = self.move_line_ids.mapped('result_package_id')
|
||||
action['domain'] = [('id', 'in', packages.ids)]
|
||||
action['context'] = {'picking_id': self.id}
|
||||
return action
|
||||
|
||||
@@ -32,7 +32,7 @@ class ProductionLot(models.Model):
|
||||
def create(self, vals):
|
||||
pack_id = self.env.context.get('active_pack_operation', False)
|
||||
if pack_id:
|
||||
pack = self.env['stock.pack.operation'].browse(pack_id)
|
||||
pack = self.env['stock.move.line'].browse(pack_id)
|
||||
if pack.picking_id and not pack.picking_id.picking_type_id.use_create_lots:
|
||||
raise UserError(_("You are not allowed to create a lot for this picking type"))
|
||||
return super(ProductionLot, self).create(vals)
|
||||
|
||||
@@ -245,8 +245,8 @@ class QuantPackage(models.Model):
|
||||
owner_id = fields.Many2one(
|
||||
'res.partner', 'Owner', compute='_compute_package_info', search='_search_owner',
|
||||
index=True, readonly=True)
|
||||
move_line_ids = fields.One2many('stock.pack.operation', 'result_package_id')
|
||||
current_picking_move_line_ids = fields.One2many('stock.pack.operation', compute="_compute_current_picking_info")
|
||||
move_line_ids = fields.One2many('stock.move.line', 'result_package_id')
|
||||
current_picking_move_line_ids = fields.One2many('stock.move.line', compute="_compute_current_picking_info")
|
||||
current_picking_id = fields.Boolean(compute="_compute_current_picking_info")
|
||||
|
||||
@api.depends('quant_ids.package_id', 'quant_ids.location_id', 'quant_ids.company_id', 'quant_ids.owner_id')
|
||||
@@ -331,7 +331,7 @@ class QuantPackage(models.Model):
|
||||
|
||||
def action_view_picking(self):
|
||||
action = self.env.ref('stock.action_picking_tree_all').read()[0]
|
||||
pickings = self.env['stock.pack.operation'].search([('result_package_id', 'in', self.ids)]).mapped('picking_id')
|
||||
pickings = self.env['stock.move.line'].search([('result_package_id', 'in', self.ids)]).mapped('picking_id')
|
||||
action['domain'] = [('id', 'in', pickings.ids)]
|
||||
return action
|
||||
|
||||
|
||||
@@ -101,7 +101,7 @@ class StockScrap(models.Model):
|
||||
'location_id': self.location_id.id,
|
||||
'scrapped': True,
|
||||
'location_dest_id': self.scrap_location_id.id,
|
||||
'pack_operation_ids': [(0, 0, {'product_id': self.product_id.id,
|
||||
'move_line_ids': [(0, 0, {'product_id': self.product_id.id,
|
||||
'product_uom_id': self.product_uom_id.id,
|
||||
'qty_done': self.scrap_qty,
|
||||
'location_id': self.location_id.id,
|
||||
|
||||
@@ -21,16 +21,16 @@ class MrpStockReport(models.TransientModel):
|
||||
|
||||
@api.model
|
||||
def get_move_lines_upstream(self, move_lines):
|
||||
res = self.env['stock.pack.operation']
|
||||
res = self.env['stock.move.line']
|
||||
for move_line in move_lines:
|
||||
# if MTO
|
||||
if move_line.move_id.move_orig_ids:
|
||||
res |= move_line.move_id.move_orig_ids.mapped('pack_operation_ids').filtered(
|
||||
res |= move_line.move_id.move_orig_ids.mapped('move_line_ids').filtered(
|
||||
lambda m: m.lot_id.id == move_line.lot_id.id)
|
||||
# if MTS
|
||||
else:
|
||||
if move_line.location_id.usage == 'internal':
|
||||
res |= self.env['stock.pack.operation'].search([
|
||||
res |= self.env['stock.move.line'].search([
|
||||
('product_id', '=', move_line.product_id.id),
|
||||
('lot_id', '=', move_line.lot_id.id),
|
||||
('location_dest_id', '=', move_line.location_id.id),
|
||||
@@ -42,16 +42,16 @@ class MrpStockReport(models.TransientModel):
|
||||
|
||||
@api.model
|
||||
def get_move_lines_downstream(self, move_lines):
|
||||
res = self.env['stock.pack.operation']
|
||||
res = self.env['stock.move.line']
|
||||
for move_line in move_lines:
|
||||
# if MTO
|
||||
if move_line.move_id.move_dest_ids:
|
||||
res |= move_line.move_id.move_dest_ids.mapped('pack_operation_ids').filtered(
|
||||
res |= move_line.move_id.move_dest_ids.mapped('move_line_ids').filtered(
|
||||
lambda m: m.lot_id.id == move_line.lot_id.id)
|
||||
# if MTS
|
||||
else:
|
||||
if move_line.location_dest_id.usage == 'internal':
|
||||
res |= self.env['stock.pack.operation'].search([
|
||||
res |= self.env['stock.move.line'].search([
|
||||
('product_id', '=', move_line.product_id.id),
|
||||
('lot_id', '=', move_line.lot_id.id),
|
||||
('location_id', '=', move_line.location_dest_id.id),
|
||||
@@ -77,12 +77,12 @@ class MrpStockReport(models.TransientModel):
|
||||
res = []
|
||||
if context.get('active_id') and not context.get('model') or context.get('model') == 'stock.production.lot':
|
||||
if stream == "downstream":
|
||||
move_ids = self.env['stock.pack.operation'].search([
|
||||
move_ids = self.env['stock.move.line'].search([
|
||||
('lot_id', '=', context.get('active_id')),
|
||||
('location_id.usage', '=', 'supplier'),
|
||||
('state', '=', 'done'),
|
||||
])
|
||||
res += self._lines(line_id, model_id=model_id, model='stock.pack.operation', level=level, parent_quant=parent_quant,
|
||||
res += self._lines(line_id, model_id=model_id, model='stock.move.line', level=level, parent_quant=parent_quant,
|
||||
stream=stream, obj_ids=move_ids)
|
||||
quant_ids = self.env['stock.quant'].search([
|
||||
('lot_id', '=', context.get('active_id')),
|
||||
@@ -91,12 +91,12 @@ class MrpStockReport(models.TransientModel):
|
||||
res += self._lines(line_id, model_id=model_id, model='stock.quant', level=level,
|
||||
parent_quant=parent_quant, stream=stream, obj_ids=quant_ids)
|
||||
else:
|
||||
move_ids = self.env['stock.pack.operation'].search([
|
||||
move_ids = self.env['stock.move.line'].search([
|
||||
('lot_id', '=', context.get('active_id')),
|
||||
('location_dest_id.usage', '=', 'customer'),
|
||||
('state', '=', 'done'),
|
||||
])
|
||||
res += self._lines(line_id, model_id=model_id, model='stock.pack.operation', level=level, parent_quant=parent_quant,
|
||||
res += self._lines(line_id, model_id=model_id, model='stock.move.line', level=level, parent_quant=parent_quant,
|
||||
stream=stream, obj_ids=move_ids)
|
||||
quant_ids = self.env['stock.quant'].search([
|
||||
('lot_id', '=', context.get('active_id')),
|
||||
@@ -105,10 +105,10 @@ class MrpStockReport(models.TransientModel):
|
||||
res += self._lines(line_id, model_id=model_id, model='stock.quant', level=level,
|
||||
parent_quant=parent_quant, stream=stream, obj_ids=quant_ids)
|
||||
elif context.get('active_id') and context.get('model') == 'stock.picking':
|
||||
move_ids = self.env['stock.picking'].browse(context['active_id']).move_lines.mapped('pack_operation_ids').filtered(lambda m: m.lot_id and m.state == 'done')
|
||||
res = self._lines(line_id, model_id=model_id, model='stock.pack.operation', level=level, parent_quant=parent_quant, stream=stream, obj_ids=move_ids)
|
||||
elif context.get('active_id') and context.get('model') == 'stock.pack.operation':
|
||||
move_line_ids = self.env['stock.pack.operation'].browse(context.get('active_id'))
|
||||
move_ids = self.env['stock.picking'].browse(context['active_id']).move_lines.mapped('move_line_ids').filtered(lambda m: m.lot_id and m.state == 'done')
|
||||
res = self._lines(line_id, model_id=model_id, model='stock.move.line', level=level, parent_quant=parent_quant, stream=stream, obj_ids=move_ids)
|
||||
elif context.get('active_id') and context.get('model') == 'stock.move.line':
|
||||
move_line_ids = self.env['stock.move.line'].browse(context.get('active_id'))
|
||||
res = self._lines(line_id, model_id=context.get('active_id'), model=context.get('model'), level=level, parent_quant=parent_quant, stream=stream, obj_ids=move_line_ids)
|
||||
else:
|
||||
res = self._lines(line_id, model_id=model_id, model=model, level=level, parent_quant=parent_quant, stream=stream)
|
||||
@@ -137,7 +137,7 @@ class MrpStockReport(models.TransientModel):
|
||||
'date': move_line.move_id.date,
|
||||
'parent_id': parent_id,
|
||||
'model_id': move_line.id,
|
||||
'model':'stock.pack.operation',
|
||||
'model':'stock.move.line',
|
||||
'product_id': move_line.product_id.display_name,
|
||||
'product_qty_uom': str(move_line.qty_done) + ' ' + move_line.product_id.uom_id.name,
|
||||
'location_source': move_line.location_id.name,
|
||||
@@ -150,14 +150,14 @@ class MrpStockReport(models.TransientModel):
|
||||
|
||||
def make_dict_head(self, level, parent_id, model=False, stream=False, move_line=False):
|
||||
data = []
|
||||
if model == 'stock.pack.operation':
|
||||
if model == 'stock.move.line':
|
||||
data = [{
|
||||
'level': level,
|
||||
'unfoldable': True,
|
||||
'date': move_line.move_id.date,
|
||||
'model_id': move_line.id,
|
||||
'parent_id': parent_id,
|
||||
'model': model or 'stock.pack.operation',
|
||||
'model': model or 'stock.move.line',
|
||||
'product_id': move_line.product_id.display_name+' ('+move_line.lot_id.name+')',
|
||||
'product_qty_uom': str(move_line.qty_done) + ' ' + move_line.product_id.uom_id.name,
|
||||
'location_source': move_line.location_id.name,
|
||||
@@ -183,12 +183,12 @@ class MrpStockReport(models.TransientModel):
|
||||
def upstream_traceability(self, level, stream=False, line_id=False, model=False, model_id=False, parent_quant=False):
|
||||
model_obj = self.env[model].browse(model_id)
|
||||
final_vals =[]
|
||||
if model == 'stock.pack.operation':
|
||||
if model == 'stock.move.line':
|
||||
moves = self.get_move_lines_upstream(model_obj)
|
||||
for move in moves.sorted(key=lambda m: m.date, reverse=True):
|
||||
final_vals += self.make_dict_move(level, stream=stream, parent_id=line_id, move_line=move)
|
||||
elif model == 'stock.quant':
|
||||
moves = self.env['stock.pack.operation'].search([
|
||||
moves = self.env['stock.move.line'].search([
|
||||
('location_dest_id', '=', model_obj.location_id.id),
|
||||
('lot_id', '=', model_obj.lot_id.id),
|
||||
('date', '<=', model_obj.write_date),
|
||||
@@ -203,12 +203,12 @@ class MrpStockReport(models.TransientModel):
|
||||
def downstream_traceability(self, level, stream=False, line_id=False, model=False, model_id=False, parent_quant=False):
|
||||
model_obj = self.env[model].browse(model_id)
|
||||
final_vals = []
|
||||
if model == 'stock.pack.operation':
|
||||
if model == 'stock.move.line':
|
||||
moves = self.get_move_lines_downstream(model_obj)
|
||||
for move in moves.sorted(key=lambda r: r.date):
|
||||
final_vals += self.make_dict_move(level, stream=stream, parent_id=line_id, move_line=move)
|
||||
elif model == 'stock.quant':
|
||||
moves = self.env['stock.pack.operation'].search([
|
||||
moves = self.env['stock.move.line'].search([
|
||||
('location_id', '=', model_obj.location_id.id),
|
||||
('lot_id', '=', model_obj.lot_id.id),
|
||||
('date', '>=', model_obj.write_date),
|
||||
@@ -230,7 +230,7 @@ class MrpStockReport(models.TransientModel):
|
||||
final_vals += self.upstream_traceability(level, stream='upstream', line_id=line_id, model=model, model_id=model_id, parent_quant=parent_quant)
|
||||
else:
|
||||
for move_line in obj_ids:
|
||||
final_vals += self.make_dict_head(level, stream=stream, parent_id=line_id, model=model or 'stock.pack.operation', move_line=move_line)
|
||||
final_vals += self.make_dict_head(level, stream=stream, parent_id=line_id, model=model or 'stock.move.line', move_line=move_line)
|
||||
for data in final_vals:
|
||||
lines.append({
|
||||
'id': autoIncrement(),
|
||||
@@ -263,7 +263,7 @@ class MrpStockReport(models.TransientModel):
|
||||
if line.get('unfoldable'):
|
||||
final_vals += self.make_dict_head(line['level'], model=line['model_name'], parent_id=line['id'], move_line=model)
|
||||
else:
|
||||
if line['model_name'] == 'stock.pack.operation':
|
||||
if line['model_name'] == 'stock.move.line':
|
||||
final_vals += self.make_dict_move(line['level'], parent_id=line['id'], move_line=model)
|
||||
for data in final_vals:
|
||||
lines.append({
|
||||
|
||||
@@ -49,7 +49,7 @@
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<table class="table table-condensed mt48" t-if="not o.pack_operation_ids">
|
||||
<table class="table table-condensed mt48" t-if="not o.move_line_ids">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><strong>Product</strong></th>
|
||||
@@ -67,8 +67,8 @@
|
||||
</tbody>
|
||||
</table>
|
||||
<t t-set="backorder" t-value="False"/>
|
||||
<table class="table table-condensed mt48" t-if="o.pack_operation_ids">
|
||||
<t t-set="has_serial_number" t-value="o.pack_operation_ids.filtered('pack_lot_ids')" groups="stock.group_production_lot"/>
|
||||
<table class="table table-condensed mt48" t-if="o.move_line_ids">
|
||||
<t t-set="has_serial_number" t-value="o.move_line_ids.filtered('pack_lot_ids')" groups="stock.group_production_lot"/>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><strong>Product</strong></th>
|
||||
@@ -76,13 +76,13 @@
|
||||
<span class="pull-left">Lot/Serial Number</span>
|
||||
</th>
|
||||
<th class="text-center"><strong>Ordered Quantity</strong></th>
|
||||
<th t-if="any([pack_operation.state == 'done' for pack_operation in o.pack_operation_ids])" class="text-right">
|
||||
<th t-if="any([pack_operation.state == 'done' for pack_operation in o.move_line_ids])" class="text-right">
|
||||
<strong>Delivered Quantity</strong>
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr t-foreach="o.pack_operation_ids" t-as="pack_operation">
|
||||
<tr t-foreach="o.move_line_ids" t-as="pack_operation">
|
||||
<td>
|
||||
<span t-field="pack_operation.product_id"/>
|
||||
<p t-if="o.picking_type_code == 'outgoing'">
|
||||
|
||||
@@ -72,9 +72,9 @@
|
||||
</table>
|
||||
<br/>
|
||||
<br/>
|
||||
<table class="table table-condensed" t-if="o.pack_operation_ids">
|
||||
<t t-set="has_barcode" t-value="any([pack_operation.product_id and pack_operation.product_id.sudo().barcode or pack_operation.package_id for pack_operation in o.pack_operation_ids])"/>
|
||||
<t t-set="has_serial_number" t-value="o.pack_operation_ids.filtered('pack_lot_ids')" groups="stock.group_production_lot"/>
|
||||
<table class="table table-condensed" t-if="o.move_line_ids">
|
||||
<t t-set="has_barcode" t-value="any([pack_operation.product_id and pack_operation.product_id.sudo().barcode or pack_operation.package_id for pack_operation in o.move_line_ids])"/>
|
||||
<t t-set="has_serial_number" t-value="o.move_line_ids.filtered('pack_lot_ids')" groups="stock.group_production_lot"/>
|
||||
<thead>
|
||||
<tr>
|
||||
<th><strong>Product</strong></th>
|
||||
@@ -90,7 +90,7 @@
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr t-foreach="o.pack_operation_ids" t-as="pack_operation">
|
||||
<tr t-foreach="o.move_line_ids" t-as="pack_operation">
|
||||
<td><span t-field="pack_operation.product_id"/><br/>
|
||||
<span t-field="pack_operation.product_id.description_picking"/>
|
||||
<t t-if="not pack_operation.product_id and pack_operation.package_id"><span t-field="pack_operation.package_id"/></t></td>
|
||||
|
||||
@@ -54,15 +54,15 @@ access_stock_location_path_stock_user,stock.location.path stock user,model_stock
|
||||
access_stock_location_route_stock_manager,stock.location.route,model_stock_location_route,stock.group_stock_manager,1,1,1,1
|
||||
access_stock_location_route,stock.location.route,model_stock_location_route,base.group_user,1,0,0,0
|
||||
access_procurement_rule_internal,procurement.rule.flow internal,model_procurement_rule,base.group_user,1,0,0,0
|
||||
access_stock_pack_operation_manager,stock.pack.operation manager,model_stock_pack_operation,stock.group_stock_manager,1,1,1,1
|
||||
access_stock_pack_operation_user,stock.pack.operation user,model_stock_pack_operation,stock.group_stock_user,1,1,1,1
|
||||
access_stock_pack_operation_all,stock.pack.operation all users,model_stock_pack_operation,base.group_user,1,1,1,1
|
||||
access_stock_move_line_manager,stock.move.line manager,model_stock_move_line,stock.group_stock_manager,1,1,1,1
|
||||
access_stock_move_line_user,stock.move.line user,model_stock_move_line,stock.group_stock_user,1,1,1,1
|
||||
access_stock_move_line_all,stock.move.line all users,model_stock_move_line,base.group_user,1,1,1,1
|
||||
access_product_putaway_all,product.putaway all users,model_product_putaway,base.group_user,1,0,0,0
|
||||
access_product_putaway_manager,product.putaway all managers,model_product_putaway,stock.group_stock_manager,1,1,1,1
|
||||
access_stock_removal_all,product.removal all users,model_product_removal,base.group_user,1,0,0,0
|
||||
access_stock_fixed_putaway_strat,stock_fixed_putaway_strat managers,model_stock_fixed_putaway_strat,stock.group_stock_manager,1,1,1,1
|
||||
access_stock_fixed_putaway_user,stock_fixed_putaway_strat user,model_stock_fixed_putaway_strat,stock.group_stock_user,1,0,0,0
|
||||
access_stock_pack_operation_portal,stock.pack.operation portal,stock.model_stock_pack_operation,base.group_portal,1,0,0,0
|
||||
access_stock_move_line_portal,stock.move.line portal,stock.model_stock_move_line,base.group_portal,1,0,0,0
|
||||
access_product_price_history_stock_user,prices.history stock user,product.model_product_price_history,stock.group_stock_user,1,0,0,0
|
||||
access_product_price_history_stock_manager,prices.history stock manager,product.model_product_price_history,stock.group_stock_manager,1,1,1,1
|
||||
access_barcode_nomenclature_stock_user,barcode.nomenclature.stock.user,barcodes.model_barcode_nomenclature,stock.group_stock_user,1,0,0,0
|
||||
|
||||
|
@@ -142,9 +142,9 @@
|
||||
<field name="groups" eval="[(4, ref('base.group_portal'))]"/>
|
||||
</record>
|
||||
|
||||
<record id="stock_pack_operation_rule_portal" model="ir.rule">
|
||||
<record id="stock_move_line_rule_portal" model="ir.rule">
|
||||
<field name="name">Portal Follower Pack Operations</field>
|
||||
<field name="model_id" ref="stock.model_stock_pack_operation"/>
|
||||
<field name="model_id" ref="stock.model_stock_move_line"/>
|
||||
<field name="domain_force">['|', ('picking_id.message_partner_ids','in',[user.partner_id.id]), ('picking_id.partner_id.id','=',user.partner_id.id)]</field>
|
||||
<field name="groups" eval="[(4, ref('base.group_portal'))]"/>
|
||||
</record>
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
<t t-name="report_mrp_line">
|
||||
<t t-set="trclass" t-value="'o_stock_reports_default_style'"/>
|
||||
<t t-if="l.model == 'stock.pack.operation'"><t t-set="trclass" t-value="'o_stock_reports_level0'"/></t>
|
||||
<t t-if="l.model == 'stock.move.line'"><t t-set="trclass" t-value="'o_stock_reports_level0'"/></t>
|
||||
<t t-if="l.model == 'stock.quant'"><t t-set="trclass" t-value="'o_stock_reports_level1'"/></t>
|
||||
<t t-set="space_td" t-value="'margin-left: '+ l.level + 'px;'"/>
|
||||
<t t-set="domainClass" t-value="'o_stock_reports_domain_line_0'"/>
|
||||
@@ -53,7 +53,7 @@
|
||||
</td>
|
||||
</t>
|
||||
<td>
|
||||
<t t-if="l.model == 'stock.pack.operation'">
|
||||
<t t-if="l.model == 'stock.move.line'">
|
||||
<span t-if="l.stream == 'downstream'" class="o_stock_reports_stream text-muted" data-stream="upstream" title="Upstream Traceability"><i class="fa fa-arrow-up"></i></span>
|
||||
<span t-if="l.stream == 'upstream'" class="o_stock_reports_stream" data-stream="downstream" title="Downstream Traceability"><i class="fa fa-arrow-down"></i></span>
|
||||
</t>
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
-
|
||||
!python {model: stock.picking, id: pick1}: |
|
||||
#Change quantity of first to 120 and create 2 others quant operations
|
||||
stock_pack = self.env['stock.pack.operation']
|
||||
stock_pack = self.env['stock.move.line']
|
||||
stock_quant_pack = self.env['stock.quant.package']
|
||||
#create lot A
|
||||
lot_a = self.env['stock.production.lot'].create({'name': 'Lot A', 'product_id': ref('product1')})
|
||||
@@ -46,7 +46,7 @@
|
||||
package3 = stock_quant_pack.create({'name': 'Pallet 3'})
|
||||
#Create package for each line and assign it as result_package_id
|
||||
#create pack operation
|
||||
self.pack_operation_ids[0].write({'result_package_id': package1.id, 'qty_done': 120})
|
||||
self.move_line_ids[0].write({'result_package_id': package1.id, 'qty_done': 120})
|
||||
new_pack1 = stock_pack.create({
|
||||
'product_id': ref('product1'),
|
||||
'product_uom_id': ref('product.product_uom_unit'),
|
||||
@@ -114,7 +114,7 @@
|
||||
Instead of doing the 300 pieces, you decide to take pallet 1 (do not mention product in operation here) and 20 pieces from lot A and 10 pieces from pallet 3
|
||||
-
|
||||
!python {model: stock.picking, id: delivery_order1}: |
|
||||
for rec in self.pack_operation_ids:
|
||||
for rec in self.move_line_ids:
|
||||
if rec.package_id.name == 'Pallet 1':
|
||||
rec.qty_done = 120
|
||||
if rec.package_id.name == 'Pallet 2':
|
||||
@@ -146,8 +146,8 @@
|
||||
assert backorders, "Backorder should have been created"
|
||||
backorders.action_assign()
|
||||
picking = backorders[0]
|
||||
assert len(picking.pack_operation_ids) == 2, "Wrong number of pack operation"
|
||||
for pack_op in picking.pack_operation_ids:
|
||||
assert len(picking.move_line_ids) == 2, "Wrong number of pack operation"
|
||||
for pack_op in picking.move_line_ids:
|
||||
assert pack_op.package_id.name in ('Pallet 2', 'Pallet 3'), "Wrong pallet info in pack operation (%s found)" % (pack_op.package_id.name)
|
||||
if pack_op.package_id.name == 'Pallet 2':
|
||||
assert pack_op.product_qty == 100
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
-
|
||||
!python {model: stock.picking, id: pick_neg}: |
|
||||
#Change quantity of first to 120 and create 2 others quant operations
|
||||
stock_pack = self.env['stock.pack.operation']
|
||||
stock_pack = self.env['stock.move.line']
|
||||
stock_quant_pack = self.env['stock.quant.package']
|
||||
#create lot A
|
||||
lot_a = self.env['stock.production.lot'].create({'name': 'Lot neg', 'product_id': ref('product_neg')})
|
||||
@@ -46,7 +46,7 @@
|
||||
package3 = stock_quant_pack.create({'name': 'Palneg 3'})
|
||||
#Create package for each line and assign it as result_package_id
|
||||
#create pack operation
|
||||
self.pack_operation_ids[0].write({'result_package_id': package1.id, 'qty_done': 120})
|
||||
self.move_line_ids[0].write({'result_package_id': package1.id, 'qty_done': 120})
|
||||
new_pack1 = stock_pack.create({
|
||||
'product_id': ref('product_neg'),
|
||||
'product_uom_id': ref('product.product_uom_unit'),
|
||||
@@ -93,7 +93,7 @@
|
||||
Instead of doing the 300 pieces, you decide to take pallet 1 (do not mention product in operation here) and 140 pieces from lot A/pallet 2 and 10 pieces from pallet 3
|
||||
-
|
||||
!python {model: stock.picking, id: delivery_order_neg}: |
|
||||
for rec in self.pack_operation_ids:
|
||||
for rec in self.move_line_ids:
|
||||
if rec.package_id.name == 'Palneg 1':
|
||||
rec.qty_done = rec.product_qty
|
||||
elif rec.package_id.name == 'Palneg 2' and rec.lot_id.name == 'Lot neg' :
|
||||
@@ -142,7 +142,7 @@
|
||||
pack_obj = self.env["stock.quant.package"]
|
||||
lot = self.env["stock.production.lot"].search([('product_id', '=', ref('product_neg')), ('name','=','Lot neg')], limit=1)
|
||||
pack = pack_obj.search([('name', '=', 'Palneg 2')], limit=1)
|
||||
self.pack_operation_ids[0].write({'lot_id': lot.id, 'qty_done': 20.0, 'result_package_id': pack.id})
|
||||
self.move_line_ids[0].write({'lot_id': lot.id, 'qty_done': 20.0, 'result_package_id': pack.id})
|
||||
self.do_transfer()
|
||||
-
|
||||
Check the negative quant was reconciled
|
||||
|
||||
@@ -29,10 +29,10 @@
|
||||
Put 4 pieces in shelf1 and 6 pieces in shelf2
|
||||
-
|
||||
!python {model: stock.picking, id: pick1_wise}: |
|
||||
stock_pack = self.env['stock.pack.operation']
|
||||
stock_pack = self.env['stock.move.line']
|
||||
stock_quant_pack = self.env['stock.quant.package']
|
||||
package1 = stock_quant_pack.create({'name': 'Pack 1'})
|
||||
self.pack_operation_ids[0].write({
|
||||
self.move_line_ids[0].write({
|
||||
'result_package_id': package1.id,
|
||||
'qty_done': 4,
|
||||
'location_dest_id': ref('stock_location_components')
|
||||
@@ -102,8 +102,8 @@
|
||||
picking2 = self.browse(ref('delivery_order_wise2'))
|
||||
move1 = picking1.move_lines[0]
|
||||
move2 = picking2.move_lines[0]
|
||||
pack_ids1 = picking1.pack_operation_ids
|
||||
pack_ids2 = picking2.pack_operation_ids
|
||||
pack_ids1 = picking1.move_line_ids
|
||||
pack_ids2 = picking2.move_line_ids
|
||||
|
||||
assert pack_ids1.location_id.id == ref('stock_location_14')
|
||||
assert set(pack_ids2.mapped('location_id.id')) == set([ref('stock_location_components'), ref('stock_location_14')])
|
||||
@@ -114,7 +114,7 @@
|
||||
new_pack_id1.qty_done = new_pack_id1.product_qty
|
||||
new_pack_id1.with_context(bypass_reservation_update=True).product_uom_qty = 0
|
||||
|
||||
new_move_lines = picking1.pack_operation_ids.filtered(lambda p: p.qty_done)
|
||||
new_move_lines = picking1.move_line_ids.filtered(lambda p: p.qty_done)
|
||||
assert sum(new_move_lines.mapped('product_qty')) == 0
|
||||
assert sum(new_move_lines.mapped('qty_done')) == 5
|
||||
assert set(new_move_lines.mapped('location_id.id')) == set([ref('stock_location_components'), ref('stock_location_14')])
|
||||
@@ -124,7 +124,7 @@
|
||||
new_pack_id2.qty_done = new_pack_id2.product_qty
|
||||
new_pack_id2.with_context(bypass_reservation_update=True).product_uom_qty = 0
|
||||
|
||||
new_move_lines = picking2.pack_operation_ids.filtered(lambda p: p.qty_done)
|
||||
new_move_lines = picking2.move_line_ids.filtered(lambda p: p.qty_done)
|
||||
assert len(new_move_lines) == 1
|
||||
assert sum(new_move_lines.mapped('product_qty')) == 0
|
||||
assert sum(new_move_lines.mapped('qty_done')) == 5
|
||||
|
||||
@@ -12,7 +12,7 @@ class TestStockCommon(common.TransactionCase):
|
||||
self.UomObj = self.env['product.uom']
|
||||
self.PartnerObj = self.env['res.partner']
|
||||
self.ModelDataObj = self.env['ir.model.data']
|
||||
self.StockPackObj = self.env['stock.pack.operation']
|
||||
self.StockPackObj = self.env['stock.move.line']
|
||||
self.StockQuantObj = self.env['stock.quant']
|
||||
self.PickingObj = self.env['stock.picking']
|
||||
self.MoveObj = self.env['stock.move']
|
||||
|
||||
@@ -6,7 +6,7 @@ from odoo.addons.product.tests import common
|
||||
class TestStockCommon(common.TestProductCommon):
|
||||
|
||||
def _create_pack_operation(self, product, product_qty, picking_id, **values):
|
||||
PackOperation = self.env['stock.pack.operation'].sudo(self.user_stock_manager)
|
||||
PackOperation = self.env['stock.move.line'].sudo(self.user_stock_manager)
|
||||
vals = {
|
||||
'picking_id': picking_id.id,
|
||||
'product_id': product.id,
|
||||
|
||||
+114
-114
@@ -53,10 +53,10 @@ class StockMove(TransactionCase):
|
||||
# assignment
|
||||
move1.action_assign()
|
||||
self.assertEqual(move1.state, 'assigned')
|
||||
self.assertEqual(len(move1.pack_operation_ids), 1)
|
||||
self.assertEqual(len(move1.move_line_ids), 1)
|
||||
|
||||
# fill the move line
|
||||
move_line = move1.pack_operation_ids[0]
|
||||
move_line = move1.move_line_ids[0]
|
||||
self.assertEqual(move_line.product_qty, 100.0)
|
||||
self.assertEqual(move_line.qty_done, 0.0)
|
||||
move_line.qty_done = 100.0
|
||||
@@ -94,8 +94,8 @@ class StockMove(TransactionCase):
|
||||
# assignment
|
||||
move1.action_assign()
|
||||
self.assertEqual(move1.state, 'assigned')
|
||||
self.assertEqual(len(move1.pack_operation_ids), 1)
|
||||
move_line = move1.pack_operation_ids[0]
|
||||
self.assertEqual(len(move1.move_line_ids), 1)
|
||||
move_line = move1.move_line_ids[0]
|
||||
self.assertEqual(move_line.product_qty, 5)
|
||||
move_line.lot_name = 'lot1'
|
||||
move_line.qty_done = 5.0
|
||||
@@ -134,12 +134,12 @@ class StockMove(TransactionCase):
|
||||
# assignment
|
||||
move1.action_assign()
|
||||
self.assertEqual(move1.state, 'assigned')
|
||||
self.assertEqual(len(move1.pack_operation_ids), 5)
|
||||
move_line = move1.pack_operation_ids[0]
|
||||
self.assertEqual(len(move1.move_line_ids), 5)
|
||||
move_line = move1.move_line_ids[0]
|
||||
self.assertEqual(move1.reserved_availability, 5)
|
||||
|
||||
i = 0
|
||||
for move_line in move1.pack_operation_ids:
|
||||
for move_line in move1.move_line_ids:
|
||||
move_line.lot_name = 'sn%s' % i
|
||||
move_line.qty_done = 1
|
||||
i += 1
|
||||
@@ -186,13 +186,13 @@ class StockMove(TransactionCase):
|
||||
# assignment
|
||||
move1.action_assign()
|
||||
self.assertEqual(move1.state, 'assigned')
|
||||
self.assertEqual(len(move1.pack_operation_ids), 1)
|
||||
self.assertEqual(len(move1.move_line_ids), 1)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 0.0)
|
||||
# Should be a reserved quantity and thus a quant.
|
||||
self.assertEqual(len(self.env['stock.quant']._gather(self.product1, self.stock_location)), 1.0)
|
||||
|
||||
# fill the move line
|
||||
move_line = move1.pack_operation_ids[0]
|
||||
move_line = move1.move_line_ids[0]
|
||||
self.assertEqual(move_line.product_qty, 100.0)
|
||||
self.assertEqual(move_line.qty_done, 0.0)
|
||||
move_line.qty_done = 100.0
|
||||
@@ -235,13 +235,13 @@ class StockMove(TransactionCase):
|
||||
# assignment
|
||||
move1.action_assign()
|
||||
self.assertEqual(move1.state, 'assigned')
|
||||
self.assertEqual(len(move1.pack_operation_ids), 1)
|
||||
self.assertEqual(len(move1.move_line_ids), 1)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 0.0)
|
||||
# Should be a reserved quantity and thus a quant.
|
||||
self.assertEqual(len(self.env['stock.quant']._gather(self.product1, self.stock_location)), 0.0)
|
||||
|
||||
# fill the move line
|
||||
move_line = move1.pack_operation_ids[0]
|
||||
move_line = move1.move_line_ids[0]
|
||||
self.assertEqual(move_line.product_qty, 100.0)
|
||||
self.assertEqual(move_line.qty_done, 0.0)
|
||||
move_line.qty_done = 100.0
|
||||
@@ -281,7 +281,7 @@ class StockMove(TransactionCase):
|
||||
move1.action_confirm()
|
||||
move1.action_assign()
|
||||
|
||||
self.assertEqual(len(move1.pack_operation_ids), 2)
|
||||
self.assertEqual(len(move1.move_line_ids), 2)
|
||||
|
||||
def test_mixed_tracking_reservation_2(self):
|
||||
""" Send products tracked by lot to a customer. In your stock, there two tracked and
|
||||
@@ -313,8 +313,8 @@ class StockMove(TransactionCase):
|
||||
})
|
||||
move1.action_confirm()
|
||||
move1.action_assign()
|
||||
self.assertEqual(len(move1.pack_operation_ids), 4)
|
||||
for ml in move1.pack_operation_ids:
|
||||
self.assertEqual(len(move1.move_line_ids), 4)
|
||||
for ml in move1.move_line_ids:
|
||||
self.assertEqual(ml.product_qty, 1.0)
|
||||
|
||||
# assign lot3 and lot 4 to both untracked move lines
|
||||
@@ -326,10 +326,10 @@ class StockMove(TransactionCase):
|
||||
'name': 'lot4',
|
||||
'product_id': self.product2.id,
|
||||
})
|
||||
untracked_move_line = move1.pack_operation_ids.filtered(lambda ml: not ml.lot_id)
|
||||
untracked_move_line = move1.move_line_ids.filtered(lambda ml: not ml.lot_id)
|
||||
untracked_move_line[0].lot_id = lot3
|
||||
untracked_move_line[1].lot_id = lot4
|
||||
for ml in move1.pack_operation_ids:
|
||||
for ml in move1.move_line_ids:
|
||||
self.assertEqual(ml.product_qty, 1.0)
|
||||
|
||||
# no changes on quants, even if i made some move lines with a lot id whom reserved on untracked quants
|
||||
@@ -339,7 +339,7 @@ class StockMove(TransactionCase):
|
||||
self.assertEqual(len(self.env['stock.quant']._gather(self.product2, self.stock_location, lot_id=lot3, strict=True)), 0)
|
||||
self.assertEqual(len(self.env['stock.quant']._gather(self.product2, self.stock_location, lot_id=lot4, strict=True)), 0)
|
||||
|
||||
move1.pack_operation_ids.write({'qty_done': 1.0})
|
||||
move1.move_line_ids.write({'qty_done': 1.0})
|
||||
|
||||
move1.action_done()
|
||||
|
||||
@@ -378,7 +378,7 @@ class StockMove(TransactionCase):
|
||||
})
|
||||
move1.action_confirm()
|
||||
move1.action_assign()
|
||||
move1.pack_operation_ids.write({'qty_done': 1.0})
|
||||
move1.move_line_ids.write({'qty_done': 1.0})
|
||||
move1.action_done()
|
||||
|
||||
self.env['stock.quant']._increase_available_quantity(self.product2, self.stock_location, 2)
|
||||
@@ -391,7 +391,7 @@ class StockMove(TransactionCase):
|
||||
'product_id': self.product2.id,
|
||||
})
|
||||
|
||||
self.env['stock.pack.operation'].create({
|
||||
self.env['stock.move.line'].create({
|
||||
'move_id': move1.id,
|
||||
'product_id': move1.product_id.id,
|
||||
'qty_done': 1,
|
||||
@@ -400,7 +400,7 @@ class StockMove(TransactionCase):
|
||||
'location_dest_id': move1.location_dest_id.id,
|
||||
'lot_id': lot3.id,
|
||||
})
|
||||
self.env['stock.pack.operation'].create({
|
||||
self.env['stock.move.line'].create({
|
||||
'move_id': move1.id,
|
||||
'product_id': move1.product_id.id,
|
||||
'qty_done': 1,
|
||||
@@ -445,7 +445,7 @@ class StockMove(TransactionCase):
|
||||
})
|
||||
move1.action_confirm()
|
||||
move1.action_assign()
|
||||
move1.pack_operation_ids.write({'qty_done': 1.0})
|
||||
move1.move_line_ids.write({'qty_done': 1.0})
|
||||
move1.action_done()
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product2, self.stock_location), 0.0)
|
||||
@@ -458,7 +458,7 @@ class StockMove(TransactionCase):
|
||||
'product_id': self.product2.id,
|
||||
})
|
||||
|
||||
move1.with_context(debug=True).pack_operation_ids[1].lot_id = lot3
|
||||
move1.with_context(debug=True).move_line_ids[1].lot_id = lot3
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product2, self.stock_location), 1.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product2, self.stock_location, lot_id=lot1, strict=True), 0.0)
|
||||
@@ -486,7 +486,7 @@ class StockMove(TransactionCase):
|
||||
})
|
||||
|
||||
# create a new move line with a lot not assigned to any quant
|
||||
self.env['stock.pack.operation'].create({
|
||||
self.env['stock.move.line'].create({
|
||||
'move_id': move1.id,
|
||||
'product_id': move1.product_id.id,
|
||||
'qty_done': 1,
|
||||
@@ -495,7 +495,7 @@ class StockMove(TransactionCase):
|
||||
'location_dest_id': move1.location_dest_id.id,
|
||||
'lot_id': lot1.id
|
||||
})
|
||||
self.assertEqual(len(move1.pack_operation_ids), 1)
|
||||
self.assertEqual(len(move1.move_line_ids), 1)
|
||||
self.assertEqual(move1.reserved_availability, 0)
|
||||
|
||||
# validating the move line should move the lot, not create a negative quant in stock
|
||||
@@ -527,7 +527,7 @@ class StockMove(TransactionCase):
|
||||
'product_id': self.product2.id,
|
||||
})
|
||||
|
||||
move_line = move1.pack_operation_ids
|
||||
move_line = move1.move_line_ids
|
||||
move_line.lot_id = lot1
|
||||
self.assertEqual(move_line.product_qty, 1.0)
|
||||
move_line.lot_id = lot2
|
||||
@@ -576,10 +576,10 @@ class StockMove(TransactionCase):
|
||||
# assignment
|
||||
move1.action_assign()
|
||||
self.assertEqual(move1.state, 'assigned')
|
||||
self.assertEqual(len(move1.pack_operation_ids), 1)
|
||||
self.assertEqual(len(move1.move_line_ids), 1)
|
||||
|
||||
# check if the putaway was rightly applied
|
||||
self.assertEqual(move1.pack_operation_ids.location_dest_id.id, shelf1_location.id)
|
||||
self.assertEqual(move1.move_line_ids.location_dest_id.id, shelf1_location.id)
|
||||
|
||||
def test_availability_1(self):
|
||||
""" Check that the `availability` field on a move is correctly computed when there is
|
||||
@@ -650,12 +650,12 @@ class StockMove(TransactionCase):
|
||||
# assignment
|
||||
move1.action_assign()
|
||||
self.assertEqual(move1.state, 'assigned')
|
||||
self.assertEqual(len(move1.pack_operation_ids), 1)
|
||||
self.assertEqual(len(move1.move_line_ids), 1)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 50.0)
|
||||
|
||||
# unreserve
|
||||
move1.do_unreserve()
|
||||
self.assertEqual(len(move1.pack_operation_ids), 0)
|
||||
self.assertEqual(len(move1.move_line_ids), 0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 150.0)
|
||||
self.assertEqual(move1.state, 'confirmed')
|
||||
|
||||
@@ -688,12 +688,12 @@ class StockMove(TransactionCase):
|
||||
# assignment
|
||||
move1.action_assign()
|
||||
self.assertEqual(move1.state, 'assigned')
|
||||
self.assertEqual(len(move1.pack_operation_ids), 1)
|
||||
self.assertEqual(len(move1.move_line_ids), 1)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, package_id=package1), 50.0)
|
||||
|
||||
# unreserve
|
||||
move1.do_unreserve()
|
||||
self.assertEqual(len(move1.pack_operation_ids), 0)
|
||||
self.assertEqual(len(move1.move_line_ids), 0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, package_id=package1), 150.0)
|
||||
self.assertEqual(move1.state, 'confirmed')
|
||||
|
||||
@@ -723,7 +723,7 @@ class StockMove(TransactionCase):
|
||||
# assignment
|
||||
move1.action_assign()
|
||||
self.assertEqual(move1.state, 'assigned')
|
||||
self.assertEqual(len(move1.pack_operation_ids), 1)
|
||||
self.assertEqual(len(move1.move_line_ids), 1)
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 0.0)
|
||||
quants = self.env['stock.quant']._gather(self.product1, self.stock_location)
|
||||
@@ -736,7 +736,7 @@ class StockMove(TransactionCase):
|
||||
self.assertEqual(len(quants), 1.0)
|
||||
self.assertEqual(quants.quantity, 2.0)
|
||||
self.assertEqual(quants.reserved_quantity, 0.0)
|
||||
self.assertEqual(len(move1.pack_operation_ids), 0.0)
|
||||
self.assertEqual(len(move1.move_line_ids), 0.0)
|
||||
|
||||
def test_unreserve_4(self):
|
||||
""" Check the unreservation of a partially available stock move.
|
||||
@@ -764,7 +764,7 @@ class StockMove(TransactionCase):
|
||||
# assignment
|
||||
move1.action_assign()
|
||||
self.assertEqual(move1.state, 'partially_available')
|
||||
self.assertEqual(len(move1.pack_operation_ids), 1)
|
||||
self.assertEqual(len(move1.move_line_ids), 1)
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 0.0)
|
||||
quants = self.env['stock.quant']._gather(self.product1, self.stock_location)
|
||||
@@ -777,7 +777,7 @@ class StockMove(TransactionCase):
|
||||
self.assertEqual(len(quants), 1.0)
|
||||
self.assertEqual(quants.quantity, 2.0)
|
||||
self.assertEqual(quants.reserved_quantity, 0.0)
|
||||
self.assertEqual(len(move1.pack_operation_ids), 0.0)
|
||||
self.assertEqual(len(move1.move_line_ids), 0.0)
|
||||
|
||||
def test_link_assign_1(self):
|
||||
""" Test the assignment mechanism when two chained stock moves try to move one unit of an
|
||||
@@ -808,10 +808,10 @@ class StockMove(TransactionCase):
|
||||
|
||||
(move_stock_pack + move_pack_cust).action_confirm()
|
||||
move_stock_pack.action_assign()
|
||||
move_stock_pack.pack_operation_ids[0].qty_done = 1.0
|
||||
move_stock_pack.move_line_ids[0].qty_done = 1.0
|
||||
move_stock_pack.action_done()
|
||||
self.assertEqual(len(move_pack_cust.pack_operation_ids), 1)
|
||||
move_line = move_pack_cust.pack_operation_ids[0]
|
||||
self.assertEqual(len(move_pack_cust.move_line_ids), 1)
|
||||
move_line = move_pack_cust.move_line_ids[0]
|
||||
self.assertEqual(move_line.location_id.id, self.pack_location.id)
|
||||
self.assertEqual(move_line.location_dest_id.id, self.customer_location.id)
|
||||
self.assertEqual(move_pack_cust.state, 'assigned')
|
||||
@@ -851,7 +851,7 @@ class StockMove(TransactionCase):
|
||||
(move_stock_pack + move_pack_cust).action_confirm()
|
||||
move_stock_pack.action_assign()
|
||||
|
||||
move_line_stock_pack = move_stock_pack.pack_operation_ids[0]
|
||||
move_line_stock_pack = move_stock_pack.move_line_ids[0]
|
||||
self.assertEqual(move_line_stock_pack.lot_id.id, lot1.id)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, lot_id=lot1), 0.0)
|
||||
self.assertEqual(len(self.env['stock.quant']._gather(self.product1, self.stock_location, lot1)), 1.0)
|
||||
@@ -862,7 +862,7 @@ class StockMove(TransactionCase):
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, lot_id=lot1), 0.0)
|
||||
self.assertEqual(len(self.env['stock.quant']._gather(self.product1, self.stock_location, lot1)), 0.0)
|
||||
|
||||
move_line_pack_cust = move_pack_cust.pack_operation_ids[0]
|
||||
move_line_pack_cust = move_pack_cust.move_line_ids[0]
|
||||
self.assertEqual(move_line_pack_cust.lot_id.id, lot1.id)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.pack_location, lot_id=lot1), 0.0)
|
||||
self.assertEqual(len(self.env['stock.quant']._gather(self.product1, self.pack_location, lot1)), 1.0)
|
||||
@@ -908,22 +908,22 @@ class StockMove(TransactionCase):
|
||||
# assign and fulfill the first move
|
||||
move_stock_pack_1.action_assign()
|
||||
self.assertEqual(move_stock_pack_1.state, 'assigned')
|
||||
self.assertEqual(len(move_stock_pack_1.pack_operation_ids), 1)
|
||||
move_stock_pack_1.pack_operation_ids[0].qty_done = 1.0
|
||||
self.assertEqual(len(move_stock_pack_1.move_line_ids), 1)
|
||||
move_stock_pack_1.move_line_ids[0].qty_done = 1.0
|
||||
move_stock_pack_1.action_done()
|
||||
self.assertEqual(move_stock_pack_1.state, 'done')
|
||||
|
||||
# the destination move should be partially available and have one move line
|
||||
self.assertEqual(move_pack_cust.state, 'partially_available')
|
||||
self.assertEqual(len(move_pack_cust.pack_operation_ids), 1)
|
||||
self.assertEqual(len(move_pack_cust.move_line_ids), 1)
|
||||
# Should have 1 quant in stock_location and another in pack_location
|
||||
self.assertEqual(len(self.env['stock.quant']._gather(self.product1, self.stock_location)), 1.0)
|
||||
self.assertEqual(len(self.env['stock.quant']._gather(self.product1, self.pack_location)), 1.0)
|
||||
|
||||
move_stock_pack_2.action_assign()
|
||||
self.assertEqual(move_stock_pack_2.state, 'assigned')
|
||||
self.assertEqual(len(move_stock_pack_2.pack_operation_ids), 1)
|
||||
move_stock_pack_2.pack_operation_ids[0].qty_done = 1.0
|
||||
self.assertEqual(len(move_stock_pack_2.move_line_ids), 1)
|
||||
move_stock_pack_2.move_line_ids[0].qty_done = 1.0
|
||||
move_stock_pack_2.action_done()
|
||||
self.assertEqual(move_stock_pack_2.state, 'done')
|
||||
|
||||
@@ -931,8 +931,8 @@ class StockMove(TransactionCase):
|
||||
self.assertEqual(len(self.env['stock.quant']._gather(self.product1, self.pack_location)), 1.0)
|
||||
|
||||
self.assertEqual(move_pack_cust.state, 'assigned')
|
||||
self.assertEqual(len(move_pack_cust.pack_operation_ids), 1)
|
||||
move_line_1 = move_pack_cust.pack_operation_ids[0]
|
||||
self.assertEqual(len(move_pack_cust.move_line_ids), 1)
|
||||
move_line_1 = move_pack_cust.move_line_ids[0]
|
||||
self.assertEqual(move_line_1.location_id.id, self.pack_location.id)
|
||||
self.assertEqual(move_line_1.location_dest_id.id, self.customer_location.id)
|
||||
self.assertEqual(move_line_1.product_qty, 2.0)
|
||||
@@ -983,22 +983,22 @@ class StockMove(TransactionCase):
|
||||
|
||||
# assign and fulfill the first move
|
||||
move_stock_pack_1.action_assign()
|
||||
self.assertEqual(len(move_stock_pack_1.pack_operation_ids), 1)
|
||||
self.assertEqual(move_stock_pack_1.pack_operation_ids[0].lot_id.id, lot1.id)
|
||||
move_stock_pack_1.pack_operation_ids[0].qty_done = 1.0
|
||||
self.assertEqual(len(move_stock_pack_1.move_line_ids), 1)
|
||||
self.assertEqual(move_stock_pack_1.move_line_ids[0].lot_id.id, lot1.id)
|
||||
move_stock_pack_1.move_line_ids[0].qty_done = 1.0
|
||||
move_stock_pack_1.action_done()
|
||||
|
||||
# the destination move should be partially available and have one move line
|
||||
self.assertEqual(len(move_pack_cust.pack_operation_ids), 1)
|
||||
self.assertEqual(len(move_pack_cust.move_line_ids), 1)
|
||||
|
||||
move_stock_pack_2.action_assign()
|
||||
self.assertEqual(len(move_stock_pack_2.pack_operation_ids), 1)
|
||||
self.assertEqual(move_stock_pack_2.pack_operation_ids[0].lot_id.id, lot1.id)
|
||||
move_stock_pack_2.pack_operation_ids[0].qty_done = 1.0
|
||||
self.assertEqual(len(move_stock_pack_2.move_line_ids), 1)
|
||||
self.assertEqual(move_stock_pack_2.move_line_ids[0].lot_id.id, lot1.id)
|
||||
move_stock_pack_2.move_line_ids[0].qty_done = 1.0
|
||||
move_stock_pack_2.action_done()
|
||||
|
||||
self.assertEqual(len(move_pack_cust.pack_operation_ids), 1)
|
||||
move_line_1 = move_pack_cust.pack_operation_ids[0]
|
||||
self.assertEqual(len(move_pack_cust.move_line_ids), 1)
|
||||
move_line_1 = move_pack_cust.move_line_ids[0]
|
||||
self.assertEqual(move_line_1.location_id.id, self.pack_location.id)
|
||||
self.assertEqual(move_line_1.location_dest_id.id, self.customer_location.id)
|
||||
self.assertEqual(move_line_1.product_qty, 2.0)
|
||||
@@ -1044,16 +1044,16 @@ class StockMove(TransactionCase):
|
||||
|
||||
# assign and fulfill the first move
|
||||
move_stock_pack.action_assign()
|
||||
self.assertEqual(len(move_stock_pack.pack_operation_ids), 1)
|
||||
move_stock_pack.pack_operation_ids[0].qty_done = 2.0
|
||||
self.assertEqual(len(move_stock_pack.move_line_ids), 1)
|
||||
move_stock_pack.move_line_ids[0].qty_done = 2.0
|
||||
move_stock_pack.action_done()
|
||||
|
||||
# the destination moves should be available and have one move line
|
||||
self.assertEqual(len(move_pack_cust_1.pack_operation_ids), 1)
|
||||
self.assertEqual(len(move_pack_cust_2.pack_operation_ids), 1)
|
||||
self.assertEqual(len(move_pack_cust_1.move_line_ids), 1)
|
||||
self.assertEqual(len(move_pack_cust_2.move_line_ids), 1)
|
||||
|
||||
move_pack_cust_1.pack_operation_ids[0].qty_done = 1.0
|
||||
move_pack_cust_2.pack_operation_ids[0].qty_done = 1.0
|
||||
move_pack_cust_1.move_line_ids[0].qty_done = 1.0
|
||||
move_pack_cust_2.move_line_ids[0].qty_done = 1.0
|
||||
(move_pack_cust_1 + move_pack_cust_2).action_done()
|
||||
|
||||
def test_link_assign_6(self):
|
||||
@@ -1106,7 +1106,7 @@ class StockMove(TransactionCase):
|
||||
|
||||
# do the fist move, it'll bring 3 units in stock location so only `move_stock_stock_1`
|
||||
# should be assigned
|
||||
move_supp_stock_1.pack_operation_ids.qty_done = 3.0
|
||||
move_supp_stock_1.move_line_ids.qty_done = 3.0
|
||||
move_supp_stock_1.action_done()
|
||||
self.assertEqual(move_supp_stock_1.state, 'done')
|
||||
self.assertEqual(move_supp_stock_2.state, 'confirmed')
|
||||
@@ -1152,7 +1152,7 @@ class StockMove(TransactionCase):
|
||||
self.assertEqual(move2.state, 'assigned')
|
||||
|
||||
# use the product from the first one
|
||||
move2.write({'pack_operation_ids': [(0, 0, {
|
||||
move2.write({'move_line_ids': [(0, 0, {
|
||||
'product_id': self.product1.id,
|
||||
'product_uom_id': self.uom_unit.id,
|
||||
'qty_done': 1,
|
||||
@@ -1213,7 +1213,7 @@ class StockMove(TransactionCase):
|
||||
self.assertEqual(move2.state, 'assigned')
|
||||
|
||||
# use the product from the first one
|
||||
move2.write({'pack_operation_ids': [(0, 0, {
|
||||
move2.write({'move_line_ids': [(0, 0, {
|
||||
'product_id': self.product1.id,
|
||||
'product_uom_id': self.uom_unit.id,
|
||||
'qty_done': 1,
|
||||
@@ -1266,7 +1266,7 @@ class StockMove(TransactionCase):
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, shelf2_location), 1.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 1.0)
|
||||
|
||||
move1.pack_operation_ids.location_id = shelf2_location.id
|
||||
move1.move_line_ids.location_id = shelf2_location.id
|
||||
|
||||
self.assertEqual(move1.reserved_availability, 1.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, shelf1_location), 1.0)
|
||||
@@ -1307,7 +1307,7 @@ class StockMove(TransactionCase):
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, lot_id=lot1), 0.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, lot_id=lot2), 1.0)
|
||||
|
||||
move1.pack_operation_ids.lot_id = lot2.id
|
||||
move1.move_line_ids.lot_id = lot2.id
|
||||
|
||||
self.assertEqual(move1.reserved_availability, 1.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 1.0)
|
||||
@@ -1342,7 +1342,7 @@ class StockMove(TransactionCase):
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, package_id=package1), 0.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, package_id=package2), 1.0)
|
||||
|
||||
move1.pack_operation_ids.package_id = package2.id
|
||||
move1.move_line_ids.package_id = package2.id
|
||||
|
||||
self.assertEqual(move1.reserved_availability, 1.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 1.0)
|
||||
@@ -1377,7 +1377,7 @@ class StockMove(TransactionCase):
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, owner_id=owner1), 0.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, owner_id=owner2), 1.0)
|
||||
|
||||
move1.pack_operation_ids.owner_id = owner2.id
|
||||
move1.move_line_ids.owner_id = owner2.id
|
||||
|
||||
self.assertEqual(move1.reserved_availability, 1.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 1.0)
|
||||
@@ -1419,7 +1419,7 @@ class StockMove(TransactionCase):
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 1.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, lot_id=lot1, package_id=package1), 0.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, lot_id=lot2), 1.0)
|
||||
move_line = move1.pack_operation_ids[0]
|
||||
move_line = move1.move_line_ids[0]
|
||||
move_line.write({'package_id': False, 'lot_id': lot2.id})
|
||||
|
||||
self.assertEqual(move1.reserved_availability, 1.0)
|
||||
@@ -1462,7 +1462,7 @@ class StockMove(TransactionCase):
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, shelf2_location), 0.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 0.0)
|
||||
|
||||
move1.pack_operation_ids.location_id = shelf2_location.id
|
||||
move1.move_line_ids.location_id = shelf2_location.id
|
||||
|
||||
self.assertEqual(move1.reserved_availability, 0.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 1.0)
|
||||
@@ -1501,8 +1501,8 @@ class StockMove(TransactionCase):
|
||||
# assignment
|
||||
move1.action_assign()
|
||||
self.assertEqual(move1.state, 'assigned')
|
||||
self.assertEqual(len(move1.pack_operation_ids), 1)
|
||||
move_line = move1.pack_operation_ids[0]
|
||||
self.assertEqual(len(move1.move_line_ids), 1)
|
||||
move_line = move1.move_line_ids[0]
|
||||
self.assertEqual(move_line.product_qty, 5)
|
||||
move_line.qty_done = 5.0
|
||||
self.assertEqual(move_line.product_qty, 5) # don't change reservation
|
||||
@@ -1554,11 +1554,11 @@ class StockMove(TransactionCase):
|
||||
# assignment
|
||||
move1.action_assign()
|
||||
self.assertEqual(move1.state, 'assigned')
|
||||
self.assertEqual(len(move1.pack_operation_ids), 2)
|
||||
self.assertEqual(len(move1.move_line_ids), 2)
|
||||
|
||||
tracked_move_line = None
|
||||
untracked_move_line = None
|
||||
for move_line in move1.pack_operation_ids:
|
||||
for move_line in move1.move_line_ids:
|
||||
if move_line.lot_id:
|
||||
tracked_move_line = move_line
|
||||
else:
|
||||
@@ -1617,7 +1617,7 @@ class StockMove(TransactionCase):
|
||||
})
|
||||
move1.action_confirm()
|
||||
move1.action_assign()
|
||||
move1.pack_operation_ids.qty_done = 1
|
||||
move1.move_line_ids.qty_done = 1
|
||||
move1.action_done()
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, shelf1_location), 0.0)
|
||||
@@ -1625,7 +1625,7 @@ class StockMove(TransactionCase):
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 1.0)
|
||||
|
||||
# edit once done, we actually moved from shelf2
|
||||
move1.pack_operation_ids.location_id = shelf2_location.id
|
||||
move1.move_line_ids.location_id = shelf2_location.id
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, shelf1_location), 1.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, shelf2_location), 0.0)
|
||||
@@ -1659,14 +1659,14 @@ class StockMove(TransactionCase):
|
||||
})
|
||||
move1.action_confirm()
|
||||
move1.action_assign()
|
||||
move1.pack_operation_ids.qty_done = 1
|
||||
move1.move_line_ids.qty_done = 1
|
||||
move1.action_done()
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 1.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, lot_id=lot1), 0.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, lot_id=lot2), 1.0)
|
||||
|
||||
move1.pack_operation_ids.lot_id = lot2.id
|
||||
move1.move_line_ids.lot_id = lot2.id
|
||||
|
||||
self.assertEqual(move1.reserved_availability, 1.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 1.0)
|
||||
@@ -1696,14 +1696,14 @@ class StockMove(TransactionCase):
|
||||
})
|
||||
move1.action_confirm()
|
||||
move1.action_assign()
|
||||
move1.pack_operation_ids.qty_done = 1
|
||||
move1.move_line_ids.qty_done = 1
|
||||
move1.action_done()
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 1.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, package_id=package1), 0.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, package_id=package2), 1.0)
|
||||
|
||||
move1.pack_operation_ids.package_id = package2.id
|
||||
move1.move_line_ids.package_id = package2.id
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 1.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, package_id=package1), 1.0)
|
||||
@@ -1732,14 +1732,14 @@ class StockMove(TransactionCase):
|
||||
})
|
||||
move1.action_confirm()
|
||||
move1.action_assign()
|
||||
move1.pack_operation_ids.qty_done = 1
|
||||
move1.move_line_ids.qty_done = 1
|
||||
move1.action_done()
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 1.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, owner_id=owner1), 0.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, owner_id=owner2), 1.0)
|
||||
|
||||
move1.pack_operation_ids.owner_id = owner2.id
|
||||
move1.move_line_ids.owner_id = owner2.id
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 1.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, owner_id=owner1), 1.0)
|
||||
@@ -1776,13 +1776,13 @@ class StockMove(TransactionCase):
|
||||
})
|
||||
move1.action_confirm()
|
||||
move1.action_assign()
|
||||
move1.pack_operation_ids.qty_done = 1
|
||||
move1.move_line_ids.qty_done = 1
|
||||
move1.action_done()
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 1.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, lot_id=lot1, package_id=package1), 0.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location, lot_id=lot2), 1.0)
|
||||
move_line = move1.pack_operation_ids[0]
|
||||
move_line = move1.move_line_ids[0]
|
||||
move_line.write({'package_id': False, 'lot_id': lot2.id})
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 1.0)
|
||||
@@ -1819,14 +1819,14 @@ class StockMove(TransactionCase):
|
||||
})
|
||||
move1.action_confirm()
|
||||
move1.action_assign()
|
||||
move1.pack_operation_ids.qty_done = 1
|
||||
move1.move_line_ids.qty_done = 1
|
||||
move1.action_done()
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, shelf1_location), 0.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, shelf2_location), 0.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 0.0)
|
||||
|
||||
move1.pack_operation_ids.location_id = shelf2_location.id
|
||||
move1.move_line_ids.location_id = shelf2_location.id
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 0.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, shelf1_location), 1.0)
|
||||
@@ -1864,7 +1864,7 @@ class StockMove(TransactionCase):
|
||||
})
|
||||
move1.action_confirm()
|
||||
move1.action_assign()
|
||||
move1.pack_operation_ids.qty_done = 1
|
||||
move1.move_line_ids.qty_done = 1
|
||||
move1.action_done()
|
||||
|
||||
move2 = self.env['stock.move'].create({
|
||||
@@ -1883,7 +1883,7 @@ class StockMove(TransactionCase):
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, shelf2_location), 0.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 0.0)
|
||||
|
||||
move1.pack_operation_ids.location_id = shelf2_location.id
|
||||
move1.move_line_ids.location_id = shelf2_location.id
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 1.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, shelf1_location), 1.0)
|
||||
@@ -1915,14 +1915,14 @@ class StockMove(TransactionCase):
|
||||
})
|
||||
move1.action_confirm()
|
||||
move1.action_assign()
|
||||
move1.pack_operation_ids.qty_done = 1
|
||||
move1.move_line_ids.qty_done = 1
|
||||
move1.action_done()
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, shelf1_location), 0.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 0.0)
|
||||
|
||||
# edit once done, we actually moved 2 products
|
||||
move1.pack_operation_ids.qty_done = 2
|
||||
move1.move_line_ids.qty_done = 2
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, shelf1_location), -1.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), -1.0)
|
||||
@@ -1951,14 +1951,14 @@ class StockMove(TransactionCase):
|
||||
})
|
||||
move1.action_confirm()
|
||||
move1.action_assign()
|
||||
move1.pack_operation_ids.qty_done = 1
|
||||
move1.move_line_ids.qty_done = 1
|
||||
move1.action_done()
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, shelf1_location), 0.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 0.0)
|
||||
|
||||
# edit once done, we actually moved 2 products
|
||||
move1.pack_operation_ids.qty_done = 0
|
||||
move1.move_line_ids.qty_done = 0
|
||||
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, shelf1_location), 1.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 1.0)
|
||||
@@ -1978,14 +1978,14 @@ class StockMove(TransactionCase):
|
||||
})
|
||||
move1.action_confirm()
|
||||
move1.action_assign()
|
||||
move1.pack_operation_ids.qty_done = 10
|
||||
move1.move_line_ids.qty_done = 10
|
||||
move1.action_done()
|
||||
|
||||
quant = self.env['stock.quant']._gather(self.product1, self.stock_location)
|
||||
self.assertEqual(len(quant), 1.0)
|
||||
|
||||
# edit once done, we actually moved 2 products
|
||||
move1.pack_operation_ids.qty_done = 0
|
||||
move1.move_line_ids.qty_done = 0
|
||||
|
||||
quant = self.env['stock.quant']._gather(self.product1, self.stock_location)
|
||||
self.assertEqual(len(quant), 0.0)
|
||||
@@ -2012,20 +2012,20 @@ class StockMove(TransactionCase):
|
||||
})
|
||||
picking.action_confirm()
|
||||
picking.action_assign()
|
||||
move1.pack_operation_ids.qty_done = 10
|
||||
move1.move_line_ids.qty_done = 10
|
||||
picking.action_done()
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 10.0)
|
||||
self.env['stock.pack.operation'].create({
|
||||
'picking_id': move1.pack_operation_ids.picking_id.id,
|
||||
'move_id': move1.pack_operation_ids.move_id.id,
|
||||
'product_id': move1.pack_operation_ids.product_id.id,
|
||||
'qty_done': move1.pack_operation_ids.qty_done,
|
||||
self.env['stock.move.line'].create({
|
||||
'picking_id': move1.move_line_ids.picking_id.id,
|
||||
'move_id': move1.move_line_ids.move_id.id,
|
||||
'product_id': move1.move_line_ids.product_id.id,
|
||||
'qty_done': move1.move_line_ids.qty_done,
|
||||
'product_uom_id': move1.product_uom.id,
|
||||
'location_id': move1.pack_operation_ids.location_id.id,
|
||||
'location_dest_id': move1.pack_operation_ids.location_dest_id.id,
|
||||
'location_id': move1.move_line_ids.location_id.id,
|
||||
'location_dest_id': move1.move_line_ids.location_dest_id.id,
|
||||
})
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 20.0)
|
||||
move1.pack_operation_ids[1].qty_done = 5
|
||||
move1.move_line_ids[1].qty_done = 5
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 15.0)
|
||||
|
||||
def test_immediate_validate_1(self):
|
||||
@@ -2088,9 +2088,9 @@ class StockMove(TransactionCase):
|
||||
wizard = self.env[(res_dict.get('res_model'))].browse(res_dict.get('res_id'))
|
||||
wizard.process()
|
||||
|
||||
self.assertEqual(len(picking.move_lines.pack_operation_ids), 1)
|
||||
self.assertEqual(len(picking.move_lines.move_line_ids), 1)
|
||||
self.assertEqual(picking.move_lines.quantity_done, 5.0)
|
||||
self.assertEqual(picking.move_lines.pack_operation_ids.qty_done, 5.0)
|
||||
self.assertEqual(picking.move_lines.move_line_ids.qty_done, 5.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 0.0)
|
||||
self.assertEqual(len(self.env['stock.quant']._gather(self.product1, self.stock_location)), 0.0)
|
||||
|
||||
@@ -2101,7 +2101,7 @@ class StockMove(TransactionCase):
|
||||
def test_immediate_validate_3(self):
|
||||
""" Create a picking and simulates validate button effect.
|
||||
In case of a force assign it should ignore the reserved quantity and set
|
||||
the quantity done to the initial demand. It should also create the pack_operation line.
|
||||
the quantity done to the initial demand. It should also create the move line.
|
||||
"""
|
||||
owner = self.env['res.partner'].create({'name': 'Jean'})
|
||||
picking = self.env['stock.picking'].create({
|
||||
@@ -2128,9 +2128,9 @@ class StockMove(TransactionCase):
|
||||
|
||||
self.assertEqual(picking.move_lines.quantity_done, 10.0)
|
||||
# Check move_lines data
|
||||
self.assertEqual(len(picking.move_lines.pack_operation_ids), 1)
|
||||
self.assertEqual(picking.move_lines.pack_operation_ids.qty_done, 10.0)
|
||||
self.assertEqual(picking.move_lines.pack_operation_ids.product_qty, 0.0)
|
||||
self.assertEqual(len(picking.move_lines.move_line_ids), 1)
|
||||
self.assertEqual(picking.move_lines.move_line_ids.qty_done, 10.0)
|
||||
self.assertEqual(picking.move_lines.move_line_ids.product_qty, 0.0)
|
||||
# Check quants data
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), -10.0)
|
||||
self.assertEqual(len(self.env['stock.quant']._gather(self.product1, self.stock_location)), 1.0)
|
||||
@@ -2167,15 +2167,15 @@ class StockMove(TransactionCase):
|
||||
picking.action_assign()
|
||||
with self.assertRaises(UserError):
|
||||
picking.button_validate()
|
||||
picking.move_lines.pack_operation_ids[0].qty_done = 5.0
|
||||
picking.move_lines.move_line_ids[0].qty_done = 5.0
|
||||
# We do not need to catch wizard since everything is already defined and the action_done will be processed immediately
|
||||
picking.button_validate()
|
||||
|
||||
self.assertEqual(picking.move_lines.quantity_done, 5.0)
|
||||
# Check move_lines data
|
||||
self.assertEqual(len(picking.move_lines.pack_operation_ids), 1)
|
||||
self.assertEqual(picking.move_lines.pack_operation_ids.lot_id, lot1)
|
||||
self.assertEqual(picking.move_lines.pack_operation_ids.qty_done, 5.0)
|
||||
self.assertEqual(len(picking.move_lines.move_line_ids), 1)
|
||||
self.assertEqual(picking.move_lines.move_line_ids.lot_id, lot1)
|
||||
self.assertEqual(picking.move_lines.move_line_ids.qty_done, 5.0)
|
||||
# Check quants data
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.product1, self.stock_location), 0.0)
|
||||
self.assertEqual(len(self.env['stock.quant']._gather(self.product1, self.stock_location)), 0.0)
|
||||
|
||||
@@ -54,13 +54,13 @@ class TestPickShip(TestStockCommon):
|
||||
# make some stock
|
||||
self.env['stock.quant']._increase_available_quantity(self.productA, location, 10.0)
|
||||
picking_pick.action_assign()
|
||||
picking_pick.move_lines[0].pack_operation_ids[0].qty_done = 10.0
|
||||
picking_pick.move_lines[0].move_line_ids[0].qty_done = 10.0
|
||||
picking_pick.do_transfer()
|
||||
|
||||
self.assertEqual(picking_client.state, 'assigned', 'The state of the client should be assigned')
|
||||
|
||||
# Now partially transfer the ship
|
||||
picking_client.move_lines[0].pack_operation_ids[0].qty_done = 5
|
||||
picking_client.move_lines[0].move_line_ids[0].qty_done = 5
|
||||
picking_client.do_transfer() # no new in order to create backorder
|
||||
|
||||
backorder = self.env['stock.picking'].search([('backorder_id', '=', picking_client.id)])
|
||||
@@ -90,7 +90,7 @@ class TestPickShip(TestStockCommon):
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.productA, stock_location), 0.0)
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.productA, pack_location), 5.0)
|
||||
|
||||
move_pick.pack_operation_ids[0].qty_done = 10.0
|
||||
move_pick.move_line_ids[0].qty_done = 10.0
|
||||
picking_pick.do_transfer()
|
||||
|
||||
self.assertEqual(move_pick.state, 'done')
|
||||
@@ -108,7 +108,7 @@ class TestPickShip(TestStockCommon):
|
||||
self.env['stock.quant']._increase_available_quantity(self.productA, stock_location, 10.0)
|
||||
|
||||
picking_pick.action_assign()
|
||||
picking_pick.move_lines[0].pack_operation_ids[0].qty_done = 10.0
|
||||
picking_pick.move_lines[0].move_line_ids[0].qty_done = 10.0
|
||||
picking_pick.do_transfer()
|
||||
self.assertEqual(picking_pick.state, 'done')
|
||||
self.assertEqual(picking_client.state, 'assigned')
|
||||
@@ -120,7 +120,7 @@ class TestPickShip(TestStockCommon):
|
||||
stock_return_picking.product_return_moves.quantity = 2.0 # Return only 2
|
||||
stock_return_picking_action = stock_return_picking.create_returns()
|
||||
return_pick = self.env['stock.picking'].browse(stock_return_picking_action['res_id'])
|
||||
return_pick.move_lines[0].pack_operation_ids[0].qty_done = 2.0
|
||||
return_pick.move_lines[0].move_line_ids[0].qty_done = 2.0
|
||||
return_pick.do_transfer()
|
||||
# the client picking should not be assigned anymore, as we returned partially what we took
|
||||
self.assertEqual(picking_client.state, 'confirmed')
|
||||
@@ -137,13 +137,13 @@ class TestPickShip(TestStockCommon):
|
||||
# make some stock
|
||||
self.env['stock.quant']._increase_available_quantity(self.productA, location, 10.0)
|
||||
picking_pick.action_assign()
|
||||
picking_pick.move_lines[0].pack_operation_ids[0].qty_done = 5.0
|
||||
picking_pick.move_lines[0].move_line_ids[0].qty_done = 5.0
|
||||
|
||||
# create a backorder
|
||||
picking_pick.do_transfer()
|
||||
picking_pick_backorder = self.env['stock.picking'].search([('backorder_id', '=', picking_pick.id)])
|
||||
self.assertEqual(picking_pick_backorder.state, 'assigned')
|
||||
self.assertEqual(picking_pick_backorder.pack_operation_ids.product_qty, 5.0)
|
||||
self.assertEqual(picking_pick_backorder.move_line_ids.product_qty, 5.0)
|
||||
|
||||
self.assertEqual(picking_client.state, 'partially_available')
|
||||
|
||||
@@ -255,7 +255,7 @@ class TestSinglePicking(TestStockCommon):
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.productA, pack_location), 0.0)
|
||||
|
||||
# valid with backorder creation
|
||||
delivery_order.move_lines[0].pack_operation_ids[0].qty_done = 1
|
||||
delivery_order.move_lines[0].move_line_ids[0].qty_done = 1
|
||||
delivery_order.do_transfer()
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.productA, pack_location), 0.0)
|
||||
|
||||
@@ -292,7 +292,7 @@ class TestSinglePicking(TestStockCommon):
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.productA, pack_location), 0.0)
|
||||
|
||||
# valid with backorder creation
|
||||
delivery_order.move_lines[0].pack_operation_ids[0].qty_done = 1
|
||||
delivery_order.move_lines[0].move_line_ids[0].qty_done = 1
|
||||
delivery_order.do_transfer()
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.productA, pack_location), 0.0)
|
||||
|
||||
@@ -332,19 +332,19 @@ class TestSinglePicking(TestStockCommon):
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.productA, pack_location), 0.0)
|
||||
|
||||
# valid with backorder creation
|
||||
delivery_order.move_lines[0].pack_operation_ids[0].qty_done = 2
|
||||
delivery_order.move_lines[0].move_line_ids[0].qty_done = 2
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.productA, pack_location), 0.0)
|
||||
delivery_order.with_context(debug=True).do_transfer()
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.productA, pack_location), -1.0)
|
||||
|
||||
extra_move = delivery_order.move_lines - move1
|
||||
extra_move_line = extra_move.pack_operation_ids[0]
|
||||
extra_move_line = extra_move.move_line_ids[0]
|
||||
|
||||
# self.assertEqual(move1.product_qty, 1.0)
|
||||
# self.assertEqual(move1.quantity_done, 1.0)
|
||||
self.assertEqual(move1.reserved_availability, 1.0)
|
||||
self.assertEqual(move1.pack_operation_ids.product_qty, 1.0) # should keep the reservation
|
||||
self.assertEqual(move1.pack_operation_ids.qty_done, 1.0)
|
||||
self.assertEqual(move1.move_line_ids.product_qty, 1.0) # should keep the reservation
|
||||
self.assertEqual(move1.move_line_ids.qty_done, 1.0)
|
||||
self.assertEqual(move1.state, 'done')
|
||||
|
||||
self.assertEqual(extra_move.product_qty, 1.0)
|
||||
@@ -387,19 +387,19 @@ class TestSinglePicking(TestStockCommon):
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.productA, pack_location), 0.0)
|
||||
|
||||
# valid with backorder creation
|
||||
delivery_order.move_lines[0].pack_operation_ids[0].qty_done = 3
|
||||
delivery_order.move_lines[0].move_line_ids[0].qty_done = 3
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.productA, pack_location), 0.0)
|
||||
delivery_order.do_transfer()
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.productA, pack_location), -2.0)
|
||||
|
||||
extra_move = delivery_order.move_lines - move1
|
||||
extra_move_line = extra_move.pack_operation_ids[0]
|
||||
extra_move_line = extra_move.move_line_ids[0]
|
||||
|
||||
self.assertEqual(move1.product_qty, 1.0)
|
||||
self.assertEqual(move1.quantity_done, 1.0)
|
||||
self.assertEqual(move1.reserved_availability, 1.0)
|
||||
self.assertEqual(move1.pack_operation_ids.product_qty, 1.0) # should keep the reservation
|
||||
self.assertEqual(move1.pack_operation_ids.qty_done, 1.0)
|
||||
self.assertEqual(move1.move_line_ids.product_qty, 1.0) # should keep the reservation
|
||||
self.assertEqual(move1.move_line_ids.qty_done, 1.0)
|
||||
self.assertEqual(move1.state, 'done')
|
||||
|
||||
self.assertEqual(extra_move.product_qty, 2.0)
|
||||
@@ -436,18 +436,18 @@ class TestSinglePicking(TestStockCommon):
|
||||
self.assertEqual(receipt.state, 'assigned')
|
||||
|
||||
# valid with backorder creation
|
||||
receipt.move_lines[0].pack_operation_ids[0].qty_done = 2
|
||||
receipt.move_lines[0].move_line_ids[0].qty_done = 2
|
||||
receipt.with_context(debug=True).do_transfer()
|
||||
self.assertEqual(self.env['stock.quant']._get_available_quantity(self.productA, stock_location), 2.0)
|
||||
|
||||
extra_move = receipt.move_lines - move1
|
||||
extra_move_line = extra_move.pack_operation_ids[0]
|
||||
extra_move_line = extra_move.move_line_ids[0]
|
||||
|
||||
self.assertEqual(move1.product_qty, 1.0)
|
||||
self.assertEqual(move1.quantity_done, 1.0)
|
||||
self.assertEqual(move1.reserved_availability, 1.0)
|
||||
self.assertEqual(move1.pack_operation_ids.product_qty, 1.0) # should keep the reservation
|
||||
self.assertEqual(move1.pack_operation_ids.qty_done, 1.0)
|
||||
self.assertEqual(move1.move_line_ids.product_qty, 1.0) # should keep the reservation
|
||||
self.assertEqual(move1.move_line_ids.qty_done, 1.0)
|
||||
self.assertEqual(move1.state, 'done')
|
||||
|
||||
self.assertEqual(extra_move.product_qty, 1.0)
|
||||
@@ -487,8 +487,8 @@ class TestSinglePicking(TestStockCommon):
|
||||
|
||||
# Check reserved quantity
|
||||
self.assertEqual(move1.reserved_availability, 1.0)
|
||||
self.assertEqual(len(move1.pack_operation_ids), 1)
|
||||
self.assertEqual(move1.pack_operation_ids.product_qty, 1)
|
||||
self.assertEqual(len(move1.move_line_ids), 1)
|
||||
self.assertEqual(move1.move_line_ids.product_qty, 1)
|
||||
|
||||
inventory = self.env['stock.inventory'].create({
|
||||
'name': 'remove product1',
|
||||
@@ -505,8 +505,8 @@ class TestSinglePicking(TestStockCommon):
|
||||
|
||||
# Check reserved quantity
|
||||
self.assertEqual(move1.reserved_availability, 2.0)
|
||||
self.assertEqual(len(move1.pack_operation_ids), 1)
|
||||
self.assertEqual(move1.pack_operation_ids.product_qty, 2)
|
||||
self.assertEqual(len(move1.move_line_ids), 1)
|
||||
self.assertEqual(move1.move_line_ids.product_qty, 2)
|
||||
|
||||
def test_recheck_availability_2(self):
|
||||
""" Same check than test_recheck_availability_1 but with lot this time.
|
||||
@@ -544,8 +544,8 @@ class TestSinglePicking(TestStockCommon):
|
||||
|
||||
# Check reserved quantity
|
||||
self.assertEqual(move1.reserved_availability, 1.0)
|
||||
self.assertEqual(len(move1.pack_operation_ids), 1)
|
||||
self.assertEqual(move1.pack_operation_ids.product_qty, 1)
|
||||
self.assertEqual(len(move1.move_line_ids), 1)
|
||||
self.assertEqual(move1.move_line_ids.product_qty, 1)
|
||||
|
||||
inventory = self.env['stock.inventory'].create({
|
||||
'name': 'remove product1',
|
||||
@@ -563,9 +563,9 @@ class TestSinglePicking(TestStockCommon):
|
||||
|
||||
# Check reserved quantity
|
||||
self.assertEqual(move1.reserved_availability, 2.0)
|
||||
self.assertEqual(len(move1.pack_operation_ids), 1)
|
||||
self.assertEqual(move1.pack_operation_ids.lot_id.id, lot1.id)
|
||||
self.assertEqual(move1.pack_operation_ids.product_qty, 2)
|
||||
self.assertEqual(len(move1.move_line_ids), 1)
|
||||
self.assertEqual(move1.move_line_ids.lot_id.id, lot1.id)
|
||||
self.assertEqual(move1.move_line_ids.product_qty, 2)
|
||||
|
||||
def test_recheck_availability_3(self):
|
||||
""" Same check than test_recheck_availability_2 but with different lots.
|
||||
@@ -604,8 +604,8 @@ class TestSinglePicking(TestStockCommon):
|
||||
|
||||
# Check reserved quantity
|
||||
self.assertEqual(move1.reserved_availability, 1.0)
|
||||
self.assertEqual(len(move1.pack_operation_ids), 1)
|
||||
self.assertEqual(move1.pack_operation_ids.product_qty, 1)
|
||||
self.assertEqual(len(move1.move_line_ids), 1)
|
||||
self.assertEqual(move1.move_line_ids.product_qty, 1)
|
||||
|
||||
inventory = self.env['stock.inventory'].create({
|
||||
'name': 'remove product1',
|
||||
@@ -629,9 +629,9 @@ class TestSinglePicking(TestStockCommon):
|
||||
|
||||
# Check reserved quantity
|
||||
self.assertEqual(move1.reserved_availability, 2.0)
|
||||
self.assertEqual(len(move1.pack_operation_ids), 2)
|
||||
self.assertEqual(move1.pack_operation_ids[0].lot_id.id, lot1.id)
|
||||
self.assertEqual(move1.pack_operation_ids[1].lot_id.id, lot2.id)
|
||||
self.assertEqual(len(move1.move_line_ids), 2)
|
||||
self.assertEqual(move1.move_line_ids[0].lot_id.id, lot1.id)
|
||||
self.assertEqual(move1.move_line_ids[1].lot_id.id, lot2.id)
|
||||
|
||||
def test_recheck_availability_4(self):
|
||||
""" Same check than test_recheck_availability_2 but with serial number this time.
|
||||
@@ -671,8 +671,8 @@ class TestSinglePicking(TestStockCommon):
|
||||
|
||||
# Check reserved quantity
|
||||
self.assertEqual(move1.reserved_availability, 1.0)
|
||||
self.assertEqual(len(move1.pack_operation_ids), 1)
|
||||
self.assertEqual(move1.pack_operation_ids.product_qty, 1)
|
||||
self.assertEqual(len(move1.move_line_ids), 1)
|
||||
self.assertEqual(move1.move_line_ids.product_qty, 1)
|
||||
|
||||
inventory = self.env['stock.inventory'].create({
|
||||
'name': 'remove product1',
|
||||
@@ -696,6 +696,6 @@ class TestSinglePicking(TestStockCommon):
|
||||
|
||||
# Check reserved quantity
|
||||
self.assertEqual(move1.reserved_availability, 2.0)
|
||||
self.assertEqual(len(move1.pack_operation_ids), 2)
|
||||
self.assertEqual(move1.pack_operation_ids[0].lot_id.id, serial1.id)
|
||||
self.assertEqual(move1.pack_operation_ids[1].lot_id.id, serial2.id)
|
||||
self.assertEqual(len(move1.move_line_ids), 2)
|
||||
self.assertEqual(move1.move_line_ids[0].lot_id.id, serial1.id)
|
||||
self.assertEqual(move1.move_line_ids[1].lot_id.id, serial2.id)
|
||||
|
||||
@@ -77,10 +77,10 @@ class TestStockFlow(TestStockCommon):
|
||||
# Replace pack operation of incoming shipments.
|
||||
# ----------------------------------------------------------------------
|
||||
picking_in.action_assign()
|
||||
move_a.pack_operation_ids.qty_done = 4
|
||||
move_b.pack_operation_ids.qty_done = 5
|
||||
move_c.pack_operation_ids.qty_done = 5
|
||||
move_d.pack_operation_ids.qty_done = 5
|
||||
move_a.move_line_ids.qty_done = 4
|
||||
move_b.move_line_ids.qty_done = 5
|
||||
move_c.move_line_ids.qty_done = 5
|
||||
move_d.move_line_ids.qty_done = 5
|
||||
lot2_productC = LotObj.create({'name': 'C Lot 2', 'product_id': self.productC.id})
|
||||
self.StockPackObj.create({
|
||||
'product_id': self.productC.id,
|
||||
@@ -221,8 +221,8 @@ class TestStockFlow(TestStockCommon):
|
||||
# Replace pack operation of outgoing shipment.
|
||||
# ----------------------------------------------------------------------
|
||||
|
||||
move_cust_a.pack_operation_ids.qty_done = 2.0
|
||||
move_cust_b.pack_operation_ids.qty_done = 3.0
|
||||
move_cust_a.move_line_ids.qty_done = 2.0
|
||||
move_cust_b.move_line_ids.qty_done = 3.0
|
||||
self.StockPackObj.create({
|
||||
'product_id': self.productB.id,
|
||||
'qty_done': 2,
|
||||
@@ -231,7 +231,7 @@ class TestStockFlow(TestStockCommon):
|
||||
'location_dest_id': self.customer_location,
|
||||
'move_id': move_cust_b.id})
|
||||
# TODO care if product_qty and lot_id are set at the same times the system do 2 unreserve.
|
||||
move_cust_c.pack_operation_ids[0].write({
|
||||
move_cust_c.move_line_ids[0].write({
|
||||
'qty_done': 2.0,
|
||||
'lot_id': lot2_productC.id,
|
||||
})
|
||||
@@ -242,7 +242,7 @@ class TestStockFlow(TestStockCommon):
|
||||
'location_id': self.stock_location,
|
||||
'location_dest_id': self.customer_location,
|
||||
'move_id': move_cust_c.id})
|
||||
move_cust_d.pack_operation_ids.qty_done = 6.0
|
||||
move_cust_d.move_line_ids.qty_done = 6.0
|
||||
|
||||
# Transfer picking.
|
||||
picking_out.action_done()
|
||||
@@ -1370,11 +1370,11 @@ class TestStockFlow(TestStockCommon):
|
||||
self.assertEqual(move.state, 'waiting', 'Wrong state of move line.')
|
||||
|
||||
# Set the quantity done on the pack operation
|
||||
move_in.pack_operation_ids.qty_done = 3.0
|
||||
move_in.move_line_ids.qty_done = 3.0
|
||||
# Put in a pack
|
||||
picking_in.put_in_pack()
|
||||
# Get the new package
|
||||
picking_in_package = move_in.pack_operation_ids.result_package_id
|
||||
picking_in_package = move_in.move_line_ids.result_package_id
|
||||
# Validate picking
|
||||
picking_in.action_done()
|
||||
|
||||
@@ -1386,9 +1386,9 @@ class TestStockFlow(TestStockCommon):
|
||||
self.assertEqual(move.state, 'assigned', 'Wrong state of move line.')
|
||||
|
||||
# Set the quantity done on the pack operation
|
||||
move_pack.pack_operation_ids.qty_done = 3.0
|
||||
move_pack.move_line_ids.qty_done = 3.0
|
||||
# Get the new package
|
||||
picking_pack_package = move_pack.pack_operation_ids.result_package_id
|
||||
picking_pack_package = move_pack.move_line_ids.result_package_id
|
||||
# Validate picking
|
||||
picking_pack.action_done()
|
||||
|
||||
@@ -1400,8 +1400,8 @@ class TestStockFlow(TestStockCommon):
|
||||
self.assertEqual(move.state, 'assigned', 'Wrong state of move line.')
|
||||
|
||||
# Validate picking
|
||||
picking_out.pack_operation_ids.qty_done = 3.0
|
||||
picking_out_package = move_out.pack_operation_ids.result_package_id
|
||||
picking_out.move_line_ids.qty_done = 3.0
|
||||
picking_out_package = move_out.move_line_ids.result_package_id
|
||||
picking_out.action_done()
|
||||
|
||||
# check all pickings are done
|
||||
@@ -1438,9 +1438,9 @@ class TestStockFlow(TestStockCommon):
|
||||
pack_obj = self.env['stock.quant.package']
|
||||
pack1 = pack_obj.create({'name': 'PACKINOUTTEST1'})
|
||||
pack2 = pack_obj.create({'name': 'PACKINOUTTEST2'})
|
||||
picking_in.pack_operation_ids[0].result_package_id = pack1
|
||||
picking_in.pack_operation_ids[0].qty_done = 4
|
||||
packop2 = picking_in.pack_operation_ids[0].with_context(bypass_reservation_update=True).copy({'product_uom_qty': 0})
|
||||
picking_in.move_line_ids[0].result_package_id = pack1
|
||||
picking_in.move_line_ids[0].qty_done = 4
|
||||
packop2 = picking_in.move_line_ids[0].with_context(bypass_reservation_update=True).copy({'product_uom_qty': 0})
|
||||
packop2.qty_done = 6
|
||||
packop2.result_package_id = pack2
|
||||
picking_in.action_done()
|
||||
@@ -1464,8 +1464,8 @@ class TestStockFlow(TestStockCommon):
|
||||
'location_dest_id': self.customer_location})
|
||||
picking_out.action_confirm()
|
||||
picking_out.action_assign()
|
||||
packout1 = picking_out.pack_operation_ids[0]
|
||||
packout2 = picking_out.pack_operation_ids[0].with_context(bypass_reservation_update=True).copy({'product_uom_qty': 0})
|
||||
packout1 = picking_out.move_line_ids[0]
|
||||
packout2 = picking_out.move_line_ids[0].with_context(bypass_reservation_update=True).copy({'product_uom_qty': 0})
|
||||
packout1.qty_done = 2
|
||||
packout1.package_id = pack1
|
||||
packout2.package_id = pack2
|
||||
@@ -1496,9 +1496,9 @@ class TestStockFlow(TestStockCommon):
|
||||
pack_obj = self.env['stock.quant.package']
|
||||
pack1 = pack_obj.create({'name': 'PACKINOUTTEST1'})
|
||||
pack2 = pack_obj.create({'name': 'PACKINOUTTEST2'})
|
||||
picking_in.pack_operation_ids[0].result_package_id = pack1
|
||||
picking_in.pack_operation_ids[0].qty_done = 120
|
||||
packop2 = picking_in.pack_operation_ids[0].with_context(bypass_reservation_update=True).copy({'product_uom_qty': 0})
|
||||
picking_in.move_line_ids[0].result_package_id = pack1
|
||||
picking_in.move_line_ids[0].qty_done = 120
|
||||
packop2 = picking_in.move_line_ids[0].with_context(bypass_reservation_update=True).copy({'product_uom_qty': 0})
|
||||
packop2.qty_done = 80
|
||||
packop2.result_package_id = pack2
|
||||
picking_in.action_done()
|
||||
@@ -1523,8 +1523,8 @@ class TestStockFlow(TestStockCommon):
|
||||
picking_out.action_confirm()
|
||||
picking_out.action_assign()
|
||||
# Convert entire packs into taking out of packs
|
||||
packout0 = picking_out.pack_operation_ids[0]
|
||||
packout1 = picking_out.pack_operation_ids[1]
|
||||
packout0 = picking_out.move_line_ids[0]
|
||||
packout1 = picking_out.move_line_ids[1]
|
||||
packout0.write({
|
||||
'package_id': pack1.id,
|
||||
'product_id': self.productE.id,
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<template id="report_mrp_line">
|
||||
<t t-foreach="lines" t-as="a">
|
||||
<t t-set="trclass" t-value="'o_stock_reports_default_style'"/>
|
||||
<t t-if="a.get('model') == 'stock.pack.operation'"><t t-set="trclass" t-value="'o_stock_reports_level0'"/></t>
|
||||
<t t-if="a.get('model') == 'stock.move.line'"><t t-set="trclass" t-value="'o_stock_reports_level0'"/></t>
|
||||
<t t-if="a.get('model') == 'stock.quant'"><t t-set="trclass" t-value="'o_stock_reports_level1'"/></t>
|
||||
<t t-set="domainClass" t-value="'o_stock_reports_domain_line'"/>
|
||||
<t t-if="a['unfoldable'] == false">
|
||||
@@ -30,7 +30,7 @@
|
||||
</td>
|
||||
</t>
|
||||
<td>
|
||||
<t t-if="a.get('model') == 'stock.pack.operation'">
|
||||
<t t-if="a.get('model') == 'stock.move.line'">
|
||||
<span t-if="a['stream'] == 'downstream'" class="o_stock_reports_stream text-muted" data-stream="upstream" title="Upstream Traceability"><i class="fa fa-arrow-up"></i></span>
|
||||
<span t-if="a['stream'] == 'upstream'" class="o_stock_reports_stream" data-stream="downstream" title="Downstream Traceability"><i class="fa fa-arrow-down"></i></span>
|
||||
</t>
|
||||
@@ -101,7 +101,7 @@
|
||||
<t t-foreach="lines" t-as="a">
|
||||
<t t-set="space_td" t-value="'margin-left: '+ str(a['level']) + 'px;'"/>
|
||||
<t t-set="trclass" t-value="'o_stock_reports_default_style'"/>
|
||||
<t t-if="a.get('model') == 'stock.pack.operation'"><t t-set="trclass" t-value="'o_stock_reports_level0'"/></t>
|
||||
<t t-if="a.get('model') == 'stock.move.line'"><t t-set="trclass" t-value="'o_stock_reports_level0'"/></t>
|
||||
<t t-if="a.get('model') == 'stock.quant'"><t t-set="trclass" t-value="'o_stock_reports_level1'"/></t>
|
||||
<t t-set="column" t-value="0" />
|
||||
<tr t-att-data-type="a['type']" t-att-data-stream="a['stream']" t-att-data-id="a['id']" t-att-data-model="a['model']" t-att-class="trclass">
|
||||
|
||||
@@ -165,7 +165,7 @@
|
||||
|
||||
</group>
|
||||
</group>
|
||||
<field name="pack_operation_ids" attrs="{'readonly': ['&', ('state', 'in', ('done', 'cancel')), ('is_editable', '=', False)]}" context="{'default_product_uom_id': product_uom, 'default_picking_id': picking_id, 'default_move_id': id, 'default_product_id': product_id, 'default_location_id': location_id, 'default_location_dest_id': location_dest_id}">
|
||||
<field name="move_line_ids" attrs="{'readonly': ['&', ('state', 'in', ('done', 'cancel')), ('is_editable', '=', False)]}" context="{'default_product_uom_id': product_uom, 'default_picking_id': picking_id, 'default_move_id': id, 'default_product_id': product_id, 'default_location_id': location_id, 'default_location_dest_id': location_dest_id}">
|
||||
<tree editable="bottom" decoration-succes="product_uom_qty==qty_done" decoration-danger="qty_done > product_uom_qty)">
|
||||
<field name="picking_id" invisible="1"/>
|
||||
<field name="product_id" invisible="1"/>
|
||||
@@ -195,12 +195,12 @@
|
||||
<field name="mode">primary</field>
|
||||
<field name="inherit_id" ref="stock.view_stock_move_operations"/>
|
||||
<field name="arch" type="xml">
|
||||
<field name="pack_operation_ids" position="before">
|
||||
<field name="move_line_ids" position="before">
|
||||
<field name="quantity_done" readonly="1"/>
|
||||
<field name="product_uom_qty" readonly="1"/>
|
||||
</field>
|
||||
<field name="pack_operation_ids" position="replace">
|
||||
<field name="pack_operation_nosuggest_ids" attrs="{'readonly': [('state', 'in', ('done', 'cancel'))]}" context="{'default_picking_id': picking_id, 'default_move_id': id, 'default_product_id': product_id, 'default_location_id': location_id, 'default_location_dest_id': location_dest_id}">
|
||||
<field name="move_line_ids" position="replace">
|
||||
<field name="move_line_nosuggest_ids" attrs="{'readonly': [('state', 'in', ('done', 'cancel'))]}" context="{'default_picking_id': picking_id, 'default_move_id': id, 'default_product_id': product_id, 'default_location_id': location_id, 'default_location_dest_id': location_dest_id}">
|
||||
<tree editable="bottom" decoration-succes="product_uom_qty==qty_done" decoration-danger="(product_uom_qty > 0) and (qty_done>product_uom_qty)">
|
||||
<field name="location_id" invisible="context.get('hide_source')" domain="[('id', 'child_of', parent.location_id)])" groups="stock.group_stock_multi_locations"/>
|
||||
<field name="package_id" groups="stock.group_tracking_lot" invisible="context.get('from_supplier')"/>
|
||||
|
||||
@@ -214,7 +214,7 @@
|
||||
<field name="picking_type_code" invisible="1"/>
|
||||
<button name="do_unreserve" string="Unreserve" groups="base.group_user" type="object" attrs="{'invisible': ['|', ('picking_type_code', '=', 'incoming'), ('state', 'not in', ('assigned', 'partially_available'))]}"/>
|
||||
<field name="show_operations" invisible="1"/>
|
||||
<field name="pack_operation_exist" invisible="1"/>
|
||||
<field name="move_line_exist" invisible="1"/>
|
||||
<field name="has_packages" invisible="1"/>
|
||||
<button name="button_scrap" type="object" string="Scrap" attrs="{'invisible': ['|', '&', ('picking_type_code', '!=', 'incoming'), ('state', 'in', ('draft', 'cancel', 'waiting')), '&', ('picking_type_code', '=', 'incoming'), ('state', '!=', 'done')]}"/>
|
||||
<field name="state" widget="statusbar" statusbar_visible="draft,confirmed,partially_available,assigned,done" />
|
||||
@@ -247,14 +247,14 @@
|
||||
<!--<label for="owner_id" groups="stock.group_tracking_owner"/>-->
|
||||
<div groups="stock.group_tracking_owner">
|
||||
<!--<field name="owner_id"/>-->
|
||||
<button name="action_assign_owner" string="Assign Owner" type="object" attrs="{'invisible': ['|',('pack_operation_exist', '=', False),('state', 'not in', ('draft','assigned','confirmed'))]}"
|
||||
<button name="action_assign_owner" string="Assign Owner" type="object" attrs="{'invisible': ['|',('move_line_exist', '=', False),('state', 'not in', ('draft','assigned','confirmed'))]}"
|
||||
class="oe_link oe_edit_only"/>
|
||||
</div>
|
||||
</group>
|
||||
</group>
|
||||
<notebook>
|
||||
<page string="Detailed Operations" attrs="{'invisible': ['|', '&', ('show_operations', '=', True), ('state', '=', 'draft'), ('show_operations', '=', False)]}">
|
||||
<field name="pack_operation_ids" context="{'default_picking_id': id, 'default_location_id': location_id, 'default_location_dest_id': location_dest_id}">
|
||||
<field name="move_line_ids" context="{'default_picking_id': id, 'default_location_id': location_id, 'default_location_dest_id': location_dest_id}">
|
||||
<tree editable="bottom" decoration-muted="result_package_id" decoration-danger="qty_done>product_uom_qty" decoration-success="qty_done==product_uom_qty and state!='done' and not result_package_id">
|
||||
<field name="product_id" required="1"/>
|
||||
<field name="product_uom_id" attrs="{'readonly': [('state', '!=', 'draft')]}" groups="product.group_uom"/>
|
||||
|
||||
@@ -29,8 +29,8 @@ class StockImmediateTransfer(models.TransientModel):
|
||||
if self.pick_id.state != 'assigned':
|
||||
raise UserError(_("Could not reserve all requested products. Please use the \'Mark as Todo\' button to handle the reservation manually."))
|
||||
for move in self.pick_id.move_lines:
|
||||
if move.pack_operation_ids:
|
||||
for move_line in move.pack_operation_ids:
|
||||
if move.move_line_ids:
|
||||
for move_line in move.move_line_ids:
|
||||
move_line.qty_done = move_line.product_uom_qty
|
||||
else:
|
||||
move.quantity_done = move.product_uom_qty
|
||||
|
||||
@@ -48,7 +48,7 @@ class ReturnPicking(models.TransientModel):
|
||||
if move.move_dest_ids:
|
||||
move_dest_exists = True
|
||||
quantity = move.product_qty - sum(move.move_dest_ids.filtered(lambda m: m.state in ['partially_available', 'assigned', 'done']).\
|
||||
mapped('pack_operation_ids').mapped('product_qty'))
|
||||
mapped('move_line_ids').mapped('product_qty'))
|
||||
product_return_moves.append((0, 0, {'product_id': move.product_id.id, 'quantity': quantity, 'move_id': move.id}))
|
||||
|
||||
if not product_return_moves:
|
||||
|
||||
@@ -50,12 +50,12 @@ class StockLocation(models.Model):
|
||||
"This has no effect for internal locations.")
|
||||
|
||||
|
||||
class StockPackOperation(models.Model):
|
||||
_inherit = 'stock.pack.operation'
|
||||
class StockMoveLine(models.Model):
|
||||
_inherit = 'stock.move.line'
|
||||
|
||||
@api.multi
|
||||
def write(self, vals):
|
||||
super(StockPackOperation, self).write(vals)
|
||||
super(StockMoveLine, self).write(vals)
|
||||
if 'qty_done' in vals:
|
||||
for move in self.mapped('move_id').filtered(lambda m: m.state == 'done'):
|
||||
move.value = move.quantity_done * move.price_unit
|
||||
|
||||
@@ -33,7 +33,7 @@ class TestStockValuation(TransactionCase):
|
||||
})
|
||||
move1.action_confirm()
|
||||
move1.action_assign()
|
||||
move1.pack_operation_ids.qty_done = 68.0
|
||||
move1.move_line_ids.qty_done = 68.0
|
||||
move1.action_done()
|
||||
|
||||
self.assertEqual(move1.value, 1020.0)
|
||||
@@ -53,7 +53,7 @@ class TestStockValuation(TransactionCase):
|
||||
})
|
||||
move2.action_confirm()
|
||||
move2.action_assign()
|
||||
move2.pack_operation_ids.qty_done = 140.0
|
||||
move2.move_line_ids.qty_done = 140.0
|
||||
move2.action_done()
|
||||
|
||||
self.assertEqual(move2.value, 2170.0)
|
||||
@@ -73,7 +73,7 @@ class TestStockValuation(TransactionCase):
|
||||
})
|
||||
move3.action_confirm()
|
||||
move3.action_assign()
|
||||
move3.pack_operation_ids.qty_done = 94.0
|
||||
move3.move_line_ids.qty_done = 94.0
|
||||
move3.action_done()
|
||||
|
||||
self.assertEqual(move3.price_unit, 0.0) # unused in out moves
|
||||
@@ -99,7 +99,7 @@ class TestStockValuation(TransactionCase):
|
||||
})
|
||||
move4.action_confirm()
|
||||
move4.action_assign()
|
||||
move4.pack_operation_ids.qty_done = 40.0
|
||||
move4.move_line_ids.qty_done = 40.0
|
||||
move4.action_done()
|
||||
|
||||
self.assertEqual(move4.value, 640.0)
|
||||
@@ -122,7 +122,7 @@ class TestStockValuation(TransactionCase):
|
||||
})
|
||||
move5.action_confirm()
|
||||
move5.action_assign()
|
||||
move5.pack_operation_ids.qty_done = 78.0
|
||||
move5.move_line_ids.qty_done = 78.0
|
||||
move5.action_done()
|
||||
|
||||
self.assertEqual(move5.value, 1287.0)
|
||||
@@ -145,7 +145,7 @@ class TestStockValuation(TransactionCase):
|
||||
})
|
||||
move6.action_confirm()
|
||||
move6.action_assign()
|
||||
move6.pack_operation_ids.qty_done = 116.0
|
||||
move6.move_line_ids.qty_done = 116.0
|
||||
move6.action_done()
|
||||
|
||||
# note: it' ll have to get 114 units from the move2 and 2 from move4
|
||||
@@ -171,7 +171,7 @@ class TestStockValuation(TransactionCase):
|
||||
})
|
||||
move7.action_confirm()
|
||||
move7.action_assign()
|
||||
move7.pack_operation_ids.qty_done = 62.0
|
||||
move7.move_line_ids.qty_done = 62.0
|
||||
move7.action_done()
|
||||
|
||||
# note: it' ll have to get 38 units from the move4 and 24 from move5
|
||||
@@ -203,7 +203,7 @@ class TestStockValuation(TransactionCase):
|
||||
})
|
||||
move1.action_confirm()
|
||||
move1.action_assign()
|
||||
move1.pack_operation_ids.qty_done = 10.0
|
||||
move1.move_line_ids.qty_done = 10.0
|
||||
move1.action_done()
|
||||
|
||||
self.assertEqual(move1.value, 1000.0)
|
||||
@@ -223,7 +223,7 @@ class TestStockValuation(TransactionCase):
|
||||
})
|
||||
move2.action_confirm()
|
||||
move2.action_assign()
|
||||
move2.pack_operation_ids.qty_done = 10.0
|
||||
move2.move_line_ids.qty_done = 10.0
|
||||
move2.action_done()
|
||||
|
||||
self.assertEqual(move2.value, 800.0)
|
||||
@@ -243,7 +243,7 @@ class TestStockValuation(TransactionCase):
|
||||
})
|
||||
move3.action_confirm()
|
||||
move3.action_assign()
|
||||
move3.pack_operation_ids.qty_done = 15.0
|
||||
move3.move_line_ids.qty_done = 15.0
|
||||
move3.action_done()
|
||||
|
||||
self.assertEqual(move3.price_unit, 0.0) # unused in out moves
|
||||
@@ -269,7 +269,7 @@ class TestStockValuation(TransactionCase):
|
||||
})
|
||||
move4.action_confirm()
|
||||
move4.action_assign()
|
||||
move4.pack_operation_ids.qty_done = 5.0
|
||||
move4.move_line_ids.qty_done = 5.0
|
||||
move4.action_done()
|
||||
|
||||
self.assertEqual(move4.value, 300.0)
|
||||
@@ -291,7 +291,7 @@ class TestStockValuation(TransactionCase):
|
||||
})
|
||||
move5.action_confirm()
|
||||
move5.action_assign()
|
||||
move5.pack_operation_ids.qty_done = 7.0
|
||||
move5.move_line_ids.qty_done = 7.0
|
||||
move5.action_done()
|
||||
|
||||
# note: it' ll have to get 5 units from the move2 and 2 from move4
|
||||
@@ -322,7 +322,7 @@ class TestStockValuation(TransactionCase):
|
||||
})
|
||||
move1.action_confirm()
|
||||
move1.action_assign()
|
||||
move1.pack_operation_ids.qty_done = 60.0
|
||||
move1.move_line_ids.qty_done = 60.0
|
||||
move1.action_done()
|
||||
|
||||
self.assertEqual(move1.value, 900.0)
|
||||
@@ -342,7 +342,7 @@ class TestStockValuation(TransactionCase):
|
||||
})
|
||||
move2.action_confirm()
|
||||
move2.action_assign()
|
||||
move2.pack_operation_ids.qty_done = 140.0
|
||||
move2.move_line_ids.qty_done = 140.0
|
||||
move2.action_done()
|
||||
|
||||
self.assertEqual(move2.value, 2170.0)
|
||||
@@ -359,7 +359,7 @@ class TestStockValuation(TransactionCase):
|
||||
})
|
||||
move3.action_confirm()
|
||||
move3.action_assign()
|
||||
move3.pack_operation_ids.qty_done = 190.0
|
||||
move3.move_line_ids.qty_done = 190.0
|
||||
move3.action_done()
|
||||
|
||||
self.assertEqual(move3.price_unit, 0.0) # unused in out moves
|
||||
@@ -379,7 +379,7 @@ class TestStockValuation(TransactionCase):
|
||||
})
|
||||
move4.action_confirm()
|
||||
move4.action_assign()
|
||||
move4.pack_operation_ids.qty_done = 70.0
|
||||
move4.move_line_ids.qty_done = 70.0
|
||||
move4.action_done()
|
||||
|
||||
self.assertEqual(move4.value, 1120.0)
|
||||
@@ -396,7 +396,7 @@ class TestStockValuation(TransactionCase):
|
||||
})
|
||||
move5.action_confirm()
|
||||
move5.action_assign()
|
||||
move5.pack_operation_ids.qty_done = 30.0
|
||||
move5.move_line_ids.qty_done = 30.0
|
||||
move5.action_done()
|
||||
|
||||
self.assertEqual(move5.value, -477.6)
|
||||
|
||||
@@ -72,7 +72,7 @@
|
||||
-
|
||||
Check one move line was created in Customers location with 200 pieces
|
||||
-
|
||||
!python {model: stock.pack.operation, id: False}: |
|
||||
!python {model: stock.move.line, id: False}: |
|
||||
move_line = self.search([('location_dest_id', '=', ref('stock.stock_location_customers')), ('product_id', '=', ref("drop_shop_product"))])
|
||||
assert move_line, 'No move line found'
|
||||
assert len(move_line.ids) == 1, 'There should be exactly one move line'
|
||||
|
||||
Reference in New Issue
Block a user