344 lines
6.6 KiB
Markdown
344 lines
6.6 KiB
Markdown
# Guide de Tests API — Postman
|
||
**PFE Ali Guennari — ERP SUARL Rayhan**
|
||
|
||
## Configuration de Base
|
||
|
||
**URL de base** : `https://rayhan-erp.bolbol.tn`
|
||
|
||
### 1. Configurer une Variable d'Environnement Postman
|
||
|
||
Dans Postman, créer un environnement "Rayhan ERP" avec :
|
||
- `baseUrl` = `https://rayhan-erp.bolbol.tn`
|
||
- `token` = (sera rempli automatiquement)
|
||
|
||
---
|
||
|
||
## Scénario 1 : Authentification
|
||
|
||
### Se connecter (POST /api/auth/signin)
|
||
|
||
```
|
||
POST {{baseUrl}}/api/auth/signin
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"username": "admin",
|
||
"password": "Rayhan2024!"
|
||
}
|
||
```
|
||
|
||
**Réponse attendue (200 OK) :**
|
||
```json
|
||
{
|
||
"token": "eyJhbGciOiJIUzI1NiJ9...",
|
||
"type": "Bearer",
|
||
"id": 1,
|
||
"username": "admin",
|
||
"email": "admin@rayhan.tn",
|
||
"roles": ["ROLE_PDG"]
|
||
}
|
||
```
|
||
|
||
**Script Postman (Tests tab)** pour sauvegarder le token :
|
||
```javascript
|
||
var json = pm.response.json();
|
||
pm.environment.set("token", json.token);
|
||
```
|
||
|
||
**Utilisation dans toutes les requêtes suivantes :**
|
||
```
|
||
Authorization: Bearer {{token}}
|
||
```
|
||
|
||
---
|
||
|
||
## Scénario 2 : Référentiels
|
||
|
||
### Créer un Article (Matière Première HDPE)
|
||
|
||
```
|
||
POST {{baseUrl}}/api/articles
|
||
Authorization: Bearer {{token}}
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"reference": "MP-HDPE-001",
|
||
"designation": "HDPE Granulés (Polyéthylène Haute Densité)",
|
||
"type": "MP",
|
||
"uniteMesure": "kg",
|
||
"prixUnitaire": 2.850,
|
||
"stockMinimum": 500
|
||
}
|
||
```
|
||
|
||
### Créer un Article (Produit Fini — Sac Bertel)
|
||
|
||
```
|
||
POST {{baseUrl}}/api/articles
|
||
Authorization: Bearer {{token}}
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"reference": "PF-SAC-BERTEL-001",
|
||
"designation": "Sac Bertel 40x60 cm",
|
||
"type": "PF",
|
||
"uniteMesure": "unité",
|
||
"prixUnitaire": 0.085,
|
||
"stockMinimum": 1000
|
||
}
|
||
```
|
||
|
||
### Créer un Client
|
||
|
||
```
|
||
POST {{baseUrl}}/api/clients
|
||
Authorization: Bearer {{token}}
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"raisonSociale": "Supermarché Maghreb Distribution",
|
||
"matriculeFiscal": "123456A/A/M/000",
|
||
"adresse": "Avenue Habib Bourguiba, Tataouine",
|
||
"telephone": "75123456",
|
||
"email": "achats@maghreb-distrib.tn",
|
||
"ville": "Tataouine",
|
||
"typeClient": "Grossiste",
|
||
"delaiPaiement": 60
|
||
}
|
||
```
|
||
|
||
### Créer un Fournisseur (HDPE)
|
||
|
||
```
|
||
POST {{baseUrl}}/api/fournisseurs
|
||
Authorization: Bearer {{token}}
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"raisonSociale": "PLASTUNION Tunisie",
|
||
"matriculeFiscal": "654321B/A/M/000",
|
||
"adresse": "Zone Industrielle Sfax",
|
||
"telephone": "74987654",
|
||
"email": "ventes@plastunion.tn",
|
||
"ville": "Sfax",
|
||
"pays": "Tunisie",
|
||
"categorieProduit": "Matières plastiques",
|
||
"delaiLivraison": 10
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Scénario 3 : Cycle d'Achat Complet
|
||
|
||
### Étape 3.1 — Créer une Commande Fournisseur
|
||
|
||
```
|
||
POST {{baseUrl}}/api/purchase-orders
|
||
Authorization: Bearer {{token}}
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"fournisseur": {"id": 1},
|
||
"dateLivraisonPrevue": "2024-05-15",
|
||
"notes": "Commande mensuelle HDPE",
|
||
"lignes": [
|
||
{
|
||
"article": {"id": 1},
|
||
"quantiteCommandee": 1000,
|
||
"prixUnitaireHT": 2.850,
|
||
"tauxTVA": 19.00
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
**Réponse attendue :** commande avec `reference: "BC-2024-001"`, `statut: "CONFIRMEE"`, `totalTTC: 3391.50`
|
||
|
||
### Étape 3.2 — Réceptionner la Commande (Bon de Réception)
|
||
|
||
```
|
||
POST {{baseUrl}}/api/purchase-orders/1/receive
|
||
Authorization: Bearer {{token}}
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"dateReception": "2024-05-14",
|
||
"notes": "Réception conforme",
|
||
"lignes": [
|
||
{
|
||
"purchaseOrderLine": {"id": 1},
|
||
"article": {"id": 1},
|
||
"quantiteRecue": 1000,
|
||
"observations": "Qualité OK, sacs conformes"
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
**Vérification :** `GET {{baseUrl}}/api/articles/1` → `stockActuel` doit être 1000
|
||
|
||
---
|
||
|
||
## Scénario 4 : Production (BOM + OF)
|
||
|
||
### Étape 4.1 — Définir la Nomenclature (BOM)
|
||
|
||
```
|
||
POST {{baseUrl}}/api/production/bom
|
||
Authorization: Bearer {{token}}
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"produitFini": {"id": 2},
|
||
"composant": {"id": 1},
|
||
"quantiteParUnite": 0.015,
|
||
"uniteMesure": "kg"
|
||
}
|
||
```
|
||
|
||
*Signification : pour produire 1 Sac Bertel, il faut 0.015 kg de HDPE*
|
||
|
||
### Étape 4.2 — Planifier un Ordre de Fabrication
|
||
|
||
```
|
||
POST {{baseUrl}}/api/production/orders/plan
|
||
Authorization: Bearer {{token}}
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"produitFiniId": 2,
|
||
"quantite": 10000,
|
||
"datePlanifiee": "2024-05-16"
|
||
}
|
||
```
|
||
|
||
**Vérification préalable :** stock HDPE (1000 kg) ≥ 10000 × 0.015 = 150 kg → OK
|
||
|
||
### Étape 4.3 — Lancer l'OF
|
||
|
||
```
|
||
POST {{baseUrl}}/api/production/orders/1/launch
|
||
Authorization: Bearer {{token}}
|
||
```
|
||
|
||
**Vérification :** stock HDPE passe de 1000 à 850 kg (consommation 150 kg)
|
||
|
||
### Étape 4.4 — Terminer l'OF
|
||
|
||
```
|
||
POST {{baseUrl}}/api/production/orders/1/complete
|
||
Authorization: Bearer {{token}}
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"quantiteRealisee": 9800
|
||
}
|
||
```
|
||
|
||
**Vérification :** stock Sac Bertel passe à 9800 unités
|
||
|
||
---
|
||
|
||
## Scénario 5 : Cycle de Vente
|
||
|
||
### Étape 5.1 — Créer une Commande Client
|
||
|
||
```
|
||
POST {{baseUrl}}/api/sales-orders
|
||
Authorization: Bearer {{token}}
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"client": {"id": 1},
|
||
"dateLivraisonSouhaitee": "2024-05-20",
|
||
"notes": "Urgent",
|
||
"lignes": [
|
||
{
|
||
"article": {"id": 2},
|
||
"quantiteCommandee": 5000,
|
||
"prixUnitaireHT": 0.085,
|
||
"tauxTVA": 19.00
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
### Étape 5.2 — Créer un Bon de Livraison
|
||
|
||
```
|
||
POST {{baseUrl}}/api/sales-orders/1/deliver
|
||
Authorization: Bearer {{token}}
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"dateLivraison": "2024-05-20",
|
||
"adresseLivraison": "Avenue Habib Bourguiba, Tataouine",
|
||
"notes": "Livraison par camion",
|
||
"lignes": [
|
||
{
|
||
"salesOrderLine": {"id": 1},
|
||
"article": {"id": 2},
|
||
"quantiteLivree": 5000
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
**Vérification :** stock Sac Bertel passe de 9800 à 4800
|
||
|
||
---
|
||
|
||
## Scénario 6 : Tableau de Bord (PDG uniquement)
|
||
|
||
```
|
||
GET {{baseUrl}}/api/dashboard
|
||
Authorization: Bearer {{token}}
|
||
```
|
||
|
||
**Réponse attendue :**
|
||
```json
|
||
{
|
||
"ventes": {
|
||
"chiffreAffairesMois": 505.75,
|
||
"nbCommandesMois": 1,
|
||
"commandesEnCours": 0
|
||
},
|
||
"achats": {
|
||
"commandesEnAttente": 0
|
||
},
|
||
"production": {
|
||
"ofPlanifies": 0,
|
||
"ofEnCours": 0
|
||
},
|
||
"stock": {
|
||
"articlesEnAlerte": 0,
|
||
"articlesEnAlerteDetails": []
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Codes d'Erreur Importants
|
||
|
||
| Code | Signification | Action |
|
||
|------|--------------|--------|
|
||
| 401 | Non authentifié | Vérifier le token JWT |
|
||
| 403 | Accès interdit | Le rôle ne permet pas cette action |
|
||
| 400 | Données invalides | Vérifier le body de la requête |
|
||
| 500 | Erreur serveur | Voir les logs du container |
|
||
|
||
## Commandes Docker Utiles
|
||
|
||
```bash
|
||
# Voir les logs de l'API
|
||
docker logs rayhan-backend -f
|
||
|
||
# Accéder à MySQL directement
|
||
docker exec -it rayhan-mysql mysql -u root -prayhan_erp_2024 rayhan_erp_db
|
||
|
||
# Redémarrer l'API
|
||
docker restart rayhan-backend
|
||
```
|