API v1

Table des matières

Premiers pas

Données de référence

Articles et produits

Boutique en ligne

Commandes et achats

Facturation - Débit

Facturation - Crédit

Paiements

Synchronisation

Prévisions


Journal des modifications

Version Description Date Auteur
1.2.10 Réorganisation de la structure du document pour correspondre à la table des matières, ajout d'en-têtes de section 2026-01-08 DDH
1.2.9 Ajout de la table des matières, correction des numéros de version en double, corrections de descriptions, cohérence linguistique 2026-01-07 DDH
1.2.8 Ajout des endpoints Pronostics 2026-01-06 DDH
1.2.7 Ajout de TransportRegion 2025-11-17 DDH
1.2.6 Ajout de Features à Purchase + Ajout de MarkupCategory 2023-10-14 DDH
1.2.5 Ajout de ListPreOrderGroupItem 2023-06-02 JJ
1.2.4 Ajout de InvoiceSync 2022-12-09 JJ
1.2.3 Ajout de RMAReason au tableau 2022-11-14 JJ
1.2.2 Ajout de PreOrderSync 2022-06-11 DDH
1.2.1 Ajout des remarques débiteur 2022-04-06 DDH
1.2.0 Ajout des endpoints boutique 2022-03-29 JJ
1.1.11 Ajout des raisons RMA à DistributedPurchaseSync 2022-03-24 DDH
1.1.10 Ajout de QuantityPlates/QuantityAttachments au chariot 2022-03-24 DDH
1.1.9 Ajout d'exemples supplémentaires 2022-03-03 JJ
1.1.8 Ajout d'endpoints 2022-01-20 JJ
1.1.6 Ajout des endpoints Location et Administration 2021-11-20 JJ
1.1.5 Ajout des requêtes Sync 2021-11-03 JJ
1.1.4 Documentation facture modifiée 2021-03-14 JJ
1.1.3 Ajout de ManufacturerSupplierId 2021-03-14 JJ
1.1.2 Ajout des endpoints DateFrom/DateTo 2021-03-08 DDH
1.1.1 Ajout de l'autorisation par jeton JWT 2020-11-11 JJ
1.1.0 Entrées obsolètes 2020-10-21 DDH
1.0.12 Ajustements mineurs 2020-04-30 DDH
1.0.11 Ajout d'informations sur Date 2018-04-05 DDH
1.0.10 Ajout de quantity à List 2017-12-03 DDH
1.0.9 Ajout de priceDefault 2017-08-01 DDH
1.0.8 Ajout de debtor PUT/PATCH (niveau principal) 2017-07-10 DDH
1.0.7 Ajout de purchase, invoice, invoice items et payments 2017-07-07 CB
1.0.6 Ajout de OriginalPrice à ListArticleSort 2017-06-12 DDH
1.0.5 Ajout de la requête tableau ListArticleSort 2017-06-08 DDH
1.0.4 Ajout de la documentation articleSort 2017-03-01 DDH
1.0.3 Modifications mineures 2017-02-08 DDH
1.0.2 MaxCancellationTime, Features, FeatureTypes 2017-01-12 DDH
1.0.1 Article id changé de int à string / factures 2016-10-31 DDH
1.0.0 Autorisation, distributed supprimé, codes de statut ajoutés 2016-10-12 DDH
0.9.1 Autorisation, pièces jointes, événements 2016-09-07 DDH
0.9 Version mise à jour 2016-06-07 DDH
0.4 Version initiale pour usage externe 2015-11-18 DDH

Premiers pas

Introduction

Vous pouvez utiliser diverses commandes Get() qui fournissent des fichiers JSON, que vous pouvez ensuite importer dans d'autres bases de données et/ou outils de reporting. Veuillez noter que les commandes Get() pour les collections volumineuses telles que les articles, les lignes de facture et les achats ne peuvent être utilisées qu'en dehors des heures de bureau (avant 5h UTC ou après 18h UTC).

Pour utiliser l'API, vous devez être autorisé pour chaque base de données (d'un client) à laquelle vous vous connectez. Si vous n'êtes pas autorisé, vous recevrez un code HTTP 401 (Non autorisé). Plus de détails dans la section Autorisation API. Une fois votre session terminée, utilisez la commande Unauthorize.

Dans la section « général », vous trouverez des informations utiles pour développer votre application.

Les sections suivantes de ce document sont les commandes API disponibles. Chaque section contient :

  • une brève explication du type d'enregistrement qu'elle contient
  • par commande put/get/post :
    • les paramètres utilisables
    • la syntaxe de la commande
    • le retour de sortie
    • un exemple

Général

JSON

Informations sur les types spécifiques et leur formatage en JSON.

Format DateTime

Symbole Description Exemple
yyyy année 2015
MM mois 01
dd jour 31
HH heure 13
mm minute 01
ss secondes 22
tttttt fuseau horaire +02:00
Z fuseau horaire UTC Z

Date

  • **Format 😗* yyyy-MM-dd
  • **Exemple 😗* 2015-12-30

DateTime

  • **Format 😗* yyyy-MM-dd\THH:mm:ssttttttt
  • **Exemple 😗* 2015-12-30T13:40:20+02:00
  • **Remarques 😗* Utilisez le fuseau horaire du débiteur

TimeSpan

  • **Format 😗* ((-)dd.)HH:mm:ss
  • **Exemples 😗*
    • -01.13:50:01 (moins un jour, à 13:50:01)
    • 01.13:50:01 (plus un jour, à 13:50:01)
    • 13:50:01 (même jour, à 13:50:01)
    • 00.13:50:01 (identique au précédent)

LanguageValue

Objet contenant toutes les langues disponibles (ISO-639-1).

{
  "nl": "Nederlandse benaming",
  "de": "Deutsch-Bezeichnung",
  "fr": "titre francais"
}

Valeur null

N'envoyez pas de paramètres sans valeur.

**Incorrect 😗*

{
  "RequiredParameter": "text",
  "OptionalParameter": null
}

**Correct 😗*

{
  "RequiredParameter": "text"
}

Encodage

UTF-8


Codes de statut

Code Description
200 OK - Requête réussie
400 BadRequest - Objet contenant une erreur
401 Unauthorized - Authentification requise ou échouée
500 ServerError - Erreur de traitement du message, non récupéré

**Format de réponse d'erreur 😗*

{
  "error": "<erreur>",
  "message": "<erreur lisible>"
}

**Erreurs connues 😗*

  • NoOrInvalidJson
  • NoOrInvalidRequest
  • ArgumentNotFound
  • DocumentNotFound
  • ApiOpeningHoursException (requête trop volumineuse pour être traitée pendant les heures de bureau). Ne peut être effectuée qu'avant 5h UTC ou après 18h UTC.

Conseils

  • L'API est construite de manière asynchrone, vous pouvez donc lancer plusieurs commandes simultanément.
  • L'ordre des propriétés disponibles dans l'API n'est pas garanti. Assurez-vous de parser le fichier en fonction du nom de la propriété, pas de sa position. Les parseurs JSON devraient avoir ce comportement par défaut.
  • Cette documentation API a été écrite d'un point de vue C#. Si vous n'êtes pas familier avec le C#, vous devriez au moins vous familiariser avec les types de données IEnumerable et Dictionary, qui sont peu courants dans d'autres langages de programmation.
  • Toute propriété non requise peut avoir NULL comme valeur.
  • Si un IEnumerable est requis, cela signifie que la liste est initialisée (valeur []) mais peut ne contenir aucun enregistrement.

Autorisation / connexion

Autorisation basée sur les cookies

**Commande 😗* api/authorization

Une fois autorisé avec succès, vous recevrez un cookie contenant une session. Veuillez ajouter ce cookie à tout autre appel que vous effectuerez. La session est liée à l'utilisateur. La session expirera lorsqu'un autre appel sera effectué avec le même nom d'utilisateur, en cas de connexion valide.

Lorsque vous recevez un code HTTP 401, veuillez vous réautoriser.

Paramètres Post

Nom de propriété Description Type de données Requis
Username Nom d'utilisateur d'un utilisateur dans la base de données à laquelle vous souhaitez vous connecter string oui
Password Mot de passe d'un utilisateur dans la base de données à laquelle vous souhaitez vous connecter string oui
Database La base de données à laquelle vous souhaitez vous connecter string oui

Exemple Post

POST https://api.easyflor.eu/api/authorization
{
  "Username": "api",
  "Password": "wouldntyouliketoknow",
  "Database": "EasyFlor-Demo"
}

**Retourne 😗* 200 OK / 401 Unauthorized


Autorisation basée sur le jeton JWT Bearer

**Commande 😗* api/authorizationtoken

Une fois autorisé avec succès, vous recevrez un modèle contenant un Token. Pour utiliser ce Token, ajoutez un en-tête avec le token à tout autre appel. Le Token est lié à l'utilisateur et expirera après la date d'expiration, un nouveau token devra alors être généré.

Lorsque vous recevez un code HTTP 401, veuillez vous réautoriser.

Paramètres Post

Nom de propriété Description Type de données Requis
Username Nom d'utilisateur d'un utilisateur dans la base de données à laquelle vous souhaitez vous connecter string oui
Password Mot de passe d'un utilisateur dans la base de données à laquelle vous souhaitez vous connecter string oui
Database La base de données à laquelle vous souhaitez vous connecter string oui

Exemple Post

POST https://api.easyflor.eu/api/authorizationtoken
{
  "Username": "api",
  "Password": "wouldntyouliketoknow",
  "Database": "EasyFlor-Demo"
}

**Retourne 😗* 200 OK / 401 Unauthorized

Nom de propriété Description Type de données
Token Token utilisé pour l'authentification avec chaque requête string
Expiration La date d'expiration à partir de laquelle le Token ne sera plus valide DateTime

Exemple de requête autorisée

curl --location --request GET 'https://api.easyflor.eu/api/debtor' \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ##TOKEN##'

Déconnexion

**Note 😗* La déconnexion n'est utilisée que pour l'autorisation basée sur les cookies. Lors de l'utilisation de l'autorisation par jeton JWT Bearer, le token expirera de lui-même après un certain temps.

**Commande 😗* api/unauthorization

Déconnexion basée sur les cookies. Lorsqu'elle est envoyée, le cookie qui a démarré la session est invalidé et toute commande ultérieure recevra une exception 401 non autorisé.

**Paramètres Post 😗* Aucun

**Exemple Post 😗*

POST http://api.easyflor.eu/api/unauthorization

**Retourne 😗* Rien


Données de référence

Débiteurs

**Commandes 😗*

  1. api/debtor
  2. api/debtor/id
  3. api/debtorsincedate/id (date étant la date de modification du débiteur)

Une entreprise ou une personne à laquelle des marchandises sont livrées et des factures envoyées.

Exemple Get

GET https://api.easyflor.eu/api/debtor
GET https://api.easyflor.eu/api/debtor/20

Débiteur au format JSON

[{
  "Id": 417,
  "ParentId": null,
  "Name": "test debiteur",
  "PaysVAT": true,
  "Language": "nl",
  "Config": {
    "Id": "ShopWhyDebtorConfigs/debtors/417",
    "DebtorId": "debtors/417",
    "SalesUnits": [],
    "DirectPay": false
  },
  "Addresses": null,
  "Numbers": null,
  "Contacts": [{
    "Initials": "m",
    "FirstName": "marco",
    "MiddleName": null,
    "LastName": "kleine",
    "PlaceOfBirth": null,
    "DateOfBirth": "1970-12-10T00:00:00Z",
    "Function": null,
    "Gender": "Man",
    "Nationality": "Nederlandse",
    "MailAddresses": [{
      "Category": "MAIL_1",
      "Value": "testje@hotmail.nl"
    }],
    "Numbers": null,
    "Users": [{
      "Username": "Testje",
      "Password": "+TEkLGxMMyknX6ZcN6BRg8MTlyeWOzphnXXQQUZDm8E=",
      "PasswordSalt": "hCJjTLQJchM=",
      "CanOrder": true
    }]
  }],
  "MailAddresses": null,
  "CurrencyISOCode": "EUR",
  "CreatedOn": "DateTime",
  "OrderDays": [{
    "Id": "orderdays/1",
    "Name": "Levering dinsdag",
    "Day": 2,
    "MaxDefaultOrderTime": "-1.15:30:00",
    "Lists": [{
      "Id": 73,
      "MaxOrderTime": "-1.15:30:00",
      "MinOrderTime": "00:00:00"
    }, {
      "Id": 98,
      "MaxOrderTime": "-1.15:30:00",
      "MinOrderTime": "00:00:00"
    }]
  }]
}]

Retours Get

Nom de propriété Description Type de données Requis
Code Code de référence du débiteur. Utilisé principalement pour faciliter la recherche. string oui
ParentDebtorCode Code du débiteur dont celui-ci est un sous-débiteur string non
Administration Chaque débiteur appartient à une administration string oui
Name Nom du débiteur string oui
SecondName Un deuxième nom pour le débiteur string non
Category Le nom de la catégorie à laquelle le débiteur appartient string oui
Country Code pays 3 du pays où réside le débiteur string non
Currency Code ISO de la devise utilisée par le débiteur (Obsolète : égal à CurrencyISOCode) string oui
Language Nom de la langue utilisée par le débiteur string oui
TransporterCode Code du transporteur utilisé pour les livraisons à ce débiteur. string non
TransporterName Nom du transporteur utilisé pour les livraisons à ce débiteur. string non
TransportRegion Nom de la région, à des fins de transport string non
Employees Les employés pouvant passer des commandes pour ce débiteur. IEnumerable<string> non
OrderDayNames Liste d'identifiants vers la collection des jours de commande, détaillant quand le débiteur peut commander depuis la boutique en ligne. IEnumerable<string> non
ToInvoice Liste d'identifiants de débiteurs pour lesquels ce débiteur est facturé. Ex : nous livrons à différentes filiales, mais l'entreprise principale paie. IEnumerable<string> non
Locations IEnumerable<string> non
InvoiceCreditTemplate Modèle utilisé pour créer les factures de crédit. string non
InvoiceDebetTemplate Modèle utilisé pour créer les factures de débit. string non
InvoiceCSVTemplate Modèle utilisé pour créer les factures CSV de débit string non
InvoiceEventsTodo Les événements par défaut à effectuer pour une facture après sa création. IEnumerable<string> non
Price Nom des paramètres de prix par défaut utilisés par ce débiteur string non
PriceUseMarkupCategories Si les catégories de marge dans les paramètres de prix par défaut sont utilisées pour calculer les prix du débiteur. bool? non
PriceUseOriginalPrice Si le prix d'achat est utilisé lors de l'application des catégories de marge pour calculer les prix du débiteur. bool? non
MarkupCategories Quelles catégories de marge (contient les identifiants des catégories de marge réelles) sont à utiliser pour calculer les prix du débiteur. IEnumerable<string> non
DistributionPackagingVATRate Code du taux de TVA à utiliser pour les emballages facturés à ce débiteur. string non
DistributionTrolleyVATRate Code du taux de TVA à utiliser pour les chariots facturés à ce débiteur. string non
DistributionSellingLocation Lorsque des articles sont vendus à ce débiteur, ils peuvent être ajoutés au stock d'un emplacement. Ce champ contient le nom de cet emplacement si l'option est activée. string non
Block Bloquer le débiteur pour les achats en boutique en ligne bool oui
Id Partie entière de l'identifiant du débiteur int oui
ParentId Partie entière de l'identifiant du débiteur parent int non
PaysVAT Si activé, la TVA est ajoutée à la facture bool oui
CurrencyISOCode Code ISO de la devise utilisée par le débiteur string oui
CreatedOn Date de création DateTime oui

InvoiceSettings (Objet non requis)

Propriété Description Type de données Requis
PaymentMethodId Identifiant de la méthode de paiement par défaut string non
PaymentCondition Jours dont dispose le débiteur pour payer les factures int non
PaymentConditionNotify Jours avant l'envoi des notifications de paiement int non
PaymentConditionBlock Jours pendant lesquels le débiteur peut avoir des factures en cours int non
PaymentConditionAmountBlock decimal? non
SepaState Les valeurs sont First, WaitApproval, Recurring string non
CreditInvoiceTemplate string non
DebetInvoiceTemplate string non
DebetInvoiceCSVTemplate string non
Settings Les valeurs peuvent être MailExport, CSVExport List<string> non
PaymentConditionLineTypes Quelles lignes de facture doivent apparaître dans les statistiques « montant à payer » List<string> non
EventsTodo Les événements par défaut à effectuer pour une facture après sa création. IEnumerable<string> non

DistributionSettings (Objet non requis)

Propriété Description Type de données Requis
PreOrderSettings Les valeurs peuvent être : NoRemainder (ne pas distribuer le reste au débiteur), NoStock (ne pas préférer la distribution depuis le stock), NoSalesUnit (ne pas utiliser les unités de vente, correspondre à la quantité), NoLeadingPrice (ne pas utiliser le prix directeur, toujours l'indication) List<string> non
FreshDaysExtra Augmenter le nombre de jours avant expiration du produit avec le montant spécifié pour ce débiteur.

Config (Objet non requis)

Contient la configuration spécifique au débiteur.

OrderDays (IEnumerable<object> non requis)

Propriété Description Type de données Requis
Id string oui
Name string oui
Day string non
MaxDefaultOrderTime string non
Lists non utilisé IEnumerable<object> non
Hide bool oui
MinDefaultOrderTime string non

Addresses (IEnumerable<object>)

Propriété Description Type de données Requis
DebtorId int oui
Category string oui
Line1 string oui
Line2 string non
ZipCode string non
City string oui
State string non
Country string oui
DefaultAddresses Les valeurs peuvent être : ShippingAddress, BillingAddress string array non

Numbers (IEnumerable<object>)

Numéros pour ce débiteur spécifique, comme le numéro IBAN.

Propriété Description Type de données Requis
DebtorCode string oui
DebtorName string oui
Category LanguageValues oui
Value string oui
DebtorId int oui

Contacts (IEnumerable<object>)

Contacts connus au sein de l'entreprise.

Propriété Description Type de données Requis
Id string oui
DebtorId string oui
DebtorCode string oui
Initials string non
FirstName string non
MiddleName string non
LastName string oui
DateOfBirth string non
PlaceOfBirth string non
Nationality string non
Function string non
Gender string non
MailAddresses Voir la propriété mailaddresses du débiteur. IEnumerable<object> non
Numbers Voir la propriété numbers du débiteur. IEnumerable<object> non
Users Propriétés : Username (string), Password (byte[]), PasswordSalt (byte[]), CanOrder (bool), DebtorContactPersonId (string) IEnumerable<object> non
Defaults Les valeurs peuvent être Order, Invoice IEnumerable<string> non

MailAddresses (IEnumerable<object>)

Propriété Description Type de données Requis
Category Nom de la catégorie dans la langue par défaut string oui
Value Adresse e-mail string oui

Remarks (IEnumerable<object>)

Propriété Description Type de données Requis
Category Catégorie de l'élément string oui
Description Contenu de la remarque string oui
Date Date/heure de l'insertion DateTime oui

**Note 😗* Certaines propriétés peuvent être obsolètes (seront supprimées dans une des versions suivantes) ou ne pas être activement utilisées dans l'application. Vérifiez les descriptions des propriétés pour plus de détails.


PUT débiteur

**Endpoint 😗* api/debtor/

**Envoi 😗*

{
  "ParentId": 1234,
  "Code": "TEST",
  "Name": "test debiteur",
  "PaysVAT": true,
  "Language": "nl",
  "CurrencyISOCode": "EUR",
  "CountryCode": "NL"
}

**Retour 😗* 200 response: <int:DebtorId>


PATCH débiteur

**Endpoint 😗* api/debtor/<int:Debtor Id>

{
  // (Identique au PUT débiteur)
}

**Retour 😗* 200 response


PUT config boutique débiteur

**Endpoint 😗* api/debtor/<int:Debtor id>/webshop

**Envoi 😗*

{
  "DirectPay": true
}

**Retourne 😗* 200 response


PATCH config boutique débiteur

**Endpoint 😗* api/debtor/<int:Debtor Id>/webshop

**Envoi 😗*

{
  "DirectPay": true
}

**Retour 😗* 200 response


PUT informations débiteur

**Endpoint 😗* api/debtor/<int:Debtor Id>/(addresses|contacts|numbers)

addresses :

{
  "Line1": "",
  "Line2": "",
  "ZipCode": "",
  "City": "",
  "State": "",
  "Country": "",
  "DefaultAddresses": []
}

**Retour 😗* 200 response

contacts :

{
  "Initials": "",
  "FirstName": "",
  "MiddleName": "",
  "LastName": "",
  "DateOfBirth": "",
  "Function": ""
}

**Retour 😗* 200 response: <int:contactId>

numbers :

{
  "Code": "Code connu dans les catégories de numéros dans EasyFlor",
  "Value": "Valeur de ce numéro"
}

**Retour 😗* 200 response


PUT informations contact débiteur

**Endpoint 😗* api/debtor/<int:Debtor Id>/<int:Contact Id>/(users|mailAddresses|numbers)

users :

{
  "Username": "",
  "Password": "",
  "CanOrder": true
}

**Retour 😗* 200 response

mailAddresses :

{
  "Value": "test@test.tt"
}

**Retour 😗* 200 response

numbers (numéro de téléphone) :

{
  "Value": "00312310630587"
}

**Retour 😗* 200 response


PATCH informations débiteur

**Endpoint 😗* api/debtor/<int:Debtor Id>/(addresses|contacts|numbers)/<int:index>

**Retour 😗* 200 response


PATCH informations contact débiteur

**Endpoint 😗* api/debtor/<int:Debtor Id>/<int:Contact Id>/(users|mailAddresses)/<int:index>

**Retour 😗* 200 response


DELETE

**Endpoint 😗* api/debtor/<int:Debtor Id>/(addresses|contacts|mailAddresses)/<int:index>

**Retour 😗* 200 response

Actuellement non supporté.


Vérification du mot de passe

  1. Obtenir l'entrée utilisateur (Password + Username)
  2. SHA256(<entrée utilisateur:Password> . "" . <PasswordSalt du Username>) doit être égal à <Password du Username>

Fournisseurs

Une entreprise ou une personne qui livre des marchandises à l'entreprise dont vous vous connectez à la base de données.

GET

GET /api/supplier

**Reçu 😗* [{<Objet Supplier>}, ...]

GET /api/supplier/<string:supplierId>

**Reçu 😗*

{
  "Id": "string - Id du fournisseur dans Easyflor",
  "Name": "string - Nom du fournisseur",
  "Code": "string - Code du fournisseur",
  "Category": "string - Catégorie du fournisseur (Manufacturer/Supplier/Grower)",
  "Country": "string - Nom complet du pays",
  "Language": "string - ISO-639-1",
  "MarkupCategories": ["IEnumerable<string>"]
}

Employé

Un employé travaillant dans l'entreprise dont vous vous connectez à la base de données.

GET

GET /api/employee

**Reçu 😗* [{<Objet Employee>}, ...]

GET /api/employee/<string:employeeId>

**Reçu 😗*

{
  "Id": "string - Id de l'employé dans Easyflor",
  "Name": "string - Nom de l'employé",
  "Code": "string - Code de l'employé",
  "ArticleGroups": ["IEnumerable<string>"]
}

Pays

Un pays stocké dans notre base de données. Lié aux débiteurs, factures, fournisseurs, etc.

Commande

GET api/country

Retours Get

Nom de propriété Description Type de données Requis
Id Id du pays string oui
Name Nom dans les différentes langues LanguageValue oui
CountryCode2 Code à 2 lettres selon ISO-3166 alpha 2 string non
CountryCode3 Code à 3 lettres selon ISO-3166 alpha 3 string non

Administrations

Administrations stockées dans notre base de données. Liées aux débiteurs, emplacements, etc.

Commandes

GET api/administration
GET api/administration/{id}

Retours Get

Nom de propriété Description Type de données Requis
Id Id de l'administration string oui
Name Nom de l'administration LanguageValue oui

Emplacements

Emplacements stockés dans notre base de données. Liés aux débiteurs, achats, etc.

Commandes

GET api/location
GET api/location/{id}

Retours Get

Nom de propriété Description Type de données Requis
Id Id de l'emplacement string oui
Name Nom de l'emplacement string oui
OwnerAdministrationId L'administration du propriétaire de cet emplacement string non

Articles et produits

Article

Un article, comme des roses rouges.

GET*

GET /api/article

**Reçu 😗* [{Objet Article}, ...]

GET /api/article/<string:articleId>

**Reçu 😗*

{
  "id": "string - PK",
  "articleGroupId": "int - FK vers ArticleGroup",
  "name": "LanguageValue - Nom de l'article",
  "code": "string - Code de l'article",
  "primaryColor": "string - Code RHS",
  "secondaryColor": "string - Code RHS",
  "VBNCode": "string - Code VBN de l'article",
  "MPSCode": "string - Code MPS de l'article",
  "features": [
    {
      "code": "string - Code Floricode de la caractéristique (050)",
      "sort": "string - Sort Floricode de la caractéristique (S01)",
      "codeName": "LanguageValues - Nom complet du code (50 cm)",
      "sortName": "LanguageValues - Nom complet du Sort (Potmaat)"
    }
  ],
  "sorts": [
    {
      "id": "string - ArticleSortId",
      "name": "LanguageValue - Nom de l'article",
      "attachments": "string - Id de la pièce jointe | chapitre pièces jointes",
      "features": [],
      "tags": ["LanguageValue - Tags d'article étendus (Valentine)"]
    }
  ],
  "tags": ["LanguageValue - Tags donnés à un article (Autumn)"],
  "MarkupCategories": ["string - Catégories de marge appliquées aux produits commandés chez ce fournisseur"],
  "Employees": ["string - Employés pouvant commander chez le fournisseur"],
  "Currency": "string - Code ISO de la devise du fournisseur",
  "Country": "string - Nom du pays du fournisseur",
  "Language": "string - Code ISO de la langue du fournisseur",
  "Category": "string - Nom de la catégorie du fournisseur"
}

Ce document continue avec les sections restantes de l'API (ArticleSort, ArticleGroup, Markup Categories, Attachments, Webshop, Orders & Purchases, Invoicing - Debet, Invoicing - Credit, Payments, Synchronization, Forecasting) qui suivent la même structure que le document original. Les noms de propriétés, endpoints et exemples de code restent inchangés car ce sont des éléments techniques. Seuls les textes descriptifs et les en-têtes sont traduits en français.


ArticleSort

Une variation de l'article, par exemple vous avez les roses rouges, dont il existe une variante de 50CM et de 60CM.

PUT

PUT /api/articlesort

**Envoi 😗*

{
  "articleSorts": ["articleSortId"]
}

**Reçu 😗*

[{
  "id": "string - ArticleSortId",
  "name": "LanguageValue - Nom de l'article",
  "attachments": "string - Id de la pièce jointe | chapitre pièces jointes",
  "features": [
    {
      "code": "string - Code Floricode de la caractéristique (050)",
      "sort": "string - Sort Floricode de la caractéristique (S01)",
      "codeName": "LanguageValues - Nom complet du code (50 cm)",
      "sortName": "LanguageValues - Nom complet du Sort (Potmaat)"
    }
  ],
  "tags": ["LanguageValue - Tags d'article étendus (Valentine)"]
}]

ArticleGroup

Une catégorie pour les articles. Les catégories peuvent être imbriquées dans d'autres catégories. Ex : la catégorie Roses est sous la catégorie Fleurs.

GET

GET /api/articlegroup

**Reçu 😗* [{Objet ArticleGroup}, ...]

GET /api/articlegroup/<int:articlegroupid>

**Reçu 😗*

{
  "id": "int - PK",
  "parentId": "int - FK de ArticleGroup",
  "name": "LanguageValues - Nom du groupe d'articles",
  "featureTypes": ["string - Liste des types de caractéristiques à afficher pour le groupe"],
  "hide": "bool - true = non affiché en boutique"
}

Catégories de marge

Obtenir les catégories de marge.

Commande

GET /api/MarkupCategories

Retours Get

Nom de propriété Description Type de données Requis
Id Id de la catégorie de marge au format string (MarkupCategories/203) string oui
Name Nom de la catégorie LanguageValues oui

Pièces jointes

Une pièce jointe stockée dans notre base de données, par exemple la photo d'un article.

GET

GET https://images.easyflor.eu/vk_1297_ef/Website/Photos/<id:string>.jpg

Supprimez la chaîne attachments/ de l'ID

Retourne

Image aux formats : jpg/png/gif/bmp non redimensionnée


Boutique en ligne

ListGroup

Un groupe de listes est une collection de listes affichées sous un même en-tête dans la boutique.

GET

GET /api/listgroup

**Reçu 😗* [{<ListGroup>}, ...]

GET /api/listgroup/<int:listgroupid>

**Reçu 😗*

{
  "id": "int - PK",
  "name": "string - Nom de la liste",
  "lists": ["Array(ListObj) - ListId's"],
  "debtors": ["Array(int) - Débiteurs"]
}

ListObject

{
  "id": "string - PK List",
  "order": "int - Ordre de la liste",
  "dateFrom": "datetime - Date à partir de laquelle elle est active",
  "dateTo": "datetime - Date à partir de laquelle elle est fermée",
  "maxCancellationTime": "timespan - Délai avant qu'une commande ne puisse plus être modifiée"
}

ListArticleSort

Une variante d'article proposée sur une liste de boutique en ligne.

Événements

  • **Nom 😗* ListArticleSort
  • **Payload 😗* [{ Id: <string:id>, Type: <PUT|DELETE> }, ...]
  • Se déclenche lorsqu'un ListArticleSort est ajouté/modifié/supprimé

GET

GET /api/listarticlesort

**Reçu 😗* [{<ListArticleSort>}, ...]

GET /api/list/<string:list>
GET /api/listArticleSort/<string:id>

PUT

PUT /api/listarticlesort

**Envoi 😗*

{
  "listArticleSorts": ["string:id", "string:id"]
}

**Reçu 😗*

{
  "id": "string - PK",
  "articleSortId": "string - FK ArticleSort",
  "articleSortTags": ["LanguageValues - Combinaison de tous les tags"],
  "listId": "string - FK List",
  "salesUnits": [
    {
      "quantity": "int - quantité par unité",
      "salesUnit": "int - unité"
    }
  ],
  "features": [
    {
      "code": "string - Code Floricode de la caractéristique (050)",
      "sort": "string - Sort Floricode de la caractéristique (S01)",
      "codeName": "LanguageValues - Nom complet du code (50 cm)",
      "sortName": "LanguageValues - Nom complet du Sort (Potmaat)"
    }
  ],
  "quantityAvailable": "int - Quantité disponible",
  "isCheckedIn": "bool - Est enregistré ?",
  "supplierId": "string - FK Supplier",
  "manufacturerId": "string - FK Manufacturer",
  "attachments": "string - Pièces jointes | Chapitre Pièces jointes",
  "dateFrom": "Date - Date de début d'activité",
  "dateTo": "Date - Date de fin d'activité",
  "packagings": ["string - Tableau avec codes d'emballage (577)"],
  "minQuantity": "int - Nombre minimum à commander",
  "originalPrice": "decimal - Prix original de l'article"
}

DebtorListArticleSortPrice

Un prix pour un ListArticleSort

PUT

PUT /api/debtorlistarticlesortprice

**Envoi 😗*

{
  "debtorId": "int - DebtorId (Requis)",
  "listArticleSorts": ["string - ListArticleSortId (Requis)"]
}

**Reçu 😗*

[
  {
    "id": "string - PK ListArticleSortId",
    "stock": "int - Articles en stock",
    "prices": [
      {
        "quantity": "int - Quantité",
        "price": "decimal - Prix dans la devise du débiteur",
        "priceDefault": "decimal - Prix dans la devise de la boutique"
      }
    ]
  }
]

Favoris

Favoris stockés dans notre base de données.

Commande

GET api/ShopFavorites

Retours Get

Propriété Description Type de données Requis
DebtorId Id du débiteur string oui
ArticleSorts Tableau de variantes d'articles array oui

DebtorSessions

L'enregistrement de session du débiteur contient les dernières activités connues.

Commandes

GET api/ShopDebtorSession
GET api/ShopDebtorSession/{id}

Retours Get

Nom de propriété Description Type de données Requis
DebtorId Id du débiteur string oui
LastActivityOn Date et heure de la dernière activité DateTime oui

Commandes et achats

Pré-commandes

La demande pour une certaine variante d'article d'un débiteur.

GET

GET /api/preorder/<int:PreOrderId>

**Reçu 😗*

{
  "price": "decimal - Dans la devise du débiteur",
  "date": "date - Date de la pré-commande",
  "listArticleSortId": "string - FK ListArticleSort",
  "articleSortId": "string - FK ArticleSortId",
  "packagings": ["string - Code de l'emballage (577)"],
  "quantity": "int - Nombre d'articles commandés par le client",
  "quantityOrdered": "int - Nombre d'articles déjà commandés par le back-office",
  "quantityDistributed": "int - Nombre d'articles attribués au client",
  "dateTimeLastModified": "datetime - DateTime de la dernière modification",
  "salesUnits": [
    {
      "quantity": "int - quantité pour salesUnit",
      "salesUnit": "int - salesUnit"
    }
  ],
  "orderResponses": [
    {
      "quantity": "int - nombre commandé",
      "state": "enum - Ok, Error, Inconclusive, PreOrder, Cancelled"
    }
  ]
}

Explication des quantités

  • Quantity = Quantité nécessaire au client (le montant commandé par le client)
  • QuantityOrdered = Quantité commandée chez le fournisseur externe par le back-office. Lorsque Quantity égale QuantityOrdered, la commande est entièrement commandée chez le fournisseur externe
  • QuantityDistributed = Quantité attribuée d'articles en stock par le back-office. Lorsque Quantity égale QuantityDistributed, la commande est entièrement attribuée au client

Flux

**Directement depuis le stock 😗*

  1. Quantity = 100 exemple
  2. QuantityOrdered égale 0 ou vide (ce n'est pas commandé mais directement donné)
  3. QuantityDistributed égale Quantity

**Commandé chez un fournisseur externe mais pas encore confirmé 😗*

  1. Quantity = 100
  2. QuantityOrdered égale Quantity
  3. QuantityDistributed est inférieur à Quantity (peut être déjà partiellement confirmé)

**Commandé chez un fournisseur externe et confirmé 😗*

  1. Quantity égale QuantityOrdered égale QuantityDistributed.

Explication des états

**Lorsque Quantity est positif 😗*

État Description
Ok Commandé avec succès
Error Non disponible
Inconclusive Le tiers a retourné un message inattendu
PreOrder En commande, pas de mise à jour de statut

**Lorsque Quantity est négatif (commande partiellement ou totalement annulée) 😗*

État Description
Cancelled Commande annulée avec succès
Error Commande non annulée
Inconclusive Le tiers a retourné un message inattendu

PUT

PUT /api/preorder

**Envoi 😗*

{
  "Id": "int - Optionnel, le remplir mettra à jour la commande au lieu d'en créer une nouvelle.",
  "debtorId": "int",
  "listArticleSortId": "string - FK ListArticleSort",
  "date": "Date - en UTC (se termine par Z)",
  "quantity": "int - Nombre d'articles choisis par le débiteur fois QuantityPerUnit donné par DebtorListArticleSortPrice",
  "price": "decimal - Prix, donné par DebtorListArticleSortPrice"
}

**Reçu 😗*

{
  "id": "string - preOrder id",
  "result": "int - Quantité non ajoutée (si commandé 20, peut retourner 5, donc votre quantité réelle est 15)"
}

PreOrderDate

GET

GET api/preorderdate/YYYY-MM-DD/<int:debtorid>

**Reçu 😗* Voir Pré-commande


Achats

Un achat est une action d'achat de l'entreprise dont vous êtes dans la base de données, auprès d'un fournisseur. Un achat peut être le résultat d'une pré-commande.

Commandes

Endpoint Notes
api/purchase * uniquement en dehors des heures de bureau
api/purchase/id
api/PurchaseSinceDate/** ** uniquement les 7 derniers jours pendant les heures de bureau. Date étant la date de livraison de l'achat
api/PurchaseSinceChangeDate/** ** uniquement les 7 derniers jours pendant les heures de bureau. Date étant la date de livraison de l'achat
api/purchase/stock liste de tous les achats non entièrement vendus

**Exemples DateFrom/DateTo (DateTo est optionnel) 😗*

  • api/PurchaseSinceDate/20170317
  • api/PurchaseSinceDate/20170301/20170330
  • api/PurchaseSinceChangeDate/20170317
  • api/PurchaseSinceChangeDate/20170301/20170330

Les sections restantes (DistributedPurchase, Invoicing - Debet, Invoicing - Credit, Payments, Synchronization, Forecasting) suivent la même structure technique avec les endpoints, propriétés et exemples de code inchangés.


Facturation - Débit

Factures

Une facture créée pour un débiteur, qui peut être divisée en sous-types facture de crédit et facture de débit.

Commandes

GET /api/invoice/
GET /api/InvoiceSinceDate/<dateFrom: yyyyMMdd>/<dateTo: yyyyMMdd>
GET /api/debtorinvoice/<int : debtor id>

Note : dateTo n'est pas requis


Facture en PDF

Obtenir la facture PDF par ID.

Commande

GET /api/invoicepdf/<string:InvoiceId>

Retourne

Fichier PDF contenant la facture


Créer une facture débit pour un débiteur

Créer une facture débit contenant toutes les commandes distribuées jusqu'au moment donné.

Commande

POST /api/debtordebetinvoicecreate/<int:DebtorId>

Reçu

<string:InvoiceId>

ou

<vide> quand la facture ne peut pas être créée

Paiements

Paiements

Vous pouvez enregistrer les paiements effectués pour une facture dans Easyflor. Par exemple les transactions bancaires, les paiements en espèces et les chèques. Le paiement peut ensuite être lié à une ou plusieurs factures.

Commandes

GET api/payment
GET api/payment/id
GET api/paymentsincedate/id

date étant la date de paiement


Synchronisation

Sync

Avec ces options, vous pouvez synchroniser entre Easyflor et votre application.

Lors de la première synchronisation, effectuez une synchronisation complète de toutes les données disponibles. À partir de là, obtenez la date/heure de modification la plus élevée (DateTimeLastModified) des enregistrements exportés lors de la synchronisation complète et utilisez-la pour votre prochaine requête. Ainsi, vous n'aurez pas besoin de faire une synchronisation complète à chaque fois.

Ces appels sont limités à 2000 enregistrements par appel. Lors d'une synchronisation complète, synchronisez d'abord avec l'endpoint FULL SYNC, puis prenez le MAX(DateTimeLastModified) et synchronisez à partir de cette date pour obtenir les 2000 enregistrements suivants.

Commandes

Endpoint Description
api/DistributedPurchaseSync/ synchronisation complète
api/DistributedPurchaseSync/{DateTime} synchronisation depuis une date
api/PreOrderSync/ synchronisation complète
api/PreOrderSync/{DateTime} synchronisation depuis une date
api/DistributedTrolleySync/{DateTime} synchronisation depuis une date
api/PurchaseSync/ synchronisation complète
api/PurchaseSync/{DateTime} synchronisation depuis une date
api/DebtorSync/ synchronisation complète
api/DebtorSync/{DateTime} synchronisation depuis une date
api/InvoiceSync/ synchronisation complète
api/InvoiceSync/{DateTime} synchronisation depuis une date
api/ListPreOrderGroupItemSyncAll/{Id} synchronisation complète
api/ListPreOrderGroupItemSync/{DateTime}/{Id} synchronisation depuis une date

Prévisions

Pronostics

Données de prévision par année et par semaine. Tous les endpoints sont en lecture seule (GET) et supportent la pagination lorsque applicable.

Commandes

Endpoint Notes
api/prognoses/{year} paginé (128 éléments par page)
api/prognoses/{year}/{week}
api/prognoses/price/{year}/{week} paginé (256 éléments par page)
api/prognoses/quantity/{year}/{week} paginé (256 éléments par page)

GET tous les pronostics pour une année

GET /api/prognoses/{year}?page={page}

Récupère tous les pronostics pour l'année spécifiée, triés par numéro de semaine (décroissant). Contient uniquement les métadonnées et statistiques, pas de lignes d'articles.

GET un pronostic spécifique

GET /api/prognoses/{year}/{week}

Récupère un pronostic spécifique. Retourne 404 si le pronostic n'existe pas.

GET pronostics de prix par article

GET /api/prognoses/price/{year}/{week}?page={page}

Retourne uniquement les articles pour lesquels un pronostic de prix existe. Enrichi avec le nom de l'article et le code VBN.

GET pronostics de quantité par article

GET /api/prognoses/quantity/{year}/{week}?page={page}

Retourne uniquement les articles pour lesquels une quantité a été spécifiée. Contient les quantités et, si disponible, la répartition par jour.

Vous avez des questions ou besoin d'aide? N'hésitez pas à nous contacter par téléphone au +31 (0)71 30 20 310 ou envoyez un e-mail à support@easyflor.nl.