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)