# Generated by Django 5.2.15 on 2026-06-15 13:32

import django.core.validators
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):

    dependencies = [
        ('billing', '0001_initial'),
        ('clients', '0001_initial'),
        ('notifications', '0001_initial'),
        ('services', '0001_initial'),
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name='EmailSuppression',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('public_id', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Criado em')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Atualizado em')),
                ('email', models.EmailField(db_index=True, max_length=254, unique=True, verbose_name='Email')),
                ('reason', models.CharField(choices=[('invalid', 'Endereço inválido'), ('bounced', 'Email devolvido'), ('requested', 'Pedido do destinatário'), ('security', 'Bloqueio de segurança'), ('other', 'Outro')], default='other', max_length=20, verbose_name='Motivo')),
                ('description', models.TextField(blank=True, verbose_name='Descrição')),
                ('is_active', models.BooleanField(db_index=True, default=True, verbose_name='Bloqueio ativo')),
            ],
            options={
                'verbose_name': 'Email bloqueado',
                'verbose_name_plural': 'Emails bloqueados',
                'ordering': ['email'],
            },
        ),
        migrations.CreateModel(
            name='HistoricalEmailSuppression',
            fields=[
                ('id', models.BigIntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')),
                ('public_id', models.UUIDField(db_index=True, default=uuid.uuid4, editable=False)),
                ('created_at', models.DateTimeField(blank=True, editable=False, verbose_name='Criado em')),
                ('updated_at', models.DateTimeField(blank=True, editable=False, verbose_name='Atualizado em')),
                ('email', models.EmailField(db_index=True, max_length=254, verbose_name='Email')),
                ('reason', models.CharField(choices=[('invalid', 'Endereço inválido'), ('bounced', 'Email devolvido'), ('requested', 'Pedido do destinatário'), ('security', 'Bloqueio de segurança'), ('other', 'Outro')], default='other', max_length=20, verbose_name='Motivo')),
                ('description', models.TextField(blank=True, verbose_name='Descrição')),
                ('is_active', models.BooleanField(db_index=True, default=True, verbose_name='Bloqueio ativo')),
                ('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)),
            ],
            options={
                'verbose_name': 'historical Email bloqueado',
                'verbose_name_plural': 'historical Emails bloqueados',
                'ordering': ('-history_date', '-history_id'),
                'get_latest_by': ('history_date', 'history_id'),
            },
            bases=(simple_history.models.HistoricalChanges, models.Model),
        ),
        migrations.CreateModel(
            name='NotificationAttempt',
            fields=[
                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('attempted_at', models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='Tentativa em')),
                ('result', models.CharField(choices=[('success', 'Sucesso'), ('failed', 'Falhou'), ('suppressed', 'Bloqueado'), ('skipped', 'Ignorado')], db_index=True, max_length=20, verbose_name='Resultado')),
                ('recipient_used', models.EmailField(blank=True, max_length=254, verbose_name='Destinatário usado')),
                ('backend', models.CharField(blank=True, max_length=255, verbose_name='Backend')),
                ('duration_ms', models.PositiveIntegerField(default=0, verbose_name='Duração (ms)')),
                ('message_id', models.CharField(blank=True, max_length=255, verbose_name='ID da mensagem')),
                ('error_message', models.TextField(blank=True, verbose_name='Erro')),
            ],
            options={
                'verbose_name': 'Tentativa de envio',
                'verbose_name_plural': 'Tentativas de envio',
                'ordering': ['-attempted_at'],
            },
        ),
        migrations.AddField(
            model_name='historicalnotificationlog',
            name='attempts_count',
            field=models.PositiveSmallIntegerField(default=0, verbose_name='Tentativas'),
        ),
        migrations.AddField(
            model_name='historicalnotificationlog',
            name='cc_recipients',
            field=models.TextField(blank=True, help_text='Emails separados por vírgula.', verbose_name='CC'),
        ),
        migrations.AddField(
            model_name='historicalnotificationlog',
            name='deduplication_key',
            field=models.CharField(blank=True, db_index=True, help_text='Impede a criação repetida da mesma comunicação automática.', max_length=180, null=True, verbose_name='Chave de duplicação'),
        ),
        migrations.AddField(
            model_name='historicalnotificationlog',
            name='delivery_mode',
            field=models.CharField(blank=True, choices=[('test', 'Teste seguro'), ('live', 'Produção'), ('console', 'Terminal / desenvolvimento'), ('internal', 'Interno')], db_index=True, max_length=20, verbose_name='Modo de envio'),
        ),
        migrations.AddField(
            model_name='historicalnotificationlog',
            name='html_body',
            field=models.TextField(blank=True, verbose_name='Mensagem HTML'),
        ),
        migrations.AddField(
            model_name='historicalnotificationlog',
            name='is_automatic',
            field=models.BooleanField(db_index=True, default=False, verbose_name='Criada automaticamente'),
        ),
        migrations.AddField(
            model_name='historicalnotificationlog',
            name='last_attempt_at',
            field=models.DateTimeField(blank=True, null=True, verbose_name='Última tentativa'),
        ),
        migrations.AddField(
            model_name='historicalnotificationlog',
            name='max_attempts',
            field=models.PositiveSmallIntegerField(default=3, validators=[django.core.validators.MinValueValidator(1)], verbose_name='Máximo de tentativas'),
        ),
        migrations.AddField(
            model_name='historicalnotificationlog',
            name='message_id',
            field=models.CharField(blank=True, max_length=255, verbose_name='ID da mensagem'),
        ),
        migrations.AddField(
            model_name='historicalnotificationlog',
            name='next_retry_at',
            field=models.DateTimeField(blank=True, db_index=True, null=True, verbose_name='Próxima tentativa'),
        ),
        migrations.AddField(
            model_name='historicalnotificationlog',
            name='original_recipient',
            field=models.CharField(blank=True, help_text='Preserva o destinatário real quando o modo de testes redireciona o envio.', max_length=250, verbose_name='Destinatário original'),
        ),
        migrations.AddField(
            model_name='historicalnotificationlog',
            name='reply_to',
            field=models.EmailField(blank=True, max_length=254, verbose_name='Responder para'),
        ),
        migrations.AddField(
            model_name='historicalnotificationlog',
            name='sent_by',
            field=models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to=settings.AUTH_USER_MODEL, verbose_name='Enviado por'),
        ),
        migrations.AddField(
            model_name='historicalnotificationtemplate',
            name='allow_automatic_send',
            field=models.BooleanField(default=True, help_text='Quando desativado, a automação cria apenas um rascunho para revisão.', verbose_name='Permitir envio automático'),
        ),
        migrations.AddField(
            model_name='historicalnotificationtemplate',
            name='html_body_template',
            field=models.TextField(blank=True, help_text='Versão HTML opcional. Se ficar vazia, é criada uma versão simples a partir do texto.', verbose_name='Mensagem HTML'),
        ),
        migrations.AddField(
            model_name='historicalnotificationtemplate',
            name='send_to_billing_contacts',
            field=models.BooleanField(default=True, help_text='Adiciona em CC os contactos do cliente marcados para receber avisos financeiros.', verbose_name='Incluir contactos financeiros'),
        ),
        migrations.AddField(
            model_name='notificationlog',
            name='attempts_count',
            field=models.PositiveSmallIntegerField(default=0, verbose_name='Tentativas'),
        ),
        migrations.AddField(
            model_name='notificationlog',
            name='cc_recipients',
            field=models.TextField(blank=True, help_text='Emails separados por vírgula.', verbose_name='CC'),
        ),
        migrations.AddField(
            model_name='notificationlog',
            name='deduplication_key',
            field=models.CharField(blank=True, help_text='Impede a criação repetida da mesma comunicação automática.', max_length=180, null=True, unique=True, verbose_name='Chave de duplicação'),
        ),
        migrations.AddField(
            model_name='notificationlog',
            name='delivery_mode',
            field=models.CharField(blank=True, choices=[('test', 'Teste seguro'), ('live', 'Produção'), ('console', 'Terminal / desenvolvimento'), ('internal', 'Interno')], db_index=True, max_length=20, verbose_name='Modo de envio'),
        ),
        migrations.AddField(
            model_name='notificationlog',
            name='html_body',
            field=models.TextField(blank=True, verbose_name='Mensagem HTML'),
        ),
        migrations.AddField(
            model_name='notificationlog',
            name='is_automatic',
            field=models.BooleanField(db_index=True, default=False, verbose_name='Criada automaticamente'),
        ),
        migrations.AddField(
            model_name='notificationlog',
            name='last_attempt_at',
            field=models.DateTimeField(blank=True, null=True, verbose_name='Última tentativa'),
        ),
        migrations.AddField(
            model_name='notificationlog',
            name='max_attempts',
            field=models.PositiveSmallIntegerField(default=3, validators=[django.core.validators.MinValueValidator(1)], verbose_name='Máximo de tentativas'),
        ),
        migrations.AddField(
            model_name='notificationlog',
            name='message_id',
            field=models.CharField(blank=True, max_length=255, verbose_name='ID da mensagem'),
        ),
        migrations.AddField(
            model_name='notificationlog',
            name='next_retry_at',
            field=models.DateTimeField(blank=True, db_index=True, null=True, verbose_name='Próxima tentativa'),
        ),
        migrations.AddField(
            model_name='notificationlog',
            name='original_recipient',
            field=models.CharField(blank=True, help_text='Preserva o destinatário real quando o modo de testes redireciona o envio.', max_length=250, verbose_name='Destinatário original'),
        ),
        migrations.AddField(
            model_name='notificationlog',
            name='reply_to',
            field=models.EmailField(blank=True, max_length=254, verbose_name='Responder para'),
        ),
        migrations.AddField(
            model_name='notificationlog',
            name='sent_by',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='sent_notifications', to=settings.AUTH_USER_MODEL, verbose_name='Enviado por'),
        ),
        migrations.AddField(
            model_name='notificationtemplate',
            name='allow_automatic_send',
            field=models.BooleanField(default=True, help_text='Quando desativado, a automação cria apenas um rascunho para revisão.', verbose_name='Permitir envio automático'),
        ),
        migrations.AddField(
            model_name='notificationtemplate',
            name='html_body_template',
            field=models.TextField(blank=True, help_text='Versão HTML opcional. Se ficar vazia, é criada uma versão simples a partir do texto.', verbose_name='Mensagem HTML'),
        ),
        migrations.AddField(
            model_name='notificationtemplate',
            name='send_to_billing_contacts',
            field=models.BooleanField(default=True, help_text='Adiciona em CC os contactos do cliente marcados para receber avisos financeiros.', verbose_name='Incluir contactos financeiros'),
        ),
        migrations.AlterField(
            model_name='historicalnotificationlog',
            name='scheduled_for',
            field=models.DateTimeField(blank=True, db_index=True, null=True, verbose_name='Agendado para'),
        ),
        migrations.AlterField(
            model_name='historicalnotificationlog',
            name='status',
            field=models.CharField(choices=[('draft', 'Rascunho'), ('scheduled', 'Agendado'), ('sending', 'A enviar'), ('sent', 'Enviado'), ('failed', 'Falhou'), ('cancelled', 'Cancelado'), ('suppressed', 'Bloqueado')], db_index=True, default='draft', max_length=20, verbose_name='Estado'),
        ),
        migrations.AlterField(
            model_name='historicalnotificationtemplate',
            name='body_template',
            field=models.TextField(help_text='Variáveis: {cliente}, {servico}, {dominio}, {data_renovacao}, {valor}, {metodo_pagamento}, {empresa}, {email_empresa}, {telefone_empresa}, {mbway}, {iban}.', verbose_name='Mensagem em texto'),
        ),
        migrations.AlterField(
            model_name='historicalnotificationtemplate',
            name='notification_type',
            field=models.CharField(choices=[('renewal_30', 'Renovação — 30 dias'), ('renewal_15', 'Renovação — 15 dias'), ('renewal_7', 'Renovação — 7 dias'), ('due', 'No dia da renovação'), ('overdue', 'Serviço vencido'), ('payment_received', 'Confirmação de pagamento'), ('renewal_confirmed', 'Confirmação de renovação'), ('general', 'Mensagem geral')], db_index=True, max_length=30, verbose_name='Tipo'),
        ),
        migrations.AlterField(
            model_name='notificationlog',
            name='scheduled_for',
            field=models.DateTimeField(blank=True, db_index=True, null=True, verbose_name='Agendado para'),
        ),
        migrations.AlterField(
            model_name='notificationlog',
            name='status',
            field=models.CharField(choices=[('draft', 'Rascunho'), ('scheduled', 'Agendado'), ('sending', 'A enviar'), ('sent', 'Enviado'), ('failed', 'Falhou'), ('cancelled', 'Cancelado'), ('suppressed', 'Bloqueado')], db_index=True, default='draft', max_length=20, verbose_name='Estado'),
        ),
        migrations.AlterField(
            model_name='notificationtemplate',
            name='body_template',
            field=models.TextField(help_text='Variáveis: {cliente}, {servico}, {dominio}, {data_renovacao}, {valor}, {metodo_pagamento}, {empresa}, {email_empresa}, {telefone_empresa}, {mbway}, {iban}.', verbose_name='Mensagem em texto'),
        ),
        migrations.AlterField(
            model_name='notificationtemplate',
            name='notification_type',
            field=models.CharField(choices=[('renewal_30', 'Renovação — 30 dias'), ('renewal_15', 'Renovação — 15 dias'), ('renewal_7', 'Renovação — 7 dias'), ('due', 'No dia da renovação'), ('overdue', 'Serviço vencido'), ('payment_received', 'Confirmação de pagamento'), ('renewal_confirmed', 'Confirmação de renovação'), ('general', 'Mensagem geral')], db_index=True, max_length=30, verbose_name='Tipo'),
        ),
        migrations.AddIndex(
            model_name='notificationlog',
            index=models.Index(fields=['status', 'next_retry_at'], name='notificatio_status_64d90d_idx'),
        ),
        migrations.AddIndex(
            model_name='notificationlog',
            index=models.Index(fields=['is_automatic', 'created_at'], name='notificatio_is_auto_38ed9e_idx'),
        ),
        migrations.AddField(
            model_name='historicalemailsuppression',
            name='history_user',
            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL),
        ),
        migrations.AddField(
            model_name='notificationattempt',
            name='notification',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attempts', to='notifications.notificationlog', verbose_name='Notificação'),
        ),
        migrations.AddField(
            model_name='notificationattempt',
            name='triggered_by',
            field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='notification_attempts', to=settings.AUTH_USER_MODEL, verbose_name='Iniciada por'),
        ),
    ]
