Jump to content
Fivewin Brasil

Wellington Vieira

Membros
  • Posts

    424
  • Joined

  • Last visited

  • Days Won

    10

Everything 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. https://developers.mercadolivre.com.br/pt_br/publicacao-de-produtos#
  9. OBSERVAÇÃO.. NA CRIAÇÃO DO APLICATIVO NA PLATAFORMA, VOCÊ PODERÁ MARCAR A OPÇÃO "PIX", ALÉM DO BOLETO BANCÁRIO E UTILIZAR O ENVIO DO PIX VIA SISTEMA E AGUARDAR O RECEBIMENTO NA TELA DO SEU PDV.
  10. 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
  11. 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. 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") )
  12. 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.
  13. 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.
  14. 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. 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. 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.
  15. No link abaixo tem um vídeo de como ficou simples a emissão de NF-e, usando os parâmetros acima. https://www.linkedin.com/posts/wsiscom-software-775b5ab4_veja-como-é-fácil-emitir-um-pedido-uma-nf-e-activity-6948603659240759296-Cn6S/?utm_source=share&utm_medium=member_desktop
  16. 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.
  17. É REALMENTE SOMENTE A APLICAÇÃO USAR A DISTRIBUIÇÃO, SE OUTRO SOFTWARE, APP USAR A DISTRIBUIÇÃO, DÁ O ERRO DE" CONSUMO INDEVIDO".
  18. 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
  19. 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()
  20. 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 FIVEWIN 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.
  21. 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
  22. Obrigado Kapiaba. Vou testar, e retorno com o resultado. Abraço
×
×
  • Create New...