Painel de líderes
Conteúdo popular
Showing content with the highest reputation on 04-02-2020 em todas as áreas
-
Configurações do ACBrMail para os principais serviços de emails do mercado outlook e hotmail smtp: smtp.office365.com porta: 587 tsl : true; ssl : false; Referência: Microsoft hotmail O smtp.live.com, utilizado anteriormente para o hotmail, parou de funcionar. Para utilizar o smtp.office365.com: 1. Ao entrar no hotmail, embaixo tem a opção atualizar para microsoft office365 premium. 2. Depois, crie uma conta grátis que já atualiza o hotmail para receber email office365. office365 smtp alternativo: smtp-legacy.office365.com gmail smtp: smtp.gmail.com usuario: [email protected] porta: 465 tsl : true; ssl : true; é necessário criar uma senha para a aplicação, portanto não é permitido mais utilização da senha principal da conta. 1. Ativar a verificação em duas etapas. 2. Criar uma senha para a aplicação. https://myaccount.google.com/apppasswords yahoo smtp: smtp.mail.yahoo.com.br porta: 587 tsl : true; ssl : false; password: não use a senha padrão da conta, precisará criar uma exclusiva para sua aplicação. siga os passos abaixo: criada pelo link https://login.yahoo.com/account/security#less-secure-apps e depois 'Gerenciar Senha de app', selecione 'Outro app' ,der um nome ao app, e clique gerar senha.; Veja ainda, a dica desse Post sendgrid smtp : smtp.sendgrid.net usuario: nome da conta senha : senha da conta tsl : true; ssl : false; porta: 465 Autor: @Aurino Locaweb From := '[email protected]'; FromName := 'Nome do Remetente'; Host := 'email-ssl.com.br'; Username := '[email protected]'; Password := 'Sua_Senha'; Port := '465'; SetTLS := False; SetSSL := True; Locaweb2 From := '[email protected]'; FromName := 'Nome do Remetente'; Host := 'email-ssl.com.br'; Username := '[email protected]'; Password := 'Sua_Senha'; Port := '587'; SetTLS := True; SetSSL := False; SparkPost From := '[email protected]'; FromName := 'Nome do Remetente'; Host := 'smtp.sparkpostmail.com'; Username := 'SMTP_Injection'; Password := '8a93c971789791b0102d889dd8f5f9b40507288d'; // Sua API Key Port := '587'; SetTLS := True; SetSSL := False;12 pontos
-
Link da noticia: https://www.portalntc.org.br/publicacoes/blog/noticias/rodoviario/decisao-liminar-suspende-por-240-dias-resolucao-da-antt-com-novas-regras-do-ciot4 pontos
-
4 pontos
-
A situação no ambiente de testes (wssathomolog) foi normalizada após última alteração realizada pela Sefaz. Solicitamos os que possuem equipamentos SAT que vinham tendo problemas de comunicação com a Sefaz, e que foram ativados antes de novembro de 2019, que renovem os certificados digitais através do comando_001 até 14/02/2020. Após o prazo e sem que seja realizada a renovação do certificado, os equipamentos SAT em questão não funcionarão. Fonte: https://portal.fazenda.sp.gov.br/servicos/sat2 pontos
-
Teste com esta unit. Coloque no seu código para desativar a nova propriedade Agrupar pagamentos. ACBrTEFD1.AgruparPagamentos := False; ACBrTEFD.pas2 pontos
-
Bom dia a todos Hoje o web service "http://webservices.sef.sc.gov.br/wsDfeSiv/Recepcao.asmx" saiu do ar, como medida trocamos os métodos de envio e consulta: EnviarBlocoX por TransmitirArquivoBlocoX ConsultarBlocoX por ConsultarProcessamentoArquivo Está funcionando corretamente, não recebemos uma resposta oficial do SEFAZ/SC, mas provavelmente essa é solução.2 pontos
-
Bom dia! Esta consulta eu fiz para exemplificar o problema (e é o mesmo documento que me causou problemas). A consulta foi feita no dia 03/02/2020, três dias após a ocorrência do último evento registrado e mesmo dia do post. Vou entrar em contato com o pessoal do SEFAZ-PR. Se eles tiverem alguma resposta relevante eu posto aqui.2 pontos
-
Não notei problemas com a DLL... por favor tente instalar esse MSVC Runtime https://support.microsoft.com/pt-br/help/2977003/the-latest-supported-visual-c-downloads2 pontos
-
Sim, não existe regra de DAV/PV para NFC-e. Eu utilizo a mesma estrutura que existia no ECF referente a DAV/PV para NFC-e. Mas sem os bloqueios que o ECF exigia, tipo cancelar as ultimas PV que estão no BD do PDV que não foram faturadas, etc...2 pontos
-
Bom dia Jéter, Muito obrigado pela colaboração, já esta no repositório.2 pontos
-
Tópico pode ser fechado. Era erro interno do Sistema mesmo e não do Emulador. Agradeço a todos e desculpa pela demora de retorno.2 pontos
-
nossa!!!!! eu estava baixando o primeiro link acreditando que seria o mais atual, problema resolvido. muito obrigadoooooooooooo, Guto2 pontos
-
Bom dia Precisa gerar o XML com as mesmas informações como: Ano, Mes, Numero NFe, Codigo NFe. Dessa forma vai gerar com a mesma chave. Lembrando que o Código NFe deve ser um número aleatório, mas para gerar a mesma chave precisa utilizar o mesmo Código Outro detalhe, se utilizar o método CriarNFe deve utilizar o método EnviarNFe. O método CriarEnviarNFe já gera o XML e realiza o envio em um único método.2 pontos
-
Resolvido pessoal!!! Na época era falta de conhecimento meu mesmo galera tava meio que iniciando na area mas obrigado pelas ajudas vinda de vocês.2 pontos
-
Boa noite, Finalizar tópico, estava revendo o processo e vi que tinha uma validação, no caso só leva a informação caso o COD_MOD, seja 66. Obrigado.2 pontos
-
Não pode. Cada componente se destina a uma declaração ACBrSpedFiscal - EFD ICMS/IPI (antigo Sped Fiscal) ACBrSpedPisCofins - EFD Contribuições (antigo Sped PIS/COFINS) Os blocos podem ser semelhantes em alguns casos mas os layouts não são compatíveis. E o fato de não ter o bloco B no exemplo do ACBrSpedFiscal não significa que não esteja implementado no componente, você ainda pode gerar o bloco B do Sped Fiscal baseando-se nos exemplos de geração dos demais blocos.2 pontos
-
2 pontos
-
Boa tarde Chegou a realizar testes apenas utilizando a maquina local? Notei pelo log que gerou o XML no primeiro método, depois não obteve resposta, pode estar ocorrendo algum problema com acesso aos dados em rede.1 ponto
-
Confere algumas coisas. por exemplo versão da NFC-e informado e se tem a parte do QRCode e por fim a questão do path mesmo e se salvou tudo antes de fazer o teste1 ponto
-
Boa tarde Cezar, Favor anexar o XML e o fragmento da rotina que alimenta os campos em questão.1 ponto
-
Boa tarde @Milton Lima Se ainda estiver com problemas para emissão em contingência da NFCe, sugiro que dê uma olhada nessa apresentação. Embora seja sobre o ACBrMonitor, pode exemplificar como deve ser tratada na sua aplicação... Precisa armazenar a chave que enviou e não obteve retorno, para uma posterior consulta...1 ponto
-
Vale ressaltar que tal decisão abrange tão somente as empresas representadas pelos respectivos sindicatos.1 ponto
-
1 ponto
-
Olá Leandro Cavalieri. Uma possibilidade talvez seja você utilizar a ACBrLib para conseguir o que gostaria.1 ponto
-
Bom dia Italo, Testes realizados, está tudo ok, muito obrigado.1 ponto
-
1 ponto
-
Creio que tu está misturando Paf-ECF com NFC-e Paf-ECF tem as regras e legislações especificas, já NFC-e e contigo1 ponto
-
Resolvido... Foi regra no webservice que já desfizeram Obrigado a todos pela atenção Att Adriano1 ponto
-
1 ponto
-
A mudança começa a valer em 1º de fevereiro de 2020 e atinge as notas com mercadorias enquadradas com o Código de Sistema Tributário (CST 60), referente à cobrança do ICMS por Substituição Tributária – quando o imposto é cobrado de forma antecipada -, e que estejam com os campos específicos do valor da Base de Cálculo do ICMS ST Retido (vBCSTRet) e do valor do ICMS ST Retido (vICMSSTRet) não preenchidos. Ou seja, a partir da adoção das regras de validação N12-81 e N12a-50, conforme a Nota Técnica 2018.005, o arquivo eletrônico de NFe será rejeitado. Com isso, de acordo com o Decreto nº 330, de 30 de outubro de 2019, passa a ser expressamente obrigatório para o contribuinte substituído o preenchimento dos campos específicos com os valores tanto da base de cálculo quanto do imposto retido por Substituição Tributária. Fonte: https://www.prontasc.com.br/substituicao-tributaria-emissao-de-nfe/1 ponto
-
Obrigado por reportar. Fechando. Para novas dúvidas, criar um novo tópico.1 ponto
-
tive esse problema em RS,, porem em produção, só apliquei todas as atualizações no windows 10 pro e tudo resolvido!1 ponto
-
Veja na Janela do Emulador... mais detalhes sobre o erro... provavelmente você tem um XML fora da especificação do XSD1 ponto
-
1 ponto
-
Ok Italo ! Muito Obrigado pela Atenção ! Resolvido1 ponto
-
Estranho... O retorno "lote em processamento" não faz sentido no modo síncrono. No modo síncrono não existe o retorno do número do recibo, então fica impossível fazer a consulta do lote depois. Então se está recebendo esse retorno mesmo em modo síncrono, provavelmente é problema na SEFAZ mesmo...1 ponto
-
Olá Onclick, Acabei de enviar ao SVN na revisão 18970 uma possível correção para esse problema. Queira por favor atualizar, testar e reportar qualquer problema.1 ponto
-
1 ponto
-
Olá Pessoal, A lista de cidades que é possível emitir NFS-e através do componente ACBrNFSe já passa de 1.100, sendo não vou listar aqui nesse tópico. Quem desejar saber se a cidade XYZ consta dessa lista peço que abra o arquivo Cidades.ini que se encontra na pasta: ...\Exemplos\ACBrDFe\ACBrNFSe\ArqINI http://svn.code.sf.net/p/acbr/code/trunk2/Exemplos/ACBrDFe/ACBrNFSe/ArqINI/Cidades.ini Veja um exemplo abaixo: [3503208] Nome=Araraquara UF=SP Provedor=GINFES Na primeira linha temos o código IBGE, depois o Nome, UF e por fim qual é o provedor, ou seja, empresa contratada por licitação pela prefeitura. Os contratos por licitação tem prazos de termino definido e não poder ser renovados automaticamente. Sendo assim quando o contrato termina uma nova licitação é feita com varias empresas e pode ocorrer como ocorreu em diversas cidades de uma outra empresa ganhar. Algumas cidades tem o seu próprio sistema. O componente hoje reconhece por volta de 113 provedores (empresas que implementam nas cidades os seus webservices para recepcionar as notas). Dos quais 16 possuem um layout próprio, os demais, ou seja, 97 se dividem metade se utilizam da versão 1 do layout da ABRASF e a outra metade se utilizam da versão 2. Na mesma pasta mencionada acima que contem o arquivo Cidades.ini, vocês encontram os arquivos INI de cada um desses provedores. Peço a todos que não deixem de ler os artigos abaixo:1 ponto
-
Boa tarde Pessoal, Esse tópico já esta com 4 paginas e os assuntos estão se misturando. Vou fechar, para que ele não se transforme um com umas 20 paginas. Caso alguém detecte algo que precise ser corrigido nos fontes do componente, por favor criem um novo tópico para a devida correção. Se alguém desejar passar alguma informação a respeito do CIOT, por favor criem um tópico exclusivo para o assunto. Agradeço a colaboração e compreensão de todos.1 ponto
-
Boa tarde. Estou verificando. Mas como há várias vendas e vários dias não consegui identificar exatamente em qual venda aconteceu o problema relatado. Vocês alguma informação da venda onde aconteceu o problema? Talvez o horário e o valor?1 ponto
-
O apagarACBr.bat não apaga alguns dcu, geralmente os de terceiros. Então mesmo executando o apagaracbr ainda pode haver algum arquivo smtpsend.dcu ou smtpsend.pas desatualizado em algum lugar que o Delphi está encontrando na compilação. Então você precisa fazer uma varredura em todos os discos por estes arquivos e se for o caso removê-los ou atualizá-los.1 ponto
-
Bom dia Matheus, Você vai precisar mudar, deixar de usar o Capicom e passar a utilizar o WinCrypt, pois a SEFAZ esta desativando os protocolos: SSL, TLS 1.0 e TLS 1.1 Só vai aceitar o protocolo TLS 1.21 ponto
-
Bom dia! A obrigação para emissão de NFCe com série específica de contingência estava previsto para março de 2020. Porém foi revogado o uso de série específica de contingência para NFCe, após já ter ocorrido algumas prorrogações para entrar em vigor. Leia este post do Italo aonde ainda se informava a possibilidade deste critério ser aplicado.1 ponto
-
Porque devo assinar digitalmente meus executáveis ? O Produto final de quase todo desenvolvedor de Software para Windows, é gerar um arquivo compilado e executável, ou seja, um arquivo com a extensão .EXE ou .DLL As versões recentes do Windows, incorporaram recursos de segurança, como o SmartScreen, que podem causar alertas quando Binários não assinados são executados... O mesmo pode ocorre com módulos de Segurança de terceiros, instalados na máquina, como por exemplo: Antivírus e módulos de segurança bancários... Para evitar mensagens assustadoras, como a exibida abaixo, é necessário Assinar digitalmente o seu binário, com um certificado emitido por uma Autoridade Certificadora válida A título de exemplo, todos os binários distribuídos pelo Projeto ACBr, na área de Download do SAC ACBr, são assinados digitalmente com um certificado do Projeto ACBr... Reparem que não somente o Executável final, mas o instalador, também deve ser assinado.. Abaixo, temos a imagem de quando é executamos o Instalador do ACBrMonitorPLUS SAC Bem melhor, não ? Repare que o Fornecedor do binário, fica bem identificado na mensagem... Isso além de trazer mais confiança para o usuário final, ajuda os programas de segurança, a classificar de forma positiva, o seu Executável ou instalador, evitando bloqueios indevidos. Ok, gostei... mas como fazer para assinar meus executáveis ? O primeiro passo é comprar um Certificado do tipo "Code Signing"... Garanto que agora você pensou algo como: - Humm.. será que posso usar o meu certificado A1 ou A3 ? A resposta é NÃO... os certificados que usamos para os Documentos Fiscais eletrônicos brasileiros, não tem as características esperadas pelo Windows, para assinatura e validação de binários... Quanto aos certificados gerados de forma local, ou seja, os Self-Signed Certificates, eles funcionarão para a assinatura... e podem ser ótimos para testes... Mas eles não devem garantir o nível de confiabilidade ao seu binário, pois eles não são gerados por uma Autoridade Certificadora válida Algumas empresas Brasileiras, vendem o certificado do tipo Code Signing.. Veja por exemplo esse link... Porém o preço é praticamente "o valor de um Rim esquerdo"... (ps: veja mais empresas brasileiras, no post a seguir) Você pode comprar o Certificado do Tipo OV, que é bem mais barato... Na página da KSoftware tem um interessante artigo, descrevendo a diferença da versão OV x EV Eu preferi comprar nesse site gringo, porém isso pode exigir que você tenha um bom conhecimento de Inglês, pois o todo o processo de compra será feito em Inglês. Esse certificado, também exige um processo de validação... ou seja, a Empresa que irá emitir o certificado, precisa saber se você é você mesmo... A validação foi feita pela empresa Sectigo... eles enviam e-mails com links para você subir a documentação necessária... Como o certificado será emitido para uma Entidade Pessoa Jurídica, na etapa de envio de documentos de prova de identidade... eu enviei um PDF com o resultado da consulta de meu CNPJ, na Receita... Na etapa final de validação, eles efetuam uma ligação para o telefone de sua empresa, para fornecer um Token, que deve ser usado para gerar o certificado... portanto, o número de telefone na documentação que você enviar, deve ser um número que você possa atender... Achei o Site de Validação da Sectigo, bastante confuso... Eu preferi comprar a opção de 4 anos, para evitar esse penoso processo de compra, e pelos descontos oferecidos... Após todas as validações de identidade, eles lhe enviarão um Link para baixar o certificado em sua máquina... Será criado um arquivo PFX, e o processo de geração do Certificado na sua máquina, é muito semelhante a dos Certificados A1 brasileiros... Ufa.. já tenho o meu certificado em PFX... Como eu assino os binários ? Existem algumas ferramentas disponíveis... na página da KSoftware, você pode ler um tutorial, de como assinar usando o KSign Você poderá assinar binários facilmente, usando a interface gráfica deles: Para automatizar o processo de assinatura, você provavelmente ira preferir usar um utilitário de Linha de Comando... Repare que na mesma pasta onde o KSign foi instalado, existe o utilitário signtool.exe Use esse utilitário com a seguinte sintaxe: signtool.exe sign /du "http://seusite.com.br" /d "Descrição do seu Programa" /f "C:\Path\SeuCertificado.PFX" /p SenhaCertififcado /t "http://timestamp.comodoca.com" SeuBinario.exe sign -> Comando para assinatura /du -> Informa a URL do seu Site /d -> Informa uma descrição resumida do seu Programa /f -> Informa o Path completo para o seu Certificado (arquivo PFX) /p -> Informa a Senha para abertura do seu Certificado /t -> Informa um Servidor de Time Stamp, para que fique gravada a Data / Hora da assinatura Mas como assinar um Binário Windows, de dentro do Linux ?? Todo processo de Build e Deploy dos binários do ACBr, é executado em um Linux OpenSuse. A compilação de todas as plataformas que suportamos ocorre com Cross-Compiling, e automatizamos o processo de Build e Deploy, com o uso de Jenkins e Shell Scripts, Para transmitir o binário para fórum, criamos alguns utilitários que consomem a API do Invision Power Board Para a assinatura dos binários, creio que seria possível usar o próprio signtool.exe, com Wine... mas encontramos um interessante utilitário nativo em Linux, chamado osslsigncode, repare que a sintaxe é muito semelhante a do signtool.exe... osslsigncode sign -pkcs12 /path/SeuCertificado.pfx -pass SuaSenha -n "Descrição do seu Programa" -i http://seusite.com.br -t http://timestamp.comodoca.com -in SeuBinario.exe -out SeuBinario.exe.sign (como passo final, apague o arquivo original, SeuBinario.exe e renomeie SeuBinario.exe.sign para SeuBinario.exe)1 ponto
-
tentei mais algumas opções e não deu certo... segue o array contendo apenas 1 item retornado do json: [{"name":"PEDIDO DE TESTE - GRANDE 3 SABORES","quantity":1,"price":0.0,"subItemsPrice":55.98,"totalPrice":55.98,"discount":0.0,"addition":0.0,"externalCode":"25","subIte ms":[{"name":"BORDA DE CHEDDAR","quantity":1,"price":6.0,"totalPrice":6.0,"discount":0.0,"addition":0.0,"externalCode":"3000"}, {"name":"1\/3 3 QUEIJOS","quantity":1,"price":16.66,"totalPrice":16.66,"discount":0.0,"addition":0.0,"externalCode":"30"}, {"name":"1\/3 CALABRESA","quantity":1,"price":15.0,"totalPrice":16.66,"discount":0.0,"addition":1.66,"externalCode":"31"}, {"name":"1\/3 MUSSARELA","quantity":1,"price":10.0,"totalPrice":16.66,"discount":0.0,"addition":6.66,"externalCode":"32"}]}] aqui uma simples leitura do array json em um botao do delphi procedure TfrmPrincipal.BitBtn6Click(Sender: TObject); var LJsonArr : TJSONArray; i: integer; ObjetoJsonLinha : TJSONObject; begin LJsonArr := TJSONObject.ParseJSONValue(TEncoding.ASCII.GetBytes(mJson.Lines.Text),0) as TJSONArray; if (LJsonArr.Count > 0) then for I:=0 to LJsonArr.Count - 1 do begin ObjetoJsonLinha := LJsonArr.Items as TJSONObject; showmessage( objetojsonlinha.GetValue('name').value ); showmessage( objetojsonlinha.GetValue('subItems').value ); end; end; o array é carregado normalmente, quando uilizo o showmessage para mostrar o valor dentro do campo NAME a mensagem é retornada corretamente, quando utilizo o showmessage para mostrar o conteudo ou tento pegar o conteudo dentro do campo subItems ele dá erro de acesso ( erro básico do delphi ). Testando o exemplo que me passou se eu deixo o array completo como acima ele me diz que não é um objeto válido ( pois é um array ) se eu tiro os colches e deixo como objeto json e não array eu clico no botao e ele nao processa nada ( vide imagem ) preciso apenas ler o valor dentro do campo subitens ( que será o array json contendo os valores dos campos subitens, name, quantity, price ( etc etc ), porém sempre que tento acessar isto no delphi com tostring, value ou qualquer outra funcão relacionada a subItems ele dá erro e não consigo resolver isto, já tentei muitos exemplos e nada...1 ponto
-
Sim, quando o iFood monta o JSON, eles ignoram arrays, strings, números, objetos em branco. Deixando assim o retorno somente com o que é necessário. Como eu citei acima, aqui eu criei um unit com todos os retornos possível do JSON (property). Depois eu só converto o JSON para um ObjectList usando generics. Fiz um exemplo bem simples, só pra mostrar que de um lado eu tenho um memo com o JSON do iFOOD e do outro o meu ObjectList. Vou deixar o código aqui. var MyPedidoiFood: TiFoodPedido; x, i: Integer; begin MyPedidoiFood := TJSON.JsonToObject<TiFoodPedido>(MemoJSON.Lines.Text); //Memo com o JSON do iFood try for x := 0 to Length(MyPedidoiFood.items) - 1 do begin MemoClasseDelphi.Lines.Add('Nome mercadoria base: '+MyPedidoiFood.Items[x].name); for i := 0 to Length(MyPedidoiFood.items[x].subItems) - 1 do MemoClasseDelphi.Lines.Add('Nome subitem: '+MyPedidoiFood.Items[x].subItems[i].name); MemoClasseDelphi.Lines.Add(''); end; finally MyPedidoiFood.Free; end; end; E o link do exemplo compilado caso queira testar com um JSON seu. Se estiver utilizando TCustomJSONDataSetAdapter. Você pode aumentar o tamanho da string por essa propriedade: StringFieldSize (antes de criar os campos).1 ponto
-
JsonToDataset não leva em consideração o "detail" de um objeto ou array do json... A melhor forma de você tratar isso é convertendo um JSON para um Object usando Generics Em resumo, você cria uma classe no Delphi igual ao JSON que recebe do iFood. TPayments = class private Fname: string; Fcode: string; Fvalue: Extended; public property name: string read Fname write Fname; property code: string read Fcode write Fcode; property value: Extended read Fvalue write Fvalue; end; TArrayPayments = array of TPayments; TiFoodPedido = class private Fid: string; Freference: string; Fpayments: TArrayPayments; public property id: string read Fid write Fid; property reference: string read Freference write Freference; property payments: TArrayPayments read Fpayments write Fpayments; end; TiFoodPedidos = TObjectList<TiFoodPedido>; No caso do payments é um array. Mas terá casos onde serão objetos (merchant, address, customer...). Sendo assim não esqueça de criar constructor e destructor para criar e destruir esses objetos. constructor TiFoodPedido.Create; begin FCustomer := TCustomer.Create; FDeliveryAddress := TDeliveryAddress.Create; end; destructor TiFoodPedido.Destrtoy; begin FCustomer.Free; FDeliveryAddress.Free; end; Depois você pode simplesmente chamar assim: var PedidoiFood: TiFoodPedido; begin PedidoiFood := TJSON.JsonToObject<TiFoodPedido>('JSON de retorno do iFood'); try //dessa forma você consegue ler os items dentro de um array PedidoiFood.payments[0].name; PedidoiFood.payments[0].code; PedidoiFood.payments[0].value; finally PedidoiFood.Free; end; end; Caso queira adicionar mais pedidos na sua lista: var Pedidos: TiFoodPedidos; PedidoiFood: TiFoodPedido; x: Integer; begin Pedidos := TiFoodPedidos.Create; try for x := 0 to 5 do begin PedidoiFood := TJSON.JsonToObject<TiFoodPedido>('JSON de retorno do iFood'); Pedidos.Add(PedidoiFood); end; //No final poderá acessar assim Pedidos.Items[0].payments[0].name; finally Pedidos.Free; end; end;1 ponto
-
Você pode converter o JSON em DataSet, eu particularmente acho bem mais fácil. client_id e client_secret: Obtido através do cadastro da SoftHouse no site do iFood. username e password: Obtido através do cadastro do seu cliente no site do IFood. Ou seja, devem ser variáveis no seu software. var IdHTTPConexao: TidHTTP; aArg: TStringList; begin IdHTTPConexao := TidHTTP.Create; aArg := TStringList.Create; try aArg.Add('client_id='+FClientID); aArg.Add('client_secret='+FClientSecret); aArg.Add('grant_type=password'); aArg.Add('username='+FUsername); aArg.Add('password='+FPassword); with IdHTTPConexao do begin Request.Accept := 'application/json'; JsonToDataset(FDMemTable1, Post('https://pos-api.ifood.com.br/oauth/token', aArg)); end; FDMemTable1.First; FToken := FDMemTable1.FieldByName('access_token').AsString; //<-Guada esse token para as demais requisições FExpires := FDMemTable1.FieldByName('expires_in').AsString; //<-Deve executar esse método novamente quando expirar finally IdHTTPConexao.Free; aArg.Free; end; Após obter o Token é necessário dar GET no endpoint /events:polling a cada 30 segundos. É aqui que você recebe um resumo dos pedidos ainda não capturados. var IdHTTPConexao: TidHTTP; JSONRetorno: TStringStream; begin IdHTTPConexao := TidHTTP.Create; JSONRetorno := TStringStream.Create('', TEncoding.UTF8); try with IdHTTPConexao do begin Request.Clear; Request.ContentType := 'application/json'; Request.Charset := 'UFT-8'; Request.BasicAuthentication := False; Request.CustomHeaders.Clear; Request.CustomHeaders.AddValue('Content-Type', 'application/json'); Request.CustomHeaders.AddValue('Authorization', 'bearer'+FToken); Request.CustomHeaders.AddValue('cache-control', 'no-cache'); Request.Accept := 'application/json'; Get('https://pos-api.ifood.com.br/v1.0/events%3Apolling', JSONRetorno); JsonToDataset(FDMemTableResumo, JSONRetorno.DataString); end; with FDMemTableResumo do begin First; while not Eof do begin FieldByName('id').AsString; //<-Id do evento. Necessário guardar para limpar a fila depois de processar esse evento. FieldByName('code').AsString; //<-Status retornado para o pedido (Confirmado, cancelado...). FieldByName('correlationId').AsString; //<-Código do pedido. Com esse código que você obtem o detalhamento do pedido. FieldByName('createdAt').AsString; //<-Data de criação do evento. Next; end; end; finally IdHTTPConexao.Free; JSONRetorno.Free; end; end; O próximo passo é executar o endpoints /orders/{reference} através do método GET (https://pos-api.ifood.com.br/v1.0/orders/reference). Substituindo o valor "reference" pelo o correlationId. Ou seja do pedido que deseja. Não vou postar um exemplo pois aqui o código fica grande e cada aplicação tratará diferente os resultados... Mas a lógica é a mesma. Não esqueça de alterar o status do pedido quando processar ele. O status integration é obrigatório. Após processar todos os pedidos, chegou a hora de limpar a fila... Alguns limpam a fila no final do dia. Mas particularmente eu prefiro limpar a fila a cada execução do polling. IdHTTPConexao: TidHTTP; aArg: TStringStream; FIds: string; begin FIds := ''; with FDMemTableResumo do begin while not Eof do begin if FIds <> '' then FIds := FIds + ', '; FIds := FIds + '{"id":"'+FieldByName('id').AsString+'"}'; Next; end; end; if FIds <> '' then begin FIds := '['+FIds+']'; IdHTTPConexao := TidHTTP.Create; aArg := TStringStream.Create(FIds, TEncoding.UTF8); try with IdHTTPConexao do begin Request.Clear; Request.ContentType := 'application/json'; Request.Charset := 'UFT-8'; Request.BasicAuthentication := False; Request.CustomHeaders.Clear; Request.CustomHeaders.AddValue('Content-Type', 'application/json'); Request.CustomHeaders.AddValue('Authorization', 'bearer'+FToken); Request.CustomHeaders.AddValue('cache-control', 'no-cache'); Request.Accept := 'application/json'; Post('https://pos-api.ifood.com.br/v1.0/events/acknowledgment', aArg); end; finally aArg.Free; IdHTTPConexao.Free; end; end; Enfim, é mais ou menos isso... Claro, da pra otimizar muito esse código. Deixei da forma mais simples possível. Uma outra solução seria utilizar RestClient ao invés do Indy.. Vou deixar alguns links bem legais explicando com mais detalhes o funcionamento: Documentação iFood A função JsonToDataSet pode ser encontrada aqui. Palestra do Kleberson Toro para o CodeRage Brasil 2019 Fórum do iFood Ah, uma observação... Na documentação do iFood já podemos notar que existe uma versão 2.0 para a API. A mesma está liberada apenas para /orders. Então caso for integrar, já use o novo endrpoints1 ponto
-
Algumas propriedades importantes, para o ACBrMter Modelo: permite definir qual será o protocolo dos terminais usados em sua rede, podendo ser: mtrVT100, mtrStxEtx, mtrPMTG, mtrSB100 Port: Define a Porta TCP que o ACBrMter deve abrir, para aguardar a conexão dos Micro Terminais da sua rede. Lembre-se de liberar essa Porta em seu Firewall EchoMode: Define o comportamento padrão das teclas recebidas pelos Micro Terminais, mdNormal irá exibir Tecla no Display do Micro Terminal: mdeNormal, mdeNone, mdePassword Terminador: Código em ASC do Terminador padrão, para o recebimento de dados... Normalmente vazio, pois dessa maneira os dados serão transmitidos a aplicação, assim que recebidos, independente do Terminador TerminadorBalanca: Define o Terminador do Protocolo de resposta da Balança, geralmente ETX (#3)... Isso ajudará o ACBrMter a identificar que os dados fora m recebidos de uma Balança TimeOut: Tempo máximo que o ACBrMTer, deve aguarda por uma resposta. Nem todos os comandos retornam dados, e isso depende muito do protocolo. Também é utilizado como TimeOut para leitura de Peso de Balanças WaitInterval: Permite causar uma espera de alguns milisegundos, após o inicio da recepção de algum dado pela Serial. Isso pode prevenir recebimento de dados truncados ou quebrados em várias segmentos. O Valor 0 desativa o atraso.1 ponto