# 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.32.0] - 2025-12-14

### Added
- **Salud Financiera (Financial Health)** - Nueva página completa
  - Puntuación de 0-100 con anillo visual animado
  - 6 métricas de salud: Capacidad de Ahorro, Control de Deudas, Gestión de Presupuesto, Inversiones, Fondo de Emergencia, Planificación Futura
  - Tarjetas de métricas con gradientes de color
  - Gráfico de evolución histórica de score
  - Sección de insights con alertas y sugerencias
  - Recomendaciones personalizadas
  - Cards de estadísticas rápidas (balance, ingresos, gastos, tasa de ahorro)

- **Metas Financieras (Goals)** - Sistema completo de objetivos de ahorro
  - Crear, editar y eliminar metas con icono y color personalizable
  - Barra de progreso visual con porcentaje
  - Estados: Activo, Completado, Pausado, Cancelado
  - Fecha objetivo y cálculo de meses restantes
  - Contribuciones con modal dedicado
  - Indicador "On Track" basado en contribución mensual requerida
  - Estadísticas: total metas, activas, total ahorrado, restante
  - Acciones: contribuir, pausar, reanudar, marcar completada

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

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

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

- **Base de datos** - Nuevas tablas
  - `financial_goals` - Metas de ahorro con objetivo, fecha, estado
  - `goal_contributions` - Contribuciones a metas
  - `budgets` - Presupuestos mensuales por categoría

- **Navegación** - Nuevo grupo "Planificación" en sidebar
  - Salud Financiera
  - Metas
  - Presupuestos
  - Reportes

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


## [1.31.2] - 2025-12-14

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

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

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


## [1.31.1] - 2025-12-14

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

### Changed
- **Layout de Filtros** - Reorganizado em 3 linhas harmônicas
  - Linha 1: Busca (50%) + Data Inicial (25%) + Data Final (25%)
  - Linha 2: Conta + Categoria + Centro de Custo + Tipo + Estado + Limpar
  - Linha 3: Botão "Categorizar em Lote" alinhado à direita

- **CategorySelector aplicado em**:
  - Modal de Editar Transação
  - Filtros de Transações
  - Modal de Categorização Rápida

### Fixed
- **Dropdown cortado** - Corrigido problema do dropdown sendo cortado por containers com overflow:hidden


## [1.31.0] - 2025-12-14

### Added
- **Variantes de Producto** - Sistema de porciones para Wine House
  - Permite vender mismo producto en diferentes porciones (Botella, Copa, Media Copa, Degustación)
  - Cálculo automático: CMV proporcional, markup, precio de venta por porción
  - Nueva tabla `product_variants` con campos: portion_ratio, quantity_per_unit, volume_ml
  - Modelo `ProductVariant` con métodos: calculateCmvPortion(), calculateSalePrice(), recalculate()
  - Relación HasMany en ProductSheet para variantes

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

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

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


## [1.30.0] - 2025-12-14

### Added
- **Fichas Técnicas de Servicios** - Sistema completo de costos para servicios
  - Duración del servicio en minutos
  - Insumos/materiales con costos unitarios
  - Cálculo automático de CSV (Costo del Servicio Vendido)
  - Integración con configuración de negocio para horas productivas

- **Horas Productivas** - Cálculo de costo fijo por hora
  - Nueva métrica clave: `hours_per_week` (horas por semana)
  - Derivación automática: `hours_per_day = hours_per_week / days_per_week`
  - Fórmula: Horas Productivas = Empleados × Horas/Día × Días/Mes × Productividad%
  - Costo Fijo/Hora = Gastos Fijos / Horas Productivas

- **Seeder de Ejemplos** - `BusinessExampleSeeder` con 3 tipos de negocio
  - TechStore: 5 productos (electrónicos)
  - DevPro: 5 servicios (desarrollo/consultoría)
  - Print & Design: 4 productos + 4 servicios (mixto)

- **Traducciones i18n Completas** - Sección business totalmente internacionalizada
  - `business.common.*`: CMV, CSV, SKU, Markup, unidades de tiempo
  - `business.settings.*`: totalProductiveHours, fixedCostPerHour
  - `business.products.*`: skuPlaceholder, strategyLabels, components
  - `business.services.*`: codePlaceholder, fixedCost, price
  - Soporte: PT-BR, ES, EN

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

### Fixed
- **Error 500 en /api/service-sheets** - Columna `hours_per_day` no existe
  - Causa: Eager loading usaba columna antigua en lugar de `hours_per_week`
  - Solución: Actualizado ServiceSheetController con columnas correctas

- **TypeError margin_percentage.toFixed** - Valor llegaba como string
  - Solución: `parseFloat()` antes de operaciones numéricas

- **Frontend en directorio incorrecto** - Error 500 en raíz
  - Causa: Archivos en /frontend/ en vez de /frontend/dist/
  - Solución: Movidos archivos al directorio correcto

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


## [1.29.0] - 2025-12-14

### Added
- **Campañas Promocionales** - Sistema completo de gestión de ofertas y descuentos
  - **Presets Rápidos**: Black Friday, Cyber Monday, Navidad, Año Nuevo, Liquidación
  - **Tipos de Descuento**: Porcentaje, Valor Fijo, Precio Fijo
  - **Programación**: Fechas y horas de inicio/fin con estados automáticos
  - **Badges Visuales**: Texto, color y preview en tiempo real
  - **Selección de Productos**: Individual o aplicar a todos

- **Protección de Rentabilidad** - Sistema de 4 capas para evitar vender con pérdida
  - Capa 1: Precio nunca menor que CMV (costo)
  - Capa 2: Respeta precio mínimo del producto
  - Capa 3: Respeta precio mínimo de campaña
  - Capa 4: Garantiza margen mínimo sobre CMV
  - Preview con análisis de rentabilidad antes de crear campaña

- **Precificación Estratégica** en Fichas Técnicas
  - Precio del Competidor con comparación visual
  - Precio Mínimo/Máximo para control de rango
  - Multiplicador Premium (ajuste fino)
  - Estrategias: Agresivo (-5%), Neutro, Premium (+10%)
  - Margen Objetivo por producto (sobrescribe global)
  - Redondeo Psicológico (€26.04 → €25.99)

- **Soporte B2B/B2C** - Manejo diferenciado de IVA/VAT
  - **B2C**: Precios finales incluyen IVA (venta al consumidor)
  - **B2B**: Precios sin IVA (venta entre empresas)
  - Campo `vat_rate` separado de otros impuestos
  - Preview muestra: Markup Base × (1 + IVA) = Multiplicador Final
  - El IVA NO se deduce del margen, se añade al precio final

- **Documentación** - Guía completa del Módulo de Negocios
  - `docs/MODULO_NEGOCIOS.txt`: Manual detallado de funcionamiento
  - Casos de uso prácticos con ejemplos numéricos
  - Explicación técnica del sistema de protección

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

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


## [1.28.0] - 2025-12-14

### Added
- **Nueva Sección Business** - Módulo completo para cálculo de precios con Markup
  - **Configuraciones de Markup**: Define parámetros de cada unidad de negocio
    - Facturación mensual y gastos fijos
    - Costos variables: impuestos, comisiones, tasas de tarjeta
    - Tasa de inversión y margen de ganancia
    - Cálculo automático del factor de markup: `Markup = 1 / (1 - deductions)`
  
  - **Fichas Técnicas de Productos**: Gestión del CMV (Costo de Mercancía Vendida)
    - Componentes de costo: producto, embalaje, etiqueta, envío, manipulación, otros
    - Cálculo automático del CMV total y precio de venta sugerido
    - Margen de contribución calculado en tiempo real
    - Función duplicar para crear variantes rápidamente
  
  - **Calculadora de Precios**: Simulador interactivo
    - Ingresa un CMV y visualiza precio de venta instantáneamente
    - Desglose completo de la configuración seleccionada
    - Tabla de precios rápidos para productos existentes
    - Fórmula visible: `Precio de Venta = CMV × Markup`

  - **Multi-divisa**: Soporte completo para EUR, BRL, USD

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


## [1.27.6] - 2025-12-13

### Fixed
- **Divisa en Widgets Overdue/Upcoming** - Corregido campo `currency` faltante
  - Backend: Agregado campo `currency` directo en items de `upcomingTransactions` y `overdueTransactions`
  - Liability items ahora incluyen su moneda desde `liabilityAccount->currency`
  - Frontend: Usa `item.currency` como primera opción, fallback a `item.account?.currency`
  
- **Traducción i18n faltante** - Agregado `common.item` y `common.items` en ES, PT-BR, EN


## [1.27.5] - 2025-12-13

### Fixed
- **Dashboard Multi-Divisa Completo** - Corrigido Flujo de Caja para usar divisa dinâmica
  - CashflowChart agora recebe `primaryCurrency` como prop
  - Tooltips do gráfico mostram a divisa correta
  - Totais do período (receita, despesa, médias) usam `primary_currency`
  
- **Widgets Vencidos/Futuros** - Removidas divisas fixas (BRL/EUR)
  - UpcomingWidget: Footer mostra contagem de items em vez de totais monetários
  - OverdueWidget: Rangos mostram contagem, footer mostra média de dias


## [1.27.4] - 2025-12-13

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

### Changed
- **Dashboard Multi-Divisa** - Valores agrupados por moeda
  - Saldo total, receitas e despesas mostram valores separados por divisa
  - Backend agrupa transações por currency da conta
  - Suporte para múltiplas moedas simultaneamente (EUR, BRL, USD, etc.)

- **Sidebar Responsivo** - Estado inicial baseado no tamanho da tela
  - Mobile (< 1024px): Sidebar inicia colapsado
  - Desktop (≥ 1024px): Sidebar inicia expandido
  - Ajusta automaticamente ao redimensionar

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

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


## [1.27.3] - 2025-12-13

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

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

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


## [1.27.2] - 2025-12-13

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

### Fixed
- **Sintaxe icons.js** - Corrigida vírgula faltante após `bi-outlet` na categoria housing


## [1.27.1] - 2025-12-12

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


## [1.27.0] - 2025-12-12

### Added
- **Widget de Transações Vencidas** - Novo widget no Dashboard mostrando itens em atraso
  - Endpoint: `GET /api/dashboard/overdue` - Agrupa por urgência (crítico, alto, médio, baixo)
  - Inclui transações, parcelas recorrentes e passivos vencidos
  - Clique para navegar diretamente ao item
  - Código de cores por nível de urgência
  - Traduções em ES, PT-BR e EN

- **Modais de Confirmação Detalhados** - Melhorados todos os botões de ação na página /recurring
  - Modal de Pausar/Reanudar com advertências detalhadas
  - Modal de Excluir Template com avisos de irreversibilidade
  - Modal de Omitir Cuota (Skip) com explicação de consequências
  - Ícones visuais e informações do item afetado em todos os modais
  - Traduções completas em ES, PT-BR e EN

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


## [1.26.0] - 2025-12-11

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

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

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


## [1.23.8] - 2025-12-11

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


## [1.23.7] - 2025-06-20

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


## [1.25.0] - 2025-12-10

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

- **Calendário no Dashboard** - Widget interativo com visão mensal
  - Novo endpoint: `GET /api/dashboard/calendar` - Dados do mês
  - Novo endpoint: `GET /api/dashboard/calendar-day` - Transações de um dia
  - Novo componente: `CalendarWidget.jsx`
  - Mostra transações e recorrentes pendentes por dia
  - Indicadores visuais (azul=transação, laranja=recorrente)
  - Clique no dia mostra detalhes com ações (Pagar/Omitir)
  - Resumo mensal de pendentes

- **Widget Próximos 7 Dias** - Previsão de transações pendentes
  - Novo endpoint: `GET /api/dashboard/upcoming` - Transações dos próximos N dias
  - Novo componente: `UpcomingWidget.jsx`
  - Agrupa por dia com badges (Hoje, Amanhã, X dias)
  - Ícones coloridos por tipo (recorrente, transferência, débito, crédito)
  - Resumo de ingressos/gastos previstos (exclui transferências)

- **Menu Reorganizado com Grupos Colapsáveis**
  - Grupos: Movimentos (Transações, Recurrentes, Importar, Transferências) e Configuração (Categorias, Centros de Custo)
  - Estado persistente de expansão
  - Suporte a sidebar colapsado

- **Campo start_date no Modal de Recorrência**
  - Permite definir data inicial diferente da transação original

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

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

### Migrations
- `2025_12_10_100001_create_recurring_templates_table.php`
- `2025_12_10_100002_create_recurring_instances_table.php`
- Adicionado campo `recurring_instance_id` na tabela `transactions`


## [1.12.0] - 2025-12-09

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

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

- **UserSetupService** - Serviço para configuração de novos usuários
  - Cria categorias padrão automaticamente no registro
  - Cria centro de custo "Principal" automaticamente
  - 18 categorias principais com subcategorias e keywords

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

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


## [1.11.0] - 2025-12-08

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


## [1.10.1] - 2025-12-08

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


## [1.10.0] - 2025-12-08

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

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


## [1.9.1] - 2025-12-08

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


## [1.9.0] - 2025-12-08

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

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

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

### Backend Updates
- DuplicateTransactionController::index() refatorizado
  - Query principal usa GROUP BY em vez de INNER JOIN
  - GROUP_CONCAT(id ORDER BY id DESC) para ordenar por ID
  - Retorna array de todas as transações do grupo
  - Confiança sempre 100% (grupos = transações idênticas)
  - Calcula max_id para indicar qual será mantida
  
- Novo método: DuplicateTransactionController::autoDeleteDuplicates()
  - Busca grupos com HAVING count > 1
  - Para cada grupo, deleta tudo menos o ID máximo
  - UPDATE transactions SET deleted_at = NOW()
  - Retorna total de transações deletadas

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


## [1.8.1] - 2025-12-08

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


## [1.8.0] - 2025-12-08

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


## [1.7.4] - 2025-12-08

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


## [1.7.3] - 2025-12-08

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


## [1.7.2] - 2025-12-08

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


## [1.7.1] - 2025-12-08

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


## [1.7.0] - 2025-12-08

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


## [1.6.13] - 2025-12-08

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


## [1.6.12] - 2025-12-08

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


## [1.6.11] - 2025-12-08

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


## [1.6.10] - 2025-12-08

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


## [1.6.9] - 2025-12-08

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


## [1.6.8] - 2025-12-08

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


## [1.6.7] - 2025-12-08

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


## [1.6.6] - 2025-12-08

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

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


## [1.6.5] - 2025-12-08

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

### Removed
- Removido filtro de conta corrente desnecessário no modal de conciliação


## [1.6.4] - 2025-12-08

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


## [1.6.3] - 2025-12-08

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

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


## [1.6.2] - 2025-12-08

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


## [1.6.1] - 2025-12-08

### Added - Sistema de Conciliação de Parcelas

#### Backend (Laravel)

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

#### Frontend (React)

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

### Fixed
- ✅ Ordem das rotas no api.php (rotas específicas antes do apiResource)


## [1.6.0] - 2025-12-08

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

#### Backend (Laravel)

**Sistema de Transferências entre Contas**
- ✅ Novo endpoint: `POST /api/transactions/transfer`
- ✅ Cria automaticamente par de transações (débito origem + crédito destino)
- ✅ Campos `transfer_pair_id` e `is_transfer` na tabela transactions

**Efetivação Rápida de Transações**
- ✅ Novo endpoint: `POST /api/transactions/{id}/quick-complete`
- ✅ Efetiva transação pendente com um clique (usa valores planejados)

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

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

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

**Correções e Melhorias**
- ✅ Removido campo `balance_after` (saldo sempre calculado dinamicamente)
- ✅ Transações importadas sempre sem categoria (category_id = null)

#### Frontend (React)

**Página de Transações por Semana (TransactionsByWeek.jsx)**
- ✅ Botão "Transferência" na barra superior
- ✅ Modal de transferência entre contas
- ✅ Botão de efetivação rápida (⚡) para pendentes
- ✅ Botão de divisão para transações
- ✅ Modal de divisão com múltiplas categorias
- ✅ Validação em tempo real (soma = valor original)

**Nova Página: Importação de Transações (ImportTransactions.jsx)**
- ✅ Upload com drag & drop
- ✅ Wizard de 4 etapas: Upload → Configurar → Mapear → Resultado
- ✅ Preview dos dados do arquivo
- ✅ Mapeamento visual de colunas
- ✅ Salvamento de mapeamentos para reutilização
- ✅ Histórico de importações

**Nova Página: Contas Passivo (LiabilityAccounts.jsx)**
- ✅ Cards de resumo por moeda
- ✅ Importação de contratos via Excel
- ✅ Visualização de parcelas com status
- ✅ Barra de progresso de pagamento
- ✅ Taxas de juros calculadas

**Traduções**
- ✅ Novas chaves em pt-BR, en, es para todas as funcionalidades

### Technical Details
- Migration: 2025_12_08_170001_add_transfer_and_split_fields_to_transactions
- Migration: 2025_12_08_200001_create_liability_accounts_table
- Migration: 2025_12_08_200002_create_liability_installments_table
- Migration: 2025_12_09_100001_create_import_mappings_table
- Migration: 2025_12_09_150001_add_import_hash_to_transactions_table
- Migration: 2025_12_09_160001_remove_balance_after_from_transactions_table

---

## [1.5.0] - 2025-12-08

### Added - Sistema de Transações Completo

#### Backend (Laravel)
- ✅ **Nova migration: create_transactions_table**
  - `id`, `user_id`, `account_id`, `category_id`, `cost_center_id`
  - `amount` (valor efetivo), `planned_amount` (valor previsto)
  - `type` (credit/debit)
  - `description`, `notes`, `reference`
  - `effective_date` (data efetiva), `planned_date` (data planejada)
  - `status` (pending/completed/cancelled)
  - `is_recurring`, `recurring_parent_id` (preparado para recorrências)
  - SoftDeletes e índices otimizados

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

- ✅ **Novo controller: TransactionController.php**
  - CRUD completo com filtros avançados
  - Endpoints especiais: complete, cancel, revert, duplicate, summary
  - Filtros por: conta, categoria, centro de custo, tipo, status, período, busca

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

#### Frontend (React)
- ✅ **Nova página: Transactions.jsx**
  - Cards de resumo: Entradas, Saídas, Saldo, Pendentes
  - Indicador de transações atrasadas
  - Filtros avançados: conta, categoria, tipo, status, período, busca
  - Tabela com todas as transações
  - Badge de categoria com cor e ícone
  - Ações: editar, duplicar, completar, reverter, cancelar, excluir
  - Modal de criação/edição com todos os campos
  - Modal de detalhes completo
  - Modal de conclusão com valor efetivo e data

- ✅ **Novo service: transactionService**
  - Métodos: getAll, getById, create, update, delete
  - complete, cancel, revert, duplicate, getSummary

- ✅ **Traduções completas** (pt-BR, es, en)
  - Todos os labels, mensagens e placeholders
  - Tipos: Crédito/Débito
  - Status: Pendente/Concluída/Cancelada

- ✅ **Menu lateral atualizado**
  - Novo item "Transações" com ícone bi-arrow-left-right
  - Rota /transactions configurada


## [1.4.2] - 2025-12-08

### Added - Seeder de Categorias para Madrid

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

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

- ✅ **Categorias Mistas (both)**:
  - 🔄 Transferências (4): entre contas, Bizum, PayPal, Wise/Revolut


## [1.4.1] - 2025-12-08

### Added - Contas Passivo na Página de Contas

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


## [1.4.0] - 2025-12-08

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

#### Backend (Laravel)
- ✅ **Novas migrations**
  - `liability_accounts` - Tabela para contratos de passivo com todos os metadados
  - `liability_installments` - Tabela para parcelas individuais de cada contrato
  
- ✅ **Novos models**
  - `LiabilityAccount` - Model com relacionamentos, cálculos de taxas de juros e progresso
  - `LiabilityInstallment` - Model com status de parcela e método markAsPaid()
  
- ✅ **Novo controller (LiabilityAccountController)**
  - CRUD completo para contas passivo
  - Importação de arquivos Excel (.xlsx/.xls)
  - Parser inteligente de colunas (Pago, Fecha, Cuota, Intereses, Capital, Estado)
  - Cálculo automático de taxas extras (multas/atrasos)
  - Cálculo de taxas de juros (mensal, anual, total)
  - Resumo por moeda
  
- ✅ **Novas rotas API**
  - `GET/POST /api/liability-accounts` - Listar/Criar contratos
  - `GET/PUT/DELETE /api/liability-accounts/{id}` - Ver/Atualizar/Excluir contrato
  - `POST /api/liability-accounts/import` - Importar Excel
  - `GET /api/liability-accounts/{id}/installments` - Listar parcelas
  - `PUT /api/liability-accounts/{accountId}/installments/{installmentId}` - Atualizar parcela
  - `GET /api/liability-summary` - Resumo geral

- ✅ **Dependência adicionada**
  - `phpoffice/phpspreadsheet ^5.3` para leitura de Excel

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

- ✅ **Serviço API (api.js)**
  - `liabilityAccountService` com todos os métodos CRUD e importação

- ✅ **Navegação**
  - Item "Passivos" adicionado ao menu lateral
  - Rota `/liabilities`

- ✅ **Internacionalização (i18n)**
  - Traduções completas em pt-BR, es e en
  - Seção `liabilities` com todas as strings

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

---

## [1.3.14] - 2025-12-08

### Changed - Saldo Total por Moeda

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

---

## [1.3.13] - 2025-12-08

### Fixed - Tradução i18n faltando

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

---

## [1.3.12] - 2025-12-08

### Changed - Layout Desktop Compacto (25% menor)

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

#### Frontend (Layout.jsx)
- ✅ **Sidebar mais compacta**
  - Largura: 250px → 200px
  - Colapsada: 70px → 55px
  - Fonte do menu reduzida
  - Avatar do usuário menor (35px → 28px)

---

## [1.3.11] - 2025-12-08

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

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

---

## [1.3.10] - 2025-12-08

### Fixed - Posicionamento do Dropdown em CostCenters

#### Frontend (React)
- ✅ **Adicionado posicionamento absoluto ao dropdown**
  - `position: relative` no container do dropdown
  - `position: absolute`, `right: 0`, `top: 100%`, `zIndex: 1000` no menu
  - Dropdown agora aparece corretamente abaixo do botão

---

## [1.3.9] - 2025-12-08

### Fixed - Dropdown de Ações em CostCenters

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

---

## [1.3.8] - 2025-12-08

### Fixed - Import Bootstrap JS (não funcionou)

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

---

## [1.3.7] - 2025-12-08

### Added - Campo is_admin para Usuários

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

---

## [1.3.6] - 2025-12-08

### Added - Centro de Custo do Sistema

#### Backend (Laravel)
- ✅ **Campo `is_system` na tabela cost_centers**
  - Migration para adicionar coluna `is_system` (boolean, default false)
  - Atualizado modelo CostCenter com novo campo e scope `system()`
  
- ✅ **Auto-criação do centro de custo "Geral"**
  - Criado automaticamente quando usuário não tem nenhum centro de custo
  - Nome: "Geral", Código: "GERAL"
  - Para agrupar transações sem centro de custo definido
  
- ✅ **Proteção contra edição/exclusão**
  - Centros de custo com `is_system=true` não podem ser editados
  - Centros de custo com `is_system=true` não podem ser excluídos
  - Retorna erro 403 com mensagem apropriada

#### Frontend (React)
- ✅ **Indicação visual do centro de custo do sistema**
  - Ícone de cadeado (🔒) ao lado do nome
  - Dropdown de ações oculto para centros de custo do sistema
  
- ✅ **Traduções adicionadas (i18n)**
  - `costCenters.systemCostCenter` em pt-BR, en, es

---

## [1.3.5] - 2025-12-08

### Fixed - Sistema de Traduções i18n

#### Frontend (React)
- ✅ **Revisão completa do sistema de traduções**
  - Accounts.jsx: Todos os textos hardcoded substituídos por `t('...')`
  - Categories.jsx: Todos os textos hardcoded substituídos por `t('...')`
  - CostCenters.jsx: Todos os textos hardcoded substituídos por `t('...')`
  - Dashboard.jsx: Todos os textos hardcoded substituídos por `t('...')`
  
- ✅ **Elementos traduzidos:**
  - Headers, botões, labels de formulários
  - Mensagens de erro e sucesso (toast)
  - Placeholders, tooltips, badges de status
  - Modais de confirmação de exclusão
  - Contadores e filtros

- ✅ **Arquivos de tradução verificados:**
  - pt-BR.json: Completo
  - en.json: Completo
  - es.json: Completo

---

## [1.3.4] - 2025-12-08

### Fixed - Fundo Branco em Tabelas

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

---

## [1.3.3] - 2025-12-08

### Changed - IconSelector Modal

#### Frontend (React)
- ✅ **IconSelector refatorado** - Mudança de dropdown para modal
  - Modal grande com grid visual de ícones
  - Experiência de seleção muito melhorada
  - Campo de busca com ícone
  - Filtros por categoria em botões
  - Ícone selecionado destacado com borda azul
  - Fechamento ao clicar fora do modal
  - Footer com contagem de ícones e botão cancelar

- ✅ **Correção de tabelas com tema dark**
  - Hover das linhas com fundo azul translúcido
  - Variáveis CSS do Bootstrap redefinidas

---

## [1.3.2] - 2025-12-08

### Added - Seletor Visual de Ícones

#### Frontend (React)
- ✅ **IconSelector** - Componente visual para seleção de ícones
  - Grid visual com mais de 200 ícones organizados por categoria
  - Busca por nome de ícone
  - Filtro por categoria (money, bank, card, food, shopping, etc.)
  - Suporte para 3 tipos: account, category, costCenter
  - Visual consistente com tema dark

- ✅ **Biblioteca de Ícones Expandida** (`icons.js`)
  - **Contas**: 50+ ícones (wallets, banks, cards, currencies, investments)
  - **Categorias**: 150+ ícones (food, shopping, housing, transport, health, education, leisure, travel, work, utilities, etc.)
  - **Centros de Custo**: 40+ ícones (buildings, projects, departments)
  - Organização por subcategorias para facilitar busca

- ✅ **Correções de Tema Dark**
  - Correção de fundos brancos em autocomplete de formulários
  - Correção de fundos em checkboxes e radio buttons
  - Correção de color picker com tema dark
  - Correção de modals, dropdowns, alerts, badges

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

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

---

## [1.3.1] - 2025-12-08

### Added - Suporte Multi-idioma e Multi-divisa

#### Frontend (React)
- ✅ **Internacionalização (i18n)** com react-i18next
  - 3 idiomas: Español (es), English (en), Português (pt-BR)
  - Arquivos de tradução completos em `src/i18n/locales/`
  - Detecção automática do idioma do navegador
  - Persistência da preferência no localStorage

- ✅ **Sistema Multi-divisa**
  - 15 moedas suportadas: BRL, USD, EUR, GBP, JPY, CNY, ARS, CLP, COP, MXN, PEN, UYU, CHF, CAD, AUD
  - Formatação automática por locale
  - Componente `CurrencySelector` para seleção
  - Componente `CurrencyDisplay` para exibição formatada

- ✅ **Novos Componentes**
  - `LanguageSelector.jsx` - Seletor de idioma com bandeiras
  - `CurrencySelector.jsx` - Seletor de moeda
  - `useFormatters.js` - Hook para formatação de valores e datas

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

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

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

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

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

### Dependencies Added
- `i18next: ^24.x`
- `react-i18next: ^15.x`
- `i18next-browser-languagedetector: ^8.x`

### Deployed
- ✅ Frontend atualizado em https://webmoney.cnxifly.com

---

## [1.3.0] - 2025-12-08

### Added - Fase 1: Gerenciadores Base

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

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

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

#### Frontend (React)
- ✅ **Layout com Sidebar** - Navegação lateral moderna
  - Componente `Layout.jsx` reutilizável
  - Menu colapsável responsivo
  - Ícones Bootstrap Icons
  - Tema escuro integrado

- ✅ **Componentes Reutilizáveis**
  - `Modal.jsx` - Modal Bootstrap para formulários (sem uso de alert())
  - `Toast.jsx` - Sistema de notificações com ToastProvider

- ✅ **Página de Contas** (`Accounts.jsx`)
  - Listagem com cards coloridos
  - Formulário completo com todos os campos
  - CRUD completo via modal
  - Formatação de valores em BRL

- ✅ **Página de Centros de Custo** (`CostCenters.jsx`)
  - Listagem com badges de keywords
  - Formulário com gerenciamento de keywords
  - CRUD completo via modal

- ✅ **Página de Categorias** (`Categories.jsx`)
  - Listagem hierárquica (pai > subcategoria)
  - Formulário com seleção de categoria pai
  - Gerenciamento de keywords por categoria
  - CRUD completo via modal

- ✅ **Dashboard Atualizado** (`Dashboard.jsx`)
  - Cards de resumo (Contas, Categorias, Centros de Custo)
  - Links de acesso rápido
  - Design moderno com tema escuro

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

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

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

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

### Deployed
- ✅ Backend atualizado em https://webmoney.cnxifly.com/api
- ✅ Frontend atualizado em https://webmoney.cnxifly.com
- ✅ Todas as APIs testadas e funcionando

---

## [1.2.2] - 2025-12-07

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

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

### Deployed
- ✅ https://cnxifly.com - Página em construção
- ✅ https://www.cnxifly.com - Redirecionamento para cnxifly.com


## [1.2.1] - 2025-12-07

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

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

### Deployed
- ✅ Frontend atualizado em https://webmoney.cnxifly.com


## [1.2.0] - 2025-12-07

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

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

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

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

## [1.1.5] - 2025-12-07

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

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

### Fixed
- Erro de dependências ausentes (MariaDB) para phpMyAdmin

## [1.1.4] - 2025-12-07

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

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

### Fixed
- ❌ ERR_CERT_COMMON_NAME_INVALID em `webmail.cnxifly.com` → ✅ Certificado SSL válido
- Let's Encrypt agora inclui 6 domínios: cnxifly.com, www, webmoney, mail, webmail, ftp

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

---

## [1.1.3] - 2025-12-07

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

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

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

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

---

## [1.1.2] - 2025-12-07

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

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

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

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

---

## [1.0.5] - 2025-12-07

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

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

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

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

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

---

## [1.0.4] - 2025-12-07

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

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

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

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

---

## [1.0.3] - 2025-12-07

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

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

---

## [1.0.2] - 2025-12-07

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

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

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

---

## [1.0.1] - 2025-12-07

## [1.1.2] - 2025-12-07

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

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

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


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

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

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

---

## [1.0.0] - 2025-12-07

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

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

### Status do Servidor v1.0.0
- [x] Conectividade verificada
- [x] DNS funcional (systemd-resolved)
- [x] Serviço SSH ativo
- [x] Firewall apropriadamente configurado
- [x] Sem serviços adicionais instalados (pronto para configuração)

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

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

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

---

## Notas Importantes

### Directives de Desenvolvimento
Este projeto segue as DIRETRIZES_DESENVOLVIMENTO estabelecidas em v1.0.0:
- Controle de versão incremental para CADA commit/push
- Validação de mudanças através do domínio (cnxifly.com)
- Nenhum arquivo pendente pode ser editado sem commit prévio
- Documentação obrigatória em CHANGELOG.md

### Próximas Ações Recomendadas (v1.1.0+)
- [ ] Configurar DNSSEC para o domínio
- [ ] Implementar DKIM para emails
- [ ] Revisar e atualizar SPF (softfail → hard fail)
- [ ] Instalar certificados SSL/TLS
- [ ] Configurar servidor web (nginx/Apache)
- [ ] Implementar monitoramento DNS
- [ ] Autenticação SSH via chaves públicas
- [ ] Configurar HTTPS em subdomínios
- [ ] Implementar backup de zona DNS

---

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