# Conformité, ou Conformité + Identité

Les deux offres d'une marque : ce que chacune permet, la réponse exacte de l'API quand une opération n'est pas comprise, et les règles d'un changement d'offre.

Source : https://docs.sealtrust.io/offres-conformite-et-identite/

---

En quittant cette page, vous saurez sur quelle offre est une marque, ce que
cette offre permet, ce que l'API répond quand une opération n'y est pas
comprise, et ce qui se passe quand une marque change d'offre.

## Deux offres, une par marque

Chaque marque est sur l'une de ces deux offres.

| | Conformité | Conformité + Identité |
| --- | --- | --- |
| Valeur dans l'API | `compliance` | `compliance_identity` |
| Passeport produit, par modèle ou par lot | oui | oui |
| QR code du modèle ou du lot, à imprimer | oui | non, un code par pièce |
| Une pièce, avec son propre jeton et son propre QR code | non | oui |
| Revendication, propriété, transfert, revente | non | oui |
| Retour, rachat, garantie, réparation, vol | non | oui |
| Sceau NFC | non | oui |

L'offre **Conformité** couvre le passeport produit que la réglementation
demande. Le passeport est porté par le modèle ou par le lot, et la marque
imprime le QR code de ce modèle ou de ce lot sur ses produits. Chaque produit
d'un même modèle porte le même code.

L'offre **Conformité + Identité** ajoute l'identité de chaque pièce : un jeton
par pièce, un QR code par pièce, et tout ce qui en découle pour la personne qui
achète le produit.

Une marque créée sans autre précision est sur l'offre Conformité + Identité.

## Lire l'offre d'une marque

La marque lit son offre dans la réponse de `GET /plan/status`, au champ
`offer`. Le champ `includes_identity` vaut `true` sur l'offre Conformité +
Identité et `false` sur l'offre Conformité.

Sur l'offre Conformité, la même réponse ne porte aucun quota de pièces, de
certificats ni de puces (`quotas.products`, `quotas.certificates`,
`quotas.tags` absents), aucun prix de pièce (`pricing.included_pieces_per_year`
et les champs `pricing.per_product_*` valent `null`), aucun prix par passeport
(`pricing.per_dpp_addon_cents` vaut `null`), `pricing.auth_methods_allowed`
vaut `"qr"` et `features.nfc_encoding` vaut `false` : elle décrit ce que la
marque peut faire, offre comprise.

```json
{
  "offer": "compliance",
  "includes_identity": false
}
```

## Qui pose l'offre

- **L'équipe SealTrust (superadmin)** pose l'offre de n'importe quelle marque.
- **Un revendeur** pose l'offre des marques clientes rattachées à son contrat,
  depuis l'onglet [Vos marques clientes](/console/reglages-marques-clientes/),
  où elle s'appelle le périmètre. Il la choisit aussi au moment d'ouvrir une
  marque cliente. Sa plateforme peut aussi la poser par l'API, avec une clef
  revendeur : voir [Remplir le catalogue par l'API](/api-catalogue/).
- **La marque elle-même** lit son offre et ne la change pas : l'offre est ce
  qu'elle a acheté.

Chaque changement est inscrit au journal d'audit, avec l'auteur, l'offre de
départ, l'offre d'arrivée et le nombre de pièces gardées.

## Ce que l'API répond quand une opération n'est pas comprise

Sur l'offre Conformité, toute opération sur une pièce est refusée avant que
rien ne soit écrit, mis en file ou envoyé à la blockchain. La réponse est
toujours la même.

```json
{
  "detail": {
    "code": "OFFER_EXCLUDES_IDENTITY",
    "offer": "compliance",
    "feature": "transfer",
    "message": "This brand is on the compliance offer, which does not include transferring a piece. It covers the product passport by model or by lot, and its QR code. The offer 'compliance_identity' includes the identity of every piece."
  }
}
```

Le code HTTP est `403`. Le champ `feature` dit ce qui a été refusé :

| `feature` | Ce qui a été refusé |
| --- | --- |
| `mint` | créer des pièces, à l'unité ou en lot, par la console, par l'API ou par une transaction multisignature, et imprimer l'archive des QR codes des pièces d'un lot |
| `encoding` | encoder des puces NFC |
| `nfc` | lire une puce NFC |
| `claim` | revendiquer une pièce, ou émettre son code d'achat |
| `transfer` | transférer une pièce, la retourner ou la racheter |
| `lifecycle` | retour, rachat, garantie, réparation, vol, gel ou destruction d'un jeton |
| `certificate` | le certificat d'une puce |
| `sellout` | déclarer la vente d'une pièce |

Ne rejouez pas un appel refusé avec ce code : il sera refusé de la même façon
tant que la marque reste sur l'offre Conformité.

Le QR code d'une pièce déjà créée, gardée d'une période Conformité + Identité,
reste servi par `GET /qr/product/{serial}` et `/download` : il mène à la page
de la pièce, qui reste lisible.

## Le QR code d'un modèle ou d'un lot

Une marque en offre Conformité imprime le QR code de son modèle ou de son lot.

- `GET /qr/01/{gtin}` dessine le code du modèle, qui encode `/01/{gtin}`.
- `GET /qr/01/{gtin}/10/{lot}` dessine le code du lot, qui encode
  `/01/{gtin}/10/{lot}`.
- Les mêmes adresses suivies de `/download` renvoient le même PNG en
  téléchargement. Le fichier porte le GTIN et, pour un lot, le numéro du lot :
  deux lots d'un même modèle ne se téléchargent jamais sous le même nom.

Le code n'est dessiné que si le passeport du modèle ou du lot est publié. Il
porte le domaine de la marque une fois ce domaine définitif, notre adresse
avant.

Dans tous les autres cas, ces quatre adresses répondent `410` avec le code
`ITEM_QR_ONLY` : une marque en offre Conformité + Identité imprime le code de
chaque pièce, et un passeport non publié n'a pas encore de code. La réponse est
la même pour un GTIN qui ne désigne rien.

Les codes déjà imprimés sous `/01/{gtin}` et `/01/{gtin}/10/{lot}` mènent
toujours à leur passeport, quelle que soit l'offre.

## Dans la console

La console lit l'offre de la marque affichée. Sur l'offre Conformité :

- les entrées du menu qui ne servent qu'à l'identité des pièces restent visibles, estompées, marquées « Identité » et suivies d'un cadenas : produits en attente de frappe, créer un produit, certificats, règles de revendication, retours, rachat, et la rubrique « Outils » du NFC. Le clic ouvre un courriel pour en parler avec nous au lieu de l'écran ;
- la palette de commandes ne propose pas ces écrans ;
- aucun bouton de frappe ni d'encodage n'apparaît, quel que soit le compte ;
- la fiche d'un modèle et la fiche d'un lot affichent le QR code à imprimer, une fois le passeport publié ;
- le tableau de bord, la liste de démarrage, la barre du haut et le choix de parcours ne proposent rien qui mène à une pièce : ni frappe, ni NFC, ni tunnel de revendication, ni compteur de pièces ;
- la page d'un lot ne propose ni de rattacher ni d'ajouter des exemplaires, la liste des produits vide ne propose pas d'en frapper, et la visite guidée saute l'étape des certificats ;
- un écran réservé à l'identité, ouvert par un lien enregistré ou une adresse tapée, affiche « Compris dans l'offre Conformité + Identité » au lieu de son contenu ;
- si l'API refuse quand même une opération, le message s'affiche dans la langue de la console.

Tant que l'offre n'est pas connue, par exemple quand le serveur ne répond pas, la console n'en retire rien : c'est le serveur qui applique l'offre.

## Sur la page publique d'une pièce

Une marque passée sur l'offre Conformité garde ses pièces. Leur page publique
affiche toujours leur passeport et leur historique, mais ne propose plus de les
revendiquer ni de les transférer. `GET /timeline/{identifier}` le dit dans le
champ `identity_included`, à `false`.

Dans l'espace de la personne qui détient une telle pièce, la fiche du produit ne
propose ni le transfert ni la demande de réparation. `GET /my-products` porte le
même champ `identity_included` pour chaque pièce. Si l'appel est fait quand
même, le site affiche une phrase dans la langue de la page, jamais le message
technique de l'API.

Sur le passeport d'une marque en offre Conformité, la section « Niveaux d'accès »
ne parle ni de propriétaire ni de puce NFC : le niveau public se lit par le QR
code du produit. `GET /brands/{brand_code}/branding` porte le champ
`includes_identity`, à `false` sur cette offre.

## Ce qui est compté

Une marque sur l'offre Conformité est comptée au nombre de ses passeports :
les produits en ligne dans l'année, les lots créés, et les passeports à la
pièce seulement quand un règlement les impose. Ce passeport à la pièce, sans
jeton, n'est pas encore proposé : aucune pièce ne peut être créée sur cette
offre, et ce compteur reste à zéro. Les scans ne sont jamais
comptés pour facturer. Un revendeur retrouve ces compteurs chaque mois dans
[le relevé d'usage de ses marques clientes](/console/reglages-releve-usage/).

Depuis septembre 2026, une marque sur l'offre Conformité + Identité est comptée
de la même façon, et ses pièces s'y ajoutent : l'offre Conformité + Identité
coûte le prix Conformité de son catalogue, plus ses pièces.

### Les scans de vos codes

Chaque scan du QR code d'un modèle ou d'un lot est compté, par code et par mois.
Il n'est jamais facturé : il se lit à côté du seuil d'usage raisonnable prévu au
contrat, et au-delà de ce seuil nous en parlons avec vous. Seules les visites
d'une personne qui arrive par le code sont comptées : ni les robots, ni les
aperçus de lien.

- Le relevé d'usage d'un revendeur montre, pour chaque marque cliente en offre
  Conformité, les scans du mois, ceux de l'année et le seuil de l'année.
- La marque les lit pour un mois avec `GET /admin/passport-scans?brand_id={id}&month=AAAA-MM`
  (session de la console). La réponse donne le total et une ligne par code :
  `level` (`model` ou `lot`), `gtin`, `lot` et `scans`.
- Le mois en cours est provisoire : les derniers scans le rejoignent en quelques
  minutes.

## Changer d'offre

Un changement d'offre ne supprime jamais rien, dans un sens comme dans l'autre.
L'offre décide de ce qui peut se faire à partir de maintenant, pas de ce qui
existe.

**De Conformité vers Conformité + Identité.** Toujours possible. Les passeports
de modèle et de lot restent ce qu'ils sont, et leurs codes imprimés continuent
de fonctionner. La marque peut créer des pièces à partir de maintenant.

**De Conformité + Identité vers Conformité.** Possible, et chaque pièce déjà
créée est gardée : son jeton, son propriétaire, son historique et sa page.
À partir de maintenant, aucune pièce n'est créée, et aucune opération n'est
faite sur les pièces existantes : ni revendication, ni transfert, ni lecture
NFC, ni cycle de vie. Leur page reste lisible.

Une opération commencée avant le changement ne se termine pas après. Un
transfert qui attend son code, un retour pas encore signé, une offre de rachat
pas encore acceptée, une vente déclarée sur une pièce déjà activée, la
modification d'une garantie existante et un nouveau code d'achat pour une pièce
qui en avait déjà un reçoivent le même refus `403`. L'ancien code reste tel
qu'il était, avec la date où il a servi.

Comme ce changement arrête quelque chose dont les clients de la marque se
servent peut-être, une marque qui a des pièces doit le confirmer. Une marque
qui a des lots en cours de création (en attente, préparés, en cours ou en
attente d'une nouvelle tentative) aussi : une fois la marque en offre
Conformité, un tel lot ne crée aucune pièce, et ses lignes finissent refusées
avec `OFFER_EXCLUDES_IDENTITY`. Un lot déjà en cours s'arrête à la pièce ou au
groupe suivant : l'offre est relue avant chaque envoi, et seul l'envoi déjà
parti au moment du changement va à son terme. Sans confirmation, la réponse est `409`, avec
le nombre de pièces et de lots concernés :

```json
{
  "detail": {
    "code": "OFFER_CHANGE_NEEDS_CONFIRMATION",
    "pieces": 3,
    "batches_in_flight": 0,
    "message": "This brand has pieces, or mint batches not finished. On the compliance offer every piece is kept, but no claim, transfer, NFC reading or lifecycle operation can be done on them, and a batch not finished creates no piece. Send the same request with confirm_pieces_kept=true to confirm."
  }
}
```

La console affiche alors le nombre de pièces gardées, les lots en cours, et un
bouton de confirmation, sous le choix de l'offre.

**Revenir en arrière.** Revenir à l'offre Conformité + Identité rétablit tout,
puisque rien n'a été supprimé.

Poser l'offre que la marque a déjà ne change rien et n'écrit rien.

Chaque changement est gardé avec sa date. Le relevé mensuel d'un revendeur compte chaque mois selon l'offre que la marque portait le premier jour du mois : un changement ne modifie jamais un mois déjà passé. Les pièces créées après un passage au pack en cours de mois sont chiffrées dans ce même mois, au prix du pack.

## Ce qu'il faut retenir

- Chaque marque est sur `compliance` ou sur `compliance_identity`, et la marque
  la lit dans `GET /plan/status`.
- Sur `compliance`, toute opération sur une pièce répond `403`
  `OFFER_EXCLUDES_IDENTITY`, et rien n'est écrit.
- Sur `compliance`, la marque imprime le QR code de son modèle ou de son lot.
- Un changement d'offre ne supprime rien. Vers `compliance`, une marque qui a
  des pièces, ou des lots en cours de création, confirme le changement.
