Edição 50 - Arquivo MFD e Espelho MFD - Novas funções

Caro parceiro,

Dando continuidade à série de Flashtips sobre o tema “Explorando a MFD nas impressoras fiscais Bematech“, nesta edição iremos abordar dois assuntos muito importantes para quem está preparando a aplicação para as homologações do PAF-ECF - a geração do Arquivo MFD e do Espelho MFD.

Para recordarmos, o Arquivo e o Espelho MFD fazem parte do “Requisito VII” do Roteiro de Análise Funcional, mais especificamente os itens 5 e 6, e estão presentes no Menu Fiscal do PAF:

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, iremos conhecer como implementar estas duas funcionalidades, através das novas funções da BemaFI32.dll, completas e incluindo a assinatura EAD.

Vamos lá!

 

Espelho MFD

O arquivo no formato de espelho da MFD, ou seja, a reprodução na íntegra dos documentos emitidos pelo ECF, é um dos itens exigidos no PAF. Este arquivo é gerado a partir de uma única função “Bematech_FI_EspelhoMFD“.

  • Declaração em VB

Public Declare Function Bematech_FI_EspelhoMFD Lib “BEMAFI32.DLL” ( ByVal cNomeArquivoDestino As String, ByVal cDadoInicial As String, ByVal cDadoFinal As String, ByVal cTipoDownload As String, ByVal cUsuario As String, ByVal cChavePublica As String, ByVal cChavePrivada As String ) As Integer

  • Declaração em Delphi

function Bematech_FI_EspelhoMFD( cNomeArquivoDestino: String; cDadoInicial: String; cDadoFinal: String; cTipoDownload: String; cUsuario: String; cChavePublica: String; cChavePrivada: String ): Integer; StdCall; External ‘BEMAFI32.DLL’;

  • Exemplo em VB

iRetorno = Bematech_FI_EspelhoMFD(”C:\TESTE.TXT”, _
“000100″, _
“000200″, _
“C”, _
“1″, _
“A499F300F731F6892F44B83A5DD9D97CFFFD0ABE96E29B4B4B4E
B2F9E5BCFFCF0A52EAFDF05779F90B3A199BE5776B13373CB2E7
1D8AB67F4080CE27B226FFF032B6A7182C90C935EF2F4D343A74
3B60307EE4961F0C5EB02B1CEEF48D647C02E9BE164DC404B833
F80C5B4268C04039547E7D5E242537B02360674B569208BD”, _
“D19598300478932ACFFE16CB6903552F15FDBD2D3B9659FAD79C
3603C07B875919E9D8B28919B8F4C20C6AE23268A636D1206F5E
6BC79D89B6152804B15A9781C90E0A2D5064FB5B7CC01048AD8C
66768F76D71647E7D39F8EDD714044CEA68F2A40106849132B01
D14DDEB3FBA6FC1A9FBE9EA71BAB9293707A4EAD29CB6F3D”)

  • Exemplo em Delphi

cArquivo := ‘C:\TESTE.TXT’;
cDataInicial := ‘000100′;
cDataFinal := ‘000200′;
cTipo := ‘C’;
cUsuario := ‘1′;
cChavePublica := ‘A499F300F731F6892F44B83A5DD9D97CFFFD0ABE96E29B4B4B4E
B2F9E5BCFFCF0A52EAFDF05779F90B3A199BE5776B13373CB2E7
1D8AB67F4080CE27B226FFF032B6A7182C90C935EF2F4D343A74
3B60307EE4961F0C5EB02B1CEEF48D647C02E9BE164DC404B833
F80C5B4268C04039547E7D5E242537B02360674B569208BD’;
cChavePrivada := ‘D19598300478932ACFFE16CB6903552F15FDBD2D3B9659FAD79C
3603C07B875919E9D8B28919B8F4C20C6AE23268A636D1206F5E
6BC79D89B6152804B15A9781C90E0A2D5064FB5B7CC01048AD8C
66768F76D71647E7D39F8EDD714044CEA68F2A40106849132B01
D14DDEB3FBA6FC1A9FBE9EA71BAB9293707A4EAD29CB6F3D’;

iRetorno := Bematech_FI_EspelhoMFD( pchar( cArquivo ), pchar( cDataInicial ), pchar( cDataFinal ), pchar( cTipo ), pchar( cUsuario ), pchar( cChavePublica ), pchar( cChavePrivada ) );

No exemplo acima, estamos gerando o espelho MFD dos cupons (COOs) “100″ ao “200″. A função irá realizar um download da MFD compreendido entre estes cupons e gerar o “TESTE.TXT” em “C:\”, conforme informado, trazendo o espelho automaticamente.

Vamos detalhar os parâmetros desta função:

NomeArquivo: STRING com o path + nome do arquivo txt a ser gerado, com o tamanho de até 512 caracteres.
DadoInicial: STRING com a data inicial no formato DD/MM/AAAA ou COO no formato “999999″.
DadoFinal: STRING com a data final no formato DD/MM/AAAA ou COO no formato “999999″.
TipoDownload: STRING indicando o tipo de download, onde:
“D”: download por data.
“C”: download por COO.
Usuario: STRING contendo a identificação do usuário, com o tamanho de até 1 caracter.
ChavePublica: STRING com a chave pública para assinatura do arquivo, com 256 caracteres.
ChavePrivada: STRING com a chave privada para assinatura do arquivo, com 256 caracteres.

Repare também que informamos as chaves pública e privada para que a função já assine o arquivo texto gerado (registro EAD). Estas chaves podem ser criadas pela função genkkey da sign_bema.dll, conforme já apresentado na edição 43 de nosso Flashtip.

Vale a dica: As chaves pública e privada são geradas apenas uma única vez e é exclusiva de software-house para software-house, independente de cliente, modelo e marca de ECF. Então, gere uma única vez estas chaves e use-as para assinar todos os arquivos necessários para o PAF-ECF. A sign_bema.dll pode ser utilizada para qualquer marca de ECF, pois a geração das chaves e a assinatura do arquivo são diretas através de funções, ou seja, não é necessário estar conectado ao ECF para assinar o arquivo.

 

Arquivo MFD

Sendo um dos itens presentes no Menu Fiscal, o Arquivo MFD possui como layout o “Ato Cotepe 17/04″, que é gerado também através de uma única função - a “Bematech_FI_ArquivoMFD“.

A função realiza o download da MFD do período informado e gera o arquivo no layout, assinando-o automaticamente.

  • Declaração em VB

Public Declare Function Bematech_FI_ArquivoMFD Lib “BEMAFI32.DLL” ( ByVal cNomeArquivoOrigem As String, ByVal cDadoInicial As String, ByVal cDadoFinal As String, ByVal cTipoDownload As String, ByVal cUsuario As String, ByVal iTipoGeracao As Integer, ByVal cChavePublica As String, ByVal cChavePrivada As String, ByVal iUnicoArquivo As Integer ) As Integer

  • Declaração em Delphi

function Bematech_FI_ArquivoMFD( cNomeArquivoOrigem: String; cDadoInicial: String; cDadoFinal: String; cTipoDownload: String; cUsuario: String; iTipoGeracao: integer; cChavePublica: String; cChavePrivada: String; iUnicoArquivo: integer ): Integer; StdCall; External’BEMAFI32.DLL’;

  • Exemplo em VB

iRetorno = Bematech_FI_ArquivoMFD(”", _
“01/08/2009″, _
“31/08/2009″, _
“D”, _
“01″, _
2, _
“A499F300F731F6892F44B83A5DD9D97CFFFD0ABE96E29B4B4B4E
B2F9E5BCFFCF0A52EAFDF05779F90B3A199BE5776B13373CB2E7
1D8AB67F4080CE27B226FFF032B6A7182C90C935EF2F4D343A74
3B60307EE4961F0C5EB02B1CEEF48D647C02E9BE164DC404B833
F80C5B4268C04039547E7D5E242537B02360674B569208BD”, _
“D19598300478932ACFFE16CB6903552F15FDBD2D3B9659FAD79C
3603C07B875919E9D8B28919B8F4C20C6AE23268A636D1206F5E
6BC79D89B6152804B15A9781C90E0A2D5064FB5B7CC01048AD8C
66768F76D71647E7D39F8EDD714044CEA68F2A40106849132B01
D14DDEB3FBA6FC1A9FBE9EA71BAB9293707A4EAD29CB6F3D”, _
1)

  • Exemplo em Delphi

cTipoDownload := ‘D’;
cUsuario := ‘01′;
iTipoGeracao := 2;
cDadoInicial := ‘01/08/2009′;
cDadoFinal := ‘31/08/2009′;
cChavePublica := ‘A499F300F731F6892F44B83A5DD9D97CFFFD0ABE96E29B4B4B4E
B2F9E5BCFFCF0A52EAFDF05779F90B3A199BE5776B13373CB2E7
1D8AB67F4080CE27B226FFF032B6A7182C90C935EF2F4D343A74
3B60307EE4961F0C5EB02B1CEEF48D647C02E9BE164DC404B833
F80C5B4268C04039547E7D5E242537B02360674B569208BD’;
cChavePrivada := ‘D19598300478932ACFFE16CB6903552F15FDBD2D3B9659FAD79C
3603C07B875919E9D8B28919B8F4C20C6AE23268A636D1206F5E
6BC79D89B6152804B15A9781C90E0A2D5064FB5B7CC01048AD8C
66768F76D71647E7D39F8EDD714044CEA68F2A40106849132B01
D14DDEB3FBA6FC1A9FBE9EA71BAB9293707A4EAD29CB6F3D’;
iUnicoArquivo := 1;

iRetorno := Bematech_FI_ArquivoMFD( pchar( ” ), pchar( cDadoInicial ), pchar( cDadoFinal ), pchar( cTipoDownload ), pchar( cUsuario ), iTipoGeracao, pchar( cChavePublica ), pchar( cChavePrivada ), iUnicoArquivo );

Neste exemplo, pedimos para a função gerar o arquivo a partir da memória da impressora e por intervalo de datas, entre 01/08/2009 a 31/08/2009.

Vamos detalhar os parâmetros desta função:

ArquivoOrigem: STRING com o path + nome do arquivo de origem, com o tamanho de até 512 caracteres, podendo ser NULL caso o parâmetro seja usado como opcional, sendo assim a dll usará como base a MFD da impressora.
DadoInicial: STRING com o dado inicial para o download da MFD. Para data no formato “DD/MM/AAAA” e para COO no formato “999999″.
DadoFinal: STRING com o dado final para o download da MFD. Para data no formato “DD/MM/AAAA” e para COO no formato “999999″.
TipoDownload: STRING indicando o tipo de download, onde: “D” é por Data e “C” é por COO.
Usuario: STRING com o número do usuário, com até 2 caracteres.
TipoGeracao:

INTEGER indicando a parametrização a ser feita no arquivo, onde:
0 = MF
1 = MFD
2 = TDM
3 = RZ
4 = RFD

ChavePublica: STRING com a chave pública para assinatura do arquivo, com 256 caracteres.
ChavePrivada: STRING com a chave privada para assinatura do arquivo, com 256 caracteres.
UnicoArquivo:

INTEGER indicando se a geração do Arquivo MFD por intervalo de data, ficará em um único arquivo ou em múltiplos arquivos (arquivos diários), onde:
1 = único arquivo
0 = múltiplos arquivos

Repare no exemplo que o formato do arquivo será TDM que corresponde aos dados da MF (Memória Fiscal) e também da MFD (Memória de Fita-detalhe) da impressora. Além disso, temos as chaves pública e privada previamente criadas.

Vimos como é simples implementar estas duas funcionalidades para o PAF-ECF.

Esperamos que este Flashtip tenha sido útil para o seu entendimento e para a integração destas funções em seu aplicativo PAF, e qualquer dúvida que surgir, estamos a disposição para esclarecê-la. Contate-nos pelo:

Comente você também

(*) Campos de preenchimento obrigatório.