Skip to content

fix(empresas): filtro global escondia a empresa inativa da tela inteira - #35

Merged
net0well merged 1 commit into
mainfrom
fix/sinalizacao-de-empresa-inativa
Jul 29, 2026
Merged

net0well merged 1 commit into
mainfrom
fix/sinalizacao-de-empresa-inativa

Conversation

@net0well

Copy link
Copy Markdown
Owner

EmpresaConfiguration declara HasQueryFilter(empresa => empresa.Ativa). O filtro vale para toda consulta sobre contexto.Empresas, inclusive a contagem da paginação, então inativar uma empresa a removia da grade sem deixar rastro. Do ponto de vista de quem lê a tela, o cadastro tinha sido apagado — e não foi: ele continua lá, fora do ciclo de captura, com o ponteiro de NSU intacto.

ListarAsync passa a usar IgnoreQueryFilters, e a coluna de situação ganha o estado que faltava.

A condição de certificado ativo vai explícita

IgnoreQueryFilters vale para a consulta inteira, não só para a entidade raiz: a subconsulta que calcula PossuiCertificadoAtivo perderia o filtro global de CertificadoDigital e um certificado revogado passaria a contar como válido, com a tela oferecendo sincronizar com ele. A condição agora está escrita na própria subconsulta, e um teste a fixa.

"Inativa" tem precedência sobre bloqueio e falta de certificado

O backend tira a empresa desligada do ciclo strar "Bloqueada até" numa empresa que não seria consultada de qualquer forma faria a tela explicar o motivo errado. Pelo mesmo raciocínio, os alertas do dashboard deixam de contar empresa inativa: inativar uma empresa deixava para trás um alerta que ning

Reativar pela tela

PATCH /empresas/{id}/status sempre aceitou os dois sentidos, mas o front só chamava com ativa: false, e uma empresa inativada só voltava por chamada direta na API ou no banco. O botão aparece no lugar de "Inativar" e dispensa confirmação: não destrói nada e se desfaz no mesmo botão.

Como isso torna o caminho alcançável pela interface, a reativação passa a ser guardada. O índice único de CNPJ é parcial em ativa, dcadastrar uma empresa inativada. Se o recadastro aconteceu, reativar a antiga violaria o índice e devolveria erro de banco em vez do motivo.

Mensagem da execução conta os eventos

Um ciclo que recebe só eventos — manifestação, cancelamento, carta de correção de notas de terceiros — termina com zero documentos novos e ainda assim grava dezenas de arquivos. O histórico anunciava "Nenhum documento novo na SEFAZ" depois de arquivar quarenta XMLs, o que fez duvidar da captura enquanto ela funciona passa a dizer o que já entrou antes de ser reagendada.

Bloqueio descrito por duração, não por horár

As mensagens traziam dd/MM HH:mm UTC. O texto é gravado no histórico e lido numa tela que converte todo o resto para o fuso do navegadarecia de dois jeitos na mesma página: "16:30 UTC" no histórico e "13:30" na grade. Duração não tem fuso, e isso elimina a divergência em vez de corrigi-la nos dois lados. Vale para os dois pontos que embutiam horário: rejeição por consumo indevido e impedimento de manifestação.

`EmpresaConfiguration` declara `HasQueryFilter(empresa => empresa.Ativa)`. O filtro vale para
toda consulta sobre `contexto.Empresas`, inclusive a contagem da paginação, então inativar uma
empresa a removia da grade sem deixar rastro. Do ponto de vista de quem lê a tela, o cadastro
tinha sido apagado — e não foi: ele continua lá, fora do ciclo de captura, com o ponteiro de
NSU intacto.

`ListarAsync` passa a usar `IgnoreQueryFilters`, e a coluna de situação ganha o estado que
faltava.

A condição de certificado ativo vai explícita

`IgnoreQueryFilters` vale para a consulta inteira, não só para a entidade raiz: a subconsulta
que calcula `PossuiCertificadoAtivo` perderia o filtro global de `CertificadoDigital` e um
certificado revogado passaria a contar como válido, com a tela oferecendo sincronizar com ele.
A condição agora está escrita na própria subconsulta, e um teste a fixa.

"Inativa" tem precedência sobre bloqueio e falta de certificado

O backend tira a empresa desligada do ciclo strar "Bloqueada até"
numa empresa que não seria consultada de qualquer forma faria a tela explicar o motivo errado.
Pelo mesmo raciocínio, os alertas do dashboard deixam de contar empresa inativa: inativar uma
empresa deixava para trás um alerta que ning

Reativar pela tela

`PATCH /empresas/{id}/status` sempre aceitou os dois sentidos, mas o front só chamava com
`ativa: false`, e uma empresa inativada só voltava por chamada direta na API ou no banco. O
botão aparece no lugar de "Inativar" e dispensa confirmação: não destrói nada e se desfaz no
mesmo botão.

Como isso torna o caminho alcançável pela interface, a reativação passa a ser guardada. O
índice único de CNPJ é parcial em `ativa`, dcadastrar uma empresa
inativada. Se o recadastro aconteceu, reativar a antiga violaria o índice e devolveria erro de
banco em vez do motivo.

Mensagem da execução conta os eventos

Um ciclo que recebe só eventos — manifestação, cancelamento, carta de correção de notas de
terceiros — termina com zero documentos novos e ainda assim grava dezenas de arquivos. O
histórico anunciava "Nenhum documento novo na SEFAZ" depois de arquivar quarenta XMLs, o que
fez duvidar da captura enquanto ela funciona passa a dizer o que
já entrou antes de ser reagendada.

Bloqueio descrito por duração, não por horár

As mensagens traziam `dd/MM HH:mm UTC`. O texto é gravado no histórico e lido numa tela que
converte todo o resto para o fuso do navegadarecia de dois jeitos
na mesma página: "16:30 UTC" no histórico e "13:30" na grade. Duração não tem fuso, e isso
elimina a divergência em vez de corrigi-la nos dois lados. Vale para os dois pontos que
embutiam horário: rejeição por consumo indevido e impedimento de manifestação.
@net0well
net0well merged commit 2e61f4f into main Jul 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant