# Liberação de Pré-faturas na Finalização da Embalagem

## Context

O painel lateral de finalização da embalagem de expedição já agrupa os itens por pré-fatura. Atualmente, finalizar a embalagem altera somente a própria embalagem; a liberação da pré-fatura para faturamento é feita em outro fluxo.

## Goals

- Permitir que o usuário escolha uma ou mais pré-faturas da embalagem para liberação.
- Manter a listagem e o agrupamento de itens existentes.
- Finalizar a embalagem e liberar as pré-faturas selecionadas como uma única operação consistente.
- Manter o texto do botão principal como `Finalizar`.

## Non-Goals

- Liberar automaticamente todas as pré-faturas.
- Alterar a apresentação dos itens da embalagem.
- Permitir a liberação de uma pré-fatura que não esteja na situação `Separada`.
- Criar um novo fluxo de faturamento ou alterar a conclusão no ERP.

## Recommended Approach

Adicionar um checkbox ao cabeçalho de cada pré-fatura já renderizada no painel. Nenhuma opção inicia selecionada. O rodapé informa quantas pré-faturas serão liberadas e mantém o botão `Finalizar`.

O frontend envia os IDs dos `StockIO` selecionados no mesmo request que finaliza a embalagem. O backend valida o vínculo de todos os IDs com a embalagem e a situação de cada pré-fatura, executando as mudanças dentro de uma transação.

## Design

- Cada agrupamento de pré-fatura recebe um checkbox associado ao seu `StockIO`.
- A seleção é exibida somente para perfis que já possuem permissão de liberar pré-faturas para faturamento.
- Pré-faturas na situação `Separada` podem ser selecionadas.
- Pré-faturas em outras situações apresentam sua situação e não podem ser selecionadas.
- O resumo próximo à ação final mostra `N pré-fatura(s) serão liberadas`.
- A finalização sem seleção continua válida e apenas conclui a embalagem.
- O request de finalização aceita `stock_io_ids`, um array opcional de IDs únicos.
- O backend obtém as pré-faturas através dos produtos da própria embalagem; nenhum ID enviado pelo cliente é aceito apenas por existir.
- Para cada pré-fatura selecionada, o serviço existente de liberação é reutilizado.
- A observação e a conclusão da embalagem fazem parte da mesma transação das liberações.

## Error Handling

- IDs inexistentes ou que não pertencem à embalagem invalidam todo o request.
- Uma pré-fatura selecionada que não esteja `Separada` impede toda a operação.
- Em qualquer falha, a embalagem permanece aberta e nenhuma pré-fatura muda de situação.
- O frontend mantém o painel aberto, preserva as seleções e reabilita o botão para nova tentativa.
- Cliques repetidos durante o processamento são bloqueados.

## Testing

- Finalizar sem selecionar pré-faturas.
- Finalizar liberando uma ou mais pré-faturas pertencentes à embalagem.
- Rejeitar IDs que não pertencem à embalagem.
- Rejeitar pré-faturas que não estejam `Separadas` e comprovar rollback.
- Garantir que pré-faturas duplicadas nos produtos apareçam apenas uma vez.
- Verificar seleção, contagem e payload no frontend.
- Verificar que o botão principal continua exibindo somente `Finalizar`.

## Open Questions

Nenhuma.
