diff --git a/inventory/admin.py b/inventory/admin.py index c4e9a09..a6de755 100644 --- a/inventory/admin.py +++ b/inventory/admin.py @@ -7,8 +7,8 @@ class WarehouseAdmin(admin.ModelAdmin): @admin.register(Inventory) class InventoryAdmin(admin.ModelAdmin): - list_display = ('warehouse', 'max_stock', 'min_stock', 'current_stock') + list_display = ('stock_identifier', 'warehouse', 'max_stock', 'min_stock', 'current_stock') @admin.register(Item) class ItemAdmin(admin.ModelAdmin): - list_display = ('inventory', 'name', 'description', 'category', 'weight', 'quantity') \ No newline at end of file + list_display = ('name', 'description', 'category', 'weight', 'quantity', 'inventory') \ No newline at end of file diff --git a/inventory/apps.py b/inventory/apps.py index 905749f..a1cf823 100644 --- a/inventory/apps.py +++ b/inventory/apps.py @@ -4,3 +4,6 @@ from django.apps import AppConfig class InventoryConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'inventory' + + def ready(self): + import inventory.signals diff --git a/inventory/models.py b/inventory/models.py index 1b8b11b..798f639 100644 --- a/inventory/models.py +++ b/inventory/models.py @@ -37,13 +37,17 @@ class Inventory(models.Model): """ warehouse = models.ForeignKey(Warehouse, on_delete=models.CASCADE) max_stock = models.IntegerField() - min_stock = models.IntegerField() - current_stock = models.IntegerField() + min_stock = models.IntegerField(default=0) + current_stock = models.IntegerField(default=0) @property def stock_percentage(self) -> float: return self.current_stock / self.max_stock * 100 + @property + def stock_identifier(self) -> str: + return f"#{self.id} {self.warehouse.name}" + def __str__(self): return f"{self.warehouse.name} - {self.stock_percentage}%" diff --git a/inventory/signals.py b/inventory/signals.py new file mode 100644 index 0000000..48bc5b2 --- /dev/null +++ b/inventory/signals.py @@ -0,0 +1,41 @@ +from django.db.models.signals import post_save, pre_save +from django.dispatch import receiver +from inventory.models import Item +from transaction.models import Transfer + + +@receiver(pre_save, sender=Item) +def handle_item_move(sender, instance, **kwargs): + """ + Signal to handle moving an Item to a new Inventory. + """ + if instance.pk: + old_item = Item.objects.get(pk=instance.pk) + if old_item.inventory != instance.inventory: + old_item.inventory.current_stock -= old_item.quantity + old_item.inventory.save() + +@receiver(post_save, sender=Item) +def update_inventory_current_stock(sender, instance, **kwargs): + """ + Signal to update current_stock of related Inventory when an Item is created or assigned to a new Inventory. + """ + if kwargs.get('created', False) or instance.pk: + instance.inventory.current_stock += instance.quantity + instance.inventory.save() + + +@receiver(post_save, sender=Item) +def create_transfer_instance(sender, instance, **kwargs): + """ + Signal to create a Transfer instance when an Item is transferred between warehouses. + """ + # If the item is being created or updated + if kwargs.get('created', False) or instance.pk: + if instance.pk and instance.inventory.warehouse != instance.inventory.old_warehouse: + Transfer.objects.create( + from_warehouse=instance.inventory.old_warehouse, + to_warehouse=instance.inventory.warehouse, + item=instance, + quantity=instance.quantity, + ) \ No newline at end of file diff --git a/templates/inventory/overview.html b/templates/inventory/overview.html index 3ce49f5..dda6e10 100644 --- a/templates/inventory/overview.html +++ b/templates/inventory/overview.html @@ -229,7 +229,7 @@