feat: added shop models
This commit is contained in:
+169
@@ -0,0 +1,169 @@
|
||||
from decimal import Decimal
|
||||
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
from django.utils.text import gettext_lazy as _
|
||||
|
||||
|
||||
class Product(models.Model):
|
||||
class UnitChoices(models.TextChoices):
|
||||
UNIT = "UNIT", _("Unidad")
|
||||
WEIGHT_KG = "KG", _("kg")
|
||||
VOLUME_LITER = "L", _("L")
|
||||
|
||||
name = models.CharField(
|
||||
max_length=96,
|
||||
blank=False,
|
||||
null=False,
|
||||
verbose_name=_("Nombre"),
|
||||
)
|
||||
description = models.CharField(
|
||||
max_length=1000,
|
||||
blank=True,
|
||||
default="",
|
||||
verbose_name=_("Descripción"),
|
||||
)
|
||||
stock = models.DecimalField(
|
||||
max_digits=13,
|
||||
decimal_places=4,
|
||||
default=Decimal("0"),
|
||||
verbose_name=_("Stock"),
|
||||
)
|
||||
unit = models.CharField(
|
||||
max_length=6,
|
||||
choices=UnitChoices.choices,
|
||||
default=UnitChoices.UNIT,
|
||||
verbose_name=_("Unidad de medida"),
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
class Meta:
|
||||
verbose_name = _("Producto")
|
||||
verbose_name_plural = _("Productos")
|
||||
|
||||
|
||||
class ProductPrice(models.Model):
|
||||
price = models.DecimalField(
|
||||
max_digits=11, decimal_places=2, verbose_name=_("Precio")
|
||||
)
|
||||
date = models.DateTimeField(default=timezone.now, verbose_name=_("Fecha"))
|
||||
product = models.ForeignKey(
|
||||
"shop.Product",
|
||||
on_delete=models.CASCADE,
|
||||
verbose_name=_("Producto"),
|
||||
related_name="prices",
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.price}"
|
||||
|
||||
class Meta:
|
||||
verbose_name = _("Precio de producto")
|
||||
verbose_name_plural = _("Precio de producto")
|
||||
|
||||
|
||||
class Tax(models.Model):
|
||||
code = models.CharField(
|
||||
max_length=8, blank=False, unique=True, verbose_name=_("Código de impuesto")
|
||||
)
|
||||
value = models.PositiveIntegerField(
|
||||
null=False, blank=False, verbose_name=_("Valor entero (porcentaje)")
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.code} - {self.value}%"
|
||||
|
||||
class Meta:
|
||||
verbose_name = _("Impuesto")
|
||||
verbose_name_plural = _("Impuestos")
|
||||
|
||||
|
||||
class OrderLine(models.Model):
|
||||
product = models.ForeignKey(
|
||||
"shop.Product",
|
||||
on_delete=models.CASCADE,
|
||||
null=False,
|
||||
blank=False,
|
||||
verbose_name=_("Producto"),
|
||||
)
|
||||
quantity = models.DecimalField(
|
||||
max_digits=13,
|
||||
decimal_places=4,
|
||||
default=Decimal("1"),
|
||||
null=False,
|
||||
blank=False,
|
||||
verbose_name=_("Cantidad"),
|
||||
)
|
||||
|
||||
# Precio del producto en el momento en el que se crea el pedido
|
||||
price = models.DecimalField(
|
||||
max_digits=13, decimal_places=4, verbose_name=_("Precio")
|
||||
)
|
||||
|
||||
# base_total = quantity * price
|
||||
base_total = models.DecimalField(
|
||||
max_digits=13,
|
||||
decimal_places=4,
|
||||
default=Decimal("0"),
|
||||
null=False,
|
||||
blank=False,
|
||||
verbose_name=_("Total sin impuestos"),
|
||||
)
|
||||
|
||||
# Valor entero del impuesto en el momento en el que se crea el pedido
|
||||
tax_value = models.PositiveIntegerField(
|
||||
null=False, blank=False, verbose_name=_("Valor de impuestos")
|
||||
)
|
||||
|
||||
# taxes = price * quantity * (tax_value / 100)
|
||||
taxes = models.DecimalField(
|
||||
max_digits=13, decimal_places=4, verbose_name=_("Impuestos")
|
||||
)
|
||||
|
||||
# total = base_total + taxes
|
||||
total = models.DecimalField(
|
||||
max_digits=13, decimal_places=4, verbose_name=_("Total")
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.product.name} - {self.quantity} - {self.price}"
|
||||
|
||||
class Meta:
|
||||
verbose_name = _("Línea de pedido")
|
||||
verbose_name_plural = _("Líneas de pedido")
|
||||
|
||||
|
||||
class Order(models.Model):
|
||||
lines = models.ManyToManyField("shop.OrderLine", verbose_name=_("Líneas"))
|
||||
creation_date = models.DateTimeField(
|
||||
auto_now_add=True, verbose_name=_("Fecha de creación")
|
||||
)
|
||||
last_modification_date = models.DateTimeField(
|
||||
auto_now=True, verbose_name=_("Fecha de última modificación")
|
||||
)
|
||||
|
||||
base_total = models.DecimalField(
|
||||
default=Decimal("0"),
|
||||
max_digits=13,
|
||||
decimal_places=2,
|
||||
verbose_name=_("Base imponible"),
|
||||
)
|
||||
total = models.DecimalField(
|
||||
default=Decimal("0"), max_digits=13, decimal_places=2, verbose_name=_("Total")
|
||||
)
|
||||
|
||||
def calculate_total_from_lines(self):
|
||||
self.base_total = self.lines.aggregate(base_total=models.Sum("base_total")).get(
|
||||
"base_total"
|
||||
)
|
||||
self.total = self.lines.aggregate(base_total=models.Sum("total")).get(
|
||||
"base_total"
|
||||
)
|
||||
|
||||
self.save()
|
||||
|
||||
class Meta:
|
||||
verbose_name = _("Pedido")
|
||||
verbose_name_plural = _("Pedidos")
|
||||
Reference in New Issue
Block a user