# pharma-sync-agent

Agente Python que sincroniza o catálogo do **FarmaFácil** (PostgreSQL 9.3 no servidor Windows da farmácia) com o app **pharma_orcamentos** hospedado no VPS.

## Instalação na farmácia (Windows)

### 1. Pré-requisitos
- Windows Server com FarmaFácil instalado
- Acesso ao PostgreSQL local do FarmaFácil (usuário com SELECT nas tabelas de `data.*`)
- Conectividade HTTPS para `https://orcamento.omnipharma.com.br`

### 2. Executar o instalador (gerado via PyInstaller)

```powershell
# Baixar pharma-sync-setup.exe e executar. Ele copia o executável para C:\pharma_sync\
# Abrir um prompt de comando na pasta e rodar:
cd C:\pharma_sync
pharma-sync autodiscover
```

O comando `autodiscover` procura a instalação do FarmaFácil em caminhos padrão (`C:\FarmaFacil`, `C:\Program Files\FarmaFacil`, etc.), lê o `config.txt` do BackupFF e o `farmafacil.ini`, e imprime um `[source]` pronto para copiar no `config.toml`.

### 3. Configurar `config.toml`

Copie `config.example.toml` para `config.toml` e ajuste:

```toml
[source]
host = "localhost"      # descoberto por autodiscover
port = 5432
database = "farmafacil"
user = "backupbase"     # recomendamos criar usuário dedicado RO: pharma_sync_ro
password = "<senha do usuário>"

[target]
base_url = "https://orcamento.omnipharma.com.br/api/sync"
token = "<token bearer emitido pela farmácia central>"
```

### 4. Primeiro teste

```powershell
pharma-sync --once
```

Deve sincronizar ~11.000 registros (produtos, posologias, fórmulas-padrão, formas) em menos de 1 minuto.

### 5. Rodar como serviço Windows (opcional)

```powershell
# Requer pywin32 (já empacotado no instalador)
pharma-sync install-service
Start-Service pharma-sync
```

## Tabelas sincronizadas (Fase 1 — catálogo, sem PII)

| Origem (FarmaFácil PG 9.3) | Destino (VPS) | Volume | Frequência |
|--|--|--|--|
| `data.produto` | `mirror_produto` | ~9.000 | 15 min |
| `data.formafarmaceutica` | `mirror_forma_farmaceutica` | ~60 | 1 h |
| `data.posologia` | `mirror_posologia` | ~3.200 | 1 h |
| `data.formulapadrao` | `mirror_formula_padrao` | ~530 | 1 h |

Dados de pacientes, CPFs e vendas (LGPD) **não** são sincronizados nesta fase.

## Desenvolvimento (Linux/macOS)

```bash
cd tools/sync-agent
python3 -m venv .venv && source .venv/bin/activate
pip install -e .
cp config.example.toml config.toml  # preencha
pharma-sync --once
```

## Build do instalador Windows

```powershell
pip install -e .[dev]
pyinstaller --onefile --name pharma-sync pharma_sync/agent.py
# artefato: dist/pharma-sync.exe
```

## Protocolo

- Cursor composto `(dt_alter, pk)` evita perda em empates de timestamp
- Upsert idempotente no servidor → reenviar batch é seguro
- Retry automático com backoff (1s, 5s, 30s) em falhas de rede
- Heartbeat `POST /api/sync/heartbeat` a cada 60 s

## Logs

- `./logs/agent.log` (rotação diária, 30 dias)
- Formato JSON estruturado

## Segurança

- Bearer token por cliente (hash sha256 no servidor)
- HTTPS obrigatório (TLS 1.2+)
- Agente não envia dados de pacientes/CPFs nesta fase
- Senha do banco local armazenada em `config.toml` — restrinja permissões NTFS
