-- parametros
CREATE TABLE parametros (
    id SERIAL PRIMARY KEY,
    clave VARCHAR(255) UNIQUE NOT NULL,
    valor TEXT NOT NULL,
    descripcion TEXT,
    fecha_creacion TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    fecha_actualizacion TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP,
    usuario_ultima_mod VARCHAR(100)
);

-- Trigger para actualizar fecha_actualizacion automáticamente
CREATE OR REPLACE FUNCTION actualizar_fecha_actualizacion()
RETURNS TRIGGER AS $$
BEGIN
    NEW.fecha_actualizacion = CURRENT_TIMESTAMP;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_actualizacion_config
BEFORE UPDATE ON parametros
FOR EACH ROW
EXECUTE PROCEDURE actualizar_fecha_actualizacion();

-- para auditar 
-- CREATE TABLE parametros_historial (
--     id SERIAL PRIMARY KEY,
--     parametro_id INT REFERENCES config_parametros(id),
--     valor_anterior TEXT,
--     valor_nuevo TEXT,
--     usuario_modifico VARCHAR(100),
--     fecha_cambio TIMESTAMP WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP
-- );

DROP TABLE IF EXISTS registroEmpresa CASCADE;
DROP TABLE IF EXISTS cuis CASCADE;
DROP TABLE IF EXISTS cufd CASCADE;

--Tabla registroEmpresa
--Esta tabla almacena la información básica de cada sucursal:​
CREATE TABLE registroEmpresa (
    id SERIAL PRIMARY KEY,
    codigo_ambiente INTEGER NOT NULL,
    codigo_modalidad INTEGER NOT NULL,
    codigo_punto_venta INTEGER NOT NULL,
    codigo_sistema VARCHAR(100) NOT NULL,
    codigo_sucursal INTEGER NOT NULL,
    nit VARCHAR(150) NOT NULL,
    token_key varchar(50),
    token_value TEXT,
    nombre_archivo_certificado varchar(100),
    nombre_archivo_clave_privada varchar(100),
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- Añadir un índice único para la combinación de nit, codigo_sucursal y codigo_punto_venta
CREATE UNIQUE INDEX idx_unique_registro_empresa ON registroEmpresa(nit, codigo_sucursal, codigo_punto_venta);

--Tabla cuis
CREATE TABLE cuis (
    id                SERIAL PRIMARY KEY,
    cuis              VARCHAR(50) NOT NULL,
    codigo            TEXT,
    fecha_vigencia    TIMESTAMP,
    transaccion       BOOLEAN,
    fecha_creacion    TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    registro_empresa_id INTEGER NOT NULL,
    CONSTRAINT fk_cuis_registroempresa FOREIGN KEY (registro_empresa_id) REFERENCES registroEmpresa(id) ON UPDATE CASCADE ON DELETE CASCADE
);

-- CUFD
CREATE TABLE cufd (
    id SERIAL PRIMARY KEY,
    codigo TEXT,
    codigo_control TEXT,
    direccion TEXT,
    fecha_vigencia TIMESTAMP,
    transaccion BOOLEAN,
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    cuis_id INTEGER,
    FOREIGN KEY (cuis_id) REFERENCES cuis(id) ON UPDATE CASCADE ON DELETE CASCADE,
    UNIQUE(codigo, cuis_id)
);

-- -- todavia no se creo para cargar la factura
-- CREATE TABLE configuracionFactura (
--     id SERIAL PRIMARY KEY,
--     registro_empresa_id INTEGER NOT NULL,
--     logo BYTEA,  -- Para guardar la imagen del logo en formato binario (también puede ser una URL si prefieres)
--     nombre_comercial VARCHAR(255),
--     leyenda_pie_pagina TEXT,
--     telefono_contacto VARCHAR(50),
--     direccion_contacto TEXT,
--     correo_contacto VARCHAR(100),
--     sitio_web VARCHAR(100),
--     fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
--     fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
-- --     FOREIGN KEY (registro_empresa_id) REFERENCES registroEmpresa(id) ON UPDATE CASCADE
--     FOREIGN KEY (registro_empresa_id) REFERENCES registroEmpresa(id) ON UPDATE CASCADE ON DELETE CASCADE
-- );


-- Leyendas Factura
DROP TABLE IF EXISTS sincronizar_tipo_punto_venta CASCADE;
DROP TABLE IF EXISTS sincronizar_tipo_documento_identidad CASCADE;
DROP TABLE IF EXISTS sincronizar_tipo_motivo_anulacion CASCADE;
DROP TABLE IF EXISTS sincronizar_tipo_documento_sector CASCADE;
DROP TABLE IF EXISTS sincronizar_tipo_metodo_pago CASCADE;
DROP TABLE IF EXISTS sincronizar_tipo_moneda CASCADE;
DROP TABLE IF EXISTS sincronizar_leyendas_factura CASCADE;
DROP TABLE IF EXISTS sincronizar_productos_servicios CASCADE;
DROP TABLE IF EXISTS sincronizar_tipo_unidad_medida CASCADE;
DROP TABLE IF EXISTS sincronizar_actividades CASCADE;
DROP TABLE IF EXISTS sincronizar_tipo_emision CASCADE;
DROP TABLE IF EXISTS sincronizar_tipo_factura CASCADE;

-- sincronizar_tipo_punto_venta
CREATE TABLE sincronizar_tipo_punto_venta (
      id SERIAL PRIMARY KEY,
      codigo VARCHAR(50) NOT NULL,
      reqSoap TEXT,
      respSoap TEXT,
      reqJson TEXT,
      respJson TEXT,
      fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      cuis_id INTEGER,
      FOREIGN KEY (cuis_id) REFERENCES cuis(id) ON UPDATE CASCADE ON DELETE CASCADE,
      UNIQUE(codigo, cuis_id)
);

-- sincronizar_actividades
CREATE TABLE sincronizar_mensaje_servicio (
     id SERIAL PRIMARY KEY,
     codigo VARCHAR(50) NOT NULL,
     reqSoap TEXT,
     respSoap TEXT,
     reqJson TEXT,
     respJson TEXT,
     fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
     fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
     cuis_id INTEGER,
     FOREIGN KEY (cuis_id) REFERENCES cuis(id) ON UPDATE CASCADE ON DELETE CASCADE,
     UNIQUE(codigo, cuis_id)
);


-- sincronizar_actividades
CREATE TABLE sincronizar_evento_significativo (
      id SERIAL PRIMARY KEY,
      codigo VARCHAR(50) NOT NULL,
      reqSoap TEXT,
      respSoap TEXT,
      reqJson TEXT,
      respJson TEXT,
      fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      cuis_id INTEGER,
      FOREIGN KEY (cuis_id) REFERENCES cuis(id) ON UPDATE CASCADE ON DELETE CASCADE,
      UNIQUE(codigo, cuis_id)
);


-- sincronizar_tipo_documento_identidad
CREATE TABLE sincronizar_tipo_documento_identidad (
      id SERIAL PRIMARY KEY,
      codigo VARCHAR(50) NOT NULL,
      reqSoap TEXT,
      respSoap TEXT,
      reqJson TEXT,
      respJson TEXT,
      fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      cuis_id INTEGER,
      FOREIGN KEY (cuis_id) REFERENCES cuis(id) ON UPDATE CASCADE ON DELETE CASCADE,
      UNIQUE(codigo, cuis_id)
);

-- sincronizar_tipo_motivo_anulacion
CREATE TABLE sincronizar_tipo_motivo_anulacion (
      id SERIAL PRIMARY KEY,
      codigo VARCHAR(50) NOT NULL,
      reqSoap TEXT,
      respSoap TEXT,
      reqJson TEXT,
      respJson TEXT,
      fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      cuis_id INTEGER,
      FOREIGN KEY (cuis_id) REFERENCES cuis(id) ON UPDATE CASCADE ON DELETE CASCADE,
      UNIQUE(codigo, cuis_id)
);

-- sincronizar_tipo_metodo_pago
CREATE TABLE sincronizar_tipo_metodo_pago (
      id SERIAL PRIMARY KEY,
      codigo VARCHAR(50) NOT NULL,
      reqSoap TEXT,
      respSoap TEXT,
      reqJson TEXT,
      respJson TEXT,
      fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      cuis_id INTEGER,
      FOREIGN KEY (cuis_id) REFERENCES cuis(id) ON UPDATE CASCADE ON DELETE CASCADE,
      UNIQUE(codigo, cuis_id)
);

-- sincronizar_tipo_moneda
CREATE TABLE sincronizar_tipo_moneda (
     id SERIAL PRIMARY KEY,
     codigo VARCHAR(50) NOT NULL,
     reqSoap TEXT,
     respSoap TEXT,
     reqJson TEXT,
     respJson TEXT,
     fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
     fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
     cuis_id INTEGER,
     FOREIGN KEY (cuis_id) REFERENCES cuis(id) ON UPDATE CASCADE ON DELETE CASCADE,
     UNIQUE(codigo, cuis_id)
);

-- sincronizar_leyendas_factura
CREATE TABLE sincronizar_leyendas_factura (
      id SERIAL PRIMARY KEY,
      codigo VARCHAR(50) NOT NULL,
      reqSoap TEXT,
      respSoap TEXT,
      reqJson TEXT,
      respJson TEXT,
      fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      cuis_id INTEGER,
      FOREIGN KEY (cuis_id) REFERENCES cuis(id) ON UPDATE CASCADE ON DELETE CASCADE,
      UNIQUE(codigo, cuis_id)
);


-- sincronizar_tipo_documento_sector
CREATE TABLE sincronizar_tipo_documento_sector (
      id SERIAL PRIMARY KEY,
      codigo VARCHAR(50) NOT NULL,
      reqSoap TEXT,
      respSoap TEXT,
      reqJson TEXT,
      respJson TEXT,
      fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      cuis_id INTEGER,
      FOREIGN KEY (cuis_id) REFERENCES cuis(id) ON UPDATE CASCADE ON DELETE CASCADE,
      UNIQUE(codigo, cuis_id)
);

-- sincronizar_tipo_documento_sector
CREATE TABLE sincronizar_tipo_actividades_documento_sector (
   id SERIAL PRIMARY KEY,
   codigo VARCHAR(50) NOT NULL,
   reqSoap TEXT,
   respSoap TEXT,
   reqJson TEXT,
   respJson TEXT,
   fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
   fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
   cuis_id INTEGER,
   FOREIGN KEY (cuis_id) REFERENCES cuis(id) ON UPDATE CASCADE ON DELETE CASCADE,
   UNIQUE(codigo, cuis_id)
);

-- sincronizar_productos_servicios
CREATE TABLE sincronizar_productos_servicios (
     id SERIAL PRIMARY KEY,
     codigo VARCHAR(50) NOT NULL,
     reqSoap TEXT,
     respSoap TEXT,
     reqJson TEXT,
     respJson TEXT,
     fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
     fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
     cuis_id INTEGER,
     FOREIGN KEY (cuis_id) REFERENCES cuis(id) ON UPDATE CASCADE ON DELETE CASCADE,
     UNIQUE(codigo, cuis_id)
);

-- sincronizar_tipo_unidad_medida
CREATE TABLE sincronizar_tipo_unidad_medida (
   id SERIAL PRIMARY KEY,
   codigo VARCHAR(50) NOT NULL,
   reqSoap TEXT,
   respSoap TEXT,
   reqJson TEXT,
   respJson TEXT,
   fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
   fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
   cuis_id INTEGER,
   FOREIGN KEY (cuis_id) REFERENCES cuis(id) ON UPDATE CASCADE ON DELETE CASCADE,
   UNIQUE(codigo, cuis_id)
);

-- sincronizar_fecha_hora
CREATE TABLE sincronizar_fecha_hora (
     id SERIAL PRIMARY KEY,
     codigo VARCHAR(50) NOT NULL,
     reqSoap TEXT,
     respSoap TEXT,
     reqJson TEXT,
     respJson TEXT,
     fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
     fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
     cuis_id INTEGER,
     FOREIGN KEY (cuis_id) REFERENCES cuis(id) ON UPDATE CASCADE ON DELETE CASCADE,
     UNIQUE(codigo, cuis_id)
);

-- sincronizar_actividades
CREATE TABLE sincronizar_actividades (
    id SERIAL PRIMARY KEY,
    codigo VARCHAR(50) NOT NULL,
    reqSoap TEXT,
    respSoap TEXT,
    reqJson TEXT,
    respJson TEXT,
    fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    cuis_id INTEGER,
    FOREIGN KEY (cuis_id) REFERENCES cuis(id) ON UPDATE CASCADE ON DELETE CASCADE,
    UNIQUE(codigo, cuis_id)
);

-- sincronizar_tipo_emision
CREATE TABLE sincronizar_tipo_emision (
     id SERIAL PRIMARY KEY,
     codigo VARCHAR(50) NOT NULL,
     reqSoap TEXT,
     respSoap TEXT,
     reqJson TEXT,
     respJson TEXT,
     fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
     fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
     cuis_id INTEGER,
     FOREIGN KEY (cuis_id) REFERENCES cuis(id) ON UPDATE CASCADE ON DELETE CASCADE,
     UNIQUE(codigo, cuis_id)
);


-- sincronizar_tipo_factura
CREATE TABLE sincronizar_tipo_factura (
     id SERIAL PRIMARY KEY,
     codigo VARCHAR(50) NOT NULL,
     reqSoap TEXT,
     respSoap TEXT,
     reqJson TEXT,
     respJson TEXT,
     fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
     fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
     cuis_id INTEGER,
     FOREIGN KEY (cuis_id) REFERENCES cuis(id) ON UPDATE CASCADE ON DELETE CASCADE,
     UNIQUE(codigo, cuis_id)
);

-- sincronizar_Pais_Origen
CREATE TABLE sincronizar_Pais_Origen (
      id SERIAL PRIMARY KEY,
      codigo VARCHAR(50) NOT NULL,
      reqSoap TEXT,
      respSoap TEXT,
      reqJson TEXT,
      respJson TEXT,
      fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      cuis_id INTEGER,
      FOREIGN KEY (cuis_id) REFERENCES cuis(id) ON UPDATE CASCADE ON DELETE CASCADE,
      UNIQUE(codigo, cuis_id)
);

-- sincronizar_Tipo_Habitacion
CREATE TABLE sincronizar_Tipo_Habitacion (
      id SERIAL PRIMARY KEY,
      codigo VARCHAR(50) NOT NULL,
      reqSoap TEXT,
      respSoap TEXT,
      reqJson TEXT,
      respJson TEXT,
      fecha_creacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      fecha_actualizacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
      cuis_id INTEGER,
      FOREIGN KEY (cuis_id) REFERENCES cuis(id) ON UPDATE CASCADE ON DELETE CASCADE,
      UNIQUE(codigo, cuis_id)
);






INSERT INTO public.registroempresa (id, codigo_ambiente, codigo_modalidad, codigo_punto_venta, codigo_sistema, codigo_sucursal, nit, fecha_creacion, fecha_actualizacion) VALUES(2, 1, 1, 0, 'SIS123', 101, '123456789', '2025-04-15 11:37:49.431', '2025-04-15 11:37:49.431');
INSERT INTO public.registroempresa (id, codigo_ambiente, codigo_modalidad, codigo_punto_venta, codigo_sistema, codigo_sucursal, nit, fecha_creacion, fecha_actualizacion) VALUES(3, 1, 1, 1, 'SIS456', 102, '987654321', '2025-04-15 11:37:49.431', '2025-04-15 11:37:49.431');
INSERT INTO public.registroempresa (id, codigo_ambiente, codigo_modalidad, codigo_punto_venta, codigo_sistema, codigo_sucursal, nit, fecha_creacion, fecha_actualizacion) VALUES(4, 1, 2, 2, 'SIS789', 103, '192837465', '2025-04-15 11:37:49.431', '2025-04-15 11:37:49.431');
INSERT INTO public.registroempresa (id, codigo_ambiente, codigo_modalidad, codigo_punto_venta, codigo_sistema, codigo_sucursal, nit, fecha_creacion, fecha_actualizacion) VALUES(1, 2, 0, 0, '8168CCFCFBBA8FFA53DDD9F', 0, '382624027', '2025-04-14 10:03:32.758', '2025-04-14 10:03:32.758');

INSERT INTO public.cuis (id, cuis, codigo, fecha_vigencia, transaccion, fecha_creacion, fecha_actualizacion, registro_empresa_id) VALUES(2, 'CUIS001', '001', '2025-04-30 00:00:00.000', true, '2025-04-15 11:37:57.516', '2025-04-15 11:37:57.516', 1);
INSERT INTO public.cuis (id, cuis, codigo, fecha_vigencia, transaccion, fecha_creacion, fecha_actualizacion, registro_empresa_id) VALUES(3, 'CUIS002', '002', '2025-05-01 00:00:00.000', false, '2025-04-15 11:37:57.516', '2025-04-15 11:37:57.516', 2);
INSERT INTO public.cuis (id, cuis, codigo, fecha_vigencia, transaccion, fecha_creacion, fecha_actualizacion, registro_empresa_id) VALUES(4, 'CUIS003', '003', '2025-05-02 00:00:00.000', true, '2025-04-15 11:37:57.516', '2025-04-15 11:37:57.516', 3);
INSERT INTO public.cuis (id, cuis, codigo, fecha_vigencia, transaccion, fecha_creacion, fecha_actualizacion, registro_empresa_id) VALUES(1, 'E4B4A21', 'COD001', '2025-12-31 23:59:59.000', true, '2025-04-14 10:42:45.353', '2025-04-14 10:42:45.353', 1);

-- También suponiendo que el registro_empresa_id = 1
INSERT INTO configuracionFactura ( registro_empresa_id, logo, nombre_comercial, leyenda_pie_pagina, telefono_contacto, direccion_contacto, correo_contacto, sitio_web)
VALUES (1, NULL, 'Mi Empresa SRL', 'Gracias por su preferencia.', '+591 71234567', 'Av. Siempre Viva 123, La Paz', 'contacto@miempresa.com', 'https://www.miempresa.com');





INSERT INTO registroEmpresa (codigo_ambiente,codigo_modalidad,codigo_punto_venta,codigo_sistema,codigo_sucursal,nit)
VALUES (2,1,0,'8168CCFCFBBA8FFA53DDD9F',1,'382624027');

-- Suponiendo que el registro_empresa_id = 1
INSERT INTO cuis (cuis, codigo, fecha_vigencia, transaccion, registro_empresa_id)
VALUES ('CUIS987654321','COD001','2025-12-31 23:59:59',TRUE,1);

-- INSERT INTO cuis (codigo_sistema, cuis, codigo, transaccion)
-- VALUES ('8168CCFCFBBA8FFA53DDD9F', "E4B4A21", 'E4B4A21', true) RETURNING id;

-- Insertar moneda asociada al CUIS id=1
INSERT INTO cufd (codigo, codigo_control, direccion, fecha_vigencia, transaccion,  cuis_id)
VALUES ('BQcKhQ1lhbUFBODEZGQTUzREREOUY=QlU7NXFMTEVaVUFE2OENDRkNGQkJBO', '0ACF8A6504A1F74', 'CALLE AGUSTIN SAAVEDRA NRO. 464 EDIF.: TORRE IMAGINE PISO: 1 DEPTO.: OF3 ZONA/BARRIO: CASCO VIEJO MZA:216', '2025-04-30 23:59:59', true, 1);

UPDATE cufd
SET codigo = 'NEWCODE123456', codigo_control = 'NEWCTRL654321', direccion = 'Calle Nueva 123', fecha_vigencia = '2025-05-15 23:59:59', transaccion = false, fecha_actualizacion = CURRENT_TIMESTAMP
WHERE id = 1;

INSERT INTO tipo_documento_identidad (codigo, reqSoap, respSoap, reqJson, respJson, cuis_id)
VALUES ('CI', '<soap:Envelope><soap:Body>...</soap:Body></soap:Envelope>', '<soap:Envelope><soap:Body>...</soap:Body></soap:Envelope>', '{"request": "data"}', '{"response": "data"}', 1);


