#include "PROTHEUS.ch"
User Function MNTNG()
Local cId := PARAMIXB[1] //Indica o momento da chamada do PE
Local oWS := PARAMIXB[2] //Objeto com referência ao webservice
Local oParser
Local aArea
Local aAreaSTJ
Local nInput := 0
Local aDate
Local cType
Local lIsDone
Local cTask
Local cCode
Local nAmount
Local cOrder
Local cPlan
Local aDate
Local lOk
Local cAddress := ""
Local cCodBem := ""
If cId == "CREATE_VALID_ORDER" .OR. cId == "UPDATE_VALID_ORDER" //valida inclusão e alteração da ordem
//Bloco a seguir realiza validações dos insumos
If FWJsonDeserialize(oWS:GetContent(),@oParser) //Parse da string no formato Json
If AttIsMemberOf( oParser, "inputs" ) .And. Len( oParser:inputs ) > 0
cOrder := IIf( AttIsMemberOf( oParser, 'code' ), oParser:code, '' )
cPlan := IIf( AttIsMemberOf( oParser, 'plan' ), oParser:plan, '000000' )
//Bloco abaixo realiza validações nos insumos
For nInput := 1 To Len( oParser:inputs )
oInput := oParser:inputs[ nInput ]
cType := IIf( AttIsMemberOf( oInput , 'type' ), oInput:type, '' )
lIsDone := IIf( AttIsMemberOf( oInput , 'isDone'), oInput:isDone, .F. )
//Neste exemplo haverá validações somente para produtos realizados
If cType != "P" .Or. !lIsDone
Loop
EndIf
aDate := { dDatabase, '08:00' }
lOk := .T.
If AttIsMemberOf( oInput, "startDate" )
aDate := StrTokArr( oInput:startDate, " " )
ElseIf AttIsMemberOf( oInput, "date" )
aDate := StrTokArr( oInput:date, " " )
EndIf
aDate := { STOD( aDate[1] ), aDate[2] }
//Neste exemplo haverá validações somente quando informar data anterior a data atual
If aDate[1] >= dDatabase
Loop
If AttIsMemberOf( oParser, "inputs" ) .And. Len( oParser:inputs ) > EndIf0
cTask cOrder := IIf( AttIsMemberOf( oInput oParser, 'taskcode' ), oInputoParser:taskcode, '' )
cPlan cCode := IIf( AttIsMemberOf( oInput oParser, 'codeplan' ), oInputoParser:codeplan, '000000' )
//Bloco abaixo realiza validações nAmount := IIf( AttIsMemberOf( oInput , 'amount'), oInput:amount, 0 )
nos insumos
For If cId == "CREATE_VALID_ORDER"
nInput := 1 To Len( oParser:inputs )
lOkoInput := .F.
oParser:inputs[ nInput ]
Else
cType := IIf( AttIsMemberOf( oInput , 'type' ), oInput:type, '' )
lIsDone := IIf( AttIsMemberOf( oInput , 'isDone'), oInput:isDone, .F. )
/*Trecho abaixo verifica se o insumo já está gravado no banco
//Neste exemplo casohaverá existavalidações nãosomente hápara necessidade de validação*/
produtos realizados
If cType != dbSelectArea("STLP")
.Or. !lIsDone
dbSetOrder( 1 )Loop
EndIf
If !dbSeek( xFilial('STL') + PADR( cOrder, Len( STL->TL_ORDEM ) )+ ;
aDate := { dDatabase, '08:00' }
lOk PADR( cPlan, Len( STL->TL_PLANO ) ) + PADR( cTask, Len( STL->TL_TAREFA ) ) + ;
:= .T.
If AttIsMemberOf( oInput, "startDate" )
cTypeaDate +:= PADRStrTokArr( cCodeoInput:startDate, Len( STL->TL_CODIGO" " )
) )
ElseIf AttIsMemberOf( oInput, "date" )
lOk := .F.
aDate := StrTokArr( oInput:date, " " )
Else
EndIf
lOk := .F.
aDate := { STOD( aDate[1] ), aDate[2] }
//Verificação abaixo para garantir que o insumo não
existe no banco
//Neste exemplo haverá validações somente quando informar data anterior a data While !STL->( Eof() ) .AND. STL->TL_FILIAL + STL->TL_ORDEM + STL->TL_PLANO +;
atual
If aDate[1] >= dDatabase
STL->TL_TAREFA + STL->TL_TIPOREG + STL->TL_CODIGO == xFilial('STL') + PADR( cOrder, Len( STL->TL_ORDEM ) )+ ;
Loop
EndIf
cTask := IIf( PADR( cPlan, Len( STL->TL_PLANO ) ) + PADR( cTask, Len( STL->TL_TAREFA ) ) + ;
AttIsMemberOf( oInput , 'task'), oInput:task, '' )
cCode := IIf( AttIsMemberOf( oInput , 'code'), oInput:code, '' )
nAmount cType:= +IIf( PADRAttIsMemberOf( oInput cCode, Len( STL->TL_CODIGO )'amount'), oInput:amount, 0 )
If cId == "CREATE_VALID_ORDER"
If Val( STL->TL_SEQRELA ) > 0 ; //verifica se é insumo realizado
lOk := .F.
Else
.And. nAmount == STL->TL_QUANTID //comparação de quantidade
/*Trecho abaixo verifica lOkse := .T. //o insumo já está gravado e não há necessidade de validar
no banco
caso exista não há necessidade de validação*/
Exit
dbSelectArea("STL")
EndIf
dbSetOrder( 1 )
If !dbSeek( dbSelectAreaxFilial("'STL"')
+ PADR( cOrder, Len( STL->TL_ORDEM ) )+ ;
dbSkip()
PADR( cPlan, Len( STL->TL_PLANO ) ) + PADR( cTask, Len( STL->TL_TAREFA ) ) + EndDo;
EndIf
cType + PADR( cCode, Len( STL->TL_CODIGO ) ) EndIf
)
If !lOk
lOk := .F.
Return 'Não é permitido realizar insumos do tipoElse
produto com a data retroativa. ' + ;
lOk := .F.
'Verifique o insumo/produto ' + cCode + ' data ' + Dtoc( aDate[1] )
//Verificação abaixo para garantir que o insumo não existe no banco
EndIf
Next nInput
While !STL->( Eof() ) .AND. STL->TL_FILIAL + STL->TL_ORDEM + EndIfSTL->TL_PLANO +;
EndIf
ElseIf cId == "CANCEL_VALID" //valida cancelamento da ordem
If FWJsonDeserialize(oWS:GetContent(),@oParser) //Parse da string no formato Json
If Empty( oParser:message )//verifica campo observação foi passado vazio
STL->TL_TAREFA + STL->TL_TIPOREG + STL->TL_CODIGO == xFilial('STL') + PADR( cOrder, Len( STL->TL_ORDEM ) )+ ;
Return "A observação do cancelamento é obrigatória."
PADR( cPlan, Len( STL->TL_PLANO ) ) EndIf
+ PADR( cTask, Len( STL->TL_TAREFA ) ) + EndIf;
ElseIf cId == "FINISH_VALID_ORDER"
If FWJsonDeserialize(oWS:GetContent(), @oParser)
If Empty( oParser:observation ) //verifica campo observação foi passado vazio
cType + Return "Campo observação deve ser informado."
PADR( cCode, Len( STL->TL_CODIGO ) )
EndIf
EndIf
ElseIf cId == "FINISHED_ORDER" If
If FWJsonDeserialize(oWS:GetContent(), @oParser)Val( STL->TL_SEQRELA ) > 0 ; //verifica se é insumo realizado
aArea := GetArea()
.And. nAmount aAreaSTJ := STJ->(GetArea())
== STL->TL_QUANTID //comparação de quantidade
dbSelectArea("STJ")
dbSetOrder(1)
lOk If dbSeek(xFilial("STJ") + oParser:order + oParser:plan)
:= .T. //já está gravado e não há necessidade de validar
Reclock("STJ", .F.)
STJ->TJ_DTPRINI := STJ->TJ_DTMRINI
Exit
STJ->TJ_HOPRINI := STJ->TJ_HOMRINI
STJ->TJ_DTPRFIM := STJ->TJ_DTMRFIM
EndIf
STJ->TJ_HOPRFIM := STJ->TJ_HOMRFIM
MsUnlockdbSelectArea("STL")
Endif
RestArea(aAreaSTJ)
RestAreadbSkip(aArea)
Endif
ElseIf cId == "FILTER_PRODUCT" //adiciona filtro para buscaEndDo
de produtos
Return " AND B1_GRUPO = '97'"
ElseIf cId == "DESCRIPTION_LOCALIZATION" // Altera descrição de localização do bemEndIf
cCodBem := PARAMIXB[3]
dbSelectArea("ST9")
EndIf
dbSetOrder(1)
If dbSeek( xFilial("ST9") + cCodBem ) .And. !Empty( ST9->T9_CLIENTE + ST9->T9_LOJACLI )If !lOk
cAddress := Posicione("SA1",1,xFilial("SA1") + ST9->T9_CLIENTE + ST9->T9_LOJACLI,"SA1->A1_END")
Return 'Não EndIf
é permitido realizar insumos do tipo produto com Returna Alltrim( cAddress )
ElseIf cId == 'FILTER_ORDER'
data retroativa. ' + ;
Return ' AND STJ.TJ_DTMPINI = ' + ValToSQL( cToD( '24/11/2020' ) )
ElseIf cId == 'FILTER_REQUEST'
Return 'Verifique AND TQB.TQB_DTABER = o insumo/produto ' + ValToSQL(cCode cToD(+ '24/11/2020' ) )
ElseIf cId == 'FINISH_COUNTER_1'
data ' + Dtoc( aDate[1] )
aAreaSTP := STP->( GetArea() )EndIf
aAreaSTJ := STJ->( GetArea() )
Next nInput
EndIf
cCode := Posicione( 'STJ', 1, xFilial( 'STJ' ) + oWS:order + oWs:plan, 'TJ_CODBEM' )
EndIf
ElseIf cId == "CANCEL_VALID" //valida cancelamento da ordem
cDate :=If StrTokArrFWJsonDeserialize( oWs:endDate, ' ' )[1]
oWS:GetContent(),@oParser) //Parse da string no formato Json
cHour := oWs:counter[1]:time
If dbSelectAreaEmpty( 'STP'oParser:message )
//verifica campo observação foi passado vazio
dbSetOrder( 5 ) // TP_FILIAL + TP_CODBEM + TP_DTLEITU + TP_HORA
Return "A observação do cancelamento é obrigatória."
dbSeek( xFilial( 'STP') + cCode + cDate + cHour, .T. )EndIf
EndIf
ElseIf cId == "FINISH_VALID_ORDER"
If FWJsonDeserialize(oWS:GetContent(), @oParser)
If Empty( oParser:observation ) //verifica campo If STP->( !EoF() )
observação foi passado vazio
Return If STP->TP_CODBEM == cCode .And. ( STP->TP_DTLEITU <= sToD( cDate ) .Or.;
"Campo observação deve ser informado."
EndIf
EndIf
ElseIf cId == "FINISHED_ORDER"
( STP->TP_DTLEITU == sToD( cDate) .And. STP->TP_HORA <= cHour ) If FWJsonDeserialize(oWS:GetContent(), @oParser)
aArea := GetArea()
nCountaAreaSTJ := STP->TP_POSCONT
STJ->(GetArea())
dbSelectArea("STJ")
Else
dbSetOrder(1)
dbSkip(-1)
If dbSeek(xFilial("STJ") + oParser:order + oParser:plan)
Reclock("STJ", .F.)
If STP->( !BoF() ) .And. STP->TP_CODBEM == cCode
STJ->TJ_DTPRINI := STJ->TJ_DTMRINI
nCountSTJ->TJ_HOPRINI := STPSTJ->TP>TJ_POSCONTHOMRINI
STJ->TJ_DTPRFIM := STJ->TJ_DTMRFIM
STJ->TJ_HOPRFIM := EndIf
STJ->TJ_HOMRFIM
EndIf
MsUnlock()
Else
Endif
dbSkip(-1)
RestArea(aAreaSTJ)
If STP->( !BoF() ) .And. STP->TP_CODBEM == cCode
RestArea(aArea)
Endif
ElseIf cId nCount :== STP->TP_POSCONT
"FILTER_PRODUCT" //adiciona filtro para busca de produtos
Return " AND B1_GRUPO = '97'"
ElseIf cId
== "DESCRIPTION_LOCALIZATION" // Altera descrição de localização do bem
cCodBem EndIf:= PARAMIXB[3]
EndIf
dbSelectArea("ST9")
RestArea( aAreaSTJ dbSetOrder(1)
If dbSeek( RestArea( aAreaSTP )
Return nCountxFilial("ST9") + cCodBem ) .And. !Empty( ST9->T9_CLIENTE + ST9->T9_LOJACLI )
cAddress ElseIf cId :== 'FINISH_COUNTER_2'
Posicione("SA1",1,xFilial("SA1") + ST9->T9_CLIENTE + ST9->T9_LOJACLI,"SA1->A1_END")
aAreaTPP := TPP->( GetArea() ) EndIf
aAreaSTJ := STJ->( GetArea()Return Alltrim( cAddress )
ElseIf cId == 'FILTER_ORDER'
Return cCode := Posicione( 'STJ', 1, xFilial( 'STJ' ) + oWS:order + oWs:plan, 'TJ_CODBEM'' AND STJ.TJ_DTMPINI = ' + ValToSQL( cToD( '24/11/2020' ) )
cDate :=ElseIf StrTokArr( oWs:endDate, ' ' )[1]cId == 'FILTER_REQUEST'
Return ' AND cHour := oWs:counter[1]:time
dbSelectArea( 'TPP' )
TQB.TQB_DTABER = ' + ValToSQL( cToD( '24/11/2020' ) )
ElseIf cId == 'UPDATE_FINISH_ORDER'
If dbSetOrderAttIsMemberOf( 5oWS, 'counter' )
// TPP_FILIAL + TPP_CODBEM + TPP_DTLEIT + TPP_HORA
If dbSeekLen( xFilial( 'STP'oWS:counter ) +> cCode0
+ cDate + cHour, .T. )
oWS:counter[1]:value := 3334
If TPP->( !EoF() )
If TPP->TPP_CODBEM == cCode .And. ( TPP->TPP_DTLEIT <= sToD( cDate ) .Or.;
oWS:counter[1]:time := '10:10'
EndIf
( TPP->TPP_DTLEIT == sToD( cDate If Len( oWS:counter ) .And. TPP->TPP_HORA <= cHour ) )
> 1
oWS:counter[2]:value := 3334
nCountoWS:counter[2]:time := TPP->TPP_POSCONT'10:10'
ElseEndIf
EndIf
If dbSkip(-1AttIsMemberOf( oWS, 'observation' )
oWS:observation := 'ALTERADO PELO If TPP->( !BoF() ) .And. TPP->TPP_CODBEM == cCodeP.E. MNTNG'
EndIf
Return oWS
EndIf
Return |