backend/inventory/models.py

60 lines
2.3 KiB
Python
Raw Permalink Normal View History

from django.db import models
from datetime import timedelta, date
class Nomenclature(models.Model):
name = models.CharField(max_length=255)
gtin = models.CharField(max_length=14, unique=True)
unit = models.CharField(max_length=50, default="шт")
def __str__(self):
return self.name
class Sticker(models.Model):
nomenclature = models.ForeignKey("Nomenclature", on_delete=models.CASCADE)
quantity = models.IntegerField()
emission_date = models.DateField()
last_revision_date = models.DateField(null=True, blank=True)
location = models.CharField(max_length=255)
status = models.CharField(max_length=255, default="в наличии")
def is_expired(self):
"""Проверяем, истёк ли срок годности (1 год)"""
if not self.emission_date:
return False
expiration_date = self.emission_date + timedelta(days=365) # 12 месяцев
return date.today() > expiration_date
def save(self, *args, **kwargs):
"""При сохранении автоматически обновляем статус"""
if self.is_expired():
self.status = "просрочены"
elif self.is_expiring_soon():
self.status = "скоро истекает"
else:
self.status = "в наличии"
super().save(*args, **kwargs)
def is_expiring_soon(self):
"""Срок годности истекает через 1 месяц"""
if not self.emission_date:
return False
expiration_date = self.emission_date + timedelta(days=365)
return expiration_date - timedelta(days=30) <= date.today() < expiration_date
class StickerMovement(models.Model):
sticker = models.ForeignKey(Sticker, on_delete=models.CASCADE)
date = models.DateTimeField(auto_now_add=True)
from_location = models.CharField(max_length=50)
to_location = models.CharField(max_length=50)
quantity = models.IntegerField()
def save(self, *args, **kwargs):
if self.from_location == "склад" and self.to_location == "цех":
self.sticker.location = "цех"
elif self.to_location == "склад":
self.sticker.location = "склад"
self.sticker.save()
super().save(*args, **kwargs)