PHP e Impressoras Fiscais Daruma – uso local

Pessoal,
Bom dia!
 
Vou começar este blog com uma dica para quem está iniciando a programação com impressoras ficais e deseja aprender como fazer em php.
 
O primeiro conceito que temos que ter bem definido, é o que, o php roda somente no servidor, ou seja, para fazermos uma aplicação php acessar uma porta serial, só conseguimos na própria porta onde se encontra o site, ou seja, no servidor. Mais para frente pretendo divulgar como usar uma OCX com php, e ahi sim a coisa vai ficar mais dinâmica, mas por hora vamos usar o php apenas na máquina local, e para você fazer um bom sistema, procure informações sobre como alimentar base de dados em rede, pois cada máquina sua terá que ser sua própria máquina servidor, com o php instalado.
 
Ok. Fato superado, agora vamos ao que interessa. O que você vai precisar?
– Servidor php instalado (Apache, Easyphp, ou o de sua preferência)
– Observer (Que é quem manda o arquivo criado para executar na porta com, e ainda nos possibilitar programar em alto nível, sem termos que usar comandos diretos, tipo os Chr() da vida…) Acesse:
http://www.desenvolvedoresdaruma.com.br/home/downloads/Site_2009/Impressora_Fiscal/Observer_Win.zip e baixe este programa!
– Impressora fiscal ou não fiscal instalada – Neste exemplo usamos uma impressora fiscal (FS600)
 
Ok. Agora vou mostrar um exemplo bem simples que fiz. Primeiro criei uma página com um frame para melhor organizar a estrutura, segue:
<–!index.htm–>
<html>
<head>
<title>Daruma Framework – Exemplo TEF em PHP</title>
<meta http-equiv=”Content-Type” content=”text/html; charset=iso-8859-1″>
</head>
<frameset rows=”*” cols=”350,*” framespacing=”0″ frameborder=”NO” border=”0″>
<frame src=”menu_esq.htm” name=”Menu” scrolling=”YES” noresize>
<frame src=”principal.htm” name=”Principal”>
</frameset>
</frameset>
<noframes><body>
</body></noframes>
</html>
 
Depois uma página com um menu à esquerda para executar uma Leitura X:

 

<–!menu_esq.htm–>
<html>
<head>
<title>Daruma Framework – Exemplo TEF em PHP</title>
<meta http-equiv=”Content-Type” content=”text/html; charset=iso-8859-1″>
</head>
<body bgcolor=lightgreen vlink=”#006400″ alink=”#2F4F4F” topmargin=”0″ marginheight=”0″>
<br>Exemplo de Comandos para TEF<br><br>
<a href=”daruma.php?metodo=leiturax” target=’Principal’>
Daruma_FI_LeituraX</a><br><br>
</body>
</html>

 

Agora veja que fantástico, eu criei uma página em php que chamei de daruma.php e nela nós temos a criação do arquivo que executará a Leitura X.
 
<–!daruma.php–>
<?php
//Recebo da página menu_esq.php o método selecionado,e  aqui indexo o comando:
$metodo = $_GET[‘metodo’];
if ($metodo == “leiturax”)
{
$comando = “1101;”;
}
//Criar Arquivo – Neste momento eu crio o arquivo que será impresso.
// a opção ‘w+’ significa que eu dou permissão total para gravação e escrita no arquivo.
//Se estiver no linux ou windows vista  preste atenção para a permissão do arquivo. No linux dê permissão 777.
$arquivo = ‘C:\Daruma.CMD’;
$arq = fopen($arquivo, ‘w+’);
//Abro o arquivo “$arq” e escrevo nele o valor que está na variável “$info”.
//O comando “%s” significa que o valor a ser iserido é do tipo String. para intenger use %i, para double %d, para float %f, e assim por diante.
fprintf($arq, ‘%s’, $comando);
//Fecho o arquivo “$arq”
fclose($arq);
//atualizo a página para mostrar o retorno da impressora!
echo “<meta http-equiv=Refresh content=6;URL=’retorno.php’>”;
echo “<br> Aguarde o Retorno da Impressora!”;
?>
 
Neste exemplo inicial faço apenas uma Leitura X. Mas seguindo esta lógica podemos escolher todos os métodos disponíveis na dll (Daruma32.dll).
 
Como você pode ver eu deixo um tempo para que a impressão seja concluída e ao final chamo uma outra página que lê o arquivo de retorno e assim consigo saber se de fato o comando foi executado ou não.
 
<–!retorno.php–>
<?php
//Indico o caminho onde estará o arquivo
$arquivo = ‘C:\Daruma.RET’;
//Mando abrir o arquivo e passo que esta abertura será somente para leitura com o ‘r’
$retorno = fopen($arquivo, ‘r’);
//Se não conseguir abrir o arquivo mostro mensagem de erro na abertura:
if (!$retorno)
{
echo ‘Erro ao abrir o arquivo de retorno.<br>’;
exit;
}
//inicio do tratamento de retorno
else
{
//quebro o arquivo em linhas e pego apenas a primeira linha
$linha = fgets($retorno,16);
echo “<p>” . $linha . “</p>”;
//quebro o conteúdo do arquivo (array) pelo caracter ; e armazeno dentro de um vetor
$matriz = explode(‘;’ , $linha);
//tratando o Status 1 (st1)

//Para Funcionar a chave StatusFuncao tem que estar igual a 1 no registro do windows ou no .conf no linux
if ($matriz[0] != 001)
{
$existe = false;

if ($matriz[2] != 000)
{
$st1 = $matriz[2];
if ($st1 >= 128) { // bit 7
$st1 = $st1 – 128;
echo “O papel acabou<br>”;
$existe = true;
}
if ($st1 >= 64) { // bit 6
$st1 = $st1 – 64;
echo “O papel esta acabando<br>”;
$existe = true;
}
if ($st1 >= 32) { // bit 5
$st1 = $st1 – 32;
echo “Erro no relógio da impressora<br>”;
$existe = true;
}
if ($st1 >= 16) { // bit 4
$st1 = $st1 – 16;
echo “Impressora em erro<br>”;
$existe = true;
}
if ($st1 >= 8) { // bit 3
$st1 = $st1 – 8;
echo “Primeiro dado do método não foi ESC<br>”;
$existe = true;
}
if ($st1 >= 4) { // bit 2
$st1 = $st1 – 4;
echo “Método inexistente<br>”;
$existe = true;
}
if ($st1 >= 2) { // bit 1
$st1 = $st1 – 2;
echo “Cupom fiscal aberto<br>”;
$existe = true;
}
if ($st1 >= 1) { // bit 0
$st1 = $st1 – 1;
echo “Número de parâmetro(s) inválido(s)<br>”;
$existe = true;
}
}
//Tratando o Status 2 (st2)
if ($matriz[3] != 000)
{
$st2 = $matriz[3];
if ($st2 >= 128 ) { // bit 7
$st2 = $st2 – 128;
echo “Tipo de parâmetro do método inválido” ;
$existe = true;
}
if ($st2 >= 64 ) { // bit 6
$st2 = $st2 – 64;
echo “Memória fiscal cheia<br>”;
$existe = true;
}
if ($st2 >= 32 ) { // bit 5
$st2 = $st2 – 32;
echo “Erro na memória RAM<br>”;
$existe = true;
}
if ($st2 >= 16 ) { // bit 4
$st2 = $st2 – 16;
echo “Alíquota não definida<br>”;
$existe = true;
}
if ($st2 >= 8 ) { // bit 3
$st2 = $st2 – 8;
echo “Capacidade de alíquotas esgotada<br>”;
$existe = true;
}
if ($st2 >= 4 ) { // bit 2
$st2 = $st2 – 4;
echo “Este cancelamento não é permitido<br>”;
$existe = true;
}
if ($st2 >= 2 ) { // bit 1
$st2 = $st2 – 2;
echo “CNPJ/IE do Proprietário não definidos<br>”;
$existe = true;
}
if ($st2 >= 1 ) { // bit 0
$st2 = $st2 – 1;
echo “Método não executado<br>”;
$existe = true;
}
}
}
}
fclose($retorno);
if ($existe == false) {
echo “Método Executado com sucesso!”;
}

?>
 
E agora você consegue saber se o comando foi executado com sucesso, ou não, e ainda consegue avisar o usuário o que está acontecendo com a sua impressora.
 
Note que não usei O.O. para ficar bem simples e objetivo.
Depois vou postar um modo para impressora não fiscal, e um exemplo em TEF completo seguindo este modelo acima.
 
Dúvidas? Comente aqui mesmo, ou mande um e-mail: ddc.suporte@daruma.com.brOu me chame pelo skype: ddc_suporte_daruma
 
*** Dúvidas, por favor entre em contato direto com a Daruma:
Não trabalho mais com automação comercial. Abraços!


Guilherme Moraes

Anúncios
Esse post foi publicado em Programação em PHP. Bookmark o link permanente.

2 respostas para PHP e Impressoras Fiscais Daruma – uso local

  1. Gostaria de saber se preciso baixar algum programa ou DLL para a máquina onde a ECF está ligada. Baixei o OCX e só vi um arquivo daruma…CAB então, como meu PDV é em PHP e vai rodar em um navegador, é preciso o usuário do sistema fazer o download desse arquivo para a máquina dele?

    • Desculpe a demora em aprovar/responder.
      Não trabalho mais com automação comercial, e sugiro que entre em contato (imagino que já tenha feito…) diretamente com a Daruma:
      desenvolvedoresdaruma.com.br

      Um abraço, e novamente me desculpe.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s