# Generated by Django 6.1 on 2026-08-14 17:39 import django.db.models.deletion import uuid from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='SystemSetting', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('global_budget', models.DecimalField(decimal_places=2, default=25000000.0, max_digits=15, verbose_name='Presupuesto General I+D+i')), ('usd_exchange_rate', models.DecimalField(decimal_places=2, default=950.0, max_digits=10, verbose_name='Tasa USD/CLP por Defecto')), ], options={ 'verbose_name': 'Configuración del Sistema', 'verbose_name_plural': 'Configuraciones del Sistema', }, ), migrations.CreateModel( name='AuditLog', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('action', models.CharField(max_length=100, verbose_name='Acción')), ('entity_name', models.CharField(blank=True, max_length=100, null=True, verbose_name='Entidad (Tabla)')), ('entity_id', models.CharField(blank=True, max_length=100, null=True, verbose_name='ID Entidad')), ('field_changed', models.CharField(blank=True, max_length=100, null=True, verbose_name='Campo Modificado')), ('old_value', models.TextField(blank=True, null=True, verbose_name='Valor Anterior')), ('new_value', models.TextField(blank=True, null=True, verbose_name='Valor Nuevo')), ('description', models.TextField(verbose_name='Detalle del Cambio')), ('timestamp', models.DateTimeField(auto_now_add=True, verbose_name='Fecha y Hora')), ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Usuario')), ], options={ 'verbose_name': 'Log de Auditoría (SAP CDHDR/CDPOS)', 'verbose_name_plural': 'Logs de Auditoría', 'ordering': ['-timestamp'], }, ), migrations.CreateModel( name='Category', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('code', models.CharField(max_length=10, unique=True, verbose_name='Código de Categoría')), ('name', models.CharField(max_length=100, verbose_name='Nombre de Categoría')), ('description', models.TextField(blank=True, verbose_name='Descripción')), ('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='subcategories', to='expenses.category')), ], options={ 'verbose_name': 'Categoría', 'verbose_name_plural': 'Categorías', }, ), migrations.CreateModel( name='Expense', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('expense_code', models.CharField(default=uuid.uuid4, max_length=50, unique=True, verbose_name='Código Transacción')), ('amount_clp', models.DecimalField(decimal_places=2, max_digits=15, verbose_name='Monto Neto (CLP)')), ('amount_usd', models.DecimalField(decimal_places=2, max_digits=15, verbose_name='Monto Neto (USD)')), ('currency', models.CharField(choices=[('CLP', 'Pesos Chilenos'), ('USD', 'Dólares Estadounidenses')], default='CLP', max_length=10, verbose_name='Moneda Original')), ('exchange_rate', models.DecimalField(decimal_places=2, default=950.0, max_digits=10, verbose_name='Tipo de Cambio')), ('description', models.TextField(verbose_name='Detalle de Imputación')), ('date', models.DateField(verbose_name='Fecha del Gasto')), ('vendor', models.CharField(blank=True, max_length=200, null=True, verbose_name='Proveedor / Emisor')), ('region', models.CharField(blank=True, max_length=100, null=True, verbose_name='Región (Chile)')), ('comuna', models.CharField(blank=True, max_length=100, null=True, verbose_name='Comuna')), ('vehicle_ownership', models.CharField(blank=True, max_length=100, null=True, verbose_name='Modalidad / Vehículo')), ('approval_status', models.CharField(choices=[('EN_REVISION_DOCUMENTAL', 'En Revisión Documental (Paso 1)'), ('SOLICITADO_FINANZAS', 'Solicitado a Finanzas (Paso 2)'), ('LIBERADO_PAGADO', 'Pago Liberado (Paso 3)'), ('OBSERVADO_RECHAZADO', 'Observado / Rechazado')], default='EN_REVISION_DOCUMENTAL', max_length=50, verbose_name='Estado de Aprobación')), ('rejection_reason', models.TextField(blank=True, null=True, verbose_name='Motivo de Observación/Rechazo')), ('paid_at', models.DateTimeField(blank=True, null=True, verbose_name='Fecha de Pago')), ('created_at', models.DateTimeField(auto_now_add=True)), ('updated_at', models.DateTimeField(auto_now=True)), ('category', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='expenses', to='expenses.category', verbose_name='Subcategoría')), ('elevated_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='expenses_elevated', to=settings.AUTH_USER_MODEL, verbose_name='Elevado por (Paso 2)')), ('paid_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='expenses_paid', to=settings.AUTH_USER_MODEL, verbose_name='Pagado por (Paso 3)')), ('responsible_person', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='expenses_responsible', to=settings.AUTH_USER_MODEL, verbose_name='Responsable Solicitante')), ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='expenses_created', to=settings.AUTH_USER_MODEL, verbose_name='Registrado por')), ], options={ 'verbose_name': 'Gasto', 'verbose_name_plural': 'Gastos', 'ordering': ['-date', '-created_at'], }, ), migrations.CreateModel( name='Document', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('file', models.FileField(upload_to='evidences/', verbose_name='Archivo Adjunto')), ('file_type', models.CharField(blank=True, max_length=50, verbose_name='Tipo de Archivo')), ('title', models.CharField(blank=True, max_length=200, verbose_name='Título del Documento')), ('uploaded_at', models.DateTimeField(auto_now_add=True, verbose_name='Fecha de Subida')), ('uploaded_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='Subido por')), ('expense', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='documents', to='expenses.expense', verbose_name='Gasto Relacionado')), ], options={ 'verbose_name': 'Documento Evidencia', 'verbose_name_plural': 'Documentos Evidencias', }, ), migrations.CreateModel( name='Project', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('code', models.CharField(default='PROY-000', max_length=50, unique=True, verbose_name='Código')), ('name', models.CharField(max_length=200, verbose_name='Nombre del Proyecto/Centro')), ('description', models.TextField(blank=True, verbose_name='Descripción')), ('assigned_budget_clp', models.DecimalField(decimal_places=2, default=0, max_digits=15, verbose_name='Presupuesto Asignado (CLP)')), ('assigned_budget_usd', models.DecimalField(decimal_places=2, default=0, max_digits=15, verbose_name='Presupuesto Asignado (USD)')), ('actual_cost_clp', models.DecimalField(decimal_places=2, default=0, max_digits=15, verbose_name='Costo Real Acumulado (CLP)')), ('type', models.CharField(choices=[('COSTO_DIRECTO_PROYECTO', 'Costo Directo Proyecto'), ('GASTO_OPERACIONAL_OVERHEAD', 'Gasto Operacional Overhead')], default='COSTO_DIRECTO_PROYECTO', max_length=50, verbose_name='Tipo de Centro')), ('status', models.CharField(default='on-budget', max_length=50, verbose_name='Estado de Presupuesto')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Fecha de Creación')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Última Modificación')), ('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_projects', to=settings.AUTH_USER_MODEL, verbose_name='Creado por')), ('manager', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='managed_projects', to=settings.AUTH_USER_MODEL, verbose_name='Encargado')), ], options={ 'verbose_name': 'Proyecto / Centro de Costo', 'verbose_name_plural': 'Proyectos y Centros', }, ), migrations.AddField( model_name='expense', name='project', field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='expenses', to='expenses.project', verbose_name='Proyecto'), ), migrations.CreateModel( name='UserProfile', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('rut', models.CharField(blank=True, max_length=20, null=True, verbose_name='RUT')), ('job_title', models.CharField(blank=True, max_length=150, null=True, verbose_name='Cargo')), ('description', models.TextField(blank=True, verbose_name='Descripción del Responsable')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='Fecha de Registro')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='Última Modificación')), ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='profile', to=settings.AUTH_USER_MODEL, verbose_name='Usuario')), ], options={ 'verbose_name': 'Perfil de Usuario', 'verbose_name_plural': 'Perfiles de Usuario', }, ), ]