Wellington Vieira Posted December 21, 2022 Report Share Posted December 21, 2022 (edited) 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 Edited January 30, 2023 by Wellington Vieira RESOLVIDO Quote Link to comment Share on other sites More sharing options...
kapiaba Posted December 21, 2022 Report Share Posted December 21, 2022 Bom dia, veja se ajuda ahi: // USOINDEV.PRG - MODIFICADO POR: Joao Santos - kapiabafwh@gmail.com 21/12/2022 https:// www.oobj.com.br/bc/article/rejei%C3%A7%C3%A3o-656-consumo-indevido-como-resolver-4.html FUNCTION consulta_nfe_contra( objconsultatipo ) HB_GCALL( .F. ) 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 // PONHA UM DELAY AQUI PARA ATRASAR A CONSULTA E NAO DAR 656. WHILE nqte < 200000000 SYSREFRESH() // REFRESQUE O LOOPING // SYSWAIT( 6.5 ) // AQUI DELAY // OU: MsgWait( "AGUARDE, CONSULTANDO AS NOTA FISCAIS...", ; "AGUARDE UM MOMENTO POR FAVOR. DEMORA...", 6.5 ) 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 WHILE !lEof SYSREFRESH() // REFRESQUE O LOOPING SYSWAIT( .5 ) // AQUI DELAY 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 // 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 ) SYSREFRESH() // REFRESQUE O LOOPING 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 WHILE xmlNode != NIL SYSREFRESH() // REFRESQUE O LOOPING SYSWAIT( .5 ) // DELAY OU A GOSTO 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() HB_GCALL( .T. ) RETURN NIL // Rejeição Nfe: 656-Rejeição: Consumo indevido FUNCTION CONSUMO_INDEVIDO_ERRO_656() LOCAL cUsoIndev := ( "http://www.flexdocs.com.br/guiaNFe/WS.consultaStatus2G.html" ) MsgStop( "Rejeição Nfe: 656-Rejeição: Consumo indevido do Web Service. "+CRLF+ ; "Este problema é causado quando ocorre um grande volume "+CRLF+ ; "de consultas no servidor da SEFAZ em um período muito curto. "+CRLF+ ; "Neste momento a SEFAZ bloqueia as consultas, retornando a "+CRLF+ ; "Rejeição 656. Na NT 2012.003 (páginas 8 e 9), existem "+CRLF+ ; "informações sobre esta rejeição. Para a sua solução, basta "+CRLF+ ; "aguardar a liberação pela SEFAZ para a autorização das notas."+CRLF+ ; "Recomenda-se aguardar pelo menos 1 hora para a nova consulta."+CRLF+ ; "Se ainda assim retornar a mesma rejeição, será necessário "+CRLF+ ; "entrar em contato com a SEFAZ. "+CRLF+ ; "Verifique se a SEFAZ está operacional. Está Fora do AR? "+CRLF+ ; "Na tela principal da NFe, <Click> no Botão: <Portal da NFe> "+CRLF+ ; "Botão: <Testar a Conexão com o Web Service da Sefaz> "+CRLF+ ; "Se aparecer mensagem em VERMELHO, sefaz está com problemas. "+CRLF+ ; "Espere no minimo 01(uma) hora antes de tentar de novo. ", ; "Rejeição Nfe: 656-Rejeição: Consumo indevido do Web Service. " ) ShellExecute(GetActiveWindow(),"open",'"'+cUsoIndev+'"') RETURN NIL // FIN / END - kapiabafwh@gmail.com Regards, saludos. Quote Link to comment Share on other sites More sharing options...
Wellington Vieira Posted December 21, 2022 Author Report Share Posted December 21, 2022 Muito obrigado. Vou testar. Valeu !!! Quote Link to comment Share on other sites More sharing options...
lucimauromelo Posted December 21, 2022 Report Share Posted December 21, 2022 Esse caso de consumo indevido só resolve se a contabilidade remover o soft dela desta distribuição , não tem outra saída pelo que conheço. Quote Link to comment Share on other sites More sharing options...
kapiaba Posted December 22, 2022 Report Share Posted December 22, 2022 17 horas atrás, lucimauromelo disse: Esse caso de consumo indevido só resolve se a contabilidade remover o soft dela desta distribuição , não tem outra saída pelo que conheço. Mesmo com certificados digitais diferentes? Quote Link to comment Share on other sites More sharing options...
vilian Posted December 23, 2022 Report Share Posted December 23, 2022 Em 21/12/2022 at 20:02, lucimauromelo disse: Esse caso de consumo indevido só resolve se a contabilidade remover o soft dela desta distribuição , não tem outra saída pelo que conheço. Exatamente. Da forma como esse recurso foi implementado pela Receita Federal, é Impossível funcionar com 2 softwares acessando ao mesmo tempo. Um deles sempre vai está recebendo essa mensagem de "consumo indevido". No meu caso, resolvemos impedindo os contadores de fazer o download. O download é feito exclusivamente no nosso sistema e exportamos os arquivos baixados para os contadores. Quote Link to comment Share on other sites More sharing options...
lucimauromelo Posted December 25, 2022 Report Share Posted December 25, 2022 Também faço assim quando o cliente usa a distribuição, me certifico que o contador não use outro app pra essa mesmo finalidade. Quote Link to comment Share on other sites More sharing options...
Wellington Vieira Posted January 2, 2023 Author Report Share Posted January 2, 2023 É REALMENTE SOMENTE A APLICAÇÃO USAR A DISTRIBUIÇÃO, SE OUTRO SOFTWARE, APP USAR A DISTRIBUIÇÃO, DÁ O ERRO DE" CONSUMO INDEVIDO". Quote Link to comment Share on other sites More sharing options...
Wellington Vieira Posted January 30, 2023 Author Report Share Posted January 30, 2023 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. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.