SET TERM ^ ;

create or alter procedure MGREPNOM_FALTAS (
    V_ANIO integer,
    V_MES integer,
    V_QUINCENA integer,
    V_FECHA_NOM date)
returns (
    ANIO_NOM integer,
    MES_NOM integer,
    QUINCENA_NOM integer,
    FECHA_NOM date,
    DIA_NOM integer,
    NMES_NOM varchar(50),
    NQUINCENA_NOM varchar(3),
    EMPLEADO_ID integer,
    NUMERO integer,
    NOMBRE_COMPLETO varchar(100),
    DEPTO varchar(50),
    PUESTO varchar(50),
    DIAS_FALTAS integer,
    TOTAL_F integer,
    TOTAL_S integer,
    TOTAL_E integer,
    SALARIO_DIARIO numeric(15,2),
    IMPORTE_FALTAS numeric(15,2),
    ANIO integer,
    MES integer,
    DIA integer,
    FECHA_AUX varchar(10),
    FECHA_INI date,
    FECHA_FIN date,
    DIA_INI_PER integer,
    DIA_FIN_PER integer,
    NMES_PER varchar(50),
    FECHA_TOMADA date,
    TIPO char(1),
    DIAS_F varchar(50),
    DIAS_OE varchar(50),
    DIAS_OS varchar(50),
    FALTAS_DIAS varchar(50))
as
BEGIN
  ANIO_NOM=:V_ANIO;
  MES_NOM=:V_MES;
  QUINCENA_NOM=:V_QUINCENA;
  FECHA_NOM=:V_FECHA_NOM;
  FECHA_AUX = CAST(:FECHA_NOM AS VARCHAR(10));
  MES=SUBSTRING(FECHA_AUX FROM 6 FOR 2);
  DIA_NOM=SUBSTRING(FECHA_AUX FROM 9 FOR 2);
  IF (:V_QUINCENA=1) THEN
    NQUINCENA_NOM='1RA';
  ELSE
    NQUINCENA_NOM='2DA';

  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';

  IF (:V_QUINCENA=1) THEN
  BEGIN
    DIA=16;
    IF (:V_MES=1) THEN
    BEGIN
      MES=12;
      ANIO=:V_ANIO-1;
    END
    ELSE
    BEGIN
      MES=:V_MES-1;
      ANIO=:V_ANIO;
    END
    FECHA_AUX=ANIO||'-'||MES||'-'||DIA;
    FECHA_INI=CAST(FECHA_AUX AS DATE);
    EXECUTE PROCEDURE FINMES(:FECHA_INI)
    RETURNING_VALUES FECHA_FIN;
    FECHA_AUX = CAST(:FECHA_FIN AS VARCHAR(10));
    DIA_INI_PER=DIA;
    DIA_FIN_PER=SUBSTRING(FECHA_AUX FROM 9 FOR 2);
  END
  ELSE
  BEGIN
    DIA=1;
    if (:V_MES = 1) then
    BEGIN
        MES = 12;
        ANIO = :V_ANIO - 1;
    END
    else
    BEGIN
        MES = :V_MES;
        ANIO = :V_ANIO;
    END

    FECHA_AUX=ANIO||'-'||MES||'-'||DIA;
    FECHA_INI=CAST(FECHA_AUX AS DATE);
    DIA_INI_PER=DIA;

    EXECUTE PROCEDURE FINMES(:FECHA_INI)
    RETURNING_VALUES FECHA_FIN;
    DIA=15;
    FECHA_AUX = CAST(:FECHA_FIN AS VARCHAR(10)); --ANIO||'-'||MES||'-'||DIA;
    DIA_FIN_PER = DIA;
    DIA_FIN_PER=SUBSTRING(FECHA_AUX FROM 9 FOR 2);
    FECHA_FIN=CAST(FECHA_AUX AS DATE);
  END

  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';

  SALARIO_DIARIO=0;
  FOR SELECT A.EMPLEADO_ID, A.NUMERO, A.NOMBRE_COMPLETO, B.NOMBRE DEPTO, C.NOMBRE PUESTO, A.SALARIO_DIARIO
  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)
  WHERE A.ESTATUS<>'B'
  ORDER BY A.NOMBRE_COMPLETO
  INTO EMPLEADO_ID, NUMERO, NOMBRE_COMPLETO, DEPTO, PUESTO, SALARIO_DIARIO
  DO
  BEGIN
    DIAS_FALTAS=0;
    IMPORTE_FALTAS=0;
    TOTAL_F=0;
    TOTAL_S=0;
    TOTAL_E=0;
    DIAS_F='';
    DIAS_OE='';
    DIAS_OS='';
    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 :FECHA_INI AND :FECHA_FIN
    INTO FECHA_TOMADA, TIPO
    DO
    BEGIN
        DIAS_FALTAS=DIAS_FALTAS+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;

    IMPORTE_FALTAS=SALARIO_DIARIO*DIAS_FALTAS;
    SUSPEND;
  END
END^

SET TERM ; ^

/* Following GRANT statements are generated automatically */

GRANT EXECUTE ON PROCEDURE FINMES TO PROCEDURE MGREPNOM_FALTAS;
GRANT SELECT ON EMPLEADOS TO PROCEDURE MGREPNOM_FALTAS;
GRANT SELECT ON DEPTOS_NO TO PROCEDURE MGREPNOM_FALTAS;
GRANT SELECT ON PUESTOS_NO TO PROCEDURE MGREPNOM_FALTAS;
GRANT SELECT ON MGNOM_FALVAC_EMPLEADOS TO PROCEDURE MGREPNOM_FALTAS;

/* Existing privileges on this procedure */

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