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 :