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:
- ✅ Funcionava: Ao clicar em "Gravar" com erros de validação
- ❌ Bug: Ao clicar em "Itens" → "Novo Item de Estoque"
- ❌ Bug: Ao clicar em "Itens" → "Novo Item de Terceiro"
- ❌ Bug: Ao clicar em "Itens" → "Editar Item"
- ❌ Bug: Ao clicar em "Itens" → "Excluir Item"
- ❌ 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
disabledquandoIsVendedor = true - SelectList contém apenas a empresa do vendedor
2. Controller (Backend)
- Propriedade
IsVendedorcorretamente configurada em todos os fluxos - Método
PrepararViewModelParaRetornoComErroscentraliza lógica
3. Validação (Backend)
ValidarEmpresaVendedorimpede 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 vendedoresObterEmpresaIdVendedor()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