Impressor Fiscal SAV

Propaganda
Impressor Fiscal SAV
IFS
Luciana Yamashita / Lan
02 de junho de 2014
Considerações gerais
O Impressor Fiscal SAV (IFS) é um módulo criado de maneira a fornecer um grupo de funcionalidades
necessárias à complementação de operações fiscais enquanto relacionadas ao acesso à impressoras criadas
para esta finalidade. Tais funcionalidades foram definidas e programadas segundo a ótica dos requisitos da
aplicação SAV de forma a favorecê-la em seu desenvolvimento, mascarando particularidades existentes nas
diversas impressoras fiscais disponíveis no mercado.
Seu desenvolvimento e apresentação se dão através de um executável e uma biblioteca compartilhada
(apenas na versão Windows). A troca de informações com a parte executável é realizada por de memória
compartilhada identificada no arquivo de configuração do IFS.
Para alcançar o objetivo principal que é a independência entre aplicação SAV e impressora fiscal em
uso foram definidos e criados três (3) grupos de comandos. Por sua vez, estes comandos podem ou não ter
correspondência direta com comandos fiscais obrigatórios e disponíveis nas diversas impressoras fiscais
suportadas, segundo os convênios estabelecidos pelos estados da União. Desta maneira, quando uma
necessidade SAV é imposta, seja ela impressa ou de consulta, a mesma é convertida em um ou mais
comandos fiscais, dependendo do modelo / marca da impressora alvo.
Neste documento são apresentados diversos parâmetros de operação para o impressor além da
relação dos comandos fiscais com seus respectivos parâmetros, as condições de retorno e outras
informações adicionais que se fizerem necessárias.
Todos os comandos que geram alguma impressão fiscal foram reunidos no primeiro dos grupos de
comandos e numerados a partir de 101; Todos os comandos que retornam dados fiscais de trabalho da
operação sem gerar algum tipo de impressão compõem o segundo grupo e são numerados a partir de 201; O
terceiro e último grupo de comandos se caracteriza por conter funções especiais, muito específicas,
destinadas mais para auxílio emergencial do que propriamente no trabalho normal da aplicação SAV. Neste
grupo os comandos são numerados a partir de 301.
A montagem de comandos a serem executados pelo impressor é feita por uma cadeia ASCII com o
número de comando posto em primeiro lugar seguido opcionalmente de parâmetros. Para separar cada um
dos campos desta cadeia é usado um caractere delimitador especial definido, a princípio, como a barra em pé
ou “PIPE” (hexadecimal 0x7A). Este caractere pode ser alterado dinamicamente por configuração conforme
veremos mais adiante. A formatação do comando no padrão IFS pode ser ilustrada através das duas formas
abaixo:
Comando
Comando | parm_1 | parm_2 | ... | parm_n
ou ...
De forma similar, o retorno do impressor fiscal para a aplicação SAV se dará com o primeiro campo
como sendo o de condição de execução do comando pedido seguido, opcionalmente de outros dados /
informações. O valor zero para o campo de condição indica operação bem sucedida enquanto que valores
diferentes correspondem a algum erro / inconsistência detectado no processo de execução. A formatação da
resposta no padrão IFS pode ser ilustrada através das três formas abaixo:
Condição Normal
Condição de Erro | Texto explicativo
Comando Normal| info_1 | info_2 | ... | info_n
ou ...
ou ...
Conforme salientamos acima, tanto as informações do comando como as de resposta são postas na
memória compartilhada entre o programa da aplicação SAV que requisitará algum tipo de operação e o
impressor que o executará.
A gerência de uso desta memória compartilhada é bem simples e feita por sinalização em seu primeiro
byte: quando o mesmo se encontrar com valor zero (0) binário (low-values), o uso desta área é de
responsabilidade da aplicação SAV – neste momento ela poderá colocar ou retirar dados que se encontrem
no restante desta memória; já com qualquer outro valor diferente do zero (0) neste primeiro byte o uso da
memória será de responsabilidade do impressor.
Desta forma, após a aplicação SAV colocar um comando IFS a partir do segundo byte desta memória,
ela deverá passar o valor do primeiro byte para um (1) e aguardar até que o mesmo retorne ao valor zero
(0). De forma equivalente o impressor ficará continuamente verificando o valor do primeiro byte da memória
até que o mesmo passe para o valor um (1). Neste instante ele retirará o comando para lá copiado e o
executará. Ao término da execução, ele porá a resposta também a partir do segundo byte da área para, em
seguida, passar o valor do primeiro byte para zero (0).
Antes de passarmos aos comandos e seus respectivos retornos, é importante comentarmos os
parâmetros de ativação do impressor. Eles podem ser divididos em dois grupos: os obtidos na forma padrão
ou pelo arquivo de configuração denominado ifs.inf e os demais obtidos de variáveis de ambiente. Este
segundo grupo não é obrigatório e nem necessários, mas orientam a execução do IFS em casos especiais.
A primeira variável, IFS_CONF, aponta local e arquivo que contém dados de configuração – substituto
eventual do arquivo padrão ifs.inf. Em sua forma convencional de trabalho, o IFS primeiro procura pelo
arquivo “ifs.inf” no diretório de ativação. Caso não o encontre, procura o arquivo apontado por esta variável.
A segunda variável, IFS_RAST, relaciona-se à geração do arquivo de rastro (TRACE) de operação.
Este processo de geração de rastro, por princípio, estará sempre ativo durante a operação do IFS. O arquivo
derivado daí tem por nome um prefixo – letra “T” – seguido de quatro (4) dígitos. Tais dígitos, por sua vez
são, respectivamente, o mês e o dia de ativação obtidos do relógio do sistema. Pode-se mudar o prefixo do
nome fazendo esta variável igual a uma cadeia de caracteres alfanuméricos. Caso este prefixo venha
precedido de um caminho, este será o local de criação do arquivo de rastro.
A terceira variável, IFS_EXCL, permite carga e execução de simultâneas cópias do IFS numa mesma
máquina. A informação passada aqui é, na verdade, um número que identificará outro semáforo de exclusão
que é usado justamente para prevenir a execução indevida de múltiplas cópias do impressor. O uso deste
recurso só é recomendado caso o uso de mais de uma cópia do IFS for obrigatória. Numa configuração
MASTER e SLAVE são permitidas até sessenta e quatro (64) conexões simultâneas ao MASTER. Caso este
número precise ser excedido, um novo MASTER deverá ser ativado, justificando o uso desta variável de
ambiente. O valor default é 56894 devendo o valor alternativo ser diferente de zero (0) e com, no mínimo,
uma diferença de cem (100) acima ou abaixo do valor em uso pela primeira cópia.
A quarta e última variável, IFS_FEOP, altera o modo de operação em alguns casos especiais. Esta
variável deve ser definida como uma seqüência de dígitos de valor zero (0) ou de valor um (1). A condição
default será mantida caso o valor correspondente seja zero (0) ou haverá uma modificação na operação em
caso contrário. Até a presente versão são cinco (5) os modificadores possíveis:
1
2
3
4
5
6
Força a continuação do IFS caso algum erro seja detectado na abertura de porta serial para
comunicação com impressora fiscal e/ou balança de checkout;
Permite desabilitar a geração do rastro (TRACE). Esta opção deve ser evitada porque em
caso de alguma falha não haverá nenhuma possibilidade de detecção da mesma;
Habilita, na geração no rastro, a apresentação de todos os dados transportados dentro de
cada bloco entre MASTER e SLAVE. Deve ficar o alerta para o caso desta opção ser ativada
acarretar na geração de arquivos gigantescos de rastro;
Desabilita a conversão de caracteres especiais (acentuados, por exemplo) para caracteres
pertinentes à apresentação do COBOL;
Desabilita o salto de página em relatórios convertidos para HTML;
Desabilita término forçado por sinal do IFS no Linux (sinais 10, 12 e 20);
Arquivo de Configuração “ifs.inf”
O arquivo de configuração básico do IFS é composto de grupos de dados, um para cada equipamento
na rede que tiver uma cópia sua em execução. Cada grupo se inicia pelo nome da máquina delimitado por
colchetes e seguido de informações, uma por linha, pertinentes ao modo como o IFS foi ativado.
As linhas de informações, por sua vez, se iniciarão com um mnemônico seguido de uma ou mais
informações, separadas por espaço(s) em branco. Caso algum dado venha a conter espaços em seu meio,
então ele deve ser delimitado por aspas. Já os mnemônicos serão formados por uma letra seguida da
informação a ele associada.
Modo MASTER:
[Nome_de_Máquina]
M_MODE
M_PATH
M_NAME
M_CEPS
M_ADDR
M_PORT
S_NAME
S_BAUD
S_NORM
S_MOEDA
S_ALRSA
S_ADDR
S_PATH
S_TEMPO
S_TOTAL
S_COPIA
S_INDX
S_SHOW
S_PRINT
S_VINCO
S_VERAO
R_MEMO
R_SHOW
R_PRINT
R_VINCO
R_VERAO
R_BAUD
R_HTML
R_SCALE
R_BANCO
R_PATH
R_NORM
R_MOEDA
R_ALRSA
Modo SLAVE:
[Nome_de_Máquina]
S_MODE
S_MEMO
S_HTML
S_SCALE
S_BANCO
Modo RESIDENTE:
[Nome_de_Máquina]
R_MODE
R_CEPS
R_TEMPO
R_TOTAL
R_COPIA
Assim sendo, para um IFS atuando como MASTER teremos mnemônicos iniciados pela letra “M”, como
SLAVE a letra “S” e como RESIDENTE a letra “R” como indicado nas tabelas acima.
Na análise do arquivo, todas as informações que se seguirem ao nome do grupo serão consideradas
como pertencentes a esta máquina até que um novo grupo seja encontrado ou que o final do arquivo seja
alcançado. As linhas iniciadas pelo caractere ponto e vírgula serão consideradas como comentário e,
portanto, desprezadas na análise.
Por “Nome_de_Máquina” deve-se entender o nome que se dá ao equipamento quando da instalação
do sistema operacional e que será retornado sempre que solicitado pelo programa. É fundamental que não
existam dois nomes de computadores iguais na rede. Este campo identifica qual o grupo de dados a ser
considerado quando da análise do arquivo. Ele também é necessário para a resolução do endereço IP
(obtenção do endereço IP a partir de uma cadeia de caracteres que, no caso, será o nome atribuído ao
computador) quando houver necessidade de conexão entre máquinas.
M_MODE, S_MODE ou R_MODE: indica a forma de funcionamento do IFS. A letra inicial define esta
função: “M” para MASTER, “S” para SLAVE ou “R” para RESIDENTE. O modo MASTER (servidor) será ativado
na mesma máquina onde estará rodando a aplicação SAV. O modo SLAVE (cliente) rodará em máquina
conectada à impressora fiscal. Finalmente, o modo RESIDENTE deve ser usado quando apenas uma máquina
existir e nela estiverem sendo executados tanto a aplicação SAV como também a impressora fiscal.
M_NAME ou S_NAME: define um nome alternativo para a máquina. Este novo nome, caso informado,
será utilizado na resolução do endereço IP no lugar do informado em “Nome_da_Máquina” acima
comentado. O primeiro nome – aquele informado quando da instalação do sistema operacional – geralmente
é suficiente para a resolução do IP, sendo o preenchimento do atual campo dispensável na maioria dos
casos. Pode, entretanto, existir a necessidade de se resolver um nome no âmbito da Internet onde a
máquina em questão faz uso de IP dinâmico. Nestes casos a máquina ganha um novo nome ou um nome de
fantasia para fins de Internet (Serviços prestados por www.dyndns.org ou www.no-ip.com, por exemplo).
M_ADDR ou S_ADDR: define o endereço IP a ser efetivamente usado numa conexão entre MASTER e
SLAVE. Caso esta informação seja fornecida, a resolução de endereço IP é desconsiderada. A razão deste
parâmetro é contornar o problema provocado pela existência, numa mesma máquina, de duas ou mais
placas de rede em atividade. Um exemplo prático é o computador que ao mesmo tempo se ligue a uma rede
local e à Internet. Cada uma das placas do equipamento terá seu endereço IP. Por conseguinte, para se
estabelecer uma conexão será necessário saber através de qual endereço.
M_PORT informa o número da porta a ser aberta pelo módulo servidor (MASTER) para aceitar pedidos
de conexão de um ou mais módulos cliente (SLAVE). É preciso esclarecer aqui que não basta o endereço IP
para se ter uma conexão. Numa mesma máquina é possível termos vários softwares usando a comunicação
por rede simultaneamente. Como o endereço IP define a origem e o destino (máquina), a porta definirá o
software num envio / recepção de pacotes de dados,
Para ilustrar possíveis dificuldades de configuração encontradas em instalações de clientes SAV,
suponhamos uma empresa que tenha uma matriz e quatro (4) filiais, todas elas interligadas pela Internet,
conforme ilustrado na figura acima. Caso em cada um destes estabelecimentos houvesse uma única máquina
e, portanto, a necessidade de um único IP, não haveria maiores dificuldades de configuração.
O que acontece, entretanto, é encontrarmos redes locais abrangendo inúmeros equipamentos em cada
um destes lugares e, por conseguinte, a necessidade de vários endereços IP. Como não é exeqüível ter
endereços IP no âmbito da Internet para cada equipamento, o que na verdade se tem é um único endereço
Internet para cada local compartilhado por todos os equipamentos lá existentes.
O compartilhamento do endereço Internet é exercido por um dos equipamentos da rede local do
estabelecimento e é denominado como “gateway”. Em geral este mesmo equipamento terá a função
adicional de proteção desta rede local e funcionará como “firewall”. Na nossa ilustração exemplo, quatro dos
cinco estabelecimentos têm uma máquina deste tipo.
Fica óbvio agora que estes computadores que doravante definiremos como firewall/gateway devam ter
duas placas de rede e, por conseguinte, dois endereços IP: um voltado para a Internet e outro para a rede
local interna.
Retornando agora ao nosso problema de configuração, podemos dizer que uma conexão estabelecida
apenas no âmbito de uma rede local necessitará apenas de endereços IP locais. Por outro lado, caso a
conexão passe pela Internet, será necessário o uso de endereços da Internet já que endereços da rede
interna não são reconhecidos no âmbito da Internet.
Pensemos agora em estabelecer uma conexão entre duas máquinas desta empresa: o “Servidor” que
se encontra na matriz e onde estarão rodando os programas da aplicação SAV e um cliente que
escolheremos como sendo o “Caixa 2” da filial “Loja 3”. Estas duas máquinas precisarão se conectar para que
os dados da aplicação possam transitar livremente entre elas.
Como definimos acima, o “Servidor” abrirá uma porta para esperar por pedidos de conexão e, dentre
eles, o que virá da nossa máquina exemplo na filial “Loja 3”. Ocorre que o endereço IP do “Servidor” e a
porta por ele criada serão de conhecimento exclusivo da rede interna da matriz e, portanto, não passiveis de
uso através da Internet.
Já a conexão a ser solicitada pelo “Caixa 2” somente poderá ser feita para o endereço IP Internet da
matriz e numa porta pré estabelecida (não necessariamente tem o mesmo número de porta criada pela
máquina “Servidor” em sua rede local). O pedido de conexão chegará então na matriz através de seu
computador firewall/gateway que, a princípio, não saberá o que fazer com ele. Será necessário redirecionar
este pedido de conexão ao seu destino efetivo que é a máquina “Servidor”. Para esta finalidade existem
comandos de configuração de sistema. No caso de sistemas padrão Linux, o comando seria:
iptables -t nat -A PREROUTING -p tcp --dport PORTA -j DNAT --to ENDEREÇO:PORTA
A primeira “PORTA” que aparece neste comando será substituído pelo número da porta que virá nas
solicitações externas de pedidos de conexão ou a porta estabelecida pelo firewall/gateway para a Internet. Já
no lugar de “ENDEREÇO” deverá aparecer o endereço IP da máquina destino ou o do “Servidor”. A última
“PORTA” do comando será a porta estabelecida pelo “Servidor” para receber conexão dentro da rede local da
matriz. Para evitar confusões, sugere-se que o número destas duas “portas” seja sempre igual. Em tempo: o
número default para porta de conexão do IFS é 1926.
S_INDX é o parâmetro contraparte na configuração do SLAVE para o número que define a porta na
configuração do MASTER (parâmetro anterior). Apoiada na mesma lógica usada para se encontrar a máquina
destinatária ou o “Servidor” dentro da rede local da matriz, torna-se necessária também a diferenciação da
máquina de onde partiu a solicitação de conexão dentro da rede local da filial.
Como se sabe, o solicitante de uma conexão não precisará estabelecer uma porta, mas caso no lado
solicitante existir mais de uma máquina que precise se conectar haverá problema de identificação. Mais uma
vez vale lembrar que o endereço IP origem e o endereço IP destino quando se usa a Internet é sempre o
endereço da Internet. Como os pedidos de conexão partem de máquinas distintas dentro da mesma filial
“Loja 3” (lá existem três caixas), o endereço sempre recebido como sendo o de origem pelo “Servidor” será o
endereço IP Internet da “Loja 3”.
Um forma possível de se distinguir a efetiva origem de um pedido de conexão vindo da “Loja 3” é se
ele for direcionado para uma porta específica no “Servidor”. Se analisarmos agora a nossa ilustração
exemplo, veremos que na matriz existem três máquinas com possibilidade de conexão e no conjunto das
filiais o número máximo de máquinas com conexão habilitada é de quatro – caso da “Loja 3” (foram incluídos
neste cálculo as máquinas firewall/gateway). Dentro da matriz, por termos uma rede local não usuária da
Internet, não existirá problemas na resolução de endereços IP e a porta poderá ser única. Já nas filiais “Loja
1”, “Loja 3” e “Loja 4” serão necessárias múltiplas portas.
O campo presente serve para distinguir (diferenciar) a porta a ser usada por cada máquina presente
nas filiais. Retornando ao exemplo da filial “Loja 3”, atribuiremos o valor um (1) a este campo no conjunto de
dados definidos para a máquina “Caixa 1”. Respectivamente colocaremos valores dois (2) e três (3) para o
mesmo campo na definição das máquinas “Caixa 2” e “Caixa 3”. Caso o firewall/gateway deste
estabelecimento também necessite se conectar com o “Servidor”, atribuiremos a ele o número quatro (4).
Pronto! A partir deste ponto, ao analisar o arquivo de dados, a cópia MASTER do IFS criará
obrigatoriamente quatro portas distintas para atender a esta loja. Caso estejamos usando o valor default
para o parâmetro porta, teremos a criação das portas numeradas de 1926 a 1929.
Se considerarmos agora o caso da filial “Loja 1”, veremos que são necessárias três (3) portas para
conexão. O “Caixa 1” poderia então receber o número um (1) neste campo, o “Caixa2” o número dois (2) e,
finalmente, o firewall/gateway o número três (3). Como são necessárias três portas e elas já foram criadas
para atender à filial “Loja 3”, nenhuma ação adicional precisará ser tomada pelo MASTER.
S_MEMO ou R_MEMO identifica a memória compartilhada usada na comunicação entre aplicação SAV
e o IFS. Trata-se de um número cujo valor default é 1894. O único cuidado que se deve ter aqui é não usar
um identificador que já esteja em uso por outro cliente SLAVE / usuário.
Este parâmetro deve ser considerado com bastante cuidado porque é somente através dele que se
obterá acesso à memória compartilhada. Desta forma, um programa da aplicação SAV precisará também
saber qual será seu identificador (número) sob pena de criar conflito com algum outro programa.
Recomenda-se que estes identificadores sejam explicitamente definidos no arquivo de configuração.
Caso os mesmos não sejam informados, o procedimento do MASTER será o de criar a primeira memória
compartilhada com o número default e associá-lo à primeira máquina SLAVE que aparecer no arquivo de
configuração. A seguir é incrementado de um o valor default para criar a segunda memória compartilhada
que será associada, por sua vez, à segunda máquina que aparecer e assim sucessivamente.
S_BAUD ou R_BAUD definem uma velocidade alternativa para a impressora fiscal a ser usada
durante a comunicação com a impressora fiscal. O IFS internamente pré define a velocidade a ser usada com
o valor padronizado pelo próprio fabricante. Só que a velocidade pode, muitas vezes, ser mudada por
solicitação do cliente e, para isso, este campo serve.
M_PATH, S_PATH ou R_PATH indicam o local onde a aplicação SAV e seus componentes (IFS
incluído) são disparados para execução. Note que o local aqui indicado não obrigatoriamente é o mesmo
onde o impressor fiscal estará em execução.
M_CEPS ou R_CEPS indicam o local onde estão todos os arquivos que compõem o banco de dados
necessário às consultas de CEP.
S_SHOW ou R_SHOW indicam o local onde ficam armazenadas todas as imagens e/ou fotos a serem
apresentadas ao usuário.
S_HTML e R_HTML indicam caminho e nome do browser a ser usado em apresentações de arquivos
HTML ou, eventualmente, XML.
S_NORM e R_NORM indicam a presença de impressora não fiscal configurada na máquina. Este
parâmetro evita o erro “RUNTIME 486” comum em sistemas Windows onde não existe a presença de
impressora não fiscal. O valor default deste campo é zero (0) indicando nenhuma impressora configurada;
S_TEMPO ou R_TEMPO: define o tempo máximo que a parte fiscal do impressor deve aguardar por
uma resposta da impressora após o envio de qualquer comando. Este tempo deve ser definido em função do
comando mais extenso de impressão fiscal que são as leituras X e de redução Z. O valor default assumido
por esta variável é de sessenta (60) segundos não podendo ser inferior cinco (5) segundos.
Tabela de impressoras fiscais:
13
14
15
16
18
19
20
21
Bematech MP-2000
Bematech MP-6000
Daruma FS600
Daruma FS2100
Bematech MP-2100
Bematech MP-3000
Sweda ST-100
Sweda ST-1000
TH FI
TH FI
TH FI
TH FI
22
23
24
25
26
27
28
29
Sweda ST-120
Sweda ST-200
Elgin MFD FIT 1E
Bematech MP-4000 TH FI
Daruma FS 700
Daruma MACH
Epson TM-T81 FBIII
Epson TM-T88 FBIII
S_PRINT ou R_PRINT: traz o tipo e modelo da impressora fiscal em uso além do número da porta
serial ao qual ela está conectada à máquina. Como de praxe, as duas informações devem vir separadas pelo
delimitador padrão que é um ou mais espaços em branco. A relação de tipos e modelos das impressoras
fiscais suportadas bem como os números que as definem junto ao impressor é apresentada na tabela acima.
O terceiro parâmetro a ser incluído nesta linha é a senha de acesso à impressora fiscal fornecida pela
SAV. Esta informação pode também ser passada de forma dinâmica pela aplicação SAV e, por isso, pode ser
inicialmente omitida aqui. Deve, entretanto, ficar registrado que a senha usada para validação das operações
será sempre a última senha válida recebida pelo impressor e que, caso esta senha recebida dinamicamente
tenha prazo de validade superior à senha em uso, o IFS criará automaticamente um arquivo “ifs.inf” no
diretório de ativação para salvar esta nova senha.
Tabela de balanças de checkout:
1
2
Toledo 9094
Filizola BP
3
Filizola CS
S_SCALE ou R_SCALE: traz o tipo e modelo da balança checkout em uso além do numero da porta
serial ao qual ela está conectada à máquina. Como de praxe, as duas informações devem vir separadas pelo
delimitador padrão que é um ou mais espaços em branco. A relação de tipos e modelos de balanças de
checkout suportadas bem como os números que as definem junto ao impressor é apresentada na tabela
acima.
S_MOEDA ou R_MOEDA, S_TOTAL ou R_TOTAL, S_VINCO ou R_VINCO são três parâmetros que
recebem como informação um conjunto de letras que servirão para mapear acumuladores originalmente
cadastrados na impressora fiscal via intervenção fiscal de forma a serem acionados de forma unívoca pela
aplicação SAV quando em operação.
Esta aplicação faz uso de duas relações pré-determinadas: a primeira delas de meios de pagamento e
a segunda de totalizadores não fiscais não vinculados (veja abaixo as duas tabelas bem como a ordem
esperada para seus diversos componentes). Infelizmente o que mais se encontra nas impressoras fiscais em
uso é a não observância destas duas ordens de componentes requeridas pela SAV.
Agora, se considerarmos que o propósito básico do IFS é permitir que o funcionamento da aplicação
seja feito de forma independente do cadastramento feito na impressora fiscal, torna-se necessário fazer um
mapeamento aqui.
Tabela de meios de pagamento usados pela SAV:
Dinheiro
Cheque a Vista
Cartão Magnético
Cartão de Crédito
Crediário
Financeira
Cheque Pré-Datado
Convênio
Duplicata
Ticket / Vale
Trocas / Devoluções
Movimento Anterior
Tabela de totalizadores não fiscais usados pela SAV:
Notas a Emitir
Notas já Emitidas
Pedidos e Orçamentos
Contratos
Duplicatas
Diversos
Autenticações
Sangria
Suprimento
Trocas / Devoluções
Para ilustrar o processo de mapeamento, tomemos uma relação “maluca” de totalizadores apresentada
pela tabela abaixo. Suponhamos que esta relação, na forma como está, se encontra cadastrada na
impressora fiscal de um cliente e as informações apresentadas obtidas através de uma leitura X.
Tabela de totalizadores não fiscais encontrados numa impressora exemplo de cliente:
Notas a Emitir
Conta de Luz
Contratos
Conta de Gás
Conta de Telefone
Duplicatas
Autenticações
Notas já Emitidas
Outras Contas
Sangria de Valores
Carga de Troco
A
B
C
D
E
F
G
H
I
J
K
A seguir fazemos uma associação atribuindo, pela ordem de cadastro na impressora, uma letra para
cada totalizador tal como o ilustrado na nossa tabela exemplo. Desta maneira, o primeiro totalizador – Notas
a Emitir – recebe a letra “A”, o segundo – Conta de Luz – recebe a letra “B” e assim sucessivamente.
Estamos agora preparados para fazer o mapeamento:



O primeiro totalizador necessário à aplicação SAV é “Notas a Emitir”. Por coincidência este é também
o primeiro totalizador cadastrado na impressora exemplo. Por isso a primeira letra do mapeamento
será a letra “A”;
Já o segundo totalizador necessário à aplicação SAV, “Notas já Emitidas”, aparece na oitava posição
da impressora exemplo. Por isso, a segunda letra do mapeamento será a letra “H”;
Seguindo este raciocínio construímos o mapeamento que será uma cadeia de letras a ser associada à
variável de configuração S_TOTAL ou R_TOTAL;
Propositalmente deixamos de acrescentar os relatórios SAV denominados “Pedidos e Orçamentos” e
“Trocas / Devoluções” como sendo relatórios cadastrados na impressora exemplo. Esta falta, por si só,
nos impossibilitaria de fazer um mapeamento acurado. Caso este problema surja numa implantação,
algumas alternativas podem ser consideradas:




A primeira delas é utilizar as facilidades de um comando especial do próprio IFS e cadastrar o
totalizador faltante na impressora fiscal do cliente. Esta opção é a mais simples e é a preferível;
Outra opção é requisitar uma intervenção técnica. Esta alternativa deve ser usada caso a impressora
não mais permitir a inclusão de novos totalizadores. Neste caso, no processo de intervenção pode-se
recadastrar todos os totalizadores requeridos pela SAV;
Uma alternativa não muito interessante, mas que fará com que o sistema funcione com restrições, será
conviver sem algum totalizador específico. Neste caso, colocamos no nosso mapeamento o caractere
menos “-” (menos) no lugar correspondente ao mapeamento;
A quarta e última alternativa é usar um totalizador não necessário ao IFS em substituição ao que falta.
Esta opção, contudo, pode gerar confusão;
Finalizando agora nosso raciocínio, caso não tenha sido feita alterações na impressora do cliente
(terceira alternativa da nossa lista de opções acima) teremos com seqüência de mapeamento para o
parâmetro S_TOTAL ou R_TOTAL a cadeia “AH-CFIGJK”. Observar aqui o uso do totalizador denominado
“Outras Contas” (ou letra “I”) em substituição ao totalizador de nome “Diversos” no padrão SAV.
O mesmo método de raciocínio deve ser empregado para o mapeamento dos meios de pagamento a
ser atribuído à variável de configuração S_MOEDA ou R_MOEDA.
Algumas moedas, quando usadas como meio de pagamento, requerem a emissão de um cupom
adicional. O exemplo mais comum aqui é a Transferências Eletrônicas de Fundo (TEF) onde são usados
cartões magnéticos que exigem um comprovante adicional para assinatura do cliente.
Este cupom adicional é denominado de cupom vinculado e, para alguns convênios que regem as
impressoras fiscais, deve ser não só nomeado como, especificamente, relacionado à moeda utilizada. As
implicações desta exigência nos levaram à criação de nossa terceira variável de mapeamento denominada de
S_VINCO ou R_VINCO.
O processo de definição desta terceira variável de mapeamento segue o mesmo critério estabelecido
para as duas anteriores. Assim sendo, se o segundo relatório vinculado (letra B) corresponde a pagamentos
TEF; o terceiro relatório vinculado (letra C) corresponde a financiamentos; e nenhum outro relatório
vinculado se aplica, definimos esta nova variável como igual à cadeia “—BB-C------“ onde cada posição
desta lista corresponde a uma das posições da relação de meios de pagamento acima fixada.
Vale aqui uma nota adicional sobre totalizadores em geral. Segundo os convênios fiscais mais recentes
ficou caracterizada a existência de dois (2) tipos de totalizadores: um de entrada ou positivo e um segundo
de saída ou negativo. Por entrada e saída entenda-se entrada e saída de moedas do caixa. Consideramos
entrada todas as vezes que há, por exemplo, um pagamento de conta, pois, nestes casos, é necessário que
“entre” algum tipo de moeda no caixa correspondente ao total a ser pago. Por outro lado, sempre que algum
numerário deste mesmo caixa é retirado para saldar alguma dívida da loja, consideramos esta operação
como uma saída de valores.
A princípio os totalizadores positivos e negativos poderiam ser usados com esta lógica. Ocorre, porém
que numa entrada de moedas no caixa, o cupom não fiscal gerado pela impressora permite discriminar não
só as moedas usadas como também o valor de cada uma delas.
O mesmo, infelizmente, não ocorre quando se trata de uma saída de valores do caixa. Nestes casos, os
fabricantes de impressoras fiscais entendem que só se pode retirar do caixa valores em dinheiro (!). Caso,
por exemplo, ao se executar uma operação tradicional de sangria se retire todos os cheques recebidos até o
aquele momento, o valor total informado na operação é creditado como se a retirada tivesse sido feita
integralmente em dinheiro. Pode-se com isso chegar ao absurdo de se ter o totalizador de dinheiro negativo.
Entre uma situação e outra, a aplicação SAV optou por usar somente totalizadores positivos ou de
entrada. Exatamente por estes totalizadores poderem informar o total em cada moeda envolvida na
operação, é mais fácil o controle das moedas no final do dia em cada caixa. É bem verdade que os
totalizadores em moedas da impressora ficam distorcidos, mas esta deficiência é compensada pela aplicação
SAV que fornece estes dados sempre atualizados, poupando o administrador de fazer contas de ajuste caso a
caso.
S_BANCO ou R_BANCO: informa o local de residência e o nome do arquivo que contém informações
para preenchimento de cheque. O arquivo originalmente é gerado pelo fabricante da impressora fiscal e
distribuído pela própria SAV aos clientes que possuam impressoras com esta capacidade. Este arquivo
contém parâmetros para o devido posicionamento de cada folha de cheque dos diversos bancos e, por isso,
não pode sofrer qualquer tipo de alteração sob pena de erro quando numa operação com a impressora. A
especificação do local (caminho e nome deste arquivo) deve observar a seguinte composição:
Windows:
Unix:
disco:/caminho_1/caminho_2/.../caminho_n/nome_do_arquivo
/caminho_1/caminho_2/.../caminho_n/nome_do_arquivo
Observar que o exposto acima é apenas um exemplo. A definição de caminho pode ser usada
amplamente segundo os critérios permitidos em ambos os sistemas operacionais. Uma recomendação,
entretanto, fica aqui registrada: é quanto ao delimitador de segmentos do caminho que deve ser o caractere
barra (hexadecimal 0x2F), mesmo para ambiente Windows.
S_ALRSA ou R_ALRSA: informa o local de residência e o nome do arquivo que contem a chave
privada dentro do padrão RSA para fazer assinaturas digitais.
A especificação de como informar caminho e nome deste arquivo deve observar o que foi exposto no
parâmetro anterior.
S_COPIA ou R_COPIA: indica se um cupom adicional deve ser impresso em seguida ao término de
emissão de um cupom fiscal. Este cupom adicional serviria como comprovante uma vez que o cupom fiscal
original deve ser entregue ao cliente. Este comando foi criado para atender primordialmente às impressoras
térmicas que não geram a “cópia por carbono” dos cupons fiscais. Por default esta opção estará sempre
inativa. Para ativá-la o usuário deve atribuir a este parâmetro o valor um (1).
S_VERAO ou R_VERAO: visa forçar a impressora a trabalhar no horário normal ou de verão. Caso
este parâmetro não seja encontrado ou não esteja definido, nenhuma operação será realizada. Se a
necessidade for usar a impressora no horário normal, este parâmetro deverá ter o valor zero (0). Em caso
contrário – uso com o horário de verão – este parâmetro deverá ter o valor um (1). A troca de horário só
será possível quando o IFS for desativado imediatamente após uma redução Z. Considerar a reativação do
IFS com um intervalo de no mínimo uma hora após seu desligamento quando a opção for a de sair do horário
de verão.
Uma vez apresentado o conjunto de variáveis de configuração para que uma cópia do impressor possa
funcionar e analisando este conjunto de informações para um determinado modo de funcionamento,
podemos notar que, eventualmente, variáveis podem não ser necessárias.
Sabemos, por outro lado, também que, num arquivo de configuração, caso uma variável não precise
ter informação, ela pode simplesmente não constar neste arquivo.
Mesmo assim, a recomendação que se faz aqui é que, num grupo de definição, todas (sem exceção)
variáveis estejam presentes. Aquelas que não forem, por ventura, necessárias devem estar sempre
presentes, mas sem nenhum dado associado.
Esta forma de agir garante que, em se tendo sempre todas as variáveis presentes, fica mais fácil
visualizar deficiências ou excessos nestas configurações quando se necessita corrigir eventuais erros.
Fazendo, finalmente, um resumo das necessidades de uma configuração mínima que cada modo de
ativação do impressor deverá ter, podemos dizer que:




A variável #_MODO é obrigatória em todos os modos, não existindo um default para ela;
A variável #_NOME é de definição obrigatória quando a máquina tem um nome de Internet diferente
do nome de instalação sendo a comunicação com ela ser feita através da rede mundial;
A definição para a variável #_ADDR é altamente recomendável em todas as máquinas que possuírem
duas ou mais placas de rede ativas, independente do modo como impressor ira funcionar, se como
cliente ou se como servidor;
A variável #_MEMO é obrigatória mesmo que não definida formalmente. É importante ter atenção ao
valor que ela assume para cada cliente, pois a aplicação SAV que fará comunicação com o impressor
terá também que fazer uso desta informação;
Funções adicionais não relacionadas
Algumas funções não relacionadas ao processo impressor foram anexadas a este módulo no sentido de
um melhor aproveitamento do modo de trabalho MASTER-SLAVE do IFS. Em geral, neste tipo de
configuração de trabalho, é muito comum o uso da Internet, o que dificulta certas tarefas que necessitem,
por exemplo, de acesso a arquivos presentes apenas no lado MASTER; tarefas que só tem sentido quando
executadas do lado SLAVE; e assim por diante.
Pensando nisso foi criado um comando especial (número 307) com opções que permitem desempenhar
tarefas não correlatas à parte fiscal. É válido lembrar que algumas destas funcionalidades só se aplicam em
ambiente Windows.
As descrições destas tarefas, seus parâmetros e eventuais retornos são apresentados em documento à
parte.
Conexão entre equipamentos numa rede local e na Internet
Suponhamos que se necessite estabelecer uma conexão interna ao Lugar A. A solicitação se origina em
um programa sendo executado no equipamento Equip_2A e se destina à outro programa em execução no
equipamento Equip_7A. Como se sabe, o pedido de conexão deve identificar além do endereço IP um
número de porta habilitado no equipamento destino. Tal porta, por sua vez, já deve estar criada pelo
programa alvo e devidamente configurada para receber solicitações de conexão.
Para o caso específico do IFS, a solicitação é originada pela ponta SLAVE (que estaria no equipamento
Equip_2A) e se dirigiria à ponta MASTER (que estaria no equipamento Equip_7A). Já a porta padrão criada
pelo impressor e habilitada para receber pedidos de conexão será a de número 1926. No nosso exemplo,
portanto, a operação de conexão identificaria os seguintes dados:
IP origem:
IP destino:
10.1.1.2
10.1.1.7
Porta: ?? (alocada dinamicamente pelo sistema operacional)
Porta: 1926
Suponhamos agora que se deseje estabelecer uma segunda conexão, só que a partir de um programa
rodando no equipamento Equip_3B situado no Lugar B com o mesmo programa em execução no
equipamento Equip_7A situado no Lugar A. Conforme podemos observar na figura acima, esta conexão usará
obrigatoriamente a Internet. Por este motivo, os dados identificados na origem – equipamento Equip_3B –
para este novo pedido de conexão será:
IP origem:
IP destino:
20.2.2.3
189.19.60.183
Porta: ?? (alocada dinamicamente pelo sistema operacional)
Porta: 1926
Note que o endereço de destino neste segundo caso é o endereço IP do equipamento no Lugar A que
está diretamente ligado à Internet. Este equipamento destino, portanto, dentro do nosso exemplo, pertence
a duas redes simultaneamente: à rede local criada no Lugar A e também à Internet. Por este motivo, na
figura ele vem apresentado com dois endereços IP distintos:
10.1.1.1
189.19.60.183
Endereço da rede local do Lugar A
Endereço da Internet
A denominação costumeira dada a este equipamento de interconexão de redes é “Gateway”. Podemos
identificar, portanto, dois equipamentos tipo “Gateway” no nosso desenho: ambos com o número final um
(1) presentes tanto no Lugar A quanto no Lugar B.
Continuemos, pois, nosso raciocínio deste segundo pedido de conexão percorrendo o caminho
necessário à conexão: o pedido sai do equipamento Equip_3B no Lugar B em direção ao equipamento
Equip_1B do mesmo Lugar B – “Gateway” do lugar B para a Internet. Quando este pedido é repassado à
Internet, o endereço destino se mantém, mas o endereço origem é modificado para o endereço de Internet
do Lugar B.
Os dados que identificam o pedido de conexão passam, portanto, a ser:
IP origem:
IP destino:
189.60.110.19
189.19.60.183
Porta: ?? (alocada dinamicamente pelo sistema operacional)
Porta: 1926
O próximo passo no caminho é a chegada da solicitação ao “Gateway” que se encontra no Lugar A.
Neste momento teríamos um impasse: no equipamento Equip_1A do Lugar A, ou o “Gateway” local, não
existe nenhum programa rodando que tenha habilitado a porta 1926 para receber este pedido de conexão.
Porém, como este equipamento é um “Gateway”, ele tem a habilidade de repassar dinamicamente o
pedido para alguma outra máquina conectada à outra rede ao qual ele também está ligado (no caso a rede
local do Lugar A). Como nesta outra rede pode existir uma série de equipamentos aptos a receber o pedido
de conexão em curso, a forma de resolver a quem encaminhar o pedido é a través de uma configuração
previamente feita no “Gateway”.
Exemplificando aqui uma possível solução deste problema, em sistemas Linux teríamos de usar o
comando “iptables” na forma:
iptables -t nat -A PREROUTING -p tcp --dport PORT -j DNAT –to ADDR:PORT
Nos locais onde aparece o rótulo “PORT” no comando acima, deve-se colocar o número da porta que,
no nosso caso, é 1926. No local onde aparece o rótulo “ADDR” deve-se colocar o endereço IP do
equipamento destino ou o Equip_7A sete que é 10.1.1.7.
É bem verdade que este comando “iptables” permite o redirecionamento também de portas: o primeiro
rótulo “PORT” indica a porta onde será recebida a mensagem pelo “Gateway” enquanto que o segundo rótulo
“PORT” indica a porta para onde será enviada esta mensagem. Estas duas portas podem, portanto, ter
valores diferentes caso haja necessidade. Para evitar confusão, sugerimos usar sempre o mesmo valor 1926.
Existe a possibilidade do equipamento Equip_1A, ou “Gateway” do Lugar A, não ser exatamente um
computador, mas sim um roteador. Como existem inúmeros equipamentos deste gênero no mercado e o
objetivo aqui é não dar suporte a todos eles, abriremos uma exceção para falar superficialmente do roteador
marca D-Link, muito comum.
Após a configuração básica deste roteador, é necessário fazer com que mensagens recebidas na porta
1926 do mesmo sejam aceitas e repassadas ao equipamento correto. Para tanto, na aba “Advanced” de
configuração deste roteador é necessário acrescentar uma entrada na “Virtual Server List”. Lá já constam
várias portas padronizadas como a 21 (FTP), 80 (HTTP), etc. Incluiremos, pois a porta 1926, procedendo da
seguinte forma:
Marcar a opção “enabled”;
Completar o endereço IP 10.1.1. “7”;
Indicar como tipo de protocolo o “TCP”;
Indicar como porta pública e privada o número “1926”;
Marcar o schedule como “always”;
Clicar na opção “apply”;
Neste ponto será incluída uma nova linha na lista apresentada logo abaixo. Do lado direito de cada
entrada desta lista existem dois pequenos ícones sendo que o da esquerda permite editar a configuração
feita e o da direita remove permanentemente a entrada.
Uma vez feita esta configuração, o roteador estará pronto para receber e redirecionar mensagens da
porta 1926 para o correto equipamento na rede local do Lugar A, ou o Equip_7A.
Completando finalmente o percurso da mensagem de solicitação de conexão que se originou no lugar B
pelo equipamento Equip_3B e com destino ao lugar A, Equip_7A, quando a mesma é recebida pelo
“Gateway” ela é imediatamente redirecionada com os seguintes dados:
IP origem:
IP destino:
189.60.110.19
10.1.1.7
Porta: ?? (alocada dinamicamente pelo sistema operacional)
Porta: 1926
Como podemos observar, a cópia do IFS que está sendo executado no local destino – ponta MASTER –
tem como saber, em ambos os casos de pedido de conexão aqui apresentados, de onde partiu a requisição:
No primeiro caso o IP origem é:
No segundo caso o IP origem é:
10.1.1.2
189.60.110.19
Essa ressalva deve ser feita porque o impressor valida a origem do pedido de conexão pelo endereço
origem. Ambos os endereços origem acima devem, portanto, estar especificados no arquivo de configuração
“ifs.inf” que a cópia MASTER ira ler em seu processo de iniciação.
È bem verdade que muitas vezes este endereço vem sob a forma de um nome. Para que este nome
seja devidamente convertido no endereço IP correto é usado um dos serviços de nomes ou DNS disponíveis
na rede mundial. Esta resolução de endereço pode, entretanto, ser feita também através de um arquivo de
nome “hosts” presente nos sistemas operacionais. Nestes casos teremos:
– o arquivo “hosts” do equipamento Equip_2A do Lugar A deve ter:
10.1.1.2
10.1.1.7
Equip_2A
Equip_7A
– o arquivo “hosts” do equipamento Equip_3B do Lugar B deve ter:
20.2.2.3
189.19.60.183
Equip_3B
Equip_7A
– o arquivo “hosts” do equipamento Equip_7A do Lugar A deve ter:
10.1.1.2
10.1.1.7
189.60.110.19
Equip_2A
Equip_7A
Equip_3B
Aqui também cabe uma observação adicional: o endereço indicado no arquivo “hosts” para
equipamentos encontrados na Internet deve ser o endereço de Internet do local onde estes equipamentos
estão e nunca endereços reais atribuídos a eles caso façam parte de uma rede local. Por isso, no “hosts” do
equipamento Equip_3B do Lugar B terá como endereço IP de qualquer equipamento que se encontre no
Lugar A o endereço do “Gateway” deste local. O mesmo raciocínio se aplica no sentido inverso para o arquivo
“hosts” do equipamento Equip_7A.
Finalmente, informações de identificação de IP e de porta de um arquivo comum de configuração aos
três componentes do IFS mostrados neste exemplo devem vir em branco, na forma:
[Equip_7A]
M_MODE
M_NAME
M_ADDR
M_PORT
:
[Equip_2A]
S_MODE
S_NAME
S_ADDR
:
[Equip_3B]
S_MODE
S_NAME
S_ADDR
:
Download