Skip to content

fix: Inventory unexpectedly marked as Low Stock #772

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 4 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 13 additions & 20 deletions care/facility/api/serializers/inventory.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import contextlib
from datetime import timedelta

from django.db import transaction
Expand Down Expand Up @@ -70,7 +71,7 @@ def create(self, validated_data):
try:
item.allowed_units.get(id=unit.id)
except:
raise serializers.ValidationError({"unit": [f"Item cannot be measured with unit"]})
raise serializers.ValidationError({"unit": ["Item cannot be measured with unit"]})

multiplier = 1

Expand All @@ -80,34 +81,31 @@ def create(self, validated_data):
from_unit=unit, to_unit=item.default_unit
).multiplier
except:
raise serializers.ValidationError({"item": [f"Please Ask Admin to Add Conversion Metrics"]})
raise serializers.ValidationError({"item": ["Please Ask Admin to Add Conversion Metrics"]})

validated_data["created_by"] = self.context["request"].user

if not validated_data["is_incoming"]:
multiplier *= -1

summary_obj = None
current_min_quantity = item.min_quantity
current_min_quantity = 0
current_quantity = multiplier * validated_data["quantity"]
validated_data["quantity_in_default_unit"] = abs(current_quantity)
try:
summary_obj = FacilityInventorySummary.objects.get(facility=facility, item=item)
current_quantity = summary_obj.quantity + (multiplier * validated_data["quantity"])
summary_obj.quantity = F("quantity") + (multiplier * validated_data["quantity"])
except:
except FacilityInventorySummary.DoesNotExist:
summary_obj = FacilityInventorySummary(
facility=facility, item=item, quantity=multiplier * validated_data["quantity"]
)

if current_quantity < 0:
raise serializers.ValidationError({"stock": [f"Stock not Available"]})
raise serializers.ValidationError({"stock": ["Stock not Available"]})

try:
with contextlib.suppress(FacilityInventoryMinQuantity.DoesNotExist, AttributeError):
current_min_quantity = FacilityInventoryMinQuantity.objects.get(facility=facility, item=item).min_quantity
except:
pass

summary_obj.is_low = current_quantity < current_min_quantity

validated_data["current_stock"] = current_quantity
Expand Down Expand Up @@ -176,36 +174,31 @@ def create(self, validated_data):
item = validated_data["item"]

if not item:
raise serializers.ValidationError({"item": [f"Item cannot be Null"]})
raise serializers.ValidationError({"item": ["Item cannot be Null"]})

try:
instance = super().create(validated_data)
except:
raise serializers.ValidationError({"item": [f"Item min quantity already set"]})
raise serializers.ValidationError({"item": ["Item min quantity already set"]})

try:
with contextlib.suppress(FacilityInventoryMinQuantity.DoesNotExist, AttributeError):
summary_obj = FacilityInventorySummary.objects.get(facility=validated_data["facility"], item=item)
summary_obj.is_low = summary_obj.quantity < validated_data["min_quantity"]
summary_obj.save()
except:
pass

return instance

def update(self, instance, validated_data):

if "item" in validated_data:
if instance.item != validated_data["item"]:
raise serializers.ValidationError({"item": [f"Item cannot be Changed"]})
if "item" in validated_data and instance.item != validated_data["item"]:
raise serializers.ValidationError({"item": ["Item cannot be Changed"]})

item = validated_data["item"]

try:
with contextlib.suppress(FacilityInventoryMinQuantity.DoesNotExist, AttributeError):
summary_obj = FacilityInventorySummary.objects.get(facility=instance.facility, item=item)
summary_obj.is_low = summary_obj.quantity < validated_data["min_quantity"]
summary_obj.save()
except:
pass

return super().update(instance, validated_data)

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# Generated by Django 2.2.11 on 2022-05-20 19:10

from django.db import migrations


class Migration(migrations.Migration):

dependencies = [
('facility', '0292_auto_20220430_1748'),
]

operations = [
migrations.RemoveField(
model_name='facilityinventoryitem',
name='min_quantity',
),
]
2 changes: 0 additions & 2 deletions care/facility/models/inventory.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ def __str__(self):
class FacilityInventoryItem(models.Model):
"""
This Model stores all the different items that can be added in a facility.
the min_quantity describes the items that are at the verse of finishing up
"""

name = models.CharField(max_length=1000, blank=False, null=False)
Expand All @@ -64,7 +63,6 @@ class FacilityInventoryItem(models.Model):
allowed_units = models.ManyToManyField(FacilityInventoryUnit, related_name="allowed_units")
tags = models.ManyToManyField(FacilityInventoryItemTag)
description = models.TextField(blank=True)
min_quantity = models.FloatField()

def __str__(self):
return self.name
Expand Down
8 changes: 4 additions & 4 deletions care/users/management/commands/seed_data.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,21 +18,21 @@ def handle(self, *args, **options):
cubic_meter, _ = FacilityInventoryUnit.objects.get_or_create(name="Cubic Meter")

liquid_oxygen, _ = FacilityInventoryItem.objects.get_or_create(
name="Liquid Oxygen", default_unit=cubic_meter, min_quantity=100
name="Liquid Oxygen", default_unit=cubic_meter
)
liquid_oxygen.allowed_units.add(cubic_meter)

jumbo_d, _ = FacilityInventoryItem.objects.get_or_create(
name="Jumbo D Type Oxygen Cylinder", default_unit=cylinders, min_quantity=100
name="Jumbo D Type Oxygen Cylinder", default_unit=cylinders
)
jumbo_d.allowed_units.add(cylinders)

type_b, _ = FacilityInventoryItem.objects.get_or_create(
name="B Type Oxygen Cylinder", default_unit=cylinders, min_quantity=100
name="B Type Oxygen Cylinder", default_unit=cylinders
)
type_b.allowed_units.add(cylinders)

type_c, _ = FacilityInventoryItem.objects.get_or_create(
name="C Type Oxygen Cylinder", default_unit=cylinders, min_quantity=100
name="C Type Oxygen Cylinder", default_unit=cylinders
)
type_c.allowed_units.add(cylinders)