from django.db import models from core.models import TimeStampedModel, UUIDPrimaryKeyModel class POSConnection(UUIDPrimaryKeyModel, TimeStampedModel): class Provider(models.TextChoices): GENERIC = "generic", "Generic REST" SQUARE = "square", "Square" LIGHTSPEED = "lightspeed", "Lightspeed" BINDERPOS = "binderpos", "BinderPOS" CRYSTALCOMMERCE = "crystalcommerce", "CrystalCommerce" name = models.CharField(max_length=120) provider = models.CharField( max_length=32, choices=Provider.choices, default=Provider.GENERIC ) api_base_url = models.URLField(blank=True) api_token = models.CharField(max_length=255, blank=True) webhook_secret = models.CharField(max_length=255, blank=True) is_active = models.BooleanField(default=True) class Meta: ordering = ["name"] def __str__(self) -> str: return self.name class SyncEvent(UUIDPrimaryKeyModel, TimeStampedModel): class Direction(models.TextChoices): INBOUND = "inbound", "POS → site" OUTBOUND = "outbound", "Site → POS" class Status(models.TextChoices): PENDING = "pending", "Pending" DONE = "done", "Done" FAILED = "failed", "Failed" connection = models.ForeignKey( POSConnection, null=True, blank=True, on_delete=models.SET_NULL, related_name="events", ) direction = models.CharField(max_length=16, choices=Direction.choices) status = models.CharField( max_length=16, choices=Status.choices, default=Status.PENDING ) sku = models.CharField(max_length=64) quantity = models.IntegerField(default=0) external_id = models.CharField(max_length=255, blank=True) payload = models.JSONField(default=dict, blank=True) error = models.TextField(blank=True) class Meta: ordering = ["-created_at"] def __str__(self) -> str: return f"{self.direction} {self.sku} × {self.quantity} · {self.status}"