Proyecto

General

Perfil

NC – Tareas #178 » schema.sql

Versión final para desarrollo de módulo de personas - Diego Ovando, 2026-03-01 20:07

 
1
-- create database nextcoop-bd;
2
create schema if not exists global;
3
create schema if not exists core;
4
create schema if not exists socioeconomico;
5
create schema if not exists socios;
6
-- =================================================================================
7
-- ESQUEMA GLOBAL (Catálogos)
8
-- Cambio: PKs a 'id' y agregado 'activo' para Soft Delete
9
-- =================================================================================
10
-- 3.A. TIPOS DE ADJUNTO
11
create table global.tipos_documento_adjunto (
12
    id int generated by default as identity,
13
    -- Antes: tipo_adjunto_id
14
    codigo varchar(20) not null,
15
    descripcion varchar(100) not null,
16
    activo boolean default true,
17
    -- Soft Delete
18
    constraint pk_tipos_documento_adjunto primary key (id),
19
    constraint uq_tipos_adjunto_codigo unique (codigo)
20
);
21
-- 3.B. REPOSITORIO DE ARCHIVOS (Esta es transaccional, lleva full audit)
22
create table global.repositorio_documentos (
23
    id bigint generated by default as identity,
24
    -- Antes: documento_id
25
    tipo_adjunto_id int not null,
26
    tabla_origen varchar(50) not null,
27
    registro_origen_id bigint not null,
28
    nombre_archivo_original varchar(255) not null,
29
    ruta_absoluta_servidor varchar(500) not null,
30
    mime_type varchar(100),
31
    -- Auditoría Full
32
    creado_en timestamptz default now() not null,
33
    creado_por bigint,
34
    actualizado_en timestamptz,
35
    actualizado_por bigint,
36
    eliminado_en timestamptz,
37
    eliminado_por bigint,
38
    constraint pk_repositorio_documentos primary key (id),
39
    constraint fk_repositorio_tipo foreign key (tipo_adjunto_id) references global.tipos_documento_adjunto(id)
40
);
41
-- 1.A. MAESTRO DE ESTADOS
42
create table global.estados_sistema (
43
    id int generated by default as identity,
44
    -- Antes: estado_id
45
    dominio varchar(50) not null,
46
    codigo varchar(50) not null,
47
    descripcion varchar(100) not null,
48
    es_estado_final boolean default false,
49
    activo boolean default true,
50
    constraint pk_estados_sistema primary key (id),
51
    constraint uq_estados_dominio_codigo unique (dominio, codigo)
52
);
53
-- cargos de representantes legales
54
create table global.cargos (
55
    id int generated by default as identity,
56
    -- Antes: cargo_id
57
    descripcion varchar(100) not null,
58
    es_alta_gerencia boolean default false,
59
    activo boolean default true,
60
    constraint pk_cargos primary key (id),
61
    -- OJO: Nombre constraint original mantenido
62
    constraint uq_cargos_descripcion unique (descripcion)
63
);
64
-- 1.C. TIPO DE RELACIÓN LABORAL
65
create table global.tipos_relacion_laboral (
66
    id int generated by default as identity,
67
    -- Antes: tipo_relacion_id
68
    descripcion varchar(100) not null,
69
    activo boolean default true,
70
    constraint pk_tipos_relacion_laboral primary key (id)
71
);
72
-- Dropdown: Motivo
73
create table global.motivos_registro (
74
    id int generated by default as identity,
75
    -- Antes: motivo_id
76
    descripcion varchar(50) not null,
77
    activo boolean default true,
78
    constraint pk_motivos_registro primary key (id),
79
    constraint uq_motivos_desc unique (descripcion)
80
);
81
-- Dropdown: Sexo
82
create table global.sexos (
83
    id int generated by default as identity,
84
    -- Antes: sexo_id
85
    sigla char(1) not null,
86
    descripcion varchar(20) not null,
87
    activo boolean default true,
88
    constraint pk_sexos primary key (id),
89
    constraint uq_sexos_sigla unique (sigla)
90
);
91
-- Dropdown: Tipo Documento
92
create table global.tipos_documento (
93
    id int generated by default as identity,
94
    -- Antes: tipo_documento_id
95
    codigo varchar(10) not null,
96
    descripcion varchar(50) not null,
97
    mascara_validacion varchar(100),
98
    es_fiscal boolean default false,
99
    activo boolean default true,
100
    constraint pk_tipos_documento primary key (id),
101
    constraint uq_tipos_doc_codigo unique (codigo)
102
);
103
-- Dropdown: Zona de Residencia
104
create table global.zonas_geograficas (
105
    id int generated by default as identity,
106
    -- Antes: zona_id
107
    descripcion varchar(50) not null,
108
    activo boolean default true,
109
    constraint pk_zonas_geograficas primary key (id)
110
);
111
-- 1. PAÍS
112
create table global.paises (
113
    id int generated by default as identity,
114
    -- Antes: pais_id
115
    nombre varchar(100) not null,
116
    siglas char(3),
117
    activo boolean default true,
118
    constraint pk_paises primary key (id),
119
    constraint uq_paises_iso unique (siglas)
120
);
121
-- 2. DEPARTAMENTOS
122
create table global.departamentos (
123
    id int generated by default as identity,
124
    -- Antes: departamento_id
125
    pais_id int not null,
126
    nombre varchar(100) not null,
127
    activo boolean default true,
128
    constraint pk_departamentos primary key (id),
129
    constraint fk_departamentos_pais foreign key (pais_id) references global.paises(id)
130
);
131
-- 3. DISTRITOS
132
create table global.distritos (
133
    id int generated by default as identity,
134
    -- Antes: distrito_id
135
    departamento_id int not null,
136
    nombre varchar(100) not null,
137
    codigo_ine varchar(4) not null,
138
    activo boolean default true,
139
    constraint pk_distritos primary key (id),
140
    constraint fk_distritos_departamento foreign key (departamento_id) references global.departamentos(id)
141
);
142
-- 4. BARRIOS Y LOCALIDADES
143
create table global.localidades (
144
    id int generated by default as identity,
145
    -- Antes: localidad_id
146
    distrito_id int not null,
147
    nombre varchar(150) not null,
148
    tipo_division varchar(20) default 'BARRIO',
149
    codigo_ine varchar(10),
150
    activo boolean default true,
151
    constraint pk_localidad primary key (id),
152
    constraint fk_localidad_distrito foreign key (distrito_id) references global.distritos(id)
153
);
154
-- Dropdown: Estado civil
155
create table global.estados_civiles (
156
    id int generated by default as identity,
157
    -- Antes: estado_civil_id
158
    descripcion varchar(50) not null,
159
    activo boolean default true,
160
    constraint pk_estados_civiles primary key (id)
161
);
162
-- Dropdown: Régimen Patrimonial
163
create table global.regimenes_matrimoniales (
164
    id int generated by default as identity,
165
    -- Antes: regimen_id
166
    descripcion varchar(100) not null,
167
    activo boolean default true,
168
    constraint pk_regimenes_matrimoniales primary key (id)
169
);
170
-- 5.1 RELACIONES (Vínculos)
171
create table global.tipos_vinculo (
172
    id int generated by default as identity,
173
    -- Antes: tipo_vinculo_id
174
    descripcion varchar(50) not null,
175
    es_reciproco boolean default false,
176
    categoria_aplicacion varchar(20) default 'AMBOS',
177
    activo boolean default true,
178
    constraint pk_tipos_vinculo primary key (id)
179
);
180
-- Dropdown: Nivel Educativo
181
create table global.niveles_educativos (
182
    id int generated by default as identity,
183
    -- Antes: nivel_educativo_id
184
    descripcion varchar(100) not null,
185
    activo boolean default true,
186
    constraint pk_niveles_educativos primary key (id)
187
);
188
-- Dropdown: Fuente Principal de Ingresos
189
create table global.fuentes_ingresos (
190
    id int generated by default as identity,
191
    -- Antes: fuente_id
192
    descripcion varchar(100) not null,
193
    activo boolean default true,
194
    constraint pk_fuentes_ingresos primary key (id)
195
);
196
-- Actividades Económicas
197
create table global.actividades_economicas (
198
    id int generated by default as identity,
199
    -- Antes: actividad_id
200
    descripcion varchar(150) not null,
201
    sector_macro varchar(50),
202
    aplica_persona boolean default true,
203
    aplica_empleador boolean default true,
204
    codigo_regulador varchar(20),
205
    activo boolean default true,
206
    constraint pk_actividades_economicas primary key (id),
207
    constraint uq_actividades_desc unique (descripcion)
208
);
209
-- Dropdown: Situación Habitacional
210
create table global.tipos_vivienda (
211
    id int generated by default as identity,
212
    -- Antes: tipo_vivienda_id
213
    descripcion varchar(100) not null,
214
    activo boolean default true,
215
    constraint pk_tipos_vivienda primary key (id)
216
);
217
-- Dropdown: Tenencia de la Tierra
218
create table global.tipos_tenencia_tierra (
219
    id int generated by default as identity,
220
    -- Antes: tenencia_id
221
    descripcion varchar(100) not null,
222
    activo boolean default true,
223
    constraint pk_tipos_tenencia_tierra primary key (id)
224
);
225
-- tabla de profesiones y ocupaciones
226
create table global.ocupaciones (
227
    id int generated by default as identity,
228
    -- Antes: ocupacion_id
229
    descripcion varchar(150) not null,
230
    requiere_datos_laborales boolean default true,
231
    activo boolean default true,
232
    constraint pk_ocupaciones primary key (id),
233
    constraint uq_ocupaciones_desc unique (descripcion)
234
);
235
-- 1.1 TIPO DE SOCIEDAD
236
create table global.tipos_sociedad (
237
    id int generated by default as identity,
238
    -- Antes: tipo_sociedad_id
239
    siglas varchar(10),
240
    descripcion varchar(100) not null,
241
    activo boolean default true,
242
    constraint pk_tipos_sociedad primary key (id),
243
    constraint uq_tipos_sociedad_desc unique (descripcion)
244
);
245
-- 1.3 RÉGIMEN TRIBUTARIO
246
create table global.regimenes_tributarios (
247
    id int generated by default as identity,
248
    -- Antes: regimen_id
249
    descripcion varchar(100) not null,
250
    siglas varchar(20),
251
    activo boolean default true,
252
    constraint pk_regimenes_tributarios primary key (id)
253
);
254
-- 1.4 RANGOS DE INGRESOS
255
create table global.rangos_ingresos (
256
    id int generated by default as identity,
257
    -- Antes: rango_ingreso_id
258
    descripcion varchar(100) not null,
259
    valor_minimo numeric(19, 2),
260
    valor_maximo numeric(19, 2),
261
    moneda varchar(3) default 'PYG',
262
    activo boolean default true,
263
    constraint pk_rangos_ingresos primary key (id)
264
);
265
-- 1.5 RANGOS DE EMPLEADOS
266
create table global.rangos_empleados (
267
    id int generated by default as identity,
268
    -- Antes: rango_empleado_id
269
    descripcion varchar(50) not null,
270
    min_empleados int,
271
    max_empleados int,
272
    activo boolean default true,
273
    constraint pk_rangos_empleados primary key (id)
274
);
275
-- =================================================================================
276
-- ESQUEMA CORE: Personas (Transaccional - Full Audit)
277
-- =================================================================================
278
create table core.personas (
279
    id bigint generated by default as identity,
280
    -- Antes: persona_id
281
    id_legado varchar(50),
282
    tipo_persona char(1) not null,
283
    motivo_id int not null,
284
    pais_emision_id int not null,
285
    tipo_documento_id int not null,
286
    numero_documento varchar(30) not null,
287
    nombre_completo_normalizado varchar(255) not null,
288
    fecha_nacimiento date not null,
289
    actividad_economica_id int,
290
    regimen_tributario_id int,
291
    email_principal varchar(150),
292
    telefono_principal varchar(50),
293
    sitio_web varchar(150),
294
    estado_id int not null,
295
    version int default 1,
296
    -- Auditoría Full
297
    creado_en timestamptz default now() not null,
298
    creado_por bigint,
299
    actualizado_en timestamptz,
300
    actualizado_por bigint,
301
    eliminado_en timestamptz,
302
    eliminado_por bigint,
303
    constraint pk_personas primary key (id),
304
    -- Foreign Keys actualizadas a (id)
305
    constraint fk_personas_pais foreign key (pais_emision_id) references global.paises(id),
306
    constraint fk_personas_tipo_doc foreign key (tipo_documento_id) references global.tipos_documento(id),
307
    constraint fk_personas_actividad foreign key (actividad_economica_id) references global.actividades_economicas(id),
308
    constraint fk_personas_regimen foreign key (regimen_tributario_id) references global.regimenes_tributarios(id),
309
    constraint fk_personas_estado foreign key (estado_id) references global.estados_sistema(id),
310
    constraint fk_personas_motivo foreign key (motivo_id) references global.motivos_registro(id),
311
    constraint uq_personas_identidad unique (
312
        pais_emision_id,
313
        tipo_documento_id,
314
        numero_documento
315
    ),
316
    constraint ck_personas_tipo check (tipo_persona in ('F', 'J'))
317
);
318
create unique index uq_personas_legado on core.personas(id_legado)
319
where id_legado is not null;
320
create index idx_personas_nombre on core.personas(nombre_completo_normalizado);
321
-- 2. TABLA HIJA: PERSONAS FÍSICAS
322
create table core.personas_fisicas (
323
    id bigint not null,
324
    -- PK y FK al mismo tiempo. Apunta a core.personas(id)
325
    nombres varchar(100) not null,
326
    apellidos varchar(100) not null,
327
    sexo_id int not null,
328
    estado_civil_id int,
329
    regimen_matrimonial_id int,
330
    distrito_nacimiento_id int,
331
    nivel_educativo_id int,
332
    ocupacion_id int,
333
    cantidad_dependientes int default 0,
334
    tiene_hijos_escolar boolean default false,
335
    situacion_vivienda_id int,
336
    tenencia_tierra_id int,
337
    posee_seguro_medico boolean default false,
338
    -- Auditoría Full
339
    creado_en timestamptz default now() not null,
340
    creado_por bigint,
341
    actualizado_en timestamptz,
342
    actualizado_por bigint,
343
    eliminado_en timestamptz,
344
    eliminado_por bigint,
345
    constraint pk_personas_fisicas primary key (id),
346
    -- Herencia (Apunta a id)
347
    constraint fk_fisicas_persona foreign key (id) references core.personas(id) on delete cascade,
348
    -- Referencias Globales (Apuntan a id)
349
    constraint fk_fisicas_sexo foreign key (sexo_id) references global.sexos(id),
350
    constraint fk_fisicas_est_civil foreign key (estado_civil_id) references global.estados_civiles(id),
351
    constraint fk_fisicas_regimen foreign key (regimen_matrimonial_id) references global.regimenes_matrimoniales(id),
352
    constraint fk_fisicas_educacion foreign key (nivel_educativo_id) references global.niveles_educativos(id),
353
    constraint fk_fisicas_distrito foreign key (distrito_nacimiento_id) references global.distritos(id),
354
    constraint fk_fisicas_vivienda foreign key (situacion_vivienda_id) references global.tipos_vivienda(id),
355
    constraint fk_fisicas_tierra foreign key (tenencia_tierra_id) references global.tipos_tenencia_tierra(id),
356
    constraint fk_fisicas_ocupacion foreign key (ocupacion_id) references global.ocupaciones(id)
357
);
358
-- 3. TABLA HIJA: PERSONAS JURÍDICAS
359
create table core.personas_juridicas (
360
    id bigint not null,
361
    -- PK y FK
362
    razon_social varchar(200) not null,
363
    nombre_fantasia varchar(200),
364
    tipo_sociedad_id int not null,
365
    rango_ingreso_anual_id int,
366
    rango_cantidad_empleados_id int,
367
    -- Auditoría Full
368
    creado_en timestamptz default now() not null,
369
    creado_por bigint,
370
    actualizado_en timestamptz,
371
    actualizado_por bigint,
372
    eliminado_en timestamptz,
373
    eliminado_por bigint,
374
    constraint pk_personas_juridicas primary key (id),
375
    -- Herencia (Apunta a id)
376
    constraint fk_juridicas_persona foreign key (id) references core.personas(id) on delete cascade,
377
    constraint fk_juridicas_tipo_soc foreign key (tipo_sociedad_id) references global.tipos_sociedad(id),
378
    constraint fk_juridicas_rango_ing foreign key (rango_ingreso_anual_id) references global.rangos_ingresos(id),
379
    constraint fk_juridicas_rango_emp foreign key (rango_cantidad_empleados_id) references global.rangos_empleados(id)
380
);
381
-- 4. TABLA: DIRECCIONES
382
create table core.direcciones (
383
    id bigint generated by default as identity,
384
    -- Antes: direccion_id
385
    persona_id bigint not null,
386
    categoria_uso varchar(20) not null default 'DOMICILIO',
387
    es_principal boolean default false,
388
    distrito_id int not null,
389
    barrio varchar(100),
390
    calle_principal varchar(150) not null,
391
    numeracion varchar(20),
392
    referencia_ubicacion text,
393
    latitud decimal(10, 8),
394
    longitud decimal(11, 8),
395
    -- Auditoría Full
396
    creado_en timestamptz default now() not null,
397
    creado_por bigint,
398
    actualizado_en timestamptz,
399
    actualizado_por bigint,
400
    eliminado_en timestamptz,
401
    eliminado_por bigint,
402
    constraint pk_direcciones primary key (id),
403
    constraint fk_direcciones_persona foreign key (persona_id) references core.personas(id),
404
    constraint fk_direcciones_distrito foreign key (distrito_id) references global.distritos(id)
405
);
406
-- VÍNCULOS
407
create table core.vinculos_personas (
408
    id bigint generated by default as identity,
409
    -- Antes: vinculo_id
410
    persona_origen_id bigint not null,
411
    persona_destino_id bigint not null,
412
    tipo_vinculo_id int not null,
413
    cargo_id int,
414
    -- Auditoría Full
415
    creado_en timestamptz default now() not null,
416
    creado_por bigint,
417
    actualizado_en timestamptz,
418
    actualizado_por bigint,
419
    eliminado_en timestamptz,
420
    eliminado_por bigint,
421
    constraint pk_vinculos_personas primary key (id),
422
    constraint fk_vinculos_origen foreign key (persona_origen_id) references core.personas(id),
423
    constraint fk_vinculos_destino foreign key (persona_destino_id) references core.personas(id),
424
    constraint fk_vinculos_tipo foreign key (tipo_vinculo_id) references global.tipos_vinculo(id),
425
    constraint fk_vinculos_cargo foreign key (cargo_id) references global.cargos(id),
426
    -- Apunta a global.cargos(id)
427
    constraint ck_vinculos_bucle check (persona_origen_id <> persona_destino_id)
428
);
429
create table socioeconomico.perfiles_laborales (
430
    id bigint generated by default as identity,
431
    -- Antes: laboral_id
432
    persona_id bigint not null,
433
    fuente_ingresos_id int not null,
434
    tipo_relacion_id int,
435
    actividad_principal_id int not null,
436
    actividad_rubro_empleador_id int,
437
    nombre_empresa_empleador varchar(150),
438
    cargo_puesto_ocupado varchar(150),
439
    antiguedad_anos int default 0,
440
    antiguedad_meses int default 0,
441
    ingreso_neto_mensual numeric(19, 2) not null default 0,
442
    es_ingreso_principal boolean default true,
443
    -- Auditoría Full
444
    creado_en timestamptz default now() not null,
445
    creado_por bigint,
446
    actualizado_en timestamptz,
447
    actualizado_por bigint,
448
    eliminado_en timestamptz,
449
    eliminado_por bigint,
450
    constraint pk_perfiles_laborales primary key (id),
451
    constraint fk_laboral_persona foreign key (persona_id) references core.personas(id) on delete cascade,
452
    constraint fk_laboral_fuente foreign key (fuente_ingresos_id) references global.fuentes_ingresos(id),
453
    constraint fk_laboral_relacion foreign key (tipo_relacion_id) references global.tipos_relacion_laboral(id),
454
    constraint fk_laboral_act_propia foreign key (actividad_principal_id) references global.actividades_economicas(id),
455
    constraint fk_laboral_act_empleador foreign key (actividad_rubro_empleador_id) references global.actividades_economicas(id)
456
);
457
-- =================================================================================
458
-- ESQUEMA SOCIOS (Transaccional - Full Audit)
459
-- =================================================================================
460
/*
461
 create table socios.solicitudes_ingreso (
462
 id bigint generated by default as identity,
463
 -- Antes: solicitud_id
464
 persona_id bigint not null,
465
 fecha_solicitud date default current_date not null,
466
 es_reasociacion boolean default false,
467
 observaciones_iniciales text,
468
 manifestacion_bienes_id bigint,
469
 pep_vinculacion_id bigint,
470
 -- OJO: Falta tabla riesgo.listas_control
471
 estado_id int not null,
472
 fecha_resolucion date,
473
 usuario_resolucion_id bigint,
474
 acto_administrativo_resolucion varchar(150),
475
 fecha_ingreso_oficial date,
476
 observaciones_resolucion text,
477
 -- Auditoría Full
478
 creado_en timestamptz default now() not null,
479
 creado_por bigint,
480
 actualizado_en timestamptz,
481
 actualizado_por bigint,
482
 eliminado_en timestamptz,
483
 eliminado_por bigint,
484
 constraint pk_solicitudes_ingreso primary key (id),
485
 constraint fk_solicitud_persona foreign key (persona_id) references core.personas(id),
486
 constraint fk_solicitud_estado foreign key (estado_id) references global.estados_sistema(id),
487
 constraint fk_solicitud_pep foreign key (pep_vinculacion_id) references riesgo.listas_control(lista_id)
488
 );
489
 create table socios.maestro_socios (
490
 id bigint generated by default as identity,
491
 -- Antes: socio_id
492
 persona_id bigint not null,
493
 solicitud_origen_id bigint not null,
494
 numero_socio int not null,
495
 codigo_socio_legado varchar(50),
496
 -- OJO: Según el script base, no hay calificacion_riesgo_id aquí.
497
 fecha_ingreso date not null,
498
 fecha_salida date,
499
 motivo_salida varchar(200),
500
 estado_id int not null,
501
 -- Auditoría Full
502
 creado_en timestamptz default now() not null,
503
 creado_por bigint,
504
 actualizado_en timestamptz,
505
 actualizado_por bigint,
506
 eliminado_en timestamptz,
507
 eliminado_por bigint,
508
 constraint pk_maestro_socios primary key (id),
509
 constraint fk_socios_persona foreign key (persona_id) references core.personas(id),
510
 constraint fk_socios_solicitud foreign key (solicitud_origen_id) references socios.solicitudes_ingreso(id),
511
 constraint fk_socios_estado foreign key (estado_id) references global.estados_sistema(id),
512
 constraint uq_socios_numero unique (numero_socio)
513
 );*/
(3-3/3)