# Política de Impressão Unificada

Esta documentação descreve o novo controle de impressão adotado em todos os módulos do sistema para evitar múltiplas impressões indesejadas e manter comportamento consistente.

## Objetivos
- Garantir **uma única impressão por padrão** para qualquer documento.
- Permitir **impressões múltiplas apenas quando explicitamente solicitado**.
- Implementar um mecanismo de controle que:
  - Verifique a **quantidade solicitada** antes de imprimir.
  - **Evite duplicação** acidental de comandos de impressão.
  - **Mantenha consistência** em todos os módulos.

## Implementação

Foi criado o util global `PrintControl` em `public/js/print-control.js` com as seguintes funções:

- `PrintControl.safePrint({ copies = 1, lockMs = 2000 })`
  - Executa `window.print()` com trava de concorrência e suporta múltiplas cópias (chamadas repetidas com intervalo curto).
  - Se outra impressão estiver em andamento, ignora chamadas duplicadas e registra `console.warn`.

- `PrintControl.safeWindowPrint(win, { copies = 1, lockMs = 2000 })`
  - Imprime o conteúdo de uma janela/pop-up (`win.print()`), com fallback para `window.print()` e controle de cópias.
  - Fecha a janela ao final.

- `PrintControl.bindOnce(el, event, handler)`
  - Garante que handlers não sejam anexados múltiplas vezes ao mesmo elemento.

Além disso, foi disponibilizado o helper `safePrint(copies)` para uso direto em `onclick`.

## Alterações nos módulos

- Inclusão do script global no layout: `views/_layout.php` adiciona `<script src="/js/print-control.js" defer></script>`.
- `views/vendas/pedidos/create.php`: botão de impressão agora usa `safePrint(1)`.
- `views/vendas/pedidos/index.php`: impressão de modais usa `PrintControl.safePrint` e botões gerados usam `safePrint(1)`.
- `views/vendas/orcamentos/create.php`: botão de impressão da pré-visualização usa `safePrint(1)`.
- `views/fiscal/preview.php`: uso de `PrintControl.safePrint` no fluxo de impressão.
- `views/admin/tenants.php`: função de impressão de tabela usa `PrintControl.safeWindowPrint`.
- `views/produtos/create.php`: impressão do overlay usa `PrintControl.safeWindowPrint`.
- `views/vendas/orcamentos/index.php`: inclui `print-control.js` por ser página standalone.

## Testes e validação

- Verificar que um clique no botão “Imprimir” resulta em **apenas uma impressão**.
- Testar múltiplas impressões passando `copies > 1` em chamadas programáticas onde aplicável.
- Confirmar que cliques repetidos rápidos não disparam impressões duplicadas (trava ativa por ~2s).
- Verificar consistência do comportamento nas páginas listadas acima.

## Layout NF-e (DANFE)

Os orçamentos e pedidos seguem layout inspirado no DANFE via `NFePDF` para PDF quando aplicável. O controle de impressão não altera o layout, apenas a forma segura de dispará-lo.

## Observações

- Browsers não suportam definir número de cópias sem interação; ao solicitar múltiplas cópias via loop, o diálogo pode aparecer mais de uma vez.
- Para múltiplas cópias em única interação, o usuário deve ajustar a quantidade no diálogo de impressão.