forked from erp-dev/erp
feat: payment order and receipt order
This commit is contained in:
@@ -374,6 +374,105 @@ class SalesOrderServiceTestCase(TestCase):
|
||||
item = sales_order.items.first()
|
||||
self.assertEqual(item.consume_detail_ids, '1,2')
|
||||
|
||||
def test_sales_order_outgoing_missing_consume_ids_raises(self):
|
||||
payload = [{
|
||||
'product_id': self.product.id,
|
||||
'quantity': 30,
|
||||
'price': '25',
|
||||
'unit': '米',
|
||||
}]
|
||||
with self.assertRaises(ValueError):
|
||||
services.create_sales_order(
|
||||
merchant=self.merchant,
|
||||
customer=self.customer,
|
||||
order_date=timezone.now().date(),
|
||||
warehouse=self.warehouse_strict_out,
|
||||
operator=self.operator,
|
||||
items=payload,
|
||||
created_by=self.user,
|
||||
)
|
||||
|
||||
|
||||
class PaymentReceiptServiceTestCase(TestCase):
|
||||
def setUp(self):
|
||||
(
|
||||
self.merchant,
|
||||
self.supplier,
|
||||
self.warehouse_strict,
|
||||
self.warehouse_relaxed,
|
||||
self.product,
|
||||
self.operator,
|
||||
) = create_basic_fixtures()
|
||||
self.customer = basic_models.Customer.objects.create(
|
||||
merchant=self.merchant,
|
||||
name='客户B',
|
||||
mobile='13888888888',
|
||||
created_by=None,
|
||||
)
|
||||
|
||||
def test_create_payment_order_and_approve(self):
|
||||
order = services.create_payment_order(
|
||||
merchant=self.merchant,
|
||||
supplier=self.supplier,
|
||||
payment_date=timezone.now().date(),
|
||||
amount='120.50',
|
||||
operator=self.operator,
|
||||
remarks='付款测试',
|
||||
)
|
||||
self.assertEqual(order.status, business_models.PaymentOrderStatusEnum.PENDING)
|
||||
reviewed = services.review_payment_order(
|
||||
payment_order=order,
|
||||
target_status=business_models.PaymentOrderStatusEnum.APPROVED,
|
||||
reviewed_by=self.operator,
|
||||
)
|
||||
self.assertEqual(reviewed.status, business_models.PaymentOrderStatusEnum.APPROVED)
|
||||
|
||||
def test_create_receipt_order_and_cancel(self):
|
||||
order = services.create_receipt_order(
|
||||
merchant=self.merchant,
|
||||
customer=self.customer,
|
||||
receipt_date=timezone.now().date(),
|
||||
amount='80.00',
|
||||
operator=self.operator,
|
||||
remarks='收款测试',
|
||||
)
|
||||
cancelled = services.review_receipt_order(
|
||||
receipt_order=order,
|
||||
target_status=business_models.ReceiptOrderStatusEnum.CANCELLED,
|
||||
reviewed_by=self.operator,
|
||||
)
|
||||
self.assertEqual(cancelled.status, business_models.ReceiptOrderStatusEnum.CANCELLED)
|
||||
|
||||
def test_payment_amount_must_be_positive(self):
|
||||
with self.assertRaises(ValueError):
|
||||
services.create_payment_order(
|
||||
merchant=self.merchant,
|
||||
supplier=self.supplier,
|
||||
payment_date=timezone.now().date(),
|
||||
amount='-1',
|
||||
operator=self.operator,
|
||||
)
|
||||
|
||||
def test_receipt_approval_is_idempotent(self):
|
||||
order = services.create_receipt_order(
|
||||
merchant=self.merchant,
|
||||
customer=self.customer,
|
||||
receipt_date=timezone.now().date(),
|
||||
amount='10',
|
||||
operator=self.operator,
|
||||
)
|
||||
services.review_receipt_order(
|
||||
receipt_order=order,
|
||||
target_status=business_models.ReceiptOrderStatusEnum.APPROVED,
|
||||
reviewed_by=self.operator,
|
||||
)
|
||||
reviewed_again = services.review_receipt_order(
|
||||
receipt_order=order,
|
||||
target_status=business_models.ReceiptOrderStatusEnum.APPROVED,
|
||||
reviewed_by=self.operator,
|
||||
)
|
||||
self.assertEqual(reviewed_again.status, business_models.ReceiptOrderStatusEnum.APPROVED)
|
||||
|
||||
|
||||
class PurchaseOrderStockServiceTestCase(TestCase):
|
||||
def setUp(self):
|
||||
@@ -463,6 +562,36 @@ class SalesOrderStockServiceTestCase(TestCase):
|
||||
self.assertEqual(payload['sales_order_id'], self.sales_order.id)
|
||||
self.assertEqual(payload['stock_change_record_id'], 654)
|
||||
|
||||
def test_service_calls_stock_out_strict_mode(self):
|
||||
strict_order = business_models.SalesOrder.objects.create(
|
||||
merchant=self.merchant,
|
||||
customer=self.customer,
|
||||
sales_date=timezone.now().date(),
|
||||
operator=self.operator,
|
||||
warehouse=self.warehouse_strict_out,
|
||||
)
|
||||
consume_items = [{'product_id': self.product.id, 'consume_detail_ids': [11, 12], 'quantity': 50}]
|
||||
with patch('business.services.StockFlowService') as mock_flow_cls:
|
||||
mock_instance = mock_flow_cls.return_value
|
||||
mock_instance.stock_out.return_value = (MagicMock(id=987), [], 2)
|
||||
|
||||
payload = services.create_sales_order_stock_entries_sync(
|
||||
sales_order_id=strict_order.id,
|
||||
warehouse_id=self.warehouse_strict_out.id,
|
||||
items=consume_items,
|
||||
created_by_id=self.user.id,
|
||||
)
|
||||
|
||||
mock_flow_cls.assert_called_once_with(merchant=self.merchant, created_by=self.user)
|
||||
mock_instance.stock_out.assert_called_once_with(
|
||||
warehouse_id=self.warehouse_strict_out.id,
|
||||
source_type=stock_models.StockChangeSourceEnum.SALES,
|
||||
source_id=strict_order.id,
|
||||
items=[{'product_id': self.product.id, 'consume_detail_ids': [11, 12], 'quantity': 50}],
|
||||
)
|
||||
self.assertEqual(payload['sales_order_id'], strict_order.id)
|
||||
self.assertEqual(payload['stock_change_record_id'], 987)
|
||||
|
||||
|
||||
@override_settings(
|
||||
CELERY_TASK_ALWAYS_EAGER=True,
|
||||
|
||||
Reference in New Issue
Block a user