1
0
forked from erp-dev/erp

feat: payment order and receipt order

This commit is contained in:
2025-11-30 21:52:36 +08:00
parent ce1954ad58
commit 9006a530d1
12 changed files with 900 additions and 12 deletions

View File

@@ -11,6 +11,7 @@ from rest_framework import status
from basic_info.models import (
Customer,
Employee,
EmployeeStatusEnum,
Merchant,
MerchantTypeEnum,
Product,
@@ -450,6 +451,124 @@ class SalesOrderAPITestCase(TestCase):
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
order = business_models.SalesOrder.objects.get(id=order_id)
self.assertEqual(order.status, business_models.SalesOrderStatusEnum.PENDING)
class PaymentOrderAPITestCase(TestCase):
def setUp(self):
self.merchant = Merchant.objects.create(name='付款商户', type=MerchantTypeEnum.FACTORY)
self.supplier = Supplier.objects.create(merchant=self.merchant, name='付款供应商')
self.user = User.objects.create_user(username='pay_user', password='pass123')
self.employee = Employee.objects.create(
merchant=self.merchant,
sys_user=self.user,
name='财务',
status=EmployeeStatusEnum.ACTIVE,
)
self.client = APIClient()
self.client.force_authenticate(user=self.user)
self.payload = {
'supplier': self.supplier.id,
'payment_date': '2025-11-26',
'amount': '120.5',
'remarks': '付款备注',
}
def test_create_payment_order_success(self):
response = self.client.post('/api/v1/payment-orders/', self.payload, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertIn('id', response.data)
def test_create_payment_order_invalid_supplier(self):
payload = {**self.payload, 'supplier': 999}
response = self.client.post('/api/v1/payment-orders/', payload, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_review_payment_order(self):
resp = self.client.post('/api/v1/payment-orders/', self.payload, format='json')
order_id = resp.data['id']
response = self.client.post(f'/api/v1/payment-orders/{order_id}/review/', {'action': 'approve'}, format='json')
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data['status'], business_models.PaymentOrderStatusEnum.APPROVED)
response_cancel = self.client.post(
f'/api/v1/payment-orders/{order_id}/review/',
{'action': 'cancel'},
format='json',
)
self.assertEqual(response_cancel.status_code, status.HTTP_200_OK)
self.assertEqual(response_cancel.data['status'], business_models.PaymentOrderStatusEnum.CANCELLED)
def test_payment_order_requires_amount(self):
payload = {**self.payload}
payload.pop('amount')
response = self.client.post('/api/v1/payment-orders/', payload, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertIn('缺少 amount', response.data['error'])
def test_payment_order_amount_must_be_positive(self):
payload = {**self.payload, 'amount': '0'}
response = self.client.post('/api/v1/payment-orders/', payload, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertIn('amount 必须大于 0', response.data['error'])
class ReceiptOrderAPITestCase(TestCase):
def setUp(self):
self.merchant = Merchant.objects.create(name='收款商户', type=MerchantTypeEnum.FACTORY)
self.customer = Customer.objects.create(
merchant=self.merchant,
name='客户C',
mobile='13812345678',
created_by=None,
)
self.user = User.objects.create_user(username='receipt_user', password='pass123')
self.employee = Employee.objects.create(
merchant=self.merchant,
sys_user=self.user,
name='财务员',
status=EmployeeStatusEnum.ACTIVE,
)
self.client = APIClient()
self.client.force_authenticate(user=self.user)
self.payload = {
'customer': self.customer.id,
'receipt_date': '2025-11-26',
'amount': '88.00',
'remarks': '收款备注',
}
def test_create_receipt_order_success(self):
response = self.client.post('/api/v1/receipt-orders/', self.payload, format='json')
self.assertEqual(response.status_code, status.HTTP_201_CREATED)
self.assertIn('id', response.data)
def test_create_receipt_order_invalid_customer(self):
payload = {**self.payload, 'customer': 999}
response = self.client.post('/api/v1/receipt-orders/', payload, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
def test_review_receipt_order(self):
resp = self.client.post('/api/v1/receipt-orders/', self.payload, format='json')
order_id = resp.data['id']
response = self.client.post(
f'/api/v1/receipt-orders/{order_id}/review/',
{'action': 'cancel'},
format='json',
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertEqual(response.data['status'], business_models.ReceiptOrderStatusEnum.CANCELLED)
def test_receipt_order_requires_amount(self):
payload = {**self.payload}
payload.pop('amount')
response = self.client.post('/api/v1/receipt-orders/', payload, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertIn('缺少 amount', response.data['error'])
def test_receipt_order_amount_must_be_positive(self):
payload = {**self.payload, 'amount': '0'}
response = self.client.post('/api/v1/receipt-orders/', payload, format='json')
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
self.assertIn('amount 必须大于 0', response.data['error'])
@override_settings(
CELERY_TASK_ALWAYS_EAGER=True,
CELERY_TASK_EAGER_PROPAGATES=True,