Proyecto

General

Perfil

NC – Tareas #178 » Script-2.sql

Ejecutado en base de datos local y funcionando - Diego Ovando, 2026-02-13 16:29

 
1
-- create database nextcoop-bd;
2

    
3
create schema if not exists global;           -- Catálogos y Configuración
4
create schema if not exists core;
5
create schema if not exists socioeconomico;
6
create schema if not exists socios;
7

    
8
-- 3.A. TIPOS DE ADJUNTO
9
create table global.tipos_documento_adjunto (
10
    tipo_adjunto_id int generated by default as identity,
11
    codigo varchar(20) not null, -- 'CI_FRENTE', 'FACTURA_ANDE'
12
    descripcion varchar(100) not null,
13
    
14
    constraint pk_tipos_documento_adjunto primary key (tipo_adjunto_id),
15
    constraint uq_tipos_adjunto_codigo unique (codigo)
16
);
17

    
18
-- 3.B. REPOSITORIO DE ARCHIVOS
19
create table global.repositorio_documentos (
20
    documento_id bigint generated by default as identity,
21
    tipo_adjunto_id int not null,
22
    
23
    -- Polimorfismo (Para vincular con Solicitud o Persona)
24
    tabla_origen varchar(50) not null, 
25
    registro_origen_id bigint not null,
26
    
27
    nombre_archivo_original varchar(255) not null,
28
    ruta_absoluta_servidor varchar(500) not null, 
29
    mime_type varchar(100),
30
    
31
    creado_en timestamptz default now() not null,
32
    creado_por bigint, -- ID del Usuario que cargó el dato
33
    
34
    -- 2. Actualización (Traza de cambios de sueldo/cargo)
35
    actualizado_en timestamptz,
36
    actualizado_por bigint, -- ID del Usuario que editó
37
    
38
    -- 3. Borrado Lógico (Para corregir errores o finalizar trabajos)
39
    eliminado_en timestamptz, 
40
    eliminado_por bigint,
41
    
42
    constraint pk_repositorio_documentos primary key (documento_id),
43
    constraint fk_repositorio_tipo foreign key (tipo_adjunto_id) references global.tipos_documento_adjunto(tipo_adjunto_id)
44
);
45

    
46
-- 1.A. MAESTRO DE ESTADOS (Falta para el fk_personas_estado)
47
create table global.estados_sistema (
48
    estado_id int generated by default as identity,
49
    dominio varchar(50) not null, -- 'PERSONA', 'SOLICITUD', 'SOCIO'
50
    codigo varchar(50) not null,  -- 'ACTIVO', 'PENDIENTE', 'BLOQUEADO'
51
    descripcion varchar(100) not null,
52
    es_estado_final boolean default false,
53
    
54
    constraint pk_estados_sistema primary key (estado_id),
55
    constraint uq_estados_dominio_codigo unique (dominio, codigo)
56
);
57

    
58
-- cargos de representantes legales
59
create table global.cargos (
60
    cargo_id int generated by default as identity,
61
    descripcion varchar(100) not null, -- 'PRESIDENTE', 'VICEPRESIDENTE', 'SÍNDICO'
62
    es_alta_gerencia boolean default false, 
63
    activo boolean default true,
64
    constraint pk_cargos_autoridades primary key (cargo_id),
65
    constraint uq_cargos_descripcion unique (descripcion)
66
);
67

    
68
-- 1.C. TIPO DE RELACIÓN LABORAL (Falta para el Perfil Laboral del PDF)
69
create table global.tipos_relacion_laboral (
70
    tipo_relacion_id int generated by default as identity,
71
    descripcion varchar(100) not null, 
72
    
73
    constraint pk_tipos_relacion_laboral primary key (tipo_relacion_id)
74
);
75

    
76
-- Dropdown: Motivo (Ej: "Candidato a Socio", "Garante", "Representante")
77
create table global.motivos_registro (
78
    motivo_id int generated by default as identity,
79
    descripcion varchar(50) not null,
80
    
81
    constraint pk_motivos_registro primary key (motivo_id),
82
    constraint uq_motivos_desc unique (descripcion)
83
);
84

    
85
-- Dropdown: Sexo (Ej: "Masculino", "Femenino")
86
create table global.sexos (
87
    sexo_id int generated by default as identity,
88
    sigla char(1) not null, 
89
    descripcion varchar(20) not null,
90
    
91
    constraint pk_sexos primary key (sexo_id),
92
    constraint uq_sexos_sigla unique (sigla)
93
);
94

    
95
-- Dropdown: Tipo Documento (Ej: "Cédula de Identidad", "Pasaporte")
96
create table global.tipos_documento (
97
    tipo_documento_id int generated by default as identity,
98
    codigo varchar(10) not null, 
99
    descripcion varchar(50) not null,
100
    mascara_validacion varchar(100),
101
    es_fiscal boolean default false,
102
    
103
    constraint pk_tipos_documento primary key (tipo_documento_id),
104
    constraint uq_tipos_doc_codigo unique (codigo)
105
);
106

    
107
-- Dropdown: Zona de Residencia (Ej: "Urbana (Capital/Central)", "Rural", "Sub-Urbana")
108
create table global.zonas_geograficas (
109
    zona_id int generated by default as identity,
110
    descripcion varchar(50) not null, 
111
    
112
    constraint pk_zonas_geograficas primary key (zona_id)
113
);
114

    
115
-- 1. PAÍS
116
-- Aunque solo operes en Paraguay, mantener esta tabla es vital para la normalización.
117
create table global.paises (
118
    pais_id int generated by default as identity,
119
    nombre varchar(100) not null,    
120
    siglas char(3), -- "PRY"
121
    
122
    constraint pk_paises primary key (pais_id),
123
    constraint uq_paises_iso unique (siglas)
124
);
125

    
126
-- 2. DEPARTAMENTOS (Primer Nivel Administrativo)
127
-- El INE define 17 Departamentos + Asunción (Capital) que tiene rango departamental.
128
create table global.departamentos (
129
    departamento_id int generated by default as identity,
130
    pais_id int not null,    
131
    nombre varchar(100) not null,    
132
    codigo_ine varchar(2) not null, 
133
    
134
    constraint pk_departamentos primary key (departamento_id),
135
    constraint fk_departamentos_pais foreign key (pais_id) references global.paises(pais_id)    
136
);
137

    
138
-- 3. DISTRITOS (Segundo Nivel - Equivalente a "Ciudad" o Municipio)
139
-- El INE los llama "Distritos" a las ciudades
140
create table global.distritos (
141
    distrito_id int generated by default as identity,
142
    departamento_id int not null,    
143
    nombre varchar(100) not null,    
144
    codigo_ine varchar(4) not null,   
145
        
146
    constraint pk_distritos primary key (distrito_id),
147
    constraint fk_distritos_departamento foreign key (departamento_id) references global.departamentos(departamento_id)    
148
);
149

    
150
-- 4. BARRIOS Y LOCALIDADES (Tercer Nivel)
151
-- El INE divide los distritos en:
152
-- - Barrios (Zona Urbana)
153
-- - Localidades/Compañías (Zona Rural)
154
create table global.localidades (
155
    localidad_id int generated by default as identity,
156
    distrito_id int not null,    
157
    nombre varchar(150) not null,    
158
    -- Tipo: 'BARRIO' (Urbano) o 'COMPAÑIA'/'LOCALIDAD' (Rural)
159
    tipo_division varchar(20) default 'BARRIO',
160
    codigo_ine varchar(10),     
161
    constraint pk_localidad primary key (localidad_id),
162
    constraint fk_localidad_distrito foreign key (distrito_id) references global.distritos(distrito_id)     
163
);
164

    
165
-- Dropdown: Estado civil (Ej: "Casado/a")
166
create table global.estados_civiles (
167
    estado_civil_id int generated by default as identity,
168
    descripcion varchar(50) not null,
169
    
170
    constraint pk_estados_civiles primary key (estado_civil_id)
171
);
172

    
173
-- Dropdown: Régimen Patrimonial (Ej: "Separación de Bienes")
174
create table global.regimenes_matrimoniales (
175
    regimen_id int generated by default as identity,
176
    descripcion varchar(100) not null,
177
    
178
    constraint pk_regimenes_matrimoniales primary key (regimen_id)
179
);
180

    
181
-- 5.1 RELACIONES (Vínculos)
182
-- Sub-sección Parentesco, representantes legales
183
create table global.tipos_vinculo (
184
    tipo_vinculo_id int generated by default as identity,
185
    descripcion varchar(50) not null, 
186
    es_reciproco boolean default false,
187
    categoria_aplicacion varchar(20) default 'AMBOS',    
188
    constraint pk_tipos_vinculo primary key (tipo_vinculo_id)
189
);
190

    
191
-- Dropdown: Nivel Educativo (Ej: "Universitario")
192
create table global.niveles_educativos (
193
    nivel_educativo_id int generated by default as identity,
194
    descripcion varchar(100) not null,
195
    
196
    constraint pk_niveles_educativos primary key (nivel_educativo_id)
197
);
198

    
199
-- Dropdown: Fuente Principal de Ingresos (Ej: "Empleado/a (Sector Privado)")
200
create table global.fuentes_ingresos (
201
    fuente_id int generated by default as identity,
202
    descripcion varchar(100) not null, -- 'Empleado Privado', 'Funcionario Público'
203
    
204
    constraint pk_fuentes_ingresos primary key (fuente_id)
205
);
206

    
207
-- Funciona tanto para personas físicas y jurídicas
208
-- Para físicas: actividad principal (socios), actividad económica del empleador
209
-- Para jurídica: actividad económica
210
create table global.actividades_economicas (
211
    actividad_id int generated by default as identity,    
212
    -- El nombre del Rubro / Sector
213
    descripcion varchar(150) not null,     
214
    -- Clasificación Macro (Útil para reportes de concentración de riesgo)
215
    sector_macro varchar(50), -- 'PRIMARIO', 'SECUNDARIO', 'TERCIARIO', 'PÚBLICO'        
216
    -- ¿Aparece en "Actividad Principal" (Lo que hace el socio)?
217
    -- Ej: "Servicios Profesionales" (Sí), "Gobierno" (Sí)
218
    aplica_persona boolean default true,     
219
    -- ¿Aparece en "Actividad Económica Empleador" (De dónde viene la plata)?
220
    -- Ej: "Gobierno" (Sí), "Jubilado" (No, eso es una condición, no un rubro empresa)
221
    aplica_empleador boolean default true,    
222
    -- Código regulatorio (CIIU / SEPRELAD / INCOOP) para reportes
223
    codigo_regulador varchar(20),     
224
    constraint pk_actividades_economicas primary key (actividad_id),
225
    constraint uq_actividades_desc unique (descripcion)
226
);
227

    
228
-- Dropdown: Situación Habitacional (Ej: "Cedida/Familiar")
229
create table global.tipos_vivienda (
230
    tipo_vivienda_id int generated by default as identity,
231
    descripcion varchar(100) not null,
232
    
233
    constraint pk_tipos_vivienda primary key (tipo_vivienda_id)
234
);
235

    
236
-- Dropdown: Tenencia de la Tierra (Ej: "No aplica", "Propietario")
237
create table global.tipos_tenencia_tierra (
238
    tenencia_id int generated by default as identity,
239
    descripcion varchar(100) not null,
240
    
241
    constraint pk_tipos_tenencia_tierra primary key (tenencia_id)
242
);
243

    
244
-- tabla de profesiones y ocupaciones
245
create table global.ocupaciones (
246
    ocupacion_id int generated by default as identity,
247
        -- El nombre de la profesión (Ej: "Contador Público", "Estudiante")
248
    descripcion varchar(150) not null,
249
    -- COMPORTAMIENTO DEL FORMULARIO (Inteligencia de UI)
250
    -- Si es FALSE (Ej: Estudiante, Ama de Casa), el Frontend puede
251
    -- ocultar campos como "Ruc Empleador" o "Antigüedad Laboral".
252
    requiere_datos_laborales boolean default true,
253
    constraint pk_ocupaciones primary key (ocupacion_id),
254
    constraint uq_ocupaciones_desc unique (descripcion)
255
);
256

    
257
-- Persoja jurídica
258

    
259
-- 1.1 TIPO DE SOCIEDAD (Sección Identificación)
260
-- Dropdown: "Sociedad de Responsabilidad Limitada", "S.A.", etc.
261
create table global.tipos_sociedad (
262
    tipo_sociedad_id int generated by default as identity,
263
    siglas varchar(10), -- 'SRL', 'SA', 'EAS'
264
    descripcion varchar(100) not null,
265
    
266
    constraint pk_tipos_sociedad primary key (tipo_sociedad_id),
267
    constraint uq_tipos_sociedad_desc unique (descripcion)
268
);
269

    
270
-- 1.3 RÉGIMEN TRIBUTARIO (Sección Perfil de Negocio)
271
-- Dropdown: "IVA General", "IRE Simple"
272
create table global.regimenes_tributarios (
273
    regimen_id int generated by default as identity,
274
    descripcion varchar(100) not null,
275
    siglas varchar(20),
276
    
277
    constraint pk_regimenes_tributarios primary key (regimen_id)
278
);
279

    
280
-- 1.4 RANGOS DE INGRESOS (Sección Perfil de Negocio)
281
-- Dropdown: "500-1500 millones"
282
create table global.rangos_ingresos (
283
    rango_ingreso_id int generated by default as identity,
284
    descripcion varchar(100) not null, 
285
    valor_minimo numeric(19, 2),
286
    valor_maximo numeric(19, 2),
287
    moneda varchar(3) default 'PYG',
288
    
289
    constraint pk_rangos_ingresos primary key (rango_ingreso_id)
290
);
291

    
292
-- 1.5 RANGOS DE EMPLEADOS (Sección Perfil de Negocio)
293
-- Dropdown: "6-20", "21-50"
294
create table global.rangos_empleados (
295
    rango_empleado_id int generated by default as identity,
296
    descripcion varchar(50) not null, 
297
    min_empleados int,
298
    max_empleados int,
299
    
300
    constraint pk_rangos_empleados primary key (rango_empleado_id)
301
);
302

    
303
-- =================================================================================
304
-- ESQUEMA CORE: Personas
305
-- =================================================================================
306

    
307
create table core.personas (
308
    persona_id bigint generated by default as identity,
309
    
310
    -- MIGRACIÓN SIDE-BY-SIDE (Identidad Dual)
311
    -- Permite coexistencia con el sistema legado y búsqueda por código viejo.
312
    id_legado varchar(50), 
313
    
314
    -- DISCRIMINADOR Y MOTIVO
315
    tipo_persona char(1) not null, -- 'F' (Física) o 'J' (Jurídica)
316
    motivo_id int not null, -- 'CANDIDATO', 'GARANTE', 'PROSPECTO'
317
    
318
    -- IDENTIDAD LEGAL (Unique Constraint abajo)
319
    pais_emision_id int not null,
320
    tipo_documento_id int not null, -- FK a global.tipos_documento
321
    numero_documento varchar(30) not null,
322
    nombre_completo_normalizado varchar(255) not null, -- Para búsquedas rápidas sin JOINs
323
    
324
    -- DATOS PROMOVIDOS (Comunes a Físicas y Jurídicas)
325
    -- "Fecha de Nacimiento" (Física) o "Fecha Constitución" (Jurídica)
326
    fecha_nacimiento date not null, 
327
    
328
    -- "Actividad Económica": Unificada en una sola tabla global
329
    actividad_economica_id int, 
330
    
331
    -- "Régimen Tributario": Aplica a empresas y unipersonales
332
    regimen_tributario_id int,
333
    
334
    -- CONTACTO PRINCIPAL (Normalizado en el padre para acceso rápido)
335
    email_principal varchar(150),
336
    telefono_principal varchar(50),
337
    sitio_web varchar(150),
338
    
339
    -- ESTADO Y CONTROL
340
    estado_id int not null, -- FK a global.estados_sistema
341
    version int default 1,  -- Optimistic Locking (Para prevenir sobreescritura concurrente)
342

    
343
    -- AUDITORÍA
344
    creado_en timestamptz default now() not null,
345
    creado_por bigint, 
346
    actualizado_en timestamptz,
347
    actualizado_por bigint,
348
    eliminado_en timestamptz, -- Borrado Lógico
349
    eliminado_por bigint,
350

    
351
    -- CONSTRAINTS
352
    constraint pk_personas primary key (persona_id),
353
    
354
    constraint fk_personas_pais foreign key (pais_emision_id) references global.paises(pais_id),
355
    constraint fk_personas_tipo_doc foreign key (tipo_documento_id) references global.tipos_documento(tipo_documento_id),
356
    
357
    -- FK a la tabla UNIFICADA de actividades (Soporta rubros de personas y empresas)
358
    constraint fk_personas_actividad foreign key (actividad_economica_id) references global.actividades_economicas(actividad_id),
359
    constraint fk_personas_regimen foreign key (regimen_tributario_id) references global.regimenes_tributarios(regimen_id),
360
    constraint fk_personas_estado foreign key (estado_id) references global.estados_sistema(estado_id),
361
    constraint fk_personas_motivo foreign key (motivo_id) references global.motivos_registro(motivo_id),
362
    
363
    -- Regla de Integridad de Identidad (No pueden existir dos CI iguales en el mismo país)
364
    constraint uq_personas_identidad unique (pais_emision_id, tipo_documento_id, numero_documento),
365
    
366
    -- Validación de Discriminador
367
    constraint ck_personas_tipo check (tipo_persona in ('F', 'J'))
368
);
369

    
370
-- ÍNDICES ESTRATÉGICOS
371
-- Vital para la migración y la búsqueda por código viejo
372
create unique index uq_personas_legado on core.personas(id_legado) where id_legado is not null;
373
-- Vital para búsquedas tipo "Like" por nombre
374
create index idx_personas_nombre on core.personas(nombre_completo_normalizado);
375

    
376
-- =================================================================================
377
-- 2. TABLA HIJA: PERSONAS FÍSICAS (Especialización)
378
-- =================================================================================
379
create table core.personas_fisicas (
380
    persona_id bigint not null, -- PK y FK al mismo tiempo
381
    
382
    -- IDENTIDAD DETALLADA
383
    nombres varchar(100) not null,
384
    apellidos varchar(100) not null,
385
    sexo_id int not null,
386
    
387
    -- ESTADO CIVIL Y FAMILIAR
388
    estado_civil_id int,
389
    regimen_matrimonial_id int, -- Solo si es Casado
390
    
391
    -- ORIGEN
392
    distrito_nacimiento_id int,
393
    
394
    -- PERFIL SOCIOECONÓMICO BÁSICO (El detalle laboral va en socioeconomico.perfiles)
395
    nivel_educativo_id int,
396
    ocupacion_id int, -- profesión/ocupación
397
    
398
    -- CARGAS FAMILIARES (Para análisis de capacidad de pago)
399
    cantidad_dependientes int default 0,
400
    tiene_hijos_escolar boolean default false,
401
    
402
    -- PERFIL DE VIVIENDA Y SALUD
403
    situacion_vivienda_id int, -- Propia, Alquilada
404
    tenencia_tierra_id int,    -- Propietario, Ocupante
405
    posee_seguro_medico boolean default false,
406
    
407
    -- AUDITORÍA DE EDICIÓN
408
    creado_en timestamptz default now() not null,
409
    creado_por bigint,
410
    actualizado_en timestamptz,
411
    actualizado_por bigint,
412

    
413
    constraint pk_personas_fisicas primary key (persona_id),
414
    
415
    -- Herencia (1 a 1 estricta)
416
    constraint fk_fisicas_persona foreign key (persona_id) references core.personas(persona_id) on delete cascade,
417
    
418
    -- Referencias Globales
419
    constraint fk_fisicas_sexo foreign key (sexo_id) references global.sexos(sexo_id),
420
    constraint fk_fisicas_est_civil foreign key (estado_civil_id) references global.estados_civiles(estado_civil_id),
421
    constraint fk_fisicas_regimen foreign key (regimen_matrimonial_id) references global.regimenes_matrimoniales(regimen_id),
422
    constraint fk_fisicas_educacion foreign key (nivel_educativo_id) references global.niveles_educativos(nivel_educativo_id),
423
    constraint fk_fisicas_distrito foreign key (distrito_nacimiento_id) references global.distritos(distrito_id),
424
    constraint fk_fisicas_vivienda foreign key (situacion_vivienda_id) references global.tipos_vivienda(tipo_vivienda_id),
425
    constraint fk_fisicas_tierra foreign key (tenencia_tierra_id) references global.tipos_tenencia_tierra(tenencia_id),
426
    constraint fk_fisicas_ocupacion foreign key (ocupacion_id) references global.ocupaciones(ocupacion_id)
427
);
428

    
429
-- =================================================================================
430
-- 3. TABLA HIJA: PERSONAS JURÍDICAS (Especialización)
431
-- =================================================================================
432
create table core.personas_juridicas (
433
    persona_id bigint not null, -- PK y FK
434
    
435
    -- IDENTIDAD CORPORATIVA
436
    razon_social varchar(200) not null,
437
    nombre_fantasia varchar(200), -- Nombre Comercial
438
    
439
    -- TIPO SOCIETARIO (SA, SRL, EAS)
440
    tipo_sociedad_id int not null,
441
    
442
    -- VOLUMETRÍA Y SEGMENTACIÓN (Dropdowns de Rango)
443
    rango_ingreso_anual_id int,
444
    rango_cantidad_empleados_id int,
445
    
446
    -- AUDITORÍA
447
    creado_en timestamptz default now() not null,
448
    creado_por bigint, 
449
    actualizado_en timestamptz,
450
    actualizado_por bigint,
451

    
452
    constraint pk_personas_juridicas primary key (persona_id),
453
    
454
    -- Herencia
455
    constraint fk_juridicas_persona foreign key (persona_id) references core.personas(persona_id) on delete cascade,
456
    
457
    -- Referencias Globales
458
    constraint fk_juridicas_tipo_soc foreign key (tipo_sociedad_id) references global.tipos_sociedad(tipo_sociedad_id),
459
    constraint fk_juridicas_rango_ing foreign key (rango_ingreso_anual_id) references global.rangos_ingresos(rango_ingreso_id),
460
    constraint fk_juridicas_rango_emp foreign key (rango_cantidad_empleados_id) references global.rangos_empleados(rango_empleado_id)
461
);
462

    
463
-- =================================================================================
464
-- 4. TABLA: DIRECCIONES (Polimórfica y Georreferenciada)
465
-- =================================================================================
466
create table core.direcciones (
467
    direccion_id bigint generated by default as identity,
468
    
469
    persona_id bigint not null,
470
    
471
    -- CLASIFICACIÓN
472
    categoria_uso varchar(20) not null default 'DOMICILIO', -- 'DOMICILIO', 'LABORAL', 'SUCURSAL'
473
    es_principal boolean default false,
474
    
475
    -- UBICACIÓN
476
    distrito_id int not null, -- Distrito según INE
477
    barrio varchar(100),    -- Barrio o Localidad (Texto o futuro ID si se normaliza)
478
    calle_principal varchar(150) not null,
479
    numeracion varchar(20),
480
    referencia_ubicacion text, -- "Frente a la plaza..."
481
    
482
    -- GIS (Google Maps)
483
    latitud decimal(10, 8),
484
    longitud decimal(11, 8),
485
    
486
    -- AUDITORÍA
487
    creado_en timestamptz default now() not null,
488
    creado_por bigint,
489
    actualizado_en timestamptz,
490
    actualizado_por bigint,
491

    
492
    constraint pk_direcciones primary key (direccion_id),
493
    constraint fk_direcciones_persona foreign key (persona_id) references core.personas(persona_id),
494
    constraint fk_direcciones_distrito foreign key (distrito_id) references global.distritos(distrito_id)
495
);
496

    
497

    
498
--- parentesco, representantes legales (lista)
499
create table core.vinculos_personas (
500
    vinculo_id bigint generated by default as identity,
501
    persona_origen_id bigint not null, -- La Empresa (o el Padre)
502
    persona_destino_id bigint not null, -- El Representante (o el Hijo)
503
    tipo_vinculo_id int not null, -- FK a global.tipos_vinculo ('REPRESENTANTE', 'ACCIONISTA')
504
    cargo_id int, -- FK a global.cargos_autoridades ('PRESIDENTE')
505
    -- 6. AUDITORÍA COMPLETA (Estándar Gold)
506
    creado_en timestamptz default now() not null,
507
    creado_por bigint, 
508
    actualizado_en timestamptz,
509
    actualizado_por bigint,
510
    eliminado_en timestamptz, -- Borrado Lógico (Mantiene el histórico)
511
    eliminado_por bigint,
512
    
513
    constraint pk_vinculos_personas primary key (vinculo_id),
514
    
515
    constraint fk_vinculos_origen 
516
        foreign key (persona_origen_id) references core.personas(persona_id),
517
        
518
    constraint fk_vinculos_destino 
519
        foreign key (persona_destino_id) references core.personas(persona_id),
520
        
521
    constraint fk_vinculos_tipo 
522
        foreign key (tipo_vinculo_id) references global.tipos_vinculo(tipo_vinculo_id),
523
        
524
    constraint fk_vinculos_cargo 
525
        foreign key (cargo_id) references global.cargos(cargo_id),
526
        
527
    -- Validación: No puede ser el mismo origen y destino (Yo no soy mi propio padre)
528
    constraint ck_vinculos_bucle check (persona_origen_id <> persona_destino_id)
529
);
530

    
531

    
532

    
533
create table socioeconomico.perfiles_laborales (
534
    laboral_id bigint generated by default as identity,
535
    persona_id bigint not null, 
536
    fuente_ingresos_id int not null,      -- Ej: "Dependiente", "Cuenta Propia"
537
    tipo_relacion_id int,                 -- Ej: "Nombrado", "Contratado"    
538
    -- DOBLE REFERENCIA A ACTIVIDADES ECONÓMICAS
539
    actividad_principal_id int not null,       -- Lo que hace el SOCIO (Ej: "Servicios Profesionales")
540
    actividad_rubro_empleador_id int,          -- Lo que hace la EMPRESA (Ej: "Banca", "Ganadería")
541
    nombre_empresa_empleador varchar(150),
542
    cargo_puesto_ocupado varchar(150),         -- Ej: "Gerente de Logística" (Distinto a su profesión)
543
    antiguedad_anos int default 0,
544
    antiguedad_meses int default 0,
545
    ingreso_neto_mensual numeric(19, 2) not null default 0,
546
    es_ingreso_principal boolean default true, -- Flag para sumar capacidad de pago    
547
    creado_en timestamptz default now() not null,
548
    creado_por bigint, -- ID del Usuario que cargó el dato    
549
    actualizado_en timestamptz,
550
    actualizado_por bigint, -- ID del Usuario que editó    
551
    eliminado_en timestamptz, 
552
    eliminado_por bigint,
553
    constraint pk_perfiles_laborales primary key (laboral_id),
554
    constraint fk_laboral_persona 
555
        foreign key (persona_id) references core.personas(persona_id) on delete cascade,
556
    constraint fk_laboral_fuente 
557
        foreign key (fuente_ingresos_id) references global.fuentes_ingresos(fuente_id),
558
    constraint fk_laboral_relacion 
559
        foreign key (tipo_relacion_id) references global.tipos_relacion_laboral(tipo_relacion_id),
560
    constraint fk_laboral_act_propia 
561
        foreign key (actividad_principal_id) references global.actividades_economicas(actividad_id),
562
    constraint fk_laboral_act_empleador 
563
        foreign key (actividad_rubro_empleador_id) references global.actividades_economicas(actividad_id)    
564
);
565

    
566
---------- SOCIOS
567

    
568
create table socios.solicitudes_ingreso (
569
    solicitud_id bigint generated by default as identity,
570
    
571
    -- 1. SOLICITANTE
572
    persona_id bigint not null, -- El postulante (FK a Core)
573
    
574
    -- 2. DATOS DE LA SOLICITUD (Pantalla 1: Formulario de Entrada)
575
    fecha_solicitud date default current_date not null,
576
    es_reasociacion boolean default false, -- Checkbox del diseño
577
    observaciones_iniciales text, -- Notas del oficial al cargar
578
    
579
    -- 3. VINCULACIONES CRÍTICAS (Compliance y Riesgo)
580
    -- Corrección: Agregamos las FKs que faltaban para conectar con otros módulos
581
    manifestacion_bienes_id bigint, -- Referencia al futuro módulo de Bienes
582
    pep_vinculacion_id bigint,      -- Referencia si se marcó como PEP (FK a riesgo.listas_control)
583
    
584
    -- 4. ESTADO DEL WORKFLOW (Corrección: FK a Tabla Central)
585
    -- Ya no es varchar. Ahora apunta al maestro de estados para integridad.
586
    estado_id int not null, 
587
    
588
    -- 5. DATOS DE RESOLUCIÓN (Pantalla 2 y 3: Análisis y Aprobación/Rechazo)
589
    fecha_resolucion date,
590
    usuario_resolucion_id bigint, -- El miembro del consejo/jefe que dio el click final
591
    
592
    -- Si se APRUEBA (Datos de la Resolución del Consejo)
593
    acto_administrativo_resolucion varchar(150), -- "Aprobado por Res. Nro 715/2025"
594
    fecha_ingreso_oficial date, -- Puede ser distinta a la de resolución
595
    
596
    -- Si se RECHAZA
597
    observaciones_resolucion text, -- El dictamen final (Motivo del rechazo)
598
    
599
    -- 6. AUDITORÍA COMPLETA (Estándar Gold)
600
    creado_en timestamptz default now() not null,
601
    creado_por bigint, 
602
    actualizado_en timestamptz,
603
    actualizado_por bigint,
604
    eliminado_en timestamptz, -- Borrado lógico (Por si se cancela la solicitud antes de procesar)
605
    eliminado_por bigint,
606

    
607
    -- =========================================================================
608
    -- CONSTRAINTS
609
    -- =========================================================================
610
    constraint pk_solicitudes_ingreso primary key (solicitud_id),
611
    
612
    -- Integridad Referencial
613
    constraint fk_solicitud_persona 
614
        foreign key (persona_id) references core.personas(persona_id),
615
        
616
    constraint fk_solicitud_estado 
617
        foreign key (estado_id) references global.estados_sistema(estado_id),
618
        
619
    -- Vínculo con PEP (Asumiendo que ya creamos el esquema riesgo.listas_control)
620
    constraint fk_solicitud_pep 
621
        foreign key (pep_vinculacion_id) references riesgo.listas_control(lista_id)
622
);
623

    
624
create table socios.maestro_socios (
625
    socio_id bigint generated by default as identity,
626
    
627
    -- 1. VINCULACIÓN PRINCIPAL
628
    persona_id bigint not null,
629
    
630
    -- Origen: ¿De qué solicitud nació este registro de socio?
631
    -- Vital para auditoría: "Este socio ingresó por la Solicitud #1005 aprobada el..."
632
    solicitud_origen_id bigint not null, 
633
    
634
    -- 2. IDENTIFICACIÓN DEL SOCIO
635
    numero_socio int not null,           -- El Nro. impreso en el carnet (Ej: 15400)
636
    codigo_socio_legado varchar(50),     -- Para migración (Ej: "A-15400/2010")
637
    
638
    -- 4. CICLO DE VIDA (Historial de Membresía)
639
    fecha_ingreso date not null,         -- Fecha de la Resolución de Aprobación
640
    
641
    fecha_salida date,                   -- NULL = ACTIVO. Si tiene fecha, es EX-SOCIO.
642
    motivo_salida varchar(200),          -- "Renuncia Voluntaria", "Expulsión", "Fallecimiento"
643
    
644
    -- 5. ESTADO DEL SISTEMA
645
    -- FK a global.estados_sistema ('ACTIVO', 'RENUNCIANTE', 'BLOQUEADO', 'FALLECIDO')
646
    estado_id int not null, 
647
    
648
    -- 6. AUDITORÍA COMPLETA (Trazabilidad)
649
    creado_en timestamptz default now() not null,
650
    creado_por bigint,
651
    actualizado_en timestamptz,
652
    actualizado_por bigint, 
653
    -- Nota: Aquí no usamos eliminado_en porque la "baja" es un evento de negocio (fecha_salida)
654
    
655
    -- =========================================================================
656
    -- CONSTRAINTS
657
    -- =========================================================================
658
    constraint pk_maestro_socios primary key (socio_id),
659
    
660
    -- Integridad Referencial
661
    constraint fk_socios_persona 
662
        foreign key (persona_id) references core.personas(persona_id),
663
        
664
    constraint fk_socios_solicitud 
665
        foreign key (solicitud_origen_id) references socios.solicitudes_ingreso(solicitud_id),
666
        
667
    constraint fk_socios_estado 
668
        foreign key (estado_id) references global.estados_sistema(estado_id),
669
    
670
    -- Unicidad del Número de Socio
671
    constraint uq_socios_numero unique (numero_socio)
672
);
(2-2/3)