Imprimir Cupom Fiscal
14/02/2006
0
Um de meus clientes disse que daqui um tempo ele vai querer emitir cupom fiscal na empresa dele e me perguntou se tinha como meu sistema fazer isso. (delphi + firebird)
Bom, dando uma garimpada no forum achei varios topicos relacionados e aproveitei muita coisa deles, a primeira coisa que fiz foi entrar no site da bematech e baixar o exemplo, a DLL e o emulador da impressora (pra não gastar dinheiro comprando uma :lol: ).
Do exemplo tirei algumas conclusões e aqui está o ponto G ... hehehe ... me corrijam se eu estiver errado por favor.
Para impressão de um cupom fiscal percebi os seguintes passos:
1º - Abre o cupom fiscal
2º - Vende Itens
3º - Inicia fechamento do cupom
4º - Efetua forma de pagamento do cupom
5º - Finaliza o cupom
Notei tb que existem alguns relatórios como:
Leitura X
Redução Z
Queria saber de vcs que tem experiência na área quais os processos que uma empresa que emite cupom fiscal deve seguir, por ex:
A impressão do cupom é naquela ordem mesmo ou tem mais algum passo?
No final do dia é necessário tirar a Redução Z?
Quando se emite a Leitura X?
Vi tb que o sistema deve ser homologado pela receita estadual, como é feita essa homologação? Eles verificam o sistema pra ver se tudo está correto?
Agradeço antecipadamente
Armando.boza
Posts
01/03/2006
Andremuller
01/03/2006
Dopi
A unit ACBrECFClass é praticamente toda abstrata, cada classe especifica para modelo/marca de um ECF é filha de ACBrECFClass, e implementa os métodos abstratos da classe mãe, que sejam compatíveis com a marca/modelo do ECF em questão... O componente ACBrECF possui uma proriedade que é do tipo ACBrECFClass... Essa propriedade é destruida/criada a cada mudança de modelo de ECF com o mesmo case que vc citou.
Portanto ACBrECF.LeituraX irá emitir uma Leitura X em qualquer modelo de ECF suportado pelo ACBr, basta apenas especificar o modelo no componente...
O problema de fazer uma interface generica baseada em DLLs para mais de 10 ECFs pode ser justamente as DLLs... pois:
- DLLs apenas rodam no Windows e nem todos fabricantes possuem DLLs para Linux (.SO) ( O ACBr é multiplataforma, rodando no Delphi, Kylix e Lazarus)
- O Inferno das DLLs... Se o usuário instalar outro programa que sobreponha a sua DLL no SYSTEM32 vc poderá ter problemas de dificil diagnóstico
- Numero extenso de DLLs... Acredito que atualmente, para suportar todos os equipamentos que o ACBr suporta (entre ECFs, Balanças, Impres.Cheques, Leitores, etc) seriam necessárias mais 30 DLLs diferentes !!!
- Falta de controle da aplicação. Sempre que vc chama a DLL não é o seu programa que está no comando... E nem todas as DLLs são bem escritas... Já vi empresas terem problemas na homologação TEF por causa de DLLs que não detectavam que o ECF foi desligado no meio da operação
Por fim, assim que vc estudar um pouco mais outros modelos de ECFs vc notará que existem diferenças enormes para executar a mesma tarefa...
Exemplo: O ECF DataRegis não possui uma função para abrir o cupom, ele é aberto automaticamente assim que a Venda de Item é comandada.. Ele tb não tem comando para Fechar o cupom, ele é fechado assim que o Pagamento atingiu o Total a pagar
01/03/2006
Andremuller
1. Uma coisa não é empecilho: a diferença para executar uma tarefa. Nas minhas classes me confrontei com isso. O que acontece se ele não abre cupom? Na classe concreta a função devolve result True, sem fazer mais nada. Tem mais, se isso for empecilho pra mim vai ser pra ACBr também, pois no caso do componente eu também vou executar um AbrirCupom indiferente de saber ou não se o modelo suporta. Dessa forma é só tratar, da mesma forma como a ACBr fez.
2. Utilizando as DLLs do fabricante (minha aplicação só roda em windows, isso é uma restrição e um pré-requisito) a impressão é mais rápida, isso é fato, testei no mesmo equipamento das duas formas. Ocorre que meus clientes não emitem ítem a ítem no cupom conforme vão passando, eles querem emitir todo cupom ao final da compra, dessa forma pra mim é muito mais requisito a impressão ser rápida do que ser multi plataforma.
3. As DLLs não ficam no System32 e sim na pasta da minha aplicação.
01/03/2006
Andremuller
Achei a iniciativa da ACBr louvável. Também achei os componentes muito simples de serem utilizados e bons. Para as pessoas que não possuem como uns dos principais requisitos imprimir cupons com 200 ítens com vários terminais enviando solicitações, quer dizer, o mais rápido possível, não desaconselho a utilização dos componentes.
01/03/2006
Dopi
Também temos preocupação quanto a performance no ACBr... e procuramos otimiza-lo ao máximo, sempre que possível... Como disse antes, gostaria de fazer um comparativo...
Se não for muito trabalhoso, gostaria de saber o tempo que vc tem para a execução de um cupom completo com 50 itens e apenas 1 pagamento... Qual a Marca, Modelo e versão do ECF ?
01/03/2006
Andremuller
Então porque não imprimir os ítens enquanto vão passando? Para o empresário poder cancelar tudo e dar baixa no estoque sem pagar imposto.
O modelo que usei para o teste de rapidez foi uma Shalter SPrint 3.01
01/03/2006
Dopi
Mas a lei que normatiza o ECF e o seu uso é clara em exigir a concomitância. Para imprimir sem concomitância é necessária uma autorização do posto fiscal...
Mas quanto ao tempo eu realmene me referia a impressão sem concomitância... No [b:e36d608f8f]ECFTeste.exe[/b:e36d608f8f] temos uma rotina que imprime um cupom completo, e cronometra... Veja o código dela:
procedure TForm1.TestedeVelocidade1Click(Sender: TObject); Var cItens : String ; nItens, I : Integer ; tIni,tFim : TDateTime ; Parcela : Double ; begin ACBrECF1.CarregaFormasPagamento ; if ACBrECF1.FormasPagamento.Count < 1 then raise Exception.Create(´Nenhuma Forma de Pagamento programada no ECF´); cItens := ´10´ ; if not InputQuery(´Teste de Velocidade´, ´Numero de Itens a imprimir:´, cItens ) then exit ; nItens := StrToIntDef(cItens,0) ; if nItens < 1 then exit ; tIni := Now ; mResp.Lines.Add(´Iniciando Cupom: ´+DateTimeToStr(tIni)) ; ACBrECF1.AbreCupom(); For i := 1 to nItens do ACBrECF1.VendeItem( IntToStrZero(i,6), ´DESCRICAO NUM.: ´+IntToStrZero(i,6), ´NN´,i,i/100,0,´UN´) ; ACBrECF1.SubtotalizaCupom(); ACBrECF1.EfetuaPagamento(ACBrECF1.FormasPagamento[0].Indice, (ACBrECF1.Subtotal - ACBrECF1.TotalPago), ´ZERANDO SALDO A PAGAR RESTANTE´); ACBrECF1.FechaCupom(´TESTE DE CUPOM´); tFim := Now ; mResp.Lines.Add(´Finalizado em: ´+DateTimeToStr(tFim)) ; mResp.Lines.Add(´Diferença: ´+ FloatToStr(SecondSpan(tIni,tFim))+´ segundos´ ) ; mResp.Lines.Add(´---------------------------------´);
07/03/2006
Dopi
aproveitei que apareceu uma Schalter por aqui e rodei o teste de velocidade nela... O desempenho foi muito bom para um ECF tão antigo...
Modelo: S Print ECF Ver. 3.01 (antiga)
Imprimindo 10 items
+ - + - + - + - + - + - + - + - + - + - + - Iniciando Cupom: 7/3/2006 11:08:11 Finalizado em: 7/3/2006 11:08:24 Diferença: 13,3279999019578 segundos ---------------------------------
13/03/2006
Andremuller
O modelo de impressora que um cliente meu tem é esse mesmo. Vou fazer um teste e retorno assim que possível.
29/05/2006
M@gnun
Tab Vendas
Cod_Venda, Cod_Item, Valor, Dt_Pag, Forma_Pag, etc ...
Tabela Intens
Cod_Iten, Cod_Produto, Qtde, Valor_Unit, Valor, Total, etc ...
Não uso uma tabela para caixa. Apenas faço uma pesquisa nessas tabelas, (e em algumas outras como poe ex: Contas a pagar, Receber, Manutenções, etc ...)com o usuario digitando algum periodo.
Aí monto um layout com Credito, Debito, etc ... com opções para ver os detalhes, vendas, despesas escritório, manutenções em equipamentos, etc ..
Gostaria de saber se esta forma é correta, e caso não for, gostaria de saber +- a estrutura de um caixa.
Obrigado.
29/05/2006
M@gnun
algum admim, por favor apague este post.
Desculpa.
09/07/2011
Alexandre
Bematech MP-4000 TH FI.
Obrigado.
12/07/2011
José Curdo
sds.
23/02/2015
Francisco Aurino
Alguém sabe dizer se existe um simulador de impressora fiscal que imprime os comprovantes direto em uma impressora não fiscal!?
Clique aqui para fazer login e interagir na Comunidade :)