2
0
mirror of https://github.com/inventree/InvenTree.git synced 2025-04-28 11:36:44 +00:00

Bug fix for allocating items to build (#6532) (#6533)

* Bug fix for allocating items to build

- Handle case where allocated quantity is less than 1
- Add unit tests
- Closes https://github.com/inventree/InvenTree/issues/6145

* Remove debug messgae

(cherry picked from commit a310437dc71ae08af30c8079532e425bc1838c7d)

Co-authored-by: Oliver <oliver.henry.walters@gmail.com>
This commit is contained in:
github-actions[bot] 2024-02-21 10:39:15 +11:00 committed by GitHub
parent 47a459a32c
commit 2499e97928
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 68 additions and 10 deletions

View File

@ -904,18 +904,24 @@ class BuildAllocationSerializer(serializers.Serializer):
if build_line.bom_item.consumable:
continue
params = {
"build_line": build_line,
"stock_item": stock_item,
"install_into": output,
}
try:
# Create a new BuildItem to allocate stock
build_item, created = BuildItem.objects.get_or_create(
build_line=build_line,
stock_item=stock_item,
install_into=output,
)
if created:
build_item.quantity = quantity
else:
if build_item := BuildItem.objects.filter(**params).first():
# Find an existing BuildItem for this stock item
# If it exists, increase the quantity
build_item.quantity += quantity
build_item.save()
else:
# Create a new BuildItem to allocate stock
build_item = BuildItem.objects.create(
quantity=quantity,
**params
)
except (ValidationError, DjangoValidationError) as exc:
# Catch model errors and re-throw as DRF errors
raise ValidationError(detail=serializers.as_serializer_error(exc))

View File

@ -822,6 +822,58 @@ class BuildAllocationTest(BuildAPITest):
allocation.refresh_from_db()
self.assertEqual(allocation.quantity, 5000)
def test_fractional_allocation(self):
"""Test allocation of a fractional quantity of stock items.
Ref: https://github.com/inventree/InvenTree/issues/6508
"""
si = StockItem.objects.get(pk=2)
# Find line item
line = self.build.build_lines.all().filter(bom_item__sub_part=si.part).first()
# Test a fractional quantity when the *available* quantity is greater than 1
si.quantity = 100
si.save()
response = self.post(
self.url,
{
"items": [
{
"build_line": line.pk,
"stock_item": si.pk,
"quantity": 0.1616,
}
]
},
expected_code=201
)
# Test a fractional quantity when the *available* quantity is less than 1
si = StockItem.objects.create(
part=si.part,
quantity=0.3159,
tree_id=0,
level=0,
lft=0, rght=0
)
response = self.post(
self.url,
{
"items": [
{
"build_line": line.pk,
"stock_item": si.pk,
"quantity": 0.1616,
}
]
},
expected_code=201,
)
class BuildOverallocationTest(BuildAPITest):
"""Unit tests for over allocation of stock items against a build order.