Página 1 de 1

sefazclass for dummies

Enviado: 27 Jun 2023 16:37
por JoséQuintas
sefazclass.png
Primeiro: sabe usar classe ? não ? tá esperando o que?

A classe tem nome: SEFAZCLASS

Como usa?

Cria uma variável com ela.
Isso é programação Harbour, não deveria precisar manual pra isso.

Código: Selecionar todos

oSefaz := SefazClass():New()
O que mais?
São 5 variáveis principais.
Isso é programação Harbour, só o nome é que altera de uma classe pra outra.

cProjeto.... é o projeto... tem #define pra isso pra não errar a digitação, mas de um modo geral a classe preenche sozinha.

pode ser bpe, cte, mdfe, nfe tem lá no sefazclass.ch #define WS_PROJETO_NFE por exemplo.

Código: Selecionar todos

oSefazClass:cProjeto := WS_PROJETO_NFE
cAmbiente, tá lá no manual da sefaz, pode ser homologação (teste) ou produção.
Também tem ch pra isso

Código: Selecionar todos

oSefaz:cAmbiente := WS_AMBIENTE_PRODUCAO
cVersao,. é a versão que está usando. Tá lá no manual do governo. O automático é a versão atual. Por exemplo CTE vai começar 4.00 mas ainda está na 3.00, então se não colocar nada vai entrar 3.00 pra CTE

cUF.... oras, é a UF, tá em SP, coloca "SP"
Quando possível, a classe preenche sozinha, pegando da chave do documento, do XML, ou informar manual.

Código: Selecionar todos

oSefaz:cUF := "SP"
cCertificado - esse sim merece atenção. É O NOME DO CERTIFICADO, não é serial, não é nome de arquivo, é o nome dele, como o Windows enxerga esse certificado. Normalmente é olhar lá nos certificados do Windows e olhar o nome, ou entrar em detalhes, e olhar o CN=

Código: Selecionar todos

oSefaz:cCertificado := "nome"
Pronto, acabou, a partir daí é só usar.
Tem lá os nomes (METHOD), é usar o nome do que quer, e colocar os parâmetros que estão indicados.

sefazclass for dummies

Enviado: 27 Jun 2023 16:59
por JoséQuintas
Vamos ao mais simples: quer consultar se o serviço está funcionando?

Código: Selecionar todos

   METHOD BPeStatusServico( cUF, cCertificado, cAmbiente )
   METHOD CTeStatusServico( cUF, cCertificado, cAmbiente )
   METHOD MDFeStatusServico( cUF, cCertificado, cAmbiente )
   METHOD NFeStatusServico( cUF, cCertificado, cAmbiente )
Sabe ler.... então... consultar status do serviço, é em algum nome que pareça com status do serviço.
Já sabe o que é UF, certificado e ambiente.... precisa manual pra isso?
Só precisa saber que, se já colocou nas variáveis anteriores, aqui não precisa colocar NADA.
Vamos consultar tudo ?

Código: Selecionar todos

oSefaz := SefazClass():New()
oSefaz:cAmbiente := WS_AMBIENTE_PRODUCAO
oSefaz:cUF := "SP"
oSefaz:cCertificado := "NOME"
Alert( oSefaz:BPEStatusServico() )
Alert( oSefaz:CTEStatusServico() )
Alert( oSefaz:MDFEStatusServico() )
Alert( oSefaz:NFEStatusServico() )
Isso é programação Harbour.
Criar a classe e executar o método.

Precisa manual?

Não sabe que NFEStatusServico() só pode ser da NFE, e só pode ser status de serviço?

Se precisa manual pra isso, sinto muito, melhor não usar mesmo, senão vai ficar perguntando tudo....

Esqueci tem mais:

Precisa instalar CAPICOM da MICROSOFT.
É a biblioteca da Microsoft pra acessar certificados, criptografia, assinatura, etc.

Precisa instalar MSXML5, um componente talvez PIRATA DO OFFICE, é só uma DLLzinha.

Porque precisa disso?
Sei lá porque cargas dágua, a Microsoft coloca no Windows MSXML1, MSXML2, MSXML3, MSXML4 e.... MSXML6
O MSXML5 ela não colocou no Windows, só tem (ou tinha) no Office.
É a única que possui o que precisa pra ASSINATURA COM CERTIFICADO.
A GRANDE MAIORIA dos componentes de NFE usam isso. Outros usam o NET FRAMEWORK, que foi a opção que sobrou.

Esses vão acabar ?
Sei lá... se depender de notícias... falaram que isso deixaria de existir há mais de 10 anos.
E falaram a mesma coisa do ADO... A PRÓPRIA MICROSOFT FALOU EM 2002 que não era mais pra usar ADO que era obsoleto.
Foi porque em 2002 ela alterou os arquivos necessários pra funcionar em 64 bits, pra PODER USAR NO OFFICE.
Não é pra usar mais, é obsoleto, parem de usar.... mas eu, Microsoft , vou continuar usando.....

Então.... sei lá... se isso parar, é assinar usando NET FRAMEWORK.
É basicamente criar uma DLL pra isso, e usar no Harbour.
Tem vários componentes que fazem isso, UNINFE é um deles, é grátis, tem fontes código aberto.

De um modo geral é isso, quem souber ler consegue ler os nomes, e usar cada um.
São trocentos serviços, colocar um por um aqui vai ser uma eternidade.

sefazclass for dummies

Enviado: 27 Jun 2023 18:09
por JoséQuintas
Vamos repetir:

Código: Selecionar todos

oSefaz := SefazClass():New()
oSefaz:cAmbiente := WS_AMBIENTE_PRODUCAO
oSefaz:cUF := "SP"
oSefaz:cCertificado := "NOME"
Alert( oSefaz:BPEStatusServico() )
Alert( oSefaz:CTEStatusServico() )
Alert( oSefaz:MDFEStatusServico() )
Alert( oSefaz:NFEStatusServico() )
Consultando status dos serviços de BPE, CTE, MDFE NFE
Nada de INI, nada de pasta de envio, nada de pasta de retorno.
Trata-se apenas de DLLs Microsoft, de mais de 20 anos atrás, nenhuma novidade.

Se seu componente de NFE não faz isso, sinal de que ele tá mais de 20 anos atrasado....
Ou pior que isso... pode ser o programador mesmo. kkkk

Esqueci de dizer:
Não tem mensalidade nenhuma pros componentes Microsoft.
E são os mesmos de 20 anos atrás, a Microsoft nunca mais atualizou.

sefazclass for dummies

Enviado: 28 Jun 2023 14:48
por JoséQuintas
JoséQuintas escreveu:Esqueci de dizer:
Não tem mensalidade nenhuma pros componentes Microsoft.
E são os mesmos de 20 anos atrás, a Microsoft nunca mais atualizou.
Esqueci do destaque nisso.
Porque os componentes precisam atualização?
Ué... porque a maioria dos programadores não querem/podem perder tempo, ou não querem aprender o que é normal faz tempo.

O que se altera nisso nas mudanças ?

Nas mudanças de LAYOUT, geralmente NADA, podem se passar anos sem precisar mexer. Se o XML é gerado no aplicativo, é acrescentar no aplicativo os campos novos, isso não tem a ver com o restante.

Nas mudanças de VERSÕES ou CRIAÇÃO DE EVENTOS

Geralmente alteram os endereços de internet.
Vamos no chute 26 estados e 20 serviços diferentes, isso dá 520 endereços de internet.
Não é tudo isso, porque várias UFs utilizam um endereço só, mas são endereços diferentes, precisa colocar lá na lista, é texto..

Pode alterar o layout do ENVELOPE, é um XML de comunicação. é texto. Vão algumas informaçõeszinhas básicas nele. é texto.
Altera na classe porque é criado na classe.

Pode alterar o layout do arquivo enviado: na consulta de status do CTE foi acrescentado o código da UF. Exemplo: [UF]SP[/UF]. é texto.
Isto altera na classe, porque o XML é criado na classe, no aplicativo nem precisa mexer.

Na prática nem precisaria da classe.
Mas ela agrupa as coisas comuns da comunicação, e até ajuda já criando alguns XMLs, pro aplicativo não precisar disso.

Basicamente o que ela faz ?

- pega o endereço de internet, dentro de uma lista de vários endereços, precisa disso pra comunicação

- pega as informaçõeszinhas que vão no "envelope", varia conforme o serviço (se preferirem, conforme o endereço de internet)

- cria alguns XMLs que só precisam poucas informações, recebe por parâmetro e já cria, pra não precisar fazer no aplicativo

- só não cria o XML do documento, porque esse tem informação que não acaba mais.
Criar INI, TXT, o raio que o parta, não tira trabalho nenhum do programador, que vai ter que gerar alguma coisa em algum formato, que só vai servir praquilo e nada mais. Se é pra aprender um formato não comum, melhor aprender o XML que é comum, e baseado nos manuais da Fazenda, que são a origem de tudo.
XML serve pra tudo. Já os formatos INI, TXT, o raio que o parta, vão deixar presos ao componente, não vai poder usar nenhuma outra alternativa a não ser o componente.

Mudou XML, tá gerando XML no aplicativo, altera o aplicativo e fim, pode deixar pronto muito antes dele começar a valer.
Tá usando INI, TXT, o raio que o parta.... vai ter que ficar esperando alguém deixar aquilo pronto pra uso, pra só depois poder mexer no aplicativo.

Quem sabe no futuro não mude pra JSON.....

XML não é complicado, é trabalhoso.
Complicada é a legislação, e preencher tudo de acordo com a legislação.
Mas nenhum componente ajuda nisso, então, use o que usar, vai continuar com a complicação do mesmo jeito, tanto faz se for XML, INI, TXT, ou o raio que o parta.

sefazclass for dummies

Enviado: 28 Jun 2023 14:59
por Fernando queiroz
adoro a SEFAZCLASS, muito mais simples de usar que o tal do ACBR , em vez de perder tempo com aqueles arquivinhos , eu gero na minha aplicação o XML e passo para a SEFAZCLASS e aguardo retorno , se ta OK emite a NFE/NFCe se não dou a mensagem de retorno e guardo o XML para verificação no VALIDADOR RS , feita as correções mando novamente e ta feito

sefazclass for dummies

Enviado: 28 Jun 2023 15:01
por Fernando queiroz
com o aprendizado de XML hoje eu uso o mesmo recurso para transferir mercadoria de uma filial para a outra, despois de feito a transferência da filial A para a filial B eu gero um XML no padrão da NFe e uso para dar entrada nas mercadorias da filial B usando a mesma rotina de entrada via XML , cadastrando produtos e tudo mais.

sefazclass for dummies

Enviado: 28 Jun 2023 15:26
por Fernando queiroz
eu uso da seguinte forma

Código: Selecionar todos

		::oSefaz           		:= SefazClass():New()
		::oSefaz:cUF       		:= ::UFEmitente
		::oSefaz:cAmbiente 		:= ::cAmbiente	
		::oSefaz:cCertificado 	:= ::cCertificado
		cXml := ::IDENTIFICACAO(  ) 
		cXml += ::EMITENTE( ) 
		cXml += ::DESTINATARIO(  )
		do case
			case ::TIPO_OPERACAO = 30
				cXml += ::TIPO_OPERACAO_30( )
			case ::TIPO_OPERACAO = 40
				cXml += ::TIPO_OPERACAO_40( )
			case ::TIPO_OPERACAO = 90
				cXml += ::TIPO_OPERACAO_GERAL( )
//				cXml += ::TIPO_OPERACAO_90( )
			case ::TIPO_OPERACAO = 91
				cXml += ::TIPO_OPERACAO_GERAL( )
//				cXml += ::TIPO_OPERACAO_90( )
			OTHERWISE
				cXml += ::TIPO_OPERACAO_GERAL( )
		endcase

	cXml+= ::TRANSPORTE(  )
	cXml+= ::COBRANCA(  )
	cXml+= ::PAGAMENTO( )
	cXml+= ::INFORMACOES_ADICIONAIS(  )

   ::oSefaz:NFEloteenvia( cXml )
	IF ! ::oSefaz:cStatus $ "100,101,150,301,302"
		oBar:Step()
		oBar:SetLabel("Nota Fiscal Rejeitada...")
		hwg_MsgStop("Motivo: " + ::oSefaz:cStatus + HB_EOL()+ ::oSefaz:cMotivo,"ATENÇÃO!!!")
		return nil
	ELSE
		oSpedDa := hbNfeDaGeral():New()
		oSpedDa:ToPdf( ::oSefaz:cXmlAutorizado, "C:\TEMP\" + ::a_Id + ".PDF" )	
                WAPI_ShellExecute( NIL, "OPEN", "C:\TEMP\" + ::a_Id + ".PDF" ,"",NIL,5 )	
       ENDIF

Código: Selecionar todos

************************************************************************************************************************************************************************************************************************
METHOD TIPO_OPERACAO_GERAL(  ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************	
LOCAL cQuery1;
	, oQuery1;
	, oQuery2;

	cQuery1:="SELECT "
	cQuery1+="produtos.Tributo_Id AS REGRA, "	
	cQuery1+="pedidos.TIPO_OPERACAO, "	
	cQuery1+="flag.N_CRT AS C_CRT, "	
	cQuery1+="danfe.C_UF AS UFEmitente, "
	cQuery1+="danfe.E_UF AS UfDestinatario, "	
	cQuery1+="pedidositens.PEDIDOS_ID, "	
	cQuery1+="pedidositens.PRODUTOS_ID AS cProd, "	
	cQuery1+="pedidositens.ITEM AS nItem, "	
	cQuery1+="produtos.EAN13 AS cEAN, "	
	cQuery1+="pedidositens.DESPRO AS xProd, "	
	cQuery1+="regrastributarias.Origem_Mercadoria AS ICMS_ORIG, "	
	cQuery1+="regrastributarias.ICMS_CST_CSOSN AS CST, "	
	cQuery1+="produtos.NCM AS cNCM, "	
	cQuery1+="produtos.CEST AS CEST,  "
	cQuery1+="regrastributarias.nCFOP AS nCFOP, "		
	cQuery1+="produtos.TIPUNI AS uCom, "	
	cQuery1+="pedidositens.QTDPRO AS QCOM, "	
	cQuery1+="pedidositens.VLRUNI AS VUNCOM, "	
	cQuery1+="pedidositens.VLRTOT AS VPROD, "	
	cQuery1+="produtos.EAN13 AS CEANTRIB, "	
	cQuery1+="produtos.TIPUNI AS UTRIB, "	
	cQuery1+="pedidositens.QTDPRO AS QTRIB, "	
	cQuery1+="pedidositens.VLRUNI AS VUNTRIB, "	
	cQuery1+="1 AS INDTOT, "	
	cQuery1+="ROUND((pedidos.TOTDES * (pedidositens.QTDPRO * pedidositens.VLRUNI) / ( pedidos.TOTAL_GERAL ) ),4) AS vDESC, "	
	cQuery1+="regrastributarias.Origem_Mercadoria AS ICMS_ORIG, "	
	cQuery1+="regrastributarias.ICMS_CST_CSOSN AS CST, "
	cQuery1+="pedidositens.VLRTOT AS ICMS_vBc, "
	cQuery1+="regrastributarias.ICMS_Aliq AS ICMS_pICMS, "
	cQuery1+="IF(regrastributarias.ICMS_Aliq = 0.0000, 0.00, ROUND(((pedidositens.VLRTOT * regrastributarias.ICMS_Aliq )/100),2) ) AS ICMS_vICMS, "	   
	cQuery1+="regrastributarias.IPI_CST, "	
	cQuery1+="IF(regrastributarias.IPI_CST IS NULL, 0.00, pedidositens.VLRTOT) AS IPI_vBc, "	
	cQuery1+="regrastributarias.IPI_Aliq, "	
	cQuery1+="IF(regrastributarias.IPI_CST IS NULL, 0.00, ROUND(((pedidositens.VLRTOT * regrastributarias.IPI_Aliq )/100),2) ) AS vIPI, "	
	cQuery1+="regrastributarias.IPI_Enq, "	
	cQuery1+="regrastributarias.PIS_CST AS PIS_ST, "	
	cQuery1+="IF(regrastributarias.PIS_CST = 99, 0.00, pedidositens.VLRTOT) AS PIS_vBc, "	
	cQuery1+="regrastributarias.PIS_Aliq AS PIS_pPIS, "	
	cQuery1+="ROUND(((pedidositens.VLRTOT * regrastributarias.PIS_Aliq )/100),2) AS PIS_vPIS, "	
	cQuery1+="regrastributarias.COFINS_CST AS COF_ST, "	
	cQuery1+="IF(regrastributarias.COFINS_CST = 99, 0.00, pedidositens.VLRTOT) AS COF_vBc, "	
	cQuery1+="regrastributarias.COFINS_Aliq AS COF_pCOFINS, "	
	cQuery1+="ROUND(((pedidositens.VLRTOT * regrastributarias.COFINS_Aliq )/100),2) AS COF_vCOFINS, "	
	cQuery1+="(pedidositens.VLRTOT  - (ROUND((pedidos.TOTDES * (pedidositens.QTDPRO * pedidositens.VLRUNI) / ( pedidos.TOTAL_GERAL ) ),4)) ) AS vBCUFDest,  "	
	cQuery1+="AliquotaFCP(danfe.E_UF) AS pFCPUFDest,  "	
	cQuery1+="AliquotaIcms(danfe.E_UF, danfe.E_UF) AS pICMSUFDest,  "	
	cQuery1+="AliquotaIcms(danfe.C_UF, danfe.E_UF) AS pICMSInter,  "	
	cQuery1+="0.00 AS pICMSOrigemPart,  "	
	cQuery1+="100.00 AS pICMSDestinoPart,  "	
	cQuery1+="ROUND(((pedidositens.VLRTOT  - (ROUND((pedidos.TOTDES * (pedidositens.QTDPRO * pedidositens.VLRUNI) / ( pedidos.TOTAL_GERAL ) ),4)) ) * ((AliquotaIcms(danfe.E_UF, danfe.E_UF) - AliquotaIcms(danfe.C_UF, danfe.E_UF) ) / 100)), 2)  AS DIFAL,  "	
	cQuery1+="ROUND(((pedidositens.VLRTOT  - (ROUND((pedidos.TOTDES * (pedidositens.QTDPRO * pedidositens.VLRUNI) / ( pedidos.TOTAL_GERAL ) ),4)) ) *  (AliquotaFCP(danfe.E_UF) / 100)), 2) AS vFCPUFDest,  "	
	cQuery1+="ROUND((((pedidositens.VLRTOT  - (ROUND((pedidos.TOTDES * (pedidositens.QTDPRO * pedidositens.VLRUNI) / ( pedidos.TOTAL_GERAL ) ),4)) ) * ((AliquotaIcms(danfe.E_UF, danfe.E_UF) - AliquotaIcms(danfe.C_UF, danfe.E_UF) ) / 100)) * (100 / 100)), 2) AS vICMSUFDest,  "	
	cQuery1+="ROUND((((pedidositens.VLRTOT  - (ROUND((pedidos.TOTDES * (pedidositens.QTDPRO * pedidositens.VLRUNI) / ( pedidos.TOTAL_GERAL ) ),4)) ) * ((AliquotaIcms(danfe.E_UF, danfe.E_UF) - AliquotaIcms(danfe.C_UF, danfe.E_UF) ) / 100)) * (0 / 100)), 2) AS vICMSUFRemet,  "	
	cQuery1+="CASE regrastributarias.Origem_Mercadoria  "	
	cQuery1+="	WHEN '0' THEN ROUND((((pedidositens.QTDPRO * pedidositens.VLRUNI) * ncm.NACFED)/100),2)    "	
	cQuery1+="	WHEN '3' THEN ROUND((((pedidositens.QTDPRO * pedidositens.VLRUNI) * ncm.NACFED)/100),2)    "	
	cQuery1+="	WHEN '4' THEN ROUND((((pedidositens.QTDPRO * pedidositens.VLRUNI) * ncm.NACFED)/100),2)    "	
	cQuery1+="	WHEN '5' THEN ROUND((((pedidositens.QTDPRO * pedidositens.VLRUNI) * ncm.NACFED)/100),2)   "	 
	cQuery1+="ELSE   "	
	cQuery1+="	ROUND((((pedidositens.QTDPRO * pedidositens.VLRUNI) * ncm.IMPFED)/100),2)    "	
	cQuery1+="END AS vTotFed,   "	
	cQuery1+="ROUND((((pedidositens.QTDPRO * pedidositens.VLRUNI) * ncm.ESTADUAL)/100),2) AS vTotEst,   "	
	cQuery1+="ncm.VERSAO, "
	cQuery1+="pedidositens.ITEM AS nItemPed, "
	cQuery1+="pedidositens.PEDIDOS_ID AS xPed "	
	cQuery1+="FROM pedidositens "	
	cQuery1+="JOIN flag ON flag.FLAG_Id = 1 "
	cQuery1+="JOIN produtos ON produtos.PRODUTOS_Id = pedidositens.PRODUTOS_ID "	
	cQuery1+="JOIN pedidos ON pedidos.PEDIDOS_Id = pedidositens.PEDIDOS_ID "	
	cQuery1+="left JOIN danfe ON danfe.PEDIDOS_ID = pedidos.PEDIDOS_Id "
	cQuery1+="LEFT JOIN regrastributarias ON regrastributarias.Tributo_id = produtos.Tributo_Id "
	cQuery1+="AND regrastributarias.TipoOperacao_id = "	+ LTRIM(STR(::TIPO_OPERACAO)) +  " "
	cQuery1+="AND regrastributarias.Uf = '"  + ::UFDestinatario + "' "
	cQuery1+="LEFT JOIN ncm ON ncm.NUMNCM = produtos.NCM  "	
	cQuery1+="WHERE pedidositens.PEDIDOS_ID = '"+ STRZERO(::nPedido_Id,11,0) + "' "	
	cQuery1+="GROUP BY pedidositens.ITEM  "	
	oQuery1:= CONECCOESCLASS():ExecuteSQL(::oServer, cQuery1)

	IF oQuery1:Eof()
		hwg_MsgSTOP("A EMISSÃO DA NFe/NFCe NÃO PODERÁ SER EFETUADA," + HB_EOL() + ;
					"A TABELA TRIBUTÁRIA DO SISTEMA NÃO CONTÉM" + HB_EOL() + ;
					"REGRAS PARA A UF=" + ::UFDestinatario + HB_EOL() + ;
					"SOLICITE AO RESPONSÁVEL CONTÁBIL A INCLUSÃO DA REGRA"+ HB_EOL() + ;
					"E EMITA NOVAMENTE A NFe/NFCe", "VERIFIQUE!!!") 
		RETURN "<**ERRO**>"
	ENDIF

	DO WHILE ! oQuery1:Eof()
		oQuery2:=CONECCOESCLASS():ExecuteSQL(::oServer, "SELECT ncm.NUMNCM FROM ncm WHERE ncm.NUMNCM = '" +  STRZERO(oQuery1:Fields( "cNCM" ):Value,8,0) + "' " )
		IF oQuery2:Eof()	
			hwg_MsgSTOP("PRODUTO COM NCM INVÁLIDO," + HB_EOL() + ;
				STR(oQuery1:Fields( "cProd" ):Value) + " - " + oQuery1:Fields( "xProd" ):Value + HB_EOL() + ;
				"ATUALIZE O CADASTRO DO PRODUTO"+ HB_EOL() + ;
				"E EMITA NOVAMENTE A NFe/NFCe", "VERIFIQUE!!!") 
			RETURN "<**ERRO**>"
		ENDIF

		IF oQuery1:Fields( "REGRA" ):Value  = 0
			hwg_MsgSTOP("PRODUTO SEM REGRA DE TRIBUTAÇÃO," + HB_EOL() + ;
						STR(oQuery1:Fields( "cProd" ):Value) + " - " + oQuery1:Fields( "xProd" ):Value + HB_EOL() + ;
						"ATUALIZE O CADASTRO DO PRODUTO"+ HB_EOL() + ;
						"E EMITA NOVAMENTE A NFe/NFCe", "VERIFIQUE!!!") 
			RETURN "<**ERRO**>"
		ENDIF
		oQuery1:MoveNext()
	ENDDO
	oQuery1:MoveFirst()

RETURN ::DETALHA_ITENS( oQuery1 )

Código: Selecionar todos

************************************************************************************************************************************************************************************************************************
METHOD DETALHA_ITENS( oQuery1 )	CLASS NotasFiscaisEmissao						
************************************************************************************************************************************************************************************************************************
LOCAL cXml:="";

		DO WHILE ! oQuery1:Eof()
				CXml += '<det nItem="'  +LTRIM(STR(oQuery1:Fields( "nItem" ):Value,3,0) )  +'">'
				CXml += '<prod>'						
				CXml += XmlTag( 'cProd', rtrim(STR(oQuery1:Fields( "cProd" ):Value,11,0))  )
				if oQuery1:Fields( "cEAN" ):Value != 0
					CXml += XmlTag( 'cEAN', strzero(oQuery1:Fields( "cEAN" ):Value,14,0) )
				else
					CXml += XmlTag( 'cEAN', 'SEM GTIN' )
				endif

				CXml += XmlTag( 'xProd', rtrim(oQuery1:Fields( "xProd" ):Value)  )	
				CXml += XmlTag( 'NCM', rtrim(STRZERO(oQuery1:Fields( "cNCM" ):Value,8,0))  )
				if ! EMPTY(oQuery1:Fields( "CEST" ):Value)
					CXml += XmlTag( 'CEST', rtrim(oQuery1:Fields( "CEST" ):Value)  )
				ENDIF
				CXml += XmlTag( 'CFOP', STRZERO(oQuery1:Fields( "nCFOP" ):Value,4,0) )  
				CXml += XmlTag( 'uCom', rtrim(oQuery1:Fields( "uCom" ):Value)   )
				CXml += XmlTag( 'qCom', LTRIM(str(oQuery1:Fields( "qCom" ):Value,14,4))   )
				CXml += XmlTag( 'vUnCom',LTRIM(str(oQuery1:Fields( "vUnCom" ):Value,14,10))   )
				CXml += XmlTag( 'vProd',LTRIM(str(ROUND(oQuery1:Fields( "vProd" ):Value,2),14,2))   )
				if oQuery1:Fields( "cEAN" ):Value != 0
					CXml += XmlTag( 'cEANTrib', strzero(oQuery1:Fields( "cEAN" ):Value,14,0) )
				else
					CXml += XmlTag( 'cEANTrib', 'SEM GTIN' )
				endif
	
				CXml += XmlTag( 'uTrib',rtrim(oQuery1:Fields( "uTrib" ):Value) )
				CXml += XmlTag( 'qTrib',LTRIM(str(oQuery1:Fields( "qTrib" ):Value,14,4)) )
				CXml += XmlTag( 'vUnTrib',LTRIM(str(oQuery1:Fields( "vUnTrib" ):Value,14,10)) )
				IF ! EMPTY(oQuery1:Fields( "vDesc" ):Value)
					CXml += XmlTag( 'vDesc',transform(oQuery1:Fields( "vDesc" ):Value ,'@B 99999999.99') )	
				ENDIF
				CXml += XmlTag( 'indTot','1' )	
				cXml += XmlTag( 'xPed',ltrim(STR(oQuery1:Fields( "xPed" ):Value) )  )	
				CXml += XmlTag( 'nItemPed',ltrim(STR(oQuery1:Fields( "nItemPed" ):Value) )  )	
				CXml += '</prod>'

				CXml += '<imposto>'				
				CXml += XmlTag( 'vTotTrib',ltrim(str(oQuery1:Fields( "vTotFed" ):Value + oQuery1:Fields( "vTotEst" ):Value,14,2))  )
				CXml += '<ICMS>'

				do case
					case oQuery1:Fields( "CST" ):Value = 00
						CXml += ::ICMS_00( oQuery1 )
					case oQuery1:Fields( "CST" ):Value = 01
						CXml += ::ICMS_01( oQuery1 )
					case oQuery1:Fields( "CST" ):Value = 10
						CXml += ::ICMS_10( oQuery1 )	
					case oQuery1:Fields( "CST" ):Value = 11
						CXml += ::ICMS_11( oQuery1 )
					case oQuery1:Fields( "CST" ):Value = 12
						CXml += ::ICMS_12( oQuery1 )
					case oQuery1:Fields( "CST" ):Value = 13
						CXml += ::ICMS_13( oQuery1 )
					case oQuery1:Fields( "CST" ):Value = 14
						CXml += ::ICMS_14( oQuery1 )							
					case oQuery1:Fields( "CST" ):Value = 20
						CXml += ::ICMS_20( oQuery1 )	
					case oQuery1:Fields( "CST" ):Value = 21
						CXml += ::ICMS_21( oQuery1 )							
					case oQuery1:Fields( "CST" ):Value = 30
						CXml += ::ICMS_30( oQuery1 )	
					case oQuery1:Fields( "CST" ):Value = 40
						CXml += ::ICMS_40( oQuery1 )
					case oQuery1:Fields( "CST" ):Value = 41
						CXml += ::ICMS_41( oQuery1 )					
					case oQuery1:Fields( "CST" ):Value = 50
						CXml += ::ICMS_50( oQuery1 )	
					case oQuery1:Fields( "CST" ):Value = 51
						CXml += ::ICMS_51( oQuery1 )		
					case oQuery1:Fields( "CST" ):Value = 52
						CXml += ::ICMS_51( oQuery1 )				
					case oQuery1:Fields( "CST" ):Value = 60
						CXml += ::ICMS_60( oQuery1 )
					case oQuery1:Fields( "CST" ):Value = 70
						CXml += ::ICMS_70( oQuery1 )
					case oQuery1:Fields( "CST" ):Value = 71
						CXml += ::ICMS_71( oQuery1 )
					case oQuery1:Fields( "CST" ):Value = 72
						CXml += ::ICMS_72( oQuery1 )
					case oQuery1:Fields( "CST" ):Value = 73
						CXml += ::ICMS_73( oQuery1 )
					case oQuery1:Fields( "CST" ):Value = 74
						CXml += ::ICMS_74( oQuery1 )
					case oQuery1:Fields( "CST" ):Value = 75
						CXml += ::ICMS_75( oQuery1 )
					case oQuery1:Fields( "CST" ):Value = 90
						CXml += ::ICMS_90( oQuery1 )
					case oQuery1:Fields( "CST" ):Value = 101
						CXml += ::ICMS_101( oQuery1 )
					case oQuery1:Fields( "CST" ):Value = 102
						CXml += ::ICMS_102( oQuery1 )								
					case oQuery1:Fields( "CST" ):Value = 103
						CXml += ::ICMS_103( oQuery1 )								
					case oQuery1:Fields( "CST" ):Value = 201
						CXml += ::ICMS_201( oQuery1 )	
					case oQuery1:Fields( "CST" ):Value = 202
						CXml += ::ICMS_202( oQuery1 )
					case oQuery1:Fields( "CST" ):Value = 203
						CXml += ::ICMS_203( oQuery1 )					
					case oQuery1:Fields( "CST" ):Value = 300
						CXml += ::ICMS_300( oQuery1 )	
					case oQuery1:Fields( "CST" ):Value = 400
						CXml += ::ICMS_400( oQuery1 )						
					case oQuery1:Fields( "CST" ):Value = 500
						CXml += ::ICMS_500( oQuery1 )
					case oQuery1:Fields( "CST" ):Value = 900
						CXml += ::ICMS_900( oQuery1 )
					OTHERWISE
						RETURN "<**ERRO**>"
				ENDCASE

				CXml += '</ICMS>'

				CXml += ::CALCULA_IPI( oQuery1 )
				CXml += ::CALCULA_PIS( oQuery1 )	
				CXml += ::CALCULA_COFINS( oQuery1 )	
				CXml += ::CALCULA_PARTILHA_FCP( oQuery1 )
		
				CXml += '</imposto>'
				CXml += '</det>'	
				::vProd +=ROUND(oQuery1:Fields( "vProd" ):Value,2)
				IF ! EMPTY(oQuery1:Fields( "vDesc" ):Value)
					::vDesc +=ROUND(oQuery1:Fields( "vDesc" ):Value,2)
				ENDIF
				::vTotalFederal	+= oQuery1:Fields( "vTotFed" ):Value
				::vTotalEstadual+= oQuery1:Fields( "vTotEst" ):Value
				oQuery1:MoveNext()
			ENDDO		

			CXml += ::TOTALIZA(  )	

RETURN cXml

Código: Selecionar todos

************************************************************************************************************************************************************************************************************************
METHOD ICMS_00( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS00>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','00' )
		CXml += XmlTag( 'modBC','3' )
		IF oQuery1:Fields( "ICMS_pICMS" ):Value = 0.000
			CXml += XmlTag( 'vBC','0.00' )
			CXml += XmlTag( 'pICMS','0.0000'  )
			CXml += XmlTag( 'vICMS','0.00' )
		ELSE
			CXml += XmlTag( 'vBC',ltrim(str((oQuery1:Fields( "ICMS_vBc" ):Value),14,2)) )
			CXml += XmlTag( 'pICMS',ltrim(str( oQuery1:Fields( "ICMS_pICMS" ):Value,7,4)) )
			CXml += XmlTag( 'vICMS',ltrim(str(oQuery1:Fields( "ICMS_vICMS" ):Value,14,2)) )
			::vBC  +=oQuery1:Fields( "ICMS_vBc" ):Value
			::vICMS+=oQuery1:Fields( "ICMS_vICMS" ):Value
		ENDIF
	CXml += '</ICMS00>'	
	


RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_01( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS01>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','01' )
	CXml += '</ICMS01>'	

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_10( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS10>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','10' )
		IF oQuery1:Fields( "ICMS_pICMS" ):Value = 0.000
			CXml += XmlTag( 'vBC','0.00' )
			CXml += XmlTag( 'pICMS','0.0000'  )
			CXml += XmlTag( 'vICMS','0.00' )
		ELSE
			CXml += XmlTag( 'vBC',ltrim(str((oQuery1:Fields( "ICMS_vBc" ):Value),14,2)) )
			CXml += XmlTag( 'pICMS',ltrim(str( oQuery1:Fields( "ICMS_pICMS" ):Value,7,4)) )
			CXml += XmlTag( 'vICMS',ltrim(str(oQuery1:Fields( "ICMS_vICMS" ):Value,14,2)) )
			::vBC  +=oQuery1:Fields( "ICMS_vBc" ):Value
			::vICMS+=oQuery1:Fields( "ICMS_vICMS" ):Value
		ENDIF		
	CXml += '</ICMS10>'

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_11( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS11>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','11' )
	CXml += '</ICMS11>'	

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_12( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS12>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','12' )
	CXml += '</ICMS12>'	

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_13( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS13>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','13' )
	CXml += '</ICMS13>'	

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_14( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS14>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','14' )
	CXml += '</ICMS14>'	

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_20( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS20>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','20' )

		IF oQuery1:Fields( "ICMS_pICMS" ):Value = 0.000
			CXml += XmlTag( 'vBC','0.00' )
			CXml += XmlTag( 'pICMS','0.0000'  )
			CXml += XmlTag( 'vICMS','0.00' )
			CXml += XmlTag( 'vICMSDeson', '0.00' )
			CXml += XmlTag( 'motDesICMS', '9' )
		ELSE
			CXml += XmlTag( 'vBC',ltrim(str((oQuery1:Fields( "ICMS_vBc" ):Value),14,2)) )
			CXml += XmlTag( 'pICMS',ltrim(str( oQuery1:Fields( "ICMS_pICMS" ):Value,7,4)) )
			CXml += XmlTag( 'vICMS',ltrim(str(oQuery1:Fields( "ICMS_vICMS" ):Value,14,2)) )
			CXml += XmlTag( 'vICMSDeson', '0.00' )
			CXml += XmlTag( 'motDesICMS', '9' )
			::vBC  +=oQuery1:Fields( "ICMS_vBc" ):Value
			::vICMS+=oQuery1:Fields( "ICMS_vICMS" ):Value
		ENDIF
	CXml += '</ICMS20>'	

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_21( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS21>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','21' )
	CXml += '</ICMS21>'	

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_30( oQuery1 ) CLASS  NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS30>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','30' )
		CXml += XmlTag( 'modBCST','0' )
		CXml += XmlTag( 'pMVAST','0.0000' )
		CXml += XmlTag( 'pRedBCST','0.0000' )		
		IF oQuery1:Fields( "ICMS_pICMS" ):Value = 0.000
			CXml += XmlTag( 'vBC','0.00' )
			CXml += XmlTag( 'pICMS','0.0000'  )
			CXml += XmlTag( 'vICMS','0.00' )
		ELSE
			CXml += XmlTag( 'vBC',ltrim(str((oQuery1:Fields( "ICMS_vBc" ):Value),14,2)) )
			CXml += XmlTag( 'pICMS',ltrim(str( oQuery1:Fields( "ICMS_pICMS" ):Value,7,4)) )
			CXml += XmlTag( 'vICMS',ltrim(str(oQuery1:Fields( "ICMS_vICMS" ):Value,14,2)) )
			::vBCST  +=oQuery1:Fields( "ICMS_vBc" ):Value
			::vST 	+=((oQuery1:Fields( "ICMS_vBc" ):Value * oQuery1:Fields( "ALIQICMS" ):Value) / 100)	
		ENDIF		
		CXml += XmlTag( 'vICMSDeson','0.00' )
		CXml += XmlTag( 'motDesICMS','9' )
	CXml += '</ICMS30>'	

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_40( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS40>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','40' )
	CXml += '</ICMS40>'	

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_41( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

*----> modificado para 40 pois o 41 da erro 18/11/2020

	CXml := '<ICMS41>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','41' )
	CXml += '</ICMS41>'						
	
RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_50( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS50>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','50' )
	CXml += '</ICMS50>'	

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_51( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS51>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','51' )
		CXml += XmlTag( 'modBC','3' )
		CXml += XmlTag( 'pRedBC','0.0000' )
		CXml += XmlTag( 'vBC',ltrim(str((oQuery1:Fields( "ICMS_vBc" ):Value),14,2)) )
		CXml += XmlTag( 'pICMS',ltrim(str( oQuery1:Fields( "ICMS_pICMS" ):Value,7,4)) )
		CXml += XmlTag( 'vICMSOp','0.00' )
		CXml += XmlTag( 'pDif','0.0000' )
		CXml += XmlTag( 'vICMSDif','0.0000' )
		CXml += XmlTag( 'vICMS',ltrim(str(oQuery1:Fields( "ICMS_vICMS" ):Value,14,2)) )	
	CXml += '</ICMS51>'
	::vBCST  	+=oQuery1:Fields( "ICMS_vBc" ):Value
	::vST		+=((oQuery1:Fields( "ICMS_vBc" ):Value * oQuery1:Fields( "ALIQICMS" ):Value) / 100)							
	
RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_52( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS51>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','52' )
	CXml += '</ICMS52>'	

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_60( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS60>'
		if ::UFEmitente != ::UFDestinatario   
			CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
			CXml += XmlTag( 'CST','60' )
			CXml += XmlTag( 'vBCSTRet',0.00)
			CXml += XmlTag( 'pST', 0.0000)
			CXml += XmlTag( 'vICMSSubstituto', 0.00)
			CXml += XmlTag( 'vICMSSTRet', 0.00)
			CXml += XmlTag( 'pRedBCEfet',0.0000)
			CXml += XmlTag( 'vBCEfet',0.00)
			CXml += XmlTag( 'pICMSEfet',0.0000)
			CXml += XmlTag( 'vICMSEfet',0.00)
		else
			CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
			CXml += XmlTag( 'CST','60' )

		endif
	CXml += '</ICMS60>'

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_70( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS70>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','70' )
		CXml += XmlTag( 'modBC','3' )
		CXml += XmlTag( 'pRedBC','0.0000' )
		CXml += XmlTag( 'modBCST','0.0000' )
		CXml += XmlTag( 'pRedBCST','0.0000' )
		CXml += XmlTag( 'vBCST',ltrim(str((oQuery1:Fields( "ICMS_vBc" ):Value),14,2)) )			
		CXml += XmlTag( 'pICMSST',ltrim(str(oQuery1:Fields( "ICMS_pICMS" ):Value,7,4)) )
		CXml += XmlTag( 'vICMS',ltrim(str(oQuery1:Fields( "ICMS_vICMS" ):Value,14,2)) )			
		CXml += XmlTag( 'vICMSDeson','0.00' )
		CXml += XmlTag( 'motDesICMS','9' )
	CXml += '</ICMS70>'	

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_71( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS71>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','71' )
	CXml += '</ICMS71>'	

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_72( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS72>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','72' )
	CXml += '</ICMS72>'	

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_73( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS73>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','73' )
	CXml += '</ICMS73>'	

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_74( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS74>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','74' )
	CXml += '</ICMS74>'	

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_75( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS75>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','75' )
	CXml += '</ICMS75>'	

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_90( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMS90>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0) )
		CXml += XmlTag( 'CST','90' )
		CXml += XmlTag( 'modBC','3' )
	//			CXml += XmlTag( 'pRedBC','0.0000' )
	//			CXml += XmlTag( 'modBCST','0.0000' )
	//			CXml += XmlTag( 'pRedBCST','0.0000' )
		CXml += XmlTag( 'vBC',ltrim(str((oQuery1:Fields( "ICMS_vBc" ):Value),14,2)) )			
		CXml += XmlTag( 'pICMS',ltrim(str(oQuery1:Fields( "ICMS_pICMS" ):Value,7,4)) )
		CXml += XmlTag( 'vICMS',ltrim(str(oQuery1:Fields( "ICMS_vICMS" ):Value,14,2)) )		
		CXml += XmlTag( 'vICMSDeson','0.00' )
		CXml += XmlTag( 'motDesICMS','9' )
	CXml += '</ICMS90>'	

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_101( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMSSN101>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0)  )
		CXml += XmlTag( 'CSOSN','101'  )
	CXml += '</ICMSSN101>'	
	
RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_102( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;	

	CXml := '<ICMSSN102>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0)  )
		CXml += XmlTag( 'CSOSN','102'  )
	CXml += '</ICMSSN102>'

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_103( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;	

	CXml := '<ICMSSN102>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0)  )
		CXml += XmlTag( 'CSOSN','103'  )
	CXml += '</ICMSSN102>'

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_201( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml += '<ICMSSN201>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0)  )
		CXml += XmlTag( 'CSOSN','201'  )
		CXml += XmlTag( 'modBCST', '4')
		CXml += XmlTag( 'pMVAST', '0.00')
		CXml += XmlTag( 'vBCST', '0.00')
		CXml += XmlTag( 'pICMSST', '0.00')
		CXml += XmlTag( 'vICMSST', '0.00')
		CXml += XmlTag( 'pCredSN', '0.00')
		CXml += XmlTag( 'vCredICMSSN', '0.00')
	CXml += '</ICMSSN201>'
	
RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_202( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;	

	CXml := '<ICMSSN202>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0)  )
		CXml += XmlTag( 'CSOSN','202'  )
	CXml += '</ICMSSN202>'					

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_203( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;	

	CXml := '<ICMSSN202>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0)  )
		CXml += XmlTag( 'CSOSN','203'  )
	CXml += '</ICMSSN202>'	

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_300( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;	

	CXml := '<ICMSSN300>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0)  )
		CXml += XmlTag( 'CSOSN','300'  )
	CXml += '</ICMSSN300>'

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_400( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;	

	CXml := '<ICMSSN400>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0)  )
		CXml += XmlTag( 'CSOSN','400'  )
	CXml += '</ICMSSN400>'
	
RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_500( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMSSN500>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0)  )
		CXml += XmlTag( 'CSOSN','500'  )
	CXml += '</ICMSSN500>'
	
RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD ICMS_900( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml ;

	CXml := '<ICMSSN900>'
		CXml += XmlTag( 'orig',STRZERO(oQuery1:Fields( "ICMS_ORIG" ):Value,1,0)  )
		CXml += XmlTag( 'CSOSN','900'  )
	CXml += '</ICMSSN900>'

RETURN CXml

sefazclass for dummies

Enviado: 28 Jun 2023 15:51
por Fernando queiroz

Código: Selecionar todos

************************************************************************************************************************************************************************************************************************
METHOD CALCULA_IPI( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml:="" ;

		if ! empty(oQuery1:Fields( "IPI_CST" ):Value)
			CXml := '<IPI>'
				CXml += XmlTag( 'cEnq', STRZERO(oQuery1:Fields( "IPI_ENQ" ):Value,3,0)  )
				IF oQuery1:Fields( "IPI_Aliq" ):Value # 0.00
						cXml += '<IPI_Aliq>'
							CXml += XmlTag( 'CST',STRZERO(oQuery1:Fields( "IPI_CST" ):Value,3,0)  )
							cXml += XmlTag( 'vBC',ltrim(str(oQuery1:Fields( "IPI_vBc" ):Value,14,2)) )
							cXml += XmlTag( 'pIPI',ltrim(str(oQuery1:Fields( "IPI_Aliq" ):Value,7,4))  )
							cXml += XmlTag( 'vIPI',ltrim(str(oQuery1:Fields( "IPI_vIPI" ):Value,14,2)) ) 
						cXml += '</IPI_Aliq>'
				ELSE	
					IF oQuery1:Fields( "IPI_CST" ):Value = 99
							cXml += '<IPITrib>'
								cXml += XmlTag( 'CST',"99" )
								cXml += XmlTag( 'vBC','0.00' )
								cXml += XmlTag( 'pIPI','0.00'  )
								cXml += XmlTag( 'vIPI','0.00' ) 
							cXml += '</IPITrib>'
					ELSE
							cXml += '<IPINT>'
								CXml += XmlTag( 'CST',STRZERO(oQuery1:Fields( "IPI_CST" ):Value,3,0)  )
							cXml += '</IPINT>'
					ENDIF
				ENDIF
			CXml += '</IPI>'
		ENDIF

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD CALCULA_PIS( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml:="" ;

	IF ::UFEmitente != ::UFDestinatario 								&& VENDA INTER-ESTADUAL ( UF DIFERENTES)
		IF oQuery1:Fields( "PIS_pPIS" ):Value # 0.00					
			cXml += '<PIS>'
					cXml += '<PISAliq>'
							cXml += XmlTag( 'CST', STRZERO(oQuery1:Fields( "PIS_ST" ):Value,2,0) )
							cXml += XmlTag( 'vBC',ltrim(str(oQuery1:Fields( "PIS_vBc" ):Value,14,2)) )
							cXml += XmlTag( 'pPIS',ltrim(str(oQuery1:Fields( "PIS_pPIS" ):Value,7,4))  )
							cXml += XmlTag( 'vPIS',ltrim(str(oQuery1:Fields( "PIS_vPIS" ):Value,14,2)) ) 
							::vPIS += oQuery1:Fields( "PIS_vPIS" ):Value
					cXml += '</PISAliq>'
			cXml += '</PIS>'
		ELSE
			cXml := '<PIS>'
				cXml += '<PISNT>'
					cXml += XmlTag( 'CST', STRZERO(oQuery1:Fields( "PIS_st" ):Value,2,0) )
				cXml += '</PISNT>'
			cXml += '</PIS>'	
		ENDIF	
	ELSE
		IF oQuery1:Fields( "PIS_pPIS" ):Value # 0.00	
			cXml := '<PIS>'
				cXml += '<PISAliq>'
					cXml += XmlTag( 'CST',STRZERO(oQuery1:Fields( "PIS_ST" ):Value,2,0) )
					cXml += XmlTag( 'vBC',ltrim(str(oQuery1:Fields( "PIS_vBc" ):Value,14,2)) )
					cXml += XmlTag( 'pPIS',ltrim(str(oQuery1:Fields( "PIS_pPIS" ):Value,7,4))  )
					cXml += XmlTag( 'vPIS',ltrim(str(oQuery1:Fields( "PIS_vPIS" ):Value,14,2)) ) 
					::vPIS += oQuery1:Fields( "PIS_vPIS" ):Value
				cXml += '</PISAliq>'
			cXml += '</PIS>'
		ELSE
			cXml := '<PIS>'
				IF oQuery1:Fields( "PIS_ST" ):Value = 99
					cXml += '<PISOutr>'
						cXml += XmlTag( 'CST',"99" )
						cXml += XmlTag( 'vBC','0.00' )
						cXml += XmlTag( 'pPIS','0.00'  )
						cXml += XmlTag( 'vPIS','0.00' ) 
					cXml += '</PISOutr>'
				ELSE
					cXml += '<PISAliq>'
						cXml += XmlTag( 'CST', STRZERO(oQuery1:Fields( "PIS_st" ):Value,2,0) )
						cXml += XmlTag( 'vBC','0.00' )
						cXml += XmlTag( 'pPIS','0.00'  )
						cXml += XmlTag( 'vPIS','0.00' ) 
					cXml += '</PISAliq>'
				ENDIF
			cXml += '</PIS>'					
		ENDIF
	ENDIF

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD CALCULA_COFINS( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL CXml:="" ;


	IF ::UFEmitente != ::UFDestinatario 								&& VENDA INTER-ESTADUAL ( UF DIFERENTES)
		IF oQuery1:Fields( "COF_pCOFINS" ):Value # 0.00			
			cXml += '<COFINS>'
					cXml += '<COFINSAliq>'
							cXml += XmlTag( 'CST', STRZERO(oQuery1:Fields( "COF_ST" ):Value,2,0) ) 
							cXml += XmlTag( 'vBC',ltrim(str(oQuery1:Fields( "COF_vBc" ):Value,14,2)) )  
							cXml += XmlTag( 'pCOFINS',ltrim(str(oQuery1:Fields( "COF_pCOFINS" ):Value,7,4))  ) 
							cXml += XmlTag( 'vCOFINS',ltrim(str(oQuery1:Fields( "COF_vCOFINS" ):Value,14,2)) )   
							::vCOFINS += oQuery1:Fields( "COF_vCOFINS" ):Value
					cXml += '</COFINSAliq>'
			cXml += '</COFINS>'
		ELSE
			cXml := '<COFINS>'
				cXml += '<COFINSNT>'
					cXml += XmlTag( 'CST', STRZERO(oQuery1:Fields( "COF_st" ):Value,2,0) ) 
				cXml += '</COFINSNT>'
			cXml += '</COFINS>'						
		ENDIF
	else																							&& VENDA LOCAL ( MESMA UF)
		IF oQuery1:Fields( "COF_pCOFINS" ):Value  # 0.00							
			cXml := '<COFINS>'
				cXml += '<COFINSAliq>'
					cXml += XmlTag( 'CST', STRZERO(oQuery1:Fields( "COF_ST" ):Value,2,0) ) 
					cXml += XmlTag( 'vBC',ltrim(str(oQuery1:Fields( "COF_vBc" ):Value,14,2)) )  
					cXml += XmlTag( 'pCOFINS',ltrim(str(oQuery1:Fields( "COF_pCOFINS" ):Value,7,4))  ) 
					cXml += XmlTag( 'vCOFINS',ltrim(str(oQuery1:Fields( "COF_vCOFINS" ):Value,14,2)) )   
					::vCOFINS += oQuery1:Fields( "COF_vCOFINS" ):Value
				cXml += '</COFINSAliq>'
			cXml += '</COFINS>'	
		ELSE
			cXml := '<COFINS>'
				IF oQuery1:Fields( "COF_ST" ):Value = 99
					cXml += '<COFINSOutr>'
						cXml += XmlTag( 'CST', '99' ) 
						cXml += XmlTag( 'vBC','0.00' )  
						cXml += XmlTag( 'pCOFINS','0.00'  ) 
						cXml += XmlTag( 'vCOFINS','0.00' ) 
					cXml += '</COFINSOutr>'
				ELSE
					cXml += '<COFINSAliq>'
						cXml += XmlTag( 'CST', STRZERO(oQuery1:Fields( "COF_st" ):Value,2,0) ) 
						cXml += XmlTag( 'vBC','0.00' )  
						cXml += XmlTag( 'pCOFINS','0.00'  ) 
						cXml += XmlTag( 'vCOFINS','0.00' ) 
					cXml += '</COFINSAliq>'
				ENDIF
			cXml += '</COFINS>'						
		ENDIF
	ENDIF
RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD CALCULA_PARTILHA_FCP( oQuery1 ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************	
LOCAL cXml:="";
	, pAliquotaFCP ;
	, vBCUFDest ;
	, UFEmitente ;
	, UfDestinatario ;
	, pICMSUFDest ;
	, pICMSInter ;
	, pICMSOrigemPart ;
	, pICMSDestinoPart ;
	, vDIFAL ;
	, vFCPUFDest ;
	, vICMSUFDest ;
	, vICMSUFRemet 

		if ::C_CRT == "3"
			IF ::UFEmitente != ::UFDestinatario
				if ::e_indie = '9'
					pAliquotaFCP := (::AliquotaFCP( oQuery1:Fields( "UfDestinatario" ):Value ))
					vBCUFDest := oQuery1:Fields( "vProd" ):Value - oQuery1:Fields( "vDesc" ):Value
					UFEmitente := oQuery1:Fields( "UFEmitente" ):Value
					UfDestinatario := oQuery1:Fields( "UfDestinatario" ):Value
					pICMSUFDest := ::AliquotaICMS( UfDestinatario, UfDestinatario)
					pICMSInter := ::AliquotaICMS( UFEmitente, UfDestinatario)
					pICMSOrigemPart := 0.00
					pICMSDestinoPart := 100.00
					vDIFAL := (vBCUFDest * ((pICMSUFDest - pICMSInter )/100))
					vFCPUFDest   := (vBCUFDest * (pAliquotaFCP / 100))
					vICMSUFDest  := (vDIFAL * (pICMSDestinoPart / 100))
					vICMSUFRemet := (vDIFAL * (pICMSOrigemPart / 100))

					cXml += '<ICMSUFDest>'
						cXml += XmlTag('vBCUFDest', transform(vBCUFDest ,'@B 99999999.99'))     
						cXml += XmlTag('pFCPUFDest', transform(pAliquotaFCP,'@B 99999999.99'))
						cXml += XmlTag('pICMSUFDest', transform(pICMSUFDest,'@B 99999999.99'))
						cXml += XmlTag('pICMSInter', transform(pICMSInter,'@B 99999999.99'))
						cXml += XmlTag('pICMSInterPart', transform(pICMSDestinoPart,'@B 99999999.99'))			
						cXml += XmlTag('vFCPUFDest', transform(vFCPUFDest,'@B 99999999.99'))
						cXml += XmlTag('vICMSUFDest', transform(vICMSUFDest,'@B 99999999.99'))
						cXml += XmlTag('vICMSUFRemet', transform(vICMSUFRemet,'@B 99999999.99'))
					cXml += '</ICMSUFDest>'

					::TvFCPUFDest     += oQuery1:Fields( "vFCPUFDest" ):Value
					::TvICMSUFDest    += oQuery1:Fields( "vICMSUFDest" ):Value
					::TvICMSUFRemet   += oQuery1:Fields( "vICMSUFRemet" ):Value
				endif
			endif
		ENDIF

RETURN cXml
************************************************************************************************************************************************************************************************************************
METHOD TOTALIZA(  ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************	
LOCAL cXml;

	CXml := '<total>'
	CXml += '<ICMSTot>'
	CXml += XmlTag( 'vBC',LTRIM(str(::Vbc,14,2)) )
	CXml += XmlTag( 'vICMS',LTRIM(str(::vICMS,14,2)) )		
	CXml += XmlTag( 'vICMSDeson',LTRIM(str(::vICMSDeson,14,2)) )
	if ::C_CRT == "3"	
		CXml += XmlTag( 'vFCPUFDest',ltrim(str(ROUND(::TvFCPUFDest,2),14,2))	)
		CXml += XmlTag( 'vICMSUFDest',ltrim(str(ROUND(::TvICMSUFDest,2),14,2)) )
		CXml += XmlTag( 'vICMSUFRemet',ltrim(str(ROUND(::TvICMSUFRemet,2),14,2)) )
	ENDIF
	CXml += XmlTag( 'vFCP',transform(::vFCP,'@B 99999999.99'))
	CXml += XmlTag( 'vBCST',transform(::vBCST,'@B 99999999.99'))
	CXml += XmlTag( 'vST',transform(::vST,'@B 99999999.99'))
	CXml += XmlTag( 'vFCPST',transform(::vFCPST,'@B 99999999.99'))
	CXml += XmlTag( 'vFCPSTRet',transform(::vFCPSTRet,'@B 99999999.99'))
	CXml += XmlTag( 'vProd',transform(::vPROD,'@B 99999999.99'))
	CXml += XmlTag( 'vFrete',transform(::vFrete,'@B 99999999.99'))
	CXml += XmlTag( 'vSeg',transform(::vSeg,'@B 99999999.99'))
	CXml += XmlTag( 'vDesc',transform(::vDesc ,'@B 99999999.99'))
	CXml += XmlTag( 'vII',transform(::vII,'@B 99999999.99'))	
	CXml += XmlTag( 'vIPI',transform(::vIPI,'@B 99999999.99'))
	CXml += XmlTag( 'vIPIDevol',transform(::vIPIDevol,'@B 99999999.99'))
	CXml += XmlTag( 'vPIS',transform(::vPIS,'@B 99999999.99'))	
	CXml += XmlTag( 'vCOFINS',transform(::vCOFINS,'@B 99999999.99')	)
	CXml += XmlTag( 'vOutro',transform(::vOutro,'@B 99999999.99'))
	CXml += XmlTag( 'vNF',transform(::W_vNF,'@B 99999999.99'))
	CXml += XmlTag( 'vTotTrib',transform( (::vTotalFederal + ::vTotalEstadual),'@B 99999999.99'))
	CXml += '</ICMSTot>'
	CXml += '</total>'

RETURN CXml
************************************************************************************************************************************************************************************************************************
METHOD TRANSPORTE(  ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL cXml;

		cXml := '<transp>'
			CXml += XmlTag( 'modFrete','9' )
		CXml += '</transp>'
		
/*		cXml := '<transp>
			cXml := XmlTag( '<modFrete>', '0')
				cXml := '<transporta>'
					cXml := XmlTag( '<CNPJ>', '78261252000242')
					cXml := XmlTag( '<xNome>', 'TRANSPORTES BOTUVERA LTDA')
					cXml := XmlTag( '<IE>', '133302580')
					cXml := XmlTag( '<xEnder>', 'ROD. BR 163 S/N DISTRITO INDUSTRIAL VETORASSO')
					cXml := XmlTag( '<xMun>', 'RONDONOPOLIS')
					cXml := XmlTag( '<UF>', 'MT')
				cXml := '</transporta>'
			cXml := '<vol>'
				cXml := XmlTag( '<qVol>', '1650')
				cXml := XmlTag( '<pesoL>', '49500.000' )
				cXml := XmlTag( '<pesoB>', '49500.000' )
			cXml := '</vol>' 
		cXml := '</transp>
*/
		
RETURN cXml
************************************************************************************************************************************************************************************************************************
METHOD COBRANCA(  ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL cFat:="";
	, cDup:="";
	, vOrig:=0.00;
	, cQuery1;
	, oQuery1;

		cQuery1:="SELECT "
		cQuery1+="pedidospagamento.PGTO_Id "
		cQuery1+="FROM pedidospagamento "
		cQuery1+="WHERE pedidospagamento.PEDIDOS_ID = '" + STRZERO(::nPedido_Id,11,0) + "'  AND pedidospagamento.TIPPGTO_ID = 15 "
		oQuery1:= CONECCOESCLASS():ExecuteSQL(::oServer, cQuery1)
		if ! oQuery1:Eof()

				cQuery1:="SELECT "
				cQuery1+="receber.DOCUMENTO, "
				cQuery1+="receber.PARCELA, "
				cQuery1+="receber.DATVEN, "
				cQuery1+="receber.VALOR "
				cQuery1+="FROM receber "
				cQuery1+="WHERE receber.CLIENTES_ID = '" + strzero(::Cliente_Id,11,0) + "' AND receber.DOCUMENTO = '" + STRZERO(::nPedido_Id,11,0) + "' "
				oQuery1:= CONECCOESCLASS():ExecuteSQL(::oServer, cQuery1)

				if ! oQuery1:Eof()
					do while ! oQuery1:Eof()
						cDup += '<dup>'
							cDup += XmlTag( 'nDup', STRZERO(oQuery1:Fields( "PARCELA" ):Value,3,0) ) 
							cDup += XmlTag( 'dVenc', HB_DTOC(oQuery1:Fields( "DATVEN" ):Value, "DD-MM-YYYY" ) )
							cDup += XmlTag( 'vDup', ltrim(str(oQuery1:Fields( "VALOR" ):Value, 14,2) ) )
						cDup += '</dup>'
						vOrig += oQuery1:Fields( "VALOR" ):Value
						oQuery1:MoveNext()
					ENDDO	
					oQuery1:MoveFirst()
					cFat += '<fat>'
						cFat += XmlTag( 'nFat', ltrim(STR(oQuery1:Fields( "DOCUMENTO" ):Value,11,0 ) ) )
						cFat += XmlTag( 'vOrig', ltrim(STR(vOrig) ) )
						cFat += XmlTag( 'vDesc', '0' )
						cFat += XmlTag( 'vLiq', ltrim(STR(vOrig) ) )
					cFat += '</fat>'
				endif
		ENDIF

RETURN cFat + cDup
************************************************************************************************************************************************************************************************************************
METHOD PAGAMENTO(  ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL cXml

	do case
		case ::TIPO_OPERACAO = 40
			cXml := ::PAGAMENTO_40()
		OTHERWISE
			cXml := ::PAGAMENTO_GERAL()
	endcase

RETURN cXml
************************************************************************************************************************************************************************************************************************
METHOD PAGAMENTO_GERAL(  ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL cXml;
	, cQuery1;
	, oQuery1;

		cQuery1:="SELECT "
		cQuery1+="pedidospagamento.TIPPGTO_ID,  "
		cQuery1+="pedidospagamento.CARTAO_ID,  "
		cQuery1+="pedidospagamento.VALOR,  "
		cQuery1+="pedidospagamento.TROCO,  "	
		cQuery1+="pedidospagamento.PARCELAS,  "
		cQuery1+="pedidospagamento.AUTORIZACAO, "
		cQuery1+="pedidospagamento.XPAG "
		cQuery1+="FROM pedidospagamento  "
		cQuery1+="LEFT JOIN cartaobandeira ON cartaobandeira.CODIGO = pedidospagamento.CARTAO_ID  "
		cQuery1+="JOIN formapagamento ON formapagamento.TIPPGTO_Id = pedidospagamento.TIPPGTO_ID  "
		cQuery1+="WHERE pedidospagamento.PEDIDOS_ID = '" + STRZERO(::nPedido_Id,11,0) + "' "
		cQuery1+="ORDER BY pedidospagamento.TIPPGTO_ID "
		oQuery1:= CONECCOESCLASS():ExecuteSQL(::oServer, cQuery1)

		cXml := '<pag>'
		DO WHILE ! oQuery1:Eof()
				CXml += '<detPag>'
				IF oQuery1:Fields( "PARCELAS" ):Value = 0
					CXml += XmlTag( 'indPag','0')
				else
					CXml += XmlTag( 'indPag','1')
				endif
				CXml += XmlTag( 'tPag',STRZERO(oQuery1:Fields( "TIPPGTO_ID" ):Value,2,0))
				IF ! EMPTY(oQuery1:Fields( "XPAG" ):Value)
					CXml += XmlTag( '<xPag>',oQuery1:Fields( "XPAG" ):Value)
				ENDIF
				CXml += XmlTag( 'vPag',LTRIM(STR(oQuery1:Fields( "VALOR" ):Value,14,2)))
				IF oQuery1:Fields( "CARTAO_ID" ):Value != 0
					CXml += '<card>'
					CXml += XmlTag( 'tpIntegra','2')
					CXml += XmlTag( 'tBand',STRZERO(oQuery1:Fields( "CARTAO_ID" ):Value,2,0))
					IF oQuery1:Fields( "AUTORIZACAO" ):Value != 0
						CXml += XmlTag( 'cAut',STRZERO(oQuery1:Fields( "AUTORIZACAO" ):Value,2,0))
					ENDIF
					CXml += '</card>'
				endif

				CXml += '</detPag>'
				IF oQuery1:Fields( "TROCO" ):Value != 0
					CXml += XmlTag( 'vTroco',LTRIM(STR(oQuery1:Fields( "TROCO" ):Value,14,2)))
				endif
				oQuery1:MoveNext( )
		ENDDO
		cXml += '</pag>'	


RETURN cXml
************************************************************************************************************************************************************************************************************************
METHOD PAGAMENTO_40(  ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL cXml;
	

		cXml := '<pag>'
			CXml += '<detPag>'
				CXml += XmlTag( 'indPag','0')
				CXml += XmlTag( 'tPag','90')
				CXml += XmlTag( 'vPag','0.00')
			CXml += '</detPag>'
		cXml += '</pag>'	


RETURN cXml
************************************************************************************************************************************************************************************************************************
METHOD INFORMACOES_ADICIONAIS(  ) CLASS NotasFiscaisEmissao
************************************************************************************************************************************************************************************************************************
LOCAL cXml;
	, cQuery1;

	::Z_INFCPL := rtrim(::Z_INFCPL)
	::Z_INFCPL  := STRTRAN(::Z_INFCPL,"<TRIBFED>",ALLTRIM(str(::vTotalFederal)))
	::Z_INFCPL  := STRTRAN(::Z_INFCPL,"<TRIBEST>",ALLTRIM(str(::vTotalEstadual)))	

	cQuery1:="UPDATE danfe SET "
	cQuery1+="danfe.Z_INFCPL = '" + ::Z_INFCPL + "', "
	cQuery1+="where danfe.PEDIDOS_Id = '" + STRZERO(::nPedido_Id,11,0) +  "' "
	CONECCOESCLASS():ExecuteSQL(::oServer,  cQuery1 )

	cXml := '<infAdic>'
//		IF oQuery1:Fields( "b_finNFe" ):Value = "4"								&& DEVOLUÇAO DE MERCADORIA					
//			CXml += XmlTag('infAdFisco' + rtrim(Memo2) )		
//		ENDIF
		CXml += XmlTag( 'infCpl',::Z_INFCPL )
	CXml += '</infAdic>'
	CXml += '</infNFe>'
	CXml += '</NFe>'



RETURN cXml

sefazclass for dummies

Enviado: 29 Jun 2023 11:34
por JoséQuintas
Só esqueceu de mencionar que essa outra parte é pra gerar XML.
Talvez prefira fazer direto no MySQL.
Apenas o bloco de totais, pra dar uma idéia:

Código: Selecionar todos

CREATE FUNCTION ze_XmlNfeTotais( nIdNotFis INT(11) )
RETURNS TEXT CHARSET latin1

BEGIN

DECLARE cXml TEXT;
DECLARE nIcmBas, nIcmVal, nSubBas, nSubVal, nValPro, nValFre, nValSeg DECIMAL(16,2);
DECLARE nValDes, nIIVal, nPisVal, nCofVal, nValOut, nImpVal, nValNot  DECIMAL(16,2);
DECLARE nIpiVal, nDifValf, nDifVali DECIMAL(16,2);
DECLARE nComplementar INT(11);

SET cXml := '';

SELECT NFICMBAS, NFICMVAL, NFSUBBAS, NFSUBVAL, NFVALPRO, NFVALFRE,
   NFVALSEG, NFVALDES, NFIIVAL, NFIPIVAL, NFPISVAL, NFCOFVAL, NFVALOUT + NFVALEXT,
   NFIMPVAL, NFVALNOT, COALESCE( SUM( IPDIFVALF ), 0.00 ), COALESCE( SUM( IPDIFVALI ), 0.00 ),
   SUM( IF( NFCFOP = '1.604' OR INSTR( IENOME, ' DE ICMS' ) != 0, 1, 0 ) )
FROM JPNOTFIS
LEFT JOIN JPPEDIDO ON JPPEDIDO.IDPEDIDO = JPNOTFIS.NFPEDIDO
LEFT JOIN JPITPED ON JPITPED.IPPEDIDO = JPPEDIDO.IDPEDIDO
LEFT JOIN JPITEM ON JPITEM.IDPRODUTO = JPITPED.IPPRODUTO
WHERE IDNOTFIS = nIdNotFis
INTO nIcmBas, nIcmVal, nSubBas, nSubVal, nValPro, nValFre, nValSeg, nValDes, nIIVal, nIpiVal,
   nPisVal, nCofVal, nValOut, nImpVal, nValNot, nDifValf, nDifVali, nComplementar;

SET cXml := CONCAT( cXml,
   '<total>',
   '<ICMSTot>',
   ze_XmlTag( 'vBC',          nIcmBas ),
   ze_XmlTag( 'vICMS',        nIcmVal ),
   ze_XmlTag( 'vICMSDeson',   '0.00' ),
   ze_XmlTag( 'vFCPUFDest',   nDifValf ),
   ze_XmlTag( 'vICMSUFDest',  nDifVali ),
   ze_XmlTag( 'vICMSUFRemet', '0.00' ),
   ze_XmlTag( 'vFCP', '0.00' ),
   ze_XmlTag( 'vBCST',        nSubBas ),
   ze_XmlTag( 'vST',          nSubVal ),
   ze_XmlTag( 'vFCPST', '0.00' ),
   ze_XmlTag( 'vFCPSTRet', '0.00' ),
   ze_XmlTag( 'vProd',        IF( nComplementar = 1, '0.00', nValPro ) ),
   ze_XmlTag( 'vFrete',       nValFre ),
   ze_XmlTag( 'vSeg',         nValSeg ),
   ze_XmlTag( 'vDesc',        nValDes ),
   ze_XmlTag( 'vII',          nIIVal ),
   ze_XmlTag( 'vIPI',         nIpiVal ),
   ze_XmlTag( 'vIPIDevol', '0.00' ),
   ze_XmlTag( 'vPIS',         nPisVal ),
   ze_XmlTag( 'vCOFINS',      nCofVal ),
   ze_XmlTag( 'vOutro',       nValOut ),
   ze_XmlTag( 'vNF',          IF( nComplementar = 1, '0.00', nValNot ) ),
   IF( nImpVal = 0, '', ze_XmlTag( 'vTotTrib',  nImpVal ) ),
   '</ICMSTot>',
   '</total>' );

RETURN cXml;

END
e a XmlTag() convertida pra MySQL:

Código: Selecionar todos

CREATE FUNCTION ze_XmlTag( cTag TEXT, cValue TEXT )
RETURNS TEXT CHARSET latin1

BEGIN

DECLARE cXml TEXT;

SET cXml := '';

IF LENGTH( TRIM( cValue ) ) = 0 THEN
   SET cXml := CONCAT( '<', cTag, '/>' );
ELSE
   SET cXml := CONCAT( '<', cTag, '>', cValue, '</', cTag, '>' );
END IF;

RETURN cXml;

END
uso o prefixo ze_, não apenas pra saber que são funções próprias, mas pra não ter conflito com funções do MySQL/MariaDB atuais e futuras.