> For the complete documentation index, see [llms.txt](https://ouvretaferme.gitbook.io/ouvretaferme/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ouvretaferme.gitbook.io/ouvretaferme/endpoints/commercialisation/boutiques/ventes.md).

# Ventes

Les périodes pendant lesquelles vos clients commandent, et la date à laquelle ils sont livrés. Une boutique ouverte en permanence n'en a qu'une ; une boutique à fréquence en a autant que d'ouvertures. Sur une boutique collective, elles appartiennent à qui la tient.

## Lister les ventes de boutique

> Scope requis : \`commercialisation:read\`.

```json
{"openapi":"3.0.3","info":{"title":"API Ouvretaferme","version":"0.1beta"},"tags":[{"name":"Ventes de boutique"}],"servers":[{"url":"https://api.ouvretaferme.org/0.1beta"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Clé API personnelle ou jeton OAuth2 d'une application tierce, présenté dans l'en-tête `Authorization: Bearer`. Voir la section Authentification."}},"schemas":{"ShopDate":{"type":"object","properties":{"id":{"type":"integer","format":"int64","readOnly":true},"shop":{"type":"integer","format":"int64","description":"Identifiant d'un élément `Shop`."},"structure":{"type":"integer","format":"int64","description":"Identifiant d'un élément `Structure`."},"type":{"type":"string","enum":["private","pro"]},"status":{"type":"string","enum":["active","inactive","closed"],"description":"Statut."},"orderStartAt":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$","description":"Ouverture des commandes. Date et heure, au format AAAA-MM-JJ HH:MM:SS.","nullable":true},"orderEndAt":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$","description":"Fin des commandes. Date et heure, au format AAAA-MM-JJ HH:MM:SS.","nullable":true},"deliveryDate":{"type":"string","format":"date","nullable":true,"description":"Livraison des commandes."},"description":{"type":"string","nullable":true,"description":"Complément d'information."},"points":{"type":"array","items":{},"description":"Modes de livraison activés."},"catalogs":{"type":"array","items":{},"nullable":true,"description":"Choisir les catalogues proposés à la vente."},"isOrderable":{"type":"boolean","description":"Indique si les commandes sont ouvertes en ce moment"}},"title":"Ventes de boutique","description":"Les périodes pendant lesquelles vos clients commandent, et la date à laquelle ils sont livrés. Une boutique ouverte en permanence n'en a qu'une ; une boutique à fréquence en a autant que d'ouvertures. Sur une boutique collective, elles appartiennent à qui la tient."},"Error":{"type":"object","properties":{"type":{"type":"string","enum":["authentication_error","resource_error","api_error"]},"code":{"type":"string"},"message":{"type":"string"}}}},"responses":{"ValidationError":{"description":"Un champ, un filtre ou un argument ne respecte pas les règles de validation, ou le corps n'est pas un objet JSON.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"AuthenticationError":{"description":"Clé API ou jeton absent, invalide, expiré ou révoqué.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"Forbidden":{"description":"Le jeton ne porte pas le scope requis, l'écriture n'est pas ouverte à cette structure, la structure n'a pas l'abonnement qui ouvre l'API, ou la personne qui a créé la clé n'administre plus la structure.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"RateLimited":{"description":"Trop d'appels. L'en-tête `Retry-After` donne le nombre de secondes à attendre.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}},"headers":{"Retry-After":{"description":"Nombre de secondes à attendre avant le prochain appel.","schema":{"type":"integer"}}}}}},"paths":{"/shopDateList":{"get":{"operationId":"getShopDateList","tags":["Ventes de boutique"],"summary":"Lister les ventes de boutique","description":"Scope requis : `commercialisation:read`.","parameters":[{"name":"start","in":"query","required":false,"description":"Rang du premier élément rendu, à partir de 1.","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","required":false,"description":"Nombre d'éléments rendus, 100 par défaut et 500 au plus. À 0, seul le total est rendu.","schema":{"type":"integer","minimum":0,"maximum":500,"default":100}},{"name":"ids","in":"query","required":false,"description":"Ne rend que ces identifiants, 100 au plus, séparés par des virgules.","style":"form","explode":false,"schema":{"type":"array","items":{"type":"integer","format":"int64"},"maxItems":100}},{"name":"afterId","in":"query","required":false,"description":"Ne rend que les éléments d'identifiant supérieur, pour parcourir une liste sans décalage quand elle change pendant la lecture.","schema":{"type":"integer","format":"int64"}},{"name":"beforeId","in":"query","required":false,"description":"Ne rend que les éléments d'identifiant inférieur.","schema":{"type":"integer","format":"int64"}},{"name":"shop","in":"query","required":false,"description":"Identifiant d'un élément `Shop`.","schema":{"type":"integer","format":"int64"}},{"name":"status","in":"query","required":false,"description":"Statut.","schema":{"type":"string","enum":["active","inactive","closed"]}}],"responses":{"200":{"description":"Liste paginée des ventes de boutique.","content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer","description":"Nombre d'éléments que retiennent les filtres, sans tenir compte de la pagination (`start`, `limit`, `afterId`, `beforeId`)."},"list":{"type":"array","items":{"$ref":"#/components/schemas/ShopDate"}}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/AuthenticationError"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}}}}
```

## Lister toutes les ventes d'une date de vente, y compris celles saisies par les producteurs

> Scope requis : \`commercialisation:read\`.

```json
{"openapi":"3.0.3","info":{"title":"API Ouvretaferme","version":"0.1beta"},"tags":[{"name":"Ventes de boutique"}],"servers":[{"url":"https://api.ouvretaferme.org/0.1beta"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Clé API personnelle ou jeton OAuth2 d'une application tierce, présenté dans l'en-tête `Authorization: Bearer`. Voir la section Authentification."}},"schemas":{"Sale":{"type":"object","properties":{"id":{"type":"integer","format":"int64","readOnly":true},"document":{"type":"integer","nullable":true},"customer":{"type":"integer","format":"int64","description":"Client. Identifiant d'un élément `Customer`.","nullable":true},"type":{"type":"string","enum":["private","pro"]},"taxes":{"type":"string","enum":["including","excluding"],"description":"Valeurs : `including` (TTC), `excluding` (HT)."},"hasVat":{"type":"boolean"},"vatApplication":{"type":"string","enum":["normal","intracom","extracom"]},"priceExcludingVat":{"type":"number","nullable":true},"priceIncludingVat":{"type":"number","nullable":true},"vat":{"type":"number"},"discountPercent":{"type":"integer","description":"Remise commerciale (en %)."},"discountValue":{"type":"number","description":"Remise commerciale (en €)."},"shipping":{"type":"number","nullable":true,"description":"Frais de livraison."},"shippingVatRate":{"type":"number","nullable":true,"description":"Taux de TVA sur les frais de livraison."},"itemsCount":{"type":"integer","description":"Nombre de lignes"},"organic":{"type":"boolean"},"conversion":{"type":"boolean"},"nature":{"type":"string","enum":["good","service","mixed"],"nullable":true},"preparationStatus":{"type":"string","enum":["composition","draft","basket","confirmed","selling","prepared","delivered","canceled","expired"],"description":"Statut de préparation. Valeurs : `draft` (Brouillon), `basket` (Panier), `expired` (Expiré), `confirmed` (Confirmé), `selling` (Caisse), `prepared` (Préparé), `delivered` (Livré), `canceled` (Annulé)."},"paymentStatus":{"type":"string","enum":["not-paid","partial-paid","overpaid","paid","never-paid","failed"],"nullable":true,"description":"État du paiement. Valeurs : `paid` (Payé), `not-paid` (Non payé), `partial-paid` (Payé partiellement), `overpaid` (Trop perçu), `failed` (Paiement en échec), `never-paid` (Ne sera pas payé)."},"paymentAmount":{"type":"number","nullable":true},"invoice":{"type":"integer","format":"int64","description":"Identifiant d'un élément `Invoice`.","nullable":true},"shop":{"type":"integer","format":"int64","description":"Boutique. Identifiant d'un élément `Shop`.","nullable":true},"shopDate":{"type":"integer","format":"int64","nullable":true,"description":"Identifiant de la date de livraison de boutique dont la vente est une commande, ou null pour une vente hors boutique"},"shopPoint":{"type":"integer","format":"int64","description":"Identifiant d'un élément `Point`.","nullable":true},"shopComment":{"type":"string","minLength":1,"maxLength":250,"nullable":true},"deliveryStreet1":{"type":"string","nullable":true},"deliveryStreet2":{"type":"string","nullable":true},"deliveryPostcode":{"type":"string","nullable":true},"deliveryCity":{"type":"string","nullable":true},"deliveryCountry":{"type":"integer","format":"int64","description":"Identifiant.","nullable":true},"structure":{"type":"integer","format":"int64","description":"Identifiant d'un élément `Structure`."},"comment":{"type":"string","nullable":true,"description":"Commentaire interne."},"deliveredAt":{"type":"string","format":"date"},"paidAt":{"type":"string","format":"date","nullable":true,"description":"Date de paiement."},"sharedParent":{"type":"integer","format":"int64","description":"Identifiant d'un élément `Sale`.","nullable":true},"sharedCustomer":{"type":"integer","format":"int64","description":"Identifiant d'un élément `Customer`.","nullable":true},"structureName":{"type":"string","description":"Nom du producteur, rendu seulement sur la vente d'un producteur d'une commande groupée"},"items":{"type":"array","description":"Lignes de la vente","items":{"$ref":"#/components/schemas/Item"}},"events":{"type":"array","description":"Historique des changements d'état","items":{"$ref":"#/components/schemas/History"}},"payments":{"type":"array","description":"Règlements enregistrés","items":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"method":{"type":"integer","format":"int64","nullable":true,"description":"Référence du mode de règlement"},"methodName":{"type":"string"},"amountIncludingVat":{"type":"number"},"status":{"type":"string","enum":["not-paid","paid","failed"]},"paidAt":{"type":"string","format":"date","nullable":true}}}}},"title":"Ventes","description":"Vos ventes, avec leurs articles et leur historique. Ses montants se recalculent à chaque changement d'article, et ses changements d'état (confirmer, livrer, annuler…) passent par les actions de la vente."},"Item":{"type":"object","properties":{"id":{"type":"integer","format":"int64","readOnly":true},"name":{"type":"string","minLength":1,"description":"Désignation."},"reference":{"type":"string","minLength":1,"nullable":true},"additional":{"type":"string","nullable":true,"description":"Complément d'information."},"product":{"type":"integer","format":"int64","description":"Produit. Identifiant d'un élément `Product`.","nullable":true},"unit":{"type":"integer","format":"int64","description":"Unité de vente. Identifiant d'un élément `Unit`.","nullable":true},"packaging":{"type":"number","nullable":true,"description":"Colisage."},"number":{"type":"number","nullable":true,"description":"Quantité."},"unitPrice":{"type":"number","description":"Prix unitaire."},"unitPriceInitial":{"type":"number","nullable":true},"price":{"type":"number","nullable":true,"description":"Montant."},"priceInitial":{"type":"number","nullable":true},"vatRate":{"type":"number","nullable":true,"description":"Taux de TVA."},"vatCode":{"type":"string","enum":["s","z","e","ae","k","g","o"],"nullable":true,"description":"Code de TVA. Valeurs : `s` (Standard), `z` (Taux de TVA à 0), `e` (Exempté de TVA), `ae` (Auto liquidation de TVA), `k` (Exonération pour livraison intracommunautaire), `g` (Exempté de TVA pour Export hors UE), `o` (Hors du périmètre d'application de la TVA)."},"nature":{"type":"string","enum":["good","service","silent"],"description":"Nature de la prestation. Valeurs : `good` (Livraison de bien), `service` (Prestation de service)."},"organic":{"type":"string","enum":["no","yes","conversion"],"description":"Valeurs : `no` (Non), `yes` (Oui), `conversion` (En conversion)."},"qualities":{"type":"string"},"origin":{"type":"string","minLength":1,"nullable":true,"description":"Origine."},"status":{"type":"string","enum":["composition","draft","basket","confirmed","selling","prepared","delivered","canceled","expired"]},"structure":{"type":"integer","format":"int64","description":"Référence du producteur, rendue seulement par la liste des articles d'une commande groupée, sur les articles d'une autre structure"},"accountNumber":{"type":"string","nullable":true,"description":"Numéro de compte comptable de l'article, absent des articles d'une autre structure"},"sale":{"type":"integer","format":"int64","description":"Référence de la vente du producteur, rendue seulement par la liste des articles d'une commande groupée, sur les articles d'une autre structure"},"structureName":{"type":"string","description":"Nom du producteur, rendu avec sa référence"},"unitLabels":{"type":"object","nullable":true,"description":"Libellés de l'unité, rendus avec la référence du producteur, ou null pour un article sans unité","properties":{"singular":{"type":"string"},"plural":{"type":"string"},"short":{"type":"string"}}},"composition":{"type":"integer","format":"int64","description":"Identifiant d'un élément `Sale`.","nullable":true},"ingredients":{"type":"array","description":"Lignes qui composent le panier","items":{"$ref":"#/components/schemas/Item"}}},"title":"Articles de vente","description":"Les articles d'une vente. Un article porte un produit de votre catalogue, ou une désignation libre dont vous fixez la nature et le prix. Il garde le prix retenu au moment de la vente."},"History":{"type":"object","properties":{"id":{"type":"integer","format":"int64","readOnly":true},"event":{"type":"string","description":"Nom de l'événement, sous sa forme lisible"},"comment":{"type":"string","nullable":true},"date":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$","description":"Date et heure, au format AAAA-MM-JJ HH:MM:SS."}},"title":"Événements de vente","description":"Les changements d'état d'une vente ou d'une facture, de sa création à son règlement. Chaque événement sort sous un identifiant stable (sale-created, sale-delivered) et non sous son libellé, qui est traduit. Embarqués dans le champ events d'une vente ou d'une facture."},"Error":{"type":"object","properties":{"type":{"type":"string","enum":["authentication_error","resource_error","api_error"]},"code":{"type":"string"},"message":{"type":"string"}}}},"responses":{"ValidationError":{"description":"Un champ, un filtre ou un argument ne respecte pas les règles de validation, ou le corps n'est pas un objet JSON.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"AuthenticationError":{"description":"Clé API ou jeton absent, invalide, expiré ou révoqué.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"Forbidden":{"description":"Le jeton ne porte pas le scope requis, l'écriture n'est pas ouverte à cette structure, la structure n'a pas l'abonnement qui ouvre l'API, ou la personne qui a créé la clé n'administre plus la structure.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"RateLimited":{"description":"Trop d'appels. L'en-tête `Retry-After` donne le nombre de secondes à attendre.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}},"headers":{"Retry-After":{"description":"Nombre de secondes à attendre avant le prochain appel.","schema":{"type":"integer"}}}}}},"paths":{"/shopDate/{id}/salesList":{"get":{"operationId":"getShopDateByIdSalesList","tags":["Ventes de boutique"],"summary":"Lister toutes les ventes d'une date de vente, y compris celles saisies par les producteurs","description":"Scope requis : `commercialisation:read`.","parameters":[{"name":"start","in":"query","required":false,"description":"Rang du premier élément rendu, à partir de 1.","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","required":false,"description":"Nombre d'éléments rendus, 100 par défaut et 500 au plus. À 0, seul le total est rendu.","schema":{"type":"integer","minimum":0,"maximum":500,"default":100}},{"name":"preparationStatus","in":"query","required":false,"description":"Statut de préparation. Valeurs : `draft` (Brouillon), `basket` (Panier), `expired` (Expiré), `confirmed` (Confirmé), `selling` (Caisse), `prepared` (Préparé), `delivered` (Livré), `canceled` (Annulé).","schema":{"type":"string","enum":["composition","draft","basket","confirmed","selling","prepared","delivered","canceled","expired"]}},{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"Liste paginée des ventes.","content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer","description":"Nombre d'éléments que retiennent les filtres, sans tenir compte de la pagination (`start`, `limit`, `afterId`, `beforeId`)."},"list":{"type":"array","items":{"$ref":"#/components/schemas/Sale"}}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/AuthenticationError"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}}}}
```

## Lister les articles de toutes les ventes d'une date de vente

> Scope requis : \`commercialisation:read\`.

```json
{"openapi":"3.0.3","info":{"title":"API Ouvretaferme","version":"0.1beta"},"tags":[{"name":"Ventes de boutique"}],"servers":[{"url":"https://api.ouvretaferme.org/0.1beta"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Clé API personnelle ou jeton OAuth2 d'une application tierce, présenté dans l'en-tête `Authorization: Bearer`. Voir la section Authentification."}},"schemas":{"Item":{"type":"object","properties":{"id":{"type":"integer","format":"int64","readOnly":true},"name":{"type":"string","minLength":1,"description":"Désignation."},"reference":{"type":"string","minLength":1,"nullable":true},"additional":{"type":"string","nullable":true,"description":"Complément d'information."},"product":{"type":"integer","format":"int64","description":"Produit. Identifiant d'un élément `Product`.","nullable":true},"unit":{"type":"integer","format":"int64","description":"Unité de vente. Identifiant d'un élément `Unit`.","nullable":true},"packaging":{"type":"number","nullable":true,"description":"Colisage."},"number":{"type":"number","nullable":true,"description":"Quantité."},"unitPrice":{"type":"number","description":"Prix unitaire."},"unitPriceInitial":{"type":"number","nullable":true},"price":{"type":"number","nullable":true,"description":"Montant."},"priceInitial":{"type":"number","nullable":true},"vatRate":{"type":"number","nullable":true,"description":"Taux de TVA."},"vatCode":{"type":"string","enum":["s","z","e","ae","k","g","o"],"nullable":true,"description":"Code de TVA. Valeurs : `s` (Standard), `z` (Taux de TVA à 0), `e` (Exempté de TVA), `ae` (Auto liquidation de TVA), `k` (Exonération pour livraison intracommunautaire), `g` (Exempté de TVA pour Export hors UE), `o` (Hors du périmètre d'application de la TVA)."},"nature":{"type":"string","enum":["good","service","silent"],"description":"Nature de la prestation. Valeurs : `good` (Livraison de bien), `service` (Prestation de service)."},"organic":{"type":"string","enum":["no","yes","conversion"],"description":"Valeurs : `no` (Non), `yes` (Oui), `conversion` (En conversion)."},"qualities":{"type":"string"},"origin":{"type":"string","minLength":1,"nullable":true,"description":"Origine."},"status":{"type":"string","enum":["composition","draft","basket","confirmed","selling","prepared","delivered","canceled","expired"]},"structure":{"type":"integer","format":"int64","description":"Référence du producteur, rendue seulement par la liste des articles d'une commande groupée, sur les articles d'une autre structure"},"accountNumber":{"type":"string","nullable":true,"description":"Numéro de compte comptable de l'article, absent des articles d'une autre structure"},"sale":{"type":"integer","format":"int64","description":"Référence de la vente du producteur, rendue seulement par la liste des articles d'une commande groupée, sur les articles d'une autre structure"},"structureName":{"type":"string","description":"Nom du producteur, rendu avec sa référence"},"unitLabels":{"type":"object","nullable":true,"description":"Libellés de l'unité, rendus avec la référence du producteur, ou null pour un article sans unité","properties":{"singular":{"type":"string"},"plural":{"type":"string"},"short":{"type":"string"}}},"composition":{"type":"integer","format":"int64","description":"Identifiant d'un élément `Sale`.","nullable":true},"ingredients":{"type":"array","description":"Lignes qui composent le panier","items":{"$ref":"#/components/schemas/Item"}}},"title":"Articles de vente","description":"Les articles d'une vente. Un article porte un produit de votre catalogue, ou une désignation libre dont vous fixez la nature et le prix. Il garde le prix retenu au moment de la vente."},"Error":{"type":"object","properties":{"type":{"type":"string","enum":["authentication_error","resource_error","api_error"]},"code":{"type":"string"},"message":{"type":"string"}}}},"responses":{"ValidationError":{"description":"Un champ, un filtre ou un argument ne respecte pas les règles de validation, ou le corps n'est pas un objet JSON.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"AuthenticationError":{"description":"Clé API ou jeton absent, invalide, expiré ou révoqué.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"Forbidden":{"description":"Le jeton ne porte pas le scope requis, l'écriture n'est pas ouverte à cette structure, la structure n'a pas l'abonnement qui ouvre l'API, ou la personne qui a créé la clé n'administre plus la structure.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"RateLimited":{"description":"Trop d'appels. L'en-tête `Retry-After` donne le nombre de secondes à attendre.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}},"headers":{"Retry-After":{"description":"Nombre de secondes à attendre avant le prochain appel.","schema":{"type":"integer"}}}}}},"paths":{"/shopDate/{id}/itemsList":{"get":{"operationId":"getShopDateByIdItemsList","tags":["Ventes de boutique"],"summary":"Lister les articles de toutes les ventes d'une date de vente","description":"Scope requis : `commercialisation:read`.","parameters":[{"name":"start","in":"query","required":false,"description":"Rang du premier élément rendu, à partir de 1.","schema":{"type":"integer","minimum":1,"default":1}},{"name":"limit","in":"query","required":false,"description":"Nombre d'éléments rendus, 100 par défaut et 500 au plus. À 0, seul le total est rendu.","schema":{"type":"integer","minimum":0,"maximum":500,"default":100}},{"name":"preparationStatus","in":"query","required":false,"description":"Statut de préparation. Valeurs : `draft` (Brouillon), `basket` (Panier), `expired` (Expiré), `confirmed` (Confirmé), `selling` (Caisse), `prepared` (Préparé), `delivered` (Livré), `canceled` (Annulé).","schema":{"type":"string","enum":["composition","draft","basket","confirmed","selling","prepared","delivered","canceled","expired"]}},{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"Liste paginée des articles de vente.","content":{"application/json":{"schema":{"type":"object","properties":{"count":{"type":"integer","description":"Nombre d'éléments que retiennent les filtres, sans tenir compte de la pagination (`start`, `limit`, `afterId`, `beforeId`)."},"list":{"type":"array","items":{"$ref":"#/components/schemas/Item"}}}}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/AuthenticationError"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"}}}}}}
```

## Consulter une vente de boutique

> Scope requis : \`commercialisation:read\`. Pour lire plusieurs ventes de boutique, \`GET /shopDateList?ids=12,15,18\` en rend jusqu'à 100, et ne compte que pour un appel.

```json
{"openapi":"3.0.3","info":{"title":"API Ouvretaferme","version":"0.1beta"},"tags":[{"name":"Ventes de boutique"}],"servers":[{"url":"https://api.ouvretaferme.org/0.1beta"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Clé API personnelle ou jeton OAuth2 d'une application tierce, présenté dans l'en-tête `Authorization: Bearer`. Voir la section Authentification."}},"schemas":{"ShopDate":{"type":"object","properties":{"id":{"type":"integer","format":"int64","readOnly":true},"shop":{"type":"integer","format":"int64","description":"Identifiant d'un élément `Shop`."},"structure":{"type":"integer","format":"int64","description":"Identifiant d'un élément `Structure`."},"type":{"type":"string","enum":["private","pro"]},"status":{"type":"string","enum":["active","inactive","closed"],"description":"Statut."},"orderStartAt":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$","description":"Ouverture des commandes. Date et heure, au format AAAA-MM-JJ HH:MM:SS.","nullable":true},"orderEndAt":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$","description":"Fin des commandes. Date et heure, au format AAAA-MM-JJ HH:MM:SS.","nullable":true},"deliveryDate":{"type":"string","format":"date","nullable":true,"description":"Livraison des commandes."},"description":{"type":"string","nullable":true,"description":"Complément d'information."},"points":{"type":"array","items":{},"description":"Modes de livraison activés."},"catalogs":{"type":"array","items":{},"nullable":true,"description":"Choisir les catalogues proposés à la vente."},"isOrderable":{"type":"boolean","description":"Indique si les commandes sont ouvertes en ce moment"}},"title":"Ventes de boutique","description":"Les périodes pendant lesquelles vos clients commandent, et la date à laquelle ils sont livrés. Une boutique ouverte en permanence n'en a qu'une ; une boutique à fréquence en a autant que d'ouvertures. Sur une boutique collective, elles appartiennent à qui la tient."},"Error":{"type":"object","properties":{"type":{"type":"string","enum":["authentication_error","resource_error","api_error"]},"code":{"type":"string"},"message":{"type":"string"}}}},"responses":{"ValidationError":{"description":"Un champ, un filtre ou un argument ne respecte pas les règles de validation, ou le corps n'est pas un objet JSON.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"AuthenticationError":{"description":"Clé API ou jeton absent, invalide, expiré ou révoqué.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"Forbidden":{"description":"Le jeton ne porte pas le scope requis, l'écriture n'est pas ouverte à cette structure, la structure n'a pas l'abonnement qui ouvre l'API, ou la personne qui a créé la clé n'administre plus la structure.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"NotFound":{"description":"Aucun élément avec cet identifiant pour votre structure.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"RateLimited":{"description":"Trop d'appels. L'en-tête `Retry-After` donne le nombre de secondes à attendre.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}},"headers":{"Retry-After":{"description":"Nombre de secondes à attendre avant le prochain appel.","schema":{"type":"integer"}}}}}},"paths":{"/shopDate/{id}":{"get":{"operationId":"getShopDateById","tags":["Ventes de boutique"],"summary":"Consulter une vente de boutique","description":"Scope requis : `commercialisation:read`. Pour lire plusieurs ventes de boutique, `GET /shopDateList?ids=12,15,18` en rend jusqu'à 100, et ne compte que pour un appel.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"Vente de boutique demandée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShopDate"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/AuthenticationError"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}}}}
```

## Modifier une vente de boutique

> Scope requis : \`commercialisation:write\`. Le corps porte tous les champs modifiables, ou seulement ceux que nomme sa clé \`properties\` (mise à jour partielle, voir la vue d'ensemble).

```json
{"openapi":"3.0.3","info":{"title":"API Ouvretaferme","version":"0.1beta"},"tags":[{"name":"Ventes de boutique"}],"servers":[{"url":"https://api.ouvretaferme.org/0.1beta"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Clé API personnelle ou jeton OAuth2 d'une application tierce, présenté dans l'en-tête `Authorization: Bearer`. Voir la section Authentification."}},"schemas":{"ShopDateUpdate":{"type":"object","properties":{"orderStartAt":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$","description":"Ouverture des commandes. Date et heure, au format AAAA-MM-JJ HH:MM:SS.","nullable":true},"orderEndAt":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$","description":"Fin des commandes. Date et heure, au format AAAA-MM-JJ HH:MM:SS.","nullable":true},"deliveryDate":{"type":"string","format":"date","nullable":true,"description":"Livraison des commandes."},"description":{"type":"string","nullable":true,"description":"Complément d'information."},"catalogs":{"type":"array","items":{},"nullable":true,"description":"Choisir les catalogues proposés à la vente."}},"description":"Les champs acceptés dépendent de l'élément envoyé : cette liste réunit ceux des différents cas et aucun n'y est obligatoire dans tous. D'autres champs peuvent être acceptés selon l'élément. Les périodes pendant lesquelles vos clients commandent, et la date à laquelle ils sont livrés. Une boutique ouverte en permanence n'en a qu'une ; une boutique à fréquence en a autant que d'ouvertures. Sur une boutique collective, elles appartiennent à qui la tient.","additionalProperties":true},"ShopDate":{"type":"object","properties":{"id":{"type":"integer","format":"int64","readOnly":true},"shop":{"type":"integer","format":"int64","description":"Identifiant d'un élément `Shop`."},"structure":{"type":"integer","format":"int64","description":"Identifiant d'un élément `Structure`."},"type":{"type":"string","enum":["private","pro"]},"status":{"type":"string","enum":["active","inactive","closed"],"description":"Statut."},"orderStartAt":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$","description":"Ouverture des commandes. Date et heure, au format AAAA-MM-JJ HH:MM:SS.","nullable":true},"orderEndAt":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$","description":"Fin des commandes. Date et heure, au format AAAA-MM-JJ HH:MM:SS.","nullable":true},"deliveryDate":{"type":"string","format":"date","nullable":true,"description":"Livraison des commandes."},"description":{"type":"string","nullable":true,"description":"Complément d'information."},"points":{"type":"array","items":{},"description":"Modes de livraison activés."},"catalogs":{"type":"array","items":{},"nullable":true,"description":"Choisir les catalogues proposés à la vente."},"isOrderable":{"type":"boolean","description":"Indique si les commandes sont ouvertes en ce moment"}},"title":"Ventes de boutique","description":"Les périodes pendant lesquelles vos clients commandent, et la date à laquelle ils sont livrés. Une boutique ouverte en permanence n'en a qu'une ; une boutique à fréquence en a autant que d'ouvertures. Sur une boutique collective, elles appartiennent à qui la tient."},"Error":{"type":"object","properties":{"type":{"type":"string","enum":["authentication_error","resource_error","api_error"]},"code":{"type":"string"},"message":{"type":"string"}}}},"responses":{"ValidationError":{"description":"Un champ, un filtre ou un argument ne respecte pas les règles de validation, ou le corps n'est pas un objet JSON.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"AuthenticationError":{"description":"Clé API ou jeton absent, invalide, expiré ou révoqué.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"Forbidden":{"description":"Le jeton ne porte pas le scope requis, l'écriture n'est pas ouverte à cette structure, la structure n'a pas l'abonnement qui ouvre l'API, ou la personne qui a créé la clé n'administre plus la structure.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"NotFound":{"description":"Aucun élément avec cet identifiant pour votre structure.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"RateLimited":{"description":"Trop d'appels. L'en-tête `Retry-After` donne le nombre de secondes à attendre.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}},"headers":{"Retry-After":{"description":"Nombre de secondes à attendre avant le prochain appel.","schema":{"type":"integer"}}}}}},"paths":{"/shopDate/{id}":{"put":{"operationId":"putShopDateById","tags":["Ventes de boutique"],"summary":"Modifier une vente de boutique","description":"Scope requis : `commercialisation:write`. Le corps porte tous les champs modifiables, ou seulement ceux que nomme sa clé `properties` (mise à jour partielle, voir la vue d'ensemble).","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/ShopDateUpdate"},{"type":"object","title":"Mise à jour partielle","description":"Les champs nommés dans `properties`, et eux seuls, chacun à sa nouvelle valeur.","required":["properties"],"properties":{"properties":{"type":"array","minItems":1,"items":{"type":"string","enum":["orderStartAt","orderEndAt","deliveryDate","description","catalogs"]}}},"additionalProperties":true}]}}}},"responses":{"200":{"description":"Vente de boutique modifiée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShopDate"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/AuthenticationError"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"}}}}}}
```

## Créer une vente de boutique

> Scope requis : \`commercialisation:write\`.

```json
{"openapi":"3.0.3","info":{"title":"API Ouvretaferme","version":"0.1beta"},"tags":[{"name":"Ventes de boutique"}],"servers":[{"url":"https://api.ouvretaferme.org/0.1beta"}],"security":[{"bearerAuth":[]}],"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","description":"Clé API personnelle ou jeton OAuth2 d'une application tierce, présenté dans l'en-tête `Authorization: Bearer`. Voir la section Authentification."}},"schemas":{"ShopDateWrite":{"type":"object","properties":{"orderStartAt":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$","description":"Ouverture des commandes. Date et heure, au format AAAA-MM-JJ HH:MM:SS.","nullable":true},"orderEndAt":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$","description":"Fin des commandes. Date et heure, au format AAAA-MM-JJ HH:MM:SS.","nullable":true},"deliveryDate":{"type":"string","format":"date","nullable":true,"description":"Livraison des commandes."},"points":{"type":"array","items":{},"description":"Modes de livraison activés."},"catalogs":{"type":"array","items":{},"nullable":true,"description":"Choisir les catalogues proposés à la vente."},"continuous":{"description":"Champ accepté en écriture, sans équivalent en lecture."},"source":{"description":"Champ accepté en écriture, sans équivalent en lecture."}},"description":"Les champs acceptés dépendent de l'élément envoyé : cette liste réunit ceux des différents cas et aucun n'y est obligatoire dans tous. D'autres champs peuvent être acceptés selon l'élément. Les périodes pendant lesquelles vos clients commandent, et la date à laquelle ils sont livrés. Une boutique ouverte en permanence n'en a qu'une ; une boutique à fréquence en a autant que d'ouvertures. Sur une boutique collective, elles appartiennent à qui la tient.","additionalProperties":true},"ShopDate":{"type":"object","properties":{"id":{"type":"integer","format":"int64","readOnly":true},"shop":{"type":"integer","format":"int64","description":"Identifiant d'un élément `Shop`."},"structure":{"type":"integer","format":"int64","description":"Identifiant d'un élément `Structure`."},"type":{"type":"string","enum":["private","pro"]},"status":{"type":"string","enum":["active","inactive","closed"],"description":"Statut."},"orderStartAt":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$","description":"Ouverture des commandes. Date et heure, au format AAAA-MM-JJ HH:MM:SS.","nullable":true},"orderEndAt":{"type":"string","pattern":"^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$","description":"Fin des commandes. Date et heure, au format AAAA-MM-JJ HH:MM:SS.","nullable":true},"deliveryDate":{"type":"string","format":"date","nullable":true,"description":"Livraison des commandes."},"description":{"type":"string","nullable":true,"description":"Complément d'information."},"points":{"type":"array","items":{},"description":"Modes de livraison activés."},"catalogs":{"type":"array","items":{},"nullable":true,"description":"Choisir les catalogues proposés à la vente."},"isOrderable":{"type":"boolean","description":"Indique si les commandes sont ouvertes en ce moment"}},"title":"Ventes de boutique","description":"Les périodes pendant lesquelles vos clients commandent, et la date à laquelle ils sont livrés. Une boutique ouverte en permanence n'en a qu'une ; une boutique à fréquence en a autant que d'ouvertures. Sur une boutique collective, elles appartiennent à qui la tient."},"Error":{"type":"object","properties":{"type":{"type":"string","enum":["authentication_error","resource_error","api_error"]},"code":{"type":"string"},"message":{"type":"string"}}}},"responses":{"ValidationError":{"description":"Un champ, un filtre ou un argument ne respecte pas les règles de validation, ou le corps n'est pas un objet JSON.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"AuthenticationError":{"description":"Clé API ou jeton absent, invalide, expiré ou révoqué.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"Forbidden":{"description":"Le jeton ne porte pas le scope requis, l'écriture n'est pas ouverte à cette structure, la structure n'a pas l'abonnement qui ouvre l'API, ou la personne qui a créé la clé n'administre plus la structure.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"RateLimited":{"description":"Trop d'appels. L'en-tête `Retry-After` donne le nombre de secondes à attendre.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}},"headers":{"Retry-After":{"description":"Nombre de secondes à attendre avant le prochain appel.","schema":{"type":"integer"}}}}}},"paths":{"/shopDate":{"post":{"operationId":"postShopDate","tags":["Ventes de boutique"],"summary":"Créer une vente de boutique","description":"Scope requis : `commercialisation:write`.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShopDateWrite"}}}},"responses":{"201":{"description":"Vente de boutique créée.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShopDate"}}}},"400":{"$ref":"#/components/responses/ValidationError"},"401":{"$ref":"#/components/responses/AuthenticationError"},"403":{"$ref":"#/components/responses/Forbidden"},"412":{"description":"Condition métier interdisant la création.","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/Error"}}}}},"429":{"$ref":"#/components/responses/RateLimited"}}}}}}
```
