feat: Implement Phase 1 & 2 - Full monorepo architecture

## Backend API (apps/api)
- Express.js server with TypeScript
- JWT authentication with access/refresh tokens
- Multi-tenant middleware (schema per tenant)
- Complete CRUD routes: auth, cfdis, transactions, contacts, categories, metrics, alerts
- SAT integration: CFDI 4.0 XML parser, FIEL authentication
- Metrics engine: 50+ financial metrics (Core, Startup, Enterprise)
- Rate limiting, CORS, Helmet security

## Frontend Web (apps/web)
- Next.js 14 with App Router
- Authentication pages: login, register, forgot-password
- Dashboard layout with Sidebar and Header
- Dashboard pages: overview, cash-flow, revenue, expenses, metrics
- Zustand stores for auth and UI state
- Theme support with flash prevention

## Database Package (packages/database)
- PostgreSQL migrations with multi-tenant architecture
- Public schema: plans, tenants, users, sessions, subscriptions
- Tenant schema: sat_credentials, cfdis, transactions, contacts, accounts, alerts
- Tenant management functions
- Seed data for plans and super admin

## Shared Package (packages/shared)
- TypeScript types: auth, tenant, financial, metrics, reports
- Zod validation schemas for all entities
- Utility functions for formatting

## UI Package (packages/ui)
- Chart components: LineChart, BarChart, AreaChart, PieChart
- Data components: DataTable, MetricCard, KPICard, AlertBadge
- PeriodSelector and Skeleton components

## Infrastructure
- Docker Compose: PostgreSQL 15, Redis 7, MinIO, Mailhog
- Makefile with 25+ development commands
- Development scripts: dev-setup.sh, dev-down.sh
- Complete .env.example template

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-31 11:05:24 +00:00
parent c1321c3f0c
commit a9b1994c48
110 changed files with 40788 additions and 0 deletions

82
docker/minio/init.sh Normal file
View File

@@ -0,0 +1,82 @@
#!/bin/sh
# =============================================================================
# Horux Strategy - Script de Inicializacion MinIO
# =============================================================================
# Este script crea los buckets necesarios para el almacenamiento de archivos
# en MinIO (compatible con S3).
#
# Buckets creados:
# - horux-reports: Reportes financieros generados (PDF, Excel)
# - horux-attachments: Adjuntos de documentos (facturas, comprobantes)
# - horux-exports: Exportaciones de datos (CSV, JSON)
# =============================================================================
set -e
echo "============================================="
echo "Horux Strategy - Inicializando MinIO"
echo "============================================="
# Esperar a que MinIO este completamente listo
echo "[1/5] Esperando a que MinIO este listo..."
sleep 5
# Configurar el cliente mc para conectarse a MinIO
echo "[2/5] Configurando cliente MinIO..."
mc alias set horux http://minio:9000 "${MINIO_ROOT_USER}" "${MINIO_ROOT_PASSWORD}"
# Verificar conexion
echo "[3/5] Verificando conexion..."
mc admin info horux
# Crear buckets
echo "[4/5] Creando buckets..."
# Bucket para reportes financieros
# Almacena: PDFs de estados financieros, reportes de KPIs, dashboards exportados
if ! mc ls horux/horux-reports > /dev/null 2>&1; then
mc mb horux/horux-reports
echo " - Bucket 'horux-reports' creado"
else
echo " - Bucket 'horux-reports' ya existe"
fi
# Bucket para adjuntos de documentos
# Almacena: Facturas escaneadas, XMLs del SAT, comprobantes bancarios
if ! mc ls horux/horux-attachments > /dev/null 2>&1; then
mc mb horux/horux-attachments
echo " - Bucket 'horux-attachments' creado"
else
echo " - Bucket 'horux-attachments' ya existe"
fi
# Bucket para exportaciones de datos
# Almacena: Exports de datos en CSV/JSON, backups de configuracion
if ! mc ls horux/horux-exports > /dev/null 2>&1; then
mc mb horux/horux-exports
echo " - Bucket 'horux-exports' creado"
else
echo " - Bucket 'horux-exports' ya existe"
fi
# Configurar politicas de acceso (opcional)
echo "[5/5] Configurando politicas de acceso..."
# Politica de retencion para reportes (30 dias minimo)
# mc ilm add horux/horux-reports --expire-days 365
# Los attachments pueden ser de solo lectura para usuarios
# mc anonymous set download horux/horux-attachments
echo "============================================="
echo "MinIO inicializado correctamente!"
echo "============================================="
echo "Buckets disponibles:"
mc ls horux
echo "============================================="
echo ""
echo "Acceso a la consola web:"
echo " URL: http://localhost:9001"
echo " Usuario: ${MINIO_ROOT_USER}"
echo " Password: ${MINIO_ROOT_PASSWORD}"
echo "============================================="

170
docker/postgres/init.sql Normal file
View File

@@ -0,0 +1,170 @@
-- =============================================================================
-- Horux Strategy - Script de Inicializacion PostgreSQL
-- =============================================================================
-- Este script se ejecuta automaticamente cuando el contenedor de PostgreSQL
-- se inicia por primera vez.
--
-- Crea:
-- - Base de datos horux_strategy
-- - Usuario de aplicacion con permisos limitados
-- - Extensiones necesarias
-- - Esquemas base
-- =============================================================================
-- Crear base de datos si no existe (la variable POSTGRES_DB ya la crea)
-- Este bloque es por si se necesita una base de datos adicional
-- CREATE DATABASE horux_strategy_test;
-- =============================================================================
-- Extensiones necesarias
-- =============================================================================
-- UUID: Generacion de identificadores unicos universales
-- Usado para IDs de entidades (usuarios, empresas, transacciones, etc.)
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
-- pgcrypto: Funciones criptograficas
-- Usado para hash de passwords, generacion de tokens seguros
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
-- pg_trgm: Busqueda por trigramas
-- Mejora las busquedas de texto parcial (LIKE, ILIKE)
CREATE EXTENSION IF NOT EXISTS "pg_trgm";
-- btree_gin: Indices GIN para tipos de datos adicionales
-- Mejora consultas con multiples condiciones en indices compuestos
CREATE EXTENSION IF NOT EXISTS "btree_gin";
-- =============================================================================
-- Usuario de aplicacion
-- =============================================================================
-- Creamos un usuario con permisos limitados para la aplicacion
-- Esto sigue el principio de menor privilegio
DO $$
BEGIN
-- Crear usuario de aplicacion si no existe
IF NOT EXISTS (SELECT FROM pg_catalog.pg_roles WHERE rolname = 'horux_app') THEN
CREATE USER horux_app WITH PASSWORD 'horux_app_secret';
END IF;
END
$$;
-- Permisos en la base de datos
GRANT CONNECT ON DATABASE horux_strategy TO horux_app;
-- Permisos en el esquema public
GRANT USAGE ON SCHEMA public TO horux_app;
GRANT CREATE ON SCHEMA public TO horux_app;
-- Permisos por defecto para tablas futuras
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO horux_app;
-- Permisos por defecto para secuencias futuras
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT USAGE, SELECT ON SEQUENCES TO horux_app;
-- =============================================================================
-- Esquemas adicionales (opcional)
-- =============================================================================
-- Esquema para datos de auditoria
CREATE SCHEMA IF NOT EXISTS audit;
GRANT USAGE ON SCHEMA audit TO horux_app;
GRANT CREATE ON SCHEMA audit TO horux_app;
ALTER DEFAULT PRIVILEGES IN SCHEMA audit
GRANT SELECT, INSERT ON TABLES TO horux_app;
-- Esquema para reportes y vistas materializadas
CREATE SCHEMA IF NOT EXISTS reports;
GRANT USAGE ON SCHEMA reports TO horux_app;
ALTER DEFAULT PRIVILEGES IN SCHEMA reports
GRANT SELECT ON TABLES TO horux_app;
-- =============================================================================
-- Funciones de utilidad
-- =============================================================================
-- Funcion para generar UUIDs v4
CREATE OR REPLACE FUNCTION generate_uuid()
RETURNS UUID AS $$
BEGIN
RETURN uuid_generate_v4();
END;
$$ LANGUAGE plpgsql;
-- Funcion para actualizar timestamps automaticamente
CREATE OR REPLACE FUNCTION update_updated_at_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- Funcion para registrar cambios en auditoria
CREATE OR REPLACE FUNCTION audit.log_changes()
RETURNS TRIGGER AS $$
DECLARE
audit_table_name TEXT;
BEGIN
audit_table_name := TG_TABLE_SCHEMA || '.' || TG_TABLE_NAME || '_audit';
IF TG_OP = 'DELETE' THEN
EXECUTE format(
'INSERT INTO audit.changes_log (table_name, operation, old_data, changed_at) VALUES ($1, $2, $3, CURRENT_TIMESTAMP)'
) USING TG_TABLE_NAME, TG_OP, row_to_json(OLD);
RETURN OLD;
ELSIF TG_OP = 'UPDATE' THEN
EXECUTE format(
'INSERT INTO audit.changes_log (table_name, operation, old_data, new_data, changed_at) VALUES ($1, $2, $3, $4, CURRENT_TIMESTAMP)'
) USING TG_TABLE_NAME, TG_OP, row_to_json(OLD), row_to_json(NEW);
RETURN NEW;
ELSIF TG_OP = 'INSERT' THEN
EXECUTE format(
'INSERT INTO audit.changes_log (table_name, operation, new_data, changed_at) VALUES ($1, $2, $3, CURRENT_TIMESTAMP)'
) USING TG_TABLE_NAME, TG_OP, row_to_json(NEW);
RETURN NEW;
END IF;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
-- Tabla para log de cambios de auditoria
CREATE TABLE IF NOT EXISTS audit.changes_log (
id BIGSERIAL PRIMARY KEY,
table_name VARCHAR(100) NOT NULL,
operation VARCHAR(10) NOT NULL,
old_data JSONB,
new_data JSONB,
changed_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
changed_by UUID -- Se puede llenar con el usuario de la sesion
);
-- Indice para busquedas rapidas por tabla y fecha
CREATE INDEX IF NOT EXISTS idx_audit_changes_table_date
ON audit.changes_log (table_name, changed_at DESC);
-- =============================================================================
-- Mensaje de confirmacion
-- =============================================================================
DO $$
BEGIN
RAISE NOTICE '===========================================';
RAISE NOTICE 'Horux Strategy - Base de datos inicializada';
RAISE NOTICE '===========================================';
RAISE NOTICE 'Extensiones instaladas:';
RAISE NOTICE ' - uuid-ossp';
RAISE NOTICE ' - pgcrypto';
RAISE NOTICE ' - pg_trgm';
RAISE NOTICE ' - btree_gin';
RAISE NOTICE 'Usuarios creados:';
RAISE NOTICE ' - horux_app (usuario de aplicacion)';
RAISE NOTICE 'Esquemas creados:';
RAISE NOTICE ' - public (tablas principales)';
RAISE NOTICE ' - audit (auditoria de cambios)';
RAISE NOTICE ' - reports (reportes y vistas)';
RAISE NOTICE '===========================================';
END
$$;