Jump to content
Fivewin Brasil

ACBrNFeMonitor, alguem usa, que possa trocar ideias


marcioe

Recommended Posts

Márcio, eu uso o acbr e a classe hbnfe que não foi atualizada para a 3.10, no site pctoledo tem exemplos de uso. Quando crio uma nota ja preparo tanto com a classe hbnfe quanto com o ini para o acbr.

WITH OBJECT oNF:Emi

:CNPJ := alltrim(ccgcemp)
:xNome := ALLTRIM(cnomemp)
:xFant := ALLTRIM(cnomempt)
:xLgr := ALLTRIM(cruaemp)
:nro := ALLTRIM(cnumruaemp)
:xBairro := ALLTRIM(cbaiemp)
:cMun := ALLTRIM(ccodibgecid)
:xMun := ALLTRIM(ccidemp)
:UF := ALLTRIM(cufemp)
:CEP := ALLTRIM(ccepemp)
:fone := RIGHT(ctelemp,10)
:IE := alltrim(cieemp)
// :CNAE := 13981723
:CRT := ccodcrt
A_Nota += "[Emitente]" + CRLF
A_Nota += "CRT=" + txt( alltrim(ccodcrt) ) + CRLF
A_Nota += "CNPJ=" + txt( alltrim(ccgcemp) ) + CRLF
A_Nota += "IE=" + txt( alltrim(cieemp) ) + CRLF
A_Nota += "Razao=" + txt( ALLTRIM(cnomemp) ) + CRLF
A_Nota += "Fantasia=" + txt( ALLTRIM(cnomempt) ) + CRLF
A_Nota += "Fone=" + txt( RIGHT(ctelemp,10) ) + CRLF
A_Nota += "CEP=" + txt( ALLTRIM(ccepemp) ) + CRLF
A_Nota += "Logradouro=" + txt( ALLTRIM(cruaemp) ) + CRLF
A_Nota += "Numero=" + txt( ALLTRIM(cnumruaemp) ) + CRLF
A_Nota += "Complemento=" + CRLF
A_Nota += "Bairro=" + txt( ALLTRIM(cbaiemp) ) + CRLF
A_Nota += "CidadeCod=" + txt( ALLTRIM(ccodibgecid) ) + CRLF
A_Nota += "Cidade=" + txt( ALLTRIM(ccidemp) ) + CRLF
A_Nota += "UF=" + txt( ALLTRIM(cufemp) ) + CRLF
END WITH

Daniel Segura

Link to comment
Share on other sites

Eu uso.

Pretendo mudar para a classe do Gilmer assim que ele se libertar da FlexDocs.

Enquanto isso, uso ACBrNFeMonitor e Emissor gratuito.

Gero o TXT conforme o layout do emissor gratuito, que também é lido pelo ACBrNFeMonitor.

Não gero arquivo .ini do ACBr porque preferi fazer apenas uma rotina que servisse para os dois.

Caso queira algumas dicas, entre em contato pelo ariston.ap@hotmail.com

Link to comment
Share on other sites

sabe se funciona com XML ACBrNFeMonitor,

Márcio

Boa noite

O AcbrNfemonitor, funciona para nfe com o arquivo INI (Layout próprio), TXT (Layout sefaz) e Xml.

Os comandos podem ser TXT, XML e via comunicação TCP/IP, então tem pra todo gosto, com suporte gratuito ou Sac pago, o qual te dá direito a baixar semanalmente uma cópia binária atualizada, ou então os fontes em Deplhi gratuitamente.

[]s,

Link to comment
Share on other sites

Como eu gero o TXT da NF-e para usar tanto Emissor Gratuito como no ACBrNFeMonitor.

FUNCTION GeraTxtNFe(_NfeNr)
   LOCAl c_Txt, cNfeVer, l_ACBr, cQDesc, lQDesc, cCodRg, cComDes, cDesPr
   LOCAL nTarIR, nTarCS, nTaPIS, nTaCOF // Pegar base de cálculo do IR/CS/PIS/COFINS
   n_Area := SELECT()

   cQDesc := GetPvProfString( "CONFIGURACAO", "CfgDesconto", " ", ".\sisnfe.Ini")
   cComDes:= GetPvProfString( "CONFIGURACAO", "ComDesconto", "0", ".\sisnfe.Ini")
	c_Version := GetPvProfString( "CONFIGURACAO", "APPVERSION", "2.2.20", ".\sisnfe.Ini")
   l_ACBr := IIF(GetPvProfString( "VENDACFG", "NFeVia_ACBrNFe", "N", ".\siscom.ini")="S",.T.,.F.)
   cTpAmb := GetPvProfString( "CONFIGURACAO", "TIPAMBIENTE", " ", ".\sisnfe.Ini") // 1-Produção; 2-homologação

   c_Ambi := GetPvProfString("WebService", "Ambiente", "0", "C:\ACBrNFeMonitor\ACBrNFeMonitor.ini")
   IF c_Ambi = "0" ; cTpAmb := "1" ; ENDIF // 1-Produção
   IF c_Ambi = "1" ; cTpAmb := "2" ; ENDIF // 2-homologação


   // Deletar os TXTs gerados para agilizar a importação
   aFiles := DIRECTORY( CurDrive()+":\"+CurDir()+"\remessa\NFe-*.txt" )
   FOR nX := 1 TO Len( aFiles )
       IF aFiles[nX,3] < DATE()
          FERASE(CurDrive()+":\"+CurDir()+"\remessa\"+aFiles[ nX, 1 ])
       ENDIF
   NEXT

   DEFINE DIALOG o_Wait FROM 0, 0 TO 4, 20 TITLE "Gerando TXT da NFe..."
   o_Wait:lHelpIcon := .f.
   @05,05 SAY oAguarde PROMPT "Gerando TXT. Aguarde..." SIZE 80, 10 PIXEL OF o_Wait UPDATE
   ACTIVATE DIALOG o_Wait CENTER NOWAIT

   c_Txt := "NOTA FISCAL|1|"+CRLF
   c_Txt += "A|2.00|NFe|"+CRLF
   c_Txt += "B|"+RetCodUFIBGE(NFE_INFO->NFE_UF)+; // Cód. da UF do emitente
            "| |"+ALLTRIM(NFE_INFO->NATOP)+; // Natureza da operação
            "|"+ALLTRIM(NFE_INFO->FORMPG)+; // 0=A vista; 1 = A Prazo; 2 = Outros
            "|55"+; //  Modelo
            "|"+ALLTRIM(NFE_INFO->SERIE)+; //  Série 0=única ; 900-SCAN
            "|"+STRZERO(NFE_INFO->NFENUM,9)+; //  Número do documento fiscal
            "|"+STR(YEAR(NFE_INFO->NFEEMI),4)+"-"+STRZERO(MONTH(NFE_INFO->NFEEMI),2)+"-"+STRZERO(DAY(NFE_INFO->NFEEMI),2)+; // Emissão - AAAA-MM-DD
            "|"+STR(YEAR(NFE_INFO->DTSAID),4)+"-"+STRZERO(MONTH(NFE_INFO->DTSAID),2)+"-"+STRZERO(DAY(NFE_INFO->DTSAID),2)+; // Saída - AAAA-MM-DD
            "|"+IIF(SECS(NFE_INFO->NFHORA+":00") > 0, NFE_INFO->NFHORA+":00", "")+; // Hora da saída - Emissão
            "|"+NFE_INFO->NFETIP+; // Tipo: 0=Entrada; 1=Saída
            "|"+STRZERO(VAL(RetCodMunIBGE(NFE_INFO->MUNICI, NFE_INFO->NFE_UF, .F.)),7)+; // Código do município
            "|1"+; // Tipo de impressão: 1=Retrato; 2=Paisagem
            "|"+IIF(NFE_INFO->TPEMIS $ "1;2;3", NFE_INFO->TPEMIS, "1")+; // Tipo de emissão: 1=Nomral; 2=Contingencia; 3=SCAN
            "| "+; // Dígito verificador. Não informar para importação.
            "|"+cTpAmb+; // Tipo de ambiente: 1=Produção; 2=Homologação
            "|"+NFE_INFO->FINALI+; // Finalidade da NFe:  1=Nomral; 2=Complementar; 3=Ajuste
            "|3"+; // Processo de NFe: 3=Emissão pelo aplicativo do fisco
            "|"+c_Version // Versão do palicativo emissor gratuito
            IF VAL(ALLTRIM(NFE_INFO->SERIE)) >= 900
               c_Txt += "|"+STR(YEAR(NFE_INFO->NFEEMI),4)+"-"+STRZERO(MONTH(NFE_INFO->NFEEMI),2)+"-"+STRZERO(DAY(NFE_INFO->NFEEMI),2)+" "+LEFT(NFE_INFO->NFHORA,5)+":00"+"|PROBLEMAS NOS SERVICOS DE NFe DA SEFAZ"
            ENDIF
            c_Txt += "|"+CRLF // Fim da TAG
   // Se for Devolução de Mercadorias, Substituição de NF cancelada,
   // Complementação de NF, etc., informar o campo B13
   IF !EMPTY(NFE_INFO->REFNFE)
   	c_Txt += "B13|"+NFE_INFO->REFNFE+"|"+CRLF // Chave de Acesso da NF-e referenciada
   ENDIF
   // Se for referenciar um NF normal, informar os registros do campo B14
   IF !EMPTY(NFE_INFO->NF1NRO)
      c_Txt += "B14|"+RetCodUFIBGE(NFE_INFO->NF1_UF)+; // Código da UF do emitente - IBGE (NF normal)
               "|"+RIGHT(STR(YEAR(NFE_INFO->NFEEMI),4),2)+STRZERO(MONTH(NFE_INFO->NFEEMI),2)+; // Ano/Ano emissão da NF-e
               "|"+R_CnpjLienar(NFE_INFO->NF1CGC)+; // Cnpj do emitente da NF (NF normal)
               "|01"+; // Modelo do documento fiscal - 01 (NF normal)
               "|"+ALLTRIM(NFE_INFO->NF1SER)+; // Série do documento fiscal (NF normal)
               "|"+ALLTRIM(STR(VAL(NFE_INFO->NF1NRO)))+; // Número do documento fiscal (NF normal)
               "|"+CRLF // Fechamento da TAG
   ENDIF
   // Se for referenciar um Cupom Fiscal, informar os registros do campo B20j
   IF VAL(NFE_INFO->NROECF) > 0 .AND. VAL(NFE_INFO->NROCOO) > 0
      c_Txt += "B20j|"+ALLTRIM(NFE_INFO->MODECF)+; // Modelo
               "|"+STRZERO(VAL(NFE_INFO->NROECF),3)+; // Número ECF
               "|"+STRZERO(VAL(NFE_INFO->NROCOO),6)+; // Número COO
               "|"+CRLF // Fechamento da TAG
   ENDIF

   // Emitente
   cCodRg := NFE_INFO->REGIME // 1=Simples Nacional; 2=Simples Excesso de sublimite; 3=Regime Normal
   IF EMPTY(cCodRg)
      cCodRg := "3" // Regime Normal
      IF l_Simp
         cCodRg := "1" // Simples Nacional
         IF l_SExc
            cCodRg := "2" // Simples Nacional - Excesso de sublimite
         ENDIF
      ENDIF
   ENDIF
   c_Txt += "C|"+TiraAcentos(ALLTRIM(NFE_INFO->E_NOME))+; // Razão social ou nome do emitente
            "|"+TiraAcentos(ALLTRIM(NFE_INFO->E_FANT))+; // Nome de fantasia
            "|"+ALLTRIM(ClearChar(NFE_INFO->E_IEST ,{".","-"}))+; // Inscrição Estadual
            "|"+; // ID do substituto tributário
            "|"+; // Inscrição Municipal
            "|"+; // CNAE FISCAL = Deve ser informado quando IM for informado
            "|"+cCodRg+"|"+CRLF // Código de Regime Tributário - CRT: 1 - Simples Nacional; 2 - Simples Nacional - excesso de sublimite de receita bruta; 3 - Regime Normal
   // Seleção entre CNPJ e CPF do emitente
	IF LEN(ALLTRIM(ClearChar(NFE_INFO->E_CNPJ, {".","-","/",","}))) < 14
   	c_Txt += "C02a|"+R_cpfLienar(NFE_INFO->E_CNPJ)+"|"+CRLF // CPF
	ELSE
   	c_Txt += "C02|"+R_CnpjLienar(NFE_INFO->E_CNPJ)+"|"+CRLF // CNPJ
	ENDIF

	// Endereço do emitente
	c_Txt += "C05|"+TiraAcentos(ALLTRIM(NFE_INFO->E_LOGR))+; // Logradouro
            "|"+ALLTRIM(NFE_INFO->E_NUME)+; // Número
            "|"+TiraAcentos(ALLTRIM(NFE_INFO->E_CMPL))+; // Complemento
            "|"+TiraAcentos(ALLTRIM(NFE_INFO->E_BAIR))+; // Bairro
            "|"+STRZERO(VAL(RetCodMunIBGE(NFE_INFO->MUNICI, NFE_INFO->NFE_UF, .F.)),7)+; // Cód. município
            "|"+TiraAcentos(ALLTRIM(NFE_INFO->MUNICI))+; // Município
            "|"+ALLTRIM(NFE_INFO->NFE_UF)+; // Sigla UF
            "|"+LEFT(ClearChar(NFE_INFO->E_CEP,{".","-"}),8)+; // CEP
            "|"+RetCodPaisIBGE("BRASIL")+; // Código do País
            "|Brasil"+; // País
            "|"+RIGHT(ClearChar(ALLTRIM(NFE_INFO->E_FONE),{"(",")","-"," "}),10)+"|"+CRLF // Fone

   // Destinatário
   d_IE := ""
	if LEN(ALLTRIM(ClearChar(NFE_INFO->D_CNPJ,{".","-","/",","}))) = 14
		if EMPTY(NFE_INFO->D_IEST) .or. AllTrim(NFE_INFO->D_IEST) = "ISENTO"
		   d_IE := "ISENTO"
   	else
   	   d_IE := ClearChar(NFE_INFO->D_IEST ,{".","-"})
   	endif
	else
	   d_IE := "ISENTO"
	Endif

	c_xNome := ""
   IF cTpAmb = "2" // Se for homologação
   	c_xNome := "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL"
   ELSE
   	c_xNome := "("+ALLTRIM(STR(NFE_INFO->D_NCLI))+") "+TiraAcentos(ALLTRIM(NFE_INFO->D_NOME))
   ENDIF

   IF UPPER(ALLTRIM(NFE_INFO->D_PAIS)) != "BRASIL" ; d_IE := "" ; ENDIF
   c_Txt += "E|"+LEFT(c_xNome, 60)+; // Nome do destinatário - 2 a 60 caracteres
            "|"+ALLTRIM(d_IE)+; // Inscrição estadual
            "|"+ALLTRIM(NFE_INFO->D_SUFR)+"|"+; // Inscrição na SUFRAMA
            "|"+ALLTRIM(NFE_INFO->D_MAIL)+"|"+CRLF // E-mail

	IF LEN(ALLTRIM(ClearChar(NFE_INFO->D_CNPJ, {".","-","/",","}))) < 14
      c_Cnpj := R_cpfLienar(NFE_INFO->D_CNPJ)
      IF VAL(c_Cnpj) = 0 ; c_Cnpj := "" ; ENDIF
   	c_Txt += "E03|"+c_Cnpj+"|"+CRLF // CPF
   ELSE
   	c_Txt += "E02|"+R_CnpjLienar(NFE_INFO->D_CNPJ)+"|"+CRLF // CNPJ
   ENDIF

	// Endereço do destinatário
	c_Txt += "E05|"+TiraAcentos(ALLTRIM(NFE_INFO->D_LOGR))+; // Logradouro
            "|"+ALLTRIM(NFE_INFO->D_NUME)+; // Número
            "|"+TiraAcentos(ALLTRIM(NFE_INFO->D_CMPL))+; // Complemento
            "|"+TiraAcentos(ALLTRIM(NFE_INFO->D_BAIR))+; // Bairro
            "|"+STRZERO(VAL(RetCodMunIBGE(NFE_INFO->D_CIDA, NFE_INFO->D_UF, .F.)),7)+; // Cód. município
            "|"+TiraAcentos(ALLTRIM(NFE_INFO->D_CIDA))+; // Município
            "|"+ALLTRIM(NFE_INFO->D_UF)+; // Sigla UF
            "|"+LEFT(ALLTRIM(ClearChar(NFE_INFO->D_CEP,{".","-"})),8)+; // CEP
            "|"+RetCodPaisIBGE(NFE_INFO->D_PAIS)+; // Código do País
            "|"+ALLTRIM(NFE_INFO->D_PAIS)+; // País
            "|"+RIGHT(ClearChar(ALLTRIM(NFE_INFO->D_FONE),{"(",")","-", ""}),10)+"|"+CRLF // Fone

   // Incluir os itens na nfe
   SELECT(n_ItmArea)
   _nDes := 0
   nItem := 0
   nBCim := 0
   nICMS := 0
   nBCst := 0
   nVRst := 0
   c_Err := ""
   nTpro := 0
   nImposto := 0 // De Olho no Imposto
   nBclIPPT := 0 // Base de calculo do imposto
   WHILE ! NFE_ITEM->(EOF()) // .T.
      _cField := "NFE_ITEM->NFENRO"
      IF &(_cField) = _NfeNr
         nItem ++
         n_Vprod := (NFE_ITEM->QUANTI * NFE_ITEM->PRUNIT)
         nBcIcms := NFE_ITEM->BCICMS // (NFE_ITEM->QUANTI * NFE_ITEM->PRUNIT)
         n_Desc := 0
         IF NFE_ITEM->PRUNIT < NFE_ITEM->PRSDES
            IF cComDes = "2" // Mostra o desconto só no item. Total já com desconto imbutido
               n_Desc  := (NFE_ITEM->PRSDES-NFE_ITEM->PRUNIT) * NFE_ITEM->QUANTI
               n_Vprod := (NFE_ITEM->QUANTI * NFE_ITEM->PRUNIT)
            ELSEIF cComDes = "3" // Mostra o desconto no item e no cabeçalho. Total sem e com desconto
               n_Desc := (NFE_ITEM->PRSDES - NFE_ITEM->PRUNIT) * NFE_ITEM->QUANTI
               n_Vprod := (NFE_ITEM->QUANTI * NFE_ITEM->PRSDES)
               _nDes += n_Desc
            ELSE // Sem desconto
               n_Vprod := (NFE_ITEM->QUANTI * NFE_ITEM->PRUNIT)
            ENDIF
         ENDIF
         nTpro += n_Vprod
         cDesPr := TiraAcentos(ALLTRIM(STRTRAN(NFE_ITEM->DESCRI,"¥"," L:")))+; // Descrição do produto ou serviço
                   IIF(!EMPTY(NFE_ITEM->DISCRIM), ";"+ALLTRIM(NFE_ITEM->DISCRIM), "") // Discriminação detalhada
         cStrDesc := ""
         IF n_Desc > 0 // Mostrar desconto
            IF cComDes = "2" // Só na descrição do itne
               cDesPr += ";Desc. R$ "+ALLTRIM(TRANS(n_Desc, "@E 999,999.99"))+" ("+ALLTRIM(TRANS(AR_ROUND((100/NFE_ITEM->PRSDES) * (NFE_ITEM->PRSDES-NFE_ITEM->PRUNIT)),"@E 999.99"))+"%)"
            ENDIF
         ENDIF
         c_NCM := +ALLTRIM(ClearChar(NFE_ITEM->CFISCA,{"."}))
         IF VAL(c_NCM) = 0 ; c_NCM := "99999900" ; ENDIF

      	c_Txt += "H|"+ALLTRIM(STR(nItem))+"||"+CRLF // Número do item e informação adicional

         IF cComDes != "3"
         c_Txt += "I|"+STRZERO(VAL(NFE_ITEM->EAN_13),13)+; // Código do produto ou serviço
                  "|"+; // Código Ean13
                  "|"+LEFT(cDesPr,120)+; // Descrição do produto
                  "|"+c_NCM+; // Código NCM
                  "|"+; // Código EX_IPI
                  "|"+ALLTRIM(ClearChar(NFE_ITEM->CFOP, {"."} ))+; // CFOP
                  "|"+ALLTRIM(NFE_ITEM->UNIDAD)+; // UND
                  "|"+ALLTRIM(STR(NFE_ITEM->QUANTI,15,4))+; // Qtd
                  "|"+ALLTRIM(STR(NFE_ITEM->PRUNIT,21,10))+; // Valor da Unidade Comercial*
                  "|"+ALLTRIM(STR(NFE_ITEM->PRUNIT * NFE_ITEM->QUANTI,15,2))+; // Tot. bruto*
                  "|"+; // Código Ean13 tributável
                  "|"+ALLTRIM(NFE_ITEM->UNIDAD)+; // UND tributável
                  "|"+ALLTRIM(STR(NFE_ITEM->QUANTI,15,4))+; // Qtd tributável
                  "|"+ALLTRIM(STR(NFE_ITEM->PRUNIT,21,10))+; // PrUn UND tributável*
                  "|"+IIF(NFE_ITEM->V_FRET > 0, ALLTRIM(STR(NFE_ITEM->V_FRET,15,2)), "")+; // Valor do frete
                  "|"+IIF(NFE_ITEM->V_SEGU > 0, ALLTRIM(STR(NFE_ITEM->V_SEGU,15,2)), "")+; // Valor do seguro
                  "|"+; // Desconto*
                  "|"+IIF(NFE_ITEM->V_OUTR > 0, ALLTRIM(STR(NFE_ITEM->V_OUTR,15,2)), "")+; // Outras despesas
                  "|1"+; // indTot - 0 – o valor do item (vProd) não compõe o valor total da NF-e (vProd) 1 – o valor do item (vProd) compõe o valor total da NF-e.
                  "|"+IIF(cMovCd > 0,ALLTRIM(STR(cMovCd))," ")+; // xPed - Numero do pedido de compra de uso do emissor
                  "||"+CRLF // informar o número do item do pedido de compra, o campo é de livre uso do emissor.
         ELSE
         c_Txt += "I|"+STRZERO(VAL(NFE_ITEM->EAN_13),13)+; // Código do produto ou serviço
                  "|"+; // Código Ean13
                  "|"+LEFT(cDesPr,120)+; // Descrição do produto
                  "|"+c_NCM+; // Código NCM
                  "|"+; // EXTIPI
                  "|"+ALLTRIM(ClearChar(NFE_ITEM->CFOP, {"."} ))+; // CFOP
                  "|"+ALLTRIM(NFE_ITEM->UNIDAD)+; // UND
                  "|"+ALLTRIM(STR(NFE_ITEM->QUANTI,15,4))+; // Qtd
                  "|"+ALLTRIM(STR(NFE_ITEM->PRSDES,21,10))+; // Valor da Unidade Comercial*
                  "|"+ALLTRIM(STR(NFE_ITEM->PRSDES * NFE_ITEM->QUANTI,15,2))+; // Tot. bruto*
                  "|"+; // Código Ean13 Tributável
                  "|"+ALLTRIM(NFE_ITEM->UNIDAD)+; // UND tributável
                  "|"+ALLTRIM(STR(NFE_ITEM->QUANTI,15,4))+; // Qtd tributável
                  "|"+ALLTRIM(STR(NFE_ITEM->PRSDES,21,10))+; // PrUn UND tributável*
                  "|"+IIF(NFE_ITEM->V_FRET > 0, ALLTRIM(STR(NFE_ITEM->V_FRET,15,2)), "")+; // Valor do frete
                  "|"+IIF(NFE_ITEM->V_SEGU > 0, ALLTRIM(STR(NFE_ITEM->V_SEGU,15,2)), "")+; // Valor do seguro
                  "|"+IIF(n_Desc > 0, ALLTRIM(STR(n_Desc,15,2)), "")+; // Desconto*
                  "|"+IIF(NFE_ITEM->V_OUTR > 0, ALLTRIM(STR(NFE_ITEM->V_OUTR,15,2)), "")+; // Outras despesas
                  "|1"+; // indTot - 0 – o valor do item (vProd) não compõe o valor total da NF-e (vProd) 1 – o valor do item (vProd) compõe o valor total da NF-e.
                  "|"+IIF(cMovCd > 0,ALLTRIM(STR(cMovCd))," ")+; // xPed - Numero do pedido de compra de uso do emissor
                  "||"+CRLF // informar o número do item do pedido de compra, o campo é de livre uso do emissor.
         ENDIF
         // Dados de importação, se houver
         IF !EMPTY(NFE_ITEM->DINMRO)
         	c_Txt += "I18|"+ALLTRIM(NFE_ITEM->DINMRO)+; // Número da DI
                     "|"+STR(YEAR(NFE_ITEM->DIRGDT),4)+"-"+STRZERO(MONTH(NFE_ITEM->DIRGDT),2)+"-"+STRZERO(DAY(NFE_ITEM->DIRGDT),2)+; // /Data de registro - AAAA-MM-DD
                     "|"+ALLTRIM(NFE_ITEM->DILOCA)+; // Local de desembaraço
                     "|"+ALLTRIM(NFE_ITEM->DIUFDA)+; // Sigla da UF onde ocorreu o Desembaraço Aduaneiro
                     "|"+STR(YEAR(NFE_ITEM->DIDADT),4)+"-"+STRZERO(MONTH(NFE_ITEM->DIDADT),2)+"-"+STRZERO(DAY(NFE_ITEM->DIDADT),2)+; // Data do Desembaraço Aduaneiro
                     "|"+ALLTRIM(NFE_ITEM->DICODX)+; // Código do exportador
                     "|"+CRLF // Gechamento da TAG
            IF ! EMPTY(NFE_ITEM->DIADN1)
            	c_Txt += "I25|1"+; // Número da adição - 01
                        "|"+ALLTRIM(STR(VAL(NFE_ITEM->DIADN1)))+; // Número sequencial do item 1
                        "|"+ALLTRIM(NFE_ITEM->DIFAB1)+; // Cód. fabricante 1
                        "|"+; // Desconto 1
                        "|"+CRLF // Gechamento da TAG
         	ENDIF
            IF ! EMPTY(NFE_ITEM->DIADN2)
            	c_Txt += "I25|2"+; // Número da adição - 01
                        "|"+ALLTRIM(STR(VAL(NFE_ITEM->DIADN2)))+; // Número sequencial do item 1
                        "|"+ALLTRIM(NFE_ITEM->DIFAB2)+; // Cód. fabricante 1
                        "|"+; // Desconto 2
                        "|"+CRLF // Gechamento da TAG
         	ENDIF
            IF ! EMPTY(NFE_ITEM->DIADN3)
            	c_Txt += "I25|3"+; // Número da adição - 01
                        "|"+ALLTRIM(STR(VAL(NFE_ITEM->DIADN3)))+; // Número sequencial do item 1
                        "|"+ALLTRIM(NFE_ITEM->DIFAB3)+; // Cód. fabricante 1
                        "|"+; // Desconto 3
                        "|"+CRLF // Gechamento da TAG
         	ENDIF
            IF ! EMPTY(NFE_ITEM->DIADN4)
            	c_Txt += "I25|4"+; // Número da adição - 01
                        "|"+ALLTRIM(STR(VAL(NFE_ITEM->DIADN4)))+; // Número sequencial do item 1
                        "|"+ALLTRIM(NFE_ITEM->DIFAB4)+; // Cód. fabricante 1
                        "|"+; // Desconto 4
                        "|"+CRLF // Gechamento da TAG
         	ENDIF
            IF ! EMPTY(NFE_ITEM->DIADN5)
            	c_Txt += "I25|5"+; // Número da adição - 01
                        "|"+ALLTRIM(STR(VAL(NFE_ITEM->DIADN5)))+; // Número sequencial do item 1
                        "|"+ALLTRIM(NFE_ITEM->DIFAB5)+; // Cód. fabricante 1
                        "|"+; // Desconto 5
                        "|"+CRLF // Gechamento da TAG
         	ENDIF
         ENDIF
         // LOTE DO ITEM
         IF (!EMPTY(NFE_ITEM->LOTENR)) .AND. ;
            (!EMPTY(DTOS(NFE_ITEM->FABRIC))) .AND. ;
            (!EMPTY(DTOS(NFE_ITEM->VALIDA)))
            nQtLote := INT(NFE_ITEM->QTLOTE)
            nVlrPmc := NFE_ITEM->VLRPMC
            IF nQtLote = 0 ; nQtLote := INT(NFE_ITEM->QUANTI) ; ENDIF
            IF nVlrPmc = 0 ; nVlrPmc := NFE_ITEM->PRUNIT ; ENDIF
         	c_Txt += "K"+; // Medicamento
                     "|"+ALLTRIM(NFE_ITEM->LOTENR)+; // Número do Lote do medicamento
                     "|"+ALLTRIM(STR(nQtLote))+; // Quantidade de produto no Lote do medicamento
                     "|"+STR(YEAR(NFE_ITEM->FABRIC),4)+"-"+STRZERO(MONTH(NFE_ITEM->FABRIC),2)+"-"+STRZERO(DAY(NFE_ITEM->FABRIC),2)+; // Data de fabricação - AAAA-MM-DD
                     "|"+STR(YEAR(NFE_ITEM->VALIDA),4)+"-"+STRZERO(MONTH(NFE_ITEM->VALIDA),2)+"-"+STRZERO(DAY(NFE_ITEM->VALIDA),2)+; // Data de validade - AAAA-MM-DD
                     "|"+ALLTRIM(STR(nVlrPmc,15,02))+; // Preço máximo consumidor
                     "|"+CRLF // Fechamento da TAG
         ENDIF
         // LOTES DA NF-E AVULSA
         aItLts := GetNfeItmLotes(ALLTRIM(STR(NFE_ITEM->NFENRO)), NFE_ITEM->EAN_13)
         IF LEN(aItLts) > 0
            FOR nLt := 1 TO LEN(aItLts)
               nQtLote := INT(aItLts[nLt,2])
               nVlrPmc := aItLts[nLt,5]
            	c_Txt += "K"+; // Medicamento
                        "|"+ALLTRIM(aItLts[nLt,1])+; // Número do Lote do medicamento
                        "|"+ALLTRIM(STR(nQtLote))+; // Quantidade de produto no Lote do medicamento
                        "|"+STR(YEAR(aItLts[nLt,3]),4)+"-"+STRZERO(MONTH(aItLts[nLt,3]),2)+"-"+STRZERO(DAY(aItLts[nLt,3]),2)+; // Data de fabricação - AAAA-MM-DD
                        "|"+STR(YEAR(aItLts[nLt,4]),4)+"-"+STRZERO(MONTH(aItLts[nLt,4]),2)+"-"+STRZERO(DAY(aItLts[nLt,4]),2)+; // Data de validade - AAAA-MM-DD
                        "|"+ALLTRIM(STR(nVlrPmc,15,02))+; // Preço máximo consumidor
                        "|"+CRLF // Fechamento da TAG
            NEXT
         ENDIF
         IF !EMPTY(NFE_ITEM->CODANP)
         	c_Txt += "L01"+; // Combustíveis e lubrificantes
                     "|"+ALLTRIM(NFE_ITEM->CODANP)+; // COD ANP
                     "|"+; // CODIF
                     "|"+; // QTemp
                     "|"+cUFcon+; // UF de consumo
                     "|"+CRLF // Fechamento da TAG
      	ENDIF

      	c_Txt += "M|"+CRLF // Grupo de tributos incidentes no produto ou serviço
      	c_Txt += "N|"+CRLF // ICMS
         c_CST := alltrim(NFE_ITEM->S_TRIB)
         c_Orig := "0"
         IF VAL(cCodRg) == 1 // Simples nacional
            c_Orig := NFE_ITEM->ORIGIT // Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno
            IF EMPTY(c_Orig) ; c_Orig := "0"; ENDIF
            IF EMPTY(c_CST); c_CST := "102" ; ENDIF
            IF c_CST != "101"
             	c_Txt += "N10d|"+c_Orig+"|"+c_CST+"|"+CRLF
            ELSE
             	c_Txt += "N10c|"+c_Orig+"|"+c_CST+;
                        "|"+ALLTRIM(STR(NFE_ITEM->B_ICMS,5,2))+; // Aliquota aplicável de calculo de crédito
                        "|"+ALLTRIM(STR((nBcIcms / 100)*NFE_ITEM->B_ICMS,15,2))+; // Crédito do ICMS que pode ser aproveitado
                        "|"+CRLF // Fechamento da TAG
            ENDIF
         ELSE // Normal ou excesso de sublimite (2 ou 3)
            c_Orig := LEFT(NFE_ITEM->S_TRIB,1) // Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno
            c_CST := RIGHT(alltrim(NFE_ITEM->S_TRIB),2)
            IF EMPTY(c_Orig) ; c_Orig := "0"; ENDIF
         	DO CASE
            	CASE (NFE_ITEM->RDICMS = 0 .AND. NFE_ITEM->B_ICMS > 0) .AND. ; // Tributada integralmente
                    (NFE_ITEM->ST_MVA = 0 .AND. NFE_ITEM->B_ICST = 0) // Sem MVA
               	c_Txt += "N02|"+c_Orig+; // Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno
                           "|"+RIGHT(NFE_ITEM->S_TRIB,2)+; // Código da Situação Tributária
                           "|0"+; // Modalidade de determinação da BC do ICMS ( 0 - Margem Valor Agregado 1-Pauta (Valor) 2 = Preço Tabelado Máx. (valor) 3 -Valor da Operação )
                           "|"+ALLTRIM(STR(nBcIcms,15,2))+; // Valor da BC do ICMS
                           "|"+ALLTRIM(STR(NFE_ITEM->B_ICMS,5,2))+; // Aliquota do ICMS
                           "|"+ALLTRIM(STR((nBcIcms / 100)*NFE_ITEM->B_ICMS,15,2))+; // Valor do ICMS
                           "|"+CRLF // Fechamento da TAG
                  nBCim += nBcIcms
                  nICMS += (nBcIcms / 100) * NFE_ITEM->B_ICMS
            	CASE (NFE_ITEM->RDICMS = 0 .AND. NFE_ITEM->B_ICMS > 0) .AND. ; // Tributada integralmente
                    (NFE_ITEM->ST_MVA > 0 .AND. NFE_ITEM->B_ICST > 0) .AND. c_CST == "90" // Com MVA
                     nIcmsMva := NFE_ITEM->BCICST
                     nBCst += nIcmsMva
                     nVRst += NFE_ITEM->V_ICST
                     nBCim += (NFE_ITEM->QUANTI * NFE_ITEM->PRUNIT)
                     nICMS += (nBcIcms / 100) * NFE_ITEM->B_ICMS
                  	c_Txt += "N10|"+c_Orig+; // 2-Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno
                              "|"+c_CST+;     // 3-Código da Situação Tributária
                              "|"+NFE_ITEM->MBICMS+;  // 4-Modalidade de determinação BC ICMS
                              "|"+IIF(NFE_ITEM->RDICMS == 0,"",ALLTRIM(STR(NFE_ITEM->RDICMS,5,2)))+; // Percentual de redução da base de cálculo
                              "|"+ALLTRIM(STR(nBcIcms - ((nBcIcms / 100) * NFE_ITEM->RDICMS),15,2))+; // Valor da BC do ICMS
                              "|"+ALLTRIM(STR(NFE_ITEM->B_ICMS,5,2))+; // Aliquota do ICMS
                              "|"+ALLTRIM(STR(((nBcIcms - ((nBcIcms / 100) * NFE_ITEM->RDICMS))/100)*NFE_ITEM->B_ICMS,15,2))+; // Valor do ICMS
                              "|"+NFE_ITEM->MBISIT+; // 9-Modalidade de determinação BC ICMS ST
                              "|"+IIF(NFE_ITEM->ST_MVA > 0, ALLTRIM(STR(NFE_ITEM->ST_MVA, 5,2)), "")+; // 10-Percentual do MVA ST
                              "|"+; // 11-Percentual redução do MVA ST
                              "|"+ALLTRIM(STR(nIcmsMva, 15, 2))+; // 12-Valor da BC do ICMS ST
                              "|"+ALLTRIM(STR(NFE_ITEM->B_ICST,5,2))+; // 13-Percentual do ICMS ST
                              "|"+ALLTRIM(STR(NFE_ITEM->V_ICST,15,2))+; // 14-Valor do ICMS
                              "|"+CRLF // Fechamento da TAG
            	CASE NFE_ITEM->RDICMS > 0 .AND. NFE_ITEM->B_ICMS > 0 // Com redução de base de cálculo
                  IF NFE_ITEM->V_ICST == 0 // Sem ICMS ST
                  	c_Txt += "N04|"+c_Orig+; // Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno
                              "|"+RIGHT(NFE_ITEM->S_TRIB,2)+; // Código da Situação Tributária
                              "|0"+; // Modalidade de determinação da BC do ICMS ( 0 - Margem Valor Agregado 1-Pauta (Valor) 2 = Preço Tabelado Máx. (valor) 3 -Valor da Operação )
                              "|"+ALLTRIM(STR(NFE_ITEM->RDICMS,5,2))+; // Percentual de redução da base de cálculo
                              "|"+ALLTRIM(STR(NFE_ITEM->V_PROD - ((NFE_ITEM->V_PROD / 100) * NFE_ITEM->RDICMS),15,2))+; // Valor da BC do ICMS
                              "|"+ALLTRIM(STR(NFE_ITEM->B_ICMS,5,2))+; // Aliquota do ICMS
                              "|"+ALLTRIM(STR(((NFE_ITEM->V_PROD - ((NFE_ITEM->V_PROD / 100) * NFE_ITEM->RDICMS))/100)*NFE_ITEM->B_ICMS,15,2))+; // Valor do ICMS
                              "|"+CRLF // Fechamento da TAG
                     nBCim += NFE_ITEM->V_PROD - ((NFE_ITEM->V_PROD / 100) * NFE_ITEM->RDICMS)
                     nICMS += ((NFE_ITEM->V_PROD - ((NFE_ITEM->V_PROD / 100) * NFE_ITEM->RDICMS))/100) * NFE_ITEM->B_ICMS
                  ELSE // Com ICMS ST - Outros
                     IF EMPTY(c_CST) ; c_CST := "70" ; ENDIF
                     nIcmsMva := NFE_ITEM->BCICST
                     nBCst += NFE_ITEM->BCICST
                     nVRst += NFE_ITEM->V_ICST
                     nBCim += NFE_ITEM->BCICMS
                     nICMS += NFE_ITEM->VRICMS
                  	c_Txt += "N09|"+c_Orig+; // Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno
                              "|"+c_CST+; // Código da Situação Tributária
                              "|"+NFE_ITEM->MBICMS+; // Modalidade de determinação da BC do ICMS
                              "|"+ALLTRIM(STR(NFE_ITEM->RDICMS,5,2))+; // Percentual da redução
                              "|"+ALLTRIM(STR(NFE_ITEM->BCICMS,15,2))+; // Valor da BC do ICMS
                              "|"+ALLTRIM(STR(NFE_ITEM->B_ICMS,5,2))+; // Aliquota do ICMS
                              "|"+ALLTRIM(STR(NFE_ITEM->VRICMS,15,2))+; // Valor do ICMS
                              "|"+NFE_ITEM->MBISIT+; // Modalidade de determinação da BC do ICMS ST
                              "|"+; // Percentual adicinado (Opcional)
                              "|"+; // Percentual da redução
                              "|"+ALLTRIM(STR(NFE_ITEM->BCICST,15,2))+; // Valor da BC do ICMS ST
                              "|"+ALLTRIM(STR(NFE_ITEM->B_ICST,5,2))+; // Aliquota do ICMS ST
                              "|"+ALLTRIM(STR(NFE_ITEM->V_ICST,15,2))+; // Valor do ICMS ST
                              "|"+CRLF // Fechamento da TAG
                  ENDIF
            	CASE NFE_ITEM->RDICMS = 0 .AND. NFE_ITEM->B_ICMS = 0 // 40=Isenta, 41=Não tributada e 50=Suspensão; 30,60 = ST
                  IF NFE_ITEM->V_ICST > 0 // CST – 90 - ICMS substituição tributária com ou sem MVA
                     nBCst += NFE_ITEM->BCICST
                     nVRst += NFE_ITEM->V_ICST
                     IF EMPTY(c_CST) ; c_CST := "90" ; ENDIF
                  	c_Txt += "N10|"+c_Orig+; // 2-Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno
                              "|"+c_CST+;     // 3-Código da Situação Tributária
                              "|"+;           // 4-Modalidade de determinação BC ICMS
                              "|"+;           // 5-Valor da BC do ICMS
                              "|"+;           // 6-ercentual de redução da base de cálculo
                              "|"+;           // 7-Aliquota do ICMS
                              "|"+;           // 8-Valor do ICMS
                              "|4"+;          // 9-Modalidade de determinação BC ICMS ST
                              "|"+IIF(NFE_ITEM->ST_MVA > 0, ALLTRIM(STR(NFE_ITEM->ST_MVA, 5,2)), "")+; // 10-Percentual do MVA ST
                              "|"+;           // 11-Percentual redução do MVA ST
                              "|"+ALLTRIM(STR(NFE_ITEM->BCICST,15,2))+; // 12-Valor da BC do ICMS ST
                              "|"+ALLTRIM(STR(NFE_ITEM->B_ICST, 5,2))+; // 13-Percentual do ICMS ST
                              "|"+ALLTRIM(STR(NFE_ITEM->V_ICST,15,2))+; // 14-Valor do ICMS
                              "|"+CRLF // Fechamento da TAG
                  ELSEIF (NFE_ITEM->B_ICST > 0 .AND. NFE_ITEM->RDICST > 0) .OR. c_CST == "70" // ST C/Redução e Outros
                     // CST - 70 - Com redução de base de cálculo e cobrança do ICMS por substituição tributária
                     IF EMPTY(c_CST) ; c_CST := "70" ; ENDIF
                  	c_Txt += "N04|"+c_Orig+; // Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno
                              "|"+c_CST+; // Código da Situação Tributária
                              "|0"+; // Modalidade de determinação da BC do ICMS ( 0 - Margem Valor Agregado 1-Pauta (Valor) 2 = Preço Tabelado Máx. (valor) 3 -Valor da Operação )
                              "|"+ALLTRIM(STR(NFE_ITEM->RDICST,5,2))+; // Percentual de redução da base de cálculo
                              "|"+ALLTRIM(STR(nBcIcms - ((nBcIcms / 100) * NFE_ITEM->RDICST),15,2))+; // Valor da BC do ICMS
                              "|"+ALLTRIM(STR(NFE_ITEM->B_ICST,5,2))+; // Aliquota do ICMS
                              "|"+ALLTRIM(STR(((nBcIcms - ((nBcIcms / 100) * NFE_ITEM->RDICST))/100)*NFE_ITEM->B_ICST,15,2))+; // Valor do ICMS
                              "|"+CRLF // Fechamento da TAG
                     nBCim += NFE_ITEM->BCICMS // nBcIcms - ((nBcIcms / 100) * NFE_ITEM->RDICST)
                     nICMS += ((nBcIcms - ((nBcIcms / 100) * NFE_ITEM->RDICST))/100) * NFE_ITEM->B_ICST
                  	c_Txt += "N09|"+c_Orig+; // Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno
                              "|"+c_CST+; // Código da Situação Tributária
                              "|"+NFE_ITEM->MBICMS+; // Modalidade de determinação da BC do ICMS
                              "|"+ALLTRIM(STR(NFE_ITEM->RDICST,5,2))+; // Percentual da redução
                              "|"+ALLTRIM(STR(NFE_ITEM->BCICMS,15,2))+; // Valor da BC do ICMS
                              "|"+ALLTRIM(STR(NFE_ITEM->B_ICMS,5,2))+; // Aliquota do ICMS
                              "|"+ALLTRIM(STR(NFE_ITEM->VRICMS,15,2))+; // Valor do ICMS
                              "|"+NFE_ITEM->MBISIT+; // Modalidade de determinação da BC do ICMS ST
                              "|0"+; // Percentual adicinado (Opcional)
                              "|"+ALLTRIM(STR(NFE_ITEM->RDICST,5,2))+; // Percentual da redução
                              "|"+ALLTRIM(STR(NFE_ITEM->BCICST,15,2))+; // Valor da BC do ICMS ST
                              "|"+ALLTRIM(STR(NFE_ITEM->B_ICST,5,2))+; // Aliquota do ICMS ST
                              "|"+ALLTRIM(STR(NFE_ITEM->V_ICST,15,2))+; // Valor do ICMS ST
                              "|"+CRLF // Fechamento da TAG
                     nBCst += nBcIcms - ((nBcIcms / 100) * NFE_ITEM->RDICST)
                     nVRst += ((nBcIcms - ((nBcIcms / 100) * NFE_ITEM->RDICST))/100) * NFE_ITEM->B_ICST
                  ELSE // Isento ou não tributado
                     IF EMPTY(c_CST) ; c_CST := "41" ; ENDIF
                     c_Txt += "N06|"+c_Orig+; // Origem da mercadoria: 0=Nacional; 1=Estrangeira importada; 2=Estrangeira adquirida no mercado interno
                              "|"+c_CST+; // Código da Situação Tributária
                              "|"+CRLF // Fechamento da TAG
                  ENDIF
            ENDCASE
         ENDIF

         // IPI
         IF ! EMPTY(NFE_ITEM->DINMRO) // Se for importação não calcular - Isento
          	c_Txt += "O"+;
                     "|"+; // Classe de enquadramento (cigarros/bebidas)
                     "|"+; // CNPJ do produtor (quando diferente do emitente)
                     "|"+; // Cód. Selo controle do IPI
                     "|"+CRLF // Quantidade de selos
          	c_Txt += "O08|02|"+CRLF // Veja tabela
         ELSE
            IF ! EMPTY(NFE_ITEM->CST_IPI) // IPI normal
             	c_Txt += "O"+;
                        "|"+; // Classe de enquadramento (cigarros/bebidas)
                        "|"+; // CNPJ do produtor (quando diferente do emitente)
                        "|"+; // Cód. Selo controle do IPI
                        "|"+CRLF // Quantidade de selos
               IF NFE_ITEM->B_IPI > 0 // Tributado pelo IPI
                	c_Txt += "O07|"+ALLTRIM(NFE_ITEM->CST_IPI)+"|"+ALLTRIM(STR(NFE_ITEM->VR_IPI,15,2))+CRLF
                	c_Txt += "O10|"+ALLTRIM(STR(nBcIcms,15,2))+"|"+ALLTRIM(STR(NFE_ITEM->B_IPI,5,2))+CRLF
               ELSE // Não tributado ou isado de IPI
                	c_Txt += "O08|"+ALLTRIM(NFE_ITEM->CST_IPI)+CRLF
               ENDIF
            ENDIF
         ENDIF

         // Imposto de importação: P|VBC|VDespAdu|VII|VIOF|
         IF ! EMPTY(NFE_ITEM->DINMRO)
          	c_Txt += "P"+;
                     "|"+ALLTRIM(STR(NFE_ITEM->IIVRBC,15,2))+; // BC II
                     "|"+ALLTRIM(STR(NFE_ITEM->IIDESP,15,2))+; // Desp. Aduaneiras
                     "|"+ALLTRIM(STR(NFE_ITEM->IIVLOR,15,2))+; // Valor II
                     "|"+ALLTRIM(STR(NFE_ITEM->IIVIOF,15,2))+; // Valor IOF
                     "|"+CRLF // Fechamento da TAG
         ENDIF

       	c_Txt += "Q|"+CRLF // PIS
         IF NFE_ITEM->B_PIS > 0
         	c_Txt += "Q02|01"+; // Operação Tributável (base de cálculo = valor da operação alíquota normal (cumulativo/não cumulativo))
                     "|"+ALLTRIM(STR(NFE_ITEM->B_PIS,15,2))+; // BC PIS
                     "|"+ALLTRIM(STR(NFE_ITEM->A_PIS, 5,2))+; // Aliquota PIS
                     "|"+ALLTRIM(STR(NFE_ITEM->V_PIS,15,2))+; // Valor PIS
                     "|"+CRLF // Fechamento da TAG
      	ELSE
         	c_Txt += "Q04|07|"+CRLF // 07=Isento de contriubuição
      	ENDIF

       	c_Txt += "S|"+CRLF // COFINS
         IF NFE_ITEM->B_COFI > 0
         	c_Txt += "S02|01"+; // Operação Tributável (base de cálculo = valor da operação alíquota normal (cumulativo/não cumulativo))
                     "|"+ALLTRIM(STR(NFE_ITEM->B_COFI,15,2))+; // BC COFINS
                     "|"+ALLTRIM(STR(NFE_ITEM->A_COFI, 5,2))+; // Aliquota COFINS
                     "|"+ALLTRIM(STR(NFE_ITEM->V_COFI,15,2))+; // Valor COFINS
                     "|"+CRLF // Fechamento da TAG
      	ELSE
         	c_Txt += "S04|07|"+CRLF // 07=Isento de contriubuição
      	ENDIF

      	// Cálculo no valor do imposto com base na tabela do IPPT (Lei De Olho no Imposto)
      	// Para os CFOPs de venda ao consumidor
      	IF ALLTRIM(ClearChar(NFE_ITEM->CFOP, {"."} )) $ "5101|5102|5103|5104|5105|5403|5405|6101|6102|6103|6104|6105|6403|6405|"
         	nImposto += CalcIPPT(c_NCM, c_Orig, n_Vprod)
         	nBclIPPT += n_Vprod
         ENDIF
      ELSE
         EXIT
      ENDIF
      NFE_ITEM->(DBSKIP(1))
   END

   SELECT(n_InfArea)

   // Totais
   cVfret := IIF(NFE_INFO->T_FRET > 0, ALLTRIM(STR(NFE_INFO->T_FRET,15,2)), "0")
   cVsegu := IIF(NFE_INFO->T_SEGU > 0, ALLTRIM(STR(NFE_INFO->T_SEGU,15,2)), "0")
   cVoutr := IIF(NFE_INFO->T_DESP > 0, ALLTRIM(STR(NFE_INFO->T_DESP,15,2)), "0")
 	c_Txt += "W|"+CRLF // Grupo de Totais
 	c_Txt += "W02"+; // Grupo de valores totais referentes ao ICMS
            "|"+ALLTRIM(STR(nBCim,15,2))+; // Base de cálculo do ICMS
            "|"+ALLTRIM(STR(nICMS,15,2))+; // Valor do ICMS
            "|"+ALLTRIM(STR(NFE_INFO->T_BSUB,15,2))+; // Base de cálculo do ICMS ST
            "|"+ALLTRIM(STR(NFE_INFO->T_ISUB,15,2))+; // Valor do ICMS ST
            "|"+ALLTRIM(STR(nTpro,15,2))+; // Valor total dos produtos
            "|"+cVfret+; // Valor do frete
            "|"+cVsegu+; // Valor do seguro
            "|"+ALLTRIM(STR(_nDes,15,2))+; // Valor do desconto
            "|"+ALLTRIM(STR(NFE_INFO->T_VRII,15,2))+; // Valor II
            "|"+ALLTRIM(STR(NFE_INFO->T_IPI,15,2))+; // Valor do IPI
            "|"+ALLTRIM(STR(NFE_INFO->T_PIS,15,2))+; // Valor do PIS
            "|"+ALLTRIM(STR(NFE_INFO->T_COFI,15,2))+; // Valor do COFINS
            "|"+cVoutr+; // Outras despesas
            "|"+ALLTRIM(STR(NFE_INFO->T_TOTA,15,2))+; // Total da nfe
            "|"+CRLF // Fechamento da TAG

  	nTtlNfe := NFE_INFO->T_TOTA

   // Transporte
 	c_Txt += "X|"+STR(NFE_INFO->T_MFRT,1)+"|"+CRLF // 0=Por conta do emitente; 1=Por conta do destinatário
 	c_Txt += "X03"+; // Transportador
            "|"+TiraAcentos(ALLTRIM(NFE_INFO->T_RAZA))+; // Nome ou Razão Social
            "|"+ALLTRIM(clearChar(NFE_INFO->T_IEST,{".","-"}))+; // IE
            "|"+TiraAcentos(ALLTRIM(NFE_INFO->T_ENDE))+; // Endereço
            "|"+TiraAcentos(ALLTRIM(NFE_INFO->T_ESTA))+; // UF
            "|"+TiraAcentos(ALLTRIM(NFE_INFO->T_CIDA))+; // Cidade
            "|"+CRLF // Fechamento da TAG

   IF ! EMPTY(NFE_INFO->T_CNPJ)
   	IF LEN(ALLTRIM(ClearChar(NFE_INFO->T_CNPJ, {".","-","/",","}))) < 14
       	c_Txt += "X05|"+R_cpfLienar(NFE_INFO->T_CNPJ)+"|"+CRLF // CPF do transpotador
   	ELSE
       	c_Txt += "X04|"+R_CnpjLienar(NFE_INFO->T_CNPJ)+"|"+CRLF // CNPJ da Transportadora
   	ENDIF
 	ELSE
     	c_Txt += "X04| |"+CRLF // CNPJ da Transportadora
	ENDIF

 	c_Txt += "X26"+; // Volumes
            "|"+ALLTRIM(STR(IIF(NFE_INFO->T_VOLS > 0, NFE_INFO->T_VOLS, nItem)))+; // Quantidade - 15 caracteres
            "|"+ALLTRIM(IIF(!EMPTY(NFE_INFO->T_ESPE),NFE_INFO->T_ESPE, "ITENS"))+; // Espécie
            "|"+ALLTRIM(NFE_INFO->T_MARC)+; // Marca
            "|"+ALLTRIM(STR(NFE_INFO->T_NVOL))+; // Volume
            "|"+ALLTRIM(STR(NFE_INFO->T_PESL,15,3))+; // Peso bruto
            "|"+ALLTRIM(STR(NFE_INFO->T_PESB,15,3))+; // Peso liquido
            "|"+CRLF // Fechamento da TAG

   nTtlPar := 0
   SELECT(n_DupArea)
   NFE_DUPL->( dbGotop() )
   NFE_DUPL->(DBSETORDER(2))
   _cField := "NFE_DUPL->NFENRO"
   IF NFE_DUPL->(DBSEEK(_NfeNr))
    	c_Txt += "Y|"+CRLF // Cobrança
    	n_Par := 1
   	WHILE ! NFE_DUPL->( EOF() )
         IF &(_cField) = _NfeNr
            nTtlPar += NFE_DUPL->NVALOR
          	c_Txt += "Y07"+; // Duplicata
                     "|"+ALLTRIM(STR(n_Par))+; // Numero da Duplicata
                     "|"+STR(YEAR(NFE_DUPL->DVENCI),4)+"-"+STRZERO(MONTH(NFE_DUPL->DVENCI),2)+"-"+STRZERO(DAY(NFE_DUPL->DVENCI),2)+; // Vencimento - AAAA-MM-DD
                     "|"+ALLTRIM(STR(NFE_DUPL->NVALOR,15,2))+; // Valor da Duplicata
                     "|"+CRLF // Fechamento da TAG
         ELSE
            EXIT
         ENDIF
         n_Par ++
         NFE_DUPL->( dbSkip() )
      END
	ENDIF

   // Informações adicionais
   cVlrImp := ""
   IF nImposto > 0
      nImpAlq := ((100/nBclIPPT)*nImposto)
      cVlrImp := "VALOR APROXIMADO DOS TRIBUTOS: "+ALLTRIM(TRANS(nImposto, "@E 999,999.99"))+" ("+ALLTRIM(TRANS(nImpAlq,"@E9999.99"))+"%) Fonte: IBPT. "
   ELSE
      cVlrImp := "(SEM DADO SUFICIENTE PARA CÁLCULO DO VALOR APROXIMADO DOS TRIBUTOS.) "
   ENDIF
  	c_Txt += "Z||"+cVlrImp+ALLTRIM(NFE_INFO->T_INFO)+"|"

   cPathTxt := CurDrive()+":\"+CurDir()+"\remessa"
   cFile := cPathTxt+"\NFe-"+alltrim(str(_NfeNr))+".txt"

   IF ! FileWrite(cFile, c_Txt)
      o_Wait:End()
      RETURN NIL
	ENDIF

   o_Wait:End()

	IF ! l_ACBr
   	IF MsgYesNo("Arquivo TXT criado com sucesso:"+CRLF+CRLF+;
              cFile+CRLF+;
              "NF-e número: "+ALLTRIM(STR(NFE_INFO->NFENUM))+CRLF+CRLF+;
              "Para transmitir, utilize o programa fornecido pelo Fisco.","TXT Criado")
      ENDIF
   ELSE
      MsgEnviar(cPathTxt+"\NFe-"+alltrim(str(_NfeNr))+".txt")
   ENDIF
RETURN NIL

Link to comment
Share on other sites

Funções para emissão de comandos para o ACBrNFeMonitor via txt ou socket (TCP/IP)

/////////////////////////////////////////////////////////////////////////////
//
// ACBR - Funcoes Compativeis com Monitor ACBr NFe
//
//         Autor: Jose Carlos da Rocha
//          Data: 24/03/2009
//         Email: irochinha@itelefonica.com.br
//           MSN: fivolution@hotmail.com
//     Linguagem: xBase
//       Prefixo: ACBR_NFE_
//   Plataformas: DOS, Windows
// Requerimentos: Harbour/xHarbour( Para uso com Clipper eliminar Prefixo )
//
/////////////////////////////////////////////////////////////////////////////

#include "fivewin.ch"
#include "fileio.ch"
#include "commands.ch"

#define  ETX chr(3)
#define  CR  chr(13)
#define  LF  chr(10)

Static sENDER   := ''  ,;
       SEM_ERRO := .F. ,;
       RET_IMP  := ''

Static sSOCKET

*------------------------------------------------------------------------------*

function ACBR_NFE_StatusServico()
   cCmd           := ""
   ACBR_NFE_Comando( "NFE.StatusServico", ["]+cCmd+["] )
   retorno := ACBR_NFE_Retorno(30)
   return retorno

function ACBR_NFE_CriarNFeSefaz( cTxtNFe )
   cCmd           := iif(cTxtNFe=nil,"",cTxtNFe)
   ACBR_NFE_Comando( "NFE.CriarNFeSefaz", ["]+cCmd+["] )
   retorno := ACBR_NFE_Retorno(45)
   return retorno

function ACBR_NFE_ValidarNFe( cXML )
   cCmd           := iif(cXML=nil,"",cXML)
   ACBR_NFE_Comando( "NFE.ValidarNFe", ["]+cCmd+["] )
   retorno := ACBR_NFE_Retorno(30)
   return retorno

function ACBR_NFE_AssinarNFe( cXML )
   cCmd           := iif(cXML=nil,"",cXML)
   ACBR_NFE_Comando( "NFE.AssinarNFe", ["]+cCmd+["] )
   retorno := ACBR_NFE_Retorno(30)
   return retorno

function ACBR_NFE_EnviarNFe( cArquivo, nLote, nAssina, nImprime )
   nLote          := str( nLote )
   nAssina        := str( nAssina )
   nImprime       := str( nImprime )
   cCmd           := ["]+cArquivo+[",]+nLote+[,]+nAssina+[,]+nImprime
   ACBR_NFE_Comando( "NFE.EnviarNFe", cCmd )
   retorno := ACBR_NFE_Retorno()
   return retorno

function ACBR_NFE_ConsultarNFe( cNFe )
   cCmd           := iif(cNFe=nil,"",cNFe)
   ACBR_NFE_Comando( "NFE.ConsultarNFe", ["]+cCmd+["] )
   retorno := ACBR_NFE_Retorno(60)
   return retorno

function ACBR_NFE_CancelarNFe( cNFe, xMotivo )
   cCmd           := ["]+cNFe+[","]+xMotivo+["]
   ACBR_NFE_Comando( "NFE.CancelarNFe", cCmd )
   retorno := ACBR_NFE_Retorno(60)
   return retorno

function ACBR_NFE_ImprimirDANFe( cXML )
   cCmd           := iif(cXML=nil,"",cXML)
   ACBR_NFE_Comando( "NFE.ImprimirDANFe", ["]+cCmd+["] )
   retorno := ACBR_NFE_Retorno(15)
   return retorno

function ACBR_NFE_GerarPDF( cXML )
   cCmd           := iif(cXML=nil,"",cXML)
   ACBR_NFE_Comando( "NFE.ImprimirDanfePDF", ["]+cCmd+["] )
   retorno := ACBR_NFE_Retorno(15)
   return retorno

function ACBR_NFE_CCe( cIni )
   cCmd           := iif(cIni=nil,"",cIni)
   ACBR_NFE_Comando( "NFE.CARTADECORRECAO", ["]+cCmd+["] )
   retorno := ACBR_NFE_Retorno(60)
   return retorno

function ACBR_NFE_InutilizarNFe( cCNPJ, cJustificativa, nAno, nModelo, nSerie, nNumInicial, nNumFinal )
   cCNPJ          := iif(cCNPJ=nil,"XXXXXXXXXXXXXX",cCNPJ)
   cJustificativa := iif(cJustificativa=nil,"TESTE NFE",cJustificativa)
   nAno           := str( nAno )
   nModelo        := str( nModelo )
   nSerie         := str( nSerie )
   nNumInicial    := str( nNumInicial )
   nNumFinal      := str( nNumfinal )
   cCmd           := ["]+cCNPJ+[","]+cJustificativa+[",]+nAno+[,]+nModelo+[,]+nSerie+[,]+nNumInicial+[,]+nNumFinal
   ACBR_NFE_Comando( "NFE.InutilizarNFe", cCmd )
   retorno := ACBR_NFE_Retorno(60)
   return retorno

function ACBR_NFE_CertDtVenc()
   cCmd           := ""
   ACBR_NFE_Comando( "NFE.CertificadoDataVencimento", ["]+cCmd+["] )
   retorno := ACBR_NFE_Retorno(10)
   return retorno

function ACBR_NFE_Comando( cIndice, cDados )
   local ret_line := "chr(13)+chr(10)"
   // Checar se a impressora está instalada...
   cPath := "C:\ACBrNFeMonitor"
   IF ! lIsDir(cPath)
      MsgInfo("O ACBrNFeMonitor não está instalado", "Aviso")
      RETURN NIL
   ENDIF
   
   cTcpIp := GetPvProfString( "ACBrNFeMonitor", "Modo_TCP", " ", "C:\ACBrNFeMonitor\ACBrNFeMonitor.ini")
   cIsTxt := GetPvProfString( "ACBrNFeMonitor", "Modo_TXT", " ", "C:\ACBrNFeMonitor\ACBrNFeMonitor.ini")
   c_Gate := GetPvProfString( "ACBrNFeMonitor", "TCP_Porta", "3436", "C:\ACBrNFeMonitor\ACBrNFeMonitor.ini")
   c_Ende := ""
   IF cTcpIp = "1" ; c_Ende := "127.0.0.1:"+c_Gate ; ENDIF
   IF cIsTxt = "1" ; c_Ende := "C:\ACBrNFeMonitor" ; ENDIF
   IF EMPTY(c_Ende) ; MsgAlert("Detectado erro de configuração no ACBrNFeMonitor","Aviso"); RETURN .F. ; ENDIF
   cDirDoMonitor := cPath
   errfile  := "ENTNFE.CMD"
   cDados   := iif(ValType(cDados)#"C","",cDados)
   cBuffer := cIndice + iif( len( cDados )=0,"()","(" + cDados + ")")

   IF cIsTxt = "1"
      errhandle := FCREATE(errfile)
      FWRITE(errhandle,cBuffer+&ret_line.)
      FCLOSE(errhandle)
      FERASE( cDirDoMonitor+"\ENTNFE.TXT" )
      FERASE( cDirDoMonitor+"\SAINFE.TXT" )
      COPY FILE &(errfile) TO &(cDirDoMonitor+"\"+errfile)
      FRENAME( cDirDoMonitor+"\"+errfile, cDirDoMonitor+"\ENTNFE.TXT" )
   ELSEIF cTcpIp = "1"
      IF ! NFE_INIT(c_Ende) ; MsgAlert("Erro ao tentar abrir a porta de comunicação!","Aviso!") ; RETURN .F. ; ENDIF
      SysRefresh()
      IF ! NFE_ABERTA() ; RETURN .F. ; ENDIF
      SysRefresh()
      NFE_COMANDO( cBuffer )
      SysRefresh()
      NFE_END()
   ENDIF
   return .t.

function ACBR_NFE_Retorno(_Wait_)
   LOCAL cIsTxt := GetPvProfString( "ACBrNFeMonitor", "Modo_TXT", " ", "C:\ACBrNFeMonitor\ACBrNFeMonitor.ini")
   LOCAL c_Bufr
   DEFAULT _Wait_ := 300 // 5 MINUTOS
   IF _Wait_ < 30 ; _Wait_ := 30 ; ENDIF
   cPath := "C:\ACBrNFeMonitor"
   IF ! lIsDir(cPath)
      MsgInfo("O ACBrNFeMonitor não está instalado", "Aviso")
      RETURN NIL
   ENDIF
   cDirDoMonitor := cPath
   cNFELOG := RET_IMP
   if cIsTxt = "1"
      SysRefresh()
      DEFINE DIALOG o_Hold FROM 0, 0 TO 4, 54 TITLE "Espere..."
      o_Hold:lHelpIcon := .f.
      @05,05 SAY oAguarde PROMPT "Aguardando a resposta. Espere um momento..." SIZE 120, 24 PIXEL OF o_Hold UPDATE
      ACTIVATE DIALOG o_Hold CENTER NOWAIT
      do while _Wait_ > 0
         SysRefresh()
         if file( cDirDoMonitor+"\SAINFE.TXT" )
            cNFELOG := memoread( cDirDoMonitor+"\SAINFE.TXT" )
            EXIT
         endif
         INKEY(1)
         _Wait_ --
      enddo
      IF EMPTY(cNFELOG) ; cNFELOG := "ERRO: Sem resposta do Monitor da NF-e" ; ENDIF
      o_Hold:End()
   ENDIF
   c_Bufr := cNFELOG
   c_Linh := MEMOLINE(c_Bufr, 25, 1)
   if "ERRO:" $ c_Linh
      IF "Forbidden (403)" $ c_Bufr
         c_Bufr := "ERRO: WebService Consulta Status serviço: Forbidden (403)"+CRLF+CRLF+;
            "Causas prováveis:"+CRLF+;
            "O certificado digital não se encontra no período de validade."+CRLF+;
            "O certificado digital do cliente não é confiável ou é inválido."+CRLF+;
            "O certificado digital se encontra revogado."+CRLF+;
            "O certificado digital não foi enviado para o servidor."+CRLF+;
            "Muitos usuários conectados (erro raro)."
      ENDIF
      IF "The operation timed out" $ c_Bufr
         c_Bufr := STRTRAN(c_Bufr,"The operation timed out", "O tempo para a operação esgotou (The operation timed out).")
         c_Bufr := ALLTRIM(c_Bufr)+CRLF+CRLF+;
                   "Talvez a NF-e tenha sido autorizada mas não houve retorno da SEFAZ. Consulte a NF-e"+CRLF+;
                   "para se certificar disso. Se não constar na base da SEFAZ repita a transmissão."
      ENDIF
      IF "ERRO: Rejeicao: Uma NF-e da faixa ja esta inutilizada na Base de dados da SEFAZ" $ c_Bufr
         c_Bufr := "ERRO: Rejeicao: Uma NF-e da faixa ja esta inutilizada na Base de dados da SEFAZ"
      ENDIF
      SysRefresh()
      MsgErro(c_Bufr, 'Mensagem de erro do ACBrMonitor')
   endif
   return cNFELOG

function VerifyINI( _section_, _entry_, _var_, _inifile_, _grava_ )
   oIni := TIni():New( _inifile_ )
   if _grava_ = .t.
      oIni:Set( _section_, _entry_, _var_ )
   endif
   return oIni:Get( _section_, _entry_, _var_, _var_ )

************************************************************************
Function NFE_INIT(ENDERECO)   // Abre a comunicação com o ACBrmonitor
   * ENDERECO -> Diretorio ( quando usando TXT)  Ex: C:\ACBR\
   ************************************************************************
   Local P, RET := .T., TFIM, IP, PORTA, RESP

   if ! empty(sENDER)  // J  est  aberto...
      return .t.
   endif

   SEM_ERRO := .F.
   sENDER   := alltrim(ENDERECO)
   IP       := ''
   PORTA    := 0

   P := at(':',sENDER)
   if P = 0
      P := len(sENDER)+1
   endif
   IP    := substr(sENDER,1,P-1)
   if empty(IP)
      RET := .F.
   else
      PORTA := val(substr(sENDER,P+1))
      if PORTA = 0
         PORTA := 3434
      endif
      inetinit()
      RET := .F.
      TFIM := Seconds() + 5             /// Tenta conectar durante 5 segundos ///
      do while Seconds() < TFIM .and. ! RET
         sSOCKET := inetconnect(IP,PORTA)
         RET     := (ineterrorcode(sSOCKET) = 0)
         SysWait(0.2)
      enddo
   endif
   if RET
      InetSetTimeout( sSOCKET, 300 )   // Timeout de Recepção 3 seg //
      RESP := InetRecvEndBlock( sSOCKET, ETX )
      RET  := ('Conectado' $ RESP )   // Recebeu as boas vindas ?
   endif
   if ! RET
      sENDER := ''
   endif
return RET

************************************************************************
Function NFE_COMANDO(CMD,VET_PARAM,ESPERA,TENTA)
   * Funcao de uso interno para enviar os comandos e
   * registrar os erros retornados. Exibe os erros se existirem
   ************************************************************************
   Local REQ, RESP, TEMPOR, TINI, TFIM, BLOCO, BYTES, I, TIPO_PARAM

   if empty(sENDER)
      if ! SEM_ERRO
         MsgAlert('ACBrNFeMonitor n†o foi inicializado.',"Aviso")
      endif
      return ''
   endif

   DEFAULT VET_PARAM   to {} ,;
           ESPERA      to 300 ,; // 5 minutos
           TENTA       to .t.

   RET_IMP  := ''
   c_Cmmd := SUBSTR(CMD,1,AT("(",CMD)-1)
   SysRefresh()
   DEFINE DIALOG o_Hold FROM 0, 0 TO 4, 54 TITLE "Espere..."
   o_Hold:lHelpIcon := .f.
   @05,05 SAY oAguarde PROMPT 'Processando o comando: '+c_Cmmd+". Espere um momento..." SIZE 200, 24 PIXEL OF o_Hold UPDATE
   ACTIVATE DIALOG o_Hold CENTER NOWAIT

   //////// Transmitindo o comando /////////
   CMD := ALLTRIM(CMD)+CRLF+"."+CRLF // Requisitos do ACBR
   InetSetTimeout( sSOCKET, 300 )  // Timeout de Envio 3 seg //
   if inetsendall( sSOCKET, CMD ) <= 0
      RET_IMP := 'ERRO: Nao foi possivel transmitir dados para o ACBrMonitor|'+;
                 '('+AllTrim(Str(InetErrorCode( sSOCKET )))+') '+;
                 InetErrorDesc( sSOCKET ) + ETX
   endif

   TINI   := Seconds()
   do while (right(RET_IMP,1) <> ETX)
      SysRefresh()
      BLOCO := space(64)
      //////// Lendo a resposta ////////
      InetSetTimeout( sSOCKET, 300 )

      BYTES   := inetrecv(sSOCKET, @BLOCO, 64)
      RET_IMP += left(BLOCO,BYTES)

      if Seconds() > (TINI + ESPERA)
         if ! TENTA
            RET_IMP := 'ERRO: Sem resposta do ACBrMonitor em '+alltrim(str(ESPERA))+;
                       ' segundos (TimeOut)' + ETX
         else
            if ALERT('O ACBrMonitor n†o est  respondendo. '+;
                     'Deseja tentar novamente ?',{'SIM','NAO'}) # 1
               RET_IMP := 'ERRO: Sem resposta do ACBrMonitor em '+alltrim(str(ESPERA))+;
                          ' segundos (TimeOut)' + ETX
            else
               TINI := Seconds()
            endif
         endif
      endif
   enddo

   do while right(RET_IMP,1) $ CR+LF+ETX   // Remove sinalizadores do final
      RET_IMP := left(RET_IMP,len(RET_IMP)-1)
   enddo

   o_Hold:End()
return RET_IMP

************************************************************************
Function NFE_END()   // Fecha a porta da Impressora
   * Encerra a comunicacao com a impressora, nao precisa de parametros
   ************************************************************************
   if ! empty(sENDER)
      inetsendall( sSocket, 'ACBR.bye' )
   endif
   if sSOCKET <> NIL
      inetclose(sSOCKET)
      inetdestroy(sSOCKET)
      inetcleanup()
      SysWait(0.2)
      sSOCKET := NIL
   endif
   sENDER  := ''
return .t.

************************************************************************
Function NFE_ABERTA()   // Retorna .t. se a COM ja est  aberta
************************************************************************
return ! empty(sENDER)

Link to comment
Share on other sites

Ola amigos

Montei uma classe para usar a DLL da FLEXDOCS é muito mais pratico... a propria DLL monta o XML tanto para NFe como para a NFCe, voce apenas coloca os paramentros.

muito pratico mesmo.

O Custo atualmente é de R$ 100,00 por CNPJ.

Function ProcessaNFe3g( cTipoEnvio, aProd, cChaveEnvio, nModeloNfe, aDados, nTipoNFCe )
//**************************************************************************
//
// aDados = 1 -> NR DO BOLETO/DAV
//          2 -> Descrição da Venda CFOP

local cDV := ""
local nRet
Local cCmd
Local cSQL
Local aDuplicatas, k

Private aSQL

DEFAULT nModeloNfe := 55

//VERSÃO 2.0
  cSQL   := "SELECT crt, csosn FROM afirma"
  aSQL   := Array_Sql(cSQL,,,.f.,.f.,.f.)
  IF !Empty( aSQL )
     cCRT   := AllTrimStr(aSQL[1][1])
     cCSOSN := AllTrimStr(aSQL[1][2])
     IF Empty( aSQL[1][1] )
      MsgStop("Esta faltando configurar CRT","Atenção...")
      RETU
     ENDIF
  Else
     MsgStop("Esta faltando configurar CRT e CSOSN","Atenção...")
     RETU
  ENDIF

  IF Empty( USERINFO_FIRMA )

    cCmd := "Select * From afirma"
    IF !TemporarioSQL( cCmd, "Buscando Dados da Empresa", "SYSTEM" )
      RETU
    ENDIF

    aGeralIni[001] := Pad( IIF( Empty(SYSTEM->ARFIRMA ),Space(Len(SYSTEM->ARFIRMA)), DeCrypt( SYSTEM->ARFIRMA ,"jackson" ) ), Len(SYSTEM->ARFIRMA) )
    aGeralIni[114] := IIF( Empty(SYSTEM->ARFANTASIA ),"", DeCrypt( SYSTEM->ARFANTASIA,"jackson" ) )
    aGeralIni[002] := IIF( Empty(SYSTEM->ARENDFIRMA ),"", DeCrypt( SYSTEM->ARENDFIRMA,"jackson" ) )
    aGeralIni[003] := IIF( Empty(SYSTEM->ARBAIFIRMA ),"", DeCrypt( SYSTEM->ARBAIFIRMA,"jackson" ) )
    aGeralIni[005] := IIF( Empty(SYSTEM->ARCIDFIRMA ),"", DeCrypt( SYSTEM->ARCIDFIRMA,"jackson" ) )
    aGeralIni[006] := IIF( Empty(SYSTEM->ARUFDFIRMA ),"", DeCrypt( SYSTEM->ARUFDFIRMA,"jackson" ) )
    aGeralIni[004] := IIF( Empty(SYSTEM->ARCEPFIRMA ),"", DeCrypt( SYSTEM->ARCEPFIRMA,"jackson" ) )
    aGeralIni[007] := IIF( Empty(SYSTEM->ARFO1FIRMA ),"", DeCrypt( SYSTEM->ARFO1FIRMA,"jackson" ) )
    aGeralIni[008] := IIF( Empty(SYSTEM->ARFAXFIRMA ),"", DeCrypt( SYSTEM->ARFAXFIRMA,"jackson" ) )
    aGeralIni[019] := IIF( Empty(SYSTEM->ARCGCFIRMA ),"", DeCrypt( SYSTEM->ARCGCFIRMA,"jackson" ) )
    aGeralIni[020] := IIF( Empty(SYSTEM->ARINSFIRMA ),"", DeCrypt( SYSTEM->ARINSFIRMA,"jackson" ) )
    aGeralIni[160] := IIF( Empty(SYSTEM->ARI_MFIRMA ),"", DeCrypt( SYSTEM->ARI_MFIRMA,"jackson" ) )

    aGeralIni[144]  := Right( aGeralIni[002], 10 )
    aGeralIni[002]  := Left( aGeralIni[002], 60 )

  ENDIF

  IF Valtype( oDlg_Nfe ) == "O"
    oDlg_Nfe:aControls[1]:LoadImage( , [&LocalDBF\sac\bmp\icon_checked.bmp] )
    oDlg_Nfe:aControls[1]:Refresh()
  ENDIF
  SysRefresh()

  nTotalDesGrao        := 0
  nValorICMSDispensado := 0
                //0-pagto à vista;1-pagto a prazo;2-outros 
  nTpPagto    := IIF( lTemCupom, 2, IIF( cTipoEnvio $ "01|03|05","0",IIF( cTipoEnvio == "02" ,1,2)) )
  nSerie      := nNumeroSerieNfe                                //0-Unica
  nTpNF       := IIF( cTipoEnvio $ ENTRADA_PRODUTO,0,1)         //0-Entrada ;1-Saida
  nTpImp      := 1                                              //1-retrato ;2-paisagem
  nTpEmis     := 1                                              //1-Normal  ;2-Contigência
//  nFinalidade := IIF( NATOPERA->arfinalidade_cfop, 4, 1 )                    //1-Normal  ;2-Complementar;3-Ajustes;4 - Devolução/Retorno
  nTpAmb      := IIF( Alltrim(cNomeUsuario) == "Master", 2, 1 ) //1-Produção 2-Homologação

  cNatureza := Subs( Pc_StrTransform( aDados[2] ), 1, 60 )

  cLicenca     := aGeralIni[188]
  oNfe := MyNFe_NFCe():New( USERINFO_UF , AllTrimStr( nTpAmb ), cCertificado,,,,cLicenca,.t.,,LocalDBF+"\SAC" )

  oDlg_Nfe:aControls[10]:Varput( Elaptime( cTime_NFe, Time() ) )
  oDlg_Nfe:aControls[10]:Refresh()

  //Identificação da NFe
  WITH OBJECT oNfe

    :cNf      := val( aDados[1] )    //Informar o código numérico que compõe a Chave de Acesso. Número aleatório gerado pelo emitente para cada NF-e para evitar acessos indevidos da NF-e.
    :nMod     := nModeloNfe                  //Modelo 55 ou 65
    :nSerie   := nSerie                      //Serie da NFe
    If :nMod == 55
      :nNFe     := val(VMNFISCA_NOTA)          //Numero da NFe
    Else

      MsgGet( , "Numero da NFe/NFCe", @nNumeroNFe, , '@9' )
      :nNFe := nNumeroNFe

    EndIf

    :nTpNf    := nTpNF

    :nTpEmis  := nTpEmis    //informar o código da forma de emissão:
                            //1 - Emissão normal (não em contingência);
                            //2 - Contingência FS-IA, com impressão do DANFE em formulário de segurança;
                            //3 - Contingência SCAN (Sistema de Contingência do Ambiente Nacional) Desativação prevista para 30/06/2014;
                            //4 - Contingência DPEC (Declaração Prévia da Emissão em Contingência);
                            //5 - Contingência FS-DA, com impressão do DANFE em formulário de segurança;
                            //6 - Contingência SVC-AN (SEFAZ Virtual de Contingência do AN);
                            //7 - Contingência SVC-RS (SEFAZ Virtual de Contingência do RS);
                            //9 - Contingência off-line da NFC-e (as demais opções de contingência são válidas também para a NFC-e);
                            //Nota 1: Para a NFC-e somente estão disponíveis e são válidas as opções de contingência 5 e 9.
                            //Nota 2: SVC-AN e SVC-RS substituem o SCAN - NT 2013/007.

    //Geração da Chave pelo Sistema
    :CriaChaveAcesso_Nfe()
    If :Consulta_NFe()
      If !File( :aRetornoXml['arquivo'] ) .AND. MsgYesNo( "Esta NFe já foi enviada mais o XML não foi encontrado"+CRLF+"Gostaria de Baixar o XML ?","Atenção..." )

        If !:DownLoadXml_NFe( :aRetornoXml['chave'] )
          MsgStop( "Impossivel Baixar XML da "+IIF( :nMod == 55, 'NFe', 'NFCe' ),"Atenção..." )
          Retu
        Endif

      Endif
      GerarDanfeFast( :aRetornoXml['chave'], :aRetornoXml['protocolo'], :aRetornoXml['recibo'], :aRetornoXml['arquivo'] )
      Retu
    Endif

    :cNatOp   := cNatureza

    :cMunFG   := RetCodMunIBGE( Pc_StrTransform(USERINFO_CIDADE), USERINFO_UF )
    :cNFref   := ''

    :nIndPag  := nTpPagto       //informar o indicador da forma de pagamento:
                                //0 - pagamento à vista;
                                //1 - pagamento à prazo;
                                //2 - outros.

    IF !lExporta .AND. !lImporta
      :nIdDest  := IIF( USERINFO_UF == VM_UFCLI_CLIE, 1, 2 )  //Informar o identificador de local de destino da operação:
    Else                                                      //1 - Operação interna;
      :nIdDest  := 3                                          //2 - Operação interestadual;
    Endif                                                     //3 - Operação com exterior.

    :nTpImp   := IIF( :nMod == 55, 1, 4 )              //informar o formato de impressão do DANFE: 
                                //0 - Sem geração de DANFE;
                                //1 - DANFE normal, Retrato;
                                //2 - DANFE normal, Paisagem;
                                //3 - DANFE Simplificado;
                                //4 - DANFE NFC-e;
                                //5 - DANFE NFC-e em mensagem eletrônica (o envio de mensagem eletrônica pode ser 
                                //    feita de forma simultânea com a impressão do DANFE; 
                                //    usar o tpImp - 5 quando esta for a única forma de disponibilização do DANFE
    
    :nTpAmb   := nTpAmb         //informar o código de identificação do Ambiente:
                                //1 - Produção;
                                //2 - Homologação

    //NFCe deve ser somente 1
    :nFinNFe  := nFinalidade    //infformar o código da finalidade de emissão da NF-e: 
                                //1 - NF-e normal;
                                //2 - NF-e complementar;
                                //3 - NF-e de ajuste;
                                //4 - Devolução/Retorno.
    //NFCe deve ser somente 1
    If :nMod == 65
      :nIndFinal := 1           //informar o indicador de operação com Consumidor final:
    Else                        //0 - Não;
      :nIndFinal := 1           //1 - Consumidor final (sempre para NFCe)
    EndIF

    //NFCe deve ser somente 1 ou 4
    //Sendo que quando for 4 deve informar o TRANSPORTADOR
    :nIndPres := 1              //Informar o indicador de presença do comprador no estabelecimento comercial no momento da operação: 
                                //0 - Não se aplica (por exemplo, Nota Fiscal complementar ou de ajuste);
                                //1 - Operação presencial;
                                //2 - Operação não presencial, pela Internet;
                                //3 - Operação não presencial, Teleatendimento;
                                //4 - NFC-e em operação com entrega a domicílio;
                                //9 - Operação não presencial, outros

    :nProcEmi := 0              //informar o código de identificação do processo de emissão da NF-e: Identificador do processo de emissão da NF-e:
                                //0 - emissão de NF-e com aplicativo do contribuinte

    :cVerProc := "Ontop 4.0"

    If :nMod == 65
      :cDhSai := NIL
    Endif
    
//Tenho que adcionar
  IF VMNFE_ECOMPLEM
//   oNFe:SetValue("ide"   , 'refNFe', VMNFE_COMPLEME )
  ENDIF

    :Identifica_NFe()

    ***:
    ********  Dados do Emitente ******************************************************************
    ***:
    :CNPJ_Emi    := R_CnpjLienar(USERINFO_CNPJ)
    :xNome_Emi   := ClearChar(USERINFO_FIRMA, { '&' } )
    :xFant_Emi   := ClearChar(USERINFO_FANTASIA, { '&' } )
    :xLgr_Emi    := ClearChar(USERINFO_ENDERECO, { '&' } )
    :nro_Emi     := USERINFO_NR_END
    :xBairro_Emi := USERINFO_BAIRRO
    :cMun_Emi    := RetCodMunIBGE( Pc_StrTransform(USERINFO_CIDADE), USERINFO_UF )
    :xMun_Emi    := USERINFO_CIDADE
    :CEP_Emi     := ClearChar(USERINFO_CEP,{"-","."})
    :fone_Emi    := ClearChar(USERINFO_TELEFONE ,{"(",")","-"," "} )
    :IE_Emi      := ClearChar(USERINFO_INSCEST ,{".","-"}) 
    :CRT_Emi     := oSystema:CRT

    :Emitente_NFe()

    ***:
    ********  Dados do Destinatário ******************************************************************
    ***:

    IF !lExporta .AND. !lImporta
      IF Len( Alltrim(cnpj_cpf_CLIE) ) > 11
        //:CNPJ_Dest          := IIF( :nTpAmb == 2, '99999999000191', R_CnpjLienar(cnpj_cpf_CLIE) )  // CPF ou CNPJ
        :CNPJ_Dest          := R_CnpjLienar(cnpj_cpf_CLIE)  // CNPJ
      Else
        :CPF_Dest           := R_CPFLienar(cnpj_cpf_CLIE) // CPF
      Endif

      IF RetCodMunIBGE( VMCIDCLI_CLIE , VM_UFCLI_CLIE ) == "" .AND. :nMod == 55
        MsgInfo("O Municipio do Destinatário não foi encontrado","Atenção")
        RETU .F.
      Endif

    Else
      :CNPJ_Dest          := ''                                    // CPF ou CNPJ
      :idEstrangeiro_Dest := ClearChar( VM_CICLI_CLIE, { " " } )   //DOCUMENTO DO ESTRANGEIRO
    EndIF

    :xNome_Dest         := IIF( nTpAmb == 2, 'NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL', Pc_StrTransform( VMNOMCLI_CLIE)+"("+cCodigo+") " ) // Razão Social
    :xLgr_Dest          := Pc_StrTransform( VMENDCLI_CLIE )
    :nro_Dest           := IIF( Empty(VMNUMEND_CLIE), "S/N", Alltrim(VMNUMEND_CLIE) ) // Numero do Endereço  
    :xBairro_Dest       := VMBAICLI_CLIE                                              // Bairro
    :cMun_Dest          := IIF( lExporta .OR. lImporta, "9999999", RetCodMunIBGE( VMCIDCLI_CLIE , VM_UFCLI_CLIE ) ) // Código do IBGE do Municipio
    :xMun_Dest          := Alltrim( IIF( lExporta .OR. lImporta, "EXTERIOR", VMCIDCLI_CLIE ) )                      // Municipio 
    :UF_Dest            := IIF( lExporta .OR. lImporta, "EX", VM_UFCLI_CLIE )                                       // Estado

    IF lExporta .OR. lImporta
      :CEP_Dest           := ''
    Else
      :CEP_Dest           := IIF( Empty( VMCEPCLI_CLIE ), '69306000', ClearChar( VMCEPCLI_CLIE, {"-","."})  )         // CEP
    EndIF

    :cPais_Dest         := IIF( lExporta .OR. lImporta, VMCDPAIS_NOTA, RetCodPaisIBGE())    //Default := Brasil     // Código do IBGE do Pais
    :xPais_Dest         := IIF( lExporta .OR. lImporta, VMNMPAIS_NOTA, "Brasil" )         // Pais
    :fone_Dest          := ClearChar( VMTELCLI_CLIE ,{"-","(",")"," "})                     // Telefone
    :IE_Dest            := ''

    IF !lExporta
      IF :nMod == 65                                                  // Indicador da IE do Destinatário, informar:
        :indIEDest_Dest     :=  '9'                                   //1 - Contribuinte ICMS (informar a IE do destinatário);
      Else                                                            //2 - Contribuinte isento de Inscrição no cadastro de Contribuintes do ICMS;
        If !lExporta .AND. !lImporta .AND. VMTIPCLI_CLIE == 'J'       //9 - Não Contribuinte, que pode ou não possuir Inscrição Estadual no Cadastro de Contribuintes do ICMS.
          If Upper( Alltrim( VMINSCLI_CLIE ) ) == 'ISENTO'            //Nota 1: No caso de NFC-e informar indIEDest=9 e não informar a tag IE do destinatário;
            :indIEDest_Dest := '9'                                    //Nota 2: No caso de operação com o Exterior informar indIEDest=9 e não informar a tag IE do destinatário; 
          Else                                                        //Nota 3: No caso de Contribuinte Isento de Inscrição (indIEDest=2), não informar a tag IE do destinatário.
            :indIEDest_Dest := '1'
            :IE_Dest        := ClearChar( VMINSCLI_CLIE ,{".","-"} ) 
          Endif
        Else
          :indIEDest_Dest := '9'
        Endif
      Endif
    Else
      :indIEDest_Dest := '9'
    Endif

    :IESUF_Dest         := ''
    :IM_Dest            := ''
    :eMail_Dest         := ClearChar( VMEMAILL_CLIE ,{"-","(",")"," "} ) //email do cliente

    :Destinatario_NFe()

    IF lExporta
      :UFSaidaPais_export := USERINFO_UF      // UF do local de embarque
      :xLocEmbarq_export  := VMLOC_EMBARQUE   // Local de embarque
      :Exporta_NFe()
    ENDIF

    ***:
    ********  Dados do Transporte ******************************************************************
    ***:

    If :nMod == 55 //NFe

      If !Empty( VMCGCTRA_NOTA )
        VMCGCTRA_NOTA := ClearChar( VMCGCTRA_NOTA, { '.','-','/' } )
        IF Len( Alltrim(VMCGCTRA_NOTA) ) > 11
          :tadora_CNPJ    := R_CnpjLienar( VMCGCTRA_NOTA )
          :tadora_IE      := alltrim(clearChar(VMINSTRA_NOTA,{".","-"} ) )
        Else
          :tadora_CPF     := R_CnpjLienar( VMCGCTRA_NOTA )
        Endif

        :tadora_xNome   := Pc_StrTransform( VMNOMTRA_NOTA ) 
        :tadora_xEnder  := Pc_StrTransform( VMENDTRA_NOTA )
        :tadora_xMun    := Pc_StrTransform( VMCIDTRA_NOTA )
        :tadora_UF      := VMUFPTRA_NOTA
        :TransPortadora_Nfe()

        :veic_placa     := clearChar(VMPLAC_TRATOR,{".","-"} )
        :veic_UF        := VMUF_TRATOR
        :veic_RNTC      := VMRNTC_TRATOR
        :VeiculoTransporte_Nfe()

        :reboq_placa     := clearChar( VMPLAC_DOLLY ,{".","-"} )
        :reboq_UF        := VMUF_DOLLY
        :reboq_RNTC      := VMRNTC_DOLLY
        :ReboqueTransporte_Nfe()

        cLacres := Alltrim( VMLACRES_DOLLY )
        :LacresTransporte_Nfe( cLacres )

        :vol_qVol   := VMQTDTRA_NOTA
        :vol_esp    := VMESPTRA_NOTA
        :vol_marca  := VMMARTRA_NOTA
        :vol_nVol   := VMNUMTRA_NOTA
        :vol_pesoL  := VMPBRTRA_NOTA
        :vol_pesoB  := VMPLQTRA_NOTA
        :VolumesTransporte_Nfe()

      Endif

      :modFrete_transp   := VMTIPFRE_NOTA
      :TransPortador_Nfe()

      IF VMNFE_EGOVERNO
        :xNEmp_comp :=  VMEMPE_GOVERNO
        :xCont_comp :=  VMCONT_GOVERNO
        :xPed_comp  :=  VMPEDI_GOVERNO
        :Compra_Nfe()
      ENDIF

    ElseIf :nMod == 65 //NFCe

      :modFrete_transp := 9

      If :nIndPres == 4

//        :tadora_CNPJ    := '00000000000191'
        :tadora_CPF     := '19972407268'
        :tadora_xNome   := 'Transportadora Rapida Ltda'
//        :tadora_IE      := '240030836'
        :tadora_xEnder  := 'Av. Dr Altino Arantes, 131 - Centro'
        :tadora_xMun    := 'Ourinhos'
        :tadora_UF      := 'RR'
        :TransPortadora_Nfe()

      Endif

      :TransPortador_Nfe()

    Endif

  END WITH

/*
  // Carrega Itens da NFe
  nTotalDaNFe          := 0
  nTotalDescNFe        := 0
  nTotalDesGrao        := 0
  nBaseICMSNFe         := 0
  nValorICMSNFe        := 0
  nValorICMSDispensado := 0
  nValorBaseICMSDispensado := 0
  nValorIsentosNFe     := 0
  nBaseSubs            := 0
  nValoBaseST          := 0
  nValorPis            := 0
  nValorCoffins        := 0
  nTotalDoFrete        := 0
  nTotalDoSeguro       := 0
  nTotalDoOutros       := 0
  nTotal_II            := 0
  nTotal_Impostos      := 0
  aSoma_Liquidos       := {}
*/

  lRodapePercenIcmsSimplesNacional   := .T.
  lRodapeIcmsIsento                  := .T.
  lRodapePisCofinsLei                := .T.
  nTotalProdutosNFe_Simples_Nacional := 0

  oDlg_Nfe:aControls[10]:Varput( Elaptime( cTime_NFe, Time() ) )
  oDlg_Nfe:aControls[10]:Refresh()
  MsgRun( "Processando itens da NFe/NFCe","Aguarde...", { || LoadItens3g( oNFe, aProd, cTipoEnvio ) } )

  oDlg_Nfe:aControls[10]:Varput( Elaptime( cTime_NFe, Time() ) )
  oDlg_Nfe:aControls[10]:Refresh()

  WITH OBJECT oNFe
       //Carrega Duplicatas
      IF _FATURA_AUTOMATICA_NOTA_FISCAL .AND. BOLETOS->artpvend == '02'
        GeraFaturaAutoMatica( BOLETOS->arnrdoct, :vST_tIcms + :vProd_tIcms , , 0, :vST_tIcms )
      Endif
    
      cCmd := "Select CONCAT( arsequen, arcontro,'-',arparcel ) AS nr_fatura, ardtvenc AS data_venc, arvrdupl AS valor, CONCAT( arsequen, arcontro ) FROM re04 WHERE CONCAT( arsequen, arcontro ) = '"+BOLETOS->arfatura+"' AND arcodcli = '"+BOLETOS->arcodcli+"'"
      aDuplicatas := Array_Sql( cCmd )

      If !Empty( aDuplicatas )
        nVal_Dup := 0
        FOR k=1 TO Len( aDuplicatas )
          :nDup_dup  := aDuplicatas[ k, 1 ]
          :dVenc_dup := aDuplicatas[ k, 2 ]
          :vDup_dup  := aDuplicatas[ k, 3 ]
          nVal_Dup += :vDup_dup
          :Duplicata_NFe()
        Next
        :nFat_cob   := aDuplicatas[ 1, 4 ]
        :vOrig_cob := nVal_Dup
        :Cobranca_NFe()
      Endif

      If :nMod == 65
        //Formas de Pagamentos somente para NFCe em PRODUÇÃO

/*
01=Dinheiro
02=Cheque
03=Cartão de Crédito
04=Cartão de Débito
05=Crédito Loja
10=Vale Alimentação
11=Vale Refeição
12=Vale Presente
13=Vale Combustível
99=Outros.
*/
        cCmd := "Select artpvend, arvrvend FROM esto_53 WHERE arnrdoct = ?"
        aPagamentos := Array_SQL( cCmd,,{ BOLETOS->arnrdoct })
        IF Empty( aPagamentos )
          aPagamentos :={{ BOLETOS->artpvend, BOLETOS->arvrvend }}
        EndIf
        
        FOR k=1 TO Len( aPagamentos )

          If aPagamentos[k,1] == '01'
            :tPag   := '01'
          ElseIf aPagamentos[k,1] == '05'
            :tPag   := '02'
          ElseIf aPagamentos[k,1] $ '03|25'
            :tPag   := '03'
          ElseIf aPagamentos[k,1] == '02'
            :tPag   := '05'
          Else
            :tPag   := '99'
          Endif

          :vPag   := aPagamentos[k,2]
          :Pagamento_Nfe()
    
        Next

      Endif

  END WITH

   // Rodapé - Informações Adicionais
  cDadosAdcionais :=  Alltrim(Pc_StrTransform( StrTran( StrTran( VMINFO_ADCIONAL, Chr(13), ';' ), Chr(10), "" ) ))

  IF !Empty( nTotalDesGrao )
// Desconto concedido Conforme Lei 215/98
    cDadosAdcionais += ";Desconto concedido Conforme Lei 215/98;Total desconto "+cCooperativa+" R$ "+Alltrim( Trans( nTotalDesGrao,"@E 99,999,999.99" ) )
  ENDIF

  IF cCRT == '1' .AND. oSystema:PercenIcmsSimplesNacional > 0 .AND. lRodapePercenIcmsSimplesNacional
      nPercenIcmsSimplesNacional := 0
      IF oSystema:lPercenIcmsSimplesNacional_TotalNota
        nPercenIcmsSimplesNacional := Round( VMTTNFIS_NOTA * ( oSystema:PercenIcmsSimplesNacional / 100 ), 2 )
      Else
        nPercenIcmsSimplesNacional := Round( nTotalProdutosNFe_Simples_Nacional * ( oSystema:PercenIcmsSimplesNacional / 100 ), 2 )
      EndIF
      cDadosAdcionais += ';NFe Emitida por Empresa optante do SIMPLES NACIONAL permitindo aproveitamento de credito de;ICMS Valor R$ '+;
      Alltrim( Trans( nPercenIcmsSimplesNacional, "@E 99,999,999.99" ) )+" Correpondente a aliquota de "+AllTrimStr( oSystema:PercenIcmsSimplesNacional )+" %, nos termos do Art. 23 da LC 123/2006"
  EndIf

  IF !Empty( nValorICMSDispensado ) .AND. lRodapeIcmsIsento
      cDadosAdcionais += ';ICMS DISPENSADO DO VALOR DA NOTA FISCAL R$ '+Trans( nValorBaseICMSDispensado, "@E 99,999,999.99" )+' X 17% = ( '+Trans( nValorICMSDispensado, "@E 99,999,999.99" )+') Correspondente ao Valor do ICMS) '
  EndIf

  cDadosAdcionais := StrTran( cDadosAdcionais, ';;',';' )
  cDadosAdcionais := StrTran( cDadosAdcionais, ';;',';' )

/* a fazer
  For k=1 To Len( aSoma_Liquidos )
    cDadosAdcionais += ";"+Pad( aSoma_Liquidos[k,1], 50 ) +" Qtd.:"+Trans( aSoma_Liquidos[k,2], "@E 999,999,999.999" )+" R$.:"+Trans( aSoma_Liquidos[k,3], "@E 999,999,999.99" )
  Next
*/

  IF oSystema:lLeiDaTransparencia .AND. !VMIMPORTACAO
    nPercenImposto := " ("+AlltrimStr( Round( ( oNFe:vTotTrib_ticms / ( Round( oNFe:vNF_tIcms, 2 ) ) ) * 100 , 2 ) )+"%)"
//    cDadosAdcionais += "Valor aprox. de Tributos R$"+AlltrimStr( oNFe:vTotTrib_ticms )+nPercenImposto
  EndIf

  oNFe:infCpl_infAdi := cDadosAdcionais

  oNFe:Inf_Adicionais_NFe()
  oNFe:ConsolidaXml_Nfe()

  IF Valtype( oDlg_Nfe ) == "O"
    oDlg_Nfe:aControls[2]:LoadImage( , [&LocalDBF\sac\bmp\icon_checked.bmp] )
    oDlg_Nfe:aControls[2]:Refresh()
    oDlg_Nfe:aControls[3]:LoadImage( , [&LocalDBF\sac\bmp\icon_checked.bmp] )
    oDlg_Nfe:aControls[3]:Refresh()
  ENDIF
  SysRefresh()

  oDlg_Nfe:aControls[10]:Varput( Elaptime( cTime_NFe, Time() ) )
  oDlg_Nfe:aControls[10]:Refresh()

  nRet := 0
  cMenssagem := ''
  MemoWrit( 'Consolida_ident.xml', oNFe:oMyNfe:IdentaXML( oNFe:aRetornoXml['consolida'], @nRet, @cMenssagem ), .F. )

  If  oNFe:ValidaXml_Nfe()

    IF Valtype( oDlg_Nfe ) == "O"
      oDlg_Nfe:aControls[4]:LoadImage( , [&LocalDBF\sac\bmp\icon_checked.bmp] )
      oDlg_Nfe:aControls[4]:Refresh()
      oDlg_Nfe:aControls[10]:Varput( Elaptime( cTime_NFe, Time() ) )
      oDlg_Nfe:aControls[10]:Refresh()
    ENDIF
    SysRefresh()

    nRet := 0
    cMenssagem := ''
    MemoWrit( 'Sem_assinado_ident.xml', oNFe:oMyNfe:IdentaXML( oNFe:aRetornoXml['consolida'], @nRet, @cMenssagem ), .F. )
    MemoWrit( 'assinado_ident.xml', oNFe:oMyNfe:IdentaXML( oNFe:aRetornoXml['assinado'], @nRet, @cMenssagem ), .F. )
    MemoWrit( 'assinado.xml', oNFe:aRetornoXml['assinado'], .F. )

    IF oNFe:Envia_NFe()

      MemoWrit( 'Autorizada_ident_'+AllTrimStr( oNFe:nNFe )+'.xml', oNFe:oMyNfe:IdentaXML( oNFe:aRetornoXml['autorizada'], @nRet, @cMenssagem ), .F. )
      If oNFe:nMod == 65

        If Alltrim(cNomeUsuario) == "Master"
          oSystema:End_Qrcode_Nfce := 'http://200.174.88.103:8080/nfce/servlet/qrcode'
        Endif
        oNFe:url_idToken := oSystema:Id_Csc_Nfce
        oNFe:url_Token   := oSystema:Csc_Cli_Nfce
        oNfe:url_ws      := oSystema:End_Qrcode_Nfce
        oNFe:GeraUrl_NFCe()

/*
        ? ProcName(), oNfe:url_ws
        oCode := TCodeBars():New(305,305,3,3,14, oNFe:aRetornoXml['url'], 0 )
        oCode:Build()
        oCode:SaveToBmp( 'QrCode.JPG', 2 )
        oCode:End()
*/

        cCmd := "UPDATE nota_nfce SET arcodopr = ?, arcodcli = ?, archanfe = ?, arrecnfe = ?, ardtrnfe = ?, ar_xml = ?, ar_url_qrcode = ? WHERE sr_recno = ?"
        Array_SQL( cCmd,,{ NATOPERA->arcodopr, BOLETOS->arcodcli, oNFe:aRetornoXml['chave'], oNFe:aRetornoXml['protocolo'], oNFe:aRetornoXml['recibo'], oNFe:aRetornoXml['autorizada'], oNfe:url_ws, oNFe:nNFe })

      EndIf

      IF Valtype( oDlg_Nfe ) == "O"
        oDlg_Nfe:aControls[5]:LoadImage( , [&LocalDBF\sac\bmp\icon_checked.bmp] )
        oDlg_Nfe:aControls[5]:Refresh()
        oDlg_Nfe:aControls[10]:Varput( Elaptime( cTime_NFe, Time() ) )
        oDlg_Nfe:aControls[10]:Refresh()
      ENDIF
      SysRefresh()
      GerarDanfeFast( oNFe:aRetornoXml['chave'], oNFe:aRetornoXml['protocolo'], oNFe:aRetornoXml['recibo'], oNFe:aRetornoXml['arquivo'] ,       ,       , cTipoEnvio,                ,         ,nModeloNfe, nTipoNFCe, oNFe:aRetornoXml['url'] )

      ? "Autorizada com Sucesso", oNFe:aRetornoXml['recibo'], oNFe:aRetornoXml['protocolo']

    Endif


  Else

    ? "Nfe não validada corretamente"

  Endif

/*
  //Exportacao
  IF lExporta
    oNFe:SetValue("exporta"  , "UFEmbarq"   , USERINFO_UF )   // UF do local de embarque
    oNFe:SetValue("exporta"  , "xLocEmbarq" , VMLOC_EMBARQUE )   // Local de embarque
  ENDIF

//  nTotalDeconto       := IIF( _aIcms[10]+nTotalDesGrao > 0, ((nTotalDaNFe - _aIcms[10])+IIF( lTemCupom, 0, nTotalDesGrao ) ), 0 )
  nTotalDeconto       := nTotalDesGrao + nTotalDescNFe
  nTotalProdutosNFe   := ( nTotalDaNFe-nTotalDeconto )
  nDescontoBaseIcms   := Round( nTotalProdutosNFe / (nTotalDaNFe-nTotalDeconto), 16 )

  nBaseICMSNFe  *= IIF( !Empty( nDescontoBaseIcms ), nDescontoBaseIcms, 1 )
  nValorICMSNFe *= IIF( !Empty( nDescontoBaseIcms ), nDescontoBaseIcms, 1 )

  // Totais da NF
  oNFe:SetValue("total" , "vBC"     , nBaseICMSNFe  )                 // Base de Cálculo do ICMS
  oNFe:SetValue("total" , "vICMS"   , nValorICMSNFe )                 // Valor do ICMS
  oNFe:SetValue("total" , "vBCST"   , nBaseSubs  )                    // Base de Cálculo do ICMS Substituição
  oNFe:SetValue("total" , "vST"     , nValoBaseST  )                  // Valor do ICMS Substituição
  oNFe:SetValue("total" , "vProd"   , nTotalDaNFe )                   // Valor Total dos Produtos
  oNFe:SetValue("total" , "vFrete"  , nTotalDoFrete )                 // Valor do Frete
  oNFe:SetValue("total" , "vSeg"    , nTotalDoSeguro )                // Valor do Seguro
  oNFe:SetValue("total" , "vDesc"   , nTotalDeconto )                 // Desconto
  oNFe:SetValue("total" , "vII"     , nTotal_II  )                    // Valor Isento
  oNFe:SetValue("total" , "vIPI"    , 0 )                             // Valor do IPI
  oNFe:SetValue("total" , "vPIS"    , nValorPis )                     // Valor do PIS
  oNFe:SetValue("total" , "vCOFINS" , nValorCoffins )                 // Valor do COFINS
  oNFe:SetValue("total" , "vOutro"  , nTotalDoOutros )                            // Outras Despesas
  oNFe:SetValue("total" , "vNF"     , nTotalProdutosNFe+nValoBaseST+nTotalDoFrete+nTotalDoSeguro+nTotalDoOutros+IIF( oSystema:Importadora .AND. VMIMPORTACAO, (nValorPis+nValorCoffins)-nValoBaseST, 0 ) ) // Total da Nota

  IF oSystema:lLeiDaTransparencia
    oNFe:SetValue("total" , "vTotTrib" , nTotal_Impostos )              // Lei da Transparencia
  ENDIF

  VMVRICMS_NOTA     := nValorICMSNFe
  VMTTICMS_NOTA     := nBaseICMSNFe
  VMVRBASESUB_NOTA  := nBaseSubs
  VMVRICMSSUB_NOTA  := nValoBaseST
  VMVRISENTOS_NOTA  := nValorIsentosNFe
  VMVRPIS_NOTA      := nValorPis
  VMVRCOFINS_NOTA   := nValorCoffins
  VMTTNFIS_NOTA     := nTotalProdutosNFe+nValoBaseST+nTotalDoFrete+nTotalDoSeguro+nTotalDoOutros
  VMDESCONT_NF_NOTA := nTotalDeconto
  VMPRODUTO_NF_NOTA := nTotalDaNFe

  oNotaDbf:Save() 

  BOLETOS->( SR_dBRefresh() )
  BOLETOS->( dBLockRec() )
  SR_BeginTransaction()
  REPLA   BOLETOS->arvsubst_tri WITH nValoBaseST,;
          BOLETOS->aremisnf WITH Date()
  BOLETOS->( dBCommit() )
  BOLETOS->( GravaMD5() )
  dBCommitAll() ; SR_CommitTransaction() ; SR_EndTransaction() ; SR_dBRefresh()

   //Carrega Duplicatas
  IF _FATURA_AUTOMATICA_NOTA_FISCAL .AND. BOLETOS->artpvend == '02'
    GeraFaturaAutoMatica( BOLETOS->arnrdoct, nTotalProdutosNFe+nValoBaseST, , 0, nValoBaseST )
  ENDIF

  LoadDuplicatas( oNFe )

   // Rodapé - Informações Adicionais
  cDadosAdcionais :=  Alltrim(Pc_StrTransform( StrTran( StrTran( VMINFO_ADCIONAL, Chr(13), ';' ), Chr(10), "" ) ))

  IF !Empty( nTotalDesGrao )
// Desconto concedido Conforme Lei 215/98
    cDadosAdcionais += ";Desconto concedido Conforme Lei 215/98;Total desconto "+cCooperativa+" R$ "+Alltrim( Trans( nTotalDesGrao,"@E 99,999,999.99" ) )
  ENDIF

  IF cCRT == '1' .AND. oSystema:PercenIcmsSimplesNacional > 0 .AND. lRodapePercenIcmsSimplesNacional
      nPercenIcmsSimplesNacional := 0
      IF oSystema:lPercenIcmsSimplesNacional_TotalNota
        nPercenIcmsSimplesNacional := Round( VMTTNFIS_NOTA * ( oSystema:PercenIcmsSimplesNacional / 100 ), 2 )
      Else
        nPercenIcmsSimplesNacional := Round( nTotalProdutosNFe_Simples_Nacional * ( oSystema:PercenIcmsSimplesNacional / 100 ), 2 )
      EndIF
      cDadosAdcionais += ';NFe Emitida por Empresa optante do SIMPLES NACIONAL permitindo aproveitamento de credito de;ICMS Valor R$ '+;
      Alltrim( Trans( nPercenIcmsSimplesNacional, "@E 99,999,999.99" ) )+" Correpondente a aliquota de "+AllTrimStr( oSystema:PercenIcmsSimplesNacional )+" %, nos termos do Art. 23 da LC 123/2006"
  EndIf

  IF !Empty( nValorICMSDispensado ) .AND. lRodapeIcmsIsento
      cDadosAdcionais += ';ICMS DISPENSADO DO VALOR DA NOTA FISCAL R$ '+Trans( nValorBaseICMSDispensado, "@E 99,999,999.99" )+' X 17% = ( '+Trans( nValorICMSDispensado, "@E 99,999,999.99" )+') Correspondente ao Valor do ICMS) '
  EndIf

  cDadosAdcionais := StrTran( cDadosAdcionais, ';;',';' )
  cDadosAdcionais := StrTran( cDadosAdcionais, ';;',';' )

  For k=1 To Len( aSoma_Liquidos )
    cDadosAdcionais += ";"+Pad( aSoma_Liquidos[k,1], 50 ) +" Qtd.:"+Trans( aSoma_Liquidos[k,2], "@E 999,999,999.999" )+" R$.:"+Trans( aSoma_Liquidos[k,3], "@E 999,999,999.99" )
  Next

  IF oSystema:lLeiDaTransparencia
    nPercenImposto := " ("+AlltrimStr( Round( ( nTotal_Impostos / ( Round( nTotalProdutosNFe+nValoBaseST, 2 ) ) ) * 100 , 2 ) )+"%)"
    cDadosAdcionais += "Valor aprox. de Tributos R$"+AlltrimStr( nTotal_Impostos )+nPercenImposto
  EndIf

  oNFe:SetValue("infAdic","infCpl" , cDadosAdcionais )                // Informações Adicionais
  oNFe:SetValue("compra", "xPed" , BOLETOS->arnrdoct )                // 0-Emitente; 1=Destinatario

  cDocXml := ""

  IF oNFe:GerarXml( @cDocXml )

    IF lMatricial
      RETU oNfe
    ENDIF

    IF Valtype( oDlg_Nfe ) == "O"
      oDlg_Nfe:aControls[2]:LoadImage( , [&LocalDBF\sac\bmp\icon_checked.bmp] )
      oDlg_Nfe:aControls[2]:Refresh()
      Sysrefresh()
    ENDIF

    // faz validação e envio do XML para Sefaz
    cXmlAssinado := ""
    cRecibo      := ""
    cRecebimento := ""
    nRet := 0
    cFileXmlNFe := ""

    IF GetKeyState( VK_CONTROL )
      IF !MsgYesNo("Continua a Emissão Desta Nota","OK" )
        retu .f.
      ENDIF
    ENDIF

    IF EnviaSefaz2g( cDocXml, cTpAmb, Nil, oNFe:cChvAcesso, @cXmlAssinado, @cFileXmlNFe )

        VMXML_NFE := cXmlAssinado
        oNotaDbf:Save()
        cChaveEnvio := oNFe:cChvAcesso

        GerarDanfeFast( oNFe:cChvAcesso, cRecibo, cRecebimento, cFileXmlNFe, , , cTipoEnvio )

    ENDIF

  ENDIF
*/

return( .t. )
Link to comment
Share on other sites

Uso uma classe. Os envios são por xmls

#include "Fivewin.ch"
#Include "TsSay.ch"

FUNCTION ACBR_NFE_IMPRIMIR(f_cFileXmlName)
  Local oAcbrNfeMonitor, lImprimido := .F.
  
  oAcbrNfeMonitor := AcbrNFeMonitor():New()
  lImprimido := oAcbrNfeMonitor:AcbrNfe_ImprimirDanfe(f_cFileXmlName)
  oAcbrNfeMonitor:End()

RETURN lImprimido

/// CONFIG_TERMINAL_VARS_UPDATE()
/// https://homologacao.nfe.fazenda.sp.gov.br/nfeweb/services/NfeStatusServico2.asmx
/// https://nfe.sefaz.sp.gov.br/nfe/services/NfeStatusServico

Class AcbrNFeMonitor

  Data oDb_Semaforo
  
  Data cComando
  Data cCaminhoAcbrLocal, cCaminhoAcbrRede, cCaminhoAcbrFound
  Data cCaminhoAcbrXmlConfigEnvioResposta
  Data cCaminhoAcbrConfigComandos, cCaminhoAcbrXmlConfigNormal, cCaminhoAcbrXmlConfigCancelado
  Data cCaminhoAcbrXmlConfigInutilizados, cCaminhoAcbrXmlConfigPdf
  Data nHandleFileEntrada, nHandleFileretorno

  Data cSefazEnvio_TpAmb, cSefazEnvio_CStat, cSefazEnvio_XMotivo, cSefazEnvio_Data, cSefazEnvio_Horas
  Data cSefazRetorno_NRec, cSefazRetorno_TpAmb, cSefazRetorno_CStat, cSefazRetorno_XMotivo
  Data cSefazNFeProtocolo, cSefazDigitoValor

  Data aNFesManifesto, cUltimoNSU
  
  Data aPrintersInstalados, cPrinterDefault

  Data lRetornoOk, cRetornoTxt
  
  Method New() Constructor 
  Method End()
  
  Method AcbrNFe_ConsultarNFe(f_cFileXmlName)
  Method AcbrNFe_ConsultaNFeDest(f_cCnpj,f_cUltNSU)
  Method AcbrNFe_ManifestoDestinatario(f_cCnpj,f_cDanfeChave)

  Method AcbrNFe_EnviaComando()
  method AcbrNFe_EsperaResposta()
  Method AcbrNFe_StatusServico()
  
  Method AcbrNFe_Validar(f_cFileXmlName)
  Method AcbrNFe_Assinar(f_cFileXmlName)
  Method AcbrNFe_Transmitir(f_cFileXmlName)
  
  Method AcbrNfe_Cancelar(f_cChaveDanfe,f_cJustificativa,f_cCnpj)
  
  Method AcbrNfe_ImprimirDanfe(f_cFileXmlName)
  Method AcbrNFe_ImprimirDanfePdf(f_cFileXmlName)
  Method AcbrNfe_ImprimirEvento(f_cFileXmlEvento,f_cFileXmlNFe)
  Method AcbrNfe_ImprimirEventoPdf(f_cFileXmlEvento)
  
  Method AcbrNFe_DownLoadNFe(f_cCnpj,f_cChave)

EndClass
//-----------------------------------------------------------------------------
Method New() class AcbrNFeMonitor
  Local cFileIniAcbr := "", cTmp := "", cFileIniPrinters := "", nCountPrn := 0, iFor := 0

  ::cCaminhoAcbrConfigComandos := "C:\ACBrNFeMonitor"
  ::cCaminhoAcbrFound   := ""
  ::cRetornoTxt         := ""
  ::lRetornoOk          := .F.
  ::aNFesManifesto      := {}
  ::cUltimoNSU          := "0"
  
  ::oDb_Semaforo := SEMAFORO_DB():New()  

  ::oDb_Semaforo:GoTo(1471)
  ::cCaminhoAcbrLocal := AllTrim(::oDb_Semaforo:VarGet("FLAG_ATUAL"))
  ::oDb_Semaforo:GoTo(1472)
  ::cCaminhoAcbrRede := AllTrim(::oDb_Semaforo:VarGet("FLAG_ATUAL"))

  If File(::cCaminhoAcbrLocal+"\ACBrNFeMonitor.exe")
    ::cCaminhoAcbrFound := ::cCaminhoAcbrLocal
  elseif File(::cCaminhoAcbrRede+"\ACBrNFeMonitor.exe")
    ::cCaminhoAcbrFound := ::cCaminhoAcbrRede
  EndIf

  ::aPrintersInstalados := {}

  If !Empty(::cCaminhoAcbrFound)
    cFileIniAcbr := ::cCaminhoAcbrFound + "\ACBrNFeMonitor.ini"
    cTmp := ALLTRIM(GetPvProfString( "DANFE", "DecimaisValor","0", cFileIniAcbr ))
    If cTmp != "3"
      WritePProString("DANFE", "DecimaisValor","3", cFileIniAcbr )
    EndIf
    WritePProString("ACBrNFeMonitor", "Intervalo","800", cFileIniAcbr )
    
    ::cCaminhoAcbrXmlConfigEnvioResposta  := ALLTRIM(GetPvProfString( "Geral", "PathSalvar","", cFileIniAcbr ))
    ::cCaminhoAcbrXmlConfigPdf            := ALLTRIM(GetPvProfString( "DANFE", "PathPDF","", cFileIniAcbr ))
    ::cCaminhoAcbrXmlConfigNormal         := ALLTRIM(GetPvProfString( "Arquivos", "PathNFe","", cFileIniAcbr ))
    ::cCaminhoAcbrXmlConfigCancelado      := ALLTRIM(GetPvProfString( "Arquivos", "PathCan","", cFileIniAcbr ))
    ::cCaminhoAcbrXmlConfigInutilizados   := ALLTRIM(GetPvProfString( "Arquivos", "PathInu","", cFileIniAcbr ))

    cFileIniPrinters := ::cCaminhoAcbrFound+"\PrinterGerente.ini"
    
    ///msginfo(cFileIniPrinters)
    
    ::aPrintersInstalados := {}
    Do While .T.
      nCountPrn ++
      cTmp := GetPvProfString( "PRINTERS", "PRN_"+StrZero(nCountPrn,2),"", cFileIniPrinters )
      ///msginfo(cTmp)
      If !Empty(cTmp)
        aadd(::aPrintersInstalados,cTmp)
      Else
        Exit
      EndIf
    EndDo
    
  EndIf

  ///msgarray(::aPrintersInstalados)

  ::cSefazEnvio_TpAmb     := ""
  ::cSefazEnvio_CStat     := ""
  ::cSefazEnvio_XMotivo   := ""
  ::cSefazEnvio_Data      := Date()
  ::cSefazEnvio_Horas     := ""

  ::cSefazRetorno_NRec    := ""
  ::cSefazRetorno_TpAmb   := ""
  ::cSefazRetorno_CStat   := ""
  ::cSefazRetorno_XMotivo := ""

  ::cSefazNFeProtocolo    := ""
  ::cSefazDigitoValor     := ""
  
Return Self
//-----------------------------------------------------------------------------
Method End() class AcbrNFeMonitor

  ::oDb_Semaforo:End()
   
Return Self
//-----------------------------------------------------------------------------
Method AcbrNFe_ConsultarNFe(f_cDanfeChave) class AcbrNFeMonitor
  Loca cFileXmlImprimir := "", nTmp := 0, lRetTmp := .F.
  
  ::cComando    := ""
  ::lRetornoOk  := .F.
  ::cRetornoTxt  := ""
    
  ::cComando := "NFE.ConsultarNFe('"+f_cDanfeChave+"')"

   ::cComando := STRTRAN(::cComando,"'",CHR(34))

  lRetTmp := ::AcbrNFe_EnviaComando()
  
  If lRetTmp
    hb_idleSleep(2)
    lRetTmp := ::AcbrNFe_EsperaResposta()
  Endif
   
   
Return lRetTmp
//-----------------------------------------------------------------------------
Method AcbrNFe_ConsultaNFeDest(f_cCnpj,f_cUltNSU,f_oList) class AcbrNFeMonitor
  Local cFileXmlImprimir := "", nTmp := 0, lRetTmp := .F.
  Local cTmpManifesto := Dir_Temp()+"NFeManifesto.txt"
  Local iFor := 0
  Local cIndCont := "", cCabecalho := "", cNSU := "", aTmp := {}, cTmp := "", cChaves := ""
  
  Default f_cUltNSU := "0"

  ::aNFesManifesto    := {}
  ::cComando          := "" 
  ::lRetornoOk        := .F.
  ::cRetornoTxt       := ""
    
  //::cComando := "NFE.ConsultaNFeDest('"+f_cCnpj+"',1,0,"+AllTrim(Str(f_cUltNSU))+")"

  Do While .T.

    nTmp ++

    ::cComando := "NFE.ConsultaNFeDest("+f_cCnpj+",1,0,"+AllTrim(f_cUltNSU)+")"
  
    ::cComando := STRTRAN(::cComando,"'",CHR(34))
  
    lRetTmp := ::AcbrNFe_EnviaComando()
  
    If lRetTmp
      hb_idleSleep(.5)
      lRetTmp := ::AcbrNFe_EsperaResposta()
    Else
      Exit
    Endif
  
    If at("ERRO",::cRetornoTxt) > 0 .or. !lRetTmp
      Exit
    EndIf

    MemoWrit(cTmpManifesto,"[INICIAL]"+CRLF+::cRetornoTxt)

    ///MemoWrit(Dir_Temp()+"TxtMan"+StrZero(nTmp,3)+".txt",::cRetornoTxt)

    f_cUltNSU := GetPvProfString( "INICIAL", "ultNSU","0", cTmpManifesto )
    
    ::cUltimoNSU := f_cUltNSU

    For Ifor := 1 To 100
      cCabecalho := "RESNFE"+StrZero(iFor,3)

      IF At(cCabecalho,::cRetornoTxt) == 0
        Exit
      EndIf

      cNSU := GetPvProfString( cCabecalho, "NSU","0", cTmpManifesto )
      If cNSU != "0"
        aTmp := Array(20)
        aTmp[01] := cNSU
        aTmp[02] := GetPvProfString( cCabecalho, "chNFe","0", cTmpManifesto )
        aTmp[03] := GetPvProfString( cCabecalho, "CNPJ","0", cTmpManifesto )
        aTmp[04] := Upper(GetPvProfString( cCabecalho, "xNome","0", cTmpManifesto ))
        aTmp[05] := GetPvProfString( cCabecalho, "IE","0", cTmpManifesto )
        aTmp[06] := cTod(GetPvProfString( cCabecalho, "dEmi","0", cTmpManifesto ))
        aTmp[07] := Val(GetPvProfString( cCabecalho, "tpNF","0", cTmpManifesto ))
        aTmp[08] := Val(StrTran(GetPvProfString( cCabecalho, "vNF","0", cTmpManifesto ),",","."))
        aTmp[09] := GetPvProfString( cCabecalho, "digVal","0", cTmpManifesto )
        aTmp[10] := GetPvProfString( cCabecalho, "dhRecbto","0", cTmpManifesto )
        aTmp[11] := GetPvProfString( cCabecalho, "cSitNFe","0", cTmpManifesto )
        aTmp[12] := GetPvProfString( cCabecalho, "cSitConf","0", cTmpManifesto )

        aTmp[19] := cTod(SubStr(aTmp[10],1,10))
        aTmp[20] := SubStr(aTmp[10],12)
        aadd(::aNFesManifesto,aTmp)
        cChaves += aTmp[2]+CRLF

        If !Hb_IsNil(f_oList)
          f_oList:Add(dToc(aTmp[06])+" - "+aTmp[04])
          f_oList:GoBottom()
          f_oList:Refresh()
          SysRefresh()
          cursorwait()
        EndIf
      EndIf

    Next

    cIndCont  := GetPvProfString( "INICIAL", "indCont","2", cTmpManifesto )

    If cIndCont == "0"
      Exit
    EndIf
    
  EndDo

  //MemoWrit(Dir_Temp()+"Chaves.txt",cChaves)
  
  //xbrowse(::aNFesManifesto)
  ///::AcbrNFe_DownLoadNFe(f_cCnpj,aTmp[2])
   
Return lRetTmp
//-----------------------------------------------------------------------------
Method AcbrNFe_ManifestoDestinatario(f_cCnpj,f_cDanfeChave) Class AcbrNFeMonitor
  Local nConclusao := 0, lRetTmp := .F.
  Local cDataNow := dToc(date())+" "+ Time() 

 // Local cDataNow := SubStr(dToc(date()),1,6)+SubStr(AllTrim(str(Year(Date()))),3)+ " " + Time() 

  
  ::cComando := "NFe.EnviarEvento('" //+CRLF
  ::cComando += "[Evento]"+CRLF
  ::cComando += "idLote=2"+CRLF 
  ::cComando += "[Evento001]"+CRLF
  ::cComando += "chNFe="+f_cDanfeChave+CRLF
  ::cComando += "cOrgao=91"+CRLF
  ::cComando += "CNPJ="+f_cCnpj+CRLF
  ::cComando += "dhEvento="+cDataNow+CRLF 
  ::cComando += "tpEvento=210200"+CRLF
  ::cComando += "nSeqEvento=1"+CRLF
  ::cComando += "versaoEvento=1.00"+CRLF
  ::cComando += "descEvento=CONFIRMACAO DA OPERACAO"+CRLF 
  ::cComando += "xCorrecao="+CRLF
  ::cComando += "xCondUso="+CRLF
  ::cComando += "nProt="+CRLF
  ::cComando += "xJust=')"

  ::cComando := STRTRAN(::cComando,"'",CHR(34))

  lRetTmp := ::AcbrNFe_EnviaComando()

  If lRetTmp
    hb_idleSleep(.5)
    lRetTmp := ::AcbrNFe_EsperaResposta()
  Endif

  If !lRetTmp

    nConclusao := -1 // Acbr não responde

  Else
        
    If at("ERRO",::cRetornoTxt) > 0 
      nConclusao := 1 // Não foi processado
    ElseIf at("REJEICAO",Upper(::cRetornoTxt)) > 0 .or. at("REJEIÇÃO",Upper(::cRetornoTxt)) > 0
      nConclusao := 2 // Rejeitado
    EndIf

  EndIf
  
Return nConclusao 

//-----------------------------------------------------------------------------
Method AcbrNFe_Validar(f_cFileXml) class AcbrNFeMonitor
  Loca cFileXmlCopy := "", nTmp := 0, lRetTmp := .F.
  
  ::cComando    := ""
  ::lRetornoOk  := .F.
  ::cRetornoTxt  := ""
    
  If !File(f_cFileXml)
    ::lRetornoOk := .F.
    ::cRetornoTxt := "Erro: Arquivo Xml não encontrado ou não foi gerado."
    Return ::lRetornoOk
  EndIf
  
  nTmp := RAT("\", f_cFileXml)
  cFileXmlCopy := ::cCaminhoAcbrXmlConfigNormal + SubStr(f_cFileXml,nTmp)
  
  lMkDir(::cCaminhoAcbrXmlConfigNormal)
  
  Copy file (f_cFileXml) to (cFileXmlCopy)
  
  ::cComando := "NFE.ValidarNFe('"+cFileXmlCopy+"')"

   ::cComando := STRTRAN(::cComando,"'",CHR(34))

  lRetTmp := ::AcbrNFe_EnviaComando()
  
  If lRetTmp
    hb_idleSleep(2)
    lRetTmp := ::AcbrNFe_EsperaResposta()
  Endif
   
Return lRetTmp
//-----------------------------------------------------------------------------
Method AcbrNFe_Assinar(f_cFileXmlName) class AcbrNFeMonitor
  Loca cFileXmlAssinar := "", nTmp := 0, lRetTmp := .F.
  
  ::cComando    := ""
  ::lRetornoOk  := .F.
  ::cRetornoTxt  := ""
    
  cFileXmlAssinar := ::cCaminhoAcbrXmlConfigNormal + "\" + Alltrim(f_cFileXmlName)

  If !File(cFileXmlAssinar)
    ::lRetornoOk := .F.
    ::cRetornoTxt := "Erro: Arquivo Xml não encontrado ou não foi gerado."
    Return ::lRetornoOk
  EndIf
  
  ////Copy file (f_cFileXml) to (cFileXmlAssinar)
  
  ::cComando := "NFE.AssinarNFe('"+cFileXmlAssinar+"')"

   ::cComando := STRTRAN(::cComando,"'",CHR(34))

  lRetTmp := ::AcbrNFe_EnviaComando()
  
  If lRetTmp
    hb_idleSleep(2)
    lRetTmp := ::AcbrNFe_EsperaResposta()
  Endif
   
Return lRetTmp
//-----------------------------------------------------------------------------
Method AcbrNFe_Transmitir(f_cFileXmlName,f_nNumeroNFe) class AcbrNFeMonitor
  Local cFileXmlTransmitir := "", nTmp := 0, cTmp := "", lRetTmp := .F., cFileSefazRetorno := ""
  Local cGrupoNFe := ""
  
  ::cComando    := ""
  ::lRetornoOk  := .F.
  ::cRetornoTxt  := ""
    
  cGrupoNFe := "NFE"+M_Str(f_nNumeroNFe)
  cFileXmlTransmitir := ::cCaminhoAcbrXmlConfigNormal + "\" + Alltrim(f_cFileXmlName)

  If !File(cFileXmlTransmitir)
    ::lRetornoOk := .F.
    ::cRetornoTxt := "Erro: Arquivo Xml não encontrado ou não foi gerado."
    Return ::lRetornoOk
  EndIf
  
  ////Copy file (f_cFileXml) to (cFileXmlTransmitir)
  
  ::cComando := "NFE.EnviarNFe('"+cFileXmlTransmitir+"',0,0,0)"

   ::cComando := STRTRAN(::cComando,"'",CHR(34))

  lRetTmp := ::AcbrNFe_EnviaComando()
  
  If lRetTmp
    hb_idleSleep(8)
    lRetTmp := ::AcbrNFe_EsperaResposta(50)
  Endif

  If !lRetTmp
    Return .F.
  EndIf
  
  cFileSefazRetorno := Dir_Temp()+"SefazRet.txt"
  fErase(cFileSefazRetorno)
  Memowrit(cFileSefazRetorno,::cRetornoTxt)

  ::cSefazEnvio_TpAmb    := ALLTRIM(GetPvProfString( "ENVIO", "TpAmb","", cFileSefazRetorno ))
  ::cSefazEnvio_CStat    := ALLTRIM(GetPvProfString( "ENVIO", "CStat","", cFileSefazRetorno ))
  ::cSefazEnvio_XMotivo  := ALLTRIM(GetPvProfString( "ENVIO", "XMotivo","", cFileSefazRetorno ))
  cTmp := ALLTRIM(GetPvProfString( "ENVIO", "DhRecbto","", cFileSefazRetorno ))
  ::cSefazEnvio_Data  := cTod(SubStr(cTmp,1,10))
  ::cSefazEnvio_Horas  := SubStr(cTmp,12)

  ::cSefazRetorno_NRec      := ALLTRIM(GetPvProfString( "RETORNO", "NRec","", cFileSefazRetorno ))
  ::cSefazRetorno_TpAmb    := ALLTRIM(GetPvProfString( "RETORNO", "TpAmb","", cFileSefazRetorno ))
  ::cSefazRetorno_CStat    := ALLTRIM(GetPvProfString( "RETORNO", "CStat","", cFileSefazRetorno ))
  ::cSefazRetorno_XMotivo    := ALLTRIM(GetPvProfString( "RETORNO", "XMotivo","", cFileSefazRetorno ))
  
  ::cSefazNFeProtocolo      := ALLTRIM(GetPvProfString( cGrupoNFe, "NProt","", cFileSefazRetorno ))
  ::cSefazDigitoValor      := ALLTRIM(GetPvProfString( cGrupoNFe, "DigVal","", cFileSefazRetorno ))
  
  If At("AUTORIZADO",UPPER(::cSefazRetorno_XMotivo)) == 0
    lRetTmp := .F.
  EndIf  
   
Return lRetTmp
//-----------------------------------------------------------------------------
Method AcbrNfe_Cancelar(f_cChaveDanfe,f_cJustificativa,f_cCnpj) class AcbrNFeMonitor
  Loca lRetTmp := .F.
  
  ::cComando    := ""
  ::lRetornoOk  := .F.
  ::cRetornoTxt  := ""
    
  ::cComando := "NFE.CancelarNFE('"+f_cChaveDanfe+"','"+f_cJustificativa+"',"+f_cCnpj+"')"

  ::cComando := STRTRAN(::cComando,"'",CHR(34))

  lRetTmp := ::AcbrNFe_EnviaComando()
  
  If lRetTmp
    hb_idleSleep(5)
    lRetTmp := ::AcbrNFe_EsperaResposta()
  Endif
   
Return lRetTmp

//-----------------------------------------------------------------------------
Method AcbrNfe_ImprimirDanfe(f_cFileXmlName,f_cPrinterName, f_nCopias) class AcbrNFeMonitor
  Local cFileXmlImprimir := "", nTmp := 0, lRetTmp := .F., iFor := 0
    
  Default f_cPrinterName := "", f_nCopias := 1
  ::cComando    := ""
  ::lRetornoOk  := .F.
  ::cRetornoTxt  := ""
    
  If At("\",f_cFileXmlName) == 0
    cFileXmlImprimir := ::cCaminhoAcbrXmlConfigNormal + "\" + Alltrim(f_cFileXmlName)
  Else
    cFileXmlImprimir := f_cFileXmlName
  EndIf
  
  If !File(cFileXmlImprimir)
    ::lRetornoOk := .F.
    ::cRetornoTxt := "Erro: Arquivo Xml não encontrado ou não foi gerado."
    Return ::lRetornoOk
  EndIf
  
  ////Copy file (f_cFileXml) to (cFileXmlImprimir)
  
  If Empty(f_cPrinterName)
    ::cComando := "NFE.ImprimirDanfe('"+cFileXmlImprimir+"')"
  Else
    ///::cComando := "NFE.AcbrNfe_ImprimirDanfe('"+cFileXmlImprimir+"','"+f_cPrinterName+"',"+M_Str(f_nCopias,0)+")"
    ::cComando := "NFE.ImprimirDanfe('"+cFileXmlImprimir+"','"+f_cPrinterName+"',1)"
  EndIf
   ::cComando := STRTRAN(::cComando,"'",CHR(34))

  ///msginfo(::cComando)
  
  For iFor := 1 to f_nCopias
    lRetTmp := ::AcbrNFe_EnviaComando()
    If lRetTmp
      hb_idleSleep(5)
      lRetTmp := ::AcbrNFe_EsperaResposta()
    Endif
  Next
  
  ///If lRetTmp
  ///  hb_idleSleep(5)
  ///  lRetTmp := ::AcbrNFe_EsperaResposta()
  ///Endif
   
Return lRetTmp
//-----------------------------------------------------------------------------
Method AcbrNFe_ImprimirDanfePdf(f_cFileXmlName) class AcbrNFeMonitor
  Local cFileXmlImprimir := "", nTmp := 0, lRetTmp := .F.
  
  ::cComando    := ""
  ::lRetornoOk  := .F.
  ::cRetornoTxt  := ""

  ///If !File(cFileXmlImprimir)
    
  cFileXmlImprimir := ::cCaminhoAcbrXmlConfigNormal + "\" + Alltrim(f_cFileXmlName)

  If !File(cFileXmlImprimir)
    ::lRetornoOk := .F.
    ::cRetornoTxt := "Erro: Arquivo Xml não encontrado ou não foi gerado."
    Return ::lRetornoOk
  EndIf
  
  ////Copy file (f_cFileXml) to (cFileXmlImprimir)
  
  ::cComando := "NFE.ImprimirDanfePdf('"+cFileXmlImprimir+"')"

   ::cComando := STRTRAN(::cComando,"'",CHR(34))

  lRetTmp := ::AcbrNFe_EnviaComando()
  
  If lRetTmp
    hb_idleSleep(5)
    lRetTmp := ::AcbrNFe_EsperaResposta()
  Endif
   
Return lRetTmp
//-----------------------------------------------------------------------------
Method AcbrNfe_ImprimirEvento(f_cFileXmlEvento,f_cFileXmlNFe) class AcbrNFeMonitor
  Local lRetTmp := .F.
  
  ::cComando    := ""
  ::lRetornoOk  := .F.
  ::cRetornoTxt  := ""

  If !File(f_cFileXmlEvento)
    ::lRetornoOk := .F.
    ::cRetornoTxt := "Erro: Arquivo Xml do evento não encontrado."+CRLF+ ;
                     "Arquivo: "+f_cFileXmlEvento 
    Return ::lRetornoOk
  EndIf
  
  ::cComando := "NFE.ImprimirEvento('"+f_cFileXmlEvento+"','"+f_cFileXmlNFe+"')"

  ::cComando := STRTRAN(::cComando,"'",CHR(34))

  lRetTmp := ::AcbrNFe_EnviaComando()
  
  If lRetTmp
    hb_idleSleep(2)
    lRetTmp := ::AcbrNFe_EsperaResposta()
  Endif

Return lRetTmp
//-----------------------------------------------------------------------------
Method AcbrNfe_ImprimirEventoPdf(f_cFileXmlEvento) class AcbrNFeMonitor
  Local lRetTmp := .F.
  
  ::cComando    := ""
  ::lRetornoOk  := .F.
  ::cRetornoTxt  := ""

  If !File(f_cFileXmlEvento)
    ::lRetornoOk := .F.
    ::cRetornoTxt := "Erro: Arquivo Xml do evento não encontrado."+CRLF+ ;
                     "Arquivo: "+f_cFileXmlEvento 
    Return ::lRetornoOk
  EndIf
  
  ::cComando := "NFE.ImprimirEventoPdf('"+f_cFileXmlEvento+"')"

  ::cComando := STRTRAN(::cComando,"'",CHR(34))

  lRetTmp := ::AcbrNFe_EnviaComando()
  
  If lRetTmp
    hb_idleSleep(2)
    lRetTmp := ::AcbrNFe_EsperaResposta()
  Endif

Return lRetTmp
//-----------------------------------------------------------------------------
Method AcbrNFe_DownLoadNFe(f_cCnpj,f_cChave) class AcbrNFeMonitor
  Local cTxtNFe := "",lRetTmp := .F.
  
  ::cComando    := ""
  ::lRetornoOk  := .F.
  ::cRetornoTxt  := ""
    
  // ::cComando := "DownloadNFE('"+f_cCnpj+"','"+f_cChave+"')"
  ::cComando := "DownloadNFE("+f_cCnpj+","+f_cChave+")"

  ::cComando := STRTRAN(::cComando,"'",CHR(34))

  lRetTmp := ::AcbrNFe_EnviaComando()
  
  If lRetTmp
    hb_idleSleep(2)
    lRetTmp := ::AcbrNFe_EsperaResposta()
  Endif

Return lRetTmp
//-----------------------------------------------------------------------------
Method AcbrNFe_EnviaComando() class AcbrNFeMonitor
  Local iFor := 0
   
  ::lRetornoOk := .F.
  fErase(::cCaminhoAcbrFound+"\SAINFE.TXT")
  
   For iFor := 1 To 4
     ::nHandleFileEntrada := Fcreate(::cCaminhoAcbrFound+"\ENTNFE.TXT")
     If ::nHandleFileEntrada == -1
      SysWait(.3)
    Else
       Fwrite(::nHandleFileEntrada,::cComando)
       FClose(::nHandleFileEntrada)
    EndIf
  Next

  If ::nHandleFileEntrada == -1
    ::lRetornoOk := .F.
    ::cRetornoTxt := "Erro: Não foi possivel criar o arquivo de entrada ENTNFE.TXT"
  Else
    ::lRetornoOk := .T.
  EndIf
  
Return ::lRetornoOk
//-----------------------------------------------------------------------------
Method AcbrNFe_EsperaResposta(f_nSecondsEspera) class AcbrNFeMonitor
  Local lOpen := .F., nTentativa := 0, nEsperaResposta := 0
  
  Default f_nSecondsEspera := 20 
  
  f_nSecondsEspera := (f_nSecondsEspera * 5)
  
  nEsperaResposta := f_nSecondsEspera * 2
  ::cRetornoTxt := Space(32768)

   hb_idleSleep( .2 )

  Do While .T.
     nTentativa ++
     if File(::cCaminhoAcbrFound+"\SAINFE.TXT")
       ::nHandleFileEntrada := Fopen(::cCaminhoAcbrFound+"\SAINFE.TXT",16)
       If ::nHandleFileEntrada == -1
          hb_idleSleep( 0.2 )
       else
         lOpen := .T.
         Exit
       EndIf
    Else
       hb_idleSleep( 0.2 )
    EndIf
    
    If nTentativa > nEsperaResposta
      If MsgNoYes("O AcbrNFeMonitor não esta respondendo ou esta inativo."+CRLF+CRLF+;
              "Deseja Abortar o procedimento.",;
              "Atenção, Responda.")
        Exit
      EndIf  
    EndIf
  EndDo

  ::lRetornoOk := lOpen
  
  If lOpen
    Fread(::nHandleFileEntrada,@::cRetornoTxt,32768)
    ::cRetornoTxt := rTrim(::cRetornoTxt)
  Else
    If nTentativa > 80 
      ::cRetornoTxt := "Erro: O tempo de limite de espera do arquivo de retorno expirou"
    Else
      ::cRetornoTxt := "Erro: Não foi possivel abrir o arquivo de retorno SAINFE.TXT"
    Endif
  Endif
  
  If ::nHandleFileEntrada > 0
    FClose(::nHandleFileEntrada)
  EndIf

  If At("ERRO",UPPER(::cRetornoTxt)) > 0
    ::lRetornoOk := .F.
  EndIf
  
Return ::lRetornoOk
//-----------------------------------------------------------------------------
Method AcbrNFe_StatusServico() class AcbrNFeMonitor
  Local lRetTmp := .F.
  
  ::cComando    := ""
  ::lRetornoOk  := .F.
  ::cRetornoTxt  := ""

  ::cComando := "NFE.StatusServico"
  
  lRetTmp := ::AcbrNFe_EnviaComando()
  
  If lRetTmp
    lRetTmp := ::AcbrNFe_EsperaResposta()
  Endif

Return lRetTmp

//-----------------------------------------------------------------------------

///////////////////////////////////////////////////////////////////////////////
FUNCTION Acbr_Nfe_Monitor_Config_Printers()
  Local oDb_SemaforoIni := SEMAFORO_DB():New()
  Local cPastaAcbr := ""
  Local aPrinters := {}, iFor := 0, cFileIni := ""
  
  oDb_SemaforoIni:GoTo(1471)
  cPastaAcbr := oDb_SemaforoIni:VarGetRtrim("FLAG_ATUAL")
  oDb_SemaforoIni:End()
  
  If !File(cPastaAcbr+"\ACBrNFeMonitor.exe")
    ///msginfo(cPastaAcbr+"\ACBrNFeMonitor.exe")
    Return Nil
  EndIf
  
  cFileIni := cPastaAcbr + "\PrinterGerente.ini"
  fErase(cFileIni)

  aPrinters := aGetPrinters()
  For Ifor := 1 To Len(aPrinters)
     WritePProString( "PRINTERS", "PRN_"+StrZero(iFor,2), aPrinters[ifor], cFileIni)
  Next
  
Return nil


Link to comment
Share on other sites

  • 3 months later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...