Files
ProjectApp/inventory/models.py
T
Felix Baumann 148efd919d v1.0
2026-06-28 10:20:36 +00:00

88 lines
3.9 KiB
Python

from django.db import models
from django.contrib.auth.models import User
from projects.models import Project
from finance.models import Category, Supplier
from django.db.models import Sum
from django.core.validators import MinValueValidator
class InventoryCategory(models.Model):
name = models.CharField(max_length=255, unique=True, verbose_name="Name")
class Meta:
verbose_name = "Inventarkategorie"
verbose_name_plural = "Inventarkategorien"
ordering = ["name"]
def __str__(self):
return self.name
class InventoryLocation(models.Model):
name = models.CharField(max_length=255, unique=True, verbose_name="Name")
class Meta:
verbose_name = "Inventarstandort"
verbose_name_plural = "Inventarstandorte"
ordering = ["name"]
def __str__(self):
return self.name
class InventoryItem(models.Model):
name = models.CharField(max_length=255, verbose_name="Name")
description = models.TextField(blank=True, verbose_name="Beschreibung")
quantity = models.PositiveIntegerField(default=0, verbose_name="Anzahl", validators=[MinValueValidator(0,message="Die Anzahl darf nicht negativ sein.")])
location = models.ForeignKey(InventoryLocation, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="Standort")
article_number = models.CharField(max_length=255, blank=True, verbose_name="Artikelnummer")
responsible = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="Verantwortlicher")
category = models.ForeignKey(InventoryCategory, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="Kategorie")
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name = "Inventarartikel"
verbose_name_plural = "Inventarartikel"
ordering = ["name"]
def __str__(self):
return self.name
class ProjectInventoryItem(models.Model):
class Status(models.TextChoices):
OPEN = "open", "Offen"
PACKED = "packed", "Eingepackt"
ON_SITE = "on_site", "Vor Ort"
project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name="inventory_items", verbose_name="Projekt")
item = models.ForeignKey(InventoryItem, on_delete=models.CASCADE, verbose_name="Artikel")
quantity = models.PositiveIntegerField(default=1, verbose_name="Anzahl", validators=[MinValueValidator(0,message="Die Anzahl darf nicht negativ sein.")])
status = models.CharField(max_length=20, choices=Status.choices, default=Status.OPEN, verbose_name="Status")
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name = "Projektartikel"
verbose_name_plural = "Projektartikel"
unique_together = ("project", "item")
def __str__(self):
return f"{self.project} - {self.item}"
class ShoppingItem(models.Model):
project = models.ForeignKey(Project, on_delete=models.CASCADE, related_name="shopping_items", verbose_name="Projekt")
name = models.CharField(max_length=255, verbose_name="Name")
description = models.TextField(blank=True, verbose_name="Beschreibung")
quantity = models.PositiveIntegerField(default=1, verbose_name="Anzahl", validators=[MinValueValidator(0,message="Die Anzahl darf nicht negativ sein.")])
supplier = models.ForeignKey(Supplier, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="Lieferant")
price = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True, verbose_name="Preis",validators=[MinValueValidator(0,message="Der Betrag darf nicht negativ sein.")])
category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="Kategorie")
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name = "Einkaufslistenartikel"
verbose_name_plural = "Einkaufslistenartikel"
ordering = ["name"]
def __str__(self):
return self.name