summaryrefslogtreecommitdiff
path: root/addons/purchase_stock/tests/test_move_cancel_propagation.py
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/purchase_stock/tests/test_move_cancel_propagation.py
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/purchase_stock/tests/test_move_cancel_propagation.py')
-rw-r--r--addons/purchase_stock/tests/test_move_cancel_propagation.py293
1 files changed, 293 insertions, 0 deletions
diff --git a/addons/purchase_stock/tests/test_move_cancel_propagation.py b/addons/purchase_stock/tests/test_move_cancel_propagation.py
new file mode 100644
index 00000000..111ba1e0
--- /dev/null
+++ b/addons/purchase_stock/tests/test_move_cancel_propagation.py
@@ -0,0 +1,293 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+from odoo.tests import tagged
+from .common import PurchaseTestCommon
+
+
+class TestMoveCancelPropagation(PurchaseTestCommon):
+
+ def setUp(self):
+ super(TestMoveCancelPropagation, self).setUp()
+ self.customer = self.env['res.partner'].create({'name': 'abc'})
+ self.group = self.env['procurement.group'].create({'partner_id': self.customer.id, 'name': 'New Group'})
+ self.warehouse = self.env.ref('stock.warehouse0')
+ cust_location = self.env.ref('stock.stock_location_customers')
+ seller = self.env['product.supplierinfo'].create({
+ 'name': self.customer.id,
+ 'price': 100.0,
+ })
+ product = self.env['product.product'].create({
+ 'name': 'Geyser',
+ 'type': 'product',
+ 'route_ids': [(4, self.route_mto), (4, self.route_buy)],
+ 'seller_ids': [(6, 0, [seller.id])],
+ })
+ self.picking_out = self.env['stock.picking'].create({
+ 'location_id': self.warehouse.out_type_id.default_location_src_id.id,
+ 'location_dest_id': cust_location.id,
+ 'partner_id': self.customer.id,
+ 'group_id': self.group.id,
+ 'picking_type_id': self.ref('stock.picking_type_out'),
+ })
+ self.move = self.env['stock.move'].create({
+ 'name': product.name,
+ 'product_id': product.id,
+ 'product_uom_qty': 10,
+ 'product_uom': product.uom_id.id,
+ 'picking_id': self.picking_out.id,
+ 'group_id': self.group.id,
+ 'location_id': self.warehouse.out_type_id.default_location_src_id.id,
+ 'location_dest_id': cust_location.id,
+ 'procure_method': 'make_to_order',
+ })
+
+ def test_01_cancel_draft_purchase_order_one_steps(self):
+ """ Check the picking and moves status related PO, When canceling purchase order
+ Ex.
+ 1) Set one steps of receiption and delivery on the warehouse.
+ 2) Create Delivery order with mto move and confirm the order, related RFQ should be generated.
+ 3) Cancel 'draft' purchase order should not cancel < Delivery >
+ """
+ self.warehouse.write({'delivery_steps': 'ship_only', 'reception_steps': 'one_step'})
+ self.picking_out.write({'location_id': self.warehouse.out_type_id.default_location_src_id.id})
+ self.move.write({'location_id': self.warehouse.out_type_id.default_location_src_id.id})
+ self.picking_out.action_confirm()
+
+ # Find PO related to picking.
+ purchase_order = self.env['purchase.order'].search([('partner_id', '=', self.customer.id)])
+
+ # Po should be create related picking.
+ self.assertTrue(purchase_order, 'No purchase order created.')
+
+ # Check status of Purchase Order
+ self.assertEqual(purchase_order.state, 'draft', "Purchase order should be in 'draft' state.")
+
+ # Cancel Purchase order.
+ purchase_order.button_cancel()
+
+ # Check the status of picking after canceling po.
+ self.assertNotEqual(self.picking_out.state, 'cancel')
+
+ def test_02_cancel_confirm_purchase_order_one_steps(self):
+ """ Check the picking and moves status related purchase order, When canceling purchase order
+ after confirming.
+ Ex.
+ 1) Set one steps of receiption and delivery on the warehouse.
+ 2) Create Delivery order with mto move and confirm the order, related RFQ should be generated.
+ 3) Cancel 'confirmed' purchase order, should cancel releted < Receiption >
+ but it should not cancel < Delivery > order.
+ """
+ self.warehouse.write({'delivery_steps': 'ship_only', 'reception_steps': 'one_step'})
+ self.picking_out.write({'location_id': self.warehouse.out_type_id.default_location_src_id.id})
+ self.move.write({'location_id': self.warehouse.out_type_id.default_location_src_id.id})
+ self.picking_out.action_confirm()
+
+ # Find PO related to picking.
+ purchase_order = self.env['purchase.order'].search([('partner_id', '=', self.customer.id)])
+ # Po should be create related picking.
+ self.assertTrue(purchase_order, 'No purchase order created.')
+
+ # Check status of Purchase Order
+ self.assertEqual(purchase_order.state, 'draft', "Purchase order should be in 'draft' state.")
+ purchase_order .button_confirm()
+ picking_in = purchase_order.picking_ids.filtered(lambda r: r.picking_type_id == self.warehouse.in_type_id)
+ # Cancel Purchase order.
+ purchase_order .button_cancel()
+
+ # Check the status of picking after canceling po.
+ self.assertEqual(picking_in.state, 'cancel')
+ self.assertNotEqual(self.picking_out.state, 'cancel')
+
+ def test_03_cancel_draft_purchase_order_two_steps(self):
+ """ Check the picking and moves status related PO, When canceling purchase order
+ in 'draft' state.
+ Ex.
+ 1) Set two steps of receiption and delivery on the warehouse.
+ 2) Create Delivery order with mto move and confirm the order, related RFQ should be generated.
+ 3) Cancel 'draft' purchase order should cancel < Input to Stock>
+ but it should not cancel < PICK, Delivery >
+ """
+ self.warehouse.write({'delivery_steps': 'pick_ship', 'reception_steps': 'two_steps'})
+ self.picking_out.write({'location_id': self.warehouse.out_type_id.default_location_src_id.id})
+ self.move.write({'location_id': self.warehouse.out_type_id.default_location_src_id.id})
+ self.picking_out.action_confirm()
+
+ # Find purchase order related to picking.
+ purchase_order = self.env['purchase.order'].search([('partner_id', '=', self.customer.id)])
+ # Purchase order should be created for picking.
+ self.assertTrue(purchase_order, 'No purchase order created.')
+
+ picking_ids = self.env['stock.picking'].search([('group_id', '=', self.group.id)])
+
+ internal = picking_ids.filtered(lambda r: r.picking_type_id == self.warehouse.int_type_id and r.group_id.id == self.group.id)
+ pick = picking_ids.filtered(lambda r: r.picking_type_id == self.warehouse.pick_type_id and r.group_id.id == self.group.id)
+
+ # Check status of Purchase Order
+ self.assertEqual(purchase_order.state, 'draft', "Purchase order should be in 'draft' state.")
+ # Cancel Purchase order.
+ purchase_order.button_cancel()
+
+ # Check the status of picking after canceling po.
+ for res in internal:
+ self.assertEqual(res.state, 'cancel')
+ self.assertNotEqual(pick.state, 'cancel')
+ self.assertNotEqual(self.picking_out.state, 'cancel')
+
+ def test_04_cancel_confirm_purchase_order_two_steps(self):
+ """ Check the picking and moves status related PO, When canceling purchase order
+ Ex.
+ 1) Set 2 steps of receiption and delivery on the warehouse.
+ 2) Create Delivery order with mto move and confirm the order, related RFQ should be generated.
+ 3) Cancel 'comfirm' purchase order should cancel releted < Receiption Picking IN, INT>
+ not < PICK, SHIP >
+ """
+ self.warehouse.write({'delivery_steps': 'pick_ship', 'reception_steps': 'two_steps'})
+ self.picking_out.write({'location_id': self.warehouse.out_type_id.default_location_src_id.id})
+ self.move.write({'location_id': self.warehouse.out_type_id.default_location_src_id.id})
+ self.picking_out.action_confirm()
+
+ # Find PO related to picking.
+ purchase_order = self.env['purchase.order'].search([('partner_id', '=', self.customer.id)])
+ # Po should be create related picking.
+ self.assertTrue(purchase_order, 'purchase order is created.')
+
+ picking_ids = self.env['stock.picking'].search([('group_id', '=', self.group.id)])
+
+ internal = picking_ids.filtered(lambda r: r.picking_type_id == self.warehouse.int_type_id)
+ pick = picking_ids.filtered(lambda r: r.picking_type_id == self.warehouse.pick_type_id)
+
+ # Check status of Purchase Order
+ self.assertEqual(purchase_order.state, 'draft', "Purchase order should be in 'draft' state.")
+
+ purchase_order.button_confirm()
+ picking_in = purchase_order.picking_ids.filtered(lambda r: r.picking_type_id == self.warehouse.in_type_id)
+ # Cancel Purchase order.
+ purchase_order.button_cancel()
+
+ # Check the status of picking after canceling po.
+ self.assertEqual(picking_in.state, 'cancel')
+ for res in internal:
+ self.assertEqual(res.state, 'cancel')
+ self.assertNotEqual(pick.state, 'cancel')
+ self.assertNotEqual(self.picking_out.state, 'cancel')
+
+ def test_05_cancel_draft_purchase_order_three_steps(self):
+ """ Check the picking and moves status related PO, When canceling purchase order
+ Ex.
+ 1) Set 3 steps of receiption and delivery on the warehouse.
+ 2) Create Delivery order with mto move and confirm the order, related RFQ should be generated.
+ 3) Cancel 'draft' purchase order should cancel releted < Receiption Picking IN>
+ not < PICK, PACK, SHIP >
+ """
+ self.warehouse.write({'delivery_steps': 'pick_pack_ship', 'reception_steps': 'three_steps'})
+ self.picking_out.write({'location_id': self.warehouse.out_type_id.default_location_src_id.id})
+ self.move.write({'location_id': self.warehouse.out_type_id.default_location_src_id.id})
+ self.picking_out.action_confirm()
+
+ # Find PO related to picking.
+ purchase_order = self.env['purchase.order'].search([('partner_id', '=', self.customer.id)])
+ # Po should be create related picking.
+ self.assertTrue(purchase_order, 'No purchase order created.')
+
+ picking_ids = self.env['stock.picking'].search([('group_id', '=', self.group.id)])
+
+ internal = picking_ids.filtered(lambda r: r.picking_type_id == self.warehouse.int_type_id)
+ pick = picking_ids.filtered(lambda r: r.picking_type_id == self.warehouse.pick_type_id)
+ pack = picking_ids.filtered(lambda r: r.picking_type_id == self.warehouse.pack_type_id)
+
+ # Check status of Purchase Order
+ self.assertEqual(purchase_order.state, 'draft', "Purchase order should be in 'draft' state.")
+ # Cancel Purchase order.
+ purchase_order.button_cancel()
+
+ # Check the status of picking after canceling po.
+ for res in internal:
+ self.assertEqual(res.state, 'cancel')
+ self.assertNotEqual(pick.state, 'cancel')
+ self.assertNotEqual(pack.state, 'cancel')
+ self.assertNotEqual(self.picking_out.state, 'cancel')
+
+ def test_06_cancel_confirm_purchase_order_three_steps(self):
+ """ Check the picking and moves status related PO, When canceling purchase order
+ Ex.
+ 1) Set 3 steps of receiption and delivery on the warehouse.
+ 2) Create Delivery order with mto move and confirm the order, related RFQ should be generated.
+ 3) Cancel 'comfirm' purchase order should cancel releted < Receiption Picking IN, INT>
+ not < PICK, PACK, SHIP >
+ """
+ self.warehouse.write({'delivery_steps': 'pick_pack_ship', 'reception_steps': 'three_steps'})
+ self.picking_out.write({'location_id': self.warehouse.out_type_id.default_location_src_id.id})
+ self.move.write({'location_id': self.warehouse.out_type_id.default_location_src_id.id})
+ self.picking_out.action_confirm()
+
+ # Find PO related to picking.
+ purchase_order = self.env['purchase.order'].search([('partner_id', '=', self.customer.id)])
+ # Po should be create related picking.
+ self.assertTrue(purchase_order, 'No purchase order created.')
+
+ picking_ids = self.env['stock.picking'].search([('group_id', '=', self.group.id)])
+
+ internal = picking_ids.filtered(lambda r: r.picking_type_id == self.warehouse.int_type_id)
+ pick = picking_ids.filtered(lambda r: r.picking_type_id == self.warehouse.pick_type_id)
+ pack = picking_ids.filtered(lambda r: r.picking_type_id == self.warehouse.pack_type_id)
+
+ # Check status of Purchase Order
+ self.assertEqual(purchase_order.state, 'draft', "Purchase order should be in 'draft' state.")
+
+ purchase_order.button_confirm()
+ picking_in = purchase_order.picking_ids.filtered(lambda r: r.picking_type_id == self.warehouse.in_type_id)
+ # Cancel Purchase order.
+ purchase_order.button_cancel()
+
+ # Check the status of picking after canceling po.
+ self.assertEqual(picking_in.state, 'cancel')
+ for res in internal:
+ self.assertEqual(res.state, 'cancel')
+ self.assertNotEqual(pick.state, 'cancel')
+ self.assertNotEqual(pack.state, 'cancel')
+ self.assertNotEqual(self.picking_out.state, 'cancel')
+
+ def test_cancel_move_lines_operation(self):
+ """Check for done and cancelled moves. Ensure that the RFQ cancellation
+ will not impact the delivery state if it's already cancelled.
+ """
+ stock_location = self.env['ir.model.data'].xmlid_to_object('stock.stock_location_stock')
+ customer_location = self.env['ir.model.data'].xmlid_to_object('stock.stock_location_customers')
+ picking_type_out = self.env['ir.model.data'].xmlid_to_object('stock.picking_type_out')
+
+ partner = self.env['res.partner'].create({
+ 'name': 'Steve'
+ })
+ seller = self.env['product.supplierinfo'].create({
+ 'name': partner.id,
+ 'price': 10.0,
+ })
+ product_car = self.env['product.product'].create({
+ 'name': 'Car',
+ 'type': 'product',
+ 'route_ids': [(4, self.ref('stock.route_warehouse0_mto')), (4, self.ref('purchase_stock.route_warehouse0_buy'))],
+ 'seller_ids': [(6, 0, [seller.id])],
+ 'categ_id': self.env.ref('product.product_category_all').id,
+ })
+ customer_picking = self.env['stock.picking'].create({
+ 'location_id': stock_location.id,
+ 'location_dest_id': customer_location.id,
+ 'partner_id': partner.id,
+ 'picking_type_id': picking_type_out.id,
+ })
+ customer_move = self.env['stock.move'].create({
+ 'name': 'move out',
+ 'location_id': stock_location.id,
+ 'location_dest_id': customer_location.id,
+ 'product_id': product_car.id,
+ 'product_uom': product_car.uom_id.id,
+ 'product_uom_qty': 10.0,
+ 'procure_method': 'make_to_order',
+ 'picking_id': customer_picking.id,
+ })
+ customer_move._action_confirm()
+ purchase_order = self.env['purchase.order'].search([('partner_id', '=', partner.id)])
+ customer_move._action_cancel()
+ self.assertEqual(customer_move.state, 'cancel', 'Move should be cancelled')
+ purchase_order.button_cancel()
+ self.assertEqual(customer_move.state, 'cancel', 'State of cancelled and done moves should not change.')