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)
Fluxo Completo
- Usuário digita códigos de pedidos separados por vírgula
- Controller (
OrdemCompraController.cs:93-108) recebe o formulário - ViewModel processa e valida os códigos, gerando lista de IDs
- AutoMapper mapeia para
OrdemCompraFiltro - Repository executa query com filtro
PedidoIds - Resultado retorna ordens de compra que têm itens vinculados aos pedidos
Arquivos Relacionados
Frontend
src/Nelmetais.SGE.WebApp/Areas/Comercial/Views/OrdemCompra/Index.cshtmlsrc/Nelmetais.SGE.WebApp/Areas/Comercial/Views/OrdemCompra/Shared/_FiltroPartial.cshtml
Backend
src/Nelmetais.SGE.WebApp/Areas/Comercial/ViewModels/OrdemCompraFiltroViewModel.cssrc/Nelmetais.SGE.WebApp/Areas/Comercial/Controllers/OrdemCompraController.cssrc/Nelmetais.SGE.Business/Models/Comercial/OrdemCompraFiltro.cssrc/Nelmetais.SGE.Data/Repositories/Comercial/OrdemCompraRepository.cs
Observações
- O filtro usa operador
Contains(SQLIN), permitindo busca por múltiplos pedidos - O regex remove caracteres não numéricos, mas pode causar problemas com separadores não convencionais
- A consulta é case-sensitive para IDs (valores numéricos)
- Se nenhum pedido válido for informado, o filtro não é aplicado
- 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
- Cliente faz Pedido #32
- Sistema gera Ordem de Compra #19 para comprar material do fornecedor
- 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