# Generated by Django 5.0.7 on 2026-09-03 05:54

import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models


def preserve_existing_expenses(apps, schema_editor):
    Expense = apps.get_model("shop_management", "Expense")
    for expense in Expense.objects.all().iterator():
        expense.expense_number = f"BR{expense.shop_id or 0}-EXP-{expense.payment_date.year}-{expense.pk:06d}"
        # Legacy expenses already created AccountTransaction rows, so treating
        # them as drafts would allow the same expense to be posted twice.
        expense.status = "POSTED"
        expense.posted_at = expense.created_at or expense.payment_date
        expense.save(update_fields=["expense_number", "status", "posted_at"])


class Migration(migrations.Migration):

    dependencies = [
        (
            "shop_management",
            "0093_account_account_number_account_account_type_and_more",
        ),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.AlterModelOptions(
            name="expense",
            options={"ordering": ["-payment_date", "-id"]},
        ),
        migrations.AddField(
            model_name="expense",
            name="attachment",
            field=models.FileField(blank=True, null=True, upload_to="expenses/%Y/%m/"),
        ),
        migrations.AddField(
            model_name="expense",
            name="expense_number",
            field=models.CharField(blank=True, max_length=40, null=True, unique=True),
        ),
        migrations.AddField(
            model_name="expense",
            name="posted_at",
            field=models.DateTimeField(blank=True, null=True),
        ),
        migrations.AddField(
            model_name="expense",
            name="posted_by",
            field=models.ForeignKey(
                blank=True,
                null=True,
                on_delete=django.db.models.deletion.PROTECT,
                related_name="expenses_posted",
                to=settings.AUTH_USER_MODEL,
            ),
        ),
        migrations.AddField(
            model_name="expense",
            name="status",
            field=models.CharField(
                choices=[("DRAFT", "Draft"), ("POSTED", "Posted"), ("VOID", "Void")],
                default="DRAFT",
                max_length=10,
            ),
        ),
        migrations.AddField(
            model_name="expense",
            name="void_reason",
            field=models.TextField(blank=True),
        ),
        migrations.AddField(
            model_name="expense",
            name="voided_at",
            field=models.DateTimeField(blank=True, null=True),
        ),
        migrations.AddField(
            model_name="expense",
            name="voided_by",
            field=models.ForeignKey(
                blank=True,
                null=True,
                on_delete=django.db.models.deletion.PROTECT,
                related_name="expenses_voided",
                to=settings.AUTH_USER_MODEL,
            ),
        ),
        migrations.RunPython(preserve_existing_expenses, migrations.RunPython.noop),
        migrations.AlterField(
            model_name="dailydiarylog",
            name="activity_type",
            field=models.CharField(
                choices=[
                    ("manual", "Manual"),
                    ("purchase", "Purchase"),
                    ("sale", "Sale"),
                    ("quotation", "Quotation"),
                    ("sale_payment", "Sale Payment Received"),
                    ("purchase_payment", "Purchase Payment Paid"),
                    ("customer_payment", "Customer Balance Received"),
                    ("supplier_payment", "Supplier Balance Paid"),
                    ("customer_debtor", "Loan Disbursement"),
                    ("stock_transfer", "Stock Transfer"),
                    ("expense", "Expense"),
                    ("sale_return", "Sale Return"),
                    ("purchase_return", "Purchase Return"),
                    ("payroll", "Payroll"),
                    ("advance", "Advance"),
                    ("passive_income", "Passive Income"),
                    ("account_transfer", "Account Transfer"),
                ],
                default="manual",
                max_length=32,
            ),
        ),
    ]
