feat: changed TPV behaviour

This commit is contained in:
Pablo Moreno
2025-01-12 22:40:46 +01:00
parent fc0cdad246
commit a733325529
43 changed files with 1036 additions and 1100 deletions
+91
View File
@@ -8,6 +8,9 @@ from django.utils import timezone
from django.utils.text import gettext_lazy as _
from django.utils.text import slugify
from config.models import SingletonModel
from shop.settings import CURRENCY_CODES
User = get_user_model()
@@ -118,6 +121,9 @@ class Product(TimestampedModel):
default="", blank=True, null=True, max_length=128, verbose_name=_("Slug")
)
hidden = models.BooleanField(default=False, db_index=True, verbose_name=_("oculto"))
is_shipping_method = models.BooleanField(
default=False, verbose_name=_("es forma de envío")
)
def __str__(self):
return self.name
@@ -328,30 +334,55 @@ class OrderLine(TimestampedModel):
verbose_name_plural = _("líneas de pedido")
def create_order_code(*args, **kwargs):
return (
timezone.now()
.isoformat()
.replace("-", "")
.replace("T", "")
.replace(":", "")
.replace(".", "")[:-5]
)
class Order(TimestampedModel):
class Statuses(models.TextChoices):
STATUS_PENDING = "PEN", _("pendiente de pago")
STATUS_PAID = "PAI", _("pagado")
STATUS_RETURNED = "RTN", _("devuelto")
STATUS_ERROR = "ERR", _("Error")
class ShippingStatuses(models.TextChoices):
STATUS_NOT_READY = "NOT", _("no preparado")
STATUS_READY = "RDY", _("preparado")
STATUS_TO_BE_SENT = "TBS", _("listo para ser enviado")
STATUS_SENT = "SNT", _("enviado")
STATUS_DELIVERED = "DLV", _("entregado")
STATUS_FINISHED = "FIN", _("finalizado")
STATUS_CANCELED = "CAN", _("cancelado")
STATUS_REQUESTED_RETURN = "RQT", _("devolución solicitada")
STATUS_RETURNED = "RTN", _("devuelto")
uuid = models.UUIDField(default=uuid4, verbose_name=_("UUID"), db_index=True)
code = models.CharField(default=create_order_code, max_length=20, unique=True)
status = models.CharField(
max_length=3, default=Statuses.STATUS_PENDING, verbose_name=_("estado")
)
shipping_status = models.CharField(
max_length=3,
default=ShippingStatuses.STATUS_NOT_READY,
verbose_name=_("estado de envío"),
)
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")
)
@@ -536,3 +567,63 @@ class WishlistedProduct(TimestampedModel):
"user",
"product",
)
class Payment(models.Model):
class MethodChoices(models.TextChoices):
REDSYS = "REDSYS"
hash = models.UUIDField(verbose_name=_("Hash"), default=uuid4, primary_key=True)
amount = models.DecimalField(
max_digits=8,
decimal_places=2,
default=Decimal("0"),
verbose_name=_("Cantidad"),
)
order = models.ForeignKey(
"shop.Order",
on_delete=models.PROTECT,
verbose_name=_("pedido"),
related_name="payments",
)
user = models.ForeignKey(
User, blank=True, null=True, on_delete=models.PROTECT, verbose_name=_("cliente")
)
creation_date = models.DateTimeField(
auto_now_add=True, verbose_name=_("Fecha de creación")
)
metadata = models.JSONField(default=dict, verbose_name=_("Metadata"))
method = models.CharField(
max_length=6,
choices=MethodChoices.choices,
default=MethodChoices.REDSYS,
verbose_name=_("método de pago"),
)
class Meta:
verbose_name = _("Pago")
verbose_name_plural = _("Pagos")
class ShopSettings(SingletonModel):
merchant_code = models.CharField(
max_length=9,
blank=False,
null=False,
verbose_name=_("Identificación de comercio"),
)
currency_code = models.CharField(
max_length=4,
default="978",
choices=CURRENCY_CODES,
verbose_name=_("Código de moneda"),
) # 978 == EURO
terminal = models.CharField(max_length=8, verbose_name=_("Terminal"))
shared_secret = models.CharField(max_length=100, verbose_name=_("Clave de Redsys"))
class Meta:
verbose_name = _("ajustes de la tienda")
verbose_name_plural = _("ajustes de la tienda")