## PDV

Preciso que crie uma tela de PDV (Ponto de Venda) para um sistema de vendas

A tela de PDV deve ter duas variações

Uma focada em vendas de supermercados

Essa: 
Tela inicial deve ser com base nessa imagem: ![PDV Variação 1](image.png)

Basicamente na tela vai ter uma area para pesquisar o produto na venda e um numero indicador de quantidade, abaixo opções como sair, pagar e ajuda

O destaque dessa variação 1 é que ele pode ser 100% usada sem precisar de um mouse, ou seja, toda a navegação pode ser feita via teclado.

ao entrar na tela tudo que for digitado no teclado deve ir para a pesquisa de produtos, e ao apertar enter, o produto pesquisado caso encontre apenas um resultado será adicionado automaticamente à venda se houver mais produto deve ser exibida uma lista para o usuário selecionar o produto desejado.

Como na imagem: ![Lista Produto](image-1.png)

Ao selecionar o produto desejado deve aparecer uma opção de quantidade como na imagem: ![Quantidade Produto](image-2.png)


Existe tbm o modo quantidade aplicada, onde ao usar o usuário o indicador de quantidade é atualizado automaticamente, e o usuário pode ir adicionando produtos sem precisar selecionar a quantidade manualmente, esse modo deve ser adiconado atráves de algum atalho de teclado, como por exemplo, pressionando a tecla "CTRL + Q" para ativar o modo quantidade aplicada. Quando esse modo estiver ativo, ao adicionar um produto, a quantidade será incrementada automaticamente com base no indicador de quantidade atual, uma vez que adiconado o o produto, o indicador de quantidade deve ser resetado para 1, e o usuário pode continuar adicionando produtos normalmente.

## Pagamento

uma vez que tenha produto na venda pode ser realizado o pagamento, ao clicar no botão de pagamento, deve ser exibida uma tela com base em:

![Tela de Pagamento](image-3.png)

nessa tela de pagemento deve ter botões para cada forma de pagamento que vem do cadastro de pagamento marcada como mostrar no PDV, e ao clicar em uma forma de pagamento, deve ser exibido um campo para digitar o valor pago, e um botão para finalizar a venda.

O usuário pode adicionar mais de uma forma de pagamento, e o sistema deve calcular automaticamente o valor restante a ser pago, exibindo o valor total da venda, o valor pago e o valor restante.

Na imagem tem informações de nota fiscal, mas isso é apenas ilustrativo, não precisa ser implementado.

Tem opções de desconto, pode ser em percentual ou valor fixo, e o sistema deve recalcular o valor total da venda com base no desconto aplicado.

Se o usuário digitar o percentual deve calcular o valor do desconto em real e mostrar no input de desconto em valor fixo, e se digitar o valor fixo deve calcular o percentual e mostrar no input de desconto em percentual.

## Banco de dados

Ainda não tem tabela para isso, vc pode criar as tabelas necessárias para armazenar as informações de produtos, vendas, formas de pagamento e descontos.

Guarde todas as alterações de banco em [Database](c:/devilbox/data/www/projetos/htdocs/logiccom/back/Database/) 

---

## Resposta

Implementada a tela de PDV com duas variacoes no frontend e finalizacao de venda no backend.

Frontend:

- `front/src/views/app/pdv/PdvView.vue`
  - Variacao Supermercado com foco em teclado.
  - Variacao Balcao compacta, usando a mesma regra de carrinho e pagamento.
  - Pesquisa por produto com Enter.
  - Lista de selecao quando houver multiplos produtos.
  - Dialog de quantidade quando o modo quantidade aplicada nao estiver ativo.
  - Modo quantidade aplicada via `CTRL + Q`, com reset para `1X` apos adicionar produto.
  - Tela de pagamento com formas marcadas como `mostrar_pdv = S` e `status = A`.
  - Pagamentos multiplos, desconto por valor ou percentual, falta pagar e troco.
- `front/src/services/pdvService.ts`
- Rota/menu `PDV` adicionados em `front/src/router/routes.ts`.
- Prompt registrado em `front/src/assets/prompts/16-pdv.md`.

Backend:

- `back/Database/2026_07_02_create_logic_vendas_pdv.sql`
  - `logic_vendas`
  - `logic_venda_itens`
  - `logic_venda_pagamentos`
- `back/Models/VendasModel.php`
- `back/Controllers/VendasController.php`
- Rota privada `/private/vendas` adicionada em `back/Routers/Routers.php`.

Observacao tecnica:

- Produtos e formas de pagamento foram reaproveitados dos cadastros existentes.
- O backend recalcula subtotal, desconto, total, total pago e troco antes de gravar.
- Nao foi implementada baixa automatica de estoque, pois o prompt nao definiu essa regra de negocio.

---

## Ajuste de layout e rotas

Alterado o PDV para tela cheia standalone:

- Removida a selecao visual de variacao dentro da tela.
- Removido o badge de quantidade manual/aplicada do topo.
- Criadas rotas protegidas fora do layout padrao:
  - `/pdv/1` para a variacao Supermercado.
  - `/pdv/2` para a variacao Balcao.
- O PDV agora e renderizado fora de `AppContainer`, sem Header, Sidebar e Footer.
- A tela usa `100vw` x `100vh` com scroll global bloqueado.
- Na variacao Supermercado, o scroll fica apenas na area da tabela de itens da venda.
- Na variacao Balcao, o scroll fica apenas na lista de itens da venda.

---

## Ajuste da pesquisa por teclado

Alterada a area de pesquisa do PDV:

- Removido o `input` HTML real usado na pesquisa.
- A area agora e um elemento visual focavel que simula um input.
- A digitacao e alimentada exclusivamente pelo listener global de teclado.
- Teclas comuns sao adicionadas ao buffer de pesquisa.
- Atalhos e acoes como `Enter`, `Backspace`, `CTRL + Q`, `F4` e `F10` continuam tratados separadamente.

---

## Ajuste de navegacao nos itens da venda

Adicionada navegacao por teclado para itens ja inseridos na venda:

- `ArrowUp` e `ArrowDown` navegam entre os itens.
- O item ativo fica destacado visualmente.
- `ArrowLeft` diminui a quantidade do item selecionado.
- `ArrowRight` aumenta a quantidade do item selecionado.
- `Delete` remove o item selecionado.
- A regra foi aplicada nas variacoes `/pdv/1` e `/pdv/2`.

---

## Ajuste de quantidade minima

Alterada a reducao de quantidade nos itens da venda:

- `ArrowLeft` nao remove mais o item ao chegar em `1`.
- A quantidade minima do item e `1`.
- A remocao do item deve acontecer apenas por `Delete` ou pela acao explicita de lixeira.

---

## Ajuste de isolamento dos dialogs

Reforcado o comportamento dos dialogs:

- No dialog de quantidade, `ArrowUp` e `ArrowRight` aumentam a quantidade pendente.
- No dialog de quantidade, `ArrowDown` e `ArrowLeft` diminuem a quantidade pendente.
- Essas setas nao alteram a quantidade de item ja adicionado na venda.
- Enquanto qualquer dialog estiver aberto, o listener global nao executa acoes do carrinho ou da pesquisa por tras.
- O dialog de ajuda tambem passa a consumir teclado; `Enter` ou `Escape` fecham a ajuda.

---

## Ajuste de previa do produto

Adicionado card no dialog de quantidade:

- Exibe imagem/preview do produto selecionado.
- Exibe nome, marca, codigo, unidade, estoque e preco.
- Mantem os controles de quantidade abaixo da previa.

---

## Ajuste de cores do sistema

Removidas cores azuis herdadas da imagem de referencia:

- Indicador de quantidade passou a usar `var(--primary)`.
- Area visual de pesquisa passou a usar `var(--primary)`.
- Estados de foco/hover usam `var(--primary-hover)`.
- Faixa alternada da lista de produtos usa tom leve baseado em `var(--primary)`.
- As imagens de referencia devem orientar layout e fluxo, nao a paleta visual.

---

## Ajuste de imagem dos itens

Alterada exibicao de imagens nos itens do PDV:

- A listagem de itens da venda agora mostra miniatura do produto.
- Se o produto possuir imagem cadastrada, usa a imagem do produto.
- Se nao possuir imagem, usa `front/src/assets/images/no_logo.png`.
- O mesmo fallback e usado nas previas/listas do PDV.

---

## Ajuste do valor no pagamento

Prompt:

- Na tela de pagamento do PDV, o valor nao deve mais ficar em um input no dialog principal.
- Ao selecionar uma forma de pagamento, o dialog de pagamento deve fechar momentaneamente e abrir um dialog separado de valor.
- O dialog de valor deve usar uma area que simula input, capturando os numeros digitados pelo teclado e exibindo o valor sempre formatado como moeda.
- As setas devem aumentar ou diminuir o valor.
- Ao confirmar o valor, o dialog de valor deve fechar e o dialog de pagamento deve voltar exibindo o pagamento informado.

Resposta:

- Removido o input de valor pago do dialog principal de pagamento.
- A selecao de forma de pagamento agora abre um dialog separado para informar o valor.
- O novo dialog usa uma area focavel que simula input e exibe o valor com `formatMoney`.
- Teclas numericas preenchem o valor, virgula/ponto permitem centavos, `Backspace` remove caracteres, `Delete` limpa o valor e `Enter` adiciona o pagamento.
- `ArrowUp`/`ArrowRight` aumentam o valor em R$ 1,00; `ArrowDown`/`ArrowLeft` diminuem o valor em R$ 1,00.
- Apos adicionar o pagamento, o dialog principal reabre com o pagamento listado e os totais recalculados.

---

## Ajuste de navegacao nos pagamentos

Prompt:

- No dialog de pagamento, as setas devem navegar entre os pagamentos ja adicionados.
- No dialog de pagamento, a tecla `Delete` deve apagar uma forma de pagamento.

Resposta:

- Adicionado controle de pagamento selecionado no dialog principal de pagamento.
- `ArrowUp`/`ArrowLeft` selecionam o pagamento anterior.
- `ArrowDown`/`ArrowRight` selecionam o proximo pagamento.
- `Delete` remove o pagamento selecionado e recalcula os totais.
- A linha selecionada ganhou destaque visual e tambem pode ser selecionada com clique.
- O comportamento nao afeta o dialog separado de valor, onde as setas continuam aumentando ou diminuindo o valor digitado.
