# 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