SET TERM ^ ;

create or alter procedure MGREPNOM_FALTAS_MES (
    V_FECHA_NOM date,
    V_OPCION integer)
returns (
    FECHA_NOM date,
    ANIO_NOM integer,
    NMES_NOM varchar(50),
    DIA_NOM integer,
    EMPLEADO_ID integer,
    NUMERO integer,
    NOMBRE_COMPLETO varchar(100),
    DEPTO varchar(50),
    PUESTO varchar(50),
    DIAS_FALTAS integer,
    SALARIO_DIARIO numeric(15,2),
    IMPORTE_FALTAS numeric(15,2),
    ANIO integer,
    MES integer,
    FECHA_AUX varchar(10),
    FECHA_INI date,
    FECHA_FIN date,
    NMES_PER varchar(50),
    FALTAS_DIAS varchar(200),
    COMPMES numeric(15,2),
    REMUNERACION_COMPLEMENTARIA1 numeric(15,2),
    REMUNERACION_COMPLEMENTARIA2 numeric(15,2),
    FALTAS char(5),
    NOMINA_ID integer,
    DIAS_AUS_IMSS integer,
    FECHA_INICIAL varchar(10),
    FECHA_FINAL varchar(10),
    QUINCENA varchar(10),
    DIA_INICIAL_N char(2),
    DIA_INICIAL char(2),
    DIA_FINAL char(2),
    TOTAL_F integer,
    TOTAL_S integer,
    TOTAL_E integer,
    DIAS_F varchar(200),
    DIAS_OE varchar(200),
    DIAS_OS varchar(200),
    FECHA_TOMADA date,
    TIPO char(10),
    FECHAI_AUX date,
    FECHAF_AUX date)
as
declare variable FECHA_NOM_AUX2 varchar(10);
declare variable FECHA_NOM_AUX date;
declare variable ANIO_A integer;
declare variable DIA_A integer;
declare variable MES_A integer;
declare variable CAD_FECHA_AUX varchar(10);
declare variable DIAS_FALTAS_AUX integer;
declare variable DIA varchar(10);
BEGIN
  --ULTIMA MODIFICACION 15/04/2021

  SELECT A.NOMINA_ID, A.FECHA_INICIAL, A.FECHA_FINAL
  FROM NOMINAS A
  WHERE A.FECHA = :V_FECHA_NOM
  AND A.TIPO_NOM = 'N'
  INTO NOMINA_ID, FECHA_INICIAL, FECHA_FINAL;

  DIA_INICIAL_N = SUBSTRING(FECHA_INICIAL FROM 9 FOR 2);
  DIA_FINAL = SUBSTRING(FECHA_FINAL FROM 9 FOR 2);

  IF (DIA_INICIAL_N = '01') THEN
  QUINCENA = '1A.QNA.';

  IF (DIA_INICIAL_N = '16') THEN
  QUINCENA = '2A.QNA.';

  IF (DIA_INICIAL_N = '01') THEN
    DIA_INICIAL = '16';
  ELSE
    DIA_INICIAL = '01';

  FECHA_NOM = :V_FECHA_NOM;
  FECHA_NOM_AUX = :V_FECHA_NOM; --MEJORA MILO 2022
  FECHA_AUX = CAST(:FECHA_NOM AS VARCHAR(10));
  ANIO = SUBSTRING(FECHA_AUX FROM 1 FOR 4);
  ANIO_NOM = ANIO;
  DIA_NOM = SUBSTRING(FECHA_AUX FROM 9 FOR 2);
  MES = SUBSTRING(FECHA_AUX FROM 6 FOR 2);

  IF (MES=1) THEN
    NMES_NOM='ENERO';
  ELSE IF (MES=2) THEN
    NMES_NOM='FEBRERO';
  ELSE IF (MES=3) THEN
    NMES_NOM='MARZO';
  ELSE IF (MES=4) THEN
    NMES_NOM='ABRIL';
  ELSE IF (MES=5) THEN
    NMES_NOM='MAYO';
  ELSE IF (MES=6) THEN
    NMES_NOM='JUNIO';
  ELSE IF (MES=7) THEN
    NMES_NOM='JULIO';
  ELSE IF (MES=8) THEN
    NMES_NOM='AGOSTO';
  ELSE IF (MES=9) THEN
    NMES_NOM='SEPTIEMBRE';
  ELSE IF (MES=10) THEN
    NMES_NOM='OCTUBRE';
  ELSE IF (MES=11) THEN
    NMES_NOM='NOVIEMBRE';
  ELSE IF (MES=12) THEN
    NMES_NOM='DICIEMBRE';

  /*LIZ 30/09/2015 AHORA LA FECHA FINAL SERA EL ULTIMO DIA DEL MES ANTERIOR
  FECHA_AUX=ANIO||'-'||MES||'-'||15;
  FECHA_FIN=CAST(FECHA_AUX AS DATE); */

  IF (:MES=1) THEN
  BEGIN
    IF (:DIA_INICIAL = '16') THEN
    BEGIN
        MES=12;
        ANIO=:ANIO-1;
    END
    ELSE
    BEGIN
        MES=:MES;
        ANIO=:ANIO;
    END
  END
  ELSE
  BEGIN
    MES=:MES-1;
    ANIO=:ANIO;
  END
  /*LIZ 30/09/2015 AHORA LA FECHA INICIAL SERA EL PRIMIER DIA DEL MES ANTERIOR
  FECHA_AUX=ANIO||'-'||MES||'-'||16; */
  FECHA_AUX=ANIO||'-'||MES||'-'||01;
  FECHA_INI=CAST(FECHA_AUX AS DATE);
  EXECUTE PROCEDURE FINMES(:FECHA_INI)
  RETURNING_VALUES FECHA_FIN;

  IF (DIA_INICIAL = '16' ) THEN
    DIA_FINAL = SUBSTRING(FECHA_FIN FROM 9 FOR 2);
  ELSE
    DIA_FINAL = '15';

  IF (MES=1) THEN
    NMES_PER='ENERO';
  ELSE IF (MES=2) THEN
    NMES_PER='FEBRERO';
  ELSE IF (MES=3) THEN
    NMES_PER='MARZO';
  ELSE IF (MES=4) THEN
    NMES_PER='ABRIL';
  ELSE IF (MES=5) THEN
    NMES_PER='MAYO';
  ELSE IF (MES=6) THEN
    NMES_PER='JUNIO';
  ELSE IF (MES=7) THEN
    NMES_PER='JULIO';
  ELSE IF (MES=8) THEN
    NMES_PER='AGOSTO';
  ELSE IF (MES=9) THEN
    NMES_PER='SEPTIEMBRE';
  ELSE IF (MES=10) THEN
    NMES_PER='OCTUBRE';
  ELSE IF (MES=11) THEN
    NMES_PER='NOVIEMBRE';
  ELSE IF (MES=12) THEN
    NMES_PER='DICIEMBRE';

  /*MEJORA 2022 MILO*/
  IF (QUINCENA = '1A.QNA.') THEN
  BEGIN
    FECHA_NOM_AUX2 = CAST(:FECHA_NOM_AUX AS VARCHAR(10));
    ANIO_A = SUBSTRING(FECHA_NOM_AUX2 FROM 1 FOR 4);
    MES_A = SUBSTRING(FECHA_NOM_AUX2 FROM 6 FOR 2);

    CAD_FECHA_AUX = ANIO_A||'-'||MES_A||'-'||'01';
    FECHAI_AUX = CAST(CAD_FECHA_AUX AS DATE);
    CAD_FECHA_AUX = ANIO_A||'-'||MES_A||'-'||'15';
    FECHAF_AUX = CAST(CAD_FECHA_AUX AS DATE);
  END
  IF (QUINCENA = '2A.QNA.') THEN
  BEGIN
    FECHA_NOM_AUX2 = CAST(:FECHA_NOM_AUX AS VARCHAR(10));
    ANIO_A = SUBSTRING(FECHA_NOM_AUX2 FROM 1 FOR 4);
    --DIA_A = SUBSTRING(FECHA_AUX FROM 9 FOR 2);
    MES_A = SUBSTRING(FECHA_NOM_AUX2 FROM 6 FOR 2);
    IF (MES_A = 1) THEN
    BEGIN
        MES_A = 12;
        ANIO_A = ANIO_A - 1;
    END
    ELSE
        MES_A = MES_A - 1;
    CAD_FECHA_AUX = ANIO_A||'-'||MES_A||'-'||'01';
    FECHAI_AUX = CAST(CAD_FECHA_AUX AS DATE);
    EXECUTE PROCEDURE FINMES(:FECHAI_AUX)
    RETURNING_VALUES FECHAF_AUX;
  END
  /*FIN MEJORA 2022*/

  IF (:V_OPCION = 1) THEN
  BEGIN
    FOR SELECT A.EMPLEADO_ID, A.NUMERO, A.NOMBRE_COMPLETO, B.NOMBRE DEPTO, C.NOMBRE PUESTO, A.SALARIO_DIARIO, D.COMPMES
    FROM EMPLEADOS A
    INNER JOIN DEPTOS_NO B ON (B.DEPTO_NO_ID=A.DEPTO_NO_ID)
    INNER JOIN PUESTOS_NO C ON (C.PUESTO_NO_ID=A.PUESTO_NO_ID)
    LEFT JOIN LIBRES_EMPLEADOS D ON (D.EMPLEADO_ID=A.EMPLEADO_ID)
    WHERE A.ESTATUS<>'B'
    AND D.COMPMES>0
    ORDER BY A.NOMBRE_COMPLETO
    INTO EMPLEADO_ID, NUMERO, NOMBRE_COMPLETO, DEPTO, PUESTO, SALARIO_DIARIO, COMPMES
    DO
    BEGIN
        DIAS_FALTAS=0;
        IMPORTE_FALTAS=0;
    
        FALTAS=''; DIAS_AUS_IMSS=0;
        SELECT F.FALTAS, F.DIAS_AUS_IMSS
        FROM EXCEP_EMPLEADOS F
        WHERE F.NOMINA_ID=:NOMINA_ID
        AND F.EMPLEADO_ID=:EMPLEADO_ID
        INTO FALTAS, DIAS_AUS_IMSS;

        IF ((FALTAS IS NULL) OR (FALTAS = ''))  THEN
            DIAS_FALTAS=0;
        ELSE
            DIAS_FALTAS=DIAS_AUS_IMSS;
            --15/04/2021 LO CONVERTIA EN MILES DIAS_FALTAS = CAST(FALTAS AS INTEGER);
    
        FALTAS_DIAS='';
    
        IMPORTE_FALTAS=((COMPMES/30.4)*DIAS_FALTAS);

        /*MEJORA 2022*/
        IF (DIAS_FALTAS > 0) THEN
        BEGIN
            TOTAL_F=0;
            TOTAL_S=0;
            TOTAL_E=0;
            DIAS_F='';
            DIAS_OE='';
            DIAS_OS='';
            DIAS_FALTAS_AUX = 0;
            FOR SELECT A.FECHA_TOMADA, A.TIPO
            FROM MGNOM_FALVAC_EMPLEADOS A
            WHERE A.NUMERO=:NUMERO
            AND A.TIPO_DOCTO='F'
            AND A.FECHA_TOMADA BETWEEN :FECHAI_AUX AND :FECHAF_AUX
            INTO FECHA_TOMADA, TIPO
            DO
            BEGIN
                DIAS_FALTAS_AUX = DIAS_FALTAS_AUX + 1;
                FECHA_AUX = CAST(:FECHA_TOMADA AS VARCHAR(10));
                DIA=SUBSTRING(FECHA_AUX FROM 9 FOR 2);
                IF (TIPO='F') THEN
                BEGIN
                    DIAS_F=DIAS_F||DIA||',';
                    TOTAL_F=TOTAL_F+1;
                END
                IF (TIPO='S') THEN
                BEGIN
                    DIAS_OS=DIAS_OS||DIA||',';
                    TOTAL_S=TOTAL_S+1;
                END
                IF (TIPO='E') THEN
                BEGIN
                    DIAS_OE=DIAS_OE||DIA||',';
                    TOTAL_E=TOTAL_E+1;
                END
            END
            FALTAS_DIAS='';
            IF (TOTAL_F>0) THEN
                FALTAS_DIAS='F'||' '||DIAS_F;
            IF (TOTAL_S>0) THEN
                FALTAS_DIAS=FALTAS_DIAS||' OS'||' '||DIAS_OS;
            if (TOTAL_E>0) then
                FALTAS_DIAS=FALTAS_DIAS||' OE'||' '||DIAS_OE;
        END
        /*FIN MEJORA*/

        SUSPEND;
    END
  END
  IF (:V_OPCION = 2) THEN
  BEGIN
    FOR SELECT A.EMPLEADO_ID, A.NUMERO, A.NOMBRE_COMPLETO, B.NOMBRE DEPTO, C.NOMBRE PUESTO, A.SALARIO_DIARIO, D.REMUNERACION_COMPLEMENTARIA1
    FROM EMPLEADOS A
    INNER JOIN DEPTOS_NO B ON (B.DEPTO_NO_ID=A.DEPTO_NO_ID)
    INNER JOIN PUESTOS_NO C ON (C.PUESTO_NO_ID=A.PUESTO_NO_ID)
    LEFT JOIN LIBRES_EMPLEADOS D ON (D.EMPLEADO_ID=A.EMPLEADO_ID)
    WHERE A.ESTATUS<>'B'
    AND D.REMUNERACION_COMPLEMENTARIA1>0
    ORDER BY A.NOMBRE_COMPLETO
    INTO EMPLEADO_ID, NUMERO, NOMBRE_COMPLETO, DEPTO, PUESTO, SALARIO_DIARIO, REMUNERACION_COMPLEMENTARIA1
    DO
    BEGIN
        DIAS_FALTAS=0;
        IMPORTE_FALTAS=0;
    
        FALTAS=''; DIAS_AUS_IMSS=0;
        SELECT F.FALTAS, F.DIAS_AUS_IMSS
        FROM EXCEP_EMPLEADOS F
        WHERE F.NOMINA_ID=:NOMINA_ID
        AND F.EMPLEADO_ID=:EMPLEADO_ID
        INTO FALTAS, DIAS_AUS_IMSS;

        IF ((FALTAS IS NULL) OR (FALTAS = ''))  THEN
            DIAS_FALTAS=0;
        ELSE
            DIAS_FALTAS=DIAS_AUS_IMSS;
            --15/04/2021 LO CONVERTIA EN MILES DIAS_FALTAS = CAST(FALTAS AS INTEGER);
    
        FALTAS_DIAS='';
    
        IMPORTE_FALTAS=((REMUNERACION_COMPLEMENTARIA1/30.4)*DIAS_FALTAS);

        /*MEJORA 2022*/
        IF (DIAS_FALTAS > 0) THEN
        BEGIN
            TOTAL_F=0;
            TOTAL_S=0;
            TOTAL_E=0;
            DIAS_F='';
            DIAS_OE='';
            DIAS_OS='';
            DIAS_FALTAS_AUX = 0;
            FOR SELECT A.FECHA_TOMADA, A.TIPO
            FROM MGNOM_FALVAC_EMPLEADOS A
            WHERE A.NUMERO=:NUMERO
            AND A.TIPO_DOCTO='F'
            AND A.FECHA_TOMADA BETWEEN :FECHAI_AUX AND :FECHAF_AUX
            INTO FECHA_TOMADA, TIPO
            DO
            BEGIN
                DIAS_FALTAS_AUX = DIAS_FALTAS_AUX + 1;
                FECHA_AUX = CAST(:FECHA_TOMADA AS VARCHAR(10));
                DIA=SUBSTRING(FECHA_AUX FROM 9 FOR 2);
                IF (TIPO='F') THEN
                BEGIN
                    DIAS_F=DIAS_F||DIA||',';
                    TOTAL_F=TOTAL_F+1;
                END
                IF (TIPO='S') THEN
                BEGIN
                    DIAS_OS=DIAS_OS||DIA||',';
                    TOTAL_S=TOTAL_S+1;
                END
                IF (TIPO='E') THEN
                BEGIN
                    DIAS_OE=DIAS_OE||DIA||',';
                    TOTAL_E=TOTAL_E+1;
                END
            END
            FALTAS_DIAS='';
            IF (TOTAL_F>0) THEN
                FALTAS_DIAS='F'||' '||DIAS_F;
            IF (TOTAL_S>0) THEN
                FALTAS_DIAS=FALTAS_DIAS||' OS'||' '||DIAS_OS;
            if (TOTAL_E>0) then
                FALTAS_DIAS=FALTAS_DIAS||' OE'||' '||DIAS_OE;
        END
        /*FIN MEJORA*/

        SUSPEND;
    END
  END
  IF (:V_OPCION = 3) THEN
  BEGIN
    FOR SELECT A.EMPLEADO_ID, A.NUMERO, A.NOMBRE_COMPLETO, B.NOMBRE DEPTO, C.NOMBRE PUESTO, A.SALARIO_DIARIO, D.REMUNERACION_COMPLEMENTARIA2
    FROM EMPLEADOS A
    INNER JOIN DEPTOS_NO B ON (B.DEPTO_NO_ID=A.DEPTO_NO_ID)
    INNER JOIN PUESTOS_NO C ON (C.PUESTO_NO_ID=A.PUESTO_NO_ID)
    LEFT JOIN LIBRES_EMPLEADOS D ON (D.EMPLEADO_ID=A.EMPLEADO_ID)
    WHERE A.ESTATUS<>'B'
    AND D.REMUNERACION_COMPLEMENTARIA2>0
    ORDER BY A.NOMBRE_COMPLETO
    INTO EMPLEADO_ID, NUMERO, NOMBRE_COMPLETO, DEPTO, PUESTO, SALARIO_DIARIO, REMUNERACION_COMPLEMENTARIA2
    DO
    BEGIN
        DIAS_FALTAS=0;
        IMPORTE_FALTAS=0;
    
        FALTAS='';  DIAS_AUS_IMSS=0;
        SELECT F.FALTAS, F.DIAS_AUS_IMSS
        FROM EXCEP_EMPLEADOS F
        WHERE F.NOMINA_ID=:NOMINA_ID
        AND F.EMPLEADO_ID=:EMPLEADO_ID
        INTO FALTAS, DIAS_AUS_IMSS;

        IF ((FALTAS IS NULL) OR (FALTAS = ''))  THEN
            DIAS_FALTAS=0;
        ELSE
            DIAS_FALTAS=DIAS_AUS_IMSS;
            --15/04/2021 LO CONVERTIA EN MILES DIAS_FALTAS = CAST(FALTAS AS INTEGER);
    
        FALTAS_DIAS='';
    
        IMPORTE_FALTAS=((REMUNERACION_COMPLEMENTARIA2/30.4)*DIAS_FALTAS);

        /*MEJORA 2022*/
        IF (DIAS_FALTAS > 0) THEN
        BEGIN
            TOTAL_F=0;
            TOTAL_S=0;
            TOTAL_E=0;
            DIAS_F='';
            DIAS_OE='';
            DIAS_OS='';
            DIAS_FALTAS_AUX = 0;
            FOR SELECT A.FECHA_TOMADA, A.TIPO
            FROM MGNOM_FALVAC_EMPLEADOS A
            WHERE A.NUMERO=:NUMERO
            AND A.TIPO_DOCTO='F'
            AND A.FECHA_TOMADA BETWEEN :FECHAI_AUX AND :FECHAF_AUX
            INTO FECHA_TOMADA, TIPO
            DO
            BEGIN
                DIAS_FALTAS_AUX = DIAS_FALTAS_AUX + 1;
                FECHA_AUX = CAST(:FECHA_TOMADA AS VARCHAR(10));
                DIA=SUBSTRING(FECHA_AUX FROM 9 FOR 2);
                IF (TIPO='F') THEN
                BEGIN
                    DIAS_F=DIAS_F||DIA||',';
                    TOTAL_F=TOTAL_F+1;
                END
                IF (TIPO='S') THEN
                BEGIN
                    DIAS_OS=DIAS_OS||DIA||',';
                    TOTAL_S=TOTAL_S+1;
                END
                IF (TIPO='E') THEN
                BEGIN
                    DIAS_OE=DIAS_OE||DIA||',';
                    TOTAL_E=TOTAL_E+1;
                END
            END
            FALTAS_DIAS='';
            IF (TOTAL_F>0) THEN
                FALTAS_DIAS='F'||' '||DIAS_F;
            IF (TOTAL_S>0) THEN
                FALTAS_DIAS=FALTAS_DIAS||' OS'||' '||DIAS_OS;
            if (TOTAL_E>0) then
                FALTAS_DIAS=FALTAS_DIAS||' OE'||' '||DIAS_OE;
        END
        /*FIN MEJORA*/

        SUSPEND;
    END
  END
END^

SET TERM ; ^

/* Following GRANT statements are generated automatically */

GRANT SELECT ON NOMINAS TO PROCEDURE MGREPNOM_FALTAS_MES;
GRANT EXECUTE ON PROCEDURE FINMES TO PROCEDURE MGREPNOM_FALTAS_MES;
GRANT SELECT ON EMPLEADOS TO PROCEDURE MGREPNOM_FALTAS_MES;
GRANT SELECT ON DEPTOS_NO TO PROCEDURE MGREPNOM_FALTAS_MES;
GRANT SELECT ON PUESTOS_NO TO PROCEDURE MGREPNOM_FALTAS_MES;
GRANT SELECT ON LIBRES_EMPLEADOS TO PROCEDURE MGREPNOM_FALTAS_MES;
GRANT SELECT ON EXCEP_EMPLEADOS TO PROCEDURE MGREPNOM_FALTAS_MES;
GRANT SELECT ON MGNOM_FALVAC_EMPLEADOS TO PROCEDURE MGREPNOM_FALTAS_MES;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE MGREPNOM_FALTAS_MES TO SYSDBA;
GRANT EXECUTE ON PROCEDURE MGREPNOM_FALTAS_MES TO USUARIO_MICROSIP;