ALTER TABLE TBRH_CONFIGURACAO
    ADD SITUACAO_FALTA_ATESTADO INTEGER;


alter table TBRH_CONFIGURACAO
alter SITUACAO_SABADO position 1;

alter table TBRH_CONFIGURACAO
alter SITUACAO_DOMINGO position 2;

alter table TBRH_CONFIGURACAO
alter SITUACAO_FERIADO position 3;

alter table TBRH_CONFIGURACAO
alter SITUACAO_DIURNO position 4;

alter table TBRH_CONFIGURACAO
alter SITUACAO_NOTURNO position 5;

alter table TBRH_CONFIGURACAO
alter SITUACAO_FALTA position 6;

alter table TBRH_CONFIGURACAO
alter SITUACAO_ATRASO position 7;

alter table TBRH_CONFIGURACAO
alter SITUACAO_HORA_EXTRA position 8;

alter table TBRH_CONFIGURACAO
alter SITUACAO_BH position 9;

alter table TBRH_CONFIGURACAO
alter TRABALHO_DIURNO_INICIO position 10;

alter table TBRH_CONFIGURACAO
alter TRABALHO_DIURNO_FIM position 11;

alter table TBRH_CONFIGURACAO
alter TRABALHO_NOTURNO_INICIO position 12;

alter table TBRH_CONFIGURACAO
alter TRABALHO_NOTURNO_FIM position 13;

alter table TBRH_CONFIGURACAO
alter ADICIONAL_NOTURNO_INICIO position 14;

alter table TBRH_CONFIGURACAO
alter ADICIONAL_NOTURNO_FIM position 15;

alter table TBRH_CONFIGURACAO
alter DIAS_CONTRATO1 position 16;

alter table TBRH_CONFIGURACAO
alter DIAS_CONTRATO2 position 17;

alter table TBRH_CONFIGURACAO
alter ARQUIVO_PONTO position 18;

alter table TBRH_CONFIGURACAO
alter INTERVALO_BATIDA position 19;

alter table TBRH_CONFIGURACAO
alter PROXIMA_JORNADA_INICIO position 20;

alter table TBRH_CONFIGURACAO
alter PROXIMA_JORNADA_FIM position 21;

alter table TBRH_CONFIGURACAO
alter SITUACAO_FALTA_BH position 22;

alter table TBRH_CONFIGURACAO
alter SITUACAO_TRABALHO_BH position 23;

alter table TBRH_CONFIGURACAO
alter SITUACAO_NAO_IDENTIFICADA position 24;

alter table TBRH_CONFIGURACAO
alter SITUACAO_DEMITIDO position 25;

alter table TBRH_CONFIGURACAO
alter SITUACAO_FALTA_NOTURNO position 26;

alter table TBRH_CONFIGURACAO
alter SITUACAO_HORA_EXTRA_NOTURNO position 27;

alter table TBRH_CONFIGURACAO
alter SITUACAO_BH_NOTURNO position 28;

alter table TBRH_CONFIGURACAO
alter SITUACAO_TRABALHO_BH_NOTURNO position 29;

alter table TBRH_CONFIGURACAO
alter SITUACAO_FALTA_BH_NOTURNO position 30;

alter table TBRH_CONFIGURACAO
alter SITUACAO_FOLGA position 31;

alter table TBRH_CONFIGURACAO
alter SITUACAO_FALTA_ATESTADO position 32;

alter table TBRH_CONFIGURACAO
alter ID position 33;

/******************************************************************************/
/******************************************************************************/

SET TERM ^ ;

CREATE OR ALTER procedure SPU_TRATA_PONTO_MARCACAO (
    MATRICULA_INICIAL integer,
    MATRICULA_FINAL integer,
    DATA date)
returns (
    MATRICULA integer,
    ESCALA_ID integer,
    ESCALA_DIA1 integer,
    ESCALA_DIA integer,
    ESCALA_TIPO integer,
    SITUACAO_ID integer,
    HORAS integer,
    DATA_FERIADO date,
    DATA_DEMISSAO date)
as
declare variable DIA_DA_SEMANA integer;
declare variable PROGRAMACAO_ID integer;
declare variable ATESTADO_ID integer;
declare variable BH_TRAB_ID integer;
declare variable BH_COMP_ID integer;
declare variable HORA1 integer;
declare variable VHORA integer;
declare variable LIMITADO char(1);
declare variable SITNAOIDENT integer;
declare variable SDEM integer;
declare variable CODPROG integer;
declare variable FERIADO integer;
declare variable COMPBH_D integer;
declare variable COMPBH_N integer;
declare variable FALTABH_D integer;
declare variable FALTABH_N integer;
declare variable TRABBH_D integer;
declare variable TRABBH_N integer;
declare variable SITPROG integer;
declare variable DSR integer;
declare variable ADC integer;
declare variable ATEST integer;
declare variable TRABD integer;
declare variable TRABN integer;
declare variable HREXTRAD integer;
declare variable HREXTRAN integer;
declare variable FALTAD integer;
declare variable FALTAN integer;
declare variable VTEMPO_TRABALHO_TOTAL_D integer;
declare variable VTEMPO_TRABALHO_TOTAL_N integer;
declare variable VTEMPO_HORA_EXTRA1_TOTAL_D integer;
declare variable VTEMPO_HORA_EXTRA2_TOTAL_D integer;
declare variable VTEMPO_HORA_EXTRA1_TOTAL_N integer;
declare variable VTEMPO_HORA_EXTRA2_TOTAL_N integer;
declare variable VTEMPO_ATRASO_TOTAL_D integer;
declare variable VTEMPO_ATRASO_TOTAL_N integer;
declare variable VTEMPO_FALTA_TOTAL_D integer;
declare variable VTEMPO_FALTA_TOTAL_N integer;
declare variable SITUACAO_SABADO integer;
declare variable SITUACAO_DOMINGO integer;
declare variable SITUACAO_FERIADO integer;
declare variable SITUACAO_DIURNO integer;
declare variable SITUACAO_NOTURNO integer;
declare variable SITUACAO_FALTA integer;
declare variable SITUACAO_ATRASO integer;
declare variable SITUACAO_HORA_EXTRA integer;
declare variable SITUACAO_BH integer;
declare variable SITUACAO_FALTA_BH integer;
declare variable SITUACAO_TRABALHO_BH integer;
declare variable SITUACAO_NAO_IDENTIFICADA integer;
declare variable SITUACAO_DEMITIDO integer;
declare variable SITUACAO_FALTA_NOTURNO integer;
declare variable SITUACAO_HORA_EXTRA_NOTURNO integer;
declare variable SITUACAO_BH_NOTURNO integer;
declare variable SITUACAO_TRABALHO_BH_NOTURNO integer;
declare variable SITUACAO_FALTA_BH_NOTURNO integer;
declare variable SITUACAO_FOLGA integer;
declare variable SITUACAO_FALTA_ATESTADO integer;
declare variable SEQ integer;
declare variable OP char(1);
declare variable PERC_HREXTRA numeric(15,2);
declare variable TDIA integer;
declare variable TNOITE integer;
BEGIN

  DIA_DA_SEMANA = CAST(EXTRACT(WEEKDAY FROM CAST(:DATA AS DATE)) AS INTEGER)+1;

    FOR
    SELECT B.COLABORADOR_CODIGO,
           B.ESCALA_CODIGO,
           DIA1 as ESCALA_DIA1, --domingo
           IIF(:DIA_DA_SEMANA = 1,DIA1,
           IIF(:DIA_DA_SEMANA = 2,DIA2,
           IIF(:DIA_DA_SEMANA = 3,DIA3,
           IIF(:DIA_DA_SEMANA = 4,DIA4,
           IIF(:DIA_DA_SEMANA = 5,DIA5,
           IIF(:DIA_DA_SEMANA = 6,DIA6,
           IIF(:DIA_DA_SEMANA = 7,DIA7,0))))))) as ESCALA_DIA,
          (SELECT FIRST 1 DATA FROM TBPONTO_FERIADO WHERE DATA = :DATA) as DATA_FERIADO,
          (SELECT FIRST 1 DATA_DEMISSAO FROM TBCOLABORADOR WHERE CODIGO = B.COLABORADOR_CODIGO) as DATA_DEMISSAO,
           E.TIPO
    FROM   TBPONTO_CARTAO B, TBESCALA E
    WHERE B.COLABORADOR_CODIGO BETWEEN :MATRICULA_INICIAL AND :MATRICULA_FINAL
      AND E.CODIGO = B.ESCALA_CODIGO
      AND B.DATA = :DATA
    ORDER BY COLABORADOR_CODIGO
    INTO :MATRICULA,:ESCALA_ID,ESCALA_DIA1,:ESCALA_DIA,:DATA_FERIADO,:DATA_DEMISSAO, ESCALA_TIPO
    DO BEGIN
    
        FOR
        SELECT
            VTEMPO_TRABALHO_TOTAL_D,VTEMPO_TRABALHO_TOTAL_N,
            VTEMPO_HORA_EXTRA1_TOTAL_D,VTEMPO_HORA_EXTRA2_TOTAL_D,
            VTEMPO_HORA_EXTRA1_TOTAL_N,VTEMPO_HORA_EXTRA2_TOTAL_N,
            VTEMPO_ATRASO_TOTAL_D,VTEMPO_ATRASO_TOTAL_N,
            VTEMPO_FALTA_TOTAL_D,VTEMPO_FALTA_TOTAL_N,SITNAOIDENT,TDIA,TNOITE
        FROM SPC_TRATA_PONTO10 (:ESCALA_ID,:DATA,:MATRICULA)
        INTO :VTEMPO_TRABALHO_TOTAL_D,:VTEMPO_TRABALHO_TOTAL_N,
             :VTEMPO_HORA_EXTRA1_TOTAL_D,:VTEMPO_HORA_EXTRA2_TOTAL_D,
             :VTEMPO_HORA_EXTRA1_TOTAL_N,:VTEMPO_HORA_EXTRA2_TOTAL_N,
             :VTEMPO_ATRASO_TOTAL_D,:VTEMPO_ATRASO_TOTAL_N,
             :VTEMPO_FALTA_TOTAL_D,:VTEMPO_FALTA_TOTAL_N,:SITNAOIDENT,:TDIA,:TNOITE
        DO BEGIN
    
            TrabD = VTEMPO_TRABALHO_TOTAL_D;
            TrabN = VTEMPO_TRABALHO_TOTAL_N;
            HrExtraD = VTEMPO_HORA_EXTRA1_TOTAL_D + VTEMPO_HORA_EXTRA2_TOTAL_D;
            HrExtraN = VTEMPO_HORA_EXTRA1_TOTAL_N + VTEMPO_HORA_EXTRA2_TOTAL_N;
            FaltaD = VTEMPO_FALTA_TOTAL_D + VTEMPO_ATRASO_TOTAL_D;
            FaltaN = VTEMPO_FALTA_TOTAL_N + VTEMPO_ATRASO_TOTAL_N;
            --AtrasoD = VTEMPO_ATRASO_TOTAL_D;
            --AtrasoN = VTEMPO_ATRASO_TOTAL_N;
 
            vHORA     = 0;
            SDem      = 0;
            CodProg   = 0;
            Feriado   = 0;
            CompBH_D  = 0;
            CompBH_N  = 0;
            FaltaBH_D = 0;
            FaltaBH_N = 0;
            TrabBH_D  = 0;
            TrabBH_N  = 0;
            SitProg   = 0;
            DSR       = 0;
            ADC       = 0;
            ATEST     = 0;

            PROGRAMACAO_ID = 0;
            ATESTADO_ID = 0;
            HORA1 = 0;
            LIMITADO = 0;
            SITUACAO_ID = 0;

               /*Verifica Programacoes, Feriados, Banco de Horas Trabalhado e Compensado*/

               if (DIA_DA_SEMANA = 1 and ESCALA_DIA1 = '0') Then --Domingo
                   DSR = 1; else
               if (ESCALA_DIA = '0') Then
                   ADC = 1;

                FOR
                SELECT FIRST 1 A.ID, CAST(1439 AS INTEGER) AS HORA1, CAST('1' AS CHAR(1)) AS LIMITADO
                FROM TBCOLABORADOR_ATESTADO A
                WHERE (A.DATA_INICIAL <= :DATA AND A.DATA_FINAL >= :DATA)
                  AND A.COLABORADOR_CODIGO = :MATRICULA
                  AND A.SITUACAO = '2'
                INTO :ATESTADO_ID, :HORA1, :LIMITADO
                DO BEGIN
                   END

                FOR
                SELECT FIRST 1 A.CONTROLE,A.HORA1,A.LIMITADO,A.SITUACAO_CODIGO
                FROM TBPONTO_PROGRAMACAO A
                WHERE (A.DATA_INICIAL <= :DATA AND A.DATA_FINAL >= :DATA)
                  AND ((A.TODOS = '1')
                   OR ( A.COLABORADOR_CODIGO = :MATRICULA)
                   OR ( A.LOTE IN (SELECT C.LOTE FROM TBLOTE_CADASTRO C
                                   WHERE C.COLABORADOR_CODIGO = :MATRICULA)))
                INTO :PROGRAMACAO_ID, :HORA1, :LIMITADO, :SITUACAO_ID
                DO BEGIN
                   END

                FOR
                SELECT FIRST 1 1 as ID, A.HORA1, A.LIMITADO
                FROM TBBH_TRABALHADO A
                WHERE (A.DATA = :DATA)
                  AND((A.TODOS = '1')
                   OR (A.LOTE IN (SELECT C.LOTE FROM TBLOTE_CADASTRO C
                                   WHERE C.COLABORADOR_CODIGO = :MATRICULA)))
                INTO :BH_TRAB_ID, :HORA1, :LIMITADO
                DO BEGIN
                   END

                FOR
                SELECT FIRST 1 1 as ID, A.HORA1, A.LIMITADO
                FROM TBBH_COMPENSADO A
                WHERE (A.DATA = :DATA)
                  AND((A.TODOS = '1')
                   OR (A.LOTE IN (SELECT C.LOTE FROM TBLOTE_CADASTRO C
                                   WHERE C.COLABORADOR_CODIGO = :MATRICULA)))
                INTO :BH_COMP_ID, :HORA1, :LIMITADO
                DO BEGIN
                   END

               /*Funcionario Demitido*/
               if (:DATA_DEMISSAO <= :DATA and DATA_DEMISSAO is not null) then
                   Begin
                   SDem    = FaltaD+FaltaN;
                   FaltaD  = 0;
                   FaltaN  = 0;
                   DSR     = 0;
                   ADC     = 0;
                   End /*Funcionario Demitido*/

                   else

               /*Funcionario com Atestado*/
               if (ATESTADO_ID > 0) then
                  Begin
                  CodProg = 0;
                  ATEST = 1;
            
                  If (LIMITADO = '0') Then
                     Begin
                     SitNaoIdent = TrabD + HrExtraD + TrabN + HrExtraN;
                     SitProg = FaltaD+FaltaN;
                     TrabD   = 0;
                     TrabN   = 0;
                     HrExtraD= 0;
                     HrExtraN= 0;
                     FaltaD  = 0;
                     FaltaN  = 0;
                     end else
                  If (LIMITADO = '1') Then
                     Begin
                     If (Hora1 >= FaltaD+FaltaN) Then
                        Begin
                        SitProg = FaltaD+FaltaN;
                        FaltaD  = 0;
                        FaltaN  = 0;
                        end else
                     If (Hora1 < FaltaD+FaltaN) Then
                        Begin
                        If (Hora1 >= FaltaD) Then
                           Begin
                           vHORA = Hora1 - FaltaD;
                           FaltaD = 0;
                           end else
                           Begin
                           vHORA = 0;
                           FaltaD = (FaltaD) - Hora1;
                           end
            
                        FaltaN = FaltaN - vHORA;
                        SitProg = Hora1;
                        end
                     end
                  end /*Funcionario com Atestado*/

                  else

               /*Funcionario com Programacao*/
               if (PROGRAMACAO_ID > 0) then
                  Begin
                  CodProg = SITUACAO_ID;
                  ATEST = 0;
            
                  If (LIMITADO = '0') Then
                     Begin
                     SitNaoIdent = TrabD + HrExtraD + TrabN + HrExtraN;
                     SitProg = FaltaD+FaltaN;
                     TrabD   = 0;
                     TrabN   = 0;
                     HrExtraD= 0;
                     HrExtraN= 0;
                     FaltaD  = 0;
                     FaltaN  = 0;
                     end else
                  If (LIMITADO = '1') Then
                     Begin
                     If (Hora1 >= FaltaD+FaltaN) Then
                        Begin
                        SitProg = FaltaD+FaltaN;
                        FaltaD  = 0;
                        FaltaN  = 0;
                        end else
                     If (Hora1 < FaltaD+FaltaN) Then
                        Begin
                        If (Hora1 >= FaltaD) Then
                           Begin
                           vHORA = Hora1 - FaltaD;
                           FaltaD = 0;
                           end else
                           Begin
                           vHORA = 0;
                           FaltaD = (FaltaD) - Hora1;
                           end
            
                        FaltaN = FaltaN - vHORA;
                        SitProg = Hora1;
                        end
                     end
                  end /*Funcionario com Programacao*/

                  else

               /* Banco de Horas Trabalhado */
               if (BH_TRAB_ID > 0) then
                  Begin
                  DSR = 0;
                  ADC = 0;
            
                  If (Limitado = '0') Then
                     Begin
                     TrabBH_D  = TrabD;
                     FaltaBH_D = FaltaD;
                     TrabD     = 0;
                     FaltaD    = 0;
                     TrabBH_N  = TrabN;
                     FaltaBH_N = FaltaN;
                     TrabN     = 0;
                     FaltaN    = 0;
                     end else
                  If (Limitado = '1') Then
                     Begin
            
                     If (Hora1 >= TrabD+TrabN) Then
                        Begin
                        TrabBH_D = TrabD;
                        TrabBH_N = TrabN;

                        if (TrabN > 0) then
                            FaltaBH_N = Hora1 - TrabN; else
                            FaltaBH_D = Hora1 - TrabD;

                        TrabD    = 0;
                        TrabN    = 0;
                        end else
                        Begin
            
                        If (Hora1 >= TrabD) Then
                           Begin
                           TrabBH_D = TrabD;
                           vHora = Hora1 - TrabD;
                           TrabD = 0;
                           end else
                           Begin
                           vHora = 0;
                           TrabBH_D = Hora1;
                           TrabD = TrabD - Hora1;
                           end
            
                        If (vHora >= TrabN) Then
                           Begin
                           TrabBH_N = TrabN;
                           vHora = vHora - TrabN;
                           TrabN = 0;
                           end else
                           Begin
                           TrabBH_N = vHora;
                           TrabN    = TrabN - vHora;
                           vHora = 0;
                           end
            
                           FaltaBH_D = 0;
                           FaltaBH_N = 0;
                        end
            
                     FaltaN = 0;
                     FaltaD = 0;
                     end

                  end /* Banco de Horas Trabalhado */

               else

             /*Banco de Horas Compensado*/
               if (BH_COMP_ID > 0) then
                  Begin
                  If (Limitado = '0') Then
                     Begin
                     SitNaoIdent = TrabD+TrabN;
                     CompBH_D    = FaltaD;
                     CompBH_N    = FaltaN;
                     TrabD       = 0;
                     TrabN       = 0;
                     FaltaD      = 0;
                     FaltaN      = 0;
                     end else
                  If (Limitado = '1') Then
                     Begin
                     If (Hora1 >= FaltaD+FaltaN) Then
                        Begin
                        CompBH_D = FaltaD+FaltaN;
                        FaltaD   = 0;
                        FaltaN   = 0;
                        end else
                        Begin
            
                        If (Hora1 >= FaltaD) Then
                           Begin
                           vHora = Hora1 - FaltaD;
                           FaltaD = 0;
                           end else
                           Begin
                           vHora = 0;
                           FaltaD = FaltaD - Hora1;
                           end
            
                        FaltaN = FaltaN - vHora;
                        CompBH_D = Hora1;
                        end
                     end

                  end /*Banco de Horas Compensado*/

            /*Somente Feriado*/
               if (DATA_FERIADO is not null) then
                  Begin
                  HrExtraD = HrExtraD + TrabD;
                  HrExtraN = HrExtraN + TrabN;
                  Feriado  = FaltaD + FaltaN;
                  TrabD    = 0;
                  TrabN    = 0;
                  FaltaD   = 0;
                  FaltaN   = 0;
                  end /*Somente Feriado*/

                  else

            /* Dia compensado com marcacoes (Horas Extras) */
          --  If ((DmRh.IbEscalaTipo.Value = 1) or (DmRh.IbEscalaTipo.Value = 2)) and
              If ( TDia + TNoite > 0) Then -- 5x2 ou 6x1
                  Begin
                  if (DIA_DA_SEMANA = 1 and ESCALA_DIA1 = '0') Then -- Domingo
                      Begin
                      HrExtraD = TDia;
                      HrExtraN = TNoite;
                      FaltaD   = 0;
                      FaltaN   = 0;
                      TrabD    = 0;
                      TrabN    = 0;
                      end else
                  if (ESCALA_DIA = '0') Then
                      Begin
                      HrExtraD = TDia;
                      HrExtraN = TNoite;
                      FaltaD   = 0;
                      FaltaN   = 0;
                      TrabD    = 0;
                      TrabN    = 0;
                      end
                  end
               

               If (FaltaN   > 0) Then FaltaN   = Trunc( FaltaN   * (8/7) );
               If (HrExtraN > 0) Then HrExtraN = Trunc( HrExtraN * (8/7) );
               If (CompBH_N > 0) Then CompBH_N = Trunc( CompBH_N * (8/7) );
               If (TrabBH_N > 0) Then TrabBH_N = Trunc( TrabBH_N * (8/7) );

           END /* SPC_TRATA_PONTO10 */


            FOR
            SELECT SITUACAO_SABADO, SITUACAO_DOMINGO, SITUACAO_FERIADO, SITUACAO_DIURNO, SITUACAO_NOTURNO, SITUACAO_FALTA,
                   SITUACAO_ATRASO, SITUACAO_HORA_EXTRA, SITUACAO_BH, SITUACAO_FALTA_BH, SITUACAO_TRABALHO_BH,
                   SITUACAO_NAO_IDENTIFICADA, SITUACAO_DEMITIDO, SITUACAO_FALTA_NOTURNO, SITUACAO_HORA_EXTRA_NOTURNO,
                   SITUACAO_BH_NOTURNO, SITUACAO_TRABALHO_BH_NOTURNO, SITUACAO_FALTA_BH_NOTURNO, SITUACAO_FOLGA, SITUACAO_FALTA_ATESTADO
            FROM TBRH_CONFIGURACAO
            INTO :SITUACAO_SABADO, :SITUACAO_DOMINGO, :SITUACAO_FERIADO, :SITUACAO_DIURNO, :SITUACAO_NOTURNO,
            :SITUACAO_FALTA, :SITUACAO_ATRASO, :SITUACAO_HORA_EXTRA, :SITUACAO_BH,  :SITUACAO_FALTA_BH,
            :SITUACAO_TRABALHO_BH, :SITUACAO_NAO_IDENTIFICADA, :SITUACAO_DEMITIDO, :SITUACAO_FALTA_NOTURNO,
            :SITUACAO_HORA_EXTRA_NOTURNO, :SITUACAO_BH_NOTURNO, :SITUACAO_TRABALHO_BH_NOTURNO,
            :SITUACAO_FALTA_BH_NOTURNO, :SITUACAO_FOLGA, :SITUACAO_FALTA_ATESTADO
            DO BEGIN
    
             /* LIMPA SITUACOES GRAVADAS */
             DELETE FROM TbPonto_Cartao_Marcacao
             WHERE COLABORADOR_CODIGO = :MATRICULA AND DATA = :DATA;
             SEQ = 0;
    
             SITUACAO_ID = 0;
             HORAS = 0;

             /* COLABORADOR DEMITIDO */
             If (SDem > 0 AND SITUACAO_DEMITIDO > 0) Then
                Begin
                  SEQ = SEQ + 1;
                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :SITUACAO_DEMITIDO,
                  :SEQ,
                  0,
                  0,
                  Null
                  );

                  SITUACAO_ID = SITUACAO_DEMITIDO;
                  HORAS = 0;
                  --Suspend;
                End
    
             /* SABADO */
             If (ADC = 1 AND SITUACAO_SABADO > 0 and ESCALA_TIPO <> 4) Then
                Begin
                  SEQ = SEQ + 1;
                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :SITUACAO_SABADO,
                  :SEQ,
                  0,
                  0,
                  Null
                  );

                  SITUACAO_ID = SITUACAO_SABADO;
                  HORAS = 0;
                  --Suspend;
                End

             /* DOMINGO */
             If (DSR = 1 AND SITUACAO_DOMINGO > 0 and ESCALA_TIPO <> 4) Then
                Begin
                  SEQ = SEQ + 1;
                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :SITUACAO_DOMINGO,
                  :SEQ,
                  0,
                  0,
                  Null
                  );

                  SITUACAO_ID = SITUACAO_DOMINGO;
                  HORAS = 0;
                  --Suspend;
                End

             /* FERIADO */
             If (Feriado > 0 and SITUACAO_FERIADO > 0 and ESCALA_TIPO <> 4) Then
                Begin
                  SEQ = SEQ + 1;

                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :SITUACAO_FERIADO,
                  :SEQ,
                  :Feriado,
                  '0',
                  Null
                  );

                  SITUACAO_ID = SITUACAO_FERIADO;
                  HORAS = Feriado;
                  --Suspend;
                End

             /* FOLGA 12 x 36 */
             If ((ADC = 1 or DSR = 1 or Feriado > 0) AND SITUACAO_FOLGA > 0 AND ESCALA_TIPO = 4) Then
                Begin
                  SEQ = SEQ + 1;
                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :SITUACAO_FOLGA,
                  :SEQ,
                  0,
                  0,
                  Null
                  );

                  SITUACAO_ID = SITUACAO_FOLGA;
                  HORAS = 0;
                  --Suspend;
                End

             /* FALTA DIURNO */
             If (FaltaD > 0 and ADC = 0 and DSR = 0 and SITUACAO_FALTA > 0) Then
                Begin
                  SEQ = SEQ + 1;
                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :SITUACAO_FALTA,
                  :SEQ,
                  :FaltaD,
                  0,
                  Null
                  );

                  SITUACAO_ID = SITUACAO_FALTA;
                  HORAS = FaltaD;
                  --Suspend;
                End

             /* FALTA NOTURNO */
             If (FaltaN > 0 and ADC = 0 and DSR = 0 and SITUACAO_FALTA_NOTURNO > 0) Then
                Begin
                  SEQ = SEQ + 1;
                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :SITUACAO_FALTA_NOTURNO,
                  :SEQ,
                  :FaltaN,
                  0,
                  Null
                  );

                  SITUACAO_ID = SITUACAO_FALTA_NOTURNO;
                  HORAS = FaltaN;
                  --Suspend;
                End

             /* TRABALHO DIURNO */
             If (TrabD > 0 and SITUACAO_DIURNO > 0) Then
                Begin
                  SEQ = SEQ + 1;
                  OP = COALESCE((SELECT FIRST 1 COALESCE(OPERADOR_BH,'') FROM TBPONTO_SITUACAO WHERE CODIGO = :SITUACAO_DIURNO),''); -- Operador BH ( + OU - )

                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OPERADOR_BH,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :SITUACAO_DIURNO,
                  :SEQ,
                  :TrabD,
                  IIF(:OP IN ('+','-'),'1','0'),
                  :OP,
                  Null
                  );

                  SITUACAO_ID = SITUACAO_DIURNO;
                  HORAS = TrabD;
                  --Suspend;
                End

             /* TRABALHO NOTURNO */
             If (TrabN > 0 and SITUACAO_NOTURNO > 0) Then
                Begin
                  SEQ = SEQ + 1;
                  OP = COALESCE((SELECT FIRST 1 COALESCE(OPERADOR_BH,'') FROM TBPONTO_SITUACAO WHERE CODIGO = :SITUACAO_NOTURNO),''); -- Operador BH ( + OU - )

                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OPERADOR_BH,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :SITUACAO_NOTURNO,
                  :SEQ,
                  :TrabN,
                  IIF(:OP IN ('+','-'),'1','0'),
                  :OP,
                  Null
                  );

                  SITUACAO_ID = SITUACAO_NOTURNO;
                  HORAS = TrabN;
                  --Suspend;
                End

             /* HORA EXTRA DIURNO */
             If (HrExtraD > 0 and SITUACAO_HORA_EXTRA > 0) Then
                Begin
                  SEQ = SEQ + 1;
                  OP = COALESCE((SELECT FIRST 1 COALESCE(OPERADOR_BH,'') FROM TBPONTO_SITUACAO WHERE CODIGO = :SITUACAO_HORA_EXTRA),''); -- Operador BH ( + OU - )
                  PERC_HREXTRA = COALESCE((SELECT FIRST 1 COALESCE(Perc_HrExtra,0) FROM TBPONTO_SITUACAO WHERE CODIGO = :SITUACAO_HORA_EXTRA),0);  

                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OPERADOR_BH,PERC_HREXTRA,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :SITUACAO_HORA_EXTRA,
                  :SEQ,
                  :HrExtraD,
                  IIF(:OP IN ('+','-'),'1','0'),
                  :OP,
                  :PERC_HREXTRA,
                  Null
                  );

                  SITUACAO_ID = SITUACAO_HORA_EXTRA;
                  HORAS = HrExtraD;
                  --Suspend;
                End

             /* HORA EXTRA NOTURNO */
             If (HrExtraN > 0 and SITUACAO_HORA_EXTRA_NOTURNO > 0) Then
                Begin
                  SEQ = SEQ + 1;
                  OP = COALESCE((SELECT FIRST 1 COALESCE(OPERADOR_BH,'') FROM TBPONTO_SITUACAO WHERE CODIGO = :SITUACAO_HORA_EXTRA_NOTURNO),''); -- Operador BH ( + OU - )
                  PERC_HREXTRA = COALESCE((SELECT FIRST 1 COALESCE(Perc_HrExtra,0) FROM TBPONTO_SITUACAO WHERE CODIGO = :SITUACAO_HORA_EXTRA_NOTURNO),0);  

                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OPERADOR_BH,PERC_HREXTRA,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :SITUACAO_HORA_EXTRA_NOTURNO,
                  :SEQ,
                  :HrExtraN,
                  IIF(:OP IN ('+','-'),'1','0'),
                  :OP,
                  :PERC_HREXTRA,
                  Null
                  );

                  SITUACAO_ID = SITUACAO_HORA_EXTRA_NOTURNO;
                  HORAS = HrExtraN;
                  --Suspend;
                End

             /* ATESTADO */
             If (SitProg > 0 AND ATEST > 0) Then
                Begin
                  SEQ = SEQ + 1;
                  OP = COALESCE((SELECT FIRST 1 COALESCE(OPERADOR_BH,'') FROM TBPONTO_SITUACAO WHERE CODIGO = :SITUACAO_FALTA_ATESTADO),''); -- Operador BH ( + OU - )
                  PERC_HREXTRA = COALESCE((SELECT FIRST 1 COALESCE(Perc_HrExtra,0) FROM TBPONTO_SITUACAO WHERE CODIGO = :SITUACAO_FALTA_ATESTADO),0);

                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OPERADOR_BH,PERC_HREXTRA,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :SITUACAO_FALTA_ATESTADO,
                  :SEQ,
                  :SitProg,
                  IIF(:OP IN ('+','-'),'1','0'),
                  :OP,
                  :PERC_HREXTRA,
                  'ATESTADO: '||FN_LPAD(:ATESTADO_ID, 6, '0')||''
                  );

                  SITUACAO_ID = SITUACAO_FALTA_ATESTADO;
                  HORAS = SitProg;
                  --Suspend;
                End

             /* PROGRAMACAO */
             If (SitProg > 0 AND ATEST = 0) Then
                Begin
                  SEQ = SEQ + 1;
                  OP = COALESCE((SELECT FIRST 1 COALESCE(OPERADOR_BH,'') FROM TBPONTO_SITUACAO WHERE CODIGO = :CodProg),''); -- Operador BH ( + OU - )
                  PERC_HREXTRA = COALESCE((SELECT FIRST 1 COALESCE(Perc_HrExtra,0) FROM TBPONTO_SITUACAO WHERE CODIGO = :CodProg),0);

                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OPERADOR_BH,PERC_HREXTRA,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :CodProg,
                  :SEQ,
                  :SitProg,
                  IIF(:OP IN ('+','-'),'1','0'),
                  :OP,
                  :PERC_HREXTRA,
                  Null
                  );

                  SITUACAO_ID = CodProg;
                  HORAS = SitProg;
                  --Suspend;
                End

             /* TRABALHO BANCO DE HORAS DIURNO */
             If (TRABBH_D > 0 and SITUACAO_TRABALHO_BH > 0) Then
                Begin
                  SEQ = SEQ + 1;
                  OP = COALESCE((SELECT FIRST 1 COALESCE(OPERADOR_BH,'') FROM TBPONTO_SITUACAO WHERE CODIGO = :SITUACAO_TRABALHO_BH),''); -- Operador BH ( + OU - )

                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OPERADOR_BH,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :SITUACAO_TRABALHO_BH,
                  :SEQ,
                  :TRABBH_D,
                  IIF(:OP IN ('+','-'),'1','0'),
                  :OP,
                  Null
                  );

                  SITUACAO_ID = SITUACAO_TRABALHO_BH;
                  HORAS = TRABBH_D;
                  --Suspend;
                End

             /* TRABALHO BANCO DE HORAS NOTURNO */
             If (TRABBH_N > 0 and SITUACAO_TRABALHO_BH_NOTURNO > 0) Then
                Begin
                  SEQ = SEQ + 1;
                  OP = COALESCE((SELECT FIRST 1 COALESCE(OPERADOR_BH,'') FROM TBPONTO_SITUACAO WHERE CODIGO = :SITUACAO_TRABALHO_BH_NOTURNO),''); -- Operador BH ( + OU - )

                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OPERADOR_BH,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :SITUACAO_TRABALHO_BH_NOTURNO,
                  :SEQ,
                  :TRABBH_N,
                  IIF(:OP IN ('+','-'),'1','0'),
                  :OP,
                  Null
                  );

                  SITUACAO_ID = SITUACAO_TRABALHO_BH_NOTURNO;
                  HORAS = TRABBH_N;
                  --Suspend;
                End

             /* COMPENSACAO BANCO DE HORAS DIURNO */
             If (COMPBH_D > 0 and SITUACAO_BH > 0) Then
                Begin
                  SEQ = SEQ + 1;
                  OP = COALESCE((SELECT FIRST 1 COALESCE(OPERADOR_BH,'') FROM TBPONTO_SITUACAO WHERE CODIGO = :SITUACAO_BH),''); -- Operador BH ( + OU - )

                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OPERADOR_BH,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :SITUACAO_BH,
                  :SEQ,
                  :COMPBH_D,
                  IIF(:OP IN ('+','-'),'1','0'),
                  :OP,
                  Null
                  );

                  SITUACAO_ID = SITUACAO_BH;
                  HORAS = COMPBH_D;
                  --Suspend;
                End

             /* COMPENSACAO BANCO DE HORAS NOTURNO */
             If (COMPBH_N > 0 and SITUACAO_BH_NOTURNO > 0) Then
                Begin
                  SEQ = SEQ + 1;
                  OP = COALESCE((SELECT FIRST 1 COALESCE(OPERADOR_BH,'') FROM TBPONTO_SITUACAO WHERE CODIGO = :SITUACAO_BH_NOTURNO),''); -- Operador BH ( + OU - )

                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OPERADOR_BH,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :SITUACAO_BH_NOTURNO,
                  :SEQ,
                  :COMPBH_N,
                  IIF(:OP IN ('+','-'),'1','0'),
                  :OP,
                  Null
                  );

                  SITUACAO_ID = SITUACAO_BH_NOTURNO;
                  HORAS = COMPBH_N;
                  --Suspend;
                End

             /* FALTA BANCO DE HORAS DIURNO */
             If (FaltaBH_D > 0 and SITUACAO_FALTA_BH > 0) Then
                Begin
                  SEQ = SEQ + 1;

                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :SITUACAO_FALTA_BH,
                  :SEQ,
                  :FaltaBH_D,
                  '0',
                  Null
                  );

                  SITUACAO_ID = SITUACAO_FALTA_BH;
                  HORAS = FaltaBH_D;
                  --Suspend;
                End

             /* FALTA BANCO DE HORAS NOTURNO */
             If (FaltaBH_N > 0 and SITUACAO_FALTA_BH_NOTURNO > 0) Then
                Begin
                  SEQ = SEQ + 1;

                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :SITUACAO_FALTA_BH_NOTURNO,
                  :SEQ,
                  :FaltaBH_N,
                  '0',
                  Null
                  );

                  SITUACAO_ID = SITUACAO_FALTA_BH_NOTURNO;
                  HORAS = FaltaBH_N;
                  --Suspend;
                End

             /* SITUACAO NAO IDENTIFICADA */
             If (SitNaoIdent > 0 and SITUACAO_NAO_IDENTIFICADA > 0) Then
                Begin
                  SEQ = SEQ + 1;

                  INSERT INTO TbPonto_Cartao_Marcacao (
                  COLABORADOR_CODIGO, DATA, SITUACAO_CODIGO,SEQUENCIA,HORAS,SITUACAO_BH,OBSERVACAO) VALUES (
                  :MATRICULA,
                  :DATA,
                  :SITUACAO_NAO_IDENTIFICADA,
                  :SEQ,
                  :SitNaoIdent,
                  '0',
                  Null
                  );

                  SITUACAO_ID = SITUACAO_NAO_IDENTIFICADA;
                  HORAS = SitNaoIdent;
                  --Suspend;
                End

            END /* TBRH_CONFIGURACAO */
      END /* TBPONTO_CARTAO B, TBESCALA E */
END
^

SET TERM ; ^

