Desenvolvi um rest para aprovação de pedidos de compras, contratos e revisão de contratos. Para pedidos de compras e revisão de contratos funciona corretamente porém para contratos o oModel094:VldData() e oModel094:CommitData() retornam como .T. porem o contrato não é aprovado (não alterta status do documento na SCR). Alguém já passou por isso ou tem alguma dica de como resolver ?
1 curtida
Olá Rodrigo, tem uns posts ai no forum que respondi sobre isso, tambem ja peguei esse problema.
O MATA094 só funciona se a thread estiver logada com o usuario aprovador, o que fiz para contornar foi alterar a cUserId com o código do aprovador CR_APROV e fucionou.
Bom dia! Eu comecei a desenvolver, mas parei por falta de tempo, você se importa de compartilhar os fontes?
Bom dia! Estive praticando o uso de API REST e utilizei um exemplo de aprovação de contrato. Em meu protótipo, a aprovação é realizada com sucesso via API REST. Veja se lhe ajuda, ainda não está finalizado mas acho que da para aproveitar algo haha.
#include 'tlpp-core.th'
#include 'tlpp-rest.th'
#include 'tbiconn.ch'
#Include 'FWMVCDef.ch'
/*
Aprovação de contrato
*/
@Post(endpoint="/contratosv1/aprovar",description='Aprovação de contratos')
User Function RESTAPROV()
Local oJson := JsonObject():New()
Local nContrato := 0
Local cLog := ""
Local oRetorno := JsonObject():New()
// 'oJson' irá carregar os dados vindos do corpo da requisição
oJson:FromJson( oRest:getBodyRequest() )
// Se o conteúdo não for informado, é um `BAD REQUEST`
If Empty(oJson["CONTRATO"]) .OR. Empty(oJson["APROVADOR"])
oRest:setStatusCode( 400 )
oRest:setResponse("Schema Inválido, falta dados!")
Return Nil
EndIf
nContrato := fBuscaContrato(alltrim(oJson["CONTRATO"]))
If nContrato == 0
cLog := fAprova(oJson)
If !Empty(cLog)
oRest:setStatusCode( 400 )
oRetorno['retorno'] := 'false'
oRetorno['Descricao'] := cLog
oRest:setResponse(oRetorno)
Return Nil
EndIf
ElseIf nContrato == 1
oRest:setStatusCode( 404 )
oRetorno['retorno'] := 'false'
oRetorno['Descricao'] := "Contrato " +alltrim(oJson["CONTRATO"])+ " não disponivel para aprovação, verifique com o responsável."
oRest:setResponse(oRetorno)
Return Nil
ElseIf nContrato == 2
oRest:setStatusCode( 404 )
oRetorno['retorno'] := 'false'
oRetorno['Descricao'] := "Contrato " +alltrim(oJson["CONTRATO"])+ " não localizado!"
oRest:setResponse(oRetorno)
Return Nil
EndIf
oRest:setStatusCode( 200 )
oRetorno['retorno'] := 'true'
oRetorno['Descricao'] := "Aprovado com sucesso!"
oRest:setResponse(oRetorno)
Return Nil
//-- Verifica se contrato está disponivel para aprovação
Static Function fBuscaContrato(cContrato)
Local nRet := 0
Local cAlias := GetNextAlias()
BeginSql alias cAlias
SELECT CN9_FILIAL, CN9_NUMERO, CN9_SITUAC
FROM %table:CN9% CN9
WHERE CN9_FILIAL = %xfilial:CN9%
AND CN9_NUMERO = %exp:cContrato%
AND D_E_L_E_T_ = ''
EndSql
If (cAlias)->(!Eof())
If (cAlias)->CN9_SITUAC == "04"
nRet := 0 //-- Disponivel para aprovação.
Else
nRet := 1 //-- Contrato não disponivel para aprovação, verifique com o responsável.
EndIf
Else
nRet := 2 //-- Contrato não localizado.
EndIf
(cAlias)->(DbCloseArea())
Return nRet
//-- Função para efetuar aprovação do contrato.
Static Function fAprova(oJson)
Local cLog := ""
Local lRet := .T.
DbSelectArea("SAK")
SAK->(dbSetOrder(1))
IF SAK->(dbSeek(xFilial("SAK")+oJson['APROVADOR']))
__cUserId := SAK->AK_USER
else
cLog := "Usuário não encontrado no cadastro de Aprovadores "
Return cLog
EndIF
DbSelectArea("SCR")
//-- CR_FILIAL+CR_TIPO+CR_NUM+CR_APROV
SCR->(DbSetOrder(3))
If SCR->(DbSeek(xFilial("SCR") + 'CT' + Padr(oJson['CONTRATO'], TamSX3("CR_NUM")[1]) + oJson['APROVADOR']))
//-- Seleciona a operação de aprovação de documentos
A094SetOp("001")
//-- Carrega o modelo de dados e seleciona a operação de aprovação (UPDATE)
oModel094 := FWLoadModel('MATA094')
oModel094:SetOperation( MODEL_OPERATION_UPDATE )
oModel094:Activate()
lRet := oModel094:VldData()
If oModel094:CommitData()
cLog := ""
Else
//-- Busca o Erro do Modelo de Dados
aErro := oModel094:GetErrorMessage()
cLog := AllToChar(aErro[06])
EndIf
//-- Desativa o modelo de dados
oModel094:DeActivate()
Else
cLog := "Problema no processamento, não encontrato registro de aprovação para o Aprovador "+alltrim(oJson['APROVADOR'])+". "
EndIf
Return cLog