Página 2 de 3

API para CIOT

Enviado: 07 Abr 2023 19:07
por JoséQuintas
Antes de encerrar, voltamos à compilação -w3 -es2
d:\temp>hbmk2 test -w3 -es2
hbmk2: Processing environment options: -comp=mingw
hbmk2: Processing configuration: d:\harbour\bin\hbmk.hbc
Harbour 3.2.0dev (r2303091450)
Copyright (c) 1999-2021, https://harbour.github.io/
Compiling 'test.prg'...

test.prg:57: warning W0001 Ambiguous reference 'CURLOPT_HTTPHEADER'
test.prg:67: warning W0001 Ambiguous reference 'CURLOPT_URL'
test.prg:68: warning W0001 Ambiguous reference 'CURLOPT_POST'
test.prg:69: warning W0001 Ambiguous reference 'CURLOPT_POSTFIELDS'
test.prg:75: warning W0001 Ambiguous reference 'CURLINFO_RESPONSE_CODE'
test.prg:84: warning W0032 Variable 'CCIOT' is assigned but not used in function '51:MAIN'
Tá faltando o #include da libcurl, que não tem nada a ver com a tal "hbapi.h".

e a variável CCIOT, foi criada pra bost. nenhuma, tá aí de intrometida, e por isso mostra erro.

Aonde tem as funções que faltam ?
Sei lá...

A julgar pelo uso indevido de ".", ou o fonte é de outra linguagem de programação, ou de alguma minigui/fivewin.
Se faz parte das LIBs não faço a menor idéia.

API para CIOT

Enviado: 07 Abr 2023 19:17
por JoséQuintas
Mais um pouco ?

A julgar pelo uso de jsonImport().... deve ser equivalente a hb_JsonDecode() e inventaram outra, ou outra linguagem ou xharbour, sei lá.
Talvez oJson := hb_JsonDecode( cResponse )

a julgar pelo uso de jsonget(), deve ser o uso de hash, que inventaram alguma função desnecessária
Talvez oJson[ "CIOT" ]

JsonRelease( oJson ), dever ser oJson := Nil e inventaram função, sei lá.

JsonToStr() devem ter inventado função pra do harbour hb_JsonEncode()

JsonNew() devem ter inventado função pra x := hb_Hash(), mas parece até coisa de Visual Basic, a julgar pelo uso e pela destruição no final

É tudo chute, mas é por aí.
Como eu disse.... fontes suspeitos.

E tava preocupado com o #include "hbapi.h"

Tudo que fiz é coisa normal: compilar e ver os erros.

Depois foi suposição pelos nomes ou pelo uso.

API para CIOT

Enviado: 07 Abr 2023 19:26
por JoséQuintas
LOCAL oData := {}
LOCAL cJson := JsonToStr(oData)
LOCAL oHeaders := {}
LOCAL cResult := HttpPost(cUrl, cJson, oHeaders)
LOCAL oResponse := JsonToObj(cResult)

oData["valor"] := 1000.00
oData["id_carreteiro"] := "123456"
oData["tipo_operacao"] := "carga"
oData["descricao"] := "Frete para São Paulo"
oData["placa_veiculo"] := "AAA1234"
oData["placa_reboque1"] := "BBB5678"
oData["cpf_cnpj_pagar"] := "12345678900"
oData["nome_pagar"] := "Transportadora XPTO"
oData["cidade_origem"] := "Rio de Janeiro"
oData["uf_origem"] := "RJ"
oData["cidade_destino"] := "São Paulo"
oData["uf_destino"] := "SP"
Mais um pouco...
Por causa do uso LOCAL em lugar errado, ao mover pra cima, oResponde := JsonToObj(cResult) ficou em lugar errado, o que precisa ser convertido só está mais pra frente, teria que separar a declaração da variável do uso dela.

Quem deixa ficar declarando no meio do fonte é VISUAL BASIC.
Quem cria objetos pra usar depois é VISUAL BASIC oJson := JsonNew()
Quem usa "." pra classes é VISUAL BASIC
Quem destrói objetos é VISUAL BASIC JsonRelease( oJson )
Tudo indica que é um fonte visual basic ajustado, que nunca foi usado em harbour

Procure outra referência porque esses fontes não servem.

API para CIOT

Enviado: 07 Abr 2023 20:04
por JoséQuintas
erro.png
Chutando tudo, como possibilidade, diz que esse endereço de internet não existe.
Mais essa também.....

Código: Selecionar todos


PROCEDURE gerarCIOT()

   LOCAL cUrl := "https://api.truckpadpay.com.br/v1/emissao"
   LOCAL cToken := "seu-token-aqui"
   LOCAL oData := hb_Hash()
   LOCAL cResposta, oJson

   oData["valor"] := 1000.00
   oData["id_carreteiro"] := "123456"
   oData["tipo_operacao"] := "carga"
   oData["descricao"] := "Frete para São Paulo"
   oData["placa_veiculo"] := "AAA1234"
   oData["placa_reboque1"] := "BBB5678"
   oData["cpf_cnpj_pagar"] := "12345678900"
   oData["nome_pagar"] := "Transportadora XPTO"
   oData["cidade_origem"] := "Rio de Janeiro"
   oData["uf_origem"] := "RJ"
   oData["cidade_destino"] := "São Paulo"
   oData["uf_destino"] := "SP"

   cResposta := HttpPost( cUrl, oData, "application/json", "Bearer " + cToken )

   ? "Resultado: ", cResposta

   oJson := hb_JsonDecode( cResposta )

   ALTD() // debugar pra ver os nomes em oJson

   ? oJson[ "CIOT" ] // chute

   RETURN

FUNCTION httpPost( cUrl, oData, cHead1, cHead2 )

   LOCAL oWeb, cResposta

   oWeb := win_OleCreateObject( "MSXML2.ServerXMLHTTP" )
   oWeb:Open( "PUT", cUrl, .F. )
   oWeb:SetRequestHeader( "Content-Type", cHead1 )
   oWeb:SetRequestHeader( "Authorization", cHead2 )
   oWeb:Send( hb_JsonEncode( oData ) )
   oWeb:WaitForResponse( 100 )
   cResposta := oWeb:ResponseBody()

   RETURN cResposta

API para CIOT

Enviado: 08 Abr 2023 14:26
por ivanil
Ola Quintas;

Um dia desse eu vi este post e achei o código estranho....

Mas hoje eu estava fazendo uns testes com OpenAI e aí eu entendi... este código postado foi gerado por ela... por isso algumas coisas fora do lugar e ilógico, indicação de cabeçalho sem necessidade, pelo menos os sintomas são exatamente esses que apareceram nos meus testes; provavelmente o fornecedor da API provavelmente lançou um protótipo na IA e pediu uma conversão para harbour... novos tempos..kkk

Grande abraço.

API para CIOT

Enviado: 08 Abr 2023 15:19
por Alexandre Silva
Opa Foi isso mesmo Ivanil.
Como nao connheco achei que poderia funcionar..
Mas entao, para usar essa API o melhor metodo é com CUrl certo ?
Ou tem outras formas ? o PayLoad é em Json.

API para CIOT

Enviado: 08 Abr 2023 16:46
por ivanil
Ola Alexandre,

você vai conseguir, usando este ultimo exemplo que o Quintas passou; mas você vai ter que voltar ao fornecedor e pegar pelo menos os caminhos corretos, é geralmente fornecido um ambiente de QA para testes; sem isso vc vai ficar sempre achando uma coisa e o problema está no endereçamento.

At.

Ivanil

API para CIOT

Enviado: 08 Abr 2023 17:15
por Alexandre Silva
Ok Obrigado
Vou trabalho em cima disso
Ruim é trabalhar com esse json, se fosse xml era bem mais facil
Como vou fazer essas identacoes no modelo do Jose Quintas ?
Ou tem como colocar a informacao de outra forma ?

"date_finish": "30/11/2021",
"doc_freight": [
{
"doc_freight_type": "1",
"doc_freight_number": "123456789",
"doc_freight_cubing": "300.00",
"doc_freight_commodity_value": "90.00",
"doc_freight_weight": "300.00",
"doc_freight_nature": "2617",
"fiscal_person": [
{
"fiscal_type": "1",
"fiscal_doc_type": "1",
"fiscal_doc_number": "89.637.085/0001-27",

Código: Selecionar todos

{
  "integrated_by": "70ecda3b-1c2c-43b4-b730-f7af34a114ff",
	"payment_method": "1",	
	"contractor_operation_type": "1",
	"id_freight_client": "89182",
	"freight_credited": "OWNER",
	"load_weight": "300.00",
	"load_nature": "2617",
	"source_state": "SP",
	"source_city": "SÃO PAULO",
	"source_city_ibge": "5300108",
	"source_cep": "13880000",
	"destination_state": "DF",
	"destination_city": "BRASÍLIA",
	"destination_city_ibge": "5300108",
	"destination_cep": "13880000",
	"toll_value": "",
	"fuel_value": "",
	"date_departure": "30/11/2021",
	"date_finish": "30/11/2021",
	"doc_freight": [
		{
			"doc_freight_type": "1",
			"doc_freight_number": "123456789",
			"doc_freight_cubing": "300.00",
			"doc_freight_commodity_value": "90.00",
			"doc_freight_weight": "300.00",
			"doc_freight_nature": "2617",
			"fiscal_person": [
				{
					"fiscal_type": "1",
					"fiscal_doc_type": "1",
					"fiscal_doc_number": "89.637.085/0001-27",
					"fiscal_name": "José",
					"fiscal_address_zip_code": "01308-020",
					"fiscal_address": "Rua das Laranjeiras"
				},
				{
					"fiscal_type": "2",
					"fiscal_doc_type": "1",
					"fiscal_doc_number": "09.144.751/0001-56",
					"fiscal_name": "José",
					"fiscal_address_zip_code": "01308-020",
					"fiscal_address": "Rua das Laranjeiras"
				},
				{
					"fiscal_type": "3",
					"fiscal_doc_type": "1",
					"fiscal_doc_number": "09.144.751/0001-56",
					"fiscal_name": "José",
					"fiscal_address_zip_code": "01308-020",
					"fiscal_address": "Rua das Laranjeiras"
				},
				{
					"fiscal_type": "4",
					"fiscal_doc_type": "1",
					"fiscal_doc_number": "09.144.751/0001-56",
					"fiscal_name": "José",
					"fiscal_address_zip_code": "01308-020",
					"fiscal_address": "Rua das Laranjeiras"
				}
			]
		}
	],
	"hired": [
		{
			"hired_type": "1",
			"hired_name": "Gaby",
			"hired_doc": [
				{
					"hired_doc_type": "2",
					"hired_doc_number": "34861575826"
				},
				{
					"hired_doc_type": "5",
					"hired_doc_number": "11577578"
				}
			],
			"hired_account_agency": "1",
			"hired_account_agency_digit": "1",
			"hired_account_number": "1",
			"hired_account_bank": "237",
			"hired_account_type": "1"
		},
		{
			"hired_type": "2",
			"hired_name": "",
			"hired_doc": [
				{
					"hired_doc_type": "",
					"hired_doc_number": ""
				}
			]
		},
		{
			"hired_type": "3",
			"hired_name": "Werley",
			"hired_doc": [
				{
					"hired_doc_type": "2",
					"hired_doc_number": "11443626520"
				}
			]
		}
	],
	"vehicle": [
		{
			"vehicle_plate": "PZV8946",
			"vehicle_rntrc": "11577578",
			"vehicle_category": "1"
		}
	],
  "parcel": [
		{
			"parcel_effectiveness_type": "2",
			"parcel_value": "100.00",
			"parcel_subtype": "1",
			"parcel_status_id": "2",
			"parcel_number_client": "1"
		},
	"freight_value_gross": "200.00",
	"tax": [
		{
			"tax_type": "IR",
			"tax_value": "1.00"
		}
	],
		"discharge": [
		{
			"discharge_reservation": "2",
			"discharge_place": "2",
			"discharge_discount_type": "2",
			"discharge_load_type": "1",
			"discharge_tolerance": "10"
		}
	]
}



API para CIOT

Enviado: 08 Abr 2023 17:31
por ivanil
Ola Alexandre;

Endentação é irrelevante a API que consome os dados; é como xml, nao importa se vc junta linha, os identificadores estando certo é o que importa;
Quanto a usar um ou outro, o modelo que vc mostrou demonstra que a API trabalha com json, na verdade, basicamente tudo hoje é Json; melhor se acostumar.

At.

Ivanil

API para CIOT

Enviado: 08 Abr 2023 18:41
por JoséQuintas
Alexandre Silva escreveu:Ruim é trabalhar com esse json, se fosse xml era bm mais facil
O harbour tem função pra json.
O próprio fonte já mostra: é só criar como hash array, e o harbour converte.

A grosso modo, hash array é array que usa nome ao invés de número.

Mas atenção, o json mistura hash array e array, conforme o nível.

Se consegue exemplos, pode partir do exemplo e olhar pelo debug pra evitar erros.

{ } (chaves) indica hash array, é nome e conteúdo
[ ] (colchetes) indica array
json.png

Código: Selecionar todos

xValue := hb_Hash()
xValue[ "intergrated_by", "70ecda3b-1c2c-43b4-b730-f7af34a114ff" ]
xValue[ payment_method", "1" ]
...
xValue[ "doc_freight" ] := {} // aqui array/lista 1, vai adicionar elementos aqui
   // criar lista 1
   xValue2 := hb_Hash()
   xValue2[ "doc_freight_type", "1" ]
   ...
   xValue2[ "fiscal_person" ] := {} // aqui array/lista 2
      // criar elementos do array/lista 2
      xValue3 := hb_Hash()
      xValue3[ "fiscal_type", "1" ]
      ...
     AAdd( xValue2[ "fiscal_person" ], xValue3 ) // adiciona na lista 2
     ..
   AAdd( xValue[ "doc_freight" ], xValue2 ) // adiciona na lista 1

API para CIOT

Enviado: 08 Abr 2023 18:47
por JoséQuintas
"TALVEZ" dividir em módulos/funções evite erros.

Código: Selecionar todos

xValue := hb_Hash()
xValue[ "intergrated_by", "70ecda3b-1c2c-43b4-b730-f7af34a114ff" ]
xValue[ payment_method", "1" ]
...
xValue[ "doc_freight" ] := Lista1()


FUNCTION Lista1()

   LOCAL aList := {}, xValue

   DO WHILE ! Eof() // se tem vários alguma coisa vai ter pra processar
      xValue := hb_Hash()
      xValue[ "doc_freight_type", "1" ]
      ...
      xValue[ "fiscal_person" ] := Lista2()
      AAdd( aList, xValue )
   ENDDO

   RETURN aList

FUNCTION Lista2()

   LOCAL aList := {}, xValue 

   DO WHILE ! Eof()
         xValue := hb_Hash()
         xValue[ "fiscal_type", "1" ]
         ...
        AAdd( aList, xValue )
   ENDDO

   RETURN aList

API para CIOT

Enviado: 11 Abr 2023 16:40
por Alexandre Silva
Obrigado
Estou trabalhando como essas informacoes todas
No caso abaixo nao aceitou compilar deu
Error E0020 Incomplete statement or unbalanced delimiters

Código: Selecionar todos

xValue := hb_Hash()
xValue[ "intergrated_by", "70ecda3b-1c2c-43b4-b730-f7af34a114ff" ]
xValue[ "payment_method", "1" ]
entao mudei para

Código: Selecionar todos

xValue := hb_Hash()
xValue[ "intergrated_by"]:= "70ecda3b-1c2c-43b4-b730-f7af34a114ff" 
xValue[ "payment_method"]:= "1"
É a mesma coisa nao é ?

API para CIOT

Enviado: 11 Abr 2023 17:00
por JoséQuintas
Alexandre Silva escreveu:É a mesma coisa nao é ?
NÃO, É TOTALMENTE DIFERENTE, PRA SITUAÇÕES DIFERENTES.
Lembra do que falei ? hash é igual array, a diferença é usar texto ao invés de valor

Código: Selecionar todos

a[ 1, 2 ]
a[ 1 ] := 2
No primeiro está usando o elemento 2 do array 1
No segundo está atribuindo um valor ao elemento 1
Tanto faz se é array com número ou hash array com nome.

estes dois são equivalentes, mas trata-se só do uso:

Código: Selecionar todos

a[ 1, 2 ]
a[ 1 ][ 2 ]
Voltando ao seu fonte:
Estava usando um valor pronto que não existia, ao invés de atribuir um valor.
Para o compilador, usar um valor pra nada não existe. (exceto pra evitar erro em compilação -w3)

API para CIOT

Enviado: 11 Abr 2023 17:53
por Alexandre Silva
ok
Depois de montado esse Json, tenho como ver , de preferencia num arquivo. para ver se esta tudo certo ?
Poder copiar e colar no Postman para testar..

Tem uma funcao para isso ?
Ou vai ficar apenas na Memoria para ser enviado ?

API para CIOT

Enviado: 11 Abr 2023 18:17
por JoséQuintas
Isso é uma variável HASH.

hb_JsonEncode( variavel ) vai converter

Pode salvar o resultado disso, é um texto.

Pode colar o texto no postman (imagino que isso seja pra testes)