from django.db import models class ExternalProject(models.Model): source = models.ForeignKey("commerce.SourceSystem", on_delete=models.PROTECT) external_id = models.CharField(max_length=255) name = models.CharField(max_length=255) code = models.CharField(max_length=255, blank=True) description = models.TextField(blank=True) archived = models.BooleanField(default=False) synced_at = models.DateTimeField(null=True, blank=True) class Meta: ordering = ["name", "pk"] constraints = [ models.UniqueConstraint( fields=["source", "external_id"], name="commerce_project_source_id" ) ] def __str__(self): return self.name class ProjectPayment(models.Model): """Outgoing cash documents; never automatically deducted from sale profit.""" source = models.ForeignKey("commerce.SourceSystem", on_delete=models.PROTECT) source_record = models.ForeignKey("commerce.SourceRecord", on_delete=models.PROTECT) project = models.ForeignKey( ExternalProject, null=True, blank=True, on_delete=models.PROTECT ) external_id = models.CharField(max_length=255) document_type = models.CharField( max_length=16, choices=[("paymentout", "Исходящий платёж"), ("cashout", "Расходный ордер")], ) number = models.CharField(max_length=255, blank=True) description = models.TextField(blank=True) expense_category = models.CharField(max_length=255, blank=True) payee = models.CharField(max_length=255, blank=True) amount = models.DecimalField(max_digits=18, decimal_places=2) currency = models.CharField(max_length=3) occurred_at = models.DateTimeField(db_index=True) applicable = models.BooleanField(default=False) missing_from_source = models.BooleanField(default=False) seen_at = models.DateTimeField() class Meta: ordering = ["-occurred_at", "-pk"] constraints = [ models.UniqueConstraint( fields=["source", "document_type", "external_id"], name="commerce_project_payment_id", ), models.CheckConstraint( condition=models.Q(amount__gte=0), name="commerce_project_payment_amount", ), ]