Pular para conteúdo

Filtro "Códigos Pedidos" - Lista de Ordens de Compra

Visão Geral

O campo "Códigos Pedidos" na página de lista de ordens de compra (/comercial/lista-ordem-compra) permite filtrar ordens de compra que contêm itens vinculados a pedidos de venda específicos.

Localização

  • URL: http://localhost:8000/comercial/lista-ordem-compra
  • View: src/Nelmetais.SGE.WebApp/Areas/Comercial/Views/OrdemCompra/Shared/_FiltroPartial.cshtml
  • Linha: 43-48

Funcionalidade

Interface do Usuário

<label asp-for="Pedido" class="control-label"></label>
<input asp-for="Pedido" class="form-control" aria-describedby="ordens-compra-help" />
<small id="ordens-compra-help" class="form-text text-muted">
    Para buscar por várias pedidos, separe os códigos por vírgula.
</small>

Características: - Campo de texto livre - Aceita múltiplos códigos separados por vírgula - Exemplo de entrada: 32, 45, 78 ou 32,45,78

Processamento dos Dados

ViewModel (OrdemCompraFiltroViewModel.cs)

public List<int>? PedidoIds { get; set; }

[DisplayName("Códigos Pedidos")]
public string? Pedido
{
    get
    {
        if (PedidoIds?.Count > 0)
            return string.Join(",", PedidoIds);
        return string.Empty;
    }
    set
    {
        if (!string.IsNullOrEmpty(value))
        {
            PedidoIds = value
                .Split(',')
                .Select(s => Regex.Replace(s, @"[^\d]", ""))
                .Select(s => int.TryParse(s, out var x) ? x : -1)
                .Where(n => n > 0)
                .ToList();
        }
        else
            PedidoIds = new List<int>();
    }
}

Lógica de Processamento: 1. Divide a string por vírgulas (,) 2. Remove todos os caracteres não numéricos usando regex @"[^\d]" 3. Converte para inteiros 4. Filtra apenas valores positivos válidos 5. Armazena na lista PedidoIds

Exemplo de Transformação

Entrada Processamento Resultado
"32, 45, 78" Split → Regex → Parse [32, 45, 78]
"32,abc,45" Split → Regex → Parse → Filter [32, 45]
"32-45-78" Split → Regex → Parse [324578] (cuidado!)

Consulta no Banco de Dados

Repository (OrdemCompraRepository.cs:135-138)

if (filtro.PedidoIds?.Count > 0)
    ordens = ordens.Where(o => o.OrdemCompraItem != null
        && o.OrdemCompraItem.Any(item => item.PedidoItem != null
            && filtro.PedidoIds.Contains(item.PedidoItem.PedidoId)));

Estrutura de Dados

OrdemCompra (Ordem de Compra)
    └─ OrdemCompraItem (Itens da OC)
        └─ PedidoItem (Referência ao item do pedido)
            └─ PedidoId (ID do Pedido de Venda)

SQL Equivalente

SELECT DISTINCT oc.*
FROM "OrdemCompra" oc
INNER JOIN "OrdemCompraItem" oci ON oci."OrdemCompraId" = oc."Id"
INNER JOIN "PedidoItem" pi ON pi."Id" = oci."PedidoItemId"
WHERE oci."PedidoItemId" IS NOT NULL
  AND pi."PedidoId" IN (32, 45, 78);

O Que o Filtro Retorna

Retorna ordens de compra que possuem pelo menos um item vinculado a um pedido de venda cujo ID está na lista fornecida.

Importante: Uma ordem de compra será incluída no resultado se qualquer um dos seus itens estiver vinculado a um dos pedidos informados.

Exemplo Real no Banco de Dados

Dados de Exemplo

Entidade ID Dados
Ordem de Compra 19 Data: 05/11/2025
Fornecedor: CASA DA BOIA COM E IND DE METAIS LTDA
Pedido Vinculado 32 Data: 31/10/2025
Cliente: Cliente Teste Entelgy
Item 6 Mercadoria: B23T000 - BARRA BZ 23 - 3/8" (9,52MM)

Teste do Filtro

Entrada: Campo "Códigos Pedidos" = 32

Resultado Esperado: Ordem de Compra #19

Estatísticas Atuais (Base UAT)

Total de ordens de compra vinculadas a pedidos: 1
Total de pedidos vinculados: 1

Fluxo Completo

  1. Usuário digita códigos de pedidos separados por vírgula
  2. Controller (OrdemCompraController.cs:93-108) recebe o formulário
  3. ViewModel processa e valida os códigos, gerando lista de IDs
  4. AutoMapper mapeia para OrdemCompraFiltro
  5. Repository executa query com filtro PedidoIds
  6. Resultado retorna ordens de compra que têm itens vinculados aos pedidos

Arquivos Relacionados

Frontend

  • src/Nelmetais.SGE.WebApp/Areas/Comercial/Views/OrdemCompra/Index.cshtml
  • src/Nelmetais.SGE.WebApp/Areas/Comercial/Views/OrdemCompra/Shared/_FiltroPartial.cshtml

Backend

  • src/Nelmetais.SGE.WebApp/Areas/Comercial/ViewModels/OrdemCompraFiltroViewModel.cs
  • src/Nelmetais.SGE.WebApp/Areas/Comercial/Controllers/OrdemCompraController.cs
  • src/Nelmetais.SGE.Business/Models/Comercial/OrdemCompraFiltro.cs
  • src/Nelmetais.SGE.Data/Repositories/Comercial/OrdemCompraRepository.cs

Observações

  1. O filtro usa operador Contains (SQL IN), permitindo busca por múltiplos pedidos
  2. O regex remove caracteres não numéricos, mas pode causar problemas com separadores não convencionais
  3. A consulta é case-sensitive para IDs (valores numéricos)
  4. Se nenhum pedido válido for informado, o filtro não é aplicado
  5. O filtro busca por vinculação através de OrdemCompraItem.PedidoItemId

Casos de Uso

Rastreabilidade

Encontrar todas as ordens de compra geradas para atender pedidos de venda específicos.

Exemplo Prático

  1. Cliente faz Pedido #32
  2. Sistema gera Ordem de Compra #19 para comprar material do fornecedor
  3. Usuário pode filtrar por "Pedido 32" para encontrar a OC relacionada

Documentação gerada em: 11/11/2025 Versão do Sistema: SGE 3.0 Ambiente: UAT