Pular para conteúdo

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:

  1. Event listeners (blur e focus)
  2. Função obterValoresItem()
  3. Funções calcularTributosComprimentoEmMM() e calcularTributosLarguraEmMM()
  4. Funções popularInputPesoTeoricoMetro() e popularInputPesoTeoricoTotal()
// 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