1
0
forked from erp-dev/erp

feat: support pre_sales_order convert to sales_order api

This commit is contained in:
2026-02-02 15:58:29 +08:00
parent 2572c5aab4
commit fb93582b06
13 changed files with 379 additions and 7 deletions

View File

@@ -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)