Pular para conteúdo

Exclusao de Itens do Romaneio - Hard Delete

Resumo

Ao excluir um item (Documento Fiscal) da tabela de um Romaneio, o sistema realiza uma exclusao fisica (hard delete) do registro na tabela RomaneioDocumentoFiscal. Nao existe soft delete com flag de status para esta operacao.

Contexto

  • URL: /expedicao/atualizar-romaneio/{id}
  • Entidade: RomaneioDocumentoFiscal
  • Tabela: RomaneioDocumentoFiscal

Fluxo de Exclusao

1. Frontend (View)

Quando o usuario clica no botao "Excluir" em um item da tabela, o campo IsDeleted do ViewModel e marcado como true:

// RomaneioDocumentoFiscalViewModel.cs
public bool IsDeleted { get; set; }

2. Controller

Antes de processar a atualizacao, o controller chama o metodo ExcluirDocumentosDeletados():

// RomaneioController.cs:118
[HttpPost("atualizar-romaneio/{id:int}")]
public async Task<IActionResult> Edit(int id, RomaneioViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        viewModel.ExcluirDocumentosDeletados();  // Remove itens marcados
        var romaneio = _mapper.Map<Romaneio>(viewModel);
        await _romaneioService.Update(romaneio);
        // ...
    }
}

3. ViewModel

O metodo remove da lista os itens marcados como deletados ou sem DocumentoFiscalId:

// RomaneioViewModel.cs:62-63
public void ExcluirDocumentosDeletados() =>
    RomaneioDocumentosFiscais.RemoveAll(x => x.DocumentoFiscalId.HasValue is false || x.IsDeleted);

4. Repository

O repositorio compara os itens enviados com os existentes no banco e remove fisicamente os que nao estao mais na lista:

// RomaneioRepository.cs:14-27
public async Task AtualizarRomaneio(Romaneio romaneio)
{
    var romaneioDocumentosFiscaisDb = await NelmetaisDbContext.RomaneioDocumentoFiscal
        .Where(x => x.RomaneioId == romaneio.Id)
        .ToListAsync();

    foreach (var romaneioDocumentoFiscalDb in romaneioDocumentosFiscaisDb)
    {
        // Se o item do banco NAO existe na lista enviada, REMOVE fisicamente
        if (romaneio.RomaneioDocumentosFiscais.Any(x => x.Id == romaneioDocumentoFiscalDb.Id) is false)
            NelmetaisDbContext.RomaneioDocumentoFiscal.Remove(romaneioDocumentoFiscalDb);
    }

    await base.Update(romaneio);
}

Diagrama do Fluxo

Usuario clica "Excluir"
        |
        v
ViewModel.IsDeleted = true
        |
        v
Controller chama ExcluirDocumentosDeletados()
        |
        v
Item removido da lista do ViewModel
        |
        v
Repository compara lista com banco
        |
        v
DbContext.Remove() -> DELETE fisico no banco

Impacto

Atencao

A exclusao e irreversivel. Uma vez que o item e removido, nao ha como recupera-lo sem um backup do banco de dados.

Pontos Importantes

  1. Sem auditoria de exclusao: O registro e completamente removido, sem historico
  2. Sem soft delete: Nao existe campo Ativo ou Deletado sendo usado para esta operacao
  3. Cascata: A exclusao e apenas do vinculo RomaneioDocumentoFiscal, o DocumentoFiscal original permanece intacto

Arquivos Envolvidos

Arquivo Funcao
RomaneioController.cs Chama ExcluirDocumentosDeletados() antes de salvar
RomaneioViewModel.cs Define o metodo que remove itens da lista
RomaneioDocumentoFiscalViewModel.cs Contem a propriedade IsDeleted
RomaneioRepository.cs Executa o Remove() fisico no banco

Referencias


Documentacao gerada em: 02/12/2025 Versao do Sistema: SGE 3.0