forked from erp-dev/erp
feat: allocation record for pre sales order
This commit is contained in:
154
api_v1/test_pre_sales_allocation_api.py
Normal file
154
api_v1/test_pre_sales_allocation_api.py
Normal file
@@ -0,0 +1,154 @@
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.test import TestCase, override_settings
|
||||
from rest_framework import status
|
||||
from rest_framework.test import APIClient
|
||||
|
||||
from basic_info.models import (
|
||||
Merchant,
|
||||
MerchantTypeEnum,
|
||||
Customer,
|
||||
WareHouse,
|
||||
WareHouseModeEnum,
|
||||
ProductCategory,
|
||||
Product,
|
||||
ProductUnitEnum,
|
||||
Employee,
|
||||
EmployeeStatusEnum,
|
||||
)
|
||||
from business import models as business_models
|
||||
from stock import models as stock_models
|
||||
|
||||
|
||||
@override_settings(
|
||||
CELERY_TASK_ALWAYS_EAGER=True,
|
||||
CELERY_TASK_EAGER_PROPAGATES=True,
|
||||
)
|
||||
class PreSalesAllocationAPITestCase(TestCase):
|
||||
def setUp(self):
|
||||
self.merchant = Merchant.objects.create(name='配货商户', type=MerchantTypeEnum.FACTORY)
|
||||
self.customer = Customer.objects.create(
|
||||
merchant=self.merchant,
|
||||
name='配货客户',
|
||||
created_by=None,
|
||||
)
|
||||
self.warehouse = WareHouse.objects.create(
|
||||
merchant=self.merchant,
|
||||
name='配货仓库',
|
||||
mode=WareHouseModeEnum.UNRESTRICTED,
|
||||
)
|
||||
category = ProductCategory.objects.create(
|
||||
merchant=self.merchant,
|
||||
name='配货品类',
|
||||
product_prefix='ALC',
|
||||
)
|
||||
self.product = Product.objects.create(
|
||||
merchant=self.merchant,
|
||||
category=category,
|
||||
name='配货产品',
|
||||
human_id='ALC-001',
|
||||
unit=ProductUnitEnum.METER,
|
||||
)
|
||||
|
||||
User = get_user_model()
|
||||
self.user = User.objects.create_user(username='allocation_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.order_payload = {
|
||||
'customer': self.customer.id,
|
||||
'warehouse': self.warehouse.id,
|
||||
'kind': business_models.SalesOrderKindEnum.WHOLESALE,
|
||||
'remarks': '预销售单备注',
|
||||
'items': [
|
||||
{
|
||||
'product_id': self.product.id,
|
||||
'quantity': '12.5',
|
||||
'unit': '米',
|
||||
'order_quantity': 7,
|
||||
'remarks': '明细备注',
|
||||
}
|
||||
],
|
||||
}
|
||||
|
||||
self.stock_record = stock_models.StockChangeRecord.objects.create(
|
||||
merchant=self.merchant,
|
||||
type=stock_models.StockChangeTypeEnum.ADD,
|
||||
warehouse=self.warehouse,
|
||||
source_type=stock_models.StockChangeSourceEnum.PURCHASE,
|
||||
created_by=self.user,
|
||||
)
|
||||
self.stock_detail = stock_models.StockChangeDetail.objects.create(
|
||||
merchant=self.merchant,
|
||||
product=self.product,
|
||||
unit=ProductUnitEnum.METER,
|
||||
stock_change_record=self.stock_record,
|
||||
quantity='12.5',
|
||||
)
|
||||
|
||||
def _create_order(self):
|
||||
resp = self.client.post('/api/v1/pre-sales-orders/', self.order_payload, format='json')
|
||||
self.assertEqual(resp.status_code, status.HTTP_201_CREATED)
|
||||
return resp.data
|
||||
|
||||
def test_create_allocation_record(self):
|
||||
order = self._create_order()
|
||||
item_id = order['items'][0]['id']
|
||||
|
||||
payload = {
|
||||
'stock_ids': [self.stock_detail.id],
|
||||
'quantity': '5.5',
|
||||
'unit': '米',
|
||||
}
|
||||
resp = self.client.post(
|
||||
f'/api/v1/pre-sales-order-items/{item_id}/allocations/',
|
||||
payload,
|
||||
format='json',
|
||||
)
|
||||
self.assertEqual(resp.status_code, status.HTTP_201_CREATED)
|
||||
self.assertEqual(resp.data['stock_ids'], [self.stock_detail.id])
|
||||
self.assertEqual(str(resp.data['quantity']), '5.50')
|
||||
|
||||
def test_cancel_allocation_record(self):
|
||||
order = self._create_order()
|
||||
item_id = order['items'][0]['id']
|
||||
|
||||
create_resp = self.client.post(
|
||||
f'/api/v1/pre-sales-order-items/{item_id}/allocations/',
|
||||
{
|
||||
'stock_ids': [self.stock_detail.id],
|
||||
'quantity': '5.5',
|
||||
'unit': '米',
|
||||
},
|
||||
format='json',
|
||||
)
|
||||
self.assertEqual(create_resp.status_code, status.HTTP_201_CREATED)
|
||||
record_id = create_resp.data['id']
|
||||
|
||||
delete_resp = self.client.delete(
|
||||
f'/api/v1/pre-sales-order-items/{item_id}/allocations/{record_id}/'
|
||||
)
|
||||
self.assertEqual(delete_resp.status_code, status.HTTP_200_OK)
|
||||
self.assertEqual(delete_resp.data['status'], business_models.AllocationRecordStatusEnum.CANCELLED)
|
||||
|
||||
def test_create_allocation_with_invalid_stock(self):
|
||||
order = self._create_order()
|
||||
item_id = order['items'][0]['id']
|
||||
|
||||
resp = self.client.post(
|
||||
f'/api/v1/pre-sales-order-items/{item_id}/allocations/',
|
||||
{
|
||||
'stock_ids': [999999],
|
||||
'quantity': '5.5',
|
||||
'unit': '米',
|
||||
},
|
||||
format='json',
|
||||
)
|
||||
self.assertEqual(resp.status_code, status.HTTP_400_BAD_REQUEST)
|
||||
self.assertIn('库存明细不存在', resp.data['error'])
|
||||
Reference in New Issue
Block a user