Initial commit: EFINTEL ERP Django Port

This commit is contained in:
Nachou-u
2026-08-19 18:04:18 -04:00
parent 1cd6ff1a6f
commit eb065909bd
39 changed files with 3852 additions and 0 deletions
+155
View File
@@ -0,0 +1,155 @@
# 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',
},
),
]