webmoney/CHANGELOG.md
marcoitaloesp-ai 679a1bc4b2
feat(subscriptions): Add PayPal integration for SaaS (Fase 3) v1.50.0
Backend:
- PayPalService with OAuth2, subscriptions, webhooks
- SubscriptionController with status, subscribe, confirm, cancel, invoices
- Webhook handlers for PayPal events (activated, cancelled, expired, payment)
- Config for PayPal credentials

Frontend:
- Pricing.jsx: Plans page with cards, FAQ, trust badges
- Billing.jsx: Subscription management, invoices list, cancel modal
- Added routes /pricing (public) and /billing (auth)
- Navigation links in Settings menu

Translations:
- pricing.* and billing.* keys in ES, PT-BR, EN
- nav.pricing, nav.billing

Ready for PayPal Sandbox testing once credentials are configured.
2025-12-17 10:56:54 +00:00

134 KiB
Raw Blame History

CHANGELOG

Todas as mudanças relevantes neste projeto serão documentadas neste arquivo. O formato segue Keep a Changelog. Este projeto adota Versionamento Semântico.

[1.50.0] - 2025-12-17

Added

  • 💳 Integração PayPal Subscriptions (Fase 3) - Sistema completo de assinaturas com PayPal
    • Backend:

      • PayPalService: Integração completa com PayPal Subscriptions API
        • Autenticação OAuth2 com cache de token
        • Criação de produtos e planos de billing no PayPal
        • Criação e cancelamento de assinaturas
        • Verificação de assinatura de webhooks
      • SubscriptionController: Endpoints para gestão de assinaturas
        • GET /api/subscription/status: Status da assinatura atual
        • POST /api/subscription/subscribe: Criar nova assinatura
        • POST /api/subscription/confirm: Confirmar após retorno PayPal
        • POST /api/subscription/cancel: Cancelar assinatura
        • GET /api/subscription/invoices: Listar faturas do usuário
        • POST /api/paypal/webhook: Receber eventos do PayPal
      • Webhooks suportados: BILLING.SUBSCRIPTION.ACTIVATED, CANCELLED, EXPIRED, PAYMENT.SALE.COMPLETED
    • Frontend:

      • Pricing.jsx: Página de planos e preços
        • Cards de planos com destaque para mais popular
        • Badge de economia para plano anual (17%)
        • Indicador de trial de 7 dias
        • FAQ com perguntas frequentes
        • Badges de segurança (PayPal, cancelamento)
      • Billing.jsx: Página de faturamento
        • Card com plano atual e status
        • Features e limites do plano
        • Lista de faturas com download PDF
        • Modal de confirmação para cancelar
        • Confirmação automática após retorno PayPal
    • Traduções: Completas em ES, PT-BR, EN

      • pricing.* (title, free, month, trial, FAQ, etc.)
      • billing.* (status, invoices, cancel, limits, etc.)
      • nav.billing, nav.pricing
    • Navegação: Novas opções no menu Settings

      • /pricing (público) - Página de planos
      • /billing (auth) - Gestão de assinatura

Technical Details

  • PayPal API v1: Subscriptions API com OAuth2
  • Webhook Events: Validação HMAC para segurança
  • Invoice Generation: Numeração automática WM-YYYY-NNNNNN
  • Trial Support: 7 dias com status 'trialing'
  • Multi-currency: EUR (default), USD, BRL suportados

Roadmap SaaS

  1. Fase 1: Perfil completo do usuário
  2. Fase 2: Tabelas de assinaturas (plans, subscriptions, invoices)
  3. Fase 3: Integração PayPal Subscriptions
  4. Fase 4: Enforcement de limites por plano

Configuration Required

Para ativar PayPal, configurar no .env:

PAYPAL_CLIENT_ID=your_client_id
PAYPAL_CLIENT_SECRET=your_client_secret
PAYPAL_MODE=sandbox  # ou 'live' para produção
PAYPAL_WEBHOOK_ID=your_webhook_id

[1.49.0] - 2025-12-17

Added

  • 💳 Sistema de Assinaturas (Fase 2) - Infraestrutura completa para modelo SaaS
    • Tabela plans: Planos de assinatura com preços, features e limites
      • Free: Grátis, até 3 contas, 10 categorias, 3 orçamentos, 1 meta
      • Pro Mensual: €9.99/mês, 7 dias trial, tudo ilimitado
      • Pro Anual: €99.99/ano, 17% desconto, 7 dias trial
    • Tabela subscriptions: Assinaturas dos usuários
      • Status: trialing, active, past_due, canceled, expired
      • Suporte a trial, grace period, cancelamento
      • Campos para integração PayPal
    • Tabela invoices: Faturas com numeração sequencial (WM-2025-NNNNNN)
      • Suporte a IVA/VAT (21% para EU)
      • Snapshot de dados de billing
    • API pública: GET /api/plans e GET /api/plans/{slug}

Technical Details

  • Migrations: 3 novas tabelas (plans, subscriptions, invoices)
  • Models: Plan, Subscription, Invoice com relacionamentos e helpers
  • User Model: Novos métodos hasActiveSubscription(), onTrial(), subscribedTo(), hasFeature(), getLimit(), currentPlan()
  • PlanController: Endpoint público para listar planos
  • PlansSeeder: Criação dos 3 planos base

Roadmap SaaS

  1. Fase 1: Perfil completo do usuário
  2. Fase 2: Tabelas de assinaturas (plans, subscriptions, invoices)
  3. Fase 3: Integração PayPal Subscriptions
  4. Fase 4: Página de Billing e gestão de assinatura

[1.48.0] - 2025-12-17

Added

  • 🌍 Perfil Completo para SaaS - Expansão da página de perfil para suportar modelo de assinaturas
    • Dados pessoais expandidos: nome, sobrenome, email
    • Telefone internacional: código do país selecionável (+34, +55, +1, etc.) com bandeiras
    • Preferências de comunicação:
      • Checkbox "Aceitar notificações por WhatsApp"
      • Checkbox "Aceitar emails promocionais"
    • Localização: país, timezone e idioma selecionáveis
    • Alteração de senha: seção separada com validação

Technical Details

  • Backend:
    • Nova migration: add_profile_fields_to_users_table
    • Campos adicionados: first_name, last_name, phone_country_code, phone, accept_whatsapp, accept_emails, avatar, country, timezone, locale
    • User Model: accessors getFullNameAttribute(), getFullPhoneAttribute()
    • AuthController: me() e updateProfile() atualizados
  • Frontend:
    • Componente Profile.jsx redesenhado com formulário completo
    • Listas de códigos de país, países e timezones
    • Traduções em ES, PT-BR, EN para todos os novos campos

Roadmap SaaS

Esta release é a Fase 1 da transformação para SaaS:

  1. Fase 1: Perfil completo do usuário
  2. Fase 2: Tabelas de assinaturas (plans, subscriptions, invoices)
  3. Fase 3: Integração PayPal Subscriptions
  4. Fase 4: Página de Billing e gestão de assinatura

[1.47.0] - 2025-12-17

Added

  • 👤 Página Meu Perfil - Gerenciamento de dados pessoais do usuário
    • Editar nome e email
    • Alterar senha (validação de senha atual obrigatória)
    • Validação em tempo real dos campos
    • Feedback visual de erros e sucesso
    • Traduções completas: PT-BR, EN, ES
    • Link no menu Configurações > Perfil

Technical Details

  • Backend: PUT /api/profile no AuthController
  • Frontend: Profile.jsx com formulários separados para dados e senha
  • Service: profileService em api.js com atualização automática do localStorage

[1.44.6] - 2025-12-17

Changed

  • 🛡️ Configuração Anti-Spam para Emails - Melhorias para garantir entrega de emails
    • Headers anti-spam adicionados: X-Mailer, X-Priority, Precedence, List-Unsubscribe
    • Template HTML com DOCTYPE XHTML 1.0 e charset UTF-8 correto
    • DKIM validado com selector default (opendkim-testkey OK)
    • Documentação atualizada: SPF , DMARC , DKIM , PTR

[1.44.5] - 2025-12-17

Added

  • 📧 Notificações de Pagamentos Vencidos - Sistema completo de alertas diários por email

    • Email diário no horário configurado pelo usuário (padrão: 20:00)
    • Conteúdo do email:
      • Resumo geral: total vencido, total amanhã, saldo disponível, déficit
      • Lista de itens vencidos (ordenados pelo mais antigo primeiro)
      • Lista de itens que vencem amanhã
      • Saldos de todas as contas
      • Lista de pagamentos que podem ser feitos com saldo atual
      • Lista de pagamentos que não podem ser feitos (sem saldo)
      • Sugestões de transferência entre contas para cobrir déficits
    • Fontes de dados: transactions pendentes, liability_installments pendentes, recurring_instances pendentes
    • Template responsivo em HTML com fallback para texto puro
  • ⚙️ Página de Preferências do Usuário - Nova seção de configurações

    • Ativar/desativar notificações de pagamentos
    • Configurar horário de envio (input tipo time)
    • Email personalizado (opcional, padrão é email do usuário)
    • Botão de teste para enviar notificação imediatamente
    • Configurações de idioma, timezone e moeda
    • Interface com traduções em PT-BR, EN e ES

Technical Details

  • Backend:

    • Nova tabela: user_preferences (notify_due_payments, notify_due_payments_time, notify_due_payments_email, language, timezone, currency)
    • Novo Model: UserPreference com relação ao User
    • Novo Artisan Command: notify:due-payments - executa a cada minuto via scheduler
    • Nova Mailable: DuePaymentsAlert com templates HTML e texto
    • Novo Controller: UserPreferenceController (GET/PUT preferences, POST test-notification)
    • Scheduler configurado em routes/console.php
  • Frontend:

    • Nova página: Preferences.jsx com formulário de configurações
    • Novo serviço: preferencesService em api.js
    • Nova rota: /preferences
    • Link no menu de configurações (dropdown do usuário)
  • Servidor:

    • Cron configurado: * * * * * cd /var/www/webmoney/backend && php artisan schedule:run

[1.44.4] - 2025-12-17

Fixed

  • Reports - Vencidos - Corrigido endpoint /api/reports/overdue para exibir todas as transações vencidas
    • Adicionada busca direta em recurring_instances pendentes com due_date < hoje
    • Antes: apenas 1 vencido era exibido (dependia de getOverdueRecurrences que só buscava templates ativos)
    • Agora: todas as instâncias de recorrências pendentes vencidas são exibidas (igual a parcelas de passivos e transações pendentes)
    • Identificação clara com sufixo "(Recorrente)" na descrição
    • source_type: 'recurring_instance' para diferenciar de outros tipos

[1.44.3] - 2025-12-17

Fixed

  • 🐛 CORREÇÃO DEFINITIVA: Propagação Espaçada de Orçamentos por Período
    • Comportamento Desejado: Orçamentos devem ser criados de forma espaçada ao longo do ano
    • Implementação Correta:
      • monthly: A cada 1 mês → Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec = 12 orçamentos
      • bimestral: A cada 2 meses → Jan, Mar, May, Jul, Sep, Nov = 6 orçamentos
      • trimestral: A cada 3 meses → Jan, Apr, Jul, Oct = 4 orçamentos
      • semestral: A cada 6 meses → Jan, Jul = 2 orçamentos
      • yearly: Apenas 1 vez → Jan = 1 orçamento
    • Exemplo prático: Criar orçamento bimestral em Janeiro → sistema cria automaticamente para Jan, Mar, Mai, Jul, Set, Nov
    • v1.44.2 estava criando apenas 2 meses consecutivos (Jan, Fev) em vez de espaçados

Technical Details

  • Arquivo: backend/app/Http/Controllers/Api/BudgetController.php
  • Método: store() - linhas 110-130
  • Mudança: Implementado $periodStepMap com salto de meses baseado no período
  • Lógica: for ($monthsAhead = $step; $monthsAhead < 12; $monthsAhead += $step)
  • Resultado: Orçamentos distribuídos uniformemente ao longo de 12 meses

[1.44.2] - 2025-12-17

Fixed

  • 🐛 CORREÇÃO CRÍTICA: Propagação de Orçamentos por Tipo de Período
    • BUG: Orçamentos bimestrais, trimestrais, semestrais e anuais estavam sendo propagados para TODOS os 12 meses seguintes, ignorando o tipo de período selecionado
    • CAUSA: Loop fixo for ($i = 1; $i <= 12; $i++) no método store() do BudgetController
    • SOLUÇÃO: Implementado mapa dinâmico de propagação por tipo de período:
      • monthly: Propaga 12 meses adicionais (mês atual + 12 seguintes) ✓
      • bimestral: Propaga 1 mês adicional (2 meses totais) ✓
      • trimestral: Propaga 2 meses adicionais (3 meses totais) ✓
      • semestral: Propaga 5 meses adicionais (6 meses totais) ✓
      • yearly: SEM propagação (1 mês apenas) ✓
    • Exemplo: Orçamento bimestral criado em Janeiro → cria Janeiro + Fevereiro (2 meses)
    • Antes: Orçamento bimestral criado em Janeiro → criava Janeiro até Dezembro (12 meses)

Technical Details

  • Arquivo: backend/app/Http/Controllers/Api/BudgetController.php
  • Método: store() - linhas 110-161
  • Mudança: Loop dinâmico baseado em $monthsToPropagateMap
  • Compatibilidade: Mantida para orçamentos existentes (não afetados)

[1.44.1] - 2025-12-17

Fixed

  • 🐛 HOTFIX: Erro de sintaxe no BudgetController.php linha 158
    • Removida vírgula dupla e código solto que causava erro 500 em todas as rotas de budgets
    • Corrigido: 'message' => 'Presupuesto creado y propagado',, 'costCenter'
    • Para: 'message' => 'Presupuesto creado y propagado',
    • Adicionado costCenter ao load() corretamente

[1.44.0] - 2025-12-17

Added

  • NOVA FUNCIONALIDADE: Centros de Custos em Orçamentos

    • Orçamentos agora podem ser filtrados por Centro de Custos (opcional)
    • Validação aceita: categoria OU subcategoria OU centro de custos
    • Backend: Migration adiciona coluna cost_center_id na tabela budgets
    • Frontend: Seletor de centro de custos no modal de criação de orçamento
    • Frontend: Exibição do nome do centro de custos nos cards de orçamento
  • NOVA FUNCIONALIDADE: Tipos de Período Completos

    • Migration atualiza enum period_type com todos os períodos:
      • monthly (mensal) - 1 mês
      • bimestral (bimestral) - 2 meses
      • trimestral (trimestral) - 3 meses
      • semestral (semestral) - 6 meses
      • yearly (anual) - 12 meses
    • Cálculo de períodos já estava implementado no modelo Budget.php

Changed

  • 📝 BudgetController: Atualizado para incluir costCenter em relacionamentos eager loading
  • 📝 BudgetController: Validação de duplicatas agora considera cost_center_id
  • 📝 Budget Model: Cálculo de spent_amount agora filtra por cost_center_id
  • 📝 Budget Model: Adicionado relacionamento costCenter()
  • 🌐 Traduções: Adicionadas chaves para cost center e tipos de período (pt-BR, es, en)

Technical

  • 🗄️ Migration: 2025_12_17_000001_add_cost_center_and_update_periods_to_budgets.php
    • Adiciona coluna cost_center_id (nullable, foreign key)
    • Atualiza period_type ENUM para incluir bimestral, trimestral, semestral

[1.43.26] - 2025-12-16

Fixed

  • 🐛 FIX CRITICAL: Erro 500 em projection-chart por variável indefinida
    • Removido uso de $overdueTransactions (variável que não existe mais após reescrita)
    • Substituído por $overdueImpact calculado anteriormente
    • Linhas 1306-1307: removido overdue_count e simplificado overdue_impact

[1.43.25] - 2025-12-16

Fixed

  • 🐛 REESCRITA COMPLETA - Projeção de Saldo Widget
    • Bug crítico corrigido: Estava duplicando valores (templates + instâncias)
    • Bug crítico corrigido: Lógica de overdue invertida (somava ao invés de subtrair)
    • Nova lógica simplificada e correta:
      • Ponto inicial = Saldo atual real (current_balance das contas)
      • Vencidos aplicados imediatamente no primeiro ponto (bizum 94€ + aluguel 1003€ = -1097€)
      • Apenas recurring_instances (não templates) são processadas
      • Vencidos processados uma única vez no início
      • Futuros processados em cada período (dia/semana)
    • Cálculo correto: 64.55€ (saldo) - 1097.81€ (vencidos) = -1033.26€ (projeção inicial)

[1.43.24] - 2025-12-16

Fixed

  • 🐛 Projeção de Saldo - Instâncias Recorrentes Vencidas
    • FIX: Widget de projeção agora inclui recurring_instances com status pendente e vencidas
    • Corrigida query para usar planned_date ao invés de effective_date nas transações pendentes
    • Adicionada query separada para recurring_instances vencidas e futuras
    • Impacto: Projeção agora reflete corretamente valores como Aluguel (1003.59€) e Bizum Asenergy (94.22€) vencidos
    • Cálculo: Saldo Atual - Transações Vencidas - Instâncias Recorrentes Vencidas = Projeção Correta

[1.43.23] - 2025-12-16

Fixed

  • 🐛 Critical: Erro de inicialização circular no Dashboard causado por dependências no useEffect de eventos
    • Removidas dependências loadSummary, loadCashflow, loadVariances do array de dependências
    • useEffect agora apenas atualiza refreshKey, permitindo que componentes façam seus próprios fetches
    • Corrigido erro: "Cannot access 'O' before initialization"

[1.43.22] - 2025-12-16

Fixed

  • Widget de Projeção - Refresh Automático
    • FIX: Widget de projeção agora atualiza automaticamente quando há mudanças
    • Sistema de eventos customizados para comunicação entre componentes
    • Eventos implementados: recurring-paid, transaction-created, transaction-updated, transaction-deleted, recurring-updated
    • Dashboard escuta eventos e força recarregamento via refreshKey
    • CalendarWidget emite eventos após pagar/conciliar instâncias
    • Widget de projeção desmonta e remonta para recarregar dados atualizados

[1.43.21] - 2025-12-16

Fixed

  • Projeção de Saldo - Instâncias de Recorrências Vencidas
    • FIX CRÍTICO: Projeção agora inclui instâncias de recorrências pendentes vencidas
    • Exemplo: "Aluguel" (1003,59€, vencida há 15 dias) e "Compra Bizum Asenergy" (94,22€, vencida há 29 dias)
    • Query adicional para recurring_instances com status='pending' e due_date < hoje
    • Separa receitas e despesas vencidas corretamente
    • Valores agora aparecem em overdue.income e overdue.expense

[1.43.20] - 2025-12-16

Fixed

  • Projeção de Saldo - Transações Pendentes Vencidas
    • FIX: Projeção agora inclui transações pendentes vencidas (status='pending' e planned_date < hoje)
    • Adicionadas transações pendentes futuras (planned_date entre hoje e fim do mês)
    • Separação clara entre transações vencidas (overdue) e pendentes (pending_this_month)
    • Response JSON atualizado com breakdown completo:
      • overdue.income e overdue.expense (transações vencidas)
      • pending_this_month.pending_income e pending_expense (transações futuras)
    • Projeção inteligente agora considera: realizado + recorrências + passivos + vencidos + pendentes

[1.43.19] - 2025-12-16

Changed

  • Revisão Completa do Modal de Editar Template Recorrente
    • Adicionados TODOS os campos disponíveis no modelo (17 campos totais)
    • Campos adicionados: transaction_description, frequency_interval, start_date, end_date, max_occurrences, cost_center_id, is_active
    • Interface reorganizada com ícones e labels claros
    • Campos condicionais (day_of_month apenas para frequências mensais)
    • Validação e parsing corretos dos dados antes do envio
    • Placeholders e textos de ajuda para melhor UX
    • Informações do template (ID, data criação, ocorrências geradas) exibidas no rodapé
    • Suporte a status ativo/pausado com toggle visual
    • Campo de intervalo para repetições personalizadas (ex: a cada 2 meses)

[1.43.18] - 2025-12-16

Changed

  • Hard Delete de Templates Recorrentes
    • Exclusão agora remove permanentemente template e TODAS as instâncias do banco de dados
    • Backend: forceDelete() em vez de soft delete ou desativação
    • Remove todas as instâncias (futuras, pagas, canceladas, etc.)
    • Modal de confirmação atualizado com avisos claros sobre exclusão permanente
    • Ação irreversível - dados não podem ser recuperados

[1.43.17] - 2025-12-16

Changed

  • Categorias - Revisão Completa de Cores para Máximo Contraste
    • 170 categorias revisadas e padronizadas com cores escuras para perfeito contraste
    • Sistema de cores por família:
      • Alimentação: Vermelhos escuros (#dc2626 a #450a0a)
      • Transporte: Azuis escuros (#2563eb a #172554)
      • Moradia: Roxos escuros (#7c3aed a #2e1065)
      • Saúde: Verdes escuros (#059669 a #064e3b)
      • Educação: Laranjas escuros (#d97706 a #78350f)
      • Lazer: Rosas escuros (#db2777 a #881337)
      • Vestuário: Cianos escuros (#0891b2 a #164e63)
      • Beleza: Roxos escuros (#9333ea a #581c87)
      • Tecnologia: Índigos escuros (#4f46e5 a #312e81)
      • Pets: Teals escuros (#0d9488 a #134e4a)
      • Vending: Laranjas escuros (#ea580c a #7c2d12)
      • Vaper/Tabaco: Azuis escuros (#1e40af a #2563eb)
      • Investimentos: Verdes escuros (#16a34a a #14532d)
      • Impostos: Vermelhos escuros (#b91c1c a #450a0a)
      • Seguros: Azuis escuros (#0284c7 a #0c4a6e)
      • Presentes: Rosas escuros (#e11d48 a #881337)
      • Empréstimos: Limas escuros (#65a30d a #365314)
      • Salário: Verdes escuros (#16a34a a #14532d)
      • Negócios: Azuis escuros (#1d4ed8 a #172554)
      • Outras Receitas: Roxos escuros (#7c3aed a #3b0a78)
      • Viagens: Vermelhos escuros (#b91c1c a #7f1d1d)
      • Passeios Turísticos: Laranjas escuros (#d97706 a #78350f)
      • Filhos: Cores diversas escuras por subcategoria
    • Garantia: 100% das categorias com contraste WCAG AA+ (texto branco legível)
    • Consistência: Cores relacionadas dentro da mesma família
    • Identificação visual: Cada grupo tem sua paleta única

[1.43.16] - 2025-12-16

Changed

  • Categorias - Padronização Global de Contraste
    • Ajustadas TODAS as cores de categorias para garantir contraste adequado com texto branco
    • 18 categorias com cores muito claras foram escurecidas:
      • Delivery: #FCA5A5 → #dc2626 (vermelho escuro)
      • Tapas/Pinchos: #FCA5A5 → #dc2626
      • Bar/Cervecería: #F87171 → #dc2626
      • Pedágio: #93C5FD → #2563eb (azul escuro)
      • Seguro Veículo: #60A5FA → #3b82f6
      • Bicicleta/Patinete: #60A5FA → #3b82f6
      • Plano de Saúde: #6EE7B7 → #059669 (verde escuro)
      • Academia: #34D399 → #10b981
      • Idiomas: #FCD34D → #d97706 (laranja escuro)
      • Hobbies: #F9A8D4 → #db2777 (rosa escuro)
      • Eventos: #F472B6 → #ec4899
      • Cosméticos: #E9D5FF → #9333ea (roxo escuro)
      • Cloud/SaaS: #C7D2FE → #4f46e5 (índigo escuro)
      • Aluguel Máquinas: #FDBA74 → #f97316 (laranja)
      • Flamenco & Cultura: #FCD34D → #FCD34D (mantido, limite aceitável)
      • Excursões Guiadas: #FDE68A → #FCD34D
      • Passeios & Tours: #FCA5A5 → #B91C1C (vermelho escuro)
      • Seguro Viagem: #F87171 → #DC2626
    • Resultado: 100% das categorias agora têm excelente legibilidade
    • Padrão uniforme em toda a aplicação

[1.43.15] - 2025-12-16

Changed

  • Categorias - Melhor Contraste para Moradia
    • Cores da categoria "Moradia" e subcategorias ajustadas para tons mais escuros
    • Melhora significativa no contraste com texto branco
    • Cores atualizadas:
      • Moradia: #8B5CF6 → #7c3aed (roxo mais escuro)
      • Aluguel: #7C3AED → #6d28d9
      • Condomínio: #6D28D9 → #5b21b6
      • Luz: #5B21B6 → #4c1d95
      • Água: #4C1D95 → #3b0a78
      • Gás: #2E1065 → #2e1065 (mantido)
      • Internet: #C4B5FD → #8b5cf6 (muito mais escuro)
      • Telefone: #A78BFA → #7c3aed (muito mais escuro)
      • Reparos: #8B5CF6 → #6d28d9
    • Todas agora têm legibilidade excelente em badges

[1.43.14] - 2025-12-16

Fixed

  • Relatórios - Badges de Categoria (Recorrentes e Futuras)
    • Adicionado fontSize: '0.75rem' aos badges de categoria
    • Aplicado em:
      • Transações Recorrentes
      • Transações Futuras
    • Agora todos os badges de categoria têm tamanho consistente

[1.43.13] - 2025-12-16

Changed

  • Relatórios - Padronização de Badges
    • Categorias: Agora usam cores personalizadas (category_color) ao invés de bg-primary
      • Mostram ícone da categoria quando disponível
      • Fallback para bg-secondary quando sem categoria
      • Aplicado em: Maiores Gastos, Transações Futuras
    • Tamanhos de fonte: Padronizados em 0.75rem para todos os badges
      • Porcentagens, contadores, dias, frequências, tipos
    • Tipo de Passivo: Alterado de bg-secondary para bg-info (azul)
    • Frequência (Recorrentes): Alterado de bg-secondary para bg-primary (destaque)
    • Consistência visual: Todos os badges agora seguem o mesmo padrão de estilo

Fixed

  • Cards mobile de Maiores Gastos agora mostram cor e ícone corretos da categoria
  • Transações Futuras mostram fallback quando sem categoria

[1.43.12] - 2025-12-16

Fixed

  • Transações Recorrentes - Badge de Tipo
    • Badge de "Débito" agora aparece em vermelho (bg-danger)
    • Badge de "Crédito" continua em verde (bg-success)
    • Problema: Código comparava template.type === 'expense' mas banco usa 'debit'/'credit'
    • Solução: Corrigido para template.type === 'debit'
    • Aplicado em:
      • Cards mobile
      • Tabela desktop

[1.43.11] - 2025-12-16

Added

  • Relatórios - Filtro de Período
    • Seletores de "Data Início" e "Data Fim" nos relatórios:
      • Por Categoria
      • Por Centro de Custo
      • Maiores Gastos
    • Período padrão: Início do ano (01/01/2025) até hoje (16/12/2025)
    • Usuário pode alterar o período livremente
    • Interface responsiva: campos lado a lado em desktop, empilhados em mobile
    • Parâmetros start_date e end_date enviados à API
    • Traduções:
      • pt-BR: "Data Início", "Data Fim"
      • en: "Start Date", "End Date"
      • es: "Fecha Inicio", "Fecha Fin"

Changed

  • Frontend - Reports.jsx
    • Estados startDate e endDate adicionados
    • useEffect atualizado com dependências startDate e endDate
    • Parâmetros de data incluídos em:
      • reportService.getByCategory()
      • reportService.getByCostCenter()
      • reportService.getTopExpenses()

[1.43.10] - 2025-12-16

Fixed

  • Relatórios - Drill-down de Categorias e Centros de Custo
    • FIX CRÍTICO: Ao clicar em uma categoria/centro pai, a soma das subcategorias não batia com o total
    • Problema: Query do nível 3 filtrava apenas c.parent_id = ?, excluindo transações da categoria pai
    • Exemplo: "Vaper/Tabaco" mostrava 784,68€ (correto), mas subcategorias somavam 297,33€
    • Causa: 487,35€ estavam na própria categoria pai, não nas subcategorias
    • Solução: Query agora usa (c.id = ? OR c.parent_id = ?) para incluir categoria pai e subcategorias
    • Aplicado em:
      • /api/reports/by-category (parâmetro parent_id)
      • /api/reports/by-cost-center (parâmetros cost_center_id + category_id)
    • Agora mostra corretamente:
      • Categoria pai: 487,35€
      • Subcategoria 1: 240,45€
      • Subcategoria 2: 44,20€
      • Subcategoria 3: 12,68€
      • Total: 784,68€

[1.43.9] - 2025-12-16

Added

  • Relatório de Centros de Custo - Drill-down de 3 Níveis

    • Nível 1: Mostra todos os centros de custo
    • Nível 2: Clicar em um centro de custo mostra categorias (agrupadas por categoria pai)
    • Nível 3: Clicar em uma categoria mostra suas subcategorias
    • Navegação com breadcrumbs: "Todos os Centros" > Nome do Centro > Nome da Categoria
    • Botões "Voltar" em cada nível
    • Otimização mobile: cards responsivos em todos os 3 níveis
    • Hover visual em tabelas e cards clicáveis
  • Backend - API /reports/by-cost-center

    • Parâmetros: cost_center_id (nível 2) e category_id (nível 3)
    • Sem parâmetros: lista centros de custo
    • Com cost_center_id: lista categorias pai do centro de custo
    • Com cost_center_id + category_id: lista subcategorias da categoria
    • Query usa COALESCE para agregar subcategorias na categoria pai
    • Suporte para transações sem centro de custo (id=0, "Sem classificar")
  • Tradução i18n

    • pt-BR: "Todos os Centros", "Voltar para Todos os Centros", "Voltar para {nome}"
    • es: "Todos los Centros"
    • en: "All Centers"

Changed

  • Frontend - Reports.jsx
    • Adicionados estados: selectedCostCenter e selectedCostCenterCategory
    • Função renderCostCenter reescrita com lógica de 3 níveis
    • useEffect reage a mudanças de selectedCostCenter e selectedCostCenterCategory
    • Estilo condicional: cursor pointer e hover apenas para itens clicáveis
    • Breadcrumbs dinâmicos baseados no nível de navegação

[1.43.8] - 2025-12-16

Added

  • Relatório de Categorias - Drill-down para Subcategorias

    • Clicar em uma categoria pai agora mostra suas subcategorias em um novo gráfico
    • Mesmo layout visual (gráfico de pizza + lista/cards)
    • Botão "Voltar" para retornar às categorias principais
    • Hover visual em tabelas e cards clicáveis
    • Backend suporta filtro parent_id para mostrar apenas subcategorias de uma categoria específica
  • Tradução i18n

    • pt-BR: "Distribuição de Subcategorias"
    • es: "Distribución de Subcategorías"
    • en: "Subcategory Distribution"

Changed

  • Backend - API /reports/by-category
    • Novo parâmetro parent_id para filtrar subcategorias
    • Query padrão agrupa por categoria pai, somando transações de todas as subcategorias
    • Query com parent_id filtra subcategorias da categoria especificada
    • FIX: Transações em subcategorias agora aparecem corretamente agrupadas na categoria pai

[1.43.7] - 2025-12-16

Changed

  • Backend - Relatório de Centros de Custo incluindo transações sem centro
    • Transações sem centro de custo (cost_center_id = NULL) agora aparecem como categoria "General"
    • Cor padrão: #6b7280 para transações não classificadas
    • Query modificada: COALESCE para tratar NULLs como id=0, nome='General'
    • Relatório completo: todas as transações aparecem no relatório byCostCenter

Added

  • Frontend - Tradução i18n 'general'

    • pt-BR: "Geral"
    • es: "General"
    • en: "General"
  • Frontend - Reports Mobile Optimization (Continuação)

    • Tab Category: col-12 mobile, gráfico 300px, lista em cards compactos
    • Tab Evolution: Cards 2x2, gráficos 250px/200px, botões xs, fontes 0.7-0.85rem
    • Tab TopExpenses - Lista Detalhada: Cards compactos mobile vs tabela desktop

[1.43.6] - 2025-12-16

Improved

  • Modal Detalhes Liabilities - Mobile Otimizado - Visualização completa mobile
    • Modal: fullscreen mobile vs xl desktop
    • Header: fontes 0.95rem, ícone 0.9rem, texto truncado
    • Summary cards: Grid 2x2 mobile, padding 0.5rem, fontes 0.65-0.85rem
    • Taxas: Grid 3 colunas mobile, labels curtos (Mensal/Anual/Total)
    • Progress bar: 12px mobile, fontes 0.65-0.75rem
    • Parcelas: Cards layout mobile com todas as info compactas
    • Cards parcelas: status badge, valores, juros, taxas, botões de ação
    • Botão footer: full-width mobile, fonte 0.85rem
    • Desktop: Tabela completa preservada
    • i18n: Adicionadas chaves 'monthly', 'annual', 'total' em pt-BR e es

[1.43.5] - 2025-12-16

Improved

  • Página Liabilities - Mobile Otimizado - Contas Passivo adaptadas para mobile
    • Header: Layout flex-column, botão full-width, fontes reduzidas (1.1rem/0.75rem)
    • Summary Cards: Grid 2 colunas mobile, sem ícones laterais, texto truncado
    • Valores compactos: 0.9rem mobile vs 1.25rem desktop
    • Filtros: Grid 50/50 mobile sem label, fontes 0.8rem
    • Cards de Contratos: col-12 mobile, padding 0.75rem, fontes 0.65-0.85rem
    • Progress bar: 6px mobile vs 8px desktop
    • Botões: fontes 0.75rem mobile, mantém ícones e funcionalidade
    • Desktop: Layout original preservado

[1.43.4] - 2025-12-16

Improved

  • Badges Padronizados - Estilo translúcido consistente em todo o sistema

    • Padrão global via CSS: bg-{color} → estilo bg-opacity-25 text-{color} automático
    • Aparência moderna e uniforme: background translúcido + texto colorido
    • Afetados: RecurringTransactions, Accounts, Categories, TransactionsByWeek, FinancialHealth, CostCenters
    • Widgets: UpcomingWidget, OverdueWidget, CalendarWidget, OverpaymentsAnalysis
    • Simplificação: remover classes redundantes dos JSX, CSS aplica estilo
  • Botões de Ação Padronizados - RecurringTransactions

    • Estilo outline consistente: btn-outline-{color} em todas as abas
    • Templates e Instâncias usam mesmo padrão visual
    • Info (visualizar), Primary (executar), Success (editar), Warning (adiar), Danger (excluir)

[1.43.3] - 2025-12-16

Improved

  • Página Transações - Mobile Completo - Lista de transações otimizada para mobile

    • Cards individuais: data + badges (tipo/status) + descrição + conta + categoria + valor
    • Menu dropdown com todas as ações (completar, editar, duplicar, dividir, etc.)
    • Descrição original do banco visível quando diferente
    • Fontes: 0.65-1rem, padding p-3, borders secundários
    • Desktop mantém tabela completa
  • Paginação Mobile - Controles otimizados

    • Mobile: Mostra apenas 3 botões (anterior, atual, próxima)
    • Indicador "/ total" para contexto
    • Botões maiores (36px) para facilitar toque
    • Desktop: Mantém visualização de até 7 páginas

Fixed

  • CategorySelector - Scroll e Visualização - Problemas em modais corrigidos
    • Position fixed com z-index 100000 (acima de modais)
    • Scroll sempre visível com scrollbar customizada (8px)
    • Altura fixa garantindo funcionamento: 280px (mobile) / 350px (desktop)
    • Largura mínima inteligente: 280px (mobile) / 320px (desktop)
    • Ajuste automático de posição se ultrapassar viewport
    • Margens de segurança: 10-20px das bordas
    • Cores da scrollbar harmonizadas com tema escuro
    • -webkit-overflow-scrolling: touch para iOS
    • Modal com overflow: auto para scroll adequado
    • Cálculo simplificado e robusto de posição
    • Funciona perfeitamente em todos os lugares (modais e páginas)

[1.43.2] - 2025-12-16

Improved

  • Página Accounts - Contas Passivo Mobile - Layout em cards para mobile
    • Seção "Passivos" convertida para cards em dispositivos mobile
    • Cards mostram: ícone + nome + status + número contrato + credor
    • Valores principal e saldo devedor lado a lado
    • Barra de progresso com percentagem visual
    • Fontes otimizadas: 0.65-0.85rem para legibilidade mobile
    • Padding compacto: p-3, background escuro (#0f172a)
    • Mantém onClick para navegar para /liabilities
    • Desktop mantém layout de tabela completo

[1.43.1] - 2025-12-16

Fixed

  • Espaços em branco desnecessários em Mobile - Otimização completa de altura e padding
    • Widget Fluxo de Caixa:
      • Removido h-100 em mobile (agora se ajusta ao conteúdo)
      • Card-body padding reduzido: 1rem
      • Estados loading/erro: altura 280px (antes 350px fixo)
      • Gráfico: 280px (mobile) vs 350px (desktop)
      • Resumo: margens reduzidas mt-3 pt-2
    • Widget Projeção de Saldo:
      • Card-body padding: 1rem em mobile
      • Gráfico reduzido: 250px (mobile) vs 350px (desktop)
      • Alertas compactos: padding p-2, margens mb-2/mb-3, fonte 0.75rem
      • Textos abreviados em alertas para economizar espaço

Improved

  • Abreviações em textos mobile - Labels compactos sem quebra de linha
    • Fluxo de Caixa: "RECEITAS", "DESPESAS", "MÉD. REC.", "MÉD. DESP."
    • Sobrepagamentos: "TOTAL", "QTD", "MÉDIA"
    • Alertas: "Saldo negativo em" ao invés de "Previsão de saldo negativo em"
    • Todos com whiteSpace: 'nowrap' para prevenir quebras

[1.43.0] - 2025-12-16

Added

  • Widget Projeção de Saldo Mobile - Comportamento colapsável implementado

    • Inicia colapsado em mobile, expande automaticamente se houver dados
    • Botão toggle chevron up/down no header
    • Botões de período (1, 2, 3, 6, 12 meses) otimizados:
      • Desktop: btn-group horizontal
      • Mobile: layout flex-wrap em 3 colunas (33.333% cada)
    • Altura do gráfico ajustada: 300px (mobile) vs 350px (desktop)
    • Cards de estatísticas otimizados para mobile:
      • Padding reduzido: p-2 (mobile) vs p-3 (desktop)
      • Gap menor: g-2 vs g-3
      • Fontes menores: labels 0.7rem, valores 0.9rem
      • Percentual de variação oculto em mobile
  • Widget Análise de Sobrepagamentos Mobile - UX completamente redesenhada

    • Comportamento colapsável com auto-expansão quando há dados
    • Header otimizado: texto menor, badge compacto, "(12 meses)" oculto
    • Gráfico responsivo: 180px (mobile) vs 220px (desktop)
    • Cards de resumo compactos: padding p-1, fontes 0.65-0.85rem
    • Layout de transações revolucionário:
      • Mobile: Cards verticais ao invés de tabela horizontal
      • Cada card mostra: descrição, valor (+), categoria, data, percentual
      • Fontes otimizadas: 0.6-0.75rem
      • Border amarelo sutil para destaque
      • Altura máxima: 200px com scroll
      • Desktop: Tabela completa mantida com todas as colunas

Fixed

  • React Hooks Error #310 - Corrigida violação das regras de hooks
    • Problema: useEffect sendo chamado após returns condicionais
    • Solução: Movido cálculo de monthsData para antes dos returns
    • Adicionado useEffect na importação: import { useEffect }
    • Todos os hooks agora executam na ordem correta
    • Dependências corretas em useEffect: [isMobile, monthsData.length, isExpanded]

Improved

  • Consistência Mobile Global - Todos os widgets principais otimizados:
    • Calendário: navegação entre semanas + colapso
    • Próximos 7 Dias: colapso + sync altura desktop
    • Transações em Atraso: colapso + auto-expansão
    • Projeção de Saldo: colapso + botões otimizados + cards compactos
    • Análise Sobrepagamentos: colapso + layout cards mobile
    • UX mobile profissional e consistente em todo Dashboard

[1.42.0] - 2025-12-16

Added

  • Navegação entre semanas no Calendário Mobile - Implementada paginação completa
    • Botões chevron esquerda/direita para navegar entre semanas
    • Título dinâmico: "Esta Semana", "+1 semana", "-2 semanas", etc.
    • Botão "Hoje" reseta para semana atual (weekOffset = 0)
    • Calendário carrega dados automaticamente da semana selecionada
    • Offset de semanas persistente durante navegação

Fixed

  • Calendário não exibia em Mobile - Corrigida lógica de renderização
    • Problema: condição day.isCurrentMonth escondia dias em mobile
    • Solução: (isMobile || day.isCurrentMonth) permite mostrar semana completa
    • Adicionado grid CSS: .calendar-grid e .calendar-grid-week (7 colunas)
    • Botão toggle (chevron) implementado no header mobile
    • Badge mostra quantidade de transações do dia selecionado
    • Tamanhos específicos: mobile (11px, 50px min-height) vs desktop (12px, 32px)
    • Destaque visual do dia atual com border primary

Changed

  • Widget Transações em Atraso - Comportamento Mobile - Consistência com outros widgets
    • Inicia colapsado em mobile (apenas header visível)
    • Auto-expansão quando há transações vencidas
    • Botão toggle chevron up/down no header
    • Badge mostra total de itens vencidos
    • Altura dinâmica: height: auto em mobile
    • Body com display: none quando colapsado

Improved

  • Consistência Mobile - Todos os widgets do Dashboard seguem mesmo padrão:
    • Calendário: colapso + navegação entre semanas
    • Próximos 7 Dias: colapso + auto-expansão com dados
    • Transações em Atraso: colapso + auto-expansão com dados
    • UX unificada e previsível em dispositivos móveis

[1.41.1] - 2025-12-16

Fixed

  • Sincronização de altura em Desktop - Widget "Próximos 7 Dias" agora sincroniza perfeitamente com o card central de transações
    • Corrigido seletor para buscar .col-lg-8 .col-lg-7 .card (lista de transações do dia)
    • Aumentado timeout de 100ms para 200ms para garantir renderização completa
    • Altura idêntica entre os 3 widgets em desktop: calendário, transações do dia e próximos 7 dias

Validated

  • Mobile: Widgets colapsam corretamente, expandem apenas com dados
  • Desktop: Altura sincronizada perfeitamente entre todos os widgets

[1.41.0] - 2025-12-16

Changed

  • WIDGETS COLAPSÁVEIS EM MOBILE - Otimização do Dashboard para telas pequenas
    • Calendário e Próximos 7 Dias iniciam colapsados em mobile (<768px)
    • Expansão automática quando houver dados para exibir
    • Botão toggle (chevron up/down) no header para expandir/colapsar manualmente
    • Badge com contagem de itens no header quando há dados
    • CalendarWidget: mostra quantidade de transações do dia selecionado
    • UpcomingWidget: mostra quantidade total de transações pendentes
    • Comportamento desktop mantido: sempre expandido

Improved

  • UX Mobile - Menos scroll necessário, informação visível apenas quando relevante
  • Performance - Reduz altura inicial da página em mobile
  • Feedback visual - Badges indicam quantidade de dados sem necessidade de expandir

[1.40.0] - 2025-12-16

Changed

  • SIDEBAR MOBILE OVERLAY - UX completamente reimaginada para mobile
    • Sidebar escondida por padrão em mobile (<768px) - conteúdo em tela cheia
    • Hamburger menu (☰) no header para abrir sidebar
    • Sidebar slide-in overlay (280px) sobre o conteúdo
    • Backdrop escuro (rgba(0,0,0,0.5)) para fechar ao clicar fora
    • Animação suave: cubic-bezier(0.4, 0, 0.2, 1) 0.3s
    • Shadow: 4px 0 12px quando aberta
    • App-main: margin-left 0 em mobile (100% width)
    • Fechamento automático ao redimensionar para desktop
    • Mantém comportamento desktop: sidebar fixa colapsável

Fixed

  • Layout mobile - Agora conteúdo usa 100% da largura da tela
  • Touch target - Hamburger menu 44x44px (Apple HIG)
  • Safe areas - Removido padding-left/right do body para permitir overlay
  • Backdrop - Escondido em desktop, visível apenas em mobile

[1.39.2] - 2025-12-16

Fixed

  • Responsividade iPhone CORRIGIDA - CSS com !important para forçar aplicação
    • Sidebar forçada para 60px em mobile (<768px) com !important
    • Sidebar extra-compacta (56px) em telas <430px
    • Sidebar 50px em landscape mode (<430px altura)
    • App-main margin-left ajustado automaticamente
    • Texto sidebar 100% escondido em mobile (display/opacity/visibility: none)
    • Touch targets 44x44px em todos elementos interativos
    • Safe area insets aplicadas a sidebar e app-main
    • Cards ultra-compactas: padding 0.5rem em <430px
    • Gráficos: 250px (portrait) / 180px (landscape)
    • Modais: margin 0.5rem, width calc(100% - 1rem)
    • Row margins: -0.25rem para aproveitar espaço
    • Tabelas: font 0.8rem, padding 0.3rem/0.2rem
    • Inputs: font-size 16px para prevenir zoom
    • PWA: overscroll-behavior none, sidebar fixed position
    • Todos os !important necessários para sobrescrever CSS existente

[1.39.1] - 2025-12-16

Fixed

  • Responsividade iPhone - Otimizações para telas verticais iOS
    • Viewport otimizado: viewport-fit=cover, user-scalable=no
    • Safe Area Insets: suporte completo para notch e Dynamic Island
    • Touch targets mínimos de 44x44px (Apple Human Interface Guidelines)
    • Inputs com font-size 16px para prevenir zoom automático no iOS
    • Previne bounce scroll (overscroll-behavior-y: none)
    • -webkit-overflow-scrolling: touch para scroll suave
    • Media queries específicas para iPhone (max-width: 430px)
    • Landscape mode otimizado (max-height: 430px)
    • Reduz padding/margens em telas <430px
    • Canvas gráficos: max-height 250px (portrait) / 180px (landscape)
    • Tap highlight otimizado: rgba azul translúcido
    • Dropdowns com max-height e touch scrolling
    • Modais ajustados para safe area (notch/island)
    • Remove bounce quando instalado como PWA (display-mode: standalone)

Changed

  • Tamanhos de fonte ajustados para iPhone: 10pt base em telas <430px
  • Cards e modais com padding reduzido em telas pequenas
  • Tabelas com fonte 10pt e padding compacto em mobile

[1.39.0] - 2025-12-16

Added

  • PWA para iOS - Aplicativo instalável em iPhone/iPad
    • Service Worker com estratégias de cache offline-first
    • Cache versionado (v1.39.0) com limpeza automática de versões antigas
    • Estratégias de cache por tipo: Cache-First (imagens/fontes), Network-First (API), Stale-While-Revalidate (HTML/CSS/JS)
    • Registro automático do Service Worker em main.jsx
    • Verificação de atualizações a cada 1 hora
    • Prompt de atualização quando nova versão disponível
    • manifest.json otimizado: scope, categories (finance/productivity/business)
    • Meta tags iOS: apple-mobile-web-app-capable, black-translucent status bar
    • Meta tag format-detection para desabilitar auto-detecção de telefones
    • Ícone Apple Touch Icon (180x180) no manifest
    • Suporte completo para instalação via Safari iOS

Changed

  • Service Worker atualizado para versão 1.39.0
  • manifest.json - Adicionado prefer_related_applications: false
  • index.html - Status bar style alterado de "default" para "black-translucent" (melhor em iOS)

[1.38.0] - 2025-12-15

Added

  • Projeção de Saldo - Agora considera transações em atraso
    • Backend busca todas as transações pendentes (incluindo atrasadas)
    • Processa transações atrasadas ANTES do ponto inicial da projeção
    • Adiciona informações de transações em atraso no summary da API
    • Frontend exibe alerta amarelo quando há transações em atraso incluídas
    • Alerta mostra quantidade de transações e impacto no saldo
    • Traduções completas: overdueIncluded, overdueTransactions, includedInProjection (pt-BR, en, es)
    • Melhora precisão da projeção ao incluir todas as pendências

[1.37.0] - 2025-12-15

Added

  • Dashboard - Gráfico de Projeção de Saldo
    • Adicionado componente BalanceProjectionChart ao Dashboard
    • Exibe projeção futura do saldo baseado em transações pendentes e recorrentes
    • Posicionado após transações vencidas, antes do fluxo de caixa
    • Mesmo gráfico disponível na seção de Relatórios > Projeção
    • Oferece visualização rápida do saldo esperado nos próximos meses

[1.36.2] - 2025-12-15

Added

  • Categorias - Nova subcategoria em Tecnologia
    • 🔄 Subscrições (ID: 180, Cor: #06B6D4, Ícone: bi-arrow-repeat)
    • Ideal para Netflix, Spotify, Amazon Prime, Office 365, etc.

Fixed

  • i18n - Corrigida tradução financialHealth.insights.high_concentration
    • Backend gera insights com tipo high_concentration (snake_case)
    • Adicionada chave em snake_case além da camelCase existente
    • Traduções completas: pt-BR, en, es
    • Insight agora exibe corretamente quando categoria representa >40% dos gastos

[1.36.1] - 2025-12-15

Fixed

  • Bug Critical - Relatórios Passivos - Corrigido erro "n is not a function"
    • Problema: formatDate estava sendo importado incorretamente do hook useFormatters
    • Solução: Hook exporta date, ajustado para date: formatDate na desestruturação
    • Erro ocorria ao clicar na aba de Passivos devido à formatação da próxima parcela
    • Seção de Passivos agora funciona corretamente

[1.36.0] - 2025-12-15

Improved

  • UI/UX da Seção Maiores Despesas - Interface completamente redesenhada
    • 4 Cards KPI com gradientes: Maior Despesa, Média, Menor Despesa, Total de Transações
    • Gráfico de Barras Horizontais mostrando Top 10 despesas com degradê de cores
    • Tabela detalhada completa com:
      • Badges coloridos para posições (top 3 em vermelho, top 10 em amarelo)
      • Barra de progresso visual mostrando % do total
      • Categorias em badges
      • Formatação profissional com sticky header
      • Scroll independente para listas longas
    • Layout responsivo em grid com altura controlada
    • Tooltips do gráfico com informações completas (valor, categoria, data)
    • Traduções: topExpensesAnalysis, highestExpense, averageExpense, lowestExpense, totalTransactions, top10Expenses, detailedList

[1.35.0] - 2025-12-15

Improved

  • UI/UX da Comparação de Períodos - Interface completamente redesenhada
    • Cards KPI com gradientes e ícones grandes para cada métrica
    • Badges de variação com validação de NaN/Infinity
    • Tabela comparativa detalhada com métricas lado a lado
    • Gráfico de barras agrupadas com tooltips aprimorados
    • Layout responsivo: tabela 5 colunas + gráfico 7 colunas
    • Design profissional com hierarquia visual clara
    • Traduções: periodComparison, vsPreviousPeriod, detailedComparison, visualComparison, metric, variation

[1.34.7] - 2025-12-15

Fixed

  • i18n - Adicionada tradução costCenters.name
    • Adicionado costCenters.name ("Nome" / "Name" / "Nombre")
    • Corrige coluna de nome em relatórios por centro de custo
    • Traduções completas em pt-BR, en, es

Added

  • Categorias - Adicionadas subcategorias em "Filhos"
    • 💰 Mesada - Mesada, semanada, dinheiro de bolso
    • 🎈 Passeios - Parques, cinema, zoológico, eventos
    • 🎂 Festas - Aniversário, festas, eventos infantis
    • ✏️ Material Escolar - Cadernos, lápis, mochilas, uniformes
    • 🚌 Transporte Escolar - Ônibus escolar, transporte particular
    • Total: 12 subcategorias em "Filhos"

[1.34.6] - 2025-12-15

Fixed

  • i18n - Adicionadas traduções para credit e debit
    • Adicionado transactions.credit ("Crédito" / "Credit" / "Crédito")
    • Adicionado transactions.debit ("Débito" / "Debit" / "Débito")
    • Corrige exibição de tipo em Templates de Recorrência
    • Traduções completas em pt-BR, en, es

[1.34.5] - 2025-12-15

Fixed

  • i18n - Adicionadas traduções faltantes em Templates de Recorrência
    • Adicionado transactions.expense ("Despesa" / "Expense" / "Gasto")
    • Adicionado transactions.income ("Receita" / "Income" / "Ingreso")
    • Corrige exibição dos filtros de tipo na página de recorrência
    • Traduções completas em pt-BR, en, es

[1.34.4] - 2025-12-15

Fixed

  • Templates de Recorrência - Corrigido carregamento da lista de templates
    • Filtros vazios ("") eram enviados à API causando resultado vazio
    • Agora remove parâmetros vazios antes de fazer a requisição
    • Templates agora aparecem corretamente na aba "Templates de Recorrência"

[1.34.3] - 2025-12-15

Fixed

  • Relatório de Passivos - Corrigida formatação da data da próxima parcela
    • Data agora usa formatDate() para exibição legível
    • Corrige exibição de timestamp ISO bruto (ex: "2026-01-05T00:00:00.000000Z")
    • Formato final: "05/01/2026" (localizado conforme idioma)

[1.34.2] - 2025-12-15

Fixed

  • Resumo de Relatórios - Corrigido exibição de "NaN%" nos badges de variação
    • Adicionada validação isNaN() e isFinite() antes de exibir percentuais
    • Badges de variação agora só aparecem com valores válidos
    • Corrige problema quando dados do ano anterior são zero ou inexistentes

[1.34.1] - 2025-12-15

Improved

  • UI/UX do Resumo de Relatórios - Interface redesenhada com visual mais profissional
    • Cards KPI com ícones grandes e hierarquia visual clara
    • Badges de variação com fundo branco para melhor contraste
    • Adicionadas métricas de média mensal em todos os cards
    • Novo card dedicado para Taxa de Poupança com barra de progresso
    • Feedback visual inteligente baseado na taxa de poupança:
      • 🎯 ≥20%: "Excelente poupança!"
      • 👍 ≥10%: "Boa poupança"
      • 💡 <10%: "Pode melhorar"
    • Gráfico comparativo melhorado com bordas arredondadas e tooltips aprimorados
    • Header do resumo com ícone e seletor de ano redesenhado
    • Tradução completa: pt-BR, en, es

[1.34.0] - 2025-12-14

Fixed

  • Relatório de Passivos - Correção de campo para valor total da dívida

    • Alterado total_amount para total_contract_value (campo correto do modelo)
    • Dívida Total agora exibe o valor correto das contas de passivo
  • Relatório de Transações Futuras - Padronização de nomenclatura

    • Alterado total_items para total_transactions no resumo
    • Melhora consistência com outros endpoints da API

[1.33.0] - 2025-12-14

Added

  • Gráfico de Projeção de Saldo - Nova funcionalidade para visualizar projeções futuras
    • Endpoint GET /api/reports/projection-chart?months={1-12}
    • Componente React BalanceProjectionChart.jsx com Chart.js
    • Seletor de período: 1, 2, 3, 6 ou 12 meses
    • Projeções diárias/semanais baseadas em:
      • Templates recorrentes ativos
      • Parcelas de passivos pendentes
      • Transações agendadas
    • Cartões de resumo: saldo atual/final, mínimo/máximo, variação
    • Alerta automático se projeção indicar saldo negativo
    • Tradução completa: pt-BR, en, es

Fixed

  • Projection Chart API - Correção de type casting

    • Adicionado cast (int) no parâmetro months para evitar erro Carbon
    • Simplificada query SQL para evitar tabela exchange_rates inexistente
  • Migrações - Corrigidas dependências e ordem de execução

    • Migration 2025_12_08_170001 movida temporariamente (dependência de transactions)
    • Migration 2025_12_08_230001 ajustada (referência a import_hash)
    • Todas as 35 migrações executadas com sucesso
  • Permissões - Ajustadas permissões do backend

    • bootstrap/cache alterado de root para www-data
    • chmod -R 775 nos diretórios críticos

Changed

  • Banco de Dados - Reset completo com migrate:fresh

    • 37 tabelas recriadas do zero
    • Usuário recriado: Marco Leite (marco@cnxifly.com)
    • Novo token API gerado: 1|5Zg7Uxrc9qmV5h13YqLj8FbM2HAZZyultCillkDif3c7be04
  • Deploy - Limpeza completa do servidor e redeploy

    • Removidos arquivos enviados manualmente (fora do processo)
    • Deploy obrigatório via scripts ./deploy.sh
    • Preservados storage/logs e .env

[1.32.2] - 2025-12-14

Fixed

  • Endpoint /api/reports/future-transactions - Corregido error 500 y datos vacíos

    • Reescrito completamente para incluir 3 fuentes de datos:
      1. Transacciones pendientes/programadas (usando planned_date en lugar de effective_date)
      2. Cuotas de pasivos pendientes (liability_installments)
      3. Proyecciones de recurrencias activas (recurring_templates)
    • Añadidos helpers getNextRecurrenceDates() y advanceToNextOccurrence() para calcular fechas futuras
    • Corregida query SQL: removida referencia a columna c.name inexistente en tabla de cuotas
    • Soporta frecuencias: diaria, semanal, quincenal, mensual, bimestral, trimestral, semestral, anual
  • Endpoint /api/reports/overdue - Corregido para mostrar todos los vencidos

    • Incluye cuotas de pasivos vencidas (due_date < hoy)
    • Incluye transacciones pending/scheduled con fecha pasada
    • Calcula días de atraso correctamente
  • Deploy - Usado script oficial deploy.sh con rsync

    • Evita problemas de caché y archivos en ubicaciones incorrectas
    • Sincronización completa de directorios

[1.32.1] - 2025-12-14

Fixed

  • Reportes por Categoría - Corregido bug de agrupación que mostraba totales incorrectos

    • El total de "Garagem" mostraba 3062.88€ (todo "Transporte") en lugar de 1201.25€
    • La query agrupaba por parent_id pero mostraba nombre de subcategoría
    • Ahora cada subcategoría muestra su total individual correcto
    • Añadido parámetro opcional group_by_parent=true para agrupar por categoría padre
  • Endpoint /api/reports/overdue - Corregido error 500

    • Cambiado li.amount a li.installment_amount (nombre correcto de la columna)
    • Añadida condición deleted_at IS NULL para excluir registros eliminados

Changed

  • Servidor actualizado - Aplicadas 12 actualizaciones de seguridad

    • Kernel Linux 6.8.0-90
    • Nginx 1.29.4
    • PHP-common actualizado
    • AppArmor 4.0.1
  • Actualizaciones automáticas configuradas

    • Unattended-upgrades habilitado
    • Actualizaciones semanales (cada 7 días)
    • Auto-limpieza cada 30 días
    • Incluye: Ubuntu security, updates, Nginx, PHP PPA

[1.32.0] - 2025-12-14

Added

  • Salud Financiera (Financial Health) - Nueva página completa

    • Puntuación de 0-100 con anillo visual animado
    • 6 métricas de salud: Capacidad de Ahorro, Control de Deudas, Gestión de Presupuesto, Inversiones, Fondo de Emergencia, Planificación Futura
    • Tarjetas de métricas con gradientes de color
    • Gráfico de evolución histórica de score
    • Sección de insights con alertas y sugerencias
    • Recomendaciones personalizadas
    • Cards de estadísticas rápidas (balance, ingresos, gastos, tasa de ahorro)
  • Metas Financieras (Goals) - Sistema completo de objetivos de ahorro

    • Crear, editar y eliminar metas con icono y color personalizable
    • Barra de progreso visual con porcentaje
    • Estados: Activo, Completado, Pausado, Cancelado
    • Fecha objetivo y cálculo de meses restantes
    • Contribuciones con modal dedicado
    • Indicador "On Track" basado en contribución mensual requerida
    • Estadísticas: total metas, activas, total ahorrado, restante
    • Acciones: contribuir, pausar, reanudar, marcar completada
  • Presupuestos Mensuales (Budgets) - Control de gastos por categoría

    • Crear presupuestos por categoría y mes
    • Selector de mes/año con navegación
    • Barra de progreso con colores semáforo (verde/amarillo/rojo)
    • Alertas de "Excedido" y "Casi al límite"
    • Resumen mensual: presupuestado, gastado, restante, % uso
    • Copiar presupuestos al mes siguiente
    • Tabla de resumen anual con click para navegar
  • Reportes (Reports) - Dashboard de análisis financiero

    • 7 pestañas: Resumen, Por Categoría, Evolución Mensual, Comparativa, Mayores Gastos, Proyección, Por Día
    • Gráficos: Barras, Líneas, Dona (usando Chart.js)
    • Resumen anual con comparativa vs año anterior
    • Distribución de gastos por categoría con tabla detallada
    • Evolución mensual de ingresos/gastos/balance
    • Tasa de ahorro mensual con colores semáforo
    • Top 20 gastos del mes
    • Proyección de fin de mes
    • Gastos por día de la semana
  • Backend API - Nuevos endpoints

    • GET/POST /api/financial-goals - CRUD de metas
    • POST /api/financial-goals/{id}/contributions - Añadir contribución
    • DELETE /api/financial-goals/{id}/contributions/{contributionId} - Eliminar contribución
    • GET/POST /api/budgets - CRUD de presupuestos
    • GET /api/budgets/available-categories - Categorías sin presupuesto
    • POST /api/budgets/copy-to-next-month - Copiar al mes siguiente
    • GET /api/budgets/year-summary - Resumen anual
    • GET /api/financial-health - Score y métricas de salud financiera
    • GET /api/financial-health/history - Histórico de scores
    • GET /api/reports/summary - Resumen por período
    • GET /api/reports/by-category - Gastos por categoría
    • GET /api/reports/monthly-evolution - Evolución mensual
    • GET /api/reports/by-day-of-week - Gastos por día de semana
    • GET /api/reports/top-expenses - Mayores gastos
    • GET /api/reports/compare-periods - Comparativa de períodos
    • GET /api/reports/projection - Proyección del mes
  • Base de datos - Nuevas tablas

    • financial_goals - Metas de ahorro con objetivo, fecha, estado
    • goal_contributions - Contribuciones a metas
    • budgets - Presupuestos mensuales por categoría
  • Navegación - Nuevo grupo "Planificación" en sidebar

    • Salud Financiera
    • Metas
    • Presupuestos
    • Reportes

Changed

  • Layout.jsx - Nuevo grupo de navegación "planning" con 4 items
  • App.jsx - 4 nuevas rutas: /financial-health, /goals, /budgets, /reports
  • api.js - Nuevos services: financialGoalService, budgetService, reportService, financialHealthService

[1.31.2] - 2025-12-14

Added

  • ConfirmModal - Componente de confirmação customizado
    • Substitui todos os window.confirm nativos do navegador
    • Suporta variantes: danger (vermelho), warning (amarelo), primary (azul)
    • Ícones dinâmicos baseados na variante
    • Design dark theme consistente com a aplicação
    • Integrado em TransactionsByWeek (delete, cancel, unsplit, unlink)
    • Integrado em BusinessSettingsTab, CampaignsTab, ServiceSheetsTab, ProductSheetsTab

Changed

  • CategorySelector em Modal Categorizar em Lote - Adicionado dropdown hierárquico no modal de categorização em lote
  • OverdueWidget Redesenhado - Layout horizontal em fila própria no Dashboard
    • 4 colunas para níveis de urgência (Crítico, Alto, Médio, Baixo)
    • Scroll interno por coluna
    • Total de itens vencidos no header
    • Responsivo: 2 colunas tablet, 4 desktop
  • UpcomingWidget Ajustado - Altura fixa com scroll interno

Fixed

  • Duplicate Transaction Error - Corrigido erro 500 ao duplicar transação (import_hash unique constraint)
  • CategorySelector Selection - Corrigido onChange para permitir seleção de subcategorias
  • Dropdown Positioning - Melhorado cálculo de posição para evitar dropdown fora da tela

[1.31.1] - 2025-12-14

Added

  • CategorySelector Colapsável - Novo componente para seleção de categorias
    • Categorias exibidas colapsadas por padrão
    • Expande subcategorias ao clicar na categoria pai (chevron ou nome)
    • Campo de busca integrado para filtrar categorias
    • Usa position: fixed para evitar corte por overflow: hidden
    • Badge com quantidade de subcategorias
    • Mostra caminho completo da categoria selecionada (ex: "Alimentação → Supermercado")

Changed

  • Layout de Filtros - Reorganizado em 3 linhas harmônicas

    • Linha 1: Busca (50%) + Data Inicial (25%) + Data Final (25%)
    • Linha 2: Conta + Categoria + Centro de Custo + Tipo + Estado + Limpar
    • Linha 3: Botão "Categorizar em Lote" alinhado à direita
  • CategorySelector aplicado em:

    • Modal de Editar Transação
    • Filtros de Transações
    • Modal de Categorização Rápida

Fixed

  • Dropdown cortado - Corrigido problema do dropdown sendo cortado por containers com overflow:hidden

[1.31.0] - 2025-12-14

Added

  • Variantes de Producto - Sistema de porciones para Wine House

    • Permite vender mismo producto en diferentes porciones (Botella, Copa, Media Copa, Degustación)
    • Cálculo automático: CMV proporcional, markup, precio de venta por porción
    • Nueva tabla product_variants con campos: portion_ratio, quantity_per_unit, volume_ml
    • Modelo ProductVariant con métodos: calculateCmvPortion(), calculateSalePrice(), recalculate()
    • Relación HasMany en ProductSheet para variantes
  • Vinoteca Madrid - Nuevo negocio de ejemplo en seeder

    • 10 vinos españoles: Rioja, Ribera del Duero, Rías Baixas, Rueda, Cava, Porto
    • Cada vino con 4 variantes automáticas:
      • Garrafa (750ml) - 1 por botella
      • Taça (100ml) - 7.5 por botella
      • Meia Taça (50ml) - 15 por botella
      • Degustação (25ml) - 30 por botella
    • Markup calculado automáticamente según configuración del negocio
  • UI Variantes en ProductSheetModal

    • Toggle para mostrar/ocultar sección de variantes
    • Inputs de volume base (ml) y porción estándar (ml)
    • Botón "Generar para Vino" que crea 4 variantes automáticas
    • Tabla con columnas: Nombre, Porción, Cantidad/Unidad, CMV, Markup, PVP
    • Vista previa de cálculos en tiempo real
  • Traducciones i18n para Variantes

    • business.variants.*: title, description, add, noVariants
    • Nombres de porciones: bottle, glass, halfGlass, tasting
    • Labels: baseVolume, portionSize, autoGenerate
    • Soporte: PT-BR, ES, EN

[1.30.0] - 2025-12-14

Added

  • Fichas Técnicas de Servicios - Sistema completo de costos para servicios

    • Duración del servicio en minutos
    • Insumos/materiales con costos unitarios
    • Cálculo automático de CSV (Costo del Servicio Vendido)
    • Integración con configuración de negocio para horas productivas
  • Horas Productivas - Cálculo de costo fijo por hora

    • Nueva métrica clave: hours_per_week (horas por semana)
    • Derivación automática: hours_per_day = hours_per_week / days_per_week
    • Fórmula: Horas Productivas = Empleados × Horas/Día × Días/Mes × Productividad%
    • Costo Fijo/Hora = Gastos Fijos / Horas Productivas
  • Seeder de Ejemplos - BusinessExampleSeeder con 3 tipos de negocio

    • TechStore: 5 productos (electrónicos)
    • DevPro: 5 servicios (desarrollo/consultoría)
    • Print & Design: 4 productos + 4 servicios (mixto)
  • Traducciones i18n Completas - Sección business totalmente internacionalizada

    • business.common.*: CMV, CSV, SKU, Markup, unidades de tiempo
    • business.settings.*: totalProductiveHours, fixedCostPerHour
    • business.products.*: skuPlaceholder, strategyLabels, components
    • business.services.*: codePlaceholder, fixedCost, price
    • Soporte: PT-BR, ES, EN

Changed

  • Modal Tipo de Negocio - Rediseño responsivo
    • Antes: Radio buttons horizontales que excedían el ancho
    • Ahora: Cards seleccionables en grid 3 columnas
    • Visual mejorado con iconos grandes y bordes coloreados

Fixed

  • Error 500 en /api/service-sheets - Columna hours_per_day no existe

    • Causa: Eager loading usaba columna antigua en lugar de hours_per_week
    • Solución: Actualizado ServiceSheetController con columnas correctas
  • TypeError margin_percentage.toFixed - Valor llegaba como string

    • Solución: parseFloat() antes de operaciones numéricas
  • Frontend en directorio incorrecto - Error 500 en raíz

    • Causa: Archivos en /frontend/ en vez de /frontend/dist/
    • Solución: Movidos archivos al directorio correcto

Technical

  • Migración: 2025_12_14_130001_change_hours_per_day_to_hours_per_week
    • Renombra hours_per_day a hours_per_week
    • Agrega working_days_per_week (días por semana)
    • Conversión automática: hours_per_week = hours_per_day * 5
  • Atributo derivado en BusinessSetting: getHoursPerDayAttribute()
  • Deploy limpio con todos los caches regenerados

[1.29.0] - 2025-12-14

Added

  • Campañas Promocionales - Sistema completo de gestión de ofertas y descuentos

    • Presets Rápidos: Black Friday, Cyber Monday, Navidad, Año Nuevo, Liquidación
    • Tipos de Descuento: Porcentaje, Valor Fijo, Precio Fijo
    • Programación: Fechas y horas de inicio/fin con estados automáticos
    • Badges Visuales: Texto, color y preview en tiempo real
    • Selección de Productos: Individual o aplicar a todos
  • Protección de Rentabilidad - Sistema de 4 capas para evitar vender con pérdida

    • Capa 1: Precio nunca menor que CMV (costo)
    • Capa 2: Respeta precio mínimo del producto
    • Capa 3: Respeta precio mínimo de campaña
    • Capa 4: Garantiza margen mínimo sobre CMV
    • Preview con análisis de rentabilidad antes de crear campaña
  • Precificación Estratégica en Fichas Técnicas

    • Precio del Competidor con comparación visual
    • Precio Mínimo/Máximo para control de rango
    • Multiplicador Premium (ajuste fino)
    • Estrategias: Agresivo (-5%), Neutro, Premium (+10%)
    • Margen Objetivo por producto (sobrescribe global)
    • Redondeo Psicológico (€26.04 → €25.99)
  • Soporte B2B/B2C - Manejo diferenciado de IVA/VAT

    • B2C: Precios finales incluyen IVA (venta al consumidor)
    • B2B: Precios sin IVA (venta entre empresas)
    • Campo vat_rate separado de otros impuestos
    • Preview muestra: Markup Base × (1 + IVA) = Multiplicador Final
    • El IVA NO se deduce del margen, se añade al precio final
  • Documentación - Guía completa del Módulo de Negocios

    • docs/MODULO_NEGOCIOS.txt: Manual detallado de funcionamiento
    • Casos de uso prácticos con ejemplos numéricos
    • Explicación técnica del sistema de protección

Fixed

  • Error React #310 - Corregido hook useMemo después de return condicional
  • Scroll en Modales - Agregado scroll para contenido largo
    • ProductSheetModal: maxHeight 90vh con overflowY auto
    • BusinessSettingModal: maxHeight 90vh con overflowY auto
  • Relación BelongsToMany - Foreign key explícita en PromotionalCampaign.products()
  • Traducciones Duplicadas - Eliminadas claves repetidas en i18n
  • Claves i18n Faltantes - Agregadas traducciones para componentes de producto

Technical

  • Nueva migración: add_profitability_protection_to_campaigns
    • Campos: min_margin_percent, protect_against_loss, margin_warning_threshold
    • Pivot: promo_margin, promo_margin_percent, is_profitable
  • Nueva migración: add_price_includes_tax_to_business_settings
    • Campos: price_includes_tax (boolean), vat_rate (decimal)
  • Modelo PromotionalCampaign mejorado con métodos de protección
  • Controller con análisis de rentabilidad en preview() y show()
  • i18n: Traducciones completas en ES, PT-BR, EN para campañas

[1.28.0] - 2025-12-14

Added

  • Nueva Sección Business - Módulo completo para cálculo de precios con Markup
    • Configuraciones de Markup: Define parámetros de cada unidad de negocio

      • Facturación mensual y gastos fijos
      • Costos variables: impuestos, comisiones, tasas de tarjeta
      • Tasa de inversión y margen de ganancia
      • Cálculo automático del factor de markup: Markup = 1 / (1 - deductions)
    • Fichas Técnicas de Productos: Gestión del CMV (Costo de Mercancía Vendida)

      • Componentes de costo: producto, embalaje, etiqueta, envío, manipulación, otros
      • Cálculo automático del CMV total y precio de venta sugerido
      • Margen de contribución calculado en tiempo real
      • Función duplicar para crear variantes rápidamente
    • Calculadora de Precios: Simulador interactivo

      • Ingresa un CMV y visualiza precio de venta instantáneamente
      • Desglose completo de la configuración seleccionada
      • Tabla de precios rápidos para productos existentes
      • Fórmula visible: Precio de Venta = CMV × Markup
    • Multi-divisa: Soporte completo para EUR, BRL, USD

Technical

  • Backend: 3 migraciones, 3 modelos, 2 controladores con endpoints especializados
  • Frontend: Página Business.jsx con 3 tabs y 5 componentes React
  • API: Routes para business-settings y product-sheets con CRUD completo
  • i18n: Traducciones completas en ES, PT-BR, EN

[1.27.6] - 2025-12-13

Fixed

  • Divisa en Widgets Overdue/Upcoming - Corregido campo currency faltante

    • Backend: Agregado campo currency directo en items de upcomingTransactions y overdueTransactions
    • Liability items ahora incluyen su moneda desde liabilityAccount->currency
    • Frontend: Usa item.currency como primera opción, fallback a item.account?.currency
  • Traducción i18n faltante - Agregado common.item y common.items en ES, PT-BR, EN

[1.27.5] - 2025-12-13

Fixed

  • Dashboard Multi-Divisa Completo - Corrigido Flujo de Caja para usar divisa dinâmica

    • CashflowChart agora recebe primaryCurrency como prop
    • Tooltips do gráfico mostram a divisa correta
    • Totais do período (receita, despesa, médias) usam primary_currency
  • Widgets Vencidos/Futuros - Removidas divisas fixas (BRL/EUR)

    • UpcomingWidget: Footer mostra contagem de items em vez de totais monetários
    • OverdueWidget: Rangos mostram contagem, footer mostra média de dias

[1.27.4] - 2025-12-13

Added

  • Categorização Rápida Individual - Novo botão de ação no menu de transações
    • Modal simplificado para categorizar transação individual
    • Seleção de categoria (com subcategorias) e centro de custo
    • Opção de criar keyword para futuras importações automáticas
    • Traduções em ES, PT-BR e EN

Changed

  • Dashboard Multi-Divisa - Valores agrupados por moeda

    • Saldo total, receitas e despesas mostram valores separados por divisa
    • Backend agrupa transações por currency da conta
    • Suporte para múltiplas moedas simultaneamente (EUR, BRL, USD, etc.)
  • Sidebar Responsivo - Estado inicial baseado no tamanho da tela

    • Mobile (< 1024px): Sidebar inicia colapsado
    • Desktop (≥ 1024px): Sidebar inicia expandido
    • Ajusta automaticamente ao redimensionar
  • Responsividade iPad Pro - Otimizações para tablets

    • Media queries para 12.9" (1024-1366px) e 11" (834-1024px)
    • Colunas da tabela de transações com classes CSS para ocultar em tablets
    • Oculta coluna "Conta" em tablets grandes, "Conta" e "Status" em menores

Fixed

  • API Dashboard Summary - Corrigido erro de coluna ambígua
    • Erro: "Column 'user_id' in WHERE is ambiguous" ao fazer JOIN
    • Prefixado todas as colunas com transactions. nas queries com JOIN

[1.27.3] - 2025-12-13

Fixed

  • Categorização em Lote - Corrigido bug que impedia a atualização das transações
    • Problema: Cache de opcodes do PHP-FPM não era limpo após deploy
    • Solução: Script deploy.ps1 agora executa php artisan optimize:clear e reinicia PHP-FPM
    • Fluxo corrigido: Seleção com checkboxes → API → UPDATE no banco funciona corretamente

Changed

  • Script deploy.ps1 (backend) - Melhorado para garantir limpeza completa de cache
    • Adicionado php artisan optimize:clear antes das otimizações
    • Reinício de PHP-FPM com mensagem explicativa sobre cache de opcodes
    • Previne problemas de código antigo sendo servido após deploy

Removed

  • Console.logs de debug - Removidos logs de depuração do frontend (TransactionsByWeek.jsx)

[1.27.2] - 2025-12-13

Changed

  • Ícone de Tabaco - Atualizado ícone da subcategoria "Tabaco" em MadridCategoriesSeeder
    • De bi-circle-fill (genérico) para bi-cloud-haze2-fill (fumaça/névoa)
    • Ícone mais semântico e representativo para gastos com cigarro/estánco
    • Adicionado bi-cloud-haze2 e bi-cloud-haze2-fill ao catálogo de ícones (icons.js)

Fixed

  • Sintaxe icons.js - Corrigida vírgula faltante após bi-outlet na categoria housing

[1.27.1] - 2025-12-12

Fixed

  • Traducción faltante - Agregada clave common.months en es.json y en.json
    • Dashboard mostraba "12 common.months" en vez de "12 meses"

[1.27.0] - 2025-12-12

Added

  • Widget de Transações Vencidas - Novo widget no Dashboard mostrando itens em atraso

    • Endpoint: GET /api/dashboard/overdue - Agrupa por urgência (crítico, alto, médio, baixo)
    • Inclui transações, parcelas recorrentes e passivos vencidos
    • Clique para navegar diretamente ao item
    • Código de cores por nível de urgência
    • Traduções em ES, PT-BR e EN
  • Modais de Confirmação Detalhados - Melhorados todos os botões de ação na página /recurring

    • Modal de Pausar/Reanudar com advertências detalhadas
    • Modal de Excluir Template com avisos de irreversibilidade
    • Modal de Omitir Cuota (Skip) com explicação de consequências
    • Ícones visuais e informações do item afetado em todos os modais
    • Traduções completas em ES, PT-BR e EN

Fixed

  • Conciliação Incorreta - Desfeita conciliação acidental de "Alquiler Seguro Sa" primeira parcela
    • recurring_instance #71 revertido para status 'pending'
    • transaction #2372 desvinculada

[1.26.0] - 2025-12-11

Added

  • Detecção de Reembolsos - Sistema para detectar pares gasto/reembolso que se anulam
    • Novo endpoint: GET /api/refund-detection - Detectar pares potenciais
    • Novo endpoint: POST /api/refund-detection/confirm - Confirmar par de reembolso
    • Novo endpoint: POST /api/refund-detection/confirm-batch - Confirmar múltiplos pares
    • Novo endpoint: POST /api/refund-detection/ignore - Ignorar par
    • Novo endpoint: POST /api/refund-detection/undo - Desfazer confirmação
    • Nova migração: campos is_refund_pair e refund_linked_id na tabela transactions
    • Nova tabela: ignored_refund_pairs para pares ignorados
    • Frontend: Nova página /refunds com UI similar à detecção de transferências
    • Detecção baseada em: mesmo valor, mesma conta, tipos opostos (débito/crédito)
    • Cálculo de confiança com indicadores traduzidos (data, descrição similar, palavras-chave)
    • Tolerância configurável de 1-30 dias
    • Suporte a seleção em lote com confirmação batch
    • Traduções completas em ES, PT-BR e EN

Changed

  • Ordenação de Transações - Lista por semana agora ordena por data efetiva
    • Usa COALESCE(effective_date, planned_date) para ordenação
    • Fallback para data planejada quando não há data efetiva
    • Parâmetro date_field: 'effective_date' adicionado ao frontend

Fixed

  • Indicadores de Reembolso - Traduções para os motivos de confiança
    • same_amount_same_account → "Mismo monto, misma cuenta"
    • same_date → "Misma fecha"
    • refund_keyword → "Palabra clave de reembolso"
    • medium_description_similarity → "Descripción similar"
    • same_status → "Mismo estado"

[1.23.8] - 2025-12-11

Fixed

  • Modais de Confirmação - Substituídos alertas nativos do navegador por modais customizados
    • Modal de confirmação para excluir template
    • Modal de confirmação para pular parcela
    • Modal de confirmação para cancelar parcela
    • Novo componente ConfirmModal reutilizável

[1.23.7] - 2025-06-20

Added

  • Edição de Transações Recorrentes - Possibilidade de editar templates e instâncias individuais
    • Novo endpoint: PUT /api/recurring-instances/{id} - Editar parcela pendente
    • Modal de edição de template com todos os campos (nome, valor, frequência, conta, categoria)
    • Modal de edição de parcela com valor planejado, data de vencimento e notas
    • Botões de edição na tabela de templates e na tabela de parcelas pendentes
    • Botão de edição também no modal de detalhes do template
    • Traduções em português, inglês e espanhol

[1.25.0] - 2025-12-10

Added

  • Transações Recorrentes - Sistema completo de gestão de pagamentos recorrentes

    • Novo modelo: RecurringTemplate - Templates de recorrência com frequência configurável
    • Novo modelo: RecurringInstance - Instâncias/parcelas geradas automaticamente
    • Novo serviço: RecurringService - Lógica de geração e gestão de instâncias
    • Nova política: RecurringTemplatePolicy - Autorização de acesso
    • Endpoints:
      • GET /api/recurring - Listar templates
      • POST /api/recurring - Criar template manual
      • POST /api/recurring/from-transaction - Criar a partir de transação
      • GET/PUT/DELETE /api/recurring/{id} - CRUD de templates
      • POST /api/recurring/{id}/pause - Pausar template
      • POST /api/recurring/{id}/resume - Retomar template
      • GET /api/recurring/{id}/instances - Listar parcelas
      • GET /api/recurring/pending - Listar todas pendentes
      • GET /api/recurring/overdue - Listar vencidas
      • GET /api/recurring/due-soon - Próximas do vencimento
      • POST /api/recurring-instances/{id}/pay - Pagar (cria transação)
      • POST /api/recurring-instances/{id}/reconcile - Conciliar com transação existente
      • POST /api/recurring-instances/{id}/skip - Pular parcela
      • GET /api/recurring-instances/{id}/candidates - Buscar transações candidatas
    • Frontend: Nova página /recurring com tabs Templates e Pendentes
    • Modal para criar recorrência a partir de transação existente
    • Frequências: diária, semanal, quinzenal, mensal, bimestral, trimestral, semestral, anual
    • Ajuste automático de dias em meses curtos (ex: 31 → 28 em fevereiro)
  • Calendário no Dashboard - Widget interativo com visão mensal

    • Novo endpoint: GET /api/dashboard/calendar - Dados do mês
    • Novo endpoint: GET /api/dashboard/calendar-day - Transações de um dia
    • Novo componente: CalendarWidget.jsx
    • Mostra transações e recorrentes pendentes por dia
    • Indicadores visuais (azul=transação, laranja=recorrente)
    • Clique no dia mostra detalhes com ações (Pagar/Omitir)
    • Resumo mensal de pendentes
  • Widget Próximos 7 Dias - Previsão de transações pendentes

    • Novo endpoint: GET /api/dashboard/upcoming - Transações dos próximos N dias
    • Novo componente: UpcomingWidget.jsx
    • Agrupa por dia com badges (Hoje, Amanhã, X dias)
    • Ícones coloridos por tipo (recorrente, transferência, débito, crédito)
    • Resumo de ingressos/gastos previstos (exclui transferências)
  • Menu Reorganizado com Grupos Colapsáveis

    • Grupos: Movimentos (Transações, Recurrentes, Importar, Transferências) e Configuração (Categorias, Centros de Custo)
    • Estado persistente de expansão
    • Suporte a sidebar colapsado
  • Campo start_date no Modal de Recorrência

    • Permite definir data inicial diferente da transação original

Changed

  • Script de deploy backend alterado de php8.3-fpm para php8.4-fpm
  • Layout.jsx refatorado com estrutura de grupos no menu

Fixed

  • AuthorizesRequests - Adicionado trait ao Controller base para resolver erro 500 em ações de autorização
  • Cálculo de ingresos/gastos no calendário - Transferências agora são excluídas do resumo
  • Duplicação de Layout - Removido wrapper Layout duplicado em RecurringTransactions.jsx

Migrations

  • 2025_12_10_100001_create_recurring_templates_table.php
  • 2025_12_10_100002_create_recurring_instances_table.php
  • Adicionado campo recurring_instance_id na tabela transactions

[1.12.0] - 2025-12-09

Added

  • Categorização em Lote - Nova funcionalidade para categorizar transações automaticamente

    • Novo endpoint: POST /api/categories/categorize-batch/preview - Preview das transações que serão categorizadas
    • Novo endpoint: POST /api/categories/categorize-batch - Executar categorização em lote
    • Botão "Categorizar em Lote" na página de Categorias
    • Botão "Categorizar" na página de Transações por Semana
    • Modal com preview mostrando: total sem categoria, quantas serão categorizadas, keywords ativas
    • Categorização baseada em keywords das categorias vs descrição das transações
    • Traduções completas em pt-BR, es, en
  • Detecção de Pagamentos Suspeitos - Nova aba na página de Duplicatas

    • Novo endpoint: GET /api/duplicate-transactions/suspicious - Lista pagamentos suspeitos
    • Detecta transações com mesmo valor, mesma conta, datas diferentes (até 7 dias)
    • Calcula % de similaridade da descrição entre transações
    • Sistema de confiança com níveis (high/medium/low) baseado em múltiplos critérios
    • Aba "Pagamentos Suspeitos" ao lado de "Duplicatas Exatas"
    • Botões para ignorar par ou excluir transação individual
    • Traduções completas em pt-BR, es, en
  • UserSetupService - Serviço para configuração de novos usuários

    • Cria categorias padrão automaticamente no registro
    • Cria centro de custo "Principal" automaticamente
    • 18 categorias principais com subcategorias e keywords

Changed

  • Categorias do usuário não são mais bloqueadas como "sistema"
    • Removida validação is_system no update() e destroy() do CategoryController
    • Todas as categorias do usuário podem ser editadas/excluídas
    • MadridCategoriesSeeder agora cria com is_system = false

Fixed

  • Corrigido problema de reconciliação de passivos não encontrando transações
    • Adicionado COALESCE(amount, planned_amount) na busca de transações elegíveis
    • Transações com amount NULL agora são encontradas usando planned_amount

[1.11.0] - 2025-12-08

Added

  • Funcionalidade de ajuste de saldo de contas
    • Novo endpoint: POST /api/accounts/{id}/adjust-balance
    • Usuário informa o saldo real e sistema calcula o initial_balance automaticamente
    • Fórmula: initial_balance = saldo_desejado - créditos + débitos
    • Botão de ajuste (icone sliders) na lista de contas
    • Modal com explicação e campo para digitar saldo real
    • Traduções em pt-BR, es, en

[1.10.1] - 2025-12-08

Changed

  • Recálculo automático de saldos ao carregar página de Contas (/accounts)
  • Não é mais necessário clicar no botão de recalcular manualmente

[1.10.0] - 2025-12-08

Added

  • Agrupamento de transferências entre contas no resumo semanal
    • Transferências agora aparecem em seção separada "Transferências entre contas"
    • Cada transferência mostra: Conta Origem → Conta Destino com valor
    • Transferências não contam mais nos totais de Ingresos/Gastos
    • API retorna campo transfers com transferências agrupadas em pares
    • Campo transfers_count no summary indica quantidade de transferências
    • Tradução adicionada: "transfers" em pt-BR, es, en

Fixed

  • Corrigido cálculo de totais quando transações têm amount: 0 com status: completed
    • Agora usa planned_amount como fallback quando amount é zero
    • Afeta cálculo de créditos, débitos e total de completed
    • Resolve problema de semanas mostrando totais zerados incorretamente

[1.9.1] - 2025-12-08

Fixed

  • Corrigido erro SQL "Column 'type' in SELECT is ambiguous" no DuplicateTransactionController
  • Corrigido erro SQL "a.name isn't in GROUP BY" removendo JOIN e buscando account_name separadamente
  • Corrigido erro React ao renderizar objeto confidence (alterado para confidence?.percentage)
  • Corrigido path de deploy do frontend (era /public, correto é /var/www/webmoney/frontend/dist)

[1.9.0] - 2025-12-08

Changed

  • Reestruturação completa de detecção de duplicatas (de pares para grupos)
    • OLD: Comparava transações 2x2 (pairwise), gerando múltiplos pares para 3+ idênticos
    • NEW: Agrupa todas as transações idênticas em um único grupo
    • OLD: Estrutura: {transaction1, transaction2}
    • NEW: Estrutura: {transactions: [{id, desc, ...}, {...}], count, max_id}
    • Permite visualizar todas as transações duplicadas lado a lado
    • Identifica claramente qual será mantida (a com maior ID)

Added

  • Auto-Delete automático de duplicatas
    • Novo endpoint: POST /api/v1/duplicate-transactions/auto-delete
    • Deleta todas as duplicatas mantendo apenas a com maior ID por grupo
    • Usa Soft Delete (respeiта deleted_at)
    • Botão "Auto-Delete em Lote" - para grupos selecionados
    • Botão " Auto-Delete Todos" - para todos os grupos
    • Modals de confirmação com avisos de ação irreversível
    • Mensagens de sucesso com contador de grupos deletados
    • Traduções completas em PT-BR, EN, ES

Frontend Updates

  • DuplicateTransactions.jsx completamente reescrito
    • Suporta novo formato de resposta (grupos ao invés de pares)
    • Layout adaptado: 3 colunas para transações (em vez de VS layout)
    • Badge "Será mantida" destaca transação com maior ID
    • Badge "Grupo: X transações" mostra tamanho do grupo
    • Serviço API atualizado com método autoDelete()
    • Traduções incluem strings para auto-delete

Backend Updates

  • DuplicateTransactionController::index() refatorizado

    • Query principal usa GROUP BY em vez de INNER JOIN
    • GROUP_CONCAT(id ORDER BY id DESC) para ordenar por ID
    • Retorna array de todas as transações do grupo
    • Confiança sempre 100% (grupos = transações idênticas)
    • Calcula max_id para indicar qual será mantida
  • Novo método: DuplicateTransactionController::autoDeleteDuplicates()

    • Busca grupos com HAVING count > 1
    • Para cada grupo, deleta tudo menos o ID máximo
    • UPDATE transactions SET deleted_at = NOW()
    • Retorna total de transações deletadas

Database

  • Nenhuma migração nova necessária
    • Campo deleted_at já existe (SoftDeletes trait)
    • Campo duplicate_ignored_with continua funcional

[1.8.1] - 2025-12-08

Fixed

  • Seleção em lote: corrigida lógica de exclusão
    • Agora exclui a transação com menor ID (ao invés de sempre transaction1)
    • Mantém consistência com lógica individual de seleção
    • Usa Soft Delete (SoftDeletes do Laravel)

[1.8.0] - 2025-12-08

Added

  • Seleção em lote para transações duplicadas
    • Checkbox em cada duplicata para marcar/desmarcar
    • "Selecionar Todos" na barra de ações
    • Contador de duplicatas selecionadas
    • Destaque visual (cor azul) para itens selecionados
    • Botões: "Ignorar em Lote" e "Excluir em Lote"
    • Modals de confirmação para ações em lote
    • Mensagens de sucesso com contador (ex: "5 duplicatas ignoradas")
    • Funções executam em paralelo com Promise.all()
    • Limpa seleções ao recarregar dados
    • Traduções em PT-BR, ES e EN

[1.7.4] - 2025-12-08

Fixed

  • Removidas mensagens de navegador (window.confirm, window.alert)
    • Transações: Cancelar e Excluir agora usam modais de confirmação
    • Duplicatas: Excluir agora usa modal de confirmação
    • Modal centralizado com botões "Cancelar" e "Confirmar"
    • Traduções adicionadas em PT-BR, ES e EN
    • Mantém funcionalidade, apenas substituiu padrão de UI

[1.7.3] - 2025-12-08

Fixed

  • Corrigida busca por valores em transações
    • Usa comparação numérica em vez de LIKE em string
    • "147" encontra 147.00 (busca exata + range até 147.99)
    • "147.00" encontra apenas 147.00 (busca exata)
    • Funciona em ambos os métodos: index e byWeek

[1.7.2] - 2025-12-08

Added

  • Nível de confiança na detecção de duplicatas
    • Badge colorido com percentual (vermelho: alto, amarelo: médio, azul: baixo)
    • Critérios de cálculo:
      • Base 50%: mesmo valor, data, conta e tipo
      • +15%: mesma categoria
      • +10%: mesmo status
      • +25%: descrição idêntica ou similar
    • Resultados ordenados por nível de confiança (maior primeiro)
    • Traduções em PT-BR, ES e EN

[1.7.1] - 2025-12-08

Improved

  • Filtro de busca em transações agora também busca por valores
    • Busca por planned_amount e amount
    • Suporta busca exata e parcial (ex: "150" encontra 150.00, 1500.00)
    • Aceita formato com vírgula ou ponto como separador decimal
    • Placeholder atualizado para indicar busca por valor

[1.7.0] - 2025-12-08

Added

  • Nova funcionalidade: Detecção de Transações Duplicadas
    • Página dedicada para visualizar e gerenciar duplicatas potenciais
    • Critérios de detecção: mesmo valor, mesma data, mesma conta, mesmo tipo
    • Opção de excluir transação duplicada
    • Opção de ignorar permanentemente (marcar como não-duplicata)
    • Campo duplicate_ignored_with na tabela transactions
    • Endpoint API: GET /duplicate-transactions
    • Endpoint API: DELETE /duplicate-transactions/{id}
    • Endpoint API: POST /duplicate-transactions/ignore
    • Traduções em PT-BR, ES e EN
    • Menu lateral com link para página de duplicatas

[1.6.13] - 2025-12-08

Changed

  • Tamanho de fonte 11pt aplicado a modais, toasts e outros componentes:
    • Modal: .modal-title, .modal-body, .modal-header, .modal-footer
    • Toast: .toast, .toast-body, .toast-header
    • Popover/Tooltip: .popover-body, .popover-header, .tooltip-inner
    • Outros: .alert, .card-body, .card-text, .card-title
    • Listas/Acordion: .list-group-item, .accordion-body, .accordion-button

[1.6.12] - 2025-12-08

Changed

  • Tamanho mínimo de fonte ajustado para 11pt (era 12pt)
  • Adicionados elementos de formulário à regra de tamanho mínimo:
    • input, select, textarea, .form-control, .form-select
    • option, .input-group-text
  • Garantia de tamanho consistente em todos os campos de formulário

[1.6.11] - 2025-12-08

Changed

  • Tamanho mínimo de fonte padronizado para 12pt em todo o sistema
    • Body, parágrafos, spans, células, labels, botões, listas
    • Textos small/muted também agora usam 12pt mínimo
    • Melhor legibilidade em todos os dispositivos

[1.6.10] - 2025-12-08

Fixed

  • Corrigida tradução do cabeçalho "Estado" no dropdown de ações
    • Alterado de t('transactions.status') para t('transactions.status.label')
    • Erro: "key returned an object instead of string"

[1.6.9] - 2025-12-08

Changed

  • Reduzida largura da coluna de ações de 150px para 50px
  • Botão de ações mais compacto (link style sem bordas)
  • Ícone alterado para três pontos verticais
  • Melhor aproveitamento do espaço horizontal na tabela

[1.6.8] - 2025-12-08

Changed

  • Aumentado tamanho das fontes no sistema para melhor legibilidade
    • Tamanho base: 14px (mínimo 10pt)
    • Textos pequenos (small): 12px
    • Cabeçalhos ajustados proporcionalmente
    • Aplicado globalmente via index.css

[1.6.7] - 2025-12-08

Improved

  • Melhorado visual do menu dropdown de ações nas transações
    • Botão com borda (btn-outline-secondary) mais visível
    • Ícones coloridos para cada ação (verde para completar, amarelo para reverter, etc.)
    • Cabeçalhos de seção para agrupar ações de status
    • Sombra no menu (shadow-sm) para melhor destaque
    • Organização lógica: Status > Ações principais > Excluir

[1.6.6] - 2025-12-08

Changed

  • Substituído botões de ação por menu dropdown elegante na página de Transações
    • Ícone de três pontos (⋮) para abrir menu de ações
    • Menu organizado com ícones e texto descritivo
    • Botão excluir separado por linha divisória
    • Aplicado em TransactionsByWeek.jsx e Transactions.jsx

Improved

  • Interface mais limpa e profissional na listagem de transações
  • Melhor uso do espaço horizontal na tabela

[1.6.5] - 2025-12-08

Improved

  • Ampliada janela de busca de transações elegíveis de ±15 para ±45 dias
    • Permite encontrar pagamentos atrasados ou antecipados
  • Conciliação agora busca transações de todas as contas correntes
  • Corrigida exibição de data nas transações elegíveis (effective_date/planned_date)

Removed

  • Removido filtro de conta corrente desnecessário no modal de conciliação

[1.6.4] - 2025-12-08

Improved

  • Melhorado filtro de transações elegíveis para conciliação
    • Agora filtra por valores próximos (±20% do valor da parcela)
    • Ordena por similaridade de valor (mais próximo primeiro)
    • Retorna diferença percentual para cada transação
    • Limita resultados a 30 transações mais relevantes
    • Retorna faixa de valor utilizada no filtro

[1.6.3] - 2025-12-08

Added

  • Novo endpoint POST /api/accounts/recalculate-all para recalcular saldos de todas as contas
  • Novo endpoint POST /api/accounts/{id}/recalculate para recalcular saldo de uma conta específica
  • Método recalculateBalance() no model Account
  • Botão "Recalcular" na página de Contas para atualizar saldos baseados nas transações
  • Traduções para recálculo de saldos (pt-BR, en, es)

Fixed

  • Correção nos saldos das contas (current_balance) que não atualizavam com transações importadas

[1.6.2] - 2025-12-08

Fixed

  • Corrigido erro no endpoint eligibleTransactions - coluna date não existe
  • Atualizado para usar effective_date ou planned_date (com fallback)
  • Corrigido tipo de transação de expense para debit

[1.6.1] - 2025-12-08

Added - Sistema de Conciliação de Parcelas

Backend (Laravel)

Conciliação de Parcelas com Transações

  • Novo endpoint: GET /api/liability-accounts/pending-reconciliation
    • Lista todas as parcelas pendentes de conciliação
  • Novo endpoint: GET /api/liability-accounts/{id}/installments/{id}/eligible-transactions
    • Busca transações elegíveis para vincular a uma parcela
    • Filtra por período (+/- 15 dias do vencimento)
    • Suporta busca por descrição
  • Novo endpoint: POST /api/liability-accounts/{id}/installments/{id}/reconcile
    • Vincula parcela a uma transação existente
    • Opção de marcar automaticamente como paga
  • Novo endpoint: DELETE /api/liability-accounts/{id}/installments/{id}/reconcile
    • Remove vínculo entre parcela e transação

Frontend (React)

Modal de Conciliação

  • Novo modal para vincular parcela a transação
  • Lista de transações elegíveis com busca
  • Checkbox para marcar como paga ao conciliar
  • Botões de ação na tabela de parcelas (conciliar/desconciliar)
  • Badge indicando status de conciliação
  • Traduções em pt-BR, en e es

Fixed

  • Ordem das rotas no api.php (rotas específicas antes do apiResource)

[1.6.0] - 2025-12-08

Added - Transferências, Divisão, Passivos e Sistema de Importação

Backend (Laravel)

Sistema de Transferências entre Contas

  • Novo endpoint: POST /api/transactions/transfer
  • Cria automaticamente par de transações (débito origem + crédito destino)
  • Campos transfer_pair_id e is_transfer na tabela transactions

Efetivação Rápida de Transações

  • Novo endpoint: POST /api/transactions/{id}/quick-complete
  • Efetiva transação pendente com um clique (usa valores planejados)

Divisão de Transações

  • Novo endpoint: POST /api/transactions/{id}/split
  • Divide transação em múltiplas categorias
  • Campos is_split_parent, is_split_child, parent_transaction_id
  • Validação: soma das divisões deve igualar valor original

Sistema de Passivos (Empréstimos/Financiamentos)

  • Nova migration: create_liability_accounts_table
    • Contrato de passivo com valores calculados
    • Taxas de juros (mensal, anual, total)
    • Progresso de pagamento
  • Nova migration: create_liability_installments_table
    • Parcelas individuais com composição (capital + juros + taxas)
    • Status: pending, paid, partial, overdue, cancelled
  • Novo model: LiabilityAccount e LiabilityInstallment
  • Novo controller: LiabilityAccountController
  • Importação de contratos via Excel
  • Cálculo automático de taxas de juros

Sistema de Importação Avançado

  • Nova migration: create_import_mappings_table
  • Nova migration: add_import_hash_to_transactions_table
  • Suporte a múltiplos formatos: XLSX, XLS, CSV, OFX, PDF
  • Mapeamento de colunas flexível com concatenação
  • Anti-duplicidade via hash único (data + valor + saldo + descrição)
  • Novos parsers: OfxParser, PdfParser
  • Histórico de importações

Correções e Melhorias

  • Removido campo balance_after (saldo sempre calculado dinamicamente)
  • Transações importadas sempre sem categoria (category_id = null)

Frontend (React)

Página de Transações por Semana (TransactionsByWeek.jsx)

  • Botão "Transferência" na barra superior
  • Modal de transferência entre contas
  • Botão de efetivação rápida () para pendentes
  • Botão de divisão para transações
  • Modal de divisão com múltiplas categorias
  • Validação em tempo real (soma = valor original)

Nova Página: Importação de Transações (ImportTransactions.jsx)

  • Upload com drag & drop
  • Wizard de 4 etapas: Upload → Configurar → Mapear → Resultado
  • Preview dos dados do arquivo
  • Mapeamento visual de colunas
  • Salvamento de mapeamentos para reutilização
  • Histórico de importações

Nova Página: Contas Passivo (LiabilityAccounts.jsx)

  • Cards de resumo por moeda
  • Importação de contratos via Excel
  • Visualização de parcelas com status
  • Barra de progresso de pagamento
  • Taxas de juros calculadas

Traduções

  • Novas chaves em pt-BR, en, es para todas as funcionalidades

Technical Details

  • Migration: 2025_12_08_170001_add_transfer_and_split_fields_to_transactions
  • Migration: 2025_12_08_200001_create_liability_accounts_table
  • Migration: 2025_12_08_200002_create_liability_installments_table
  • Migration: 2025_12_09_100001_create_import_mappings_table
  • Migration: 2025_12_09_150001_add_import_hash_to_transactions_table
  • Migration: 2025_12_09_160001_remove_balance_after_from_transactions_table

[1.5.0] - 2025-12-08

Added - Sistema de Transações Completo

Backend (Laravel)

  • Nova migration: create_transactions_table

    • id, user_id, account_id, category_id, cost_center_id
    • amount (valor efetivo), planned_amount (valor previsto)
    • type (credit/debit)
    • description, notes, reference
    • effective_date (data efetiva), planned_date (data planejada)
    • status (pending/completed/cancelled)
    • is_recurring, recurring_parent_id (preparado para recorrências)
    • SoftDeletes e índices otimizados
  • Novo model: Transaction.php

    • Relacionamentos: user, account, category, costCenter, recurringParent/Children
    • Scopes: ofUser, pending, completed, cancelled, credits, debits, inPeriod, etc.
    • Atributos computados: finalAmount, finalDate, isOverdue, signedAmount
    • Métodos: markAsCompleted(), markAsCancelled(), markAsPending()
  • Novo controller: TransactionController.php

    • CRUD completo com filtros avançados
    • Endpoints especiais: complete, cancel, revert, duplicate, summary
    • Filtros por: conta, categoria, centro de custo, tipo, status, período, busca
  • Novas rotas API

    • GET/POST /api/transactions - Listar/Criar
    • GET/PUT/DELETE /api/transactions/{id} - CRUD individual
    • POST /api/transactions/{id}/complete - Marcar como concluída
    • POST /api/transactions/{id}/cancel - Cancelar
    • POST /api/transactions/{id}/revert - Reverter para pendente
    • POST /api/transactions/{id}/duplicate - Duplicar
    • GET /api/transactions-summary - Resumo com totais

Frontend (React)

  • Nova página: Transactions.jsx

    • Cards de resumo: Entradas, Saídas, Saldo, Pendentes
    • Indicador de transações atrasadas
    • Filtros avançados: conta, categoria, tipo, status, período, busca
    • Tabela com todas as transações
    • Badge de categoria com cor e ícone
    • Ações: editar, duplicar, completar, reverter, cancelar, excluir
    • Modal de criação/edição com todos os campos
    • Modal de detalhes completo
    • Modal de conclusão com valor efetivo e data
  • Novo service: transactionService

    • Métodos: getAll, getById, create, update, delete
    • complete, cancel, revert, duplicate, getSummary
  • Traduções completas (pt-BR, es, en)

    • Todos os labels, mensagens e placeholders
    • Tipos: Crédito/Débito
    • Status: Pendente/Concluída/Cancelada
  • Menu lateral atualizado

    • Novo item "Transações" com ícone bi-arrow-left-right
    • Rota /transactions configurada

[1.4.2] - 2025-12-08

Added - Seeder de Categorias para Madrid

Backend (Laravel)

  • MadridCategoriesSeeder.php - Seeder com categorias comuns do dia a dia

    • 22 categorias principais organizadas por tipo (expense/income/both)
    • 150 subcategorias detalhadas para classificação precisa
    • 825 palavras-chave em espanhol para categorização automática
  • Categorias de Despesa (expense):

    • 🏠 Moradia (12 subcategorias): aluguel, hipoteca, água, luz, gás, internet...
    • 🍽️ Alimentação (8): supermercados Madrid (Mercadona, Carrefour, Lidl...)
    • 🍴 Restaurantes e Bares (9): fast food, tapas, comida asiática, kebab...
    • 🚗 Transporte (14): metro/EMT, taxi/Cabify, AVE, BiciMAD, carsharing...
    • 🛒 Compras (9): roupas (Zara, Mango, Primark), eletrônicos, Amazon...
    • 💊 Saúde (9): farmácias, seguros (Sanitas, Adeslas), dentista, ótica...
    • 💇 Beleza (7): peluquería, spa, cosméticos (Sephora, Primor)...
    • 🎓 Educação (6): universidades Madrid, cursos, idiomas...
    • 🎮 Entretenimento (9): streaming, cinema (Yelmo, Cinesa), teatro Gran Vía...
    • 🏋️ Fitness (7): gimnasios (Basic-Fit, McFit), padel, running...
    • ✈️ Viagens (6): hotéis, Booking, Airbnb, tours...
    • 🐕 Pets (5): Tiendanimal, Kiwoko, veterinário...
    • 🏦 Financeiro (6): taxas bancárias, impostos, Hacienda...
    • 👶 Família (5): guardería, extraescolares, brinquedos...
    • 📱 Assinaturas (6): cloud, apps, jornais digitais...
    • 🎁 Doações (3): ONGs, crowdfunding, igreja...
    • 📦 Outros (6): correios, loteria, lavanderia...
  • Categorias de Renda (income):

    • 💰 Salário e Trabalho (6): nómina, bonus, freelance...
    • 📈 Investimentos (5): dividendos, cripto, fundos...
    • 🏠 Rendas/Aluguéis (3): aluguel recebido, Airbnb...
    • 🎁 Outros Rendimentos (5): reembolsos, Wallapop, ajudas governo...
  • Categorias Mistas (both):

    • 🔄 Transferências (4): entre contas, Bizum, PayPal, Wise/Revolut

[1.4.1] - 2025-12-08

Added - Contas Passivo na Página de Contas

Frontend (React)

  • Integração de contas passivo na página /accounts
    • Seção dedicada "Contas Passivo (Empréstimos e Dívidas)"
    • Cards de resumo combinam totais de contas ativas + passivo
    • Linhas clicáveis navegam para página /liabilities
    • Barra de progresso visual (parcelas pagas vs total)
    • Exibe: credor, saldo devedor, status

[1.4.0] - 2025-12-08

Added - Sistema de Contas Passivo (Empréstimos/Financiamentos)

Backend (Laravel)

  • Novas migrations

    • liability_accounts - Tabela para contratos de passivo com todos os metadados
    • liability_installments - Tabela para parcelas individuais de cada contrato
  • Novos models

    • LiabilityAccount - Model com relacionamentos, cálculos de taxas de juros e progresso
    • LiabilityInstallment - Model com status de parcela e método markAsPaid()
  • Novo controller (LiabilityAccountController)

    • CRUD completo para contas passivo
    • Importação de arquivos Excel (.xlsx/.xls)
    • Parser inteligente de colunas (Pago, Fecha, Cuota, Intereses, Capital, Estado)
    • Cálculo automático de taxas extras (multas/atrasos)
    • Cálculo de taxas de juros (mensal, anual, total)
    • Resumo por moeda
  • Novas rotas API

    • GET/POST /api/liability-accounts - Listar/Criar contratos
    • GET/PUT/DELETE /api/liability-accounts/{id} - Ver/Atualizar/Excluir contrato
    • POST /api/liability-accounts/import - Importar Excel
    • GET /api/liability-accounts/{id}/installments - Listar parcelas
    • PUT /api/liability-accounts/{accountId}/installments/{installmentId} - Atualizar parcela
    • GET /api/liability-summary - Resumo geral
  • Dependência adicionada

    • phpoffice/phpspreadsheet ^5.3 para leitura de Excel

Frontend (React)

  • Nova página LiabilityAccounts.jsx

    • Cards de resumo por moeda (Dívida Total, Total Pago, Total Pendente, Juros Totais)
    • Lista de contratos em formato de cards com:
      • Barra de progresso de pagamento
      • Taxa de juros mensal
      • Parcelas pagas/total
      • Saldo devedor
    • Modal de importação de Excel com campos para:
      • Nome do contrato
      • Credor/Banco
      • Número do contrato
      • Moeda
      • Descrição
    • Modal de detalhes com:
      • Cards de valores (Principal, Juros, Taxas, Total)
      • Cards de taxas (Mensal, Anual, Total do contrato)
      • Tabela de parcelas com status colorido
      • Botão para marcar parcela como paga
    • Filtros por status e ativo/inativo
    • Confirmação de exclusão
  • Serviço API (api.js)

    • liabilityAccountService com todos os métodos CRUD e importação
  • Navegação

    • Item "Passivos" adicionado ao menu lateral
    • Rota /liabilities
  • Internacionalização (i18n)

    • Traduções completas em pt-BR, es e en
    • Seção liabilities com todas as strings

Features de Contas Passivo

  • Importação de Excel: Suporte completo ao formato do arquivo ContratoWanna.xlsx
  • Cálculo automático de juros: Taxa mensal, anual e total do contrato
  • Detecção de taxas extras: Identifica automaticamente multas e atrasos
  • Progresso visual: Barra de progresso mostra quanto do principal foi amortizado
  • Status de parcelas: Pendente, Pago, Parcial, Atrasado, Cancelado
  • Preparado para conciliação: Campos para vincular transações futuras

[1.3.14] - 2025-12-08

Changed - Saldo Total por Moeda

Frontend (Accounts.jsx)

  • Saldo total agora exibido separadamente por moeda
    • Função getTotalsByCurrency() agrupa saldos por currency
    • Cada moeda (BRL, EUR, USD, etc.) exibida com seu próprio total
    • Layout responsivo com cards lado a lado
    • Verde para saldo positivo, vermelho para negativo

[1.3.13] - 2025-12-08

Fixed - Tradução i18n faltando

Frontend (i18n)

  • Adicionada chave de tradução accounts.descriptionPlaceholder
    • pt-BR: "Observações sobre esta conta (opcional)"
    • es: "Observaciones sobre esta cuenta (opcional)"
    • en: "Notes about this account (optional)"

[1.3.12] - 2025-12-08

Changed - Layout Desktop Compacto (25% menor)

Frontend (CSS)

  • Reduzido tamanho geral dos elementos em 25% para desktop
    • Font size base: 16px → 13px (em telas ≥992px)
    • Headings reduzidos proporcionalmente (h1: 2.5rem → 1.875rem, etc.)
    • Buttons mais compactos (padding reduzido)
    • Forms: inputs e labels menores
    • Tables: células mais compactas
    • Spacing utilities (.p-3, .p-4, .mb-3, etc.) reduzidos
    • Modais: tamanhos máximos reduzidos
    • Badges e alerts mais compactos

Frontend (Layout.jsx)

  • Sidebar mais compacta
    • Largura: 250px → 200px
    • Colapsada: 70px → 55px
    • Fonte do menu reduzida
    • Avatar do usuário menor (35px → 28px)

[1.3.11] - 2025-12-08

Fixed - Modal de Confirmação (Excluir Conta)

Frontend (React)

  • Refatorado componente Modal.jsx para funcionar sem Bootstrap JS
    • Bootstrap 5 JS API não funciona bem com React (problemas de inicialização)
    • Implementado modal 100% controlado via React (show/hide via props)
    • Adicionado suporte a ESC para fechar (se keyboard=true)
    • Adicionado bloqueio de scroll do body quando modal está aberto
    • Suporte a backdrop "static" (não fecha ao clicar fora)
    • Botão de excluir conta agora funciona corretamente

[1.3.10] - 2025-12-08

Fixed - Posicionamento do Dropdown em CostCenters

Frontend (React)

  • Adicionado posicionamento absoluto ao dropdown
    • position: relative no container do dropdown
    • position: absolute, right: 0, top: 100%, zIndex: 1000 no menu
    • Dropdown agora aparece corretamente abaixo do botão

[1.3.9] - 2025-12-08

Fixed - Dropdown de Ações em CostCenters

Frontend (React)

  • Corrigido dropdown de ações nos cards de centros de custo
    • Bootstrap 5 com React não funciona bem com data-bs-toggle="dropdown"
    • Implementado dropdown controlado via estado React (useState)
    • Adicionado useRef para detectar cliques fora e fechar dropdown
    • Dropdown agora abre/fecha corretamente ao clicar nos três pontinhos

[1.3.8] - 2025-12-08

Fixed - Import Bootstrap JS (não funcionou)

Frontend (React)

  • Tentativa de correção adicionando bootstrap.bundle.min.js no main.jsx
  • Nota: Não resolveu o problema - Bootstrap 5 precisa de inicialização manual com React

[1.3.7] - 2025-12-08

Added - Campo is_admin para Usuários

Backend (Laravel)

  • Campo is_admin na tabela users
    • Migration para adicionar coluna is_admin (boolean, default false)
    • Atualizado modelo User com novo campo, cast e método isAdmin()
    • Marco (id=2) também definido como admin

[1.3.6] - 2025-12-08

Added - Centro de Custo do Sistema

Backend (Laravel)

  • Campo is_system na tabela cost_centers

    • Migration para adicionar coluna is_system (boolean, default false)
    • Atualizado modelo CostCenter com novo campo e scope system()
  • Auto-criação do centro de custo "Geral"

    • Criado automaticamente quando usuário não tem nenhum centro de custo
    • Nome: "Geral", Código: "GERAL"
    • Para agrupar transações sem centro de custo definido
  • Proteção contra edição/exclusão

    • Centros de custo com is_system=true não podem ser editados
    • Centros de custo com is_system=true não podem ser excluídos
    • Retorna erro 403 com mensagem apropriada

Frontend (React)

  • Indicação visual do centro de custo do sistema

    • Ícone de cadeado (🔒) ao lado do nome
    • Dropdown de ações oculto para centros de custo do sistema
  • Traduções adicionadas (i18n)

    • costCenters.systemCostCenter em pt-BR, en, es

[1.3.5] - 2025-12-08

Fixed - Sistema de Traduções i18n

Frontend (React)

  • Revisão completa do sistema de traduções

    • Accounts.jsx: Todos os textos hardcoded substituídos por t('...')
    • Categories.jsx: Todos os textos hardcoded substituídos por t('...')
    • CostCenters.jsx: Todos os textos hardcoded substituídos por t('...')
    • Dashboard.jsx: Todos os textos hardcoded substituídos por t('...')
  • Elementos traduzidos:

    • Headers, botões, labels de formulários
    • Mensagens de erro e sucesso (toast)
    • Placeholders, tooltips, badges de status
    • Modais de confirmação de exclusão
    • Contadores e filtros
  • Arquivos de tradução verificados:

    • pt-BR.json: Completo
    • en.json: Completo
    • es.json: Completo

[1.3.4] - 2025-12-08

Fixed - Fundo Branco em Tabelas

Frontend (React)

  • Correção definitiva do fundo branco em tabelas
    • Adicionado backgroundColor: 'transparent' inline em todos os elementos de tabela
    • <table>, <thead>, <tbody>, <tr>, <th>, <td> todos com estilo inline
    • CSS variables do Bootstrap redefinidas com --bs-table-bg: 'transparent'
    • Corrigido em Accounts.jsx e Dashboard.jsx

[1.3.3] - 2025-12-08

Changed - IconSelector Modal

Frontend (React)

  • IconSelector refatorado - Mudança de dropdown para modal

    • Modal grande com grid visual de ícones
    • Experiência de seleção muito melhorada
    • Campo de busca com ícone
    • Filtros por categoria em botões
    • Ícone selecionado destacado com borda azul
    • Fechamento ao clicar fora do modal
    • Footer com contagem de ícones e botão cancelar
  • Correção de tabelas com tema dark

    • Hover das linhas com fundo azul translúcido
    • Variáveis CSS do Bootstrap redefinidas

[1.3.2] - 2025-12-08

Added - Seletor Visual de Ícones

Frontend (React)

  • IconSelector - Componente visual para seleção de ícones

    • Grid visual com mais de 200 ícones organizados por categoria
    • Busca por nome de ícone
    • Filtro por categoria (money, bank, card, food, shopping, etc.)
    • Suporte para 3 tipos: account, category, costCenter
    • Visual consistente com tema dark
  • Biblioteca de Ícones Expandida (icons.js)

    • Contas: 50+ ícones (wallets, banks, cards, currencies, investments)
    • Categorias: 150+ ícones (food, shopping, housing, transport, health, education, leisure, travel, work, utilities, etc.)
    • Centros de Custo: 40+ ícones (buildings, projects, departments)
    • Organização por subcategorias para facilitar busca
  • Correções de Tema Dark

    • Correção de fundos brancos em autocomplete de formulários
    • Correção de fundos em checkboxes e radio buttons
    • Correção de color picker com tema dark
    • Correção de modals, dropdowns, alerts, badges

Arquivos Criados

frontend/src/config/icons.js         # Biblioteca de 200+ ícones
frontend/src/components/IconSelector.jsx  # Componente visual de seleção

Arquivos Modificados

frontend/src/pages/Accounts.jsx      # Integração IconSelector + i18n
frontend/src/pages/Categories.jsx    # Integração IconSelector + i18n  
frontend/src/pages/CostCenters.jsx   # Integração IconSelector + i18n
frontend/src/index.css               # Correções tema dark

[1.3.1] - 2025-12-08

Added - Suporte Multi-idioma e Multi-divisa

Frontend (React)

  • Internacionalização (i18n) com react-i18next

    • 3 idiomas: Español (es), English (en), Português (pt-BR)
    • Arquivos de tradução completos em src/i18n/locales/
    • Detecção automática do idioma do navegador
    • Persistência da preferência no localStorage
  • Sistema Multi-divisa

    • 15 moedas suportadas: BRL, USD, EUR, GBP, JPY, CNY, ARS, CLP, COP, MXN, PEN, UYU, CHF, CAD, AUD
    • Formatação automática por locale
    • Componente CurrencySelector para seleção
    • Componente CurrencyDisplay para exibição formatada
  • Novos Componentes

    • LanguageSelector.jsx - Seletor de idioma com bandeiras
    • CurrencySelector.jsx - Seletor de moeda
    • useFormatters.js - Hook para formatação de valores e datas

Arquivos Criados

frontend/src/i18n/
├── index.js                 # Configuração i18next
└── locales/
    ├── es.json              # Tradução Español (padrão)
    ├── en.json              # Tradução English
    └── pt-BR.json           # Tradução Português

frontend/src/config/
└── currencies.js            # Lista de moedas e formatadores

frontend/src/hooks/
├── index.js                 # Exportações
└── useFormatters.js         # Hook de formatação

frontend/src/components/
├── LanguageSelector.jsx     # Seletor de idioma
└── CurrencySelector.jsx     # Seletor de moeda

Changed

  • main.jsx - Adicionado Suspense e import do i18n
  • Layout.jsx - Adicionado seletor de idioma no header, traduções nos menus
  • Dashboard.jsx - Atualizado com traduções e formatação de moeda

Dependencies Added

  • i18next: ^24.x
  • react-i18next: ^15.x
  • i18next-browser-languagedetector: ^8.x

Deployed


[1.3.0] - 2025-12-08

Added - Fase 1: Gerenciadores Base

Backend (Laravel)

  • Gerenciador de Contas - API completa CRUD

    • Tipos: Dinheiro, Conta Corrente, Poupança, Cartão de Crédito, Ativos, Passivos
    • Campos: nome, tipo, banco, número da conta, saldo inicial/atual, cor, ícone
    • Modelo Account com relacionamento ao usuário
    • Migration create_accounts_table
  • Gerenciador de Centros de Custo - API completa CRUD

    • Campos: nome, código, descrição, cor, orçamento
    • Sistema de palavras-chave para matching automático em lote
    • Modelos CostCenter e CostCenterKeyword
    • Migration create_cost_centers_table (com tabela de keywords)
    • Endpoints: /api/cost-centers/{id}/keywords para gerenciar keywords
  • Gerenciador de Categorias - API completa CRUD

    • Tipos: Receita, Despesa, Ambos
    • Suporte a hierarquia (categoria pai e subcategorias)
    • Sistema de palavras-chave para matching automático em lote
    • Modelos Category e CategoryKeyword
    • Migration create_categories_table (com tabela de keywords)
    • Endpoints: /api/categories/{id}/keywords para gerenciar keywords

Frontend (React)

  • Layout com Sidebar - Navegação lateral moderna

    • Componente Layout.jsx reutilizável
    • Menu colapsável responsivo
    • Ícones Bootstrap Icons
    • Tema escuro integrado
  • Componentes Reutilizáveis

    • Modal.jsx - Modal Bootstrap para formulários (sem uso de alert())
    • Toast.jsx - Sistema de notificações com ToastProvider
  • Página de Contas (Accounts.jsx)

    • Listagem com cards coloridos
    • Formulário completo com todos os campos
    • CRUD completo via modal
    • Formatação de valores em BRL
  • Página de Centros de Custo (CostCenters.jsx)

    • Listagem com badges de keywords
    • Formulário com gerenciamento de keywords
    • CRUD completo via modal
  • Página de Categorias (Categories.jsx)

    • Listagem hierárquica (pai > subcategoria)
    • Formulário com seleção de categoria pai
    • Gerenciamento de keywords por categoria
    • CRUD completo via modal
  • Dashboard Atualizado (Dashboard.jsx)

    • Cards de resumo (Contas, Categorias, Centros de Custo)
    • Links de acesso rápido
    • Design moderno com tema escuro

Novos Arquivos Criados

backend/
├── database/migrations/
│   ├── 2025_12_08_000001_create_accounts_table.php
│   ├── 2025_12_08_000002_create_cost_centers_table.php
│   └── 2025_12_08_000003_create_categories_table.php
├── app/Models/
│   ├── Account.php
│   ├── CostCenter.php
│   ├── CostCenterKeyword.php
│   ├── Category.php
│   └── CategoryKeyword.php
└── app/Http/Controllers/Api/
    ├── AccountController.php
    ├── CostCenterController.php
    └── CategoryController.php

frontend/src/
├── components/
│   ├── Layout.jsx
│   ├── Modal.jsx
│   └── Toast.jsx
└── pages/
    ├── Accounts.jsx
    ├── CostCenters.jsx
    └── Categories.jsx

Changed

  • routes/api.php - Adicionadas rotas para accounts, cost-centers, categories
  • services/api.js - Adicionados accountService, costCenterService, categoryService
  • App.jsx - Novas rotas e ToastProvider
  • Dashboard.jsx - Reescrito com cards de resumo
  • index.css - Estilos para sidebar, cards, formulários

Database

  • 6 novas tabelas criadas:
    • accounts - Contas financeiras
    • cost_centers - Centros de custo
    • cost_center_keywords - Palavras-chave de centros de custo
    • categories - Categorias (com self-reference para hierarquia)
    • category_keywords - Palavras-chave de categorias

Deployed


[1.2.2] - 2025-12-07

Added

  • Página "Em Construção" para cnxifly.com
  • Design moderno com tema escuro azul profissional
  • Links para WEBMoney App e contato
  • Animações suaves (fadeIn, pulse)
  • Layout responsivo para mobile

Changed

  • Nginx: cnxifly.com agora serve página estática em /var/www/cnxifly
  • Separação clara: cnxifly.com (institucional) vs webmoney.cnxifly.com (app)

Deployed

[1.2.1] - 2025-12-07

Fixed

  • Removido fundo branco (bg-light) do Dashboard - agora usa tema escuro
  • Adicionada classe .dashboard-dark com gradiente escuro azul
  • Corrigido navbar e footer para usar cores escuras (#1e293b)
  • Tabelas agora têm texto claro (#e2e8f0) em fundo escuro
  • Override de .bg-light do Bootstrap para garantir tema escuro
  • Atualizada versão no footer para v1.2.0

Changed

  • Dashboard.jsx: Substituído bg-light por dashboard-dark
  • index.css: Adicionados novos estilos para tema escuro completo

Deployed

[1.2.0] - 2025-12-07

Added

  • Deploy completo do backend Laravel e frontend React para produção
  • Documento CREDENCIAIS_SERVIDOR.md com todas as credenciais organizadas
  • Suporte IPv6 em todos os vhosts Nginx (listen [::]:443 ssl)
  • Redis 7.0.15 instalado e configurado
  • PM2 6.0.14 para gerenciamento de processos Node.js

Changed

  • Atualizado ROTEIRO_INSTALACAO_SERVIDOR.md com versões reais instaladas
  • Nginx atualizado para 1.29.3 mainline (era 1.27.x no roteiro)
  • PHP atualizado para 8.4.15
  • Composer atualizado para 2.9.2
  • Node.js 22.21.0 LTS

Fixed

  • webmail.cnxifly.com agora serve Roundcube corretamente (antes mostrava phpMyAdmin)
  • Corrigido problema de IPv6 nos vhosts que causava resposta incorreta
  • mail.cnxifly.com agora serve exclusivamente PostfixAdmin

Validated

  • 7/7 serviços ativos (nginx, mariadb, php8.4-fpm, redis, postfix, dovecot, opendkim)
  • 6/6 sites HTTPS funcionando
  • SSL válido para 6 domínios (expira 2026-03-07)
  • DKIM key OK
  • SPF configurado com hard fail (-all)
  • 4 databases criados (webmoney, postfixadmin, roundcube, phpmyadmin)
  • 2 contas de email (admin@cnxifly.com, test@cnxifly.com)

[1.1.5] - 2025-12-07

Added

  • phpMyAdmin instalado em https://phpmyadmin.cnxifly.com com SSL (Let's Encrypt)
  • Usuários administrativos criados (sistema e MariaDB) usando senha única fornecida
  • Documento CREDENCIAIS.md com todas as credenciais criadas

Changed

  • Tela de login agora aplica tema escuro/azul conforme especificação (background, cards, botões)

Fixed

  • Erro de dependências ausentes (MariaDB) para phpMyAdmin

[1.1.4] - 2025-12-07

Added

  • ✓ Documentação completa do tema escuro/azul profissional em ESPECIFICACIONES
  • ✓ Paleta de cores detalhada com códigos hex e variáveis SCSS
  • ✓ Certificado SSL expandido para incluir webmail.cnxifly.com
  • ✓ Configuração Nginx para webmail.cnxifly.com com HTTPS
  • ✓ Documentação de uso dos subdomínios mail/webmail

Changed

  • Removida rota /register do frontend - usuários NÃO podem se auto-registrar
  • Login sem link para registro (apenas admins criam usuários)
  • Subdominios documentados: mail.cnxifly.com = admin email, webmail.cnxifly.com = usuários finais

Fixed

  • ERR_CERT_COMMON_NAME_INVALID em webmail.cnxifly.com Certificado SSL válido
  • Let's Encrypt agora inclui 6 domínios: cnxifly.com, www, webmoney, mail, webmail, ftp

Security

  • Certificado wildcard Let's Encrypt válido até 2026-03-07
  • TLS 1.2/1.3 configurado em webmail.cnxifly.com
  • Redirecionamento automático HTTP → HTTPS

[1.1.3] - 2025-12-07

Added

  • ✓ Frontend React completo com Vite + React Router + Bootstrap 5
  • ✓ Tela de Login (/login) com validação e feedback de erros
  • ✓ Tela de Registro (/register) com confirmação de senha
  • ✓ Dashboard (/dashboard) protegido com informações do usuário
  • ✓ Sistema de autenticação com Context API e localStorage
  • ✓ Interceptor Axios para token automático em todas as requisições
  • ✓ ProtectedRoute para rotas que requerem autenticação
  • ✓ Deploy script para frontend (frontend/deploy.sh)
  • ✓ Configuração Nginx ajustada para React SPA + Laravel API

Changed

  • Nginx agora serve React SPA em / e Laravel API em /api
  • Index do Nginx mudado de index.php para index.html (React)

Validation

  • Frontend acessível em https://webmoney.cnxifly.com
  • Login/Register funcionando com backend Laravel
  • Dashboard mostra informações do usuário autenticado
  • Logout revoga token e redireciona para login
  • API /api/* respondendo corretamente via Nginx

Tech Stack

  • React 18 + Vite (rolldown-vite experimental)
  • React Router DOM para navegação
  • Axios para requisições HTTP
  • Bootstrap 5 + Bootstrap Icons
  • Laravel Sanctum (backend)

[1.1.2] - 2025-12-07

Added

  • ✓ Registro DMARC publicado em _dmarc.cnxifly.com com política p=quarantine, alinhamento estrito (adkim/aspf=s) e coleta de relatórios (rua/ruf para postmaster@cnxifly.com)
  • ✓ Cabeçalhos anti-spam adicionados aos emails de boas-vindas: List-Unsubscribe (mailto) e List-Unsubscribe-Post: List-Unsubscribe=One-Click

Changed

  • Fluxo de envio de email configurado para validar SPF/DKIM/DMARC end-to-end após publicação do DMARC

Validation

  • SPF=pass, DKIM=pass, DMARC=pass em entrega real para Gmail (forward iCloud) com chegada em INBOX
  • Endpoint POST /api/email/send-test respondendo 200 e entregando com autenticações válidas

Notes

  • Política DMARC pode ser elevada para p=reject após estabilização
  • Manter aquecimento do domínio com baixo volume antes de campanhas

[1.0.5] - 2025-12-07

Added

  • ✓ Certificado SSL Let's Encrypt expandido para incluir mail.cnxifly.com e ftp.cnxifly.com
  • ✓ Virtual host Nginx para mail.cnxifly.com com HTTPS e HTTP/2
  • ✓ Virtual host Nginx para ftp.cnxifly.com com HTTPS e HTTP/2
  • ✓ Registro DNS DKIM (default._domainkey.cnxifly.com) adicionado e validado

Fixed

  • ✓ Certificado SSL agora cobre TODOS os domínios: cnxifly.com, www, webmoney, mail, ftp
  • ✓ Postfix e vsftpd recarregados com certificados atualizados
  • ✓ Todos os 5 domínios agora respondem HTTPS 200 com HTTP/2

Configuration

  • Certificado SSL: válido até 2026-03-07 (5 domínios)
  • Nginx: 4 sites habilitados (cnxifly.com, webmoney, mail, ftp)
  • DKIM DNS: TXT record publicado e propagado
  • Security headers: HSTS, nosniff, XFO, XSS-Protection em todos os vhosts

Validation

  • 5/5 domínios com HTTPS funcional
  • 6/6 serviços ativos (nginx, postfix, opendkim, vsftpd, php-fpm, postgresql)
  • 18/18 regras de firewall UFW configuradas
  • DKIM DNS propagado e validado via dig
  • Certificado SSL multi-domínio ativo

Notes

  • INFRAESTRUTURA 100% COMPLETA - Todas as correções aplicadas
  • Todos os certificados SSL configurados e válidos
  • Email anti-spam funcional com DKIM publicado em DNS
  • Pronto para desenvolvimento de aplicação Laravel + React

[1.0.4] - 2025-12-07

Added

  • ✓ Servidor de Email Postfix 3.8.6 instalado e configurado com TLS
  • ✓ OpenDKIM 2.11.0 instalado com chaves DKIM geradas para cnxifly.com
  • ✓ Integração Postfix + OpenDKIM via milter (porta 8891)
  • ✓ Contas de email criadas: admin@cnxifly.com, no-reply@cnxifly.com, support@cnxifly.com
  • ✓ Aliases de email configurados em /etc/aliases
  • ✓ vsftpd 3.0.5 instalado com suporte SSL/TLS usando certificados Let's Encrypt
  • ✓ FTP passivo configurado (portas 40000-50000)
  • ✓ Virtual host Nginx dedicado para webmoney.cnxifly.com com PHP-FPM
  • ✓ Diretório /var/www/webmoney/public criado para aplicação Laravel
  • ✓ PHP-FPM 8.3 ativo e integrado com Nginx
  • ✓ Portas adicionais abertas no UFW: 25, 587, 465 (SMTP), 21, 20 (FTP), 40000-50000 (FTP passivo)

Configuration

  • Postfix: myhostname=mail.cnxifly.com, TLS ativo, DKIM signing habilitado
  • OpenDKIM: selector=default, domain=cnxifly.com, chave RSA 2048-bit
  • vsftpd: SSL ativo, write_enable=YES, pasv_mode ativo
  • Nginx webmoney: root=/var/www/webmoney/public, PHP-FPM via socket, HTTPS only

Security

  • Anti-spam: DKIM assinatura digital em emails enviados
  • Registro DNS TXT necessário: default._domainkey.cnxifly.com (ver chave pública gerada)
  • FTP com SSL/TLS obrigatório
  • 18 regras ativas no UFW (IPv4 + IPv6)

Notes

  • Servidor 100% pronto conforme ESPECIFICACIONES_WEBMONEY.md
  • Email SMTP disponível para envio de notificações da aplicação
  • FTP disponível para deploy manual de arquivos (usar FTPS)
  • Laravel pode ser instalado em /var/www/webmoney
  • React build pode ser servido via Nginx (SPA mode)

[1.0.3] - 2025-12-07

Added

  • ✓ Firewall UFW ativado permitindo apenas 22/80/443 (IPv4 e IPv6)
  • ✓ Instalação e configuração do Nginx com gzip, charset UTF-8 e cabeçalhos de segurança (HSTS, nosniff, XFO, XSS-Protection, Referrer-Policy, Permissions-Policy)
  • ✓ Certificados SSL Lets Encrypt emitidos para cnxifly.com, www.cnxifly.com e webmoney.cnxifly.com com redirecionamento HTTPS
  • ✓ Banco PostgreSQL webmoney criado com ENCODING UTF8 e LOCALE es_ES.UTF-8
  • ✓ Usuário PostgreSQL webmoney_user criado com senha forte e privilégios na base webmoney
  • ✓ Apache desabilitado para liberar portas web e Nginx habilitado em 80/443

Notes

  • Certbot agendado para renovação automática
  • Root web atual: /var/www/html (placeholder; pronto para app)
  • Manter porta 22 aberta garante acesso via workspace/local conforme solicitado

[1.0.2] - 2025-12-07

Added

  • ✓ Configuración obligatoria: Timezone Europe/Madrid
  • ✓ Configuración obligatoria: Encoding UTF-8 en todo el sistema
  • ✓ Instrucciones de configuración del sistema (timedatectl, locale)
  • ✓ Configuración de Timezone y Encoding en Base de Datos:
    • PostgreSQL: client_encoding = 'UTF8'
    • MySQL/MariaDB: utf8mb4 + utf8mb4_unicode_ci
  • ✓ Configuración de Encoding en Laravel:
    • config/app.php: timezone y locale
    • config/database.php: opciones de conexión UTF-8
  • ✓ Configuración de Encoding en Frontend (React/Vite):
    • .env variables para timezone
    • date-fns con locale es_ES
    • i18n con español como idioma por defecto
  • ✓ Configuración de Encoding en Servidores Web:
    • Nginx: charset utf-8 headers
    • Apache: AddDefaultCharset utf-8
  • ✓ Verificación de configuración (comandos de testing)
  • ✓ Sección de seguridad ampliada con timezone/encoding

Configuration

  • Timezone: Europe/Madrid (WET/WEST, UTC±0/±1)
  • Encoding: UTF-8 (obligatorio en todos los servicios)
  • Locale: es_ES.UTF-8
  • Aplicaciones: PostgreSQL, MySQL, Laravel, React, Nginx, Apache

Notes

  • DEBE configurarse ANTES de instalar servicios
  • Afecta: BD, Web Server, PHP, Node, Emails, Archivos
  • Verificaciones incluidas para confirmar configuración
  • Tablas de configuração por serviço

[1.0.1] - 2025-12-07

[1.1.2] - 2025-12-07

Added

  • ✓ Fluxo padrão documentado: desenvolver localmente, executar backend/deploy.sh e validar diretamente em https://webmoney.cnxifly.com
  • ✓ Sample de email anti-spam (EMAIL_SAMPLE.md) com HTML e texto, usando From/Reply-To e headers de opt-out
  • ✓ PAINEL_CONTROLE atualizado com status real de SPF/DKIM/DMARC e versão corrente

Changed

  • README detalha entregabilidade, DMARC e passo a passo de validação no domínio

Validation

  • 🛈 Mudança apenas documental; nenhum binário ou configuração de produção alterado

Added

  • ✓ Documento de Especificaciones del Proyecto (ESPECIFICACIONES_WEBMONEY.md)
  • ✓ Definición completa del proyecto WEBMoney
  • ✓ Configuración de dominios y subdomínios
  • ✓ Stack tecnológico detallado (React + Laravel)
  • ✓ Base de datos: PostgreSQL/MySQL recomendado
  • ✓ Servidor web: Nginx/Apache configuración
  • ✓ Servidor de email: Postfix + Dovecot
  • ✓ FTP/SFTP: vsftpd
  • ✓ SSL/TLS: Let's Encrypt
  • ✓ Listado completo de funcionalidades previstas (18 grupos)
  • ✓ Requisitos UI/UX:
    • 3 idiomas (Español, Inglés, Portugués Brasil)
    • Tema oscuro profissional
    • Modales Bootstrap (sin alert() del navegador)
    • Responsivo para móvil, tablet, desktop
  • ✓ Matriz de tareas por fases
  • ✓ Cronograma de implementação
  • ✓ Estructura de directorios recomendada
  • ✓ Convenciones de código (JS/React e Laravel/PHP)
  • ✓ Variables de entorno templates
  • ✓ Checklist de segurança (10 items)
  • ✓ Targets de performance (Web Vitals)

Specifications

  • Proyecto: WEBMoney - Gerenciador Financeiro Pessoal WEB
  • Proveedor: ConneXiFly
  • Servidor: 213.165.93.60 (Ubuntu 24.04.3 LTS)
  • Dominio: cnxifly.com
  • Subdominio: webmoney.cnxifly.com
  • Email: @cnxifly.com
  • Estado: En Desarrollo

Development Notes

  • Instalación comando a comando (sin scripts automáticos)
  • Documentación completa requerida
  • Desarrollo incremental (solo lo solicitado cuando se solicite)
  • Validación en domínio requerida para cada cambio
  • Prohibido: alertas del navegador (alert, confirm, prompt)
  • Usar: Bootstrap Modals y Toast en su lugar

[1.0.0] - 2025-12-07

Added

  • ✓ Auditoria Inicial Completa do servidor 213.165.93.60
  • ✓ Auditoria de domínio cnxifly.com e subdomínios
  • ✓ Documentação: AUDITORIA_INICIAL_CNXIFLY.md
  • ✓ Sistema de Controle de Versão (SemVer 1.0.0)
  • ✓ Arquivo de Diretrizes de Desenvolvimento (IMUTÁVEL)
  • ✓ Arquivo de Changelog (este arquivo)
  • ✓ Arquivo de Versão (VERSION)
  • ✓ Conexão SSH automática via sshpass
  • ✓ Coleta de informações de DNS, nameservers, zona DNS
  • ✓ Descoberta de subdomínios (www, mail, ftp)
  • ✓ Análise de registros SPF, MX, AAAA, SOA
  • ✓ Verificação de processos e portas abertas
  • ✓ Recomendações de segurança e próximas ações

Infrastructure

  • Servidor: 213.165.93.60 (Ubuntu 24.04.3 LTS, Kernel 6.8.0-88-generic)
  • IPv4: 213.165.93.60
  • IPv6: 2001:ba0:268:ab00::1
  • Domínio: cnxifly.com
  • Nameservers: UI-DNS (ns1028.ui-dns.biz, ns1114.ui-dns.com, ns1016.ui-dns.org, ns1119.ui-dns.de)

Status do Servidor v1.0.0

  • Conectividade verificada
  • DNS funcional (systemd-resolved)
  • Serviço SSH ativo
  • Firewall apropriadamente configurado
  • Sem serviços adicionais instalados (pronto para configuração)

Métodos Utilizados

  • sshpass 1.09-1 para automação SSH
  • dig (BIND 9) para consultas DNS
  • systemd-resolved para gerenciamento DNS local
  • ss para análise de portas abertas
  • Enumeração manual de subdomínios comuns

Documentação

  • Criado arquivo AUDITORIA_INICIAL_CNXIFLY.md com:
    • Informações do servidor e rede
    • Configuração DNS detalhada
    • Mapeamento de domínio e subdomínios
    • Registros DNS (A, AAAA, MX, TXT, NS, SOA)
    • Análise de segurança
    • Recomendações de próximas ações
    • Ferramentas e métodos utilizados

Security Notes

  • ⚠️ SPF com softfail (~all) - considerar migração para hard fail (-all)
  • ⚠️ Sem DNSSEC configurado
  • ⚠️ Sem DKIM detectado
  • ✓ DNS não exposto para resolução pública
  • ✓ Apenas SSH em porta 22 (acesso controlado)

Notas Importantes

Directives de Desenvolvimento

Este projeto segue as DIRETRIZES_DESENVOLVIMENTO estabelecidas em v1.0.0:

  • Controle de versão incremental para CADA commit/push
  • Validação de mudanças através do domínio (cnxifly.com)
  • Nenhum arquivo pendente pode ser editado sem commit prévio
  • Documentação obrigatória em CHANGELOG.md

Próximas Ações Recomendadas (v1.1.0+)

  • Configurar DNSSEC para o domínio
  • Implementar DKIM para emails
  • Revisar e atualizar SPF (softfail → hard fail)
  • Instalar certificados SSL/TLS
  • Configurar servidor web (nginx/Apache)
  • Implementar monitoramento DNS
  • Autenticação SSH via chaves públicas
  • Configurar HTTPS em subdomínios
  • Implementar backup de zona DNS

Formato de Data: ISO 8601 (YYYY-MM-DD) Mantido por: GitHub Copilot Servidor: 213.165.93.60 (cnxifly.com)