diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php
index ec4cc4b49aa..b4ed55e0e72 100644
--- a/htdocs/product/class/product.class.php
+++ b/htdocs/product/class/product.class.php
@@ -124,6 +124,10 @@ class Product extends CommonObject
//! Canevas a utiliser si le produit n'est pas un produit generique
var $canvas;
+ var $import_key;
+ var $date_creation;
+ var $date_modification;
+
//! Id du fournisseur
var $product_fourn_id;
@@ -997,21 +1001,21 @@ class Product extends CommonObject
/**
* Load a product in memory from database
*
- * @param id Id of product/service to load
- * @param ref Ref of product/service to load
- * @return int <0 if KO, >0 if OK
+ * @param int $id Id of product/service to load
+ * @param string $ref Ref of product/service to load
+ * @param string $ref_ext Ref ext of product/service to load
+ * @return int <0 if KO, >0 if OK
*/
- function fetch($id='',$ref='')
+ function fetch($id='',$ref='',$ref_ext='')
{
include_once(DOL_DOCUMENT_ROOT.'/lib/company.lib.php');
- global $langs;
- global $conf;
+ global $langs, $conf;
- dol_syslog("Product::fetch id=$id ref=$ref");
+ dol_syslog("Product::fetch id=$id ref=$ref ref_ext=$ref_ext");
// Check parameters
- if (! $id && ! $ref)
+ if (! $id && ! $ref && ! $ref_ext)
{
$this->error=$langs->trans('ErrorWrongParameters');
dol_print_error("Product::fetch ".$this->error, LOG_ERR);
@@ -1023,10 +1027,11 @@ class Product extends CommonObject
$sql.= " tobuy, fk_product_type, duration, seuil_stock_alerte, canvas,";
$sql.= " weight, weight_units, length, length_units, surface, surface_units, volume, volume_units, barcode, fk_barcode_type, finished,";
$sql.= " accountancy_code_buy, accountancy_code_sell, stock, pmp,";
- $sql.= " import_key";
+ $sql.= " datec, tms, import_key";
$sql.= " FROM ".MAIN_DB_PREFIX."product";
if ($id) $sql.= " WHERE rowid = '".$id."'";
else if ($ref) $sql.= " WHERE ref = '".$this->db->escape($ref)."'";
+ else if ($ref_ext) $sql.= " WHERE ref_ext = '".$this->db->escape($ref_ext)."'";
dol_syslog("Product::fetch sql=".$sql);
$resql = $this->db->query($sql);
@@ -1083,6 +1088,8 @@ class Product extends CommonObject
$this->stock_reel = $object->stock;
$this->pmp = $object->pmp;
+ $this->date_creation = $object->datec;
+ $this->date_modification = $object->tms;
$this->import_key = $object->import_key;
$this->db->free($resql);
diff --git a/htdocs/webservices/admin/webservices.php b/htdocs/webservices/admin/webservices.php
index 128b13106e6..b70281734b8 100644
--- a/htdocs/webservices/admin/webservices.php
+++ b/htdocs/webservices/admin/webservices.php
@@ -101,6 +101,11 @@ print '
';
print ''.$langs->trans("WSDLCanBeDownloadedHere").':
';
$url=DOL_MAIN_URL_ROOT.'/webservices/server_other.php?wsdl';
print img_picto('','object_globe.png').' '.''.$url."
\n";
+if ($conf->product->enabled || $conf->service->enabled)
+{
+ $url=DOL_MAIN_URL_ROOT.'/webservices/server_productorservice.php?wsdl';
+ print img_picto('','object_globe.png').' '.''.$url."
\n";
+}
if ($conf->societe->enabled)
{
$url=DOL_MAIN_URL_ROOT.'/webservices/server_thirdparty.php?wsdl';
@@ -123,6 +128,11 @@ print '
';
print ''.$langs->trans("EndPointIs").':
';
$url=DOL_MAIN_URL_ROOT.'/webservices/server_other.php';
print img_picto('','object_globe.png').' '.''.$url."
\n";
+if ($conf->product->enabled || $conf->service->enabled)
+{
+ $url=DOL_MAIN_URL_ROOT.'/webservices/server_productorservice.php';
+ print img_picto('','object_globe.png').' '.''.$url."
\n";
+}
if ($conf->societe->enabled)
{
$url=DOL_MAIN_URL_ROOT.'/webservices/server_thirdparty.php';
diff --git a/htdocs/webservices/demo_wsclient_productorservice.php b/htdocs/webservices/demo_wsclient_productorservice.php
new file mode 100755
index 00000000000..a7f1c1e7a1e
--- /dev/null
+++ b/htdocs/webservices/demo_wsclient_productorservice.php
@@ -0,0 +1,140 @@
+
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/**
+ * \file htdocs/webservices/demo_wsclient_productorservice.php
+ * \brief Demo page to make a client call to Dolibarr WebServices "server_product"
+ */
+
+// This is to make Dolibarr working with Plesk
+set_include_path($_SERVER['DOCUMENT_ROOT'].'/htdocs');
+
+require_once("../master.inc.php");
+require_once(NUSOAP_PATH.'/nusoap.php'); // Include SOAP
+
+$WS_DOL_URL = DOL_MAIN_URL_ROOT.'/webservices/server_productorservice.php';
+//$WS_DOL_URL = 'http://localhost:8080/'; // To test with Soapui mock. If not a page, should end with /
+$WS_METHOD1 = 'createProductOrService';
+$WS_METHOD2 = 'getProductOrService';
+$ns='http://www.dolibarr.org/ns/';
+
+
+// Set the WebService URL
+dol_syslog("Create nusoap_client for URL=".$WS_DOL_URL);
+$soapclient1 = new nusoap_client($WS_DOL_URL);
+if ($soapclient1)
+{
+ $soapclient1->soap_defencoding='UTF-8';
+ $soapclient1->decodeUTF8(false);
+}
+$soapclient2 = new nusoap_client($WS_DOL_URL);
+if ($soapclient2)
+{
+ $soapclient2->soap_defencoding='UTF-8';
+ $soapclient2->decodeUTF8(false);
+}
+
+// Call the WebService method and store its result in $result.
+$authentication=array(
+ 'dolibarrkey'=>$conf->global->WEBSERVICES_KEY,
+ 'sourceapplication'=>'DEMO',
+ 'login'=>'admin',
+ 'password'=>'changeme',
+ 'entity'=>'');
+
+
+// Test url 1
+if ($WS_METHOD1)
+{
+ $parameters = array('authentication'=>$authentication,'id'=>1,'ref'=>'');
+ dol_syslog("Call method ".$WS_METHOD1);
+ $result1 = $soapclient1->call($WS_METHOD1,$parameters,$ns,'');
+ if (! $result1)
+ {
+ print $soapclient1->error_str;
+ print "
\n\n";
+ print $soapclient1->request;
+ print "
\n\n";
+ print $soapclient1->response;
+ exit;
+ }
+}
+
+// Test url 2
+if ($WS_METHOD2)
+{
+ $parameters = array('authentication'=>$authentication,'id'=>1,'ref'=>'');
+ dol_syslog("Call method ".$WS_METHOD2);
+ $result2 = $soapclient1->call($WS_METHOD2,$parameters,$ns,'');
+ if (! $result2)
+ {
+ print $soapclient1->error_str;
+ print "
\n\n";
+ print $soapclient1->request;
+ print "
\n\n";
+ print $soapclient1->response;
+ exit;
+ }
+}
+
+
+/*
+ * View
+ */
+
+header("Content-type: text/html; charset=utf8");
+print ''."\n";
+echo ''."\n";
+echo '
';
+echo 'WebService Test: '.$WS_METHOD1.'';
+echo ''."\n";
+
+echo ''."\n";
+
+echo "Request:
";
+echo 'Function
';
+echo $WS_METHOD1;
+echo 'SOAP Message
';
+echo '' . htmlspecialchars($soapclient1->request, ENT_QUOTES) . '
';
+echo '
';
+echo "Response:
";
+echo 'Result
';
+echo '';
+print_r($result1);
+echo '
';
+echo 'SOAP Message
';
+echo '' . htmlspecialchars($soapclient1->response, ENT_QUOTES) . '
';
+
+print '
';
+
+echo "Request:
";
+echo 'Function
';
+echo $WS_METHOD2;
+echo 'SOAP Message
';
+echo '' . htmlspecialchars($soapclient2->request, ENT_QUOTES) . '
';
+echo '
';
+echo "Response:
";
+echo 'Result
';
+echo '';
+print_r($result2);
+echo '
';
+echo 'SOAP Message
';
+echo '' . htmlspecialchars($soapclient2->response, ENT_QUOTES) . '
';
+
+echo ''."\n";;
+echo ''."\n";;
+?>
diff --git a/htdocs/webservices/server_invoice.php b/htdocs/webservices/server_invoice.php
index c43dc993d62..030b8c234a2 100755
--- a/htdocs/webservices/server_invoice.php
+++ b/htdocs/webservices/server_invoice.php
@@ -52,7 +52,7 @@ $server->configureWSDL('WebServicesDolibarrInvoice',$ns);
$server->wsdl->schemaTargetNamespace=$ns;
-// Define WSDL content
+// Define WSDL Authentication object
$server->wsdl->addComplexType(
'authentication',
'complexType',
@@ -67,7 +67,20 @@ $server->wsdl->addComplexType(
'entity' => array('name'=>'entity','type'=>'xsd:string'),
)
);
+// Define WSDL Return object
+$server->wsdl->addComplexType(
+ 'result',
+ 'complexType',
+ 'struct',
+ 'all',
+ '',
+ array(
+ 'result_code' => array('name'=>'result_code','type'=>'xsd:string'),
+ 'result_label' => array('name'=>'result_label','type'=>'xsd:string'),
+ )
+);
+// Define other specific objects
$server->wsdl->addComplexType(
'line',
'complexType',
@@ -183,19 +196,6 @@ $server->wsdl->addComplexType(
);
-$server->wsdl->addComplexType(
- 'result',
- 'complexType',
- 'struct',
- 'all',
- '',
- array(
- 'result_code' => array('name'=>'result_code','type'=>'xsd:string'),
- 'result_label' => array('name'=>'result_label','type'=>'xsd:string'),
- )
-);
-
-
// 5 styles: RPC/encoded, RPC/literal, Document/encoded (not WS-I compliant), Document/literal, Document/literal wrapped
// Style merely dictates how to translate a WSDL binding to a SOAP message. Nothing more. You can use either style with any programming model.
@@ -205,43 +205,49 @@ $styleuse='encoded'; // encoded/literal/literal wrapped
// Better choice is document/literal wrapped but literal wrapped not supported by nusoap.
// Register WSDL
-$server->register('getInvoice',
-// Entry values
-array('authentication'=>'tns:authentication','id'=>'xsd:string','ref'=>'xsd:string','ref_ext'=>'xsd:string'),
-// Exit values
-array('result'=>'tns:result','invoice'=>'tns:invoice'),
-$ns,
-$ns.'#getInvoice',
-$styledoc,
-$styleuse,
-'WS to get a particular invoice'
+$server->register(
+ 'getInvoice',
+ // Entry values
+ array('authentication'=>'tns:authentication','id'=>'xsd:string','ref'=>'xsd:string','ref_ext'=>'xsd:string'),
+ // Exit values
+ array('result'=>'tns:result','invoice'=>'tns:invoice'),
+ $ns,
+ $ns.'#getInvoice',
+ $styledoc,
+ $styleuse,
+ 'WS to get a particular invoice'
);
-$server->register('getInvoicesForThirdParty',
-// Entry values
-array('authentication'=>'tns:authentication','idthirdparty'=>'xsd:string'),
-// Exit values
-array('result'=>'tns:result','invoices'=>'tns:InvoicesArray2'),
-$ns,
-$ns.'#getInvoicesForThirdParty',
-$styledoc,
-$styleuse,
-'WS to get all invoices of a third party'
+$server->register(
+ 'getInvoicesForThirdParty',
+ // Entry values
+ array('authentication'=>'tns:authentication','idthirdparty'=>'xsd:string'),
+ // Exit values
+ array('result'=>'tns:result','invoices'=>'tns:InvoicesArray2'),
+ $ns,
+ $ns.'#getInvoicesForThirdParty',
+ $styledoc,
+ $styleuse,
+ 'WS to get all invoices of a third party'
);
-$server->register('createInvoice',
-// Entry values
-array('authentication'=>'tns:authentication','invoice'=>'tns:invoice'),
-// Exit values
-array('result'=>'tns:result','id'=>'xsd:string','ref'=>'xsd:string'),
-$ns,
-$ns.'#createInvoice',
-$styledoc,
-$styleuse,
-'WS to create an invoice'
+$server->register(
+ 'createInvoice',
+ // Entry values
+ array('authentication'=>'tns:authentication','invoice'=>'tns:invoice'),
+ // Exit values
+ array('result'=>'tns:result','id'=>'xsd:string','ref'=>'xsd:string'),
+ $ns,
+ $ns.'#createInvoice',
+ $styledoc,
+ $styleuse,
+ 'WS to create an invoice'
);
/**
* Get invoice from id, ref or ref_ext
+ *
+ * @param object $authentication
+ *
*/
function getInvoice($authentication,$id='',$ref='',$ref_ext='')
{
diff --git a/htdocs/webservices/server_other.php b/htdocs/webservices/server_other.php
index 53ab2e9b168..a12db69dcfd 100644
--- a/htdocs/webservices/server_other.php
+++ b/htdocs/webservices/server_other.php
@@ -52,21 +52,22 @@ $server->configureWSDL('WebServicesDolibarrOther',$ns);
$server->wsdl->schemaTargetNamespace=$ns;
-// Define WSDL content
+// Define WSDL Authentication object
$server->wsdl->addComplexType(
- 'authentication',
- 'complexType',
- 'struct',
- 'all',
- '',
- array(
- 'dolibarrkey' => array('name'=>'dolibarrkey','type'=>'xsd:string'),
- 'sourceapplication' => array('name'=>'sourceapplication','type'=>'xsd:string'),
- 'login' => array('name'=>'login','type'=>'xsd:string'),
- 'password' => array('name'=>'password','type'=>'xsd:string'),
- 'entity' => array('name'=>'entity','type'=>'xsd:string'),
- ));
-
+ 'authentication',
+ 'complexType',
+ 'struct',
+ 'all',
+ '',
+ array(
+ 'dolibarrkey' => array('name'=>'dolibarrkey','type'=>'xsd:string'),
+ 'sourceapplication' => array('name'=>'sourceapplication','type'=>'xsd:string'),
+ 'login' => array('name'=>'login','type'=>'xsd:string'),
+ 'password' => array('name'=>'password','type'=>'xsd:string'),
+ 'entity' => array('name'=>'entity','type'=>'xsd:string'),
+ )
+);
+// Define WSDL Return object
$server->wsdl->addComplexType(
'result',
'complexType',
@@ -76,7 +77,11 @@ $server->wsdl->addComplexType(
array(
'result_code' => array('name'=>'result_code','type'=>'xsd:string'),
'result_label' => array('name'=>'result_label','type'=>'xsd:string'),
- ));
+ )
+);
+
+// Define other specific objects
+// None
// 5 styles: RPC/encoded, RPC/literal, Document/encoded (not WS-I compliant), Document/literal, Document/literal wrapped
diff --git a/htdocs/webservices/server_productorservice.php b/htdocs/webservices/server_productorservice.php
new file mode 100755
index 00000000000..59676e34395
--- /dev/null
+++ b/htdocs/webservices/server_productorservice.php
@@ -0,0 +1,221 @@
+
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+/**
+ * \file htdocs/webservices/server_productorservice.php
+ * \brief File that is entry point to call Dolibarr WebServices
+ */
+
+// This is to make Dolibarr working with Plesk
+set_include_path($_SERVER['DOCUMENT_ROOT'].'/htdocs');
+
+require_once("../master.inc.php");
+require_once(NUSOAP_PATH.'/nusoap.php'); // Include SOAP
+require_once(DOL_DOCUMENT_ROOT."/lib/ws.lib.php");
+require_once(DOL_DOCUMENT_ROOT."/user/class/user.class.php");
+
+require_once(DOL_DOCUMENT_ROOT."/product/class/product.class.php");
+
+
+dol_syslog("Call Dolibarr webservices interfaces");
+
+// Enable and test if module web services is enabled
+if (empty($conf->global->MAIN_MODULE_WEBSERVICES))
+{
+ $langs->load("admin");
+ dol_syslog("Call Dolibarr webservices interfaces with module webservices disabled");
+ print $langs->trans("WarningModuleNotActive",'WebServices').'.
';
+ print $langs->trans("ToActivateModule");
+ exit;
+}
+
+// Create the soap Object
+$server = new nusoap_server();
+$server->soap_defencoding='UTF-8';
+$server->decode_utf8=false;
+$ns='http://www.dolibarr.org/ns/';
+$server->configureWSDL('WebServicesDolibarrProductOrService',$ns);
+$server->wsdl->schemaTargetNamespace=$ns;
+
+
+// Define WSDL Authentication object
+$server->wsdl->addComplexType(
+ 'authentication',
+ 'complexType',
+ 'struct',
+ 'all',
+ '',
+ array(
+ 'dolibarrkey' => array('name'=>'dolibarrkey','type'=>'xsd:string'),
+ 'sourceapplication' => array('name'=>'sourceapplication','type'=>'xsd:string'),
+ 'login' => array('name'=>'login','type'=>'xsd:string'),
+ 'password' => array('name'=>'password','type'=>'xsd:string'),
+ 'entity' => array('name'=>'entity','type'=>'xsd:string'),
+ )
+);
+// Define WSDL Return object
+$server->wsdl->addComplexType(
+ 'result',
+ 'complexType',
+ 'struct',
+ 'all',
+ '',
+ array(
+ 'result_code' => array('name'=>'result_code','type'=>'xsd:string'),
+ 'result_label' => array('name'=>'result_label','type'=>'xsd:string'),
+ )
+);
+
+// Define other specific objects
+$server->wsdl->addComplexType(
+ 'product',
+ 'complexType',
+ 'struct',
+ 'all',
+ '',
+ array(
+ 'id' => array('name'=>'id','type'=>'xsd:string'),
+ 'ref' => array('name'=>'name','type'=>'xsd:string'),
+ 'ref_ext' => array('name'=>'ref_ext','type'=>'xsd:string'),
+ 'label' => array('name'=>'label','type'=>'xsd:string'),
+ 'description' => array('name'=>'description','type'=>'xsd:string'),
+ 'date_creation' => array('name'=>'date_creation','type'=>'xsd:dateTime'),
+ 'date_modification' => array('name'=>'date_modification','type'=>'xsd:dateTime'),
+ 'note' => array('name'=>'note','type'=>'xsd:string'),
+ 'tobuy' => array('name'=>'tobuy','type'=>'xsd:string'),
+ 'tosell' => array('name'=>'tosell','type'=>'xsd:string'),
+ 'type' => array('name'=>'type','type'=>'xsd:string'),
+ 'barcode' => array('name'=>'barcode','type'=>'xsd:string'),
+ 'country_id' => array('name'=>'country_id','type'=>'xsd:string')
+ )
+);
+
+
+
+// 5 styles: RPC/encoded, RPC/literal, Document/encoded (not WS-I compliant), Document/literal, Document/literal wrapped
+// Style merely dictates how to translate a WSDL binding to a SOAP message. Nothing more. You can use either style with any programming model.
+// http://www.ibm.com/developerworks/webservices/library/ws-whichwsdl/
+$styledoc='rpc'; // rpc/document (document is an extend into SOAP 1.0 to support unstructured messages)
+$styleuse='encoded'; // encoded/literal/literal wrapped
+// Better choice is document/literal wrapped but literal wrapped not supported by nusoap.
+
+// Register WSDL
+$server->register(
+ 'createProductOrService',
+ // Entry values
+ array('authentication'=>'tns:authentication','product'=>'tns:product'),
+ // Exit values
+ array('result'=>'tns:result','id'=>'xsd:string'),
+ $ns,
+ $ns.'#createProductOrService',
+ $styledoc,
+ $styleuse,
+ 'WS to create a product or service'
+);
+
+// Register WSDL
+$server->register(
+ 'getProductOrService',
+ // Entry values
+ array('authentication'=>'tns:authentication','id'=>'xsd:string','ref'=>'xsd:string','ref_ext'=>'xsd:string'),
+ // Exit values
+ array('result'=>'tns:result','product'=>'tns:product'),
+ $ns,
+ $ns.'#getProductOrService',
+ $styledoc,
+ $styleuse,
+ 'WS to get product or service'
+);
+
+
+// Full methods code
+function getProductOrService($authentication,$id='',$ref='',$ref_ext='')
+{
+ global $db,$conf,$langs;
+
+ dol_syslog("Function: getProductOrService login=".$authentication['login']." id=".$id." ref=".$ref." ref_ext=".$ref_ext);
+
+ if ($authentication['entity']) $conf->entity=$authentication['entity'];
+
+ // Init and check authentication
+ $objectresp=array();
+ $errorcode='';$errorlabel='';
+ $error=0;
+ $fuser=check_authentication($authentication,$error,$errorcode,$errorlabel);
+ // Check parameters
+ if (! $error && (($id && $ref) || ($id && $ref_ext) || ($ref && $ref_ext)))
+ {
+ $error++;
+ $errorcode='BAD_PARAMETERS'; $errorlabel="Parameter id, ref and ref_ext can't be both provided. You must choose one or other but not both.";
+ }
+
+ if (! $error)
+ {
+ $fuser->getrights();
+
+ if ($fuser->rights->produit->lire || $fuser->rights->service->lire)
+ {
+ $product=new Product($db);
+ $result=$product->fetch($id,$ref,$ref_ext);
+ if ($result > 0)
+ {
+ // Create
+ $objectresp = array(
+ 'result'=>array('result_code'=>'OK', 'result_label'=>''),
+ 'product'=>array(
+ 'id' => $product->id,
+ 'ref' => $product->name,
+ 'ref_ext' => $product->ref_ext,
+ 'label' => $product->label,
+ 'description' => $product->description,
+ 'date_creation' => $product->date_creation,
+ 'date_modification' => $product->date_modification,
+ 'note' => $product->note,
+ 'tobuy' => $product->tobuy,
+ 'tosell' => $product->tosell,
+ 'type' => $product->type,
+ 'barcode' => $product->barcode,
+ 'country_id' => $product->country_id
+ ));
+ }
+ else
+ {
+ $error++;
+ $errorcode='NOT_FOUND'; $errorlabel='Object not found for id='.$id.' nor ref='.$ref.' nor ref_ext='.$ref_ext;
+ }
+ }
+ else
+ {
+ $error++;
+ $errorcode='PERMISSION_DENIED'; $errorlabel='User does not have permission for this request';
+ }
+ }
+
+ if ($error)
+ {
+ $objectresp = array('result'=>array('result_code' => $errorcode, 'result_label' => $errorlabel));
+ }
+
+ return $objectresp;
+}
+
+
+
+// Return the results.
+$server->service($HTTP_RAW_POST_DATA);
+
+?>
diff --git a/htdocs/webservices/server_supplier_invoice.php b/htdocs/webservices/server_supplier_invoice.php
index 66ccf0c59ac..8f65042c3da 100755
--- a/htdocs/webservices/server_supplier_invoice.php
+++ b/htdocs/webservices/server_supplier_invoice.php
@@ -52,21 +52,35 @@ $server->configureWSDL('WebServicesDolibarrSupplierInvoice',$ns);
$server->wsdl->schemaTargetNamespace=$ns;
-// Define WSDL content
+// Define WSDL Authentication object
$server->wsdl->addComplexType(
- 'authentication',
- 'complexType',
- 'struct',
- 'all',
- '',
- array(
- 'dolibarrkey' => array('name'=>'dolibarrkey','type'=>'xsd:string'),
- 'sourceapplication' => array('name'=>'sourceapplication','type'=>'xsd:string'),
- 'login' => array('name'=>'login','type'=>'xsd:string'),
- 'password' => array('name'=>'password','type'=>'xsd:string'),
- 'entity' => array('name'=>'entity','type'=>'xsd:string'),
- ));
+ 'authentication',
+ 'complexType',
+ 'struct',
+ 'all',
+ '',
+ array(
+ 'dolibarrkey' => array('name'=>'dolibarrkey','type'=>'xsd:string'),
+ 'sourceapplication' => array('name'=>'sourceapplication','type'=>'xsd:string'),
+ 'login' => array('name'=>'login','type'=>'xsd:string'),
+ 'password' => array('name'=>'password','type'=>'xsd:string'),
+ 'entity' => array('name'=>'entity','type'=>'xsd:string'),
+ )
+);
+// Define WSDL Return object
+$server->wsdl->addComplexType(
+ 'result',
+ 'complexType',
+ 'struct',
+ 'all',
+ '',
+ array(
+ 'result_code' => array('name'=>'result_code','type'=>'xsd:string'),
+ 'result_label' => array('name'=>'result_label','type'=>'xsd:string'),
+ )
+);
+// Define other specific objects
$server->wsdl->addComplexType(
'line',
'element',
@@ -163,16 +177,6 @@ $server->wsdl->addComplexType(
'tns:invoice'
);
-$server->wsdl->addComplexType(
- 'result',
- 'complexType',
- 'struct',
- 'all',
- '',
- array(
- 'result_code' => array('name'=>'result_code','type'=>'xsd:string'),
- 'result_label' => array('name'=>'result_label','type'=>'xsd:string'),
- ));
// 5 styles: RPC/encoded, RPC/literal, Document/encoded (not WS-I compliant), Document/literal, Document/literal wrapped
@@ -183,27 +187,29 @@ $styleuse='encoded'; // encoded/literal/literal wrapped
// Better choice is document/literal wrapped but literal wrapped not supported by nusoap.
// Register WSDL
-$server->register('getSupplierInvoice',
-// Entry values
-array('authentication'=>'tns:authentication','id'=>'xsd:string','ref'=>'xsd:string','ref_ext'=>'xsd:string'),
-// Exit values
-array('result'=>'tns:result','invoice'=>'tns:invoice'),
-$ns,
-$ns.'#getSupplierInvoice',
-$styledoc,
-$styleuse,
-'WS to get SupplierInvoice'
+$server->register(
+ 'getSupplierInvoice',
+ // Entry values
+ array('authentication'=>'tns:authentication','id'=>'xsd:string','ref'=>'xsd:string','ref_ext'=>'xsd:string'),
+ // Exit values
+ array('result'=>'tns:result','invoice'=>'tns:invoice'),
+ $ns,
+ $ns.'#getSupplierInvoice',
+ $styledoc,
+ $styleuse,
+ 'WS to get SupplierInvoice'
);
-$server->register('getSupplierInvoicesForThirdParty',
-// Entry values
-array('authentication'=>'tns:authentication','idthirdparty'=>'xsd:string'),
-// Exit values
-array('result'=>'tns:result','invoices'=>'tns:invoices'),
-$ns,
-$ns.'#getSupplierInvoicesForThirdParty',
-$styledoc,
-$styleuse,
-'WS to get SupplierInvoicesForThirdParty'
+$server->register(
+ 'getSupplierInvoicesForThirdParty',
+ // Entry values
+ array('authentication'=>'tns:authentication','idthirdparty'=>'xsd:string'),
+ // Exit values
+ array('result'=>'tns:result','invoices'=>'tns:invoices'),
+ $ns,
+ $ns.'#getSupplierInvoicesForThirdParty',
+ $styledoc,
+ $styleuse,
+ 'WS to get SupplierInvoicesForThirdParty'
);
diff --git a/htdocs/webservices/server_thirdparty.php b/htdocs/webservices/server_thirdparty.php
index 051388b7f01..2187f345b5e 100755
--- a/htdocs/webservices/server_thirdparty.php
+++ b/htdocs/webservices/server_thirdparty.php
@@ -52,67 +52,70 @@ $server->configureWSDL('WebServicesDolibarrThirdParty',$ns);
$server->wsdl->schemaTargetNamespace=$ns;
-// Define WSDL content
+// Define WSDL Authentication object
$server->wsdl->addComplexType(
- 'authentication',
- 'complexType',
- 'struct',
- 'all',
- '',
- array(
- 'dolibarrkey' => array('name'=>'dolibarrkey','type'=>'xsd:string'),
- 'sourceapplication' => array('name'=>'sourceapplication','type'=>'xsd:string'),
- 'login' => array('name'=>'login','type'=>'xsd:string'),
- 'password' => array('name'=>'password','type'=>'xsd:string'),
- 'entity' => array('name'=>'entity','type'=>'xsd:string'),
- ));
+ 'authentication',
+ 'complexType',
+ 'struct',
+ 'all',
+ '',
+ array(
+ 'dolibarrkey' => array('name'=>'dolibarrkey','type'=>'xsd:string'),
+ 'sourceapplication' => array('name'=>'sourceapplication','type'=>'xsd:string'),
+ 'login' => array('name'=>'login','type'=>'xsd:string'),
+ 'password' => array('name'=>'password','type'=>'xsd:string'),
+ 'entity' => array('name'=>'entity','type'=>'xsd:string'),
+ )
+);
+// Define WSDL Return object
+$server->wsdl->addComplexType(
+ 'result',
+ 'complexType',
+ 'struct',
+ 'all',
+ '',
+ array(
+ 'result_code' => array('name'=>'result_code','type'=>'xsd:string'),
+ 'result_label' => array('name'=>'result_label','type'=>'xsd:string'),
+ )
+);
+// Define other specific objects
$server->wsdl->addComplexType(
- 'thirdparty',
- 'complexType',
- 'struct',
- 'all',
- '',
- array(
- 'id' => array('name'=>'id','type'=>'xsd:string'),
- 'ref' => array('name'=>'name','type'=>'xsd:string'),
- 'ref_ext' => array('name'=>'ref_ext','type'=>'xsd:string'),
- 'fk_user_author' => array('name'=>'fk_user_author','type'=>'xsd:string'),
- 'date' => array('name'=>'date','type'=>'xsd:date'),
- 'date_creation' => array('name'=>'date_creation','type'=>'xsd:dateTime'),
- 'date_modification' => array('name'=>'date_modification','type'=>'xsd:dateTime'),
- 'note' => array('name'=>'note','type'=>'xsd:string'),
- 'address' => array('name'=>'address','type'=>'xsd:string'),
- 'zip' => array('name'=>'zip','type'=>'xsd:string'),
- 'town' => array('name'=>'town','type'=>'xsd:string'),
- 'province_id' => array('name'=>'province_id','type'=>'xsd:string'),
- 'country_id' => array('name'=>'country_id','type'=>'xsd:string'),
- 'country_code' => array('name'=>'country_code','type'=>'xsd:string'),
- 'country' => array('name'=>'country','type'=>'xsd:string'),
- 'phone' => array('name'=>'country_id','type'=>'xsd:string'),
- 'fax' => array('name'=>'country_id','type'=>'xsd:string'),
- 'email' => array('name'=>'country_id','type'=>'xsd:string'),
- 'url' => array('name'=>'country_id','type'=>'xsd:string'),
- 'profid1' => array('name'=>'profid1','type'=>'xsd:string'),
- 'profid2' => array('name'=>'profid2','type'=>'xsd:string'),
- 'profid3' => array('name'=>'profid3','type'=>'xsd:string'),
- 'profid4' => array('name'=>'profid4','type'=>'xsd:string'),
- 'prefix' => array('name'=>'prefix','type'=>'xsd:string'),
- 'vat_used' => array('name'=>'vat_used','type'=>'xsd:string'),
- 'vat_number' => array('name'=>'vat_number','type'=>'xsd:string')
- )
- );
-
-$server->wsdl->addComplexType(
- 'result',
- 'complexType',
- 'struct',
- 'all',
- '',
- array(
- 'result_code' => array('name'=>'result_code','type'=>'xsd:string'),
- 'result_label' => array('name'=>'result_label','type'=>'xsd:string'),
- ));
+ 'thirdparty',
+ 'complexType',
+ 'struct',
+ 'all',
+ '',
+ array(
+ 'id' => array('name'=>'id','type'=>'xsd:string'),
+ 'ref' => array('name'=>'name','type'=>'xsd:string'),
+ 'ref_ext' => array('name'=>'ref_ext','type'=>'xsd:string'),
+ 'fk_user_author' => array('name'=>'fk_user_author','type'=>'xsd:string'),
+ 'date' => array('name'=>'date','type'=>'xsd:date'),
+ 'date_creation' => array('name'=>'date_creation','type'=>'xsd:dateTime'),
+ 'date_modification' => array('name'=>'date_modification','type'=>'xsd:dateTime'),
+ 'note' => array('name'=>'note','type'=>'xsd:string'),
+ 'address' => array('name'=>'address','type'=>'xsd:string'),
+ 'zip' => array('name'=>'zip','type'=>'xsd:string'),
+ 'town' => array('name'=>'town','type'=>'xsd:string'),
+ 'province_id' => array('name'=>'province_id','type'=>'xsd:string'),
+ 'country_id' => array('name'=>'country_id','type'=>'xsd:string'),
+ 'country_code' => array('name'=>'country_code','type'=>'xsd:string'),
+ 'country' => array('name'=>'country','type'=>'xsd:string'),
+ 'phone' => array('name'=>'country_id','type'=>'xsd:string'),
+ 'fax' => array('name'=>'country_id','type'=>'xsd:string'),
+ 'email' => array('name'=>'country_id','type'=>'xsd:string'),
+ 'url' => array('name'=>'country_id','type'=>'xsd:string'),
+ 'profid1' => array('name'=>'profid1','type'=>'xsd:string'),
+ 'profid2' => array('name'=>'profid2','type'=>'xsd:string'),
+ 'profid3' => array('name'=>'profid3','type'=>'xsd:string'),
+ 'profid4' => array('name'=>'profid4','type'=>'xsd:string'),
+ 'prefix' => array('name'=>'prefix','type'=>'xsd:string'),
+ 'vat_used' => array('name'=>'vat_used','type'=>'xsd:string'),
+ 'vat_number' => array('name'=>'vat_number','type'=>'xsd:string')
+ )
+);
// 5 styles: RPC/encoded, RPC/literal, Document/encoded (not WS-I compliant), Document/literal, Document/literal wrapped
@@ -123,16 +126,17 @@ $styleuse='encoded'; // encoded/literal/literal wrapped
// Better choice is document/literal wrapped but literal wrapped not supported by nusoap.
// Register WSDL
-$server->register('getThirdParty',
-// Entry values
-array('authentication'=>'tns:authentication','id'=>'xsd:string','ref'=>'xsd:string','ref_ext'=>'xsd:string'),
-// Exit values
-array('result'=>'tns:result','thirdparty'=>'tns:thirdparty'),
-$ns,
-$ns.'#getVersions',
-$styledoc,
-$styleuse,
-'WS to get Versions'
+$server->register(
+ 'getThirdParty',
+ // Entry values
+ array('authentication'=>'tns:authentication','id'=>'xsd:string','ref'=>'xsd:string','ref_ext'=>'xsd:string'),
+ // Exit values
+ array('result'=>'tns:result','thirdparty'=>'tns:thirdparty'),
+ $ns,
+ $ns.'#getVersions',
+ $styledoc,
+ $styleuse,
+ 'WS to get Versions'
);
diff --git a/test/phpunit/ProductTest.php b/test/phpunit/ProductTest.php
new file mode 100755
index 00000000000..ae83bfa229a
--- /dev/null
+++ b/test/phpunit/ProductTest.php
@@ -0,0 +1,250 @@
+
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+/**
+ * \file test/phpunit/ProductTest.php
+ * \ingroup test
+ * \brief PHPUnit test
+ * \remarks To run this script as CLI: phpunit filename.php
+ */
+
+global $conf,$user,$langs,$db;
+//define('TEST_DB_FORCE_TYPE','mysql'); // This is to force using mysql driver
+require_once 'PHPUnit/Autoload.php';
+require_once dirname(__FILE__).'/../../htdocs/master.inc.php';
+require_once dirname(__FILE__).'/../../htdocs/product/class/product.class.php';
+
+if (empty($user->id))
+{
+ print "Load permissions for admin user nb 1\n";
+ $user->fetch(1);
+ $user->getrights();
+}
+$conf->global->MAIN_DISABLE_ALL_MAILS=1;
+
+
+/**
+ * Class for PHPUnit tests
+ *
+ * @backupGlobals disabled
+ * @backupStaticAttributes enabled
+ * @remarks backupGlobals must be disabled to have db,conf,user and lang not erased.
+ */
+class ProductTest extends PHPUnit_Framework_TestCase
+{
+ protected $savconf;
+ protected $savuser;
+ protected $savlangs;
+ protected $savdb;
+
+ /**
+ * Constructor
+ * We save global variables into local variables
+ *
+ * @return ProductTest
+ */
+ function ProductTest()
+ {
+ //$this->sharedFixture
+ global $conf,$user,$langs,$db;
+ $this->savconf=$conf;
+ $this->savuser=$user;
+ $this->savlangs=$langs;
+ $this->savdb=$db;
+
+ print __METHOD__." db->type=".$db->type." user->id=".$user->id;
+ //print " - db ".$db->db;
+ print "\n";
+ }
+
+ // Static methods
+ public static function setUpBeforeClass()
+ {
+ global $conf,$user,$langs,$db;
+
+ $db->begin(); // This is to have all actions inside a transaction even if test launched without suite.
+
+ print __METHOD__."\n";
+ }
+ public static function tearDownAfterClass()
+ {
+ global $conf,$user,$langs,$db;
+ $db->rollback();
+
+ print __METHOD__."\n";
+ }
+
+ /**
+ */
+ protected function setUp()
+ {
+ global $conf,$user,$langs,$db;
+ $conf=$this->savconf;
+ $user=$this->savuser;
+ $langs=$this->savlangs;
+ $db=$this->savdb;
+
+ print __METHOD__."\n";
+ }
+ /**
+ */
+ protected function tearDown()
+ {
+ print __METHOD__."\n";
+ }
+
+ /**
+ */
+ public function testProductCreate()
+ {
+ global $conf,$user,$langs,$db;
+ $conf=$this->savconf;
+ $user=$this->savuser;
+ $langs=$this->savlangs;
+ $db=$this->savdb;
+
+ $localobject=new Product($this->savdb);
+ $localobject->initAsSpecimen();
+ $result=$localobject->create($user);
+
+ print __METHOD__." result=".$result."\n";
+ $this->assertLessThanOrEqual($result, 0);
+
+ return $result;
+ }
+
+ /**
+ * @depends testProductCreate
+ * The depends says test is run only if previous is ok
+ */
+ public function testProductFetch($id)
+ {
+ global $conf,$user,$langs,$db;
+ $conf=$this->savconf;
+ $user=$this->savuser;
+ $langs=$this->savlangs;
+ $db=$this->savdb;
+
+ $localobject=new Product($this->savdb);
+ $result=$localobject->fetch($id);
+ print __METHOD__." id=".$id." result=".$result."\n";
+ $this->assertLessThan($result, 0);
+
+ $result=$localobject->verify();
+ print __METHOD__." id=".$id." result=".$result."\n";
+ $this->assertEquals($result, 0);
+
+ return $localobject;
+ }
+
+ /**
+ * @depends testProductFetch
+ * The depends says test is run only if previous is ok
+ */
+ public function testProductUpdate($localobject)
+ {
+ global $conf,$user,$langs,$db;
+ $conf=$this->savconf;
+ $user=$this->savuser;
+ $langs=$this->savlangs;
+ $db=$this->savdb;
+
+ $localobject->note='New note after update';
+ $result=$localobject->update($localobject->id,$user);
+ print __METHOD__." id=".$localobject->id." result=".$result."\n";
+ $this->assertLessThan($result, 0);
+
+ return $localobject;
+ }
+
+ /**
+ * @depends testProductUpdate
+ * The depends says test is run only if previous is ok
+ */
+ public function testProductOther($localobject)
+ {
+ global $conf,$user,$langs,$db;
+ $conf=$this->savconf;
+ $user=$this->savuser;
+ $langs=$this->savlangs;
+ $db=$this->savdb;
+
+
+ return $localobject->id;
+ }
+
+ /**
+ * @depends testProductOther
+ * The depends says test is run only if previous is ok
+ */
+ public function testProductDelete($id)
+ {
+ global $conf,$user,$langs,$db;
+ $conf=$this->savconf;
+ $user=$this->savuser;
+ $langs=$this->savlangs;
+ $db=$this->savdb;
+
+ $localobject=new Product($this->savdb);
+ $result=$localobject->fetch($id);
+
+ $result=$localobject->delete($id);
+ print __METHOD__." id=".$id." result=".$result."\n";
+ $this->assertLessThan($result, 0);
+
+ return $result;
+ }
+
+ /**
+ *
+ */
+ /*public function testVerifyNumRef()
+ {
+ global $conf,$user,$langs,$db;
+ $conf=$this->savconf;
+ $user=$this->savuser;
+ $langs=$this->savlangs;
+ $db=$this->savdb;
+
+ $localobject=new Adherent($this->savdb);
+ $result=$localobject->ref='refthatdoesnotexists';
+ $result=$localobject->VerifyNumRef();
+
+ print __METHOD__." result=".$result."\n";
+ $this->assertEquals($result, 0);
+ return $result;
+ }*/
+
+
+ /**
+ */
+ public function testProductStatic()
+ {
+ global $conf,$user,$langs,$db;
+ $conf=$this->savconf;
+ $user=$this->savuser;
+ $langs=$this->savlangs;
+ $db=$this->savdb;
+
+ $localobject=new Product($db);
+
+
+ return;
+ }
+}
+?>
\ No newline at end of file