Offer Projection¶
Status: CONTRACT
Rôle¶
La Offer Projection expose une représentation de lecture stable des informations commerciales propres à une offre marchande.
Une Offer Projection représente une proposition commerciale rattachée à un produit. Elle n'est ni le Product lui-même, ni le feed brut du marchand.
Feed marchand
↓
Stage / normalisation / enrichissement
↓
Offer data préparée
↓
Projection Builder
↓
Offer Projection
↓
Frontend / API / adapters
Pourquoi elle existe¶
Le Frontend ne doit pas interpréter directement les feeds marchands pour déterminer un prix, une disponibilité ou une promotion.
La Offer Projection fournit donc des données déjà préparées pour la lecture et stabilise le contrat entre les couches métier et les consommateurs.
Entrées¶
La projection peut être construite à partir de données déjà traitées en amont, notamment :
- identifiant d'offre ;
- produit associé ;
- marchand et source ;
- prix normalisé ;
- disponibilité ;
- informations promotionnelles déjà validées ;
- données de traçabilité ;
- états de qualité ou d'incertitude utiles.
Le Builder ne doit pas interroger un feed brut ni recalculer une règle métier qui appartient au Pipeline, au Domain Core ou à une verticale.
Sortie documentaire¶
Le contrat historique couvre notamment :
Identité¶
offer_idproduct_idmerchant_idsource_feed_id
Affichage¶
offer_titlecondition_labelmerchant_product_reference
Prix¶
priceold_pricesavingsaving_percentcurrency
Disponibilité¶
availabilitystock_statusdelivery_label
Marchand¶
merchant_namemerchant_logomerchant_urloffer_url
Promotion¶
promotion_labelpromotion_codepromotion_status
Traçabilité¶
observed_atprojected_atsource_nameprojection_status
Pour la forme exacte du DTO actif, vérifier le contrat canonique courant sous src/Contracts/Projection et le code consommateur concerné.
Prix et remise¶
La projection peut exposer un prix courant, un prix de référence, une économie et un pourcentage de remise lorsque ces valeurs ont été correctement préparées en amont.
Le Frontend ne doit pas recalculer la vérité commerciale.
Si old_price, saving ou saving_percent sont absents, le consommateur doit respecter cette absence plutôt que d'inventer une promotion.
Promotions¶
Une information promotionnelle affichée doit provenir d'un traitement explicite en amont.
Le Frontend peut afficher :
- un libellé ;
- un code ;
- un statut ;
- les autres champs prévus par le contrat.
Il ne doit pas déduire lui-même qu'une promotion est valable à partir de données incomplètes.
Lecture seule côté consommateur¶
Un consommateur de Offer Projection peut afficher et formater les données reçues.
Il ne doit jamais :
- modifier l'offre source ;
- recalculer le prix métier ;
- déduire une remise absente ;
- transformer une disponibilité inconnue en disponibilité positive ;
- fusionner plusieurs offres pour fabriquer une nouvelle offre ;
- masquer un
unknown,ambiguousouconflictutile au diagnostic.
Déterminisme¶
Pour le même état amont et la même version de règles, la projection doit produire le même résultat logique.
L'ordre des feeds, l'ordre SQL ou le contexte du template ne doivent pas modifier la valeur projetée.
Reconstruction¶
La Offer Projection est une donnée dérivée et doit pouvoir être reconstruite depuis les informations amont qui font autorité.
En cas de divergence entre la projection et la source préparée :
- observer la donnée normalisée ;
- vérifier les règles d'enrichissement ;
- observer l'entrée du Projection Builder ;
- comparer la sortie construite et la projection persistée ;
- utiliser le Write Service approprié pour toute réécriture ;
- vérifier ensuite le consommateur.
Diagnostic¶
Si un prix ou une disponibilité semble faux, éviter de corriger directement le template.
Vérifier plutôt :
- la valeur observée chez le marchand ;
- la normalisation ;
- les règles promotionnelles ou commerciales ;
- le Builder ;
- la projection persistée ;
- l'adapter ;
- le rendu Frontend.
Cette séquence permet d'intervenir dans la bonne couche.
Invariants¶
- Une Offer Projection est une vue dérivée.
- Elle ne remplace ni le feed brut ni le Product Domain.
- Les calculs commerciaux sont préparés avant le Frontend.
- Les données manquantes restent explicites.
- La projection est déterministe et reconstruisible.
- Le Builder ne porte pas la persistance.
- Toute réécriture persistante passe par un Write Service explicite lorsqu'il existe.