CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_ACH_bogota
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por ACH del Banco de Bogota             ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Marzo 14/2005                                         ***/
/********************************************************************/
vvc_tablaTN   varchar2(20);
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

vch_agr_id    char(10);
vch_agr_cta   char(10);

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar el estado del periodo
-------------------------------------------------
CURSOR c_ti_sit(
 ach_compania	companias.Compania%TYPE,
 asi_id_cal	calendario_procesos.id_calendario%TYPE
) IS
  SELECT
    sit_periodo
  FROM
    cal_proc_cias
  WHERE
    compania = ach_compania And
    id_calendario = asi_id_cal;
-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_procesar.id_rep%TYPE,
 avc_usuario ri_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT c.compania, c.clase_nomina, c.tipo_nomina, c.anio, c.periodo, a.id_calendario
 FROM calendario_procesos a, cal_proc_cias b, ri_procesar c
 WHERE a.id_calendario = b.id_calendario
 AND a.tipo_nomina = c.tipo_nomina
 AND a.anio = c.anio
 AND a.periodo = c.periodo
 AND b.compania = c.compania
 AND c.id_rep = asi_id_rep
 AND c.usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

	DELETE fdt_bancos_tmp
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario;  
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);

  --agrupación del tipo del documento, cambiar de acuerdo al cliente
  vch_agr_id := 'TDN';
  vch_agr_cta := 'CTA';  
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania, cch_clase_nom, cch_tipo_nom, cnu_anio, cnu_periodo, cnu_id_cal;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      --  Verificar el estado del periodo
      OPEN c_ti_sit(cch_compania, cnu_id_cal);
      FETCH c_ti_sit INTO vti_sit;
      CLOSE c_ti_sit;
      --  Asignar la tabla de acuerdo al estado del periodo
      IF vti_sit = 2 THEN
        vvc_tablaTN := UPPER('trans_'||RTRIM(cch_compania)||'_'||TO_CHAR(cnu_id_cal));
      ELSE
        vvc_tablaTN := UPPER('transacciones_ns');
      END IF;
      vvc_tablaTN := TRIM(vvc_tablaTN);
      DBMS_OUTPUT.PUT_LINE('7 - Verificar el estado del periodo');
      DBMS_OUTPUT.PUT_LINE('7A - tabla'||vvc_tablaTN);
      --  Verificar que la tabla existe
      OPEN c_existe_tabla(vvc_tablaTN);
      FETCH c_existe_tabla INTO vdummy;
      IF c_existe_tabla%NOTFOUND THEN
      	RAISE no_tabla;
      END IF;
      CLOSE c_existe_tabla;
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   
            
      vvc_sql := 'INSERT INTO fdt_bancos_tmp' ||
                 ' SELECT ' ||  psi_id_rep || ', ' ||
                  sComilla || pvc_usuario || sComilla || ', ' ||
                  'tns.compania, tns.clase_nomina, tns.id_calendario, ' ||
                  'tns.trabajador, SUM(tns.importe), 0, 0, ' ||
                  sComilla || vch_simb_mon || sComilla || ', 1, 0, 0, 0' ||
                  ' FROM ' || vvc_tablaTN || ' tns, trabajadores_grales tg' ||
                  ' WHERE tns.compania = tg.compania' ||
                  ' AND tns.trabajador = tg.trabajador' ||
                  ' AND tg.forma_pago = 3' ||
                  ' AND tns.importe > 0' ||
                  ' AND tns.sit_transaccion = 2' ||
                  ' AND tns.compania = ' || sComilla || cch_compania || sComilla ||
                  ' AND tns.clase_nomina = ' || sComilla || cch_clase_nom || sComilla ||
                  ' AND tns.id_calendario = ' || cnu_id_cal ||
                  ' AND tns.concepto IN ( ' || vnu_concepto1 || ',' || vnu_concepto2 || ',' || vnu_concepto3 || ',' ||
                  vnu_concepto4 || ',' || vnu_concepto5 || ')' ||
                  ' GROUP BY tns.trabajador, tns.compania, tns.clase_nomina, tns.id_calendario';                  
      BEGIN
          vin_id_cursor := dbms_sql.open_cursor;
          dbms_sql.parse(vin_id_cursor, vvc_sql, dbms_sql.v7);
          vin_rows := dbms_sql.execute(vin_id_cursor);
          dbms_sql.close_cursor(vin_id_cursor);
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de la trans o transacciones_ns');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT MAX(a.cuenta_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');

      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(b.cod_banco) 
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania 
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(a.institucion_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9 - update a la tabla');
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND clase_nomina = cch_clase_nom
            AND id_calendario = cnu_id_cal
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania                                
                             AND c.clase_nomina = cch_clase_nom
                             AND c.id_calendario = cnu_id_cal);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2
      
      --Actualizar el tipo de documento *** cambiar de acuerdo al cliente ***
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_doc = 
             (SELECT DECODE (TRIM(a.dato), '001', 'C',
                   '002', 'E')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_id
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      BEGIN
        UPDATE fdt_bancos_tmp c
        SET tipo_cuenta = 
             (SELECT DECODE (TRIM(a.dato), '1', '1', '2')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_cta
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
                  
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, 
    simbolo_mon, tipo, tipo_doc, tipo_cuenta)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_doc, tn.tipo_cuenta
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_doc, tn.tipo_cuenta;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             
  
    --armamos la estructura del archivo plano. La cabeza
--Aqui queda el valor de cuenta, tipo cuenta de la ultima cia recorrida
  BEGIN
    INSERT INTO
      fdt_bancos_mm (id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT
      psi_id_rep, pvc_usuario, pti_banco, 1, 1,
      '1' ||
      TO_CHAR(vdt_fecha_hoy, 'YYYYMMDD') ||
      RPAD('0', 24, '0') ||
      NVL(vti_tipo_cta,0) ||
      RPAD('0', 8, '0') ||
      LPAD(NVL(vvc_cuenta_bco,'0'), 9, '0') ||
      RPAD(nombre_cia, 40, ' ') ||
      LPAD(REPLACE(NVL(registro_fiscal,'0'),'-',''), 11, '0') ||
      '001' ||
      '0001' ||
      TO_CHAR(pdt_fecha, 'YYYYMMDD') || --TO_CHAR(vdt_fecha_hoy, 'YYYYMMDD') ||
      LPAD(SUBSTR(LTRIM(RTRIM(NVL(vvc_cuenta_bco,'0'))), 1, 3),3,'0') ||
      'N' ||
      RPAD(' ', 49, ' ') ||
      RPAD(' ', 80, ' ')
    FROM
      companias
    WHERE
      compania IN (SELECT DISTINCT compania FROM ri_procesar WHERE id_rep = psi_id_rep AND usuariow = pvc_usuario);
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;

    DBMS_OUTPUT.PUT_LINE('11 - insert a la tabla fdt_bancos_mm');
  
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 2, 
    '2' ||
    LPAD(SUBSTR(LTRIM(tns.tipo_doc), 1, 1), 1, 'C' ) ||
    LPAD(SUBSTR(LTRIM(t.clave_unica), 1, 11), 11, '0' ) ||
    RPAD(REPLACE(LTRIM(RTRIM(t.nombre)), '/' , ' '), 40, ' ' ) ||
    '0' ||
    --'2' ||
    RTRIM(LTRIM(tns.tipo_cuenta)) ||
    RPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 1, 17), 17, ' ' ) ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 16, '0'), 18, '0') ||
    'A' ||
    '000' ||
	  RTRIM(LTRIM(NVL(tns.ins_dep,'0'))) ||
    '0001' ||
    RPAD(' ', 10, ' ') ||
    RPAD('PAGO DE NOMINA', 70, ' ') ||
    '0' ||
    RPAD('0', 10, '0') ||
    'N' ||
    RPAD(' ', 48, ' ') ||
    'N' ||
    RPAD(' ', 8, ' ')
    FROM trabajadores t , fdt_bancos_tmp tns
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;

  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');
------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');
  
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;
    
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                
    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep

  COMMIT;         
  
  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;         
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_ACH_bogota FOR ADAM.sp_fco_gen_bco_ACH_bogota;
GRANT EXECUTE ON sp_fco_gen_bco_ACH_bogota TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_ACH_bogota_ni
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por ACH para NI                         ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Marzo 17/2005                                         ***/
/********************************************************************/
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

vch_agr_id    char(10);
vch_agr_cta   char(10);

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_liq_procesar.id_rep%TYPE,
 avc_usuario ri_liq_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT compania
 FROM ri_liq_procesar
 WHERE id_rep = asi_id_rep
 AND usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);
  
  --agrupación del tipo del documento, cambiar de acuerdo al cliente
  vch_agr_id := 'TDN';
  vch_agr_cta := 'CTA';
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   

      BEGIN
        INSERT INTO fdt_bancos_tmp (id_rep, usuariow, compania, numero_liquidacion, trabajador, importe,cuenta_dep, simbolo_mon, tipo, tipo_cuenta, tipo_doc)      
        SELECT psi_id_rep, pvc_usuario, ld.compania, ld.numero_liquidacion,
        ld.trabajador, ld.importe, '0', vch_simb_mon, 1, '0', '0'
        FROM liquidaciones_det ld, ri_liq_procesar lp
        WHERE ld.compania = lp.compania
        AND ld.tipo_nomina = lp.tipo_nomina
        AND ld.numero_liquidacion = lp.numero_liquidacion
        AND ld.trabajador = lp.trabajador
        AND ld.compania = cch_compania
        AND ld.concepto IN (vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5)
        AND ld.importe > 0
        AND ld.sit_transaccion = 2
        AND lp.id_rep = psi_id_rep
        AND lp.usuariow = pvc_usuario;            
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de liquidaciones_det');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT a.cuenta_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT b.cod_banco 
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT a.institucion_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9 - update a la tabla');
      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;
      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2
      
      --Actualizar el tipo de documento *** cambiar de acuerdo al cliente ***
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_doc = 
             (SELECT DECODE (TRIM(a.dato), '001', 'C',
                   '002', 'E')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_id
              AND c.compania = cch_compania
              AND c.id_rep = psi_id_rep
              AND c.usuariow = pvc_usuario)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_cuenta = 
             (SELECT DECODE (TRIM(a.dato), '1', '1', '2')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_cta
              AND c.compania = cch_compania
              AND c.id_rep = psi_id_rep
              AND c.usuariow = pvc_usuario)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;                  
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;
  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             
  
    --armamos la estructura del archivo plano. La cabeza
  BEGIN    
    INSERT INTO
      fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT
      psi_id_rep, pvc_usuario, pti_banco, 1, 1,
      '1' ||
      TO_CHAR(vdt_fecha_hoy, 'YYYYMMDD') ||
      RPAD('0', 24, '0') ||
      NVL(vti_tipo_cta,0) ||
      RPAD('0', 8, '0') ||
      LPAD(NVL(vvc_cuenta_bco,'0'), 9, '0') ||
      RPAD(nombre_cia, 40, ' ') ||
      LPAD(REPLACE(NVL(registro_fiscal,'0'),'-',''), 11, '0') ||
      '001' ||
      '0001' ||
      TO_CHAR(vdt_fecha_hoy, 'YYYYMMDD') ||
      LPAD(SUBSTR(LTRIM(RTRIM(NVL(vvc_cuenta_bco,'0'))), 1, 3),3,'0') ||
      'N' ||
      RPAD(' ', 49, ' ') ||
      RPAD(' ', 80, ' ')
    FROM
      companias
    WHERE
      compania IN (SELECT DISTINCT compania FROM ri_liq_procesar WHERE id_rep = psi_id_rep AND usuariow = pvc_usuario);
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;

    DBMS_OUTPUT.PUT_LINE('11 - insert a la tabla fdt_bancos_mm');
  
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 2, 
    '2' ||
    LPAD(SUBSTR(LTRIM(tns.tipo_doc), 1, 1), 1, 'C' ) ||
    LPAD(SUBSTR(LTRIM(t.clave_unica), 1, 11), 11, '0' ) ||
    RPAD(REPLACE(LTRIM(RTRIM(t.nombre)), '/' , ' '), 40, ' ' ) ||
    '0' ||
    --'2' ||
    RTRIM(LTRIM(tns.tipo_cuenta)) ||
    RPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 1, 17), 17, ' ' ) ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 16, '0'), 18, '0') ||
    'A' ||
    '000' ||
	  RTRIM(LTRIM(NVL(tns.ins_dep,0))) ||
    '0001' ||
    RPAD(' ', 10, ' ') ||
    RPAD('PAGO DE NOMINA', 70, ' ') ||
    '0' ||
    RPAD('0', 10, '0') ||
    'N' ||
    RPAD(' ', 48, ' ') ||
    'N' ||
    RPAD(' ', 8, ' ')
    FROM trabajadores t , fdt_bancos_tmp tns
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;

  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');
------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');
  
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;
  
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                
    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep
  
  COMMIT;         

  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
         
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_ACH_bogota_ni FOR ADAM.sp_fco_gen_bco_ACH_bogota_ni;
GRANT EXECUTE ON sp_fco_gen_bco_ACH_bogota_ni TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_ACH_gnbs
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por ACH del GNBSudameris                ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Sept 15/2005                                         ***/
/********************************************************************/
-- OCT-01-05: DCR, Pasado a Oracle
vvc_tablaTN   varchar2(20);
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);
vvc_mensaje varchar2(80);

vdc_total     number(19,6);
vsi_nro_trab  integer;

vch_agr_id    char(10);
vch_agr_cta   char(10);

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar el estado del periodo
-------------------------------------------------
CURSOR c_ti_sit(
 ach_compania	companias.Compania%TYPE,
 asi_id_cal	calendario_procesos.id_calendario%TYPE
) IS
  SELECT
    sit_periodo
  FROM
    cal_proc_cias
  WHERE
    compania = ach_compania And
    id_calendario = asi_id_cal;
-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_procesar.id_rep%TYPE,
 avc_usuario ri_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT c.compania, c.clase_nomina, c.tipo_nomina, c.anio, c.periodo, a.id_calendario
 FROM calendario_procesos a, cal_proc_cias b, ri_procesar c
 WHERE a.id_calendario = b.id_calendario
 AND a.tipo_nomina = c.tipo_nomina
 AND a.anio = c.anio
 AND a.periodo = c.periodo
 AND b.compania = c.compania
 AND c.id_rep = asi_id_rep
 AND c.usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

	DELETE fdt_bancos_tmp
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario;  
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);

  --agrupación del tipo del documento, cambiar de acuerdo al cliente
  vch_agr_id := 'TIPO_DOC';
  vch_agr_cta := 'TIPO_CTA';  
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania, cch_clase_nom, cch_tipo_nom, cnu_anio, cnu_periodo, cnu_id_cal;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      --  Verificar el estado del periodo
      OPEN c_ti_sit(cch_compania, cnu_id_cal);
      FETCH c_ti_sit INTO vti_sit;
      CLOSE c_ti_sit;
      --  Asignar la tabla de acuerdo al estado del periodo
      IF vti_sit = 2 THEN
        vvc_tablaTN := UPPER('trans_'||RTRIM(cch_compania)||'_'||TO_CHAR(cnu_id_cal));
      ELSE
        vvc_tablaTN := UPPER('transacciones_ns');
      END IF;
      vvc_tablaTN := TRIM(vvc_tablaTN);
      DBMS_OUTPUT.PUT_LINE('7 - Verificar el estado del periodo');
      DBMS_OUTPUT.PUT_LINE('7A - tabla'||vvc_tablaTN);
      --  Verificar que la tabla existe
      OPEN c_existe_tabla(vvc_tablaTN);
      FETCH c_existe_tabla INTO vdummy;
      IF c_existe_tabla%NOTFOUND THEN
      	RAISE no_tabla;
      END IF;
      CLOSE c_existe_tabla;
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   
            
      vvc_sql := 'INSERT INTO fdt_bancos_tmp' ||
                 ' SELECT ' ||  psi_id_rep || ', ' ||
                  sComilla || pvc_usuario || sComilla || ', ' ||
                  'tns.compania, tns.clase_nomina, tns.id_calendario, ' ||
                  'tns.trabajador, SUM(tns.importe), 0, 0, ' ||
                  sComilla || vch_simb_mon || sComilla || ', 1, 0, 0, 0' ||
                  ' FROM ' || vvc_tablaTN || ' tns, trabajadores_grales tg' ||
                  ' WHERE tns.compania = tg.compania' ||
                  ' AND tns.trabajador = tg.trabajador' ||
                  ' AND tg.forma_pago = 3' ||
                  ' AND tns.importe > 0' ||
                  ' AND tns.sit_transaccion = 2' ||
                  ' AND tns.compania = ' || sComilla || cch_compania || sComilla ||
                  ' AND tns.clase_nomina = ' || sComilla || cch_clase_nom || sComilla ||
                  ' AND tns.id_calendario = ' || cnu_id_cal ||
                  ' AND tns.concepto IN ( ' || vnu_concepto1 || ',' || vnu_concepto2 || ',' || vnu_concepto3 || ',' ||
                  vnu_concepto4 || ',' || vnu_concepto5 || ')' ||
                  ' GROUP BY tns.trabajador, tns.compania, tns.clase_nomina, tns.id_calendario';                  
      BEGIN
          vin_id_cursor := dbms_sql.open_cursor;
          dbms_sql.parse(vin_id_cursor, vvc_sql, dbms_sql.v7);
          vin_rows := dbms_sql.execute(vin_id_cursor);
          dbms_sql.close_cursor(vin_id_cursor);
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de la trans o transacciones_ns');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT MAX(a.cuenta_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');

      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(b.cod_banco) 
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania 
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(a.institucion_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9 - update a la tabla');
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND clase_nomina = cch_clase_nom
            AND id_calendario = cnu_id_cal
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania                                
                             AND c.clase_nomina = cch_clase_nom
                             AND c.id_calendario = cnu_id_cal);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2
      
      --Actualizar el tipo de documento *** cambiar de acuerdo al cliente ***
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_doc = 
             (SELECT DECODE (TRIM(a.dato), '001', 'C',
                   '002', 'E')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_id
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      BEGIN
        UPDATE fdt_bancos_tmp c
        SET tipo_cuenta = 
             (SELECT DECODE (TRIM(a.dato), '1', '1', '2')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_cta
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

			--Armando el mensaje
			IF cch_tipo_nom = 'QN' THEN
			BEGIN--QN
			    SELECT DECODE(cnu_periodo, 1, '1A QUINC. ENE',
                			    2, '2A QUINC. ENE',  
                			    3, '1A QUINC. FEB', 
                			    4, '2A QUINC. FEB',  
                			    5, '1A QUINC. MAR',  
                			    6, '2A QUINC. MAR',  
                			    7, '1A QUINC. ABR',  
                			    8, '2A QUINC. ABR',  
                			    9, '1A QUINC. MAY',  
                			    10, '2A QUINC. MAY',  
                			    11, '1A QUINC. JUN',  
                			    12, '2A QUINC. JUN',  
                			    13, '1A QUINC. JUL',  
                			    14, '2A QUINC. JUL',  
                			    15, '1A QUINC. AGO',  
                			    16, '2A QUINC. AGO',  
                			    17, '1A QUINC. SEP',  
                			    18, '2A QUINC. SEP',  
                			    19, '1A QUINC. OCT',  
                			    20, '2A QUINC. OCT',  
                			    21, '1A QUINC. NOV',  
                			    22, '2A QUINC. NOV',  
                			    23, '1A QUINC. DIC',  
                			    24, '2A QUINC. DIC')
          INTO vvc_mensaje
          FROM DUAL;  
			  vvc_mensaje := 'NOMINA ' || LTRIM(RTRIM(vvc_mensaje)) || '/' + LTRIM(RTRIM(cnu_anio));
			END;--QN
			ELSE
			  vvc_mensaje := 'NOMINA ' || LTRIM(RTRIM(cch_tipo_nom)) || ' Periodo ' || LTRIM(RTRIM(cnu_periodo)) || '/' || LTRIM(RTRIM(cnu_anio));
      END IF;                  
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, 
    simbolo_mon, tipo, tipo_doc, tipo_cuenta)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_doc, tn.tipo_cuenta
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_doc, tn.tipo_cuenta;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             

  --hallando la maxima compañia que esta en ri_procesar
  BEGIN
    SELECT MAX(compania)
    INTO cch_compania 
    FROM ri_procesar
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario;
    EXCEPTION
      WHEN OTHERS THEN cch_compania := '';
  END;

  -- Trayendo al informacion del banco      
  OPEN c_info_banco(cch_compania, pti_banco);
  FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
  vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
  CLOSE c_info_banco;

  vti_tipo_cta := NVL(vti_tipo_cta, 1);
  vvc_cuenta_bco := NVL(vvc_cuenta_bco, 0);

  --Armamos la estructura que necesita el banco.
  --Esta estructura la personalizo asi el banco, puede que otro banco la personalice diferente
  --El orden de los campos es el mismo, solo cambia el tamaño.
  BEGIN  
		INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
		SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 1,
    LPAD(NVL(vvc_cuenta_bco,'0'), 16, ' ') || --nro de cuenta a debitar
    LPAD(NVL(vti_tipo_cta,'0'), 2, ' ') || --tipo de cuenta
    RPAD(NVL(tns.ins_dep,'0'), 6, ' ') || --codigo del banco a acreditar
    RPAD(NVL(tns.cuenta_dep,'0'), 16, ' ') || --Nro de cuenta a acreditar
    LPAD(LTRIM(RTRIM(tns.tipo_cuenta)),2,' ') || --tipo de cuenta a acreditar
    LPAD(SUBSTR(NVL(t.clave_unica,''), 1, 12), 12, ' ') || --nro de identificacion del destinatario
    RPAD(SUBSTR(REPLACE(LTRIM(RTRIM(t.nombre)), '/' , ' '), 1, 35), 35, ' ' ) || --nombre del destinatario de pago
    LPAD(REPLACE(LTRIM(TO_CHAR(tns.importe,'9999999999999.99')),'.',''),15,'0') || --Importe, parte entera
    RPAD(SUBSTR(NVL(vvc_mensaje,''), 1, 80), 80, ' ') ||  --descripcion del pago
    RPAD(SUBSTR(NVL(t.e_mail,''), 1, 80), 80, ' ') --direccion de correo valida    
		FROM fdt_bancos_tmp tns, trabajadores t
		WHERE tns.trabajador = t.trabajador 
		AND tns.id_rep = psi_id_rep
		AND tns.usuariow = pvc_usuario
		AND tns.tipo = 2;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;

------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');
  
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;
    
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                
    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep

  COMMIT;         
  
  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;         
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_ACH_gnbs FOR ADAM.sp_fco_gen_bco_ACH_gnbs;
GRANT EXECUTE ON sp_fco_gen_bco_ACH_gnbs TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_ACH_gnbs_ni
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por ACH del GNBSudameris                ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Sept 16/2005                                         ***/
/********************************************************************/
--OCT-01-05: DCR, Pasada a Oracle
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);
vvc_mensaje varchar2(80);

vdc_total     number(19,6);
vsi_nro_trab  integer;

vch_agr_id    char(10);
vch_agr_cta   char(10);

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_liq_procesar.id_rep%TYPE,
 avc_usuario ri_liq_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT compania
 FROM ri_liq_procesar
 WHERE id_rep = asi_id_rep
 AND usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);
  
  --agrupación del tipo del documento, cambiar de acuerdo al cliente
  vch_agr_id := 'TIPO_DOC';
  vch_agr_cta := 'TIPO_CTA';
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   

      BEGIN
        INSERT INTO fdt_bancos_tmp (id_rep, usuariow, compania, numero_liquidacion, trabajador, importe,cuenta_dep, simbolo_mon, tipo, tipo_cuenta, tipo_doc)      
        SELECT psi_id_rep, pvc_usuario, ld.compania, ld.numero_liquidacion,
        ld.trabajador, ld.importe, '0', vch_simb_mon, 1, '0', '0'
        FROM liquidaciones_det ld, ri_liq_procesar lp
        WHERE ld.compania = lp.compania
        AND ld.tipo_nomina = lp.tipo_nomina
        AND ld.numero_liquidacion = lp.numero_liquidacion
        AND ld.trabajador = lp.trabajador
        AND ld.compania = cch_compania
        AND ld.concepto IN (vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5)
        AND ld.importe > 0
        AND ld.sit_transaccion = 2
        AND lp.id_rep = psi_id_rep
        AND lp.usuariow = pvc_usuario;            
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de liquidaciones_det');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT a.cuenta_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT b.cod_banco 
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT a.institucion_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9 - update a la tabla');
      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;
      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2
      
      --Actualizar el tipo de documento *** cambiar de acuerdo al cliente ***
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_doc = 
             (SELECT DECODE (TRIM(a.dato), '001', 'C',
                   '002', 'E')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_id
              AND c.compania = cch_compania
              AND c.id_rep = psi_id_rep
              AND c.usuariow = pvc_usuario)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_cuenta = 
             (SELECT DECODE (TRIM(a.dato), '1', '1', '2')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_cta
              AND c.compania = cch_compania
              AND c.id_rep = psi_id_rep
              AND c.usuariow = pvc_usuario)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;                  
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  

  vvc_mensaje := 'PAGO NOMINA INTERACTIVA';

  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;
  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             

  --hallando la maxima compañia que esta en ri_procesar
  BEGIN
    SELECT MAX(compania)
    INTO cch_compania 
    FROM ri_procesar
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario;
    EXCEPTION
      WHEN OTHERS THEN cch_compania := '';
  END;

  -- Trayendo al informacion del banco      
  OPEN c_info_banco(cch_compania, pti_banco);
  FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
  vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
  CLOSE c_info_banco;

  vti_tipo_cta := NVL(vti_tipo_cta, 1);
  vvc_cuenta_bco := NVL(vvc_cuenta_bco, 0);


  --Armamos la estructura que necesita el banco.
  --Esta estructura la personalizo asi el banco, puede que otro banco la personalice diferente
  --El orden de los campos es el mismo, solo cambia el tamaño.
  BEGIN  
		INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
		SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 1,
    LPAD(NVL(vvc_cuenta_bco,'0'), 16, ' ') || --nro de cuenta a debitar
    LPAD(LTRIM(RTRIM(tns.tipo_cuenta)),2,' ') || --tipo de cuenta a acreditar
    RPAD(NVL(tns.ins_dep,'0'), 6, ' ') || --codigo del banco a acreditar
    RPAD(NVL(tns.cuenta_dep,'0'), 16, ' ') || --Nro de cuenta a acreditar
    LTRIM(RTRIM(tns.tipo_cuenta)) || --tipo de cuenta a acreditar
    LPAD(SUBSTR(NVL(t.clave_unica,''), 1, 12), 12, ' ') || --nro de identificacion del destinatario
    RPAD(SUBSTR(REPLACE(LTRIM(RTRIM(t.nombre)), '/' , ' '), 1, 35), 35, ' ' ) || --nombre del destinatario de pago
    LPAD(REPLACE(LTRIM(TO_CHAR(tns.importe,'9999999999999.99')),'.',''),15,'0') || --Importe, parte entera
    RPAD(SUBSTR(NVL(vvc_mensaje,''), 1, 80), 80, ' ') ||  --descripcion del pago
    RPAD(SUBSTR(NVL(t.e_mail,''), 1, 80), 80, ' ') --direccion de correo valida    
		FROM fdt_bancos_tmp tns, trabajadores t
		WHERE tns.trabajador = t.trabajador 
		AND tns.id_rep = psi_id_rep
		AND tns.usuariow = pvc_usuario
		AND tns.tipo = 2;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;
  
------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');
  
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;
  
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                
    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep
  
  COMMIT;         

  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
         
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_ACH_gnbs_ni FOR ADAM.sp_fco_gen_bco_ACH_gnbs_ni;
GRANT EXECUTE ON sp_fco_gen_bco_ACH_gnbs_ni TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_ACH_occi
(
  psi_id_rep 	number,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por ACH del Banco de Occidente          ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Julio 14/2005                                         ***/
/********************************************************************/
vvc_tablaTN   varchar2(20);
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

vch_agr_id    char(10);
vch_agr_cta   char(10);

vvc_comprobante varchar2(10);
vvc_nombre_cia varchar2(60);

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar el estado del periodo
-------------------------------------------------
CURSOR c_ti_sit(
 ach_compania	companias.Compania%TYPE,
 asi_id_cal	calendario_procesos.id_calendario%TYPE
) IS
  SELECT
    sit_periodo
  FROM
    cal_proc_cias
  WHERE
    compania = ach_compania And
    id_calendario = asi_id_cal;
-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_procesar.id_rep%TYPE,
 avc_usuario ri_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT c.compania, c.clase_nomina, c.tipo_nomina, c.anio, c.periodo, a.id_calendario
 FROM calendario_procesos a, cal_proc_cias b, ri_procesar c
 WHERE a.id_calendario = b.id_calendario
 AND a.tipo_nomina = c.tipo_nomina
 AND a.anio = c.anio
 AND a.periodo = c.periodo
 AND b.compania = c.compania
 AND c.id_rep = asi_id_rep
 AND c.usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

	DELETE fdt_bancos_tmp
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario;  
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);

  --agrupación del tipo del documento, cambiar de acuerdo al cliente
  vch_agr_id := 'TDN';
  vch_agr_cta := 'CTA';  
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania, cch_clase_nom, cch_tipo_nom, cnu_anio, cnu_periodo, cnu_id_cal;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      --  Verificar el estado del periodo
      OPEN c_ti_sit(cch_compania, cnu_id_cal);
      FETCH c_ti_sit INTO vti_sit;
      CLOSE c_ti_sit;
      --  Asignar la tabla de acuerdo al estado del periodo
      IF vti_sit = 2 THEN
        vvc_tablaTN := UPPER('trans_'||RTRIM(cch_compania)||'_'||TO_CHAR(cnu_id_cal));
      ELSE
        vvc_tablaTN := UPPER('transacciones_ns');
      END IF;
      vvc_tablaTN := TRIM(vvc_tablaTN);
      DBMS_OUTPUT.PUT_LINE('7 - Verificar el estado del periodo');
      DBMS_OUTPUT.PUT_LINE('7A - tabla'||vvc_tablaTN);
      --  Verificar que la tabla existe
      OPEN c_existe_tabla(vvc_tablaTN);
      FETCH c_existe_tabla INTO vdummy;
      IF c_existe_tabla%NOTFOUND THEN
      	RAISE no_tabla;
      END IF;
      CLOSE c_existe_tabla;
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   
            
      vvc_sql := 'INSERT INTO fdt_bancos_tmp' ||
                 ' SELECT ' ||  psi_id_rep || ', ' ||
                  sComilla || pvc_usuario || sComilla || ', ' ||
                  'tns.compania, tns.clase_nomina, tns.id_calendario, ' ||
                  'tns.trabajador, SUM(tns.importe), 0, 0, ' ||
                  sComilla || vch_simb_mon || sComilla || ', 1, 0, 0, 0' ||
                  ' FROM ' || vvc_tablaTN || ' tns, trabajadores_grales tg' ||
                  ' WHERE tns.compania = tg.compania' ||
                  ' AND tns.trabajador = tg.trabajador' ||
                  ' AND tg.forma_pago = 3' ||
                  ' AND tns.importe > 0' ||
                  ' AND tns.sit_transaccion = 2' ||
                  ' AND tns.compania = ' || sComilla || cch_compania || sComilla ||
                  ' AND tns.clase_nomina = ' || sComilla || cch_clase_nom || sComilla ||
                  ' AND tns.id_calendario = ' || cnu_id_cal ||
                  ' AND tns.concepto IN ( ' || vnu_concepto1 || ',' || vnu_concepto2 || ',' || vnu_concepto3 || ',' ||
                  vnu_concepto4 || ',' || vnu_concepto5 || ')' ||
                  ' GROUP BY tns.trabajador, tns.compania, tns.clase_nomina, tns.id_calendario';                  
      BEGIN
          vin_id_cursor := dbms_sql.open_cursor;
          dbms_sql.parse(vin_id_cursor, vvc_sql, dbms_sql.v7);
          vin_rows := dbms_sql.execute(vin_id_cursor);
          dbms_sql.close_cursor(vin_id_cursor);
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de la trans o transacciones_ns');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT MAX(a.cuenta_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');

      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(b.cod_banco) 
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania 
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(a.institucion_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9 - update a la tabla');
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND clase_nomina = cch_clase_nom
            AND id_calendario = cnu_id_cal
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania                                
                             AND c.clase_nomina = cch_clase_nom
                             AND c.id_calendario = cnu_id_cal);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2
      
      --Actualizar el tipo de documento *** cambiar de acuerdo al cliente ***
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_doc = 
             (SELECT DECODE (TRIM(a.dato), '001', 'C',
                   '002', 'E')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_id
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      BEGIN
        UPDATE fdt_bancos_tmp c
        SET tipo_cuenta = 
             (SELECT DECODE (TRIM(a.dato), '1', '1', '2')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_cta
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      --Jul14. Agregado para desarrollo de Luis Fernando.
/*
      DELETE ri_hist_pagos_bcos
      WHERE compania = cch_compania
      AND tipo_nomina = cch_tipo_nom
      AND anio = cnu_anio
      AND periodo = cnu_periodo
      AND institucion_deposito = '023';
      
      INSERT INTO ri_hist_pagos_bcos  
      SELECT cch_compania, cch_tipo_nom, cnu_anio, cnu_periodo,
      tns.trabajador, '023', tns.importe
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 1;
*/                  
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, 
    simbolo_mon, tipo, tipo_doc, tipo_cuenta)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_doc, tn.tipo_cuenta
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_doc, tn.tipo_cuenta;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             
  
  --trayendo el nombre del cia:
  vvc_nombre_cia := '';
  BEGIN
     SELECT nombre_cia
     INTO vvc_nombre_cia
     FROM companias
     WHERE compania = cch_compania;
  EXCEPTION
     WHEN OTHERS THEN vvc_nombre_cia := '';  
  END;

  DBMS_OUTPUT.PUT_LINE('vvc_nombre_cia' || vvc_nombre_cia);             
  DBMS_OUTPUT.PUT_LINE('cch_compania' || cch_compania);               
      
  vvc_comprobante :=  '00' || TRIM(TO_CHAR(cnu_anio,'0000')) || TRIM(TO_CHAR(cnu_periodo,'00'));
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, Abs(rownum)+1, 
    '2' || --constante
    LTRIM(TO_CHAR(Abs(rownum),'0999')) || --consecutivo
    LPAD(NVL(vvc_cuenta_bco,'0'), 16, '0') || --cuenta del banco
    RPAD(REPLACE(LTRIM(RTRIM(t.nombre)), '/' , ' '), 30, ' ' ) || --nombre del trabajador
    LPAD(SUBSTR(LTRIM(t.clave_unica), 1, 11), 11, '0' ) || --cedula
    LTRIM(TO_CHAR(TO_NUMBER(tns.ins_dep),'0999')) || --codigo del banco
    TO_CHAR(pdt_fecha, 'YYYYMMDD') || --fecha digitada en el front
    DECODE(LTRIM(TO_CHAR(TO_NUMBER(tns.ins_dep),'099')),'023','2','3') || --forma de pago
    LPAD(REPLACE(LTRIM(TO_CHAR(tns.importe,'9999999999999.99')),'.',''),15,'0') || --valor pagado
    RPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 2, 16), 16, ' ' ) || --cuenta deposito
    TRIM(vvc_comprobante)||LTRIM(TO_CHAR(Abs(rownum),'0999')) || --comprobante
    SUBSTR(NVL(tns.cuenta_dep,'0'), 1, 1) || --tipo de cuenta
    RPAD(('Nomina ' || TRIM(vvc_nombre_cia)),80,' ')    
    FROM trabajadores t , fdt_bancos_tmp tns
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;

  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');
------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');
  
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  --insertamos la cabeza
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 1, 
    '10000' || --constante
    TO_CHAR(pdt_fecha, 'YYYYMMDD') || --fecha digitada en el front
    LTRIM(TO_CHAR(Abs(vsi_nro_trab),'0999')) || --total registros del detalle
    LPAD(REPLACE(LTRIM(TO_CHAR(vdc_total,'9999999999999999.99')),'.',''),18,'0') || --valor total del detalle
    LPAD(NVL(vvc_cuenta_bco,'0'), 16, '0') || --cuenta del banco
    RPAD('0', 148, '0')
    FROM dual;
    
    --insertamos el pie
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, Abs(vsi_nro_trab)+2, 
    '39999' || --constante
    LTRIM(TO_CHAR(Abs(vsi_nro_trab),'0999')) || --total registros del detalle
    LPAD(REPLACE(LTRIM(TO_CHAR(vdc_total,'9999999999999999.99')),'.',''),18,'0') || --valor total del detalle
    RPAD('0', 172, '0')
    FROM dual;
      
  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;
    
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                
    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep

  COMMIT;         
  
  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;         
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_ACH_occi FOR ADAM.sp_fco_gen_bco_ACH_occi;
GRANT EXECUTE ON sp_fco_gen_bco_ACH_occi TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_ACH_occi_ni
(
  psi_id_rep 	number,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por ACH para NI                         ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Marzo 17/2005                                         ***/
/********************************************************************/
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

vch_agr_id    char(10);
vch_agr_cta   char(10);

vvc_comprobante varchar2(10);
vvc_nombre_cia varchar2(60);

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_liq_procesar.id_rep%TYPE,
 avc_usuario ri_liq_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT compania
 FROM ri_liq_procesar
 WHERE id_rep = asi_id_rep
 AND usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);
  
  --agrupación del tipo del documento, cambiar de acuerdo al cliente
  vch_agr_id := 'TDN';
  vch_agr_cta := 'CTA';
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   

      BEGIN
        INSERT INTO fdt_bancos_tmp (id_rep, usuariow, compania, numero_liquidacion, trabajador, importe,cuenta_dep, simbolo_mon, tipo, tipo_cuenta, tipo_doc)      
        SELECT psi_id_rep, pvc_usuario, ld.compania, ld.numero_liquidacion,
        ld.trabajador, ld.importe, '0', vch_simb_mon, 1, '0', '0'
        FROM liquidaciones_det ld, ri_liq_procesar lp
        WHERE ld.compania = lp.compania
        AND ld.tipo_nomina = lp.tipo_nomina
        AND ld.numero_liquidacion = lp.numero_liquidacion
        AND ld.trabajador = lp.trabajador
        AND ld.compania = cch_compania
        AND ld.concepto IN (vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5)
        AND ld.importe > 0
        AND ld.sit_transaccion = 2
        AND lp.id_rep = psi_id_rep
        AND lp.usuariow = pvc_usuario;            
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de liquidaciones_det');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT a.cuenta_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT b.cod_banco 
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT a.institucion_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9 - update a la tabla');
      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;
      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2
      
      --Actualizar el tipo de documento *** cambiar de acuerdo al cliente ***
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_doc = 
             (SELECT DECODE (TRIM(a.dato), '001', 'C',
                   '002', 'E')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_id
              AND c.compania = cch_compania
              AND c.id_rep = psi_id_rep
              AND c.usuariow = pvc_usuario)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_cuenta = 
             (SELECT DECODE (TRIM(a.dato), '1', '1', '2')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_cta
              AND c.compania = cch_compania
              AND c.id_rep = psi_id_rep
              AND c.usuariow = pvc_usuario)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;                  
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;
  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             
  
  --trayendo el nombre del cia:
  vvc_nombre_cia := '';
  BEGIN
     SELECT nombre_cia
     INTO vvc_nombre_cia
     FROM companias
     WHERE compania = cch_compania;
  EXCEPTION
     WHEN OTHERS THEN vvc_nombre_cia := '';  
  END;
    
  vvc_comprobante :=  '00' || TRIM(TO_CHAR(pdt_fecha,'YYYY')) || TRIM(TO_CHAR(pdt_fecha,'MM'));
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, Abs(rownum)+1, 
    '2' || --constante
    LTRIM(TO_CHAR(Abs(rownum),'0999')) || --consecutivo
    LPAD(NVL(vvc_cuenta_bco,'0'), 16, '0') || --cuenta del banco
    RPAD(REPLACE(LTRIM(RTRIM(t.nombre)), '/' , ' '), 30, ' ' ) || --nombre del trabajador
    LPAD(SUBSTR(LTRIM(t.clave_unica), 1, 11), 11, '0' ) || --cedula
    LTRIM(TO_CHAR(TO_NUMBER(tns.ins_dep),'0999')) || --codigo del banco
    TO_CHAR(pdt_fecha, 'YYYYMMDD') || --fecha limite
    DECODE(LTRIM(TO_CHAR(TO_NUMBER(tns.ins_dep),'099')),'023','2','3') || --forma de pago
    LPAD(REPLACE(LTRIM(TO_CHAR(tns.importe,'9999999999999.99')),'.',''),15,'0') || --valor pagado
    RPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 2, 16), 16, ' ' ) || --cuenta deposito
    TRIM(vvc_comprobante)||LTRIM(TO_CHAR(Abs(rownum),'0999')) || --comprobante
    SUBSTR(NVL(tns.cuenta_dep,'0'), 1, 1) || --tipo de cuenta
    RPAD(('Nomina ' || TRIM(vvc_nombre_cia)),80,' ')    
    FROM trabajadores t , fdt_bancos_tmp tns
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;
  
  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');
------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');
  
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  --insertamos la cabeza
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 1, 
    '10000' || --constante
    TO_CHAR(pdt_fecha, 'YYYYMMDD') || --fecha del dia
    LTRIM(TO_CHAR(Abs(vsi_nro_trab),'0999')) || --total registros del detalle
    LPAD(REPLACE(LTRIM(TO_CHAR(vdc_total,'9999999999999999.99')),'.',''),18,'0') || --valor total del detalle
    LPAD(NVL(vvc_cuenta_bco,'0'), 16, '0') || --cuenta del banco
    RPAD('0', 148, '0')
    FROM dual;
    
    --insertamos el pie
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, Abs(vsi_nro_trab)+2, 
    '39999' || --constante
    LTRIM(TO_CHAR(Abs(vsi_nro_trab),'0999')) || --total registros del detalle
    LPAD(REPLACE(LTRIM(TO_CHAR(vdc_total,'9999999999999999.99')),'.',''),18,'0') || --valor total del detalle
    RPAD('0', 172, '0')
    FROM dual;
  
  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;
  
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                
    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep
  
  COMMIT;         

  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
         
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_ACH_occi_ni FOR ADAM.sp_fco_gen_bco_ACH_occi_ni;
GRANT EXECUTE ON sp_fco_gen_bco_ACH_occi_ni TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_avvillas
(
  psi_id_rep 	number,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por avvillas                            ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Marzo 17/2005                                         ***/
/********************************************************************/
vvc_tablaTN   varchar2(20);
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar el estado del periodo
-------------------------------------------------
CURSOR c_ti_sit(
 ach_compania	companias.Compania%TYPE,
 asi_id_cal	calendario_procesos.id_calendario%TYPE
) IS
  SELECT
    sit_periodo
  FROM
    cal_proc_cias
  WHERE
    compania = ach_compania And
    id_calendario = asi_id_cal;
-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_procesar.id_rep%TYPE,
 avc_usuario ri_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT c.compania, c.clase_nomina, c.tipo_nomina, c.anio, c.periodo, a.id_calendario
 FROM calendario_procesos a, cal_proc_cias b, ri_procesar c
 WHERE a.id_calendario = b.id_calendario
 AND a.tipo_nomina = c.tipo_nomina
 AND a.anio = c.anio
 AND a.periodo = c.periodo
 AND b.compania = c.compania
 AND c.id_rep = asi_id_rep
 AND c.usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  --borramos la tabla temporal que se uso  
  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania, cch_clase_nom, cch_tipo_nom, cnu_anio, cnu_periodo, cnu_id_cal;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      --  Verificar el estado del periodo
      OPEN c_ti_sit(cch_compania, cnu_id_cal);
      FETCH c_ti_sit INTO vti_sit;
      CLOSE c_ti_sit;
      --  Asignar la tabla de acuerdo al estado del periodo
      IF vti_sit = 2 THEN
        vvc_tablaTN := UPPER('trans_'||RTRIM(cch_compania)||'_'||TO_CHAR(cnu_id_cal));
      ELSE
        vvc_tablaTN := UPPER('transacciones_ns');
      END IF;
      vvc_tablaTN := TRIM(vvc_tablaTN);
      DBMS_OUTPUT.PUT_LINE('7 - Verificar el estado del periodo');
      DBMS_OUTPUT.PUT_LINE('7A - tabla'||vvc_tablaTN);
      
      --  Verificar que la tabla existe
      OPEN c_existe_tabla(vvc_tablaTN);
      FETCH c_existe_tabla INTO vdummy;
      IF c_existe_tabla%NOTFOUND THEN
      	RAISE no_tabla;
      END IF;
      CLOSE c_existe_tabla;
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   
            
      vvc_sql := 'INSERT INTO fdt_bancos_tmp' ||
                 ' SELECT ' ||  psi_id_rep || ', ' ||
                  sComilla || pvc_usuario || sComilla || ', ' ||
                  'tns.compania, tns.clase_nomina, tns.id_calendario, ' ||
                  'tns.trabajador, SUM(tns.importe), 0, 0, ' ||
                  sComilla || vch_simb_mon || sComilla || ', 1, 0, 0, 0' ||
                  ' FROM ' || vvc_tablaTN || ' tns, trabajadores_grales tg' ||
                  ' WHERE tns.compania = tg.compania' ||
                  ' AND tns.trabajador = tg.trabajador' ||
                  ' AND tg.forma_pago = 3' ||
                  ' AND tns.importe > 0' ||
                  ' AND tns.sit_transaccion = 2' ||
                  ' AND tns.compania = ' || sComilla || cch_compania || sComilla ||
                  ' AND tns.clase_nomina = ' || sComilla || cch_clase_nom || sComilla ||
                  ' AND tns.id_calendario = ' || cnu_id_cal ||
                  ' AND tns.concepto IN ( ' || vnu_concepto1 || ',' || vnu_concepto2 || ',' || vnu_concepto3 || ',' ||
                  vnu_concepto4 || ',' || vnu_concepto5 || ')' ||
                  ' GROUP BY tns.trabajador, tns.compania, tns.clase_nomina, tns.id_calendario';                  
      BEGIN
          vin_id_cursor := dbms_sql.open_cursor;
          dbms_sql.parse(vin_id_cursor, vvc_sql, dbms_sql.v7);
          vin_rows := dbms_sql.execute(vin_id_cursor);
          dbms_sql.close_cursor(vin_id_cursor);
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de la trans o transacciones_ns');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT MAX(a.cuenta_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(b.cod_banco)
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania 
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal )
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(a.institucion_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND clase_nomina = cch_clase_nom
            AND id_calendario = cnu_id_cal
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania                                
                             AND c.clase_nomina = cch_clase_nom
                             AND c.id_calendario = cnu_id_cal);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2

      --Jun29. Agregado para desarrollo de Luis Fernando.
/*
      DELETE ri_hist_pagos_bcos
      WHERE compania = cch_compania
      AND tipo_nomina = cch_tipo_nom
      AND anio = cnu_anio
      AND periodo = cnu_periodo
      AND institucion_deposito = '500';
      
      INSERT INTO ri_hist_pagos_bcos  
      SELECT cch_compania, cch_tipo_nom, cnu_anio, cnu_periodo,
      tns.trabajador, /*tns.ins_dep'500', tns.importe
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 1;
*/                    
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             

  --hallando la maxima compañia que esta en ri_procesar
  BEGIN
    SELECT MAX(compania)
    INTO cch_compania 
    FROM ri_procesar
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario;
    EXCEPTION
      WHEN OTHERS THEN cch_compania := '';
  END;

  -- Trayendo al informacion del banco      
  OPEN c_info_banco(cch_compania, pti_banco);
  FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
  vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
  CLOSE c_info_banco;

  --utilizamos fijo la secuencia 1 del archivo de mm
  --registro de cabeza
  INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
  SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 1,
  '01' ||
  TO_CHAR(pdt_fecha, 'YYYYMMDD') ||
  TO_CHAR(vdt_fecha_hoy, 'hhmiss')||
  LPAD(SUBSTR(NVL(vvc_oficina_cta,'088'), 1, 3), 3, '0') ||  --grabar 088
  '02' ||
  RPAD('PAGO DE NOMINA', 50, ' ')  
  FROM DUAL;
        
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, ROWNUM+1,
    '02' || --tipo de registro
    '000023' || --pago de nomina
    '01' || --producto de origen
    LPAD(NVL(vvc_cuenta_bco,'0'), 16,'0') || --cuenta de la empresa
    '052' || --codigo de compensacion del bco destino
    '01' || --producto destino
    LPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 1, 16), 16, '0' ) || --cuenta destino    
    LPAD(ROWNUM, 9, '0') || --secuencia
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 14, '0'), 16, '0') || --valor a transferir
    RPAD('0', 16, '0') || --numero de factura
    RPAD('0', 16, '0') || --numero de credito de libranza
    RPAD('0', 16, '0') || --valor credito de libranza
    RPAD('0', 30, '0') || --nombre del beneficiario
    RPAD('0', 11, '0') || --nit del beneficiario
    RPAD('0', 6, '0') || --numero de autorizacion
    RPAD('0', 2, '0') || --codigo de respuesta
    RPAD('0', 20, '0')  --filler
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;

  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');
------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');
  
  INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
  SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 999999,
  '03' || --tipo de registro
  LPAD(TO_CHAR(vsi_nro_trab), 9, '0') ||
  RPAD(LPAD(TO_CHAR(FLOOR(NVL(vdc_total,0))), 16, '0'), 18, '0')
  FROM DUAL;  

  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;
  
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                
    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep

    
  COMMIT;  
  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_avvillas FOR ADAM.sp_fco_gen_bco_avvillas;
GRANT EXECUTE ON sp_fco_gen_bco_avvillas TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_avvillas_ni
(
  psi_id_rep 	number,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por avvillas para NI                    ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Marzo 18/2005                                         ***/
/********************************************************************/
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_liq_procesar.id_rep%TYPE,
 avc_usuario ri_liq_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT compania
 FROM ri_liq_procesar
 WHERE id_rep = asi_id_rep
 AND usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   

      BEGIN
        INSERT INTO fdt_bancos_tmp (id_rep, usuariow, compania, numero_liquidacion, trabajador, importe,cuenta_dep, 
        simbolo_mon, tipo, tipo_cuenta, tipo_doc)      
        SELECT psi_id_rep, pvc_usuario, ld.compania, ld.numero_liquidacion,
        ld.trabajador, ld.importe, '0', vch_simb_mon, 1, '0', '0'
        FROM liquidaciones_det ld, ri_liq_procesar lp
        WHERE ld.compania = lp.compania
        AND ld.tipo_nomina = lp.tipo_nomina
        AND ld.numero_liquidacion = lp.numero_liquidacion
        AND ld.trabajador = lp.trabajador
        AND ld.compania = cch_compania
        AND ld.concepto IN (vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5)
        AND ld.importe > 0
        AND ld.sit_transaccion = 2
        AND lp.id_rep = psi_id_rep
        AND lp.usuariow = pvc_usuario;            
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de liquidaciones_det');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT a.cuenta_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT b.cod_banco 
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT a.institucion_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9 - update a la tabla');
      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2
            
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             

  --hallando la maxima compañia que esta en ri_liq_procesar
  BEGIN
    SELECT MAX(compania)
    INTO cch_compania 
    FROM ri_liq_procesar
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario;
    EXCEPTION
      WHEN OTHERS THEN cch_compania := '';
  END;

  -- Trayendo al informacion del banco      
  OPEN c_info_banco(cch_compania, pti_banco);
  FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
  vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
  CLOSE c_info_banco;
      
  --utilizamos fijo la secuencia 1 del archivo de mm
  --registro de cabeza
  INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
  SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 1,
  '01' ||
  TO_CHAR(pdt_fecha, 'YYYYMMDD') ||
  TO_CHAR(vdt_fecha_hoy, 'hhmiss')||
  LPAD(SUBSTR(NVL(vvc_oficina_cta,'088'), 1, 3), 3, '0') ||  --grabar 088
  '02' ||
  RPAD('PAGO DE NOMINA', 50, ' ')  
  FROM DUAL;
        
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, ROWNUM+1,
    '02' || --tipo de registro
    '000023' || --pago de nomina
    '01' || --producto de origen
    LPAD(NVL(vvc_cuenta_bco,'0'), 16,'0') || --cuenta de la empresa
    '052' || --codigo de compensacion del bco destino
    '01' || --producto destino
    LPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 1, 16), 16, '0' ) || --cuenta destino    
    LPAD(ROWNUM, 9, '0') || --secuencia
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 14, '0'), 16, '0') || --valor a transferir
    RPAD('0', 16, '0') || --numero de factura
    RPAD('0', 16, '0') || --numero de credito de libranza
    RPAD('0', 16, '0') || --valor credito de libranza
    RPAD('0', 30, '0') || --nombre del beneficiario
    RPAD('0', 11, '0') || --nit del beneficiario
    RPAD('0', 6, '0') || --numero de autorizacion
    RPAD('0', 2, '0') || --codigo de respuesta
    RPAD('0', 20, '0')  --filler
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;
  
  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');

------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');

  INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
  SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 999999,
  '03' || --tipo de registro
  LPAD(TO_CHAR(vsi_nro_trab), 9, '0') ||
  RPAD(LPAD(TO_CHAR(FLOOR(NVL(vdc_total,0))), 16, '0'), 18, '0')
  FROM DUAL;  
  
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;
  
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                

    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep
  
  COMMIT;         

  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_avvillas_ni FOR ADAM.sp_fco_gen_bco_avvillas_ni;
GRANT EXECUTE ON sp_fco_gen_bco_avvillas_ni TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_colmena
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por colmena                             ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Mayo 21/2005                                          ***/
/********************************************************************/
vvc_tablaTN   varchar2(20);
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar el estado del periodo
-------------------------------------------------
CURSOR c_ti_sit(
 ach_compania	companias.Compania%TYPE,
 asi_id_cal	calendario_procesos.id_calendario%TYPE
) IS
  SELECT
    sit_periodo
  FROM
    cal_proc_cias
  WHERE
    compania = ach_compania And
    id_calendario = asi_id_cal;
-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_procesar.id_rep%TYPE,
 avc_usuario ri_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT c.compania, c.clase_nomina, c.tipo_nomina, c.anio, c.periodo, a.id_calendario
 FROM calendario_procesos a, cal_proc_cias b, ri_procesar c
 WHERE a.id_calendario = b.id_calendario
 AND a.tipo_nomina = c.tipo_nomina
 AND a.anio = c.anio
 AND a.periodo = c.periodo
 AND b.compania = c.compania
 AND c.id_rep = asi_id_rep
 AND c.usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  --borramos la tabla temporal que se uso  
  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania, cch_clase_nom, cch_tipo_nom, cnu_anio, cnu_periodo, cnu_id_cal;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      --  Verificar el estado del periodo
      OPEN c_ti_sit(cch_compania, cnu_id_cal);
      FETCH c_ti_sit INTO vti_sit;
      CLOSE c_ti_sit;
      --  Asignar la tabla de acuerdo al estado del periodo
      IF vti_sit = 2 THEN
        vvc_tablaTN := UPPER('trans_'||RTRIM(cch_compania)||'_'||TO_CHAR(cnu_id_cal));
      ELSE
        vvc_tablaTN := UPPER('transacciones_ns');
      END IF;
      vvc_tablaTN := TRIM(vvc_tablaTN);
      DBMS_OUTPUT.PUT_LINE('7 - Verificar el estado del periodo');
      DBMS_OUTPUT.PUT_LINE('7A - tabla'||vvc_tablaTN);
      
      --  Verificar que la tabla existe
      OPEN c_existe_tabla(vvc_tablaTN);
      FETCH c_existe_tabla INTO vdummy;
      IF c_existe_tabla%NOTFOUND THEN
      	RAISE no_tabla;
      END IF;
      CLOSE c_existe_tabla;
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   
            
      vvc_sql := 'INSERT INTO fdt_bancos_tmp' ||
                 ' SELECT ' ||  psi_id_rep || ', ' ||
                  sComilla || pvc_usuario || sComilla || ', ' ||
                  'tns.compania, tns.clase_nomina, tns.id_calendario, ' ||
                  'tns.trabajador, SUM(tns.importe), 0, 0, ' ||
                  sComilla || vch_simb_mon || sComilla || ', 1, 0, 0, 0' ||
                  ' FROM ' || vvc_tablaTN || ' tns, trabajadores_grales tg' ||
                  ' WHERE tns.compania = tg.compania' ||
                  ' AND tns.trabajador = tg.trabajador' ||
                  ' AND tg.forma_pago = 3' ||
                  ' AND tns.importe > 0' ||
                  ' AND tns.sit_transaccion = 2' ||
                  ' AND tns.compania = ' || sComilla || cch_compania || sComilla ||
                  ' AND tns.clase_nomina = ' || sComilla || cch_clase_nom || sComilla ||
                  ' AND tns.id_calendario = ' || cnu_id_cal ||
                  ' AND tns.concepto IN ( ' || vnu_concepto1 || ',' || vnu_concepto2 || ',' || vnu_concepto3 || ',' ||
                  vnu_concepto4 || ',' || vnu_concepto5 || ')' ||
                  ' GROUP BY tns.trabajador, tns.compania, tns.clase_nomina, tns.id_calendario';                  
      BEGIN
          vin_id_cursor := dbms_sql.open_cursor;
          dbms_sql.parse(vin_id_cursor, vvc_sql, dbms_sql.v7);
          vin_rows := dbms_sql.execute(vin_id_cursor);
          dbms_sql.close_cursor(vin_id_cursor);
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de la trans o transacciones_ns');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT MAX(a.cuenta_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(b.cod_banco)
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania 
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal )
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(a.institucion_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND clase_nomina = cch_clase_nom
            AND id_calendario = cnu_id_cal
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania                                
                             AND c.clase_nomina = cch_clase_nom
                             AND c.id_calendario = cnu_id_cal);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2
            
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             

  --hallando la maxima compañia que esta en ri_procesar
  BEGIN
    SELECT MAX(compania)
    INTO cch_compania 
    FROM ri_procesar
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario;
    EXCEPTION
      WHEN OTHERS THEN cch_compania := '';
  END;

  -- Trayendo al informacion del banco      
  OPEN c_info_banco(cch_compania, pti_banco);
  FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
  vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
  CLOSE c_info_banco;
      
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 2,
    '6' ||
    '32' ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 10, '0'), 12, '0') ||
    LPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 1, 17), 17, ' ' ) ||
    '000010579' ||
    RPAD(SUBSTR(LTRIM(t.clave_unica), 1, 15), 15, ' ' ) ||
    RPAD(REPLACE(LTRIM(RTRIM(t.nombre)), '/' , ' '), 22, ' ' ) ||
    'V' ||
    RPAD('PAGO DE NOMINA', 80, ' ' )    
    FROM fdt_bancos_tmp tns, trabajadores t
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;
      
  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');
------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');
  
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;
  
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                
    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep
  
    COMMIT;
  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;

END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_colmena FOR ADAM.sp_fco_gen_bco_colmena;
GRANT EXECUTE ON sp_fco_gen_bco_colmena TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_colmena_ni
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por colmena para NI                     ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Marzo 21/2005                                         ***/
/********************************************************************/
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_liq_procesar.id_rep%TYPE,
 avc_usuario ri_liq_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT compania
 FROM ri_liq_procesar
 WHERE id_rep = asi_id_rep
 AND usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   

      BEGIN
        INSERT INTO fdt_bancos_tmp (id_rep, usuariow, compania, numero_liquidacion, trabajador, importe,cuenta_dep, 
        simbolo_mon, tipo, tipo_cuenta, tipo_doc)      
        SELECT psi_id_rep, pvc_usuario, ld.compania, ld.numero_liquidacion,
        ld.trabajador, ld.importe, '0', vch_simb_mon, 1, '0', '0'
        FROM liquidaciones_det ld, ri_liq_procesar lp
        WHERE ld.compania = lp.compania
        AND ld.tipo_nomina = lp.tipo_nomina
        AND ld.numero_liquidacion = lp.numero_liquidacion
        AND ld.trabajador = lp.trabajador
        AND ld.compania = cch_compania
        AND ld.concepto IN (vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5)
        AND ld.importe > 0
        AND ld.sit_transaccion = 2
        AND lp.id_rep = psi_id_rep
        AND lp.usuariow = pvc_usuario;            
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de liquidaciones_det');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT a.cuenta_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT b.cod_banco 
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT a.institucion_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9 - update a la tabla');
      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2
            
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             

  --hallando la maxima compañia que esta en ri_liq_procesar
  BEGIN
    SELECT MAX(compania)
    INTO cch_compania 
    FROM ri_liq_procesar
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario;
    EXCEPTION
      WHEN OTHERS THEN cch_compania := '';
  END;

  -- Trayendo al informacion del banco      
  OPEN c_info_banco(cch_compania, pti_banco);
  FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
  vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
  CLOSE c_info_banco;
      
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 2,
    '6' ||
    '32' ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 10, '0'), 12, '0') ||
    LPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 1, 17), 17, ' ' ) ||
    '000010579' ||
    RPAD(SUBSTR(LTRIM(t.clave_unica), 1, 15), 15, ' ' ) ||
    RPAD(REPLACE(LTRIM(RTRIM(t.nombre)), '/' , ' '), 22, ' ' ) ||
    'V' ||
    RPAD('PAGO DE NOMINA', 80, ' ' )    
    FROM fdt_bancos_tmp tns, trabajadores t
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;
  
  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');

------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');
  
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);


  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                

    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep
  
  COMMIT;         

  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_colmena_ni FOR ADAM.sp_fco_gen_bco_colmena_ni;
GRANT EXECUTE ON sp_fco_gen_bco_colmena_ni TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_colombia
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por el Banco de Colombia                ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Mayo 21/2005                                          ***/
/********************************************************************/
vvc_tablaTN   varchar2(20);
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

vch_agr_id    char(10);
vch_agr_cta   char(10);

-------------------------------------------------
--    Cursor para Verificar el estado del periodo
-------------------------------------------------
CURSOR c_ti_sit(
 ach_compania	companias.Compania%TYPE,
 asi_id_cal	calendario_procesos.id_calendario%TYPE
) IS
  SELECT
    sit_periodo
  FROM
    cal_proc_cias
  WHERE
    compania = ach_compania And
    id_calendario = asi_id_cal;
-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_procesar.id_rep%TYPE,
 avc_usuario ri_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT c.compania, c.clase_nomina, c.tipo_nomina, c.anio, c.periodo, a.id_calendario
 FROM calendario_procesos a, cal_proc_cias b, ri_procesar c
 WHERE a.id_calendario = b.id_calendario
 AND a.tipo_nomina = c.tipo_nomina
 AND a.anio = c.anio
 AND a.periodo = c.periodo
 AND b.compania = c.compania
 AND c.id_rep = asi_id_rep
 AND c.usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

	DELETE fdt_bancos_tmp
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario;  
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);

  --agrupación del tipo del documento, cambiar de acuerdo al cliente
  vch_agr_id := 'TDN';
  vch_agr_cta := 'CTA';  
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania, cch_clase_nom, cch_tipo_nom, cnu_anio, cnu_periodo, cnu_id_cal;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      --  Verificar el estado del periodo
      OPEN c_ti_sit(cch_compania, cnu_id_cal);
      FETCH c_ti_sit INTO vti_sit;
      CLOSE c_ti_sit;
      --  Asignar la tabla de acuerdo al estado del periodo
      IF vti_sit = 2 THEN
        vvc_tablaTN := UPPER('trans_'||RTRIM(cch_compania)||'_'||TO_CHAR(cnu_id_cal));
      ELSE
        vvc_tablaTN := UPPER('transacciones_ns');
      END IF;
      vvc_tablaTN := TRIM(vvc_tablaTN);
      DBMS_OUTPUT.PUT_LINE('7 - Verificar el estado del periodo');
      DBMS_OUTPUT.PUT_LINE('7A - tabla'||vvc_tablaTN);
      --  Verificar que la tabla existe
      OPEN c_existe_tabla(vvc_tablaTN);
      FETCH c_existe_tabla INTO vdummy;
      IF c_existe_tabla%NOTFOUND THEN
      	RAISE no_tabla;
      END IF;
      CLOSE c_existe_tabla;
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   
            
      vvc_sql := 'INSERT INTO fdt_bancos_tmp' ||
                 ' SELECT ' ||  psi_id_rep || ', ' ||
                  sComilla || pvc_usuario || sComilla || ', ' ||
                  'tns.compania, tns.clase_nomina, tns.id_calendario, ' ||
                  'tns.trabajador, SUM(tns.importe), 0, 0, ' ||
                  sComilla || vch_simb_mon || sComilla || ', 1, 0, 0, 0' ||
                  ' FROM ' || vvc_tablaTN || ' tns, trabajadores_grales tg' ||
                  ' WHERE tns.compania = tg.compania' ||
                  ' AND tns.trabajador = tg.trabajador' ||
                  ' AND tg.forma_pago = 3' ||
                  ' AND tns.importe > 0' ||
                  ' AND tns.sit_transaccion = 2' ||
                  ' AND tns.compania = ' || sComilla || cch_compania || sComilla ||
                  ' AND tns.clase_nomina = ' || sComilla || cch_clase_nom || sComilla ||
                  ' AND tns.id_calendario = ' || cnu_id_cal ||
                  ' AND tns.concepto IN ( ' || vnu_concepto1 || ',' || vnu_concepto2 || ',' || vnu_concepto3 || ',' ||
                  vnu_concepto4 || ',' || vnu_concepto5 || ')' ||
                  ' GROUP BY tns.trabajador, tns.compania, tns.clase_nomina, tns.id_calendario';                  
      BEGIN
          vin_id_cursor := dbms_sql.open_cursor;
          dbms_sql.parse(vin_id_cursor, vvc_sql, dbms_sql.v7);
          vin_rows := dbms_sql.execute(vin_id_cursor);
          dbms_sql.close_cursor(vin_id_cursor);
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de la trans o transacciones_ns');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT MAX(a.cuenta_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');

      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(b.cod_banco) 
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania 
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(a.institucion_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9 - update a la tabla');
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND clase_nomina = cch_clase_nom
            AND id_calendario = cnu_id_cal
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania                                
                             AND c.clase_nomina = cch_clase_nom
                             AND c.id_calendario = cnu_id_cal);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2

      --Actualizar el tipo de documento *** cambiar de acuerdo al cliente ***
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_doc = 
             (SELECT DECODE (TRIM(a.dato), '001', 'C',
                   '002', 'E')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_id
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      BEGIN
        UPDATE fdt_bancos_tmp c
        SET tipo_cuenta = 
             (SELECT DECODE (TRIM(a.dato), '1', '1', '2')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_cta
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
                        
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             
    
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 2, 
    '6' || --Tipo de registro
    LPAD(SUBSTR(LTRIM(t.clave_unica), 1, 15), 15, '0' ) || --Nit Beneficiario
    RPAD(REPLACE(LTRIM(RTRIM(t.nombre)), '/' , ' '), 18, ' ' ) || --Nombre del beneficiario
    '005600078' || --Banco cuenta del beneficiario
    LPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 1, 17), 17, '0' ) ||--Numero de cuenta del beneficiario
    'S' || --Indicador Lugar de pago
    DECODE(tns.tipo_cuenta, '2', '37', '1', '27') || --se deja fijo como ahorros para todos, ver si manejan corriente
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 10, '0'), 10, '0') || --Valor de la transaccion
    'NOMINA   ' || --Concepto
    RPAD('PAGO DE NOMINA', 12, ' ') || --referencia
    ' ' --relleno
    FROM trabajadores t , fdt_bancos_tmp tns
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;

  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');
------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');

    --armamos la estructura del archivo plano. La cabeza
    --Aqui queda el valor de cuenta, tipo cuenta de la ultima cia recorrida
    INSERT INTO
      fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT
      psi_id_rep, pvc_usuario, pti_banco, 1, 1,
      '1' ||  --Tipo de registro
      LPAD(REPLACE(NVL(registro_fiscal,'0'),'-',''), 10, '0') || --Nit entidad que envia
      RPAD(SUBSTR(nombre_cia,1,16),16, ' ') ||  --Nombre entidad que envia
      '225' ||  --Clase de transacciones contenidas
      'P. NOMINA ' ||  --Descripcion proposito transacciones
      TO_CHAR(pdt_fecha, 'YYMMDD') || --fecha transmision del lote
      'D' ||  --Secuencia envio del lote
      TO_CHAR(pdt_fecha, 'YYMMDD') || --fecha aplicacion de transacciones
      LPAD(TO_CHAR(vsi_nro_trab), 6, '0') ||  --Numero de registros
      '000000000000' ||  --Sumatoria debitos        
      LPAD(TO_CHAR(Floor(vdc_total)),12,'0') ||  --Sumatoria creditos      
      LPAD(SUBSTR(vvc_cuenta_bco, 1, 11), 11, '0')  + -- cuenta cliente a debitar
      DECODE(vti_tipo_cta, 2, 'S', 'D') 
    FROM
      companias
    WHERE
      compania IN (SELECT DISTINCT compania FROM ri_procesar WHERE id_rep = psi_id_rep AND usuariow = pvc_usuario);
      
    DBMS_OUTPUT.PUT_LINE('11 - insert a la tabla fdt_bancos_mm');
        
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;
  
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                
    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep
  
    COMMIT;         

  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
         
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_colombia FOR ADAM.sp_fco_gen_bco_colombia;
GRANT EXECUTE ON sp_fco_gen_bco_colombia TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_colombia_ni
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por bancolombia para NI                 ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Marzo 21/2005                                         ***/
/********************************************************************/
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

vch_agr_id    char(10);
vch_agr_cta   char(10);

-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_liq_procesar.id_rep%TYPE,
 avc_usuario ri_liq_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT compania
 FROM ri_liq_procesar
 WHERE id_rep = asi_id_rep
 AND usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);
  
  --agrupación del tipo del documento, cambiar de acuerdo al cliente
  vch_agr_id := 'TDN';
  vch_agr_cta := 'CTA';
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   

      BEGIN
        INSERT INTO fdt_bancos_tmp (id_rep, usuariow, compania, numero_liquidacion, trabajador, importe,cuenta_dep, 
        simbolo_mon, tipo, tipo_cuenta, tipo_doc)      
        SELECT psi_id_rep, pvc_usuario, ld.compania, ld.numero_liquidacion,
        ld.trabajador, ld.importe, '0', vch_simb_mon, 1, '0', '0'
        FROM liquidaciones_det ld, ri_liq_procesar lp
        WHERE ld.compania = lp.compania
        AND ld.tipo_nomina = lp.tipo_nomina
        AND ld.numero_liquidacion = lp.numero_liquidacion
        AND ld.trabajador = lp.trabajador
        AND ld.compania = cch_compania
        AND ld.concepto IN (vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5)
        AND ld.importe > 0
        AND ld.sit_transaccion = 2
        AND lp.id_rep = psi_id_rep
        AND lp.usuariow = pvc_usuario;            
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de liquidaciones_det');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT a.cuenta_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT b.cod_banco 
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT a.institucion_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9 - update a la tabla');
      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;
      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2

      --Actualizar el tipo de documento *** cambiar de acuerdo al cliente ***
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_doc = 
             (SELECT DECODE (TRIM(a.dato), '001', 'C',
                   '002', 'E')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_id
              AND c.compania = cch_compania
              AND c.id_rep = psi_id_rep
              AND c.usuariow = pvc_usuario)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_cuenta = 
             (SELECT DECODE (TRIM(a.dato), '1', '1', '2')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_cta
              AND c.compania = cch_compania
              AND c.id_rep = psi_id_rep
              AND c.usuariow = pvc_usuario)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;                  
                        
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;
  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             
    
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 2, 
    '6' || --Tipo de registro
    LPAD(SUBSTR(LTRIM(t.clave_unica), 1, 15), 15, '0' ) || --Nit Beneficiario
    RPAD(REPLACE(LTRIM(RTRIM(t.nombre)), '/' , ' '), 18, ' ' ) || --Nombre del beneficiario
    '005600078' || --Banco cuenta del beneficiario
    LPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 1, 17), 17, '0' ) ||--Numero de cuenta del beneficiario
    'S' || --Indicador Lugar de pago
    DECODE(tns.tipo_cuenta, '2', '37', '1', '27') || --se deja fijo como ahorros para todos, ver si manejan corriente
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 10, '0'), 10, '0') || --Valor de la transaccion
    'NOMINA   ' || --Concepto
    RPAD('PAGO DE NOMINA', 12, ' ') || --referencia
    ' ' --relleno
    FROM trabajadores t , fdt_bancos_tmp tns
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;

  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');
------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');

    --armamos la estructura del archivo plano. La cabeza
    --Aqui queda el valor de cuenta, tipo cuenta de la ultima cia recorrida
    INSERT INTO
      fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT
      psi_id_rep, pvc_usuario, pti_banco, 1, 1,
      '1' ||  --Tipo de registro
      LPAD(REPLACE(NVL(registro_fiscal,'0'),'-',''), 10, '0') || --Nit entidad que envia
      RPAD(SUBSTR(nombre_cia,1,16),16, ' ') ||  --Nombre entidad que envia
      '225' ||  --Clase de transacciones contenidas
      'P. NOMINA ' ||  --Descripcion proposito transacciones
      TO_CHAR(pdt_fecha, 'YYMMDD') || --fecha transmision del lote
      'D' ||  --Secuencia envio del lote
      TO_CHAR(pdt_fecha, 'YYMMDD') || --fecha aplicacion de transacciones
      LPAD(TO_CHAR(vsi_nro_trab), 6, '0') ||  --Numero de registros
      '000000000000' ||  --Sumatoria debitos        
      LPAD(TO_CHAR(Floor(vdc_total)),12,'0') ||  --Sumatoria creditos      
      LPAD(SUBSTR(vvc_cuenta_bco, 1, 11), 11, '0')  || -- cuenta cliente a debitar
      DECODE(vti_tipo_cta, 2, 'S', 'D') 
    FROM
      companias
    WHERE
      compania IN (SELECT DISTINCT compania FROM ri_liq_procesar WHERE id_rep = psi_id_rep AND usuariow = pvc_usuario);
      
    DBMS_OUTPUT.PUT_LINE('11 - insert a la tabla fdt_bancos_mm');
  
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;

  
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                
    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep

    COMMIT;         
  
  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
         
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_colombia_ni FOR ADAM.sp_fco_gen_bco_colombia_ni;
GRANT EXECUTE ON sp_fco_gen_bco_colombia_ni TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_conavi
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por conavi                              ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Mayo 21/2005                                          ***/
/********************************************************************/
vvc_tablaTN   varchar2(20);
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

vch_agr_id    char(10);
vch_agr_cta   char(10);

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar el estado del periodo
-------------------------------------------------
CURSOR c_ti_sit(
 ach_compania	companias.Compania%TYPE,
 asi_id_cal	calendario_procesos.id_calendario%TYPE
) IS
  SELECT
    sit_periodo
  FROM
    cal_proc_cias
  WHERE
    compania = ach_compania And
    id_calendario = asi_id_cal;
-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_procesar.id_rep%TYPE,
 avc_usuario ri_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT c.compania, c.clase_nomina, c.tipo_nomina, c.anio, c.periodo, a.id_calendario
 FROM calendario_procesos a, cal_proc_cias b, ri_procesar c
 WHERE a.id_calendario = b.id_calendario
 AND a.tipo_nomina = c.tipo_nomina
 AND a.anio = c.anio
 AND a.periodo = c.periodo
 AND b.compania = c.compania
 AND c.id_rep = asi_id_rep
 AND c.usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  --borramos la tabla temporal que se uso  
  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);

  --cambiar de acuerdo a la agrupacion que maneja cada cliente
  vch_agr_id := 'TIPO_DOCU';
  vch_agr_cta := 'TIPO_CUENT';
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania, cch_clase_nom, cch_tipo_nom, cnu_anio, cnu_periodo, cnu_id_cal;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      --  Verificar el estado del periodo
      OPEN c_ti_sit(cch_compania, cnu_id_cal);
      FETCH c_ti_sit INTO vti_sit;
      CLOSE c_ti_sit;
      --  Asignar la tabla de acuerdo al estado del periodo
      IF vti_sit = 2 THEN
        vvc_tablaTN := UPPER('trans_'||RTRIM(cch_compania)||'_'||TO_CHAR(cnu_id_cal));
      ELSE
        vvc_tablaTN := UPPER('transacciones_ns');
      END IF;
      vvc_tablaTN := TRIM(vvc_tablaTN);
      DBMS_OUTPUT.PUT_LINE('7 - Verificar el estado del periodo');
      DBMS_OUTPUT.PUT_LINE('7A - tabla'||vvc_tablaTN);
      
      --  Verificar que la tabla existe
      OPEN c_existe_tabla(vvc_tablaTN);
      FETCH c_existe_tabla INTO vdummy;
      IF c_existe_tabla%NOTFOUND THEN
      	RAISE no_tabla;
      END IF;
      CLOSE c_existe_tabla;
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   
            
      vvc_sql := 'INSERT INTO fdt_bancos_tmp' ||
                 ' SELECT ' ||  psi_id_rep || ', ' ||
                  sComilla || pvc_usuario || sComilla || ', ' ||
                  'tns.compania, tns.clase_nomina, tns.id_calendario, ' ||
                  'tns.trabajador, SUM(tns.importe), 0, 0, ' ||
                  sComilla || vch_simb_mon || sComilla || ', 1, 0, 0, 0' ||
                  ' FROM ' || vvc_tablaTN || ' tns, trabajadores_grales tg' ||
                  ' WHERE tns.compania = tg.compania' ||
                  ' AND tns.trabajador = tg.trabajador' ||
                  ' AND tg.forma_pago = 3' ||
                  ' AND tns.importe > 0' ||
                  ' AND tns.sit_transaccion = 2' ||
                  ' AND tns.compania = ' || sComilla || cch_compania || sComilla ||
                  ' AND tns.clase_nomina = ' || sComilla || cch_clase_nom || sComilla ||
                  ' AND tns.id_calendario = ' || cnu_id_cal ||
                  ' AND tns.concepto IN ( ' || vnu_concepto1 || ',' || vnu_concepto2 || ',' || vnu_concepto3 || ',' ||
                  vnu_concepto4 || ',' || vnu_concepto5 || ')' ||
                  ' GROUP BY tns.trabajador, tns.compania, tns.clase_nomina, tns.id_calendario';                  
      BEGIN
          vin_id_cursor := dbms_sql.open_cursor;
          dbms_sql.parse(vin_id_cursor, vvc_sql, dbms_sql.v7);
          vin_rows := dbms_sql.execute(vin_id_cursor);
          dbms_sql.close_cursor(vin_id_cursor);
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de la trans o transacciones_ns');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT MAX(a.cuenta_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(b.cod_banco)
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania 
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal )
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(a.institucion_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND clase_nomina = cch_clase_nom
            AND id_calendario = cnu_id_cal
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania                                
                             AND c.clase_nomina = cch_clase_nom
                             AND c.id_calendario = cnu_id_cal);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2
            
      --Actualizar el tipo de documento *** cambiar de acuerdo al cliente ***
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_doc = 
             (SELECT DECODE (TRIM(a.dato), '01', '02',
                   '02', '04',
                   '04', '01',
                   '05', '03')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_id
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_cuenta = 
             (SELECT DECODE (TRIM(a.dato), '1', 'CA', 'CC')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_cta
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             

  --hallando la maxima compañia que esta en ri_procesar
  BEGIN
    SELECT MAX(compania)
    INTO cch_compania 
    FROM ri_procesar
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario;
    EXCEPTION
      WHEN OTHERS THEN cch_compania := '';
  END;

  -- Trayendo al informacion del banco      
  OPEN c_info_banco(cch_compania, pti_banco);
  FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
  vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
  CLOSE c_info_banco;
      
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 2,
    '1' ||
    DECODE(tns.ins_dep, '007', '560007', '055',  '570110') || 
    DECODE(tns.ins_dep, '055', SUBSTR(RTRIM(tns.cuenta_dep), 1, 4), '0000') || 
	  DECODE(tns.ins_dep, '055',LPAD(SUBSTR(RTRIM(tns.cuenta_dep), 5, 9), 11, '0'),LPAD(SUBSTR(RTRIM(tns.cuenta_dep), 1, 11), 11, '0')) || '      ' ||
    LPAD(SUBSTR(LTRIM(tns.tipo_cuenta), 1, 1), 1, '2' ) ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 17, '0'), 17, '0')        
    FROM fdt_bancos_tmp tns, trabajadores t
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;
  
  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');
------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');

  --la cabeza
  INSERT INTO
    fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
  SELECT
    psi_id_rep, pvc_usuario, pti_banco, 1, 1,
    '0' || '01' || 'NOE' || '5086' ||  --**OJO, al parecer algunos numeros de estos cambian por cliente, verificar
    '5086000000166' || '0000000000001' ||  
    '570110' || '5045' || '00007680036' || '      ' || 
    DECODE(vti_tipo_cta, 1, '1', '2') || -- 1 SI ES CORRIENTE O 2 SI ES AHORROS
    LPAD(TO_CHAR(vsi_nro_trab), 6, '0') ||    
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(vdc_total,0))), 17, '0'), 17, '0') ||
    RPAD('Pago de Nomina', 100, ' ')
  FROM DUAL;    
  
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;
  
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                
    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep

    COMMIT;
  
  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_conavi FOR ADAM.sp_fco_gen_bco_conavi;
GRANT EXECUTE ON sp_fco_gen_bco_conavi TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_conavi_ni
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por conavi para NI                      ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Mayo 21/2005                                          ***/
/********************************************************************/
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

vch_agr_id    char(10);
vch_agr_cta   char(10);

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_liq_procesar.id_rep%TYPE,
 avc_usuario ri_liq_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT compania
 FROM ri_liq_procesar
 WHERE id_rep = asi_id_rep
 AND usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);
  
  --cambiar de acuerdo a la agrupacion que maneja cada cliente
  vch_agr_id := 'TIPO_DOCU';
  vch_agr_cta := 'TIPO_CUENT';
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   

      BEGIN
        INSERT INTO fdt_bancos_tmp (id_rep, usuariow, compania, numero_liquidacion, trabajador, importe,cuenta_dep, 
        simbolo_mon, tipo, tipo_cuenta, tipo_doc)      
        SELECT psi_id_rep, pvc_usuario, ld.compania, ld.numero_liquidacion,
        ld.trabajador, ld.importe, '0', vch_simb_mon, 1, '0', '0'
        FROM liquidaciones_det ld, ri_liq_procesar lp
        WHERE ld.compania = lp.compania
        AND ld.tipo_nomina = lp.tipo_nomina
        AND ld.numero_liquidacion = lp.numero_liquidacion
        AND ld.trabajador = lp.trabajador
        AND ld.compania = cch_compania
        AND ld.concepto IN (vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5)
        AND ld.importe > 0
        AND ld.sit_transaccion = 2
        AND lp.id_rep = psi_id_rep
        AND lp.usuariow = pvc_usuario;            
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de liquidaciones_det');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT a.cuenta_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT b.cod_banco 
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT a.institucion_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9 - update a la tabla');
      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2

      --Actualizar el tipo de documento *** cambiar de acuerdo al cliente ***
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_doc = 
             (SELECT DECODE (TRIM(a.dato), '01', '02',
                   '02', '04',
                   '04', '01',
                   '05', '03')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_id
              AND c.compania = cch_compania
              AND c.id_rep = psi_id_rep
              AND c.usuariow = pvc_usuario)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_cuenta = 
             (SELECT DECODE (TRIM(a.dato), '1', 'CA', 'CC')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_cta
              AND c.compania = cch_compania
              AND c.id_rep = psi_id_rep
              AND c.usuariow = pvc_usuario)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
            
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             

  --hallando la maxima compañia que esta en ri_liq_procesar
  BEGIN
    SELECT MAX(compania)
    INTO cch_compania 
    FROM ri_liq_procesar
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario;
    EXCEPTION
      WHEN OTHERS THEN cch_compania := '';
  END;

  -- Trayendo al informacion del banco      
  OPEN c_info_banco(cch_compania, pti_banco);
  FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
  vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
  CLOSE c_info_banco;
      
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 2,
    '1' ||
    DECODE(tns.ins_dep, '007', '560007', '055',  '570110') || 
    DECODE(tns.ins_dep, '055', SUBSTR(RTRIM(tns.cuenta_dep), 1, 4), '0000') || 
	  DECODE(tns.ins_dep, '055',LPAD(SUBSTR(RTRIM(tns.cuenta_dep), 5, 9), 11, '0'),LPAD(SUBSTR(RTRIM(tns.cuenta_dep), 1, 11), 11, '0')) || '      ' ||
    LPAD(SUBSTR(LTRIM(tns.tipo_cuenta), 1, 1), 1, '2' ) ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 17, '0'), 17, '0')        
    FROM fdt_bancos_tmp tns, trabajadores t
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;

  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');

------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');

  --la cabeza
  INSERT INTO
    fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
  SELECT
    psi_id_rep, pvc_usuario, pti_banco, 1, 1,
    '0' || '01' || 'NOE' || '5086' ||  --**OJO, al parecer algunos numeros de estos cambian por cliente, verificar
    '5086000000166' || '0000000000001' ||  
    '570110' || '5045' || '00007680036' || '      ' || 
    DECODE(vti_tipo_cta, 1, '1', '2') || -- 1 SI ES CORRIENTE O 2 SI ES AHORROS
    LPAD(TO_CHAR(vsi_nro_trab), 6, '0') ||    
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(vdc_total,0))), 17, '0'), 17, '0') ||
    RPAD('Pago de Nomina', 100, ' ')
  FROM DUAL;    
    
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;
  
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                

    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep
  
  COMMIT;         

  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_conavi_ni FOR ADAM.sp_fco_gen_bco_conavi_ni;
GRANT EXECUTE ON sp_fco_gen_bco_conavi_ni TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_davivienda
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por davivienda                          ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Mayo 21/2005                                          ***/
/********************************************************************/
vvc_tablaTN   varchar2(20);
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

vch_agr_id    char(10);
vch_agr_cta   char(10);

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar el estado del periodo
-------------------------------------------------
CURSOR c_ti_sit(
 ach_compania	companias.Compania%TYPE,
 asi_id_cal	calendario_procesos.id_calendario%TYPE
) IS
  SELECT
    sit_periodo
  FROM
    cal_proc_cias
  WHERE
    compania = ach_compania And
    id_calendario = asi_id_cal;
-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_procesar.id_rep%TYPE,
 avc_usuario ri_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT c.compania, c.clase_nomina, c.tipo_nomina, c.anio, c.periodo, a.id_calendario
 FROM calendario_procesos a, cal_proc_cias b, ri_procesar c
 WHERE a.id_calendario = b.id_calendario
 AND a.tipo_nomina = c.tipo_nomina
 AND a.anio = c.anio
 AND a.periodo = c.periodo
 AND b.compania = c.compania
 AND c.id_rep = asi_id_rep
 AND c.usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  --borramos la tabla temporal que se uso  
  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);

  --cambiar de acuerdo a la agrupacion que maneja cada cliente
  vch_agr_id := 'TIPO_DOCU';
  vch_agr_cta := 'TIPO_CUENT';
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania, cch_clase_nom, cch_tipo_nom, cnu_anio, cnu_periodo, cnu_id_cal;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      --  Verificar el estado del periodo
      OPEN c_ti_sit(cch_compania, cnu_id_cal);
      FETCH c_ti_sit INTO vti_sit;
      CLOSE c_ti_sit;
      --  Asignar la tabla de acuerdo al estado del periodo
      IF vti_sit = 2 THEN
        vvc_tablaTN := UPPER('trans_'||RTRIM(cch_compania)||'_'||TO_CHAR(cnu_id_cal));
      ELSE
        vvc_tablaTN := UPPER('transacciones_ns');
      END IF;
      vvc_tablaTN := TRIM(vvc_tablaTN);
      DBMS_OUTPUT.PUT_LINE('7 - Verificar el estado del periodo');
      DBMS_OUTPUT.PUT_LINE('7A - tabla'||vvc_tablaTN);
      
      --  Verificar que la tabla existe
      OPEN c_existe_tabla(vvc_tablaTN);
      FETCH c_existe_tabla INTO vdummy;
      IF c_existe_tabla%NOTFOUND THEN
      	RAISE no_tabla;
      END IF;
      CLOSE c_existe_tabla;
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   
            
      vvc_sql := 'INSERT INTO fdt_bancos_tmp' ||
                 ' SELECT ' ||  psi_id_rep || ', ' ||
                  sComilla || pvc_usuario || sComilla || ', ' ||
                  'tns.compania, tns.clase_nomina, tns.id_calendario, ' ||
                  'tns.trabajador, SUM(tns.importe), 0, 0, ' ||
                  sComilla || vch_simb_mon || sComilla || ', 1, 0, 0, 0' ||
                  ' FROM ' || vvc_tablaTN || ' tns, trabajadores_grales tg' ||
                  ' WHERE tns.compania = tg.compania' ||
                  ' AND tns.trabajador = tg.trabajador' ||
                  ' AND tg.forma_pago = 3' ||
                  ' AND tns.importe > 0' ||
                  ' AND tns.sit_transaccion = 2' ||
                  ' AND tns.compania = ' || sComilla || cch_compania || sComilla ||
                  ' AND tns.clase_nomina = ' || sComilla || cch_clase_nom || sComilla ||
                  ' AND tns.id_calendario = ' || cnu_id_cal ||
                  ' AND tns.concepto IN ( ' || vnu_concepto1 || ',' || vnu_concepto2 || ',' || vnu_concepto3 || ',' ||
                  vnu_concepto4 || ',' || vnu_concepto5 || ')' ||
                  ' GROUP BY tns.trabajador, tns.compania, tns.clase_nomina, tns.id_calendario';                  
      BEGIN
          vin_id_cursor := dbms_sql.open_cursor;
          dbms_sql.parse(vin_id_cursor, vvc_sql, dbms_sql.v7);
          vin_rows := dbms_sql.execute(vin_id_cursor);
          dbms_sql.close_cursor(vin_id_cursor);
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de la trans o transacciones_ns');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT MAX(a.cuenta_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(b.cod_banco)
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania 
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal )
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(a.institucion_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND clase_nomina = cch_clase_nom
            AND id_calendario = cnu_id_cal
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania                                
                             AND c.clase_nomina = cch_clase_nom
                             AND c.id_calendario = cnu_id_cal);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2
            
      --Actualizar el tipo de documento *** cambiar de acuerdo al cliente ***
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_doc = 
             (SELECT DECODE (TRIM(a.dato), '01', '02',
                   '02', '04',
                   '04', '01',
                   '05', '03')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_id
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_cuenta = 
             (SELECT DECODE (TRIM(a.dato), '1', 'CA', 'CC')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_cta
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             

  --hallando la maxima compañia que esta en ri_procesar
  BEGIN
    SELECT MAX(compania)
    INTO cch_compania 
    FROM ri_procesar
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario;
    EXCEPTION
      WHEN OTHERS THEN cch_compania := '';
  END;

  -- Trayendo al informacion del banco      
  OPEN c_info_banco(cch_compania, pti_banco);
  FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
  vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
  CLOSE c_info_banco;
      
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 2,
    'TR' ||
    LPAD(SUBSTR(LTRIM(t.clave_unica), 1, 16), 16, '0' ) ||    
    LPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 1, 16), 16, '0' ) ||
    LPAD(SUBSTR(LTRIM(tns.tipo_cuenta), 1, 2), 2, 'CA' ) ||
    '000051' ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 16, '0'), 18, '0') ||
    RPAD('0', 6, '0') ||
    LPAD(SUBSTR(LTRIM(tns.tipo_doc), 1, 2), 2, '02' ) ||
    '0' ||
    '9999' ||
    RPAD('0', 40, '0') ||
    RPAD('0', 18, '0') ||
    RPAD('0', 8, '0') ||
    RPAD('0', 4, '0') ||
    RPAD('0', 4, '0') ||
    RPAD('0', 7, '0')    
    FROM fdt_bancos_tmp tns, trabajadores t
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;
  
  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');
------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');

  --la cabeza
  INSERT INTO
    fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
  SELECT
    psi_id_rep, pvc_usuario, pti_banco, 1, 1,
    'RC' ||
    LPAD(REPLACE(NVL(registro_fiscal,'0'),'-',''), 16, '0') ||
    'NOMINOGE' ||
    LPAD(NVL(vvc_cuenta_bco,'0'), 16, '0') ||
    DECODE(NVL(vti_tipo_cta,'CA'), 2, 'CA', 'CC') ||
    '000051' ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(vdc_total,0))), 16, '0'), 18, '0') ||
    LPAD(TO_CHAR(vsi_nro_trab), 6, '0') ||
    TO_CHAR(pdt_fecha, 'YYYYMMDD') ||
    '00' || --horas
    '00' || --minutos
    '00' || --segundos
    '0000' ||
    '9999' ||
    RPAD('0', 8, '0') ||
    RPAD('0', 6, '0') ||
    '00' ||
    '01' ||
    RPAD('0', 12, '0') ||
    LPAD(NVL(vvc_oficina_cta,'0'), 4, '0') ||
    RPAD('0', 40, '0')    
  FROM
    companias
  WHERE
    compania IN (SELECT DISTINCT compania FROM ri_procesar WHERE id_rep = psi_id_rep AND usuariow = pvc_usuario);
  
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;
  
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                
    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep
  
    COMMIT;

  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_davivienda FOR ADAM.sp_fco_gen_bco_davivienda;
GRANT EXECUTE ON sp_fco_gen_bco_davivienda TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_davivienda_ni
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por davivienda para NI                  ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Mayo 21/2005                                          ***/
/********************************************************************/
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

vch_agr_id    char(10);
vch_agr_cta   char(10);

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_liq_procesar.id_rep%TYPE,
 avc_usuario ri_liq_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT compania
 FROM ri_liq_procesar
 WHERE id_rep = asi_id_rep
 AND usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);
  
  --cambiar de acuerdo a la agrupacion que maneja cada cliente
  vch_agr_id := 'TIPO_DOCU';
  vch_agr_cta := 'TIPO_CUENT';
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   

      BEGIN
        INSERT INTO fdt_bancos_tmp (id_rep, usuariow, compania, numero_liquidacion, trabajador, importe,cuenta_dep, 
        simbolo_mon, tipo, tipo_cuenta, tipo_doc)      
        SELECT psi_id_rep, pvc_usuario, ld.compania, ld.numero_liquidacion,
        ld.trabajador, ld.importe, '0', vch_simb_mon, 1, '0', '0'
        FROM liquidaciones_det ld, ri_liq_procesar lp
        WHERE ld.compania = lp.compania
        AND ld.tipo_nomina = lp.tipo_nomina
        AND ld.numero_liquidacion = lp.numero_liquidacion
        AND ld.trabajador = lp.trabajador
        AND ld.compania = cch_compania
        AND ld.concepto IN (vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5)
        AND ld.importe > 0
        AND ld.sit_transaccion = 2
        AND lp.id_rep = psi_id_rep
        AND lp.usuariow = pvc_usuario;            
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de liquidaciones_det');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT a.cuenta_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT b.cod_banco 
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT a.institucion_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9 - update a la tabla');
      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2

      --Actualizar el tipo de documento *** cambiar de acuerdo al cliente ***
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_doc = 
             (SELECT DECODE (TRIM(a.dato), '01', '02',
                   '02', '04',
                   '04', '01',
                   '05', '03')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_id
              AND c.compania = cch_compania
              AND c.id_rep = psi_id_rep
              AND c.usuariow = pvc_usuario)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_cuenta = 
             (SELECT DECODE (TRIM(a.dato), '1', 'CA', 'CC')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_cta
              AND c.compania = cch_compania
              AND c.id_rep = psi_id_rep
              AND c.usuariow = pvc_usuario)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
            
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             

  --hallando la maxima compañia que esta en ri_liq_procesar
  BEGIN
    SELECT MAX(compania)
    INTO cch_compania 
    FROM ri_liq_procesar
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario;
    EXCEPTION
      WHEN OTHERS THEN cch_compania := '';
  END;

  -- Trayendo al informacion del banco      
  OPEN c_info_banco(cch_compania, pti_banco);
  FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
  vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
  CLOSE c_info_banco;
      
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 2,
    'TR' ||
    LPAD(SUBSTR(LTRIM(t.clave_unica), 1, 16), 16, '0' ) ||    
    LPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 1, 16), 16, '0' ) ||
    LPAD(SUBSTR(LTRIM(tns.tipo_cuenta), 1, 2), 2, 'CA' ) ||
    '000051' ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 16, '0'), 18, '0') ||
    RPAD('0', 6, '0') ||
    LPAD(SUBSTR(LTRIM(tns.tipo_doc), 1, 2), 2, '02' ) ||
    '0' ||
    '9999' ||
    RPAD('0', 40, '0') ||
    RPAD('0', 18, '0') ||
    RPAD('0', 8, '0') ||
    RPAD('0', 4, '0') ||
    RPAD('0', 4, '0') ||
    RPAD('0', 7, '0')    
    FROM fdt_bancos_tmp tns, trabajadores t
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;

  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');

------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');

  --la cabeza
  INSERT INTO
    fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
  SELECT
    psi_id_rep, pvc_usuario, pti_banco, 1, 1,
    'RC' ||
    LPAD(REPLACE(NVL(registro_fiscal,'0'),'-',''), 16, '0') ||
    'NOMINOGE' ||
    LPAD(NVL(vvc_cuenta_bco,'0'), 16, '0') ||
    DECODE(NVL(vti_tipo_cta,'CA'), 2, 'CA', 'CC') ||
    '000051' ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(vdc_total,0))), 16, '0'), 18, '0') ||
    LPAD(TO_CHAR(vsi_nro_trab), 6, '0') ||
    TO_CHAR(pdt_fecha, 'YYYYMMDD') ||
    '00' || --horas
    '00' || --minutos
    '00' || --segundos
    '0000' ||
    '9999' ||
    RPAD('0', 8, '0') ||
    RPAD('0', 6, '0') ||
    '00' ||
    '01' ||
    RPAD('0', 12, '0') ||
    LPAD(NVL(vvc_oficina_cta,'0'), 4, '0') ||
    RPAD('0', 40, '0')    
  FROM
    companias
  WHERE
    compania IN (SELECT DISTINCT compania FROM ri_liq_procesar WHERE id_rep = psi_id_rep AND usuariow = pvc_usuario);
    
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;
  
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                

    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep
  
  COMMIT;         

  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_davivienda_ni FOR ADAM.sp_fco_gen_bco_davivienda_ni;
GRANT EXECUTE ON sp_fco_gen_bco_davivienda_ni TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_ganadero
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por davivienda                          ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Mayo 21/2005                                          ***/
/********************************************************************/
vvc_tablaTN   varchar2(20);
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

vch_agr_id    char(10);
vch_agr_cta   char(10);

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar el estado del periodo
-------------------------------------------------
CURSOR c_ti_sit(
 ach_compania	companias.Compania%TYPE,
 asi_id_cal	calendario_procesos.id_calendario%TYPE
) IS
  SELECT
    sit_periodo
  FROM
    cal_proc_cias
  WHERE
    compania = ach_compania And
    id_calendario = asi_id_cal;
-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_procesar.id_rep%TYPE,
 avc_usuario ri_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT c.compania, c.clase_nomina, c.tipo_nomina, c.anio, c.periodo, a.id_calendario
 FROM calendario_procesos a, cal_proc_cias b, ri_procesar c
 WHERE a.id_calendario = b.id_calendario
 AND a.tipo_nomina = c.tipo_nomina
 AND a.anio = c.anio
 AND a.periodo = c.periodo
 AND b.compania = c.compania
 AND c.id_rep = asi_id_rep
 AND c.usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  --borramos la tabla temporal que se uso  
  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);

  --cambiar de acuerdo a la agrupacion que maneja cada cliente
  vch_agr_id := 'TIPO_DOCU';
  vch_agr_cta := 'TIPO_CUENT';
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania, cch_clase_nom, cch_tipo_nom, cnu_anio, cnu_periodo, cnu_id_cal;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      --  Verificar el estado del periodo
      OPEN c_ti_sit(cch_compania, cnu_id_cal);
      FETCH c_ti_sit INTO vti_sit;
      CLOSE c_ti_sit;
      --  Asignar la tabla de acuerdo al estado del periodo
      IF vti_sit = 2 THEN
        vvc_tablaTN := UPPER('trans_'||RTRIM(cch_compania)||'_'||TO_CHAR(cnu_id_cal));
      ELSE
        vvc_tablaTN := UPPER('transacciones_ns');
      END IF;
      vvc_tablaTN := TRIM(vvc_tablaTN);
      DBMS_OUTPUT.PUT_LINE('7 - Verificar el estado del periodo');
      DBMS_OUTPUT.PUT_LINE('7A - tabla'||vvc_tablaTN);
      
      --  Verificar que la tabla existe
      OPEN c_existe_tabla(vvc_tablaTN);
      FETCH c_existe_tabla INTO vdummy;
      IF c_existe_tabla%NOTFOUND THEN
      	RAISE no_tabla;
      END IF;
      CLOSE c_existe_tabla;
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   
            
      vvc_sql := 'INSERT INTO fdt_bancos_tmp' ||
                 ' SELECT ' ||  psi_id_rep || ', ' ||
                  sComilla || pvc_usuario || sComilla || ', ' ||
                  'tns.compania, tns.clase_nomina, tns.id_calendario, ' ||
                  'tns.trabajador, SUM(tns.importe), 0, 0, ' ||
                  sComilla || vch_simb_mon || sComilla || ', 1, 0, 0, 0' ||
                  ' FROM ' || vvc_tablaTN || ' tns, trabajadores_grales tg' ||
                  ' WHERE tns.compania = tg.compania' ||
                  ' AND tns.trabajador = tg.trabajador' ||
                  ' AND tg.forma_pago = 3' ||
                  ' AND tns.importe > 0' ||
                  ' AND tns.sit_transaccion = 2' ||
                  ' AND tns.compania = ' || sComilla || cch_compania || sComilla ||
                  ' AND tns.clase_nomina = ' || sComilla || cch_clase_nom || sComilla ||
                  ' AND tns.id_calendario = ' || cnu_id_cal ||
                  ' AND tns.concepto IN ( ' || vnu_concepto1 || ',' || vnu_concepto2 || ',' || vnu_concepto3 || ',' ||
                  vnu_concepto4 || ',' || vnu_concepto5 || ')' ||
                  ' GROUP BY tns.trabajador, tns.compania, tns.clase_nomina, tns.id_calendario';                  
      BEGIN
          vin_id_cursor := dbms_sql.open_cursor;
          dbms_sql.parse(vin_id_cursor, vvc_sql, dbms_sql.v7);
          vin_rows := dbms_sql.execute(vin_id_cursor);
          dbms_sql.close_cursor(vin_id_cursor);
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de la trans o transacciones_ns');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT MAX(a.cuenta_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(b.cod_banco)
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania 
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal )
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(a.institucion_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND clase_nomina = cch_clase_nom
            AND id_calendario = cnu_id_cal
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania                                
                             AND c.clase_nomina = cch_clase_nom
                             AND c.id_calendario = cnu_id_cal);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2
            
      --Actualizar el tipo de documento *** cambiar de acuerdo al cliente ***
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_doc = 
             (SELECT DECODE (TRIM(a.dato), '01', '02',
                   '02', '04',
                   '04', '01',
                   '05', '03')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_id
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_cuenta = 
             (SELECT DECODE (TRIM(a.dato), '1', '0200', '0100')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_cta
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             

  --hallando la maxima compañia que esta en ri_procesar
  BEGIN
    SELECT MAX(compania)
    INTO cch_compania 
    FROM ri_procesar
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario;
    EXCEPTION
      WHEN OTHERS THEN cch_compania := '';
  END;

  -- Trayendo al informacion del banco      
  OPEN c_info_banco(cch_compania, pti_banco);
  FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
  vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
  CLOSE c_info_banco;
      
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 2,
    LPAD(SUBSTR(LTRIM(tns.tipo_doc), 1, 2), 2, '01' ) || -- TIPO ID BENEFICIARIO  
    LPAD(SUBSTR(LTRIM(t.clave_unica), 1, 15), 15, '0' ) ||  -- Nº ID BENEFICIARIO  
    '0' || -- DIGITO CONTROL Nº ID BENEFICIARIO  
    '1' || -- FORMA PAGO  
    '0013' || -- BANCO RECEPTOR
    '0' || LPAD(SUBSTR(tns.cuenta_dep, 1, 3), 3, '0') || -- OFICINA/PLAZA
    LPAD(SUBSTR(LTRIM(tns.tipo_cuenta), 1, 4), 4, '0200' ) || -- TIPO CUENTA  
    LPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 4, 6), 6, '0' ) || -- CUENTA BBVA  
    '00' || -- TIPO CUENTA NACHA  
    RPAD('0', 17, '0') || -- CUENTA NACHA
    RPAD(REPLACE(LTRIM(RTRIM(t.nombre)), '/' , ' '), 36, ' ' ) || -- NOMBRE BENEFICIARIO  
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 13, '0'), 15, '0') || --IMPORTE
    RPAD(' ', 36, ' ') || -- DIRECCION  
    RPAD(' ', 18, ' ') || -- TELEFONO  
    RPAD('0', 8, '0') || --FECHA LIMITE DE PAGO  
    RPAD('PAGO DE NOMINA', 40, ' ') -- CONCEPTO PAGO      
    FROM fdt_bancos_tmp tns, trabajadores t
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;
  
  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');
------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');
  
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;
  
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                
    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep
  
    COMMIT;

  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_ganadero FOR ADAM.sp_fco_gen_bco_ganadero;
GRANT EXECUTE ON sp_fco_gen_bco_ganadero TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_ganadero_ni
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por ganadero para NI                    ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Mayo 21/2005                                          ***/
/********************************************************************/
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

vch_agr_id    char(10);
vch_agr_cta   char(10);

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_liq_procesar.id_rep%TYPE,
 avc_usuario ri_liq_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT compania
 FROM ri_liq_procesar
 WHERE id_rep = asi_id_rep
 AND usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);
  
  --cambiar de acuerdo a la agrupacion que maneja cada cliente
  vch_agr_id := 'TIPO_DOCU';
  vch_agr_cta := 'TIPO_CUENT';
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   

      BEGIN
        INSERT INTO fdt_bancos_tmp (id_rep, usuariow, compania, numero_liquidacion, trabajador, importe,cuenta_dep, 
        simbolo_mon, tipo, tipo_cuenta, tipo_doc)      
        SELECT psi_id_rep, pvc_usuario, ld.compania, ld.numero_liquidacion,
        ld.trabajador, ld.importe, '0', vch_simb_mon, 1, '0', '0'
        FROM liquidaciones_det ld, ri_liq_procesar lp
        WHERE ld.compania = lp.compania
        AND ld.tipo_nomina = lp.tipo_nomina
        AND ld.numero_liquidacion = lp.numero_liquidacion
        AND ld.trabajador = lp.trabajador
        AND ld.compania = cch_compania
        AND ld.concepto IN (vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5)
        AND ld.importe > 0
        AND ld.sit_transaccion = 2
        AND lp.id_rep = psi_id_rep
        AND lp.usuariow = pvc_usuario;            
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de liquidaciones_det');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT a.cuenta_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT b.cod_banco 
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT a.institucion_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9 - update a la tabla');
      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2

      --Actualizar el tipo de documento *** cambiar de acuerdo al cliente ***
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_doc = 
             (SELECT DECODE (TRIM(a.dato), '01', '02',
                   '02', '04',
                   '04', '01',
                   '05', '03')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_id
              AND c.compania = cch_compania
              AND c.id_rep = psi_id_rep
              AND c.usuariow = pvc_usuario)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_cuenta = 
             (SELECT DECODE (TRIM(a.dato), '1', '0200', '0100')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_cta
              AND c.compania = cch_compania
              AND c.id_rep = psi_id_rep
              AND c.usuariow = pvc_usuario)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
            
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             

  --hallando la maxima compañia que esta en ri_liq_procesar
  BEGIN
    SELECT MAX(compania)
    INTO cch_compania 
    FROM ri_liq_procesar
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario;
    EXCEPTION
      WHEN OTHERS THEN cch_compania := '';
  END;

  -- Trayendo al informacion del banco      
  OPEN c_info_banco(cch_compania, pti_banco);
  FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
  vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
  CLOSE c_info_banco;
      
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 2,
    LPAD(SUBSTR(LTRIM(tns.tipo_doc), 1, 2), 2, '01' ) || -- TIPO ID BENEFICIARIO  
    LPAD(SUBSTR(LTRIM(t.clave_unica), 1, 15), 15, '0' ) ||  -- Nº ID BENEFICIARIO  
    '0' || -- DIGITO CONTROL Nº ID BENEFICIARIO  
    '1' || -- FORMA PAGO  
    '0013' || -- BANCO RECEPTOR
    '0' || LPAD(SUBSTR(tns.cuenta_dep, 1, 3), 3, '0') || -- OFICINA/PLAZA
    LPAD(SUBSTR(LTRIM(tns.tipo_cuenta), 1, 4), 4, '0200' ) || -- TIPO CUENTA  
    LPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 4, 6), 6, '0' ) || -- CUENTA BBVA  
    '00' || -- TIPO CUENTA NACHA  
    RPAD('0', 17, '0') || -- CUENTA NACHA
    RPAD(REPLACE(LTRIM(RTRIM(t.nombre)), '/' , ' '), 36, ' ' ) || -- NOMBRE BENEFICIARIO  
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 13, '0'), 15, '0') || --IMPORTE
    RPAD(' ', 36, ' ') || -- DIRECCION  
    RPAD(' ', 18, ' ') || -- TELEFONO  
    RPAD('0', 8, '0') || --FECHA LIMITE DE PAGO  
    RPAD('PAGO DE NOMINA', 40, ' ') -- CONCEPTO PAGO      
    FROM fdt_bancos_tmp tns, trabajadores t
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;

  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');

------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');
    
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;
  
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                

    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep
  
  COMMIT;         

  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_ganadero_ni FOR ADAM.sp_fco_gen_bco_ganadero_ni;
GRANT EXECUTE ON sp_fco_gen_bco_ganadero_ni TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_granahorrar
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por granahorrar                         ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Mayo 21/2005                                          ***/
/********************************************************************/
vvc_tablaTN   varchar2(20);
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar el estado del periodo
-------------------------------------------------
CURSOR c_ti_sit(
 ach_compania	companias.Compania%TYPE,
 asi_id_cal	calendario_procesos.id_calendario%TYPE
) IS
  SELECT
    sit_periodo
  FROM
    cal_proc_cias
  WHERE
    compania = ach_compania And
    id_calendario = asi_id_cal;
-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_procesar.id_rep%TYPE,
 avc_usuario ri_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT c.compania, c.clase_nomina, c.tipo_nomina, c.anio, c.periodo, a.id_calendario
 FROM calendario_procesos a, cal_proc_cias b, ri_procesar c
 WHERE a.id_calendario = b.id_calendario
 AND a.tipo_nomina = c.tipo_nomina
 AND a.anio = c.anio
 AND a.periodo = c.periodo
 AND b.compania = c.compania
 AND c.id_rep = asi_id_rep
 AND c.usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  --borramos la tabla temporal que se uso  
  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);

  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania, cch_clase_nom, cch_tipo_nom, cnu_anio, cnu_periodo, cnu_id_cal;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      --  Verificar el estado del periodo
      OPEN c_ti_sit(cch_compania, cnu_id_cal);
      FETCH c_ti_sit INTO vti_sit;
      CLOSE c_ti_sit;
      --  Asignar la tabla de acuerdo al estado del periodo
      IF vti_sit = 2 THEN
        vvc_tablaTN := UPPER('trans_'||RTRIM(cch_compania)||'_'||TO_CHAR(cnu_id_cal));
      ELSE
        vvc_tablaTN := UPPER('transacciones_ns');
      END IF;
      vvc_tablaTN := TRIM(vvc_tablaTN);
      DBMS_OUTPUT.PUT_LINE('7 - Verificar el estado del periodo');
      DBMS_OUTPUT.PUT_LINE('7A - tabla'||vvc_tablaTN);
      
      --  Verificar que la tabla existe
      OPEN c_existe_tabla(vvc_tablaTN);
      FETCH c_existe_tabla INTO vdummy;
      IF c_existe_tabla%NOTFOUND THEN
      	RAISE no_tabla;
      END IF;
      CLOSE c_existe_tabla;
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   
            
      vvc_sql := 'INSERT INTO fdt_bancos_tmp' ||
                 ' SELECT ' ||  psi_id_rep || ', ' ||
                  sComilla || pvc_usuario || sComilla || ', ' ||
                  'tns.compania, tns.clase_nomina, tns.id_calendario, ' ||
                  'tns.trabajador, SUM(tns.importe), 0, 0, ' ||
                  sComilla || vch_simb_mon || sComilla || ', 1, 0, 0, 0' ||
                  ' FROM ' || vvc_tablaTN || ' tns, trabajadores_grales tg' ||
                  ' WHERE tns.compania = tg.compania' ||
                  ' AND tns.trabajador = tg.trabajador' ||
                  ' AND tg.forma_pago = 3' ||
                  ' AND tns.importe > 0' ||
                  ' AND tns.sit_transaccion = 2' ||
                  ' AND tns.compania = ' || sComilla || cch_compania || sComilla ||
                  ' AND tns.clase_nomina = ' || sComilla || cch_clase_nom || sComilla ||
                  ' AND tns.id_calendario = ' || cnu_id_cal ||
                  ' AND tns.concepto IN ( ' || vnu_concepto1 || ',' || vnu_concepto2 || ',' || vnu_concepto3 || ',' ||
                  vnu_concepto4 || ',' || vnu_concepto5 || ')' ||
                  ' GROUP BY tns.trabajador, tns.compania, tns.clase_nomina, tns.id_calendario';                  
      BEGIN
          vin_id_cursor := dbms_sql.open_cursor;
          dbms_sql.parse(vin_id_cursor, vvc_sql, dbms_sql.v7);
          vin_rows := dbms_sql.execute(vin_id_cursor);
          dbms_sql.close_cursor(vin_id_cursor);
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de la trans o transacciones_ns');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT MAX(a.cuenta_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(b.cod_banco)
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania 
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal )
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(a.institucion_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND clase_nomina = cch_clase_nom
            AND id_calendario = cnu_id_cal
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania                                
                             AND c.clase_nomina = cch_clase_nom
                             AND c.id_calendario = cnu_id_cal);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2
                  
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             

  --hallando la maxima compañia que esta en ri_procesar
  BEGIN
    SELECT MAX(compania)
    INTO cch_compania 
    FROM ri_procesar
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario;
    EXCEPTION
      WHEN OTHERS THEN cch_compania := '';
  END;

  -- Trayendo al informacion del banco      
  OPEN c_info_banco(cch_compania, pti_banco);
  FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
  vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
  CLOSE c_info_banco;

  -- CONSTRUCCION DEL REGISTRO TIPO I 
  INSERT INTO
    fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
  SELECT
    psi_id_rep, pvc_usuario, pti_banco, 1, 1,
    'N0000000000' ||
    TO_CHAR(pdt_fecha, 'YYYYMMDD') ||
    '01' ||
    NVL(vvc_cuenta_bco,'0') ||
    RPAD(nombre_cia, 30, ' ') ||
    '00' ||
    LPAD(REPLACE(NVL(registro_fiscal,'0'),'-',''), 9, '0') ||
    RPAD(' ', 11, ' ') ||
    '000001'    
  FROM
    companias
  WHERE
    compania IN (SELECT DISTINCT compania FROM ri_procesar WHERE id_rep = psi_id_rep AND usuariow = pvc_usuario);
      
  -- CONSTRUCCION DE LOS REGISTROS TIPO II
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 2,
    'N32' ||
    RPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 1, 17), 17, ' ' ) ||
    RPAD(REPLACE(LTRIM(RTRIM(t.nombre)), '/' , ' '), 30, ' ' ) ||
    LPAD(SUBSTR(LTRIM(t.clave_unica), 1, 11), 11, '0' ) ||    
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 10, '0'), 12, '0') ||
    ' ' ||
    LPAD(ROWNUM, 6, '0')    
    FROM fdt_bancos_tmp tns, trabajadores t
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;
  
  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');
------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');

  -- CONSTRUCCION DEL REGISTRO TIPO III   
  INSERT INTO
    fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
  SELECT
    psi_id_rep, pvc_usuario, pti_banco, 1, 3,
    'N9999999999' ||
    LPAD(TO_CHAR(vsi_nro_trab), 6, '0') ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(vdc_total,0))), 10, '0'), 12, '0') ||
    RPAD(' ', 54, ' ') ||
    LPAD(TO_CHAR(vsi_nro_trab+2), 6, '0')
  FROM DUAL;
  
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;  
  
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                
    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep
  
    COMMIT;

  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_granahorrar FOR ADAM.sp_fco_gen_bco_granahorrar;
GRANT EXECUTE ON sp_fco_gen_bco_granahorrar TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_granahorrar_ni
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por granahorrar para NI                  ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Mayo 21/2005                                          ***/
/********************************************************************/
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_liq_procesar.id_rep%TYPE,
 avc_usuario ri_liq_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT compania
 FROM ri_liq_procesar
 WHERE id_rep = asi_id_rep
 AND usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);
    
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   

      BEGIN
        INSERT INTO fdt_bancos_tmp (id_rep, usuariow, compania, numero_liquidacion, trabajador, importe,cuenta_dep, 
        simbolo_mon, tipo, tipo_cuenta, tipo_doc)      
        SELECT psi_id_rep, pvc_usuario, ld.compania, ld.numero_liquidacion,
        ld.trabajador, ld.importe, '0', vch_simb_mon, 1, '0', '0'
        FROM liquidaciones_det ld, ri_liq_procesar lp
        WHERE ld.compania = lp.compania
        AND ld.tipo_nomina = lp.tipo_nomina
        AND ld.numero_liquidacion = lp.numero_liquidacion
        AND ld.trabajador = lp.trabajador
        AND ld.compania = cch_compania
        AND ld.concepto IN (vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5)
        AND ld.importe > 0
        AND ld.sit_transaccion = 2
        AND lp.id_rep = psi_id_rep
        AND lp.usuariow = pvc_usuario;            
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de liquidaciones_det');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT a.cuenta_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT b.cod_banco 
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT a.institucion_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9 - update a la tabla');
      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2
            
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             

  --hallando la maxima compañia que esta en ri_liq_procesar
  BEGIN
    SELECT MAX(compania)
    INTO cch_compania 
    FROM ri_liq_procesar
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario;
    EXCEPTION
      WHEN OTHERS THEN cch_compania := '';
  END;

  -- Trayendo al informacion del banco      
  OPEN c_info_banco(cch_compania, pti_banco);
  FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
  vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
  CLOSE c_info_banco;
      
  -- CONSTRUCCION DEL REGISTRO TIPO I 
  INSERT INTO
    fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
  SELECT
    psi_id_rep, pvc_usuario, pti_banco, 1, 1,
    'N0000000000' ||
    TO_CHAR(pdt_fecha, 'YYYYMMDD') ||
    '01' ||
    NVL(vvc_cuenta_bco,'0') ||
    RPAD(nombre_cia, 30, ' ') ||
    '00' ||
    LPAD(REPLACE(NVL(registro_fiscal,'0'),'-',''), 9, '0') ||
    RPAD(' ', 11, ' ') ||
    '000001'    
  FROM
    companias
  WHERE
    compania IN (SELECT DISTINCT compania FROM ri_liq_procesar WHERE id_rep = psi_id_rep AND usuariow = pvc_usuario);
      
  -- CONSTRUCCION DE LOS REGISTROS TIPO II
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 2,
    'N32' ||
    RPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 1, 17), 17, ' ' ) ||
    RPAD(REPLACE(LTRIM(RTRIM(t.nombre)), '/' , ' '), 30, ' ' ) ||
    LPAD(SUBSTR(LTRIM(t.clave_unica), 1, 11), 11, '0' ) ||    
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 10, '0'), 12, '0') ||
    ' ' ||
    LPAD(ROWNUM, 6, '0')    
    FROM fdt_bancos_tmp tns, trabajadores t
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;

  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');

------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');

  -- CONSTRUCCION DEL REGISTRO TIPO III   
  INSERT INTO
    fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
  SELECT
    psi_id_rep, pvc_usuario, pti_banco, 1, 3,
    'N9999999999' ||
    LPAD(TO_CHAR(vsi_nro_trab), 6, '0') ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(vdc_total,0))), 10, '0'), 12, '0') ||
    RPAD(' ', 54, ' ') ||
    LPAD(TO_CHAR(vsi_nro_trab+2), 6, '0')
  FROM DUAL;
    
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;
  
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                

    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep
  
  COMMIT;         

  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_granahorrar_ni FOR ADAM.sp_fco_gen_bco_granahorrar_ni;
GRANT EXECUTE ON sp_fco_gen_bco_granahorrar_ni TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_lloyds
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por Lloyds                              ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Mayo 21/2005                                          ***/
/********************************************************************/
vvc_tablaTN   varchar2(20);
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

vch_agr_id    char(10);
vch_agr_cta   char(10);

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar el estado del periodo
-------------------------------------------------
CURSOR c_ti_sit(
 ach_compania	companias.Compania%TYPE,
 asi_id_cal	calendario_procesos.id_calendario%TYPE
) IS
  SELECT
    sit_periodo
  FROM
    cal_proc_cias
  WHERE
    compania = ach_compania And
    id_calendario = asi_id_cal;
-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_procesar.id_rep%TYPE,
 avc_usuario ri_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT c.compania, c.clase_nomina, c.tipo_nomina, c.anio, c.periodo, a.id_calendario
 FROM calendario_procesos a, cal_proc_cias b, ri_procesar c
 WHERE a.id_calendario = b.id_calendario
 AND a.tipo_nomina = c.tipo_nomina
 AND a.anio = c.anio
 AND a.periodo = c.periodo
 AND b.compania = c.compania
 AND c.id_rep = asi_id_rep
 AND c.usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  --borramos la tabla temporal que se uso  
  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);

  --cambiar de acuerdo a la agrupacion que maneja cada cliente
  vch_agr_id := 'TIPO_DOCU';
  vch_agr_cta := 'TIPO_CUENT';
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania, cch_clase_nom, cch_tipo_nom, cnu_anio, cnu_periodo, cnu_id_cal;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      --  Verificar el estado del periodo
      OPEN c_ti_sit(cch_compania, cnu_id_cal);
      FETCH c_ti_sit INTO vti_sit;
      CLOSE c_ti_sit;
      --  Asignar la tabla de acuerdo al estado del periodo
      IF vti_sit = 2 THEN
        vvc_tablaTN := UPPER('trans_'||RTRIM(cch_compania)||'_'||TO_CHAR(cnu_id_cal));
      ELSE
        vvc_tablaTN := UPPER('transacciones_ns');
      END IF;
      vvc_tablaTN := TRIM(vvc_tablaTN);
      DBMS_OUTPUT.PUT_LINE('7 - Verificar el estado del periodo');
      DBMS_OUTPUT.PUT_LINE('7A - tabla'||vvc_tablaTN);
      
      --  Verificar que la tabla existe
      OPEN c_existe_tabla(vvc_tablaTN);
      FETCH c_existe_tabla INTO vdummy;
      IF c_existe_tabla%NOTFOUND THEN
      	RAISE no_tabla;
      END IF;
      CLOSE c_existe_tabla;
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   
            
      vvc_sql := 'INSERT INTO fdt_bancos_tmp' ||
                 ' SELECT ' ||  psi_id_rep || ', ' ||
                  sComilla || pvc_usuario || sComilla || ', ' ||
                  'tns.compania, tns.clase_nomina, tns.id_calendario, ' ||
                  'tns.trabajador, SUM(tns.importe), 0, 0, ' ||
                  sComilla || vch_simb_mon || sComilla || ', 1, 0, 0, 0' ||
                  ' FROM ' || vvc_tablaTN || ' tns, trabajadores_grales tg' ||
                  ' WHERE tns.compania = tg.compania' ||
                  ' AND tns.trabajador = tg.trabajador' ||
                  ' AND tg.forma_pago = 3' ||
                  ' AND tns.importe > 0' ||
                  ' AND tns.sit_transaccion = 2' ||
                  ' AND tns.compania = ' || sComilla || cch_compania || sComilla ||
                  ' AND tns.clase_nomina = ' || sComilla || cch_clase_nom || sComilla ||
                  ' AND tns.id_calendario = ' || cnu_id_cal ||
                  ' AND tns.concepto IN ( ' || vnu_concepto1 || ',' || vnu_concepto2 || ',' || vnu_concepto3 || ',' ||
                  vnu_concepto4 || ',' || vnu_concepto5 || ')' ||
                  ' GROUP BY tns.trabajador, tns.compania, tns.clase_nomina, tns.id_calendario';                  
      BEGIN
          vin_id_cursor := dbms_sql.open_cursor;
          dbms_sql.parse(vin_id_cursor, vvc_sql, dbms_sql.v7);
          vin_rows := dbms_sql.execute(vin_id_cursor);
          dbms_sql.close_cursor(vin_id_cursor);
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de la trans o transacciones_ns');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT MAX(a.cuenta_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(b.cod_banco)
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania 
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal )
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(a.institucion_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND clase_nomina = cch_clase_nom
            AND id_calendario = cnu_id_cal
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania                                
                             AND c.clase_nomina = cch_clase_nom
                             AND c.id_calendario = cnu_id_cal);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2
            
      --Actualizar el tipo de documento *** cambiar de acuerdo al cliente ***
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_doc = 
             (SELECT DECODE (TRIM(a.dato), '01', '02',
                   '02', '04',
                   '04', '01',
                   '05', '03')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_id
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_cuenta = 
             (SELECT DECODE (TRIM(a.dato), '1', '1', '2')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_cta
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             

  --hallando la maxima compañia que esta en ri_procesar
  BEGIN
    SELECT MAX(compania)
    INTO cch_compania 
    FROM ri_procesar
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario;
    EXCEPTION
      WHEN OTHERS THEN cch_compania := '';
  END;

  -- Trayendo al informacion del banco      
  OPEN c_info_banco(cch_compania, pti_banco);
  FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
  vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
  CLOSE c_info_banco;
      
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 4,
    '6' ||
    LPAD(SUBSTR(LTRIM(tns.tipo_cuenta), 1, 1), 1, '2' ) ||
    '2' ||
    '2' ||
    '010' ||
    RPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 1, 25), 25, ' ' ) ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 16, '0'), 18, '0') ||
    '000000' ||
    RPAD(SUBSTR(LTRIM(t.clave_unica), 1, 15), 15, ' ' ) ||    
    RPAD(REPLACE(LTRIM(RTRIM(t.nombre)), '/' , ' '), 22, ' ' ) ||
    ' ' ||
    RPAD('0', 11, '0') ||
    LPAD(ROWNUM+1, 7, '0') ||
    '02' ||
    RPAD('PAGO DE NOMINA', 72, ' ')        
    FROM fdt_bancos_tmp tns, trabajadores t
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;
  
  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');
------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');

  --la cabeza
  INSERT INTO
    fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
  SELECT
    psi_id_rep, pvc_usuario, pti_banco, 1, 3,
    '6' ||
    vti_tipo_cta ||
    '1' ||
    '2' ||
    '010' || 
    RPAD(NVL(vvc_cuenta_bco,'0'), 16, ' ') ||    
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(vdc_total,0))), 16, '0'), 18, '0') ||
    '000000' ||
    RPAD(REPLACE(NVL(registro_fiscal,'0'),'-',''), 15, ' ') ||    
    RPAD(nombre_cia, 22, ' ') ||    
    ' ' ||
    RPAD('0', 11, '0') ||
    '0000001' ||
    '02' ||
    RPAD('PAGO DE NOMINA', 72, ' ')            
  FROM
    companias
  WHERE
    compania IN (SELECT DISTINCT compania FROM ri_procesar WHERE id_rep = psi_id_rep AND usuariow = pvc_usuario);

  -- Construcción de registro control de lote de transferencias
  INSERT INTO
    fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
  SELECT
    psi_id_rep, pvc_usuario, pti_banco, 1, 2,
    '5' ||
    RPAD(nombre_cia, 16, ' ') ||    
    LPAD(NVL(vvc_cuenta_bco,'0'), 10, '0') ||
    'NOMINA    ' ||
    RPAD(REPLACE(NVL(registro_fiscal,'0'),'-',''), 10, ' ') ||
    'PANOMINA  ' ||
    TO_CHAR(pdt_fecha, 'YYYYMMDD') ||
    '0000001' ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(vdc_total,0))), 16, '0'), 18, '0') ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(vdc_total,0))), 16, '0'), 18, '0') ||
    '00' ||
    '01' ||
    RPAD(' ', 88, ' ')    
  FROM
    companias
  WHERE
    compania IN (SELECT DISTINCT compania FROM ri_procesar WHERE id_rep = psi_id_rep AND usuariow = pvc_usuario);

  --Construcción de registro control de archivo
  INSERT INTO
    fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
  SELECT
    psi_id_rep, pvc_usuario, pti_banco, 1, 1,
    ' 005600104' ||
    RPAD(REPLACE(NVL(registro_fiscal,'0'),'-',''), 10, ' ') ||
    TO_CHAR(pdt_fecha, 'YYYYMMDD') ||
    '00' || --hora
    '00' || --minutos
    'A' ||
    RPAD(nombre_cia, 23, ' ') ||    
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(vdc_total,0))), 16, '0'), 18, '0') ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(vdc_total,0))), 16, '0'), 18, '0') ||
    RPAD('0', 18, '0') ||
    RPAD(' ', 89, ' ')    
  FROM
    companias
  WHERE
    compania IN (SELECT DISTINCT compania FROM ri_procesar WHERE id_rep = psi_id_rep AND usuariow = pvc_usuario);
    
          
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;
    
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                
    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep
  
    COMMIT;

  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_lloyds FOR ADAM.sp_fco_gen_bco_lloyds;
GRANT EXECUTE ON sp_fco_gen_bco_lloyds TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_lloyds_ni
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por lloyds para NI                      ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Mayo 21/2005                                          ***/
/********************************************************************/
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

vch_agr_id    char(10);
vch_agr_cta   char(10);

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_liq_procesar.id_rep%TYPE,
 avc_usuario ri_liq_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT compania
 FROM ri_liq_procesar
 WHERE id_rep = asi_id_rep
 AND usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);
  
  --cambiar de acuerdo a la agrupacion que maneja cada cliente
  vch_agr_id := 'TIPO_DOCU';
  vch_agr_cta := 'TIPO_CUENT';
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   

      BEGIN
        INSERT INTO fdt_bancos_tmp (id_rep, usuariow, compania, numero_liquidacion, trabajador, importe,cuenta_dep, 
        simbolo_mon, tipo, tipo_cuenta, tipo_doc)      
        SELECT psi_id_rep, pvc_usuario, ld.compania, ld.numero_liquidacion,
        ld.trabajador, ld.importe, '0', vch_simb_mon, 1, '0', '0'
        FROM liquidaciones_det ld, ri_liq_procesar lp
        WHERE ld.compania = lp.compania
        AND ld.tipo_nomina = lp.tipo_nomina
        AND ld.numero_liquidacion = lp.numero_liquidacion
        AND ld.trabajador = lp.trabajador
        AND ld.compania = cch_compania
        AND ld.concepto IN (vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5)
        AND ld.importe > 0
        AND ld.sit_transaccion = 2
        AND lp.id_rep = psi_id_rep
        AND lp.usuariow = pvc_usuario;            
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de liquidaciones_det');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT a.cuenta_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT b.cod_banco 
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT a.institucion_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9 - update a la tabla');
      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2

      --Actualizar el tipo de documento *** cambiar de acuerdo al cliente ***
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_doc = 
             (SELECT DECODE (TRIM(a.dato), '01', '02',
                   '02', '04',
                   '04', '01',
                   '05', '03')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_id
              AND c.compania = cch_compania
              AND c.id_rep = psi_id_rep
              AND c.usuariow = pvc_usuario)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_cuenta = 
             (SELECT DECODE (TRIM(a.dato), '1', '1', '2')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_cta
              AND c.compania = cch_compania
              AND c.id_rep = psi_id_rep
              AND c.usuariow = pvc_usuario)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
            
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             

  --hallando la maxima compañia que esta en ri_liq_procesar
  BEGIN
    SELECT MAX(compania)
    INTO cch_compania 
    FROM ri_liq_procesar
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario;
    EXCEPTION
      WHEN OTHERS THEN cch_compania := '';
  END;

  -- Trayendo al informacion del banco      
  OPEN c_info_banco(cch_compania, pti_banco);
  FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
  vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
  CLOSE c_info_banco;
      
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 4,
    '6' ||
    LPAD(SUBSTR(LTRIM(tns.tipo_cuenta), 1, 1), 1, '2' ) ||
    '2' ||
    '2' ||
    '010' ||
    RPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 1, 25), 25, ' ' ) ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 16, '0'), 18, '0') ||
    '000000' ||
    RPAD(SUBSTR(LTRIM(t.clave_unica), 1, 15), 15, ' ' ) ||    
    RPAD(REPLACE(LTRIM(RTRIM(t.nombre)), '/' , ' '), 22, ' ' ) ||
    ' ' ||
    RPAD('0', 11, '0') ||
    LPAD(ROWNUM+1, 7, '0') ||
    '02' ||
    RPAD('PAGO DE NOMINA', 72, ' ')        
    FROM fdt_bancos_tmp tns, trabajadores t
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;

  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');

------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');

  --la cabeza
  INSERT INTO
    fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
  SELECT
    psi_id_rep, pvc_usuario, pti_banco, 1, 3,
    '6' ||
    vti_tipo_cta ||
    '1' ||
    '2' ||
    '010' || 
    RPAD(NVL(vvc_cuenta_bco,'0'), 16, ' ') ||    
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(vdc_total,0))), 16, '0'), 18, '0') ||
    '000000' ||
    RPAD(REPLACE(NVL(registro_fiscal,'0'),'-',''), 15, ' ') ||    
    RPAD(nombre_cia, 22, ' ') ||    
    ' ' ||
    RPAD('0', 11, '0') ||
    '0000001' ||
    '02' ||
    RPAD('PAGO DE NOMINA', 72, ' ')            
  FROM
    companias
  WHERE
    compania IN (SELECT DISTINCT compania FROM ri_liq_procesar WHERE id_rep = psi_id_rep AND usuariow = pvc_usuario);

  -- Construcción de registro control de lote de transferencias
  INSERT INTO
    fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
  SELECT
    psi_id_rep, pvc_usuario, pti_banco, 1, 2,
    '5' ||
    RPAD(nombre_cia, 16, ' ') ||    
    LPAD(NVL(vvc_cuenta_bco,'0'), 10, '0') ||
    'NOMINA    ' ||
    RPAD(REPLACE(NVL(registro_fiscal,'0'),'-',''), 10, ' ') ||
    'PANOMINA  ' ||
    TO_CHAR(pdt_fecha, 'YYYYMMDD') ||
    '0000001' ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(vdc_total,0))), 16, '0'), 18, '0') ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(vdc_total,0))), 16, '0'), 18, '0') ||
    '00' ||
    '01' ||
    RPAD(' ', 88, ' ')    
  FROM
    companias
  WHERE
    compania IN (SELECT DISTINCT compania FROM ri_liq_procesar WHERE id_rep = psi_id_rep AND usuariow = pvc_usuario);

  --Construcción de registro control de archivo
  INSERT INTO
    fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
  SELECT
    psi_id_rep, pvc_usuario, pti_banco, 1, 1,
    ' 005600104' ||
    RPAD(REPLACE(NVL(registro_fiscal,'0'),'-',''), 10, ' ') ||
    TO_CHAR(pdt_fecha, 'YYYYMMDD') ||
    '00' || --hora
    '00' || --minutos
    'A' ||
    RPAD(nombre_cia, 23, ' ') ||    
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(vdc_total,0))), 16, '0'), 18, '0') ||
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(vdc_total,0))), 16, '0'), 18, '0') ||
    RPAD('0', 18, '0') ||
    RPAD(' ', 89, ' ')    
  FROM
    companias
  WHERE
    compania IN (SELECT DISTINCT compania FROM ri_liq_procesar WHERE id_rep = psi_id_rep AND usuariow = pvc_usuario);
    
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;

  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                

    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep
  
  COMMIT;         

  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_lloyds_ni FOR ADAM.sp_fco_gen_bco_lloyds_ni;
GRANT EXECUTE ON sp_fco_gen_bco_lloyds_ni TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_santander
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por ACH Santander                       ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Mayo 21/2005                                          ***/
/********************************************************************/
vvc_tablaTN   varchar2(20);
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

vch_agr_id    char(10);
vch_agr_cta   char(10);

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar el estado del periodo
-------------------------------------------------
CURSOR c_ti_sit(
 ach_compania	companias.Compania%TYPE,
 asi_id_cal	calendario_procesos.id_calendario%TYPE
) IS
  SELECT
    sit_periodo
  FROM
    cal_proc_cias
  WHERE
    compania = ach_compania And
    id_calendario = asi_id_cal;
-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_procesar.id_rep%TYPE,
 avc_usuario ri_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT c.compania, c.clase_nomina, c.tipo_nomina, c.anio, c.periodo, a.id_calendario
 FROM calendario_procesos a, cal_proc_cias b, ri_procesar c
 WHERE a.id_calendario = b.id_calendario
 AND a.tipo_nomina = c.tipo_nomina
 AND a.anio = c.anio
 AND a.periodo = c.periodo
 AND b.compania = c.compania
 AND c.id_rep = asi_id_rep
 AND c.usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  --borramos la tabla temporal que se uso  
  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);

  --cambiar de acuerdo a la agrupacion que maneja cada cliente
  vch_agr_id := 'TIPO_DOCU';
  vch_agr_cta := 'TIPO_CUENT';
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania, cch_clase_nom, cch_tipo_nom, cnu_anio, cnu_periodo, cnu_id_cal;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      --  Verificar el estado del periodo
      OPEN c_ti_sit(cch_compania, cnu_id_cal);
      FETCH c_ti_sit INTO vti_sit;
      CLOSE c_ti_sit;
      --  Asignar la tabla de acuerdo al estado del periodo
      IF vti_sit = 2 THEN
        vvc_tablaTN := UPPER('trans_'||RTRIM(cch_compania)||'_'||TO_CHAR(cnu_id_cal));
      ELSE
        vvc_tablaTN := UPPER('transacciones_ns');
      END IF;
      vvc_tablaTN := TRIM(vvc_tablaTN);
      DBMS_OUTPUT.PUT_LINE('7 - Verificar el estado del periodo');
      DBMS_OUTPUT.PUT_LINE('7A - tabla'||vvc_tablaTN);
      
      --  Verificar que la tabla existe
      OPEN c_existe_tabla(vvc_tablaTN);
      FETCH c_existe_tabla INTO vdummy;
      IF c_existe_tabla%NOTFOUND THEN
      	RAISE no_tabla;
      END IF;
      CLOSE c_existe_tabla;
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   
            
      vvc_sql := 'INSERT INTO fdt_bancos_tmp' ||
                 ' SELECT ' ||  psi_id_rep || ', ' ||
                  sComilla || pvc_usuario || sComilla || ', ' ||
                  'tns.compania, tns.clase_nomina, tns.id_calendario, ' ||
                  'tns.trabajador, SUM(tns.importe), 0, 0, ' ||
                  sComilla || vch_simb_mon || sComilla || ', 1, 0, 0, 0' ||
                  ' FROM ' || vvc_tablaTN || ' tns, trabajadores_grales tg' ||
                  ' WHERE tns.compania = tg.compania' ||
                  ' AND tns.trabajador = tg.trabajador' ||
                  ' AND tg.forma_pago = 3' ||
                  ' AND tns.importe > 0' ||
                  ' AND tns.sit_transaccion = 2' ||
                  ' AND tns.compania = ' || sComilla || cch_compania || sComilla ||
                  ' AND tns.clase_nomina = ' || sComilla || cch_clase_nom || sComilla ||
                  ' AND tns.id_calendario = ' || cnu_id_cal ||
                  ' AND tns.concepto IN ( ' || vnu_concepto1 || ',' || vnu_concepto2 || ',' || vnu_concepto3 || ',' ||
                  vnu_concepto4 || ',' || vnu_concepto5 || ')' ||
                  ' GROUP BY tns.trabajador, tns.compania, tns.clase_nomina, tns.id_calendario';                  
      BEGIN
          vin_id_cursor := dbms_sql.open_cursor;
          dbms_sql.parse(vin_id_cursor, vvc_sql, dbms_sql.v7);
          vin_rows := dbms_sql.execute(vin_id_cursor);
          dbms_sql.close_cursor(vin_id_cursor);
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de la trans o transacciones_ns');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT MAX(a.cuenta_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(b.cod_banco)
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania 
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal )
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT MAX(a.institucion_deposito)
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND clase_nomina = cch_clase_nom
            AND id_calendario = cnu_id_cal
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania                                
                             AND c.clase_nomina = cch_clase_nom
                             AND c.id_calendario = cnu_id_cal);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2
            
      --Actualizar el tipo de documento *** cambiar de acuerdo al cliente ***
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_doc = 
             (SELECT DECODE (TRIM(a.dato), 'CC', '01',
                   'CE', '02',
                   'NIT', '03',
                   'TI', '04')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_id
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_cuenta = 
             (SELECT DECODE (TRIM(a.dato), '1', '1', '2')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_cta
              AND c.compania = cch_compania
              AND c.clase_nomina = cch_clase_nom
              AND c.id_calendario = cnu_id_cal)
         WHERE compania = cch_compania 
         AND clase_nomina = cch_clase_nom
         AND id_calendario = cnu_id_cal
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             

  --hallando la maxima compañia que esta en ri_procesar
  BEGIN
    SELECT MAX(compania)
    INTO cch_compania 
    FROM ri_procesar
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario;
    EXCEPTION
      WHEN OTHERS THEN cch_compania := '';
  END;

  -- Trayendo al informacion del banco      
  OPEN c_info_banco(cch_compania, pti_banco);
  FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
  vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
  CLOSE c_info_banco;
      
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 2,
    LPAD(SUBSTR(LTRIM(t.clave_unica), 1, 15), 15, '0' ) || --Identificacion
    RPAD(REPLACE(LTRIM(RTRIM(t.nombre)), '/' , ' '), 22, ' ' ) || -- NOMBRE BENEFICIARIO  
    RPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 1, 17), 17, ' ' ) || -- cuenta
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 13, '0'), 15, '0') || --valor
    RPAD('PAGO DE NOMINA', 80, ' ') || 
    RPAD(SUBSTR(LTRIM(tns.tipo_doc), 1, 2), 2, '01' ) || --Codigo de identificacion del destinatario
    LPAD(SUBSTR(LTRIM(tns.tipo_cuenta), 1, 1), 1, '1' ) || -- Tipo de Cuenta  1. Ahorros, 2 Corriente   
    RPAD(SUBSTR(LTRIM(tns.ins_dep),1, 4), 4, '0') || --codigo del banco
    '0001' ||
    '1'    
    FROM fdt_bancos_tmp tns, trabajadores t
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;
  
  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');
------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');
  
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;
  
  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                
    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep

    COMMIT;
  
  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_santander FOR ADAM.sp_fco_gen_bco_santander;
GRANT EXECUTE ON sp_fco_gen_bco_santander TO adama;
CREATE OR REPLACE PROCEDURE sp_fco_gen_bco_santander_ni
(
  psi_id_rep 	smallint,
  pvc_usuario	varchar2,
  pti_banco number,
  pdt_fecha date DEFAULT NULL,
  pvc_responsable  varchar2 DEFAULT '',
  pti_filtra_cta number DEFAULT 0  --0: no filtra, 1: si filtra 
)
IS
/********************************************************************/
/*** Módulo Fiscal de Colombia - Medios Magneticos para Bancos    ***/
/*** Formato: Transmision por santander para NI                   ***/
/*** Autor:	Diana Cecilia Rios Peinado                            ***/
/*** Fecha:	Mayo 21/2005                                          ***/
/********************************************************************/
vdummy        varchar2(30) := NULL;
vbl_existe    boolean;
vnu_existe    number(1);
vvc_sql       varchar2(2000);
vin_id_cursor integer;
vin_rows      integer;
vti_sit       cal_proc_cias.sit_periodo%TYPE;
sComilla      char(1);
vdt_fecha_hoy	date;

cch_compania  char(4);
cch_clase_nom char(2);
cch_tipo_nom  char(2);
cnu_anio      number(5);
cnu_periodo   number(3);
cnu_id_cal    number(5);

vnu_concepto1 number(5);
vnu_concepto2 number(5);
vnu_concepto3 number(5);
vnu_concepto4 number(5);
vnu_concepto5 number(5);
vch_simb_mon  char(5);
vti_tipo_cta  number(1);
vvc_cuenta_bco  varchar2(30);
vvc_oficina_cta varchar2(15);
vvc_registro_fiscal varchar2(20);
vnu_reporte   number(1);

vdc_total     number(19,6);
vsi_nro_trab  integer;

vch_agr_id    char(10);
vch_agr_cta   char(10);

no_id_calendario	  EXCEPTION;
no_tabla		        EXCEPTION;
ins_tabla           EXCEPTION;
upd_tabla           EXCEPTION;
del_tabla           EXCEPTION;
ins_tabla_mm        EXCEPTION;
ins_tabla_rep       EXCEPTION;

-------------------------------------------------
--    Cursor para Verificar existencia de tabla
-------------------------------------------------
CURSOR c_existe_tabla(
 atable_name	user_tables.table_name%TYPE
) IS
/*  SELECT
    'X'
  FROM
    USER_TABLES
  WHERE
    Table_Name = atable_name;*/    
  SELECT 'X'
  FROM 
      all_objects
  WHERE 
      object_name = UPPER(atable_name) And 
      object_type = 'TABLE';

-------------------------------------------------
--    Cursor para traer informacion de los bancos
-------------------------------------------------
CURSOR c_info_banco(
  ach_compania companias.compania%TYPE,
  anu_banco fdt_bancos.banco%TYPE
)IS
 SELECT b.concepto1, b.concepto2, b.concepto3, b.concepto4, b.concepto5,
 b.simbolo_moneda, b.tipo_cta, b.cuenta, b.oficina_cta, b.registro_fiscal
 FROM fdt_bancos a, fdt_bancos_cias_datos b
 WHERE a.banco = b.banco AND
 b.compania = ach_compania AND
 a.banco = anu_banco;
 
-------------------------------------------------
--    Cursor para traer los registros a procesar
-------------------------------------------------
CURSOR c_reg_procesa(
 asi_id_rep ri_liq_procesar.id_rep%TYPE,
 avc_usuario ri_liq_procesar.usuariow%TYPE
)IS
 SELECT DISTINCT compania
 FROM ri_liq_procesar
 WHERE id_rep = asi_id_rep
 AND usuariow = avc_usuario;
     
BEGIN
--borrando la informacion 
	DELETE fdt_bancos_mm
	WHERE id_rep = psi_id_rep AND
	usuariow = pvc_usuario AND
	banco = pti_banco;  

  DELETE fdt_bancos_tmp
  WHERE id_rep = psi_id_rep
  AND usuariow = pvc_usuario;    
  
--  Fecha Actual
	vdt_fecha_hoy := sysdate;
  sComilla := chr(39);
  
  --cambiar de acuerdo a la agrupacion que maneja cada cliente
  vch_agr_id := 'TIPO_DOCU';
  vch_agr_cta := 'TIPO_CUENT';
  
-- Recorriendo el cursor de los registros a procesar.
  OPEN c_reg_procesa(psi_id_rep, pvc_usuario);  
	LOOP--L1  
  FETCH c_reg_procesa INTO cch_compania;
  EXIT WHEN c_reg_procesa%NOTFOUND;
	BEGIN--B1
      -- Trayendo al informacion del banco      
      OPEN c_info_banco(cch_compania, pti_banco);
      FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
      vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
      CLOSE c_info_banco;
      --Insertando en la tabla temporal los trabajadores
      vnu_concepto1 := NVL(vnu_concepto1,0);
      vnu_concepto2 := NVL(vnu_concepto2,0);
      vnu_concepto3 := NVL(vnu_concepto3,0);
      vnu_concepto4 := NVL(vnu_concepto4,0);
      vnu_concepto5 := NVL(vnu_concepto5,0);   

      BEGIN
        INSERT INTO fdt_bancos_tmp (id_rep, usuariow, compania, numero_liquidacion, trabajador, importe,cuenta_dep, 
        simbolo_mon, tipo, tipo_cuenta, tipo_doc)      
        SELECT psi_id_rep, pvc_usuario, ld.compania, ld.numero_liquidacion,
        ld.trabajador, ld.importe, '0', vch_simb_mon, 1, '0', '0'
        FROM liquidaciones_det ld, ri_liq_procesar lp
        WHERE ld.compania = lp.compania
        AND ld.tipo_nomina = lp.tipo_nomina
        AND ld.numero_liquidacion = lp.numero_liquidacion
        AND ld.trabajador = lp.trabajador
        AND ld.compania = cch_compania
        AND ld.concepto IN (vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5)
        AND ld.importe > 0
        AND ld.sit_transaccion = 2
        AND lp.id_rep = psi_id_rep
        AND lp.usuariow = pvc_usuario;            
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla;
      END;

      DBMS_OUTPUT.PUT_LINE('8 - insersion en la tabla de liquidaciones_det');                    
      --actualizamos los que tienen cuenta de deposito
      BEGIN    
--sin importar de que banco sea, se debe traer la cuenta del trabajador
        UPDATE fdt_bancos_tmp c
        SET cuenta_dep =
             (SELECT a.cuenta_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9A - update a la tabla');
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT b.cod_banco 
              FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b 
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1
              AND a.institucion_deposito = b.ins_dep
              AND b.banco = pti_banco
              AND c.compania = cch_compania)
         WHERE compania = cch_compania          
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;

DBMS_OUTPUT.PUT_LINE('9B - update a la tabla');

--si por casualidad ins_dep queda en cero, buscar la info de rel_trab_ins_dep
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET ins_dep = 
             (SELECT a.institucion_deposito
              FROM rel_trab_ins_dep a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.ins_dep_principal = 1 
              AND c.compania = cch_compania)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario
         AND c.ins_dep = '0';         
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      DBMS_OUTPUT.PUT_LINE('9 - update a la tabla');
      
      --si viene la opcion de filtrar unicamente los trabajadores que tengan cuenta en las ins dep parametrizadas
      IF pti_filtra_cta = 1 THEN--2
        BEGIN   
            DELETE fdt_bancos_tmp c
            WHERE compania = cch_compania
            AND id_rep = psi_id_rep
            AND usuariow = pvc_usuario
            AND NOT EXISTS (SELECT 1 FROM rel_trab_ins_dep a, fdt_bancos_ins_dep b
                            WHERE a.institucion_deposito = b.ins_dep
                             AND a.compania = c.compania
                             AND a.trabajador = c.trabajador
                             AND b.banco = pti_banco
                             AND c.compania = cch_compania);
        EXCEPTION
            WHEN OTHERS THEN
                RAISE del_tabla;
        END;

      DBMS_OUTPUT.PUT_LINE('10 - delete a la tabla');
      END IF;--2

      --Actualizar el tipo de documento *** cambiar de acuerdo al cliente ***
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_doc = 
             (SELECT DECODE (TRIM(a.dato), 'CC', '01',
                   'CE', '02',
                   'NIT', '03',
                   'TI', '04')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_id
              AND c.compania = cch_compania
              AND c.id_rep = psi_id_rep
              AND c.usuariow = pvc_usuario)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
      
      BEGIN    
        UPDATE fdt_bancos_tmp c
        SET tipo_cuenta = 
             (SELECT DECODE (TRIM(a.dato), '1', '1', '2')
              FROM rel_trab_agr a
              WHERE a.compania = c.compania
              AND a.trabajador = c.trabajador
              AND a.agrupacion = vch_agr_cta
              AND c.compania = cch_compania
              AND c.id_rep = psi_id_rep
              AND c.usuariow = pvc_usuario)
         WHERE compania = cch_compania
         AND id_rep = psi_id_rep
         AND usuariow = pvc_usuario;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE upd_tabla;
      END;
            
  END;--B1  
  END LOOP;--L1
  CLOSE c_reg_procesa;  
  --Finalizado el cursor, se debe agrupar por una sola cuenta por trabajador, los registros de los varios
  --tipos de nomina seleccionados
  BEGIN
    INSERT INTO fdt_bancos_tmp(id_rep, usuariow, trabajador, importe, ins_dep, cuenta_dep, simbolo_mon, tipo,
    tipo_cuenta, tipo_doc)
    SELECT tn.id_rep, tn.usuariow, tn.trabajador, SUM(tn.importe), tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, 2,
    tn.tipo_cuenta, tn.tipo_doc
    FROM fdt_bancos_tmp tn
    WHERE tn.id_rep = psi_id_rep
    AND tn.usuariow = pvc_usuario
    AND tn.tipo = 1
    GROUP BY tn.id_rep, tn.usuariow, tn.trabajador, tn.ins_dep, tn.cuenta_dep, tn.simbolo_mon, tn.tipo_cuenta, tn.tipo_doc;
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla;
  END;

  DBMS_OUTPUT.PUT_LINE('12 - Insert a la tabla ya agrupado');             

  --hallando la maxima compañia que esta en ri_liq_procesar
  BEGIN
    SELECT MAX(compania)
    INTO cch_compania 
    FROM ri_liq_procesar
    WHERE id_rep = psi_id_rep
    AND usuariow = pvc_usuario;
    EXCEPTION
      WHEN OTHERS THEN cch_compania := '';
  END;

  -- Trayendo al informacion del banco      
  OPEN c_info_banco(cch_compania, pti_banco);
  FETCH c_info_banco INTO vnu_concepto1, vnu_concepto2, vnu_concepto3, vnu_concepto4, vnu_concepto5, vch_simb_mon, vti_tipo_cta,
  vvc_cuenta_bco, vvc_oficina_cta, vvc_registro_fiscal;
  CLOSE c_info_banco;
      
  --Ahora el detalle
  BEGIN
    INSERT INTO fdt_bancos_mm(id_rep, usuariow, banco, sec_archivo, secuencia, registros)
    SELECT psi_id_rep, pvc_usuario, pti_banco, 1, 2,
    LPAD(SUBSTR(LTRIM(t.clave_unica), 1, 15), 15, '0' ) || --Identificacion
    RPAD(REPLACE(LTRIM(RTRIM(t.nombre)), '/' , ' '), 22, ' ' ) || -- NOMBRE BENEFICIARIO  
    RPAD(SUBSTR(NVL(tns.cuenta_dep,'0'), 1, 17), 17, ' ' ) || -- cuenta
    RPAD(LPAD(TO_CHAR(FLOOR(NVL(tns.importe,0))), 13, '0'), 15, '0') || --valor
    RPAD('PAGO DE NOMINA', 80, ' ') || 
    RPAD(SUBSTR(LTRIM(tns.tipo_doc), 1, 2), 2, '01' ) || --Codigo de identificacion del destinatario
    LPAD(SUBSTR(LTRIM(tns.tipo_cuenta), 1, 1), 1, '1' ) || -- Tipo de Cuenta  1. Ahorros, 2 Corriente   
    RPAD(SUBSTR(LTRIM(tns.ins_dep),1, 4), 4, '0') || --codigo del banco
    '0001' ||
    '1'    
    FROM fdt_bancos_tmp tns, trabajadores t
    WHERE t.trabajador = tns.trabajador
    AND tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tns.tipo = 2;      
  EXCEPTION
      WHEN OTHERS THEN
          RAISE ins_tabla_mm;
  END;

  DBMS_OUTPUT.PUT_LINE('13 - insert del detalle');

------------------------------------
--  Generar Estadisticas del Proceso
------------------------------------
  BEGIN
    SELECT NVL(SUM(importe), 0) Total, COUNT(trabajador) Trabajadores
    INTO vdc_total, vsi_nro_trab
    FROM fdt_bancos_tmp tns 
    WHERE tns.id_rep = psi_id_rep
    AND tns.usuariow = pvc_usuario
    AND tipo = 2;
    EXCEPTION
        WHEN OTHERS THEN vdc_total := 0;
                         vsi_nro_trab := 0;               
  END;             
  DBMS_OUTPUT.PUT_LINE('13A - Select de totales');
    
  DELETE
      fdt_bancos_resultados
  WHERE
      id_rep = psi_id_rep AND
      usuariow = pvc_usuario AND
      banco = pti_banco;

  INSERT INTO fdt_bancos_resultados
    (id_rep, usuariow, banco, trabajadores, valor_total)
  VALUES (psi_id_rep, pvc_usuario, pti_banco, vsi_nro_trab, vdc_total);

  vnu_reporte := 0;
  BEGIN
     SELECT 1
     INTO vnu_reporte
     FROM fdt_rutas
     WHERE operacion = 'FCO1070'
     AND codigo = pti_banco
     AND tipo = 1;  
  EXCEPTION
      WHEN TOO_MANY_ROWS THEN vnu_reporte := 1;
      WHEN OTHERS THEN vnu_reporte := 0;
  END;

  IF vnu_reporte = 1  THEN --si se debe generar reporte --rep
		DELETE fdt_bancos_rep
		WHERE id_rep = psi_id_rep AND
		usuariow = pvc_usuario AND
		banco = pti_banco;
  
    BEGIN
      INSERT INTO fdt_bancos_rep
      SELECT tns.id_rep, tns.usuariow,
      pti_banco, pdt_fecha, pvc_responsable, 
      tns.trabajador, tns.importe, tns.cuenta_dep, tns.simbolo_mon
      FROM fdt_bancos_tmp tns
      WHERE tns.id_rep = psi_id_rep
      AND tns.usuariow = pvc_usuario
      AND tipo = 2;
      EXCEPTION
          WHEN OTHERS THEN
              RAISE ins_tabla_rep;
    END;                

    DBMS_OUTPUT.PUT_LINE('14 - insert a la tabla fdt_bancos_rep');  		
 	END IF;--rep
  
  COMMIT;         

  EXCEPTION
    WHEN no_id_calendario THEN
         RAISE_APPLICATION_ERROR(-20000, 'Error de datos: No existe el periodo especificado');
         RETURN;
    WHEN no_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error de datos: No existe la tabla de respaldo');
         RETURN;
    WHEN ins_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla fdt_bancos_tmp');
         RETURN;         
    WHEN upd_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al actualizar en la tabla fdt_bancos_tmp');
         RETURN;
    WHEN del_tabla THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al eliminar en la tabla fdt_bancos_tmp');
         RETURN;                           
    WHEN ins_tabla_mm THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_mm');
         RETURN;                  
    WHEN ins_tabla_rep THEN
         RAISE_APPLICATION_ERROR(-20001, 'Error al insertar en la tabla: fdt_bancos_rep');
         RETURN;                  
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
END;
/
CREATE PUBLIC SYNONYM sp_fco_gen_bco_santander_ni FOR ADAM.sp_fco_gen_bco_santander_ni;
GRANT EXECUTE ON sp_fco_gen_bco_santander_ni TO adama;
