mirror of
https://github.com/inventree/InvenTree.git
synced 2026-07-28 01:17:21 +00:00
Refactor sales order methods: (#12477)
- Cancel sales order - Assign serial numbers
This commit is contained in:
@@ -2304,7 +2304,7 @@ class BuildConsumeTest(BuildAPITest):
|
|||||||
expected_code=201,
|
expected_code=201,
|
||||||
benchmark=True,
|
benchmark=True,
|
||||||
max_query_count=250,
|
max_query_count=250,
|
||||||
max_query_time=1.0,
|
max_query_time=1.5,
|
||||||
)
|
)
|
||||||
|
|
||||||
build.refresh_from_db()
|
build.refresh_from_db()
|
||||||
|
|||||||
@@ -1704,23 +1704,28 @@ class SalesOrder(TotalPriceMixin, Order):
|
|||||||
serial_numbers, quantity, part.get_latest_serial_number(), part=part
|
serial_numbers, quantity, part.get_latest_serial_number(), part=part
|
||||||
)
|
)
|
||||||
|
|
||||||
|
serials = [str(serial).strip() for serial in serials]
|
||||||
|
|
||||||
serials_not_exist = set()
|
serials_not_exist = set()
|
||||||
serials_unavailable = set()
|
serials_unavailable = set()
|
||||||
stock_items_to_allocate = []
|
stock_items_to_allocate = []
|
||||||
|
|
||||||
|
# Bulk-fetch every candidate StockItem in a single query, keyed by serial,
|
||||||
|
# rather than querying once per requested serial number
|
||||||
|
candidate_items = {}
|
||||||
|
|
||||||
|
for item in stock.models.StockItem.objects.filter(
|
||||||
|
part=part, serial__in=serials, quantity=1
|
||||||
|
):
|
||||||
|
candidate_items.setdefault(item.serial, item)
|
||||||
|
|
||||||
for serial in serials:
|
for serial in serials:
|
||||||
serial = str(serial).strip()
|
stock_item = candidate_items.get(serial)
|
||||||
|
|
||||||
items = stock.models.StockItem.objects.filter(
|
if stock_item is None:
|
||||||
part=part, serial=serial, quantity=1
|
|
||||||
)
|
|
||||||
|
|
||||||
if not items.exists():
|
|
||||||
serials_not_exist.add(serial)
|
serials_not_exist.add(serial)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
stock_item = items[0]
|
|
||||||
|
|
||||||
if get_global_setting('SALESORDER_BLOCK_INCOMPLETE_ITEM_TESTS'):
|
if get_global_setting('SALESORDER_BLOCK_INCOMPLETE_ITEM_TESTS'):
|
||||||
if (
|
if (
|
||||||
stock_item.hasRequiredTests()
|
stock_item.hasRequiredTests()
|
||||||
@@ -1953,9 +1958,7 @@ class SalesOrder(TotalPriceMixin, Order):
|
|||||||
self.status = SalesOrderStatus.CANCELLED.value
|
self.status = SalesOrderStatus.CANCELLED.value
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
for line in self.lines.all():
|
SalesOrderAllocation.objects.filter(line__order=self).delete()
|
||||||
for allocation in line.allocations.all():
|
|
||||||
allocation.delete()
|
|
||||||
|
|
||||||
trigger_event(SalesOrderEvents.CANCELLED, id=self.pk)
|
trigger_event(SalesOrderEvents.CANCELLED, id=self.pk)
|
||||||
|
|
||||||
|
|||||||
@@ -1725,11 +1725,25 @@ class StockItem(
|
|||||||
- Is installed inside another StockItem
|
- Is installed inside another StockItem
|
||||||
- It has been assigned to a SalesOrder
|
- It has been assigned to a SalesOrder
|
||||||
- It has been assigned to a BuildOrder
|
- It has been assigned to a BuildOrder
|
||||||
|
- It has active allocations against a SalesOrder or TransferOrder
|
||||||
|
- It is referenced by a ReturnOrder line item
|
||||||
"""
|
"""
|
||||||
if self.installed_item_count() > 0:
|
if self.installed_item_count() > 0:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
return self.sales_order is None
|
if self.sales_order is not None:
|
||||||
|
return False
|
||||||
|
|
||||||
|
if self.allocations.exists():
|
||||||
|
return False
|
||||||
|
|
||||||
|
if self.get_sales_order_allocations(active=True).exists():
|
||||||
|
return False
|
||||||
|
|
||||||
|
if self.get_transfer_order_allocations(active=True).exists():
|
||||||
|
return False
|
||||||
|
|
||||||
|
return not self.return_order_lines.exists()
|
||||||
|
|
||||||
def get_installed_items(self, cascade: bool = False) -> set[StockItem]:
|
def get_installed_items(self, cascade: bool = False) -> set[StockItem]:
|
||||||
"""Return all stock items which are *installed* in this one!
|
"""Return all stock items which are *installed* in this one!
|
||||||
|
|||||||
Reference in New Issue
Block a user