Domaines fonctionnels

Contrats

Les contrats définissent les conditions dans lesquelles une organisation peut acheter, vendre, être facturée ou bénéficier de droits particuliers.

Contrats

Les contrats définissent les conditions dans lesquelles une organisation peut acheter, vendre, être facturée ou bénéficier de droits particuliers.

À quoi sert un contrat ?

FonctionDescription
AutoriserOuvrir certains droits d'achat, de vente ou de gestion
EncadrerDéfinir conditions, commissions, frais, dépôt, facturation
RelierAssocier une organisation, un shop, une vente ou un type d'activité
ContrôlerServir de base aux vérifications avant publication ou facturation

Cycle de vie fonctionnel

flowchart TD
  draft["Contrat préparé"] --> review["Contrôle interne"]
  review --> active{"Validé ?"}
  active -->|Oui| actif["Contrat actif"]
  active -->|Non| correction["Correction ou rejet"]
  actif --> usage["Droits appliqués aux ventes, achats, factures"]
  usage --> archive["Archivage ou remplacement"]

Actions possibles

ActionQui ?Règle
Créer un contratAdmin autorisé (SALES.CONTRACT.MANAGE, ou INTERNAL.TEMPLATE.MANAGE pour un modèle)Un contrat non modèle est créé directement avec le statut Actif : il n'existe pas d'étape de validation ou d'« activation » séparée. Créer sur une organisation exige en plus ORGANISATION.ORGANISATION.MANAGE sur celle-ci.
ModifierAdmin autoriséCertaines modifications peuvent impacter les droits existants
Désactiver / Expirer / RéactiverAdmin autorisé (SALES.CONTRACT.MANAGE ou INTERNAL.TEMPLATE.MANAGE)Voir Effets des changements de statut
ArchiverAdmin autorisé (SALES.CONTRACT.ARCHIVE pour un contrat non modèle, SALES.CONTRACT.MANAGE/INTERNAL.TEMPLATE.MANAGE pour un modèle)Le contrat ne doit plus être utilisé pour de nouveaux droits
ConsulterOrganisation concernée ou adminLes informations confidentielles sont limitées

Règles de gestion

  • Les droits d'une session peuvent dépendre des contrats actifs.
  • Une mise en vente self-service peut exiger un contrat actif. Voir Éligibilité au self-service.
  • Certaines conditions financières doivent être présentes pour générer les factures.
  • Un contrat template ne doit pas être confondu avec un contrat appliqué à une organisation. Voir Contrat modèle vs contrat non modèle.
  • Une organisation parent peut transmettre certains droits seulement si cette transmission est prévue, via le transfert de contrat activé sur le contrat parent (meta.childTransfer). Concrètement, la vérification d'appartenance organisation-contrat est alors contournée : n'importe quelle organisation de la hiérarchie visible (l'organisation courante et ses ancêtres) peut sélectionner ce contrat pour créer une annonce, pas seulement les organisations filles directes.
  • Les accès ouverts par un contrat se cochent dans son onglet « Accès », regroupés par thème; ils plafonnent ce que les utilisateurs de l'organisation peuvent obtenir. Voir Calcul des droits d'accès.
  • Un « niveau d'accès » de contrat (meta.accessLevel : Admin, Client, Partenaire, Vendeur) est distinct de l'arbre des clés d'accès. Le niveau Admin n'est sélectionnable que si l'organisation du contrat est l'organisation propriétaire du shop.

Contrat modèle vs contrat non modèle

Contrat modèle (isTemplate: true)Contrat non modèle (isTemplate: false)
RattachementAucune organisation requise ; sert de gabaritRattaché obligatoirement à une organisation, reçoit une référence générée
Champs obligatoires à la créationNom du modèle (meta.templateName), statut, shop(s)Type de client, statut Actif, informations de vente complètes (contact commercial, contact support), mode de vente, organisation, shop(s), date de début
Droit de gestion requisINTERNAL.TEMPLATE.MANAGESALES.CONTRACT.MANAGE
Droit d'archivage requisINTERNAL.TEMPLATE.MANAGESALES.CONTRACT.ARCHIVE (distinct du droit de gestion)
UsageSert de source pour créer un contrat réel (report de la tarification, des autorisations, du mode de vente, etc.) ; ne peut pas être sélectionné pour mettre un lot en ventePeut être sélectionné pour créer une annonce et porte les droits réels d'une organisation
DuplicationDuplique un autre modèleDuplique un contrat réel (conserve previousContract comme référence à l'ancien)

Un contrat non modèle peut garder une référence vers le modèle dont il est issu (meta.sourceTemplateShortId), utilisée notamment pour retrouver le libellé du modèle d'origine.

Éligibilité d'un lot au self-service

Un contrat n'est proposable pour créer/rattacher une annonce en self-service que si toutes ces conditions sont vraies :

ConditionDétail
ShopLe shop courant doit figurer dans shopShortIds du contrat
StatutLe contrat doit être au statut Actif
RôleLe contrat doit être un contrat vendeur (customerType parmi Cessation, Public, Faillite, Société, Commerçant, Particulier) — les contrats acheteur sont exclus
TarificationLe contrat doit porter au moins un bloc de tarification de type Vente (transactionType: SALE), sinon aucune ligne de prix n'est disponible
OrganisationL'organisation du contrat doit correspondre à l'organisation du vendeur, sauf si le transfert de contrat (meta.childTransfer) est activé

Si le contrat sélectionné porte meta.self = true, l'annonce est marquée self-service (indexedMeta.saleInformation.selfService) et suit le workflow self-service (soumission directe possible en statut « à modifier », pas de validation de vente préalable côté back-office). Si meta.self est absent ou false, l'annonce suit le circuit de validation classique.

Exception : en mode impersonation (un admin agit pour le compte d'un vendeur), le self-service est toujours forcé à false, quelle que soit la valeur meta.self du contrat — un admin ne publie jamais en self-service au nom d'un tiers.

Restriction tarifaire par catégorie

Chaque bloc de tarification d'un contrat (meta.pricing[]) porte un champ categoryShortIds permettant, dans le formulaire d'édition, de restreindre visuellement ce bloc à certaines catégories de produits. Le calcul du frais standard appliqué à un lot (sélection du bloc de tarification, sélection de la ligne de palier), côté front, ne filtre pas par catégorie — seul le type du bloc (commission vendeur, frais acheteur, etc.) est utilisé pour retrouver le bloc à appliquer.

categoryShortIds est en revanche bien exploité côté backend, mais pour un calcul différent: le service de facturation (auctelia/book-keeper, buildCancellationInvoiceLines) l'utilise pour choisir le bloc de tarification à appliquer lors du calcul des frais d'annulation d'un lot — le bloc dont categoryShortIds contient la catégorie du lot est retenu; un bloc sans categoryShortIds (liste vide) s'applique à toutes les catégories, en repli. Ce filtre par catégorie ne s'applique donc pas au tarif de vente normal, seulement au calcul du frais d'annulation.

Tarification portée par le contrat (taux, commission, TVA)

Chaque bloc de tarification (meta.pricing[]) définit :

ChampRôle
typeNature du frais : commission vendeur, frais de dossier vendeur, frais acheteur, frais de service, etc.
chargeToPartie qui supporte le frais (vendeur / acheteur)
transactionTypeVente ou prestation de service
baseValuesDimension(s) sur laquelle le bloc est tarifé : palier de prix (levels), pourcentage, montant fixe, ou tranche de facturation — détermine quelles colonnes des lignes de tarification sont actives
pricingLines[]Une ou plusieurs lignes tarifaires (paliers), chacune avec un seuil de déclenchement (start), un plancher/plafond (min/max) et un montant (fix et/ou percent)

Calcul d'une ligne applicable pour un montant d'enchère donné : les lignes sont triées par seuil start décroissant, et la première dont le seuil est inférieur ou égal au montant est retenue (à défaut, la première ligne du bloc sert de repli). Le montant du frais est alors : pourcentage du montant si percent > 0, sinon montant fixe (fix), puis le résultat est borné par min et max de la ligne si définis.

Si la TVA vendeur (meta.sellerVat) est absente sur un contrat non modèle, TARS calcule une TVA par défaut à partir du pays de l'organisation, uniquement si celle-ci est une société assujettie à la TVA (type: COMPANY et subjectToVat: true) ; sinon la TVA par défaut est 0. Le taux appliqué provient d'une table de taux standard par pays (ex. FR 20 %, DE 19 %, BE 21 %, LU 17 %…), recalculée automatiquement quand l'organisation change sur le formulaire.

Effets des changements de statut (désactivation, expiration, réactivation)

ActionDepuisEffet
DésactiverActifStatut → Désactivé. Exige la saisie d'un motif, enregistré comme commentaire sur le contrat.
ExpirerActif ou DésactivéStatut → Expiré. Simple confirmation.
RéactiverDésactivé ou ExpiréStatut → Actif. Simple confirmation.
ArchiverActif, Désactivé ou ExpiréStatut → Archivé, aucune action possible ensuite.

Effet immédiat le plus important : dès qu'un contrat quitte le statut Actif, il disparaît immédiatement de la liste des contrats sélectionnables pour créer ou rattacher une nouvelle annonce (le filtrage par statut Actif est une des conditions d'éligibilité, voir plus haut) — un vendeur ne peut donc plus créer de nouveau lot avec ce contrat tant qu'il n'est pas réactivé. En revanche, cet effet n'est pas rétroactif : la tarification et les modes (facturation, paiement, reversement) sont recopiés dans les métadonnées de chaque annonce/lot au moment de sa création (indexedMeta.contractInformation) ; désactiver ou expirer le contrat ne modifie donc pas les lots déjà créés ni les commissions déjà appliquées sur des ventes en cours.

Ce qui est implémenté

  • Un contrat non modèle est rattaché à une organisation et reçoit une référence générée.
  • Les contrats modèles automatiques sont contrôlés pour éviter les doublons sur type, shop, année et type client.
  • Les conditions tarifaires sont validées à la création et à la mise à jour.
  • Si la TVA vendeur manque sur un contrat non modèle, TARS détermine une TVA par défaut depuis l'organisation.
  • Un contrat automatique peut faire avancer l'onboarding de l'organisation.
  • Une mise à jour de contrat peut propager des flags aux organisations enfants et réindexer l'organisation.
  • La fiche détail admin d'un contrat regroupe accès, empreinte bancaire, contacts, informations, libellés, tarification et paramètres, avec un arbre des clés d'accès accordées.
  • Les listes de contrats proposent des filtres rapides : « à échéance sous 90 jours » (indexedMeta.expirationDate), et « à moi » qui restreint aux contrats des organisations dont l'utilisateur connecté est account manager (champ accountManagers de l'organisation). Ambiguïté : le filtre « à valider » mentionné précédemment n'a pas été retrouvé dans le code des filtres de liste de contrats consulté.
  • La case d'engagement vendeur sur les conditions tarifaires affiche désormais explicitement le prix minimal réellement engagé (prix de réserve si défini, sinon prix de départ), pas un texte générique.
  • Les contrats utilisables pour créer une annonce sont restreints à ceux de l'organisation elle-même et de ses ancêtres, pas ceux de ses organisations filles.
  • Activer le rôle acheteur d'une organisation pour un shop, depuis sa fiche admin, déclenche automatiquement l'activation du contrat acheteur correspondant; en cas d'échec, l'enregistrement de la fiche n'est pas bloqué mais un message d'erreur dédié est affiché.

Actions par statut implémentées

Statut contratActions disponibles
Actif modèleArchiver
Actif non modèleArchiver, expirer, désactiver
DésactivéArchiver, expirer, réactiver
ExpiréArchiver
ArchivéAucune action

Impacts

DomaineImpact du contrat
AccèsDétermine ou limite des droits
VentePeut autoriser la mise en vente et la publication
FinanceSert aux commissions, factures et conditions
EnchèrePeut porter dépôt, limites ou conditions particulières
AuditLes changements contractuels doivent être traçables
Copyright © 2026