API Rest POST Supplier Invoice

Bonjour,

Je teste l’API et je rencontre un problème. Il est tout à fait possible de créer une facture fournisseur avec l’API mais aucun champ autre que « socid » ne semble prix en compte. En l’occurence, le champ « date » n’est jamais pris en compte. Si je poste les données suivantes:

{"socid":1, "date":1559340000}

cela fonctionne très bien pour les factures clients mais pas pour les factures fournisseurs. Dans ce dernier cas, la facture est toujours créée à la date du jour et non la date souhaitée. J’ai vérifié le code des 2 fichiers api_invoices.class.php et api_supplier_invoices.class.php et je ne vois pas ce qui coince pour les factures fournisseurs, la gestion de la donnée « date » est identique dans les 2 types de facture…

Cordialement

Hello,

J’utilise l’API REST pour créer des factures fournisseur mais j’avoue que j’utilise la date courante donc, je n’ai jamais fait gaffe à cette éventuelle anomalie.

Il faudrait que je teste avec une autre date pour voir si je reproduis.

Après test, je reproduis, donc je te confirme que le champ date est bien ignoré à la création.

En revanche, si tu fais un PUT après pour mettre à jour la facture créée en spécifiant l’ID retourné par POST, le champ date n’est cette fois pas ignoré.

Pas très propre et surtout pas normal, j’essaye de comprendre pourquoi mais en attendant c’est une solution de contournement possible même si besoin de deux requêtes API au lieu d’une seule.


Une rapide lecture de api_supplier_invoices.class.php fait apparaître que la date de la facture est écrasée si elle n’est pas spécifiée :

Je pense que pour une raison ou pour une autre, ce test doit toujours retourner faux et du coup la date, même si elle est spécifiée, sera toujours écrasée par la date courante.

Je continue de creuser :stuck_out_tongue_winking_eye:


La fonction de validation _validate($data) filtre uniquement les champs spécifiés dans le tableau $FIELDS.

Comme il n’y a pas d’élément date et que le seul élément du tableau est socid, le seul élément accepté en création sera le socid. La date, si elle est spécifiée sera supprimée par la fonction de validation puisque pas dans $FIELDS et comme elle sera considérée comme non spécifiée, on rentre dans la condition mentionnée dans le message antérieur.

Il faut donc ajouter date dans le tableau $FIELDS ou modifier la fonction de validation pour accepter l’ensemble des champs possible dans l’entité FactureFournisseur.

Je viens d’essayer, mais sans succès… Par ailleurs, validate() remplit une variable $result qui n’est pas utilisée par après, donc je ne pense pas que ce soit cela…

// Check mandatory fields
$result = $this->_validate($request_data);

foreach($request_data as $field => $value) {
    $this->invoice->$field = $value;
}
if(! array_keys($request_data, 'date')) {
    $this->invoice->date = dol_now();
}

Je sèche… :wink:

A la place de array_keys, ne faudrait-il pas plutôt array_key_exists ?
La première fonction retourne un tableau de clés.

2 « J'aime »

Exact ! Je l’avais sous les yeux… C’est correct dans api_invoices.class.php mais pas dans api_supplier_invoices.class.php. Merci !

@Pit Peux-tu faire une Pull Request sur Github pour que la correction soit intégrée dans le core ?

@jtraulle, c’est fait !

1 « J'aime »