fix(empresas): filtro global escondia a empresa inativa da tela inteira - #35
Merged
Merged
Conversation
`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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
EmpresaConfigurationdeclaraHasQueryFilter(empresa => empresa.Ativa). O filtro vale para toda consulta sobrecontexto.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.ListarAsyncpassa a usarIgnoreQueryFilters, e a coluna de situação ganha o estado que faltava.A condição de certificado ativo vai explícita
IgnoreQueryFiltersvale para a consulta inteira, não só para a entidade raiz: a subconsulta que calculaPossuiCertificadoAtivoperderia o filtro global deCertificadoDigitale 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}/statussempre aceitou os dois sentidos, mas o front só chamava comativa: 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.