• André Munhoz em 28 de julho de 2009

Edição 46 - Arquivo MFD, Espelho MFD e Ato Cotepe 17/04 por COO e Data

Caro parceiro,

Se você está preparando sua aplicação para homologar o PAF-ECF, já deve ter se deparado com o “Requisito VII” do Roteiro de Análise Funcional, mais especificamente os itens 5 e 6, onde tratam da geração do espelho MFD por intervalo de COO e data, e geração do Ato Cotepe 17/04 com base no arquivo MFD também por intervalo de COO e data, respectivamente.

Reprodução dos itens 5 e 6:

ITEM 5: “Espelho MFD”, para gerar arquivo eletrônico da Memória de Fita Detalhe, no formato de “espelho” dos documentos nela contidos, com possibilidade de seleção por período de data e por intervalo de COO, devendo assiná-lo digitalmente inserindo ao final do arquivo uma linha com o registro tipo EAD…

ITEM 6: “Arq. MFD” para gerar arquivo eletrônico da Memória de Fita Detalhe conforme leiaute estabelecido no Ato COTEPE/ICMS 17/04 com possibilidade de seleção por período de data e por intervalo de COO, devendo assiná-lo digitalmente inserindo ao final do arquivo uma linha com o registro tipo EAD…

Então, o objetivo deste Flash Tip é orientá-lo a como atender estes dois itens, com dicas de programação usando nossa dll de alto-nível BemaFI32.dll, e também as BemaMFD.dll e BemaMFD2.dll na geração do Ato Cotepe 17/04.

Vamos lá!

- ITEM 5:

O espelho MFD nada mais é do que a imagem, na íntegra, dos cupons emitidos no ECF. Para atender este item, devemos usar simplesmente duas funções encontrada na BemaFI32.dll:

  1. Bematech_FI_DownloadMFD. Função que faz a captura da memória de fita-detalhe (MFD) da impressora e;
  2. Bematech_FI_FormatoDadosMFD. Função que formata a MFD para arquivo texto.

A função Bematech_FI_DownloadMFD possui os seguintes parâmetros:

par1: String com o caminho + nome do
arquivo de saída que será criado com o conteúdo da MFD da impressora. Exemplo: “C:\DOWNLOAD.MFD”.
par2: String com o tipo do download da MFD, onde:
“0″ (zero) para download total da MFD da impressora;
“1″ (um) para download por intervalo de data ou;
“2″ (dois) para download por intervalo de COO.
par3: String com a data inicial ou o COO inicial, no formato “DDMMAA” ou “DDMMAAAA” para a data, ou COO
com no máximo 6 dígitos (formato “999999″).
par4: String com a data final ou o COO final, no formato “DDMMAA” ou “DDMMAAAA” para a data, ou COO com no máximo 6 dígitos (formato “999999″).
par5: String com o número do usuário proprietário do ECF, no tamanho de 1 dígito.

Importante: Se o tipo do download for “Total”, não será necessário informar os parâmetros par3, par4 e par5. Neste caso, estes parâmetros são informados com string nula.

  • Em VB, temos esta função implementada assim:

iRetorno = Bematech_FI_DownloadMFD(”C:\DOWNLOAD.MFD”, “2″, “000500″, “001000″, “1″)

  • Em Delphi, temos esta função implementada assim:

cArquivo := ‘C:\DOWNLOAD.MFD’;
cTipoDownload := ‘2′;
cCOOInicial := ‘000500′;
cCOOFinal := ‘001000′;
cUsuario := ‘1′;

iRetorno := Bematech_FI_DownloadMFD( pchar( cArquivo ), pchar( cTipoDownload ), pchar( cCOOInicial ), pchar( cCOOFinal ), pchar( cUsuario ) );

Neste exemplo, estamos fazendo um download da MFD da impressora por intervalo de COO do “000500″ ao “001000″ e para o usuário “1″.

A função Bematech_FI_FormatoDadosMFD possui os seguintes parâmetros:

par1: String com o caminho + nome do arquivo de origem contendo o download da MFD da impressora. Exemplo: “C:\DOWNLOAD.MFD”.
par2: String com o caminho + nome do arquivo de saída que será criado com o conteúdo convertido da MFD
da impressora. Exemplo: “C:\ESPELHO.TXT”.
par3: String com o tipo do formato de conversão da MFD, onde:
“0″ (zero) para formato .TXT (é criado um arquivo TXT com a imagem dos cupons referentes ao movimento);
“1″ (um) para formato .RTF (é criado um arquivo RTF com a imagem dos cupons referentes ao movimento) ou;
“2″ (dois) para formato .MDB (é criado um arquivo MDB com tabelas referentes ao movimento)
par4: String com o tipo do download da MFD, onde:
“0″ (zero) para download total da MFD da impressora;
“1″ (um) para download por intervalo de data ou;
“2″ (dois) para download por intervalo de COO.
par5: String com a data inicial ou o COO inicial, no formato “DDMMAA” ou “DDMMAAAA” para a data, ou COO
com no máximo 6 dígitos (formato “999999″).
par6: String com a data final ou o COO final, no formato “DDMMAA” ou “DDMMAAAA” para a data, ou COO com no máximo 6 dígitos (formato “999999″).
par7: String com o número do usuário proprietário do ECF, no tamanho de 1 dígito.

Importante: Se o tipo do download for “Total”, não será necessário informar os parâmetros par5, par6 e par7. Neste caso, estes parâmetros são informados com string nula.

  • Em VB, temos esta função implementada assim:

iRetorno = Bematech_FI_FormatoDadosMFD(”C:\DOWNLOAD.MFD”, “C:\ESPELHO.TXT”, “0″, “2″, “000500″, “001000″, “1″)

  • Em Delphi, temos esta função implementada assim:

cArquivoOrigem := ‘C:\DOWNLOAD.MFD’;
cArquivoDestino := ‘C:\ESPELHO.TXT’;
cTipoFormato := ‘0′;
cTipoDownload := ‘2′;
cCOOInicial := ‘000500′;
cCOOFinal := ‘001000′;
cUsuario := ‘1′;

iRetorno := Bematech_FI_FormatoDadosMFD( pchar( cArquivoOrigem ), pchar( cArquivoDestino ), pchar( cTipoFormato ), pchar( cTipoDownload ), pchar( cCOOInicial ), pchar( cCOOFinal ), pchar( cUsuario ) );

Neste exemplo, estamos gerando um espelho em texto da MFD da impressora por intervalo de COO do “000500″ ao “001000″ e para o usuário “1″.

Assim, atendemos o item 5 do requisito VII do PAF-ECF.

- ITEM 6:

Este item pede para gerar o arquivo de download da MFD no formato do Ato Cotepe 17/04, o mesmo exigido para a Nota Fiscal Paulista, porém assinado (registro EAD). Para isso, precisamos também de apenas duas funções:

  1. Bematech_FI_DownloadMFD (função já vista anteriormente). Usaremos esta função para fazer a captura da MFD da impressora, pois iremos passar no primeiro parâmetro da função abaixo, o arquivo .mfd previamente gerado e;
  2. BemaGeraRegistrosTipoE. Função encontrada na BemaMFD.dll e BemaMFD2.dll para geração dos registros tipo E pertencentes ao layout do Ato Cotepe 17/04.

A função BemaGeraRegistrosTipoE possui os seguintes parâmetros:

par1: String com o caminho + nome do arquivo de origem contendo o download da MFD da impressora. Exemplo: “C:\DOWNLOAD.MFD”.
par2: String com o caminho + nome do arquivo de saída que será criado com o conteúdo convertido da MFD
da impressora. Exemplo: “C:\COTEPE1704.TXT”.
par3: String com a data inicial, no formato “DDMMAAAA”.
par4: String com a data final, no formato “DDMMAAAA”.
par5: String com a razão social do estabelecimento proprietário do ECF.
par6: String com o endereço do estabelecimento proprietário do ECF.
par7: String nula.
par8: String com o comando de geração dos registros, fixo em “2″.
par9: String nula.
par10: String nula.
par11: String nula.
par12: String nula.
par13: String nula.
par14: String nula.
par15: String nula.
par16: String nula.
par17: String nula.
par18: String nula.
par19: String nula.
par20: String nula.
par21: String nula.
  • Em VB, temos esta função implementada assim:

cArqMFD = “C:\DOWNLOAD.MFD”
cArqTXT = “C:\COTEPE1704.TXT”
cRazao = “Bematech S/A”
cEndereco = “Rua ABCDEF, 1234″
cCMD = “2″
cDataIni = “01062009″ ‘ DDMMAAAA
cDataFim = “30062009″ ‘ DDMMAAAA

iRetorno = BemaGeraRegistrosTipoE(cArqMFD, cArqTXT, cDataIni, cDataFim, cRazao, cEndereco, “”, cCMD, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”, “”)

  • Em Delphi, temos esta função implementada assim:

cArqMFD := ‘C:\DOWNLOAD.MFD’;
cArqTXT := ‘C:\COTEPE1704.TXT’;
cRazao := ‘Bematech S/A’;
cEndereco := ‘Rua ABCDEF, 1234′;
cCMD := ‘2′;
cDataIni := 01062009; // DDMMAAAA
cDataFim := 30062009; // DDMMAAAA

iRetorno := BemaGeraRegistrosTipoE(pchar(cArqMFD), pchar(cArqTXT), pchar(cDataIni), pchar(cDataFim), pchar(cRazao), pchar(cEndereco), ”, pchar(cCMD), ”, ”, ”, ”, ”, ”, ”, ”, ”, ”, ”, ”, ”);

Importante:

  • Para os modelos de impressoras fiscais MP-2000 TH FI e MP-6000 TH FI, a função BemaGeraRegistrosTipoE deve ser chamada da BemaMFD.dll.
  • Para os modelos de impressoras fiscais MP-2100 TH FI, MP-3000 TH FI, MP-4000 TH FI, MP-6100 TH FI e MP-7000 TH FI, a função BemaGeraRegistrosTipoE deve ser chamada da BemaMFD2.dll.

No exemplo acima, temos a geração do Ato Cotepe 17/04 por intervalo de datas. Podemos também realizar esta geração por intervalo de COOs. Para isso, temos dois exemplos prontos disponíveis para baixar através dos links:

- em VB: http://www.bematech.com.br/suporte/downloads/fisc_win/RegistrosTipoE_VB.zip

- em Delphi: http://www.bematech.com.br/suporte/downloads/fisc_win/RegistrosTipoE_Delphi.zip

Assim, atendemos o item 6 do requisito VII do PAF-ECF.

Além disso, não podemos esquecer que tanto o arquivo contendo o espelho da MFD quanto o arquivo do Ato Cotepe 17/04 devem ser assinados (registro EAD). Sendo assim, podemos usar facilmente a sign_bema.dll.

Maiores detalhes sobre estas funções, podemos consultar no help on-line da BemaFI32.dll, disponível na WEB.

Boas implementações!

  • André Munhoz em 7 de julho de 2009

Edição 45 - Acessando periféricos

Caro parceiro,

Na edição 44 de nosso Flash Tip, criamos um exemplo simples que nos possibilitou realizar uma interação entre usuário e microterminal. Na ocasião, usamos o switch/case para montagem do menu de opções e a função readkey() que permitiu a captura do teclado.

Nesta edição, iremos utilizar o microterminal no acesso a periféricos. Vamos usar as bibliotecas <NFPrint.h> para acessar a impressora não fiscal e <CDisplay.h> para acessar o display do cliente (Customar Display).

Lembrando que estamos dando continuidade ao desenvolvimento para o microterminal FIT Integra. Caso tenha perdido alguma edição anterior do Flash Tip, basta consultá-la em nosso Bemacast a partir do link:

http://partners.bematech.com.br/bemacast/flashtip/

Então, vamos lá!

Configurações iniciais

Antes de iniciarmos nosso exemplo de acesso aos periféricos, devemos inserir em nosso projeto a biblioteca <NFPrint.h> responsável pelas funções de operação com a impressora não fiscal. Então, incluímos no início do nosso projeto, junto com a lista de includes, a linha “#include <NFPrint.h>“.

Além disso, também necessitamos inserir a biblioteca nas propriedades de nosso projeto, então, basta clicarmos com o botão direito em cima de nosso projeto “BemaFit” e irmos em propriedades, conforme mostra ilustração:

fig_prop

Após entrarmos nas propriedades do projeto, temos a janela abaixo dividida em três colunas. Na primeira coluna, selecionamos a opção C/C++ Build. Na coluna do meio, clicamos duas vezes sobre a opção Libraries e, em seguida, em Add (ícone representado pelo sinal de +).

Será exibida uma nova janela para inserção da biblioteca “NFPrint“.

Simplesmente, informamos o nome da biblioteca, conforme ilustrado, e pressionamos OK nas janelas para confirmar as alterações.

fig_lib

Também iremos utilizar o display do cliente (Customer Display) em nosso exemplo, então precisamos inserir a biblioteca CDisplay em nosso projeto, porém para inserção desta biblioteca não será necessário seguir os mesmos passos descritos acima, basta a incluirmos no início do projeto usando um include, pois esta biblioteca já está presente na lista de bibliotecas do projeto.

FiguraProjeto

Após as configurações, basta simplesmente copiarmos e colarmos o código abaixo em nosso projeto.

#include <allegro.h>
#include <UDisplay.h>
#include <stdio.h>
#include <CDisplay.h>
#include <NFPrint.h>

int main(void)
{
  char ch;

  /* instrução necessario para inicializar o a biblioteca allegro */
  if (allegro_init() != 0)
    return 1;

  do
  {
    /* Instala o teclado */
    install_keyboard();

    char buff[256];

    // Inicializar o display do usuario
    UserDisplayInit();

    // Limpa o display do usario 
    UserDisplayClearAll();

    if (keypressed())
      readkey(); // Flush

    // Monta menu no display do usuario
    UserDisplayPrint(1, 1, “1 - Impressao COM1″);
    UserDisplayPrint(2, 1, “2 - Impressao display”);
    UserDisplayPrint(3, 1, “Opcao:”);

    memset(buff, 0, 256);
    ch = readkey();

    switch (ch)
    {
      case ‘1′:
      {
        int j;

        // String utilizada para receber texto com tamanho de buffer 49
        char bufferImp[49];

        // Tipo de corte, para guilhotina - Parcial
        papperCut_t ncut = CUT_PARTIAL;

        // baud rate
        rs232Baudrate_t baud = RS232_BAUD_9600;

        // Configura a impressora para estabelecer comunicação.
        // - logicalPort = SERIAL1;
        // - baudRate = baud;
        // - lineFeeds = 3;
        // - cutType = CUT_PARTIAL.
        NFPrinterConfg(”SERIAL1″, baud, 3, ncut);

        // inicializa impressora.
        // Nota: A configuração da impressora deve ser efetuada antes da execução
        // das funções abaixo.
        NFPrinterInit();

        j = 0;

        // Variável que irá checar o resultado da execução da função.
        int result = BS_SUCCESS;

        // Laço para realizar impressão
        while (j < 40)
        {
          // Imprime a string armazenada em bufferImp, na qual o 
          // tamanho foi definido em srtlen(bufferImp)

          sprintf(bufferImp, “%02d %s %02d\r\n”, j, “Teste de impressao FIT integra”, result);
          result = NFPrinterPrint(bufferImp, strlen(bufferImp));
          for (int i = 100; result != BS_SUCCESS && i >= 0; i–) 
          {
            usleep(100000);
            result = NFPrinterPrint(bufferImp, strlen(bufferImp));
          }
          j++;
        }
        j = 0;

        // Avanço de 4 linha
        NFPrinterLineFeed(4);

        // Acionamento parcial da Guilhotina
        NFPrinterCutPper(ncut);

        // Finaliza mode impressão
        NFPrinterStop();

        UserDisplayClearAll();
        UserDisplayPrint(2, 1,(result != BS_SUCCESS) ? “Erro na ultima impressao” :
“Verifique impressao”);

        // Fim impressao nao fiscal 
        readkey();
      }
      break;
      case ‘2′:
      { 
        // Configura o display na serial 2(port = SERIAL2, e o tipo do
        // display = CD_LD220)

        CustomerDisplayConfig(”SERIAL2″, CD_LD220);

        // inicializa o display do cliente
        CustomerDisplayInit();

        // Limpa display do usuário
        // NOTA: O display do usuário deve ser previamente inicializado
        // CustomerDisplayClear();
        // Define como o texto será apresentado no display.
        CustomerDisplaysetStatus(BLINKING);

        // Emite o texto 
        // - “Teste linha 1!” será apresentado na primeira linha” the first line of
        // the Customer Display
        CustomerDisplayprint(0, “Teste linha 1!”);

        // Emite o texto 
        // - “Teste linha 2!” será apresentado na primeira linha” 
        CustomerDisplayprint(1, “Teste linha 2!”);
      }
      UserDisplayClearAll();
      UserDisplayPrint(2, 1, “Verifique Display!”);
      readkey();
      break;
      default:
        UserDisplayClearAll();
        UserDisplayPrint(2, 1, “Programa encerrado!”);
        readkey();
        return EXIT_SUCCESS;
      break;
    }

    /* wait for a key press */
    readkey();
  }
  while (ch != ‘9′);
}

Depois de compilado, ao executarmos será exibido o seguinte menu no display do microterminal:

1 - Impressão COM1
2 - Impressão display
Opção:

Obs: Para que possamos ver na prática as funcionalidades de nosso exemplo, é necessário conectarmos na porta COM1 do microterminal 1 impressora não fiscal, e na porta COM2 conectarmos 1 display do cliente.

Caso a escolha no menu seja 1, automaticamente a ação tomada será a impressão do seguinte texto na bobina da impressora.

00 Teste de impressão FIT Integra 00
01 Teste de impressão FIT Integra 00
02 Teste de impressão FIT Integra 00
03 Teste de impressão FIT Integra 00
04 Teste de impressão FIT Integra 00
05 Teste de impressão FIT Integra 00
06 Teste de impressão FIT Integra 00
07 Teste de impressão FIT Integra 00
08 Teste de impressão FIT Integra 00
09 Teste de impressão FIT Integra 00

Caso a escolha no menu seja 2, simplesmente será exibida no display do cliente a seguinte mensagem:

Teste linha 1!
Teste linha 2!

 


Assim, temos um pequeno exemplo demonstrando o uso das funções das bibliotecas NFPrint e CDisplay de nosso FT Developer KIT para o microterminal FIT Integra.

Próxima edição:

Na próxima edição, vamos implementar o leitor de código de barras e acessar o microterminal remotamente.