Automação de Requisições — Power Automate Desktop + ERP Delphi/Firebird

Visão Geral

Automação que monitora requisições novas no ERP (Delphi + Firebird 2.5), gera PDF via UI automation, salva no servidor de rede e imprime na impressora Brother — tudo orquestrado pelo Power Automate Desktop (PAD) com controle de estado em SQLite local.

Esta automação implementa parte do que está descrito em geracao-req-producao — especificamente, a geração do PDF da ficha de pesagem (comando de produção) a partir dos dados da REQ no ERP Delphi.


Arquitetura

┌──────────────┐    ODBC/SQL     ┌──────────────┐
│  Firebird    │◄────────────────│  Power       │
│  ERP 2.5     │  leitura only   │  Automate    │
└──────────────┘                 │  Desktop     │
                                 │              │
┌──────────────┐    ODBC/SQL     │  (roda no    │
│  SQLite      │◄───────────────►│   server1)   │
│  pad_logs.db │  leitura/escrita│              │
└──────────────┘                 └──────┬───────┘
                                        │
                        ┌───────────────┼───────────────┐
                        │               │               │
                        ▼               ▼               ▼
                 UI Automation    Salva PDF em     Print Brother
                 no ERP Delphi   \\server1\req\    via SumatraPDF
                                 {numero}.pdf      CLI silencioso

Decisões de Projeto

DecisãoEscolhaMotivo
Ferramenta de orquestraçãoPower Automate Desktop (PAD)Precisa interagir com UI Win32 do ERP Delphi — PAD cloud não serve
Detecção de reqs novasQuery periódica no Firebird via ODBCRobusto; alternativa (scraping visual da listagem) é frágil
Controle de estadoSQLite local no server1Zero dependência do banco do ERP; escala pra outros logs futuros
ReprocessamentoComparação de timestamps (não flag booleano)Se o ERP regravar a req com data mais nova, o PAD reprocessa automaticamente
Impressão física (Brother)SumatraPDF CLI (portable)Silencioso, não abre janela, fecha sozinho; mais confiável que Start-Process -Verb PrintTo
Path dos PDFs\\server1\req\{numero_req}.pdf diretoSem subpastas; o ERP já gera 1 PDF multipágina por requisição
PollingLoop com wait no PAD ou Agendador de Tarefas do WindowsAgendador é mais resiliente — reinicia se o fluxo crashar
Ambiente de testeDesktop do operador (enxerga server1 na rede)Depois de validado, migra pro server1 com usuário admin exclusivo logado

Infraestrutura Necessária

Firebird ODBC

  • Driver: Firebird ODBC 2.5.x (32-bit — o PAD usa ODBC 32-bit)
  • Download: https://firebirdsql.org/en/odbc-driver/
  • DSN (System DSN, 32-bit):
    • Nome: ERP_Firebird
    • Database: IP_DO_SERVER:C:\caminho\banco.fdb
    • Client: C:\Program Files (x86)\Firebird\Firebird_2_5\bin\fbclient.dll
    • User: SYSDBA
    • Password: (senha do ERP)
    • Character Set: WIN1252 ou UTF8 (verificar no DBeaver)
  • Connection string no PAD: DSN=ERP_Firebird;UID=SYSDBA;PWD=suasenha

SQLite ODBC

SumatraPDF

  • Versão: Portable (sem instalação)
  • Path sugerido: \\server1\tools\SumatraPDF.exe ou C:\Tools\SumatraPDF\SumatraPDF.exe

Impressoras

  • PDF: Microsoft Print to PDF (nativa do Windows)
  • Física: Brother HL-XXXX (nome exato via Get-Printer | Select-Object Name no PowerShell)

Banco de Dados — SQLite (pad_logs.db)

Criação

CREATE TABLE processamentos (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    numero_req TEXT NOT NULL,
    data_inclusao_erp TIMESTAMP,
    data_processamento TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    status TEXT DEFAULT 'ok',
    erro TEXT
);
 
CREATE INDEX idx_req ON processamentos(numero_req);

Campos

CampoTipoFunção
numero_reqTEXTNúmero da requisição no ERP
data_inclusao_erpTIMESTAMPData de inclusão/modificação no ERP — usado pra detectar reprocessamento
data_processamentoTIMESTAMPQuando o PAD processou
statusTEXTok ou erro
erroTEXTDescrição do erro (null se ok)

Queries

Buscar requisições no Firebird (ERP)

-- Query inicial de teste (top 5)
SELECT FIRST 5 numero_req, data_inclusao
FROM requisicoes
ORDER BY data_inclusao DESC
 
-- Query de produção (todas)
SELECT numero_req, data_inclusao
FROM requisicoes
WHERE data_inclusao >= '2025-01-01'  -- ajustar conforme necessidade

Nota: os nomes de tabela e colunas (requisicoes, numero_req, data_inclusao) são placeholders — ajustar para os nomes reais do banco do ERP. Consultar no DBeaver.

Verificar se precisa processar (SQLite)

SELECT COUNT(*) AS n
FROM processamentos
WHERE numero_req = :req
  AND data_processamento >= :data_inclusao_erp
  AND status = 'ok'

Se retorna 0 → precisa processar (nunca processou, ou ERP regravou com data mais nova, ou processamento anterior falhou).

Registrar processamento (SQLite)

-- Sucesso
INSERT INTO processamentos (numero_req, data_inclusao_erp, status)
VALUES (:req, :data_inclusao, 'ok');
 
-- Erro
INSERT INTO processamentos (numero_req, data_inclusao_erp, status, erro)
VALUES (:req, :data_inclusao, 'erro', :mensagem_erro);

Fluxo PAD — Estrutura Completa

1.  Open SQL Connection → ERP_Firebird → %ConnERP%
2.  Open SQL Connection → PAD_Logs → %ConnSQLite%
3.  Execute SQL → %ConnERP% → busca requisições → %ReqList%

4.  For each %CurrentItem% in %ReqList%
│
│   5.  Execute SQL → %ConnSQLite% →
│       verifica se já processou com sucesso e data >= ERP
│       → %CheckResult%
│
│   6.  If %CheckResult[0][0]% = 0
│   │
│   │   ── UI AUTOMATION ──────────────────────────────
│   │   7.  Navega no ERP até busca de requisições
│   │   8.  Preenche campo busca com %CurrentItem[0]%
│   │   9.  Abre a requisição
│   │   10. Wait for UI element → ícone de print
│   │   11. Clica no ícone de print
│   │   12. Wait for UI element → diálogo de impressão Windows
│   │   13. Seleciona "Microsoft Print to PDF"
│   │   14. Clica "Imprimir"
│   │   15. Wait for UI element → diálogo "Salvar como"
│   │   16. Preenche nome do arquivo:
│   │       \\server1\req\%CurrentItem[0]%.pdf
│   │   17. Clica "Salvar"
│   │   ── FIM UI AUTOMATION ──────────────────────────
│   │
│   │   18. Wait / Loop até arquivo existir (timeout 15s)
│   │
│   │   19. If file exists
│   │   │   20. Run PowerShell → SumatraPDF print na Brother
│   │   │   21. INSERT SQLite → status = 'ok'
│   │   │
│   │   Else
│   │   │   22. INSERT SQLite → status = 'erro', erro = 'PDF não gerado'
│   │   End If
│   │
│   │   On Error (qualquer falha na UI)
│   │   │   23. INSERT SQLite → status = 'erro' + mensagem
│   │   │   24. Continue loop (próxima req)
│   │
│   End If
│
End For

25. Close SQL Connection → %ConnERP%
26. Close SQL Connection → %ConnSQLite%
27. Wait X segundos (ou fim — se disparado pelo Agendador de Tarefas)

# Opção recomendada — SumatraPDF (silencioso)
$pdfPath = "\\server1\req\NUMERO_REQ.pdf"
$printer = "Brother HL-XXXX series"  # nome exato do Get-Printer
 
& "C:\Tools\SumatraPDF\SumatraPDF.exe" -print-to "$printer" -silent "$pdfPath"
# Alternativa nativa (menos confiável, pode abrir janela)
Start-Process -FilePath $pdfPath -Verb PrintTo -ArgumentList $printer -WindowStyle Hidden

Descobrir nome exato da impressora

Get-Printer | Select-Object Name

Passo a Passo de Implementação

Passo 1 — Conectividade

  1. Instalar Firebird ODBC 2.5 (32-bit)
  2. Configurar System DSN ERP_Firebird no ODBC 32-bit
  3. Testar conexão no DSN
  4. Instalar SQLite ODBC Driver
  5. Criar pasta \\server1\pad\
  6. Configurar System DSN PAD_Logs
  7. No PAD: Open SQL Connection → Execute SQL de teste em ambos
  8. No PAD: executar CREATE TABLE no SQLite

Passo 2 — UI Automation

  1. Abrir o ERP no desktop
  2. No PAD, usar o Recorder para gravar a sequência:
    • Buscar requisição por número → abrir → clicar print → diálogo Windows → salvar PDF
  3. Revisar ações gravadas:
    • Trocar valores fixos por variáveis (%CurrentItem[0]%)
    • Adicionar “Wait for UI element” antes de cada clique crítico
    • Adicionar “If file exists” pós-salvamento com timeout
    • Envolver em bloco “On error”
  4. Testar com 2-3 requisições manualmente

Passo 3 — Loop Completo

  1. Montar a estrutura de loop conforme diagrama acima
  2. Conectar queries Firebird + SQLite + UI automation + tratamento de erro
  3. Testar end-to-end com 3-4 requisições

Passo 4 — Print Físico

  1. Baixar SumatraPDF portable, colocar em C:\Tools\SumatraPDF\
  2. Descobrir nome exato da Brother (Get-Printer)
  3. Adicionar ação “Run PowerShell script” no fluxo após confirmação do PDF
  4. Testar impressão

Passo 5 — Produção

  1. Validar no desktop com volume real (10+ reqs)
  2. Instalar PAD no server1
  3. Criar usuário admin exclusivo logado no server1
  4. Configurar DSNs no server1
  5. Configurar Agendador de Tarefas para disparar o fluxo a cada X minutos
  6. Criar pasta \\server1\req\ se não existir
  7. Monitorar SQLite por erros nos primeiros dias

Pontos de Atenção

  • Nomes de tabela/coluna no Firebirdrequisicoes, numero_req, data_inclusao são placeholders. Verificar nomes reais no DBeaver.
  • Diálogo de impressão — o ERP mostra o diálogo padrão do Windows (confirmado). Se algum popup inesperado aparecer, o “On error” captura e loga.
  • Character set do Firebird — verificar se é WIN1252 ou UTF8 antes de configurar o DSN, senão caracteres especiais quebram.
  • Timeout de geração — o ERP costuma levar no máximo 3s para gerar a tela, mas usar “Wait for UI element” é mais resiliente que timer fixo.
  • Concorrência — se uma atendente estiver usando o ERP no mesmo momento que o PAD, a UI automation pode conflitar. No server1 com sessão exclusiva isso não acontece, mas no desktop de teste pode.
  • Microsoft Print to PDF — se a pasta de destino UNC não existir, o diálogo de salvar vai falhar silenciosamente. Garantir que \\server1\req\ existe.

Relação com processos