forked from erp-dev/erp
feat: red flush
This commit is contained in:
165
business/tests/test_statement_services.py
Normal file
165
business/tests/test_statement_services.py
Normal file
@@ -0,0 +1,165 @@
|
||||
from decimal import Decimal
|
||||
|
||||
from django.test import TestCase
|
||||
from django.utils import timezone
|
||||
|
||||
from basic_info import models as basic_models
|
||||
from business import models as business_models, services
|
||||
|
||||
from .fixtures import create_basic_fixtures, create_sales_fixtures
|
||||
|
||||
|
||||
class BusinessStatementServiceTestCase(TestCase):
|
||||
def _disable_auto_stock_tasks(self, merchant):
|
||||
basic_models.MerchantSetting.objects.filter(
|
||||
merchant=merchant,
|
||||
key=basic_models.MerchantSettingKeyEnum.AUTO_CREATE_STOCK_CHANGE_TASKS,
|
||||
).update(val_bool=False)
|
||||
|
||||
def test_build_customer_statement_collects_all_customer_records(self):
|
||||
merchant, customer, warehouse_strict, warehouse_relaxed, _, product, operator = create_sales_fixtures()
|
||||
self._disable_auto_stock_tasks(merchant)
|
||||
today = timezone.now().date()
|
||||
|
||||
sales_order = services.create_sales_order(
|
||||
merchant=merchant,
|
||||
customer=customer,
|
||||
order_date=today,
|
||||
warehouse=warehouse_strict,
|
||||
operator=operator,
|
||||
items=[{'product_id': product.id, 'numbers': [6, 4], 'price': '10', 'unit': '米'}],
|
||||
remarks='销售对账',
|
||||
)
|
||||
services.review_sales_order(
|
||||
sales_order=sales_order,
|
||||
target_status=business_models.SalesOrderStatusEnum.APPROVED,
|
||||
)
|
||||
|
||||
return_order = services.create_sales_return_order(
|
||||
merchant=merchant,
|
||||
customer=customer,
|
||||
return_date=today,
|
||||
warehouse=warehouse_relaxed,
|
||||
operator=operator,
|
||||
items=[{'product_id': product.id, 'quantity': 3, 'num_of_rolls': 1, 'price': '10'}],
|
||||
remarks='销退对账',
|
||||
)
|
||||
services.review_sales_return_order(
|
||||
sales_return_order=return_order,
|
||||
target_status=business_models.SalesReturnStatusEnum.APPROVED,
|
||||
)
|
||||
|
||||
receipt_order = services.create_receipt_order(
|
||||
merchant=merchant,
|
||||
customer=customer,
|
||||
receipt_date=today,
|
||||
amount='20',
|
||||
discount_amount='2',
|
||||
operator=operator,
|
||||
remarks='收款对账',
|
||||
)
|
||||
services.review_receipt_order(
|
||||
receipt_order=receipt_order,
|
||||
target_status=business_models.ReceiptOrderStatusEnum.APPROVED,
|
||||
)
|
||||
|
||||
business_models.ExternalCustomerStatementOrder.objects.create(
|
||||
merchant=merchant,
|
||||
customer=customer,
|
||||
category=business_models.ExternalCustomerStatementCategoryEnum.SALE,
|
||||
external_source_id='EXT-SALE-1',
|
||||
occurred_at=today,
|
||||
total_amount=Decimal('50'),
|
||||
sf_amount=Decimal('5'),
|
||||
zk_amount=Decimal('3'),
|
||||
items_payload=[{'product_name': '外部销售'}],
|
||||
)
|
||||
business_models.ExternalCustomerStatementOrder.objects.create(
|
||||
merchant=merchant,
|
||||
customer=customer,
|
||||
category=business_models.ExternalCustomerStatementCategoryEnum.SALE_RETURN,
|
||||
external_source_id='EXT-RETURN-1',
|
||||
occurred_at=today,
|
||||
total_amount=Decimal('7'),
|
||||
zk_amount=Decimal('1'),
|
||||
items_payload=[{'product_name': '外部退货'}],
|
||||
)
|
||||
|
||||
payload = services.build_customer_statement(merchant=merchant, customer=customer)
|
||||
|
||||
source_types = {record['source_type'] for record in payload['records']}
|
||||
self.assertEqual(
|
||||
source_types,
|
||||
{
|
||||
'sales_order',
|
||||
'sales_return_order',
|
||||
'receipt_order',
|
||||
'external_sales_order',
|
||||
'external_sales_return_order',
|
||||
},
|
||||
)
|
||||
sales_record = next(record for record in payload['records'] if record['source_type'] == 'sales_order')
|
||||
self.assertEqual(sales_record['items'][0]['quantity'], Decimal('10'))
|
||||
self.assertEqual(sales_record['items'][0]['quantity_of_rolls'], [6, 4])
|
||||
receipt_record = next(record for record in payload['records'] if record['source_type'] == 'receipt_order')
|
||||
self.assertEqual(receipt_record['positive_amount'], Decimal('-2.00'))
|
||||
self.assertEqual(receipt_record['negative_amount'], Decimal('20.00'))
|
||||
summary = services.build_statement_summary(payload)
|
||||
self.assertIn('positive_total', summary)
|
||||
self.assertIn('negative_total', summary)
|
||||
|
||||
def test_build_supplier_statement_collects_all_supplier_records(self):
|
||||
merchant, supplier, warehouse_strict, warehouse_relaxed, product, operator = create_basic_fixtures()
|
||||
self._disable_auto_stock_tasks(merchant)
|
||||
today = timezone.now().date()
|
||||
|
||||
purchase_order = services.create_purchase_order(
|
||||
merchant=merchant,
|
||||
supplier=supplier,
|
||||
order_date=today,
|
||||
warehouse=warehouse_strict,
|
||||
operator=operator,
|
||||
items=[{'product_id': product.id, 'numbers': [8, 2], 'price': '9', 'unit': '米'}],
|
||||
remarks='采购对账',
|
||||
)
|
||||
services.review_purchase_order(
|
||||
purchase_order=purchase_order,
|
||||
target_status=business_models.PurchaseOrderStatusEnum.APPROVED,
|
||||
)
|
||||
|
||||
return_order = services.create_purchase_return_order(
|
||||
merchant=merchant,
|
||||
supplier=supplier,
|
||||
return_date=today,
|
||||
warehouse=warehouse_relaxed,
|
||||
operator=operator,
|
||||
items=[{'product_id': product.id, 'quantity': 4, 'num_of_rolls': 1, 'price': '9'}],
|
||||
remarks='采退对账',
|
||||
)
|
||||
services.review_purchase_return_order(
|
||||
purchase_return_order=return_order,
|
||||
target_status=business_models.PurchaseReturnStatusEnum.APPROVED,
|
||||
)
|
||||
|
||||
payment_order = services.create_payment_order(
|
||||
merchant=merchant,
|
||||
supplier=supplier,
|
||||
payment_date=today,
|
||||
amount='15',
|
||||
operator=operator,
|
||||
remarks='付款对账',
|
||||
)
|
||||
services.review_payment_order(
|
||||
payment_order=payment_order,
|
||||
target_status=business_models.PaymentOrderStatusEnum.APPROVED,
|
||||
)
|
||||
|
||||
payload = services.build_supplier_statement(merchant=merchant, supplier=supplier)
|
||||
|
||||
source_types = {record['source_type'] for record in payload['records']}
|
||||
self.assertEqual(source_types, {'purchase_order', 'purchase_return_order', 'payment_order'})
|
||||
purchase_record = next(record for record in payload['records'] if record['source_type'] == 'purchase_order')
|
||||
self.assertEqual(purchase_record['items'][0]['quantity'], Decimal('10'))
|
||||
self.assertEqual(purchase_record['items'][0]['num_of_rolls'], 2)
|
||||
payment_record = next(record for record in payload['records'] if record['source_type'] == 'payment_order')
|
||||
self.assertEqual(payment_record['negative_amount'], Decimal('15.00'))
|
||||
Reference in New Issue
Block a user