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 numeric(15,2),
    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(50),
    COMPMES numeric(15,2),
    REMUNERACION_COMPLEMENTARIA1 numeric(15,2),
    REMUNERACION_COMPLEMENTARIA2 numeric(15,2),
    FALTAS char(5),
    NOMINA_ID integer,
    DIAS_AUS_IMSS integer,
    DIAS integer,
    MDIAS integer,
    FECHA_TOMADA date,
    TIPO char(1),
    TIPO_FALTA char(1),
    DIA integer,
    DIAS_F varchar(50),
    DIAS_MF varchar(50),
    DIAS_OS varchar(50),
    DIAS_OE varchar(50),
    TOTAL_F integer,
    TOTAL_MF integer,
    TOTAL_S integer,
    TOTAL_E integer,
    FECHA_INICIAL_N date,
    FECHA_INICIAL_FAL date,
    FECHA_FINAL_FAL date)
as
BEGIN
  --ULTIMA MODIFICACION 28/04/2021

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

  FECHA_NOM = :V_FECHA_NOM;
  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
    MES=12;
    ANIO=:ANIO-1;
  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 (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';

  FECHA_AUX = CAST(:FECHA_INICIAL_N AS VARCHAR(10));
  ANIO = SUBSTRING(FECHA_AUX FROM 1 FOR 4);
  DIA_NOM = SUBSTRING(FECHA_AUX FROM 9 FOR 2);
  MES = SUBSTRING(FECHA_AUX FROM 6 FOR 2);

  IF (DIA_NOM=1) THEN
  BEGIN
    MES=:MES-1;
    FECHA_INICIAL_FAL = ANIO||'-'||MES||'-'||16;
    EXECUTE PROCEDURE FINMES(:FECHA_INICIAL_FAL)
    RETURNING_VALUES FECHA_FINAL_FAL;
  END
  ELSE
  BEGIN
    FECHA_INICIAL_FAL = ANIO||'-'||MES||'-'||01;
    FECHA_FINAL_FAL = ANIO||'-'||MES||'-'||15;
  END

  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
        BEGIN
            DIAS = CAST(SUBSTRING(FALTAS FROM 1 FOR 2) AS INTEGER);
            MDIAS = CAST(SUBSTRING(FALTAS FROM 3 FOR 1) AS INTEGER);

            IF (MDIAS=4) THEN
                DIAS_FALTAS=DIAS+0.5;
            ELSE
                DIAS_FALTAS=DIAS;--DIAS_AUS_IMSS;
        END 
            --15/04/2021 LO CONVERTIA EN MILES DIAS_FALTAS = CAST(FALTAS AS INTEGER);

        FALTAS_DIAS='';
        TOTAL_F=0;
        TOTAL_MF=0;
        TOTAL_S=0;
        TOTAL_E=0;
        DIAS_F='';
        DIAS_MF='';
        DIAS_OE='';
        DIAS_OS='';
        --QUINCENA ANTERIOR
        FOR SELECT A.FECHA_TOMADA, A.TIPO, A.TIPO_FALTA
        FROM MGNOM_FALVAC_EMPLEADOS A
        WHERE A.NUMERO=:NUMERO
        AND A.TIPO_DOCTO='F'
        AND A.FECHA_TOMADA BETWEEN :FECHA_INICIAL_FAL AND :FECHA_FINAL_FAL
        INTO FECHA_TOMADA, TIPO, TIPO_FALTA
        DO
        BEGIN
            FECHA_AUX = CAST(:FECHA_TOMADA AS VARCHAR(10));
            DIA=SUBSTRING(FECHA_AUX FROM 9 FOR 2);
            IF ((TIPO='F') AND ((TIPO_FALTA = 'C') OR (TIPO_FALTA IS NULL))) THEN
            BEGIN
                DIAS_F=DIAS_F||DIA||',';
                TOTAL_F=TOTAL_F+1;
            END
            IF ((TIPO='F') AND (TIPO_FALTA = 'M')) THEN
            BEGIN
                DIAS_MF=DIAS_MF||DIA||',';
                TOTAL_MF=TOTAL_MF+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_MF>0) THEN
            FALTAS_DIAS=FALTAS_DIAS||'MF'||' '||DIAS_MF;
        IF (TOTAL_S>0) THEN
            FALTAS_DIAS=FALTAS_DIAS||' OS'||' '||DIAS_OS;
        if (TOTAL_E>0) then
            FALTAS_DIAS=FALTAS_DIAS||' OE'||' '||DIAS_OE;

        IMPORTE_FALTAS=((COMPMES/30.4)*DIAS_FALTAS);
        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='';
        TOTAL_F=0;
        TOTAL_MF=0;
        TOTAL_S=0;
        TOTAL_E=0;
        DIAS_F='';
        DIAS_MF='';
        DIAS_OE='';
        DIAS_OS='';
        --QUINCENA ANTERIOR
        FOR SELECT A.FECHA_TOMADA, A.TIPO, A.TIPO_FALTA
        FROM MGNOM_FALVAC_EMPLEADOS A
        WHERE A.NUMERO=:NUMERO
        AND A.TIPO_DOCTO='F'
        AND A.FECHA_TOMADA BETWEEN :FECHA_INICIAL_FAL AND :FECHA_FINAL_FAL
        INTO FECHA_TOMADA, TIPO, TIPO_FALTA
        DO
        BEGIN
            FECHA_AUX = CAST(:FECHA_TOMADA AS VARCHAR(10));
            DIA=SUBSTRING(FECHA_AUX FROM 9 FOR 2);
            IF ((TIPO='F') AND ((TIPO_FALTA = 'C') OR (TIPO_FALTA IS NULL))) THEN
            BEGIN
                DIAS_F=DIAS_F||DIA||',';
                TOTAL_F=TOTAL_F+1;
            END
            IF ((TIPO='F') AND (TIPO_FALTA = 'M')) THEN
            BEGIN
                DIAS_MF=DIAS_MF||DIA||',';
                TOTAL_MF=TOTAL_MF+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_MF>0) THEN
            FALTAS_DIAS=FALTAS_DIAS||'MF'||' '||DIAS_MF;
        IF (TOTAL_S>0) THEN
            FALTAS_DIAS=FALTAS_DIAS||' OS'||' '||DIAS_OS;
        if (TOTAL_E>0) then
            FALTAS_DIAS=FALTAS_DIAS||' OE'||' '||DIAS_OE;

        IMPORTE_FALTAS=((REMUNERACION_COMPLEMENTARIA1/30.4)*DIAS_FALTAS);
        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
        BEGIN
            DIAS = CAST(SUBSTRING(FALTAS FROM 1 FOR 2) AS INTEGER);
            MDIAS = CAST(SUBSTRING(FALTAS FROM 3 FOR 1) AS INTEGER);

            IF (MDIAS=4) THEN
                DIAS_FALTAS=DIAS+0.5;
            ELSE
                DIAS_FALTAS=DIAS;--DIAS_AUS_IMSS;
        END 
            --15/04/2021 LO CONVERTIA EN MILES DIAS_FALTAS = CAST(FALTAS AS INTEGER);

        FALTAS_DIAS='';
        TOTAL_F=0;
        TOTAL_MF=0;
        TOTAL_S=0;
        TOTAL_E=0;
        DIAS_F='';
        DIAS_MF='';
        DIAS_OE='';
        DIAS_OS='';
        --QUINCENA ANTERIOR
        FOR SELECT A.FECHA_TOMADA, A.TIPO, A.TIPO_FALTA
        FROM MGNOM_FALVAC_EMPLEADOS A
        WHERE A.NUMERO=:NUMERO
        AND A.TIPO_DOCTO='F'
        AND A.FECHA_TOMADA BETWEEN :FECHA_INICIAL_FAL AND :FECHA_FINAL_FAL
        INTO FECHA_TOMADA, TIPO, TIPO_FALTA
        DO
        BEGIN
            FECHA_AUX = CAST(:FECHA_TOMADA AS VARCHAR(10));
            DIA=SUBSTRING(FECHA_AUX FROM 9 FOR 2);
            IF ((TIPO='F') AND ((TIPO_FALTA = 'C') OR (TIPO_FALTA IS NULL))) THEN
            BEGIN
                DIAS_F=DIAS_F||DIA||',';
                TOTAL_F=TOTAL_F+1;
            END
            IF ((TIPO='F') AND (TIPO_FALTA = 'M')) THEN
            BEGIN
                DIAS_MF=DIAS_MF||DIA||',';
                TOTAL_MF=TOTAL_MF+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_MF>0) THEN
            FALTAS_DIAS=FALTAS_DIAS||'MF'||' '||DIAS_MF;
        IF (TOTAL_S>0) THEN
            FALTAS_DIAS=FALTAS_DIAS||' OS'||' '||DIAS_OS;
        if (TOTAL_E>0) then
            FALTAS_DIAS=FALTAS_DIAS||' OE'||' '||DIAS_OE;

        IMPORTE_FALTAS=((REMUNERACION_COMPLEMENTARIA2/30.4)*DIAS_FALTAS);
        SUSPEND;
    END
  END
END^

SET TERM ; ^

