/************************************************************************************************************************
*                                                                                                                       *
* AJUSTE PARA QUE O TEMPO EM ALMOCO PRE-ASSINALADO SEJA CONSIDERADO COMO AUSENCIA                                       *
*                                                                                                                       *
* DATA: 28/09/2022                                                                                                      *
*                                                                                                                       *
*************************************************************************************************************************/

CREATE OR REPLACE FUNCTION       PONTODEMONST_DADOS( P_COMPETENCIA IN DATE,
                                               P_NRORG IN NUMBER,
                                               P_DIA IN DATE,
                                               P_PERIODO IN NUMBER,
                                               P_VINCULO IN NUMBER )
RETURN PONTODEMONST_TABLE PIPELINED
IS
  /*variï¿½veis auxiliares*/
  V_ALMOCO            NUMBER; /* Tempo em almoco no dia (horas) */
  V_ALMOCO_HORARIO    NUMBER; /* Intervalo de descanso previsto no horario (horas) */
  V_HORAS_TRABALHADAS NUMBER; /* Tempo trabalhado no dia considerando marcacoes validas e automaticas (horas) */
  V_AUSENCIA_INJ      NUMBER;
  V_AUSENCIA_JUS      NUMBER := 0;
  V_TIPO_VINCULO      NUMBER;
  V_ID_DIAAPURADO     VARCHAR2(1);
  C_TPVINC_EST        NUMBER := 2;
  /*tipo de vï¿½nculo estagiï¿½rio*/
  C_AUSJUS_EST        NUMBER := 0.25;
  /* Tempo de ausencia para estagiarios */
  C_NRORG_EX_EST      NUMBER := 20;
  /* Nrorg que restringira parametrizacoes de estgiarios */
  C_ALMOCO_REDUZIDO   NUMBER := 0.25; /* Tempo do intervalo reduzido (horas) */
  C_NRORG_EX_ALM_RED  NUMBER := 20; /* Organizacao habilitada a realizar o calculo de intervalo reduzido com marcacoes automaticas */
  C_HRS_LIMT_INT_REDZ NUMBER := 6;
  V_INTERVALOIGNORADO NUMBER := 0;
  V_NRHORDIAM         NUMBER;
  OUT_RECORD PONTODEMONST_TYPE := PONTODEMONST_TYPE ( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
BEGIN
  /* busca tipo de vï¿½nculo */
  SELECT NRTIPOVINCULOM
  INTO V_TIPO_VINCULO
  FROM GPE_VINCULOM
  WHERE NRORG      = P_NRORG
    AND NRVINCULOM = P_VINCULO;
  
  /* viniciusmayrink - 13/07/2022    - Adicionando busca pelo horario do dia para facilitar consultas futuras */
  /* Busca a escala/horario do vinculo */
  FOR C_NRHORDIAM IN (
    SELECT
      HT.NRHORDIAM INTO V_NRHORDIAM
    FROM GPE_ALTEESCALA AE
    JOIN GPE_HORARIOTURNO HT ON HT.NRORG = AE.NRORG
      AND HT.NRTURNO = AE.NRTURNO
      AND HT.IDATIVO = 'S'
      /* viniciusmayrink     - 31/08/2021 - Adicionando tratativa para busca do horario correto para o dia considerando escalas com mais de dois ciclos */
      AND HT.NRSEQHORARIO = (
        SELECT
            (MOD(NRDIASENTRE, QTHORARIOS) + 1) AS NRSEQHORARIO
        FROM (
          SELECT
            NRORG,
            NRTURNO,
            P_DIA - DTDATABASE AS NRDIASENTRE,
            (
              SELECT
                COUNT(*) AS QTHORARIOS
              FROM
                GPE_HORARIOTURNO
              WHERE
                NRORG = T.NRORG
                AND NRTURNO = T.NRTURNO
            ) QTHORARIOS
        FROM GPE_TURNO T
        WHERE
          T.NRORG = AE.NRORG
          AND T.NRTURNO = AE.NRTURNO
        )
      )
    WHERE AE.NRORG = P_NRORG
      AND AE.NRVINCULOM = P_VINCULO
      AND AE.DTINIESCALA = ( SELECT MAX(DTINIESCALA) FROM GPE_ALTEESCALA
                            WHERE DTINIESCALA <= P_DIA
                              AND NRORG = AE.NRORG
                              AND NRVINCULOM = AE.NRVINCULOM )
      AND ROWNUM = 1
  )
  LOOP
    V_NRHORDIAM := C_NRHORDIAM.NRHORDIAM;
  END LOOP;
  
  /* viniciusmayrink - 20/07/2022    - Incluido o calculo de horas trabalhadas dentro do dia considerando marcacoes validas e automaticas */
  FOR C_TOTAL_HORAS_TRABALHADAS IN (
    SELECT
      SUM(ROUND(((DTHRAJUSTADA_FIM - DTHRAJUSTADA) * 24), 5)) VALOR
    FROM (
      SELECT
        NRVINCULOM,
        ROW_NUMBER() OVER(
          ORDER BY DTHRAJUSTADA
        ) AS SEQUENCIA_INTERVALO,
        DTHRAJUSTADA,
        LEAD(DTHRAJUSTADA, 1, TO_DATE('01/01/2000')) OVER(
           ORDER BY DTHRAJUSTADA
        ) DTHRAJUSTADA_FIM
      FROM GPE_MARCACAOPONTO
      WHERE NRORG = P_NRORG
          AND NRVINCULOM = P_VINCULO
          AND NRCOLETOR NOT IN (21, 22, 25)
          AND (
            CASE
              WHEN IDDIAOCORRENCIA IN ('FA', 'DA') THEN
                TRUNC(DTHRAJUSTADA) - 1
              WHEN IDDIAOCORRENCIA IN ('FS', 'DS') THEN
                TRUNC(DTHRAJUSTADA) + 1
              ELSE
                TRUNC(DTHRAJUSTADA)
            END
          ) = P_DIA
      ORDER BY
        DTHRAJUSTADA
    ) WHERE DTHRAJUSTADA_FIM <> '01/01/2000'
        AND MOD(SEQUENCIA_INTERVALO, 2) <> 0
    GROUP BY NRVINCULOM
  )
  LOOP
    V_HORAS_TRABALHADAS := C_TOTAL_HORAS_TRABALHADAS.VALOR;
  END LOOP;
  
  /*Verifica se o ponto do dia foi apurado*/
  SELECT CASE WHEN MAX(MP.DTHRAJUSTADA) IS NOT NULL AND MAX(RSF.DTAPURACAOSITUFREQ) IS NULL THEN 'N'
                                                                                            ELSE 'S'
    END ID_DIAAPURADO
  INTO V_ID_DIAAPURADO
  FROM GPE_MARCACAOPONTO MP
  LEFT JOIN PTO_RESUMOSITUFREQ RSF ON RSF.NRORG              = MP.NRORG
                                  AND RSF.NRVINCULOM         = MP.NRVINCULOM
                                  /* viniciusmayrink  - 03/05/2022 */
                                  AND RSF.DTAPURACAOSITUFREQ = (
                                    CASE WHEN MP.IDDIAOCORRENCIA IN ('FS', 'DS') THEN
                                        TRUNC(MP.DTHRAJUSTADA, 'DD') + 1
                                    WHEN MP.IDDIAOCORRENCIA IN ('FA', 'DA') THEN
                                        TRUNC(MP.DTHRAJUSTADA, 'DD') - 1
                                    ELSE TRUNC(MP.DTHRAJUSTADA, 'DD') END
                                  )
                                  AND RSF.NRPERIODOAPURACAO  = P_PERIODO
  WHERE MP.NRORG                     = P_NRORG
    AND MP.NRVINCULOM                = P_VINCULO
    /* viniciusmayrink  - 03/05/2022 */
    AND (
        CASE WHEN MP.IDDIAOCORRENCIA IN ('FS', 'DS') THEN
            TRUNC(MP.DTHRAJUSTADA, 'DD') + 1
        WHEN MP.IDDIAOCORRENCIA IN ('FA', 'DA') THEN
            TRUNC(MP.DTHRAJUSTADA, 'DD') - 1
        ELSE TRUNC(MP.DTHRAJUSTADA, 'DD') END
    ) = P_DIA
    /* viniciusmayrink  - 01/07/2021 */
    AND MP.NRCOLETOR                NOT IN (21, 22) /*ignora as balizas*/ ;
  OUT_RECORD.ID_DIAAPURADO := V_ID_DIAAPURADO;
  /*horï¿½rio de entrada e saida do funcionï¿½rio*/
  FOR C_ENT_SAI IN
    ( SELECT NVL(RES.EFM, RES.EEM) ENTRADA,
             COALESCE(RES.ULT_MARC, RES.SFM, RES.SEM) SAIDA
      FROM ( SELECT TO_CHAR(EE.DTHRMARCACAOPONTO, 'HH24:MI') EEM,
                    TO_CHAR(EF.DTHRMARCACAOPONTO, 'HH24:MI') EFM,
                    TO_CHAR(SE.DTHRMARCACAOPONTO, 'HH24:MI') SEM,
                    TO_CHAR(SF.DTHRMARCACAOPONTO, 'HH24:MI') SFM,
                    (
                        SELECT
                            TO_CHAR(MAX(MP2.DTHRMARCACAOPONTO), 'HH24:MI') DTHRMARCACAOPONTO
                        FROM
                            GPE_MARCACAOPONTO MP2
                        WHERE
                            MP2.NRORG = P_NRORG AND
                            MP2.NRVINCULOM = P_VINCULO AND
                            IDMARCDESPREZADA = 'N' AND
                            /* viniciusmayrink  - 01/07/2021 */
                            NRCOLETOR NOT IN (21, 22) AND
                            (
                                (
                                    TRUNC(DTHRMARCACAOPONTO, 'DD') = P_DIA AND
                                    IDDIAOCORRENCIA IN ('DC', 'FC')
                                ) OR
                                (
                                    TRUNC(DTHRMARCACAOPONTO, 'DD') = P_DIA + 1 AND
                                    IDDIAOCORRENCIA IN ('DA', 'FA')
                                ) OR
                                (
                                    TRUNC(DTHRMARCACAOPONTO, 'DD') = P_DIA - 1 AND
                                    IDDIAOCORRENCIA IN ('DS', 'FS')
                                )
                            ) AND
                            EXISTS (
                                SELECT
                                    1
                                FROM
                                    GPE_MARCACAOPONTO MP3
                                    LEFT JOIN
                                    PTO_PROGOCORRENCIA PO ON
                                        PO.NRORG = MP3.NRORG AND
                                        PO.NRMARCACAOPONTO = MP3.NRMARCACAOPONTO
                                    LEFT JOIN
                                    PTO_MOTIVOOCORFREQ MO ON
                                        MO.NRORG = PO.NRORG AND
                                        MO.NRMOTIVOOCORFREQ = PO.NRMOTIVOOCORFREQ
                                WHERE
                                    MP3.NRORG = MP2.NRORG AND
                                    MP3.NRVINCULOM = MP2.NRVINCULOM AND
                                    MO.IDTIPOINTERVALO = 'TRABALHO' AND
                                    IDMARCDESPREZADA = 'N' AND
                                    /* viniciusmayrink  - 01/07/2021 */
                                    NRCOLETOR NOT IN (21, 22) AND
                                    MP3.DTHRMARCACAOPONTO = SE.DTHRMARCACAOPONTO
                            )
                    ) ULT_MARC
             FROM DUAL
             LEFT JOIN ( SELECT MIN(DTHRMARCACAOPONTO) DTHRMARCACAOPONTO
                         FROM GPE_MARCACAOPONTO MP2
                            LEFT JOIN
                            PTO_PROGOCORRENCIA PO ON
                                PO.NRORG = MP2.NRORG AND
                                PO.NRMARCACAOPONTO = MP2.NRMARCACAOPONTO
                            LEFT JOIN
                            PTO_MOTIVOOCORFREQ MO ON
                                MO.NRORG = PO.NRORG AND
                                MO.NRMOTIVOOCORFREQ = PO.NRMOTIVOOCORFREQ
                         WHERE
                            /* viniciusmayrink  - 01/07/2021 */
                            MP2.NRCOLETOR NOT IN (21, 22) /*evita as balizas*/
                           AND MP2.IDMARCDESPREZADA = 'N'
                           AND (
                                MP2.IDREFERINTERVALO IS NULL /*evita que intervalos antes da jornada sejam considerados como ENTRADA*/
                             OR MP2.IDREFERINTERVALO != 'S'
                             OR MO.IDTIPOINTERVALO = 'TRABALHO'
                           )
                           AND MP2.NRORG            = P_NRORG
                           AND MP2.NRVINCULOM       = P_VINCULO
                           AND ( ( TRUNC(MP2.DTHRMARCACAOPONTO, 'DD') = P_DIA     AND IDDIAOCORRENCIA IN ('DC', 'FC') )
                              OR ( TRUNC(MP2.DTHRMARCACAOPONTO, 'DD') = P_DIA + 1 AND IDDIAOCORRENCIA IN ('DA', 'FA') )
                              OR ( TRUNC(MP2.DTHRMARCACAOPONTO, 'DD') = P_DIA - 1 AND IDDIAOCORRENCIA IN ('DS', 'FS') ) )
                       ) EE ON 1 = 1
             LEFT JOIN ( SELECT DTHRMARCACAOPONTO
                         FROM GPE_MARCACAOPONTO MP2
                         WHERE
                            /* viniciusmayrink  - 01/07/2021 */
                            NRCOLETOR NOT IN (21, 22) /*evita as balizas*/
                           AND IDFIXAENTSAID    = 'E' /*entrada*/
                           AND IDMARCDESPREZADA = 'N'
                           AND NRORG            = P_NRORG
                           AND NRVINCULOM       = P_VINCULO
                           AND ( ( TRUNC(DTHRMARCACAOPONTO, 'DD') = P_DIA     AND IDDIAOCORRENCIA IN ('DC', 'FC') )
                              OR ( TRUNC(MP2.DTHRMARCACAOPONTO, 'DD') = P_DIA + 1 AND IDDIAOCORRENCIA IN ('DA', 'FA') )
                              OR ( TRUNC(MP2.DTHRMARCACAOPONTO, 'DD') = P_DIA - 1 AND IDDIAOCORRENCIA IN ('DS', 'FS') ) )
                       ) EF ON 1 = 1
             LEFT JOIN ( SELECT
                            MAX(MP2.DTHRMARCACAOPONTO) DTHRMARCACAOPONTO
                         FROM GPE_MARCACAOPONTO MP2
                            LEFT JOIN
                            PTO_PROGOCORRENCIA PO ON
                                    PO.NRORG = MP2.NRORG AND
                                    PO.NRMARCACAOPONTO = MP2.NRMARCACAOPONTO
                            LEFT JOIN
                            PTO_MOTIVOOCORFREQ MO ON
                                MO.NRORG = PO.NRORG AND
                                MO.NRMOTIVOOCORFREQ = PO.NRMOTIVOOCORFREQ
                         WHERE
                            /* viniciusmayrink  - 01/07/2021 */
                            MP2.NRCOLETOR NOT IN (21, 22) /*evita as balizas*/
                            AND (
                                MP2.IDREFERINTERVALO IS NULL /*evita que intervalos após jornada sejam considerados como SAIDA*/
                             OR MP2.IDREFERINTERVALO != 'S'
                             )
                           AND MP2.IDMARCDESPREZADA = 'N'
                           AND MP2.NRORG            = P_NRORG
                           AND MP2.NRVINCULOM       = P_VINCULO
                           AND ( ( TRUNC(MP2.DTHRMARCACAOPONTO, 'DD') = P_DIA     AND MP2.IDDIAOCORRENCIA IN ('DC', 'FC') )
                              OR ( TRUNC(MP2.DTHRMARCACAOPONTO, 'DD') = P_DIA + 1 AND IDDIAOCORRENCIA IN ('DA', 'FA') )
                              OR ( TRUNC(MP2.DTHRMARCACAOPONTO, 'DD') = P_DIA - 1 AND IDDIAOCORRENCIA IN ('DS', 'FS') ) )
                       ) SE ON 1 = 1
             LEFT JOIN ( SELECT DTHRMARCACAOPONTO
                         FROM GPE_MARCACAOPONTO MP2
                         WHERE
                            /* viniciusmayrink  - 01/07/2021 */
                            NRCOLETOR NOT IN (21, 22) /*evita as balizas*/
                         AND (
                                IDREFERINTERVALO IS NULL /*evita que intervalos após jornada sejam considerados como SAIDA*/
                             OR IDREFERINTERVALO != 'S'
                         )
                           AND IDFIXAENTSAID = 'S'  /*entrada*/
                           AND IDMARCDESPREZADA = 'N'
                           AND NRORG = P_NRORG
                           AND NRVINCULOM = P_VINCULO
                           AND ( ( TRUNC(DTHRMARCACAOPONTO, 'DD') = P_DIA     AND IDDIAOCORRENCIA IN ('DC', 'FC') )
                              OR ( TRUNC(MP2.DTHRMARCACAOPONTO, 'DD') = P_DIA + 1 AND IDDIAOCORRENCIA IN ('DA', 'FA') )
                              OR ( TRUNC(MP2.DTHRMARCACAOPONTO, 'DD') = P_DIA - 1 AND IDDIAOCORRENCIA IN ('DS', 'FS') ) )
                       ) SF ON 1 = 1
           ) RES
    )
  LOOP
    OUT_RECORD.ENTRADA := C_ENT_SAI.ENTRADA;
    OUT_RECORD.SAIDA   := C_ENT_SAI.SAIDA;
  END LOOP;
  /*tempo de almoï¿½o e verificaï¿½ï¿½o de dia vï¿½lido para a apuraï¿½ï¿½o (IDPROGOCORCONFIRMADA ID_PROGOCOR)*/
  V_ALMOCO := NULL;
  FOR C_ALMOCO IN
    (  SELECT
             IDPROGOCORCONFIRMADA ID_PROGOCOR,
             /* viniciusmayrink - 28/05/2021 - Adicionada tratativa para mostrar o intervalo real se a escala nao projetar */
             CASE
                /* Case original, projeta intervalo*/
                WHEN EH.IDPROJETAINTERVALO = 'S' THEN SUBSTR(ALMOCO, -4, 2) + ( SUBSTR(ALMOCO, -2, 2) / 60 )
                /* Novo calculo, ausencia de almoco real. 27/06/2022: Incluindo trunc dos segundos */
                ELSE ROUND(((TRUNC(MP_ENTRADA.DTHRMARCACAOPONTO, 'MI') - TRUNC(MP_SAIDA.DTHRMARCACAOPONTO, 'MI')) * 24), 4)
             END ALMOCO_DEC,
             SUBSTR(ALMOCO, -4, 2) + ( SUBSTR(ALMOCO, -2, 2) / 60 ) ALMOCO_HORARIO
      FROM ( SELECT MAX(HT.NRHORARIOTURNO),
                    --HT.NRHORARIOTURNO,
                    AE.NRVINCULOM,
                    AE.NRESCALATRABM,
                    AE.NRORG,
                    OC.NRMARCACAOPONTO,
--                    CASE WHEN EH.IDPROJETAINTERVALO = 'S' THEN
                        NVL(LPAD(OC.HRPROJETARINTERVALONPROG, 4, '0'), LPAD(IH.HRPROJETARINTERVALO, 4, '0')) ALMOCO,
--                        ELSE '0030'
--                    END ALMOCO,
                    OC.IDPROGOCORCONFIRMADA
             FROM GPE_ALTEESCALA AE
             JOIN GPE_HORARIOTURNO HT ON HT.NRORG = AE.NRORG
                                     AND HT.NRTURNO = AE.NRTURNO
                                     AND HT.IDATIVO = 'S'
                                     /* viniciusmayrink     - 31/08/2021 - Adicionando tratativa para busca do horario correto para o dia considerando escalas com mais de dois ciclos */
                                     AND HT.NRSEQHORARIO = (
                                        SELECT
                                            (MOD(NRDIASENTRE, QTHORARIOS) + 1) AS NRSEQHORARIO
                                        FROM (
                                            SELECT
                                                NRORG,
                                                NRTURNO,
                                                P_DIA - DTDATABASE AS NRDIASENTRE,
                                                (
                                                    SELECT
                                                        COUNT(*) AS QTHORARIOS
                                                    FROM
                                                        GPE_HORARIOTURNO
                                                    WHERE
                                                        NRORG = T.NRORG
                                                        AND NRTURNO = T.NRTURNO
                                                ) QTHORARIOS
                                            FROM GPE_TURNO T
                                            WHERE
                                                T.NRORG = AE.NRORG
                                                AND T.NRTURNO = AE.NRTURNO
                                        )
                                     )
             JOIN GPE_HORDIAH HDH ON HDH.NRORG = AE.NRORG
                                 AND HDH.NRHORDIAM = HT.NRHORDIAM
                                 --AND HDH.IDTIPOHORARIO != 'F'
                                 AND HDH.DTMESCOMPETENC = ( SELECT MAX(DTMESCOMPETENC) FROM GPE_HORDIAH
                                                            WHERE DTMESCOMPETENC <= P_DIA
                                                              AND NRORG = AE.NRORG
                                                             AND NRHORDIAM = HT.NRHORDIAM )
             LEFT JOIN GPE_INTERVALOSHORARIO IH ON IH.NRORG = AE.NRORG
                                               AND IH.NRHORDIAM = HT.NRHORDIAM
                                               AND IH.HRPROJETARINTERVALO IS NOT NULL
             /*se nï¿½o houver marcaï¿½ï¿½o este nï¿½o traz o horï¿½rio de almoï¿½o*/
             /* viniciusmayrink - 14/12/2021    - Alterando buscas fixas por coletores de marcacao digitada */
             JOIN GPE_MARCACAOPONTO MP ON MP.NRCOLETOR                      NOT IN (
                                            SELECT NRCOLETOR
                                            FROM GPE_PARAMORG
                                            UNPIVOT (NRCOLETOR FOR NRCOLETOR_TIPO IN (NRCOLETORMARCAUTOM , NRCOLETORMARCGERSIST, NRCOLETORMARCVIRADIA, NRCOLETORMARCPROJETADA))
                                            WHERE NRORG = P_NRORG
                                       )
                                      AND MP.IDMARCDESPREZADA               = 'N'
                                      AND MP.NRORG                          = AE.NRORG
                                      AND MP.NRVINCULOM                     = AE.NRVINCULOM
                                      AND (
                                        (MP.IDDIAOCORRENCIA IN ('FA', 'DA') AND TRUNC(MP.DTHRMARCACAOPONTO, 'DD') - 1   = P_DIA) OR
                                        (MP.IDDIAOCORRENCIA IN ('FS', 'DS') AND TRUNC(MP.DTHRMARCACAOPONTO, 'DD') + 1   = P_DIA) OR
                                        /* viniciusmayrink  - 23/10/2021     - Permitindo que intervalos de descanso considerem a variacao de IDDIAOCORRENCIA */
                                        (MP.IDDIAOCORRENCIA IN ('FC', 'DC') AND TRUNC(MP.DTHRMARCACAOPONTO, 'DD')       = P_DIA)
                                      )
             JOIN PTO_PROGOCORRENCIA OC ON OC.NRORG            = AE.NRORG
                                       AND OC.NRMARCACAOPONTO  = MP.NRMARCACAOPONTO
                                       /* viniciusmayrink  - 23/10/2021     - Permitindo que intervalos de descanso considerem a variacao de IDDIAOCORRENCIA */
                                       --AND TRUNC(OC.DTINICIOPROGOCOR) = P_DIA
                                       --AND TRUNC(OC.DTFIMPROGOCOR)    = P_DIA
                                       AND OC.NRTIPOPROGOCORRENCIA IN (20,26)
									   AND OC.NRVINCULOM       = AE.NRVINCULOM
             /* TIPO DE OCORRENCIA 'IDENTIFICA INTERVALO' REFERENTE A ALMOï¿½O */
             WHERE AE.NRORG = P_NRORG
               AND AE.NRVINCULOM = P_VINCULO
               AND AE.DTINIESCALA = ( SELECT MAX(DTINIESCALA) FROM GPE_ALTEESCALA
                                      WHERE DTINIESCALA <= P_DIA
                                        AND NRORG = AE.NRORG
                                        AND NRVINCULOM = AE.NRVINCULOM )
			   AND ( OC.HRPROJETARINTERVALONPROG IS NOT NULL OR IH.HRPROJETARINTERVALO IS NOT NULL )
              GROUP BY IH.HRPROJETARINTERVALO, OC.HRPROJETARINTERVALONPROG, AE.NRVINCULOM, OC.IDPROGOCORCONFIRMADA, AE.NRESCALATRABM, AE.NRORG, OC.NRMARCACAOPONTO
            ) PRINCIPAL
            /* viniciusmayrink  - 28/05/2021. 27/06/2022: Adicionando filtro por competencia */
            LEFT JOIN GPE_ESCALATRABH EH ON EH.NRORG = P_NRORG AND EH.NRESCALATRABM = PRINCIPAL.NRESCALATRABM AND EH.DTMESCOMPETENC = (
                SELECT MAX(DTMESCOMPETENC) FROM GPE_ESCALATRABH WHERE NRORG = EH.NRORG AND NRESCALATRABM = EH.NRESCALATRABM AND DTMESCOMPETENC <= P_COMPETENCIA
            )
            /* viniciusmayrink  - 28/05/2021 */                           
            LEFT JOIN GPE_MARCACAOPONTO MP_SAIDA ON MP_SAIDA.NRORG = P_NRORG
                                                AND MP_SAIDA.NRVINCULOM = PRINCIPAL.NRVINCULOM
                                                AND MP_SAIDA.NRMARCACAOPONTO = PRINCIPAL.NRMARCACAOPONTO
            /* viniciusmayrink  - 28/05/2021 */
            LEFT JOIN GPE_MARCACAOPONTO MP_ENTRADA ON MP_ENTRADA.NRORG = P_NRORG
                                                AND MP_ENTRADA.NRVINCULOM = PRINCIPAL.NRVINCULOM
                                                AND MP_ENTRADA.DTHRMARCACAOPONTO = (
                                                    SELECT MIN(DTHRMARCACAOPONTO)
                                                    FROM GPE_MARCACAOPONTO
                                                    WHERE NRORG = MP_ENTRADA.NRORG
                                                        AND NRVINCULOM = MP_ENTRADA.NRVINCULOM
                                                        AND DTHRMARCACAOPONTO > MP_SAIDA.DTHRMARCACAOPONTO
                                                        /* viniciusmayrink   - 31/05/2021 - CONSIDEDRA CASOS DE VIRADA DE DIA, PRA BUSCAR A PROXIMA BATIDA */
                                                        AND (
                                                            TRUNC(DTHRMARCACAOPONTO) = TRUNC(MP_SAIDA.DTHRMARCACAOPONTO)
                                                            OR (TRUNC(DTHRMARCACAOPONTO) - 1 = TRUNC(MP_SAIDA.DTHRMARCACAOPONTO) AND IDDIAOCORRENCIA IN ('FA', 'DA') AND MP_SAIDA.IDDIAOCORRENCIA IN ('FC', 'DC'))
                                                            OR (TRUNC(DTHRMARCACAOPONTO) - 1 = TRUNC(MP_SAIDA.DTHRMARCACAOPONTO) AND IDDIAOCORRENCIA IN ('FC', 'DC') AND MP_SAIDA.IDDIAOCORRENCIA IN ('FS', 'DS'))
                                                        )
                                                        /* viniciusmayrink - 14/12/2021    - Alterando buscas fixas por coletores de marcacao digitada */
                                                        AND NRCOLETOR NOT IN (23, 21, 22, 25)
                                                        /*AND NRCOLETOR NOT IN (
                                                            SELECT NRCOLETOR
                                                            FROM GPE_PARAMORG
                                                            UNPIVOT (NRCOLETOR FOR NRCOLETOR_TIPO IN (NRCOLETORMARCAUTOM , NRCOLETORMARCGERSIST, NRCOLETORMARCVIRADIA, NRCOLETORMARCPROJETADA))
                                                            WHERE NRORG = P_NRORG
                                                        )*/
                                                )
  )
  LOOP
    V_ALMOCO               := C_ALMOCO.ALMOCO_DEC;
    V_ALMOCO_HORARIO       := C_ALMOCO.ALMOCO_HORARIO;
    OUT_RECORD.ALMOCO      := C_ALMOCO.ALMOCO_DEC;
    OUT_RECORD.ID_PROGOCOR := C_ALMOCO.ID_PROGOCOR;
  END LOOP;
  
  /* viniciusmayrink - 13/07/2022    - Adicionando busca por intervalos de descanso com marcacoes automaticas */
  /* Busca por intervalos automaticos, considerando que a saida prevista para o descanso possui marcacao automatica */
  IF P_NRORG = C_NRORG_EX_ALM_RED AND V_ALMOCO IS NULL THEN
    FOR C_ALMOCO_AUTOMATICO IN (
      SELECT * FROM (
        SELECT
          MP.NRVINCULOM,
          MP.DTHRMARCACAOPONTO,
          MP_ENTRADA.DTHRMARCACAOPONTO DTHRMARCACAOPONTO_ENTRADA,
          ROUND(((TRUNC(MP_ENTRADA.DTHRMARCACAOPONTO, 'MI') - TRUNC(MP.DTHRMARCACAOPONTO, 'MI')) * 24), 4) ALMOCO_AUTOMATICO
        FROM GPE_MARCACAOPONTO MP /* Marcacao de saida para o almoco automatico */
        /* Marcacao de volta do almoco automatico */
        JOIN GPE_MARCACAOPONTO MP_ENTRADA ON MP_ENTRADA.NRORG = MP.NRORG
          AND MP_ENTRADA.NRVINCULOM = MP.NRVINCULOM
          AND MP_ENTRADA.NRCOLETOR = MP.NRCOLETOR
          AND MP_ENTRADA.DTHRMARCACAOPONTO = (
            SELECT MIN(DTHRMARCACAOPONTO)
            FROM GPE_MARCACAOPONTO
            WHERE NRORG = MP_ENTRADA.NRORG
              AND NRVINCULOM = MP_ENTRADA.NRVINCULOM
              AND NRCOLETOR = MP_ENTRADA.NRCOLETOR
              AND DTHRMARCACAOPONTO > MP.DTHRMARCACAOPONTO
              AND (
                CASE WHEN IDDIAOCORRENCIA IN ('FS', 'DS') THEN
                  TRUNC(DTHRAJUSTADA, 'DD') + 1
                WHEN IDDIAOCORRENCIA IN ('FA', 'DA') THEN
                  TRUNC(DTHRAJUSTADA, 'DD') - 1
                ELSE TRUNC(DTHRAJUSTADA, 'DD') END
              ) = TRUNC(MP.DTHRAJUSTADA)
          )
        WHERE MP.NRORG = P_NRORG
          AND MP.NRVINCULOM = P_VINCULO
          AND MP.NRCOLETOR = 23 /* Busca por marcacoes automaticas */
          AND (
            CASE WHEN MP.IDDIAOCORRENCIA IN ('FS', 'DS') THEN
              TRUNC(MP.DTHRMARCACAOPONTO, 'DD') + 1
            WHEN MP.IDDIAOCORRENCIA IN ('FA', 'DA') THEN
              TRUNC(MP.DTHRMARCACAOPONTO, 'DD') - 1
            ELSE TRUNC(MP.DTHRMARCACAOPONTO, 'DD') END
          ) = P_DIA
          /* Garante que serao considerados somente horarios com saida para o intervalo de descanso definido como automatico */
          AND EXISTS (
            SELECT 1
            FROM GPE_INTERVALOSHORARIO
            WHERE NRORG = MP.NRORG
              AND NRHORDIAM = V_NRHORDIAM
              AND NRSEQINTERVHORARIO = 1
              AND IDCTRLMARCSAIDA = 'A'
          )
          /* Garante que serao considerados somente horarios com saida para o intervalo de descanso definido como automatico */
          AND EXISTS (
            SELECT 1
            FROM GPE_INTERVALOSHORARIO
            WHERE NRORG = MP.NRORG
              AND NRHORDIAM = V_NRHORDIAM
              AND NRSEQINTERVHORARIO = 2
              AND IDCTRLMARCENTRADA = 'A'
          )
          /* Garante que existem marcacoes apos a marcacao automatica de volta para o almoco */
          AND EXISTS (
            SELECT 1
            FROM GPE_MARCACAOPONTO
            WHERE NRORG = MP.NRORG
              AND NRVINCULOM = MP.NRVINCULOM
              AND (
                CASE WHEN IDDIAOCORRENCIA IN ('FS', 'DS') THEN
                  TRUNC(DTHRMARCACAOPONTO, 'DD') + 1
                WHEN IDDIAOCORRENCIA IN ('FA', 'DA') THEN
                  TRUNC(DTHRMARCACAOPONTO, 'DD') - 1
                ELSE TRUNC(DTHRMARCACAOPONTO, 'DD') END
              ) = P_DIA
              AND NRCOLETOR NOT IN (23, 21, 22, 25)
              AND DTHRMARCACAOPONTO > MP_ENTRADA.DTHRMARCACAOPONTO
          )
          /* Garante que existem marcacoes anteriores a marcacao automatica de saida para o almoco */
          AND EXISTS (
            SELECT 1
            FROM GPE_MARCACAOPONTO
            WHERE NRORG = MP.NRORG
              AND NRVINCULOM = MP.NRVINCULOM
              AND (
                CASE WHEN IDDIAOCORRENCIA IN ('FS', 'DS') THEN
                  TRUNC(DTHRMARCACAOPONTO, 'DD') + 1
                WHEN IDDIAOCORRENCIA IN ('FA', 'DA') THEN
                  TRUNC(DTHRMARCACAOPONTO, 'DD') - 1
                ELSE TRUNC(DTHRMARCACAOPONTO, 'DD') END
              ) = P_DIA
              AND NRCOLETOR NOT IN (23, 21, 22, 25)
              AND DTHRMARCACAOPONTO < MP.DTHRMARCACAOPONTO
          )
        ORDER BY MP.DTHRAJUSTADA
      )
      WHERE ROWNUM = 1
    )
    LOOP
      /* viniciusmayrink - 20/07/2022    - Incluindo meios de contabilizar ausencias injustificadas em intervalos automativos caso o tempo trabalhado seja inferior ao limite */
      IF C_ALMOCO_AUTOMATICO.ALMOCO_AUTOMATICO IS NOT NULL AND V_HORAS_TRABALHADAS IS NOT NULL AND V_HORAS_TRABALHADAS <= C_HRS_LIMT_INT_REDZ THEN
        V_ALMOCO            := C_ALMOCO_REDUZIDO;
      ELSE
        V_ALMOCO            := C_ALMOCO_AUTOMATICO.ALMOCO_AUTOMATICO;
      END IF;
      V_ALMOCO_HORARIO      := V_ALMOCO;
      OUT_RECORD.ALMOCO     := V_ALMOCO;
    END LOOP;
  END IF;
  /*ausï¿½ncia injustificada - h:m em dec*/
  FOR C_AUSENCIA_INJ IN
    ( SELECT SUM(DECODE(MOD(ORD.LA, 2), 1, ORD.HR, 0)) - SUM(DECODE(MOD(ORD.LA, 2), 0, ORD.HR, 0)) HR_DEC,
             ORD.NRTIPOVINCULOM TPVINC
      FROM ( SELECT ROW_NUMBER() OVER (ORDER BY PRI.DTHRMARCACAOPONTO, PRI.NRMARCACAOPONTO ) LA,
                    ROW_NUMBER() OVER (ORDER BY PRI.DTHRMARCACAOPONTO DESC, pri.NRMARCACAOPONTO DESC) LB,
                    PRI.DIA,
                    PRI.DTHRMARCACAOPONTO,
                    PRI.NRCOLETOR,
                    PRI.IDMARCDESPREZADA,
                    PRI.NRORG,
                    PRI.NRVINCULOM,
                    DECODE(PRI.IDDIAOCORRENCIA, 'FA', PRI.HR + 24, PRI.HR) HR,
                    PRI.NRMARCACAOPONTO,
                    PRI.NRTIPOVINCULOM
             FROM ( SELECT PRI2.*,
                           LAG(PRI2.OCORR, 1, 0) OVER (ORDER BY PRI2.LA) AS OCORR2
                    FROM ( SELECT ROW_NUMBER() OVER (ORDER BY MP.DTHRMARCACAOPONTO, MP.NRMARCACAOPONTO) LA,
                                  ROW_NUMBER() OVER (ORDER BY MP.DTHRMARCACAOPONTO DESC, MP.NRMARCACAOPONTO DESC) LB,
                                  TRUNC(MP.DTHRMARCACAOPONTO, 'DD') DIA,
                                  MP.DTHRMARCACAOPONTO,
                                  MP.NRCOLETOR,
                                  MP.IDMARCDESPREZADA,
                                  MP.NRORG,
                                  MP.NRVINCULOM,
                                  /*MP.IDMARCDESPREZADA,*/
                                  ROUND((TRUNC(MP.DTHRMARCACAOPONTO, 'MI') - TRUNC(MP.DTHRMARCACAOPONTO, 'DD')) / 0.04166667, 5) HR,
                                  MP.IDDIAOCORRENCIA,
                                  MP.NRMARCACAOPONTO,
                                  VM.NRTIPOVINCULOM,
                                  CASE
                                    WHEN (SELECT DTHRMARCACAOPONTO FROM GPE_MARCACAOPONTO
                                          WHERE NRCOLETOR NOT IN (21)
                                            AND IDFIXAENTSAID = 'S'
                                            AND IDMARCDESPREZADA = 'N'
                                            AND NRORG = P_NRORG
                                            AND NRVINCULOM = P_VINCULO
                                            AND NRMARCACAOPONTO = MP.NRMARCACAOPONTO
                                            /*AND DTHRMARCACAOPONTO = mp.DTHRMARCACAOPONTO*/
                                         ) IS NOT NULL THEN 1
                                    WHEN (SELECT NRMARCACAOPONTO FROM PTO_PROGOCORRENCIA
                                          WHERE NRORG = MP.NRORG
                                            AND NRVINCULOM = MP.NRVINCULOM
                                            AND NRTIPOPROGOCORRENCIA = 17
                                            AND IDPROGOCORCONFIRMADA = 'S'
                                            AND DTINICIOPROGOCOR = TRUNC(MP.DTHRMARCACAOPONTO, 'DD')
                                            AND DTFIMPROGOCOR = TRUNC(MP.DTHRMARCACAOPONTO, 'DD')
                                            AND NRMARCACAOPONTO = MP.NRMARCACAOPONTO ) IS NULL THEN 0
                                    ELSE 1
                                  END OCORR
                           FROM GPE_MARCACAOPONTO MP
                           JOIN GPE_VINCULOM VM ON VM.NRORG = MP.NRORG
                                               AND VM.NRVINCULOM = MP.NRVINCULOM
                           WHERE MP.NRORG      = P_NRORG
                             AND MP.NRVINCULOM = P_VINCULO
                             AND ( ( TRUNC(MP.DTHRMARCACAOPONTO, 'DD') = P_DIA     AND MP.IDDIAOCORRENCIA IN ('DC', 'FC') )
                                OR ( TRUNC(MP.DTHRMARCACAOPONTO, 'DD') = P_DIA + 1 AND MP.IDDIAOCORRENCIA = 'FA' ) )
                             AND MP.NRCOLETOR NOT IN (21)
                             AND MP.IDMARCDESPREZADA = 'N'
                           ORDER BY MP.DTHRMARCACAOPONTO, MP.NRMARCACAOPONTO
                         ) PRI2
                    WHERE ( ( MOD(PRI2.LB, 2) = 1 AND PRI2.NRCOLETOR != 25 )
                           OR MOD(PRI2.LB, 2) = 0 )
                    ORDER BY PRI2.LA
                  ) PRI
             WHERE PRI.OCORR != 1 --eliminando os extremos
               AND PRI.OCORR2 != 1
           ) ORD
      WHERE ORD.LA != 1
        AND ORD.LB != 1
      GROUP BY ORD.NRTIPOVINCULOM
    )
  LOOP
    /* Quantidade de ausï¿½ncia ignorada */
    SELECT NVL(SUM(QTINTERVMARCDIURNO), 0) QTINTERVALOIGNORADO
    INTO V_INTERVALOIGNORADO
    FROM PTO_INTERVALOSMARCACAO
    JOIN ( SELECT NRMARCACAOPONTO                                            INICIO,
                  LEAD(NRMARCACAOPONTO, 1) OVER (ORDER BY DTHRMARCACAOPONTO) FIM,
                  ROW_NUMBER() OVER (ORDER BY DTHRMARCACAOPONTO)             LINHA
           FROM GPE_MARCACAOPONTO
           WHERE NRORG                          = P_NRORG
             AND NRVINCULOM                     = P_VINCULO
             /* viniciusmayrink - 14/12/2021    - Alterando buscas fixas por coletores de marcacao digitada */
             AND NRCOLETOR                      NOT IN (
                    SELECT NRCOLETOR
                    FROM GPE_PARAMORG
                    UNPIVOT (NRCOLETOR FOR NRCOLETOR_TIPO IN (NRCOLETORMARCAUTOM , NRCOLETORMARCGERSIST, NRCOLETORMARCVIRADIA, NRCOLETORMARCPROJETADA))
                    WHERE NRORG = P_NRORG
               )
             AND TRUNC(DTHRMARCACAOPONTO, 'DD') = P_DIA
           ORDER BY DTHRMARCACAOPONTO
         ) I ON I.INICIO        = NRMARCACAOPONTOINI
            AND I.FIM           = NRMARCACAOPONTOFIM
            AND MOD(I.LINHA, 2) = 0
    WHERE NRORG               = P_NRORG
      AND IDINTERVALOMARCACAO = 'I';
    /* viniciusmayrink  - 02/07/2021 - Restringir tratativas especificas de estagiario somente para a org. 20 */
    IF P_NRORG = C_NRORG_EX_EST AND C_AUSENCIA_INJ.TPVINC = C_TPVINC_EST THEN
      IF C_AUSENCIA_INJ.HR_DEC > C_AUSJUS_EST THEN
        V_AUSENCIA_INJ := C_AUSENCIA_INJ.HR_DEC - C_AUSJUS_EST;
        V_AUSENCIA_JUS := C_AUSJUS_EST /*- V_INTERVALOIGNORADO*/;
      ELSE
        IF C_AUSENCIA_INJ.HR_DEC <= C_AUSJUS_EST THEN
          V_AUSENCIA_INJ := V_INTERVALOIGNORADO;
          V_AUSENCIA_JUS := C_AUSENCIA_INJ.HR_DEC - V_INTERVALOIGNORADO;
        END IF;
      END IF;  
    ELSE /*se nï¿½o houver ausï¿½ncia injustificada nï¿½o deve ser descontado o horï¿½rio de almoï¿½o*/
      -- V_AUSENCIA_INJ := C_AUSENCIA_INJ.HR_DEC - V_ALMOCO;
      /* viniciusmayrink    - 01/07/2022 - Comparacao alterada para o tempo de descanso previsto no horario. 13/07/2022. Adicionando NVL para que o todo o tempo em ausencia seja considerado caso nao exista ocorrencia de almoco */
      IF C_AUSENCIA_INJ.HR_DEC > NVL(V_ALMOCO_HORARIO, 0) THEN
        /* viniciusmayrink  - 28/05/2021 - ROUND Adicionado para evitar diferenças pequenas quando o intervalo nao eh projetado. 01/07/2022: Comparacao realizada com o previsto no horario. 13/07/2022. Adicionando NVL para que o todo o tempo em ausencia seja considerado caso nao exista ocorrencia de almoco */
        V_AUSENCIA_INJ := ROUND(C_AUSENCIA_INJ.HR_DEC - NVL(V_ALMOCO_HORARIO, 0), 4);
        /* viniciusmayrink  - 01/07/2022 - Limitacao do intervalo de almoco ao previsto no horario */
        V_ALMOCO := V_ALMOCO_HORARIO;
      ELSE
        V_AUSENCIA_INJ := 0;
      END IF;
    END IF;
    OUT_RECORD.AU_INJU := V_AUSENCIA_INJ;
    /* viniciusmayrink  - 01/07/2022 - Limitacao do intervalo de almoco ao previsto no horario */
    OUT_RECORD.ALMOCO := V_ALMOCO;
  END LOOP;
  
  OUT_RECORD.AU_INJU := V_AUSENCIA_INJ;
  
  /*ausï¿½ncia justificada - h:m em dec*/
  FOR C_AUSENCIA_JUS IN
    ( SELECT SUM(DECODE(MOD(ORD.LA, 2), 0, ORD.HR, 0)) - SUM(DECODE(MOD(ORD.LA, 2), 1, ORD.HR, 0)) HR_DEC
      FROM ( SELECT ROW_NUMBER() OVER (ORDER BY PRI.DTHRMARCACAOPONTO, PRI.NRMARCACAOPONTO ) LA,
                    ROW_NUMBER() OVER (ORDER BY PRI.DTHRMARCACAOPONTO DESC, pri.NRMARCACAOPONTO DESC) LB,
                    PRI.DIA,
                    PRI.DTHRMARCACAOPONTO,
                    PRI.NRCOLETOR,
                    PRI.IDMARCDESPREZADA,
                    PRI.NRORG,
                    PRI.NRVINCULOM,
                    PRI.HR,
                    PRI.NRMARCACAOPONTO
             FROM ( SELECT PRI2.*,
                           LAG(PRI2.OCORR, 1, 0) OVER (ORDER BY PRI2.LA) AS OCORR2
                    FROM ( SELECT ROW_NUMBER() OVER (ORDER BY MP.DTHRMARCACAOPONTO, MP.NRMARCACAOPONTO) LA,
                                  ROW_NUMBER() OVER (ORDER BY MP.DTHRMARCACAOPONTO DESC, MP.NRMARCACAOPONTO DESC) LB,
                                  TRUNC(MP.DTHRMARCACAOPONTO, 'DD') DIA,
                                  MP.DTHRMARCACAOPONTO,
                                  MP.NRCOLETOR,
                                  MP.IDMARCDESPREZADA,
                                  MP.NRORG,
                                  MP.NRVINCULOM,
                                  /*MP.IDMARCDESPREZADA,*/
                                  ROUND((TRUNC(MP.DTHRMARCACAOPONTO, 'MI') - TRUNC(MP.DTHRMARCACAOPONTO, 'DD')) / 0.04166667, 5) + DECODE(MP.IDDIAOCORRENCIA, 'FA', 24, 0) HR,
                                  MP.NRMARCACAOPONTO,
                                  CASE
                                    WHEN ( SELECT NRMARCACAOPONTO FROM PTO_PROGOCORRENCIA
                                           WHERE PTO_PROGOCORRENCIA.NRORG                = MP.NRORG
                                             AND PTO_PROGOCORRENCIA.NRVINCULOM           = MP.NRVINCULOM
                                             AND PTO_PROGOCORRENCIA.NRTIPOPROGOCORRENCIA = 17
                                             AND PTO_PROGOCORRENCIA.IDPROGOCORCONFIRMADA = 'S'
                                             AND PTO_PROGOCORRENCIA.DTINICIOPROGOCOR     = TRUNC(MP.DTHRMARCACAOPONTO, 'DD')
                                             AND PTO_PROGOCORRENCIA.DTFIMPROGOCOR        = TRUNC(MP.DTHRMARCACAOPONTO, 'DD')
                                             AND PTO_PROGOCORRENCIA.NRMARCACAOPONTO      = MP.NRMARCACAOPONTO
                                             AND NOT EXISTS ( SELECT 1 FROM PTO_MOTIVOOCORFREQ
                                                              WHERE PTO_MOTIVOOCORFREQ.NRMOTIVOOCORFREQ  = PTO_PROGOCORRENCIA.NRMOTIVOOCORFREQ
                                                                AND PTO_MOTIVOOCORFREQ.NRORG             = PTO_PROGOCORRENCIA.NRORG
                                                                AND PTO_MOTIVOOCORFREQ.IDTIPOINTERVALO   = 'TRABALHO'
                                                                AND PTO_PROGOCORRENCIA.DTINICIOPROGOCOR >= '21/09/2016' ) /* condicionada verificaï¿½ï¿½o do parï¿½metro 'IDTIPOINTERVALO' como 'TRABALHO' somente apï¿½s 21/09/2016 */
                                         ) IS NULL THEN 0
                                    ELSE 1
                                  END OCORR
                           FROM GPE_MARCACAOPONTO MP
                           WHERE MP.NRORG = P_NRORG
                             AND MP.NRVINCULOM = P_VINCULO
                             AND ( ( TRUNC(MP.DTHRMARCACAOPONTO, 'DD') = P_DIA     AND MP.IDDIAOCORRENCIA IN ('DC', 'FC') )
                                OR ( TRUNC(MP.DTHRMARCACAOPONTO, 'DD') = P_DIA + 1 AND MP.IDDIAOCORRENCIA = 'FA' ) )
                             AND MP.NRCOLETOR != 21
                             AND MP.IDMARCDESPREZADA = 'N' --resolvendo problemas de ausï¿½ncia justificada 25/04/2016
                           ORDER BY MP.DTHRMARCACAOPONTO, MP.NRMARCACAOPONTO
                         ) PRI2
                    WHERE ( ( MOD(PRI2.LB, 2) = 1 AND PRI2.NRCOLETOR != 25 )
                           OR MOD(PRI2.LB, 2) = 0)
                    ORDER BY PRI2.LA
                  ) PRI
             WHERE ( PRI.OCORR = 1 OR PRI.OCORR2 = 1 )
           ) ORD
    )
  LOOP
    IF C_AUSENCIA_JUS.HR_DEC IS NULL THEN /*verifica se existe ausï¿½ncia justificada...*/
      IF NVL(V_ALMOCO, 0) > 0 /*se existir a ausï¿½ncia jus. este verifica se o dia 'existe' via almoco*/
        THEN V_AUSENCIA_JUS := 0; /*a ausï¿½ncia jus. nï¿½o existe mas o dia existe (tem almoco) entï¿½o o valor ï¿½ 0*/
     END IF;
    ELSE V_AUSENCIA_JUS := NVL(C_AUSENCIA_JUS.HR_DEC, 0) + V_AUSENCIA_JUS; /*ausï¿½ncia jus. existe*/
    END IF;
    OUT_RECORD.AU_JUST := V_AUSENCIA_JUS;
  END LOOP;
  /*ausï¿½ncia total - h:m em dec*/
  OUT_RECORD.AU_TOTA := NVL(V_AUSENCIA_INJ, 0) + NVL(V_AUSENCIA_JUS, 0);
  /*horas trabalhadas, banco de horas - h:m em dec*/
  FOR C_BANCO_HR IN
    ( SELECT
        CASE
          WHEN NVL(RES.DIF_TRAB, 0) < 0 THEN NVL(DECODE(RES.TRAB, ABS(RES.TRAB), RES.TRAB, 0), 0) + NVL(RES.TRAB_II, 0) + NVL(RES.TRAB_NOTURNO, 0)
          ELSE NVL(DECODE(RES.TRAB, ABS(RES.TRAB), RES.TRAB, 0), 0) + NVL(RES.TRAB_II, 0) + NVL(RES.TRAB_NOTURNO, 0) + NVL(RES.DIF_TRAB, 0) + NVL(RES.HE_NORM, 0) + NVL(RES.HE_NOTURNA_NORM, 0)
        END TRAB,
        NVL(DECODE(RES.TRAB, ABS(RES.TRAB), RES.TRAB, 0), 0) + NVL(RES.TRAB_II, 0) + NVL(RES.TRAB_NOTURNO, 0) AS TRAB_NORM,
        CASE
          WHEN NVL(RES.DIF_TRAB, 0) > 0 THEN RES.DIF_TRAB + NVL(RES.HE_NORM, 0)
          WHEN RES.ATRASOS_HR IS NOT NULL AND NVL(RES.BHR_ACR, 0) != RES.ATRASOS_HR
            THEN (NVL(RES.ATRASOS_HR, 0) + NVL(ATRASOS_NOTURNOS, 0) + NVL(RES.SAIDAS_DIURNA, 0) + NVL(RES.SAIDAS_NOTURNA, 0)) * -1
          ELSE NVL(RES.DIF_TRAB, 0) + NVL(RES.HE_NORM, 0) - (NVL(RES.SAIDAS_DIURNA, 0) + NVL(RES.SAIDAS_NOTURNA, 0) + NVL(ATRASOS_NOTURNOS, 0) + NVL(RES.ATRASOS_HR, 0))
        END DIF_TRAB,
        CASE
          WHEN NVL(RES.DIF_TRAB, 0) > 0 THEN RES.DIF_TRAB
          WHEN RES.ATRASOS_HR IS NOT NULL AND NVL(RES.BHR_ACR, 0) != RES.ATRASOS_HR
            THEN (NVL(RES.ATRASOS_HR, 0) + NVL(ATRASOS_NOTURNOS, 0) + NVL(RES.SAIDAS_DIURNA, 0) + NVL(RES.SAIDAS_NOTURNA, 0)) * -1
          ELSE NVL(RES.DIF_TRAB, 0) - (NVL(RES.SAIDAS_DIURNA, 0) + NVL(RES.SAIDAS_NOTURNA, 0) + NVL(ATRASOS_NOTURNOS, 0) + NVL(RES.ATRASOS_HR, 0))
        END BH_DESC_DIA,
        RES.BHR_NORM,
        RES.BHR_ACR,
        /*NVL(RES.HE_NORM, 0) + NVL(RES.HE_NOTURNA_NORM, 0) AS HE_NORM,*/
        /* NOVA SOMA DE HORAS EXTRAS, CONSIDERANDO TAMBÉM EX_1AS E FOLGA_1AS  */
        NVL(RES.HE_NORM, 0) + NVL(RES.HE_NOTURNA_NORM, 0) + NVL(RES.HE_1AS, 0) + NVL(RES.HE_FOLGA_1AS, 0) + NVL(RES.HE_1AS_NOT, 0) + NVL(RES.HE_FOLGA_NOT_1AS, 0) + NVL(RES.HE_FERIAD_1AS, 0) + NVL(RES.HE_FERIAD_NOT_1AS, 0) + NVL(RES.HE_SABADO_DIA_1AS, 0) + NVL(RES.HE_SABADO_NOT_1AS, 0) AS HE_NORM,
        NVL(RES.HE_N_AT, 0) + NVL(RES.HE_NOTURNA_N_AT, 0) + NVL(RES.HE_DIURNA_FOLGA_I_N_AT, 0) + NVL(RES.HE_DIURNA_FOLGA_II_N_AT, 0) + NVL(RES.HE_NOTURNA_I_N_AT, 0) + NVL(RES.HE_DIURNA_FERIAD_I_N_AT, 0) + NVL(RES.HE_DIURNA_FERIAD_II_N_AT, 0) + NVL(RES.HE_NOTURNA_FOLGA_I_N_AT, 0) + NVL(RES.HE_NOTURNA_FOLGA_II_N_AT, 0) AS HE_N_AT,
        (NVL(RES.ATRASOS_HR, 0) + NVL(ATRASOS_NOTURNOS, 0) + NVL(RES.SAIDAS_DIURNA, 0) + NVL(RES.SAIDAS_NOTURNA, 0)) * -1 AS ATRASOS_HR,
        /* viniciusmayrink  - 02/07/2021 - Somar faltas noturnas as diurnas considerando escalascom trabalho noturno */
        /* RES.ATRASOS_DIA, */
        CASE
            WHEN RES.ATRASOS_DIA IS NULL AND RES.ATRASOS_NOT IS NULL
                THEN NULL
            ELSE NVL(RES.ATRASOS_DIA, 0) + NVL(RES.ATRASOS_NOT, 0)
        END AS ATRASOS_DIA,
        NVL(RES.HORAS_A_FOLGAR, 0) AS HORAS_A_FOLGAR,
        /* viniciusmayrink  - 31/05/2021 - ADICAO DO VALOR DE ADICIONAL NOTURNO */
        NVL(RES.ADICIONAL_NOTURNO, 0) AS ADICIONAL_NOTURNO
        FROM ( SELECT RSF.QTREFAPURSITUFREQ HORAS,
                      /* viniciusmayrink    31/05/2021 - BUSCA DE ASSOCIACAO DE SITUACAO DE FREQUENCIA. BUSCA PELA ORG DO CLIENTE, SENAO PELA ORG PADRAO */
                      /* RSF.NRSITUFREQUENCIA, */
                      NVL(ASSOC_SF.NRCALCULOSITUFREQ, RSF.NRSITUFREQUENCIA) AS NRCALCULOSITUFREQ,
                      RSF.NRVINCULOM,
                      RSF.NRORG,
                      RSF.DTAPURACAOSITUFREQ
               FROM PTO_RESUMOSITUFREQ RSF
               /* viniciusmayrink    31/05/2021 - BUSCA DE ASSOCIACAO DE SITUACAO DE FREQUENCIA. BUSCA PELA ORG DO CLIENTE, SENAO PELA ORG PADRAO */
                LEFT JOIN (
                     SELECT
                        SF.NRSITUFREQUENCIA,
                        NVL(ASSOC_CLIENT.NRCALCULOSITUFREQ, ASSOC_PADRAO.NRCALCULOSITUFREQ) AS NRCALCULOSITUFREQ
                     FROM PTO_SITUFREQUENCIA SF
                     LEFT JOIN PTO_ASSOCSITUFREQ ASSOC_PADRAO ON ASSOC_PADRAO.NRORG = 0 AND ASSOC_PADRAO.NRSITUFREQUENCIA = SF.NRSITUFREQUENCIA
                     LEFT JOIN PTO_ASSOCSITUFREQ ASSOC_CLIENT ON ASSOC_CLIENT.NRORG = P_NRORG AND ASSOC_CLIENT.NRSITUFREQUENCIA = SF.NRSITUFREQUENCIA
                        /* FILTRO QUE BUSCA SOMENTE A PADRAO CASO EXISTAM VARIOS CALC ASSOCIADOS A UMA SITUFREQ DO CLIENTE */
                        AND (
                            (SF.NRORG = 0           AND ASSOC_CLIENT.NRSITUFREQUENCIA = ASSOC_CLIENT.NRCALCULOSITUFREQ)
                            OR (SF.NRORG <> 0)
                        )
                        /* SE EXISTIREM 2 CALCULOS ASSOCIADOS A UMS SITUFREQ, APENAS A PRIMEIRA EH CONSIDERADA */
                        AND NOT EXISTS (
                            SELECT 1
                            FROM PTO_ASSOCSITUFREQ
                            WHERE NRORG = P_NRORG
                                AND NRSITUFREQUENCIA = ASSOC_CLIENT.NRSITUFREQUENCIA
                                AND NRASSOCSITUFREQ <  ASSOC_CLIENT.NRASSOCSITUFREQ
                        )
                     WHERE
                        (SF.NRORG = P_NRORG OR SF.NRORG = 0)
                ) ASSOC_SF ON ASSOC_SF.NRSITUFREQUENCIA = RSF.NRSITUFREQUENCIA
               WHERE RSF.NRVINCULOM         = P_VINCULO
                 AND RSF.NRPERIODOAPURACAO  = P_PERIODO
                 AND RSF.DTAPURACAOSITUFREQ = P_DIA
                 AND RSF.NRORG              = P_NRORG
             ) PIVOT ( SUM(HORAS) FOR NRCALCULOSITUFREQ IN ( 100 TRAB, 200 TRAB_II, 300 TRAB_NOTURNO, 18000 DIF_TRAB, 18020 BHR_NORM, 18420 BHR_ACR, 2300 HE_NORM, 2200 HE_1AS, 2900 HE_1AS_NOT, 3700 HE_FOLGA_1AS, 4400 HE_FOLGA_NOT_1AS, 6700 HE_FERIAD_1AS, 7400 HE_FERIAD_NOT_1AS, 5200 HE_SABADO_DIA_1AS, 5900 HE_SABADO_NOT_1AS, 2100 HE_N_AT, 2600 HE_NOTURNA_I_N_AT, 10100 ATRASOS_HR, 10200 ATRASOS_NOTURNOS, 10500 ATRASOS_DIA, 10600 ATRASOS_NOT, 10300 SAIDAS_DIURNA, 10400 SAIDAS_NOTURNA, 3000 HE_NOTURNA_NORM, 2700 HE_NOTURNA_N_AT, 3500 HE_DIURNA_FOLGA_I_N_AT, 3600 HE_DIURNA_FOLGA_II_N_AT, 4100 HE_NOTURNA_FOLGA_I_N_AT, 4200 HE_NOTURNA_FOLGA_II_N_AT, 6500 HE_DIURNA_FERIAD_I_N_AT, 6600 HE_DIURNA_FERIAD_II_N_AT, 16100 HORAS_A_FOLGAR, 9000 ADICIONAL_NOTURNO) ) RES
        WHERE EXISTS ( SELECT 1 FROM GPE_MARCACAOPONTO
                       WHERE NRCOLETOR != 21 /*evita as balizas*/
                         AND IDMARCDESPREZADA = 'N'
                         AND NRORG = RES.NRORG
                         AND NRVINCULOM = RES.NRVINCULOM
                         AND TRUNC(DTHRMARCACAOPONTO, 'DD') = RES.DTAPURACAOSITUFREQ )
           OR NOT EXISTS ( SELECT 1 FROM PTO_PROGOCORRENCIA
                           WHERE NRORG                = RES.NRORG
                             AND NRVINCULOM           = RES.NRVINCULOM
                             AND RES.DTAPURACAOSITUFREQ BETWEEN TRUNC(DTINICIOPROGOCOR, 'DD') AND TRUNC(DTFIMPROGOCOR, 'DD')
                             AND IDPROGOCORCONFIRMADA = 'S'
                             /*AND DTINICIOPROGOCOR = RES.DTAPURACAOSITUFREQ
                             AND DTFIMPROGOCOR = RES.DTAPURACAOSITUFREQ*/
                             AND NRTIPOPROGOCORRENCIA = 5
                             /*AND IDTIPODIACALENDARIO != 'FERIADO'*/ )
    )
  LOOP
    IF V_TIPO_VINCULO = C_TPVINC_EST AND P_NRORG = 20 THEN
      OUT_RECORD.TRABALH   := C_BANCO_HR.TRAB + C_BANCO_HR.HORAS_A_FOLGAR;
      OUT_RECORD.TRAB_NORM := C_BANCO_HR.TRAB_NORM + C_BANCO_HR.HORAS_A_FOLGAR;
      OUT_RECORD.HE_NAUT   := 0;
    ELSE
      OUT_RECORD.TRABALH   := C_BANCO_HR.TRAB;
      OUT_RECORD.TRAB_NORM := C_BANCO_HR.TRAB_NORM;
      OUT_RECORD.HE_NAUT   := C_BANCO_HR.HE_N_AT;
    END IF;
    OUT_RECORD.DIF_TRA     := C_BANCO_HR.DIF_TRAB;
    OUT_RECORD.BH_DESC_DIA := C_BANCO_HR.BH_DESC_DIA;
    OUT_RECORD.BH_S_AC     := C_BANCO_HR.BHR_NORM;
    OUT_RECORD.BH_C_AC     := C_BANCO_HR.BHR_ACR;
    OUT_RECORD.HE_AUTO     := C_BANCO_HR.HE_NORM;
    OUT_RECORD.FL_ATRA     := C_BANCO_HR.ATRASOS_HR;
    OUT_RECORD.FL_DIAS     := C_BANCO_HR.ATRASOS_DIA;
    /* viniciusmayrink  - 31/05/2021 - ADICAO DO VALOR DE ADICIONAL NOTURNO */
    OUT_RECORD.ADICIONAL_NOTURNO := C_BANCO_HR.ADICIONAL_NOTURNO;
  END LOOP;
  /* saldo de banco de horas - dia anterior */
  FOR C_SD_BH_ANTERIOR IN
    ( SELECT RSF.QTREFAPURSITUFREQ BH_DIA_ANT
             /*NVL(SUM(RSF.QTREFAPURSITUFREQ), 0) BH_DIA_ANT*/
      FROM PTO_RESUMOSITUFREQ RSF
      WHERE RSF.NRVINCULOM         = P_VINCULO
        AND ( RSF.NRPERIODOAPURACAO = P_PERIODO OR RSF.NRPERIODOAPURACAO = P_PERIODO - 1)
        AND RSF.NRSITUFREQUENCIA   = 18420
        AND RSF.NRORG              = P_NRORG
        AND RSF.DTAPURACAOSITUFREQ = ( SELECT MAX(DTAPURACAOSITUFREQ) FROM PTO_RESUMOSITUFREQ
                                       WHERE NRVINCULOM          = P_VINCULO
                                         AND (NRPERIODOAPURACAO = P_PERIODO OR NRPERIODOAPURACAO = P_PERIODO - 1)
                                         AND DTAPURACAOSITUFREQ <= TO_DATE(P_DIA) - 1
                                         AND NRSITUFREQUENCIA    = 18420
                                         AND NRORG               = P_NRORG )
    )
  LOOP
    OUT_RECORD.BH_DIA_ANT := C_SD_BH_ANTERIOR.BH_DIA_ANT;
  END LOOP;
  /*grava registro*/
  PIPE ROW (OUT_RECORD);
END ;
/