1
0
forked from erp-dev/erp

feat: red flush and cost

This commit is contained in:
2026-06-22 22:27:28 +08:00
parent 9a1c92febf
commit 70b3a0d246
25 changed files with 1375 additions and 20 deletions

View File

@@ -224,8 +224,10 @@ class PurchaseOrderAPITestCase(TestCase):
self.assertIn('id', response.data)
self.assertIn('human_id', response.data)
self.assertEqual(response.data['status'], 1)
self.assertEqual(response.data['balance_before_snapshot'], Decimal('0'))
self.assertIn('等待审批', response.data['message'])
order = business_models.PurchaseOrder.objects.get(id=response.data['id'])
self.assertEqual(order.balance_before_snapshot, Decimal('0'))
expected_human_id = f"CG{order.created_at.strftime('%Y%m%d')}{order.id:06d}"
self.assertEqual(response.data['human_id'], expected_human_id)
mock_delay.assert_not_called()
@@ -499,6 +501,8 @@ class SalesOrderAPITestCase(TestCase):
expected_human_id = f"XS{order.created_at.strftime('%Y%m%d')}{order.id:06d}"
self.assertEqual(response.data['human_id'], expected_human_id)
self.assertEqual(response.data['status'], business_models.SalesOrderStatusEnum.PENDING)
self.assertEqual(response.data['balance_before_snapshot'], Decimal('0'))
self.assertEqual(order.balance_before_snapshot, Decimal('0'))
mock_delay.assert_not_called()
def test_create_sales_order_invalid_customer(self):
@@ -726,7 +730,9 @@ class PurchaseReturnOrderAPITestCase(TestCase):
self.assertIn('id', response.data)
self.assertIn('human_id', response.data)
self.assertEqual(response.data['status'], business_models.PurchaseReturnStatusEnum.PENDING)
self.assertEqual(response.data['balance_before_snapshot'], Decimal('0'))
order = business_models.PurchaseReturnOrder.objects.get(id=response.data['id'])
self.assertEqual(order.balance_before_snapshot, Decimal('0'))
expected_human_id = f"CT{order.created_at.strftime('%Y%m%d')}{order.id:06d}"
self.assertEqual(response.data['human_id'], expected_human_id)
@@ -880,7 +886,9 @@ class SalesReturnOrderAPITestCase(TestCase):
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertIn('human_id', response.data)
self.assertEqual(response.data['status'], business_models.SalesReturnStatusEnum.PENDING)
self.assertEqual(response.data['balance_before_snapshot'], Decimal('0'))
order = business_models.SalesReturnOrder.objects.get(id=response.data['id'])
self.assertEqual(order.balance_before_snapshot, Decimal('0'))
expected_human_id = f"XT{order.created_at.strftime('%Y%m%d')}{order.id:06d}"
self.assertEqual(response.data['human_id'], expected_human_id)
@@ -1462,6 +1470,43 @@ class BusinessRedFlushAPITestCase(TestCase):
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertTrue(response.data['is_red_flushed'])
def test_sales_order_red_flush_without_stock_success(self):
order = services.create_sales_order(
merchant=self.merchant,
customer=self.customer,
order_date=datetime.date(2025, 11, 26),
warehouse=self.warehouse,
operator=self.employee,
items=self._items(quantity='8', price='7'),
)
services.review_sales_order(
sales_order=order,
target_status=business_models.SalesOrderStatusEnum.APPROVED,
reviewed_by=self.user,
)
response = self.client.post(
f'/api/v1/sales-orders/{order.id}/red-flush/',
{'reason': '销售无库存红冲'},
format='json',
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertTrue(response.data['is_red_flushed'])
order.refresh_from_db()
self.assertTrue(order.is_red_flushed)
self.assertEqual(
business_models.BalanceChangeRecord.objects.filter(
source_type=business_models.BalanceChangeSourceEnum.SALES_ORDER,
source_id=order.id,
red_flush_id=order.red_flush_id,
).count(),
2,
)
self.assertFalse(
stock_models.StockChangeRecord.objects.filter(red_flush_id=order.red_flush_id).exists()
)
def test_purchase_return_order_red_flush_success(self):
order = self._create_approved_purchase_return_order()
response = self.client.post(