> ## Documentation Index
> Fetch the complete documentation index at: https://docs.solya.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Workflows — actions de plan

> Les actions CREATE_OR_GET_PLAN et ADD_ITEMS_TO_PLAN : chaque champ de config, par type de plan, avec toutes les stratégies et périmètres.

Les deux actions de construction de plan créent (ou réutilisent) un plan, puis le remplissent. Les deux autres
actions — webhook et e-mail — se trouvent sur la page
[Intégrations](/fr/developers/workflows/integrations).

## CREATE\_OR\_GET\_PLAN

Crée un plan, ou en réutilise un correspondant, pour l'exécution. Champs communs : `name` et
`description` (les deux interpolés). Le reste dépend de `planType`.

<AccordionGroup>
  <Accordion title="RESTOCK">
    ```json theme={null}
    {
      "actionType": "CREATE_OR_GET_PLAN",
      "planType": "RESTOCK",
      "brandSource": { "kind": "static", "brandId": "<uuid>" },
      "collectionSource": { "kind": "static", "collectionId": "<uuid>" },
      "deadline": { "kind": "relative", "offsetDays": 30 }
    }
    ```

    `brandSource` et `collectionSource` sont chacun `{ kind: "static", … }` ou
    `{ kind: "fromTrigger" }` (résoudre à partir de l'entité déclencheur). `deadline` est un
    [décalage de date](/fr/developers/workflows/integrations#date-offsets).
  </Accordion>

  <Accordion title="REBALANCE">
    ```json theme={null}
    {
      "planType": "REBALANCE",
      "outgoingShopId": "<uuid>",
      "ingoingShopId": "<uuid>",
      "collectionSource": { "kind": "fromTrigger" },
      "deadline": { "kind": "relative", "offsetDays": 14 }
    }
    ```

    `outgoingShopId` / `ingoingShopId` (source / destination) sont requis.
  </Accordion>

  <Accordion title="MARKDOWN">
    ```json theme={null}
    {
      "planType": "MARKDOWN",
      "season": "SS26",
      "startDate": { "kind": "relative", "offsetDays": 0 },
      "endDate": { "kind": "relative", "offsetDays": 30 },
      "collectionSource": { "kind": "fromTrigger" }
    }
    ```

    `season`, `startDate`, `endDate` sont optionnels.
  </Accordion>

  <Accordion title="SUPPLIER_RETURN">
    ```json theme={null}
    { "planType": "SUPPLIER_RETURN", "supplierId": "<uuid>", "sourceShopId": "<uuid>", "deadline": { "kind": "relative", "offsetDays": 21 } }
    ```

    `supplierId` est le discriminateur requis pour chercher-ou-créer ; `sourceShopId` est optionnel.
  </Accordion>

  <Accordion title="SUPPLIER_EXCHANGE">
    ```json theme={null}
    { "planType": "SUPPLIER_EXCHANGE", "supplierId": "<uuid>", "sourceShopId": "<uuid>", "destinationShopId": "<uuid>", "deadline": { "kind": "relative", "offsetDays": 21 } }
    ```

    `supplierId` requis ; `sourceShopId` (côté RETOUR) et `destinationShopId` (côté RECEVOIR) optionnels.
  </Accordion>
</AccordionGroup>

**Sortie :** `planId`, `planType`, `planName`, `isNew` — disponibles en aval sous
`{{steps.<nodeId>.output.planId}}` etc.

## ADD\_ITEMS\_TO\_PLAN

Ajoute des articles au plan créé par un nœud `CREATE_OR_GET_PLAN`. Champs communs :

| Champ              | Signification                                                                                      |
| ------------------ | -------------------------------------------------------------------------------------------------- |
| `sourcePlanNodeId` | L'id du nœud créer-plan que celui-ci remplit.                                                      |
| `planType`         | Doit correspondre au plan source.                                                                  |
| `entityFilters`    | Optionnel `{ includeTags, excludeTags }` pour restreindre quelles entités deviennent des articles. |
| `maxItems`         | Cap facultatif d'articlesquis nombre d'articles ajoutés.                                           |

### Périmètres

* **Périmètre magasin** (`shopScope`): `{ kind: "all" }`, `{ kind: "specific", shopIds: [...] }`,
  ou `{ kind: "fromTrigger" }`. (Non utilisé pour rééquilibrage — les magasins viennent de l'en-tête du plan.)
* **Périmètre taille** (`sizeScope`): `{ kind: "all" }` ou
  `{ kind: "belowStockThreshold", threshold: <n> }`.

### Stratégies

<AccordionGroup>
  <Accordion title="Stratégie de quantité (réassort / rééquilibrage / fournisseur)">
    ```json theme={null}
    { "kind": "fixed", "quantity": 10 }
    { "kind": "fillToTarget", "target": 50 }
    { "kind": "scoreDriven" }
    ```

    * `fixed` — ajouter une quantité littérale par article.
    * `fillToTarget` — compléter chaque article jusqu'à `target` (seul le delta est ajouté).
    * `scoreDriven` — le résolveur de la plateforme données lit le vecteur de décision pour définir la
      quantité (aucun paramètre côté app).
  </Accordion>

  <Accordion title="Stratégie de correspondance (RÉÉQUILIBRAGE uniquement)">
    ```json theme={null}
    { "kind": "fixed" }
    { "kind": "scoreDriven" }
    ```

    `scoreDriven` achemine vers le résolveur de correspondance de rééquilibrage (scores de surplus/déficit/urgence de transfert
    → appariement bipartite des magasins source aux magasins destination).
  </Accordion>

  <Accordion title="Stratégie de remise (DÉMARQUE uniquement)">
    ```json theme={null}
    { "kind": "fixed", "percent": 30 }
    { "kind": "scoreDriven" }
    { "kind": "recommended", "fallbackPercent": 15, "maxDiscountPct": 70, "marginFloorPct": 0 }
    ```

    * `fixed` — appliquer un `percent` littéral (0–100).
    * `scoreDriven` — le résolveur de remise recommandée de la couche décision.
    * `recommended` — remise de couche décision avec trois boutons limités ; valeurs par défaut affichées
      (`fallbackPercent` 15, `maxDiscountPct` 70, `marginFloorPct` 0).
  </Accordion>
</AccordionGroup>

### Champs par type de plan

| Type de plan        | Config d'article                                                               |
| ------------------- | ------------------------------------------------------------------------------ |
| `RESTOCK`           | `quantityStrategy`, `shopScope`, `sizeScope`                                   |
| `REBALANCE`         | `quantityStrategy`, `sizeScope`, `matchingStrategy` (pas de périmètre magasin) |
| `MARKDOWN`          | `discountStrategy`, `shopScope`, `sizeScope`                                   |
| `SUPPLIER_RETURN`   | `quantityStrategy`, `reasonCode` (appliqué à chaque article)                   |
| `SUPPLIER_EXCHANGE` | `side` (`RETURN`/`RECEIVE`), `quantityStrategy`                                |

**Sortie :** `addedCount`, `skippedCount` — disponibles sous
`{{steps.<nodeId>.output.addedCount}}`.

<Note>
  Les articles ajoutés par un workflow portent leur attribution au vecteur de décision dans le [journal d'activité](/fr/inventory-plans/lifecycle#activité--piste-d-audit) du plan, et les mêmes
  [règles métier](/fr/intelligence-layer/rules-and-rulesets) s'appliquent que pour les modifications manuelles.
</Note>
