from django.db import models from django.db import transaction from django.utils import timezone from django.contrib.auth.models import User import uuid class UserProfile(models.Model): ROLE_CHOICES = [ ('manager', 'Manager'), ('cashier', 'Cashier'), ] user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') role = models.CharField(max_length=10, choices=ROLE_CHOICES, default='cashier') def __str__(self): return f"{self.user.username} - {self.get_role_display()}" class Ingredient(models.Model): name = models.CharField(max_length=100, unique=True) stock_quantity = models.DecimalField(max_digits=10, decimal_places=2, default=0.00) unit = models.CharField(max_length=20, default="grams") def __str__(self): return f"{self.name} ({self.stock_quantity} {self.unit})" class MenuItem(models.Model): name = models.CharField(max_length=100, unique=True) price = models.DecimalField(max_digits=10, decimal_places=2) description = models.TextField(blank=True) image_url = models.URLField(blank=True, null=True) is_active = models.BooleanField(default=True) def __str__(self): return self.name class MenuItemIngredient(models.Model): menu_item = models.ForeignKey(MenuItem, related_name='ingredients', on_delete=models.CASCADE) ingredient = models.ForeignKey(Ingredient, on_delete=models.CASCADE) quantity_required = models.DecimalField(max_digits=10, decimal_places=2) def __str__(self): return f"{self.quantity_required} {self.ingredient.unit} of {self.ingredient.name} for {self.menu_item.name}" class Order(models.Model): order_number = models.CharField(max_length=12, unique=True, editable=False) created_at = models.DateTimeField(default=timezone.now) total_price = models.DecimalField(max_digits=10, decimal_places=2, default=0.00) customer_notes = models.TextField(blank=True) def save(self, *args, **kwargs): if not self.order_number: self.order_number = str(uuid.uuid4().hex[:8]).upper() super().save(*args, **kwargs) def __str__(self): return f"Order {self.order_number}" class OrderItem(models.Model): order = models.ForeignKey(Order, related_name='items', on_delete=models.CASCADE) menu_item = models.ForeignKey(MenuItem, on_delete=models.PROTECT) quantity = models.PositiveIntegerField(default=1) price_at_order = models.DecimalField(max_digits=10, decimal_places=2) def __str__(self): return f"{self.quantity} x {self.menu_item.name}"