From a8230769e647f577a833b6a61bba9abb614020b4 Mon Sep 17 00:00:00 2001 From: NANDO9322 Date: Mon, 23 Feb 2026 20:33:36 -0300 Subject: [PATCH] feat(notificacoes): envios de whatsapp dinamicos por regiao (SP e MG) Implementa suporte a multiplas instancias da Evolution API via .env. O servico agora verifica a origiem do evento e roteia o disparo para garantir que cada franquia use seu proprio numero comercial. --- backend/cmd/api/main.go | 7 ++++++- backend/internal/agenda/service.go | 6 +++--- backend/internal/config/config.go | 8 ++++++++ backend/internal/notification/service.go | 26 +++++++++++++++--------- 4 files changed, 33 insertions(+), 14 deletions(-) diff --git a/backend/cmd/api/main.go b/backend/cmd/api/main.go index d37e113..9798a11 100644 --- a/backend/cmd/api/main.go +++ b/backend/cmd/api/main.go @@ -71,7 +71,12 @@ func main() { // Initialize services // Initialize services - notificationService := notification.NewService() + notificationService := notification.NewService( + cfg.EvolutionApiUrl, + cfg.EvolutionApiKey, + cfg.WhatsappInstanceSP, + cfg.WhatsappInstanceMG, + ) profissionaisService := profissionais.NewService(queries) financeService := finance.NewService(queries, profissionaisService) authService := auth.NewService(queries, profissionaisService, cfg) diff --git a/backend/internal/agenda/service.go b/backend/internal/agenda/service.go index d87952d..18028db 100644 --- a/backend/internal/agenda/service.go +++ b/backend/internal/agenda/service.go @@ -448,7 +448,7 @@ func (s *Service) AssignProfessional(ctx context.Context, agendaID uuid.UUID, pr baseUrl, ) - if err := s.notification.SendWhatsApp(prof.Whatsapp.String, msg); err != nil { + if err := s.notification.SendWhatsApp(prof.Whatsapp.String, msg, agenda.Regiao.String); err != nil { log.Printf("[Notification] Falha ao enviar WhatsApp para %s: %v", prof.Nome, err) } }() @@ -702,8 +702,8 @@ func (s *Service) NotifyLogistics(ctx context.Context, agendaID uuid.UUID, passe tipoEventoNome, logisticaMsg, ) - - if err := s.notification.SendWhatsApp(phone, msg); err != nil { + // Passa a agendaRegiao para definir o numero + if err := s.notification.SendWhatsApp(phone, msg, agenda.Regiao.String); err != nil { // Não logar erro para todos se for falha de validação de numero, mas logar warning log.Printf("[Notification] Erro ao enviar para %s: %v", p.Nome, err) } diff --git a/backend/internal/config/config.go b/backend/internal/config/config.go index 68eacf4..4f454c0 100644 --- a/backend/internal/config/config.go +++ b/backend/internal/config/config.go @@ -24,6 +24,10 @@ type Config struct { S3Bucket string S3Region string FrontendURL string + EvolutionApiUrl string + EvolutionApiKey string + WhatsappInstanceSP string + WhatsappInstanceMG string } func LoadConfig() *Config { @@ -48,6 +52,10 @@ func LoadConfig() *Config { S3Bucket: getEnv("S3_BUCKET", ""), S3Region: getEnv("S3_REGION", "nyc1"), FrontendURL: getEnv("FRONTEND_URL", "http://localhost:3000"), + EvolutionApiUrl: getEnv("EVOLUTION_API_URL", "https://others-evolution-api.nsowe9.easypanel.host"), + EvolutionApiKey: getEnv("EVOLUTION_API_KEY", "429683C4C977415CAAFCCE10F7D57E11"), + WhatsappInstanceSP: getEnv("WHATSAPP_INSTANCE_SP", "NANDO"), + WhatsappInstanceMG: getEnv("WHATSAPP_INSTANCE_MG", "NANDO"), } } diff --git a/backend/internal/notification/service.go b/backend/internal/notification/service.go index 4e1e5d4..7e25ed1 100644 --- a/backend/internal/notification/service.go +++ b/backend/internal/notification/service.go @@ -10,17 +10,18 @@ import ( ) type Service struct { - apiURL string - apiKey string - instance string + apiURL string + apiKey string + instanceSP string + instanceMG string } -func NewService() *Service { - // Hardcoded configuration as per user request +func NewService(apiURL, apiKey, instanceSP, instanceMG string) *Service { return &Service{ - apiURL: "https://others-evolution-api.nsowe9.easypanel.host", - apiKey: "429683C4C977415CAAFCCE10F7D57E11", - instance: "NANDO", + apiURL: apiURL, + apiKey: apiKey, + instanceSP: instanceSP, + instanceMG: instanceMG, } } @@ -29,13 +30,18 @@ type MessageRequest struct { Text string `json:"text"` } -func (s *Service) SendWhatsApp(number string, message string) error { +func (s *Service) SendWhatsApp(number string, message string, regiao string) error { cleanNumber := cleanPhoneNumber(number) if cleanNumber == "" { return fmt.Errorf("número de telefone inválido ou vazio") } - url := fmt.Sprintf("%s/message/sendText/%s", s.apiURL, s.instance) + instance := s.instanceSP // default + if regiao == "MG" { + instance = s.instanceMG + } + + url := fmt.Sprintf("%s/message/sendText/%s", s.apiURL, instance) payload := MessageRequest{ Number: cleanNumber,