FJFrigo · Manutenção › 49

Saúde do Cadastro

Painel que lista o que está incompleto ou errado nos cadastros (produto, emitente, tipo de faturamento, filial, contas) e a tela que corrige. Só avisa; nada é alterado.

Tabelas: produto, emitente, tipo_faturamento, filial, conta_bancaria, financeiro_emissao, tab_ncm, emitente_logEndpoint: GET /cadastro/saude-cadastroPrograma antigo: nenhum (desenho novo)

Teste

Caso sugerido para QA: o que fazer, o que esperar e como conferir no banco.

Bloqueia

Recusa com a mensagem exata (HTTP 400, mostrada na tela).

Atenção

Limitação, pendência ou ponto em que o código e a ajuda não coincidem.

A

O que a tela é e faz

Identidade

Painel que lista o que está incompleto ou errado nos cadastros e que vai travar, ou sair errado, mais adiante: na venda, na nota fiscal, na comissão, no pagamento ou na contabilização. Só avisa: nada é alterado. Cada item tem a tela que corrige (botão "Abrir (opção)"). Desenho novo (inovação 1 da lista de 27/09/2026): o legado e o ceif não têm. Pacote cadastro.saudecadastro (SaudeCadastroService, GET /cadastro/saude-cadastro?todasFiliais=), tela SaudeCadastro.vue, ajuda 49.md/.es.md.

Menu: 4-Manutenção › 9-Saúde do Cadastro (49), com idOpcao: null (sem linha em opcao_sistema). O botão Vencimentos da barra abre a tela irmã A-Vencimentos (também rotulada 49 no menu; cadastro.vencimentos), que é outra tela com outro serviço: aqui só se descreve o painel. O painel agrupa itens de três áreas (Financeiro, Faturamento, Contábil); a ajuda do 49 descreve 13 deles (mais a situação fiscal, à parte), mas o painel tem 22 (ver C).

B

Filtros e opções

Padrões
CampoDefaultEfeito
Todas as minhas filiaisdesmarcadaMarcada: produtos (183) e filiais/contas bancárias das filiais permitidas (FiliaisDoUsuario.permitidas); desmarcada: só a filial da sessão. Emitente, tipo de faturamento e subgrupo de almoxarifado não são por filial e aparecem sempre
Só usados nos últimos 180 diasdesmarcadoFiltro local: esconde cadastro parado (recente = último uso nos últimos 180 dias, DIAS_RECENTE)
Conferirroda ao abrirRecalcula tudo; contador "Conferindo… (Ns)"
Abrir (opção)—Abre a tela que corrige (rota do item). No item de troca bancária abre a fila de vistos em vez de uma tela de cadastro
Vencimentos—Abre a tela de vencimentos
Imprimir—PDF/planilha da lista do item selecionado

À esquerda: itens por área, cada um com "!" e a contagem (ou ✓ verde quando zerado); à direita: as linhas (id, descrição, "O que falta", último uso), as usadas recentemente em laranja. Cada item devolve no máximo 300 linhas (as de uso mais recente primeiro), mas quantidade e recentes contam todas; a tela avisa "mostrando N". Os blocos independentes rodam em paralelo (CompletableFuture, uma conexão do pool cada); falha em qualquer um derruba a conferência inteira com o erro dele.

C

Os itens conferidos e de onde vêm

22 itens, 3 áreas

Último uso = a data mais recente de venda, compra de carne ou título em que o registro aparece (cada item diz qual). "Brasil" = parametros.codicfj da filial da sessão = 004.

Código do itemÁreaAbreCondição (SQL / regra)EscopoÚltimo uso
TROCA_BANCARIA_SEM_VISTOFinanceiro15Trocas de dados bancários do emitente nos últimos 30 dias sem "visto" de outra pessoa (TrocaBancariaService.listar(user, 30, true)); linhas de emitente_log no formato do ceif (COLUNA/VALOR NOVO/VALOR ANTIGO) com campo bancário; o visto é a linha VISTO TROCA BANCARIA <id> no mesmo log. Mostra quantos pagamentos saíram depoistenantdata da troca (sempre "recente")
EMITENTE_DOCUMENTOFaturamento15ConferenciaDocumento.avisostenant; todos os paísesúltimo título (P ou R)
EMITENTE_CHAVE_PIXFinanceiro15Emitente com chave_pix ou tipo_pix diferente de vazio/NENHUM/DADOS_BANCARIOS e ChavePixConferencia.motivo ≠ nulo (telefone sem +55, CPF/CNPJ com DV errado, código do QR no lugar da chave...)só Brasilúltimo título a pagar
TITULO_CHAVE_PIXFinanceiro221Título a pagar vivo, sem baixa viva, vencendo de 60 dias atrás em diante, com financeiro_emissao_dados_pagto (tipo_pix/chave_pix) fora do formatosó Brasil; filiaisvencimento
EMITENTE_CONTA_DIGITOFinanceiro15Emitente com conta contendo "-" e DigitoContaBancaria.motivo ≠ nulo (banco1/2, agência, conta) - só BB (001), Bradesco (237) e Itaú (341)só Brasilúltimo título a pagar
TITULO_CONTA_DIGITOFinanceiro221Título a pagar sem baixa que paga pela conta (tipo_pix vazio/NENHUM/DADOS_BANCARIOS/CONTA), vencendo de 60 dias atrás em diante, com dp.conta LIKE '%-%' e dígito que não conferesó Brasil; filiaisvencimento
CONTA_BANCARIA_DIGITOFinanceiro173Conta bancária da empresa ativa (data_desativacao nula ou futura) com dígito que não confere (usa codigo_banco quando a coluna existe)só Brasil; filiais—
PRODUTO_SEM_TRIBUTACAOFaturamento183IFNULL(idtab_impostos,0) = 0só Brasil; filiaisúltima venda ou compra de carne com o produto
PRODUTO_TABELA_SEM_FILIALFaturamento183Tem tabela e NOT EXISTS (tab_impostos_uf com idtab_impostos e idfilial do produto)só Brasil; filiaisidem
PRODUTO_SEM_COMERCIALFaturamento183idgrupo_comercial ou idsubgrupo_comercial zeradossó Brasil; filiaisidem
PRODUTO_SEM_NCMFaturamento183LENGTH(TRIM(codigo_mercosul)) < 8todos os países; filiaisidem
PRODUTO_SEM_CENTRO_CUSTO_VENDAFaturamento183IFNULL(idcentro_custo_venda,0) = 0todos os países; filiaisidem
EMITENTE_SEM_CIDADEFaturamento15Sem cidade, cidade inexistente ou cidade sem estadotenantúltima venda do emitente
EMITENTE_SITUACAO_FISCALFaturamento15Última reconferência em emitente_situacao_fiscal com situação (CNPJ baixado/inapto/suspenso; RUC fora de ACTIVO) ou IE irregular. Tabela ausente = item vaziotenantdata da consulta (sempre "recente")
PRODUTO_NCM_FORA_TABELAFaturamento183NCM de 8+ caracteres, produto não desativado, ausente ou inativo em tab_ncm (inexistente/extinto → SEFAZ 778). Sem tabela carregada: uma linha pedindo "Atualizar tabela NCM" no 183só Brasil; filiaisidem
ALMOX_PRODUTO_NCM_FORA_TABELAFaturamento194Produto de almoxarifado com situacao='T', NCM com mais de 2 caracteres, fora da tab_ncm vigentesó Brasilúltima compra de almoxarifado
PRODUTO_MINIMO_ABAIXO_CUSTOFaturamento18OMínimo vigente hoje na tabela de preço mínimo abaixo do custo médio móvel (TabelaPrecoAnaliseService.margem, margem 0)só a filial da sessão, ignora "Todas as minhas filiais"última venda
TIPO_SEM_NATOPFaturamento185TRIM(IFNULL(tipo_faturamento.tipo_natop,'')) = ''só Brasil; tenantúltimo uso do tipo no último ano (NF-e, venda, carne, 2 de almoxarifado)
TIPO_SEM_CONTAContábil185tipo_faturamento.idplconta zerado, inexistente em ct_plano_conta ou conta excluída (não exige conta analítica)tenantidem
FILIAL_DIFERENCA_CAMBIALContábil41filial.idplc_difcamb zerado, inexistente, excluído ou sintético (analitica <> 'T')filiais—
SUBGRUPO_ALMOX_SEM_CONTAContábil192almoxarifado_subgrupo.idplc_cons_ent ou idplc_cons_sai zerado ou apontando para conta inexistente/excluídatenantúltima saída de almoxarifado do subgrupo (365 dias)
CONTA_BANCARIA_SEM_CONTA_CONTABILContábil173Conta ativa com IFNULL(idplconta,0) = 0 (a conciliação e o 373 não a enxergam)filiaisúltima baixa ou lançamento bancário

O painel mostra 22 códigos no total (ITENS do front traz o título e o "efeito" de cada um, em tr()). Itens "só Brasil" simplesmente não aparecem fora do Brasil.

Situação fiscal do cliente (reconferência automática)

D

Permissões, travas e mensagens

Sem regra nomeada

Sem regra nomeada: o serviço não usa RegraAcessoService. O endpoint está sob /cadastro/* (JWT) e atende qualquer sessão; o menu 49 tem idOpcao: null, ou seja, aparece para todos. Atenção: o painel mostra nomes, CNPJ/CPF, chaves PIX e contas de emitentes a qualquer usuário que abra a tela.

E

Configuração e dependências

Constantes e application.yml
OndeItemEfeito
ConstanteDIAS_RECENTE = 180; MAX_LINHAS = 300; troca bancária 30 dias; título com vencimento de 60 dias atrás em diante; uso do tipo de faturamento em 365 diasFixas no código
application.ymlapp.emitente-reconferencia.* (automatica, intervalo-minutos 60, por-rodada 40, dias 30, pausa-ms 1500)Reconferência de situação fiscal dos clientes (item EMITENTE_SITUACAO_FISCAL)
application.ymlapp.conexao.hml1 = homologação: a reconferência cadastral não roda
Bancotab_ncm (sincronizada no 183, "Atualizar tabela NCM")Base dos itens de NCM fora da tabela
Bancoemitente_situacao_fiscalCriada pela rotina; ausente = item sem linhas
Regras de negócio externasChavePixConferencia, DigitoContaBancaria (BB, Bradesco, Itaú: calibrados contra pagamentos efetivados), ConferenciaDocumentoDefinem o que conta como "fora do formato"

Sem e-mail, sem rotina agendada própria (a única rotina é a de situação fiscal, acima). O rodapé do sistema avisa master/suporte dos vencimentos em 15 dias, mas isso é da tela de Vencimentos.

F

Casos de teste sugeridos

QA
Teste

Abrir e conferir

FazerAbrir 49, deixar "Todas as minhas filiais" desmarcada e clicar Conferir.

EsperadoOs itens aparecem por área com contagem; itens zerados com ✓; "Nenhum problema encontrado." só se todos zerarem. Tempo: leitura de produtos, emitentes e titulos; os blocos rodam em paralelo.

Teste

Todas as filiais

FazerMarcar "Todas as minhas filiais" e Conferir.

EsperadoItens de produto, filial e conta bancária crescem com as outras filiais; itens de emitente, tipo e subgrupo ficam iguais.

Teste

Só usados nos últimos 180 dias

FazerMarcar o filtro.

EsperadoAs contagens passam a ser recentes; linhas em laranja são as recentes; cadastro parado some.

Teste

Produto sem NCM / tributação

FazerEscolher "Produto sem NCM" e abrir um produto da lista.

EsperadoO produto tem codigo_mercosul com menos de 8 caracteres. Corrigido no 183 e reconferido, ele sai da lista. Em tenant fora do Brasil os itens de tributação/comercial não existem, mas NCM e centro de custo sim.

ConferirSELECT p.id, p.descricao, p.idfilial, p.codigo_mercosul, p.idtab_impostos, p.idgrupo_comercial, p.idsubgrupo_comercial, p.idcentro_custo_venda FROM produto p WHERE p.idfilial IN (:filiais) AND (LENGTH(TRIM(IFNULL(p.codigo_mercosul,''))) < 8 OR IFNULL(p.idtab_impostos,0) = 0 OR IFNULL(p.idgrupo_comercial,0) = 0 OR IFNULL(p.idsubgrupo_comercial,0) = 0 OR IFNULL(p.idcentro_custo_venda,0) = 0)

Teste

Tabela de tributação sem linha na filial

FazerItem "Tabela de tributação sem linha na filial do produto" (Brasil).

EsperadoDetalhe "filial N · tabela T"; corrigir cadastrando a linha da filial na tabela de tributação.

ConferirSELECT p.id, p.idfilial, p.idtab_impostos FROM produto p WHERE IFNULL(p.idtab_impostos,0) > 0 AND NOT EXISTS (SELECT 1 FROM tab_impostos_uf u WHERE u.idtab_impostos = p.idtab_impostos AND u.idfilial = p.idfilial)

Teste

NCM inexistente ou extinto

FazerCadastrar um produto com NCM de 8 dígitos que não está na tabela oficial (ou extinto) e conferir.

EsperadoAparece em "Produto com NCM inexistente ou extinto" com o motivo ("NCM xxxx.xx.xx inexistente" ou "extinto (descrição)"; com 7 dígitos e zero faltando sugere a forma com o zero). Produto desativado não entra aqui.

ConferirSELECT n.codigo, n.ativo, n.descricao FROM tab_ncm n WHERE n.codigo = REGEXP_REPLACE(:ncm, '[^0-9]', '')

Teste

Emitente sem cidade

FazerItem "Emitente sem cidade (ou cidade sem estado)".

EsperadoLinhas com "sem cidade", "cidade N inexistente" ou "cidade N sem estado", com último uso = última venda.

ConferirSELECT e.id, e.razao_social FROM emitente e LEFT JOIN cidade c ON c.id = e.idcidade WHERE c.id IS NULL OR IFNULL(c.idestado,0) = 0

Teste

Chave PIX e dígito de conta

FazerGravar no 15 uma chave PIX de telefone sem +55 e uma conta do Bradesco com dígito errado; conferir.

EsperadoAparecem em "Emitente com chave PIX fora do formato" e "Emitente com dígito de agência/conta que não confere"; um título a pagar em aberto com esses dados aparece nos itens de título (221). Banco que não é BB/Bradesco/Itaú não é conferido. Referência do histórico: 213 emitentes com dígito de conta no central.

ConferirSELECT id, razao_social, tipo_pix, chave_pix, banco1, agenciabancaria1, contabancaria1 FROM emitente WHERE id = :id

Teste

Tipo de faturamento sem conta e sem natop

FazerItens "Tipo de faturamento sem operação fiscal (tipo_natop)" (Brasil) e "sem conta contábil".

EsperadoCada linha mostra "tipo_natop vazio", "sem conta", "conta N inexistente" ou "conta N excluída"; o último uso vem do último ano (venda, compra de carne, almoxarifado, NF-e); tipo só usado em título avulso sai sem último uso.

ConferirSELECT tf.id, tf.descricao, tf.tipo_natop, tf.idplconta FROM tipo_faturamento tf LEFT JOIN ct_plano_conta pc ON pc.id = tf.idplconta WHERE TRIM(IFNULL(tf.tipo_natop,'')) = '' OR IFNULL(tf.idplconta,0) = 0 OR pc.id IS NULL OR pc.excluido = 'T'

Teste

Itens contábeis

FazerFilial sem conta de diferença cambial; subgrupo de almoxarifado sem conta de entrada/saída; conta bancária sem conta contábil.

EsperadoCada um lista a filial/subgrupo/conta com o motivo ("sem conta de diferença cambial", "conta X é sintética", "sem conta de entrada", ...); a conta bancária sem conta contábil abre o 173 (janela "Sem conta contábil").

ConferirSELECT cb.id, cb.descricao FROM conta_bancaria cb WHERE IFNULL(cb.idplconta,0) = 0 AND (cb.data_desativacao IS NULL OR cb.data_desativacao > CURDATE())

Teste

Troca bancária sem visto

FazerTrocar o PIX/conta de um emitente no 15 (web) e abrir o item.

EsperadoA troca aparece nos 30 dias seguintes com "por USUARIO" e, se houve pagamentos depois, "N pagamento(s) depois"; "Abrir" abre a fila de vistos (não uma tela de cadastro). Quem fez a troca não dá o visto. Troca feita no desktop não aparece.

ConferirSELECT l.id, l.idemitente, l.data, l.idusuario FROM emitente_log l WHERE l.data >= DATE_SUB(CURDATE(), INTERVAL 30 DAY) AND l.historico LIKE 'COLUNA%' ORDER BY l.data DESC

Teste

Mínimo abaixo do custo

FazerItem "Produto com mínimo abaixo do custo médio" com filial da sessão e depois "Todas as minhas filiais".

EsperadoA lista é sempre da filial da sessão (mínimo, custo, margem %); marcar todas as filiais não muda este item.

Teste

Limite de 300 linhas

FazerItem com mais de 300 registros (ex.: produto sem NCM em todas as filiais).

EsperadoMostra 300, "mostrando 300", e a contagem total no cabeçalho do item e no painel esquerdo.

Teste

Imprimir e abrir

FazerImprimir a lista de um item; Abrir (opção).

EsperadoPDF/planilha com as linhas visíveis; "Abrir (183)" abre o cadastro de produtos etc.

G

Limitações, pendências e pontos de atenção

Achados da leitura do código
Atenção

Corrigido em 04/10/2026: a ajuda listava 13 itens

49.md e 49.es.md descrevem agora os 22 itens, por área, com o recorte de cada um (produto desativado fora, mínimo abaixo do custo só da filial da sessão, conta sintética do tipo aceita) e o item "Conferência que não rodou".

Atenção

Corrigido em 04/10/2026: produtos desativados entravam nos itens "sem ..."

A consulta de produtos() passou a filtrar IFNULL(p.desativado,'F') <> 'T', como o item de NCM fora da tabela. Vale para sem tributação, tabela sem filial, sem grupo/subgrupo comercial, sem NCM e sem centro de custo de venda. A coluna existe em central e em fjfrigo_concepcion.

Atenção

TIPO_SEM_CONTA aceita conta sintética — de propósito (conferido em 04/10/2026)

A conta do tipo de faturamento é a sintética (FORNECEDORES LOCAIS, DUPLICATAS A RECEBER...): a sincronização lança na analítica do emitente sob ela, criada se faltar (SincFinanceiroBaixa, SincCompraCarne). Em central 89 tipos e em fjfrigo_concepcion 56 apontam para sintética; exigir analítica daria 89 falsos alarmes. O item acusa só sem conta, conta inexistente ou excluída; a coluna analitica saiu da consulta e o motivo ficou num comentário.

Atenção

Itens sem filial misturam escopos

Emitente, tipo e subgrupo aparecem mesmo com "Todas as minhas filiais" desmarcada. O item de mínimo abaixo do custo é sempre da filial da sessão, de propósito (o custo médio percorre o estoque inteiro da filial; N filiais seriam N varreduras) — agora dito na ajuda. Estender a todas as filiais é decisão (custo de tempo). Contagens de itens diferentes não são comparáveis entre si.

Atenção

Corrigido em 04/10/2026: uma falha derrubava a conferência inteira

Cada bloco (trocas, documento, PIX/conta, produtos e emitentes, NCM, mínimo × custo, tipos, contábil) é lido à parte: o que falhar vira um item FALHA_<bloco> na sua área, com uma linha "Esta conferência não rodou" e a mensagem da causa raiz, e fica no log (Saude do cadastro: o bloco X falhou). Os outros saem normalmente. A tela mostra o item como "Conferência que não rodou · <bloco>".

Atenção

Pendências

Status REVISAR (status-porte.csv, 29/09/2026). Cada inovação que alimenta o painel foi registrada como "feita, sem teste de tela" (docs/inovacoes-cadastros-financeiro.md: A2, C2, C3 e B1). Reconferência de situação fiscal não roda em homologação. Aviso de EM7 (documentos com validade) fica para depois.

Nada bate com essa busca. Tente um trecho menor, ou limpe os filtros.