# Generated by Django 5.1.4 on 2024-11-04 09:12

import django.db.models.deletion
from django.db import migrations, models


class Migration(migrations.Migration):

    initial = True

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Account',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('account_id', models.CharField(max_length=64, unique=True)),
                ('settlement_policy', models.CharField(choices=[('credit_forward', 'credit_forward'), ('restate', 'restate')], default='credit_forward', max_length=32)),
                ('summaries_adopted_ordinal', models.IntegerField(blank=True, null=True)),
                ('summary_adoption_id', models.CharField(blank=True, max_length=64, null=True)),
                ('balance', models.FloatField(default=0)),
                ('amount_due', models.FloatField(default=0)),
            ],
        ),
        migrations.CreateModel(
            name='Adjustment',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('adjustment_id', models.CharField(max_length=64, unique=True)),
                ('period_key', models.CharField(max_length=16)),
                ('kind', models.CharField(max_length=32)),
                ('effective_at', models.CharField(max_length=32)),
                ('received_at', models.CharField(max_length=32)),
                ('acceptance_ordinal', models.IntegerField(blank=True, null=True)),
                ('amount', models.FloatField(blank=True, null=True)),
                ('usage_key', models.CharField(blank=True, max_length=64, null=True)),
                ('quantity', models.FloatField(blank=True, null=True)),
                ('promotion_key', models.CharField(blank=True, max_length=64, null=True)),
                ('promotion_percent', models.FloatField(blank=True, null=True)),
                ('promotion_kind', models.CharField(blank=True, max_length=16, null=True)),
                ('promotion_applies_to', models.JSONField(blank=True, default=list)),
                ('target_period_key', models.CharField(blank=True, max_length=16, null=True)),
                ('subject_key', models.CharField(blank=True, max_length=64, null=True)),
                ('replaces_adjustment_id', models.CharField(blank=True, max_length=64, null=True)),
                ('withdraws_adjustment_id', models.CharField(blank=True, max_length=64, null=True)),
                ('account', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='adjustments', to='adjustments.account')),
            ],
        ),
        migrations.CreateModel(
            name='BillingEntry',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('entry_id', models.CharField(max_length=96, unique=True)),
                ('source_type', models.CharField(max_length=16)),
                ('source_id', models.CharField(max_length=64)),
                ('amount', models.FloatField()),
                ('period_key', models.CharField(max_length=16)),
                ('invoice_id', models.CharField(max_length=64)),
                ('acceptance_ordinal', models.IntegerField(blank=True, null=True)),
                ('account', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='billing_entries', to='adjustments.account')),
            ],
        ),
        migrations.CreateModel(
            name='IntakeCheckpoint',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('adjustment_id', models.CharField(db_index=True, max_length=64)),
                ('stage', models.CharField(max_length=16)),
                ('applied_periods', models.JSONField(blank=True, default=list)),
                ('updated_at', models.DateTimeField(auto_now=True)),
                ('account', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='checkpoints', to='adjustments.account')),
            ],
            options={
                'unique_together': {('account', 'adjustment_id')},
            },
        ),
        migrations.CreateModel(
            name='Invoice',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('invoice_id', models.CharField(max_length=64, unique=True)),
                ('period_key', models.CharField(max_length=16)),
                ('period_starts_on', models.CharField(default='', max_length=16)),
                ('period_ends_on', models.CharField(default='', max_length=16)),
                ('rule_set_key', models.CharField(default='', max_length=64)),
                ('total', models.FloatField()),
                ('issued_total', models.FloatField(blank=True, null=True)),
                ('closed', models.BooleanField(default=False)),
                ('issued', models.BooleanField(default=False)),
                ('revision_of', models.CharField(blank=True, max_length=64, null=True)),
                ('selected_exclusive_promotion', models.CharField(blank=True, max_length=64, null=True)),
                ('non_selected_exclusive_promotions', models.JSONField(blank=True, default=list)),
                ('base_state', models.JSONField(blank=True, default=dict)),
                ('account', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='invoices', to='adjustments.account')),
            ],
        ),
        migrations.CreateModel(
            name='AdjustmentRecord',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('record_id', models.CharField(max_length=96, unique=True)),
                ('adjustment_id', models.CharField(db_index=True, max_length=64)),
                ('acceptance_ordinal', models.IntegerField()),
                ('target_period', models.CharField(max_length=16)),
                ('delta', models.FloatField()),
                ('prior_recorded_total', models.FloatField()),
                ('resulting_total', models.FloatField()),
                ('policy', models.CharField(default='', max_length=32)),
                ('effective_at', models.CharField(max_length=32)),
                ('applied_period', models.CharField(blank=True, max_length=32, null=True)),
                ('replacement_invoice_id', models.CharField(blank=True, max_length=64, null=True)),
                ('void_amount', models.FloatField(blank=True, null=True)),
                ('reissue_amount', models.FloatField(blank=True, null=True)),
                ('replaces_adjustment_id', models.CharField(blank=True, max_length=64, null=True)),
                ('withdraws_adjustment_id', models.CharField(blank=True, max_length=64, null=True)),
                ('account', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='records', to='adjustments.account')),
                ('original_invoice', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='records', to='adjustments.invoice')),
            ],
        ),
        migrations.CreateModel(
            name='LineItem',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('usage_key', models.CharField(max_length=64)),
                ('description', models.CharField(max_length=255)),
                ('quantity', models.FloatField()),
                ('base', models.FloatField()),
                ('net', models.FloatField()),
                ('tax', models.FloatField()),
                ('total', models.FloatField()),
                ('invoice', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='line_items', to='adjustments.invoice')),
            ],
        ),
        migrations.CreateModel(
            name='ReceivableEntry',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('run_id', models.CharField(max_length=64, unique=True)),
                ('predecessor_run_id', models.CharField(blank=True, max_length=64, null=True)),
                ('prior_demand', models.FloatField()),
                ('demand', models.FloatField()),
                ('incremental_demand', models.FloatField()),
                ('account', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='receivable_entries', to='adjustments.account')),
            ],
        ),
        migrations.CreateModel(
            name='StatementRun',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('run_id', models.CharField(max_length=64, unique=True)),
                ('run_number', models.IntegerField()),
                ('operation_id', models.CharField(max_length=64)),
                ('predecessor_run_id', models.CharField(blank=True, max_length=64, null=True)),
                ('previous_cutoff_ordinal', models.IntegerField(default=0)),
                ('cutoff_ordinal', models.IntegerField()),
                ('status', models.CharField(default='started', max_length=16)),
                ('recorded_demand', models.FloatField(blank=True, null=True)),
                ('incremental_demand', models.FloatField(blank=True, null=True)),
                ('account', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='statement_runs', to='adjustments.account')),
            ],
        ),
        migrations.CreateModel(
            name='RunMembership',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('adjustment_id', models.CharField(max_length=64)),
                ('acceptance_ordinal', models.IntegerField()),
                ('original_invoice_id', models.CharField(max_length=64)),
                ('record', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='adjustments.adjustmentrecord')),
                ('run', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='membership', to='adjustments.statementrun')),
            ],
            options={
                'ordering': ['acceptance_ordinal'],
            },
        ),
        migrations.CreateModel(
            name='RunSummaryEntry',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('invoice_id', models.CharField(max_length=64)),
                ('member_count', models.IntegerField()),
                ('member_delta_total', models.FloatField()),
                ('run', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reconciliation_summary', to='adjustments.statementrun')),
            ],
            options={
                'ordering': ['invoice_id'],
                'unique_together': {('run', 'invoice_id')},
            },
        ),
    ]
