760 lines
29 KiB
Python
760 lines
29 KiB
Python
# Generated by Django 5.2.7 on 2025-10-27 10:50
|
|
|
|
import django.db.models.deletion
|
|
import simple_history.models
|
|
import uuid
|
|
from django.conf import settings
|
|
from django.db import migrations, models
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
initial = True
|
|
|
|
dependencies = [
|
|
("appointments", "0001_initial"),
|
|
("core", "0001_initial"),
|
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
]
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name="Payer",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At")),
|
|
("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated At")),
|
|
("name", models.CharField(max_length=200, verbose_name="Payer Name")),
|
|
(
|
|
"payer_type",
|
|
models.CharField(
|
|
choices=[
|
|
("SELF", "Self Pay"),
|
|
("INSURANCE", "Insurance"),
|
|
("GOVERNMENT", "Government"),
|
|
("CORPORATE", "Corporate"),
|
|
],
|
|
default="SELF",
|
|
max_length=20,
|
|
verbose_name="Payer Type",
|
|
),
|
|
),
|
|
(
|
|
"policy_number",
|
|
models.CharField(blank=True, max_length=100, verbose_name="Policy Number"),
|
|
),
|
|
(
|
|
"coverage_percentage",
|
|
models.DecimalField(
|
|
decimal_places=2,
|
|
default=0,
|
|
help_text="Percentage of costs covered (0-100)",
|
|
max_digits=5,
|
|
verbose_name="Coverage %",
|
|
),
|
|
),
|
|
("is_active", models.BooleanField(default=True, verbose_name="Is Active")),
|
|
("notes", models.TextField(blank=True, verbose_name="Notes")),
|
|
(
|
|
"patient",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="payers",
|
|
to="core.patient",
|
|
verbose_name="Patient",
|
|
),
|
|
),
|
|
(
|
|
"tenant",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="%(app_label)s_%(class)s_related",
|
|
to="core.tenant",
|
|
verbose_name="Tenant",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Payer",
|
|
"verbose_name_plural": "Payers",
|
|
"ordering": ["patient", "name"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="Invoice",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At")),
|
|
("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated At")),
|
|
(
|
|
"invoice_number",
|
|
models.CharField(
|
|
editable=False, max_length=20, unique=True, verbose_name="Invoice Number"
|
|
),
|
|
),
|
|
("issue_date", models.DateField(verbose_name="Issue Date")),
|
|
("due_date", models.DateField(verbose_name="Due Date")),
|
|
(
|
|
"subtotal",
|
|
models.DecimalField(
|
|
decimal_places=2, default=0.0, max_digits=10, verbose_name="Subtotal"
|
|
),
|
|
),
|
|
(
|
|
"tax",
|
|
models.DecimalField(
|
|
decimal_places=2, default=0.0, max_digits=10, verbose_name="Tax (VAT)"
|
|
),
|
|
),
|
|
(
|
|
"discount",
|
|
models.DecimalField(
|
|
decimal_places=2, default=0.0, max_digits=10, verbose_name="Discount"
|
|
),
|
|
),
|
|
(
|
|
"total",
|
|
models.DecimalField(
|
|
decimal_places=2, default=0.0, max_digits=10, verbose_name="Total"
|
|
),
|
|
),
|
|
(
|
|
"status",
|
|
models.CharField(
|
|
choices=[
|
|
("DRAFT", "Draft"),
|
|
("ISSUED", "Issued"),
|
|
("PAID", "Paid"),
|
|
("PARTIALLY_PAID", "Partially Paid"),
|
|
("CANCELLED", "Cancelled"),
|
|
("OVERDUE", "Overdue"),
|
|
],
|
|
default="DRAFT",
|
|
max_length=20,
|
|
verbose_name="Status",
|
|
),
|
|
),
|
|
("notes", models.TextField(blank=True, verbose_name="Notes")),
|
|
(
|
|
"appointment",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="invoices",
|
|
to="appointments.appointment",
|
|
verbose_name="Appointment",
|
|
),
|
|
),
|
|
(
|
|
"patient",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="invoices",
|
|
to="core.patient",
|
|
verbose_name="Patient",
|
|
),
|
|
),
|
|
(
|
|
"tenant",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="%(app_label)s_%(class)s_related",
|
|
to="core.tenant",
|
|
verbose_name="Tenant",
|
|
),
|
|
),
|
|
(
|
|
"payer",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="invoices",
|
|
to="finance.payer",
|
|
verbose_name="Payer",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Invoice",
|
|
"verbose_name_plural": "Invoices",
|
|
"ordering": ["-issue_date", "-invoice_number"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="HistoricalInvoice",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
db_index=True, default=uuid.uuid4, editable=False, verbose_name="ID"
|
|
),
|
|
),
|
|
(
|
|
"created_at",
|
|
models.DateTimeField(blank=True, editable=False, verbose_name="Created At"),
|
|
),
|
|
(
|
|
"updated_at",
|
|
models.DateTimeField(blank=True, editable=False, verbose_name="Updated At"),
|
|
),
|
|
(
|
|
"invoice_number",
|
|
models.CharField(
|
|
db_index=True, editable=False, max_length=20, verbose_name="Invoice Number"
|
|
),
|
|
),
|
|
("issue_date", models.DateField(verbose_name="Issue Date")),
|
|
("due_date", models.DateField(verbose_name="Due Date")),
|
|
(
|
|
"subtotal",
|
|
models.DecimalField(
|
|
decimal_places=2, default=0.0, max_digits=10, verbose_name="Subtotal"
|
|
),
|
|
),
|
|
(
|
|
"tax",
|
|
models.DecimalField(
|
|
decimal_places=2, default=0.0, max_digits=10, verbose_name="Tax (VAT)"
|
|
),
|
|
),
|
|
(
|
|
"discount",
|
|
models.DecimalField(
|
|
decimal_places=2, default=0.0, max_digits=10, verbose_name="Discount"
|
|
),
|
|
),
|
|
(
|
|
"total",
|
|
models.DecimalField(
|
|
decimal_places=2, default=0.0, max_digits=10, verbose_name="Total"
|
|
),
|
|
),
|
|
(
|
|
"status",
|
|
models.CharField(
|
|
choices=[
|
|
("DRAFT", "Draft"),
|
|
("ISSUED", "Issued"),
|
|
("PAID", "Paid"),
|
|
("PARTIALLY_PAID", "Partially Paid"),
|
|
("CANCELLED", "Cancelled"),
|
|
("OVERDUE", "Overdue"),
|
|
],
|
|
default="DRAFT",
|
|
max_length=20,
|
|
verbose_name="Status",
|
|
),
|
|
),
|
|
("notes", models.TextField(blank=True, verbose_name="Notes")),
|
|
("history_id", models.AutoField(primary_key=True, serialize=False)),
|
|
("history_date", models.DateTimeField(db_index=True)),
|
|
("history_change_reason", models.CharField(max_length=100, null=True)),
|
|
(
|
|
"history_type",
|
|
models.CharField(
|
|
choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")], max_length=1
|
|
),
|
|
),
|
|
(
|
|
"appointment",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
db_constraint=False,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.DO_NOTHING,
|
|
related_name="+",
|
|
to="appointments.appointment",
|
|
verbose_name="Appointment",
|
|
),
|
|
),
|
|
(
|
|
"history_user",
|
|
models.ForeignKey(
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="+",
|
|
to=settings.AUTH_USER_MODEL,
|
|
),
|
|
),
|
|
(
|
|
"patient",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
db_constraint=False,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.DO_NOTHING,
|
|
related_name="+",
|
|
to="core.patient",
|
|
verbose_name="Patient",
|
|
),
|
|
),
|
|
(
|
|
"tenant",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
db_constraint=False,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.DO_NOTHING,
|
|
related_name="+",
|
|
to="core.tenant",
|
|
verbose_name="Tenant",
|
|
),
|
|
),
|
|
(
|
|
"payer",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
db_constraint=False,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.DO_NOTHING,
|
|
related_name="+",
|
|
to="finance.payer",
|
|
verbose_name="Payer",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "historical Invoice",
|
|
"verbose_name_plural": "historical Invoices",
|
|
"ordering": ("-history_date", "-history_id"),
|
|
"get_latest_by": ("history_date", "history_id"),
|
|
},
|
|
bases=(simple_history.models.HistoricalChanges, models.Model),
|
|
),
|
|
migrations.CreateModel(
|
|
name="Payment",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At")),
|
|
("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated At")),
|
|
("payment_date", models.DateTimeField(verbose_name="Payment Date")),
|
|
(
|
|
"amount",
|
|
models.DecimalField(
|
|
decimal_places=2, default=0.0, max_digits=10, verbose_name="Amount"
|
|
),
|
|
),
|
|
(
|
|
"method",
|
|
models.CharField(
|
|
choices=[
|
|
("CASH", "Cash"),
|
|
("CARD", "Credit/Debit Card"),
|
|
("BANK_TRANSFER", "Bank Transfer"),
|
|
("INSURANCE", "Insurance"),
|
|
("CHECK", "Check"),
|
|
("OTHER", "Other"),
|
|
],
|
|
max_length=20,
|
|
verbose_name="Payment Method",
|
|
),
|
|
),
|
|
(
|
|
"transaction_id",
|
|
models.CharField(blank=True, max_length=100, verbose_name="Transaction ID"),
|
|
),
|
|
(
|
|
"reference",
|
|
models.CharField(blank=True, max_length=200, verbose_name="Reference"),
|
|
),
|
|
(
|
|
"status",
|
|
models.CharField(
|
|
choices=[
|
|
("PENDING", "Pending"),
|
|
("COMPLETED", "Completed"),
|
|
("FAILED", "Failed"),
|
|
("REFUNDED", "Refunded"),
|
|
],
|
|
default="PENDING",
|
|
max_length=20,
|
|
verbose_name="Status",
|
|
),
|
|
),
|
|
("notes", models.TextField(blank=True, verbose_name="Notes")),
|
|
(
|
|
"invoice",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="payments",
|
|
to="finance.invoice",
|
|
verbose_name="Invoice",
|
|
),
|
|
),
|
|
(
|
|
"processed_by",
|
|
models.ForeignKey(
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="processed_payments",
|
|
to=settings.AUTH_USER_MODEL,
|
|
verbose_name="Processed By",
|
|
),
|
|
),
|
|
(
|
|
"tenant",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="%(app_label)s_%(class)s_related",
|
|
to="core.tenant",
|
|
verbose_name="Tenant",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Payment",
|
|
"verbose_name_plural": "Payments",
|
|
"ordering": ["-payment_date"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="Service",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At")),
|
|
("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated At")),
|
|
("code", models.CharField(max_length=50, verbose_name="Service Code")),
|
|
("name_en", models.CharField(max_length=200, verbose_name="Name (English)")),
|
|
(
|
|
"name_ar",
|
|
models.CharField(blank=True, max_length=200, verbose_name="Name (Arabic)"),
|
|
),
|
|
(
|
|
"base_price",
|
|
models.DecimalField(
|
|
decimal_places=2, default=0.0, max_digits=10, verbose_name="Base Price"
|
|
),
|
|
),
|
|
(
|
|
"duration_minutes",
|
|
models.PositiveIntegerField(default=30, verbose_name="Duration (minutes)"),
|
|
),
|
|
("is_active", models.BooleanField(default=True, verbose_name="Is Active")),
|
|
("description", models.TextField(blank=True, verbose_name="Description")),
|
|
(
|
|
"clinic",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="services",
|
|
to="core.clinic",
|
|
verbose_name="Clinic",
|
|
),
|
|
),
|
|
(
|
|
"tenant",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="%(app_label)s_%(class)s_related",
|
|
to="core.tenant",
|
|
verbose_name="Tenant",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Service",
|
|
"verbose_name_plural": "Services",
|
|
"ordering": ["clinic", "name_en"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="Package",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At")),
|
|
("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated At")),
|
|
("name_en", models.CharField(max_length=200, verbose_name="Name (English)")),
|
|
(
|
|
"name_ar",
|
|
models.CharField(blank=True, max_length=200, verbose_name="Name (Arabic)"),
|
|
),
|
|
("total_sessions", models.PositiveIntegerField(verbose_name="Total Sessions")),
|
|
(
|
|
"price",
|
|
models.DecimalField(
|
|
decimal_places=2, default=0.0, max_digits=10, verbose_name="Package Price"
|
|
),
|
|
),
|
|
(
|
|
"validity_days",
|
|
models.PositiveIntegerField(
|
|
default=90,
|
|
help_text="Number of days the package is valid after purchase",
|
|
verbose_name="Validity (days)",
|
|
),
|
|
),
|
|
("is_active", models.BooleanField(default=True, verbose_name="Is Active")),
|
|
("description", models.TextField(blank=True, verbose_name="Description")),
|
|
(
|
|
"tenant",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="%(app_label)s_%(class)s_related",
|
|
to="core.tenant",
|
|
verbose_name="Tenant",
|
|
),
|
|
),
|
|
(
|
|
"services",
|
|
models.ManyToManyField(
|
|
related_name="packages", to="finance.service", verbose_name="Services"
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Package",
|
|
"verbose_name_plural": "Packages",
|
|
"ordering": ["name_en"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="InvoiceLineItem",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
(
|
|
"description",
|
|
models.CharField(
|
|
blank=True, max_length=500, null=True, verbose_name="Description"
|
|
),
|
|
),
|
|
("quantity", models.PositiveIntegerField(default=1, verbose_name="Quantity")),
|
|
(
|
|
"unit_price",
|
|
models.DecimalField(
|
|
decimal_places=2, default=0.0, max_digits=10, verbose_name="Unit Price"
|
|
),
|
|
),
|
|
(
|
|
"total",
|
|
models.DecimalField(
|
|
decimal_places=2, default=0.0, max_digits=10, verbose_name="Total"
|
|
),
|
|
),
|
|
(
|
|
"invoice",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="line_items",
|
|
to="finance.invoice",
|
|
verbose_name="Invoice",
|
|
),
|
|
),
|
|
(
|
|
"package",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="invoice_line_items",
|
|
to="finance.package",
|
|
verbose_name="Package",
|
|
),
|
|
),
|
|
(
|
|
"service",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="invoice_line_items",
|
|
to="finance.service",
|
|
verbose_name="Service",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Invoice Line Item",
|
|
"verbose_name_plural": "Invoice Line Items",
|
|
"ordering": ["invoice", "id"],
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name="PackagePurchase",
|
|
fields=[
|
|
(
|
|
"id",
|
|
models.UUIDField(
|
|
default=uuid.uuid4,
|
|
editable=False,
|
|
primary_key=True,
|
|
serialize=False,
|
|
verbose_name="ID",
|
|
),
|
|
),
|
|
("created_at", models.DateTimeField(auto_now_add=True, verbose_name="Created At")),
|
|
("updated_at", models.DateTimeField(auto_now=True, verbose_name="Updated At")),
|
|
("purchase_date", models.DateField(verbose_name="Purchase Date")),
|
|
("expiry_date", models.DateField(verbose_name="Expiry Date")),
|
|
("total_sessions", models.PositiveIntegerField(verbose_name="Total Sessions")),
|
|
(
|
|
"sessions_used",
|
|
models.PositiveIntegerField(default=0, verbose_name="Sessions Used"),
|
|
),
|
|
(
|
|
"status",
|
|
models.CharField(
|
|
choices=[
|
|
("ACTIVE", "Active"),
|
|
("EXPIRED", "Expired"),
|
|
("COMPLETED", "Completed"),
|
|
("CANCELLED", "Cancelled"),
|
|
],
|
|
default="ACTIVE",
|
|
max_length=20,
|
|
verbose_name="Status",
|
|
),
|
|
),
|
|
(
|
|
"invoice",
|
|
models.ForeignKey(
|
|
blank=True,
|
|
null=True,
|
|
on_delete=django.db.models.deletion.SET_NULL,
|
|
related_name="package_purchases",
|
|
to="finance.invoice",
|
|
verbose_name="Invoice",
|
|
),
|
|
),
|
|
(
|
|
"package",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="purchases",
|
|
to="finance.package",
|
|
verbose_name="Package",
|
|
),
|
|
),
|
|
(
|
|
"patient",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="package_purchases",
|
|
to="core.patient",
|
|
verbose_name="Patient",
|
|
),
|
|
),
|
|
(
|
|
"tenant",
|
|
models.ForeignKey(
|
|
on_delete=django.db.models.deletion.CASCADE,
|
|
related_name="%(app_label)s_%(class)s_related",
|
|
to="core.tenant",
|
|
verbose_name="Tenant",
|
|
),
|
|
),
|
|
],
|
|
options={
|
|
"verbose_name": "Package Purchase",
|
|
"verbose_name_plural": "Package Purchases",
|
|
"ordering": ["-purchase_date"],
|
|
"indexes": [
|
|
models.Index(
|
|
fields=["patient", "status"], name="finance_pac_patient_be5189_idx"
|
|
),
|
|
models.Index(
|
|
fields=["expiry_date", "status"], name="finance_pac_expiry__2283b7_idx"
|
|
),
|
|
],
|
|
},
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="invoice",
|
|
index=models.Index(fields=["invoice_number"], name="finance_inv_invoice_89da8a_idx"),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="invoice",
|
|
index=models.Index(
|
|
fields=["patient", "issue_date"], name="finance_inv_patient_909038_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="invoice",
|
|
index=models.Index(
|
|
fields=["status", "issue_date"], name="finance_inv_status_7e531e_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="invoice",
|
|
index=models.Index(
|
|
fields=["tenant", "issue_date"], name="finance_inv_tenant__c5242e_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="payment",
|
|
index=models.Index(
|
|
fields=["invoice", "payment_date"], name="finance_pay_invoice_8fca2f_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="payment",
|
|
index=models.Index(
|
|
fields=["status", "payment_date"], name="finance_pay_status_549635_idx"
|
|
),
|
|
),
|
|
migrations.AddIndex(
|
|
model_name="payment",
|
|
index=models.Index(
|
|
fields=["tenant", "payment_date"], name="finance_pay_tenant__c6da43_idx"
|
|
),
|
|
),
|
|
migrations.AlterUniqueTogether(
|
|
name="service",
|
|
unique_together={("tenant", "code")},
|
|
),
|
|
]
|