from django.db import models from django.db.models import Q from finance.models.base import TimestampedModel class ImportBatch(TimestampedModel): document_hash = models.CharField(max_length=64) source_format = models.CharField(max_length=16) profile = models.CharField(max_length=32) parser_version = models.CharField(max_length=32, default="1") encoding = models.CharField(max_length=32) context = models.JSONField(default=dict) section_mapping = models.JSONField(default=dict) summary = models.JSONField(default=dict) snapshot = models.JSONField(default=dict) actor_kind = models.CharField(max_length=16) actor_identifier = models.CharField(max_length=200) state = models.CharField(max_length=16, default="PREVIEW") revision = models.PositiveIntegerField(default=1) result = models.JSONField(default=dict) class Meta: constraints = [ models.CheckConstraint(condition=Q(state__in=["PREVIEW", "COMMITTED", "CANCELLED"]), name="import_batch_state"), models.CheckConstraint(condition=Q(revision__gte=1), name="import_batch_revision"), ] class ImportItem(TimestampedModel): batch = models.ForeignKey(ImportBatch, on_delete=models.PROTECT, related_name="items") locator = models.CharField(max_length=255) candidate = models.JSONField() issues = models.JSONField(default=list) duplicates = models.JSONField(default=dict) decision = models.JSONField(default=dict) class Meta: constraints = [models.UniqueConstraint(fields=["batch", "locator"], name="import_item_locator_unique")]