Maîtriser les soldes & promotions
Tout ce qu'il faut savoir pour orchestrer vos campagnes, du brouillon administratif au prix barré sur l'étiquette physique — en respectant la loi tunisienne du 30 décembre 1998 (article 23). Chaque mécanisme est illustré par un exemple concret reproductible étape par étape.
Manuel opérateur · TuniRFID Retail Suite · 13 sections · ~20 min de lecture
— 01 —
Vue d'ensemble
La feature Soldes & Promotions couvre 3 mécanismes complémentaires de réduction qui peuvent se cumuler lors d'une même vente :
1
🏷
Campagnes
Remise par article (SKU/famille/rayon), avec démarques progressives et taux par site.
2
🎁
Règles panier
BOGO, paliers quantité (simple ou barème progressif) et palier montant.
3
🎟
Codes promo
Saisis manuellement par le caissier (ex: AID20) — limités dans le temps, en nombre, etc.
Chacun obéit à des conditions précises et peut être limité dans le temps (dates, plages horaires, jours de la semaine), réservé à certains profils clients (première vente) ou ciblé sur des magasins spécifiques avec des taux différents.
💡
Best for customer
Quand plusieurs réductions sont éligibles sur un même article ou panier, le système retient automatiquement celle qui rapporte le plus au client — sauf si vous avez explicitement coché la case « Se cumule avec les soldes/promos ».
⭐
L'atelier catalogue articles (section dédiée ⭐)
Pour les utilisateurs avancés : un tableau-chantier ouvrable depuis n'importe quelle campagne (BROUILLON ou ACTIVE) permet de parcourir tout le catalogue filtré par site/famille/rayon/fournisseur, trier par ventes faibles ou stock, cocher les articles cibles un par un, ajouter des démarques inline (D1/D2/D3 sans fermer le tableau), et fixer des taux différents article par article. C'est l'outil de prédilection pour le boost mid-solde et la sélection chirurgicale.
Comment lire ce guide
Chaque section décrit un mécanisme, suivi d'un exemple concret reproductible en boutique. Tu peux suivre les étapes une à une dans ton interface pour créer la promo de l'exemple — c'est volontaire pour t'aider à apprivoiser le système.
— 02 —
Vocabulaire essentiel
| Terme | Définition |
| CAMPAGNE | Conteneur d'une opération commerciale appliquée à un ensemble d'articles. Contient au moins une démarque. |
| DÉMARQUE | Palier de remise actif sur une période. Une campagne peut en avoir plusieurs successives (D1 −30 % → D2 −50 % → D3 −70 %). |
| CIBLE | Article ou groupe d'articles concerné par la campagne : SKU précis, famille, rayon, collection (tag) ou fournisseur. Les cibles s'additionnent (union logique). |
| OVERRIDE PAR SITE | Taux spécifique appliqué à un magasin précis dans une campagne multi-sites. Remplace le taux des démarques pour ce store uniquement. |
| OVERRIDE PAR SKU | Taux spécifique appliqué à un article précis (ou plusieurs) pour une démarque donnée. Plus granulaire que l'override par site. Saisi depuis l'atelier catalogue (voir section ⭐). |
| ATELIER CATALOGUE | Le tableau ouvrable depuis "Parcourir & sélectionner SKUs" dans la modale campagne. Filtre/trie le catalogue, coche les articles, ajoute/édite des démarques en place, applique des overrides par SKU. Devient les cibles au save. |
| VENTES FAIBLES | Tri du tableau atelier qui remonte d'abord les SKUs avec 0 vente sur la fenêtre (7/14/30/60/90 j). Outil chirurgical pour le boost mid-solde. |
| RÈGLE PANIER | Promotion automatique qui s'applique au panier entier à l'encaissement (BOGO, palier quantité ou montant). Pas d'intervention caissier. |
| BARÈME PROGRESSIF | Mode avancé du palier quantité : chaque article reçoit une remise différente selon sa position (1er 0 %, 2e 20 %, 3e 30 %…). |
| CODE PROMO | Mot-clé court (ex: AID20) que le caissier saisit pour appliquer une remise au total panier. |
| PRIX BARRÉ | Ancien prix rayé visible côté client (étiquette, écran caissier, ticket). Obligation légale en Tunisie pour les soldes officiels. |
| CYCLE DE VIE | Une campagne traverse 4 statuts : BROUILLON (édition libre) → ACTIVE (édition légère uniquement) → EXPIRÉE ou ANNULÉE (lecture seule, duplication possible). |
— 03 —
Créer des soldes officiels — exemple complet
Les soldes officiels (été & hiver) sont encadrés par le ministère du Commerce : dates fixées, prix barré obligatoire, audit du prix de référence sur 90 jours. Choisis le type SOLDES OFFICIELS — le système gère ces obligations.
⚖️
Article 23 — Loi 1998
Le prix barré annoncé doit être inférieur ou égal au plus bas prix réellement pratiqué dans les 90 jours précédant la campagne. Si un SKU ne respecte pas cette règle, le système affiche un avertissement non bloquant — vous pouvez « Activer malgré tout », mais l'action est tracée dans l'audit prix (exigible en cas de contrôle).
📝 Exemple — Soldes d'hiver 2026 avec 3 démarques
Reproduis exactement les étapes suivantes pour créer une campagne complète :
- Sidebar → 🏷 Soldes & Promotions → bouton « + Nouvelle campagne » en haut à droite.
- Type → clique 🏷 Soldes officiels (active l'audit légal strict).
- Libellé → tape
Soldes d'hiver 2026 (ce texte apparaîtra sur le ticket de caisse).
- Date début campagne →
2026-01-29 · Date fin campagne → 2026-03-26 (dates officielles ministère).
- Description (optionnelle) →
Soldes officiels hiver — toutes catégories vêtements.
- Section 1. Sites concernés → laisse « Tous les sites du tenant » coché (tous magasins concernés).
- Section 2. Cibles articles → onglet Familles → tape
vê dans le filtre → coche « Vêtements » (toute la famille).
- Section 3. Démarques → clique « + Ajouter une démarque » 2 fois (pour en avoir 3 au total), puis remplis :
D1 — du 29/01/2026 au 15/02/2026Pourcentage · −30 %
D2 — du 16/02/2026 au 08/03/2026Pourcentage · −50 %
D3 — du 09/03/2026 au 26/03/2026Pourcentage · −70 %
- Section 4. Aperçu → clique « Calculer ». Tu vois apparaître : 124 SKUs impactés · prix moyen avant 67 DT · D1 → 46.90 DT · D2 → 33.50 DT · D3 → 20.10 DT.
- Clique « Sauvegarder et activer ».
- Si tous les SKUs ont un prix conforme aux 90 derniers jours → campagne ACTIVE immédiatement.
- Si certains SKUs sont suspects (prix gonflé récemment) → dialog ambre s'affiche avec la liste. Tu peux corriger, ou cliquer « Activer malgré tout (tracé) ».
Ce qui se passe après l'activation
- Le 29/01, un caissier scanne un T-shirt de la famille Vêtements à 45 DT → écran affiche 45.00031.500−30%.
- Le 16/02 à 00:15 UTC, le cron interne bascule automatiquement à la D2 → le même T-shirt scanné passe à 22.500 DT.
- Le 09/03, idem → 13.500 DT (D3 −70 %).
- Le 27/03, le cron détecte que la date de fin est dépassée → status passe à EXPIRÉE, retour au prix catalogue côté caisse.
- Chaque transition (CAMPAIGN_START, CAMPAIGN_STEP, CAMPAIGN_END) est tracée append-only dans
price_audit pour l'inspecteur du ministère.
— 04 —
Créer une promo libre — exemple Aïd El Fitr
Les promos libres (PROMO LIBRE) ne sont pas soumises au cadre légal des soldes officiels : Aïd, Mawled, Black Friday, anniversaire boutique, déstockage fin de série… Tu fixes les dates et les remises sans contrainte ministérielle.
⚠️
Ne pas confondre
Annoncer « Soldes » sur une promo libre est interdit en Tunisie. Le mot est réservé aux campagnes pendant les périodes officielles. Utilise plutôt « Promo », « Offre », « Déstockage » ou « Remise spéciale » dans le libellé.
📝 Exemple — Promo Aïd El Fitr 3 jours à −20 %
Imaginons que tu veux faire une promotion −20 % sur tout le rayon Parfumerie du 12 au 14 juin 2026 (autour de l'Aïd) sur ton magasin principal Tunis seulement :
- Sidebar → 🏷 Soldes & Promotions → « + Nouvelle campagne ».
- Type → clique ✨ Promo libre (pas d'audit légal).
- Libellé →
Promo Aïd El Fitr 2026.
- Date début →
2026-06-12 · Date fin → 2026-06-14.
- Description →
Offre Aïd communiquée par SMS aux clients fidèles (notes internes, non affichées au client).
- Section 1. Sites concernés → décoche « Tous les sites » → coche uniquement « Tunis Marsa » (ton magasin principal).
- Section 2. Cibles articles → onglet Rayons → tape
par → coche « Parfumerie ».
- Section 3. Démarques → 1 seule démarque suffit :
D1 — du 12/06/2026 au 14/06/2026Pourcentage · −20 %
- « Calculer » dans Aperçu → tu vois les SKUs du rayon Parfumerie en stock à Tunis (grâce au filtre auto par magasin, section 07 du guide).
- « Sauvegarder et activer » → la promo passe ACTIVE immédiatement, prête pour le 12 juin.
Résultat côté caisse
À Tunis Marsa, du 12 au 14 juin, chaque article du rayon Parfumerie scanné affichera son prix barré + le nouveau prix avec badge « −20 % » et libellé « 🏷 Promo Aïd El Fitr 2026 » sur le ticket. À Sfax ou Ariana (non cochés), aucune remise — comportement normal.
— ⭐ —
Atelier catalogue articles — le chantier des soldes
Le tableau ouvrable depuis chaque campagne te permet de travailler sur ton catalogue comme dans Excel : filtres, tri, sélection, override par article. C'est l'outil principal du power-user qui veut une sélection chirurgicale ou faire évoluer une campagne en cours.
Quand l'utiliser
- Sélection chirurgicale — Tu veux solder précisément 47 SKUs particuliers, pas une famille entière. Tu coches ces 47 lignes dans le tableau, plutôt que de cocher la famille et exclure 200 SKUs un par un.
- Taux différenciés par article — Sur la même campagne, certains articles à −30 %, d'autres à −50 %. Tu poses le taux directement dans la cellule de chaque SKU concerné.
- Boost mid-solde — Une campagne est ACTIVE depuis 2 semaines, tu observes les ventes et tu veux pousser à −50 % les articles qui n'ont rien vendu, en gardant −30 % sur les autres. Le tri "Ventes faibles" remonte les lents en premier.
- Préparation d'une grosse opération — Tu veux visualiser le catalogue en un coup d'œil avant de t'engager, avec stock + ventes récentes affichés.
Ouvrir le tableau
Dans la modale Nouvelle campagne (ou Édition campagne), descends jusqu'à la section 2 "Cibles articles" : tout en bas se trouve le bouton bleu 📦 Parcourir & sélectionner SKUs. Clique dessus — le tableau s'ouvre immédiatement, sans devoir sauvegarder la campagne au préalable.
Anatomie du tableau
Bandeau filtres (haut)
🔍 Recherche librecode, désignation, taille, couleur, code-barres
Famille / Rayon / Fournisseurfiltres rapides hérités du catalogue
TriCode · 📉 Ventes ↑ · 📈 Ventes ↓ · 📦 Stock ↑
Fenêtre ventes7 / 14 / 30 / 60 / 90 jours
Bandeau DÉMARQUES (juste sous les filtres)
D1 · % · 30 · 29/01 → 15/02 · ✕éditable inline
+ Ajouter démarquecrée D2/D3/D4 sans fermer le tableau
Colonnes du tableau (gauche → droite)
☐Sélection (sticky cross-pages)
Code · Désignation+ famille/rayon/fournisseur en sous-ligne
Variantecouleur / taille
Prix cat.prix catalogue (référence)
Vendus (Xj)🔴 0 · 🟠 1-2 · 🟢 ≥3 (sur la fenêtre choisie)
Stocktotal tous sites (gris si 0)
D1 / D2 / D3% / DT / =DT éditable + prix client preview en vert live
📝 Exemple A — Sélection chirurgicale de 50 articles précis
Tu veux solder à −40 % uniquement 50 t-shirts précis dans le rayon Vêtements (fin de série) :
- Nouvelle campagne → libellé
Déstockage T-shirts été → type Promo libre → dates de la campagne.
- Sites concernés → coche les magasins voulus.
- Section 2 Cibles articles → bouton 📦 Parcourir & sélectionner SKUs.
- Dans le tableau : filtre Famille → Vêtements, recherche →
t-shirt.
- Bandeau DÉMARQUES → vérifie que D1 est PERCENT 40. Sinon clique le chiffre et tape
40.
- Coche les 50 lignes voulues (la sélection survit aux changements de page).
- Bouton vert en bas droit « Confirmer sélection (50) ».
- Tu reviens à la modale campagne — un badge vert « 50 SKUs sélectionnés via le tableau » apparaît. La section "Cibles articles" classique (familles/rayons/etc.) est masquée pour éviter la confusion.
- « Sauvegarder et activer ».
Côté DB : chaque SKU coché devient une cible avec target_type=SKU. Pas de cible famille/rayon — uniquement ces 50 SKUs précis. L'audit est parfaitement traçable.
📝 Exemple B — Taux différenciés par SKU sur une même campagne
Soldes hiver D1 à −30 % global, mais tu veux pousser 10 articles vraiment bloqués à −50 % directement dès D1 :
- Ouvre la campagne en édition (BROUILLON ou ACTIVE en édition légère) → bouton 📦 Parcourir & sélectionner SKUs.
- Filtre tes articles bloqués (recherche ou filtre famille).
- Pour chaque ligne concernée, dans la colonne D1 : clique sur l'input numérique, remplace
30 par 50.
- Le label vert dessous se met à jour instantanément avec le nouveau prix client. Un badge orange OVERRIDE apparaît pour signaler l'écart par rapport au taux par défaut.
- « Confirmer sélection » → « Sauvegarder ».
Le système enregistre ces overrides dans discount_campaign_sku_overrides. À l'encaissement, le résolveur applique l'override avant la règle générale — best-for-customer garanti.
📝 Exemple C — Boost mid-solde sur les non-mouvants ⭐
Demande explicite de Fahmi. Ta campagne est ACTIVE depuis 2 semaines à −30 %. Tu observes que certains articles n'ont rien vendu. Tu veux les booster à −50 % en gardant le reste à −30 %.
- Sur la campagne ACTIVE → clique 🖊 Éditer (édition légère).
- Section 2 → 📦 Parcourir & sélectionner SKUs.
- Dans le bandeau filtres → dropdown Tri → choisis 📉 Ventes ↑ (lents d'abord).
- Dropdown Fenêtre ventes → choisis 14 j (depuis le début de la campagne).
- Le tableau se réorganise : les lignes 🔴 rouges (0 vente) remontent en haut.
- Coche les lignes rouges (utilise ☐ checkall en en-tête pour cocher la page entière si toutes sont à 0).
- Bouton jaune « Appliquer % en bloc » → modale → tape
50 → Appliquer.
- Tu vois maintenant les valeurs D1 changer à 50 pour les lignes cochées, prix vert recalculé live, badge OVERRIDE orange affiché.
- « Confirmer sélection » → « Sauvegarder les modifications ».
📊
Pourquoi c'est légalement propre en SOLDES_OFFICIELS
Tu restes dans la même campagne (1 seul prix de référence 3 mois), tu ne crées pas de promo parallèle, et l'audit price_audit trace chaque variation. L'inspecteur voit clairement « D1, override SKU XYZ, 30 % → 50 %, raison: CAMPAIGN_STEP_OVERRIDE ».
Gestion des démarques depuis le tableau
Le bandeau jaune DÉMARQUES juste au-dessus du tableau te permet d'ajouter / éditer / supprimer les paliers sans fermer la fenêtre. Chaque modification recharge le tableau pour recalculer les preview prix.
- + Ajouter démarque : crée D(N+1) avec type PERCENT 30 %, dates héritées de la dernière démarque.
- Éditer un chip : change le menu type (%, DT, =DT), le chiffre, ou les dates → autosave + reload tableau.
- ✕ sur un chip : supprime la démarque (sauf si c'est la dernière restante). Les overrides pointant dessus sont purgés.
Boutons d'action en bloc (bandeau orange)
| Bouton | Effet sur les SKUs cochés |
| % Appliquer en bloc | Ouvre une modale demandant un % (0-100). Applique ce taux uniforme aux SKUs cochés sur toutes les démarques. Écrase les overrides existants des lignes cochées. |
| 🚫 Exclure sélection | Marque les SKUs cochés comme EXCLUS de la campagne (ligne rouge italique EXCLU, prix non remisé en caisse). Bouton ↩ Restaurer pour annuler. |
| ↺ Réinitialiser | Retire tous les overrides des SKUs cochés. Ils reviennent au taux générique de chaque démarque. |
Mode "Atelier" vs Mode classique (widget Cibles)
Tu as deux façons mutuellement exclusives de cibler des articles dans une campagne :
| Mode classique (widget Cibles) | Mode Atelier ⭐ |
| Tu ajoutes des familles/rayons/tags/fournisseurs/SKUs via les onglets autocomplete. Les cibles s'additionnent par union. |
Tu coches des SKUs un par un dans un tableau visuel filtrable. |
| Rapide pour « toute la famille Vêtements ». |
Précis pour « ces 47 SKUs spécifiques ». |
| Pas d'override par SKU. |
Override par SKU, exclusion ciblée, bulk %, preview live. |
Dès que tu confirmes une sélection via l'atelier, le widget Cibles classique est masqué dans la modale campagne (avec un message info) et un badge vert « X SKUs sélectionnés via le tableau » affiche le compteur. Pour revenir au mode classique, clique Effacer dans le badge.
⚠️
Limite volumétrique
Le mode Atelier crée une cible (target_type=SKU) par article coché. Si tu coches 5 000 SKUs, ce sont 5 000 lignes en DB. Pour des sélections massives homogènes (toute une famille), préfère le mode classique — c'est 1 seule cible target_type=FAMILLE. L'atelier est conçu pour des sélections chirurgicales (50-500 SKUs typiquement).
— 05 —
Codes promo manuels — exemple campagne SMS
Un code promo (CODE) est un mot-clé court que le caissier tape à l'encaissement (ex: BIENVENUE10). Idéal pour les opérations communiquées par SMS, flyers ou mailing client.
📝 Exemple — Code BIENVENUE10 pour nouveaux clients
Tu veux distribuer un code −10 % aux 500 premiers nouveaux clients, valable 30 jours, panier minimum 50 DT, réservé à leur 1re vente :
- Page Soldes & Promotions → descend à la 2e card « 🎟 Codes promo manuels » → « + Nouveau code ».
- Code → tape
BIENVENUE10 (ou clique 🎲 pour générer un code aléatoire 6 caractères style K7M4P9).
- Libellé interne →
Bienvenue nouveaux clients 2026.
- Type → Pourcentage · Valeur →
10.
- Valide à partir du →
2026-05-15 · Valide jusqu'au → 2026-06-15 (30 jours).
- Panier minimum →
50 DT (évite les abus type 1 chaussette à 3 DT).
- Max utilisations →
500 (cap budget marketing).
- Cumul → décoché par défaut (exclusif avec les soldes — protège la marge).
- Description →
Code envoyé par SMS aux nouveaux inscrits du programme fidélité.
- Ouvre « Conditions avancées » en bas → coche « Réservé aux premières ventes d'un client ».
- « Enregistrer » → le code apparaît immédiatement dans la liste avec compteur
0/500.
Utilisation côté caissier
- Le caissier scanne le panier du client → total ≥ 50 DT.
- Il sélectionne le client identifié dans SalePoint (sinon le code « première vente » refusera).
- Sous le total panier apparaît le bouton vert 🎟 Appliquer un code promo.
- Modale gros caractères → tape
BIENVENUE10 → Entrée.
- Si le client n'a aucune vente antérieure → ligne verte dans le panier : 🎟 BIENVENUE10 −X.XXX DT. Sinon message : « Code réservé aux nouveaux clients (déjà des ventes) ».
- Le compteur du code passe à
1/500 automatiquement après finalisation du paiement.
🔒
Code immutable une fois utilisé
Dès qu'un code a servi sur au moins une vente, il ne peut plus être supprimé (pour préserver la traçabilité comptable). Tu peux seulement le désactiver avec le bouton orange — il devient invalide pour de futures ventes sans effacer l'historique.
Variantes de type
| Type | Exemple |
| Pourcentage | AID20 avec valeur 20 → −20 % sur le total panier |
| Montant DT | MERCI5 avec valeur 5 → −5.000 DT déduits du total |
| Prix forcé | FLAT99 avec valeur 99 → le total panier passe à 99.000 DT pile (rare, pour offres « tout à 99 DT ») |
— 06 —
Règles panier — BOGO, paliers, barème progressif
Les règles panier (RÈGLE PANIER) s'appliquent automatiquement à l'encaissement, sans intervention du caissier. 3 types disponibles, et le palier quantité a un mode avancé « Barème progressif ».
Quand plusieurs règles sont éligibles sur le même panier, le système calcule chacune et applique celle qui rapporte le plus au client. Une seule règle s'applique par vente (les règles ne se cumulent pas entre elles, mais elles se cumulent avec un code promo manuel).
📝 Exemple A — BOGO « 2 achetés, le 3e offert »
- Page Soldes & Promotions → 3e card « 🎁 Règles panier » → « + Nouvelle règle ».
- Libellé →
Pack 2+1 offert (visible sur le ticket).
- Type → clique la carte 🎁 BOGO.
- Articles achetés (X) →
2 · Articles offerts (Y) → 1.
- Date → laisse vide pour « toujours actif », ou fixe une période.
- « Enregistrer ».
Résultat en caisse : panier de 3 articles à 10/25/40 DT → le moins cher (10 DT) devient gratuit → ligne violette « 🎁 Pack 2+1 offert −10.000 DT ». Panier de 6 articles ? 2 packs de 3 → 2 articles gratuits (les 2 moins chers).
📝 Exemple B — Palier quantité simple « ≥ 3 articles, −20 % »
- « + Nouvelle règle » → Libellé
Trio gagnant −20 %.
- Type → 📦 Palier quantité.
- Mode → « Palier simple » (par défaut).
- À partir de N articles →
3.
- Remise → champ Pourcentage
20 (laisse Montant DT vide).
- « Enregistrer ».
Résultat : panier <3 articles → pas de remise. Panier ≥3 articles → −20 % sur le total panier. Plus simple que BOGO, donne une remise plus prévisible.
📝 Exemple C — Barème progressif (mode avancé du palier quantité)
Imaginons que tu veux récompenser les gros paniers de façon graduée : 1er article plein tarif, 2e à −20 %, 3e à −30 %, 4e et au-delà à −40 %. Le mode Barème progressif permet exactement ça.
- « + Nouvelle règle » → Libellé
Récompense fidélité progressif.
- Type → 📦 Palier quantité.
- Mode → bascule sur « Barème progressif » (le bouton bleu).
- Saisis le barème, palier par palier (max 10) :
1er article0 %
2e article20 %
3e article30 %
4e article40 %
- Stratégie → « Moins chers d'abord » (best-for-customer — le 1er palier 0 % s'applique à l'article le moins cher, donc les remises maxi vont sur les plus chers).
- Alternative : « Plus chers d'abord » → l'article le plus cher garde son prix, les moins chers reçoivent les remises maxi (protection marge).
- « Enregistrer ».
Résultat en caisse avec panier 4 articles à 10/25/30/50 DT :
Stratégie « Moins chers d'abord »
10 DT × 0 %−0.000 DT
25 DT × 20 %−5.000 DT
30 DT × 30 %−9.000 DT
50 DT × 40 %−20.000 DT
Remise totale (best for customer)−34.000 DT
Pour un 5e article (hors barème de 4), le système plafonne sur le dernier palier saisi (40 %).
📝 Exemple D — Palier montant « ≥ 200 DT, −10 DT »
- « + Nouvelle règle » → Libellé
Pack premium 200+.
- Type → 💰 Palier montant.
- À partir de Y DT TTC →
200.
- Remise → Montant DT
10 (laisse Pourcentage vide).
- « Enregistrer ».
Résultat : panier < 200 DT → rien. Panier ≥ 200 DT → −10 DT fixe sur le total. Idéal pour pousser les paniers vers un seuil (un client à 195 DT ajoutera souvent un petit article pour franchir les 200 DT et économiser 10 DT).
— 07 —
Multi-magasins — filtre stock & override par site
Quand tu gères plusieurs magasins (Tunis, Sfax, Ariana…), 2 mécanismes complémentaires t'aident à orchestrer des campagnes ciblées sans erreur.
Filtre auto par magasins sélectionnés
Dans la modale Nouvelle campagne, dès que tu coches un ou plusieurs magasins (section 1 « Sites concernés »), les onglets cibles (Articles SKU, Familles, Rayons, Fournisseurs) se filtrent automatiquement : tu ne vois que les articles présents dans stock_levels d'au moins un magasin coché. Évite de cibler par erreur un article inexistant dans le magasin sélectionné.
Les Tags (collections libres) ne sont PAS filtrés — ils sont indépendants du stock par site.
📝 Exemple — Filtre stock
- Nouvelle campagne → section 1 → décoche « Tous les sites du tenant ».
- Coche uniquement « Sfax ».
- Section 2 → onglet Articles (SKU) → tape
n → tu vois uniquement les SKUs en stock à Sfax (Nike présent localement, par ex.). Si « Tunis » aussi a un référencé Nike mais Sfax non, il ne remontera pas.
- Coche « Tunis » en plus → liste élargie aux articles présents à Sfax OU Tunis.
ℹ
Définition de « en stock »
Le filtre cherche les SKUs ayant une ligne dans stock_levels (quantité ≥ 0). Inclut donc les ruptures momentanées — pratique pour préparer une campagne sur un arrivage proche.
Override taux par site (taux différencié)
Sur une même campagne, tu peux appliquer un taux différent par magasin. Cas d'usage : campagne « Aïd » avec −30 % au magasin amiral (forte marge), −20 % à l'annexe Ariana, −15 % à Sfax (loyer plus élevé).
📝 Exemple — Override taux par site
- Nouvelle campagne → section 1 → décoche « Tous les sites », coche tes 3 magasins.
- Sous chaque site coché, une zone grise apparaît avec « Taux spécifique pour ce site (override) ».
- Pour Tunis Marsa : laisse la case décochée → applique le taux du step actif (ex: −30 % défini dans la démarque).
- Pour Ariana : coche la case → choisis Pourcentage / Valeur
20.
- Pour Sfax : coche la case → choisis Pourcentage / Valeur
15.
- Démarques : configure normalement (ex: D1 −30 % du 12 au 14/06).
- Sauvegarder et activer.
Résultat : sur le même article à 100 DT et la même campagne, le caissier voit :
Tunis Marsa (pas d'override)−30 % → 70.000 DT
Ariana (override 20 %)−20 % → 80.000 DT
Sfax (override 15 %)−15 % → 85.000 DT
— 08 —
Conditions avancées — heures, jours, première vente
En bas de chaque modale (Code promo OU Règle panier), un bloc repliable « Conditions avancées » permet d'affiner finement la validité :
- Plage horaire : la promotion est active uniquement entre HH:MM et HH:MM. Ex: 09:00 → 12:00 pour une promo « Happy Hour matin ». Supporte le passage minuit (22:00 → 06:00).
- Jours autorisés : cochez les boutons L · M · M · J · V · S · D. Aucun coché = tous les jours.
- Première vente client (codes promo uniquement) : la promo n'est valide que si le caissier a sélectionné un client identifié n'ayant aucune vente antérieure complétée dans la tenant DB. Idéal pour les codes « Bienvenue ».
📝 Exemple — Code HAPPYHOUR uniquement le matin du weekend
Tu veux qu'un code donne −15 % uniquement les samedis et dimanches, entre 09:00 et 12:00 :
- « + Nouveau code » → code
HAPPYHOUR · Pourcentage 15.
- Ouvre « Conditions avancées » (flèche ▶ → ▼).
- Plage horaire de →
09:00 · à → 12:00.
- Jours autorisés → clique S (samedi) et D (dimanche). Les autres restent gris.
- « Enregistrer ».
Résultat : un caissier qui tape HAPPYHOUR un mardi à 14:00 voit le message « Valable uniquement samedi, dimanche ». Saisie le samedi à 10:30 → appliqué.
🕒
Référentiel horaire
L'heure prise en compte est celle du serveur où tourne TuniRFID (généralement UTC, le fuseau Africa/Tunis est UTC+1). Pour des plages serrées, teste depuis SalePoint avant de communiquer le code.
— 09 —
Cycle de vie d'une campagne
Une campagne traverse 4 statuts. Les actions disponibles changent selon le statut, pour préserver la traçabilité légale.
| Statut | Actions disponibles |
| BROUILLON | ▶ Activer · 🖊 Éditer (pleine édition) · 🏷 Étiquettes · 🗑 Trash |
| ACTIVE | 📊 Stats · 🏷 Étiquettes · 🖊 Éditer (légère) · ✕ Annuler |
| EXPIRÉE / ANNULÉE | 📊 Stats · 📋 Dupliquer |
Édition légère sur une campagne ACTIVE
Une fois ACTIVE, tu peux modifier uniquement le libellé, la description et prolonger la date de fin (pas la raccourcir). Type, dates début, sites, cibles et démarques sont verrouillés visuellement (sections grisées) pour protéger l'audit légal et la cohérence des ventes en cours.
📝 Exemple — Prolonger une campagne qui marche bien
- Sur ta campagne ACTIVE, clique 🖊 Éditer (gris, avant Annuler).
- Le titre devient « Édition légère — [libellé] ». Les sections 1, 2, 3 sont grisées.
- Date fin → change
2026-03-26 en 2026-04-15 (3 semaines de plus).
- Optionnel : ajuste le libellé ou la description.
- « Enregistrer les modifications » → la dernière démarque est automatiquement étendue jusqu'à la nouvelle date_fin.
Dupliquer une campagne EXPIRÉE / ANNULÉE
Une campagne réussie l'an dernier ? Tu peux la rejouer cette année en 1 clic via le bouton 📋 Dupliquer (cyan) :
- Filtre par statut → EXPIRÉE pour retrouver tes anciennes campagnes.
- Clique 📋 Dupliquer sur la campagne souhaitée → confirmation.
- Une nouvelle campagne BROUILLON est créée, suffixée « (copie) ».
- Tous les paramètres conservés : type, cibles, sites, overrides, démarques (avec leurs valeurs).
- Dates reset : début → aujourd'hui, fin → +14 jours. Démarques décalées proportionnellement.
- La modale s'ouvre automatiquement → ajuste les dates → « Sauvegarder et activer ».
— 10 —
Impression d'étiquettes prix barré
Sur chaque ligne de campagne (BROUILLON ou ACTIVE), un bouton violet 🏷 Étiquettes ouvre la modale d'impression. Choisis le format selon ton parc matériel :
Format CB (TSC TTP-244)
- Étiquettes 50×30 mm en TSPL via l'agent local TuniRFID PrintAgent (port 9110).
- Template système « Soldes » : enseigne en haut, désignation, code-barres CODE128, prix barré + nouveau prix + badge −X %.
- Envoi en lot — une étiquette par SKU ciblé, avec quantité paramétrable (1 à 100 par SKU).
Format RFID (Zebra ZD621R)
- Étiquettes 44×11 mm en ZPL via Zebra Browser Print (port 9100).
- Mode visuel seul : l'étiquette imprimée n'encode pas de nouvel EPC. Le tag RFID original de la pièce reste fonctionnel ; tu colles la nouvelle étiquette par-dessus pour le visuel « soldes ».
- Avantages : pas de collision EPC, impression rapide, pas de pollution sku_units.
Exemple d'étiquette imprimée (CB ou RFID)
|||| ||| || |||| | |||
T-SHIRT NIKE M
45.000 DT31.500 DT−30%
📝 Exemple — Réimprimer toutes les étiquettes au lancement
- Sur ta campagne ACTIVE → clique 🏷 Étiquettes (violet).
- Choisis le format CB ou RFID.
- Quantité par SKU →
1 (modifie si tu veux plusieurs étiquettes par référence).
- Démarre l'agent local d'impression si pas déjà actif.
- « Lancer l'impression » → toutes les étiquettes des SKUs ciblés sortent automatiquement avec leur prix barré + nouveau prix.
— 11 —
Conformité légale tunisienne
Le décret du 30 décembre 1998 (article 23) encadre strictement les soldes en Tunisie. Le système TuniRFID couvre tes obligations :
- Audit prix 3 mois — Au moment d'activer une campagne SOLDES_OFFICIELS, le système compare chaque SKU au plus bas prix pratiqué dans les 90 derniers jours et bloque/alerte si l'écart est suspect.
- Trace append-only — Chaque variation de prix est enregistrée dans la table
price_audit avec raison (MANUAL_EDIT, RECEPTION, CAMPAIGN_START, CAMPAIGN_STEP, CAMPAIGN_END), date, auteur et campagne associée. Impossible de modifier ou supprimer une ligne.
- Export CSV ministère — Bouton « 📋 Export audit » en haut de la page Soldes. Format UTF-8 avec BOM compatible Excel français, séparateur point-virgule. Filtrable par date. Limite 50 000 lignes par export.
- Prix barré obligatoire — Le système l'impose sur tous les canaux d'affichage : écran caissier, ticket de caisse, étiquette physique CB et RFID.
📝 Exemple — Préparer un export pour contrôle
- Inspecteur demande l'historique des variations de prix des 90 derniers jours.
- Page Soldes & Promotions → clique « 📋 Export audit » en haut.
- Modale → clique le raccourci « 90 derniers jours » (les 2 dates se remplissent automatiquement, conforme à la borne légale).
- « Exporter le CSV » → le fichier
price_audit_2026-MM-DD.csv se télécharge.
- Ouvre dans Excel → colonnes : Date/Heure, Code article, Désignation, Couleur, Taille, Prix avant, Prix après, Variation, Raison, Type campagne, Libellé.
🚨
En cas de contrôle ministère
Présente le CSV pour la période demandée. Chaque variation est tracée avec horodatage et auteur. Si tu as forcé l'activation malgré une alerte audit 3 mois, le champ forced=true apparaît dans la trace : prépare la justification commerciale (rupture stock, prix d'arrivage différent, etc.).
— 12 —
Ordre d'application & anatomie du ticket
Quand plusieurs réductions sont actives, le système les applique séquentiellement dans cet ordre précis. Le caissier voit chaque étape distinctement sur le ticket.
- Prix par article (soldes/promos campagne) — Chaque scan résout la meilleure campagne applicable au SKU (best for customer). Le prix unitaire effectif est barré + nouveau prix dans le panier.
- Règle panier — Une fois tous les articles scannés, le système évalue toutes les règles BOGO/paliers/barème actives et applique celle qui rapporte le plus. Ligne dédiée violette dans le récap : « 🎁 [libellé règle] −X.XXX DT ».
- Code promo manuel — Si le caissier saisit un code, il s'applique sur le total déjà réduit par la règle panier. Ligne dédiée verte : « 🎟 [CODE] −X.XXX DT ».
- Timbre fiscal — Ajouté en dernier au total TTC final.
Anatomie d'un ticket avec 3 niveaux de remise cumulés
Total HT63.027
TVA 19 %11.973
Sous-total TTC (articles soldés)75.000
🎁 Pack 2+1 offert−12.500
🎟 AID20−5.000
Timbre fiscal0.600
TOTAL TTC58.100 DT
Ce ticket combine donc : campagne soldes article-par-article (sous-total déjà à 75 DT au lieu du catalogue) + règle panier BOGO 2+1 + code promo manuel AID20. Économie totale visible pour le client.
— 13 —
Statistiques, audit & FAQ
Statistiques campagne
Une fois une campagne ACTIVE ou EXPIRÉE, le bouton bleu 📊 Stats ouvre une modale avec 4 KPI principaux :
| KPI | Définition |
| Articles vendus / ciblés | SKUs uniques vendus parmi ceux ciblés (taux de couverture). |
| CA brut | Chiffre d'affaires au prix catalogue (sans la promo). |
| CA net | Chiffre d'affaires réel encaissé (avec promo appliquée). |
| Marge avant / après | Marge brute moyenne en pourcentage, avant et après la campagne. |
En bas de la modale : Top 10 articles les plus vendus + courbe d'évolution journalière du CA net (avec sauts visibles aux transitions de démarques).
Les codes promo et règles panier ont leur propre compteur d'utilisations visible directement dans leur table.
Tick journalier — quand l'utiliser
Le bouton ⏱ Tick journalier en haut de la page force l'expiration automatique des campagnes dont date_fin est dépassée. Normalement déclenché à 00:15 UTC chaque nuit par le cron interne — le bouton manuel sert à :
- Tester l'expiration sans attendre minuit (démo client par exemple).
- Forcer une mise à jour après prolongation puis raccourcissement de date_fin.
- Rattraper un skip de cron (rare).
FAQ & pièges courants
« Mon code promo refuse de s'appliquer » — Le message d'erreur précise la cause : code expiré, panier min non atteint, conditions horaires non remplies, articles déjà en soldes (si cumul désactivé), client requis pour les codes « première vente ». Lis le message attentivement.
« Une campagne reste ACTIVE alors que la date est dépassée » — Le passage auto en EXPIRÉE est géré par un cron à 00:15 UTC. Si tu ne peux pas attendre, clique sur Tick journalier pour forcer.
« Je veux modifier complètement une campagne déjà activée » — Impossible (traçabilité légale). Tu peux faire de l'édition légère (libellé/description/extension date_fin) ou Annuler + créer une nouvelle. L'annulation est tracée CAMPAIGN_END.
« Je veux relancer une campagne EXPIRÉE l'année prochaine » — Filtre par statut EXPIRÉE → bouton 📋 Dupliquer. Une nouvelle campagne BROUILLON est créée avec tous les paramètres préservés, dates reset à +14j à partir d'aujourd'hui.
« Le caissier ne voit pas le bouton Soldes dans SalePoint » — Le bouton 🏷 Soldes côté SalePoint n'est visible qu'aux utilisateurs avec rôle MANAGER ou ADMIN. Volontaire pour protéger l'admin des campagnes.
« Comment imprimer des étiquettes RFID sans ré-encoder l'EPC ? » — Comportement par défaut. Le format RFID est explicitement en mode visuel seul. Aucun nouvel EPC alloué, tag d'origine préservé. Tu colles la nouvelle étiquette par-dessus.
« Mon URL ne reste pas la même après F5 » — Le routage path (ex: tunirfid.app/promotions) est actif. Si F5 retourne au Tableau de bord, vide ton cache navigateur (Ctrl+Shift+Suppr → Cache).
« Le total TTC fait apparaître un millime d'écart » — Convention comptable d'absorption des arrondis sur la TVA — le système garantit somme(prix_ttc × qty) au millime près. Si l'écart persiste, vérifie que tu n'as pas modifié prix_ht au lieu de prix_ttc dans le catalogue.
FAQ — Atelier catalogue articles ⭐
« J'ai changé une valeur dans la colonne D1 mais le prix vert ne bouge pas » — Si tu vois encore ce comportement après une mise à jour, fais un Ctrl+Shift+R pour forcer le rechargement de l'app. Depuis la dernière version, le prix vert se recalcule à chaque caractère tapé (sans perte du focus de l'input).
« Je ne vois qu'une seule colonne D1 alors que je veux 3 paliers » — Normal : le tableau affiche une colonne par démarque définie dans la campagne. Pour en ajouter, utilise le bandeau jaune DÉMARQUES juste au-dessus du tableau → bouton « + Ajouter démarque ». Tu peux aussi le faire depuis la section 3 de la modale campagne — c'est la même source de vérité.
« J'ai coché 200 SKUs, puis j'ai changé de page, ma sélection a disparu ? » — Non, la sélection est sticky et survit aux changements de page et de filtre. Le compteur en bas « X sélectionné(s) » reflète le total cumulé. Si tu changes les filtres puis reviens, les cases cochées réapparaissent.
« Comment annuler tous mes overrides d'un seul coup ? » — Coche toutes les lignes (case maîtresse dans l'en-tête du tableau) → bouton ↺ Réinitialiser. Les SKUs reviennent au taux générique de chaque démarque.
« La case "Vendus" affiche 0 pour tout, c'est normal ? » — Vérifie la fenêtre ventes (par défaut 30 jours). Pour un magasin neuf ou en démo, étends à 90 jours. Le filtre store (section 1 de la campagne) limite aussi le scope : si tu n'as coché que le magasin Sfax et que Sfax n'a rien vendu, c'est 0 partout — élargis aux autres sites ou décoche le filtre.
« Puis-je booster une campagne ACTIVE avec l'atelier ? » — Oui, c'est exactement le cas d'usage du boost mid-solde. Sur la campagne ACTIVE → 🖊 Éditer (édition légère) → Parcourir & sélectionner SKUs → tri Ventes ↑ → coche les lents → Appliquer % en bloc 50 % → Sauvegarder. L'audit price_audit garde la trace de la modification (raison CAMPAIGN_STEP_OVERRIDE).
« Le widget Cibles classique a disparu de ma modale » — Normal si tu as utilisé l'atelier. Un badge vert « X SKUs sélectionnés via le tableau » est affiché à la place. Pour revenir au mode classique, clique Effacer dans le badge — le widget réapparaît et l'atelier est vidé.
📖
Besoin d'aller plus loin ?
Le plan technique complet (architecture, schéma DB, endpoints) est documenté en interne. Pour les questions métier ou bugs persistants, contacte ton responsable TuniRFID.