# ENG-1399 - Filtros na consulta de tarefas de entrada

## Contexto

A tela `/tarefas/entradas` usa `DefaultPickingOrders` e consulta tarefas pelo endpoint V2 `GET /api/v2/stock/picking-order`. O filtro atual possui situação, responsável e datas, mas não permite localizar tarefas por produto ou pelo número da nota fiscal.

## Escopo

Adicionar dois filtros à tela de tarefas de entrada:

- Produto selecionado individualmente, com as opções já oferecidas pelo padrão de consulta de produtos: código de referência, descrição, derivação, código do produto, código de barras e ID.
- Número exato da NF, usando `invoice_number` armazenado na integração da entrada.

Os filtros devem funcionar cumulativamente com os filtros existentes. A busca de produto deve considerar tanto tarefas ligadas diretamente à entrada quanto tarefas ligadas indiretamente por `stock_io_products`.

Fora de escopo:

- Busca pela chave da NF (`invoice_key`).
- Seleção simultânea de vários produtos.
- Filtro parcial ou aproximado para o número da NF.
- Criação de novo endpoint.

## Abordagem aprovada

Estender o fluxo V2 já usado pela tela:

1. `DefaultPickingOrders` informa o tipo da tarefa ao componente `PickingOrderFilters`.
2. `PickingOrderFilters` reutiliza `ProductSearch` com seleção única e adiciona um campo textual para `invoice_number`.
3. Os parâmetros `product_id` e `invoice_number` são enviados para `GET /api/v2/stock/picking-order`.
4. `PickingOrderSearchRequest` valida os parâmetros.
5. `PickingOrderSearchDTO` os transporta para o domínio.
6. `PickingOrderQueryBuilder` aplica os filtros nos caminhos direto e indireto da associação entre tarefa e entrada.
7. Os filtros da tela são persistidos em `PageEnum.TAREFAS_ENTRADAS`, sem compartilhar o storage destinado às tarefas de saída.

## Fluxo de consulta

Para o caminho direto, a tarefa deve satisfazer `picking_orders.stock_io_id` e os filtros da entrada relacionada. Para o caminho indireto, a tarefa deve satisfazer a relação por `stock_io_products`, aplicando produto e NF dentro da entrada relacionada ao produto.

O filtro da NF compara exatamente `stock_ios.integration.parameters->invoice_number`. O filtro de produto compara `stock_io_products.product_id`.

Quando os dois filtros forem informados, ambos devem ser satisfeitos pelo mesmo caminho de associação. Produto ou NF sem correspondência retorna lista vazia, mantendo o comportamento atual.

## Validação e erros

- `product_id`: opcional, inteiro e existente em `products`.
- `invoice_number`: opcional, texto; comparação exata.
- Os filtros existentes permanecem inalterados.
- Erros seguem o tratamento HTTP já usado pela aplicação.

## Testes

Adicionar cobertura de backend para:

- tarefa direta encontrada pelo produto;
- tarefa indireta encontrada pelo produto;
- tarefa encontrada pelo número exato da NF;
- número parcial não retornando a NF;
- combinação produto + NF exigindo correspondência nos dois filtros;
- produto ou NF divergentes não retornando a tarefa;
- preservação dos filtros atuais;
- rejeição de produto inexistente e parâmetros inválidos.

Validar manualmente no frontend a seleção e remoção do produto, aplicação e limpeza dos filtros, persistência em `TAREFAS_ENTRADAS` e paginação com os parâmetros ativos.

## Risco

Uma tarefa pode possuir produtos de mais de uma entrada. A implementação deve preservar a associação atual entre tarefa e entrada, evitando que o produto venha de uma entrada e o número da NF de outra.
