diff --git a/Livrables/Rapport-ERP-Rayhan-Ali-Guennari.docx b/Livrables/Rapport-ERP-Rayhan-Ali-Guennari.docx new file mode 100644 index 0000000..908ed17 Binary files /dev/null and b/Livrables/Rapport-ERP-Rayhan-Ali-Guennari.docx differ diff --git a/Livrables/rapport-projet.md b/Livrables/rapport-projet.md new file mode 100644 index 0000000..36fa2b7 --- /dev/null +++ b/Livrables/rapport-projet.md @@ -0,0 +1,364 @@ +--- +title: "Rapport de Projet — ERP SUARL Rayhan" +subtitle: "Projet de Fin d'Études — Ali Guennari" +author: "Ali Guennari" +date: "Avril 2026" +lang: fr +--- + +# Rapport de Projet de Fin d'Études + +## ERP Sur Mesure pour SUARL Rayhan + +**Étudiant :** Ali Guennari +**Entreprise d'accueil :** SUARL Rayhan — Plasturgie, Tataouine, Tunisie +**Encadrant académique :** À compléter +**Encadrant professionnel :** À compléter +**Année universitaire :** 2025 / 2026 + +--- + +# Chapitre 1 — Présentation du Projet + +## 1.1 Contexte + +SUARL Rayhan est une entreprise tunisienne spécialisée dans la fabrication d'emballages plastiques (sacs Bertel, sacs poubelles, sacs alimentaires, film rétractable) implantée à Tataouine. Face à une gestion manuelle de ses processus métier — achats, ventes, production, stock — la direction a exprimé le besoin d'un système d'information intégré permettant de centraliser et automatiser ces opérations. + +## 1.2 Objectif du Projet + +Ce projet de fin d'études consiste à concevoir et développer un **ERP (Enterprise Resource Planning) sur mesure**, adapté aux spécificités de SUARL Rayhan, couvrant : + +- La gestion du référentiel articles (matières premières, produits semi-finis, produits finis) +- Le cycle d'achat complet (commandes fournisseurs → bons de réception → mise à jour du stock) +- Le cycle de vente complet (commandes clients → bons de livraison → sortie de stock) +- La gestion de la production (nomenclatures BOM, ordres de fabrication) +- Le suivi des stocks en temps réel avec alertes +- Un tableau de bord KPI pour la direction + +## 1.3 Périmètre Fonctionnel + +| Module | Description | +|--------|-------------| +| Authentification | Connexion sécurisée avec rôles différenciés | +| Articles | Gestion du catalogue (MP, PSF, PF) | +| Clients & Fournisseurs | Annuaire des tiers commerciaux | +| Cycle Achat | Commande → Réception → Stock | +| Cycle Vente | Commande → Livraison → Stock | +| Production | BOM + Ordres de Fabrication | +| Stock | Mouvements, historique, alertes seuil minimum | +| Tableau de bord | KPIs temps réel pour le PDG | + +--- + +# Chapitre 2 — Architecture Technique + +## 2.1 Stack Technologique + +| Couche | Technologie | Version | +|--------|-------------|---------| +| Backend API | Spring Boot | 3.2.5 | +| Langage | Java | 17 LTS | +| Sécurité | Spring Security + JWT | JJWT 0.12.5 | +| Persistance | Spring Data JPA / Hibernate | 6.4.4 | +| Base de données | MySQL | 8.0 | +| Conteneurisation | Docker + Docker Compose | — | +| Frontend (à venir) | Flutter | 3.x | + +## 2.2 Architecture N-Tiers + +L'API suit rigoureusement le patron d'architecture **Controller → Service → Repository → Model** : + +``` +┌─────────────────────────────────────────────────────────┐ +│ Application Flutter (Client) │ +└─────────────────────┬───────────────────────────────────┘ + │ HTTP/HTTPS (JWT Bearer Token) + ▼ +┌─────────────────────────────────────────────────────────┐ +│ API REST Spring Boot (Port 8090) │ +│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ +│ │Controller│→ │ Service │→ │Repository│ │ +│ └──────────┘ └──────────┘ └──────────┘ │ +│ ┌──────────┐ │ +│ │ JPA / │ │ +│ │Hibernate │ │ +└──────────────────────────────┴────┬─────┴──────────────┘ + │ JDBC + ▼ + ┌─────────────────────┐ + │ MySQL 8 │ + │ rayhan_erp_db │ + └─────────────────────┘ +``` + +## 2.3 Sécurité — Mécanisme JWT + +Le système utilise une authentification **stateless** basée sur les JSON Web Tokens : + +1. Le client envoie ses identifiants à `POST /api/auth/signin` +2. Le serveur valide et retourne un JWT signé (valable 24h) +3. Le client inclut `Authorization: Bearer ` dans chaque requête +4. Le filtre `AuthTokenFilter` intercepte et valide le token avant chaque endpoint + +### Rôles et Contrôle d'Accès + +| Rôle | Périmètre d'accès | +|------|-------------------| +| `ROLE_PDG` | Accès complet + tableau de bord | +| `ROLE_RESPONSABLE_VENTE` | Ventes, clients | +| `ROLE_RESPONSABLE_ACHAT` | Achats, fournisseurs | +| `ROLE_RESPONSABLE_PRODUCTION` | Production, BOM, ordres de fabrication | +| `ROLE_MAGASINIER` | Stock, mouvements de stock | +| `ROLE_RH` | Ressources humaines, paie | + +Chaque endpoint est protégé par l'annotation `@PreAuthorize` : + +```java +@PreAuthorize("hasAnyRole('ROLE_PDG', 'ROLE_RESPONSABLE_VENTE')") +``` + +## 2.4 Modèle de Données Relationnel + +La base de données `rayhan_erp_db` contient les tables suivantes : + +- **users / roles / user_roles** — authentification et droits +- **tiers** (table mère), **clients**, **fournisseurs** — gestion des tiers (héritage JOINED) +- **articles** — catalogue produits avec types MP / PSF / PF +- **bom_lines** — nomenclatures de production (Bill of Materials) +- **production_orders** — ordres de fabrication avec cycle PLANIFIE → LANCE → TERMINE +- **purchase_orders / purchase_order_lines** — commandes fournisseurs +- **goods_receipts / goods_receipt_lines** — bons de réception +- **sales_orders / sales_order_lines** — commandes clients +- **delivery_notes / delivery_note_lines** — bons de livraison +- **stock_movements** — historique complet de tous les mouvements de stock + +--- + +# Chapitre 3 — Endpoints de l'API + +## 3.1 Authentification + +| Méthode | URL | Description | +|---------|-----|-------------| +| POST | `/api/auth/signin` | Connexion → retourne JWT | +| POST | `/api/auth/signup` | Créer un utilisateur | + +## 3.2 Articles + +| Méthode | URL | Rôles | +|---------|-----|-------| +| GET | `/api/articles` | Tous | +| GET | `/api/articles/{id}` | Tous | +| GET | `/api/articles/type/{type}` | Tous (MP, PF, PSF) | +| GET | `/api/articles/alertes-stock` | PDG, Magasinier, Production | +| POST | `/api/articles` | PDG, Production, Magasinier | +| PUT | `/api/articles/{id}` | PDG, Production | +| DELETE | `/api/articles/{id}` | PDG (désactivation logique) | + +## 3.3 Clients & Fournisseurs + +| Méthode | URL | Rôles | +|---------|-----|-------| +| GET | `/api/clients` | PDG, Vente | +| POST | `/api/clients` | PDG, Vente | +| PUT | `/api/clients/{id}` | PDG, Vente | +| GET | `/api/fournisseurs` | PDG, Achat | +| POST | `/api/fournisseurs` | PDG, Achat | + +## 3.4 Cycle d'Achat + +| Méthode | URL | Description | +|---------|-----|-------------| +| GET | `/api/purchase-orders` | Liste des commandes | +| POST | `/api/purchase-orders` | Créer une commande fournisseur | +| POST | `/api/purchase-orders/{id}/receive` | Réceptionner → crée BR + entre en stock | + +## 3.5 Cycle de Vente + +| Méthode | URL | Description | +|---------|-----|-------------| +| GET | `/api/sales-orders` | Liste des commandes | +| POST | `/api/sales-orders` | Créer une commande client | +| POST | `/api/sales-orders/{id}/deliver` | Livrer → crée BL + sort du stock | + +## 3.6 Production + +| Méthode | URL | Description | +|---------|-----|-------------| +| POST | `/api/production/bom` | Définir une nomenclature | +| POST | `/api/production/orders/plan` | Planifier un ordre de fabrication | +| POST | `/api/production/orders/{id}/launch` | Lancer → consomme les MP | +| POST | `/api/production/orders/{id}/complete` | Terminer → entre les PF en stock | + +## 3.7 Stock & Tableau de Bord + +| Méthode | URL | Description | +|---------|-----|-------------| +| GET | `/api/stock/historique/{articleId}` | Historique des mouvements | +| POST | `/api/stock/adjust` | Ajustement manuel | +| GET | `/api/dashboard` | KPIs pour le PDG | + +--- + +# Chapitre 4 — Déploiement + +## 4.1 Infrastructure + +L'application est déployée sur un serveur NAS Synology (192.168.100.33) via Docker Compose. Deux conteneurs sont en production : + +- **rayhan-mysql** — MySQL 8, base de données `rayhan_erp_db` +- **rayhan-backend** — Spring Boot, accessible sur le port **8090** + +## 4.2 Docker Compose + +```yaml +services: + mysql: + image: mysql:8.0 + container_name: rayhan-mysql + environment: + MYSQL_DATABASE: rayhan_erp_db + volumes: + - mysql_data:/var/lib/mysql + + backend: + build: ./backend + container_name: rayhan-backend + ports: + - "8090:8080" + depends_on: + mysql: + condition: service_healthy +``` + +## 4.3 Dockerfile — Build Multi-Étapes + +```dockerfile +# Étape 1 : Compilation Maven +FROM maven:3.9.6-eclipse-temurin-17 AS build +WORKDIR /app +COPY pom.xml . +RUN mvn dependency:go-offline +COPY src ./src +RUN mvn clean package -DskipTests + +# Étape 2 : Image d'exécution légère +FROM eclipse-temurin:17-jre-alpine +WORKDIR /app +COPY --from=build /app/target/erp-1.0.0-SNAPSHOT.jar app.jar +EXPOSE 8080 +ENTRYPOINT ["java", "-jar", "app.jar"] +``` + +## 4.4 Accès à l'Application + +| Service | URL | +|---------|-----| +| API REST | http://192.168.100.33:8090 | +| Documentation Swagger UI | http://192.168.100.33:8090/swagger-ui/index.html | +| Dépôt source (Gitea) | https://gitea.bolbol.tn/bolbol/rayhan-erp | + +--- + +# Chapitre 5 — Tests et Validation + +## 5.1 Interface Swagger UI + +L'API intègre **Swagger UI** (SpringDoc OpenAPI 2.5.0), accessible depuis n'importe quel navigateur. Cette interface permet de : + +- Visualiser tous les endpoints disponibles +- Tester chaque endpoint directement depuis le navigateur +- S'authentifier avec le JWT via le bouton "Authorize" + +**Procédure de test :** + +1. Ouvrir http://192.168.100.33:8090/swagger-ui/index.html +2. Exécuter `POST /api/auth/signin` avec `{"username":"admin","password":"Rayhan2024!"}` +3. Copier le token de la réponse +4. Cliquer sur **Authorize 🔒** → coller le token → Authorize +5. Tester librement tous les endpoints + +## 5.2 Scénario de Test Complet + +| Étape | Action | Résultat attendu | +|-------|--------|-----------------| +| 1 | Connexion admin | Token JWT retourné | +| 2 | Créer article MP-HDPE | Article créé, stock = 0 | +| 3 | Créer commande fournisseur | Statut CONFIRMEE | +| 4 | Réceptionner commande | Stock MP augmente | +| 5 | Créer nomenclature BOM | Lien PF ↔ MP créé | +| 6 | Planifier + Lancer OF | Stock MP diminue (consommation) | +| 7 | Terminer OF | Stock PF augmente | +| 8 | Créer commande client | Statut CONFIRMEE | +| 9 | Livrer commande | Stock PF diminue | +| 10 | Tableau de bord | KPIs mis à jour | + +--- + +# Chapitre 6 — Ce qui reste à faire + +## 6.1 Frontend Flutter + +Le frontend mobile/desktop sera développé avec Flutter et se connectera à l'API REST via des appels HTTP avec token JWT. + +**Écrans à développer (par priorité) :** + +1. **Écran de connexion** — formulaire login/password, stockage du token +2. **Tableau de bord** — affichage des KPIs (chiffre d'affaires, alertes stock, OF en cours) +3. **Articles** — liste, recherche, fiche détail, ajout/modification +4. **Cycle de vente** — liste commandes, création, bon de livraison +5. **Cycle d'achat** — liste commandes, création, bon de réception +6. **Production** — BOM, ordres de fabrication, lancement/terminaison +7. **Stock** — historique des mouvements, ajustements + +**Architecture Flutter proposée :** + +- **State management :** Provider ou Riverpod +- **HTTP client :** `http` ou `dio` +- **Stockage local :** `shared_preferences` (token JWT) +- **Navigation :** `go_router` + +## 6.2 Modules Complémentaires API + +| Module | Description | Priorité | +|--------|-------------|----------| +| Facturation | Génération de factures PDF | Haute | +| Paie / RH | Gestion des employés et salaires | Moyenne | +| Rapports | Export Excel/PDF des données | Moyenne | + +--- + +# Annexes + +## A — Initialisation Automatique + +Au premier démarrage, le système crée automatiquement : + +- Les 6 rôles dans la base de données +- L'utilisateur administrateur : **admin / Rayhan2024!** avec le rôle PDG + +## B — Variables d'Environnement Docker + +| Variable | Valeur | +|----------|--------| +| `SPRING_DATASOURCE_URL` | `jdbc:mysql://mysql:3306/rayhan_erp_db` | +| `SPRING_DATASOURCE_USERNAME` | `root` | +| `SPRING_DATASOURCE_PASSWORD` | `rayhan_erp_2024` | +| `RAYHAN_ERP_JWTSECRET` | Clé secrète JWT (256 bits) | +| `RAYHAN_ERP_JWTEXPIRATIONMS` | `86400000` (24 heures) | + +## C — Commandes Docker Utiles + +```bash +# Démarrer l'application +docker compose up -d + +# Reconstruire après modification du code +docker compose up -d --build + +# Voir les logs en temps réel +docker logs rayhan-backend -f + +# Accéder à MySQL +docker exec -it rayhan-mysql mysql -u root -prayhan_erp_2024 rayhan_erp_db +```