# BOAT Brasil — Relatórios PHP

Sistema preparado a partir do arquivo Dados.MDB fornecido em 06/11/2026.

## O que está pronto

- Estoque atual com código, nome, saldo, mínimo, reposição, custo, preço, valores totais, grupo e localização.
- Peças sem saída, com filtros de mais de 1 ano, mais de 6 anos e sem data conhecida.
- Filtro de tempo pela última compra/entrada ou última saída conhecida.
- Estoque crítico: saldo menor ou igual ao mínimo, incluindo saldo negativo e mínimo zero.
- Clientes ativos/inativos no intervalo, padrão últimos 12 meses; clientes sem compras no histórico.
- Contatos com telefone, celular, link WhatsApp, e-mail e e-mail de NF-e.
- Vendas por período e cliente, ranking de clientes e peças vendidas.
- Busca, grupo, ordenação, paginação, CSV para Excel e impressão/PDF pelo navegador.
- Login com senha escolhida na instalação; sessão expira após 30 minutos sem atividade.
- Importação autenticada para atualizar a base de relatórios.

A pasta data já inclui a cópia SQLite com 3.631 itens, 2.122 clientes, 10.916 vendas e os movimentos usados pelos relatórios. A última venda da cópia é de 05/11/2026. Nenhuma alteração foi feita no MDB original. Não é preciso enviar o MDB nem sua senha à VPS.

## Instalação em VPS Linux da HostGator — Docker

Pré-requisito: Docker Engine com o plugin Compose já instalado e acesso SSH à sua VPS. O pacote não instala Docker nem altera sites existentes automaticamente.

1. Extraia a pasta boat-relatorios e envie-a por SFTP para uma pasta da VPS, por exemplo /opt/boat-relatorios. Inclua a pasta data.
2. Pelo SSH, execute:

```sh
cd /opt/boat-relatorios
docker compose up -d --build
docker compose logs --tail=50
```

O serviço atende em 127.0.0.1:8080 somente na VPS. Os relatórios usam PHP/Apache; a base permanece na pasta data, fora da imagem Docker, inclusive após recriar o container.

3. Configure um subdomínio exclusivo, como relatorios.seudominio.com.br, com HTTPS e proxy para http://127.0.0.1:8080. O arquivo deploy/nginx-proxy.conf.example mostra o trecho para um proxy Nginx existente. Acrescente-o ao bloco HTTPS do subdomínio, sem substituir configurações de outros sites. Em VPS com WHM/cPanel, faça a configuração pelo administrador/painel compatível com sua instalação, pois o painel pode sobrescrever arquivos manuais.
4. Abra o endereço HTTPS. Na primeira tela use o código de instalação abaixo e crie o usuário e a senha (mínimo de 12 caracteres).

Código de instalação desta cópia:

```text
6r05EJ9oh7PUfnnuApvQ7SWQR3sQ7iJ4
```

O código não é a senha do banco. Guarde este arquivo e o ZIP em local privado. Depois da criação do usuário, a instalação fica bloqueada pelo arquivo data/auth.php.

### Alternativa: PHP já instalado na VPS

Requisitos: PHP 8.2 ou superior com PDO, pdo_sqlite, session, filter e ctype. Configure os limites de deploy/php.ini no PHP utilizado pelo site: upload 40 MB, post 45 MB, memória 256 MB e execução 180 segundos. O modo de implantação depende do sistema operacional/painel da VPS.

- Aponte o DocumentRoot do domínio para boat-relatorios/public.
- app, scripts, data e config.php devem ficar fora da raiz pública.
- O usuário do PHP precisa ler o código e gravar na pasta data. No Apache Debian/Ubuntu típico, o usuário é www-data; ajuste ao usuário real do seu servidor. Não use permissões 777.
- Existe um .htaccess de fallback na raiz para Apache com mod_rewrite/AllowOverride. Prefira DocumentRoot em public. Nginx não lê .htaccess.
- Antes de abrir o domínio para uso, verifique que /data/reports.sqlite, /config.php e /app/schema.json retornam 403 ou 404.
- Acesse o domínio com HTTPS e conclua a instalação com o código acima.

## Atualização dos dados

Os relatórios consultam uma cópia. Alterações no programa de estoque não aparecem na VPS até uma nova importação. Exporte uma cópia consistente do MDB, preferencialmente produzida pelo backup do sistema ou com o programa fechado.

### No Mac — Java 8 ou superior

O exportador e suas bibliotecas estão incluídos; não exige Microsoft Access nem envio do banco para terceiros. Para este MDB Jet, a biblioteca consegue ler os dados em modo somente leitura sem solicitar a senha de abertura. Isso não altera nem remove a senha do arquivo original. Não pressupõe suporte a outros bancos Access criptografados.

No Terminal, dentro da pasta extraída:

```sh
bash scripts/exportar-mac.sh "/Users/denilson/Downloads/BOAT_BRASIL/Dados/Dados.MDB" "$PWD/exportacao-atualizada.json"
```

O destino não pode existir; use outro nome a cada exportação. Na VPS, entre no sistema → Atualizar base de relatórios → selecione o JSON → Importar e atualizar. O programa valida todas as tabelas antes de substituir a cópia. Se a importação falhar, a base anterior permanece.

### No Windows — PowerShell e driver ACE

Mantenha scripts e app/schema.json na estrutura fornecida. Execute no PowerShell:

```powershell
.\scripts\Exportar-Access.ps1 -Banco "C:\BOAT_BRASIL\Dados\Dados.MDB" -Destino "C:\BOAT_BRASIL\exportacao-atualizada.json"
```

A senha é solicitada com entrada oculta, usada em memória e não gravada no JSON. O Microsoft Access Database Engine (ACE) precisa estar instalado e ter a mesma arquitetura do PowerShell. Este exportador foi revisado, mas não executado em Windows nesta entrega. Como alternativa, o exportador Java também funciona em Windows usando ponto e vírgula no classpath.

### Importação pelo terminal da VPS

Depois de enviar o JSON por SFTP para uma pasta privada:

```sh
# Sem Docker: execute como o usuário que mantém a base de relatórios.
php scripts/importar.php /caminho/privado/exportacao.json
```

Na implantação Docker use a importação pela tela; scripts locais não são copiados para a imagem. Faça backup da pasta data antes de substituir uma base válida. O JSON contém contatos e valores comerciais; remova cópias temporárias depois da importação.

## Critérios de cálculo

- Vendas: fonte VENDAS. Padrão SITUACAO_V=1, canceladas sempre excluídas. O filtro também permite situação 0 e todas não canceladas. Os nomes desses estados foram inferidos dos códigos e devem ser conferidos com o programa original antes de uso contábil.
- Total vendido: campo TOTAL. TOTAL_GERAL está vazio na cópia analisada. Desconto é exibido como dado cadastrado, sem assumir valor ou percentual.
- NF-e, NFC-e, orçamentos e ordens de serviço não são somados às vendas para evitar duplicação. OS só participam do critério de última saída de peças, conforme abaixo.
- Última saída conhecida: maior data entre ULTIMA_VENDA do item, venda finalizada de peça, ITENS_SAIDA e aplicação em OS_PECAS com quantidade positiva. Uma aplicação em OS pode ter data anterior ao encerramento da ordem; o cadastro pode refletir operações de outras origens.
- Última compra/entrada: maior data entre ULTIMA_COMPRA e ITENS_ENTRADA com quantidade positiva. NÃO representa a idade de cada lote físico. O histórico de ITENS_ENTRADA começa em 26/02/2026; movimentações antigas podem existir apenas no cadastro.
- Datas ausentes não são tratadas como peças com mais de 6 anos. Use “Sem registro de data” para listá-las. Na tela Peças sem saída, a opção padrão aplica mais de 1 ano; é possível selecionar o critério de entrada explicitamente.
- Estoque é sempre o saldo ATUAL importado; não se reconstrói saldo histórico de anos anteriores.
- Clientes ativos: pelo menos uma venda finalizada não cancelada no intervalo. Inativos: nenhuma, incluindo clientes sem compra. Não depende do bloqueio/situação cadastral nem de OS.
- WhatsApp: link construído com o celular informado; não confirma conta ativa nem envia mensagens automaticamente.
- CSV inclui todos os resultados filtrados. Valores têm vírgula decimal e colunas separadas por ponto e vírgula. Campos potencialmente interpretados como fórmula recebem proteção; códigos com zeros à esquerda devem ser importados no Excel como texto.
- Impressão/PDF inclui todos os resultados e os filtros. Para tabelas extensas, use paisagem; a folha sugerida pelo CSS é A3. A exportação nativa é CSV, não XLSX; o PDF é gerado pelo navegador.

## Manutenção

- Backup: preserve data/reports.sqlite, data/auth.php e config.php em local privado. Atualizações pelo painel não preservam uma segunda cópia histórica automática.
- Login: usuário único administrativo. Para redefinir o acesso, o administrador da VPS pode mover data/auth.php para um backup privado e refazer a instalação com o código. Não existe recuperação por e-mail nem cadastro público.
- A VPS não precisa de MySQL. O MDB original não é modificado; o sistema não faz cadastro ou baixa de estoque.
- A sincronização automática não está configurada. Ela depende de onde o programa original roda e do acesso de rede disponível.
- Fonte PHP pronta e testada localmente. O Dockerfile e os exemplos de servidor não foram executados na VPS; publicação e SSL dependem do domínio e do acesso ao servidor.

## Verificação local

```sh
php tests/reports.php
php -c deploy/php.ini -S 127.0.0.1:8080 -t public
```

Os testes incluem totais independentes, intervalo inclusivo, cancelamentos, estoque negativo, datas desconhecidas e preservação da base em importação inválida. A checagem de 3.631 itens refere-se à cópia inicial desta entrega; ajuste essa expectativa se substituir a base.

## Dependências

PHP PDO_SQLITE: https://www.php.net/manual/en/ref.pdo-sqlite.php
Imagem PHP oficial: https://hub.docker.com/_/php
Jackcess 4.0.8, Commons Lang 3.10 e Commons Logging 1.2: bibliotecas Java incluídas em scripts/lib, com avisos e licenças Apache 2.0. ExportAccess.java é o fonte do exportador; ExportAccess.class já vem compilado para Java 8.
