Plataforma de conversión y mercado de cambio de divisas para economías con múltiples tipos de cambio (Bolivia).
Nuevas funcionalidades: Chat entre usuarios, sistema de reserva de montos, diseño mejorado con glassmorphism y animaciones suaves.
- PHP 8.2+ con extensiones:
pdo,pdo_mysql(opdo_sqlite),mbstring,openssl - Composer 2.x
- MySQL 8.0+ o SQLite (para desarrollo)
- Node.js (opcional, solo si usas Vite/npm)
# Clonar el repositorio
git clone https://github.com/yedrick/dolarApp.git
cd dolarapp
# Instalar dependencias PHP
composer install# Copiar archivo de entorno
cp .env.example .env
# Generar clave de aplicación
php artisan key:generateEditar .env con tu configuración de base de datos:
# Para MySQL (recomendado en producción):
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=dolarapp
DB_USERNAME=tu_usuario
DB_PASSWORD=tu_password
# Para SQLite (desarrollo rápido):
# DB_CONNECTION=sqlite
# DB_DATABASE=/ruta/absoluta/al/proyecto/database/database.sqlite# Crear la base de datos en MySQL:
mysql -u root -p -e "CREATE DATABASE dolarapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
# Para SQLite (alternativa):
touch database/database.sqlite
# Ejecutar migraciones
php artisan migrate
# Sembrar datos iniciales (tipos de cambio)
php artisan db:seedphp artisan serveVisita: http://localhost:8000
app/
├── Domain/ ← Núcleo de negocio (sin dependencias externas)
│ ├── ExchangeRate/
│ │ ├── Entities/ ExchangeRate (lógica de conversión)
│ │ ├── ValueObjects/ Money, ExchangeRateType
│ │ └── Repositories/ Interfaz (contrato — DIP)
│ ├── Offer/
│ │ ├── Entities/ Offer (Aggregate Root)
│ │ ├── ValueObjects/ OfferType, OfferStatus
│ │ ├── Events/ OfferPublished
│ │ └── Repositories/ Interfaz (contrato)
│ └── Message/
│ ├── Entities/ Conversation, Message
│ └── Repositories/ Interfaz (contrato)
│
├── Application/ ← Casos de uso y orquestación
│ ├── ExchangeRate/UseCases/ GetExchangeRates, ConvertCurrency
│ ├── Offer/UseCases/ CreateOffer, ListOffers
│ └── Message/UseCases/ SendMessage, GetConversations, GetMessages
│
├── Infrastructure/ ← Implementaciones concretas
│ ├── Repositories/ Eloquent (implementa interfaces de dominio)
│ ├── Models/ Modelos Eloquent (solo persistencia)
│ └── Http/Controllers/ Api/ y Web/ (controllers delgados)
│
└── Shared/Exceptions/ Excepciones de dominio
| Método | Ruta | Descripción |
|---|---|---|
GET |
/api/v1/exchange-rates |
Listar tipos de cambio |
POST |
/api/v1/exchange-rates/convert |
Convertir moneda |
GET |
/api/v1/offers |
Ofertas activas |
POST |
/api/v1/register |
Registrar usuario |
POST |
/api/v1/login |
Iniciar sesión (obtener token) |
| Método | Ruta | Descripción |
|---|---|---|
POST |
/api/v1/offers |
Publicar oferta |
GET |
/api/v1/offers/my |
Mis ofertas |
DELETE |
/api/v1/offers/{id} |
Cerrar oferta |
POST |
/api/v1/logout |
Cerrar sesión |
GET |
/api/v1/chat/conversations |
Listar mis conversaciones |
POST |
/api/v1/chat/start |
Iniciar conversación |
GET |
/api/v1/chat/{id}/messages |
Obtener mensajes |
POST |
/api/v1/chat/{id}/messages |
Enviar mensaje |
# Obtener tipos de cambio
curl http://localhost:8000/api/v1/exchange-rates
# Convertir moneda
curl -X POST http://localhost:8000/api/v1/exchange-rates/convert \
-H "Content-Type: application/json" \
-d '{"amount": 690, "from": "BOB", "rate_type": "paralelo"}'
# Registrarse
curl -X POST http://localhost:8000/api/v1/register \
-H "Content-Type: application/json" \
-d '{"name":"Juan","email":"juan@test.com","password":"Pass1234!","password_confirmation":"Pass1234!"}'
# Publicar oferta (con token)
curl -X POST http://localhost:8000/api/v1/offers \
-H "Authorization: Bearer TU_TOKEN" \
-H "Content-Type: application/json" \
-d '{"type":"venta","price":6.97,"amount":500,"contact_info":"77001122"}'| Ruta | Descripción |
|---|---|
/ |
Inicio con hero, conversor y últimas ofertas |
/offers |
Mercado de ofertas (público) |
/exchange-rates |
Tipos de cambio y conversor completo |
/login |
Iniciar sesión |
/register |
Crear cuenta |
/dashboard |
Panel personal (requiere auth) |
/offers/create |
Publicar nueva oferta (requiere auth) |
/profile |
Perfil y configuración (requiere auth) |
/chat |
Mis conversaciones (requiere auth) |
/chat/{id} |
Ver conversación (requiere auth) |
# Todas las pruebas (89 tests)
php artisan test
# Por suite
php artisan test --testsuite=Unit # Pruebas unitarias (dominio y casos de uso)
php artisan test --testsuite=Feature # Integración API + Web
php artisan test --testsuite=Web # Solo vistas Blade
php artisan test --testsuite=Acceptance # Flujos de negocio completos
# Con cobertura (requiere Xdebug o PCOV)
php artisan test --coverage --min=70| Suite | Tests | Qué valida |
|---|---|---|
| Unit/Domain | 28 | Money, ExchangeRateType, conversiones, creación de Offer, eventos |
| Unit/Application | 9 | Use Cases con repositorios mockeados |
| Feature/Api | 10 | Flujo completo API REST con BD en memoria |
| Feature/Web | 22 | Vistas Blade, autenticación sesión, formularios |
| Acceptance | 5 | Escenarios de negocio narrados (Carlos publica, María visualiza) |
# Expirar ofertas con más de 72 horas (ejecutar en cron diario)
php artisan offers:expire
# Actualizar tipos de cambio desde API externa (DolarApi)
php artisan rates:seed --api
# Actualizar tipos de cambio de forma interactiva
php artisan rates:seed --interactive
# Seed de datos de prueba (usuarios, ofertas, tipos de cambio)
php artisan db:seedEl archivo .github/workflows/ci-cd.yml implementa:
Commit → composer install → Pint (lint) → PHPStan →
Unit Tests → Integration Tests → Web Tests → Acceptance Tests →
Deploy automático (solo en rama main)
| Principio | Ejemplo en el código |
|---|---|
| SRP | ExchangeRate solo calcula conversiones; EloquentExchangeRateRepository solo persiste |
| OCP | Nuevos tipos de cambio sin modificar ExchangeRateType (agregar constante) |
| LSP | EloquentOfferRepository es intercambiable con cualquier otra implementación |
| ISP | OfferRepositoryInterface solo define métodos necesarios para ofertas |
| DIP | Domain depende de interfaces; Infrastructure las implementa |
| Característica | Implementación |
|---|---|
| Funcionalidad | Casos de uso con validaciones de dominio |
| Fiabilidad | 89 pruebas en 3 niveles con BD en memoria |
| Usabilidad | API REST con mensajes en español, vistas Blade responsive |
| Seguridad | Sanctum tokens, Form Requests, CSRF, sesión cifrada |
| Mantenibilidad | DDD, SOLID, separación estricta de capas |
| Portabilidad | SQLite/MySQL/PostgreSQL configurables en .env |
- Laravel 11 — Framework PHP
- Laravel Sanctum — Autenticación API con tokens Bearer
- PHPUnit 11 — Pruebas unitarias, integración y aceptación
- Laravel Pint — Formateo de código (PSR-12)
- PHPStan — Análisis estático nivel 5
- GitHub Actions — CI/CD automatizado
- DM Sans + DM Mono — Tipografía del frontend
- CSS3 — Glassmorphism, animaciones, gradientes
- JavaScript Vanilla — Interacciones del modal y navbar scroll
- DolarApi — API externa para tipos de cambio actualizados
Desarrollado para facilitar el cambio de divisas en Bolivia