🐛 PROBLEMA IDENTIFICADO:
- Cliente pagava 1 assinatura mas recebia 2 faturas
- Fatura 1: subscription_create (método confirm())
- Fatura 2: subscription_cycle (webhook PAYMENT.SALE.COMPLETED)
- Ambas criadas com 8 segundos de diferença
✅ SOLUÇÃO IMPLEMENTADA:
handlePaymentCompleted() agora verifica:
1. Se já existe fatura com mesmo paypal_payment_id
- Evita duplicação por webhook reprocessado
2. Se já existe fatura paga HOJE para esta subscription
- Evita duplicação do pagamento inicial
- Webhook vem depois do confirm()
3. Só cria nova fatura se for pagamento recorrente genuíno
📊 RESULTADO:
- Pagamento inicial: 1 fatura (subscription_create)
- Renovação mensal/anual: 1 fatura (subscription_cycle)
- Webhooks duplicados: ignorados com log
🗑️ LIMPEZA:
- Removida fatura duplicada WM-2025-000002 do user_id 35
- Atualizar CACHE_VERSION do sw.js para v1.60.0
- Forçar atualização de cache do navegador
- Resolver 404 nas novas rotas (problema de cache)
- Novo build: index-CbxYTYkw-1766160284564.js
✨ Novo Sistema de Cancelamento com Retenção Inteligente
- Wizard de 5 etapas com mensagens emocionais personalizadas
- Oferta de 3 meses grátis para cancelamentos por preço (elegível se >= 3 meses pagos)
- Cumprimento legal: período de garantia 7 dias com reembolso total
- Rastreamento de ofertas em DB (impede reuso)
- Analytics de cancelamentos (motivo, feedback, within_guarantee)
🎨 Frontend
- CancellationWizard.jsx (1050+ linhas) com 5 steps
- Profile.jsx com nova seção de assinatura
- i18n completo em 3 idiomas (pt-BR, ES, EN)
- 40+ traduções específicas
🔧 Backend
- SubscriptionController: 4 novos métodos (eligibility, process, offer, execute)
- PayPalService: suspensão temporária de assinatura
- 2 novas tabelas: retention_offers, cancellations
- Email de retenção emotivo em Blade
⚖️ Legal
- 7 dias: cancelamento = reembolso total + acesso imediato termina
- Após 7 dias: cancelamento = acesso até fim do período, sem reembolso
- Grace period apropriado conforme período de garantia
Backend:
- AccountDeletionController com 4 endpoints principais
- requestDeletionCode: Envia código de 6 dígitos por email (válido 10min)
- exportBackup: Exporta todos os dados do usuário em JSON
- executeHardDelete: Deleta permanentemente conta e dados com validação de código
- importBackup: Importa backup completo com mapeamento de IDs
Frontend:
- FactoryResetWizard: Wizard de 4 etapas (Warning → Backup → Code → Confirmation)
- ImportBackupModal: Drag & drop para importar backup JSON
- Integração na página Profile com seção de Gerenciamento de Dados
- accountDeletionService: Serviços API completos
Email:
- Template HTML para código de confirmação
- Avisos visuais sobre irreversibilidade da ação
i18n:
- Traduções completas em pt-BR, es, en
- 50+ strings de tradução adicionadas
- Avisos e mensagens de erro traduzidos
Funcionalidades:
✅ Hard delete com confirmação dupla (código + texto DELETAR)
✅ Backup completo em JSON (transações, contas, categorias, etc)
✅ Importação de backup com mapeamento inteligente de IDs
✅ Email com código de segurança
✅ Wizard responsivo com 4 etapas
✅ Validação de arquivos e tamanho (max 50MB)
✅ Drag & drop para upload
✅ Estatísticas de importação
✅ Logout automático após delete
- Adicionar traduções para modal de keywords do centro de custo Geral
- Corrigir toasts sem i18n em Accounts e LiabilityAccounts
- Adicionar regra no copilot-instructions sobre verificação obrigatória de i18n
- Garantir que todos os textos visíveis usem t() com traduções em pt-BR, es e en
- Corrigir validação de keywords permitindo array vazio
- Atualizar todas transações existentes sem centro de custo para Geral
- Criar centro de custo Geral para usuários sem ele
- Associar automaticamente novas transações criadas ao Geral
- Associar automaticamente transferências ao Geral
- Associar automaticamente transações importadas ao Geral
- Adicionado seletor de viewMode: 'week', 'month', 'all'
- Backend ajustado para trazer todos os dados quando viewMode é month/all
- Agrupamento por mês no frontend
- Lista flat para visualização 'todas'
- Traduções i18n para pt-BR, en, es
- Filtro 'Sem Categoria' mostra lista flat ao invés de agrupada por semanas
- Transações futuras aparecem quando qualquer filtro está ativo
- Filtro de data parcial (só data inicial ou só data final)
- COALESCE para effective_date com fallback para planned_date
- Traduções i18n para filteredResults, filterActive, uncategorized
- Backend: suporte para category_id=uncategorized nos endpoints index e byWeek
- Frontend: opção 'Sem Categoria' no CategorySelector com prop showUncategorized
- Permite filtrar 525 transações importadas que ainda não foram categorizadas
- Removido README.md padrão do Laravel (backend)
- Removidos scripts de deploy (não mais necessários)
- Atualizado copilot-instructions.md para novo fluxo
- Adicionada documentação de auditoria do servidor
- Sincronizado código de produção com repositório
Novo workflow:
- Trabalhamos diretamente em /root/webmoney (symlink para /var/www/webmoney)
- Mudanças PHP são instantâneas
- Mudanças React requerem 'npm run build'
- Commit após validação funcional
- Fixed 500 error on POST /api/asset-accounts/wizard
- business_id is now optional and only set if provided in request
- Previously tried to call User::businesses() which doesn't exist
- Redesigned all email templates with professional corporate style
- Created base layout with dark header, status cards, and footer
- Updated: subscription-cancelled, account-activation, welcome, welcome-new-user, due-payments-alert
- Removed emojis and gradients for cleaner look
- Added multi-language support (ES, PT-BR, EN)
- Fixed email delivery (sync instead of queue)
- Fixed PayPal already-cancelled subscription handling
- Cleaned orphan subscriptions from deleted users
- Nova Landing Page institucional em /
- Seções: Hero, Features, Pricing, FAQ, CTA, Footer
- Pricing integrado com API de planos
- Register.jsx agora suporta seleção de plano
- Parâmetro ?plan=slug na URL do registro
- Traduções EN, ES, PT-BR para landing
- PayPal configurado no servidor (sandbox)
Versão: 1.54.0
- Add UserManagementController@store for creating users
- Add POST /api/admin/users endpoint
- Support user types: Free, Pro, Admin
- Auto-create 100-year subscription for Pro/Admin users
- Add user creation modal to Users.jsx
- Complete SaaS limit testing:
- Free user limits: 1 account, 10 categories, 3 budgets, 100 tx
- Middleware blocks correctly at limits
- Error messages are user-friendly
- Usage stats API working correctly
- Update SAAS_STATUS.md with test results
- Bump version to 1.51.0
- Criar tabela plans com Free, Pro Monthly, Pro Annual
- Criar tabela subscriptions com status e integração PayPal
- Criar tabela invoices com numeração sequencial WM-YYYY-NNNNNN
- Models: Plan, Subscription, Invoice com helpers
- User: hasActiveSubscription(), onTrial(), currentPlan(), etc.
- API: GET /api/plans (público)
- Seeder: PlansSeeder com 3 planos base
- Fase 2 do roadmap SaaS concluída
## New Features
- Email notifications for overdue and upcoming payments
- User preferences page for notification settings
- Daily scheduler to send alerts at user-configured time
- Smart analysis: payable items, transfer suggestions between accounts
## Backend
- Migration for user_preferences table
- SendDuePaymentsAlert Artisan command
- DuePaymentsAlert Mailable with HTML/text templates
- UserPreferenceController with test-notification endpoint
- Scheduler config for notify:due-payments command
## Frontend
- Preferences.jsx page with notification toggle
- API service for preferences
- Route and menu link for settings
- Translations (PT-BR, EN, ES)
## Server
- Cron configured for Laravel scheduler
Version: 1.44.5