forked from erp-dev/erp
feat: add discount_amount to payment_order and receipt_order, and change total_amount logic
This commit is contained in:
@@ -704,6 +704,11 @@ class PaymentReceiptServiceTestCase(TestCase):
|
||||
mobile='13888888888',
|
||||
created_by=None,
|
||||
)
|
||||
self.bank_account = basic_models.BankAccount.objects.create(
|
||||
merchant=self.merchant,
|
||||
name='测试账户',
|
||||
auto_number='BANK-SVC',
|
||||
)
|
||||
|
||||
def test_create_payment_order_and_approve(self):
|
||||
order = services.create_payment_order(
|
||||
@@ -711,10 +716,17 @@ class PaymentReceiptServiceTestCase(TestCase):
|
||||
supplier=self.supplier,
|
||||
payment_date=timezone.now().date(),
|
||||
amount='120.50',
|
||||
discount_amount='20.50',
|
||||
operator=self.operator,
|
||||
remarks='付款测试',
|
||||
bank_account=self.bank_account,
|
||||
markup='服务层附言',
|
||||
)
|
||||
self.assertEqual(order.status, business_models.PaymentOrderStatusEnum.PENDING)
|
||||
self.assertEqual(order.bank_account, self.bank_account)
|
||||
self.assertEqual(order.markup, '服务层附言')
|
||||
self.assertEqual(order.discount_amount, Decimal('20.50'))
|
||||
self.assertEqual(order.settlement_amount, Decimal('141.00'))
|
||||
reviewed = services.review_payment_order(
|
||||
payment_order=order,
|
||||
target_status=business_models.PaymentOrderStatusEnum.APPROVED,
|
||||
@@ -725,14 +737,14 @@ class PaymentReceiptServiceTestCase(TestCase):
|
||||
merchant=self.merchant,
|
||||
supplier=self.supplier,
|
||||
)
|
||||
self.assertEqual(balance.balance, Decimal('-120.50'))
|
||||
self.assertEqual(balance.balance, Decimal('-141.00'))
|
||||
record = business_models.BalanceChangeRecord.objects.get(
|
||||
merchant=self.merchant,
|
||||
source_type=business_models.BalanceChangeSourceEnum.PAYMENT_ORDER,
|
||||
source_id=order.id,
|
||||
)
|
||||
self.assertEqual(record.direction, business_models.BalanceChangeDirectionEnum.DECREASE)
|
||||
self.assertEqual(record.delta, Decimal('-120.50'))
|
||||
self.assertEqual(record.delta, Decimal('-141.00'))
|
||||
self.assertEqual(record.balance_after, balance.balance)
|
||||
with self.assertRaises(ValueError):
|
||||
services.review_payment_order(
|
||||
@@ -747,9 +759,15 @@ class PaymentReceiptServiceTestCase(TestCase):
|
||||
customer=self.customer,
|
||||
receipt_date=timezone.now().date(),
|
||||
amount='80.00',
|
||||
discount_amount='5',
|
||||
operator=self.operator,
|
||||
remarks='收款测试',
|
||||
bank_account=self.bank_account,
|
||||
markup='收款附言',
|
||||
)
|
||||
self.assertEqual(order.bank_account, self.bank_account)
|
||||
self.assertEqual(order.discount_amount, Decimal('5'))
|
||||
self.assertEqual(order.settlement_amount, Decimal('85'))
|
||||
cancelled = services.review_receipt_order(
|
||||
receipt_order=order,
|
||||
target_status=business_models.ReceiptOrderStatusEnum.CANCELLED,
|
||||
@@ -774,6 +792,68 @@ class PaymentReceiptServiceTestCase(TestCase):
|
||||
operator=self.operator,
|
||||
)
|
||||
|
||||
def test_payment_discount_can_exceed_amount(self):
|
||||
order = services.create_payment_order(
|
||||
merchant=self.merchant,
|
||||
supplier=self.supplier,
|
||||
payment_date=timezone.now().date(),
|
||||
amount='50',
|
||||
discount_amount='60',
|
||||
operator=self.operator,
|
||||
)
|
||||
self.assertEqual(order.settlement_amount, Decimal('110'))
|
||||
|
||||
def test_receipt_discount_can_exceed_amount(self):
|
||||
order = services.create_receipt_order(
|
||||
merchant=self.merchant,
|
||||
customer=self.customer,
|
||||
receipt_date=timezone.now().date(),
|
||||
amount='50',
|
||||
discount_amount='60',
|
||||
operator=self.operator,
|
||||
)
|
||||
self.assertEqual(order.settlement_amount, Decimal('110'))
|
||||
|
||||
def test_payment_order_rejects_foreign_bank_account(self):
|
||||
other_merchant = basic_models.Merchant.objects.create(
|
||||
name='无关商户',
|
||||
type=basic_models.MerchantTypeEnum.FACTORY,
|
||||
)
|
||||
foreign_bank = basic_models.BankAccount.objects.create(
|
||||
merchant=other_merchant,
|
||||
name='其他账户',
|
||||
auto_number='BANK-FOREIGN',
|
||||
)
|
||||
with self.assertRaises(ValueError):
|
||||
services.create_payment_order(
|
||||
merchant=self.merchant,
|
||||
supplier=self.supplier,
|
||||
payment_date=timezone.now().date(),
|
||||
amount='10',
|
||||
operator=self.operator,
|
||||
bank_account=foreign_bank,
|
||||
)
|
||||
|
||||
def test_receipt_order_rejects_foreign_bank_account(self):
|
||||
other_merchant = basic_models.Merchant.objects.create(
|
||||
name='第二商户',
|
||||
type=basic_models.MerchantTypeEnum.FACTORY,
|
||||
)
|
||||
foreign_bank = basic_models.BankAccount.objects.create(
|
||||
merchant=other_merchant,
|
||||
name='第二账户',
|
||||
auto_number='BANK-SECOND',
|
||||
)
|
||||
with self.assertRaises(ValueError):
|
||||
services.create_receipt_order(
|
||||
merchant=self.merchant,
|
||||
customer=self.customer,
|
||||
receipt_date=timezone.now().date(),
|
||||
amount='10',
|
||||
operator=self.operator,
|
||||
bank_account=foreign_bank,
|
||||
)
|
||||
|
||||
def test_receipt_approval_is_idempotent(self):
|
||||
order = services.create_receipt_order(
|
||||
merchant=self.merchant,
|
||||
|
||||
Reference in New Issue
Block a user