CREATE TABLE fco_reportes
( cod_rep  number(3) NOT NULL,
  descripcion varchar2 (100) NULL,
  proc_generacion varchar2 (30) NULL,
  proc_borrado varchar2(30) NULL,
  operacion char(8) NULL, --porque se lleva las formas a RI y solo se quiere que se vean esos reportes  
    CONSTRAINT PK_fco_reportes PRIMARY KEY (cod_rep)
    USING INDEX TABLESPACE TS_ADAMINDICES
)
TABLESPACE TS_ADAMDATOS;

CREATE PUBLIC SYNONYM fco_reportes FOR ADAM.fco_reportes;
GRANT ALL ON fco_reportes TO ADAMA;

DROP TABLE fco_reportes_aut;
CREATE TABLE fco_reportes_aut
( cod_rep  number(3) NOT NULL,
  compania   char(4) NOT NULL,
  usuariow   varchar2(30) NOT NULL,
    CONSTRAINT PK_fco_reportes_aut PRIMARY KEY (cod_rep, compania, usuariow)
    USING INDEX TABLESPACE TS_ADAMINDICES
)
TABLESPACE TS_ADAMDATOS;

CREATE PUBLIC SYNONYM fco_reportes_aut FOR ADAM.fco_reportes_aut;
GRANT ALL ON fco_reportes_aut TO ADAMA;
CREATE TABLE fco_reportes_cias
(   cod_rep number(3) NOT NULL,
    compania     char(4) NOT NULL,
    CONSTRAINT PK_fco_reportes_cias PRIMARY KEY (cod_rep, compania)
    USING INDEX TABLESPACE TS_ADAMINDICES
)
TABLESPACE TS_ADAMDATOS;

CREATE PUBLIC SYNONYM fco_reportes_cias FOR ADAM.fco_reportes_cias;
GRANT ALL ON fco_reportes_cias TO ADAMA;
DROP TABLE fco_reportes_mm;
CREATE TABLE fco_reportes_mm
(
	id_rep     number(5) NOT NULL,
	usuariow	 varchar2(30) NOT NULL,
	cod_rep  number(3) NOT NULL,
  sec_archivo number(3) NOT NULL, --por si se manejan varios archivos. Es la sec configurada en la tabla ri_interfase_rutas
	secuencia  number(6) NULL,
	registros  varchar2(500) NULL
)
TABLESPACE TS_ADAMDATOS;

DROP INDEX in_fco_reportes_mm01;
CREATE INDEX in_fco_reportes_mm01 ON fco_reportes_mm(id_rep, usuariow, cod_rep) TABLESPACE TS_ADAMINDICES;

CREATE PUBLIC SYNONYM fco_reportes_mm FOR ADAM.fco_reportes_mm;
GRANT ALL ON fco_reportes_mm TO ADAMA;
CREATE TABLE fco_reportes_par
( cod_rep  number(3) NOT NULL,
  secuencia number(3) NOT NULL,
  orden number(3) NOT NULL,
  tit_campo varchar2(40) NOT NULL,
  tipo_campo number(2) NOT NULL,
  CONSTRAINT PK_fco_reportes_par PRIMARY KEY (cod_rep, secuencia)
  USING INDEX TABLESPACE TS_ADAMINDICES
)
TABLESPACE TS_ADAMDATOS;

CREATE PUBLIC SYNONYM fco_reportes_par FOR ADAM.fco_reportes_par;
GRANT ALL ON fco_reportes_par TO ADAMA;
CREATE TABLE fdt_rutas
( operacion char(8) NOT NULL, -- dependiendo del desarrollo, INT(interfase), REP(reportes), BCO(Bancos)
  codigo  number(3) NOT NULL,
  tipo number(3) NOT NULL, --1 (reporte), 2(medio magnetico)
  secuencia number(3) NOT NULL,
  archivo varchar2(50) NOT NULL,
  ruta varchar2(500) NOT NULL,
  tabla varchar2(30) NOT NULL,  --donde se guardara la info para ser invocado el reporte
  CONSTRAINT PK_fdt_rutas PRIMARY KEY (operacion, codigo, tipo, secuencia)
  USING INDEX TABLESPACE TS_ADAMINDICES
)
TABLESPACE TS_ADAMDATOS;

CREATE PUBLIC SYNONYM fdt_rutas FOR ADAM.fdt_rutas;
GRANT ALL ON fdt_rutas TO ADAMA;
CREATE OR REPLACE PROCEDURE sp_fdt_del_rutas
( pch_tipo_cod char,
  pti_codigo number,
  pnu_secuencia number DEFAULT NULL,
  pnu_tipo number
  
)
AS
/********************************************************************/
/*** Reportes e Interfases de Data Tecnologia                     ***/
/*** Descripcion: borra registros en las tablas fdt_rutas ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Abril 26 de 2005                                      ***/
/********************************************************************/
BEGIN
     DELETE fdt_rutas
     WHERE operacion = pch_tipo_cod
     AND codigo = pti_codigo
     AND tipo = pnu_tipo
     AND secuencia = pnu_secuencia;
     
     COMMIT;

END;
/
CREATE PUBLIC SYNONYM sp_fdt_del_rutas FOR ADAM.sp_fdt_del_rutas;
GRANT EXECUTE ON sp_fdt_del_rutas TO adama;
CREATE OR REPLACE PROCEDURE sp_fdt_upd_rutas
( pch_tipo_cod char,
  pti_codigo number,
  pnu_secuencia number DEFAULT NULL,
  pnu_tipo number,
  pvc_archivo varchar2,
  pvc_ruta varchar2,
  pvc_tabla varchar2
)
AS
/********************************************************************/
/*** Reportes e Interfases de Data Tecnologia                     ***/
/*** Descripcion: crea registros en las tablas fdt_rutas          ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Abril 26 de 2005                                      ***/
/********************************************************************/
  vnu_secuencia   number(3);
BEGIN

  IF NVL(pnu_secuencia,0) = 0 THEN-- es un registro nuevo
     vnu_secuencia :=0;
     BEGIN
        SELECT MAX(secuencia)
        INTO vnu_secuencia
        FROM fdt_rutas
        WHERE operacion = pch_tipo_cod
        AND codigo = pti_codigo
        AND tipo = pnu_tipo;
     EXCEPTION
          WHEN OTHERS THEN vnu_secuencia :=0;   
     END;
     vnu_secuencia := NVL(vnu_secuencia,0) + 1;
  
      INSERT INTO fdt_rutas (operacion, codigo, tipo, secuencia, archivo, ruta, tabla)
      VALUES (pch_tipo_cod ,pti_codigo, pnu_tipo, vnu_secuencia, pvc_archivo, pvc_ruta, pvc_tabla);  
  ELSE
      UPDATE fdt_rutas
      SET archivo = pvc_archivo,
      ruta = pvc_ruta,
      tabla = pvc_tabla
      WHERE operacion = pch_tipo_cod
      AND codigo = pti_codigo
      AND tipo = pnu_tipo
      AND secuencia = pnu_secuencia;    
  END IF;

  COMMIT;
END;
/
CREATE PUBLIC SYNONYM sp_fdt_upd_rutas FOR ADAM.sp_fdt_upd_rutas;
GRANT EXECUTE ON sp_fdt_upd_rutas TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_del_reportes_par
(
    pti_cod_rep number,
    pnu_secuencia number
)
AS
/********************************************************************/
/*** Reportes e Interfases de Data Tecnologia                     ***/
/*** Descripcion: borra registros de las tablas fco_reportes_par  ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Mayo 14 de 2005                                      ***/
/********************************************************************/

BEGIN--1
      DELETE fco_reportes_par
      WHERE cod_rep = pti_cod_rep
      AND secuencia = pnu_secuencia;
      
      COMMIT;
END;
/
CREATE PUBLIC SYNONYM sp_fco_del_reportes_par FOR ADAM.sp_fco_del_reportes_par;
GRANT EXECUTE ON sp_fco_del_reportes_par TO adama;

CREATE OR REPLACE PROCEDURE sp_fco_upd_reportes_aut
(
    pch_compania char,
    pti_cod_rep number,
    pti_relacionado number,    
    pvc_usuario varchar2
)
AS
/********************************************************************/
/*** Reportes e Interfases de Data Tecnologia                     ***/
/*** Descripcion: crea registros en las tablas fco_reportes_aut   ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Junio 8 de 2005                                      ***/
/********************************************************************/
  vnm_existe      number(1);
BEGIN

    IF pti_relacionado = 1 THEN--2
      vnm_existe := 0;
      BEGIN
        SELECT 1
        INTO vnm_existe
        FROM fco_reportes_aut 
        WHERE compania = pch_compania AND cod_rep = pti_cod_rep AND usuariow = pvc_usuario;
        EXCEPTION
            WHEN OTHERS THEN vnm_existe := 0;
      END;
      
      IF vnm_existe = 0 THEN--3
         INSERT INTO fco_reportes_aut (cod_rep, compania, usuariow) VALUES (pti_cod_rep, pch_compania, pvc_usuario);
      END IF;--3  
        
    ELSE
       DELETE FROM fco_reportes_aut WHERE compania = pch_compania AND cod_rep = pti_cod_rep AND usuariow = pvc_usuario;
    END IF;--2

    COMMIT WORK;        
    
END;
/
CREATE PUBLIC SYNONYM sp_fco_upd_reportes_aut FOR ADAM.sp_fco_upd_reportes_aut;
GRANT EXECUTE ON sp_fco_upd_reportes_aut TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_upd_reportes_par
( pti_cod_rep number,
  pnu_secuencia number DEFAULT NULL,
  pnu_orden number,
  pvc_tit_campo varchar2,
  pnu_tipo_campo number
)
AS
/********************************************************************/
/*** Reportes e Interfases de Data Tecnologia                     ***/
/*** Descripcion: crea registros en las tablas fco_reportes_par   ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Mayo 14 de 2005                                      ***/
/********************************************************************/
  vnm_existe number(3);
  vnu_secuencia   number(3);
BEGIN

IF NVL(pnu_secuencia,0) = 0 THEN-- es un registro nuevo
   vnu_secuencia :=0;
   BEGIN
      SELECT MAX(secuencia)
      INTO vnu_secuencia
      FROM fco_reportes_par
      WHERE cod_rep = pti_cod_rep;
   EXCEPTION
        WHEN OTHERS THEN vnu_secuencia :=0;
   END;
   vnu_secuencia := NVL(vnu_secuencia,0) + 1;

    INSERT INTO fco_reportes_par (cod_rep, secuencia, orden, tit_campo, tipo_campo)
    VALUES (pti_cod_rep, vnu_secuencia, pnu_orden, pvc_tit_campo, pnu_tipo_campo);

ELSE
     --revisando que el orden no exista ya en otra secuencia
     vnm_existe := 0;
     BEGIN
        SELECT 1
        INTO vnm_existe
        FROM fco_reportes_par
        WHERE cod_rep = pti_cod_rep
        AND secuencia <> pnu_secuencia
        AND orden = pnu_orden;
     EXCEPTION
        WHEN OTHERS THEN vnm_existe := 0;
     END;

     IF vnm_existe = 0 THEN
         UPDATE fco_reportes_par
         SET orden = pnu_orden,
         tit_campo = pvc_tit_campo,
         tipo_campo = pnu_tipo_campo
         WHERE cod_rep = pti_cod_rep
         AND secuencia = pnu_secuencia;
     ELSE
        RAISE_APPLICATION_ERROR(-20001,'El valor del orden que digito ya existe en otro registro');
        RETURN;
     END IF;

END IF; --registro nuevo

    COMMIT;
END;
/
CREATE PUBLIC SYNONYM sp_fco_upd_reportes_par FOR ADAM.sp_fco_upd_reportes_par;
GRANT EXECUTE ON sp_fco_upd_reportes_par TO adama;

CREATE OR REPLACE PROCEDURE sp_fco_upd_reportes
(
    pch_compania char,
    pti_relacionado number,
    pti_cod_rep number,
    pvc_descripcion varchar2,
    pti_operacion number DEFAULT 1, --1:alta, 2:modificacion
    pch_operacion char,    
    pvc_nombre_proc varchar2 DEFAULT NULL,
    pvc_proc_borrado varchar2 DEFAULT NULL
)
AS
/********************************************************************/
/*** Reportes e Interfases de Data Tecnologia                     ***/
/*** Descripcion: crea registros en las tablas fco_reportes       ***/
/*** y ri_intefase_cias                                           ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Mayo 14 de 2005                                       ***/
/********************************************************************/
  vnm_existe      number(1);
BEGIN

    vnm_existe := 0;
    BEGIN
      SELECT 1
      INTO vnm_existe
      FROM fco_reportes WHERE cod_rep = pti_cod_rep;
      EXCEPTION
         WHEN OTHERS THEN vnm_existe := 0;        
    END;

    IF vnm_existe = 1 THEN --1. 
		  IF pti_operacion = 1 THEN
		      BEGIN
      	     RAISE_APPLICATION_ERROR(-20001,'El codigo del reporte que quiere insertar ya existe. verifique por favor.');
             RETURN;       
		      END;
      END IF;
  		
      IF pti_operacion = 2 THEN
  			      UPDATE fco_reportes 
              SET descripcion = pvc_descripcion,
              proc_generacion = pvc_nombre_proc, 
              proc_borrado = pvc_proc_borrado,
              operacion = pch_operacion
              WHERE cod_rep = pti_cod_rep;		
      END IF;
    
    ELSE
          INSERT INTO fco_reportes (cod_rep, descripcion, proc_generacion, proc_borrado, operacion) VALUES(pti_cod_rep, pvc_descripcion, pvc_nombre_proc, pvc_proc_borrado, pch_operacion);
    END IF;--1

    IF pti_relacionado = 1 THEN--2
      vnm_existe := 0;
      BEGIN
        SELECT 1
        INTO vnm_existe
        FROM fco_reportes_cias WHERE compania = pch_compania AND cod_rep = pti_cod_rep;
        EXCEPTION
                WHEN OTHERS THEN vnm_existe := 0;        
      END;

      IF vnm_existe = 0 THEN--3
         INSERT INTO fco_reportes_cias (compania, cod_rep) VALUES (pch_compania, pti_cod_rep);
      END IF;--3  
        
    ELSE
       DELETE FROM fco_reportes_cias WHERE compania = pch_compania AND cod_rep = pti_cod_rep;
    END IF;--2

    COMMIT WORK;        
    
END;
/
CREATE PUBLIC SYNONYM sp_fco_upd_reportes FOR ADAM.sp_fco_upd_reportes;
GRANT EXECUTE ON sp_fco_upd_reportes TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_del_reportes
(
    pch_compania char,
    pti_cod_rep number,
    pch_operacion char
)
AS
/********************************************************************/
/*** Reportes e Interfases de Data Tecnologia                     ***/
/*** Descripcion: borra registros de las tablas fco_reportes      ***/
/*** y fco_reportes_cias, fco_reportes_par, fdt_rutas             ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Mayo 14 de 2005                                       ***/
/********************************************************************/
  vnm_existe      number(1);
  vvc_parametro   varchar2(10);
BEGIN--1
    vnm_existe := 0;
    BEGIN
      SELECT 1
      INTO vnm_existe
      FROM fco_reportes_cias
      WHERE cod_rep = pti_cod_rep AND compania <> pch_compania;
      EXCEPTION
           WHEN OTHERS THEN vnm_existe := 0;        
    END;
      
    IF vnm_existe = 1 THEN
        RAISE_APPLICATION_ERROR(-20001,'Este reporte no se puede eliminar porque tiene relación con otras compañías');
        RETURN;        
    END IF;
        
    vvc_parametro := 'report_' || pti_cod_rep;
    DELETE FROM fco_reportes_cias WHERE compania = pch_compania AND cod_rep = pti_cod_rep;
    DELETE FROM fco_reportes_par WHERE cod_rep = pti_cod_rep;
    DELETE FROM fdt_rutas WHERE codigo = pti_cod_rep AND operacion = pch_operacion;
    DELETE FROM fco_reportes WHERE cod_rep = pti_cod_rep;
    DELETE FROM fdt_parametros WHERE pais = 'COL' AND compania = pch_compania
    AND parametro = vvc_parametro;

    IF vnm_existe = 0 THEN
	    DELETE FROM fdt_parametros WHERE pais = 'COL' AND compania = '0'
	    AND parametro = vvc_parametro;
		END IF;
    
    COMMIT WORK;
    
END;--1
/
CREATE PUBLIC SYNONYM sp_fco_del_reportes FOR ADAM.sp_fco_del_reportes;
GRANT EXECUTE ON sp_fco_del_reportes TO adama;
