Référence complète de l'API Référentiel UBSI
Vue d'ensemble
L'API Référentiel UBSI expose les données de référence (produits, fournisseurs, entrepôts, magasins) pour l'écosystème Fnac/Darty.
URLs et Environnements
- Swagger UI: https://referentiel.staging.ubsi.fr/api/swagger
- Swagger JSON: https://referentiel.staging.ubsi.fr/api/swagger/json
- Swagger YAML: https://referentiel.staging.ubsi.fr/api/swagger/yaml
- Base URL (staging):
https://referentiel.staging.ubsi.fr
Authentification
- Routes publiques (
/api/publique/*): Aucune authentification requise pour le moment - Routes privées (
/api/privee/*): Réservées aux outils internes - Production: Kong API Gateway avec clés API (configuration via
KONG_API_GATEWAY,KONG_API_KEY)
Conventions générales
Formats de données
- Format de réponse: JSON UTF-8
- Dates: ISO 8601 format string (
2025-09-27T12:34:56.000Z) - Prix: Stockés en centimes d'euros (entier)
- IDs: Entiers positifs (bigint)
Champs système automatiques
Tous les objets incluent automatiquement :
id: Identifiant unique auto-incrémentécreatedAt: Date de création (ISO 8601)updatedAt: Date de dernière modification (ISO 8601)
⚠️ Le champ deletedAt existe en interne pour le soft-delete mais n'est jamais exposé dans l'API publique.
Soft-delete
Toutes les suppressions sont logiques (soft-delete) :
- Les entités supprimées ne sont plus visibles via l'API
- Elles sont marquées avec
deletedAten base mais ce champ n'apparaît pas dans les réponses - Pas de suppression physique de données
Pagination et filtrage
Pagination standard
Tous les endpoints GET principaux supportent la pagination :
Paramètres:
page(optionnel): Numéro de page (≥1, ≤1000). Défaut: 1limit(optionnel): Éléments par page (1-100). Défaut: 20
Réponse paginée (si page ou limit fourni):
{
"rows": [...], // Données de la page courante
"total": 1234, // Nombre total d'éléments
"page": 1, // Page courante
"limit": 20, // Éléments par page
"totalPages": 62 // Nombre total de pages
}
Réponse simple (sans pagination):
[...] // Tableau simple de tous les éléments
Tri (sorting)
Paramètres:
sort: Champ(s) de tri, séparés par virgule. Préfixer par-pour ordre décroissant- Exemple simple:
nom - Exemple multiple:
nom,-prixDeVenteCents(nom croissant, puis prix décroissant)
- Exemple simple:
order:ascoudesc(utilisé avec un seul critère de tri)
Recherche textuelle
Paramètre:
search: Recherche dans les champs principaux (nom, description, etc.)- Exemple:
search=samsung tv 4k
- Exemple:
Sélection de champs
Paramètre:
fields: Liste des champs à retourner, séparés par virgules- Exemple:
fields=id,nom,ean,prixDeVenteCents - Réduit la taille des réponses et améliore les performances
- Exemple:
Filtrage par IDs
Paramètre:
ids: Liste d'IDs à récupérer, séparés par virgules (max 500)- Exemple:
ids=123,456,789,1011
- Exemple:
Filtres avancés (MUI DataGrid)
Paramètre:
filters: Filtres JSON structurés compatibles MUI DataGrid
Format:
filters = JSON.stringify([
{ field: 'champ', operator: 'opérateur', value: 'valeur' },
]);
Opérateurs supportés:
- Texte:
contains,equals,startsWith,endsWith,isEmpty,isNotEmpty,isAnyOf - Nombres:
=,!=,>,>=,<,<=
Exemples:
// Recherche TV Samsung > 500€
filters = JSON.stringify([
{ field: 'nom', operator: 'contains', value: 'TV' },
{ field: 'marque', operator: 'equals', value: 'Samsung' },
{ field: 'prixDeVenteCents', operator: '>', value: 50000 },
]);
// Produits actifs dans plusieurs catégories
filters = JSON.stringify([
{ field: 'statutProduit', operator: 'equals', value: 'actif' },
{
field: 'categories',
operator: 'isAnyOf',
value: ['informatique', 'telephonie'],
},
]);
Extension de données (include)
Paramètre:
include: Charge les relations associées
Valeurs possibles:
- Sur
/produits/:id:include=fournisseurs→ Inclut la liste des fournisseurs - Sur
/fournisseurs/:id:include=produits→ Inclut la liste des produits
Endpoints Produits
Base: /api/publique/produits
GET /api/publique/produits
Liste tous les produits avec pagination, tri, recherche et filtrage optionnels.
Query Parameters:
- Pagination:
page,limit - Tri:
sort,order - Recherche:
search(nom, description) - Sélection:
fields,ids - Filtres:
filters(JSON MUI DataGrid) - Include:
include=fournisseurs(inclut relations) - Filtres métier:
marque: Filtrer par marquecategories: Filtrer par catégorie (voir enums)statutProduit:actif,inactif,discontinue,en_developpement,obsoleteean: Filtrer par EAN spécifique
Réponse: ProduitDto[] ou PaginatedProduitsDto
Exemple:
GET /api/publique/produits?page=1&limit=20&search=samsung&sort=-prixDeVenteCents
GET /api/publique/produits?categories=informatique&statutProduit=actif
GET /api/publique/produits?ids=1,2,3,4,5
GET /api/publique/produits/:id
Récupère un produit par son ID.
Path Parameters:
id(required): ID du produit (entier)
Query Parameters:
include:fournisseurspour inclure la liste des fournisseurs
Réponse: ProduitDto
Codes de statut:
- 200: Succès
- 400: ID invalide
- 404: Produit non trouvé
POST /api/publique/produits
Crée un nouveau produit.
Body: CreateProduitDto
{
"ean": "1234567890123", // OBLIGATOIRE - Unique
"nom": "Samsung Galaxy S24", // OBLIGATOIRE
"prixDeVenteCents": 89900, // OBLIGATOIRE (en centimes)
"description": "Smartphone flagship 2024", // Optionnel
"photosUrls": ["https://cdn.example.com/s24.jpg"], // Optionnel
"categories": "telephonie", // Optionnel (défaut: "accessoires")
"marque": "Samsung", // Optionnel
"poids": "168g", // Optionnel
"couleurs": "Noir, Violet, Jaune", // Optionnel
"dimensions": "147x71x7.6mm", // Optionnel
"caracteristiquesTechniques": "Snapdragon 8 Gen 3, 8GB RAM", // Optionnel
"dureeGarantie": 730, // Optionnel (en jours)
"statutProduit": "actif", // Optionnel (défaut: "actif")
"documentationUrl": "https://docs.samsung.com/s24", // Optionnel
"dateFinReapprovisionnement": "2025-12-31", // Optionnel (ISO 8601)
"dateFinDeVie": "2027-12-31", // Optionnel (ISO 8601)
"produitsComplementairesIds": [45, 67, 89] // Optionnel (IDs de produits actifs)
}
Réponse: ProduitDto (201 Created)
Codes de statut:
- 201: Produit créé avec succès
- 400: Données invalides
- 422: Violation de contraintes métier (EAN dupliqué, etc.)
PATCH /api/publique/produits/:id
Met à jour un produit existant.
Path Parameters:
id(required): ID du produit
Body: UpdateProduitDto (tous les champs optionnels)
{
"nom": "Samsung Galaxy S24 Ultra",
"prixDeVenteCents": 129900,
"statutProduit": "actif"
}
Réponse: ProduitDto (200 OK)
PATCH /api/publique/produits
Mise à jour en lot (batch update).
Body: BatchUpdateProduitDto
{
"produits": [
{
"id": 1,
"prixDeVenteCents": 79900,
"statutProduit": "actif"
},
{
"id": 2,
"nom": "Nouveau nom",
"prixDeVenteCents": 89900
}
]
}
Limites:
- Minimum: 1 produit
- Maximum: 500 produits par requête
Réponse: BatchUpdateResponseDto
{
"succes": true,
"modifies": 2,
"resultats": [
{
"index": 0,
"id": 1,
"ean": "1234567890123",
"statut": "ok"
},
{
"index": 1,
"id": 2,
"ean": "2345678901234",
"statut": "ok"
}
]
}
DELETE /api/publique/produits/:id
Supprime logiquement un produit (soft-delete).
Path Parameters:
id(required): ID du produit
Réponse: 200 OK (pas de body)
DELETE /api/publique/produits
Suppression en lot (bulk delete).
Body:
{
"ids": [1, 2, 3, 4, 5]
}
Limites:
- Minimum: 1 ID
- Maximum: 500 IDs par requête
Réponse: BulkResponseDto
{
"succes": true,
"supprimes": 5,
"resultats": [...]
}
Codes de statut:
- 200: Tous les IDs supprimés avec succès
- 400: Certains IDs non trouvés (suppression partielle)
- 404: Aucun des IDs n'existe
GET /api/publique/produits/:id/fournisseurs
Liste les fournisseurs d'un produit avec pagination.
Path Parameters:
id(required): ID du produit
Query Parameters:
- Pagination:
page,limit - Tri:
sort,order - Champs triables:
prixFournisseurCents,delaiLivraisonJours,referenceFournisseur,statutRelation
Réponse: PaginatedProduitFournisseursDto
POST /api/publique/produits/:id/fournisseurs
Ajoute un fournisseur à un produit.
Path Parameters:
id(required): ID du produit
Body: CreateProduitFournisseurDto
{
"fournisseurId": 1, // OBLIGATOIRE
"prixFournisseurCents": 15000, // Optionnel (prix d'achat)
"delaiLivraisonJours": 7, // Optionnel
"quantiteMinimaleCommande": 10, // Optionnel
"referenceFournisseur": "REF-123", // Optionnel
"packaging": 24, // Optionnel (unités par carton)
"statutRelation": "actif" // Optionnel (défaut: "actif")
}
Réponse: Relation créée (201 Created)
PATCH /api/publique/produits/:id/fournisseurs/:fournisseurId
Met à jour la relation entre un produit et un fournisseur.
Path Parameters:
id(required): ID du produitfournisseurId(required): ID du fournisseur
Body: UpdateProduitFournisseurDto
{
"prixFournisseurCents": 14500,
"delaiLivraisonJours": 5,
"statutRelation": "prefere"
}
Réponse: Relation mise à jour (200 OK)
POST /api/publique/produits/import
Importe des produits via fichier JSON.
Content-Type: multipart/form-data
Form Data:
file: Fichier JSON (voir structure dans section Import)
Réponse: ImportResultDto
{
"succes": true,
"created": 150,
"failed": 2,
"errors": [
{ "line": 5, "error": "EAN déjà existant" },
{ "line": 12, "error": "Prix invalide" }
]
}
POST /api/publique/produits/fournisseurs/import
Importe des relations produit-fournisseur via fichier JSON.
Content-Type: multipart/form-data
Form Data:
file: Fichier JSON avec relations (voir section Import)
Réponse: ImportResultDto
Endpoints Fournisseurs
Base: /api/publique/fournisseurs
GET /api/publique/fournisseurs
Liste tous les fournisseurs avec pagination, tri et filtrage.
Query Parameters:
- Pagination:
page,limit - Tri:
sort,order - Recherche:
search(nomLegal, adresse) - Sélection:
fields,ids - Filtres:
filters(JSON) - Include:
include=produits - Filtres métier:
codeFournisseur: Code unique du fournisseurstatut:actif,inactif,suspendu,bloque,en_validationstatutContractuel:valide,expire,en_negociation,resilie,suspenduadresse: Recherche partielle dans l'adresse
Réponse: FournisseurDto[] ou PaginatedFournisseursDto
GET /api/publique/fournisseurs/:id
Récupère un fournisseur par son ID.
Query Parameters:
include:produitspour inclure la liste des produits associés
Réponse: FournisseurDto
POST /api/publique/fournisseurs
Crée un nouveau fournisseur.
Body: CreateFournisseurDto
{
"nomLegal": "Samsung Electronics France", // OBLIGATOIRE
"codeFournisseur": "SAMS001", // OBLIGATOIRE - Unique
"siret": "12345678901234", // Optionnel
"adresse": "12 rue de Séoul, 75001 Paris", // Optionnel
"email": "contact@samsung.fr", // Optionnel
"telephone": "+33123456789", // Optionnel
"interlocuteurs": ["Jean Dupont", "Marie Martin"], // Optionnel
"documentsContractuelUrls": ["https://contrats/samsung.pdf"], // Optionnel
"statut": "actif", // Optionnel (défaut: "en_validation")
"statutContractuel": "valide" // Optionnel (défaut: "en_negociation")
}
Réponse: FournisseurDto (201 Created)
PATCH /api/publique/fournisseurs/:id
Met à jour un fournisseur.
Body: UpdateFournisseurDto (tous champs optionnels)
PATCH /api/publique/fournisseurs
Mise à jour en lot.
Body:
{
"fournisseurs": [
{
"id": 1,
"statut": "actif",
"email": "nouveau@email.com"
}
]
}
Limite: 1-500 fournisseurs
DELETE /api/publique/fournisseurs/:id
Suppression logique d'un fournisseur.
DELETE /api/publique/fournisseurs
Suppression en lot.
Body:
{
"ids": [1, 2, 3]
}
GET /api/publique/fournisseurs/:id/produits
Liste les produits d'un fournisseur avec pagination.
Query Parameters:
- Pagination:
page,limit - Tri:
sort,order - Champs triables:
ean,nom,statutProduit,prixFournisseurCents,delaiLivraisonJours
Réponse: PaginatedFournisseurProduitsDto
POST /api/publique/fournisseurs/import
Importe des fournisseurs via fichier JSON.
Content-Type: multipart/form-data
Endpoints Entrepôts
Base: /api/publique/entrepots
GET /api/publique/entrepots
Liste tous les entrepôts avec pagination et filtrage.
Query Parameters:
- Pagination:
page,limit - Tri:
sort,order - Recherche:
search(nom, adresse) - Sélection:
fields,ids - Filtres:
filters(JSON) - Filtres métier:
statut:operationnel,maintenance,ferme,en_constructiontypeEntrepot:informatique,electromenager,accessoires,multimedia,generalisteestGrosVolume:trueoufalse(infrastructure pour produits volumineux)
Réponse: EntrepotDto[] ou PaginatedEntrepotsDto
GET /api/publique/entrepots/:id
Récupère un entrepôt par son ID.
POST /api/publique/entrepots
Crée un nouvel entrepôt.
Body: CreateEntrepotDto
{
"nom": "Entrepôt Sud-Est", // OBLIGATOIRE
"adresse": "Zone industrielle Lyon Sud", // OBLIGATOIRE
"statut": "operationnel", // Optionnel (défaut: "operationnel")
"typeEntrepot": "electromenager", // Optionnel (défaut: "generaliste")
"estGrosVolume": true, // Optionnel (défaut: false)
"horaires": "08h-18h", // Optionnel
"capaciteStockage": 50000, // Optionnel (en unités)
"capaciteLogistique": 20000, // Optionnel
"rolesLogistiques": ["Stockage", "Préparation commandes"], // Optionnel
"zoneGeographiqueDesservie": "Auvergne-Rhône-Alpes", // Optionnel
"responsableLogistique": "Pierre Martin" // Optionnel
}
Champs importants:
typeEntrepot: Spécialisation de l'entrepôtestGrosVolume: Indique si l'entrepôt peut gérer les produits volumineux (gros électroménager, TV grand format)
Réponse: EntrepotDto (201 Created)
PATCH /api/publique/entrepots/:id
Met à jour un entrepôt.
PATCH /api/publique/entrepots
Mise à jour en lot (1-500 entrepôts).
DELETE /api/publique/entrepots/:id
Suppression logique.
DELETE /api/publique/entrepots
Suppression en lot.
POST /api/publique/entrepots/import
Importe des entrepôts via fichier JSON.
Endpoints Magasins
Base: /api/publique/magasins
GET /api/publique/magasins
Liste tous les magasins avec pagination et filtrage.
Query Parameters:
- Pagination:
page,limit - Tri:
sort,order - Recherche:
search(nom, adresse) - Sélection:
fields,ids - Filtres:
filters(JSON) - Filtres métier:
statut:ouvert,ferme,renovation,fermeture_temporairetype:megastore,magasin_centre_ville,magasin_centre_commercial,magasin_peripherie,concept_store,corner,drive,showroomservicesDisponibles: Filtrer par service disponible
Réponse: MagasinDto[] ou PaginatedMagasinsDto
GET /api/publique/magasins/:id
Récupère un magasin par son ID.
POST /api/publique/magasins
Crée un nouveau magasin.
Body: CreateMagasinDto
{
"nom": "Fnac Lyon Part-Dieu", // OBLIGATOIRE
"adresse": "Centre Commercial La Part-Dieu, Lyon", // OBLIGATOIRE
"statut": "ouvert", // Optionnel (défaut: "ouvert")
"type": "megastore", // Optionnel (défaut: "magasin_centre_ville")
"servicesDisponibles": ["click_collect", "installation", "reparation"], // Optionnel (défaut: ["click_collect"])
"horaires": "10h-20h", // Optionnel
"responsable": "Sophie Durand", // Optionnel
"surfaceVente": 3500, // Optionnel (m²)
"capaciteDAccueil": 500 // Optionnel (personnes)
}
Services disponibles:
click_collect: Retrait en magasinlivraison_domicile: Livraison à domicileinstallation: Service d'installationreparation: Service après-vente/réparationreprise: Reprise ancien matérielfinancement: Solutions de financementextension_garantie: Extensions de garantieformation: Formation/prise en mainlocation: Location de matérielmaintenance: Contrats de maintenance
Réponse: MagasinDto (201 Created)
PATCH /api/publique/magasins/:id
Met à jour un magasin.
PATCH /api/publique/magasins
Mise à jour en lot (1-500 magasins).
DELETE /api/publique/magasins/:id
Suppression logique.
DELETE /api/publique/magasins
Suppression en lot.
POST /api/publique/magasins/import
Importe des magasins via fichier JSON.
Endpoints Relations Fournisseur-Produits
Base: /api/privee/fournisseur-produits ⚠️ API Privée (usage interne)
GET /api/privee/fournisseur-produits
Liste toutes les relations avec pagination et filtrage.
Query Parameters:
- Pagination:
page,limit - Tri:
sort,order - Filtres:
filters(JSON) - Filtres métier:
produitId: Filtrer par ID produitfournisseurId: Filtrer par ID fournisseur
Réponse: FournisseurProduitRowDto[] ou PaginatedFournisseurProduitsDto
Endpoints Système
GET /health
Health check du serveur.
Réponse: 200 OK si le serveur est opérationnel et peut communiquer avec la base de données.
GET /ready
Readiness check (Kubernetes).
Réponse: 200 OK si le serveur est prêt à accepter du trafic.
Endpoints Clock (SSE)
GET /api/clock/update-sse
Subscribe to clock updates via Server-Sent Events.
Protocole: Server-Sent Events (SSE)
Réponse (stream):
data: {"time": "2025-01-25T14:30:00.000Z", "multiplier": 1}
Usage:
const eventSource = new EventSource('/api/clock/update-sse');
eventSource.onmessage = (event) => {
const { time, multiplier } = JSON.parse(event.data);
console.log('Clock update:', time, multiplier);
};
Import de données (JSON)
Tous les endpoints d'import utilisent multipart/form-data avec un fichier JSON.
Format général
Content-Type: multipart/form-data
Form Data:
file: Fichier JSON (array d'objets)
Import Produits
Endpoint: POST /api/publique/produits/import
Structure du fichier (produits.json):
[
{
"ean": "1234567890123",
"nom": "Nom du produit",
"prixDeVenteCents": 15000,
"description": "Description optionnelle",
"photosUrls": ["url1.jpg", "url2.jpg"],
"categories": "informatique",
"marque": "Samsung",
"poids": "2.5kg",
"couleurs": "Noir, Blanc",
"dimensions": "15x10x5cm",
"caracteristiquesTechniques": "Spec technique",
"dureeGarantie": 730,
"statutProduit": "actif",
"documentationUrl": "https://docs.example.com",
"dateFinReapprovisionnement": "2025-12-31",
"dateFinDeVie": "2026-12-31",
"produitsComplementairesIds": [2, 5, 12]
}
]
Champs obligatoires: ean, nom, prixDeVenteCents
Import Fournisseurs
Endpoint: POST /api/publique/fournisseurs/import
Structure (fournisseurs.json):
[
{
"nomLegal": "Samsung Electronics France",
"codeFournisseur": "SAMS001",
"siret": "12345678901234",
"adresse": "12 rue de Séoul, Paris",
"email": "contact@samsung.com",
"telephone": "+33123456789",
"interlocuteurs": ["Jean Dupont"],
"documentsContractuelUrls": ["https://contrats/samsung.pdf"],
"statut": "actif",
"statutContractuel": "valide"
}
]
Champs obligatoires: nomLegal, codeFournisseur
Import Entrepôts
Endpoint: POST /api/publique/entrepots/import
Structure (entrepots.json):
[
{
"nom": "Entrepôt Central Paris",
"adresse": "Zone Industrielle, 93170 Bagnolet",
"statut": "operationnel",
"typeEntrepot": "generaliste",
"estGrosVolume": false,
"horaires": "7h-19h du lundi au vendredi",
"capaciteStockage": 50000,
"capaciteLogistique": 1000,
"rolesLogistiques": ["stockage", "expedition", "reception"],
"zoneGeographiqueDesservie": "Île-de-France",
"responsableLogistique": "Pierre Martin"
}
]
Champs obligatoires: nom, adresse
Import Magasins
Endpoint: POST /api/publique/magasins/import
Structure (magasins.json):
[
{
"nom": "Fnac Paris Châtelet",
"adresse": "1 Rue Pierre Lescot, 75001 Paris",
"statut": "ouvert",
"servicesDisponibles": ["click_collect", "installation"],
"horaires": "10h-20h du lundi au samedi",
"responsable": "Sophie Durand",
"type": "megastore",
"surfaceVente": 3500,
"capaciteDAccueil": 500
}
]
Champs obligatoires: nom, adresse
Import Relations Produit-Fournisseur
Endpoint: POST /api/publique/produits/fournisseurs/import
Structure (relations.json):
[
{
"produitId": 123,
"fournisseurId": 1,
"prixFournisseurCents": 15000,
"delaiLivraisonJours": 7,
"quantiteMinimaleCommande": 10,
"referenceFournisseur": "REF-SUP-123",
"packaging": 24,
"statutRelation": "actif"
}
]
Champs obligatoires: produitId, fournisseurId
Note: Les produits et fournisseurs doivent exister au préalable.
Gestion des erreurs
Codes de statut HTTP
- 200 OK: Succès
- 201 Created: Ressource créée avec succès
- 400 Bad Request: Paramètres invalides, données mal formées
- 404 Not Found: Ressource non trouvée
- 422 Unprocessable Entity: Violation de contraintes métier (duplicata, références invalides, etc.)
- 500 Internal Server Error: Erreur serveur inattendue
Format des erreurs
{
"statusCode": 400,
"message": "Le numéro de page doit être un entier entre 1 et 1000",
"error": "Bad Request"
}
Erreurs spécifiques
Suppression en lot:
- 200: Tous les IDs supprimés
- 400: Certains IDs non trouvés (suppression partielle) → Message:
IDs non trouvés: 999, 1001 - 404: Aucun des IDs n'existe → Message:
Aucun des IDs fournis n'existe: 998, 999, 1000
Import de fichiers:
- 200: Import réussi (avec détails des échecs éventuels dans la réponse)
- 400: Fichier invalide ou format JSON incorrect
- 500: Erreur serveur
Limites et quotas
- Pagination: Max 100 éléments par page, max 1000 pages
- Batch operations: 1-500 items par requête (update/delete en lot)
- IDs filter: Max 500 IDs
- Import: Pas de limite stricte mais recommandé < 10 000 items par fichier
Exemples d'utilisation
Recherche de produits Samsung actifs
GET /api/publique/produits?marque=Samsung&statutProduit=actif&page=1&limit=20
Mise à jour de prix en masse
PATCH /api/publique/produits
Content-Type: application/json
{
"produits": [
{"id": 1, "prixDeVenteCents": 79900},
{"id": 2, "prixDeVenteCents": 89900},
{"id": 3, "prixDeVenteCents": 99900}
]
}
Import de nouveaux produits
POST /api/publique/produits/import
Content-Type: multipart/form-data
file: produits.json
Récupération d'un produit avec ses fournisseurs
GET /api/publique/produits/123?include=fournisseurs
Filtrage avancé avec MUI DataGrid
const filters = JSON.stringify([
{
field: 'categories',
operator: 'isAnyOf',
value: ['informatique', 'gaming'],
},
{ field: 'prixDeVenteCents', operator: '<=', value: 100000 },
{ field: 'statutProduit', operator: 'equals', value: 'actif' },
]);
fetch(
`/api/publique/produits?filters=${encodeURIComponent(filters)}&page=1&limit=20`
)
.then((res) => res.json())
.then((data) => console.log(data));
Notes importantes
- Les champs dépréciés (préfixés
deprecated*dans le schéma) ne doivent plus être utilisés. Ils seront supprimés dans une version future. - Toutes les dates de cycle de vie (
dateFinReapprovisionnement,dateFinDeVie) sont optionnelles et au format ISO 8601. - Les relations fournisseur-produits sont gérées via la table de jointure optimisée
fournisseur_produits. - Le soft-delete garantit l'intégrité des données historiques.