diff --git a/src/budy/models/order.py b/src/budy/models/order.py index 8a73507..37e2946 100644 --- a/src/budy/models/order.py +++ b/src/budy/models/order.py @@ -975,6 +975,7 @@ def mark_paid_s(self): def unmark_paid_s(self): self.status = "waiting_payment" self.paid = False + self.increment_inventory_s() self.save() @appier.operation(name = "Mark Invoiced") @@ -1084,6 +1085,22 @@ def decrement_inventory_s(self, force = False): self.inventory_decremented = True self.save() + @appier.operation( + name = "Increment Inventory", + description = """Increments the inventory stock levels + according to order lines (reverses the decrement stock + operation, restoring the stock back)""", + parameters = (("Force", "force", bool, False),), + level = 2 + ) + def increment_inventory_s(self, force = False): + if not self.inventory_decremented and not force: return + for line in self.lines: + line.merchandise.quantity_hand += line.quantity + line.merchandise.save() + self.inventory_decremented = False + self.save() + @appier.operation( name = "Import Omni", parameters = ( diff --git a/src/budy/test/order.py b/src/budy/test/order.py index 0dee17d..be8066b 100644 --- a/src/budy/test/order.py +++ b/src/budy/test/order.py @@ -60,7 +60,8 @@ def test_basic(self): product = budy.Product( short_description = "product", gender = "Male", - price = 10.0 + price = 10.0, + quantity_hand = 5.0 ) product.save() @@ -79,6 +80,7 @@ def test_basic(self): self.assertEqual(order.currency, None) self.assertEqual(order.total >= 0.0, True) self.assertEqual(order.paid, False) + self.assertEqual(order.inventory_decremented, False) self.assertEqual(order.date, None) self.assertEqual(order.notifications, []) @@ -137,11 +139,17 @@ def test_basic(self): self.assertEqual(order.status, "waiting_payment") self.assertEqual(order.paid, False) + self.assertEqual(order.inventory_decremented, False) order.mark_paid_s() self.assertEqual(order.status, "paid") self.assertEqual(order.paid, True) + self.assertEqual(order.inventory_decremented, True) + + product = product.reload() + + self.assertEqual(product.quantity_hand, 3) self.assertRaises(appier.AssertionError, order.mark_paid_s) @@ -390,6 +398,7 @@ def _pay_dummy(payment_data): self.assertEqual(order.is_valid(), True) self.assertEqual(order_line.is_valid_quantity(), True) self.assertEqual(order.paid, False) + self.assertEqual(order.inventory_decremented, False) self.assertEqual(order.status, "waiting_payment") self.assertRaises( @@ -404,7 +413,8 @@ def test_voucher_use(self): product = budy.Product( short_description = "product", gender = "Male", - price = 10.0 + price = 10.0, + quantity_hand = 5.0 ) product.save() @@ -453,6 +463,7 @@ def test_voucher_use(self): self.assertEqual(order.is_valid(), True) self.assertEqual(order_line.is_valid_quantity(), True) self.assertEqual(order.paid, False) + self.assertEqual(order.inventory_decremented, False) self.assertEqual(order.status, "waiting_payment") order.end_pay_s( @@ -470,6 +481,11 @@ def test_voucher_use(self): self.assertEqual(order_line.is_valid_quantity(), True) self.assertEqual(order.paid, True) self.assertEqual(order.status, "paid") + self.assertEqual(order.inventory_decremented, True) + + product = product.reload() + + self.assertEqual(product.quantity_hand, 3.0) order.date = None order.status = "created" @@ -494,6 +510,7 @@ def test_voucher_use(self): self.assertEqual(order.is_valid(), True) self.assertEqual(order_line.is_valid_quantity(), True) self.assertEqual(order.paid, False) + self.assertEqual(order.inventory_decremented, False) self.assertEqual(order.status, "waiting_payment") order.cancel_s() @@ -509,6 +526,7 @@ def test_voucher_use(self): self.assertEqual(order.is_valid(), True) self.assertEqual(order_line.is_valid_quantity(), True) self.assertEqual(order.paid, False) + self.assertEqual(order.inventory_decremented, False) self.assertEqual(order.status, "canceled") order.date = None @@ -539,8 +557,13 @@ def test_voucher_use(self): self.assertEqual(order.is_valid(), True) self.assertEqual(order_line.is_valid_quantity(), True) self.assertEqual(order.paid, True) + self.assertEqual(order.inventory_decremented, True) self.assertEqual(order.status, "paid") + product = product.reload() + + self.assertEqual(product.quantity_hand, 3.0) + order.cancel_s() voucher = voucher.reload() @@ -554,6 +577,7 @@ def test_voucher_use(self): self.assertEqual(order.is_valid(), True) self.assertEqual(order_line.is_valid_quantity(), True) self.assertEqual(order.paid, True) + self.assertEqual(order.inventory_decremented, True) self.assertEqual(order.status, "canceled") def test_discount(self): @@ -931,7 +955,8 @@ def test_free(self): product = budy.Product( short_description = "product", gender = "Male", - price = 10.0 + price = 10.0, + quantity_hand = 5.0 ) product.save() @@ -972,6 +997,7 @@ def test_free(self): self.assertEqual(order.payable, 0.0) self.assertEqual(order.discountable, 20.0) self.assertEqual(order.paid, False) + self.assertEqual(order.inventory_decremented, False) self.assertEqual(isinstance(order.sub_total, commons.Decimal), True) self.assertEqual(isinstance(order.discount, commons.Decimal), True) self.assertEqual(isinstance(order.total, commons.Decimal), True) @@ -986,6 +1012,7 @@ def test_free(self): self.assertEqual(order.payable, 0.0) self.assertEqual(order.discountable, 20.0) self.assertEqual(order.paid, True) + self.assertEqual(order.inventory_decremented, True) self.assertEqual(order.payment_data, {}) self.assertEqual(isinstance(order.sub_total, commons.Decimal), True) self.assertEqual(isinstance(order.discount, commons.Decimal), True) @@ -993,6 +1020,10 @@ def test_free(self): self.assertEqual(isinstance(order.payable, commons.Decimal), True) self.assertEqual(isinstance(order.discountable, commons.Decimal), True) + product = product.reload() + + self.assertEqual(product.quantity_hand, 3.0) + def test_closed(self): order = budy.Order() order.save() @@ -1034,7 +1065,8 @@ def test_payment_method(self): product = budy.Product( short_description = "product", gender = "Male", - price = 10.0 + price = 10.0, + quantity_hand = 5.0 ) product.save() @@ -1067,6 +1099,7 @@ def test_payment_method(self): self.assertEqual(order.is_valid(), True) self.assertEqual(order_line.is_valid_quantity(), True) self.assertEqual(order.paid, False) + self.assertEqual(order.inventory_decremented, False) self.assertEqual(order.status, "created") self.assertRaises( @@ -1082,6 +1115,7 @@ def test_payment_method(self): self.assertEqual(order.is_valid(), True) self.assertEqual(order_line.is_valid_quantity(), True) self.assertEqual(order.paid, False) + self.assertEqual(order.inventory_decremented, False) self.assertEqual(order.status, "waiting_payment") self.assertRaises( @@ -1099,8 +1133,13 @@ def test_payment_method(self): self.assertEqual(order.is_valid(), True) self.assertEqual(order_line.is_valid_quantity(), True) self.assertEqual(order.paid, True) + self.assertEqual(order.inventory_decremented, True) self.assertEqual(order.status, "paid") + product = product.reload() + + self.assertEqual(product.quantity_hand, 3.0) + def test__build_notes(self): product = budy.Product( short_description = "product",