# Generated by Django 4.2.28 on 2026-07-08 13:16

from decimal import Decimal
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):
    initial = True

    dependencies = [
        ("users", "0006_remove_rolepermission_role_permis_role_056d99_idx_and_more"),
        ("loans", "0029_loan_approved_by_loan_created_by_loan_disbursed_by_and_more"),
        ("expenses", "0003_make_branch_nullable"),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name="Account",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True,
                        primary_key=True,
                        serialize=False,
                        verbose_name="ID",
                    ),
                ),
                ("code", models.CharField(db_index=True, max_length=20, unique=True)),
                ("name", models.CharField(max_length=200)),
                (
                    "account_type",
                    models.CharField(
                        choices=[
                            ("asset", "Asset"),
                            ("liability", "Liability"),
                            ("equity", "Equity"),
                            ("income", "Income"),
                            ("expense", "Expense"),
                        ],
                        max_length=20,
                    ),
                ),
                ("subtype", models.CharField(blank=True, max_length=30, null=True)),
                ("description", models.TextField()),
                ("is_active", models.BooleanField(default=True)),
                ("is_system_account", models.BooleanField(default=False)),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                ("updated_at", models.DateTimeField(auto_now=True)),
                (
                    "created_by",
                    models.ForeignKey(
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
                (
                    "parent_account",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="child_accounts",
                        to="accounting.account",
                    ),
                ),
            ],
            options={
                "db_table": "accounting_accounts",
                "ordering": ["code"],
            },
        ),
        migrations.CreateModel(
            name="JournalEntry",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True,
                        primary_key=True,
                        serialize=False,
                        verbose_name="ID",
                    ),
                ),
                (
                    "reference_number",
                    models.CharField(db_index=True, max_length=50, unique=True),
                ),
                ("transaction_date", models.DateField(db_index=True)),
                ("description", models.TextField()),
                (
                    "status",
                    models.CharField(
                        choices=[
                            ("draft", "Draft"),
                            ("posted", "Posted"),
                            ("reversed", "Reversed"),
                        ],
                        default="draft",
                        max_length=10,
                    ),
                ),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                ("updated_at", models.DateTimeField(auto_now=True)),
                ("posted_at", models.DateTimeField(blank=True, null=True)),
                (
                    "branch",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="journal_entries",
                        to="users.branch",
                    ),
                ),
                (
                    "created_by",
                    models.ForeignKey(
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="created_journal_entries",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
                (
                    "expense",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="journal_entries",
                        to="expenses.expense",
                    ),
                ),
                (
                    "loan",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="journal_entries",
                        to="loans.loan",
                    ),
                ),
                (
                    "posted_by",
                    models.ForeignKey(
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="posted_journal_entries",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
                (
                    "reverses",
                    models.OneToOneField(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="reversed_by",
                        to="accounting.journalentry",
                    ),
                ),
            ],
            options={
                "db_table": "accounting_journal_entries",
                "ordering": ["-transaction_date", "-created_at"],
            },
        ),
        migrations.CreateModel(
            name="JournalEntryLine",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True,
                        primary_key=True,
                        serialize=False,
                        verbose_name="ID",
                    ),
                ),
                ("description", models.CharField(max_length=500)),
                (
                    "debit_amount",
                    models.DecimalField(
                        decimal_places=2, default=Decimal("0.00"), max_digits=15
                    ),
                ),
                (
                    "credit_amount",
                    models.DecimalField(
                        decimal_places=2, default=Decimal("0.00"), max_digits=15
                    ),
                ),
                ("line_number", models.PositiveIntegerField()),
                (
                    "account",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.PROTECT,
                        related_name="journal_lines",
                        to="accounting.account",
                    ),
                ),
                (
                    "journal_entry",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="lines",
                        to="accounting.journalentry",
                    ),
                ),
            ],
            options={
                "db_table": "accounting_journal_entry_lines",
                "ordering": ["journal_entry", "line_number"],
            },
        ),
        migrations.CreateModel(
            name="GeneralLedger",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True,
                        primary_key=True,
                        serialize=False,
                        verbose_name="ID",
                    ),
                ),
                ("transaction_date", models.DateField(db_index=True)),
                ("description", models.TextField()),
                ("reference_number", models.CharField(db_index=True, max_length=50)),
                (
                    "debit_amount",
                    models.DecimalField(
                        decimal_places=2, default=Decimal("0.00"), max_digits=15
                    ),
                ),
                (
                    "credit_amount",
                    models.DecimalField(
                        decimal_places=2, default=Decimal("0.00"), max_digits=15
                    ),
                ),
                ("balance", models.DecimalField(decimal_places=2, max_digits=15)),
                ("posted_at", models.DateTimeField(db_index=True)),
                (
                    "account",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.PROTECT,
                        related_name="ledger_entries",
                        to="accounting.account",
                    ),
                ),
                (
                    "branch",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="ledger_entries",
                        to="users.branch",
                    ),
                ),
                (
                    "journal_entry",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.PROTECT,
                        related_name="ledger_postings",
                        to="accounting.journalentry",
                    ),
                ),
                (
                    "journal_entry_line",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.PROTECT,
                        related_name="ledger_posting",
                        to="accounting.journalentryline",
                    ),
                ),
                (
                    "posted_by",
                    models.ForeignKey(
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
            ],
            options={
                "db_table": "accounting_general_ledger",
                "ordering": ["account", "transaction_date", "posted_at"],
            },
        ),
        migrations.CreateModel(
            name="FiscalPeriod",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True,
                        primary_key=True,
                        serialize=False,
                        verbose_name="ID",
                    ),
                ),
                ("name", models.CharField(max_length=50, unique=True)),
                (
                    "period_type",
                    models.CharField(
                        choices=[
                            ("monthly", "Monthly"),
                            ("quarterly", "Quarterly"),
                            ("annual", "Annual"),
                        ],
                        max_length=20,
                    ),
                ),
                ("start_date", models.DateField(db_index=True)),
                ("end_date", models.DateField(db_index=True)),
                (
                    "status",
                    models.CharField(
                        choices=[("open", "Open"), ("closed", "Closed")],
                        default="open",
                        max_length=10,
                    ),
                ),
                ("closed_at", models.DateTimeField(blank=True, null=True)),
                ("opening_balances", models.JSONField(blank=True, default=dict)),
                ("closing_balances", models.JSONField(blank=True, default=dict)),
                ("created_at", models.DateTimeField(auto_now_add=True)),
                ("updated_at", models.DateTimeField(auto_now=True)),
                (
                    "closed_by",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.SET_NULL,
                        related_name="closed_periods",
                        to=settings.AUTH_USER_MODEL,
                    ),
                ),
            ],
            options={
                "db_table": "accounting_fiscal_periods",
                "ordering": ["-start_date"],
            },
        ),
        migrations.CreateModel(
            name="AccountBalance",
            fields=[
                (
                    "id",
                    models.BigAutoField(
                        auto_created=True,
                        primary_key=True,
                        serialize=False,
                        verbose_name="ID",
                    ),
                ),
                ("as_of_date", models.DateField(db_index=True)),
                ("debit_balance", models.DecimalField(decimal_places=2, max_digits=15)),
                (
                    "credit_balance",
                    models.DecimalField(decimal_places=2, max_digits=15),
                ),
                ("net_balance", models.DecimalField(decimal_places=2, max_digits=15)),
                ("updated_at", models.DateTimeField(auto_now=True)),
                (
                    "account",
                    models.ForeignKey(
                        on_delete=django.db.models.deletion.CASCADE,
                        related_name="cached_balances",
                        to="accounting.account",
                    ),
                ),
                (
                    "branch",
                    models.ForeignKey(
                        blank=True,
                        null=True,
                        on_delete=django.db.models.deletion.CASCADE,
                        to="users.branch",
                    ),
                ),
            ],
            options={
                "db_table": "accounting_account_balances",
            },
        ),
        migrations.AddIndex(
            model_name="journalentryline",
            index=models.Index(
                fields=["journal_entry", "line_number"],
                name="accounting__journal_399477_idx",
            ),
        ),
        migrations.AddIndex(
            model_name="journalentryline",
            index=models.Index(
                fields=["account"], name="accounting__account_cbc3e2_idx"
            ),
        ),
        migrations.AddIndex(
            model_name="journalentry",
            index=models.Index(
                fields=["status", "transaction_date"],
                name="accounting__status_b81a0b_idx",
            ),
        ),
        migrations.AddIndex(
            model_name="journalentry",
            index=models.Index(
                fields=["branch", "transaction_date"],
                name="accounting__branch__b001d4_idx",
            ),
        ),
        migrations.AddIndex(
            model_name="journalentry",
            index=models.Index(fields=["loan"], name="accounting__loan_id_f360c5_idx"),
        ),
        migrations.AddIndex(
            model_name="journalentry",
            index=models.Index(
                fields=["expense"], name="accounting__expense_d3b86e_idx"
            ),
        ),
        migrations.AddIndex(
            model_name="generalledger",
            index=models.Index(
                fields=["account", "transaction_date"],
                name="accounting__account_4ee7c7_idx",
            ),
        ),
        migrations.AddIndex(
            model_name="generalledger",
            index=models.Index(
                fields=["transaction_date"], name="accounting__transac_c744dd_idx"
            ),
        ),
        migrations.AddIndex(
            model_name="generalledger",
            index=models.Index(
                fields=["branch", "transaction_date"],
                name="accounting__branch__e1fcc6_idx",
            ),
        ),
        migrations.AddIndex(
            model_name="generalledger",
            index=models.Index(
                fields=["reference_number"], name="accounting__referen_3d6a3e_idx"
            ),
        ),
        migrations.AddIndex(
            model_name="fiscalperiod",
            index=models.Index(
                fields=["status", "start_date", "end_date"],
                name="accounting__status_c81cf6_idx",
            ),
        ),
        migrations.AddIndex(
            model_name="accountbalance",
            index=models.Index(
                fields=["account", "as_of_date"], name="accounting__account_733d24_idx"
            ),
        ),
        migrations.AddIndex(
            model_name="accountbalance",
            index=models.Index(
                fields=["as_of_date"], name="accounting__as_of_d_a6c5fa_idx"
            ),
        ),
        migrations.AlterUniqueTogether(
            name="accountbalance",
            unique_together={("account", "branch", "as_of_date")},
        ),
        migrations.AddIndex(
            model_name="account",
            index=models.Index(
                fields=["account_type", "is_active"],
                name="accounting__account_aa34fc_idx",
            ),
        ),
        migrations.AddIndex(
            model_name="account",
            index=models.Index(
                fields=["parent_account", "is_active"],
                name="accounting__parent__60932b_idx",
            ),
        ),
    ]
