Base de Datos
Tecnología
- SQL Server hospedado en Azure SQL
- Prisma ORM para acceso type-safe a datos
- Schema definido en
prisma/schema.prisma - Migraciones SQL manuales (no Prisma Migrate)
Diagrama Entidad-Relación
Entidades Principales
Subsistema de Pagos
Tablas del Sistema
Tablas Core
| Tabla | Propósito | Registros típicos |
|---|---|---|
AspNetUsers | Usuarios del sistema | ~50 |
AspNetRoles | Roles (Admin, Supervisor, Ejecutivo) | 3 |
CustomerModels | Clientes/carteras | ~10 |
IntegranteModels | Cuentas/deudores (legacy) | ~500K |
GestionModels | Gestiones realizadas | ~2M |
Accounts | Cuentas (nuevo sistema) | ~100K |
Asignaciones | Asignaciones dinámicas | ~100K |
Tablas de Import/Export
| Tabla | Propósito |
|---|---|
ImportJobs | Jobs de importación (accounts, gestiones, pagos) |
ImportFiles | Metadatos de archivos subidos |
ExportJobs | Jobs de exportación de gestiones |
AutoExportConfig | Configuración de export automático por cliente |
MappingTemplates | Plantillas de mapeo reutilizables |
MasterDataCatalog | Catálogo de campos disponibles |
Tablas de Pagos
| Tabla | Propósito |
|---|---|
UnassignedPayments | Pagos importados no emparejados |
PaymentImportReviewItems | Duplicados potenciales para revisión |
PromesaPagoLinks | Vínculos promesa → pago efectuado |
Tablas de Permisos
| Tabla | Propósito |
|---|---|
Permissions | Catálogo de 42 permisos nombrados |
RolePermissions | Asociación rol → permiso |
UserPermissionOverrides | Overrides individuales (grant/revoke) |
Tablas de Auditoría
| Tabla | Propósito |
|---|---|
AccountAuditHistory | Historial de cambios campo-por-campo |
TemplateUsageHistory | Uso de plantillas de mapeo |
Migraciones
Convenciones
Las migraciones son scripts SQL manuales en prisma/migrations/:
prisma/migrations/
├── add-accounts-table.sql
├── add-import-jobs-tables.sql
├── add-export-jobs-tables.sql
├── add-permissions-tables.sql
├── seed-permissions-data.sql
├── add-payment-import-tables.sql
├── add-unassigned-payments-table.sql
└── ...
Reglas:
- Envueltas en
BEGIN TRY / BEGIN CATCHcon transacción - Guards
IF NOT EXISTS/IF OBJECT_ID IS NULLpara idempotencia - Constraints con prefijos:
PK_,FK_,CK_,DF_ - Tipos de FK:
NVARCHAR(128)paraAspNetUsers.Id,NVARCHAR(255)para UUIDs
Ejecución
# En SSMS o Azure Data Studio:
# 1. Conectar a la base de datos Azure SQL
# 2. Ejecutar scripts en orden cronológico
# 3. Verificar output "Migration completed successfully!"
aviso
No usar prisma migrate — las migraciones se manejan manualmente con scripts SQL. Prisma solo se usa para generar el cliente y para introspección.
Prisma — Comandos Útiles
# Regenerar el cliente después de cambios al schema
npx prisma generate
# Inspeccionar la DB visualmente
npx prisma studio
# Validar que el schema esté correcto
npx prisma validate
# Ver diferencias entre schema y DB
npx prisma db pull
Patrones de Datos
JobType en ImportJobs
| JobType | Procesador | Tabla(s) afectada(s) |
|---|---|---|
accounts | Account Import Processor | Accounts, AccountAuditHistory |
gestiones | Gestion Import Processor | GestionModels |
pagos | Payment Job Processor | IntegranteModels, GestionModels, UnassignedPayments |
Status de Jobs
Composite Keys
Accounts: PK compuesto(AccountId, CustomerId)AspNetUserRoles: PK compuesto(UserId, RoleId)RolePermissions: PK compuesto(RoleId, PermissionId)UserPermissionOverrides: PK compuesto(UserId, PermissionId)
Asignaciones — Schema Dinámico
La tabla Asignaciones usa un campo JSON (Data) para almacenar datos de cuenta de forma flexible, evitando migraciones de schema cuando se agregan nuevos campos al catálogo:
{
"NombreCompleto": "Juan Pérez López",
"TelPrincipal": "5551234567",
"TotalAdeudo": "15000.50",
"DiasMora": "45"
}
Los campos disponibles se definen en MasterDataCatalog y pueden agregarse sin migraciones.