Changelog — 15 Maio 2026

Sessão maratona SOS de Emergência end-to-end
Duração: ~5h 16h00 → 23h30 Luanda SOS completo end-to-end APK debug gerado
~15
Ficheiros criados
~10
Ficheiros editados
4
Migrations
6
Endpoints novos
1
APK gerado

🎯 Sumário Executivo

Sessão dedicada a completar o sistema SOS de Emergência através de todo o stack ONDAKA (backend Laravel, web admin Inertia/React, mobile Flutter para condóminos+guardas+gestores, FCM push notifications, email aos gestores). APK debug gerado e instalável em telefones reais. Sirene customizada Android adiada para próxima sessão (API breaking change do flutter_local_notifications v21).

⚙️
SOS Backend Core
3 migrations · 6 services · 4 controllers
1
Migrations BD aplicadas
sos_alertas (16 cols) · sos_alerta_fotos (FK cascade) · condominios_atribuidos (JSON em users)
2
Catalog TiposSos
13 tipos em 4 níveis de gravidade · 5 críticos · 4 altos · 2 médios · 2 baixos
3
CriarAlertaSosService
Resolve condómino → contrato → fracção → condominio_id · aceita até 3 fotos (UploadedFile)
4
SosNotificationService (regras de gravidade)
crítico→guarda+admin-cond+gestor+admin-empresa · alto→guarda+admin-cond+gestor · médio→guarda+admin-cond · baixo→admin-cond
5
SosEstadoChangeNotificationService NOVO
Notifica autor (condómino) quando estado muda para atendido ou resolvido. Não notifica em falso_alarme (deselegante).
6
SosGuardaApiController NOVO
3 endpoints /api/guarda/sos/* filtrando por condominios_atribuidos JSON
7
SosGestorApiController NOVO
3 endpoints /api/gestor/sos/* empresa-wide via empresa_gestora_id
📱
SOS Mobile Condómino
Disparar alertas + ver estado
1
Bottomsheet SOS (780 linhas)
13 tipos por gravidade · accordéons · upload fotos via câmara/galeria max 3 fotos
2
"Meus alertas SOS"
Histórico no menu Mais · vê estado actual de cada SOS
3
Push notification quando estado muda NOVO
"🚨 Ajuda a caminho! Gestor Limpo está a tratar do seu pedido (Incêndio) no Condomínio Paparazzi."
🖥️
SOS Web Admin (Inertia + React)
Lista + detalhe + acções + som
1
/sos/alertas — lista
4 StatCards (Críticos / Em curso / Hoje / Total) · pulse animado se críticos>0 · polling 30s
2
/sos/alertas/{id} — detalhe
Botões Atender / Resolver / Falso alarme / Reabrir · textarea notas · lightbox fotos · cronologia
3
Som sirene Web Audio API NOVO
Sawtooth wave 200-400Hz sweep 1.2s · repete 30s até abrir /sos/alertas · badge vermelho pulsante no sidebar · toast.error com botão "Ver"
4
Sidebar "Emergências SOS"
Ícone Siren no topo da secção Operação · badge urgente com contagem de críticos
🛡️
SOS Mobile Guarda NOVO
Card + lista + atender
1
Card "Emergências SOS" na HomeGuardaView
Gradient vermelho se críticos · badge contagem · "X críticos em curso · TOQUE PARA AGIR" · polling 30s
2
Lista SosGuardaListaView
Filtrada por condominios_atribuidos · 2 stat cards · polling 30s · pull-to-refresh
3
Detalhe + acções
3 botões: A caminho/Atender · Resolver · Falso alarme · textarea notas · cronologia · lightbox fotos
4
Multi-condomínio JSON
Gestor pode atribuir N condomínios via condominios_atribuidos: [1,2] na BD
👔
SOS Mobile Gestor NOVO
HomeGestorView + endpoints empresa-wide
1
HomeGestorView (nova)
Saudação + card SOS + card "Em desenvolvimento" para roles gestor/admin-empresa/admin-cond/super-admin
2
HomeRouter actualizado
condomino → MainShellView · guarda/funcionario → HomeGuardaView · gestor/admin-* → HomeGestorView
3
Endpoints empresa-wide
Vê SOS de TODOS os condomínios da empresa via empresa_gestora_id · validado E2E com 20 alertas
📧
Email aos Gestores
Críticos + altos
  • SosNotificationService::enviarEmailHierarquia() — filtra users por empresa_gestora_id + roles admin-empresa/gestor/admin-cond
  • Apenas para gravidades critico e alto (evitar spam)
  • Blade view emails/sos/alerta-criado.blade.php com gradient header, info card, fotos inline, CTA "Ver alerta"
  • SMTP: mail.ondaka.ao:465 SSL · FROM=noreply@ondaka.ao
  • Validado E2E — email chega ao admin@ondaka.ao com layout perfeito
🔔
FCM Push Notifications
End-to-end validado

🎉 Descoberta importante

A infraestrutura FCM JÁ estava 90% pronta no servidor:

  • firebase-service-account.json em /home/ondaka/ (2373 bytes)
  • FcmSenderService.php 139 linhas com OAuth2 + HTTP v1 + cache 50min do access_token
  • Tabela device_tokens populada — mobile já regista tokens automaticamente
  • FCM_PROJECT_ID=ondaka-prod configurado no .env
1
Push enviado quando SOS criado
Validado: log "envios_fcm: 1" + notificação "🧪 TESTE PUSH" chegou ao emulador
2
Push ao autor quando estado muda NOVO
Hook em 3 controllers (Web + GuardaApi + GestorApi) · texto dinâmico com nome de quem atendeu + tipo + condomínio
3
Backend FCM payload optimizado
android.priority: HIGH + android.notification.channel_id: ondaka_default já no FcmSenderService
📦
APK Debug Build
Instalável em Android real
  • flutter build apk --debug OK em 15s
  • Output: build/app/outputs/flutter-apk/app-debug.apk
  • Pronto para instalar em telefone Android real (debug, não optimizado)
  • Para Play Store: ainda precisa --release + signed keystore
⏸️
Adiado para próxima sessão
3 itens

🔇 Sirene customizada Android

  • flutter_local_notifications: ^21.0.0 instalado mas API v21 tem breaking changes drásticas
  • Permissão Android 13+ POST_NOTIFICATIONS adicionada ao manifest
  • isCoreLibraryDesugaringEnabled = true no Gradle aplicado
  • Setup falhou silenciosamente — channel custom não foi criado
  • Revertido: package removido para não quebrar build APK
  • TODO: investigar com cabeça fresca, ler doc oficial v21 com cuidado, considerar v20

📦 APK Release Signed

  • Necessário criar keystore: keytool -genkey -v -keystore ondaka-release.keystore
  • Configurar android/key.properties (NÃO commit ao Git)
  • signingConfigs.release no build.gradle.kts
  • flutter build appbundle --release para Play Store

🔑 device_tokens não persistir

  • Após flutter clean + rebuild, tokens antigos ficaram inválidos
  • Novos tokens não foram registados imediatamente
  • TODO: garantir que registarApoUsLogin() é chamado após login
🎓
Aprendizagens
5 lições
  • 1. Heredoc bash é frágil em comandos longos — patches Python em vez são mais robustos e idempotentes
  • 2. Cuidado com janelas Mac vs SSH — confundi 3x; sempre confirmar prompt antes de colar
  • 3. flutter_local_notifications v21 mudou drasticamente a API — verificar changelog antes de patchar pacote major
  • 4. FCM Backend já tem android.priority: HIGH + channel_id — só falta criar o channel Android-side via Flutter
  • 5. Android Emulator API 34 pode pedir runtime permission para POST_NOTIFICATIONS mesmo após patches