whisper-money/app/Console/Commands
Víctor Falcón 4cd7619791
feat(encryption): report count of users still holding encrypted data (#687)
## What

`encryption:notify-removal` now prints, on every run, the total number
of **non-deleted** users who still hold legacy browser-encrypted data:

```
4 non-deleted user(s) still have encrypted data.
```

The count is taken before the billing exclusion, so it reflects the full
remaining scope of browser-encrypted data. Soft-deleted users are
excluded (model default scope), as are users whose data is already
plaintext.

## Why

It's the signal for deciding when the browser-side encryption code can
finally be removed: once this reaches zero, nothing in the app depends
on client-side encrypted columns anymore.

## Not changed

Email-sending logic is untouched. Subscribed users are still never
warned — the recipient set continues to go through
`excludeBilledUsers()` exactly as before. This PR only adds a reporting
line.

## Testing

- New test asserts the count spans everyone with encrypted data
(subscribed included), while excluding soft-deleted and plaintext users,
and that sending still skips the subscribed user.
- Full `NotifyEncryptedDataRemovalCommandTest` suite green.
2026-07-17 09:29:33 +00:00
..
Concerns fix(encryption): never email or delete users who are still being billed (#656) 2026-07-07 16:04:27 +00:00
AgentDatabaseCommand.php
…
ApplyRealEstateRevaluationCommand.php
…
BackfillAccountIbans.php
…
BackfillSpaces.php feat(spaces): phase 0 — multi-tenant Space foundation (no behaviour change) (#650) 2026-07-09 14:26:07 +02:00
BackfillUserCurrencyCode.php
…
CancelFreeEnableBankingConnectionsCommand.php
…
CategorizeBackfillCommand.php
…
CheckBankLogosCommand.php
…
DeleteEncryptedDataAccountsCommand.php fix(encryption): never email or delete users who are still being billed (#656) 2026-07-07 16:04:27 +00:00
DeleteUserCommand.php
…
DisconnectBankingConnectionsCommand.php
…
E2eBankingFixtureCommand.php
…
EnsureLaunchCouponsCommand.php
…
FeatureDisableCommand.php
…
FeatureEnableCommand.php
…
GenerateBudgetPeriods.php
…
GenerateLandingAuthLinkCommand.php
…
GenerateMonthlyLoanBalances.php
…
GenerateStripePromotionCodesCommand.php
…
NotifyEncryptedDataRemovalCommand.php feat(encryption): report count of users still holding encrypted data (#687) 2026-07-17 09:29:33 +00:00
ResendLeadVerificationEmailsCommand.php
…
ResendSyncCommand.php
…
ResendSyncLeadsCommand.php
…
ResetDemoAccountCommand.php fix: skip demo reset when demo account is disabled (#626) 2026-07-03 07:27:43 +00:00
ResetUserCategories.php
…
RetryLeadFailedJobsCommand.php
…
ReviewIntegrationRequestsCommand.php
…
SendAiCohortReportCommand.php feat(stats): add --no-discord to the remaining report commands (#607) 2026-06-29 15:32:31 +02:00
SendAiConsentFollowUpEmailsCommand.php
…
SendDailyStatsReportCommand.php refactor: extract duplicated money formatter into App\Support\Money (#680) 2026-07-15 09:47:53 +02:00
SendExperimentFunnelReportCommand.php refactor: extract duplicated money formatter into App\Support\Money (#680) 2026-07-15 09:47:53 +02:00
SendPaywallFollowUpEmailsCommand.php
…
SendStuckCohortReportCommand.php feat(stats): add --no-discord to the remaining report commands (#607) 2026-06-29 15:32:31 +02:00
SendSubscriptionCancelledEmailCommand.php
…
SendSubscriptionFunnelReportCommand.php feat(stats): add --no-discord to the remaining report commands (#607) 2026-06-29 15:32:31 +02:00
SendTestEmails.php
…
SendUpdateEmailCommand.php
…
SendUserLeadInvitations.php
…
SendUserLeadReInvitations.php
…
SetBankLogoCommand.php
…
SetupMainUser.php
…
StripeSubscriptionStatsCommand.php refactor: extract duplicated money formatter into App\Support\Money (#680) 2026-07-15 09:47:53 +02:00
SuggestRulesCommand.php
…
SyncBankingConnections.php
…
SyncStripePricesCommand.php refactor: extract duplicated money formatter into App\Support\Money (#680) 2026-07-15 09:47:53 +02:00
TestScheduledDripEmailCommand.php
…
VerifyRefundFlowCommand.php
…