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
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");
+ }
}
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
+}