docs: add project README with architecture, setup and API reference

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
luklpz 2026-05-17 20:14:58 +02:00
parent 7eb17a8da2
commit 1193c2d888
1 changed files with 211 additions and 0 deletions

211
README.md Normal file
View File

@ -0,0 +1,211 @@
# TFG — Integración Dolibarr · PrestaShop
Sistema de sincronización bidireccional entre el ERP **Dolibarr** y la tienda **PrestaShop**, desarrollado como Trabajo de Fin de Grado del ciclo DAM.
---
## Arquitectura
```
┌─────────────────────────────────────────────┐
│ APPS CLIENTE │
│ JavaFX (escritorio) · Android (móvil) │
└──────────────────┬──────────────────────────┘
│ REST + Basic Auth
┌──────────────────▼──────────────────────────┐
│ SYNC-SERVICE │
│ Spring Boot 3 · Java 21 · Railway │
│ API REST propia · @Scheduled sync jobs │
│ H2 (dev) · MySQL (prod) │
└────────────┬──────────────────┬─────────────┘
│ │
┌────────▼──────┐ ┌────────▼──────────┐
│ DOLIBARR │ │ PRESTASHOP │
│ ERP · REST │ │ E-commerce · WS │
└───────────────┘ └───────────────────┘
```
**Flujos de sincronización:**
- `PRODUCT_PUSH` — Productos Dolibarr → PrestaShop (incremental por fecha)
- `STOCK_PUSH` — Stock Dolibarr → PrestaShop
- `ORDER_PULL` — Pedidos PrestaShop → Dolibarr (como comandas y facturas)
---
## Módulos
| Directorio | Descripción |
|---|---|
| `sync-service/` | Backend Spring Boot. API REST + jobs de sincronización |
| `javafx-client/` | Cliente escritorio JavaFX 21 |
| `android-app/` | Cliente Android (Kotlin) |
---
## Requisitos previos
- **JDK 21** — [Adoptium Temurin 21](https://adoptium.net/)
- **Maven 3.8+** — [maven.apache.org](https://maven.apache.org/download.cgi)
- **Android Studio** (solo para la app Android)
---
## sync-service — Arrancar en local (perfil dev)
### 1. Crear `application-dev.yml`
```bash
cp sync-service/src/main/resources/application-dev.yml.example \
sync-service/src/main/resources/application-dev.yml
```
Edita el fichero y rellena las claves reales:
```yaml
integration:
dolibarr:
api-key: TU_DOLIBARR_API_KEY
prestashop:
api-key: TU_PRESTASHOP_API_KEY
```
> `application-dev.yml` está en `.gitignore` — nunca se sube al repositorio.
### 2. Arrancar
```bash
cd sync-service
./mvnw spring-boot:run -Dspring-boot.run.profiles=dev
```
El servidor arranca en `http://localhost:8080`.
Consola H2 disponible en `http://localhost:8080/h2-console`.
### 3. Autenticación
Todas las peticiones requieren **Basic Auth**:
- Usuario: `admin`
- Contraseña: `admin123` (configurable en `api.security.password`)
---
## sync-service — API REST
### Sincronización manual
| Método | Endpoint | Descripción |
|---|---|---|
| `POST` | `/api/sync/products` | Empuja productos Dolibarr → PrestaShop |
| `POST` | `/api/sync/stock` | Empuja stock Dolibarr → PrestaShop |
| `POST` | `/api/sync/orders` | Importa pedidos PrestaShop → Dolibarr |
| `GET` | `/api/sync/diagnostics/dolibarr` | Verifica conectividad con Dolibarr |
### Mappings
| Método | Endpoint | Descripción |
|---|---|---|
| `GET` | `/api/mappings/products` | Lista mapeos de productos |
| `GET` | `/api/mappings/products?status=SYNCED` | Filtra por estado (`SYNCED`/`PENDING`/`ERROR`) |
| `GET` | `/api/mappings/orders` | Lista mapeos de pedidos |
### Logs
| Método | Endpoint | Descripción |
|---|---|---|
| `GET` | `/api/logs` | Lista todos los logs de sincronización |
| `GET` | `/api/logs?type=PRODUCT_PUSH` | Filtra por tipo |
| `GET` | `/api/logs/{id}` | Detalle de un log concreto |
### Health
| Método | Endpoint |
|---|---|
| `GET` | `/actuator/health` |
### Swagger UI
```
http://localhost:8080/swagger-ui.html
```
---
## sync-service — Despliegue en Railway
URL pública: `https://proyectointermodular-production-a9c3.up.railway.app`
Swagger UI: `https://proyectointermodular-production-a9c3.up.railway.app/swagger-ui.html`
**Variables de entorno requeridas en el servicio Railway:**
```
SPRING_PROFILES_ACTIVE=prod
SPRING_DATASOURCE_URL=jdbc:mysql://mysql.railway.internal:3306/railway?useSSL=false&serverTimezone=UTC&characterEncoding=UTF-8&allowPublicKeyRetrieval=true
SPRING_DATASOURCE_USERNAME=root
SPRING_DATASOURCE_PASSWORD=<MYSQLPASSWORD del plugin MySQL>
SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.MySQLDialect
SPRING_JPA_HIBERNATE_DDL_AUTO=validate
SYNC_SCHEDULING_ENABLED=true
DOLIBARR_API_KEY=<clave API Dolibarr>
PRESTASHOP_API_KEY=<clave WS PrestaShop>
API_SECURITY_PASSWORD={noop}admin123
```
Flyway ejecuta `V1__init.sql` en el primer arranque y crea las tablas automáticamente.
---
## javafx-client — Arrancar
### Requisitos
- JDK 21
- Maven 3.8+ (JavaFX se descarga automáticamente de Maven Central)
### Ejecutar
```bash
cd javafx-client
mvn javafx:run
```
La primera ejecución descarga dependencias (~1-2 min). Las siguientes arrancan directamente.
### Configuración
La URL del servidor, usuario y contraseña se guardan automáticamente al hacer login y se pueden cambiar desde la pestaña **Ajustes** de la aplicación. Por defecto apunta al servidor Railway.
---
## android-app — Arrancar
Abrir el directorio `android-app/` con Android Studio y ejecutar en emulador o dispositivo físico.
---
## Stack tecnológico
| Componente | Tecnología |
|---|---|
| Backend | Java 21 · Spring Boot 3 · Maven |
| Persistencia | Spring Data JPA · H2 (dev) · MySQL (prod) |
| Migraciones | Flyway |
| Cliente HTTP | `RestClient` (Spring 6) |
| Serialización | Jackson |
| Seguridad | Spring Security · Basic Auth · `DelegatingPasswordEncoder` |
| Scheduling | `@Scheduled` · `ThreadPoolTaskScheduler(poolSize=1)` |
| Docs API | SpringDoc OpenAPI (Swagger UI) |
| Cliente escritorio | JavaFX 21 |
| Cliente móvil | Kotlin · Android |
| Despliegue | Railway · GitHub Actions (push automático) |
---
## Sistemas externos
| Sistema | URL base |
|---|---|
| Dolibarr API | `https://prestashop.loading.net/dolibarr/api/index.php` |
| PrestaShop WS | `https://prestashop.loading.net/tienda/api` |
> **Nota PrestaShop 8.2.5:** el endpoint raíz `/api/` devuelve 500. Usar siempre recursos específicos (`/api/products`, `/api/orders`, etc.). La clave WS se pasa como query param `ws_key` — el hosting elimina el header `Authorization`.