# v0.1.6

**Data de lançamento:** 3 de maio de 2026

## Novas Funcionalidades

### Reduções de Preço em Conformidade com a UE
- Os produtos têm uma nova opção "Mostrar preço anterior" no formulário do produto para optar pela exibição de uma redução de preço
- O preço riscado na loja agora utiliza o menor preço dos últimos 30 dias, conforme a Diretiva Omnibus da UE — e não o preço anterior inserido manualmente
- O formulário do produto avisa quando nenhuma badge de promoção será exibida (porque o preço atual não é menor que o mínimo de 30 dias), para que os admins saibam que a redução não aparecerá
- As alterações de preço são registradas automaticamente e um cron semanal remove o histórico com mais de 90 dias

### Preço Unitário
- Os produtos agora podem declarar uma quantidade e uma unidade (kg, g, L, ml, m, cm, m²), e a loja exibe uma linha "por kg" / "por L" / etc. abaixo do preço nos cards, na página do produto, na coleção e na busca
- Produtos vendidos por unidade ("por item") estão isentos do preço unitário, conforme exigido pela diretiva
- O preço unitário é exportado para o feed do Google Merchant como `unit_pricing_measure` e `unit_pricing_base_measure`

### Preços com Imposto Incluído na Loja
- Todos os preços exibidos na loja (cards, página de produto, carrinho, checkout, e-mails de pedido) agora sempre incluem o imposto, conforme exigido para vendas B2C na UE
- A página do produto exibe um aviso quando uma regra de imposto possui sobreposições por país, sinalizando que o valor final pode ser recalculado no checkout assim que o país de cobrança do cliente for conhecido
- O formulário de produto do admin tem uma nova prévia de imposto que mostra o que cada país será cobrado quando uma regra de imposto possui sobreposições por país

### Endereço de Cobrança no Checkout
- O fluxo de checkout tem uma nova etapa de endereço de cobrança: manter o endereço de entrega (padrão), escolher um endereço salvo ou inserir um novo
- Os clientes podem opcionalmente salvar um endereço de cobrança personalizado em sua agenda para pedidos futuros
- Alterar o país de cobrança limpa o método de pagamento selecionado e qualquer Stripe PaymentIntent em andamento, para que os impostos sejam recalculados para o novo país
- Os e-mails de confirmação de pedido e a página de histórico de pedidos do cliente exibem os endereços de entrega e cobrança separadamente quando são diferentes
- A visualização administrativa do pedido mostra entrega e cobrança lado a lado

## Melhorias

### Dashboard de Analytics
- As tabelas nas páginas de Tráfego, Produtos e Carrinhos Abandonados agora usam paginação no servidor, mantendo lojas grandes responsivas
- A interface do gráfico de funil foi refinada para uma visualização mais clara dos pontos de abandono
- As sessões de admins autenticados são excluídas do analytics para que os números reflitam a atividade real dos clientes
- Os caminhos de página são normalizados para que a mesma página lógica não se fragmente em várias linhas

### Pedidos
- Novo filtro de origem do pedido na lista de pedidos separa os pedidos de checkout dos pedidos criados manualmente
- A criação de pedidos manuais bloqueia e-mails de placeholder quando um e-mail real do cliente está disponível, garantindo que as notificações cheguem à caixa certa

### Onboarding
- A etapa de Idiomas agora pré-seleciona Inglês, Espanhol, Holandês e Português (antes apenas Inglês); os admins ainda podem ajustar a lista

### Estabilidade do Checkout
- Locks consultivos e atualizações de snapshot serializáveis protegem ações concorrentes de checkout contra condições de corrida
- As datas no seletor de data do checkout e nos e-mails de pedido agora respeitam o locale do cliente

### Envio e Locale
- Os limites mínimos de pedido para envio agora são comparados com o subtotal + imposto menos qualquer desconto de mercadoria, alinhado ao que o cliente vê no resumo do pedido (cupons exclusivos de envio são excluídos do desconto)
- As páginas da loja renderizadas no servidor e os e-mails de pedido resolvem o idioma pela preferência salva do cliente, depois pelo cookie `locale`, depois pelo primeiro idioma habilitado pela loja, com fallback para Inglês — assim, um cookie desatualizado não renderiza mais um idioma que a loja tenha desativado

### Operações
- Uma nova variável de ambiente opcional `ENABLE_AUTH_RATE_LIMIT` permite que operadores desativem o rate limit do Better Auth em ambientes de CI e teste; o comportamento em produção permanece inalterado a menos que a variável seja explicitamente definida

## Correções de Bugs

- A mesclagem de carrinhos agora valida o estoque para ambos os lados e notifica os clientes quando as quantidades são ajustadas
- Um toast de aviso é exibido dois minutos antes da expiração da reserva do carrinho
- Os handlers de webhook do Stripe (sucesso e falha) agora são idempotentes e usam guards atômicos para evitar processamento duplicado
- Aplicar e remover cupons é serializado pelo lock do checkout; cupons de uso único por cliente não contam mais pedidos cancelados ou com falha de pagamento
- A revalidação de cupons de envio é ignorada quando o cliente troca de país antes de escolher um método de envio
- O cohort do visitante é persistido no snapshot do pedido para que os eventos de compra do servidor permaneçam no cohort correto
- O botão Cancelar no formulário de edição de usuário agora redefine os campos sem deixá-los marcados como modificados

## Correções de Segurança

- O canal do iframe do page builder agora está restrito a postMessage de mesma origem
- As operações PATCH e DELETE de endereço agora são vinculadas à propriedade no nível SQL
- Rate limit por IP é aplicado no endpoint de webhook do Stripe
- As queries agregadas de analytics agora usam chamadas parametrizadas de `make_interval()` em vez de interpolação de string
- A tolerância de timestamp do `constructEvent` do Stripe está fixada em 300 segundos
- `Order.stripePaymentIntentId` agora tem um índice único e o webhook usa `findUnique` por segurança
