Ocultação de Campos de Dimensões para Items de Terceiro
Tarefa: NH-118 Data: 2025-10-28
Problema
Ao criar ou editar Items de Terceiro (OrdemCompra) no módulo Comercial, os campos de dimensões físicas eram exibidos e obrigatórios:
- Comprimento (mm)
- Largura (mm)
- Peso Teórico por Metro (Kg)
- Peso Teórico Total (Kg)
Estes campos são relevantes apenas para produtos do estoque próprio catalogado, não para itens de terceiros que são adquiridos sob encomenda.
Problema Técnico Subjacente
O serviço OrdemCompraItemService.ConfigurarOrdemCompraItem() tentava converter unidades de medida mesmo quando as unidades de origem e destino eram idênticas. A conversão exigia o campo Comprimento, causando erro ao salvar items de terceiro sem dimensões preenchidas.
Solução
1. View Layer - Renderização Condicional
Arquivo: src/Nelmetais.SGE.WebApp/Areas/Comercial/Views/PedidoItem/Shared/_CondicaoComercialPartial.cshtml
Adicionado condicional para não renderizar campos quando TipoPedidoItem = 2 (OrdemCompra):
@* NH-118: Ocultar campos de dimensões para Items de Terceiro (OrdemCompra) *@
@if (Model.TipoPedidoItem != 2)
{
<div class="form-row">
<!-- Campos de Comprimento, Largura e Peso -->
</div>
}
2. JavaScript - Defensive Programming
Arquivo: src/Nelmetais.SGE.WebApp/Areas/Comercial/Views/PedidoItem/Shared/_ValidationScriptsPedidoItemPartial.cshtml
Adicionados null checks em 5 locais críticos para prevenir erros quando elementos não existem no DOM:
- Event listeners (
blurefocus) - Função
obterValoresItem() - Funções
calcularTributosComprimentoEmMM()ecalcularTributosLarguraEmMM() - Funções
popularInputPesoTeoricoMetro()epopularInputPesoTeoricoTotal()
// NH-118: Verificar se campos existem antes de adicionar event listeners
if (inputComprimentoEmMM) inputComprimentoEmMM.addEventListener('blur', calcularTributosComprimentoEmMM);
if (inputLarguraEmMM) inputLarguraEmMM.addEventListener('blur', calcularTributosLarguraEmMM);
3. Service Layer - Conversão de Unidades
Arquivo: src/Nelmetais.SGE.Business/Services/Comercial/OrdemCompraItemService.cs
Refatorado para evitar conversão desnecessária quando unidades de origem e destino são iguais:
// NH-118: Quando unidades são iguais, não precisa converter (evita erro de Comprimento faltando)
if (unidadeMedidaOrigem == unidadeMedidaDestino)
{
ordemCompraItem.QuantidadeControleEstoque = quantidadeOrigem;
}
else
{
ordemCompraItem.QuantidadeControleEstoque = _mercadoriaService.ConverterUnidadeMedida(...);
}
Aplicado em:
- ConfigurarControleEstoque()
- ConfigurarQuantidadeComercial()
Removido: Método IgnorarErroCampoComprimento() (workaround temporário)
4. Controller Layer - Cleanup
Arquivo: src/Nelmetais.SGE.WebApp/Areas/Comercial/Controllers/PedidoItemController.cs
Removido try-catch desnecessário e método IgnorarErroCampoComprimento():
// NH-118: Não precisa mais do try-catch pois o Service agora lida corretamente com conversão de unidades
pedidoItem.OrdemCompraItem = await _ordemCompraItemService.ConfigurarOrdemCompraItem(pedidoItem.OrdemCompraItem);
Impacto
Arquivos Modificados
| Arquivo | Camada | Mudança |
|---|---|---|
_CondicaoComercialPartial.cshtml |
View | Condicional @if |
_ValidationScriptsPedidoItemPartial.cshtml |
JavaScript | Null checks (5 locais) |
OrdemCompraItemService.cs |
Service | Lógica de conversão + remoção de workaround |
PedidoItemController.cs |
Controller | Remoção de try-catch e método temporário |
Total: 4 arquivos, 0 migrações de banco de dados
Banco de Dados
Nenhuma alteração necessária. Os campos ComprimentoEmMM e LarguraEmMM continuam existindo na tabela PedidoItem e podem ficar NULL para items de terceiro.
Comportamento
Items de Terceiro (TipoPedidoItem = 2)
- Campos de dimensões não são exibidos
- Salvamento funciona sem requerer Comprimento/Largura
- Conversão de unidades é ignorada quando origem = destino
Items Normais (TipoPedidoItem = 1)
- Campos de dimensões permanecem visíveis
- Comportamento existente mantido sem alterações
- Cálculos de peso teórico funcionam normalmente
Referências de Código
- Enum de tipos:
src/Nelmetais.SGE.Business/Enums/Comercial/TipoPedidoItemEnum.cs - View parcial:
_CondicaoComercialPartial.cshtml:58-79 - Service:
OrdemCompraItemService.cs:173-226 - Controller:
PedidoItemController.cs:773-774