CREATE OR REPLACE  PROCEDURE sp_fco_incorpora_ausentismos
(
    pch_compania        char,
    psi_id_calendario   number,
    pch_clase_nomina    char,
    pch_trabajador      char,
    pvc_usuario         varchar2,
    pdt_fecha_hoy       date
)
AS
/********************************************************/
/*** Modulo:      Modulo Fiscal ADAM v3 - Ausentismos ***/
/*** Descripcion: Incorpora embargos a la nómina      ***/
/*** Autor:       Juan Carlos Leguizamon              ***/
/*** Fecha:       Junio 17 de 2002                    ***/
/*** Revision:   Octubre 30 de 2002                  ***/
/*** Ultima Revision: Coleccion VENTAS - DERSA        ***/
/********************************************************/
--DCR:AG-09-07: Pasada a Oracle de una version de SQL
    cin_id_au         int;
    cch_trabajador    char(10);
    csi_concepto      number(5);
    csi_concepto1      number(5);

    cti_tipo          number(3);
    cdt_inicio_au     date;
    cdt_fin_au        date;
    csi_dias          number(5);
    csi_dias_empresa  number(5);
    csi_dias_trabajador number(5);

    cti_tipo_dias     number(3);

    vdt_inicio_per    date;
    vdt_fin_per       date;
    vdt_fin_au_inicial date;
    vdt_inicio        date; /* Fecha inicio del ausentismo dentro 
del periodo */
    vdt_fin           date; /* Fecha fin del ausentismo dentro del 
periodo */

    vnm_tiempo        number(8,3);
    wde_fecha_fin_au  number(19,6);
    wde_fin_au_inicial  number(19,6);
    vti_prorroga      number(3);
    vdt_valor_ibc     number(19,6);
    vti_masivo        number(3);
    vdt_inicio_mes    date;
    
    CURSOR cr_ausentismos IS
    SELECT
        au.id_ausentismo, au.trabajador, au.concepto, au.tipo,
        au.fecha_inicio, au.fecha_fin, au.dias, au.tipo_dias, au.valor_ibc
    FROM
       fco_ausentismos au, trabajadores_grales tg
    WHERE
      au.compania = tg.compania And au.trabajador = tg.trabajador And
      au.compania = pch_compania And
      tg.clase_nomina = pch_clase_nomina And
      tg.sit_trabajador = 1 And
      au.fecha_fin >= vdt_inicio_per  And
      /* < por <=*/
      au.fecha_inicio <= vdt_fin_per And
      ((au.trabajador = pch_trabajador And vti_masivo = 0) OR 
      (vti_masivo = 1));
    
BEGIN

  execute immediate 'ALTER SESSION SET NLS_DATE_FORMAT="YYYYMMDD"';

    /* Verificar si el proceso es masivo o individual */
    IF NVL(LTrim(RTrim(pch_trabajador)), ' ') = ' ' THEN
        vti_masivo := 1;
    ELSE
        vti_masivo := 0;
    END IF;    

    /* Eliminar las transacciones ya generadas por este incorpora */
    DELETE
        transacciones_ns
    WHERE
        compania = pch_compania And
        clase_nomina = pch_clase_nomina And
        id_calendario = psi_id_calendario And
        referencia = 'Ausentismo' And
        ((trabajador = pch_trabajador And vti_masivo = 0) OR (vti_masivo = 1));

    /* Recuperar las fechas del periodo */
    BEGIN
      SELECT fecha_inicio, fecha_termino
      INTO vdt_inicio_per, vdt_fin_per
      FROM calendario_procesos
      WHERE id_calendario = psi_id_calendario;
    EXCEPTION
       WHEN OTHERS THEN vdt_inicio_per := NULL;
                        vdt_fin_per := NULL;
    END;      

    /* PARTE I: A U S E N T I S M O S    N O R M A L E S */
    /* Recorrer los ausentismos del periodo */

    OPEN cr_ausentismos;
    LOOP
        FETCH cr_ausentismos INTO cin_id_au, cch_trabajador, csi_concepto, cti_tipo, cdt_inicio_au, cdt_fin_au, csi_dias, 
        cti_tipo_dias,vdt_valor_ibc;
        EXIT WHEN cr_ausentismos%NOTFOUND;

        /* Hallar si es prorroga o no */
        vti_prorroga := 0;

        IF cti_tipo = 4 THEN 
           vti_prorroga := 1;
        END IF;   

        /* PARA LAS INCAPACIDADES POR ENFERMEDAD GENERAL */
        /* O POR ACCIDENTE DE TRABAJO SE INCORPORAN DOS  */
        /* CONCEPTOS DIFERENTES DEPENDIENDO DE LA DURACION DE LA*/
        /*INCAPACIDAD*/
        wde_fecha_fin_au := TO_NUMBER(cdt_fin_au);


   IF csi_concepto <> 300 AND csi_concepto <> 310 AND csi_concepto <> 330 AND csi_concepto <> 335 THEN
        /* Calcular las fechas del ausentismo en el periodo */
        IF cdt_inicio_au < vdt_inicio_per THEN
            vdt_inicio := vdt_inicio_per;
        ELSE
            vdt_inicio := cdt_inicio_au;
        END IF;    

        IF cdt_fin_au > vdt_fin_per THEN
            vdt_fin := vdt_fin_per;
        ELSE
            vdt_fin := cdt_fin_au;
        END IF;    

        wde_fecha_fin_au := TO_NUMBER(cdt_fin_au);

        /* Hallar el numero de dias del ausentismo para el periodo */
        vnm_tiempo := (vdt_fin - vdt_inicio) + 1;
        
         IF vnm_tiempo > 0 THEN
            sp_alta_transacciones_ns(
            pch_compania,
            pch_clase_nomina,
            psi_id_calendario,
            csi_concepto,
            cch_trabajador,
            'Ausentismo',       /* referencia */
            NULL,       /* secuencia */
            '',                 /* referencia2 */
            pdt_fecha_hoy, /* fecha */
            pdt_fecha_hoy,     /* fecha2*/
            vnm_tiempo,         /* tiempo */
            wde_fecha_fin_au,          /* factor_01 */
            cin_id_au,           /* factor_02 */
            vti_prorroga,       /* factor_03 */
            0,         /* importe_reportado */
            0,         /* importe */
            null,      /* turno_trn */
            null,      /* puesto_trn */
            null,      /* agrupacion_01_trn */
            null,      /* dato_01_trn */
            null,      /* agrupacion_02_trn */
            null,      /* dato_02_trn */
            null,      /* agrupacion_03_trn */
            null,      /* dato_03_trn */
            null,      /* agrupacion_04_trn */
            null,      /* dato_04_trn */
            1,      /* origen_transaccion */
            pvc_usuario,  /* usuario_registro */
            pdt_fecha_hoy, /* fecha_registro */
            null,      /* usuario_proceso */
            null,  /* fecha_proceso */
            null,      /* usuario_cambio */
            null,      /* fecha_cambio */
            1,      /* sit_transaccion */
            1);          /* checa bajas del periodo */
         END IF;        
   ELSE
       sp_calcula_dias_ausentismo(  
       pch_compania, 
       cch_trabajador,
       csi_concepto,
       cin_id_au,
       cdt_inicio_au, 
       cdt_fin_au, 
       vdt_inicio_per,
       vdt_fin_per, 
       csi_dias_empresa,   
       csi_dias_trabajador);

      IF csi_concepto = 300 OR  csi_concepto = 310 THEN
         csi_concepto := 300;
         csi_concepto1 := 310;
      ELSE
         csi_concepto := 330;
         csi_concepto1 := 335;
      END IF;

      IF csi_dias_empresa > 0 THEN
          vdt_fin_au_inicial := csi_dias_empresa + cdt_inicio_au;
          wde_fin_au_inicial := TO_NUMBER(vdt_fin_au_inicial);

                sp_alta_transacciones_ns(
                pch_compania,
                pch_clase_nomina,
                psi_id_calendario,
                csi_concepto,
                cch_trabajador,
                'Ausentismo',       /* referencia */
                null,               /* secuencia */
                '',                 /* referencia2 */
                pdt_fecha_hoy, /* fecha */
                pdt_fecha_hoy,     /* fecha2*/
                csi_dias_empresa,         /* tiempo */
                wde_fin_au_inicial,          /* factor_01 */
                cin_id_au,           /* factor_02 */
                vti_prorroga,       /* factor_03 */
                0,         /* importe_reportado */
                0,         /* importe */
                null,      /* turno_trn */
                null,      /* puesto_trn */
                null,      /* agrupacion_01_trn */
                null,      /* dato_01_trn */
                null,      /* agrupacion_02_trn */
                null,      /* dato_02_trn */
                null,      /* agrupacion_03_trn */
                null,      /* dato_03_trn */
                null,      /* agrupacion_04_trn */
                null,      /* dato_04_trn */
                1,      /* origen_transaccion */
                pvc_usuario,  /* usuario_registro */
                pdt_fecha_hoy, /* fecha_registro */
                null,      /* usuario_proceso */
                null,  /* fecha_proceso */
                null,      /* usuario_cambio */
                null,      /* fecha_cambio */
                1,      /* sit_transaccion */
                1);          /* checa bajas del periodo */
      END IF;
      
      IF csi_dias_trabajador > 0 THEN
                sp_alta_transacciones_ns(
                pch_compania,
                pch_clase_nomina,
                psi_id_calendario,
                csi_concepto1,
                cch_trabajador,
                'Ausentismo',       /* referencia */
                null,               /* secuencia */
                '',                 /* referencia2 */
                pdt_fecha_hoy, /* fecha */
                pdt_fecha_hoy,     /* fecha2*/
                csi_dias_trabajador,         /* tiempo */
                wde_fecha_fin_au,          /* factor_01 */
                cin_id_au,           /* factor_02 */
                vti_prorroga,       /* factor_03 */
                0,         /* importe_reportado */
                vdt_valor_ibc,    /* importe */
                null,      /* turno_trn */
                null,      /* puesto_trn */
                null,      /* agrupacion_01_trn */
                null,      /* dato_01_trn */
                null,      /* agrupacion_02_trn */
                null,      /* dato_02_trn */
                null,      /* agrupacion_03_trn */
                null,      /* dato_03_trn */
                null,      /* agrupacion_04_trn */
                null,      /* dato_04_trn */
                1,      /* origen_transaccion */
                pvc_usuario,  /* usuario_registro */
                pdt_fecha_hoy, /* fecha_registro */
                null,      /* usuario_proceso */
                null,  /* fecha_proceso */
                null,      /* usuario_cambio */
                null,      /* fecha_cambio */
                1,      /* sit_transaccion */
                1);          /* checa bajas del periodo */
      END IF;
   END IF;
   
    END LOOP; /* LOOP */
    CLOSE cr_ausentismos;

   COMMIT WORK;

    EXCEPTION
    WHEN OTHERS THEN
         RAISE_APPLICATION_ERROR(-20002, SQLCODE||SQLERRM(SQLCODE));
         RETURN;
   
END;
/
CREATE PUBLIC SYNONYM sp_fco_incorpora_ausentismos FOR ADAM.sp_fco_incorpora_ausentismos;
GRANT EXECUTE ON sp_fco_incorpora_ausentismos TO adama;
