backend/inventory/models.py

82 lines
3.2 KiB
Python
Raw Permalink Normal View History

2025-03-23 21:24:08 +10:00
from django.db import models
from datetime import timedelta, date
from django.contrib.auth.models import User
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)
class StickerTransferRequest(models.Model):
STATUS_CHOICES = [
("pending", "Ожидает"),
("accepted", "Принята"),
("declined", "Отклонена"),
("cancelled", "Отменена"),
]
from_user = models.ForeignKey(User, related_name="sent_transfers", on_delete=models.CASCADE)
to_user = models.ForeignKey(User, related_name="received_transfers", on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default="pending")
comment = models.TextField(blank=True, null=True)
class StickerTransferItem(models.Model):
transfer = models.ForeignKey(StickerTransferRequest, related_name="items", on_delete=models.CASCADE)
sticker = models.ForeignKey(Sticker, on_delete=models.CASCADE)
quantity = models.IntegerField()