Enhance Documents page functionality and update API documentation

- Added a new `$results` property to the Documents page to allow users to specify the maximum number of results returned by the `document_list` endpoint, defaulting to ~108.
- Updated the `searchDocuments` method to include the `results` parameter in API requests, ensuring it is sent as a string.
- Modified the documents.blade.php view to include an input field for the `results` parameter, with appropriate placeholder text and guidance.
- Improved the documentation for the `document_list` endpoint to clarify the behavior of the `results` parameter and its interaction with `thirdid`.
- Updated the `Document_GetPDF` section to reflect its functionality and correct usage of the `LAYOUT` parameter.
- Added a new test to verify that the `results` parameter is correctly sent to the API.
- Overall, enhanced the user experience and API interaction for document management.
This commit is contained in:
2026-02-23 11:24:57 +01:00
parent 0ab94fdb91
commit dfe20e79d7
10 changed files with 461 additions and 152 deletions

View File

@@ -611,7 +611,7 @@ Les documents commerciaux (devis, commandes, factures, avoirs, etc.) constituent
#### `document_list` -- Liste des documents
Retourne une liste de documents, éventuellement filtrée par tiers. Permet de consulter les documents commerciaux associés à un client.
Retourne une liste de documents, éventuellement filtrée par tiers. Permet de consulter les documents commerciaux associés à un client. Les documents sont retournés triés par date décroissante (les plus récents en premier).
| | |
|---|---|
@@ -622,23 +622,54 @@ Retourne une liste de documents, éventuellement filtrée par tiers. Permet de c
| Paramètre | Type | Obligatoire | Description |
|-----------|------|:-----------:|-------------|
| `select` | `string` | Non | Colonnes à retourner, séparées par des virgules (colonnes de la table `dochead`). |
| `select` | `string` | Non | Colonnes à retourner, séparées par des virgules (colonnes de la table `dochead`). Si omis, seule la colonne `thirdid` est retournée par défaut. Colonnes utiles : `jnl`, `number`, `thirdid`, `date`, `status`, `topay`. |
| `thirdid` | `string` | Non | Identifiant du tiers (champ `custid` de la table `cust`). Si fourni, seuls les documents de ce tiers sont retournés. |
| `results` | `string` | Non | Nombre maximum de résultats à retourner. Accepte les formats string et int. La limite par défaut (sans ce paramètre) est d'environ 108 résultats. **Attention** : ce paramètre n'a d'effet que lorsqu'un `thirdid` est également fourni. Sans `thirdid`, l'API ignore `results` et retourne tous les documents disponibles (jusqu'à sa limite par défaut). |
**Métadonnées retournées** :
| Clé | Type | Description |
|-----|------|-------------|
| `rowCount` | `int` | Nombre de résultats retournés. |
| `source` | `string` | Type de base de données (ex : `DBF`). |
| `unlimited` | `bool` | Indique si la requête est sans limite (observé toujours `false`). |
**Exemple de requête** :
```json
{
"select": "docid,docdate,thirdid,totalht",
"thirdid": "CUST001"
"select": "jnl,number,thirdid,date,status,topay",
"thirdid": "_@00025009",
"results": "20"
}
```
**Exemple de réponse** :
```json
{
"data": [
{
"jnl": "03VEN",
"number": 25105397,
"thirdid": "_@00025009",
"date": "2025-07-01T00:00:00",
"status": "",
"topay": 18958.28
}
],
"metadata": { "rowCount": 1, "source": "DBF", "unlimited": false },
"error": null
}
```
**Remarque** : un appel sans aucun paramètre (body vide `{}`) retourne une erreur HTTP 400. Au minimum, le paramètre `select` ou `thirdid` doit être fourni.
---
#### `document_detail` -- Détail d'un document
Retourne le détail complet d'un document spécifique : l'en-tête (informations générales) et toutes les lignes de détail (articles, quantités, prix).
Retourne le détail complet d'un document spécifique : l'en-tête (informations générales du document), toutes les lignes de détail (articles, quantités, prix) dans un tableau `detail`, et les fichiers attachés dans un tableau `attach`.
| | |
|---|---|
@@ -649,15 +680,117 @@ Retourne le détail complet d'un document spécifique : l'en-tête (informations
| Paramètre | Type | Obligatoire | Description |
|-----------|------|:-----------:|-------------|
| `jnl` | `string` | Oui | Code du journal auquel appartient le document. |
| `number` | `string` | Oui | Identifiant unique du document dans le journal. |
| `jnl` | `string` | Oui | Code du journal auquel appartient le document (ex : `03VEN`, `01COM`). |
| `number` | `string` | Oui | Numéro du document dans le journal (ex : `25105397`). |
**Métadonnées retournées** :
| Clé | Type | Description |
|-----|------|-------------|
| `detailRowCount` | `int` | Nombre de lignes de détail. |
| `attachRowCount` | `int` | Nombre de fichiers attachés. |
| `source` | `string` | Type de base de données (ex : `DBF`). |
| `isSuccess` | `bool` | Succès de la requête. |
| `jnl` | `string` | Code du journal (écho du paramètre). |
| `number` | `string` | Numéro du document (écho du paramètre). |
| `totalExecutionTimeMs` | `float` | Temps d'exécution en millisecondes. |
**Structure de la réponse `data`** :
La réponse contient directement les champs de l'en-tête du document au premier niveau, plus deux tableaux `detail` et `attach` :
| Champ en-tête | Type | Description |
|---------------|------|-------------|
| `jnl` | `string` | Code du journal. |
| `number` | `int` | Numéro du document. |
| `type` | `string` | Type de document (ex : `CI` = facture client, `CO` = commande). |
| `date` | `string` | Date du document (format ISO `YYYY-MM-DDT00:00:00`). |
| `thirdid` | `string` | Identifiant du tiers. |
| `thirdname` | `string` | Nom du tiers. |
| `thirdaddr` | `string` | Adresse du tiers. |
| `thirdzip` | `string` | Code postal du tiers. |
| `thirdcity` | `string` | Ville du tiers. |
| `thirdcount` | `string` | Code pays du tiers (ex : `BE`). |
| `thirdvat` | `string` | Numéro de TVA du tiers. |
| `topay` | `float` | Montant total TTC. |
| `payed` | `float` | Montant déjà payé. |
| `status` | `string` | Statut du document (code de `Document_GetStatusList`). |
| `paydelay` | `string` | Code de délai de paiement. |
| `datepay` | `string` | Date d'échéance de paiement (format ISO). |
| `basis1` / `basis2` / `basis3` | `float` | Bases de calcul TVA (par taux). |
| `vatid1` / `vatid2` / `vatid3` | `string` | Identifiants de taux TVA. |
| `vatpc1` / `vatpc2` / `vatpc3` | `float` | Pourcentages TVA. |
| `vatamt1` / `vatamt2` / `vatamt3` | `float` | Montants TVA. |
| `yourref` | `string` | Référence du client. |
| `note` | `string` | Remarques sur le document. |
| `agent` | `string` | Agent commercial. |
| `vcs` | `string` | Communication structurée (VCS). |
| `time` | `string` | Horodatage de création (format ISO avec heure). |
| `docheadid` | `string` | Identifiant interne unique de l'en-tête. |
| Champ ligne (`detail[]`) | Type | Description |
|--------------------------|------|-------------|
| `docdetid` | `string` | Identifiant interne unique de la ligne. |
| `artid` | `string` | Identifiant de l'article. |
| `artname` | `string` | Nom de l'article. |
| `artdesc` | `string` | Description de l'article. |
| `qty` | `float` | Quantité. |
| `unitprice` | `float` | Prix unitaire HT. |
| `discount` | `float` | Remise (en pourcentage). |
| `amount` | `float` | Montant HT de la ligne (qty x unitprice - discount). |
| `vatid` | `string` | Code TVA. |
| `vatpc` | `float` | Pourcentage TVA. |
| `amtvatinc` | `float` | Montant TTC de la ligne. |
| `lineorder` | `int` | Ordre de la ligne dans le document. |
| `barcode` | `string` | Code-barres de l'article. |
| `status` | `string` | Statut de la ligne. |
**Exemple de requête** :
```json
{
"jnl": "VEN",
"number": "2026/0001"
"jnl": "03VEN",
"number": "25105397"
}
```
**Exemple de réponse** (simplifié) :
```json
{
"data": {
"jnl": "03VEN",
"number": 25105397,
"type": "CI",
"date": "2025-07-01T00:00:00",
"thirdid": "_@00025009",
"thirdname": "LGTECH SPRL",
"topay": 18958.28,
"status": "",
"detail": [
{
"artid": "DI21",
"artname": "SQL SERVEUR 2022 STANDARD CORE",
"qty": 4,
"unitprice": 3917,
"amount": 15668,
"vatid": "21",
"vatpc": 21,
"lineorder": 2
}
],
"attach": []
},
"metadata": {
"detailRowCount": 2,
"attachRowCount": 0,
"source": "DBF",
"isSuccess": true,
"jnl": "03VEN",
"number": "25105397",
"totalExecutionTimeMs": 24.96
},
"error": null
}
```
@@ -665,7 +798,7 @@ Retourne le détail complet d'un document spécifique : l'en-tête (informations
#### `Document_GetStatusList` -- Statuts disponibles d'un journal
Retourne la liste des statuts disponibles pour les documents d'un journal donné. Utile pour connaître les états possibles d'un document (brouillon, validé, envoyé, etc.).
Retourne la liste des statuts disponibles pour les documents d'un journal donné. Les statuts varient selon le type de journal. Utile pour connaître les états possibles d'un document (ouverte, envoyée, comptabilisée, soldée, etc.).
| | |
|---|---|
@@ -676,21 +809,47 @@ Retourne la liste des statuts disponibles pour les documents d'un journal donné
| Paramètre | Type | Obligatoire | Description |
|-----------|------|:-----------:|-------------|
| `jnl` | `string` | Oui | Code du journal dont on veut connaître les statuts. |
| `jnl` | `string` | Oui | Code du journal dont on veut connaître les statuts (ex : `03VEN`, `01COM`, `02NEV`). |
**Exemple de requête** :
```json
{
"jnl": "VEN"
"jnl": "03VEN"
}
```
**Exemple de réponse** :
```json
{
"data": [
{ "code": "GE", "desc": "Générée" },
{ "code": "SE", "desc": "Envoyée au client" },
{ "code": "AC", "desc": "Comptabilisée" },
{ "code": "PA", "desc": "Payée" }
],
"metadata": { "rowcount": 4, "issuccess": true },
"error": null
}
```
**Statuts observés par type de journal** :
| Journal | Type | Statuts |
|---------|------|---------|
| `03VEN` (Facture client) | `CI` | GE (Générée), SE (Envoyée au client), AC (Comptabilisée), PA (Payée) |
| `01COM` (Commande) | `CO` | OP (Ouverte), OS (Commandée aux fournisseurs), PR (Client Prévenu), MB (Marchandise bloquée en magasin), CL (Soldée) |
| `02NEV` (Note d'envoi) | `CD` | OP (Ouverte), TI (A facturer), IN (Facturée) |
| `04NCV` (Note de crédit) | `CC` | GE (Générée), SE (Envoyée au client), AC (Comptabilisée) |
| `11COMF` (Commande fournisseur) | -- | OP (Ouverte), SE (Envoyée au fournisseur), PD (Partiellement livrée), CL (Soldée) |
| `09OFFRE` (Offre de prix) | `CP` | (vide) -- pas de statuts configurés |
---
#### `Document_GetUnitPriceAndVat` -- Prix unitaire et TVA
Retourne le prix unitaire et la TVA applicable pour un article dans un contexte précis (journal, tiers, date, quantité). Utile pour calculer le montant d'une ligne de document avant création.
Retourne le prix unitaire et la TVA applicable pour un article dans un contexte précis (journal, tiers, date, quantité). Utile pour calculer le montant d'une ligne de document avant création. Le prix retourné est le prix configuré dans le système pour cet article/tiers/journal ; il peut être `0.00` si aucun prix n'est configuré.
| | |
|---|---|
@@ -701,29 +860,53 @@ Retourne le prix unitaire et la TVA applicable pour un article dans un contexte
| Paramètre | Type | Obligatoire | Description |
|-----------|------|:-----------:|-------------|
| `ARTID` | `string` | Oui | Identifiant de l'article. |
| `QTY` | `string` | Oui | Quantité demandée. **Doit être au format string** (ex : `"2"`), pas un nombre. |
| `JNL` | `string` | Oui | Code du journal. |
| `ARTID` | `string` | Oui | Identifiant de l'article (champ `artid` de la table `art`). |
| `QTY` | `string` | Oui | Quantité demandée. **Doit impérativement être au format string** (ex : `"2"`). Un entier provoque une erreur HTTP 400. |
| `JNL` | `string` | Oui | Code du journal (ex : `03VEN`). |
| `THIRDID` | `string` | Oui | Identifiant du tiers (champ `custid` de la table `cust`). |
| `DATE` | `string` | Oui | Date de référence pour le calcul du prix. |
| `DATE` | `string` | Oui | Date de référence pour le calcul du prix. **Format obligatoire : `YYYY-MM-DD`** (ex : `"2025-07-01"`). Tout autre format (DD/MM/YYYY, etc.) retourne une erreur HTTP 400 "Invalid date format. Expected format: YYYY-MM-DD". |
**Structure de la réponse `data`** :
| Champ | Type | Description |
|-------|------|-------------|
| `unitprice` | `string` | Prix unitaire HT (ex : `"3917.00"`, `"0.00"`). |
| `discount` | `string` | Remise applicable (ex : `"10.00"`, `"."` si aucune remise). |
| `vatid` | `string` | Code de taux TVA (ex : `"21"`). |
| `vatpc` | `string` | Pourcentage TVA (ex : `"21.00"`). |
**Exemple de requête** :
```json
{
"ARTID": "ART001",
"QTY": "5",
"JNL": "VEN",
"THIRDID": "CUST001",
"DATE": "2026-02-20"
"ARTID": "DI21",
"QTY": "4",
"JNL": "03VEN",
"THIRDID": "_@00025009",
"DATE": "2025-07-01"
}
```
**Exemple de réponse** :
```json
{
"data": {
"unitprice": "0.00",
"discount": ".",
"vatid": "21",
"vatpc": "21.00"
},
"metadata": { "rowcount": 4, "issuccess": true },
"error": null
}
```
---
#### `Document_GetDueDate` -- Échéance de paiement
#### `Document_GetDueDate` -- Echeance de paiement
Calcule la date d'échéance de paiement à partir d'un type de délai de paiement et d'une date de départ. Utile pour déterminer automatiquement la date limite de paiement d'un document.
Calcule la date d'échéance de paiement à partir d'un code de délai de paiement et d'une date de départ. Utile pour déterminer automatiquement la date limite de paiement d'un document.
| | |
|---|---|
@@ -734,15 +917,46 @@ Calcule la date d'échéance de paiement à partir d'un type de délai de paieme
| Paramètre | Type | Obligatoire | Description |
|-----------|------|:-----------:|-------------|
| `paydelay` | `string` | Oui | Type de délai de paiement (code identifiant les conditions de paiement, ex : `30J`, `60J`, `FDM`). |
| `date` | `string` | Oui | Date de départ à partir de laquelle calculer l'échéance. |
| `paydelay` | `string` | Oui | Code de délai de paiement. Les valeurs valides proviennent de `codes_list` avec `code=PAYDELAY`. Voir le tableau ci-dessous. |
| `date` | `string` | Oui | Date de départ à partir de laquelle calculer l'échéance. **Format obligatoire : `YYYY-MM-DD`** (ex : `"2025-07-01"`). Tout autre format retourne une erreur HTTP 400 "Invalid date format. Expected format: YYYY-MM-DD". |
**Codes de délai de paiement disponibles** (obtenus via `codes_list` avec `code=PAYDELAY`) :
| Code (`paydelay`) | Description | Exemple : date=2025-07-01 |
|-------------------|-------------|---------------------------|
| `30` | 30 jours date de facture | 2025-08-01 |
| `30F` | 30 jours fin de mois | 2025-08-30 |
| `45F` | 45 jours fin de mois | 2025-08-31 |
| `50` | 50 jours date de facture | 2025-08-20 |
| `60` | 60 jours date de facture | 2025-09-01 |
| `60F` | 60 jours fin de mois | 2025-08-31 |
| `75F` | 75 jours fin de mois | 2025-09-30 |
| `90` | 90 jours date de facture | 2025-10-01 |
| `90F` | 90 jours fin de mois | 2025-09-30 |
| `0F` | 0 jours fin de mois (fin du mois courant) | 2025-07-31 |
**Structure de la réponse `data`** :
| Champ | Type | Description |
|-------|------|-------------|
| `duedate` | `string` | Date d'échéance calculée (format `YYYY-MM-DD`). |
**Exemple de requête** :
```json
{
"paydelay": "30J",
"date": "2026-02-20"
"paydelay": "30",
"date": "2025-07-01"
}
```
**Exemple de réponse** :
```json
{
"data": { "duedate": "2025-08-01" },
"metadata": { "rowcount": 1, "issuccess": true },
"error": null
}
```
@@ -750,7 +964,7 @@ Calcule la date d'échéance de paiement à partir d'un type de délai de paieme
#### `Document_GetAttachListThumbnail` -- Miniatures des annexes
Retourne les miniatures des fichiers images attachés à un document. Seuls les fichiers de type image sont concernés ; les autres types de fichiers ne sont pas retournés.
Retourne les miniatures des fichiers images attachés à un document. Seuls les fichiers de type image sont concernés ; les autres types de fichiers ne sont pas retournés. Si le document n'a pas d'images attachées, l'API retourne une erreur spécifique (code 004).
| | |
|---|---|
@@ -761,15 +975,81 @@ Retourne les miniatures des fichiers images attachés à un document. Seuls les
| Paramètre | Type | Obligatoire | Description |
|-----------|------|:-----------:|-------------|
| `JNL` | `string` | Oui | Code du journal du document. |
| `NUMBER` | `string` | Oui | Identifiant du document. |
| `JNL` | `string` | Oui | Code du journal du document (ex : `03VEN`). |
| `NUMBER` | `string` | Oui | Numéro du document (ex : `25105397`). |
**Codes d'erreur spécifiques** :
| Code | Description |
|------|-------------|
| `003` | Document non trouvé (`Document {JNL} {NUMBER} not found.`). |
| `004` | Aucune image trouvée (`Error - no image found !`). Le document existe mais n'a pas de fichier image attaché. |
**Exemple de requête** :
```json
{
"JNL": "VEN",
"NUMBER": "2026/0001"
"JNL": "03VEN",
"NUMBER": "25105397"
}
```
**Exemple de réponse en erreur (pas d'image)** :
```json
{
"data": {
"xml": "<VFPData><headererror><errorcode>004</errorcode><description>Error - no image found !</description></headererror></VFPData>"
},
"metadata": { "rowcount": 1, "issuccess": false },
"error": ["Code: 004, Description: Error - no image found !"]
}
```
---
#### `Document_GetPDF` -- Generation de PDF
Genere un fichier PDF pour un document donne et le retourne en base64. Le PDF contient la mise en page complete du document (en-tete, lignes de detail, totaux, informations tiers, etc.).
| | |
|---|---|
| **URL** | `POST /{dossier}/Document_GetPDF` |
| **Methode service** | `LogisticsService::documentGetPdf(string $jnl, string $number, string $layout)` |
**Parametres** :
| Parametre | Type | Obligatoire | Description |
|-----------|------|:-----------:|-------------|
| `JNL` | `string` | Oui | Code du journal (ex : `03VEN`). |
| `NUMBER` | `string` | Oui | Numero du document (ex : `25105397`). |
| `LAYOUT` | `string` | Oui | Identifiant numerique de la mise en page du PDF. **Doit etre une valeur numerique sous forme de string** (ex : `"0"`, `"1"`, `"2"`). Toute valeur textuelle (ex : `"default"`, `"FACTURE"`, `"A4"`) provoque une erreur "Valeur, type ou nombre d'arguments de fonction, non valide". Dans les tests, toutes les valeurs numeriques (`0` a `10`, y compris `-1`) retournent le meme PDF, ce qui suggere qu'une seule mise en page est configuree dans le dossier de test. La valeur `"1"` est recommandee par defaut. |
**Structure de la reponse `data`** :
| Champ | Type | Description |
|-------|------|-------------|
| `pdf` | `string` | Contenu du fichier PDF encode en base64. Pour obtenir le fichier PDF, decoder cette chaine en base64. |
**Exemple de requete** :
```json
{
"JNL": "03VEN",
"NUMBER": "25105397",
"LAYOUT": "1"
}
```
**Exemple de reponse** :
```json
{
"data": {
"pdf": "JVBERi0xLjMNCiX..."
},
"metadata": { "rowcount": 1, "issuccess": true },
"error": null
}
```
@@ -986,26 +1266,6 @@ Modifie un document existant identifié par son numéro et son journal. Permet d
Les endpoints suivants ont été identifiés mais ne fonctionnent pas dans l'état actuel ou nécessitent des paramètres dont les valeurs attendues sont inconnues.
### `Document_GetPDF` -- Génération de PDF
| | |
|---|---|
| **URL** | `POST /{dossier}/Document_GetPDF` |
| **Méthode service** | `LogisticsService::documentGetPdf(string $jnl, string $number, string $layout)` |
| **Statut** | Non fonctionnel |
**Paramètres connus** :
| Paramètre | Type | Description |
|-----------|------|-------------|
| `JNL` | `string` | Code du journal. |
| `NUMBER` | `string` | Identifiant du document. |
| `LAYOUT` | `string` | Mise en page du PDF. **Valeur attendue inconnue**. |
**Problème** : le paramètre `LAYOUT` est requis mais sa valeur attendue n'est pas documentée par le fournisseur de l'API. L'endpoint retourne une erreur sans ce paramètre.
---
### `custom_geninv_updatestock` -- Mise à jour de l'inventaire
| | |
@@ -1070,7 +1330,7 @@ Tiers (cust)
4. **Paramètre `search` obligatoire pour `third_list`** : l'endpoint `third_list` exige le paramètre `search`. Un appel sans ce paramètre retourne une erreur.
5. **Paramètre `results`** : le comportement de ce paramètre varie selon l'endpoint. Pour `art_list`, il n'a **aucun effet** (toujours 5 résultats maximum). Pour `third_list`, il n'a **aucun effet** non plus (toujours 10 résultats maximum). En revanche, pour `jnl_list`, le paramètre `results` **fonctionne réellement** et limite le nombre de résultats retournés (la limite par défaut sans ce paramètre est de 30). Le paramètre doit être au format string pour `jnl_list`.
5. **Paramètre `results`** : le comportement de ce paramètre varie selon l'endpoint. Pour `art_list`, il n'a **aucun effet** (toujours 5 résultats maximum). Pour `third_list`, il n'a **aucun effet** non plus (toujours 10 résultats maximum). En revanche, pour `jnl_list` et `document_list`, le paramètre `results` **fonctionne réellement** et limite le nombre de résultats retournés. Pour `jnl_list`, la limite par défaut est de 30, et le paramètre doit être au format string. Pour `document_list`, la limite par défaut est d'environ 108 résultats. **Attention** : pour `document_list`, le paramètre `results` n'a d'effet que lorsqu'un `thirdid` est également fourni. Sans `thirdid`, l'API ignore `results` et retourne tous les documents disponibles.
6. **Paramètre `TYPE` obligatoire pour `jnl_list`** : l'endpoint `jnl_list` exige le paramètre `TYPE`. Le filtre accepte 1 caractère (filtre large : `C` pour tous les journaux client) ou 2 caractères (filtre exact : `CI` pour les factures client uniquement). Un appel sans ce paramètre retourne une erreur.
@@ -1088,6 +1348,14 @@ Tiers (cust)
13. **Timeout** : certaines requêtes peuvent être lentes selon le volume de données. Le timeout par défaut est configuré à 300 secondes. En cas de timeout, vérifiez la configuration `LOGISTICS_API_TIMEOUT`.
14. **Format de date obligatoire** : les endpoints qui acceptent un paramètre de date (`DATE`, `date`) exigent le format **`YYYY-MM-DD`** (ex : `"2025-07-01"`). Tout autre format (DD/MM/YYYY, MM/DD/YYYY, etc.) retourne une erreur HTTP 400 avec le message "Invalid date format. Expected format: YYYY-MM-DD". Les dates dans les réponses API utilisent le format ISO `YYYY-MM-DDT00:00:00` (avec composante horaire).
15. **`Document_GetPDF` et parametre `LAYOUT`** : le parametre `LAYOUT` de l'endpoint `Document_GetPDF` doit etre une **valeur numerique sous forme de string** (ex : `"1"`). Les valeurs textuelles (`"default"`, `"FACTURE"`, `"A4"`, etc.) provoquent une erreur. La valeur `"1"` est recommandee par defaut.
16. **Codes de délai de paiement** : les valeurs valides pour `paydelay` (utilisé dans `Document_GetDueDate`) sont obtenues via l'endpoint `codes_list` avec `code=PAYDELAY`. Les codes courants sont : `30`, `30F`, `45F`, `50`, `60`, `60F`, `75F`, `90`, `90F`, `0F`. Le suffixe `F` indique un calcul "fin de mois" (l'échéance tombe le dernier jour du mois de calcul).
17. **Modes de paiement** : les valeurs valides pour les modes de paiement sont obtenues via `codes_list` avec `code=PAYMODE`. Les codes courants sont : `CAS` (Cash), `VIR` (Virement), `BC` (Bancontact), `CBEF` (Cash BEF).
---
## 11. Ressources externes