udistrital / argo_documentacion

0 stars 0 forks source link

Diseño e implementación especificaciones técnicas - microservicio gestion contractual crud #186

Closed edwargl7 closed 1 week ago

edwargl7 commented 3 weeks ago

Se requiere realizar el diseño e implementación del CRUD para la gestión de especificaciones técnicas basado en el mockup propuesto. Repositorio gestion_contractual_crud

image

Sub Tareas

Criterios de aceptación

Requerimientos

No aplica

Lineamientos Generales Lineamientos que se deben cumplir en cualquier desarrollo.

Lineamientos Microservicios

Lineamientos Modelos de datos

Definition of Ready - DoR

Definition of Done - DoD - Desarrollo

edwargl7 commented 3 weeks ago

Te puedes guiar de lo avanzado en el la Issue #173 que cuenta con el script y la base de la tabla de especificaciones técnicas.

EliSLopezM commented 3 weeks ago

Propuesta de tabla para especificaciones técnicas asociadas a un contrato.

image

EliSLopezM commented 3 weeks ago

Se realizo proceso de la base de datos teniendo en cuenta la estructura de la issue #173 de la cual, y se incorporo las siguientes tablas faltantes segun el modelo:


DO $$ 
BEGIN 
    -- Tabla documento_contrato
    IF NOT EXISTS (SELECT FROM pg_tables WHERE schemaname = 'public' AND tablename = 'documento_contrato') THEN
        CREATE TABLE documento_contrato (
            id SERIAL PRIMARY KEY,                                   -- Identificador único del documento de contrato
            tipo_documento_id INTEGER NOT NULL,                      -- Tipo de documento (valor numérico sin relación)
            documento_id INTEGER NOT NULL,                           -- Identificador del documento
            activo BOOLEAN NOT NULL,                                 -- Indica si el registro está activo
            fecha_creacion TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,    -- Fecha de creación del registro
            fecha_modificacion TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -- Fecha de última modificación
        );

        COMMENT ON TABLE documento_contrato IS 'Tabla que almacena los documentos asociados a contratos';
        COMMENT ON COLUMN documento_contrato.id IS 'Identificador único del documento de contrato';
        COMMENT ON COLUMN documento_contrato.tipo_documento_id IS 'Tipo de documento (valor numérico sin relación)';
        COMMENT ON COLUMN documento_contrato.documento_id IS 'Identificador del documento';
        COMMENT ON COLUMN documento_contrato.activo IS 'Indica si el registro está activo';
        COMMENT ON COLUMN documento_contrato.fecha_creacion IS 'Fecha de creación del registro';
        COMMENT ON COLUMN documento_contrato.fecha_modificacion IS 'Fecha de última modificación';
    END IF;

    -- Tabla estado_contrato
    IF NOT EXISTS (SELECT FROM pg_tables WHERE schemaname = 'public' AND tablename = 'estado_contrato') THEN
        CREATE TABLE estado_contrato (
            id SERIAL PRIMARY KEY,                                   -- Identificador único del estado del contrato
            usuario_id INTEGER NOT NULL,                             -- Identificador del usuario
            motivo VARCHAR(250),                                     -- Motivo del estado
            fecha_ejecucion_estado TIMESTAMP,                        -- Fecha de ejecución del estado
            contrato_general_id INTEGER NOT NULL,                    -- Referencia al contrato general
            estado_id INTEGER NOT NULL,                              -- Estado del contrato
            activo BOOLEAN NOT NULL,                                 -- Indica si el registro está activo
            fecha_creacion TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,    -- Fecha de creación del registro
            fecha_modificacion TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -- Fecha de última modificación
        );

        COMMENT ON TABLE estado_contrato IS 'Tabla que almacena los estados asociados a contratos';
        COMMENT ON COLUMN estado_contrato.id IS 'Identificador único del estado del contrato';
        COMMENT ON COLUMN estado_contrato.usuario_id IS 'Identificador del usuario';
        COMMENT ON COLUMN estado_contrato.motivo IS 'Motivo del estado';
        COMMENT ON COLUMN estado_contrato.fecha_ejecucion_estado IS 'Fecha de ejecución del estado';
        COMMENT ON COLUMN estado_contrato.contrato_general_id IS 'Referencia al contrato general';
        COMMENT ON COLUMN estado_contrato.estado_id IS 'Estado del contrato';
        COMMENT ON COLUMN estado_contrato.activo IS 'Indica si el registro está activo';
        COMMENT ON COLUMN estado_contrato.fecha_creacion IS 'Fecha de creación del registro';
        COMMENT ON COLUMN estado_contrato.fecha_modificacion IS 'Fecha de última modificación';
    END IF;

    -- Tabla solicitante
    IF NOT EXISTS (SELECT FROM pg_tables WHERE schemaname = 'public' AND tablename = 'solicitante') THEN
        CREATE TABLE solicitante (
            id SERIAL PRIMARY KEY,                                   -- Identificador único del solicitante
            dependencia_solicitante_id INTEGER NOT NULL,             -- Dependencia del solicitante
            sede_solicitente_id INTEGER NOT NULL,                    -- Sede del solicitante
            contrato_general_id INTEGER NOT NULL,                    -- Referencia al contrato general
            activo BOOLEAN NOT NULL,                                 -- Indica si el registro está activo
            fecha_creacion TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,    -- Fecha de creación del registro
            fecha_modificacion TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -- Fecha de última modificación
        );

        COMMENT ON TABLE solicitante IS 'Tabla que almacena la información de los solicitantes';
        COMMENT ON COLUMN solicitante.id IS 'Identificador único del solicitante';
        COMMENT ON COLUMN solicitante.dependencia_solicitante_id IS 'Dependencia del solicitante';
        COMMENT ON COLUMN solicitante.sede_solicitente_id IS 'Sede del solicitante';
        COMMENT ON COLUMN solicitante.contrato_general_id IS 'Referencia al contrato general';
        COMMENT ON COLUMN solicitante.activo IS 'Indica si el registro está activo';
        COMMENT ON COLUMN solicitante.fecha_creacion IS 'Fecha de creación del registro';
        COMMENT ON COLUMN solicitante.fecha_modificacion IS 'Fecha de última modificación';
    END IF;
END $$;

-- Añadir claves foráneas (excluyendo tipo_documento_id)
DO $$ 
BEGIN
    IF NOT EXISTS (
        SELECT 1 FROM information_schema.table_constraints 
        WHERE constraint_name = 'fk_estado_contrato_general'
    ) THEN
        ALTER TABLE estado_contrato
            ADD CONSTRAINT fk_estado_contrato_general
            FOREIGN KEY (contrato_general_id)
            REFERENCES contrato_general(id);
    END IF;

    IF NOT EXISTS (
        SELECT 1 FROM information_schema.table_constraints 
        WHERE constraint_name = 'fk_solicitante_contrato_general'
    ) THEN
        ALTER TABLE solicitante
            ADD CONSTRAINT fk_solicitante_contrato_general
            FOREIGN KEY (contrato_general_id)
            REFERENCES contrato_general(id);
    END IF;
END $$;

Se corrigio la tabla de "especificaciones técnicas" para que cumpla con el modeo planteado inicialemnte y se ajusto su nombre a singular


--  Eliminar la tabla original
DROP TABLE especificaciones_tecnicas;

CREATE TABLE especificacion_tecnica (
    id SERIAL PRIMARY KEY,                     -- Identificador único
    item INTEGER NOT NULL,                     -- Nuevo atributo en segundo lugar
    especificacion VARCHAR NOT NULL,           -- Nuevo atributo debajo de item
    descripcion VARCHAR NOT NULL,              -- Descripción
    cantidad INTEGER NOT NULL,                 -- Cantidad
    valor_unitario NUMERIC NOT NULL,           -- Valor unitario
    valor_total NUMERIC NOT NULL,              -- Valor total
    contrato_general_id INTEGER NOT NULL,      -- ID de contrato general
    activo BOOLEAN NOT NULL,                   -- Activo
    fecha_creacion TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,    -- Fecha de creación
    fecha_modificacion TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP -- Fecha de última modificación
);

-- Agregar comentarios a la tabla
COMMENT ON TABLE especificacion_tecnica IS 'Tabla que almacena las especificaciones técnicas de los contratos';

-- Agregar comentarios a las columnas
COMMENT ON COLUMN especificacion_tecnica.id IS 'Identificador único de la especificación técnica';
COMMENT ON COLUMN especificacion_tecnica.item IS 'Número de item de la especificación técnica';
COMMENT ON COLUMN especificacion_tecnica.especificacion IS 'Especificación técnica';
COMMENT ON COLUMN especificacion_tecnica.descripcion IS 'Descripción detallada de la especificación técnica';
COMMENT ON COLUMN especificacion_tecnica.cantidad IS 'Cantidad de unidades de la especificación técnica';
COMMENT ON COLUMN especificacion_tecnica.valor_unitario IS 'Valor unitario de la especificación técnica';
COMMENT ON COLUMN especificacion_tecnica.valor_total IS 'Valor total calculado de la especificación técnica';
COMMENT ON COLUMN especificacion_tecnica.contrato_general_id IS 'Referencia al contrato general asociado';
COMMENT ON COLUMN especificacion_tecnica.activo IS 'Indica si el registro está activo';
COMMENT ON COLUMN especificacion_tecnica.fecha_creacion IS 'Fecha de creación del registro';
COMMENT ON COLUMN especificacion_tecnica.fecha_modificacion IS 'Fecha de última modificación del registro';

-- Agregar la clave foránea para contrato_general_id
ALTER TABLE especificacion_tecnica
    ADD CONSTRAINT fk_especificacion_tecnica_contrato_general
    FOREIGN KEY (contrato_general_id)
    REFERENCES contrato_general(id);

Ademas se realizo el ajuste incial de la #185 sobre el campo usuario_legado

edwargl7 commented 3 weeks ago

Revisando con @cjgonzalezp el item no sería almacenado, y se manejaría como el indice según el orden de los registros asociados al contrato

EliSLopezM commented 2 weeks ago

Inserccion de datos:

-- ajustes de as tablas para inserción de datos 

ALTER TABLE contrato_general
    ALTER COLUMN modo_pago TYPE varchar(255),
    ALTER COLUMN objeto_contrato TYPE varchar(255),
    ALTER COLUMN actividades TYPE varchar(255),
    ALTER COLUMN condiciones TYPE varchar(255),
    ALTER COLUMN justificacion TYPE varchar(255),
    ALTER COLUMN observaciones TYPE varchar(255),
    ALTER COLUMN concepto_elaboracion TYPE varchar(255),
    ALTER TABLE contrato_general ALTER COLUMN vigencia TYPE varchar(10),
    ALTER TABLE contrato_general ALTER COLUMN usuario_legado TYPE varchar(120);

INSERT INTO contrato_general (
    tipo_contratacion_id, tipo_contrato_id, fecha_suscripcion_estudios, 
    aplica_poliza, ordenador_id, modalidad_id, tipologia_especifica_id, 
    regimen_contratacion_id, procedimiento_id, plazo_ejecucion, 
    fecha_proyeccion_id, numero_constancia, clase_constancia_id, 
    valor_acumulados, tipo_smlmv_id, valor_pesos, origen_recursos_id, 
    origen_presupuesto_id, forma_pago_inversion_id, valor_contrato_me, 
    valor_tasa_cambio, modelo_pago_id, clausula_registro_presupuestal, 
    modo_pago, objeto_contrato, actividades, condiciones, justificacion, 
    observaciones, vigencia, concepto_elaboracion, fecha_inicial, 
    fecha_final, usuario_legado, activo, fecha_creacion
) 
VALUES 
(1, 1, '2024-01-10', true, 1, 1, 1, 
 1, 1, 12, 1, 1001, 1, 5000000.00, 1, 500000.00, 1, 
 1, 1, 20000.00, 1.0, 1, true, 
 'Transferencia', 'Estudio de viabilidad', 'Realizar estudios previos', 'Condiciones generales', 'Justificación del contrato', 
 'Observaciones varias', '2024', 'Concepto de elaboración', '2024-01-15', 
 '2024-12-31', 'Legado1', true, '2024-01-10'
),

(2, 2, '2024-02-01', true, 2, 2, 2, 
 2, 2, 24, 2, 1002, 2, 7500000.00, 2, 750000.00, 2, 
 2, 2, 35000.00, 1.2, 2, true, 
 'Pago único', 'Consultoría de sistemas', 'Análisis de requerimientos', 'Condiciones específicas', 'Justificación para sistemas', 
 'Observaciones de sistemas', '2024', 'Concepto consultoría', '2024-02-01', 
 '2024-08-31', 'Legado2', true, '2024-02-01'
),

(3, 3, '2024-03-05', false, 3, 3, 3, 
 3, 3, 36, 3, 1003, 3, 12500000.00, 3, 1250000.00, 3, 
 3, 3, 42000.00, 1.1, 3, false, 
 'Transferencia', 'Mantenimiento de infraestructura', 'Revisión de instalaciones', 'Condiciones de mantenimiento', 'Justificación mantenimiento', 
 'Observaciones adicionales', '2024', 'Concepto mantenimiento', '2024-03-01', 
 '2024-12-31', 'Legado3', true, '2024-03-01'
),

(4, 4, '2024-04-10', true, 4, 4, 4, 
 4, 4, 48, 4, 1004, 4, 9500000.00, 4, 950000.00, 4, 
 4, 4, 38000.00, 1.3, 4, true, 
 'Anticipo', 'Construcción de oficinas', 'Construcción de instalaciones', 'Condiciones de construcción', 'Justificación de construcción', 
 'Observaciones de construcción', '2024', 'Concepto construcción', '2024-04-10', 
 '2024-10-10', 'Legado4', true, '2024-04-10'
),

(5, 5, '2024-05-20', false, 5, 5, 5, 
 5, 5, 60, 5, 1005, 5, 11000000.00, 5, 1100000.00, 5, 
 5, 5, 50000.00, 1.4, 5, true, 
 'Pago contra entrega', 'Adquisición de equipos', 'Compra de maquinaria', 'Condiciones de compra', 'Justificación de adquisición', 
 'Observaciones sobre adquisición', '2024', 'Concepto adquisición', '2024-05-01', 
 '2024-12-15', 'Legado5', true, '2024-05-01'
);

-- Insertar datos en la tabla cdp con IDs de contrato_general existentes
INSERT INTO cdp (numero_cdp_id, fecha_registro, vigencia_cdp, contrato_general_id, activo, fecha_creacion)
VALUES
(1000001, '2024-01-02', 1, 2, true, '2024-01-02'),
(1000002, '2024-02-02', 2, 3, true, '2024-02-02'),
(1000003, '2024-03-02', 3, 4, true, '2024-03-02'),
(1000004, '2024-04-02', 4, 5, true, '2024-04-02'),
(1000005, '2024-05-02', 5, 6, true, '2024-05-02');

-- Insertar datos en documento_contrato (especificando documento_id manualmente)
INSERT INTO documento_contrato (documento_id, tipo_documento_id, contrato_general_id, activo, fecha_creacion)
VALUES
(1, 1, 2, true, '2024-01-03'),
(2, 2, 3, true, '2024-02-03'),
(3, 3, 4, true, '2024-03-03'),
(4, 4, 5, true, '2024-04-03'),
(5, 5, 6, true, '2024-05-03');

INSERT INTO especificacion_tecnica (item, especificacion, descripcion, cantidad, valor_unitario, valor_total, contrato_general_id, activo, fecha_creacion)
VALUES
(1, 'Especificación A', 'Especificación 1', 10, 100, 1000, 2, true, '2024-01-04'),
(2, 'Especificación B', 'Especificación 2', 20, 200, 4000, 3, true, '2024-02-04'),
(3, 'Especificación C', 'Especificación 3', 15, 150, 2250, 4, true, '2024-03-04'),
(4, 'Especificación D', 'Especificación 4', 30, 300, 9000, 5, true, '2024-04-04'),
(5, 'Especificación E', 'Especificación 5', 25, 250, 6250, 6, true, '2024-05-04');

-- Insertar datos en supervisor_contrato
INSERT INTO supervisor_contrato (supervisor_id, contrato_general_id, activo, fecha_creacion)
VALUES
(1, 2, true, '2024-01-06'),
(2, 3, true, '2024-02-06'),
(3, 4, true, '2024-03-06'),
(4, 5, true, '2024-04-06'),
(5, 6, true, '2024-05-06');

-- Insertar datos en lugar_ejecucion con IDs válidos de contrato_general
INSERT INTO lugar_ejecucion (municipio_id, pais_id, dependencia_id, ciudad_id, sede_id, direccion, contrato_general_id, activo, fecha_creacion)
VALUES
(1, 1, 1, 1, 1, 'Dirección 1', 2, true, '2024-01-07'),
(2, 1, 1, 1, 2, 'Dirección 2', 3, true, '2024-02-07'),
(3, 2, 1, 2, 3, 'Dirección 3', 4, true, '2024-03-07'),
(4, 3, 2, 3, 4, 'Dirección 4', 5, true, '2024-04-07'),
(5, 4, 3, 4, 5, 'Dirección 5', 6, true, '2024-05-07');

-- Insertar datos en solicitante con todas las columnas disponibles
INSERT INTO solicitante (dependencia_solicitante_id, sede_solicitente_id, contrato_general_id, activo, fecha_creacion)
VALUES
(1, 2, 2, true, '2024-01-08'),
(2, 3, 3, true, '2024-02-08'),
(3, 4, 4, true, '2024-03-08'),
(4, 5, 5, true, '2024-04-08'),
(5, 6, 6, true, '2024-05-08');

-- Insertar datos en convenio
INSERT INTO convenio (monto_convenio_id, tipo_convenio_id, contrato_general_id, activo, fecha_creacion)
VALUES
(100000, 1, 2, true, '2024-01-09'),
(200000, 2, 3, true, '2024-02-09'),
(150000, 3, 4, true, '2024-03-09'),
(300000, 4, 5, true, '2024-04-09'),
(250000, 5, 6, true, '2024-05-09');

-- Insertar datos en registro_presupuestal con los valores de cdp_id de la tabla cdp
INSERT INTO registro_presupuestal (numero_disponibilidad, fecha_registro, vigencia_cdp, cdp_id, activo, fecha_creacion)
VALUES
(1001, '2024-01-10', 2024, 6, true, '2024-01-10'),
(1002, '2024-02-10', 2024, 7, true, '2024-02-10'),
(1003, '2024-03-10', 2024, 8, true, '2024-03-10'),
(1004, '2024-04-10', 2024, 9, true, '2024-04-10'),
(1005, '2024-05-10', 2024, 10, true, '2024-05-10');

-- Insertar datos en la tabla acta_inicio
INSERT INTO acta_inicio (usuario_id, usuario_legado, descripcion, fecha_inicio, fecha_fin, contrato_general_id, activo, fecha_creacion)
VALUES
(1, 'Legado1', 'Descripción del acta de inicio 1', '2024-01-15', '2024-12-31', 2, true, '2024-01-15'),
(2, 'Legado2', 'Descripción del acta de inicio 2', '2024-02-01', '2024-08-31', 3, true, '2024-02-01'),
(3, 'Legado3', 'Descripción del acta de inicio 3', '2024-03-01', '2024-12-31', 4, true, '2024-03-01'),
(4, 'Legado4', 'Descripción del acta de inicio 4', '2024-04-10', '2024-10-10', 5, true, '2024-04-10'),
(5, 'Legado5', 'Descripción del acta de inicio 5', '2024-05-01', '2024-12-15', 6, true, '2024-05-01');

-- Insertar datos en la tabla contrato_arrendamiento
INSERT INTO contrato_arrendamiento (plazo_pago_mensual, plazo_administracion, valor_administracion, plazo_entrega, valor_arrendamiento, contrato_general_id, activo, fecha_creacion)
VALUES
(30, 12, 50000, 90, 1500000, 2, true, '2024-01-12'),
(60, 24, 60000, 120, 2000000, 3, true, '2024-02-12'),
(45, 18, 55000, 100, 1800000, 4, true, '2024-03-12'),
(30, 12, 50000, 90, 1700000, 5, true, '2024-04-12'),
(60, 24, 60000, 120, 1600000, 6, true, '2024-05-12');

-- Insertar datos en la tabla contratista
INSERT INTO contratista (numero_documento, tipo_persona, contrato_general_id, activo, fecha_creacion)
VALUES
(10000001, 'Natural', 2, true, '2024-01-13'),
(10000002, 'Jurídica', 3, true, '2024-02-13'),
(10000003, 'Natural', 4, true, '2024-03-13'),
(10000004, 'Jurídica', 5, true, '2024-04-13'),
(10000005, 'Natural', 6, true, '2024-05-13');

-- Insertar datos en la tabla estado_contrato
INSERT INTO estado_contrato (usuario_id, motivo, fecha_ejecucion_estado, contrato_general_id, estado_id, activo, fecha_creacion)
VALUES
(1, 'Motivo A', '2024-01-14', 2, 1, true, '2024-01-14'),
(2, 'Motivo B', '2024-02-14', 3, 2, true, '2024-02-14'),
(3, 'Motivo C', '2024-03-14', 4, 3, true, '2024-03-14'),
(4, 'Motivo D', '2024-04-14', 5, 4, true, '2024-04-14'),
(5, 'Motivo E', '2024-05-14', 6, 5, true, '2024-05-14');
EliSLopezM commented 2 weeks ago

Pruebas del crud:

image

image

image

image

image

edwargl7 commented 1 week ago

Buena implementación aprobados cambios. Se observan las siguientes lineas de código que deben tenerse presente para el despliegue. image image