# CHANGELOG

Todas as mudanças relevantes neste projeto serão documentadas neste arquivo.
O formato segue [Keep a Changelog](https://keepachangelog.com/pt-BR/).
Este projeto adota [Versionamento Semântico](https://semver.org/pt-BR/).


## [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
- ✅ Frontend atualizado em https://webmoney.cnxifly.com

---

## [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
- ✅ Backend atualizado em https://webmoney.cnxifly.com/api
- ✅ Frontend atualizado em https://webmoney.cnxifly.com
- ✅ Todas as APIs testadas e funcionando

---

## [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
- ✅ https://cnxifly.com - Página em construção
- ✅ https://www.cnxifly.com - Redirecionamento para cnxifly.com


## [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
- ✅ Frontend atualizado em https://webmoney.cnxifly.com


## [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 Let’s 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
- [x] Conectividade verificada
- [x] DNS funcional (systemd-resolved)
- [x] Serviço SSH ativo
- [x] Firewall apropriadamente configurado
- [x] 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)
