Clipper On Line • Ver Tópico - ACBr LIB
Página 1 de 3

ACBr LIB

MensagemEnviado: 18 Out 2019 11:30
por MSDN
O ACBr foi o pioneiro na questão de entregar a possibilidade de lidar com documentos fiscais eletrônicos em qualquer linguagem, mas se vc não usava Delphi ou Lazarus, tinha que usar o Monitor, que eu nunca simpatizei muito, porém, agora eles evoluíram, e vamos poder utilizar todo o potencial do ACBr através de DLL, dessa forma não vejo solução melhor que essa, visto a qualidade e extensão do projeto, além do principal, ter um suporte técnico a atualizações.
Segue link : https://www.projetoacbr.com.br/forum/topic/53508-lan%C3%A7amento-da-acbrlib/

ACBr LIB

MensagemEnviado: 20 Out 2019 23:24
por sygecom
Parece bem promissor mesmo, no começo usei o AcbrMonitor, agora não mais.

Com tempo vou estudar se vale a pena integrar com a DLL.

ACBr LIB

MensagemEnviado: 21 Out 2019 11:01
por Nascimento
MSDN escreveu : visto a qualidade e extensão do projeto, além do principal, ter um suporte técnico a atualizações


o bom que mais ainda tem vários exemplos de integração, um bom manual de uso explicando o uso das funções, changelog e
com muitas parcerias para atualizações, em fim
*
temos a classe do nosso amigo Quintas muito boa por sinal
mais no meu ponto de vista uma critica construtiva
*
não tem um changelog para verificar-nos as atualizações/alterações quando há alguma alteração temos que ler quase a classe inteira para entender-mos
há funções que podem até existir mais não sabemos
sei que sozinho é enorme o trabalho que ele faz
mais se ele "no meu ponto de vista" buscasse parcerias
para documentar as funções, pequenos exemplos de integração, envio por lote en fins
o quintas é o pai da criança e conhece sua classe muito bem "óbvio", mais nós meros mortais
ou lê a classe quase inteira ou uma boa parte, ou ir de post a post lendo , o que não é muito facil pois tem vários post

Ao meu ver a classe do nosso amigo quintas tem tudo para ser o Padrão harbour, mais ele sozinho torna-se o trabalho muito árduo , no que ele esta de Parabéns pela iniciativa
mais como diz o velho deitado "uma andorinha só não faz verão" até ja comentei isso aqui no forum, um passo bom seria democratizar, ver parceiros para documentar, criar exemplos
em fim
*
converso com alguns amigos aqui , que até tentaram usar a classe do amigo quintas, até chegaram a usar, mais devido a algumas coisas que ou faltavam , ou não achavam voltaram pra o acbr monitor , que tem horas que da uma dor de cabeça , mais como se diz, "quando não tem tu, vai tu mesmo" , en fim , tudo que citei é meu ponto de vista
abraços a todos..

ACBr LIB

MensagemEnviado: 21 Out 2019 12:20
por JoséQuintas
Nascimento escreveu:converso com alguns amigos aqui , que até tentaram usar a classe do amigo quintas, até chegaram a usar, mais devido a algumas coisas que ou faltavam , ou não achavam voltaram pra o acbr monitor , que tem horas que da uma dor de cabeça , mais como se diz, "quando não tem tu, vai tu mesmo" , en fim , tudo que citei é meu ponto de vista


Com certeza, o ACBR tem usuários do Brasil inteiro, que pegam todo tipo de variação que pode existir, principalmente com fiscalização entre UFs.
E também deve ter nota de serviço, que muitos devem precisar.

Na sefazclass:

O problema maior é quando usa XHarbour, para usar o CreateObject().
Eu não uso XHarbour, não tenho que aprender a fazer isso no XHarbour.
O usuário é que precisa saber qual o equivalente pra isso.

Mas de um modo geral, tá simples.

Considerei auto-explicativo, e sem necessidade de manual.
E o teste.prg tem tudo.

Quem tá acostumado com ACBR acha complicado... porque tá simples demais.

autorizar uma nota, considerando que não há problema nenhum:

oSefaz := SefazClass():New()
hb_MemoWrit( "autorizado.xml", oSefaz:NfeLoteEnvia( cXml, cLote, cUF, cCertificado, cAmbiente ) )


pronto, tá feito.

Manual: enviar lote é no método NfeLoteEnvia(), enviar carta é no NfeEventoCarta(), etc. etc.
É só associar o nome do que se quer, ao nome que já existe.
Os parâmetros... estão lá junto ao nome.

Sobre o log de alterações: Estamos falando de GITHUB

Tem lá o link commits

sefaz1.png


que mostra as alterações

sefaz2.png


e podemos ver até o detalhe de cada alteração

sefaz3.png


exemplos:

sefaz4.png


No exemplo, procurei simplificar pra não ficar fonte extenso, tem esta parte padrão pra tudo, definindo o "ambiente" ao invés de passar por parâmetro:
      oSefaz := SefazClass():New()
      oSefaz:cUF          := aVarList[ VAR_UF ]
      oSefaz:cVersao      := aVarList[ VAR_VERSAO ]
      oSefaz:cCertificado := aVarList[ VAR_CERTIFICADO ]
      oSefaz:cAmbiente    := aVarList[ VAR_AMBIENTE ]
      oSefaz:cNFCE        := aVarList[ VAR_NFCE ]


e esta parte de envio, com um XML fake - apenas o XML menor possível que pode ser transmitido

      CASE nOpc == OPC_ENVIO_TESTE
         oSefaz:NfeLoteEnvia( [<NFe><infNFe Id="Nfe0001"></infNFe></NFe>] )
         ? oSefaz:cXmlRetorno
         Inkey(0)


ou outra escolhendo do disco, pra transmitir NFE, CTE ou MDFE.

      CASE nOpc == OPC_ENVIO_USUARIO
         cXml := MemoRead( win_GetOpenFileName(, "Arquivo a transmitir", ".\", "XML", "*.XML", 1 ) )
         DO CASE
         CASE "<infMDFe" $ cXml ; ? "autorizando CTE"; oSefaz:cVersao  := "3.00"; oSefaz:CteLoteEnvia( cXml )
         CASE "<infCTe"  $ cXml ; ? "autorizando MDFE"; oSefaz:cVersao := "3.00"; oSefaz:MDFeLoteEnvia( cXml )
         CASE "<infNFe"  $ cXml ; ? "autorizando NFE"; oSefaz:NfeLoteEnvia( cXml )
         OTHERWISE              ; ? "Documento não reconhecido"
         ENDCASE
         ? oSefaz:cXmlRetorno
         hb_MemoWrit( "testeassinado.xml", oSefaz:cXmlDocumento )
         hb_MemoWrit( "testeautorizado.xml", oSefaz:cXmlAutorizado )
         Inkey(0)


Como já repeti várias vezes, o problema maior não é a parte da Fazenda, é criar o XML com todos os detalhes.
Pra isso, é o manual da Fazenda, ou até mesmo uma nota já autorizada como modelo.

ACBr LIB

MensagemEnviado: 21 Out 2019 12:51
por MSDN
Como já repeti várias vezes, o problema maior não é a parte da Fazenda, é criar o XML com todos os detalhes.
Pra isso, é o manual da Fazenda, ou até mesmo uma nota já autorizada como modelo.


Concordo plenamente, quando eu não tinha conhecimento nenhum em NFC-e e NF-e, a coisa mais fácil de acontecer é misturar uma com a outra ( modelo 55 ) com ( modelo 65 ), ou achar que o mais dificil é a parte de enviar e receber para a SEFAZ, por isso que tem tanta empresa ganhando toneladas de dinheiro por ai, claro que existem algumas poucas que realmente criam o XML, mas são a minoria, no mais, seria aquela velha máxima, de a pessoa não conhecer algo que precisa usar e não se interessar em procurar saber como funciona, para ver que é simples.

ACBr LIB

MensagemEnviado: 21 Out 2019 14:21
por JoséQuintas
Apenas como exemplo...

no xml é

<empresa>nome da empresa</empresa>

no ini é:

empresa=nome da empresa

no txt é:

02|nome da empresa|

Não é essa parte que é complicada, isso qualquer um faz fácil.

O complicado é... se a nota usa CST 60, ou CST 00, ou CST 10.... etc.
Ou quando é CST 60 manda poucas informações, mas CST 00 manda com base de cálculo, percentual, imposto, etc.

Às vezes o componente ajusta automático os erros nesse sentido, mas automático não significa certo, significa apenas que a nota vai estar preenchida pra ser autorizada, que pode ou não estar de acordo com a lei.
Exemplo: era pra colocar base de cálculo 100.00, imposto 5%, e valor 5.00...
Se o componente colocar zero em tudo, pode até ser autorizado porque os campos estão preenchidos, mas vai estar errado.
Também pode ser um erro simples: era pra colocar com 2 decimais, e mandando por INI ou TXT o componente faz o ajuste, mas por XML não faz.

Às vezes o usuário está com problemas nessa parte, e acha que o componente vai resolver tudo sozinho.
Ou acaba nem sabendo o que tava fazendo errado.

Mas voltando ao ACBR....
Por DLL vai ser muito mais fácil, porque deve acabar com a necessidade de arquivo em disco, igual a sefaz.
E se eles colocaram a parte de comunicação e assinatura junto, usando libcurl e openssl, pode dispensar o uso "pirata" de MSXML5.
Não vai aceitar certificado A3, mas acho que isso não chega a ser problema.

ACBr LIB

MensagemEnviado: 21 Out 2019 14:25
por JoséQuintas
Detalhe importante:

acbrlib.png


Provavelmente depois só pagando.

ACBr LIB

MensagemEnviado: 21 Out 2019 21:14
por Jairo Maia
JoséQuintas escreveu:Provavelmente depois só pagando.
A versão compilada sim. É como o executável, que é atualizado a cada 3 meses, ou quando tem alteração muito importante. O código será aberto também, pode baixar os fontes e compilar.

Para os assinantes do SAC, o executável é compilado a cada semana (ou antes) se houver atualização.

ACBr LIB

MensagemEnviado: 21 Out 2019 21:20
por MSDN
https://www.projetoacbr.com.br/

Vale muito a pena, e lembrando que o programador que iniciou o ACBr, o Daniel Simões, era Clippeiro que depois foi para o xHarbour e em seguida iniciou o projeto em Pascal.

ACBr LIB

MensagemEnviado: 22 Out 2019 18:08
por fladimir
No SVN já tem acesso as classes criadas pra Harbour pra Boleto, SAT e NFe/NFCe

ACBr LIB

MensagemEnviado: 22 Out 2019 19:33
por JoséQuintas
fladimir escreveu:No SVN já tem acesso as classes criadas pra Harbour pra Boleto, SAT e NFe/NFCe


Pois é... tá aí...
Se tem até boleto, vão acabar usando o ACBR pra isso.
E se usar o ACBR pra uma coisa, nada impede de usar pra tudo.

Tomara que não fique dependendo de arquivo em disco, senão perde a vantagem de ser DLL.

ACBr LIB

MensagemEnviado: 22 Out 2019 20:15
por JoséQuintas
Vixe... continua dependendo de disco.

Attribute VB_Name = "ACBrNFeUtils"
Option Explicit

Public Function CreateNFe(Optional ByVal eArqConfig As String = "", _
                           Optional ByVal eChaveCrypt As String = "") As ACBrNFe
    Dim nfe As ACBrNFe
    Set nfe = New ACBrNFe
   
    nfe.InicializarLib eArqConfig, eChaveCrypt
    Set CreateNFe = nfe
End Function


Um dos parâmetros é nome de arquivo.

E pelo jeito, no VB6, fica integrado com "manual" na IDE.

Não achei a DLL pra download.
No VB6 ela deve ficar instantânea pra entender como usar.

ACBr LIB

MensagemEnviado: 22 Out 2019 20:44
por JoséQuintas
Detalhe sobre isso:

Quando se fala de arquivo XML pra mandar pra Fazenda... não significa que é enviado o arquivo, que precisa existir no disco.

cXml := "<nota>xxxx</nota>"
oSefaz:NfeLoteEnvia( cXml )


do jeito que fizeram a DLL, vai ter que ser assim: (apenas exemplo)

cXml := "<nota>xxxx</nota>"
hb_MemoWrit( "arquivo.xml", cXml )
ACBR.SendArquivo( "arquivo.xml" )


Se for só mudança pra DLL, sem modificar o comportamento interno... não vai estar no potencial máximo que poderia ser.

ACBr LIB

MensagemEnviado: 22 Out 2019 21:21
por Fernando queiroz
Uso a SEFAZCLASS , inclusive já fiz alterações nela para ajustes junto com o Quintas, hoje acho super simples usar,
o lance é saber criar os XML na unha, de resto fica super simples, não usa arquivo em disco , gero diretamente na memoria, se estiver tudo ok
ai sim gravo o retorno com a autorização em disco, gero o PDF diretamente do XML em memoria.

:)) :)) :))

ACBr LIB

MensagemEnviado: 22 Out 2019 21:24
por sygecom
Nesse projeto da ACBR LIB, me interessou foi a parte de boleto de cobrança, acredito que já tem bastante banco e carteiras.

ACBr LIB

MensagemEnviado: 22 Out 2019 21:52
por Nascimento
"Fernando queiroz" escreveu :Uso a SEFAZCLASS , inclusive já fiz alterações nela para ajustes junto com o Quintas, hoje acho super simples usar


isso é ótimo , é admirável o trabalho do nosso amigo Quintas isso é inquestionável, eu até tentei usa-la até porque sou um defensor ferrenho do harbour/clipper
enquanto alguns amigos falam de migrar eu penso vou migrar porque se o harbour até agora vem suprindo minhas necessidades?
mais eu tentei, usar a sefazclass, como não consegui usala satisfatoriamente, voltei ao acbr, que não é essas maravilhas o monitor, mais ta funcionando
*
me anima mais um pouco o amigo fernando falando sobre, da mais ênfase de eu tentar novamente a usar ela!, que pra mim seria o ideal, não depender se soft de terceiros
usar uma ferramenta que eu conheço, "não tão bem quanto o amigo Quintas " que eu fico meio perdido nas classes e Methodos, mais ainda arranho rsrs
*
outro tempo eu até falei de juntar as forças, para ideias implementações duvidas sobre a sefazclass, porque as vezes é como falei anteriormente, tem a função mais o programador
não sabe que tem mais em fim , vou olhar alguns post´s , ver se acho aqui no fórum alguns exemplos práticos da sefazclass, e vamos que vamos!
*
se for possível o amigo Fernando queiroz postar alguns exemplos práticos de uso , seria muito enriquecedor para este fórum

ACBr LIB

MensagemEnviado: 22 Out 2019 22:24
por JoséQuintas
Nascimento escreveu:se for possível o amigo Fernando queiroz postar alguns exemplos práticos de uso , seria muito enriquecedor para este fórum


Quer testar, vamos lá um passo a passo rápido:

Na pasta de DLLs vém capicom.dll e msxml5.dll
- instale as DLLs
- instale o certificado
Compile o test.exe, e faça os testes, sem precisar nem mexer em programa nenhum.
Deu certo... aí olha as rotinas e faz igual no seu aplicativo.

Acho o melhor ponto de partida, assim começa confirmando se o ambiente está ok, e só depois mexe com programação.

Importante no teste: a primeira coisa é selecionar o certificado, que é base pra todo restante

ACBr LIB

MensagemEnviado: 23 Out 2019 01:36
por fladimir
No SVN já tem as classes em Harbour pra uso com a DLL

As classes q tem em Harbour são pra Boleto, NFE/NFCe e SAT

Com relação a bancos e carteiras já tem vários e o q é interessante é q mudei do CobrebemX para o ACBr a cerca de 1 ano e meio e qdo eu comecei no ACBr com bancos só tinha uns 6, agora da uma olhada

BancoDoBrasil
Santander
CaixaEconomica|
CaixaSicob|
Bradesco|
Itau|
BancoMercantil|
Sicred|
Bancoob|
Banrisul|
Banestes|
HSBC|
BancoDoNordeste|
BRB|
BicBanco|
BradescoSICOOB|
BancoSafra|
SafraBradesco|
BancoCECRED|
BancoDaAmazonia|
BancoDoBrasilSICOOB

Acredito q por ser um projeto aberto cresce vertiginosamente, o q é bom pra todos.

ACBr LIB

MensagemEnviado: 12 Nov 2019 11:38
por rubens
Bom dia..

Alguém tem um exemplo de uso prático com a ACBRLIB?
tipo imprimir uma NFE? já seria um começo..
lá no ACBR tem uns exemplos em harbour mas ainda é muito vago...
o ideal seria um tutorialzinho...

obg..

Rubens

ACBr LIB

MensagemEnviado: 12 Nov 2019 15:04
por Fernando queiroz
SEGUE exemplo de uso da SEFAZCLASS , partindo do principio que o XML esta tudo OK

***************************************************************************************
* MODULO DE ASSINATURA , TRANSMISSAO, AUTORIZACAO, RETORNO E IMPRESSAO
***************************************************************************************
      ThisNFE:oProgressbar1:Set(,60)
      ThisNFE:oLabel5:SetText("Assinando NF-e                                                    ")
********* ASSINATURA VIA SEFAZCLASS **********************************************************************************************************

      SELE CERTIFICADO
      IF !DBSEEK(rtrim(hwg_GetComputerName()))
         hwg_MsgInfo("Computador sem o CERTIFICADO DIGITAL instalado"+ HB_EOL()+"A Operação não poderá ser efetuada")
         SELE NOTAFE
         ThisNFE:oOwnerbutton4:DISABLE()
         RETURN NIL
      endif
      
      SELE NOTAFE

      cTxtXml:=M->cXml      
      oSefaz              := SefazClass():New()
      oSefaz:cUF          := FLAG->n_xUF
      oSefaz:cAmbiente    := FLAG->n_tpAmb      
      oSefaz:cCertificado := TRIM(CERTIFICADO->NOMCERT)
//      oSefaz:cVersao      := '3.10'
      ThisNFE:oProgressbar1:Set(,80)
      ThisNFE:oLabel5:SetText("Aguardando Retorno                                                ")

**********************************************************************************************************************************************   
        IF hlusuario( ) # "DEMONTRACAO"                                     
         oSefaz:NFEloteenvia( cTxtXml )
      ENDIF
      IF RDDSETDEFAULT() == "LETO"
         Leto_MemoWrite( cPrefixo + ".xml", oSefaz:cXmlDocumento )   
      ELSE
         hb_MemoWrit( cPrefixo + ".xml", oSefaz:cXmlDocumento )   
      ENDIF
      
//      hb_MemoWrit( cPrefixo + "_1_documento.xml", oSefaz:cXmlDocumento )
//      hb_MemoWrit( cPrefixo + "_2_Envio.xml", oSefaz:cXmlEnvio )
//      hb_MemoWrit( cPrefixo + "_3_Soap.xml", oSefaz:cXmlSoap  )
//      hb_MemoWrit( cPrefixo + "_4_Retorno.xml", oSefaz:cXmlRetorno  )
//      hb_MemoWrit( cPrefixo + "_5_Protocolo.xml", oSefaz:cXmlProtocolo   )
//      hb_MemoWrit( cPrefixo + "_6_Recibo.xml", oSefaz:cXmlRecibo  )
//      hb_MemoWrit( cPrefixo + "_7_Autorizado.xml", oSefaz:cXmlAutorizado )
//      hwg_MsgInfo( "Status: " + oSefaz:cStatus + hb_Eol() + oSefaz:cMotivo )

      IF ! oSefaz:cStatus $ "100,101,150,301,302"
         ThisNFE:oLabel5:SetText(oSefaz:cMotivo)
         hwg_MsgInfo(oSefaz:cStatus + oSefaz:cMotivo)
         
      ELSE
         ThisNFE:oLabel5:SetText(oSefaz:cStatus + oSefaz:cMotivo)
         SELE NOTAFE
         IF RLOCK()
            NOTAFE->FL_SITUAC := XmlNode(oSefaz:cXmlRetorno, "cStat")
            NOTAFE->FL_MOTIVO := XmlNode(oSefaz:cXmlRetorno, "xMotivo")
            NOTAFE->b_dhEmi     := XmlNode(M->cXml, "dhEmi")
            DBUNLOCK()
         ENDIF
         ThisNFE:oProgressbar1:Set(,90)
         ThisNFE:oLabel5:SetText("Gerando DANFE em PDF                                              ")   
          oSpedDa := hbNfeDaGeral():New()
         IF RDDSETDEFAULT() == "LETO"
            Leto_MemoWrite( cPrefixo + ".xml", oSefaz:cXmlAutorizado )
            oSpedDa:ToPdf( oSefaz:cXmlAutorizado, cPrefixo + ".PDF" )
         ELSE
            hb_MemoWrit( cPrefixo + ".xml", oSefaz:cXmlAutorizado )
            oSpedDa:ToPdf( oSefaz:cXmlAutorizado, cPrefixo + ".PDF" )         
         ENDIF
         ThisNFE:oProgressbar1:Set(,100)
         ThisNFE:oLabel5:SetText("NF-e Concluida com sucesso                                        ")
//         hwg_MsgInfo(cPrefixo + ".PDF")

*
*   ---> ENVIA EMAIL DA NOTA FISCAL AUTOMATICAMENTE SE TIVER EMAIL NO CADASTRO
*   
         IF EMAIL_VALIDO(LOWER(NOTAFE->e_eMAIL))
            IF .NOT. EMPTY(NOTAFE->e_eMAIL)
               
               cFrom        := "sgcnfe@gmail.com"
               cPassword   := "suasenha"
               cTo         := LOWER(NOTAFE->e_eMAIL)
               cHost       := "google"

               cSubject := "SGC - NOTA FISCAL ELETRONICA NF-E"
               cBody    := "emitida por: " + HB_EOL() +;
                                   FLAG->n_xFant+ HB_EOL() +;
                                   FLAG->n_xNome+ HB_EOL() +;
                                   "CPF/CNPJ: " + FLAG->n_CNPJ + HB_EOL() +;
                                   "NOTA FISCAL ELETRONICA Nr. " + NOTAFE->b_serie + "/" + NOTAFE->b_nNF + HB_EOL() + HB_EOL() +;
                        "para: " + HB_EOL() + ;
                                   RTRIM(NOTAFE->e_xNome) + HB_EOL() +;
                                   "CPF/CNPJ: " + RTRIM(NOTAFE->e_CNPJ) + HB_EOL() +;
                                   "VALOR: R$ " +  LTRIM(STR(NOTAFE->w_vNF,14,2)) + HB_EOL()+ HB_EOL() +;
                        "chave acesso: " + substr(NOTAFE->a_Id,4,44) + HB_EOL()+ HB_EOL() +;
                        "Obs: E-mail enviado automaticamente por SGC-SISTEMA DE GESTAO DE COMERCIO, nao responda."
               
               aFilesAttch := {cPrefixo + ".xml",cPrefixo + ".PDF"}
               
               Email_Envia( cFrom, cPassword, cTo, cHost, aFilesAttch, cBody, cSubject )         

            ENDIF
         ENDIF
*
*   ---> ABRE O PDF PARA IMPRESSAO ATRAVEZ DO PROGRAMA PADRAO
*

         WAPI_ShellExecute( NIL, "OPEN", cPrefixo + ".PDF" ,"",NIL,5 )

      ENDIF
//      NFEITENS->( DBCLOSEAREA() )
//      FILEDELETE(cArquivoNFEItem)

   
return nil


Acho que a maior dificuldade é criar o XML que nada mais é que uma tira de TAGs que vou montando
      M->cXml := '<NFe xmlns="http://www.portalfiscal.inf.br/nfe">'
      M->cXml += '<infNFe Id="'+ NOTAFE->a_Id + '" versao="4.00">'
      M->cXml += '<ide>'
      M->cXml += '<cUF>'      +NOTAFE->b_cUF                       +'</cUF>'
      M->cXml += '<cNF>'      +NOTAFE->b_cNF                       +'</cNF>'
      IF NOTAFE->b_finNFe = "4"
         M->cXml += '<natOp>DEVOLUCAO DE COMPRA P/ COMERCIALIZACAO</natOp>'
      ELSE
         M->cXml += '<natOp>'    +RTRIM(NOTAFE->b_natOp)              +'</natOp>'
      ENDIF
//      M->cXml += '<indPag>'   +Mb_indPag                        +'</indPag>'                                           && 0-A VISTA 1-A PRAZO 2-OUTROS
      M->cXml += '<mod>'      +NOTAFE->b_mod                       +'</mod>'
      M->cXml += '<serie>'    +ALLTRIM(STR(VAL(NOTAFE->b_serie)))  +'</serie>'
      M->cXml += '<nNF>'      +ALLTRIM(STR(VAL(NOTAFE->b_nNF)))    +'</nNF>'
      M->cXml += '<dhEmi>'    +DateTimeXml(M->DAT_HOJE,TIME() ,FLAG->n_xUF,.T. ) +'</dhEmi>'
      M->cXml += '<tpNF>'     +NOTAFE->b_tpNF                      +'</tpNF>'                                      && 0-ENTRADA 1-SAIDA
      M->cXml += '<idDest>'   +NOTAFE->b_idDest                    +'</idDest>'                                           && id de destino da operacao 1=interna 2=interestadual 3=exterior
      M->cXml += '<cMunFG>'   +NOTAFE->b_cMunFG                    +'</cMunFG>'
      M->cXml += '<tpImp>'    +NOTAFE->b_tpImp                     +'</tpImp>'                                             && formato impressao 1-normal retrato 2-normal paisagem
      M->cXml += '<tpEmis>'   +NOTAFE->b_tpEmis                    +'</tpEmis>'                                           && tipo emissao 1-emissao normal
      M->cXml += '<cDV>'      +NOTAFE->b_cDV                       +'</cDV>'
      M->cXml += '<tpAmb>'    +NOTAFE->b_tpAmb                     +'</tpAmb>'                                   && TIPO DE AMBIENTE 1-PRODUCAO 2-DESENVOLVIMENTO
      M->cXml += '<finNFe>'   +NOTAFE->b_finNFe                    +'</finNFe>'                                           && finalidade da emissao 1-normal 2-complementar 3-ajuste 4-devolucao
      M->cXml += '<indFinal>' +NOTAFE->b_indFinal                  +'</indFinal>'                                       && operacao com consumidor final 0-normal 1-consumidor final
      M->cXml += '<indPres>'  +SUBSTR(aINDPRES[nCombo1],1,1)       +'</indPres>'                                         && indicador de presenca do comprador 1-operacao presencial
      M->cXml += '<procEmi>'  +NOTAFE->b_procEmi                   +'</procEmi>'                                         && processo de emissao da NFe 3-app fornecido pelo fisco
      M->cXml += '<verProc>'  +ALLTRIM(NOTAFE->b_verProc)          +'</verProc>'
      
      IF NOTAFE->b_finNFe = "4"
         M->cXml += '<NFref>'
            M->cXml += '<refNFe>'   +CHAVE_refNFe                +'</refNFe>'
         M->cXml += '</NFref>'
      ENDIF
      M->cXml += '</ide>'
*************************************************************************************************************************      
      M->cXml += '<emit>'
        IF LEN(NOTAFE->c_CNPJ) > 11
         M->cXml += '<CNPJ>'     +ALLTRIM(NOTAFE->c_CNPJ)                      +'</CNPJ>'
      ELSE
         M->cXml += '<CPF>'     +ALLTRIM(NOTAFE->c_CNPJ)              +'</CPF>'
      ENDIF
      M->cXml += '<xNome>'    +rtrim(TIRACENTO(NOTAFE->c_xNome))   +'</xNome>'
      M->cXml += '<xFant>'    +RTRIM(TIRACENTO(NOTAFE->c_xFant))   +'</xFant>'
      M->cXml += '<enderEmit>'
      M->cXml += '<xLgr>'     +rtrim(TIRACENTO(NOTAFE->c_xLgr))    +'</xLgr>'
      M->cXml += '<nro>'      +rtrim(NOTAFE->c_nro)                +'</nro>'
      if NOTAFE->c_xCpl <> space(60)
         M->cXml += '<xCpl>'     +rtrim(NOTAFE->c_xCpl)           +'</xCpl>'
      endif
      M->cXml += '<xBairro>'  +rtrim(NOTAFE->c_xBairro)            +'</xBairro>'
      M->cXml += '<cMun>'     +NOTAFE->c_cMun                      +'</cMun>'
      M->cXml += '<xMun>'     +rtrim(NOTAFE->c_xMun)               +'</xMun>'
      M->cXml += '<UF>'       +NOTAFE->c_UF                        +'</UF>'
      M->cXml += '<CEP>'      +NOTAFE->c_CEP                       +'</CEP>'
      M->cXml += '<cPais>'    +NOTAFE->c_cPais                     +'</cPais>'
      M->cXml += '<xPais>'    +rtrim(NOTAFE->c_xPais)              +'</xPais>'
      M->cXml += '<fone>'     +rtrim(NOTAFE->c_fone)               +'</fone>'
      M->cXml += '</enderEmit>'
      IF FLAG->n_IE <> SPACE(14)
         M->cXml += '<IE>'   +rtrim(NOTAFE->c_IE)                 +'</IE>'
      ENDIF
***      IF FLAG->n_IM <> SPACE(15)
***         M->cXml += '<IM>'   +rtrim(NOTAFE->c_IM)                 +'</IM>'
***         M->cXml += '<CNAE>' +NOTAFE->c_CNAE                      +'</CNAE>'
***      ENDIF
      M->cXml += '<CRT>'      +NOTAFE->c_CRT                       +'</CRT>'
      M->cXml += '</emit>'            
*************************************************************************************************************************

      M->cXml += '<dest>'
      IF LEN(ALLTRIM(NOTAFE->e_CNPJ)) > 11
         M->cXml += '<CNPJ>'      +ALLTRIM(NOTAFE->e_CNPJ)            +'</CNPJ>'
      ELSE
         M->cXml += '<CPF>'      +ALLTRIM(NOTAFE->e_CNPJ)            +'</CPF>'      
      ENDIF
      M->cXml += '<xNome>'     +rtrim(TIRACENTO(NOTAFE->e_xNome))  +'</xNome>'
      M->cXml += '<enderDest>'
      M->cXml += '<xLgr>'     +rtrim(TIRACENTO(NOTAFE->e_xLgr))    +'</xLgr>'
      M->cXml += '<nro>'      +rtrim(NOTAFE->e_nro)                +'</nro>'
      IF NOTAFE->e_xCpl # SPACE(60)
         M->cXml += '<xCpl>' +rtrim(NOTAFE->e_xCpl)           +'</xCpl>'            
      ENDIF            
      M->cXml += '<xBairro>'  +rtrim(NOTAFE->e_xBairr)             +'</xBairro>'
      M->cXml += '<cMun>'     +rtrim(NOTAFE->e_cMun)               +'</cMun>'
      M->cXml += '<xMun>'     +rtrim(NOTAFE->e_xMun)               +'</xMun>'
      M->cXml += '<UF>'       +NOTAFE->e_UF                        +'</UF>'
      M->cXml += '<CEP>'      +NOTAFE->e_CEP                       +'</CEP>'
      M->cXml += '<cPais>'    +NOTAFE->e_cPais                     +'</cPais>'
      M->cXml += '<xPais>'    +rtrim(NOTAFE->e_xPais)              +'</xPais>'
      IF NOTAFE->e_fone <> SPACE(14)
         M->cXml += '<fone>'     +rtrim(NOTAFE->e_fone)           +'</fone>'
      ENDIF
      M->cXml += '</enderDest>'
      M->cXml += '<indIEDest>'+NOTAFE->e_indIE                     +'</indIEDest>'
      IF NOTAFE->e_indIE = "1"
         M->cXml += '<IE>'       +rtrim(NOTAFE->e_IE)             +'</IE>'
      endif
      if NOTAFE->e_ISUF <> space(9)
         M->cXml += '<ISUF>'     +rtrim(NOTAFE->e_ISUF)           +'</ISUF>'
      endif
      if NOTAFE->e_IM <> space(15)
         M->cXml += '<IM>'       +rtrim(NOTAFE->e_IM)             +'</IM>'
      endif
      if NOTAFE->e_eMAIL <> space(60)
         M->cXml += '<email>'    +rtrim(NOTAFE->e_eMAIL)          +'</email>'
      endif

      M->cXml += '</dest>'


ou tem uma forma de fazer bem mais pratica usando o XMLTAG() da SEFAZCLASS

*************************************
STATIC FUNCTION IDENTIFICACAO(  )
*************************************
      MEMVAR->b_cUF      :=FLAG->n_cUF
      MEMVAR->b_dhEmi      :=substr(strzero(YEAR(M->DAT_HOJE),4,0),3,2)+strzero(MONTH(M->DAT_HOJE),2,0)
      MEMVAR->c_CNPJ      :=FLAG->n_CNPJ
      MEMVAR->b_mod      :='99'
      MEMVAR->b_serie      :=FLAG->n_serie
      MEMVAR->b_nNF      :=FLAG->n_serie + PEDIDOS->NUMNOT
      MEMVAR->b_tpEmis   :='1'
      MEMVAR->b_cNF      :=FLAG->n_cNF

      MEMVAR->a_Id       := MEMVAR->b_cUF+MEMVAR->b_dhEmi+MEMVAR->c_CNPJ+MEMVAR->b_mod+MEMVAR->b_serie+MEMVAR->b_nNF+MEMVAR->b_tpEmis+MEMVAR->b_cNF

      MEMVAR->b_cDV       :=CalculaDigito( MEMVAR->a_Id, "11" )
      MEMVAR->a_Id       +=MEMVAR->b_cDV

      M->cXml := '<NFe xmlns="http://www.portalfiscal.inf.br/nfe">'
      M->cXml += '<infNFe versao="4.00" Id="NFe'+ MEMVAR->a_Id + '">'
      M->cXml += '<ide>'
      M->cXml += XmlTag( 'cUF', FLAG->n_cUF )
      M->cXml += XmlTag( 'cNF', FLAG->n_cNF )      
      M->cXml += XmlTag( 'natOp', 'TRANSFERENCIA PARA FILIAL' )         
      M->cXml += XmlTag( 'mod', '55' )      
      M->cXml += XmlTag( 'serie', ALLTRIM(STR(VAL(FLAG->n_serie))) )   
      M->cXml += XmlTag( 'nNF', ALLTRIM(STR(VAL(MEMVAR->b_nNF ))) )
      M->cXml += XmlTag( 'dhEmi', DateTimeXml(M->DAT_HOJE,TIME() ,FLAG->n_xUF,.T. ) )      
      M->cXml += XmlTag( 'tpNF', '1' )      
      M->cXml += XmlTag( 'idDest', '1' )         
      M->cXml += XmlTag( 'cMunFG', FLAG->n_cMun )      
      M->cXml += XmlTag( 'tpImp', '1' )
      M->cXml += XmlTag( 'tpEmis', '1' )
      M->cXml += XmlTag( 'cDV', MEMVAR->b_cDV )
      M->cXml += XmlTag( 'tpAmb', FLAG->n_tpAmb )
      M->cXml += XmlTag( 'finNFe', '1' )
      M->cXml += XmlTag( 'indFinal', '1' )   
      M->cXml += XmlTag( 'indPres', '1' )
      M->cXml += XmlTag( 'procEmi', '0' )
      M->cXml += XmlTag( 'verProc', 'SGC 4.00' )      
      M->cXml += '</ide>'

RETURN M->cXml

*************************************
STATIC FUNCTION EMITENTE(  )
*************************************
      M->cXml := '<emit>'
      M->cXml += XmlTag( 'CNPJ', ALLTRIM(FLAG->n_CNPJ) )
      M->cXml += XmlTag( 'xNome', rtrim(TIRACENTO(FLAG->n_xNome)) )      
      M->cXml += XmlTag( 'xFant', RTRIM(TIRACENTO(FLAG->n_xFant)) )      
      M->cXml += '<enderEmit>'
      M->cXml += XmlTag( 'xLgr', rtrim(TIRACENTO(FLAG->n_xLgr)) )
      M->cXml += XmlTag( 'nro', rtrim(FLAG->n_nro) )      
      M->cXml += XmlTag( 'xCpl', rtrim(FLAG->n_xCpl) )         
      M->cXml += XmlTag( 'xBairro', rtrim(FLAG->n_xBairro) )
      M->cXml += XmlTag( 'cMun', FLAG->n_cMun )      
      M->cXml += XmlTag( 'xMun', rtrim(FLAG->n_xMun) )   
      M->cXml += XmlTag( 'UF', FLAG->n_xUF )
      M->cXml += XmlTag( 'CEP', FLAG->n_CEP )
      M->cXml += XmlTag( 'cPais', FLAG->n_cPais )
      M->cXml += XmlTag( 'xPais', rtrim(FLAG->n_xPais) )
      M->cXml += XmlTag( 'fone', rtrim(FLAG->n_fone) )
      M->cXml += '</enderEmit>'
      M->cXml += XmlTag( 'IE', rtrim(FLAG->n_IE) )
      M->cXml += XmlTag( 'CRT', FLAG->n_CRT )
      M->cXml += '</emit>'      

RETURN    M->cXml

*************************************
STATIC FUNCTION DESTINATARIO(  )
*************************************
      DBSELECTAREA("CLIENTES")
      Ordsetfocus(1)
      M->cXml := ''
      IF DBSEEK(PEDIDOS->UCLIENTE)
         M->cXml := '<dest>'   
         M->cXml += XmlTag( 'CNPJ', ALLTRIM(CLIENTES->CPFCGC) )
         M->cXml += XmlTag( 'xNome', rtrim(TIRACENTO(CLIENTES->NRAZ_SOC)) )
         M->cXml += '<enderDest>'
         M->cXml += XmlTag( 'xLgr', rtrim(TIRACENTO(CLIENTES->ENDER)) )
         M->cXml += XmlTag( 'nro', rtrim(STR(CLIENTES->NUMERO,9,0)) )
         M->cXml += XmlTag( 'xCpl', rtrim(CLIENTES->COMPLEM) )
         M->cXml += XmlTag( 'xBairro', rtrim(CLIENTES->BAIR) )
         M->cXml += XmlTag( 'cMun', rtrim(CLIENTES->CODMUN) )
         M->cXml += XmlTag( 'xMun', rtrim(CLIENTES->CIDADE) )
         M->cXml += XmlTag( 'UF', CLIENTES->UF )
         M->cXml += XmlTag( 'CEP', SoNumeros( CLIENTES->CEP ) )
         M->cXml += XmlTag( 'cPais', CLIENTES->CODPAIS )            
         M->cXml += XmlTag( 'xPais', rtrim(CLIENTES->PAIS) )
         M->cXml += XmlTag( 'fone', rtrim(CLIENTES->FONE) )
         M->cXml += '</enderDest>'
         M->cXml += XmlTag( 'indIEDest', CLIENTES->ISENTO  )
         M->cXml += XmlTag( 'IE', rtrim(CLIENTES->INSEST)  )
         M->cXml += XmlTag( 'ISUF', rtrim(CLIENTES->SUFRAMA)  )      
         M->cXml += XmlTag( 'IM', rtrim(CLIENTES->INSMUN)  )         
         M->cXml += XmlTag( 'email', rtrim(CLIENTES->EMAIL)  )         
         M->cXml += '</dest>'
      ENDIF
      DBSELECTAREA("PEDIDOS")
RETURN M->cXml

ACBr LIB

MensagemEnviado: 12 Nov 2019 16:07
por rubens
Obrigado Fernando...
Já uso alguma coisa da SefazClass... tb..
mas gostaria mesmo era ver o uso da ACBR LIB, visto que quase todo o meu fiscal está voltado para ACBRMonitor..

att..

Rubens

ACBr LIB

MensagemEnviado: 12 Nov 2019 17:53
por fladimir
Rubens no SVN do ACBr tem 3 classes completas em PRG e tb cada um com um exemplo já funcionando.

Já tem para NFe, NFCe, SAT e Boleto e não olhei hj mas parece q já ia sair tb de CTe e MDFe

ACBr LIB

MensagemEnviado: 12 Nov 2019 18:31
por rubens
Boa tarde..

Tem sim Fladimir... até do boleto já tem...
Mas foi eu mesmo que não consegui compilar por isso tô atrás d um exemplo mais simples...
Mas vou tentando... com a LIB vira outra coisa né... porque não precisa instalar acbrmonitor... não limita a máquina que o ACBR tá instalado e rodando...

vlw..

Rubens

ACBr LIB

MensagemEnviado: 24 Nov 2019 10:59
por lucimauro
@Rubens você usa harbour ?

Qual seu o erro na compilação?

ACBr LIB

MensagemEnviado: 25 Nov 2019 10:26
por rubens
Bom dia @Lucimauro,

Consegui compilar o exemplo que vem junto. Gerou o executável ACBRNFEDEMO.EXE
Mas quando tento executar retorna o erro da imagem em anexo.
Erro acbrdll.PNG

A DLL está na pasta do executável. Daí como é classe, é praticamente impossível descobrir o erro.
O Ideal seria um programa simples, tipo imprimenfe, daí se der erro fica mais fácil de descobrir e mais fácil de estudar, uma coisa de cada vez.

Att,

Rubens

ACBr LIB

MensagemEnviado: 25 Nov 2019 11:26
por MSDN
Rubens,

De onde vc baixou os arquivos de exemplo ?

ACBr LIB

MensagemEnviado: 25 Nov 2019 11:28
por JoséQuintas
rubens escreveu:A DLL está na pasta do executável. Daí como é classe, é praticamente impossível descobrir o erro.


Não é impossível.
Provavelmente só tem um único lugar aonde carrega a DLL.
E tenho quase certeza de que precisa ter outras DLLs instaladas pra essa funcionar.

ACBr LIB

MensagemEnviado: 25 Nov 2019 11:37
por JoséQuintas
acbr.png

ACBr LIB

MensagemEnviado: 25 Nov 2019 11:40
por fladimir
Como o Quintas mostrou, tem q ver se as dependencias da DLL (na pasta do projeto tem) estão na pasta do EXE e tem 2 tipos de Dlls, se não der com 1 tenta com a outra.

ACBr LIB

MensagemEnviado: 25 Nov 2019 11:47
por JoséQuintas
O que mata o ACBR é isto: deveriam acabar com tudo isso na versão LIB.

acbr2.png

ACBr LIB

MensagemEnviado: 09 Dez 2019 08:35
por rubens
Bom dia..

Realmente faltava dll. Coloquei as dll na pasta e pronto.. funcionando..
Obrigado

Rubens

ACBr LIB

MensagemEnviado: 09 Dez 2019 09:26
por rossine
Bom dia,

Alguém já usa esta parte de envio/recebimento de boletos bancários poderia me dizer se o acbrlib está funcionando certinho e como eu faria para gerar o acbrlib32.dll ?

Obrigado,

ACBr LIB

MensagemEnviado: 18 Dez 2019 18:06
por jelias
Olá amigos,

Alguém já está emitindo NF-e usando a ACBrLIB?

Estou perdido, pois pelo que entendi posso continuar a gerar o .TXT e enviar para que a mesma gere o XML e envie. Também existe uma classe feita para ajudar na comunicação com DLL, mais eu ainda não consegui desembaraçar.

Caso alguém já esteja usando, agradeceria muito por uma luz.

Saudações,

Júlio.

ACBr LIB

MensagemEnviado: 18 Dez 2019 20:24
por JoséQuintas
jelias escreveu:pois pelo que entendi posso continuar a gerar o .TXT e enviar para que a mesma gere o XML e envie


Até quando vai nessa de TXT ?
XML dá trabalho na primeira vez, mas depois é só felicidade, principalmente pra conferência.

Se já fez pra TXT, pra XML tá fácil.

Supõe-se que deve usar o emissor do governo/Sebrae...
Pode usar ele mesmo pra fazer os testes com XML.
No começo, só incluir uma assinatura fake, qualquer assinatura de qualquer outro XML.

XML não é complicado, apenas é trabalhoso, porque igual o TXT, tem muitos campos.
Mas o TXT é na mesma sequência do XML, e mesmas conversões para os valores/campos.
Por isso digo que se já fez pra TXT, tá fácil fazer pra XML.

fácil = fácil, fácil <> rápido
pode demorar porque é muito campo.
Mas pode ir alterando o TXT pra XML, até mesmo simultâneo como eu cheguei a fazer, até terminar.

E pode usar minhas funções pra XML, que facilitam, podendo até ter algo similar pra TXT.

Tipo....

cTxt += "|" + Ltrim( Str( arquivo->Valor, 14, 2 ) ) + "|"

cXml += "<valor>" + Ltrim( Str( arquivo->Valor, 14, 2 ) + "</valor>"

hb_MemoWrit( "nota.txt", cTxt )

hb_MemoWrit( "nota.xml", cXml )


E as funções ajudam neste ponto:

cXml += "<valor>" + Ltrim( Str( arquivo->valor ) + "</valor>"

cXml += XmlTag( "valor", arquivo->Valor )


ou

cTxt += "|" + Ltrim( Str( arquivo->valor, 14, 2 ) ) + "|"

cTxt += "|" + ValorXml( arquivo->Valor ) + "|"


Fica um fonte mais limpo, e mais fácil de fazer correções.

XML não prende ao componente ter conversão, e fica mais livre pra usar qualquer coisa, até mesmo poder atualizar mudanças de lei do XML antes mesmo do componente fazer isso.

ACBr LIB

MensagemEnviado: 20 Dez 2019 20:57
por jelias
Mestre José Quintas,

Agradeço muito pela contribuição, entendi sua posição e irei avaliar a mudança.
Aproveitei para estudar a SEFAZCLASS e quero aproveitar para lhe parabenizar pelo lindo trabalho. Aproveito para lhe perguntar se este projeto funciona 100% com xHarbour? Ainda não tenho como migrar para Harbour, sendo esta mudança um segundo plano.

Lamento mais não tenho o nível de conhecimento necessário para desbravar a SEFAZCLASS, se puder me ajudar ou mostrar algum post que mostre o melhor caminho para a migração, tenho interesse em fazer os testes. Principalmente a questão de envio e retorno.
No ACBrMonitor, com um único comando NFE.CriarEnviarNFE faz o processo de Validar, Assinar e Enviar o XML para a receita. Como faria este processo na SEFAZCLASS?

Desde já agradeço pela atenção dispensada.

Saudações,

Júlio.

ACBr LIB

MensagemEnviado: 22 Dez 2019 18:44
por fladimir
Julio SEFAZ Class do Quintas é ótima mas precisaria ficar mudando sempre q o governo mudar, apesar de facilitar muito prefiro abraçar o projeto open source do ACBr e agora com a Lib então nem se fala. Respondendo a sua pergunta se tem gente usando a dll em produção, a resposta é sim.

ACBr LIB

MensagemEnviado: 23 Dez 2019 10:40
por jelias
Fladimir, agradeço por manifestar sua opnião!

Pelo que pude entender, para o uso da DLL tenho que proceder da seguinte forma.

1) Continuo gerando o TXT.
2) Uso o Método NFE_CarregarINI(cArquivo) para carregar o arquivo TXT para envio.
3) Uso o Método NFE_Enviar(parâmetros) para enviar para a receita e trato do retorno. Acredito que o XML irá ser criado na pasta indicada nos métodos de configurações da biblioteca.

Dúvida: O Comando NFE.CriarEnviarNFE já assina e valida e NF-e tudo em um só comando.
Com a dll é necessário fazer em comandos separados:
1) NFE_CarregarINI()
2) NFE_Assinar()
3) NFE_Validar()
4) NFE_Enviar()

Está correto? Se alguém puder contribuir com algum exemplo será muito importante para mim.

Desde já agradeço,

Saudações,

Júlio.

ACBr LIB

MensagemEnviado: 23 Dez 2019 18:31
por rubens
Acho que ainda não foi implementado o método NFE_CriarEnviarNFE() na dll..

Rubens

ACBr LIB

MensagemEnviado: 04 Jan 2020 17:24
por rochinha
Amiguinhos,

Se alguém puder me mandar esta DLL eu agradeço. Basta entrar em http://www.5volution.com.br/uploader.php e enviar.

@braços