Seguiremos estudando cada registro individualmente, de acordo com o layout geral proposto no artigo sobre o Registro 10. Sendo assim, o próximo registro a ser estudado é o Registro 54 que contém informações de cada um dos itens contidos nas notas informadas no registro 50 e é um dos registros mais comuns de serem gerados em um registro do Sintegra.
O Registro 54 é muito comum pois toda vez que um registro 50 é gerado deve ser
gerado pelo menos 1 (um) registro 54 relacionado.
O Registro 54
O Registro 54 é relativo a cada um dos itens contidos nas notas informadas no
registro 50.
Diferentemente dos registros 10 e 11, cada arquivo magnético pode conter mais de
1 (um) Registro 54, um para cada item de cada nota fiscal de entrada e saída da
empresa. Sua formatação deve ser feita de acordo com a Tabela 01.

Tabela 01: Formato do Registro 54 conforme convênio do
Sintegra
O Registro 54 e o seu Sistema Gerencial
Até agora abordamos o Registro 54 apenas do ponto de vista teórico, conforme
apresentado na documentação oficial dos convênios que regulamentam o Sintegra.
Mas como implementar tudo isso na prática? O que o Registro 54 representa para o
meu aplicativo gerencial?
Tipicamente para armazenar as informações das operações de entrada e saída de
notas fiscais em um sistema gerencial, utiliza-se um sistema de tabela
Master-Detail.
A tabela Master (daqui por diante referenciada como tabela de “NOTAS_FISCAIS”)
armazena as informações totalizadas das notas fiscais, como valor total dos
produtos, bases de cálculo de ICMS, CFOP, CNPJ do fornecedor/destinatário e etc.
A tabela Detail (daqui por diante referenciada como tabela de “ITEM_NOTA_FISCAL”)
armazena as informações relativas a cada item constante das notas fiscais, como
código de produto, quantidade, preço, alíquota, sub-total e etc.
Sendo assim, as informações relativas ao Registro 54 estão presentes na tabela
de ITEM_NOTA_FISCAL, ou seja, na tabela onde estão armazenadas as informações de
cada item das notas fiscais das operações de entrada e saída de notas fiscais.
Para fazer o cadastro das informações no sistema, deve-se então criar telas de
cadastro de entrada e saída de nota fiscal, como mostrados na Figura 01, 02, 03
e 04 respectivamente.

Figura 01: Tela de Entrada de Nota Fiscal no sistema
gerencial Tk-ERP

Figura 02: Tela de Entrada de Nota Fiscal no sistema
gerencial Tk-ERP

Figura 03: Tela de Saída de Nota Fiscal no sistema
gerencial Tk-ERP

Figura 04: Tela de Saída de Nota Fiscal no sistema
gerencial Tk-ERP
As telas criadas devem permitir o cadastro de todas as informações
necessárias ao Sintegra. No entanto, antes de serem gravadas no banco de dados,
tais informações devem ser previamente validadas, de forma a evitar problemas
futuros.
Em um próximo artigo abordaremos em detalhes a validação de campos específicos
do Sintegra como o CNPJ, Inscrição Estadual dentre outros.
A seguir estão listados os principais campos referentes ao Registro 54 que devem
ser validados no momento do cadastro. São eles:
1. CNPJ do Destinatário/Fornecedor – Deve conter um valor de CNPJ/CPF
válido calculado conforme algoritmo próprio de validação. Caso o
destinatário/fornecedor seja isento do CNPJ o campo deve ser preenchido com o
CPF. Caso se trate de operação com o exterior, o campo não deve ser preenchido.
2. CFOP – O valor do campo de Código Fiscal de Operação e Prestação
obedece a uma lógica que envolve as informações de Unidade da Federação da
tabela de INFORMANTE (abordada no artigo 06. O Registro10, Registro Mestre do
Estabelecimento) e a UF do destinatário/fornecedor a que a nota se refere. Caso
o informante e o destinatário/fornecedor sejam da mesma UF, os CFOPs válidos
para entrada iniciam-se em 1 e para saída, em 5. Caso o informante e o
destinatário/fornecedor sejam de UF distintas, os CFOPs válidos para entrada
iniciam-se em 2 e para saída, em 6. Caso se trate de operação com o exterior, os
CFOPs válidos para entrada iniciam-se em 3 e para saída, em 7.
3. CST - Código da Situação Tributária deve conter um valor válido
conforme a tabela de valores válidos
Além do cadastro básico dos campos conforme a tabela contida no convênio, o
registro 54 possui uma particularidade. No caso de notas fiscais com frete,
seguro, pis/cofins, complemento de nota fiscal e/ou icms, serviços não
tributados e despesas acessórias, devem-se gerar 1 (um) registro 54 para cada um
destes valores indicando no campo número do item (campo 08) conforme a Tabela
02.
| Valor do campo 08 |
Identificação |
| 001 a 990 |
número seqüencial do produto ou serviço |
| 991 |
identifica o registro do frete |
| 992 |
identifica o registro do seguro |
| 993 |
PIS/COFINS |
| 997 |
complemento de valor de Nota Fiscal e/ou ICMS |
| 998 |
serviços não tributados |
| 999 |
identifica o registro de outras despesas acessórias |
Tabela 02: Formato dos campos “especiais” do Registro 54
conforme convênio do Sintegra
A solução que encontramos para contornar tal particularidade foi na estrutura
da tabela Master de “NOTA_FISCAL” utilizada para armazenar as informações
relativas ao Registro 50 adicionar um campo para cada um dos valores contidos na
Tabela 02, bem como adicionar os campos respectivos na tela de entrada e saída
de notas fiscais conforme mostrado nas Figuras 05 e 06.

Figura 05: Tela de Entrada de Nota Fiscal no sistema
gerencial Tk-ERP

Figura 06: Tela de Saída de Nota Fiscal no sistema
gerencial Tk-ERP
O Registro 54 e o Banco de Dados
Segue abaixo uma proposta de estrutura da tabela de “ITEM_NOTA_FISCAL” e
“NOTA_FISCAL” para armazenar as informações relativas ao Registro 54 e alteradas
através da tela de Cadastro de Entrada de Nota Fiscal e Cadastro de Saída de
Nota Fiscal mostradas nas Figura 01, 02, 03, 04, 05 e 06 respectivamente.
É muito importante que no momento do cadastro das informações do Registro 54,
seja feita a validação dos campos citados, antes que os mesmos sejam salvos
definitivamente no banco de dados. Caso contrário, poderão surgir erros durante
a geração ou validação do arquivo magnético.

Listagem 01: Proposta de estrutura da tabela de
“NOTA_FISCAL” para armazenar as informações relativas ao Registro 54.

Listagem 02: Proposta de estrutura da tabela de
“ITENS_NOTA_FISCAL” para armazenar as informações relativas ao Registro 54.
Algumas observações a respeito da estrutura proposta na Listagem 01 incluem:
• Os campos com abreviação “_DF” dizem respeito ao destinatário/fornecedor.
• Os campos com abreviação “_ER” dizem respeito a emissão/recebimento.
• A escolha dos tamanhos de cada campo não deve levar em conta apenas o valor
presente na tabela do Sintegra, pois alguns campos podem conter máscaras de
formatação e caso as informações sejam armazenadas com a sua máscara de
formatação serão necessários espaços extras, a exemplo do campo de CNPJ que
costuma ser armazenado com pontos, barras e traços.
• O campo “tipo” apesar de não estar presente na tabela do registro 50, deve ser
adicionado de forma facilitar o uso de uma única tabela para armazenar registros
de entrada e saída. Seu valor deve ser de “E” para entrada e “S” para saídas, ou
algo equivalente.
O Registro 54 e a Sintegra32dll.dll
A declaração da função Registro 54 na Sintegra32dll.dll é mostrada abaixo:
Function Registro54(CNPJ, Modelo, Serie, Nro, CFOP, CST,
Nro_Item, Cod_Produto_Servico, Quantidade, Valor_Produto, Valor_Desconto,
Base_ICMS, Base_ICMS_S_Trib, Valor_IPI, Aliquota_ICMS: ShortString): ShortString;
stdcall; export;
Na declaração mostrada acima vemos que a função Registro 54 da Sintegra32dll.dll
contém uma variável do tipo ShortString para cada campo do Registro 54 mostrado
na Tabela 01.
A função mostrada tem retorno do tipo ShortString, que pode assumir dois tipos
de valores: valores em caso de haver erro nos parâmetros de entrada, e valores
em caso de não haver erro nos parâmetros de entrada.
Valores de retorno da função em caso de erro:
• '-1 CNPJ ou CPF Inválido :: ' + CNPJ
• '-2 Código de Modelo de Documento Fiscal Inválido :: ' + Modelo
• '-3 Número da Nota Fiscal Inválido :: ' + Nro
• '-4 Número de Ordem do Item na Nota Fiscal Inválido :: ' + Nro_Item
• '-5 CST Inválido (Código da Situação Tributária) :: ' + CST
• '-5 CST Inválido (Código da Situação Tributária) :: ' + CST
• '-6 Código Fiscal de Operações e Prestações (CFOP) Inválido :: ' + CFOP;
Caso não haja erro nos parâmetros de entrada da função, o retorno será uma
variável do tipo ShortString contendo o Registro 50 devidamente formatado
conforme o padrão da Tabela 01 exemplificado abaixo:
‘54’ + CNPJ + Modelo + Serie + Nro + CFOP + CST +
Nro_Item + Cod_Produto_Servico + Quantidade + Valor_Produto + Valor_Desconto +
Base_ICMS + Base_ICMS_S_Trib + Valor_IPI + Aliquota_ICMS;
Gerando o Registro 54 com a Sintegra32dll.dll
Como já foi visto, o processo de geração dos registros em geral passa por
basicamente 3 etapas, que são descritas a seguir:
Primeiramente devemos selecionar do banco de dados somente os registros que
serão utilizados para a geração do registro. Neste caso devem ser selecionados
os registros da tabela de NOTA_FISCAL, que tiverem o valor do campo Data_ER
dentro do período solicitado pelo usuário e consequentemente os itens relativos
a cada um destes registros através de uma relação máster-detail.
Além disso, só devem ser selecionados os registros que tiverem os código de
modelo conforme os modelos possíveis de serem adicionados ao Registro 50,
conforme descrito em detalhe no artigo “04. Definindo por onde começar”.
Por fim os registros devem ser ordenados pelo campo DATA_ER, CNPJ_DF, SERIE, NUM
e NUM_ITEM conforme a lógica de ordenação “inter-registros” descrita em detalhes
no artigo “05. Estrutura do Arquivo Magnético”.

Listagem 02: Query de seleção de registros da tabela de
“NOTA_FISCAL” e “ITENS_ NOTA_FISCAL” para geração Registro 54.
Em segundo lugar, deve ser feito o loop nos resultados retornados pela
execução da Query da Listagem 02 passando os parâmetros para a Sintegra32dll.dll,
informando para cada parâmetro, o campo respectivo do banco de dados, como
mostrado abaixo.
VERIFICAR CAMPOS COM A DECLARAÇÃO DA TABELA

Listagem 03: Loop para chamada da função Registro50 da
Sintegra32dll.dll passando registros retornados pela Query de seleção da
Listagem 02.
E finalmente, após a passagem dos parâmetros, devemos testar o retorno da
sintegra32dll.dll para saber se a geração do registro transcorreu normalmente ou
se houve algum erro, como mostrado na Listagem 04.
Em caso de erro, apresentamos na tela o erro e todas as informações passadas
para a sintegra32dll.dll como parâmetros. Caso contrário, procede-se o
salvamento do retorno formatado do Registro 50 no arquivo magnético de destino.

Listagem 04: Tratamento e Log do retorno da função
Registro50 da Sintegra32dll.dll chamados na Listagem 03.
Além disso é necessário também processar individualmente cada um dos campos
especiais apresentados na Tabela 02 da seguinte forma:

Listagem 05: Tratamento de geração dos registros 54 para os
campos “espeficais” mostrados na Tabela 02.
O código da Listagem 05 deve ser adaptado e repetido para cada um dos itens
“especiais” contidos na Tabela 02, observando-se a sistemática de numeração e
nomenclatura dos campos.
O código mostrado foi retirado e adaptado do demo de geração do Sintegra com
banco de dados disponível para download em:
http://www.igara.com.br/downloads/sintegradll/projeto_sintegra32dll_v4.zip
Perguntas e Repostas sobre o Registro 54
1. Por que o Validador informa que não existe um Registro Tipo 50
correspondente?
a. Pode estar acontecendo uma das situações:
b. O registro tipo 50 existe, mas os campos comuns aos dois tipos de registros (CNPJ,
Modelo, Série, Subsérie, Número da NF, CFOP e alíquota), não foram informado
exatamente da mesma forma no registro tipo 50 e no registro tipo 54.
c. O Registro tipo 50 realmente não existe. Neste caso deve ser informado o
Registro 50 correspondente
2. Como informar o valor do desconto discriminado no corpo da Nota Fiscal?
a. Deve ser informado no Registro 54. O valor do desconto deverá ser rateado
proporcionalmente entre os Registros 54. Se o valor do desconto for residual,
por exemplo arredondamento, poderá ser escolhido um dos Registros 54 para
informar o desconto.
3. Como informar o valor do Frete discriminado no corpo da Nota Fiscal?
a. No Registro 54, informando o campo 08 - Número do Item com o número 991 e
o valor do Frete no campo12 - Valor do Desconto/Despesa Acessória/Frete/Seguro.
b. Devem ser informados também os campos 02 a 07. Os demais campos devem ser
preenchidos com zeros (númericos) ou brancos/espaços (alfanuméricos).
Por enquanto é só. Para maiores informações sobre o Registro consulte o manual
do convênio do sintegra disponível em www.sintegra.gov.br.
Não perca a próxima edição quando continuaremos os estudos a respeito dos
registros do Sintegra e veremos a geração do Registro 55.
Este artigo foi baseado nas informações
contidas nos seguintes documentos disponíveis para download na internet:
Convênio ICMS 020 de 2000.doc, Convênio ICMS 31 de 1999.doc, CONVÊNIO ICMS 057
de 1995.doc, Convênio ICMS 069 de 2002.doc, CONVÊNIO ICMS 078 de 1997.doc,
Convênio ICMS 142 de 2002.doc, convenio_icms_018_de_2004.doc,
convenio_icms_019_de_2004.doc, convenio_icms_020_de_2004.doc, Decreto 11614 de
2004.doc, manualdoconvenio57-95 C 76-03.RTF
Victory Fernandes é Engenheiro Mestrando em Redes de computadores, e
desenvolvedor sócio da TKS Software - Soluções de Automação de Processos e
Softwares Dedicados e Administrador do projeto Sintegra32dll.dll. Pode ser
contatado em victory@igara.com.br, ou
através dos sites www.igara.com.br - www.victory.hpg.com.br
|