Bienvenue, Invité
Nom d'utilisateur : Mot de passe : Se souvenir de moi

SUJET : Documentation API REST

Documentation API REST il y a 1 an 10 mois #85483

  • sthienard
  • Portrait de sthienard
  • Hors ligne
  • Fresh Boarder
  • Messages : 11
  • Karma: 0
Pas de soucis, rien de pressé, je me débrouille jusque là ;)
Pour l'ajout de lignes à la création c'est bon, çà marche, et la méthode me convient très bien.

Reste à déterminer comment valider cette facture et générer sa référence FA201706-XXX par contre, ainsi que générer le PDF et le récupérer via l'API
L'administrateur a désactivé l'accès en écriture pour le public.

Documentation API REST il y a 1 an 10 mois #85664

  • sthienard
  • Portrait de sthienard
  • Hors ligne
  • Fresh Boarder
  • Messages : 11
  • Karma: 0
C'est finalement pas bien compliqué :)



Comme Dolibarr et mon application sont hébergés sur le même réseau j'ai ajouté la méthode GET /invoices/{id}/documentpath de sorte que mon application puisse directement aller chercher fichier et gérer le DOWNLOAD.
Pour une application distante j'ai ajouté la méthode GET /invoices/{id}/documentstream qui retourne le document en mode binaire.

Maintenant j'aimerais bien implémenter la passerelle sur les produits/services de sorte que mon application n'ait pas à stocker les détails de ceux-ci (tarif/description) et insérer des réglements réalisés depuis l'application externe également.
Dernière édition: il y a 1 an 10 mois par sthienard.
L'administrateur a désactivé l'accès en écriture pour le public.

Documentation API REST il y a 1 an 10 mois #85665

  • ptibogxiv
  • Portrait de ptibogxiv
  • Hors ligne
  • Gold Boarder
  • Messages : 317
  • Remerciements reçus 58
  • Karma: 11
Top boulot ! Faut partager ou inclure le code dans le core
L'administrateur a désactivé l'accès en écriture pour le public.

Documentation API REST il y a 1 an 10 mois #85666

  • chag
  • Portrait de chag
  • Hors ligne
  • Fresh Boarder
  • Messages : 14
  • Remerciements reçus 9
  • Karma: 6
Pour l'ajout de lignes, j'étais passé aussi par lines au début mais finalement, je me suis aperçu que tu peux créer directement la facture avec toutes les lignes dedans. Du coup, j'ai préféré fonctionner comme ça de façon à limiter le nombre d'appels REST. Quand j’utilise l'API, je crée des lots de factures. Quand tu en fais 1, ça va, tu peux ne pas être trop regardant sur les API call. Quand tu en crée 100 d'un coup, avec création des produits, des clients, des commandes, ça commence à prendre du temps. Ca me semblait un bon moyen.
L'administrateur a désactivé l'accès en écriture pour le public.

Documentation API REST il y a 1 an 10 mois #85676

  • sthienard
  • Portrait de sthienard
  • Hors ligne
  • Fresh Boarder
  • Messages : 11
  • Karma: 0
N'hésitez pas à commenter :
// File : \compta\facture\class\api_invoices.class.php

(...)
 use Luracast\Restler\RestException;

 require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php';
 include_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypal.lib.php';
 include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
(...)

    /**
     * Validate an invoice
     *
     * @param   int $id             Order ID
     * @param   int $idwarehouse    Warehouse ID
     * @param   int $notrigger      1=Does not execute triggers, 0= execute triggers
     *
     * @url PUT    {id}/validate
     *
     * @return  array
     * FIXME An error 403 is returned if the request has an empty body.
     * Error message: "Forbidden: Content type `text/plain` is not supported."
     * Workaround: send this in the body
     * {
     *   "idwarehouse": 0,
     *   "notrigger": 0
     * }
     */
    function validate($id, $idwarehouse=0, $notrigger=0)
    {
        if(! DolibarrApiAccess::$user->rights->facture->creer) {
            throw new RestException(401);
        }
        $result = $this->invoice->fetch($id);
        if( ! $result ) {
            throw new RestException(404, 'Invoice not found');
        }

        if( ! DolibarrApi::_checkAccessToResource('facture',$this->invoice->id)) {
            throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
        }

        $result = $this->invoice->validate(DolibarrApiAccess::$user, $idwarehouse, $notrigger);
        if ($result == 0) {
            throw new RestException(500, 'Error nothing done. May be object is already validated');
        }
        if ($result < 0) {
            throw new RestException(500, 'Error when validating invoice: '.$this->invoice->error);
        }

        return array(
            'success' => array(
                'code' => 200,
                'message' => 'Invoice validated'
            )
        );
    }


    /**
     * Generate an invoice document
     *
     * @param   int $id             Invoice ID
     * @param   string $modele      Generator to use.
     * @param   int $hidedetails    Hide details of lines
     * @param   int $hidedesc       Hide description
     * @param   int $hideref        Hide ref
     *
     * @url PUT    {id}/generatedocument
     *
     * @return  array
     * FIXME An error 403 is returned if the request has an empty body.
     * Error message: "Forbidden: Content type `text/plain` is not supported."
     * Workaround: send this in the body
     * {
     *   "modele": '',
     *   "hidedetails": 0,
     *   "hidedesc": 0,
     *   "hideref": 0
     * }
     */
    function generateDocument($id, $modele, $hidedetails=0, $hidedesc=0, $hideref=0)
    {
        if(! DolibarrApiAccess::$user->rights->facture->creer) {
            throw new RestException(401);
        }
        $result = $this->invoice->fetch($id);
        if( ! $result ) {
            throw new RestException(404, 'Invoice not found');
        }

        if( ! DolibarrApi::_checkAccessToResource('facture',$this->invoice->id)) {
            throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
        }

        $result = $this->invoice->generateDocument($modele, NULL, $hidedetails, $hidedesc, $hideref);
        if ($result == 0) {
            throw new RestException(500, 'Error nothing done. May be object is already generated');
        }
        if ($result < 0) {
            throw new RestException(500, 'Error when validating invoice: '.$this->invoice->error);
        }

        return array(
            'success' => array(
                'code' => 200,
                'message' => 'Invoice document generated',
            )
        );
    }

    /**
     * Get an invoice document storage path
     *
     * @param int   $id             Id of invoice
     *
     * @url GET {id}/documentpath
     *
     * @return object
     */
    function getDocumentPath($id)
    {
        global $db, $conf;

        if(! DolibarrApiAccess::$user->rights->facture->lire) {
            throw new RestException(401);
        }
            
        $result = $this->invoice->fetch($id);
        if( ! $result ) {
            throw new RestException(404, 'Invoice not found');
        }
        
        if( ! DolibarrApi::_checkAccessToResource('facture',$this->invoice->id)) {
            throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
        }

        $ref = dol_sanitizeFileName($this->invoice->ref);
        $fileparams = dol_most_recent_file($conf->facture->dir_output . '/' . $ref, preg_quote($ref, '/').'[^\-]+');
        $filepath = $fileparams['fullname'];

        if (! $filepath || ! is_readable($filepath)) {
            throw new RestException(404, 'Invoice document not generated');
        }

        return array(
            'success' => array(
                'code' => 200,
                'message' => NULL,
                'ref' => $ref,
                'path' => $filepath,
            )
        );
    }


    /**
     * Get an invoice document stream
     *
     * @param int   $id             Id of invoice
     *
     * @url GET {id}/documentstream
     *
     * @return object
     */
    function getDocumentStream($id)
    {
        global $db, $conf;

        if(! DolibarrApiAccess::$user->rights->facture->lire) {
            throw new RestException(401);
        }
            
        $result = $this->invoice->fetch($id);
        if( ! $result ) {
            throw new RestException(404, 'Invoice not found');
        }
        
        if( ! DolibarrApi::_checkAccessToResource('facture',$this->invoice->id)) {
            throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
        }

        $ref = dol_sanitizeFileName($this->invoice->ref);
        $fileparams = dol_most_recent_file($conf->facture->dir_output . '/' . $ref, preg_quote($ref, '/').'[^\-]+');
        $filepath = $fileparams['fullname'];

        if (! $filepath || ! is_readable($filepath)) {
            throw new RestException(404, 'Invoice document not found');
        }

        $encoding = 'UTF-8';
        $type = 'application/octet-stream';
        $attachment = true;
        $filename = $ref.'.pdf';

        header('Content-Description: File Transfer');
        if ($encoding)   header('Content-Encoding: '.$encoding);
        if ($type)       header('Content-Type: '.$type.(preg_match('/text/',$type)?'; charset="'.$conf->file->character_set_client:''));
        // Add MIME Content-Disposition from RFC 2183 (inline=automatically displayed, atachment=need user action to open)
        if ($attachment) header('Content-Disposition: attachment; filename="'.$filename.'"');
        else header('Content-Disposition: inline; filename="'.$filename.'"');
        header('Content-Length: ' . dol_filesize($filepath));
        // Ajout directives pour resoudre bug IE
        header('Cache-Control: Public, must-revalidate');
        header('Pragma: public');

        ob_clean();
        flush();
            
        readfile($filepath);

    }

    /**
     * Get an invoice Paypal Payment Url
     *
     * @param int   $id             Id of invoice
     *
     * @url GET {id}/paypalpaymenturl
     *
     * @return object
     */
    function getPaypalPaymentUrl($id)
    {
        if(! DolibarrApiAccess::$user->rights->facture->lire) {
            throw new RestException(401);
        }
            
        $result = $this->invoice->fetch($id);
        if( ! $result ) {
            throw new RestException(404, 'Invoice not found');
        }
        
        if( ! DolibarrApi::_checkAccessToResource('facture',$this->invoice->id)) {
            throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login);
        }

        return array(
            'success' => array(
                'code' => 200,
                'message' => NULL,
                'ref' => $ref,
                'url' => getPaypalPaymentUrl(0,'invoice',$this->invoice->ref),
            )
        );        

    }

(... )
L'administrateur a désactivé l'accès en écriture pour le public.

Documentation API REST il y a 1 an 10 mois #85677

  • sthienard
  • Portrait de sthienard
  • Hors ligne
  • Fresh Boarder
  • Messages : 11
  • Karma: 0
Les méthodes API pour les produits sont implémentées (\product\class\api_products.class.php) mais n'apparaissent pas dans l'explorer si je n'active pas le module "Gestion des produits", or je ne vends pas de produits mais des services (Module Services activé) ...

EDIT : J'ai activé la gestion des produits et actualisé les permissions à mon compte utilisateur pour accèder aux méthodes products, çà devrait me convenir du moment que je ne donne pas cette permission à mes utilisateurs qui gèrent la création des services
Dernière édition: il y a 1 an 10 mois par sthienard.
L'administrateur a désactivé l'accès en écriture pour le public.

Documentation API REST il y a 1 an 10 mois #85757

  • yves57
  • Portrait de yves57
  • Hors ligne
  • Gold Boarder
  • Messages : 591
  • Remerciements reçus 121
  • Karma: 10
Merci à vous deux pour vos contributions.
J'ai ajouter le lien de langue entre les deux pages pour dire que l'une est la traduction de l'autre.
Sinon, çà me donne des idées. J'ai déjà fait un petit script PHP qui utilise directement les fonctions de création d'une offre, mais sans passer par l'API REST. Cà pourrait être aussi une voie.
L'administrateur a désactivé l'accès en écriture pour le public.

Documentation API REST il y a 1 an 10 mois #85768

  • chag
  • Portrait de chag
  • Hors ligne
  • Fresh Boarder
  • Messages : 14
  • Remerciements reçus 9
  • Karma: 6
ca, c'est bien si tu es sur le même serveur non ?
L'administrateur a désactivé l'accès en écriture pour le public.

Documentation API REST il y a 1 an 10 mois #85786

  • sthienard
  • Portrait de sthienard
  • Hors ligne
  • Fresh Boarder
  • Messages : 11
  • Karma: 0
Sur le même serveur on peut utiliser la méthode getDocumentPath() par contre si l'application est ailleurs il faut réaliser un 'téléchargement' du document pdf entre le serveur Dolibarr et l'application, d'où la méthode getDocumentStream().
L'administrateur a désactivé l'accès en écriture pour le public.

Documentation API REST il y a 1 an 10 mois #85836

  • yves57
  • Portrait de yves57
  • Hors ligne
  • Gold Boarder
  • Messages : 591
  • Remerciements reçus 121
  • Karma: 10
Désolé pour le retour tardif, une moiss-bat a arraché la ligne de téléphone (rigolez pas), plus d'ADSL pendant 2 jours :/chag écrit:
ca, c'est bien si tu es sur le même serveur non ?
Oui, c'est mon cas. Mais effectivement, je ne l'ai pas développé pour une diffusion large, mais juste pour répondre à mon besoin.
Je suis quand même intéressé par cette méthode (que je viens aussi d'utiliser dans un autre contexte) qui donne plus de latitude dans l'utilisation et surtout l'implantation.
L'administrateur a désactivé l'accès en écriture pour le public.

Documentation API REST il y a 1 an 10 mois #86257

  • sthienard
  • Portrait de sthienard
  • Hors ligne
  • Fresh Boarder
  • Messages : 11
  • Karma: 0
Bonjour, j'essaie d'implémenter la classe Payments pour l'API car elle n'existe pas et si on peut déjà générer des factures, on ne peut pas encore automatiser la saisie des règlements.

J'ai donc créé le fichier api_payments.class.php dans le dossier compta/paiement/class

J'y ai déclaré la classe Payments extends DolibarrApi avec les méthodes get et index

L'API explorer ne m'affiche pas l'entrée /payments donc pouvez-vous me donner la marche à suivre pour référencer cette nouvelle entrée svp ?

Bien cordialement

PS : En attendant d'avoir une réponse à cette question je me suis placé dans compta\facture\class\api_invoices.class.php
Dernière édition: il y a 1 an 10 mois par sthienard.
L'administrateur a désactivé l'accès en écriture pour le public.

Documentation API REST il y a 1 an 9 mois #86788

  • gratalou
  • Portrait de gratalou
  • Hors ligne
  • Fresh Boarder
  • Messages : 18
  • Karma: 0
Bonjour a tous,

cela fait toute l'apres midi que j'essaie de faire fonctionner cet api rest.

J'ai lu et relu le wiki, ce post et les autres et je ne comprends pas ....

Des que j'execute la 1er commande https://monurl/api//login?login=<mon login utilisateur>&password=yourpassword en replancant mes log et pwd ...
J'ai toujours une erreur 500 ...

En modifiant le script index.php, en ajoutant des print, je constate bien que le script s’exécute, mais il ne va pas au bout de la recherche des class ... il s’arrête dans les boucle avant le sort($listofapis);

Je ne comprends pas pourquoi ... quelque aurait 'il déjà rencontré ce genre de pb ?

Est ce qu'une config du serveur pourrait empecher de scruter l'ensemble des directory ?

Merci d'avance de votre retour d’expérience

Mon dolibarr est hébergé chez OVH en mutualisé et je suis en 5.0.4 ....
L'administrateur a désactivé l'accès en écriture pour le public.

Documentation API REST il y a 1 an 9 mois #86926

  • cyberbobjr
  • Portrait de cyberbobjr
  • Hors ligne
  • Fresh Boarder
  • Messages : 3
  • Karma: 0
Bonjour,
j'ai rencontré le même problème.
Je précise que notre version de Dolbarr provient d'une version 3, qui a progressivement migré vers la 5.0.4.
J'ai constaté une erreur 500 lorsque j'accès à l'explorer REST.
Après moult essais, j'ai découvert un nombre incalculables de fichiers deprecated qui n'ont pas été supprimé suite à la dernière migration 5.0.4, ainsi que des fichiers de classes qui ont été "pluralisés".
Par exemple, api_commandes.class.php est devenu api_orders.class.

Pour trouver les fichiers qui posaient problème, j'ai ajouté des print_r sur chacune des erreurs capturées par dol_syslog.
En supprimant les fichiers obsolètes, l'explorer fonctionne de nouveau.

Bon courage.
L'administrateur a désactivé l'accès en écriture pour le public.

Documentation API REST il y a 1 an 9 mois #86937

  • dolibarr95
  • Portrait de dolibarr95
  • Hors ligne
  • Admin
  • Messages : 1094
  • Remerciements reçus 168
  • Karma: 25
merci pour ce retour :)
L'administrateur a désactivé l'accès en écriture pour le public.

Documentation API REST il y a 1 an 9 mois #86959

  • chag
  • Portrait de chag
  • Hors ligne
  • Fresh Boarder
  • Messages : 14
  • Remerciements reçus 9
  • Karma: 6
Désolé, j'ai pas réagi quand j'ai vu le bug mais pour info :

github.com/Dolibarr/dolibarr/issues/6881
L'administrateur a désactivé l'accès en écriture pour le public.