- Stock manager can only test whole process related to Shipment, so we check data with stock manager. - !context uid: 'res_users_stock_manager' - I confirm incomming move of 50 kgm Ice-cream - !python {model: stock.move}: | incomming_move = self.browse(cr, uid, ref("incomming_shipment_icecream")) self.action_confirm(cr, uid, [incomming_move.id]) - I receive 40kgm Ice-cream so It will make backorder of incomming shipment for 10 kgm. - !python {model: stock.picking}: | pick = self.browse(cr, uid, ref("incomming_shipment"), context=context) self.pool.get('stock.pack.operation').create(cr, uid, { 'picking_id': pick.id, 'product_id': ref('product_icecream'), 'product_uom_id': ref('product.product_uom_kgm'), 'product_qty': 40 }) context.update({'active_model': 'stock.picking', 'active_id': ref('incomming_shipment'), 'active_ids': [ref('incomming_shipment')]}) pick.do_transfer(context=context) - I check backorder shipment after received partial shipment and check remaining shipment. - !python {model: stock.picking}: | shipment = self.browse(cr, uid, ref("incomming_shipment")) for move_line in shipment.move_lines: assert move_line.product_qty == 40, "Qty in shipment does not correspond." assert move_line.state == 'done', "Move line of shipment should be closed." backorder_id = self.search(cr, uid, [('backorder_id', '=', ref("incomming_shipment"))],context=context) backorder = self.browse(cr, uid, backorder_id)[0] for move_line in backorder.move_lines: assert move_line.product_qty == 10, "Qty in backorder does not correspond." assert (move_line.state == 'assigned' or move_line.state == 'waiting' or move_line.state == 'confirmed'), "Move line of backorder should be assigned, confirmed or waiting." context.update({'active_model': 'stock.picking', 'active_id': backorder_id[0], 'active_ids': backorder_id}) - I receive the remaining 10kgm Ice-cream from the backorder. - !python {model: stock.picking}: | backorder_id = self.search(cr, uid, [('backorder_id', '=', ref("incomming_shipment"))],context=context) backorder = self.browse(cr, uid, backorder_id)[0] self.pool.get('stock.pack.operation').create(cr, uid, { 'picking_id': backorder.id, 'product_id': ref('product_icecream'), 'product_uom_id': ref('product.product_uom_kgm'), 'product_qty': 10 }) backorder.do_transfer(context=context) - I check incomming shipment after reception. - !python {model: stock.picking}: | shipment = self.browse(cr, uid, self.search(cr, uid, [('backorder_id', '=', ref("incomming_shipment"))]))[0] assert shipment.state == 'done', "shipment should be close after received." for move_line in shipment.move_lines: assert move_line.state == 'done', "Move line should be closed."