Imprimir Cupom Fiscal

Delphi

14/02/2006

Salve galera ...

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

Armando.boza

Curtidas 0

Respostas

Dopi

Dopi

14/02/2006

Ola,

Permita-me indicar esse forum específico sobre [url=http://www.forumweb.com.br/foruns/index.php?showforum=416]Automação Comercial[/url]

No forum acima posso recomendar os seguinte tópicos:
http://www.forumweb.com.br/foruns/index.php?showtopic=38345
http://www.forumweb.com.br/foruns/index.php?showtopic=38700


GOSTEI 0
Marcosrodias

Marcosrodias

14/02/2006

Ola

Eu tenho uma aplicacao em dephi 7 e firebird. E roda tudo bem.

Vc deve estar atento ao seguinte.

1) A sequencia de venda que vc colocou esta correta. Só lembre que pode dar desconto ou acrescimo e pode ter mais de uma forma de pagamentol Por exemplo voce pode pagar o cupom com dinheiro e cheque por exemplo.

2) Leitura x geralmente é usado para tirar relatorios voce tem até 10 minutos para a impressao. Caso passe deste tempo a impressora fecha o relatorio automaticamente.

3) A reduzao é obrigatario. No caso da bematech se voce nao tirar a reducao no dia quando voce ligar a ecf no proximo dia ele vair tirar a reducao sozinha.

4) Leve em conta os status da impressora. Se esta ligada se tem papel, se tem erro na memoria fiscal. Voce tem que monitorar essas informações.

5) Se quiser colocar tef tem os comando espcificos para isso mas voce vai ter que homologar junto a adminitradores de cartao de credito e ai vc vai ter que ter ter uma impressora e ir para sao paulo, caso voce seja de outra localidade e ainda vai pagar pela homologacao. Entçao pense nisso

6) Por causa do sintegra voce tem que gerar as vendas corretamente. Aqui em salvador/ba o fisco exigiu que todos os softwares fossem certificados por ela. Se voce quiser vender seu software aquie me salvaodr por exemplo vai ter que viar aqui para certificar. Mais uma vez voce paga para isso.

7) Geralmente as empressas fabricantes da ecf tem um driver para comunicação com a ecf e um exemplo em varias linguagems que vai lhe auxilir. Só é baixar e ver.


Qualquer coisa estout a disposicao.

Marcos Roberto / SSA BA


GOSTEI 0
Marcosrodias

Marcosrodias

14/02/2006

Mas uma coisa. Use as dlls de cada fabricante. Eu usei um dias desses uma dll da afreac e nao tive suporte.

Agora só uso das proprias ecfs;


GOSTEI 0
Dopi

Dopi

14/02/2006

Marcos,

Se vc quer uma opção que seja Multi-ECF experimente conhecer o componente ACBrECF do [URL=http://acbr.sf.net]Projeto ACBr[/url]... Veja [url=http://acbr.sourceforge.net/wiki/index.php/ECF]aqui os modelos suportados[/url] (mais de 10)

- Não usa nenhuma DLL, apenas a comunicação direta com o ECF via Serial
- É multi-plataforma (Delphi / Kylix)
- É OpenSource
- Suporte á vários outros equipamentos, como Impressoras de Cheques, Balanças, Display de Msgs, Gavetas, Micro-Terminais, etc...
- Componente para válidar CPF, CNPJ, I.E. (todos Estados do Brasil), Cheque, Cartao, PIS, CEP


GOSTEI 0
Armando.boza

Armando.boza

14/02/2006

Ola Eu tenho uma aplicacao em dephi 7 e firebird. E roda tudo bem. Vc deve estar atento ao seguinte. 1) A sequencia de venda que vc colocou esta correta. Só lembre que pode dar desconto ou acrescimo e pode ter mais de uma forma de pagamentol Por exemplo voce pode pagar o cupom com dinheiro e cheque por exemplo. 2) Leitura x geralmente é usado para tirar relatorios voce tem até 10 minutos para a impressao. Caso passe deste tempo a impressora fecha o relatorio automaticamente. 3) A reduzao é obrigatario. No caso da bematech se voce nao tirar a reducao no dia quando voce ligar a ecf no proximo dia ele vair tirar a reducao sozinha. 4) Leve em conta os status da impressora. Se esta ligada se tem papel, se tem erro na memoria fiscal. Voce tem que monitorar essas informações. 5) Se quiser colocar tef tem os comando espcificos para isso mas voce vai ter que homologar junto a adminitradores de cartao de credito e ai vc vai ter que ter ter uma impressora e ir para sao paulo, caso voce seja de outra localidade e ainda vai pagar pela homologacao. Entçao pense nisso 6) Por causa do sintegra voce tem que gerar as vendas corretamente. Aqui em salvador/ba o fisco exigiu que todos os softwares fossem certificados por ela. Se voce quiser vender seu software aquie me salvaodr por exemplo vai ter que viar aqui para certificar. Mais uma vez voce paga para isso. 7) Geralmente as empressas fabricantes da ecf tem um driver para comunicação com a ecf e um exemplo em varias linguagems que vai lhe auxilir. Só é baixar e ver. Qualquer coisa estout a disposicao. Marcos Roberto / SSA BA


Valew .. ja me clareou bastante ...

O que seria esse SINTEGRA ???


GOSTEI 0
Dberlese

Dberlese

14/02/2006

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 Agradeço antecipadamente


Estou tentando utilizar os componentes da ACBr, assim como disse nosso amigo acima tem uma ´regra´ a ser seguida, no meu caso tenho uma impressora mecaf IM113I, é uma impressora não fiscal, gostaria apenas de imprimir um cupom com os itens da venda, nome do cliente e nada mais, porem nao estou conseguindo fazer isso, pois é registrado itens vendidos, tem q abir cupom, leiturax, reducao Z... fazer uma serie de coisas q sera desnecesario no meu caso.
Alguem sugere uma ideia?

Obrigado


GOSTEI 0
Edilcimar

Edilcimar

14/02/2006

para impressora não fiscal vc não pode usar os comandos de uma impressora fiscal, use o writeln()


GOSTEI 0
Andremuller

Andremuller

14/02/2006

estava tentando utilizar os componentes da ACBr e eles se mostraram bem complicados no controle de excessão e com execussão muito lenta se comparado a utilização das interfaces disponibilizadas pelos fabricantes.
Voltei atrás e estou utilizando as interfaces dos fabricantes, onde algumas vem com exemplos e até aplicações que captam as saídas enviadas pelo teu programa e simulam a existência de um impressora, o que facilita pra quem não tem a impressora no local.

Basta organização, eu criei um pattern factory que instancia a classe da impressora a partir do modelo utilizado. Então numa Custom criei os métodos abstratos necessários para manipulação da impressora. Aí é só especializar a Custom de acordo com os modelos que vou disponibilizando de acordo com a necessidade dos clientes.

Essa é uma idéia de diversas possíveis


GOSTEI 0
Edilcimar

Edilcimar

14/02/2006

eu não tenho nada contra a afrac ou a acbr, mas também prefiro usar as dll do próprio fabricante, faço uma configuração sobre qual a máquina que está instalada e depois faço a chamada da dll desejada


GOSTEI 0
Kitsystem

Kitsystem

14/02/2006

Se o software for apenas para Bematech como são a grande maioria pode embarcar na Dll do Fabricante, mas se for para outros voos nada de DLL amarrada a um fabricante e um monte de Case no software

ACbr faz isto para vc


GOSTEI 0
Andremuller

Andremuller

14/02/2006

não precisa de um monte de cases.
É só criar uma Abstact Factory. Media dúzia de linhas e foi.


GOSTEI 0
Zumbi

Zumbi

14/02/2006

teria como postar ou me enviar um exemplo dessa classe eu gostaria de tentar implementa-la tb..


vlw..


GOSTEI 0
Dopi

Dopi

14/02/2006

não precisa de um monte de cases. É só criar uma Abstact Factory. Media dúzia de linhas e foi.

Acredito que o amigo não tenha conhecimento da diversidade de ´linguagens´ e maneiras de funcionamento entre os diversos ECFs utilizados no Brasil... Suportar 2 ou 3 ECFs até é possível com um monte de IFs e ELSEs, mas para suportar vários fabricantes e modelos acredito que o mais indicado seja usar os recursos da O.O. (herança e polimorfismo)


GOSTEI 0
Dopi

Dopi

14/02/2006

estava tentando utilizar os componentes da ACBr e eles se mostraram bem complicados no controle de excessão e com execussão muito lenta se comparado a utilização das interfaces disponibilizadas pelos fabricantes.

Estranho, pois tenho e-mails de usuários que tiveram um ganho real de performance usando o ACBr... Mas é claro que tudo depende da Marca, Modelo de ECF e do teste que vc fez... Gostaria de mais informações se possível.. No projeto: [i:472778e008]\ACBr\Source\Pascal\Demo\VCL\[b:472778e008]ECFTeste.dpr[/b:472778e008][/i:472778e008], existe a opção CupomFiscal, Teste de Velocidade, que cronometra a impressão de um cupom completo de 1 a n itens

No Inicio do tópico vc citou que está usando uma Mecaf [b:472778e008]NAO FISCAL[/b:472778e008], ou seja, uma impressora comum, e não um ECF... O ACBr possui um [b:472778e008]Emulador de ECF[/b:472778e008] interno, que é o modelo [b:472778e008]ecfNaoFiscal[/b:472778e008]... Ele é um programa em Delphi que imita um ECF em todas as operações, até mesmo com necessidade de Redu.Z e Leit.X... é muito útil para escrever um programa com suporte a ECFs para quem não tem um ECF para testes... se vc reparar no código fonte, verá que ele usa [b:472778e008]writeln[/b:472778e008] para imprimir...

Voltei atrás e estou utilizando as interfaces dos fabricantes, onde algumas vem com exemplos e até aplicações que captam as saídas enviadas pelo teu programa e simulam a existência de um impressora, o que facilita pra quem não tem a impressora no local.

O ACBr apenas cresce graças a coperação de usuários que estão dispostos a ajudar... ainda não temos manual dos componentes... Mas se vc procurasse um pouco mais, veria que todos os componentes possuem excelentes Demos na pasta
[i:472778e008]\ACBr\Source\Pascal\Demo\VCL\[/i:472778e008]


GOSTEI 0
Andremuller

Andremuller

14/02/2006

Suportar 2 ou 3 ECFs até é possível com um monte de IFs e ELSEs, mas para suportar vários fabricantes e modelos acredito que o mais indicado seja usar os recursos da O.O. (herança e polimorfismo)


Trabalhar com design patterns é a coisa mais OO que existe. E Abstract Factory é implementação pura de herança e polimorfismo.

Então o que você faz. Cria uma classe abstrata com os principais métodos de uma ECF. Depois cria uma classe concreta para cada ECF. Então cria uma ClassControl que instancie a classe concreta dentro de um objeto declarado como com o tipo da classe abstrata, pronto, esta aí a interface com a ECF.

Tipo assim:

TCustomECF = class(TObject)
public
  AvancarLinha; abstract virtual;
end;


TECFShalter = class(TCustomECF)
public
  AvancarLinha; override; //aqui você coloca a Dll do fabricante
end;


TControlECF = class(TObject)
public
  property ECF: TCustomECF read FECF write FECF; 
  constructor Create; reintroduce;
end;

TControlECF.Create;
begin
  //aqui vai o único case de todo código, nada de monte de ifs e elses
  case GetModeloECF do
    ECF := TECFShalter.Create;
  end;
end;


o que acontece então, em toda tua aplicação tu acessa o oControl.ECF.AvancarLinha que ele vai executar o método na classe concreta onde consta o real comando com a DLL.
Tá aí, esse é um pattern, porém existem diversos patterns que deixam o código mais limpo, organizado e OO. Pra quem tem interece procurar sobre o assunto, os principais autores são GOMS (The Gang of Four)


GOSTEI 0
Andremuller

Andremuller

14/02/2006

só mais uma coisa, então tu cria uma classe concreta pra cada tipo de ECF que tu vai dando suporte aos poucos. Também o código que postei escrevi direto aqui na mensagem, então desculpem-me erros de sintaxe.


GOSTEI 0
Dopi

Dopi

14/02/2006

É exatamente assim que o ACBrECF trabalha...

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


GOSTEI 0
Andremuller

Andremuller

14/02/2006

Daniel obrigado pela informação. Concordo com boa parte do que foi por ti dito. Porém:
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.


GOSTEI 0
Andremuller

Andremuller

14/02/2006

complementando:
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.


GOSTEI 0
Dopi

Dopi

14/02/2006

No ACBr prefiri usar o mecanismo de exceções do Delphi ao invez de retornar True / False como nas DLLs... Optei dessa maneira pois, é o ´jeitão´ do Delphi tratar erros... mas concordo que esse ponto é um dos que mais causa ´estranheza´ para quem está migrando das DLLs para o ACBrECF...

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 ?


GOSTEI 0
Andremuller

Andremuller

14/02/2006

Não tenho um tempo específico para a impressão do cupom. Tenho o mínimo tempo possível porque o cliente estará esperando o cupom e o terminal estará ´bloqueado´ enquanto a impressão não termina, e outro cliente estará esperando para passar os ítens nesse terminal momentaneamente bloqueado.
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


GOSTEI 0
Dopi

Dopi

14/02/2006

Ok Andre, entendo... em alguns tipos de comercio a impressão concomitânte (imprimir item a item durante a venda) realmente não é possível... Como por exemplo em materiais de construção... não dá pra passar sacos de cimento pelo CAIXA... :)

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(´---------------------------------´);



GOSTEI 0
Dopi

Dopi

14/02/2006

Ola Andre

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
---------------------------------



GOSTEI 0
Andremuller

Andremuller

14/02/2006

Ok Daniel, obrigado pelo retorno.
O modelo de impressora que um cliente meu tem é esse mesmo. Vou fazer um teste e retorno assim que possível.


GOSTEI 0
M@gnun

M@gnun

14/02/2006

Fiz alguns sistemas com a seguinte estrutura: (nada fiscal)

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.


GOSTEI 0
M@gnun

M@gnun

14/02/2006

ops, desculpa ae, cliquei no botao responder ao inves de novo tópico.
algum admim, por favor apague este post.

Desculpa.


GOSTEI 0
Alexandre

Alexandre

14/02/2006

Por que consigo emitir a redução z, a leitura x e até ler dados do Sintegra na impressora mas o cupom fiscal não abre e não dá erro algum? Alguém sabe? Talvez seja algo simples.Com o emulador tudo funciona.
Bematech MP-4000 TH FI.
Obrigado.
GOSTEI 0
José Curdo

José Curdo

14/02/2006

Uma boa dica, entre tantas apresentadas aqui, é ver os artigos do Wuillian Duarte no site www.activedelphi.com.br.
sds.
GOSTEI 0
Francisco Aurino

Francisco Aurino

14/02/2006

Bom Dia Pessoal

Alguém sabe dizer se existe um simulador de impressora fiscal que imprime os comprovantes direto em uma impressora não fiscal!?
GOSTEI 0
POSTAR