Pular para conteúdo

Correção: Campo Empresa Emissão Habilitado em Fluxos de Erro para Vendedores

Ticket: NH-44 Data: 2025-10-29 Status: ✅ Corrigido


Problema

O campo "Empresa Emissão" estava sendo incorretamente habilitado para usuários vendedores quando ocorriam erros de validação em fluxos de gerenciamento de pedidos.

Comportamento Esperado

Vendedores devem ter o campo "Empresa Emissão" sempre desabilitado e pré-selecionado com a empresa vinculada ao seu contrato, conforme regra de negócio RN-001 documentada em RESTRICOES-VENDEDORES.md.

Comportamento Observado

Em cenários específicos, o campo era habilitado:

  1. Funcionava: Ao clicar em "Gravar" com erros de validação
  2. Bug: Ao clicar em "Itens" → "Novo Item de Estoque"
  3. Bug: Ao clicar em "Itens" → "Novo Item de Terceiro"
  4. Bug: Ao clicar em "Itens" → "Editar Item"
  5. Bug: Ao clicar em "Itens" → "Excluir Item"
  6. Bug: Ao clicar em "Finalizar" com erros

Causa Raiz

Arquitetura de Métodos

O sistema possui dois métodos para configurar ViewModels:

ConfigurarPedido: - Popula SelectLists (empresas, clientes, naturezas de operação, etc.) - Configura transportadoras - NÃO configura propriedades específicas de vendedor

PrepararViewModelParaRetornoComErros: - Chama ConfigurarPedido - Chama ConfigurarEmpresaVendedor (define IsVendedor = true e filtra empresas) - Chama ConfigurarVendedorComissionado (filtra vendedores)

Problema Identificado

Os métodos Encaminhar* (EncaminharIncluirPedidoItem, EncaminharEditarPedidoItem, EncaminharExcluirPedidoItem, EncaminharFinalizacao) estavam chamando apenas ConfigurarPedido em seus caminhos de erro, ignorando as configurações específicas de vendedor.

Exemplo do código problemático:

private async Task<IActionResult> EncaminharIncluirPedidoItem(...)
{
    if (!ValidOperation())
    {
        pedidoViewModel = await ConfigurarPedido(pedidoViewModel);  // ❌ Incompleto
        return View(pedidoViewModel);
    }
    // ...
}


Solução Implementada

Mudança Aplicada

Substituir todas as chamadas de ConfigurarPedido por PrepararViewModelParaRetornoComErros nos caminhos de erro.

Código corrigido:

private async Task<IActionResult> EncaminharIncluirPedidoItem(...)
{
    if (!ValidOperation())
    {
        return View(await PrepararViewModelParaRetornoComErros(pedidoViewModel));  // ✅ Completo
    }
    // ...
}

Localizações Corrigidas

PedidoController.cs - Total de 11 mudanças:

Método Linha Cenário
Create [HttpPost] 275 Erro ao finalizar novo pedido
Create [HttpPost] 302 Erro de validação geral
Create [HttpPost] 309 Fallback default
Edit [HttpPost] 360 Falha em ValidarEmpresaVendedor
Edit [HttpPost] 365 ModelState inválido
Edit [HttpPost] 369 Falha em VerificarSituacaoPedido
Edit [HttpPost] 380 Erro ao finalizar edição
Edit [HttpPost] 417 Erro de validação no default
Edit [HttpPost] 424 Fallback default
EncaminharIncluirPedidoItem 805 Erro ao incluir item (estoque/terceiro)
EncaminharEditarPedidoItem 815 Erro ao editar item
EncaminharExcluirPedidoItem 825 Erro ao excluir item
EncaminharFinalizacao 835 Erro ao finalizar pedido

Impacto

Segurança

Mantida: Validação backend ValidarEmpresaVendedor já existia e continua funcionando ✅ Melhorada: Consistência UI/UX em todos os fluxos

Performance

Impacto mínimo: Duas chamadas assíncronas adicionais apenas em casos de erro ✅ Operações rápidas: Verificação de tipo e query simples ao banco

Compatibilidade

Sem breaking changes: Apenas correção de bug ✅ Fluxos de sucesso: Não foram alterados (redirecionamentos permanecem iguais) ✅ Não-vendedores: Comportamento inalterado


Fluxo de Execução Corrigido

Antes da Correção

Vendedor clica "Novo Item de Estoque"
  └─> Erro de validação (!ValidOperation())
      └─> ConfigurarPedido(viewModel)
          ├─ Popula SelectLists
          ├─ IsVendedor = false (não configurado) ❌
          └─ Campo empresa habilitado ❌

Depois da Correção

Vendedor clica "Novo Item de Estoque"
  └─> Erro de validação (!ValidOperation())
      └─> PrepararViewModelParaRetornoComErros(viewModel)
          ├─ ConfigurarPedido(viewModel)
          │  └─ Popula SelectLists
          ├─ ConfigurarEmpresaVendedor(viewModel)
          │  ├─ IsVendedor = true ✅
          │  ├─ EmpresaId = empresa do vendedor
          │  └─ EmpresaSelectList filtrada
          └─ ConfigurarVendedorComissionado(viewModel)
             └─ VendedorSelectList filtrada

Camadas de Proteção

A correção mantém as múltiplas camadas de segurança já existentes:

1. Interface (View)

  • Campo renderizado como disabled quando IsVendedor = true
  • SelectList contém apenas a empresa do vendedor

2. Controller (Backend)

  • Propriedade IsVendedor corretamente configurada em todos os fluxos
  • Método PrepararViewModelParaRetornoComErros centraliza lógica

3. Validação (Backend)

  • ValidarEmpresaVendedor impede alteração mesmo se POST for manipulado
  • Mensagem de erro: "Empresa Emissão não pode ser alterada por vendedores."

4. Service Layer

  • ObterTipoFuncionarioLogado() identifica vendedores
  • ObterEmpresaIdVendedor() retorna empresa correta

Padrões Seguidos

DRY (Don't Repeat Yourself)

✅ Reutilização do método PrepararViewModelParaRetornoComErros existente ✅ Lógica centralizada em vez de duplicada

Defense in Depth

✅ UI bloqueada + Validação backend + Autorização

Nomenclatura

✅ Nomes descritivos em português (padrão do projeto)


Arquivos Modificados

  • src/Nelmetais.SGE.WebApp/Areas/Comercial/Controllers/PedidoController.cs
  • 11 inserções
  • 23 deleções
  • Total de 11 localizações corrigidas

Commit

commit c6c02547
Author: Claude <noreply@anthropic.com>
Date: 2025-10-29

fix: Preserve vendor empresa field state in all flows

Fix bug where empresa field was incorrectly re-enabled for
vendors when clicking item management actions. The issue
occurred in error handling paths of Encaminhar* methods that
were calling ConfigurarPedido instead of the proper error
preparation method.

Replace all ConfigurarPedido calls with PrepararViewModelParaRetornoComErros
in error handling paths to ensure IsVendedor property and empresa
field configuration are properly preserved across all flows:
- EncaminharIncluirPedidoItem (new item creation)
- EncaminharEditarPedidoItem (item editing)
- EncaminharExcluirPedidoItem (item deletion)
- EncaminharFinalizacao (order finalization)
- Create and Edit HTTP POST methods

Remove debug logging and clean up inline comments for production
readiness.

Relação com Documentação Existente

Esta correção complementa a regra RN-001: Empresa de Emissão Bloqueada para Vendedores documentada em RESTRICOES-VENDEDORES.md.

A regra de negócio já estava implementada, mas havia inconsistências nos fluxos de erro que permitiam que o campo fosse habilitado temporariamente em determinadas situações.


Responsável: Equipe de Desenvolvimento SGE Revisão: Pendente