156 lines
11 KiB
Python
156 lines
11 KiB
Python
# 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',
|
|
},
|
|
),
|
|
]
|