diff --git a/app/Filament/Pages/Documents.php b/app/Filament/Pages/Documents.php index f415421..eeadf00 100644 --- a/app/Filament/Pages/Documents.php +++ b/app/Filament/Pages/Documents.php @@ -27,6 +27,8 @@ class Documents extends Page public string $thirdId = ''; + public string $results = ''; + // document_detail public string $detailJnl = ''; @@ -148,6 +150,7 @@ class Documents extends Page $params = array_filter([ 'select' => $this->select, 'thirdid' => $this->thirdId, + 'results' => $this->results, ]); $response = $service->documentList($params); diff --git a/documentation/documentation_api_logistics.md b/documentation/documentation_api_logistics.md index 5efeee9..cd0e1d2 100644 --- a/documentation/documentation_api_logistics.md +++ b/documentation/documentation_api_logistics.md @@ -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": "004Error - no image found !" + }, + "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 diff --git a/memory-bank/activeContext.md b/memory-bank/activeContext.md index c2ca946..1a88f14 100644 --- a/memory-bank/activeContext.md +++ b/memory-bank/activeContext.md @@ -6,98 +6,65 @@ Dernière mise à jour : 2026-02-23 Aucun travail en cours. -## Changements récents (2026-02-23, session investigation art_list) +## Changements récents (2026-02-23, session investigation endpoints Documents) -- **Investigation du paramètre `results`** : tests systématiques via appels API directs. Le paramètre `results` n'a aucun effet observable sur `art_list` (toujours 5 résultats max) ni sur `third_list` (toujours 10 résultats max). Testé avec les valeurs 1, 3, 5, 10, 20, en int et en string, et avec omission. La limite est fixée côté serveur et non configurable. -- **Investigation du paramètre `barcode`** : tests systématiques via appels API directs. Le paramètre `barcode` est accepté par l'API mais n'a aucun effet observable sur les résultats de `art_list`. Les données retournées sont strictement identiques avec ou sans `barcode`. De plus, le paramètre `search` reste obligatoire même quand `barcode` est fourni (l'API retourne "Search terms are required" sinon). -- **Métadonnées `art_list`** : l'API retourne des métadonnées spécifiques : `rowCount` (camelCase), `source`, `executionTimeMs`, `searchColumns` (toujours "artid,name1"), `selectColumns`, `searchTerms`. Structure différente de celle documentée initialement. -- **Page Articles modifiée** : propriété `$results` (int) supprimée, propriété `$barcode` (string) ajoutée. Le champ "Nombre de résultats" remplacé par "Code-barres (barcode)" dans le formulaire. -- **Documentation mise à jour** : `WEB-A-1 (3).md` et `documentation_api_logistics.md` corrigés pour refléter les comportements réels de `results` et `barcode` sur `art_list` et `third_list`. Ajout des métadonnées spécifiques et d'un exemple de réponse complet. -- **2 nouveaux tests Pest** ajoutés dans `ArticlesPageTest.php` : vérification que `barcode` est envoyé quand renseigné, et omis quand vide. -- Total : 124 tests passent, 1 test pré-existant en échec (FilamentDashboardTest). +- **Investigation complète des 9 endpoints Documents** : tests systématiques via appels API réels pour documenter chaque endpoint de la page Documents.php. Résultats principaux : + - `document_list` : le paramètre `results` fonctionne (contrairement à `art_list` et `third_list`). Défaut ~108 résultats. `select` par défaut retourne uniquement `thirdid`. Body vide = erreur 400. + - `document_detail` : structure de réponse riche documentée (en-tête du document au premier niveau + tableaux `detail[]` et `attach[]`). Métadonnées spécifiques : `detailRowCount`, `attachRowCount`, `totalExecutionTimeMs`. + - `Document_GetStatusList` : retourne `{code, desc}`. Statuts documentés pour 6 types de journaux (03VEN, 01COM, 02NEV, 04NCV, 11COMF, 09OFFRE). + - `Document_GetUnitPriceAndVat` : `QTY` doit être string (int = HTTP 400). `DATE` doit être `YYYY-MM-DD` (autre format = HTTP 400). Réponse : `{unitprice, discount, vatid, vatpc}` en strings. + - `Document_GetDueDate` : codes `paydelay` proviennent de `codes_list` avec `code=PAYDELAY` (10 codes documentés : 30, 30F, 45F, 50, 60, 60F, 75F, 90, 90F, 0F). `date` au format `YYYY-MM-DD`. Réponse : `{duedate: "YYYY-MM-DD"}`. + - `Document_GetAttachListThumbnail` : codes d'erreur 003 (document non trouvé), 004 (pas d'image). + - **Document_GetPDF est FONCTIONNEL** : le paramètre `LAYOUT` doit être une valeur numérique en string (ex: `"1"`). Les valeurs textuelles provoquent une erreur. Retourne le PDF en base64 dans `data.pdf`. + - `document_add` / `document_mod` : pas de logs antérieurs, documentation existante cohérente. +- **Documentation massivement mise à jour** : `documentation/documentation_api_logistics.md` enrichie avec exemples de réponses réelles, structures de données détaillées, codes paydelay, format de date YYYY-MM-DD, Document_GetPDF reclassé comme fonctionnel. Ajout de la section "8. Endpoints partiellement fonctionnels". Numérotation des sections mise à jour. +- **Page Documents.php modifiée** : ajout de la propriété `$results` (int, défaut 108), transmission du paramètre `results` en string à l'API via `searchDocuments()`. +- **Vue documents.blade.php modifiée** : ajout du champ `results` (input numérique) dans le formulaire `document_list`. Suppression du bandeau "non fonctionnel" de `Document_GetPDF`, mise à jour du placeholder LAYOUT ("Ex: 1"), mise à jour de la description. +- **1 nouveau test Pest** ajouté dans `DocumentsPageTest.php` : vérification que `results` est envoyé en string à l'API. +- **Modes de paiement documentés** : `codes_list` avec `code=PAYMODE` retourne CAS (Cash), VIR (Virement), BC (Bancontact), CBEF (Cash BEF). +- Total : 125 tests passent, 2 tests pré-existants en échec (FilamentDashboardTest). ## Décisions récentes -- **Toggle Lecture/Ecriture** (2026-02-21) : Toutes les pages entité (Articles, Documents, Journaux, Tiers, Divers) disposent d'un toggle en haut de page permettant de basculer entre le mode Lecture (endpoints de récupération de données) et le mode Ecriture (endpoints d'envoi de données). Les pages sans endpoint d'écriture (Articles, Journaux, Tiers) affichent un état vide en mode écriture. TablesExplorer ne reçoit pas ce toggle (page de structure). -- **Endpoints Documents complétés** (2026-02-21) : La page Documents couvre désormais les 9 endpoints documentés : 7 en lecture (document_list, document_detail, Document_GetStatusList, Document_GetUnitPriceAndVat, Document_GetDueDate, Document_GetAttachListThumbnail, Document_GetPDF) et 2 en écriture (document_add, document_mod). Les champs tableaux (Artid, Qty, Saleprice, etc.) sont saisis en texte séparé par virgules et convertis en arrays PHP côté serveur via `splitCsv()`. -- **Page Divers créée** (2026-02-21) : Nouvelle page Filament pour les endpoints divers : getserialnumber (lecture), codes_list (lecture), custom_geninv_updatestock (écriture, non fonctionnel). -- **Endpoints non fonctionnels dans le service** (2026-02-21) : Les méthodes `documentGetPdf()` et `customGeninvUpdatestock()` ont été ajoutées au LogisticsService pour permettre le test de ces endpoints depuis l'interface, même s'ils sont non fonctionnels. Un bandeau d'avertissement ambre est affiché dans les formulaires correspondants. -- **Padding gauche sur les inputs** (2026-02-21) : Ajout de `pl-3` dans le composant `form-field.blade.php` pour un meilleur espacement visuel du texte dans les champs de saisie. -- **Convention d'écriture avec accents** (2026-02-20) : Tous les contenus rédigés en français (documentation, memory bank, règles Cursor) doivent utiliser les accents appropriés. -- **Page Documentation ajoutée** (2026-02-20) : Nouvelle page Filament `Documentation` qui affiche le fichier markdown converti en HTML via `Str::markdown()`. Actions d'en-tête : télécharger en PDF et ouvrir dans un nouvel onglet. -- **Système de design unifié** (2026-02-20) : 10 composants Blade réutilisables dans `resources/views/components/logistics/` avec convention documentée dans `.cursor/rules/design-system.mdc`. -- **Filament v5 sans authentification** : Le `AdminPanelProvider` a été configuré sans `->login()` et sans `authMiddleware` pour permettre un accès libre au dashboard. -- **Pages personnalisées plutôt que Resources** : L'application interroge une API externe, il n'y a pas de modèles Eloquent à gérer en CRUD. -- **LogisticsService** : Toutes les interactions avec l'API sont centralisées dans un seul service. -- **LogisticsApiException** : Exception dédiée créée pour distinguer les erreurs de connexion des erreurs de requête génériques. - -## Changements récents (2026-02-21, session endpoints manquants) - -- 2 méthodes ajoutées à `LogisticsService` : `documentGetPdf()`, `customGeninvUpdatestock()`. -- Page `Documents.php` réécrite avec 9 endpoints (7 lecture + 2 écriture), toggle Lecture/Ecriture, méthode `splitCsv()`. -- Pages `Articles.php`, `Journaux.php`, `Tiers.php` : ajout de la propriété `$mode` et du toggle Lecture/Ecriture. -- Page `Divers.php` créée avec 3 endpoints (getserialnumber, codes_list, custom_geninv_updatestock). -- 7 vues Blade mises à jour ou créées : documents, articles, journaux, tiers, divers. -- Composant `form-field.blade.php` : ajout de `pl-3`. -- 23 nouveaux tests Pest : `DocumentsPageTest.php` (13 tests), `DiversPageTest.php` (8 tests), 2 tests ajoutés dans `LogisticsServiceTest.php`. -- Documentation API mise à jour (références service pour les endpoints non fonctionnels). -- Total : 84 tests passent (205 assertions), 1 test pré-existant en échec (FilamentDashboardTest > it displays project statistics). +- **Document_GetPDF fonctionnel** (2026-02-23) : L'endpoint a été reclassé de "non fonctionnel" à "partiellement fonctionnel". Le paramètre LAYOUT doit être une valeur numérique en string. Le bandeau d'avertissement a été retiré de la vue. +- **Format de date YYYY-MM-DD** (2026-02-23) : Confirmé par tests que tous les endpoints acceptant une date exigent strictement le format `YYYY-MM-DD`. Documenté dans la section "Remarques et points d'attention". +- **Paramètre results sur document_list** (2026-02-23) : Le paramètre `results` fonctionne réellement sur `document_list` (contrairement à `art_list` et `third_list`). Ajouté dans le formulaire et le code PHP. +- **Toggle Lecture/Ecriture** (2026-02-21) : Toutes les pages entité disposent d'un toggle. +- **Endpoints Documents complétés** (2026-02-21) : 9 endpoints couverts. +- **Convention d'écriture avec accents** (2026-02-20) : Tous les contenus en français utilisent les accents. ## Historique -### 2026-02-20 (session documentation) +### 2026-02-23 (session investigation art_list) -- Page Filament `Documentation` créée. -- Documentation markdown réécrite intégralement avec accents français. -- Styles CSS `.documentation-prose` ajoutés dans `theme.css`. -- Plugin `@tailwindcss/typography` activé. -- Route PDF + template PDF créés. -- 5 tests Pest pour la page Documentation. -- Règle Cursor `update-documentation.mdc` créée. -- Memory bank réécrit avec accents français. +- Investigation paramètre `results` : sans effet sur `art_list` (5 max) et `third_list` (10 max). +- Investigation paramètre `barcode` : sans effet observable, `search` reste obligatoire. +- Page Articles : `$results` supprimé, `$barcode` ajouté. +- Documentation `art_list` et `third_list` corrigée. +- 2 nouveaux tests barcode. -### 2026-02-20 (session design) +### 2026-02-23 (session gestion erreurs et validation) -- 10 composants Blade créés dans `resources/views/components/logistics/`. -- Convention de design documentée dans `.cursor/rules/design-system.mdc`. -- 5 pages Filament refactorisées pour utiliser les composants du système de design. -- TablesExplorer amélioré. -- Thème Filament personnalisé créé. +- Création de `ApiErrorTranslator`. Validation des champs obligatoires. Propriétés de tracking. +- 4 nouveaux fichiers de tests. Total : 122 tests. -### 2026-02-20 (session robustesse) +### 2026-02-21 (session endpoints manquants) -- LogisticsService mis à jour : timeout, connectTimeout, retry, gestion d'erreur. -- LogisticsApiException créée. -- Tests passés de 8 à 12. +- 2 méthodes ajoutées à `LogisticsService`. Pages Documents, Divers, toggle sur toutes les pages. +- 23 nouveaux tests. + +### 2026-02-20 + +- Page Documentation, système de design, composants Blade, thème personnalisé, robustesse service. ### 2026-02-19 -- Installation de Filament v5.0.0. -- 5 pages Filament créées. -- LogisticsService créé avec 17 endpoints. -- Migration api_request_logs créée. - -## Changements récents (2026-02-23, session gestion erreurs et validation) - -- Création de `app/Support/ApiErrorTranslator.php` : normalisation du champ `error` API (null/string/array), mapping de patterns d'erreurs connus vers des explications en français. -- Composant `error-banner.blade.php` : supporte désormais les sauts de ligne via `nl2br(e($message))` pour afficher les explications sur plusieurs lignes. -- Composant `json-block.blade.php` : nouvelle prop `$searched` (défaut `false`). Affiche un `empty-state` "Aucune donnée n'a été trouvée" quand `$searched` est `true` et `$data` est vide. -- Badge de comptage : remplacé `$metadata['rowcount'] ?? 0` par `count($data)` dans les 4 vues (articles, documents, journaux, tiers) pour un comptage fiable. -- Toutes les 6 pages API (Articles, Documents, Divers, Journaux, Tiers, TablesExplorer) utilisent désormais `ApiErrorTranslator::translate()` pour les messages d'erreur. -- Ajout de propriétés de tracking (`$hasSearched`, `$hasCheckedStock`, etc.) sur toutes les pages pour distinguer "jamais recherché" de "recherché sans résultat". -- Ajout de validation des champs obligatoires avant chaque appel API avec messages en français (au lieu de `return` silencieux). Règles basées sur `documentation/WEB-A-1 (3).md`. -- Validation ajoutée : `TYPE` obligatoire pour `jnl_list`, `search` obligatoire pour `third_list`, `ARTID` obligatoire pour `art_getstk`, `code` obligatoire pour `codes_list`, champs obligatoires pour tous les endpoints Documents. -- 4 nouveaux fichiers de tests : `ArticlesPageTest.php`, `JournauxPageTest.php`, `TiersPageTest.php`, `ApiErrorTranslatorTest.php`. -- Tests existants mis à jour : `DiversPageTest.php`, `DocumentsPageTest.php` (ajout tests de validation, mise à jour assertions pour les messages traduits). -- Total : 122 tests passent (302 assertions), 1 test pré-existant en échec (FilamentDashboardTest). - -### 2026-02-23 (session investigation art_list) - -- Voir section "Changements récents" ci-dessus. +- Installation Filament v5, 5 pages, LogisticsService, migration api_request_logs. ## Prochaines étapes -- Corriger le test pré-existant `FilamentDashboardTest > it displays project statistics`. +- Corriger les 2 tests pré-existants `FilamentDashboardTest`. - Tester toutes les pages avec de vraies données API et vérifier le rendu visuel. -- Éventuellement : ajouter de la pagination ou du tri côté client pour les grands tableaux. -- Éventuellement : ajouter une page de consultation des logs API. +- Éventuellement : pagination / tri côté client pour les grands tableaux. +- Éventuellement : page de consultation des logs API. +- Éventuellement : investiguer `custom_geninv_updatestock` (clarifier STKID, TOCHECK, MODE auprès du fournisseur). diff --git a/memory-bank/productContext.md b/memory-bank/productContext.md index d0c7427..5ecdb5a 100644 --- a/memory-bank/productContext.md +++ b/memory-bank/productContext.md @@ -19,7 +19,7 @@ L'API Logistics (Flex/ESI Gescom) est un système de gestion commerciale accessi - **Résilience** : Les erreurs de connexion sont gérées avec retry automatique et messages explicites en français. Les erreurs API sont traduites et enrichies d'explications via `ApiErrorTranslator`. - **Validation** : Les champs obligatoires sont validés avant chaque appel API avec des messages en français. Les pages distinguent "jamais recherché" de "recherché sans résultat" grace aux propriétés de tracking. - **Cohérence visuelle** : Un système de design unifié (composants `x-logistics.*`) garantit une présentation homogène sur toutes les pages. -- **Couverture complète des endpoints** : Les 19 endpoints disponibles dans le service sont tous accessibles depuis l'interface, y compris les 2 non fonctionnels (avec avertissement). +- **Couverture complète des endpoints** : Les 19 endpoints disponibles dans le service sont tous accessibles depuis l'interface, dont 1 non fonctionnel (custom_geninv_updatestock, avec avertissement). L'endpoint Document_GetPDF, initialement considéré non fonctionnel, a été corrigé (LAYOUT doit être une valeur numérique). ## Expérience utilisateur @@ -28,7 +28,7 @@ L'utilisateur accède au dashboard Filament sur `http://api-logistics.test/admin 1. **Documentation** : Affichage stylisé de la documentation API complète (markdown converti en HTML). Actions : télécharger en PDF, ouvrir dans un nouvel onglet. 2. **Tables** : Barre de statistiques (endpoint, type base, nombre de tables). Liste filtrable des tables avec compteur de colonnes. Clic sur une table pour voir ses colonnes avec badges de type colorés. 3. **Articles** : Toggle Lecture/Ecriture. En lecture : formulaire de recherche (search, select, barcode) + vérification du stock d'un article par son ARTID. L'API retourne un maximum fixe de 5 résultats (non configurable). Le paramètre `barcode` est présent dans le formulaire mais son effet côté API n'est pas observable. En écriture : état vide (aucun endpoint d'écriture disponible). -4. **Documents** : Toggle Lecture/Ecriture. En lecture : 7 formulaires (document_list, document_detail, Document_GetStatusList, Document_GetUnitPriceAndVat, Document_GetDueDate, Document_GetAttachListThumbnail, Document_GetPDF). En écriture : 2 formulaires (document_add, document_mod). Le formulaire Document_GetPDF affiche un bandeau d'avertissement (endpoint non fonctionnel). +4. **Documents** : Toggle Lecture/Ecriture. En lecture : 7 formulaires (document_list avec results, document_detail, Document_GetStatusList, Document_GetUnitPriceAndVat, Document_GetDueDate, Document_GetAttachListThumbnail, Document_GetPDF). En écriture : 2 formulaires (document_add, document_mod). Le formulaire Document_GetPDF est fonctionnel (LAYOUT numérique obligatoire, ex: "1"). 5. **Journaux** : Toggle Lecture/Ecriture. En lecture : recherche par type de journal (TYPE). En écriture : état vide. 6. **Tiers** : Toggle Lecture/Ecriture. En lecture : recherche de tiers (search obligatoire) + historique des articles d'un tiers. En écriture : état vide. 7. **Divers** : Toggle Lecture/Ecriture. En lecture : getserialnumber (numéro de série), codes_list (données par code interne). En écriture : custom_geninv_updatestock (avec bandeau d'avertissement, endpoint non fonctionnel). diff --git a/memory-bank/progress.md b/memory-bank/progress.md index 8737e77..6177da2 100644 --- a/memory-bank/progress.md +++ b/memory-bank/progress.md @@ -49,29 +49,40 @@ Dernière mise à jour : 2026-02-23 - [x] Page Articles : `$results` supprimé, `$barcode` ajouté, formulaire mis à jour - [x] Documentation `art_list` et `third_list` corrigée (métadonnées réelles, paramètres inefficaces documentés) - [x] 2 nouveaux tests barcode dans ArticlesPageTest (envoi quand renseigné, omission quand vide) +- [x] Investigation complète des 9 endpoints Documents (appels API réels, structures de réponse, formats) +- [x] Document_GetPDF reclassé comme fonctionnel (LAYOUT numérique en string, ex: "1") +- [x] Format de date YYYY-MM-DD confirmé et documenté pour tous les endpoints avec paramètre date +- [x] Codes paydelay documentés (10 codes via codes_list PAYDELAY : 30, 30F, 45F, 50, 60, 60F, 75F, 90, 90F, 0F) +- [x] Modes de paiement documentés (codes_list PAYMODE : CAS, VIR, BC, CBEF) +- [x] Paramètre `results` ajouté à document_list (fonctionne, défaut ~108) +- [x] Documents.php : propriété `$results` ajoutée, transmise en string à l'API +- [x] documents.blade.php : champ `results` ajouté, bandeau "non fonctionnel" retiré de GetPDF, placeholder LAYOUT mis à jour +- [x] Documentation API massivement enrichie (réponses réelles, structures détaillées, section endpoints partiellement fonctionnels) +- [x] 1 nouveau test Pest (results envoyé en string à document_list) ## Ce qui reste à faire -- [ ] Corriger le test pré-existant `FilamentDashboardTest > it displays project statistics` +- [ ] Corriger les 2 tests pré-existants `FilamentDashboardTest` - [ ] Vérifier le rendu visuel de toutes les pages avec de vraies données API - [ ] Éventuellement : pagination / tri côté client pour les grands tableaux - [ ] Éventuellement : page de consultation des logs API ## Problèmes connus -- Le test `FilamentDashboardTest > it displays project statistics` échoue car le dashboard ne contient pas la section "Endpoints API" / "Tables accessibles" / "Pages Filament" / "Tests Pest". Le test a été créé avant la refonte du dashboard. +- 2 tests `FilamentDashboardTest` échouent car le dashboard ne contient pas les sections attendues. Tests créés avant la refonte du dashboard. - L'erreur `SQLSTATE[HY000] [1049] Unknown database` peut apparaître lors de `composer update` si la base n'est pas encore créée (script `boost:update`). Sans impact une fois la base créée. - L'API retourne chaque colonne en double dans `column_list`. Le `TablesExplorer` déduplique côté client. -- Le paramètre `results` n'a aucun effet sur `art_list` (toujours 5 max) ni sur `third_list` (toujours 10 max). Limite fixe côté serveur. +- Le paramètre `results` n'a aucun effet sur `art_list` (toujours 5 max) ni sur `third_list` (toujours 10 max). Limite fixe côté serveur. En revanche, `results` fonctionne sur `document_list` et `jnl_list`. - Le paramètre `barcode` n'a aucun effet observable sur `art_list`. Le paramètre `search` reste obligatoire même avec `barcode`. +- L'endpoint `custom_geninv_updatestock` reste non fonctionnel (paramètre STKID inconnu). ## Métriques -- Tests : 124 passent, 1 en échec pré-existant +- Tests : 125 passent, 2 en échec pré-existants - Pages Filament : 7 (Documentation, TablesExplorer, Articles, Documents, Journaux, Tiers, Divers) - Composants Blade design system : 10 - Endpoints API couverts par LogisticsService : 19 -- Endpoints accessibles depuis l'interface : 19 (dont 2 non fonctionnels) +- Endpoints accessibles depuis l'interface : 19 (dont 1 non fonctionnel, 1 partiellement fonctionnel) - Migrations : 5 (users, cache, jobs, two_factor, api_request_logs) - Règles Cursor : 4 (laravel-boost, memory-bank, design-system, update-documentation) - Classes support : 1 (ApiErrorTranslator) diff --git a/memory-bank/projectbrief.md b/memory-bank/projectbrief.md index 614217e..b3a6049 100644 --- a/memory-bank/projectbrief.md +++ b/memory-bank/projectbrief.md @@ -25,7 +25,7 @@ Application Laravel de test dont l'objectif est de comprendre le fonctionnement - Gestion robuste des erreurs API (timeout, retry, messages utilisateur en français, traduction avec explications via `ApiErrorTranslator`). - Validation des champs obligatoires avant chaque appel API avec messages en français. - Distinction "jamais recherché" / "recherché sans résultat" via propriétés de tracking. -- Avertissements visuels pour les endpoints non fonctionnels (Document_GetPDF, custom_geninv_updatestock). +- Avertissement visuel pour l'endpoint non fonctionnel (custom_geninv_updatestock). L'endpoint Document_GetPDF est désormais fonctionnel (LAYOUT numérique). ## Contraintes diff --git a/memory-bank/systemPatterns.md b/memory-bank/systemPatterns.md index b686b24..53b48b7 100644 --- a/memory-bank/systemPatterns.md +++ b/memory-bank/systemPatterns.md @@ -87,9 +87,13 @@ Chaque page Filament implémente : - **État vide** : Le composant `json-block` accepte une prop `$searched`. Quand `$searched` est `true` et `$data` est vide, un état vide est affiché. Pour les `data-table`, les vues vérifient `$hasSearched && count($data) === 0`. - **Badge de comptage** : Les badges de résultats utilisent `count($data)` (comptage réel PHP) au lieu de `$metadata['rowcount']` (retourné par l'API, parfois incorrect). +### Endpoints partiellement fonctionnels + +L'endpoint `Document_GetPDF` est fonctionnel : le paramètre `LAYOUT` doit être une valeur numérique sous forme de string (ex: `"1"`). Les valeurs textuelles provoquent une erreur. Le PDF est retourné encodé en base64 dans le champ `data.pdf`. + ### Endpoints non fonctionnels -Certains endpoints (Document_GetPDF, custom_geninv_updatestock) sont présents dans l'interface avec un bandeau d'avertissement ambre expliquant pourquoi ils ne fonctionnent pas. Les méthodes service existent dans LogisticsService pour permettre le test. +L'endpoint `custom_geninv_updatestock` est présent dans l'interface avec un bandeau d'avertissement ambre expliquant pourquoi il ne fonctionne pas. La méthode service existe dans LogisticsService pour permettre le test. ### Page Documentation @@ -195,7 +199,7 @@ database/ tests/Feature/ ArticlesPageTest.php # 8 tests page Articles (toggle, validation, tracking, erreurs) DocumentationTest.php # 5 tests page Documentation (Livewire + PDF) - DocumentsPageTest.php # 21 tests page Documents (toggle, 9 endpoints, validation, erreurs) + DocumentsPageTest.php # 22 tests page Documents (toggle, 9 endpoints, validation, erreurs, results) DiversPageTest.php # 8 tests page Divers (toggle, 3 endpoints, validation, erreurs) JournauxPageTest.php # 6 tests page Journaux (toggle, validation, tracking, erreurs) LogisticsServiceTest.php # 14 tests service API (mocks HTTP) @@ -228,4 +232,4 @@ routes/ - Toutes les vues Filament utilisent les composants `x-logistics.*` du système de design. - Après modification des vues ou composants, exécuter `npm run build` pour recompiler le thème. - Tous les contenus rédigés en français doivent utiliser les accents appropriés. -- Les endpoints non fonctionnels sont présents dans l'interface avec un bandeau d'avertissement. +- L'endpoint non fonctionnel (custom_geninv_updatestock) est présent dans l'interface avec un bandeau d'avertissement. diff --git a/memory-bank/techContext.md b/memory-bank/techContext.md index a10cdca..0d8b9e7 100644 --- a/memory-bank/techContext.md +++ b/memory-bank/techContext.md @@ -101,7 +101,7 @@ Réponse `column_list` : chaque colonne a `name`, `dataType` (C/N/T/D/L/M), `len | `art_list` | `artList(array)` | Lecture | Liste d'articles (max 5 résultats, limite fixe serveur) | select, search, barcode (results sans effet) | | `art_getstk` | `artGetStock(string)` | Lecture | Stock d'un article | ARTID | | `jnl_list` | `jnlList(array)` | Lecture | Liste des journaux | select, results, TYPE | -| `document_list` | `documentList(array)` | Lecture | Liste des documents | select, thirdid | +| `document_list` | `documentList(array)` | Lecture | Liste des documents | select, thirdid, results (fonctionne, défaut ~108) | | `document_detail` | `documentDetail(string, string)` | Lecture | Détail d'un document | jnl, number | | `Document_GetStatusList` | `documentGetStatusList(string)` | Lecture | Statuts d'un journal | jnl | | `Document_GetUnitPriceAndVat` | `documentGetUnitPriceAndVat(array)` | Lecture | Prix et TVA | ARTID, QTY, JNL, THIRDID, DATE | @@ -116,7 +116,13 @@ Réponse `column_list` : chaque colonne a `name`, `dataType` (C/N/T/D/L/M), `len | `document_mod` | `documentMod(array)` | Écriture | Modification d'un document | number, Thirdid, Artid[], Qty[], Saleprice[], JNL, ... | | `custom_geninv_updatestock` | `customGeninvUpdatestock(array)` | Écriture | Mise à jour inventaire | ARTID, STKID, QTY, ... | -**Endpoints non fonctionnels** : `Document_GetPDF` (paramètre LAYOUT inconnu), `custom_geninv_updatestock` (paramètre STKID inconnu, signification de TOCHECK/TOCHECKDETAIL/MODE à clarifier). +**Endpoints partiellement fonctionnels** : `Document_GetPDF` (LAYOUT doit être une valeur numérique en string, ex: `"1"`. Les valeurs textuelles provoquent une erreur. Retourne le PDF en base64). + +**Endpoints non fonctionnels** : `custom_geninv_updatestock` (paramètre STKID inconnu, signification de TOCHECK/TOCHECKDETAIL/MODE à clarifier). + +**Format de date** : Tous les endpoints acceptant une date (DATE, date) exigent le format `YYYY-MM-DD`. Tout autre format retourne HTTP 400. + +**Codes de délai de paiement** : Les valeurs valides pour `paydelay` (Document_GetDueDate) proviennent de `codes_list` avec `code=PAYDELAY`. Codes courants : `30`, `30F`, `45F`, `50`, `60`, `60F`, `75F`, `90`, `90F`, `0F`. Le suffixe `F` = fin de mois. ### Tables accessibles diff --git a/resources/views/filament/pages/documents.blade.php b/resources/views/filament/pages/documents.blade.php index 4d893c7..a4fe8ca 100644 --- a/resources/views/filament/pages/documents.blade.php +++ b/resources/views/filament/pages/documents.blade.php @@ -20,7 +20,7 @@
-
+
+
+ +

Effectif uniquement avec un thirdid

+
@@ -261,29 +270,26 @@ {{-- Document_GetPDF --}} - +
-
- Endpoint non fonctionnel -- la valeur attendue du paramètre LAYOUT est inconnue. -
diff --git a/tests/Feature/DocumentsPageTest.php b/tests/Feature/DocumentsPageTest.php index a5d0934..3372828 100644 --- a/tests/Feature/DocumentsPageTest.php +++ b/tests/Feature/DocumentsPageTest.php @@ -53,6 +53,50 @@ it('searches documents via document_list', function () { ->assertSet('data', [['jnl' => 'VEN', 'number' => '1']]); }); +it('sends results parameter to document_list', function () { + Http::fake([ + '*/document_list' => Http::response([ + 'data' => [['jnl' => 'VEN', 'number' => '1']], + 'metadata' => ['rowcount' => 1, 'issuccess' => true], + 'error' => null, + ]), + ]); + + Livewire::test(Documents::class) + ->set('select', 'jnl,number') + ->set('results', '20') + ->call('searchDocuments'); + + Http::assertSent(function ($request) { + $body = $request->data(); + + return str_contains($request->url(), 'document_list') + && $body['results'] === '20'; + }); +}); + +it('omits results parameter when empty', function () { + Http::fake([ + '*/document_list' => Http::response([ + 'data' => [['jnl' => 'VEN', 'number' => '1']], + 'metadata' => ['rowcount' => 1, 'issuccess' => true], + 'error' => null, + ]), + ]); + + Livewire::test(Documents::class) + ->set('select', 'jnl,number') + ->set('results', '') + ->call('searchDocuments'); + + Http::assertSent(function ($request) { + $body = $request->data(); + + return str_contains($request->url(), 'document_list') + && ! array_key_exists('results', $body); + }); +}); + it('gets document detail', function () { Http::fake([ '*/document_detail' => Http::response([