forked from erp-dev/erp
feat: support pre_sales_order convert to sales_order api
This commit is contained in:
@@ -18,6 +18,8 @@ from basic_info.models import (
|
||||
EmployeeStatusEnum,
|
||||
)
|
||||
from business import models as business_models
|
||||
from business import allocation_services
|
||||
from stock import models as stock_models
|
||||
|
||||
|
||||
@override_settings(
|
||||
@@ -37,6 +39,11 @@ class PreSalesOrderAPITestCase(TestCase):
|
||||
name='预销售仓库',
|
||||
mode=WareHouseModeEnum.UNRESTRICTED,
|
||||
)
|
||||
self.warehouse_strict_out = WareHouse.objects.create(
|
||||
merchant=self.merchant,
|
||||
name='预销售严出仓',
|
||||
mode=WareHouseModeEnum.RESTRICT_IN_OUT,
|
||||
)
|
||||
category = ProductCategory.objects.create(
|
||||
merchant=self.merchant,
|
||||
name='预销售品类',
|
||||
@@ -78,6 +85,20 @@ class PreSalesOrderAPITestCase(TestCase):
|
||||
],
|
||||
}
|
||||
|
||||
self.strict_payload = {
|
||||
'customer': self.customer.id,
|
||||
'warehouse': self.warehouse_strict_out.id,
|
||||
'kind': business_models.SalesOrderKindEnum.WHOLESALE,
|
||||
'remarks': '预销售单备注',
|
||||
'items': [
|
||||
{
|
||||
'product_id': self.product.id,
|
||||
'quantity': '10',
|
||||
'unit': '米',
|
||||
}
|
||||
],
|
||||
}
|
||||
|
||||
def _create(self, payload=None) -> int:
|
||||
resp = self.client.post('/api/v1/pre-sales-orders/', payload or self.payload, format='json')
|
||||
self.assertEqual(resp.status_code, status.HTTP_201_CREATED)
|
||||
@@ -121,3 +142,50 @@ class PreSalesOrderAPITestCase(TestCase):
|
||||
resp = self.client.delete(f'/api/v1/pre-sales-orders/{order_id}/')
|
||||
self.assertEqual(resp.status_code, status.HTTP_204_NO_CONTENT)
|
||||
self.assertFalse(business_models.PreSalesOrder.objects.filter(id=order_id).exists())
|
||||
|
||||
def test_convert_to_sales_order_rejects_non_strict_out(self):
|
||||
order_id = self._create()
|
||||
resp = self.client.post(f'/api/v1/pre-sales-orders/{order_id}/convert-to-sales/', {}, format='json')
|
||||
self.assertEqual(resp.status_code, status.HTTP_403_FORBIDDEN)
|
||||
self.assertIn('仅支持严进严出仓库模式', resp.data.get('error', ''))
|
||||
|
||||
def test_convert_to_sales_order_success(self):
|
||||
resp = self.client.post('/api/v1/pre-sales-orders/', self.strict_payload, format='json')
|
||||
self.assertEqual(resp.status_code, status.HTTP_201_CREATED)
|
||||
order_id = resp.data['id']
|
||||
|
||||
order = business_models.PreSalesOrder.objects.get(id=order_id)
|
||||
item = order.items.first()
|
||||
|
||||
stock_record = stock_models.StockChangeRecord.objects.create(
|
||||
merchant=self.merchant,
|
||||
type=stock_models.StockChangeTypeEnum.ADD,
|
||||
warehouse=self.warehouse_strict_out,
|
||||
source_type=stock_models.StockChangeSourceEnum.PURCHASE,
|
||||
created_by=self.user,
|
||||
)
|
||||
stock_detail = stock_models.StockChangeDetail.objects.create(
|
||||
merchant=self.merchant,
|
||||
product=self.product,
|
||||
unit=ProductUnitEnum.METER,
|
||||
stock_change_record=stock_record,
|
||||
quantity='10',
|
||||
)
|
||||
allocation_services.create_allocation_record(
|
||||
item=item,
|
||||
stock_ids=[stock_detail.id],
|
||||
quantity='10',
|
||||
unit='米',
|
||||
scanned_by=self.employee,
|
||||
)
|
||||
|
||||
convert_resp = self.client.post(
|
||||
f'/api/v1/pre-sales-orders/{order_id}/convert-to-sales/',
|
||||
{},
|
||||
format='json',
|
||||
)
|
||||
self.assertEqual(convert_resp.status_code, status.HTTP_201_CREATED)
|
||||
self.assertIn('id', convert_resp.data)
|
||||
self.assertEqual(convert_resp.data['status'], business_models.SalesOrderStatusEnum.PENDING)
|
||||
sales_order = business_models.SalesOrder.objects.get(id=convert_resp.data['id'])
|
||||
self.assertEqual(sales_order.from_pre_sales_order_id, order_id)
|
||||
|
||||
Reference in New Issue
Block a user