Simulação Gestão de Frete Embarcador (GFE)

Olá pessoal,

Estamos avaliando uma possível troca na nossa política de frete FOB/CIF e precisamos realizar a simulação de alguns cenários e entender qual o impacto financeiro.

Para isso, o ideal seria efetuarmos uma nova simulação de frete para cada NF emitida no último ano, porém alterando algumas condições do frete.

Alguém sabe dizer se existe uma função para chamar diretamente a simulação de frete do GFE, retornando apenas os valores obtidos, sem a necessidade de alguma confirmação na interface?

A ideia seria criar uma rotina que refizesse todas as simulações e exportasse para uma planilha.

1 curtida

Olá!

No GFE existe a rotina de simulação de fretes, mas não existe uma forma de fazer os cálculos automaticamente. Por se tratar de uma rotina MVC, é possível criar uma rotina para fazer o preenchimento dos dados para cálculo. O problema é que a função quem realmente faz o cálculo é a GFE010SIM, que é uma função estática do programa GFEX010. Não consegui fazer a chamada dessa função em outro programa já que não é mais possível usar a StaticCall. Esse foi o máximo que consegui fazer com essa rotina, consigo automatizar o preenchimento dos dados, mas a execução ainda depende de um clique do usuário, após isso é possível exportar os dados calculados.

Olá Gabriel!

Acredito que a API REST FreightSimulation padrão do GFE possa atender sua demanda. Segue documentação:

Simulação de Frete - FreightSimulations - API REST

Portanto, basta subir um rest, criar uma função para formatar o JSON e realizar o POST consumindo essa API padrão, após isso pegar o retorno da requisição e tratar os dados conforme desejar.

Att,

1 curtida

Excelente Leonardo. Acabamos solucionando de outra forma, mas com essa API teria sido muito mais simples. Obrigado!

Já faz um tempo que resolvemos essa questão, mas esqueci de postar aqui. Não lembro exatamente como chegamos na solução, mas ela ficou da seguinte forma:

Utilizamos o modelo da GFEX010 através da FWLoadModel().


oModelSim     := FWLoadModel("GFEX010")
oModelNeg      := oModelSim:GetModel("GFEX010_01")
oModelAgr      := oModelSim:GetModel("DETAIL_01")  
oModelDC       := oModelSim:GetModel("DETAIL_02") 
oModelIt       := oModelSim:GetModel("DETAIL_03") 
oModelTr       := oModelSim:GetModel("DETAIL_04") 
oModelInt      := oModelSim:GetModel("SIMULA")
oModelCal1     := oModelSim:GetModel("DETAIL_05")
oModelCal2     := oModelSim:GetModel("DETAIL_06")    
oModelSim:SetOperation(3)

O preenchimento dos dados obrigatórios via LoadValue()


oModelNeg:LoadValue('CONSNEG' ,"1" )

//Agrupadores
oModelAgr:LoadValue('GWN_NRROM' ,"01" )
oModelAgr:LoadValue('GWN_CDCLFR','0002')                                   
oModelAgr:LoadValue('GWN_CDTPOP','0000000001')
oModelAgr:LoadValue('GWN_DOC'   ,"ROMANEIO")           
//Documento de Carga
oModelDC:LoadValue('GW1_EMISDC', '000001215     ')
oModelDC:LoadValue('GW1_NRDC'  , "00001")
oModelDC:LoadValue('GW1_CDTPDC', 'NFE  ')
oModelDC:LoadValue('GW1_CDREM' , '000001215     ')
oModelDC:LoadValue('GW1_CDDEST', cCodDest)
oModelDC:LoadValue('GW1_TPFRET', "1")
oModelDC:LoadValue('GW1_ICMSDC', "2")
oModelDC:LoadValue('GW1_USO'   , "1")
oModelDC:LoadValue('GW1_NRROM' , "01")
oModelDC:LoadValue('GW1_QTUNI' , 1)   
//Trechos
oModelTr:LoadValue('GWU_EMISDC' ,'000001215     ')
oModelTr:LoadValue('GWU_NRDC'   ,"00001")
oModelTr:LoadValue('GWU_CDTPDC' ,'NFE  ')
oModelTr:LoadValue('GWU_NRCIDD' ,alltrim(cCodRedes))
oModelTr:LoadValue('GWU_SEQ'    ,"01")
//Itens                                
oModelIt:LoadValue('GW8_EMISDC','000001215     ')
oModelIt:LoadValue('GW8_NRDC'  ,"00001")
oModelIt:LoadValue('GW8_CDTPDC','NFE  ')
oModelIt:LoadValue('GW8_ITEM'  ,"ItemA"  )
oModelIt:LoadValue('GW8_DSITEM',"Item Generico")
oModelIt:LoadValue('GW8_CDCLFR','0002')
oModelIt:LoadValue('GW8_PESOR' ,nPeso)
oModelIt:LoadValue('GW8_VALOR' ,nVal)    
oModelIt:LoadValue('GW8_TRIBP' ,"1")

E o disparo da simulação feito atraves de um SetValue


// Dispara a simulação
oModelInt:SetValue("INTEGRA" ,"A")

Na sequencia um for para varrer os resultados da simulação no modelo:


If oModelCal1:GetQtdLine() > 1 .Or. !Empty( oModelCal1:GetValue('C1_NRCALC'  ,1) )
    For nCont := 1 to oModelCal1:GetQtdLine()
        oModelCal1:GoLine(nCont) 
        aRetAux := {}
        aAdd(aRetAux,oModelCal2:GetValue('C2_CDEMIT'  ,1))
        aAdd(aRetAux,POSICIONE("GU3",1,xFilial("GU3")+oModelCal2:GetValue('C2_CDEMIT'  ,1 ),"GU3_NMEMIT"))
        aAdd(aRetAux,oModelCal1:GetValue('C1_VALFRT'  ,nCont))
        aAdd(aRetAux,oModelCal1:GetValue('C1_DTPREN'  ,nCont))
        aAdd(aRet, aRetAux)
    Next nCont     
EndIf

1 curtida

Que legal! Não sabia desse parâmetro “INTEGRA”, vou testar aqui, vai me ajudar bastante.

Prezados, bom dia!

Sei que o post já está fechado a algum tempo mas estou com um cenário muito parecido e ao submeter à integração, o valor retornado para o for não considera os impostos, alguém pode dar alguma dica da causa? Se realizo a simulação pela interface o valor retornado está correto com impostos.

Agradeço antecipadamente

Gabriel, boa tarde! Tudo bem? Voce tem este model em funcionamento ai? O fonte mesmo? Estou tentando de tudo aqui e a coisa nao funciona…