Árvore de páginas


01. VISÃO GERAL

Este ponto de entrada é utilizado para alteração ou inclusão de novos eventos na tabela de apontamentos (SPC). 

É chamado após o apontamento das marcações, antes da gravação da tabela de apontamentos (SPC)

Sem retorno, pois o array "aEventos" é declarado como PRIVATE no programa PONXAPO.PRX e, por isso, pode ter seu conteúdo modificado pelo Ponto de Entrada. Caso tenha sido modificado, serão assumidas as modificações realizadas.

02. EXEMPLO DE UTILIZAÇÃO

 O Ponto de Entrada PONAPO4 receberá o ParamIxb como parâmetro ‚ um Array com quatro Elementos, sendo o primeiro a cópia do array "aMarcacoes", o segundo a cópia do array "aTabCalend", o terceiro a cópia do array  "aCodigos" e o quarto a cópia do array "aEvesIds

Exemplo de como incluir um evento especifico em todos os dias trabalhados que houver marcação:

#INCLUDE 'PROTHEUS.CH'
// Exemplo de Uso do PE PONAPO4 para gerar novos eventos conforme o tipo de dia e quantidade de horas desejada.
/*----------------------*/
User Function PONAPO4()
/*----------------------*/
     
Local __aMarcacoes  := aClone( ParamIxb[1] )
Local __aTabCalend  := aClone( ParamIxb[2] )
Local __aCodigos    := aClone( ParamIxb[3] )
Local __aEvesIds    := aClone( ParamIxb[4] )
Local __aEventos    := aClone( aEventos )
Local __aResult     := aClone( aEventos )
Local cEvedeFaltas  := __aEvesIds[ 009 , 02 ]+'/'+__aEvesIds[ 010 , 02 ]//Faltas Nao Autorizadas e Autorizadas
Local cFilRegra     := fFilFunc("SPA")
Local cFilSRA       := AllTrim(SRA->RA_FILIAL)
Local cCCusto       := SRA->RA_CC
Local cRegras       := '01/24/09/06'
//No configurador é possivel criar o parametro MV_CREGRA (tipo caracter) e informar as regras para apurar as horas
//Abaixo basta retirar os sinais '//'. E coloca-los na instrucao acima.
//Local cRegras         := SuperGetMv("MV_CREGRA",,"",cFilSRA)
Local cFilGeraHrs:= 'D MG 01/D MG 02'
//Local cFilGeraHrs         := SuperGetMv("MV_CFilhrsIT",,"",cFilSRA)
//Codigos dos eventos validos para todas as filiais
//substitui-los pelos codigos desejados
Local cEveTrab      := '010'
Local cEveComp      := '011'
Local cEveFeriado   := '012'
Local cEveDSR       := '013'
Local cEveNTrab     := '014'
//Qtde horas a pagar para cada tipo de dia
//alterar conforme a filial
Local nEveTrab      := 1 //Trabalhado
Local nEveComp      := 1 //Compensado
Local nEveFeriado   := 1 //Feriado
Local nEveDSR       := 1 //DSR
Local nEveNTrab     := 1 //Nao Trabalhado
Local aSpaFields    :={}
Local aSpaInfo      :={}
Local dDataApo      := CTOD('//')
Local cTipodia      := ''
Local cRegra        := ''
Local cNewRegra     := ''
Local cOrdem        := ''
Local cEvento       := ''
Local cTurno        := ''
Local cSeqTurno     := ''
Local lTrbFeriado   :=.F.
Local nX            := 0
Local nHrsGera      := 0
//Verifica se a Regra do funcionario nao está entre as possiveis de se gerar horas
If !(cFilSRA $ cFilGeraHrs)
    Return
EndIf 
//Se desejar maior flexibilidade é possível criar campos na tabela de regras SPA
//para o usuario informar os eventos para cada tipo de dia:
//Por exemplo: Criar o campo PA_EVETRAB através do Configurador na tabela SPA - Regra de Apontamento.
//Titulo: Evento Trabalhado
//Tipo: Caracter
//Tamanho: 3
//Criar na tabela SPA campo para conter a quantidade de horas a serem pagas para cada Tipo de Dia
//Titulo: Evento Trabalhado
//Tipo: Numerico
//Tamanho: 5
//Decimais: 2
//Picture:  99.99
//Na variavel cEveTrab, substitua o conteúdo de exemplo, pelo conte´´udo do campo criado.
//Por exemplo: cEveTrab := SPA->PA_EVETRAB
//Faca o mesmo para os demais Tipos de dia.
//Da mesma forma, na variavel nEveTrab, substitua o conteudo exemplo, pelo conteudo do campo criado.
//Por exemplo: nEveTrab := SPA->PA_HRSTRAB
//Faca o mesmo para os demais Tipos de dia.
//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
//³ Carrega os Campos para a PosSpa()                              ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ*/
aAdd( aSpaFields , "PA_FERIADO" )   //01 - Se funcionario trabalha em Feriado
/*Eventos para cada tipo de dia
aAdd( aSpaFields , "PA_EVTRAB" )    //02 - Trabalhado
aAdd( aSpaFields , "PA_EVCOMP" )    //03 - Compensado
aAdd( aSpaFields , "PA_EVDSR"  )    //04 - DSR
aAdd( aSpaFields , "PA_EVNTRAB" )   //05 - Nao Trabalhado
aAdd( aSpaFields , "PA_EVFERDO" )   //06 - Feriado
//Horas a serem pagas para cada tipo de dia
aAdd( aSpaFields , "PA_HRTRAB" )    //07 - Trabalhado
aAdd( aSpaFields , "PA_HRCOMP" )    //08 - Compensado
aAdd( aSpaFields , "PA_HRDSR"  )    //09 - DSR
aAdd( aSpaFields , "PA_HRNTRAB" )   //10 - Nao Trabalhado
aAdd( aSpaFields , "PA_HRFERDO" )   //11 - Feriado
*/     
//Se forem criados pelo configurador os campos acima, não será necessario o bloco de instruções abaixo onde se define os eventos e quantidades de horas
//para cada filial.
//Abaixo toma-se como codigo da Filial o conteudo 'D MG 01'. Substitua-o pelo conteúdo correspondente a filial do sistema. Por exemplo: "01" ou '103', etc,
//para a qual se pode gerar horas
//=== Bloco de Instrucao para Tratamento por Filial ===
If cFilSRA = 'D MG 01'
//Codigos dos eventos validos para a Filial "01"
//substitutui-los pelos codigos desejados ou campo do configurador (cEveTrab    := PosSPA( cRegra , cFilRegra , "PA_EVETRAB" , 1 , .F. )
    cEveTrab    := '010'
    cEveComp    := '011'
    cEveFeriado := '012'
    cEveDSR     := '013'
    cEveNTrab   := '014'
//Qtde horas a pagar para cada tipo de dia
//alterar conforme a filial
    nEveTrab    := 1
    nEveComp    := 0
    nEveFeriado := 0
    nEveDSR     := 0
    nEveNTrab   := 0 //Nao Trabalhado
ElseIf cFilSRA = 'D MG 02' //'Informar outro codigo de filial caso possua alguma configuracao diferente'
    //Duplique aqui as variaveis cEVe??? e nEve se os valores forem diferentes
EndIf  
//=== Fim do Bloco de Instrucao para Tratamento por Filial ===
//Trata cada dia de apontamento
For nX := 1 To Len(__aTabCalend)
     
    //Se a data de apontamento foi tratada vai para o proximo dia
    If dDataApo == __aTabCalend[nX,48]
        Loop
    EndIf
    dDataApo    := __aTabCalend[nX,48]
    cOrdem      := __aTabCalend[nX,02]
    cRegra      := __aTabCalend[nX,23]
    cTipoDia    := __aTabCalend[nX,06]
    cTurno      := __aTabCalend[nX,14]
    cSeqTurno   := __aTabCalend[nX,08]
     
    //===== Bloco para Tratamento por Regra definida em variavel =====================
    //Se a regra  nao define o pagamento das horas ou se nenhum dia possui horas  para pagar
    //vai para o proximo dia
    If  ! (cRegra  $ cRegras) .and. ( (nEveTrab + nEveComp + nEveFeriado + nEveDSR) > 0 )
        Loop
    EndIf
    //===== Fim do Bloco para Tratamento por Regra definida em variavel =====================
     
    If cRegra <> cNewRegra
        cNewRegra   := cRegra
        aSpaInfo    := PosSPA( cRegra , cFilRegra , aSpaFields , 1 , .F. )
        lTrbFeriado := aSpaInfo[01] == "S"
    EndIf
     
    //Se estiver demitido ou transferido e a data de apontamento for depois da  demissao/transferencia ou
    //se esta em situacao normal mas a data de apontamento for anterior a data de admissao
    //entao vai para o proximo dia
    If SRA->( ( RA_SITFOLH $ 'D.T' .and. dDataApo > RA_DEMISSA) .or. ( Empty(RA_SITFOLH).and. dDataApo < RA_ADMISSA) )
        Loop
    Endif
         
     // *** Verifica Tipo Dia ***
    //-- Se Feriado
         //-- Se Excecao
              //Tipo Dia
         //--Senao Excecao    
             //-- Se NaoTrabalha Feriado
             //   Tipo dia  = "Feriado"
             //---Senao NaoTrabalha Feriado
             //   Tipo dia    
             //-- Fim se Nao Trabalha Feriado
         //-- Fim se Excecao
    //Senao
    //   Tipo Dia
    //-- Fim se Feriado
     
    cTipoDia    := IF(  __aTabCalend[ nX , 19 ] , IF(   __aTabCalend[ nX , 10 ]  == "E" ,  __aTabCalend[ nX , 06 ] , IF(!lTrbFeriado,"F", __aTabCalend[ nX , 06 ] ) ) ,  __aTabCalend[ nX , 06 ] )                 
     
    If  ( cTipoDia == "S" .and. Empty(nEveTrab) )       .or.;
        ( cTipoDia == "C" .and. Empty(nEveComp) )       .or.;
        ( cTipoDia == "F" .and. Empty(nEveFeriado) )    .or.;
        ( cTipoDia == "D" .and. Empty(nEveDSR) )        .or.;
        ( cTipoDia == "N" .and. Empty(nEveNTrab) )
        Loop
    EndIf
     
    //-- Se não tem marcacoes para o dia vai para o proximo dia
    If  !(( aScan( __aMarcacoes , { |x| x[3] == cOrdem }  ) ) > 0 )
        Loop
    EndIf  
     
    If ( cTipoDia == "S" )
        nHrsGera    :=  nEveTrab
        cEvento     :=  cEveTrab
    ElseIf ( cTipoDia == "C" )
        nHrsGera    := nEveComp
        cEvento     := cEveComp
    ElseIf ( cTipoDia == "F"  )
        nHrsGera    :=  nEveFeriado
        cEvento     :=  cEveFeriado
    ElseIf ( cTipoDia == "D" )
        nHrsGera    := nEveDSR
        cEvento     := cEveDSR
    ElseIf ( cTipoDia == "N" )
        nHrsGera    := nEveNTrab
        cEvento     := cEveNTrab
    EndIf
     
    fGeraRes(   __aResult               ,;  //01 -> Array com os Resultados do Dia
                dDataApo                ,;  //02 -> Data da Geracao
                nHrsGera                ,;  //03 -> Numero de Horas Resultantes
                cEvento                 ,;  //04 -> Codigo do Evento
                cCCusto                 ,;  //05 -> Centro de Custo a ser Gravado
                NIL                     ,; //06 -> Tipo de Marcacao
                .F.                     ,; //07 -> True para Acumular as Horas
                NIL                     ,; //08 -> Periodo de Apuracao
                NIL                     ,; //09 -> Tolerancia
                NIL                     ,; //10 -> Tipo de Arredondamento a Ser Utilizado
                .T.                     ,; //11 -> Substitui a(s) Hora(s) Existente(s) ( Garanto Apenas 1 DSR por Data )
                /*cFuncao   */          ,; //12 -> Funcao 
                /*cDepto    */          ,; //13 -> Depto para gravacao
                /*cPosto    */          ,; //14 -> Posto para gravacao
                /*cProcesso */          ,; //15 -> Periodo para Gravacao
                /*cRoteiro  */          ,; //16 -> Processo para Gravacao
                /*cPerApo   */          ,; //17 -> Periodo para Gravacao
                /*cNumPagto */          ,; //18 -> NumPagto para Gravacao
                cTurno                  ,; //19 -> Turno de Trabalho
                cSeqTurno               ;  //20 -> Semana/Sequencia do Turno
            )
     
         
        aEventos := aClone( __aResult )
Next nX
Return (Nil)