-
Posts
424 -
Joined
-
Last visited
-
Days Won
10
Everything posted by Wellington Vieira
-
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.
-
Calcular quantos minutos o item foi lançado na comanda/pedido
Wellington Vieira replied to marcioe's topic in Programação
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; -
Calcular quantos minutos o item foi lançado na comanda/pedido
Wellington Vieira replied to marcioe's topic in Programação
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. -
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
-
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); ?>
-
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.
-
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.
-
https://developers.mercadolivre.com.br/pt_br/publicacao-de-produtos#
-
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.
-
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
-
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") )
-
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.
-
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.
-
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.
-
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
-
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.
-
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
-
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()
-
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.
-
DLL BALANÇA TOLEDO ( P05.DLL )
Wellington Vieira replied to Wellington Vieira's topic in Programação
Muitíssimo obrigado. -
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
-
Obrigado Kapiaba. Vou testar, e retorno com o resultado. Abraço