Pular para conteúdo

Ocultação Condicional da Seção Forma de Pagamento - NH-150

Data de Implementação: 2025-11-14 Jira Issue: NH-150 Módulo: Comercial Tela: Adicionar/Editar Pedido (Cotação) Tipo: Feature - Melhoria de UX


Índice

  1. Resumo
  2. Contexto e Motivação
  3. Comportamento Implementado
  4. Detalhes Técnicos
  5. Como Testar
  6. Impacto no Sistema
  7. Arquivos Modificados
  8. Requisitos Atendidos
  9. Referências

Resumo

Implementação de ocultação condicional da seção "Forma de Pagamento" na tela de criação/edição de pedidos (Cotação), baseada na configuração da Natureza de Operação selecionada.

Comportamento: - Quando a Natureza de Operação NÃO possui a flag SolicitarFormaPagamento habilitada → a seção "Forma de Pagamento" é ocultada (incluindo o botão que a expande) - Quando a Natureza de Operação possui a flag SolicitarFormaPagamento habilitada → a seção "Forma de Pagamento" é exibida normalmente


Contexto e Motivação

Problema Anterior

Antes desta implementação, a seção "Forma de Pagamento" era exibida para todas as naturezas de operação, independentemente da configuração. Quando uma natureza não requeria forma de pagamento, o sistema apenas desabilitava alguns campos, mas mantinha a seção visível, causando:

  • 📊 Confusão visual: Vendedores visualizavam seções desnecessárias
  • ⏱️ Perda de tempo: Usuários tentavam preencher campos que não eram relevantes
  • Experiência inconsistente: Algumas seções eram ocultadas condicionalmente, outras não

Solicitação do Cliente

O cliente Nelmetais solicitou especificamente (Ticket NH-150) que a seção de Forma de Pagamento fosse completamente removida da interface quando a Natureza de Operação não solicitasse esse tipo de informação.

Justificativa do cliente:

"Para evitar que o vendedor informe dados desnecessários e ter uma interface mais limpa e objetiva."

Benefícios da Implementação

Interface mais limpa e contextualRedução de erros operacionaisMelhor experiência do usuário (UX)Consistência com outras seções condicionais do sistemaAlinhamento com expectativas do cliente


Comportamento Implementado

Cenário 1: Natureza de Operação COM Solicitação de Forma de Pagamento

Exemplo: "Vendas de Produto", "Vendas de Matéria Prima", "Vendas do Imobilizado"

Comportamento: 1. ✅ Botão " Forma de Pagamento" é exibido 2. ✅ Seção com campos de forma de pagamento é exibida 3. ✅ Campos estão habilitados e podem ser preenchidos 4. ✅ Usuário pode expandir/colapsar a seção normalmente

Screenshot conceitual:

┌─────────────────────────────────────────┐
│  Natureza da Operação                   │
│  [Vendas de Produto          ▼]         │
├─────────────────────────────────────────┤
│  ▼ Forma de Pagamento    <-- VISÍVEL    │
│  ┌───────────────────────────────────┐  │
│  │ Momento de Pagamento:             │  │
│  │ ○ Antecipado ○ À Vista ○ À Prazo │  │
│  │ Tipo: [Selecione...        ▼]    │  │
│  │ ...                               │  │
│  └───────────────────────────────────┘  │
└─────────────────────────────────────────┘


Cenário 2: Natureza de Operação SEM Solicitação de Forma de Pagamento

Exemplo: "Transferência Estoque", "Transferência Venda", "Remessa de Embalagem"

Comportamento: 1. ❌ Botão " Forma de Pagamento" é ocultado 2. ❌ Seção com campos de forma de pagamento é ocultada 3. ✅ Interface fica mais limpa, sem elementos desnecessários

Screenshot conceitual:

┌─────────────────────────────────────────┐
│  Natureza da Operação                   │
│  [Transferência Estoque     ▼]          │
├─────────────────────────────────────────┤
│  (Seção Forma de Pagamento OCULTA)      │
│                                          │
│  ▼ Observação Pedido                    │
│  ...                                     │
└─────────────────────────────────────────┘


Cenário 3: Alternância Dinâmica

Comportamento: Ao mudar a Natureza de Operação, a visibilidade da seção é atualizada instantaneamente via JavaScript, sem necessidade de recarregar a página.

Fluxo: 1. Usuário seleciona "Vendas de Produto" → Seção aparece 2. Usuário muda para "Transferência Estoque" → Seção desaparece 3. Usuário volta para "Vendas de Produto" → Seção reaparece


Detalhes Técnicos

Propriedade de Controle

Entidade: NaturezaOperacao (Nelmetais.SGE.Business.Models.Cadastros) Propriedade: bool SolicitarFormaPagamento

Esta propriedade é configurada no cadastro de Naturezas de Operação e determina se a forma de pagamento deve ser solicitada ao criar/editar pedidos.

Endpoint AJAX

URL: /comercial/pedido/buscar-natureza-da-operacao Método: GET Parâmetro: naturezaOperacaoId (int)

Resposta (JSON):

{
  "id": 24,
  "codigo": "TRANSF_EST",
  "descricao": "Transferencia Estoque",
  "solicitarFormaPagamento": false,
  "solicitarDestinatario": true,
  "solicitarTransportador": false,
  ...
}

Implementação JavaScript

Arquivo: src/Nelmetais.SGE.WebApp/Areas/Comercial/Views/Pedido/Shared/_ValidationScriptsPedidoPartial.cshtml

Função modificada: configurarNaturezaOperacao(naturezaOperacao) (linhas 163-179)

Código implementado:

if (naturezaOperacao.solicitarFormaPagamento) {
    // Exibir botão e seção quando solicitado
    $('#mostrarOcultarAgrupamentoFormaPagamento').show();
    $('#agrupamentoFormaPagamento').show();

    // Habilitar campo tipo forma de pagamento
    $('#PedidoFormaPagamento_TipoFormaPagamentoId').prop('disabled', false);
    $('#PedidoFormaPagamento_TipoFormaPagamentoId').trigger('change');
} else {
    // Ocultar botão e seção quando NÃO solicitado
    $('#mostrarOcultarAgrupamentoFormaPagamento').hide();
    $('#agrupamentoFormaPagamento').hide();

    // Desabilitar e limpar campo tipo forma de pagamento
    $('#PedidoFormaPagamento_TipoFormaPagamentoId').prop('disabled', true);
    $('#PedidoFormaPagamento_TipoFormaPagamentoId').prop('selectedIndex', 0);
}

Elementos HTML Controlados

  1. Botão de expansão da seção:
  2. ID: #mostrarOcultarAgrupamentoFormaPagamento
  3. Classe: btn btn-link btn-lg
  4. Controla o collapse da seção

  5. Seção de forma de pagamento:

  6. ID: #agrupamentoFormaPagamento
  7. Classes: collapse show (quando expandida)
  8. Contém todos os campos relacionados a forma de pagamento

Eventos

Trigger: Evento change no select #NaturezaOperacaoId

Fluxo de execução: 1. Usuário seleciona uma natureza no dropdown 2. Evento change dispara função buscarNaturezaOperacao() 3. AJAX busca dados da natureza no backend 4. Função configurarNaturezaOperacao(naturezaOperacao) é chamada 5. JavaScript oculta/exibe botão e seção baseado em solicitarFormaPagamento

Retrocompatibilidade

Mantido: Comportamento existente de desabilitar o campo PedidoFormaPagamento_TipoFormaPagamentoIdAdicionado: Ocultação da seção completa (comportamento novo) ✅ Sem breaking changes: Toda lógica existente foi preservada


Como Testar

Pré-requisitos

  • Aplicação rodando em http://localhost:8000
  • Usuário com permissão para criar/editar pedidos no módulo Comercial
  • Naturezas de operação configuradas no banco de dados

Teste Manual - Passo a Passo

Teste 1: Natureza que SOLICITA forma de pagamento

  1. Acessar a tela:
  2. URL: http://localhost:8000/comercial/adicionar-pedido?tipo=Cotacao
  3. Fazer login se necessário

  4. Selecionar natureza que solicita:

  5. No campo "Natureza da Operação", selecione uma das opções:

    • "Vendas de Produto"
    • "Vendas de Matéria Prima"
    • "Vendas do Imobilizado"
  6. Validar comportamento:

  7. ✅ Botão " Forma de Pagamento" deve estar VISÍVEL
  8. ✅ Seção "Forma de Pagamento" deve estar VISÍVEL (pode estar expandida ou colapsada)
  9. ✅ Campos dentro da seção devem estar HABILITADOS

Teste 2: Natureza que NÃO solicita forma de pagamento

  1. Selecionar natureza que NÃO solicita:
  2. No campo "Natureza da Operação", selecione uma das opções:

    • "Transferência Estoque"
    • "Transferência Venda"
    • "Remessa de Embalagem"
  3. Validar comportamento:

  4. ❌ Botão " Forma de Pagamento" deve estar OCULTO (não aparece na lista)
  5. ❌ Seção "Forma de Pagamento" deve estar OCULTA (não aparece na tela)

Teste 3: Alternância dinâmica

  1. Testar transição de solicitado → não solicitado:
  2. Selecione "Vendas de Produto" (seção aparece)
  3. Mude para "Transferência Estoque" (seção desaparece)
  4. Validar: Transição deve ser instantânea

  5. Testar transição de não solicitado → solicitado:

  6. Selecione "Transferência Estoque" (seção oculta)
  7. Mude para "Vendas de Produto" (seção aparece)
  8. Validar: Transição deve ser instantânea

Teste 4: Comportamento no carregamento da página

  1. Carregar página com natureza pré-selecionada:
  2. Editar um pedido existente que usa "Transferência Estoque"
  3. Validar: Seção deve estar oculta desde o carregamento inicial

Naturezas de Teste Recomendadas

ID Descrição SolicitarFormaPagamento Resultado Esperado
16 Vendas do imobilizado ✅ TRUE Seção VISÍVEL
20 Vendas de Matéria Prima ✅ TRUE Seção VISÍVEL
23 Vendas de Produto ✅ TRUE Seção VISÍVEL
17 Remessa de Embalagem ❌ FALSE Seção OCULTA
24 Transferência Estoque ❌ FALSE Seção OCULTA
25 Transferência Venda ❌ FALSE Seção OCULTA

Teste Automatizado (Conceitual)

Embora não tenhamos testes automatizados JavaScript no projeto, um teste Selenium/Playwright poderia ser:

// Pseudocódigo de teste E2E
test('Deve ocultar seção de Forma de Pagamento quando natureza não solicita', async () => {
  // Arrange
  await page.goto('http://localhost:8000/comercial/adicionar-pedido?tipo=Cotacao');
  await page.login('admin@nelmetais.com.br', 'Nelmetais*123');

  // Act
  await page.selectOption('#NaturezaOperacaoId', { label: 'Transferência Estoque' });

  // Assert
  await expect(page.locator('#mostrarOcultarAgrupamentoFormaPagamento')).toBeHidden();
  await expect(page.locator('#agrupamentoFormaPagamento')).toBeHidden();
});

test('Deve exibir seção de Forma de Pagamento quando natureza solicita', async () => {
  // Arrange
  await page.goto('http://localhost:8000/comercial/adicionar-pedido?tipo=Cotacao');
  await page.login('admin@nelmetais.com.br', 'Nelmetais*123');

  // Act
  await page.selectOption('#NaturezaOperacaoId', { label: 'Vendas de Produto' });

  // Assert
  await expect(page.locator('#mostrarOcultarAgrupamentoFormaPagamento')).toBeVisible();
  await expect(page.locator('#agrupamentoFormaPagamento')).toBeVisible();
});

Impacto no Sistema

Áreas Afetadas

Módulo Comercial: - Tela: "Adicionar Pedido" (todos os tipos: Cotação, Pedido, etc.) - Tela: "Editar Pedido" - Partial: _ValidationScriptsPedidoPartial.cshtml

Não afetadas: - Outros módulos (Financeiro, Faturamento, etc.) - Backend/Business logic (sem mudanças) - Banco de dados (sem mudanças) - APIs REST (sem mudanças)

Compatibilidade

Retrocompatibilidade garantida: - Pedidos criados antes da mudança continuam funcionando - Lógica existente de desabilitar campos foi mantida - Nenhuma quebra de contrato ou API

Performance

📊 Impacto mínimo: - Operações JavaScript .show() / .hide() são extremamente rápidas (<1ms) - Sem requisições AJAX adicionais - Sem alteração no tempo de carregamento da página

Segurança

🔒 Sem impacto de segurança: - Mudança apenas visual (frontend) - Validações backend permanecem inalteradas - Dados não são expostos ou ocultados de forma insegura


Arquivos Modificados

JavaScript / View Razor

Arquivo:

src/Nelmetais.SGE.WebApp/Areas/Comercial/Views/Pedido/Shared/_ValidationScriptsPedidoPartial.cshtml

Linhas modificadas: 163-179

Tipo de mudança: - ➕ Adicionado: 4 linhas (2x .show(), 2x .hide()) - 📝 Mantido: Toda lógica existente

Diff conceitual:

  if (naturezaOperacao.solicitarFormaPagamento) {
+     $('#mostrarOcultarAgrupamentoFormaPagamento').show();
+     $('#agrupamentoFormaPagamento').show();
+
      $('#PedidoFormaPagamento_TipoFormaPagamentoId').prop('disabled', false);
      $('#PedidoFormaPagamento_TipoFormaPagamentoId').trigger('change');
  } else {
+     $('#mostrarOcultarAgrupamentoFormaPagamento').hide();
+     $('#agrupamentoFormaPagamento').hide();
+
      $('#PedidoFormaPagamento_TipoFormaPagamentoId').prop('disabled', true);
      $('#PedidoFormaPagamento_TipoFormaPagamentoId').prop('selectedIndex', 0);
  }

Documentação

Novos arquivos: - .tasks/TASK-1731593947-forma-pagamento-config.md (Especificação TDD) - .tasks/exploration-notes-NH-150.md (Notas de exploração E2E) - docs/FORMA-PAGAMENTO-CONDICIONAL-NH-150.md (Este documento)


Requisitos Atendidos

Requisitos Funcionais

ID Descrição Status
RF01 Ocultar botão de Forma de Pagamento quando não solicitado ✅ Implementado
RF02 Ocultar seção de Forma de Pagamento quando não solicitado ✅ Implementado
RF03 Exibir botão de Forma de Pagamento quando solicitado ✅ Implementado
RF04 Exibir seção de Forma de Pagamento quando solicitado ✅ Implementado
RF05 Alternar visibilidade ao trocar Natureza de Operação dinamicamente ✅ Implementado

Regras de Negócio

ID Descrição Status
RN01 Propriedade SolicitarFormaPagamento controla visibilidade ✅ Implementado
RN02 Comportamento aplicado ao carregar página ✅ Implementado
RN03 Mantém comportamento de desabilitar campo TipoFormaPagamentoId ✅ Implementado
RN04 Colapso da seção não afeta visibilidade do botão ✅ Implementado

Critérios de Aceite

ID Descrição Status
CA01 Quando SolicitarFormaPagamento = false, botão "Forma de Pagamento" fica oculto ✅ Atendido
CA02 Quando SolicitarFormaPagamento = false, seção #agrupamentoFormaPagamento fica oculta ✅ Atendido
CA03 Quando SolicitarFormaPagamento = true, botão "Forma de Pagamento" fica visível ✅ Atendido
CA04 Quando SolicitarFormaPagamento = true, seção #agrupamentoFormaPagamento fica visível ✅ Atendido
CA05 Comportamento funciona ao carregar página e ao trocar natureza dinamicamente ✅ Atendido
CA06 Se seção estiver expandida e natureza trocar para não-solicitante, seção é ocultada ✅ Atendido

Referências

Documentos Relacionados

  • docs/OCULTACAO-CAMPOS-ITEM-TERCEIRO.md (padrão similar de ocultação condicional)
  • docs/POLITICA_VENDA_NATUREZA_OPERACAO.md (configuração de naturezas)

Contatos

  • Desenvolvedor: Claude Code + Bruno Martins
  • Data de Implementação: 2025-11-14
  • Cliente: Nelmetais
  • Solicitante: Pamela Silva Filomeno (via Jira)

Notas Adicionais

Melhorias Futuras

💡 Sugestões para próximas iterações:

  1. Função helper reutilizável:

    function toggleSecaoCondicional(selectorBotao, selectorSecao, exibir) {
        $(selectorBotao).toggle(exibir);
        $(selectorSecao).toggle(exibir);
    }
    
    // Uso
    toggleSecaoCondicional(
        '#mostrarOcultarAgrupamentoFormaPagamento',
        '#agrupamentoFormaPagamento',
        naturezaOperacao.solicitarFormaPagamento
    );
    

  2. Aplicar mesmo padrão em outras seções: Várias seções do pedido são condicionais. Podemos padronizar usando o mesmo approach.

  3. Testes automatizados: Implementar testes E2E com Playwright/Selenium para validar automaticamente.

  4. Animação suave: Adicionar efeito fade ao ocultar/exibir para melhor UX:

    $('#elemento').fadeOut(200); // ou .fadeIn(200)
    

Histórico de Mudanças

Data Versão Alteração Autor
2025-11-14 1.0 Implementação inicial da funcionalidade Claude Code + Bruno Martins

Última atualização: 2025-11-14 Versão do documento: 1.0 Status: ✅ Implementado e documentado