#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)
|