Corp/backend/commerce/models/projects.py

61 lines
2.3 KiB
Python

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",
),
]