Jump to content
Fivewin Brasil

Wellington Vieira

Membros
  • Posts

    424
  • Joined

  • Last visited

  • Days Won

    10

Posts posted by Wellington Vieira

  1. Boa tarde,

    Já deu uma olhada em:

    https://tecnospeed.com.br/tecnopay/

    Particularmente, aqui em nossa empresa já que teríamos que fazer os boletos on-line via API dos bancos, já incluímos no projeto o PIX  para os bancos: Bradesco, Brasil, CEF, Santander, Sicoob, Itaú. O Suporte desses bancos é muito bom e nos auxiliou no desenvolvimento ao acesso a API deles tanto para os boletos on-line quanto para o PIX entre outras soluções que estas API fornecem. Assim que surge um novo banco, entramos em contato com o developer's que é encaminhado pelo gerente do cliente para este banco.

  2. Já no MYSQL, acredito que pode ser feito assim para os campos gravados na base.

    SELECT
        data_inicial_1,
        hora_inicial_1,
        data_inicial_2,
        hora_inicial_2,
        TIMESTAMPDIFF(MINUTE, CONCAT(data_inicial_1, ' ', hora_inicial_1), CONCAT(data_inicial_2, ' ', hora_inicial_2)) AS diferenca_em_minutos
    FROM
        sua_tabela where id = seu_id;

    Já em comparação a data e hora gravada na base com a data e hora do sistema operacional windows, acredito que possa ser assim.
     

    SELECT
        data_inicial_1,
        hora_inicial_1,
        NOW() AS data_hora_atual,
        TIMESTAMPDIFF(MINUTE, CONCAT(data_inicial_1, ' ', hora_inicial_1), NOW()) AS diferenca_em_minutos
    FROM
        sua_tabela where id = seu_id;

     

  3. SELECT
        data_lancamento,
        hora_lancamento,
        NOW() AS data_hora_atual,
        EXTRACT(EPOCH FROM (NOW()::timestamp - (data_lancamento + hora_lancamento::interval)))/60 AS diferenca_em_minutos
    FROM
        comandas_atendimento where id = numedo_do_id ;

    Lembrando que  os campos data_lancamento é DATE como o seu e o campo hora_lancamento neste exemplo acima eu crio sempre como character(08) e é gravado a time(), ou seja 09:42:25

    Este exemplo acima é a comparação entre uma data e hora gravada na base e a data e hora atual do sistema operacional windows em minutos a resposta.

    SELECT
        data_inicial_1,
        hora_inicial_1,
        data_inicial_2,
        hora_inicial_2,
        EXTRACT(EPOCH FROM (data_inicial_2 + hora_inicial_2::interval) - (data_inicial_1 + hora_inicial_1::interval))/60 AS diferenca_em_minutos
    FROM
        sua_tabela where id = seu_numero_de_id;

    Já este exemplo é a comparação entre datas e horas gravadas na base de dados em minutos a resposta.

    Os dois SELECT foram e são testados no POSTGRESQL.

  4. Boa tarde

    Vou precisar colocar dentro do meu software um editor de texto para a confecção de contratos e estes contratos serão digitados pelo cliente, e ele colocará insiders {} dentro do editor, ou seja um exemplo.

                                                                                                                                                  CONTRATO DE COMPRA DE MOTO

    COMPRADOR:

    Nome: WSISCOM SOFTWARE, CNPJ: 99.999.999/0001-99, Endereço: Rua Qualquer coisa, Nº 537, Bairro: Industrial, Cidade: Contagem/MG, CEP: 99999-999. Telefone para contato: (31) 99999-9999

    VENDEDOR:
    Nome: {NOME DO COMPRADOR},CPF: {CPF DO COMPRADOR}, RG: {RG DO COMPRADOR}, ENDEREÇO: {ENDERECO DO COMPRADOR} – BAIRRO:  {BAIRRO DO COMPRADOR} – CIDADE:  {CIDADE DO COMPRADOR} – ESTADO: {ESTADO DO COMPRADOR}– CEP: {CEP DO COMPRADOR} – TELEFONE CONTATO: {TELEFONE DO COMPRADOR} – E-MAIL: {E-MAIL DO COMPRADOR}

    e assim por diante.

    Ou seja um editor (simples) dentro do próprio programa, que consiga alterar fontes, negrito de palavras e o que estiver entre colchetes, será substituído pela informação da base de dados.

    Alguém já fez algo semelhante, ou saberia me informar um caminho para me nortear no desenvolvimento.

    Abraço



     

  5. Eu criei um PHP e o coloquei em um FTP, e envio o JSON para este PHP pelo método GET. Este PHP recebe o JSON, processa e retorna o que eu devo enviar para o BRADESCO já em "pkcs7" que é o JSON assinado em base64, que é o padrão que o BRADESCO necessita. O Certificado digital pode ser qualquer um no formato ".pfx".

    Segue o PHP

    <?php
    
        function ApagaDir($dir) {
          if($objs = glob($dir."/*")){
            foreach($objs as $obj) {
              is_dir($obj)? ApagaDir($obj) : unlink($obj);
            }
          }
        } 
        $nome_da_pasta="../public_html/data/tmp"; // PASTA PARA ARQUIVO TEMPORARIO
        ApagaDir($nome_da_pasta); 
    
    	$pfx = "";  // lOCAL E NOME DO CERTIFICADO NO FTP EX: CERTS/MEUCERTIFICADO.PFX
    	$certPassword = ""; // SENHA DO CERTIFICADO
        $json_str = $_GET['json_str'];
        $certificado_pfx = file_get_contents($pfx);
    	
        if (!openssl_pkcs12_read($certificado_pfx, $result, $certPassword)) {
            throw new Exception('Não foi possível ler o certificado .pfx');
        }
    	
        $path = sprintf('%s%sdata%stmp%s', realpath('.'), DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR);
        if (@mkdir($path, 0777, true) && !is_dir($path)) {
            throw new Exception('Falha ao criar diretórios. Entre em contato com o administrador');
        }
    
    	$jsonFile   = $path . uniqid('jsonFile', true);
        $signedFile = $path . uniqid('signedFile', true);
    	
    	file_put_contents($jsonFile, $json_str);
    
        $certKey = openssl_x509_read($result['cert']);
        $privKey = openssl_pkey_get_private($result['pkey'], $certPassword);
    	
    	openssl_pkcs7_sign( $jsonFile, $signedFile, $certKey, $privKey, array(), PKCS7_BINARY | PKCS7_TEXT );
    	
    	$signature = file_get_contents($signedFile);
    	$parts = preg_split("#\n\s*\n#Uis", $signature);
        $mensagem_assinada_base64 = $parts[1];
    	
    	print_r($mensagem_assinada_base64);
    	
    ?>

     

  6. No caso de DATACENTER, você juntamente com a empresa entra em contato com o DATACENTER, verifica as opções de preços e configurações de WINDOWS ou LINUX para o seu servidor, verifica qual a melhor opção juntamente com o DATACENTER em questões de quantas máquinas acessaram simultaneamente o SERVIDOR na nuvem etc, eles lhe mostraram a opção dos preços por consumo em um mês e se fecha o negócio. Depois você terá um treinamento sobre como utilizar e configurar o servidor por técnicos do DATACENTER, que lhe explicaram todos os processos sobre o servidor que foi criado para você e tem toda uma estrutura de SUPORTE para lhe ajudar com as configurações, acessos e problemas que podem ocorrer.

    Já no caso de SERVIDOR PRÓPRIO, nós da WSISCOM temos uma parceria com uma empresa técnica especializada em SERVIDORES, que fazem a instalação, configuração do WINDOWS SERVER no servidor e deixa tudo prontinho de acordo coma as nossas especificações e as do cliente.

  7. Boa tarde,

    Alguns dos meus clientes tem SERVIDOR PRÓPRIO (Físico) em um LOCAL, instalado o WINDOWS SERVER(x) e fazem o ACESSO REMOTO via TS (Terminal service) o famoso "mtsc.exe" - Conexão de Área de Trabalho Remota. Todos utilizam no servidor um DNS dinâmico (DDNS ou Dynamic DNS) que é o método para atualização automática de um servidor de nomes no Sistema de nomes de domínio (DNS), seja o dyndns,  ddns etc, e até o presente momento não tivemos problemas usando este tipo de conexão. É claro que tem que ter um "firewal", bem configurado por questões de segurança e um bom anti-vírus do tipo karpersky.

    Já outros utilizam utilizam DATACENTER como a SAVEINCLOUD, que criam um SERVIDOR não físico no DATACENTER, na nuvem e acessam via TS(Terminal service) 
    o famoso "mtsc.exe" - Conexão de Área de Trabalho Remota.

    Em ambos os casos, não tivemos problemas até o presente momento.

  8. Para o desenvolvimento do boleto bancário SICOOB.

    1º) - Acessar a plataforma developer's SICOOB. "https://developers.sicoob.com.br/portal/", assim que acessar a plataforma irá solicitar que você escolha um certificado digital que esteja instalado em sua máquina para que você possa criar uma conta, escolha o certificado digital para a empresa que você irá liberar a solução, ou seja toda vez que você for liberar a solução para algum cliente, sempre escolher o certificado digital pertencente a esse cliente.

    2º) - Criar uma conta para este cliente que você deseja liberar a solução. Após criar a conta solicitar a recuperação de senha para criar uma senha para este cliente.

    3º) - É preciso ter em mãos o arquivo do certificado digital no formato ".pfx" e a partir dele gerar os certificados no formato ".pem" e ".key", para isso utilize o "openssl.exe", que pode ser baixado em "https://www.openssl.org/" ou pode se utilizar o do "cygwin64", ou qualquer um que tenha o openssl que é uma implementação de código aberto dos protocolos SSL e TLS. Usa os comandos abaixo para criar o ".pem" e o ".key".
         
    openssl pkcs12 -in [arquivo.pfx] -nokeys -out [arquivo].pem

    openssl pkcs12 -in [arquivo].pfx -nocerts -out [arquivo].key

    4º) - Na plataforma 
    "https://developers.sicoob.com.br/portal/", você poderá criar o(s) aplicativos para cada um dos seus cliente(s), indo no menu "MEUS APLICATIVOS". O arquivo do certificado digital que deve-se subir na criação do aplicativo é o ".pem" que você gerou a partir do ".pfx". Após a criação do aplicativo no portal você poderá acessar o aplicativo no portal e pegar a informação do "CLIENT ID" para se usar nas solicitações do TOKEN e do envio do arquivo JSON para o boleto. ( Nesta criação do aplicativo, seguir as orientações solicitadas, pois será necessário a confirmação por um código enviado ao aplicativo do SICOOB no celular do cliente, então o mesmo deverá acompanhar a a criação).

    Na programação eu criei 02 arquivo em "PHP", um que irá solicitar o "token" e o outro que irá enviar o "json" para o SICOOB, você poderá faze-los via programação em fivewin, eu fiz assim pois acho mais fácil com estes pequenos em PHP e o restante em programação fivewin.

    SOLICITAÇÃO DO TOKEN EM PHP, que fica em um ftp meu e o meu software acessa este pequeno PHP.

    <?php
    $Client_ID_envia = $_GET['Client_ID_envia'];
    $Client_certificado_pem = $_GET['Client_certificado_pem'];
    $Client_certificado_key = $_GET['Client_certificado_key'];
    $Client_senha = $_GET['Client_senha'];
    $Client_scope = $_GET['Client_scope'];
    $url_path = "https://auth.sicoob.com.br/auth/realms/cooperado/protocol/openid-connect/token";
    $ch = curl_init();
    curl_setopt_array($ch, array(
    CURLOPT_URL => $url_path,
    CURLOPT_SSL_VERIFYPEER => false,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_SSLCERT => $Client_certificado_pem,
    CURLOPT_SSLKEY => $Client_certificado_key,
    CURLOPT_SSLKEYPASSWD => $Client_senha,
    CURLOPT_HTTPHEADER => array(
    "Accept: application/json",
    "Content-Type: application/x-www-form-urlencoded"),
    CURLOPT_POSTFIELDS => "grant_type=client_credentials&client_id={$Client_ID_envia}&scope=cobranca_boletos_consultar%20cobranca_boletos_incluir%20cobranca_boletos_pagador%20cobranca_boletos_segunda_via%20cobranca_boletos_descontos%20cobranca_boletos_abatimentos%20cobranca_boletos_valor_nominal%20cobranca_boletos_seu_numero%20cobranca_boletos_especie_documento%20cobranca_boletos_baixa"
    ));
    $response = curl_exec($ch);
    $info =curl_errno($ch)>0 ? array("curl_error_".curl_errno($ch)=>curl_error($ch)) : curl_getinfo($ch);
    echo("<pre>");
    print_r($info);
    curl_close($ch);
    echo $response;
    echo("</pre>");
    ?>


    ENVIO DAS INFORMAÇÕES EM PHP, que fica em um ftp meu e o meu software acessa este pequeno PHP.

    <?php
    $Client_certificado_pem = $_GET['Client_certificado_pem'];
    $Client_certificado_key = $_GET['Client_certificado_key'];
    $Client_senha = $_GET['Client_senha'];
    $Cliente_Token = $_GET['Cliente_Token'];
    $Client_ID_envia = $_GET['Client_ID_envia'];
    $Cliente_Field = $_GET['Cliente_Field'];
    $Client_scope = $_GET['Client_scope'];
    
    $ch = curl_init();
    curl_setopt_array($ch, array(
      CURLOPT_URL => 'https://api.sicoob.com.br/cobranca-bancaria/v2/boletos',
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => '',
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 0,
      CURLOPT_FOLLOWLOCATION => true,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => "POST",
      CURLOPT_SSLCERT => $Client_certificado_pem,
      CURLOPT_SSLKEY => $Client_certificado_key,
      CURLOPT_SSLKEYPASSWD => $Client_senha,
      CURLOPT_POSTFIELDS =>$Cliente_Field,
      CURLOPT_HTTPHEADER => array(
        "Content-Type: application/json",
        "Authorization: Bearer $Cliente_Token",
        "Accept: application/json",
        "client_id: $Client_ID_envia"
     ),
    ));
    $response = curl_exec($ch);
    $info =curl_errno($ch)>0 ? array("curl_error_".curl_errno($ch)=>curl_error($ch)) : curl_getinfo($ch);
    echo("<pre>");
    print_r($info);
    curl_close($ch);
    echo $response;
    echo("</pre>");
    ?>

    CÓDIGO DE PROGRAMAÇÃO EM FIVEWIN.

    		             if alltrim(xnbanco) = "756 - Sicoob Uberlandia"
    					    
    						if empty(xnMclient_id)
    						   msgstop("ID do cliente para o Sicoob não informado.","Atenção")
    						   exit
    						endif
    						_Client_ID = alltrim(xnMclient_id)
    						if empty(xnMnomecertif)
    						   msgstop("Nome do certificado para o Sicoob não informado.","Atenção")
    						   exit
    						endif
    						_Client_certificado_pem = alltrim(xnMnomecertif) + ".pem"
    						_Client_certificado_key = alltrim(xnMnomecertif) + ".key"
    						_Client_certificado_crt = alltrim(xnMnomecertif) + ".crt"
    						if empty(xnMsenhacertif)
    						   msgstop("Senha do certificado para o Sicoob não informado.","Atenção")
    						   exit
    						endif
    						_Client_senha = alltrim(xnMsenhacertif)
    						_Client_scope = "cobranca_boletos_incluir"
    						
    						cSignatureValue      = ""
    						nlocaliza_registro_1 = ""
    						nlocaliza_registro_2 = ""
    						_nret_access_token   = ""
    						
    					    _nArquivo_enviar = "http://www.wsiscom.com.br/sicoob/acess_token_sicoob.php?Client_ID_envia=" + _Client_ID +;
    										   "&Client_certificado_key=" + _Client_certificado_key +;
    										   "&Client_certificado_pem=" + _Client_certificado_pem +;
    										   "&Client_senha=" + _Client_senha +;
    										   "&Client_scope=" + _Client_scope 
    					    try
    				           _oserver := CreateObject( "MSXML2.XMLHTTP" )
    					       _oserver:Open( "GET",_nArquivo_enviar, .F. )
    					       _oserver:SetRequestHeader("Content-Type","application/json")
    	                       _oserver:Send(_nArquivo_enviar)
    	                       WHILE _oserver:readyState != 4
    	                             _oserver:WaitForResponse( 500 )
    	                       end
    						   cSignatureValue = _oserver:responseText
    	                    catch
    	                       msgstop("1 - Erro na geração do arquivo para o sicoob.","Erro Atenção")
    						   exit
    	                    end
    					    if empty(cSignatureValue)
    					       msgstop("2 - Sem resposta do acess_token_sicoob.php.","Erro Atenção")
    					       exit
    					    endif
    					    if cSignatureValue = nil
    					       msgstop("3- Sem resposta do acess_token_sicoob.php.","Erro Atenção")
    						   exit
    					    endif
    					 
    					    //lh := 00
                            //mdire = "json_token.txt"
                            //oPrn := TDosPrn():New(mdire)
                            //oPrn:StartPage()
                            //oPrn:lZeraBuffer:=.T.
                            //oPrn:Say(lh,000,cSignatureValue)
                            //oPrn:EndPage()
                            //oPrn:End()
    						
    					    nlocaliza_registro_1 := At( '[http_code] =>', cSignatureValue )
    					    if !empty(nlocaliza_registro_1)
    			               if substr(cSignatureValue,nlocaliza_registro_1,18) != "[http_code] => 200"
    							  msgstop(substr(cSignatureValue,nlocaliza_registro_1,18),"Erro")
    					          exit
                               endif							
    					    else
    						   msgstop("Não foi possível localizar o retorno do token","Atenção")
    					       exit
    					    endif
    						
    					    nlocaliza_registro_1 := At( '{"access_token":"', cSignatureValue )
    					    nlocaliza_registro_2 := At( '","expires_in":300', cSignatureValue )
    					    
    					    if !empty(nlocaliza_registro_1) .or. !empty(nlocaliza_registro_2)
    			               
    						   _nret_access_token = substr(cSignatureValue,nlocaliza_registro_1,(nlocaliza_registro_2 - nlocaliza_registro_1))
    						   _nret_access_token = substr(_nret_access_token,18,5000)
    						   
    					    else
    						   msgstop("Não foi possível localizar o registro (access_token) ","Atenção")
    					       exit
    					    endif
    						
    						narquivoJSON := '[' + CRLF
    						narquivoJSON += '{' + CRLF
                            narquivoJSON += '"numeroContrato": ' + alltrim(xnnumerocliente) + ',' + CRLF
                            narquivoJSON += '"modalidade": 1,' + CRLF
                            narquivoJSON += '"numeroContaCorrente": ' + alltrim(xnconta) + alltrim(xndconta) + ',' + CRLF
                            narquivoJSON += '"especieDocumento": "DM",' + CRLF
                            
    						narquivoJSON += '"dataEmissao": "' + substr(dtos(ldate),1,4) + '-' + substr(dtos(ldate),5,2) + '-' + substr(dtos(ldate),7,2)
    						narquivoJSON += 'T' + alltrim(time())
                            if zfathorariodeverao = 1
                               narquivoJSON += '-02:00",'
                            else	 
                               narquivoJSON += '-03:00",' + CRLF
                            endif
    						
    					    _nandup = ""
    					    for ttqq = 1 to len(andup)
    					        if substr(andup,ttqq,1) = "0" .or. substr(andup,ttqq,1) = "1" .or. substr(andup,ttqq,1) = "2" .or.;
    						       substr(andup,ttqq,1) = "3" .or. substr(andup,ttqq,1) = "4" .or. substr(andup,ttqq,1) = "5" .or.;
    							   substr(andup,ttqq,1) = "6" .or. substr(andup,ttqq,1) = "7" .or. substr(andup,ttqq,1) = "8" .or.;
    							   substr(andup,ttqq,1) = "9"
    						       _nandup = _nandup  + substr(andup,ttqq,1)
    						    endif
    					    next
    						
    						narquivoJSON += '"seuNumero": "' + alltrim(andup) + '",' + CRLF
                            narquivoJSON += '"identificacaoEmissaoBoleto": 1,' + CRLF
                            narquivoJSON += '"identificacaoDistribuicaoBoleto": 1,' + CRLF
                            _ntamanho = len(alltrim(str(int(avdup * 100))))							
    					    narquivoJSON += '"valor": ' + substr(alltrim(str(int(avdup * 100))),1,(_ntamanho - 2)) + '.' + substr(alltrim(str(int(avdup * 100))),((_ntamanho - 2) + 1),2) + ',' + CRLF
    					    
    						narquivoJSON += '"dataVencimento": "' + substr(dtos(advenc),1,4) + '-' + substr(dtos(advenc),5,2) + '-' + substr(dtos(advenc),7,2)
    						narquivoJSON += 'T' + alltrim(time())
                            if zfathorariodeverao = 1
                               narquivoJSON += '-02:00",'
                            else	 
                               narquivoJSON += '-03:00",' + CRLF
                            endif
    							
    					    advenc_1 = advenc + 1
    							
                            narquivoJSON += '"tipoDesconto": 0,' + CRLF
                            
    						if !empty(zfinmultaatraso)
    						   narquivoJSON += '"tipoMulta": 2,' + CRLF
    						   narquivoJSON += '"dataMulta": "' + substr(dtos(advenc_1),1,4) + '-' + substr(dtos(advenc_1),5,2) + '-' + substr(dtos(advenc_1),7,2)
    						   narquivoJSON += 'T' + alltrim(time())
                               if zfathorariodeverao = 1
                                  narquivoJSON += '-02:00",'
                               else	 
                                  narquivoJSON += '-03:00",' + CRLF
                               endif
    						   _ntamanho = len(alltrim(str(int(zfinmultaatraso * 100))))
    						   narquivoJSON += '"valorMulta": ' + substr(alltrim(str(int(zfinmultaatraso * 100))),1,(_ntamanho - 2)) + '.' + substr(alltrim(str(int(zfinmultaatraso * 100))),((_ntamanho - 2) + 1),2) + ',' + CRLF
    						   //narquivoJSON += '"valorMulta": ' + alltrim(str(int(zfinmultaatraso))) + ',' + CRLF
    					    else
    						    narquivoJSON += '"tipoMulta": 0,' + CRLF
    					    endif
    						
    					    if !empty(zfintaxajurosmensal)
    						   narquivoJSON += '"tipoJurosMora": 2,' + CRLF
    						   narquivoJSON += '"dataJurosMora": "' + substr(dtos(advenc_1),1,4) + '-' + substr(dtos(advenc_1),5,2) + '-' + substr(dtos(advenc_1),7,2)
    						   narquivoJSON += 'T' + alltrim(time())
                               if zfathorariodeverao = 1
                                  narquivoJSON += '-02:00",'
                               else	 
                                  narquivoJSON += '-03:00",' + CRLF
                               endif
    						   zfintaxajurosdias = zfintaxajurosmensal
    						   if zfintaxajurosdias < 1
    						      narquivoJSON += '"valorJurosMora": ' + '0.' + alltrim(str(int(zfintaxajurosdias * 100))) + ',' + CRLF
    						   else
    						      _ntamanho = len(alltrim(str(int(zfintaxajurosdias * 100)))) 
    						      narquivoJSON += '"valorJurosMora": ' + substr(alltrim(str(int(zfintaxajurosdias * 100))),1,(_ntamanho - 2)) + '.' + substr(alltrim(str(int(zfintaxajurosdias * 100))),((_ntamanho - 2) + 1),2) + ',' + CRLF
    						      //narquivoJSON += '"valorJurosMora": ' + alltrim(str(int(zfintaxajurosdias)))  + ',' + CRLF
    						   endif
    					    else
    						    narquivoJSON += '"tipoJurosMora": 3,' + CRLF
    				        endif
    						
    						// aqui ....
    						narquivoJSON += '"numeroParcela": ' + alltrim(str(nsequenciatitulo)) + ',' + CRLF
    						narquivoJSON += '"aceite": ' + iif(xnaceite = 'N','false','true') + ',' + CRLF
    						narquivoJSON += '"codigoProtesto": 1,' + CRLF
    						narquivoJSON += '"numeroDiasProtesto": 30,' + CRLF
    						narquivoJSON += '"pagador": {' + CRLF
    						narquivoJSON += '"numeroCpfCnpj": "' + alltrim(rcnpjcpf) + '",' + CRLF
    						narquivoJSON += '"nome": "' + substr(alltrim(rrazaosocial),1,50) + '",' + CRLF
                            narquivoJSON += '"endereco": "' + substr(alltrim(rendereco) + ' ' + alltrim(rnumero),1,40) + '",' + CRLF
                            narquivoJSON += '"bairro": "' + substr(alltrim(rbairro),1,30) + '",' + CRLF
                            narquivoJSON += '"cidade": "' + substr(alltrim(rcidade),1,40) + '",' + CRLF
                            narquivoJSON += '"cep": "' + alltrim(rcep) + '",' + CRLF
                            narquivoJSON += '"uf": "' + ruf 
                            if !empty(remail)
    						   narquivoJSON += '",' + CRLF
    						   narquivoJSON += '"email": [' + CRLF
                               narquivoJSON += '"' + alltrim(remail) + '"' + CRLF
    						   narquivoJSON += ']' + CRLF
    						else
    						   narquivoJSON += '"' + CRLF
    						endif
                            narquivoJSON += '},' + CRLF
                                
    						narquivoJSON += '"beneficiarioFinal": {' + CRLF
                            narquivoJSON += '"numeroCpfCnpj": "' + aaloja + '",' + CRLF
                            
    						//zempresa
    						//znumerodocumentonacional
    						narquivoJSON += '"nome": "' + alltrim(substr(abloja,1,50)) + '"' + CRLF
                            narquivoJSON += '},' + CRLF
    						
    						if !empty(zfinmultaatraso) .or. !empty(zfintaxajurosmensal)
    						   narquivoJSON += '"mensagensInstrucao": {' + CRLF
    						   narquivoJSON += '"tipoInstrucao": 1,' + CRLF
    						   narquivoJSON += '"mensagens": [' + CRLF
    						   if !empty(zfinmultaatraso)
    						      narquivoJSON += '"Multa por atraso de ' + alltrim(transform(zfinmultaatraso,"@e 99,99")) + ' porcento'
    						      if !empty(zfintaxajurosmensal)
    						         narquivoJSON += '",' + CRLF
    						      else
    						   	     narquivoJSON += '"' + CRLF
    						      endif
    					       endif
    						   if !empty(zfintaxajurosmensal)
    						      zfintaxajurosdias = zfintaxajurosmensal / val(pega_ultimo_dia_numero(advenc))
    						      zvalordiaJuros = ((avdup * zfintaxajurosdias)/100)
    						      narquivoJSON += '"Juro de R$ ' + alltrim(transform(zvalordiaJuros,"@e 999,999.99")) + ' por dia de atraso."' + CRLF
    					       endif
    						   narquivoJSON += ']' + CRLF
    						   narquivoJSON += '},' + CRLF
    						endif
    					    narquivoJSON += '"gerarPdf": true,' + CRLF
                            narquivoJSON += '"codigoCadastrarPIX": 0' + CRLF
                            narquivoJSON += '}' + CRLF
                            narquivoJSON += ']'
    						
    					    lh := 00
                            mdire = "json_envia.txt"
                            oPrn := TDosPrn():New(mdire)
                            oPrn:StartPage()
                            oPrn:lZeraBuffer:=.T.
                            oPrn:Say(lh,000,narquivoJSON)
                            oPrn:EndPage()
                            oPrn:End()
    						
    						cSignatureValue = ""
    					    _nArquivo_enviar = "http://www.wsiscom.com.br/sicoob/envia_boleto_sicoob.php?Client_certificado_pem=" + _Client_certificado_pem +;
    					                       "&Client_certificado_key=" + _Client_certificado_key +;
    										   "&Client_senha="           + _Client_senha +;
    					  	 				   "&Cliente_Token="          + _nret_access_token +;
    					  	 				   "&Client_ID_envia="        + _Client_ID +;
    					  	 				   "&Cliente_Field="          + narquivoJSON+;
    										   "&Client_scope="           + _Client_scope 
    					    
    						//lh := 00
                            //mdire = "jsonEnviaboleto" + ".txt"
                            //oPrn := TDosPrn():New(mdire)
                            //oPrn:StartPage()
                            //oPrn:lZeraBuffer:=.T.
                            //oPrn:Say(lh,000,_nArquivo_enviar)
                            //oPrn:EndPage()
                            //oPrn:End()
    					    
    					    try
    				           _oserver := CreateObject( "MSXML2.XMLHTTP" )
    					       _oserver:Open( "GET",_nArquivo_enviar, .F. )
    					       _oserver:SetRequestHeader("Content-Type","application/json")
    	                       _oserver:Send(_nArquivo_enviar)
    	                       WHILE _oserver:readyState != 4
    	                             _oserver:WaitForResponse( 500 )
    	                       end
    					  	   cSignatureValue = _oserver:responseText
    	                    catch
    	                       msgstop("1 - Erro na geração do arquivo para o sicoob. www.wsiscom.com.br/sicoob/envia_boleto_sicoob.php","Erro Atenção")
    					  	 exit
    	                    end
    					    if empty(cSignatureValue)
    					       msgstop("2 - Sem resposta do envia_boleto.php.","Erro Atenção")
    					       exit
    					    endif
    					    if cSignatureValue = nil
    					       msgstop("3- Sem resposta do envia_boleto.php.","Erro Atenção")
    					  	 exit
    					    endif
    					    
    					    lh := 00
                            mdire = "jsonretornoboleto.txt"
                            oPrn := TDosPrn():New(mdire)
                            oPrn:StartPage()
                            oPrn:lZeraBuffer:=.T.
                            oPrn:Say(lh,000,cSignatureValue)
                            oPrn:EndPage()
                            oPrn:End()
    						
                            //cSignatureValue := MemoRead("jsonretornoboleto.txt")
    						
    						nlocaliza_registro_1 := At( '{"resultado":[{"status":{"codigo":200}', cSignatureValue )
    					    if !empty(nlocaliza_registro_1)
    						   if substr(cSignatureValue,nlocaliza_registro_1,38) != '{"resultado":[{"status":{"codigo":200}'
    						      msgstop(cSignatureValue,"Erro")
    					          exit
                               endif							
    					    else
    						   msgstop(cSignatureValue,"Erro")
    					       exit
    					    endif
    
    					    _nxgravarnumeroPego = ""
    					    _nxcodigodebarras = ""
    						_nxgravarlinhadigitavel = ""
    						
    					    nlocaliza_registro_1 := At( '"nossoNumero":', cSignatureValue )
    						nposicaocolunaInicia := nlocaliza_registro_1 + len('"nossoNumero":')
    						for ttqq = nposicaocolunaInicia to (nposicaocolunaInicia + 100)
    						    if substr(cSignatureValue,nposicaocolunaInicia,1) = "0" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "1" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "2" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "3" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "4" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "5" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "6" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "7" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "8" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "9"
    							   _nxgravarnumeroPego = _nxgravarnumeroPego + substr(cSignatureValue,nposicaocolunaInicia,1)
    							else
    						       exit
    						    endif
    							++nposicaocolunaInicia
    						next
    					    
    					    nlocaliza_registro_1 := At( '"codigoBarras":"', cSignatureValue )
    						nposicaocolunaInicia := nlocaliza_registro_1 + len('"codigoBarras":"')
    						for ttqq = nposicaocolunaInicia to (nposicaocolunaInicia + 100)
    						    if substr(cSignatureValue,nposicaocolunaInicia,1) = "0" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "1" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "2" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "3" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "4" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "5" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "6" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "7" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "8" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "9"
    							   _nxcodigodebarras = _nxcodigodebarras + substr(cSignatureValue,nposicaocolunaInicia,1)
    							else
    						       exit
    						    endif
    							++nposicaocolunaInicia
    						next
    
    					    nlocaliza_registro_1 := At( '"linhaDigitavel":"', cSignatureValue )
    						nposicaocolunaInicia := nlocaliza_registro_1 + len('"linhaDigitavel":"')
    						for ttqq = nposicaocolunaInicia to (nposicaocolunaInicia + 100)
    						    if substr(cSignatureValue,nposicaocolunaInicia,1) = "0" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "1" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "2" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "3" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "4" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "5" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "6" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "7" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "8" .or.;
    						       substr(cSignatureValue,nposicaocolunaInicia,1) = "9"
    							   _nxgravarlinhadigitavel = _nxgravarlinhadigitavel + substr(cSignatureValue,nposicaocolunaInicia,1)
    							else
    						       exit
    						    endif
    							++nposicaocolunaInicia
    						next
    						
    					    cData = ""
    						nlocaliza_registro_1 = At( '"pdfBoleto":"', cSignatureValue ) + len('"pdfBoleto":"')
    						nlocaliza_registro_2 = At( '"}}]}', cSignatureValue )
    						nlocaliza_registro_2 = nlocaliza_registro_2 - nlocaliza_registro_1
    						cData = substr(cSignatureValue,nlocaliza_registro_1,nlocaliza_registro_2)
    						cBase64 := HB_base64Decode(cData)
    					    
    						lh := 00
                            cFileSicoob = ""
    						if objetboleto = "Nfe"
    						   cFileSicoob = cFileSic + "sicoob_ret_NFe_" + nNumerodocumento_sicoob + "_" + alltrim(rfantasia) + "_" + alltrim(str(nsequenciatitulo)) + ".pdf"
    						elseif objetboleto = "Ped"
    						   cFileSicoob = cFileSic + "sicoob_ret_Ped_" + nNumerodocumento_sicoob + "_" + alltrim(rfantasia) + "_" + alltrim(str(nsequenciatitulo)) + ".pdf"
    						endif
    						oPrn := TDosPrn():New(cFileSicoob)
                            oPrn:StartPage()
                            oPrn:lZeraBuffer:=.T.
                            oPrn:Say(lh,000,cBase64)
                            oPrn:EndPage()
                            oPrn:End()
    						
    					 endif

    SEGUE ABAIXO OS LINK'S PARA OS MANUAIS PARA TIRAR DÚVIDAS E OS E-MAIL'S PARA SUPORTE.

    Manual: "https://documenter.getpostman.com/view/20565799/Uzs6yNhe#1bcf3134-afbd-4cf3-ba49-9cdf5ea2c224"

    SUPORTE.

    SICOOB BELO HORIZONTE (CECREMGE)
    samuel.lopes@cecremge.org.br
    gabriel.ferreira@cecremge.org.br

    BRASILIA.
    dev@sicoob.com.br

  9. Bom dia,

    Esse "PDV" não usa nem a LISTBOX e nem a XBROWSE, é uma dialog com "BTNBMP", e como brush a IMAGEM da tela. 

    Listbox é só onde são apresentados os produtos comprados, logo abaixo de "Código de produto", onde aparece os Grupos e os Produtos, são
    BTNBMP que recebem as informações dos "Grupos" ou "Produtos" a medida que vai clicando nas setas de direção.

    tela_bar.png

     

    Segue o código da DIALOG

    		 define dialog barRestaurante title "Bares e Restaurantes" from 000,000 to 720,1020 pixel brush obrushbar STYLE WS_POPUP transparent
                    define cursor ohand hand
    
    				// Variáveis para o atendimento em tela de bares e restaurantes................................................................................
    				nOperacaoAtendimento = 3
    				nOperacaoantesAtendimento = 3
    				ogrupo = {}
    		        oproduto = {}
    		        
    		        ngrupo   = 5
    		        nproduto = 15
    		        
    		        lArrayProdutos   = {}
    		        tseqProduto = 1
    		        lArrayCategorias = {}
    		        tseqGrupo = 1
    		        cquery := "select * from essubgrupo"+;
                              " order by descricao asc;"
                    oquery := oServer:Query(cquery)
    		        xseqsub  = oquery:Fieldget(oquery:Fieldpos('seqsub'))
    		        if empty(xseqsub)
                       oquery:destroy()
    		           return nil
    		        endif
    		        DO WHILE ! oquery:Eof()
                       mseqsub          = oquery:Fieldget(oquery:Fieldpos('seqsub'))
    		           mdescricao       = oquery:Fieldget(oquery:Fieldpos('descricao'))
    		  	       mcaminhodaimagem = oquery:Fieldget(oquery:Fieldpos('caminhodaimagem'))
                       aadd(lArrayCategorias,{mseqsub,mdescricao,mcaminhodaimagem})
    		  	       oquery:Skip()
                    END
                    oquery:destroy()
    		        if (len(lArrayCategorias)/ ngrupo) != int((len(lArrayCategorias)/ ngrupo))
    		           do while .t.
    		              if (len(lArrayCategorias)/ ngrupo) != int((len(lArrayCategorias)/ ngrupo))
                             aadd(lArrayCategorias,{"","",""})
    		              else
    		         	     exit
    		              endif
    		           enddo
    		        endif
    				
    				mnomedotipodevenda = ""
    				mgrupomarcado      = 0
    				mprodutomarcado    = 0
    				mnomegrupo01       = space(50)
                    mnomegrupo02       = space(50)
                    mnomegrupo03       = space(50)
                    mnomegrupo04       = space(50)
                    mnomegrupo05       = space(50)
    				                   
    				mnomeprodu01       = space(50)
    				mnomeprodu02       = space(50)
    				mnomeprodu03       = space(50)
    				mnomeprodu04       = space(50)
    				mnomeprodu05       = space(50)
    				
    				mnomeprodu06       = space(50)
    				mnomeprodu07       = space(50)
    				mnomeprodu08       = space(50)
    				mnomeprodu09       = space(50)
    				mnomeprodu10       = space(50)
    				
    				mnomeprodu11       = space(50)
    				mnomeprodu12       = space(50)
    				mnomeprodu13       = space(50)
    				mnomeprodu14       = space(50)
    				mnomeprodu15       = space(50)
    				
                    rproc_procura_consumidor(1)
    				valid_pega_vendedor()
    
    		   		/*
    				mDescricao_0 = "Caixa:"   + alltrim(mCfdescricaotipodecaixaA)
    		   		mDescricao_1 = "A Vista:" + alltrim(mCfdescricaotipodecaixaA)
                    mDescricao_2 = "A Prazo:" + alltrim(mCfdescricaotipodecaixaP)
                    mDescricao_3 = "Conta:"   + alltrim(mCfdescricaoplanodecontas)
    		   		mDescricao_4 = iif(!empty(zusuario),"Usuário: " + alltrim(zusuario),space(25))
    		   		//mDescricao_5 = ""
    		   		//mDescricao_5 = "Loja:" + mCfloja + " PDV:" + mCfnumerodocaixa
    				nl = 328
    		   		if alltrim(mCfdescricaotipodecaixaA) = alltrim(mCfdescricaotipodecaixaP)
    		   		   @ nl,303 say oDescricao_0 var mDescricao_0 font mcourierMed size 140,10    of barRestaurante color RGB(000,000,000),RGB(007,102,148) pixel
    				   oDescricao_0:lTransparent := .t.
                       @ nl,408 say oDescricao_3 var mDescricao_3 font mcourierMed size 140,10    of barRestaurante color RGB(000,000,000),RGB(007,102,148) pixel
    				   oDescricao_3:lTransparent := .t.
    				 nl = nl + 10
    		   		   if !empty(mDescricao_4)
                          @ nl,303 say oDescricao_4 var mDescricao_4 font mcourierMed size 140,10 of barRestaurante color RGB(000,000,000),RGB(007,102,148) pixel
    				      oDescricao_4:lTransparent := .t.
    		   		   endif
    		   		   //nl = nl + 10
                       //@ nl,005 say oDescricao_5 var mDescricao_5 font mcourierMed size 140,10    of barRestaurante color RGB(000,000,000),RGB(007,102,148) pixel
    				   //oDescricao_5:lTransparent := .t.
    		   		else
    		   		   @ nl,303 say oDescricao_1 var mDescricao_1 font mcourierMed size 140,10    of barRestaurante color RGB(000,000,000),RGB(007,102,148) pixel
    				   oDescricao_1:lTransparent := .t.
    				   @ nl,408 say oDescricao_3 var mDescricao_3 font mcourierMed size 140,10    of barRestaurante color RGB(000,000,000),RGB(007,102,148) pixel
    				   oDescricao_3:lTransparent := .t.
    		   		   nl = nl + 10                                                                 
                       @ nl,303 say oDescricao_2 var mDescricao_2 font mcourierMed size 140,10    of barRestaurante color RGB(000,000,000),RGB(007,102,148) pixel
    				   oDescricao_2:lTransparent := .t.
    		   		   if !empty(mDescricao_4)
                          @ nl,408 say oDescricao_4 var mDescricao_4 font mcourierMed size 140,10 of barRestaurante color RGB(000,000,000),RGB(007,102,148) pixel
    				      oDescricao_4:lTransparent := .t.
    		   		   endif
    		   		   //nl = nl + 10
                       //@ nl,005 say oDescricao_5 var mDescricao_5 font mcourierMed size 140,10    of barRestaurante color RGB(000,000,000),RGB(007,102,148) pixel
    				   //oDescricao_5:lTransparent := .t.
    		   		endif
    				*/
    
    			    mDescricao_0 = "Cx:" + substr(alltrim(mCfdescricaotipodecaixaA),1,1)  + lower(substr(alltrim(mCfdescricaotipodecaixaA), 2,len(alltrim(mCfdescricaotipodecaixaA))))
    				mDescricao_1 = "Cx:" + substr(alltrim(mCfdescricaotipodecaixaA),1,1)  + lower(substr(alltrim(mCfdescricaotipodecaixaA), 2,len(alltrim(mCfdescricaotipodecaixaA))))
                    mDescricao_2 = "Cx:" + substr(alltrim(mCfdescricaotipodecaixaP),1,1)  + lower(substr(alltrim(mCfdescricaotipodecaixaP), 2,len(alltrim(mCfdescricaotipodecaixaP))))
                    mDescricao_3 = "Ct:" + substr(alltrim(mCfdescricaoplanodecontas),1,1) + lower(substr(alltrim(mCfdescricaoplanodecontas),2,len(alltrim(mCfdescricaoplanodecontas))))
    				_usuario = substr(alltrim(zusuario),1,1) + lower(substr(alltrim(zusuario),2,len(alltrim(zusuario))))
    		   		mDescricao_5 = iif(!empty(_usuario),"Us:" + alltrim(_usuario),space(25))
                    nl = 002
    			    nc = 318
    		   		if alltrim(mCfdescricaotipodecaixaA) = alltrim(mCfdescricaotipodecaixaP)
    		   		   @ nl,nc say oDescricao_0 var mDescricao_0 font mtahomapequenaMin size 255,09 of barRestaurante color RGB(000,000,000),RGB(007,102,148) pixel
    		   		   nl = nl + 6
                       @ nl,nc say oDescricao_3 var mDescricao_3 font mtahomapequenaMin size 255,09 of barRestaurante color RGB(000,000,000),RGB(007,102,148) pixel
    		   		   nl = nl + 6
                       @ nl,nc say oDescricao_5 var mDescricao_5 font mtahomapequenaMin size 255,09 of barRestaurante color RGB(000,000,000),RGB(007,102,148) pixel
    		   		else
    		   		   @ nl,nc say oDescricao_1 var mDescricao_1 font mtahomapequenaMin size 255,09 of barRestaurante color RGB(000,000,000),RGB(007,102,148) pixel
    		   		   nl = nl + 6                                                              
                       @ nl,nc say oDescricao_2 var mDescricao_2 font mtahomapequenaMin size 255,09 of barRestaurante color RGB(000,000,000),RGB(007,102,148) pixel
    		   		   nl = nl + 6                                                              
                       @ nl,nc say oDescricao_3 var mDescricao_3 font mtahomapequenaMin size 255,09 of barRestaurante color RGB(000,000,000),RGB(007,102,148) pixel
    		   		   nl = nl + 6
                       @ nl,nc say oDescricao_5 var mDescricao_5 font mtahomapequenaMin size 255,09 of barRestaurante color RGB(000,000,000),RGB(007,102,148) pixel
    		   		endif
    				
    		   		@ 000,000 get oNadafaz var mNadafaz font mtahomapequena size 01,01 of barRestaurante color corfrtsayds,corfdogetnotafiscal pixel right no border
    		   		
    				@ 010,006 say oPnomedocliente var mPnomedocliente picture "@!" font mtahoma size 105,09 of barRestaurante color RGB(000,000,000),RGB(255,255,255) pixel
                    @ 010,114 say oPvendedor var mPvendedor picture "@!" font mtahoma size 105,09 of barRestaurante color RGB(000,000,000),rgb(255,255,255) pixel
                    @ 010,225 say onomedotipodevenda var mnomedotipodevenda font mtahomabold size 085,09 of barRestaurante color rgb(193,017,030),corfdosay pixel
    				
    		   		@ 004,355 say oestadopdv var mestadopdv font mtahomapequenaMin size 050,15 of barRestaurante color RGB(000,000,000),RGB(255,255,255) pixel
    
    		   		//@ 012,355 get oPcodigoproduto var mPcodigoproduto picture "@!"font mtahoma size 090,09 of barRestaurante color rgb(031,068,087),rgb(255,255,255) pixel no border
    		   		@ 012,355 get oPcodigoproduto var mPcodigoproduto picture "@!" valid ( iif(mestadopdv = " *** Exclui Item ***",rproc_cancela_item(objetpedido),rproc_produto_entradasaida(objetpedido,"P")) );
    		   			 	      font mtahoma size 090,09 of barRestaurante color rgb(031,068,087),rgb(255,255,255) pixel no border
    						  
                    @ 021,355 listbox obrzPEDpedido fields asamplzPEDpedido[obrzPEDpedido:nat,1];
                              headers "";
                              FIELDSIZES 455 on dblclick exclui_item_tablet(objetpedido);
                              size 124,203 font mcourierSup0;
                              pixel of barRestaurante color rgb(000,000,000),rgb(255,255,255)
    				obrzPEDpedido:nClrPane := {|| iif(asamplzPEDpedido[obrzPEDpedido:nat,1] = space(58),rgb(255,255,255),;
    				                              iif(substr(alltrim(asamplzPEDpedido[obrzPEDpedido:nat,1]),1,9) = "SUB-TOTAL",rgb(233,237,242),;
    											  iif(substr(alltrim(asamplzPEDpedido[obrzPEDpedido:nat,1]),1,8) = "DESCONTO" ,rgb(000,120,215),;
    											  iif(substr(alltrim(asamplzPEDpedido[obrzPEDpedido:nat,1]),1,5) = "TOTAL"    ,rgb(193,017,030),rgb(233,237,242))))) }
                    obrzPEDpedido:nClrText := {|| iif(localiza_und(substr(asamplzPEDpedido[obrzPEDpedido:nat,1],1,3)) = .t.,RGB(083,083,083),;
    				                              iif(substr(alltrim(asamplzPEDpedido[obrzPEDpedido:nat,1]),1,9) = "SUB-TOTAL",rgb(000,000,000),;
    											  iif(substr(alltrim(asamplzPEDpedido[obrzPEDpedido:nat,1]),1,8) = "DESCONTO" ,rgb(255,255,255),;
    											  iif(substr(alltrim(asamplzPEDpedido[obrzPEDpedido:nat,1]),1,5) = "TOTAL"    ,rgb(255,255,255),rgb(000,000,000))))) }
                    //obrzPEDpedido:nClrPane := {|| iif((asamplzPEDpedido[obrzPEDpedido:nat,1]) = "                                                ",RGB(204,204,204),corlstbxnormal) }
    				obrzPEDpedido:aJustify  := { .F.}
    				obrzPEDpedido:nLineStyle := 6
                    obrzPEDpedido:lCellStyle = .f.
                    obrzPEDpedido:lAutoSkip  = .t.
                    obrzPEDpedido:SetArray(asamplzPEDpedido)
                    obrzPEDpedido:bGoTop = { || obrzPEDpedido:nat := 1 }
                    obrzPEDpedido:bGoBottom = { || obrzPEDpedido:nat := Eval( obrzPEDpedido:bLogicLen ) }
                    obrzPEDpedido:bSkip = { | nWant, nOld | nOld := obrzPEDpedido:nat, obrzPEDpedido:nat += nWant,;
                    obrzPEDpedido:nat := Max( 1, Min( obrzPEDpedido:nat, Eval( obrzPEDpedido:bLogicLen ) ) ),;
                    obrzPEDpedido:nat - nOld }
                    obrzPEDpedido:bLogicLen = { || Len( asamplzPEDpedido ) }
                    obrzPEDpedido:cAlias = "Array"
                    obrzPEDpedido:nColAct       := 1
                    //obrzPEDpedido:lMChange      := .F.
                    obrzPEDpedido:SetFocus()
                    obrzPEDpedido:Refresh()
                    obrzPEDpedido:bgotfocus = { || oPcodigoproduto:setfocus() }
    		   	    oNadafaz:bgotfocus = { || oPcodigoproduto:setfocus() }
                    
                    @ 071,007 say onomegrupo01 var mnomegrupo01 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
                    @ 071,069 say onomegrupo02 var mnomegrupo02 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
                    @ 071,131 say onomegrupo03 var mnomegrupo03 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
                    @ 071,194 say onomegrupo04 var mnomegrupo04 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
                    @ 071,256 say onomegrupo05 var mnomegrupo05 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
    				
    				// 1º grupo de botões dos departamentos...
    				@ 021,007 BTNBMP obotaogrupo01 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("G",1) )
    				@ 021,069 BTNBMP obotaogrupo02 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("G",2) )
    				@ 021,131 BTNBMP obotaogrupo03 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("G",3) )
    				@ 021,194 BTNBMP obotaogrupo04 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("G",4) )
    				@ 021,256 BTNBMP obotaogrupo05 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("G",5) )
    				
    				obotaogrupo01:oCursor := ohand
    				obotaogrupo02:oCursor := ohand
    				obotaogrupo03:oCursor := ohand
    				obotaogrupo04:oCursor := ohand
    				obotaogrupo05:oCursor := ohand
    				
    				@ 147,007 say onomeprodu01 var mnomeprodu01 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
                    @ 147,069 say onomeprodu02 var mnomeprodu02 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
                    @ 147,131 say onomeprodu03 var mnomeprodu03 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
                    @ 147,194 say onomeprodu04 var mnomeprodu04 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
                    @ 147,256 say onomeprodu05 var mnomeprodu05 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
    				// 1º grupo de botões dos produtos...
    				@ 096,007 BTNBMP obotaoprod01 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("P",1) )
    				@ 096,069 BTNBMP obotaoprod02 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("P",2) )
    				@ 096,131 BTNBMP obotaoprod03 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("P",3) )
    				@ 096,194 BTNBMP obotaoprod04 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("P",4) )
    				@ 096,256 BTNBMP obotaoprod05 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("P",5) )
    				obotaoprod01:oCursor := ohand
    				obotaoprod02:oCursor := ohand
    				obotaoprod03:oCursor := ohand
    				obotaoprod04:oCursor := ohand
    				obotaoprod05:oCursor := ohand
                    
                    @ 223,007 say onomeprodu06 var mnomeprodu06 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
                    @ 223,069 say onomeprodu07 var mnomeprodu07 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
    				@ 223,131 say onomeprodu08 var mnomeprodu08 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
                    @ 223,194 say onomeprodu09 var mnomeprodu09 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
                    @ 223,256 say onomeprodu10 var mnomeprodu10 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
    				//// 2º grupo de botões dos produtos...
    				@ 172,007 BTNBMP obotaoprod06 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("P",6) )
    				@ 172,069 BTNBMP obotaoprod07 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("P",7) )
    				@ 172,131 BTNBMP obotaoprod08 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("P",8) )
    				@ 172,194 BTNBMP obotaoprod09 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("P",9) )
    				@ 172,256 BTNBMP obotaoprod10 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("P",10) )
    				obotaoprod06:oCursor := ohand
    				obotaoprod07:oCursor := ohand
    				obotaoprod08:oCursor := ohand
    				obotaoprod09:oCursor := ohand
    				obotaoprod10:oCursor := ohand
    				
                    @ 300,007 say onomeprodu11 var mnomeprodu11 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
                    @ 300,069 say onomeprodu12 var mnomeprodu12 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
    				@ 300,131 say onomeprodu13 var mnomeprodu13 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
                    @ 300,194 say onomeprodu14 var mnomeprodu14 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
                    @ 300,256 say onomeprodu15 var mnomeprodu15 font mtahomafacpeq size 060,20 of barRestaurante color corfrtsay,corfdosay pixel
    				//// 2º grupo de botões dos produtos...
    				@ 249,007 BTNBMP obotaoprod11 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("P",11) )
    				@ 249,069 BTNBMP obotaoprod12 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("P",12) )
    				@ 249,131 BTNBMP obotaoprod13 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("P",13) )
    				@ 249,194 BTNBMP obotaoprod14 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("P",14) )
    				@ 249,256 BTNBMP obotaoprod15 center size 055,050 font obotaof noborder of barRestaurante pixel action( marcar_pintar_selecionar("P",15) )
    				obotaoprod11:oCursor := ohand
    				obotaoprod12:oCursor := ohand
    				obotaoprod13:oCursor := ohand
    				obotaoprod14:oCursor := ohand
    				obotaoprod15:oCursor := ohand
    				
    				// dois botões ao lado esquerdo dos itens vendidos...
    				@ 242,366   BTNBMP obarbut01 left size 030,33 font obotaof noborder resource "bar_pt_acima"    of barRestaurante action ( (obrzPEDpedido:SetFocus()),movimento_listbox_pdv("A") )
    				@ 242,402   BTNBMP obarbut02 left size 030,33 font obotaof noborder resource "bar_pt_abaixo"   of barRestaurante action ( (obrzPEDpedido:SetFocus()),movimento_listbox_pdv("B") )
                    // Um botão abaixo dos itens vendidos. excluir item ...                                                          
    				@ 242,438   BTNBMP obarbut10 left size 030,33 font obotaof noborder resource "bar_bt_sair_3"   of barRestaurante action ( exclui_item_tablet(objetpedido) )
    				                                                                                           
                    // dois botões ao lado direito dos sub-grupo de produtos.  ..                              
       				          // 1º "A" do action significa que é um botão que pressiona para rolando para o inicio do array
    				@ 024,320   BTNBMP obarbut03 left size 030,33 font obotaof noborder;
    						    resource "bar_bt_esquerda"  of barRestaurante action( ver_dados_grupo("A") )
    						  // 1º "B" do action significa que é um botão que pressiona para rolando para o final do array
    				@ 060,320   BTNBMP obarbut04 left size 030,33 font obotaof noborder;
    				            resource "bar_bt_direita" of barRestaurante action( ver_dados_grupo("B") )
                                                                               
    				// dois botões um por unidade outro por quantidade
    				@ 100,320   BTNBMP obarbut05 left size 030,33 font obotaof noborder resource "bar_bt_und"      of barRestaurante action( pega_produto_base_de_dados("UND",objetpedido) )
    				@ 136,320   BTNBMP obarbut06 left size 030,33 font obotaof noborder resource "bar_bt_qtd"      of barRestaurante action( pega_produto_base_de_dados("QTD",objetpedido) )
    																											   
                    // dois botões ao lado direito dos produtos...                                                 
    				@ 176,320   BTNBMP obarbut07 left size 030,33 font obotaof noborder resource "bar_pt_acima"    of barRestaurante action( iif( mgrupomarcado > 0, ver_dados_produto("A",mgrupomarcado), ) )
    				@ 212,320   BTNBMP obarbut08 left size 030,33 font obotaof noborder resource "bar_pt_abaixo"   of barRestaurante action( iif( mgrupomarcado > 0, ver_dados_produto("B",mgrupomarcado), ) )
    				
    				// botão para o código comum ou código de barras...
    				@ 252.5,320 BTNBMP obarbut09 left size 030,33 font obotaof noborder resource "bar_bt_barras"   of barRestaurante action( oPcodigoproduto:setfocus() )
    				
    				// botão para o vendedor
    				@ 287.5,320 BTNBMP obarbut9a left size 030,33 font obotaof noborder resource "bar_bt_vendedor" of barRestaurante action( escolha_vendedor() )
    				
    				obarbut01:lTransparent = .t.
    				obarbut02:lTransparent = .t.
    				obarbut03:lTransparent = .t.
    				obarbut04:lTransparent = .t.
    				obarbut05:lTransparent = .t.
    				obarbut06:lTransparent = .t.
    				obarbut07:lTransparent = .t.
    				obarbut08:lTransparent = .t.
    				obarbut09:lTransparent = .t.
    				obarbut9a:lTransparent = .t.
    				obarbut10:lTransparent = .t.
    				
                    // Quatro botões laterais a direita ( Mesas,Comandas,Balcão e Entregas) ...
    				@ 019,485 buttonbmp obarbut11 bitmap "bar_bt_mesas.bmp"          left size 020,67 font obotaof noborder of barRestaurante pixel action ( (nOperacaoantesAtendimento := nOperacaoAtendimento ),dados_comanda(1) )
    				@ 098,485 buttonbmp obarbut12 bitmap "bar_bt_comandas.bmp"       left size 020,64 font obotaof noborder of barRestaurante pixel action ( (nOperacaoantesAtendimento := nOperacaoAtendimento ),dados_comanda(2) )
    				@ 175,485 buttonbmp obarbut13 bitmap "bar_bt_balcao.bmp"         left size 020,64 font obotaof noborder of barRestaurante pixel action ( (nOperacaoantesAtendimento := nOperacaoAtendimento ),dados_comanda(3) )
    				@ 254,485 buttonbmp obarbut14 bitmap "bar_bt_entregas.bmp"       left size 020,67 font obotaof noborder of barRestaurante pixel action ( (nOperacaoantesAtendimento := nOperacaoAtendimento ),dados_comanda(4) )
    
    				obarbut01:oCursor := ohand
    				obarbut02:oCursor := ohand
    				obarbut03:oCursor := ohand
    				obarbut04:oCursor := ohand
    				obarbut05:oCursor := ohand
    				obarbut06:oCursor := ohand
    				obarbut07:oCursor := ohand
    				obarbut08:oCursor := ohand
    				obarbut09:oCursor := ohand
    				obarbut9a:oCursor := ohand
    				obarbut10:oCursor := ohand
    				obarbut11:oCursor := ohand
    				obarbut12:oCursor := ohand
    				obarbut13:oCursor := ohand
    				obarbut14:oCursor := ohand
    				
    				@ 327,003 BTNBMP obarbut24 left size 030,33 font obotaof noborder of barRestaurante action( procura_geral_bar("Bar"))
    				@ 327,038 BTNBMP obarbut25 left size 030,33 font obotaof noborder of barRestaurante action( consulta_produto_aleatorio(1) )
    				@ 327,073 BTNBMP obarbut26 left size 030,33 font obotaof noborder of barRestaurante action( iif(ver_senha("000552") = .t.,exclui_tablet(objetpedido),"") )
                    @ 327,108 BTNBMP obarbut27 left size 030,33 font obotaof noborder of barRestaurante action( menu_suspenso_sup() )
    				obarbut24:SetFile("bar_bt_client.bmp")
    				obarbut25:SetFile("bar_bt_preco.bmp")
    				obarbut26:SetFile("bar_bt_excluir_pedido.bmp")
    				obarbut27:SetFile("bar_bt_menu.bmp")
    				for ttxx = 24 to 27
    				    mbut = "obarbut" + strzero(ttxx,2)
    					&mbut:lTransparent = .t.
    					&mbut:SetColor( corfrtsay,clr_fundo_branco )
    					&mbut:oCursor := ohand
    				next
                    
    				@ 327,143 BTNBMP obarbut28 left size 030,33 font obotaof noborder of barRestaurante action ( rproc_desconto(objetpedido) )
    				@ 327,178 BTNBMP obarbut29 left size 030,33 font obotaof noborder of barRestaurante action ( rproc_recebimento(objetpedido) )
    				@ 327,213 BTNBMP obarbut30 left size 030,33 font obotaof noborder of barRestaurante action ( verifica_opcao(objetpedido,"E") )
                    @ 327,248 BTNBMP obarbut31 left size 030,33 font obotaof noborder of barRestaurante action ( ( saida_bar(),barRestaurante:end() ) )
    				obarbut28:SetFile("bar_bt_desconto.bmp")
    				obarbut29:SetFile("bar_bt_receceb.bmp")
    				obarbut30:SetFile("bar_bt_exclui_item.bmp")
    				obarbut31:SetFile("bar_bt_sai.bmp")
    				for ttxx = 28 to 31
    				    mbut = "obarbut" + strzero(ttxx,2)
    					&mbut:lTransparent = .t.
    					&mbut:SetColor( corfrtsay,clr_fundo_branco )
    					&mbut:oCursor := ohand
    				next
    				
    				//obarbut24:refresh()
    				//obarbut25:refresh()
    				//obarbut26:refresh()
    				//obarbut27:refresh()
    				//obarbut28:refresh()
    				//obarbut29:refresh()
    				//obarbut30:refresh()
    				//obarbut31:refresh()
    				
    		   		@ 227,386 say oPtotaldeitens  var mPtotaldeitens picture "@e 999,999" font mtahomagrande of barRestaurante size 090,13 color RGB(000,000,000),RGB(000,128,192) pixel right
    				@ 278,368 say oPtotaldopedido var mPtotaldopedido picture "@e 999,999,999,999.99" font mtahomagrande of barRestaurante size 108,15 color rgb(193,017,030),corfdosay pixel right
    		   		@ 294,368 say oPvalorrecebidosupermercado var mPvalorrecebidosupermercado picture "@e 999,999,999,999.99" font mtahomagrande of barRestaurante size 108,15 color RGB(031,068,087),rgb(255,255,255) pixel right
    		   		@ 310,368 say oPtroco var mPtroco picture "@e 999,999,999,999.99" font mtahomagrande of barRestaurante size 108,15 color RGB(000,000,000),rgb(255,255,255) pixel right
    				
    				@ 340,285 say oObservacoes var mObservacoes picture "@!" font mtahomagrande size 218,15 of barRestaurante color rgb(000,000,000),rgb(255,255,255) pixel center
    				
    		   		
    				barRestaurante:bKeyDown := {|nKey| iif( nKey == VK_F3 ,consulta_produto_aleatorio(1),0),;
                                                       iif( nKey == VK_F4 ,iif(ver_senha("000552") = .t.,exclui_tablet(objetpedido),""),0),;
                                                       iif( nKey == VK_F5 ,menu_suspenso_sup(),0),;
                       						           iif( nKey == VK_F6 ,rproc_desconto(objetpedido),0),;
                       						           iif( nKey == VK_F7 ,rproc_recebimento(objetpedido),0),;
                       						           iif( nKey == VK_F8 ,verifica_opcao(objetpedido,"E"),0),;
    		   		                                   iif( nKey == VK_F9 ,( saida_bar(), barRestaurante:end() ),0)}
    				
    		 activate dialog barRestaurante center valid lsair on init( zera_valores() , ver_dados_grupo("B"),dados_comanda(3),analise_geral_na_entrada(),pesquisa_comecadigitado("oPcodigoproduto","Bar") )

     

  10. Valeu!!

    Em MG, o que se alterou em relação a NFC-e das demais UF's foram apenas algumas URL'S que foi a partir do dia 06/03/2023

    A URL de consulta a NFCe via QRCode e a URL de consulta por chave (Portal) foram alteradas em homologação e produção.

    A partir de 06/03/2023 só aceitaremos as url's abaixo:

     

    PRODUÇÃO

    Nova url de consulta via QRCode
    https://portalsped.fazenda.mg.gov.br/portalnfce/sistema/qrcode.xhtml

    Nova url de consulta via Portal:
    https://portalsped.fazenda.mg.gov.br/portalnfce

     

    HOMOLOGAÇÃO

    Nova url de consulta via Portal:

    https://hportalsped.fazenda.mg.gov.br/portalnfce

    Nova url de consulta via QRCode

    https://portalsped.fazenda.mg.gov.br/portalnfce/sistema/qrcode.xhtml

     

    Importante lembrar que as novas urls deverão ser utilizadas tanto no processo de consulta quanto de autorização.

    Caso sejam utilizadas as url's antigas o emitente poderá receber as rejeições: "878: Endereço do site da UF da Consulta por chave de acesso diverge do previsto" ou "395: Endereço do site da UF da Consulta via QR-Code diverge do previsto".

     

    Abraço.

     

  11. Boa tarde,

    Você pode usar a DLL da UNIMAKE ( É free - gratuita )

    Acesse.
    https://wiki.unimake.com.br/index.php/Manuais:Unimake.DFe

    https://github.com/Unimake/DFe
    Neste na pasta EXEMPLOS - tem todos os exemples em xharbour.

    No youtube, tem todas as LIVE ensinando como programar com a DLL no xharbour, consequentemente em fivewin + xharbour
    https://www.youtube.com/results?search_query=dll+unimake+xharbour
    É só procurar as LIVE, são muitas..

    Para baixar a DLL
    https://www.unimake.com.br/downloads


    TEM TAMBÉM OS FONTES DO SR. JOSE QUINTAS ( CLASSE) em fivewin + xharbour
    TOTALMENTE FUNCIONAL ( basta baixar zipado, todas os fontes estão lá, inclusive com exemplos)
    https://github.com/JoseQuintas/sefazclass
     


    Abraço.

  12. RESOLVI ASSIM.

    Fiz a abertura do site de MANIFESTAÇÃO DO DESTINATÁRIO DA SEFAZ/NACIONAL em uma dialog a partir do ACTIVEX e a partir desta tela eu salvo o  HTML, para que eu possa localizar as NF-e pelo sua chave neste HTML e as recolho guardando em um ARRAY.
     

    consulta_nf_2.fw.png

     

    Depois faço uma busca ao invés do ULTNSU, mas sim por CHAVE que havia recolhido e guardado no ARRAY.  Sendo assim não necessito do ULTNSU, pois a consulta que faço é por chave da NF-e. ( ISSO me dá até 20 documentos a cada hora de consulta.), sendo que se alguém (contabilidade) faz a busca por NSU (ULTIMO), não atrapalha a minha consulta.

    Ele retorna.

    consulta_nf_3.fw.png

     

    Leio o retorno e localizo o "doczip", assim utilizo os comandos... "hb_ZUncompress(HB_base64Decode())", para ter o XML e pode processar o mesmo na ENTRADA DA NF.

    Esta funcionando bem.

     

     

  13. Boa tarde,

    Uma forma que encontrei de "AMENIZAR" estas operações fiscais, sem a necessidade de colocar as regras nos cadastros de produtos, foi a de criar um "CADASTRO DE OPERAÇÕES FISCAIS", que trabalhe com o cadastro da própria LOJA (ESTADO onde a empresa se encontra), CADASTRO DE UF,CADASTRO DE PRODUTOS, CADASTRO DE CST/CSOSN e o próprio cadastro de OPERAÇÕES FICAIS.

    fiscal_1.fw.png

    fiscal_2.fw.png

    fiscal_3.fw.png

    fiscal_4.fw.png

    fiscal_5.fw.png

    fiscal_6.fw.png

    fiscal_7.fw.png

    fiscal_8.fw.png

    fiscal_9.fw.png

  14. Boa noite,

    Alguém teria uma solução para a utilização do método (NfeDistribuicaoDFe) de pegar o ultNSU e utilizá-lo para pesquisar as NF-e emitidas contra o CNPJ. O meu problema é que mais de um software utiliza este método ( NfeDistribuicaoDFe) ou seja o meu ERP e de CONTADORES, e sempre me retorna ou "656-USO INDEVIDO". Este método está no MOC - Manual de Orientação ao Contribuinte - MOC - versão 7.0 - NF-e e NFC-e que começa na página 90

    Já sei que o problema é que o meus software utiliza este método e os software de contadores também utilizam, sendo assim o meu último ultNSU, nunca será igual ao da contabilidade, fazendo assim que sempre retorne "656- USO INDEVIDO". ( Se alguém tiver uma solução para este problema)

    Agradeço qualquer ajuda.

    Meu código detalhado abaixo e com as descrições dos passos.
     

    function consulta_nfe_contra(objconsultatipo)
    
    		 wonfeNormalConsumidor = "N"
    		 
    		 
    		 // 1º - Aqui ele abre um select para pegar as configurações da NF-e para gerar o arquivo
    		 // CNPj-dist-dfe.xml
    		 
    		 if zsequencianotafiscal = .f.
    		    cwQuery := "select * from adloja where seqloja = " + alltrim(str(zseqloja))
    		 else
    		    cwQuery := "select * from adloja where seqloja = 1"
    		 endif
             cwQuery += " order by seqloja asc;"
             owQuery := oServer:Query(cwQuery)
             xfatambiemtedanotafiscaleletronica = owquery:Fieldget(owquery:Fieldpos('fatambiemtedanotafiscaleletronica'))
             if wonfeNormalConsumidor = "N"
    		    xfattipodeemissaonotafiscaleletronica = owquery:Fieldget(owquery:Fieldpos('fattipodeemissaonotafiscaleletronica'))
    		 elseif wonfeNormalConsumidor = "C"
    		    xfattipodeemissaonotafiscaleletronica = owquery:Fieldget(owquery:Fieldpos('fattipodeemissaonotafiscaleletronicanfce'))
    			if xfattipodeemissaonotafiscaleletronica = 8
    			   xfattipodeemissaonotafiscaleletronica = 9
    			endif
    		 endif
             if xfattipodeemissaonotafiscaleletronica = 1
                ntitle = "Normal | " + "SEFAZ | " + zuf
             elseif xfattipodeemissaonotafiscaleletronica = 2
               ntitle = "FS-IA | Contigencia com impressao do DANFE em formulario de seguranca"
             elseif xfattipodeemissaonotafiscaleletronica = 3
               ntitle = "SCAN | Sistema de contigencia em ambiente Nacional"
             elseif xfattipodeemissaonotafiscaleletronica = 4
               ntitle = "DPEC | Declaracao previa da emissao em contigencia"
             elseif xfattipodeemissaonotafiscaleletronica = 5
               ntitle = "FS-DA | Contigencia com impressao do DANFE em formulario de seguranca"
             elseif xfattipodeemissaonotafiscaleletronica = 6
               ntitle = "SVC-AN | Sefaz virtual de contigencia do AN"
             elseif xfattipodeemissaonotafiscaleletronica = 7
               ntitle = "SVC-RS | Sefaz virtual de contigencia do RS"
             elseif xfattipodeemissaonotafiscaleletronica = 9
               ntitle = "Contigencia off-line da NFC-e"
             endif
             otitlegerencianfe = otitlegerencianfe + ntitle
    
             if wonfeNormalConsumidor = "N"
    		    xfatversaodoxmldanotafiscal    = owquery:Fieldget(owquery:Fieldpos('fatversaodoxmldanotafiscal'))
                xfatmodelonotafiscalnormal     = owquery:Fieldget(owquery:Fieldpos('fatmodelonotafiscalnormal'))
                xfatserienotafiscalnormal      = owquery:Fieldget(owquery:Fieldpos('fatserienotafiscalnormal'))
                xfatserienotafiscalcontigencia = owquery:Fieldget(owquery:Fieldpos('fatserienotafiscalcontigencia'))
                xfatdatahoraentradacontigencia = owquery:Fieldget(owquery:Fieldpos('fatdatahoraentradacontigencia'))
                xfatmotivodacontigencia        = owquery:Fieldget(owquery:Fieldpos('fatmotivodacontigencia'))
             elseif wonfeNormalConsumidor = "C"
    		    xfatversaodoxmldanotafiscal    = owquery:Fieldget(owquery:Fieldpos('fatversaodoxmldanotafiscalnfce'))
                xfatmodelonotafiscalnormal     = owquery:Fieldget(owquery:Fieldpos('fatmodelonotafiscalnormalnfce'))
                xfatserienotafiscalnormal      = owquery:Fieldget(owquery:Fieldpos('fatserienotafiscalnormalnfce'))
                xfatserienotafiscalcontigencia = owquery:Fieldget(owquery:Fieldpos('fatserienotafiscalcontigencia'))
                xfatdatahoraentradacontigencia = owquery:Fieldget(owquery:Fieldpos('fatdatahoraentradacontigencianfce'))
                xfatmotivodacontigencia        = owquery:Fieldget(owquery:Fieldpos('fatmotivodacontigencianfce'))
    		 endif
             
    		 znfesincrono  = owquery:Fieldget(owquery:Fieldpos('fatnfesincrono'))
             znfcesincrono = owquery:Fieldget(owquery:Fieldpos('fatnfcesincrono'))
    		 
    		 xfatpastaxmlenviadosindidualmente = reverso(owquery:Fieldget(owquery:Fieldpos('fatpastaxmlenviadosindidualmente')))
             xfatpastaxmlenviadoslotes         = reverso(owquery:Fieldget(owquery:Fieldpos('fatpastaxmlenviadoslotes')))
             xfatpastaxmlretornodowebservice   = reverso(owquery:Fieldget(owquery:Fieldpos('fatpastaxmlretornodowebservice')))
             xfatpastaxmlautorizados           = reverso(owquery:Fieldget(owquery:Fieldpos('fatpastaxmlautorizados')))
             xfatpastaxmltemporarios           = reverso(owquery:Fieldget(owquery:Fieldpos('fatpastaxmltemporarios')))
             xfatpastaxmlbackup                = reverso(owquery:Fieldget(owquery:Fieldpos('fatpastaxmlbackup')))
             xfatpastaxmlavalidar              = reverso(owquery:Fieldget(owquery:Fieldpos('fatpastaxmlavalidar')))
             owQuery:destroy()
    		 // 1º - Termina o selct.
    		 
    		 // 2º - A variável cDirXML_cons, direciona para qual pasta será criado o arquivo CNPJ-con-dist-dfe.xml
    		 cDirXML_cons = reverso(alltrim(xfatpastaxmlenviadosindidualmente)) + "\" + alltrim(znumerodocumentonacional) + "-con-dist-dfe.xml"
    		 // 3º - A variável B02_CUF, pega o estado para o arquivo CNPJ-con-dist-dfe.xml
    		 B02_cUF = ver_estado(zuf)
    		 
    		 
    		 // 4º - Neste select ele pega o ultNSU a ser pesquisado e compara com maxNSU,
    		 // para ver se igualou o ultNSU com maxNSU, se sim aguarda 1h e 30mm
    		 // para começar a pesquisa novamento
    		 if zsequencianotafiscal = .f.
    		    cwQuery := "select * from adloja where seqloja = " + alltrim(str(zseqloja))
    		 else
    		    cwQuery := "select * from adloja where seqloja = 1"
    		 endif
             cwQuery += " order by seqloja asc;"
             owQuery := oServer:Query(cwQuery)
    		 xfatnumeronsu    = owquery:Fieldget(owquery:Fieldpos('fatnumeronsu'))
    		 if empty(xfatnumeronsu)
    		    xfatnumeronsu = 0
    		 endif
    		 xfatnumeronsumax = owquery:Fieldget(owquery:Fieldpos('fatnumeronsumax'))
    		 if empty(xfatnumeronsumax)
    		    xfatnumeronsu = 0
    		 endif
             owQuery:destroy()
    		 // 4º - Termina..........
    		 
    		 // 5º - Verifica se o ultNSU alcançou o NSUmax e aguarda até 1 hora e meia para prosseguir novas consultas......
    		 if xfatnumeronsu > 0
    		    if xfatnumeronsumax > 0
    			   if xfatnumeronsu >= xfatnumeronsumax
    			      msgwsiscom("Colocar aqui msg de espera.","Atenção")
    			      return nil
    			   endif
    			endif
    		 endif
    		 
    		 // 6º - Se o ultNSU ESTIVER ELE COMEÇA ZERADO, SE NÃO É O ultNSU GUARDADO NA BASE
    		 // QUE SERÁ PESQUISAO.
    		 if empty(xfatnumeronsu)
    		    xfatnumeronsu = "000000000000000"
    	     else
    		    xfatnumeronsu =  replicate("0",15 - len(alltrim(str(xfatnumeronsu)))) + alltrim(str(xfatnumeronsu))
    		 endif
    		 
    		 // 7º - Ele irá criar o o xml CNPj-dist-dfe.xml com os dados acima
    		 // que será enviado a SEFAZ/MG para ser pesquisado.
    		 lh := 00
             oPrn := TDosPrn():New(cDirXML_cons)
             oPrn:StartPage()
             oPrn:lZeraBuffer:=.T.
    		 
    		 mlinha = '<?xml version="1.0" encoding="utf-8"?>'
             oPrn:Say(lh,000,mlinha)
             ++lh
             mlinha = '<distDFeInt xmlns="http://www.portalfiscal.inf.br/nfe" versao="1.35">'
             oPrn:Say(lh,000,mlinha)
             ++lh
                mlinha = '<tpAmb>'+alltrim(str(xfatambiemtedanotafiscaleletronica))+'</tpAmb>'
                oPrn:Say(lh,000,mlinha)
                ++lh
                mlinha = '<cUFAutor>'+B02_cUF+'</cUFAutor>'
                oPrn:Say(lh,000,mlinha)
                ++lh
                mlinha = '<CNPJ>'+alltrim(znumerodocumentonacional)+'</CNPJ>'
                oPrn:Say(lh,000,mlinha)
                ++lh
    		    
    		    if objconsultatipo = "geral"
    			   mlinha = '<distNSU>'
                   oPrn:Say(lh,000,mlinha)
                   ++lh
                      mlinha = '<ultNSU>'+xfatnumeronsu+'</ultNSU>'
                      oPrn:Say(lh,000,mlinha)
                      ++lh
    				  
    				  
    				  //msginfo(xfatnumeronsu)
    				  
    				  
    		       mlinha = '</distNSU>'
                   oPrn:Say(lh,000,mlinha)
                   ++lh
    			endif
    		 
    		 mlinha = '</distDFeInt>'
             oPrn:Say(lh,000,mlinha)
             ++lh
    		 
             oPrn:EndPage()
             oPrn:End()
    		 
    		 //msginfo(cDirXML_cons)
    		 
    
             // 8º - Pega o CNPJ-dist-dfe.xml, que voltou da SEFAZ em uma pasta para ser analisado..
    		 cDirXML = reverso(alltrim(xfatpastaxmlretornodowebservice)) + "\" + alltrim(znumerodocumentonacional) + "-dist-dfe.xml"
             cDirXME = reverso(alltrim(xfatpastaxmlretornodowebservice)) + "\" + alltrim(znumerodocumentonacional) + "-con-dist-dfe.err"
             msn = "N"
             nqte = 0
    		 do while nqte < 200000000
                if file(cDirXML)
                   msn = "S"
                   exit
                endif
                if file(cDirXME)
                   if file(cDirXML)
                      msn = "S"
                      exit
                   endif
                   msn = "N"
                   exit
                endif
                ++nqte
             enddo
    		 
             _ultNSU  =  "000000000000000"
             _maxNSU  =  "000000000000000"
    		 _nmotivo = ""
    		 _cStat   = ""
    		 _processa_xml = "S"
             if msn = "N"
                if file(cDirXME)
                   cInfo = ""
                   csource = cDirXME
                   nsource:=fopen("&csource",0)
                   if ( nsource ) # -1
                      lEof:=.F.
                      nn = 1
                      do while !lEof
                         c :=p_readln_1(nSource,linebuff)
                         if !lEof .and. c#chr(26)
                            if nn = 1
                               cInfo := c
                               ++nn
                            else
                               cInfo+=CRLF+c
                            endif
                         endif
                      enddo
                   endif
                   fclose(nsource)
    		       //msgstop(cInfo,"Atencao")
                   ferase(cDirXME)
    			   _processa_xml = "N"
                endif
                //return nil
             elseif msn = "S"
    		    nmotivo =  abrir_xml(cDirXML,"xMotivo")
                _ultNSU =  abrir_xml(cDirXML,"ultNSU")
                _maxNSU =  abrir_xml(cDirXML,"maxNSU")
    			_cStat   = abrir_xml(cDirXML,"cStat")
             endif
    		 // 9º - Termina a analise CNPJ-dist-dfe.xml
    		 
    		 // 10º - Se houve mudanças no maxNSU ele grava na base de dados
    		 if val(_maxNSU) > 0
    		    cwQuery := "Update adloja set fatnumeronsu = " + alltrim(str(val(_ultNSU)))
    		    cwQuery += ",fatnumeronsuMax = " + alltrim(str(val(_maxNSU)))
    		    cwQuery += ",datanumeronsu = "   + "'" + substr(dtos(ldate),1,4)+"-"+substr(dtos(ldate),5,2)+"-"+substr(dtos(ldate),7,2) + "'"
    		    cwQuery += ",timenumeronsu = "   + "'" + time() + "'"
                if zsequencianotafiscal = .f.
    		       cwQuery += " where " + " seqloja = " + alltrim(str(zseqloja))
    		    else
    		       cwQuery += " where " + " seqloja = 1"
    		    endif
    		    owQuery := oServer:Query(cwQuery)
                if owQuery:neterr()
                   msgStop("Erro na gravação do NSU.","ATENÇÂO")
                endif
                owQuery:destroy()
                oServer:Commit()
    		 
    		 // 10º - Se houve mudanças no ultNSU ele grava na base de dados
    		 elseif val(_ultNSU) > 0
    		    cwQuery := "Update adloja set fatnumeronsu = " + alltrim(str(val(_ultNSU)))
    		    cwQuery += ",datanumeronsu = "   + "'" + substr(dtos(ldate),1,4)+"-"+substr(dtos(ldate),5,2)+"-"+substr(dtos(ldate),7,2) + "'"
    		    cwQuery += ",timenumeronsu = "   + "'" + time() + "'"
                if zsequencianotafiscal = .f.
    		       cwQuery += " where " + " seqloja = " + alltrim(str(zseqloja))
    		    else
    		       cwQuery += " where " + " seqloja = 1"
    		    endif
    		    owQuery := oServer:Query(cwQuery)
                if owQuery:neterr()
                   msgStop("Erro na gravação do NSU.","ATENÇÂO")
                endif
                owQuery:destroy()
                oServer:Commit()
    		 endif
    		 
    		 //msginfo(_cStat)
    		 
    		 
    		 //11º - Verifica o cStat retornado no arquivo CNPJ-dist-dfe.xml
    		 
    		 // AQUI ENCONTRA-SE O PROBLEMA, ELE SEMPRE RETORNA 656-CONSUMO INDEVIDO..................................
    		 // 
    		 if alltrim(_cStat) = "138"  // Documento localizado
    		    _processa_xml = "S"
    		 else
    		    if !empty(nmotivo)
    		       msgstop(nmotivo)
    			endif
                _processa_xml = "N"
    		 endif
    		 
    		 /*
    		 if _processa_xml = "S"
                 hFile := FOpen( cDirXML  )
                 xmlDoc := TXmlDocument():New( hFile )
                 if xmlDoc:nStatus != HBXML_STATUS_OK
                     msgstop("Falha no arquivo XML ","ERRO Arquivo XML")
                     return nil
                 endif
                 xmlIter := TXmlIterator():New( xmlDoc:oRoot )
                 xmlNode := xmlIter:Find()
                 do while xmlNode != NIL
                    cName := xmlNode:cName
                    cData := xmlNode:cData
                    
    				if empty(cName)
                       xmlNode := xmlIter:Next()
                       loop
                    endif
    				
    				msginfo("cName: " + cName )
    				if !empty(cData)
    				   msginfo("cData: " + cData )
    				endif
    		 
                    xmlNode := xmlIter:Next()
                 enddo
                 fclose(hFile)
    		 endif
    		 */
    		 
    		 
    		 //12º - Irá fazer a leitura para apresentar as NF-e emitidas contra o CNPJ.............................
    		 cDirlocalretornoxml = reverso(alltrim(xfatpastaxmlretornodowebservice)) + "\dfe\" 
    		 
    		 asamplzNOTA = {}
    		 
             j = 0
             j = adir(cDirlocalretornoxml + "*.xml")
             declare marquivo[j]
             adir(cDirlocalretornoxml + "*.xml", marquivo)
             if j <= 0
                msgwsiscom("Não há arquivos xml emitidos contra.","ATENCAO")
                return nil
             endif
             
    		 fwait("  ...Aguarde processando...")
    		 
    		 for ttqq = 1 to len(marquivo)
    		     
                 hFile := FOpen( cDirlocalretornoxml + marquivo[ttqq]  )
                 xmlDoc := TXmlDocument():New( hFile )
                 if xmlDoc:nStatus != HBXML_STATUS_OK
                     msgstop("Falha no arquivo XML ","ERRO Arquivo XML")
                     return nil
                 endif
                 xmlIter := TXmlIterator():New( xmlDoc:oRoot )
                 xmlNode := xmlIter:Find()
    		     
                 nfe_notafiscalsimounao = "N"
                 nfe_cabecalho = ""
                 nfe_serie         = space(03) // serie do documento fiscal
                 nfe_numero        = space(09) // numero do documento fiscal
                 nfe_emissao       = space(10) // data de emissÆo
                 nfe_e_cnpj        = space(14) // CNPJ
                 nfe_e_cpf         = space(11) // CPF
                 nfe_e_razaonome   = space(60) // nome ou razao social
                 nfe_e_estado      = space(02) // estado
                 nfe_t_valornota   = space(15) // 15,2 valor total da nota fiscal
                 nfe_chave         = space(100) // chave da nota fiscal
    		     
                 do while xmlNode != NIL
                    cName := xmlNode:cName
                    cData := xmlNode:cData
    		     
                    if empty(cName)
                       xmlNode := xmlIter:Next()
                       loop
                    endif
    		     
                    if cName = "infNFe"
                       nfe_notafiscalsimounao = "S"
                    endif
    		     
                    if upper(cName) = "IDE"        .or.;  // dados da nota fiscal
                       upper(cName) = "NFREF"      .or.;  // referenciada
                       upper(cName) = "REFNF"      .or.;  // referenciada
                       upper(cName) = "REFNP"      .or.;  // referenciada
                       upper(cName) = "REFECF"     .or.;  // referenciada
                       upper(cName) = "EMIT"       .or.;  // emitente
                       upper(cName) = "AVULSA"     .or.;  // emitente avulsa pelo fisco
                       upper(cName) = "DEST"       .or.;  // destinatario
                       upper(cName) = "RETIRADA"   .or.;  // destinatario
                       upper(cName) = "ENTREGA"    .or.;  // destinatario
                       upper(cName) = "DET"        .or.;  // cabecalho de produtos..
                       upper(cName) = "PROD"       .or.;  // produtos
                       upper(cName) = "IMPOSTO"    .or.;  // icms
                       upper(cName) = "ICMS"       .or.;  // icms
                       upper(cName) = "IPI"        .or.;  // ipi
                       upper(cName) = "IPITRIB"    .or.;  // ipi
                       upper(cName) = "IPINT"      .or.;  // ipi
                       upper(cName) = "PIS"        .or.;  // pis
                       upper(cName) = "PISALIQ"    .or.;  // pis
                       upper(cName) = "PISQTDE"    .or.;  // pis
                       upper(cName) = "PISNT"      .or.;  // pis
                       upper(cName) = "PISOUTR"    .or.;  // pis
                       upper(cName) = "PISST"      .or.;  // pis
                       upper(cName) = "COFINS"     .or.;  // cofins
                       upper(cName) = "COFINSALIQ" .or.;  // cofins
                       upper(cName) = "COFINSQTDE" .or.;  // cofins
                       upper(cName) = "COFINSNT"   .or.;  // cofins
                       upper(cName) = "COFINSOUTR" .or.;  // cofins
                       upper(cName) = "COFINSST"   .or.;  // cofins
                       upper(cName) = "ISSQN"      .or.;  // issqn
                       upper(cName) = "TOTAL"      .or.;  // total
                       upper(cName) = "ICMSTOT"    .or.;  // total icms
                       upper(cName) = "ISSQNTOT"   .or.;  // issqn
                       upper(cName) = "RETTRIB"    .or.;  // restitui‡Æo tribu
                       upper(cName) = "TRANSP"     .or.;  // transportador
                       upper(cName) = "RETTRANSP"  .or.;  // transportador
                       upper(cName) = "VEICTRANSP" .or.;  // transportador
                       upper(cName) = "VOL"        .or.;  // volumes
                       upper(cName) = "COBR"       .or.;  // cobran‡a
                       upper(cName) = "FAT"        .or.;  // Fatura
                       upper(cName) = "DUP"        .or.;  // duplicata
                       upper(cName) = "INFADIC"    .or.;  // informa‡äes adicionais
                       upper(cName) = "INFPROT"
    		     
                       nfe_cabecalho = upper(cName)
    		     
                       if upper(cName) = "DET"
                       endif
    		     
                    endif
    				
                    if nfe_cabecalho = "IDE"
                       if !empty(cData)
                          nfe_serie         = iif(cName = "serie"  ,cData,retorna_volta(nfe_serie         ))
                          nfe_numero        = iif(cName = "nNF"    ,cData,retorna_volta(nfe_numero        ))
                          nfe_emissao       = iif(cName = "dEmi"   ,cData,retorna_volta(nfe_emissao       ))
                          if empty(nfe_emissao)
                             nfe_emissao    = iif(cName = "dhEmi"  ,cData,retorna_volta(nfe_emissao       ))
                             nfe_emissao    = substr(nfe_emissao,1,10)
                          endif
                       endif
                    endif
                    if nfe_cabecalho = "EMIT"
                       if !empty(cData)
                          nfe_e_cnpj          = iif(cName = "CNPJ"   ,cData,retorna_volta(nfe_e_cnpj          ))
                          nfe_e_cpf           = iif(cName = "CPF"    ,cData,retorna_volta(nfe_e_cpf           ))
                          nfe_e_razaonome     = iif(cName = "xNome"  ,upper(cData),retorna_volta(nfe_e_razaonome     ))
                          nfe_e_estado        = iif(cName = "UF"     ,upper(cData),retorna_volta(nfe_e_estado        ))
                       endif
                    endif
                    
                    if nfe_cabecalho = "ICMSTOT"
                       if !empty(cData)
                          nfe_t_valornota   = iif(cName = "vNF"        ,cData,retorna_volta(nfe_t_valornota   ))
                       endif
                    endif
    				
                    if nfe_cabecalho = "INFPROT"
                       if !empty(cData)
                          nfe_chave        = iif(cName = "chNFe"       ,cData,retorna_volta(nfe_chave        ))
                       endif
                    endif
    				
                    xmlNode := xmlIter:Next()
                 enddo
                 fclose(hFile)
    			 
    			 if nfe_notafiscalsimounao = "S"
    				nfe_emissao = substr(nfe_emissao,9,2) + "-" + substr(nfe_emissao,6,2) + "-" + substr(nfe_emissao,1,4)
    				aadd(asamplzNOTA,{"",;
    			                      nfe_serie,;
    			    				  nfe_numero,;
    			    				  nfe_emissao,;
    			    				  nfe_e_razaonome,;
    			    				  iif(!empty(nfe_e_cnpj),nfe_e_cnpj,nfe_e_cpf),;
    			    				  nfe_e_estado,;
    			    				  nfe_t_valornota,;
    			    				  nfe_chave})
    			 endif
    		 
    		 next
    		 
             odlgwait:end()
    		 
             if empty(asamplzNOTA)
                asamplzNOTA = {""}
             else
    		    asamplzNOTA := asort(asamplzNOTA,,,{|x,y| (x[4] > y[4])})
    		 endif
             obrzNOTA:SetArray(asamplzNOTA)
             obrzNOTA:refresh()
    return nil

     

  15. E para imprimir eu utilizo o MRBOLETO.

    		    	  if nnescolhe = 1
    		    	     ++nnescolhe
    		  	      oBoleto  := MR_Boleto():New( cFilePdf )
    		    	  endif
    		  	      oBoleto:Banco________ := substr(xnbanco,1,3)
                      oBoleto:Banco_Agencia := alltrim(xnagencia)
                      oBoleto:Banco_Ag_Dv__ := iif(empty(xndagencia),"",alltrim(xndagencia))
                      oBoleto:Banco_Ag_Un_A := iif(empty(xndagencia_Un),"",alltrim(xndagencia_Un))
                      oBoleto:Conta________ := alltrim(xnconta)
                      oBoleto:Conta_DV_____ := alltrim(xndconta)
                      oBoleto:Conta_OP_____ := iif(empty(xnoperacao),"","'" + alltrim(xnoperacao))
                      oBoleto:Carteira_____ := alltrim(xncarteira)
                      oBoleto:Carteira_Tipo := iif(empty(xntpcarteira),"",alltrim(xntpcarteira))
                      oBoleto:NossoNumero__ := tnossonumerosequencia
                      oBoleto:Doc_Origem___ := iif( substr(nNumerododocument_a_gravar,9,3) = "Ped","DM","DM")
                      oBoleto:Prefixo______ := iif(empty(xnprefixo),"",alltrim(xnprefixo))
                      oBoleto:Prefixo_DV___ := iif(empty(xndprefixo),"",alltrim(xndprefixo))
                      oBoleto:Doc_Numero___ := alltrim(andup)
                      oBoleto:Doc_Aceite___ := alltrim(xnaceite)
                      oBoleto:Doc_Especie__ := alltrim(xnespecie)
                      oBoleto:Doc_Data_____ := ldataemissao
                      oBoleto:Vencimento___ := advenc
                      oBoleto:Valor________ := avdup
                      oBoleto:Multa_Auto___ := iif(empty(zfinmultaatraso),0,zfinmultaatraso)
                      oBoleto:Juros_Mes____ := iif(empty(zfintaxajurosmensal),0,zfintaxajurosmensal)
                      oBoleto:Numero_Vias__ := val(xnvias)
                      oBoleto:Local_Pagamen := { xnlocalpagamento }
    		  	      //if empty(xninstrucao)
    		  	       oBoleto:Instrucoes___ := { "","" }
    		  	      //else
    		  	      //endif
                      oBoleto:Demonstrativo := { "","","","","","","","","","","","","","","" }
                      oBoleto:Cedente______ := { mlinh1,mlinh2,mlinh3}
                      oBoleto:Sacado_______ := { mlinha1,mlinha2,mlinha3,mlinha4 }
    		  	      oBoleto:Avalista_____ := { "Não informado.", "", "" }
    		  	      oBoleto:AddPage()

     

  16. Boa noite,

    Eu uso para o "ITAÚ", "BRADESCO","SANTANDER" e SICOOB e vou começar a do developer's  Banco do Brasil.
     

    Exemplo do ITAU ( Uma parte é em fivewin e outra em PHP).

    Em FIVEWI
    N

    if len(alltrim(xnagencia)) < 4 .or. len(alltrim(xnagencia)) > 4
       msgstop("Agência com digitos inferior ou superior a 4 posições","Atenção")
    	exit
    endif
    if len(alltrim(xndconta)) < 1 .or. len(alltrim(xndconta)) > 1
       msgstop("Dígito da conta inferior ou superior a 1 posição.","Atenção")
    	exit
    endif
    if empty(xncarteira)
       msgstop("Carteira vazia.","Atenção")
    	exit
    endif
    
    if empty(_nret_access_token)
       _Client_ID = xnclienteid
       _Client_secret = xnclientesecret
       _Client_certificadocrt = xncertificadocrt + ".crt"
       _Client_certificadokey = xncertificadocrt + ".key"
    
       cSignatureValue = ""
       _nArquivo_enviar = "http://www.wsiscom.com.br/itau/acess_token_itau.php?Client_ID_envia=" + _Client_ID +;
                          "&Client_secret_envia=" + _Client_secret +;
    					   "&Client_certificado_crt=" + _Client_certificadocrt +;
    					   "&Client_certificado_key=" + _Client_certificadokey
       try
          _oserver := CreateObject( "MSXML2.XMLHTTP" )
          _oserver:Open( "GET",_nArquivo_enviar, .F. )
          _oserver:SetRequestHeader("Content-Type","application/text/xml")
          _oserver:Send(_nArquivo_enviar)
          WHILE _oserver:readyState != 4
                _oserver:WaitForResponse( 500 )
          end
    	   cSignatureValue = _oserver:responseText
       catch
          msgstop("1 - Erro na geração do arquivo para o itau. www.wsiscom.com.br/itau/acess_token_itau.php","Erro Atenção")
    	   exit
       end
       if empty(cSignatureValue)
          msgstop("2 - Sem resposta do acess_token_itau.php.","Erro Atenção")
          exit
       endif
       if cSignatureValue = nil
          msgstop("3- Sem resposta do acess_token_itau.php.","Erro Atenção")
    	   exit
       endif
    
       lh := 00
       mdire = "jsoncodf.html"
       oPrn := TDosPrn():New(mdire)
       oPrn:StartPage()
       oPrn:lZeraBuffer:=.T.
       oPrn:Say(lh,000,cSignatureValue)
       oPrn:EndPage()
       oPrn:End()
    
       nlocaliza_erro := At( 'curl_error', cSignatureValue )
       if !empty(nlocaliza_erro)
          exit
       endif
    
       _nret_X_CorrelationID = ""
       _nret_x_itau_correlationID = ""
       _nret_x_itau_flowID = ""
       _nret_access_token = ""
       _nret_refresh_access_token = ""
       _nret_scope_id_boleto = ""
    
       nlocaliza_registro_1 := At( 'X-CorrelationID:', cSignatureValue )
       nlocaliza_registro_2 := At( 'Accept:', cSignatureValue )
       if !empty(nlocaliza_registro_1) .or. !empty(nlocaliza_registro_2)
          _nret_X_CorrelationID = substr(cSignatureValue,nlocaliza_registro_1,(nlocaliza_registro_2 - nlocaliza_registro_1))
    	   _nret_X_CorrelationID = substr(_nret_X_CorrelationID,18,50)
       else
    	   msgstop("Não foi possível localizar o registro (X-CorrelationID:) ","Atenção")
          exit
       endif
    
       nlocaliza_registro_1 := At( 'x-itau-correlationID:', cSignatureValue )
       nlocaliza_registro_2 := At( 'x-itau-flowID:', cSignatureValue )
       if !empty(nlocaliza_registro_1) .or. !empty(nlocaliza_registro_2)
          _nret_x_itau_correlationID = substr(cSignatureValue,nlocaliza_registro_1,(nlocaliza_registro_2 - nlocaliza_registro_1))
    	   _nret_x_itau_correlationID = substr(_nret_x_itau_correlationID,23,50)
       else
    	   msgstop("Não foi possível localizar o registro (x-itau-correlationID:) ","Atenção")
          exit
       endif
    
       nlocaliza_registro_1 := At( 'x-itau-flowID:', cSignatureValue )
       nlocaliza_registro_2 := At( 'x-itau-Limit:', cSignatureValue )
       if !empty(nlocaliza_registro_1) .or. !empty(nlocaliza_registro_2)
          _nret_x_itau_flowID = substr(cSignatureValue,nlocaliza_registro_1,(nlocaliza_registro_2 - nlocaliza_registro_1))
    	   _nret_x_itau_flowID = substr(_nret_x_itau_flowID,16,50)
       else
    	   msgstop("Não foi possível localizar o registro (x-itau-flowID:) ","Atenção")
          exit
       endif
    
       nlocaliza_registro_1 := At( 'access_token', cSignatureValue )
       nlocaliza_registro_2 := At( 'token_type', cSignatureValue )
       if !empty(nlocaliza_registro_1) .or. !empty(nlocaliza_registro_2)
          _nret_access_token = substr(cSignatureValue,nlocaliza_registro_1,(nlocaliza_registro_2 - nlocaliza_registro_1))
    	   _nret_access_token = substr(_nret_access_token,18,5000)
    	   _nnXqq = ""
          for ttqq = 1 to len(_nret_access_token)
    	       if substr(_nret_access_token,ttqq,1) = ' '
    		   elseif substr(_nret_access_token,ttqq,1) = ':'
    		   elseif substr(_nret_access_token,ttqq,1) = '"'
    		   elseif substr(_nret_access_token,ttqq,1) = ','
    		   else
    		      _nnXqq = _nnXqq + substr(_nret_access_token,ttqq,1)
    		   endif
    	   next
          _nret_access_token = _nnXqq
       else
    	   msgstop("Não foi possível localizar o registro (access_token) ","Atenção")
          exit
       endif
    
       nlocaliza_registro_1 := At( 'refresh_token', cSignatureValue )
       nlocaliza_registro_2 := At( 'scope', cSignatureValue )
       if !empty(nlocaliza_registro_1) .or. !empty(nlocaliza_registro_2)
          _nret_refresh_access_token = substr(cSignatureValue,nlocaliza_registro_1,(nlocaliza_registro_2 - nlocaliza_registro_1))
    	   _nret_refresh_access_token = substr(_nret_refresh_access_token,19,5000)
    	   _nnXqq = ""
          for ttqq = 1 to len(_nret_refresh_access_token)
    	       if substr(_nret_refresh_access_token,ttqq,1) = ' '
    		   elseif substr(_nret_refresh_access_token,ttqq,1) = ':'
    		   elseif substr(_nret_refresh_access_token,ttqq,1) = '"'
    		   elseif substr(_nret_refresh_access_token,ttqq,1) = ','
    		   else
    		      _nnXqq = _nnXqq + substr(_nret_refresh_access_token,ttqq,1)
    		   endif
    	   next
          _nret_refresh_access_token = _nnXqq
       else
    	   msgstop("Não foi possível localizar o registro (refresh_token) ","Atenção")
          exit
       endif
    
       nlocaliza_registro_1 := At( 'scope', cSignatureValue )
       nlocaliza_registro_2 := At( 'active', cSignatureValue )
       if !empty(nlocaliza_registro_1) .or. !empty(nlocaliza_registro_2)
          _nret_scope_id_boleto = substr(cSignatureValue,nlocaliza_registro_1,(nlocaliza_registro_2 - nlocaliza_registro_1))
    	   _nret_scope_id_boleto = substr(_nret_scope_id_boleto,17,37)
       else
    	   msgstop("Não foi possível localizar o registro (scope id_boleto) ","Atenção")
          exit
       endif
    endif
    
    // aqui ...
    narquivoJSON := '{' //+ CRLF
    narquivoJSON += '"data": {' //+ CRLF
    //narquivoJSON += '"etapa_processo_boleto": "validacao",' //+ CRLF
    narquivoJSON += '"etapa_processo_boleto": "efetivacao",' //+ CRLF
    narquivoJSON += '"codigo_canal_operacao": "API",' //+ CRLF
    narquivoJSON += '"beneficiario": {' //+ CRLF
    _id_beneficiario = alltrim(xnagencia) + replicate('0',7-len(alltrim(xnconta))) + alltrim(xnconta) + alltrim(xndconta)
    narquivoJSON += '"id_beneficiario": ' + '"' +  _id_beneficiario +'"' //+ CRLF
    narquivoJSON += '},' //+ CRLF
    narquivoJSON += '"dado_boleto": {' //+ CRLF
    narquivoJSON += '"descricao_instrumento_cobranca": "boleto",' //+ CRLF
    narquivoJSON += '"tipo_boleto": "a vista",' //+ CRLF
    narquivoJSON += '"codigo_carteira": ' + '"' + alltrim(xncarteira) + '"' + ',' //+ CRLF
    _valor_total_titulo = alltrim(str(int(avdup * 100)))
    _valor_total_titulo = replicate('0',15-len(_valor_total_titulo)) + _valor_total_titulo
    narquivoJSON += '"valor_total_titulo": ' + '"' + _valor_total_titulo + '"' + ',' //+ CRLF 
    narquivoJSON += '"codigo_especie": "01",' //+ CRLF
    narquivoJSON += '"valor_abatimento": "000",' //+ CRLF
    narquivoJSON += '"data_emissao": ' + '"' + substr(dtos(ldate),1,4) + "-" + substr(dtos(ldate),5,2) + "-" + substr(dtos(ldate),7,2) + '"' + ','  //+ CRLF
    narquivoJSON += '"indicador_pagamento_parcial": true,' //+ CRLF
    narquivoJSON += '"quantidade_maximo_parcial": 0,' //+ CRLF
    narquivoJSON += '"pagador": {' //+ CRLF
    narquivoJSON += '"pessoa": {' //+ CRLF
    narquivoJSON += '"nome_pessoa": ' + '"' + substr(alltrim(rrazaosocial),1,50) + '"' + ',' //+ CRLF
    if !empty(rfantasia)
       narquivoJSON += '"nome_fantasia": ' + '"' + rfantasia + '"' + ',' //+ CRLF
    else
       narquivoJSON += '"nome_fantasia": ' + '"' + substr(alltrim(rrazaosocial),1,25) + '"' + ',' //+ CRLF
    endif
    narquivoJSON += '"tipo_pessoa": {' //+ CRLF
    narquivoJSON += '"codigo_tipo_pessoa": ' + '"' + iif(len(alltrim(rcnpjcpf)) = 11,'F','J') + '"' + ',' //+ CRLF
    if len(alltrim(rcnpjcpf)) = 11
    	narquivoJSON += '"numero_cadastro_pessoa_fisica": ' + '"' + alltrim(rcnpjcpf) + '"' //+ CRLF
    else
    	narquivoJSON += '"numero_cadastro_nacional_pessoa_juridica": ' + '"' + alltrim(rcnpjcpf) + '"' //+ CRLF
    endif
    narquivoJSON += '}'  //+ CRLF
    narquivoJSON += '},' //+ CRLF
    narquivoJSON += '"endereco": {' //+ CRLF
    narquivoJSON += '"nome_logradouro": ' + '"' + substr(alltrim(rendereco) + ',' + alltrim(rnumero),1,45) + '"' + ',' //+ CRLF
    narquivoJSON += '"nome_bairro": ' + '"' + substr(alltrim(rbairro),1,15) + '"' + ',' //+ CRLF
    narquivoJSON += '"nome_cidade": ' + '"' + alltrim(rcidade) + '"' + ',' //+ CRLF
    narquivoJSON += '"sigla_UF": ' + '"' + ruf + '"' + ',' //+ CRLF
    narquivoJSON += '"numero_CEP": ' + '"' + alltrim(rcep) + '"' //+ CRLF
    narquivoJSON += '}' //+ CRLF
    narquivoJSON += '},' //+ CRLF
    narquivoJSON += '"dados_individuais_boleto": [{' //+ CRLF
    narquivoJSON += '"numero_nosso_numero": ' + '"' + _nxgravarnumero + '"' + ',' //+ CRLF
    narquivoJSON += '"data_vencimento": ' + '"' + substr(dtos(advenc),1,4) + "-" + substr(dtos(advenc),5,2) + "-" + substr(dtos(advenc),7,2) + '"' + ',' //+ CRLF
    narquivoJSON += '"valor_titulo": ' + '"' + _valor_total_titulo + '"' + ','  //+ CRLF
    
    // verificar o que significa...
    _nandup = ""
    for ttqq = 1 to len(andup)
        if substr(andup,ttqq,1) = "0" .or. substr(andup,ttqq,1) = "1" .or. substr(andup,ttqq,1) = "2" .or.;
    	    substr(andup,ttqq,1) = "3" .or. substr(andup,ttqq,1) = "4" .or. substr(andup,ttqq,1) = "5" .or.;
    		substr(andup,ttqq,1) = "6" .or. substr(andup,ttqq,1) = "7" .or. substr(andup,ttqq,1) = "8" .or.;
    		substr(andup,ttqq,1) = "9"
    	    _nandup = _nandup  + substr(andup,ttqq,1)
    	 endif
    next
    narquivoJSON += '"texto_uso_beneficiario":' + '"' + substr(alltrim(_nandup),1,10) + '"' + ',' //+ CRLF
    narquivoJSON += '"texto_seu_numero": ' + '"' + substr(alltrim(_nandup),1,10) + '"' //+ CRLF
    
    narquivoJSON += '}],' //+ CRLF
    
    //narquivoJSON += '"desconto": {' //+ CRLF
    //narquivoJSON += '"codigo_tipo_desconto": "00"' //+ CRLF
    //narquivoJSON += '},' //+ CRLF
    
    if !empty(zfinmultaatraso)
       _percentualmulta = "0"
    	_zfinmultaatraso = zfinmultaatraso
    	nPassainteiro = "S"
    	nInteiro = ""
    	nDecimal = ""
    	for ttqq = 1 to len(alltrim(str(_zfinmultaatraso)))
    	    if nPassainteiro = "S"
    		   if substr(alltrim(str(_zfinmultaatraso)),ttqq,1) != "."
    	          nInteiro = nInteiro + substr(alltrim(str(_zfinmultaatraso)),ttqq,1)
    		   else
    		      nPassainteiro = "N"
    		   endif
    	    else
    	       nDecimal = nDecimal + substr(alltrim(str(_zfinmultaatraso)),ttqq,1)
    	    endif
    	next
    	_percentualmulta  = replicate("0",7 - len(nInteiro)) + nInteiro + nDecimal + replicate("0",5 - len(nDecimal))
       narquivoJSON += '"multa": {' //+ CRLF
       narquivoJSON += '"codigo_tipo_multa": "02",' //+ CRLF
    	narquivoJSON += '"quantidade_dias_multa": 1,' //+ CRLF
       narquivoJSON += '"percentual_multa": ' + '"' + _percentualmulta + '"' //+ CRLF
       narquivoJSON += '},' //+ CRLF
    endif
    
    if !empty(zfintaxajurosmensal)
       _percentualjuro  = "0"
    	_zfintaxajurosmensal = zfintaxajurosmensal
    	nPassainteiro = "S"
    	nInteiro = ""
    	nDecimal = ""
    	for ttqq = 1 to len(alltrim(str(_zfintaxajurosmensal)))
    	    if nPassainteiro = "S"
    		   if substr(alltrim(str(_zfintaxajurosmensal)),ttqq,1) != "."
    	          nInteiro = nInteiro + substr(alltrim(str(_zfintaxajurosmensal)),ttqq,1)
    		   else
    		      nPassainteiro = "N"
    		   endif
    	    else
    	       nDecimal = nDecimal + substr(alltrim(str(_zfintaxajurosmensal)),ttqq,1)
    	    endif
    	next
    	_percentualjuro  = replicate("0",7 - len(nInteiro)) + nInteiro + nDecimal + replicate("0",5 - len(nDecimal))
       narquivoJSON += '"juros": {' //+ CRLF
       narquivoJSON += '"codigo_tipo_juros": "90",' //+ CRLF
       narquivoJSON += '"quantidade_dias_juros": 1,' //+ CRLF
    	narquivoJSON += '"percentual_juros": ' + '"' + _percentualjuro + '"' //+ CRLF
       narquivoJSON += '},' //+ CRLF
    endif
    
    narquivoJSON += '"recebimento_divergente": {' //+ CRLF
    narquivoJSON += '"codigo_tipo_autorizacao": "01"' //+ CRLF
    narquivoJSON += '},' //+ CRLF
    narquivoJSON += '"desconto_expresso": false' //+ CRLF
    
    //narquivoJSON += '"protesto": {' //+ CRLF
    //narquivoJSON += '"protesto": 4,' //+ CRLF
    //narquivoJSON += '"quantidade_dias_protesto": 0' //+ CRLF
    //narquivoJSON += '},' //+ CRLF
    //narquivoJSON += '"negativacao": {' //+ CRLF
    //narquivoJSON += '"negativacao": 5,' //+ CRLF
    //narquivoJSON += '"quantidade_dias_negativacao": 0' //+ CRLF
    //narquivoJSON += '},' //+ CRLF
    
    narquivoJSON += '}' //+ CRLF
    narquivoJSON += '}' //+ CRLF
    narquivoJSON += '}' //+ CRLF
    
    lh := 00
    mdire = "jsonpuro" + ".txt"
    oPrn := TDosPrn():New(mdire)
    oPrn:StartPage()
    oPrn:lZeraBuffer:=.T.
    oPrn:Say(lh,000,narquivoJSON)
    oPrn:EndPage()
    oPrn:End()
    
    cSignatureValue = ""
    _nArquivo_enviar = "http://www.wsiscom.com.br/itau/envia_boleto.php?Client_certificado_crt=" + _Client_certificadocrt +;
                       "&Client_certificado_key=" + _Client_certificadokey +;
    					"&Cliente_Token="          + _nret_access_token +;
    					"&Client_ID_envia="        + _Client_ID +;
    					"&Cliente_Field="          + narquivoJSON
    
    lh := 00
    mdire = "jsonEnviaboleto" + ".txt"
    oPrn := TDosPrn():New(mdire)
    oPrn:StartPage()
    oPrn:lZeraBuffer:=.T.
    oPrn:Say(lh,000,_nArquivo_enviar)
    oPrn:EndPage()
    oPrn:End()
    
    try
       _oserver := CreateObject( "MSXML2.XMLHTTP" )
       _oserver:Open( "GET",_nArquivo_enviar, .F. )
       _oserver:SetRequestHeader("Content-Type","application/json")
       _oserver:Send(_nArquivo_enviar)
       WHILE _oserver:readyState != 4
             _oserver:WaitForResponse( 500 )
       end
    	cSignatureValue = _oserver:responseText
    catch
       msgstop("1 - Erro na geração do arquivo para o itau. www.wsiscom.com.br/itau/envia_boleto.php","Erro Atenção")
    	exit
    end
    if empty(cSignatureValue)
       msgstop("2 - Sem resposta do envia_boleto.php.","Erro Atenção")
       exit
    endif
    if cSignatureValue = nil
       msgstop("3- Sem resposta do envia_boleto.php.","Erro Atenção")
    	exit
    endif
    
    lh := 00
    mdire = "jsonpuro.html"
    oPrn := TDosPrn():New(mdire)
    oPrn:StartPage()
    oPrn:lZeraBuffer:=.T.
    oPrn:Say(lh,000,cSignatureValue)
    oPrn:EndPage()
    oPrn:End()
    
    _nxgravarnumeroPego = ""
    _nxgravarlinhadigitavel = ""
    
    //verifica_html := MemoRead("jsonpuro.html")
    
    nlocaliza_registro_1 := At( '[http_code] =>', cSignatureValue )
    if !empty(nlocaliza_registro_1)
       if substr(cSignatureValue,nlocaliza_registro_1,18) != "[http_code] => 200"
    		msgstop(substr(cSignatureValue,nlocaliza_registro_1,18),"Erro")
           exit
       endif							
    else
    	msgstop("Não foi possível localizar o retorno da inclusão do registro no banco Itaú","Atenção")
       exit
    endif
    
    nlocaliza_registro_1 := At( 'numero_nosso_numero', cSignatureValue )
    nlocaliza_registro_2 := At( 'dac_titulo', cSignatureValue )
    if !empty(nlocaliza_registro_1) .or. !empty(nlocaliza_registro_2)
       _ninc_X = substr(cSignatureValue,nlocaliza_registro_1,(nlocaliza_registro_2 - nlocaliza_registro_1))
       _nxgravarnumeroPego = ""
    	for ttqq = 1 to len(_ninc_X)
    	    if substr(_ninc_X,ttqq,1) = "0" .or. substr(_ninc_X,ttqq,1) = "1" .or. substr(_ninc_X,ttqq,1) = "2" .or.;
    		   substr(_ninc_X,ttqq,1) = "3" .or. substr(_ninc_X,ttqq,1) = "4" .or. substr(_ninc_X,ttqq,1) = "5" .or.;
    		   substr(_ninc_X,ttqq,1) = "6" .or. substr(_ninc_X,ttqq,1) = "7" .or. substr(_ninc_X,ttqq,1) = "8" .or.;
    		   substr(_ninc_X,ttqq,1) = "9"
    	       _nxgravarnumeroPego = _nxgravarnumeroPego + substr(_ninc_X,ttqq,1)
    		endif
    	next	
    else
    	msgstop("Não foi possível localizar o registro (linha digitavel) no retorno da inclusão do registro no banco ","Atenção")
       exit
    endif
    
    nlocaliza_registro_1 := At( 'numero_linha_digitavel', cSignatureValue )
    nlocaliza_registro_2 := At( 'data_limite_pagamento', cSignatureValue )
    if !empty(nlocaliza_registro_1) .or. !empty(nlocaliza_registro_2)
       _ninc_X = substr(cSignatureValue,nlocaliza_registro_1,(nlocaliza_registro_2 - nlocaliza_registro_1))
       _nxgravarlinhadigitavel = ""
    	for ttqq = 1 to len(_ninc_X)
    	    if substr(_ninc_X,ttqq,1) = "0" .or. substr(_ninc_X,ttqq,1) = "1" .or. substr(_ninc_X,ttqq,1) = "2" .or.;
    		   substr(_ninc_X,ttqq,1) = "3" .or. substr(_ninc_X,ttqq,1) = "4" .or. substr(_ninc_X,ttqq,1) = "5" .or.;
    		   substr(_ninc_X,ttqq,1) = "6" .or. substr(_ninc_X,ttqq,1) = "7" .or. substr(_ninc_X,ttqq,1) = "8" .or.;
    		   substr(_ninc_X,ttqq,1) = "9"
    	       _nxgravarlinhadigitavel = _nxgravarlinhadigitavel + substr(_ninc_X,ttqq,1)
    		endif
    	next
       _nxgravarlinhadigitavel = transform(_nxgravarlinhadigitavel,'@r 99999.99999  99999.999999  99999.999999  9  99999999999999')
    else
    	msgstop("Não foi possível localizar o registro (linha digitavel) no retorno da inclusão do registro no banco ","Atenção")
       exit
    endif


     

    EM PHP.. São 02 arquivos que criei e coloquei em meu FTP.. O que retorna o TOKEN e depois o que envia o boleto.

    PHP que retorna o TOKEN  (acess_token_itau.php)

    <?php
    $Client_ID_envia = $_GET['Client_ID_envia'];
    $Client_secret_envia = $_GET['Client_secret_envia'];
    $Client_certificado_crt = $_GET['Client_certificado_crt'];
    $Client_certificado_key = $_GET['Client_certificado_key'];
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://sts.itau.com.br/api/oauth/token");
    curl_setopt($ch, CURLOPT_PORT , 443);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_SSLCERT,$Client_certificado_crt);
    curl_setopt($ch, CURLOPT_SSLKEY,$Client_certificado_key);
    curl_setopt($ch, CURLOPT_CAINFO,$Client_certificado_crt);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, "grant_type=client_credentials&client_id=$Client_ID_envia&client_secret=$Client_secret_envia");
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    		"Content-Type: application/x-www-form-urlencoded",
    		"x-itau-correlationID: 2",
    		"x-itau-flowID: 1"
    	));
    $response = curl_exec($ch);
    $info =curl_errno($ch)>0 ? array("curl_error_".curl_errno($ch)=>curl_error($ch)) : curl_getinfo($ch);
    echo("<pre>");
    print_r($info);
    curl_close($ch);
    echo $response;
    echo("</pre>");
    ?>

    PHP QUE ENVIA O BOLETO (envia_boleto.php)

    <?php
    $Client_certificado_crt = $_GET['Client_certificado_crt'];
    $Client_certificado_key = $_GET['Client_certificado_key'];
    $Cliente_Token = $_GET['Cliente_Token'];
    $Client_ID_envia = $_GET['Client_ID_envia'];
    $Cliente_Field = $_GET['Cliente_Field'];
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://api.itau.com.br/cash_management/v2/boletos");
    curl_setopt($ch, CURLOPT_PORT , 443);
    curl_setopt($ch, CURLOPT_ENCODING,'');
    curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
    curl_setopt($ch, CURLOPT_TIMEOUT, 0);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_SSLCERT,$Client_certificado_crt);
    curl_setopt($ch, CURLOPT_SSLKEY,$Client_certificado_key);
    curl_setopt($ch, CURLOPT_CAINFO,$Client_certificado_crt);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, "$Cliente_Field");
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
            "Content-Type: application/json",
            "x-itau-apikey: $Client_ID_envia",
    	    "x-itau-correlationID: 2",
            "Authorization: Bearer $Cliente_Token"
    	));
    $response = curl_exec($ch);
    $info =curl_errno($ch)>0 ? array("curl_error_".curl_errno($ch)=>curl_error($ch)) : curl_getinfo($ch);
    echo("<pre>");
    print_r($info);
    curl_close($ch);
    echo $response;
    echo("</pre>");
    ?>


    Esses 02 arquivos em PHP, são chamados pelo meu sistema através do método GET.

    O desenvolvimento pra o Banco do Brasil é quase 95% idêntico ao do ITAÚ E DO SICOOB, os 02 são por developer's.

    Abraço.

  17. Bom dia,

    Alguém tem e poderia me  disponibilizar esta DLL (p05.dll), para usar com a (ALANCA PARA CAIXA 8217 TOLEDO 30 KG), para que eu possa receber o peso da balança. Estou solicitando aqui, pois é um pouco burocrático junto com a "TOLEDO", pois não disponibiliza no site, mas tem que fazer o pedido e estou um pouco sem tempo para aguardar o retorno.

    Obrigado.

    Meu contato: 
    adm@wsiscom.com.br
    WhatsApp: (34)99168-9254
    Wellington Vieira

×
×
  • Create New...