|
|
@@ -0,0 +1,255 @@
|
|
|
+# Plano de Implementação — Push Notifications Marketing
|
|
|
+
|
|
|
+## Visão Geral
|
|
|
+
|
|
|
+Sistema de push notifications de marketing para os apps Prestador e Cliente, usando Firebase Cloud Messaging (FCM) via `kreait/laravel-firebase`. Scheduler dispara 3x/dia (08h, 13h, 19h), cada notificação tem sua própria condição de elegibilidade e cooldown controlado por log no banco.
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 1. Condições de Elegibilidade
|
|
|
+
|
|
|
+### PROVIDER
|
|
|
+
|
|
|
+| Label | Condição | Intervalo |
|
|
|
+|---|---|---|
|
|
|
+| `provider_reforco_educativo_1` | `approval_status = accepted` + nunca recebeu nenhum reforço educativo **OU** o último foi o #2 há ≥3 semanas | Alterna com #2 a cada 3 semanas |
|
|
|
+| `provider_reforco_educativo_2` | `approval_status = accepted` + último reforço recebido foi o #1 há ≥3 semanas | Alterna com #1 a cada 3 semanas |
|
|
|
+| `provider_motivacional_1` | `approval_status = accepted` + não recebeu esta msg há ≥7 dias | Semanal |
|
|
|
+
|
|
|
+### CLIENT
|
|
|
+
|
|
|
+| Label | Condição | Cooldown categoria | Cooldown msg |
|
|
|
+|---|---|---|---|
|
|
|
+| `cliente_marketing_1..4` | `registration_complete = true` | 7 dias | 28 dias |
|
|
|
+| `cliente_recorrencia_1..3` | ≥1 agendamento `status = finished` + sem agendamento `finished` nos últimos 30 dias | 7 dias | 28 dias |
|
|
|
+| `cliente_educativo_1..4` | `registration_complete = true` (todos) | 7 dias | 28 dias |
|
|
|
+| `cliente_educ_conversao_1..2` | Nunca agendou com `schedule_type = custom` **OU** último foi há >30 dias | 14 dias | 28 dias |
|
|
|
+| `cliente_social_proof_1..2` | Nunca teve agendamento `status = finished` **OU** último foi há >30 dias | 14 dias | 28 dias |
|
|
|
+| `cliente_motivacional_1..3` | `registration_complete = true` (todos) | 7 dias | 28 dias |
|
|
|
+| `cliente_contextual_sexta` | `registration_complete = true` + hoje é sexta-feira | 7 dias | — |
|
|
|
+| `cliente_contextual_segunda` | `registration_complete = true` + hoje é segunda-feira | 7 dias | — |
|
|
|
+| `cliente_contextual_visita` | `registration_complete = true` (broadcast geral) | 7 dias | 28 dias |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 2. Conteúdo das Notificações
|
|
|
+
|
|
|
+### PROVIDER — Reforço Educativo
|
|
|
+
|
|
|
+| Label | Título | Corpo |
|
|
|
+|---|---|---|
|
|
|
+| `provider_reforco_educativo_1` | Como funcionam os pedidos Sob Medida | Eles são enviados para várias diaristas ao mesmo tempo. Aceite rápido para garantir. |
|
|
|
+| `provider_reforco_educativo_2` | Dica importante | Pedidos Sob Medida são compartilhados. A confirmação acontece por ordem de aceite. |
|
|
|
+
|
|
|
+### PROVIDER — Motivacional
|
|
|
+
|
|
|
+| Label | Título | Corpo |
|
|
|
+|---|---|---|
|
|
|
+| `provider_motivacional_1` | Fique de olho 👀 | Novos pedidos Sob Medida surgem o tempo todo no app. |
|
|
|
+
|
|
|
+### CLIENT — Marketing
|
|
|
+
|
|
|
+| Label | Título | Corpo |
|
|
|
+|---|---|---|
|
|
|
+| `cliente_marketing_1` | Casa limpa sem esforço | Encontre uma diarista disponível em poucos minutos. |
|
|
|
+| `cliente_marketing_2` | Precisando de ajuda hoje? | Veja diaristas disponíveis perto de você. |
|
|
|
+| `cliente_marketing_3` | Menos preocupação, mais tempo | Agende sua próxima diária agora mesmo. |
|
|
|
+| `cliente_marketing_4` | Agenda cheia? | Uma diarista pode resolver isso hoje. |
|
|
|
+
|
|
|
+### CLIENT — Recorrência
|
|
|
+
|
|
|
+| Label | Título | Corpo |
|
|
|
+|---|---|---|
|
|
|
+| `cliente_recorrencia_1` | Hora da próxima diária? | Faz um tempo desde sua última limpeza 😊 |
|
|
|
+| `cliente_recorrencia_2` | Rotina em dia | Que tal agendar sua próxima diária? |
|
|
|
+| `cliente_recorrencia_3` | Casa limpa dura pouco | Garanta sua próxima diária no app. |
|
|
|
+
|
|
|
+### CLIENT — Educativo
|
|
|
+
|
|
|
+| Label | Título | Corpo |
|
|
|
+|---|---|---|
|
|
|
+| `cliente_educativo_1` | Você sabia? | No Diária, o pagamento só é liberado após o serviço concluído. |
|
|
|
+| `cliente_educativo_2` | Mais segurança | Você acompanha todo o serviço direto pelo app. |
|
|
|
+| `cliente_educativo_3` | Dica importante | Avaliações ajudam a manter a qualidade das diaristas. |
|
|
|
+| `cliente_educativo_4` | Transparência | Você vê perfil, avaliações e valores antes de contratar. |
|
|
|
+
|
|
|
+### CLIENT — Educativo + Conversão
|
|
|
+
|
|
|
+| Label | Título | Corpo |
|
|
|
+|---|---|---|
|
|
|
+| `cliente_educ_conversao_1` | Sob Medida funciona assim | Seu pedido é enviado para várias diaristas disponíveis. |
|
|
|
+| `cliente_educ_conversao_2` | Quer mais chances de aceite? | Pedidos Sob Medida aumentam a rapidez na confirmação. |
|
|
|
+
|
|
|
+### CLIENT — Social Proof
|
|
|
+
|
|
|
+| Label | Título | Corpo |
|
|
|
+|---|---|---|
|
|
|
+| `cliente_social_proof_1` | Clientes como você | Já estão usando o Diária para facilitar a rotina. |
|
|
|
+| `cliente_social_proof_2` | Diaristas bem avaliadas | Veja profissionais recomendadas perto de você. |
|
|
|
+
|
|
|
+### CLIENT — Motivacional
|
|
|
+
|
|
|
+| Label | Título | Corpo |
|
|
|
+|---|---|---|
|
|
|
+| `cliente_motivacional_1` | Sua casa merece cuidado | E você merece tempo livre. |
|
|
|
+| `cliente_motivacional_2` | Chegue em casa e relaxe | A limpeza fica por nossa conta. |
|
|
|
+| `cliente_motivacional_3` | Menos bagunça, mais bem-estar | Agende sua diária quando quiser. |
|
|
|
+
|
|
|
+### CLIENT — Contextual
|
|
|
+
|
|
|
+| Label | Título | Corpo |
|
|
|
+|---|---|---|
|
|
|
+| `cliente_contextual_sexta` | Sexta chegando | Que tal deixar a casa pronta pro fim de semana? |
|
|
|
+| `cliente_contextual_segunda` | Segunda organizada | Comece a semana com a casa limpa. |
|
|
|
+| `cliente_contextual_visita` | Visita marcada? | Uma diarista pode ajudar hoje. |
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 3. Estrutura de Arquivos — Backend
|
|
|
+
|
|
|
+```
|
|
|
+app/
|
|
|
+├── Enums/
|
|
|
+│ ├── PushNotificationTargetEnum.php
|
|
|
+│ └── PushNotificationCategoryEnum.php
|
|
|
+│
|
|
|
+├── Models/
|
|
|
+│ ├── DeviceToken.php
|
|
|
+│ └── PushNotificationLog.php
|
|
|
+│
|
|
|
+├── Services/
|
|
|
+│ ├── PushNotificationService.php # envia via FCM (kreait)
|
|
|
+│ └── PushNotificationDispatcher.php # orquestra o ciclo completo de envio
|
|
|
+│
|
|
|
+├── Notifications/
|
|
|
+│ └── Push/
|
|
|
+│ ├── BasePushNotification.php # abstract com LABEL, CATEGORY, TARGET, title(), body(), eligibleUsers()
|
|
|
+│ │
|
|
|
+│ ├── Prestador/
|
|
|
+│ │ ├── ReforcoEducativo/
|
|
|
+│ │ │ ├── ReforcoEducativo1Push.php
|
|
|
+│ │ │ └── ReforcoEducativo2Push.php
|
|
|
+│ │ └── Motivacional/
|
|
|
+│ │ └── Motivacional1Push.php
|
|
|
+│ │
|
|
|
+│ └── Cliente/
|
|
|
+│ ├── Marketing/
|
|
|
+│ │ ├── Marketing1Push.php
|
|
|
+│ │ ├── Marketing2Push.php
|
|
|
+│ │ ├── Marketing3Push.php
|
|
|
+│ │ └── Marketing4Push.php
|
|
|
+│ ├── Recorrencia/
|
|
|
+│ │ ├── Recorrencia1Push.php
|
|
|
+│ │ ├── Recorrencia2Push.php
|
|
|
+│ │ └── Recorrencia3Push.php
|
|
|
+│ ├── Educativo/
|
|
|
+│ │ ├── Educativo1Push.php
|
|
|
+│ │ ├── Educativo2Push.php
|
|
|
+│ │ ├── Educativo3Push.php
|
|
|
+│ │ └── Educativo4Push.php
|
|
|
+│ ├── EducativoConversao/
|
|
|
+│ │ ├── EducativoConversao1Push.php
|
|
|
+│ │ └── EducativoConversao2Push.php
|
|
|
+│ ├── SocialProof/
|
|
|
+│ │ ├── SocialProof1Push.php
|
|
|
+│ │ └── SocialProof2Push.php
|
|
|
+│ ├── Motivacional/
|
|
|
+│ │ ├── Motivacional1Push.php
|
|
|
+│ │ ├── Motivacional2Push.php
|
|
|
+│ │ └── Motivacional3Push.php
|
|
|
+│ └── Contextual/
|
|
|
+│ ├── ContextualSextaPush.php
|
|
|
+│ ├── ContextualSegundaPush.php
|
|
|
+│ └── ContextualVisitaPush.php
|
|
|
+│
|
|
|
+├── Tasks/
|
|
|
+│ └── SendPushNotificationsTask.php
|
|
|
+│
|
|
|
+└── Http/Controllers/Api/
|
|
|
+ └── DeviceTokenController.php
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 4. Banco de Dados
|
|
|
+
|
|
|
+### `device_tokens`
|
|
|
+```
|
|
|
+id bigint unsigned PK
|
|
|
+user_id FK → users.id
|
|
|
+token string (FCM device token)
|
|
|
+platform enum: android | ios
|
|
|
+app_type enum: prestador | cliente
|
|
|
+active boolean default true
|
|
|
+created_at / updated_at
|
|
|
+```
|
|
|
+
|
|
|
+### `push_notification_logs`
|
|
|
+```
|
|
|
+id bigint unsigned PK
|
|
|
+label string (ex: 'cliente_marketing_1')
|
|
|
+user_id FK → users.id
|
|
|
+target string (prestador | cliente)
|
|
|
+category string (marketing | recorrencia | educativo | ...)
|
|
|
+sent_at timestamp
|
|
|
+created_at / updated_at
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 5. Rotas de API
|
|
|
+
|
|
|
+```
|
|
|
+POST /api/device-tokens → registra token (login / abertura do app)
|
|
|
+DELETE /api/device-tokens/{token} → remove token (logout)
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 6. Scheduler
|
|
|
+
|
|
|
+Em `bootstrap/app.php`:
|
|
|
+
|
|
|
+```php
|
|
|
+$schedule->call(new SendPushNotificationsTask)->dailyAt('08:00');
|
|
|
+$schedule->call(new SendPushNotificationsTask)->dailyAt('13:00');
|
|
|
+$schedule->call(new SendPushNotificationsTask)->dailyAt('19:00');
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 7. Frontend — Ambos os Apps
|
|
|
+
|
|
|
+### Instalações necessárias (prestador e cliente)
|
|
|
+```
|
|
|
+@capacitor/push-notifications
|
|
|
+```
|
|
|
+
|
|
|
+### Arquivos a criar em cada app
|
|
|
+```
|
|
|
+src/boot/push-notifications.ts → solicita permissão, captura token, registra via API
|
|
|
+src/services/pushNotificationService.ts → abstrai chamadas à API de tokens
|
|
|
+```
|
|
|
+
|
|
|
+### Firebase
|
|
|
+- Criar projeto Firebase (ou dois projetos separados)
|
|
|
+- Registrar app Android e iOS de cada um
|
|
|
+- Baixar `google-services.json` (Android) e `GoogleService-Info.plist` (iOS) para cada app
|
|
|
+- Configurar `capacitor.config.ts` de cada app
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 8. Ordem de Implementação
|
|
|
+
|
|
|
+1. Instalar `kreait/laravel-firebase` no backend
|
|
|
+2. Criar migrations (`device_tokens` e `push_notification_logs`)
|
|
|
+3. Criar Enums (`PushNotificationTargetEnum`, `PushNotificationCategoryEnum`)
|
|
|
+4. Criar Models (`DeviceToken`, `PushNotificationLog`)
|
|
|
+5. Criar `DeviceTokenController` + rotas
|
|
|
+6. Criar `PushNotificationService` (integração FCM)
|
|
|
+7. Criar `BasePushNotification` (classe abstrata)
|
|
|
+8. Criar todas as 24 classes de push notifications
|
|
|
+9. Criar `PushNotificationDispatcher` (lógica de cooldown + orquestração)
|
|
|
+10. Criar `SendPushNotificationsTask` + registrar no scheduler
|
|
|
+11. Frontend Prestador: instalar lib + boot + service
|
|
|
+12. Frontend Cliente: instalar lib + boot + service
|