From cfe8e1067fadc3b10173dd88dffdf055e66838ae Mon Sep 17 00:00:00 2001 From: Bryan Pinheiro Date: Tue, 29 Sep 2026 09:26:28 -0300 Subject: [PATCH 1/3] feat(alerts): exige opt-in para resumos automaticos --- src/main/java/com/financebot/user/domain/User.java | 4 ++-- .../V16__disable_summaries_by_default_for_new_users.sql | 2 ++ .../alert/adapter/FinancialAlertSchedulerTest.java | 3 +++ .../java/com/financebot/user/service/UserServiceTest.java | 8 +++++++- 4 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/db/migration/V16__disable_summaries_by_default_for_new_users.sql diff --git a/src/main/java/com/financebot/user/domain/User.java b/src/main/java/com/financebot/user/domain/User.java index f3f95a4..3d3cb2f 100644 --- a/src/main/java/com/financebot/user/domain/User.java +++ b/src/main/java/com/financebot/user/domain/User.java @@ -64,10 +64,10 @@ public class User implements UserDetails { private boolean financialAlertsEnabled = true; @Column(name = "weekly_summary_enabled", nullable = false) - private boolean weeklySummaryEnabled = true; + private boolean weeklySummaryEnabled = false; @Column(name = "monthly_summary_enabled", nullable = false) - private boolean monthlySummaryEnabled = true; + private boolean monthlySummaryEnabled = false; @Column(name = "telegram_link_code", length = 30) private String telegramLinkCode; diff --git a/src/main/resources/db/migration/V16__disable_summaries_by_default_for_new_users.sql b/src/main/resources/db/migration/V16__disable_summaries_by_default_for_new_users.sql new file mode 100644 index 0000000..acaa20c --- /dev/null +++ b/src/main/resources/db/migration/V16__disable_summaries_by_default_for_new_users.sql @@ -0,0 +1,2 @@ +ALTER TABLE users ALTER COLUMN weekly_summary_enabled SET DEFAULT FALSE; +ALTER TABLE users ALTER COLUMN monthly_summary_enabled SET DEFAULT FALSE; diff --git a/src/test/java/com/financebot/alert/adapter/FinancialAlertSchedulerTest.java b/src/test/java/com/financebot/alert/adapter/FinancialAlertSchedulerTest.java index a157ca3..a49cac1 100644 --- a/src/test/java/com/financebot/alert/adapter/FinancialAlertSchedulerTest.java +++ b/src/test/java/com/financebot/alert/adapter/FinancialAlertSchedulerTest.java @@ -38,6 +38,9 @@ void setup() { analysis, notifications, Clock.fixed(Instant.parse("2026-09-15T09:00:00Z"), ZoneOffset.UTC)); ReflectionTestUtils.setField(scheduler, "alertsEnabled", true); user = new User(); user.setId(1L); user.setTelegramId(123L); + user.setFinancialAlertsEnabled(true); + user.setWeeklySummaryEnabled(true); + user.setMonthlySummaryEnabled(true); } @Test diff --git a/src/test/java/com/financebot/user/service/UserServiceTest.java b/src/test/java/com/financebot/user/service/UserServiceTest.java index 85258a7..2f1b533 100644 --- a/src/test/java/com/financebot/user/service/UserServiceTest.java +++ b/src/test/java/com/financebot/user/service/UserServiceTest.java @@ -219,12 +219,16 @@ void shouldConfirmTelegramLinkSuccessfully() { assertThat(savedUser.getTelegramId()).isEqualTo(987654L); assertThat(savedUser.getTelegramLinkCode()).isNull(); assertThat(savedUser.getTelegramLinkCodeExpiresAt()).isNull(); + assertThat(savedUser.isWeeklySummaryEnabled()).isFalse(); + assertThat(savedUser.isMonthlySummaryEnabled()).isFalse(); } @Test @DisplayName("deve retornar sucesso quando Telegram ja estava vinculado ao mesmo usuario") void shouldReturnSuccessWhenTelegramWasAlreadyLinkedToSameUser() { User user = buildUser(); + user.setWeeklySummaryEnabled(true); + user.setMonthlySummaryEnabled(true); user.setTelegramId(987654L); user.setTelegramLinkCode("FIN-ABC123"); user.setTelegramLinkCodeExpiresAt(LocalDateTime.now().plusMinutes(5)); @@ -251,6 +255,8 @@ void shouldReturnSuccessWhenTelegramWasAlreadyLinkedToSameUser() { assertThat(savedUser.getTelegramId()).isEqualTo(987654L); assertThat(savedUser.getTelegramLinkCode()).isNull(); assertThat(savedUser.getTelegramLinkCodeExpiresAt()).isNull(); + assertThat(savedUser.isWeeklySummaryEnabled()).isTrue(); + assertThat(savedUser.isMonthlySummaryEnabled()).isTrue(); verify(userRepository, never()).existsByTelegramId(anyLong()); } @@ -389,4 +395,4 @@ private User buildUser() { user.setOnboardingCompleted(false); return user; } -} \ No newline at end of file +} From 42297c3d4200261ab4677c8327a2d0be28632048 Mon Sep 17 00:00:00 2001 From: Bryan Pinheiro Date: Tue, 29 Sep 2026 09:26:28 -0300 Subject: [PATCH 2/3] feat(telegram): orienta escolha de resumos no vinculo --- .../formatter/TelegramAccountMessageFormatter.java | 11 ++++++++++- .../TelegramAlertPreferencesHandlerTest.java | 13 +++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/financebot-telegram-bot/src/main/java/com/financebot/telegrambot/formatter/TelegramAccountMessageFormatter.java b/financebot-telegram-bot/src/main/java/com/financebot/telegrambot/formatter/TelegramAccountMessageFormatter.java index bc9bd68..b889dee 100644 --- a/financebot-telegram-bot/src/main/java/com/financebot/telegrambot/formatter/TelegramAccountMessageFormatter.java +++ b/financebot-telegram-bot/src/main/java/com/financebot/telegrambot/formatter/TelegramAccountMessageFormatter.java @@ -151,7 +151,16 @@ public String formatConnectInstructionsMessage() { return """ /connect FIN-ABC123 """; } - public String formatConnectSuccessMessage(String message) { return escapeHtml(defaultText(message)); } + public String formatConnectSuccessMessage(String message) { + return """ + %s + + 🔔 Resumos automáticos são opcionais. + Consulte suas preferências com /alertas. + Para ativar, use /alertas semanal ligar ou /alertas mensal ligar. + Você pode alterar essas opções quando quiser. + """.formatted(escapeHtml(defaultText(message))).strip(); + } public String formatDisconnectSuccessMessage() { return """ ✅ Sua conta do Telegram foi desconectada com sucesso. diff --git a/financebot-telegram-bot/src/test/java/com/financebot/telegrambot/handler/TelegramAlertPreferencesHandlerTest.java b/financebot-telegram-bot/src/test/java/com/financebot/telegrambot/handler/TelegramAlertPreferencesHandlerTest.java index 8c53fdf..826effc 100644 --- a/financebot-telegram-bot/src/test/java/com/financebot/telegrambot/handler/TelegramAlertPreferencesHandlerTest.java +++ b/financebot-telegram-bot/src/test/java/com/financebot/telegrambot/handler/TelegramAlertPreferencesHandlerTest.java @@ -13,6 +13,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; +import com.financebot.telegrambot.dto.response.TelegramLinkConfirmResponse; @ExtendWith(MockitoExtension.class) class TelegramAlertPreferencesHandlerTest { @@ -60,4 +61,16 @@ void backendFailureIsExplainedWithoutPretendingPreferencesChanged() { assertThat(handler.handleAlerts("/alertas desligar", 123L)).contains("Não foi possível"); verify(client, never()).updateAlertPreferences(anyLong(), any()); } + + @Test + void successfulConnectionExplainsHowToChooseAutomaticSummaries() { + when(client.confirmTelegramLink(any())).thenReturn( + new TelegramLinkConfirmResponse(true, "Conta conectada com sucesso ao Telegram.")); + when(formatter.formatConnectSuccessMessage(anyString())).thenCallRealMethod(); + + String response = handler.handleConnect("/conectar FIN-ABC123", 123L, "bryan"); + + assertThat(response).contains("Resumos automáticos são opcionais", "/alertas", + "/alertas semanal ligar", "/alertas mensal ligar"); + } } From 0224a55804fffb65577cde71eedb523a0a61f8c8 Mon Sep 17 00:00:00 2001 From: Bryan Pinheiro Date: Tue, 29 Sep 2026 09:26:28 -0300 Subject: [PATCH 3/3] docs(alerts): documenta preferencias opt-in --- CHANGELOG.md | 9 +++++++++ docs/alerts.md | 8 +++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1b9af2b..30acf13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,15 @@ As versões do produto seguem as [regras de release](docs/releases.md). O histó ## [Unreleased] +### Changed + +- Novos usuários passam a iniciar com resumos semanais e mensais desativados, preservando as preferências existentes. +- A confirmação do vínculo Telegram explica como consultar e ativar cada resumo com `/alertas`. + +### Tests + +- Adicionada cobertura para o padrão opt-in dos resumos, preservação das preferências na reconexão e orientação após o vínculo. + ## [v1.10.1] — 2026-09-16 ### Changed diff --git a/docs/alerts.md b/docs/alerts.md index 6712548..3ce4e0b 100644 --- a/docs/alerts.md +++ b/docs/alerts.md @@ -33,7 +33,13 @@ No Telegram: - `/alertas semanal ligar|desligar`: controlar somente o resumo semanal. - `/alertas mensal ligar|desligar`: controlar somente o resumo mensal. -As preferências existentes começam ativadas. A geração respeita cada opção; +Novos usuários começam com os resumos semanal e mensal desativados e escolhem +explicitamente se desejam recebê-los. Alertas financeiros permanecem ativados +por padrão e podem ser controlados separadamente. A migration V16 altera apenas +o padrão de novas inserções; não modifica as preferências já persistidas. Ao +vincular o Telegram, o bot apresenta os comandos de consulta e ativação. + +A geração respeita cada opção; a reserva de entrega verifica novamente preferências, vínculo Telegram, expiração e configuração global. Uma alteração não cancela uma chamada ao Telegram que já começou. Desativação ou desvinculação antes da reserva cancela