SAT-Fiscal a mistica está desvendada.
Enviado: 26 Nov 2012 12:18
Amiguinhos,
É com satisfação que posso dizer que meu sistema já está 99% SAT-CFe Ready.
O resultado foi obtido depois de noites sem sono e desvendamento de um mundo praticamente novo, ou seja, versão 2.0.
Baseado nos aplicativos do conjunto SAT-CFe para desenvolvedores, como o AC, Ativador e Emulador SAT comecei a planejar os meios de obter exito com o uso destas ferramentas e desenhar rapidamente meu módulo de interface.
Totalmente baseado em Harbour tradicional e automação OLE consegui algo que não havia planejado e nenhum dos colegas havia esclarecido.
Como o que vemos ai por volta das interfaces de acesso ao SEFAZ geralmente encontramos código fonte em Visual Basic, Delphi, Sharp, etc.
Como sou chato e persistente quando ao que desejo consegui obter acesso direto ao Emulador SAT e envio de comandos com um aplicativozinho básico.
E para minha surpresa os procedimentos são muitissimo simples.
As funçoes ConsultarSAT(), AtivarSAT() e EnviarDadosVenda() são importantes neste primeiro momento e foram baseadas no uso delas que implementei em meu sistema o uso para teste e homologação.
Para o uso de EnviarDadosVenda() foi necessário ainda confeccionar o XML no layout para CF-e, o que foi fácil pois o mesmo pode ser baseado no layout da NF-e.
Após consultar o status do SAT, passamos a Ativá-lo e conforme o retorno obtido fazer o envio dos dados do cupom e se tudo correr bem obter, validação, assinatura e envio.
Então temos:
- Primeira etapa - geração do XML contendo os dados do cupom baseado no layout CF-e.
- Segunda etapa - uso dos comandos do driver SAT para perfazer o processo fiscal.
- Terceira etapa - imprimir o cupom com layout definido nos manuais de requisição do SAT-CFe.
PRIMEIRA ETAPA
Abaixo esta o conteúdo do XML de testes no layout do CF-e:
SEGUNDA ETAPA
Apesar de usar Harbour, a interface uso o Fivewin para efeito de mensagens e etc.
A senha "123456" foi usada no momento da Ativação do SAT e portanto pode ser trocada.
Eu criei um set de funções que pudesse fazer a ponte com o driver e tratar o retorno de forma simples. todas as funções recebem a string do driver e transformam em um vetor.
O conjunto de funções que acessar diretament o driver estão descritas abaixo:
Uso algumas funções extras exigidas durante os testes:
Junte tudo em um unico .PRG e compile para obter o executável de testes.
TERCEIRA ETAPA
Consite na geração do HTML que irá compor o impresso padrão do cupom:
Cabecalho:
Corpo dos itens:
Rodapé:
Para uma melhor formatação do cupom podese usar tabelas e acrescentar um javascript que envie o comando de impressão assim que o browser apresentar o conteúdo.
Portanto vencidas as etapas iniciais de testes todas estarão aptos em pouco tempo a integrarem em seus sistemas tais caracteristicas.
Para os amigos que juntamente comigo vierem a desvendar este driver, sugiro compartilhar ao máximo a fim de obtermos com tempo recorde a finalização e implantação em nossos sistemas dos recursos desta parafernália que já nos ronda a pelo menos 5 anos.
É com satisfação que posso dizer que meu sistema já está 99% SAT-CFe Ready.
O resultado foi obtido depois de noites sem sono e desvendamento de um mundo praticamente novo, ou seja, versão 2.0.
Baseado nos aplicativos do conjunto SAT-CFe para desenvolvedores, como o AC, Ativador e Emulador SAT comecei a planejar os meios de obter exito com o uso destas ferramentas e desenhar rapidamente meu módulo de interface.
Totalmente baseado em Harbour tradicional e automação OLE consegui algo que não havia planejado e nenhum dos colegas havia esclarecido.
Como o que vemos ai por volta das interfaces de acesso ao SEFAZ geralmente encontramos código fonte em Visual Basic, Delphi, Sharp, etc.
Como sou chato e persistente quando ao que desejo consegui obter acesso direto ao Emulador SAT e envio de comandos com um aplicativozinho básico.
E para minha surpresa os procedimentos são muitissimo simples.
As funçoes ConsultarSAT(), AtivarSAT() e EnviarDadosVenda() são importantes neste primeiro momento e foram baseadas no uso delas que implementei em meu sistema o uso para teste e homologação.
Para o uso de EnviarDadosVenda() foi necessário ainda confeccionar o XML no layout para CF-e, o que foi fácil pois o mesmo pode ser baseado no layout da NF-e.
Após consultar o status do SAT, passamos a Ativá-lo e conforme o retorno obtido fazer o envio dos dados do cupom e se tudo correr bem obter, validação, assinatura e envio.
Então temos:
- Primeira etapa - geração do XML contendo os dados do cupom baseado no layout CF-e.
- Segunda etapa - uso dos comandos do driver SAT para perfazer o processo fiscal.
- Terceira etapa - imprimir o cupom com layout definido nos manuais de requisição do SAT-CFe.
PRIMEIRA ETAPA
Abaixo esta o conteúdo do XML de testes no layout do CF-e:
Código: Selecionar todos
<?xml version="1.0" encoding="UTF-8"?>
<CFe xmlns="http://www.fazenda.sp.gov.br/sat">
<infCFe Id="CFe35121103449994000116590000000070000056166000" versao="0.02" versaoDadosEnt="1.00" versaoSB="000003">
<ide>
<cUF>35</cUF>
<cNF>616600</cNF>
<mod>59</mod>
<nserieSAT>000000007</nserieSAT>
<nCFe>000005</nCFe>
<dEmi>20121124</dEmi>
<hEmi>235018</hEmi>
<cDV>0</cDV>
<tpAmb>1</tpAmb>
<CNPJ>64185629000136</CNPJ>
<signAC>123123</signAC>
<assinaturaQRCODE>CFe351211034499940001165900000000700000561660002012112423501821011898853878</assinaturaQRCODE>
</ide>
<emit>
<CNPJ>111111111111</CNPJ>
<xNome>Estabelecimento de Teste 2</xNome>
<xFant>Estabelecimento Fantasia 2</xFant>
<enderEmit>
<xLgr>rua das flores</xLgr>
<nro>1005</nro>
<xCpl>-</xCpl>
<xBairro>centro</xBairro>
<xMun>Sao Paulo</xMun>
<CEP>00000000</CEP>
</enderEmit>
<IE>111111111111</IE>
<IM>123123</IM>
<cRegTribISSQN>1</cRegTribISSQN>
<indRatISSQN>N</indRatISSQN>
</emit>
<dest>
<CPF>11808853070</CPF>
<xNome>JCR</xNome>
</dest>
<det nItem="1">
<prod>
<cProd>01</cProd>
<xProd>Mega Alcool 92,8A</xProd>
<CFOP>0001</CFOP>
<uCom>un</uCom>
<qCom>1.0000</qCom>
<vUnCom>2.100</vUnCom>
<vProd>2.10</vProd>
<indRegra>A</indRegra>
<vItem>2.10</vItem>
</prod>
<imposto>
<ICMS>
<ICMS40>
<Orig>1</Orig>
<CST>41</CST>
</ICMS40>
</ICMS>
<PIS>
<PISAliq>
<CST>01</CST>
<vBC>1.00</vBC>
<pPIS>1.0000</pPIS>
<vPIS>1.00</vPIS>
</PISAliq>
</PIS>
<PISST>
<vBC>1.00</vBC>
<pPIS>1.0000</pPIS>
<qBCProd>1.0000</qBCProd>
<vAliqProd>1.0000</vAliqProd>
<vPIS>1.00</vPIS>
</PISST>
<COFINS>
<COFINSAliq/>
</COFINS>
<COFINSST>
<vBC>1.00</vBC>
<pCOFINS>1.0000</pCOFINS>
<qBCProd>1.0000</qBCProd>
<vAliqProd>1.0000</vAliqProd>
<vCOFINS>1.00</vCOFINS>
</COFINSST>
</imposto>
</det>
<total>
<ICMSTot>
<vICMS>0.00</vICMS>
<vProd>2.10</vProd>
<vDesc>0.00</vDesc>
<vPIS>1.00</vPIS>
<vCOFINS>1.00</vCOFINS>
<vPISST>1.00</vPISST>
<vCOFINSST>1.00</vCOFINSST>
<vOutro>0.00</vOutro>
<vCFe>2.10</vCFe>
</ICMSTot>
</total>
<MP>
<cMP>1</cMP>
<vMP>2.10</vMP>
</MP>
</infCFe>
</CFe>
Apesar de usar Harbour, a interface uso o Fivewin para efeito de mensagens e etc.
A senha "123456" foi usada no momento da Ativação do SAT e portanto pode ser trocada.
Código: Selecionar todos
/////////////////////////////////////////////////////////////////////////////
//
// PDVSAT - Compativeis com SAT 4.00
//
// Autor: Jose Carlos da Rocha
// Data: 26/11/2012
// Email: contato@5volution.com.br
// MSN: fivolution@hotmail.com
// Linguagem: xBase
// Prefixo: SAT
// Plataformas: DOS, Windows
// Requerimentos: Harbour/xHarbour( Para uso com Clipper eliminar Prefixo )
// Versao SAT: 4.00
//
/////////////////////////////////////////////////////////////////////////////
#include "FiveWin.ch"
#include "dll.ch"
function Main()
PUBLIC hACBrDLL
cPath := cFilePath( GetModuleFileName( GetInstance() ) ) // Pega o caminho exato onde se encontra o sistema.
// A SAT.dll pode estar na pasta do seu sistema
? "SAT.dll carregada",;
hACBrDLL := LoadLibrary( cPath+"SAT.DLL" )
? "ConsultarSAT",;
ConsultarSAT( Random( 999999 ) ) //[3]
? "AtivarSAT",;
AtivarSAT( Random( 999999 ), 1, "123456", "11111111111111", 35 ) //[3]
cCFeTeste := MemoRead( cPath+"CFeTeste.xml" )
aRetorno := EnviarDadosVenda( Random( 999999 ), "123456", cCFeTeste )
? "EnviarDadosVenda",aRetorno[1],aRetorno[2],aRetorno[3],aRetorno[4]
return nil
Código: Selecionar todos
Function ConsultarSAT( nSessionRandom )
cString := SATConsultar( nSessionRandom )
return StringToArray( cString, "|" )
Function AtivarSAT( numeroSessao, subComando, codigoDeAtivacao, CNPJ, cUF )
cString := SATAtivar( numeroSessao, subComando, codigoDeAtivacao, CNPJ, cUF )
return StringToArray( cString, "|" )
Function DesligarSAT()
cString := SATDesligar()
return StringToArray( cString, "|" )
Function ConsultarNumeroSessao( nSessionRandom, codigoAtivacao, numeroSessao )
cString := SATConsultarNumeroSessao( nSessionRandom, codigoAtivacao, numeroSessao )
return StringToArray( cString, "|" )
Function TesteFimAFim()
cString := SATTesteFimAFim()
return StringToArray( cString, "|" )
Function EnviarDadosVenda( numeroSessao, codigoAtivacao, dados )
cString := SATEnviarDadosVenda( numeroSessao, codigoAtivacao, dados )
return StringToArray( cString, "|" )
Function CancelarUltimaVenda( numeroSessao, codigoAtivacao, chaveAcesso, dados )
cString := SATCancelarUltimaVenda( numeroSessao, codigoAtivacao, chaveAcesso, dados )
return StringToArray( cString, "|" )
Código: Selecionar todos
/* OK */ DLL32 FUNCTION SATConsultar( nSessionRandom AS _INT ) AS STRING PASCAL FROM "ConsultarSAT" LIB hACBrDLL
/* OK */ DLL32 FUNCTION SATAtivar( numeroSessao AS _INT, subComando AS _INT, codigoDeAtivacao AS STRING, CNPJ AS STRING, cUF AS _INT ) AS STRING PASCAL FROM "AtivarSAT" LIB hACBrDLL
/* OK */ DLL32 FUNCTION SATDesligar() AS STRING PASCAL FROM "DesligarSAT" LIB hACBrDLL
/* OK */ DLL32 FUNCTION SATConsultarNumeroSessao(getRandom AS _INT, codigoAtivacao AS STRING, numeroSessao AS STRING) AS STRING PASCAL FROM "ConsultarNumeroSessao" LIB hACBrDLL
DLL32 FUNCTION SATTesteFimAFim(numeroSessao AS _INT, codigoAtivacao AS STRING, dados AS STRING) AS STRING PASCAL FROM "TesteFimAFim" LIB hACBrDLL
/* OK */ DLL32 FUNCTION SATEnviarDadosVenda(numeroSessao AS _INT, codigoAtivacao AS STRING, dados AS STRING) AS STRING PASCAL FROM "EnviarDadosVenda" LIB hACBrDLL
/* OK */ DLL32 FUNCTION SATCancelarUltimaVenda(numeroSessao AS _INT, codigoAtivacao AS STRING, chaveAcesso AS STRING, dados AS STRING) AS STRING PASCAL FROM "CancelarUltimaVenda" LIB hACBrDLL
Código: Selecionar todos
Function Random( nMaximo )
static nRandom
local nTemporal
nMaximo = if( nMaximo == NIL, 65535, nMaximo )
if nRandom == NIL
nRandom = seconds()
endif
nTemporal = ( nRandom * seconds() ) % ( nMaximo + 1 )
nTemporal = if( nTemporal < 1, 1, nTemporal )
nRandom = nTemporal + seconds()
RETURN int( nTemporal )
function StringToArray( cString, cSeparator )
LOCAL nPos
LOCAL aString := {}
DEFAULT cSeparator := ";"
cString := ALLTRIM( cString ) + cSeparator
DO WHILE .T.
nPos := AT( cSeparator, cString )
IF nPos = 0
EXIT
ENDIF
AADD( aString, SUBSTR( cString, 1, nPos-1 ) )
cString := SUBSTR( cString, nPos+1 )
ENDDO
RETURN ( aString )
TERCEIRA ETAPA
Consite na geração do HTML que irá compor o impresso padrão do cupom:
Cabecalho:
Código: Selecionar todos
<html>
<font size="3" face="Fixed">
<center><b>#NomeFantasia#</b></center>
<center><b>#RazaoSocial#</b></center>
<center>#EnderecoCompleto#</center>
<center>CNPJ: #CNPJ# IE: #INSCR#</center>
<hr>
<center>Extrato N.o #EXTRATO#</center>
<center>CUPOM FISCAL ELETRONICO - SAT</center>
<hr>
<center>CPF/CNPJ #cpfConsumidor#</center>
<hr>
<b>#|COD|DESC|QTD|UN|VL UNIT R$|ST|ALIQ|VL ITEM R$</b>
<hr>
Código: Selecionar todos
#item# #cod# #desc# #qtd# #un# #valor3# #st# #aliq#% #valor4#
Código: Selecionar todos
<br>Subtotal #valor11#
<br>Descontos <-> #valor12#
<br>Acrescimos <+> #valor13#
<br><b>TOTAL R$ #valor14#</b>
<br><br>#meioDePagamento# #valor15#<br>
Troco R$ #valor16#
<br>
<br>ICMS a ser recolhido conforme LC-Simples Nacional
<br>
<hr>
DEST<br>#nomeDoAdquirente#
<br>#EnderecoDoDestinatario#<br>
<hr>
<center>
<b>SAT N.o #SATNum#</b></center>
<center><code>#Data#</code> <code>#Hora#</code></center>
<center><code>#ChaveDeConsulta#</center>
<center>#CodigoDeBarras#</center>
<center>#QRCode#</center>
</font>
</html>
Portanto vencidas as etapas iniciais de testes todas estarão aptos em pouco tempo a integrarem em seus sistemas tais caracteristicas.
Para os amigos que juntamente comigo vierem a desvendar este driver, sugiro compartilhar ao máximo a fim de obtermos com tempo recorde a finalização e implantação em nossos sistemas dos recursos desta parafernália que já nos ronda a pelo menos 5 anos.