Página 2 de 6
Uso da classesefaz
Enviado: 12 Ago 2016 19:10
por JoséQuintas
Autorizei nota hoje, com a rotina acima.
Parece piada, mas minha rotina estava errada.
Código: Selecionar todos
IF oSefaz:cStatus == "101"
hb_MemoWrit( "NFE\NF" + jpnota->nfNotFis + "-06-Autorizado.xml", oSefaz:cXmlAutorizado )
RUN ( "start d:\unidanfe\unidanfe.exe NFE\NF" + jpnota->nfNotFis + "-06-Autorizado.xml" )
Pois é... errei na parte mais simples.... rs
Mas foi só olhar o XML de protocolo .
Aquele gravado como NFE\TMP\NF000094246-05-Protocolo.xml
É exatamente a resposta da Fazenda.
Classe errada?
Não.
Eu é que errei... rs
Nota autorizada é status 100, e não 101.
É o que dá fazer de cabeça, sem conferir manual.... rs
Nota:
Os temporários acabam sendo interessantes nessa situação, quando algo dá errado.
O autorizado oficial estava gerado (a rotina acima também gravou).
Foi só a checagem do status que errei mesmo, e apresentei a mensagem que não tinha sido autorizada.... rs
Uso da classesefaz
Enviado: 12 Ago 2016 19:15
por JoséQuintas
Aproveitando...
A nota autorizada não é nada mais além da nota enviada, junto com o protocolo que está nessa resposta.
Só somar as strings: "<infNFe ...>" + nota enviada + protocolo + "</infNFe>"
A coisa toda é simples assim.
A complicação dos componentes pra NFe é converter TXT, converter INI, "conversar" com seu aplicativo, etc.
A classe apenas envia, pega resposta, nada extraordinário, e tudo através de strings diretas, sem arquivo intermediário.
A gravação de temporário, se quiser, é boa pra conferência.
Uso da classesefaz
Enviado: 16 Ago 2016 16:42
por JoséQuintas
A rotina atualizada:
Código: Selecionar todos
#include "jpa.ch"
FUNCTION P0600NFE()
LOCAL nSelect, cNfeTxt, cNfeXml, oSefaz := SefazClass():New(), cStatusAssinatura, cComando
MEMVAR m_Prog
PRIVATE m_Prog := "P0600NFE"
DirMake( "NFE\TMP" )
nSelect := Select()
IF .NOT. Encontra( jppedi->pdPedido, "jpnota", "pedido" )
MsgStop( "Inválido! Não tem nota emitida para esse pedido" )
RETURN .F.
ENDIF
IF jpnota->nfDatEmi != Date()
MsgStop( "Inválido! Nota fiscal não foi emitida hoje" )
RETURN .F.
ENDIF
IF jpnota->nfStatus == "C"
MsgStop( "Inválido! Nota fiscal cancelada, não há o que fazer" )
RETURN .F.
ENDIF
IF jpnota->nfPedido != jppedi->pdPedido
MsgStop( "Erro interno! Posicionado em NF diferente do pedido atual" )
RETURN .F.
ENDIF
Mensagem( "Autorizando nota" )
NFDbfToXml( @cNfeTxt, @cNfeXml, "1", Date(), Time(), , "1" )
cStatusAssinatura := AssinaXml( @cNfeXml, AppEmpresaApelido() )
IF cStatusAssinatura != "OK"
hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-01-SemAssinatura.xml", cNfeXml )
hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-02-Assinado.xml", cNfeXml )
MsgExclamation( "Problema na assinatura " + cStatusAssinatura )
RETURN .F.
ENDIF
oSefaz:cCertificado := NomeCertificado( AppEmpresaApelido() )
oSefaz:cAmbiente := "1"
oSefaz:NfeLoteEnvia( cNfeXml )
IF oSefaz:cStatus $ "100,101,202,302"
hb_MemoWrit( hb_cwd() + "IMPORTA\" + jpnota->nfNotFis + "-" + oSefaz:cStatus + "-Autorizado.xml", oSefaz:cXmlAutorizado )
hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-" + oSefaz:cStatus + "-Autorizado.xml", oSefaz:cXmlAutorizado )
cComando := [arquivo="] + hb_cwd() + [NFE\TMP\] + jpnota->nfNotFis + [-] + oSefaz:cStatus + [-Autorizado.xml"]
IF File( "d:\unidanfe\" + SoNumeros( jpempre->emCnpj ) + ".jpg" )
cComando += [ logotipo="d:\unidanfe\] + SoNumeros( jpempre->emCnpj ) + [.jpg"]
ENDIF
cComando += [ visualizar=1]
wapi_ShellExecute( NIL, NIL, "d:\unidanfe\unidanfe.exe", cComando, SW_SHOWNORMAL )
MsgExclamation( iif( oSefaz:cStatus == "100", "Nota autorizada", "Nota Denegada" ) )
ELSE
hb_MemoWrit( hb_cwd() + "NFE\" + jpnota->nfNotFis + ".txt", cNfeTxt )
hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-01-SemAssinatura.xml", cNfeXml )
hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-02-Assinado.xml", cNfeXml )
hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-03-Envelope.xml", oSefaz:cXmlSoap )
hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-04-Recibo.xml", oSefaz:cXmlRecibo )
hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-05-Protocolo.xml", oSefaz:cXmlProtocolo )
hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-06-Erro.xml", oSefaz:cXmlRetorno )
hb_MemoWrit( hb_cwd() + "NFE\TMP\" + jpnota->nfNotFis + "-07-Autorizado.xml", oSefaz:cXmlAutorizado )
MsgExclamation( "Erro desconhecido " + Pad( oSefaz:cXmlProtocolo, 1000 ) )
ENDIF
SELECT ( nSelect )
RETURN NIL
Por enquanto acertando a impressora padrão pro Unidanfe (não havia nenhuma instalada e o unidanfe reclamou)
E surgiu outra necessidade:
Pelo emissor da Fazenda, eram gerados XMLs e PDFs pra envio ao armazém externo, pra separação e posterior retirada de mercadoria.
Com o detalhe de que o emissor gera um PDF único contendo todas as notas.
Por enquanto ainda resolvendo a impressora padrão.
Uso da classesefaz
Enviado: 24 Ago 2016 15:24
por gu_bf
Boa tarde,
Desculpe pela demora em responder mas, conformado o funcionamento da rotina de validação.
Comecei a testar cancelamento da NFe que no momento é que mais me importa então, encontrei um pequeno problema no código, mais especificamente
no method NFeEventoCancela na linha 561 tem a notação ( versão "1.00" ) que alterei para ( versao="1.00" ) e na linha 562
que está assim a declaração do id ( Id="ID110111" ) e eu alterei para ( Id="ID110111] ). Depois disso esse method passou sem problema, agora
está dando um erro na assinatura que estou verificando. Na imagem em anexo é ilustrado o problema que encontrei ate agora.
Obrigado
Gustavo
Uso da classesefaz
Enviado: 24 Ago 2016 15:48
por gu_bf
Depois de regularizado o erro acima, o processo de cancelamento de NFe foi concluído sem maiores problemas como pode perceber pela imagem em anexo de consulta no SEFAZ SP.
e continuam os testes mas já está funcional pelo menos na base que preciso.
Obrigado.
Gustavo,
Uso da classesefaz
Enviado: 24 Ago 2016 16:19
por JoséQuintas
Valeu.
Me confundi um pouco na hora de entender o post, mas confirmei e corrigi.
No primeiro faltou o sinal de igual.
E no segundo, era pra fechar com colchete, e estava fechado com aspas.
Não deu erro de compilação, porque o compilador considerou string tudo até o próximo fecha colchete.
E isso causou erro de assinatura, porque a assinatura usa o ID do documento que estava errado.
Uso da classesefaz
Enviado: 24 Ago 2016 19:17
por gu_bf
Boa noite
Eu não sei se é mais viável, mas, se for possível declarar a função FUNCTION MsgExclamation( cText ) do modulo ze_xmlfun.prg como STATIC, para não conflitar
como no meu caso a MINIGUI, está ai a sugestão.
Muito obrigado
Gustavo.
Uso da classesefaz
Enviado: 24 Ago 2016 19:58
por JoséQuintas
Melhor ainda, eliminar de vez.
É usada num exemplo que está embutido na rotina de validação.
Deixar o exemplo comentado.
Pode ser substituída por qualquer rotina que mostre o resultado na tela
Assim não prende a recursos de tela, que variam conforme console/LIB gráfica.
Inclusive o Inkey(0) foi pra poder entrar no debug, e esqueci de retirar... rs
Uso da classesefaz
Enviado: 25 Ago 2016 08:13
por gu_bf
Bom dia
Acho que está faltando algum aquivo .ch
---------------------------
Program Error
---------------------------
Error BASE/1003 Vari vel nÆo existe: DOW_DOMINGO
Called from HORARIOVERAOINICIO(153)
Called from DATETIMEXML(109)
Called from (b)SEFAZCLASS(111)
Obrigado
Gustavo.
Uso da classesefaz
Enviado: 25 Ago 2016 08:25
por gu_bf
Ops
Ignore meu post anterior, acabei de atualizar a LIB e vi que ja está declarado a variavel.
Obrigado.
Uso da classesefaz
Enviado: 26 Ago 2016 15:35
por malcarli
Boa tarde, estou iniciando, não encontrei esta rotina NFDbfToXml( @cNfeTxt, @cNfeXml, "1", Date(), Time(), , "1" ). Poderia informar onde? obrigado
Uso da classesefaz
Enviado: 26 Ago 2016 19:13
por gu_bf
Boa noite Quintas,
Estou com problema estranho. Com sistema pronto e funcionando na minha maquina, resolvi fazer um teste com certificado de outra empresa e no micro
deles.
O problema ocorre no momento da assinatura do XML, que devolve o erro ( Erro: Problemas pra assinar XML ) que é a descrição padrão, como se não
tivesse passado em nenhum filtro e o arquivo não está assinado.
Refiz o teste com certificado que estava usando até agora e não da erro nenhum, o processo valida sem qualquer problema.
A única diferença além das informações cadastrais da empresa são os certificados, ambos A3 dentro da validade e de emissão de empresas diferentes.
como imagem em anexo.
O que apresenta problema e de emissão da AC SINCOR RFB G4.
Poderia me dar alguma dica?
Obrigado
Gustavo.
Uso da classesefaz
Enviado: 27 Ago 2016 06:54
por gilbertosilverio
Ola Gustavo,
Tive um problema parecido com o seu, em minha maquina os dois certificados funcionavam, mais quando instalei no servidor, um dos certificados dava erro na assinatura da NFe, usando o UNINFE.
Para resolver, desinstalei os certificados e todos os componentes dos tokens, baixei os instaladores de cada certificado, fornecidos pela própria autorizadora, no meu caso CERTISING e SERASA, e os dois certificados funcionaram perfeitamente, não dando mais erro de assinatura.
Creio que este teu erro e devido a falta de alguma cadeia de certificados da autorizadora.
Uso da classesefaz
Enviado: 27 Ago 2016 12:12
por gu_bf
Ola Gilberto, obrigado pela dica.
Deixa eu relatar aqui o que aconteceu pois se alguém tiver algum problema similar não caia nesse meu erro idiota.
Eu tenho um script .BAT que registra as dlls de uso com capicom e esse script executa o registro no modo silencioso com /S, então a mensagem de erro
de que não foi possível registrar as DLLs não apareciam e para mim estava tudo normal.
Removi esse parâmetro do regsvr32.exe fiz o registro com ADMINISTRADOR e beleza.
Viu que bobeira que minha?!?!? levei 2 dias para descobrir, pensei que estivesse no codigo que escrevi, então fiquem esperto com esse tipo de rotina para não marcar dessa maneira.
Muito obrigado.
Gustavo.
Uso da classesefaz
Enviado: 26 Set 2016 11:35
por malcarli
Bom dia José, por acaso teria algum exemplo básico de como gerar xml, usando a classe ze_spedxmlClass.prg.
obrigado