webmoney/CHANGELOG.md

3308 lines
138 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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.53.0] - 2025-12-17
### Fixed
- 🔧 **Correção Middleware Admin** - Alterado de `admin` para `admin.only` nas rotas site-settings
- 🔧 **Correção Deploy cnxifly.com** - Controller atualizado para usar arquivos do servidor
- Páginas armazenadas em `/var/www/cnxifly-pages/`
- Deploy direto via `File::copy()` ao invés de instruções manuais
### Added
- 📁 **Diretório de páginas no servidor** (`/var/www/cnxifly-pages/`)
- `index.html` - Página institucional live
- `maintenance.html` - Página de manutenção
- Permite trocar páginas via painel admin
### Technical Details
- Middleware correto: `admin.only` (registrado em bootstrap/app.php)
- SiteSettingsController agora copia arquivos diretamente no servidor
- Permissões ajustadas para www-data no cnxifly-pages
---
## [1.52.0] - 2025-12-17
### Added
- 🌐 **Landing Page Institucional ConneXiFly** - Página completa para cnxifly.com
- **Produtos destacados**:
- WebMoney: Gestão financeira inteligente (Disponível)
- EZPool: Software de mantenimiento de piscinas (Próximamente)
- **Seções**:
- Hero com animações e gradientes
- Cards de produtos com preços
- Features do ConneXiFly
- CTA para registro
- Footer completo
- **Modal de notificação** para EZPool (pré-registro)
- **Design responsivo** e dark theme consistente
- 🔧 **Página de Manutenção** alternativa (`landing/maintenance.html`)
- Design simples para modo manutenção
- Links para produtos disponíveis
- ⚙️ **Painel Admin - Configurações do Site**
- **Backend**:
- `SiteSetting` model para configurações persistentes
- `SiteSettingsController` para gerenciar cnxifly.com
- Rotas admin para toggle de modo (live/maintenance)
- Migration para tabela `site_settings`
- **Frontend**:
- Nova página `/site-settings` (admin only)
- Toggle entre modo Live e Manutenção
- Preview links para todos os sites
- Instruções de deploy
- 📝 **Script de Deploy Landing** (`deploy-landing.sh`)
- Deploy automático para cnxifly.com
- Suporte a modos: live, maintenance
### Technical Details
- Arquivos criados em `/landing/` (index.html, maintenance.html)
- Bootstrap 5.3 + Bootstrap Icons para a landing
- Integração com menu do WebMoney admin
---
## [1.51.0] - 2025-12-17
### Added
- 👥 **Gestão de Usuários Admin** - Interface completa para administradores criarem usuários
- **Backend**:
- `UserManagementController@store`: Novo endpoint para criar usuários
- Rota `POST /api/admin/users` para criação
- Suporte a tipos de usuário: Free, Pro, Admin
- Assinatura automática Pro/Admin (100 anos, sem PayPal)
- **Frontend**:
- Modal de criação de usuário em `/users`
- Seleção de tipo: Free (sem assinatura), Pro (com assinatura), Admin (admin + assinatura)
- Feedback visual após criação
### Tested
- 🧪 **Testes Completos do SaaS** - Validação do sistema de limites
- **Usuário Free testfree2@webmoney.test (ID: 4)**:
- ✅ Limite de contas: 1/1 → Bloqueia corretamente
- ✅ Limite de categorias: 10/10 → Bloqueia corretamente
- ✅ Limite de budgets: 3/3 → Bloqueia corretamente
- ✅ Mensagens de erro amigáveis em espanhol
- ✅ API retorna `usage` e `usage_percentages` corretos
- **Usuário Pro (admin)**:
- ✅ Limites `null` = ilimitado
- ✅ 173 categorias, 1204 transações sem bloqueio
### Technical Details
- Middleware `CheckPlanLimits` validado em produção
- Endpoint `/subscription/status` retorna uso atual corretamente
- Widget `PlanUsageWidget` funcional no Dashboard
---
## [1.50.0] - 2025-12-17
### Added
- 💳 **Integração PayPal Subscriptions (Fase 3)** - Sistema completo de assinaturas com PayPal
- **Backend**:
- `PayPalService`: Integração completa com PayPal Subscriptions API
- Autenticação OAuth2 com cache de token
- Criação de produtos e planos de billing no PayPal
- Criação e cancelamento de assinaturas
- Verificação de assinatura de webhooks
- `SubscriptionController`: Endpoints para gestão de assinaturas
- `GET /api/subscription/status`: Status da assinatura atual
- `POST /api/subscription/subscribe`: Criar nova assinatura
- `POST /api/subscription/confirm`: Confirmar após retorno PayPal
- `POST /api/subscription/cancel`: Cancelar assinatura
- `GET /api/subscription/invoices`: Listar faturas do usuário
- `POST /api/paypal/webhook`: Receber eventos do PayPal
- Webhooks suportados: BILLING.SUBSCRIPTION.ACTIVATED, CANCELLED, EXPIRED, PAYMENT.SALE.COMPLETED
- **Frontend**:
- `Pricing.jsx`: Página de planos e preços
- Cards de planos com destaque para mais popular
- Badge de economia para plano anual (17%)
- Indicador de trial de 7 dias
- FAQ com perguntas frequentes
- Badges de segurança (PayPal, cancelamento)
- `Billing.jsx`: Página de faturamento
- Card com plano atual e status
- Features e limites do plano
- Lista de faturas com download PDF
- Modal de confirmação para cancelar
- Confirmação automática após retorno PayPal
- **Traduções**: Completas em ES, PT-BR, EN
- pricing.* (title, free, month, trial, FAQ, etc.)
- billing.* (status, invoices, cancel, limits, etc.)
- nav.billing, nav.pricing
- **Navegação**: Novas opções no menu Settings
- /pricing (público) - Página de planos
- /billing (auth) - Gestão de assinatura
### Technical Details
- **PayPal API v1**: Subscriptions API com OAuth2
- **Webhook Events**: Validação HMAC para segurança
- **Invoice Generation**: Numeração automática WM-YYYY-NNNNNN
- **Trial Support**: 7 dias com status 'trialing'
- **Multi-currency**: EUR (default), USD, BRL suportados
### Roadmap SaaS
1.**Fase 1**: Perfil completo do usuário
2.**Fase 2**: Tabelas de assinaturas (plans, subscriptions, invoices)
3.**Fase 3**: Integração PayPal Subscriptions
4.**Fase 4**: Enforcement de limites por plano
### Configuration Required
Para ativar PayPal, configurar no .env:
```
PAYPAL_CLIENT_ID=your_client_id
PAYPAL_CLIENT_SECRET=your_client_secret
PAYPAL_MODE=sandbox # ou 'live' para produção
PAYPAL_WEBHOOK_ID=your_webhook_id
```
## [1.49.0] - 2025-12-17
### Added
- 💳 **Sistema de Assinaturas (Fase 2)** - Infraestrutura completa para modelo SaaS
- **Tabela `plans`**: Planos de assinatura com preços, features e limites
- Free: Grátis, até 3 contas, 10 categorias, 3 orçamentos, 1 meta
- Pro Mensual: €9.99/mês, 7 dias trial, tudo ilimitado
- Pro Anual: €99.99/ano, 17% desconto, 7 dias trial
- **Tabela `subscriptions`**: Assinaturas dos usuários
- Status: trialing, active, past_due, canceled, expired
- Suporte a trial, grace period, cancelamento
- Campos para integração PayPal
- **Tabela `invoices`**: Faturas com numeração sequencial (WM-2025-NNNNNN)
- Suporte a IVA/VAT (21% para EU)
- Snapshot de dados de billing
- **API pública**: `GET /api/plans` e `GET /api/plans/{slug}`
### Technical Details
- **Migrations**: 3 novas tabelas (plans, subscriptions, invoices)
- **Models**: Plan, Subscription, Invoice com relacionamentos e helpers
- **User Model**: Novos métodos hasActiveSubscription(), onTrial(), subscribedTo(), hasFeature(), getLimit(), currentPlan()
- **PlanController**: Endpoint público para listar planos
- **PlansSeeder**: Criação dos 3 planos base
### Roadmap SaaS
1.**Fase 1**: Perfil completo do usuário
2.**Fase 2**: Tabelas de assinaturas (plans, subscriptions, invoices)
3.**Fase 3**: Integração PayPal Subscriptions
4.**Fase 4**: Página de Billing e gestão de assinatura
## [1.48.0] - 2025-12-17
### Added
- 🌍 **Perfil Completo para SaaS** - Expansão da página de perfil para suportar modelo de assinaturas
- **Dados pessoais expandidos**: nome, sobrenome, email
- **Telefone internacional**: código do país selecionável (+34, +55, +1, etc.) com bandeiras
- **Preferências de comunicação**:
- Checkbox "Aceitar notificações por WhatsApp"
- Checkbox "Aceitar emails promocionais"
- **Localização**: país, timezone e idioma selecionáveis
- **Alteração de senha**: seção separada com validação
### Technical Details
- **Backend**:
- Nova migration: `add_profile_fields_to_users_table`
- Campos adicionados: `first_name`, `last_name`, `phone_country_code`, `phone`, `accept_whatsapp`, `accept_emails`, `avatar`, `country`, `timezone`, `locale`
- User Model: accessors `getFullNameAttribute()`, `getFullPhoneAttribute()`
- AuthController: `me()` e `updateProfile()` atualizados
- **Frontend**:
- Componente `Profile.jsx` redesenhado com formulário completo
- Listas de códigos de país, países e timezones
- Traduções em ES, PT-BR, EN para todos os novos campos
### Roadmap SaaS
Esta release é a **Fase 1** da transformação para SaaS:
1.**Fase 1**: Perfil completo do usuário
2.**Fase 2**: Tabelas de assinaturas (plans, subscriptions, invoices)
3.**Fase 3**: Integração PayPal Subscriptions
4.**Fase 4**: Página de Billing e gestão de assinatura
## [1.47.0] - 2025-12-17
### Added
- 👤 **Página Meu Perfil** - Gerenciamento de dados pessoais do usuário
- Editar nome e email
- Alterar senha (validação de senha atual obrigatória)
- Validação em tempo real dos campos
- Feedback visual de erros e sucesso
- Traduções completas: PT-BR, EN, ES
- Link no menu Configurações > Perfil
### Technical Details
- Backend: `PUT /api/profile` no AuthController
- Frontend: `Profile.jsx` com formulários separados para dados e senha
- Service: `profileService` em api.js com atualização automática do localStorage
## [1.44.6] - 2025-12-17
### Changed
- 🛡️ **Configuração Anti-Spam para Emails** - Melhorias para garantir entrega de emails
- Headers anti-spam adicionados: X-Mailer, X-Priority, Precedence, List-Unsubscribe
- Template HTML com DOCTYPE XHTML 1.0 e charset UTF-8 correto
- DKIM validado com selector `default` (opendkim-testkey OK)
- Documentação atualizada: SPF ✅, DMARC ✅, DKIM ✅, PTR ✅
## [1.44.5] - 2025-12-17
### Added
- 📧 **Notificações de Pagamentos Vencidos** - Sistema completo de alertas diários por email
- **Email diário** no horário configurado pelo usuário (padrão: 20:00)
- **Conteúdo do email**:
- Resumo geral: total vencido, total amanhã, saldo disponível, déficit
- Lista de itens vencidos (ordenados pelo mais antigo primeiro)
- Lista de itens que vencem amanhã
- Saldos de todas as contas
- Lista de pagamentos que podem ser feitos com saldo atual
- Lista de pagamentos que não podem ser feitos (sem saldo)
- Sugestões de transferência entre contas para cobrir déficits
- **Fontes de dados**: transactions pendentes, liability_installments pendentes, recurring_instances pendentes
- **Template responsivo** em HTML com fallback para texto puro
- ⚙️ **Página de Preferências do Usuário** - Nova seção de configurações
- Ativar/desativar notificações de pagamentos
- Configurar horário de envio (input tipo time)
- Email personalizado (opcional, padrão é email do usuário)
- Botão de teste para enviar notificação imediatamente
- Configurações de idioma, timezone e moeda
- Interface com traduções em PT-BR, EN e ES
### Technical Details
- **Backend**:
- Nova tabela: `user_preferences` (notify_due_payments, notify_due_payments_time, notify_due_payments_email, language, timezone, currency)
- Novo Model: `UserPreference` com relação ao User
- Novo Artisan Command: `notify:due-payments` - executa a cada minuto via scheduler
- Nova Mailable: `DuePaymentsAlert` com templates HTML e texto
- Novo Controller: `UserPreferenceController` (GET/PUT preferences, POST test-notification)
- Scheduler configurado em `routes/console.php`
- **Frontend**:
- Nova página: `Preferences.jsx` com formulário de configurações
- Novo serviço: `preferencesService` em api.js
- Nova rota: `/preferences`
- Link no menu de configurações (dropdown do usuário)
- **Servidor**:
- Cron configurado: `* * * * * cd /var/www/webmoney/backend && php artisan schedule:run`
## [1.44.4] - 2025-12-17
### Fixed
- **Reports - Vencidos** - Corrigido endpoint `/api/reports/overdue` para exibir todas as transações vencidas
- Adicionada busca direta em `recurring_instances` pendentes com `due_date < hoje`
- Antes: apenas 1 vencido era exibido (dependia de `getOverdueRecurrences` que só buscava templates ativos)
- Agora: todas as instâncias de recorrências pendentes vencidas são exibidas (igual a parcelas de passivos e transações pendentes)
- Identificação clara com sufixo "(Recorrente)" na descrição
- `source_type: 'recurring_instance'` para diferenciar de outros tipos
## [1.44.3] - 2025-12-17
### Fixed
- 🐛 **CORREÇÃO DEFINITIVA**: Propagação Espaçada de Orçamentos por Período
- **Comportamento Desejado**: Orçamentos devem ser criados de forma **espaçada** ao longo do ano
- **Implementação Correta**:
* **monthly**: A cada 1 mês → Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec = **12 orçamentos**
* **bimestral**: A cada 2 meses → Jan, Mar, May, Jul, Sep, Nov = **6 orçamentos**
* **trimestral**: A cada 3 meses → Jan, Apr, Jul, Oct = **4 orçamentos**
* **semestral**: A cada 6 meses → Jan, Jul = **2 orçamentos**
* **yearly**: Apenas 1 vez → Jan = **1 orçamento**
- Exemplo prático: Criar orçamento **bimestral** em Janeiro → sistema cria automaticamente para Jan, Mar, Mai, Jul, Set, Nov
- v1.44.2 estava criando apenas 2 meses consecutivos (Jan, Fev) em vez de espaçados
### Technical Details
- Arquivo: `backend/app/Http/Controllers/Api/BudgetController.php`
- Método: `store()` - linhas 110-130
- Mudança: Implementado `$periodStepMap` com salto de meses baseado no período
- Lógica: `for ($monthsAhead = $step; $monthsAhead < 12; $monthsAhead += $step)`
- Resultado: Orçamentos distribuídos uniformemente ao longo de 12 meses
## [1.44.2] - 2025-12-17
### Fixed
- 🐛 **CORREÇÃO CRÍTICA**: Propagação de Orçamentos por Tipo de Período
- **BUG**: Orçamentos bimestrais, trimestrais, semestrais e anuais estavam sendo propagados para TODOS os 12 meses seguintes, ignorando o tipo de período selecionado
- **CAUSA**: Loop fixo `for ($i = 1; $i <= 12; $i++)` no método `store()` do `BudgetController`
- **SOLUÇÃO**: Implementado mapa dinâmico de propagação por tipo de período:
* **monthly**: Propaga 12 meses adicionais (mês atual + 12 seguintes) ✓
* **bimestral**: Propaga 1 mês adicional (2 meses totais) ✓
* **trimestral**: Propaga 2 meses adicionais (3 meses totais) ✓
* **semestral**: Propaga 5 meses adicionais (6 meses totais) ✓
* **yearly**: SEM propagação (1 mês apenas) ✓
- Exemplo: Orçamento bimestral criado em Janeiro → cria Janeiro + Fevereiro (2 meses)
- Antes: Orçamento bimestral criado em Janeiro → criava Janeiro até Dezembro (12 meses) ❌
### Technical Details
- Arquivo: `backend/app/Http/Controllers/Api/BudgetController.php`
- Método: `store()` - linhas 110-161
- Mudança: Loop dinâmico baseado em `$monthsToPropagateMap`
- Compatibilidade: Mantida para orçamentos existentes (não afetados)
## [1.44.1] - 2025-12-17
### Fixed
- 🐛 **HOTFIX**: Erro de sintaxe no BudgetController.php linha 158
- Removida vírgula dupla e código solto que causava erro 500 em todas as rotas de budgets
- Corrigido: `'message' => 'Presupuesto creado y propagado',, 'costCenter'`
- Para: `'message' => 'Presupuesto creado y propagado',`
- Adicionado `costCenter` ao load() corretamente
## [1.44.0] - 2025-12-17
### Added
-**NOVA FUNCIONALIDADE**: Centros de Custos em Orçamentos
- Orçamentos agora podem ser filtrados por Centro de Custos (opcional)
- Validação aceita: categoria OU subcategoria OU centro de custos
- Backend: Migration adiciona coluna `cost_center_id` na tabela `budgets`
- Frontend: Seletor de centro de custos no modal de criação de orçamento
- Frontend: Exibição do nome do centro de custos nos cards de orçamento
-**NOVA FUNCIONALIDADE**: Tipos de Período Completos
- Migration atualiza enum `period_type` com todos os períodos:
* monthly (mensal) - 1 mês
* bimestral (bimestral) - 2 meses
* trimestral (trimestral) - 3 meses
* semestral (semestral) - 6 meses
* yearly (anual) - 12 meses
- Cálculo de períodos já estava implementado no modelo Budget.php
### Changed
- 📝 BudgetController: Atualizado para incluir `costCenter` em relacionamentos eager loading
- 📝 BudgetController: Validação de duplicatas agora considera `cost_center_id`
- 📝 Budget Model: Cálculo de `spent_amount` agora filtra por `cost_center_id`
- 📝 Budget Model: Adicionado relacionamento `costCenter()`
- 🌐 Traduções: Adicionadas chaves para cost center e tipos de período (pt-BR, es, en)
### Technical
- 🗄️ Migration: `2025_12_17_000001_add_cost_center_and_update_periods_to_budgets.php`
- Adiciona coluna `cost_center_id` (nullable, foreign key)
- Atualiza `period_type` ENUM para incluir bimestral, trimestral, semestral
## [1.43.26] - 2025-12-16
### Fixed
- 🐛 **FIX CRITICAL**: Erro 500 em projection-chart por variável indefinida
- Removido uso de `$overdueTransactions` (variável que não existe mais após reescrita)
- Substituído por `$overdueImpact` calculado anteriormente
- Linhas 1306-1307: removido `overdue_count` e simplificado `overdue_impact`
## [1.43.25] - 2025-12-16
### Fixed
- 🐛 **REESCRITA COMPLETA - Projeção de Saldo Widget**
- **Bug crítico corrigido**: Estava duplicando valores (templates + instâncias)
- **Bug crítico corrigido**: Lógica de overdue invertida (somava ao invés de subtrair)
- Nova lógica simplificada e correta:
* Ponto inicial = Saldo atual real (current_balance das contas)
* Vencidos aplicados imediatamente no primeiro ponto (bizum 94€ + aluguel 1003€ = -1097€)
* Apenas recurring_instances (não templates) são processadas
* Vencidos processados uma única vez no início
* Futuros processados em cada período (dia/semana)
- Cálculo correto: 64.55€ (saldo) - 1097.81€ (vencidos) = -1033.26€ (projeção inicial)
## [1.43.24] - 2025-12-16
### Fixed
- 🐛 **Projeção de Saldo - Instâncias Recorrentes Vencidas**
- FIX: Widget de projeção agora inclui `recurring_instances` com status pendente e vencidas
- Corrigida query para usar `planned_date` ao invés de `effective_date` nas transações pendentes
- Adicionada query separada para `recurring_instances` vencidas e futuras
- Impacto: Projeção agora reflete corretamente valores como Aluguel (1003.59€) e Bizum Asenergy (94.22€) vencidos
- Cálculo: Saldo Atual - Transações Vencidas - Instâncias Recorrentes Vencidas = Projeção Correta
## [1.43.23] - 2025-12-16
### Fixed
- 🐛 **Critical**: Erro de inicialização circular no Dashboard causado por dependências no useEffect de eventos
- Removidas dependências `loadSummary`, `loadCashflow`, `loadVariances` do array de dependências
- useEffect agora apenas atualiza `refreshKey`, permitindo que componentes façam seus próprios fetches
- Corrigido erro: "Cannot access 'O' before initialization"
## [1.43.22] - 2025-12-16
### Fixed
- **Widget de Projeção - Refresh Automático**
- FIX: Widget de projeção agora atualiza automaticamente quando há mudanças
- Sistema de eventos customizados para comunicação entre componentes
- Eventos implementados: `recurring-paid`, `transaction-created`, `transaction-updated`, `transaction-deleted`, `recurring-updated`
- Dashboard escuta eventos e força recarregamento via `refreshKey`
- CalendarWidget emite eventos após pagar/conciliar instâncias
- Widget de projeção desmonta e remonta para recarregar dados atualizados
## [1.43.21] - 2025-12-16
### Fixed
- **Projeção de Saldo - Instâncias de Recorrências Vencidas**
- FIX CRÍTICO: Projeção agora inclui instâncias de recorrências pendentes vencidas
- Exemplo: "Aluguel" (1003,59€, vencida há 15 dias) e "Compra Bizum Asenergy" (94,22€, vencida há 29 dias)
- Query adicional para `recurring_instances` com `status='pending'` e `due_date < hoje`
- Separa receitas e despesas vencidas corretamente
- Valores agora aparecem em `overdue.income` e `overdue.expense`
## [1.43.20] - 2025-12-16
### Fixed
- **Projeção de Saldo - Transações Pendentes Vencidas**
- FIX: Projeção agora inclui transações pendentes vencidas (status='pending' e planned_date < hoje)
- Adicionadas transações pendentes futuras (planned_date entre hoje e fim do mês)
- Separação clara entre transações vencidas (overdue) e pendentes (pending_this_month)
- Response JSON atualizado com breakdown completo:
* `overdue.income` e `overdue.expense` (transações vencidas)
* `pending_this_month.pending_income` e `pending_expense` (transações futuras)
- Projeção inteligente agora considera: realizado + recorrências + passivos + vencidos + pendentes
## [1.43.19] - 2025-12-16
### Changed
- **Revisão Completa do Modal de Editar Template Recorrente**
- Adicionados TODOS os campos disponíveis no modelo (17 campos totais)
- Campos adicionados: `transaction_description`, `frequency_interval`, `start_date`, `end_date`, `max_occurrences`, `cost_center_id`, `is_active`
- Interface reorganizada com ícones e labels claros
- Campos condicionais (day_of_month apenas para frequências mensais)
- Validação e parsing corretos dos dados antes do envio
- Placeholders e textos de ajuda para melhor UX
- Informações do template (ID, data criação, ocorrências geradas) exibidas no rodapé
- Suporte a status ativo/pausado com toggle visual
- Campo de intervalo para repetições personalizadas (ex: a cada 2 meses)
## [1.43.18] - 2025-12-16
### Changed
- **Hard Delete de Templates Recorrentes**
- Exclusão agora remove permanentemente template e TODAS as instâncias do banco de dados
- Backend: `forceDelete()` em vez de soft delete ou desativação
- Remove todas as instâncias (futuras, pagas, canceladas, etc.)
- Modal de confirmação atualizado com avisos claros sobre exclusão permanente
- Ação irreversível - dados não podem ser recuperados
## [1.43.17] - 2025-12-16
### Changed
- **Categorias - Revisão Completa de Cores para Máximo Contraste**
- **170 categorias revisadas e padronizadas** com cores escuras para perfeito contraste
- Sistema de cores por família:
* **Alimentação**: Vermelhos escuros (#dc2626 a #450a0a)
* **Transporte**: Azuis escuros (#2563eb a #172554)
* **Moradia**: Roxos escuros (#7c3aed a #2e1065)
* **Saúde**: Verdes escuros (#059669 a #064e3b)
* **Educação**: Laranjas escuros (#d97706 a #78350f)
* **Lazer**: Rosas escuros (#db2777 a #881337)
* **Vestuário**: Cianos escuros (#0891b2 a #164e63)
* **Beleza**: Roxos escuros (#9333ea a #581c87)
* **Tecnologia**: Índigos escuros (#4f46e5 a #312e81)
* **Pets**: Teals escuros (#0d9488 a #134e4a)
* **Vending**: Laranjas escuros (#ea580c a #7c2d12)
* **Vaper/Tabaco**: Azuis escuros (#1e40af a #2563eb)
* **Investimentos**: Verdes escuros (#16a34a a #14532d)
* **Impostos**: Vermelhos escuros (#b91c1c a #450a0a)
* **Seguros**: Azuis escuros (#0284c7 a #0c4a6e)
* **Presentes**: Rosas escuros (#e11d48 a #881337)
* **Empréstimos**: Limas escuros (#65a30d a #365314)
* **Salário**: Verdes escuros (#16a34a a #14532d)
* **Negócios**: Azuis escuros (#1d4ed8 a #172554)
* **Outras Receitas**: Roxos escuros (#7c3aed a #3b0a78)
* **Viagens**: Vermelhos escuros (#b91c1c a #7f1d1d)
* **Passeios Turísticos**: Laranjas escuros (#d97706 a #78350f)
* **Filhos**: Cores diversas escuras por subcategoria
- **Garantia**: 100% das categorias com contraste WCAG AA+ (texto branco legível)
- **Consistência**: Cores relacionadas dentro da mesma família
- **Identificação visual**: Cada grupo tem sua paleta única
## [1.43.16] - 2025-12-16
### Changed
- **Categorias - Padronização Global de Contraste**
- Ajustadas **TODAS** as cores de categorias para garantir contraste adequado com texto branco
- 18 categorias com cores muito claras foram escurecidas:
* Delivery: #FCA5A5 #dc2626 (vermelho escuro)
* Tapas/Pinchos: #FCA5A5 #dc2626
* Bar/Cervecería: #F87171 #dc2626
* Pedágio: #93C5FD #2563eb (azul escuro)
* Seguro Veículo: #60A5FA #3b82f6
* Bicicleta/Patinete: #60A5FA #3b82f6
* Plano de Saúde: #6EE7B7 #059669 (verde escuro)
* Academia: #34D399 #10b981
* Idiomas: #FCD34D #d97706 (laranja escuro)
* Hobbies: #F9A8D4 #db2777 (rosa escuro)
* Eventos: #F472B6 #ec4899
* Cosméticos: #E9D5FF #9333ea (roxo escuro)
* Cloud/SaaS: #C7D2FE #4f46e5 (índigo escuro)
* Aluguel Máquinas: #FDBA74 #f97316 (laranja)
* Flamenco & Cultura: #FCD34D #FCD34D (mantido, limite aceitável)
* Excursões Guiadas: #FDE68A #FCD34D
* Passeios & Tours: #FCA5A5 #B91C1C (vermelho escuro)
* Seguro Viagem: #F87171 #DC2626
- **Resultado**: 100% das categorias agora têm excelente legibilidade
- Padrão uniforme em toda a aplicação
## [1.43.15] - 2025-12-16
### Changed
- **Categorias - Melhor Contraste para Moradia**
- Cores da categoria "Moradia" e subcategorias ajustadas para tons mais escuros
- Melhora significativa no contraste com texto branco
- Cores atualizadas:
* Moradia: #8B5CF6 #7c3aed (roxo mais escuro)
* Aluguel: #7C3AED #6d28d9
* Condomínio: #6D28D9 #5b21b6
* Luz: #5B21B6 #4c1d95
* Água: #4C1D95 #3b0a78
* Gás: #2E1065 #2e1065 (mantido)
* Internet: #C4B5FD #8b5cf6 (muito mais escuro)
* Telefone: #A78BFA #7c3aed (muito mais escuro)
* Reparos: #8B5CF6 #6d28d9
- Todas agora têm legibilidade excelente em badges
## [1.43.14] - 2025-12-16
### Fixed
- **Relatórios - Badges de Categoria (Recorrentes e Futuras)**
- Adicionado `fontSize: '0.75rem'` aos badges de categoria
- Aplicado em:
* Transações Recorrentes
* Transações Futuras
- Agora todos os badges de categoria têm tamanho consistente
## [1.43.13] - 2025-12-16
### Changed
- **Relatórios - Padronização de Badges**
- **Categorias**: Agora usam cores personalizadas (category_color) ao invés de `bg-primary`
* Mostram ícone da categoria quando disponível
* Fallback para `bg-secondary` quando sem categoria
* Aplicado em: Maiores Gastos, Transações Futuras
- **Tamanhos de fonte**: Padronizados em `0.75rem` para todos os badges
* Porcentagens, contadores, dias, frequências, tipos
- **Tipo de Passivo**: Alterado de `bg-secondary` para `bg-info` (azul)
- **Frequência (Recorrentes)**: Alterado de `bg-secondary` para `bg-primary` (destaque)
- **Consistência visual**: Todos os badges agora seguem o mesmo padrão de estilo
### Fixed
- Cards mobile de Maiores Gastos agora mostram cor e ícone corretos da categoria
- Transações Futuras mostram fallback quando sem categoria
## [1.43.12] - 2025-12-16
### Fixed
- **Transações Recorrentes - Badge de Tipo**
- Badge de "Débito" agora aparece em vermelho (`bg-danger`)
- Badge de "Crédito" continua em verde (`bg-success`)
- Problema: Código comparava `template.type === 'expense'` mas banco usa 'debit'/'credit'
- Solução: Corrigido para `template.type === 'debit'`
- Aplicado em:
* Cards mobile
* Tabela desktop
## [1.43.11] - 2025-12-16
### Added
- **Relatórios - Filtro de Período**
- Seletores de "Data Início" e "Data Fim" nos relatórios:
* Por Categoria
* Por Centro de Custo
* Maiores Gastos
- Período padrão: Início do ano (01/01/2025) até hoje (16/12/2025)
- Usuário pode alterar o período livremente
- Interface responsiva: campos lado a lado em desktop, empilhados em mobile
- Parâmetros `start_date` e `end_date` enviados à API
- Traduções:
* pt-BR: "Data Início", "Data Fim"
* en: "Start Date", "End Date"
* es: "Fecha Inicio", "Fecha Fin"
### Changed
- **Frontend - Reports.jsx**
- Estados `startDate` e `endDate` adicionados
- useEffect atualizado com dependências `startDate` e `endDate`
- Parâmetros de data incluídos em:
* `reportService.getByCategory()`
* `reportService.getByCostCenter()`
* `reportService.getTopExpenses()`
## [1.43.10] - 2025-12-16
### Fixed
- **Relatórios - Drill-down de Categorias e Centros de Custo**
- **FIX CRÍTICO**: Ao clicar em uma categoria/centro pai, a soma das subcategorias não batia com o total
- Problema: Query do nível 3 filtrava apenas `c.parent_id = ?`, excluindo transações da categoria pai
- Exemplo: "Vaper/Tabaco" mostrava 784,68 (correto), mas subcategorias somavam 297,33
- Causa: 487,35 estavam na própria categoria pai, não nas subcategorias
- Solução: Query agora usa `(c.id = ? OR c.parent_id = ?)` para incluir categoria pai e subcategorias
- Aplicado em:
* `/api/reports/by-category` (parâmetro `parent_id`)
* `/api/reports/by-cost-center` (parâmetros `cost_center_id` + `category_id`)
- Agora mostra corretamente:
* Categoria pai: 487,35
* Subcategoria 1: 240,45
* Subcategoria 2: 44,20
* Subcategoria 3: 12,68
* **Total: 784,68€**
## [1.43.9] - 2025-12-16
### Added
- **Relatório de Centros de Custo - Drill-down de 3 Níveis**
- Nível 1: Mostra todos os centros de custo
- Nível 2: Clicar em um centro de custo mostra categorias (agrupadas por categoria pai)
- Nível 3: Clicar em uma categoria mostra suas subcategorias
- Navegação com breadcrumbs: "Todos os Centros" > Nome do Centro > Nome da Categoria
- Botões "Voltar" em cada nível
- Otimização mobile: cards responsivos em todos os 3 níveis
- Hover visual em tabelas e cards clicáveis
- **Backend - API /reports/by-cost-center**
- Parâmetros: `cost_center_id` (nível 2) e `category_id` (nível 3)
- Sem parâmetros: lista centros de custo
- Com `cost_center_id`: lista categorias pai do centro de custo
- Com `cost_center_id` + `category_id`: lista subcategorias da categoria
- Query usa COALESCE para agregar subcategorias na categoria pai
- Suporte para transações sem centro de custo (id=0, "Sem classificar")
- **Tradução i18n**
- pt-BR: "Todos os Centros", "Voltar para Todos os Centros", "Voltar para {nome}"
- es: "Todos los Centros"
- en: "All Centers"
### Changed
- **Frontend - Reports.jsx**
- Adicionados estados: `selectedCostCenter` e `selectedCostCenterCategory`
- Função `renderCostCenter` reescrita com lógica de 3 níveis
- useEffect reage a mudanças de `selectedCostCenter` e `selectedCostCenterCategory`
- Estilo condicional: cursor pointer e hover apenas para itens clicáveis
- Breadcrumbs dinâmicos baseados no nível de navegação
## [1.43.8] - 2025-12-16
### Added
- **Relatório de Categorias - Drill-down para Subcategorias**
- Clicar em uma categoria pai agora mostra suas subcategorias em um novo gráfico
- Mesmo layout visual (gráfico de pizza + lista/cards)
- Botão "Voltar" para retornar às categorias principais
- Hover visual em tabelas e cards clicáveis
- Backend suporta filtro `parent_id` para mostrar apenas subcategorias de uma categoria específica
- **Tradução i18n**
- pt-BR: "Distribuição de Subcategorias"
- es: "Distribución de Subcategorías"
- en: "Subcategory Distribution"
### Changed
- **Backend - API /reports/by-category**
- Novo parâmetro `parent_id` para filtrar subcategorias
- Query padrão agrupa por categoria pai, somando transações de todas as subcategorias
- Query com `parent_id` filtra subcategorias da categoria especificada
- **FIX**: Transações em subcategorias agora aparecem corretamente agrupadas na categoria pai
## [1.43.7] - 2025-12-16
### Changed
- **Backend - Relatório de Centros de Custo incluindo transações sem centro**
- Transações sem centro de custo (`cost_center_id = NULL`) agora aparecem como categoria "General"
- Cor padrão: #6b7280 para transações não classificadas
- Query modificada: COALESCE para tratar NULLs como id=0, nome='General'
- Relatório completo: todas as transações aparecem no relatório byCostCenter
### Added
- **Frontend - Tradução i18n 'general'**
- pt-BR: "Geral"
- es: "General"
- en: "General"
- **Frontend - Reports Mobile Optimization (Continuação)**
- **Tab Category**: col-12 mobile, gráfico 300px, lista em cards compactos
- **Tab Evolution**: Cards 2x2, gráficos 250px/200px, botões xs, fontes 0.7-0.85rem
- **Tab TopExpenses - Lista Detalhada**: Cards compactos mobile vs tabela desktop
## [1.43.6] - 2025-12-16
### Improved
- **Modal Detalhes Liabilities - Mobile Otimizado** - Visualização completa mobile
- Modal: fullscreen mobile vs xl desktop
- Header: fontes 0.95rem, ícone 0.9rem, texto truncado
- Summary cards: Grid 2x2 mobile, padding 0.5rem, fontes 0.65-0.85rem
- Taxas: Grid 3 colunas mobile, labels curtos (Mensal/Anual/Total)
- Progress bar: 12px mobile, fontes 0.65-0.75rem
- Parcelas: **Cards layout mobile** com todas as info compactas
- Cards parcelas: status badge, valores, juros, taxas, botões de ação
- Botão footer: full-width mobile, fonte 0.85rem
- Desktop: Tabela completa preservada
- i18n: Adicionadas chaves 'monthly', 'annual', 'total' em pt-BR e es
## [1.43.5] - 2025-12-16
### Improved
- **Página Liabilities - Mobile Otimizado** - Contas Passivo adaptadas para mobile
- Header: Layout flex-column, botão full-width, fontes reduzidas (1.1rem/0.75rem)
- Summary Cards: Grid 2 colunas mobile, sem ícones laterais, texto truncado
- Valores compactos: 0.9rem mobile vs 1.25rem desktop
- Filtros: Grid 50/50 mobile sem label, fontes 0.8rem
- Cards de Contratos: col-12 mobile, padding 0.75rem, fontes 0.65-0.85rem
- Progress bar: 6px mobile vs 8px desktop
- Botões: fontes 0.75rem mobile, mantém ícones e funcionalidade
- Desktop: Layout original preservado
## [1.43.4] - 2025-12-16
### Improved
- **Badges Padronizados** - Estilo translúcido consistente em todo o sistema
- Padrão global via CSS: `bg-{color}` → estilo `bg-opacity-25 text-{color}` automático
- Aparência moderna e uniforme: background translúcido + texto colorido
- Afetados: RecurringTransactions, Accounts, Categories, TransactionsByWeek, FinancialHealth, CostCenters
- Widgets: UpcomingWidget, OverdueWidget, CalendarWidget, OverpaymentsAnalysis
- Simplificação: remover classes redundantes dos JSX, CSS aplica estilo
- **Botões de Ação Padronizados** - RecurringTransactions
- Estilo outline consistente: `btn-outline-{color}` em todas as abas
- Templates e Instâncias usam mesmo padrão visual
- Info (visualizar), Primary (executar), Success (editar), Warning (adiar), Danger (excluir)
## [1.43.3] - 2025-12-16
### Improved
- **Página Transações - Mobile Completo** - Lista de transações otimizada para mobile
- Cards individuais: data + badges (tipo/status) + descrição + conta + categoria + valor
- Menu dropdown com todas as ações (completar, editar, duplicar, dividir, etc.)
- Descrição original do banco visível quando diferente
- Fontes: 0.65-1rem, padding p-3, borders secundários
- Desktop mantém tabela completa
- **Paginação Mobile** - Controles otimizados
- Mobile: Mostra apenas 3 botões (anterior, atual, próxima)
- Indicador "/ total" para contexto
- Botões maiores (36px) para facilitar toque
- Desktop: Mantém visualização de até 7 páginas
### Fixed
- **CategorySelector - Scroll e Visualização** - Problemas em modais corrigidos
- Position fixed com z-index 100000 (acima de modais)
- Scroll sempre visível com scrollbar customizada (8px)
- Altura fixa garantindo funcionamento: 280px (mobile) / 350px (desktop)
- Largura mínima inteligente: 280px (mobile) / 320px (desktop)
- Ajuste automático de posição se ultrapassar viewport
- Margens de segurança: 10-20px das bordas
- Cores da scrollbar harmonizadas com tema escuro
- `-webkit-overflow-scrolling: touch` para iOS
- Modal com `overflow: auto` para scroll adequado
- Cálculo simplificado e robusto de posição
- Funciona perfeitamente em todos os lugares (modais e páginas)
## [1.43.2] - 2025-12-16
### Improved
- **Página Accounts - Contas Passivo Mobile** - Layout em cards para mobile
- Seção "Passivos" convertida para cards em dispositivos mobile
- Cards mostram: ícone + nome + status + número contrato + credor
- Valores principal e saldo devedor lado a lado
- Barra de progresso com percentagem visual
- Fontes otimizadas: 0.65-0.85rem para legibilidade mobile
- Padding compacto: p-3, background escuro (#0f172a)
- Mantém onClick para navegar para /liabilities
- Desktop mantém layout de tabela completo
## [1.43.1] - 2025-12-16
### Fixed
- **Espaços em branco desnecessários em Mobile** - Otimização completa de altura e padding
- Widget Fluxo de Caixa:
- Removido `h-100` em mobile (agora se ajusta ao conteúdo)
- Card-body padding reduzido: 1rem
- Estados loading/erro: altura 280px (antes 350px fixo)
- Gráfico: 280px (mobile) vs 350px (desktop)
- Resumo: margens reduzidas `mt-3 pt-2`
- Widget Projeção de Saldo:
- Card-body padding: 1rem em mobile
- Gráfico reduzido: 250px (mobile) vs 350px (desktop)
- Alertas compactos: padding `p-2`, margens `mb-2/mb-3`, fonte 0.75rem
- Textos abreviados em alertas para economizar espaço
### Improved
- **Abreviações em textos mobile** - Labels compactos sem quebra de linha
- Fluxo de Caixa: "RECEITAS", "DESPESAS", "MÉD. REC.", "MÉD. DESP."
- Sobrepagamentos: "TOTAL", "QTD", "MÉDIA"
- Alertas: "Saldo negativo em" ao invés de "Previsão de saldo negativo em"
- Todos com `whiteSpace: 'nowrap'` para prevenir quebras
## [1.43.0] - 2025-12-16
### Added
- **Widget Projeção de Saldo Mobile** - Comportamento colapsável implementado
- Inicia colapsado em mobile, expande automaticamente se houver dados
- Botão toggle chevron up/down no header
- Botões de período (1, 2, 3, 6, 12 meses) otimizados:
- Desktop: btn-group horizontal
- Mobile: layout flex-wrap em 3 colunas (33.333% cada)
- Altura do gráfico ajustada: 300px (mobile) vs 350px (desktop)
- Cards de estatísticas otimizados para mobile:
- Padding reduzido: p-2 (mobile) vs p-3 (desktop)
- Gap menor: g-2 vs g-3
- Fontes menores: labels 0.7rem, valores 0.9rem
- Percentual de variação oculto em mobile
- **Widget Análise de Sobrepagamentos Mobile** - UX completamente redesenhada
- Comportamento colapsável com auto-expansão quando há dados
- Header otimizado: texto menor, badge compacto, "(12 meses)" oculto
- Gráfico responsivo: 180px (mobile) vs 220px (desktop)
- Cards de resumo compactos: padding p-1, fontes 0.65-0.85rem
- **Layout de transações revolucionário**:
- Mobile: Cards verticais ao invés de tabela horizontal
- Cada card mostra: descrição, valor (+), categoria, data, percentual
- Fontes otimizadas: 0.6-0.75rem
- Border amarelo sutil para destaque
- Altura máxima: 200px com scroll
- Desktop: Tabela completa mantida com todas as colunas
### Fixed
- **React Hooks Error #310** - Corrigida violação das regras de hooks
- Problema: `useEffect` sendo chamado após returns condicionais
- Solução: Movido cálculo de `monthsData` para antes dos returns
- Adicionado `useEffect` na importação: `import { useEffect }`
- Todos os hooks agora executam na ordem correta
- Dependências corretas em useEffect: `[isMobile, monthsData.length, isExpanded]`
### Improved
- **Consistência Mobile Global** - Todos os widgets principais otimizados:
- ✅ Calendário: navegação entre semanas + colapso
- ✅ Próximos 7 Dias: colapso + sync altura desktop
- ✅ Transações em Atraso: colapso + auto-expansão
- ✅ Projeção de Saldo: colapso + botões otimizados + cards compactos
- ✅ Análise Sobrepagamentos: colapso + layout cards mobile
- UX mobile profissional e consistente em todo Dashboard
## [1.42.0] - 2025-12-16
### Added
- **Navegação entre semanas no Calendário Mobile** - Implementada paginação completa
- Botões chevron esquerda/direita para navegar entre semanas
- Título dinâmico: "Esta Semana", "+1 semana", "-2 semanas", etc.
- Botão "Hoje" reseta para semana atual (weekOffset = 0)
- Calendário carrega dados automaticamente da semana selecionada
- Offset de semanas persistente durante navegação
### Fixed
- **Calendário não exibia em Mobile** - Corrigida lógica de renderização
- Problema: condição `day.isCurrentMonth` escondia dias em mobile
- Solução: `(isMobile || day.isCurrentMonth)` permite mostrar semana completa
- Adicionado grid CSS: `.calendar-grid` e `.calendar-grid-week` (7 colunas)
- Botão toggle (chevron) implementado no header mobile
- Badge mostra quantidade de transações do dia selecionado
- Tamanhos específicos: mobile (11px, 50px min-height) vs desktop (12px, 32px)
- Destaque visual do dia atual com border primary
### Changed
- **Widget Transações em Atraso - Comportamento Mobile** - Consistência com outros widgets
- Inicia colapsado em mobile (apenas header visível)
- Auto-expansão quando há transações vencidas
- Botão toggle chevron up/down no header
- Badge mostra total de itens vencidos
- Altura dinâmica: `height: auto` em mobile
- Body com `display: none` quando colapsado
### Improved
- **Consistência Mobile** - Todos os widgets do Dashboard seguem mesmo padrão:
- ✅ Calendário: colapso + navegação entre semanas
- ✅ Próximos 7 Dias: colapso + auto-expansão com dados
- ✅ Transações em Atraso: colapso + auto-expansão com dados
- UX unificada e previsível em dispositivos móveis
## [1.41.1] - 2025-12-16
### Fixed
- **Sincronização de altura em Desktop** - Widget "Próximos 7 Dias" agora sincroniza perfeitamente com o card central de transações
- Corrigido seletor para buscar `.col-lg-8 .col-lg-7 .card` (lista de transações do dia)
- Aumentado timeout de 100ms para 200ms para garantir renderização completa
- Altura idêntica entre os 3 widgets em desktop: calendário, transações do dia e próximos 7 dias
### Validated
- ✅ Mobile: Widgets colapsam corretamente, expandem apenas com dados
- ✅ Desktop: Altura sincronizada perfeitamente entre todos os widgets
## [1.41.0] - 2025-12-16
### Changed
- **WIDGETS COLAPSÁVEIS EM MOBILE** - Otimização do Dashboard para telas pequenas
- Calendário e Próximos 7 Dias iniciam colapsados em mobile (<768px)
- Expansão automática quando houver dados para exibir
- Botão toggle (chevron up/down) no header para expandir/colapsar manualmente
- Badge com contagem de itens no header quando 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 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 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 Lets Encrypt emitidos para cnxifly.com, www.cnxifly.com e webmoney.cnxifly.com com redirecionamento HTTPS
- ✓ Banco PostgreSQL `webmoney` criado com ENCODING `UTF8` e LOCALE `es_ES.UTF-8`
- ✓ Usuário PostgreSQL `webmoney_user` criado com senha forte e privilégios na base `webmoney`
- ✓ Apache desabilitado para liberar portas web e Nginx habilitado em 80/443
### Notes
- Certbot agendado para renovação automática
- Root web atual: `/var/www/html` (placeholder; pronto para app)
- Manter porta 22 aberta garante acesso via workspace/local conforme solicitado
---
## [1.0.2] - 2025-12-07
### Added
- ✓ Configuración obligatoria: Timezone Europe/Madrid
- ✓ Configuración obligatoria: Encoding UTF-8 en todo el sistema
- ✓ Instrucciones de configuración del sistema (timedatectl, locale)
- ✓ Configuración de Timezone y Encoding en Base de Datos:
- PostgreSQL: client_encoding = 'UTF8'
- MySQL/MariaDB: utf8mb4 + utf8mb4_unicode_ci
- ✓ Configuración de Encoding en Laravel:
- config/app.php: timezone y locale
- config/database.php: opciones de conexión UTF-8
- ✓ Configuración de Encoding en Frontend (React/Vite):
- .env variables para timezone
- date-fns con locale es_ES
- i18n con español como idioma por defecto
- ✓ Configuración de Encoding en Servidores Web:
- Nginx: charset utf-8 headers
- Apache: AddDefaultCharset utf-8
- ✓ Verificación de configuración (comandos de testing)
- ✓ Sección de seguridad ampliada con timezone/encoding
### Configuration
- Timezone: Europe/Madrid (WET/WEST, UTC±0/±1)
- Encoding: UTF-8 (obligatorio en todos los servicios)
- Locale: es_ES.UTF-8
- Aplicaciones: PostgreSQL, MySQL, Laravel, React, Nginx, Apache
### Notes
- DEBE configurarse ANTES de instalar servicios
- Afecta: BD, Web Server, PHP, Node, Emails, Archivos
- Verificaciones incluidas para confirmar configuración
- Tablas de configuração por serviço
---
## [1.0.1] - 2025-12-07
## [1.1.2] - 2025-12-07
### Added
- ✓ Fluxo padrão documentado: desenvolver localmente, executar `backend/deploy.sh` e validar diretamente em `https://webmoney.cnxifly.com`
- ✓ Sample de email anti-spam (`EMAIL_SAMPLE.md`) com HTML e texto, usando From/Reply-To e headers de opt-out
- ✓ PAINEL_CONTROLE atualizado com status real de SPF/DKIM/DMARC e versão corrente
### Changed
- README detalha entregabilidade, DMARC e passo a passo de validação no domínio
### Validation
- 🛈 Mudança apenas documental; nenhum binário ou configuração de produção alterado
### Added
- ✓ Documento de Especificaciones del Proyecto (ESPECIFICACIONES_WEBMONEY.md)
- ✓ Definición completa del proyecto WEBMoney
- ✓ Configuración de dominios y subdomínios
- ✓ Stack tecnológico detallado (React + Laravel)
- ✓ Base de datos: PostgreSQL/MySQL recomendado
- ✓ Servidor web: Nginx/Apache configuración
- ✓ Servidor de email: Postfix + Dovecot
- ✓ FTP/SFTP: vsftpd
- ✓ SSL/TLS: Let's Encrypt
- ✓ Listado completo de funcionalidades previstas (18 grupos)
- ✓ Requisitos UI/UX:
- 3 idiomas (Español, Inglés, Portugués Brasil)
- Tema oscuro profissional
- Modales Bootstrap (sin alert() del navegador)
- Responsivo para móvil, tablet, desktop
- ✓ Matriz de tareas por fases
- ✓ Cronograma de implementação
- ✓ Estructura de directorios recomendada
- ✓ Convenciones de código (JS/React e Laravel/PHP)
- ✓ Variables de entorno templates
- ✓ Checklist de segurança (10 items)
- ✓ Targets de performance (Web Vitals)
### Specifications
- Proyecto: WEBMoney - Gerenciador Financeiro Pessoal WEB
- Proveedor: ConneXiFly
- Servidor: 213.165.93.60 (Ubuntu 24.04.3 LTS)
- Dominio: cnxifly.com
- Subdominio: webmoney.cnxifly.com
- Email: @cnxifly.com
- Estado: En Desarrollo
### Development Notes
- Instalación comando a comando (sin scripts automáticos)
- Documentación completa requerida
- Desarrollo incremental (solo lo solicitado cuando se solicite)
- Validación en domínio requerida para cada cambio
- Prohibido: alertas del navegador (alert, confirm, prompt)
- Usar: Bootstrap Modals y Toast en su lugar
---
## [1.0.0] - 2025-12-07
### Added
- ✓ Auditoria Inicial Completa do servidor 213.165.93.60
- ✓ Auditoria de domínio cnxifly.com e subdomínios
- ✓ Documentação: AUDITORIA_INICIAL_CNXIFLY.md
- ✓ Sistema de Controle de Versão (SemVer 1.0.0)
- ✓ Arquivo de Diretrizes de Desenvolvimento (IMUTÁVEL)
- ✓ Arquivo de Changelog (este arquivo)
- ✓ Arquivo de Versão (VERSION)
- ✓ Conexão SSH automática via sshpass
- ✓ Coleta de informações de DNS, nameservers, zona DNS
- ✓ Descoberta de subdomínios (www, mail, ftp)
- ✓ Análise de registros SPF, MX, AAAA, SOA
- ✓ Verificação de processos e portas abertas
- ✓ Recomendações de segurança e próximas ações
### Infrastructure
- Servidor: 213.165.93.60 (Ubuntu 24.04.3 LTS, Kernel 6.8.0-88-generic)
- IPv4: 213.165.93.60
- IPv6: 2001:ba0:268:ab00::1
- Domínio: cnxifly.com
- Nameservers: UI-DNS (ns1028.ui-dns.biz, ns1114.ui-dns.com, ns1016.ui-dns.org, ns1119.ui-dns.de)
### Status do Servidor v1.0.0
- [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)