Alerta automático para escalonamento de equipes 24 horas na Grande São Paulo com VBA
Automatize alertas de escalonamento para equipes 24h na Grande SP usando VBA no CorelDRAW. Reduza tempo de resposta e evite falhas na comunicação.
São 3h da madrugada em Osasco. O arquivo de produção de uma grande gráfica da Grande São Paulo travou numa etapa de imposição e ninguém foi avisado. O operador de plantão só descobriu às 6h, quando a fila de impressão já estava comprometida e o prazo do cliente, perdido. Cenários como esse se repetem em bureaus, agências e departamentos de arte que rodam 24 horas: a automação no CorelDRAW processa o trabalho, mas a comunicação de falha continua manual, frágil e dependente de alguém olhar a tela.
A solução não está em comprar novo software de monitoramento, mas em estender a macro VBA que já roda na máquina para falar com o mundo externo. Um alerta automático bem desenhado transforma um silêncio perigoso em uma notificação no WhatsApp do líder de turno, no canal do Teams da produção ou no e-mail do gestor — com dados contextuais: nome do arquivo, etapa travada, hora do erro e link direto para o log. O resultado é tempo de resposta medido em minutos, não em turnos.
Este artigo mostra como estruturar esse escalonamento usando apenas recursos nativos do VBA (WinHttpRequest, CDO, Shell) e boas práticas de engenharia: idempotência, retentativa exponencial, configuração externa e auditoria. Você verá o fluxo completo, do gatilho no documento até a entrega na mão de quem resolve, com código pronto para adaptar.
O gatilho certo: o que vigiar no fluxo de produção
Nem todo erro merece acordar a equipe. O primeiro passo é classificar eventos em três níveis: informativo (log local), atenção (e-mail diurno) e crítico (escalação imediata). No CorelDRAW, os pontos de observação mais confiáveis são:
- Evento
DocumentAfterSavetravado por mais de 15 minutos (indica loop ou deadlock). - Macro de imposição/nesting que não dispara
OnFinishno tempo esperado. - Arquivo com status “Em produção” aberto há mais de 2 horas sem alteração de páginas.
- Falha de conexão com servidor de ativos (PDFs base, perfis ICC, bibliotecas de símbolos).
Cada condição vira uma função booleana DeveEscalar() que retorna True apenas quando todas as validações passam: horário de plantão ativo, arquivo não está em manutenção programada, último alerta enviado há mais de 30 minutos. Essa guarda evita tempestade de notificações quando o servidor cai e todos os arquivos travam juntos.
Arquitetura da notificação: canais, payload e idempotência
O coração do alerta é um JSON padronizado que qualquer consumidor entende. Exemplo mínimo:
{
"evento": "ESCALACAO_CRITICA",
"timestamp": "2024-03-15T03:12:03-03:00",
"origem": {
"maquina": "WS-GRAFICA-07",
"usuario": "producao_noturno",
"coreldraw_version": "24.0.0.301"
},
"contexto": {
"arquivo": "\\SRV-ARQUIVOS\\PRODUCAO\\CLIENTE_X\\JOB_20240315_001.cdr",
"etapa": "IMPOSICAO_32PAG",
"tempo_parado_seg": 1420,
"ultimo_log": "Erro 52: Nome ou número de arquivo inválido ao exportar PDF"
},
"escalation": {
"nivel": 1,
"contatos": ["+5511999998888", "lider.turno@empresa.com"],
"canais": ["WHATSAPP", "EMAIL"]
},
"idempotency_key": "WS-GRAFICA-07_JOB_20240315_001_IMPOSICAO_32PAG_20240315T03"
}
A idempotency_key garante que reenvios (retentativa de rede, duplo clique no botão de teste) não gerem alertas duplicados. O receptor (webhook, função Azure, script no n8n) deve armazenar as chaves processadas nas últimas 24h e ignorar repetidas.
Envio via WhatsApp (webhook) com retentativa exponencial
O bloco abaixo é o motor de envio. Copie para um módulo modAlertaWhatsApp e chame EnviarAlertaWhatsApp(payloadJson, webhookUrl).
Option Explicit
Private Const MAX_TENTATIVAS As Long = 3
Private Const TEMPO_BASE_SEG As Long = 5 ' 5s, 10s, 20s
Public Function EnviarAlertaWhatsApp(ByVal jsonPayload As String, ByVal webhookUrl As String) As Boolean
Dim http As Object
Dim tentativa As Long
Dim waitSeg As Long
Dim resposta As String
Set http = CreateObject("WinHttp.WinHttpRequest.5.1")
http.SetTimeouts 5000, 10000, 15000, 15000
For tentativa = 1 To MAX_TENTATIVAS
On Error Resume Next
http.Open "POST", webhookUrl, False
http.SetRequestHeader "Content-Type", "application/json"
http.Send jsonPayload
If Err.Number = 0 Then
If http.Status = 200 Then
EnviarAlertaWhatsApp = True
LogLocal "ALERTA_OK", webhookUrl, jsonPayload
Exit Function
Else
LogLocal "ALERTA_HTTP_" & http.Status, webhookUrl, http.ResponseText
End If
Else
LogLocal "ALERTA_ERR_" & Err.Number, webhookUrl, Err.Description
End If
On Error GoTo 0
waitSeg = TEMPO_BASE_SEG * (2 ^ (tentativa - 1))
Sleep waitSeg * 1000 ' precisa de Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Next tentativa
EnviarAlertaWhatsApp = False
LogLocal "ALERTA_FALHA_FINAL", webhookUrl, jsonPayload
End Function
Private Sub LogLocal(tipo As String, url As String, payload As String)
Dim fNum As Long, logPath As String
logPath = Environ$("TEMP") & "\CorelDRAW_Alertas.log"
fNum = FreeFile
Open logPath For Append As #fNum
Print #fNum, Format$(Now, "yyyy-mm-dd hh:nn:ss") & " | " & tipo & " | " & url & " | " & Left$(payload, 200)
Close #fNum
End Sub
Pontos críticos do código:
SetTimeoutsevita travamento infinito se o webhook não responder.Sleep(API Windows) libera a CPU durante a espera; sem ele, o CorelDRAW congela.LogLocalgrava em arquivo texto no%TEMP%— sobrevive a reinício da macro e não precisa de banco.- A função retorna
Boolean; o chamador decide se tenta e-mail como fallback.
Fallback para e-mail (CDO) quando webhook falha
Se o WhatsApp não entregar, o mesmo payload segue por e-mail corporativo usando CDO (funciona em qualquer Windows com Outlook ou servidor SMTP configurado).
Public Function EnviarAlertaEmail(ByVal jsonPayload As String, ByVal assunto As String, ByVal destinatarios As String) As Boolean
Dim msg As Object, cfg As Object
Set msg = CreateObject("CDO.Message")
Set cfg = CreateObject("CDO.Configuration")
With cfg.Fields
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 ' SMTP
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.empresa.com.br"
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 587
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "alertas@empresa.com.br"
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "senha_do_app"
.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
.Update
End With
Set msg.Configuration = cfg
msg.From = "alertas@empresa.com.br"
msg.To = destinatarios
msg.Subject = assunto
msg.TextBody = "Alerta automático CorelDRAW\n\n" & jsonPayload
On Error Resume Next
msg.Send
EnviarAlertaEmail = (Err.Number = 0)
On Error GoTo 0
If Not EnviarAlertaEmail Then LogLocal "EMAIL_FALHA", destinatarios, Err.Description
End Function
Configuração externa: planilha de parâmetros versionada
Hardcodear horários, telefones e URLs no código é receita para falha na primeira mudança de turno. Crie ConfigEscalacao.xlsx no SharePoint/OneDrive com abas:
| Aba | Colunas chave |
|---|---|
| Turnos | Inicio, Fim, Lider, Telefone, Email |
| Canais | Nome, Tipo (WHATSAPP/EMAIL/TEAMS), Endpoint, Ativo |
| Regras | Evento, ThresholdSeg, NivelEscala, CooldownMin |
| Feriados | Data, Descricao |
A macro lê o arquivo na inicialização com ADODB (provider Microsoft.ACE.OLEDB.12.0) e carrega em Collection/Dictionary. Alterações na planilha entram em vigor na próxima execução — sem recompilar o .gms.
Auditoria e painel de controle simples
Cada envio (sucesso ou falha) gera linha no log local. Para visibilidade gerencial, agende um Power Automate / Power Query que leia todos os CorelDRAW_Alertas.log das estações, consolide em uma lista SharePoint e alimente um dashboard no Power BI: volume por turno, taxa de falha por canal, tempo médio até primeiro ACK da equipe. Isso transforma o alerta em métrica de SLA interno.
Testes realistas: simulação de fim de semana
Antes de ir para produção, execute o roteiro:
- Sexta 18h: ative modo “simulação” (flag na planilha que redireciona webhooks para canal de teste no Teams).
- Dispare gatilhos artificiais: trave imposição, simule rede caída, force erro de exportação.
- Meça: tempo até mensagem no celular do líder, clareza do payload, ação tomada.
- Ajuste
ThresholdSegeCooldownMincom base nos falsos positivos observados. - Documente lições no README do repositório da macro.
Integração com o ecossistema de produção gráfica
O alerta não vive isolado. Ele complementa automações que já existem no seu parque: a geração de ativos visuais em escala, a preparação de artes para campanhas pagas e a otimização de landing pages para ranqueamento. Veja como outros times usam VBA no CorelDRAW para eliminar gargalos semelhantes: Automação VBA aplicada à criação de ativos visuais para projetos, Automação prepara artes para campanhas pagas em Goiânia e Automação acelera landing pages para ranquear em São Bernardo.
Quando o ralo lento para escoar na Grande São Paulo vira metáfora para o fluxo de arquivos travado, a automação de alerta é o hidrojateamento que resolve antes da inundação. ralo lento para escoar na Grande São Paulo
Implemente o escalonamento em camadas: log local → webhook com retentativa → e-mail fallback → painel de auditoria. Teste no modo simulação por duas semanas. Quando a primeira madrugada real chegar e o celular do líder vibrar com o JSON certo, você saberá que o plantão 24 horas finalmente tem olhos no código, não só na tela.
Checklist prático
Perguntas frequentes
Como o VBA no CorelDRAW pode disparar alertas para equipes externas?
O VBA pode acionar APIs REST, enviar e-mails via Outlook ou gravar em bancos de dados compartilhados que sistemas de monitoramento leem. A macro atua como gatilho: ao detectar condição crítica no arquivo ou fluxo, executa a rotina de notificação sem intervenção manual.
É possível integrar o alerta com WhatsApp ou Telegram da equipe de plantão?
Sim. A macro VBA chama uma URL de webhook (ex.: Twilio, Z-API, Bot do Telegram) via WinHttpRequest. O payload JSON contém dados da ocorrência e o destinatário recebe a mensagem em segundos, sem depender de e-mail corporativo.
Como evitar falsos positivos que acordam a equipe à toa?
Implemente regras de validação: confirme se o arquivo está aberto no setor correto, se há dados novos nas últimas horas e se o status não foi resolvido. Use logs locais e contadores de retentativa antes de escalar para o canal de urgência.
O escalonamento funciona se o CorelDRAW estiver fechado?
Não. O VBA roda dentro da instância do CorelDRAW. Para cobertura 24h real, agende a macro via Task Scheduler abrindo o CorelDRAW em modo silencioso (/automation) ou migre a lógica crítica para um serviço Windows (ex.: Python/Node) que consulte a mesma fonte de dados.
Quais permissões de rede e antivírus costumam bloquear o envio do alerta?
Firewall corporativo pode bloquear portas 443/80 para IPs desconhecidos; antivírus pode barrar scripts que disparam HTTP. Libere o executável do CorelDRAW e o domínio do webhook na política de exceções; teste com curl/PowerShell antes de culpar o código.
Como versionar e auditar as regras de escalonamento sem bagunçar o código?
Armazene parâmetros (horários, contatos, thresholds) em planilha Excel ou JSON versionado no SharePoint/Git. A macro lê o arquivo externo na inicialização. Alterações de regra não exigem recompilação do GMS e ficam rastreáveis no histórico do repositório.