Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Rédacteur/Modérateur
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : janvier 2003
    Messages : 2 827
    Points : 5 664
    Points
    5 664

    Par défaut Tutoriel Odoo : Les Web Services avec Odoo (OpenERP)

    Bonjour à tous,

    Dans le cadre des développements que j'ai effectués pour la société pour laquelle je bosse, j'ai mis en place un système de paiement en ligne dans l'ERP (de type Atos) . Comme j'avais besoin d'avoir la réponse de la banque pour mettre à jour la base de données d'Odoo après un paiement réussi, je me suis donc penché sur les Web Services.

    Après le paiement, la réponse de la banque est renvoyée sur une page PHP hébergée sur un serveur, et le script se connecte à Odoo (sur un autre serveur), puis exécute des méthodes (read, write, etc.) pour mettre à jour la commande/facture et valider la livraison de la commande.

    Comme de bien entendu, j'ai copieusement galéré car la documentation disponible est plutôt sommaire... J'ai donc fait un petit article qui vous présente l'interaction PHP -> Odoo via les Web Services avec des scripts d'exemples que vous pouvez tester très facilement.

    Les scripts d'exemples portent sur des méthodes simples (read, search, write, etc), et n'ont aucun rapport avec les scripts que j'avais fait pour le paiement en ligne. Néanmoins, ça devrait vous permettre de démarrer avec les Web Services sans trop de soucis.

    Comme d'habitude, si vous relevez des erreurs ou des imprécisions, n'hésitez pas à poster ici pour que j'apporte les corrections/précisions nécessaires.

    L'article : Interaction entre Odoo et PHP via XML-RPC

    Bonne lecture!

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    décembre 2006
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : décembre 2006
    Messages : 166
    Points : 96
    Points
    96

    Par défaut

    Super ce tuto qui m'aidera dans la gestion des interactions avec d'autres application. Bon Travail.
    Sinon merci pour http://www.lapinmoutardepommedauphine.com/ c'est l'un des meilleurs batteurs que j'ai entendu.

  3. #3
    Rédacteur/Modérateur
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : janvier 2003
    Messages : 2 827
    Points : 5 664
    Points
    5 664

    Par défaut

    Citation Envoyé par benoxy Voir le message
    Super ce tuto qui m'aidera dans la gestion des interactions avec d'autres application. Bon Travail.
    Sinon merci pour http://www.lapinmoutardepommedauphine.com/ c'est l'un des meilleurs batteurs que j'ai entendu.
    You welcome !

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    mars 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : mars 2011
    Messages : 117
    Points : 46
    Points
    46

    Par défaut Invoice.line, recherche et rééecriture d'une ligne en XMl RPC

    Bonjour,

    Comment faire une recherche pour sélectionner correctement dans les lignes de facture de Odoo (account.invoice.line), une ligne spécifique. Cela laisse supposer :
    - identifier l'id de l'invoice que l'on retrouve dans invoice ==> pas de pb
    - identifier l'id de la ligne en conséquence,
    - identifier par exemple de numéro de compte de compta pour le changer.

    les requêtes search que j'ai pu faire sont toutes basées sur un critère unique. Comment fait on pour mettre 2 critères via une AND

    recherche unicritère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
         $domain_filter = array (
            new xmlrpcval(
              array(new xmlrpcval('partner_id' , "int"),
                      new xmlrpcval('=',"string"),
                      new xmlrpcval($id,"string")
                    ),"array"
                  ),
                );
    
          $client = new xmlrpc_client($server_url . "/xmlrpc/object");
          $client->setSSLVerifyPeer(0);
    
          $msg = new xmlrpcmsg('execute');
          $msg->addParam(new xmlrpcval($dbname, "string"));
          $msg->addParam(new xmlrpcval($uid, "int"));
          $msg->addParam(new xmlrpcval($password, "string"));
          $msg->addParam(new xmlrpcval("res.partner", "string"));
          $msg->addParam(new xmlrpcval("search", "string"));
          $msg->addParam(new xmlrpcval($domain_filter, "array"));
          $response = $client->send($msg);
    
          $result = $response->value();
    Qu'en est il pour une recherche multicritère dans cet élément ou je voudrais avoir ma ligne dans account.invoice.line'.
    Ce qui revient à faire par exemple

    select id, invoice_id, name, account_id from table account.invoice.line where name= $name and invoice_id = $id.

    je rame dans ce cadre pour créer le code xml-rpc.

    Merci.

  5. #5
    Rédacteur/Modérateur
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : janvier 2003
    Messages : 2 827
    Points : 5 664
    Points
    5 664

    Par défaut

    Bonjour,

    As tu essayé ceci :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $domain_filter = array (
            new xmlrpcval(
              array(new xmlrpcval('invoice_id' , "string"), // Attention 'invoice_id' est un string
                      new xmlrpcval('=',"string"),
                      new xmlrpcval($invoice_id,"int") // Mais $invoice_id est un int
                    ),"array"
                  ),
          new xmlrpcval(
             array(new xmlrpcval('name' , "string"),
                      new xmlrpcval('=',"string"),
                      new xmlrpcval($name,"string")
                    ),"array"
                  ),
                );

    Et pour une requête OR :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $domain_filter = array (
          new xmlrpcval('|',"string"), // ici le parametre OR
          new xmlrpcval(
                array(new xmlrpcval('invoice_id' , "string"),
                      new xmlrpcval('=',"string"),
                      new xmlrpcval($invoice_id,"int")
                    ),"array"
                  ),
          new xmlrpcval(
                array(new xmlrpcval('name' , "string"),
                      new xmlrpcval('=',"string"),
                      new xmlrpcval($name,"string")
                    ),"array"
                  ),
                );

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    mars 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : mars 2011
    Messages : 117
    Points : 46
    Points
    46

    Par défaut

    Merci pour ta réponse rapide. voici ce que j'ai fait :

    mais cela fonctionne pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ids = $OSCOM_ODOO->odooSearch1('name','=', $shipping_title, $string = 'string', 'account.invoice.line', 'invoice_id', '=', $invoice_id);
    réponse :
    Fatal error: Call to a member function serialize() on a non-object in /home/www/clicshopping_test_ui/boutique/ClicCpanel/ext/odoo_xmlrpc/xmlrpc_lib/xmlrpc.inc.php on line 3017

    Voici la fonction faite en relation avec ta réponse.
    Une idée.

    merci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
        Public function odooSearch1($attribute, $operator, $keys, $relation, $string = 'string', $attribute1, $operator1, $keys1) {
    
          $client = new xmlrpc_client($this->server_url . "/xmlrpc/object");
          $client->setSSLVerifyPeer(0);
    
          $domain_filter = array (
                                  new xmlrpcval(
                                                array(
                                                      new xmlrpcval($attribute , "string"),
                                                      new xmlrpcval($operator,"string"),
                                                      new xmlrpcval($keys, $string),
                                                      ),"array"
                                                ),
                                  array(new xmlrpcval($attribute1 , "string"),
                                        new xmlrpcval($operator1,"string"),
                                        new xmlrpcval($keys1, "int"),
                                      ),"array"
                                );
    
    
          $msg = new xmlrpcmsg('execute');
          $msg->addParam(new xmlrpcval($this->database, "string"));
          $msg->addParam(new xmlrpcval($this->id, "int"));
          $msg->addParam(new xmlrpcval($this->password, "string"));
          $msg->addParam(new xmlrpcval($relation, "string"));
          $msg->addParam(new xmlrpcval("search", "string"));
          $msg->addParam(new xmlrpcval($domain_filter, "array"));
    
          $response = $client->send($msg);
    
          $val = $response->value();
          $ids = $val->scalarval();
    
          return $this->traverse_structure($ids);
        }

  7. #7
    Rédacteur/Modérateur
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : janvier 2003
    Messages : 2 827
    Points : 5 664
    Points
    5 664

    Par défaut

    Tu as inversé $string avec $relation, non ?
    odooSearch1($attribute, $operator, $keys, $relation, $string = 'string', $attribute1, $operator1, $keys1)
    odooSearch1('name','=', $shipping_title, $string = 'string', 'account.invoice.line', 'invoice_id', '=', $invoice_id);

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    mars 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : mars 2011
    Messages : 117
    Points : 46
    Points
    46

    Par défaut

    Citation Envoyé par N1bus Voir le message
    Tu as inversé $string avec $relation, non ?
    oui j'ai du faire une erreur en l'écrivant,mais en faisant ceci :

    $ids = $OSCOM_ODOO->odooSearch1('name','=', $shipping_title, 'account.invoice.line', 'string', 'invoice_id', '=', $invoice_id);

    j'ai la même erreur.

  9. #9
    Rédacteur/Modérateur
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : janvier 2003
    Messages : 2 827
    Points : 5 664
    Points
    5 664

    Par défaut

    Essaye sans cette ligne :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $msg->addParam(new xmlrpcval($domain_filter, "array"));

    Pour voir si ça vient du filtre. Tu devrais récupérer tous les ids.

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    mars 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : mars 2011
    Messages : 117
    Points : 46
    Points
    46

    Par défaut

    non fonctionne pas :
    Fatal error: Call to a member function scalarval() on a non-object in /home/www/clicshopping_test_ui/boutique/ClicCpanel/includes/classes/odoo.php on line 137
    qui est : $ids = $val->scalarval();

  11. #11
    Rédacteur/Modérateur
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : janvier 2003
    Messages : 2 827
    Points : 5 664
    Points
    5 664

    Par défaut

    Essaye d'afficher les erreurs avec :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $response = $client->send($msg);
     
    if ($response->faultCode()){
            echo $response->faultString();
        }

    et éventuellement avec un print_r():

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          $val = $response->value();
          print_r($val);

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    mars 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : mars 2011
    Messages : 117
    Points : 46
    Points
    46

    Par défaut

    oui j'étais entrain de faire ça

    var_dump($response)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    object(xmlrpcresp)[46]
      public 'val' => int 0
      public 'valtyp' => null
      public 'errno' => int -1
      public 'errstr' => string 'Traceback (most recent call last):
      File "/usr/lib/python2.7/dist-packages/openerp/service/wsgi_server.py", line 75, in xmlrpc_return
        result = openerp.http.dispatch_rpc(service, method, params)
      File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 100, in dispatch_rpc
        result = dispatch(method, params)
      File "/usr/lib/python2.7/dist-packages/openerp/service/model.py", line 37, in dispatch
        res = fn(db, uid, *params)
      File "/usr/lib/python2.7/dist-packages/openerp/service/model.py", li'... (length=1041)
      public 'payload' => null
      public 'hdrs' => 
        array (size=4)
          'content-type' => string 'text/xml' (length=8)
          'content-length' => string '1346' (length=4)
          'server' => string 'Werkzeug/0.9.6 Python/2.7.8' (length=27)
          'date' => string 'Wed, 19 Nov 2014 21:43:06 GMT' (length=29)
      public '_cookies' => 
        array (size=0)
          empty
      public 'content_type' => string 'text/xml' (length=8)
      public 'raw_data' => string 'HTTP/1.0 200 OK
    Content-Type: text/xml
    Content-Length: 1346
    Server: Werkzeug/0.9.6 Python/2.7.8
    Date: Wed, 19 Nov 2014 21:43:06 GMT
    
    <?xml version='1.0'?>
    <methodResponse>
    <fault>
    <value><struct>
    <member>
    <name>faultCode</name>
    <value><string>search() takes at least 4 arguments (3 given)</string></value>
    </member>
    <member>
    <name>faultString</name>
    <value><string>Traceback (most recent call last):
      File "/usr/lib/python2.7/dist-packages/openerp/service/wsgi_server.py", line 75, in xmlrpc_return
        re'... (length=1485)


    echo $response->faultString();

    Traceback (most recent call last): File "/usr/lib/python2.7/dist-packages/openerp/service/wsgi_server.py", line 75, in xmlrpc_return result = openerp.http.dispatch_rpc(service, method, params) File "/usr/lib/python2.7/dist-packages/openerp/http.py", line 100, in dispatch_rpc result = dispatch(method, params) File "/usr/lib/python2.7/dist-packages/openerp/service/model.py", line 37, in dispatch res = fn(db, uid, *params) File "/usr/lib/python2.7/dist-packages/openerp/service/model.py", line 113, in wrapper return f(dbname, *args, **kwargs) File "/usr/lib/python2.7/dist-packages/openerp/service/model.py", line 170, in execute res = execute_cr(cr, uid, obj, method, *args, **kw) File "/usr/lib/python2.7/dist-packages/openerp/service/model.py", line 159, in execute_cr return getattr(object, method)(cr, uid, *args, **kw) File "/usr/lib/python2.7/dist-packages/openerp/api.py", line 237, in wrapper return old_api(self, *args, **kwargs) TypeError: search() takes at least 4 arguments (3 given)

  13. #13
    Rédacteur/Modérateur
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : janvier 2003
    Messages : 2 827
    Points : 5 664
    Points
    5 664

    Par défaut

    Ton 2eme array() n'est pas fermé, il manque ), à la fin et new xmlrpcval( au début

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $domain_filter = array (
          new xmlrpcval(
                array(
                      new xmlrpcval($attribute , "string"),
                      new xmlrpcval($operator,"string"),
                      new xmlrpcval($keys, $string),
                      ),"array"
                ),
          new xmlrpcval(
                array(
                      new xmlrpcval($attribute1 , "string"),
                      new xmlrpcval($operator1,"string"),
                      new xmlrpcval($keys1, "int"),
                      ),"array"
                ),
          );

    C'est moi qui t'ai induis en erreur, je l'avais oublié dans ma première réponse.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    mars 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : mars 2011
    Messages : 117
    Points : 46
    Points
    46

    Par défaut

    un print_r($domain_filter);

    donne ceci



    Array ( [0] => xmlrpcval Object ( [me] => Array ( [array] => Array ( [0] => xmlrpcval Object ( [me] => Array ( [string] => name ) [mytype] => 1 [_php_class] => ) [1] => xmlrpcval Object ( [me] => Array ( [string] => = ) [mytype] => 1 [_php_class] => ) [2] => xmlrpcval Object ( [me] => Array ( [string] => Prix forfaitaire (Prix forfaitaire): ) [mytype] => 1 [_php_class] => ) ) ) [mytype] => 2 [_php_class] => ) [1] => Array ( [0] => xmlrpcval Object ( [me] => Array ( [string] => invoice_id ) [mytype] => 1 [_php_class] => ) [1] => xmlrpcval Object ( [me] => Array ( [string] => = ) [mytype] => 1 [_php_class] => ) [2] => xmlrpcval Object ( [me] => Array ( [int] => 18 ) [mytype] => 1 [_php_class] => ) ) [2] => array )

  15. #15
    Rédacteur/Modérateur
    Avatar de N1bus
    Homme Profil pro
    Dev. Web & OpenERP
    Inscrit en
    janvier 2003
    Messages
    2 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Dev. Web & OpenERP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : janvier 2003
    Messages : 2 827
    Points : 5 664
    Points
    5 664

    Par défaut

    Voir mon post d'avant

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    mars 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : mars 2011
    Messages : 117
    Points : 46
    Points
    46

    Par défaut

    ok c'est mieux plus d'erreur,



    print_r($ids);
    var_dump($ids);
    exit;

    Array ( [0] => 56 )
    array (size=1)
    0 => int 56

    Je pense que c'est bon maintenant.

    merci

Discussions similaires

  1. Différences entre les Web Services avec Apache CXF et Axis2
    Par olivier75000 dans le forum Services Web
    Réponses: 1
    Dernier message: 29/05/2014, 18h43
  2. Réponses: 0
    Dernier message: 01/02/2011, 12h24
  3. Projet sur les Web Services avec J2EE
    Par papus1984 dans le forum Services Web
    Réponses: 2
    Dernier message: 31/03/2007, 01h34
  4. [vb.net]Gestion des exceptions avec les web services
    Par mvr dans le forum Windows Forms
    Réponses: 2
    Dernier message: 05/12/2005, 23h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo