From b8284447fd0149d574ded0dd073b4426376e248c Mon Sep 17 00:00:00 2001 From: jfefe Date: Mon, 12 Dec 2016 15:19:47 +0100 Subject: [PATCH 001/299] API can receive documents --- htdocs/api/class/api.class.php | 41 ++--- htdocs/api/class/api_documents.class.php | 143 ++++++++++++++++++ htdocs/api/index.php | 12 +- test/phpunit/RestAPIDocumentTest.php | 183 +++++++++++++++++++++++ 4 files changed, 354 insertions(+), 25 deletions(-) create mode 100644 htdocs/api/class/api_documents.class.php create mode 100644 test/phpunit/RestAPIDocumentTest.php diff --git a/htdocs/api/class/api.class.php b/htdocs/api/class/api.class.php index 5ffae225df1..ed97968e502 100644 --- a/htdocs/api/class/api.class.php +++ b/htdocs/api/class/api.class.php @@ -19,6 +19,7 @@ use Luracast\Restler\Restler; use Luracast\Restler\RestException; use Luracast\Restler\Defaults; +use Luracast\Restler\Format\UploadFormat; require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php'; @@ -47,14 +48,14 @@ class DolibarrApi function __construct($db, $cachedir='') { global $conf; - + if (empty($cachedir)) $cachedir = $conf->api->dir_temp; Defaults::$cacheDirectory = $cachedir; - + $this->db = $db; $production_mode = ( empty($conf->global->API_PRODUCTION_MODE) ? false : true ); $this->r = new Restler($production_mode); - + $this->r->setAPIVersion(1); } @@ -86,20 +87,20 @@ class DolibarrApi // Remove $db object property for object unset($object->db); - + // Remove linkedObjects. We should already have linkedObjectIds that avoid huge responses unset($object->linkedObjects); - + unset($object->lignes); // should be ->lines unset($object->oldline); - + unset($object->error); unset($object->errors); - + unset($object->ref_previous); unset($object->ref_next); unset($object->ref_int); - + unset($object->projet); // Should be fk_project unset($object->project); // Should be fk_project unset($object->author); // Should be fk_user_author @@ -111,18 +112,18 @@ class DolibarrApi unset($object->timespent_withhour); unset($object->timespent_fk_user); unset($object->timespent_note); - + unset($object->statuts); unset($object->statuts_short); unset($object->statuts_logo); unset($object->statuts_long); - + unset($object->element); unset($object->fk_element); unset($object->table_element); unset($object->table_element_line); unset($object->picto); - + // Remove the $oldcopy property because it is not supported by the JSON // encoder. The following error is generated when trying to serialize // it: "Error encoding/decoding JSON: Type is not supported" @@ -152,7 +153,7 @@ class DolibarrApi } } }*/ - + return $object; } @@ -187,12 +188,12 @@ class DolibarrApi return checkUserAccessToObject(DolibarrApiAccess::$user, $featuresarray,$resource_id,$dbtablename,$feature2,$dbt_keyfield,$dbt_select); } - + /** * Return if a $sqlfilters parameter is valid - * + * * @param string $sqlfilters sqlfilter string - * @return boolean True if valid, False if not valid + * @return boolean True if valid, False if not valid */ function _checkFilters($sqlfilters) { @@ -216,22 +217,22 @@ class DolibarrApi } return true; } - + /** * Function to forge a SQL criteria - * + * * @param array $matches Array of found string by regex search * @return string Forged criteria. Example: "t.field like 'abc%'" */ static function _forge_criteria_callback($matches) { global $db; - + //dol_syslog("Convert matches ".$matches[1]); if (empty($matches[1])) return ''; $tmp=explode(':',$matches[1]); if (count($tmp) < 3) return ''; - + $tmpescaped=$tmp[2]; if (preg_match('/^\'(.*)\'$/', $tmpescaped, $regbis)) { @@ -242,5 +243,5 @@ class DolibarrApi $tmpescaped = $db->escape($tmpescaped); } return $db->escape($tmp[0]).' '.strtoupper($db->escape($tmp[1]))." ".$tmpescaped; - } + } } diff --git a/htdocs/api/class/api_documents.class.php b/htdocs/api/class/api_documents.class.php new file mode 100644 index 00000000000..ca10b2befce --- /dev/null +++ b/htdocs/api/class/api_documents.class.php @@ -0,0 +1,143 @@ + + * Copyright (C) 2016 Laurent Destailleur + * Copyright (C) 2016 Jean-François Ferry + * + * 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 3 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 . + */ + +use Luracast\Restler\RestException; +use Luracast\Restler\Format\UploadFormat; + + +require_once DOL_DOCUMENT_ROOT.'/main.inc.php'; + +/** + * API class for receive files + * + * @access protected + * @class Documents {@requires user,external} + */ +class Documents extends DolibarrApi +{ + + /** + * @var array $DOCUMENT_FIELDS Mandatory fields, checked when create and update object + */ + static $DOCUMENT_FIELDS = array( + 'name', + 'modulepart', + 'file' + ); + + /** + * Constructor + */ + function __construct() + { + global $db; + $this->db = $db; + } + + /** + * Return a document + * + * @param string $module_part Module part for file + * @param string $filename File name + * + * @return array + * @throws RestException + * + */ + public function get($module_part, $filename) { + + } + + + /** + * Receive file + * + * @param array $request_data Request datas + * + * @return bool State of copy + * @throws RestException + */ + public function post($request_data) { + global $conf; + + require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; + + if (!DolibarrApiAccess::$user->rights->ecm->upload) { + throw new RestException(401); + } + + // Suppression de la chaine de caractere ../ dans $original_file + $original_file = str_replace("../","/", $request_data['name']); + $refname = str_replace("../","/", $request_data['refname']); + + // find the subdirectory name as the reference + if (empty($request_data['refname'])) $refname=basename(dirname($original_file)."/"); + + // Security: + // On interdit les remontees de repertoire ainsi que les pipe dans + // les noms de fichiers. + if (preg_match('/\.\./',$original_file) || preg_match('/[<>|]/',$original_file)) + { + throw new RestException(401,'Refused to deliver file '.$original_file); + } + if (preg_match('/\.\./',$refname) || preg_match('/[<>|]/',$refname)) + { + throw new RestException(401,'Refused to deliver file '.$refname); + } + + $modulepart = $request_data['modulepart']; + + // Check mandatory fields + $result = $this->_validate_file($request_data); + + $upload_dir = DOL_DATA_ROOT . '/' .$modulepart.'/'.dol_sanitizeFileName($refname); + $destfile = $upload_dir . $original_file; + + if (!is_dir($upload_dir)) { + throw new RestException(401,'Directory not exists : '.$upload_dir); + } + + $file = $_FILES['file']; + $srcfile = $file['tmp_name']; + $res = dol_move($srcfile, $destfile, 0, 1); + + if (!$res) { + throw new RestException(500); + } + + return $res; + } + + /** + * Validate fields before create or update object + * + * @param array $data Array with data to verify + * @return array + * @throws RestException + */ + function _validate_file($data) { + $result = array(); + foreach (Documents::$DOCUMENT_FIELDS as $field) { + if (!isset($data[$field])) + throw new RestException(400, "$field field missing"); + $result[$field] = $data[$field]; + } + return $result; + } +} diff --git a/htdocs/api/index.php b/htdocs/api/index.php index 8ad60c4b340..5db8d7a78c9 100644 --- a/htdocs/api/index.php +++ b/htdocs/api/index.php @@ -56,16 +56,18 @@ if (empty($conf->global->MAIN_MODULE_API)) exit; } - $api = new DolibarrApi($db); // Enable the Restler API Explorer. // See https://github.com/Luracast/Restler-API-Explorer for more info. $api->r->addAPIClass('Luracast\\Restler\\Explorer'); -$api->r->setSupportedFormats('JsonFormat', 'XmlFormat'); +$api->r->setSupportedFormats('JsonFormat', 'XmlFormat', 'UploadFormat'); $api->r->addAuthenticationClass('DolibarrApiAccess',''); +// Define accepted mime types +UploadFormat::$allowedMimeTypes = array('image/jpeg', 'image/png', 'text/plain', 'application/octet-stream'); + $listofapis = array(); $modulesdir = dolGetModulesDirs(); @@ -86,7 +88,7 @@ foreach ($modulesdir as $dir) $module = strtolower($reg[1]); $moduledirforclass = $module; $moduleforperm = $module; - + if ($module == 'propale') { $moduledirforclass = 'comm/propal'; $moduleforperm='propal'; @@ -119,7 +121,7 @@ foreach ($modulesdir as $dir) $moduledirforclass = 'fourn'; } //dol_syslog("Found module file ".$file." - module=".$module." - moduledirforclass=".$moduledirforclass); - + // Defined if module is enabled $enabled=true; if (empty($conf->$moduleforperm->enabled)) $enabled=false; @@ -142,7 +144,7 @@ foreach ($modulesdir as $dir) while (($file_searched = readdir($handle_part))!==false) { if ($file_searched == 'api_access.class.php') continue; - + // Support of the deprecated API. if (is_readable($dir_part.$file_searched) && preg_match("/^api_deprecated_(.*)\.class\.php$/i",$file_searched,$reg)) { diff --git a/test/phpunit/RestAPIDocumentTest.php b/test/phpunit/RestAPIDocumentTest.php new file mode 100644 index 00000000000..ea0c218027f --- /dev/null +++ b/test/phpunit/RestAPIDocumentTest.php @@ -0,0 +1,183 @@ + + * + * 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 3 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 . + * or see http://www.gnu.org/ + */ + +/** + * \file test/phpunit/RestAPIDocumentTest.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/core/lib/date.lib.php'; +require_once dirname(__FILE__).'/../../htdocs/core/lib/geturl.lib.php'; + +if (empty($user->id)) { + echo "Load permissions for admin user nb 1\n"; + $user->fetch(1); + $user->getrights(); +} +$conf->global->MAIN_DISABLE_ALL_MAILS = 1; +$conf->global->MAIN_UMASK = '0666'; + +/** + * Class for PHPUnit tests. + * + * @backupGlobals disabled + * @backupStaticAttributes enabled + * @remarks backupGlobals must be disabled to have db,conf,user and lang not erased. + */ +class RestAPIDocumentTest extends PHPUnit_Framework_TestCase +{ + protected $savconf; + protected $savuser; + protected $savlangs; + protected $savdb; + protected $api_url; + protected $api_key; + + /** + * Constructor + * We save global variables into local variables. + * + * @return DateLibTest + */ + public function __construct() + { + //$this->sharedFixture + global $conf,$user,$langs,$db; + $this->savconf = $conf; + $this->savuser = $user; + $this->savlangs = $langs; + $this->savdb = $db; + + echo __METHOD__.' db->type='.$db->type.' user->id='.$user->id; + //print " - db ".$db->db; + echo "\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. + + echo __METHOD__."\n"; + } + + // tear down after class + public static function tearDownAfterClass() + { + global $conf,$user,$langs,$db; + $db->rollback(); + + echo __METHOD__."\n"; + } + + /** + * Init phpunit tests. + */ + protected function setUp() + { + global $conf,$user,$langs,$db; + $conf = $this->savconf; + $user = $this->savuser; + $langs = $this->savlangs; + $db = $this->savdb; + + $this->api_url = DOL_MAIN_URL_ROOT.'/api/index.php'; + + $login = 'admin'; + $password = 'admin'; + $url = $this->api_url.'/login?login='.$login.'&password='.$password; + // Call the API login method to save api_key for this test class + $result = getURLContent($url, 'GET', '', 1, array()); + echo __METHOD__.' result = '.var_export($result, true)."\n"; + echo __METHOD__.' curl_error_no: '.$result['curl_error_no']."\n"; + $this->assertEquals($result['curl_error_no'], ''); + $object = json_decode($result['content'], true); + $this->assertNotNull($object, 'Parsing of json result must no be null'); + $this->assertEquals('200', $object['success']['code']); + + $this->api_key = $object['success']['token']; + echo __METHOD__." api_key: $this->api_key \n"; + + echo __METHOD__."\n"; + } + + /** + * End phpunit tests. + */ + protected function tearDown() + { + echo __METHOD__."\n"; + } + + /** + * testRestReceiveDocument. + * + * @return int + */ + public function testRestReceiveDocument() + { + global $conf,$user,$langs,$db; + + $url = $this->api_url.'/documents/?api_key='.$this->api_key; + + $fileName = 'img250x20.png'; + $filePath = dirname(__FILE__).'/'.$fileName; + $mimetype = mime_content_type($filePath); + // Init Curl file object + // See https://wiki.php.net/rfc/curl-file-upload + $cfile = curl_file_create($filePath, $mimetype); + + echo __METHOD__.' Request POST url='.$url."\n"; + + // Send to existant directory + $data = array( + 'modulepart' => 'facture', + 'file' => $cfile, + 'refname' => 'AV1303-0003', + 'name' => $fileName, // Name for destination + 'type' => $mimetype, ); + + $result = getURLContent($url, 'POST', $data, 1); + + echo __METHOD__.' Result for sending document: '.var_export($result, true)."\n"; + echo __METHOD__.' curl_error_no: '.$result['curl_error_no']."\n"; + $this->assertEquals($result['curl_error_no'], ''); + $this->assertEquals($result['content'], 'true'); + + // Send to unexistant directory + $data = array( + 'modulepart' => 'facture', + 'file' => $cfile, + 'name' => 'AV1303-0003STSEIUDEISRESIJLEU/'.$fileName, // Name for destination + 'type' => $mimetype, ); + + $result2 = getURLContent($url, 'POST', $data, 1); + echo __METHOD__.' Result for sending document: '.var_export($result2, true)."\n"; + echo __METHOD__.' curl_error_no: '.$result['curl_error_no']."\n"; + + $object = json_decode($result2['content'], true); + $this->assertNotNull($object, 'Parsing of json result must no be null'); + $this->assertEquals('401', $object['error']['code']); + } +} From 942b58efaf3d0091b33d1a12d7e1d7b9880e6deb Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Wed, 22 Feb 2017 06:33:52 +0100 Subject: [PATCH 002/299] New : Integration of Stripe --- .tx/config | 6 + build/rpm/dolibarr_fedora.spec | 1 + build/rpm/dolibarr_generic.spec | 1 + build/rpm/dolibarr_mandriva.spec | 1 + build/rpm/dolibarr_opensuse.spec | 1 + htdocs/adherents/admin/public.php | 5 +- htdocs/adherents/subscription.php | 7 + htdocs/compta/facture.php | 6 + htdocs/core/modules/modStripe.class.php | 103 ++ ...face_20_modStripe_StripeWorkflow.class.php | 113 ++ .../interface_90_all_Demo.class.php-NORUN | 1 + htdocs/langs/en_US/stripe.lang | 40 + htdocs/public/demo/index.php | 2 +- htdocs/public/members/new.php | 16 +- htdocs/public/paybox/paymentko.php | 1 + htdocs/public/paybox/paymentok.php | 1 + htdocs/public/paypal/newpayment.php | 1 + htdocs/public/paypal/paymentko.php | 1 + htdocs/public/paypal/paymentok.php | 1 + htdocs/public/stripe/index.php | 28 + htdocs/public/stripe/newpayment.php | 977 ++++++++++++++++++ htdocs/public/stripe/paymentko.php | 115 +++ htdocs/public/stripe/paymentok.php | 172 +++ htdocs/stripe/admin/index.html | 0 htdocs/stripe/admin/stripe.php | 225 ++++ htdocs/stripe/img/index.html | 0 htdocs/stripe/img/object_stripe.png | Bin 0 -> 819 bytes htdocs/stripe/index.html | 0 htdocs/stripe/lib/index.html | 0 htdocs/stripe/lib/stripe.lib.php | 445 ++++++++ htdocs/theme/eldy/style.css.php | 2 +- htdocs/theme/md/style.css.php | 2 +- 32 files changed, 2267 insertions(+), 7 deletions(-) create mode 100644 htdocs/core/modules/modStripe.class.php create mode 100644 htdocs/core/triggers/interface_20_modStripe_StripeWorkflow.class.php create mode 100644 htdocs/langs/en_US/stripe.lang create mode 100644 htdocs/public/stripe/index.php create mode 100644 htdocs/public/stripe/newpayment.php create mode 100644 htdocs/public/stripe/paymentko.php create mode 100644 htdocs/public/stripe/paymentok.php create mode 100644 htdocs/stripe/admin/index.html create mode 100644 htdocs/stripe/admin/stripe.php create mode 100644 htdocs/stripe/img/index.html create mode 100644 htdocs/stripe/img/object_stripe.png create mode 100644 htdocs/stripe/index.html create mode 100644 htdocs/stripe/lib/index.html create mode 100644 htdocs/stripe/lib/stripe.lib.php diff --git a/.tx/config b/.tx/config index 010227f6e61..ae2741c9852 100644 --- a/.tx/config +++ b/.tx/config @@ -326,6 +326,12 @@ source_file = htdocs/langs/en_US/stocks.lang source_lang = en_US type = MOZILLAPROPERTIES +[dolibarr.stripe] +file_filter = htdocs/langs//stripe.lang +source_file = htdocs/langs/en_US/stripe.lang +source_lang = en_US +type = MOZILLAPROPERTIES + [dolibarr.suppliers] file_filter = htdocs/langs//suppliers.lang source_file = htdocs/langs/en_US/suppliers.lang diff --git a/build/rpm/dolibarr_fedora.spec b/build/rpm/dolibarr_fedora.spec index e65e6bc3b7d..c0119e54e9e 100755 --- a/build/rpm/dolibarr_fedora.spec +++ b/build/rpm/dolibarr_fedora.spec @@ -202,6 +202,7 @@ done >>%{name}.lang %_datadir/dolibarr/htdocs/public %_datadir/dolibarr/htdocs/resource %_datadir/dolibarr/htdocs/societe +%_datadir/dolibarr/htdocs/stripe %_datadir/dolibarr/htdocs/supplier_proposal %_datadir/dolibarr/htdocs/support %_datadir/dolibarr/htdocs/theme diff --git a/build/rpm/dolibarr_generic.spec b/build/rpm/dolibarr_generic.spec index 655ef87f925..54ff3b6cac8 100755 --- a/build/rpm/dolibarr_generic.spec +++ b/build/rpm/dolibarr_generic.spec @@ -282,6 +282,7 @@ done >>%{name}.lang %_datadir/dolibarr/htdocs/public %_datadir/dolibarr/htdocs/resource %_datadir/dolibarr/htdocs/societe +%_datadir/dolibarr/htdocs/stripe %_datadir/dolibarr/htdocs/supplier_proposal %_datadir/dolibarr/htdocs/support %_datadir/dolibarr/htdocs/theme diff --git a/build/rpm/dolibarr_mandriva.spec b/build/rpm/dolibarr_mandriva.spec index 55fb7183734..7237de58a70 100755 --- a/build/rpm/dolibarr_mandriva.spec +++ b/build/rpm/dolibarr_mandriva.spec @@ -199,6 +199,7 @@ done >>%{name}.lang %_datadir/dolibarr/htdocs/public %_datadir/dolibarr/htdocs/resource %_datadir/dolibarr/htdocs/societe +%_datadir/dolibarr/htdocs/stripe %_datadir/dolibarr/htdocs/supplier_proposal %_datadir/dolibarr/htdocs/support %_datadir/dolibarr/htdocs/theme diff --git a/build/rpm/dolibarr_opensuse.spec b/build/rpm/dolibarr_opensuse.spec index f7e29927ebb..9e12a96e054 100755 --- a/build/rpm/dolibarr_opensuse.spec +++ b/build/rpm/dolibarr_opensuse.spec @@ -210,6 +210,7 @@ done >>%{name}.lang %_datadir/dolibarr/htdocs/public %_datadir/dolibarr/htdocs/resource %_datadir/dolibarr/htdocs/societe +%_datadir/dolibarr/htdocs/stripe %_datadir/dolibarr/htdocs/supplier_proposal %_datadir/dolibarr/htdocs/support %_datadir/dolibarr/htdocs/theme diff --git a/htdocs/adherents/admin/public.php b/htdocs/adherents/admin/public.php index a23c1f40def..488b1bc542b 100644 --- a/htdocs/adherents/admin/public.php +++ b/htdocs/adherents/admin/public.php @@ -179,7 +179,7 @@ print ''; print $form->selectyesno("MEMBER_NEWFORM_EDITAMOUNT",(! empty($conf->global->MEMBER_NEWFORM_EDITAMOUNT)?$conf->global->MEMBER_NEWFORM_EDITAMOUNT:0),1); print "\n"; -if (! empty($conf->paybox->enabled) || ! empty($conf->paypal->enabled)) +if (! empty($conf->paybox->enabled) || ! empty($conf->paypal->enabled) || ! empty($conf->stripe->enabled)) { // Jump to an online payment page $var=! $var; @@ -189,11 +189,12 @@ if (! empty($conf->paybox->enabled) || ! empty($conf->paypal->enabled)) $listofval=array(); if (! empty($conf->paybox->enabled)) $listofval['paybox']='Paybox'; if (! empty($conf->paypal->enabled)) $listofval['paypal']='PayPal'; + if (! empty($conf->stripe->enabled)) $listofval['stripe']='Stripe'; print $form->selectarray("MEMBER_NEWFORM_PAYONLINE",$listofval,(! empty($conf->global->MEMBER_NEWFORM_PAYONLINE)?$conf->global->MEMBER_NEWFORM_PAYONLINE:''),1); print "\n"; } -if (! empty($conf->paybox->enabled) || ! empty($conf->paypal->enabled)) +if (! empty($conf->paybox->enabled) || ! empty($conf->paypal->enabled) || ! empty($conf->stripe->enabled)) { // Jump to an online payment page $var=! $var; diff --git a/htdocs/adherents/subscription.php b/htdocs/adherents/subscription.php index 0c9c8467f1f..ba33c1c73b6 100644 --- a/htdocs/adherents/subscription.php +++ b/htdocs/adherents/subscription.php @@ -871,6 +871,13 @@ if ($rowid > 0) print showPaypalPaymentUrl('membersubscription',$object->ref); } + // Link for stripe payment + if (! empty($conf->stripe->enabled)) + { + include_once DOL_DOCUMENT_ROOT.'/stripe/lib/stripe.lib.php'; + print showStripePaymentUrl('membersubscription',$object->ref); + } + } /* diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index 29cbe624fca..34ce3226c7e 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -4207,6 +4207,12 @@ else if ($id > 0 || ! empty($ref)) print showPaypalPaymentUrl('invoice', $object->ref); } + // Link for stripe payment + if (! empty($conf->stripe->enabled) && $object->statut != 0) { + include_once DOL_DOCUMENT_ROOT . '/stripe/lib/stripe.lib.php'; + print showStripePaymentUrl('invoice', $object->ref); + } + print '
'; // List of actions on element diff --git a/htdocs/core/modules/modStripe.class.php b/htdocs/core/modules/modStripe.class.php new file mode 100644 index 00000000000..11dd6ee68e4 --- /dev/null +++ b/htdocs/core/modules/modStripe.class.php @@ -0,0 +1,103 @@ + + * Copyright (C) 2004-2009 Laurent Destailleur + * Copyright (C) 2016 Alexandre Spangaro + * + * 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 3 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 . + */ + +/** + * \defgroup stripe Module stripe + * \brief Add integration with Stripe online payment system. + * \file htdocs/core/modules/modStripe.class.php + * \ingroup stripe + * \brief Description and activation file for module Stripe + */ +include_once DOL_DOCUMENT_ROOT .'/core/modules/DolibarrModules.class.php'; + + +/** + * Description and activation class for module Paybox + */ +class modStripe extends DolibarrModules +{ + /** + * Constructor. Define names, constants, directories, boxes, permissions + * + * @param DoliDB $db Database handler + */ + function __construct($db) + { + $this->db = $db; + + // Id for module (must be unique). + // Use here a free id (See in Home -> System information -> Dolibarr for list of used modules id). + $this->numero = 50300; + // Key text used to identify module (for permissions, menus, etc...) + $this->rights_class = 'stripe'; + + // Family can be 'crm','financial','hr','projects','products','ecm','technic','other' + // It is used to group modules in module setup page + $this->family = "other"; + // Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module) + $this->name = preg_replace('/^mod/i','',get_class($this)); + // Module description, used if translation string 'ModuleXXXDesc' not found (where XXX is value of numeric property 'numero' of module) + $this->description = "Module to offer an online payment page by credit card with Stripe"; + // Possible values for version are: 'development', 'experimental', 'dolibarr' or version + $this->version = 'dolibarr'; + // Key used in llx_const table to save module status enabled/disabled (where MYMODULE is value of property name of module in uppercase) + $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); + // Where to store the module in setup page (0=common,1=interface,2=other) + $this->special = 1; + // Name of image file used for this module. + // If file is in theme/yourtheme/img directory under name object_pictovalue.png, use this->picto='pictovalue' + // If file is in module/img directory, use this->picto=DOL_URL_ROOT.'/module/img/file.png' + $this->picto='stripe@stripe'; + + // Data directories to create when module is enabled. + $this->dirs = array('/stripe/temp'); + + // Config pages. Put here list of php page names stored in admmin directory used to setup module. + $this->config_page_url = array("stripe.php@stripe"); + + // Dependencies + $this->depends = array(); // List of modules id that must be enabled if this module is enabled + $this->requiredby = array(); // List of modules id to disable if this one is disabled + $this->phpmin = array(4,1); // Minimum version of PHP required by module + $this->need_dolibarr_version = array(2,6); // Minimum version of Dolibarr required by module + $this->langfiles = array("stripe"); + + // Constants + $this->const = array(); // List of particular constants to add when module is enabled + + // New pages on tabs + $this->tabs = array(); + + // Boxes + $this->boxes = array(); // List of boxes + $r=0; + + // Permissions + $this->rights = array(); // Permission array used by this module + $r=0; + + // Main menu entries + $this->menus = array(); // List of menus to add + $r=0; + + // Exports + $r=1; + } +} + diff --git a/htdocs/core/triggers/interface_20_modStripe_StripeWorkflow.class.php b/htdocs/core/triggers/interface_20_modStripe_StripeWorkflow.class.php new file mode 100644 index 00000000000..4fbf29c7b07 --- /dev/null +++ b/htdocs/core/triggers/interface_20_modStripe_StripeWorkflow.class.php @@ -0,0 +1,113 @@ + + * Copyright (C) 2014 Marcos García + * Copyright (C) 2017 Alexandre Spangaro + * + * 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 3 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/core/triggers/interface_20_modStripe_StripeWorkflow.class.php + * \ingroup stripe + * \brief Trigger file for stripe workflow + */ + +require_once DOL_DOCUMENT_ROOT.'/core/triggers/dolibarrtriggers.class.php'; + + +/** + * Class of triggers for stripe module + */ +class InterfaceStripeWorkflow extends DolibarrTriggers +{ + public $picto = 'stripe@stripe'; + public $family = 'stripe'; + public $description = "Triggers of this module allows to manage stripe workflow"; + public $version = self::VERSION_DOLIBARR; + + /** + * Function called when a Dolibarrr business event is done. + * All functions "runTrigger" are triggered if file is inside directory htdocs/core/triggers or htdocs/module/code/triggers (and declared) + * + * @param string $action Event action code + * @param Object $object Object + * @param User $user Object user + * @param Translate $langs Object langs + * @param conf $conf Object conf + * @return int <0 if KO, 0 if no triggered ran, >0 if OK + */ + public function runTrigger($action, $object, User $user, Translate $langs, Conf $conf) + { + // Mettre ici le code a executer en reaction de l'action + // Les donnees de l'action sont stockees dans $object + + if ($action == 'STRIPE_PAYMENT_OK') + { + dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". source=".$object->source." ref=".$object->ref); + + if (! empty($object->source)) + { + if ($object->source == 'membersubscription') + { + //require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherents.class.php'; + + // TODO add subscription treatment + } + else + { + require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; + + $soc = new Societe($this->db); + + // Parse element/subelement (ex: project_task) + $element = $path = $filename = $object->source; + if (preg_match('/^([^_]+)_([^_]+)/i',$object->source,$regs)) + { + $element = $path = $regs[1]; + $filename = $regs[2]; + } + // For compatibility + if ($element == 'order') { + $path = $filename = 'commande'; + } + if ($element == 'invoice') { + $path = 'compta/facture'; $filename = 'facture'; + } + + dol_include_once('/'.$path.'/class/'.$filename.'.class.php'); + + $classname = ucfirst($filename); + $obj = new $classname($this->db); + + $ret = $obj->fetch('',$object->ref); + if ($ret < 0) return -1; + + // Add payer id + $soc->setValueFrom('ref_int', $object->payerID, 'societe', $obj->socid); + + // Add transaction id + $obj->setValueFrom('ref_int',$object->resArray["TRANSACTIONID"]); + } + } + else + { + // TODO add free tag treatment + } + + } + + return 0; + } + +} diff --git a/htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN b/htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN index 717ef6585f5..5a36bf1069a 100644 --- a/htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN +++ b/htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN @@ -209,6 +209,7 @@ class InterfaceDemo extends DolibarrTriggers // Online case 'PAYMENT_PAYBOX_OK': case 'PAYMENT_PAYPAL_OK': + case 'PAYMENT_STRIPE_OK': // Donation case 'DON_CREATE': diff --git a/htdocs/langs/en_US/stripe.lang b/htdocs/langs/en_US/stripe.lang new file mode 100644 index 00000000000..f19b4e44a52 --- /dev/null +++ b/htdocs/langs/en_US/stripe.lang @@ -0,0 +1,40 @@ +# Dolibarr language file - Source file is en_US - stripe +StripeSetup=Stripe module setup +StripeDesc=This module offer pages to allow payment on Stripe by customers. This can be used for a free payment or for a payment on a particular Dolibarr object (invoice, order, ...) +StripeOrCBDoPayment=Pay with credit card or Stripe +FollowingUrlAreAvailableToMakePayments=Following URLs are available to offer a page to a customer to make a payment on Dolibarr objects +PaymentForm=Payment form +WelcomeOnPaymentPage=Welcome on our online payment service +ThisScreenAllowsYouToPay=This screen allow you to make an online payment to %s. +ThisIsInformationOnPayment=This is information on payment to do +ToComplete=To complete +YourEMail=Email to receive payment confirmation +Creditor=Creditor +PaymentCode=Payment code +StripeDoPayment=Go on payment +YouWillBeRedirectedOnStripe=You will be redirected on secured Stripe page to input you credit card information +Continue=Next +ToOfferALinkForOnlinePayment=URL for %s payment +ToOfferALinkForOnlinePaymentOnOrder=URL to offer a %s online payment user interface for a customer order +ToOfferALinkForOnlinePaymentOnInvoice=URL to offer a %s online payment user interface for a customer invoice +ToOfferALinkForOnlinePaymentOnContractLine=URL to offer a %s online payment user interface for a contract line +ToOfferALinkForOnlinePaymentOnFreeAmount=URL to offer a %s online payment user interface for a free amount +ToOfferALinkForOnlinePaymentOnMemberSubscription=URL to offer a %s online payment user interface for a member subscription +YouCanAddTagOnUrl=You can also add url parameter &tag=value to any of those URL (required only for free payment) to add your own payment comment tag. +SetupStripeToHavePaymentCreatedAutomatically=Setup your Stripe with url %s to have payment created automatically when validated by Stripe. +YourPaymentHasBeenRecorded=This page confirms that your payment has been recorded. Thank you. +YourPaymentHasNotBeenRecorded=You payment has not been recorded and transaction has been canceled. Thank you. +AccountParameter=Account parameters +UsageParameter=Usage parameters +InformationToFindParameters=Help to find your %s account information +STRIPE_CGI_URL_V2=Url of Stripe CGI module for payment +VendorName=Name of vendor +CSSUrlForPaymentForm=CSS style sheet url for payment form +MessageOK=Message on validated payment return page +MessageKO=Message on canceled payment return page +NewStripePaymentReceived=New Stripe payment received +NewStripePaymentFailed=New Stripe payment tried but failed +STRIPE_TEST_SECRET_KEY=Secret test key +STRIPE_TEST_PUBLISHABLE_KEY=Publishable test key +STRIPE_LIVE_SECRET_KEY=Secret live key +STRIPE_LIVE_PUBLISHABLE_KEY=Publishable live key \ No newline at end of file diff --git a/htdocs/public/demo/index.php b/htdocs/public/demo/index.php index bcca53e9245..3c3353e5eb6 100644 --- a/htdocs/public/demo/index.php +++ b/htdocs/public/demo/index.php @@ -107,7 +107,7 @@ if (empty($reshook)) // Visible $alwayscheckedmodules=array('barcode','bookmark','categorie','externalrss','fckeditor','geoipmaxmind','gravatar','memcached','syslog','user','webservices'); // Technical module we always want - $alwaysuncheckedmodules=array('dynamicprices','loan','multicurrency','paybox','paypal','google','printing','scanner','workflow'); // Module we never want + $alwaysuncheckedmodules=array('dynamicprices','loan','multicurrency','paybox','paypal','stripe','google','printing','scanner','workflow'); // Module we never want // Not visible $alwayshiddencheckedmodules=array('accounting','api','barcode','bookmark','clicktodial','comptabilite','cron','document','domain','externalrss','externalsite','fckeditor','geoipmaxmind','gravatar','label','ldap', 'mailmanspip','notification','oauth','syslog','user','webservices', diff --git a/htdocs/public/members/new.php b/htdocs/public/members/new.php index b101e656f67..104dec7ca09 100644 --- a/htdocs/public/members/new.php +++ b/htdocs/public/members/new.php @@ -27,7 +27,7 @@ * Note that you can add following constant to change behaviour of page * MEMBER_NEWFORM_AMOUNT Default amount for auto-subscribe form * MEMBER_NEWFORM_EDITAMOUNT Amount can be edited - * MEMBER_NEWFORM_PAYONLINE Suggest payment with paypal of paybox + * MEMBER_NEWFORM_PAYONLINE Suggest payment with paypal, paybox or stripe * MEMBER_NEWFORM_DOLIBARRTURNOVER Show field turnover (specific for dolibarr foundation) * MEMBER_URL_REDIRECT_SUBSCRIPTION Url to redirect once subscribe submitted * MEMBER_NEWFORM_FORCETYPE Force type of member @@ -314,6 +314,18 @@ if ($action == 'add') $urlback.='&securekey='.dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . 'membersubscription' . $adh->ref, 2); } + } + else if ($conf->global->MEMBER_NEWFORM_PAYONLINE == 'stripe') + { + $urlback=DOL_MAIN_URL_ROOT.'/public/stripe/newpayment.php?from=membernewform&source=membersubscription&ref='.$adh->ref; + if (price2num(GETPOST('amount'))) $urlback.='&amount='.price2num(GETPOST('amount')); + if (GETPOST('email')) $urlback.='&email='.urlencode(GETPOST('email')); + /* + if (! empty($conf->global->PAYPAL_SECURITY_TOKEN) && ! empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) + { + $urlback.='&securekey='.dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . 'membersubscription' . $adh->ref, 2); + } + */ } else { @@ -579,7 +591,7 @@ if (! empty($conf->global->MEMBER_NEWFORM_AMOUNT) { $amount=GETPOST('amount')?GETPOST('amount'):$conf->global->MEMBER_NEWFORM_AMOUNT; } - // $conf->global->MEMBER_NEWFORM_PAYONLINE is 'paypal' or 'paybox' + // $conf->global->MEMBER_NEWFORM_PAYONLINE is 'paypal', 'paybox' or 'stripe' print ''.$langs->trans("Subscription").''; if (! empty($conf->global->MEMBER_NEWFORM_EDITAMOUNT)) { diff --git a/htdocs/public/paybox/paymentko.php b/htdocs/public/paybox/paymentko.php index 09de4525b39..77c8e982a09 100644 --- a/htdocs/public/paybox/paymentko.php +++ b/htdocs/public/paybox/paymentko.php @@ -46,6 +46,7 @@ $langs->load("bills"); $langs->load("companies"); $langs->load("paybox"); $langs->load("paypal"); +$langs->load("stripe"); diff --git a/htdocs/public/paybox/paymentok.php b/htdocs/public/paybox/paymentok.php index 9c3030a86ba..1d5c178f05f 100644 --- a/htdocs/public/paybox/paymentok.php +++ b/htdocs/public/paybox/paymentok.php @@ -46,6 +46,7 @@ $langs->load("bills"); $langs->load("companies"); $langs->load("paybox"); $langs->load("paypal"); +$langs->load("stripe"); /*$source=GETPOST('source'); $ref=GETPOST('ref'); diff --git a/htdocs/public/paypal/newpayment.php b/htdocs/public/paypal/newpayment.php index b5d105d6cf6..02e1e6ec8ad 100644 --- a/htdocs/public/paypal/newpayment.php +++ b/htdocs/public/paypal/newpayment.php @@ -53,6 +53,7 @@ $langs->load("companies"); $langs->load("errors"); $langs->load("paybox"); $langs->load("paypal"); +$langs->load("stripe"); // Input are: // type ('invoice','order','contractline'), diff --git a/htdocs/public/paypal/paymentko.php b/htdocs/public/paypal/paymentko.php index 4bad572ed8b..d7724a8fd6c 100644 --- a/htdocs/public/paypal/paymentko.php +++ b/htdocs/public/paypal/paymentko.php @@ -50,6 +50,7 @@ $langs->load("bills"); $langs->load("companies"); $langs->load("paybox"); $langs->load("paypal"); +$langs->load("stripe"); $PAYPALTOKEN=GETPOST('TOKEN'); if (empty($PAYPALTOKEN)) $PAYPALTOKEN=GETPOST('token'); diff --git a/htdocs/public/paypal/paymentok.php b/htdocs/public/paypal/paymentok.php index 90f13aa6f17..1913ab05879 100644 --- a/htdocs/public/paypal/paymentok.php +++ b/htdocs/public/paypal/paymentok.php @@ -50,6 +50,7 @@ $langs->load("bills"); $langs->load("companies"); $langs->load("paybox"); $langs->load("paypal"); +$langs->load("stripe"); // Clean parameters $PAYPAL_API_USER=""; diff --git a/htdocs/public/stripe/index.php b/htdocs/public/stripe/index.php new file mode 100644 index 00000000000..0b7ad1c82e4 --- /dev/null +++ b/htdocs/public/stripe/index.php @@ -0,0 +1,28 @@ + + * + * 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 3 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/public/paybox/index.php + * \ingroup core + * \brief A redirect page to an error + * \author Laurent Destailleur + */ + +require '../../master.inc.php'; + +header("Location: ".DOL_URL_ROOT.'/public/error-404.php'); + diff --git a/htdocs/public/stripe/newpayment.php b/htdocs/public/stripe/newpayment.php new file mode 100644 index 00000000000..33499fe7098 --- /dev/null +++ b/htdocs/public/stripe/newpayment.php @@ -0,0 +1,977 @@ + + * Copyright (C) 2006-2012 Laurent Destailleur + * Copyright (C) 2009-2012 Regis Houssin + * + * 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 3 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 . + * + * For test: https://stripe.com/docs + */ + +/** + * \file htdocs/public/stripe/newpayment.php + * \ingroup stripe + * \brief File to offer a way to make a payment for a particular Dolibarr entity + */ + +define("NOLOGIN",1); // This means this output page does not require to be logged. +define("NOCSRFCHECK",1); // We accept to go on this page from external web site. + +// For MultiCompany module. +// Do not use GETPOST here, function is not defined and define must be done before including main.inc.php +// TODO This should be useless. Because entity must be retreive from object ref and not from url. +$entity=(! empty($_GET['entity']) ? (int) $_GET['entity'] : (! empty($_POST['entity']) ? (int) $_POST['entity'] : 1)); +if (is_numeric($entity)) define("DOLENTITY", $entity); + +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/stripe/lib/stripe.lib.php'; +// require_once DOL_DOCUMENT_ROOT.'/stripe/lib/stripefunctions.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; + +// Security check +if (empty($conf->stripe->enabled)) accessforbidden('',0,0,1); + +$langs->load("main"); +$langs->load("other"); +$langs->load("dict"); +$langs->load("bills"); +$langs->load("companies"); +$langs->load("errors"); +$langs->load("paybox"); +$langs->load("paypal"); +$langs->load("stripe"); + +// Input are: +// type ('invoice','order','contractline'), +// id (object id), +// amount (required if id is empty), +// tag (a free text, required if type is empty) +// currency (iso code) + +$suffix=GETPOST("suffix",'alpha'); +$amount=price2num(GETPOST("amount")); +if (! GETPOST("currency",'alpha')) $currency=$conf->currency; +else $currency=GETPOST("currency",'alpha'); + +if (! GETPOST("action")) +{ + if (! GETPOST("amount") && ! GETPOST("source")) + { + dol_print_error('',$langs->trans('ErrorBadParameters')." - amount or source"); + exit; + } + if (is_numeric($amount) && ! GETPOST("tag") && ! GETPOST("source")) + { + dol_print_error('',$langs->trans('ErrorBadParameters')." - tag or source"); + exit; + } + if (GETPOST("source") && ! GETPOST("ref")) + { + dol_print_error('',$langs->trans('ErrorBadParameters')." - ref"); + exit; + } +} + +// Define $urlwithroot +//$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root)); +//$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file +$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current + +$urlok=$urlwithroot.'/public/stripe/paymentok.php?'; +$urlko=$urlwithroot.'/public/stripe/paymentko.php?'; + +// Complete urls for post treatment +$SOURCE=GETPOST("source",'alpha'); +$ref=$REF=GETPOST('ref','alpha'); +$TAG=GETPOST("tag",'alpha'); +$FULLTAG=GETPOST("fulltag",'alpha'); // fulltag is tag with more informations +$SECUREKEY=GETPOST("securekey"); // Secure key + +if (! empty($SOURCE)) +{ + $urlok.='source='.urlencode($SOURCE).'&'; + $urlko.='source='.urlencode($SOURCE).'&'; +} +if (! empty($REF)) +{ + $urlok.='ref='.urlencode($REF).'&'; + $urlko.='ref='.urlencode($REF).'&'; +} +if (! empty($TAG)) +{ + $urlok.='tag='.urlencode($TAG).'&'; + $urlko.='tag='.urlencode($TAG).'&'; +} +if (! empty($FULLTAG)) +{ + $urlok.='fulltag='.urlencode($FULLTAG).'&'; + $urlko.='fulltag='.urlencode($FULLTAG).'&'; +} +if (! empty($SECUREKEY)) +{ + $urlok.='securekey='.urlencode($SECUREKEY).'&'; + $urlko.='securekey='.urlencode($SECUREKEY).'&'; +} +if (! empty($entity)) +{ + $urlok.='entity='.urlencode($entity).'&'; + $urlko.='entity='.urlencode($entity).'&'; +} +$urlok=preg_replace('/&$/','',$urlok); // Remove last & +$urlko=preg_replace('/&$/','',$urlko); // Remove last & + +// Check parameters +$PAYPAL_API_OK=""; +if ($urlok) $PAYPAL_API_OK=$urlok; +$PAYPAL_API_KO=""; +if ($urlko) $PAYPAL_API_KO=$urlko; +/* +if (empty($PAYPAL_API_USER)) +{ + dol_print_error('',"Paypal setup param PAYPAL_API_USER not defined"); + return -1; +} +if (empty($PAYPAL_API_PASSWORD)) +{ + dol_print_error('',"Paypal setup param PAYPAL_API_PASSWORD not defined"); + return -1; +} +if (empty($PAYPAL_API_SIGNATURE)) +{ + dol_print_error('',"Paypal setup param PAYPAL_API_SIGNATURE not defined"); + return -1; +} +*/ + +// Check security token +$valid=true; +if (! empty($conf->global->PAYPAL_SECURITY_TOKEN)) +{ + if (! empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) + { + if ($SOURCE && $REF) $token = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . $SOURCE . $REF, 2); // Use the source in the hash to avoid duplicates if the references are identical + else $token = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2); + } + else + { + $token = $conf->global->PAYPAL_SECURITY_TOKEN; + } + if ($SECUREKEY != $token) $valid=false; + + if (! $valid) + { + print '
Bad value for key.
'; + //print 'SECUREKEY='.$SECUREKEY.' token='.$token.' valid='.$valid; + exit; + } +} + + + +/* + * Actions + */ + +if (GETPOST("action") == 'dopayment') +{ + $PAYPAL_API_PRICE=price2num(GETPOST("newamount"),'MT'); + $PAYPAL_PAYMENT_TYPE='Sale'; + + $shipToName=GETPOST("shipToName"); + $shipToStreet=GETPOST("shipToStreet"); + $shipToCity=GETPOST("shipToCity"); + $shipToState=GETPOST("shipToState"); + $shipToCountryCode=GETPOST("shipToCountryCode"); + $shipToZip=GETPOST("shipToZip"); + $shipToStreet2=GETPOST("shipToStreet2"); + $phoneNum=GETPOST("phoneNum"); + $email=GETPOST("email"); + $desc=GETPOST("desc"); + + $mesg=''; + if (empty($PAYPAL_API_PRICE) || ! is_numeric($PAYPAL_API_PRICE)) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Amount")); + //elseif (empty($EMAIL)) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("YourEMail")); + //elseif (! isValidEMail($EMAIL)) $mesg=$langs->trans("ErrorBadEMail",$EMAIL); + elseif (empty($FULLTAG)) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("PaymentCode")); + + //var_dump($_POST); + if (empty($mesg)) + { + dol_syslog("newpayment.php call paypal api and do redirect", LOG_DEBUG); + + // Other + $PAYPAL_API_DEVISE="USD"; + //if ($currency == 'EUR') $PAYPAL_API_DEVISE="EUR"; + //if ($currency == 'USD') $PAYPAL_API_DEVISE="USD"; + if (! empty($currency)) $PAYPAL_API_DEVISE=$currency; + + dol_syslog("Submit Paypal form", LOG_DEBUG); + dol_syslog("PAYPAL_API_USER: $PAYPAL_API_USER", LOG_DEBUG); + //dol_syslog("PAYPAL_API_PASSWORD: $PAYPAL_API_PASSWORD", LOG_DEBUG); // No password into log files + dol_syslog("PAYPAL_API_SIGNATURE: $PAYPAL_API_SIGNATURE", LOG_DEBUG); + dol_syslog("PAYPAL_API_SANDBOX: $PAYPAL_API_SANDBOX", LOG_DEBUG); + dol_syslog("PAYPAL_API_OK: $PAYPAL_API_OK", LOG_DEBUG); + dol_syslog("PAYPAL_API_KO: $PAYPAL_API_KO", LOG_DEBUG); + dol_syslog("PAYPAL_API_PRICE: $PAYPAL_API_PRICE", LOG_DEBUG); + dol_syslog("PAYPAL_API_DEVISE: $PAYPAL_API_DEVISE", LOG_DEBUG); + dol_syslog("shipToName: $shipToName", LOG_DEBUG); + dol_syslog("shipToStreet: $shipToStreet", LOG_DEBUG); + dol_syslog("shipToCity: $shipToCity", LOG_DEBUG); + dol_syslog("shipToState: $shipToState", LOG_DEBUG); + dol_syslog("shipToCountryCode: $shipToCountryCode", LOG_DEBUG); + dol_syslog("shipToZip: $shipToZip", LOG_DEBUG); + dol_syslog("shipToStreet2: $shipToStreet2", LOG_DEBUG); + dol_syslog("phoneNum: $phoneNum", LOG_DEBUG); + dol_syslog("email: $email", LOG_DEBUG); + dol_syslog("desc: $desc", LOG_DEBUG); + + dol_syslog("SCRIPT_URI: ".(empty($_SERVER["SCRIPT_URI"])?'':$_SERVER["SCRIPT_URI"]), LOG_DEBUG); // If defined script uri must match domain of PAYPAL_API_OK and PAYPAL_API_KO + //$_SESSION["PaymentType"]=$PAYPAL_PAYMENT_TYPE; + //$_SESSION["currencyCodeType"]=$PAYPAL_API_DEVISE; + //$_SESSION["Payment_Amount"]=$PAYPAL_API_PRICE; + + // A redirect is added if API call successfull + print_paypal_redirect($PAYPAL_API_PRICE,$PAYPAL_API_DEVISE,$PAYPAL_PAYMENT_TYPE,$PAYPAL_API_OK,$PAYPAL_API_KO, $FULLTAG); + + exit; + } +} + + + +/* + * View + */ + +llxHeaderStripe($langs->trans("PaymentForm")); + +if (! empty($PAYPAL_API_SANDBOX)) +{ + dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode'),'','warning'); +} + +// Common variables +$creditor=$mysoc->name; +$paramcreditor='PAYPAL_CREDITOR_'.$suffix; +if (! empty($conf->global->$paramcreditor)) $creditor=$conf->global->$paramcreditor; +else if (! empty($conf->global->PAYPAL_CREDITOR)) $creditor=$conf->global->PAYPAL_CREDITOR; + +print ''."\n"; +print '
'."\n"; +print '
'."\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; +print ''; +print "\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; +print "\n"; + +print ''."\n"; + +// Show logo (search order: logo defined by PAYBOX_LOGO_suffix, then PAYBOX_LOGO, then small company logo, large company logo, theme logo, common logo) +$width=0; +// Define logo and logosmall +$logosmall=$mysoc->logo_small; +$logo=$mysoc->logo; +$paramlogo='PAYBOX_LOGO_'.$suffix; +if (! empty($conf->global->$paramlogo)) $logosmall=$conf->global->$paramlogo; +else if (! empty($conf->global->PAYBOX_LOGO)) $logosmall=$conf->global->PAYBOX_LOGO; +//print ''."\n"; +// Define urllogo +$urllogo=''; +if (! empty($logosmall) && is_readable($conf->mycompany->dir_output.'/logos/thumbs/'.$logosmall)) +{ + $urllogo=DOL_URL_ROOT.'/viewimage.php?modulepart=companylogo&file='.urlencode('thumbs/'.$logosmall); +} +elseif (! empty($logo) && is_readable($conf->mycompany->dir_output.'/logos/'.$logo)) +{ + $urllogo=DOL_URL_ROOT.'/viewimage.php?modulepart=companylogo&file='.urlencode($logo); + $width=96; +} +// Output html code for logo +if ($urllogo) +{ + print ''; + print ''; + print ''."\n"; +} + +// Output introduction text +$text=''; +if (! empty($conf->global->PAYPAL_NEWFORM_TEXT)) +{ + $langs->load("members"); + if (preg_match('/^\((.*)\)$/',$conf->global->PAYPAL_NEWFORM_TEXT,$reg)) $text.=$langs->trans($reg[1])."
\n"; + else $text.=$conf->global->PAYPAL_NEWFORM_TEXT."
\n"; + $text=''."\n"; +} +if (empty($text)) +{ + $text.=''."\n"; + $text.=''."\n"; +} +print $text; + +// Output payment summary form +print ''."\n"; + +print '

'.$text.'

'.$langs->trans("WelcomeOnPaymentPage").'

'.$langs->trans("ThisScreenAllowsYouToPay",$creditor).'

'; +print ''; +print ''."\n"; + +$found=false; +$error=0; +$var=false; + +// Free payment +if (! GETPOST("source") && $valid) +{ + $found=true; + $tag=GETPOST("tag"); + $fulltag=$tag; + + // Creditor + $var=!$var; + print ''."\n"; + + // Amount + $var=!$var; + print ''."\n"; + + // Tag + $var=!$var; + print ''."\n"; + + // We do not add fields shipToName, shipToStreet, shipToCity, shipToState, shipToCountryCode, shipToZip, shipToStreet2, phoneNum + // as they don't exists (buyer is unknown, tag is free). +} + + +// Payment on customer order +if (GETPOST("source") == 'order' && $valid) +{ + $found=true; + $langs->load("orders"); + + require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php'; + + $order=new Commande($db); + $result=$order->fetch('',$ref); + if ($result < 0) + { + $mesg=$order->error; + $error++; + } + else + { + $result=$order->fetch_thirdparty($order->socid); + } + + $amount=$order->total_ttc; + if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); + $amount=price2num($amount); + + $fulltag='ORD='.$order->ref.'.CUS='.$order->thirdparty->id; + //$fulltag.='.NAM='.strtr($order->thirdparty->name,"-"," "); + if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; } + $fulltag=dol_string_unaccent($fulltag); + + // Creditor + $var=!$var; + print ''."\n"; + + // Debitor + $var=!$var; + print ''."\n"; + + // Amount + $var=!$var; + print ''."\n"; + + // Tag + $var=!$var; + print ''."\n"; + + // Shipping address + $shipToName=$order->thirdparty->name; + $shipToStreet=$order->thirdparty->address; + $shipToCity=$order->thirdparty->town; + $shipToState=$order->thirdparty->state_code; + $shipToCountryCode=$order->thirdparty->country_code; + $shipToZip=$order->thirdparty->zip; + $shipToStreet2=''; + $phoneNum=$order->thirdparty->phone; + if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) + { + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + } + else + { + print ''."\n"; + } + print ''."\n"; + print 'ref.'">'."\n"; +} + + +// Payment on customer invoice +if (GETPOST("source") == 'invoice' && $valid) +{ + $found=true; + $langs->load("bills"); + + require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; + + $invoice=new Facture($db); + $result=$invoice->fetch('',$ref); + if ($result < 0) + { + $mesg=$invoice->error; + $error++; + } + else + { + $result=$invoice->fetch_thirdparty($invoice->socid); + } + + $amount=price2num($invoice->total_ttc - $invoice->getSommePaiement()); + if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); + $amount=price2num($amount); + + $fulltag='INV='.$invoice->ref.'.CUS='.$invoice->thirdparty->id; + //$fulltag.='.NAM='.strtr($invoice->thirdparty->name,"-"," "); + if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; } + $fulltag=dol_string_unaccent($fulltag); + + // Creditor + $var=!$var; + print ''."\n"; + + // Debitor + $var=!$var; + print ''."\n"; + + // Amount + $var=!$var; + print ''."\n"; + + // Tag + $var=!$var; + print ''."\n"; + + // Shipping address + $shipToName=$invoice->thirdparty->name; + $shipToStreet=$invoice->thirdparty->address; + $shipToCity=$invoice->thirdparty->town; + $shipToState=$invoice->thirdparty->state_code; + $shipToCountryCode=$invoice->thirdparty->country_code; + $shipToZip=$invoice->thirdparty->zip; + $shipToStreet2=''; + $phoneNum=$invoice->thirdparty->phone; + if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) + { + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + } + else + { + print ''."\n"; + } + print ''."\n"; + print 'ref.'">'."\n"; +} + +// Payment on contract line +if (GETPOST("source") == 'contractline' && $valid) +{ + $found=true; + $langs->load("contracts"); + + require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php'; + + $contractline=new ContratLigne($db); + $result=$contractline->fetch('',$ref); + if ($result < 0) + { + $mesg=$contractline->error; + $error++; + } + else + { + if ($contractline->fk_contrat > 0) + { + $contract=new Contrat($db); + $result=$contract->fetch($contractline->fk_contrat); + if ($result > 0) + { + $result=$contract->fetch_thirdparty($contract->socid); + } + else + { + $mesg=$contract->error; + $error++; + } + } + else + { + $mesg='ErrorRecordNotFound'; + $error++; + } + } + + $amount=$contractline->total_ttc; + if ($contractline->fk_product) + { + $product=new Product($db); + $result=$product->fetch($contractline->fk_product); + + // We define price for product (TODO Put this in a method in product class) + if (! empty($conf->global->PRODUIT_MULTIPRICES)) + { + $pu_ht = $product->multiprices[$contract->thirdparty->price_level]; + $pu_ttc = $product->multiprices_ttc[$contract->thirdparty->price_level]; + $price_base_type = $product->multiprices_base_type[$contract->thirdparty->price_level]; + } + else + { + $pu_ht = $product->price; + $pu_ttc = $product->price_ttc; + $price_base_type = $product->price_base_type; + } + + $amount=$pu_ttc; + if (empty($amount)) + { + dol_print_error('','ErrorNoPriceDefinedForThisProduct'); + exit; + } + } + if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); + $amount=price2num($amount); + + $fulltag='COL='.$contractline->ref.'.CON='.$contract->ref.'.CUS='.$contract->thirdparty->id.'.DAT='.dol_print_date(dol_now(),'%Y%m%d%H%M'); + //$fulltag.='.NAM='.strtr($contract->thirdparty->name,"-"," "); + if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; } + $fulltag=dol_string_unaccent($fulltag); + + $qty=1; + if (GETPOST('qty')) $qty=GETPOST('qty'); + + // Creditor + $var=!$var; + print ''."\n"; + + // Debitor + $var=!$var; + print ''."\n"; + + // Quantity + $var=!$var; + $label=$langs->trans("Quantity"); + $qty=1; + $duration=''; + if ($contractline->fk_product) + { + if ($product->isService() && $product->duration_value > 0) + { + $label=$langs->trans("Duration"); + + // TODO Put this in a global method + if ($product->duration_value > 1) + { + $dur=array("h"=>$langs->trans("Hours"),"d"=>$langs->trans("DurationDays"),"w"=>$langs->trans("DurationWeeks"),"m"=>$langs->trans("DurationMonths"),"y"=>$langs->trans("DurationYears")); + } + else + { + $dur=array("h"=>$langs->trans("Hour"),"d"=>$langs->trans("DurationDay"),"w"=>$langs->trans("DurationWeek"),"m"=>$langs->trans("DurationMonth"),"y"=>$langs->trans("DurationYear")); + } + $duration=$product->duration_value.' '.$dur[$product->duration_unit]; + } + } + print ''; + print ''."\n"; + + // Amount + $var=!$var; + print ''."\n"; + + // Tag + $var=!$var; + print ''."\n"; + + // Shipping address + $shipToName=$contract->thirdparty->name; + $shipToStreet=$contract->thirdparty->address; + $shipToCity=$contract->thirdparty->town; + $shipToState=$contract->thirdparty->state_code; + $shipToCountryCode=$contract->thirdparty->country_code; + $shipToZip=$contract->thirdparty->zip; + $shipToStreet2=''; + $phoneNum=$contract->thirdparty->phone; + if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) + { + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + } + else + { + print ''."\n"; + } + print ''."\n"; + print 'ref.'">'."\n"; +} + +// Payment on member subscription +if (GETPOST("source") == 'membersubscription' && $valid) +{ + $found=true; + $langs->load("members"); + + require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; + require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php'; + + $member=new Adherent($db); + $result=$member->fetch('',$ref); + if ($result < 0) + { + $mesg=$member->error; + $error++; + } + else + { + $subscription=new Subscription($db); + } + + $amount=$subscription->total_ttc; + if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); + $amount=price2num($amount); + + $fulltag='MEM='.$member->id.'.DAT='.dol_print_date(dol_now(),'%Y%m%d%H%M'); + if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; } + $fulltag=dol_string_unaccent($fulltag); + + // Creditor + $var=!$var; + print ''."\n"; + + // Debitor + $var=!$var; + print ''."\n"; + + if ($member->last_subscription_date || $member->last_subscription_amount) + { + // Last subscription date + $var=!$var; + print ''."\n"; + + // Last subscription amount + $var=!$var; + print ''."\n"; + + if (empty($amount) && ! GETPOST('newamount')) $_GET['newamount']=$member->last_subscription_amount; + } + + // Amount + $var=!$var; + print ''."\n"; + + // Tag + $var=!$var; + print ''."\n"; + + // Shipping address + $shipToName=$member->getFullName($langs); + $shipToStreet=$member->address; + $shipToCity=$member->town; + $shipToState=$member->state_code; + $shipToCountryCode=$member->country_code; + $shipToZip=$member->zip; + $shipToStreet2=''; + $phoneNum=$member->phone; + if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) + { + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + } + else + { + print ''."\n"; + } + print ''."\n"; + print ''."\n"; +} + + + + +if (! $found && ! $mesg) $mesg=$langs->trans("ErrorBadParameters"); + +if ($mesg) print ''."\n"; + +print '
'.$langs->trans("ThisIsInformationOnPayment").' :
'.$langs->trans("Creditor"); + print ''.$creditor.''; + print ''; + print '
'.$langs->trans("Amount"); + if (empty($amount)) print ' ('.$langs->trans("ToComplete").')'; + print ''; + if (empty($amount) || ! is_numeric($amount)) + { + print ''; + print ''; + } + else { + print ''.price($amount).''; + print ''; + print ''; + } + // Currency + print ' '.$langs->trans("Currency".$currency).''; + print ''; + print '
'.$langs->trans("PaymentCode"); + print ''.$fulltag.''; + print ''; + print ''; + print '
'.$langs->trans("Creditor"); + print ''.$creditor.''; + print ''; + print '
'.$langs->trans("ThirdParty"); + print ''.$order->thirdparty->name.''; + + // Object + $var=!$var; + $text=''.$langs->trans("PaymentOrderRef",$order->ref).''; + print '
'.$langs->trans("Designation"); + print ''.$text; + print ''; + print ''; + print '
'.$langs->trans("Amount"); + if (empty($amount)) print ' ('.$langs->trans("ToComplete").')'; + print ''; + if (empty($amount) || ! is_numeric($amount)) + { + print ''; + print ''; + } + else { + print ''.price($amount).''; + print ''; + print ''; + } + // Currency + print ' '.$langs->trans("Currency".$currency).''; + print ''; + print '
'.$langs->trans("PaymentCode"); + print ''.$fulltag.''; + print ''; + print ''; + print '
'.$langs->trans("Creditor"); + print ''.$creditor.''; + print ''; + print '
'.$langs->trans("ThirdParty"); + print ''.$invoice->thirdparty->name.''; + + // Object + $var=!$var; + $text=''.$langs->trans("PaymentInvoiceRef",$invoice->ref).''; + print '
'.$langs->trans("Designation"); + print ''.$text; + print ''; + print ''; + print '
'.$langs->trans("Amount"); + if (empty($amount)) print ' ('.$langs->trans("ToComplete").')'; + print ''; + if (empty($amount) || ! is_numeric($amount)) + { + print ''; + print ''; + } + else { + print ''.price($amount).''; + print ''; + print ''; + } + // Currency + print ' '.$langs->trans("Currency".$currency).''; + print ''; + print '
'.$langs->trans("PaymentCode"); + print ''.$fulltag.''; + print ''; + print ''; + print '
'.$langs->trans("Creditor"); + print ''.$creditor.''; + print ''; + print '
'.$langs->trans("ThirdParty"); + print ''.$contract->thirdparty->name.''; + + // Object + $var=!$var; + $text=''.$langs->trans("PaymentRenewContractId",$contract->ref,$contractline->ref).''; + if ($contractline->fk_product) + { + $text.='
'.$product->ref.($product->label?' - '.$product->label:''); + } + if ($contractline->description) $text.='
'.dol_htmlentitiesbr($contractline->description); + //if ($contractline->date_fin_validite) { + // $text.='
'.$langs->trans("DateEndPlanned").': '; + // $text.=dol_print_date($contractline->date_fin_validite); + //} + if ($contractline->date_fin_validite) + { + $text.='
'.$langs->trans("ExpiredSince").': '.dol_print_date($contractline->date_fin_validite); + } + + print '
'.$langs->trans("Designation"); + print ''.$text; + print ''; + print ''; + print '
'.$label.''.($duration?$duration:$qty).''; + print ''; + print '
'.$langs->trans("Amount"); + if (empty($amount)) print ' ('.$langs->trans("ToComplete").')'; + print ''; + if (empty($amount) || ! is_numeric($amount)) + { + print ''; + print ''; + } + else { + print ''.price($amount).''; + print ''; + print ''; + } + // Currency + print ' '.$langs->trans("Currency".$currency).''; + print ''; + print '
'.$langs->trans("PaymentCode"); + print ''.$fulltag.''; + print ''; + print ''; + print '
'.$langs->trans("Creditor"); + print ''.$creditor.''; + print ''; + print '
'.$langs->trans("Member"); + print ''; + if ($member->morphy == 'mor' && ! empty($member->societe)) print $member->societe; + else print $member->getFullName($langs); + print ''; + + // Object + $var=!$var; + $text=''.$langs->trans("PaymentSubscription").''; + print '
'.$langs->trans("Designation"); + print ''.$text; + print ''; + print ''; + print '
'.$langs->trans("LastSubscriptionDate"); + print ''.dol_print_date($member->last_subscription_date,'day'); + print '
'.$langs->trans("LastSubscriptionAmount"); + print ''.price($member->last_subscription_amount); + print '
'.$langs->trans("Amount"); + if (empty($amount)) + { + print ' ('.$langs->trans("ToComplete"); + if (! empty($conf->global->MEMBER_EXT_URL_SUBSCRIPTION_INFO)) print ' - '.$langs->trans("SeeHere").''; + print ')'; + } + print ''; + if (empty($amount) || ! is_numeric($amount)) + { + $valtoshow=GETPOST("newamount",'int'); + if (! empty($conf->global->MEMBER_MIN_AMOUNT) && $valtoshow) $valtoshow=max($conf->global->MEMBER_MIN_AMOUNT,$valtoshow); + print ''; + print ''; + } + else { + $valtoshow=$amount; + if (! empty($conf->global->MEMBER_MIN_AMOUNT) && $valtoshow) $valtoshow=max($conf->global->MEMBER_MIN_AMOUNT,$valtoshow); + print ''.price($valtoshow).''; + print ''; + print ''; + } + // Currency + print ' '.$langs->trans("Currency".$currency).''; + print ''; + print '
'.$langs->trans("PaymentCode"); + print ''.$fulltag.''; + print ''; + print ''; + print '

'.$mesg.'
'."\n"; +print "\n"; + +if ($found && ! $error) // We are in a management option and no error +{ + if (empty($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY)) $conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY='integral'; + + if ($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY == 'integral') + { + print '
'; + } + if ($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY == 'stripeonly') + { + print '
'; + } +} +else +{ + dol_print_error_email('ERRORNEWPAYMENTPAYPAL'); +} + +print '
'."\n"; +print '
'."\n"; +print '
'."\n"; +print '
'; + + +html_print_stripe_footer($mysoc,$langs); + +llxFooterStripe(); + +$db->close(); diff --git a/htdocs/public/stripe/paymentko.php b/htdocs/public/stripe/paymentko.php new file mode 100644 index 00000000000..09de4525b39 --- /dev/null +++ b/htdocs/public/stripe/paymentko.php @@ -0,0 +1,115 @@ + + * Copyright (C) 2006-2013 Laurent Destailleur + * + * 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 3 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/public/paybox/paymentko.php + * \ingroup paybox + * \brief File to show page after a failed payment + * \author Laurent Destailleur + */ + +define("NOLOGIN",1); // This means this output page does not require to be logged. +define("NOCSRFCHECK",1); // We accept to go on this page from external web site. + +// For MultiCompany module. +// Do not use GETPOST here, function is not defined and define must be done before including main.inc.php +// TODO This should be useless. Because entity must be retreive from object ref and not from url. +$entity=(! empty($_GET['entity']) ? (int) $_GET['entity'] : (! empty($_POST['entity']) ? (int) $_POST['entity'] : 1)); +if (is_numeric($entity)) define("DOLENTITY", $entity); + +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/paybox/lib/paybox.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; + +// Security check +if (empty($conf->paybox->enabled)) accessforbidden('',0,0,1); + +$langs->load("main"); +$langs->load("other"); +$langs->load("dict"); +$langs->load("bills"); +$langs->load("companies"); +$langs->load("paybox"); +$langs->load("paypal"); + + + + +/* + * Actions + */ + + + + + +/* + * View + */ + +dol_syslog("Callback url when a PayBox payment was canceled. query_string=".(empty($_SERVER["QUERY_STRING"])?'':$_SERVER["QUERY_STRING"])." script_uri=".(empty($_SERVER["SCRIPT_URI"])?'':$_SERVER["SCRIPT_URI"]), LOG_DEBUG, 0, '_paybox'); + +$tracepost = ""; +foreach($_POST as $k => $v) $tracepost .= "{$k} - {$v}\n"; +dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_paybox'); + + +// Send an email +if (! empty($conf->global->PAYBOX_PAYONLINE_SENDEMAIL)) +{ + $sendto=$conf->global->PAYBOX_PAYONLINE_SENDEMAIL; + $from=$conf->global->MAILING_EMAIL_FROM; + + $urlback=$_SERVER["REQUEST_URI"]; + $topic='['.$conf->global->MAIN_APPLICATION_TITLE.'] '.$langs->transnoentitiesnoconv("NewPayboxPaymentFailed"); + $content=$langs->transnoentitiesnoconv("NewPayboxPaymentFailed")."\n".$fulltag; + require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; + $mailfile = new CMailFile($topic, $sendto, $from, $content); + + $result=$mailfile->sendfile(); + if ($result) + { + dol_syslog("EMail sent to ".$sendto, LOG_DEBUG, 0, '_paybox'); + } + else + { + dol_syslog("Failed to send EMail to ".$sendto, LOG_ERR, 0, '_paybox'); + } +} + + +llxHeaderPayBox($langs->trans("PaymentForm")); + + +// Show message +print ''."\n"; +print '
'."\n"; + +print $langs->trans("YourPaymentHasNotBeenRecorded")."

\n"; + +if (! empty($conf->global->PAYBOX_MESSAGE_KO)) print $conf->global->PAYBOX_MESSAGE_KO; + +print "\n
\n"; + + +html_print_paybox_footer($mysoc,$langs); + + +llxFooterPayBox(); + +$db->close(); diff --git a/htdocs/public/stripe/paymentok.php b/htdocs/public/stripe/paymentok.php new file mode 100644 index 00000000000..9c3030a86ba --- /dev/null +++ b/htdocs/public/stripe/paymentok.php @@ -0,0 +1,172 @@ + + * Copyright (C) 2006-2013 Laurent Destailleur + * + * 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 3 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/public/paybox/paymentok.php + * \ingroup paybox + * \brief File to show page after a successful payment + * \author Laurent Destailleur + */ + +define("NOLOGIN",1); // This means this output page does not require to be logged. +define("NOCSRFCHECK",1); // We accept to go on this page from external web site. + +// For MultiCompany module. +// Do not use GETPOST here, function is not defined and define must be done before including main.inc.php +// TODO This should be useless. Because entity must be retreive from object ref and not from url. +$entity=(! empty($_GET['entity']) ? (int) $_GET['entity'] : (! empty($_POST['entity']) ? (int) $_POST['entity'] : 1)); +if (is_numeric($entity)) define("DOLENTITY", $entity); + +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/paybox/lib/paybox.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; + +// Security check +if (empty($conf->paybox->enabled)) accessforbidden('',0,0,1); + +$langs->load("main"); +$langs->load("other"); +$langs->load("dict"); +$langs->load("bills"); +$langs->load("companies"); +$langs->load("paybox"); +$langs->load("paypal"); + +/*$source=GETPOST('source'); +$ref=GETPOST('ref'); +$PAYBOXTOKEN=GETPOST('TOKEN'); +if (empty($PAYBOXTOKEN)) $PAYBOXTOKEN=GETPOST('token'); +$PAYBOXPAYERID=GETPOST('PAYERID'); +if (empty($PAYBOXPAYERID)) $PAYBOXPAYERID=GETPOST('PayerID'); +*/ +$PAYBOXFULLTAG=GETPOST('FULLTAG'); +if (empty($PAYBOXFULLTAG)) $PAYBOXFULLTAG=GETPOST('fulltag'); + + +/* + * Actions + */ + + + + + +/* + * View + */ + +dol_syslog("Callback url when a PayBox payment was done. query_string=".(empty($_SERVER["QUERY_STRING"])?'':$_SERVER["QUERY_STRING"])." script_uri=".(empty($_SERVER["SCRIPT_URI"])?'':$_SERVER["SCRIPT_URI"]), LOG_DEBUG, 0, '_paybox'); + +$tracepost = ""; +foreach($_POST as $k => $v) $tracepost .= "{$k} - {$v}\n"; +dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_paybox'); + +llxHeaderPayBox($langs->trans("PaymentForm")); + + +// Show message +print ''."\n"; +print '
'."\n"; + +// Get on url call +/* +$token = $PAYBOXTOKEN; +*/ +$fulltag = $PAYBOXFULLTAG; +/*$payerID = $PAYBOXPAYERID; +// Set by newpayment.php +$paymentType = $_SESSION['PaymentType']; +$currencyCodeType = $_SESSION['currencyCodeType']; +$FinalPaymentAmt = $_SESSION["Payment_Amount"]; +// From env +$ipaddress = $_SESSION['ipaddress']; + +dol_syslog("Call newpaymentok with token=".$token." paymentType=".$paymentType." currencyCodeType=".$currencyCodeType." payerID=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt." fulltag=".$fulltag); +*/ + + +print $langs->trans("YourPaymentHasBeenRecorded")."

\n"; + +if (! empty($conf->global->PAYBOX_MESSAGE_OK)) print $conf->global->PAYBOX_MESSAGE_OK; + +// Appel des triggers +include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; +$interface=new Interfaces($db); +$result=$interface->run_triggers('PAYBOX_PAYMENT_OK',$object,$user,$langs,$conf); +if ($result < 0) { $error++; $errors=$interface->errors; } +// Fin appel triggers + + +// Send an email +if (! empty($conf->global->PAYBOX_PAYONLINE_SENDEMAIL)) +{ + $sendto=$conf->global->PAYBOX_PAYONLINE_SENDEMAIL; + $from=$conf->global->MAILING_EMAIL_FROM; + // Define $urlwithroot + $urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root)); + $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file + //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current + + $urlback=$_SERVER["REQUEST_URI"]; + $topic='['.$conf->global->MAIN_APPLICATION_TITLE.'] '.$langs->transnoentitiesnoconv("NewPayboxPaymentReceived"); + $tmptag=dolExplodeIntoArray($fulltag,'.','='); + $content=""; + if (! empty($tmptag['MEM'])) + { + $langs->load("members"); + $url=$urlwithroot."/adherents/card_subscriptions.php?rowid=".$tmptag['MEM']; + $content.=$langs->trans("PaymentSubscription")."
\n"; + $content.=$langs->trans("MemberId").': '.$tmptag['MEM']."
\n"; + $content.=$langs->trans("Link").': '.$url.''."
\n"; + } + else + { + $content.=$langs->transnoentitiesnoconv("NewPayboxPaymentReceived")."
\n"; + } + $content.="
\n"; + $content.=$langs->transnoentitiesnoconv("TechnicalInformation").":
\n"; + $content.=$langs->transnoentitiesnoconv("ReturnURLAfterPayment").': '.$urlback."
\n"; + $content.="tag=".$fulltag."
\n"; + + $ishtml=dol_textishtml($content); // May contain urls + + require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; + $mailfile = new CMailFile($topic, $sendto, $from, $content, array(), array(), array(), '', '', 0, $ishtml); + + // Send an email + $result=$mailfile->sendfile(); + if ($result) + { + dol_syslog("EMail sent to ".$sendto, LOG_DEBUG, 0, '_paybox'); + } + else + { + dol_syslog("Failed to send EMail to ".$sendto, LOG_ERR, 0, '_paybox'); + } +} + + + +print "\n
\n"; + +html_print_paybox_footer($mysoc,$langs); + + +llxFooterPayBox(); + +$db->close(); diff --git a/htdocs/stripe/admin/index.html b/htdocs/stripe/admin/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/stripe/admin/stripe.php b/htdocs/stripe/admin/stripe.php new file mode 100644 index 00000000000..481f6634227 --- /dev/null +++ b/htdocs/stripe/admin/stripe.php @@ -0,0 +1,225 @@ + + * + * 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 3 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/stripe/admin/stripe.php + * \ingroup stripe + * \brief Page to setup stripe module + */ + +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/stripe/lib/stripe.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; + +$servicename='Stripe'; + +$langs->load("admin"); +$langs->load("other"); +$langs->load("stripe"); + +if (!$user->admin) + accessforbidden(); + +$action = GETPOST('action','alpha'); + + +if ($action == 'setvalue' && $user->admin) +{ + $db->begin(); + + $result=dolibarr_set_const($db, "STRIPE_API_SANDBOX",GETPOST('STRIPE_API_SANDBOX','alpha'),'chaine',0,'',$conf->entity); + if (! $result > 0) $error++; + $result=dolibarr_set_const($db, "STRIPE_TEST_SECRET_KEY",GETPOST('STRIPE_TEST_SECRET_KEY','alpha'),'chaine',0,'',$conf->entity); + if (! $result > 0) $error++; + $result=dolibarr_set_const($db, "STRIPE_TEST_PUBLISHABLE_KEY",GETPOST('STRIPE_TEST_PUBLISHABLE_KEY','alpha'),'chaine',0,'',$conf->entity); + if (! $result > 0) $error++; + $result=dolibarr_set_const($db, "STRIPE_LIVE_SECRET_KEY",GETPOST('STRIPE_LIVE_SECRET_KEY','alpha'),'chaine',0,'',$conf->entity); + if (! $result > 0) $error++; + $result=dolibarr_set_const($db, "STRIPE_LIVE_PUBLISHABLE_KEY",GETPOST('STRIPE_LIVE_PUBLISHABLE_KEY','alpha'),'chaine',0,'',$conf->entity); + if (! $result > 0) $error++; + $result=dolibarr_set_const($db, "STRIPE_CREDITOR",GETPOST('STRIPE_CREDITOR','alpha'),'chaine',0,'',$conf->entity); + if (! $result > 0) $error++; + $result=dolibarr_set_const($db, "STRIPE_CSS_URL",GETPOST('STRIPE_CSS_URL','alpha'),'chaine',0,'',$conf->entity); + if (! $result > 0) $error++; + $result=dolibarr_set_const($db, "STRIPE_MESSAGE_OK",GETPOST('STRIPE_MESSAGE_OK','alpha'),'chaine',0,'',$conf->entity); + if (! $result > 0) $error++; + $result=dolibarr_set_const($db, "STRIPE_MESSAGE_KO",GETPOST('STRIPE_MESSAGE_KO','alpha'),'chaine',0,'',$conf->entity); + if (! $result > 0) $error++; + + if (! $error) + { + $db->commit(); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); + } + else + { + $db->rollback(); + dol_print_error($db); + } +} + + +/* + * View + */ + +$SECRET_TEST_KEY="sk_test_xxxxxxxxxxxxxxxxxxxxxxxx"; // Stripe test secret key +if (empty($conf->global->STRIPE_TEST_SECRET_KEY)) $conf->global->STRIPE_TEST_SECRET_KEY = $SECRET_TEST_KEY; +$PUBLISHABLE_TEST_KEY="pk_test_xxxxxxxxxxxxxxxxxxxxxxxx"; // Stripe test publishable key +if (empty($conf->global->STRIPE_TEST_PUBLISHABLE_KEY)) $conf->global->STRIPE_TEST_PUBLISHABLE_KEY = $PUBLISHABLE_TEST_KEY; + +$SECRET_LIVE_KEY="sk_live_xxxxxxxxxxxxxxxxxxxxxxxx"; // Stripe live secret key +if (empty($conf->global->STRIPE_LIVE_SECRET_KEY)) $conf->global->STRIPE_LIVE_SECRET_KEY = $SECRET_LIVE_KEY; +$PUBLISHABLE_LIVE_KEY="pk_live_xxxxxxxxxxxxxxxxxxxxxxxx"; // Stripe live publishable key +if (empty($conf->global->STRIPE_LIVE_PUBLISHABLE_KEY)) $conf->global->STRIPE_LIVE_PUBLISHABLE_KEY = $PUBLISHABLE_LIVE_KEY; + +llxHeader('',$langs->trans("StripeSetup")); + + +$linkback=''.$langs->trans("BackToModuleList").''; +print load_fiche_titre($langs->trans("ModuleSetup").' Stripe',$linkback); +print '
'; + +$head=stripeadmin_prepare_head(); + +print '
'; +print ''; +print ''; + +dol_fiche_head($head, 'stripeaccount', ''); + +print $langs->trans("StripeDesc")."
\n"; + +print '
'; + +$var=true; + +print ''; +print ''; +print ''; +print ''; +print "\n"; + +$var=!$var; +print ''; + +$var=!$var; +print ''; + +$var=!$var; +print ''; + +$var=!$var; +print ''; + +$var=!$var; +print ''; + +$var=true; +print ''; +print ''; +print ''; +print "\n"; + +$var=!$var; +print ''; + +$var=!$var; +print ''; + +$var=!$var; +print ''; + +$var=!$var; +print ''; + +print '
'.$langs->trans("AccountParameter").''.$langs->trans("Value").'
'; +print $langs->trans("STRIPE_API_SANDBOX").''; +print $form->selectyesno("STRIPE_API_SANDBOX",$conf->global->STRIPE_API_SANDBOX,1); +print '
'; +print ''.$langs->trans("STRIPE_TEST_SECRET_KEY").''; +print ''; +print '
'.$langs->trans("Example").': sk_test_xxxxxxxxxxxxxxxxxxxxxxxx'; +print '
'; +print ''.$langs->trans("STRIPE_TEST_PUBLISHABLE_KEY").''; +print ''; +print '
'.$langs->trans("Example").': pk_test_xxxxxxxxxxxxxxxxxxxxxxxx'; +print '
'; +print ''.$langs->trans("STRIPE_LIVE_SECRET_KEY").''; +print ''; +print '
'.$langs->trans("Example").': sk_live_xxxxxxxxxxxxxxxxxxxxxxxx'; +print '
'; +print ''.$langs->trans("STRIPE_LIVE_PUBLISHABLE_KEY").''; +print ''; +print '
'.$langs->trans("Example").': pk_live_xxxxxxxxxxxxxxxxxxxxxxxx'; +print '
'.$langs->trans("UsageParameter").''.$langs->trans("Value").'
'; +print $langs->trans("VendorName").''; +print ''; +print '
'.$langs->trans("Example").': '.$mysoc->name; +print '
'; +print $langs->trans("CSSUrlForPaymentForm").''; +print ''; +print '
'.$langs->trans("Example").': http://mysite/mycss.css'; +print '
'; +print $langs->trans("MessageOK").''; +$doleditor=new DolEditor('STRIPE_MESSAGE_OK',$conf->global->STRIPE_MESSAGE_OK,'',100,'dolibarr_details','In',false,true,true,ROWS_2,60); +$doleditor->Create(); +print '
'; +print $langs->trans("MessageKO").''; +$doleditor=new DolEditor('STRIPE_MESSAGE_KO',$conf->global->STRIPE_MESSAGE_KO,'',100,'dolibarr_details','In',false,true,true,ROWS_2,60); +$doleditor->Create(); +print '
'; + +dol_fiche_end(); + +print '
'; + +print '
'; + +print '

'; + +print ''.$langs->trans("FollowingUrlAreAvailableToMakePayments").':
'; +print img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePaymentOnFreeAmount",$servicename).':
'; +print ''.DOL_MAIN_URL_ROOT.'/public/stripe/newpayment.php?amount=9.99&tag=your_free_tag'."
\n"; +if (! empty($conf->commande->enabled)) +{ + print img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePaymentOnOrder",$servicename).':
'; + print ''.DOL_MAIN_URL_ROOT.'/public/stripe/newpayment.php?source=order&ref=order_ref'."
\n"; +} +if (! empty($conf->facture->enabled)) +{ + print img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePaymentOnInvoice",$servicename).':
'; + print ''.DOL_MAIN_URL_ROOT.'/public/stripe/newpayment.php?source=invoice&ref=invoice_ref'."
\n"; +} +if (! empty($conf->contrat->enabled)) +{ + print img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePaymentOnContractLine",$servicename).':
'; + print ''.DOL_MAIN_URL_ROOT.'/public/stripe/newpayment.php?source=contractline&ref=contractline_ref'."
\n"; +} +if (! empty($conf->adherent->enabled)) +{ + print img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePaymentOnMemberSubscription",$servicename).':
'; + print ''.DOL_MAIN_URL_ROOT.'/public/stripe/newpayment.php?source=membersubscription&ref=member_ref'."
\n"; +} + +print "
"; +print info_admin($langs->trans("YouCanAddTagOnUrl")); + +llxFooter(); + +$db->close(); diff --git a/htdocs/stripe/img/index.html b/htdocs/stripe/img/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/stripe/img/object_stripe.png b/htdocs/stripe/img/object_stripe.png new file mode 100644 index 0000000000000000000000000000000000000000..287bd24910cb0fc86f886d02789f29b993bad530 GIT binary patch literal 819 zcmV-31I+x1P)2`81ATls8IUq4NIxsmpFgGA8FflMNTjFhO00007bV*G`2iXD;69^O^U!ddw z00M_eL_t(IPfb%#NK`=_{$}2L`}XbI#Y*sBfuXLJQs|+mbEhCG$e>Q)sY3?|JV=3r zhax(3=~@s$cInbJItE!FL?o7(MUj}TmTjx+8d^I5p&UgdzdheUcQK3M;T)V+b@tl3*XuCg;3mUOj+e2U zwd2~^!rh)@rLp?c;M;Nxy)ah+d=Dn@;pB4g0=lOp!u2Uak~o9^C6#iSj#&I^pe~$z zZfsma*{F=ym&cj&?dT~oB2$&ib-bP3z`gq=t}DA&glvh4leoChL`!>sv8!F^+ZS50 zjC|g~!2>z&ON_)lfdVBcKuEJB$)Te=k;!n8WBSE!Je(@w>9cjLl%fWyQA$I^CfNSy z!flXcWU?A_^ILfQwv=yCu zeJfyS7UeW*Ay6%_B1;q{E1>aXwT|mIm+)$)f+(_wi=M6wE?;a$bBkx)qpU*gQ_M?C zNI~@=^zgkDSyg78(Ri53(-IKB!LKsGm#2? zUaH~!$0};Ir2eRGFuPd8t*J8BC;~4PkRAZ)(&!gcV>BC8ggDEh#0=Q&O4M+(L?J0u zn;4&$3p;rEx_Z2A@_*4}b0y|Y<6Cg^d?(GkiF-nrVjk$^ygQ5TcCHVf&Z4*1;}ez= xl0Jw_8nqA>;D-U6fJV|l@gnx;>KNIzfxiXLt)E)oqyhi{002ovPDHLkV1kvqX=wle literal 0 HcmV?d00001 diff --git a/htdocs/stripe/index.html b/htdocs/stripe/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/stripe/lib/index.html b/htdocs/stripe/lib/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/stripe/lib/stripe.lib.php b/htdocs/stripe/lib/stripe.lib.php new file mode 100644 index 00000000000..d2d138cc8b3 --- /dev/null +++ b/htdocs/stripe/lib/stripe.lib.php @@ -0,0 +1,445 @@ + + * + * 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 3 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/stripe/lib/stripe.lib.php + * \ingroup stripe + * \brief Library for common stripe functions + */ + + + +/** + * Show header + * + * @param string $title Title of page + * @param string $head Head string to add int head section + * @return void + */ +function llxHeaderStripe($title, $head = "") +{ + global $user, $conf, $langs; + + header("Content-type: text/html; charset=".$conf->file->character_set_client); + + print ''; + //print ''; + print "\n"; + print "\n"; + print "\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print "".$title."\n"; + if ($head) print $head."\n"; + if (! empty($conf->global->STRIPE_CSS_URL)) print ''."\n"; + else + { + print ''."\n"; + print ''; + } + print "\n"; + print ''."\n"; +} + +/** + * Show footer + * + * @return void + */ +function llxFooterStripe() +{ + print "\n"; + print "\n"; +} + +/** + * Define head array for tabs of stripe tools setup pages + * + * @return Array of head + */ +function stripeadmin_prepare_head() +{ + global $langs, $conf; + + $h = 0; + $head = array(); + + $head[$h][0] = DOL_URL_ROOT."/stripe/admin/stripe.php"; + $head[$h][1] = $langs->trans("Stripe"); + $head[$h][2] = 'stripeaccount'; + $h++; + + $object=new stdClass(); + + // Show more tabs from modules + // Entries must be declared in modules descriptor with line + // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab + // $this->tabs = array('entity:-tabname); to remove a tab + complete_head_from_modules($conf,$langs,$object,$head,$h,'stripeadmin'); + + complete_head_from_modules($conf,$langs,$object,$head,$h,'stripeadmin','remove'); + + return $head; +} + + + +/** + * Return string with full Url + * + * @param string $type Type of URL ('free', 'order', 'invoice', 'contractline', 'membersubscription' ...) + * @param string $ref Ref of object + * @return string Url string + */ +function showStripePaymentUrl($type,$ref) +{ + global $conf, $langs; + + $langs->load("paypal"); + $langs->load("paybox"); + $langs->load("stripe"); + $servicename='Stripe'; + $out='

'; + $out.=img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePayment",$servicename).'
'; + $url=getStripePaymentUrl(0,$type,$ref); + $out.='
'; + return $out; +} + +/** + * Return string with full Url + * + * @param int $mode 0=True url, 1=Url formated with colors + * @param string $type Type of URL ('free', 'order', 'invoice', 'contractline', 'membersubscription' ...) + * @param string $ref Ref of object + * @param int $amount Amount + * @param string $freetag Free tag + * @return string Url string + */ +function getStripePaymentUrl($mode,$type,$ref='',$amount='9.99',$freetag='your_free_tag') +{ + global $conf; + + $ref=str_replace(' ','',$ref); + + if ($type == 'free') + { + $out=DOL_MAIN_URL_ROOT.'/public/stripe/newpayment.php?amount='.($mode?'':'').$amount.($mode?'':'').'&tag='.($mode?'':'').$freetag.($mode?'':''); + if (! empty($conf->global->PAYPAL_SECURITY_TOKEN)) + { + if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) $out.='&securekey='.$conf->global->PAYPAL_SECURITY_TOKEN; + else $out.='&securekey='.dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2); + } + } + if ($type == 'order') + { + $out=DOL_MAIN_URL_ROOT.'/public/stripe/newpayment.php?source=order&ref='.($mode?'':''); + if ($mode == 1) $out.='order_ref'; + if ($mode == 0) $out.=urlencode($ref); + $out.=($mode?'':''); + if (! empty($conf->global->PAYPAL_SECURITY_TOKEN)) + { + if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) $out.='&securekey='.$conf->global->PAYPAL_SECURITY_TOKEN; + else + { + $out.='&securekey='.($mode?'':''); + if ($mode == 1) $out.="hash('".$conf->global->PAYPAL_SECURITY_TOKEN."' + '".$type."' + order_ref)"; + if ($mode == 0) $out.= dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . $type . $ref, 2); + $out.=($mode?'':''); + } + } + } + if ($type == 'invoice') + { + $out=DOL_MAIN_URL_ROOT.'/public/stripe/newpayment.php?source=invoice&ref='.($mode?'':''); + if ($mode == 1) $out.='invoice_ref'; + if ($mode == 0) $out.=urlencode($ref); + $out.=($mode?'':''); + if (! empty($conf->global->PAYPAL_SECURITY_TOKEN)) + { + if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) $out.='&securekey='.$conf->global->PAYPAL_SECURITY_TOKEN; + else + { + $out.='&securekey='.($mode?'':''); + if ($mode == 1) $out.="hash('".$conf->global->PAYPAL_SECURITY_TOKEN."' + '".$type."' + invoice_ref)"; + if ($mode == 0) $out.= dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . $type . $ref, 2); + $out.=($mode?'':''); + } + } + } + if ($type == 'contractline') + { + $out=DOL_MAIN_URL_ROOT.'/public/stripe/newpayment.php?source=contractline&ref='.($mode?'':''); + if ($mode == 1) $out.='contractline_ref'; + if ($mode == 0) $out.=urlencode($ref); + $out.=($mode?'':''); + if (! empty($conf->global->PAYPAL_SECURITY_TOKEN)) + { + if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) $out.='&securekey='.$conf->global->PAYPAL_SECURITY_TOKEN; + else + { + $out.='&securekey='.($mode?'':''); + if ($mode == 1) $out.="hash('".$conf->global->PAYPAL_SECURITY_TOKEN."' + '".$type."' + contractline_ref)"; + if ($mode == 0) $out.= dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . $type . $ref, 2); + $out.=($mode?'':''); + } + } + } + if ($type == 'membersubscription') + { + $out=DOL_MAIN_URL_ROOT.'/public/stripe/newpayment.php?source=membersubscription&ref='.($mode?'':''); + if ($mode == 1) $out.='member_ref'; + if ($mode == 0) $out.=urlencode($ref); + $out.=($mode?'':''); + if (! empty($conf->global->PAYPAL_SECURITY_TOKEN)) + { + if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) $out.='&securekey='.$conf->global->PAYPAL_SECURITY_TOKEN; + else + { + $out.='&securekey='.($mode?'':''); + if ($mode == 1) $out.="hash('".$conf->global->PAYPAL_SECURITY_TOKEN."' + '".$type."' + member_ref)"; + if ($mode == 0) $out.= dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . $type . $ref, 2); + $out.=($mode?'':''); + } + } + } + + // For multicompany + $out.="&entity=".$conf->entity; // Check the entity because He may be the same reference in several entities + + return $out; +} + + +/** + * Create a redirect form to paybox form + * + * @param int $PRICE Price + * @param string $CURRENCY Currency + * @param string $EMAIL EMail + * @param string $urlok Url to go back if payment is OK + * @param string $urlko Url to go back if payment is KO + * @param string $TAG Tag + * @return int 1 if OK, -1 if ERROR + */ +function print_stripe_redirect($PRICE,$CURRENCY,$EMAIL,$urlok,$urlko,$TAG) +{ + global $conf, $langs, $db; + + dol_syslog("Stripe.lib::print_paybox_redirect", LOG_DEBUG); + + // Clean parameters + $PBX_IDENTIFIANT="2"; // Identifiant pour v2 test + if (! empty($conf->global->PAYBOX_PBX_IDENTIFIANT)) $PBX_IDENTIFIANT=$conf->global->PAYBOX_PBX_IDENTIFIANT; + $IBS_SITE="1999888"; // Site test + if (! empty($conf->global->PAYBOX_IBS_SITE)) $IBS_SITE=$conf->global->PAYBOX_IBS_SITE; + $IBS_RANG="99"; // Rang test + if (! empty($conf->global->PAYBOX_IBS_RANG)) $IBS_RANG=$conf->global->PAYBOX_IBS_RANG; + $IBS_DEVISE="840"; // Currency (Dollar US by default) + if ($CURRENCY == 'EUR') $IBS_DEVISE="978"; + if ($CURRENCY == 'USD') $IBS_DEVISE="840"; + + $URLPAYBOX=""; + if ($conf->global->PAYBOX_CGI_URL_V1) $URLPAYBOX=$conf->global->PAYBOX_CGI_URL_V1; + if ($conf->global->PAYBOX_CGI_URL_V2) $URLPAYBOX=$conf->global->PAYBOX_CGI_URL_V2; + + if (empty($IBS_DEVISE)) + { + dol_print_error('',"Paybox setup param PAYBOX_IBS_DEVISE not defined"); + return -1; + } + if (empty($URLPAYBOX)) + { + dol_print_error('',"Paybox setup param PAYBOX_CGI_URL_V1 and PAYBOX_CGI_URL_V2 undefined"); + return -1; + } + if (empty($IBS_SITE)) + { + dol_print_error('',"Paybox setup param PAYBOX_IBS_SITE not defined"); + return -1; + } + if (empty($IBS_RANG)) + { + dol_print_error('',"Paybox setup param PAYBOX_IBS_RANG not defined"); + return -1; + } + + // Definition des parametres vente produit pour paybox + $IBS_CMD=$TAG; + $IBS_TOTAL=$PRICE*100; // En centimes + $IBS_MODE=1; // Mode formulaire + $IBS_PORTEUR=$EMAIL; + $IBS_RETOUR="montant:M;ref:R;auto:A;trans:T"; // Format des parametres du get de validation en reponse (url a definir sous paybox) + $IBS_TXT=' '; // Use a space + $IBS_BOUTPI=$langs->trans("Wait"); + //$IBS_BOUTPI=''; + $IBS_EFFECTUE=$urlok; + $IBS_ANNULE=$urlko; + $IBS_REFUSE=$urlko; + $IBS_BKGD="#FFFFFF"; + $IBS_WAIT="2000"; + $IBS_LANG="GBR"; // By default GBR=english (FRA, GBR, ESP, ITA et DEU...) + if (preg_match('/^FR/i',$langs->defaultlang)) $IBS_LANG="FRA"; + if (preg_match('/^ES/i',$langs->defaultlang)) $IBS_LANG="ESP"; + if (preg_match('/^IT/i',$langs->defaultlang)) $IBS_LANG="ITA"; + if (preg_match('/^DE/i',$langs->defaultlang)) $IBS_LANG="DEU"; + if (preg_match('/^NL/i',$langs->defaultlang)) $IBS_LANG="NLD"; + if (preg_match('/^SE/i',$langs->defaultlang)) $IBS_LANG="SWE"; + $IBS_OUTPUT='E'; + $PBX_SOURCE='HTML'; + $PBX_TYPEPAIEMENT='CARTE'; + + dol_syslog("Soumission Paybox", LOG_DEBUG); + dol_syslog("IBS_MODE: $IBS_MODE", LOG_DEBUG); + dol_syslog("IBS_SITE: $IBS_SITE", LOG_DEBUG); + dol_syslog("IBS_RANG: $IBS_RANG", LOG_DEBUG); + dol_syslog("IBS_TOTAL: $IBS_TOTAL", LOG_DEBUG); + dol_syslog("IBS_DEVISE: $IBS_DEVISE", LOG_DEBUG); + dol_syslog("IBS_CMD: $IBS_CMD", LOG_DEBUG); + dol_syslog("IBS_PORTEUR: $IBS_PORTEUR", LOG_DEBUG); + dol_syslog("IBS_RETOUR: $IBS_RETOUR", LOG_DEBUG); + dol_syslog("IBS_EFFECTUE: $IBS_EFFECTUE", LOG_DEBUG); + dol_syslog("IBS_ANNULE: $IBS_ANNULE", LOG_DEBUG); + dol_syslog("IBS_REFUSE: $IBS_REFUSE", LOG_DEBUG); + dol_syslog("IBS_BKGD: $IBS_BKGD", LOG_DEBUG); + dol_syslog("IBS_WAIT: $IBS_WAIT", LOG_DEBUG); + dol_syslog("IBS_LANG: $IBS_LANG", LOG_DEBUG); + dol_syslog("IBS_OUTPUT: $IBS_OUTPUT", LOG_DEBUG); + dol_syslog("PBX_IDENTIFIANT: $PBX_IDENTIFIANT", LOG_DEBUG); + dol_syslog("PBX_SOURCE: $PBX_SOURCE", LOG_DEBUG); + dol_syslog("PBX_TYPEPAIEMENT: $PBX_TYPEPAIEMENT", LOG_DEBUG); + + header("Content-type: text/html; charset=".$conf->file->character_set_client); + + print ''."\n"; + print ''."\n"; + print "\n"; + print ''."\n"; + print ''."\n"; + print "\n"; + + // Formulaire pour module Paybox + print '
'."\n"; + + // For Paybox V2 (PBX_xxx) + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + + print '
'."\n"; + + + print "\n"; + print ''."\n"; + print "\n"; + print ''."\n"; + print "\n"; + + return; +} + + +/** + * Show footer of company in HTML pages + * + * @param Societe $fromcompany Third party + * @param Translate $langs Output language + * @return void + */ +function html_print_stripe_footer($fromcompany,$langs) +{ + global $conf; + + // Juridical status + $line1=""; + if ($fromcompany->forme_juridique_code) + { + $line1.=($line1?" - ":"").getFormeJuridiqueLabel($fromcompany->forme_juridique_code); + } + // Capital + if ($fromcompany->capital) + { + $line1.=($line1?" - ":"").$langs->transnoentities("CapitalOf",$fromcompany->capital)." ".$langs->transnoentities("Currency".$conf->currency); + } + // Prof Id 1 + if ($fromcompany->idprof1 && ($fromcompany->country_code != 'FR' || ! $fromcompany->idprof2)) + { + $field=$langs->transcountrynoentities("ProfId1",$fromcompany->country_code); + if (preg_match('/\((.*)\)/i',$field,$reg)) $field=$reg[1]; + $line1.=($line1?" - ":"").$field.": ".$fromcompany->idprof1; + } + // Prof Id 2 + if ($fromcompany->idprof2) + { + $field=$langs->transcountrynoentities("ProfId2",$fromcompany->country_code); + if (preg_match('/\((.*)\)/i',$field,$reg)) $field=$reg[1]; + $line1.=($line1?" - ":"").$field.": ".$fromcompany->idprof2; + } + + // Second line of company infos + $line2=""; + // Prof Id 3 + if ($fromcompany->idprof3) + { + $field=$langs->transcountrynoentities("ProfId3",$fromcompany->country_code); + if (preg_match('/\((.*)\)/i',$field,$reg)) $field=$reg[1]; + $line2.=($line2?" - ":"").$field.": ".$fromcompany->idprof3; + } + // Prof Id 4 + if ($fromcompany->idprof4) + { + $field=$langs->transcountrynoentities("ProfId4",$fromcompany->country_code); + if (preg_match('/\((.*)\)/i',$field,$reg)) $field=$reg[1]; + $line2.=($line2?" - ":"").$field.": ".$fromcompany->idprof4; + } + // IntraCommunautary VAT + if ($fromcompany->tva_intra != '') + { + $line2.=($line2?" - ":"").$langs->transnoentities("VATIntraShort").": ".$fromcompany->tva_intra; + } + + print '


'."\n"; + print '
'."\n"; + print $fromcompany->name.'
'; + print $line1.'
'; + print $line2; + print '
'."\n"; +} + diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index c8b18c81987..ef9a08524b3 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -1361,7 +1361,7 @@ $mainmenuusedarray=array_unique(explode(',',$mainmenuused)); $generic=1; // Put here list of menu entries when the div.mainmenu.menuentry was previously defined -$divalreadydefined=array('home','companies','products','commercial','externalsite','accountancy','project','tools','members','agenda','ftp','holiday','hrm','bookmark','cashdesk','ecm','geoipmaxmind','gravatar','clicktodial','paypal','webservices','websites'); +$divalreadydefined=array('home','companies','products','commercial','externalsite','accountancy','project','tools','members','agenda','ftp','holiday','hrm','bookmark','cashdesk','ecm','geoipmaxmind','gravatar','clicktodial','paypal','stripe','webservices','websites'); // Put here list of menu entries we are sure we don't want $divnotrequired=array('multicurrency','salaries','margin','opensurvey','paybox','expensereport','incoterm','prelevement','propal','workflow','notification','supplier_proposal','cron','product','productbatch','expedition'); foreach($mainmenuusedarray as $val) diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index ad4ec25df1d..144df2d12f8 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -1371,7 +1371,7 @@ $mainmenuusedarray=array_unique(explode(',',$mainmenuused)); $generic=1; // Put here list of menu entries when the div.mainmenu.menuentry was previously defined -$divalreadydefined=array('home','companies','products','commercial','externalsite','accountancy','project','tools','members','agenda','ftp','holiday','hrm','bookmark','cashdesk','ecm','geoipmaxmind','gravatar','clicktodial','paypal','webservices','websites'); +$divalreadydefined=array('home','companies','products','commercial','externalsite','accountancy','project','tools','members','agenda','ftp','holiday','hrm','bookmark','cashdesk','ecm','geoipmaxmind','gravatar','clicktodial','paypal','stripe','webservices','websites'); // Put here list of menu entries we are sure we don't want $divnotrequired=array('multicurrency','salaries','margin','opensurvey','paybox','expensereport','incoterm','prelevement','propal','workflow','notification','supplier_proposal','cron','product','productbatch','expedition'); foreach($mainmenuusedarray as $val) From d0e27f67e719395e7cb1f8f1b72ed7e308fc7831 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Tue, 18 Apr 2017 05:44:08 +0200 Subject: [PATCH 003/299] Add plugins Stripe --- COPYRIGHT | 1 + htdocs/core/modules/modStripe.class.php | 5 +- htdocs/includes/stripe/.coveralls.yml | 4 + htdocs/includes/stripe/.gitignore | 14 + htdocs/includes/stripe/.travis.yml | 18 + htdocs/includes/stripe/CHANGELOG.md | 430 ++ htdocs/includes/stripe/LICENSE | 21 + htdocs/includes/stripe/README.md | 153 + htdocs/includes/stripe/VERSION | 1 + htdocs/includes/stripe/build.php | 36 + htdocs/includes/stripe/composer.json | 36 + .../includes/stripe/data/ca-certificates.crt | 3919 +++++++++++++++++ htdocs/includes/stripe/data/test.png | Bin 0 -> 95 bytes htdocs/includes/stripe/init.php | 73 + htdocs/includes/stripe/lib/Account.php | 132 + htdocs/includes/stripe/lib/AlipayAccount.php | 13 + htdocs/includes/stripe/lib/ApiRequestor.php | 292 ++ htdocs/includes/stripe/lib/ApiResource.php | 203 + htdocs/includes/stripe/lib/ApiResponse.php | 32 + htdocs/includes/stripe/lib/ApplePayDomain.php | 65 + htdocs/includes/stripe/lib/ApplicationFee.php | 69 + .../stripe/lib/ApplicationFeeRefund.php | 44 + htdocs/includes/stripe/lib/AttachedObject.php | 31 + htdocs/includes/stripe/lib/Balance.php | 26 + .../stripe/lib/BalanceTransaction.php | 57 + htdocs/includes/stripe/lib/BankAccount.php | 25 + .../includes/stripe/lib/BitcoinReceiver.php | 85 + .../stripe/lib/BitcoinTransaction.php | 13 + htdocs/includes/stripe/lib/Card.php | 13 + htdocs/includes/stripe/lib/Charge.php | 184 + htdocs/includes/stripe/lib/Collection.php | 87 + htdocs/includes/stripe/lib/CountrySpec.php | 44 + htdocs/includes/stripe/lib/Coupon.php | 77 + htdocs/includes/stripe/lib/Customer.php | 190 + htdocs/includes/stripe/lib/Dispute.php | 83 + htdocs/includes/stripe/lib/Error/Api.php | 7 + .../stripe/lib/Error/ApiConnection.php | 7 + .../stripe/lib/Error/Authentication.php | 7 + htdocs/includes/stripe/lib/Error/Base.php | 60 + htdocs/includes/stripe/lib/Error/Card.php | 41 + .../stripe/lib/Error/InvalidRequest.php | 23 + .../includes/stripe/lib/Error/Permission.php | 7 + .../includes/stripe/lib/Error/RateLimit.php | 7 + htdocs/includes/stripe/lib/Event.php | 43 + .../includes/stripe/lib/ExternalAccount.php | 89 + htdocs/includes/stripe/lib/FileUpload.php | 61 + .../stripe/lib/HttpClient/ClientInterface.php | 18 + .../stripe/lib/HttpClient/CurlClient.php | 282 ++ htdocs/includes/stripe/lib/Invoice.php | 92 + htdocs/includes/stripe/lib/InvoiceItem.php | 77 + .../includes/stripe/lib/JsonSerializable.php | 18 + htdocs/includes/stripe/lib/Order.php | 87 + htdocs/includes/stripe/lib/OrderReturn.php | 33 + htdocs/includes/stripe/lib/Payout.php | 97 + htdocs/includes/stripe/lib/Plan.php | 90 + htdocs/includes/stripe/lib/Product.php | 77 + htdocs/includes/stripe/lib/Recipient.php | 92 + .../includes/stripe/lib/RecipientTransfer.php | 38 + htdocs/includes/stripe/lib/Refund.php | 79 + htdocs/includes/stripe/lib/SKU.php | 77 + .../stripe/lib/SingletonApiResource.php | 36 + htdocs/includes/stripe/lib/Source.php | 115 + htdocs/includes/stripe/lib/Stripe.php | 126 + htdocs/includes/stripe/lib/StripeObject.php | 294 ++ htdocs/includes/stripe/lib/Subscription.php | 97 + .../includes/stripe/lib/SubscriptionItem.php | 88 + htdocs/includes/stripe/lib/ThreeDSecure.php | 36 + htdocs/includes/stripe/lib/Token.php | 43 + htdocs/includes/stripe/lib/Transfer.php | 104 + .../includes/stripe/lib/TransferReversal.php | 53 + .../stripe/lib/Util/AutoPagingIterator.php | 61 + .../stripe/lib/Util/RequestOptions.php | 79 + htdocs/includes/stripe/lib/Util/Set.php | 44 + htdocs/includes/stripe/lib/Util/Util.php | 146 + .../includes/stripe/phpunit.no_autoload.xml | 15 + htdocs/includes/stripe/phpunit.xml | 15 + htdocs/includes/stripe/tests/AccountTest.php | 300 ++ .../stripe/tests/ApiRequestorTest.php | 68 + .../stripe/tests/ApplePayDomainTest.php | 72 + .../stripe/tests/ApplicationFeeRefundTest.php | 18 + .../stripe/tests/ApplicationFeeTest.php | 22 + .../stripe/tests/AuthenticationErrorTest.php | 16 + htdocs/includes/stripe/tests/BalanceTest.php | 15 + .../stripe/tests/BalanceTransactionTest.php | 13 + .../includes/stripe/tests/BankAccountTest.php | 32 + .../stripe/tests/BitcoinReceiverTest.php | 120 + .../includes/stripe/tests/CardErrorTest.php | 41 + htdocs/includes/stripe/tests/ChargeTest.php | 204 + .../includes/stripe/tests/CollectionTest.php | 105 + .../includes/stripe/tests/CountrySpecTest.php | 31 + htdocs/includes/stripe/tests/CouponTest.php | 29 + .../includes/stripe/tests/CurlClientTest.php | 100 + htdocs/includes/stripe/tests/CustomerTest.php | 278 ++ htdocs/includes/stripe/tests/DiscountTest.php | 31 + htdocs/includes/stripe/tests/DisputeTest.php | 96 + htdocs/includes/stripe/tests/ErrorTest.php | 61 + .../stripe/tests/ExternalAccountTest.php | 30 + .../includes/stripe/tests/FileUploadTest.php | 44 + .../stripe/tests/InvalidRequestErrorTest.php | 26 + htdocs/includes/stripe/tests/InvoiceTest.php | 56 + htdocs/includes/stripe/tests/PayoutTest.php | 94 + .../stripe/tests/PermissionsErrorTest.php | 22 + htdocs/includes/stripe/tests/PlanTest.php | 51 + htdocs/includes/stripe/tests/ProductTest.php | 158 + .../stripe/tests/RateLimitErrorTest.php | 22 + .../includes/stripe/tests/RecipientTest.php | 112 + htdocs/includes/stripe/tests/RefundTest.php | 131 + .../stripe/tests/RequestOptionsTest.php | 69 + htdocs/includes/stripe/tests/SourceTest.php | 218 + .../stripe/tests/StripeObjectTest.php | 108 + .../stripe/tests/SubscriptionItemTest.php | 38 + .../stripe/tests/SubscriptionTest.php | 132 + htdocs/includes/stripe/tests/TestCase.php | 271 ++ .../stripe/tests/ThreeDSecureTest.php | 46 + htdocs/includes/stripe/tests/TokenTest.php | 13 + .../stripe/tests/TransferReversalTest.php | 19 + htdocs/includes/stripe/tests/TransferTest.php | 46 + htdocs/includes/stripe/tests/UtilTest.php | 45 + .../stripe/tests/bootstrap.no_autoload.php | 4 + htdocs/includes/stripe/tests/bootstrap.php | 3 + htdocs/stripe/admin/stripe.php | 1 + htdocs/stripe/checkout.php | 241 + htdocs/stripe/config.php | 36 + htdocs/stripe/paymnt_link.php | 72 + 124 files changed, 13094 insertions(+), 3 deletions(-) create mode 100644 htdocs/includes/stripe/.coveralls.yml create mode 100644 htdocs/includes/stripe/.gitignore create mode 100644 htdocs/includes/stripe/.travis.yml create mode 100644 htdocs/includes/stripe/CHANGELOG.md create mode 100644 htdocs/includes/stripe/LICENSE create mode 100644 htdocs/includes/stripe/README.md create mode 100644 htdocs/includes/stripe/VERSION create mode 100644 htdocs/includes/stripe/build.php create mode 100644 htdocs/includes/stripe/composer.json create mode 100644 htdocs/includes/stripe/data/ca-certificates.crt create mode 100644 htdocs/includes/stripe/data/test.png create mode 100644 htdocs/includes/stripe/init.php create mode 100644 htdocs/includes/stripe/lib/Account.php create mode 100644 htdocs/includes/stripe/lib/AlipayAccount.php create mode 100644 htdocs/includes/stripe/lib/ApiRequestor.php create mode 100644 htdocs/includes/stripe/lib/ApiResource.php create mode 100644 htdocs/includes/stripe/lib/ApiResponse.php create mode 100644 htdocs/includes/stripe/lib/ApplePayDomain.php create mode 100644 htdocs/includes/stripe/lib/ApplicationFee.php create mode 100644 htdocs/includes/stripe/lib/ApplicationFeeRefund.php create mode 100644 htdocs/includes/stripe/lib/AttachedObject.php create mode 100644 htdocs/includes/stripe/lib/Balance.php create mode 100644 htdocs/includes/stripe/lib/BalanceTransaction.php create mode 100644 htdocs/includes/stripe/lib/BankAccount.php create mode 100644 htdocs/includes/stripe/lib/BitcoinReceiver.php create mode 100644 htdocs/includes/stripe/lib/BitcoinTransaction.php create mode 100644 htdocs/includes/stripe/lib/Card.php create mode 100644 htdocs/includes/stripe/lib/Charge.php create mode 100644 htdocs/includes/stripe/lib/Collection.php create mode 100644 htdocs/includes/stripe/lib/CountrySpec.php create mode 100644 htdocs/includes/stripe/lib/Coupon.php create mode 100644 htdocs/includes/stripe/lib/Customer.php create mode 100644 htdocs/includes/stripe/lib/Dispute.php create mode 100644 htdocs/includes/stripe/lib/Error/Api.php create mode 100644 htdocs/includes/stripe/lib/Error/ApiConnection.php create mode 100644 htdocs/includes/stripe/lib/Error/Authentication.php create mode 100644 htdocs/includes/stripe/lib/Error/Base.php create mode 100644 htdocs/includes/stripe/lib/Error/Card.php create mode 100644 htdocs/includes/stripe/lib/Error/InvalidRequest.php create mode 100644 htdocs/includes/stripe/lib/Error/Permission.php create mode 100644 htdocs/includes/stripe/lib/Error/RateLimit.php create mode 100644 htdocs/includes/stripe/lib/Event.php create mode 100644 htdocs/includes/stripe/lib/ExternalAccount.php create mode 100644 htdocs/includes/stripe/lib/FileUpload.php create mode 100644 htdocs/includes/stripe/lib/HttpClient/ClientInterface.php create mode 100644 htdocs/includes/stripe/lib/HttpClient/CurlClient.php create mode 100644 htdocs/includes/stripe/lib/Invoice.php create mode 100644 htdocs/includes/stripe/lib/InvoiceItem.php create mode 100644 htdocs/includes/stripe/lib/JsonSerializable.php create mode 100644 htdocs/includes/stripe/lib/Order.php create mode 100644 htdocs/includes/stripe/lib/OrderReturn.php create mode 100644 htdocs/includes/stripe/lib/Payout.php create mode 100644 htdocs/includes/stripe/lib/Plan.php create mode 100644 htdocs/includes/stripe/lib/Product.php create mode 100644 htdocs/includes/stripe/lib/Recipient.php create mode 100644 htdocs/includes/stripe/lib/RecipientTransfer.php create mode 100644 htdocs/includes/stripe/lib/Refund.php create mode 100644 htdocs/includes/stripe/lib/SKU.php create mode 100644 htdocs/includes/stripe/lib/SingletonApiResource.php create mode 100644 htdocs/includes/stripe/lib/Source.php create mode 100644 htdocs/includes/stripe/lib/Stripe.php create mode 100644 htdocs/includes/stripe/lib/StripeObject.php create mode 100644 htdocs/includes/stripe/lib/Subscription.php create mode 100644 htdocs/includes/stripe/lib/SubscriptionItem.php create mode 100644 htdocs/includes/stripe/lib/ThreeDSecure.php create mode 100644 htdocs/includes/stripe/lib/Token.php create mode 100644 htdocs/includes/stripe/lib/Transfer.php create mode 100644 htdocs/includes/stripe/lib/TransferReversal.php create mode 100644 htdocs/includes/stripe/lib/Util/AutoPagingIterator.php create mode 100644 htdocs/includes/stripe/lib/Util/RequestOptions.php create mode 100644 htdocs/includes/stripe/lib/Util/Set.php create mode 100644 htdocs/includes/stripe/lib/Util/Util.php create mode 100644 htdocs/includes/stripe/phpunit.no_autoload.xml create mode 100644 htdocs/includes/stripe/phpunit.xml create mode 100644 htdocs/includes/stripe/tests/AccountTest.php create mode 100644 htdocs/includes/stripe/tests/ApiRequestorTest.php create mode 100644 htdocs/includes/stripe/tests/ApplePayDomainTest.php create mode 100644 htdocs/includes/stripe/tests/ApplicationFeeRefundTest.php create mode 100644 htdocs/includes/stripe/tests/ApplicationFeeTest.php create mode 100644 htdocs/includes/stripe/tests/AuthenticationErrorTest.php create mode 100644 htdocs/includes/stripe/tests/BalanceTest.php create mode 100644 htdocs/includes/stripe/tests/BalanceTransactionTest.php create mode 100644 htdocs/includes/stripe/tests/BankAccountTest.php create mode 100644 htdocs/includes/stripe/tests/BitcoinReceiverTest.php create mode 100644 htdocs/includes/stripe/tests/CardErrorTest.php create mode 100644 htdocs/includes/stripe/tests/ChargeTest.php create mode 100644 htdocs/includes/stripe/tests/CollectionTest.php create mode 100644 htdocs/includes/stripe/tests/CountrySpecTest.php create mode 100644 htdocs/includes/stripe/tests/CouponTest.php create mode 100644 htdocs/includes/stripe/tests/CurlClientTest.php create mode 100644 htdocs/includes/stripe/tests/CustomerTest.php create mode 100644 htdocs/includes/stripe/tests/DiscountTest.php create mode 100644 htdocs/includes/stripe/tests/DisputeTest.php create mode 100644 htdocs/includes/stripe/tests/ErrorTest.php create mode 100644 htdocs/includes/stripe/tests/ExternalAccountTest.php create mode 100644 htdocs/includes/stripe/tests/FileUploadTest.php create mode 100644 htdocs/includes/stripe/tests/InvalidRequestErrorTest.php create mode 100644 htdocs/includes/stripe/tests/InvoiceTest.php create mode 100644 htdocs/includes/stripe/tests/PayoutTest.php create mode 100644 htdocs/includes/stripe/tests/PermissionsErrorTest.php create mode 100644 htdocs/includes/stripe/tests/PlanTest.php create mode 100644 htdocs/includes/stripe/tests/ProductTest.php create mode 100644 htdocs/includes/stripe/tests/RateLimitErrorTest.php create mode 100644 htdocs/includes/stripe/tests/RecipientTest.php create mode 100644 htdocs/includes/stripe/tests/RefundTest.php create mode 100644 htdocs/includes/stripe/tests/RequestOptionsTest.php create mode 100644 htdocs/includes/stripe/tests/SourceTest.php create mode 100644 htdocs/includes/stripe/tests/StripeObjectTest.php create mode 100644 htdocs/includes/stripe/tests/SubscriptionItemTest.php create mode 100644 htdocs/includes/stripe/tests/SubscriptionTest.php create mode 100644 htdocs/includes/stripe/tests/TestCase.php create mode 100644 htdocs/includes/stripe/tests/ThreeDSecureTest.php create mode 100644 htdocs/includes/stripe/tests/TokenTest.php create mode 100644 htdocs/includes/stripe/tests/TransferReversalTest.php create mode 100644 htdocs/includes/stripe/tests/TransferTest.php create mode 100644 htdocs/includes/stripe/tests/UtilTest.php create mode 100644 htdocs/includes/stripe/tests/bootstrap.no_autoload.php create mode 100644 htdocs/includes/stripe/tests/bootstrap.php create mode 100644 htdocs/stripe/checkout.php create mode 100644 htdocs/stripe/config.php create mode 100644 htdocs/stripe/paymnt_link.php diff --git a/COPYRIGHT b/COPYRIGHT index 6f8a595897d..61a0f2de6bd 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -31,6 +31,7 @@ Restler 3.0.0RC6 LGPL-3+ Yes TCPDF 6.2.12 LGPL-3+ Yes PDF generation TCPDI 1.0.0 LGPL-3+ / Apache 2.0 Yes FPDI replacement Swift Mailer 5.4.2-DEV MIT license Yes Comprehensive mailing tools for PHP +Stripe 4.7.0 MIT licence Yes Library for Stripe module JS libraries: jQuery 1.11.3 MIT License Yes JS library diff --git a/htdocs/core/modules/modStripe.class.php b/htdocs/core/modules/modStripe.class.php index 11dd6ee68e4..4b498629017 100644 --- a/htdocs/core/modules/modStripe.class.php +++ b/htdocs/core/modules/modStripe.class.php @@ -1,7 +1,6 @@ - * Copyright (C) 2004-2009 Laurent Destailleur - * Copyright (C) 2016 Alexandre Spangaro +/* Copyright (C) 2017 Alexandre Spangaro + * Copyright (C) 2017 Saasprov * * 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 diff --git a/htdocs/includes/stripe/.coveralls.yml b/htdocs/includes/stripe/.coveralls.yml new file mode 100644 index 00000000000..a343c9a7466 --- /dev/null +++ b/htdocs/includes/stripe/.coveralls.yml @@ -0,0 +1,4 @@ +service_name: travis-ci +src_dir: . +coverage_clover: clover.xml +json_path: coveralls-upload.json diff --git a/htdocs/includes/stripe/.gitignore b/htdocs/includes/stripe/.gitignore new file mode 100644 index 00000000000..93251c95077 --- /dev/null +++ b/htdocs/includes/stripe/.gitignore @@ -0,0 +1,14 @@ +# Mac OS X dumps these all over the place. +.DS_Store + +# Ignore the SimpleTest library if it is installed to /test/. +/test/simpletest/ + +# Ignore the /vendor/ directory for people using composer +/vendor/ + +# If the vendor directory isn't being commited the composer.lock file should also be ignored +composer.lock + +# Ignore PHPUnit coverage file +clover.xml diff --git a/htdocs/includes/stripe/.travis.yml b/htdocs/includes/stripe/.travis.yml new file mode 100644 index 00000000000..934b517bfea --- /dev/null +++ b/htdocs/includes/stripe/.travis.yml @@ -0,0 +1,18 @@ +language: php + +php: + - 5.3 + - 5.4 + - 5.5 + - 5.6 + - 7.0 + - 7.1 + - hhvm + +env: + - AUTOLOAD=1 + - AUTOLOAD=0 + +script: ./build.php ${AUTOLOAD} +after_script: ./vendor/bin/coveralls -v +sudo: false diff --git a/htdocs/includes/stripe/CHANGELOG.md b/htdocs/includes/stripe/CHANGELOG.md new file mode 100644 index 00000000000..3650c21d1c2 --- /dev/null +++ b/htdocs/includes/stripe/CHANGELOG.md @@ -0,0 +1,430 @@ +### 4.7.0 2017-04-10 + +* Add support for payouts and recipient transfers + +### 4.6.0 2017-04-06 + +* Please see 4.7.0 instead (no-op release) + +### 4.5.1 2017-03-22 + +* Remove hard dependency on cURL + +### 4.5.0 2017-03-20 + +* Support for detaching sources from customers + +### 4.4.2 2017-02-27 + +* Correct handling of `owner` parameter when updating sources + +### 4.4.1 2017-02-24 + +* Correct the error check on a bad JSON decoding + +### 4.4.0 2017-01-18 + +* Add support for updating sources + +### 4.3.0 2016-11-30 + +* Add support for verifying sources + +### 4.2.0 2016-11-21 + +* Add retrieve method for 3-D Secure resources + +### 4.1.1 2016-10-21 + +* Add docblock with model properties for `Plan` + +### 4.1.0 2016-10-18 + +* Support for 403 status codes (permission denied) + +### 4.0.1 2016-10-17 + +* Fix transfer reversal materialization +* Fixes for some property definitions in docblocks + +### 4.0.0 2016-09-28 + +* Support for subscription items +* Drop attempt to force TLS 1.2: please note that this could be breaking if you're using old OS distributions or packages and upgraded recently (so please make sure to test your integration!) + +### 3.23.0 2016-09-15 + +* Add support for Apple Pay domains + +### 3.22.0 2016-09-13 + +* Add `Stripe::setAppInfo` to allow plugins to register user agent information + +### 3.21.0 2016-08-25 + +* Add `Source` model for generic payment sources + +### 3.20.0 2016-08-08 + +* Add `getDeclineCode` to card errors + +### 3.19.0 2016-07-29 + +* Opt requests directly into TLS 1.2 where OpenSSL >= 1.0.1 (see #277 for context) + +### 3.18.0 2016-07-28 + +* Add new `STATUS_` constants for subscriptions + +### 3.17.1 2016-07-28 + +* Fix auto-paging iterator so that it plays nicely with `iterator_to_array` + +### 3.17.0 2016-07-14 + +* Add field annotations to model classes for better editor hinting + +### 3.16.0 2016-07-12 + +* Add `ThreeDSecure` model for 3-D secure payments + +### 3.15.0 2016-06-29 + +* Add static `update` method to all resources that can be changed. + +### 3.14.3 2016-06-20 + +* Make sure that cURL never sends `Expects: 100-continue`, even on large request bodies + +### 3.14.2 2016-06-03 + +* Add `inventory` under `SKU` to list of keys that have nested data and can be updated + +### 3.14.1 2016-05-27 + +* Fix some inconsistencies in PHPDoc + +### 3.14.0 2016-05-25 + +* Add support for returning Relay orders + +### 3.13.0 2016-05-04 + +* Add `list`, `create`, `update`, `retrieve`, and `delete` methods to the Subscription class + +### 3.12.1 2016-04-07 + +* Additional check on value arrays for some extra safety + +### 3.12.0 2016-03-31 + +* Fix bug `refreshFrom` on `StripeObject` would not take an `$opts` array +* Fix bug where `$opts` not passed to parent `save` method in `Account` +* Fix bug where non-existent variable was referenced in `reverse` in `Transfer` +* Update CA cert bundle for compatibility with OpenSSL versions below 1.0.1 + +### 3.11.0 2016-03-22 + +* Allow `CurlClient` to be initialized with default `CURLOPT_*` options + +### 3.10.1 2016-03-22 + +* Fix bug where request params and options were ignored in `ApplicationFee`'s `refund.` + +### 3.10.0 2016-03-15 + +* Add `reject` on `Account` to support the new API feature + +### 3.9.2 2016-03-04 + +* Fix error when an object's metadata is set more than once + +### 3.9.1 2016-02-24 + +* Fix encoding behavior of nested arrays for requests (see #227) + +### 3.9.0 2016-02-09 + +* Add automatic pagination mechanism with `autoPagingIterator()` +* Allow global account ID to be set with `Stripe::setAccountId()` + +### 3.8.0 2016-02-08 + +* Add `CountrySpec` model for looking up country payment information + +### 3.7.1 2016-02-01 + +* Update bundled CA certs + +### 3.7.0 2016-01-27 + +* Support deleting Relay products and SKUs + +### 3.6.0 2016-01-05 + +* Allow configuration of HTTP client timeouts + +### 3.5.0 2015-12-01 + +* Add a verification routine for external accounts + +### 3.4.0 2015-09-14 + +* Products, SKUs, and Orders -- https://stripe.com/relay + +### 3.3.0 2015-09-11 + +* Add support for 429 Rate Limit response + +### 3.2.0 2015-08-17 + +* Add refund listing and retrieval without an associated charge + +### 3.1.0 2015-08-03 + +* Add dispute listing and retrieval +* Add support for manage account deletion + +### 3.0.0 2015-07-28 + +* Rename `\Stripe\Object` to `\Stripe\StripeObject` (PHP 7 compatibility) +* Rename `getCode` and `getParam` in exceptions to `getStripeCode` and `getStripeParam` +* Add support for calling `json_encode` on Stripe objects in PHP 5.4+ +* Start supporting/testing PHP 7 + +### 2.3.0 2015-07-06 + +* Add request ID to all Stripe exceptions + +### 2.2.0 2015-06-01 + +* Add support for Alipay accounts as sources +* Add support for bank accounts as sources (private beta) +* Add support for bank accounts and cards as external_accounts on Account objects + +### 2.1.4 2015-05-13 + +* Fix CA certificate file path (thanks @lphilps & @matthewarkin) + +### 2.1.3 2015-05-12 + +* Fix to account updating to permit `tos_acceptance` and `personal_address` to be set properly +* Fix to Transfer reversal creation (thanks @neatness!) +* Network requests are now done through a swappable class for easier mocking + +### 2.1.2 2015-04-10 + +* Remove SSL cert revokation checking (all pre-Heartbleed certs have expired) +* Bug fixes to account updating + +### 2.1.1 2015-02-27 +* Support transfer reversals + +### 2.1.0 2015-02-19 + +* Support new API version (2015-02-18) +* Added Bitcoin Receiever update and delete actions +* Edited tests to prefer "source" over "card" as per new API version + +### 2.0.1 2015-02-16 + +* Fix to fetching endpoints that use a non-default baseUrl (`FileUpload`) + +### 2.0.0 2015-02-14 + +* Bumped minimum version to 5.3.3 +* Switched to Stripe namespace instead of Stripe_ class name prefiexes (thanks @chadicus!) +* Switched tests to PHPUnit (thanks @chadicus!) +* Switched style guide to PSR2 (thanks @chadicus!) +* Added $opts hash to the end of most methods: this permits passing 'idempotency_key', 'stripe_account', or 'stripe_version'. The last 2 will persist across multiple object loads. +* Added support for retrieving Account by ID + +### 1.18.0 2015-01-21 + +* Support making bitcoin charges through BitcoinReceiver source object + +### 1.17.5 2014-12-23 + +* Adding support for creating file uploads. + +### 1.17.4 2014-12-15 + +* Saving objects fetched with a custom key now works (thanks @JustinHook & @jpasilan) +* Added methods for reporting charges as safe or fraudulent and for specifying the reason for refunds + +### 1.17.3 2014-11-06 + +* Better handling of HHVM support for SSL certificate blacklist checking. + +### 1.17.2 2014-09-23 + +* Coupons now are backed by a `Stripe_Coupon` instead of `Stripe_Object`, and support updating metadata +* Running operations (`create`, `retrieve`, `all`) on upcoming invoice items now works + +### 1.17.1 2014-07-31 + +* Requests now send Content-Type header + +### 1.17.0 2014-07-29 + +* Application Fee refunds now a list instead of array +* HHVM now works +* Small bug fixes (thanks @bencromwell & @fastest963) +* __toString now returns the name of the object in addition to its JSON representation + +### 1.16.0 2014-06-17 + +* Add metadata for refunds and disputes + +### 1.15.0 2014-05-28 + +* Support canceling transfers + +### 1.14.1 2014-05-21 + +* Support cards for recipients. + +### 1.13.1 2014-05-15 + +* Fix bug in account resource where `id` wasn't in the result + +### 1.13.0 2014-04-10 + +* Add support for certificate blacklisting +* Update ca bundle +* Drop support for HHVM (Temporarily) + +### 1.12.0 2014-04-01 + +* Add Stripe_RateLimitError for catching rate limit errors. +* Update to Zend coding style (thanks, @jpiasetz) + +### 1.11.0 2014-01-29 + +* Add support for multiple subscriptions per customer + +### 1.10.1 2013-12-02 + +* Add new ApplicationFee + +### 1.9.1 2013-11-08 + +* Fix a bug where a null nestable object causes warnings to fire. + +### 1.9.0 2013-10-16 + +* Add support for metadata API. + +### 1.8.4 2013-09-18 + +* Add support for closing disputes. + +### 1.8.3 2013-08-13 + +* Add new Balance and BalanceTransaction + +### 1.8.2 2013-08-12 + +* Add support for unsetting attributes by updating to NULL. + Setting properties to a blank string is now an error. + +### 1.8.1 2013-07-12 + +* Add support for multiple cards API (Stripe API version 2013-07-12: https://stripe.com/docs/upgrades#2013-07-05) + +### 1.8.0 2013-04-11 + +* Allow Transfers to be creatable +* Add new Recipient resource + +### 1.7.15 2013-02-21 + +* Add 'id' to the list of permanent object attributes + +### 1.7.14 2013-02-20 + +* Don't re-encode strings that are already encoded in UTF-8. If you + were previously using plan or coupon objects with UTF-8 IDs, they + may have been treated as ISO-8859-1 (Latin-1) and encoded to UTF-8 a + 2nd time. You may now need to pass the IDs to utf8_encode before + passing them to Stripe_Plan::retrieve or Stripe_Coupon::retrieve. +* Ensure that all input is encoded in UTF-8 before submitting it to + Stripe's servers. (github issue #27) + +### 1.7.13 2013-02-01 + +* Add support for passing options when retrieving Stripe objects + e.g., Stripe_Charge::retrieve(array("id"=>"foo", "expand" => array("customer"))) + Stripe_Charge::retrieve("foo") will continue to work + +### 1.7.12 2013-01-15 + +* Add support for setting a Stripe API version override + +### 1.7.11 2012-12-30 + +* Version bump to cleanup constants and such (github issue #26) + +### 1.7.10 2012-11-08 + +* Add support for updating charge disputes. +* Fix bug preventing retrieval of null attributes + +### 1.7.9 2012-11-08 + +* Fix usage under autoloaders such as the one generated by composer + (github issue #22) + +### 1.7.8 2012-10-30 +* Add support for creating invoices. +* Add support for new invoice lines return format +* Add support for new list objects + +### 1.7.7 2012-09-14 + +* Get all of the various version numbers in the repo in sync (no other + changes) + +### 1.7.6 2012-08-31 + +* Add update and pay methods to Invoice resource + +### 1.7.5 2012-08-23 + +* Change internal function names so that Stripe_SingletonApiRequest is + E_STRICT-clean (github issue #16) + +### 1.7.4 2012-08-21 + +* Bugfix so that Stripe objects (e.g. Customer, Charge objects) used + in API calls are transparently converted to their object IDs + +### 1.7.3 2012-08-15 + +* Add new Account resource + +### 1.7.2 2012-06-26 + +* Make clearer that you should be including lib/Stripe.php, not + test/Stripe.php (github issue #14) + +### 1.7.1 2012-05-24 + +* Add missing argument to Stripe_InvalidRequestError constructor in + Stripe_ApiResource::instanceUrl. Fixes a warning when + Stripe_ApiResource::instanceUrl is called on a resource with no ID + (github issue #12) + +### 1.7.0 2012-05-17 + +* Support Composer and Packagist (github issue #9) + +* Add new deleteDiscount method to Stripe_Customer + +* Add new Transfer resource + +* Switch from using HTTP Basic auth to Bearer auth. (Note: Stripe will + support Basic auth for the indefinite future, but recommends Bearer + auth when possible going forward) + +* Numerous test suite improvements diff --git a/htdocs/includes/stripe/LICENSE b/htdocs/includes/stripe/LICENSE new file mode 100644 index 00000000000..a21757e4fcd --- /dev/null +++ b/htdocs/includes/stripe/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2010-2015 Stripe + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/htdocs/includes/stripe/README.md b/htdocs/includes/stripe/README.md new file mode 100644 index 00000000000..16642900a1f --- /dev/null +++ b/htdocs/includes/stripe/README.md @@ -0,0 +1,153 @@ +# Stripe PHP bindings + +[![Build Status](https://travis-ci.org/stripe/stripe-php.svg?branch=master)](https://travis-ci.org/stripe/stripe-php) +[![Latest Stable Version](https://poser.pugx.org/stripe/stripe-php/v/stable.svg)](https://packagist.org/packages/stripe/stripe-php) +[![Total Downloads](https://poser.pugx.org/stripe/stripe-php/downloads.svg)](https://packagist.org/packages/stripe/stripe-php) +[![License](https://poser.pugx.org/stripe/stripe-php/license.svg)](https://packagist.org/packages/stripe/stripe-php) +[![Code Coverage](https://coveralls.io/repos/stripe/stripe-php/badge.svg?branch=master)](https://coveralls.io/r/stripe/stripe-php?branch=master) + +You can sign up for a Stripe account at https://stripe.com. + +## Requirements + +PHP 5.3.3 and later. + +## Composer + +You can install the bindings via [Composer](http://getcomposer.org/). Run the following command: + +```bash +composer require stripe/stripe-php +``` + +To use the bindings, use Composer's [autoload](https://getcomposer.org/doc/00-intro.md#autoloading): + +```php +require_once('vendor/autoload.php'); +``` + +## Manual Installation + +If you do not wish to use Composer, you can download the [latest release](https://github.com/stripe/stripe-php/releases). Then, to use the bindings, include the `init.php` file. + +```php +require_once('/path/to/stripe-php/init.php'); +``` + +## Dependencies + +The bindings require the following extension in order to work properly: + +- [`curl`](https://secure.php.net/manual/en/book.curl.php), although you can use your own non-cURL client if you prefer +- [`json`](https://secure.php.net/manual/en/book.json.php) +- [`mbstring`](https://secure.php.net/manual/en/book.mbstring.php) (Multibyte String) + +If you use Composer, these dependencies should be handled automatically. If you install manually, you'll want to make sure that these extensions are available. + +## Getting Started + +Simple usage looks like: + +```php +\Stripe\Stripe::setApiKey('sk_test_BQokikJOvBiI2HlWgH4olfQ2'); +$charge = \Stripe\Charge::create(array('amount' => 2000, 'currency' => 'usd', 'source' => 'tok_189fqt2eZvKYlo2CTGBeg6Uq' )); +echo $charge; +``` + +## Documentation + +Please see https://stripe.com/docs/api for up-to-date documentation. + +## Legacy Version Support + +If you are using PHP 5.2, you can download v1.18.0 ([zip](https://github.com/stripe/stripe-php/archive/v1.18.0.zip), [tar.gz](https://github.com/stripe/stripe-php/archive/v1.18.0.tar.gz)) from our [releases page](https://github.com/stripe/stripe-php/releases). This version will continue to work with new versions of the Stripe API for all common uses. + +This legacy version may be included via `require_once("/path/to/stripe-php/lib/Stripe.php");`, and used like: + +```php +Stripe::setApiKey('d8e8fca2dc0f896fd7cb4cb0031ba249'); +$myCard = array('number' => '4242424242424242', 'exp_month' => 8, 'exp_year' => 2018); +$charge = Stripe_Charge::create(array('card' => $myCard, 'amount' => 2000, 'currency' => 'usd')); +echo $charge; +``` + +## Custom Request Timeouts + +*NOTE:* We do not recommend decreasing the timeout for non-read-only calls (e.g. charge creation), since even if you locally timeout, the request on Stripe's side can still complete. If you are decreasing timeouts on these calls, make sure to use [idempotency tokens](https://stripe.com/docs/api/php#idempotent_requests) to avoid executing the same transaction twice as a result of timeout retry logic. + +To modify request timeouts (connect or total, in seconds) you'll need to tell the API client to use a CurlClient other than its default. You'll set the timeouts in that CurlClient. + +```php +// set up your tweaked Curl client +$curl = new \Stripe\HttpClient\CurlClient(); +$curl->setTimeout(10); // default is \Stripe\HttpClient\CurlClient::DEFAULT_TIMEOUT +$curl->setConnectTimeout(5); // default is \Stripe\HttpClient\CurlClient::DEFAULT_CONNECT_TIMEOUT + +echo $curl->getTimeout(); // 10 +echo $curl->getConnectTimeout(); // 5 + +// tell Stripe to use the tweaked client +\Stripe\ApiRequestor::setHttpClient($curl); + +// use the Stripe API client as you normally would +``` + +## Custom cURL Options (e.g. proxies) + +Need to set a proxy for your requests? Pass in the requisite `CURLOPT_*` array to the CurlClient constructor, using the same syntax as `curl_stopt_array()`. This will set the default cURL options for each HTTP request made by the SDK, though many more common options (e.g. timeouts; see above on how to set those) will be overridden by the client even if set here. + +```php +// set up your tweaked Curl client +$curl = new \Stripe\HttpClient\CurlClient(array(CURLOPT_PROXY => 'proxy.local:80')); +// tell Stripe to use the tweaked client +\Stripe\ApiRequestor::setHttpClient($curl); +``` + +Alternately, a callable can be passed to the CurlClient constructor that returns the above array based on request inputs. See `testDefaultOptions()` in `tests/CurlClientTest.php` for an example of this behavior. Note that the callable is called at the beginning of every API request, before the request is sent. + +### SSL / TLS compatibility issues + +Stripe's API now requires that [all connections use TLS 1.2](https://stripe.com/blog/upgrading-tls). Some systems (most notably some older CentOS and RHEL versions) are capable of using TLS 1.2 but will use TLS 1.0 or 1.1 by default. In this case, you'd get an `invalid_request_error` with the following error message: "Stripe no longer supports API requests made with TLS 1.0. Please initiate HTTPS connections with TLS 1.2 or later. You can learn more about this at [https://stripe.com/blog/upgrading-tls](https://stripe.com/blog/upgrading-tls).". + +The recommended course of action is to [upgrade your cURL and OpenSSL packages](https://support.stripe.com/questions/how-do-i-upgrade-my-stripe-integration-from-tls-1-0-to-tls-1-2#php) so that TLS 1.2 is used by default, but if that is not possible, you might be able to solve the issue by setting the `CURLOPT_SSLVERSION` option to either `CURL_SSLVERSION_TLSv1` or `CURL_SSLVERSION_TLSv1_2`: + +```php +$curl = new \Stripe\HttpClient\CurlClient(array(CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1)); +\Stripe\ApiRequestor::setHttpClient($curl); +``` + +## Development + +Install dependencies: + +``` bash +composer install +``` + +## Tests + +Install dependencies as mentioned above (which will resolve [PHPUnit](http://packagist.org/packages/phpunit/phpunit)), then you can run the test suite: + +```bash +./vendor/bin/phpunit +``` + +Or to run an individual test file: + +```bash +./vendor/bin/phpunit tests/UtilTest.php +``` + +## Attention plugin developers + +Are you writing a plugin that integrates Stripe and embeds our library? Then please use the `setAppInfo` function to identify your plugin. For example: + +```php +\Stripe\Stripe::setAppInfo("MyAwesomePlugin", "1.2.34", "https://myawesomeplugin.info"); +``` + +The method should be called once, before any request is sent to the API. The second and third parameters are optional. + +### SSL / TLS configuration option + +See the "SSL / TLS compatibility issues" paragraph above for full context. If you want to ensure that your plugin can be used on all systems, you should add a configuration option to let your users choose between different values for `CURLOPT_SSLVERSION`: none (default), `CURL_SSLVERSION_TLSv1` and `CURL_SSLVERSION_TLSv1_2`. diff --git a/htdocs/includes/stripe/VERSION b/htdocs/includes/stripe/VERSION new file mode 100644 index 00000000000..f6cdf40983f --- /dev/null +++ b/htdocs/includes/stripe/VERSION @@ -0,0 +1 @@ +4.7.0 diff --git a/htdocs/includes/stripe/build.php b/htdocs/includes/stripe/build.php new file mode 100644 index 00000000000..4401bb4b81f --- /dev/null +++ b/htdocs/includes/stripe/build.php @@ -0,0 +1,36 @@ +#!/usr/bin/env php +=5.3.3", + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*" + }, + "require-dev": { + "phpunit/phpunit": "~4.0", + "satooshi/php-coveralls": "~0.6.1", + "squizlabs/php_codesniffer": "~2.0" + }, + "autoload": { + "psr-4": { "Stripe\\" : "lib/" } + }, + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + } +} diff --git a/htdocs/includes/stripe/data/ca-certificates.crt b/htdocs/includes/stripe/data/ca-certificates.crt new file mode 100644 index 00000000000..1c4e5b22673 --- /dev/null +++ b/htdocs/includes/stripe/data/ca-certificates.crt @@ -0,0 +1,3919 @@ +## +## Bundle of CA Root Certificates +## +## Certificate data from Mozilla as of: Fri Jan 22 20:39:57 2016 +## +## This is a bundle of X.509 certificates of public Certificate Authorities +## (CA). These were automatically extracted from Mozilla's root certificates +## file (certdata.txt). This file can be found in the mozilla source tree: +## http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt +## +## It contains the certificates in PEM format and therefore +## can be directly used with curl / libcurl / php_curl, or with +## an Apache+mod_ssl webserver for SSL client authentication. +## Just configure this file as the SSLCACertificateFile. +## +## Conversion done with mk-ca-bundle.pl version 1.25. +## SHA1: 0ab47e2f41518f8d223eab517cb799e5b071231e +## + + +GlobalSign Root CA +================== +-----BEGIN CERTIFICATE----- +MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkGA1UEBhMCQkUx +GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkds +b2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNV +BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYD +VQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDa +DuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavpxy0Sy6sc +THAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlb +Kk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNP +c1STE4U6G7weNLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX +gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV +HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0BAQUF +AAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6Dj +Y1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyG +j/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhH +hm4qxFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveC +X4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A== +-----END CERTIFICATE----- + +GlobalSign Root CA - R2 +======================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMjETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6 +ErPLv4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8eoLrvozp +s6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklqtTleiDTsvHgMCJiEbKjN +S7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzdC9XZzPnqJworc5HGnRusyMvo4KD0L5CL +TfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pazq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6C +ygPCm48CAwEAAaOBnDCBmTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4E +FgQUm+IHV2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5nbG9i +YWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG3lm0mi3f3BmGLjAN +BgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4GsJ0/WwbgcQ3izDJr86iw8bmEbTUsp +9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu +01yiPqFbQfXf5WRDLenVOavSot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG7 +9G+dwfCMNYxdAfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7 +TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg== +-----END CERTIFICATE----- + +Verisign Class 3 Public Primary Certification Authority - G3 +============================================================ +-----BEGIN CERTIFICATE----- +MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw +CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy +dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDMgUHVibGljIFByaW1hcnkg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAMu6nFL8eB8aHm8bN3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1 +EUGO+i2tKmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGukxUc +cLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBmCC+Vk7+qRy+oRpfw +EuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJXwzw3sJ2zq/3avL6QaaiMxTJ5Xpj +055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWuimi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA +ERSWwauSCPc/L8my/uRan2Te2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5f +j267Cz3qWhMeDGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC +/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565pF4ErWjfJXir0 +xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa +t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ== +-----END CERTIFICATE----- + +Entrust.net Premium 2048 Secure Server CA +========================================= +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChMLRW50cnVzdC5u +ZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBpbmNvcnAuIGJ5IHJlZi4gKGxp +bWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNV +BAMTKkVudHJ1c3QubmV0IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQx +NzUwNTFaFw0yOTA3MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3 +d3d3LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTEl +MCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEGA1UEAxMqRW50cnVzdC5u +ZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgpMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEArU1LqRKGsuqjIAcVFmQqK0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOL +Gp18EzoOH1u3Hs/lJBQesYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSr +hRSGlVuXMlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVTXTzW +nLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/HoZdenoVve8AjhUi +VBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH4QIDAQABo0IwQDAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJ +KoZIhvcNAQEFBQADggEBADubj1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPy +T/4xmf3IDExoU8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf +zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5bu/8j72gZyxKT +J1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+bYQLCIt+jerXmCHG8+c8eS9e +nNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/ErfF6adulZkMV8gzURZVE= +-----END CERTIFICATE----- + +Baltimore CyberTrust Root +========================= +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJRTESMBAGA1UE +ChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYDVQQDExlCYWx0aW1vcmUgQ3li +ZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoXDTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMC +SUUxEjAQBgNVBAoTCUJhbHRpbW9yZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFs +dGltb3JlIEN5YmVyVHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKME +uyKrmD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjrIZ3AQSsB +UnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeKmpYcqWe4PwzV9/lSEy/C +G9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSuXmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9 +XbIGevOF6uvUA65ehD5f/xXtabz5OTZydc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjpr +l3RjM71oGDHweI12v/yejl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoI +VDaGezq1BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEB +BQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT929hkTI7gQCvlYpNRh +cL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3WgxjkzSswF07r51XgdIGn9w/xZchMB5 +hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsa +Y71k5h+3zvDyny67G7fyUIhzksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9H +RCwBXbsdtTLSR9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp +-----END CERTIFICATE----- + +AddTrust Low-Value Services Root +================================ +-----BEGIN CERTIFICATE----- +MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRU +cnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMwMTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQsw +CQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBO +ZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ulCDtbKRY6 +54eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6ntGO0/7Gcrjyvd7ZWxbWr +oulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyldI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1 +Zmne3yzxbrww2ywkEtvrNTVokMsAsJchPXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJui +GMx1I4S+6+JNM3GOGvDC+Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8w +HQYDVR0OBBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8EBTAD +AQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBlMQswCQYDVQQGEwJT +RTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEw +HwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxt +ZBsfzQ3duQH6lmM0MkhHma6X7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0Ph +iVYrqW9yTkkz43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY +eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJlpz/+0WatC7xr +mYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOAWiFeIc9TVPC6b4nbqKqVz4vj +ccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk= +-----END CERTIFICATE----- + +AddTrust External Root +====================== +-----BEGIN CERTIFICATE----- +MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFsIFRUUCBOZXR3b3JrMSIwIAYD +VQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEw +NDgzOFowbzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRU +cnVzdCBFeHRlcm5hbCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0Eg +Um9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvtH7xsD821 ++iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9uMq/NzgtHj6RQa1wVsfw +Tz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzXmk6vBbOmcZSccbNQYArHE504B4YCqOmo +aSYYkKtMsE8jqzpPhNjfzp/haW+710LXa0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy +2xSoRcRdKn23tNbE7qzNE0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv7 +7+ldU9U0WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYDVR0P +BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0Jvf6xCZU7wO94CTL +VBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEmMCQGA1UECxMdQWRk +VHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsxIjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENB +IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZl +j7DYd7usQWxHYINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5 +6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvCNr4TDea9Y355 +e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEXc4g/VhsxOBi0cQ+azcgOno4u +G+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5amnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= +-----END CERTIFICATE----- + +AddTrust Public Services Root +============================= +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSAwHgYDVQQDExdBZGRU +cnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAxMDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJ +BgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5l +dHdvcmsxIDAeBgNVBAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV6tsfSlbu +nyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nXGCwwfQ56HmIexkvA/X1i +d9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnPdzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSG +Aa2Il+tmzV7R/9x98oTaunet3IAIx6eH1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAw +HM+A+WD+eeSI8t0A65RF62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0G +A1UdDgQWBBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29yazEgMB4G +A1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4 +JNojVhaTdt02KLmuG7jD8WS6IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL ++YPoRNWyQSW/iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao +GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh4SINhwBk/ox9 +Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQmXiLsks3/QppEIW1cxeMiHV9H +EufOX1362KqxMy3ZdvJOOjMMK7MtkAY= +-----END CERTIFICATE----- + +AddTrust Qualified Certificates Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEUMBIGA1UEChML +QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSMwIQYDVQQDExpBZGRU +cnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcx +CzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQ +IE5ldHdvcmsxIzAhBgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG +9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwqxBb/4Oxx +64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G87B4pfYOQnrjfxvM0PC3 +KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i2O+tCBGaKZnhqkRFmhJePp1tUvznoD1o +L/BLcHwTOK28FSXx1s6rosAx1i+f4P8UWfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GR +wVY18BTcZTYJbqukB8c10cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HU +MIHRMB0GA1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/ +BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6FrpGkwZzELMAkGA1UE +BhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRUcnVzdCBUVFAgTmV0d29y +azEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlmaWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQAD +ggEBABmrder4i2VhlRO6aQTvhsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxG +GuoYQ992zPlmhpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X +dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3P6CxB9bpT9ze +RXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9YiQBCYz95OdBEsIJuQRno3eDB +iFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5noxqE= +-----END CERTIFICATE----- + +Entrust Root Certification Authority +==================================== +-----BEGIN CERTIFICATE----- +MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0Lm5ldC9DUFMgaXMgaW5jb3Jw +b3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMWKGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsG +A1UEAxMkRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0 +MloXDTI2MTEyNzIwNTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMu +MTkwNwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSByZWZlcmVu +Y2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNVBAMTJEVudHJ1c3QgUm9v +dCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ALaVtkNC+sZtKm9I35RMOVcF7sN5EUFoNu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYsz +A9u3g3s+IIRe7bJWKKf44LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOww +Cj0Yzfv9KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGIrb68 +j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi94DkZfs0Nw4pgHBN +rziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOBsDCBrTAOBgNVHQ8BAf8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAigA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1 +MzQyWjAfBgNVHSMEGDAWgBRokORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DH +hmak8fdLQ/uEvW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA +A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9tO1KzKtvn1ISM +Y/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6ZuaAGAT/3B+XxFNSRuzFVJ7yVTa +v52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTS +W3iDVuycNsMm4hH2Z0kdkquM++v/eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0 +tHuu2guQOHXvgR1m0vdXcDazv/wor3ElhVsT/h5/WrQ8 +-----END CERTIFICATE----- + +RSA Security 2048 v3 +==================== +-----BEGIN CERTIFICATE----- +MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6MRkwFwYDVQQK +ExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJpdHkgMjA0OCBWMzAeFw0wMTAy +MjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAXBgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAb +BgNVBAsTFFJTQSBTZWN1cml0eSAyMDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC +AQEAt49VcdKA3XtpeafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7 +Jylg/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGlwSMiuLgb +WhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnhAMFRD0xS+ARaqn1y07iH +KrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP ++Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpuAWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/ +MA4GA1UdDwEB/wQEAwIBBjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4E +FgQUB8NRMKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYcHnmY +v/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/Zb5gEydxiKRz44Rj +0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+f00/FGj1EVDVwfSQpQgdMWD/YIwj +VAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVOrSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395 +nzIlQnQFgCi/vcEkllgVsRch6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kA +pKnXwiJPZ9d37CAFYd4= +-----END CERTIFICATE----- + +GeoTrust Global CA +================== +-----BEGIN CERTIFICATE----- +MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVTMRYwFAYDVQQK +Ew1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9iYWwgQ0EwHhcNMDIwNTIxMDQw +MDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEbMBkGA1UEAxMSR2VvVHJ1c3QgR2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEA2swYYzD99BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjo +BbdqfnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDviS2Aelet +8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU1XupGc1V3sjs0l44U+Vc +T4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+bw8HHa8sHo9gOeL6NlMTOdReJivbPagU +vTLrGAMoUgRx5aszPeE4uwc2hGKceeoWMPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTAD +AQH/MB0GA1UdDgQWBBTAephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVk +DBF9qn1luMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKInZ57Q +zxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfStQWVYrmm3ok9Nns4 +d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcFPseKUgzbFbS9bZvlxrFUaKnjaZC2 +mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Unhw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6p +XE0zX5IJL4hmXXeXxx12E6nV5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvm +Mw== +-----END CERTIFICATE----- + +GeoTrust Global CA 2 +==================== +-----BEGIN CERTIFICATE----- +MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwHhcNMDQwMzA0MDUw +MDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5j +LjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDvPE1APRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/ +NTL8Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hLTytCOb1k +LUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL5mkWRxHCJ1kDs6ZgwiFA +Vvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7S4wMcoKK+xfNAGw6EzywhIdLFnopsk/b +HdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQF +MAMBAf8wHQYDVR0OBBYEFHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNH +K266ZUapEBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6tdEPx7 +srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv/NgdRN3ggX+d6Yvh +ZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywNA0ZF66D0f0hExghAzN4bcLUprbqL +OzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkC +x1YAzUm5s2x7UwQa4qjJqhIFI8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqF +H4z1Ir+rzoPz4iIprn2DQKi6bA== +-----END CERTIFICATE----- + +GeoTrust Universal CA +===================== +-----BEGIN CERTIFICATE----- +MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVyc2FsIENBMB4XDTA0MDMwNDA1 +MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IElu +Yy4xHjAcBgNVBAMTFUdlb1RydXN0IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIP +ADCCAgoCggIBAKYVVaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9t +JPi8cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTTQjOgNB0e +RXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFhF7em6fgemdtzbvQKoiFs +7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2vc7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d +8Lsrlh/eezJS/R27tQahsiFepdaVaH/wmZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7V +qnJNk22CDtucvc+081xdVHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3Cga +Rr0BHdCXteGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZf9hB +Z3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfReBi9Fi1jUIxaS5BZu +KGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+nhutxx9z3SxPGWX9f5NAEC7S8O08 +ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0 +XG0D08DYj3rWMB8GA1UdIwQYMBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIB +hjANBgkqhkiG9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc +aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fXIwjhmF7DWgh2 +qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzynANXH/KttgCJwpQzgXQQpAvvL +oJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0zuzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsK +xr2EoyNB3tZ3b4XUhRxQ4K5RirqNPnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxF +KyDuSN/n3QmOGKjaQI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2 +DFKWkoRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9ER/frslK +xfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQtDF4JbAiXfKM9fJP/P6EU +p8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/SfuvmbJxPgWp6ZKy7PtXny3YuxadIwVyQD8vI +P/rmMuGNG2+k5o7Y+SlIis5z/iw= +-----END CERTIFICATE----- + +GeoTrust Universal CA 2 +======================= +-----BEGIN CERTIFICATE----- +MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMN +R2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwHhcNMDQwMzA0 +MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3Qg +SW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUA +A4ICDwAwggIKAoICAQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0 +DE81WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUGFF+3Qs17 +j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdqXbboW0W63MOhBW9Wjo8Q +JqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxLse4YuU6W3Nx2/zu+z18DwPw76L5GG//a +QMJS9/7jOvdqdzXQ2o3rXhhqMcceujwbKNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2 +WP0+GfPtDCapkzj4T8FdIgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP +20gaXT73y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRthAAn +ZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgocQIgfksILAAX/8sgC +SqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4Lt1ZrtmhN79UNdxzMk+MBB4zsslG +8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2 ++/CfXGJx7Tz0RzgQKzAfBgNVHSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8E +BAMCAYYwDQYJKoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z +dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQL1EuxBRa3ugZ +4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgrFg5fNuH8KrUwJM/gYwx7WBr+ +mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSoag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpq +A1Ihn0CoZ1Dy81of398j9tx4TuaYT1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpg +Y+RdM4kX2TGq2tbzGDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiP +pm8m1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJVOCiNUW7d +FGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH6aLcr34YEoP9VhdBLtUp +gn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwXQMAJKOSLakhT2+zNVVXxxvjpoixMptEm +X36vWkzaH6byHCx+rgIW0lbQL1dTR+iS +-----END CERTIFICATE----- + +Visa eCommerce Root +=================== +-----BEGIN CERTIFICATE----- +MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBrMQswCQYDVQQG +EwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2Ug +QXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2 +WhcNMjIwNjI0MDAxNjEyWjBrMQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMm +VmlzYSBJbnRlcm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv +bW1lcmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h2mCxlCfL +F9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4ElpF7sDPwsRROEW+1QK8b +RaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdVZqW1LS7YgFmypw23RuwhY/81q6UCzyr0 +TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI +/k4+oKsGGelT84ATB+0tvz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzs +GHxBvfaLdXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEG +MB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUFAAOCAQEAX/FBfXxc +CLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcRzCSs00Rsca4BIGsDoo8Ytyk6feUW +YFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pz +zkWKsKZJ/0x9nXGIxHYdkFsd7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBu +YQa7FkKMcPcw++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt +398znM/jra6O1I7mT1GvFpLgXPYHDw== +-----END CERTIFICATE----- + +Certum Root CA +============== +-----BEGIN CERTIFICATE----- +MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQK +ExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBDQTAeFw0wMjA2MTExMDQ2Mzla +Fw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBMMRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8u +by4xEjAQBgNVBAMTCUNlcnR1bSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6x +wS7TT3zNJc4YPk/EjG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdL +kKWoePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GIULdtlkIJ +89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapuOb7kky/ZR6By6/qmW6/K +Uz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUgAKpoC6EahQGcxEZjgoi2IrHu/qpGWX7P +NSzVttpd90gzFFS269lvzs2I1qsb2pY7HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkq +hkiG9w0BAQUFAAOCAQEAuI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+ +GXYkHAQaTOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTgxSvg +GrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1qCjqTE5s7FCMTY5w/ +0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5xO/fIR/RpbxXyEV6DHpx8Uq79AtoS +qFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs6GAqm4VKQPNriiTsBhYscw== +-----END CERTIFICATE----- + +Comodo AAA Services root +======================== +-----BEGIN CERTIFICATE----- +MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAw +MFoXDTI4MTIzMTIzNTk1OVowezELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hl +c3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNV +BAMMGEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQuaBtDFcCLNSS1UY8y2bmhG +C1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe3M/vg4aijJRPn2jymJBGhCfHdr/jzDUs +i14HZGWCwEiwqJH5YZ92IFCokcdmtet4YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszW +Y19zjNoFmag4qMsXeDZRrOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjH +Ypy+g8cmez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQUoBEK +Iz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wewYDVR0f +BHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20vQUFBQ2VydGlmaWNhdGVTZXJ2aWNl +cy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29tb2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2Vz +LmNybDANBgkqhkiG9w0BAQUFAAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm +7l3sAg9g1o1QGE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz +Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2G9w84FoVxp7Z +8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsil2D4kF501KKaU73yqWjgom7C +12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg== +-----END CERTIFICATE----- + +Comodo Secure Services root +=========================== +-----BEGIN CERTIFICATE----- +MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAw +MDAwMFoXDTI4MTIzMTIzNTk1OVowfjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFu +Y2hlc3RlcjEQMA4GA1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAi +BgNVBAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPMcm3ye5drswfxdySRXyWP +9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3SHpR7LZQdqnXXs5jLrLxkU0C8j6ysNstc +rbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rC +oznl2yY4rYsK7hljxxwk3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3V +p6ea5EQz6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNVHQ4E +FgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8w +gYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL1NlY3VyZUNlcnRpZmlj +YXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRwOi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlm +aWNhdGVTZXJ2aWNlcy5jcmwwDQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm +4J4oqF7Tt/Q05qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj +Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtIgKvcnDe4IRRL +DXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJaD61JlfutuC23bkpgHl9j6Pw +pCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDlizeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1H +RR3B7Hzs/Sk= +-----END CERTIFICATE----- + +Comodo Trusted Services root +============================ +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEbMBkGA1UECAwS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0Eg +TGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEw +MDAwMDBaFw0yODEyMzEyMzU5NTlaMH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1h +bmNoZXN0ZXIxEDAOBgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUw +IwYDVQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWWfnJSoBVC21ndZHoa0Lh7 +3TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMtTGo87IvDktJTdyR0nAducPy9C1t2ul/y +/9c3S0pgePfw+spwtOpZqqPOSC+pw7ILfhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6 +juljatEPmsbS9Is6FARW1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsS +ivnkBbA7kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0GA1Ud +DgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB +/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21vZG9jYS5jb20vVHJ1c3RlZENlcnRp +ZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRodHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENl +cnRpZmljYXRlU2VydmljZXMuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8Ntw +uleGFTQQuS9/HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32 +pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxISjBc/lDb+XbDA +BHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+xqFx7D+gIIxmOom0jtTYsU0l +R+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/AtyjcndBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O +9y5Xt5hwXsjEeLBi +-----END CERTIFICATE----- + +QuoVadis Root CA +================ +-----BEGIN CERTIFICATE----- +MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJCTTEZMBcGA1UE +ChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0 +eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAz +MTkxODMzMzNaFw0yMTAzMTcxODMzMzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRp +cyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQD +EyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Ypli4kVEAkOPcahdxYTMuk +J0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2DrOpm2RgbaIr1VxqYuvXtdj182d6UajtL +F8HVj71lODqV0D1VNk7feVcxKh7YWWVJWCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeL +YzcS19Dsw3sgQUSj7cugF+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWen +AScOospUxbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCCAk4w +PQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVvdmFkaXNvZmZzaG9y +ZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREwggENMIIBCQYJKwYBBAG+WAABMIH7 +MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNlIG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmlj +YXRlIGJ5IGFueSBwYXJ0eSBhc3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJs +ZSBzdGFuZGFyZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh +Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYIKwYBBQUHAgEW +Fmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3TKbkGGew5Oanwl4Rqy+/fMIGu +BgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rqy+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkw +FwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MS4wLAYDVQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6 +tlCLMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSkfnIYj9lo +fFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf87C9TqnN7Az10buYWnuul +LsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1RcHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2x +gI4JVrmcGmD+XcHXetwReNDWXcG31a0ymQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi +5upZIof4l/UO/erMkqQWxFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi +5nrQNiOKSnQ2+Q== +-----END CERTIFICATE----- + +QuoVadis Root CA 2 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +QuoVadis Root CA 3 +================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Security Communication Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +HhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMP +U0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw +8yl89f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJDKaVv0uM +DPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9Ms+k2Y7CI9eNqPPYJayX +5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/NQV3Is00qVUarH9oe4kA92819uZKAnDfd +DJZkndwi92SL32HeFZRSFaB9UslLqCHJxrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2 +JChzAgMBAAGjPzA9MB0GA1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYw +DwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vGkl3g +0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfrUj94nK9NrvjVT8+a +mCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5Bw+SUEmK3TGXX8npN6o7WWWXlDLJ +s58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJUJRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ +6rBK+1YWc26sTfcioU+tHXotRSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAi +FL39vmwLAw== +-----END CERTIFICATE----- + +Sonera Class 2 Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEPMA0GA1UEChMG +U29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAxMDQwNjA3Mjk0MFoXDTIxMDQw +NjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNVBAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJh +IENsYXNzMiBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3 +/Ei9vX+ALTU74W+oZ6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybT +dXnt5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s3TmVToMG +f+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2EjvOr7nQKV0ba5cTppCD8P +tOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu8nYybieDwnPz3BjotJPqdURrBGAgcVeH +nfO+oJAjPYok4doh28MCAwEAAaMzMDEwDwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITT +XjwwCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt +0jSv9zilzqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/3DEI +cbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvDFNr450kkkdAdavph +Oe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6Tk6ezAyNlNzZRZxe7EJQY670XcSx +EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH +llpwrN9M +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA +============================= +-----BEGIN CERTIFICATE----- +MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE +ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w +HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh +bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt +vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P +jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca +C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth +vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6 +22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV +HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v +dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN +BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR +EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw +MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y +nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR +iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw== +-----END CERTIFICATE----- + +UTN USERFirst Hardware Root CA +============================== +-----BEGIN CERTIFICATE----- +MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCBlzELMAkGA1UE +BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl +IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAd +BgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgx +OTIyWjCBlzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0 +eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz +ZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdhcmUwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlI +wrthdBKWHTxqctU8EGc6Oe0rE81m65UJM6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFd +tqdt++BxF2uiiPsA3/4aMXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8 +i4fDidNdoI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqIDsjf +Pe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9KsyoUhbAgMBAAGjgbkw +gbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFKFyXyYbKJhDlV0HN9WF +lp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNF +UkZpcnN0LUhhcmR3YXJlLmNybDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUF +BwMGBggrBgEFBQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM +//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28GpgoiskliCE7/yMgUsogW +XecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gECJChicsZUN/KHAG8HQQZexB2 +lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kn +iCrVWFCVH/A7HFe7fRQ5YiuayZSSKqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67 +nfhmqA== +-----END CERTIFICATE----- + +Camerfirma Chambers of Commerce Root +==================================== +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAx +NjEzNDNaFw0zNzA5MzAxNjEzNDRaMH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZp +cm1hIFNBIENJRiBBODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3Jn +MSIwIAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0BAQEFAAOC +AQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtbunXF/KGIJPov7coISjlU +xFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0dBmpAPrMMhe5cG3nCYsS4No41XQEMIwRH +NaqbYE6gZj3LJgqcQKH0XZi/caulAGgq7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jW +DA+wWFjbw2Y3npuRVDM30pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFV +d9oKDMyXroDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIGA1Ud +EwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5jaGFtYmVyc2lnbi5v +cmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p26EpW1eLTXYGduHRooowDgYDVR0P +AQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hh +bWJlcnNpZ24ub3JnMCcGA1UdEgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYD +VR0gBFEwTzBNBgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz +aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEBAAxBl8IahsAi +fJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZdp0AJPaxJRUXcLo0waLIJuvvD +L8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wN +UPf6s+xCX6ndbcj0dc97wXImsQEcXCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/n +ADydb47kMgkdTXg0eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1 +erfutGWaIZDgqtCYvDi1czyL+Nw= +-----END CERTIFICATE----- + +Camerfirma Global Chambersign Root +================================== +-----BEGIN CERTIFICATE----- +MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMe +QUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1i +ZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYx +NDE4WhcNMzcwOTMwMTYxNDE4WjB9MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJt +YSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEg +MB4GA1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUAA4IBDQAw +ggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0Mi+ITaFgCPS3CU6gSS9J +1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/sQJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8O +by4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpVeAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl +6DJWk0aJqCWKZQbua795B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c +8lCrEqWhz0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0TAQH/ +BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1iZXJzaWduLm9yZy9j +aGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4wTcbOX60Qq+UDpfqpFDAOBgNVHQ8B +Af8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAHMCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBj +aGFtYmVyc2lnbi5vcmcwKgYDVR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9y +ZzBbBgNVHSAEVDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh +bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0BAQUFAAOCAQEA +PDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUMbKGKfKX0j//U2K0X1S0E0T9Y +gOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXiryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJ +PJ7oKXqJ1/6v/2j1pReQvayZzKWGVwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4 +IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes +t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A== +-----END CERTIFICATE----- + +NetLock Notary (Class A) Root +============================= +-----BEGIN CERTIFICATE----- +MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI +EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6 +dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j +ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX +DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH +EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD +VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz +cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM +D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ +z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC +/tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7 +tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6 +4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG +A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC +Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv +bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu +IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn +LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0 +ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz +IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh +IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu +b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh +bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg +Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp +bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5 +ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP +ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB +CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr +KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM +8CgHrTwXZoi1/baI +-----END CERTIFICATE----- + +XRamp Global CA Root +==================== +-----BEGIN CERTIFICATE----- +MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UE +BhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2Vj +dXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDQxMTAxMTcxNDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMx +HjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkg +U2VydmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS638eMpSe2OAtp87ZOqCwu +IR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCPKZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMx +foArtYzAQDsRhtDLooY2YKTVMIJt2W7QDxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FE +zG+gSqmUsE3a56k0enI4qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqs +AxcZZPRaJSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNViPvry +xS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASsjVy16bYbMDYGA1UdHwQvMC0wK6Ap +oCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMC +AQEwDQYJKoZIhvcNAQEFBQADggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc +/Kh4ZzXxHfARvbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt +qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLaIR9NmXmd4c8n +nxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSyi6mx5O+aGtA9aZnuqCij4Tyz +8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQO+7ETPTsJ3xCwnR8gooJybQDJbw= +-----END CERTIFICATE----- + +Go Daddy Class 2 CA +=================== +-----BEGIN CERTIFICATE----- +MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMY +VGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkG +A1UEBhMCVVMxITAfBgNVBAoTGFRoZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28g +RGFkZHkgQ2xhc3MgMiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQAD +ggENADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCAPVYYYwhv +2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6wwdhFJ2+qN1j3hybX2C32 +qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXiEqITLdiOr18SPaAIBQi2XKVlOARFmR6j +YGB0xUGlcmIbYsUfb18aQr4CUWWoriMYavx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmY +vLEHZ6IVDd2gWMZEewo+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0O +BBYEFNLEsNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h/t2o +atTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMu +MTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwG +A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wim +PQoZ+YeAEW5p5JYXMP80kWNyOO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKt +I3lpjbi2Tc7PTMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ +HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mERdEr/VxqHD3VI +Ls9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5CufReYNnyicsbkqWletNw+vHX/b +vZ8= +-----END CERTIFICATE----- + +Starfield Class 2 CA +==================== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzElMCMGA1UEChMc +U3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZpZWxkIENsYXNzIDIg +Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQwNjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBo +MQswCQYDVQQGEwJVUzElMCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAG +A1UECxMpU3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqG +SIb3DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf8MOh2tTY +bitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN+lq2cwQlZut3f+dZxkqZ +JRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVm +epsZGD3/cVE8MC5fvj13c7JdBmzDI1aaK4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSN +F4Azbl5KXZnJHoe0nRrA1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HF +MIHCMB0GA1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fRzt0f +hvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNo +bm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24g +QXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGs +afPzWdqbAYcaT1epoXkJKtv3L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLM +PUxA2IGvd56Deruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl +xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynpVSJYACPq4xJD +KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3 +QBFGmh95DmK/D5fs4C8fF5Q= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM2WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE +FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9jZXJ0LnN0YXJ0 +Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3JsLnN0YXJ0Y29tLm9yZy9zZnNj +YS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFMBgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUH +AgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRw +Oi8vY2VydC5zdGFydGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYg +U3RhcnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlhYmlsaXR5 +LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2YgdGhlIFN0YXJ0Q29tIENl +cnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFpbGFibGUgYXQgaHR0cDovL2NlcnQuc3Rh +cnRjb20ub3JnL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilT +dGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOC +AgEAFmyZ9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8jhvh +3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUWFjgKXlf2Ysd6AgXm +vB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJzewT4F+irsfMuXGRuczE6Eri8sxHk +fY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3 +fsNrarnDy0RLrHiQi+fHLB5LEUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZ +EoalHmdkrQYuL6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq +yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuCO3NJo2pXh5Tl +1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6Vum0ABj6y6koQOdjQK/W/7HW/ +lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkyShNOsF/5oirpt9P/FlUQqmMGqz9IgcgA38coro +g14= +-----END CERTIFICATE----- + +Taiwan GRCA +=========== +-----BEGIN CERTIFICATE----- +MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/MQswCQYDVQQG +EwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4X +DTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1owPzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dv +dmVybm1lbnQgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qN +w8XRIePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1qgQdW8or5 +BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKyyhwOeYHWtXBiCAEuTk8O +1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAtsF/tnyMKtsc2AtJfcdgEWFelq16TheEfO +htX7MfP6Mb40qij7cEwdScevLJ1tZqa2jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wov +J5pGfaENda1UhhXcSTvxls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7 +Q3hub/FCVGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHKYS1t +B6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoHEgKXTiCQ8P8NHuJB +O9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThNXo+EHWbNxWCWtFJaBYmOlXqYwZE8 +lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1UdDgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNV +HRMEBTADAQH/MDkGBGcqBwAEMTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg2 +09yewDL7MTqKUWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ +TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyfqzvS/3WXy6Tj +Zwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaKZEk9GhiHkASfQlK3T8v+R0F2 +Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFEJPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlU +D7gsL0u8qV1bYH+Mh6XgUmMqvtg7hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6Qz +DxARvBMB1uUO07+1EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+Hbk +Z6MmnD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WXudpVBrkk +7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44VbnzssQwmSNOXfJIoRIM3BKQ +CZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDeLMDDav7v3Aun+kbfYNucpllQdSNpc5Oy ++fwC00fmcc4QAu4njIT/rEUNE1yDMuAlpYYsfPQS +-----END CERTIFICATE----- + +Swisscom Root CA 1 +================== +-----BEGIN CERTIFICATE----- +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 +NY6E0F/6MBr1mmz0DlP5OlvRHA== +-----END CERTIFICATE----- + +DigiCert Assured ID Root CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzEx +MTEwMDAwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0Ew +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7cJpSIqvTO +9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYPmDI2dsze3Tyoou9q+yHy +UmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW +/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpy +oeb6pNnVFzF1roV9Iq4/AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whf +GHdPAgMBAAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRF +66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYunpyGd823IDzANBgkq +hkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRCdWKuh+vy1dneVrOfzM4UKLkNl2Bc +EkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTffwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38Fn +SbNd67IJKusm7Xi+fT8r87cmNW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i +8b5QZ7dsvfPxH2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe ++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g== +-----END CERTIFICATE----- + +DigiCert Global Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBDQTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAw +MDAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsBCSDMAZOn +TjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97nh6Vfe63SKMI2tavegw5 +BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt43C/dxC//AH2hdmoRBBYMql1GNXRor5H +4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7PT19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y +7vrTC0LUq7dBMtoM1O/4gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQAB +o2MwYTAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbRTLtm +8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUwDQYJKoZIhvcNAQEF +BQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/EsrhMAtudXH/vTBH1jLuG2cenTnmCmr +EbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIt +tep3Sp+dWOIrWcBAI+0tKIJFPnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886 +UAb3LujEV0lsYSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk +CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= +-----END CERTIFICATE----- + +DigiCert High Assurance EV Root CA +================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBsMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSsw +KQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5jZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAw +MFoXDTMxMTExMDAwMDAwMFowbDELMAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZ +MBcGA1UECxMQd3d3LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFu +Y2UgRVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm+9S75S0t +Mqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTWPNt0OKRKzE0lgvdKpVMS +OO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEMxChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3 +MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFBIk5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQ +NAQTXKFx01p8VdteZOE3hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUe +h10aUAsgEsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMB +Af8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaAFLE+w2kD+L9HAdSY +JhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3NecnzyIZgYIVyHbIUf4KmeqvxgydkAQ +V8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6zeM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFp +myPInngiK3BD41VHMWEZ71jFhS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkK +mNEVX58Svnw2Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe +vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep+OkuE6N36B9K +-----END CERTIFICATE----- + +Certplus Class 2 Primary CA +=========================== +-----BEGIN CERTIFICATE----- +MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAwPTELMAkGA1UE +BhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFzcyAyIFByaW1hcnkgQ0EwHhcN +OTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2Vy +dHBsdXMxGzAZBgNVBAMTEkNsYXNzIDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEP +ADCCAQoCggEBANxQltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR +5aiRVhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyLkcAbmXuZ +Vg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCdEgETjdyAYveVqUSISnFO +YFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yasH7WLO7dDWWuwJKZtkIvEcupdM5i3y95e +e++U8Rs+yskhwcWYAqqi9lt3m/V+llU0HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRME +CDAGAQH/AgEKMAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJ +YIZIAYb4QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMuY29t +L0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/AN9WM2K191EBkOvD +P9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8yfFC82x/xXp8HVGIutIKPidd3i1R +TtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMRFcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+ +7UCmnYR0ObncHoUW2ikbhiMAybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW +//1IMwrh3KWBkJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7 +l7+ijrRU +-----END CERTIFICATE----- + +DST Root CA X3 +============== +-----BEGIN CERTIFICATE----- +MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/MSQwIgYDVQQK +ExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMTDkRTVCBSb290IENBIFgzMB4X +DTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVowPzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1 +cmUgVHJ1c3QgQ28uMRcwFQYDVQQDEw5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmT +rE4Orz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEqOLl5CjH9 +UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9bxiqKqy69cK3FCxolkHRy +xXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40d +utolucbY38EVAjqr2m7xPi71XAicPNaDaeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQ +MA0GCSqGSIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69ikug +dB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXrAvHRAosZy5Q6XkjE +GB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZzR8srzJmwN0jP41ZL9c8PDHIyh8bw +RLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubS +fZGL+T0yjWW06XyxV3bqxbYoOb8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ +-----END CERTIFICATE----- + +DST ACES CA X6 +============== +-----BEGIN CERTIFICATE----- +MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBbMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QxETAPBgNVBAsTCERTVCBBQ0VT +MRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0wMzExMjAyMTE5NThaFw0xNzExMjAyMTE5NTha +MFsxCzAJBgNVBAYTAlVTMSAwHgYDVQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UE +CxMIRFNUIEFDRVMxFzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPuktKe1jzI +DZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7gLFViYsx+tC3dr5BPTCa +pCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZHfAjIgrrep4c9oW24MFbCswKBXy314pow +GCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4aahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPy +MjwmR/onJALJfh1biEITajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1Ud +EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rkc3Qu +Y29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjtodHRwOi8vd3d3LnRy +dXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMtaW5kZXguaHRtbDAdBgNVHQ4EFgQU +CXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZIhvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V2 +5FYrnJmQ6AgwbN99Pe7lv7UkQIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6t +Fr8hlxCBPeP/h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq +nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpRrscL9yuwNwXs +vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3 +oKfN5XozNmr6mis= +-----END CERTIFICATE----- + +SwissSign Gold CA - G2 +====================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +SwissSign Silver CA - G2 +======================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority +======================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQG +EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMoR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjExMjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgx +CzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQ +cmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9AWbK7hWN +b6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjAZIVcFU2Ix7e64HXprQU9 +nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE07e9GceBrAqg1cmuXm2bgyxx5X9gaBGge +RwLmnWDiNpcB3841kt++Z8dtd1k7j53WkBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGt +tm/81w7a4DSwDRp35+MImO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJKoZI +hvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ16CePbJC/kRYkRj5K +Ts4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl4b7UVXGYNTq+k+qurUKykG/g/CFN +NWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6KoKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHa +Floxt/m0cYASSJlyc1pZU8FjUjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG +1riR/aYNKxoUAT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk= +-----END CERTIFICATE----- + +thawte Primary Root CA +====================== +-----BEGIN CERTIFICATE----- +MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCBqTELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3 +MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwg +SW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMv +KGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNVBAMT +FnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCs +oPD7gFnUnMekz52hWXMJEEUMDSxuaPFsW0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ +1CRfBsDMRJSUjQJib+ta3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGc +q/gcfomk6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6Sk/K +aAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94JNqR32HuHUETVPm4p +afs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYD +VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XPr87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUF +AAOCAQEAeRHAS7ORtvzw6WfUDW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeE +uzLlQRHAd9mzYJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX +xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2/qxAeeWsEG89 +jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/LHbTY5xZ3Y+m4Q6gLkH3LpVH +z7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7jVaMaA== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G5 +============================================================ +-----BEGIN CERTIFICATE----- +MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCByjELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRp +ZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCB +yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2ln +biBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2lnbiwgSW5jLiAtIEZvciBh +dXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmlt +YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQCvJAgIKXo1nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKz +j/i5Vbext0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIzSdhD +Y2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQGBO+QueQA5N06tRn/ +Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+rCpSx4/VBEnkjWNHiDxpg8v+R70r +fk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/ +BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2Uv +Z2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy +aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKvMzEzMA0GCSqG +SIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzEp6B4Eq1iDkVwZMXnl2YtmAl+ +X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKE +KQsTb47bDN0lAtukixlE0kF6BWlKWE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiC +Km0oHw0LxOXnGiYZ4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vE +ZV8NhnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq +-----END CERTIFICATE----- + +SecureTrust CA +============== +-----BEGIN CERTIFICATE----- +MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBIMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xFzAVBgNVBAMTDlNlY3VyZVRy +dXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIzMTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAe +BgNVBAoTF1NlY3VyZVRydXN0IENvcnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCC +ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQX +OZEzZum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO0gMdA+9t +DWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIaowW8xQmxSPmjL8xk037uH +GFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b +01k/unK8RCSc43Oz969XL0Imnal0ugBS8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmH +ursCAwEAAaOBnTCBmjATBgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/ +BAUwAwEB/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCegJYYj +aHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt36Z3q059c4EVlew3KW+JwULKUBRSu +SceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHf +mbx8IVQr5Fiiu1cprp6poxkmD5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZ +nMUFdAvnZyPSCPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR +3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE= +-----END CERTIFICATE----- + +Secure Global CA +================ +-----BEGIN CERTIFICATE----- +MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQG +EwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBH +bG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkxMjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEg +MB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwg +Q0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jx +YDiJiQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa/FHtaMbQ +bqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJjnIFHovdRIWCQtBJwB1g +8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnIHmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYV +HDGA76oYa8J719rO+TMg1fW9ajMtgQT7sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi +0XPnj3pDAgMBAAGjgZ0wgZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCswKaAn +oCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsGAQQBgjcVAQQDAgEA +MA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0LURYD7xh8yOOvaliTFGCRsoTciE6+ +OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXOH0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cn +CDpOGR86p1hcF895P4vkp9MmI50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/5 +3CYNv6ZHdAbYiNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc +f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW +-----END CERTIFICATE----- + +COMODO Certification Authority +============================== +-----BEGIN CERTIFICATE----- +MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCBgTELMAkGA1UE +BhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgG +A1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNVBAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1 +dGhvcml0eTAeFw0wNjEyMDEwMDAwMDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEb +MBkGA1UECBMSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3UcEbVASY06m/weaKXTuH ++7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI2GqGd0S7WWaXUF601CxwRM/aN5VCaTww +xHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV +4EajcNxo2f8ESIl33rXp+2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA +1KGzqSX+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5OnKVI +rLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW/zAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6gPKA6hjhodHRwOi8vY3JsLmNvbW9k +b2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9uQXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOC +AQEAPpiem/Yb6dc5t3iuHXIYSdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CP +OGEIqB6BCsAvIC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/ +RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4zJVSk/BwJVmc +IGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5ddBA6+C4OmF4O5MBKgxTMVBbkN ++8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IBZQ== +-----END CERTIFICATE----- + +Network Solutions Certificate Authority +======================================= +-----BEGIN CERTIFICATE----- +MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBiMQswCQYDVQQG +EwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydOZXR3b3Jr +IFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMx +MjM1OTU5WjBiMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu +MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwzc7MEL7xx +jOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPPOCwGJgl6cvf6UDL4wpPT +aaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rlmGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXT +crA/vGp97Eh/jcOrqnErU2lBUzS1sLnFBgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc +/Qzpf14Dl847ABSHJ3A4qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMB +AAGjgZcwgZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwubmV0c29sc3NsLmNv +bS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3JpdHkuY3JsMA0GCSqGSIb3DQEBBQUA +A4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc86fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q +4LqILPxFzBiwmZVRDuwduIj/h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/ +GGUsyfJj4akH/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv +wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHNpGxlaKFJdlxD +ydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey +-----END CERTIFICATE----- + +WellsSecure Public Root Certificate Authority +============================================= +-----BEGIN CERTIFICATE----- +MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoM +F1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYw +NAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcN +MDcxMjEzMTcwNzU0WhcNMjIxMjE0MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dl +bGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYD +VQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+rWxxTkqxtnt3CxC5FlAM1 +iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjUDk/41itMpBb570OYj7OeUt9tkTmPOL13 +i0Nj67eT/DBMHAGTthP796EfvyXhdDcsHqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8 +bJVhHlfXBIEyg1J55oNjz7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiB +K0HmOFafSZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/SlwxlAgMB +AAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqGKGh0dHA6Ly9jcmwu +cGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0PAQH/BAQDAgHGMB0GA1UdDgQWBBQm +lRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0jBIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGB +i6SBiDCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRww +GgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEBALkVsUSRzCPI +K0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd/ZDJPHV3V3p9+N701NX3leZ0 +bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pBA4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSlj +qHyita04pO2t/caaH/+Xc/77szWnk4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+es +E2fDbbFwRnzVlhE9iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJ +tylv2G0xffX8oRAHh84vWdw+WNs= +-----END CERTIFICATE----- + +COMODO ECC Certification Authority +================================== +-----BEGIN CERTIFICATE----- +MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTELMAkGA1UEBhMC +R0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UE +ChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBB +dXRob3JpdHkwHhcNMDgwMzA2MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0Ix +GzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRo +b3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSRFtSrYpn1PlILBs5BAH+X +4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0JcfRK9ChQtP6IHG4/bC8vCVlbpVsLM5ni +wz2J+Wos77LTBumjQjBAMB0GA1UdDgQWBBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8E +BAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VG +FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA +U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY= +-----END CERTIFICATE----- + +IGC/A +===== +-----BEGIN CERTIFICATE----- +MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYTAkZSMQ8wDQYD +VQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVE +Q1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZy +MB4XDTAyMTIxMzE0MjkyM1oXDTIwMTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQI +EwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NT +STEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaIs9z4iPf930Pfeo2aSVz2 +TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCW +So7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYy +HF2fYPepraX/z9E0+X1bF8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNd +frGoRpAxVs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGdPDPQ +tQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNVHSAEDjAMMAoGCCqB +egF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAxNjAfBgNVHSMEGDAWgBSjBS8YYFDC +iQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUFAAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RK +q89toB9RlPhJy3Q2FLwV3duJL92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3Q +MZsyK10XZZOYYLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg +Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2aNjSaTFR+FwNI +lQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R0982gaEbeC9xs/FZTEYYKKuF +0mBWWg== +-----END CERTIFICATE----- + +Security Communication EV RootCA1 +================================= +-----BEGIN CERTIFICATE----- +MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMhU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIzMloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UE +BhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNl +Y3VyaXR5IENvbW11bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSERMqm4miO +/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gOzXppFodEtZDkBp2uoQSX +WHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4z +ZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDFMxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4 +bepJz11sS6/vmsJWXMY1VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK +9U2vP9eCOKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqG +SIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HWtWS3irO4G8za+6xm +iEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZq51ihPZRwSzJIxXYKLerJRO1RuGG +Av8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDbEJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnW +mHyojf6GPgcWkuF75x3sM3Z+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEW +T1MKZPlO9L9OVL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490 +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GA CA +=============================== +-----BEGIN CERTIFICATE----- +MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE +BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG +A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH +bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD +VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw +IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5 +IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9 +Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg +Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD +d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ +/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R +LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw +AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ +KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm +MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4 ++vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa +hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY +okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0= +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA +========================= +-----BEGIN CERTIFICATE----- +MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAwcjELMAkGA1UE +BhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNyb3NlYyBMdGQuMRQwEgYDVQQL +EwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9zZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0 +MDYxMjI4NDRaFw0xNzA0MDYxMjI4NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVz +dDEWMBQGA1UEChMNTWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMT +GU1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB +AQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2uuO/TEdyB5s87lozWbxXG +d36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/N +oqdNAoI/gqyFxuEPkEeZlApxcpMqyabAvjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjc +QR/Ji3HWVBTji1R4P770Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJ +PqW+jqpx62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcBAQRb +MFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3AwLQYIKwYBBQUHMAKG +IWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAPBgNVHRMBAf8EBTADAQH/MIIBcwYD +VR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIBAQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3 +LmUtc3ppZ25vLmh1L1NaU1ovMIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0A +dAB2AOEAbgB5ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn +AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABTAHoAbwBsAGcA +4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABhACAAcwB6AGUAcgBpAG4AdAAg +AGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABoAHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMA +egBpAGcAbgBvAC4AaAB1AC8AUwBaAFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6 +Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NO +PU1pY3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxPPU1pY3Jv +c2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZvY2F0aW9uTGlzdDtiaW5h +cnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuBEGluZm9AZS1zemlnbm8uaHWkdzB1MSMw +IQYDVQQDDBpNaWNyb3NlYyBlLVN6aWduw7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhT +WjEWMBQGA1UEChMNTWljcm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhV +MIGsBgNVHSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJIVTER +MA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDASBgNVBAsTC2UtU3pp +Z25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBSb290IENBghEAzLjnv04pGv2i3Gal +HCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMT +nGZjWS7KXHAM/IO8VbH0jgdsZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FE +aGAHQzAxQmHl7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a +86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfRhUZLphK3dehK +yVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/MPMMNz7UwiiAc7EBt51alhQB +S6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU= +-----END CERTIFICATE----- + +Certigna +======== +-----BEGIN CERTIFICATE----- +MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNVBAYTAkZSMRIw +EAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4XDTA3MDYyOTE1MTMwNVoXDTI3 +MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwI +Q2VydGlnbmEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7q +XOEm7RFHYeGifBZ4QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyH +GxnygQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbwzBfsV1/p +ogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q130yGLMLLGq/jj8UEYkg +DncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKf +Irjxwo1p3Po6WAbfAgMBAAGjgbwwgbkwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQ +tCRZvgHyUtVF9lo53BEwZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJ +BgNVBAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzjAQ/J +SP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG9w0BAQUFAAOCAQEA +hQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8hbV6lUmPOEvjvKtpv6zf+EwLHyzs+ +ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFncfca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1klu +PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY +1gkIl2PlwS6wt0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw +WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg== +-----END CERTIFICATE----- + +Deutsche Telekom Root CA 2 +========================== +-----BEGIN CERTIFICATE----- +MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMT +RGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEG +A1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENBIDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5 +MjM1OTAwWjBxMQswCQYDVQQGEwJERTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0G +A1UECxMWVC1UZWxlU2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBS +b290IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEUha88EOQ5 +bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhCQN/Po7qCWWqSG6wcmtoI +KyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1MjwrrFDa1sPeg5TKqAyZMg4ISFZbavva4VhY +AUlfckE8FQYBjl2tqriTtM2e66foai1SNNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aK +Se5TBY8ZTNXeWHmb0mocQqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTV +jlsB9WoHtxa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAPBgNV +HRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAlGRZrTlk5ynr +E/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756AbrsptJh6sTtU6zkXR34ajgv8HzFZMQSy +zhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpaIzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8 +rZ7/gFnkm0W09juwzTkZmDLl6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4G +dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU +Cm26OWMohpLzGITY+9HPBVZkVw== +-----END CERTIFICATE----- + +Cybertrust Global Root +====================== +-----BEGIN CERTIFICATE----- +MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYGA1UEChMPQ3li +ZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBSb290MB4XDTA2MTIxNTA4 +MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQD +ExZDeWJlcnRydXN0IEdsb2JhbCBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA ++Mi8vRRQZhP/8NN57CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW +0ozSJ8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2yHLtgwEZL +AfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iPt3sMpTjr3kfb1V05/Iin +89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNzFtApD0mpSPCzqrdsxacwOUBdrsTiXSZT +8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAYXSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2 +MDSgMqAwhi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3JsMB8G +A1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUAA4IBAQBW7wojoFRO +lZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMjWqd8BfP9IjsO0QbE2zZMcwSO5bAi +5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUxXOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2 +hO0j9n0Hq0V+09+zv+mKts2oomcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+T +X3EJIrduPuocA06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW +WL1WMRJOEcgh4LMRkWXbtKaIOM5V +-----END CERTIFICATE----- + +ePKI Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBeMQswCQYDVQQG +EwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0ZC4xKjAoBgNVBAsMIWVQS0kg +Um9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMx +MjdaMF4xCzAJBgNVBAYTAlRXMSMwIQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEq +MCgGA1UECwwhZVBLSSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0B +AQEFAAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAHSyZbCUNs +IZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAhijHyl3SJCRImHJ7K2RKi +lTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3XDZoTM1PRYfl61dd4s5oz9wCGzh1NlDiv +qOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX +12ruOzjjK9SXDrkb5wdJfzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0O +WQqraffAsgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uUWH1+ +ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLSnT0IFaUQAS2zMnao +lQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pHdmX2Os+PYhcZewoozRrSgx4hxyy/ +vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJipNiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXi +Zo1jDiVN1Rmy5nk3pyKdVDECAwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/Qkqi +MAwGA1UdEwQFMAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH +ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGBuvl2ICO1J2B0 +1GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6YlPwZpVnPDimZI+ymBV3QGypzq +KOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkPJXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdV +xrsStZf0X4OFunHB2WyBEXYKCrC/gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEP +NXubrjlpC2JgQCA2j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+r +GNm65ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUBo2M3IUxE +xJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS/jQ6fbjpKdx2qcgw+BRx +gMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2zGp1iro2C6pSe3VkQw63d4k3jMdXH7Ojy +sP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTEW9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmOD +BCEIZ43ygknQW/2xzQ+DhNQ+IIX3Sj0rnP0qCglN6oH4EZw= +-----END CERTIFICATE----- + +T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3 +============================================================================================================================= +-----BEGIN CERTIFICATE----- +MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRSMRgwFgYDVQQH +DA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJpbGltc2VsIHZlIFRla25vbG9q +aWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSwVEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ry +b25payB2ZSBLcmlwdG9sb2ppIEFyYcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNV +BAsMGkthbXUgU2VydGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUg +S8O2ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAeFw0wNzA4 +MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIxGDAWBgNVBAcMD0dlYnpl +IC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmlsaW1zZWwgdmUgVGVrbm9sb2ppayBBcmHF +n3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBUQUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZl +IEtyaXB0b2xvamkgQXJhxZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2Ft +dSBTZXJ0aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7ZrIFNl +cnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4hgb46ezzb8R1Sf1n68yJMlaCQvEhO +Eav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yKO7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1 +xnnRFDDtG1hba+818qEhTsXOfJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR +6Oqeyjh1jmKwlZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL +hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQIDAQABo0IwQDAd +BgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF +MAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmPNOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4 +N5EY3ATIZJkrGG2AA1nJrvhY0D7twyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLT +y9LQQfMmNkqblWwM7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYh +LBOhgLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5noN+J1q2M +dqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUsyZyQ2uypQjyttgI= +-----END CERTIFICATE----- + +Buypass Class 2 CA 1 +==================== +-----BEGIN CERTIFICATE----- +MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMiBDQSAxMB4XDTA2 +MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh +c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7M +cXA0ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLXl18xoS83 +0r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVBHfCuuCkslFJgNJQ72uA4 +0Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/R +uFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0P +AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLPgcIV +1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+DKhQ7SLHrQVMdvvt +7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKuBctN518fV4bVIJwo+28TOPX2EZL2 +fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w +wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho +-----END CERTIFICATE----- + +EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 +========================================================================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +certSIGN ROOT CA +================ +-----BEGIN CERTIFICATE----- +MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYTAlJPMREwDwYD +VQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTAeFw0wNjA3MDQxNzIwMDRa +Fw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UE +CxMQY2VydFNJR04gUk9PVCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7I +JUqOtdu0KBuqV5Do0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHH +rfAQUySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5dRdY4zTW2 +ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQOA7+j0xbm0bqQfWwCHTD +0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwvJoIQ4uNllAoEwF73XVv4EOLQunpL+943 +AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8B +Af8EBAMCAcYwHQYDVR0OBBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IB +AQA+0hyJLjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecYMnQ8 +SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ44gx+FkagQnIl6Z0 +x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6IJd1hJyMctTEHBDa0GpC9oHRxUIlt +vBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNwi/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7Nz +TogVZ96edhBiIL5VaZVDADlN9u6wWk5JRFRYX0KD +-----END CERTIFICATE----- + +CNNIC ROOT +========== +-----BEGIN CERTIFICATE----- +MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJDTjEOMAwGA1UE +ChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2MDcwOTE0WhcNMjcwNDE2MDcw +OTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1Qw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzD +o+/hn7E7SIX1mlwhIhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tiz +VHa6dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZOV/kbZKKT +VrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrCGHn2emU1z5DrvTOTn1Or +czvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gNv7Sg2Ca+I19zN38m5pIEo3/PIKe38zrK +y5nLAgMBAAGjczBxMBEGCWCGSAGG+EIBAQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscC +wQ7vptU7ETAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991S +lgrHAsEO76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnKOOK5 +Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvHugDnuL8BV8F3RTIM +O/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7HgviyJA/qIYM/PmLXoXLT1tLYhFHxUV8 +BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fLbuXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2 +G8kS1sHNzYDzAgE8yGnLRUhj2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5m +mxE= +-----END CERTIFICATE----- + +ApplicationCA - Japanese Government +=================================== +-----BEGIN CERTIFICATE----- +MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEcMBoGA1UEChMT +SmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRpb25DQTAeFw0wNzEyMTIxNTAw +MDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYTAkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zl +cm5tZW50MRYwFAYDVQQLEw1BcHBsaWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAp23gdE6Hj6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4 +fl+Kf5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55IrmTwcrN +wVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cwFO5cjFW6WY2H/CPek9AE +jP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDihtQWEjdnjDuGWk81quzMKq2edY3rZ+nYVu +nyoKb58DKTCXKB28t89UKU5RMfkntigm/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRU +WssmP3HMlEYNllPqa0jQk/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNV +BAYTAkpQMRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOCseOD +vOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBADlqRHZ3ODrs +o2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJhyzjVOGjprIIC8CFqMjSnHH2HZ9g +/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYD +io+nEhEMy/0/ecGc/WLuo89UDNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmW +dupwX3kSa+SjB1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL +rosot4LKGAfmt1t06SAZf7IbiVQ= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G3 +============================================= +-----BEGIN CERTIFICATE----- +MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UE +BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA4IEdlb1RydXN0 +IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFy +eSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIz +NTk1OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAo +YykgMjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMT +LUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz+uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5j +K/BGvESyiaHAKAxJcCGVn2TAppMSAmUmhsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdE +c5IiaacDiGydY8hS2pgn5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3C +IShwiP/WJmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exALDmKu +dlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZChuOl1UcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMR5yo6hTgMdHNxr +2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IBAQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9 +cr5HqQ6XErhK8WTTOd8lNNTBzU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbE +Ap7aDHdlDkQNkv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD +AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUHSJsMC8tJP33s +t/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2Gspki4cErx5z481+oghLrGREt +-----END CERTIFICATE----- + +thawte Primary Root CA - G2 +=========================== +-----BEGIN CERTIFICATE----- +MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDELMAkGA1UEBhMC +VVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMpIDIwMDcgdGhhd3RlLCBJbmMu +IC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3Qg +Q0EgLSBHMjAeFw0wNzExMDUwMDAwMDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEV +MBMGA1UEChMMdGhhd3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBG +b3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAt +IEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/BebfowJPDQfGAFG6DAJS +LSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6papu+7qzcMBniKI11KOasf2twu8x+qi5 +8/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU +mtgAMADna3+FGO6Lts6KDPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUN +G4k8VIZ3KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41oxXZ3K +rr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg== +-----END CERTIFICATE----- + +thawte Primary Root CA - G3 +=========================== +-----BEGIN CERTIFICATE----- +MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCBrjELMAkGA1UE +BhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2 +aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIwMDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhv +cml6ZWQgdXNlIG9ubHkxJDAiBgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0w +ODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh +d3RlLCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9uMTgwNgYD +VQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTEkMCIG +A1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEczMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A +MIIBCgKCAQEAsr8nLPvb2FvdeHsbnndmgcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2At +P0LMqmsywCPLLEHd5N/8YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC ++BsUa0Lfb1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS99irY +7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2SzhkGcuYMXDhpxwTW +vGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUkOQIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJ +KoZIhvcNAQELBQADggEBABpA2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweK +A3rD6z8KLFIWoCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu +t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7cKUGRIjxpp7sC +8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fMm7v/OeZWYdMKp8RcTGB7BXcm +er/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZuMdRAGmI0Nj81Aa6sY6A= +-----END CERTIFICATE----- + +GeoTrust Primary Certification Authority - G2 +============================================= +-----BEGIN CERTIFICATE----- +MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDELMAkGA1UEBhMC +VVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChjKSAyMDA3IEdlb1RydXN0IElu +Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBD +ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1 +OVowgZgxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg +MjAwNyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNVBAMTLUdl +b1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjB2MBAGByqGSM49AgEG +BSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcLSo17VDs6bl8VAsBQps8lL33KSLjHUGMc +KiEIfJo22Av+0SbFWDEwKCXzXV2juLaltJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYD +VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+ +EVXVMAoGCCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGTqQ7m +ndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBuczrD6ogRLQy7rQkgu2 +npaqBA+K +-----END CERTIFICATE----- + +VeriSign Universal Root Certification Authority +=============================================== +-----BEGIN CERTIFICATE----- +MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCBvTELMAkGA1UE +BhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBO +ZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVk +IHVzZSBvbmx5MTgwNgYDVQQDEy9WZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9u +IEF1dGhvcml0eTAeFw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJV +UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv +cmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl +IG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNhbCBSb290IENlcnRpZmljYXRpb24gQXV0 +aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj +1mCOkdeQmIN65lgZOIzF9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGP +MiJhgsWHH26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+HLL72 +9fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN/BMReYTtXlT2NJ8I +AfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPTrJ9VAMf2CGqUuV/c4DPxhGD5WycR +tPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0G +CCsGAQUFBwEMBGEwX6FdoFswWTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2O +a8PPgGrUSBgsexkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud +DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4sAPmLGd75JR3 +Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+seQxIcaBlVZaDrHC1LGmWazx +Y8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTx +P/jgdFcrGJ2BtMQo2pSXpXDrrB2+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+P +wGZsY6rp2aQW9IHRlRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4 +mJO37M2CYfE45k+XmCpajQ== +-----END CERTIFICATE----- + +VeriSign Class 3 Public Primary Certification Authority - G4 +============================================================ +-----BEGIN CERTIFICATE----- +MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjELMAkGA1UEBhMC +VVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3 +b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVz +ZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmlj +YXRpb24gQXV0aG9yaXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjEL +MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJpU2lnbiBU +cnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRo +b3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5 +IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8 +Utpkmw4tXNherJI9/gHmGUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGz +rl0Bp3vefLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUwAwEB +/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEw +HzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVyaXNpZ24u +Y29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMWkf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMD +A2gAMGUCMGYhDBgmYFo4e1ZC4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIx +AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA== +-----END CERTIFICATE----- + +NetLock Arany (Class Gold) Főtanúsítvány +============================================ +-----BEGIN CERTIFICATE----- +MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G +A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610 +dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBB +cmFueSAoQ2xhc3MgR29sZCkgRsWRdGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgx +MjA2MTUwODIxWjCBpzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxO +ZXRMb2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlmaWNhdGlv +biBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNzIEdvbGQpIEbFkXRhbsO6 +c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxCRec75LbRTDofTjl5Bu +0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrTlF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw +/HpYzY6b7cNGbIRwXdrzAZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAk +H3B5r9s5VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRGILdw +fzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2BJtr+UBdADTHLpl1 +neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIB +BjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2MU9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwW +qZw8UQCgwBEIBaeZ5m8BiFRhbvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTta +YtOUZcTh5m2C+C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC +bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2FuLjbvrW5Kfna +NwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2XjG4Kvte9nHfRCaexOYNkbQu +dZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G2 +================================== +-----BEGIN CERTIFICATE----- +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 +66+KAQ== +-----END CERTIFICATE----- + +CA Disig +======== +-----BEGIN CERTIFICATE----- +MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK +QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw +MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz +bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm +GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD +Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo +hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt +ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w +gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P +AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz +aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff +ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa +BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t +WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3 +mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/ +CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K +ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA +4Z7CRneC9VkGjCFMhwnN5ag= +-----END CERTIFICATE----- + +Juur-SK +======= +-----BEGIN CERTIFICATE----- +MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcNAQkBFglwa2lA +c2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMRAw +DgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMwMVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqG +SIb3DQEJARYJcGtpQHNrLmVlMQswCQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVy +aW1pc2tlc2t1czEQMA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBAIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOBSvZiF3tf +TQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkzABpTpyHhOEvWgxutr2TC ++Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvHLCu3GFH+4Hv2qEivbDtPL+/40UceJlfw +UR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMPPbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDa +Tpxt4brNj3pssAki14sL2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQF +MAMBAf8wggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwICMIHD +HoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDkAGwAagBhAHMAdABh +AHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0AHMAZQBlAHIAaQBtAGkAcwBrAGUA +cwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABzAGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABr +AGkAbgBuAGkAdABhAG0AaQBzAGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nw +cy8wKwYDVR0fBCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE +FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcYP2/v6X2+MA4G +A1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOiCfP+JmeaUOTDBS8rNXiRTHyo +ERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+gkcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyL +abVAyJRld/JXIWY7zoVAtjNjGr95HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678 +IIbsSt4beDI3poHSna9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkh +Mp6qqIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0ZTbvGRNs2 +yyqcjg== +-----END CERTIFICATE----- + +Hongkong Post Root CA 1 +======================= +-----BEGIN CERTIFICATE----- +MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoT +DUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMB4XDTAzMDUx +NTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkGA1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25n +IFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1 +ApzQjVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEnPzlTCeqr +auh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjhZY4bXSNmO7ilMlHIhqqh +qZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9nnV0ttgCXjqQesBCNnLsak3c78QA3xMY +V18meMjWCnl3v/evt3a5pQuEF10Q6m/hq5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNV +HRMBAf8ECDAGAQH/AgEDMA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7i +h9legYsCmEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI37pio +l7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clBoiMBdDhViw+5Lmei +IAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJsEhTkYY2sEJCehFC78JZvRZ+K88ps +T/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpOfMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilT +c4afU9hDDl3WY4JxHYB0yvbiAmvZWg== +-----END CERTIFICATE----- + +SecureSign RootCA11 +=================== +-----BEGIN CERTIFICATE----- +MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDErMCkGA1UEChMi +SmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoGA1UEAxMTU2VjdXJlU2lnbiBS +b290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSsw +KQYDVQQKEyJKYXBhbiBDZXJ0aWZpY2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1 +cmVTaWduIFJvb3RDQTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvL +TJszi1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8h9uuywGO +wvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOVMdrAG/LuYpmGYz+/3ZMq +g6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rP +O7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitA +bpSACW22s293bzUIUPsCh8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZX +t94wDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAKCh +OBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xmKbabfSVSSUOrTC4r +bnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQX5Ucv+2rIrVls4W6ng+4reV6G4pQ +Oh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWrQbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01 +y8hSyn+B/tlr0/cR7SXf+Of5pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061 +lgeLKBObjBmNQSdJQO7e5iNEOdyhIta6A/I= +-----END CERTIFICATE----- + +ACEDICOM Root +============= +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Microsec e-Szigno Root CA 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYDVQQGEwJIVTER +MA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jv +c2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o +dTAeFw0wOTA2MTYxMTMwMThaFw0yOTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UE +BwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUt +U3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvPkd6mJviZpWNwrZuuyjNA +fW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tccbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG +0IMZfcChEhyVbUr02MelTTMuhTlAdX4UfIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKA +pxn1ntxVUwOXewdI/5n7N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm +1HxdrtbCxkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1+rUC +AwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTLD8bf +QkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAbBgNVHREE +FDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqGSIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0o +lZMEyL/azXm4Q5DwpL7v8u8hmLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfX +I/OMn74dseGkddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775 +tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c2Pm2G2JwCz02 +yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5tHMN1Rq41Bab2XD0h7lbwyYIi +LXpUq3DDfSJlgnCW +-----END CERTIFICATE----- + +GlobalSign Root CA - R3 +======================= +-----BEGIN CERTIFICATE----- +MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4GA1UECxMXR2xv +YmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNpZ24xEzARBgNVBAMTCkdsb2Jh +bFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxT +aWduIFJvb3QgQ0EgLSBSMzETMBEGA1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2ln +bjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWt +iHL8RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsTgHeMCOFJ +0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmmKPZpO/bLyCiR5Z2KYVc3 +rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zdQQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjl +OCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZXriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2 +xmmFghcCAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FI/wS3+oLkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZURUm7 +lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMpjjM5RcOO5LlXbKr8 +EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK6fBdRoyV3XpYKBovHd7NADdBj+1E +bddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQXmcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18 +YIvDQVETI53O9zJrlAGomecsMx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7r +kpeDMdmztcpHWD9f +-----END CERTIFICATE----- + +Autoridad de Certificacion Firmaprofesional CIF A62634068 +========================================================= +-----BEGIN CERTIFICATE----- +MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UEBhMCRVMxQjBA +BgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2 +MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEyMzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIw +QAYDVQQDDDlBdXRvcmlkYWQgZGUgQ2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBB +NjI2MzQwNjgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDD +Utd9thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQMcas9UX4P +B99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefGL9ItWY16Ck6WaVICqjaY +7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15iNA9wBj4gGFrO93IbJWyTdBSTo3OxDqqH +ECNZXyAFGUftaI6SEspd/NYrspI8IM/hX68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyI +plD9amML9ZMWGxmPsu2bm8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctX +MbScyJCyZ/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirjaEbsX +LZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/TKI8xWVvTyQKmtFLK +bpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF6NkBiDkal4ZkQdU7hwxu+g/GvUgU +vzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVhOSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1Ud +EwEB/wQIMAYBAf8CAQEwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNH +DhpkLzCBpgYDVR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp +cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBvACAAZABlACAA +bABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBlAGwAbwBuAGEAIAAwADgAMAAx +ADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx +51tkljYyGOylMnfX40S2wBEqgLk9am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qk +R71kMrv2JYSiJ0L1ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaP +T481PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS3a/DTg4f +Jl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5kSeTy36LssUzAKh3ntLFl +osS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF3dvd6qJ2gHN99ZwExEWN57kci57q13XR +crHedUTnQn3iV2t93Jm8PYMo6oCTjcVMZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoR +saS8I8nkvof/uZS2+F0gStRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTD +KCOM/iczQ0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQBjLMi +6Et8Vcad+qMUu2WFbm5PEn4KPJ2V +-----END CERTIFICATE----- + +Izenpe.com +========== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Chambers of Commerce Root - 2008 +================================ +-----BEGIN CERTIFICATE----- +MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xKTAnBgNVBAMTIENoYW1iZXJzIG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEy +Mjk1MFoXDTM4MDczMTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNl +ZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQF +EwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJl +cnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC +AQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW928sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKA +XuFixrYp4YFs8r/lfTJqVKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorj +h40G072QDuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR5gN/ +ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfLZEFHcpOrUMPrCXZk +NNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05aSd+pZgvMPMZ4fKecHePOjlO+Bd5g +D2vlGts/4+EhySnB8esHnFIbAURRPHsl18TlUlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331 +lubKgdaX8ZSD6e2wsWsSaR6s+12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ +0wlf2eOKNcx5Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj +ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAxhduub+84Mxh2 +EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNVHQ4EFgQU+SSsD7K1+HnA+mCI +G8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1+HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJ +BgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNh +bWVyZmlybWEuY29tL2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENh +bWVyZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDiC +CQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUH +AgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAJASryI1 +wqM58C7e6bXpeHxIvj99RZJe6dqxGfwWPJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH +3qLPaYRgM+gQDROpI9CF5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbU +RWpGqOt1glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaHFoI6 +M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2pSB7+R5KBWIBpih1 +YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MDxvbxrN8y8NmBGuScvfaAFPDRLLmF +9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QGtjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcK +zBIKinmwPQN/aUv0NCB9szTqjktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvG +nrDQWzilm1DefhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg +OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZd0jQ +-----END CERTIFICATE----- + +Global Chambersign Root - 2008 +============================== +-----BEGIN CERTIFICATE----- +MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYDVQQGEwJFVTFD +MEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNv +bS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMu +QS4xJzAlBgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMx +NDBaFw0zODA3MzExMjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUg +Y3VycmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJ +QTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD +aGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMDf +VtPkOpt2RbQT2//BthmLN0EYlVJH6xedKYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXf +XjaOcNFccUMd2drvXNL7G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0 +ZJJ0YPP2zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4ddPB +/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyGHoiMvvKRhI9lNNgA +TH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2Id3UwD2ln58fQ1DJu7xsepeY7s2M +H/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3VyJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfe +Ox2YItaswTXbo6Al/3K1dh3ebeksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSF +HTynyQbehP9r6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh +wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsogzCtLkykPAgMB +AAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQWBBS5CcqcHtvTbDprru1U8VuT +BjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDprru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UE +BhMCRVUxQzBBBgNVBAcTOk1hZHJpZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJm +aXJtYS5jb20vYWRkcmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJm +aXJtYSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiCCQDJzdPp +1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCowKAYIKwYBBQUHAgEWHGh0 +dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZIhvcNAQEFBQADggIBAICIf3DekijZBZRG +/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZUohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6 +ReAJ3spED8IXDneRRXozX1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/s +dZ7LoR/xfxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVza2Mg +9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yydYhz2rXzdpjEetrHH +foUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMdSqlapskD7+3056huirRXhOukP9Du +qqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9OAP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETr +P3iZ8ntxPjzxmKfFGBI/5rsoM0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVq +c5iJWzouE4gev8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z +09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B +-----END CERTIFICATE----- + +Go Daddy Root Certificate Authority - G2 +======================================== +-----BEGIN CERTIFICATE----- +MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoTEUdvRGFkZHkuY29tLCBJbmMu +MTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5 +MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6 +b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8G +A1UEAxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKDE6bFIEMBO4Tx5oVJnyfq +9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD ++qK+ihVqf94Lw7YZFAXK6sOoBJQ7RnwyDfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutd +fMh8+7ArU6SSYmlRJQVhGkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMl +NAJWJwGRtDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFDqahQcQZyi27/a9 +BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmXWWcDYfF+OwYxdS2hII5PZYe096ac +vNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r +5N9ss4UXnT3ZJE95kTXWXwTrgIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYV +N8Gb5DKj7Tjo2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO +LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI4uJEvlz36hz1 +-----END CERTIFICATE----- + +Starfield Root Certificate Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVsZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0 +eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAw +DgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQg +VGVjaG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZpY2F0ZSBB +dXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL3twQP89o/8ArFv +W59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMgnLRJdzIpVv257IzdIvpy3Cdhl+72WoTs +bhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNk +N3mSwOxGXn/hbVNMYq/NHwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7Nf +ZTD4p7dNdloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0HZbU +JtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0GCSqGSIb3DQEBCwUAA4IBAQARWfol +TwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjUsHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx +4mcujJUDJi5DnUox9g61DLu34jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUw +F5okxBDgBPfg8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K +pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1mMpYjn0q7pBZ +c2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0 +-----END CERTIFICATE----- + +Starfield Services Root Certificate Authority - G2 +================================================== +-----BEGIN CERTIFICATE----- +MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMxEDAOBgNVBAgT +B0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9s +b2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVsZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRl +IEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNV +BAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxT +dGFyZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2VydmljZXMg +Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC +AQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20pOsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2 +h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm28xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4Pa +hHQUw2eeBGg6345AWh1KTs9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLP +LJGmpufehRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk6mFB +rMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAwDwYDVR0TAQH/BAUw +AwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+qAdcwKziIorhtSpzyEZGDMA0GCSqG +SIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMIbw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPP +E95Dz+I0swSdHynVv/heyNXBve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTy +xQGjhdByPq1zqwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd +iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn0q23KXB56jza +YyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCNsSi6 +-----END CERTIFICATE----- + +AffirmTrust Commercial +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMB4XDTEw +MDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6Eqdb +DuKPHx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yrba0F8PrV +C8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPALMeIrJmqbTFeurCA+ukV6 +BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1yHp52UKqK39c/s4mT6NmgTWvRLpUHhww +MmWd5jyTXlBOeuM61G7MGvv50jeuJCqrVwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNV +HQ4EFgQUnZPGU4teyq8/nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYGXUPG +hi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNjvbz4YYCanrHOQnDi +qX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivtZ8SOyUOyXGsViQK8YvxO8rUzqrJv +0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9gN53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0kh +sUlHRUe072o0EclNmsxZt9YCnlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8= +-----END CERTIFICATE----- + +AffirmTrust Networking +====================== +-----BEGIN CERTIFICATE----- +MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMB4XDTEw +MDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmly +bVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SE +Hi3yYJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbuakCNrmreI +dIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRLQESxG9fhwoXA3hA/Pe24 +/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gb +h+0t+nvujArjqWaJGctB+d1ENmHP4ndGyH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNV +HQ4EFgQUBx/S55zawm6iQLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC +AQYwDQYJKoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfOtDIu +UFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzuQY0x2+c06lkh1QF6 +12S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZLgo/bNjR9eUJtGxUAArgFU2HdW23 +WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4uolu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9 +/ZFvgrG+CJPbFEfxojfHRZ48x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s= +-----END CERTIFICATE----- + +AffirmTrust Premium +=================== +-----BEGIN CERTIFICATE----- +MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UEBhMCVVMxFDAS +BgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMB4XDTEwMDEy +OTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRy +dXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEAxBLfqV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtn +BKAQJG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ+jjeRFcV +5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrSs8PhaJyJ+HoAVt70VZVs ++7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmd +GPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d770O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5R +p9EixAqnOEhss/n/fauGV+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NI +S+LI+H+SqHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S5u04 +6uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4IaC1nEWTJ3s7xgaVY5 +/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TXOwF0lkLgAOIua+rF7nKsu7/+6qqo ++Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYEFJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB +/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByv +MiPIs0laUZx2KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg +Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B8OWycvpEgjNC +6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQMKSOyARiqcTtNd56l+0OOF6S +L5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK ++4w1IX2COPKpVJEZNZOUbWo6xbLQu4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmV +BtWVyuEklut89pMFu+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFg +IxpHYoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8GKa1qF60 +g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaORtGdFNrHF+QFlozEJLUb +zxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6eKeC2uAloGRwYQw== +-----END CERTIFICATE----- + +AffirmTrust Premium ECC +======================= +-----BEGIN CERTIFICATE----- +MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMCVVMxFDASBgNV +BAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQcmVtaXVtIEVDQzAeFw0xMDAx +MjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJBgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1U +cnVzdDEgMB4GA1UEAwwXQWZmaXJtVHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAQNMF4bFZ0D0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQ +N8O9ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0GA1UdDgQW +BBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAK +BggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/VsaobgxCd05DhT1wV/GzTjxi+zygk8N53X +57hG8f2h4nECMEJZh0PUUd+60wkyWs6Iflc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKM +eQ== +-----END CERTIFICATE----- + +Certum Trusted Network CA +========================= +-----BEGIN CERTIFICATE----- +MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBMMSIwIAYDVQQK +ExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5DZXJ0dW0gQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBUcnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIy +MTIwNzM3WhcNMjkxMjMxMTIwNzM3WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBU +ZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +MSIwIAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rHUV+rpDKmYYe2bg+G0jAC +l/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LMTXPb865Px1bVWqeWifrzq2jUI4ZZJ88J +J7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVUBBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4 +fOQtf/WsX+sWn7Et0brMkUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0 +cvW0QM8xAcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNVHRMB +Af8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNVHQ8BAf8EBAMCAQYw +DQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15ysHhE49wcrwn9I0j6vSrEuVUEtRCj +jSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfLI9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1 +mS1FhIrlQgnXdAIv94nYmem8J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5aj +Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI +03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw= +-----END CERTIFICATE----- + +Certinomis - Autorité Racine +============================= +-----BEGIN CERTIFICATE----- +MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg +LSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkG +A1UEBhMCRlIxEzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYw +JAYDVQQDDB1DZXJ0aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQAD +ggIPADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jYF1AMnmHa +wE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N8y4oH3DfVS9O7cdxbwly +Lu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWerP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw +2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92N +jMD2AR5vpTESOH2VwnHu7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9q +c1pkIuVC28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6lSTC +lrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1Enn1So2+WLhl+HPNb +xxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB0iSVL1N6aaLwD4ZFjliCK0wi1F6g +530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql095gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna +4NH4+ej9Uji29YnfAgMBAAGjWzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G +A1UdDgQWBBQNjLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ +KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9sov3/4gbIOZ/x +WqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZMOH8oMDX/nyNTt7buFHAAQCva +R6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40 +nJ+U8/aGH88bc62UeYdocMMzpXDn2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1B +CxMjidPJC+iKunqjo3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjv +JL1vnxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG5ERQL1TE +qkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWqpdEdnV1j6CTmNhTih60b +WfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZbdsLLO7XSAPCjDuGtbkD326C00EauFddE +wk01+dIL8hf2rGbVJLJP0RyZwG71fet0BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/ +vgt2Fl43N+bYdJeimUV5 +-----END CERTIFICATE----- + +Root CA Generalitat Valenciana +============================== +-----BEGIN CERTIFICATE----- +MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJFUzEfMB0GA1UE +ChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290 +IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcNMDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3 +WjBoMQswCQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UE +CxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0G +CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+WmmmO3I2 +F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKjSgbwJ/BXufjpTjJ3Cj9B +ZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGlu6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQ +D0EbtFpKd71ng+CT516nDOeB0/RSrFOyA8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXte +JajCq+TA81yc477OMUxkHl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMB +AAGjggM7MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBraS5n +dmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIICIwYKKwYBBAG/VQIB +ADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBl +AHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIAYQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIA +YQBsAGkAdABhAHQAIABWAGEAbABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQBy +AGEAYwBpAPMAbgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA +aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMAaQBvAG4AYQBt +AGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQAZQAgAEEAdQB0AG8AcgBpAGQA +YQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBu +AHQAcgBhACAAZQBuACAAbABhACAAZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAA +OgAvAC8AdwB3AHcALgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0 +dHA6Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+yeAT8MIGV +BgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQswCQYDVQQGEwJFUzEfMB0G +A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScwJQYDVQQDEx5S +b290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRh +TvW1yEICKrNcda3FbcrnlD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdz +Ckj+IHLtb8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg9J63 +NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XFducTZnV+ZfsBn5OH +iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt ++GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM= +-----END CERTIFICATE----- + +TWCA Root Certification Authority +================================= +-----BEGIN CERTIFICATE----- +MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJ +VEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMzWhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQG +EwJUVzESMBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NB +IFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFEAcK0HMMx +QhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HHK3XLfJ+utdGdIzdjp9xC +oi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeXRfwZVzsrb+RH9JlF/h3x+JejiB03HFyP +4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/zrX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1r +y+UPizgN7gr8/g+YnzAx3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIB +BjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkqhkiG +9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeCMErJk/9q56YAf4lC +mtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdlsXebQ79NqZp4VKIV66IIArB6nCWlW +QtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62Dlhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVY +T0bf+215WfKEIlKuD8z7fDvnaspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocny +Yh0igzyXxfkZYiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw== +-----END CERTIFICATE----- + +Security Communication RootCA2 +============================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDElMCMGA1UEChMc +U0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMeU2VjdXJpdHkgQ29tbXVuaWNh +dGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoXDTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMC +SlAxJTAjBgNVBAoTHFNFQ09NIFRydXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3Vy +aXR5IENvbW11bmljYXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANAVOVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGrzbl+dp++ ++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVMVAX3NuRFg3sUZdbcDE3R +3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQhNBqyjoGADdH5H5XTz+L62e4iKrFvlNV +spHEfbmwhRkGeC7bYRr6hfVKkaHnFtWOojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1K +EOtOghY6rCcMU/Gt1SSwawNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8 +QIH4D5csOPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEB +CwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpFcoJxDjrSzG+ntKEj +u/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXcokgfGT+Ok+vx+hfuzU7jBBJV1uXk +3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6q +tnRGEmyR7jTV7JqR50S+kDFy1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29 +mvVXIwAHIRc/SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03 +-----END CERTIFICATE----- + +EC-ACC +====== +-----BEGIN CERTIFICATE----- +MIIFVjCCBD6gAwIBAgIQ7is969Qh3hSoYqwE893EATANBgkqhkiG9w0BAQUFADCB8zELMAkGA1UE +BhMCRVMxOzA5BgNVBAoTMkFnZW5jaWEgQ2F0YWxhbmEgZGUgQ2VydGlmaWNhY2lvIChOSUYgUS0w +ODAxMTc2LUkpMSgwJgYDVQQLEx9TZXJ2ZWlzIFB1YmxpY3MgZGUgQ2VydGlmaWNhY2lvMTUwMwYD +VQQLEyxWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5ldC92ZXJhcnJlbCAoYykwMzE1MDMGA1UE +CxMsSmVyYXJxdWlhIEVudGl0YXRzIGRlIENlcnRpZmljYWNpbyBDYXRhbGFuZXMxDzANBgNVBAMT +BkVDLUFDQzAeFw0wMzAxMDcyMzAwMDBaFw0zMTAxMDcyMjU5NTlaMIHzMQswCQYDVQQGEwJFUzE7 +MDkGA1UEChMyQWdlbmNpYSBDYXRhbGFuYSBkZSBDZXJ0aWZpY2FjaW8gKE5JRiBRLTA4MDExNzYt +SSkxKDAmBgNVBAsTH1NlcnZlaXMgUHVibGljcyBkZSBDZXJ0aWZpY2FjaW8xNTAzBgNVBAsTLFZl +Z2V1IGh0dHBzOi8vd3d3LmNhdGNlcnQubmV0L3ZlcmFycmVsIChjKTAzMTUwMwYDVQQLEyxKZXJh +cnF1aWEgRW50aXRhdHMgZGUgQ2VydGlmaWNhY2lvIENhdGFsYW5lczEPMA0GA1UEAxMGRUMtQUND +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsyLHT+KXQpWIR4NA9h0X84NzJB5R85iK +w5K4/0CQBXCHYMkAqbWUZRkiFRfCQ2xmRJoNBD45b6VLeqpjt4pEndljkYRm4CgPukLjbo73FCeT +ae6RDqNfDrHrZqJyTxIThmV6PttPB/SnCWDaOkKZx7J/sxaVHMf5NLWUhdWZXqBIoH7nF2W4onW4 +HvPlQn2v7fOKSGRdghST2MDk/7NQcvJ29rNdQlB50JQ+awwAvthrDk4q7D7SzIKiGGUzE3eeml0a +E9jD2z3Il3rucO2n5nzbcc8tlGLfbdb1OL4/pYUKGbio2Al1QnDE6u/LDsg0qBIimAy4E5S2S+zw +0JDnJwIDAQABo4HjMIHgMB0GA1UdEQQWMBSBEmVjX2FjY0BjYXRjZXJ0Lm5ldDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUoMOLRKo3pUW/l4Ba0fF4opvpXY0wfwYD +VR0gBHgwdjB0BgsrBgEEAfV4AQMBCjBlMCwGCCsGAQUFBwIBFiBodHRwczovL3d3dy5jYXRjZXJ0 +Lm5ldC92ZXJhcnJlbDA1BggrBgEFBQcCAjApGidWZWdldSBodHRwczovL3d3dy5jYXRjZXJ0Lm5l +dC92ZXJhcnJlbCAwDQYJKoZIhvcNAQEFBQADggEBAKBIW4IB9k1IuDlVNZyAelOZ1Vr/sXE7zDkJ +lF7W2u++AVtd0x7Y/X1PzaBB4DSTv8vihpw3kpBWHNzrKQXlxJ7HNd+KDM3FIUPpqojlNcAZQmNa +Al6kSBg6hW/cnbw/nZzBh7h6YQjpdwt/cKt63dmXLGQehb+8dJahw3oS7AwaboMMPOhyRp/7SNVe +l+axofjk70YllJyJ22k4vuxcDlbHZVHlUIiIv0LVKz3l+bqeLrPK9HOSAgu+TGbrIP65y7WZf+a2 +E/rKS03Z7lNGBjvGTq2TWoF+bCpLagVFjPIhpDGQh2xlnJ2lYJU6Un/10asIbvPuW/mIPX64b24D +5EI= +-----END CERTIFICATE----- + +Hellenic Academic and Research Institutions RootCA 2011 +======================================================= +-----BEGIN CERTIFICATE----- +MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1IxRDBCBgNVBAoT +O0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9y +aXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IFJvb3RDQSAyMDExMB4XDTExMTIwNjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYT +AkdSMUQwQgYDVQQKEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25z +IENlcnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNo +IEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +AKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPzdYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI +1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJfel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa +71HFK9+WXesyHgLacEnsbgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u +8yBRQlqD75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSPFEDH +3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNVHRMBAf8EBTADAQH/ +MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp5dgTBCPuQSUwRwYDVR0eBEAwPqA8 +MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQub3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQu +b3JnMA0GCSqGSIb3DQEBBQUAA4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVt +XdMiKahsog2p6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8 +TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7dIsXRSZMFpGD +/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8AcysNnq/onN694/BtZqhFLKPM58N +7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXIl7WdmplNsDz4SgCbZN2fOUvRJ9e4 +-----END CERTIFICATE----- + +Actalis Authentication Root CA +============================== +-----BEGIN CERTIFICATE----- +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 +-----END CERTIFICATE----- + +Trustis FPS Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQG +EwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQLExNUcnVzdGlzIEZQUyBSb290 +IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTExMzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNV +BAoTD1RydXN0aXMgTGltaXRlZDEcMBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJ +KoZIhvcNAQEBBQADggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQ +RUN+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihHiTHcDnlk +H5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjjvSkCqPoc4Vu5g6hBSLwa +cY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zt +o3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlBOrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEA +AaNTMFEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAd +BgNVHQ4EFgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01GX2c +GE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmWzaD+vkAMXBJV+JOC +yinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP41BIy+Q7DsdwyhEQsb8tGD+pmQQ9P +8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZEf1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHV +l/9D7S3B2l0pKoU/rGXuhg8FjZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYl +iB6XzCGcKQENZetX2fNXlrtIzYE= +-----END CERTIFICATE----- + +StartCom Certification Authority +================================ +-----BEGIN CERTIFICATE----- +MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmlu +ZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0 +NjM3WhcNMzYwOTE3MTk0NjM2WjB9MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRk +LjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMg +U3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAw +ggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZkpMyONvg45iPwbm2xPN1y +o4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rfOQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/ +Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/CJi/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/d +eMotHweXMAEtcnn6RtYTKqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt +2PZE4XNiHzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMMAv+Z +6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w+2OqqGwaVLRcJXrJ +osmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/ +untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVc +UjyJthkqcwEKDwOzEmDyei+B26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT +37uMdBNSSwIDAQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD +VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFulF2mHMMo0aEPQ +Qa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCCATgwLgYIKwYBBQUHAgEWImh0 +dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cu +c3RhcnRzc2wuY29tL2ludGVybWVkaWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENv +bW1lcmNpYWwgKFN0YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0 +aGUgc2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0aWZpY2F0 +aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuc3RhcnRzc2wuY29t +L3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBG +cmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5 +fPGFf59Jb2vKXfuM/gTFwWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWm +N3PH/UvSTa0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst0OcN +Org+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNcpRJvkrKTlMeIFw6T +tn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKlCcWw0bdT82AUuoVpaiF8H3VhFyAX +e2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVFP0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA +2MFrLH9ZXF2RsXAiV+uKa0hK1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBs +HvUwyKMQ5bLmKhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE +JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ8dCAWZvLMdib +D4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnmfyWl8kgAwKQB2j8= +-----END CERTIFICATE----- + +StartCom Certification Authority G2 +=================================== +-----BEGIN CERTIFICATE----- +MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMN +U3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg +RzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UE +ChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3Jp +dHkgRzIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8O +o1XJJZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsDvfOpL9HG +4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnooD/Uefyf3lLE3PbfHkffi +Aez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/Q0kGi4xDuFby2X8hQxfqp0iVAXV16iul +Q5XqFYSdCI0mblWbq9zSOdIxHWDirMxWRST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbs +O+wmETRIjfaAKxojAuuKHDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8H +vKTlXcxNnw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM0D4L +nMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/iUUjXuG+v+E5+M5iS +FGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9Ha90OrInwMEePnWjFqmveiJdnxMa +z6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHgTuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8E +BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJ +KoZIhvcNAQELBQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K +2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfXUfEpY9Z1zRbk +J4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl6/2o1PXWT6RbdejF0mCy2wl+ +JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG +/+gyRr61M3Z3qAFdlsHB1b6uJcDJHgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTc +nIhT76IxW1hPkWLIwpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/Xld +blhYXzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5lIxKVCCIc +l85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoohdVddLHRDiBYmxOlsGOm +7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulrso8uBtjRkcfGEvRM/TAXw8HaOFvjqerm +obp573PYtlNXLfbQ4ddI +-----END CERTIFICATE----- + +Buypass Class 2 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMiBSb290IENBMB4X +DTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1owTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1 +g1Lr6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPVL4O2fuPn +9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC911K2GScuVr1QGbNgGE41b +/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHxMlAQTn/0hpPshNOOvEu/XAFOBz3cFIqU +CqTqc/sLUegTBxj6DvEr0VQVfTzh97QZQmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeff +awrbD02TTqigzXsu8lkBarcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgI +zRFo1clrUs3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLiFRhn +Bkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRSP/TizPJhk9H9Z2vX +Uq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN9SG9dKpN6nIDSdvHXx1iY8f93ZHs +M+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxPAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFMmAd+BikoL1RpzzuvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAU18h9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s +A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3tOluwlN5E40EI +osHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo+fsicdl9sz1Gv7SEr5AcD48S +aq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYd +DnkM/crqJIByw5c/8nerQyIKx+u2DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWD +LfJ6v9r9jv6ly0UsH8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0 +oyLQI+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK75t98biGC +wWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h3PFaTWwyI0PurKju7koS +CTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPzY11aWOIv4x3kqdbQCtCev9eBCfHJxyYN +rJgWVqA= +-----END CERTIFICATE----- + +Buypass Class 3 Root CA +======================= +-----BEGIN CERTIFICATE----- +MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU +QnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3MgQ2xhc3MgMyBSb290IENBMB4X +DTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFowTjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1 +eXBhc3MgQVMtOTgzMTYzMzI3MSAwHgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRH +sJ8YZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3EN3coTRiR +5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9tznDDgFHmV0ST9tD+leh +7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX0DJq1l1sDPGzbjniazEuOQAnFN44wOwZ +ZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH +2xc519woe2v1n/MuwU8XKhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV +/afmiSTYzIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvSO1UQ +RwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D34xFMFbG02SrZvPA +Xpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgPK9Dx2hzLabjKSWJtyNBjYt1gD1iq +j6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYD +VR0OBBYEFEe4zf/lb+74suwvTg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsF +AAOCAgEAACAjQTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV +cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXSIGrs/CIBKM+G +uIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2HJLw5QY33KbmkJs4j1xrG0aG +Q0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsaO5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8 +ZORK15FTAaggiG6cX0S5y2CBNOxv033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2 +KSb12tjE8nVhz36udmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz +6MkEkbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg413OEMXbug +UZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvDu79leNKGef9JOxqDDPDe +eOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq4/g7u9xN12TyUb7mqqta6THuBrxzvxNi +Cp/HuZc= +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 3 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgx +MDAxMTAyOTU2WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN8ELg63iIVl6bmlQdTQyK +9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/RLyTPWGrTs0NvvAgJ1gORH8EGoel15YU +NpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZF +iP0Zf3WHHx+xGwpzJFu5ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W +0eDrXltMEnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1A/d2O2GCahKqGFPr +AyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOyWL6ukK2YJ5f+AbGwUgC4TeQbIXQb +fsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzT +ucpH9sry9uetuUg/vBa3wW306gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7h +P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml +e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw== +-----END CERTIFICATE----- + +EE Certification Centre Root CA +=============================== +-----BEGIN CERTIFICATE----- +MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG +EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy +dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw +MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB +UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy +ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB +DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM +TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2 +rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw +93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN +P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T +AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ +MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF +BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj +xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM +lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u +uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU +3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM +dcGWxZ0= +-----END CERTIFICATE----- + +TURKTRUST Certificate Services Provider Root 2007 +================================================= +-----BEGIN CERTIFICATE----- +MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP +MA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg +QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4X +DTA3MTIyNTE4MzcxOVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxl +a3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMCVFIxDzAN +BgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp +bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4gKGMpIEFyYWzEsWsgMjAwNzCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9N +YvDdE3ePYakqtdTyuTFYKTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQv +KUmi8wUG+7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveGHtya +KhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6PIzdezKKqdfcYbwnT +rqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M733WB2+Y8a+xwXrXgTW4qhe04MsC +AwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHkYb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAP +BgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/s +Px+EnWVUXKgWAkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I +aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5mxRZNTZPz/OO +Xl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsaXRik7r4EW5nVcV9VZWRi1aKb +BFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZqxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAK +poRq0Tl9 +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 2009 +============================== +-----BEGIN CERTIFICATE----- +MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTAe +Fw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NThaME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxE +LVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOAD +ER03UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42tSHKXzlA +BF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9RySPocq60vFYJfxLLHLGv +KZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsMlFqVlNpQmvH/pStmMaTJOKDfHR+4CS7z +p+hnUquVH+BGPtikw8paxTGA6Eian5Rp/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUC +AwEAAaOCARowggEWMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ +4PGEMA4GA1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVjdG9y +eS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUyMENBJTIwMiUyMDIw +MDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRlcmV2b2NhdGlvbmxpc3QwQ6BBoD+G +PWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3JsL2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAw +OS5jcmwwDQYJKoZIhvcNAQELBQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm +2H6NMLVwMeniacfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0 +o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4KzCUqNQT4YJEV +dT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8PIWmawomDeCTmGCufsYkl4ph +X5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3YJohw1+qRzT65ysCQblrGXnRl11z+o+I= +-----END CERTIFICATE----- + +D-TRUST Root Class 3 CA 2 EV 2009 +================================= +-----BEGIN CERTIFICATE----- +MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUwNDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQK +DAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAw +OTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfS +egpnljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM03TP1YtHh +zRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6ZqQTMFexgaDbtCHu39b+T +7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lRp75mpoo6Kr3HGrHhFPC+Oh25z1uxav60 +sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure35 +11H3a6UCAwEAAaOCASQwggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyv +cop9NteaHNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFwOi8v +ZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xhc3MlMjAzJTIwQ0El +MjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1ERT9jZXJ0aWZpY2F0ZXJldm9jYXRp +b25saXN0MEagRKBChkBodHRwOi8vd3d3LmQtdHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xh +c3NfM19jYV8yX2V2XzIwMDkuY3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+ +PPoeUSbrh/Yp3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05 +nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNFCSuGdXzfX2lX +ANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7naxpeG0ILD5EJt/rDiZE4OJudA +NCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqXKVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVv +w9y4AyHqnxbxLFS1 +-----END CERTIFICATE----- + +PSCProcert +========== +-----BEGIN CERTIFICATE----- +MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1dG9yaWRhZCBk +ZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9sYW5vMQswCQYDVQQGEwJWRTEQ +MA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlzdHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lz +dGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBl +cmludGVuZGVuY2lhIGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUw +IwYJKoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEwMFoXDTIw +MTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHByb2NlcnQubmV0LnZlMQ8w +DQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGExKjAoBgNVBAsTIVByb3ZlZWRvciBkZSBD +ZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZp +Y2FjaW9uIEVsZWN0cm9uaWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIw +DQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo97BVC +wfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74BCXfgI8Qhd19L3uA +3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38GieU89RLAu9MLmV+QfI4tL3czkkoh +RqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmO +EO8GqQKJ/+MMbpfg353bIdD0PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG2 +0qCZyFSTXai20b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH +0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/6mnbVSKVUyqU +td+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1mv6JpIzi4mWCZDlZTOpx+FIyw +Bm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvp +r2uKGcfLFFb14dq12fy/czja+eevbqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/ +AgEBMDcGA1UdEgQwMC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAz +Ni0wMB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFDgBStuyId +xuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0b3JpZGFkIGRlIENlcnRp +ZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xhbm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQH +EwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5h +Y2lvbmFsIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5k +ZW5jaWEgZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkqhkiG +9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQDAgEGME0GA1UdEQRG +MESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0wMDAwMDKgGwYFYIZeAgKgEgwQUklG +LUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEagRKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52 +ZS9sY3IvQ0VSVElGSUNBRE8tUkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNy +YWl6LnN1c2NlcnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v +Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsGAQUFBwIBFh5o +dHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcNAQELBQADggIBACtZ6yKZu4Sq +T96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmN +g7+mvTV+LFwxNG9s2/NkAZiqlCxB3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4q +uxtxj7mkoP3YldmvWb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1 +n8GhHVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHmpHmJWhSn +FFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXzsOfIt+FTvZLm8wyWuevo +5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bEqCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq +3TNWOByyrYDT13K9mmyZY+gAu0F2BbdbmRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5 +poLWccret9W6aAjtmcz9opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3Y +eMLEYC/HYvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km +-----END CERTIFICATE----- + +China Internet Network Information Center EV Certificates Root +============================================================== +-----BEGIN CERTIFICATE----- +MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMCQ04xMjAwBgNV +BAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyMUcwRQYDVQQDDD5D +aGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMg +Um9vdDAeFw0xMDA4MzEwNzExMjVaFw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAG +A1UECgwpQ2hpbmEgSW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMM +PkNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRpZmljYXRl +cyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z7r07eKpkQ0H1UN+U8i6y +jUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV +98YPjUesWgbdYavi7NifFy2cyjw1l1VxzUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2H +klY0bBoQCxfVWhyXWIQ8hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23 +KzhmBsUs4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54ugQEC +7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oYNJKiyoOCWTAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUfHJLOcfA22KlT5uqGDSSosqD +glkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd5 +0XPFtQO3WKwMVC/GVhMPMdoG52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM +7+czV0I664zBechNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws +ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrIzo9uoV1/A3U0 +5K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATywy39FCqQmbkHzJ8= +-----END CERTIFICATE----- + +Swisscom Root CA 2 +================== +-----BEGIN CERTIFICATE----- +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 +5OfNeOI5wSsSnqaeG8XmDtkx2Q== +-----END CERTIFICATE----- + +Swisscom Root EV CA 2 +===================== +-----BEGIN CERTIFICATE----- +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 +l8PVP3wbI+2ksx0WckNLIOFZfsLorSa/ovc= +-----END CERTIFICATE----- + +CA Disig Root R1 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQyMDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy +3QRkD2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/oOI7bm+V8 +u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3AfQ+lekLZWnDZv6fXARz2 +m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJeIgpFy4QxTaz+29FHuvlglzmxZcfe+5nk +CiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8noc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTa +YVKvJrT1cU/J19IG32PK/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6 +vpmumwKjrckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD3AjL +LhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE7cderVC6xkGbrPAX +ZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkCyC2fg69naQanMVXVz0tv/wQFx1is +XxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLdqvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ +04IwDQYJKoZIhvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR +xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaASfX8MPWbTx9B +LxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXoHqJPYNcHKfyyo6SdbhWSVhlM +CrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpBemOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5Gfb +VSUZP/3oNn6z4eGBrxEWi1CXYBmCAMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85 +YmLLW1AL14FABZyb7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKS +ds+xDzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvkF7mGnjix +lAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqFa3qdnom2piiZk4hA9z7N +UaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsTQ6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJ +a7+h89n07eLw4+1knj0vllJPgFOL +-----END CERTIFICATE----- + +CA Disig Root R2 +================ +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNVBAYTAlNLMRMw +EQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMuMRkwFwYDVQQDExBDQSBEaXNp +ZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQyMDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sx +EzARBgNVBAcTCkJyYXRpc2xhdmExEzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERp +c2lnIFJvb3QgUjIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbC +w3OeNcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNHPWSb6Wia +xswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3Ix2ymrdMxp7zo5eFm1tL7 +A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbeQTg06ov80egEFGEtQX6sx3dOy1FU+16S +GBsEWmjGycT6txOgmLcRK7fWV8x8nhfRyyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqV +g8NTEQxzHQuyRpDRQjrOQG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa +5Beny912H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJQfYE +koopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUDi/ZnWejBBhG93c+A +Ak9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORsnLMOPReisjQS1n6yqEm70XooQL6i +Fh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNV +HRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5u +Qu0wDQYJKoZIhvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM +tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqfGopTpti72TVV +sRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkblvdhuDvEK7Z4bLQjb/D907Je +dR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka+elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W8 +1k/BfDxujRNt+3vrMNDcTa/F1balTFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjx +mHHEt38OFdAlab0inSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01 +utI3gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18DrG5gPcFw0 +sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3OszMOl6W8KjptlwlCFtaOg +UxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8xL4ysEr3vQCj8KWefshNPZiTEUxnpHikV +7+ZtsH8tZ/3zbBt1RqPlShfppNcL +-----END CERTIFICATE----- + +ACCVRAIZ1 +========= +-----BEGIN CERTIFICATE----- +MIIH0zCCBbugAwIBAgIIXsO3pkN/pOAwDQYJKoZIhvcNAQEFBQAwQjESMBAGA1UEAwwJQUNDVlJB +SVoxMRAwDgYDVQQLDAdQS0lBQ0NWMQ0wCwYDVQQKDARBQ0NWMQswCQYDVQQGEwJFUzAeFw0xMTA1 +MDUwOTM3MzdaFw0zMDEyMzEwOTM3MzdaMEIxEjAQBgNVBAMMCUFDQ1ZSQUlaMTEQMA4GA1UECwwH +UEtJQUNDVjENMAsGA1UECgwEQUNDVjELMAkGA1UEBhMCRVMwggIiMA0GCSqGSIb3DQEBAQUAA4IC +DwAwggIKAoICAQCbqau/YUqXry+XZpp0X9DZlv3P4uRm7x8fRzPCRKPfmt4ftVTdFXxpNRFvu8gM +jmoYHtiP2Ra8EEg2XPBjs5BaXCQ316PWywlxufEBcoSwfdtNgM3802/J+Nq2DoLSRYWoG2ioPej0 +RGy9ocLLA76MPhMAhN9KSMDjIgro6TenGEyxCQ0jVn8ETdkXhBilyNpAlHPrzg5XPAOBOp0KoVdD +aaxXbXmQeOW1tDvYvEyNKKGno6e6Ak4l0Squ7a4DIrhrIA8wKFSVf+DuzgpmndFALW4ir50awQUZ +0m/A8p/4e7MCQvtQqR0tkw8jq8bBD5L/0KIV9VMJcRz/RROE5iZe+OCIHAr8Fraocwa48GOEAqDG +WuzndN9wrqODJerWx5eHk6fGioozl2A3ED6XPm4pFdahD9GILBKfb6qkxkLrQaLjlUPTAYVtjrs7 +8yM2x/474KElB0iryYl0/wiPgL/AlmXz7uxLaL2diMMxs0Dx6M/2OLuc5NF/1OVYm3z61PMOm3WR +5LpSLhl+0fXNWhn8ugb2+1KoS5kE3fj5tItQo05iifCHJPqDQsGH+tUtKSpacXpkatcnYGMN285J +9Y0fkIkyF/hzQ7jSWpOGYdbhdQrqeWZ2iE9x6wQl1gpaepPluUsXQA+xtrn13k/c4LOsOxFwYIRK +Q26ZIMApcQrAZQIDAQABo4ICyzCCAscwfQYIKwYBBQUHAQEEcTBvMEwGCCsGAQUFBzAChkBodHRw +Oi8vd3d3LmFjY3YuZXMvZmlsZWFkbWluL0FyY2hpdm9zL2NlcnRpZmljYWRvcy9yYWl6YWNjdjEu +Y3J0MB8GCCsGAQUFBzABhhNodHRwOi8vb2NzcC5hY2N2LmVzMB0GA1UdDgQWBBTSh7Tj3zcnk1X2 +VuqB5TbMjB4/vTAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFNKHtOPfNyeTVfZW6oHlNsyM +Hj+9MIIBcwYDVR0gBIIBajCCAWYwggFiBgRVHSAAMIIBWDCCASIGCCsGAQUFBwICMIIBFB6CARAA +QQB1AHQAbwByAGkAZABhAGQAIABkAGUAIABDAGUAcgB0AGkAZgBpAGMAYQBjAGkA8wBuACAAUgBh +AO0AegAgAGQAZQAgAGwAYQAgAEEAQwBDAFYAIAAoAEEAZwBlAG4AYwBpAGEAIABkAGUAIABUAGUA +YwBuAG8AbABvAGcA7QBhACAAeQAgAEMAZQByAHQAaQBmAGkAYwBhAGMAaQDzAG4AIABFAGwAZQBj +AHQAcgDzAG4AaQBjAGEALAAgAEMASQBGACAAUQA0ADYAMAAxADEANQA2AEUAKQAuACAAQwBQAFMA +IABlAG4AIABoAHQAdABwADoALwAvAHcAdwB3AC4AYQBjAGMAdgAuAGUAczAwBggrBgEFBQcCARYk +aHR0cDovL3d3dy5hY2N2LmVzL2xlZ2lzbGFjaW9uX2MuaHRtMFUGA1UdHwROMEwwSqBIoEaGRGh0 +dHA6Ly93d3cuYWNjdi5lcy9maWxlYWRtaW4vQXJjaGl2b3MvY2VydGlmaWNhZG9zL3JhaXphY2N2 +MV9kZXIuY3JsMA4GA1UdDwEB/wQEAwIBBjAXBgNVHREEEDAOgQxhY2N2QGFjY3YuZXMwDQYJKoZI +hvcNAQEFBQADggIBAJcxAp/n/UNnSEQU5CmH7UwoZtCPNdpNYbdKl02125DgBS4OxnnQ8pdpD70E +R9m+27Up2pvZrqmZ1dM8MJP1jaGo/AaNRPTKFpV8M9xii6g3+CfYCS0b78gUJyCpZET/LtZ1qmxN +YEAZSUNUY9rizLpm5U9EelvZaoErQNV/+QEnWCzI7UiRfD+mAM/EKXMRNt6GGT6d7hmKG9Ww7Y49 +nCrADdg9ZuM8Db3VlFzi4qc1GwQA9j9ajepDvV+JHanBsMyZ4k0ACtrJJ1vnE5Bc5PUzolVt3OAJ +TS+xJlsndQAJxGJ3KQhfnlmstn6tn1QwIgPBHnFk/vk4CpYY3QIUrCPLBhwepH2NDd4nQeit2hW3 +sCPdK6jT2iWH7ehVRE2I9DZ+hJp4rPcOVkkO1jMl1oRQQmwgEh0q1b688nCBpHBgvgW1m54ERL5h +I6zppSSMEYCUWqKiuUnSwdzRp+0xESyeGabu4VXhwOrPDYTkF7eifKXeVSUG7szAh1xA2syVP1Xg +Nce4hL60Xc16gwFy7ofmXx2utYXGJt/mwZrpHgJHnyqobalbz+xFd3+YJ5oyXSrjhO7FmGYvliAd +3djDJ9ew+f7Zfc3Qn48LFFhRny+Lwzgt3uiP1o2HpPVWQxaZLPSkVrQ0uGE3ycJYgBugl6H8WY3p +EfbRD0tVNEYqi4Y7 +-----END CERTIFICATE----- + +TWCA Global Root CA +=================== +-----BEGIN CERTIFICATE----- +MIIFQTCCAymgAwIBAgICDL4wDQYJKoZIhvcNAQELBQAwUTELMAkGA1UEBhMCVFcxEjAQBgNVBAoT +CVRBSVdBTi1DQTEQMA4GA1UECxMHUm9vdCBDQTEcMBoGA1UEAxMTVFdDQSBHbG9iYWwgUm9vdCBD +QTAeFw0xMjA2MjcwNjI4MzNaFw0zMDEyMzExNTU5NTlaMFExCzAJBgNVBAYTAlRXMRIwEAYDVQQK +EwlUQUlXQU4tQ0ExEDAOBgNVBAsTB1Jvb3QgQ0ExHDAaBgNVBAMTE1RXQ0EgR2xvYmFsIFJvb3Qg +Q0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCwBdvI64zEbooh745NnHEKH1Jw7W2C +nJfF10xORUnLQEK1EjRsGcJ0pDFfhQKX7EMzClPSnIyOt7h52yvVavKOZsTuKwEHktSz0ALfUPZV +r2YOy+BHYC8rMjk1Ujoog/h7FsYYuGLWRyWRzvAZEk2tY/XTP3VfKfChMBwqoJimFb3u/Rk28OKR +Q4/6ytYQJ0lM793B8YVwm8rqqFpD/G2Gb3PpN0Wp8DbHzIh1HrtsBv+baz4X7GGqcXzGHaL3SekV +tTzWoWH1EfcFbx39Eb7QMAfCKbAJTibc46KokWofwpFFiFzlmLhxpRUZyXx1EcxwdE8tmx2RRP1W +KKD+u4ZqyPpcC1jcxkt2yKsi2XMPpfRaAok/T54igu6idFMqPVMnaR1sjjIsZAAmY2E2TqNGtz99 +sy2sbZCilaLOz9qC5wc0GZbpuCGqKX6mOL6OKUohZnkfs8O1CWfe1tQHRvMq2uYiN2DLgbYPoA/p +yJV/v1WRBXrPPRXAb94JlAGD1zQbzECl8LibZ9WYkTunhHiVJqRaCPgrdLQABDzfuBSO6N+pjWxn +kjMdwLfS7JLIvgm/LCkFbwJrnu+8vyq8W8BQj0FwcYeyTbcEqYSjMq+u7msXi7Kx/mzhkIyIqJdI +zshNy/MGz19qCkKxHh53L46g5pIOBvwFItIm4TFRfTLcDwIDAQABoyMwITAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAgEAXzSBdu+WHdXltdkCY4QWwa6g +cFGn90xHNcgL1yg9iXHZqjNB6hQbbCEAwGxCGX6faVsgQt+i0trEfJdLjbDorMjupWkEmQqSpqsn +LhpNgb+E1HAerUf+/UqdM+DyucRFCCEK2mlpc3INvjT+lIutwx4116KD7+U4x6WFH6vPNOw/KP4M +8VeGTslV9xzU2KV9Bnpv1d8Q34FOIWWxtuEXeZVFBs5fzNxGiWNoRI2T9GRwoD2dKAXDOXC4Ynsg +/eTb6QihuJ49CcdP+yz4k3ZB3lLg4VfSnQO8d57+nile98FRYB/e2guyLXW3Q0iT5/Z5xoRdgFlg +lPx4mI88k1HtQJAH32RjJMtOcQWh15QaiDLxInQirqWm2BJpTGCjAu4r7NRjkgtevi92a6O2JryP +A9gK8kxkRr05YuWW6zRjESjMlfGt7+/cgFhI6Uu46mWs6fyAtbXIRfmswZ/ZuepiiI7E8UuDEq3m +i4TWnsLrgxifarsbJGAzcMzs9zLzXNl5fe+epP7JI8Mk7hWSsT2RTyaGvWZzJBPqpK5jwa19hAM8 +EHiGG3njxPPyBJUgriOCxLM6AGK/5jYk4Ve6xx6QddVfP5VhK8E7zeWzaGHQRiapIVJpLesux+t3 +zqY6tQMzT3bR51xUAV3LePTJDL/PEo4XLSNolOer/qmyKwbQBM0= +-----END CERTIFICATE----- + +TeliaSonera Root CA v1 +====================== +-----BEGIN CERTIFICATE----- +MIIFODCCAyCgAwIBAgIRAJW+FqD3LkbxezmCcvqLzZYwDQYJKoZIhvcNAQEFBQAwNzEUMBIGA1UE +CgwLVGVsaWFTb25lcmExHzAdBgNVBAMMFlRlbGlhU29uZXJhIFJvb3QgQ0EgdjEwHhcNMDcxMDE4 +MTIwMDUwWhcNMzIxMDE4MTIwMDUwWjA3MRQwEgYDVQQKDAtUZWxpYVNvbmVyYTEfMB0GA1UEAwwW +VGVsaWFTb25lcmEgUm9vdCBDQSB2MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMK+ +6yfwIaPzaSZVfp3FVRaRXP3vIb9TgHot0pGMYzHw7CTww6XScnwQbfQ3t+XmfHnqjLWCi65ItqwA +3GV17CpNX8GH9SBlK4GoRz6JI5UwFpB/6FcHSOcZrr9FZ7E3GwYq/t75rH2D+1665I+XZ75Ljo1k +B1c4VWk0Nj0TSO9P4tNmHqTPGrdeNjPUtAa9GAH9d4RQAEX1jF3oI7x+/jXh7VB7qTCNGdMJjmhn +Xb88lxhTuylixcpecsHHltTbLaC0H2kD7OriUPEMPPCs81Mt8Bz17Ww5OXOAFshSsCPN4D7c3TxH +oLs1iuKYaIu+5b9y7tL6pe0S7fyYGKkmdtwoSxAgHNN/Fnct7W+A90m7UwW7XWjH1Mh1Fj+JWov3 +F0fUTPHSiXk+TT2YqGHeOh7S+F4D4MHJHIzTjU3TlTazN19jY5szFPAtJmtTfImMMsJu7D0hADnJ +oWjiUIMusDor8zagrC/kb2HCUQk5PotTubtn2txTuXZZNp1D5SDgPTJghSJRt8czu90VL6R4pgd7 +gUY2BIbdeTXHlSw7sKMXNeVzH7RcWe/a6hBle3rQf5+ztCo3O3CLm1u5K7fsslESl1MpWtTwEhDc +TwK7EpIvYtQ/aUN8Ddb8WHUBiJ1YFkveupD/RwGJBmr2X7KQarMCpgKIv7NHfirZ1fpoeDVNAgMB +AAGjPzA9MA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBTwj1k4ALP1j5qW +DNXr+nuqF+gTEjANBgkqhkiG9w0BAQUFAAOCAgEAvuRcYk4k9AwI//DTDGjkk0kiP0Qnb7tt3oNm +zqjMDfz1mgbldxSR651Be5kqhOX//CHBXfDkH1e3damhXwIm/9fH907eT/j3HEbAek9ALCI18Bmx +0GtnLLCo4MBANzX2hFxc469CeP6nyQ1Q6g2EdvZR74NTxnr/DlZJLo961gzmJ1TjTQpgcmLNkQfW +pb/ImWvtxBnmq0wROMVvMeJuScg/doAmAyYp4Db29iBT4xdwNBedY2gea+zDTYa4EzAvXUYNR0PV +G6pZDrlcjQZIrXSHX8f8MVRBE+LHIQ6e4B4N4cB7Q4WQxYpYxmUKeFfyxiMPAdkgS94P+5KFdSpc +c41teyWRyu5FrgZLAMzTsVlQ2jqIOylDRl6XK1TOU2+NSueW+r9xDkKLfP0ooNBIytrEgUy7onOT +JsjrDNYmiLbAJM+7vVvrdX3pCI6GMyx5dwlppYn8s3CQh3aP0yK7Qs69cwsgJirQmz1wHiRszYd2 +qReWt88NkvuOGKmYSdGe/mBEciG5Ge3C9THxOUiIkCR1VBatzvT4aRRkOfujuLpwQMcnHL/EVlP6 +Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVxSK236thZiNSQvxaz2ems +WWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= +-----END CERTIFICATE----- + +E-Tugra Certification Authority +=============================== +-----BEGIN CERTIFICATE----- +MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNVBAYTAlRSMQ8w +DQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamls +ZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN +ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMw +NTEyMDk0OFoXDTIzMDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmEx +QDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxl +cmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQD +DB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A +MIICCgKCAgEA4vU/kwVRHoViVF56C/UYB4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vd +hQd2h8y/L5VMzH2nPbxHD5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5K +CKpbknSFQ9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEoq1+g +ElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3Dk14opz8n8Y4e0ypQ +BaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcHfC425lAcP9tDJMW/hkd5s3kc91r0 +E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsutdEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gz +rt48Ue7LE3wBf4QOXVGUnhMMti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAq +jqFGOjGY5RH8zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn +rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUXU8u3Zg5mTPj5 +dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6Jyr+zE7S6E5UMA8GA1UdEwEB +/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEG +MA0GCSqGSIb3DQEBCwUAA4ICAQAFNzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAK +kEh47U6YA5n+KGCRHTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jO +XKqYGwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c77NCR807 +VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3+GbHeJAAFS6LrVE1Uweo +a2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WKvJUawSg5TB9D0pH0clmKuVb8P7Sd2nCc +dlqMQ1DujjByTd//SffGqWfZbawCEeI6FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEV +KV0jq9BgoRJP3vQXzTLlyb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gT +Dx4JnW2PAJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpDy4Q0 +8ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8dNL/+I5c30jn6PQ0G +C7TbO6Orb1wdtn7os4I07QZcJA== +-----END CERTIFICATE----- + +T-TeleSec GlobalRoot Class 2 +============================ +-----BEGIN CERTIFICATE----- +MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoM +IlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBU +cnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwHhcNMDgx +MDAxMTA0MDE0WhcNMzMxMDAxMjM1OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lz +dGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBD +ZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDIwggEiMA0GCSqGSIb3 +DQEBAQUAA4IBDwAwggEKAoIBAQCqX9obX+hzkeXaXPSi5kfl82hVYAUdAqSzm1nzHoqvNK38DcLZ +SBnuaY/JIPwhqgcZ7bBcrGXHX+0CfHt8LRvWurmAwhiCFoT6ZrAIxlQjgeTNuUk/9k9uN0goOA/F +vudocP05l03Sx5iRUKrERLMjfTlH6VJi1hKTXrcxlkIF+3anHqP1wvzpesVsqXFP6st4vGCvx970 +2cu+fjOlbpSD8DT6IavqjnKgP6TeMFvvhk1qlVtDRKgQFRzlAVfFmPHmBiiRqiDFt1MmUUOyCxGV +WOHAD3bZwI18gfNycJ5v/hqO2V81xrJvNHy+SE/iWjnX2J14np+GPgNeGYtEotXHAgMBAAGjQjBA +MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS/WSA2AHmgoCJrjNXy +YdK4LMuCSjANBgkqhkiG9w0BAQsFAAOCAQEAMQOiYQsfdOhyNsZt+U2e+iKo4YFWz827n+qrkRk4 +r6p8FU3ztqONpfSO9kSpp+ghla0+AGIWiPACuvxhI+YzmzB6azZie60EI4RYZeLbK4rnJVM3YlNf +vNoBYimipidx5joifsFvHZVwIEoHNN/q/xWA5brXethbdXwFeilHfkCoMRN3zUA7tFFHei4R40cR +3p1m0IvVVGb6g1XqfMIpiRvpb7PO4gWEyS8+eIVibslfwXhjdFjASBgMmTnrpMwatXlajRWc2BQN +9noHV8cigwUtPJslJj0Ys6lDfMjIq2SPDqO/nBudMNva0Bkuqjzx+zOAduTNrRlPBSeOE6Fuwg== +-----END CERTIFICATE----- + +Atos TrustedRoot 2011 +===================== +-----BEGIN CERTIFICATE----- +MIIDdzCCAl+gAwIBAgIIXDPLYixfszIwDQYJKoZIhvcNAQELBQAwPDEeMBwGA1UEAwwVQXRvcyBU +cnVzdGVkUm9vdCAyMDExMQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0xMTA3MDcxNDU4 +MzBaFw0zMDEyMzEyMzU5NTlaMDwxHjAcBgNVBAMMFUF0b3MgVHJ1c3RlZFJvb3QgMjAxMTENMAsG +A1UECgwEQXRvczELMAkGA1UEBhMCREUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCV +hTuXbyo7LjvPpvMpNb7PGKw+qtn4TaA+Gke5vJrf8v7MPkfoepbCJI419KkM/IL9bcFyYie96mvr +54rMVD6QUM+A1JX76LWC1BTFtqlVJVfbsVD2sGBkWXppzwO3bw2+yj5vdHLqqjAqc2K+SZFhyBH+ +DgMq92og3AIVDV4VavzjgsG1xZ1kCWyjWZgHJ8cblithdHFsQ/H3NYkQ4J7sVaE3IqKHBAUsR320 +HLliKWYoyrfhk/WklAOZuXCFteZI6o1Q/NnezG8HDt0Lcp2AMBYHlT8oDv3FdU9T1nSatCQujgKR +z3bFmx5VdJx4IbHwLfELn8LVlhgf8FQieowHAgMBAAGjfTB7MB0GA1UdDgQWBBSnpQaxLKYJYO7R +l+lwrrw7GWzbITAPBgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKelBrEspglg7tGX6XCuvDsZ +bNshMBgGA1UdIAQRMA8wDQYLKwYBBAGwLQMEAQEwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +CwUAA4IBAQAmdzTblEiGKkGdLD4GkGDEjKwLVLgfuXvTBznk+j57sj1O7Z8jvZfza1zv7v1Apt+h +k6EKhqzvINB5Ab149xnYJDE0BAGmuhWawyfc2E8PzBhj/5kPDpFrdRbhIfzYJsdHt6bPWHJxfrrh +TZVHO8mvbaG0weyJ9rQPOLXiZNwlz6bb65pcmaHFCN795trV1lpFDMS3wrUU77QR/w4VtfX128a9 +61qn8FYiqTxlVMYVqL2Gns2Dlmh6cYGJ4Qvh6hEbaAjMaZ7snkGeRDImeuKHCnE96+RapNLbxc3G +3mB/ufNPRJLvKrcYPqcZ2Qt9sTdBQrC6YB3y/gkRsPCHe6ed +-----END CERTIFICATE----- + +QuoVadis Root CA 1 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIUeFhfLq0sGUvjNwc1NBMotZbUZZMwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMSBHMzAeFw0xMjAxMTIxNzI3NDRaFw00MjAxMTIxNzI3NDRaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDEg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCgvlAQjunybEC0BJyFuTHK3C3kEakE +PBtVwedYMB0ktMPvhd6MLOHBPd+C5k+tR4ds7FtJwUrVu4/sh6x/gpqG7D0DmVIB0jWerNrwU8lm +PNSsAgHaJNM7qAJGr6Qc4/hzWHa39g6QDbXwz8z6+cZM5cOGMAqNF34168Xfuw6cwI2H44g4hWf6 +Pser4BOcBRiYz5P1sZK0/CPTz9XEJ0ngnjybCKOLXSoh4Pw5qlPafX7PGglTvF0FBM+hSo+LdoIN +ofjSxxR3W5A2B4GbPgb6Ul5jxaYA/qXpUhtStZI5cgMJYr2wYBZupt0lwgNm3fME0UDiTouG9G/l +g6AnhF4EwfWQvTA9xO+oabw4m6SkltFi2mnAAZauy8RRNOoMqv8hjlmPSlzkYZqn0ukqeI1RPToV +7qJZjqlc3sX5kCLliEVx3ZGZbHqfPT2YfF72vhZooF6uCyP8Wg+qInYtyaEQHeTTRCOQiJ/GKubX +9ZqzWB4vMIkIG1SitZgj7Ah3HJVdYdHLiZxfokqRmu8hqkkWCKi9YSgxyXSthfbZxbGL0eUQMk1f +iyA6PEkfM4VZDdvLCXVDaXP7a3F98N/ETH3Goy7IlXnLc6KOTk0k+17kBL5yG6YnLUlamXrXXAkg +t3+UuU/xDRxeiEIbEbfnkduebPRq34wGmAOtzCjvpUfzUwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUo5fW816iEOGrRZ88F2Q87gFwnMwwDQYJKoZI +hvcNAQELBQADggIBABj6W3X8PnrHX3fHyt/PX8MSxEBd1DKquGrX1RUVRpgjpeaQWxiZTOOtQqOC +MTaIzen7xASWSIsBx40Bz1szBpZGZnQdT+3Btrm0DWHMY37XLneMlhwqI2hrhVd2cDMT/uFPpiN3 +GPoajOi9ZcnPP/TJF9zrx7zABC4tRi9pZsMbj/7sPtPKlL92CiUNqXsCHKnQO18LwIE6PWThv6ct +Tr1NxNgpxiIY0MWscgKCP6o6ojoilzHdCGPDdRS5YCgtW2jgFqlmgiNR9etT2DGbe+m3nUvriBbP ++V04ikkwj+3x6xn0dxoxGE1nVGwvb2X52z3sIexe9PSLymBlVNFxZPT5pqOBMzYzcfCkeF9OrYMh +3jRJjehZrJ3ydlo28hP0r+AJx2EqbPfgna67hkooby7utHnNkDPDs3b69fBsnQGQ+p6Q9pxyz0fa +wx/kNSBT8lTR32GDpgLiJTjehTItXnOQUl1CxM49S+H5GYQd1aJQzEH7QRTDvdbJWqNjZgKAvQU6 +O0ec7AAmTPWIUb+oI38YB7AL7YsmoWTTYUrrXJ/es69nA7Mf3W1daWhpq1467HxpvMc7hU6eFbm0 +FU/DlXpY18ls6Wy58yljXrQs8C097Vpl4KlbQMJImYFtnh8GKjwStIsPm6Ik8KaN1nrgS7ZklmOV +hMJKzRwuJIczYOXD +-----END CERTIFICATE----- + +QuoVadis Root CA 2 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIURFc0JFuBiZs18s64KztbpybwdSgwDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMiBHMzAeFw0xMjAxMTIxODU5MzJaFw00MjAxMTIxODU5MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDIg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQChriWyARjcV4g/Ruv5r+LrI3HimtFh +ZiFfqq8nUeVuGxbULX1QsFN3vXg6YOJkApt8hpvWGo6t/x8Vf9WVHhLL5hSEBMHfNrMWn4rjyduY +NM7YMxcoRvynyfDStNVNCXJJ+fKH46nafaF9a7I6JaltUkSs+L5u+9ymc5GQYaYDFCDy54ejiK2t +oIz/pgslUiXnFgHVy7g1gQyjO/Dh4fxaXc6AcW34Sas+O7q414AB+6XrW7PFXmAqMaCvN+ggOp+o +MiwMzAkd056OXbxMmO7FGmh77FOm6RQ1o9/NgJ8MSPsc9PG/Srj61YxxSscfrf5BmrODXfKEVu+l +V0POKa2Mq1W/xPtbAd0jIaFYAI7D0GoT7RPjEiuA3GfmlbLNHiJuKvhB1PLKFAeNilUSxmn1uIZo +L1NesNKqIcGY5jDjZ1XHm26sGahVpkUG0CM62+tlXSoREfA7T8pt9DTEceT/AFr2XK4jYIVz8eQQ +sSWu1ZK7E8EM4DnatDlXtas1qnIhO4M15zHfeiFuuDIIfR0ykRVKYnLP43ehvNURG3YBZwjgQQvD +6xVu+KQZ2aKrr+InUlYrAoosFCT5v0ICvybIxo/gbjh9Uy3l7ZizlWNof/k19N+IxWA1ksB8aRxh +lRbQ694Lrz4EEEVlWFA4r0jyWbYW8jwNkALGcC4BrTwV1wIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQU7edvdlq/YOxJW8ald7tyFnGbxD0wDQYJKoZI +hvcNAQELBQADggIBAJHfgD9DCX5xwvfrs4iP4VGyvD11+ShdyLyZm3tdquXK4Qr36LLTn91nMX66 +AarHakE7kNQIXLJgapDwyM4DYvmL7ftuKtwGTTwpD4kWilhMSA/ohGHqPHKmd+RCroijQ1h5fq7K +pVMNqT1wvSAZYaRsOPxDMuHBR//47PERIjKWnML2W2mWeyAMQ0GaW/ZZGYjeVYg3UQt4XAoeo0L9 +x52ID8DyeAIkVJOviYeIyUqAHerQbj5hLja7NQ4nlv1mNDthcnPxFlxHBlRJAHpYErAK74X9sbgz +dWqTHBLmYF5vHX/JHyPLhGGfHoJE+V+tYlUkmlKY7VHnoX6XOuYvHxHaU4AshZ6rNRDbIl9qxV6X +U/IyAgkwo1jwDQHVcsaxfGl7w/U2Rcxhbl5MlMVerugOXou/983g7aEOGzPuVBj+D77vfoRrQ+Nw +mNtddbINWQeFFSM51vHfqSYP1kjHs6Yi9TM3WpVHn3u6GBVv/9YUZINJ0gpnIdsPNWNgKCLjsZWD +zYWm3S8P52dSbrsvhXz1SnPnxT7AvSESBT/8twNJAlvIJebiVDj1eYeMHVOyToV7BjjHLPj4sHKN +JeV3UvQDHEimUF+IIDBu8oJDqz2XhOdT+yHBTw8imoa4WSr2Rz0ZiC3oheGe7IUIarFsNMkd7Egr +O3jtZsSOeWmD3n+M +-----END CERTIFICATE----- + +QuoVadis Root CA 3 G3 +===================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIULvWbAiin23r/1aOp7r0DoM8Sah0wDQYJKoZIhvcNAQELBQAwSDELMAkG +A1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxHjAcBgNVBAMTFVF1b1ZhZGlzIFJv +b3QgQ0EgMyBHMzAeFw0xMjAxMTIyMDI2MzJaFw00MjAxMTIyMDI2MzJaMEgxCzAJBgNVBAYTAkJN +MRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMR4wHAYDVQQDExVRdW9WYWRpcyBSb290IENBIDMg +RzMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCzyw4QZ47qFJenMioKVjZ/aEzHs286 +IxSR/xl/pcqs7rN2nXrpixurazHb+gtTTK/FpRp5PIpM/6zfJd5O2YIyC0TeytuMrKNuFoM7pmRL +Mon7FhY4futD4tN0SsJiCnMK3UmzV9KwCoWdcTzeo8vAMvMBOSBDGzXRU7Ox7sWTaYI+FrUoRqHe +6okJ7UO4BUaKhvVZR74bbwEhELn9qdIoyhA5CcoTNs+cra1AdHkrAj80//ogaX3T7mH1urPnMNA3 +I4ZyYUUpSFlob3emLoG+B01vr87ERRORFHAGjx+f+IdpsQ7vw4kZ6+ocYfx6bIrc1gMLnia6Et3U +VDmrJqMz6nWB2i3ND0/kA9HvFZcba5DFApCTZgIhsUfei5pKgLlVj7WiL8DWM2fafsSntARE60f7 +5li59wzweyuxwHApw0BiLTtIadwjPEjrewl5qW3aqDCYz4ByA4imW0aucnl8CAMhZa634RylsSqi +Md5mBPfAdOhx3v89WcyWJhKLhZVXGqtrdQtEPREoPHtht+KPZ0/l7DxMYIBpVzgeAVuNVejH38DM +dyM0SXV89pgR6y3e7UEuFAUCf+D+IOs15xGsIs5XPd7JMG0QA4XN8f+MFrXBsj6IbGB/kE+V9/Yt +rQE5BwT6dYB9v0lQ7e/JxHwc64B+27bQ3RP+ydOc17KXqQIDAQABo0IwQDAPBgNVHRMBAf8EBTAD +AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUxhfQvKjqAkPyGwaZXSuQILnXnOQwDQYJKoZI +hvcNAQELBQADggIBADRh2Va1EodVTd2jNTFGu6QHcrxfYWLopfsLN7E8trP6KZ1/AvWkyaiTt3px +KGmPc+FSkNrVvjrlt3ZqVoAh313m6Tqe5T72omnHKgqwGEfcIHB9UqM+WXzBusnIFUBhynLWcKzS +t/Ac5IYp8M7vaGPQtSCKFWGafoaYtMnCdvvMujAWzKNhxnQT5WvvoxXqA/4Ti2Tk08HS6IT7SdEQ +TXlm66r99I0xHnAUrdzeZxNMgRVhvLfZkXdxGYFgu/BYpbWcC/ePIlUnwEsBbTuZDdQdm2NnL9Du +DcpmvJRPpq3t/O5jrFc/ZSXPsoaP0Aj/uHYUbt7lJ+yreLVTubY/6CD50qi+YUbKh4yE8/nxoGib +Ih6BJpsQBJFxwAYf3KDTuVan45gtf4Od34wrnDKOMpTwATwiKp9Dwi7DmDkHOHv8XgBCH/MyJnmD +hPbl8MFREsALHgQjDFSlTC9JxUrRtm5gDWv8a4uFJGS3iQ6rJUdbPM9+Sb3H6QrG2vd+DhcI00iX +0HGS8A85PjRqHH3Y8iKuu2n0M7SmSFXRDw4m6Oy2Cy2nhTXN/VnIn9HNPlopNLk9hM6xZdRZkZFW +dSHBd575euFgndOtBBj0fOtek49TSiIp+EgrPk2GrFt/ywaZWWDYWGWVjUTR939+J399roD1B0y2 +PpxxVJkES/1Y+Zj0 +-----END CERTIFICATE----- + +DigiCert Assured ID Root G2 +=========================== +-----BEGIN CERTIFICATE----- +MIIDljCCAn6gAwIBAgIQC5McOtY5Z+pnI7/Dr5r0SzANBgkqhkiG9w0BAQsFADBlMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQw +IgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIwHhcNMTMwODAxMTIwMDAwWhcNMzgw +MTE1MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQL +ExB3d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzIw +ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDZ5ygvUj82ckmIkzTz+GoeMVSAn61UQbVH +35ao1K+ALbkKz3X9iaV9JPrjIgwrvJUXCzO/GU1BBpAAvQxNEP4HteccbiJVMWWXvdMX0h5i89vq +bFCMP4QMls+3ywPgym2hFEwbid3tALBSfK+RbLE4E9HpEgjAALAcKxHad3A2m67OeYfcgnDmCXRw +VWmvo2ifv922ebPynXApVfSr/5Vh88lAbx3RvpO704gqu52/clpWcTs/1PPRCv4o76Pu2ZmvA9OP +YLfykqGxvYmJHzDNw6YuYjOuFgJ3RFrngQo8p0Quebg/BLxcoIfhG69Rjs3sLPr4/m3wOnyqi+Rn +lTGNAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTO +w0q5mVXyuNtgv6l+vVa1lzan1jANBgkqhkiG9w0BAQsFAAOCAQEAyqVVjOPIQW5pJ6d1Ee88hjZv +0p3GeDgdaZaikmkuOGybfQTUiaWxMTeKySHMq2zNixya1r9I0jJmwYrA8y8678Dj1JGG0VDjA9tz +d29KOVPt3ibHtX2vK0LRdWLjSisCx1BL4GnilmwORGYQRI+tBev4eaymG+g3NJ1TyWGqolKvSnAW +hsI6yLETcDbYz+70CjTVW0z9B5yiutkBclzzTcHdDrEcDcRjvq30FPuJ7KJBDkzMyFdA0G4Dqs0M +jomZmWzwPDCvON9vvKO+KSAnq3T/EyJ43pdSVR6DtVQgA+6uwE9W3jfMw3+qBCe703e4YtsXfJwo +IhNzbM8m9Yop5w== +-----END CERTIFICATE----- + +DigiCert Assured ID Root G3 +=========================== +-----BEGIN CERTIFICATE----- +MIICRjCCAc2gAwIBAgIQC6Fa+h3foLVJRK/NJKBs7DAKBggqhkjOPQQDAzBlMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSQwIgYD +VQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBlMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgRzMwdjAQ +BgcqhkjOPQIBBgUrgQQAIgNiAAQZ57ysRGXtzbg/WPuNsVepRC0FFfLvC/8QdJ+1YlJfZn4f5dwb +RXkLzMZTCp2NXQLZqVneAlr2lSoOjThKiknGvMYDOAdfVdp+CW7if17QRSAPWXYQ1qAk8C3eNvJs +KTmjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgGGMB0GA1UdDgQWBBTL0L2p4ZgF +UaFNN6KDec6NHSrkhDAKBggqhkjOPQQDAwNnADBkAjAlpIFFAmsSS3V0T8gj43DydXLefInwz5Fy +YZ5eEJJZVrmDxxDnOOlYJjZ91eQ0hjkCMHw2U/Aw5WJjOpnitqM7mzT6HtoQknFekROn3aRukswy +1vUhZscv6pZjamVFkpUBtA== +-----END CERTIFICATE----- + +DigiCert Global Root G2 +======================= +-----BEGIN CERTIFICATE----- +MIIDjjCCAnagAwIBAgIQAzrx5qcRqaC7KGSxHQn65TANBgkqhkiG9w0BAQsFADBhMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAw +HgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMjAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUx +MjAwMDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3 +dy5kaWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEcyMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuzfNNNx7a8myaJCtSnX/RrohCgiN9RlUyfuI2/Ou8jqJ +kTx65qsGGmvPrC3oXgkkRLpimn7Wo6h+4FR1IAWsULecYxpsMNzaHxmx1x7e/dfgy5SDN67sH0NO +3Xss0r0upS/kqbitOtSZpLYl6ZtrAGCSYP9PIUkY92eQq2EGnI/yuum06ZIya7XzV+hdG82MHauV +BJVJ8zUtluNJbd134/tJS7SsVQepj5WztCO7TG1F8PapspUwtP1MVYwnSlcUfIKdzXOS0xZKBgyM +UNGPHgm+F6HmIcr9g+UQvIOlCsRnKPZzFBQ9RnbDhxSJITRNrw9FDKZJobq7nMWxM4MphQIDAQAB +o0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUTiJUIBiV5uNu +5g/6+rkS7QYXjzkwDQYJKoZIhvcNAQELBQADggEBAGBnKJRvDkhj6zHd6mcY1Yl9PMWLSn/pvtsr +F9+wX3N3KjITOYFnQoQj8kVnNeyIv/iPsGEMNKSuIEyExtv4NeF22d+mQrvHRAiGfzZ0JFrabA0U +WTW98kndth/Jsw1HKj2ZL7tcu7XUIOGZX1NGFdtom/DzMNU+MeKNhJ7jitralj41E6Vf8PlwUHBH +QRFXGU7Aj64GxJUTFy8bJZ918rGOmaFvE7FBcf6IKshPECBV1/MUReXgRPTqh5Uykw7+U0b6LJ3/ +iyK5S9kJRaTepLiaWN0bfVKfjllDiIGknibVb63dDcY3fe0Dkhvld1927jyNxF1WW6LZZm6zNTfl +MrY= +-----END CERTIFICATE----- + +DigiCert Global Root G3 +======================= +-----BEGIN CERTIFICATE----- +MIICPzCCAcWgAwIBAgIQBVVWvPJepDU1w6QP1atFcjAKBggqhkjOPQQDAzBhMQswCQYDVQQGEwJV +UzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSAwHgYD +VQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBHMzAeFw0xMzA4MDExMjAwMDBaFw0zODAxMTUxMjAw +MDBaMGExCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5k +aWdpY2VydC5jb20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IEczMHYwEAYHKoZIzj0C +AQYFK4EEACIDYgAE3afZu4q4C/sLfyHS8L6+c/MzXRq8NOrexpu80JX28MzQC7phW1FGfp4tn+6O +YwwX7Adw9c+ELkCDnOg/QW07rdOkFFk2eJ0DQ+4QE2xy3q6Ip6FrtUPOZ9wj/wMco+I+o0IwQDAP +BgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUs9tIpPmhxdiuNkHMEWNp +Yim8S8YwCgYIKoZIzj0EAwMDaAAwZQIxAK288mw/EkrRLTnDCgmXc/SINoyIJ7vmiI1Qhadj+Z4y +3maTD/HMsQmP3Wyr+mt/oAIwOWZbwmSNuJ5Q3KjVSaLtx9zRSX8XAbjIho9OjIgrqJqpisXRAL34 +VOKa5Vt8sycX +-----END CERTIFICATE----- + +DigiCert Trusted Root G4 +======================== +-----BEGIN CERTIFICATE----- +MIIFkDCCA3igAwIBAgIQBZsbV56OITLiOQe9p3d1XDANBgkqhkiG9w0BAQwFADBiMQswCQYDVQQG +EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNlcnQuY29tMSEw +HwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwHhcNMTMwODAxMTIwMDAwWhcNMzgwMTE1 +MTIwMDAwWjBiMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 +d3cuZGlnaWNlcnQuY29tMSEwHwYDVQQDExhEaWdpQ2VydCBUcnVzdGVkIFJvb3QgRzQwggIiMA0G +CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC/5pBzaN675F1KPDAiMGkz7MKnJS7JIT3yithZwuEp +pz1Yq3aaza57G4QNxDAf8xukOBbrVsaXbR2rsnnyyhHS5F/WBTxSD1Ifxp4VpX6+n6lXFllVcq9o +k3DCsrp1mWpzMpTREEQQLt+C8weE5nQ7bXHiLQwb7iDVySAdYyktzuxeTsiT+CFhmzTrBcZe7Fsa +vOvJz82sNEBfsXpm7nfISKhmV1efVFiODCu3T6cw2Vbuyntd463JT17lNecxy9qTXtyOj4DatpGY +QJB5w3jHtrHEtWoYOAMQjdjUN6QuBX2I9YI+EJFwq1WCQTLX2wRzKm6RAXwhTNS8rhsDdV14Ztk6 +MUSaM0C/CNdaSaTC5qmgZ92kJ7yhTzm1EVgX9yRcRo9k98FpiHaYdj1ZXUJ2h4mXaXpI8OCiEhtm +mnTK3kse5w5jrubU75KSOp493ADkRSWJtppEGSt+wJS00mFt6zPZxd9LBADMfRyVw4/3IbKyEbe7 +f/LVjHAsQWCqsWMYRJUadmJ+9oCw++hkpjPRiQfhvbfmQ6QYuKZ3AeEPlAwhHbJUKSWJbOUOUlFH +dL4mrLZBdd56rF+NP8m800ERElvlEFDrMcXKchYiCd98THU/Y+whX8QgUWtvsauGi0/C1kVfnSD8 +oR7FwI+isX4KJpn15GkvmB0t9dmpsh3lGwIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud +DwEB/wQEAwIBhjAdBgNVHQ4EFgQU7NfjgtJxXWRM3y5nP+e6mK4cD08wDQYJKoZIhvcNAQEMBQAD +ggIBALth2X2pbL4XxJEbw6GiAI3jZGgPVs93rnD5/ZpKmbnJeFwMDF/k5hQpVgs2SV1EY+CtnJYY +ZhsjDT156W1r1lT40jzBQ0CuHVD1UvyQO7uYmWlrx8GnqGikJ9yd+SeuMIW59mdNOj6PWTkiU0Tr +yF0Dyu1Qen1iIQqAyHNm0aAFYF/opbSnr6j3bTWcfFqK1qI4mfN4i/RN0iAL3gTujJtHgXINwBQy +7zBZLq7gcfJW5GqXb5JQbZaNaHqasjYUegbyJLkJEVDXCLG4iXqEI2FCKeWjzaIgQdfRnGTZ6iah +ixTXTBmyUEFxPT9NcCOGDErcgdLMMpSEDQgJlxxPwO5rIHQw0uA5NBCFIRUBCOhVMt5xSdkoF1BN +5r5N0XWs0Mr7QbhDparTwwVETyw2m+L64kW4I1NsBm9nVX9GtUw/bihaeSbSpKhil9Ie4u1Ki7wb +/UdKDd9nZn6yW0HQO+T0O/QEY+nvwlQAUaCKKsnOeMzV6ocEGLPOr0mIr/OSmbaz5mEP0oUA51Aa +5BuVnRmhuZyxm7EAHu/QD09CbMkKvO5D+jpxpchNJqU1/YldvIViHTLSoCtU7ZpXwdv6EM8Zt4tK +G48BtieVU+i2iW1bvGjUI+iLUaJW+fCmgKDWHrO8Dw9TdSmq6hN35N6MgSGtBxBHEa2HPQfRdbzP +82Z+ +-----END CERTIFICATE----- + +WoSign +====== +-----BEGIN CERTIFICATE----- +MIIFdjCCA16gAwIBAgIQXmjWEXGUY1BWAGjzPsnFkTANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxKjAoBgNVBAMTIUNlcnRpZmljYXRpb24g +QXV0aG9yaXR5IG9mIFdvU2lnbjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMFUxCzAJ +BgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEqMCgGA1UEAxMhQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkgb2YgV29TaWduMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA +vcqNrLiRFVaXe2tcesLea9mhsMMQI/qnobLMMfo+2aYpbxY94Gv4uEBf2zmoAHqLoE1UfcIiePyO +CbiohdfMlZdLdNiefvAA5A6JrkkoRBoQmTIPJYhTpA2zDxIIFgsDcSccf+Hb0v1naMQFXQoOXXDX +2JegvFNBmpGN9J42Znp+VsGQX+axaCA2pIwkLCxHC1l2ZjC1vt7tj/id07sBMOby8w7gLJKA84X5 +KIq0VC6a7fd2/BVoFutKbOsuEo/Uz/4Mx1wdC34FMr5esAkqQtXJTpCzWQ27en7N1QhatH/YHGkR ++ScPewavVIMYe+HdVHpRaG53/Ma/UkpmRqGyZxq7o093oL5d//xWC0Nyd5DKnvnyOfUNqfTq1+ez +EC8wQjchzDBwyYaYD8xYTYO7feUapTeNtqwylwA6Y3EkHp43xP901DfA4v6IRmAR3Qg/UDaruHqk +lWJqbrDKaiFaafPz+x1wOZXzp26mgYmhiMU7ccqjUu6Du/2gd/Tkb+dC221KmYo0SLwX3OSACCK2 +8jHAPwQ+658geda4BmRkAjHXqc1S+4RFaQkAKtxVi8QGRkvASh0JWzko/amrzgD5LkhLJuYwTKVY +yrREgk/nkR4zw7CT/xH8gdLKH3Ep3XZPkiWvHYG3Dy+MwwbMLyejSuQOmbp8HkUff6oZRZb9/D0C +AwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFOFmzw7R +8bNLtwYgFP6HEtX2/vs+MA0GCSqGSIb3DQEBBQUAA4ICAQCoy3JAsnbBfnv8rWTjMnvMPLZdRtP1 +LOJwXcgu2AZ9mNELIaCJWSQBnfmvCX0KI4I01fx8cpm5o9dU9OpScA7F9dY74ToJMuYhOZO9sxXq +T2r09Ys/L3yNWC7F4TmgPsc9SnOeQHrAK2GpZ8nzJLmzbVUsWh2eJXLOC62qx1ViC777Y7NhRCOj +y+EaDveaBk3e1CNOIZZbOVtXHS9dCF4Jef98l7VNg64N1uajeeAz0JmWAjCnPv/So0M/BVoG6kQC +2nz4SNAzqfkHx5Xh9T71XXG68pWpdIhhWeO/yloTunK0jF02h+mmxTwTv97QRCbut+wucPrXnbes +5cVAWubXbHssw1abR80LzvobtCHXt2a49CUwi1wNuepnsvRtrtWhnk/Yn+knArAdBtaP4/tIEp9/ +EaEQPkxROpaw0RPxx9gmrjrKkcRpnd8BKWRRb2jaFOwIQZeQjdCygPLPwj2/kWjFgGcexGATVdVh +mVd8upUPYUk6ynW8yQqTP2cOEvIo4jEbwFcW3wh8GcF+Dx+FHgo2fFt+J7x6v+Db9NpSvd4MVHAx +kUOVyLzwPt0JfjBkUO1/AaQzZ01oT74V77D2AhGiGxMlOtzCWfHjXEa7ZywCRuoeSKbmW9m1vFGi +kpbbqsY3Iqb+zCB0oy2pLmvLwIIRIbWTee5Ehr7XHuQe+w== +-----END CERTIFICATE----- + +WoSign China +============ +-----BEGIN CERTIFICATE----- +MIIFWDCCA0CgAwIBAgIQUHBrzdgT/BtOOzNy0hFIjTANBgkqhkiG9w0BAQsFADBGMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMMEkNBIOayg+mAmuagueiv +geS5pjAeFw0wOTA4MDgwMTAwMDFaFw0zOTA4MDgwMTAwMDFaMEYxCzAJBgNVBAYTAkNOMRowGAYD +VQQKExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAwwSQ0Eg5rKD6YCa5qC56K+B5LmmMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0EkhHiX8h8EqwqzbdoYGTufQdDTc7WU1/FDWiD+k +8H/rD195L4mx/bxjWDeTmzj4t1up+thxx7S8gJeNbEvxUNUqKaqoGXqW5pWOdO2XCld19AXbbQs5 +uQF/qvbW2mzmBeCkTVL829B0txGMe41P/4eDrv8FAxNXUDf+jJZSEExfv5RxadmWPgxDT74wwJ85 +dE8GRV2j1lY5aAfMh09Qd5Nx2UQIsYo06Yms25tO4dnkUkWMLhQfkWsZHWgpLFbE4h4TV2TwYeO5 +Ed+w4VegG63XX9Gv2ystP9Bojg/qnw+LNVgbExz03jWhCl3W6t8Sb8D7aQdGctyB9gQjF+BNdeFy +b7Ao65vh4YOhn0pdr8yb+gIgthhid5E7o9Vlrdx8kHccREGkSovrlXLp9glk3Kgtn3R46MGiCWOc +76DbT52VqyBPt7D3h1ymoOQ3OMdc4zUPLK2jgKLsLl3Az+2LBcLmc272idX10kaO6m1jGx6KyX2m ++Jzr5dVjhU1zZmkR/sgO9MHHZklTfuQZa/HpelmjbX7FF+Ynxu8b22/8DU0GAbQOXDBGVWCvOGU6 +yke6rCzMRh+yRpY/8+0mBe53oWprfi1tWFxK1I5nuPHa1UaKJ/kR8slC/k7e3x9cxKSGhxYzoacX +GKUN5AXlK8IrC6KVkLn9YDxOiT7nnO4fuwECAwEAAaNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1Ud +EwEB/wQFMAMBAf8wHQYDVR0OBBYEFOBNv9ybQV0T6GTwp+kVpOGBwboxMA0GCSqGSIb3DQEBCwUA +A4ICAQBqinA4WbbaixjIvirTthnVZil6Xc1bL3McJk6jfW+rtylNpumlEYOnOXOvEESS5iVdT2H6 +yAa+Tkvv/vMx/sZ8cApBWNromUuWyXi8mHwCKe0JgOYKOoICKuLJL8hWGSbueBwj/feTZU7n85iY +r83d2Z5AiDEoOqsuC7CsDCT6eiaY8xJhEPRdF/d+4niXVOKM6Cm6jBAyvd0zaziGfjk9DgNyp115 +j0WKWa5bIW4xRtVZjc8VX90xJc/bYNaBRHIpAlf2ltTW/+op2znFuCyKGo3Oy+dCMYYFaA6eFN0A +kLppRQjbbpCBhqcqBT/mhDn4t/lXX0ykeVoQDF7Va/81XwVRHmyjdanPUIPTfPRm94KNPQx96N97 +qA4bLJyuQHCH2u2nFoJavjVsIE4iYdm8UXrNemHcSxH5/mc0zy4EZmFcV5cjjPOGG0jfKq+nwf/Y +jj4Du9gqsPoUJbJRa4ZDhS4HIxaAjUz7tGM7zMN07RujHv41D198HRaG9Q7DlfEvr10lO1Hm13ZB +ONFLAzkopR6RctR9q5czxNM+4Gm2KHmgCY0c0f9BckgG/Jou5yD5m6Leie2uPAmvylezkolwQOQv +T8Jwg0DXJCxr5wkf09XHwQj02w47HAcLQxGEIYbpgNR12KvxAmLBsX5VYc8T1yaw15zLKYs4SgsO +kI26oQ== +-----END CERTIFICATE----- + +COMODO RSA Certification Authority +================================== +-----BEGIN CERTIFICATE----- +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 +LaZRfyHBNVOFBkpdn627G190 +-----END CERTIFICATE----- + +USERTrust RSA Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +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 +Q+6IHdfGjjxDah2nGN59PRbxYvnKkKj9 +-----END CERTIFICATE----- + +USERTrust ECC Certification Authority +===================================== +-----BEGIN CERTIFICATE----- +MIICjzCCAhWgAwIBAgIQXIuZxVqUxdJxVt7NiYDMJjAKBggqhkjOPQQDAzCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwHhcNMTAwMjAxMDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBiDELMAkGA1UEBhMC +VVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxFDASBgNVBAcTC0plcnNleSBDaXR5MR4wHAYDVQQKExVU +aGUgVVNFUlRSVVNUIE5ldHdvcmsxLjAsBgNVBAMTJVVTRVJUcnVzdCBFQ0MgQ2VydGlmaWNhdGlv +biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQarFRaqfloI+d61SRvU8Za2EurxtW2 +0eZzca7dnNYMYf3boIkDuAUU7FfO7l0/4iGzzvfUinngo4N+LZfQYcTxmdwlkWOrfzCjtHDix6Ez +nPO/LlxTsV+zfTJ/ijTjeXmjQjBAMB0GA1UdDgQWBBQ64QmG1M8ZwpZ2dEl23OA1xmNjmjAOBgNV +HQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjA2Z6EWCNzklwBB +HU6+4WMBzzuqQhFkoJ2UOQIReVx7Hfpkue4WQrO/isIJxOzksU0CMQDpKmFHjFJKS04YcPbWRNZu +9YO6bVi9JNlWSOrvxKJGgYhqOkbRqZtNyWHa0V1Xahg= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R4 +=========================== +-----BEGIN CERTIFICATE----- +MIIB4TCCAYegAwIBAgIRKjikHJYKBN5CsiilC+g0mAIwCgYIKoZIzj0EAwIwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI0MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEuMZ5049sJQ6fLjkZHAOkrprl +OQcJFspjsbmG+IpXwVfOQvpzofdlQv8ewQCybnMO/8ch5RikqtlxP6jUuc6MHaNCMEAwDgYDVR0P +AQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFFSwe61FuOJAf/sKbvu+M8k8o4TV +MAoGCCqGSM49BAMCA0gAMEUCIQDckqGgE6bPA7DmxCGXkPoUVy0D7O48027KqGx2vKLeuwIgJ6iF +JzWbVsaj8kfSt24bAgAXqmemFZHe+pTsewv4n4Q= +-----END CERTIFICATE----- + +GlobalSign ECC Root CA - R5 +=========================== +-----BEGIN CERTIFICATE----- +MIICHjCCAaSgAwIBAgIRYFlJ4CYuu1X5CneKcflK2GwwCgYIKoZIzj0EAwMwUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMB4XDTEyMTExMzAwMDAwMFoXDTM4MDExOTAzMTQwN1owUDEkMCIGA1UECxMb +R2xvYmFsU2lnbiBFQ0MgUm9vdCBDQSAtIFI1MRMwEQYDVQQKEwpHbG9iYWxTaWduMRMwEQYDVQQD +EwpHbG9iYWxTaWduMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAER0UOlvt9Xb/pOdEh+J8LttV7HpI6 +SFkc8GIxLcB6KP4ap1yztsyX50XUWPrRd21DosCHZTQKH3rd6zwzocWdTaRvQZU4f8kehOvRnkmS +h5SHDDqFSmafnVmTTZdhBoZKo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQUPeYpSJvqB8ohREom3m7e0oPQn1kwCgYIKoZIzj0EAwMDaAAwZQIxAOVpEslu28Yx +uglB4Zf4+/2a4n0Sye18ZNPLBSWLVtmg515dTguDnFt2KaAJJiFqYgIwcdK1j1zqO+F4CYWodZI7 +yFz9SO8NdCKoCOJuxUnOxwy8p2Fp8fc74SrL+SvzZpA3 +-----END CERTIFICATE----- + +Staat der Nederlanden Root CA - G3 +================================== +-----BEGIN CERTIFICATE----- +MIIFdDCCA1ygAwIBAgIEAJiiOTANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +Um9vdCBDQSAtIEczMB4XDTEzMTExNDExMjg0MloXDTI4MTExMzIzMDAwMFowWjELMAkGA1UEBhMC +TkwxHjAcBgNVBAoMFVN0YWF0IGRlciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5l +ZGVybGFuZGVuIFJvb3QgQ0EgLSBHMzCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAL4y +olQPcPssXFnrbMSkUeiFKrPMSjTysF/zDsccPVMeiAho2G89rcKezIJnByeHaHE6n3WWIkYFsO2t +x1ueKt6c/DrGlaf1F2cY5y9JCAxcz+bMNO14+1Cx3Gsy8KL+tjzk7FqXxz8ecAgwoNzFs21v0IJy +EavSgWhZghe3eJJg+szeP4TrjTgzkApyI/o1zCZxMdFyKJLZWyNtZrVtB0LrpjPOktvA9mxjeM3K +Tj215VKb8b475lRgsGYeCasH/lSJEULR9yS6YHgamPfJEf0WwTUaVHXvQ9Plrk7O53vDxk5hUUur +mkVLoR9BvUhTFXFkC4az5S6+zqQbwSmEorXLCCN2QyIkHxcE1G6cxvx/K2Ya7Irl1s9N9WMJtxU5 +1nus6+N86U78dULI7ViVDAZCopz35HCz33JvWjdAidiFpNfxC95DGdRKWCyMijmev4SH8RY7Ngzp +07TKbBlBUgmhHbBqv4LvcFEhMtwFdozL92TkA1CvjJFnq8Xy7ljY3r735zHPbMk7ccHViLVlvMDo +FxcHErVc0qsgk7TmgoNwNsXNo42ti+yjwUOH5kPiNL6VizXtBznaqB16nzaeErAMZRKQFWDZJkBE +41ZgpRDUajz9QdwOWke275dhdU/Z/seyHdTtXUmzqWrLZoQT1Vyg3N9udwbRcXXIV2+vD3dbAgMB +AAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRUrfrHkleu +yjWcLhL75LpdINyUVzANBgkqhkiG9w0BAQsFAAOCAgEAMJmdBTLIXg47mAE6iqTnB/d6+Oea31BD +U5cqPco8R5gu4RV78ZLzYdqQJRZlwJ9UXQ4DO1t3ApyEtg2YXzTdO2PCwyiBwpwpLiniyMMB8jPq +KqrMCQj3ZWfGzd/TtiunvczRDnBfuCPRy5FOCvTIeuXZYzbB1N/8Ipf3YF3qKS9Ysr1YvY2WTxB1 +v0h7PVGHoTx0IsL8B3+A3MSs/mrBcDCw6Y5p4ixpgZQJut3+TcCDjJRYwEYgr5wfAvg1VUkvRtTA +8KCWAg8zxXHzniN9lLf9OtMJgwYh/WA9rjLA0u6NpvDntIJ8CsxwyXmA+P5M9zWEGYox+wrZ13+b +8KKaa8MFSu1BYBQw0aoRQm7TIwIEC8Zl3d1Sd9qBa7Ko+gE4uZbqKmxnl4mUnrzhVNXkanjvSr0r +mj1AfsbAddJu+2gw7OyLnflJNZoaLNmzlTnVHpL3prllL+U9bTpITAjc5CgSKL59NVzq4BZ+Extq +1z7XnvwtdbLBFNUjA9tbbws+eC8N3jONFrdI54OagQ97wUNNVQQXOEpR1VmiiXTTn74eS9fGbbeI +JG9gkaSChVtWQbzQRKtqE77RLFi3EjNYsjdj3BP1lB0/QFH1T/U67cjF68IeHRaVesd+QnGTbksV +tzDfqu1XhUisHWrdOWnk4Xl4vs4Fv6EM94B7IWcnMFk= +-----END CERTIFICATE----- + +Staat der Nederlanden EV Root CA +================================ +-----BEGIN CERTIFICATE----- +MIIFcDCCA1igAwIBAgIEAJiWjTANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQGEwJOTDEeMBwGA1UE +CgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSkwJwYDVQQDDCBTdGFhdCBkZXIgTmVkZXJsYW5kZW4g +RVYgUm9vdCBDQTAeFw0xMDEyMDgxMTE5MjlaFw0yMjEyMDgxMTEwMjhaMFgxCzAJBgNVBAYTAk5M +MR4wHAYDVQQKDBVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xKTAnBgNVBAMMIFN0YWF0IGRlciBOZWRl +cmxhbmRlbiBFViBSb290IENBMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA48d+ifkk +SzrSM4M1LGns3Amk41GoJSt5uAg94JG6hIXGhaTK5skuU6TJJB79VWZxXSzFYGgEt9nCUiY4iKTW +O0Cmws0/zZiTs1QUWJZV1VD+hq2kY39ch/aO5ieSZxeSAgMs3NZmdO3dZ//BYY1jTw+bbRcwJu+r +0h8QoPnFfxZpgQNH7R5ojXKhTbImxrpsX23Wr9GxE46prfNeaXUmGD5BKyF/7otdBwadQ8QpCiv8 +Kj6GyzyDOvnJDdrFmeK8eEEzduG/L13lpJhQDBXd4Pqcfzho0LKmeqfRMb1+ilgnQ7O6M5HTp5gV +XJrm0w912fxBmJc+qiXbj5IusHsMX/FjqTf5m3VpTCgmJdrV8hJwRVXj33NeN/UhbJCONVrJ0yPr +08C+eKxCKFhmpUZtcALXEPlLVPxdhkqHz3/KRawRWrUgUY0viEeXOcDPusBCAUCZSCELa6fS/ZbV +0b5GnUngC6agIk440ME8MLxwjyx1zNDFjFE7PZQIZCZhfbnDZY8UnCHQqv0XcgOPvZuM5l5Tnrmd +74K74bzickFbIZTTRTeU0d8JOV3nI6qaHcptqAqGhYqCvkIH1vI4gnPah1vlPNOePqc7nvQDs/nx +fRN0Av+7oeX6AHkcpmZBiFxgV6YuCcS6/ZrPpx9Aw7vMWgpVSzs4dlG4Y4uElBbmVvMCAwEAAaNC +MEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFP6rAJCYniT8qcwa +ivsnuL8wbqg7MA0GCSqGSIb3DQEBCwUAA4ICAQDPdyxuVr5Os7aEAJSrR8kN0nbHhp8dB9O2tLsI +eK9p0gtJ3jPFrK3CiAJ9Brc1AsFgyb/E6JTe1NOpEyVa/m6irn0F3H3zbPB+po3u2dfOWBfoqSmu +c0iH55vKbimhZF8ZE/euBhD/UcabTVUlT5OZEAFTdfETzsemQUHSv4ilf0X8rLiltTMMgsT7B/Zq +5SWEXwbKwYY5EdtYzXc7LMJMD16a4/CrPmEbUCTCwPTxGfARKbalGAKb12NMcIxHowNDXLldRqAN +b/9Zjr7dn3LDWyvfjFvO5QxGbJKyCqNMVEIYFRIYvdr8unRu/8G2oGTYqV9Vrp9canaW2HNnh/tN +f1zuacpzEPuKqf2evTY4SUmH9A4U8OmHuD+nT3pajnnUk+S7aFKErGzp85hwVXIy+TSrK0m1zSBi +5Dp6Z2Orltxtrpfs/J92VoguZs9btsmksNcFuuEnL5O7Jiqik7Ab846+HUCjuTaPPoIaGl6I6lD4 +WeKDRikL40Rc4ZW2aZCaFG+XroHPaO+Zmr615+F/+PoTRxZMzG0IQOeLeG9QgkRQP2YGiqtDhFZK +DyAthg710tvSeopLzaXoTvFeJiUBWSOgftL2fiFX1ye8FVdMpEbB4IMeDExNH08GGeL5qPQ6gqGy +eUN51q1veieQA6TqJIc/2b3Z6fJfUEkc7uzXLg== +-----END CERTIFICATE----- + +IdenTrust Commercial Root CA 1 +============================== +-----BEGIN CERTIFICATE----- +MIIFYDCCA0igAwIBAgIQCgFCgAAAAUUjyES1AAAAAjANBgkqhkiG9w0BAQsFADBKMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBS +b290IENBIDEwHhcNMTQwMTE2MTgxMjIzWhcNMzQwMTE2MTgxMjIzWjBKMQswCQYDVQQGEwJVUzES +MBAGA1UEChMJSWRlblRydXN0MScwJQYDVQQDEx5JZGVuVHJ1c3QgQ29tbWVyY2lhbCBSb290IENB +IDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCnUBneP5k91DNG8W9RYYKyqU+PZ4ld +hNlT3Qwo2dfw/66VQ3KZ+bVdfIrBQuExUHTRgQ18zZshq0PirK1ehm7zCYofWjK9ouuU+ehcCuz/ +mNKvcbO0U59Oh++SvL3sTzIwiEsXXlfEU8L2ApeN2WIrvyQfYo3fw7gpS0l4PJNgiCL8mdo2yMKi +1CxUAGc1bnO/AljwpN3lsKImesrgNqUZFvX9t++uP0D1bVoE/c40yiTcdCMbXTMTEl3EASX2MN0C +XZ/g1Ue9tOsbobtJSdifWwLziuQkkORiT0/Br4sOdBeo0XKIanoBScy0RnnGF7HamB4HWfp1IYVl +3ZBWzvurpWCdxJ35UrCLvYf5jysjCiN2O/cz4ckA82n5S6LgTrx+kzmEB/dEcH7+B1rlsazRGMzy +NeVJSQjKVsk9+w8YfYs7wRPCTY/JTw436R+hDmrfYi7LNQZReSzIJTj0+kuniVyc0uMNOYZKdHzV +WYfCP04MXFL0PfdSgvHqo6z9STQaKPNBiDoT7uje/5kdX7rL6B7yuVBgwDHTc+XvvqDtMwt0viAg +xGds8AgDelWAf0ZOlqf0Hj7h9tgJ4TNkK2PXMl6f+cB7D3hvl7yTmvmcEpB4eoCHFddydJxVdHix +uuFucAS6T6C6aMN7/zHwcz09lCqxC0EOoP5NiGVreTO01wIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU7UQZwNPwBovupHu+QucmVMiONnYwDQYJKoZI +hvcNAQELBQADggIBAA2ukDL2pkt8RHYZYR4nKM1eVO8lvOMIkPkp165oCOGUAFjvLi5+U1KMtlwH +6oi6mYtQlNeCgN9hCQCTrQ0U5s7B8jeUeLBfnLOic7iPBZM4zY0+sLj7wM+x8uwtLRvM7Kqas6pg +ghstO8OEPVeKlh6cdbjTMM1gCIOQ045U8U1mwF10A0Cj7oV+wh93nAbowacYXVKV7cndJZ5t+qnt +ozo00Fl72u1Q8zW/7esUTTHHYPTa8Yec4kjixsU3+wYQ+nVZZjFHKdp2mhzpgq7vmrlR94gjmmmV +YjzlVYA211QC//G5Xc7UI2/YRYRKW2XviQzdFKcgyxilJbQN+QHwotL0AMh0jqEqSI5l2xPE4iUX +feu+h1sXIFRRk0pTAwvsXcoz7WL9RccvW9xYoIA55vrX/hMUpu09lEpCdNTDd1lzzY9GvlU47/ro +kTLql1gEIt44w8y8bckzOmoKaT+gyOpyj4xjhiO9bTyWnpXgSUyqorkqG5w2gXjtw+hG4iZZRHUe +2XWJUc0QhJ1hYMtd+ZciTY6Y5uN/9lu7rs3KSoFrXgvzUeF0K+l+J6fZmUlO+KWA2yUPHGNiiskz +Z2s8EIPGrd6ozRaOjfAHN3Gf8qv8QfXBi+wAN10J5U6A7/qxXDgGpRtK4dw4LTzcqx+QGtVKnO7R +cGzM7vRX+Bi6hG6H +-----END CERTIFICATE----- + +IdenTrust Public Sector Root CA 1 +================================= +-----BEGIN CERTIFICATE----- +MIIFZjCCA06gAwIBAgIQCgFCgAAAAUUjz0Z8AAAAAjANBgkqhkiG9w0BAQsFADBNMQswCQYDVQQG +EwJVUzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3Rv +ciBSb290IENBIDEwHhcNMTQwMTE2MTc1MzMyWhcNMzQwMTE2MTc1MzMyWjBNMQswCQYDVQQGEwJV +UzESMBAGA1UEChMJSWRlblRydXN0MSowKAYDVQQDEyFJZGVuVHJ1c3QgUHVibGljIFNlY3RvciBS +b290IENBIDEwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2IpT8pEiv6EdrCvsnduTy +P4o7ekosMSqMjbCpwzFrqHd2hCa2rIFCDQjrVVi7evi8ZX3yoG2LqEfpYnYeEe4IFNGyRBb06tD6 +Hi9e28tzQa68ALBKK0CyrOE7S8ItneShm+waOh7wCLPQ5CQ1B5+ctMlSbdsHyo+1W/CD80/HLaXI +rcuVIKQxKFdYWuSNG5qrng0M8gozOSI5Cpcu81N3uURF/YTLNiCBWS2ab21ISGHKTN9T0a9SvESf +qy9rg3LvdYDaBjMbXcjaY8ZNzaxmMc3R3j6HEDbhuaR672BQssvKplbgN6+rNBM5Jeg5ZuSYeqoS +mJxZZoY+rfGwyj4GD3vwEUs3oERte8uojHH01bWRNszwFcYr3lEXsZdMUD2xlVl8BX0tIdUAvwFn +ol57plzy9yLxkA2T26pEUWbMfXYD62qoKjgZl3YNa4ph+bz27nb9cCvdKTz4Ch5bQhyLVi9VGxyh +LrXHFub4qjySjmm2AcG1hp2JDws4lFTo6tyePSW8Uybt1as5qsVATFSrsrTZ2fjXctscvG29ZV/v +iDUqZi/u9rNl8DONfJhBaUYPQxxp+pu10GFqzcpL2UyQRqsVWaFHVCkugyhfHMKiq3IXAAaOReyL +4jM9f9oZRORicsPfIsbyVtTdX5Vy7W1f90gDW/3FKqD2cyOEEBsB5wIDAQABo0IwQDAOBgNVHQ8B +Af8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU43HgntinQtnbcZFrlJPrw6PRFKMw +DQYJKoZIhvcNAQELBQADggIBAEf63QqwEZE4rU1d9+UOl1QZgkiHVIyqZJnYWv6IAcVYpZmxI1Qj +t2odIFflAWJBF9MJ23XLblSQdf4an4EKwt3X9wnQW3IV5B4Jaj0z8yGa5hV+rVHVDRDtfULAj+7A +mgjVQdZcDiFpboBhDhXAuM/FSRJSzL46zNQuOAXeNf0fb7iAaJg9TaDKQGXSc3z1i9kKlT/YPyNt +GtEqJBnZhbMX73huqVjRI9PHE+1yJX9dsXNw0H8GlwmEKYBhHfpe/3OsoOOJuBxxFcbeMX8S3OFt +m6/n6J91eEyrRjuazr8FGF1NFTwWmhlQBJqymm9li1JfPFgEKCXAZmExfrngdbkaqIHWchezxQMx +NRF4eKLg6TCMf4DfWN88uieW4oA0beOY02QnrEh+KHdcxiVhJfiFDGX6xDIvpZgF5PgLZxYWxoK4 +Mhn5+bl53B/N66+rDt0b20XkeucC4pVd/GnwU2lhlXV5C15V5jgclKlZM57IcXR5f1GJtshquDDI +ajjDbp7hNxbqBWJMWxJH7ae0s1hWx0nzfxJoCTFx8G34Tkf71oXuxVhAGaQdp/lLQzfcaFpPz+vC +ZHTetBXZ9FRUGi8c15dxVJCO2SCdUyt/q4/i6jC8UDfv8Ue1fXwsBOxonbRJRBD0ckscZOf85muQ +3Wl9af0AVqW3rLatt8o+Ae+c +-----END CERTIFICATE----- + +Entrust Root Certification Authority - G2 +========================================= +-----BEGIN CERTIFICATE----- +MIIEPjCCAyagAwIBAgIESlOMKDANBgkqhkiG9w0BAQsFADCBvjELMAkGA1UEBhMCVVMxFjAUBgNV +BAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVy +bXMxOTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ug +b25seTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIw +HhcNMDkwNzA3MTcyNTU0WhcNMzAxMjA3MTc1NTU0WjCBvjELMAkGA1UEBhMCVVMxFjAUBgNVBAoT +DUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVnYWwtdGVybXMx +OTA3BgNVBAsTMChjKSAyMDA5IEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXplZCB1c2Ugb25s +eTEyMDAGA1UEAxMpRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5IC0gRzIwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC6hLZy254Ma+KZ6TABp3bqMriVQRrJ2mFOWHLP +/vaCeb9zYQYKpSfYs1/TRU4cctZOMvJyig/3gxnQaoCAAEUesMfnmr8SVycco2gvCoe9amsOXmXz +HHfV1IWNcCG0szLni6LVhjkCsbjSR87kyUnEO6fe+1R9V77w6G7CebI6C1XiUJgWMhNcL3hWwcKU +s/Ja5CeanyTXxuzQmyWC48zCxEXFjJd6BmsqEZ+pCm5IO2/b1BEZQvePB7/1U1+cPvQXLOZprE4y +TGJ36rfo5bs0vBmLrpxR57d+tVOxMyLlbc9wPBr64ptntoP0jaWvYkxN4FisZDQSA/i2jZRjJKRx +AgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqciZ6 +0B7vfec7aVHUbI2fkBJmqzANBgkqhkiG9w0BAQsFAAOCAQEAeZ8dlsa2eT8ijYfThwMEYGprmi5Z +iXMRrEPR9RP/jTkrwPK9T3CMqS/qF8QLVJ7UG5aYMzyorWKiAHarWWluBh1+xLlEjZivEtRh2woZ +Rkfz6/djwUAFQKXSt/S1mja/qYh2iARVBCuch38aNzx+LaUa2NSJXsq9rD1s2G2v1fN2D807iDgi +nWyTmsQ9v4IbZT+mD12q/OWyFcq1rca8PdCE6OoGcrBNOTJ4vz4RnAuknZoh8/CbCzB428Hch0P+ +vGOaysXCHMnHjf87ElgI5rY97HosTvuDls4MPGmHVHOkc8KT/1EQrBVUAdj8BbGJoX90g5pJ19xO +e4pIb4tF9g== +-----END CERTIFICATE----- + +Entrust Root Certification Authority - EC1 +========================================== +-----BEGIN CERTIFICATE----- +MIIC+TCCAoCgAwIBAgINAKaLeSkAAAAAUNCR+TAKBggqhkjOPQQDAzCBvzELMAkGA1UEBhMCVVMx +FjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xKDAmBgNVBAsTH1NlZSB3d3cuZW50cnVzdC5uZXQvbGVn +YWwtdGVybXMxOTA3BgNVBAsTMChjKSAyMDEyIEVudHJ1c3QsIEluYy4gLSBmb3IgYXV0aG9yaXpl +ZCB1c2Ugb25seTEzMDEGA1UEAxMqRW50cnVzdCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5 +IC0gRUMxMB4XDTEyMTIxODE1MjUzNloXDTM3MTIxODE1NTUzNlowgb8xCzAJBgNVBAYTAlVTMRYw +FAYDVQQKEw1FbnRydXN0LCBJbmMuMSgwJgYDVQQLEx9TZWUgd3d3LmVudHJ1c3QubmV0L2xlZ2Fs +LXRlcm1zMTkwNwYDVQQLEzAoYykgMjAxMiBFbnRydXN0LCBJbmMuIC0gZm9yIGF1dGhvcml6ZWQg +dXNlIG9ubHkxMzAxBgNVBAMTKkVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAt +IEVDMTB2MBAGByqGSM49AgEGBSuBBAAiA2IABIQTydC6bUF74mzQ61VfZgIaJPRbiWlH47jCffHy +AsWfoPZb1YsGGYZPUxBtByQnoaD41UcZYUx9ypMn6nQM72+WCf5j7HBdNq1nd67JnXxVRDqiY1Ef +9eNi1KlHBz7MIKNCMEAwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE +FLdj5xrdjekIplWDpOBqUEFlEUJJMAoGCCqGSM49BAMDA2cAMGQCMGF52OVCR98crlOZF7ZvHH3h +vxGU0QOIdeSNiaSKd0bebWHvAvX7td/M/k7//qnmpwIwW5nXhTcGtXsI/esni0qU+eH6p44mCOh8 +kmhtc9hvJqwhAriZtyZBWyVgrtBIGu4G +-----END CERTIFICATE----- + +CFCA EV ROOT +============ +-----BEGIN CERTIFICATE----- +MIIFjTCCA3WgAwIBAgIEGErM1jANBgkqhkiG9w0BAQsFADBWMQswCQYDVQQGEwJDTjEwMC4GA1UE +CgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQDDAxDRkNB +IEVWIFJPT1QwHhcNMTIwODA4MDMwNzAxWhcNMjkxMjMxMDMwNzAxWjBWMQswCQYDVQQGEwJDTjEw +MC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRUwEwYDVQQD +DAxDRkNBIEVWIFJPT1QwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDXXWvNED8fBVnV +BU03sQ7smCuOFR36k0sXgiFxEFLXUWRwFsJVaU2OFW2fvwwbwuCjZ9YMrM8irq93VCpLTIpTUnrD +7i7es3ElweldPe6hL6P3KjzJIx1qqx2hp/Hz7KDVRM8Vz3IvHWOX6Jn5/ZOkVIBMUtRSqy5J35DN +uF++P96hyk0g1CXohClTt7GIH//62pCfCqktQT+x8Rgp7hZZLDRJGqgG16iI0gNyejLi6mhNbiyW +ZXvKWfry4t3uMCz7zEasxGPrb382KzRzEpR/38wmnvFyXVBlWY9ps4deMm/DGIq1lY+wejfeWkU7 +xzbh72fROdOXW3NiGUgthxwG+3SYIElz8AXSG7Ggo7cbcNOIabla1jj0Ytwli3i/+Oh+uFzJlU9f +py25IGvPa931DfSCt/SyZi4QKPaXWnuWFo8BGS1sbn85WAZkgwGDg8NNkt0yxoekN+kWzqotaK8K +gWU6cMGbrU1tVMoqLUuFG7OA5nBFDWteNfB/O7ic5ARwiRIlk9oKmSJgamNgTnYGmE69g60dWIol +hdLHZR4tjsbftsbhf4oEIRUpdPA+nJCdDC7xij5aqgwJHsfVPKPtl8MeNPo4+QgO48BdK4PRVmrJ +tqhUUy54Mmc9gn900PvhtgVguXDbjgv5E1hvcWAQUhC5wUEJ73IfZzF4/5YFjQIDAQABo2MwYTAf +BgNVHSMEGDAWgBTj/i39KNALtbq2osS/BqoFjJP7LzAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB +/wQEAwIBBjAdBgNVHQ4EFgQU4/4t/SjQC7W6tqLEvwaqBYyT+y8wDQYJKoZIhvcNAQELBQADggIB +ACXGumvrh8vegjmWPfBEp2uEcwPenStPuiB/vHiyz5ewG5zz13ku9Ui20vsXiObTej/tUxPQ4i9q +ecsAIyjmHjdXNYmEwnZPNDatZ8POQQaIxffu2Bq41gt/UP+TqhdLjOztUmCypAbqTuv0axn96/Ua +4CUqmtzHQTb3yHQFhDmVOdYLO6Qn+gjYXB74BGBSESgoA//vU2YApUo0FmZ8/Qmkrp5nGm9BC2sG +E5uPhnEFtC+NiWYzKXZUmhH4J/qyP5Hgzg0b8zAarb8iXRvTvyUFTeGSGn+ZnzxEk8rUQElsgIfX +BDrDMlI1Dlb4pd19xIsNER9Tyx6yF7Zod1rg1MvIB671Oi6ON7fQAUtDKXeMOZePglr4UeWJoBjn +aH9dCi77o0cOPaYjesYBx4/IXr9tgFa+iiS6M+qf4TIRnvHST4D2G0CvOJ4RUHlzEhLN5mydLIhy +PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX +kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C +ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su +-----END CERTIFICATE----- + +TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5 +========================================================= +-----BEGIN CERTIFICATE----- +MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN +BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp +bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg +RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw +ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w +SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE +n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp +ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537 +jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m +ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP +9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV +4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH +HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI +hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo +BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq +URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl +lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8 +B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU= +-----END CERTIFICATE----- + +TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6 +========================================================= +-----BEGIN CERTIFICATE----- +MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G +A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls +acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF +bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5 +MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL +BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf +aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm +aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK +AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a +2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED +wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb +HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV ++DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT +9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG +9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R +fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy +o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW +hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1 +O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw== +-----END CERTIFICATE----- + +Certinomis - Root CA +==================== +-----BEGIN CERTIFICATE----- +MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK +Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg +LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx +EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD +ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos +P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo +d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap +z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00 +8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x +RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE +6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t +FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV +PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH +i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj +YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I +6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF +AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV +WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw +Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX +lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ +y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9 +Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng +DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi +I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM +cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr +hkIGuUE= +-----END CERTIFICATE----- + +OISTE WISeKey Global Root GB CA +=============================== +-----BEGIN CERTIFICATE----- +MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG +EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl +ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw +MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD +VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds +b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX +scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP +rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk +9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o +Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg +GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB +/zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI +hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD +dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0 +VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui +HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic +Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM= +-----END CERTIFICATE----- + +Certification Authority of WoSign G2 +==================================== +-----BEGIN CERTIFICATE----- +MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG +EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g +QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx +CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm +aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB +CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai +XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du +W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9 +5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK +v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC +AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI +hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY +P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3 +TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu ++sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+ +7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg= +-----END CERTIFICATE----- + +CA WoSign ECC Root +================== +-----BEGIN CERTIFICATE----- +MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD +TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v +dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK +ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI +zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU +t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw +QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R +MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0 +Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu +a/GRspBl9JrmkO5K +-----END CERTIFICATE----- + +================================================================ +C: US +O: GTE Corporation +OU: GTE CyberTrust Solutions, Inc. +CN: GTE CyberTrust Global Root +-- +Not Before: 1998-08-13 +Not After: 2018-08-13 +Signature: md5WithRSAEncryption +Key: RSA:1024 +-----BEGIN CERTIFICATE----- +MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD +VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv +bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv +b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV +UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU +cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds +b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH +iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS +r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4 +04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r +GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9 +3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P +lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/ +-----END CERTIFICATE----- diff --git a/htdocs/includes/stripe/data/test.png b/htdocs/includes/stripe/data/test.png new file mode 100644 index 0000000000000000000000000000000000000000..1914264c08781d1f30ee0b8482bccf44586f2dc1 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^j3CU&3?x-=hn)ga%mF?ju0VQumF+E%TuG2$FoVOh l8)-lem#2$k2*>s01R$Gz9%CSj!PC{xWt~$(697H@6ZHT9 literal 0 HcmV?d00001 diff --git a/htdocs/includes/stripe/init.php b/htdocs/includes/stripe/init.php new file mode 100644 index 00000000000..3e7f93e4e85 --- /dev/null +++ b/htdocs/includes/stripe/init.php @@ -0,0 +1,73 @@ +_save($opts); + } + + /** + * @param array|null $params + * @param array|string|null $opts + * + * @return Account The deleted account. + */ + public function delete($params = null, $opts = null) + { + return $this->_delete($params, $opts); + } + + /** + * @param array|null $params + * @param array|string|null $opts + * + * @return Account The rejected account. + */ + public function reject($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/reject'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + return $this; + } + + /** + * @param array|null $params + * @param array|string|null $opts + * + * @return Collection of Accounts + */ + public static function all($params = null, $opts = null) + { + return self::_all($params, $opts); + } +} diff --git a/htdocs/includes/stripe/lib/AlipayAccount.php b/htdocs/includes/stripe/lib/AlipayAccount.php new file mode 100644 index 00000000000..1ba34bfa646 --- /dev/null +++ b/htdocs/includes/stripe/lib/AlipayAccount.php @@ -0,0 +1,13 @@ +_apiKey = $apiKey; + if (!$apiBase) { + $apiBase = Stripe::$apiBase; + } + $this->_apiBase = $apiBase; + } + + private static function _encodeObjects($d) + { + if ($d instanceof ApiResource) { + return Util\Util::utf8($d->id); + } elseif ($d === true) { + return 'true'; + } elseif ($d === false) { + return 'false'; + } elseif (is_array($d)) { + $res = array(); + foreach ($d as $k => $v) { + $res[$k] = self::_encodeObjects($v); + } + return $res; + } else { + return Util\Util::utf8($d); + } + } + + /** + * @param string $method + * @param string $url + * @param array|null $params + * @param array|null $headers + * + * @return array An array whose first element is an API response and second + * element is the API key used to make the request. + */ + public function request($method, $url, $params = null, $headers = null) + { + if (!$params) { + $params = array(); + } + if (!$headers) { + $headers = array(); + } + list($rbody, $rcode, $rheaders, $myApiKey) = + $this->_requestRaw($method, $url, $params, $headers); + $json = $this->_interpretResponse($rbody, $rcode, $rheaders); + $resp = new ApiResponse($rbody, $rcode, $rheaders, $json); + return array($resp, $myApiKey); + } + + /** + * @param string $rbody A JSON string. + * @param int $rcode + * @param array $rheaders + * @param array $resp + * + * @throws Error\InvalidRequest if the error is caused by the user. + * @throws Error\Authentication if the error is caused by a lack of + * permissions. + * @throws Error\Permission if the error is caused by insufficient + * permissions. + * @throws Error\Card if the error is the error code is 402 (payment + * required) + * @throws Error\RateLimit if the error is caused by too many requests + * hitting the API. + * @throws Error\Api otherwise. + */ + public function handleApiError($rbody, $rcode, $rheaders, $resp) + { + if (!is_array($resp) || !isset($resp['error'])) { + $msg = "Invalid response object from API: $rbody " + . "(HTTP response code was $rcode)"; + throw new Error\Api($msg, $rcode, $rbody, $resp, $rheaders); + } + + $error = $resp['error']; + $msg = isset($error['message']) ? $error['message'] : null; + $param = isset($error['param']) ? $error['param'] : null; + $code = isset($error['code']) ? $error['code'] : null; + + switch ($rcode) { + case 400: + // 'rate_limit' code is deprecated, but left here for backwards compatibility + // for API versions earlier than 2015-09-08 + if ($code == 'rate_limit') { + throw new Error\RateLimit($msg, $param, $rcode, $rbody, $resp, $rheaders); + } + + // intentional fall-through + case 404: + throw new Error\InvalidRequest($msg, $param, $rcode, $rbody, $resp, $rheaders); + case 401: + throw new Error\Authentication($msg, $rcode, $rbody, $resp, $rheaders); + case 402: + throw new Error\Card($msg, $param, $code, $rcode, $rbody, $resp, $rheaders); + case 403: + throw new Error\Permission($msg, $rcode, $rbody, $resp, $rheaders); + case 429: + throw new Error\RateLimit($msg, $param, $rcode, $rbody, $resp, $rheaders); + default: + throw new Error\Api($msg, $rcode, $rbody, $resp, $rheaders); + } + } + + private static function _formatAppInfo($appInfo) + { + if ($appInfo !== null) { + $string = $appInfo['name']; + if ($appInfo['version'] !== null) { + $string .= '/' . $appInfo['version']; + } + if ($appInfo['url'] !== null) { + $string .= ' (' . $appInfo['url'] . ')'; + } + return $string; + } else { + return null; + } + } + + private static function _defaultHeaders($apiKey) + { + $appInfo = Stripe::getAppInfo(); + + $uaString = 'Stripe/v1 PhpBindings/' . Stripe::VERSION; + + $langVersion = phpversion(); + $uname = php_uname(); + + $httplib = 'unknown'; + $ssllib = 'unknown'; + + if (function_exists('curl_version')) { + $curlVersion = curl_version(); + $httplib = 'curl ' . $curlVersion['version']; + $ssllib = $curlVersion['ssl_version']; + } + + $appInfo = Stripe::getAppInfo(); + $ua = array( + 'bindings_version' => Stripe::VERSION, + 'lang' => 'php', + 'lang_version' => $langVersion, + 'publisher' => 'stripe', + 'uname' => $uname, + 'httplib' => $httplib, + 'ssllib' => $ssllib, + ); + if ($appInfo !== null) { + $uaString .= ' ' . self::_formatAppInfo($appInfo); + $ua['application'] = $appInfo; + } + + $defaultHeaders = array( + 'X-Stripe-Client-User-Agent' => json_encode($ua), + 'User-Agent' => $uaString, + 'Authorization' => 'Bearer ' . $apiKey, + ); + return $defaultHeaders; + } + + private function _requestRaw($method, $url, $params, $headers) + { + $myApiKey = $this->_apiKey; + if (!$myApiKey) { + $myApiKey = Stripe::$apiKey; + } + + if (!$myApiKey) { + $msg = 'No API key provided. (HINT: set your API key using ' + . '"Stripe::setApiKey()". You can generate API keys from ' + . 'the Stripe web interface. See https://stripe.com/api for ' + . 'details, or email support@stripe.com if you have any questions.'; + throw new Error\Authentication($msg); + } + + $absUrl = $this->_apiBase.$url; + $params = self::_encodeObjects($params); + $defaultHeaders = $this->_defaultHeaders($myApiKey); + if (Stripe::$apiVersion) { + $defaultHeaders['Stripe-Version'] = Stripe::$apiVersion; + } + + if (Stripe::$accountId) { + $defaultHeaders['Stripe-Account'] = Stripe::$accountId; + } + + $hasFile = false; + $hasCurlFile = class_exists('\CURLFile', false); + foreach ($params as $k => $v) { + if (is_resource($v)) { + $hasFile = true; + $params[$k] = self::_processResourceParam($v, $hasCurlFile); + } elseif ($hasCurlFile && $v instanceof \CURLFile) { + $hasFile = true; + } + } + + if ($hasFile) { + $defaultHeaders['Content-Type'] = 'multipart/form-data'; + } else { + $defaultHeaders['Content-Type'] = 'application/x-www-form-urlencoded'; + } + + $combinedHeaders = array_merge($defaultHeaders, $headers); + $rawHeaders = array(); + + foreach ($combinedHeaders as $header => $value) { + $rawHeaders[] = $header . ': ' . $value; + } + + list($rbody, $rcode, $rheaders) = $this->httpClient()->request( + $method, + $absUrl, + $rawHeaders, + $params, + $hasFile + ); + return array($rbody, $rcode, $rheaders, $myApiKey); + } + + private function _processResourceParam($resource, $hasCurlFile) + { + if (get_resource_type($resource) !== 'stream') { + throw new Error\Api( + 'Attempted to upload a resource that is not a stream' + ); + } + + $metaData = stream_get_meta_data($resource); + if ($metaData['wrapper_type'] !== 'plainfile') { + throw new Error\Api( + 'Only plainfile resource streams are supported' + ); + } + + if ($hasCurlFile) { + // We don't have the filename or mimetype, but the API doesn't care + return new \CURLFile($metaData['uri']); + } else { + return '@'.$metaData['uri']; + } + } + + private function _interpretResponse($rbody, $rcode, $rheaders) + { + $resp = json_decode($rbody, true); + $jsonError = json_last_error(); + if ($resp === null && $jsonError !== JSON_ERROR_NONE) { + $msg = "Invalid response body from API: $rbody " + . "(HTTP response code was $rcode, json_last_error() was $jsonError)"; + throw new Error\Api($msg, $rcode, $rbody); + } + + if ($rcode < 200 || $rcode >= 300) { + $this->handleApiError($rbody, $rcode, $rheaders, $resp); + } + return $resp; + } + + public static function setHttpClient($client) + { + self::$_httpClient = $client; + } + + private function httpClient() + { + if (!self::$_httpClient) { + self::$_httpClient = HttpClient\CurlClient::instance(); + } + return self::$_httpClient; + } +} diff --git a/htdocs/includes/stripe/lib/ApiResource.php b/htdocs/includes/stripe/lib/ApiResource.php new file mode 100644 index 00000000000..0c03d49c3b9 --- /dev/null +++ b/htdocs/includes/stripe/lib/ApiResource.php @@ -0,0 +1,203 @@ + true, 'Stripe-Version' => true); + + public static function baseUrl() + { + return Stripe::$apiBase; + } + + /** + * @return ApiResource The refreshed resource. + */ + public function refresh() + { + $requestor = new ApiRequestor($this->_opts->apiKey, static::baseUrl()); + $url = $this->instanceUrl(); + + list($response, $this->_opts->apiKey) = $requestor->request( + 'get', + $url, + $this->_retrieveOptions, + $this->_opts->headers + ); + $this->setLastResponse($response); + $this->refreshFrom($response->json, $this->_opts); + return $this; + } + + /** + * @return string The name of the class, with namespacing and underscores + * stripped. + */ + public static function className() + { + $class = get_called_class(); + // Useful for namespaces: Foo\Charge + if ($postfixNamespaces = strrchr($class, '\\')) { + $class = substr($postfixNamespaces, 1); + } + // Useful for underscored 'namespaces': Foo_Charge + if ($postfixFakeNamespaces = strrchr($class, '')) { + $class = $postfixFakeNamespaces; + } + if (substr($class, 0, strlen('Stripe')) == 'Stripe') { + $class = substr($class, strlen('Stripe')); + } + $class = str_replace('_', '', $class); + $name = urlencode($class); + $name = strtolower($name); + return $name; + } + + /** + * @return string The endpoint URL for the given class. + */ + public static function classUrl() + { + $base = static::className(); + return "/v1/${base}s"; + } + + /** + * @return string The instance endpoint URL for the given class. + */ + public static function resourceUrl($id) + { + if ($id === null) { + $class = get_called_class(); + $message = "Could not determine which URL to request: " + . "$class instance has invalid ID: $id"; + throw new Error\InvalidRequest($message, null); + } + $id = Util\Util::utf8($id); + $base = static::classUrl(); + $extn = urlencode($id); + return "$base/$extn"; + } + + /** + * @return string The full API URL for this API resource. + */ + public function instanceUrl() + { + return static::resourceUrl($this['id']); + } + + protected static function _validateParams($params = null) + { + if ($params && !is_array($params)) { + $message = "You must pass an array as the first argument to Stripe API " + . "method calls. (HINT: an example call to create a charge " + . "would be: \"Stripe\\Charge::create(array('amount' => 100, " + . "'currency' => 'usd', 'card' => array('number' => " + . "4242424242424242, 'exp_month' => 5, 'exp_year' => 2015)))\")"; + throw new Error\Api($message); + } + } + + protected function _request($method, $url, $params = array(), $options = null) + { + $opts = $this->_opts->merge($options); + list($resp, $options) = static::_staticRequest($method, $url, $params, $opts); + $this->setLastResponse($resp); + return array($resp->json, $options); + } + + protected static function _staticRequest($method, $url, $params, $options) + { + $opts = Util\RequestOptions::parse($options); + $requestor = new ApiRequestor($opts->apiKey, static::baseUrl()); + list($response, $opts->apiKey) = $requestor->request($method, $url, $params, $opts->headers); + foreach ($opts->headers as $k => $v) { + if (!array_key_exists($k, self::$HEADERS_TO_PERSIST)) { + unset($opts->headers[$k]); + } + } + return array($response, $opts); + } + + protected static function _retrieve($id, $options = null) + { + $opts = Util\RequestOptions::parse($options); + $instance = new static($id, $opts); + $instance->refresh(); + return $instance; + } + + protected static function _all($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('get', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + if (!is_a($obj, 'Stripe\\Collection')) { + $class = get_class($obj); + $message = "Expected type \"Stripe\\Collection\", got \"$class\" instead"; + throw new Error\Api($message); + } + $obj->setLastResponse($response); + $obj->setRequestParams($params); + return $obj; + } + + protected static function _create($params = null, $options = null) + { + self::_validateParams($params); + $url = static::classUrl(); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + return $obj; + } + + /** + * @param string $id The ID of the API resource to update. + * @param array|null $params + * @param array|string|null $opts + * + * @return ApiResource the updated API resource + */ + protected static function _update($id, $params = null, $options = null) + { + self::_validateParams($params); + $url = static::resourceUrl($id); + + list($response, $opts) = static::_staticRequest('post', $url, $params, $options); + $obj = Util\Util::convertToStripeObject($response->json, $opts); + $obj->setLastResponse($response); + return $obj; + } + + protected function _save($options = null) + { + $params = $this->serializeParameters(); + if (count($params) > 0) { + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('post', $url, $params, $options); + $this->refreshFrom($response, $opts); + } + return $this; + } + + protected function _delete($params = null, $options = null) + { + self::_validateParams($params); + + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('delete', $url, $params, $options); + $this->refreshFrom($response, $opts); + return $this; + } +} diff --git a/htdocs/includes/stripe/lib/ApiResponse.php b/htdocs/includes/stripe/lib/ApiResponse.php new file mode 100644 index 00000000000..31f54a50df0 --- /dev/null +++ b/htdocs/includes/stripe/lib/ApiResponse.php @@ -0,0 +1,32 @@ +body = $body; + $this->code = $code; + $this->headers = $headers; + $this->json = $json; + } +} diff --git a/htdocs/includes/stripe/lib/ApplePayDomain.php b/htdocs/includes/stripe/lib/ApplePayDomain.php new file mode 100644 index 00000000000..8c522c8b933 --- /dev/null +++ b/htdocs/includes/stripe/lib/ApplePayDomain.php @@ -0,0 +1,65 @@ +_delete($params, $opts); + } + + /** + * @param array|null $params + * @param array|string|null $opts + * + * @return Collection of ApplePayDomains + */ + public static function all($params = null, $opts = null) + { + return self::_all($params, $opts); + } +} diff --git a/htdocs/includes/stripe/lib/ApplicationFee.php b/htdocs/includes/stripe/lib/ApplicationFee.php new file mode 100644 index 00000000000..8145541c17e --- /dev/null +++ b/htdocs/includes/stripe/lib/ApplicationFee.php @@ -0,0 +1,69 @@ +refunds->create($params, $opts); + $this->refresh(); + return $this; + } +} diff --git a/htdocs/includes/stripe/lib/ApplicationFeeRefund.php b/htdocs/includes/stripe/lib/ApplicationFeeRefund.php new file mode 100644 index 00000000000..44695ef88cd --- /dev/null +++ b/htdocs/includes/stripe/lib/ApplicationFeeRefund.php @@ -0,0 +1,44 @@ +_save($opts); + } +} diff --git a/htdocs/includes/stripe/lib/AttachedObject.php b/htdocs/includes/stripe/lib/AttachedObject.php new file mode 100644 index 00000000000..489517d6693 --- /dev/null +++ b/htdocs/includes/stripe/lib/AttachedObject.php @@ -0,0 +1,31 @@ +_values), array_keys($properties)); + // Don't unset, but rather set to null so we send up '' for deletion. + foreach ($removed as $k) { + $this->$k = null; + } + + foreach ($properties as $k => $v) { + $this->$k = $v; + } + } +} diff --git a/htdocs/includes/stripe/lib/Balance.php b/htdocs/includes/stripe/lib/Balance.php new file mode 100644 index 00000000000..3b551eb84df --- /dev/null +++ b/htdocs/includes/stripe/lib/Balance.php @@ -0,0 +1,26 @@ +instanceUrl() . '/verify'; + list($response, $opts) = $this->_request('post', $url, $params, $options); + $this->refreshFrom($response, $opts); + return $this; + } +} diff --git a/htdocs/includes/stripe/lib/BitcoinReceiver.php b/htdocs/includes/stripe/lib/BitcoinReceiver.php new file mode 100644 index 00000000000..3f2c835b96f --- /dev/null +++ b/htdocs/includes/stripe/lib/BitcoinReceiver.php @@ -0,0 +1,85 @@ +instanceUrl() . '/refund'; + list($response, $opts) = $this->_request('post', $url, $params, $options); + $this->refreshFrom($response, $opts); + return $this; + } +} diff --git a/htdocs/includes/stripe/lib/BitcoinTransaction.php b/htdocs/includes/stripe/lib/BitcoinTransaction.php new file mode 100644 index 00000000000..6b8e5421124 --- /dev/null +++ b/htdocs/includes/stripe/lib/BitcoinTransaction.php @@ -0,0 +1,13 @@ +_save($options); + } + + /** + * @param array|null $params + * @param array|string|null $options + * + * @return Charge The refunded charge. + */ + public function refund($params = null, $options = null) + { + $url = $this->instanceUrl() . '/refund'; + list($response, $opts) = $this->_request('post', $url, $params, $options); + $this->refreshFrom($response, $opts); + return $this; + } + + /** + * @param array|null $params + * @param array|string|null $options + * + * @return Charge The captured charge. + */ + public function capture($params = null, $options = null) + { + $url = $this->instanceUrl() . '/capture'; + list($response, $opts) = $this->_request('post', $url, $params, $options); + $this->refreshFrom($response, $opts); + return $this; + } + + /** + * @param array|null $params + * @param array|string|null $options + * + * @deprecated Use the `save` method on the Dispute object + * + * @return array The updated dispute. + */ + public function updateDispute($params = null, $options = null) + { + $url = $this->instanceUrl() . '/dispute'; + list($response, $opts) = $this->_request('post', $url, $params, $options); + $this->refreshFrom(array('dispute' => $response), $opts, true); + return $this->dispute; + } + + /** + * @param array|string|null $options + * + * @deprecated Use the `close` method on the Dispute object + * + * @return Charge The updated charge. + */ + public function closeDispute($options = null) + { + $url = $this->instanceUrl() . '/dispute/close'; + list($response, $opts) = $this->_request('post', $url, null, $options); + $this->refreshFrom($response, $opts); + return $this; + } + + /** + * @param array|string|null $opts + * + * @return Charge The updated charge. + */ + public function markAsFraudulent($opts = null) + { + $params = array('fraud_details' => array('user_report' => 'fraudulent')); + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + return $this; + } + + /** + * @param array|string|null $opts + * + * @return Charge The updated charge. + */ + public function markAsSafe($opts = null) + { + $params = array('fraud_details' => array('user_report' => 'safe')); + $url = $this->instanceUrl(); + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + return $this; + } +} diff --git a/htdocs/includes/stripe/lib/Collection.php b/htdocs/includes/stripe/lib/Collection.php new file mode 100644 index 00000000000..0beb3a18918 --- /dev/null +++ b/htdocs/includes/stripe/lib/Collection.php @@ -0,0 +1,87 @@ +_requestParams = $params; + } + + public function all($params = null, $opts = null) + { + list($url, $params) = $this->extractPathAndUpdateParams($params); + + list($response, $opts) = $this->_request('get', $url, $params, $opts); + $this->_requestParams = $params; + return Util\Util::convertToStripeObject($response, $opts); + } + + public function create($params = null, $opts = null) + { + list($url, $params) = $this->extractPathAndUpdateParams($params); + + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->_requestParams = $params; + return Util\Util::convertToStripeObject($response, $opts); + } + + public function retrieve($id, $params = null, $opts = null) + { + list($url, $params) = $this->extractPathAndUpdateParams($params); + + $id = Util\Util::utf8($id); + $extn = urlencode($id); + list($response, $opts) = $this->_request( + 'get', + "$url/$extn", + $params, + $opts + ); + $this->_requestParams = $params; + return Util\Util::convertToStripeObject($response, $opts); + } + + /** + * @return AutoPagingIterator An iterator that can be used to iterate + * across all objects across all pages. As page boundaries are + * encountered, the next page will be fetched automatically for + * continued iteration. + */ + public function autoPagingIterator() + { + return new Util\AutoPagingIterator($this, $this->_requestParams); + } + + private function extractPathAndUpdateParams($params) + { + $url = parse_url($this->url); + if (!isset($url['path'])) { + throw new Error\Api("Could not parse list url into parts: $url"); + } + + if (isset($url['query'])) { + // If the URL contains a query param, parse it out into $params so they + // don't interact weirdly with each other. + $query = array(); + parse_str($url['query'], $query); + // PHP 5.2 doesn't support the ?: operator :( + $params = array_merge($params ? $params : array(), $query); + } + + return array($url['path'], $params); + } +} diff --git a/htdocs/includes/stripe/lib/CountrySpec.php b/htdocs/includes/stripe/lib/CountrySpec.php new file mode 100644 index 00000000000..dabb88b4522 --- /dev/null +++ b/htdocs/includes/stripe/lib/CountrySpec.php @@ -0,0 +1,44 @@ +_delete($params, $opts); + } + + /** + * @param array|string|null $opts + * + * @return Coupon The saved coupon. + */ + public function save($opts = null) + { + return $this->_save($opts); + } + + /** + * @param array|null $params + * @param array|string|null $opts + * + * @return Collection of Coupons + */ + public static function all($params = null, $opts = null) + { + return self::_all($params, $opts); + } +} diff --git a/htdocs/includes/stripe/lib/Customer.php b/htdocs/includes/stripe/lib/Customer.php new file mode 100644 index 00000000000..1dfbfc6a16b --- /dev/null +++ b/htdocs/includes/stripe/lib/Customer.php @@ -0,0 +1,190 @@ +_save($opts); + } + + /** + * @param array|null $params + * @param array|string|null $opts + * + * @return Customer The deleted customer. + */ + public function delete($params = null, $opts = null) + { + return $this->_delete($params, $opts); + } + + /** + * @param array|null $params + * + * @return InvoiceItem The resulting invoice item. + */ + public function addInvoiceItem($params = null) + { + if (!$params) { + $params = array(); + } + $params['customer'] = $this->id; + $ii = InvoiceItem::create($params, $this->_opts); + return $ii; + } + + /** + * @param array|null $params + * + * @return array An array of the customer's Invoices. + */ + public function invoices($params = null) + { + if (!$params) { + $params = array(); + } + $params['customer'] = $this->id; + $invoices = Invoice::all($params, $this->_opts); + return $invoices; + } + + /** + * @param array|null $params + * + * @return array An array of the customer's InvoiceItems. + */ + public function invoiceItems($params = null) + { + if (!$params) { + $params = array(); + } + $params['customer'] = $this->id; + $iis = InvoiceItem::all($params, $this->_opts); + return $iis; + } + + /** + * @param array|null $params + * + * @return array An array of the customer's Charges. + */ + public function charges($params = null) + { + if (!$params) { + $params = array(); + } + $params['customer'] = $this->id; + $charges = Charge::all($params, $this->_opts); + return $charges; + } + + /** + * @param array|null $params + * + * @return Subscription The updated subscription. + */ + public function updateSubscription($params = null) + { + $url = $this->instanceUrl() . '/subscription'; + list($response, $opts) = $this->_request('post', $url, $params); + $this->refreshFrom(array('subscription' => $response), $opts, true); + return $this->subscription; + } + + /** + * @param array|null $params + * + * @return Subscription The cancelled subscription. + */ + public function cancelSubscription($params = null) + { + $url = $this->instanceUrl() . '/subscription'; + list($response, $opts) = $this->_request('delete', $url, $params); + $this->refreshFrom(array('subscription' => $response), $opts, true); + return $this->subscription; + } + + /** + * @return Customer The updated customer. + */ + public function deleteDiscount() + { + $url = $this->instanceUrl() . '/discount'; + list($response, $opts) = $this->_request('delete', $url); + $this->refreshFrom(array('discount' => null), $opts, true); + } +} diff --git a/htdocs/includes/stripe/lib/Dispute.php b/htdocs/includes/stripe/lib/Dispute.php new file mode 100644 index 00000000000..ce70d499b35 --- /dev/null +++ b/htdocs/includes/stripe/lib/Dispute.php @@ -0,0 +1,83 @@ +_save($options); + } + + /** + * @param array|string|null $options + * + * @return Dispute The closed dispute. + */ + public function close($options = null) + { + $url = $this->instanceUrl() . '/close'; + list($response, $opts) = $this->_request('post', $url, null, $options); + $this->refreshFrom($response, $opts); + return $this; + } +} diff --git a/htdocs/includes/stripe/lib/Error/Api.php b/htdocs/includes/stripe/lib/Error/Api.php new file mode 100644 index 00000000000..dc7d069efde --- /dev/null +++ b/htdocs/includes/stripe/lib/Error/Api.php @@ -0,0 +1,7 @@ +httpStatus = $httpStatus; + $this->httpBody = $httpBody; + $this->jsonBody = $jsonBody; + $this->httpHeaders = $httpHeaders; + $this->requestId = null; + + if ($httpHeaders && isset($httpHeaders['Request-Id'])) { + $this->requestId = $httpHeaders['Request-Id']; + } + } + + public function getHttpStatus() + { + return $this->httpStatus; + } + + public function getHttpBody() + { + return $this->httpBody; + } + + public function getJsonBody() + { + return $this->jsonBody; + } + + public function getHttpHeaders() + { + return $this->httpHeaders; + } + + public function getRequestId() + { + return $this->requestId; + } + + public function __toString() + { + $id = $this->requestId ? " from API request '{$this->requestId}'": ""; + $message = explode("\n", parent::__toString()); + $message[0] .= $id; + return implode("\n", $message); + } +} diff --git a/htdocs/includes/stripe/lib/Error/Card.php b/htdocs/includes/stripe/lib/Error/Card.php new file mode 100644 index 00000000000..9004db271e3 --- /dev/null +++ b/htdocs/includes/stripe/lib/Error/Card.php @@ -0,0 +1,41 @@ +stripeParam = $stripeParam; + $this->stripeCode = $stripeCode; + + // This one is not like the others because it was added later and we're + // trying to do our best not to change the public interface of this class' + // constructor. We should consider changing its implementation on the + // next major version bump of this library. + $this->declineCode = isset($jsonBody["error"]["decline_code"]) ? $jsonBody["error"]["decline_code"] : null; + } + + public function getDeclineCode() + { + return $this->declineCode; + } + + public function getStripeCode() + { + return $this->stripeCode; + } + + public function getStripeParam() + { + return $this->stripeParam; + } +} diff --git a/htdocs/includes/stripe/lib/Error/InvalidRequest.php b/htdocs/includes/stripe/lib/Error/InvalidRequest.php new file mode 100644 index 00000000000..493bc184cbd --- /dev/null +++ b/htdocs/includes/stripe/lib/Error/InvalidRequest.php @@ -0,0 +1,23 @@ +stripeParam = $stripeParam; + } + + public function getStripeParam() + { + return $this->stripeParam; + } +} diff --git a/htdocs/includes/stripe/lib/Error/Permission.php b/htdocs/includes/stripe/lib/Error/Permission.php new file mode 100644 index 00000000000..df2b7874842 --- /dev/null +++ b/htdocs/includes/stripe/lib/Error/Permission.php @@ -0,0 +1,7 @@ +_delete($params, $opts); + } + + /** + * @param array|string|null $opts + * + * @return ExternalAccount The saved external account. + */ + public function save($opts = null) + { + return $this->_save($opts); + } + + /** + * @param array|null $params + * @param array|string|null $opts + * + * @return ExternalAccount The verified (or not) external account. + */ + public function verify($params = null, $opts = null) + { + if ($this['customer']) { + $url = $this->instanceUrl() . '/verify'; + list($response, $options) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $options); + return $this; + } else { + $message = 'Only customer external accounts can be verified in this manner.'; + throw new Error\Api($message); + } + } +} diff --git a/htdocs/includes/stripe/lib/FileUpload.php b/htdocs/includes/stripe/lib/FileUpload.php new file mode 100644 index 00000000000..7dc98c78d1c --- /dev/null +++ b/htdocs/includes/stripe/lib/FileUpload.php @@ -0,0 +1,61 @@ +defaultOptions = $defaultOptions; + } + + public function getDefaultOptions() + { + return $this->defaultOptions; + } + + // USER DEFINED TIMEOUTS + + const DEFAULT_TIMEOUT = 80; + const DEFAULT_CONNECT_TIMEOUT = 30; + + private $timeout = self::DEFAULT_TIMEOUT; + private $connectTimeout = self::DEFAULT_CONNECT_TIMEOUT; + + public function setTimeout($seconds) + { + $this->timeout = (int) max($seconds, 0); + return $this; + } + + public function setConnectTimeout($seconds) + { + $this->connectTimeout = (int) max($seconds, 0); + return $this; + } + + public function getTimeout() + { + return $this->timeout; + } + + public function getConnectTimeout() + { + return $this->connectTimeout; + } + + // END OF USER DEFINED TIMEOUTS + + public function request($method, $absUrl, $headers, $params, $hasFile) + { + $curl = curl_init(); + $method = strtolower($method); + + $opts = array(); + if (is_callable($this->defaultOptions)) { // call defaultOptions callback, set options to return value + $opts = call_user_func_array($this->defaultOptions, func_get_args()); + if (!is_array($opts)) { + throw new Error\Api("Non-array value returned by defaultOptions CurlClient callback"); + } + } elseif (is_array($this->defaultOptions)) { // set default curlopts from array + $opts = $this->defaultOptions; + } + + if ($method == 'get') { + if ($hasFile) { + throw new Error\Api( + "Issuing a GET request with a file parameter" + ); + } + $opts[CURLOPT_HTTPGET] = 1; + if (count($params) > 0) { + $encoded = self::encode($params); + $absUrl = "$absUrl?$encoded"; + } + } elseif ($method == 'post') { + $opts[CURLOPT_POST] = 1; + $opts[CURLOPT_POSTFIELDS] = $hasFile ? $params : self::encode($params); + } elseif ($method == 'delete') { + $opts[CURLOPT_CUSTOMREQUEST] = 'DELETE'; + if (count($params) > 0) { + $encoded = self::encode($params); + $absUrl = "$absUrl?$encoded"; + } + } else { + throw new Error\Api("Unrecognized method $method"); + } + + // Create a callback to capture HTTP headers for the response + $rheaders = array(); + $headerCallback = function ($curl, $header_line) use (&$rheaders) { + // Ignore the HTTP request line (HTTP/1.1 200 OK) + if (strpos($header_line, ":") === false) { + return strlen($header_line); + } + list($key, $value) = explode(":", trim($header_line), 2); + $rheaders[trim($key)] = trim($value); + return strlen($header_line); + }; + + // By default for large request body sizes (> 1024 bytes), cURL will + // send a request without a body and with a `Expect: 100-continue` + // header, which gives the server a chance to respond with an error + // status code in cases where one can be determined right away (say + // on an authentication problem for example), and saves the "large" + // request body from being ever sent. + // + // Unfortunately, the bindings don't currently correctly handle the + // success case (in which the server sends back a 100 CONTINUE), so + // we'll error under that condition. To compensate for that problem + // for the time being, override cURL's behavior by simply always + // sending an empty `Expect:` header. + array_push($headers, 'Expect: '); + + $absUrl = Util\Util::utf8($absUrl); + $opts[CURLOPT_URL] = $absUrl; + $opts[CURLOPT_RETURNTRANSFER] = true; + $opts[CURLOPT_CONNECTTIMEOUT] = $this->connectTimeout; + $opts[CURLOPT_TIMEOUT] = $this->timeout; + $opts[CURLOPT_HEADERFUNCTION] = $headerCallback; + $opts[CURLOPT_HTTPHEADER] = $headers; + if (!Stripe::$verifySslCerts) { + $opts[CURLOPT_SSL_VERIFYPEER] = false; + } + + curl_setopt_array($curl, $opts); + $rbody = curl_exec($curl); + + if (!defined('CURLE_SSL_CACERT_BADFILE')) { + define('CURLE_SSL_CACERT_BADFILE', 77); // constant not defined in PHP + } + + $errno = curl_errno($curl); + if ($errno == CURLE_SSL_CACERT || + $errno == CURLE_SSL_PEER_CERTIFICATE || + $errno == CURLE_SSL_CACERT_BADFILE + ) { + array_push( + $headers, + 'X-Stripe-Client-Info: {"ca":"using Stripe-supplied CA bundle"}' + ); + $cert = self::caBundle(); + curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); + curl_setopt($curl, CURLOPT_CAINFO, $cert); + $rbody = curl_exec($curl); + } + + if ($rbody === false) { + $errno = curl_errno($curl); + $message = curl_error($curl); + curl_close($curl); + $this->handleCurlError($absUrl, $errno, $message); + } + + $rcode = curl_getinfo($curl, CURLINFO_HTTP_CODE); + curl_close($curl); + return array($rbody, $rcode, $rheaders); + } + + /** + * @param number $errno + * @param string $message + * @throws Error\ApiConnection + */ + private function handleCurlError($url, $errno, $message) + { + switch ($errno) { + case CURLE_COULDNT_CONNECT: + case CURLE_COULDNT_RESOLVE_HOST: + case CURLE_OPERATION_TIMEOUTED: + $msg = "Could not connect to Stripe ($url). Please check your " + . "internet connection and try again. If this problem persists, " + . "you should check Stripe's service status at " + . "https://twitter.com/stripestatus, or"; + break; + case CURLE_SSL_CACERT: + case CURLE_SSL_PEER_CERTIFICATE: + $msg = "Could not verify Stripe's SSL certificate. Please make sure " + . "that your network is not intercepting certificates. " + . "(Try going to $url in your browser.) " + . "If this problem persists,"; + break; + default: + $msg = "Unexpected error communicating with Stripe. " + . "If this problem persists,"; + } + $msg .= " let us know at support@stripe.com."; + + $msg .= "\n\n(Network error [errno $errno]: $message)"; + throw new Error\ApiConnection($msg); + } + + private static function caBundle() + { + return dirname(__FILE__) . '/../../data/ca-certificates.crt'; + } + + /** + * @param array $arr An map of param keys to values. + * @param string|null $prefix + * + * Only public for testability, should not be called outside of CurlClient + * + * @return string A querystring, essentially. + */ + public static function encode($arr, $prefix = null) + { + if (!is_array($arr)) { + return $arr; + } + + $r = array(); + foreach ($arr as $k => $v) { + if (is_null($v)) { + continue; + } + + if ($prefix) { + if ($k !== null && (!is_int($k) || is_array($v))) { + $k = $prefix."[".$k."]"; + } else { + $k = $prefix."[]"; + } + } + + if (is_array($v)) { + $enc = self::encode($v, $k); + if ($enc) { + $r[] = $enc; + } + } else { + $r[] = urlencode($k)."=".urlencode($v); + } + } + + return implode("&", $r); + } +} diff --git a/htdocs/includes/stripe/lib/Invoice.php b/htdocs/includes/stripe/lib/Invoice.php new file mode 100644 index 00000000000..e994566cd96 --- /dev/null +++ b/htdocs/includes/stripe/lib/Invoice.php @@ -0,0 +1,92 @@ +json, $opts); + $obj->setLastResponse($response); + return $obj; + } + + /** + * @param array|string|null $opts + * + * @return Invoice The saved invoice. + */ + public function save($opts = null) + { + return $this->_save($opts); + } + + /** + * @return Invoice The paid invoice. + */ + public function pay($opts = null) + { + $url = $this->instanceUrl() . '/pay'; + list($response, $opts) = $this->_request('post', $url, null, $opts); + $this->refreshFrom($response, $opts); + return $this; + } +} diff --git a/htdocs/includes/stripe/lib/InvoiceItem.php b/htdocs/includes/stripe/lib/InvoiceItem.php new file mode 100644 index 00000000000..ab9c4ba3327 --- /dev/null +++ b/htdocs/includes/stripe/lib/InvoiceItem.php @@ -0,0 +1,77 @@ +_save($opts); + } + + /** + * @param array|null $params + * @param array|string|null $opts + * + * @return InvoiceItem The deleted invoice item. + */ + public function delete($params = null, $opts = null) + { + return $this->_delete($params, $opts); + } +} diff --git a/htdocs/includes/stripe/lib/JsonSerializable.php b/htdocs/includes/stripe/lib/JsonSerializable.php new file mode 100644 index 00000000000..2fdf8526703 --- /dev/null +++ b/htdocs/includes/stripe/lib/JsonSerializable.php @@ -0,0 +1,18 @@ +_save($opts); + } + + /** + * @param array|null $params + * @param array|string|null $opts + * + * @return Collection of Orders + */ + public static function all($params = null, $opts = null) + { + return self::_all($params, $opts); + } + + /** + * @return Order The paid order. + */ + public function pay($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/pay'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + return $this; + } + + /** + * @return OrderReturn The newly created return. + */ + public function returnOrder($params = null, $opts = null) + { + $url = $this->instanceUrl() . '/returns'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + return Util\Util::convertToStripeObject($response, $opts); + } +} diff --git a/htdocs/includes/stripe/lib/OrderReturn.php b/htdocs/includes/stripe/lib/OrderReturn.php new file mode 100644 index 00000000000..aa7fd4e9b99 --- /dev/null +++ b/htdocs/includes/stripe/lib/OrderReturn.php @@ -0,0 +1,33 @@ +instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url); + $this->refreshFrom($response, $opts); + return $this; + } + + /** + * @param array|string|null $opts + * + * @return Payout The saved payout. + */ + public function save($opts = null) + { + return $this->_save($opts); + } +} diff --git a/htdocs/includes/stripe/lib/Plan.php b/htdocs/includes/stripe/lib/Plan.php new file mode 100644 index 00000000000..b911e17cbe6 --- /dev/null +++ b/htdocs/includes/stripe/lib/Plan.php @@ -0,0 +1,90 @@ +_delete($params, $opts); + } + + /** + * @param array|string|null $opts + * + * @return Plan The saved plan. + */ + public function save($opts = null) + { + return $this->_save($opts); + } + + /** + * @param array|null $params + * @param array|string|null $opts + * + * @return Collection of Plans + */ + public static function all($params = null, $opts = null) + { + return self::_all($params, $opts); + } +} diff --git a/htdocs/includes/stripe/lib/Product.php b/htdocs/includes/stripe/lib/Product.php new file mode 100644 index 00000000000..2fdd22a0827 --- /dev/null +++ b/htdocs/includes/stripe/lib/Product.php @@ -0,0 +1,77 @@ +_save($opts); + } + + /** + * @param array|null $params + * @param array|string|null $opts + * + * @return Collection of Products + */ + public static function all($params = null, $opts = null) + { + return self::_all($params, $opts); + } + + /** + * @param array|null $params + * @param array|string|null $opts + * + * @return Product The deleted product. + */ + public function delete($params = null, $opts = null) + { + return $this->_delete($params, $opts); + } +} diff --git a/htdocs/includes/stripe/lib/Recipient.php b/htdocs/includes/stripe/lib/Recipient.php new file mode 100644 index 00000000000..04bcb7bb289 --- /dev/null +++ b/htdocs/includes/stripe/lib/Recipient.php @@ -0,0 +1,92 @@ +_save($opts); + } + + /** + * @param array|null $params + * + * @return Recipient The deleted recipient. + */ + public function delete($params = null, $opts = null) + { + return $this->_delete($params, $opts); + } + + + /** + * @param array|null $params + * + * @return Collection of the Recipient's Transfers + */ + public function transfers($params = null) + { + if ($params === null) { + $params = array(); + } + $params['recipient'] = $this->id; + $transfers = Transfer::all($params, $this->_opts); + return $transfers; + } +} diff --git a/htdocs/includes/stripe/lib/RecipientTransfer.php b/htdocs/includes/stripe/lib/RecipientTransfer.php new file mode 100644 index 00000000000..f4e46db38dd --- /dev/null +++ b/htdocs/includes/stripe/lib/RecipientTransfer.php @@ -0,0 +1,38 @@ +_save($opts); + } +} diff --git a/htdocs/includes/stripe/lib/SKU.php b/htdocs/includes/stripe/lib/SKU.php new file mode 100644 index 00000000000..7089604e62a --- /dev/null +++ b/htdocs/includes/stripe/lib/SKU.php @@ -0,0 +1,77 @@ +_save($opts); + } + + /** + * @param array|null $params + * @param array|string|null $opts + * + * @return Collection of SKUs + */ + public static function all($params = null, $opts = null) + { + return self::_all($params, $opts); + } + + /** + * @param array|null $params + * @param array|string|null $opts + * + * @return SKU The deleted sku. + */ + public function delete($params = null, $opts = null) + { + return $this->_delete($params, $opts); + } +} diff --git a/htdocs/includes/stripe/lib/SingletonApiResource.php b/htdocs/includes/stripe/lib/SingletonApiResource.php new file mode 100644 index 00000000000..c6de4448332 --- /dev/null +++ b/htdocs/includes/stripe/lib/SingletonApiResource.php @@ -0,0 +1,36 @@ +refresh(); + return $instance; + } + + /** + * @return string The endpoint associated with this singleton class. + */ + public static function classUrl() + { + $base = static::className(); + return "/v1/${base}"; + } + + /** + * @return string The endpoint associated with this singleton API resource. + */ + public function instanceUrl() + { + return static::classUrl(); + } +} diff --git a/htdocs/includes/stripe/lib/Source.php b/htdocs/includes/stripe/lib/Source.php new file mode 100644 index 00000000000..946586dec45 --- /dev/null +++ b/htdocs/includes/stripe/lib/Source.php @@ -0,0 +1,115 @@ +_save($opts); + } + + /** + * @param array|null $params + * @param array|string|null $opts + * + * @return Source The deleted source. + */ + public function delete($params = null, $options = null) + { + self::_validateParams($params); + + $id = $this['id']; + if (!$id) { + $class = get_class($this); + $msg = "Could not determine which URL to request: $class instance " + . "has invalid ID: $id"; + throw new Error\InvalidRequest($msg, null); + } + + if ($this['customer']) { + $base = Customer::classUrl(); + $parentExtn = urlencode(Util\Util::utf8($this['customer'])); + $extn = urlencode(Util\Util::utf8($id)); + $url = "$base/$parentExtn/sources/$extn"; + + list($response, $opts) = $this->_request('delete', $url, $params, $options); + $this->refreshFrom($response, $opts); + return $this; + } else { + $message = "Source objects cannot be deleted, they can only be " + . "detached from customer objects. This source object does not " + . "appear to be currently attached to a customer object."; + throw new Error\Api($message); + } + } + + /** + * @param array|null $params + * @param array|string|null $options + * + * @return BankAccount The verified bank account. + */ + public function verify($params = null, $options = null) + { + $url = $this->instanceUrl() . '/verify'; + list($response, $opts) = $this->_request('post', $url, $params, $options); + $this->refreshFrom($response, $opts); + return $this; + } +} diff --git a/htdocs/includes/stripe/lib/Stripe.php b/htdocs/includes/stripe/lib/Stripe.php new file mode 100644 index 00000000000..9c85c08ea04 --- /dev/null +++ b/htdocs/includes/stripe/lib/Stripe.php @@ -0,0 +1,126 @@ +_lastResponse; + } + + /** + * @param ApiResponse + * + * @return void Set the last response from the Stripe API + */ + public function setLastResponse($resp) + { + $this->_lastResponse = $resp; + } + + protected $_opts; + protected $_values; + protected $_unsavedValues; + protected $_transientValues; + protected $_retrieveOptions; + protected $_lastResponse; + + public function __construct($id = null, $opts = null) + { + $this->_opts = $opts ? $opts : new Util\RequestOptions(); + $this->_values = array(); + $this->_unsavedValues = new Util\Set(); + $this->_transientValues = new Util\Set(); + + $this->_retrieveOptions = array(); + if (is_array($id)) { + foreach ($id as $key => $value) { + if ($key != 'id') { + $this->_retrieveOptions[$key] = $value; + } + } + $id = $id['id']; + } + + if ($id !== null) { + $this->id = $id; + } + } + + // Standard accessor magic methods + public function __set($k, $v) + { + if ($v === "") { + throw new InvalidArgumentException( + 'You cannot set \''.$k.'\'to an empty string. ' + .'We interpret empty strings as NULL in requests. ' + .'You may set obj->'.$k.' = NULL to delete the property' + ); + } + + if (self::$nestedUpdatableAttributes->includes($k) + && isset($this->$k) && $this->$k instanceof AttachedObject && is_array($v)) { + $this->$k->replaceWith($v); + } else { + // TODO: may want to clear from $_transientValues (Won't be user-visible). + $this->_values[$k] = $v; + } + if (!self::$permanentAttributes->includes($k)) { + $this->_unsavedValues->add($k); + } + } + + public function __isset($k) + { + return isset($this->_values[$k]); + } + public function __unset($k) + { + unset($this->_values[$k]); + $this->_transientValues->add($k); + $this->_unsavedValues->discard($k); + } + public function &__get($k) + { + // function should return a reference, using $nullval to return a reference to null + $nullval = null; + if (!empty($this->_values) && array_key_exists($k, $this->_values)) { + return $this->_values[$k]; + } else if (!empty($this->_transientValues) && $this->_transientValues->includes($k)) { + $class = get_class($this); + $attrs = join(', ', array_keys($this->_values)); + $message = "Stripe Notice: Undefined property of $class instance: $k. " + . "HINT: The $k attribute was set in the past, however. " + . "It was then wiped when refreshing the object " + . "with the result returned by Stripe's API, " + . "probably as a result of a save(). The attributes currently " + . "available on this object are: $attrs"; + error_log($message); + return $nullval; + } else { + $class = get_class($this); + error_log("Stripe Notice: Undefined property of $class instance: $k"); + return $nullval; + } + } + + // ArrayAccess methods + public function offsetSet($k, $v) + { + $this->$k = $v; + } + + public function offsetExists($k) + { + return array_key_exists($k, $this->_values); + } + + public function offsetUnset($k) + { + unset($this->$k); + } + public function offsetGet($k) + { + return array_key_exists($k, $this->_values) ? $this->_values[$k] : null; + } + + public function keys() + { + return array_keys($this->_values); + } + + /** + * This unfortunately needs to be public to be used in Util\Util + * + * @param array $values + * @param array $opts + * + * @return StripeObject The object constructed from the given values. + */ + public static function constructFrom($values, $opts) + { + $obj = new static(isset($values['id']) ? $values['id'] : null); + $obj->refreshFrom($values, $opts); + return $obj; + } + + /** + * Refreshes this object using the provided values. + * + * @param array $values + * @param array|Util\RequestOptions $opts + * @param boolean $partial Defaults to false. + */ + public function refreshFrom($values, $opts, $partial = false) + { + if (is_array($opts)) { + $opts = Util\RequestOptions::parse($opts); + } + + $this->_opts = $opts; + + // Wipe old state before setting new. This is useful for e.g. updating a + // customer, where there is no persistent card parameter. Mark those values + // which don't persist as transient + if ($partial) { + $removed = new Util\Set(); + } else { + $removed = array_diff(array_keys($this->_values), array_keys($values)); + } + + foreach ($removed as $k) { + if (self::$permanentAttributes->includes($k)) { + continue; + } + + unset($this->$k); + } + + foreach ($values as $k => $v) { + if (self::$permanentAttributes->includes($k) && isset($this[$k])) { + continue; + } + + if (self::$nestedUpdatableAttributes->includes($k) && is_array($v)) { + $this->_values[$k] = AttachedObject::constructFrom($v, $opts); + } else { + $this->_values[$k] = Util\Util::convertToStripeObject($v, $opts); + } + + $this->_transientValues->discard($k); + $this->_unsavedValues->discard($k); + } + } + + /** + * @return array A recursive mapping of attributes to values for this object, + * including the proper value for deleted attributes. + */ + public function serializeParameters() + { + $params = array(); + if ($this->_unsavedValues) { + foreach ($this->_unsavedValues->toArray() as $k) { + $v = $this->$k; + if ($v === null) { + $v = ''; + } + + $params[$k] = $v; + } + } + + // Get nested updates. + foreach (self::$nestedUpdatableAttributes->toArray() as $property) { + if (isset($this->$property)) { + if ($this->$property instanceof StripeObject) { + $serialized = $this->$property->serializeParameters(); + if ($serialized) { + $params[$property] = $serialized; + } + } + } + } + + return $params; + } + + public function jsonSerialize() + { + return $this->__toArray(true); + } + + public function __toJSON() + { + if (defined('JSON_PRETTY_PRINT')) { + return json_encode($this->__toArray(true), JSON_PRETTY_PRINT); + } else { + return json_encode($this->__toArray(true)); + } + } + + public function __toString() + { + $class = get_class($this); + return $class . ' JSON: ' . $this->__toJSON(); + } + + public function __toArray($recursive = false) + { + if ($recursive) { + return Util\Util::convertStripeObjectToArray($this->_values); + } else { + return $this->_values; + } + } +} + +StripeObject::init(); diff --git a/htdocs/includes/stripe/lib/Subscription.php b/htdocs/includes/stripe/lib/Subscription.php new file mode 100644 index 00000000000..a95ab0911c9 --- /dev/null +++ b/htdocs/includes/stripe/lib/Subscription.php @@ -0,0 +1,97 @@ +_delete($params, $opts); + } + + /** + * @param array|string|null $opts + * + * @return Subscription The saved subscription. + */ + public function save($opts = null) + { + return $this->_save($opts); + } + + /** + * @return Subscription The updated subscription. + */ + public function deleteDiscount() + { + $url = $this->instanceUrl() . '/discount'; + list($response, $opts) = $this->_request('delete', $url); + $this->refreshFrom(array('discount' => null), $opts, true); + } +} diff --git a/htdocs/includes/stripe/lib/SubscriptionItem.php b/htdocs/includes/stripe/lib/SubscriptionItem.php new file mode 100644 index 00000000000..947d83fcb5f --- /dev/null +++ b/htdocs/includes/stripe/lib/SubscriptionItem.php @@ -0,0 +1,88 @@ +_save($opts); + } + + /** + * @param array|null $params + * @param array|string|null $opts + * + * @return SubscriptionItem The deleted subscription item. + */ + public function delete($params = null, $opts = null) + { + return $this->_delete($params, $opts); + } +} diff --git a/htdocs/includes/stripe/lib/ThreeDSecure.php b/htdocs/includes/stripe/lib/ThreeDSecure.php new file mode 100644 index 00000000000..1f189b7daeb --- /dev/null +++ b/htdocs/includes/stripe/lib/ThreeDSecure.php @@ -0,0 +1,36 @@ +instanceUrl() . '/reversals'; + list($response, $opts) = $this->_request('post', $url, $params, $opts); + $this->refreshFrom($response, $opts); + return $this; + } + + /** + * @return Transfer The canceled transfer. + */ + public function cancel() + { + $url = $this->instanceUrl() . '/cancel'; + list($response, $opts) = $this->_request('post', $url); + $this->refreshFrom($response, $opts); + return $this; + } + + /** + * @param array|string|null $opts + * + * @return Transfer The saved transfer. + */ + public function save($opts = null) + { + return $this->_save($opts); + } +} diff --git a/htdocs/includes/stripe/lib/TransferReversal.php b/htdocs/includes/stripe/lib/TransferReversal.php new file mode 100644 index 00000000000..33948c93e14 --- /dev/null +++ b/htdocs/includes/stripe/lib/TransferReversal.php @@ -0,0 +1,53 @@ +_save($opts); + } +} diff --git a/htdocs/includes/stripe/lib/Util/AutoPagingIterator.php b/htdocs/includes/stripe/lib/Util/AutoPagingIterator.php new file mode 100644 index 00000000000..80877e6742e --- /dev/null +++ b/htdocs/includes/stripe/lib/Util/AutoPagingIterator.php @@ -0,0 +1,61 @@ +page = $collection; + $this->params = $params; + } + + public function rewind() + { + // Actually rewinding would require making a copy of the original page. + } + + public function current() + { + $item = current($this->page->data); + $this->lastId = $item !== false ? $item['id'] : null; + + return $item; + } + + public function key() + { + return key($this->page->data) + $this->pageOffset; + } + + public function next() + { + $item = next($this->page->data); + if ($item === false) { + // If we've run out of data on the current page, try to fetch another one + // and increase the offset the new page would start at + $this->pageOffset += count($this->page->data); + if ($this->page['has_more']) { + $this->params = array_merge( + $this->params ? $this->params : array(), + array('starting_after' => $this->lastId) + ); + $this->page = $this->page->all($this->params); + } else { + return false; + } + } + } + + public function valid() + { + $key = key($this->page->data); + $valid = ($key !== null && $key !== false); + return $valid; + } +} diff --git a/htdocs/includes/stripe/lib/Util/RequestOptions.php b/htdocs/includes/stripe/lib/Util/RequestOptions.php new file mode 100644 index 00000000000..14af2b8a0e8 --- /dev/null +++ b/htdocs/includes/stripe/lib/Util/RequestOptions.php @@ -0,0 +1,79 @@ +apiKey = $key; + $this->headers = $headers; + } + + /** + * Unpacks an options array and merges it into the existing RequestOptions + * object. + * @param array|string|null $options a key => value array + * + * @return RequestOptions + */ + public function merge($options) + { + $other_options = self::parse($options); + if ($other_options->apiKey === null) { + $other_options->apiKey = $this->apiKey; + } + $other_options->headers = array_merge($this->headers, $other_options->headers); + return $other_options; + } + + /** + * Unpacks an options array into an RequestOptions object + * @param array|string|null $options a key => value array + * + * @return RequestOptions + */ + public static function parse($options) + { + if ($options instanceof self) { + return $options; + } + + if (is_null($options)) { + return new RequestOptions(null, array()); + } + + if (is_string($options)) { + return new RequestOptions($options, array()); + } + + if (is_array($options)) { + $headers = array(); + $key = null; + if (array_key_exists('api_key', $options)) { + $key = $options['api_key']; + } + if (array_key_exists('idempotency_key', $options)) { + $headers['Idempotency-Key'] = $options['idempotency_key']; + } + if (array_key_exists('stripe_account', $options)) { + $headers['Stripe-Account'] = $options['stripe_account']; + } + if (array_key_exists('stripe_version', $options)) { + $headers['Stripe-Version'] = $options['stripe_version']; + } + return new RequestOptions($key, $headers); + } + + $message = 'The second argument to Stripe API method calls is an ' + . 'optional per-request apiKey, which must be a string, or ' + . 'per-request options, which must be an array. (HINT: you can set ' + . 'a global apiKey by "Stripe::setApiKey()")'; + throw new Error\Api($message); + } +} diff --git a/htdocs/includes/stripe/lib/Util/Set.php b/htdocs/includes/stripe/lib/Util/Set.php new file mode 100644 index 00000000000..2a500cd639b --- /dev/null +++ b/htdocs/includes/stripe/lib/Util/Set.php @@ -0,0 +1,44 @@ +_elts = array(); + foreach ($members as $item) { + $this->_elts[$item] = true; + } + } + + public function includes($elt) + { + return isset($this->_elts[$elt]); + } + + public function add($elt) + { + $this->_elts[$elt] = true; + } + + public function discard($elt) + { + unset($this->_elts[$elt]); + } + + public function toArray() + { + return array_keys($this->_elts); + } + + public function getIterator() + { + return new ArrayIterator($this->toArray()); + } +} diff --git a/htdocs/includes/stripe/lib/Util/Util.php b/htdocs/includes/stripe/lib/Util/Util.php new file mode 100644 index 00000000000..1c8235df9bd --- /dev/null +++ b/htdocs/includes/stripe/lib/Util/Util.php @@ -0,0 +1,146 @@ + $v) { + // FIXME: this is an encapsulation violation + if ($k[0] == '_') { + continue; + } + if ($v instanceof StripeObject) { + $results[$k] = $v->__toArray(true); + } elseif (is_array($v)) { + $results[$k] = self::convertStripeObjectToArray($v); + } else { + $results[$k] = $v; + } + } + return $results; + } + + /** + * Converts a response from the Stripe API to the corresponding PHP object. + * + * @param array $resp The response from the Stripe API. + * @param array $opts + * @return StripeObject|array + */ + public static function convertToStripeObject($resp, $opts) + { + $types = array( + 'account' => 'Stripe\\Account', + 'alipay_account' => 'Stripe\\AlipayAccount', + 'apple_pay_domain' => 'Stripe\\ApplePayDomain', + 'bank_account' => 'Stripe\\BankAccount', + 'balance_transaction' => 'Stripe\\BalanceTransaction', + 'card' => 'Stripe\\Card', + 'charge' => 'Stripe\\Charge', + 'country_spec' => 'Stripe\\CountrySpec', + 'coupon' => 'Stripe\\Coupon', + 'customer' => 'Stripe\\Customer', + 'dispute' => 'Stripe\\Dispute', + 'list' => 'Stripe\\Collection', + 'invoice' => 'Stripe\\Invoice', + 'invoiceitem' => 'Stripe\\InvoiceItem', + 'event' => 'Stripe\\Event', + 'file' => 'Stripe\\FileUpload', + 'token' => 'Stripe\\Token', + 'transfer' => 'Stripe\\Transfer', + 'transfer_reversal' => 'Stripe\\TransferReversal', + 'order' => 'Stripe\\Order', + 'order_return' => 'Stripe\\OrderReturn', + 'payout' => 'Stripe\\Payout', + 'plan' => 'Stripe\\Plan', + 'product' => 'Stripe\\Product', + 'recipient' => 'Stripe\\Recipient', + 'recipient_transfer' => 'Stripe\\RecipientTransfer', + 'refund' => 'Stripe\\Refund', + 'sku' => 'Stripe\\SKU', + 'source' => 'Stripe\\Source', + 'subscription' => 'Stripe\\Subscription', + 'subscription_item' => 'Stripe\\SubscriptionItem', + 'three_d_secure' => 'Stripe\\ThreeDSecure', + 'fee_refund' => 'Stripe\\ApplicationFeeRefund', + 'bitcoin_receiver' => 'Stripe\\BitcoinReceiver', + 'bitcoin_transaction' => 'Stripe\\BitcoinTransaction', + ); + if (self::isList($resp)) { + $mapped = array(); + foreach ($resp as $i) { + array_push($mapped, self::convertToStripeObject($i, $opts)); + } + return $mapped; + } elseif (is_array($resp)) { + if (isset($resp['object']) && is_string($resp['object']) && isset($types[$resp['object']])) { + $class = $types[$resp['object']]; + } else { + $class = 'Stripe\\StripeObject'; + } + return $class::constructFrom($resp, $opts); + } else { + return $resp; + } + } + + /** + * @param string|mixed $value A string to UTF8-encode. + * + * @return string|mixed The UTF8-encoded string, or the object passed in if + * it wasn't a string. + */ + public static function utf8($value) + { + if (self::$isMbstringAvailable === null) { + self::$isMbstringAvailable = function_exists('mb_detect_encoding'); + + if (!self::$isMbstringAvailable) { + trigger_error("It looks like the mbstring extension is not enabled. " . + "UTF-8 strings will not properly be encoded. Ask your system " . + "administrator to enable the mbstring extension, or write to " . + "support@stripe.com if you have any questions.", E_USER_WARNING); + } + } + + if (is_string($value) && self::$isMbstringAvailable && mb_detect_encoding($value, "UTF-8", true) != "UTF-8") { + return utf8_encode($value); + } else { + return $value; + } + } +} diff --git a/htdocs/includes/stripe/phpunit.no_autoload.xml b/htdocs/includes/stripe/phpunit.no_autoload.xml new file mode 100644 index 00000000000..f418611df5e --- /dev/null +++ b/htdocs/includes/stripe/phpunit.no_autoload.xml @@ -0,0 +1,15 @@ + + + + tests + + + + + lib + + + + + + diff --git a/htdocs/includes/stripe/phpunit.xml b/htdocs/includes/stripe/phpunit.xml new file mode 100644 index 00000000000..7a73276d0b1 --- /dev/null +++ b/htdocs/includes/stripe/phpunit.xml @@ -0,0 +1,15 @@ + + + + tests + + + + + lib + + + + + + diff --git a/htdocs/includes/stripe/tests/AccountTest.php b/htdocs/includes/stripe/tests/AccountTest.php new file mode 100644 index 00000000000..994ba6f6a8a --- /dev/null +++ b/htdocs/includes/stripe/tests/AccountTest.php @@ -0,0 +1,300 @@ + $id, + 'currencies_supported' => array('usd', 'aed', 'afn', '...'), + 'object' => 'account', + 'business_name' => 'Stripe.com', + 'bank_accounts' => array( + 'object' => 'list', + 'total_count' => 0, + 'has_more' => false, + 'url' => '/v1/accounts/' . $id . '/bank_accounts', + 'data' => array() + ), + 'verification' => array( + 'fields_needed' => array( + 'product_description', + 'business_url', + 'support_phone', + 'bank_account', + 'tos_acceptance.ip', + 'tos_acceptance.date' + ), + 'due_by' => null, + 'contacted' => false + ), + 'tos_acceptance' => array( + 'ip' => null, + 'date' => null, + 'user_agent' => null + ), + 'legal_entity' => array( + 'type' => null, + 'business_name' => null, + 'address' => array( + 'line1' => null, + 'line2' => null, + 'city' => null, + 'state' => null, + 'postal_code' => null, + 'country' => 'US' + ), + 'first_name' => null, + 'last_name' => null, + 'additional_owners' => null, + 'verification' => array( + 'status' => 'unverified', + 'document' => null, + 'details' => null + ) + ) + ); + } + + private function deletedAccountResponse($id) + { + return array( + 'id' => $id, + 'deleted' => true + ); + } + + public function testBasicRetrieve() + { + $this->mockRequest('GET', '/v1/account', array(), $this->managedAccountResponse('acct_ABC')); + $account = Account::retrieve(); + $this->assertSame($account->id, 'acct_ABC'); + } + + public function testIDRetrieve() + { + $this->mockRequest('GET', '/v1/accounts/acct_DEF', array(), $this->managedAccountResponse('acct_DEF')); + $account = Account::retrieve('acct_DEF'); + $this->assertSame($account->id, 'acct_DEF'); + } + + public function testCreate() + { + $this->mockRequest( + 'POST', + '/v1/accounts', + array('managed' => 'true'), + $this->managedAccountResponse('acct_ABC') + ); + $account = Account::create(array( + 'managed' => true + )); + $this->assertSame($account->id, 'acct_ABC'); + } + + public function testDelete() + { + $account = self::createTestAccount(); + + $this->mockRequest( + 'DELETE', + '/v1/accounts/' . $account->id, + array(), + $this->deletedAccountResponse('acct_ABC') + ); + $deleted = $account->delete(); + $this->assertSame($deleted->id, $account->id); + $this->assertTrue($deleted->deleted); + } + + public function testReject() + { + $account = self::createTestAccount(); + + $this->mockRequest( + 'POST', + '/v1/accounts/' . $account->id . '/reject', + array('reason' => 'fraud'), + $this->deletedAccountResponse('acct_ABC') + ); + $rejected = $account->reject(array('reason' => 'fraud')); + $this->assertSame($rejected->id, $account->id); + } + + public function testSaveLegalEntity() + { + $response = $this->managedAccountResponse('acct_ABC'); + $this->mockRequest('POST', '/v1/accounts', array('managed' => 'true'), $response); + + $response['legal_entity']['first_name'] = 'Bob'; + $this->mockRequest( + 'POST', + '/v1/accounts/acct_ABC', + array('legal_entity' => array('first_name' => 'Bob')), + $response + ); + + $account = Account::create(array('managed' => true)); + $account->legal_entity->first_name = 'Bob'; + $account->save(); + + $this->assertSame('Bob', $account->legal_entity->first_name); + } + + public function testUpdateLegalEntity() + { + $response = $this->managedAccountResponse('acct_ABC'); + $this->mockRequest('POST', '/v1/accounts', array('managed' => 'true'), $response); + + $response['legal_entity']['first_name'] = 'Bob'; + $this->mockRequest( + 'POST', + '/v1/accounts/acct_ABC', + array('legal_entity' => array('first_name' => 'Bob')), + $response + ); + + $account = Account::create(array('managed' => true)); + $account = Account::update($account['id'], array( + 'legal_entity' => array( + 'first_name' => 'Bob' + ) + )); + + $this->assertSame('Bob', $account->legal_entity->first_name); + } + + public function testCreateAdditionalOwners() + { + $request = array( + 'managed' => true, + 'country' => 'GB', + 'legal_entity' => array( + 'additional_owners' => array( + 0 => array( + 'dob' => array( + 'day' => 12, + 'month' => 5, + 'year' => 1970, + ), + 'first_name' => 'xgvukvfrde', + 'last_name' => 'rtcyvubhy', + ), + 1 => array( + 'dob' => array( + 'day' => 8, + 'month' => 4, + 'year' => 1979, + ), + 'first_name' => 'yutreuk', + 'last_name' => 'dfcgvhbjihmv', + ), + ), + ), + ); + + $acct = Account::create($request); + $response = $acct->__toArray(true); + + $req_ao = $request['legal_entity']['additional_owners']; + $resp_ao = $response['legal_entity']['additional_owners']; + + $this->assertSame($req_ao[0]['dob'], $resp_ao[0]['dob']); + $this->assertSame($req_ao[1]['dob'], $resp_ao[1]['dob']); + + $this->assertSame($req_ao[0]['first_name'], $resp_ao[0]['first_name']); + $this->assertSame($req_ao[1]['first_name'], $resp_ao[1]['first_name']); + } + + public function testUpdateAdditionalOwners() + { + $response = $this->managedAccountResponse('acct_ABC'); + $this->mockRequest('POST', '/v1/accounts', array('managed' => 'true'), $response); + + $response['legal_entity']['additional_owners'] = array(array( + 'first_name' => 'Bob', + 'last_name' => null, + 'address' => array( + 'line1' => null, + 'line2' => null, + 'city' => null, + 'state' => null, + 'postal_code' => null, + 'country' => null + ), + 'verification' => array( + 'status' => 'unverified', + 'document' => null, + 'details' => null + ) + )); + + $this->mockRequest( + 'POST', + '/v1/accounts/acct_ABC', + array('legal_entity' => array('additional_owners' => array(array('first_name' => 'Bob')))), + $response + ); + + $response['legal_entity']['additional_owners'][0]['last_name'] = 'Smith'; + $this->mockRequest( + 'POST', + '/v1/accounts/acct_ABC', + array('legal_entity' => array('additional_owners' => array(array('last_name' => 'Smith')))), + $response + ); + + $response['legal_entity']['additional_owners'][0]['last_name'] = 'Johnson'; + $this->mockRequest( + 'POST', + '/v1/accounts/acct_ABC', + array('legal_entity' => array('additional_owners' => array(array('last_name' => 'Johnson')))), + $response + ); + + $response['legal_entity']['additional_owners'][0]['verification']['document'] = 'file_123'; + $this->mockRequest( + 'POST', + '/v1/accounts/acct_ABC', + array('legal_entity' => array('additional_owners' => array(array('verification' => array('document' => 'file_123'))))), + $response + ); + + $response['legal_entity']['additional_owners'][1] = array( + 'first_name' => 'Jane', + 'last_name' => 'Doe' + ); + $this->mockRequest( + 'POST', + '/v1/accounts/acct_ABC', + array('legal_entity' => array('additional_owners' => array(1 => array('first_name' => 'Jane')))), + $response + ); + + $account = Account::create(array('managed' => true)); + $account->legal_entity->additional_owners = array(array('first_name' => 'Bob')); + $account->save(); + $this->assertSame(1, count($account->legal_entity->additional_owners)); + $this->assertSame('Bob', $account->legal_entity->additional_owners[0]->first_name); + + $account->legal_entity->additional_owners[0]->last_name = 'Smith'; + $account->save(); + $this->assertSame(1, count($account->legal_entity->additional_owners)); + $this->assertSame('Smith', $account->legal_entity->additional_owners[0]->last_name); + + $account['legal_entity']['additional_owners'][0]['last_name'] = 'Johnson'; + $account->save(); + $this->assertSame(1, count($account->legal_entity->additional_owners)); + $this->assertSame('Johnson', $account->legal_entity->additional_owners[0]->last_name); + + $account->legal_entity->additional_owners[0]->verification->document = 'file_123'; + $account->save(); + $this->assertSame('file_123', $account->legal_entity->additional_owners[0]->verification->document); + + $account->legal_entity->additional_owners[1] = array('first_name' => 'Jane'); + $account->save(); + $this->assertSame('Jane', $account->legal_entity->additional_owners[1]->first_name); + } +} diff --git a/htdocs/includes/stripe/tests/ApiRequestorTest.php b/htdocs/includes/stripe/tests/ApiRequestorTest.php new file mode 100644 index 00000000000..859fb63a347 --- /dev/null +++ b/htdocs/includes/stripe/tests/ApiRequestorTest.php @@ -0,0 +1,68 @@ +getMethod('_encodeObjects'); + $method->setAccessible(true); + + $a = array('customer' => new Customer('abcd')); + $enc = $method->invoke(null, $a); + $this->assertSame($enc, array('customer' => 'abcd')); + + // Preserves UTF-8 + $v = array('customer' => "☃"); + $enc = $method->invoke(null, $v); + $this->assertSame($enc, $v); + + // Encodes latin-1 -> UTF-8 + $v = array('customer' => "\xe9"); + $enc = $method->invoke(null, $v); + $this->assertSame($enc, array('customer' => "\xc3\xa9")); + } + + public function testHttpClientInjection() + { + $reflector = new \ReflectionClass('Stripe\\ApiRequestor'); + $method = $reflector->getMethod('httpClient'); + $method->setAccessible(true); + + $curl = new CurlClient(); + $curl->setTimeout(10); + ApiRequestor::setHttpClient($curl); + + $injectedCurl = $method->invoke(new ApiRequestor()); + $this->assertSame($injectedCurl, $curl); + } + + public function testDefaultHeaders() + { + $reflector = new \ReflectionClass('Stripe\\ApiRequestor'); + $method = $reflector->getMethod('_defaultHeaders'); + $method->setAccessible(true); + + // no way to stub static methods with PHPUnit 4.x :( + Stripe::setAppInfo('MyTestApp', '1.2.34', 'https://mytestapp.example'); + $apiKey = 'sk_test_notarealkey'; + + $headers = $method->invoke(null, $apiKey); + + $ua = json_decode($headers['X-Stripe-Client-User-Agent']); + $this->assertSame($ua->application->name, 'MyTestApp'); + $this->assertSame($ua->application->version, '1.2.34'); + $this->assertSame($ua->application->url, 'https://mytestapp.example'); + + $this->assertSame( + $headers['User-Agent'], + 'Stripe/v1 PhpBindings/' . Stripe::VERSION . ' MyTestApp/1.2.34 (https://mytestapp.example)' + ); + + $this->assertSame($headers['Authorization'], 'Bearer ' . $apiKey); + } +} diff --git a/htdocs/includes/stripe/tests/ApplePayDomainTest.php b/htdocs/includes/stripe/tests/ApplePayDomainTest.php new file mode 100644 index 00000000000..ebb3e7cfa9d --- /dev/null +++ b/htdocs/includes/stripe/tests/ApplePayDomainTest.php @@ -0,0 +1,72 @@ +mockRequest( + 'POST', + '/v1/apple_pay/domains', + array('domain_name' => 'test.com'), + array( + 'id' => 'apwc_create', + 'object' => 'apple_pay_domain' + ) + ); + $d = ApplePayDomain::create(array( + 'domain_name' => 'test.com' + )); + $this->assertSame('apwc_create', $d->id); + $this->assertInstanceOf('Stripe\\ApplePayDomain', $d); + } + + public function testRetrieve() + { + $this->mockRequest( + 'GET', + '/v1/apple_pay/domains/apwc_retrieve', + array(), + array( + 'id' => 'apwc_retrieve', + 'object' => 'apple_pay_domain' + ) + ); + $d = ApplePayDomain::retrieve('apwc_retrieve'); + $this->assertSame('apwc_retrieve', $d->id); + $this->assertInstanceOf('Stripe\\ApplePayDomain', $d); + } + + public function testDeletion() + { + self::authorizeFromEnv(); + $d = ApplePayDomain::create(array( + 'domain_name' => 'jackshack.website' + )); + $this->assertInstanceOf('Stripe\\ApplePayDomain', $d); + $this->mockRequest( + 'DELETE', + '/v1/apple_pay/domains/' . $d->id, + array(), + array('deleted' => true) + ); + $d->delete(); + $this->assertTrue($d->deleted); + } + + public function testList() + { + $this->mockRequest( + 'GET', + '/v1/apple_pay/domains', + array(), + array( + 'url' => '/v1/apple_pay/domains', + 'object' => 'list' + ) + ); + $all = ApplePayDomain::all(); + $this->assertSame($all->url, '/v1/apple_pay/domains'); + } +} diff --git a/htdocs/includes/stripe/tests/ApplicationFeeRefundTest.php b/htdocs/includes/stripe/tests/ApplicationFeeRefundTest.php new file mode 100644 index 00000000000..b8d266ad1eb --- /dev/null +++ b/htdocs/includes/stripe/tests/ApplicationFeeRefundTest.php @@ -0,0 +1,18 @@ +id = 'refund_id'; + $refund->fee = 'fee_id'; + + $this->assertSame( + $refund->instanceUrl(), + '/v1/application_fees/fee_id/refunds/refund_id' + ); + } +} diff --git a/htdocs/includes/stripe/tests/ApplicationFeeTest.php b/htdocs/includes/stripe/tests/ApplicationFeeTest.php new file mode 100644 index 00000000000..fe6df923084 --- /dev/null +++ b/htdocs/includes/stripe/tests/ApplicationFeeTest.php @@ -0,0 +1,22 @@ +assertSame( + $applicationFee->instanceUrl(), + '/v1/application_fees/abcd%2Fefgh' + ); + } + + public function testList() + { + self::authorizeFromEnv(); + $d = ApplicationFee::all(); + $this->assertSame($d->url, '/v1/application_fees'); + } +} diff --git a/htdocs/includes/stripe/tests/AuthenticationErrorTest.php b/htdocs/includes/stripe/tests/AuthenticationErrorTest.php new file mode 100644 index 00000000000..1003d6990c8 --- /dev/null +++ b/htdocs/includes/stripe/tests/AuthenticationErrorTest.php @@ -0,0 +1,16 @@ +assertSame(401, $e->getHttpStatus()); + } + } +} diff --git a/htdocs/includes/stripe/tests/BalanceTest.php b/htdocs/includes/stripe/tests/BalanceTest.php new file mode 100644 index 00000000000..3d6a2a668f0 --- /dev/null +++ b/htdocs/includes/stripe/tests/BalanceTest.php @@ -0,0 +1,15 @@ +assertSame($d->object, "balance"); + $this->assertTrue(Util\Util::isList($d->available)); + $this->assertTrue(Util\Util::isList($d->pending)); + } +} diff --git a/htdocs/includes/stripe/tests/BalanceTransactionTest.php b/htdocs/includes/stripe/tests/BalanceTransactionTest.php new file mode 100644 index 00000000000..b196a288014 --- /dev/null +++ b/htdocs/includes/stripe/tests/BalanceTransactionTest.php @@ -0,0 +1,13 @@ +assertSame($d->url, '/v1/balance/history'); + } +} diff --git a/htdocs/includes/stripe/tests/BankAccountTest.php b/htdocs/includes/stripe/tests/BankAccountTest.php new file mode 100644 index 00000000000..285078f00ad --- /dev/null +++ b/htdocs/includes/stripe/tests/BankAccountTest.php @@ -0,0 +1,32 @@ +sources->create(array( + 'source' => array( + 'object' => 'bank_account', + 'account_holder_type' => 'individual', + 'account_number' => '000123456789', + 'account_holder_name' => 'John Doe', + 'routing_number' => '110000000', + 'country' => 'US' + ) + )); + + $this->assertSame($bankAccount->status, 'new'); + + $bankAccount = $bankAccount->verify(array( + 'amounts' => array(32, 45) + )); + + $this->assertSame($bankAccount->status, 'verified'); + } +} diff --git a/htdocs/includes/stripe/tests/BitcoinReceiverTest.php b/htdocs/includes/stripe/tests/BitcoinReceiverTest.php new file mode 100644 index 00000000000..fc71cf973a5 --- /dev/null +++ b/htdocs/includes/stripe/tests/BitcoinReceiverTest.php @@ -0,0 +1,120 @@ +assertSame($classUrl, '/v1/bitcoin/receivers'); + $receiver = new BitcoinReceiver('abcd/efgh'); + $instanceUrl = $receiver->instanceUrl(); + $this->assertSame($instanceUrl, '/v1/bitcoin/receivers/abcd%2Fefgh'); + } + + public function testCreate() + { + self::authorizeFromEnv(); + + $receiver = $this->createTestBitcoinReceiver("do+fill_now@stripe.com"); + + $this->assertSame(100, $receiver->amount); + $this->assertNotNull($receiver->id); + } + + public function testRetrieve() + { + self::authorizeFromEnv(); + + $receiver = $this->createTestBitcoinReceiver("do+fill_now@stripe.com"); + + $r = BitcoinReceiver::retrieve($receiver->id); + $this->assertSame($receiver->id, $r->id); + + $this->assertInstanceOf('Stripe\\BitcoinTransaction', $r->transactions->data[0]); + } + + public function testList() + { + self::authorizeFromEnv(); + + $receiver = $this->createTestBitcoinReceiver("do+fill_now@stripe.com"); + + $receivers = BitcoinReceiver::all(); + $this->assertGreaterThan(0, count($receivers->data)); + } + + public function testListTransactions() + { + self::authorizeFromEnv(); + + $receiver = $this->createTestBitcoinReceiver("do+fill_now@stripe.com"); + $this->assertSame(0, count($receiver->transactions->data)); + + $transactions = $receiver->transactions->all(array("limit" => 1)); + $this->assertSame(1, count($transactions->data)); + } + + public function testDeleteWithCustomer() + { + self::authorizeFromEnv(); + $receiver = $this->createTestBitcoinReceiver("do+fill_now@stripe.com"); + $customer = Customer::create(array("source" => $receiver->id)); + $charge = Charge::create(array( + "customer" => $customer->id, + "amount" => $receiver->amount, + "currency" => $receiver->currency + )); + $receiver = BitcoinReceiver::retrieve($receiver->id); + $response = $receiver->delete(); + $this->assertTrue($response->deleted); + } + + public function testUpdateWithCustomer() + { + self::authorizeFromEnv(); + $receiver = $this->createTestBitcoinReceiver("do+fill_now@stripe.com"); + $customer = Customer::create(array("source" => $receiver->id)); + $receiver = BitcoinReceiver::retrieve($receiver->id); + + $receiver->description = "a new description"; + $receiver->save(); + + $base = Customer::classUrl(); + $parentExtn = $receiver['customer']; + $extn = $receiver['id']; + $this->assertEquals("$base/$parentExtn/sources/$extn", $receiver->instanceUrl()); + + $updatedReceiver = BitcoinReceiver::retrieve($receiver->id); + $this->assertEquals($receiver["description"], $updatedReceiver["description"]); + } + + public function testUpdateWithoutCustomer() + { + self::authorizeFromEnv(); + $receiver = $this->createTestBitcoinReceiver("do+fill_now@stripe.com"); + + $receiver->description = "a new description"; + $receiver->save(); + + $this->assertEquals(BitcoinReceiver::classUrl() . "/" . $receiver['id'], $receiver->instanceUrl()); + + $updatedReceiver = BitcoinReceiver::retrieve($receiver->id); + $this->assertEquals($receiver["description"], $updatedReceiver["description"]); + } + + public function testRefund() + { + self::authorizeFromEnv(); + $receiver = $this->createTestBitcoinReceiver("do+fill_now@stripe.com"); + + $receiver = BitcoinReceiver::retrieve($receiver->id); + $this->assertNull($receiver->refund_address); + + $refundAddress = "REFUNDHERE"; + $receiver->refund(array("refund_address" => $refundAddress)); + + $this->assertSame($refundAddress, $receiver->refund_address); + } +} diff --git a/htdocs/includes/stripe/tests/CardErrorTest.php b/htdocs/includes/stripe/tests/CardErrorTest.php new file mode 100644 index 00000000000..a0de752e512 --- /dev/null +++ b/htdocs/includes/stripe/tests/CardErrorTest.php @@ -0,0 +1,41 @@ + '4000000000000002', + 'exp_month' => '3', + 'exp_year' => '2020' + ); + + $charge = array( + 'amount' => 100, + 'currency' => 'usd', + 'card' => $card + ); + + try { + Charge::create($charge); + } catch (Error\Card $e) { + $this->assertSame(402, $e->getHttpStatus()); + $this->assertTrue(strpos($e->getRequestId(), "req_") === 0, $e->getRequestId()); + $actual = $e->getJsonBody(); + $this->assertSame( + array('error' => array( + 'message' => 'Your card was declined.', + 'type' => 'card_error', + 'code' => 'card_declined', + 'decline_code' => 'generic_decline', + 'charge' => $actual['error']['charge'], + )), + $actual + ); + } + } +} diff --git a/htdocs/includes/stripe/tests/ChargeTest.php b/htdocs/includes/stripe/tests/ChargeTest.php new file mode 100644 index 00000000000..6ec0fa1f1d4 --- /dev/null +++ b/htdocs/includes/stripe/tests/ChargeTest.php @@ -0,0 +1,204 @@ +assertSame(Charge::classUrl(), '/v1/charges'); + $charge = new Charge('abcd/efgh'); + $this->assertSame($charge->instanceUrl(), '/v1/charges/abcd%2Fefgh'); + } + + public function testCreate() + { + self::authorizeFromEnv(); + + $card = array( + 'number' => '4242424242424242', + 'exp_month' => 5, + 'exp_year' => date('Y') + 1 + ); + + $c = Charge::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'card' => $card + ) + ); + $this->assertTrue($c->paid); + $this->assertFalse($c->refunded); + } + + public function testIdempotentCreate() + { + self::authorizeFromEnv(); + + $card = array( + 'number' => '4242424242424242', + 'exp_month' => 5, + 'exp_year' => date('Y') + 1 + ); + + $c = Charge::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'card' => $card + ), + array( + 'idempotency_key' => self::generateRandomString(), + ) + ); + + $this->assertTrue($c->paid); + $this->assertSame(200, $c->getLastResponse()->code); + } + + public function testRetrieve() + { + self::authorizeFromEnv(); + + $card = array( + 'number' => '4242424242424242', + 'exp_month' => 5, + 'exp_year' => date('Y') + 1 + ); + + $c = Charge::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'card' => $card + ) + ); + $d = Charge::retrieve($c->id); + $this->assertSame(200, $d->getLastResponse()->code); + $this->assertSame($d->id, $c->id); + } + + public function testUpdateMetadata() + { + self::authorizeFromEnv(); + + $card = array( + 'number' => '4242424242424242', + 'exp_month' => 5, + 'exp_year' => date('Y') + 1 + ); + + $charge = Charge::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'card' => $card + ) + ); + + $charge->metadata['test'] = 'foo bar'; + $charge->save(); + + $updatedCharge = Charge::retrieve($charge->id); + $this->assertSame('foo bar', $updatedCharge->metadata['test']); + } + + public function testUpdateMetadataAll() + { + self::authorizeFromEnv(); + + $card = array( + 'number' => '4242424242424242', + 'exp_month' => 5, + 'exp_year' => date('Y') + 1 + ); + + $charge = Charge::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'card' => $card + ) + ); + + $charge->metadata = array('test' => 'foo bar'); + $charge->save(); + $this->assertSame(200, $charge->getLastResponse()->code); + + $updatedCharge = Charge::retrieve($charge->id); + $this->assertSame('foo bar', $updatedCharge->metadata['test']); + } + + public function testMarkAsFraudulent() + { + self::authorizeFromEnv(); + + $card = array( + 'number' => '4242424242424242', + 'exp_month' => 5, + 'exp_year' => date('Y') + 1 + ); + + $charge = Charge::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'card' => $card + ) + ); + + $charge->refunds->create(); + $charge->markAsFraudulent(); + + $updatedCharge = Charge::retrieve($charge->id); + $this->assertSame( + 'fraudulent', + $updatedCharge['fraud_details']['user_report'] + ); + } + + public function testCreateWithBitcoinReceiverSource() + { + self::authorizeFromEnv(); + + $receiver = $this->createTestBitcoinReceiver("do+fill_now@stripe.com"); + + $charge = Charge::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'source' => $receiver->id + ) + ); + + $this->assertSame($receiver->id, $charge->source->id); + $this->assertSame("bitcoin_receiver", $charge->source->object); + $this->assertSame("succeeded", $charge->status); + $this->assertInstanceOf('Stripe\\BitcoinReceiver', $charge->source); + } + + public function markAsSafe() + { + self::authorizeFromEnv(); + + $card = array( + 'number' => '4242424242424242', + 'exp_month' => 5, + 'exp_year' => date('Y') + 1 + ); + + $charge = Charge::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'card' => $card + ) + ); + + $charge->markAsSafe(); + + $updatedCharge = Charge::retrieve($charge->id); + $this->assertSame('safe', $updatedCharge['fraud_details']['user_report']); + } +} diff --git a/htdocs/includes/stripe/tests/CollectionTest.php b/htdocs/includes/stripe/tests/CollectionTest.php new file mode 100644 index 00000000000..f8f923ff00d --- /dev/null +++ b/htdocs/includes/stripe/tests/CollectionTest.php @@ -0,0 +1,105 @@ + $id, + 'object' => 'pageablemodel' + )); + } + return array( + 'object' => 'list', + 'url' => '/v1/pageablemodels', + 'data' => $data, + 'has_more' => $hasMore + ); + } + + public function testAutoPagingOnePage() + { + $collection = Collection::constructFrom( + $this->pageableModelResponse(array('pm_123', 'pm_124'), false), + new Util\RequestOptions() + ); + + $seen = array(); + foreach ($collection->autoPagingIterator() as $item) { + array_push($seen, $item['id']); + } + + $this->assertSame($seen, array('pm_123', 'pm_124')); + } + + public function testAutoPagingThreePages() + { + $collection = Collection::constructFrom( + $this->pageableModelResponse(array('pm_123', 'pm_124'), true), + new Util\RequestOptions() + ); + $collection->setRequestParams(array('foo' => 'bar')); + + $this->mockRequest( + 'GET', + '/v1/pageablemodels', + array( + 'foo' => 'bar', + 'starting_after' => 'pm_124' + ), + $this->pageableModelResponse(array('pm_125', 'pm_126'), true) + ); + $this->mockRequest( + 'GET', + '/v1/pageablemodels', + array( + 'foo' => 'bar', + 'starting_after' => 'pm_126' + ), + $this->pageableModelResponse(array('pm_127'), false) + ); + + $seen = array(); + foreach ($collection->autoPagingIterator() as $item) { + array_push($seen, $item['id']); + } + + $this->assertSame($seen, array('pm_123', 'pm_124', 'pm_125', 'pm_126', 'pm_127')); + } + + public function testIteratorToArray() + { + $collection = Collection::constructFrom( + $this->pageableModelResponse(array('pm_123', 'pm_124'), true), + new Util\RequestOptions() + ); + + $this->mockRequest( + 'GET', + '/v1/pageablemodels', + array( + 'starting_after' => 'pm_124' + ), + $this->pageableModelResponse(array('pm_125', 'pm_126'), true) + ); + $this->mockRequest( + 'GET', + '/v1/pageablemodels', + array( + 'starting_after' => 'pm_126' + ), + $this->pageableModelResponse(array('pm_127'), false) + ); + + $seen = array(); + foreach (iterator_to_array($collection->autoPagingIterator()) as $item) { + array_push($seen, $item['id']); + } + + $this->assertSame($seen, array('pm_123', 'pm_124', 'pm_125', 'pm_126', 'pm_127')); + } +} diff --git a/htdocs/includes/stripe/tests/CountrySpecTest.php b/htdocs/includes/stripe/tests/CountrySpecTest.php new file mode 100644 index 00000000000..19dc37062e5 --- /dev/null +++ b/htdocs/includes/stripe/tests/CountrySpecTest.php @@ -0,0 +1,31 @@ +assertSame($d->object, "country_spec"); + $this->assertSame($d->id, $country); + $this->assertGreaterThan(0, count($d->supported_bank_account_currencies)); + $this->assertGreaterThan(0, count($d->supported_payment_currencies)); + $this->assertGreaterThan(0, count($d->supported_payment_methods)); + $this->assertGreaterThan(0, count($d->verification_fields)); + } + + public function testList() + { + self::authorizeFromEnv(); + + $d = CountrySpec::all(); + $this->assertSame($d->object, "list"); + $this->assertGreaterThan(0, count($d->data)); + $this->assertSame($d->data[0]->object, "country_spec"); + $this->assertInstanceOf("Stripe\\CountrySpec", $d->data[0]); + } +} diff --git a/htdocs/includes/stripe/tests/CouponTest.php b/htdocs/includes/stripe/tests/CouponTest.php new file mode 100644 index 00000000000..d23163e338e --- /dev/null +++ b/htdocs/includes/stripe/tests/CouponTest.php @@ -0,0 +1,29 @@ + 25, + 'duration' => 'repeating', + 'duration_in_months' => 5, + 'id' => $id, + ) + ); + $this->assertSame($id, $c->id); + // @codingStandardsIgnoreStart + $this->assertSame(25, $c->percent_off); + // @codingStandardsIgnoreEnd + $c->metadata['foo'] = 'bar'; + $c->save(); + + $stripeCoupon = Coupon::retrieve($id); + $this->assertEquals($c->metadata, $stripeCoupon->metadata); + } +} diff --git a/htdocs/includes/stripe/tests/CurlClientTest.php b/htdocs/includes/stripe/tests/CurlClientTest.php new file mode 100644 index 00000000000..864607f088c --- /dev/null +++ b/htdocs/includes/stripe/tests/CurlClientTest.php @@ -0,0 +1,100 @@ +assertSame(CurlClient::DEFAULT_TIMEOUT, $curl->getTimeout()); + $this->assertSame(CurlClient::DEFAULT_CONNECT_TIMEOUT, $curl->getConnectTimeout()); + + // implicitly tests whether we're returning the CurlClient instance + $curl = $curl->setConnectTimeout(1)->setTimeout(10); + $this->assertSame(1, $curl->getConnectTimeout()); + $this->assertSame(10, $curl->getTimeout()); + + $curl->setTimeout(-1); + $curl->setConnectTimeout(-999); + $this->assertSame(0, $curl->getTimeout()); + $this->assertSame(0, $curl->getConnectTimeout()); + } + + public function testDefaultOptions() + { + // make sure options array loads/saves properly + $optionsArray = array(CURLOPT_PROXY => 'localhost:80'); + $withOptionsArray = new CurlClient($optionsArray); + $this->assertSame($withOptionsArray->getDefaultOptions(), $optionsArray); + + // make sure closure-based options work properly, including argument passing + $ref = null; + $withClosure = new CurlClient(function ($method, $absUrl, $headers, $params, $hasFile) use (&$ref) { + $ref = func_get_args(); + return array(); + }); + + $withClosure->request('get', 'https://httpbin.org/status/200', array(), array(), false); + $this->assertSame($ref, array('get', 'https://httpbin.org/status/200', array(), array(), false)); + + // this is the last test case that will run, since it'll throw an exception at the end + $withBadClosure = new CurlClient(function () { + return 'thisShouldNotWork'; + }); + $this->setExpectedException('Stripe\Error\Api', "Non-array value returned by defaultOptions CurlClient callback"); + $withBadClosure->request('get', 'https://httpbin.org/status/200', array(), array(), false); + } + + public function testEncode() + { + $a = array( + 'my' => 'value', + 'that' => array('your' => 'example'), + 'bar' => 1, + 'baz' => null + ); + + $enc = CurlClient::encode($a); + $this->assertSame('my=value&that%5Byour%5D=example&bar=1', $enc); + + $a = array('that' => array('your' => 'example', 'foo' => null)); + $enc = CurlClient::encode($a); + $this->assertSame('that%5Byour%5D=example', $enc); + + $a = array('that' => 'example', 'foo' => array('bar', 'baz')); + $enc = CurlClient::encode($a); + $this->assertSame('that=example&foo%5B%5D=bar&foo%5B%5D=baz', $enc); + + $a = array( + 'my' => 'value', + 'that' => array('your' => array('cheese', 'whiz', null)), + 'bar' => 1, + 'baz' => null + ); + + $enc = CurlClient::encode($a); + $expected = 'my=value&that%5Byour%5D%5B%5D=cheese' + . '&that%5Byour%5D%5B%5D=whiz&bar=1'; + $this->assertSame($expected, $enc); + + // Ignores an empty array + $enc = CurlClient::encode(array('foo' => array(), 'bar' => 'baz')); + $expected = 'bar=baz'; + $this->assertSame($expected, $enc); + + $a = array('foo' => array(array('bar' => 'baz'), array('bar' => 'bin'))); + $enc = CurlClient::encode($a); + $this->assertSame('foo%5B0%5D%5Bbar%5D=baz&foo%5B1%5D%5Bbar%5D=bin', $enc); + } + + public function testSslOption() + { + // make sure options array loads/saves properly + $optionsArray = array(CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1); + $withOptionsArray = new CurlClient($optionsArray); + $this->assertSame($withOptionsArray->getDefaultOptions(), $optionsArray); + } +} diff --git a/htdocs/includes/stripe/tests/CustomerTest.php b/htdocs/includes/stripe/tests/CustomerTest.php new file mode 100644 index 00000000000..606536ee86f --- /dev/null +++ b/htdocs/includes/stripe/tests/CustomerTest.php @@ -0,0 +1,278 @@ +delete(); + + $this->assertTrue($customer->deleted); + $this->assertNull($customer['active_card']); + } + + public function testSave() + { + $customer = self::createTestCustomer(); + + $customer->email = 'gdb@stripe.com'; + $customer->save(); + $this->assertSame($customer->email, 'gdb@stripe.com'); + + $stripeCustomer = Customer::retrieve($customer->id); + $this->assertSame($customer->email, $stripeCustomer->email); + + Stripe::setApiKey(null); + $customer = Customer::create(null, self::API_KEY); + $customer->email = 'gdb@stripe.com'; + $customer->save(); + + self::authorizeFromEnv(); + $updatedCustomer = Customer::retrieve($customer->id); + $this->assertSame($updatedCustomer->email, 'gdb@stripe.com'); + } + + /** + * @expectedException Stripe\Error\InvalidRequest + */ + public function testBogusAttribute() + { + $customer = self::createTestCustomer(); + $customer->bogus = 'bogus'; + $customer->save(); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testUpdateDescriptionEmpty() + { + $customer = self::createTestCustomer(); + $customer->description = ''; + } + + public function testUpdateDescriptionNull() + { + $customer = self::createTestCustomer(array('description' => 'foo bar')); + $customer->description = null; + + $customer->save(); + + $updatedCustomer = Customer::retrieve($customer->id); + $this->assertSame(null, $updatedCustomer->description); + } + + public function testUpdateMetadata() + { + $customer = self::createTestCustomer(); + + $customer->metadata['test'] = 'foo bar'; + $customer->save(); + + $updatedCustomer = Customer::retrieve($customer->id); + $this->assertSame('foo bar', $updatedCustomer->metadata['test']); + } + + public function testDeleteMetadata() + { + $customer = self::createTestCustomer(); + + $customer->metadata = null; + $customer->save(); + + $updatedCustomer = Customer::retrieve($customer->id); + $this->assertSame(0, count($updatedCustomer->metadata->keys())); + } + + public function testUpdateSomeMetadata() + { + $customer = self::createTestCustomer(); + $customer->metadata['shoe size'] = '7'; + $customer->metadata['shirt size'] = 'XS'; + $customer->save(); + + $customer->metadata['shoe size'] = '9'; + $customer->save(); + + $updatedCustomer = Customer::retrieve($customer->id); + $this->assertSame('XS', $updatedCustomer->metadata['shirt size']); + $this->assertSame('9', $updatedCustomer->metadata['shoe size']); + } + + public function testUpdateAllMetadata() + { + $customer = self::createTestCustomer(); + $customer->metadata['shoe size'] = '7'; + $customer->metadata['shirt size'] = 'XS'; + $customer->save(); + + $customer->metadata = array('shirt size' => 'XL'); + $customer->save(); + + $updatedCustomer = Customer::retrieve($customer->id); + $this->assertSame('XL', $updatedCustomer->metadata['shirt size']); + $this->assertFalse(isset($updatedCustomer->metadata['shoe size'])); + } + + /** + * @expectedException Stripe\Error\InvalidRequest + */ + public function testUpdateInvalidMetadata() + { + $customer = self::createTestCustomer(); + $customer->metadata = 'something'; + $customer->save(); + } + + public function testCancelSubscription() + { + $planID = 'gold-' . self::generateRandomString(20); + self::retrieveOrCreatePlan($planID); + + $customer = self::createTestCustomer( + array( + 'plan' => $planID, + ) + ); + + $customer->cancelSubscription(array('at_period_end' => true)); + $this->assertSame($customer->subscription->status, 'active'); + $this->assertTrue($customer->subscription->cancel_at_period_end); + $customer->cancelSubscription(); + $this->assertSame($customer->subscription->status, 'canceled'); + } + + public function testCustomerAddCard() + { + $token = Token::create( + array("card" => array( + "number" => "4242424242424242", + "exp_month" => 5, + "exp_year" => date('Y') + 3, + "cvc" => "314" + )) + ); + + $customer = $this->createTestCustomer(); + $createdCard = $customer->sources->create(array("card" => $token->id)); + $customer->save(); + + $updatedCustomer = Customer::retrieve($customer->id); + $updatedCards = $updatedCustomer->sources->all(); + $this->assertSame(count($updatedCards["data"]), 2); + } + + public function testCustomerUpdateCard() + { + $customer = $this->createTestCustomer(); + $customer->save(); + + $sources = $customer->sources->all(); + $this->assertSame(count($sources["data"]), 1); + + $card = $sources['data'][0]; + $card->name = "Jane Austen"; + $card->save(); + + $updatedCustomer = Customer::retrieve($customer->id); + $updatedCards = $updatedCustomer->sources->all(); + $this->assertSame($updatedCards["data"][0]->name, "Jane Austen"); + } + + public function testCustomerDeleteCard() + { + $token = Token::create( + array("card" => array( + "number" => "4242424242424242", + "exp_month" => 5, + "exp_year" => date('Y') + 3, + "cvc" => "314" + )) + ); + + $customer = $this->createTestCustomer(); + $createdCard = $customer->sources->create(array("card" => $token->id)); + $customer->save(); + + $updatedCustomer = Customer::retrieve($customer->id); + $updatedCards = $updatedCustomer->sources->all(); + $this->assertSame(count($updatedCards["data"]), 2); + + $deleteStatus = $updatedCustomer->sources->retrieve($createdCard->id)->delete(); + $this->assertTrue($deleteStatus->deleted); + $updatedCustomer->save(); + + $postDeleteCustomer = Customer::retrieve($customer->id); + $postDeleteCards = $postDeleteCustomer->sources->all(); + $this->assertSame(count($postDeleteCards["data"]), 1); + } + + public function testCustomerAddSource() + { + self::authorizeFromEnv(); + $token = Token::create( + array("card" => array( + "number" => "4242424242424242", + "exp_month" => 5, + "exp_year" => date('Y') + 3, + "cvc" => "314" + )) + ); + + $customer = $this->createTestCustomer(); + $createdSource = $customer->sources->create(array("source" => $token->id)); + $customer->save(); + + $updatedCustomer = Customer::retrieve($customer->id); + $updatedSources = $updatedCustomer->sources->all(); + $this->assertSame(count($updatedSources["data"]), 2); + } + + public function testCustomerUpdateSource() + { + $customer = $this->createTestCustomer(); + $customer->save(); + + $sources = $customer->sources->all(); + $this->assertSame(count($sources["data"]), 1); + + $source = $sources['data'][0]; + $source->name = "Jane Austen"; + $source->save(); + + $updatedCustomer = Customer::retrieve($customer->id); + $updatedSources = $updatedCustomer->sources->all(); + $this->assertSame($updatedSources["data"][0]->name, "Jane Austen"); + } + + public function testCustomerDeleteSource() + { + self::authorizeFromEnv(); + $token = Token::create( + array("card" => array( + "number" => "4242424242424242", + "exp_month" => 5, + "exp_year" => date('Y') + 3, + "cvc" => "314" + )) + ); + + $customer = $this->createTestCustomer(); + $createdSource = $customer->sources->create(array("source" => $token->id)); + $customer->save(); + + $updatedCustomer = Customer::retrieve($customer->id); + $updatedSources = $updatedCustomer->sources->all(); + $this->assertSame(count($updatedSources["data"]), 2); + + $deleteStatus = $updatedCustomer->sources->retrieve($createdSource->id)->delete(); + $this->assertTrue($deleteStatus->deleted); + $updatedCustomer->save(); + + $postDeleteCustomer = Customer::retrieve($customer->id); + $postDeleteSources = $postDeleteCustomer->sources->all(); + $this->assertSame(count($postDeleteSources["data"]), 1); + } +} diff --git a/htdocs/includes/stripe/tests/DiscountTest.php b/htdocs/includes/stripe/tests/DiscountTest.php new file mode 100644 index 00000000000..1e77029ad2d --- /dev/null +++ b/htdocs/includes/stripe/tests/DiscountTest.php @@ -0,0 +1,31 @@ + 25, + 'duration' => 'repeating', + 'duration_in_months' => 5, + 'id' => $id, + ) + ); + $customer = self::createTestCustomer(array('coupon' => $id)); + + $this->assertTrue(isset($customer->discount)); + $this->assertTrue(isset($customer->discount->coupon)); + $this->assertSame($id, $customer->discount->coupon->id); + + $customer->deleteDiscount(); + $this->assertFalse(isset($customer->discount)); + + $customer = Customer::retrieve($customer->id); + $this->assertFalse(isset($customer->discount)); + } +} diff --git a/htdocs/includes/stripe/tests/DisputeTest.php b/htdocs/includes/stripe/tests/DisputeTest.php new file mode 100644 index 00000000000..3c4f29678ea --- /dev/null +++ b/htdocs/includes/stripe/tests/DisputeTest.php @@ -0,0 +1,96 @@ +assertSame(Dispute::classUrl(), '/v1/disputes'); + $dispute = new Dispute('dp_123'); + $this->assertSame($dispute->instanceUrl(), '/v1/disputes/dp_123'); + } + + private function createDisputedCharge() + { + $card = array( + 'number' => '4000000000000259', + 'exp_month' => 5, + 'exp_year' => date('Y') + 1 + ); + + $c = Charge::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'card' => $card + ) + ); + $c = Charge::retrieve($c->id); + + $attempts = 0; + + while ($c->dispute === null) { + if ($attempts > 5) { + throw new \Exception("Charge is taking too long to be disputed"); + } + sleep(1); + $c = Charge::retrieve($c->id); + $attempts += 1; + } + + return $c; + } + + public function testAll() + { + self::authorizeFromEnv(); + + $sublist = Dispute::all( + array( + 'limit' => 3, + ) + ); + $this->assertSame(3, count($sublist->data)); + } + + + public function testUpdate() + { + self::authorizeFromEnv(); + + $c = $this->createDisputedCharge(); + + $d = Dispute::retrieve($c->dispute); + $d->evidence["customer_name"] = "Bob"; + $s = $d->save(); + + $this->assertSame($c->dispute, $s->id); + $this->assertSame("Bob", $s->evidence["customer_name"]); + } + + public function testClose() + { + self::authorizeFromEnv(); + + $c = $this->createDisputedCharge(); + $d = Dispute::retrieve($c->dispute); + + $this->assertNotSame("lost", $d->status); + + $d->close(); + + $this->assertSame("lost", $d->status); + } + + public function testRetrieve() + { + self::authorizeFromEnv(); + + $c = $this->createDisputedCharge(); + + $d = Dispute::retrieve($c->dispute); + + $this->assertSame($c->dispute, $d->id); + } +} diff --git a/htdocs/includes/stripe/tests/ErrorTest.php b/htdocs/includes/stripe/tests/ErrorTest.php new file mode 100644 index 00000000000..75362427510 --- /dev/null +++ b/htdocs/includes/stripe/tests/ErrorTest.php @@ -0,0 +1,61 @@ + 'bar') + ); + $this->fail("Did not raise error"); + } catch (Error\Api $e) { + $this->assertSame("hello", $e->getMessage()); + $this->assertSame(500, $e->getHttpStatus()); + $this->assertSame("{'foo':'bar'}", $e->getHttpBody()); + $this->assertSame(array('foo' => 'bar'), $e->getJsonBody()); + $this->assertSame(null, $e->getHttpHeaders()); + $this->assertSame(null, $e->getRequestId()); + } + } + + public function testResponseHeaders() + { + try { + throw new Error\Api( + "hello", + 500, + "{'foo':'bar'}", + array('foo' => 'bar'), + array('Request-Id' => 'req_bar') + ); + $this->fail("Did not raise error"); + } catch (Error\Api $e) { + $this->assertSame(array('Request-Id' => 'req_bar'), $e->getHttpHeaders()); + $this->assertSame('req_bar', $e->getRequestId()); + } + } + + public function testCode() + { + try { + throw new Error\Card( + "hello", + "some_param", + "some_code", + 400, + "{'foo':'bar'}", + array('foo' => 'bar') + ); + $this->fail("Did not raise error"); + } catch (Error\Card $e) { + $this->assertSame("some_param", $e->getStripeParam()); + $this->assertSame('some_code', $e->getStripeCode()); + } + } +} diff --git a/htdocs/includes/stripe/tests/ExternalAccountTest.php b/htdocs/includes/stripe/tests/ExternalAccountTest.php new file mode 100644 index 00000000000..70c0068bc45 --- /dev/null +++ b/htdocs/includes/stripe/tests/ExternalAccountTest.php @@ -0,0 +1,30 @@ + array( + 'country' => 'US', + 'routing_number' => '110000000', + 'account_number' => '000123456789', + 'account_holder_name' => 'Jane Austen', + 'account_holder_type' => 'company' + ) + ) + ); + $customer = Customer::create(); + $externalAccount = $customer->sources->create(array('bank_account' => $bankAccountToken->id)); + $verifiedAccount = $externalAccount->verify(array('amounts' => array(32, 45)), null); + + $base = Customer::classUrl(); + $parentExtn = $externalAccount['customer']; + $extn = $externalAccount['id']; + $this->assertEquals("$base/$parentExtn/sources/$extn", $externalAccount->instanceUrl()); + } +} diff --git a/htdocs/includes/stripe/tests/FileUploadTest.php b/htdocs/includes/stripe/tests/FileUploadTest.php new file mode 100644 index 00000000000..7d1faf3b00f --- /dev/null +++ b/htdocs/includes/stripe/tests/FileUploadTest.php @@ -0,0 +1,44 @@ + 'dispute_evidence', + 'file' => $fp, + ) + ); + fclose($fp); + $this->assertSame(95, $file->size); + $this->assertSame('png', $file->type); + } + + public function testCreateAndRetrieveCurlFile() + { + if (!class_exists('\CurlFile', false)) { + // Older PHP versions don't support this + return; + } + + $curlFile = new \CurlFile(dirname(__FILE__).'/../data/test.png'); + self::authorizeFromEnv(); + $file = FileUpload::create( + array( + 'purpose' => 'dispute_evidence', + 'file' => $curlFile, + ) + ); + $this->assertSame(95, $file->size); + $this->assertSame('png', $file->type); + + // Just check that we don't get exceptions + $file = FileUpload::retrieve($file->id); + $file->refresh(); + } +} diff --git a/htdocs/includes/stripe/tests/InvalidRequestErrorTest.php b/htdocs/includes/stripe/tests/InvalidRequestErrorTest.php new file mode 100644 index 00000000000..6cc6d682911 --- /dev/null +++ b/htdocs/includes/stripe/tests/InvalidRequestErrorTest.php @@ -0,0 +1,26 @@ +assertSame(404, $e->getHttpStatus()); + } + } + + public function testBadData() + { + self::authorizeFromEnv(); + try { + Charge::create(); + } catch (Error\InvalidRequest $e) { + $this->assertSame(400, $e->getHttpStatus()); + } + } +} diff --git a/htdocs/includes/stripe/tests/InvoiceTest.php b/htdocs/includes/stripe/tests/InvoiceTest.php new file mode 100644 index 00000000000..a55ab83e4ac --- /dev/null +++ b/htdocs/includes/stripe/tests/InvoiceTest.php @@ -0,0 +1,56 @@ + $customer->id, + 'amount' => 0, + 'currency' => 'usd', + )); + + $invoice = Invoice::upcoming(array( + 'customer' => $customer->id, + )); + $this->assertSame($invoice->customer, $customer->id); + $this->assertSame($invoice->attempted, false); + } + + public function testItemsAccessWithParameter() + { + self::authorizeFromEnv(); + $customer = self::createTestCustomer(); + + InvoiceItem::create(array( + 'customer' => $customer->id, + 'amount' => 100, + 'currency' => 'usd', + )); + + $invoice = Invoice::upcoming( + array( + 'customer' => $customer->id, + ) + ); + + $lines = $invoice->lines->all(array('limit' => 10)); + + $this->assertSame(count($lines->data), 1); + $this->assertSame($lines->data[0]->amount, 100); + } + + // This is really just making sure that this operation does not trigger any + // warnings, as it's highly nested. + public function testAll() + { + self::authorizeFromEnv(); + $invoices = Invoice::all(); + $this->assertGreaterThan(0, count($invoices)); + } +} diff --git a/htdocs/includes/stripe/tests/PayoutTest.php b/htdocs/includes/stripe/tests/PayoutTest.php new file mode 100644 index 00000000000..5e99faede87 --- /dev/null +++ b/htdocs/includes/stripe/tests/PayoutTest.php @@ -0,0 +1,94 @@ +managedAccount === null) { + self::authorizeFromEnv(); + $account = self::createTestManagedAccount(); + + $charge = \Stripe\Charge::create(array( + 'currency' => 'usd', + 'amount' => '10000', + 'source' => array( + 'object' => 'card', + 'number' => '4000000000000077', + 'exp_month' => '09', + 'exp_year' => date('Y') + 3, + ), + 'destination' => array( + 'account' => $account->id + ) + )); + + $this->managedAccount = $account; + } + + return $this->managedAccount; + } + + private function createPayoutFromManagedAccount($accountId) + { + $payout = Payout::create( + array( + 'amount' => 100, + 'currency' => 'usd', + ), + array( + 'stripe_account' => $accountId + ) + ); + + return $payout; + } + + public function testCreate() + { + $account = self::createAccountWithBalance(); + $payout = self::createPayoutFromManagedAccount($account->id); + + $this->assertSame('pending', $payout->status); + } + + public function testRetrieve() + { + $account = self::createAccountWithBalance(); + $payout = self::createPayoutFromManagedAccount($account->id); + $reloaded = Payout::retrieve($payout->id, array('stripe_account' => $account->id)); + $this->assertSame($reloaded->id, $payout->id); + } + + public function testPayoutUpdateMetadata() + { + $account = self::createAccountWithBalance(); + $payout = self::createPayoutFromManagedAccount($account->id); + $payout->metadata['test'] = 'foo bar'; + $payout->save(); + + $updatedPayout = Payout::retrieve($payout->id, array('stripe_account' => $account->id)); + $this->assertSame('foo bar', $updatedPayout->metadata['test']); + } + + public function testPayoutUpdateMetadataAll() + { + $account = self::createAccountWithBalance(); + $payout = self::createPayoutFromManagedAccount($account->id); + + $payout->metadata = array('test' => 'foo bar'); + $payout->save(); + + $updatedPayout = Payout::retrieve($payout->id, array('stripe_account' => $account->id)); + $this->assertSame('foo bar', $updatedPayout->metadata['test']); + } +} diff --git a/htdocs/includes/stripe/tests/PermissionsErrorTest.php b/htdocs/includes/stripe/tests/PermissionsErrorTest.php new file mode 100644 index 00000000000..cc8a5cd0be0 --- /dev/null +++ b/htdocs/includes/stripe/tests/PermissionsErrorTest.php @@ -0,0 +1,22 @@ + array(), + ); + } + + /** + * @expectedException Stripe\Error\Permission + */ + public function testPermission() + { + $this->mockRequest('GET', '/v1/accounts/acct_DEF', array(), $this->permissionErrorResponse(), 403); + Account::retrieve('acct_DEF'); + } +} diff --git a/htdocs/includes/stripe/tests/PlanTest.php b/htdocs/includes/stripe/tests/PlanTest.php new file mode 100644 index 00000000000..9aa3589c719 --- /dev/null +++ b/htdocs/includes/stripe/tests/PlanTest.php @@ -0,0 +1,51 @@ + 2000, + 'interval' => 'month', + 'currency' => 'usd', + 'name' => 'Plan', + 'id' => 'gold-' . self::generateRandomString(20) + )); + $p->delete(); + $this->assertTrue($p->deleted); + } + + public function testFalseyId() + { + try { + $retrievedPlan = Plan::retrieve('0'); + } catch (Error\InvalidRequest $e) { + // Can either succeed or 404, all other errors are bad + if ($e->httpStatus !== 404) { + $this->fail(); + } + } + } + + public function testSave() + { + self::authorizeFromEnv(); + $planID = 'gold-' . self::generateRandomString(20); + $p = Plan::create(array( + 'amount' => 2000, + 'interval' => 'month', + 'currency' => 'usd', + 'name' => 'Plan', + 'id' => $planID + )); + $p->name = 'A new plan name'; + $p->save(); + $this->assertSame($p->name, 'A new plan name'); + + $stripePlan = Plan::retrieve($planID); + $this->assertSame($p->name, $stripePlan->name); + } +} diff --git a/htdocs/includes/stripe/tests/ProductTest.php b/htdocs/includes/stripe/tests/ProductTest.php new file mode 100644 index 00000000000..668d015e380 --- /dev/null +++ b/htdocs/includes/stripe/tests/ProductTest.php @@ -0,0 +1,158 @@ +httpStatus !== 404) { + $this->fail(); + } + } + } + + public function testProductCreateUpdateRead() + { + + Stripe::setApiKey('sk_test_JieJALRz7rPz7boV17oMma7a'); + $ProductID = 'gold-' . self::generateRandomString(20); + $p = Product::create(array( + 'name' => 'Gold Product', + 'id' => $ProductID, + 'url' => 'www.stripe.com/gold' + )); + $this->assertSame($p->url, 'www.stripe.com/gold'); + + $p->name = 'A new Product name'; + $p->save(); + $this->assertSame($p->name, 'A new Product name'); + $this->assertSame($p->url, 'www.stripe.com/gold'); + + $stripeProduct = Product::retrieve($ProductID); + $this->assertSame($p->name, $stripeProduct->name); + $this->assertSame($stripeProduct->url, 'www.stripe.com/gold'); + } + + public function testSKUCreateUpdateRead() + { + Stripe::setApiKey('sk_test_JieJALRz7rPz7boV17oMma7a'); + $ProductID = 'silver-' . self::generateRandomString(20); + $p = Product::create(array( + 'name' => 'Silver Product', + 'id' => $ProductID, + 'url' => 'www.stripe.com/silver' + )); + + $SkuID = 'silver-sku-' . self::generateRandomString(20); + $sku = SKU::create(array( + 'price' => 500, + 'currency' => 'usd', + 'id' => $SkuID, + 'inventory' => array( + 'type' => 'finite', + 'quantity' => 40 + ), + 'product' => $ProductID + )); + + $sku->price = 600; + $sku->inventory->quantity = 50; + $sku->save(); + $this->assertSame($sku->price, 600); + $this->assertSame(50, $sku->inventory->quantity); + + $stripeSku = SKU::retrieve($SkuID); + $this->assertSame($sku->price, 600); + $this->assertSame('finite', $sku->inventory->type); + $this->assertSame(50, $sku->inventory->quantity); + } + + public function testSKUProductDelete() + { + Stripe::setApiKey('sk_test_JieJALRz7rPz7boV17oMma7a'); + $ProductID = 'silver-' . self::generateRandomString(20); + $p = Product::create(array( + 'name' => 'Silver Product', + 'id' => $ProductID, + 'url' => 'stripe.com/silver' + )); + + $SkuID = 'silver-sku-' . self::generateRandomString(20); + $sku = SKU::create(array( + 'price' => 500, + 'currency' => 'usd', + 'id' => $SkuID, + 'inventory' => array( + 'type' => 'finite', + 'quantity' => 40 + ), + 'product' => $ProductID + )); + + $deletedSku = $sku->delete(); + $this->assertTrue($deletedSku->deleted); + + $deletedProduct = $p->delete(); + $this->assertTrue($deletedProduct->deleted); + } + + public function testOrderCreateUpdateRetrievePayReturn() + { + Stripe::setApiKey('sk_test_JieJALRz7rPz7boV17oMma7a'); + $ProductID = 'silver-' . self::generateRandomString(20); + $p = Product::create(array( + 'name' => 'Silver Product', + 'id' => $ProductID, + 'url' => 'www.stripe.com/silver', + 'shippable' => false, + )); + + $SkuID = 'silver-sku-' . self::generateRandomString(20); + $sku = SKU::create(array( + 'price' => 500, + 'currency' => 'usd', + 'id' => $SkuID, + 'inventory' => array( + 'type' => 'finite', + 'quantity' => 40 + ), + 'product' => $ProductID + )); + + $order = Order::create(array( + 'items' => array( + 0 => array( + 'type' => 'sku', + 'parent' => $SkuID, + ), + ), + 'currency' => 'usd', + 'email' => 'foo@bar.com', + )); + + $order->metadata->foo = "bar"; + $order->save(); + + $stripeOrder = Order::retrieve($order->id); + $this->assertSame($order->metadata->foo, "bar"); + + $order->pay(array( + 'source' => array( + 'object' => 'card', + 'number' => '4242424242424242', + 'exp_month' => '05', + 'exp_year' => '2017' + ), + )); + $this->assertSame($order->status, 'paid'); + + $orderReturn = $order->returnOrder(); + $this->assertSame($orderReturn->order, $order->id); + } +} diff --git a/htdocs/includes/stripe/tests/RateLimitErrorTest.php b/htdocs/includes/stripe/tests/RateLimitErrorTest.php new file mode 100644 index 00000000000..2d6a6b22a2b --- /dev/null +++ b/htdocs/includes/stripe/tests/RateLimitErrorTest.php @@ -0,0 +1,22 @@ + array(), + ); + } + + /** + * @expectedException Stripe\Error\RateLimit + */ + public function testRateLimit() + { + $this->mockRequest('GET', '/v1/accounts/acct_DEF', array(), $this->rateLimitErrorResponse(), 429); + Account::retrieve('acct_DEF'); + } +} diff --git a/htdocs/includes/stripe/tests/RecipientTest.php b/htdocs/includes/stripe/tests/RecipientTest.php new file mode 100644 index 00000000000..e26bfe8cddd --- /dev/null +++ b/htdocs/includes/stripe/tests/RecipientTest.php @@ -0,0 +1,112 @@ +delete(); + + $this->assertTrue($recipient->deleted); + } + + public function testSave() + { + $recipient = self::createTestRecipient(); + + $recipient->email = 'gdb@stripe.com'; + $recipient->save(); + $this->assertSame($recipient->email, 'gdb@stripe.com'); + + $stripeRecipient = Recipient::retrieve($recipient->id); + $this->assertSame($recipient->email, $stripeRecipient->email); + } + + /** + * @expectedException Stripe\Error\InvalidRequest + */ + public function testBogusAttribute() + { + $recipient = self::createTestRecipient(); + $recipient->bogus = 'bogus'; + $recipient->save(); + } + + public function testRecipientAddCard() + { + $token = Token::create( + array("card" => array( + "number" => "4000056655665556", + "exp_month" => 5, + "exp_year" => date('Y') + 3, + "cvc" => "314" + )) + ); + + $recipient = $this->createTestRecipient(); + $createdCard = $recipient->cards->create(array("card" => $token->id)); + $recipient->save(); + + $updatedRecipient = Recipient::retrieve($recipient->id); + $updatedCards = $updatedRecipient->cards->all(); + $this->assertSame(count($updatedCards["data"]), 1); + } + + public function testRecipientUpdateCard() + { + $token = Token::create( + array("card" => array( + "number" => "4000056655665556", + "exp_month" => 5, + "exp_year" => date('Y') + 3, + "cvc" => "314" + )) + ); + + $recipient = $this->createTestRecipient(); + $createdCard = $recipient->cards->create(array("card" => $token->id)); + $recipient->save(); + + $createdCards = $recipient->cards->all(); + $this->assertSame(count($createdCards["data"]), 1); + + $card = $createdCards['data'][0]; + $card->name = "Jane Austen"; + $card->save(); + + $updatedRecipient = Recipient::retrieve($recipient->id); + $updatedCards = $updatedRecipient->cards->all(); + $this->assertSame($updatedCards["data"][0]->name, "Jane Austen"); + } + + public function testRecipientDeleteCard() + { + $token = Token::create( + array("card" => array( + "number" => "4000056655665556", + "exp_month" => 5, + "exp_year" => date('Y') + 3, + "cvc" => "314" + )) + ); + + $recipient = $this->createTestRecipient(); + $createdCard = $recipient->cards->create(array("card" => $token->id)); + $recipient->save(); + + $updatedRecipient = Recipient::retrieve($recipient->id); + $updatedCards = $updatedRecipient->cards->all(); + $this->assertSame(count($updatedCards["data"]), 1); + + $deleteStatus = + $updatedRecipient->cards->retrieve($createdCard->id)->delete(); + $this->assertTrue($deleteStatus->deleted); + $updatedRecipient->save(); + + $postDeleteRecipient = Recipient::retrieve($recipient->id); + $postDeleteCards = $postDeleteRecipient->cards->all(); + $this->assertSame(count($postDeleteCards["data"]), 0); + } +} diff --git a/htdocs/includes/stripe/tests/RefundTest.php b/htdocs/includes/stripe/tests/RefundTest.php new file mode 100644 index 00000000000..e9dd8509cd3 --- /dev/null +++ b/htdocs/includes/stripe/tests/RefundTest.php @@ -0,0 +1,131 @@ + 100, 'charge' => $charge->id)); + $this->assertSame(100, $refund->amount); + $this->assertSame($charge->id, $refund->charge); + } + + public function testUpdateAndRetrieve() + { + $charge = self::createTestCharge(); + $ref = Refund::create(array('amount' => 100, 'charge' => $charge->id)); + $ref->metadata["key"] = "value"; + $ref->save(); + $ref = Refund::retrieve($ref->id); + $this->assertSame("value", $ref->metadata["key"], "value"); + } + + public function testListForCharge() + { + $charge = self::createTestCharge(); + $refA = Refund::create(array('amount' => 100, 'charge' => $charge->id)); + $refB = Refund::create(array('amount' => 50, 'charge' => $charge->id)); + + $all = Refund::all(array('charge' => $charge)); + $this->assertSame(false, $all['has_more']); + $this->assertSame(2, count($all->data)); + $this->assertSame($refB->id, $all->data[0]->id); + $this->assertSame($refA->id, $all->data[1]->id); + } + + public function testList() + { + $all = Refund::all(); + + // Fetches all refunds on this test account. + $this->assertSame(true, $all['has_more']); + $this->assertSame(10, count($all->data)); + } + + public function testCreateForBitcoin() + { + self::authorizeFromEnv(); + + $receiver = $this->createTestBitcoinReceiver("do+fill_now@stripe.com"); + + $charge = Charge::create( + array( + 'amount' => $receiver->amount, + 'currency' => $receiver->currency, + 'description' => $receiver->description, + 'source' => $receiver->id + ) + ); + + $ref = Refund::create( + array( + 'amount' => $receiver->amount, + 'refund_address' => 'ABCDEF', + 'charge' => $charge->id + ) + ); + $this->assertSame($receiver->amount, $ref->amount); + $this->assertNotNull($ref->id); + } + + // Deprecated charge endpoints: + + public function testCreateViaCharge() + { + $charge = self::createTestCharge(); + $ref = $charge->refunds->create(array('amount' => 100)); + $this->assertSame(100, $ref->amount); + $this->assertSame($charge->id, $ref->charge); + } + + public function testUpdateAndRetrieveViaCharge() + { + $charge = self::createTestCharge(); + $ref = $charge->refunds->create(array('amount' => 100)); + $ref->metadata["key"] = "value"; + $ref->save(); + $ref = $charge->refunds->retrieve($ref->id); + $this->assertSame("value", $ref->metadata["key"], "value"); + } + + public function testListViaCharge() + { + $charge = self::createTestCharge(); + $refA = $charge->refunds->create(array('amount' => 50)); + $refB = $charge->refunds->create(array('amount' => 50)); + + $all = $charge->refunds->all(); + $this->assertSame(false, $all['has_more']); + $this->assertSame(2, count($all->data)); + $this->assertSame($refB->id, $all->data[0]->id); + $this->assertSame($refA->id, $all->data[1]->id); + } + + public function testCreateForBitcoinViaCharge() + { + self::authorizeFromEnv(); + + $receiver = $this->createTestBitcoinReceiver("do+fill_now@stripe.com"); + + $charge = Charge::create( + array( + 'amount' => $receiver->amount, + 'currency' => $receiver->currency, + 'description' => $receiver->description, + 'source' => $receiver->id + ) + ); + + $ref = $charge->refunds->create( + array( + 'amount' => $receiver->amount, + 'refund_address' => 'ABCDEF' + ) + ); + $this->assertSame($receiver->amount, $ref->amount); + $this->assertNotNull($ref->id); + } +} diff --git a/htdocs/includes/stripe/tests/RequestOptionsTest.php b/htdocs/includes/stripe/tests/RequestOptionsTest.php new file mode 100644 index 00000000000..11546dd6ece --- /dev/null +++ b/htdocs/includes/stripe/tests/RequestOptionsTest.php @@ -0,0 +1,69 @@ +assertSame("foo", $opts->apiKey); + $this->assertSame(array(), $opts->headers); + } + + public function testNull() + { + $opts = Util\RequestOptions::parse(null); + $this->assertSame(null, $opts->apiKey); + $this->assertSame(array(), $opts->headers); + } + + public function testEmptyArray() + { + $opts = Util\RequestOptions::parse(array()); + $this->assertSame(null, $opts->apiKey); + $this->assertSame(array(), $opts->headers); + } + + public function testAPIKeyArray() + { + $opts = Util\RequestOptions::parse( + array( + 'api_key' => 'foo', + ) + ); + $this->assertSame('foo', $opts->apiKey); + $this->assertSame(array(), $opts->headers); + } + + public function testIdempotentKeyArray() + { + $opts = Util\RequestOptions::parse( + array( + 'idempotency_key' => 'foo', + ) + ); + $this->assertSame(null, $opts->apiKey); + $this->assertSame(array('Idempotency-Key' => 'foo'), $opts->headers); + } + + public function testKeyArray() + { + $opts = Util\RequestOptions::parse( + array( + 'idempotency_key' => 'foo', + 'api_key' => 'foo' + ) + ); + $this->assertSame('foo', $opts->apiKey); + $this->assertSame(array('Idempotency-Key' => 'foo'), $opts->headers); + } + + /** + * @expectedException Stripe\Error\Api + */ + public function testWrongType() + { + $opts = Util\RequestOptions::parse(5); + } +} diff --git a/htdocs/includes/stripe/tests/SourceTest.php b/htdocs/includes/stripe/tests/SourceTest.php new file mode 100644 index 00000000000..5ba142b9be2 --- /dev/null +++ b/htdocs/includes/stripe/tests/SourceTest.php @@ -0,0 +1,218 @@ +mockRequest( + 'GET', + '/v1/sources/src_foo', + array(), + array( + 'id' => 'src_foo', + 'object' => 'source', + ) + ); + $source = Source::retrieve('src_foo'); + $this->assertSame($source->id, 'src_foo'); + } + + public function testCreate() + { + $this->mockRequest( + 'POST', + '/v1/sources', + array( + 'type' => 'bitcoin', + 'amount' => 1000, + 'currency' => 'usd', + 'owner' => array('email' => 'jenny.rosen@example.com'), + ), + array( + 'id' => 'src_foo', + 'object' => 'source' + ) + ); + $source = Source::create(array( + 'type' => 'bitcoin', + 'amount' => 1000, + 'currency' => 'usd', + 'owner' => array('email' => 'jenny.rosen@example.com'), + )); + $this->assertSame($source->id, 'src_foo'); + } + + public function testSave() + { + $response = array( + 'id' => 'src_foo', + 'object' => 'source', + 'metadata' => array(), + ); + $this->mockRequest( + 'GET', + '/v1/sources/src_foo', + array(), + $response + ); + + $response['metadata'] = array('foo' => 'bar'); + $this->mockRequest( + 'POST', + '/v1/sources/src_foo', + array( + 'metadata' => array('foo' => 'bar'), + ), + $response + ); + + $source = Source::retrieve('src_foo'); + $source->metadata['foo'] = 'bar'; + $source->save(); + $this->assertSame($source->metadata['foo'], 'bar'); + } + + public function testSaveOwner() + { + $response = array( + 'id' => 'src_foo', + 'object' => 'source', + 'owner' => array( + 'name' => null, + 'address' => null, + ), + ); + $this->mockRequest( + 'GET', + '/v1/sources/src_foo', + array(), + $response + ); + + $response['owner'] = array( + 'name' => "Stripey McStripe", + 'address' => array( + 'line1' => "Test Address", + 'city' => "Test City", + 'postal_code' => "12345", + 'state' => "Test State", + 'country' => "Test Country", + ) + ); + $this->mockRequest( + 'POST', + '/v1/sources/src_foo', + array( + 'owner' => array( + 'name' => "Stripey McStripe", + 'address' => array( + 'line1' => "Test Address", + 'city' => "Test City", + 'postal_code' => "12345", + 'state' => "Test State", + 'country' => "Test Country", + ), + ), + ), + $response + ); + + $source = Source::retrieve('src_foo'); + $source->owner['name'] = "Stripey McStripe"; + $source->owner['address'] = array( + 'line1' => "Test Address", + 'city' => "Test City", + 'postal_code' => "12345", + 'state' => "Test State", + 'country' => "Test Country", + ); + $source->save(); + $this->assertSame($source->owner['name'], "Stripey McStripe"); + $this->assertSame($source->owner['address']['line1'], "Test Address"); + $this->assertSame($source->owner['address']['city'], "Test City"); + $this->assertSame($source->owner['address']['postal_code'], "12345"); + $this->assertSame($source->owner['address']['state'], "Test State"); + $this->assertSame($source->owner['address']['country'], "Test Country"); + } + + public function testDeleteAttached() + { + $response = array( + 'id' => 'src_foo', + 'object' => 'source', + 'customer' => 'cus_bar', + ); + $this->mockRequest( + 'GET', + '/v1/sources/src_foo', + array(), + $response + ); + + unset($response['customer']); + $this->mockRequest( + 'DELETE', + '/v1/customers/cus_bar/sources/src_foo', + array(), + $response + ); + + $source = Source::retrieve('src_foo'); + $source->delete(); + $this->assertFalse(array_key_exists('customer', $source)); + } + + /** + * @expectedException Stripe\Error\Api + */ + public function testDeleteUnattached() + { + $response = array( + 'id' => 'src_foo', + 'object' => 'source', + ); + $this->mockRequest( + 'GET', + '/v1/sources/src_foo', + array(), + $response + ); + + $source = Source::retrieve('src_foo'); + $source->delete(); + } + + public function testVerify() + { + $response = array( + 'id' => 'src_foo', + 'object' => 'source', + 'verification' => array('status' => 'pending'), + ); + $this->mockRequest( + 'GET', + '/v1/sources/src_foo', + array(), + $response + ); + + $response['verification']['status'] = 'succeeded'; + $this->mockRequest( + 'POST', + '/v1/sources/src_foo/verify', + array( + 'values' => array(32, 45), + ), + $response + ); + + $source = Source::retrieve('src_foo'); + $this->assertSame($source->verification->status, 'pending'); + $source->verify(array( + 'values' => array(32, 45), + )); + $this->assertSame($source->verification->status, 'succeeded'); + } +} diff --git a/htdocs/includes/stripe/tests/StripeObjectTest.php b/htdocs/includes/stripe/tests/StripeObjectTest.php new file mode 100644 index 00000000000..5f922228270 --- /dev/null +++ b/htdocs/includes/stripe/tests/StripeObjectTest.php @@ -0,0 +1,108 @@ +assertSame($s['foo'], 'a'); + $this->assertTrue(isset($s['foo'])); + unset($s['foo']); + $this->assertFalse(isset($s['foo'])); + } + + public function testNormalAccessorsSemantics() + { + $s = new StripeObject(); + $s->foo = 'a'; + $this->assertSame($s->foo, 'a'); + $this->assertTrue(isset($s->foo)); + unset($s->foo); + $this->assertFalse(isset($s->foo)); + } + + public function testArrayAccessorsMatchNormalAccessors() + { + $s = new StripeObject(); + $s->foo = 'a'; + $this->assertSame($s['foo'], 'a'); + + $s['bar'] = 'b'; + $this->assertSame($s->bar, 'b'); + } + + public function testKeys() + { + $s = new StripeObject(); + $s->foo = 'a'; + $this->assertSame($s->keys(), array('foo')); + } + + public function testToArray() + { + $s = new StripeObject(); + $s->foo = 'a'; + + $converted = $s->__toArray(); + + $this->assertInternalType('array', $converted); + $this->assertArrayHasKey('foo', $converted); + $this->assertEquals('a', $converted['foo']); + } + + public function testRecursiveToArray() + { + $s = new StripeObject(); + $z = new StripeObject(); + + $s->child = $z; + $z->foo = 'a'; + + $converted = $s->__toArray(true); + + $this->assertInternalType('array', $converted); + $this->assertArrayHasKey('child', $converted); + $this->assertInternalType('array', $converted['child']); + $this->assertArrayHasKey('foo', $converted['child']); + $this->assertEquals('a', $converted['child']['foo']); + } + + public function testNonexistentProperty() + { + $s = new StripeObject(); + $this->assertNull($s->nonexistent); + } + + public function testPropertyDoesNotExists() + { + $s = new StripeObject(); + $this->assertNull($s['nonexistent']); + } + + public function testJsonEncode() + { + // We can only JSON encode our objects in PHP 5.4+. 5.3 must use ->__toJSON() + if (version_compare(phpversion(), '5.4.0', '<')) { + return; + } + + $s = new StripeObject(); + $s->foo = 'a'; + + $this->assertEquals('{"foo":"a"}', json_encode($s->__toArray())); + } + + public function testReplaceNewNestedUpdatable() + { + StripeObject::init(); // Populate the $nestedUpdatableAttributes Set + $s = new StripeObject(); + + $s->metadata = array('bar'); + $this->assertSame($s->metadata, array('bar')); + $s->metadata = array('baz', 'qux'); + $this->assertSame($s->metadata, array('baz', 'qux')); + } +} diff --git a/htdocs/includes/stripe/tests/SubscriptionItemTest.php b/htdocs/includes/stripe/tests/SubscriptionItemTest.php new file mode 100644 index 00000000000..4e4a545a5b1 --- /dev/null +++ b/htdocs/includes/stripe/tests/SubscriptionItemTest.php @@ -0,0 +1,38 @@ + $plan0ID, 'customer' => $customer->id)); + + $plan1ID = 'gold-' . self::generateRandomString(20); + self::retrieveOrCreatePlan($plan1ID); + + $subItem = SubscriptionItem::create(array('plan' => $plan1ID, 'subscription' => $sub->id)); + $this->assertSame($subItem->plan->id, $plan1ID); + + $subItem->quantity = 2; + $subItem->save(); + + $subItem = SubscriptionItem::retrieve($subItem->id); + $this->assertSame($subItem->quantity, 2); + + // Update the quantity parameter one more time + $subItem = SubscriptionItem::update($subItem->id, array('quantity' => 3)); + $this->assertSame($subItem->quantity, 3); + + $subItems = SubscriptionItem::all(array('subscription'=>$sub->id, 'limit'=>3)); + $this->assertSame(get_class($subItems->data[0]), 'Stripe\SubscriptionItem'); + $this->assertSame(2, count($subItems->data)); + + $subItem->delete(); + $this->assertTrue($subItem->deleted); + } +} diff --git a/htdocs/includes/stripe/tests/SubscriptionTest.php b/htdocs/includes/stripe/tests/SubscriptionTest.php new file mode 100644 index 00000000000..08f74108061 --- /dev/null +++ b/htdocs/includes/stripe/tests/SubscriptionTest.php @@ -0,0 +1,132 @@ +subscriptions->create(array('plan' => $planID)); + + $this->assertSame($sub->status, 'active'); + $this->assertSame($sub->plan->id, $planID); + + $sub->quantity = 2; + $sub->save(); + + $sub = $customer->subscriptions->retrieve($sub->id); + $this->assertSame($sub->status, 'active'); + $this->assertSame($sub->plan->id, $planID); + $this->assertSame($sub->quantity, 2); + + $subs = $customer->subscriptions->all(array('limit'=>3)); + $this->assertSame(get_class($subs->data[0]), 'Stripe\Subscription'); + + $sub->cancel(array('at_period_end' => true)); + + $sub = $customer->subscriptions->retrieve($sub->id); + $this->assertSame($sub->status, 'active'); + // @codingStandardsIgnoreStart + $this->assertTrue($sub->cancel_at_period_end); + // @codingStandardsIgnoreEnd + } + + public function testCreateUpdateListCancel() + { + $planID = 'gold-' . self::generateRandomString(20); + self::retrieveOrCreatePlan($planID); + + $customer = self::createTestCustomer(); + + $sub = Subscription::create(array('plan' => $planID, 'customer' => $customer->id)); + + $this->assertSame($sub->status, 'active'); + $this->assertSame($sub->plan->id, $planID); + + $sub->quantity = 2; + $sub->save(); + + $sub = Subscription::retrieve($sub->id); + $this->assertSame($sub->status, 'active'); + $this->assertSame($sub->plan->id, $planID); + $this->assertSame($sub->quantity, 2); + + // Update the quantity parameter one more time + $sub = Subscription::update($sub->id, array("quantity" => 3)); + $this->assertSame($sub->status, 'active'); + $this->assertSame($sub->plan->id, $planID); + $this->assertSame($sub->quantity, 3); + + $subs = Subscription::all(array('customer'=>$customer->id, 'plan'=>$planID, 'limit'=>3)); + $this->assertSame(get_class($subs->data[0]), 'Stripe\Subscription'); + + $sub->cancel(array('at_period_end' => true)); + + $sub = Subscription::retrieve($sub->id); + $this->assertSame($sub->status, 'active'); + $this->assertTrue($sub->cancel_at_period_end); + } + + public function testCreateUpdateListCancelWithItems() + { + $plan0ID = 'gold-' . self::generateRandomString(20); + self::retrieveOrCreatePlan($plan0ID); + + $customer = self::createTestCustomer(); + + $sub = Subscription::create(array( + 'customer' => $customer->id, + 'items' => array( + array('plan' => $plan0ID), + ), + )); + + $this->assertSame(count($sub->items->data), 1); + $this->assertSame($sub->items->data[0]->plan->id, $plan0ID); + + $plan1ID = 'gold-' . self::generateRandomString(20); + self::retrieveOrCreatePlan($plan1ID); + + $sub = Subscription::update($sub->id, array( + 'items' => array( + array('plan' => $plan1ID), + ), + )); + + $this->assertSame(count($sub->items->data), 2); + $this->assertSame($sub->items->data[0]->plan->id, $plan0ID); + $this->assertSame($sub->items->data[1]->plan->id, $plan1ID); + } + + public function testDeleteDiscount() + { + $planID = 'gold-' . self::generateRandomString(20); + self::retrieveOrCreatePlan($planID); + + $couponID = '25off-' . self::generateRandomString(20); + self::retrieveOrCreateCoupon($couponID); + + $customer = self::createTestCustomer(); + + $sub = $customer->subscriptions->create( + array( + 'plan' => $planID, + 'coupon' => $couponID + ) + ); + + $this->assertSame($sub->status, 'active'); + $this->assertSame($sub->plan->id, $planID); + $this->assertSame($sub->discount->coupon->id, $couponID); + + $sub->deleteDiscount(); + $sub = $customer->subscriptions->retrieve($sub->id); + $this->assertNull($sub->discount); + } +} diff --git a/htdocs/includes/stripe/tests/TestCase.php b/htdocs/includes/stripe/tests/TestCase.php new file mode 100644 index 00000000000..a1fdc94f917 --- /dev/null +++ b/htdocs/includes/stripe/tests/TestCase.php @@ -0,0 +1,271 @@ +mock = null; + $this->call = 0; + } + + protected function mockRequest($method, $path, $params = array(), $return = array('id' => 'myId'), $rcode = 200) + { + $mock = $this->setUpMockRequest(); + $mock->expects($this->at($this->call++)) + ->method('request') + ->with(strtolower($method), 'https://api.stripe.com' . $path, $this->anything(), $params, false) + ->willReturn(array(json_encode($return), $rcode, array())); + } + + private function setUpMockRequest() + { + if (!$this->mock) { + self::authorizeFromEnv(); + $this->mock = $this->getMock('\Stripe\HttpClient\ClientInterface'); + ApiRequestor::setHttpClient($this->mock); + } + return $this->mock; + } + + /** + * Create a valid test charge. + */ + protected static function createTestCharge(array $attributes = array()) + { + self::authorizeFromEnv(); + + return Charge::create( + $attributes + array( + 'amount' => 2000, + 'currency' => 'usd', + 'description' => 'Charge for test@example.com', + 'card' => array( + 'number' => '4242424242424242', + 'exp_month' => 5, + 'exp_year' => date('Y') + 3, + ), + ) + ); + } + + /** + * Create a valid test transfer. + */ + protected static function createTestTransfer(array $attributes = array(), $opts = null) + { + self::authorizeFromEnv(); + + $recipient = self::createTestRecipient(); + + return Transfer::create( + $attributes + array( + 'amount' => 2000, + 'currency' => 'usd', + 'description' => 'Transfer to test@example.com', + 'recipient' => $recipient->id + ), + $opts + ); + } + + /** + * Create a valid test customer. + */ + protected static function createTestCustomer(array $attributes = array()) + { + self::authorizeFromEnv(); + + return Customer::create( + $attributes + array( + 'card' => array( + 'number' => '4242424242424242', + 'exp_month' => 5, + 'exp_year' => date('Y') + 3, + ), + ) + ); + } + + /** + * Create a valid test recipient + */ + protected static function createTestRecipient(array $attributes = array()) + { + self::authorizeFromEnv(); + + return Recipient::create( + $attributes + array( + 'name' => 'PHP Test', + 'type' => 'individual', + 'tax_id' => '000000000', + 'bank_account' => array( + 'country' => 'US', + 'routing_number' => '110000000', + 'account_number' => '000123456789' + ), + ) + ); + } + + /** + * Create a test account + */ + protected static function createTestAccount(array $attributes = array()) + { + self::authorizeFromEnv(); + + return Account::create( + $attributes + array( + 'managed' => false, + 'country' => 'US', + 'email' => self::generateRandomEmail(), + ) + ); + } + + /** + * Create a test account + */ + protected static function createTestManagedAccount(array $attributes = array()) + { + self::authorizeFromEnv(); + + return Account::create( + $attributes + array( + 'managed' => true, + 'country' => 'US', + 'external_account' => array( + 'object' => 'bank_account', + 'country' => 'US', + 'currency' => 'usd', + 'routing_number' => '110000000', + 'account_number' => '000123456789' + ), + 'legal_entity' => array( + 'type' => 'individual', + 'personal_id_number' => '000000000', + 'type' => 'individual', + 'dob' => array('year' => '1980', 'month' => '01', 'day' => '01'), + 'first_name' => 'John', + 'last_name' => 'Doe', + 'address' => array( + 'line1' => '1234 Main Street', + 'postal_code' => '94110', + 'city' => 'San Francisco' + ), + 'personal_address' => array( + 'line1' => '1234 Main Street', + 'postal_code' => '94110', + 'city' => 'San Francisco' + ) + ), + 'tos_acceptance' => array('date' => time(), 'ip' => '127.0.0.1') + ) + ); + } + + /** + * Verify that a plan with a given ID exists, or create a new one if it does + * not. + */ + protected static function retrieveOrCreatePlan($id) + { + self::authorizeFromEnv(); + + try { + $plan = Plan::retrieve($id); + } catch (Error\InvalidRequest $exception) { + $plan = Plan::create( + array( + 'id' => $id, + 'amount' => 0, + 'currency' => 'usd', + 'interval' => 'month', + 'name' => 'Gold Test Plan', + ) + ); + } + } + + /** + * Verify that a coupon with a given ID exists, or create a new one if it + * does not. + */ + protected static function retrieveOrCreateCoupon($id) + { + self::authorizeFromEnv(); + + try { + $coupon = Coupon::retrieve($id); + } catch (Error\InvalidRequest $exception) { + $coupon = Coupon::create( + array( + 'id' => $id, + 'duration' => 'forever', + 'percent_off' => 25, + ) + ); + } + } + + /** + * Generate a semi-random string + */ + protected static function generateRandomString($length = 24) + { + $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTU'; + $charactersLength = strlen($characters); + $randomString = ''; + for ($i = 0; $i < $length; $i++) { + $randomString .= $characters[rand(0, $charactersLength - 1)]; + } + return $randomString; + } + + /** + * Generate a semi-random email. + */ + protected static function generateRandomEmail() + { + return 'dev-platform-bots+php-'.self::generateRandomString(12).'@stripe.com'; + } + + protected static function createTestBitcoinReceiver($email) + { + $receiver = BitcoinReceiver::create( + array( + 'amount' => 100, + 'currency' => 'usd', + 'description' => 'some details', + 'email' => $email + ) + ); + return $receiver; + } +} diff --git a/htdocs/includes/stripe/tests/ThreeDSecureTest.php b/htdocs/includes/stripe/tests/ThreeDSecureTest.php new file mode 100644 index 00000000000..ebdd62335ee --- /dev/null +++ b/htdocs/includes/stripe/tests/ThreeDSecureTest.php @@ -0,0 +1,46 @@ +mockRequest( + 'GET', + '/v1/3d_secure/tdsrc_test', + array(), + array( + 'id' => 'tdsrc_test', + 'object' => 'three_d_secure' + ) + ); + $three_d_secure = ThreeDSecure::retrieve('tdsrc_test'); + $this->assertSame($three_d_secure->id, 'tdsrc_test'); + } + + public function testCreate() + { + $this->mockRequest( + 'POST', + '/v1/3d_secure', + array( + 'card' => 'tok_test', + 'amount' => 1500, + 'currency' => 'usd', + 'return_url' => 'https://example.org/3d-secure-result' + ), + array( + 'id' => 'tdsrc_test', + 'object' => 'three_d_secure' + ) + ); + $three_d_secure = ThreeDSecure::create(array( + 'card' => 'tok_test', + 'amount' => 1500, + 'currency' => 'usd', + 'return_url' => 'https://example.org/3d-secure-result' + )); + $this->assertSame($three_d_secure->id, 'tdsrc_test'); + } +} diff --git a/htdocs/includes/stripe/tests/TokenTest.php b/htdocs/includes/stripe/tests/TokenTest.php new file mode 100644 index 00000000000..60ec76a1544 --- /dev/null +++ b/htdocs/includes/stripe/tests/TokenTest.php @@ -0,0 +1,13 @@ +assertSame(Token::classUrl(), '/v1/tokens'); + $token = new Token('abcd/efgh'); + $this->assertSame($token->instanceUrl(), '/v1/tokens/abcd%2Fefgh'); + } +} diff --git a/htdocs/includes/stripe/tests/TransferReversalTest.php b/htdocs/includes/stripe/tests/TransferReversalTest.php new file mode 100644 index 00000000000..86d746650f5 --- /dev/null +++ b/htdocs/includes/stripe/tests/TransferReversalTest.php @@ -0,0 +1,19 @@ + '2017-02-14'); + + public function testList() + { + $transfer = self::createTestTransfer(array(), $this->opts); + $all = $transfer->reversals->all(); + $this->assertSame(false, $all['has_more']); + $this->assertSame(0, count($all->data)); + } +} diff --git a/htdocs/includes/stripe/tests/TransferTest.php b/htdocs/includes/stripe/tests/TransferTest.php new file mode 100644 index 00000000000..f4fd347dc4e --- /dev/null +++ b/htdocs/includes/stripe/tests/TransferTest.php @@ -0,0 +1,46 @@ + '2017-02-14'); + + public function testCreate() + { + $transfer = self::createTestTransfer(array(), $this->opts); + $this->assertSame('transfer', $transfer->object); + } + + public function testRetrieve() + { + $transfer = self::createTestTransfer(array(), $this->opts); + $reloaded = Transfer::retrieve($transfer->id, $this->opts); + $this->assertSame($reloaded->id, $transfer->id); + } + + public function testTransferUpdateMetadata() + { + $transfer = self::createTestTransfer(array(), $this->opts); + + $transfer->metadata['test'] = 'foo bar'; + $transfer->save(); + + $updatedTransfer = Transfer::retrieve($transfer->id, $this->opts); + $this->assertSame('foo bar', $updatedTransfer->metadata['test']); + } + + public function testTransferUpdateMetadataAll() + { + $transfer = self::createTestTransfer(array(), $this->opts); + + $transfer->metadata = array('test' => 'foo bar'); + $transfer->save(); + + $updatedTransfer = Transfer::retrieve($transfer->id, $this->opts); + $this->assertSame('foo bar', $updatedTransfer->metadata['test']); + } +} diff --git a/htdocs/includes/stripe/tests/UtilTest.php b/htdocs/includes/stripe/tests/UtilTest.php new file mode 100644 index 00000000000..a1206d698f7 --- /dev/null +++ b/htdocs/includes/stripe/tests/UtilTest.php @@ -0,0 +1,45 @@ +assertTrue(Util\Util::isList($list)); + + $notlist = array(5, 'nstaoush', array(), 'bar' => 'baz'); + $this->assertFalse(Util\Util::isList($notlist)); + } + + public function testThatPHPHasValueSemanticsForArrays() + { + $original = array('php-arrays' => 'value-semantics'); + $derived = $original; + $derived['php-arrays'] = 'reference-semantics'; + + $this->assertSame('value-semantics', $original['php-arrays']); + } + + public function testConvertStripeObjectToArrayIncludesId() + { + $customer = self::createTestCustomer(); + $this->assertTrue(array_key_exists("id", $customer->__toArray(true))); + } + + public function testUtf8() + { + // UTF-8 string + $x = "\xc3\xa9"; + $this->assertSame(Util\Util::utf8($x), $x); + + // Latin-1 string + $x = "\xe9"; + $this->assertSame(Util\Util::utf8($x), "\xc3\xa9"); + + // Not a string + $x = true; + $this->assertSame(Util\Util::utf8($x), $x); + } +} diff --git a/htdocs/includes/stripe/tests/bootstrap.no_autoload.php b/htdocs/includes/stripe/tests/bootstrap.no_autoload.php new file mode 100644 index 00000000000..7358058780a --- /dev/null +++ b/htdocs/includes/stripe/tests/bootstrap.no_autoload.php @@ -0,0 +1,4 @@ + + * Copyright (C) 2017 Saasprov * * 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 diff --git a/htdocs/stripe/checkout.php b/htdocs/stripe/checkout.php new file mode 100644 index 00000000000..0989d55b76f --- /dev/null +++ b/htdocs/stripe/checkout.php @@ -0,0 +1,241 @@ + + * Copyright (C) <2016> SaaSprov.ma + * + * 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 3 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 . + */ + + +// Load Dolibarr environment + + +require_once('config.php'); +require_once('stripe/init.php'); + +define("NOLOGIN",1); +define("NOCSRFCHECK",1); + +$langs->load("main"); +$langs->load("other"); +$langs->load("stripe"); + +$SOURCE=GETPOST("source",'alpha'); +$ref=$REF=GETPOST('ref','alpha'); + +$form = new Form($db); + +/** + * Header empty + * + * @return void + */ +function llxHeader() { } +/** + * Footer empty + * + * @return void + */ +function llxFooter() { } + +$invoice = null; + +// Payment on customer invoice +if (GETPOST("source") == 'invoice') +{ + $found=true; + $langs->load("bills"); + + require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; + + $invoice=new Facture($db); + $result=$invoice->fetch('',$ref); + if ($result < 0) + { + $mesg=$invoice->error; + $error++; + } + else + { + $result=$invoice->fetch_thirdparty($invoice->socid); + } + + +} + +$pay = false; +$ttc = $invoice->total_ttc ; +$ttc = $ttc * 100; +if (GETPOST("action") == 'charge') +{ + $token = GETPOST("stripeToken"); + $email = GETPOST("stripeEmail"); + + $customer = \Stripe\Customer::create(array( + 'email' => $email, + 'card' => $token + )); + + $ttc = round($ttc, 2); + $charge = \Stripe\Charge::create(array( + 'customer' => $customer->id, + 'amount' => $ttc, + 'currency' => $conf->currency, + 'description' => 'Invoice payment N: '.$ref + )); + + $pay = true; + +} + + + +?> + + + + + + <?php echo $langs->trans('PaymentForm'); ?> + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + +
+ '; + print ''; + + ?> + + + + + Invoice #: ref; ?>
+ trans('Date') . ' : ' . dol_print_date($invoice->date, 'day'); ?>
+ trans('DateMaxPayment') . ' : ' . dol_print_date($invoice->date_validation, 'day'); ?> +
+
+ + + + + + +
+ thirdparty->name; ?>
+ thirdparty->address; ?>
+ thirdparty->zip . ', ' . $invoice->thirdparty->town .' '. $invoice->thirdparty->country_code ; ?> +
+ +
+
+ trans('PaymentConditionsShort'); ?> + + form_conditions_reglement('', $invoice->cond_reglement_id, 'none'); ?> +
+ TOTAL + +
+ trans('AmountHT'); ?> + + total_ht, 1, '', 1, - 1, - 1, $conf->currency); ?> +
+ trans('AmountVAT'); ?> + + total_tva, 1, '', 1, - 1, - 1, $conf->currency); ?> +
+ trans('AmountTTC'); ?> + + total_ttc, 1, '', 1, - 1, - 1, $conf->currency); ?> +
+ Total: total_ttc, 1, '', 1, - 1, - 1, $conf->currency); ?> +
+ + + + + + + + +
+ + + + + + + diff --git a/htdocs/stripe/config.php b/htdocs/stripe/config.php new file mode 100644 index 00000000000..9cc083051ec --- /dev/null +++ b/htdocs/stripe/config.php @@ -0,0 +1,36 @@ + + * Copyright (C) <2016> + * + * 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 3 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 . + */ + + +// Load Dolibarr environment +if (false === (@include '../main.inc.php')) { // From htdocs directory + require '../../main.inc.php'; // From "custom" directory +} + +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +dol_include_once('/stripe/lib/stripe.lib.php'); +require_once('stripe/init.php'); + +//use \Stripe\Stripe as Stripe; +$stripe = array( + "secret_key" => $conf->global->TEST_SECRET_KEY, + "publishable_key" => $conf->global->TEST_PUBLISHABLE_KEY +); + +\Stripe\Stripe::setApiKey($stripe['secret_key']); +?> \ No newline at end of file diff --git a/htdocs/stripe/paymnt_link.php b/htdocs/stripe/paymnt_link.php new file mode 100644 index 00000000000..68adbf47a3c --- /dev/null +++ b/htdocs/stripe/paymnt_link.php @@ -0,0 +1,72 @@ + + * Copyright (C) ---Put here your own copyright and developer email--- + * + * 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 3 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 . + */ + + +// Load Dolibarr environment +if (false === (@include '../main.inc.php')) { // From htdocs directory + require '../../main.inc.php'; // From "custom" directory +} +require_once DOL_DOCUMENT_ROOT . '/compta/facture/class/facture.class.php'; + +// Load traductions files requiredby by page +$langs->load("mymodule"); +$langs->load("other"); + +// Get parameters +$id = GETPOST('id', 'int'); // For backward compatibility + +$object = new Facture($db); +// Load object +if ($id > 0 || ! empty($ref)) { + $ret = $object->fetch($id, $ref, '', '', $conf->global->INVOICE_USE_SITUATION); +} + + + + +/*************************************************** +* VIEW +* +* Put here all code to build page +****************************************************/ + +llxHeader('','StripePaymentLink',''); + + +// Part to show record +if ($id) +{ + print load_fiche_titre($langs->trans("StripePaymentLink")); + + dol_fiche_head(); + + $link = $dolibarr_main_url_root . '/custom/stripe/checkout.php?source=invoice&ref=' . $object->ref; + print ''."\n"; + print ''; + // LIST_OF_TD_LABEL_FIELDS_VIEW + print '
'.$langs->trans("PaymentLink").'
'; + + dol_fiche_end(); + + + + +} + +llxFooter(); +$db->close(); From 3b626b75c42a1ad6ce05b5dcbf650bdd0a72e0c5 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sat, 22 Apr 2017 06:58:44 +0200 Subject: [PATCH 004/299] Update works --- htdocs/{stripe => core}/lib/stripe.lib.php | 0 htdocs/core/modules/modStripe.class.php | 4 +- htdocs/stripe/checkout.php | 23 ++++--- htdocs/stripe/config.php | 25 ++++---- htdocs/stripe/lib/index.html | 0 htdocs/stripe/paymnt_link.php | 72 ---------------------- 6 files changed, 26 insertions(+), 98 deletions(-) rename htdocs/{stripe => core}/lib/stripe.lib.php (100%) delete mode 100644 htdocs/stripe/lib/index.html delete mode 100644 htdocs/stripe/paymnt_link.php diff --git a/htdocs/stripe/lib/stripe.lib.php b/htdocs/core/lib/stripe.lib.php similarity index 100% rename from htdocs/stripe/lib/stripe.lib.php rename to htdocs/core/lib/stripe.lib.php diff --git a/htdocs/core/modules/modStripe.class.php b/htdocs/core/modules/modStripe.class.php index 4b498629017..4f4b15fa0a4 100644 --- a/htdocs/core/modules/modStripe.class.php +++ b/htdocs/core/modules/modStripe.class.php @@ -73,8 +73,8 @@ class modStripe extends DolibarrModules // Dependencies $this->depends = array(); // List of modules id that must be enabled if this module is enabled $this->requiredby = array(); // List of modules id to disable if this one is disabled - $this->phpmin = array(4,1); // Minimum version of PHP required by module - $this->need_dolibarr_version = array(2,6); // Minimum version of Dolibarr required by module + $this->phpmin = array(5,3); // Minimum version of PHP required by module + $this->need_dolibarr_version = array(5,0); // Minimum version of Dolibarr required by module $this->langfiles = array("stripe"); // Constants diff --git a/htdocs/stripe/checkout.php b/htdocs/stripe/checkout.php index 0989d55b76f..f7f547afae9 100644 --- a/htdocs/stripe/checkout.php +++ b/htdocs/stripe/checkout.php @@ -1,6 +1,6 @@ - * Copyright (C) <2016> SaaSprov.ma +/* Copyright (C) 2017 Alexandre Spangaro + * Copyright (C) 2017 Saasprov * * 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 @@ -16,12 +16,11 @@ * along with this program. If not, see . */ - +require '../main.inc.php'; + // Load Dolibarr environment - - -require_once('config.php'); -require_once('stripe/init.php'); +require_once DOL_DOCUMENT_ROOT.'/stripe/config.php'); +require_once DOL_DOCUMENT_ROOT.'/includes/stripe/init.php'); define("NOLOGIN",1); define("NOCSRFCHECK",1); @@ -30,8 +29,8 @@ $langs->load("main"); $langs->load("other"); $langs->load("stripe"); -$SOURCE=GETPOST("source",'alpha'); -$ref=$REF=GETPOST('ref','alpha'); +$source=GETPOST("source",'alpha'); +$ref=GETPOST('ref','alpha'); $form = new Form($db); @@ -40,18 +39,18 @@ $form = new Form($db); * * @return void */ -function llxHeader() { } +function llxHeader() {} /** * Footer empty * * @return void */ -function llxFooter() { } +function llxFooter() {} $invoice = null; // Payment on customer invoice -if (GETPOST("source") == 'invoice') +if ($source == 'invoice') { $found=true; $langs->load("bills"); diff --git a/htdocs/stripe/config.php b/htdocs/stripe/config.php index 9cc083051ec..78d394feb53 100644 --- a/htdocs/stripe/config.php +++ b/htdocs/stripe/config.php @@ -1,6 +1,6 @@ - * Copyright (C) <2016> +/* Copyright (C) 2017 Alexandre Spangaro + * Copyright (C) 2017 Saasprov * * 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 @@ -16,21 +16,22 @@ * along with this program. If not, see . */ +/** +* \file stripe/config.php +* \ingroup Stripe +* \brief Page to move config in api +*/ -// Load Dolibarr environment -if (false === (@include '../main.inc.php')) { // From htdocs directory - require '../../main.inc.php'; // From "custom" directory -} +require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; dol_include_once('/stripe/lib/stripe.lib.php'); -require_once('stripe/init.php'); +require_once DOL_DOCUMENT_ROOT.'/includes/stripe/init.php'); -//use \Stripe\Stripe as Stripe; +//use \includes\stripe as stripe; $stripe = array( - "secret_key" => $conf->global->TEST_SECRET_KEY, - "publishable_key" => $conf->global->TEST_PUBLISHABLE_KEY + "secret_key" => $conf->global->STRIPE_TEST_SECRET_KEY, + "publishable_key" => $conf->global->STRIPE_TEST_PUBLISHABLE_KEY ); -\Stripe\Stripe::setApiKey($stripe['secret_key']); -?> \ No newline at end of file +\includes\stripe::setApiKey($stripe['secret_key']); \ No newline at end of file diff --git a/htdocs/stripe/lib/index.html b/htdocs/stripe/lib/index.html deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/htdocs/stripe/paymnt_link.php b/htdocs/stripe/paymnt_link.php deleted file mode 100644 index 68adbf47a3c..00000000000 --- a/htdocs/stripe/paymnt_link.php +++ /dev/null @@ -1,72 +0,0 @@ - - * Copyright (C) ---Put here your own copyright and developer email--- - * - * 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 3 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 . - */ - - -// Load Dolibarr environment -if (false === (@include '../main.inc.php')) { // From htdocs directory - require '../../main.inc.php'; // From "custom" directory -} -require_once DOL_DOCUMENT_ROOT . '/compta/facture/class/facture.class.php'; - -// Load traductions files requiredby by page -$langs->load("mymodule"); -$langs->load("other"); - -// Get parameters -$id = GETPOST('id', 'int'); // For backward compatibility - -$object = new Facture($db); -// Load object -if ($id > 0 || ! empty($ref)) { - $ret = $object->fetch($id, $ref, '', '', $conf->global->INVOICE_USE_SITUATION); -} - - - - -/*************************************************** -* VIEW -* -* Put here all code to build page -****************************************************/ - -llxHeader('','StripePaymentLink',''); - - -// Part to show record -if ($id) -{ - print load_fiche_titre($langs->trans("StripePaymentLink")); - - dol_fiche_head(); - - $link = $dolibarr_main_url_root . '/custom/stripe/checkout.php?source=invoice&ref=' . $object->ref; - print ''."\n"; - print ''; - // LIST_OF_TD_LABEL_FIELDS_VIEW - print '
'.$langs->trans("PaymentLink").'
'; - - dol_fiche_end(); - - - - -} - -llxFooter(); -$db->close(); From 86338d1781f812ebae2d584330fdd9e33cdef831 Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Mon, 24 Apr 2017 09:03:25 +0200 Subject: [PATCH 005/299] FIX : #6747 --- htdocs/core/class/html.form.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 0b5778a512a..7f10fca51f8 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -1435,8 +1435,8 @@ class Form { if (! empty($conf->multicompany->transverse_mode)) { - $sql.= ", ".MAIN_DB_PREFIX."usergroup_user as ug"; - $sql.= " WHERE ug.fk_user = u.rowid"; + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."usergroup_user as ug"; + $sql.= " ON ug.fk_user = u.rowid"; $sql.= " AND ug.entity = ".$conf->entity; } else From 47089a4d550517aef1a166848151f9996cac641e Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sat, 29 Apr 2017 07:04:34 +0200 Subject: [PATCH 006/299] Modle Stripe : Work in progress --- htdocs/core/lib/stripe.lib.php | 147 ---- htdocs/{ => public}/stripe/checkout.php | 31 +- htdocs/{ => public}/stripe/config.php | 6 +- htdocs/public/stripe/newpayment.php | 977 ------------------------ htdocs/public/stripe/paymentko.php | 115 --- htdocs/public/stripe/paymentok.php | 172 ----- htdocs/stripe/admin/stripe.php | 22 +- 7 files changed, 27 insertions(+), 1443 deletions(-) rename htdocs/{ => public}/stripe/checkout.php (94%) rename htdocs/{ => public}/stripe/config.php (88%) delete mode 100644 htdocs/public/stripe/newpayment.php delete mode 100644 htdocs/public/stripe/paymentko.php delete mode 100644 htdocs/public/stripe/paymentok.php diff --git a/htdocs/core/lib/stripe.lib.php b/htdocs/core/lib/stripe.lib.php index d2d138cc8b3..175df3554ce 100644 --- a/htdocs/core/lib/stripe.lib.php +++ b/htdocs/core/lib/stripe.lib.php @@ -229,153 +229,6 @@ function getStripePaymentUrl($mode,$type,$ref='',$amount='9.99',$freetag='your_f } -/** - * Create a redirect form to paybox form - * - * @param int $PRICE Price - * @param string $CURRENCY Currency - * @param string $EMAIL EMail - * @param string $urlok Url to go back if payment is OK - * @param string $urlko Url to go back if payment is KO - * @param string $TAG Tag - * @return int 1 if OK, -1 if ERROR - */ -function print_stripe_redirect($PRICE,$CURRENCY,$EMAIL,$urlok,$urlko,$TAG) -{ - global $conf, $langs, $db; - - dol_syslog("Stripe.lib::print_paybox_redirect", LOG_DEBUG); - - // Clean parameters - $PBX_IDENTIFIANT="2"; // Identifiant pour v2 test - if (! empty($conf->global->PAYBOX_PBX_IDENTIFIANT)) $PBX_IDENTIFIANT=$conf->global->PAYBOX_PBX_IDENTIFIANT; - $IBS_SITE="1999888"; // Site test - if (! empty($conf->global->PAYBOX_IBS_SITE)) $IBS_SITE=$conf->global->PAYBOX_IBS_SITE; - $IBS_RANG="99"; // Rang test - if (! empty($conf->global->PAYBOX_IBS_RANG)) $IBS_RANG=$conf->global->PAYBOX_IBS_RANG; - $IBS_DEVISE="840"; // Currency (Dollar US by default) - if ($CURRENCY == 'EUR') $IBS_DEVISE="978"; - if ($CURRENCY == 'USD') $IBS_DEVISE="840"; - - $URLPAYBOX=""; - if ($conf->global->PAYBOX_CGI_URL_V1) $URLPAYBOX=$conf->global->PAYBOX_CGI_URL_V1; - if ($conf->global->PAYBOX_CGI_URL_V2) $URLPAYBOX=$conf->global->PAYBOX_CGI_URL_V2; - - if (empty($IBS_DEVISE)) - { - dol_print_error('',"Paybox setup param PAYBOX_IBS_DEVISE not defined"); - return -1; - } - if (empty($URLPAYBOX)) - { - dol_print_error('',"Paybox setup param PAYBOX_CGI_URL_V1 and PAYBOX_CGI_URL_V2 undefined"); - return -1; - } - if (empty($IBS_SITE)) - { - dol_print_error('',"Paybox setup param PAYBOX_IBS_SITE not defined"); - return -1; - } - if (empty($IBS_RANG)) - { - dol_print_error('',"Paybox setup param PAYBOX_IBS_RANG not defined"); - return -1; - } - - // Definition des parametres vente produit pour paybox - $IBS_CMD=$TAG; - $IBS_TOTAL=$PRICE*100; // En centimes - $IBS_MODE=1; // Mode formulaire - $IBS_PORTEUR=$EMAIL; - $IBS_RETOUR="montant:M;ref:R;auto:A;trans:T"; // Format des parametres du get de validation en reponse (url a definir sous paybox) - $IBS_TXT=' '; // Use a space - $IBS_BOUTPI=$langs->trans("Wait"); - //$IBS_BOUTPI=''; - $IBS_EFFECTUE=$urlok; - $IBS_ANNULE=$urlko; - $IBS_REFUSE=$urlko; - $IBS_BKGD="#FFFFFF"; - $IBS_WAIT="2000"; - $IBS_LANG="GBR"; // By default GBR=english (FRA, GBR, ESP, ITA et DEU...) - if (preg_match('/^FR/i',$langs->defaultlang)) $IBS_LANG="FRA"; - if (preg_match('/^ES/i',$langs->defaultlang)) $IBS_LANG="ESP"; - if (preg_match('/^IT/i',$langs->defaultlang)) $IBS_LANG="ITA"; - if (preg_match('/^DE/i',$langs->defaultlang)) $IBS_LANG="DEU"; - if (preg_match('/^NL/i',$langs->defaultlang)) $IBS_LANG="NLD"; - if (preg_match('/^SE/i',$langs->defaultlang)) $IBS_LANG="SWE"; - $IBS_OUTPUT='E'; - $PBX_SOURCE='HTML'; - $PBX_TYPEPAIEMENT='CARTE'; - - dol_syslog("Soumission Paybox", LOG_DEBUG); - dol_syslog("IBS_MODE: $IBS_MODE", LOG_DEBUG); - dol_syslog("IBS_SITE: $IBS_SITE", LOG_DEBUG); - dol_syslog("IBS_RANG: $IBS_RANG", LOG_DEBUG); - dol_syslog("IBS_TOTAL: $IBS_TOTAL", LOG_DEBUG); - dol_syslog("IBS_DEVISE: $IBS_DEVISE", LOG_DEBUG); - dol_syslog("IBS_CMD: $IBS_CMD", LOG_DEBUG); - dol_syslog("IBS_PORTEUR: $IBS_PORTEUR", LOG_DEBUG); - dol_syslog("IBS_RETOUR: $IBS_RETOUR", LOG_DEBUG); - dol_syslog("IBS_EFFECTUE: $IBS_EFFECTUE", LOG_DEBUG); - dol_syslog("IBS_ANNULE: $IBS_ANNULE", LOG_DEBUG); - dol_syslog("IBS_REFUSE: $IBS_REFUSE", LOG_DEBUG); - dol_syslog("IBS_BKGD: $IBS_BKGD", LOG_DEBUG); - dol_syslog("IBS_WAIT: $IBS_WAIT", LOG_DEBUG); - dol_syslog("IBS_LANG: $IBS_LANG", LOG_DEBUG); - dol_syslog("IBS_OUTPUT: $IBS_OUTPUT", LOG_DEBUG); - dol_syslog("PBX_IDENTIFIANT: $PBX_IDENTIFIANT", LOG_DEBUG); - dol_syslog("PBX_SOURCE: $PBX_SOURCE", LOG_DEBUG); - dol_syslog("PBX_TYPEPAIEMENT: $PBX_TYPEPAIEMENT", LOG_DEBUG); - - header("Content-type: text/html; charset=".$conf->file->character_set_client); - - print ''."\n"; - print ''."\n"; - print "\n"; - print ''."\n"; - print ''."\n"; - print "\n"; - - // Formulaire pour module Paybox - print '
'."\n"; - - // For Paybox V2 (PBX_xxx) - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - - print '
'."\n"; - - - print "\n"; - print ''."\n"; - print "\n"; - print ''."\n"; - print "\n"; - - return; -} - - /** * Show footer of company in HTML pages * diff --git a/htdocs/stripe/checkout.php b/htdocs/public/stripe/checkout.php similarity index 94% rename from htdocs/stripe/checkout.php rename to htdocs/public/stripe/checkout.php index f7f547afae9..4bea80bce6c 100644 --- a/htdocs/stripe/checkout.php +++ b/htdocs/public/stripe/checkout.php @@ -16,15 +16,17 @@ * along with this program. If not, see . */ -require '../main.inc.php'; - -// Load Dolibarr environment -require_once DOL_DOCUMENT_ROOT.'/stripe/config.php'); -require_once DOL_DOCUMENT_ROOT.'/includes/stripe/init.php'); - define("NOLOGIN",1); define("NOCSRFCHECK",1); +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/stripe.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/public/stripe/config.php'; +require_once DOL_DOCUMENT_ROOT.'/includes/stripe/init.php'; + +// Security check +if (empty($conf->paypal->enabled)) accessforbidden('',0,0,1); + $langs->load("main"); $langs->load("other"); $langs->load("stripe"); @@ -34,19 +36,6 @@ $ref=GETPOST('ref','alpha'); $form = new Form($db); -/** - * Header empty - * - * @return void - */ -function llxHeader() {} -/** - * Footer empty - * - * @return void - */ -function llxFooter() {} - $invoice = null; // Payment on customer invoice @@ -68,8 +57,6 @@ if ($source == 'invoice') { $result=$invoice->fetch_thirdparty($invoice->socid); } - - } $pay = false; @@ -225,7 +212,7 @@ if (GETPOST("action") == 'charge') - + diff --git a/htdocs/stripe/config.php b/htdocs/public/stripe/config.php similarity index 88% rename from htdocs/stripe/config.php rename to htdocs/public/stripe/config.php index 78d394feb53..ac315762b29 100644 --- a/htdocs/stripe/config.php +++ b/htdocs/public/stripe/config.php @@ -22,11 +22,11 @@ * \brief Page to move config in api */ -require '../main.inc.php'; +require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; -dol_include_once('/stripe/lib/stripe.lib.php'); -require_once DOL_DOCUMENT_ROOT.'/includes/stripe/init.php'); +require_once DOL_DOCUMENT_ROOT.'/core/lib/stripe.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/includes/stripe/init.php'; //use \includes\stripe as stripe; $stripe = array( diff --git a/htdocs/public/stripe/newpayment.php b/htdocs/public/stripe/newpayment.php deleted file mode 100644 index 33499fe7098..00000000000 --- a/htdocs/public/stripe/newpayment.php +++ /dev/null @@ -1,977 +0,0 @@ - - * Copyright (C) 2006-2012 Laurent Destailleur - * Copyright (C) 2009-2012 Regis Houssin - * - * 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 3 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 . - * - * For test: https://stripe.com/docs - */ - -/** - * \file htdocs/public/stripe/newpayment.php - * \ingroup stripe - * \brief File to offer a way to make a payment for a particular Dolibarr entity - */ - -define("NOLOGIN",1); // This means this output page does not require to be logged. -define("NOCSRFCHECK",1); // We accept to go on this page from external web site. - -// For MultiCompany module. -// Do not use GETPOST here, function is not defined and define must be done before including main.inc.php -// TODO This should be useless. Because entity must be retreive from object ref and not from url. -$entity=(! empty($_GET['entity']) ? (int) $_GET['entity'] : (! empty($_POST['entity']) ? (int) $_POST['entity'] : 1)); -if (is_numeric($entity)) define("DOLENTITY", $entity); - -require '../../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/stripe/lib/stripe.lib.php'; -// require_once DOL_DOCUMENT_ROOT.'/stripe/lib/stripefunctions.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; - -// Security check -if (empty($conf->stripe->enabled)) accessforbidden('',0,0,1); - -$langs->load("main"); -$langs->load("other"); -$langs->load("dict"); -$langs->load("bills"); -$langs->load("companies"); -$langs->load("errors"); -$langs->load("paybox"); -$langs->load("paypal"); -$langs->load("stripe"); - -// Input are: -// type ('invoice','order','contractline'), -// id (object id), -// amount (required if id is empty), -// tag (a free text, required if type is empty) -// currency (iso code) - -$suffix=GETPOST("suffix",'alpha'); -$amount=price2num(GETPOST("amount")); -if (! GETPOST("currency",'alpha')) $currency=$conf->currency; -else $currency=GETPOST("currency",'alpha'); - -if (! GETPOST("action")) -{ - if (! GETPOST("amount") && ! GETPOST("source")) - { - dol_print_error('',$langs->trans('ErrorBadParameters')." - amount or source"); - exit; - } - if (is_numeric($amount) && ! GETPOST("tag") && ! GETPOST("source")) - { - dol_print_error('',$langs->trans('ErrorBadParameters')." - tag or source"); - exit; - } - if (GETPOST("source") && ! GETPOST("ref")) - { - dol_print_error('',$langs->trans('ErrorBadParameters')." - ref"); - exit; - } -} - -// Define $urlwithroot -//$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root)); -//$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file -$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current - -$urlok=$urlwithroot.'/public/stripe/paymentok.php?'; -$urlko=$urlwithroot.'/public/stripe/paymentko.php?'; - -// Complete urls for post treatment -$SOURCE=GETPOST("source",'alpha'); -$ref=$REF=GETPOST('ref','alpha'); -$TAG=GETPOST("tag",'alpha'); -$FULLTAG=GETPOST("fulltag",'alpha'); // fulltag is tag with more informations -$SECUREKEY=GETPOST("securekey"); // Secure key - -if (! empty($SOURCE)) -{ - $urlok.='source='.urlencode($SOURCE).'&'; - $urlko.='source='.urlencode($SOURCE).'&'; -} -if (! empty($REF)) -{ - $urlok.='ref='.urlencode($REF).'&'; - $urlko.='ref='.urlencode($REF).'&'; -} -if (! empty($TAG)) -{ - $urlok.='tag='.urlencode($TAG).'&'; - $urlko.='tag='.urlencode($TAG).'&'; -} -if (! empty($FULLTAG)) -{ - $urlok.='fulltag='.urlencode($FULLTAG).'&'; - $urlko.='fulltag='.urlencode($FULLTAG).'&'; -} -if (! empty($SECUREKEY)) -{ - $urlok.='securekey='.urlencode($SECUREKEY).'&'; - $urlko.='securekey='.urlencode($SECUREKEY).'&'; -} -if (! empty($entity)) -{ - $urlok.='entity='.urlencode($entity).'&'; - $urlko.='entity='.urlencode($entity).'&'; -} -$urlok=preg_replace('/&$/','',$urlok); // Remove last & -$urlko=preg_replace('/&$/','',$urlko); // Remove last & - -// Check parameters -$PAYPAL_API_OK=""; -if ($urlok) $PAYPAL_API_OK=$urlok; -$PAYPAL_API_KO=""; -if ($urlko) $PAYPAL_API_KO=$urlko; -/* -if (empty($PAYPAL_API_USER)) -{ - dol_print_error('',"Paypal setup param PAYPAL_API_USER not defined"); - return -1; -} -if (empty($PAYPAL_API_PASSWORD)) -{ - dol_print_error('',"Paypal setup param PAYPAL_API_PASSWORD not defined"); - return -1; -} -if (empty($PAYPAL_API_SIGNATURE)) -{ - dol_print_error('',"Paypal setup param PAYPAL_API_SIGNATURE not defined"); - return -1; -} -*/ - -// Check security token -$valid=true; -if (! empty($conf->global->PAYPAL_SECURITY_TOKEN)) -{ - if (! empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) - { - if ($SOURCE && $REF) $token = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . $SOURCE . $REF, 2); // Use the source in the hash to avoid duplicates if the references are identical - else $token = dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2); - } - else - { - $token = $conf->global->PAYPAL_SECURITY_TOKEN; - } - if ($SECUREKEY != $token) $valid=false; - - if (! $valid) - { - print '
Bad value for key.
'; - //print 'SECUREKEY='.$SECUREKEY.' token='.$token.' valid='.$valid; - exit; - } -} - - - -/* - * Actions - */ - -if (GETPOST("action") == 'dopayment') -{ - $PAYPAL_API_PRICE=price2num(GETPOST("newamount"),'MT'); - $PAYPAL_PAYMENT_TYPE='Sale'; - - $shipToName=GETPOST("shipToName"); - $shipToStreet=GETPOST("shipToStreet"); - $shipToCity=GETPOST("shipToCity"); - $shipToState=GETPOST("shipToState"); - $shipToCountryCode=GETPOST("shipToCountryCode"); - $shipToZip=GETPOST("shipToZip"); - $shipToStreet2=GETPOST("shipToStreet2"); - $phoneNum=GETPOST("phoneNum"); - $email=GETPOST("email"); - $desc=GETPOST("desc"); - - $mesg=''; - if (empty($PAYPAL_API_PRICE) || ! is_numeric($PAYPAL_API_PRICE)) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Amount")); - //elseif (empty($EMAIL)) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("YourEMail")); - //elseif (! isValidEMail($EMAIL)) $mesg=$langs->trans("ErrorBadEMail",$EMAIL); - elseif (empty($FULLTAG)) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("PaymentCode")); - - //var_dump($_POST); - if (empty($mesg)) - { - dol_syslog("newpayment.php call paypal api and do redirect", LOG_DEBUG); - - // Other - $PAYPAL_API_DEVISE="USD"; - //if ($currency == 'EUR') $PAYPAL_API_DEVISE="EUR"; - //if ($currency == 'USD') $PAYPAL_API_DEVISE="USD"; - if (! empty($currency)) $PAYPAL_API_DEVISE=$currency; - - dol_syslog("Submit Paypal form", LOG_DEBUG); - dol_syslog("PAYPAL_API_USER: $PAYPAL_API_USER", LOG_DEBUG); - //dol_syslog("PAYPAL_API_PASSWORD: $PAYPAL_API_PASSWORD", LOG_DEBUG); // No password into log files - dol_syslog("PAYPAL_API_SIGNATURE: $PAYPAL_API_SIGNATURE", LOG_DEBUG); - dol_syslog("PAYPAL_API_SANDBOX: $PAYPAL_API_SANDBOX", LOG_DEBUG); - dol_syslog("PAYPAL_API_OK: $PAYPAL_API_OK", LOG_DEBUG); - dol_syslog("PAYPAL_API_KO: $PAYPAL_API_KO", LOG_DEBUG); - dol_syslog("PAYPAL_API_PRICE: $PAYPAL_API_PRICE", LOG_DEBUG); - dol_syslog("PAYPAL_API_DEVISE: $PAYPAL_API_DEVISE", LOG_DEBUG); - dol_syslog("shipToName: $shipToName", LOG_DEBUG); - dol_syslog("shipToStreet: $shipToStreet", LOG_DEBUG); - dol_syslog("shipToCity: $shipToCity", LOG_DEBUG); - dol_syslog("shipToState: $shipToState", LOG_DEBUG); - dol_syslog("shipToCountryCode: $shipToCountryCode", LOG_DEBUG); - dol_syslog("shipToZip: $shipToZip", LOG_DEBUG); - dol_syslog("shipToStreet2: $shipToStreet2", LOG_DEBUG); - dol_syslog("phoneNum: $phoneNum", LOG_DEBUG); - dol_syslog("email: $email", LOG_DEBUG); - dol_syslog("desc: $desc", LOG_DEBUG); - - dol_syslog("SCRIPT_URI: ".(empty($_SERVER["SCRIPT_URI"])?'':$_SERVER["SCRIPT_URI"]), LOG_DEBUG); // If defined script uri must match domain of PAYPAL_API_OK and PAYPAL_API_KO - //$_SESSION["PaymentType"]=$PAYPAL_PAYMENT_TYPE; - //$_SESSION["currencyCodeType"]=$PAYPAL_API_DEVISE; - //$_SESSION["Payment_Amount"]=$PAYPAL_API_PRICE; - - // A redirect is added if API call successfull - print_paypal_redirect($PAYPAL_API_PRICE,$PAYPAL_API_DEVISE,$PAYPAL_PAYMENT_TYPE,$PAYPAL_API_OK,$PAYPAL_API_KO, $FULLTAG); - - exit; - } -} - - - -/* - * View - */ - -llxHeaderStripe($langs->trans("PaymentForm")); - -if (! empty($PAYPAL_API_SANDBOX)) -{ - dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode'),'','warning'); -} - -// Common variables -$creditor=$mysoc->name; -$paramcreditor='PAYPAL_CREDITOR_'.$suffix; -if (! empty($conf->global->$paramcreditor)) $creditor=$conf->global->$paramcreditor; -else if (! empty($conf->global->PAYPAL_CREDITOR)) $creditor=$conf->global->PAYPAL_CREDITOR; - -print ''."\n"; -print '
'."\n"; -print '
'."\n"; -print ''."\n"; -print ''."\n"; -print ''."\n"; -print ''."\n"; -print ''."\n"; -print ''; -print "\n"; -print ''."\n"; -print ''."\n"; -print ''."\n"; -print ''."\n"; -print ''."\n"; -print ''."\n"; -print "\n"; - -print ''."\n"; - -// Show logo (search order: logo defined by PAYBOX_LOGO_suffix, then PAYBOX_LOGO, then small company logo, large company logo, theme logo, common logo) -$width=0; -// Define logo and logosmall -$logosmall=$mysoc->logo_small; -$logo=$mysoc->logo; -$paramlogo='PAYBOX_LOGO_'.$suffix; -if (! empty($conf->global->$paramlogo)) $logosmall=$conf->global->$paramlogo; -else if (! empty($conf->global->PAYBOX_LOGO)) $logosmall=$conf->global->PAYBOX_LOGO; -//print ''."\n"; -// Define urllogo -$urllogo=''; -if (! empty($logosmall) && is_readable($conf->mycompany->dir_output.'/logos/thumbs/'.$logosmall)) -{ - $urllogo=DOL_URL_ROOT.'/viewimage.php?modulepart=companylogo&file='.urlencode('thumbs/'.$logosmall); -} -elseif (! empty($logo) && is_readable($conf->mycompany->dir_output.'/logos/'.$logo)) -{ - $urllogo=DOL_URL_ROOT.'/viewimage.php?modulepart=companylogo&file='.urlencode($logo); - $width=96; -} -// Output html code for logo -if ($urllogo) -{ - print ''; - print ''; - print ''."\n"; -} - -// Output introduction text -$text=''; -if (! empty($conf->global->PAYPAL_NEWFORM_TEXT)) -{ - $langs->load("members"); - if (preg_match('/^\((.*)\)$/',$conf->global->PAYPAL_NEWFORM_TEXT,$reg)) $text.=$langs->trans($reg[1])."
\n"; - else $text.=$conf->global->PAYPAL_NEWFORM_TEXT."
\n"; - $text=''."\n"; -} -if (empty($text)) -{ - $text.=''."\n"; - $text.=''."\n"; -} -print $text; - -// Output payment summary form -print ''."\n"; - -print '

'.$text.'

'.$langs->trans("WelcomeOnPaymentPage").'

'.$langs->trans("ThisScreenAllowsYouToPay",$creditor).'

'; -print ''; -print ''."\n"; - -$found=false; -$error=0; -$var=false; - -// Free payment -if (! GETPOST("source") && $valid) -{ - $found=true; - $tag=GETPOST("tag"); - $fulltag=$tag; - - // Creditor - $var=!$var; - print ''."\n"; - - // Amount - $var=!$var; - print ''."\n"; - - // Tag - $var=!$var; - print ''."\n"; - - // We do not add fields shipToName, shipToStreet, shipToCity, shipToState, shipToCountryCode, shipToZip, shipToStreet2, phoneNum - // as they don't exists (buyer is unknown, tag is free). -} - - -// Payment on customer order -if (GETPOST("source") == 'order' && $valid) -{ - $found=true; - $langs->load("orders"); - - require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php'; - - $order=new Commande($db); - $result=$order->fetch('',$ref); - if ($result < 0) - { - $mesg=$order->error; - $error++; - } - else - { - $result=$order->fetch_thirdparty($order->socid); - } - - $amount=$order->total_ttc; - if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); - $amount=price2num($amount); - - $fulltag='ORD='.$order->ref.'.CUS='.$order->thirdparty->id; - //$fulltag.='.NAM='.strtr($order->thirdparty->name,"-"," "); - if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; } - $fulltag=dol_string_unaccent($fulltag); - - // Creditor - $var=!$var; - print ''."\n"; - - // Debitor - $var=!$var; - print ''."\n"; - - // Amount - $var=!$var; - print ''."\n"; - - // Tag - $var=!$var; - print ''."\n"; - - // Shipping address - $shipToName=$order->thirdparty->name; - $shipToStreet=$order->thirdparty->address; - $shipToCity=$order->thirdparty->town; - $shipToState=$order->thirdparty->state_code; - $shipToCountryCode=$order->thirdparty->country_code; - $shipToZip=$order->thirdparty->zip; - $shipToStreet2=''; - $phoneNum=$order->thirdparty->phone; - if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) - { - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - } - else - { - print ''."\n"; - } - print ''."\n"; - print 'ref.'">'."\n"; -} - - -// Payment on customer invoice -if (GETPOST("source") == 'invoice' && $valid) -{ - $found=true; - $langs->load("bills"); - - require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; - - $invoice=new Facture($db); - $result=$invoice->fetch('',$ref); - if ($result < 0) - { - $mesg=$invoice->error; - $error++; - } - else - { - $result=$invoice->fetch_thirdparty($invoice->socid); - } - - $amount=price2num($invoice->total_ttc - $invoice->getSommePaiement()); - if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); - $amount=price2num($amount); - - $fulltag='INV='.$invoice->ref.'.CUS='.$invoice->thirdparty->id; - //$fulltag.='.NAM='.strtr($invoice->thirdparty->name,"-"," "); - if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; } - $fulltag=dol_string_unaccent($fulltag); - - // Creditor - $var=!$var; - print ''."\n"; - - // Debitor - $var=!$var; - print ''."\n"; - - // Amount - $var=!$var; - print ''."\n"; - - // Tag - $var=!$var; - print ''."\n"; - - // Shipping address - $shipToName=$invoice->thirdparty->name; - $shipToStreet=$invoice->thirdparty->address; - $shipToCity=$invoice->thirdparty->town; - $shipToState=$invoice->thirdparty->state_code; - $shipToCountryCode=$invoice->thirdparty->country_code; - $shipToZip=$invoice->thirdparty->zip; - $shipToStreet2=''; - $phoneNum=$invoice->thirdparty->phone; - if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) - { - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - } - else - { - print ''."\n"; - } - print ''."\n"; - print 'ref.'">'."\n"; -} - -// Payment on contract line -if (GETPOST("source") == 'contractline' && $valid) -{ - $found=true; - $langs->load("contracts"); - - require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php'; - - $contractline=new ContratLigne($db); - $result=$contractline->fetch('',$ref); - if ($result < 0) - { - $mesg=$contractline->error; - $error++; - } - else - { - if ($contractline->fk_contrat > 0) - { - $contract=new Contrat($db); - $result=$contract->fetch($contractline->fk_contrat); - if ($result > 0) - { - $result=$contract->fetch_thirdparty($contract->socid); - } - else - { - $mesg=$contract->error; - $error++; - } - } - else - { - $mesg='ErrorRecordNotFound'; - $error++; - } - } - - $amount=$contractline->total_ttc; - if ($contractline->fk_product) - { - $product=new Product($db); - $result=$product->fetch($contractline->fk_product); - - // We define price for product (TODO Put this in a method in product class) - if (! empty($conf->global->PRODUIT_MULTIPRICES)) - { - $pu_ht = $product->multiprices[$contract->thirdparty->price_level]; - $pu_ttc = $product->multiprices_ttc[$contract->thirdparty->price_level]; - $price_base_type = $product->multiprices_base_type[$contract->thirdparty->price_level]; - } - else - { - $pu_ht = $product->price; - $pu_ttc = $product->price_ttc; - $price_base_type = $product->price_base_type; - } - - $amount=$pu_ttc; - if (empty($amount)) - { - dol_print_error('','ErrorNoPriceDefinedForThisProduct'); - exit; - } - } - if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); - $amount=price2num($amount); - - $fulltag='COL='.$contractline->ref.'.CON='.$contract->ref.'.CUS='.$contract->thirdparty->id.'.DAT='.dol_print_date(dol_now(),'%Y%m%d%H%M'); - //$fulltag.='.NAM='.strtr($contract->thirdparty->name,"-"," "); - if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; } - $fulltag=dol_string_unaccent($fulltag); - - $qty=1; - if (GETPOST('qty')) $qty=GETPOST('qty'); - - // Creditor - $var=!$var; - print ''."\n"; - - // Debitor - $var=!$var; - print ''."\n"; - - // Quantity - $var=!$var; - $label=$langs->trans("Quantity"); - $qty=1; - $duration=''; - if ($contractline->fk_product) - { - if ($product->isService() && $product->duration_value > 0) - { - $label=$langs->trans("Duration"); - - // TODO Put this in a global method - if ($product->duration_value > 1) - { - $dur=array("h"=>$langs->trans("Hours"),"d"=>$langs->trans("DurationDays"),"w"=>$langs->trans("DurationWeeks"),"m"=>$langs->trans("DurationMonths"),"y"=>$langs->trans("DurationYears")); - } - else - { - $dur=array("h"=>$langs->trans("Hour"),"d"=>$langs->trans("DurationDay"),"w"=>$langs->trans("DurationWeek"),"m"=>$langs->trans("DurationMonth"),"y"=>$langs->trans("DurationYear")); - } - $duration=$product->duration_value.' '.$dur[$product->duration_unit]; - } - } - print ''; - print ''."\n"; - - // Amount - $var=!$var; - print ''."\n"; - - // Tag - $var=!$var; - print ''."\n"; - - // Shipping address - $shipToName=$contract->thirdparty->name; - $shipToStreet=$contract->thirdparty->address; - $shipToCity=$contract->thirdparty->town; - $shipToState=$contract->thirdparty->state_code; - $shipToCountryCode=$contract->thirdparty->country_code; - $shipToZip=$contract->thirdparty->zip; - $shipToStreet2=''; - $phoneNum=$contract->thirdparty->phone; - if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) - { - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - } - else - { - print ''."\n"; - } - print ''."\n"; - print 'ref.'">'."\n"; -} - -// Payment on member subscription -if (GETPOST("source") == 'membersubscription' && $valid) -{ - $found=true; - $langs->load("members"); - - require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; - require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php'; - - $member=new Adherent($db); - $result=$member->fetch('',$ref); - if ($result < 0) - { - $mesg=$member->error; - $error++; - } - else - { - $subscription=new Subscription($db); - } - - $amount=$subscription->total_ttc; - if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); - $amount=price2num($amount); - - $fulltag='MEM='.$member->id.'.DAT='.dol_print_date(dol_now(),'%Y%m%d%H%M'); - if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; } - $fulltag=dol_string_unaccent($fulltag); - - // Creditor - $var=!$var; - print ''."\n"; - - // Debitor - $var=!$var; - print ''."\n"; - - if ($member->last_subscription_date || $member->last_subscription_amount) - { - // Last subscription date - $var=!$var; - print ''."\n"; - - // Last subscription amount - $var=!$var; - print ''."\n"; - - if (empty($amount) && ! GETPOST('newamount')) $_GET['newamount']=$member->last_subscription_amount; - } - - // Amount - $var=!$var; - print ''."\n"; - - // Tag - $var=!$var; - print ''."\n"; - - // Shipping address - $shipToName=$member->getFullName($langs); - $shipToStreet=$member->address; - $shipToCity=$member->town; - $shipToState=$member->state_code; - $shipToCountryCode=$member->country_code; - $shipToZip=$member->zip; - $shipToStreet2=''; - $phoneNum=$member->phone; - if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) - { - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - } - else - { - print ''."\n"; - } - print ''."\n"; - print ''."\n"; -} - - - - -if (! $found && ! $mesg) $mesg=$langs->trans("ErrorBadParameters"); - -if ($mesg) print ''."\n"; - -print '
'.$langs->trans("ThisIsInformationOnPayment").' :
'.$langs->trans("Creditor"); - print ''.$creditor.''; - print ''; - print '
'.$langs->trans("Amount"); - if (empty($amount)) print ' ('.$langs->trans("ToComplete").')'; - print ''; - if (empty($amount) || ! is_numeric($amount)) - { - print ''; - print ''; - } - else { - print ''.price($amount).''; - print ''; - print ''; - } - // Currency - print ' '.$langs->trans("Currency".$currency).''; - print ''; - print '
'.$langs->trans("PaymentCode"); - print ''.$fulltag.''; - print ''; - print ''; - print '
'.$langs->trans("Creditor"); - print ''.$creditor.''; - print ''; - print '
'.$langs->trans("ThirdParty"); - print ''.$order->thirdparty->name.''; - - // Object - $var=!$var; - $text=''.$langs->trans("PaymentOrderRef",$order->ref).''; - print '
'.$langs->trans("Designation"); - print ''.$text; - print ''; - print ''; - print '
'.$langs->trans("Amount"); - if (empty($amount)) print ' ('.$langs->trans("ToComplete").')'; - print ''; - if (empty($amount) || ! is_numeric($amount)) - { - print ''; - print ''; - } - else { - print ''.price($amount).''; - print ''; - print ''; - } - // Currency - print ' '.$langs->trans("Currency".$currency).''; - print ''; - print '
'.$langs->trans("PaymentCode"); - print ''.$fulltag.''; - print ''; - print ''; - print '
'.$langs->trans("Creditor"); - print ''.$creditor.''; - print ''; - print '
'.$langs->trans("ThirdParty"); - print ''.$invoice->thirdparty->name.''; - - // Object - $var=!$var; - $text=''.$langs->trans("PaymentInvoiceRef",$invoice->ref).''; - print '
'.$langs->trans("Designation"); - print ''.$text; - print ''; - print ''; - print '
'.$langs->trans("Amount"); - if (empty($amount)) print ' ('.$langs->trans("ToComplete").')'; - print ''; - if (empty($amount) || ! is_numeric($amount)) - { - print ''; - print ''; - } - else { - print ''.price($amount).''; - print ''; - print ''; - } - // Currency - print ' '.$langs->trans("Currency".$currency).''; - print ''; - print '
'.$langs->trans("PaymentCode"); - print ''.$fulltag.''; - print ''; - print ''; - print '
'.$langs->trans("Creditor"); - print ''.$creditor.''; - print ''; - print '
'.$langs->trans("ThirdParty"); - print ''.$contract->thirdparty->name.''; - - // Object - $var=!$var; - $text=''.$langs->trans("PaymentRenewContractId",$contract->ref,$contractline->ref).''; - if ($contractline->fk_product) - { - $text.='
'.$product->ref.($product->label?' - '.$product->label:''); - } - if ($contractline->description) $text.='
'.dol_htmlentitiesbr($contractline->description); - //if ($contractline->date_fin_validite) { - // $text.='
'.$langs->trans("DateEndPlanned").': '; - // $text.=dol_print_date($contractline->date_fin_validite); - //} - if ($contractline->date_fin_validite) - { - $text.='
'.$langs->trans("ExpiredSince").': '.dol_print_date($contractline->date_fin_validite); - } - - print '
'.$langs->trans("Designation"); - print ''.$text; - print ''; - print ''; - print '
'.$label.''.($duration?$duration:$qty).''; - print ''; - print '
'.$langs->trans("Amount"); - if (empty($amount)) print ' ('.$langs->trans("ToComplete").')'; - print ''; - if (empty($amount) || ! is_numeric($amount)) - { - print ''; - print ''; - } - else { - print ''.price($amount).''; - print ''; - print ''; - } - // Currency - print ' '.$langs->trans("Currency".$currency).''; - print ''; - print '
'.$langs->trans("PaymentCode"); - print ''.$fulltag.''; - print ''; - print ''; - print '
'.$langs->trans("Creditor"); - print ''.$creditor.''; - print ''; - print '
'.$langs->trans("Member"); - print ''; - if ($member->morphy == 'mor' && ! empty($member->societe)) print $member->societe; - else print $member->getFullName($langs); - print ''; - - // Object - $var=!$var; - $text=''.$langs->trans("PaymentSubscription").''; - print '
'.$langs->trans("Designation"); - print ''.$text; - print ''; - print ''; - print '
'.$langs->trans("LastSubscriptionDate"); - print ''.dol_print_date($member->last_subscription_date,'day'); - print '
'.$langs->trans("LastSubscriptionAmount"); - print ''.price($member->last_subscription_amount); - print '
'.$langs->trans("Amount"); - if (empty($amount)) - { - print ' ('.$langs->trans("ToComplete"); - if (! empty($conf->global->MEMBER_EXT_URL_SUBSCRIPTION_INFO)) print ' - '.$langs->trans("SeeHere").''; - print ')'; - } - print ''; - if (empty($amount) || ! is_numeric($amount)) - { - $valtoshow=GETPOST("newamount",'int'); - if (! empty($conf->global->MEMBER_MIN_AMOUNT) && $valtoshow) $valtoshow=max($conf->global->MEMBER_MIN_AMOUNT,$valtoshow); - print ''; - print ''; - } - else { - $valtoshow=$amount; - if (! empty($conf->global->MEMBER_MIN_AMOUNT) && $valtoshow) $valtoshow=max($conf->global->MEMBER_MIN_AMOUNT,$valtoshow); - print ''.price($valtoshow).''; - print ''; - print ''; - } - // Currency - print ' '.$langs->trans("Currency".$currency).''; - print ''; - print '
'.$langs->trans("PaymentCode"); - print ''.$fulltag.''; - print ''; - print ''; - print '

'.$mesg.'
'."\n"; -print "\n"; - -if ($found && ! $error) // We are in a management option and no error -{ - if (empty($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY)) $conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY='integral'; - - if ($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY == 'integral') - { - print '
'; - } - if ($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY == 'stripeonly') - { - print '
'; - } -} -else -{ - dol_print_error_email('ERRORNEWPAYMENTPAYPAL'); -} - -print '
'."\n"; -print '
'."\n"; -print '
'."\n"; -print '
'; - - -html_print_stripe_footer($mysoc,$langs); - -llxFooterStripe(); - -$db->close(); diff --git a/htdocs/public/stripe/paymentko.php b/htdocs/public/stripe/paymentko.php deleted file mode 100644 index 09de4525b39..00000000000 --- a/htdocs/public/stripe/paymentko.php +++ /dev/null @@ -1,115 +0,0 @@ - - * Copyright (C) 2006-2013 Laurent Destailleur - * - * 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 3 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/public/paybox/paymentko.php - * \ingroup paybox - * \brief File to show page after a failed payment - * \author Laurent Destailleur - */ - -define("NOLOGIN",1); // This means this output page does not require to be logged. -define("NOCSRFCHECK",1); // We accept to go on this page from external web site. - -// For MultiCompany module. -// Do not use GETPOST here, function is not defined and define must be done before including main.inc.php -// TODO This should be useless. Because entity must be retreive from object ref and not from url. -$entity=(! empty($_GET['entity']) ? (int) $_GET['entity'] : (! empty($_POST['entity']) ? (int) $_POST['entity'] : 1)); -if (is_numeric($entity)) define("DOLENTITY", $entity); - -require '../../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/paybox/lib/paybox.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; - -// Security check -if (empty($conf->paybox->enabled)) accessforbidden('',0,0,1); - -$langs->load("main"); -$langs->load("other"); -$langs->load("dict"); -$langs->load("bills"); -$langs->load("companies"); -$langs->load("paybox"); -$langs->load("paypal"); - - - - -/* - * Actions - */ - - - - - -/* - * View - */ - -dol_syslog("Callback url when a PayBox payment was canceled. query_string=".(empty($_SERVER["QUERY_STRING"])?'':$_SERVER["QUERY_STRING"])." script_uri=".(empty($_SERVER["SCRIPT_URI"])?'':$_SERVER["SCRIPT_URI"]), LOG_DEBUG, 0, '_paybox'); - -$tracepost = ""; -foreach($_POST as $k => $v) $tracepost .= "{$k} - {$v}\n"; -dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_paybox'); - - -// Send an email -if (! empty($conf->global->PAYBOX_PAYONLINE_SENDEMAIL)) -{ - $sendto=$conf->global->PAYBOX_PAYONLINE_SENDEMAIL; - $from=$conf->global->MAILING_EMAIL_FROM; - - $urlback=$_SERVER["REQUEST_URI"]; - $topic='['.$conf->global->MAIN_APPLICATION_TITLE.'] '.$langs->transnoentitiesnoconv("NewPayboxPaymentFailed"); - $content=$langs->transnoentitiesnoconv("NewPayboxPaymentFailed")."\n".$fulltag; - require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; - $mailfile = new CMailFile($topic, $sendto, $from, $content); - - $result=$mailfile->sendfile(); - if ($result) - { - dol_syslog("EMail sent to ".$sendto, LOG_DEBUG, 0, '_paybox'); - } - else - { - dol_syslog("Failed to send EMail to ".$sendto, LOG_ERR, 0, '_paybox'); - } -} - - -llxHeaderPayBox($langs->trans("PaymentForm")); - - -// Show message -print ''."\n"; -print '
'."\n"; - -print $langs->trans("YourPaymentHasNotBeenRecorded")."

\n"; - -if (! empty($conf->global->PAYBOX_MESSAGE_KO)) print $conf->global->PAYBOX_MESSAGE_KO; - -print "\n
\n"; - - -html_print_paybox_footer($mysoc,$langs); - - -llxFooterPayBox(); - -$db->close(); diff --git a/htdocs/public/stripe/paymentok.php b/htdocs/public/stripe/paymentok.php deleted file mode 100644 index 9c3030a86ba..00000000000 --- a/htdocs/public/stripe/paymentok.php +++ /dev/null @@ -1,172 +0,0 @@ - - * Copyright (C) 2006-2013 Laurent Destailleur - * - * 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 3 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/public/paybox/paymentok.php - * \ingroup paybox - * \brief File to show page after a successful payment - * \author Laurent Destailleur - */ - -define("NOLOGIN",1); // This means this output page does not require to be logged. -define("NOCSRFCHECK",1); // We accept to go on this page from external web site. - -// For MultiCompany module. -// Do not use GETPOST here, function is not defined and define must be done before including main.inc.php -// TODO This should be useless. Because entity must be retreive from object ref and not from url. -$entity=(! empty($_GET['entity']) ? (int) $_GET['entity'] : (! empty($_POST['entity']) ? (int) $_POST['entity'] : 1)); -if (is_numeric($entity)) define("DOLENTITY", $entity); - -require '../../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/paybox/lib/paybox.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; - -// Security check -if (empty($conf->paybox->enabled)) accessforbidden('',0,0,1); - -$langs->load("main"); -$langs->load("other"); -$langs->load("dict"); -$langs->load("bills"); -$langs->load("companies"); -$langs->load("paybox"); -$langs->load("paypal"); - -/*$source=GETPOST('source'); -$ref=GETPOST('ref'); -$PAYBOXTOKEN=GETPOST('TOKEN'); -if (empty($PAYBOXTOKEN)) $PAYBOXTOKEN=GETPOST('token'); -$PAYBOXPAYERID=GETPOST('PAYERID'); -if (empty($PAYBOXPAYERID)) $PAYBOXPAYERID=GETPOST('PayerID'); -*/ -$PAYBOXFULLTAG=GETPOST('FULLTAG'); -if (empty($PAYBOXFULLTAG)) $PAYBOXFULLTAG=GETPOST('fulltag'); - - -/* - * Actions - */ - - - - - -/* - * View - */ - -dol_syslog("Callback url when a PayBox payment was done. query_string=".(empty($_SERVER["QUERY_STRING"])?'':$_SERVER["QUERY_STRING"])." script_uri=".(empty($_SERVER["SCRIPT_URI"])?'':$_SERVER["SCRIPT_URI"]), LOG_DEBUG, 0, '_paybox'); - -$tracepost = ""; -foreach($_POST as $k => $v) $tracepost .= "{$k} - {$v}\n"; -dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_paybox'); - -llxHeaderPayBox($langs->trans("PaymentForm")); - - -// Show message -print ''."\n"; -print '
'."\n"; - -// Get on url call -/* -$token = $PAYBOXTOKEN; -*/ -$fulltag = $PAYBOXFULLTAG; -/*$payerID = $PAYBOXPAYERID; -// Set by newpayment.php -$paymentType = $_SESSION['PaymentType']; -$currencyCodeType = $_SESSION['currencyCodeType']; -$FinalPaymentAmt = $_SESSION["Payment_Amount"]; -// From env -$ipaddress = $_SESSION['ipaddress']; - -dol_syslog("Call newpaymentok with token=".$token." paymentType=".$paymentType." currencyCodeType=".$currencyCodeType." payerID=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt." fulltag=".$fulltag); -*/ - - -print $langs->trans("YourPaymentHasBeenRecorded")."

\n"; - -if (! empty($conf->global->PAYBOX_MESSAGE_OK)) print $conf->global->PAYBOX_MESSAGE_OK; - -// Appel des triggers -include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; -$interface=new Interfaces($db); -$result=$interface->run_triggers('PAYBOX_PAYMENT_OK',$object,$user,$langs,$conf); -if ($result < 0) { $error++; $errors=$interface->errors; } -// Fin appel triggers - - -// Send an email -if (! empty($conf->global->PAYBOX_PAYONLINE_SENDEMAIL)) -{ - $sendto=$conf->global->PAYBOX_PAYONLINE_SENDEMAIL; - $from=$conf->global->MAILING_EMAIL_FROM; - // Define $urlwithroot - $urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root)); - $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file - //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current - - $urlback=$_SERVER["REQUEST_URI"]; - $topic='['.$conf->global->MAIN_APPLICATION_TITLE.'] '.$langs->transnoentitiesnoconv("NewPayboxPaymentReceived"); - $tmptag=dolExplodeIntoArray($fulltag,'.','='); - $content=""; - if (! empty($tmptag['MEM'])) - { - $langs->load("members"); - $url=$urlwithroot."/adherents/card_subscriptions.php?rowid=".$tmptag['MEM']; - $content.=$langs->trans("PaymentSubscription")."
\n"; - $content.=$langs->trans("MemberId").': '.$tmptag['MEM']."
\n"; - $content.=$langs->trans("Link").': '.$url.''."
\n"; - } - else - { - $content.=$langs->transnoentitiesnoconv("NewPayboxPaymentReceived")."
\n"; - } - $content.="
\n"; - $content.=$langs->transnoentitiesnoconv("TechnicalInformation").":
\n"; - $content.=$langs->transnoentitiesnoconv("ReturnURLAfterPayment").': '.$urlback."
\n"; - $content.="tag=".$fulltag."
\n"; - - $ishtml=dol_textishtml($content); // May contain urls - - require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; - $mailfile = new CMailFile($topic, $sendto, $from, $content, array(), array(), array(), '', '', 0, $ishtml); - - // Send an email - $result=$mailfile->sendfile(); - if ($result) - { - dol_syslog("EMail sent to ".$sendto, LOG_DEBUG, 0, '_paybox'); - } - else - { - dol_syslog("Failed to send EMail to ".$sendto, LOG_ERR, 0, '_paybox'); - } -} - - - -print "\n
\n"; - -html_print_paybox_footer($mysoc,$langs); - - -llxFooterPayBox(); - -$db->close(); diff --git a/htdocs/stripe/admin/stripe.php b/htdocs/stripe/admin/stripe.php index 719c623e146..4da06e61de8 100644 --- a/htdocs/stripe/admin/stripe.php +++ b/htdocs/stripe/admin/stripe.php @@ -23,7 +23,7 @@ */ require '../../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/stripe/lib/stripe.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/stripe.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; @@ -31,6 +31,8 @@ $servicename='Stripe'; $langs->load("admin"); $langs->load("other"); +$langs->load("paypal"); +$langs->load("paybox"); $langs->load("stripe"); if (!$user->admin) @@ -43,7 +45,7 @@ if ($action == 'setvalue' && $user->admin) { $db->begin(); - $result=dolibarr_set_const($db, "STRIPE_API_SANDBOX",GETPOST('STRIPE_API_SANDBOX','alpha'),'chaine',0,'',$conf->entity); + $result=dolibarr_set_const($db, "STRIPE_TEST",GETPOST('STRIPE_TEST','alpha'),'chaine',0,'',$conf->entity); if (! $result > 0) $error++; $result=dolibarr_set_const($db, "STRIPE_TEST_SECRET_KEY",GETPOST('STRIPE_TEST_SECRET_KEY','alpha'),'chaine',0,'',$conf->entity); if (! $result > 0) $error++; @@ -118,8 +120,8 @@ print "\n"; $var=!$var; print ''; -print $langs->trans("STRIPE_API_SANDBOX").''; -print $form->selectyesno("STRIPE_API_SANDBOX",$conf->global->STRIPE_API_SANDBOX,1); +print $langs->trans("STRIPE_TEST").''; +print $form->selectyesno("STRIPE_TEST",$conf->global->STRIPE_TEST,1); print ''; $var=!$var; @@ -150,7 +152,11 @@ print ''; -$var=true; +print ''; + +print '
'; + +print ''; print ''; print ''; print ''; @@ -173,14 +179,14 @@ print ''; $var=!$var; print ''; $var=!$var; print ''; @@ -194,6 +200,7 @@ print ''; print '

'; +/* print ''.$langs->trans("FollowingUrlAreAvailableToMakePayments").':
'; print img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePaymentOnFreeAmount",$servicename).':
'; print ''.DOL_MAIN_URL_ROOT.'/public/stripe/newpayment.php?amount=9.99&tag=your_free_tag'."
\n"; @@ -220,6 +227,7 @@ if (! empty($conf->adherent->enabled)) print "
"; print info_admin($langs->trans("YouCanAddTagOnUrl")); +*/ llxFooter(); From d73374cc5b2865ee9eabfff0a29dc00b3a20f7c8 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sat, 29 Apr 2017 07:34:30 +0200 Subject: [PATCH 007/299] Uniformize link to stripe.lib --- htdocs/public/stripe/checkout.php | 2 +- htdocs/public/stripe/config.php | 2 +- htdocs/stripe/admin/stripe.php | 2 +- htdocs/stripe/lib/index.html | 0 htdocs/{core => stripe}/lib/stripe.lib.php | 60 ++++++++++------------ 5 files changed, 31 insertions(+), 35 deletions(-) create mode 100644 htdocs/stripe/lib/index.html rename htdocs/{core => stripe}/lib/stripe.lib.php (99%) diff --git a/htdocs/public/stripe/checkout.php b/htdocs/public/stripe/checkout.php index 4bea80bce6c..3f0b6f84016 100644 --- a/htdocs/public/stripe/checkout.php +++ b/htdocs/public/stripe/checkout.php @@ -20,7 +20,7 @@ define("NOLOGIN",1); define("NOCSRFCHECK",1); require '../../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/stripe.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/stripe/lib/stripe.lib.php'; require_once DOL_DOCUMENT_ROOT.'/public/stripe/config.php'; require_once DOL_DOCUMENT_ROOT.'/includes/stripe/init.php'; diff --git a/htdocs/public/stripe/config.php b/htdocs/public/stripe/config.php index ac315762b29..b94617b4c69 100644 --- a/htdocs/public/stripe/config.php +++ b/htdocs/public/stripe/config.php @@ -25,7 +25,7 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/stripe.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/stripe/lib/stripe.lib.php'; require_once DOL_DOCUMENT_ROOT.'/includes/stripe/init.php'; //use \includes\stripe as stripe; diff --git a/htdocs/stripe/admin/stripe.php b/htdocs/stripe/admin/stripe.php index 4da06e61de8..1882d1065b0 100644 --- a/htdocs/stripe/admin/stripe.php +++ b/htdocs/stripe/admin/stripe.php @@ -23,7 +23,7 @@ */ require '../../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/stripe.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/stripe/lib/stripe.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; diff --git a/htdocs/stripe/lib/index.html b/htdocs/stripe/lib/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/core/lib/stripe.lib.php b/htdocs/stripe/lib/stripe.lib.php similarity index 99% rename from htdocs/core/lib/stripe.lib.php rename to htdocs/stripe/lib/stripe.lib.php index 175df3554ce..0ab73437e17 100644 --- a/htdocs/core/lib/stripe.lib.php +++ b/htdocs/stripe/lib/stripe.lib.php @@ -21,7 +21,35 @@ * \brief Library for common stripe functions */ +/** + * Define head array for tabs of stripe tools setup pages + * + * @return Array of head + */ +function stripeadmin_prepare_head() +{ + global $langs, $conf; + $h = 0; + $head = array(); + + $head[$h][0] = DOL_URL_ROOT."/stripe/admin/stripe.php"; + $head[$h][1] = $langs->trans("Stripe"); + $head[$h][2] = 'stripeaccount'; + $h++; + + $object=new stdClass(); + + // Show more tabs from modules + // Entries must be declared in modules descriptor with line + // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab + // $this->tabs = array('entity:-tabname); to remove a tab + complete_head_from_modules($conf,$langs,$object,$head,$h,'stripeadmin'); + + complete_head_from_modules($conf,$langs,$object,$head,$h,'stripeadmin','remove'); + + return $head; +} /** * Show header @@ -70,38 +98,6 @@ function llxFooterStripe() print "\n"; } -/** - * Define head array for tabs of stripe tools setup pages - * - * @return Array of head - */ -function stripeadmin_prepare_head() -{ - global $langs, $conf; - - $h = 0; - $head = array(); - - $head[$h][0] = DOL_URL_ROOT."/stripe/admin/stripe.php"; - $head[$h][1] = $langs->trans("Stripe"); - $head[$h][2] = 'stripeaccount'; - $h++; - - $object=new stdClass(); - - // Show more tabs from modules - // Entries must be declared in modules descriptor with line - // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab - // $this->tabs = array('entity:-tabname); to remove a tab - complete_head_from_modules($conf,$langs,$object,$head,$h,'stripeadmin'); - - complete_head_from_modules($conf,$langs,$object,$head,$h,'stripeadmin','remove'); - - return $head; -} - - - /** * Return string with full Url * From ce62736e6b46e9442d4aa01133339895c9630474 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sat, 29 Apr 2017 07:57:36 +0200 Subject: [PATCH 008/299] Correct link and renamed checkout by newpayment --- .../stripe/{checkout.php => newpayment.php} | 14 ++++-- htdocs/stripe/lib/stripe.lib.php | 50 +------------------ 2 files changed, 11 insertions(+), 53 deletions(-) rename htdocs/public/stripe/{checkout.php => newpayment.php} (94%) diff --git a/htdocs/public/stripe/checkout.php b/htdocs/public/stripe/newpayment.php similarity index 94% rename from htdocs/public/stripe/checkout.php rename to htdocs/public/stripe/newpayment.php index 3f0b6f84016..71f581000b2 100644 --- a/htdocs/public/stripe/checkout.php +++ b/htdocs/public/stripe/newpayment.php @@ -16,6 +16,12 @@ * along with this program. If not, see . */ +/** +* \file htdocs/public/stripe/newpayment.php +* \ingroup Stripe +* \brief Page to do payment with Stripe +*/ + define("NOLOGIN",1); define("NOCSRFCHECK",1); @@ -25,7 +31,7 @@ require_once DOL_DOCUMENT_ROOT.'/public/stripe/config.php'; require_once DOL_DOCUMENT_ROOT.'/includes/stripe/init.php'; // Security check -if (empty($conf->paypal->enabled)) accessforbidden('',0,0,1); +if (empty($conf->stripe->enabled)) accessforbidden('',0,0,1); $langs->load("main"); $langs->load("other"); @@ -67,13 +73,13 @@ if (GETPOST("action") == 'charge') $token = GETPOST("stripeToken"); $email = GETPOST("stripeEmail"); - $customer = \Stripe\Customer::create(array( + $customer = \stripe\Customer::create(array( 'email' => $email, 'card' => $token )); $ttc = round($ttc, 2); - $charge = \Stripe\Charge::create(array( + $charge = \stripe\Charge::create(array( 'customer' => $customer->id, 'amount' => $ttc, 'currency' => $conf->currency, @@ -122,7 +128,7 @@ if (GETPOST("action") == 'charge') diff --git a/htdocs/stripe/lib/stripe.lib.php b/htdocs/stripe/lib/stripe.lib.php index 0ab73437e17..c454296a304 100644 --- a/htdocs/stripe/lib/stripe.lib.php +++ b/htdocs/stripe/lib/stripe.lib.php @@ -112,6 +112,7 @@ function showStripePaymentUrl($type,$ref) $langs->load("paypal"); $langs->load("paybox"); $langs->load("stripe"); + $servicename='Stripe'; $out='

'; $out.=img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePayment",$servicename).'
'; @@ -139,11 +140,6 @@ function getStripePaymentUrl($mode,$type,$ref='',$amount='9.99',$freetag='your_f if ($type == 'free') { $out=DOL_MAIN_URL_ROOT.'/public/stripe/newpayment.php?amount='.($mode?'':'').$amount.($mode?'':'').'&tag='.($mode?'':'').$freetag.($mode?'':''); - if (! empty($conf->global->PAYPAL_SECURITY_TOKEN)) - { - if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) $out.='&securekey='.$conf->global->PAYPAL_SECURITY_TOKEN; - else $out.='&securekey='.dol_hash($conf->global->PAYPAL_SECURITY_TOKEN, 2); - } } if ($type == 'order') { @@ -151,17 +147,6 @@ function getStripePaymentUrl($mode,$type,$ref='',$amount='9.99',$freetag='your_f if ($mode == 1) $out.='order_ref'; if ($mode == 0) $out.=urlencode($ref); $out.=($mode?'':''); - if (! empty($conf->global->PAYPAL_SECURITY_TOKEN)) - { - if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) $out.='&securekey='.$conf->global->PAYPAL_SECURITY_TOKEN; - else - { - $out.='&securekey='.($mode?'':''); - if ($mode == 1) $out.="hash('".$conf->global->PAYPAL_SECURITY_TOKEN."' + '".$type."' + order_ref)"; - if ($mode == 0) $out.= dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . $type . $ref, 2); - $out.=($mode?'':''); - } - } } if ($type == 'invoice') { @@ -169,17 +154,6 @@ function getStripePaymentUrl($mode,$type,$ref='',$amount='9.99',$freetag='your_f if ($mode == 1) $out.='invoice_ref'; if ($mode == 0) $out.=urlencode($ref); $out.=($mode?'':''); - if (! empty($conf->global->PAYPAL_SECURITY_TOKEN)) - { - if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) $out.='&securekey='.$conf->global->PAYPAL_SECURITY_TOKEN; - else - { - $out.='&securekey='.($mode?'':''); - if ($mode == 1) $out.="hash('".$conf->global->PAYPAL_SECURITY_TOKEN."' + '".$type."' + invoice_ref)"; - if ($mode == 0) $out.= dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . $type . $ref, 2); - $out.=($mode?'':''); - } - } } if ($type == 'contractline') { @@ -187,17 +161,6 @@ function getStripePaymentUrl($mode,$type,$ref='',$amount='9.99',$freetag='your_f if ($mode == 1) $out.='contractline_ref'; if ($mode == 0) $out.=urlencode($ref); $out.=($mode?'':''); - if (! empty($conf->global->PAYPAL_SECURITY_TOKEN)) - { - if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) $out.='&securekey='.$conf->global->PAYPAL_SECURITY_TOKEN; - else - { - $out.='&securekey='.($mode?'':''); - if ($mode == 1) $out.="hash('".$conf->global->PAYPAL_SECURITY_TOKEN."' + '".$type."' + contractline_ref)"; - if ($mode == 0) $out.= dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . $type . $ref, 2); - $out.=($mode?'':''); - } - } } if ($type == 'membersubscription') { @@ -205,17 +168,6 @@ function getStripePaymentUrl($mode,$type,$ref='',$amount='9.99',$freetag='your_f if ($mode == 1) $out.='member_ref'; if ($mode == 0) $out.=urlencode($ref); $out.=($mode?'':''); - if (! empty($conf->global->PAYPAL_SECURITY_TOKEN)) - { - if (empty($conf->global->PAYPAL_SECURITY_TOKEN_UNIQUE)) $out.='&securekey='.$conf->global->PAYPAL_SECURITY_TOKEN; - else - { - $out.='&securekey='.($mode?'':''); - if ($mode == 1) $out.="hash('".$conf->global->PAYPAL_SECURITY_TOKEN."' + '".$type."' + member_ref)"; - if ($mode == 0) $out.= dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . $type . $ref, 2); - $out.=($mode?'':''); - } - } } // For multicompany From d658a833c98fad5e2b21ca4c5f3ad44e51ad4717 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Mon, 1 May 2017 12:05:52 +0200 Subject: [PATCH 009/299] FIX #6677 Expired contracts dashboard box does not show the name of the thirdparty Close #6677 --- htdocs/core/boxes/box_services_expired.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/boxes/box_services_expired.php b/htdocs/core/boxes/box_services_expired.php index f2bc86cdac5..52ccb694dd3 100644 --- a/htdocs/core/boxes/box_services_expired.php +++ b/htdocs/core/boxes/box_services_expired.php @@ -104,7 +104,7 @@ class box_services_expired extends ModeleBoxes 'logo' => 'company', 'url' => DOL_URL_ROOT."/comm/card.php?socid=".$objp->socid); - $this->info_box_contents[$i][3] = array('td' => 'class="tdoverflow maxwidth100onsmartphone" align="left"', + $this->info_box_contents[$i][3] = array('td' => 'class="tdoverflowmax200 maxwidth100onsmartphone" align="left"', 'text' => $objp->name, 'url' => DOL_URL_ROOT."/comm/card.php?socid=".$objp->socid); From b8d63ae6c0c927326cd31e37c0b85f7d73070c1e Mon Sep 17 00:00:00 2001 From: florian HENRY Date: Thu, 4 May 2017 14:04:30 +0200 Subject: [PATCH 010/299] Better fix --- htdocs/core/class/html.form.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 7f10fca51f8..3687a070dbb 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -1437,7 +1437,7 @@ class Form { $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."usergroup_user as ug"; $sql.= " ON ug.fk_user = u.rowid"; - $sql.= " AND ug.entity = ".$conf->entity; + $sql.= " WHERE ug.entity = ".$conf->entity; } else { From d93552c8c5311ba7a4853aa0993105d9322894e7 Mon Sep 17 00:00:00 2001 From: Scrutinizer Auto-Fixer Date: Fri, 5 May 2017 17:13:29 +0000 Subject: [PATCH 011/299] Scrutinizer Auto-Fixes This commit consists of patches automatically generated for this project on https://scrutinizer-ci.com --- htdocs/core/class/commoninvoice.class.php | 2 +- .../modules/supplier_payment/doc/pdf_standard.modules.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/class/commoninvoice.class.php b/htdocs/core/class/commoninvoice.class.php index 2e2a26dd9ae..4b6d70b1366 100644 --- a/htdocs/core/class/commoninvoice.class.php +++ b/htdocs/core/class/commoninvoice.class.php @@ -95,7 +95,7 @@ abstract class CommonInvoice extends CommonObject * This does not include open direct debit requests. * * @param int $multicurrency Return multicurrency_amount instead of amount - * @return int Remain of amount to pay + * @return double Remain of amount to pay */ function getRemainToPay($multicurrency=0) { diff --git a/htdocs/core/modules/supplier_payment/doc/pdf_standard.modules.php b/htdocs/core/modules/supplier_payment/doc/pdf_standard.modules.php index 2b645e4a263..6fbfb4b1bf4 100644 --- a/htdocs/core/modules/supplier_payment/doc/pdf_standard.modules.php +++ b/htdocs/core/modules/supplier_payment/doc/pdf_standard.modules.php @@ -520,8 +520,8 @@ class pdf_standard extends ModelePDFSuppliersPayments * Show table for lines * * @param PDF $pdf Object PDF - * @param string $tab_top Top position of table - * @param string $tab_height Height of table (rectangle) + * @param integer $tab_top Top position of table + * @param integer $tab_height Height of table (rectangle) * @param int $nexY Y (not used) * @param Translate $outputlangs Langs object * @param int $hidetop Hide top bar of array From e28dff19eeca36c6245c7924f3ed321d9822c46f Mon Sep 17 00:00:00 2001 From: Benoit Date: Fri, 5 May 2017 22:21:46 +0200 Subject: [PATCH 012/299] Fix bug xhen insert new bankline --- htdocs/compta/bank/class/account.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/compta/bank/class/account.class.php b/htdocs/compta/bank/class/account.class.php index 897fd5de496..97dacf34386 100644 --- a/htdocs/compta/bank/class/account.class.php +++ b/htdocs/compta/bank/class/account.class.php @@ -471,9 +471,9 @@ class Account extends CommonObject if ($accline->insert() > 0) { - if ($categorie) { - $sql = "INSERT INTO ".MAIN_DB_PREFIX."categorie_account ("; - $sql .= "fk_account, fk_categorie"; + if ($categorie>0) { + $sql = "INSERT INTO ".MAIN_DB_PREFIX."bank_class ("; + $sql .= "lineid, fk_categ; $sql .= ") VALUES ("; $sql .= " ".$accline->id.", ".$categorie; $sql .= ")"; From 0fbf27895ad891ee9889e3e8a80a172dead1e975 Mon Sep 17 00:00:00 2001 From: Benoit Date: Fri, 5 May 2017 22:33:34 +0200 Subject: [PATCH 013/299] Add fk_facture_fourn element to fetch lines objects --- htdocs/fourn/class/fournisseur.facture.class.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index 1798eb19059..496c4660895 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -640,7 +640,7 @@ class FactureFournisseur extends CommonInvoice function fetch_lines() { $sql = 'SELECT f.rowid, f.ref as ref_supplier, f.description, f.pu_ht, f.pu_ttc, f.qty, f.remise_percent, f.vat_src_code, f.tva_tx'; - $sql.= ', f.localtax1_tx, f.localtax2_tx, f.total_localtax1, f.total_localtax2 '; + $sql.= ', f.localtax1_tx, f.localtax2_tx, f.total_localtax1, f.total_localtax2, f.fk_facture_fourn '; $sql.= ', f.total_ht, f.tva as total_tva, f.total_ttc, f.fk_product, f.product_type, f.info_bits, f.rang, f.special_code, f.fk_parent_line, f.fk_unit'; $sql.= ', p.rowid as product_id, p.ref as product_ref, p.label as label, p.description as product_desc'; $sql.= ', f.fk_multicurrency, f.multicurrency_code, f.multicurrency_subprice, f.multicurrency_total_ht, f.multicurrency_total_tva, f.multicurrency_total_ttc'; @@ -649,6 +649,7 @@ class FactureFournisseur extends CommonInvoice $sql.= ' WHERE fk_facture_fourn='.$this->id; $sql.= ' ORDER BY f.rang, f.rowid'; + dol_syslog(get_class($this)."::fetch_lines", LOG_DEBUG); $resql_rows = $this->db->query($sql); if ($resql_rows) @@ -687,6 +688,7 @@ class FactureFournisseur extends CommonInvoice $line->total_tva = $obj->total_tva; $line->total_localtax1 = $obj->total_localtax1; $line->total_localtax2 = $obj->total_localtax2; + $line->fk_facture_fourn = $obj->fk_facture_fourn; $line->total_ttc = $obj->total_ttc; $line->fk_product = $obj->fk_product; $line->product_type = $obj->product_type; From a4defb8102db6376afc91d59dbbd9f48b91bc525 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sat, 6 May 2017 07:02:34 +0200 Subject: [PATCH 014/299] Add html form for accountancy journals list --- .../core/class/html.formaccounting.class.php | 59 ++++++++++++++++++- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/html.formaccounting.class.php b/htdocs/core/class/html.formaccounting.class.php index e1bf1645de0..cb988a511cd 100644 --- a/htdocs/core/class/html.formaccounting.class.php +++ b/htdocs/core/class/html.formaccounting.class.php @@ -25,12 +25,14 @@ /** * Class to manage generation of HTML components for accounting management */ -class FormAccounting +class FormAccounting extends Form { + + private $options_cache = array(); + var $db; var $error; - /** * Constructor * @@ -41,6 +43,59 @@ class FormAccounting $this->db = $db; } + /** + * Return list of journals with label by nature + * + * @param string $selectid Preselected pcg_type + * @param string $htmlname Name of field in html form + * @param int $nature Limit the list to a particular type of journals (1:various operations / 2:sale / 3:purchase / 4:bank / 9: has-new) + * @param int $showempty Add an empty field + * @param array $event Event options + * @param string $morecss More css non HTML object + * @param string $usecache Key to use to store result into a cache. Next call with same key will reuse the cache. + * + * @return string String with HTML select + */ + function select_journal($selectid, $htmlname = 'journal', $nature=0, $showempty = 0, $event = array(), $morecss='maxwidth300 maxwidthonsmartphone', $usecache='') + { + global $conf; + + $sql = "SELECT rowid, code, label, nature, entity, active"; + $sql.= " FROM " . MAIN_DB_PREFIX . "accounting_journal"; + $sql.= " WHERE entity = ".$conf->entity; + $sql.= " AND active = 1"; + if (empty($nature)) $sql.= " AND nature = ".$nature; + $sql.= " ORDER BY code"; + + dol_syslog(get_class($this) . "::select_journal", LOG_DEBUG); + $resql = $this->db->query($sql); + + if (!$resql) { + $this->error = "Error ".$this->db->lasterror(); + dol_syslog(get_class($this)."::select_journal ".$this->error, LOG_ERR); + return -1; + } + + $options = array(); + $out = ajax_combobox($htmlname, $event); + + $selected = 0; + while ($obj = $this->db->fetch_object($resql)) + { + $label = $obj->code . ' - ' . $obj->label; + } + $this->db->free($resql); + + if ($usecache) + { + $this->options_cache[$usecache] = $options; + } + + $out .= Form::selectarray($htmlname, $options, $selectid, $showempty, 0, 0, '', 0, 0, 0, '', $morecss, 1); + + return $out; + } + /** * Return list of accounting category. * Use mysoc->country_id or mysoc->country_code so they must be defined. From 68aaef2f66737e5e9e24ea4c897a6e3a369c44cd Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sat, 6 May 2017 08:06:01 +0200 Subject: [PATCH 015/299] Add list to select journal in bank --- .../class/accountingjournal.class.php | 20 +++--- htdocs/compta/bank/card.php | 12 +++- .../core/class/html.formaccounting.class.php | 66 ++++++++++------- .../install/mysql/migration/5.0.0-6.0.0.sql | 7 ++ .../mysql/tables/llx_accounting_journal.sql | 2 +- .../mysql/tables/llx_bank_account.key.sql | 2 + .../install/mysql/tables/llx_bank_account.sql | 70 +++++++++---------- 7 files changed, 103 insertions(+), 76 deletions(-) diff --git a/htdocs/accountancy/class/accountingjournal.class.php b/htdocs/accountancy/class/accountingjournal.class.php index 064f56bddd6..9bff37560d7 100644 --- a/htdocs/accountancy/class/accountingjournal.class.php +++ b/htdocs/accountancy/class/accountingjournal.class.php @@ -136,19 +136,19 @@ class AccountingJournal extends CommonObject if ($mode == 0) { $prefix=''; - if ($nature == 9) return $langs->trans('AccountingJournalTypeHasNew'); - if ($nature == 3) return $langs->trans('AccountingJournalTypeBank'); - if ($nature == 2) return $langs->trans('AccountingJournalTypePurchase'); - if ($nature == 1) return $langs->trans('AccountingJournalTypeSale'); - if ($nature == 0) return $langs->trans('AccountingJournalTypeVariousOperation'); + if ($nature == 9) return $langs->trans('AccountingJournalType9'); + if ($nature == 4) return $langs->trans('AccountingJournalType4'); + if ($nature == 3) return $langs->trans('AccountingJournalType3'); + if ($nature == 2) return $langs->trans('AccountingJournalType2'); + if ($nature == 1) return $langs->trans('AccountingJournalType1'); } if ($mode == 1) { - if ($nature == 9) return $langs->trans('AccountingJournalTypeHasNew'); - if ($nature == 3) return $langs->trans('AccountingJournalTypeBank'); - if ($nature == 2) return $langs->trans('AccountingJournalTypePurchase'); - if ($nature == 1) return $langs->trans('AccountingJournalTypeSale'); - if ($nature == 0) return $langs->trans('AccountingJournalTypeVariousOperation'); + if ($nature == 9) return $langs->trans('AccountingJournalType9'); + if ($nature == 4) return $langs->trans('AccountingJournalType4'); + if ($nature == 3) return $langs->trans('AccountingJournalType3'); + if ($nature == 2) return $langs->trans('AccountingJournalType2'); + if ($nature == 1) return $langs->trans('AccountingJournalType1'); } } } diff --git a/htdocs/compta/bank/card.php b/htdocs/compta/bank/card.php index 5b3bb3a58fe..75ba80052bc 100644 --- a/htdocs/compta/bank/card.php +++ b/htdocs/compta/bank/card.php @@ -36,6 +36,7 @@ require_once DOL_DOCUMENT_ROOT . '/compta/bank/class/account.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/class/extrafields.class.php'; if (! empty($conf->categorie->enabled)) require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php'; if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingaccount.class.php'; $langs->load("banks"); @@ -278,6 +279,7 @@ $form = new Form($db); $formbank = new FormBank($db); $formcompany = new FormCompany($db); if (! empty($conf->accounting->enabled)) $formaccountancy = New FormVentilation($db); +if (! empty($conf->accounting->enabled)) $formaccountancy2 = New FormAccounting($db); $countrynotdefined=$langs->trans("ErrorSetACountryFirst").' ('.$langs->trans("SeeAbove").')'; @@ -534,7 +536,9 @@ if ($action == 'create') if (! empty($conf->accounting->enabled)) { print ''; - print ''; + print ''; } print '
'.$langs->trans("UsageParameter").''.$langs->trans("Value").'
'; print $langs->trans("MessageOK").''; -$doleditor=new DolEditor('STRIPE_MESSAGE_OK',$conf->global->STRIPE_MESSAGE_OK,'',100,'dolibarr_details','In',false,true,true,ROWS_2,60); +$doleditor=new DolEditor('STRIPE_MESSAGE_OK',$conf->global->STRIPE_MESSAGE_OK,'',100,'dolibarr_details','In',false,true,true,ROWS_2,'90%'); $doleditor->Create(); print '
'; print $langs->trans("MessageKO").''; -$doleditor=new DolEditor('STRIPE_MESSAGE_KO',$conf->global->STRIPE_MESSAGE_KO,'',100,'dolibarr_details','In',false,true,true,ROWS_2,60); +$doleditor=new DolEditor('STRIPE_MESSAGE_KO',$conf->global->STRIPE_MESSAGE_KO,'',100,'dolibarr_details','In',false,true,true,ROWS_2,'90%'); $doleditor->Create(); print '
- Invoice #: ref; ?>
+ trans("Invoice") . ' : ' . $invoice->ref; ?>
trans('Date') . ' : ' . dol_print_date($invoice->date, 'day'); ?>
trans('DateMaxPayment') . ' : ' . dol_print_date($invoice->date_validation, 'day'); ?>
'.$langs->trans("AccountancyJournal").'accountancy_journal).'">
'; + print $formaccountancy2->select_journal($object->accountancy_journal, 'accountancy_journal', 4, 1, '', 1, 1); + print '
'; @@ -980,8 +984,10 @@ else // Accountancy journal if (! empty($conf->accounting->enabled)) { - print ''.$langs->trans("AccountancyJournal").''; - print 'accountancy_journal).'">'; + print ''.$langs->trans("AccountancyJournal").''; + print ''; + print $formaccountancy2->select_journal($object->accountancy_journal, 'accountancy_journal', 4, 1, '', 1, 1); + print ''; } print ''; diff --git a/htdocs/core/class/html.formaccounting.class.php b/htdocs/core/class/html.formaccounting.class.php index cb988a511cd..1a33f0fce60 100644 --- a/htdocs/core/class/html.formaccounting.class.php +++ b/htdocs/core/class/html.formaccounting.class.php @@ -60,37 +60,49 @@ class FormAccounting extends Form { global $conf; - $sql = "SELECT rowid, code, label, nature, entity, active"; - $sql.= " FROM " . MAIN_DB_PREFIX . "accounting_journal"; - $sql.= " WHERE entity = ".$conf->entity; - $sql.= " AND active = 1"; - if (empty($nature)) $sql.= " AND nature = ".$nature; - $sql.= " ORDER BY code"; + $out = ''; - dol_syslog(get_class($this) . "::select_journal", LOG_DEBUG); - $resql = $this->db->query($sql); + $options = array(); + if ($usecache && ! empty($this->options_cache[$usecache])) + { + $options = $this->options_cache[$usecache]; + $selected=$selectid; + } + else + { + $sql = "SELECT rowid, code, label, nature, entity, active"; + $sql.= " FROM " . MAIN_DB_PREFIX . "accounting_journal"; + $sql.= " WHERE active = 1"; + $sql.= " AND entity = ".$conf->entity; + //if ($nature && is_numeric($nature)) $sql .= " AND nature = ".$nature; + $sql.= " ORDER BY code"; - if (!$resql) { - $this->error = "Error ".$this->db->lasterror(); - dol_syslog(get_class($this)."::select_journal ".$this->error, LOG_ERR); - return -1; + dol_syslog(get_class($this) . "::select_journal", LOG_DEBUG); + $resql = $this->db->query($sql); + + if (!$resql) { + $this->error = "Error ".$this->db->lasterror(); + dol_syslog(get_class($this)."::select_journal ".$this->error, LOG_ERR); + return -1; + } + + $out = ajax_combobox($htmlname, $event); + + while ($obj = $this->db->fetch_object($resql)) + { + $label = $obj->code . ' - ' . $obj->label; + $select_value_out = $obj->rowid; + + $options[$select_value_out] = $label; + } + $this->db->free($resql); + + if ($usecache) + { + $this->options_cache[$usecache] = $options; + } } - $options = array(); - $out = ajax_combobox($htmlname, $event); - - $selected = 0; - while ($obj = $this->db->fetch_object($resql)) - { - $label = $obj->code . ' - ' . $obj->label; - } - $this->db->free($resql); - - if ($usecache) - { - $this->options_cache[$usecache] = $options; - } - $out .= Form::selectarray($htmlname, $options, $selectid, $showempty, 0, 0, '', 0, 0, 0, '', $morecss, 1); return $out; diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index d96210dcbfe..9e4699b2e4b 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -259,4 +259,11 @@ UPDATE llx_accounting_journal SET nature = 3 where code = 'AC' and nature = 2; UPDATE llx_accounting_journal SET nature = 4 where (code = 'BK' or code = 'BQ') and nature = 3; +ALTER TABLE llx_bank_account CHANGE COLUMN accountancy_journal fk_accountancy_journal integer; +ALTER TABLE llx_bank_account ADD CONSTRAINT bank_fk_accountancy_journal FOREIGN KEY (fk_accountancy_journal) REFERENCES llx_accounting_journal (rowid); + + + + + diff --git a/htdocs/install/mysql/tables/llx_accounting_journal.sql b/htdocs/install/mysql/tables/llx_accounting_journal.sql index a435de3cd80..348654b56dc 100644 --- a/htdocs/install/mysql/tables/llx_accounting_journal.sql +++ b/htdocs/install/mysql/tables/llx_accounting_journal.sql @@ -23,6 +23,6 @@ create table llx_accounting_journal entity integer DEFAULT 1, code varchar(32) NOT NULL, label varchar(128) NOT NULL, - nature smallint DEFAULT 0 NOT NULL, -- type of journals (1:various operations / 2:sale / 3:purchase / 4:bank / 9: has-new) + nature smallint DEFAULT 1 NOT NULL, -- type of journals (1:various operations / 2:sale / 3:purchase / 4:bank / 9: has-new) active smallint DEFAULT 0 )ENGINE=innodb; diff --git a/htdocs/install/mysql/tables/llx_bank_account.key.sql b/htdocs/install/mysql/tables/llx_bank_account.key.sql index c91762a322e..0a168d63990 100644 --- a/htdocs/install/mysql/tables/llx_bank_account.key.sql +++ b/htdocs/install/mysql/tables/llx_bank_account.key.sql @@ -19,3 +19,5 @@ ALTER TABLE llx_bank_account ADD UNIQUE uk_bank_account_label (label,entity); + +ALTER TABLE llx_bank_account ADD CONSTRAINT bank_fk_accountancy_journal FOREIGN KEY (fk_accountancy_journal) REFERENCES llx_accounting_journal (rowid); diff --git a/htdocs/install/mysql/tables/llx_bank_account.sql b/htdocs/install/mysql/tables/llx_bank_account.sql index 7730ab79ef6..6db2857ddae 100644 --- a/htdocs/install/mysql/tables/llx_bank_account.sql +++ b/htdocs/install/mysql/tables/llx_bank_account.sql @@ -24,39 +24,39 @@ create table llx_bank_account ( - rowid integer AUTO_INCREMENT PRIMARY KEY, - datec datetime, - tms timestamp, - ref varchar(12) NOT NULL, - label varchar(30) NOT NULL, - entity integer DEFAULT 1 NOT NULL, -- multi company id - fk_user_author integer, - fk_user_modif integer, - bank varchar(60), - code_banque varchar(128), - code_guichet varchar(6), - number varchar(255), - cle_rib varchar(5), - bic varchar(11), - iban_prefix varchar(34), -- full iban. 34 according to ISO 13616 - country_iban varchar(2), -- deprecated - cle_iban varchar(2), - domiciliation varchar(255), - state_id integer DEFAULT NULL, - fk_pays integer NOT NULL, - proprio varchar(60), - owner_address varchar(255), - courant smallint DEFAULT 0 NOT NULL, - clos smallint DEFAULT 0 NOT NULL, - rappro smallint DEFAULT 1, - url varchar(128), - account_number varchar(32), -- bank accountancy number - accountancy_journal varchar(16) DEFAULT NULL, -- bank accountancy journal - currency_code varchar(3) NOT NULL, - min_allowed integer DEFAULT 0, - min_desired integer DEFAULT 0, - comment text, -- TODO rename in note_private - note_public text, - model_pdf varchar(255), - import_key varchar(14) + rowid integer AUTO_INCREMENT PRIMARY KEY, + datec datetime, + tms timestamp, + ref varchar(12) NOT NULL, + label varchar(30) NOT NULL, + entity integer DEFAULT 1 NOT NULL, -- multi company id + fk_user_author integer, + fk_user_modif integer, + bank varchar(60), + code_banque varchar(128), + code_guichet varchar(6), + number varchar(255), + cle_rib varchar(5), + bic varchar(11), + iban_prefix varchar(34), -- full iban. 34 according to ISO 13616 + country_iban varchar(2), -- deprecated + cle_iban varchar(2), + domiciliation varchar(255), + state_id integer DEFAULT NULL, + fk_pays integer NOT NULL, + proprio varchar(60), + owner_address varchar(255), + courant smallint DEFAULT 0 NOT NULL, + clos smallint DEFAULT 0 NOT NULL, + rappro smallint DEFAULT 1, + url varchar(128), + account_number varchar(32), -- bank accountancy number + fk_accountancy_journal integer, -- bank accountancy journal + currency_code varchar(3) NOT NULL, + min_allowed integer DEFAULT 0, + min_desired integer DEFAULT 0, + comment text, -- TODO rename in note_private + note_public text, + model_pdf varchar(255), + import_key varchar(14) )ENGINE=innodb; From 8113e6c2f21714e81dc1a4132325129fd999f4b7 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sat, 6 May 2017 08:11:07 +0200 Subject: [PATCH 016/299] Update Accounting journal getNomUrl --- .../class/accountingjournal.class.php | 61 +++++++++++++++---- 1 file changed, 48 insertions(+), 13 deletions(-) diff --git a/htdocs/accountancy/class/accountingjournal.class.php b/htdocs/accountancy/class/accountingjournal.class.php index 9bff37560d7..91924f08592 100644 --- a/htdocs/accountancy/class/accountingjournal.class.php +++ b/htdocs/accountancy/class/accountingjournal.class.php @@ -85,27 +85,62 @@ class AccountingJournal extends CommonObject /** * Return clicable name (with picto eventually) * - * @param int $withpicto 0=No picto, 1=Include picto into link, 2=Only picto - * @return string Chaine avec URL + * @param int $withpicto 0=No picto, 1=Include picto into link, 2=Only picto + * @param int $withlabel 0=No label, 1=Include label of account + * @param int $nourl 1=Disable url + * @param string $moretitle Add more text to title tooltip + * @param int $notooltip 1=Disable tooltip + * @return string String with URL */ - function getNomUrl($withpicto = 0) { - global $langs; + function getNomUrl($withpicto = 0, $withlabel = 0, $nourl = 0, $moretitle='',$notooltip=0) + { + global $langs, $conf, $user; + + if (! empty($conf->dol_no_mouse_hover)) $notooltip=1; // Force disable tooltips $result = ''; - $link = ''; - $linkend = ''; + $url = DOL_URL_ROOT . '/accountancy/admin/journals_list.php'; $picto = 'billr'; + $label=''; - $label = $langs->trans("Show") . ': ' . $this->code . ' - ' . $this->label; + $label = '' . $langs->trans("ShowAccountingJournal") . ''; + if (! empty($this->code)) + $label .= '
'.$langs->trans('Code') . ': ' . $this->code; + if (! empty($this->label)) + $label .= '
'.$langs->trans('Label') . ': ' . $this->label; + if ($moretitle) $label.=' - '.$moretitle; - if ($withpicto) - $result .= ($link . img_object($label, $picto) . $linkend); - if ($withpicto && $withpicto != 2) - $result .= ' '; - if ($withpicto != 2) - $result .= $link . $this->code . ' - ' . $this->label . $linkend; + $linkclose=''; + if (empty($notooltip)) + { + if (! empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) + { + $label=$langs->trans("ShowAccoutingJournal"); + $linkclose.=' alt="'.dol_escape_htmltag($label, 1).'"'; + } + $linkclose.= ' title="'.dol_escape_htmltag($label, 1).'"'; + $linkclose.=' class="classfortooltip"'; + } + + $linkstart=''; + $linkend=''; + + if ($nourl) + { + $linkstart = ''; + $linkclose = ''; + $linkend = ''; + } + + $label_link = $this->code; + if ($withlabel) $label_link .= ' - ' . $this->label; + + if ($withpicto) $result.=($linkstart.img_object(($notooltip?'':$label), $picto, ($notooltip?'':'class="classfortooltip"'), 0, 0, $notooltip?0:1).$linkend); + if ($withpicto && $withpicto != 2) $result .= ' '; + if ($withpicto != 2) $result.=$linkstart . $label_link . $linkend; return $result; } From 7c4b47f20d9e32fe753a433a5cae606c2e897854 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sat, 6 May 2017 08:33:12 +0200 Subject: [PATCH 017/299] Update works --- htdocs/compta/bank/card.php | 18 +++++++++---- htdocs/compta/bank/class/account.class.php | 14 +++++----- htdocs/compta/bank/index.php | 27 ++++++++++++------- htdocs/compta/bank/various_payment/index.php | 4 +-- .../install/mysql/migration/5.0.0-6.0.0.sql | 2 +- .../mysql/tables/llx_bank_account.key.sql | 2 +- htdocs/langs/en_US/accountancy.lang | 3 ++- 7 files changed, 44 insertions(+), 26 deletions(-) diff --git a/htdocs/compta/bank/card.php b/htdocs/compta/bank/card.php index 75ba80052bc..804d2c5511d 100644 --- a/htdocs/compta/bank/card.php +++ b/htdocs/compta/bank/card.php @@ -38,6 +38,7 @@ if (! empty($conf->categorie->enabled)) require_once DOL_DOCUMENT_ROOT . '/categ if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingaccount.class.php'; +if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingjournal.class.php'; $langs->load("banks"); $langs->load("bills"); @@ -100,7 +101,7 @@ if ($action == 'add') $account_number = GETPOST('account_number','alpha'); if ($account_number <= 0) { $object->account_number = ''; } else { $object->account_number = $account_number; } - $object->accountancy_journal = trim($_POST["accountancy_journal"]); + $object->fk_accountancy_journal = trim($_POST["fk_accountancy_journal"]); $object->solde = $_POST["solde"]; $object->date_solde = dol_mktime(12,0,0,$_POST["remonth"],$_POST["reday"],$_POST["reyear"]); @@ -198,7 +199,7 @@ if ($action == 'update') $account_number = GETPOST('account_number', 'int'); if ($account_number <= 0) { $object->account_number = ''; } else { $object->account_number = $account_number; } - $object->accountancy_journal = trim($_POST["accountancy_journal"]); + $object->fk_accountancy_journal = trim($_POST["fk_accountancy_journal"]); $object->currency_code = trim($_POST["account_currency_code"]); @@ -537,7 +538,7 @@ if ($action == 'create') { print ''.$langs->trans("AccountancyJournal").''; print ''; - print $formaccountancy2->select_journal($object->accountancy_journal, 'accountancy_journal', 4, 1, '', 1, 1); + print $formaccountancy2->select_journal($object->fk_accountancy_journal, 'fk_accountancy_journal', 4, 1, '', 1, 1); print ''; } @@ -681,7 +682,14 @@ else if (! empty($conf->accounting->enabled)) { print ''.$langs->trans("AccountancyJournal").''; - print ''.$object->accountancy_journal.''; + print ''; + + $accountingjournal = new AccountingJournal($db); + $accountingjournal->fetch($object->fk_accountancy_journal); + + print $accountingjournal->getNomUrl(0,1,1,'',1); + + print ''; } // Other attributes @@ -986,7 +994,7 @@ else { print ''.$langs->trans("AccountancyJournal").''; print ''; - print $formaccountancy2->select_journal($object->accountancy_journal, 'accountancy_journal', 4, 1, '', 1, 1); + print $formaccountancy2->select_journal($object->fk_accountancy_journal, 'fk_accountancy_journal', 4, 1, '', 1, 1); print ''; } diff --git a/htdocs/compta/bank/class/account.class.php b/htdocs/compta/bank/class/account.class.php index 897fd5de496..33181f666d7 100644 --- a/htdocs/compta/bank/class/account.class.php +++ b/htdocs/compta/bank/class/account.class.php @@ -160,7 +160,7 @@ class Account extends CommonObject * @var string */ public $account_number; - public $accountancy_journal; + public $fk_accountancy_journal; /** * Currency code @@ -545,7 +545,7 @@ class Account extends CommonObject $sql.= ", label"; $sql.= ", entity"; $sql.= ", account_number"; - $sql.= ", accountancy_journal"; + $sql.= ", fk_accountancy_journal"; $sql.= ", bank"; $sql.= ", code_banque"; $sql.= ", code_guichet"; @@ -569,7 +569,7 @@ class Account extends CommonObject $sql.= ", '".$this->db->escape($this->label)."'"; $sql.= ", ".$conf->entity; $sql.= ", '".$this->db->escape($this->account_number)."'"; - $sql.= ", '".$this->db->escape($this->accountancy_journal)."'"; + $sql.= ", '".$this->db->escape($this->fk_accountancy_journal)."'"; $sql.= ", '".$this->db->escape($this->bank)."'"; $sql.= ", '".$this->code_banque."'"; $sql.= ", '".$this->code_guichet."'"; @@ -702,7 +702,7 @@ class Account extends CommonObject $sql.= ",rappro = ".$this->rappro; $sql.= ",url = ".($this->url?"'".$this->url."'":"null"); $sql.= ",account_number = '".$this->account_number."'"; - $sql.= ",accountancy_journal = '".$this->accountancy_journal."'"; + $sql.= ",fk_accountancy_journal = '".$this->fk_accountancy_journal."'"; $sql.= ",bank = '".$this->db->escape($this->bank)."'"; $sql.= ",code_banque='".$this->code_banque."'"; @@ -847,7 +847,7 @@ class Account extends CommonObject $sql = "SELECT ba.rowid, ba.ref, ba.label, ba.bank, ba.number, ba.courant, ba.clos, ba.rappro, ba.url,"; $sql.= " ba.code_banque, ba.code_guichet, ba.cle_rib, ba.bic, ba.iban_prefix as iban,"; $sql.= " ba.domiciliation, ba.proprio, ba.owner_address, ba.state_id, ba.fk_pays as country_id,"; - $sql.= " ba.account_number, ba.accountancy_journal, ba.currency_code,"; + $sql.= " ba.account_number, ba.fk_accountancy_journal, ba.currency_code,"; $sql.= " ba.min_allowed, ba.min_desired, ba.comment,"; $sql.= " ba.datec as date_creation, ba.tms as date_update,"; $sql.= ' c.code as country_code, c.label as country,'; @@ -897,7 +897,7 @@ class Account extends CommonObject $this->country = $obj->country; $this->account_number = $obj->account_number; - $this->accountancy_journal = $obj->accountancy_journal; + $this->fk_accountancy_journal = $obj->fk_accountancy_journal; $this->currency_code = $obj->currency_code; $this->account_currency_code = $obj->currency_code; @@ -1259,7 +1259,7 @@ class Account extends CommonObject include_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; $langs->load("accountancy"); $label .= '
' . $langs->trans('AccountAccounting') . ': ' . length_accountg($this->account_number); - $label .= '
' . $langs->trans('AccountancyJournal') . ': ' . $this->accountancy_journal; + $label .= '
' . $langs->trans('AccountancyJournal') . ': ' . $this->fk_accountancy_journal; } $linkclose = '" title="'.dol_escape_htmltag($label, 1).'" class="classfortooltip">'; diff --git a/htdocs/compta/bank/index.php b/htdocs/compta/bank/index.php index b808fa8f596..19ec335cac5 100644 --- a/htdocs/compta/bank/index.php +++ b/htdocs/compta/bank/index.php @@ -29,6 +29,8 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php'; require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; +if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingaccount.class.php'; +if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingjournal.class.php'; $langs->load("banks"); $langs->load("categories"); @@ -88,7 +90,7 @@ $arrayfields=array( 'b.label'=>array('label'=>$langs->trans("Label"), 'checked'=>1), 'b.number'=>array('label'=>$langs->trans("AccountIdShort"), 'checked'=>1), 'b.account_number'=>array('label'=>$langs->trans("AccountAccounting"), 'checked'=>$conf->accountancy->enabled), - 'b.accountancy_journal'=>array('label'=>$langs->trans("AccountancyJournal"), 'checked'=>$conf->accountancy->enabled), + 'b.fk_accountancy_journal'=>array('label'=>$langs->trans("AccountancyJournal"), 'checked'=>$conf->accountancy->enabled), 'toreconcile'=>array('label'=>$langs->trans("TransactionsToConciliate"), 'checked'=>1), 'b.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), 'b.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500), @@ -141,7 +143,7 @@ $title=$langs->trans('BankAccounts'); // Load array of financial accounts (opened by default) $accounts = array(); -$sql = "SELECT rowid, label, courant, rappro, account_number, accountancy_journal, datec as date_creation, tms as date_update"; +$sql = "SELECT rowid, label, courant, rappro, account_number, fk_accountancy_journal, datec as date_creation, tms as date_update"; // Add fields from extrafields foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : ''); // Add fields from hooks @@ -323,7 +325,7 @@ if (! empty($arrayfields['b.account_number']['checked'])) print ''; } // Accountancy journal -if (! empty($arrayfields['b.accountancy_journal']['checked'])) +if (! empty($arrayfields['b.fk_accountancy_journal']['checked'])) { print ''; print ''; @@ -403,7 +405,7 @@ if (! empty($arrayfields['b.label']['checked'])) print_liste_field_titr if (! empty($arrayfields['accountype']['checked'])) print_liste_field_titre($arrayfields['accountype']['label'],$_SERVER["PHP_SELF"],'','',$param,'',$sortfield,$sortorder); if (! empty($arrayfields['b.number']['checked'])) print_liste_field_titre($arrayfields['b.number']['label'],$_SERVER["PHP_SELF"],'b.number','',$param,'',$sortfield,$sortorder); if (! empty($arrayfields['b.account_number']['checked'])) print_liste_field_titre($arrayfields['b.account_number']['label'],$_SERVER["PHP_SELF"],'b.account_number','',$param,'',$sortfield,$sortorder); -if (! empty($arrayfields['b.accountancy_journal']['checked'])) print_liste_field_titre($arrayfields['b.accountancy_journal']['label'],$_SERVER["PHP_SELF"],'b.accountancy_journal','',$param,'',$sortfield,$sortorder); +if (! empty($arrayfields['b.fk_accountancy_journal']['checked'])) print_liste_field_titre($arrayfields['b.fk_accountancy_journal']['label'],$_SERVER["PHP_SELF"],'b.fk_accountancy_journal','',$param,'',$sortfield,$sortorder); if (! empty($arrayfields['toreconcile']['checked'])) print_liste_field_titre($arrayfields['toreconcile']['label'],$_SERVER["PHP_SELF"],'','',$param,'align="center"',$sortfield,$sortorder); // Extra fields if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) @@ -488,16 +490,23 @@ foreach ($accounts as $key=>$type) if (! empty($arrayfields['b.account_number']['checked'])) { include_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; - print ''.length_accountg($acc->account_number).''; + + $accountingaccount = new AccountingAccount($db); + $accountingaccount->fetch('',$acc->account_number); + + print ''.length_accountg($accountingaccount->getNomUrl(0,1,1,'',1)).''; + if (! $i) $totalarray['nbfield']++; } // Accountancy journal - if (! empty($arrayfields['b.accountancy_journal']['checked'])) + if (! empty($arrayfields['b.fk_accountancy_journal']['checked'])) { - include_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; - print ''.length_accountg($acc->accountancy_journal).''; - if (! $i) $totalarray['nbfield']++; + $accountingjournal = new AccountingJournal($db); + $accountingjournal->fetch($acc->fk_accountancy_journal); + + print ''.$accountingjournal->getNomUrl(0,1,1,'',1).''; + if (! $i) $totalarray['nbfield']++; } // Transactions to reconcile diff --git a/htdocs/compta/bank/various_payment/index.php b/htdocs/compta/bank/various_payment/index.php index 6c4b41333f1..abf6d23d22e 100644 --- a/htdocs/compta/bank/various_payment/index.php +++ b/htdocs/compta/bank/various_payment/index.php @@ -89,7 +89,7 @@ $variousstatic = new PaymentVarious($db); $accountstatic = new Account($db); $sql = "SELECT v.rowid, v.amount, v.label, v.datep as datep, v.datev as datev, v.fk_typepayment as type, v.num_payment, v.fk_bank,"; -$sql.= " ba.rowid as bid, ba.ref as bref, ba.number as bnumber, ba.account_number, ba.accountancy_journal, ba.label as blabel,"; +$sql.= " ba.rowid as bid, ba.ref as bref, ba.number as bnumber, ba.account_number, ba.fk_accountancy_journal, ba.label as blabel,"; $sql.= " pst.code as payment_code"; $sql.= " FROM ".MAIN_DB_PREFIX."payment_various as v"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_paiement as pst ON v.fk_typepayment = pst.id"; @@ -217,7 +217,7 @@ if ($result) $accountstatic->ref=$obj->bref; $accountstatic->number=$obj->bnumber; $accountstatic->accountancy_number=$obj->account_number; - $accountstatic->accountancy_journal=$obj->accountancy_journal; + $accountstatic->fk_accountancy_journal=$obj->fk_accountancy_journal; $accountstatic->label=$obj->blabel; print $accountstatic->getNomUrl(1); } diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index 9e4699b2e4b..a9293ea6915 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -260,7 +260,7 @@ UPDATE llx_accounting_journal SET nature = 4 where (code = 'BK' or code = 'BQ') ALTER TABLE llx_bank_account CHANGE COLUMN accountancy_journal fk_accountancy_journal integer; -ALTER TABLE llx_bank_account ADD CONSTRAINT bank_fk_accountancy_journal FOREIGN KEY (fk_accountancy_journal) REFERENCES llx_accounting_journal (rowid); +--ALTER TABLE llx_bank_account ADD CONSTRAINT bank_fk_accountancy_journal FOREIGN KEY (fk_accountancy_journal) REFERENCES llx_accounting_journal (rowid); diff --git a/htdocs/install/mysql/tables/llx_bank_account.key.sql b/htdocs/install/mysql/tables/llx_bank_account.key.sql index 0a168d63990..986ca7ea550 100644 --- a/htdocs/install/mysql/tables/llx_bank_account.key.sql +++ b/htdocs/install/mysql/tables/llx_bank_account.key.sql @@ -20,4 +20,4 @@ ALTER TABLE llx_bank_account ADD UNIQUE uk_bank_account_label (label,entity); -ALTER TABLE llx_bank_account ADD CONSTRAINT bank_fk_accountancy_journal FOREIGN KEY (fk_accountancy_journal) REFERENCES llx_accounting_journal (rowid); +-- ALTER TABLE llx_bank_account ADD CONSTRAINT bank_fk_accountancy_journal FOREIGN KEY (fk_accountancy_journal) REFERENCES llx_accounting_journal (rowid); diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index 9eb4135397f..92fe19676c0 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -61,7 +61,8 @@ ChangeAndLoad=Change and load Addanaccount=Add an accounting account AccountAccounting=Accounting account AccountAccountingShort=Account -ShowAccoutingAccount=Show accounting account +ShowAccountingAccount=Show accounting account +ShowAccountingJournal=Show accounting journal AccountAccountingSuggest=Accounting account suggested MenuDefaultAccounts=Default accounts MenuVatAccounts=Vat accounts From 55feea5d9816a3a37042fe43ea790df7cfe1f613 Mon Sep 17 00:00:00 2001 From: philippe grand Date: Sat, 6 May 2017 10:54:28 +0200 Subject: [PATCH 018/299] Update code using new css class --- htdocs/admin/stock.php | 17 +++--------- htdocs/categories/index.php | 3 +-- htdocs/categories/viewcat.php | 43 ++++++++++-------------------- htdocs/comm/card.php | 3 +-- htdocs/comm/index.php | 11 ++------ htdocs/comm/propal/stats/index.php | 5 ++-- 6 files changed, 24 insertions(+), 58 deletions(-) diff --git a/htdocs/admin/stock.php b/htdocs/admin/stock.php index c8204f213c2..164e4fd6bc8 100644 --- a/htdocs/admin/stock.php +++ b/htdocs/admin/stock.php @@ -3,7 +3,7 @@ * Copyright (C) 2008-2010 Laurent Destailleur * Copyright (C) 2005-2009 Regis Houssin * Copyright (C) 2012-2013 Juanjo Menent - * Copyright (C) 2013 Philippe Grand + * Copyright (C) 2013-2017 Philippe Grand * Copyright (C) 2013 Florian Henry * * This program is free software; you can redistribute it and/or modify @@ -435,7 +435,6 @@ if ($virtualdiffersfromphysical) print '
'; if ($conf->global->MAIN_LEVEL_FEATURES >= 2) { - $var=false; print ''; print ''; print ''."\n"; @@ -443,8 +442,7 @@ if ($conf->global->MAIN_LEVEL_FEATURES >= 2) print ''."\n"; // Example with a yes / no select - $var=!$var; - print ''; + print ''; print ''; print ''; print ''; // Example with a yes / no select - $var=!$var; - print ''; + print ''; print ''; print ''; print ''; // Example with a yes / no select - $var=!$var; - print ''; + print ''; print ''; print ''; print '
'.$langs->trans("Inventory").' 
'.$langs->trans("INVENTORY_DISABLE_VIRTUAL").' '; @@ -457,8 +455,7 @@ if ($conf->global->MAIN_LEVEL_FEATURES >= 2) print '
'.$langs->trans("INVENTORY_USE_MIN_PA_IF_NO_LAST_PA").' '; @@ -471,8 +468,7 @@ if ($conf->global->MAIN_LEVEL_FEATURES >= 2) print '
'.$langs->trans("INVENTORY_USE_INVENTORY_DATE_FROM_DATEMVT").' '; @@ -487,7 +483,6 @@ if ($conf->global->MAIN_LEVEL_FEATURES >= 2) print '
'; } -$var=true; print ''; print ''; @@ -509,8 +504,6 @@ if (! empty($conf->fournisseur->enabled) && !empty($conf->global->STOCK_CALCULAT print "\n\n"; } - - print ''; print ''; print '\n"; print "\n"; - - print ''; print ''; diff --git a/htdocs/categories/index.php b/htdocs/categories/index.php index ca2b7b5c76f..b68da6fd597 100644 --- a/htdocs/categories/index.php +++ b/htdocs/categories/index.php @@ -112,8 +112,7 @@ if ($catname || $id > 0) $var=true; foreach ($cats as $cat) { - $var = ! $var; - print "\t\n"; + print "\t".''."\n"; print "\t\t\n"; if (count($cats) > 0) { - $var=true; foreach ($cats as $cat) - { - - print "\t\n"; + { + print "\t".''."\n"; print "\t\t".'\n"; @@ -360,11 +358,9 @@ if ($object->type == Categorie::TYPE_PRODUCT) if (count($prods) > 0) { - $var=true; foreach ($prods as $prod) - { - - print "\t\n"; + { + print "\t".''."\n"; print '\n"; @@ -411,12 +407,9 @@ if ($object->type == Categorie::TYPE_SUPPLIER) if (count($socs) > 0) { - $var=true; foreach ($socs as $soc) - { - - print "\t\n"; - + { + print "\t".''."\n"; print '\n"; @@ -464,14 +457,13 @@ if($object->type == Categorie::TYPE_CUSTOMER) if (count($socs) > 0) { $i = 0; - $var=true; foreach ($socs as $key => $soc) { if ($user->societe_id > 0 && $soc->id != $user->societe_id) continue; // External user always see only themself $i++; - print "\t\n"; + print "\t".''."\n"; print '\n"; @@ -520,11 +512,9 @@ if ($object->type == Categorie::TYPE_MEMBER) if (count($prods) > 0) { - $var=true; foreach ($prods as $key => $member) - { - - print "\t\n"; + { + print "\t".''."\n"; print '\n"; + print "\t".''."\n"; print '\n"; @@ -629,11 +618,9 @@ if ($object->type == Categorie::TYPE_ACCOUNT) if (count($accounts) > 0) { - $var=true; foreach ($accounts as $key => $account) - { - - print "\t\n"; + { + print "\t".''."\n"; print '\n"; @@ -684,11 +671,9 @@ if ($object->type == Categorie::TYPE_PROJECT) if (count($projects) > 0) { - $var=true; foreach ($projects as $key => $project) - { - - print "\t\n"; + { + print "\t".''."\n"; print '\n"; diff --git a/htdocs/comm/card.php b/htdocs/comm/card.php index aae1398109d..b933289be4f 100644 --- a/htdocs/comm/card.php +++ b/htdocs/comm/card.php @@ -788,8 +788,7 @@ if ($id > 0) while ($i < $num && $i < $MAXLIST) { $objp = $db->fetch_object($resql); - $var = ! $var; - print ""; + print ''; print '"; + print ''; print ''; print ''; print ''; - print ''; + + $accountingjournal = new AccountingJournal($db); + $accountingjournal->fetch('',$line->code_journal); + print ''; + print ''; print "\n"; $var=!$var; -print ''; +print ''; $var=!$var; From fd6518182beb1b7fbd627f3c7d567207b2fd4730 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 8 May 2017 12:08:43 +0200 Subject: [PATCH 026/299] Fix can force tls version --- htdocs/core/lib/geturl.lib.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/htdocs/core/lib/geturl.lib.php b/htdocs/core/lib/geturl.lib.php index da9e38e6dae..808e4f0ef09 100644 --- a/htdocs/core/lib/geturl.lib.php +++ b/htdocs/core/lib/geturl.lib.php @@ -59,9 +59,11 @@ function getURLContent($url,$postorget='GET',$param='',$followlocation=1,$addhea if (count($addheaders)) curl_setopt($ch, CURLOPT_HTTPHEADER, $addheaders); curl_setopt($ch, CURLINFO_HEADER_OUT, true); // To be able to retrieve request header and log it - // TLSv1 by default or change to TLSv1.2 in module configuration - //curl_setopt($ch, CURLOPT_SSLVERSION, (empty($conf->global->MAIN_CURL_SSLVERSION)?1:$conf->global->MAIN_CURL_SSLVERSION)); - + // By default use tls decied by PHP. + // You can force, if supported a version like TLSv1 or TLSv1.2 + if (! empty($conf->global->MAIN_CURL_SSLVERSION)) curl_setopt($ch, CURLOPT_SSLVERSION, $conf->global->MAIN_CURL_SSLVERSION); + //curl_setopt($ch, CURLOPT_SSLVERSION, 6); for tls 1.2 + //turning off the server and peer verification(TrustManager Concept). curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); From d7d212bbe19ecc4fde6eccebe020abdd72186664 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 8 May 2017 12:31:37 +0200 Subject: [PATCH 027/299] Fix bad link to list --- htdocs/fourn/facture/document.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/fourn/facture/document.php b/htdocs/fourn/facture/document.php index 52c44fc67b0..e68604fe092 100644 --- a/htdocs/fourn/facture/document.php +++ b/htdocs/fourn/facture/document.php @@ -93,7 +93,7 @@ if ($object->id > 0) $totalpaye = $object->getSommePaiement(); - $linkback = '' . $langs->trans("BackToList") . ''; + $linkback = '' . $langs->trans("BackToList") . ''; $morehtmlref='
'; // Ref supplier From 9fe28c9b2cd770a064f628cc2e298361e3a395c7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 9 May 2017 10:08:04 +0200 Subject: [PATCH 028/299] NEW Can disable all overwrote translations in one click. --- htdocs/admin/translation.php | 24 +++++++++++++++++++ htdocs/core/class/translate.class.php | 9 +++++-- .../install/mysql/migration/5.0.0-6.0.0.sql | 2 ++ htdocs/langs/en_US/admin.lang | 1 + 4 files changed, 34 insertions(+), 2 deletions(-) diff --git a/htdocs/admin/translation.php b/htdocs/admin/translation.php index 75f151d45b9..c51d1c2435d 100644 --- a/htdocs/admin/translation.php +++ b/htdocs/admin/translation.php @@ -79,6 +79,12 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETP $search_array_options=array(); } +if ($action == 'setMAIN_ENABLE_OVERWRITE_TRANSLATION') +{ + if (GETPOST('value')) dolibarr_set_const($db, 'MAIN_ENABLE_OVERWRITE_TRANSLATION', 1, 'chaine', 0, '', $conf->entity); + else dolibarr_set_const($db, 'MAIN_ENABLE_OVERWRITE_TRANSLATION', 0, 'chaine', 0, '', $conf->entity); +} + if ($action == 'add' || (GETPOST('add') && $action != 'update')) { $error=0; @@ -169,6 +175,24 @@ print $langs->trans("CurrentUserLanguage").': '.$s.' '.$current_language print '
'; +print $langs->trans("EnableOverwriteTranslation").' '; +if (empty($conf->global->MAIN_ENABLE_OVERWRITE_TRANSLATION)) +{ + // Button off, click to enable + print ''; + print img_picto($langs->trans("Disabled"),'switch_off'); + print ''; +} +else +{ + // Button on, click to disable + print ''; + print img_picto($langs->trans("Activated"),'switch_on'); + print ''; +} + +print '

'; + $param='&mode='.$mode; if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage; if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit; diff --git a/htdocs/core/class/translate.class.php b/htdocs/core/class/translate.class.php index 0f2e6a837ef..88b001ba093 100644 --- a/htdocs/core/class/translate.class.php +++ b/htdocs/core/class/translate.class.php @@ -297,7 +297,12 @@ class Translate $tabtranslatedomain[$key] = $value; } } - } else { + } + elseif ($key[0] == '#') + { + continue; + } + else { $this->tab_translate[$key] = $value; //if ($domain == 'orders') print "$tab[0] value $value
"; if ($usecachekey) { @@ -459,7 +464,7 @@ class Translate } } - if (! $found) + if (! $found && ! empty($conf->global->MAIN_ENABLE_OVERWRITE_TRANSLATION)) { // Overwrite translation with database read $sql="SELECT transkey, transvalue FROM ".MAIN_DB_PREFIX."overwrite_trans where lang='".$this->defaultlang."'"; diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index d96210dcbfe..d2431186ed7 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -158,6 +158,8 @@ INSERT INTO llx_const (name, entity, value, type, visible, note) VALUES ('CONTRA INSERT INTO llx_const (name, entity, value, type, visible, note) VALUES ('USERGROUP_ADDON_PDF_ODT_PATH', 1, 'DOL_DATA_ROOT/doctemplates/usergroups', 'chaine', 0, ''); INSERT INTO llx_const (name, entity, value, type, visible, note) VALUES ('USER_ADDON_PDF_ODT_PATH', 1, 'DOL_DATA_ROOT/doctemplates/users', 'chaine', 0, ''); +INSERT INTO llx_const (name, entity, value, type, visible, note) VALUES ('MAIN_ENABLE_OVERWRITE_TRANSLATION', 1, '1', 'chaine', 0, 'Enable overwrote of translation'); + ALTER TABLE llx_chargesociales ADD COLUMN ref varchar(16); ALTER TABLE llx_chargesociales ADD COLUMN fk_projet integer DEFAULT NULL; diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 5fd5cb57c8b..71e5b614abb 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -434,6 +434,7 @@ PageUrlForDefaultValues=You must enter here the relative url of the page. If you PageUrlForDefaultValuesCreate=
For form to create a new thirdparty, it is %s PageUrlForDefaultValuesList=
For page that list thirdparties, it is %s EnableDefaultValues=Enable usage of personalized default values +EnableOverwriteTranslation=Enable usage of overwrote translation GoIntoTranslationMenuToChangeThis=A translation has been found for the key with this code, so to change this value, you must edit it fom Home-Setup-translation. WarningSettingSortOrder=Warning, setting a default sort order may result in a technical error when going on the list page if field is an unknown field. If you experience such an error, come back to this page to remove the default sort order and restore default behavior. Field=Field From 63259295c6dff9eacd24a5280b0323f52b336fed Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 9 May 2017 10:19:39 +0200 Subject: [PATCH 029/299] Look and feel v6 --- htdocs/user/card.php | 4 -- htdocs/user/class/usergroup.class.php | 28 +++++++++++++- htdocs/user/group/card.php | 40 +++++++------------ htdocs/user/group/ldap.php | 45 +++++++++++----------- htdocs/user/group/perms.php | 55 ++++++++++++++------------- 5 files changed, 93 insertions(+), 79 deletions(-) diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 675f5748842..3682088b552 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -1716,8 +1716,6 @@ else */ if (! empty($groupslist)) { - $var=true; - foreach($groupslist as $group) { @@ -2360,8 +2358,6 @@ else $genallowed = $user->rights->user->user->creer; $delallowed = $user->rights->user->user->supprimer; - $var = true; - $somethingshown = $formfile->show_documents('user', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', 0, '', $soc->default_lang); // Show links to link elements diff --git a/htdocs/user/class/usergroup.class.php b/htdocs/user/class/usergroup.class.php index 907c0cef40d..cd9a16ea2b9 100644 --- a/htdocs/user/class/usergroup.class.php +++ b/htdocs/user/class/usergroup.class.php @@ -37,8 +37,9 @@ class UserGroup extends CommonObject public $element='usergroup'; public $table_element='usergroup'; protected $ismultientitymanaged = 1; // 0=No test on entity, 1=Test with field entity, 2=Test with link by societe - + public $picto='group'; public $entity; // Entity of group + /** * @deprecated * @see name @@ -744,6 +745,31 @@ class UserGroup extends CommonObject } + /** + * Return label of status of user (active, inactive) + * + * @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto + * @return string Label of status + */ + function getLibStatut($mode=0) + { + return $this->LibStatut(0,$mode); + } + + /** + * Renvoi le libelle d'un statut donne + * + * @param int $statut Id statut + * @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto + * @return string Label of status + */ + function LibStatut($statut,$mode=0) + { + global $langs; + $langs->load('users'); + return ''; + } + /** * Retourne chaine DN complete dans l'annuaire LDAP pour l'objet * diff --git a/htdocs/user/group/card.php b/htdocs/user/group/card.php index eacb954e007..bbcbd38c168 100644 --- a/htdocs/user/group/card.php +++ b/htdocs/user/group/card.php @@ -314,19 +314,17 @@ else if ($action != 'edit') { - dol_fiche_head($head, 'group', $title, 0, 'group'); + dol_fiche_head($head, 'group', $title, -1, 'group'); - print '
'.$langs->trans("UserWarehouseAutoCreate").''; @@ -523,8 +516,6 @@ print ''; print "
'.$langs->trans("AllowAddLimitStockByWarehouse").'
"; $categstatic->id=$cat->id; $categstatic->ref=$cat->label; diff --git a/htdocs/categories/viewcat.php b/htdocs/categories/viewcat.php index ebd5fa9991c..d04d0baebd2 100644 --- a/htdocs/categories/viewcat.php +++ b/htdocs/categories/viewcat.php @@ -289,11 +289,9 @@ else print "
'; print "".$cat->label.""; print "
'; print $prod->getNomUrl(1); print "
'; print $soc->getNomUrl(1); print "
'; print $soc->getNomUrl(1); print "
'; $member->ref=$member->login; print $member->getNomUrl(1,0); @@ -574,12 +564,11 @@ if($object->type == Categorie::TYPE_CONTACT) if (count($contacts) > 0) { $i = 0; - $var=true; foreach ($contacts as $key => $contact) { $i++; - print "\t
'; print $contact->getNomUrl(1,'category'); print "
'; print $account->getNomUrl(1,0); print "
'; print $project->getNomUrl(1,0); print "
'; $sendingstatic->id = $objp->id; $sendingstatic->ref = $objp->ref; diff --git a/htdocs/comm/index.php b/htdocs/comm/index.php index 4bd999b1d5a..24bccbf9c9c 100644 --- a/htdocs/comm/index.php +++ b/htdocs/comm/index.php @@ -2,7 +2,7 @@ /* Copyright (C) 2001-2005 Rodolphe Quiedeville * Copyright (C) 2004-2015 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin - * Copyright (C) 2015 Jean-François Ferry + * Copyright (C) 2015 Jean-François Ferry * * 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 @@ -479,7 +479,6 @@ if (! empty($conf->societe->enabled) && $user->rights->societe->lire) $resql = $db->query($sql); if ($resql) { - $var=false; $num = $db->num_rows($resql); $i = 0; @@ -544,7 +543,6 @@ if (! empty($conf->fournisseur->enabled) && $user->rights->societe->lire) $result = $db->query($sql); if ($result) { - $var=false; $num = $db->num_rows($result); $i = 0; @@ -633,11 +631,10 @@ if (! empty($conf->contrat->enabled) && $user->rights->contrat->lire && 0) // TO $staticcontrat=new Contrat($db); - $var=false; while ($i < $num) { $obj = $db->fetch_object($resql); - print "
contratid."\">".img_object($langs->trans("ShowContract","contract"), 'contract')." ".$obj->ref."
contratid."\">".img_object($langs->trans("ShowContract","contract"), "contract")." ".$obj->ref."'; $companystatic->id=$objp->rowid; $companystatic->name=$objp->name; @@ -686,8 +683,6 @@ if (! empty($conf->propal->enabled) && $user->rights->propal->lire) $i = 0; if ($num > 0) { - $var=true; - print ''; print ''; @@ -785,8 +780,6 @@ if (! empty($conf->commande->enabled) && $user->rights->commande->lire) $i = 0; if ($num > 0) { - $var=true; - print '
'.$langs->trans("ProposalsOpened").' '.$num.'
'; print ''; diff --git a/htdocs/comm/propal/stats/index.php b/htdocs/comm/propal/stats/index.php index abb24b8ffa4..5c74c8374a0 100644 --- a/htdocs/comm/propal/stats/index.php +++ b/htdocs/comm/propal/stats/index.php @@ -293,7 +293,6 @@ print ''; print ''; $oldyear=0; -$var=true; foreach ($data as $val) { $year = $val['year']; @@ -301,7 +300,7 @@ foreach ($data as $val) { // If we have empty year $oldyear--; - print ''; + print ''; print ''; print ''; print ''; @@ -311,7 +310,7 @@ foreach ($data as $val) print ''; print ''; } - print ''; + print ''; print ''; print ''; print ''; From a7e9dc1ce4b1545bc755746217b50e454e6dbcd3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 6 May 2017 13:06:33 +0200 Subject: [PATCH 019/299] Prepare 5.0.2 --- ChangeLog | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/ChangeLog b/ChangeLog index c9ac46b0f2a..3d4c5a29595 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,48 @@ English Dolibarr ChangeLog -------------------------------------------------------------- + +***** ChangeLog for 5.0.2 compared to 5.0.1 ***** +FIX: #6468 + Fix missing translation +FIX: #6517 #6525 Autocompletion of thirdparty after n chars not implemented +FIX: #6613 Default subject for Supplier proposal emails is filled with a non-existing key +FIX: #6614 +FIX: #6619 Template invoices list do not respect restricted thirdparty user rights +FIX: #6621 Documents tab shows greyed out upload form even if the option to show actions not available is disabled +FIX: #6623 User card shows "Return to list" link even if the user has no rights to list users +FIX: #6636 Complete fix +FIX: #6669 User with no permission to edit customer invoices can see a edit button in project entry +FIX: #6671 Cannot remove thirdparty type with "#" in its name +FIX: #6673 Missing "nature" table header in thirdparty list +FIX: #6675 Restricted user with no agenda permissions can see a button to create appointment in thirdparty contact list +FIX: #6679 User with restricted supplier invoice permissions can edit project, payment conditions, payment mode +FIX: #6680 User with restricted supplier invoice permissions sees "reopen" button even if he has no permission to do it +FIX: #6718 Bug: Discount amount is not locally formatted in CommonObject View +FIX: #6767 serious critical error, no login possible with postgresql and ipv6. +FIX: #6795 #6796 +FIX: Add option MAIN_MAIL_USE_MULTI_PART to include text content into HTML email and add option MAIN_MAIL_ADD_INLINE_IMAGES_IF_IN_MEDIAS to restore the inline images feature. +FIX: ajax autocomplete on clone +FIX: A non admin user can not download files attached to user. +FIX: Can't download delivery receipts (function dol_check_secure_access_document) +FIX: complete hourly rate when not defined into table of time spent +FIX: dont get empty "Incoterms : - " string if no incoterm +FIX: dont lose supplier ref if no supplier price in database +FIX: Enter a direct bank transaction +FIX: extrafield css for boolean type +FIX: forgotten parameter for right multicompany use +FIX: Found duplicate line when it is not. +FIX: global $dateSelector isn't the good one, then date selector on objectline_create tpl was hidden +FIX: Journal code of bank must be visible of accountaing module on. +FIX: length_accounta return variable name +FIX: limit+1 dosn't show Total line +FIX: No filter on company when showing the link to elements. +FIX: overwrapping of weight/volume on rouget template +FIX: Several bugs in accounting module. +FIX: shared bank account with multicompany not visible in invoice setup +FIX: spaces not allowed into vat code +FIX: supplier default condition not retrieved on create +FIX: supplier order line were always created with rang = 0 + ***** ChangeLog for 5.0.1 compared to 5.0.0 ***** FIX: #6503: SQL error in "Last pending payment invoices" FIX: #6505 Project elements page shows greyed-out links even if the option to show actions not available is disabled From c4475ca9462c56eb412592afcbe859dee5e99f57 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 6 May 2017 14:56:16 +0200 Subject: [PATCH 020/299] Add a protection to avoid to take modules into custom dir. --- build/makepack-dolibarr.pl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build/makepack-dolibarr.pl b/build/makepack-dolibarr.pl index f465cf51234..061e2a18557 100755 --- a/build/makepack-dolibarr.pl +++ b/build/makepack-dolibarr.pl @@ -509,7 +509,6 @@ if ($nboftargetok) { $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/documents`; # Removed known external modules to avoid any error when packaging from env where external modules are tested - #$ret=`find $BUILDROOT/$PROJECT/htdocs/custom/* -type d -exec rm -fr {} \;`; # For custom we want to keep dir $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/allscreens*`; $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/ancotec*`; $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/cabinetmed*`; @@ -575,6 +574,10 @@ if ($nboftargetok) { $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/tecnickcom/tcpdf/tools`; $ret=`rm -f $BUILDROOT/$PROJECT/htdocs/includes/tecnickcom/tcpdf/LICENSE.TXT`; $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/includes/savant`; + + print "Remove subdir of custom dir\n"; + print "find $BUILDROOT/$PROJECT/htdocs/custom/* -type d -exec rm -fr {} \\;\n"; + $ret=`find $BUILDROOT/$PROJECT/htdocs/custom/* -type d -exec rm -fr {} \\; >/dev/null 2>&1`; # For custom we want to keep dir } # Build package for each target From 880e2d0f72b951c7d64d1f6d70dd6777b554e818 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 6 May 2017 15:05:24 +0200 Subject: [PATCH 021/299] Fix packaging 5.0.2 --- build/rpm/dolibarr_fedora.spec | 1 + build/rpm/dolibarr_generic.spec | 1 + build/rpm/dolibarr_mandriva.spec | 1 + build/rpm/dolibarr_opensuse.spec | 1 + 4 files changed, 4 insertions(+) diff --git a/build/rpm/dolibarr_fedora.spec b/build/rpm/dolibarr_fedora.spec index e65e6bc3b7d..083c4eb8f14 100755 --- a/build/rpm/dolibarr_fedora.spec +++ b/build/rpm/dolibarr_fedora.spec @@ -173,6 +173,7 @@ done >>%{name}.lang %_datadir/dolibarr/htdocs/contrat %_datadir/dolibarr/htdocs/core %_datadir/dolibarr/htdocs/cron +%_datadir/dolibarr/htdocs/custom %_datadir/dolibarr/htdocs/don %_datadir/dolibarr/htdocs/ecm %_datadir/dolibarr/htdocs/expedition diff --git a/build/rpm/dolibarr_generic.spec b/build/rpm/dolibarr_generic.spec index 655ef87f925..b40a203a71f 100755 --- a/build/rpm/dolibarr_generic.spec +++ b/build/rpm/dolibarr_generic.spec @@ -253,6 +253,7 @@ done >>%{name}.lang %_datadir/dolibarr/htdocs/contrat %_datadir/dolibarr/htdocs/core %_datadir/dolibarr/htdocs/cron +%_datadir/dolibarr/htdocs/custom %_datadir/dolibarr/htdocs/don %_datadir/dolibarr/htdocs/ecm %_datadir/dolibarr/htdocs/expedition diff --git a/build/rpm/dolibarr_mandriva.spec b/build/rpm/dolibarr_mandriva.spec index 55fb7183734..fa3e39f8693 100755 --- a/build/rpm/dolibarr_mandriva.spec +++ b/build/rpm/dolibarr_mandriva.spec @@ -170,6 +170,7 @@ done >>%{name}.lang %_datadir/dolibarr/htdocs/contrat %_datadir/dolibarr/htdocs/core %_datadir/dolibarr/htdocs/cron +%_datadir/dolibarr/htdocs/custom %_datadir/dolibarr/htdocs/don %_datadir/dolibarr/htdocs/ecm %_datadir/dolibarr/htdocs/expedition diff --git a/build/rpm/dolibarr_opensuse.spec b/build/rpm/dolibarr_opensuse.spec index f7e29927ebb..b2f8cf6ede1 100755 --- a/build/rpm/dolibarr_opensuse.spec +++ b/build/rpm/dolibarr_opensuse.spec @@ -181,6 +181,7 @@ done >>%{name}.lang %_datadir/dolibarr/htdocs/contrat %_datadir/dolibarr/htdocs/core %_datadir/dolibarr/htdocs/cron +%_datadir/dolibarr/htdocs/custom %_datadir/dolibarr/htdocs/don %_datadir/dolibarr/htdocs/ecm %_datadir/dolibarr/htdocs/expedition From ab8dcbd3665fc8b4f182799dc9f7e5d47169a2fd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 6 May 2017 16:36:05 +0200 Subject: [PATCH 022/299] Use virtual name --- build/makepack-dolibarr.pl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/makepack-dolibarr.pl b/build/makepack-dolibarr.pl index 061e2a18557..6959ae67623 100755 --- a/build/makepack-dolibarr.pl +++ b/build/makepack-dolibarr.pl @@ -19,7 +19,7 @@ use Cwd; # Change this to defined target for option 98 and 99 $PROJECT="dolibarr"; $PUBLISHSTABLE="eldy,dolibarr\@frs.sourceforge.net:/home/frs/project/dolibarr"; -$PUBLISHBETARC="ldestailleur\@asso.dolibarr.org:/home/dolibarr/dolibarr.org/httpdocs/files"; +$PUBLISHBETARC="ldestailleur\@vmprod.dolibarr.org:/home/dolibarr/dolibarr.org/httpdocs/files"; #@LISTETARGET=("TGZ","ZIP","RPM_GENERIC","RPM_FEDORA","RPM_MANDRIVA","RPM_OPENSUSE","DEB","APS","EXEDOLIWAMP","SNAPSHOT"); # Possible packages From 8c75fc0e52591c7463b8f4d01b3e25166dfef16a Mon Sep 17 00:00:00 2001 From: Laurent Dinclaux Date: Sun, 7 May 2017 14:11:47 +1100 Subject: [PATCH 023/299] New-Caledonia uses the same bank accounts patterns than France --- htdocs/compta/bank/class/account.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/bank/class/account.class.php b/htdocs/compta/bank/class/account.class.php index 7867f9bd753..7149d5a60a0 100644 --- a/htdocs/compta/bank/class/account.class.php +++ b/htdocs/compta/bank/class/account.class.php @@ -1359,7 +1359,7 @@ class Account extends CommonObject { $country_code=$this->getCountryCode(); - if (in_array($country_code,array('CH','FR','ES','GA','IT'))) return 1; // France, Spain, Gabon, ... + if (in_array($country_code,array('CH','FR','ES','GA','IT','NC'))) return 1; // France, Spain, Gabon, ... if (in_array($country_code,array('AU','BE','CA','DE','DK','GR','GB','ID','IE','IR','KR','NL','NZ','UK','US'))) return 2; // Australia, England... return 0; } From a3602ff6b48170db1f964031565932e5786969a0 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Mon, 8 May 2017 06:20:17 +0200 Subject: [PATCH 024/299] Add journal list in new movement card --- htdocs/accountancy/bookkeeping/card.php | 66 +++++++++-------- htdocs/accountancy/bookkeeping/list.php | 9 ++- .../class/accountingjournal.class.php | 71 +++++++++++-------- .../core/class/html.formaccounting.class.php | 22 +++++- 4 files changed, 107 insertions(+), 61 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/card.php b/htdocs/accountancy/bookkeeping/card.php index ce0bd4d3aa2..055451016e9 100644 --- a/htdocs/accountancy/bookkeeping/card.php +++ b/htdocs/accountancy/bookkeeping/card.php @@ -1,7 +1,7 @@ * Copyright (C) 2013-2016 Florian Henry - * Copyright (C) 2013-2016 Alexandre Spangaro + * Copyright (C) 2013-2017 Alexandre Spangaro * * 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 @@ -18,9 +18,9 @@ */ /** - * \file htdocs/accountancy/bookkeeping/card.php + * \file htdocs/accountancy/bookkeeping/card.php * \ingroup Advanced accountancy - * \brief Page to show book-entry + * \brief Page to show book-entry */ require '../../main.inc.php'; @@ -28,9 +28,14 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/bookkeeping.class.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; +require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingjournal.class.php'; // Langs $langs->load("accountancy"); +$langs->load("bank"); +$langs->load("bills"); +$langs->load("trips"); // Security check $id = GETPOST('id', 'int'); @@ -211,6 +216,7 @@ llxHeader(); $html = new Form($db); $formventilation = new FormVentilation($db); +$formaccountancy = new FormAccounting($db); /* * Confirmation to delete the command @@ -223,26 +229,6 @@ if ($action == 'delete') { if ($action == 'create') { print load_fiche_titre($langs->trans("CreateMvts")); - $code_journal_array = array ( - $conf->global->ACCOUNTING_SELL_JOURNAL => $conf->global->ACCOUNTING_SELL_JOURNAL, - $conf->global->ACCOUNTING_PURCHASE_JOURNAL => $conf->global->ACCOUNTING_PURCHASE_JOURNAL, - $conf->global->ACCOUNTING_SOCIAL_JOURNAL => $conf->global->ACCOUNTING_SOCIAL_JOURNAL, - $conf->global->ACCOUNTING_MISCELLANEOUS_JOURNAL => $conf->global->ACCOUNTING_MISCELLANEOUS_JOURNAL, - $conf->global->ACCOUNTING_EXPENSEREPORT_JOURNAL => $conf->global->ACCOUNTING_EXPENSEREPORT_JOURNAL - ); - - $sql = 'SELECT DISTINCT accountancy_journal FROM ' . MAIN_DB_PREFIX . 'bank_account WHERE clos=0'; - $resql = $db->query($sql); - if (! $resql) { - setEventMessages($db->lasterror, null, 'errors'); - } else { - while ( $obj_bank = $db->fetch_object($resql) ) { - if (! empty($obj_bank->accountancy_journal)) { - $code_journal_array[$obj_bank->accountancy_journal] = $obj_bank->accountancy_journal; - } - } - } - $book = new BookKeeping($db); $next_num_mvt = $book->getNextNumMvt(); if (empty($next_num_mvt)) @@ -270,9 +256,10 @@ if ($action == 'create') { print ''; print ''; - print ''; - print ''; - print ''; + print ''; + print ''; print ''; print ''; @@ -308,25 +295,46 @@ if ($action == 'create') { print '
'; print '
'.$langs->trans("OrdersOpened").' '.$num.'
%
0?'&userid='.$userid:'').'">'.$oldyear.'0
0?'&userid='.$userid:'').'">'.$year.''.$val['nb'].''.round($val['nb_diff']).'
' . $langs->trans("Codejournal") . '' . $html->selectarray('code_journal', $code_journal_array) . '
'.$langs->trans("AccountancyJournal").''; + print $formaccountancy->select_journal('', 'code_journal', '', 0, '', 1, 1, 1, 1); + print '
' . $langs->trans("Docref") . '
'; + print ''; print ''; print ''; print ''; + print ''; print ''; print ''; print ''; + print ''; print ''; - print ''; - print ''; + print ''; + print ''; print ''; print ''; print ''; + + $typelabel = $book->doc_type; + if ($typelabel == 'bank') { + $typelabel = $langs->trans('Bank'); + } + if ($typelabel == 'customer_invoice') { + $typelabel = $langs->trans('CustomerInvoice'); + } + if ($typelabel == 'supplier_invoice') { + $typelabel = $langs->trans('SupplierInvoice'); + } + if ($typelabel == 'expense_report') { + $typelabel = $langs->trans('ExpenseReport'); + } print ''; print ''; - print ''; + print ''; print ''; print '
' . $langs->trans("NumMvts") . '' . $book->piece_num . '
' . $langs->trans("Docdate") . '' . dol_print_date($book->doc_date, 'daytextshort') . '
' . $langs->trans("Codejournal") . '' . $book->code_journal . '
'; + $accountingjournal = new AccountingJournal($db); + $accountingjournal->fetch('',$book->code_journal); + print $accountingjournal->getNomUrl(0,1,1,'',1); + print '
' . $langs->trans("Docref") . '' . $book->doc_ref . '
' . $langs->trans("Doctype") . '' . $book->doc_type . '' . $typelabel . '
'; diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index 75d0a63bf39..b382d855994 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -1,7 +1,7 @@ * Copyright (C) 2013-2016 Florian Henry - * Copyright (C) 2013-2016 Alexandre Spangaro + * Copyright (C) 2013-2017 Alexandre Spangaro * Copyright (C) 2016 Laurent Destailleur * * This program is free software; you can redistribute it and/or modify @@ -31,6 +31,7 @@ require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/bookkeeping.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/class/html.formother.class.php'; +require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingjournal.class.php'; // Langs $langs->load("accountancy"); @@ -443,7 +444,11 @@ foreach ($object->lines as $line ) { print '
' . $line->label_compte . '' . price($line->debit) . '' . price($line->credit) . '' . $line->code_journal . '' . $accountingjournal->getNomUrl(0,0,0,'',0) . ''; print '' . img_edit() . ' '; print '' . img_delete() . ''; diff --git a/htdocs/accountancy/class/accountingjournal.class.php b/htdocs/accountancy/class/accountingjournal.class.php index 91924f08592..168934ee5a5 100644 --- a/htdocs/accountancy/class/accountingjournal.class.php +++ b/htdocs/accountancy/class/accountingjournal.class.php @@ -48,45 +48,60 @@ class AccountingJournal extends CommonObject } /** - * Load an object from database - * - * @param int $id Id of record to load - * @return int <0 if KO, >0 if OK - */ - function fetch($id) + * Load an object from database + * + * @param int $rowid Id of record to load + * @param string $journal_code Journal code + * @return int <0 if KO, Id of record if OK and found + */ + function fetch($rowid = null, $journal_code = null) { - $sql = "SELECT rowid, code, label, nature, active"; - $sql.= " FROM ".MAIN_DB_PREFIX."accounting_journal"; - $sql.= " WHERE rowid = ".$id; - - dol_syslog(get_class($this)."::fetch sql=" . $sql, LOG_DEBUG); - $result = $this->db->query($sql); - if ( $result ) + if ($rowid || $journal_code) { - $obj = $this->db->fetch_object($result); + $sql = "SELECT rowid, code, label, nature, active"; + $sql.= " FROM ".MAIN_DB_PREFIX."accounting_journal"; + $sql .= " WHERE"; + if ($rowid) { + $sql .= " rowid = '" . $rowid . "'"; + } elseif ($journal_code) { + $sql .= " code = '" . $journal_code . "'"; + } - $this->id = $obj->rowid; + dol_syslog(get_class($this)."::fetch sql=" . $sql, LOG_DEBUG); + $result = $this->db->query($sql); + if ($result) + { + $obj = $this->db->fetch_object($result); - $this->code = $obj->code; - $this->ref = $obj->code; - $this->label = $obj->label; - $this->nature = $obj->nature; - $this->active = $obj->active; + if ($obj) { + $this->id = $obj->rowid; + $this->rowid = $obj->rowid; - return 1; - } - else - { - $this->error=$this->db->lasterror(); - return -1; + $this->code = $obj->code; + $this->ref = $obj->code; + $this->label = $obj->label; + $this->nature = $obj->nature; + $this->active = $obj->active; + + return $this->id; + } else { + return 0; + } + } + else + { + $this->error = "Error " . $this->db->lasterror(); + $this->errors[] = "Error " . $this->db->lasterror(); + } } + return -1; } /** * Return clicable name (with picto eventually) * * @param int $withpicto 0=No picto, 1=Include picto into link, 2=Only picto - * @param int $withlabel 0=No label, 1=Include label of account + * @param int $withlabel 0=No label, 1=Include label of journal * @param int $nourl 1=Disable url * @param string $moretitle Add more text to title tooltip * @param int $notooltip 1=Disable tooltip @@ -100,7 +115,7 @@ class AccountingJournal extends CommonObject $result = ''; - $url = DOL_URL_ROOT . '/accountancy/admin/journals_list.php'; + $url = DOL_URL_ROOT . '/accountancy/admin/journals_list.php?id=35'; $picto = 'billr'; $label=''; diff --git a/htdocs/core/class/html.formaccounting.class.php b/htdocs/core/class/html.formaccounting.class.php index 1a33f0fce60..a87b566d0d6 100644 --- a/htdocs/core/class/html.formaccounting.class.php +++ b/htdocs/core/class/html.formaccounting.class.php @@ -51,12 +51,14 @@ class FormAccounting extends Form * @param int $nature Limit the list to a particular type of journals (1:various operations / 2:sale / 3:purchase / 4:bank / 9: has-new) * @param int $showempty Add an empty field * @param array $event Event options + * @param int $select_in 0=selectid value is the journal rowid (default) or 1=selectid is journal code + * @param int $select_out Set value returned by select. 0=rowid (default), 1=code * @param string $morecss More css non HTML object * @param string $usecache Key to use to store result into a cache. Next call with same key will reuse the cache. * * @return string String with HTML select */ - function select_journal($selectid, $htmlname = 'journal', $nature=0, $showempty = 0, $event = array(), $morecss='maxwidth300 maxwidthonsmartphone', $usecache='') + function select_journal($selectid, $htmlname = 'journal', $nature=0, $showempty = 0, $event = array(), $select_in = 0, $select_out = 0, $morecss='maxwidth300 maxwidthonsmartphone', $usecache='') { global $conf; @@ -88,11 +90,27 @@ class FormAccounting extends Form $out = ajax_combobox($htmlname, $event); + $selected = 0; while ($obj = $this->db->fetch_object($resql)) { $label = $obj->code . ' - ' . $obj->label; + + $select_value_in = $obj->rowid; $select_value_out = $obj->rowid; + // Try to guess if we have found default value + if ($select_in == 1) { + $select_value_in = $obj->code; + } + if ($select_out == 1) { + $select_value_out = $obj->code; + } + // Remember guy's we store in database llx_accounting_bookkeeping the code of accounting_journal and not the rowid + if ($selectid != '' && $selectid == $select_value_in) { + //var_dump("Found ".$selectid." ".$select_value_in); + $selected = $select_value_out; + } + $options[$select_value_out] = $label; } $this->db->free($resql); @@ -103,7 +121,7 @@ class FormAccounting extends Form } } - $out .= Form::selectarray($htmlname, $options, $selectid, $showempty, 0, 0, '', 0, 0, 0, '', $morecss, 1); + $out .= Form::selectarray($htmlname, $options, $select, $showempty, 0, 0, '', 0, 0, 0, '', $morecss, 1); return $out; } From b05d2c50e8b236036ba1e944ec72b92cc33603c9 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Mon, 8 May 2017 06:52:30 +0200 Subject: [PATCH 025/299] Add mode live --- htdocs/langs/en_US/stripe.lang | 3 ++- htdocs/public/stripe/config.php | 20 ++++++++++++++++---- htdocs/stripe/admin/stripe.php | 33 +++++++++++++++++++++++++++++---- 3 files changed, 47 insertions(+), 9 deletions(-) diff --git a/htdocs/langs/en_US/stripe.lang b/htdocs/langs/en_US/stripe.lang index f19b4e44a52..3f85dc2d544 100644 --- a/htdocs/langs/en_US/stripe.lang +++ b/htdocs/langs/en_US/stripe.lang @@ -37,4 +37,5 @@ NewStripePaymentFailed=New Stripe payment tried but failed STRIPE_TEST_SECRET_KEY=Secret test key STRIPE_TEST_PUBLISHABLE_KEY=Publishable test key STRIPE_LIVE_SECRET_KEY=Secret live key -STRIPE_LIVE_PUBLISHABLE_KEY=Publishable live key \ No newline at end of file +STRIPE_LIVE_PUBLISHABLE_KEY=Publishable live key +StripeLiveEnabled=Stripe live enabled \ No newline at end of file diff --git a/htdocs/public/stripe/config.php b/htdocs/public/stripe/config.php index b94617b4c69..dfd0ea6aa1a 100644 --- a/htdocs/public/stripe/config.php +++ b/htdocs/public/stripe/config.php @@ -29,9 +29,21 @@ require_once DOL_DOCUMENT_ROOT.'/stripe/lib/stripe.lib.php'; require_once DOL_DOCUMENT_ROOT.'/includes/stripe/init.php'; //use \includes\stripe as stripe; -$stripe = array( - "secret_key" => $conf->global->STRIPE_TEST_SECRET_KEY, - "publishable_key" => $conf->global->STRIPE_TEST_PUBLISHABLE_KEY -); +$stripe = array(); + +if(empty($conf->global->SKYPE_LIVE)) +{ + $stripe = array( + "secret_key" => $conf->global->STRIPE_TEST_SECRET_KEY, + "publishable_key" => $conf->global->STRIPE_TEST_PUBLISHABLE_KEY + ); +} +else +{ + $stripe = array( + "secret_key" => $conf->global->STRIPE_LIVE_SECRET_KEY, + "publishable_key" => $conf->global->STRIPE_LIVE_PUBLISHABLE_KEY + ); +} \includes\stripe::setApiKey($stripe['secret_key']); \ No newline at end of file diff --git a/htdocs/stripe/admin/stripe.php b/htdocs/stripe/admin/stripe.php index 1882d1065b0..6274197a301 100644 --- a/htdocs/stripe/admin/stripe.php +++ b/htdocs/stripe/admin/stripe.php @@ -1,5 +1,6 @@ + * Copyright (C) 2017 Olivier Geffroy * Copyright (C) 2017 Saasprov * * This program is free software; you can redistribute it and/or modify @@ -45,7 +46,7 @@ if ($action == 'setvalue' && $user->admin) { $db->begin(); - $result=dolibarr_set_const($db, "STRIPE_TEST",GETPOST('STRIPE_TEST','alpha'),'chaine',0,'',$conf->entity); + $result=dolibarr_set_const($db, "STRIPE_LIVE",GETPOST('STRIPE_LIVE','alpha'),'chaine',0,'',$conf->entity); if (! $result > 0) $error++; $result=dolibarr_set_const($db, "STRIPE_TEST_SECRET_KEY",GETPOST('STRIPE_TEST_SECRET_KEY','alpha'),'chaine',0,'',$conf->entity); if (! $result > 0) $error++; @@ -76,6 +77,20 @@ if ($action == 'setvalue' && $user->admin) } } +if ($action=="setlive") +{ + $liveenable = GETPOST('value','int'); + $res = dolibarr_set_const($db, "STRIPE_LIVE", $liveenable,'yesno',0,'',$conf->entity); + if (! $res > 0) $error++; + if (! $error) + { + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); + } + else + { + setEventMessages($langs->trans("Error"), null, 'errors'); + } +} /* * View @@ -119,9 +134,19 @@ print ''.$langs->trans("Value").'
'; -print $langs->trans("STRIPE_TEST").''; -print $form->selectyesno("STRIPE_TEST",$conf->global->STRIPE_TEST,1); +print '
'; +print $langs->trans("StripeLiveEnabled").''; +if (!empty($conf->global->STRIPE_LIVE)) +{ + print ''; + print img_picto($langs->trans("Activated"),'switch_on'); +} +else +{ + print ''; + print img_picto($langs->trans("Disabled"),'switch_off'); +} print '
'; - - // Ref - print ''; - print ''; - print ''; + dol_banner_tab($object,'id','',$user->rights->user->user->lire || $user->admin); + + print '
'; + print '
'; + + print '
'.$langs->trans("Ref").''; - print $form->showrefnav($object,'id','',$user->rights->user->user->lire || $user->admin); - print '
'; // Name - print ''; + print ''; print '
'.$langs->trans("Name").'
'.$langs->trans("Name").''.$object->name; if (empty($object->entity)) { @@ -357,7 +355,8 @@ else } print "
\n"; - + print '
'; + dol_fiche_end(); @@ -377,11 +376,8 @@ else } print "
\n"; - print "
\n"; - /* - * Liste des utilisateurs dans le groupe - */ + // List users in group print load_fiche_titre($langs->trans("ListOfUsersInGroup"),'',''); @@ -450,8 +446,6 @@ else if (! empty($object->members)) { - $var=True; - foreach($object->members as $useringroup) { @@ -513,17 +507,11 @@ else $genallowed = $user->rights->user->user->creer; $delallowed = $user->rights->user->user->supprimer; - $var = true; - $somethingshown = $formfile->show_documents('usergroup', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', 0, '', $soc->default_lang); - // Linked object block - $somethingshown = $form->showLinkedObjectBlock($object); - - // Show links to link elements - $linktoelem = $form->showLinkToObjectBlock($object); - if ($linktoelem) print '
'.$linktoelem; - + // Show links to link elements + $linktoelem = $form->showLinkToObjectBlock($object, null, null); + $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem); print '
'; diff --git a/htdocs/user/group/ldap.php b/htdocs/user/group/ldap.php index bf39a128137..2ced8e11d4b 100644 --- a/htdocs/user/group/ldap.php +++ b/htdocs/user/group/ldap.php @@ -45,9 +45,9 @@ $action = GETPOST('action', 'alpha'); $socid=0; if ($user->societe_id > 0) $socid = $user->societe_id; -$fgroup = new Usergroup($db); -$fgroup->fetch($id); -$fgroup->getrights(); +$object = new Usergroup($db); +$object->fetch($id); +$object->getrights(); /* @@ -61,12 +61,12 @@ if ($action == 'dolibarr2ldap') $ldap=new Ldap(); $result=$ldap->connect_bind(); - $info=$fgroup->_load_ldap_info(); + $info=$object->_load_ldap_info(); // Get a gid number for objectclass PosixGroup if(in_array('posixGroup',$info['objectclass'])) $info['gidNumber'] = $ldap->getNextGroupGid(); - $dn=$fgroup->_load_ldap_dn($info); + $dn=$object->_load_ldap_dn($info); $olddn=$dn; // We can say that old dn = dn as we force synchro $result=$ldap->update($dn,$info,$user,$olddn); @@ -93,23 +93,21 @@ llxHeader(); $form = new Form($db); -$head = group_prepare_head($fgroup); +$head = group_prepare_head($object); -dol_fiche_head($head, 'ldap', $langs->trans("Group"), 0, 'group'); +dol_fiche_head($head, 'ldap', $langs->trans("Group"), -1, 'group'); + +dol_banner_tab($object,'id','',$user->rights->user->user->lire || $user->admin); + +print '
'; +print '
'; print ''; -// Ref -print ''; -print ''; -print ''; - // Name -print ''; -print ''; +print '\n"; // Note print ''; -print ''; +print ''; print "\n"; $langs->load("admin"); @@ -137,6 +135,9 @@ print "
'.$langs->trans("Ref").''; -print $form->showrefnav($fgroup,'id','',$canreadperms); -print '
'.$langs->trans("Name").''.$fgroup->name; -if (!$fgroup->entity) +print '
'.$langs->trans("Name").''.$object->name; +if (!$object->entity) { print img_picto($langs->trans("GlobalGroup"),'redstar'); } @@ -117,7 +115,7 @@ print "
'.$langs->trans("Note").''.nl2br($fgroup->note).' '.nl2br($object->note).' 
\n"; print '
'; +dol_fiche_end(); + + /* * Barre d'actions */ @@ -145,7 +146,7 @@ print '
'; if ($conf->global->LDAP_SYNCHRO_ACTIVE == 'dolibarr2ldap') { - print ''.$langs->trans("ForceSynchronize").''; + print ''.$langs->trans("ForceSynchronize").''; } print "
\n"; @@ -169,9 +170,9 @@ $ldap=new Ldap(); $result=$ldap->connect_bind(); if ($result > 0) { - $info=$fgroup->_load_ldap_info(); - $dn=$fgroup->_load_ldap_dn($info,1); - $search = "(".$fgroup->_load_ldap_dn($info,2).")"; + $info=$object->_load_ldap_info(); + $dn=$object->_load_ldap_dn($info,1); + $search = "(".$object->_load_ldap_dn($info,2).")"; $records = $ldap->getAttribute($dn,$search); //var_dump($records); diff --git a/htdocs/user/group/perms.php b/htdocs/user/group/perms.php index 50b1bc56c5e..5262857afb2 100644 --- a/htdocs/user/group/perms.php +++ b/htdocs/user/group/perms.php @@ -82,16 +82,16 @@ llxHeader('',$langs->trans("Permissions")); if ($id) { - $fgroup = new Usergroup($db); - $fgroup->fetch($id); - $fgroup->getrights(); + $object = new Usergroup($db); + $object->fetch($id); + $object->getrights(); /* * Affichage onglets */ - $head = group_prepare_head($fgroup); + $head = group_prepare_head($object); $title = $langs->trans("Group"); - dol_fiche_head($head, 'rights', $title, 0, 'group'); + dol_fiche_head($head, 'rights', $title, -1, 'group'); // Charge les modules soumis a permissions $modules = array(); @@ -127,7 +127,7 @@ if ($id) // Load all permissions if ($objMod->rights_class) { - $entity=((! empty($conf->multicompany->enabled) && ! empty($fgroup->entity)) ? $fgroup->entity : null); + $entity=((! empty($conf->multicompany->enabled) && ! empty($object->entity)) ? $object->entity : null); $ret=$objMod->insert_permissions(0, $entity); $modules[$objMod->rights_class]=$objMod; } @@ -150,7 +150,7 @@ if ($id) { if (empty($conf->multicompany->transverse_mode)) { - $sql.= " AND r.entity = ".$fgroup->entity; + $sql.= " AND r.entity = ".$object->entity; } else { @@ -162,7 +162,7 @@ if ($id) $sql.= " AND r.entity IN (0,".$conf->entity.")"; } - $sql.= " AND ugr.fk_usergroup = ".$fgroup->id; + $sql.= " AND ugr.fk_usergroup = ".$object->id; $result=$db->query($sql); @@ -183,32 +183,31 @@ if ($id) dol_print_error($db); } - + + + dol_banner_tab($object,'id','',$user->rights->user->user->lire || $user->admin); + + print '
'; + print '
'; + /* * Ecran ajout/suppression permission */ print ''; - // Ref - print ''; - print ''; - print ''; - // Nom - print ''; - print ''; + print '\n"; // Note - print ''; - print ''; + print ''; + print ''; print "\n"; print '
'.$langs->trans("Ref").''; - print $form->showrefnav($fgroup,'id','',$user->rights->user->user->lire || $user->admin); - print '
'.$langs->trans("Name").''.$fgroup->name.''; - if (! $fgroup->entity) + print '
'.$langs->trans("Name").''.$object->name.''; + if (! $object->entity) { print img_picto($langs->trans("GlobalGroup"),'redstar'); } print "
'.$langs->trans("Note").''.dol_htmlentitiesbr($fgroup->note).'
'.$langs->trans("Description").''.dol_htmlentitiesbr($object->note).'

'; @@ -230,7 +229,7 @@ if ($id) { if (empty($conf->multicompany->transverse_mode)) { - $sql.= " AND r.entity = ".$fgroup->entity; + $sql.= " AND r.entity = ".$object->entity; } else { @@ -280,9 +279,9 @@ if ($id) print ''.img_object('',$picto).' '.$objMod->getName(); print ' '; print ''; - print ''.$langs->trans("All").""; + print ''.$langs->trans("All").""; print '/'; - print ''.$langs->trans("None").""; + print ''.$langs->trans("None").""; print ''; print ' '; print ''; @@ -299,7 +298,7 @@ if ($id) // Own permission by group if ($caneditperms) { - print ''.img_edit_remove($langs->trans("Remove")).''; + print ''.img_edit_remove($langs->trans("Remove")).''; } print ''; print img_picto($langs->trans("Active"),'tick'); @@ -310,7 +309,7 @@ if ($id) // Do not own permission if ($caneditperms) { - print ''.img_edit_add($langs->trans("Add")).''; + print ''.img_edit_add($langs->trans("Add")).''; } print ' '; } @@ -324,6 +323,10 @@ if ($id) } } print ''; + + print '
'; + + dol_fiche_end(); } llxFooter(); From cf04e5a6e0c7bb501d31f970e81bfa88ae357162 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 9 May 2017 10:45:49 +0200 Subject: [PATCH 030/299] Fix duplicate id --- htdocs/core/modules/modCollab.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/modCollab.class.php b/htdocs/core/modules/modCollab.class.php index 490caeccea2..506eb99b540 100644 --- a/htdocs/core/modules/modCollab.class.php +++ b/htdocs/core/modules/modCollab.class.php @@ -46,7 +46,7 @@ class modCollab extends DolibarrModules // Family can be 'crm','financial','hr','projects','products','ecm','technic','other' // It is used to group modules in module setup page $this->family = "portal"; - $this->module_position = 50; + $this->module_position = 51; // Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module) $this->name = preg_replace('/^mod/i','',get_class($this)); $this->description = "Enable the public collaboration features, like shared pad, shared online sheets, etc..."; @@ -87,7 +87,7 @@ class modCollab extends DolibarrModules // Permissions $this->rights = array(); // Permission array used by this module - $this->rights_class = 'websites'; + $this->rights_class = 'collab'; $r=0; /*$this->rights[$r][0] = 30001; From 081d0e7ec25a17f89d60cf95504833bb75fafa3b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 9 May 2017 11:09:21 +0200 Subject: [PATCH 031/299] Debug module RH. Edition of user bank account is ok. --- htdocs/core/lib/usergroups.lib.php | 2 +- htdocs/user/bank.php | 41 +++++++++++++-------- htdocs/user/class/userbankaccount.class.php | 10 +++-- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php index 3b3cde1d66a..d983f799c0d 100644 --- a/htdocs/core/lib/usergroups.lib.php +++ b/htdocs/core/lib/usergroups.lib.php @@ -145,7 +145,7 @@ function user_prepare_head($object) { // Bank $head[$h][0] = DOL_URL_ROOT.'/user/bank.php?id='.$object->id; - $head[$h][1] = $langs->trans("Bank"); + $head[$h][1] = $langs->trans("BankAccounts"); $head[$h][2] = 'bank'; $h++; } diff --git a/htdocs/user/bank.php b/htdocs/user/bank.php index 9f36bc91e31..c86ca27bf34 100644 --- a/htdocs/user/bank.php +++ b/htdocs/user/bank.php @@ -38,7 +38,9 @@ $langs->load("banks"); $langs->load("bills"); $id = GETPOST('id','int'); -$action = GETPOST("action"); +$bankid = GETPOST('bankid','int'); +$action = GETPOST("action",'alpha'); +$cancel = GETPOST('cancel','alpha'); // Security check $socid=0; @@ -54,16 +56,17 @@ if ($id > 0 || ! empty($ref)) $object->getrights(); } + /* * Actions */ -if ($action == 'update' && ! $_POST["cancel"]) +if ($action == 'update' && ! $cancel) { // Modification $account = new UserBankAccount($db); - $account->fetch($id); + $account->fetch($bankid); $account->userid = $object->id; @@ -82,54 +85,62 @@ if ($action == 'update' && ! $_POST["cancel"]) $account->owner_address = $_POST["owner_address"]; $result = $account->update($user); - if (! $result) + + if (! $result) { setEventMessages($account->error, $account->errors, 'errors'); - $_GET["action"]='edit'; // Force chargement page edition + $action='edit'; // Force chargement page edition } else { - $url=DOL_URL_ROOT.'/user/bank.php?id='.$object->id; + $url=DOL_URL_ROOT.'/user/bank.php?id='.$object->id.'&bankid='.$bankid; header('Location: '.$url); exit; } } + /* * View */ $form = new Form($db); -llxHeader(); +llxHeader(null, $langs->trans("BankAccounts")); $head = user_prepare_head($object); $account = new UserBankAccount($db); -if (! $id) - $account->fetch(0,$object->id); +if (! $bankid) +{ + $account->fetch(0, '', $id); +} else - $account->fetch($id); +{ + $account->fetch($bankid); +} if (empty($account->userid)) $account->userid=$object->id; -if ($id && $action == 'edit' && $user->rights->user->user->creer) +if ($bankid && $action == 'edit' && $user->rights->user->user->creer) { print '
'; print ''; print ''; print ''; + print ''; } -if ($id && $action == 'create' && $user->rights->user->user->creer) +if ($bankid && $action == 'create' && $user->rights->user->user->creer) { print ''; print ''; print ''; + print ''; } // View -if ($id && $action != 'edit') +if ($account->id && $action != 'edit') { $title = $langs->trans("User"); dol_fiche_head($head, 'bank', $title, -1, 'user'); @@ -223,7 +234,7 @@ if ($id && $action != 'edit') if ($user->rights->user->user->creer) { - print ''.$langs->trans("Edit").''; + print ''.$langs->trans("Edit").''; } print '
'; @@ -309,8 +320,6 @@ if ($id && $action == 'edit' && $user->rights->user->user->creer) print '
'; } -if ($id && $action == 'edit' && $user->rights->user->user->creer) print ''; - if ($id && $action == 'edit' && $user->rights->user->user->creer) print ''; llxFooter(); diff --git a/htdocs/user/class/userbankaccount.class.php b/htdocs/user/class/userbankaccount.class.php index 514e8d0b28c..a7aba35fc64 100644 --- a/htdocs/user/class/userbankaccount.class.php +++ b/htdocs/user/class/userbankaccount.class.php @@ -132,16 +132,20 @@ class UserBankAccount extends Account * Load record from database * * @param int $id Id of record + * @param string $ref Ref of record + * @param int $userid User id * @return int <0 if KO, >0 if OK */ - function fetch($id) + function fetch($id, $ref='', $userid=0) { - if (empty($id)) return -1; + if (empty($id) && empty($ref) && empty($userid)) return -1; $sql = "SELECT rowid, fk_user, entity, bank, number, code_banque, code_guichet, cle_rib, bic, iban_prefix as iban, domiciliation, proprio,"; $sql.= " owner_address, label, datec, tms as datem"; $sql.= " FROM ".MAIN_DB_PREFIX."user_rib"; - $sql.= " WHERE rowid = ".$id; + if ($id) $sql.= " WHERE rowid = ".$id; + if ($ref) $sql.= " WHERE label = '".$this->db->escape($ref)."'"; + if ($userid) $sql.= " WHERE fk_user = '".$userid."'"; $resql = $this->db->query($sql); if ($resql) From 2b7dcfa56df90332ae589123177fd8e663cb358b Mon Sep 17 00:00:00 2001 From: Laurent Dinclaux Date: Tue, 9 May 2017 21:07:32 +1100 Subject: [PATCH 032/299] Add missing vat_src_code field to predefined invoices table --- htdocs/install/mysql/migration/4.0.0-5.0.0.sql | 1 + htdocs/install/mysql/tables/llx_facturedet_rec.sql | 1 + 2 files changed, 2 insertions(+) diff --git a/htdocs/install/mysql/migration/4.0.0-5.0.0.sql b/htdocs/install/mysql/migration/4.0.0-5.0.0.sql index afda09aa785..8835f535d14 100644 --- a/htdocs/install/mysql/migration/4.0.0-5.0.0.sql +++ b/htdocs/install/mysql/migration/4.0.0-5.0.0.sql @@ -161,6 +161,7 @@ ALTER TABLE llx_c_payment_term change fdm type_cdr tinyint; ALTER TABLE llx_facturedet ADD COLUMN vat_src_code varchar(10) DEFAULT '' AFTER tva_tx; +ALTER TABLE llx_facturedet_rec ADD COLUMN vat_src_code varchar(10) DEFAULT '' AFTER tva_tx; ALTER TABLE llx_facture_fourn_det ADD COLUMN vat_src_code varchar(10) DEFAULT '' AFTER tva_tx; ALTER TABLE llx_commandedet ADD COLUMN vat_src_code varchar(10) DEFAULT '' AFTER tva_tx; ALTER TABLE llx_commande_fournisseurdet ADD COLUMN vat_src_code varchar(10) DEFAULT '' AFTER tva_tx; diff --git a/htdocs/install/mysql/tables/llx_facturedet_rec.sql b/htdocs/install/mysql/tables/llx_facturedet_rec.sql index cea176b2aa8..8b2c70b09f7 100644 --- a/htdocs/install/mysql/tables/llx_facturedet_rec.sql +++ b/htdocs/install/mysql/tables/llx_facturedet_rec.sql @@ -29,6 +29,7 @@ create table llx_facturedet_rec product_type integer DEFAULT 0, label varchar(255) DEFAULT NULL, description text, + vat_src_code varchar(10) DEFAULT '', -- Vat code used as source of vat fields. Not strict foreign key here. tva_tx double(6,3), -- taux tva localtax1_tx double(6,3) DEFAULT 0, -- localtax1 rate localtax1_type varchar(10) NULL, -- localtax1 type From dbcb60433b5ca60bdb7d50d1a61fcf899edda716 Mon Sep 17 00:00:00 2001 From: Ferran Marcet Date: Tue, 9 May 2017 13:31:20 +0200 Subject: [PATCH 033/299] FIX: Correction with author and validator user on orders --- htdocs/commande/class/commande.class.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 7c4176edac8..0ee6c49a485 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -9,7 +9,7 @@ * Copyright (C) 2012 Cedric Salvador * Copyright (C) 2013 Florian Henry * Copyright (C) 2014-2015 Marcos García - * Copyright (C) 2016 Ferran Marcet + * Copyright (C) 2016-2017 Ferran Marcet * * 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 @@ -134,6 +134,7 @@ class Commande extends CommonOrder var $linked_objects=array(); var $user_author_id; + var $user_valid; /** * @var OrderLine[] @@ -1460,7 +1461,7 @@ class Commande extends CommonOrder // Check parameters if (empty($id) && empty($ref) && empty($ref_ext) && empty($ref_int)) return -1; - $sql = 'SELECT c.rowid, c.date_creation, c.ref, c.fk_soc, c.fk_user_author, c.fk_statut'; + $sql = 'SELECT c.rowid, c.date_creation, c.ref, c.fk_soc, c.fk_user_author, c.fk_user_valid, c.fk_statut'; $sql.= ', c.amount_ht, c.total_ht, c.total_ttc, c.tva as total_tva, c.localtax1 as total_localtax1, c.localtax2 as total_localtax2, c.fk_cond_reglement, c.fk_mode_reglement, c.fk_availability, c.fk_input_reason'; $sql.= ', c.fk_account'; $sql.= ', c.date_commande'; @@ -1502,6 +1503,7 @@ class Commande extends CommonOrder $this->socid = $obj->fk_soc; $this->statut = $obj->fk_statut; $this->user_author_id = $obj->fk_user_author; + $this->user_valid = $obj->fk_user_valid; $this->total_ht = $obj->total_ht; $this->total_tva = $obj->total_tva; $this->total_localtax1 = $obj->total_localtax1; @@ -2692,8 +2694,8 @@ class Commande extends CommonOrder $sql.= " total_ht=".(isset($this->total_ht)?$this->total_ht:"null").","; $sql.= " total_ttc=".(isset($this->total_ttc)?$this->total_ttc:"null").","; $sql.= " fk_statut=".(isset($this->statut)?$this->statut:"null").","; - $sql.= " fk_user_author=".(isset($this->user_author)?$this->user_author:"null").","; - $sql.= " fk_user_valid=".(isset($this->fk_user_valid)?$this->fk_user_valid:"null").","; + $sql.= " fk_user_author=".(isset($this->user_author_id)?$this->user_author_id:"null").","; + $sql.= " fk_user_valid=".(isset($this->user_valid)?$this->user_valid:"null").","; $sql.= " fk_projet=".(isset($this->fk_project)?$this->fk_project:"null").","; $sql.= " fk_cond_reglement=".(isset($this->cond_reglement_id)?$this->cond_reglement_id:"null").","; $sql.= " fk_mode_reglement=".(isset($this->mode_reglement_id)?$this->mode_reglement_id:"null").","; From 6cac627117974495ebc0687a6dce55ee2a87fe4d Mon Sep 17 00:00:00 2001 From: Laurent Dinclaux Date: Tue, 9 May 2017 23:19:16 +1100 Subject: [PATCH 034/299] Add support for localtaxes to predefined invoices --- .../facture/class/facture-rec.class.php | 94 ++++++++++++++++--- htdocs/compta/facture/fiche-rec.php | 20 +++- htdocs/filefunc.inc.php | 2 +- 3 files changed, 98 insertions(+), 18 deletions(-) diff --git a/htdocs/compta/facture/class/facture-rec.class.php b/htdocs/compta/facture/class/facture-rec.class.php index 41c1171ccef..390e9999454 100644 --- a/htdocs/compta/facture/class/facture-rec.class.php +++ b/htdocs/compta/facture/class/facture-rec.class.php @@ -169,11 +169,16 @@ class FactureRec extends CommonInvoice $num=count($facsrc->lines); for ($i = 0; $i < $num; $i++) { - $result_insert = $this->addline( + $tva_tx = $facsrc->lines[$i]->tva_tx; + if (! empty($facsrc->lines[$i]->vat_src_code) && ! preg_match('/\(/', $tva_tx)) $tva_tx .= ' ('.$facsrc->lines[$i]->vat_src_code.')'; + + $result_insert = $this->addline( $facsrc->lines[$i]->desc, $facsrc->lines[$i]->subprice, $facsrc->lines[$i]->qty, - $facsrc->lines[$i]->tva_tx, + $tva_tx, + $facsrc->lines[$i]->localtax1_tx, + $facsrc->lines[$i]->localtax2_tx, $facsrc->lines[$i]->fk_product, $facsrc->lines[$i]->remise_percent, 'HT', @@ -243,7 +248,8 @@ class FactureRec extends CommonInvoice */ function fetch($rowid, $ref='', $ref_ext='', $ref_int='') { - $sql = 'SELECT f.rowid, f.entity, f.titre, f.fk_soc, f.amount, f.tva, f.total, f.total_ttc, f.remise_percent, f.remise_absolue, f.remise'; + $sql = 'SELECT f.rowid, f.entity, f.titre, f.fk_soc, f.amount, f.tva, f.localtax1, f.localtax2, f.total, f.total_ttc'; + $sql.= ', f.remise_percent, f.remise_absolue, f.remise'; $sql.= ', f.date_lim_reglement as dlr'; $sql.= ', f.note_private, f.note_public, f.fk_user_author'; $sql.= ', f.fk_mode_reglement, f.fk_cond_reglement, f.fk_projet'; @@ -284,6 +290,8 @@ class FactureRec extends CommonInvoice $this->remise = $obj->remise; $this->total_ht = $obj->total; $this->total_tva = $obj->tva; + $this->total_localtax1 = $obj->localtax1; + $this->total_localtax2 = $obj->localtax2; $this->total_ttc = $obj->total_ttc; $this->paye = $obj->paye; $this->close_code = $obj->close_code; @@ -364,8 +372,8 @@ class FactureRec extends CommonInvoice { $this->lines=array(); - $sql = 'SELECT l.rowid, l.fk_product, l.product_type, l.label as custom_label, l.description, l.product_type, l.price, l.qty, l.tva_tx, '; - $sql.= ' l.remise, l.remise_percent, l.subprice,'; + $sql = 'SELECT l.rowid, l.fk_product, l.product_type, l.label as custom_label, l.description, l.product_type, l.price, l.qty, l.vat_src_code, l.tva_tx, '; + $sql.= ' l.localtax1_tx, l.localtax2_tx, l.localtax1_type, l.localtax2_type, l.remise, l.remise_percent, l.subprice,'; $sql.= ' l.info_bits, l.total_ht, l.total_tva, l.total_ttc,'; //$sql.= ' l.situation_percent, l.fk_prev_id,'; //$sql.= ' l.localtax1_tx, l.localtax2_tx, l.localtax1_type, l.localtax2_type, l.remise_percent, l.fk_remise_except, l.subprice,'; @@ -404,7 +412,13 @@ class FactureRec extends CommonInvoice $line->fk_product_type = $objp->fk_product_type; // Type of product $line->qty = $objp->qty; $line->subprice = $objp->subprice; + + $line->vat_src_code = $objp->vat_src_code; $line->tva_tx = $objp->tva_tx; + $line->localtax1_tx = $objp->localtax1_tx; + $line->localtax2_tx = $objp->localtax2_tx; + $line->localtax1_type = $objp->localtax1_type; + $line->localtax2_type = $objp->localtax2_type; $line->remise_percent = $objp->remise_percent; $line->fk_remise_except = $objp->fk_remise_except; $line->fk_product = $objp->fk_product; @@ -506,29 +520,40 @@ class FactureRec extends CommonInvoice * @param string $fk_unit Unit * @return int <0 if KO, Id of line if OK */ - function addline($desc, $pu_ht, $qty, $txtva, $fk_product=0, $remise_percent=0, $price_base_type='HT', $info_bits=0, $fk_remise_except='', $pu_ttc=0, $type=0, $rang=-1, $special_code=0, $label='', $fk_unit=null) + function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $price_base_type='HT', $info_bits=0, $fk_remise_except='', $pu_ttc=0, $type=0, $rang=-1, $special_code=0, $label='', $fk_unit=null) { global $mysoc; $facid=$this->id; - dol_syslog(get_class($this)."::addline facid=$facid,desc=$desc,pu_ht=$pu_ht,qty=$qty,txtva=$txtva,fk_product=$fk_product,remise_percent=$remise_percent,info_bits=$info_bits,fk_remise_except=$fk_remise_except,price_base_type=$price_base_type,pu_ttc=$pu_ttc,type=$type,fk_unit=$fk_unit", LOG_DEBUG); + dol_syslog(get_class($this)."::addline facid=$facid,desc=$desc,pu_ht=$pu_ht,qty=$qty,txtva=$txtva,txlocaltax1=$txlocaltax1,txlocaltax2=$txlocaltax2,fk_product=$fk_product,remise_percent=$remise_percent,info_bits=$info_bits,fk_remise_except=$fk_remise_except,price_base_type=$price_base_type,pu_ttc=$pu_ttc,type=$type,fk_unit=$fk_unit", LOG_DEBUG); include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php'; // Check parameters if ($type < 0) return -1; + $localtaxes_type=getLocalTaxesFromRate($txtva, 0, $this->thirdparty, $mysoc); + + // Clean vat code + $vat_src_code=''; + if (preg_match('/\((.*)\)/', $txtva, $reg)) + { + $vat_src_code = $reg[1]; + $txtva = preg_replace('/\s*\(.*\)/', '', $txtva); // Remove code into vatrate. + } + if ($this->brouillon) { // Clean parameters $remise_percent=price2num($remise_percent); if (empty($remise_percent)) $remise_percent=0; $qty=price2num($qty); - if (! $qty) $qty=1; if (! $info_bits) $info_bits=0; $pu_ht=price2num($pu_ht); $pu_ttc=price2num($pu_ttc); $txtva=price2num($txtva); + $txlocaltax1 = price2num($txlocaltax1); + $txlocaltax2 = price2num($txlocaltax2); if ($price_base_type=='HT') { @@ -543,10 +568,14 @@ class FactureRec extends CommonInvoice // qty, pu, remise_percent et txtva // TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker // la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva. - $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, 0, 0, $price_base_type, $info_bits, $type, $mysoc); + + + $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $mysoc, $localtaxes_type); $total_ht = $tabprice[0]; $total_tva = $tabprice[1]; $total_ttc = $tabprice[2]; + $total_localtax1=$tabprice[9]; + $total_localtax2=$tabprice[10]; $product_type=$type; if ($fk_product) @@ -563,6 +592,11 @@ class FactureRec extends CommonInvoice $sql.= ", price"; $sql.= ", qty"; $sql.= ", tva_tx"; + $sql.= ", vat_src_code"; + $sql.= ", localtax1_tx"; + $sql.= ", localtax1_type"; + $sql.= ", localtax2_tx"; + $sql.= ", localtax2_type"; $sql.= ", fk_product"; $sql.= ", product_type"; $sql.= ", remise_percent"; @@ -570,6 +604,8 @@ class FactureRec extends CommonInvoice $sql.= ", remise"; $sql.= ", total_ht"; $sql.= ", total_tva"; + $sql.= ", total_localtax1"; + $sql.= ", total_localtax2"; $sql.= ", total_ttc"; $sql.= ", rang"; $sql.= ", special_code"; @@ -581,6 +617,11 @@ class FactureRec extends CommonInvoice $sql.= ", ".price2num($pu_ht); $sql.= ", ".price2num($qty); $sql.= ", ".price2num($txtva); + $sql.= ", '".$this->db->escape($vat_src_code)."'"; + $sql.= ", ".price2num($txlocaltax1); + $sql.= ", '".$this->db->escape($localtaxes_type[0])."'"; + $sql.= ", ".price2num($txlocaltax2); + $sql.= ", '".$this->db->escape($localtaxes_type[2])."'"; $sql.= ", ".(! empty($fk_product)?"'".$fk_product."'":"null"); $sql.= ", ".$product_type; $sql.= ", ".price2num($remise_percent); @@ -588,6 +629,8 @@ class FactureRec extends CommonInvoice $sql.= ", null"; $sql.= ", ".price2num($total_ht); $sql.= ", ".price2num($total_tva); + $sql.= ", ".price2num($total_localtax1); + $sql.= ", ".price2num($total_localtax2); $sql.= ", ".price2num($total_ttc); $sql.= ", ".$rang; $sql.= ", ".$special_code; @@ -629,28 +672,39 @@ class FactureRec extends CommonInvoice * @param string $fk_unit Unit * @return int <0 if KO, Id of line if OK */ - function updateline($rowid, $desc, $pu_ht, $qty, $txtva, $fk_product=0, $remise_percent=0, $price_base_type='HT', $info_bits=0, $fk_remise_except='', $pu_ttc=0, $type=0, $rang=-1, $special_code=0, $label='', $fk_unit=null) + function updateline($rowid, $desc, $pu_ht, $qty, $txtva, $txlocaltax1=0, $txlocaltax2=0, $fk_product=0, $remise_percent=0, $price_base_type='HT', $info_bits=0, $fk_remise_except='', $pu_ttc=0, $type=0, $rang=-1, $special_code=0, $label='', $fk_unit=null) { global $mysoc; $facid=$this->id; - dol_syslog(get_class($this)."::updateline facid=".$facid." rowid=$rowid,desc=$desc,pu_ht=$pu_ht,qty=$qty,txtva=$txtva,fk_product=$fk_product,remise_percent=$remise_percent,info_bits=$info_bits,fk_remise_except=$fk_remise_except,price_base_type=$price_base_type,pu_ttc=$pu_ttc,type=$type,fk_unit=$fk_unit", LOG_DEBUG); + dol_syslog(get_class($this)."::updateline facid=".$facid." rowid=$rowid,desc=$desc,pu_ht=$pu_ht,qty=$qty,txtva=$txtva,txlocaltax1=$txlocaltax1,txlocaltax2=$txlocaltax2,fk_product=$fk_product,remise_percent=$remise_percent,info_bits=$info_bits,fk_remise_except=$fk_remise_except,price_base_type=$price_base_type,pu_ttc=$pu_ttc,type=$type,fk_unit=$fk_unit", LOG_DEBUG); include_once DOL_DOCUMENT_ROOT.'/core/lib/price.lib.php'; // Check parameters if ($type < 0) return -1; - + + $localtaxes_type=getLocalTaxesFromRate($txtva, 0, $this->thirdparty, $mysoc); + + // Clean vat code + $vat_src_code=''; + if (preg_match('/\((.*)\)/', $txtva, $reg)) + { + $vat_src_code = $reg[1]; + $txtva = preg_replace('/\s*\(.*\)/', '', $txtva); // Remove code into vatrate. + } + if ($this->brouillon) { // Clean parameters $remise_percent=price2num($remise_percent); $qty=price2num($qty); - if (! $qty) $qty=1; if (! $info_bits) $info_bits=0; $pu_ht=price2num($pu_ht); $pu_ttc=price2num($pu_ttc); $txtva=price2num($txtva); + $txlocaltax1 = price2num($txlocaltax1); + $txlocaltax2 = price2num($txlocaltax2); if ($price_base_type=='HT') { @@ -665,10 +719,13 @@ class FactureRec extends CommonInvoice // qty, pu, remise_percent et txtva // TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker // la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva. - $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, 0, 0, 0, $price_base_type, $info_bits, $type, $mysoc); + $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $mysoc, $localtaxes_type); + $total_ht = $tabprice[0]; $total_tva = $tabprice[1]; $total_ttc = $tabprice[2]; + $total_localtax1=$tabprice[9]; + $total_localtax2=$tabprice[10]; $product_type=$type; if ($fk_product) @@ -685,18 +742,25 @@ class FactureRec extends CommonInvoice $sql.= ", price=".price2num($pu_ht); $sql.= ", qty=".price2num($qty); $sql.= ", tva_tx=".price2num($txtva); + $sql.= ", vat_src_code='".$this->db->escape($vat_src_code)."'"; + $sql.= ", localtax1_tx=".price2num($txlocaltax1); + $sql.= ", localtax1_type='".$this->db->escape($localtaxes_type[0])."'"; + $sql.= ", localtax2_tx=".price2num($txlocaltax2); + $sql.= ", localtax2_type='".$this->db->escape($localtaxes_type[2])."'"; $sql.= ", fk_product=".(! empty($fk_product)?"'".$fk_product."'":"null"); $sql.= ", product_type=".$product_type; $sql.= ", remise_percent='".price2num($remise_percent)."'"; $sql.= ", subprice='".price2num($pu_ht)."'"; $sql.= ", total_ht='".price2num($total_ht)."'"; $sql.= ", total_tva='".price2num($total_tva)."'"; + $sql.= ", total_localtax1='".price2num($total_localtax1)."'"; + $sql.= ", total_localtax2='".price2num($total_localtax2)."'"; $sql.= ", total_ttc='".price2num($total_ttc)."'"; $sql.= ", rang=".$rang; $sql.= ", special_code=".$special_code; $sql.= ", fk_unit=".($fk_unit?"'".$this->db->escape($fk_unit)."'":"null"); $sql.= " WHERE rowid = ".$rowid; - + dol_syslog(get_class($this)."::updateline", LOG_DEBUG); if ($this->db->query($sql)) { diff --git a/htdocs/compta/facture/fiche-rec.php b/htdocs/compta/facture/fiche-rec.php index 4adfc24b4dc..d04b4b9e8e6 100644 --- a/htdocs/compta/facture/fiche-rec.php +++ b/htdocs/compta/facture/fiche-rec.php @@ -612,7 +612,7 @@ if (empty($reshook)) else { // Insert line - $result = $object->addline($desc, $pu_ht, $qty, $tva_tx, $idprod, $remise_percent, $price_base_type, $info_bits, '', $pu_ttc, $type, - 1, $special_code, $label, $fk_unit); + $result = $object->addline($desc, $pu_ht, $qty, $tva_tx,$localtax1_tx, $localtax2_tx, $idprod, $remise_percent, $price_base_type, $info_bits, '', $pu_ttc, $type, - 1, $special_code, $label, $fk_unit); if ($result > 0) { @@ -784,7 +784,9 @@ if (empty($reshook)) $description, $pu_ht, $qty, - $vat_rate, + $vat_rate, + $localtax1_rate, + $localtax1_rate, GETPOST('productid'), GETPOST('remise_percent'), 'HT', @@ -1180,9 +1182,23 @@ else print ''.$langs->trans("AmountVAT").''.price($object->total_tva,'',$langs,1,-1,-1,$conf->currency).''; print ''; + + // Amount Local Taxes + if (($mysoc->localtax1_assuj == "1" && $mysoc->useLocalTax(1)) || $object->total_localtax1 != 0) // Localtax1 + { + print '' . $langs->transcountry("AmountLT1", $mysoc->country_code) . ''; + print '' . price($object->total_localtax1, 1, '', 1, - 1, - 1, $conf->currency) . ''; + } + if (($mysoc->localtax2_assuj == "1" && $mysoc->useLocalTax(2)) || $object->total_localtax2 != 0) // Localtax2 + { + print '' . $langs->transcountry("AmountLT2", $mysoc->country_code) . ''; + print '' . price($object->total_localtax2, 1, '', 1, - 1, - 1, $conf->currency) . ''; + } + print ''.$langs->trans("AmountTTC").''.price($object->total_ttc,'',$langs,1,-1,-1,$conf->currency).''; print ''; + // Payment term print ''; print ''; -// $TParam['list']['head_search'].='
'.$label.' '.$fsearch.'
'; - } } $search_button = ' '.img_search().''; - - if(!empty($TParam['list']['head_search'])) - { - $TParam['list']['head_search']='
'.$search_button.'
'.$TParam['list']['head_search']; - } + $search_button .= ' '.img_searchclear().''; if($nb_search_in_bar>0) { @@ -603,7 +577,7 @@ class Listview */ private function renderList(&$THeader, &$TField, &$TTotal, &$TTotalGroup, &$TParam) { - global $bc; + global $bc,$form; $TSearch = $this->setSearch($THeader, $TParam); $TExport = $this->setExport($TParam, $TField, $THeader); @@ -611,13 +585,24 @@ class Listview //$out = $this->getJS(); + $massactionbutton= empty($TParam['list']['massactions']) ? '' : $form->selectMassAction('', $TParam['list']['massactions']); + $dolibarr_decalage = $this->totalRow > $this->totalRowToShow ? 1 : 0; ob_start(); - print_barre_liste($TParam['list']['title'], $TParam['limit']['page']-1, $_SERVER["PHP_SELF"], '&'.$TParam['list']['param_url'], $TParam['sortfield'], $TParam['sortorder'], '', $this->totalRowToShow+$dolibarr_decalage, $this->totalRow, $TParam['list']['image'], 0, '', '', $TParam['limit']['nbLine']); + print_barre_liste($TParam['list']['title'], $TParam['limit']['page'], $_SERVER["PHP_SELF"], '&'.$TParam['list']['param_url'], $TParam['sortfield'], $TParam['sortorder'], $massactionbutton, $this->totalRowToShow+$dolibarr_decalage, $this->totalRow, $TParam['list']['image'], 0, '', '', $TParam['limit']['nbLine']); $out .= ob_get_clean(); + $classliste='liste'; + if(!empty($TParam['head_search'])) { + $out.='
'; + $out.=$TParam['head_search']; + $out.='
'; + + $classliste.=' listwithfilterbefore'; + } - $out.= '
'; diff --git a/htdocs/filefunc.inc.php b/htdocs/filefunc.inc.php index 427f428d652..b3d7fca0726 100644 --- a/htdocs/filefunc.inc.php +++ b/htdocs/filefunc.inc.php @@ -31,7 +31,7 @@ */ if (! defined('DOL_APPLICATION_TITLE')) define('DOL_APPLICATION_TITLE','Dolibarr'); -if (! defined('DOL_VERSION')) define('DOL_VERSION','5.0.2'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c +if (! defined('DOL_VERSION')) define('DOL_VERSION','5.0.3'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c if (! defined('EURO')) define('EURO',chr(128)); From 651ea926571ecc954c2caa3c5a109d7462e94945 Mon Sep 17 00:00:00 2001 From: alexis portable Date: Tue, 9 May 2017 14:26:47 +0200 Subject: [PATCH 035/299] NEW fix listview class and add a demo for product list --- htdocs/product/inventory/listview.class.php | 221 +++--- htdocs/product/list-with-listview.php | 702 ++++++++++++++++++++ 2 files changed, 834 insertions(+), 89 deletions(-) create mode 100644 htdocs/product/list-with-listview.php diff --git a/htdocs/product/inventory/listview.class.php b/htdocs/product/inventory/listview.class.php index 51855629686..1c03d0b524f 100644 --- a/htdocs/product/inventory/listview.class.php +++ b/htdocs/product/inventory/listview.class.php @@ -39,6 +39,8 @@ class Listview $this->form = null; $this->totalRowToShow=0; $this->totalRow=0; + + $this->TField=array(); } /** @@ -70,14 +72,15 @@ class Listview ,'head_search'=>'' ,'export'=>array() ,'view_type'=>'' + ,'massactions'=>array() ),$TParam['list']); if (empty($TParam['limit'])) $TParam['limit'] = array(); $page = GETPOST('page'); - if (!empty($page)) $TParam['limit']['page'] = $page+1; // TODO dolibarr start page at 0 instead 1 + if (!empty($page)) $TParam['limit']['page'] = $page; - $TParam['limit'] = array_merge(array('page'=>1, 'nbLine' => $conf->liste_limit, 'global'=>0), $TParam['limit']); + $TParam['limit'] = array_merge(array('page'=>0, 'nbLine' => $conf->liste_limit, 'global'=>0), $TParam['limit']); if (GETPOST('sortfield')) { @@ -137,17 +140,6 @@ class Listview return $TKey; } - - /** - * @param timestamp $date date to convert - * @return int|string Date TMS or '' - */ - private function dateToSQLDate($date) - { - return $this->db->idate($date); - } - - /** * @param string $TSQLMore contain some additional sql instructions * @param string $value date with read format @@ -160,13 +152,11 @@ class Listview $TSQLDate=array(); if(!empty($value['start'])) { -// $valueDeb = $this->dateToSQLDate($value['start'].' 00:00:00'); $TSQLDate[]=$sKey." >= '".$value['start']."'" ; } if(!empty($value['end'])) { -// $valueFin = $this->dateToSQLDate($value['end'].' 23:59:59'); $TSQLDate[]=$sKey." <= '".$value['end']."'" ; } @@ -174,7 +164,6 @@ class Listview } else { -// $value = $this->dateToSQLDate($value); $TSQLMore[]=$sKey." LIKE '".$value."%'" ; } } @@ -227,9 +216,7 @@ class Listview */ private function search($sql, &$TParam) { - $ListPOST = GETPOST('Listview'); - - if (!GETPOST("button_removefilter_x") && !GETPOST("button_removefilter.x") && !GETPOST("button_removefilter")) + if (empty($TParam['no-auto-sql-search']) && !GETPOST("button_removefilter_x") && !GETPOST("button_removefilter.x") && !GETPOST("button_removefilter")) { foreach ($TParam['search'] as $field => $info) { @@ -237,12 +224,14 @@ class Listview $TSQLMore = array(); $allow_is_null = $this->getSearchNull($field,$TParam); + $fieldname = !empty($info['fieldname']) ? $info['fieldname'] : 'Listview_'.$this->id.'_search_'.$field; + foreach ($TsKey as $i => &$sKey) { - $value = ''; - if (isset($ListPOST[$this->id]['search'][$field])) $value = $ListPOST[$this->id]['search'][$field]; + $value = GETPOST($fieldname); + $value_null = GETPOST('Listview_'.$this->id.'_search_on_null_'.$field); - if ($allow_is_null && !empty($ListPOST[$this->id]['search_on_null'][$field])) + if ($allow_is_null && !empty($value_null)) { $TSQLMore[] = $sKey.' IS NULL '; $value = ''; @@ -250,7 +239,7 @@ class Listview if (isset($TParam['type'][$field]) && ($TParam['type'][$field]==='date' || $TParam['type'][$field]==='datetime')) { - $k = 'Listview_'.$this->id.'_search_'.$field; + $k = $fieldname; if ($info['search_type'] === 'calendars') { $value = array(); @@ -296,25 +285,22 @@ class Listview { global $conf; - $TField=array(); + $TField= & $this->TField; $this->init($TParam); $THeader = $this->initHeader($TParam); $sql = $this->search($sql,$TParam); - $sql.= $this->db->order($TParam['param']['sortfield'], $TParam['param']['sortorder']); - - $nbtotalofrecords = ''; + $sql.= $this->db->order($TParam['sortfield'], $TParam['sortorder']); + if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { $result = $this->db->query($sql); - $nbtotalofrecords = $this->db->num_rows($result); + $this->totalRow = $this->db->num_rows($result); } - $sql.= $this->db->plimit($TParam['param']['limit'] + 1, $TParam['param']['offset']); $this->parse_sql($THeader, $TField, $TParam, $sql); - list($TTotal, $TTotalGroup)=$this->get_total($TField, $TParam); return $this->renderList($THeader, $TField, $TTotal, $TTotalGroup, $TParam); @@ -335,44 +321,42 @@ class Listview $nb_search_in_bar = 0; - if(!empty($TParam['search'])) + foreach($THeader as $key => $libelle) { - foreach($THeader as $key => $libelle) - { - if(empty($TSearch[$key]))$TSearch[$key]=''; - } - } + if(empty($TSearch[$key]))$TSearch[$key]=''; + } - $ListPOST = GETPOST('Listview'); $removeFilter = (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")); foreach($TParam['search'] as $key => $param_search) { - $value = isset($ListPOST[$this->id]['search'][$key]) ? $ListPOST[$this->id]['search'][$key] : ''; if ($removeFilter) $value = ''; $typeRecherche = (is_array($param_search) && isset($param_search['search_type'])) ? $param_search['search_type'] : $param_search; + $fieldname = !empty($param_search['fieldname']) ? $param_search['fieldname'] : 'Listview_'.$this->id.'_search_'.$key; + $value = $removeFilter ? '' : GETPOST($fieldname); + if(is_array($typeRecherche)) { - $fsearch=$form->selectarray('Listview['.$this->id.'][search]['.$key.']', $typeRecherche,$value,1); + $fsearch=$form->selectarray($fieldname, $typeRecherche,$value,1); } else if($typeRecherche==='calendar') { - if (!$removeFilter) $value = GETPOST('Listview_'.$this->id.'_search_'.$key) ? mktime(0,0,0, (int) GETPOST('Listview_'.$this->id.'_search_'.$key.'month'), (int) GETPOST('Listview_'.$this->id.'_search_'.$key.'day'), (int) GETPOST('Listview_'.$this->id.'_search_'.$key.'year') ) : ''; + if (!$removeFilter) $value = GETPOST($fieldname) ? mktime(0,0,0, (int) GETPOST($fieldname.'month'), (int) GETPOST($fieldname.$key.'day'), (int) GETPOST($fieldname.'year') ) : ''; - $fsearch = $form->select_date($value, 'Listview_'.$this->id.'_search_'.$key,0, 0, 1, "", 1, 0, 1); + $fsearch = $form->select_date($value, $fieldname,0, 0, 1, "", 1, 0, 1); } else if($typeRecherche==='calendars') { $value_start = $value_end = ''; if (!$removeFilter) { - $value_start = GETPOST('Listview_'.$this->id.'_search_'.$key.'_start') ? mktime(0,0,0, (int) GETPOST('Listview_'.$this->id.'_search_'.$key.'_startmonth'), (int) GETPOST('Listview_'.$this->id.'_search_'.$key.'_startday'), (int) GETPOST('Listview_'.$this->id.'_search_'.$key.'_startyear') ) : ''; - $value_end = GETPOST('Listview_'.$this->id.'_search_'.$key.'_end') ? mktime(0,0,0, (int) GETPOST('Listview_'.$this->id.'_search_'.$key.'_endmonth'), (int) GETPOST('Listview_'.$this->id.'_search_'.$key.'_endday'), (int) GETPOST('Listview_'.$this->id.'_search_'.$key.'_endyear') ) : ''; + $value_start = GETPOST($fieldname.'_start') ? mktime(0,0,0, (int) GETPOST($fieldname.'_startmonth'), (int) GETPOST($fieldname.'_startday'), (int) GETPOST($fieldname.'_startyear') ) : ''; + $value_end = GETPOST($fieldname.'_end') ? mktime(0,0,0, (int) GETPOST($fieldname.'_endmonth'), (int) GETPOST($fieldname.'_endday'), (int) GETPOST($fieldname.'_endyear') ) : ''; } - $fsearch = $form->select_date($value_start, 'Listview_'.$this->id.'_search_'.$key.'_start',0, 0, 1, "", 1, 0, 1) - . $form->select_date($value_end, 'Listview_'.$this->id.'_search_'.$key.'_end',0, 0, 1, "", 1, 0, 1); + $fsearch = $form->select_date($value_start,$fieldname.'_start',0, 0, 1, "", 1, 0, 1) + . $form->select_date($value_end, $fieldname.'_end',0, 0, 1, "", 1, 0, 1); } else if(is_string($typeRecherche)) @@ -381,13 +365,13 @@ class Listview } else { - $fsearch=''; + $fsearch=''; } if(!empty($param_search['allow_is_null'])) { - $valueNull = isset($ListPOST[$this->id]['search_on_null'][$key]) ? 1 : 0; - $fsearch.=' '.$form->checkbox1('', 'Listview['.$this->id.'][search_on_null]['.$key.']',1, $valueNull,' onclick=" if($(this).is(\':checked\')){ $(this).prev().val(\'\'); }" ').img_help(1, $langs->trans('SearchOnNUllValue')); + $valueNull = GETPOST($fieldname.'search_on_null_'.$key) ? 1 : 0; + $fsearch.=' '.$form->checkbox1('', $fieldname.'search_on_null_'.$key,1, $valueNull,' onclick=" if($(this).is(\':checked\')){ $(this).prev().val(\'\'); }" ').img_help(1, $langs->trans('SearchOnNUllValue')); } if(!empty($THeader[$key])) @@ -395,20 +379,10 @@ class Listview $TSearch[$key] = $fsearch; $nb_search_in_bar++; } - else - { - $label = !empty($TParam['title'][$key]) ? $TParam['title'][$key] : $key ; - $TParam['list']['head_search'].= ''.$label.'
'; + $out.= '
'; + $out.= '
'; if(count($TSearch)>0) { @@ -627,12 +612,12 @@ class Listview { if ($field === 'selectedfields') { - $out.= ''; + $out.= ''; } else { $moreattrib = 'style="width:'.$head['width'].';text-align:'.$head['text-align'].'"'; - $out .= ''; + $out .= ''; } } @@ -646,10 +631,17 @@ class Listview $search = ''; $prefix = ''; + $label = $head['label']; + if ($field === 'selectedfields') { $moreattrib = 'align="right" '; $prefix = 'maxwidthsearch '; + + if(!empty($TParam['list']['massactions'])) { + $label.=$form->showCheckAddButtons('checkforselect', 1); + } + } if (empty($head['width'])) $head['width'] = 'auto'; @@ -662,10 +654,10 @@ class Listview else $search = $field; } - $out .= getTitleFieldOfList($head['label'], 0, $_SERVER["PHP_SELF"], $search, '', $moreparam, $moreattrib, $TParam['sortfield'], $TParam['sortorder'], $prefix); + $out .= getTitleFieldOfList($label, 0, $_SERVER["PHP_SELF"], $search, '', $moreparam, $moreattrib, $TParam['sortfield'], $TParam['sortorder'], $prefix); $out .= $head['more']; } - + //$out .= ''; $out .= ''; @@ -673,23 +665,34 @@ class Listview if(empty($TField)) { - if (!empty($TParam['list']['messageNothing'])) $out .= ''; + if (!empty($TParam['list']['messageNothing'])) $out .= ''; } else { - $var=true; $line_number = 0; foreach($TField as $fields) { if($this->in_view($TParam, $line_number)) { - $var=!$var; - $out.=''; + $out.=''; foreach ($THeader as $field => $head) { + $value_aff =(isset($fields[$field]) ? $fields[$field] : ' '); + + if ($field === 'selectedfields') + { + $head['text-align']='center'; + if(!empty($TParam['list']['massactions'])) { + $arrayofselected=array(); // TODO get in param + $selected=0; + if (in_array($obj->rowid, $arrayofselected)) $selected=1; + $value_aff.=''; + } + } + $moreattrib = 'style="width:'.$head['width'].';text-align:'.$head['text-align'].'"'; - $out.=''; + $out.=''; } $out.=''; @@ -718,6 +721,7 @@ class Listview } $out .= '
'.$this->form->showFilterAndCheckAddButtons(0).''.$this->form->showFilterAndCheckAddButtons(0).''.$TSearch[$field].''.$TSearch[$field].'--
'.$TParam['list']['messageNothing'].'
'.$TParam['list']['messageNothing'].'
'.$fields[$field].''.$value_aff.'
'; + $out .= ''; return $out; } @@ -760,7 +764,7 @@ class Listview foreach($TField as $row) { - $this->set_line($TField, $TParam, $row); + $this->set_line($THeader, $TField, $TParam, $row); } } @@ -778,7 +782,7 @@ class Listview } $contextpage=md5($_SERVER['PHP_SELF']); - if(!empty($TParam['allow-field-select'])) + if(!empty($TParam['allow-fields-select'])) { $selectedfields = GETPOST('Listview'.$this->id.'_selectedfields'); @@ -839,18 +843,25 @@ class Listview 'order'=>(in_array($field, $TParam['orderby']['noOrder']) ? 0 : 1), 'width'=>(!empty($TParam['size']['width'][$field]) ? $TParam['size']['width'][$field] : 'auto'), 'text-align'=>(!empty($TParam['position']['text-align'][$field]) ? $TParam['position']['text-align'][$field] : 'auto'), + 'rank'=>(!empty($TParam['position']['rank'][$field]) ? $TParam['position']['rank'][$field] : 0), 'more'=>'' ); } } - if(!empty($selectedfields)) - { - $THeader['selectedfields']['label']='
'.$selectedfields.'
'; - } + uasort($THeader,array('Listview','sortHeaderRank')); + + $THeader['selectedfields']['label']=$selectedfields; return $THeader; } + + public function sortHeaderRank(&$a, &$b) { + if($a['rank']>$b['rank']) return 1; + else if($a['rank']<$b['rank']) return -1; + else return 0; + + } /** * @param string $TParam TParam @@ -874,11 +885,14 @@ class Listview } /** - * @param string $TField TField - * @param string $TParam TParam - * @param string $currentLine aaa + * Apply function to result and set fields array + * + * @param string $THeader array of headers + * @param string $TField array of fields + * @param string $TParam array of parameters + * @param string $currentLine object containing current sql result */ - private function set_line(&$TField, &$TParam, $currentLine) + private function set_line(&$THeader, &$TField, &$TParam, $currentLine) { global $conf; @@ -887,16 +901,21 @@ class Listview if($this->in_view($TParam,$line_number)) { $this->totalRowToShow++; - $row=array(); $trans = array(); - foreach($currentLine as $field=>$value) + $row=array(); + $trans = array(); + foreach($currentLine as $kF=>$vF)$trans['@'.$kF.'@'] = addslashes($vF); + + foreach($THeader as $field=>$dummy) { + $value = isset($currentLine->{$field}) ? $currentLine->{$field}: ''; + if(is_object($value)) { if(get_class($value)=='stdClass') {$value=print_r($value, true);} else $value=(string) $value; } - $trans['@'.$field.'@'] = $value; + $trans['@'.$field.'@'] = addslashes($value); if(!empty($TParam['math'][$field])) { @@ -910,17 +929,19 @@ class Listview if(isset($TParam['eval'][$field]) && in_array($field,array_keys($row))) { - $strToEval = 'return '.strtr( $TParam['eval'][$field], array_merge( $trans, array('@val@'=>$row[$field]) )).';'; + $strToEval = 'return '.strtr( $TParam['eval'][$field], array_merge( $trans, array('@val@'=>addslashes( $row[$field] )) )).';'; $row[$field] = eval($strToEval); + } if(isset($TParam['type'][$field]) && !isset($TParam['eval'][$field])) { if($TParam['type'][$field]=='date' || $TParam['type'][$field]=='datetime' ) { + if($row[$field] != '0000-00-00 00:00:00' && $row[$field] != '1000-01-01 00:00:00' && $row[$field] != '0000-00-00' && !empty($row[$field])) { - if($TParam['type'][$field]=='datetime')$row[$field] = dol_print_date(strtotime($row[$field]),'dayhoursec'); + if($TParam['type'][$field]=='datetime')$row[$field] = dol_print_date(strtotime($row[$field]),'dayhour'); else $row[$field] = dol_print_date(strtotime($row[$field]),'day'); } else @@ -996,6 +1017,8 @@ class Listview { $sql.=' LIMIT '.(int) $TParam['limit']['global']; } + else if(!empty($TParam['limit'])) $sql.= $this->db->plimit($TParam['limit']['nbLine']+1, $TParam['limit']['page'] * $TParam['limit']['nbLine']); + return $sql; } @@ -1008,7 +1031,7 @@ class Listview */ private function parse_sql(&$THeader, &$TField, &$TParam, $sql) { - $this->sql = $this->limitSQL($sql, $TParam); + $this->sql = $this->limitSQL($sql, $TParam); $this->TTotalTmp=array(); $this->THideFlip = array_flip($TParam['hide']); @@ -1016,12 +1039,13 @@ class Listview $res = $this->db->query($this->sql); if($res!==false) { - $this->totalRow = $this->db->num_rows($res); dol_syslog(get_class($this)."::parse_sql id=".$this->id." sql=".$this->sql, LOG_DEBUG); + if(empty($this->totalRow))$this->totalRow = $this->db->num_rows($res); + while($currentLine = $this->db->fetch_object($res)) { - $this->set_line($TField, $TParam, $currentLine); + $this->set_line($THeader, $TField, $TParam, $currentLine); } } else @@ -1029,4 +1053,23 @@ class Listview dol_syslog(get_class($this)."::parse_sql id=".$this->id." sql=".$this->sql, LOG_ERR); } } + + static function getCachedOjbect($class_name, $fk_object) { + global $db, $TCacheListObject; + + if(!class_exists($class_name)) return false; + + if(empty($TCacheListObject)) $TCacheListObject = array(); + if(empty($TCacheListObject[$class_name])) $TCacheListObject[$class_name] =array(); + + if(empty($TCacheListObject[$class_name][$fk_object])) { + $TCacheListObject[$class_name][$fk_object]= new $class_name($db); + if( $TCacheListObject[$class_name][$fk_object]->fetch($fk_object)<0) { + return false; + } + } + + return $TCacheListObject[$class_name][$fk_object]; + } + } diff --git a/htdocs/product/list-with-listview.php b/htdocs/product/list-with-listview.php new file mode 100644 index 00000000000..8d53496dbcb --- /dev/null +++ b/htdocs/product/list-with-listview.php @@ -0,0 +1,702 @@ + + * Copyright (C) 2004-2016 Laurent Destailleur + * Copyright (C) 2005-2012 Regis Houssin + * Copyright (C) 2012-2016 Marcos García + * Copyright (C) 2013-2016 Juanjo Menent + * Copyright (C) 2013-2015 Raphaël Doursenaud + * Copyright (C) 2013 Jean Heimburger + * Copyright (C) 2013 Cédric Salvador + * Copyright (C) 2013 Florian Henry + * Copyright (C) 2013 Adolfo segura + * Copyright (C) 2015 Jean-François Ferry + * Copyright (C) 2016 Ferran Marcet + * + * 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 3 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/product/list.php + * \ingroup produit + * \brief Page to list products and services + */ + +require '../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; +require_once DOL_DOCUMENT_ROOT.'/product/inventory/listview.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.product.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; +if (! empty($conf->categorie->enabled)) + require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; + +$langs->load("products"); +$langs->load("stocks"); +$langs->load("suppliers"); +$langs->load("companies"); +if (! empty($conf->productbatch->enabled)) $langs->load("productbatch"); + +$action=GETPOST('action','alpha'); +$massaction=GETPOST('massaction','alpha'); +$show_files=GETPOST('show_files','int'); +$confirm=GETPOST('confirm','alpha'); +$toselect = GETPOST('toselect', 'array'); + +$sref=GETPOST("sref"); +$sbarcode=GETPOST("sbarcode"); +$snom=GETPOST("snom"); +$sall=GETPOST("sall"); +$type= (int) GETPOST("type","int"); +$search_sale = GETPOST("search_sale"); +$search_categ = GETPOST("search_categ",'int'); +$tosell = GETPOST("tosell", 'int'); +$tobuy = GETPOST("tobuy", 'int'); +$fourn_id = GETPOST("fourn_id",'int'); +$catid = GETPOST('catid','int'); +$search_tobatch = GETPOST("search_tobatch",'int'); +$search_accountancy_code_sell = GETPOST("search_accountancy_code_sell",'alpha'); +$search_accountancy_code_buy = GETPOST("search_accountancy_code_buy",'alpha'); +$optioncss = GETPOST('optioncss','alpha'); + +//Show/hide child products. Hidden by default +if (!$_POST) { + $search_hidechildproducts = 'on'; +} else { + $search_hidechildproducts = GETPOST('search_hidechildproducts'); +} + +$diroutputmassaction=$conf->product->dir_output . '/temp/massgeneration/'.$user->id; + +$limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit; +$sortfield = GETPOST("sortfield",'alpha'); +$sortorder = GETPOST("sortorder",'alpha'); +$page = (GETPOST("page",'int')?GETPOST("page", 'int'):0); +if ($page == -1) { $page = 0; } +$offset = $limit * $page; +$pageprev = $page - 1; +$pagenext = $page + 1; +if (! $sortfield) $sortfield="p.ref"; +if (! $sortorder) $sortorder="ASC"; + +// Initialize context for list +$contextpage=GETPOST('contextpage','aZ')?GETPOST('contextpage','aZ'):'productservicelist'; +if ((string) $type == '1') { $contextpage='servicelist'; if ($search_type=='') $search_type='1'; } +if ((string) $type == '0') { $contextpage='productlist'; if ($search_type=='') $search_type='0'; } + +// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array +$hookmanager->initHooks(array($contextpage)); +$extrafields = new ExtraFields($db); +$form=new Form($db); + +// fetch optionals attributes and labels +$extralabels = $extrafields->fetch_name_optionals_label('product'); +$search_array_options=$extrafields->getOptionalsFromPost($extralabels,'','search_'); + +if (empty($action)) $action='list'; + +// Get object canvas (By default, this is not defined, so standard usage of dolibarr) +$canvas=GETPOST("canvas"); +$objcanvas=null; +if (! empty($canvas)) +{ + require_once DOL_DOCUMENT_ROOT.'/core/class/canvas.class.php'; + $objcanvas = new Canvas($db,$action); + $objcanvas->getCanvas('product','list',$canvas); +} + +// Security check +if ($type=='0') $result=restrictedArea($user,'produit','','','','','',$objcanvas); +else if ($type=='1') $result=restrictedArea($user,'service','','','','','',$objcanvas); +else $result=restrictedArea($user,'produit|service','','','','','',$objcanvas); + +// Define virtualdiffersfromphysical +$virtualdiffersfromphysical=0; +if (! empty($conf->global->STOCK_CALCULATE_ON_SHIPMENT) || ! empty($conf->global->STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER)) +{ + $virtualdiffersfromphysical=1; // According to increase/decrease stock options, virtual and physical stock may differs. +} + +// List of fields to search into when doing a "search in all" +$fieldstosearchall = array( + 'p.ref'=>"Ref", + 'pfp.ref_fourn'=>"RefSupplier", + 'p.label'=>"ProductLabel", + 'p.description'=>"Description", + "p.note"=>"Note", +); +// multilang +if (! empty($conf->global->MAIN_MULTILANGS)) +{ + $fieldstosearchall['pl.label']='ProductLabelTranslated'; + $fieldstosearchall['pl.description']='ProductDescriptionTranslated'; + $fieldstosearchall['pl.note']='ProductNoteTranslated'; +} +if (! empty($conf->barcode->enabled)) { + $fieldstosearchall['p.barcode']='Gencod'; +} + +if (empty($conf->global->PRODUIT_MULTIPRICES)) +{ + $titlesellprice=$langs->trans("SellingPrice"); + if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) + { + $titlesellprice=$form->textwithpicto($langs->trans("SellingPrice"), $langs->trans("DefaultPriceRealPriceMayDependOnCustomer")); + } +} + +// Definition of fields for lists +$arrayfields=array( + 'p.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1), + //'pfp.ref_fourn'=>array('label'=>$langs->trans("RefSupplier"), 'checked'=>1, 'enabled'=>(! empty($conf->barcode->enabled))), + 'p.label'=>array('label'=>$langs->trans("Label"), 'checked'=>1), + 'p.barcode'=>array('label'=>$langs->trans("Gencod"), 'checked'=>($contextpage != 'servicelist'), 'enabled'=>(! empty($conf->barcode->enabled))), + 'p.duration'=>array('label'=>$langs->trans("Duration"), 'checked'=>($contextpage != 'productlist'), 'enabled'=>(! empty($conf->service->enabled))), + 'p.price'=>array('label'=>$langs->trans("SellingPrice"), 'checked'=>1, 'enabled'=>empty($conf->global->PRODUIT_MULTIPRICES)), + 'p.minbuyprice'=>array('label'=>$langs->trans("BuyingPriceMinShort"), 'checked'=>1, 'enabled'=>(! empty($user->rights->fournisseur->lire))), + 'p.seuil_stock_alerte'=>array('label'=>$langs->trans("StockLimit"), 'checked'=>0, 'enabled'=>(! empty($conf->stock->enabled) && $user->rights->stock->lire && $contextpage != 'service')), + 'p.desiredstock'=>array('label'=>$langs->trans("DesiredStock"), 'checked'=>1, 'enabled'=>(! empty($conf->stock->enabled) && $user->rights->stock->lire && $contextpage != 'service')), + 'p.stock'=>array('label'=>$langs->trans("PhysicalStock"), 'checked'=>1, 'enabled'=>(! empty($conf->stock->enabled) && $user->rights->stock->lire && $contextpage != 'service')), + 'stock_virtual'=>array('label'=>$langs->trans("VirtualStock"), 'checked'=>1, 'enabled'=>(! empty($conf->stock->enabled) && $user->rights->stock->lire && $contextpage != 'service' && $virtualdiffersfromphysical)), + 'p.tobatch'=>array('label'=>$langs->trans("ManageLotSerial"), 'checked'=>0, 'enabled'=>(! empty($conf->productbatch->enabled))), + 'p.accountancy_code_sell'=>array('label'=>$langs->trans("ProductAccountancySellCode"), 'checked'=>0), + 'p.accountancy_code_buy'=>array('label'=>$langs->trans("ProductAccountancyBuyCode"), 'checked'=>0), + 'p.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), + 'p.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500), + 'p.tosell'=>array('label'=>$langs->trans("Status").' ('.$langs->trans("Sell").')', 'checked'=>1, 'position'=>1000), + 'p.tobuy'=>array('label'=>$langs->trans("Status").' ('.$langs->trans("Buy").')', 'checked'=>1, 'position'=>1000) +); +// Extra fields +if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) +{ + foreach($extrafields->attribute_label as $key => $val) + { + $arrayfields["ef.".$key]=array('label'=>$extrafields->attribute_label[$key], 'checked'=>$extrafields->attribute_list[$key], 'position'=>$extrafields->attribute_pos[$key]); + } +} + + + +/* + * Actions + */ + +if (GETPOST('cancel')) { $action='list'; $massaction=''; } +if (! GETPOST('confirmmassaction') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction=''; } + +$parameters=array(); +$reshook=$hookmanager->executeHooks('doActions',$parameters, $object, $action); // Note that $action and $object may have been modified by some hooks +if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + +if (empty($reshook)) +{ + // Selection of new fields + include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php'; + + // Purge search criteria + if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) // All tests are required to be compatible with all browsers + { + $sall=""; + $sref=""; + $snom=""; + $sbarcode=""; + $search_categ=0; + $tosell=""; + $tobuy=""; + $search_tobatch=''; + $search_accountancy_code_sell=''; + $search_accountancy_code_buy=''; + $search_array_options=array(); + } + + // Mass actions + $objectclass='Product'; + if ((string) $type == '1') { $objectlabel='Services'; } + if ((string) $type == '0') { $objectlabel='Products'; } + + $permtoread = $user->rights->produit->lire; + $permtodelete = $user->rights->produit->supprimer; + $uploaddir = $conf->product->dir_output; + include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php'; +} + + +/* + * View + */ + +$htmlother=new FormOther($db); + +if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) +{ + $objcanvas->assign_values($action); // This must contains code to load data (must call LoadListDatas($limit, $offset, $sortfield, $sortorder)) + $objcanvas->display_canvas($action); // This is code to show template +} +else +{ + $title=$langs->trans("ProductsAndServices"); + + if (isset($type)) + { + if ($type==1) + { + $texte = $langs->trans("Services"); + } + else + { + $texte = $langs->trans("Products"); + } + } + else + { + $texte = $langs->trans("ProductsAndServices"); + } + + $sql = 'SELECT DISTINCT p.rowid, p.ref, p.label, p.barcode, p.price, p.price_ttc, p.price_base_type, p.entity,'; + $sql.= ' p.fk_product_type, p.duration, p.tosell, p.tobuy, p.seuil_stock_alerte, p.desiredstock,'; + $sql.= ' p.tobatch, p.accountancy_code_sell, p.accountancy_code_buy,'; + $sql.= ' p.datec, p.tms,'; + //$sql.= ' pfp.ref_fourn as ref_supplier, '; + $sql.= ' MIN(pfp.unitprice) as minsellprice'; + if (!empty($conf->variants->enabled) && $search_hidechildproducts && ($type === 0)) { + $sql .= ', pac.rowid prod_comb_id'; + } + // Add fields from extrafields + foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : ''); + // Add fields from hooks + $parameters=array(); + $reshook=$hookmanager->executeHooks('printFieldListSelect',$parameters); // Note that $action and $object may have been modified by hook + $sql.=$hookmanager->resPrint; + $sql.= ' FROM '.MAIN_DB_PREFIX.'product as p'; + if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_extrafields as ef on (p.rowid = ef.fk_object)"; + if (! empty($search_categ) || ! empty($catid)) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_product as cp ON p.rowid = cp.fk_product"; // We'll need this table joined to the select in order to filter by categ + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_fournisseur_price as pfp ON p.rowid = pfp.fk_product"; + // multilang + if (! empty($conf->global->MAIN_MULTILANGS)) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_lang as pl ON pl.fk_product = p.rowid AND pl.lang = '".$langs->getDefaultLang() ."'"; + if (!empty($conf->variants->enabled) && $search_hidechildproducts && ($type === 0)) { + $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product_attribute_combination pac ON pac.fk_product_child = p.rowid"; + } + + $sql.= ' WHERE p.entity IN ('.getEntity('product', 1).')'; + if ($sall) $sql .= natural_search(array_keys($fieldstosearchall), $sall); + // if the type is not 1, we show all products (type = 0,2,3) + if (dol_strlen($type)) + { + if ($type == 1) $sql.= " AND p.fk_product_type = '1'"; + else $sql.= " AND p.fk_product_type <> '1'"; + } + if ($sref) $sql .= natural_search('p.ref', $sref); + if ($snom) $sql .= natural_search('p.label', $snom); + if ($sbarcode) $sql .= natural_search('p.barcode', $sbarcode); + if (isset($tosell) && dol_strlen($tosell) > 0 && $tosell!=-1) $sql.= " AND p.tosell = ".$db->escape($tosell); + if (isset($tobuy) && dol_strlen($tobuy) > 0 && $tobuy!=-1) $sql.= " AND p.tobuy = ".$db->escape($tobuy); + if (dol_strlen($canvas) > 0) $sql.= " AND p.canvas = '".$db->escape($canvas)."'"; + if ($catid > 0) $sql.= " AND cp.fk_categorie = ".$catid; + if ($catid == -2) $sql.= " AND cp.fk_categorie IS NULL"; + if ($search_categ > 0) $sql.= " AND cp.fk_categorie = ".$db->escape($search_categ); + if ($search_categ == -2) $sql.= " AND cp.fk_categorie IS NULL"; + if ($fourn_id > 0) $sql.= " AND pfp.fk_soc = ".$fourn_id; + if ($search_tobatch != '' && $search_tobatch >= 0) $sql.= " AND p.tobatch = ".$db->escape($search_tobatch); + if ($search_accountancy_code_sell) $sql.= natural_search('p.accountancy_code_sell', $search_accountancy_code_sell); + if ($search_accountancy_code_sell) $sql.= natural_search('p.accountancy_code_buy', $search_accountancy_code_buy); + // Add where from extra fields + + if (!empty($conf->variants->enabled) && $search_hidechildproducts && ($type === 0)) { + $sql .= " AND pac.rowid IS NULL"; + } + + // Add where from extra fields + foreach ($search_array_options as $key => $val) + { + $crit=$val; + $tmpkey=preg_replace('/search_options_/','',$key); + $typ=$extrafields->attribute_type[$tmpkey]; + $mode=0; + if (in_array($typ, array('int','double'))) $mode=1; // Search on a numeric + if ($val && ( ($crit != '' && ! in_array($typ, array('select'))) || ! empty($crit))) + { + $sql .= natural_search('ef.'.$tmpkey, $crit, $mode); + } + } + // Add where from hooks + $parameters=array(); + $reshook=$hookmanager->executeHooks('printFieldListWhere',$parameters); // Note that $action and $object may have been modified by hook + $sql.=$hookmanager->resPrint; + $sql.= " GROUP BY p.rowid, p.ref, p.label, p.barcode, p.price, p.price_ttc, p.price_base_type,"; + $sql.= " p.fk_product_type, p.duration, p.tosell, p.tobuy, p.seuil_stock_alerte, p.desiredstock,"; + $sql.= ' p.datec, p.tms, p.entity, p.tobatch, p.accountancy_code_sell, p.accountancy_code_buy'; + if (!empty($conf->variants->enabled) && $search_hidechildproducts && ($type === 0)) { + $sql .= ', pac.rowid'; + } + // Add fields from extrafields + foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key : ''); + // Add fields from hooks + $parameters=array(); + $reshook=$hookmanager->executeHooks('printFieldSelect',$parameters); // Note that $action and $object may have been modified by hook + $sql.=$hookmanager->resPrint; + + // TODO put these functions into product.lib.php if this go from demo to core + /** + * Function return formated sell price + * + * @param int $fk_object rowid of product + * @return string + */ + function list_get_product_sellprice($fk_object) { + global $langs,$conf, $user; + + $object = Listview::getCachedOjbect('Product', $fk_object); + if($object === false) return ''; + + if ($object->status) + { + if ($object->price_base_type == 'TTC') return price($object->price_ttc).' '.$langs->trans("TTC"); + else return price($object->price).' '.$langs->trans("HT"); + } + return ''; + } + + /** + * Function return formated product status sell or buy + * + * @param int $fk_object rowid of product + * @param string $field concerned field status|status_buy + * @param int $type for libstatus + * @return string + */ + function list_get_product_status($fk_object, $field, $type) { + global $conf, $user; + + $object = Listview::getCachedOjbect('Product', $fk_object); + + if($object === false) return ''; + + if (! empty($conf->use_javascript_ajax) && $user->rights->produit->creer && ! empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) { + return ajax_object_onoff($object, 'status', 'tosell', 'ProductStatusOnSell', 'ProductStatusNotOnSell'); + } else { + return $object->LibStatut($object->{$field},5,$type); + } + + } + + /** + * Function return formated ref + * + * @param int $fk_object rowid of product + * @return string + */ + function list_get_product_ref($fk_object) { + global $conf, $user; + + $object = Listview::getCachedOjbect('Product', $fk_object); + + if($object === false) return ''; + + return $object->getNomUrl(1,'',24); + } + + /** + * Function return formated extrafield + * + * @param int $fk_object rowid of product + * @param string $key extrafield to output + * @return string + */ + function list_get_product_extrafield($fk_object, $key) { + global $extrafields; + + $object = Listview::getCachedOjbect('Product', $fk_object); + if($object === false) return ''; + + return $extrafields->showOutputField($key, $object->array_options['options_'.$key], '', 1); + } + + /** + * Function return formated virtual stock + * + * @param int $fk_object rowid of product + * @return string + */ + function list_get_product_virtual_stock($fk_object) { + global $langs; + + $object = Listview::getCachedOjbect('Product', $fk_object); + if($object === false) return ''; + + $object->load_stock('nobatch'); + + $out = ''; + if ($object->type != 1) + { + if ($object->seuil_stock_alerte != '' && $object->stock_theorique < (float) $object->seuil_stock_alerte) $out.= img_warning($langs->trans("StockTooLow")).' '; + $out.= $object->stock_theorique; + } + + return $out; + } + + /** + * Function return formated stock + * + * @param int $fk_object rowid of product + * @return string + */ + function list_get_product_stock($fk_object) { + global $langs; + + $object = Listview::getCachedOjbect('Product', $fk_object); + if($object === false) return ''; + + $out = ''; + if ($object->type != 1) + { + if ($object->seuil_stock_alerte != '' && $object->stock_reel< (float) $object->seuil_stock_alerte) $out.= img_warning($langs->trans("StockTooLow")).' '; + $out.= (double)$object->stock_reel; + } + + return $out; + } + /** + * Function return formated min buy price + * + * @param int $fk_object rowid of product + * @return string + */ + function list_get_product_minbuyprice($fk_object) { + global $conf, $user, $langs,$db,$form; + + $out = ''; + + $object = Listview::getCachedOjbect('Product', $fk_object); + if($object === false || empty($object->status_buy) ) return ''; + + $product_fourn =new ProductFournisseur($db); + if ($product_fourn->find_min_price_product_fournisseur($fk_object) > 0) + { + if ($product_fourn->product_fourn_price_id > 0) + { + if (! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->lire) + { + $htmltext=$product_fourn->display_price_product_fournisseur(1, 1, 0, 1); + $out.= $form->textwithpicto(price($product_fourn->fourn_unitprice).' '.$langs->trans("HT"),$htmltext); + } + else $out.= price($product_fourn->fourn_unitprice).' '.$langs->trans("HT"); + } + } + return $out; + } + + // array of customized field function + $arrayeval = array( + 'tobuy'=>'list_get_product_status(@rowid@, "status_buy",1)' + ,'tosell'=>'list_get_product_status(@rowid@, "status",0)' + ,'ref'=>'list_get_product_ref(@rowid@)' + ,'label'=>'dol_trunc("@val@",40)' + ,'price'=>'list_get_product_sellprice(@rowid@)' + ,'stock_virtual'=>'list_get_product_virtual_stock(@rowid@)' + ,'stock'=>'list_get_product_stock(@rowid@)' + ,'minbuyprice'=>'list_get_product_minbuyprice(@rowid@)' + ); + + // defined list align for field + $arrayalign = array( + 'price'=>'right' + ,'tobuy'=>'right' + ,'tosell'=>'right' + ,'desiredstock'=>'right' + ,'stock'=>'right' + ,'stock_virtual'=>'right' + ,'minbuyprice'=>'right' + ,'datec'=>'center' + ,'tms'=>'center' + ); + + $parameters=array('arrayfields'=>$arrayfields); + $reshook=$hookmanager->executeHooks('printFieldListMoreFields',$parameters); // Note that $action and $object may have been modified by hook + if($reshook) { + $arrayfields = $hookmanager->resArray; + } + + // init title, hidden field (allowed into selected fields), and position + $arrayhide = $arraytitle = $arrayposition = array(); + foreach($arrayfields as $k=>$data) { + if(!isset($data['enabled']) || $data['enabled']) { + list($t,$f) = explode('.',$k); + if(empty($f))$f = $k; + $arraytitle[$f]=$data['label']; + if(empty($data['checked'])) $arrayhide[] = $f; + $arrayposition[$f] = empty($data['position']) ? 0 : $data['position']; + } + } + + // Extra fields + if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) + { + foreach($extrafields->attribute_label as $key => $val) + { + $arrayalign[$key]=$extrafields->getAlignFlag($key); + $arrayeval[$key] = 'list_get_product_extrafield(@rowid@, "'.$key.'")'; + } + } + // List of mass actions available + $arrayofmassactions = array( + //'presend'=>$langs->trans("SendByMail"), + //'builddoc'=>$langs->trans("PDFMerge"), + ); + if ($user->rights->produit->supprimer) $arrayofmassactions['delete']=$langs->trans("Delete"); + if ($massaction == 'presend' || $massaction == 'createbills') $arrayofmassactions=array(); + + // Filter on categories + $moreforfilter=''; + if (! empty($conf->categorie->enabled)) + { + $moreforfilter.='
'; + $moreforfilter.=$langs->trans('Categories'). ': '; + $moreforfilter.=$htmlother->select_categories(Categorie::TYPE_PRODUCT,$search_categ,'search_categ',1); + $moreforfilter.='
'; + } + + //Show/hide child products. Hidden by default + if (!empty($conf->variants->enabled) && $type === 0) { + $moreforfilter.='
'; + $moreforfilter.= ''; + $moreforfilter.= ' '; + $moreforfilter.='
'; + } + + if ($moreforfilter) + { + $parameters=array(); + $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook + + if(!empty($hookmanager->resPrint)) { + $moreforfilter.=$hookmanager->resPrint; + } + + } + + $param=''; + if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.urlencode($contextpage); + if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.urlencode($limit); + if ($search_categ > 0) $param.="&search_categ=".urlencode($search_categ); + if ($sref) $param="&sref=".urlencode($sref); + if ($search_ref_supplier) $param="&search_ref_supplier=".urlencode($search_ref_supplier); + if ($sbarcode) $param.=($sbarcode?"&sbarcode=".urlencode($sbarcode):""); + if ($snom) $param.="&snom=".urlencode($snom); + if ($sall) $param.="&sall=".urlencode($sall); + if ($tosell != '') $param.="&tosell=".urlencode($tosell); + if ($tobuy != '') $param.="&tobuy=".urlencode($tobuy); + if ($fourn_id > 0) $param.=($fourn_id?"&fourn_id=".$fourn_id:""); + if ($seach_categ) $param.=($search_categ?"&search_categ=".urlencode($search_categ):""); + if ($type != '') $param.='&type='.urlencode($type); + if ($optioncss != '') $param.='&optioncss='.urlencode($optioncss); + if ($search_tobatch) $param="&search_ref_supplier=".urlencode($search_ref_supplier); + if ($search_accountancy_code_sell) $param="&search_accountancy_code_sell=".urlencode($search_accountancy_code_sell); + if ($search_accountancy_code_buy) $param="&search_accountancy_code_buy=".urlencode($search_accountancy_code_buy); + // Add $param from extra fields + foreach ($search_array_options as $key => $val) + { + $crit=$val; + $tmpkey=preg_replace('/search_options_/','',$key); + if ($val != '') $param.='&search_options_'.$tmpkey.'='.urlencode($val); + } + + //var_dump($arraytitle,$arrayhide); + $list=new Listview($db, 'products'); + $listHTML = $list->render($sql,array( + 'list'=>array( + 'title'=>$texte + ,'image'=>'title_products.png' + ,'massactions'=>$arrayofmassactions + ,'param_url'=>$param + ,'messageNothing'=>'' + ) + ,'limit'=>array( + 'nbLine'=>$limit + ) + ,'sortfield'=>$sortfield + ,'sortorder'=>$sortorder + ,'title'=>$arraytitle // column definition title (only defined where abble to show) + ,'position'=>array( + 'text-align'=>$arrayalign + ,'rank'=>$arrayposition + ) + ,'allow-fields-select'=>1 // allow to select hidden fields + ,'head_search'=>$moreforfilter //custom search on head + ,'no-auto-sql-search'=>1 //disabled auto completion sql for search and pager url, use dolibarr style for migration of product list + ,'translate'=>array() + ,'search'=>array( + 'ref'=>array('search_type'=>true, 'table'=>'p', 'fieldname'=>'sref') + ,'label'=>array('search_type'=>true, 'table'=>'p', 'fieldname'=>'snom') + ,'tosell'=>array('search_type'=> array('0'=>$langs->trans('ProductStatusNotOnSellShort'),'1'=>$langs->trans('ProductStatusOnSellShort')), 'fieldname'=>'tosell') + ,'tobuy'=>array('search_type'=> array('0'=>$langs->trans('ProductStatusNotOnBuyShort'),'1'=>$langs->trans('ProductStatusOnBuyShort')), 'fieldname'=>'tobuy') + ,'barcode'=>array('search_type'=>true, 'table'=>'p', 'fieldname'=>'sbarcode') + ,'accountancy_code_sell'=>array('search_type'=>true, 'table'=>'p', 'fieldname'=>'search_accountancy_code_sell') + ,'accountancy_code_buy'=>array('search_type'=>true, 'table'=>'p', 'fieldname'=>'search_accountancy_code_buy') + ) + ,'type'=>array( + 'datec'=>'datetime' + ,'tms'=>'datetime' + ) + ,'hide'=>$arrayhide + ,'eval'=>$arrayeval + )); + + $num = $list->totalRow; + + $arrayofselected=is_array($toselect)?$toselect:array(); + + if ($num == 1 && ! empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $sall) + { + $id = $list->TField[0]->rowid; + header("Location: ".DOL_URL_ROOT.'/product/card.php?id='.$id); + exit; + } + + $helpurl=''; + if (isset($type)) + { + if ($type == 0) + { + $helpurl='EN:Module_Products|FR:Module_Produits|ES:Módulo_Productos'; + } + else if ($type == 1) + { + $helpurl='EN:Module_Services_En|FR:Module_Services|ES:Módulo_Servicios'; + } + } + + llxHeader('',$title,$helpurl,''); + + // Displays product removal confirmation + if (GETPOST('delprod')) { + setEventMessages($langs->trans("ProductDeleted", GETPOST('delprod')), null, 'mesgs'); + } + + print '
'; + if ($optioncss != '') print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + echo $listHTML; + + print '
'; + +} + + +llxFooter(); +$db->close(); From 8272408b6e5a1d4c1d76a7ba54695d8934699ec0 Mon Sep 17 00:00:00 2001 From: alexis portable Date: Tue, 9 May 2017 14:43:54 +0200 Subject: [PATCH 036/299] fix travis case statement --- htdocs/product/list-with-listview.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/product/list-with-listview.php b/htdocs/product/list-with-listview.php index 8d53496dbcb..e3103d8f426 100644 --- a/htdocs/product/list-with-listview.php +++ b/htdocs/product/list-with-listview.php @@ -438,7 +438,7 @@ else if ($object->type != 1) { if ($object->seuil_stock_alerte != '' && $object->stock_theorique < (float) $object->seuil_stock_alerte) $out.= img_warning($langs->trans("StockTooLow")).' '; - $out.= $object->stock_theorique; + $out.= (double) $object->stock_theorique; } return $out; @@ -460,7 +460,7 @@ else if ($object->type != 1) { if ($object->seuil_stock_alerte != '' && $object->stock_reel< (float) $object->seuil_stock_alerte) $out.= img_warning($langs->trans("StockTooLow")).' '; - $out.= (double)$object->stock_reel; + $out.= (double) $object->stock_reel; } return $out; From c88656edb4ef5e6cf8024716b94140fa0d7b0eb5 Mon Sep 17 00:00:00 2001 From: Laurent Dinclaux Date: Tue, 9 May 2017 23:59:37 +1100 Subject: [PATCH 037/299] Fix PHPDOC comments --- htdocs/compta/facture/class/facture-rec.class.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/htdocs/compta/facture/class/facture-rec.class.php b/htdocs/compta/facture/class/facture-rec.class.php index 390e9999454..ef23a30b878 100644 --- a/htdocs/compta/facture/class/facture-rec.class.php +++ b/htdocs/compta/facture/class/facture-rec.class.php @@ -507,6 +507,8 @@ class FactureRec extends CommonInvoice * @param double $pu_ht Prix unitaire HT (> 0 even for credit note) * @param double $qty Quantite * @param double $txtva Taux de tva force, sinon -1 + * @param double $txlocaltax1 Local tax 1 rate (deprecated) + * @param double $txlocaltax2 Local tax 2 rate (deprecated) * @param int $fk_product Id du produit/service predefini * @param double $remise_percent Pourcentage de remise de la ligne * @param string $price_base_type HT or TTC @@ -659,6 +661,8 @@ class FactureRec extends CommonInvoice * @param double $pu_ht Prix unitaire HT (> 0 even for credit note) * @param double $qty Quantite * @param double $txtva Taux de tva force, sinon -1 + * @param double $txlocaltax1 Local tax 1 rate (deprecated) + * @param double $txlocaltax2 Local tax 2 rate (deprecated) * @param int $fk_product Id du produit/service predefini * @param double $remise_percent Pourcentage de remise de la ligne * @param string $price_base_type HT or TTC From fb561bae1bdd268bb3781c9b4720fde8060ddbd9 Mon Sep 17 00:00:00 2001 From: Laurent Dinclaux Date: Wed, 10 May 2017 00:58:48 +1100 Subject: [PATCH 038/299] Fix recurring invoices generation when using the cron url --- htdocs/public/cron/cron_run_jobs.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/public/cron/cron_run_jobs.php b/htdocs/public/cron/cron_run_jobs.php index fc8e15aeed6..e62e176ac6e 100644 --- a/htdocs/public/cron/cron_run_jobs.php +++ b/htdocs/public/cron/cron_run_jobs.php @@ -26,7 +26,7 @@ if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL','1'); // Disables token if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU','1'); if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML','1'); if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); -if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); +//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); if (! defined('NOLOGIN')) define('NOLOGIN','1'); //if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); From 1748f1d451821a34e58da4f2a1db6d7323e8de68 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 9 May 2017 16:52:03 +0200 Subject: [PATCH 039/299] Better tooltip for computed field --- htdocs/exports/export.php | 22 ++++++++++++++-------- htdocs/langs/en_US/exports.lang | 1 + htdocs/theme/eldy/style.css.php | 3 +++ htdocs/theme/md/style.css.php | 3 +++ 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/htdocs/exports/export.php b/htdocs/exports/export.php index e9f19f49ef4..43453041dfd 100644 --- a/htdocs/exports/export.php +++ b/htdocs/exports/export.php @@ -439,7 +439,7 @@ if ($step == 1 || ! $datatoexport) $h++; */ - dol_fiche_head($head, $hselected, $langs->trans("NewExport")); + dol_fiche_head($head, $hselected, $langs->trans("NewExport"), -1); print ''; @@ -609,7 +609,14 @@ if ($step == 2 && $datatoexport) $text=$langs->trans($label); $tablename=getablenamefromfield($code,$sqlmaxforexport); $htmltext =''.$langs->trans("Name").": ".$text.'
'; - $htmltext.=''.$langs->trans("Table")." -> ".$langs->trans("Field").": ".$tablename." -> ".preg_replace('/^.*\./','',$code)."
"; + if (! empty($objexport->array_export_special[0][$code])) + { + $htmltext.=''.$langs->trans("ComputedField")." -> ".$langs->trans("Method")." : ".$objexport->array_export_special[0][$code]."
"; + } + else + { + $htmltext.=''.$langs->trans("Table")." -> ".$langs->trans("Field").": ".$tablename." -> ".preg_replace('/^.*\./','',$code)."
"; + } if (! empty($objexport->array_export_examplevalues[0][$code])) { $htmltext.=$langs->trans("SourceExample").': '.$objexport->array_export_examplevalues[0][$code].'
'; @@ -645,9 +652,8 @@ if ($step == 2 && $datatoexport) /* * Barre d'action - * */ - print '
'; + print '
'; if (count($array_selected)) { @@ -828,7 +834,7 @@ if ($step == 3 && $datatoexport) /* * Barre d'action */ - print '
'; + print '
'; // il n'est pas obligatoire de filtrer les champs print ''.$langs->trans("NextStep").''; print '
'; @@ -883,14 +889,14 @@ if ($step == 4 && $datatoexport) print '
'; // Module - print ''; + print ''; print ''; // Lot de donnees a exporter - print ''; + print ''; print ''; // List of exported fields - print ''; + print ''; $list=''; foreach($array_selected as $code=>$value) { diff --git a/htdocs/langs/en_US/exports.lang b/htdocs/langs/en_US/exports.lang index a2e208673bd..4a1152e6581 100644 --- a/htdocs/langs/en_US/exports.lang +++ b/htdocs/langs/en_US/exports.lang @@ -120,6 +120,7 @@ SelectPrimaryColumnsForUpdateAttempt=Select column(s) to use as primary key for UpdateNotYetSupportedForThisImport=Update is not supported for this type of import (only insert) NoUpdateAttempt=No update attempt was performed, only insert ImportDataset_user_1=Users (employees or not) and properties +ComputedField=Computed field ## filters SelectFilterFields=If you want to filter on some values, just input values here. FilteredFields=Filtered fields diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 4672d99b8ec..9de83c3bd97 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -2006,6 +2006,9 @@ div.tabsAction { padding: 0em 0em; text-align: right; } +div.tabsActionNoBottom { + margin-bottom: 0px; +} div.tabsAction > a { margin-bottom: 16px !important; } diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 7818422d192..e6809a2c574 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -2011,6 +2011,9 @@ div.tabsAction { padding: 0em 0em; text-align: right; } +div.tabsActionNoBottom { + margin-bottom: 0px; +} div.tabsAction > a { margin-bottom: 16px !important; } From 0b97ee42cf4f278afa77836b7d12e8b633841367 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 9 May 2017 18:15:50 +0200 Subject: [PATCH 040/299] NEW Can use a credit note into a "down payment/deposit". --- htdocs/compta/facture/card.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 5d2ba74c48a..9483e79dba4 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -3156,7 +3156,7 @@ else if ($id > 0 || ! empty($ref)) $addabsolutediscount = '' . $langs->trans("EditGlobalDiscounts") . ''; $addcreditnote = '' . $langs->trans("AddCreditNote") . ''; - print '"; print ""; print ""; -print ""; +print ''; print '"; print ''; print ""; print ""; -print ""; +print ''; print ""; print ""; print ""; print ""; -print ""; +print ''; print ""; print ""; print ""; @@ -128,8 +128,8 @@ print ''; print '"; print ""; print ""; -print ""; -print '"; +print ''; +print '"; print "'; + if ($num < $limit && empty($offset)) print ''; else print ''; } elseif ($totalarray['totalhtfield'] == $i) print ''; diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index d85448397de..efb72afb7b7 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -991,7 +991,7 @@ if ($resql) $i++; if ($i == 1) { - if ($num < $limit) print ''; + if ($num < $limit && empty($offset)) print ''; else print ''; } elseif ($totalarray['totalhtfield'] == $i) print ''; diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 80601ec9727..e62ae11d5cd 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -1412,7 +1412,7 @@ if ($resql) $i++; if ($i == 1) { - if ($num < $limit) print ''; + if ($num < $limit && empty($offset)) print ''; else print ''; } elseif ($totalarray['totalhtfield'] == $i) print ''; diff --git a/htdocs/compta/bank/bankentries.php b/htdocs/compta/bank/bankentries.php index 72e82dd0dd7..4845012a3e0 100644 --- a/htdocs/compta/bank/bankentries.php +++ b/htdocs/compta/bank/bankentries.php @@ -1307,7 +1307,7 @@ if ($resql) $i++; if ($i == 1) { - if ($num < $limit) print ''; + if ($num < $limit && empty($offset)) print ''; else print ''; } elseif ($totalarray['totaldebfield'] == $i) print ''; diff --git a/htdocs/compta/bank/index.php b/htdocs/compta/bank/index.php index 012dfe42175..5f6e30016d4 100644 --- a/htdocs/compta/bank/index.php +++ b/htdocs/compta/bank/index.php @@ -607,7 +607,7 @@ if (isset($totalarray['totalbalancefield']) && $lastcurrencycode != 'various') / $i++; if ($i == 1) { - if ($num < $limit) print ''; + if ($num < $limit && empty($offset)) print ''; else print ''; } elseif ($totalarray['totalbalancefield'] == $i) print ''; diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index 693a6f39f97..c5fd9b80482 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -1117,7 +1117,7 @@ if ($resql) $i++; if ($i == 1) { - if ($num < $limit) print ''; + if ($num < $limit && empty($offset)) print ''; else print ''; } elseif ($totalarray['totalhtfield'] == $i) print ''; diff --git a/htdocs/compta/sociales/index.php b/htdocs/compta/sociales/index.php index 66d6a65dd56..e3f4a0b9b4d 100644 --- a/htdocs/compta/sociales/index.php +++ b/htdocs/compta/sociales/index.php @@ -274,7 +274,7 @@ if ($resql) if (isset($totalarray['totalttcfield'])) { print ''; - if ($num < $limit) print ''; + if ($num < $limit && empty($offset)) print ''; else print ''; print ''; print ''; diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index 58541330c83..ca7a52ad293 100644 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -694,7 +694,7 @@ if ($resql) $i++; if ($i == 1) { - if ($num < $limit) print ''; + if ($num < $limit && empty($offset)) print ''; else print ''; } elseif ($totalarray['totalhtfield'] == $i) print ''; diff --git a/htdocs/fichinter/list.php b/htdocs/fichinter/list.php index 9ef7d22ad10..bafafb40dd1 100644 --- a/htdocs/fichinter/list.php +++ b/htdocs/fichinter/list.php @@ -518,7 +518,7 @@ if ($result) $i++; if ($i == 1) { - if ($num < $limit) print ''; + if ($num < $limit && empty($offset)) print ''; else print ''; } elseif ($totalarray['totaldurationfield'] == $i) print ''; diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index 396d5ffd8a5..77064191d24 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -970,7 +970,7 @@ if ($resql) $i++; if ($i == 1) { - if ($num < $limit) print ''; + if ($num < $limit && empty($offset)) print ''; else print ''; } elseif ($totalarray['totalhtfield'] == $i) print ''; diff --git a/htdocs/product/stock/productlot_list.php b/htdocs/product/stock/productlot_list.php index 2910103e380..3d89aee0013 100644 --- a/htdocs/product/stock/productlot_list.php +++ b/htdocs/product/stock/productlot_list.php @@ -570,7 +570,7 @@ if ($resql) $i++; if ($i == 1) { - if ($num < $limit) print ''; + if ($num < $limit && empty($offset)) print ''; else print ''; } elseif ($totalarray['totalhtfield'] == $i) print ''; diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index 51f260cac6f..408031a9ed2 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -854,7 +854,7 @@ if (isset($totalarray['totaloppfield']) || isset($totalarray['totalbudgetfield'] $i++; if ($i == 1) { - if ($num < $limit) print ''; + if ($num < $limit && empty($offset)) print ''; else print ''; } elseif ($totalarray['totaloppfield'] == $i) print ''; diff --git a/htdocs/projet/tasks/list.php b/htdocs/projet/tasks/list.php index 30a89109115..482c7b6f446 100644 --- a/htdocs/projet/tasks/list.php +++ b/htdocs/projet/tasks/list.php @@ -811,7 +811,7 @@ if (isset($totalarray['totaldurationeffectivefield']) || isset($totalarray['tota $i++; if ($i == 1) { - if ($num < $limit) print ''; + if ($num < $limit && empty($offset)) print ''; else print ''; } elseif ($totalarray['totalplannedworkloadfield'] == $i) print ''; diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index 6cb52588a89..4c5d58dab7d 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -971,7 +971,7 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) $i++; if ($i == 1) { - if ($num < $limit) print ''; + if ($num < $limit && empty($offset)) print ''; else print ''; } elseif ($totalarray['totaldurationfield'] == $i) print ''; From 8e25155fc92bf2edc964a0c4ddbfce4dc7f0f7d9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 12:02:41 +0200 Subject: [PATCH 055/299] Better escaping of error message. --- htdocs/core/lib/functions.lib.php | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index ab75fce37e6..78fbca7b0b5 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -3105,18 +3105,17 @@ function dol_print_error($db='',$error='',$errors=null) { $out.="".$langs->trans("DatabaseTypeManager").": ".$db->type."
\n"; $out.="".$langs->trans("RequestLastAccessInError").": ".($db->lastqueryerror()?dol_escape_htmltag($db->lastqueryerror()):$langs->trans("ErrorNoRequestInError"))."
\n"; - $out.="".$langs->trans("ReturnCodeLastAccessInError").": ".($db->lasterrno()?$db->lasterrno():$langs->trans("ErrorNoRequestInError"))."
\n"; - $out.="".$langs->trans("InformationLastAccessInError").": ".($db->lasterror()?$db->lasterror():$langs->trans("ErrorNoRequestInError"))."
\n"; + $out.="".$langs->trans("ReturnCodeLastAccessInError").": ".($db->lasterrno()?dol_escape_htmltag($db->lasterrno()):$langs->trans("ErrorNoRequestInError"))."
\n"; + $out.="".$langs->trans("InformationLastAccessInError").": ".($db->lasterror()?dol_escape_htmltag($db->lasterror()):$langs->trans("ErrorNoRequestInError"))."
\n"; $out.="
\n"; } else // Mode CLI { - $out.='> '.$langs->transnoentities("DatabaseTypeManager").":\n".$db->type."\n"; - $out.='> '.$langs->transnoentities("RequestLastAccessInError").":\n".($db->lastqueryerror()?dol_escape_htmltag($db->lastqueryerror()):$langs->trans("ErrorNoRequestInError"))."\n"; - // To make detection of xss vulnerabilities or sql injection easier with a scanner, replace line with this one: - //$out.='> '.$langs->transnoentities("RequestLastAccessInError").":\n".($db->lastqueryerror()?$db->lastqueryerror:$langs->trans("ErrorNoRequestInError"))."\n"; - $out.='> '.$langs->transnoentities("ReturnCodeLastAccessInError").":\n".($db->lasterrno()?$db->lasterrno():$langs->trans("ErrorNoRequestInError"))."\n"; - $out.='> '.$langs->transnoentities("InformationLastAccessInError").":\n".($db->lasterror()?$db->lasterror():$langs->trans("ErrorNoRequestInError"))."\n"; + // No dol_escape_htmltag for output, we are in CLI mode + $out.='> '.$langs->transnoentities("DatabaseTypeManager").":\n".$db->type."\n"; + $out.='> '.$langs->transnoentities("RequestLastAccessInError").":\n".($db->lastqueryerror()?$db->lastqueryerror():$langs->transnoentities("ErrorNoRequestInError"))."\n"; + $out.='> '.$langs->transnoentities("ReturnCodeLastAccessInError").":\n".($db->lasterrno()?$db->lasterrno():$langs->transnoentities("ErrorNoRequestInError"))."\n"; + $out.='> '.$langs->transnoentities("InformationLastAccessInError").":\n".($db->lasterror()?$db->lasterror():$langs->transnoentities("ErrorNoRequestInError"))."\n"; } $syslog.=", sql=".$db->lastquery(); From fe053c86037d31a4592385e41fd5df46acb1603d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 12:02:41 +0200 Subject: [PATCH 056/299] Better escaping of error message. --- htdocs/core/lib/functions.lib.php | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 6b0b3112307..facc685d234 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -2938,18 +2938,17 @@ function dol_print_error($db='',$error='',$errors=null) { $out.="".$langs->trans("DatabaseTypeManager").": ".$db->type."
\n"; $out.="".$langs->trans("RequestLastAccessInError").": ".($db->lastqueryerror()?dol_escape_htmltag($db->lastqueryerror()):$langs->trans("ErrorNoRequestInError"))."
\n"; - $out.="".$langs->trans("ReturnCodeLastAccessInError").": ".($db->lasterrno()?$db->lasterrno():$langs->trans("ErrorNoRequestInError"))."
\n"; - $out.="".$langs->trans("InformationLastAccessInError").": ".($db->lasterror()?$db->lasterror():$langs->trans("ErrorNoRequestInError"))."
\n"; + $out.="".$langs->trans("ReturnCodeLastAccessInError").": ".($db->lasterrno()?dol_escape_htmltag($db->lasterrno()):$langs->trans("ErrorNoRequestInError"))."
\n"; + $out.="".$langs->trans("InformationLastAccessInError").": ".($db->lasterror()?dol_escape_htmltag($db->lasterror()):$langs->trans("ErrorNoRequestInError"))."
\n"; $out.="
\n"; } else // Mode CLI { - $out.='> '.$langs->transnoentities("DatabaseTypeManager").":\n".$db->type."\n"; - $out.='> '.$langs->transnoentities("RequestLastAccessInError").":\n".($db->lastqueryerror()?dol_escape_htmltag($db->lastqueryerror()):$langs->trans("ErrorNoRequestInError"))."\n"; - // To make detection of xss vulnerabilities or sql injection easier with a scanner, replace line with this one: - //$out.='> '.$langs->transnoentities("RequestLastAccessInError").":\n".($db->lastqueryerror()?$db->lastqueryerror:$langs->trans("ErrorNoRequestInError"))."\n"; - $out.='> '.$langs->transnoentities("ReturnCodeLastAccessInError").":\n".($db->lasterrno()?$db->lasterrno():$langs->trans("ErrorNoRequestInError"))."\n"; - $out.='> '.$langs->transnoentities("InformationLastAccessInError").":\n".($db->lasterror()?$db->lasterror():$langs->trans("ErrorNoRequestInError"))."\n"; + // No dol_escape_htmltag for output, we are in CLI mode + $out.='> '.$langs->transnoentities("DatabaseTypeManager").":\n".$db->type."\n"; + $out.='> '.$langs->transnoentities("RequestLastAccessInError").":\n".($db->lastqueryerror()?$db->lastqueryerror():$langs->transnoentities("ErrorNoRequestInError"))."\n"; + $out.='> '.$langs->transnoentities("ReturnCodeLastAccessInError").":\n".($db->lasterrno()?$db->lasterrno():$langs->transnoentities("ErrorNoRequestInError"))."\n"; + $out.='> '.$langs->transnoentities("InformationLastAccessInError").":\n".($db->lasterror()?$db->lasterror():$langs->transnoentities("ErrorNoRequestInError"))."\n"; } $syslog.=", sql=".$db->lastquery(); From 9b4b096e8679d89d936882eaf8f417a167677302 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 12:35:05 +0200 Subject: [PATCH 057/299] Debug variant module --- htdocs/variants/card.php | 20 +++---- htdocs/variants/create_val.php | 98 +++++++++++++++++++++++++--------- 2 files changed, 82 insertions(+), 36 deletions(-) diff --git a/htdocs/variants/card.php b/htdocs/variants/card.php index a611767cf2f..f5d35019971 100644 --- a/htdocs/variants/card.php +++ b/htdocs/variants/card.php @@ -19,13 +19,13 @@ require '../main.inc.php'; require 'class/ProductAttribute.class.php'; require 'class/ProductAttributeValue.class.php'; -$id = GETPOST('id'); -$valueid = GETPOST('valueid'); -$action = GETPOST('action'); -$label = GETPOST('label'); -$ref = GETPOST('ref'); -$confirm = GETPOST('confirm'); -$cancel = GETPOST('cancel'); +$id = GETPOST('id','int'); +$valueid = GETPOST('valueid','alpha'); +$action = GETPOST('action','alpha'); +$label = GETPOST('label','alpha'); +$ref = GETPOST('ref','alpha'); +$confirm = GETPOST('confirm','alpha'); +$cancel = GETPOST('cancel','alpha'); $object = new ProductAttribute($db); $objectval = new ProductAttributeValue($db); @@ -92,10 +92,10 @@ if ($confirm == 'yes') { setEventMessage($langs->trans('RecordSaved')); header('Location: '.dol_buildpath('/variants/list.php', 2)); } - exit(); - } elseif ($action == 'confirm_deletevalue') { - + } + elseif ($action == 'confirm_deletevalue') + { if ($objectval->fetch($valueid) > 0) { if ($objectval->delete() < 1) { diff --git a/htdocs/variants/create_val.php b/htdocs/variants/create_val.php index a5ee085cf40..2f463286787 100644 --- a/htdocs/variants/create_val.php +++ b/htdocs/variants/create_val.php @@ -1,5 +1,4 @@ * * This program is free software; you can redistribute it and/or modify @@ -20,83 +19,130 @@ require '../main.inc.php'; require 'class/ProductAttribute.class.php'; require 'class/ProductAttributeValue.class.php'; -$id = GETPOST('id'); -$ref = GETPOST('ref'); -$value = GETPOST('value'); +$id = GETPOST('id','int'); +$ref = GETPOST('ref','alpha'); +$value = GETPOST('value','alpha'); -$prodattr = new ProductAttribute($db); -$prodattrval = new ProductAttributeValue($db); +$action=GETPOST('action','alpha'); +$cancel=GETPOST('cancel','alpha'); +$backtopage=GETPOST('backtopage','alpha'); -if ($prodattr->fetch($id) < 1) { +$object = new ProductAttribute($db); +$objectval = new ProductAttributeValue($db); + +if ($object->fetch($id) < 1) { dol_print_error($db, $langs->trans('ErrorRecordNotFound')); exit(); } -if ($_POST) { +/* + * Actions + */ + +if ($cancel) +{ + $action=''; + header('Location: '.DOL_URL_ROOT.'/variants/card.php?id='.$object->id); + exit(); +} + +// None + + + +/* + * View + */ + +if ($action == 'add') +{ if (empty($ref) || empty($value)) { setEventMessage($langs->trans('ErrorFieldsRequired'), 'errors'); } else { - $prodattrval->fk_product_attribute = $prodattr->id; - $prodattrval->ref = $ref; - $prodattrval->value = $value; + $objectval->fk_product_attribute = $object->id; + $objectval->ref = $ref; + $objectval->value = $value; - if ($prodattrval->create() > 0) { + if ($objectval->create() > 0) { setEventMessage($langs->trans('RecordSaved')); - header('Location: '.dol_buildpath('/variants/card.php?id='.$prodattr->id, 2)); + header('Location: '.DOL_URL_ROOT.'/variants/card.php?id='.$object->id); exit(); } else { setEventMessage($langs->trans('ErrorCreatingProductAttributeValue'), 'errors'); } } - } $langs->load('products'); -$title = $langs->trans('ProductAttributeName', dol_htmlentities($prodattr->label)); +$title = $langs->trans('ProductAttributeName', dol_htmlentities($object->label)); llxHeader('', $title); -print_fiche_titre($title); +$h=0; +$head[$h][0] = DOL_URL_ROOT.'/variants/card.php?id='.$object->id; +$head[$h][1] = $langs->trans("Card"); +$head[$h][2] = 'variant'; +$h++; -dol_fiche_head(); +dol_fiche_head($head, 'variant', $langs->trans('ProductAttributeName'), -1, 'generic'); +print '
'; +print '
'; ?>
'.$langs->trans("Module").'
'.$langs->trans("Module").''; //print img_object($objexport->array_export_module[0]->getName(),$objexport->array_export_module[0]->picto).' '; print $objexport->array_export_module[0]->getName(); print '
'.$langs->trans("DatasetToExport").'
'.$langs->trans("DatasetToExport").''; $icon=preg_replace('/:.*$/','',$objexport->array_export_icon[0]); print img_object($objexport->array_export_module[0]->getName(), $icon).' '; @@ -898,7 +904,7 @@ if ($step == 4 && $datatoexport) print '
'.$langs->trans("ExportedFields").'
'.$langs->trans("ExportedFields").'
' . $langs->trans('Discounts'); + print '
' . $langs->trans('Discounts'); print ''; if ($soc->remise_percent) print $langs->trans("CompanyHasRelativeDiscount", $soc->remise_percent); @@ -3164,6 +3164,7 @@ else if ($id > 0 || ! empty($ref)) print $langs->trans("CompanyHasNoRelativeDiscount"); // print ' ('.$addrelativediscount.')'; + // Is there commercial discount or down payment available ? if ($absolute_discount > 0) { print '. '; if ($object->statut > 0 || $object->type == Facture::TYPE_CREDIT_NOTE || $object->type == Facture::TYPE_DEPOSIT) { @@ -3195,21 +3196,21 @@ else if ($id > 0 || ! empty($ref)) } else print '. '; } + // Is there credit notes availables ? if ($absolute_creditnote > 0) { // If validated, we show link "add credit note to payment" - if ($object->statut != 1 || $object->type == Facture::TYPE_CREDIT_NOTE || $object->type == Facture::TYPE_DEPOSIT) { + if ($object->statut != 1 || $object->type == Facture::TYPE_CREDIT_NOTE) { if ($object->statut == 0 && $object->type != Facture::TYPE_DEPOSIT) { $text = $langs->trans("CompanyHasCreditNote", price($absolute_creditnote), $langs->transnoentities("Currency" . $conf->currency)); print $form->textwithpicto($text, $langs->trans("CreditNoteDepositUse")); } else { print $langs->trans("CompanyHasCreditNote", price($absolute_creditnote), $langs->transnoentities("Currency" . $conf->currency)) . '.'; } - } else { - // Remise dispo de type avoir - if (! $absolute_discount) - print '
'; - // $form->form_remise_dispo($_SERVER["PHP_SELF"].'?facid='.$object->id, 0, 'remise_id_for_payment', $soc->id, $absolute_creditnote, $filtercreditnote, $resteapayer + } else { // We can add a credit note on a down payment or standard invoice or situation invoice + // There is credit notes discounts available + if (! $absolute_discount) print '
'; + // $form->form_remise_dispo($_SERVER["PHP_SELF"].'?facid='.$object->id, 0, 'remise_id_for_payment', $soc->id, $absolute_creditnote, $filtercreditnote, $resteapayer); $more=' ('.$addcreditnote.')'; $form->form_remise_dispo($_SERVER["PHP_SELF"] . '?facid=' . $object->id, 0, 'remise_id_for_payment', $soc->id, $absolute_creditnote, $filtercreditnote, 0, $more); // We allow credit note even if amount is higher } From 667e3c28764176781785e93caaebe086c3780b1a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 9 May 2017 19:26:28 +0200 Subject: [PATCH 041/299] Add another security sanitizing option --- htdocs/core/lib/functions.lib.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 8d14a377c75..e0c9d520eef 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -308,9 +308,17 @@ function GETPOST($paramname,$check='',$method=0,$filter=NULL,$options=NULL) if (! is_array($out) || empty($out)) $out=array(); break; case 'nohtml': - $out=dol_string_nohtmltag($out); + $out=dol_string_nohtmltag($out); break; - case 'custom': + case 'alphanohtml': // Recommended for search params + $out=trim($out); + // '"' is dangerous because param in url can close the href= or src= and add javascript functions. + // '../' is dangerous because it allows dir transversals + if (preg_match('/"/',$out)) $out=''; + else if (preg_match('/\.\.\//',$out)) $out=''; + $out=dol_string_nohtmltag($out); + break; + case 'custom': if (empty($filter)) return 'BadFourthParameterForGETPOST'; $out=filter_var($out, $filter, $options); break; From 6d01bd712db021a03a8bd78a461e63c26fa63e44 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 9 May 2017 19:36:10 +0200 Subject: [PATCH 042/299] FIX Better sanitizing of search all parameter. --- htdocs/adherents/list.php | 2 +- htdocs/comm/mailing/list.php | 4 ++-- htdocs/comm/propal/list.php | 2 +- htdocs/commande/list.php | 2 +- htdocs/commande/orderstoinvoice.php | 2 +- htdocs/compta/facture/list.php | 2 +- htdocs/contact/list.php | 2 +- htdocs/contrat/list.php | 2 +- htdocs/don/list.php | 2 +- htdocs/expedition/list.php | 2 +- htdocs/expensereport/list.php | 2 +- htdocs/fichinter/list.php | 2 +- htdocs/filefunc.inc.php | 17 ++++++++++------- htdocs/fourn/commande/list.php | 3 ++- htdocs/fourn/commande/orderstoinvoice.php | 2 +- htdocs/fourn/facture/list.php | 2 +- htdocs/holiday/list.php | 2 +- htdocs/main.inc.php | 14 +++++++++++--- .../product/actions_card_product.class.php | 2 +- htdocs/product/list.php | 2 +- htdocs/product/reassort.php | 2 +- htdocs/product/reassortlot.php | 2 +- htdocs/product/stock/list.php | 2 +- htdocs/product/stock/replenish.php | 2 +- htdocs/product/stock/replenishorders.php | 2 +- htdocs/product/stock/valo.php | 2 +- htdocs/projet/list.php | 3 +-- htdocs/projet/tasks/list.php | 2 +- htdocs/societe/list.php | 2 +- htdocs/supplier_proposal/list.php | 2 +- htdocs/user/group/index.php | 2 +- htdocs/user/hierarchy.php | 2 +- htdocs/user/index.php | 2 +- 33 files changed, 54 insertions(+), 43 deletions(-) diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php index 28cd8773d53..4eda43dcca5 100644 --- a/htdocs/adherents/list.php +++ b/htdocs/adherents/list.php @@ -57,7 +57,7 @@ $type=GETPOST("type"); $search_email=GETPOST("search_email"); $search_categ = GETPOST("search_categ",'int'); $catid = GETPOST("catid",'int'); -$sall=GETPOST("sall"); +$sall=GETPOST('sall', 'alphanohtml'); $optioncss = GETPOST('optioncss','alpha'); if ($statut < -1) $statut = ''; diff --git a/htdocs/comm/mailing/list.php b/htdocs/comm/mailing/list.php index 2d6fae37b98..7346c0045f5 100644 --- a/htdocs/comm/mailing/list.php +++ b/htdocs/comm/mailing/list.php @@ -41,8 +41,8 @@ $pagenext = $page + 1; if (! $sortorder) $sortorder="DESC"; if (! $sortfield) $sortfield="m.date_creat"; -$sall=GETPOST("sall","alpha"); -$sref=GETPOST("sref","alpha"); +$sall=GETPOST('sall', 'alphanohtml'); +$sref=GETPOST("sref", "alpha"); $filteremail=GETPOST('filteremail','alpha'); // Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index 44a2b9356e8..d85448397de 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -77,7 +77,7 @@ $viewstatut=GETPOST('viewstatut'); $optioncss = GETPOST('optioncss','alpha'); $object_statut=GETPOST('propal_statut'); -$sall=GETPOST("sall"); +$sall=GETPOST('sall', 'alphanohtml'); $mesg=(GETPOST("msg") ? GETPOST("msg") : GETPOST("mesg")); $day=GETPOST("day","int"); diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 073a20bc391..80601ec9727 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -71,7 +71,7 @@ $search_zip=GETPOST('search_zip','alpha'); $search_state=trim(GETPOST("search_state")); $search_country=GETPOST("search_country",'int'); $search_type_thirdparty=GETPOST("search_type_thirdparty",'int'); -$sall=GETPOST('sall'); +$sall=GETPOST('sall', 'alphanohtml'); $socid=GETPOST('socid','int'); $search_user=GETPOST('search_user','int'); $search_sale=GETPOST('search_sale','int'); diff --git a/htdocs/commande/orderstoinvoice.php b/htdocs/commande/orderstoinvoice.php index 009326f1f41..40071a0b21d 100644 --- a/htdocs/commande/orderstoinvoice.php +++ b/htdocs/commande/orderstoinvoice.php @@ -52,7 +52,7 @@ $action = GETPOST('action','alpha'); $confirm = GETPOST('confirm','alpha'); $sref = GETPOST('sref'); $sref_client = GETPOST('sref_client'); -$sall = GETPOST('sall'); +$sall = GETPOST('sall', 'alphanohtml'); $socid = GETPOST('socid','int'); $selected = GETPOST('orders_to_invoice'); $sortfield = GETPOST("sortfield",'alpha'); diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index 5dbbeb24e5a..cce94646616 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -52,7 +52,7 @@ $langs->load('bills'); $langs->load('companies'); $langs->load('products'); -$sall=trim(GETPOST('sall')); +$sall=trim(GETPOST('sall', 'alphanohtml')); $projectid=(GETPOST('projectid')?GETPOST('projectid','int'):0); $id=(GETPOST('id','int')?GETPOST('id','int'):GETPOST('facid','int')); // For backward compatibility diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index ae0f8f9398a..b425ea56667 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -42,7 +42,7 @@ $ref = ''; // There is no ref for contacts if ($user->societe_id) $socid=$user->societe_id; $result = restrictedArea($user, 'contact', $contactid,''); -$sall=GETPOST("sall"); +$sall=GETPOST('sall', 'alphanohtml'); $search_firstlast_only=GETPOST("search_firstlast_only"); $search_lastname=GETPOST("search_lastname"); $search_firstname=GETPOST("search_firstname"); diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php index 7436c16fe69..8a22f7ee324 100644 --- a/htdocs/contrat/list.php +++ b/htdocs/contrat/list.php @@ -53,7 +53,7 @@ $search_country=GETPOST("search_country",'int'); $search_type_thirdparty=GETPOST("search_type_thirdparty",'int'); $search_contract=GETPOST('search_contract'); $search_ref_supplier=GETPOST('search_ref_supplier','alpha'); -$sall=GETPOST('sall'); +$sall=GETPOST('sall', 'alphanohtml'); $search_status=GETPOST('search_status'); $socid=GETPOST('socid'); $search_user=GETPOST('search_user','int'); diff --git a/htdocs/don/list.php b/htdocs/don/list.php index d925573b859..1b490b34085 100644 --- a/htdocs/don/list.php +++ b/htdocs/don/list.php @@ -43,7 +43,7 @@ if (! $sortorder) $sortorder="DESC"; if (! $sortfield) $sortfield="d.datedon"; $statut=isset($_GET["statut"])?$_GET["statut"]:"-1"; -$search_all=GETPOST('sall','alpha'); +$search_all=GETPOST('sall', 'alphanohtml'); $search_ref=GETPOST('search_ref','alpha'); $search_company=GETPOST('search_company','alpha'); $search_name=GETPOST('search_name','alpha'); diff --git a/htdocs/expedition/list.php b/htdocs/expedition/list.php index 65d7fd5223e..68f3add0229 100644 --- a/htdocs/expedition/list.php +++ b/htdocs/expedition/list.php @@ -50,7 +50,7 @@ $search_zip=GETPOST('search_zip','alpha'); $search_state=trim(GETPOST("search_state")); $search_country=GETPOST("search_country",'int'); $search_type_thirdparty=GETPOST("search_type_thirdparty",'int'); -$sall = GETPOST('sall'); +$sall = GETPOST('sall', 'alphanohtml'); $optioncss = GETPOST('optioncss','alpha'); $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit; diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index 13b95311dee..58541330c83 100644 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -63,7 +63,7 @@ if (!$sortorder) $sortorder="DESC"; if (!$sortfield) $sortfield="d.date_debut"; -$sall = GETPOST('sall'); +$sall = GETPOST('sall', 'alphanohtml'); $search_ref = GETPOST('search_ref'); $search_user = GETPOST('search_user','int'); $search_amount_ht = GETPOST('search_amount_ht','alpha'); diff --git a/htdocs/fichinter/list.php b/htdocs/fichinter/list.php index 563c57f5ad7..9ef7d22ad10 100644 --- a/htdocs/fichinter/list.php +++ b/htdocs/fichinter/list.php @@ -62,7 +62,7 @@ $search_ref=GETPOST('search_ref')?GETPOST('search_ref','alpha'):GETPOST('search_ $search_company=GETPOST('search_company','alpha'); $search_desc=GETPOST('search_desc','alpha'); $search_status=GETPOST('search_status'); -$sall=GETPOST('sall'); +$sall=GETPOST('sall', 'alphanohtml'); $optioncss = GETPOST('optioncss','alpha'); // Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array diff --git a/htdocs/filefunc.inc.php b/htdocs/filefunc.inc.php index 427f428d652..59a3bd3a809 100644 --- a/htdocs/filefunc.inc.php +++ b/htdocs/filefunc.inc.php @@ -164,14 +164,17 @@ if (empty($multicompany_force_entity)) $multicompany_force_entity=0; // To force // This test check if referrer ($_SERVER['HTTP_REFERER']) is same web site than Dolibarr ($_SERVER['HTTP_HOST']) // when we post forms (we allow GET to allow direct link to access a particular page). // Note about $_SERVER[HTTP_HOST/SERVER_NAME]: http://shiflett.org/blog/2006/mar/server-name-versus-http-host -if (! defined('NOCSRFCHECK') && empty($dolibarr_nocsrfcheck) - && ! empty($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] != 'GET' && ! empty($_SERVER['HTTP_HOST']) - && (empty($_SERVER['HTTP_REFERER']) || ! preg_match('/'.preg_quote($_SERVER['HTTP_HOST'],'/').'/i', $_SERVER['HTTP_REFERER']))) +if (! defined('NOCSRFCHECK') && empty($dolibarr_nocsrfcheck)) { - //print 'NOCSRFCHECK='.defined('NOCSRFCHECK').' REQUEST_METHOD='.$_SERVER['REQUEST_METHOD'].' HTTP_POST='.$_SERVER['HTTP_HOST'].' HTTP_REFERER='.$_SERVER['HTTP_REFERER']; - print "Access refused by CSRF protection in main.inc.php.\n"; - print "If you access your server behind a proxy using url rewriting, you might add the line \$dolibarr_nocsrfcheck=1 into your conf.php file.\n"; - die; + if (! empty($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] != 'GET' && ! empty($_SERVER['HTTP_HOST']) + && (empty($_SERVER['HTTP_REFERER']) || ! preg_match('/'.preg_quote($_SERVER['HTTP_HOST'],'/').'/i', $_SERVER['HTTP_REFERER']))) + { + //print 'NOCSRFCHECK='.defined('NOCSRFCHECK').' REQUEST_METHOD='.$_SERVER['REQUEST_METHOD'].' HTTP_POST='.$_SERVER['HTTP_HOST'].' HTTP_REFERER='.$_SERVER['HTTP_REFERER']; + print "Access refused by CSRF protection in main.inc.php. Referer of form is outside server that serve the POST.\n"; + print "If you access your server behind a proxy using url rewriting, you might check that all HTTP header is propagated (or add the line \$dolibarr_nocsrfcheck=1 into your conf.php file).\n"; + die; + } + // Another test is done later on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on. } if (empty($dolibarr_main_db_host)) { diff --git a/htdocs/fourn/commande/list.php b/htdocs/fourn/commande/list.php index 49de2dac7a3..42773058471 100644 --- a/htdocs/fourn/commande/list.php +++ b/htdocs/fourn/commande/list.php @@ -54,6 +54,8 @@ $orderday=GETPOST("orderday","int"); $deliveryyear=GETPOST("deliveryyear","int"); $deliverymonth=GETPOST("deliverymonth","int"); $deliveryday=GETPOST("deliveryday","int"); + +$sall=GETPOST('search_all', 'alphanohtml'); $search_product_category=GETPOST('search_product_category','int'); $search_ref=GETPOST('search_ref'); $search_refsupp=GETPOST('search_refsupp'); @@ -69,7 +71,6 @@ $search_ht=GETPOST('search_ht'); $search_ttc=GETPOST('search_ttc'); $search_status=(GETPOST('search_status','alpha')!=''?GETPOST('search_status','alpha'):GETPOST('statut','alpha')); // alpha and not intbecause it can be '6,7' $optioncss = GETPOST('optioncss','alpha'); -$sall=GETPOST('search_all'); $socid = GETPOST('socid','int'); $search_sale=GETPOST('search_sale','int'); $search_total_ht=GETPOST('search_total_ht','alpha'); diff --git a/htdocs/fourn/commande/orderstoinvoice.php b/htdocs/fourn/commande/orderstoinvoice.php index f804a1d9ab7..32f1a5538b5 100644 --- a/htdocs/fourn/commande/orderstoinvoice.php +++ b/htdocs/fourn/commande/orderstoinvoice.php @@ -53,7 +53,7 @@ $action = GETPOST('action', 'alpha'); $confirm = GETPOST('confirm', 'alpha'); $sref = GETPOST('sref'); $sref_client = GETPOST('sref_client'); -$sall = GETPOST('sall'); +$sall = GETPOST('sall', 'alphanohtml'); $socid = GETPOST('socid', 'int'); $selected = GETPOST('orders_to_invoice'); $sortfield = GETPOST("sortfield", 'alpha'); diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index 3afb97c5fb1..396d5ffd8a5 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -88,7 +88,7 @@ $toselect = GETPOST('toselect', 'array'); $option = GETPOST('option'); if ($option == 'late') $filter = 'paye:0'; -$search_all = GETPOST('sall'); +$search_all = GETPOST('sall', 'alphanohtml'); $search_label = GETPOST("search_label","alpha"); $search_company = GETPOST("search_company","alpha"); $search_amount_no_tax = GETPOST("search_amount_no_tax","alpha"); diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index 131dcc3651b..1ab8fbd785f 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -55,7 +55,7 @@ $pagenext = $page + 1; $id = GETPOST('id','int'); -$sall = GETPOST('sall'); +$sall = GETPOST('sall', 'alphanohtml'); $search_ref = GETPOST('search_ref'); $month_create = GETPOST('month_create'); $year_create = GETPOST('year_create'); diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index dd45222fa42..9d97770e48a 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -298,16 +298,24 @@ if ((! empty($conf->global->MAIN_VERSION_LAST_UPGRADE) && ($conf->global->MAIN_V // Creation of a token against CSRF vulnerabilities if (! defined('NOTOKENRENEWAL')) { - $token = dol_hash(uniqid(mt_rand(),TRUE)); // Generates a hash of a random number // roulement des jetons car cree a chaque appel if (isset($_SESSION['newtoken'])) $_SESSION['token'] = $_SESSION['newtoken']; + + // Save in $_SESSION['newtoken'] what will be next token. Into forms, we will add param token = $_SESSION['newtoken'] + $token = dol_hash(uniqid(mt_rand(),TRUE)); // Generates a hash of a random number $_SESSION['newtoken'] = $token; } if (! defined('NOCSRFCHECK') && empty($dolibarr_nocsrfcheck) && ! empty($conf->global->MAIN_SECURITY_CSRF_WITH_TOKEN)) // Check validity of token, only if option enabled (this option breaks some features sometimes) { - if ($_SERVER['REQUEST_METHOD'] === 'POST') + if ($_SERVER['REQUEST_METHOD'] == 'POST' && ! GETPOST('token')) // Note, offender can still send request by GET { - if (GETPOST('token') != $_SESSION['token']) + print "Access refused by CSRF protection in main.inc.php. Token not provided.\n"; + print "If you access your server behind a proxy using url rewriting, you might check that all HTTP header is propagated (or add the line \$dolibarr_nocsrfcheck=1 into your conf.php file).\n"; + die; + } + if ($_SERVER['REQUEST_METHOD'] === 'POST') // This test must be after loading $_SESSION['token']. + { + if (GETPOST('token', 'alpha') != $_SESSION['token']) { dol_syslog("Invalid token in ".$_SERVER['HTTP_REFERER'].", action=".GETPOST('action').", _POST['token']=".GETPOST('token').", _SESSION['token']=".$_SESSION['token'], LOG_WARNING); //print 'Unset POST by CSRF protection in main.inc.php.'; // Do not output anything because this create problems when using the BACK button on browsers. diff --git a/htdocs/product/canvas/product/actions_card_product.class.php b/htdocs/product/canvas/product/actions_card_product.class.php index 06803e8239d..8db1ae21469 100644 --- a/htdocs/product/canvas/product/actions_card_product.class.php +++ b/htdocs/product/canvas/product/actions_card_product.class.php @@ -326,7 +326,7 @@ class ActionsCardProduct $this->list_datas = array(); // Clean parameters - $sall=trim(GETPOST("sall")); + $sall=trim(GETPOST('sall', 'alphanohtml')); foreach($this->field_list as $field) { diff --git a/htdocs/product/list.php b/htdocs/product/list.php index 9efdca6a4d0..1aec109474e 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -49,7 +49,7 @@ $action = GETPOST('action'); $sref=GETPOST("sref"); $sbarcode=GETPOST("sbarcode"); $snom=GETPOST("snom"); -$sall=GETPOST("sall"); +$sall=GETPOST('sall', 'alphanohtml'); $type=GETPOST("type","int"); $search_sale = GETPOST("search_sale"); $search_categ = GETPOST("search_categ",'int'); diff --git a/htdocs/product/reassort.php b/htdocs/product/reassort.php index 13bc0fef186..e3e9af6a61a 100644 --- a/htdocs/product/reassort.php +++ b/htdocs/product/reassort.php @@ -42,7 +42,7 @@ $result=restrictedArea($user,'produit|service'); $action=GETPOST('action','alpha'); $sref=GETPOST("sref"); $snom=GETPOST("snom"); -$sall=GETPOST("sall"); +$sall=GETPOST('sall', 'alphanohtml'); $type=GETPOST("type","int"); $sbarcode=GETPOST("sbarcode"); $catid=GETPOST('catid','int'); diff --git a/htdocs/product/reassortlot.php b/htdocs/product/reassortlot.php index 01285f09417..40b96c24db1 100644 --- a/htdocs/product/reassortlot.php +++ b/htdocs/product/reassortlot.php @@ -44,7 +44,7 @@ $result=restrictedArea($user,'produit|service'); $action=GETPOST('action','alpha'); $sref=GETPOST("sref"); $snom=GETPOST("snom"); -$sall=GETPOST("sall"); +$sall=GETPOST('sall', 'alphanohtml'); $type=GETPOST("type","int"); $sbarcode=GETPOST("sbarcode",'alpha'); $search_warehouse=GETPOST('search_warehouse','alpha'); diff --git a/htdocs/product/stock/list.php b/htdocs/product/stock/list.php index 0bfd9048352..ed1b91b4ad5 100644 --- a/htdocs/product/stock/list.php +++ b/htdocs/product/stock/list.php @@ -32,9 +32,9 @@ $langs->load("stocks"); // Security check $result=restrictedArea($user,'stock'); +$sall=GETPOST('sall', 'alphanohtml'); $search_ref=GETPOST("sref","alpha")?GETPOST("sref","alpha"):GETPOST("search_ref","alpha"); $search_label=GETPOST("snom","alpha")?GETPOST("snom","alpha"):GETPOST("search_label","alpha"); -$sall=GETPOST("sall","alpha"); $search_status=GETPOST("search_status","int"); $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit; diff --git a/htdocs/product/stock/replenish.php b/htdocs/product/stock/replenish.php index 437361b5cf5..26c6ab1dfd1 100644 --- a/htdocs/product/stock/replenish.php +++ b/htdocs/product/stock/replenish.php @@ -48,7 +48,7 @@ $result=restrictedArea($user,'produit|service'); $action = GETPOST('action','alpha'); $sref = GETPOST('sref', 'alpha'); $snom = GETPOST('snom', 'alpha'); -$sall = GETPOST('sall', 'alpha'); +$sall = GETPOST('sall', 'alphanohtml'); $type = GETPOST('type','int'); $tobuy = GETPOST('tobuy', 'int'); $salert = GETPOST('salert', 'alpha'); diff --git a/htdocs/product/stock/replenishorders.php b/htdocs/product/stock/replenishorders.php index 4986d7c524d..5b1fda0371f 100644 --- a/htdocs/product/stock/replenishorders.php +++ b/htdocs/product/stock/replenishorders.php @@ -39,11 +39,11 @@ $langs->load("orders"); if ($user->societe_id) $socid=$user->societe_id; $result=restrictedArea($user,'produit|service'); +$sall = GETPOST('search_all', 'alphanohtml'); $sref = GETPOST('search_ref', 'alpha'); $snom = GETPOST('search_nom', 'alpha'); $suser = GETPOST('search_user', 'alpha'); $sttc = GETPOST('search_ttc', 'alpha'); -$sall = GETPOST('search_all', 'alpha'); $sdate = GETPOST('search_date', 'alpha'); $page = GETPOST('page', 'int'); $sproduct = GETPOST('sproduct', 'int'); diff --git a/htdocs/product/stock/valo.php b/htdocs/product/stock/valo.php index be56636ee57..b13dd0bd27e 100644 --- a/htdocs/product/stock/valo.php +++ b/htdocs/product/stock/valo.php @@ -33,7 +33,7 @@ $result=restrictedArea($user,'stock'); $sref=GETPOST("sref"); $snom=GETPOST("snom"); -$sall=GETPOST("sall"); +$sall=GETPOST('sall', 'alphanohtml'); $sortfield = GETPOST("sortfield"); $sortorder = GETPOST("sortorder"); diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index dadc199d146..51f260cac6f 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -62,13 +62,12 @@ $offset = $limit * $page ; $pageprev = $page - 1; $pagenext = $page + 1; -$search_all=GETPOST("search_all"); +$search_all=GETPOST('search_all', 'alphanohtml'); $search_categ=GETPOST("search_categ",'alpha'); $search_ref=GETPOST("search_ref"); $search_label=GETPOST("search_label"); $search_societe=GETPOST("search_societe"); $search_year=GETPOST("search_year"); -$search_all=GETPOST("search_all"); $search_status=GETPOST("search_status",'int'); $search_opp_status=GETPOST("search_opp_status",'alpha'); $search_opp_percent=GETPOST("search_opp_percent",'alpha'); diff --git a/htdocs/projet/tasks/list.php b/htdocs/projet/tasks/list.php index 74f9b122f14..30a89109115 100644 --- a/htdocs/projet/tasks/list.php +++ b/htdocs/projet/tasks/list.php @@ -36,7 +36,7 @@ $langs->load('companies'); $id=GETPOST('id','int'); -$search_all=GETPOST('search_all'); +$search_all=GETPOST('search_all', 'alphanohtml'); $search_project=GETPOST('search_project'); if (! isset($_GET['search_projectstatus']) && ! isset($_POST['search_projectstatus'])) { diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index 393d3a1fad4..0a79921d153 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -48,7 +48,7 @@ $socid = GETPOST('socid','int'); if ($user->societe_id) $socid=$user->societe_id; $result = restrictedArea($user,'societe',$socid,''); -$search_all=trim(GETPOST("sall")); +$search_all=trim(GETPOST('sall', 'alphanohtml')); $search_nom=trim(GETPOST("search_nom")); $search_nom_only=trim(GETPOST("search_nom_only")); $search_barcode=trim(GETPOST("sbarcode")); diff --git a/htdocs/supplier_proposal/list.php b/htdocs/supplier_proposal/list.php index caf79597e53..7a841a13b19 100644 --- a/htdocs/supplier_proposal/list.php +++ b/htdocs/supplier_proposal/list.php @@ -66,7 +66,7 @@ $search_author=GETPOST('search_author','alpha'); $search_status=GETPOST('viewstatut','alpha')?GETPOST('viewstatut','alpha'):GETPOST('search_status','int'); $object_statut=$db->escape(GETPOST('supplier_proposal_statut')); -$sall=GETPOST("sall"); +$sall=GETPOST('sall', 'alphanohtml'); $mesg=(GETPOST("msg") ? GETPOST("msg") : GETPOST("mesg")); $year=GETPOST("year"); $month=GETPOST("month"); diff --git a/htdocs/user/group/index.php b/htdocs/user/group/index.php index 94c12147f1a..12e51a79d0f 100644 --- a/htdocs/user/group/index.php +++ b/htdocs/user/group/index.php @@ -34,7 +34,7 @@ if (! empty($conf->global->MAIN_USE_ADVANCED_PERMS)) $langs->load("users"); -$sall=GETPOST('sall'); +$sall=GETPOST('sall', 'alphanohtml'); $search_group=GETPOST('search_group'); $optioncss = GETPOST('optioncss','alpha'); diff --git a/htdocs/user/hierarchy.php b/htdocs/user/hierarchy.php index bb558bd56b3..2bba66d464e 100644 --- a/htdocs/user/hierarchy.php +++ b/htdocs/user/hierarchy.php @@ -39,7 +39,7 @@ $socid=0; if ($user->societe_id > 0) $socid = $user->societe_id; -$sall=GETPOST('sall','alpha'); +$sall=GETPOST('sall', 'alphanohtml'); $search_user=GETPOST('search_user','alpha'); $userstatic=new User($db); diff --git a/htdocs/user/index.php b/htdocs/user/index.php index 623e2df3434..9e7c78f9799 100644 --- a/htdocs/user/index.php +++ b/htdocs/user/index.php @@ -110,7 +110,7 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab } // Init search fields -$sall=GETPOST('sall','alpha'); +$sall=GETPOST('sall', 'alphanohtml'); $search_user=GETPOST('search_user','alpha'); $search_login=GETPOST('search_login','alpha'); $search_lastname=GETPOST('search_lastname','alpha'); From 39b45498134612f0f6c57d2d64258e74de2c74ed Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 9 May 2017 19:43:50 +0200 Subject: [PATCH 043/299] Make option MAIN_SECURITY_CSRF_WITH_TOKEN more visible --- htdocs/install/mysql/data/llx_const.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/install/mysql/data/llx_const.sql b/htdocs/install/mysql/data/llx_const.sql index b34e0cac513..bf76d378789 100644 --- a/htdocs/install/mysql/data/llx_const.sql +++ b/htdocs/install/mysql/data/llx_const.sql @@ -35,6 +35,7 @@ insert into llx_const (name, value, type, note, visible, entity) values ('MAIN_N insert into llx_const (name, value, type, note, visible, entity) values ('MAIN_FEATURES_LEVEL','0','chaine','Level of features to show: -1=stable+deprecated, 0=stable only (default), 1=stable+experimental, 2=stable+experimental+development',1,0); insert into llx_const (name, value, type, note, visible, entity) values ('MAILING_LIMIT_SENDBYWEB','25','chaine','Number of targets to defined packet size when sending mass email',1,0); insert into llx_const (name, value, type, note, visible, entity) values ('MAIN_ENABLE_LOG_TO_HTML','0','chaine','If this option is set to 1, it is possible to see log output at end of HTML sources by adding paramater logtohtml=1 on URL. Module log must also be enabled.',1,0); +insert into llx_const (name, value, type, note, visible, entity) values ('MAIN_SECURITY_CSRF_WITH_TOKEN','0','chaine','If this option is set to 1, a CSRF protection using an antiCSRF token is added.',1,0); -- Hidden and common to all entities insert into llx_const (name, value, type, note, visible, entity) values ('SYSLOG_HANDLERS','["mod_syslog_file"]','chaine','Which logger to use',0,0); From b8b91db0071e8e660bffe0b23b760f77641464ed Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 9 May 2017 21:01:37 +0200 Subject: [PATCH 044/299] Use function top_httphead to include headers in pages. --- htdocs/admin/agenda_xcal.php | 10 +++++----- htdocs/cashdesk/affIndex.php | 3 --- htdocs/cashdesk/facturation_dhtml.php | 3 +-- htdocs/cashdesk/tpl/ticket.tpl.php | 3 ++- htdocs/core/ajax/check_notifications.php | 7 +++++++ htdocs/core/antispamimage.php | 3 ++- htdocs/core/js/datepicker.js.php | 2 +- htdocs/core/js/lib_head.js.php | 2 +- htdocs/core/js/lib_notification.js.php | 11 ++++++----- htdocs/core/js/select2_locale.js.php | 2 +- htdocs/core/js/timepicker.js.php | 2 +- htdocs/core/lib/functions.lib.php | 6 +++--- htdocs/document.php | 2 +- htdocs/install/inc.php | 3 ++- htdocs/main.inc.php | 18 ++++++++++++------ htdocs/paybox/lib/paybox.lib.php | 6 ++++-- htdocs/paypal/lib/paypal.lib.php | 3 ++- htdocs/projet/jsgantt_language.js.php | 4 ++-- htdocs/support/inc.php | 3 ++- htdocs/theme/eldy/style.css.php | 2 +- htdocs/theme/md/style.css.php | 2 +- htdocs/viewimage.php | 4 ++-- 22 files changed, 59 insertions(+), 42 deletions(-) diff --git a/htdocs/admin/agenda_xcal.php b/htdocs/admin/agenda_xcal.php index 0e66125ba7c..1895eb5b15d 100644 --- a/htdocs/admin/agenda_xcal.php +++ b/htdocs/admin/agenda_xcal.php @@ -97,7 +97,7 @@ print "
".$langs->trans("Value")." 
'.$langs->trans("PasswordTogetVCalExport")."'; if (! empty($conf->use_javascript_ajax)) @@ -106,13 +106,13 @@ print ' 
".$langs->trans("PastDelayVCalExport")."global->MAIN_AGENDA_EXPORT_PAST_DELAY) . "\" size=\"10\"> ".$langs->trans("days")." 
".$langs->trans("UseACacheDelay")."global->MAIN_AGENDA_EXPORT_CACHE) . "\" size=\"10\"> 
'.$langs->trans("Parameter")."".$langs->trans("Value")."
'.$langs->trans("FixTZ")."
'.$langs->trans("FixTZ").""; print ''; print '   '.$langs->trans("FillThisOnlyIfRequired"); diff --git a/htdocs/cashdesk/affIndex.php b/htdocs/cashdesk/affIndex.php index 6b1d13f719f..b5432b94eec 100644 --- a/htdocs/cashdesk/affIndex.php +++ b/htdocs/cashdesk/affIndex.php @@ -45,9 +45,6 @@ $langs->load("cashdesk"); $form = new Form($db); -//header("Content-type: text/html; charset=UTF-8"); -//header("Content-type: text/html; charset=".$conf->file->character_set_client); - $arrayofjs=array(); $arrayofcss=array('/cashdesk/css/style.css'); diff --git a/htdocs/cashdesk/facturation_dhtml.php b/htdocs/cashdesk/facturation_dhtml.php index 8d4ebf8af31..3046644c35e 100644 --- a/htdocs/cashdesk/facturation_dhtml.php +++ b/htdocs/cashdesk/facturation_dhtml.php @@ -39,8 +39,7 @@ if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/cashdesk/include/environnement.php'; -//header("Content-type: text/html; charset=UTF-8"); -header("Content-type: text/html; charset=".$conf->file->character_set_client); +top_httphead('text/html'); $search = GETPOST("code", "alpha"); diff --git a/htdocs/cashdesk/tpl/ticket.tpl.php b/htdocs/cashdesk/tpl/ticket.tpl.php index 40be470c429..82b84ba3b56 100644 --- a/htdocs/cashdesk/tpl/ticket.tpl.php +++ b/htdocs/cashdesk/tpl/ticket.tpl.php @@ -20,7 +20,8 @@ include_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; $langs->load("main"); $langs->load('cashdesk'); -header("Content-type: text/html; charset=".$conf->file->character_set_client); + +top_httphead('text/html'); $facid=GETPOST('facid','int'); $object=new Facture($db); diff --git a/htdocs/core/ajax/check_notifications.php b/htdocs/core/ajax/check_notifications.php index fa3edd7a4be..332626fbabd 100644 --- a/htdocs/core/ajax/check_notifications.php +++ b/htdocs/core/ajax/check_notifications.php @@ -24,6 +24,13 @@ if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); require '../../main.inc.php'; + +/* + * View + */ + +top_httphead('text/html'); // TODO Use a json mime type + global $user, $db, $langs, $conf; $time = (int) GETPOST('time'); // Use the time parameter that is always increased by time_update, even if call is late diff --git a/htdocs/core/antispamimage.php b/htdocs/core/antispamimage.php index a16844dd715..816763eeaf5 100644 --- a/htdocs/core/antispamimage.php +++ b/htdocs/core/antispamimage.php @@ -58,7 +58,8 @@ if (empty($img)) exit; } -header("Content-type: image/png"); +// Define mime type +top_httphead('image/png'); $background_color = imagecolorallocate($img, 250, 250, 250); $ecriture_color = imagecolorallocate($img, 0, 0, 0); diff --git a/htdocs/core/js/datepicker.js.php b/htdocs/core/js/datepicker.js.php index 02666409fc3..50c140f6f82 100644 --- a/htdocs/core/js/datepicker.js.php +++ b/htdocs/core/js/datepicker.js.php @@ -37,7 +37,7 @@ session_cache_limiter(FALSE); require_once '../../main.inc.php'; // Define javascript type -header('Content-type: text/javascript; charset=UTF-8'); +top_httphead('text/javascript; charset=UTF-8'); // Important: Following code is to avoid page request by browser and PHP CPU at each Dolibarr page access. if (empty($dolibarr_nocache)) header('Cache-Control: max-age=3600, public, must-revalidate'); else header('Cache-Control: no-cache'); diff --git a/htdocs/core/js/lib_head.js.php b/htdocs/core/js/lib_head.js.php index 8909f446812..e604f3281f9 100644 --- a/htdocs/core/js/lib_head.js.php +++ b/htdocs/core/js/lib_head.js.php @@ -39,7 +39,7 @@ session_cache_limiter(FALSE); require_once '../../main.inc.php'; // Define javascript type -header('Content-type: text/javascript; charset=UTF-8'); +top_httphead('text/javascript; charset=UTF-8'); // Important: Following code is to avoid page request by browser and PHP CPU at each Dolibarr page access. if (empty($dolibarr_nocache)) header('Cache-Control: max-age=3600, public, must-revalidate'); else header('Cache-Control: no-cache'); diff --git a/htdocs/core/js/lib_notification.js.php b/htdocs/core/js/lib_notification.js.php index a3b90a35db6..b640f4cc81b 100644 --- a/htdocs/core/js/lib_notification.js.php +++ b/htdocs/core/js/lib_notification.js.php @@ -33,21 +33,22 @@ if (! ($_SERVER['HTTP_REFERER'] === $dolibarr_main_url_root . '/' || $_SERVER['H { global $langs, $conf; - // Define javascript type - header('Content-type: text/javascript; charset=UTF-8'); - + top_httphead('text/javascript; charset=UTF-8'); + $nowtime = time(); //$nowtimeprevious = floor($nowtime / 60) * 60; // auto_check_events_not_before is rounded to previous minute // TODO Try to make a solution with only a javascript timer that is easier. Difficulty is to avoid notification twice when. + /* session already started into main session_cache_limiter(FALSE); header('Cache-Control: no-cache'); - session_start(); + session_set_cookie_params(0, '/', null, false, true); // Add tag httponly on session cookie + session_start();*/ if (! isset($_SESSION['auto_check_events_not_before'])) { print 'console.log("_SESSION[auto_check_events_not_before] is not set");'."\n"; // Round to eliminate the seconds - $_SESSION['auto_check_events_not_before'] = $nowtime; // auto_check_events_not_before is rounded to previous minute + $_SESSION['auto_check_events_not_before'] = $nowtime; } print 'var nowtime = ' . $nowtime . ';' . "\n"; print 'var login = \'' . $_SESSION['dol_login'] . '\';' . "\n"; diff --git a/htdocs/core/js/select2_locale.js.php b/htdocs/core/js/select2_locale.js.php index 31c6a91bc74..aa62b5a0ec1 100644 --- a/htdocs/core/js/select2_locale.js.php +++ b/htdocs/core/js/select2_locale.js.php @@ -37,7 +37,7 @@ session_cache_limiter(FALSE); require_once '../../main.inc.php'; // Define javascript type -header('Content-type: text/javascript; charset=UTF-8'); +top_httphead('text/javascript; charset=UTF-8'); // Important: Following code is to avoid page request by browser and PHP CPU at each Dolibarr page access. if (empty($dolibarr_nocache)) header('Cache-Control: max-age=3600, public, must-revalidate'); else header('Cache-Control: no-cache'); diff --git a/htdocs/core/js/timepicker.js.php b/htdocs/core/js/timepicker.js.php index cc33a5a3933..8342ac9e3ac 100644 --- a/htdocs/core/js/timepicker.js.php +++ b/htdocs/core/js/timepicker.js.php @@ -37,7 +37,7 @@ session_cache_limiter(FALSE); require_once '../../main.inc.php'; // Define javascript type -header('Content-type: text/javascript; charset=UTF-8'); +top_httphead('text/javascript; charset=UTF-8'); // Important: Following code is to avoid page request by browser and PHP CPU at each Dolibarr page access. if (empty($dolibarr_nocache)) header('Cache-Control: max-age=3600, public, must-revalidate'); else header('Cache-Control: no-cache'); diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index e3c6cb7d5cd..8dbc705c5b2 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -400,11 +400,11 @@ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) /** - * Return a prefix to use for this Dolibarr instance for session or cookie names. + * Return a prefix to use for this Dolibarr instance, for session/cookie names or email id. * This prefix is unique for instance and avoid conflict between multi-instances, - * even when having two instances with one root dir or two instances in virtual servers + * even when having two instances with one root dir or two instances in virtual servers. * - * @param string $mode '' or 'email' + * @param string $mode '' (prefix for session name) or 'email' (prefix for email id) * @return string A calculated prefix */ function dol_getprefix($mode='') diff --git a/htdocs/document.php b/htdocs/document.php index 02eb7193675..4e4f18826ef 100644 --- a/htdocs/document.php +++ b/htdocs/document.php @@ -170,9 +170,9 @@ if (! file_exists($original_file_osencoded)) } // Permissions are ok and file found, so we return it +top_httphead($type); 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.'"'); diff --git a/htdocs/install/inc.php b/htdocs/install/inc.php index 840fa709ddf..6da4125a56c 100644 --- a/htdocs/install/inc.php +++ b/htdocs/install/inc.php @@ -384,7 +384,8 @@ function pHeader($subtitle,$next,$action='set',$param='',$forcejqueryurl='',$css // We force the content charset header("Content-type: text/html; charset=".$conf->file->character_set_client); - + header("X-Content-Type-Options: nosniff"); + print ''."\n"; print ''."\n"; print ''."\n"; diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index ab92df9ca12..11dccf47ade 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -197,6 +197,7 @@ $sessionname='DOLSESSID_'.$prefix; $sessiontimeout='DOLSESSTIMEOUT_'.$prefix; if (! empty($_COOKIE[$sessiontimeout])) ini_set('session.gc_maxlifetime',$_COOKIE[$sessiontimeout]); session_name($sessionname); +session_set_cookie_params(0, '/', null, false, true); // Add tag httponly on session cookie session_start(); if (ini_get('register_globals')) // Deprecated in 5.3 and removed in 5.4. To solve bug in using $_SESSION { @@ -528,6 +529,7 @@ if (! defined('NOLOGIN')) dol_syslog('User not found, connexion refused'); session_destroy(); session_name($sessionname); + session_set_cookie_params(0, '/', null, false, true); // Add tag httponly on session cookie session_start(); // Fixing the bug of register_globals here is useless since session is empty if ($resultFetchUser == 0) @@ -586,6 +588,7 @@ if (! defined('NOLOGIN')) dol_syslog("Can't load user even if session logged. _SESSION['dol_login']=".$login, LOG_WARNING); session_destroy(); session_name($sessionname); + session_set_cookie_params(0, '/', null, false, true); // Add tag httponly on session cookie session_start(); // Fixing the bug of register_globals here is useless since session is empty if ($resultFetchUser == 0) @@ -967,19 +970,22 @@ if (! function_exists("llxHeader")) /** * Show HTTP header * + * @param string $contenttype Content type. For example, 'text/html' * @return void */ -function top_httphead() +function top_httphead($contenttype='text/html') { global $conf; - //header("Content-type: text/html; charset=UTF-8"); - header("Content-type: text/html; charset=".$conf->file->character_set_client); - + if ($contenttype == 'text/html' ) header("Content-Type: text/html; charset=".$conf->file->character_set_client); + else header("Content-Type: ".$contenttype); + header("X-Content-Type-Options: nosniff"); + header("X-Frame-Options: SAMEORIGIN"); + // On the fly GZIP compression for all pages (if browser support it). Must set the bit 3 of constant to 1. - if (isset($conf->global->MAIN_OPTIMIZE_SPEED) && ($conf->global->MAIN_OPTIMIZE_SPEED & 0x04)) { + /*if (isset($conf->global->MAIN_OPTIMIZE_SPEED) && ($conf->global->MAIN_OPTIMIZE_SPEED & 0x04)) { ob_start("ob_gzhandler"); - } + }*/ } /** diff --git a/htdocs/paybox/lib/paybox.lib.php b/htdocs/paybox/lib/paybox.lib.php index 922679bcb86..ca5fd6a71ad 100644 --- a/htdocs/paybox/lib/paybox.lib.php +++ b/htdocs/paybox/lib/paybox.lib.php @@ -36,7 +36,8 @@ function llxHeaderPaybox($title, $head = "") global $user, $conf, $langs; header("Content-type: text/html; charset=".$conf->file->character_set_client); - + header("X-Content-Type-Options: nosniff"); + print ''; //print ''; print "\n"; @@ -171,7 +172,8 @@ function print_paybox_redirect($PRICE,$CURRENCY,$EMAIL,$urlok,$urlko,$TAG) dol_syslog("PBX_TYPEPAIEMENT: $PBX_TYPEPAIEMENT", LOG_DEBUG); header("Content-type: text/html; charset=".$conf->file->character_set_client); - + header("X-Content-Type-Options: nosniff"); + print ''."\n"; print ''."\n"; print "\n"; diff --git a/htdocs/paypal/lib/paypal.lib.php b/htdocs/paypal/lib/paypal.lib.php index 4c1cb588f1f..b1be8f56647 100644 --- a/htdocs/paypal/lib/paypal.lib.php +++ b/htdocs/paypal/lib/paypal.lib.php @@ -35,7 +35,8 @@ function llxHeaderPaypal($title, $head = "") global $user, $conf, $langs; header("Content-type: text/html; charset=".$conf->file->character_set_client); - + header("X-Content-Type-Options: nosniff"); + $appli='Dolibarr'; if (!empty($conf->global->MAIN_APPLICATION_TITLE)) $appli=$conf->global->MAIN_APPLICATION_TITLE; diff --git a/htdocs/projet/jsgantt_language.js.php b/htdocs/projet/jsgantt_language.js.php index f6b5799bda0..7aafd97fb45 100644 --- a/htdocs/projet/jsgantt_language.js.php +++ b/htdocs/projet/jsgantt_language.js.php @@ -34,8 +34,8 @@ if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); require_once __DIR__.'/../main.inc.php'; -// Define css type -header('Content-type: text/javascript'); +// Define mime type +top_httphead('text/javascript'); global $langs; ?> diff --git a/htdocs/support/inc.php b/htdocs/support/inc.php index 869dace222d..16aa40b246d 100644 --- a/htdocs/support/inc.php +++ b/htdocs/support/inc.php @@ -207,7 +207,8 @@ function pHeader($soutitre,$next,$action='none') // On force contenu dans format sortie header("Content-type: text/html; charset=".$conf->file->character_set_client); - + header("X-Content-Type-Options: nosniff"); + print ''."\n"; print ''."\n"; print ''."\n"; diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 9de83c3bd97..f923413da4c 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -45,7 +45,7 @@ if (empty($user->id) && ! empty($_SESSION['dol_login'])) $user->fetch('',$_SESSI // Define css type -header('Content-type: text/css'); +top_httphead('text/css'); // Important: Following code is to avoid page request by browser and PHP CPU at each Dolibarr page access. if (empty($dolibarr_nocache)) header('Cache-Control: max-age=3600, public, must-revalidate'); else header('Cache-Control: no-cache'); diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index e6809a2c574..3bd33b07225 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -46,7 +46,7 @@ if (empty($user->id) && ! empty($_SESSION['dol_login'])) $user->fetch('',$_SESSI // Define css type -header('Content-type: text/css'); +top_httphead('text/css'); // Important: Following code is to avoid page request by browser and PHP CPU at each Dolibarr page access. if (empty($dolibarr_nocache)) header('Cache-Control: max-age=3600, public, must-revalidate'); else header('Cache-Control: no-cache'); diff --git a/htdocs/viewimage.php b/htdocs/viewimage.php index f69c7e4e4aa..4f1ef007f1f 100644 --- a/htdocs/viewimage.php +++ b/htdocs/viewimage.php @@ -191,13 +191,13 @@ else // Open and return file // Les drois sont ok et fichier trouve if ($type) { + top_httphead($type); header('Content-Disposition: inline; filename="'.basename($original_file).'"'); - header('Content-type: '.$type); } else { + top_httphead('image/png'); header('Content-Disposition: inline; filename="'.basename($original_file).'"'); - header('Content-type: image/png'); } $original_file_osencoded=dol_osencode($original_file); From ae57395562dd62e7ccc6e664974a4188decc7438 Mon Sep 17 00:00:00 2001 From: alexis portable Date: Tue, 9 May 2017 22:24:24 +0200 Subject: [PATCH 045/299] NEW get amount base on thm for ficheinter --- htdocs/fichinter/class/fichinter.class.php | 27 +++++++++++++++++++++- htdocs/projet/element.php | 7 +++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/htdocs/fichinter/class/fichinter.class.php b/htdocs/fichinter/class/fichinter.class.php index 2942a8903ab..b52dfdc904b 100644 --- a/htdocs/fichinter/class/fichinter.class.php +++ b/htdocs/fichinter/class/fichinter.class.php @@ -360,6 +360,8 @@ class Fichinter extends CommonObject $this->modelpdf = $obj->model_pdf; $this->fk_contrat = $obj->fk_contrat; + $this->user_creation= $obj->fk_user_author; + $this->extraparams = (array) json_decode($obj->extraparams, true); if ($this->statut == 0) $this->brouillon = 1; @@ -537,7 +539,30 @@ class Fichinter extends CommonObject } } - + /** + * Returns amount based on user thm + * + * @return float amount + */ + function getAmount() { + global $db; + + $amount = 0; + + $this->author = new User($db); + $this->author->fetch($this->user_creation); + + $thm = $this->author->thm; + + foreach($this->lines as &$line) { + + $amount+=$line->qty * $thm; + + } + + return $amount; + } + /** * Returns the label status * diff --git a/htdocs/projet/element.php b/htdocs/projet/element.php index 09a3fecc4bd..02bf6c5a9ba 100644 --- a/htdocs/projet/element.php +++ b/htdocs/projet/element.php @@ -333,7 +333,8 @@ $listofreferent=array( 'class'=>'Fichinter', 'table'=>'fichinter', 'datefieldname'=>'date_valid', - 'disableamount'=>1, + 'disableamount'=>0, + 'margin'=>'minus', 'urlnew'=>DOL_URL_ROOT.'/fichinter/card.php?action=create&origin=project&originid='.$id.'&socid='.$socid, 'lang'=>'interventions', 'buttonnew'=>'AddIntervention', @@ -559,6 +560,7 @@ foreach ($listofreferent as $key => $value) if ($tablename != 'expensereport_det' && method_exists($element, 'fetch_thirdparty')) $element->fetch_thirdparty(); if ($tablename == 'don' || $tablename == 'chargesociales') $total_ht_by_line=$element->amount; elseif ($tablename == 'stock_mouvement') $total_ht_by_line=$element->price*abs($element->qty); + else if($tablename == 'fichinter') $total_ht_by_line=$element->getAmount(); elseif ($tablename == 'projet_task') { if ($idofelementuser) @@ -583,6 +585,7 @@ foreach ($listofreferent as $key => $value) if ($qualifiedfortotal) $total_ht = $total_ht + $total_ht_by_line; if ($tablename == 'don' || $tablename == 'chargesociales') $total_ttc_by_line=$element->amount; + else if($tablename == 'fichinter') $total_ttc_by_line=$element->getAmount(); elseif ($tablename == 'stock_mouvement') $total_ttc_by_line=$element->price*abs($element->qty); elseif ($tablename == 'projet_task') { @@ -948,6 +951,7 @@ foreach ($listofreferent as $key => $value) $total_ht_by_line=null; $othermessage=''; if ($tablename == 'don' || $tablename == 'chargesociales') $total_ht_by_line=$element->amount; + else if($tablename == 'fichinter') $total_ht_by_line=$element->getAmount(); elseif ($tablename == 'stock_mouvement') $total_ht_by_line=$element->price*abs($element->qty); elseif (in_array($tablename, array('projet_task'))) { @@ -988,6 +992,7 @@ foreach ($listofreferent as $key => $value) { $total_ttc_by_line=null; if ($tablename == 'don' || $tablename == 'chargesociales') $total_ttc_by_line=$element->amount; + else if($tablename == 'fichinter') $total_ttc_by_line=$element->getAmount(); elseif ($tablename == 'stock_mouvement') $total_ttc_by_line=$element->price*abs($element->qty); elseif ($tablename == 'projet_task') { From b157398da4f8fa909678ec4a06bcd94d71103da9 Mon Sep 17 00:00:00 2001 From: alexis portable Date: Tue, 9 May 2017 22:54:33 +0200 Subject: [PATCH 046/299] fiche inter fix user author fetch --- htdocs/fichinter/class/fichinter.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/fichinter/class/fichinter.class.php b/htdocs/fichinter/class/fichinter.class.php index b52dfdc904b..d9912edfca1 100644 --- a/htdocs/fichinter/class/fichinter.class.php +++ b/htdocs/fichinter/class/fichinter.class.php @@ -326,7 +326,7 @@ class Fichinter extends CommonObject function fetch($rowid,$ref='') { $sql = "SELECT f.rowid, f.ref, f.description, f.fk_soc, f.fk_statut,"; - $sql.= " f.datec, f.dateo, f.datee, f.datet,"; + $sql.= " f.datec, f.dateo, f.datee, f.datet, f.fk_user_author,"; $sql.= " f.date_valid as datev,"; $sql.= " f.tms as datem,"; $sql.= " f.duree, f.fk_projet, f.note_public, f.note_private, f.model_pdf, f.extraparams, fk_contrat"; From 2fc64b8e11af693dc86221f3cd3b4fae3f6897f5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 00:44:54 +0200 Subject: [PATCH 047/299] Fix XSS --- htdocs/core/lib/functions.lib.php | 2 +- htdocs/index.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index e0c9d520eef..e0beb3a8a8e 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -302,7 +302,7 @@ function GETPOST($paramname,$check='',$method=0,$filter=NULL,$options=NULL) break; case 'aZ09': $out=trim($out); - if (preg_match('/[^a-z0-9]+/i',$out)) $out=''; + if (preg_match('/[^a-z0-9_]+/i',$out)) $out=''; break; case 'array': if (! is_array($out) || empty($out)) $out=array(); diff --git a/htdocs/index.php b/htdocs/index.php index 4b3f48f715f..5430fcf7d24 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -30,7 +30,7 @@ require 'main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; // If not defined, we select menu "home" -$_GET['mainmenu']=GETPOST('mainmenu', 'alpha')?GETPOST('mainmenu', 'alpha'):'home'; +$_GET['mainmenu']=GETPOST('mainmenu', 'aZ09')?GETPOST('mainmenu', 'aZ09'):'home'; $action=GETPOST('action'); $hookmanager->initHooks(array('index')); From 267e66abfa92ed83ee633677092bea20e9ecda4e Mon Sep 17 00:00:00 2001 From: Thomas Raschbacher Date: Wed, 10 May 2017 08:48:28 +0200 Subject: [PATCH 048/299] Add more fields to projectcontacts substitution civility added + extrafields for external contacts + isInternal to decide in template wether to list internal or not --- .../doc/doc_generic_project_odt.modules.php | 59 +++++++++++-------- 1 file changed, 35 insertions(+), 24 deletions(-) diff --git a/htdocs/core/modules/project/doc/doc_generic_project_odt.modules.php b/htdocs/core/modules/project/doc/doc_generic_project_odt.modules.php index 7d0fe1a41e6..fbe3db84370 100644 --- a/htdocs/core/modules/project/doc/doc_generic_project_odt.modules.php +++ b/htdocs/core/modules/project/doc/doc_generic_project_odt.modules.php @@ -185,39 +185,50 @@ class doc_generic_project_odt extends ModelePDFProjects function get_substitutionarray_project_contacts($contact,$outputlangs) { global $conf; + $pc='projcontacts_'; // prefix to avoid typos - // adding phone numbers if external - $phone_pro = ''; - $phone_perso = ''; - $phone_mobile = ''; + $ret = array( + $pc.'id'=>$contact['id'], + $pc.'rowid'=>$contact['rowid'], + $pc.'role'=>$contact['libelle'], + $pc.'lastname'=>$contact['lastname'], + $pc.'firstname'=>$contact['firstname'], + $pc.'civility'=>$contact['civility'], + $pc.'fullcivname'=>$contact['fullname'], + $pc.'socname'=>$contact['socname'], + $pc.'email'=>$contact['email'] + ); - $ct = new Contact($this->db); if ($contact['source']=='external') { + $ret[$pc.'isInternal'] = ''; // not internal + $ct = new Contact($this->db); $ct->fetch($contact['id']); - $phone_pro = $ct->phone_pro; - $phone_perso = $ct->phone_perso; - $phone_mobile = $ct->phone_mobile; + $ret[$pc.'phone_pro'] = $ct->phone_pro; + $ret[$pc.'phone_perso'] = $ct->phone_perso; + $ret[$pc.'phone_mobile'] = $ct->phone_mobile; + + // fetch external user extrafields + require_once(DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'); + $extrafields=new ExtraFields($this->db); + $extralabels=$extrafields->fetch_name_optionals_label($ct->table_element, true); + $extrafields_num = $ct->fetch_optionals($ct->id, $extralabels); + //dol_syslog(get_class($this)."::get_substitutionarray_project_contacts: ===== Number of Extrafields found: ".$extrafields_num, LOG_DEBUG); + foreach($ct->array_options as $efkey => $efval) { + dol_syslog(get_class($this)."::get_substitutionarray_project_contacts: +++++ Extrafield ".$efkey." => ".$efval, LOG_DEBUG); + $ret[$pc.$efkey] = $efval; // add nothing else because it already comes as 'options_XX' + } } elseif ($contact['source']=='internal') { + $ret[$pc.'isInternal'] = '1'; // this is an internal user + $ct = new User($this->db); $ct->fetch($contact['id']); - $phone_pro = $ct->office_phone; - $phone_mobile = $ct->user_mobile; + $ret[$pc.'phone_pro'] = $ct->office_phone; + $ret[$pc.'phone_perso'] = ''; + $ret[$pc.'phone_mobile'] = $ct->user_mobile; + // do internal users have extrafields ? } - - return array( - 'projcontacts_id'=>$contact['id'], - 'projcontacts_rowid'=>$contact['rowid'], - 'projcontacts_role'=>$contact['libelle'], - 'projcontacts_lastname'=>$contact['lastname'], - 'projcontacts_firstname'=>$contact['firstname'], - 'projcontacts_fullcivname'=>$contact['fullname'], - 'projcontacts_socname'=>$contact['socname'], - 'projcontacts_email'=>$contact['email'], - 'projcontacts_phone_pro'=>$phone_pro, - 'projcontacts_phone_perso'=>$phone_perso, - 'projcontacts_phone_mobile'=>$phone_mobile - ); + return $ret; } /** From 0ea69e2e94a6ccf83cfbe02317424546a36a6a6c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 09:58:58 +0200 Subject: [PATCH 049/299] Add empty index.html page --- htdocs/theme/common/fontawesome/index.html | 0 htdocs/theme/common/octicons/index.html | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 htdocs/theme/common/fontawesome/index.html create mode 100644 htdocs/theme/common/octicons/index.html diff --git a/htdocs/theme/common/fontawesome/index.html b/htdocs/theme/common/fontawesome/index.html new file mode 100644 index 00000000000..e69de29bb2d diff --git a/htdocs/theme/common/octicons/index.html b/htdocs/theme/common/octicons/index.html new file mode 100644 index 00000000000..e69de29bb2d From 09f6fe5a528dbe97ea391aaa0ba6b06efa418a35 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 10:06:44 +0200 Subject: [PATCH 050/299] Fix lib_notification --- htdocs/main.inc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index fe899012983..333eb25ad89 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1289,7 +1289,7 @@ function top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs if ($enablebrowsernotif) { print ''."\n"; - print ''."\n"; + print ''."\n"; } } From 5c33c1773fa8ac97b454c572bd1c80d74d05d5b1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 11:47:34 +0200 Subject: [PATCH 051/299] FIX XSS --- htdocs/core/lib/functions.lib.php | 8 +++++--- htdocs/index.php | 8 ++++---- htdocs/langs/en_US/agenda.lang | 1 + test/phpunit/SecurityTest.php | 26 +++++++++++++++++++++++++- 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 89e3a9ea00d..ab75fce37e6 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -380,7 +380,7 @@ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) break; case 'aZ09': $out=trim($out); - if (preg_match('/[^a-z0-9_]+/i',$out)) $out=''; + if (preg_match('/[^a-z0-9_\-]+/i',$out)) $out=''; break; case 'array': if (! is_array($out) || empty($out)) $out=array(); @@ -3104,7 +3104,7 @@ function dol_print_error($db='',$error='',$errors=null) if ($_SERVER['DOCUMENT_ROOT']) // Mode web { $out.="".$langs->trans("DatabaseTypeManager").": ".$db->type."
\n"; - $out.="".$langs->trans("RequestLastAccessInError").": ".($db->lastqueryerror()?$db->lastqueryerror():$langs->trans("ErrorNoRequestInError"))."
\n"; + $out.="".$langs->trans("RequestLastAccessInError").": ".($db->lastqueryerror()?dol_escape_htmltag($db->lastqueryerror()):$langs->trans("ErrorNoRequestInError"))."
\n"; $out.="".$langs->trans("ReturnCodeLastAccessInError").": ".($db->lasterrno()?$db->lasterrno():$langs->trans("ErrorNoRequestInError"))."
\n"; $out.="".$langs->trans("InformationLastAccessInError").": ".($db->lasterror()?$db->lasterror():$langs->trans("ErrorNoRequestInError"))."
\n"; $out.="
\n"; @@ -3112,7 +3112,9 @@ function dol_print_error($db='',$error='',$errors=null) else // Mode CLI { $out.='> '.$langs->transnoentities("DatabaseTypeManager").":\n".$db->type."\n"; - $out.='> '.$langs->transnoentities("RequestLastAccessInError").":\n".($db->lastqueryerror()?$db->lastqueryerror():$langs->trans("ErrorNoRequestInError"))."\n"; + $out.='> '.$langs->transnoentities("RequestLastAccessInError").":\n".($db->lastqueryerror()?dol_escape_htmltag($db->lastqueryerror()):$langs->trans("ErrorNoRequestInError"))."\n"; + // To make detection of xss vulnerabilities or sql injection easier with a scanner, replace line with this one: + //$out.='> '.$langs->transnoentities("RequestLastAccessInError").":\n".($db->lastqueryerror()?$db->lastqueryerror:$langs->trans("ErrorNoRequestInError"))."\n"; $out.='> '.$langs->transnoentities("ReturnCodeLastAccessInError").":\n".($db->lasterrno()?$db->lasterrno():$langs->trans("ErrorNoRequestInError"))."\n"; $out.='> '.$langs->transnoentities("InformationLastAccessInError").":\n".($db->lasterror()?$db->lasterror():$langs->trans("ErrorNoRequestInError"))."\n"; diff --git a/htdocs/index.php b/htdocs/index.php index 1431f73ca7d..5ab2fa68cd4 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -55,10 +55,10 @@ if (count($conf->modules) <= (empty($conf->global->MAIN_MIN_NB_ENABLED_MODULE_FO if (GETPOST('addbox')) // Add box (when submit is done from a form when ajax disabled) { require_once DOL_DOCUMENT_ROOT.'/core/class/infobox.class.php'; - $zone=GETPOST('areacode'); - $userid=GETPOST('userid'); - $boxorder=GETPOST('boxorder'); - $boxorder.=GETPOST('boxcombo'); + $zone=GETPOST('areacode', 'aZ09'); + $userid=GETPOST('userid', 'int'); + $boxorder=GETPOST('boxorder', 'aZ09'); + $boxorder.=GETPOST('boxcombo', 'aZ09'); $result=InfoBox::saveboxorder($db,$zone,$boxorder,$userid); if ($result > 0) setEventMessages($langs->trans("BoxAdded"), null); diff --git a/htdocs/langs/en_US/agenda.lang b/htdocs/langs/en_US/agenda.lang index 2b1b6bafb3a..9e7af7b0d06 100644 --- a/htdocs/langs/en_US/agenda.lang +++ b/htdocs/langs/en_US/agenda.lang @@ -76,6 +76,7 @@ ProposalDeleted=Proposal deleted OrderDeleted=Order deleted InvoiceDeleted=Invoice deleted ##### End agenda events ##### +AgendaModelModule=Document templates for event DateActionStart=Start date DateActionEnd=End date AgendaUrlOptions1=You can also add following parameters to filter output: diff --git a/test/phpunit/SecurityTest.php b/test/phpunit/SecurityTest.php index 00714e7bfab..288a15c317e 100644 --- a/test/phpunit/SecurityTest.php +++ b/test/phpunit/SecurityTest.php @@ -147,7 +147,9 @@ class SecurityTest extends PHPUnit_Framework_TestCase $_GET["param2"]='a/b#e(pr)qq-rr\cc'; $_GET["param3"]='"a/b#e(pr)qq-rr\cc'; // Same than param2 + " $_GET["param4"]='../dir'; - + $_GET["param5"]="a_1-b"; + + // Test int $result=GETPOST('id','int'); // Must return nothing print __METHOD__." result=".$result."\n"; $this->assertEquals($result,''); @@ -160,6 +162,7 @@ class SecurityTest extends PHPUnit_Framework_TestCase print __METHOD__." result=".$result."\n"; $this->assertEquals($result,333); + // Test alpha $result=GETPOST("param2",'alpha'); print __METHOD__." result=".$result."\n"; $this->assertEquals($result,$_GET["param2"]); @@ -172,6 +175,27 @@ class SecurityTest extends PHPUnit_Framework_TestCase print __METHOD__." result=".$result."\n"; $this->assertEquals($result,''); + // Test aZ09 + $result=GETPOST("param1",'aZ09'); // Must return '' as there is a forbidden char ../ + print __METHOD__." result=".$result."\n"; + $this->assertEquals($result,$_GET["param1"]); + + $result=GETPOST("param2",'aZ09'); // Must return '' as there is a forbidden char ../ + print __METHOD__." result=".$result."\n"; + $this->assertEquals($result,''); + + $result=GETPOST("param3",'aZ09'); // Must return '' as there is a forbidden char ../ + print __METHOD__." result=".$result."\n"; + $this->assertEquals($result,''); + + $result=GETPOST("param4",'aZ09'); // Must return '' as there is a forbidden char ../ + print __METHOD__." result=".$result."\n"; + $this->assertEquals($result,''); + + $result=GETPOST("param5",'aZ09'); + print __METHOD__." result=".$result."\n"; + $this->assertEquals($result,$_GET["param5"]); + return $result; } From c4722e36940eec65ba0b6df5d6fdaf211fd9b69a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 11:47:34 +0200 Subject: [PATCH 052/299] FIX XSS --- htdocs/core/lib/functions.lib.php | 8 +++++--- htdocs/index.php | 8 ++++---- htdocs/langs/en_US/agenda.lang | 1 + test/phpunit/SecurityTest.php | 26 +++++++++++++++++++++++++- 4 files changed, 35 insertions(+), 8 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index e0beb3a8a8e..6b0b3112307 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -302,7 +302,7 @@ function GETPOST($paramname,$check='',$method=0,$filter=NULL,$options=NULL) break; case 'aZ09': $out=trim($out); - if (preg_match('/[^a-z0-9_]+/i',$out)) $out=''; + if (preg_match('/[^a-z0-9_\-]+/i',$out)) $out=''; break; case 'array': if (! is_array($out) || empty($out)) $out=array(); @@ -2937,7 +2937,7 @@ function dol_print_error($db='',$error='',$errors=null) if ($_SERVER['DOCUMENT_ROOT']) // Mode web { $out.="".$langs->trans("DatabaseTypeManager").": ".$db->type."
\n"; - $out.="".$langs->trans("RequestLastAccessInError").": ".($db->lastqueryerror()?$db->lastqueryerror():$langs->trans("ErrorNoRequestInError"))."
\n"; + $out.="".$langs->trans("RequestLastAccessInError").": ".($db->lastqueryerror()?dol_escape_htmltag($db->lastqueryerror()):$langs->trans("ErrorNoRequestInError"))."
\n"; $out.="".$langs->trans("ReturnCodeLastAccessInError").": ".($db->lasterrno()?$db->lasterrno():$langs->trans("ErrorNoRequestInError"))."
\n"; $out.="".$langs->trans("InformationLastAccessInError").": ".($db->lasterror()?$db->lasterror():$langs->trans("ErrorNoRequestInError"))."
\n"; $out.="
\n"; @@ -2945,7 +2945,9 @@ function dol_print_error($db='',$error='',$errors=null) else // Mode CLI { $out.='> '.$langs->transnoentities("DatabaseTypeManager").":\n".$db->type."\n"; - $out.='> '.$langs->transnoentities("RequestLastAccessInError").":\n".($db->lastqueryerror()?$db->lastqueryerror():$langs->trans("ErrorNoRequestInError"))."\n"; + $out.='> '.$langs->transnoentities("RequestLastAccessInError").":\n".($db->lastqueryerror()?dol_escape_htmltag($db->lastqueryerror()):$langs->trans("ErrorNoRequestInError"))."\n"; + // To make detection of xss vulnerabilities or sql injection easier with a scanner, replace line with this one: + //$out.='> '.$langs->transnoentities("RequestLastAccessInError").":\n".($db->lastqueryerror()?$db->lastqueryerror:$langs->trans("ErrorNoRequestInError"))."\n"; $out.='> '.$langs->transnoentities("ReturnCodeLastAccessInError").":\n".($db->lasterrno()?$db->lasterrno():$langs->trans("ErrorNoRequestInError"))."\n"; $out.='> '.$langs->transnoentities("InformationLastAccessInError").":\n".($db->lasterror()?$db->lasterror():$langs->trans("ErrorNoRequestInError"))."\n"; diff --git a/htdocs/index.php b/htdocs/index.php index 5430fcf7d24..007145083cf 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -55,10 +55,10 @@ if (count($conf->modules) <= (empty($conf->global->MAIN_MIN_NB_ENABLED_MODULE_FO if (GETPOST('addbox')) // Add box (when submit is done from a form when ajax disabled) { require_once DOL_DOCUMENT_ROOT.'/core/class/infobox.class.php'; - $zone=GETPOST('areacode'); - $userid=GETPOST('userid'); - $boxorder=GETPOST('boxorder'); - $boxorder.=GETPOST('boxcombo'); + $zone=GETPOST('areacode', 'aZ09'); + $userid=GETPOST('userid', 'int'); + $boxorder=GETPOST('boxorder', 'aZ09'); + $boxorder.=GETPOST('boxcombo', 'aZ09'); $result=InfoBox::saveboxorder($db,$zone,$boxorder,$userid); } diff --git a/htdocs/langs/en_US/agenda.lang b/htdocs/langs/en_US/agenda.lang index d0f3456987d..6bfa9fd0406 100644 --- a/htdocs/langs/en_US/agenda.lang +++ b/htdocs/langs/en_US/agenda.lang @@ -75,6 +75,7 @@ ProposalDeleted=Proposal deleted OrderDeleted=Order deleted InvoiceDeleted=Invoice deleted ##### End agenda events ##### +AgendaModelModule=Document templates for event DateActionStart=Start date DateActionEnd=End date AgendaUrlOptions1=You can also add following parameters to filter output: diff --git a/test/phpunit/SecurityTest.php b/test/phpunit/SecurityTest.php index 00714e7bfab..288a15c317e 100644 --- a/test/phpunit/SecurityTest.php +++ b/test/phpunit/SecurityTest.php @@ -147,7 +147,9 @@ class SecurityTest extends PHPUnit_Framework_TestCase $_GET["param2"]='a/b#e(pr)qq-rr\cc'; $_GET["param3"]='"a/b#e(pr)qq-rr\cc'; // Same than param2 + " $_GET["param4"]='../dir'; - + $_GET["param5"]="a_1-b"; + + // Test int $result=GETPOST('id','int'); // Must return nothing print __METHOD__." result=".$result."\n"; $this->assertEquals($result,''); @@ -160,6 +162,7 @@ class SecurityTest extends PHPUnit_Framework_TestCase print __METHOD__." result=".$result."\n"; $this->assertEquals($result,333); + // Test alpha $result=GETPOST("param2",'alpha'); print __METHOD__." result=".$result."\n"; $this->assertEquals($result,$_GET["param2"]); @@ -172,6 +175,27 @@ class SecurityTest extends PHPUnit_Framework_TestCase print __METHOD__." result=".$result."\n"; $this->assertEquals($result,''); + // Test aZ09 + $result=GETPOST("param1",'aZ09'); // Must return '' as there is a forbidden char ../ + print __METHOD__." result=".$result."\n"; + $this->assertEquals($result,$_GET["param1"]); + + $result=GETPOST("param2",'aZ09'); // Must return '' as there is a forbidden char ../ + print __METHOD__." result=".$result."\n"; + $this->assertEquals($result,''); + + $result=GETPOST("param3",'aZ09'); // Must return '' as there is a forbidden char ../ + print __METHOD__." result=".$result."\n"; + $this->assertEquals($result,''); + + $result=GETPOST("param4",'aZ09'); // Must return '' as there is a forbidden char ../ + print __METHOD__." result=".$result."\n"; + $this->assertEquals($result,''); + + $result=GETPOST("param5",'aZ09'); + print __METHOD__." result=".$result."\n"; + $this->assertEquals($result,$_GET["param5"]); + return $result; } From 383dfc0c96c0c4e77110d87f91f09a8f5bf7b4da Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 11:51:59 +0200 Subject: [PATCH 053/299] FIX Pagination of invoices --- htdocs/compta/facture/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index cce94646616..693a6f39f97 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -409,7 +409,7 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) $nbtotalofrecords = $db->num_rows($result); } -$sql.= $db->plimit($limit,$offset); +$sql.= $db->plimit($limit+1,$offset); //print $sql; $resql = $db->query($sql); From 3e0fcf5ec2ecda622736e8d5142e31c592167af2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 11:57:59 +0200 Subject: [PATCH 054/299] Fix label "total for this page" on last page. --- dev/skeletons/skeleton_list.php | 2 +- htdocs/comm/propal/list.php | 2 +- htdocs/commande/list.php | 2 +- htdocs/compta/bank/bankentries.php | 2 +- htdocs/compta/bank/index.php | 2 +- htdocs/compta/facture/list.php | 2 +- htdocs/compta/sociales/index.php | 2 +- htdocs/expensereport/list.php | 2 +- htdocs/fichinter/list.php | 2 +- htdocs/fourn/facture/list.php | 2 +- htdocs/product/stock/productlot_list.php | 2 +- htdocs/projet/list.php | 2 +- htdocs/projet/tasks/list.php | 2 +- htdocs/projet/tasks/time.php | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/dev/skeletons/skeleton_list.php b/dev/skeletons/skeleton_list.php index 77485c6d638..4453f2d8302 100644 --- a/dev/skeletons/skeleton_list.php +++ b/dev/skeletons/skeleton_list.php @@ -523,7 +523,7 @@ if (isset($totalarray['totalhtfield'])) $i++; if ($i == 1) { - if ($num < $limit) print '
'.$langs->trans("Total").''.$langs->trans("Total").''.$langs->trans("Totalforthispage").''.price($totalarray['totalht']).''.$langs->trans("Total").''.$langs->trans("Total").''.$langs->trans("Totalforthispage").''.price($totalarray['totalht']).''.$langs->trans("Total").''.$langs->trans("Total").''.$langs->trans("Totalforthispage").''.price($totalarray['totalht']).''.$langs->trans("Total").''.$langs->trans("Total").''.$langs->trans("Totalforthispage").''.price(-1 * $totalarray['totaldeb']).''.$langs->trans("Total").''.$langs->trans("Total").''.$langs->trans("Totalforthispage").''.price($totalarray['totalbalance'], 0, $langs, 0, 0, -1, $lastcurrencycode).''.$langs->trans("Total").''.$langs->trans("Total").''.$langs->trans("Totalforthispage").''.price($totalarray['totalht']).'
'.$langs->trans("Total").''.$langs->trans("Total").''.$langs->trans("Totalforthispage").''.$langs->trans("Total").''.$langs->trans("Total").''.$langs->trans("Totalforthispage").''.price($totalarray['totalht']).''.$langs->trans("Total").''.$langs->trans("Total").''.$langs->trans("Totalforthispage").''.convertSecondToTime($totalarray['totalduration'], 'allhourmin').''.$langs->trans("Total").''.$langs->trans("Total").''.$langs->trans("Totalforthispage").''.price($totalarray['totalht']).''.$langs->trans("Total").''.$langs->trans("Total").''.$langs->trans("Totalforthispage").''.price($totalarray['totalht']).''.$langs->trans("Total").''.$langs->trans("Total").''.$langs->trans("Totalforthispage").''.price($totalarray['totalopp']).''.$langs->trans("Total").''.$langs->trans("Total").''.$langs->trans("Totalforthispage").''.convertSecondToTime($totalarray['totalplannedworkload'],$plannedworkloadoutputformat).''.$langs->trans("Total").''.$langs->trans("Total").''.$langs->trans("Totalforthispage").''.convertSecondToTime($totalarray['totalduration'],'allhourmin').'
- - + - - + +
trans('Ref') ?>ref) ?> + trans('Ref') ?>ref) ?>
trans('Label') ?>label) ?>trans('Label') ?>label) ?>
'; dol_fiche_end(); +print '
'; + + +print '
'; +print ''; +print ''; +print ''; +print ''; + print_fiche_titre($langs->trans('NewProductAttributeValue')); dol_fiche_head(); + ?> - - + - +
'; +print '
'; +print ''; +print '   '; +print ''; +print '
'; -llxFooter(); \ No newline at end of file +print ''; + +llxFooter(); +$db->close(); From 578eb98b3332a4c14af91c97546f486ab1d1ba88 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 13:13:33 +0200 Subject: [PATCH 058/299] Better user interface --- htdocs/adherents/type.php | 8 ++++++-- htdocs/admin/defaultvalues.php | 7 +++---- htdocs/admin/ihm.php | 26 ++++++++++++-------------- htdocs/admin/translation.php | 4 +++- htdocs/langs/en_US/modulebuilder.lang | 4 ++-- 5 files changed, 26 insertions(+), 23 deletions(-) diff --git a/htdocs/adherents/type.php b/htdocs/adherents/type.php index ab6bfcc0704..fb147750e0b 100644 --- a/htdocs/adherents/type.php +++ b/htdocs/adherents/type.php @@ -82,9 +82,11 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter_x") || GETP // Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array $hookmanager->initHooks(array('membertypecard','globalcard')); + /* * Actions */ + if ($action == 'add' && $user->rights->adherent->configurer) { if (! $cancel) @@ -308,12 +310,13 @@ if ($rowid > 0) $head = member_type_prepare_head($object); - dol_fiche_head($head, 'card', $langs->trans("MemberType"), 0, 'group'); + dol_fiche_head($head, 'card', $langs->trans("MemberType"), -1, 'group'); $linkback = ''.$langs->trans("BackToList").''; dol_banner_tab($object, 'rowid', $linkback); + print '
'; print '
'; print ''; @@ -342,7 +345,8 @@ if ($rowid > 0) } print '
'; - + print '
'; + dol_fiche_end(); diff --git a/htdocs/admin/defaultvalues.php b/htdocs/admin/defaultvalues.php index dd37e4987e5..013be811b5b 100644 --- a/htdocs/admin/defaultvalues.php +++ b/htdocs/admin/defaultvalues.php @@ -172,9 +172,6 @@ if ($action == 'delete') - - - /* * View */ @@ -323,7 +320,9 @@ else print ''; print ''; } -print ''; +$disabled=''; +if (empty($conf->global->MAIN_ENABLE_DEFAULT_VALUES)) $disabled=' disabled="disabled"'; +print ''; print "\n"; print ''; diff --git a/htdocs/admin/ihm.php b/htdocs/admin/ihm.php index 739a6fa4c88..cfa08f003ea 100644 --- a/htdocs/admin/ihm.php +++ b/htdocs/admin/ihm.php @@ -362,13 +362,6 @@ if ($action == 'edit') // Edit print ' '; print ''; - // Hide helpcenter link on login page - print ''.$langs->trans("DisableLinkToHelpCenter").''; - print $form->selectyesno('MAIN_HELPCENTER_DISABLELINK',isset($conf->global->MAIN_HELPCENTER_DISABLELINK)?$conf->global->MAIN_HELPCENTER_DISABLELINK:0,1); - print ''; - print ' '; - print ''; - // Message of the day on home page print ''.$langs->trans("MessageOfDay").''; @@ -393,8 +386,14 @@ if ($action == 'edit') // Edit $doleditor->Create(); print ''."\n"; - // Background + // Hide helpcenter link on login page + print ''.$langs->trans("DisableLinkToHelpCenter").''; + print $form->selectyesno('MAIN_HELPCENTER_DISABLELINK',isset($conf->global->MAIN_HELPCENTER_DISABLELINK)?$conf->global->MAIN_HELPCENTER_DISABLELINK:0,1); + print ''; + print ' '; + print ''; + // Background print ''; print '
'; print ''; @@ -531,11 +530,6 @@ else // Show // Link to wiki help print ''.$langs->trans("DisableLinkToHelp",img_picto('',DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/helpdoc.png','',1)).''; print yn((isset($conf->global->MAIN_HELP_DISABLELINK)?$conf->global->MAIN_HELP_DISABLELINK:0),1); - print ''; - - // Link to help center - print ''.$langs->trans("DisableLinkToHelpCenter").''; - print yn((isset($conf->global->MAIN_HELPCENTER_DISABLELINK)?$conf->global->MAIN_HELPCENTER_DISABLELINK:0),1); print ''; // Message of the day @@ -558,8 +552,12 @@ else // Show else print ' '; print ''."\n"; + // Link to help center + print ''.$langs->trans("DisableLinkToHelpCenter").''; + print yn((isset($conf->global->MAIN_HELPCENTER_DISABLELINK)?$conf->global->MAIN_HELPCENTER_DISABLELINK:0),1); + print ''; + // Background login - print ''.$langs->trans("BackgroundImageLogin").''; print '
'; print $conf->global->MAIN_LOGIN_BACKGROUND; diff --git a/htdocs/admin/translation.php b/htdocs/admin/translation.php index c51d1c2435d..44387bc2041 100644 --- a/htdocs/admin/translation.php +++ b/htdocs/admin/translation.php @@ -264,7 +264,9 @@ if ($mode == 'overwrite') print ''; print ''; //} - print ''; + $disabled=''; + if (empty($conf->global->MAIN_ENABLE_OVERWRITE_TRANSLATION)) $disabled=' disabled="disabled"'; + print ''; print "\n"; print ''; diff --git a/htdocs/langs/en_US/modulebuilder.lang b/htdocs/langs/en_US/modulebuilder.lang index 81a34b66b85..da734ea1356 100644 --- a/htdocs/langs/en_US/modulebuilder.lang +++ b/htdocs/langs/en_US/modulebuilder.lang @@ -1,7 +1,7 @@ # Dolibarr language file - Source file is en_US - loan ModuleBuilderDesc=This tools give you utilites to build or edit your own module. -ModuleBuilderDesc2=Path were modules are generated/edited (first alternative directory defined into %s): %s. -ModuleBuilderDesc3=Modules found: %s (they are detected as editable when the file %s exists in root of module directory). +ModuleBuilderDesc2=Path were modules are generated/edited (first alternative directory defined into %s): %s +ModuleBuilderDesc3=Generated/editable modules found: %s (they are detected as editable when the file %s exists in root of module directory). NewModule=New module ModuleKey=Key for new module From 5a31d2c95a6deba953720f2ceaacbe7ecce51135 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 13:39:00 +0200 Subject: [PATCH 059/299] Fix css --- .../modulebuilder/template/myobject_card.php | 346 ++++++++++++++++++ htdocs/societe/class/societe.class.php | 44 +-- 2 files changed, 368 insertions(+), 22 deletions(-) create mode 100644 htdocs/modulebuilder/template/myobject_card.php diff --git a/htdocs/modulebuilder/template/myobject_card.php b/htdocs/modulebuilder/template/myobject_card.php new file mode 100644 index 00000000000..a257149c72a --- /dev/null +++ b/htdocs/modulebuilder/template/myobject_card.php @@ -0,0 +1,346 @@ + + * Copyright (C) + * + * 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 3 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 myobject_list.php + * \ingroup mymodule + * \brief Page with list of myobject. + * + * List of myobject + */ + +//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); +//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); +//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); +//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); +//if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK','1'); // Do not check anti CSRF attack test +//if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK','1'); // Do not check style html tag into posted data +//if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL','1'); // Do not check anti POST attack test +//if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU','1'); // If there is no need to load and show top and left menu +//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML','1'); // If we don't need to load the html.form.class.php +//if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); +//if (! defined("NOLOGIN")) define("NOLOGIN",'1'); // If this page is public (can be called outside logged session) + +// Change the following lines to use the correct relative path (../, ../../, etc) + +// Load Dolibarr environment +if (false === (@include '../../main.inc.php')) { // From htdocs directory + require '../../../main.inc.php'; // From "custom" directory +} + +require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; +dol_include_once('/mymodule/class/myclass.class.php'); + +// Load translation files required by the page +$langs->load("mymodule@mymodule"); + +// Get parameters +$action = GETPOST('action','alpha'); +$confirm = GETPOST('confirm','alpha'); + +$id = GETPOST('id','int'); +$backtopage = GETPOST('backtopage'); +// TODO Add here list of search params +$myparam = GETPOST('myparam','alpha'); + +if (empty($action) && empty($id) && empty($ref)) $action='view'; + +// Protection if external user +if ($user->societe_id > 0) +{ + //accessforbidden(); +} +//$result = restrictedArea($user, 'mymodule', $id); + +$object = new Skeleton_Class($db); +$extrafields = new ExtraFields($db); + +// fetch optionals attributes and labels +$extralabels = $extrafields->fetch_name_optionals_label($object->table_element); + +// Load object +include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals + +// Initialize technical object to manage hooks of modules. Note that conf->hooks_modules contains array array +$hookmanager->initHooks(array('skeleton')); + + +/* + * ACTIONS + * + * Put here all code to do according to value of "action" parameter + */ + + +$parameters=array(); +$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks +if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + +if (empty($reshook)) +{ + if ($cancel) + { + if ($action != 'addlink') + { + $urltogo=$backtopage?$backtopage:dol_buildpath('/mymodule/list.php',1); + header("Location: ".$urltogo); + exit; + } + if ($id > 0 || ! empty($ref)) $ret = $object->fetch($id,$ref); + $action=''; + } + + // Action to add record + if ($action == 'add' && ! empty($user->rights->mymodule->create)) + { + if ($cancel) + { + $urltogo=$backtopage?$backtopage:dol_buildpath('/mymodule/list.php',1); + header("Location: ".$urltogo); + exit; + } + + $error=0; + + /* object_prop_getpost_prop */ + $object->prop1=GETPOST("field1"); + $object->prop2=GETPOST("field2"); + + if (empty($object->ref)) + { + $error++; + setEventMessages($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Ref")), null, 'errors'); + } + + if (! $error) + { + $result=$object->create($user); + if ($result > 0) + { + // Creation OK + $urltogo=$backtopage?$backtopage:dol_buildpath('/mymodule/list.php',1); + header("Location: ".$urltogo); + exit; + } + { + // Creation KO + if (! empty($object->errors)) setEventMessages(null, $object->errors, 'errors'); + else setEventMessages($object->error, null, 'errors'); + $action='create'; + } + } + else + { + $action='create'; + } + } + + // Action to update record + if ($action == 'update' && ! empty($user->rights->mymodule->create)) + { + $error=0; + + $object->prop1=GETPOST("field1"); + $object->prop2=GETPOST("field2"); + + if (empty($object->ref)) + { + $error++; + setEventMessages($langs->transnoentitiesnoconv("ErrorFieldRequired",$langs->transnoentitiesnoconv("Ref")), null, 'errors'); + } + + if (! $error) + { + $result=$object->update($user); + if ($result > 0) + { + $action='view'; + } + else + { + // Creation KO + if (! empty($object->errors)) setEventMessages(null, $object->errors, 'errors'); + else setEventMessages($object->error, null, 'errors'); + $action='edit'; + } + } + else + { + $action='edit'; + } + } + + // Action to delete + if ($action == 'confirm_delete' && ! empty($user->rights->mymodule->delete)) + { + $result=$object->delete($user); + if ($result > 0) + { + // Delete OK + setEventMessages("RecordDeleted", null, 'mesgs'); + header("Location: ".dol_buildpath('/mymodule/list.php',1)); + exit; + } + else + { + if (! empty($object->errors)) setEventMessages(null, $object->errors, 'errors'); + else setEventMessages($object->error, null, 'errors'); + } + } +} + + + +/* + * VIEW + * + * Put here all code to build page + */ + +$form = new Form($db); + +llxHeader('', $langs->trans('MyPageName'), ''); + + +// Put here content of your page + +// Example : Adding jquery code +print ''; + + +// Part to create +if ($action == 'create') +{ + print load_fiche_titre($langs->trans("NewMyModule")); + + print '
'; + print ''; + print ''; + + dol_fiche_head(); + + print ''."\n"; + // print ''; + // LIST_OF_TD_LABEL_FIELDS_CREATE + print '
'.$langs->trans("Label").'
'."\n"; + + dol_fiche_end(); + + print '
 
'; + + print '
'; +} + + + +// Part to edit record +if (($id || $ref) && $action == 'edit') +{ + print load_fiche_titre($langs->trans("MyModule")); + + print '
'; + print ''; + print ''; + print ''; + + dol_fiche_head(); + + print ''."\n"; + // print ''; + // LIST_OF_TD_LABEL_FIELDS_EDIT + print '
'.$langs->trans("Label").'
'; + + dol_fiche_end(); + + print '
'; + print '   '; + print '
'; + + print '
'; +} + + + +// Part to show record +if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) +{ + $res = $object->fetch_optionals($object->id, $extralabels); + + $head = commande_prepare_head($object); + dol_fiche_head($head, 'order', $langs->trans("CustomerOrder"), 0, 'order'); + + print load_fiche_titre($langs->trans("MyModule")); + + dol_fiche_head(); + + if ($action == 'delete') { + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('DeleteMyOjbect'), $langs->trans('ConfirmDeleteMyObject'), 'confirm_delete', '', 0, 1); + print $formconfirm; + } + + print ''."\n"; + // print ''; + // LIST_OF_TD_LABEL_FIELDS_VIEW + print '
'.$langs->trans("Label").''.$object->label.'
'; + + dol_fiche_end(); + + + // Buttons + print '
'."\n"; + $parameters=array(); + $reshook=$hookmanager->executeHooks('addMoreActionsButtons',$parameters,$object,$action); // Note that $action and $object may have been modified by hook + if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + + if (empty($reshook)) + { + if ($user->rights->mymodule->write) + { + print ''."\n"; + } + + if ($user->rights->mymodule->delete) + { + print ''."\n"; + } + } + print '
'."\n"; + + + // Example 2 : Adding links to objects + // Show links to link elements + //$linktoelem = $form->showLinkToObjectBlock($object, null, array('skeleton')); + //$somethingshown = $form->showLinkedObjectBlock($object, $linktoelem); + +} + +// End of page +llxFooter(); +$db->close(); diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 0581ed1960e..6d3464ccc20 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -1838,29 +1838,29 @@ class Societe extends CommonObject $name=$this->name?$this->name:$this->nom; - if (! empty($conf->global->SOCIETE_ADD_REF_IN_LIST) && (!empty($withpicto))) - { - if (($this->client) && (! empty ( $this->code_client )) - && ($conf->global->SOCIETE_ADD_REF_IN_LIST == 1 - || $conf->global->SOCIETE_ADD_REF_IN_LIST == 2 - ) - ) - $code = $this->code_client . ' - '; + if (! empty($conf->global->SOCIETE_ADD_REF_IN_LIST) && (!empty($withpicto))) + { + if (($this->client) && (! empty ( $this->code_client )) + && ($conf->global->SOCIETE_ADD_REF_IN_LIST == 1 + || $conf->global->SOCIETE_ADD_REF_IN_LIST == 2 + ) + ) + $code = $this->code_client . ' - '; - if (($this->fournisseur) && (! empty ( $this->code_fournisseur )) - && ($conf->global->SOCIETE_ADD_REF_IN_LIST == 1 - || $conf->global->SOCIETE_ADD_REF_IN_LIST == 3 - ) - ) - $code .= $this->code_fournisseur . ' - '; + if (($this->fournisseur) && (! empty ( $this->code_fournisseur )) + && ($conf->global->SOCIETE_ADD_REF_IN_LIST == 1 + || $conf->global->SOCIETE_ADD_REF_IN_LIST == 3 + ) + ) + $code .= $this->code_fournisseur . ' - '; + + if ($conf->global->SOCIETE_ADD_REF_IN_LIST == 1) + $name =$code.' '.$name; + else + $name =$code; + } - if ($conf->global->SOCIETE_ADD_REF_IN_LIST == 1) - $name =$code.' '.$name; - else - $name =$code; - } - - if (!empty($this->name_alias)) $name .= ' ('.$this->name_alias.')'; + if (!empty($this->name_alias)) $name .= ' ('.$this->name_alias.')'; $result=''; $label=''; $linkstart=''; $linkend=''; @@ -1962,7 +1962,7 @@ class Societe extends CommonObject $linkend=''; } - if ($withpicto) $result.=($linkstart.img_object(($notooltip?'':$label), 'company', ($notooltip?'':'class="classfortooltip"'), 0, 0, $notooltip?0:1).$linkend); + if ($withpicto) $result.=($linkstart.img_object(($notooltip?'':$label), 'company', ($notooltip?'':'class="classfortooltip valigntextbottom"'), 0, 0, $notooltip?0:1).$linkend); if ($withpicto && $withpicto != 2) $result.=' '; if ($withpicto != 2) $result.=$linkstart.($maxlen?dol_trunc($name,$maxlen):$name).$linkend; From 0156e99894cc25b183af899265b435cc8cd72318 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 13:46:02 +0200 Subject: [PATCH 060/299] Code comment --- htdocs/core/lib/functions.lib.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 78fbca7b0b5..bd3a79e7241 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -242,9 +242,10 @@ function dol_shutdown() * @param string $paramname Name of parameter to found * @param string $check Type of check (''=no check, 'int'=check it's numeric, 'alpha'=check it's text and sign, 'aZ'=check it's a-z only, 'array'=check it's array, 'san_alpha'=Use filter_var with FILTER_SANITIZE_STRING (do not use this for free text string), 'day', 'month', 'year', 'custom'= custom filter specify $filter and $options) * @param int $method Type of method (0 = get then post, 1 = only get, 2 = only post, 3 = post then get, 4 = post then get then cookie) - * @param int $filter Filter to apply when $check is set to custom. (See http://php.net/manual/en/filter.filters.php for détails) - * @param mixed $options Options to pass to filter_var when $check is set to custom + * @param int $filter Filter to apply when $check is set to 'custom'. (See http://php.net/manual/en/filter.filters.php for détails) + * @param mixed $options Options to pass to filter_var when $check is set to 'custom'. * @return string|string[] Value found (string or array), or '' if check fails + * @TODO Set default value for check to alpha. Check all WYSIWYG edition (email and description...) is still ok with rich text. */ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) { From ec03d1705b109547506685c985d0c342edfa5f94 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 13:56:05 +0200 Subject: [PATCH 061/299] Fix travis --- .../template/build/makepack-dolibarrmodule.pl | 388 ------------------ .../template/build/makepack-mymodule.conf | 17 +- .../template/class/ParsedownDolibarr.php | 48 --- .../template/class/actions_mymodule.class.php | 4 +- .../js/{myjs.js.php => mymodule.js.php} | 2 +- .../functional/MyModuleFunctionalTest.php | 10 +- .../template/test/unit/MyClassTest.php | 8 +- 7 files changed, 12 insertions(+), 465 deletions(-) delete mode 100644 htdocs/modulebuilder/template/build/makepack-dolibarrmodule.pl delete mode 100644 htdocs/modulebuilder/template/class/ParsedownDolibarr.php rename htdocs/modulebuilder/template/js/{myjs.js.php => mymodule.js.php} (96%) diff --git a/htdocs/modulebuilder/template/build/makepack-dolibarrmodule.pl b/htdocs/modulebuilder/template/build/makepack-dolibarrmodule.pl deleted file mode 100644 index 537fead0d40..00000000000 --- a/htdocs/modulebuilder/template/build/makepack-dolibarrmodule.pl +++ /dev/null @@ -1,388 +0,0 @@ -#!/usr/bin/perl -#---------------------------------------------------------------------------- -# \file build/makepack-dolibarrmodule.pl -# \brief Package builder (tgz, zip, rpm, deb, exe) -# \author (c)2005-2006 Laurent Destailleur -# (c)2016 Raphaël Doursenaud -#---------------------------------------------------------------------------- - -use Cwd; - - -@LISTETARGET=("TGZ"); # Possible packages -%REQUIREMENTTARGET=( # Tool requirement for each package -"TGZ"=>"tar", -"ZIP"=>"7z" -); -%ALTERNATEPATH=( -); - - -use vars qw/ $REVISION $VERSION /; -$REVISION='1.20'; -$VERSION="1.0 (build $REVISION)"; - - - -#------------------------------------------------------------------------------ -# MAIN -#------------------------------------------------------------------------------ -($DIR=$0) =~ s/([^\/\\]+)$//; ($PROG=$1) =~ s/\.([^\.]*)$//; $Extension=$1; -$DIR||='.'; $DIR =~ s/([^\/\\])[\\\/]+$/$1/; - -# Detect OS type -# -------------- -if ("$^O" =~ /linux/i || (-d "/etc" && -d "/var" && "$^O" !~ /cygwin/i)) { $OS='linux'; $CR=''; } -elsif (-d "/etc" && -d "/Users") { $OS='macosx'; $CR=''; } -elsif ("$^O" =~ /cygwin/i || "$^O" =~ /win32/i) { $OS='windows'; $CR="\r"; } -if (! $OS) { - print "makepack-dolbarrmodule.pl was not able to detect your OS.\n"; - print "Can't continue.\n"; - print "makepack-dolibarrmodule.pl aborted.\n"; - sleep 2; - exit 1; -} - -# Define buildroot -# ---------------- -if ($OS =~ /linux/) { - $TEMP=$ENV{"TEMP"}||$ENV{"TMP"}||"/tmp"; -} -if ($OS =~ /macos/) { - $TEMP=$ENV{"TEMP"}||$ENV{"TMP"}||"/tmp"; -} -if ($OS =~ /windows/) { - $TEMP=$ENV{"TEMP"}||$ENV{"TMP"}||"c:/temp"; - $PROGPATH=$ENV{"ProgramFiles"}; -} -if (! $TEMP || ! -d $TEMP) { - print "Error: A temporary directory can not be find.\n"; - print "Check that TEMP or TMP environment variable is set correctly.\n"; - print "makepack-dolibarrmodule.pl aborted.\n"; - sleep 2; - exit 2; -} -$BUILDROOT="$TEMP/dolibarr-buildroot"; - - -my $copyalreadydone=0; -my $batch=0; - -for (0..@ARGV-1) { - if ($ARGV[$_] =~ /^-*target=(\w+)/i) { $target=$1; $batch=1; } - if ($ARGV[$_] =~ /^-*desti=(.+)/i) { $DESTI=$1; } - if ($ARGV[$_] =~ /^-*prefix=(.+)/i) { - $PREFIX=$1; - $FILENAMESNAPSHOT.="-".$PREFIX; - } -} -$SOURCE="$DIR/.."; -$DESTI="$SOURCE/build"; -if ($ENV{"DESTIMODULES"}) { $DESTI = $ENV{"DESTIMODULES"}; } # Force output dir if env DESTIMODULES is defined -$NEWDESTI=$DESTI; - - -print "Makepack for modules version $VERSION\n"; -print "Source directory: $SOURCE\n"; -print "Target directory: $NEWDESTI\n"; - -# Autodetect version and module name -$mod_dir = "../core/modules/"; -opendir(DIR, $mod_dir); -@mod_files=grep { /^mod\w*\.class.php$/ } readdir(DIR); -foreach $file (@mod_files) { - $PROJECTINPUT=lc $1 if $file =~ /^mod(\w*)\.class.php$/; - $file = $mod_dir . $file; - open FILE, $file or die $!; - @file_content = ; - close FILE; - foreach $line (@file_content) { - # Extracts version number - $PROJVERSION=$1 if $line =~ /(?<=version\s=\s')(\d+(\.\d+){1,2})/; - } -} - -# Ask and set version $MAJOR, $MINOR and $BUILD -if ($PROJVERSION eq '') -{ - print "Enter value for version: "; - $PROJVERSION=; -} -chomp($PROJVERSION); -($MAJOR,$MINOR,$BUILD)=split(/\./,$PROJVERSION,3); -if ($MINOR eq '') -{ - print "Enter value for minor version: "; - $MINOR=; - chomp($MINOR); -} - -# Ask module -if ($PROJECTINPUT eq '') -{ - print "Enter name for your module (mymodule, mywonderfulmondule, ... or 'all') : "; - $PROJECTINPUT=; -} -chomp($PROJECTINPUT); -print "Move to ".$DIR." directory.\n"; -chdir($DIR); - - -my @PROJECTLIST=(); -if ($PROJECTINPUT eq "all") -{ - opendir(DIR, $DIR) || return; - local @rv = grep { /^makepack\-(.*)\.conf$/ } sort readdir(DIR); - closedir(DIR); - foreach my $xxx (0..@rv-1) { - if ($rv[$xxx] =~ /^makepack\-(.*)\.conf$/) - { - @PROJECTLIST[$xxx]=$1; - } - } -} -else -{ - @PROJECTLIST=($PROJECTINPUT); -} - - -# Loop on each projects -foreach my $PROJECT (@PROJECTLIST) { - - if (! -f "makepack-".$PROJECT.".conf") - { - print "Error: can't open conf file makepack-".$PROJECT.".conf\n"; - print "\n"; - print "For help on building a module package, see web page\n"; - print -"http://wiki.dolibarr.org/cindex.php/Module_development#Create_a_package_to_distribute_and_install_your_module\n"; - print "makepack-dolibarrmodule.pl aborted.\n"; - sleep 2; - exit 2; - } - - $FILENAME="$PROJECT"; - $FILENAMETGZ="module_$PROJECT-$MAJOR.$MINOR".($BUILD ne ''?".$BUILD":""); - $FILENAMEZIP="module_$PROJECT-$MAJOR.$MINOR".($BUILD ne ''?".$BUILD":""); - if (-d "/usr/src/redhat") { - # redhat - $RPMDIR="/usr/src/redhat"; - } - if (-d "/usr/src/RPM") { - # mandrake - $RPMDIR="/usr/src/RPM"; - } - - - # Choose package targets - #----------------------- - $target="ZIP"; # Dolibarr modules are this format - $CHOOSEDTARGET{uc($target)}=1; - - - # Test if requirement is ok - #-------------------------- - foreach my $target (keys %CHOOSEDTARGET) { - foreach my $req (split(/[,\s]/,$REQUIREMENTTARGET{$target})) { - # Test - print "Test requirement for target $target: Search '$req'... "; - $ret=`"$req" 2>&1`; - $coderetour=$?; $coderetour2=$coderetour>>8; - if ($coderetour != 0 && (($coderetour2 == 1 && $OS =~ /windows/ && $ret !~ /Usage/i) || ($coderetour2 == 127 && $OS !~ /windows/)) && $PROGPATH) { - # Not found error, we try in PROGPATH - $ret=`"$PROGPATH/$ALTERNATEPATH{$req}/$req\" 2>&1`; - $coderetour=$?; $coderetour2=$coderetour>>8; - $REQUIREMENTTARGET{$target}="$PROGPATH/$ALTERNATEPATH{$req}/$req"; - } - - if ($coderetour != 0 && (($coderetour2 == 1 && $OS =~ /windows/ && $ret !~ /Usage/i) || ($coderetour2 == 127 && $OS !~ /windows/))) { - # Not found error - print "Not found\nCan't build target $target. Requirement '$req' not found in PATH\n"; - $CHOOSEDTARGET{$target}=-1; - last; - } else { - # Pas erreur ou erreur autre que programme absent - print " Found ".$REQUIREMENTTARGET{$target}."\n"; - } - } - } - - print "\n"; - - # Check if there is at least on target to build - #---------------------------------------------- - $nboftargetok=0; - $nboftargetneedbuildroot=0; - $nboftargetneedcvs=0; - foreach my $target (keys %CHOOSEDTARGET) { - if ($CHOOSEDTARGET{$target} < 0) { next; } - if ($target ne 'EXE' && $target ne 'EXEDOLIWAMP') - { - $nboftargetneedbuildroot++; - } - if ($target eq 'SNAPSHOT') - { - $nboftargetneedcvs++; - } - $nboftargetok++; - } - - if ($nboftargetok) { - - # Update CVS if required - #----------------------- - if ($nboftargetneedcvs) - { - print "Go to directory $SOURCE\n"; - $olddir=getcwd(); - chdir("$SOURCE"); - print "Run cvs update -P -d\n"; - $ret=`cvs update -P -d 2>&1`; - chdir("$olddir"); - } - - # Update buildroot if required - #----------------------------- - if ($nboftargetneedbuildroot) - { - if (! $copyalreadydone) { - print "Delete directory $BUILDROOT\n"; - $ret=`rm -fr "$BUILDROOT"`; - - mkdir "$BUILDROOT"; - mkdir "$BUILDROOT/$PROJECT"; - - $result=open(IN,") - { - if ($_ =~ /^#/) { next; } # Do not process comments - - $_ =~ s/\n//; - $_ =~ /^(.*)\/[^\/]+/; - print "Create directory $BUILDROOT/$PROJECT/$1\n"; - $ret=`mkdir -p "$BUILDROOT/$PROJECT/$1"`; - if ($_ !~ /version\-/) - { - print "Copy $SOURCE/$_ into $BUILDROOT/$PROJECT/$_\n"; - $ret=`cp -pr "$SOURCE/$_" "$BUILDROOT/$PROJECT/$_"`; - } - } - close IN; - - @timearray=localtime(time()); - $fulldate=($timearray[5]+1900).'-'.($timearray[4]+1).'-'.$timearray[3].' '.$timearray[2].':'.$timearray[1]; -# open(VF,">$BUILDROOT/$PROJECT/build/version-".$PROJECT.".txt"); -# -# print "Create version file $BUILDROOT/$PROJECT/build/version-".$PROJECT.".txt with date ".$fulldate."\n"; -# $ret=`mkdir -p "$BUILDROOT/$PROJECT/build"`; -# print VF "Version: ".$MAJOR.".".$MINOR.($BUILD ne ''?".$BUILD":"")."\n"; -# print VF "Build : ".$fulldate."\n"; -# close VF; - } - print "Clean $BUILDROOT\n"; - $ret=`rm -fr $BUILDROOT/$PROJECT/.cache`; - $ret=`rm -fr $BUILDROOT/$PROJECT/.project`; - $ret=`rm -fr $BUILDROOT/$PROJECT/.settings`; - $ret=`rm -fr $BUILDROOT/$PROJECT/build/html`; - $ret=`rm -fr $BUILDROOT/$PROJECT/documents`; - $ret=`rm -fr $BUILDROOT/$PROJECT/document`; - $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/conf/conf.php.mysql`; - $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/conf/conf.php.old`; - $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/conf/conf.php.postgres`; - $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/conf/conf*sav*`; - $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/custom`; - $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/custom2`; - $ret=`rm -fr $BUILDROOT/$PROJECT/htdocs/theme/bureau2crea`; - $ret=`rm -fr $BUILDROOT/$PROJECT/test`; - $ret=`rm -fr $BUILDROOT/$PROJECT/Thumbs.db $BUILDROOT/$PROJECT/*/Thumbs.db $BUILDROOT/$PROJECT/*/*/Thumbs.db $BUILDROOT/$PROJECT/*/*/*/Thumbs.db $BUILDROOT/$PROJECT/*/*/*/*/Thumbs.db`; - $ret=`rm -fr $BUILDROOT/$PROJECT/CVS* $BUILDROOT/$PROJECT/*/CVS* $BUILDROOT/$PROJECT/*/*/CVS* $BUILDROOT/$PROJECT/*/*/*/CVS* $BUILDROOT/$PROJECT/*/*/*/*/CVS* $BUILDROOT/$PROJECT/*/*/*/*/*/CVS*`; - } - - # Build package for each target - #------------------------------ - foreach my $target (keys %CHOOSEDTARGET) { - if ($CHOOSEDTARGET{$target} < 0) { next; } - - print "\nBuild package for target $target\n"; - - if ($target eq 'TGZ') { - $NEWDESTI=$DESTI; - if (-d $DESTI.'/../modules') { $NEWDESTI=$DESTI.'/../modules'; } - - print "Remove target $FILENAMETGZ.tgz...\n"; - unlink("$NEWDESTI/$FILENAMETGZ.tgz"); - print "Compress $BUILDROOT/* into $FILENAMETGZ.tgz...\n"; - $cmd="tar --exclude-vcs --exclude *.tgz --directory \"$BUILDROOT\" --mode=go-w --group=500 --owner=500 -czvf \"$FILENAMETGZ.tgz\" ."; - $ret=`$cmd`; - if ($OS =~ /windows/i) { - print "Move $FILENAMETGZ.tgz to $NEWDESTI/$FILENAMETGZ.tgz\n"; - $ret=`mv "$FILENAMETGZ.tgz" "$NEWDESTI/$FILENAMETGZ.tgz"`; - } - else - { - $ret=`mv "$FILENAMETGZ.tgz" "$NEWDESTI/$FILENAMETGZ.tgz"`; - } - next; - } - - if ($target eq 'ZIP') { - $NEWDESTI=$DESTI; - if (-d $DESTI.'/../modules') { $NEWDESTI=$DESTI.'/../modules'; } - - print "Remove target $FILENAMEZIP.zip...\n"; - unlink "$NEWDESTI/$FILENAMEZIP.zip"; - print "Compress $FILENAMEZIP into $FILENAMEZIP.zip...\n"; - - print "Go to directory $BUILDROOT\n"; - $olddir=getcwd(); - chdir("$BUILDROOT"); - $cmd= "7z a -r -tzip -mx $BUILDROOT/$FILENAMEZIP.zip *"; - print $cmd."\n"; - $ret= `$cmd`; - chdir("$olddir"); - - print "Move $FILENAMEZIP.zip to $NEWDESTI/$FILENAMEZIP.zip\n"; - $ret=`mv "$BUILDROOT/$FILENAMEZIP.zip" "$NEWDESTI/$FILENAMEZIP.zip"`; - next; - } - - if ($target eq 'EXE') { - $NEWDESTI=$DESTI; - if (-d $DESTI.'/../modules') { $NEWDESTI=$DESTI.'/../modules'; } - - print "Remove target $FILENAMEEXE.exe...\n"; - unlink "$NEWDESTI/$FILENAMEEXE.exe"; - print "Compress into $FILENAMEEXE.exe by $FILENAMEEXE.nsi...\n"; - $command="\"$REQUIREMENTTARGET{$target}\" /DMUI_VERSION_DOT=$MAJOR.$MINOR.$BUILD /X\"SetCompressor bzip2\" \"$SOURCE\\build\\exe\\$FILENAME.nsi\""; - print "$command\n"; - $ret=`$command`; - print "Move $FILENAMEEXE.exe to $NEWDESTI\n"; - rename("$SOURCE\\build\\exe\\$FILENAMEEXE.exe","$NEWDESTI/$FILENAMEEXE.exe"); - next; - } - - } - - } - - print "\n----- Summary -----\n"; - foreach my $target (keys %CHOOSEDTARGET) { - if ($CHOOSEDTARGET{$target} < 0) { - print "Package $target not built (bad requirement).\n"; - } else { - print "Package $target built successfully in $NEWDESTI\n"; - } - } - - -} - - -if (! $batch) { - print "\nPress key to finish..."; - my $WAITKEY=; -} - -0; diff --git a/htdocs/modulebuilder/template/build/makepack-mymodule.conf b/htdocs/modulebuilder/template/build/makepack-mymodule.conf index c7a47fbe45e..16dc1e7b82b 100644 --- a/htdocs/modulebuilder/template/build/makepack-mymodule.conf +++ b/htdocs/modulebuilder/template/build/makepack-mymodule.conf @@ -8,19 +8,4 @@ # Setup: Go on Dolibarr setup - modules to enable module. # # Files in module -index.php -mypage.php -admin/ -class/ -COPYING -core/ -css/ -doc/ -img/ -js/ -langs/ -lib/ -scripts/ -sql/ -vendor/ -README.md +mymodule/ \ No newline at end of file diff --git a/htdocs/modulebuilder/template/class/ParsedownDolibarr.php b/htdocs/modulebuilder/template/class/ParsedownDolibarr.php deleted file mode 100644 index 45cf82f4b9c..00000000000 --- a/htdocs/modulebuilder/template/class/ParsedownDolibarr.php +++ /dev/null @@ -1,48 +0,0 @@ - - * - * 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 3 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 class/ParsedownDolibarr.php - * \ingroup mymodule - * \brief Custom Parsedown class to display inline images from the README.md in the about page - */ - -/** Includes */ -require __DIR__ . '/../vendor/autoload.php'; - -/** - * Class ParsedownDolibarr - */ -class ParsedownDolibarr extends Parsedown -{ - /** - * Resolve inline images relative URLs to the module's path - * - * @param $Excerpt - * @return array|void - */ - protected function inlineImage($Excerpt) - { - $image = parent::inlineImage($Excerpt); - $path = new \Enrise\Uri($image['element']['attributes']['src']); - if ($path->isRelative()) { - $image['element']['attributes']['src'] = dol_buildpath('/mymodule/' . $path, 1); - } - return $image; - } -} diff --git a/htdocs/modulebuilder/template/class/actions_mymodule.class.php b/htdocs/modulebuilder/template/class/actions_mymodule.class.php index 1361a7b4897..7047332bbfc 100644 --- a/htdocs/modulebuilder/template/class/actions_mymodule.class.php +++ b/htdocs/modulebuilder/template/class/actions_mymodule.class.php @@ -55,8 +55,8 @@ class ActionsMyModule * Overloading the doActions function : replacing the parent's function with the one below * * @param array() $parameters Hook metadatas (context, etc...) - * @param CommonObject &$object The object to process (an invoice if you are in invoice module, a propale in propale's module, etc...) - * @param string &$action Current action (if set). Generally create or edit or null + * @param CommonObject $object The object to process (an invoice if you are in invoice module, a propale in propale's module, etc...) + * @param string $action Current action (if set). Generally create or edit or null * @param HookManager $hookmanager Hook manager propagated to allow calling another hook * @return int < 0 on error, 0 on success, 1 to replace standard code */ diff --git a/htdocs/modulebuilder/template/js/myjs.js.php b/htdocs/modulebuilder/template/js/mymodule.js.php similarity index 96% rename from htdocs/modulebuilder/template/js/myjs.js.php rename to htdocs/modulebuilder/template/js/mymodule.js.php index b2649676f14..ae8ce6cbe0d 100644 --- a/htdocs/modulebuilder/template/js/myjs.js.php +++ b/htdocs/modulebuilder/template/js/mymodule.js.php @@ -17,7 +17,7 @@ */ /** - * \file js/myjs.js.php + * \file js/mymodule.js.php * \ingroup mymodule * \brief Example JavaScript. * diff --git a/htdocs/modulebuilder/template/test/functional/MyModuleFunctionalTest.php b/htdocs/modulebuilder/template/test/functional/MyModuleFunctionalTest.php index 3a310e48f66..41dc9891af7 100644 --- a/htdocs/modulebuilder/template/test/functional/MyModuleFunctionalTest.php +++ b/htdocs/modulebuilder/template/test/functional/MyModuleFunctionalTest.php @@ -39,7 +39,7 @@ use PHPUnit_Extensions_Selenium2TestCase_WebDriverException; * @todo Windows support (IE, Google Chrome, Mozilla Firefox, Safari) * @todo OSX support (Safari, Google Chrome, Mozilla Firefox) * - * @package test\functional + * @package Testmymodule */ class MyModuleFunctionalTest extends \PHPUnit_Extensions_Selenium2TestCase { @@ -82,8 +82,8 @@ class MyModuleFunctionalTest extends \PHPUnit_Extensions_Selenium2TestCase /** * Helper function to select links by href * - * @param $value - * @return mixed + * @param string $value Href + * @return mixed Helper string */ protected function byHref($value) { @@ -261,9 +261,7 @@ class MyModuleFunctionalTest extends \PHPUnit_Extensions_Selenium2TestCase $this->authenticate(); return $this->assertContains( 'tick.png', - $this - ->byXPath('//td[text()="interface_99_modMyModule_MyTrigger.class.php"]/following::img') - ->attribute('src'), + $this->byXPath('//td[text()="interface_99_modMyModule_MyTrigger.class.php"]/following::img')->attribute('src'), "Trigger enabled" ); } diff --git a/htdocs/modulebuilder/template/test/unit/MyClassTest.php b/htdocs/modulebuilder/template/test/unit/MyClassTest.php index 16016baf117..94898e9209b 100644 --- a/htdocs/modulebuilder/template/test/unit/MyClassTest.php +++ b/htdocs/modulebuilder/template/test/unit/MyClassTest.php @@ -28,7 +28,7 @@ namespace test\unit; /** * Class MyClassTest - * @package test\unit + * @package Testmymodule */ class MyClassTest extends \PHPUnit_Framework_TestCase { @@ -93,10 +93,10 @@ class MyClassTest extends \PHPUnit_Framework_TestCase /** * Unsuccessful test * - * @param \Exception $e - * @throws \Exception + * @param Exception $e Exception + * @throws Exception */ - protected function onNotSuccessfulTest(\Exception $e) + protected function onNotSuccessfulTest(Exception $e) { fwrite(STDOUT, __METHOD__ . "\n"); throw $e; From 8781f6bcf2a49677b0b2dc4e071165ffd6a54aaa Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 14:53:20 +0200 Subject: [PATCH 062/299] Add vat code on predefined invoice --- htdocs/install/mysql/migration/5.0.0-6.0.0.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index d2431186ed7..dbc33e384ef 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -24,6 +24,8 @@ -- -- VPGSQL8.2 DELETE FROM llx_usergroup_user WHERE fk_user NOT IN (SELECT rowid from llx_user); -- -- VMYSQL4.1 DELETE FROM llx_usergroup_user WHERE fk_usergroup NOT IN (SELECT rowid from llx_usergroup); +ALTER TABLE llx_facturedet_rec ADD COLUMN vat_src_code varchar(10) DEFAULT '' AFTER tva_tx; + ALTER TABLE llx_extrafields ADD COLUMN langs varchar(24); ALTER TABLE llx_supplier_proposaldet ADD COLUMN fk_unit integer DEFAULT NULL; From 984531411d123527f7209eef1e459d74dfe16ae2 Mon Sep 17 00:00:00 2001 From: Marc de Lima Lucio Date: Wed, 10 May 2017 15:01:27 +0200 Subject: [PATCH 063/299] NEW: permit multiple file upload in linked documents --- htdocs/core/class/html.formfile.class.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 8d90892cfb6..022579b3a7c 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -126,7 +126,9 @@ class FormFile { $out .= ''; } - $out .= 'global->MAIN_USE_MULTIPLE_FILEUPLOAD)?' name="userfile"':' name="userfile[]" multiple'); $out .= (empty($conf->global->MAIN_UPLOAD_DOC) || empty($perm)?' disabled':''); $out .= '>'; $out .= ' '; From 70de54e97dfd85fa601ef4af22500824bf890037 Mon Sep 17 00:00:00 2001 From: Thomas Raschbacher Date: Wed, 10 May 2017 15:21:53 +0200 Subject: [PATCH 064/299] fix project extrafields for ODT for some raeson the code was checking for already existing extra fields before even fetching it. removed the if condition, now it works fine. --- .../doc/doc_generic_project_odt.modules.php | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/htdocs/core/modules/project/doc/doc_generic_project_odt.modules.php b/htdocs/core/modules/project/doc/doc_generic_project_odt.modules.php index fbe3db84370..e050bf8e3eb 100644 --- a/htdocs/core/modules/project/doc/doc_generic_project_odt.modules.php +++ b/htdocs/core/modules/project/doc/doc_generic_project_odt.modules.php @@ -131,18 +131,15 @@ class doc_generic_project_odt extends ModelePDFProjects ); // Retrieve extrafields - if (is_array($object->array_options) && count($object->array_options)) - { - $extrafieldkey=$object->element; + $extrafieldkey=$object->element; - require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; - $extrafields = new ExtraFields($this->db); - $extralabels = $extrafields->fetch_name_optionals_label($extrafieldkey,true); - $object->fetch_optionals($object->id,$extralabels); - - $resarray = $this->fill_substitutionarray_with_extrafields($object,$resarray,$extrafields,$array_key,$outputlangs); - } + require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; + $extrafields = new ExtraFields($this->db); + $extralabels = $extrafields->fetch_name_optionals_label($extrafieldkey,true); + $object->fetch_optionals($object->id,$extralabels); + $resarray = $this->fill_substitutionarray_with_extrafields($object,$resarray,$extrafields,$array_key,$outputlangs); + return $resarray; } From bba8f972a191a9dc7d596f3a083c6a60ee055a1d Mon Sep 17 00:00:00 2001 From: alexis Algoud Date: Wed, 10 May 2017 16:10:14 +0200 Subject: [PATCH 065/299] FIX situation invoice broken due to the all percent application form inside addline form --- htdocs/compta/facture.php | 43 ++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index 05174fd940b..c9f223723be 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -3800,30 +3800,20 @@ else if ($id > 0 || ! empty($ref)) // Lines $result = $object->getLinesArray(); - print '
- - - - - '; - - if (! empty($conf->use_javascript_ajax) && $object->statut == 0) { - include DOL_DOCUMENT_ROOT . '/core/tpl/ajaxrow.tpl.php'; - } - - print '
'; - print ''; - // Show global modifiers if (! empty($conf->global->INVOICE_USE_SITUATION)) { if ($object->situation_cycle_ref && $object->statut == 0) { + print '
'; + print '
'; + + print ''; print ''; print ''; print ''; print ''; - + if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER)) { print ''; } @@ -3846,7 +3836,7 @@ else if ($id > 0 || ! empty($ref)) print ''; print ''; print "\n"; - + if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER)) { print ''; } @@ -3860,8 +3850,29 @@ else if ($id > 0 || ! empty($ref)) print ''; print ''; print ''; + + print '
   
 
'; + print '
'; + } + } + + + + print '
+ + + + + '; + + if (! empty($conf->use_javascript_ajax) && $object->statut == 0) { + include DOL_DOCUMENT_ROOT . '/core/tpl/ajaxrow.tpl.php'; + } + + print '
'; + print ''; // Show object lines if (! empty($object->lines)) From b7b16dc632daea9f0cbd8c76e98a3d354e8a3876 Mon Sep 17 00:00:00 2001 From: philippe grand Date: Wed, 10 May 2017 16:41:19 +0200 Subject: [PATCH 066/299] Update code using new css class --- htdocs/commande/stats/index.php | 5 ++--- htdocs/compta/bank/bilan.php | 8 ++++---- htdocs/compta/facture/card.php | 12 ++++-------- htdocs/compta/facture/stats/index.php | 5 ++--- htdocs/compta/journal/purchasesjournal.php | 5 +---- htdocs/compta/journal/sellsjournal.php | 5 +---- htdocs/compta/paiement/rapport.php | 4 ++-- htdocs/compta/prelevement/bons.php | 6 ++---- htdocs/compta/prelevement/fiche-rejet.php | 3 +-- htdocs/compta/prelevement/fiche-stat.php | 4 +--- htdocs/compta/prelevement/ligne.php | 5 +---- htdocs/compta/prelevement/list.php | 8 ++------ htdocs/compta/prelevement/rejets.php | 4 +--- htdocs/compta/prelevement/stats.php | 11 ++--------- 14 files changed, 26 insertions(+), 59 deletions(-) diff --git a/htdocs/commande/stats/index.php b/htdocs/commande/stats/index.php index dd79ee54ba1..8967e22a160 100644 --- a/htdocs/commande/stats/index.php +++ b/htdocs/commande/stats/index.php @@ -316,7 +316,6 @@ print ''; print ''; $oldyear=0; -$var=true; foreach ($data as $val) { $year = $val['year']; @@ -324,7 +323,7 @@ foreach ($data as $val) { // If we have empty year $oldyear--; - print ''; + print ''; print ''; print ''; print ''; @@ -336,7 +335,7 @@ foreach ($data as $val) } - print ''; + print ''; print ''; print ''; print ''; diff --git a/htdocs/compta/bank/bilan.php b/htdocs/compta/bank/bilan.php index eb6aea4f2dc..2b3c897f3ce 100644 --- a/htdocs/compta/bank/bilan.php +++ b/htdocs/compta/bank/bilan.php @@ -69,22 +69,22 @@ print "\n"; $sql = "SELECT sum(amount) as amount FROM ".MAIN_DB_PREFIX."paiement"; $paiem = valeur($sql); -print ""; +print ''; $sql = "SELECT sum(amount) as amount FROM ".MAIN_DB_PREFIX."bank WHERE amount > 0"; $credits = valeur($sql); -print ""; +print ''; $sql = "SELECT sum(amount) as amount FROM ".MAIN_DB_PREFIX."bank WHERE amount < 0"; $debits = valeur($sql); -print ""; +print ''; $sql = "SELECT sum(amount) as amount FROM ".MAIN_DB_PREFIX."bank "; $solde = valeur($sql); -print ""; +print ''; print "
%
0?'&userid='.$userid:'').'">'.$oldyear.'0
0?'&userid='.$userid:'').'">'.$year.''.$val['nb'].''.round($val['nb_diff']).'
Somme des paiements (associes a une facture)".price($paiem)."
Somme des paiements (associes a une facture)".price($paiem)."
Somme des credits".price($credits)."
Somme des credits".price($credits)."
Somme des debits".price($debits)."
Somme des debits".price($debits)."
".$langs->trans("BankBalance")."".price($solde)."
".$langs->trans("BankBalance")."".price($solde)."
"; diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 9483e79dba4..495085bc274 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -3599,12 +3599,11 @@ else if ($id > 0 || ! empty($ref)) print ''; $total_prev_ht = $total_prev_ttc = 0; - $var = true; foreach ($object->tab_previous_situation_invoice as $prev_invoice) { $totalpaye = $prev_invoice->getSommePaiement(); $total_prev_ht += $prev_invoice->total_ht; $total_prev_ttc += $prev_invoice->total_ttc; - print ''; + print ''; print '' . $prev_invoice->getNomUrl(1) . ''; print ''; if (! empty($conf->banque->enabled)) @@ -3614,10 +3613,9 @@ else if ($id > 0 || ! empty($ref)) print '' . $prev_invoice->getLibStatut(3, $totalpaye) . ''; print ''; - $var = ! $var; } - print ''; + print ''; print ''; print '' . price($total_prev_ht) . ''; print '' . price($total_prev_ttc) . ''; @@ -3638,12 +3636,11 @@ else if ($id > 0 || ! empty($ref)) $total_next_ht = $total_next_ttc = 0; - $var = true; foreach ($object->tab_next_situation_invoice as $next_invoice) { $totalpaye = $next_invoice->getSommePaiement(); $total_next_ht += $next_invoice->total_ht; $total_next_ttc += $next_invoice->total_ttc; - print ''; + print ''; print '' . $next_invoice->getNomUrl(1) . ''; print ''; if (! empty($conf->banque->enabled)) print ''; @@ -3652,10 +3649,9 @@ else if ($id > 0 || ! empty($ref)) print '' . $next_invoice->getLibStatut(3, $totalpaye) . ''; print ''; - $var = ! $var; } - print ''; + print ''; print ''; if (! empty($conf->banque->enabled)) print ''; diff --git a/htdocs/compta/facture/stats/index.php b/htdocs/compta/facture/stats/index.php index 77191136338..55ff4dad6e3 100644 --- a/htdocs/compta/facture/stats/index.php +++ b/htdocs/compta/facture/stats/index.php @@ -293,7 +293,6 @@ print '%'; print ''; $oldyear=0; -$var=true; foreach ($data as $val) { $year = $val['year']; @@ -301,7 +300,7 @@ foreach ($data as $val) { // If we have empty year $oldyear--; - print ''; + print ''; print '0?'&userid='.$userid:'').'">'.$oldyear.''; print '0'; print ''; @@ -312,7 +311,7 @@ foreach ($data as $val) print ''; } - print ''; + print ''; print '0?'&userid='.$userid:'').'">'.$year.''; print ''.$val['nb'].''; print ''.round($val['nb_diff']).''; diff --git a/htdocs/compta/journal/purchasesjournal.php b/htdocs/compta/journal/purchasesjournal.php index f0b520bb11e..fbd391ffe2a 100644 --- a/htdocs/compta/journal/purchasesjournal.php +++ b/htdocs/compta/journal/purchasesjournal.php @@ -184,7 +184,6 @@ print "".$langs->trans("Account").""; print "".$langs->trans("Type")."".$langs->trans("Debit")."".$langs->trans("Credit").""; print "\n"; -$var=false; $invoicestatic=new FactureFournisseur($db); $companystatic=new Fournisseur($db); @@ -229,7 +228,7 @@ foreach ($tabfac as $key => $val) { if (isset($line['nomtcheck']) || $mt) { - print ""; + print ''; print "".dol_print_date($db->jdate($val["date"])).""; print "".$invoicestatic->getNomUrl(1).""; print "".$k."".$line['label'].""; @@ -249,8 +248,6 @@ foreach ($tabfac as $key => $val) } } } - - $var = !$var; } print ""; diff --git a/htdocs/compta/journal/sellsjournal.php b/htdocs/compta/journal/sellsjournal.php index 670d89fd2cb..fd0c45be7cd 100644 --- a/htdocs/compta/journal/sellsjournal.php +++ b/htdocs/compta/journal/sellsjournal.php @@ -216,7 +216,6 @@ print ''.$langs->trans('Account').''; print ''.$langs->trans('Type').''.$langs->trans('Debit').''.$langs->trans('Credit').''; print "\n"; -$var=false; $invoicestatic=new Facture($db); $companystatic=new Client($db); @@ -262,7 +261,7 @@ foreach ($tabfac as $key => $val) { if (isset($line['nomtcheck']) || $mt) { - print ""; + print ''; print "".dol_print_date($db->jdate($val["date"])).""; print "".$invoicestatic->getNomUrl(1).""; print "".$k."".$line['label'].""; @@ -282,8 +281,6 @@ foreach ($tabfac as $key => $val) } } } - - $var = !$var; } print ""; diff --git a/htdocs/compta/paiement/rapport.php b/htdocs/compta/paiement/rapport.php index e9a90667e69..c73f79c60a4 100644 --- a/htdocs/compta/paiement/rapport.php +++ b/htdocs/compta/paiement/rapport.php @@ -145,7 +145,7 @@ if ($year) print ''.$langs->trans("Size").''; print ''.$langs->trans("Date").''; print ''; - $var=true; + if (is_resource($handle)) { while (($file = readdir($handle))!==false) @@ -155,7 +155,7 @@ if ($year) $tfile = $dir . '/'.$year.'/'.$file; $relativepath = $year.'/'.$file; - print "".''.img_pdf().' '.$file.''; + print ''.''.img_pdf().' '.$file.''; print ''.dol_print_size(dol_filesize($tfile)).''; print ''.dol_print_date(dol_filemtime($tfile),"dayhour").''; } diff --git a/htdocs/compta/prelevement/bons.php b/htdocs/compta/prelevement/bons.php index dbbf9d09ac7..973135765dc 100644 --- a/htdocs/compta/prelevement/bons.php +++ b/htdocs/compta/prelevement/bons.php @@ -129,14 +129,12 @@ if ($result) print ''; print ''; - $var=True; while ($i < min($num,$limit)) { - $obj = $db->fetch_object($result); - + $obj = $db->fetch_object($result); - print ""; + print ''; print $bon->LibStatut($obj->statut,2); print " "; diff --git a/htdocs/compta/prelevement/fiche-rejet.php b/htdocs/compta/prelevement/fiche-rejet.php index 064f41e41e8..f2240a070e6 100644 --- a/htdocs/compta/prelevement/fiche-rejet.php +++ b/htdocs/compta/prelevement/fiche-rejet.php @@ -138,7 +138,6 @@ if ($resql) print ''.$langs->trans("Line").''.$langs->trans("ThirdParty").''.$langs->trans("Amount").''; print ''.$langs->trans("Reason").''.$langs->trans("ToBill").''.$langs->trans("Invoice").''; - $var=True; $total = 0; if ($num > 0) @@ -148,7 +147,7 @@ if ($resql) { $obj = $db->fetch_object($resql); - print ""; + print ''; print ''; print img_picto('', 'statut'.$obj->statut).' '; diff --git a/htdocs/compta/prelevement/fiche-stat.php b/htdocs/compta/prelevement/fiche-stat.php index c5d441e3260..7e0c4f81e4b 100644 --- a/htdocs/compta/prelevement/fiche-stat.php +++ b/htdocs/compta/prelevement/fiche-stat.php @@ -127,13 +127,11 @@ if ($prev_id) print ''; print ''.$langs->trans("Status").''.$langs->trans("Amount").'%'; - $var=false; - while ($i < $num) { $row = $db->fetch_row($resql); - print ""; + print ''; print $ligne->LibStatut($row[1],1); diff --git a/htdocs/compta/prelevement/ligne.php b/htdocs/compta/prelevement/ligne.php index 64ddb12a7bc..933c23b0e7e 100644 --- a/htdocs/compta/prelevement/ligne.php +++ b/htdocs/compta/prelevement/ligne.php @@ -298,16 +298,13 @@ if ($id) print ''.$langs->trans("Invoice").''.$langs->trans("ThirdParty").''.$langs->trans("Amount").''.$langs->trans("Status").''; print ''; - $var=True; - $total = 0; - $var=false; while ($i < min($num,$conf->liste_limit)) { $obj = $db->fetch_object($result); - print ""; + print ''; print ''; print img_object($langs->trans("ShowBill"),"bill"); diff --git a/htdocs/compta/prelevement/list.php b/htdocs/compta/prelevement/list.php index f7fe4b77e7d..2fa8a255407 100644 --- a/htdocs/compta/prelevement/list.php +++ b/htdocs/compta/prelevement/list.php @@ -159,15 +159,11 @@ if ($result) print ''; print ''; - $var=True; - while ($i < min($num,$limit)) { - $obj = $db->fetch_object($result); + $obj = $db->fetch_object($result); - - - print ""; + print ''; print $ligne->LibStatut($obj->statut_ligne,2); print " "; diff --git a/htdocs/compta/prelevement/rejets.php b/htdocs/compta/prelevement/rejets.php index ef72ca8f6e5..0f737a50f22 100644 --- a/htdocs/compta/prelevement/rejets.php +++ b/htdocs/compta/prelevement/rejets.php @@ -94,15 +94,13 @@ if ($result) print_liste_field_titre($langs->trans("Reason"),$_SERVER["PHP_SELF"],"pr.motif","",$urladd); print "\n"; - $var=True; - $total = 0; while ($i < min($num,$conf->liste_limit)) { $obj = $db->fetch_object($result); - print ""; + print ''; print $ligne->LibStatut($obj->statut,2).' '; print ''; diff --git a/htdocs/compta/prelevement/stats.php b/htdocs/compta/prelevement/stats.php index b666b355e24..406c2303b6a 100644 --- a/htdocs/compta/prelevement/stats.php +++ b/htdocs/compta/prelevement/stats.php @@ -96,13 +96,11 @@ if ($resql) print ''.$langs->trans("Status").''.$langs->trans("Number").'%'; print ''.$langs->trans("Amount").'%'; - $var=false; - while ($i < $num) { $row = $db->fetch_row($resql); - print ""; + print ''; print $ligne->LibStatut($row[2],1); //print $st[$row[2]]; @@ -119,7 +117,6 @@ if ($resql) print ''; print round($row[0]/$total*100,2)." %"; print ''; - $i++; } @@ -192,8 +189,6 @@ if ($resql) print ''.$langs->trans("Status").''.$langs->trans("Number").''; print '%'.$langs->trans("Amount").'%'; - $var=True; - require_once DOL_DOCUMENT_ROOT.'/compta/prelevement/class/rejetprelevement.class.php'; $Rejet = new RejetPrelevement($db, $user); @@ -201,7 +196,7 @@ if ($resql) { $row = $db->fetch_row($resql); - print ""; + print ''; print $Rejet->motifs[$row[2]]; print ''.$row[1]; @@ -215,9 +210,7 @@ if ($resql) print ''; print round($row[0]/$total*100,2)." %"; - print ''; - $i++; } From fe8d34c73b8cd741add2c0507ba553dbb89b9fb1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 17:50:10 +0200 Subject: [PATCH 067/299] Add field extraparams on llx_bank_account --- htdocs/install/mysql/migration/5.0.0-6.0.0.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index dbc33e384ef..b13bd6e649a 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -50,6 +50,7 @@ ALTER TABLE llx_holiday ADD COLUMN extraparams varchar(255); ALTER TABLE llx_expensereport ADD COLUMN import_key varchar(14); ALTER TABLE llx_expensereport ADD COLUMN extraparams varchar(255); +ALTER TABLE llx_bank_account ADD COLUMN extraparams varchar(255); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PRODUCT_CREATE','Product or service created','Executed when a product or sevice is created','product',30); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('PRODUCT_MODIFY','Product or service modified','Executed when a product or sevice is modified','product',30); From e48ba067303107b476979527f4a414da7e800795 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 18:13:38 +0200 Subject: [PATCH 068/299] Fix generation of sepa mandate with multicompany --- htdocs/societe/rib.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/societe/rib.php b/htdocs/societe/rib.php index 122c5282a40..9412f3f6270 100644 --- a/htdocs/societe/rib.php +++ b/htdocs/societe/rib.php @@ -293,13 +293,13 @@ if (empty($reshook)) $action = 'builddoc'; $moreparams = array( 'use_companybankid'=>GETPOST('companybankid'), - 'force_dir_output'=>$conf->societe->dir_output.'/'.dol_sanitizeFileName($object->id) + 'force_dir_output'=>$conf->societe->multidir_output[$object->entity].'/'.dol_sanitizeFileName($object->id) ); $_POST['lang_id'] = GETPOST('lang_idrib'.GETPOST('companybankid')); $_POST['model'] = GETPOST('modelrib'.GETPOST('companybankid')); } $id = $socid; - $upload_dir = $conf->societe->dir_output; + $upload_dir = $conf->societe->multidir_output[$object->entity]; $permissioncreate=$user->rights->societe->creer; include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php'; From 002bebd83796f3cbee250a393da734c90d1384dc Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 18:15:01 +0200 Subject: [PATCH 069/299] Fix missing extraparams make sql syntax error --- htdocs/install/mysql/migration/4.0.0-5.0.0.sql | 2 ++ htdocs/install/mysql/tables/llx_bank_account.sql | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/htdocs/install/mysql/migration/4.0.0-5.0.0.sql b/htdocs/install/mysql/migration/4.0.0-5.0.0.sql index afda09aa785..75f9b38f34b 100644 --- a/htdocs/install/mysql/migration/4.0.0-5.0.0.sql +++ b/htdocs/install/mysql/migration/4.0.0-5.0.0.sql @@ -32,6 +32,8 @@ UPDATE llx_const SET name = __ENCRYPT('THIRDPARTY_DEFAULT_CREATE_CONTACT')__ WHE ALTER TABLE llx_product_lot MODIFY COLUMN entity integer DEFAULT 1; UPDATE llx_product_lot SET entity = 1 WHERE entity IS NULL; +ALTER TABLE llx_bank_account ADD COLUMN extraparams varchar(255); + ALTER TABLE llx_societe ALTER COLUMN fk_stcomm SET DEFAULT 0; ALTER TABLE llx_c_actioncomm ADD COLUMN picto varchar(48); diff --git a/htdocs/install/mysql/tables/llx_bank_account.sql b/htdocs/install/mysql/tables/llx_bank_account.sql index 7730ab79ef6..0faebbf64d1 100644 --- a/htdocs/install/mysql/tables/llx_bank_account.sql +++ b/htdocs/install/mysql/tables/llx_bank_account.sql @@ -58,5 +58,6 @@ create table llx_bank_account comment text, -- TODO rename in note_private note_public text, model_pdf varchar(255), - import_key varchar(14) + import_key varchar(14), + extraparams varchar(255) -- for other parameters with json format )ENGINE=innodb; From d570df50899d105d01f8db97f5633be2554d5052 Mon Sep 17 00:00:00 2001 From: BENKE Charlie Date: Wed, 22 Feb 2017 15:59:10 +0100 Subject: [PATCH 070/299] inverted value between FRST & RECUR --- htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php b/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php index 396e89afb56..915883cbdaa 100644 --- a/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php +++ b/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php @@ -326,14 +326,14 @@ class pdf_sepamandate extends ModeleBankAccountDoc $pdf->MultiCell($this->page_largeur - $this->marge_gauche - $this->marge_droite, 3, $txt, 0, 'L'); $pdf->Rect(80, $posY, 5, 5); $pdf->SetXY(80, $posY); - if ($object->frstrecur == 'FRST') $pdf->MultiCell(5, 3, 'X', 0, 'L'); + if ($object->frstrecur == 'RECUR') $pdf->MultiCell(5, 3, 'X', 0, 'L'); $pdf->SetXY(86, $posY); $txt = $langs->transnoentitiesnoconv("ModeRECUR").' '.$langs->transnoentitiesnoconv("or"); $pdf->MultiCell($this->page_largeur - $this->marge_gauche - $this->marge_droite, 3, $txt, 0, 'L'); $posY+=6; $pdf->Rect(80, $posY, 5, 5); $pdf->SetXY(80, $posY); - if ($object->frstrecur == 'RECUR') $pdf->MultiCell(5, 3, 'X', 0, 'L'); + if ($object->frstrecur == 'FRST') $pdf->MultiCell(5, 3, 'X', 0, 'L'); $pdf->SetXY(86, $posY); $txt = $langs->transnoentitiesnoconv("ModeFRST"); $pdf->MultiCell($this->page_largeur - $this->marge_gauche - $this->marge_droite, 3, $txt, 0, 'L'); From 823e5b48e3e39e1de59d88fdbb387df8e8c232f2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 18:56:18 +0200 Subject: [PATCH 071/299] Code comment --- htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php b/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php index 915883cbdaa..3dc615d9deb 100644 --- a/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php +++ b/htdocs/core/modules/bank/doc/pdf_sepamandate.modules.php @@ -30,7 +30,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; /** - * Classe permettant de generer les projets au modele Baleine + * Classe permettant de generer les projets au modele SEPAMandate */ class pdf_sepamandate extends ModeleBankAccountDoc From 5a96ae54b9edde7df8be5a39dea4701f281aae69 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 19:08:07 +0200 Subject: [PATCH 072/299] FIX Link to files on bank account tab broken with multicompany FIX Link to preview on thirdparty broken with multicompany --- htdocs/core/class/html.formfile.class.php | 7 ++++--- htdocs/core/lib/functions.lib.php | 5 +++-- htdocs/societe/rib.php | 2 +- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 99dee355333..6e46efe3fdf 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -680,7 +680,7 @@ class FormFile $out.= ' target="_blank">'; $out.= img_mime($file["name"],$langs->trans("File").': '.$file["name"]).' '.dol_trunc($file["name"],$maxfilenamelength); $out.= ''."\n"; - $out.= $this->showPreview($file,$modulepart,$relativepath); + $out.= $this->showPreview($file,$modulepart,$relativepath,0,$param); $out.= ''; // Show file size @@ -1498,16 +1498,17 @@ class FormFile * @param string $modulepart propal, facture, facture_fourn, ... * @param string $relativepath Relative path of docs * @param string $ruleforpicto Rule for picto: 0=Preview picto, 1=Use picto of mime type of file) + * @param string $param More param on http links * @return string $out Output string with HTML */ - public function showPreview($file, $modulepart, $relativepath, $ruleforpicto=0) + public function showPreview($file, $modulepart, $relativepath, $ruleforpicto=0, $param='') { global $langs, $conf; $out=''; if ($conf->browser->layout != 'phone') { - $urladvancedpreview=getAdvancedPreviewUrl($modulepart, $relativepath); // Return if a file is qualified for preview + $urladvancedpreview=getAdvancedPreviewUrl($modulepart, $relativepath, $param); // Return if a file is qualified for preview if ($urladvancedpreview) { $out.= ''; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index facc685d234..2db8ecdb111 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -5839,9 +5839,10 @@ function getImageFileNameForSize($file, $extName, $extImgTarget='') * * @param string $modulepart propal, facture, facture_fourn, ... * @param string $relativepath Relative path of docs + * @param string $param More param on http links * @return string Output string with HTML */ -function getAdvancedPreviewUrl($modulepart, $relativepath) +function getAdvancedPreviewUrl($modulepart, $relativepath, $param='') { global $conf; @@ -5852,7 +5853,7 @@ function getAdvancedPreviewUrl($modulepart, $relativepath) //$mime_preview[]='archive'; $num_mime = array_search(dol_mimetype($relativepath, '', 1), $mime_preview); - if ($num_mime !== false) return 'javascript:document_preview(\''.dol_escape_js(DOL_URL_ROOT.'/document.php?modulepart='.$modulepart.'&attachment=0&file='.$relativepath).'\', \''.dol_mimetype($relativepath).'\', \''.dol_escape_js('Preview').'\')'; + if ($num_mime !== false) return 'javascript:document_preview(\''.dol_escape_js(DOL_URL_ROOT.'/document.php?modulepart='.$modulepart.'&attachment=0&file='.$relativepath.($param?'&'.$param:'')).'\', \''.dol_mimetype($relativepath).'\', \''.dol_escape_js('Preview').'\')'; else return ''; } diff --git a/htdocs/societe/rib.php b/htdocs/societe/rib.php index 9412f3f6270..d571e218e51 100644 --- a/htdocs/societe/rib.php +++ b/htdocs/societe/rib.php @@ -657,7 +657,7 @@ if ($socid && $action != 'edit' && $action != "create") $var=true; - print $formfile->showdocuments('company', $object->id, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 0, 0, 0, 28, 0, '', 0, '', $object->default_lang); + print $formfile->showdocuments('company', $object->id, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 0, 0, 0, 28, 0, 'entity='.$object->entity, 0, '', $object->default_lang); print '
'; From d410a320d72e569b5148b0a9a0da39831a4912e9 Mon Sep 17 00:00:00 2001 From: jfefe Date: Wed, 10 May 2017 20:32:54 +0200 Subject: [PATCH 073/299] WIP #6504: CVE-2017-7886 'defaultlang' attribute was not filtered before database request which cause an SQL injection. --- htdocs/core/class/translate.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/translate.class.php b/htdocs/core/class/translate.class.php index 89ab0019865..5c5c1062d25 100644 --- a/htdocs/core/class/translate.class.php +++ b/htdocs/core/class/translate.class.php @@ -439,7 +439,7 @@ class Translate if (! $found) { // Overwrite translation with database read - $sql="SELECT transkey, transvalue FROM ".MAIN_DB_PREFIX."overwrite_trans where lang='".$this->defaultlang."'"; + $sql="SELECT transkey, transvalue FROM ".MAIN_DB_PREFIX."overwrite_trans where lang='".$db->escape($this->defaultlang)."'"; $resql=$db->query($sql); if ($resql) From ec4e416a6c1075e1c68d146d95fdd5c7f4e85685 Mon Sep 17 00:00:00 2001 From: Benoit Date: Fri, 5 May 2017 22:21:46 +0200 Subject: [PATCH 074/299] Fix bug xhen insert new bankline --- htdocs/compta/bank/class/account.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/compta/bank/class/account.class.php b/htdocs/compta/bank/class/account.class.php index 7867f9bd753..08925f722d7 100644 --- a/htdocs/compta/bank/class/account.class.php +++ b/htdocs/compta/bank/class/account.class.php @@ -471,9 +471,9 @@ class Account extends CommonObject if ($accline->insert() > 0) { - if ($categorie) { - $sql = "INSERT INTO ".MAIN_DB_PREFIX."categorie_account ("; - $sql .= "fk_account, fk_categorie"; + if ($categorie>0) { + $sql = "INSERT INTO ".MAIN_DB_PREFIX."bank_class ("; + $sql .= "lineid, fk_categ; $sql .= ") VALUES ("; $sql .= " ".$accline->id.", ".$categorie; $sql .= ")"; From 23af50ad2a276618c0e1319c12f51feb51053cfa Mon Sep 17 00:00:00 2001 From: Benoit Date: Fri, 5 May 2017 22:33:34 +0200 Subject: [PATCH 075/299] Add fk_facture_fourn element to fetch lines objects --- htdocs/fourn/class/fournisseur.facture.class.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index 009f765e5cd..38d0fcd5bfb 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -636,7 +636,7 @@ class FactureFournisseur extends CommonInvoice function fetch_lines() { $sql = 'SELECT f.rowid, f.ref as ref_supplier, f.description, f.pu_ht, f.pu_ttc, f.qty, f.remise_percent, f.vat_src_code, f.tva_tx'; - $sql.= ', f.localtax1_tx, f.localtax2_tx, f.total_localtax1, f.total_localtax2 '; + $sql.= ', f.localtax1_tx, f.localtax2_tx, f.total_localtax1, f.total_localtax2, f.fk_facture_fourn '; $sql.= ', f.total_ht, f.tva as total_tva, f.total_ttc, f.fk_product, f.product_type, f.info_bits, f.rang, f.special_code, f.fk_parent_line, f.fk_unit'; $sql.= ', p.rowid as product_id, p.ref as product_ref, p.label as label, p.description as product_desc'; $sql.= ', f.fk_multicurrency, f.multicurrency_code, f.multicurrency_subprice, f.multicurrency_total_ht, f.multicurrency_total_tva, f.multicurrency_total_ttc'; @@ -645,6 +645,7 @@ class FactureFournisseur extends CommonInvoice $sql.= ' WHERE fk_facture_fourn='.$this->id; $sql.= ' ORDER BY f.rang, f.rowid'; + dol_syslog(get_class($this)."::fetch_lines", LOG_DEBUG); $resql_rows = $this->db->query($sql); if ($resql_rows) @@ -683,6 +684,7 @@ class FactureFournisseur extends CommonInvoice $line->total_tva = $obj->total_tva; $line->total_localtax1 = $obj->total_localtax1; $line->total_localtax2 = $obj->total_localtax2; + $line->fk_facture_fourn = $obj->fk_facture_fourn; $line->total_ttc = $obj->total_ttc; $line->fk_product = $obj->fk_product; $line->product_type = $obj->product_type; From cf361e1ed2dfe8cabfecc41e25efd53e84a39da0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 23:10:09 +0200 Subject: [PATCH 076/299] Fix html syntax --- htdocs/accountancy/journal/purchasesjournal.php | 4 +++- htdocs/accountancy/journal/sellsjournal.php | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/accountancy/journal/purchasesjournal.php b/htdocs/accountancy/journal/purchasesjournal.php index c5069644cef..232a6d7611c 100644 --- a/htdocs/accountancy/journal/purchasesjournal.php +++ b/htdocs/accountancy/journal/purchasesjournal.php @@ -542,7 +542,9 @@ if (empty($action) || $action == 'view') { print "" . $langs->trans("Date") . ""; print "" . $langs->trans("Piece") . ' (' . $langs->trans("InvoiceRef") . ")"; print "" . $langs->trans("AccountAccounting") . ""; - print "" . $langs->trans("Type") . "" . $langs->trans("Debit") . "" . $langs->trans("Credit") . ""; + print "" . $langs->trans("Type") . ""; + print "" . $langs->trans("Debit") . ""; + print "" . $langs->trans("Credit") . ""; print "\n"; $r = ''; diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php index beb0c777e27..9af2bd2d135 100644 --- a/htdocs/accountancy/journal/sellsjournal.php +++ b/htdocs/accountancy/journal/sellsjournal.php @@ -593,7 +593,7 @@ if (empty($action) || $action == 'view') { // print ' (' . $companystatic->getNomUrl(0, 'customer', 16) . ')'; print ''; print "" . $companystatic->getNomUrl(0, 'customer', 16) . ' - ' . $invoicestatic->ref . ' - ' . $langs->trans("Code_tiers") . ""; - print "" . ($mt >= 0 ? price($mt) : '') . ""; + print "" . ($mt >= 0 ? price($mt) : '') . ""; print "" . ($mt < 0 ? price(- $mt) : '') . ""; print ""; } From 2b64cf0ebeabaf79fbc315994cb0f34cf5de3dbf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 23:24:33 +0200 Subject: [PATCH 077/299] Update html.formfile.class.php --- htdocs/core/class/html.formfile.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 022579b3a7c..5dada97908b 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -128,7 +128,7 @@ class FormFile } $out .= 'global->MAIN_USE_MULTIPLE_FILEUPLOAD)?' name="userfile"':' name="userfile[]" multiple'); + $out .= ((empty($conf->global->MAIN_USE_MULTIPLE_FILEUPLOAD) || $conf->browser->layout == 'phone')?' name="userfile"':' name="userfile[]" multiple'); $out .= (empty($conf->global->MAIN_UPLOAD_DOC) || empty($perm)?' disabled':''); $out .= '>'; $out .= ' '; From 0734b99d3a2b6d227601b73ad394adfcf211c229 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 23:27:48 +0200 Subject: [PATCH 078/299] Fix sql syntax --- htdocs/compta/bank/class/account.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/bank/class/account.class.php b/htdocs/compta/bank/class/account.class.php index 4f28028f34d..b3396e1082c 100644 --- a/htdocs/compta/bank/class/account.class.php +++ b/htdocs/compta/bank/class/account.class.php @@ -473,9 +473,9 @@ class Account extends CommonObject if ($categorie>0) { $sql = "INSERT INTO ".MAIN_DB_PREFIX."bank_class ("; - $sql .= "lineid, fk_categ; + $sql .= "lineid, fk_categ"; $sql .= ") VALUES ("; - $sql .= " ".$accline->id.", ".$categorie; + $sql .= $accline->id.", ".$categorie; $sql .= ")"; $result = $this->db->query($sql); From 2da0a129d103f09e50f91f3515299fcb84c22f89 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 10 May 2017 23:41:43 +0200 Subject: [PATCH 079/299] Multiple file upload on by default on desktop. --- htdocs/core/class/html.formfile.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index 5dada97908b..ca3bf804750 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -128,7 +128,7 @@ class FormFile } $out .= 'global->MAIN_USE_MULTIPLE_FILEUPLOAD) || $conf->browser->layout == 'phone')?' name="userfile"':' name="userfile[]" multiple'); + $out .= ((! empty($conf->global->MAIN_DISABLE_MULTIPLE_FILEUPLOAD) || $conf->browser->layout != 'classic')?' name="userfile"':' name="userfile[]" multiple'); $out .= (empty($conf->global->MAIN_UPLOAD_DOC) || empty($perm)?' disabled':''); $out .= '>'; $out .= ' '; From 8ae05a965100eb266381cbcad1ac4b65ce8e9254 Mon Sep 17 00:00:00 2001 From: Laurent Dinclaux Date: Thu, 11 May 2017 13:38:17 +1100 Subject: [PATCH 080/299] Fix: when sending a mail the default template used should be the first positionned template --- htdocs/core/class/html.formmail.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/html.formmail.class.php b/htdocs/core/class/html.formmail.class.php index 231ff16c6af..e59a57d31b0 100644 --- a/htdocs/core/class/html.formmail.class.php +++ b/htdocs/core/class/html.formmail.class.php @@ -828,7 +828,7 @@ class FormMail extends Form if ($active >= 0) $sql.=" AND active = ".$active; if (is_object($outputlangs)) $sql.= " AND (lang = '".$outputlangs->defaultlang."' OR lang IS NULL OR lang = '')"; if (!empty($id)) $sql.= " AND rowid=".$id; - $sql.= $db->order("lang,label","ASC"); + $sql.= $db->order("position,lang,label","ASC"); //print $sql; $resql = $db->query($sql); From c2f76522eb2587f61bed1ec9f2d8fcec2a1f9b1b Mon Sep 17 00:00:00 2001 From: alexis Algoud Date: Thu, 11 May 2017 09:04:14 +0200 Subject: [PATCH 081/299] fix form inside table --- htdocs/compta/facture.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index c9f223723be..aad8b77811f 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -3805,15 +3805,15 @@ else if ($id > 0 || ! empty($ref)) { if ($object->situation_cycle_ref && $object->statut == 0) { print '
'; - print ''; - - print ''; print ''; print ''; print ''; print ''; + print '
'; + print ''; + if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER)) { print ''; } @@ -3849,9 +3849,11 @@ else if ($id > 0 || ! empty($ref)) print ''; print ''; print ''; - print ''; print '
 %
'; + + print ''; + print '
'; } From f231864b3fc91d684768c0eff92425691f2e310b Mon Sep 17 00:00:00 2001 From: Philippe Grand Date: Thu, 11 May 2017 09:13:51 +0200 Subject: [PATCH 082/299] Update bilan.php --- htdocs/compta/bank/bilan.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/bank/bilan.php b/htdocs/compta/bank/bilan.php index 2b3c897f3ce..f7ab97071f9 100644 --- a/htdocs/compta/bank/bilan.php +++ b/htdocs/compta/bank/bilan.php @@ -69,7 +69,7 @@ print "\n"; $sql = "SELECT sum(amount) as amount FROM ".MAIN_DB_PREFIX."paiement"; $paiem = valeur($sql); -print 'Somme des paiements (associes a une facture)".price($paiem)."'; +print "Somme des paiements (associes a une facture)".price($paiem).""; $sql = "SELECT sum(amount) as amount FROM ".MAIN_DB_PREFIX."bank WHERE amount > 0"; From 449869c37b103f15e2fc4eb795bf422cb33f04ac Mon Sep 17 00:00:00 2001 From: Philippe Grand Date: Thu, 11 May 2017 09:15:35 +0200 Subject: [PATCH 083/299] Update bilan.php --- htdocs/compta/bank/bilan.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/bank/bilan.php b/htdocs/compta/bank/bilan.php index f7ab97071f9..73701636557 100644 --- a/htdocs/compta/bank/bilan.php +++ b/htdocs/compta/bank/bilan.php @@ -74,7 +74,7 @@ print "Somme des paiements (associes a une facture)
0"; $credits = valeur($sql); -print 'Somme des credits".price($credits)."'; +print "Somme des credits".price($credits).""; $sql = "SELECT sum(amount) as amount FROM ".MAIN_DB_PREFIX."bank WHERE amount < 0"; From be6be3e533ae74e33d249a0c87574aed97e7759d Mon Sep 17 00:00:00 2001 From: Philippe Grand Date: Thu, 11 May 2017 09:16:44 +0200 Subject: [PATCH 084/299] Update bilan.php --- htdocs/compta/bank/bilan.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/bank/bilan.php b/htdocs/compta/bank/bilan.php index 73701636557..0baf0dcc3bb 100644 --- a/htdocs/compta/bank/bilan.php +++ b/htdocs/compta/bank/bilan.php @@ -79,7 +79,7 @@ print "Somme des credits".pri $sql = "SELECT sum(amount) as amount FROM ".MAIN_DB_PREFIX."bank WHERE amount < 0"; $debits = valeur($sql); -print 'Somme des debits".price($debits)."'; +print "Somme des debits".price($debits).""; $sql = "SELECT sum(amount) as amount FROM ".MAIN_DB_PREFIX."bank "; From 26df028efed50c886549fa60e91f1736016895a3 Mon Sep 17 00:00:00 2001 From: Philippe Grand Date: Thu, 11 May 2017 09:17:43 +0200 Subject: [PATCH 085/299] Update bilan.php --- htdocs/compta/bank/bilan.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/bank/bilan.php b/htdocs/compta/bank/bilan.php index 0baf0dcc3bb..69370faa34e 100644 --- a/htdocs/compta/bank/bilan.php +++ b/htdocs/compta/bank/bilan.php @@ -84,7 +84,7 @@ print "Somme des debits".pric $sql = "SELECT sum(amount) as amount FROM ".MAIN_DB_PREFIX."bank "; $solde = valeur($sql); -print '".$langs->trans("BankBalance")."".price($solde)."'; +print "".$langs->trans("BankBalance")."".price($solde).""; print ""; From 17f37cc9e1d9f879e667991c011aded6bdab45c4 Mon Sep 17 00:00:00 2001 From: phf Date: Thu, 11 May 2017 11:41:00 +0200 Subject: [PATCH 086/299] Fix wrong calculation --- htdocs/compta/facture/card.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 9483e79dba4..06b64d02da6 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -1084,6 +1084,7 @@ if (empty($reshook)) } if ($totalamount != 0) { + $i = $i > 0 ? $i-1 : 0; $tva_tx = $lines[$i]->tva_tx; if (! empty($lines[$i]->vat_src_code) && ! preg_match('/\(/', $tva_tx)) $tva_tx .= ' ('.$lines[$i]->vat_src_code.')'; $amountdeposit[$tva_tx] = ($totalamount * $valuedeposit) / 100; @@ -1134,7 +1135,7 @@ if (empty($reshook)) if (!empty($conf->global->MAIN_DEPOSIT_MULTI_TVA) && $diff != 0) { $object->fetch_lines(); - $subprice_diff = $object->lines[0]->subprice - $diff / (1 + $object->lines[0]->tva_tx); + $subprice_diff = $object->lines[0]->subprice - $diff / (1 + $object->lines[0]->tva_tx / 100); $object->updateline($object->lines[0]->id, $object->lines[0]->desc, $subprice_diff, $object->lines[0]->qty, $object->lines[0]->remise_percent, $object->lines[0]->date_start, $object->lines[0]->date_end, $object->lines[0]->tva_tx, 0, 0, 'HT', $object->lines[0]->info_bits, $object->lines[0]->product_type, 0, 0, 0, $object->lines[0]->pa_ht, $object->lines[0]->label, 0, array(), 100); } From 0e4a209dd8d0f2250ce3cebbff47c4470c5c8f8a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 11 May 2017 11:50:21 +0200 Subject: [PATCH 087/299] Fix normalize color settings --- htdocs/theme/eldy/style.css.php | 7 +++++-- htdocs/theme/md/style.css.php | 4 ++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 767c3cf2344..db28e154b3a 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -155,18 +155,20 @@ if (! empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)) //$colortopbordertitle1=$colorbackhmenu1; - // Set text color to black or white +$colorbackhmenu1=join(',',colorStringToArray($colorbackhmenu1)); // Normalize value to 'x,y,z' $tmppart=explode(',',$colorbackhmenu1); $tmpval=(! empty($tmppart[0]) ? $tmppart[0] : 0)+(! empty($tmppart[1]) ? $tmppart[1] : 0)+(! empty($tmppart[2]) ? $tmppart[2] : 0); if ($tmpval <= 460) $colortextbackhmenu='FFFFFF'; else $colortextbackhmenu='000000'; +$colorbackvmenu1=join(',',colorStringToArray($colorbackvmenu1)); // Normalize value to 'x,y,z' $tmppart=explode(',',$colorbackvmenu1); $tmpval=(! empty($tmppart[0]) ? $tmppart[0] : 0)+(! empty($tmppart[1]) ? $tmppart[1] : 0)+(! empty($tmppart[2]) ? $tmppart[2] : 0); if ($tmpval <= 460) { $colortextbackvmenu='FFFFFF'; } else { $colortextbackvmenu='000000'; } +$colorbacktitle1=join(',',colorStringToArray($colorbacktitle1)); // Normalize value to 'x,y,z' $tmppart=explode(',',$colorbacktitle1); if ($colortexttitle == '') { @@ -175,6 +177,7 @@ if ($colortexttitle == '') else { $colortexttitle='000000'; $colorshadowtitle='FFFFFF'; } } +$colorbacktabcard1=join(',',colorStringToArray($colorbacktabcard1)); // Normalize value to 'x,y,z' $tmppart=explode(',',$colorbacktabcard1); $tmpval=(! empty($tmppart[0]) ? $tmppart[0] : 0)+(! empty($tmppart[1]) ? $tmppart[1] : 0)+(! empty($tmppart[2]) ? $tmppart[2] : 0); if ($tmpval <= 460) { $colortextbacktab='FFFFFF'; } @@ -346,7 +349,7 @@ select.flat, form.flat select { opacity: 0; } select:invalid { color: gray; } -input:disabled { + input:disabled { background:#ddd; } diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 933ad850650..0d6d0fad7af 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -158,16 +158,19 @@ if (empty($colortopbordertitle1)) $colortopbordertitle1=$colorbackhmenu1; // Set text color to black or white +$colorbackhmenu1=join(',',colorStringToArray($colorbackhmenu1)); // Normalize value to 'x,y,z' $tmppart=explode(',',$colorbackhmenu1); $tmpval=(! empty($tmppart[0]) ? $tmppart[0] : 0)+(! empty($tmppart[1]) ? $tmppart[1] : 0)+(! empty($tmppart[2]) ? $tmppart[2] : 0); if ($tmpval <= 460) $colortextbackhmenu='FFFFFF'; else $colortextbackhmenu='000000'; +$colorbackvmenu1=join(',',colorStringToArray($colorbackvmenu1)); // Normalize value to 'x,y,z' $tmppart=explode(',',$colorbackvmenu1); $tmpval=(! empty($tmppart[0]) ? $tmppart[0] : 0)+(! empty($tmppart[1]) ? $tmppart[1] : 0)+(! empty($tmppart[2]) ? $tmppart[2] : 0); if ($tmpval <= 460) { $colortextbackvmenu='FFFFFF'; } else { $colortextbackvmenu='000000'; } +$colorbacktitle1=join(',',colorStringToArray($colorbacktitle1)); // Normalize value to 'x,y,z' $tmppart=explode(',',$colorbacktitle1); if ($colortexttitle == '') { @@ -176,6 +179,7 @@ if ($colortexttitle == '') else { $colortexttitle='101010'; $colorshadowtitle='FFFFFF'; } } +$colorbacktabcard1=join(',',colorStringToArray($colorbacktabcard1)); // Normalize value to 'x,y,z' $tmppart=explode(',',$colorbacktabcard1); $tmpval=(! empty($tmppart[0]) ? $tmppart[0] : 0)+(! empty($tmppart[1]) ? $tmppart[1] : 0)+(! empty($tmppart[2]) ? $tmppart[2] : 0); if ($tmpval <= 460) { $colortextbacktab='FFFFFF'; } From eb4cfc11cb93cf7dd61fffd8ac5514b071fce450 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 11 May 2017 11:58:16 +0200 Subject: [PATCH 088/299] Fix syntax error --- htdocs/compta/bank/class/account.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/bank/class/account.class.php b/htdocs/compta/bank/class/account.class.php index 9981b1ac2f7..a7289400569 100644 --- a/htdocs/compta/bank/class/account.class.php +++ b/htdocs/compta/bank/class/account.class.php @@ -473,7 +473,7 @@ class Account extends CommonObject if ($categorie>0) { $sql = "INSERT INTO ".MAIN_DB_PREFIX."bank_class ("; - $sql .= "lineid, fk_categ; + $sql .= "lineid, fk_categ"; $sql .= ") VALUES ("; $sql .= " ".$accline->id.", ".$categorie; $sql .= ")"; From d3917b60651b67bcca511682ee822ef234929d3f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 11 May 2017 12:25:53 +0200 Subject: [PATCH 089/299] FIX Bad return code of dolCpyDir --- htdocs/core/lib/files.lib.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 3d33fcb71f2..47501a86e8d 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -551,13 +551,23 @@ function dolCopyDir($srcfile, $destfile, $newmask, $overwriteifexists) $dirmaskdec |= octdec('0200'); // Set w bit required to be able to create content for recursive subdirs files dol_mkdir($destfile."/".$file, '', decoct($dirmaskdec)); } - $result=dolCopyDir($srcfile."/".$file, $destfile."/".$file, $newmask, $overwriteifexists); + $tmpresult=dolCopyDir($srcfile."/".$file, $destfile."/".$file, $newmask, $overwriteifexists); } else { - $result=dol_copy($srcfile."/".$file, $destfile."/".$file, $newmask, $overwriteifexists); + $tmpresult=dol_copy($srcfile."/".$file, $destfile."/".$file, $newmask, $overwriteifexists); + } + // Set result + if ($result > 0 && $tmpresult >= 0) + { + // Do nothing, so we don't set result to 0 if tmpresult is 0 and result was success in a previous pass + } + else + { + $result=$tmpresult; } if ($result < 0) break; + } } closedir($dir_handle); From b092b6861aaca24d242e9470c4e4113ff203b92c Mon Sep 17 00:00:00 2001 From: phf Date: Thu, 11 May 2017 12:48:47 +0200 Subject: [PATCH 090/299] Fix feature INVOICE_CREDIT_NOTE_STANDALONE doesn't work --- htdocs/compta/facture.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index 8a80fa4bf96..4e7f7fe1c32 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -2349,7 +2349,8 @@ if ($action == 'create') else { print '
'; - $tmp=' '; + if (empty($conf->global->INVOICE_CREDIT_NOTE_STANDALONE)) $tmp=' '; + else $tmp=' '; $text = $tmp.$langs->trans("InvoiceAvoir") . ' '; $text.= '('.$langs->trans("YouMustCreateInvoiceFromThird").') '; $desc = $form->textwithpicto($text, $langs->transnoentities("InvoiceAvoirDesc"), 1, 'help', '', 0, 3); From b09300ab61245bfb9e6efd3734f979bfec794946 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 11 May 2017 13:01:49 +0200 Subject: [PATCH 091/299] NEW Can edit background color for odd and even lines in tables --- htdocs/admin/ihm.php | 64 +++++------- htdocs/core/lib/files.lib.php | 69 +++++++++++- htdocs/core/lib/usergroups.lib.php | 145 ++++++++++++++++++-------- htdocs/langs/en_US/modulebuilder.lang | 2 +- htdocs/modulebuilder/index.php | 23 +++- htdocs/theme/eldy/style.css.php | 49 ++++----- htdocs/theme/md/style.css.php | 74 +++++-------- 7 files changed, 260 insertions(+), 166 deletions(-) diff --git a/htdocs/admin/ihm.php b/htdocs/admin/ihm.php index cfa08f003ea..6e5c814639b 100644 --- a/htdocs/admin/ihm.php +++ b/htdocs/admin/ihm.php @@ -87,32 +87,46 @@ if ($action == 'update') dolibarr_set_const($db, "MAIN_THEME", $_POST["main_theme"],'chaine',0,'',$conf->entity); - $val=(implode(',',(colorStringToArray(GETPOST('THEME_ELDY_BACKBODY'),array())))); - if ($val == '') dolibarr_del_const($db, 'THEME_ELDY_BACKBODY', $conf->entity); - else dolibarr_set_const($db, 'THEME_ELDY_BACKBODY', implode(',',colorStringToArray(GETPOST('THEME_ELDY_BACKBODY'),array())),'chaine',0,'',$conf->entity); - $val=GETPOST('THEME_TOPMENU_DISABLE_IMAGE'); if (! $val) dolibarr_del_const($db, 'THEME_TOPMENU_DISABLE_IMAGE', $conf->entity); else dolibarr_set_const($db, 'THEME_TOPMENU_DISABLE_IMAGE', GETPOST('THEME_TOPMENU_DISABLE_IMAGE'),'chaine',0,'',$conf->entity); + $val=(implode(',',(colorStringToArray(GETPOST('THEME_ELDY_BACKBODY'),array())))); + if ($val == '') dolibarr_del_const($db, 'THEME_ELDY_BACKBODY', $conf->entity); + else dolibarr_set_const($db, 'THEME_ELDY_BACKBODY', $val,'chaine',0,'',$conf->entity); + $val=(implode(',',(colorStringToArray(GETPOST('THEME_ELDY_TOPMENU_BACK1'),array())))); if ($val == '') dolibarr_del_const($db, 'THEME_ELDY_TOPMENU_BACK1', $conf->entity); - else dolibarr_set_const($db, 'THEME_ELDY_TOPMENU_BACK1', implode(',',colorStringToArray(GETPOST('THEME_ELDY_TOPMENU_BACK1'),array())),'chaine',0,'',$conf->entity); + else dolibarr_set_const($db, 'THEME_ELDY_TOPMENU_BACK1', $val,'chaine',0,'',$conf->entity); - $val=(implode(',',(colorStringToArray(GETPOST('THEME_ELDY_BACKTITLE1'),array())))); + $val=(implode(',',(colorStringToArray(GETPOST('THEME_ELDY_BACKTITLE1'),array())))); if ($val == '') dolibarr_del_const($db, 'THEME_ELDY_BACKTITLE1', $conf->entity); - else dolibarr_set_const($db, 'THEME_ELDY_BACKTITLE1', implode(',',colorStringToArray(GETPOST('THEME_ELDY_BACKTITLE1'),array())),'chaine',0,'',$conf->entity); + else dolibarr_set_const($db, 'THEME_ELDY_BACKTITLE1', $val,'chaine',0,'',$conf->entity); - $val=(implode(',',(colorStringToArray(GETPOST('THEME_ELDY_TEXTTITLENOTAB'),array())))); + $val=(implode(',',(colorStringToArray(GETPOST('THEME_ELDY_LINEIMPAIR1'),array())))); + if ($val == '') dolibarr_del_const($db, 'THEME_ELDY_LINEIMPAIR1', $conf->entity); + else dolibarr_set_const($db, 'THEME_ELDY_LINEIMPAIR1', $val,'chaine',0,'',$conf->entity); + $val=(implode(',',(colorStringToArray(GETPOST('THEME_ELDY_LINEIMPAIR1'),array())))); + if ($val == '') dolibarr_del_const($db, 'THEME_ELDY_LINEIMPAIR2', $conf->entity); + else dolibarr_set_const($db, 'THEME_ELDY_LINEIMPAIR2', $val,'chaine',0,'',$conf->entity); + + $val=(implode(',',(colorStringToArray(GETPOST('THEME_ELDY_LINEPAIR1'),array())))); + if ($val == '') dolibarr_del_const($db, 'THEME_ELDY_LINEPAIR1', $conf->entity); + else dolibarr_set_const($db, 'THEME_ELDY_LINEPAIR1', $val,'chaine',0,'',$conf->entity); + $val=(implode(',',(colorStringToArray(GETPOST('THEME_ELDY_LINEPAIR1'),array())))); + if ($val == '') dolibarr_del_const($db, 'THEME_ELDY_LINEPAIR2', $conf->entity); + else dolibarr_set_const($db, 'THEME_ELDY_LINEPAIR2', $val,'chaine',0,'',$conf->entity); + + $val=(implode(',',(colorStringToArray(GETPOST('THEME_ELDY_TEXTTITLENOTAB'),array())))); if ($val == '') dolibarr_del_const($db, 'THEME_ELDY_TEXTTITLENOTAB', $conf->entity); - else dolibarr_set_const($db, 'THEME_ELDY_TEXTTITLENOTAB', implode(',',colorStringToArray(GETPOST('THEME_ELDY_TEXTTITLENOTAB'),array())),'chaine',0,'',$conf->entity); + else dolibarr_set_const($db, 'THEME_ELDY_TEXTTITLENOTAB', $val,'chaine',0,'',$conf->entity); if (GETPOST('THEME_ELDY_USE_HOVER') == '') dolibarr_set_const($db, "THEME_ELDY_USE_HOVER", '0', 'chaine', 0, '', $conf->entity); // If empty, we set to '0' ('000000' is for black) else dolibarr_set_const($db, "THEME_ELDY_USE_HOVER", $_POST["THEME_ELDY_USE_HOVER"], 'chaine', 0, '', $conf->entity); $val=(implode(',',(colorStringToArray(GETPOST('THEME_ELDY_TEXTLINK'),array())))); if ($val == '') dolibarr_del_const($db, 'THEME_ELDY_TEXTLINK', $conf->entity); - else dolibarr_set_const($db, 'THEME_ELDY_TEXTLINK', implode(',',colorStringToArray(GETPOST('THEME_ELDY_TEXTLINK'),array())),'chaine',0,'',$conf->entity); + else dolibarr_set_const($db, 'THEME_ELDY_TEXTLINK', $val,'chaine',0,'',$conf->entity); dolibarr_set_const($db, "MAIN_SIZE_LISTE_LIMIT", $_POST["main_size_liste_limit"],'chaine',0,'',$conf->entity); dolibarr_set_const($db, "MAIN_SIZE_SHORTLIST_LIMIT", $_POST["main_size_shortliste_limit"],'chaine',0,'',$conf->entity); @@ -149,34 +163,6 @@ if ($action == 'update') if ($result > 0) { dolibarr_set_const($db, "MAIN_LOGIN_BACKGROUND",$original_file,'chaine',0,'',$conf->entity); - - // Create thumbs of logo (Note that PDF use original file and not thumbs) - /* - if ($isimage > 0) - { - // Create thumbs - //$object->addThumbs($newfile); // We can't use addThumbs here yet because we need name of generated thumbs to add them into constants. TODO Check if need such constants. We should be able to retreive value with get... - - // Create small thumb, Used on logon for example - $imgThumbSmall = vignette($dirforimage.$original_file, $maxwidthsmall, $maxheightsmall, '_small', $quality); - if (image_format_supported($imgThumbSmall) >= 0 && preg_match('/([^\\/:]+)$/i',$imgThumbSmall,$reg)) - { - $imgThumbSmall = $reg[1]; // Save only basename - dolibarr_set_const($db, "MAIN_INFO_SOCIETE_LOGO_SMALL",$imgThumbSmall,'chaine',0,'',$conf->entity); - } - else dol_syslog($imgThumbSmall); - - // Create mini thumb, Used on menu or for setup page for example - $imgThumbMini = vignette($dirforimage.$original_file, $maxwidthmini, $maxheightmini, '_mini', $quality); - if (image_format_supported($imgThumbMini) >= 0 && preg_match('/([^\\/:]+)$/i',$imgThumbMini,$reg)) - { - $imgThumbMini = $reg[1]; // Save only basename - dolibarr_set_const($db, "MAIN_INFO_SOCIETE_LOGO_MINI",$imgThumbMini,'chaine',0,'',$conf->entity); - } - else dol_syslog($imgThumbMini); - } - else dol_syslog("ErrorImageFormatNotSupported",LOG_WARNING); - */ } else if (preg_match('/^ErrorFileIsInfectedWithAVirus/',$result)) { @@ -574,7 +560,7 @@ else // Show print ''."\n"; - print '
'; + print ''; } diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 47501a86e8d..39865905553 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -44,7 +44,8 @@ function dol_basename($pathfile) * @param string $path Starting path from which to search. This is a full path. * @param string $types Can be "directories", "files", or "all" * @param int $recursive Determines whether subdirectories are searched - * @param string $filter Regex filter to restrict list. This regex value must be escaped for '/', since this char is used for preg_match function. Filter is checked into basename only. + * @param string $filter Regex filter to restrict list. This regex value must be escaped for '/' by doing preg_quote($var,'/'), since this char is used for preg_match function, + * but must not contains the start and end '/'. Filter is checked into basename only. * @param array $excludefilter Array of Regex for exclude filter (example: array('(\.meta|_preview.*\.png)$','^\.')). Exclude is checked into fullpath. * @param string $sortcriteria Sort criteria ("","fullname","name","date","size") * @param string $sortorder Sort order (SORT_ASC, SORT_DESC) @@ -440,6 +441,70 @@ function dol_filemtime($pathoffile) return @filemtime($newpathoffile); // @Is to avoid errors if files does not exists } +/** + * Make replacement of strings into a file. + * + * @param string $srcfile Source file (can't be a directory) + * @param array $arrayreplacement Array with strings to replace + * @param string $destfile Destination file (can't be a directory). If empty, will be same than source file. + * @param int $newmask Mask for new file (0 by default means $conf->global->MAIN_UMASK). Example: '0666' + * @return int <0 if error, 0 if nothing done (dest file already exists), >0 if OK + * @see dolCopyr + */ +function dolReplaceInFile($srcfile, $arrayreplacement, $destfile='', $newmask=0) +{ + global $conf; + + dol_syslog("files.lib.php::dolReplaceInFile srcfile=".$srcfile." destfile=".$destfile." newmask=".$newmask); + + if (empty($srcfile)) return -1; + if (empty($destfile)) $destfile=$srcfile; + + $destexists=dol_is_file($destfile); + if (($destfile != $srcfile) && $destexists) return 0; + + $tmpdestfile=$destfile.'.tmp'; + + $newpathofsrcfile=dol_osencode($srcfile); + $newpathoftmpdestfile=dol_osencode($tmpdestfile); + $newpathofdestfile=dol_osencode($destfile); + $newdirdestfile=dirname($newpathofdestfile); + + if ($destexists && ! is_writable($newpathofdestfile)) + { + dol_syslog("files.lib.php::dolReplaceInFile failed Permission denied to overwrite target file", LOG_WARNING); + return -1; + } + if (! is_writable($newdirdestfile)) + { + dol_syslog("files.lib.php::dolReplaceInFile failed Permission denied to write into target directory ".$newdirdestfile, LOG_WARNING); + return -2; + } + + dol_delete_file($tmpdestfile); + + + + + // Rename + $result=dol_move($newpathoftmpdestfile, $newpathofdestfile, $newmask, (($destfile == $srcfile)?1:0)); + if (! $result) + { + dol_syslog("files.lib.php::dolReplaceInFile failed to move tmp file to final dest", LOG_WARNING); + return -3; + } + if (empty($newmask) && ! empty($conf->global->MAIN_UMASK)) $newmask=$conf->global->MAIN_UMASK; + if (empty($newmask)) // This should no happen + { + dol_syslog("Warning: dolReplaceInFile called with empty value for newmask and no default value defined", LOG_WARNING); + $newmask='0664'; + } + + @chmod($newpathofdestfile, octdec($newmask)); + + return 1; +} + /** * Copy a file to another file. * @@ -940,7 +1005,7 @@ function dol_delete_file($file,$disableglob=0,$nophperrors=0,$nohook=0,$object=n // If error because of not exists, we must should return true and we should return false if this is a permission problem } } - else dol_syslog("No files to delete found", LOG_WARNING); + else dol_syslog("No files to delete found", LOG_DEBUG); } else { diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php index d983f799c0d..797af488f46 100644 --- a/htdocs/core/lib/usergroups.lib.php +++ b/htdocs/core/lib/usergroups.lib.php @@ -443,6 +443,49 @@ function show_theme($fuser,$edit=0,$foruserprofile=false) print ''; + // TopMenuDisableImages + if ($foruserprofile) + { + /* + print ''; + print ''.$langs->trans("TopMenuDisableImages").''; + print ''.($conf->global->THEME_TOPMENU_DISABLE_IMAGE?$conf->global->THEME_TOPMENU_DISABLE_IMAGE:$langs->trans("Default")).''; + print 'conf->THEME_ELDY_TOPMENU_BACK1)?" checked":""); + print (empty($dolibarr_main_demo) && $edit)?'':' disabled="disabled"'; // Disabled for demo + print '> '.$langs->trans("UsePersonalValue").''; + print ''; + if ($edit) + { + print $formother->selectColor(colorArrayToHex(colorStringToArray($conf->global->THEME_TOPMENU_DISABLE_IMAGE,array()),''),'THEME_TOPMENU_DISABLE_IMAGE','formcolor',1).' '; + } + else + { + $color = colorArrayToHex(colorStringToArray($conf->global->THEME_TOPMENU_DISABLE_IMAGE,array()),''); + if ($color) print ''; + else print ''; + } + if ($edit) print '
('.$langs->trans("NotSupportedByAllThemes").', '.$langs->trans("PressF5AfterChangingThis").')'; + print '';*/ + } + else + { + $default=$langs->trans('No'); + print ''; + print ''.$langs->trans("TopMenuDisableImages").''; + print ''; + if ($edit) + { + print $form->selectyesno('THEME_TOPMENU_DISABLE_IMAGE', $conf->global->THEME_TOPMENU_DISABLE_IMAGE, 1); + } + else + { + print yn($conf->global->THEME_TOPMENU_DISABLE_IMAGE); + } + print '   ('.$langs->trans("Default").': '.$default.') '; + print $form->textwithpicto('', $langs->trans("NotSupportedByAllThemes").', '.$langs->trans("PressF5AfterChangingThis")); + print ''; + } + // Background color THEME_ELDY_BACKBODY if ($foruserprofile) { @@ -535,52 +578,6 @@ function show_theme($fuser,$edit=0,$foruserprofile=false) print ''; } - // TopMenuBackgroundColor - if ($foruserprofile) - { - /* - print ''; - print ''.$langs->trans("TopMenuBackgroundColor").''; - print ''.($conf->global->THEME_ELDY_TOPMENU_BACK1?$conf->global->THEME_ELDY_TOPMENU_BACK1:$langs->trans("Default")).''; - print 'conf->THEME_ELDY_TOPMENU_BACK1)?" checked":""); - print (empty($dolibarr_main_demo) && $edit)?'':' disabled="disabled"'; // Disabled for demo - print '> '.$langs->trans("UsePersonalValue").''; - print ''; - if ($edit) - { - print $formother->selectColor(colorArrayToHex(colorStringToArray($conf->global->THEME_ELDY_TOPMENU_BACK1,array()),''),'THEME_ELDY_TOPMENU_BACK1','formcolor',1).' '; - } - else - { - $color = colorArrayToHex(colorStringToArray($conf->global->THEME_ELDY_TOPMENU_BACK1,array()),''); - if ($color) print ''; - else print ''; - } - if ($edit) print '
('.$langs->trans("NotSupportedByAllThemes").', '.$langs->trans("PressF5AfterChangingThis").')'; - print '';*/ - } - else - { - $default=$langs->trans('No'); - print ''; - print ''.$langs->trans("TopMenuDisableImages").''; - print ''; - if ($edit) - { - print $form->selectyesno('THEME_TOPMENU_DISABLE_IMAGE', $conf->global->THEME_TOPMENU_DISABLE_IMAGE, 1); - } - else - { - print yn($conf->global->THEME_TOPMENU_DISABLE_IMAGE); - } - print '   ('.$langs->trans("Default").': '.$default.') '; - print $form->textwithpicto('', $langs->trans("NotSupportedByAllThemes").', '.$langs->trans("PressF5AfterChangingThis")); - print ''; - } - - - - // BackgroundTableTitleColor if ($foruserprofile) { @@ -607,6 +604,62 @@ function show_theme($fuser,$edit=0,$foruserprofile=false) print ''; } + // BackgroundTableLineOddColor + if ($foruserprofile) + { + + } + else + { + $default='ffffff'; + if ($conf->theme == 'md') $default='ffffff'; + + print ''; + print ''.$langs->trans("BackgroundTableLineOddColor").''; + print ''; + if ($edit) + { + print $formother->selectColor(colorArrayToHex(colorStringToArray($conf->global->THEME_ELDY_LINEIMPAIR1,array()),''),'THEME_ELDY_LINEIMPAIR1','formcolor',1).' '; + } + else + { + $color = colorArrayToHex(colorStringToArray($conf->global->THEME_ELDY_LINEIMPAIR1,array()),''); + if ($color) print ''; + else print $langs->trans("Default"); + } + print '   ('.$langs->trans("Default").': '.$default.') '; + print $form->textwithpicto('', $langs->trans("NotSupportedByAllThemes").', '.$langs->trans("PressF5AfterChangingThis")); + print ''; + } + + // BackgroundTableLineEvenColor + if ($foruserprofile) + { + + } + else + { + $default='f8f8f8'; + if ($conf->theme == 'md') $default='f8f8f8'; + + print ''; + print ''.$langs->trans("BackgroundTableLineEvenColor").''; + print ''; + if ($edit) + { + print $formother->selectColor(colorArrayToHex(colorStringToArray($conf->global->THEME_ELDY_LINEPAIR1,array()),''),'THEME_ELDY_LINEPAIR1','formcolor',1).' '; + } + else + { + $color = colorArrayToHex(colorStringToArray($conf->global->THEME_ELDY_LINEPAIR1,array()),''); + if ($color) print ''; + else print $langs->trans("Default"); + } + print '   ('.$langs->trans("Default").': '.$default.') '; + print $form->textwithpicto('', $langs->trans("NotSupportedByAllThemes").', '.$langs->trans("PressF5AfterChangingThis")); + print ''; + } + // TextTitleColor if ($foruserprofile) { diff --git a/htdocs/langs/en_US/modulebuilder.lang b/htdocs/langs/en_US/modulebuilder.lang index da734ea1356..18b7044b55d 100644 --- a/htdocs/langs/en_US/modulebuilder.lang +++ b/htdocs/langs/en_US/modulebuilder.lang @@ -4,5 +4,5 @@ ModuleBuilderDesc2=Path were modules are generated/edited (first alternative dir ModuleBuilderDesc3=Generated/editable modules found: %s (they are detected as editable when the file %s exists in root of module directory). NewModule=New module ModuleKey=Key for new module - +ModuleInitialized=Module initialized diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index 6ad747a7694..bdad41e8556 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -59,15 +59,28 @@ if ($dircustom && $action == 'initmodule' && $modulename) $destfile = $dircustom.'/'.$modulename; $result = dolCopyDir($srcfile, $destfile, 0, 0); //dol_mkdir($destfile); + if ($result <= 0) + { + $error++; + setEventMessages($langs->trans("ErrorFailedToCopyDir"), null, 'errors'); + } + + // Edit PHP files + $listofphpfilestoedit = dol_dir_list($destfile, 'files', 1, '\.php$', 'fullname', SORT_ASC, 0, true); + foreach($listofphpfilestoedit as $phpfileval) + { + $arrayreplacement=array( + 'mymodule'=>$modulename + ); + $result=dolReplaceInFile($phpfileval['fullname'], $arrayreplacement); + var_dump($phpfileval); + var_dump($result); + } - if ($result > 0) + if (! $error) { setEventMessages('ModuleInitialized', null); } - else - { - setEventMessages($langs->trans("ErrorFailedToCopyDir"), null, 'errors'); - } } diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index f923413da4c..f6021be8a9a 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2004-2017 Laurent Destailleur * Copyright (C) 2006 Rodolphe Quiedeville * Copyright (C) 2007-2017 Regis Houssin * Copyright (C) 2011 Philippe Grand @@ -35,6 +35,28 @@ if (! defined('NOLOGIN')) define('NOLOGIN',1); // File must be if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML',1); if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); +// Colors +$colorbackhmenu1='80,90,120'; // topmenu +$colorbackvmenu1='255,255,255'; // vmenu +$colortopbordertitle1='120,120,120'; // top border of title +$colorbacktitle1='230,230,230'; // title of tables,list +$colorbacktabcard1='255,255,255'; // card +$colorbacktabactive='234,234,234'; +$colorbacklineimpair1='255,255,255'; // line impair +$colorbacklineimpair2='255,255,255'; // line impair +$colorbacklinepair1='248,248,248'; // line pair +$colorbacklinepair2='248,248,248'; // line pair +$colorbacklinepairhover='238,246,252'; // line pair +$colorbackbody='255,255,255'; +$colortexttitlenotab='100,60,20'; +$colortexttitle='0,0,0'; +$colortext='0,0,0'; +$colortextlink='0,0,100'; +$fontsize='13'; +$fontsizesmaller='12'; + +if (defined('THEME_ONLY_CONSTANT')) return; + session_cache_limiter(FALSE); require_once '../../main.inc.php'; @@ -77,25 +99,6 @@ $dol_no_mouse_hover=$conf->dol_no_mouse_hover; //$user->conf->THEME_ELDY_ENABLE_PERSONALIZED=0; //var_dump($user->conf->THEME_ELDY_RGB); -// Colors -$colorbackhmenu1='80,90,120'; // topmenu -$colorbackvmenu1='255,255,255'; // vmenu -$colortopbordertitle1='120,120,120'; // top border of title -$colorbacktitle1='240,240,240'; // title of tables,list -$colorbacktabcard1='255,255,255'; // card -$colorbacktabactive='234,234,234'; -$colorbacklineimpair1='255,255,255'; // line impair -$colorbacklineimpair2='255,255,255'; // line impair -$colorbacklinepair1='248,248,248'; // line pair -$colorbacklinepair2='248,248,248'; // line pair -$colorbacklinepairhover='238,246,252'; // line pair -$colorbackbody='255,255,255'; -$colortexttitlenotab='100,60,20'; -$colortexttitle='0,0,0'; -$colortext='0,0,0'; -$colortextlink='0,0,100'; -$fontsize='13'; -$fontsizesmaller='12'; $useboldtitle=(isset($conf->global->THEME_ELDY_USEBOLDTITLE)?$conf->global->THEME_ELDY_USEBOLDTITLE:1); $borderwith=2; @@ -113,17 +116,11 @@ if (empty($conf->global->THEME_ELDY_ENABLE_PERSONALIZED)) $conf->global->THEME_ELDY_VERMENU_BACK1='255,255,255'; // vmenu $conf->global->THEME_ELDY_BACKTABCARD1='255,255,255'; // card $conf->global->THEME_ELDY_BACKTABACTIVE='234,234,234'; - $conf->global->THEME_ELDY_LINEIMPAIR1='255,255,255'; - $conf->global->THEME_ELDY_LINEIMPAIR2='255,255,255'; - $conf->global->THEME_ELDY_LINEPAIR1='248,248,248'; - $conf->global->THEME_ELDY_LINEPAIR2='248,248,248'; - $conf->global->THEME_ELDY_LINEPAIRHOVER='238,246,252'; $conf->global->THEME_ELDY_TEXT='0,0,0'; $conf->global->THEME_ELDY_FONT_SIZE1='13'; $conf->global->THEME_ELDY_FONT_SIZE2='12'; } - // Case of option availables only if THEME_ELDY_ENABLE_PERSONALIZED is on $colorbackhmenu1 =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_TOPMENU_BACK1)?$colorbackhmenu1:$conf->global->THEME_ELDY_TOPMENU_BACK1) :(empty($user->conf->THEME_ELDY_TOPMENU_BACK1)?$colorbackhmenu1:$user->conf->THEME_ELDY_TOPMENU_BACK1); $colorbackvmenu1 =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_VERMENU_BACK1)?$colorbackvmenu1:$conf->global->THEME_ELDY_VERMENU_BACK1) :(empty($user->conf->THEME_ELDY_VERMENU_BACK1)?$colorbackvmenu1:$user->conf->THEME_ELDY_VERMENU_BACK1); diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 3bd33b07225..9604da70905 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2004-2017 Laurent Destailleur * Copyright (C) 2006 Rodolphe Quiedeville * Copyright (C) 2007-2017 Regis Houssin * Copyright (C) 2011 Philippe Grand @@ -36,6 +36,28 @@ if (! defined('NOLOGIN')) define('NOLOGIN',1); // File must be if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML',1); if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); +// Colors +$colorbackhmenu1='90,50,120'; // topmenu +$colorbackvmenu1='255,255,255'; // vmenu +$colortopbordertitle1=''; // top border of tables-lists title. not defined = default to colorbackhmenu1 +$colorbacktitle1='240,240,240'; // title of tables-lists +$colorbacktabcard1='255,255,255'; // card +$colorbacktabactive='234,234,234'; +$colorbacklineimpair1='255,255,255'; // line impair +$colorbacklineimpair2='255,255,255'; // line impair +$colorbacklinepair1='250,250,250'; // line pair +$colorbacklinepair2='248,248,248'; // line pair +$colorbacklinepairhover='244,244,244'; // line pair +$colorbackbody='240,240,240'; +$colortexttitlenotab='90,90,90'; +$colortexttitle='20,20,20'; +$colortext='0,0,0'; +$colortextlink='0,0,120'; +$fontsize='13'; +$fontsizesmaller='11'; + +if (defined('THEME_ONLY_CONSTANT')) return; + session_cache_limiter(FALSE); require_once '../../main.inc.php'; @@ -78,34 +100,14 @@ $dol_no_mouse_hover=$conf->dol_no_mouse_hover; //$user->conf->THEME_ELDY_ENABLE_PERSONALIZED=0; //var_dump($user->conf->THEME_ELDY_RGB); -// Colors -$colorbackhmenu1='90,50,120'; // topmenu -$colorbackvmenu1='255,255,255'; // vmenu -$colortopbordertitle1=''; // top border of tables-lists title. not defined = default to colorbackhmenu1 -$colorbacktitle1='240,240,240'; // title of tables-lists -$colorbacktabcard1='255,255,255'; // card -$colorbacktabactive='234,234,234'; -$colorbacklineimpair1='255,255,255'; // line impair -$colorbacklineimpair2='255,255,255'; // line impair -$colorbacklinepair1='250,250,250'; // line pair -$colorbacklinepair2='248,248,248'; // line pair -$colorbacklinepairhover='244,244,244'; // line pair -$colorbackbody='240,240,240'; -$colortexttitlenotab='90,90,90'; -$colortexttitle='20,20,20'; -$colortext='0,0,0'; -$colortextlink='0,0,120'; -$fontsize='13'; -$fontsizesmaller='11'; -$usegradient=0; $useboldtitle=(isset($conf->global->THEME_ELDY_USEBOLDTITLE)?$conf->global->THEME_ELDY_USEBOLDTITLE:1); $borderwith=2; // Case of option always editable if (! isset($conf->global->THEME_ELDY_BACKBODY)) $conf->global->THEME_ELDY_BACKBODY=$colorbackbody; -if (! isset($conf->global->THEME_ELDY_TOPMENU_BACK1)) $conf->global->THEME_ELDY_TOPMENU_BACK1='90,50,120'; +if (! isset($conf->global->THEME_ELDY_TOPMENU_BACK1)) $conf->global->THEME_ELDY_TOPMENU_BACK1=$colorbackhmenu1; if (! isset($conf->global->THEME_ELDY_BACKTITLE1)) $conf->global->THEME_ELDY_BACKTITLE1=$colorbacktitle1; -if (! isset($conf->global->THEME_ELDY_USE_HOVER)) $conf->global->THEME_ELDY_USE_HOVER=='238,246,252'; +if (! isset($conf->global->THEME_ELDY_USE_HOVER)) $conf->global->THEME_ELDY_USE_HOVER==$colorbacklinepairhover; if (! isset($conf->global->THEME_ELDY_TEXTTITLENOTAB)) $conf->global->THEME_ELDY_TEXTTITLENOTAB=$colortexttitlenotab; if (! isset($conf->global->THEME_ELDY_TEXTLINK)) $conf->global->THEME_ELDY_TEXTLINK=$colortextlink; @@ -116,12 +118,6 @@ if (empty($conf->global->THEME_ELDY_ENABLE_PERSONALIZED)) $conf->global->THEME_ELDY_VERMENU_BACK1='255,255,255'; // vmenu $conf->global->THEME_ELDY_BACKTABCARD1='255,255,255'; // card $conf->global->THEME_ELDY_BACKTABACTIVE='234,234,234'; - $conf->global->THEME_ELDY_LINEIMPAIR1='255,255,255'; - $conf->global->THEME_ELDY_LINEIMPAIR2='255,255,255'; - $conf->global->THEME_ELDY_LINEPAIR1='250,250,250'; - $conf->global->THEME_ELDY_LINEPAIR2='248,248,248'; - $conf->global->THEME_ELDY_LINEPAIRHOVER='238,246,252'; - $conf->global->THEME_ELDY_USE_HOVER='238,246,252'; $conf->global->THEME_ELDY_TEXT='0,0,0'; $conf->global->THEME_ELDY_FONT_SIZE1='13'; $conf->global->THEME_ELDY_FONT_SIZE2='11'; @@ -139,7 +135,6 @@ $colorbacklineimpair1=empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty( $colorbacklineimpair2=empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_LINEIMPAIR2) ?$colorbacklineimpair2:$conf->global->THEME_ELDY_LINEIMPAIR2):(empty($user->conf->THEME_ELDY_LINEIMPAIR2)?$colorbacklineimpair2:$user->conf->THEME_ELDY_LINEIMPAIR2); $colorbacklinepair1 =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_LINEPAIR1) ?$colorbacklinepair1:$conf->global->THEME_ELDY_LINEPAIR1) :(empty($user->conf->THEME_ELDY_LINEPAIR1)?$colorbacklinepair1:$user->conf->THEME_ELDY_LINEPAIR1); $colorbacklinepair2 =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_LINEPAIR2) ?$colorbacklinepair2:$conf->global->THEME_ELDY_LINEPAIR2) :(empty($user->conf->THEME_ELDY_LINEPAIR2)?$colorbacklinepair2:$user->conf->THEME_ELDY_LINEPAIR2); -$colorbacklinepairhover =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_LINEPAIRHOVER) ?$colorbacklinepairhover:$conf->global->THEME_ELDY_LINEPAIRHOVER) :(empty($user->conf->THEME_ELDY_LINEPAIRHOVER)?$colorbacklinepairhover:$user->conf->THEME_ELDY_LINEPAIRHOVER); $colorbackbody =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_BACKBODY) ?$colorbackbody:$conf->global->THEME_ELDY_BACKBODY) :(empty($user->conf->THEME_ELDY_BACKBODY)?$colorbackbody:$user->conf->THEME_ELDY_BACKBODY); $colortexttitlenotab =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_TEXTTITLENOTAB)?$colortexttitlenotab:$conf->global->THEME_ELDY_TEXTTITLENOTAB) :(empty($user->conf->THEME_ELDY_TEXTTITLENOTAB)?$colortexttitlenotab:$user->conf->THEME_ELDY_TEXTTITLENOTAB); $colortexttitle =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_TEXTTITLE) ?$colortext:$conf->global->THEME_ELDY_TEXTTITLE) :(empty($user->conf->THEME_ELDY_TEXTTITLE)?$colortexttitle:$user->conf->THEME_ELDY_TEXTTITLE); @@ -147,6 +142,7 @@ $colortext =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty( $colortextlink =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_TEXTLINK) ?$colortext:$conf->global->THEME_ELDY_TEXTLINK) :(empty($user->conf->THEME_ELDY_TEXTLINK)?$colortextlink:$user->conf->THEME_ELDY_TEXTLINK); $fontsize =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_FONT_SIZE1) ?$fontsize:$conf->global->THEME_ELDY_FONT_SIZE1) :(empty($user->conf->THEME_ELDY_FONT_SIZE1)?$fontsize:$user->conf->THEME_ELDY_FONT_SIZE1); $fontsizesmaller =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_FONT_SIZE2) ?$fontsize:$conf->global->THEME_ELDY_FONT_SIZE2) :(empty($user->conf->THEME_ELDY_FONT_SIZE2)?$fontsize:$user->conf->THEME_ELDY_FONT_SIZE2); + // Hover color $colorbacklinepairhover=((! isset($conf->global->THEME_ELDY_USE_HOVER) || (string) $conf->global->THEME_ELDY_USE_HOVER === '0')?'':($conf->global->THEME_ELDY_USE_HOVER === '1'?'edf4fb':$conf->global->THEME_ELDY_USE_HOVER)); if (! empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)) @@ -154,7 +150,7 @@ if (! empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)) $colorbacklinepairhover=((! isset($user->conf->THEME_ELDY_USE_HOVER) || $user->conf->THEME_ELDY_USE_HOVER === '0')?'':($user->conf->THEME_ELDY_USE_HOVER === '1'?'edf4fb':$user->conf->THEME_ELDY_USE_HOVER)); } -if (empty($colortopbordertitle1)) $colortopbordertitle1=$colorbackhmenu1; +//if (empty($colortopbordertitle1)) $colortopbordertitle1=$colorbackhmenu1; // Set text color to black or white @@ -2709,15 +2705,7 @@ tr.liste_titre, tr.liste_titre_sel, form.liste_titre, form.liste_titre_sel, tabl } div.liste_titre, tr.liste_titre, tr.liste_titre_sel, form.liste_titre, form.liste_titre_sel, table.dataTable thead tr { - - background-image: -o-linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(250,250,250,0.3) 100%); - background-image: -moz-linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(250,250,250,0.3) 100%); - background-image: -webkit-linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(250,250,250,0.3) 100%); - background-image: -ms-linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(250,250,250,0.3) 100%); - background-image: linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(250,250,250,0.3) 100%); - background: rgb(); - font-weight: ; color: rgb(); @@ -2974,15 +2962,7 @@ tr.box_titre { color: #000 !important; */ /* TO MATCH ELDY */ - - background-image: -o-linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(250,250,250,0.3) 100%); - background-image: -moz-linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(250,250,250,0.3) 100%); - background-image: -webkit-linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(250,250,250,0.3) 100%); - background-image: -ms-linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(250,250,250,0.3) 100%); - background-image: linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(250,250,250,0.3) 100%); - background: rgb(); - background-repeat: repeat-x; color: rgb(); From 849fe880cd23ea49afc97dc9b9685cade52cb14b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 11 May 2017 14:39:13 +0200 Subject: [PATCH 092/299] Update resources --- doc/images/{README => README.md} | 14 +++++++++++--- doc/images/dolibarr_logo.jpg | Bin 17733 -> 23963 bytes doc/images/dolibarr_logo.png | Bin 37626 -> 29999 bytes 3 files changed, 11 insertions(+), 3 deletions(-) rename doc/images/{README => README.md} (66%) mode change 100644 => 100755 doc/images/dolibarr_logo.png diff --git a/doc/images/README b/doc/images/README.md similarity index 66% rename from doc/images/README rename to doc/images/README.md index 7b6a051aada..798cf599b4c 100644 --- a/doc/images/README +++ b/doc/images/README.md @@ -1,8 +1,16 @@ -README (English) +# README (English) -------------------------------- -* Most screen captures and icons are Dolibarr contributions, however, -some icons are from http://led24.de/iconset/. This is original README file for this source: + +* Screen captures and icons are Dolibarr contributions + + +* Most logos were created by Dolibarr developers. You may find sources of them on: + +https://github.com/Dolibarr/foundation + + +* Few icons are from http://led24.de/iconset/. This is original README file for this source: ------------------------------------------------------- You can do whatever you want with these icons (use on web or in desktop applications) as long as you don’t pass them off as your own and remove this readme file. A credit statement and a link back to http://led24.de/iconset/ or http://led24.de/ would be appreciated. diff --git a/doc/images/dolibarr_logo.jpg b/doc/images/dolibarr_logo.jpg index 6025ca9d201dc72982a495d45a98c793564e5aad..69de0129523f551ae32ce2e5c8122c8873b36880 100644 GIT binary patch literal 23963 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 diff --git a/doc/images/dolibarr_logo.png b/doc/images/dolibarr_logo.png old mode 100644 new mode 100755 index f2614471f7e6b5d115d8d28600b766f0e2313842..8edd0660e60d8b2e9551aff18ab83c074667a5c8 GIT binary patch literal 29999 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 literal 37626 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 WOOBQ$zPw`q0000 Date: Fri, 12 May 2017 11:26:24 +0200 Subject: [PATCH 093/299] Fix company id for US --- htdocs/langs/en_US/companies.lang | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/htdocs/langs/en_US/companies.lang b/htdocs/langs/en_US/companies.lang index a8485b1ec6e..3ff6395f158 100644 --- a/htdocs/langs/en_US/companies.lang +++ b/htdocs/langs/en_US/companies.lang @@ -232,6 +232,12 @@ ProfId3TN=Prof Id 3 (Douane code) ProfId4TN=Prof Id 4 (BAN) ProfId5TN=- ProfId6TN=- +ProfId1US=Prof Id +ProfId2US=- +ProfId3US=- +ProfId4US=- +ProfId5US=- +ProfId6US=- ProfId1RU=Prof Id 1 (OGRN) ProfId2RU=Prof Id 2 (INN) ProfId3RU=Prof Id 3 (KPP) From 80b0d911547375346ba2a29b560644d21dfd7548 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 12 May 2017 12:12:04 +0200 Subject: [PATCH 094/299] More complete demo --- .../11/photos/ldestailleur_200x200.png | Bin 0 -> 49440 bytes .../thumbs/ldestailleur_200x200_mini.png | Bin 0 -> 10635 bytes .../thumbs/ldestailleur_200x200_small.png | Bin 0 -> 39105 bytes .../societe/contact/12/photos/Einstein.jpg | Bin 0 -> 14737 bytes .../12/photos/thumbs/Einstein_mini.jpg | Bin 0 -> 1626 bytes .../12/photos/thumbs/Einstein_small.jpg | Bin 0 -> 4080 bytes dev/initdemo/mysqldump_dolibarr_5.0.0.sql | 91 +++++++++--------- 7 files changed, 46 insertions(+), 45 deletions(-) create mode 100644 dev/initdemo/documents_demo/societe/contact/11/photos/ldestailleur_200x200.png create mode 100644 dev/initdemo/documents_demo/societe/contact/11/photos/thumbs/ldestailleur_200x200_mini.png create mode 100644 dev/initdemo/documents_demo/societe/contact/11/photos/thumbs/ldestailleur_200x200_small.png create mode 100644 dev/initdemo/documents_demo/societe/contact/12/photos/Einstein.jpg create mode 100644 dev/initdemo/documents_demo/societe/contact/12/photos/thumbs/Einstein_mini.jpg create mode 100644 dev/initdemo/documents_demo/societe/contact/12/photos/thumbs/Einstein_small.jpg diff --git a/dev/initdemo/documents_demo/societe/contact/11/photos/ldestailleur_200x200.png b/dev/initdemo/documents_demo/societe/contact/11/photos/ldestailleur_200x200.png new file mode 100644 index 0000000000000000000000000000000000000000..a5bb2af60a43a172d115e8ea50300a13ea00fa50 GIT binary patch literal 49440 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 literal 0 HcmV?d00001 diff --git a/dev/initdemo/documents_demo/societe/contact/11/photos/thumbs/ldestailleur_200x200_mini.png b/dev/initdemo/documents_demo/societe/contact/11/photos/thumbs/ldestailleur_200x200_mini.png new file mode 100644 index 0000000000000000000000000000000000000000..c553f3a26f6eb895ebca1f74abfb0ca9961edfd4 GIT binary patch literal 10635 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 literal 0 HcmV?d00001 diff --git a/dev/initdemo/documents_demo/societe/contact/11/photos/thumbs/ldestailleur_200x200_small.png b/dev/initdemo/documents_demo/societe/contact/11/photos/thumbs/ldestailleur_200x200_small.png new file mode 100644 index 0000000000000000000000000000000000000000..deaccf65f1df561fe49c10e593fa57c88328def1 GIT binary patch literal 39105 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

mLxi)n|3oYUN8`Mkd^vp)=nEd}c{ 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 literal 0 HcmV?d00001 diff --git a/dev/initdemo/documents_demo/societe/contact/12/photos/thumbs/Einstein_small.jpg b/dev/initdemo/documents_demo/societe/contact/12/photos/thumbs/Einstein_small.jpg new file mode 100644 index 0000000000000000000000000000000000000000..35babcdfe88422a35fa1e8cf56659f86d38628c2 GIT binary patch literal 4080 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 literal 0 HcmV?d00001 diff --git a/dev/initdemo/mysqldump_dolibarr_5.0.0.sql b/dev/initdemo/mysqldump_dolibarr_5.0.0.sql index 0f616362d91..4c31fd25e8a 100644 --- a/dev/initdemo/mysqldump_dolibarr_5.0.0.sql +++ b/dev/initdemo/mysqldump_dolibarr_5.0.0.sql @@ -1,8 +1,8 @@ --- MySQL dump 10.13 Distrib 5.5.54, for debian-linux-gnu (x86_64) +-- MySQL dump 10.13 Distrib 5.5.55, for debian-linux-gnu (x86_64) -- -- Host: localhost Database: dolibarr_5 -- ------------------------------------------------------ --- Server version 5.5.54-0ubuntu0.14.04.1 +-- Server version 5.5.55-0ubuntu0.14.04.1 /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; @@ -236,7 +236,7 @@ CREATE TABLE `llx_actioncomm` ( KEY `idx_actioncomm_fk_contact` (`fk_contact`), KEY `idx_actioncomm_fk_element` (`fk_element`), KEY `idx_actioncomm_code` (`code`) -) ENGINE=InnoDB AUTO_INCREMENT=327 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=328 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -245,7 +245,7 @@ CREATE TABLE `llx_actioncomm` ( LOCK TABLES `llx_actioncomm` WRITE; /*!40000 ALTER TABLE `llx_actioncomm` DISABLE KEYS */; -INSERT INTO `llx_actioncomm` VALUES (1,NULL,1,'2010-07-08 14:21:44','2010-07-08 14:21:44',50,NULL,'Company AAA and Co added into Dolibarr','2010-07-08 14:21:44','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Company AAA and Co added into Dolibarr\nAuthor: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(2,NULL,1,'2010-07-08 14:23:48','2010-07-08 14:23:48',50,NULL,'Company Belin SARL added into Dolibarr','2010-07-08 14:23:48','2014-12-21 12:50:33',1,NULL,NULL,2,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Company Belin SARL added into Dolibarr\nAuthor: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(3,NULL,1,'2010-07-08 22:42:12','2010-07-08 22:42:12',50,NULL,'Company Spanish Comp added into Dolibarr','2010-07-08 22:42:12','2014-12-21 12:50:33',1,NULL,NULL,3,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Company Spanish Comp added into Dolibarr\nAuthor: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(4,NULL,1,'2010-07-08 22:48:18','2010-07-08 22:48:18',50,NULL,'Company Prospector Vaalen added into Dolibarr','2010-07-08 22:48:18','2014-12-21 12:50:33',1,NULL,NULL,4,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Company Prospector Vaalen added into Dolibarr\nAuthor: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(5,NULL,1,'2010-07-08 23:22:57','2010-07-08 23:22:57',50,NULL,'Company NoCountry Co added into Dolibarr','2010-07-08 23:22:57','2014-12-21 12:50:33',1,NULL,NULL,5,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Company NoCountry Co added into Dolibarr\nAuthor: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(6,NULL,1,'2010-07-09 00:15:09','2010-07-09 00:15:09',50,NULL,'Company Swiss customer added into Dolibarr','2010-07-09 00:15:09','2014-12-21 12:50:33',1,NULL,NULL,6,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Company Swiss customer added into Dolibarr\nAuthor: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(7,NULL,1,'2010-07-09 01:24:26','2010-07-09 01:24:26',50,NULL,'Company Generic customer added into Dolibarr','2010-07-09 01:24:26','2014-12-21 12:50:33',1,NULL,NULL,7,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Company Generic customer added into Dolibarr\nAuthor: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(8,NULL,1,'2010-07-10 14:54:27','2010-07-10 14:54:27',50,NULL,'Société Client salon ajoutée dans Dolibarr','2010-07-10 14:54:27','2014-12-21 12:50:33',1,NULL,NULL,8,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Société Client salon ajoutée dans Dolibarr\nAuteur: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(9,NULL,1,'2010-07-10 14:54:44','2010-07-10 14:54:44',50,NULL,'Société Client salon invidivdu ajoutée dans Doliba','2010-07-10 14:54:44','2014-12-21 12:50:33',1,NULL,NULL,9,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Société Client salon invidivdu ajoutée dans Dolibarr\nAuteur: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(10,NULL,1,'2010-07-10 14:56:10','2010-07-10 14:56:10',50,NULL,'Facture FA1007-0001 validée dans Dolibarr','2010-07-10 14:56:10','2014-12-21 12:50:33',1,NULL,NULL,9,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Facture FA1007-0001 validée dans Dolibarr\nAuteur: admin',1,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(11,NULL,1,'2010-07-10 14:58:53','2010-07-10 14:58:53',50,NULL,'Facture FA1007-0001 validée dans Dolibarr','2010-07-10 14:58:53','2014-12-21 12:50:33',1,NULL,NULL,9,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Facture FA1007-0001 validée dans Dolibarr\nAuteur: admin',1,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(12,NULL,1,'2010-07-10 15:00:55','2010-07-10 15:00:55',50,NULL,'Facture FA1007-0001 passée à payée dans Dolibarr','2010-07-10 15:00:55','2014-12-21 12:50:33',1,NULL,NULL,9,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Facture FA1007-0001 passée à payée dans Dolibarr\nAuteur: admin',1,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(13,NULL,1,'2010-07-10 15:13:08','2010-07-10 15:13:08',50,NULL,'Société Smith Vick ajoutée dans Dolibarr','2010-07-10 15:13:08','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Société Smith Vick ajoutée dans Dolibarr\nAuteur: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(14,NULL,1,'2010-07-10 15:21:00','2010-07-10 16:21:00',5,NULL,'RDV avec mon chef','2010-07-10 15:21:48','2010-07-10 13:21:48',1,NULL,NULL,NULL,NULL,0,1,NULL,NULL,0,0,1,0,'',3600,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(15,NULL,1,'2010-07-10 18:18:16','2010-07-10 18:18:16',50,NULL,'Contrat CONTRAT1 validé dans Dolibarr','2010-07-10 18:18:16','2014-12-21 12:50:33',1,NULL,NULL,2,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Contrat CONTRAT1 validé dans Dolibarr\nAuteur: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(16,NULL,1,'2010-07-10 18:35:57','2010-07-10 18:35:57',50,NULL,'Société Mon client ajoutée dans Dolibarr','2010-07-10 18:35:57','2014-12-21 12:50:33',1,NULL,NULL,11,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Société Mon client ajoutée dans Dolibarr\nAuteur: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(17,NULL,1,'2010-07-11 16:18:08','2010-07-11 16:18:08',50,NULL,'Société Dupont Alain ajoutée dans Dolibarr','2010-07-11 16:18:08','2014-12-21 12:50:33',1,NULL,NULL,12,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Société Dupont Alain ajoutée dans Dolibarr\nAuteur: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(18,NULL,1,'2010-07-11 17:11:00','2010-07-11 17:17:00',5,NULL,'Rendez-vous','2010-07-11 17:11:22','2010-07-11 15:11:22',1,NULL,NULL,NULL,NULL,0,1,NULL,NULL,0,0,1,0,'gfgdfgdf',360,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(19,NULL,1,'2010-07-11 17:13:20','2010-07-11 17:13:20',50,NULL,'Société Vendeur de chips ajoutée dans Dolibarr','2010-07-11 17:13:20','2014-12-21 12:50:33',1,NULL,NULL,13,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Société Vendeur de chips ajoutée dans Dolibarr\nAuteur: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(20,NULL,1,'2010-07-11 17:15:42','2010-07-11 17:15:42',50,NULL,'Commande CF1007-0001 validée','2010-07-11 17:15:42','2014-12-21 12:50:33',1,NULL,NULL,13,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Commande CF1007-0001 validée\nAuteur: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(21,NULL,1,'2010-07-11 18:47:33','2010-07-11 18:47:33',50,NULL,'Commande CF1007-0002 validée','2010-07-11 18:47:33','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Commande CF1007-0002 validée\nAuteur: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(22,NULL,1,'2010-07-18 11:36:18','2010-07-18 11:36:18',50,NULL,'Proposition PR1007-0003 validée','2010-07-18 11:36:18','2014-12-21 12:50:33',1,NULL,NULL,4,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Proposition PR1007-0003 validée\nAuteur: admin',3,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(23,NULL,1,'2011-07-18 20:49:58','2011-07-18 20:49:58',50,NULL,'Invoice FA1007-0002 validated in Dolibarr','2011-07-18 20:49:58','2014-12-21 12:50:33',1,NULL,NULL,2,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1007-0002 validated in Dolibarr\nAuthor: admin',2,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(24,NULL,1,'2011-07-28 01:37:00',NULL,1,NULL,'Phone call','2011-07-28 01:37:48','2011-07-27 23:37:48',1,NULL,NULL,NULL,2,0,1,NULL,NULL,0,0,1,-1,'',NULL,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(25,NULL,1,'2011-08-01 02:31:24','2011-08-01 02:31:24',50,NULL,'Company mmm added into Dolibarr','2011-08-01 02:31:24','2014-12-21 12:50:33',1,NULL,NULL,15,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Company mmm added into Dolibarr\nAuthor: admin',15,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(26,NULL,1,'2011-08-01 02:31:43','2011-08-01 02:31:43',50,NULL,'Company ppp added into Dolibarr','2011-08-01 02:31:43','2014-12-21 12:50:33',1,NULL,NULL,16,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Company ppp added into Dolibarr\nAuthor: admin',16,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(27,NULL,1,'2011-08-01 02:41:26','2011-08-01 02:41:26',50,NULL,'Company aaa added into Dolibarr','2011-08-01 02:41:26','2014-12-21 12:50:33',1,NULL,NULL,17,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Company aaa added into Dolibarr\nAuthor: admin',17,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(28,NULL,1,'2011-08-01 03:34:11','2011-08-01 03:34:11',50,NULL,'Invoice FA1108-0003 validated in Dolibarr','2011-08-01 03:34:11','2014-12-21 12:50:33',1,NULL,NULL,7,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1108-0003 validated in Dolibarr\nAuthor: admin',5,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(29,NULL,1,'2011-08-01 03:34:11','2011-08-01 03:34:11',50,NULL,'Invoice FA1108-0003 validated in Dolibarr','2011-08-01 03:34:11','2014-12-21 12:50:33',1,NULL,NULL,7,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1108-0003 changed to paid in Dolibarr\nAuthor: admin',5,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(30,NULL,1,'2011-08-06 20:33:54','2011-08-06 20:33:54',50,NULL,'Invoice FA1108-0004 validated in Dolibarr','2011-08-06 20:33:54','2014-12-21 12:50:33',1,NULL,NULL,7,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1108-0004 validated in Dolibarr\nAuthor: admin',6,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(31,NULL,1,'2011-08-06 20:33:54','2011-08-06 20:33:54',50,NULL,'Invoice FA1108-0004 validated in Dolibarr','2011-08-06 20:33:54','2014-12-21 12:50:33',1,NULL,NULL,7,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1108-0004 changed to paid in Dolibarr\nAuthor: admin',6,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(38,NULL,1,'2011-08-08 02:41:55','2011-08-08 02:41:55',50,NULL,'Invoice FA1108-0005 validated in Dolibarr','2011-08-08 02:41:55','2014-12-21 12:50:33',1,NULL,NULL,2,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1108-0005 validated in Dolibarr\nAuthor: admin',8,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(40,NULL,1,'2011-08-08 02:53:40','2011-08-08 02:53:40',50,NULL,'Invoice FA1108-0005 changed to paid in Dolibarr','2011-08-08 02:53:40','2014-12-21 12:50:33',1,NULL,NULL,2,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1108-0005 changed to paid in Dolibarr\nAuthor: admin',8,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(41,NULL,1,'2011-08-08 02:54:05','2011-08-08 02:54:05',50,NULL,'Invoice FA1007-0002 changed to paid in Dolibarr','2011-08-08 02:54:05','2014-12-21 12:50:33',1,NULL,NULL,2,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1007-0002 changed to paid in Dolibarr\nAuthor: admin',2,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(42,NULL,1,'2011-08-08 02:55:04','2011-08-08 02:55:04',50,NULL,'Invoice FA1107-0006 validated in Dolibarr','2011-08-08 02:55:04','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1107-0006 validated in Dolibarr\nAuthor: admin',3,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(43,NULL,1,'2011-08-08 02:55:26','2011-08-08 02:55:26',50,NULL,'Invoice FA1108-0007 validated in Dolibarr','2011-08-08 02:55:26','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1108-0007 validated in Dolibarr\nAuthor: admin',9,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(44,NULL,1,'2011-08-08 02:55:58','2011-08-08 02:55:58',50,NULL,'Invoice FA1107-0006 changed to paid in Dolibarr','2011-08-08 02:55:58','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1107-0006 changed to paid in Dolibarr\nAuthor: admin',3,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(45,NULL,1,'2011-08-08 03:04:22','2011-08-08 03:04:22',50,NULL,'Order CO1108-0001 validated','2011-08-08 03:04:22','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Order CO1108-0001 validated\nAuthor: admin',5,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(46,NULL,1,'2011-08-08 13:59:09','2011-08-08 13:59:09',50,NULL,'Order CO1107-0002 validated','2011-08-08 13:59:10','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Order CO1107-0002 validated\nAuthor: admin',1,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(47,NULL,1,'2011-08-08 14:24:18','2011-08-08 14:24:18',50,NULL,'Proposal PR1007-0001 validated','2011-08-08 14:24:18','2014-12-21 12:50:33',1,NULL,NULL,2,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Proposal PR1007-0001 validated\nAuthor: admin',1,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(48,NULL,1,'2011-08-08 14:24:24','2011-08-08 14:24:24',50,NULL,'Proposal PR1108-0004 validated','2011-08-08 14:24:24','2014-12-21 12:50:33',1,NULL,NULL,17,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Proposal PR1108-0004 validated\nAuthor: admin',4,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(49,NULL,1,'2011-08-08 15:04:37','2011-08-08 15:04:37',50,NULL,'Order CF1108-0003 validated','2011-08-08 15:04:37','2014-12-21 12:50:33',1,NULL,NULL,17,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Order CF1108-0003 validated\nAuthor: admin',6,'order_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(50,NULL,1,'2012-12-08 17:56:47','2012-12-08 17:56:47',40,NULL,'Facture AV1212-0001 validée dans Dolibarr','2012-12-08 17:56:47','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture AV1212-0001 validée dans Dolibarr\nAuteur: admin',10,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(51,NULL,1,'2012-12-08 17:57:11','2012-12-08 17:57:11',40,NULL,'Facture AV1212-0001 validée dans Dolibarr','2012-12-08 17:57:11','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture AV1212-0001 validée dans Dolibarr\nAuteur: admin',10,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(52,NULL,1,'2012-12-08 17:58:27','2012-12-08 17:58:27',40,NULL,'Facture FA1212-0008 validée dans Dolibarr','2012-12-08 17:58:27','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1212-0008 validée dans Dolibarr\nAuteur: admin',11,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(53,NULL,1,'2012-12-08 18:20:49','2012-12-08 18:20:49',40,NULL,'Facture AV1212-0002 validée dans Dolibarr','2012-12-08 18:20:49','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture AV1212-0002 validée dans Dolibarr\nAuteur: admin',12,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(54,NULL,1,'2012-12-09 18:35:07','2012-12-09 18:35:07',40,NULL,'Facture AV1212-0002 passée à payée dans Dolibarr','2012-12-09 18:35:07','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture AV1212-0002 passée à payée dans Dolibarr\nAuteur: admin',12,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(55,NULL,1,'2012-12-09 20:14:42','2012-12-09 20:14:42',40,NULL,'Société doe john ajoutée dans Dolibarr','2012-12-09 20:14:42','2014-12-21 12:50:33',1,NULL,NULL,18,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Société doe john ajoutée dans Dolibarr\nAuteur: admin',18,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(56,NULL,1,'2012-12-12 18:54:19','2012-12-12 18:54:19',40,NULL,'Facture FA1212-0009 validée dans Dolibarr','2012-12-12 18:54:19','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1212-0009 validée dans Dolibarr\nAuteur: admin',55,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(121,NULL,1,'2012-12-06 10:00:00',NULL,50,NULL,'aaab','2012-12-21 17:48:08','2012-12-21 16:54:07',3,1,NULL,NULL,NULL,0,3,NULL,NULL,1,0,1,-1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(122,NULL,1,'2012-12-21 18:09:52','2012-12-21 18:09:52',40,NULL,'Facture client FA1007-0001 envoyée par EMail','2012-12-21 18:09:52','2014-12-21 12:50:33',1,NULL,NULL,9,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Mail envoyé par Firstname SuperAdminName à laurent@destailleur.fr.\nSujet du mail: Envoi facture FA1007-0001\nCorps du mail:\nVeuillez trouver ci-joint la facture FA1007-0001\r\n\r\nVous pouvez cliquer sur le lien sécurisé ci-dessous pour effectuer votre paiement via Paypal\r\n\r\nhttp://localhost/dolibarrnew/public/paypal/newpayment.php?source=invoice&ref=FA1007-0001&securekey=50c82fab36bb3b6aa83e2a50691803b2\r\n\r\nCordialement',1,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(123,NULL,1,'2013-01-06 13:13:57','2013-01-06 13:13:57',40,NULL,'Facture 16 validée dans Dolibarr','2013-01-06 13:13:57','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture 16 validée dans Dolibarr\nAuteur: admin',16,'invoice_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(124,NULL,1,'2013-01-12 12:23:05','2013-01-12 12:23:05',40,NULL,'Patient aaa ajouté','2013-01-12 12:23:05','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Patient aaa ajouté\nAuteur: admin',19,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(125,NULL,1,'2013-01-12 12:52:20','2013-01-12 12:52:20',40,NULL,'Patient pppoo ajouté','2013-01-12 12:52:20','2014-12-21 12:50:33',1,NULL,NULL,20,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Patient pppoo ajouté\nAuteur: admin',20,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(127,NULL,1,'2013-01-19 18:22:48','2013-01-19 18:22:48',40,NULL,'Facture FS1301-0001 validée dans Dolibarr','2013-01-19 18:22:48','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FS1301-0001 validée dans Dolibarr\nAuteur: admin',148,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(128,NULL,1,'2013-01-19 18:31:10','2013-01-19 18:31:10',40,NULL,'Facture FA6801-0010 validée dans Dolibarr','2013-01-19 18:31:10','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA6801-0010 validée dans Dolibarr\nAuteur: admin',150,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(129,NULL,1,'2013-01-19 18:31:10','2013-01-19 18:31:10',40,NULL,'Facture FA6801-0010 passée à payée dans Dolibarr','2013-01-19 18:31:10','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA6801-0010 passée à payée dans Dolibarr\nAuteur: admin',150,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(130,NULL,1,'2013-01-19 18:31:58','2013-01-19 18:31:58',40,NULL,'Facture FS1301-0002 validée dans Dolibarr','2013-01-19 18:31:58','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FS1301-0002 validée dans Dolibarr\nAuteur: admin',151,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(131,NULL,1,'2013-01-19 18:31:58','2013-01-19 18:31:58',40,NULL,'Facture FS1301-0002 passée à payée dans Dolibarr','2013-01-19 18:31:58','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FS1301-0002 passée à payée dans Dolibarr\nAuteur: admin',151,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(132,NULL,1,'2013-01-23 15:07:54','2013-01-23 15:07:54',50,NULL,'Consultation 24 saisie (aaa)','2013-01-23 15:07:54','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Consultation 24 saisie (aaa)\nAuteur: admin',24,'cabinetmed_cons',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(133,NULL,1,'2013-01-23 16:56:58','2013-01-23 16:56:58',40,NULL,'Patient pa ajouté','2013-01-23 16:56:58','2014-12-21 12:50:33',1,NULL,NULL,21,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Patient pa ajouté\nAuteur: admin',21,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(134,NULL,1,'2013-01-23 17:34:00',NULL,50,NULL,'bbcv','2013-01-23 17:35:21','2013-01-23 16:35:21',1,NULL,1,2,NULL,0,1,NULL,NULL,0,0,1,-1,'',NULL,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(135,NULL,1,'2013-02-12 15:54:00','2013-02-12 15:54:00',40,NULL,'Facture FA1212-0011 validée dans Dolibarr','2013-02-12 15:54:37','2014-12-21 12:50:33',1,1,NULL,7,NULL,0,1,NULL,1,0,0,1,50,NULL,NULL,NULL,'Facture FA1212-0011 validée dans Dolibarr
\r\nAuteur: admin',13,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(136,NULL,1,'2013-02-12 17:06:51','2013-02-12 17:06:51',40,NULL,'Commande CO1107-0003 validée','2013-02-12 17:06:51','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Commande CO1107-0003 validée\nAuteur: admin',2,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(137,NULL,1,'2013-02-17 16:22:10','2013-02-17 16:22:10',40,NULL,'Proposition PR1302-0009 validée','2013-02-17 16:22:10','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Proposition PR1302-0009 validée\nAuteur: admin',9,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(138,NULL,1,'2013-02-17 16:27:00','2013-02-17 16:27:00',40,NULL,'Facture FA1302-0012 validée dans Dolibarr','2013-02-17 16:27:00','2014-12-21 12:50:33',1,NULL,NULL,18,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1302-0012 validée dans Dolibarr\nAuteur: admin',152,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(139,NULL,1,'2013-02-17 16:27:29','2013-02-17 16:27:29',40,NULL,'Proposition PR1302-0010 validée','2013-02-17 16:27:29','2014-12-21 12:50:33',1,NULL,NULL,18,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Proposition PR1302-0010 validée\nAuteur: admin',11,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(140,NULL,1,'2013-02-17 18:27:56','2013-02-17 18:27:56',40,NULL,'Commande CO1107-0004 validée','2013-02-17 18:27:56','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Commande CO1107-0004 validée\nAuteur: admin',3,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(141,NULL,1,'2013-02-17 18:38:14','2013-02-17 18:38:14',40,NULL,'Commande CO1302-0005 validée','2013-02-17 18:38:14','2014-12-21 12:50:33',1,NULL,NULL,18,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Commande CO1302-0005 validée\nAuteur: admin',7,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(142,NULL,1,'2013-02-26 22:57:50','2013-02-26 22:57:50',40,NULL,'Company pppp added into Dolibarr','2013-02-26 22:57:50','2014-12-21 12:50:33',1,NULL,NULL,22,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Company pppp added into Dolibarr\nAuthor: admin',22,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(143,NULL,1,'2013-02-26 22:58:13','2013-02-26 22:58:13',40,NULL,'Company ttttt added into Dolibarr','2013-02-26 22:58:13','2014-12-21 12:50:33',1,NULL,NULL,23,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Company ttttt added into Dolibarr\nAuthor: admin',23,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(144,NULL,1,'2013-02-27 10:00:00','2013-02-27 19:20:00',5,NULL,'Rendez-vous','2013-02-27 19:20:53','2013-02-27 18:20:53',1,NULL,NULL,NULL,NULL,0,1,NULL,1,0,0,1,-1,'',33600,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(145,NULL,1,'2013-02-27 19:28:00',NULL,2,NULL,'fdsfsd','2013-02-27 19:28:48','2013-02-27 18:29:53',1,1,NULL,NULL,NULL,0,1,NULL,1,0,0,1,-1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(146,NULL,1,'2013-03-06 10:05:07','2013-03-06 10:05:07',40,NULL,'Contrat (PROV3) validé dans Dolibarr','2013-03-06 10:05:07','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Contrat (PROV3) validé dans Dolibarr\nAuteur: admin',3,'contract',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(147,NULL,1,'2013-03-06 16:43:37','2013-03-06 16:43:37',40,NULL,'Facture FA1307-0013 validée dans Dolibarr','2013-03-06 16:43:37','2014-12-21 12:50:33',1,NULL,NULL,12,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1307-0013 validée dans Dolibarr\nAuteur: admin',158,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(148,NULL,1,'2013-03-06 16:44:12','2013-03-06 16:44:12',40,NULL,'Facture FA1407-0014 validée dans Dolibarr','2013-03-06 16:44:12','2014-12-21 12:50:33',1,NULL,NULL,12,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1407-0014 validée dans Dolibarr\nAuteur: admin',159,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(149,NULL,1,'2013-03-06 16:47:48','2013-03-06 16:47:48',40,NULL,'Facture FA1507-0015 validée dans Dolibarr','2013-03-06 16:47:48','2014-12-21 12:50:33',1,NULL,NULL,12,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1507-0015 validée dans Dolibarr\nAuteur: admin',160,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(150,NULL,1,'2013-03-06 16:48:16','2013-03-06 16:48:16',40,NULL,'Facture FA1607-0016 validée dans Dolibarr','2013-03-06 16:48:16','2014-12-21 12:50:33',1,NULL,NULL,12,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1607-0016 validée dans Dolibarr\nAuteur: admin',161,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(151,NULL,1,'2013-03-06 17:13:59','2013-03-06 17:13:59',40,NULL,'Société smith smith ajoutée dans Dolibarr','2013-03-06 17:13:59','2014-12-21 12:50:33',1,NULL,NULL,24,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Société smith smith ajoutée dans Dolibarr\nAuteur: admin',24,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(152,NULL,1,'2013-03-08 10:02:22','2013-03-08 10:02:22',40,NULL,'Proposition (PROV12) validée dans Dolibarr','2013-03-08 10:02:22','2014-12-21 12:50:33',1,NULL,NULL,23,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Proposition (PROV12) validée dans Dolibarr\nAuteur: admin',12,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(203,NULL,1,'2013-03-09 19:39:27','2013-03-09 19:39:27',40,'AC_ORDER_SUPPLIER_VALIDATE','Commande CF1303-0004 validée','2013-03-09 19:39:27','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Commande CF1303-0004 validée\nAuteur: admin',13,'order_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(204,NULL,1,'2013-03-10 15:47:37','2013-03-10 15:47:37',40,'AC_COMPANY_CREATE','Patient créé','2013-03-10 15:47:37','2014-12-21 12:50:33',1,NULL,NULL,25,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Patient créé\nAuteur: admin',25,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(205,NULL,1,'2013-03-10 15:57:32','2013-03-10 15:57:32',40,'AC_COMPANY_CREATE','Tiers créé','2013-03-10 15:57:32','2014-12-21 12:50:33',1,NULL,NULL,26,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Tiers créé\nAuteur: admin',26,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(206,NULL,1,'2013-03-10 15:58:28','2013-03-10 15:58:28',40,'AC_BILL_VALIDATE','Facture FA1303-0017 validée','2013-03-10 15:58:28','2014-12-21 12:50:33',1,NULL,NULL,26,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1303-0017 validée\nAuteur: admin',208,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(207,NULL,1,'2013-03-19 09:38:10','2013-03-19 09:38:10',40,'AC_BILL_VALIDATE','Facture FA1303-0018 validée','2013-03-19 09:38:10','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1303-0018 validée\nAuteur: admin',209,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(208,NULL,1,'2013-03-20 14:30:11','2013-03-20 14:30:11',40,'AC_BILL_VALIDATE','Facture FA1107-0019 validée','2013-03-20 14:30:11','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1107-0019 validée\nAuteur: admin',210,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(209,NULL,1,'2013-03-22 09:40:25','2013-03-22 09:40:25',40,'AC_BILL_VALIDATE','Facture FA1303-0020 validée','2013-03-22 09:40:25','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1303-0020 validée\nAuteur: admin',211,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(210,NULL,1,'2013-03-23 17:16:25','2013-03-23 17:16:25',40,'AC_BILL_VALIDATE','Facture FA1303-0020 validée','2013-03-23 17:16:25','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1303-0020 validée\nAuteur: admin',211,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(211,NULL,1,'2013-03-23 18:08:27','2013-03-23 18:08:27',40,'AC_BILL_VALIDATE','Facture FA1307-0013 validée','2013-03-23 18:08:27','2014-12-21 12:50:33',1,NULL,NULL,12,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1307-0013 validée\nAuteur: admin',158,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(212,NULL,1,'2013-03-24 15:54:00','2013-03-24 15:54:00',40,'AC_BILL_VALIDATE','Facture FA1212-0021 validée','2013-03-24 15:54:00','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1212-0021 validée\nAuteur: admin',32,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(213,NULL,1,'2013-11-07 01:02:39','2013-11-07 01:02:39',40,'AC_COMPANY_CREATE','Third party created','2013-11-07 01:02:39','2014-12-21 12:50:33',1,NULL,NULL,27,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Third party created\nAuthor: admin',27,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(214,NULL,1,'2013-11-07 01:05:22','2013-11-07 01:05:22',40,'AC_COMPANY_CREATE','Third party created','2013-11-07 01:05:22','2014-12-21 12:50:33',1,NULL,NULL,28,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Third party created\nAuthor: admin',28,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(215,NULL,1,'2013-11-07 01:07:07','2013-11-07 01:07:07',40,'AC_COMPANY_CREATE','Third party created','2013-11-07 01:07:07','2014-12-21 12:50:33',1,NULL,NULL,29,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Third party created\nAuthor: admin',29,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(216,NULL,1,'2013-11-07 01:07:58','2013-11-07 01:07:58',40,'AC_COMPANY_CREATE','Third party created','2013-11-07 01:07:58','2014-12-21 12:50:33',1,NULL,NULL,30,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Third party created\nAuthor: admin',30,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(217,NULL,1,'2013-11-07 01:10:09','2013-11-07 01:10:09',40,'AC_COMPANY_CREATE','Third party created','2013-11-07 01:10:09','2014-12-21 12:50:33',1,NULL,NULL,31,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Third party created\nAuthor: admin',31,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(218,NULL,1,'2013-11-07 01:15:57','2013-11-07 01:15:57',40,'AC_COMPANY_CREATE','Third party created','2013-11-07 01:15:57','2014-12-21 12:50:33',1,NULL,NULL,32,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Third party created\nAuthor: admin',32,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(219,NULL,1,'2013-11-07 01:16:51','2013-11-07 01:16:51',40,'AC_COMPANY_CREATE','Third party created','2013-11-07 01:16:51','2014-12-21 12:50:33',1,NULL,NULL,33,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Third party created\nAuthor: admin',33,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(220,NULL,1,'2014-03-02 17:24:04','2014-03-02 17:24:04',40,'AC_BILL_VALIDATE','Invoice FA1302-0022 validated','2014-03-02 17:24:04','2014-12-21 12:50:33',1,NULL,NULL,18,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1302-0022 validated\nAuthor: admin',157,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(221,NULL,1,'2014-03-02 17:24:28','2014-03-02 17:24:28',40,'AC_BILL_VALIDATE','Invoice FA1303-0020 validated','2014-03-02 17:24:28','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1303-0020 validated\nAuthor: admin',211,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(222,NULL,1,'2014-03-05 10:00:00','2014-03-05 10:00:00',5,NULL,'RDV John','2014-03-02 19:54:48','2014-03-02 18:55:29',1,1,NULL,NULL,NULL,0,1,0,NULL,0,0,1,-1,NULL,NULL,NULL,'gfdgdfgdf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(223,NULL,1,'2014-03-13 10:00:00','2014-03-17 00:00:00',50,NULL,'Congress','2014-03-02 19:55:11','2014-03-02 18:55:11',1,NULL,NULL,NULL,NULL,0,1,0,NULL,0,0,1,-1,'',309600,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(224,NULL,1,'2014-03-14 10:00:00',NULL,1,NULL,'Call john','2014-03-02 19:55:56','2014-03-02 18:55:56',1,NULL,NULL,NULL,NULL,0,1,0,NULL,0,0,1,0,'',NULL,NULL,'tttt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(225,NULL,1,'2014-03-02 20:11:31','2014-03-02 20:11:31',40,'AC_BILL_UNVALIDATE','Invoice FA1303-0020 go back to draft status','2014-03-02 20:11:31','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1303-0020 go back to draft status\nAuthor: admin',211,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(226,NULL,1,'2014-03-02 20:13:39','2014-03-02 20:13:39',40,'AC_BILL_VALIDATE','Invoice FA1303-0020 validated','2014-03-02 20:13:39','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1303-0020 validated\nAuthor: admin',211,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(227,NULL,1,'2014-03-03 19:20:10','2014-03-03 19:20:10',40,'AC_BILL_VALIDATE','Invoice FA1212-0023 validated','2014-03-03 19:20:10','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1212-0023 validated\nAuthor: admin',33,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(228,NULL,1,'2014-03-03 19:20:25','2014-03-03 19:20:25',40,'AC_BILL_CANCEL','Invoice FA1212-0023 canceled in Dolibarr','2014-03-03 19:20:25','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1212-0023 canceled in Dolibarr\nAuthor: admin',33,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(229,NULL,1,'2014-03-03 19:20:56','2014-03-03 19:20:56',40,'AC_BILL_VALIDATE','Invoice AV1403-0003 validated','2014-03-03 19:20:56','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Invoice AV1403-0003 validated\nAuthor: admin',212,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(230,NULL,1,'2014-03-03 19:21:29','2014-03-03 19:21:29',40,'AC_BILL_UNVALIDATE','Invoice AV1403-0003 go back to draft status','2014-03-03 19:21:29','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Invoice AV1403-0003 go back to draft status\nAuthor: admin',212,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(231,NULL,1,'2014-03-03 19:22:16','2014-03-03 19:22:16',40,'AC_BILL_VALIDATE','Invoice AV1303-0003 validated','2014-03-03 19:22:16','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Invoice AV1303-0003 validated\nAuthor: admin',213,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(232,NULL,1,'2016-01-22 18:54:39','2016-01-22 18:54:39',40,'AC_OTH_AUTO','Invoice 16 validated','2016-01-22 18:54:39','2016-01-22 17:54:39',12,NULL,NULL,1,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Invoice 16 validated\nAuthor: admin',16,'invoice_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(233,NULL,1,'2016-01-22 18:54:46','2016-01-22 18:54:46',40,'AC_OTH_AUTO','Invoice 16 validated','2016-01-22 18:54:46','2016-01-22 17:54:46',12,NULL,NULL,1,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Invoice 16 validated\nAuthor: admin',16,'invoice_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(234,NULL,1,'2016-07-05 10:00:00','2016-07-05 11:19:00',5,'AC_RDV','Meeting with my boss','2016-07-31 18:19:48','2016-07-31 14:19:48',12,NULL,NULL,NULL,NULL,0,12,1,NULL,0,0,1,-1,'',4740,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(235,NULL,1,'2016-07-13 00:00:00','2016-07-14 23:59:59',50,'AC_OTH','Trip at Las Vegas','2016-07-31 18:20:36','2016-07-31 14:20:36',12,NULL,4,NULL,2,0,12,1,NULL,0,1,1,-1,'',172799,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(236,NULL,1,'2016-07-29 10:00:00',NULL,4,'AC_EMAIL','Remind to send an email','2016-07-31 18:21:04','2016-07-31 14:21:04',12,NULL,NULL,NULL,NULL,0,4,0,NULL,0,0,1,-1,'',NULL,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(237,NULL,1,'2016-07-01 10:00:00',NULL,1,'AC_TEL','Phone call with Mr Vaalen','2016-07-31 18:22:04','2016-07-31 14:22:04',12,NULL,6,4,NULL,0,13,0,NULL,0,0,1,-1,'',NULL,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(238,NULL,1,'2016-08-02 10:00:00','2016-08-02 12:00:00',5,'AC_RDV','Meeting on radium','2016-08-01 01:15:50','2016-07-31 21:15:50',12,NULL,8,10,10,0,12,1,NULL,0,0,1,-1,'',7200,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(239,NULL,1,'2017-01-29 21:49:33','2017-01-29 21:49:33',40,'AC_OTH_AUTO','Proposal PR1302-0007 validated','2017-01-29 21:49:33','2017-01-29 17:49:33',12,NULL,NULL,19,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1302-0007 validated\nAuthor: admin',7,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(240,NULL,1,'2017-01-31 20:52:00',NULL,1,'AC_TEL','Call the boss','2017-01-31 20:52:10','2017-01-31 16:52:25',12,12,6,NULL,NULL,0,12,1,NULL,0,0,1,-1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(242,NULL,1,'2017-02-01 18:52:04','2017-02-01 18:52:04',40,'AC_OTH_AUTO','Order CF1007-0001 validated','2017-02-01 18:52:04','2017-02-01 14:52:04',12,NULL,NULL,13,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CF1007-0001 validated\nAuthor: admin',1,'order_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(243,NULL,1,'2017-02-01 18:52:04','2017-02-01 18:52:04',40,'AC_OTH_AUTO','Order CF1007-0001 approved','2017-02-01 18:52:04','2017-02-01 14:52:04',12,NULL,NULL,13,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CF1007-0001 approved\nAuthor: admin',1,'order_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(245,NULL,1,'2017-02-01 18:52:32','2017-02-01 18:52:32',40,'AC_OTH_AUTO','Supplier order CF1007-0001 submited','2017-02-01 18:52:32','2017-02-01 14:52:32',12,NULL,NULL,13,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Supplier order CF1007-0001 submited\nAuthor: admin',1,'order_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(249,NULL,1,'2017-02-01 18:54:01','2017-02-01 18:54:01',40,'AC_OTH_AUTO','Supplier order CF1007-0001 received','2017-02-01 18:54:01','2017-02-01 14:54:01',12,NULL,NULL,13,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Supplier order CF1007-0001 received \nAuthor: admin',1,'order_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(250,NULL,1,'2017-02-01 18:54:42','2017-02-01 18:54:42',40,'AC_OTH_AUTO','Email sent by MyBigCompany To mycustomer@example.com','2017-02-01 18:54:42','2017-02-01 14:54:42',12,NULL,NULL,13,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Sender: MyBigCompany <myemail@mybigcompany.com>
\nReceiver(s): mycustomer@example.com
\nEMail topic: Submission of order CF1007-0001
\nEmail body:
\nYou will find here our order CF1007-0001
\r\n
\r\nSincerely
\n
\nAttached files and documents: CF1007-0001.pdf',1,'order_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(251,NULL,1,'2017-02-01 19:02:21','2017-02-01 19:02:21',40,'AC_OTH_AUTO','Invoice SI1702-0001 validated','2017-02-01 19:02:21','2017-02-01 15:02:21',12,NULL,5,13,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Invoice SI1702-0001 validated\nAuthor: admin',20,'invoice_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(252,NULL,1,'2017-02-12 23:17:04','2017-02-12 23:17:04',40,'AC_OTH_AUTO','Patient créé','2017-02-12 23:17:04','2017-02-12 19:17:04',12,NULL,NULL,26,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Patient créé\nAuthor: admin',26,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(253,NULL,1,'2017-02-12 23:18:33','2017-02-12 23:18:33',40,'AC_OTH_AUTO','Consultation 2 recorded (aaa)','2017-02-12 23:18:33','2017-02-12 19:18:33',12,NULL,NULL,NULL,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Consultation 2 recorded (aaa)\nAuthor: admin',2,'cabinetmed_cons',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(254,NULL,1,'2017-02-15 23:28:41','2017-02-15 23:28:41',40,'AC_OTH_AUTO','Order CO7001-0005 validated','2017-02-15 23:28:41','2017-02-15 22:28:41',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0005 validated\nAuthor: admin',7,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(255,NULL,1,'2017-02-15 23:28:56','2017-02-15 23:28:56',40,'AC_OTH_AUTO','Order CO7001-0006 validated','2017-02-15 23:28:56','2017-02-15 22:28:56',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0006 validated\nAuthor: admin',8,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(256,NULL,1,'2017-02-15 23:34:33','2017-02-15 23:34:33',40,'AC_OTH_AUTO','Order CO7001-0007 validated','2017-02-15 23:34:33','2017-02-15 22:34:33',12,NULL,NULL,3,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0007 validated\nAuthor: admin',9,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(257,NULL,1,'2017-02-15 23:35:03','2017-02-15 23:35:03',40,'AC_OTH_AUTO','Order CO7001-0008 validated','2017-02-15 23:35:03','2017-02-15 22:35:03',12,NULL,NULL,3,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0008 validated\nAuthor: admin',10,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(263,NULL,1,'2017-02-15 23:50:34','2017-02-15 23:50:34',40,'AC_OTH_AUTO','Order CO7001-0005 validated','2017-02-15 23:50:34','2017-02-15 22:50:34',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0005 validated\nAuthor: admin',17,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(264,NULL,1,'2017-02-15 23:51:23','2017-02-15 23:51:23',40,'AC_OTH_AUTO','Order CO7001-0006 validated','2017-02-15 23:51:23','2017-02-15 22:51:23',12,NULL,NULL,7,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0006 validated\nAuthor: admin',18,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(265,NULL,1,'2017-02-15 23:54:51','2017-02-15 23:54:51',40,'AC_OTH_AUTO','Order CO7001-0007 validated','2017-02-15 23:54:51','2017-02-15 22:54:51',12,NULL,NULL,17,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0007 validated\nAuthor: admin',19,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(266,NULL,1,'2017-02-15 23:55:52','2017-02-15 23:55:52',40,'AC_OTH_AUTO','Order CO7001-0007 validated','2017-02-15 23:55:52','2017-02-15 22:55:52',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0007 validated\nAuthor: admin',20,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(267,NULL,1,'2017-02-16 00:03:44','2017-02-16 00:03:44',40,'AC_OTH_AUTO','Order CO7001-0008 validated','2017-02-16 00:03:44','2017-02-15 23:03:44',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0008 validated\nAuthor: admin',29,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(268,NULL,1,'2017-02-16 00:05:01','2017-02-16 00:05:01',40,'AC_OTH_AUTO','Order CO7001-0009 validated','2017-02-16 00:05:01','2017-02-15 23:05:01',12,NULL,NULL,11,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0009 validated\nAuthor: admin',34,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(269,NULL,1,'2017-02-16 00:05:01','2017-02-16 00:05:01',40,'AC_OTH_AUTO','Order CO7001-0010 validated','2017-02-16 00:05:01','2017-02-15 23:05:01',12,NULL,NULL,3,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0010 validated\nAuthor: admin',38,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(270,NULL,1,'2017-02-16 00:05:11','2017-02-16 00:05:11',40,'AC_OTH_AUTO','Order CO7001-0011 validated','2017-02-16 00:05:11','2017-02-15 23:05:11',12,NULL,NULL,11,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0011 validated\nAuthor: admin',40,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(271,NULL,1,'2017-02-16 00:05:11','2017-02-16 00:05:11',40,'AC_OTH_AUTO','Order CO7001-0012 validated','2017-02-16 00:05:11','2017-02-15 23:05:11',12,NULL,NULL,10,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0012 validated\nAuthor: admin',43,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(272,NULL,1,'2017-02-16 00:05:11','2017-02-16 00:05:11',40,'AC_OTH_AUTO','Order CO7001-0013 validated','2017-02-16 00:05:11','2017-02-15 23:05:11',12,NULL,NULL,1,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0013 validated\nAuthor: admin',47,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(273,NULL,1,'2017-02-16 00:05:11','2017-02-16 00:05:11',40,'AC_OTH_AUTO','Order CO7001-0014 validated','2017-02-16 00:05:11','2017-02-15 23:05:11',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0014 validated\nAuthor: admin',48,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(274,NULL,1,'2017-02-16 00:05:26','2017-02-16 00:05:26',40,'AC_OTH_AUTO','Order CO7001-0015 validated','2017-02-16 00:05:26','2017-02-15 23:05:26',12,NULL,NULL,1,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0015 validated\nAuthor: admin',50,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(275,NULL,1,'2017-02-16 00:05:26','2017-02-16 00:05:26',40,'AC_OTH_AUTO','Order CO7001-0016 validated','2017-02-16 00:05:26','2017-02-15 23:05:26',12,NULL,NULL,12,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0016 validated\nAuthor: admin',54,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(277,NULL,1,'2017-02-16 00:05:35','2017-02-16 00:05:35',40,'AC_OTH_AUTO','Order CO7001-0018 validated','2017-02-16 00:05:35','2017-02-15 23:05:35',12,NULL,NULL,19,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0018 validated\nAuthor: admin',62,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(278,NULL,1,'2017-02-16 00:05:35','2017-02-16 00:05:35',40,'AC_OTH_AUTO','Order CO7001-0019 validated','2017-02-16 00:05:35','2017-02-15 23:05:35',12,NULL,NULL,3,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0019 validated\nAuthor: admin',68,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(279,NULL,1,'2017-02-16 00:05:36','2017-02-16 00:05:36',40,'AC_OTH_AUTO','Order CO7001-0020 validated','2017-02-16 00:05:36','2017-02-15 23:05:36',12,NULL,NULL,6,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0020 validated\nAuthor: admin',72,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(281,NULL,1,'2017-02-16 00:05:37','2017-02-16 00:05:37',40,'AC_OTH_AUTO','Order CO7001-0022 validated','2017-02-16 00:05:37','2017-02-15 23:05:37',12,NULL,NULL,12,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0022 validated\nAuthor: admin',78,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(282,NULL,1,'2017-02-16 00:05:38','2017-02-16 00:05:38',40,'AC_OTH_AUTO','Order CO7001-0023 validated','2017-02-16 00:05:38','2017-02-15 23:05:38',12,NULL,NULL,11,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0023 validated\nAuthor: admin',81,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(283,NULL,1,'2017-02-16 00:05:38','2017-02-16 00:05:38',40,'AC_OTH_AUTO','Order CO7001-0024 validated','2017-02-16 00:05:38','2017-02-15 23:05:38',12,NULL,NULL,26,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0024 validated\nAuthor: admin',83,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(284,NULL,1,'2017-02-16 00:05:38','2017-02-16 00:05:38',40,'AC_OTH_AUTO','Order CO7001-0025 validated','2017-02-16 00:05:38','2017-02-15 23:05:38',12,NULL,NULL,2,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0025 validated\nAuthor: admin',84,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(285,NULL,1,'2017-02-16 00:05:38','2017-02-16 00:05:38',40,'AC_OTH_AUTO','Order CO7001-0026 validated','2017-02-16 00:05:38','2017-02-15 23:05:38',12,NULL,NULL,1,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0026 validated\nAuthor: admin',85,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(286,NULL,1,'2017-02-16 00:05:38','2017-02-16 00:05:38',40,'AC_OTH_AUTO','Order CO7001-0027 validated','2017-02-16 00:05:38','2017-02-15 23:05:38',12,NULL,NULL,10,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0027 validated\nAuthor: admin',88,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(287,NULL,1,'2017-02-16 03:05:56','2017-02-16 03:05:56',40,'AC_OTH_AUTO','Commande CO7001-0016 classée Livrée','2017-02-16 03:05:56','2017-02-15 23:05:56',12,NULL,NULL,12,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Commande CO7001-0016 classée Livrée\nAuteur: admin',54,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(288,NULL,1,'2017-02-16 03:06:01','2017-02-16 03:06:01',40,'AC_OTH_AUTO','Commande CO7001-0016 classée Facturée','2017-02-16 03:06:01','2017-02-15 23:06:01',12,NULL,NULL,12,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Commande CO7001-0016 classée Facturée\nAuteur: admin',54,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(294,NULL,1,'2017-02-16 03:53:04','2017-02-16 03:53:04',40,'AC_OTH_AUTO','Commande CO7001-0021 validée','2017-02-16 03:53:04','2017-02-15 23:53:04',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Commande CO7001-0021 validée\nAuteur: admin',75,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(295,NULL,1,'2017-02-16 03:58:08','2017-02-16 03:58:08',40,'AC_OTH_AUTO','Expédition SH1702-0002 validée','2017-02-16 03:58:08','2017-02-15 23:58:08',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Expédition SH1702-0002 validée\nAuteur: admin',3,'shipping',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(296,NULL,1,'2017-02-16 04:12:29','2017-02-16 04:12:29',40,'AC_OTH_AUTO','Commande CO7001-0021 validée','2017-02-16 04:12:29','2017-02-16 00:12:29',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Commande CO7001-0021 validée\nAuteur: admin',75,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(297,NULL,1,'2017-02-16 04:14:20','2017-02-16 04:14:20',40,'AC_OTH_AUTO','Commande CO7001-0021 validée','2017-02-16 04:14:20','2017-02-16 00:14:20',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Commande CO7001-0021 validée\nAuteur: admin',75,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(298,NULL,1,'2017-02-16 01:44:58','2017-02-16 01:44:58',40,'AC_OTH_AUTO','Proposal PR1702-0009 validated','2017-02-16 01:44:58','2017-02-16 00:44:58',1,NULL,NULL,1,NULL,0,1,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0009 validated\nAuthor: aeinstein',11,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(299,NULL,1,'2017-02-16 01:45:44','2017-02-16 01:45:44',40,'AC_OTH_AUTO','Proposal PR1702-0010 validated','2017-02-16 01:45:44','2017-02-16 00:45:44',2,NULL,NULL,7,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0010 validated\nAuthor: demo',12,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(300,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0011 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',1,NULL,NULL,26,NULL,0,1,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0011 validated\nAuthor: aeinstein',13,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(301,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0012 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',2,NULL,NULL,3,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0012 validated\nAuthor: demo',14,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(302,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0013 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',2,NULL,NULL,26,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0013 validated\nAuthor: demo',15,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(303,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0014 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',2,NULL,NULL,1,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0014 validated\nAuthor: demo',16,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(304,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0015 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',1,NULL,NULL,1,NULL,0,1,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0015 validated\nAuthor: aeinstein',17,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(305,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0016 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',2,NULL,NULL,26,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0016 validated\nAuthor: demo',18,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(306,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0017 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',2,NULL,NULL,12,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0017 validated\nAuthor: demo',19,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(307,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0018 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',1,NULL,NULL,26,NULL,0,1,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0018 validated\nAuthor: aeinstein',20,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(308,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0019 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',1,NULL,NULL,1,NULL,0,1,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0019 validated\nAuthor: aeinstein',21,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(309,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0020 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',1,NULL,NULL,26,NULL,0,1,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0020 validated\nAuthor: aeinstein',22,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(310,NULL,1,'2017-02-16 01:46:17','2017-02-16 01:46:17',40,'AC_OTH_AUTO','Proposal PR1702-0021 validated','2017-02-16 01:46:17','2017-02-16 00:46:17',2,NULL,NULL,12,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0021 validated\nAuthor: demo',23,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(311,NULL,1,'2017-02-16 01:46:17','2017-02-16 01:46:17',40,'AC_OTH_AUTO','Proposal PR1702-0022 validated','2017-02-16 01:46:17','2017-02-16 00:46:17',2,NULL,NULL,7,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0022 validated\nAuthor: demo',24,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(312,NULL,1,'2017-02-16 01:46:17','2017-02-16 01:46:17',40,'AC_OTH_AUTO','Proposal PR1702-0023 validated','2017-02-16 01:46:17','2017-02-16 00:46:17',1,NULL,NULL,3,NULL,0,1,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0023 validated\nAuthor: aeinstein',25,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(313,NULL,1,'2017-02-16 01:46:18','2017-02-16 01:46:18',40,'AC_OTH_AUTO','Proposal PR1702-0024 validated','2017-02-16 01:46:18','2017-02-16 00:46:18',2,NULL,NULL,1,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0024 validated\nAuthor: demo',26,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(314,NULL,1,'2017-02-16 01:46:18','2017-02-16 01:46:18',40,'AC_OTH_AUTO','Proposal PR1702-0025 validated','2017-02-16 01:46:18','2017-02-16 00:46:18',1,NULL,NULL,6,NULL,0,1,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0025 validated\nAuthor: aeinstein',27,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(315,NULL,1,'2017-02-16 01:46:18','2017-02-16 01:46:18',40,'AC_OTH_AUTO','Proposal PR1702-0026 validated','2017-02-16 01:46:18','2017-02-16 00:46:18',2,NULL,NULL,19,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0026 validated\nAuthor: demo',28,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(316,NULL,1,'2017-02-16 01:46:18','2017-02-16 01:46:18',40,'AC_OTH_AUTO','Proposal PR1702-0027 validated','2017-02-16 01:46:18','2017-02-16 00:46:18',2,NULL,NULL,1,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0027 validated\nAuthor: demo',29,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(317,NULL,1,'2017-02-16 01:46:18','2017-02-16 01:46:18',40,'AC_OTH_AUTO','Proposal PR1702-0028 validated','2017-02-16 01:46:18','2017-02-16 00:46:18',2,NULL,NULL,1,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0028 validated\nAuthor: demo',30,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(318,NULL,1,'2017-02-16 01:46:18','2017-02-16 01:46:18',40,'AC_OTH_AUTO','Proposal PR1702-0029 validated','2017-02-16 01:46:18','2017-02-16 00:46:18',1,NULL,NULL,11,NULL,0,1,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0029 validated\nAuthor: aeinstein',31,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(319,NULL,1,'2017-02-16 01:46:18','2017-02-16 01:46:18',40,'AC_OTH_AUTO','Proposal PR1702-0030 validated','2017-02-16 01:46:18','2017-02-16 00:46:18',2,NULL,NULL,19,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0030 validated\nAuthor: demo',32,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(320,NULL,1,'2017-02-16 04:46:31','2017-02-16 04:46:31',40,'AC_OTH_AUTO','Proposition PR1702-0026 signée','2017-02-16 04:46:31','2017-02-16 00:46:31',12,NULL,NULL,19,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposition PR1702-0026 signée\nAuteur: admin',28,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(321,NULL,1,'2017-02-16 04:46:37','2017-02-16 04:46:37',40,'AC_OTH_AUTO','Proposition PR1702-0027 signée','2017-02-16 04:46:37','2017-02-16 00:46:37',12,NULL,NULL,1,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposition PR1702-0027 signée\nAuteur: admin',29,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(322,NULL,1,'2017-02-16 04:46:42','2017-02-16 04:46:42',40,'AC_OTH_AUTO','Proposition PR1702-0028 refusée','2017-02-16 04:46:42','2017-02-16 00:46:42',12,NULL,NULL,1,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposition PR1702-0028 refusée\nAuteur: admin',30,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(323,NULL,1,'2017-02-16 04:47:09','2017-02-16 04:47:09',40,'AC_OTH_AUTO','Proposition PR1702-0019 validée','2017-02-16 04:47:09','2017-02-16 00:47:09',12,NULL,NULL,1,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposition PR1702-0019 validée\nAuteur: admin',21,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(324,NULL,1,'2017-02-16 04:47:25','2017-02-16 04:47:25',40,'AC_OTH_AUTO','Proposition PR1702-0023 signée','2017-02-16 04:47:25','2017-02-16 00:47:25',12,NULL,NULL,3,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposition PR1702-0023 signée\nAuteur: admin',25,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(325,NULL,1,'2017-02-16 04:47:29','2017-02-16 04:47:29',40,'AC_OTH_AUTO','Proposition PR1702-0023 classée payée','2017-02-16 04:47:29','2017-02-16 00:47:29',12,NULL,NULL,3,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposition PR1702-0023 classée payée\nAuteur: admin',25,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(326,NULL,1,'2017-02-17 16:07:18','2017-02-17 16:07:18',40,'AC_OTH_AUTO','Proposition PR1702-0021 validée','2017-02-17 16:07:18','2017-02-17 12:07:18',12,NULL,NULL,12,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposition PR1702-0021 validée\nAuteur: admin',23,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); +INSERT INTO `llx_actioncomm` VALUES (1,NULL,1,'2010-07-08 14:21:44','2010-07-08 14:21:44',50,NULL,'Company AAA and Co added into Dolibarr','2010-07-08 14:21:44','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Company AAA and Co added into Dolibarr\nAuthor: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(2,NULL,1,'2010-07-08 14:23:48','2010-07-08 14:23:48',50,NULL,'Company Belin SARL added into Dolibarr','2010-07-08 14:23:48','2014-12-21 12:50:33',1,NULL,NULL,2,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Company Belin SARL added into Dolibarr\nAuthor: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(3,NULL,1,'2010-07-08 22:42:12','2010-07-08 22:42:12',50,NULL,'Company Spanish Comp added into Dolibarr','2010-07-08 22:42:12','2014-12-21 12:50:33',1,NULL,NULL,3,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Company Spanish Comp added into Dolibarr\nAuthor: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(4,NULL,1,'2010-07-08 22:48:18','2010-07-08 22:48:18',50,NULL,'Company Prospector Vaalen added into Dolibarr','2010-07-08 22:48:18','2014-12-21 12:50:33',1,NULL,NULL,4,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Company Prospector Vaalen added into Dolibarr\nAuthor: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(5,NULL,1,'2010-07-08 23:22:57','2010-07-08 23:22:57',50,NULL,'Company NoCountry Co added into Dolibarr','2010-07-08 23:22:57','2014-12-21 12:50:33',1,NULL,NULL,5,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Company NoCountry Co added into Dolibarr\nAuthor: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(6,NULL,1,'2010-07-09 00:15:09','2010-07-09 00:15:09',50,NULL,'Company Swiss customer added into Dolibarr','2010-07-09 00:15:09','2014-12-21 12:50:33',1,NULL,NULL,6,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Company Swiss customer added into Dolibarr\nAuthor: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(7,NULL,1,'2010-07-09 01:24:26','2010-07-09 01:24:26',50,NULL,'Company Generic customer added into Dolibarr','2010-07-09 01:24:26','2014-12-21 12:50:33',1,NULL,NULL,7,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Company Generic customer added into Dolibarr\nAuthor: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(8,NULL,1,'2010-07-10 14:54:27','2010-07-10 14:54:27',50,NULL,'Société Client salon ajoutée dans Dolibarr','2010-07-10 14:54:27','2014-12-21 12:50:33',1,NULL,NULL,8,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Société Client salon ajoutée dans Dolibarr\nAuteur: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(9,NULL,1,'2010-07-10 14:54:44','2010-07-10 14:54:44',50,NULL,'Société Client salon invidivdu ajoutée dans Doliba','2010-07-10 14:54:44','2014-12-21 12:50:33',1,NULL,NULL,9,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Société Client salon invidivdu ajoutée dans Dolibarr\nAuteur: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(10,NULL,1,'2010-07-10 14:56:10','2010-07-10 14:56:10',50,NULL,'Facture FA1007-0001 validée dans Dolibarr','2010-07-10 14:56:10','2014-12-21 12:50:33',1,NULL,NULL,9,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Facture FA1007-0001 validée dans Dolibarr\nAuteur: admin',1,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(11,NULL,1,'2010-07-10 14:58:53','2010-07-10 14:58:53',50,NULL,'Facture FA1007-0001 validée dans Dolibarr','2010-07-10 14:58:53','2014-12-21 12:50:33',1,NULL,NULL,9,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Facture FA1007-0001 validée dans Dolibarr\nAuteur: admin',1,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(12,NULL,1,'2010-07-10 15:00:55','2010-07-10 15:00:55',50,NULL,'Facture FA1007-0001 passée à payée dans Dolibarr','2010-07-10 15:00:55','2014-12-21 12:50:33',1,NULL,NULL,9,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Facture FA1007-0001 passée à payée dans Dolibarr\nAuteur: admin',1,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(13,NULL,1,'2010-07-10 15:13:08','2010-07-10 15:13:08',50,NULL,'Société Smith Vick ajoutée dans Dolibarr','2010-07-10 15:13:08','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Société Smith Vick ajoutée dans Dolibarr\nAuteur: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(14,NULL,1,'2010-07-10 15:21:00','2010-07-10 16:21:00',5,NULL,'RDV avec mon chef','2010-07-10 15:21:48','2010-07-10 13:21:48',1,NULL,NULL,NULL,NULL,0,1,NULL,NULL,0,0,1,0,'',3600,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(15,NULL,1,'2010-07-10 18:18:16','2010-07-10 18:18:16',50,NULL,'Contrat CONTRAT1 validé dans Dolibarr','2010-07-10 18:18:16','2014-12-21 12:50:33',1,NULL,NULL,2,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Contrat CONTRAT1 validé dans Dolibarr\nAuteur: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(16,NULL,1,'2010-07-10 18:35:57','2010-07-10 18:35:57',50,NULL,'Société Mon client ajoutée dans Dolibarr','2010-07-10 18:35:57','2014-12-21 12:50:33',1,NULL,NULL,11,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Société Mon client ajoutée dans Dolibarr\nAuteur: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(17,NULL,1,'2010-07-11 16:18:08','2010-07-11 16:18:08',50,NULL,'Société Dupont Alain ajoutée dans Dolibarr','2010-07-11 16:18:08','2014-12-21 12:50:33',1,NULL,NULL,12,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Société Dupont Alain ajoutée dans Dolibarr\nAuteur: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(18,NULL,1,'2010-07-11 17:11:00','2010-07-11 17:17:00',5,NULL,'Rendez-vous','2010-07-11 17:11:22','2010-07-11 15:11:22',1,NULL,NULL,NULL,NULL,0,1,NULL,NULL,0,0,1,0,'gfgdfgdf',360,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(19,NULL,1,'2010-07-11 17:13:20','2010-07-11 17:13:20',50,NULL,'Société Vendeur de chips ajoutée dans Dolibarr','2010-07-11 17:13:20','2014-12-21 12:50:33',1,NULL,NULL,13,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Société Vendeur de chips ajoutée dans Dolibarr\nAuteur: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(20,NULL,1,'2010-07-11 17:15:42','2010-07-11 17:15:42',50,NULL,'Commande CF1007-0001 validée','2010-07-11 17:15:42','2014-12-21 12:50:33',1,NULL,NULL,13,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Commande CF1007-0001 validée\nAuteur: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(21,NULL,1,'2010-07-11 18:47:33','2010-07-11 18:47:33',50,NULL,'Commande CF1007-0002 validée','2010-07-11 18:47:33','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Commande CF1007-0002 validée\nAuteur: admin',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(22,NULL,1,'2010-07-18 11:36:18','2010-07-18 11:36:18',50,NULL,'Proposition PR1007-0003 validée','2010-07-18 11:36:18','2014-12-21 12:50:33',1,NULL,NULL,4,NULL,0,1,NULL,1,0,0,1,100,'',NULL,NULL,'Proposition PR1007-0003 validée\nAuteur: admin',3,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(23,NULL,1,'2011-07-18 20:49:58','2011-07-18 20:49:58',50,NULL,'Invoice FA1007-0002 validated in Dolibarr','2011-07-18 20:49:58','2014-12-21 12:50:33',1,NULL,NULL,2,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1007-0002 validated in Dolibarr\nAuthor: admin',2,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(24,NULL,1,'2011-07-28 01:37:00',NULL,1,NULL,'Phone call','2011-07-28 01:37:48','2011-07-27 23:37:48',1,NULL,NULL,NULL,2,0,1,NULL,NULL,0,0,1,-1,'',NULL,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(25,NULL,1,'2011-08-01 02:31:24','2011-08-01 02:31:24',50,NULL,'Company mmm added into Dolibarr','2011-08-01 02:31:24','2014-12-21 12:50:33',1,NULL,NULL,15,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Company mmm added into Dolibarr\nAuthor: admin',15,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(26,NULL,1,'2011-08-01 02:31:43','2011-08-01 02:31:43',50,NULL,'Company ppp added into Dolibarr','2011-08-01 02:31:43','2014-12-21 12:50:33',1,NULL,NULL,16,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Company ppp added into Dolibarr\nAuthor: admin',16,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(27,NULL,1,'2011-08-01 02:41:26','2011-08-01 02:41:26',50,NULL,'Company aaa added into Dolibarr','2011-08-01 02:41:26','2014-12-21 12:50:33',1,NULL,NULL,17,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Company aaa added into Dolibarr\nAuthor: admin',17,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(28,NULL,1,'2011-08-01 03:34:11','2011-08-01 03:34:11',50,NULL,'Invoice FA1108-0003 validated in Dolibarr','2011-08-01 03:34:11','2014-12-21 12:50:33',1,NULL,NULL,7,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1108-0003 validated in Dolibarr\nAuthor: admin',5,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(29,NULL,1,'2011-08-01 03:34:11','2011-08-01 03:34:11',50,NULL,'Invoice FA1108-0003 validated in Dolibarr','2011-08-01 03:34:11','2014-12-21 12:50:33',1,NULL,NULL,7,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1108-0003 changed to paid in Dolibarr\nAuthor: admin',5,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(30,NULL,1,'2011-08-06 20:33:54','2011-08-06 20:33:54',50,NULL,'Invoice FA1108-0004 validated in Dolibarr','2011-08-06 20:33:54','2014-12-21 12:50:33',1,NULL,NULL,7,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1108-0004 validated in Dolibarr\nAuthor: admin',6,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(31,NULL,1,'2011-08-06 20:33:54','2011-08-06 20:33:54',50,NULL,'Invoice FA1108-0004 validated in Dolibarr','2011-08-06 20:33:54','2014-12-21 12:50:33',1,NULL,NULL,7,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1108-0004 changed to paid in Dolibarr\nAuthor: admin',6,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(38,NULL,1,'2011-08-08 02:41:55','2011-08-08 02:41:55',50,NULL,'Invoice FA1108-0005 validated in Dolibarr','2011-08-08 02:41:55','2014-12-21 12:50:33',1,NULL,NULL,2,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1108-0005 validated in Dolibarr\nAuthor: admin',8,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(40,NULL,1,'2011-08-08 02:53:40','2011-08-08 02:53:40',50,NULL,'Invoice FA1108-0005 changed to paid in Dolibarr','2011-08-08 02:53:40','2014-12-21 12:50:33',1,NULL,NULL,2,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1108-0005 changed to paid in Dolibarr\nAuthor: admin',8,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(41,NULL,1,'2011-08-08 02:54:05','2011-08-08 02:54:05',50,NULL,'Invoice FA1007-0002 changed to paid in Dolibarr','2011-08-08 02:54:05','2014-12-21 12:50:33',1,NULL,NULL,2,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1007-0002 changed to paid in Dolibarr\nAuthor: admin',2,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(42,NULL,1,'2011-08-08 02:55:04','2011-08-08 02:55:04',50,NULL,'Invoice FA1107-0006 validated in Dolibarr','2011-08-08 02:55:04','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1107-0006 validated in Dolibarr\nAuthor: admin',3,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(43,NULL,1,'2011-08-08 02:55:26','2011-08-08 02:55:26',50,NULL,'Invoice FA1108-0007 validated in Dolibarr','2011-08-08 02:55:26','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1108-0007 validated in Dolibarr\nAuthor: admin',9,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(44,NULL,1,'2011-08-08 02:55:58','2011-08-08 02:55:58',50,NULL,'Invoice FA1107-0006 changed to paid in Dolibarr','2011-08-08 02:55:58','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1107-0006 changed to paid in Dolibarr\nAuthor: admin',3,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(45,NULL,1,'2011-08-08 03:04:22','2011-08-08 03:04:22',50,NULL,'Order CO1108-0001 validated','2011-08-08 03:04:22','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Order CO1108-0001 validated\nAuthor: admin',5,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(46,NULL,1,'2011-08-08 13:59:09','2011-08-08 13:59:09',50,NULL,'Order CO1107-0002 validated','2011-08-08 13:59:10','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Order CO1107-0002 validated\nAuthor: admin',1,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(47,NULL,1,'2011-08-08 14:24:18','2011-08-08 14:24:18',50,NULL,'Proposal PR1007-0001 validated','2011-08-08 14:24:18','2014-12-21 12:50:33',1,NULL,NULL,2,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Proposal PR1007-0001 validated\nAuthor: admin',1,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(48,NULL,1,'2011-08-08 14:24:24','2011-08-08 14:24:24',50,NULL,'Proposal PR1108-0004 validated','2011-08-08 14:24:24','2014-12-21 12:50:33',1,NULL,NULL,17,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Proposal PR1108-0004 validated\nAuthor: admin',4,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(49,NULL,1,'2011-08-08 15:04:37','2011-08-08 15:04:37',50,NULL,'Order CF1108-0003 validated','2011-08-08 15:04:37','2014-12-21 12:50:33',1,NULL,NULL,17,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Order CF1108-0003 validated\nAuthor: admin',6,'order_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(50,NULL,1,'2012-12-08 17:56:47','2012-12-08 17:56:47',40,NULL,'Facture AV1212-0001 validée dans Dolibarr','2012-12-08 17:56:47','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture AV1212-0001 validée dans Dolibarr\nAuteur: admin',10,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(51,NULL,1,'2012-12-08 17:57:11','2012-12-08 17:57:11',40,NULL,'Facture AV1212-0001 validée dans Dolibarr','2012-12-08 17:57:11','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture AV1212-0001 validée dans Dolibarr\nAuteur: admin',10,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(52,NULL,1,'2012-12-08 17:58:27','2012-12-08 17:58:27',40,NULL,'Facture FA1212-0008 validée dans Dolibarr','2012-12-08 17:58:27','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1212-0008 validée dans Dolibarr\nAuteur: admin',11,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(53,NULL,1,'2012-12-08 18:20:49','2012-12-08 18:20:49',40,NULL,'Facture AV1212-0002 validée dans Dolibarr','2012-12-08 18:20:49','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture AV1212-0002 validée dans Dolibarr\nAuteur: admin',12,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(54,NULL,1,'2012-12-09 18:35:07','2012-12-09 18:35:07',40,NULL,'Facture AV1212-0002 passée à payée dans Dolibarr','2012-12-09 18:35:07','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture AV1212-0002 passée à payée dans Dolibarr\nAuteur: admin',12,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(55,NULL,1,'2012-12-09 20:14:42','2012-12-09 20:14:42',40,NULL,'Société doe john ajoutée dans Dolibarr','2012-12-09 20:14:42','2014-12-21 12:50:33',1,NULL,NULL,18,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Société doe john ajoutée dans Dolibarr\nAuteur: admin',18,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(56,NULL,1,'2012-12-12 18:54:19','2012-12-12 18:54:19',40,NULL,'Facture FA1212-0009 validée dans Dolibarr','2012-12-12 18:54:19','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1212-0009 validée dans Dolibarr\nAuteur: admin',55,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(121,NULL,1,'2012-12-06 10:00:00',NULL,50,NULL,'aaab','2012-12-21 17:48:08','2012-12-21 16:54:07',3,1,NULL,NULL,NULL,0,3,NULL,NULL,1,0,1,-1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(122,NULL,1,'2012-12-21 18:09:52','2012-12-21 18:09:52',40,NULL,'Facture client FA1007-0001 envoyée par EMail','2012-12-21 18:09:52','2014-12-21 12:50:33',1,NULL,NULL,9,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Mail envoyé par Firstname SuperAdminName à laurent@destailleur.fr.\nSujet du mail: Envoi facture FA1007-0001\nCorps du mail:\nVeuillez trouver ci-joint la facture FA1007-0001\r\n\r\nVous pouvez cliquer sur le lien sécurisé ci-dessous pour effectuer votre paiement via Paypal\r\n\r\nhttp://localhost/dolibarrnew/public/paypal/newpayment.php?source=invoice&ref=FA1007-0001&securekey=50c82fab36bb3b6aa83e2a50691803b2\r\n\r\nCordialement',1,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(123,NULL,1,'2013-01-06 13:13:57','2013-01-06 13:13:57',40,NULL,'Facture 16 validée dans Dolibarr','2013-01-06 13:13:57','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture 16 validée dans Dolibarr\nAuteur: admin',16,'invoice_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(124,NULL,1,'2013-01-12 12:23:05','2013-01-12 12:23:05',40,NULL,'Patient aaa ajouté','2013-01-12 12:23:05','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Patient aaa ajouté\nAuteur: admin',19,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(125,NULL,1,'2013-01-12 12:52:20','2013-01-12 12:52:20',40,NULL,'Patient pppoo ajouté','2013-01-12 12:52:20','2014-12-21 12:50:33',1,NULL,NULL,20,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Patient pppoo ajouté\nAuteur: admin',20,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(127,NULL,1,'2013-01-19 18:22:48','2013-01-19 18:22:48',40,NULL,'Facture FS1301-0001 validée dans Dolibarr','2013-01-19 18:22:48','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FS1301-0001 validée dans Dolibarr\nAuteur: admin',148,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(128,NULL,1,'2013-01-19 18:31:10','2013-01-19 18:31:10',40,NULL,'Facture FA6801-0010 validée dans Dolibarr','2013-01-19 18:31:10','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA6801-0010 validée dans Dolibarr\nAuteur: admin',150,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(129,NULL,1,'2013-01-19 18:31:10','2013-01-19 18:31:10',40,NULL,'Facture FA6801-0010 passée à payée dans Dolibarr','2013-01-19 18:31:10','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA6801-0010 passée à payée dans Dolibarr\nAuteur: admin',150,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(130,NULL,1,'2013-01-19 18:31:58','2013-01-19 18:31:58',40,NULL,'Facture FS1301-0002 validée dans Dolibarr','2013-01-19 18:31:58','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FS1301-0002 validée dans Dolibarr\nAuteur: admin',151,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(131,NULL,1,'2013-01-19 18:31:58','2013-01-19 18:31:58',40,NULL,'Facture FS1301-0002 passée à payée dans Dolibarr','2013-01-19 18:31:58','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FS1301-0002 passée à payée dans Dolibarr\nAuteur: admin',151,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(132,NULL,1,'2013-01-23 15:07:54','2013-01-23 15:07:54',50,NULL,'Consultation 24 saisie (aaa)','2013-01-23 15:07:54','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Consultation 24 saisie (aaa)\nAuteur: admin',24,'cabinetmed_cons',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(133,NULL,1,'2013-01-23 16:56:58','2013-01-23 16:56:58',40,NULL,'Patient pa ajouté','2013-01-23 16:56:58','2014-12-21 12:50:33',1,NULL,NULL,21,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Patient pa ajouté\nAuteur: admin',21,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(134,NULL,1,'2013-01-23 17:34:00',NULL,50,NULL,'bbcv','2013-01-23 17:35:21','2013-01-23 16:35:21',1,NULL,1,2,NULL,0,1,NULL,NULL,0,0,1,-1,'',NULL,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(135,NULL,1,'2013-02-12 15:54:00','2013-02-12 15:54:00',40,NULL,'Facture FA1212-0011 validée dans Dolibarr','2013-02-12 15:54:37','2014-12-21 12:50:33',1,1,NULL,7,NULL,0,1,NULL,1,0,0,1,50,NULL,NULL,NULL,'Facture FA1212-0011 validée dans Dolibarr
\r\nAuteur: admin',13,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(136,NULL,1,'2013-02-12 17:06:51','2013-02-12 17:06:51',40,NULL,'Commande CO1107-0003 validée','2013-02-12 17:06:51','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Commande CO1107-0003 validée\nAuteur: admin',2,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(137,NULL,1,'2013-02-17 16:22:10','2013-02-17 16:22:10',40,NULL,'Proposition PR1302-0009 validée','2013-02-17 16:22:10','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Proposition PR1302-0009 validée\nAuteur: admin',9,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(138,NULL,1,'2013-02-17 16:27:00','2013-02-17 16:27:00',40,NULL,'Facture FA1302-0012 validée dans Dolibarr','2013-02-17 16:27:00','2014-12-21 12:50:33',1,NULL,NULL,18,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1302-0012 validée dans Dolibarr\nAuteur: admin',152,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(139,NULL,1,'2013-02-17 16:27:29','2013-02-17 16:27:29',40,NULL,'Proposition PR1302-0010 validée','2013-02-17 16:27:29','2014-12-21 12:50:33',1,NULL,NULL,18,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Proposition PR1302-0010 validée\nAuteur: admin',11,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(140,NULL,1,'2013-02-17 18:27:56','2013-02-17 18:27:56',40,NULL,'Commande CO1107-0004 validée','2013-02-17 18:27:56','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Commande CO1107-0004 validée\nAuteur: admin',3,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(141,NULL,1,'2013-02-17 18:38:14','2013-02-17 18:38:14',40,NULL,'Commande CO1302-0005 validée','2013-02-17 18:38:14','2014-12-21 12:50:33',1,NULL,NULL,18,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Commande CO1302-0005 validée\nAuteur: admin',7,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(142,NULL,1,'2013-02-26 22:57:50','2013-02-26 22:57:50',40,NULL,'Company pppp added into Dolibarr','2013-02-26 22:57:50','2014-12-21 12:50:33',1,NULL,NULL,22,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Company pppp added into Dolibarr\nAuthor: admin',22,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(143,NULL,1,'2013-02-26 22:58:13','2013-02-26 22:58:13',40,NULL,'Company ttttt added into Dolibarr','2013-02-26 22:58:13','2014-12-21 12:50:33',1,NULL,NULL,23,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Company ttttt added into Dolibarr\nAuthor: admin',23,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(144,NULL,1,'2013-02-27 10:00:00','2013-02-27 19:20:00',5,NULL,'Rendez-vous','2013-02-27 19:20:53','2013-02-27 18:20:53',1,NULL,NULL,NULL,NULL,0,1,NULL,1,0,0,1,-1,'',33600,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(145,NULL,1,'2013-02-27 19:28:00',NULL,2,NULL,'fdsfsd','2013-02-27 19:28:48','2013-02-27 18:29:53',1,1,NULL,NULL,NULL,0,1,NULL,1,0,0,1,-1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(146,NULL,1,'2013-03-06 10:05:07','2013-03-06 10:05:07',40,NULL,'Contrat (PROV3) validé dans Dolibarr','2013-03-06 10:05:07','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Contrat (PROV3) validé dans Dolibarr\nAuteur: admin',3,'contract',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(147,NULL,1,'2013-03-06 16:43:37','2013-03-06 16:43:37',40,NULL,'Facture FA1307-0013 validée dans Dolibarr','2013-03-06 16:43:37','2014-12-21 12:50:33',1,NULL,NULL,12,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1307-0013 validée dans Dolibarr\nAuteur: admin',158,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(148,NULL,1,'2013-03-06 16:44:12','2013-03-06 16:44:12',40,NULL,'Facture FA1407-0014 validée dans Dolibarr','2013-03-06 16:44:12','2014-12-21 12:50:33',1,NULL,NULL,12,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1407-0014 validée dans Dolibarr\nAuteur: admin',159,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(149,NULL,1,'2013-03-06 16:47:48','2013-03-06 16:47:48',40,NULL,'Facture FA1507-0015 validée dans Dolibarr','2013-03-06 16:47:48','2014-12-21 12:50:33',1,NULL,NULL,12,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1507-0015 validée dans Dolibarr\nAuteur: admin',160,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(150,NULL,1,'2013-03-06 16:48:16','2013-03-06 16:48:16',40,NULL,'Facture FA1607-0016 validée dans Dolibarr','2013-03-06 16:48:16','2014-12-21 12:50:33',1,NULL,NULL,12,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1607-0016 validée dans Dolibarr\nAuteur: admin',161,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(151,NULL,1,'2013-03-06 17:13:59','2013-03-06 17:13:59',40,NULL,'Société smith smith ajoutée dans Dolibarr','2013-03-06 17:13:59','2014-12-21 12:50:33',1,NULL,NULL,24,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Société smith smith ajoutée dans Dolibarr\nAuteur: admin',24,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(152,NULL,1,'2013-03-08 10:02:22','2013-03-08 10:02:22',40,NULL,'Proposition (PROV12) validée dans Dolibarr','2013-03-08 10:02:22','2014-12-21 12:50:33',1,NULL,NULL,23,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Proposition (PROV12) validée dans Dolibarr\nAuteur: admin',12,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(203,NULL,1,'2013-03-09 19:39:27','2013-03-09 19:39:27',40,'AC_ORDER_SUPPLIER_VALIDATE','Commande CF1303-0004 validée','2013-03-09 19:39:27','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Commande CF1303-0004 validée\nAuteur: admin',13,'order_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(204,NULL,1,'2013-03-10 15:47:37','2013-03-10 15:47:37',40,'AC_COMPANY_CREATE','Patient créé','2013-03-10 15:47:37','2014-12-21 12:50:33',1,NULL,NULL,25,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Patient créé\nAuteur: admin',25,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(205,NULL,1,'2013-03-10 15:57:32','2013-03-10 15:57:32',40,'AC_COMPANY_CREATE','Tiers créé','2013-03-10 15:57:32','2014-12-21 12:50:33',1,NULL,NULL,26,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Tiers créé\nAuteur: admin',26,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(206,NULL,1,'2013-03-10 15:58:28','2013-03-10 15:58:28',40,'AC_BILL_VALIDATE','Facture FA1303-0017 validée','2013-03-10 15:58:28','2014-12-21 12:50:33',1,NULL,NULL,26,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1303-0017 validée\nAuteur: admin',208,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(207,NULL,1,'2013-03-19 09:38:10','2013-03-19 09:38:10',40,'AC_BILL_VALIDATE','Facture FA1303-0018 validée','2013-03-19 09:38:10','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1303-0018 validée\nAuteur: admin',209,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(208,NULL,1,'2013-03-20 14:30:11','2013-03-20 14:30:11',40,'AC_BILL_VALIDATE','Facture FA1107-0019 validée','2013-03-20 14:30:11','2014-12-21 12:50:33',1,NULL,NULL,10,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1107-0019 validée\nAuteur: admin',210,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(209,NULL,1,'2013-03-22 09:40:25','2013-03-22 09:40:25',40,'AC_BILL_VALIDATE','Facture FA1303-0020 validée','2013-03-22 09:40:25','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1303-0020 validée\nAuteur: admin',211,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(210,NULL,1,'2013-03-23 17:16:25','2013-03-23 17:16:25',40,'AC_BILL_VALIDATE','Facture FA1303-0020 validée','2013-03-23 17:16:25','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1303-0020 validée\nAuteur: admin',211,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(211,NULL,1,'2013-03-23 18:08:27','2013-03-23 18:08:27',40,'AC_BILL_VALIDATE','Facture FA1307-0013 validée','2013-03-23 18:08:27','2014-12-21 12:50:33',1,NULL,NULL,12,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1307-0013 validée\nAuteur: admin',158,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(212,NULL,1,'2013-03-24 15:54:00','2013-03-24 15:54:00',40,'AC_BILL_VALIDATE','Facture FA1212-0021 validée','2013-03-24 15:54:00','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,NULL,1,0,0,1,-1,'',NULL,NULL,'Facture FA1212-0021 validée\nAuteur: admin',32,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(213,NULL,1,'2013-11-07 01:02:39','2013-11-07 01:02:39',40,'AC_COMPANY_CREATE','Third party created','2013-11-07 01:02:39','2014-12-21 12:50:33',1,NULL,NULL,27,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Third party created\nAuthor: admin',27,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(214,NULL,1,'2013-11-07 01:05:22','2013-11-07 01:05:22',40,'AC_COMPANY_CREATE','Third party created','2013-11-07 01:05:22','2014-12-21 12:50:33',1,NULL,NULL,28,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Third party created\nAuthor: admin',28,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(215,NULL,1,'2013-11-07 01:07:07','2013-11-07 01:07:07',40,'AC_COMPANY_CREATE','Third party created','2013-11-07 01:07:07','2014-12-21 12:50:33',1,NULL,NULL,29,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Third party created\nAuthor: admin',29,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(216,NULL,1,'2013-11-07 01:07:58','2013-11-07 01:07:58',40,'AC_COMPANY_CREATE','Third party created','2013-11-07 01:07:58','2014-12-21 12:50:33',1,NULL,NULL,30,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Third party created\nAuthor: admin',30,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(217,NULL,1,'2013-11-07 01:10:09','2013-11-07 01:10:09',40,'AC_COMPANY_CREATE','Third party created','2013-11-07 01:10:09','2014-12-21 12:50:33',1,NULL,NULL,31,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Third party created\nAuthor: admin',31,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(218,NULL,1,'2013-11-07 01:15:57','2013-11-07 01:15:57',40,'AC_COMPANY_CREATE','Third party created','2013-11-07 01:15:57','2014-12-21 12:50:33',1,NULL,NULL,32,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Third party created\nAuthor: admin',32,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(219,NULL,1,'2013-11-07 01:16:51','2013-11-07 01:16:51',40,'AC_COMPANY_CREATE','Third party created','2013-11-07 01:16:51','2014-12-21 12:50:33',1,NULL,NULL,33,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Third party created\nAuthor: admin',33,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(220,NULL,1,'2014-03-02 17:24:04','2014-03-02 17:24:04',40,'AC_BILL_VALIDATE','Invoice FA1302-0022 validated','2014-03-02 17:24:04','2014-12-21 12:50:33',1,NULL,NULL,18,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1302-0022 validated\nAuthor: admin',157,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(221,NULL,1,'2014-03-02 17:24:28','2014-03-02 17:24:28',40,'AC_BILL_VALIDATE','Invoice FA1303-0020 validated','2014-03-02 17:24:28','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1303-0020 validated\nAuthor: admin',211,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(222,NULL,1,'2014-03-05 10:00:00','2014-03-05 10:00:00',5,NULL,'RDV John','2014-03-02 19:54:48','2014-03-02 18:55:29',1,1,NULL,NULL,NULL,0,1,0,NULL,0,0,1,-1,NULL,NULL,NULL,'gfdgdfgdf',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(223,NULL,1,'2014-03-13 10:00:00','2014-03-17 00:00:00',50,NULL,'Congress','2014-03-02 19:55:11','2014-03-02 18:55:11',1,NULL,NULL,NULL,NULL,0,1,0,NULL,0,0,1,-1,'',309600,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(224,NULL,1,'2014-03-14 10:00:00',NULL,1,NULL,'Call john','2014-03-02 19:55:56','2014-03-02 18:55:56',1,NULL,NULL,NULL,NULL,0,1,0,NULL,0,0,1,0,'',NULL,NULL,'tttt',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(225,NULL,1,'2014-03-02 20:11:31','2014-03-02 20:11:31',40,'AC_BILL_UNVALIDATE','Invoice FA1303-0020 go back to draft status','2014-03-02 20:11:31','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1303-0020 go back to draft status\nAuthor: admin',211,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(226,NULL,1,'2014-03-02 20:13:39','2014-03-02 20:13:39',40,'AC_BILL_VALIDATE','Invoice FA1303-0020 validated','2014-03-02 20:13:39','2014-12-21 12:50:33',1,NULL,NULL,19,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1303-0020 validated\nAuthor: admin',211,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(227,NULL,1,'2014-03-03 19:20:10','2014-03-03 19:20:10',40,'AC_BILL_VALIDATE','Invoice FA1212-0023 validated','2014-03-03 19:20:10','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1212-0023 validated\nAuthor: admin',33,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(228,NULL,1,'2014-03-03 19:20:25','2014-03-03 19:20:25',40,'AC_BILL_CANCEL','Invoice FA1212-0023 canceled in Dolibarr','2014-03-03 19:20:25','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Invoice FA1212-0023 canceled in Dolibarr\nAuthor: admin',33,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(229,NULL,1,'2014-03-03 19:20:56','2014-03-03 19:20:56',40,'AC_BILL_VALIDATE','Invoice AV1403-0003 validated','2014-03-03 19:20:56','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Invoice AV1403-0003 validated\nAuthor: admin',212,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(230,NULL,1,'2014-03-03 19:21:29','2014-03-03 19:21:29',40,'AC_BILL_UNVALIDATE','Invoice AV1403-0003 go back to draft status','2014-03-03 19:21:29','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Invoice AV1403-0003 go back to draft status\nAuthor: admin',212,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(231,NULL,1,'2014-03-03 19:22:16','2014-03-03 19:22:16',40,'AC_BILL_VALIDATE','Invoice AV1303-0003 validated','2014-03-03 19:22:16','2014-12-21 12:50:33',1,NULL,NULL,1,NULL,0,1,0,1,0,0,1,-1,'',NULL,NULL,'Invoice AV1303-0003 validated\nAuthor: admin',213,'invoice',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(232,NULL,1,'2016-01-22 18:54:39','2016-01-22 18:54:39',40,'AC_OTH_AUTO','Invoice 16 validated','2016-01-22 18:54:39','2016-01-22 17:54:39',12,NULL,NULL,1,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Invoice 16 validated\nAuthor: admin',16,'invoice_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(233,NULL,1,'2016-01-22 18:54:46','2016-01-22 18:54:46',40,'AC_OTH_AUTO','Invoice 16 validated','2016-01-22 18:54:46','2016-01-22 17:54:46',12,NULL,NULL,1,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Invoice 16 validated\nAuthor: admin',16,'invoice_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(234,NULL,1,'2016-07-05 10:00:00','2016-07-05 11:19:00',5,'AC_RDV','Meeting with my boss','2016-07-31 18:19:48','2016-07-31 14:19:48',12,NULL,NULL,NULL,NULL,0,12,1,NULL,0,0,1,-1,'',4740,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(235,NULL,1,'2016-07-13 00:00:00','2016-07-14 23:59:59',50,'AC_OTH','Trip at Las Vegas','2016-07-31 18:20:36','2016-07-31 14:20:36',12,NULL,4,NULL,2,0,12,1,NULL,0,1,1,-1,'',172799,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(236,NULL,1,'2016-07-29 10:00:00',NULL,4,'AC_EMAIL','Remind to send an email','2016-07-31 18:21:04','2016-07-31 14:21:04',12,NULL,NULL,NULL,NULL,0,4,0,NULL,0,0,1,-1,'',NULL,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(237,NULL,1,'2016-07-01 10:00:00',NULL,1,'AC_TEL','Phone call with Mr Vaalen','2016-07-31 18:22:04','2016-07-31 14:22:04',12,NULL,6,4,NULL,0,13,0,NULL,0,0,1,-1,'',NULL,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(238,NULL,1,'2016-08-02 10:00:00','2016-08-02 12:00:00',5,'AC_RDV','Meeting on radium','2016-08-01 01:15:50','2016-07-31 21:15:50',12,NULL,8,10,10,0,12,1,NULL,0,0,1,-1,'',7200,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(239,NULL,1,'2017-01-29 21:49:33','2017-01-29 21:49:33',40,'AC_OTH_AUTO','Proposal PR1302-0007 validated','2017-01-29 21:49:33','2017-01-29 17:49:33',12,NULL,NULL,19,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1302-0007 validated\nAuthor: admin',7,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(240,NULL,1,'2017-01-31 20:52:00',NULL,1,'AC_TEL','Call the boss','2017-01-31 20:52:10','2017-01-31 16:52:25',12,12,6,NULL,NULL,0,12,1,NULL,0,0,1,-1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(242,NULL,1,'2017-02-01 18:52:04','2017-02-01 18:52:04',40,'AC_OTH_AUTO','Order CF1007-0001 validated','2017-02-01 18:52:04','2017-02-01 14:52:04',12,NULL,NULL,13,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CF1007-0001 validated\nAuthor: admin',1,'order_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(243,NULL,1,'2017-02-01 18:52:04','2017-02-01 18:52:04',40,'AC_OTH_AUTO','Order CF1007-0001 approved','2017-02-01 18:52:04','2017-02-01 14:52:04',12,NULL,NULL,13,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CF1007-0001 approved\nAuthor: admin',1,'order_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(245,NULL,1,'2017-02-01 18:52:32','2017-02-01 18:52:32',40,'AC_OTH_AUTO','Supplier order CF1007-0001 submited','2017-02-01 18:52:32','2017-02-01 14:52:32',12,NULL,NULL,13,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Supplier order CF1007-0001 submited\nAuthor: admin',1,'order_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(249,NULL,1,'2017-02-01 18:54:01','2017-02-01 18:54:01',40,'AC_OTH_AUTO','Supplier order CF1007-0001 received','2017-02-01 18:54:01','2017-02-01 14:54:01',12,NULL,NULL,13,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Supplier order CF1007-0001 received \nAuthor: admin',1,'order_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(250,NULL,1,'2017-02-01 18:54:42','2017-02-01 18:54:42',40,'AC_OTH_AUTO','Email sent by MyBigCompany To mycustomer@example.com','2017-02-01 18:54:42','2017-02-01 14:54:42',12,NULL,NULL,13,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Sender: MyBigCompany <myemail@mybigcompany.com>
\nReceiver(s): mycustomer@example.com
\nEMail topic: Submission of order CF1007-0001
\nEmail body:
\nYou will find here our order CF1007-0001
\r\n
\r\nSincerely
\n
\nAttached files and documents: CF1007-0001.pdf',1,'order_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(251,NULL,1,'2017-02-01 19:02:21','2017-02-01 19:02:21',40,'AC_OTH_AUTO','Invoice SI1702-0001 validated','2017-02-01 19:02:21','2017-02-01 15:02:21',12,NULL,5,13,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Invoice SI1702-0001 validated\nAuthor: admin',20,'invoice_supplier',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(252,NULL,1,'2017-02-12 23:17:04','2017-02-12 23:17:04',40,'AC_OTH_AUTO','Patient créé','2017-02-12 23:17:04','2017-02-12 19:17:04',12,NULL,NULL,26,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Patient créé\nAuthor: admin',26,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(253,NULL,1,'2017-02-12 23:18:33','2017-02-12 23:18:33',40,'AC_OTH_AUTO','Consultation 2 recorded (aaa)','2017-02-12 23:18:33','2017-02-12 19:18:33',12,NULL,NULL,NULL,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Consultation 2 recorded (aaa)\nAuthor: admin',2,'cabinetmed_cons',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(254,NULL,1,'2017-02-15 23:28:41','2017-02-15 23:28:41',40,'AC_OTH_AUTO','Order CO7001-0005 validated','2017-02-15 23:28:41','2017-02-15 22:28:41',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0005 validated\nAuthor: admin',7,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(255,NULL,1,'2017-02-15 23:28:56','2017-02-15 23:28:56',40,'AC_OTH_AUTO','Order CO7001-0006 validated','2017-02-15 23:28:56','2017-02-15 22:28:56',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0006 validated\nAuthor: admin',8,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(256,NULL,1,'2017-02-15 23:34:33','2017-02-15 23:34:33',40,'AC_OTH_AUTO','Order CO7001-0007 validated','2017-02-15 23:34:33','2017-02-15 22:34:33',12,NULL,NULL,3,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0007 validated\nAuthor: admin',9,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(257,NULL,1,'2017-02-15 23:35:03','2017-02-15 23:35:03',40,'AC_OTH_AUTO','Order CO7001-0008 validated','2017-02-15 23:35:03','2017-02-15 22:35:03',12,NULL,NULL,3,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0008 validated\nAuthor: admin',10,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(263,NULL,1,'2017-02-15 23:50:34','2017-02-15 23:50:34',40,'AC_OTH_AUTO','Order CO7001-0005 validated','2017-02-15 23:50:34','2017-02-15 22:50:34',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0005 validated\nAuthor: admin',17,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(264,NULL,1,'2017-02-15 23:51:23','2017-02-15 23:51:23',40,'AC_OTH_AUTO','Order CO7001-0006 validated','2017-02-15 23:51:23','2017-02-15 22:51:23',12,NULL,NULL,7,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0006 validated\nAuthor: admin',18,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(265,NULL,1,'2017-02-15 23:54:51','2017-02-15 23:54:51',40,'AC_OTH_AUTO','Order CO7001-0007 validated','2017-02-15 23:54:51','2017-02-15 22:54:51',12,NULL,NULL,17,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0007 validated\nAuthor: admin',19,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(266,NULL,1,'2017-02-15 23:55:52','2017-02-15 23:55:52',40,'AC_OTH_AUTO','Order CO7001-0007 validated','2017-02-15 23:55:52','2017-02-15 22:55:52',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0007 validated\nAuthor: admin',20,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(267,NULL,1,'2017-02-16 00:03:44','2017-02-16 00:03:44',40,'AC_OTH_AUTO','Order CO7001-0008 validated','2017-02-16 00:03:44','2017-02-15 23:03:44',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0008 validated\nAuthor: admin',29,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(268,NULL,1,'2017-02-16 00:05:01','2017-02-16 00:05:01',40,'AC_OTH_AUTO','Order CO7001-0009 validated','2017-02-16 00:05:01','2017-02-15 23:05:01',12,NULL,NULL,11,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0009 validated\nAuthor: admin',34,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(269,NULL,1,'2017-02-16 00:05:01','2017-02-16 00:05:01',40,'AC_OTH_AUTO','Order CO7001-0010 validated','2017-02-16 00:05:01','2017-02-15 23:05:01',12,NULL,NULL,3,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0010 validated\nAuthor: admin',38,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(270,NULL,1,'2017-02-16 00:05:11','2017-02-16 00:05:11',40,'AC_OTH_AUTO','Order CO7001-0011 validated','2017-02-16 00:05:11','2017-02-15 23:05:11',12,NULL,NULL,11,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0011 validated\nAuthor: admin',40,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(271,NULL,1,'2017-02-16 00:05:11','2017-02-16 00:05:11',40,'AC_OTH_AUTO','Order CO7001-0012 validated','2017-02-16 00:05:11','2017-02-15 23:05:11',12,NULL,NULL,10,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0012 validated\nAuthor: admin',43,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(272,NULL,1,'2017-02-16 00:05:11','2017-02-16 00:05:11',40,'AC_OTH_AUTO','Order CO7001-0013 validated','2017-02-16 00:05:11','2017-02-15 23:05:11',12,NULL,NULL,1,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0013 validated\nAuthor: admin',47,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(273,NULL,1,'2017-02-16 00:05:11','2017-02-16 00:05:11',40,'AC_OTH_AUTO','Order CO7001-0014 validated','2017-02-16 00:05:11','2017-02-15 23:05:11',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0014 validated\nAuthor: admin',48,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(274,NULL,1,'2017-02-16 00:05:26','2017-02-16 00:05:26',40,'AC_OTH_AUTO','Order CO7001-0015 validated','2017-02-16 00:05:26','2017-02-15 23:05:26',12,NULL,NULL,1,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0015 validated\nAuthor: admin',50,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(275,NULL,1,'2017-02-16 00:05:26','2017-02-16 00:05:26',40,'AC_OTH_AUTO','Order CO7001-0016 validated','2017-02-16 00:05:26','2017-02-15 23:05:26',12,NULL,NULL,12,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0016 validated\nAuthor: admin',54,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(277,NULL,1,'2017-02-16 00:05:35','2017-02-16 00:05:35',40,'AC_OTH_AUTO','Order CO7001-0018 validated','2017-02-16 00:05:35','2017-02-15 23:05:35',12,NULL,NULL,19,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0018 validated\nAuthor: admin',62,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(278,NULL,1,'2017-02-16 00:05:35','2017-02-16 00:05:35',40,'AC_OTH_AUTO','Order CO7001-0019 validated','2017-02-16 00:05:35','2017-02-15 23:05:35',12,NULL,NULL,3,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0019 validated\nAuthor: admin',68,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(279,NULL,1,'2017-02-16 00:05:36','2017-02-16 00:05:36',40,'AC_OTH_AUTO','Order CO7001-0020 validated','2017-02-16 00:05:36','2017-02-15 23:05:36',12,NULL,NULL,6,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0020 validated\nAuthor: admin',72,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(281,NULL,1,'2017-02-16 00:05:37','2017-02-16 00:05:37',40,'AC_OTH_AUTO','Order CO7001-0022 validated','2017-02-16 00:05:37','2017-02-15 23:05:37',12,NULL,NULL,12,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0022 validated\nAuthor: admin',78,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(282,NULL,1,'2017-02-16 00:05:38','2017-02-16 00:05:38',40,'AC_OTH_AUTO','Order CO7001-0023 validated','2017-02-16 00:05:38','2017-02-15 23:05:38',12,NULL,NULL,11,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0023 validated\nAuthor: admin',81,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(283,NULL,1,'2017-02-16 00:05:38','2017-02-16 00:05:38',40,'AC_OTH_AUTO','Order CO7001-0024 validated','2017-02-16 00:05:38','2017-02-15 23:05:38',12,NULL,NULL,26,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0024 validated\nAuthor: admin',83,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(284,NULL,1,'2017-02-16 00:05:38','2017-02-16 00:05:38',40,'AC_OTH_AUTO','Order CO7001-0025 validated','2017-02-16 00:05:38','2017-02-15 23:05:38',12,NULL,NULL,2,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0025 validated\nAuthor: admin',84,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(285,NULL,1,'2017-02-16 00:05:38','2017-02-16 00:05:38',40,'AC_OTH_AUTO','Order CO7001-0026 validated','2017-02-16 00:05:38','2017-02-15 23:05:38',12,NULL,NULL,1,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0026 validated\nAuthor: admin',85,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(286,NULL,1,'2017-02-16 00:05:38','2017-02-16 00:05:38',40,'AC_OTH_AUTO','Order CO7001-0027 validated','2017-02-16 00:05:38','2017-02-15 23:05:38',12,NULL,NULL,10,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Order CO7001-0027 validated\nAuthor: admin',88,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(287,NULL,1,'2017-02-16 03:05:56','2017-02-16 03:05:56',40,'AC_OTH_AUTO','Commande CO7001-0016 classée Livrée','2017-02-16 03:05:56','2017-02-15 23:05:56',12,NULL,NULL,12,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Commande CO7001-0016 classée Livrée\nAuteur: admin',54,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(288,NULL,1,'2017-02-16 03:06:01','2017-02-16 03:06:01',40,'AC_OTH_AUTO','Commande CO7001-0016 classée Facturée','2017-02-16 03:06:01','2017-02-15 23:06:01',12,NULL,NULL,12,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Commande CO7001-0016 classée Facturée\nAuteur: admin',54,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(294,NULL,1,'2017-02-16 03:53:04','2017-02-16 03:53:04',40,'AC_OTH_AUTO','Commande CO7001-0021 validée','2017-02-16 03:53:04','2017-02-15 23:53:04',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Commande CO7001-0021 validée\nAuteur: admin',75,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(295,NULL,1,'2017-02-16 03:58:08','2017-02-16 03:58:08',40,'AC_OTH_AUTO','Expédition SH1702-0002 validée','2017-02-16 03:58:08','2017-02-15 23:58:08',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Expédition SH1702-0002 validée\nAuteur: admin',3,'shipping',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(296,NULL,1,'2017-02-16 04:12:29','2017-02-16 04:12:29',40,'AC_OTH_AUTO','Commande CO7001-0021 validée','2017-02-16 04:12:29','2017-02-16 00:12:29',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Commande CO7001-0021 validée\nAuteur: admin',75,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(297,NULL,1,'2017-02-16 04:14:20','2017-02-16 04:14:20',40,'AC_OTH_AUTO','Commande CO7001-0021 validée','2017-02-16 04:14:20','2017-02-16 00:14:20',12,NULL,NULL,4,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Commande CO7001-0021 validée\nAuteur: admin',75,'order',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(298,NULL,1,'2017-02-16 01:44:58','2017-02-16 01:44:58',40,'AC_OTH_AUTO','Proposal PR1702-0009 validated','2017-02-16 01:44:58','2017-02-16 00:44:58',1,NULL,NULL,1,NULL,0,1,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0009 validated\nAuthor: aeinstein',11,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(299,NULL,1,'2017-02-16 01:45:44','2017-02-16 01:45:44',40,'AC_OTH_AUTO','Proposal PR1702-0010 validated','2017-02-16 01:45:44','2017-02-16 00:45:44',2,NULL,NULL,7,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0010 validated\nAuthor: demo',12,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(300,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0011 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',1,NULL,NULL,26,NULL,0,1,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0011 validated\nAuthor: aeinstein',13,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(301,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0012 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',2,NULL,NULL,3,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0012 validated\nAuthor: demo',14,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(302,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0013 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',2,NULL,NULL,26,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0013 validated\nAuthor: demo',15,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(303,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0014 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',2,NULL,NULL,1,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0014 validated\nAuthor: demo',16,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(304,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0015 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',1,NULL,NULL,1,NULL,0,1,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0015 validated\nAuthor: aeinstein',17,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(305,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0016 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',2,NULL,NULL,26,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0016 validated\nAuthor: demo',18,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(306,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0017 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',2,NULL,NULL,12,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0017 validated\nAuthor: demo',19,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(307,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0018 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',1,NULL,NULL,26,NULL,0,1,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0018 validated\nAuthor: aeinstein',20,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(308,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0019 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',1,NULL,NULL,1,NULL,0,1,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0019 validated\nAuthor: aeinstein',21,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(309,NULL,1,'2017-02-16 01:46:15','2017-02-16 01:46:15',40,'AC_OTH_AUTO','Proposal PR1702-0020 validated','2017-02-16 01:46:15','2017-02-16 00:46:15',1,NULL,NULL,26,NULL,0,1,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0020 validated\nAuthor: aeinstein',22,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(310,NULL,1,'2017-02-16 01:46:17','2017-02-16 01:46:17',40,'AC_OTH_AUTO','Proposal PR1702-0021 validated','2017-02-16 01:46:17','2017-02-16 00:46:17',2,NULL,NULL,12,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0021 validated\nAuthor: demo',23,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(311,NULL,1,'2017-02-16 01:46:17','2017-02-16 01:46:17',40,'AC_OTH_AUTO','Proposal PR1702-0022 validated','2017-02-16 01:46:17','2017-02-16 00:46:17',2,NULL,NULL,7,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0022 validated\nAuthor: demo',24,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(312,NULL,1,'2017-02-16 01:46:17','2017-02-16 01:46:17',40,'AC_OTH_AUTO','Proposal PR1702-0023 validated','2017-02-16 01:46:17','2017-02-16 00:46:17',1,NULL,NULL,3,NULL,0,1,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0023 validated\nAuthor: aeinstein',25,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(313,NULL,1,'2017-02-16 01:46:18','2017-02-16 01:46:18',40,'AC_OTH_AUTO','Proposal PR1702-0024 validated','2017-02-16 01:46:18','2017-02-16 00:46:18',2,NULL,NULL,1,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0024 validated\nAuthor: demo',26,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(314,NULL,1,'2017-02-16 01:46:18','2017-02-16 01:46:18',40,'AC_OTH_AUTO','Proposal PR1702-0025 validated','2017-02-16 01:46:18','2017-02-16 00:46:18',1,NULL,NULL,6,NULL,0,1,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0025 validated\nAuthor: aeinstein',27,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(315,NULL,1,'2017-02-16 01:46:18','2017-02-16 01:46:18',40,'AC_OTH_AUTO','Proposal PR1702-0026 validated','2017-02-16 01:46:18','2017-02-16 00:46:18',2,NULL,NULL,19,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0026 validated\nAuthor: demo',28,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(316,NULL,1,'2017-02-16 01:46:18','2017-02-16 01:46:18',40,'AC_OTH_AUTO','Proposal PR1702-0027 validated','2017-02-16 01:46:18','2017-02-16 00:46:18',2,NULL,NULL,1,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0027 validated\nAuthor: demo',29,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(317,NULL,1,'2017-02-16 01:46:18','2017-02-16 01:46:18',40,'AC_OTH_AUTO','Proposal PR1702-0028 validated','2017-02-16 01:46:18','2017-02-16 00:46:18',2,NULL,NULL,1,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0028 validated\nAuthor: demo',30,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(318,NULL,1,'2017-02-16 01:46:18','2017-02-16 01:46:18',40,'AC_OTH_AUTO','Proposal PR1702-0029 validated','2017-02-16 01:46:18','2017-02-16 00:46:18',1,NULL,NULL,11,NULL,0,1,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0029 validated\nAuthor: aeinstein',31,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(319,NULL,1,'2017-02-16 01:46:18','2017-02-16 01:46:18',40,'AC_OTH_AUTO','Proposal PR1702-0030 validated','2017-02-16 01:46:18','2017-02-16 00:46:18',2,NULL,NULL,19,NULL,0,2,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposal PR1702-0030 validated\nAuthor: demo',32,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(320,NULL,1,'2017-02-16 04:46:31','2017-02-16 04:46:31',40,'AC_OTH_AUTO','Proposition PR1702-0026 signée','2017-02-16 04:46:31','2017-02-16 00:46:31',12,NULL,NULL,19,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposition PR1702-0026 signée\nAuteur: admin',28,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(321,NULL,1,'2017-02-16 04:46:37','2017-02-16 04:46:37',40,'AC_OTH_AUTO','Proposition PR1702-0027 signée','2017-02-16 04:46:37','2017-02-16 00:46:37',12,NULL,NULL,1,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposition PR1702-0027 signée\nAuteur: admin',29,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(322,NULL,1,'2017-02-16 04:46:42','2017-02-16 04:46:42',40,'AC_OTH_AUTO','Proposition PR1702-0028 refusée','2017-02-16 04:46:42','2017-02-16 00:46:42',12,NULL,NULL,1,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposition PR1702-0028 refusée\nAuteur: admin',30,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(323,NULL,1,'2017-02-16 04:47:09','2017-02-16 04:47:09',40,'AC_OTH_AUTO','Proposition PR1702-0019 validée','2017-02-16 04:47:09','2017-02-16 00:47:09',12,NULL,NULL,1,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposition PR1702-0019 validée\nAuteur: admin',21,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(324,NULL,1,'2017-02-16 04:47:25','2017-02-16 04:47:25',40,'AC_OTH_AUTO','Proposition PR1702-0023 signée','2017-02-16 04:47:25','2017-02-16 00:47:25',12,NULL,NULL,3,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposition PR1702-0023 signée\nAuteur: admin',25,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(325,NULL,1,'2017-02-16 04:47:29','2017-02-16 04:47:29',40,'AC_OTH_AUTO','Proposition PR1702-0023 classée payée','2017-02-16 04:47:29','2017-02-16 00:47:29',12,NULL,NULL,3,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposition PR1702-0023 classée payée\nAuteur: admin',25,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(326,NULL,1,'2017-02-17 16:07:18','2017-02-17 16:07:18',40,'AC_OTH_AUTO','Proposition PR1702-0021 validée','2017-02-17 16:07:18','2017-02-17 12:07:18',12,NULL,NULL,12,NULL,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Proposition PR1702-0021 validée\nAuteur: admin',23,'propal',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(327,NULL,1,'2017-05-12 13:53:44','2017-05-12 13:53:44',40,'AC_OTH_AUTO','Email sent by MyBigCompany To Einstein','2017-05-12 13:53:44','2017-05-12 09:53:44',12,NULL,NULL,11,12,0,12,0,NULL,0,0,1,-1,'',NULL,NULL,'Sender: MyBigCompany <myemail@mybigcompany.com>
\nReceiver(s): Einstein <genius@example.com>
\nBcc: Einstein <genius@example.com>
\nEMail topic: Test
\nEmail body:
\nTest\nAuthor: admin',11,'societe',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL); /*!40000 ALTER TABLE `llx_actioncomm` ENABLE KEYS */; UNLOCK TABLES; @@ -293,7 +293,7 @@ CREATE TABLE `llx_actioncomm_resources` ( PRIMARY KEY (`rowid`), UNIQUE KEY `uk_actioncomm_resources` (`fk_actioncomm`,`element_type`,`fk_element`), KEY `idx_actioncomm_resources_fk_element` (`fk_element`) -) ENGINE=InnoDB AUTO_INCREMENT=210 DEFAULT CHARSET=latin1; +) ENGINE=InnoDB AUTO_INCREMENT=211 DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -302,7 +302,7 @@ CREATE TABLE `llx_actioncomm_resources` ( LOCK TABLES `llx_actioncomm_resources` WRITE; /*!40000 ALTER TABLE `llx_actioncomm_resources` DISABLE KEYS */; -INSERT INTO `llx_actioncomm_resources` VALUES (1,1,'user',1,NULL,NULL,1),(2,2,'user',1,NULL,NULL,1),(3,3,'user',1,NULL,NULL,1),(4,4,'user',1,NULL,NULL,1),(5,5,'user',1,NULL,NULL,1),(6,6,'user',1,NULL,NULL,1),(7,7,'user',1,NULL,NULL,1),(8,8,'user',1,NULL,NULL,1),(9,9,'user',1,NULL,NULL,1),(10,10,'user',1,NULL,NULL,1),(11,11,'user',1,NULL,NULL,1),(12,12,'user',1,NULL,NULL,1),(13,13,'user',1,NULL,NULL,1),(14,14,'user',1,NULL,NULL,1),(15,15,'user',1,NULL,NULL,1),(16,16,'user',1,NULL,NULL,1),(17,17,'user',1,NULL,NULL,1),(18,18,'user',1,NULL,NULL,1),(19,19,'user',1,NULL,NULL,1),(20,20,'user',1,NULL,NULL,1),(21,21,'user',1,NULL,NULL,1),(22,22,'user',1,NULL,NULL,1),(23,23,'user',1,NULL,NULL,1),(24,24,'user',1,NULL,NULL,1),(25,25,'user',1,NULL,NULL,1),(26,26,'user',1,NULL,NULL,1),(27,27,'user',1,NULL,NULL,1),(28,28,'user',1,NULL,NULL,1),(29,29,'user',1,NULL,NULL,1),(30,30,'user',1,NULL,NULL,1),(31,31,'user',1,NULL,NULL,1),(32,38,'user',1,NULL,NULL,1),(33,40,'user',1,NULL,NULL,1),(34,41,'user',1,NULL,NULL,1),(35,42,'user',1,NULL,NULL,1),(36,43,'user',1,NULL,NULL,1),(37,44,'user',1,NULL,NULL,1),(38,45,'user',1,NULL,NULL,1),(39,46,'user',1,NULL,NULL,1),(40,47,'user',1,NULL,NULL,1),(41,48,'user',1,NULL,NULL,1),(42,49,'user',1,NULL,NULL,1),(43,50,'user',1,NULL,NULL,1),(44,51,'user',1,NULL,NULL,1),(45,52,'user',1,NULL,NULL,1),(46,53,'user',1,NULL,NULL,1),(47,54,'user',1,NULL,NULL,1),(48,55,'user',1,NULL,NULL,1),(49,56,'user',1,NULL,NULL,1),(50,121,'user',3,NULL,NULL,1),(51,122,'user',1,NULL,NULL,1),(52,123,'user',1,NULL,NULL,1),(53,124,'user',1,NULL,NULL,1),(54,125,'user',1,NULL,NULL,1),(55,127,'user',1,NULL,NULL,1),(56,128,'user',1,NULL,NULL,1),(57,129,'user',1,NULL,NULL,1),(58,130,'user',1,NULL,NULL,1),(59,131,'user',1,NULL,NULL,1),(60,132,'user',1,NULL,NULL,1),(61,133,'user',1,NULL,NULL,1),(62,134,'user',1,NULL,NULL,1),(63,135,'user',1,NULL,NULL,1),(64,136,'user',1,NULL,NULL,1),(65,137,'user',1,NULL,NULL,1),(66,138,'user',1,NULL,NULL,1),(67,139,'user',1,NULL,NULL,1),(68,140,'user',1,NULL,NULL,1),(69,141,'user',1,NULL,NULL,1),(70,142,'user',1,NULL,NULL,1),(71,143,'user',1,NULL,NULL,1),(72,144,'user',1,NULL,NULL,1),(73,145,'user',1,NULL,NULL,1),(74,146,'user',1,NULL,NULL,1),(75,147,'user',1,NULL,NULL,1),(76,148,'user',1,NULL,NULL,1),(77,149,'user',1,NULL,NULL,1),(78,150,'user',1,NULL,NULL,1),(79,151,'user',1,NULL,NULL,1),(80,152,'user',1,NULL,NULL,1),(81,203,'user',1,NULL,NULL,1),(82,204,'user',1,NULL,NULL,1),(83,205,'user',1,NULL,NULL,1),(84,206,'user',1,NULL,NULL,1),(85,207,'user',1,NULL,NULL,1),(86,208,'user',1,NULL,NULL,1),(87,209,'user',1,NULL,NULL,1),(88,210,'user',1,NULL,NULL,1),(89,211,'user',1,NULL,NULL,1),(90,212,'user',1,NULL,NULL,1),(91,213,'user',1,NULL,NULL,1),(92,214,'user',1,NULL,NULL,1),(93,215,'user',1,NULL,NULL,1),(94,216,'user',1,NULL,NULL,1),(95,217,'user',1,NULL,NULL,1),(96,218,'user',1,NULL,NULL,1),(97,219,'user',1,NULL,NULL,1),(98,220,'user',1,NULL,NULL,1),(99,221,'user',1,NULL,NULL,1),(100,222,'user',1,NULL,NULL,1),(101,223,'user',1,NULL,NULL,1),(102,224,'user',1,NULL,NULL,1),(103,225,'user',1,NULL,NULL,1),(104,226,'user',1,NULL,NULL,1),(105,227,'user',1,NULL,NULL,1),(106,228,'user',1,NULL,NULL,1),(107,229,'user',1,NULL,NULL,1),(108,230,'user',1,NULL,NULL,1),(109,231,'user',1,NULL,NULL,1),(110,232,'user',12,'0',0,0),(111,233,'user',12,'0',0,0),(112,234,'user',12,'0',0,1),(113,235,'user',12,'0',0,1),(114,236,'user',4,'0',0,0),(115,237,'user',13,'0',0,0),(116,237,'user',16,'0',0,0),(117,237,'user',18,'0',0,0),(118,238,'user',12,'0',0,1),(119,238,'user',3,'0',0,1),(120,238,'user',10,'0',0,1),(121,239,'user',12,'0',0,0),(123,240,'user',12,'0',0,1),(125,242,'user',12,'0',0,0),(126,243,'user',12,'0',0,0),(128,245,'user',12,'0',0,0),(132,249,'user',12,'0',0,0),(133,250,'user',12,'0',0,0),(134,251,'user',12,'0',0,0),(135,252,'user',12,'0',0,0),(136,253,'user',12,'0',0,0),(137,254,'user',12,'0',0,0),(138,255,'user',12,'0',0,0),(139,256,'user',12,'0',0,0),(140,257,'user',12,'0',0,0),(146,263,'user',12,'0',0,0),(147,264,'user',12,'0',0,0),(148,265,'user',12,'0',0,0),(149,266,'user',12,'0',0,0),(150,267,'user',12,'0',0,0),(151,268,'user',12,'0',0,0),(152,269,'user',12,'0',0,0),(153,270,'user',12,'0',0,0),(154,271,'user',12,'0',0,0),(155,272,'user',12,'0',0,0),(156,273,'user',12,'0',0,0),(157,274,'user',12,'0',0,0),(158,275,'user',12,'0',0,0),(160,277,'user',12,'0',0,0),(161,278,'user',12,'0',0,0),(162,279,'user',12,'0',0,0),(164,281,'user',12,'0',0,0),(165,282,'user',12,'0',0,0),(166,283,'user',12,'0',0,0),(167,284,'user',12,'0',0,0),(168,285,'user',12,'0',0,0),(169,286,'user',12,'0',0,0),(170,287,'user',12,'0',0,0),(171,288,'user',12,'0',0,0),(177,294,'user',12,'0',0,0),(178,295,'user',12,'0',0,0),(179,296,'user',12,'0',0,0),(180,297,'user',12,'0',0,0),(181,298,'user',1,'0',0,0),(182,299,'user',2,'0',0,0),(183,300,'user',1,'0',0,0),(184,301,'user',2,'0',0,0),(185,302,'user',2,'0',0,0),(186,303,'user',2,'0',0,0),(187,304,'user',1,'0',0,0),(188,305,'user',2,'0',0,0),(189,306,'user',2,'0',0,0),(190,307,'user',1,'0',0,0),(191,308,'user',1,'0',0,0),(192,309,'user',1,'0',0,0),(193,310,'user',2,'0',0,0),(194,311,'user',2,'0',0,0),(195,312,'user',1,'0',0,0),(196,313,'user',2,'0',0,0),(197,314,'user',1,'0',0,0),(198,315,'user',2,'0',0,0),(199,316,'user',2,'0',0,0),(200,317,'user',2,'0',0,0),(201,318,'user',1,'0',0,0),(202,319,'user',2,'0',0,0),(203,320,'user',12,'0',0,0),(204,321,'user',12,'0',0,0),(205,322,'user',12,'0',0,0),(206,323,'user',12,'0',0,0),(207,324,'user',12,'0',0,0),(208,325,'user',12,'0',0,0),(209,326,'user',12,'0',0,0); +INSERT INTO `llx_actioncomm_resources` VALUES (1,1,'user',1,NULL,NULL,1),(2,2,'user',1,NULL,NULL,1),(3,3,'user',1,NULL,NULL,1),(4,4,'user',1,NULL,NULL,1),(5,5,'user',1,NULL,NULL,1),(6,6,'user',1,NULL,NULL,1),(7,7,'user',1,NULL,NULL,1),(8,8,'user',1,NULL,NULL,1),(9,9,'user',1,NULL,NULL,1),(10,10,'user',1,NULL,NULL,1),(11,11,'user',1,NULL,NULL,1),(12,12,'user',1,NULL,NULL,1),(13,13,'user',1,NULL,NULL,1),(14,14,'user',1,NULL,NULL,1),(15,15,'user',1,NULL,NULL,1),(16,16,'user',1,NULL,NULL,1),(17,17,'user',1,NULL,NULL,1),(18,18,'user',1,NULL,NULL,1),(19,19,'user',1,NULL,NULL,1),(20,20,'user',1,NULL,NULL,1),(21,21,'user',1,NULL,NULL,1),(22,22,'user',1,NULL,NULL,1),(23,23,'user',1,NULL,NULL,1),(24,24,'user',1,NULL,NULL,1),(25,25,'user',1,NULL,NULL,1),(26,26,'user',1,NULL,NULL,1),(27,27,'user',1,NULL,NULL,1),(28,28,'user',1,NULL,NULL,1),(29,29,'user',1,NULL,NULL,1),(30,30,'user',1,NULL,NULL,1),(31,31,'user',1,NULL,NULL,1),(32,38,'user',1,NULL,NULL,1),(33,40,'user',1,NULL,NULL,1),(34,41,'user',1,NULL,NULL,1),(35,42,'user',1,NULL,NULL,1),(36,43,'user',1,NULL,NULL,1),(37,44,'user',1,NULL,NULL,1),(38,45,'user',1,NULL,NULL,1),(39,46,'user',1,NULL,NULL,1),(40,47,'user',1,NULL,NULL,1),(41,48,'user',1,NULL,NULL,1),(42,49,'user',1,NULL,NULL,1),(43,50,'user',1,NULL,NULL,1),(44,51,'user',1,NULL,NULL,1),(45,52,'user',1,NULL,NULL,1),(46,53,'user',1,NULL,NULL,1),(47,54,'user',1,NULL,NULL,1),(48,55,'user',1,NULL,NULL,1),(49,56,'user',1,NULL,NULL,1),(50,121,'user',3,NULL,NULL,1),(51,122,'user',1,NULL,NULL,1),(52,123,'user',1,NULL,NULL,1),(53,124,'user',1,NULL,NULL,1),(54,125,'user',1,NULL,NULL,1),(55,127,'user',1,NULL,NULL,1),(56,128,'user',1,NULL,NULL,1),(57,129,'user',1,NULL,NULL,1),(58,130,'user',1,NULL,NULL,1),(59,131,'user',1,NULL,NULL,1),(60,132,'user',1,NULL,NULL,1),(61,133,'user',1,NULL,NULL,1),(62,134,'user',1,NULL,NULL,1),(63,135,'user',1,NULL,NULL,1),(64,136,'user',1,NULL,NULL,1),(65,137,'user',1,NULL,NULL,1),(66,138,'user',1,NULL,NULL,1),(67,139,'user',1,NULL,NULL,1),(68,140,'user',1,NULL,NULL,1),(69,141,'user',1,NULL,NULL,1),(70,142,'user',1,NULL,NULL,1),(71,143,'user',1,NULL,NULL,1),(72,144,'user',1,NULL,NULL,1),(73,145,'user',1,NULL,NULL,1),(74,146,'user',1,NULL,NULL,1),(75,147,'user',1,NULL,NULL,1),(76,148,'user',1,NULL,NULL,1),(77,149,'user',1,NULL,NULL,1),(78,150,'user',1,NULL,NULL,1),(79,151,'user',1,NULL,NULL,1),(80,152,'user',1,NULL,NULL,1),(81,203,'user',1,NULL,NULL,1),(82,204,'user',1,NULL,NULL,1),(83,205,'user',1,NULL,NULL,1),(84,206,'user',1,NULL,NULL,1),(85,207,'user',1,NULL,NULL,1),(86,208,'user',1,NULL,NULL,1),(87,209,'user',1,NULL,NULL,1),(88,210,'user',1,NULL,NULL,1),(89,211,'user',1,NULL,NULL,1),(90,212,'user',1,NULL,NULL,1),(91,213,'user',1,NULL,NULL,1),(92,214,'user',1,NULL,NULL,1),(93,215,'user',1,NULL,NULL,1),(94,216,'user',1,NULL,NULL,1),(95,217,'user',1,NULL,NULL,1),(96,218,'user',1,NULL,NULL,1),(97,219,'user',1,NULL,NULL,1),(98,220,'user',1,NULL,NULL,1),(99,221,'user',1,NULL,NULL,1),(100,222,'user',1,NULL,NULL,1),(101,223,'user',1,NULL,NULL,1),(102,224,'user',1,NULL,NULL,1),(103,225,'user',1,NULL,NULL,1),(104,226,'user',1,NULL,NULL,1),(105,227,'user',1,NULL,NULL,1),(106,228,'user',1,NULL,NULL,1),(107,229,'user',1,NULL,NULL,1),(108,230,'user',1,NULL,NULL,1),(109,231,'user',1,NULL,NULL,1),(110,232,'user',12,'0',0,0),(111,233,'user',12,'0',0,0),(112,234,'user',12,'0',0,1),(113,235,'user',12,'0',0,1),(114,236,'user',4,'0',0,0),(115,237,'user',13,'0',0,0),(116,237,'user',16,'0',0,0),(117,237,'user',18,'0',0,0),(118,238,'user',12,'0',0,1),(119,238,'user',3,'0',0,1),(120,238,'user',10,'0',0,1),(121,239,'user',12,'0',0,0),(123,240,'user',12,'0',0,1),(125,242,'user',12,'0',0,0),(126,243,'user',12,'0',0,0),(128,245,'user',12,'0',0,0),(132,249,'user',12,'0',0,0),(133,250,'user',12,'0',0,0),(134,251,'user',12,'0',0,0),(135,252,'user',12,'0',0,0),(136,253,'user',12,'0',0,0),(137,254,'user',12,'0',0,0),(138,255,'user',12,'0',0,0),(139,256,'user',12,'0',0,0),(140,257,'user',12,'0',0,0),(146,263,'user',12,'0',0,0),(147,264,'user',12,'0',0,0),(148,265,'user',12,'0',0,0),(149,266,'user',12,'0',0,0),(150,267,'user',12,'0',0,0),(151,268,'user',12,'0',0,0),(152,269,'user',12,'0',0,0),(153,270,'user',12,'0',0,0),(154,271,'user',12,'0',0,0),(155,272,'user',12,'0',0,0),(156,273,'user',12,'0',0,0),(157,274,'user',12,'0',0,0),(158,275,'user',12,'0',0,0),(160,277,'user',12,'0',0,0),(161,278,'user',12,'0',0,0),(162,279,'user',12,'0',0,0),(164,281,'user',12,'0',0,0),(165,282,'user',12,'0',0,0),(166,283,'user',12,'0',0,0),(167,284,'user',12,'0',0,0),(168,285,'user',12,'0',0,0),(169,286,'user',12,'0',0,0),(170,287,'user',12,'0',0,0),(171,288,'user',12,'0',0,0),(177,294,'user',12,'0',0,0),(178,295,'user',12,'0',0,0),(179,296,'user',12,'0',0,0),(180,297,'user',12,'0',0,0),(181,298,'user',1,'0',0,0),(182,299,'user',2,'0',0,0),(183,300,'user',1,'0',0,0),(184,301,'user',2,'0',0,0),(185,302,'user',2,'0',0,0),(186,303,'user',2,'0',0,0),(187,304,'user',1,'0',0,0),(188,305,'user',2,'0',0,0),(189,306,'user',2,'0',0,0),(190,307,'user',1,'0',0,0),(191,308,'user',1,'0',0,0),(192,309,'user',1,'0',0,0),(193,310,'user',2,'0',0,0),(194,311,'user',2,'0',0,0),(195,312,'user',1,'0',0,0),(196,313,'user',2,'0',0,0),(197,314,'user',1,'0',0,0),(198,315,'user',2,'0',0,0),(199,316,'user',2,'0',0,0),(200,317,'user',2,'0',0,0),(201,318,'user',1,'0',0,0),(202,319,'user',2,'0',0,0),(203,320,'user',12,'0',0,0),(204,321,'user',12,'0',0,0),(205,322,'user',12,'0',0,0),(206,323,'user',12,'0',0,0),(207,324,'user',12,'0',0,0),(208,325,'user',12,'0',0,0),(209,326,'user',12,'0',0,0),(210,327,'user',12,'0',0,0); /*!40000 ALTER TABLE `llx_actioncomm_resources` ENABLE KEYS */; UNLOCK TABLES; @@ -581,6 +581,7 @@ CREATE TABLE `llx_bank_account` ( `note_public` text, `model_pdf` varchar(255) DEFAULT NULL, `import_key` varchar(14) DEFAULT NULL, + `extraparams` varchar(255) DEFAULT NULL, PRIMARY KEY (`rowid`), UNIQUE KEY `uk_bank_account_label` (`label`,`entity`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8; @@ -592,7 +593,7 @@ CREATE TABLE `llx_bank_account` ( LOCK TABLES `llx_bank_account` WRITE; /*!40000 ALTER TABLE `llx_bank_account` DISABLE KEYS */; -INSERT INTO `llx_bank_account` VALUES (1,'2010-07-08 23:56:14','2016-07-30 14:45:12','SWIBAC','Swiss bank account',1,'Switz Gold Bank','','','123456789','','','NL39RABO0314043352',NULL,NULL,'21 jum street',NULL,6,'Mac Golder','11 big road,\r\nZurich',1,0,1,NULL,'','','EUR',1500,1500,'',NULL,NULL,NULL,NULL,NULL),(2,'2010-07-09 00:00:24','2016-07-30 15:17:18','SWIBAC2','Swiss bank account old',1,'Switz Silver Bank','','','','','','NL07SNSB0908534915',NULL,NULL,'Road bankrupt\r\nZurich',NULL,6,'','',1,1,1,NULL,'','','EUR',200,400,'',NULL,NULL,NULL,NULL,NULL),(3,'2010-07-10 13:33:42','2010-07-10 11:33:42','ACCOUNTCASH','Account for cash',1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'3',1,NULL,NULL,2,0,1,NULL,'',NULL,'EUR',0,0,'
',NULL,NULL,NULL,NULL,NULL),(4,'2016-07-30 18:42:14','2016-07-30 14:44:45','LUXBAC','Luxemburg Bank Account',1,'Lux Platinuium Bank','','','','','','NL46INGB0687674581',NULL,NULL,'',NULL,140,'','',1,0,1,NULL,'','','EUR',NULL,NULL,'',NULL,NULL,NULL,NULL,NULL); +INSERT INTO `llx_bank_account` VALUES (1,'2010-07-08 23:56:14','2016-07-30 14:45:12','SWIBAC','Swiss bank account',1,'Switz Gold Bank','','','123456789','','','NL39RABO0314043352',NULL,NULL,'21 jum street',NULL,6,'Mac Golder','11 big road,\r\nZurich',1,0,1,NULL,'','','EUR',1500,1500,'',NULL,NULL,NULL,NULL,NULL,NULL),(2,'2010-07-09 00:00:24','2016-07-30 15:17:18','SWIBAC2','Swiss bank account old',1,'Switz Silver Bank','','','','','','NL07SNSB0908534915',NULL,NULL,'Road bankrupt\r\nZurich',NULL,6,'','',1,1,1,NULL,'','','EUR',200,400,'',NULL,NULL,NULL,NULL,NULL,NULL),(3,'2010-07-10 13:33:42','2010-07-10 11:33:42','ACCOUNTCASH','Account for cash',1,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,'3',1,NULL,NULL,2,0,1,NULL,'',NULL,'EUR',0,0,'
',NULL,NULL,NULL,NULL,NULL,NULL),(4,'2016-07-30 18:42:14','2016-07-30 14:44:45','LUXBAC','Luxemburg Bank Account',1,'Lux Platinuium Bank','','','','','','NL46INGB0687674581',NULL,NULL,'',NULL,140,'','',1,0,1,NULL,'','','EUR',NULL,NULL,'',NULL,NULL,NULL,NULL,NULL,NULL); /*!40000 ALTER TABLE `llx_bank_account` ENABLE KEYS */; UNLOCK TABLES; @@ -799,7 +800,7 @@ CREATE TABLE `llx_boxes` ( LOCK TABLES `llx_boxes` WRITE; /*!40000 ALTER TABLE `llx_boxes` DISABLE KEYS */; -INSERT INTO `llx_boxes` VALUES (253,2,323,0,'0',0,NULL,NULL),(304,2,324,0,'0',0,NULL,NULL),(305,2,325,0,'0',0,NULL,NULL),(306,2,326,0,'0',0,NULL,NULL),(307,2,327,0,'0',0,NULL,NULL),(308,2,328,0,'0',0,NULL,NULL),(309,2,329,0,'0',0,NULL,NULL),(310,2,330,0,'0',0,NULL,NULL),(311,2,331,0,'0',0,NULL,NULL),(312,2,332,0,'0',0,NULL,NULL),(313,2,333,0,'0',0,NULL,NULL),(314,1,347,0,'A01',0,NULL,NULL),(315,1,348,0,'B18',0,NULL,NULL),(316,1,349,0,'A19',0,NULL,NULL),(317,1,350,0,'B20',0,NULL,NULL),(344,1,374,0,'A21',0,NULL,NULL),(347,1,377,0,'B22',0,NULL,NULL),(348,1,378,0,'A23',0,NULL,NULL),(349,1,379,0,'B24',0,NULL,NULL),(358,1,388,0,'A25',0,NULL,NULL),(359,1,389,0,'B26',0,NULL,NULL),(360,1,390,0,'A27',0,NULL,NULL),(361,1,391,0,'B28',0,NULL,NULL),(362,1,392,0,'A29',0,NULL,NULL),(363,1,393,0,'B30',0,NULL,NULL),(366,1,396,0,'A17',0,NULL,NULL),(387,1,403,0,'B16',0,NULL,NULL),(392,1,409,0,'A15',0,NULL,NULL),(393,1,410,0,'B02',0,NULL,NULL),(394,1,411,0,'A03',0,NULL,NULL),(395,1,412,0,'B04',0,NULL,NULL),(396,1,413,0,'A05',0,NULL,NULL),(397,1,414,0,'B06',0,NULL,NULL),(398,1,415,0,'A07',0,NULL,NULL),(399,1,416,0,'B08',0,NULL,NULL),(400,1,417,0,'A09',0,NULL,NULL),(401,1,418,0,'B10',0,NULL,NULL),(501,1,419,0,'A11',0,NULL,NULL),(1019,1,392,0,'A01',2,NULL,NULL),(1021,1,412,0,'A03',2,NULL,NULL),(1022,1,347,0,'A04',2,NULL,NULL),(1023,1,393,0,'A05',2,NULL,NULL),(1025,1,389,0,'A07',2,NULL,NULL),(1026,1,416,0,'A08',2,NULL,NULL),(1027,1,396,0,'B01',2,NULL,NULL),(1028,1,377,0,'B02',2,NULL,NULL),(1029,1,379,0,'B03',2,NULL,NULL),(1031,1,419,0,'B05',2,NULL,NULL),(1036,1,424,0,'0',0,NULL,NULL),(1037,1,425,0,'0',0,NULL,NULL),(1038,1,426,0,'0',0,NULL,NULL),(1039,1,427,0,'0',0,NULL,NULL),(1115,1,412,0,'A01',12,NULL,NULL),(1116,1,392,0,'A02',12,NULL,NULL),(1117,1,377,0,'A03',12,NULL,NULL),(1118,1,347,0,'A04',12,NULL,NULL),(1119,1,396,0,'B01',12,NULL,NULL); +INSERT INTO `llx_boxes` VALUES (253,2,323,0,'0',0,NULL,NULL),(304,2,324,0,'0',0,NULL,NULL),(305,2,325,0,'0',0,NULL,NULL),(306,2,326,0,'0',0,NULL,NULL),(307,2,327,0,'0',0,NULL,NULL),(308,2,328,0,'0',0,NULL,NULL),(309,2,329,0,'0',0,NULL,NULL),(310,2,330,0,'0',0,NULL,NULL),(311,2,331,0,'0',0,NULL,NULL),(312,2,332,0,'0',0,NULL,NULL),(313,2,333,0,'0',0,NULL,NULL),(314,1,347,0,'A01',0,NULL,NULL),(315,1,348,0,'B18',0,NULL,NULL),(316,1,349,0,'A19',0,NULL,NULL),(317,1,350,0,'B20',0,NULL,NULL),(344,1,374,0,'A21',0,NULL,NULL),(347,1,377,0,'B22',0,NULL,NULL),(348,1,378,0,'A23',0,NULL,NULL),(358,1,388,0,'A25',0,NULL,NULL),(359,1,389,0,'B26',0,NULL,NULL),(360,1,390,0,'A27',0,NULL,NULL),(362,1,392,0,'A29',0,NULL,NULL),(363,1,393,0,'B30',0,NULL,NULL),(366,1,396,0,'A17',0,NULL,NULL),(387,1,403,0,'B16',0,NULL,NULL),(392,1,409,0,'A15',0,NULL,NULL),(393,1,410,0,'B02',0,NULL,NULL),(394,1,411,0,'A03',0,NULL,NULL),(395,1,412,0,'B04',0,NULL,NULL),(396,1,413,0,'A05',0,NULL,NULL),(397,1,414,0,'B06',0,NULL,NULL),(398,1,415,0,'A07',0,NULL,NULL),(399,1,416,0,'B08',0,NULL,NULL),(400,1,417,0,'A09',0,NULL,NULL),(401,1,418,0,'B10',0,NULL,NULL),(501,1,419,0,'A11',0,NULL,NULL),(1019,1,392,0,'A01',2,NULL,NULL),(1021,1,412,0,'A03',2,NULL,NULL),(1022,1,347,0,'A04',2,NULL,NULL),(1023,1,393,0,'A05',2,NULL,NULL),(1025,1,389,0,'A07',2,NULL,NULL),(1026,1,416,0,'A08',2,NULL,NULL),(1027,1,396,0,'B01',2,NULL,NULL),(1028,1,377,0,'B02',2,NULL,NULL),(1031,1,419,0,'B05',2,NULL,NULL),(1036,1,424,0,'0',0,NULL,NULL),(1037,1,425,0,'0',0,NULL,NULL),(1038,1,426,0,'0',0,NULL,NULL),(1039,1,427,0,'0',0,NULL,NULL),(1115,1,412,0,'A01',12,NULL,NULL),(1116,1,392,0,'A02',12,NULL,NULL),(1117,1,377,0,'A03',12,NULL,NULL),(1118,1,347,0,'A04',12,NULL,NULL),(1119,1,396,0,'B01',12,NULL,NULL); /*!40000 ALTER TABLE `llx_boxes` ENABLE KEYS */; UNLOCK TABLES; @@ -827,7 +828,7 @@ CREATE TABLE `llx_boxes_def` ( LOCK TABLES `llx_boxes_def` WRITE; /*!40000 ALTER TABLE `llx_boxes_def` DISABLE KEYS */; -INSERT INTO `llx_boxes_def` VALUES (188,'box_services_vendus.php',1,'2011-08-05 20:40:27',NULL),(323,'box_actions.php',2,'2013-03-13 15:29:19',NULL),(324,'box_clients.php',2,'2013-03-13 20:21:35',NULL),(325,'box_prospect.php',2,'2013-03-13 20:21:35',NULL),(326,'box_contacts.php',2,'2013-03-13 20:21:35',NULL),(327,'box_activity.php',2,'2013-03-13 20:21:35','(WarningUsingThisBoxSlowDown)'),(328,'box_propales.php',2,'2013-03-13 20:32:38',NULL),(329,'box_comptes.php',2,'2013-03-13 20:33:09',NULL),(330,'box_factures_imp.php',2,'2013-03-13 20:33:09',NULL),(331,'box_factures.php',2,'2013-03-13 20:33:09',NULL),(332,'box_produits.php',2,'2013-03-13 20:33:09',NULL),(333,'box_produits_alerte_stock.php',2,'2013-03-13 20:33:09',NULL),(346,'box_googlemaps@google',1,'2013-11-07 00:01:39',NULL),(347,'box_clients.php',1,'2015-11-15 22:05:57',NULL),(348,'box_prospect.php',1,'2015-11-15 22:05:57',NULL),(349,'box_contacts.php',1,'2015-11-15 22:05:57',NULL),(350,'box_activity.php',1,'2015-11-15 22:05:57','(WarningUsingThisBoxSlowDown)'),(374,'box_services_contracts.php',1,'2015-11-15 22:38:37',NULL),(377,'box_project.php',1,'2015-11-15 22:38:44',NULL),(378,'box_task.php',1,'2015-11-15 22:38:44',NULL),(379,'box_members.php',1,'2015-11-15 22:39:17',NULL),(388,'box_contracts.php',1,'2015-11-15 22:39:52',NULL),(389,'box_services_expired.php',1,'2015-11-15 22:39:52',NULL),(390,'box_ficheinter.php',1,'2015-11-15 22:39:56',NULL),(391,'box_bookmarks.php',1,'2015-11-15 22:40:51',NULL),(392,'box_graph_propales_permonth.php',1,'2015-11-15 22:41:47',NULL),(393,'box_propales.php',1,'2015-11-15 22:41:47',NULL),(396,'box_graph_product_distribution.php',1,'2015-11-15 22:41:47',NULL),(403,'box_goodcustomers.php',1,'2016-07-30 11:13:20','(WarningUsingThisBoxSlowDown)'),(404,'box_external_rss.php',1,'2016-07-30 11:15:25','1 (Dolibarr.org News)'),(409,'box_produits.php',1,'2016-07-30 13:38:11',NULL),(410,'box_produits_alerte_stock.php',1,'2016-07-30 13:38:11',NULL),(411,'box_commandes.php',1,'2016-07-30 13:38:11',NULL),(412,'box_graph_orders_permonth.php',1,'2016-07-30 13:38:11',NULL),(413,'box_graph_invoices_supplier_permonth.php',1,'2016-07-30 13:38:11',NULL),(414,'box_graph_orders_supplier_permonth.php',1,'2016-07-30 13:38:11',NULL),(415,'box_fournisseurs.php',1,'2016-07-30 13:38:11',NULL),(416,'box_factures_fourn_imp.php',1,'2016-07-30 13:38:11',NULL),(417,'box_factures_fourn.php',1,'2016-07-30 13:38:11',NULL),(418,'box_supplier_orders.php',1,'2016-07-30 13:38:11',NULL),(419,'box_actions.php',1,'2016-07-30 15:42:32',NULL),(424,'box_factures_imp.php',1,'2017-02-07 18:56:12',NULL),(425,'box_factures.php',1,'2017-02-07 18:56:12',NULL),(426,'box_graph_invoices_permonth.php',1,'2017-02-07 18:56:12',NULL),(427,'box_comptes.php',1,'2017-02-07 18:56:12',NULL); +INSERT INTO `llx_boxes_def` VALUES (188,'box_services_vendus.php',1,'2011-08-05 20:40:27',NULL),(323,'box_actions.php',2,'2013-03-13 15:29:19',NULL),(324,'box_clients.php',2,'2013-03-13 20:21:35',NULL),(325,'box_prospect.php',2,'2013-03-13 20:21:35',NULL),(326,'box_contacts.php',2,'2013-03-13 20:21:35',NULL),(327,'box_activity.php',2,'2013-03-13 20:21:35','(WarningUsingThisBoxSlowDown)'),(328,'box_propales.php',2,'2013-03-13 20:32:38',NULL),(329,'box_comptes.php',2,'2013-03-13 20:33:09',NULL),(330,'box_factures_imp.php',2,'2013-03-13 20:33:09',NULL),(331,'box_factures.php',2,'2013-03-13 20:33:09',NULL),(332,'box_produits.php',2,'2013-03-13 20:33:09',NULL),(333,'box_produits_alerte_stock.php',2,'2013-03-13 20:33:09',NULL),(346,'box_googlemaps@google',1,'2013-11-07 00:01:39',NULL),(347,'box_clients.php',1,'2015-11-15 22:05:57',NULL),(348,'box_prospect.php',1,'2015-11-15 22:05:57',NULL),(349,'box_contacts.php',1,'2015-11-15 22:05:57',NULL),(350,'box_activity.php',1,'2015-11-15 22:05:57','(WarningUsingThisBoxSlowDown)'),(374,'box_services_contracts.php',1,'2015-11-15 22:38:37',NULL),(377,'box_project.php',1,'2015-11-15 22:38:44',NULL),(378,'box_task.php',1,'2015-11-15 22:38:44',NULL),(388,'box_contracts.php',1,'2015-11-15 22:39:52',NULL),(389,'box_services_expired.php',1,'2015-11-15 22:39:52',NULL),(390,'box_ficheinter.php',1,'2015-11-15 22:39:56',NULL),(392,'box_graph_propales_permonth.php',1,'2015-11-15 22:41:47',NULL),(393,'box_propales.php',1,'2015-11-15 22:41:47',NULL),(396,'box_graph_product_distribution.php',1,'2015-11-15 22:41:47',NULL),(403,'box_goodcustomers.php',1,'2016-07-30 11:13:20','(WarningUsingThisBoxSlowDown)'),(404,'box_external_rss.php',1,'2016-07-30 11:15:25','1 (Dolibarr.org News)'),(409,'box_produits.php',1,'2016-07-30 13:38:11',NULL),(410,'box_produits_alerte_stock.php',1,'2016-07-30 13:38:11',NULL),(411,'box_commandes.php',1,'2016-07-30 13:38:11',NULL),(412,'box_graph_orders_permonth.php',1,'2016-07-30 13:38:11',NULL),(413,'box_graph_invoices_supplier_permonth.php',1,'2016-07-30 13:38:11',NULL),(414,'box_graph_orders_supplier_permonth.php',1,'2016-07-30 13:38:11',NULL),(415,'box_fournisseurs.php',1,'2016-07-30 13:38:11',NULL),(416,'box_factures_fourn_imp.php',1,'2016-07-30 13:38:11',NULL),(417,'box_factures_fourn.php',1,'2016-07-30 13:38:11',NULL),(418,'box_supplier_orders.php',1,'2016-07-30 13:38:11',NULL),(419,'box_actions.php',1,'2016-07-30 15:42:32',NULL),(424,'box_factures_imp.php',1,'2017-02-07 18:56:12',NULL),(425,'box_factures.php',1,'2017-02-07 18:56:12',NULL),(426,'box_graph_invoices_permonth.php',1,'2017-02-07 18:56:12',NULL),(427,'box_comptes.php',1,'2017-02-07 18:56:12',NULL); /*!40000 ALTER TABLE `llx_boxes_def` ENABLE KEYS */; UNLOCK TABLES; @@ -1035,7 +1036,7 @@ CREATE TABLE `llx_c_barcode_type` ( `example` varchar(16) NOT NULL, PRIMARY KEY (`rowid`), UNIQUE KEY `uk_c_barcode_type` (`code`,`entity`) -) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -2354,7 +2355,7 @@ CREATE TABLE `llx_categorie_contact` ( LOCK TABLES `llx_categorie_contact` WRITE; /*!40000 ALTER TABLE `llx_categorie_contact` DISABLE KEYS */; -INSERT INTO `llx_categorie_contact` VALUES (18,3,NULL),(18,6,NULL),(19,6,NULL),(26,9,NULL),(27,7,NULL),(27,8,NULL),(27,10,NULL); +INSERT INTO `llx_categorie_contact` VALUES (18,3,NULL),(18,6,NULL),(19,6,NULL),(26,9,NULL),(27,7,NULL),(27,8,NULL),(27,10,NULL),(28,11,NULL); /*!40000 ALTER TABLE `llx_categorie_contact` ENABLE KEYS */; UNLOCK TABLES; @@ -2525,7 +2526,7 @@ CREATE TABLE `llx_categorie_societe` ( LOCK TABLES `llx_categorie_societe` WRITE; /*!40000 ALTER TABLE `llx_categorie_societe` DISABLE KEYS */; -INSERT INTO `llx_categorie_societe` VALUES (2,2,NULL),(2,19,NULL),(12,10,NULL); +INSERT INTO `llx_categorie_societe` VALUES (2,2,NULL),(2,19,NULL),(12,10,NULL),(12,11,NULL),(14,11,NULL); /*!40000 ALTER TABLE `llx_categorie_societe` ENABLE KEYS */; UNLOCK TABLES; @@ -3096,7 +3097,7 @@ CREATE TABLE `llx_const` ( `tms` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`rowid`), UNIQUE KEY `uk_const` (`name`,`entity`) -) ENGINE=InnoDB AUTO_INCREMENT=6092 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=6102 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -3105,7 +3106,7 @@ CREATE TABLE `llx_const` ( LOCK TABLES `llx_const` WRITE; /*!40000 ALTER TABLE `llx_const` DISABLE KEYS */; -INSERT INTO `llx_const` VALUES (8,'MAIN_UPLOAD_DOC',0,'2048','chaine',0,'Max size for file upload (0 means no upload allowed)','2010-07-08 11:17:57'),(9,'MAIN_SEARCHFORM_SOCIETE',0,'1','yesno',0,'Show form for quick company search','2010-07-08 11:17:57'),(10,'MAIN_SEARCHFORM_CONTACT',0,'1','yesno',0,'Show form for quick contact search','2010-07-08 11:17:57'),(11,'MAIN_SEARCHFORM_PRODUITSERVICE',0,'1','yesno',0,'Show form for quick product search','2010-07-08 11:17:58'),(12,'MAIN_SEARCHFORM_ADHERENT',0,'1','yesno',0,'Show form for quick member search','2010-07-08 11:17:58'),(16,'MAIN_SIZE_LISTE_LIMIT',0,'25','chaine',0,'Longueur maximum des listes','2010-07-08 11:17:58'),(17,'MAIN_SHOW_WORKBOARD',0,'1','yesno',0,'Affichage tableau de bord de travail Dolibarr','2010-07-08 11:17:58'),(29,'MAIN_DELAY_NOT_ACTIVATED_SERVICES',1,'0','chaine',0,'Tolérance de retard avant alerte (en jours) sur services à activer','2010-07-08 11:17:58'),(33,'SOCIETE_NOLIST_COURRIER',0,'1','yesno',0,'Liste les fichiers du repertoire courrier','2010-07-08 11:17:58'),(36,'ADHERENT_MAIL_REQUIRED',1,'1','yesno',0,'EMail required to create a new member','2010-07-08 11:17:58'),(37,'ADHERENT_MAIL_FROM',1,'adherents@domain.com','chaine',0,'Sender EMail for automatic emails','2010-07-08 11:17:58'),(38,'ADHERENT_MAIL_RESIL',1,'Your subscription has been resiliated.\r\nWe hope to see you soon again','texte',0,'Mail resiliation','2010-07-08 11:17:58'),(39,'ADHERENT_MAIL_VALID',1,'Your subscription has been validated.\r\nThis is a remind of your personal information :\r\n\r\n%INFOS%\r\n\r\n','texte',0,'Mail de validation','2010-07-08 11:17:59'),(40,'ADHERENT_MAIL_COTIS',1,'Hello %PRENOM%,\r\nThanks for your subscription.\r\nThis email confirms that your subscription has been received and processed.\r\n\r\n','texte',0,'Mail de validation de cotisation','2010-07-08 11:17:59'),(41,'ADHERENT_MAIL_VALID_SUBJECT',1,'Your subscription has been validated','chaine',0,'Sujet du mail de validation','2010-07-08 11:17:59'),(42,'ADHERENT_MAIL_RESIL_SUBJECT',1,'Resiliating your subscription','chaine',0,'Sujet du mail de resiliation','2010-07-08 11:17:59'),(43,'ADHERENT_MAIL_COTIS_SUBJECT',1,'Receipt of your subscription','chaine',0,'Sujet du mail de validation de cotisation','2010-07-08 11:17:59'),(44,'MAILING_EMAIL_FROM',1,'dolibarr@domain.com','chaine',0,'EMail emmetteur pour les envois d emailings','2010-07-08 11:17:59'),(45,'ADHERENT_USE_MAILMAN',1,'0','yesno',0,'Utilisation de Mailman','2010-07-08 11:17:59'),(46,'ADHERENT_MAILMAN_UNSUB_URL',1,'http://lists.domain.com/cgi-bin/mailman/admin/%LISTE%/members?adminpw=%MAILMAN_ADMINPW%&user=%EMAIL%','chaine',0,'Url de desinscription aux listes mailman','2010-07-08 11:17:59'),(47,'ADHERENT_MAILMAN_URL',1,'http://lists.domain.com/cgi-bin/mailman/admin/%LISTE%/members?adminpw=%MAILMAN_ADMINPW%&send_welcome_msg_to_this_batch=1&subscribees=%EMAIL%','chaine',0,'Url pour les inscriptions mailman','2010-07-08 11:17:59'),(48,'ADHERENT_MAILMAN_LISTS',1,'test-test,test-test2','chaine',0,'Listes auxquelles inscrire les nouveaux adherents','2010-07-08 11:17:59'),(49,'ADHERENT_MAILMAN_ADMINPW',1,'','chaine',0,'Mot de passe Admin des liste mailman','2010-07-08 11:17:59'),(50,'ADHERENT_MAILMAN_SERVER',1,'lists.domain.com','chaine',0,'Serveur hebergeant les interfaces d Admin des listes mailman','2010-07-08 11:17:59'),(51,'ADHERENT_MAILMAN_LISTS_COTISANT',1,'','chaine',0,'Liste(s) auxquelles les nouveaux cotisants sont inscris automatiquement','2010-07-08 11:17:59'),(52,'ADHERENT_USE_SPIP',1,'0','yesno',0,'Utilisation de SPIP ?','2010-07-08 11:17:59'),(53,'ADHERENT_USE_SPIP_AUTO',1,'0','yesno',0,'Utilisation de SPIP automatiquement','2010-07-08 11:17:59'),(54,'ADHERENT_SPIP_USER',1,'user','chaine',0,'user spip','2010-07-08 11:17:59'),(55,'ADHERENT_SPIP_PASS',1,'pass','chaine',0,'Pass de connection','2010-07-08 11:17:59'),(56,'ADHERENT_SPIP_SERVEUR',1,'localhost','chaine',0,'serveur spip','2010-07-08 11:17:59'),(57,'ADHERENT_SPIP_DB',1,'spip','chaine',0,'db spip','2010-07-08 11:17:59'),(58,'ADHERENT_CARD_HEADER_TEXT',1,'%ANNEE%','chaine',0,'Texte imprime sur le haut de la carte adherent','2010-07-08 11:17:59'),(59,'ADHERENT_CARD_FOOTER_TEXT',1,'Association AZERTY','chaine',0,'Texte imprime sur le bas de la carte adherent','2010-07-08 11:17:59'),(61,'FCKEDITOR_ENABLE_USER',1,'1','yesno',0,'Activation fckeditor sur notes utilisateurs','2010-07-08 11:17:59'),(62,'FCKEDITOR_ENABLE_SOCIETE',1,'1','yesno',0,'Activation fckeditor sur notes societe','2010-07-08 11:17:59'),(63,'FCKEDITOR_ENABLE_PRODUCTDESC',1,'1','yesno',0,'Activation fckeditor sur notes produits','2010-07-08 11:17:59'),(64,'FCKEDITOR_ENABLE_MEMBER',1,'1','yesno',0,'Activation fckeditor sur notes adherent','2010-07-08 11:17:59'),(65,'FCKEDITOR_ENABLE_MAILING',1,'1','yesno',0,'Activation fckeditor sur emailing','2010-07-08 11:17:59'),(67,'DON_ADDON_MODEL',1,'html_cerfafr','chaine',0,'','2010-07-08 11:18:00'),(68,'PROPALE_ADDON',1,'mod_propale_marbre','chaine',0,'','2010-07-08 11:18:00'),(69,'PROPALE_ADDON_PDF',1,'azur','chaine',0,'','2010-07-08 11:18:00'),(70,'COMMANDE_ADDON',1,'mod_commande_marbre','chaine',0,'','2010-07-08 11:18:00'),(71,'COMMANDE_ADDON_PDF',1,'einstein','chaine',0,'','2010-07-08 11:18:00'),(72,'COMMANDE_SUPPLIER_ADDON',1,'mod_commande_fournisseur_muguet','chaine',0,'','2010-07-08 11:18:00'),(73,'COMMANDE_SUPPLIER_ADDON_PDF',1,'muscadet','chaine',0,'','2010-07-08 11:18:00'),(74,'EXPEDITION_ADDON',1,'enlevement','chaine',0,'','2010-07-08 11:18:00'),(76,'FICHEINTER_ADDON',1,'pacific','chaine',0,'','2010-07-08 11:18:00'),(77,'FICHEINTER_ADDON_PDF',1,'soleil','chaine',0,'','2010-07-08 11:18:00'),(79,'FACTURE_ADDON_PDF',1,'crabe','chaine',0,'','2010-07-08 11:18:00'),(80,'PROPALE_VALIDITY_DURATION',1,'15','chaine',0,'Durée de validitée des propales','2010-07-08 11:18:00'),(230,'COMPANY_ADDON_PDF_ODT_PATH',1,'DOL_DATA_ROOT/doctemplates/thirdparties','chaine',0,NULL,'2010-07-08 11:26:20'),(238,'LIVRAISON_ADDON_PDF',1,'typhon','chaine',0,'Nom du gestionnaire de generation des commandes en PDF','2010-07-08 11:26:27'),(239,'LIVRAISON_ADDON_NUMBER',1,'mod_livraison_jade','chaine',0,'Nom du gestionnaire de numerotation des bons de livraison','2013-03-20 13:17:36'),(245,'FACTURE_ADDON_PDF_ODT_PATH',1,'DOL_DATA_ROOT/doctemplates/invoices','chaine',0,NULL,'2010-07-08 11:28:53'),(249,'DON_FORM',1,'fsfe.fr.php','chaine',0,'Nom du gestionnaire de formulaire de dons','2010-07-08 11:29:00'),(253,'ADHERENT_BANK_USE_AUTO',1,'','yesno',0,'Insertion automatique des cotisation dans le compte banquaire','2010-07-08 11:29:05'),(254,'ADHERENT_BANK_ACCOUNT',1,'','chaine',0,'ID du Compte banquaire utilise','2010-07-08 11:29:05'),(255,'ADHERENT_BANK_CATEGORIE',1,'','chaine',0,'ID de la categorie banquaire des cotisations','2010-07-08 11:29:05'),(256,'ADHERENT_ETIQUETTE_TYPE',1,'L7163','chaine',0,'Type d etiquette (pour impression de planche d etiquette)','2010-07-08 11:29:05'),(269,'PROJECT_ADDON_PDF',1,'baleine','chaine',0,'Nom du gestionnaire de generation des projets en PDF','2010-07-08 11:29:33'),(270,'PROJECT_ADDON',1,'mod_project_simple','chaine',0,'Nom du gestionnaire de numerotation des projets','2010-07-08 11:29:33'),(368,'STOCK_USERSTOCK_AUTOCREATE',1,'1','chaine',0,'','2010-07-08 22:44:59'),(369,'EXPEDITION_ADDON_PDF',1,'merou','chaine',0,'','2010-07-08 22:58:07'),(377,'FACTURE_ADDON',1,'mod_facture_terre','chaine',0,'','2010-07-08 23:08:12'),(380,'ADHERENT_CARD_TEXT',1,'%TYPE% n° %ID%\r\n%PRENOM% %NOM%\r\n<%EMAIL%>\r\n%ADRESSE%\r\n%CP% %VILLE%\r\n%PAYS%','',0,'Texte imprime sur la carte adherent','2010-07-08 23:14:46'),(381,'ADHERENT_CARD_TEXT_RIGHT',1,'aaa','',0,'','2010-07-08 23:14:55'),(385,'PRODUIT_USE_SEARCH_TO_SELECT',1,'1','chaine',0,'','2010-07-08 23:22:19'),(386,'STOCK_CALCULATE_ON_SHIPMENT',1,'1','chaine',0,'','2010-07-08 23:23:21'),(387,'STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER',1,'1','chaine',0,'','2010-07-08 23:23:26'),(392,'MAIN_AGENDA_XCAL_EXPORTKEY',1,'dolibarr','chaine',0,'','2010-07-08 23:27:50'),(393,'MAIN_AGENDA_EXPORT_PAST_DELAY',1,'100','chaine',0,'','2010-07-08 23:27:50'),(610,'CASHDESK_ID_THIRDPARTY',1,'7','chaine',0,'','2010-07-11 17:08:18'),(611,'CASHDESK_ID_BANKACCOUNT_CASH',1,'3','chaine',0,'','2010-07-11 17:08:18'),(612,'CASHDESK_ID_BANKACCOUNT_CHEQUE',1,'1','chaine',0,'','2010-07-11 17:08:18'),(613,'CASHDESK_ID_BANKACCOUNT_CB',1,'1','chaine',0,'','2010-07-11 17:08:18'),(614,'CASHDESK_ID_WAREHOUSE',1,'2','chaine',0,'','2010-07-11 17:08:18'),(660,'LDAP_USER_DN',1,'ou=users,dc=my-domain,dc=com','chaine',0,NULL,'2010-07-18 10:25:27'),(661,'LDAP_GROUP_DN',1,'ou=groups,dc=my-domain,dc=com','chaine',0,NULL,'2010-07-18 10:25:27'),(662,'LDAP_FILTER_CONNECTION',1,'&(objectClass=user)(objectCategory=person)','chaine',0,NULL,'2010-07-18 10:25:27'),(663,'LDAP_FIELD_LOGIN',1,'uid','chaine',0,NULL,'2010-07-18 10:25:27'),(664,'LDAP_FIELD_FULLNAME',1,'cn','chaine',0,NULL,'2010-07-18 10:25:27'),(665,'LDAP_FIELD_NAME',1,'sn','chaine',0,NULL,'2010-07-18 10:25:27'),(666,'LDAP_FIELD_FIRSTNAME',1,'givenname','chaine',0,NULL,'2010-07-18 10:25:27'),(667,'LDAP_FIELD_MAIL',1,'mail','chaine',0,NULL,'2010-07-18 10:25:27'),(668,'LDAP_FIELD_PHONE',1,'telephonenumber','chaine',0,NULL,'2010-07-18 10:25:27'),(669,'LDAP_FIELD_FAX',1,'facsimiletelephonenumber','chaine',0,NULL,'2010-07-18 10:25:27'),(670,'LDAP_FIELD_MOBILE',1,'mobile','chaine',0,NULL,'2010-07-18 10:25:27'),(671,'LDAP_SERVER_TYPE',1,'openldap','chaine',0,'','2010-07-18 10:25:46'),(672,'LDAP_SERVER_PROTOCOLVERSION',1,'3','chaine',0,'','2010-07-18 10:25:47'),(673,'LDAP_SERVER_HOST',1,'localhost','chaine',0,'','2010-07-18 10:25:47'),(674,'LDAP_SERVER_PORT',1,'389','chaine',0,'','2010-07-18 10:25:47'),(675,'LDAP_SERVER_USE_TLS',1,'0','chaine',0,'','2010-07-18 10:25:47'),(676,'LDAP_SYNCHRO_ACTIVE',1,'dolibarr2ldap','chaine',0,'','2010-07-18 10:25:47'),(677,'LDAP_CONTACT_ACTIVE',1,'1','chaine',0,'','2010-07-18 10:25:47'),(678,'LDAP_MEMBER_ACTIVE',1,'1','chaine',0,'','2010-07-18 10:25:47'),(974,'MAIN_MODULE_WORKFLOW_TRIGGERS',1,'1','chaine',0,NULL,'2011-07-18 18:02:20'),(975,'WORKFLOW_PROPAL_AUTOCREATE_ORDER',1,'1','chaine',0,'','2011-07-18 18:02:24'),(980,'PRELEVEMENT_NUMERO_NATIONAL_EMETTEUR',1,'1234567','chaine',0,'','2011-07-18 18:05:50'),(983,'FACTURE_RIB_NUMBER',1,'1','chaine',0,'','2011-07-18 18:35:14'),(984,'FACTURE_CHQ_NUMBER',1,'1','chaine',0,'','2011-07-18 18:35:14'),(1016,'GOOGLE_DUPLICATE_INTO_GCAL',1,'1','chaine',0,'','2011-07-18 21:40:20'),(1152,'SOCIETE_CODECLIENT_ADDON',1,'mod_codeclient_monkey','chaine',0,'','2011-07-29 20:50:02'),(1231,'MAIN_UPLOAD_DOC',1,'2048','chaine',0,'','2011-07-29 21:04:00'),(1234,'MAIN_UMASK',1,'0664','chaine',0,'','2011-07-29 21:04:11'),(1240,'MAIN_LOGEVENTS_USER_LOGIN',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1241,'MAIN_LOGEVENTS_USER_LOGIN_FAILED',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1242,'MAIN_LOGEVENTS_USER_LOGOUT',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1243,'MAIN_LOGEVENTS_USER_CREATE',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1244,'MAIN_LOGEVENTS_USER_MODIFY',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1245,'MAIN_LOGEVENTS_USER_NEW_PASSWORD',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1246,'MAIN_LOGEVENTS_USER_ENABLEDISABLE',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1247,'MAIN_LOGEVENTS_USER_DELETE',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1248,'MAIN_LOGEVENTS_GROUP_CREATE',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1249,'MAIN_LOGEVENTS_GROUP_MODIFY',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1250,'MAIN_LOGEVENTS_GROUP_DELETE',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1251,'MAIN_BOXES_MAXLINES',1,'5','',0,'','2011-07-29 21:05:42'),(1482,'EXPEDITION_ADDON_NUMBER',1,'mod_expedition_safor','chaine',0,'Nom du gestionnaire de numerotation des expeditions','2011-08-05 17:53:11'),(1490,'CONTRACT_ADDON',1,'mod_contract_serpis','chaine',0,'Nom du gestionnaire de numerotation des contrats','2011-08-05 18:11:58'),(1677,'COMMANDE_ADDON_PDF_ODT_PATH',1,'DOL_DATA_ROOT/doctemplates/orders','chaine',0,NULL,'2012-12-08 13:11:02'),(1698,'PRODUCT_CODEPRODUCT_ADDON',1,'mod_codeproduct_leopard','yesno',0,'Module to control product codes','2012-12-08 13:11:25'),(1724,'PROPALE_ADDON_PDF_ODT_PATH',1,'DOL_DATA_ROOT/doctemplates/proposals','chaine',0,NULL,'2012-12-08 13:17:14'),(1730,'OPENSTREETMAP_ENABLE_MAPS',1,'1','chaine',0,'','2012-12-08 13:22:47'),(1731,'OPENSTREETMAP_ENABLE_MAPS_CONTACTS',1,'1','chaine',0,'','2012-12-08 13:22:47'),(1732,'OPENSTREETMAP_ENABLE_MAPS_MEMBERS',1,'1','chaine',0,'','2012-12-08 13:22:47'),(1733,'OPENSTREETMAP_MAPS_ZOOM_LEVEL',1,'15','chaine',0,'','2012-12-08 13:22:47'),(1742,'MAIN_MAIL_EMAIL_FROM',2,'dolibarr-robot@domain.com','chaine',0,'EMail emetteur pour les emails automatiques Dolibarr','2012-12-08 14:08:14'),(1743,'MAIN_MENU_STANDARD',2,'eldy_menu.php','chaine',0,'Module de gestion de la barre de menu du haut pour utilisateurs internes','2013-02-11 19:43:54'),(1744,'MAIN_MENUFRONT_STANDARD',2,'eldy_menu.php','chaine',0,'Module de gestion de la barre de menu du haut pour utilisateurs externes','2013-02-11 19:43:54'),(1745,'MAIN_MENU_SMARTPHONE',2,'iphone_backoffice.php','chaine',0,'Module de gestion de la barre de menu smartphone pour utilisateurs internes','2012-12-08 14:08:14'),(1746,'MAIN_MENUFRONT_SMARTPHONE',2,'iphone_frontoffice.php','chaine',0,'Module de gestion de la barre de menu smartphone pour utilisateurs externes','2012-12-08 14:08:14'),(1747,'MAIN_THEME',2,'eldy','chaine',0,'Default theme','2012-12-08 14:08:14'),(1748,'MAIN_DELAY_ACTIONS_TODO',2,'7','chaine',0,'Tolérance de retard avant alerte (en jours) sur actions planifiées non réalisées','2012-12-08 14:08:14'),(1749,'MAIN_DELAY_ORDERS_TO_PROCESS',2,'2','chaine',0,'Tolérance de retard avant alerte (en jours) sur commandes clients non traitées','2012-12-08 14:08:14'),(1750,'MAIN_DELAY_SUPPLIER_ORDERS_TO_PROCESS',2,'7','chaine',0,'Tolérance de retard avant alerte (en jours) sur commandes fournisseurs non traitées','2012-12-08 14:08:14'),(1751,'MAIN_DELAY_PROPALS_TO_CLOSE',2,'31','chaine',0,'Tolérance de retard avant alerte (en jours) sur propales à cloturer','2012-12-08 14:08:14'),(1752,'MAIN_DELAY_PROPALS_TO_BILL',2,'7','chaine',0,'Tolérance de retard avant alerte (en jours) sur propales non facturées','2012-12-08 14:08:14'),(1753,'MAIN_DELAY_CUSTOMER_BILLS_UNPAYED',2,'31','chaine',0,'Tolérance de retard avant alerte (en jours) sur factures client impayées','2012-12-08 14:08:14'),(1754,'MAIN_DELAY_SUPPLIER_BILLS_TO_PAY',2,'2','chaine',0,'Tolérance de retard avant alerte (en jours) sur factures fournisseur impayées','2012-12-08 14:08:14'),(1755,'MAIN_DELAY_NOT_ACTIVATED_SERVICES',2,'0','chaine',0,'Tolérance de retard avant alerte (en jours) sur services à activer','2012-12-08 14:08:14'),(1756,'MAIN_DELAY_RUNNING_SERVICES',2,'0','chaine',0,'Tolérance de retard avant alerte (en jours) sur services expirés','2012-12-08 14:08:14'),(1757,'MAIN_DELAY_MEMBERS',2,'31','chaine',0,'Tolérance de retard avant alerte (en jours) sur cotisations adhérent en retard','2012-12-08 14:08:14'),(1758,'MAIN_DELAY_TRANSACTIONS_TO_CONCILIATE',2,'62','chaine',0,'Tolérance de retard avant alerte (en jours) sur rapprochements bancaires à faire','2012-12-08 14:08:14'),(1759,'MAILING_EMAIL_FROM',2,'dolibarr@domain.com','chaine',0,'EMail emmetteur pour les envois d emailings','2012-12-08 14:08:14'),(1760,'MAIN_INFO_SOCIETE_COUNTRY',3,'1:FR:France','chaine',0,'','2013-02-26 21:56:28'),(1761,'MAIN_INFO_SOCIETE_NOM',3,'bbb','chaine',0,'','2012-12-08 14:08:20'),(1762,'MAIN_INFO_SOCIETE_STATE',3,'0','chaine',0,'','2013-02-27 14:20:27'),(1763,'MAIN_MONNAIE',3,'EUR','chaine',0,'','2012-12-08 14:08:20'),(1764,'MAIN_LANG_DEFAULT',3,'auto','chaine',0,'','2012-12-08 14:08:20'),(1765,'MAIN_MAIL_EMAIL_FROM',3,'dolibarr-robot@domain.com','chaine',0,'EMail emetteur pour les emails automatiques Dolibarr','2012-12-08 14:08:20'),(1766,'MAIN_MENU_STANDARD',3,'eldy_menu.php','chaine',0,'Module de gestion de la barre de menu du haut pour utilisateurs internes','2013-02-11 19:43:54'),(1767,'MAIN_MENUFRONT_STANDARD',3,'eldy_menu.php','chaine',0,'Module de gestion de la barre de menu du haut pour utilisateurs externes','2013-02-11 19:43:54'),(1768,'MAIN_MENU_SMARTPHONE',3,'iphone_backoffice.php','chaine',0,'Module de gestion de la barre de menu smartphone pour utilisateurs internes','2012-12-08 14:08:20'),(1769,'MAIN_MENUFRONT_SMARTPHONE',3,'iphone_frontoffice.php','chaine',0,'Module de gestion de la barre de menu smartphone pour utilisateurs externes','2012-12-08 14:08:20'),(1770,'MAIN_THEME',3,'eldy','chaine',0,'Default theme','2012-12-08 14:08:20'),(1771,'MAIN_DELAY_ACTIONS_TODO',3,'7','chaine',0,'Tolérance de retard avant alerte (en jours) sur actions planifiées non réalisées','2012-12-08 14:08:20'),(1772,'MAIN_DELAY_ORDERS_TO_PROCESS',3,'2','chaine',0,'Tolérance de retard avant alerte (en jours) sur commandes clients non traitées','2012-12-08 14:08:20'),(1773,'MAIN_DELAY_SUPPLIER_ORDERS_TO_PROCESS',3,'7','chaine',0,'Tolérance de retard avant alerte (en jours) sur commandes fournisseurs non traitées','2012-12-08 14:08:20'),(1774,'MAIN_DELAY_PROPALS_TO_CLOSE',3,'31','chaine',0,'Tolérance de retard avant alerte (en jours) sur propales à cloturer','2012-12-08 14:08:20'),(1775,'MAIN_DELAY_PROPALS_TO_BILL',3,'7','chaine',0,'Tolérance de retard avant alerte (en jours) sur propales non facturées','2012-12-08 14:08:20'),(1776,'MAIN_DELAY_CUSTOMER_BILLS_UNPAYED',3,'31','chaine',0,'Tolérance de retard avant alerte (en jours) sur factures client impayées','2012-12-08 14:08:20'),(1777,'MAIN_DELAY_SUPPLIER_BILLS_TO_PAY',3,'2','chaine',0,'Tolérance de retard avant alerte (en jours) sur factures fournisseur impayées','2012-12-08 14:08:20'),(1778,'MAIN_DELAY_NOT_ACTIVATED_SERVICES',3,'0','chaine',0,'Tolérance de retard avant alerte (en jours) sur services à activer','2012-12-08 14:08:20'),(1779,'MAIN_DELAY_RUNNING_SERVICES',3,'0','chaine',0,'Tolérance de retard avant alerte (en jours) sur services expirés','2012-12-08 14:08:20'),(1780,'MAIN_DELAY_MEMBERS',3,'31','chaine',0,'Tolérance de retard avant alerte (en jours) sur cotisations adhérent en retard','2012-12-08 14:08:20'),(1781,'MAIN_DELAY_TRANSACTIONS_TO_CONCILIATE',3,'62','chaine',0,'Tolérance de retard avant alerte (en jours) sur rapprochements bancaires à faire','2012-12-08 14:08:20'),(1782,'MAILING_EMAIL_FROM',3,'dolibarr@domain.com','chaine',0,'EMail emmetteur pour les envois d emailings','2012-12-08 14:08:20'),(1803,'SYSLOG_FILE',1,'DOL_DATA_ROOT/dolibarr.log','chaine',0,'','2012-12-08 14:15:08'),(1804,'SYSLOG_HANDLERS',1,'[\"mod_syslog_file\"]','chaine',0,'','2012-12-08 14:15:08'),(1805,'MAIN_MODULE_SKINCOLOREDITOR',3,'1',NULL,0,NULL,'2012-12-08 14:35:40'),(1806,'MAIN_MODULE_SKINCOLOREDITOR_TABS_0',3,'user:+tabskincoloreditors:ColorEditor:skincoloreditor@skincoloreditor:/skincoloreditor/usercolors.php?id=__ID__','chaine',0,NULL,'2012-12-08 14:35:40'),(1922,'PAYPAL_API_SANDBOX',1,'1','chaine',0,'','2012-12-12 12:11:05'),(1923,'PAYPAL_API_USER',1,'seller_1355312017_biz_api1.nltechno.com','chaine',0,'','2012-12-12 12:11:05'),(1924,'PAYPAL_API_PASSWORD',1,'1355312040','chaine',0,'','2012-12-12 12:11:05'),(1925,'PAYPAL_API_SIGNATURE',1,'AXqqdsWBzvfn0q5iNmbuiDv1y.3EAXIMWyl4C5KvDReR9HDwwAd6dQ4Q','chaine',0,'','2012-12-12 12:11:05'),(1926,'PAYPAL_API_INTEGRAL_OR_PAYPALONLY',1,'integral','chaine',0,'','2012-12-12 12:11:05'),(1927,'PAYPAL_SECURITY_TOKEN',1,'50c82fab36bb3b6aa83e2a50691803b2','chaine',0,'','2012-12-12 12:11:05'),(1928,'PAYPAL_SECURITY_TOKEN_UNIQUE',1,'0','chaine',0,'','2012-12-12 12:11:05'),(1929,'PAYPAL_ADD_PAYMENT_URL',1,'1','chaine',0,'','2012-12-12 12:11:05'),(1980,'MAIN_PDF_FORMAT',1,'EUA4','chaine',0,'','2012-12-12 19:58:05'),(1981,'MAIN_PROFID1_IN_ADDRESS',1,'0','chaine',0,'','2012-12-12 19:58:05'),(1982,'MAIN_PROFID2_IN_ADDRESS',1,'0','chaine',0,'','2012-12-12 19:58:05'),(1983,'MAIN_PROFID3_IN_ADDRESS',1,'0','chaine',0,'','2012-12-12 19:58:05'),(1984,'MAIN_PROFID4_IN_ADDRESS',1,'0','chaine',0,'','2012-12-12 19:58:05'),(1985,'MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT',1,'0','chaine',0,'','2012-12-12 19:58:05'),(1990,'MAIN_SMS_SENDMODE',1,'ovh','chaine',0,'This is to enable OVH SMS engine','2012-12-17 21:19:01'),(2251,'FCKEDITOR_TEST',1,'Test
\r\n\"\"fdfs','chaine',0,'','2012-12-19 19:12:24'),(2293,'SYSTEMTOOLS_MYSQLDUMP',1,'/usr/bin/mysqldump','chaine',0,'','2012-12-27 02:02:00'),(2835,'MAIN_USE_CONNECT_TIMEOUT',1,'10','chaine',0,'','2013-01-16 19:28:50'),(2836,'MAIN_USE_RESPONSE_TIMEOUT',1,'30','chaine',0,'','2013-01-16 19:28:50'),(2837,'MAIN_PROXY_USE',1,'0','chaine',0,'','2013-01-16 19:28:50'),(2838,'MAIN_PROXY_HOST',1,'localhost','chaine',0,'','2013-01-16 19:28:50'),(2839,'MAIN_PROXY_PORT',1,'8080','chaine',0,'','2013-01-16 19:28:50'),(2840,'MAIN_PROXY_USER',1,'aaa','chaine',0,'','2013-01-16 19:28:50'),(2841,'MAIN_PROXY_PASS',1,'bbb','chaine',0,'','2013-01-16 19:28:50'),(2848,'OVHSMS_NICK',1,'BN196-OVH','chaine',0,'','2013-01-16 19:32:36'),(2849,'OVHSMS_PASS',1,'bigone-10','chaine',0,'','2013-01-16 19:32:36'),(2850,'OVHSMS_SOAPURL',1,'https://www.ovh.com/soapi/soapi-re-1.55.wsdl','chaine',0,'','2013-01-16 19:32:36'),(2854,'THEME_ELDY_RGB',1,'bfbf00','chaine',0,'','2013-01-18 10:02:53'),(2855,'THEME_ELDY_ENABLE_PERSONALIZED',1,'0','chaine',0,'','2013-01-18 10:02:55'),(2858,'MAIN_SESSION_TIMEOUT',1,'2000','chaine',0,'','2013-01-19 17:01:53'),(2862,'TICKET_ADDON',1,'mod_ticket_avenc','chaine',0,'Nom du gestionnaire de numerotation des tickets','2013-01-19 17:16:10'),(2867,'FACSIM_ADDON',1,'mod_facsim_alcoy','chaine',0,'','2013-01-19 17:16:25'),(2868,'POS_SERVICES',1,'0','chaine',0,'','2013-01-19 17:16:51'),(2869,'POS_USE_TICKETS',1,'1','chaine',0,'','2013-01-19 17:16:51'),(2870,'POS_MAX_TTC',1,'100','chaine',0,'','2013-01-19 17:16:51'),(3190,'MAIN_MODULE_HOLIDAY',2,'1',NULL,0,NULL,'2013-02-01 08:52:34'),(3191,'MAIN_MODULE_HOLIDAY_TABS_0',2,'user:+paidholidays:CPTitreMenu:holiday:$user->rights->holiday->write:/holiday/index.php?mainmenu=holiday&id=__ID__','chaine',0,NULL,'2013-02-01 08:52:34'),(3195,'INVOICE_SUPPLIER_ADDON_PDF',1,'canelle','chaine',0,'','2013-02-10 19:50:27'),(3199,'MAIN_FORCE_RELOAD_PAGE',1,'1','chaine',0,NULL,'2013-02-12 16:22:55'),(3217,'MAIN_PDF_TITLE_BACKGROUND_COLOR',1,'240,240,240','chaine',1,'','2013-02-13 15:18:02'),(3223,'OVH_THIRDPARTY_IMPORT',1,'2','chaine',0,'','2013-02-13 16:20:18'),(3241,'COMPANY_USE_SEARCH_TO_SELECT',1,'2','chaine',0,'','2013-02-17 14:33:39'),(3409,'AGENDA_USE_EVENT_TYPE',1,'1','chaine',0,'','2013-02-27 18:12:24'),(3886,'MAIN_REMOVE_INSTALL_WARNING',1,'1','chaine',1,'','2013-03-02 18:32:50'),(4013,'MAIN_DELAY_ACTIONS_TODO',1,'7','chaine',0,'','2013-03-06 08:59:12'),(4014,'MAIN_DELAY_PROPALS_TO_CLOSE',1,'31','chaine',0,'','2013-03-06 08:59:12'),(4015,'MAIN_DELAY_PROPALS_TO_BILL',1,'7','chaine',0,'','2013-03-06 08:59:12'),(4016,'MAIN_DELAY_ORDERS_TO_PROCESS',1,'2','chaine',0,'','2013-03-06 08:59:12'),(4017,'MAIN_DELAY_CUSTOMER_BILLS_UNPAYED',1,'31','chaine',0,'','2013-03-06 08:59:12'),(4018,'MAIN_DELAY_SUPPLIER_ORDERS_TO_PROCESS',1,'7','chaine',0,'','2013-03-06 08:59:12'),(4019,'MAIN_DELAY_SUPPLIER_BILLS_TO_PAY',1,'2','chaine',0,'','2013-03-06 08:59:12'),(4020,'MAIN_DELAY_RUNNING_SERVICES',1,'-15','chaine',0,'','2013-03-06 08:59:12'),(4021,'MAIN_DELAY_TRANSACTIONS_TO_CONCILIATE',1,'62','chaine',0,'','2013-03-06 08:59:13'),(4022,'MAIN_DELAY_MEMBERS',1,'31','chaine',0,'','2013-03-06 08:59:13'),(4023,'MAIN_DISABLE_METEO',1,'0','chaine',0,'','2013-03-06 08:59:13'),(4044,'ADHERENT_VAT_FOR_SUBSCRIPTIONS',1,'0','',0,'','2013-03-06 16:06:38'),(4047,'ADHERENT_BANK_USE',1,'bankviainvoice','',0,'','2013-03-06 16:12:30'),(4049,'PHPSANE_SCANIMAGE',1,'/usr/bin/scanimage','chaine',0,'','2013-03-06 21:54:13'),(4050,'PHPSANE_PNMTOJPEG',1,'/usr/bin/pnmtojpeg','chaine',0,'','2013-03-06 21:54:13'),(4051,'PHPSANE_PNMTOTIFF',1,'/usr/bin/pnmtotiff','chaine',0,'','2013-03-06 21:54:13'),(4052,'PHPSANE_OCR',1,'/usr/bin/gocr','chaine',0,'','2013-03-06 21:54:13'),(4548,'ECM_AUTO_TREE_ENABLED',1,'1','chaine',0,'','2013-03-10 15:57:21'),(4579,'MAIN_MODULE_AGENDA',2,'1',NULL,0,NULL,'2013-03-13 15:29:19'),(4580,'MAIN_AGENDA_ACTIONAUTO_COMPANY_CREATE',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4581,'MAIN_AGENDA_ACTIONAUTO_CONTRACT_VALIDATE',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4582,'MAIN_AGENDA_ACTIONAUTO_PROPAL_VALIDATE',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4583,'MAIN_AGENDA_ACTIONAUTO_PROPAL_SENTBYMAIL',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4584,'MAIN_AGENDA_ACTIONAUTO_ORDER_VALIDATE',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4585,'MAIN_AGENDA_ACTIONAUTO_ORDER_SENTBYMAIL',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4586,'MAIN_AGENDA_ACTIONAUTO_BILL_VALIDATE',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4587,'MAIN_AGENDA_ACTIONAUTO_BILL_PAYED',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4588,'MAIN_AGENDA_ACTIONAUTO_BILL_CANCEL',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4589,'MAIN_AGENDA_ACTIONAUTO_BILL_SENTBYMAIL',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4590,'MAIN_AGENDA_ACTIONAUTO_ORDER_SUPPLIER_VALIDATE',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4591,'MAIN_AGENDA_ACTIONAUTO_BILL_SUPPLIER_VALIDATE',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4592,'MAIN_AGENDA_ACTIONAUTO_SHIPPING_VALIDATE',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4593,'MAIN_AGENDA_ACTIONAUTO_SHIPPING_SENTBYMAIL',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4594,'MAIN_AGENDA_ACTIONAUTO_BILL_UNVALIDATE',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4595,'MAIN_MODULE_GOOGLE',2,'1',NULL,0,NULL,'2013-03-13 15:29:47'),(4596,'MAIN_MODULE_GOOGLE_TABS_0',2,'agenda:+gcal:MenuAgendaGoogle:google@google:$conf->google->enabled && $conf->global->GOOGLE_ENABLE_AGENDA:/google/index.php','chaine',0,NULL,'2013-03-13 15:29:47'),(4597,'MAIN_MODULE_GOOGLE_TABS_1',2,'user:+gsetup:GoogleUserConf:google@google:$conf->google->enabled && $conf->global->GOOGLE_DUPLICATE_INTO_GCAL:/google/admin/google_calsync_user.php?id=__ID__','chaine',0,NULL,'2013-03-13 15:29:47'),(4598,'MAIN_MODULE_GOOGLE_TRIGGERS',2,'1','chaine',0,NULL,'2013-03-13 15:29:47'),(4599,'MAIN_MODULE_GOOGLE_HOOKS',2,'[\"toprightmenu\"]','chaine',0,NULL,'2013-03-13 15:29:47'),(4688,'GOOGLE_ENABLE_AGENDA',2,'1','chaine',0,'','2013-03-13 15:36:29'),(4689,'GOOGLE_AGENDA_NAME1',2,'eldy','chaine',0,'','2013-03-13 15:36:29'),(4690,'GOOGLE_AGENDA_SRC1',2,'eldy10@mail.com','chaine',0,'','2013-03-13 15:36:29'),(4691,'GOOGLE_AGENDA_COLOR1',2,'BE6D00','chaine',0,'','2013-03-13 15:36:29'),(4692,'GOOGLE_AGENDA_COLOR2',2,'7A367A','chaine',0,'','2013-03-13 15:36:29'),(4693,'GOOGLE_AGENDA_COLOR3',2,'7A367A','chaine',0,'','2013-03-13 15:36:29'),(4694,'GOOGLE_AGENDA_COLOR4',2,'7A367A','chaine',0,'','2013-03-13 15:36:29'),(4695,'GOOGLE_AGENDA_COLOR5',2,'7A367A','chaine',0,'','2013-03-13 15:36:29'),(4696,'GOOGLE_AGENDA_TIMEZONE',2,'Europe/Paris','chaine',0,'','2013-03-13 15:36:29'),(4697,'GOOGLE_AGENDA_NB',2,'5','chaine',0,'','2013-03-13 15:36:29'),(4711,'GOOGLE_ENABLE_AGENDA',1,'1','chaine',0,'','2013-03-13 19:37:38'),(4712,'GOOGLE_AGENDA_NAME1',1,'asso master','chaine',0,'','2013-03-13 19:37:38'),(4713,'GOOGLE_AGENDA_SRC1',1,'assodolibarr@mail.com','chaine',0,'','2013-03-13 19:37:38'),(4714,'GOOGLE_AGENDA_COLOR1',1,'1B887A','chaine',0,'','2013-03-13 19:37:38'),(4715,'GOOGLE_AGENDA_COLOR2',1,'7A367A','chaine',0,'','2013-03-13 19:37:38'),(4716,'GOOGLE_AGENDA_COLOR3',1,'7A367A','chaine',0,'','2013-03-13 19:37:38'),(4717,'GOOGLE_AGENDA_COLOR4',1,'7A367A','chaine',0,'','2013-03-13 19:37:38'),(4718,'GOOGLE_AGENDA_COLOR5',1,'7A367A','chaine',0,'','2013-03-13 19:37:38'),(4719,'GOOGLE_AGENDA_TIMEZONE',1,'Europe/Paris','chaine',0,'','2013-03-13 19:37:38'),(4720,'GOOGLE_AGENDA_NB',1,'5','chaine',0,'','2013-03-13 19:37:38'),(4725,'SOCIETE_CODECLIENT_ADDON',2,'mod_codeclient_leopard','chaine',0,'Module to control third parties codes','2013-03-13 20:21:35'),(4726,'SOCIETE_CODECOMPTA_ADDON',2,'mod_codecompta_panicum','chaine',0,'Module to control third parties codes','2013-03-13 20:21:35'),(4727,'SOCIETE_FISCAL_MONTH_START',2,'','chaine',0,'Mettre le numero du mois du debut d\\\'annee fiscale, ex: 9 pour septembre','2013-03-13 20:21:35'),(4728,'MAIN_SEARCHFORM_SOCIETE',2,'1','yesno',0,'Show form for quick company search','2013-03-13 20:21:35'),(4729,'MAIN_SEARCHFORM_CONTACT',2,'1','yesno',0,'Show form for quick contact search','2013-03-13 20:21:35'),(4730,'COMPANY_ADDON_PDF_ODT_PATH',2,'DOL_DATA_ROOT/doctemplates/thirdparties','chaine',0,NULL,'2013-03-13 20:21:35'),(4743,'MAIN_MODULE_CLICKTODIAL',2,'1',NULL,0,NULL,'2013-03-13 20:30:28'),(4744,'MAIN_MODULE_NOTIFICATION',2,'1',NULL,0,NULL,'2013-03-13 20:30:34'),(4745,'MAIN_MODULE_WEBSERVICES',2,'1',NULL,0,NULL,'2013-03-13 20:30:41'),(4746,'MAIN_MODULE_PROPALE',2,'1',NULL,0,NULL,'2013-03-13 20:32:38'),(4747,'PROPALE_ADDON_PDF',2,'azur','chaine',0,'Nom du gestionnaire de generation des propales en PDF','2013-03-13 20:32:38'),(4748,'PROPALE_ADDON',2,'mod_propale_marbre','chaine',0,'Nom du gestionnaire de numerotation des propales','2013-03-13 20:32:38'),(4749,'PROPALE_VALIDITY_DURATION',2,'15','chaine',0,'Duration of validity of business proposals','2013-03-13 20:32:38'),(4750,'PROPALE_ADDON_PDF_ODT_PATH',2,'DOL_DATA_ROOT/doctemplates/proposals','chaine',0,NULL,'2013-03-13 20:32:38'),(4752,'MAIN_MODULE_TAX',2,'1',NULL,0,NULL,'2013-03-13 20:32:47'),(4753,'MAIN_MODULE_DON',2,'1',NULL,0,NULL,'2013-03-13 20:32:54'),(4754,'DON_ADDON_MODEL',2,'html_cerfafr','chaine',0,'Nom du gestionnaire de generation de recu de dons','2013-03-13 20:32:54'),(4755,'POS_USE_TICKETS',2,'1','chaine',0,'','2013-03-13 20:33:09'),(4756,'POS_MAX_TTC',2,'100','chaine',0,'','2013-03-13 20:33:09'),(4757,'MAIN_MODULE_POS',2,'1',NULL,0,NULL,'2013-03-13 20:33:09'),(4758,'TICKET_ADDON',2,'mod_ticket_avenc','chaine',0,'Nom du gestionnaire de numerotation des tickets','2013-03-13 20:33:09'),(4759,'MAIN_MODULE_BANQUE',2,'1',NULL,0,NULL,'2013-03-13 20:33:09'),(4760,'MAIN_MODULE_FACTURE',2,'1',NULL,0,NULL,'2013-03-13 20:33:09'),(4761,'FACTURE_ADDON_PDF',2,'crabe','chaine',0,'Name of PDF model of invoice','2013-03-13 20:33:09'),(4762,'FACTURE_ADDON',2,'mod_facture_terre','chaine',0,'Name of numbering numerotation rules of invoice','2013-03-13 20:33:09'),(4763,'FACTURE_ADDON_PDF_ODT_PATH',2,'DOL_DATA_ROOT/doctemplates/invoices','chaine',0,NULL,'2013-03-13 20:33:09'),(4764,'MAIN_MODULE_SOCIETE',2,'1',NULL,0,NULL,'2013-03-13 20:33:09'),(4765,'MAIN_MODULE_PRODUCT',2,'1',NULL,0,NULL,'2013-03-13 20:33:09'),(4766,'PRODUCT_CODEPRODUCT_ADDON',2,'mod_codeproduct_leopard','chaine',0,'Module to control product codes','2013-03-13 20:33:09'),(4767,'MAIN_SEARCHFORM_PRODUITSERVICE',2,'1','yesno',0,'Show form for quick product search','2013-03-13 20:33:09'),(4772,'FACSIM_ADDON',2,'mod_facsim_alcoy','chaine',0,'','2013-03-13 20:33:32'),(4773,'MAIN_MODULE_MAILING',2,'1',NULL,0,NULL,'2013-03-13 20:33:37'),(4774,'MAIN_MODULE_OPENSURVEY',2,'1',NULL,0,NULL,'2013-03-13 20:33:42'),(4782,'AGENDA_USE_EVENT_TYPE',2,'1','chaine',0,'','2013-03-13 20:53:36'),(4884,'AGENDA_DISABLE_EXT',2,'1','chaine',0,'','2013-03-13 22:03:40'),(4928,'COMMANDE_SUPPLIER_ADDON_NUMBER',1,'mod_commande_fournisseur_muguet','chaine',0,'Nom du gestionnaire de numerotation des commandes fournisseur','2013-03-22 09:24:29'),(4929,'INVOICE_SUPPLIER_ADDON_NUMBER',1,'mod_facture_fournisseur_cactus','chaine',0,'Nom du gestionnaire de numerotation des factures fournisseur','2013-03-22 09:24:29'),(5001,'MAIN_CRON_KEY',0,'bc54582fe30d5d4a830c6f582ec28810','chaine',0,'','2013-03-23 17:54:53'),(5009,'CRON_KEY',0,'2c2e755c20be2014098f629865598006','chaine',0,'','2013-03-23 18:06:24'),(5075,'MAIN_MENU_STANDARD',1,'eldy_menu.php','chaine',0,'','2013-03-24 02:51:13'),(5076,'MAIN_MENU_SMARTPHONE',1,'eldy_menu.php','chaine',0,'','2013-03-24 02:51:13'),(5077,'MAIN_MENUFRONT_STANDARD',1,'eldy_menu.php','chaine',0,'','2013-03-24 02:51:13'),(5078,'MAIN_MENUFRONT_SMARTPHONE',1,'eldy_menu.php','chaine',0,'','2013-03-24 02:51:13'),(5139,'SOCIETE_ADD_REF_IN_LIST',1,'','yesno',0,'Display customer ref into select list','2013-09-08 23:06:08'),(5150,'PROJECT_TASK_ADDON_PDF',1,'','chaine',0,'Name of PDF/ODT tasks manager class','2013-09-08 23:06:14'),(5151,'PROJECT_TASK_ADDON',1,'mod_task_simple','chaine',0,'Name of Numbering Rule task manager class','2013-09-08 23:06:14'),(5152,'PROJECT_TASK_ADDON_PDF_ODT_PATH',1,'DOL_DATA_ROOT/doctemplates/tasks','chaine',0,'','2013-09-08 23:06:14'),(5195,'GOOGLE_DUPLICATE_INTO_THIRDPARTIES',1,'1','chaine',0,'','2013-11-07 00:02:34'),(5196,'GOOGLE_DUPLICATE_INTO_CONTACTS',1,'0','chaine',0,'','2013-11-07 00:02:34'),(5197,'GOOGLE_DUPLICATE_INTO_MEMBERS',1,'0','chaine',0,'','2013-11-07 00:02:34'),(5198,'GOOGLE_CONTACT_LOGIN',1,'eldy10@mail.com','chaine',0,'','2013-11-07 00:02:34'),(5199,'GOOGLE_CONTACT_PASSWORD',1,'bidonge','chaine',0,'','2013-11-07 00:02:34'),(5200,'GOOGLE_TAG_PREFIX',1,'Dolibarr (Thirdparties)','chaine',0,'','2013-11-07 00:02:34'),(5201,'GOOGLE_TAG_PREFIX_CONTACTS',1,'Dolibarr (Contacts/Addresses)','chaine',0,'','2013-11-07 00:02:34'),(5202,'GOOGLE_TAG_PREFIX_MEMBERS',1,'Dolibarr (Members)','chaine',0,'','2013-11-07 00:02:34'),(5239,'BOOKMARKS_SHOW_IN_MENU',1,'10','chaine',0,'','2014-03-02 15:42:26'),(5271,'DONATION_ART200',1,'','yesno',0,'Option Française - Eligibilité Art200 du CGI','2014-12-21 12:51:28'),(5272,'DONATION_ART238',1,'','yesno',0,'Option Française - Eligibilité Art238 bis du CGI','2014-12-21 12:51:28'),(5273,'DONATION_ART885',1,'','yesno',0,'Option Française - Eligibilité Art885-0 V bis du CGI','2014-12-21 12:51:28'),(5274,'DONATION_MESSAGE',1,'Thank you','chaine',0,'Message affiché sur le récépissé de versements ou dons','2014-12-21 12:51:28'),(5288,'DONATION_ACCOUNTINGACCOUNT',1,'7581','chaine',0,'Compte comptable de remise des versements ou dons','2015-07-19 13:41:21'),(5339,'MAIN_MULTILANGS',1,'1','chaine',0,'','2015-10-03 10:11:33'),(5340,'MAIN_SIZE_LISTE_LIMIT',1,'25','chaine',0,'','2015-10-03 10:11:33'),(5341,'MAIN_DISABLE_JAVASCRIPT',1,'0','chaine',0,'','2015-10-03 10:11:33'),(5342,'MAIN_BUTTON_HIDE_UNAUTHORIZED',1,'0','chaine',0,'','2015-10-03 10:11:33'),(5343,'MAIN_START_WEEK',1,'1','chaine',0,'','2015-10-03 10:11:33'),(5344,'MAIN_DEFAULT_WORKING_DAYS',1,'1-5','chaine',0,'','2015-10-03 10:11:33'),(5345,'MAIN_DEFAULT_WORKING_HOURS',1,'9-18','chaine',0,'','2015-10-03 10:11:33'),(5346,'MAIN_SHOW_LOGO',1,'1','chaine',0,'','2015-10-03 10:11:33'),(5347,'MAIN_FIRSTNAME_NAME_POSITION',1,'0','chaine',0,'','2015-10-03 10:11:33'),(5348,'MAIN_THEME',1,'eldy','chaine',0,'','2015-10-03 10:11:33'),(5349,'MAIN_SEARCHFORM_CONTACT',1,'1','chaine',0,'','2015-10-03 10:11:33'),(5351,'MAIN_SEARCHFORM_PRODUITSERVICE',1,'1','chaine',0,'','2015-10-03 10:11:33'),(5352,'MAIN_SEARCHFORM_PRODUITSERVICE_SUPPLIER',1,'0','chaine',0,'','2015-10-03 10:11:33'),(5353,'MAIN_SEARCHFORM_ADHERENT',1,'1','chaine',0,'','2015-10-03 10:11:33'),(5354,'MAIN_SEARCHFORM_PROJECT',1,'0','chaine',0,'','2015-10-03 10:11:33'),(5355,'MAIN_HELPCENTER_DISABLELINK',0,'1','chaine',0,'','2015-10-03 10:11:33'),(5356,'MAIN_HOME',1,'__(NoteSomeFeaturesAreDisabled)__
\r\n
\r\n__(SomeTranslationAreUncomplete)__
','chaine',0,'','2015-10-03 10:11:33'),(5357,'MAIN_HELP_DISABLELINK',0,'0','chaine',0,'','2015-10-03 10:11:33'),(5358,'MAIN_BUGTRACK_ENABLELINK',1,'0','chaine',0,'','2015-10-03 10:11:33'),(5359,'THEME_ELDY_USE_HOVER',1,'1','chaine',0,'','2015-10-03 10:11:33'),(5394,'FCKEDITOR_ENABLE_DETAILS',1,'1','yesno',0,'WYSIWIG for products details lines for all entities','2015-11-04 15:27:44'),(5395,'FCKEDITOR_ENABLE_USERSIGN',1,'1','yesno',0,'WYSIWIG for user signature','2015-11-04 15:27:44'),(5396,'FCKEDITOR_ENABLE_MAIL',1,'1','yesno',0,'WYSIWIG for products details lines for all entities','2015-11-04 15:27:44'),(5398,'CATEGORIE_RECURSIV_ADD',1,'','yesno',0,'Affect parent categories','2015-11-04 15:27:46'),(5403,'MAIN_MODULE_FCKEDITOR',1,'1',NULL,0,NULL,'2015-11-04 15:41:40'),(5404,'MAIN_MODULE_CATEGORIE',1,'1',NULL,0,NULL,'2015-11-04 15:41:43'),(5415,'EXPEDITION_ADDON_PDF_ODT_PATH',1,'DOL_DATA_ROOT/doctemplates/shipment','chaine',0,NULL,'2015-11-15 22:38:28'),(5416,'LIVRAISON_ADDON_PDF_ODT_PATH',1,'DOL_DATA_ROOT/doctemplates/delivery','chaine',0,NULL,'2015-11-15 22:38:28'),(5419,'MAIN_MODULE_CASHDESK',1,'1',NULL,0,NULL,'2015-11-15 22:38:33'),(5426,'MAIN_MODULE_PROJET',1,'1',NULL,0,NULL,'2015-11-15 22:38:44'),(5427,'PROJECT_ADDON_PDF_ODT_PATH',1,'DOL_DATA_ROOT/doctemplates/projects','chaine',0,NULL,'2015-11-15 22:38:44'),(5428,'PROJECT_USE_OPPORTUNIES',1,'1','chaine',0,NULL,'2015-11-15 22:38:44'),(5430,'MAIN_MODULE_EXPORT',1,'1',NULL,0,NULL,'2015-11-15 22:38:56'),(5431,'MAIN_MODULE_IMPORT',1,'1',NULL,0,NULL,'2015-11-15 22:38:58'),(5432,'MAIN_MODULE_MAILING',1,'1',NULL,0,NULL,'2015-11-15 22:39:00'),(5434,'EXPENSEREPORT_ADDON_PDF',1,'standard','chaine',0,'Name of manager to build PDF expense reports documents','2015-11-15 22:39:05'),(5435,'MAIN_MODULE_SALARIES',1,'1',NULL,0,NULL,'2015-11-15 22:39:08'),(5436,'SALARIES_ACCOUNTING_ACCOUNT_PAYMENT',1,'421','chaine',0,NULL,'2015-11-15 22:39:08'),(5437,'SALARIES_ACCOUNTING_ACCOUNT_CHARGE',1,'641','chaine',0,NULL,'2015-11-15 22:39:08'),(5440,'MAIN_MODULE_ADHERENT',1,'1',NULL,0,NULL,'2015-11-15 22:39:17'),(5441,'ADHERENT_ETIQUETTE_TEXT',1,'%FULLNAME%\n%ADDRESS%\n%ZIP% %TOWN%\n%COUNTRY%','texte',0,'Text to print on member address sheets','2015-11-15 22:39:17'),(5443,'MAIN_MODULE_PRELEVEMENT',1,'1',NULL,0,NULL,'2015-11-15 22:39:33'),(5453,'MAIN_MODULE_CONTRAT',1,'1',NULL,0,NULL,'2015-11-15 22:39:52'),(5455,'MAIN_MODULE_FICHEINTER',1,'1',NULL,0,NULL,'2015-11-15 22:39:56'),(5458,'MAIN_MODULE_BOOKMARK',1,'1',NULL,0,NULL,'2015-11-15 22:40:51'),(5459,'MAIN_MODULE_PAYPAL',1,'1',NULL,0,NULL,'2015-11-15 22:41:02'),(5460,'MAIN_MODULE_MARGIN',1,'1',NULL,0,NULL,'2015-11-15 22:41:47'),(5461,'MAIN_MODULE_MARGIN_TABS_0',1,'product:+margin:Margins:margins:$user->rights->margins->liretous:/margin/tabs/productMargins.php?id=__ID__','chaine',0,NULL,'2015-11-15 22:41:47'),(5462,'MAIN_MODULE_MARGIN_TABS_1',1,'thirdparty:+margin:Margins:margins:empty($user->societe_id) && $user->rights->margins->liretous && ($object->client > 0):/margin/tabs/thirdpartyMargins.php?socid=__ID__','chaine',0,NULL,'2015-11-15 22:41:47'),(5463,'MAIN_MODULE_PROPALE',1,'1',NULL,0,NULL,'2015-11-15 22:41:47'),(5483,'GENBARCODE_BARCODETYPE_THIRDPARTY',1,'6','chaine',0,'','2016-01-16 15:49:43'),(5484,'PRODUIT_DEFAULT_BARCODE_TYPE',1,'2','chaine',0,'','2016-01-16 15:49:46'),(5539,'PRODUCT_USE_OLD_PATH_FOR_PHOTO',0,'0','chaine',1,'Use old path for products images','2016-01-22 13:34:23'),(5541,'MODULE_GOOGLE_DEBUG',1,'0','chaine',1,'','2016-01-22 13:34:57'),(5548,'MAIN_MODULE_ECM',1,'1',NULL,0,NULL,'2016-01-22 17:26:43'),(5551,'MAIN_MODULE_HOLIDAY',1,'1',NULL,0,NULL,'2016-01-22 17:26:43'),(5552,'MAIN_MODULE_HOLIDAY_TABS_0',1,'user:+paidholidays:CPTitreMenu:holiday:$user->rights->holiday->read:/holiday/list.php?mainmenu=holiday&id=__ID__','chaine',0,NULL,'2016-01-22 17:26:43'),(5555,'MAIN_MODULE_SERVICE',1,'1',NULL,0,NULL,'2016-01-22 17:26:43'),(5586,'MAIN_DELAY_EXPENSEREPORTS_TO_PAY',1,'31','chaine',0,'Tolérance de retard avant alerte (en jours) sur les notes de frais impayées','2016-01-22 17:28:18'),(5587,'MAIN_FIX_FOR_BUGGED_MTA',1,'1','chaine',1,'Set constant to fix email ending from PHP with some linux ike system','2016-01-22 17:28:18'),(5589,'MAIN_MODULE_USER',0,'1',NULL,0,NULL,'2016-01-22 17:28:42'),(5590,'MAIN_VERSION_LAST_INSTALL',0,'3.8.3','chaine',0,'Dolibarr version when install','2016-01-22 17:28:42'),(5604,'MAIN_INFO_SOCIETE_LOGO',1,'mybigcompany.png','chaine',0,'','2016-01-22 17:33:49'),(5605,'MAIN_INFO_SOCIETE_LOGO_SMALL',1,'mybigcompany_small.png','chaine',0,'','2016-01-22 17:33:49'),(5606,'MAIN_INFO_SOCIETE_LOGO_MINI',1,'mybigcompany_mini.png','chaine',0,'','2016-01-22 17:33:49'),(5612,'MAIN_ENABLE_LOG_TO_HTML',0,'0','chaine',1,'If this option is set to 1, it is possible to see log output at end of HTML sources by adding paramater logtohtml=1 on URL','2016-03-13 10:54:45'),(5614,'MAIN_SIZE_SHORTLISTE_LIMIT',1,'4','chaine',0,'Longueur maximum des listes courtes (fiche client)','2016-03-13 10:54:46'),(5626,'MAIN_MODULE_SUPPLIERPROPOSAL',1,'1',NULL,0,NULL,'2016-07-30 11:13:20'),(5627,'SUPPLIER_PROPOSAL_ADDON_PDF',1,'aurore','chaine',0,'Name of submodule to generate PDF for supplier quotation request','2016-07-30 11:13:20'),(5628,'SUPPLIER_PROPOSAL_ADDON',1,'mod_supplier_proposal_marbre','chaine',0,'Name of submodule to number supplier quotation request','2016-07-30 11:13:20'),(5629,'SUPPLIER_PROPOSAL_ADDON_PDF_ODT_PATH',1,'DOL_DATA_ROOT/doctemplates/supplier_proposal','chaine',0,NULL,'2016-07-30 11:13:20'),(5632,'MAIN_MODULE_RESOURCE',1,'1',NULL,0,NULL,'2016-07-30 11:13:32'),(5633,'MAIN_MODULE_API',1,'1',NULL,0,NULL,'2016-07-30 11:13:54'),(5634,'MAIN_MODULE_WEBSERVICES',1,'1',NULL,0,NULL,'2016-07-30 11:13:56'),(5635,'WEBSERVICES_KEY',1,'dolibarrkey','chaine',0,'','2016-07-30 11:14:04'),(5638,'MAIN_MODULE_EXTERNALRSS',1,'1',NULL,0,NULL,'2016-07-30 11:15:04'),(5639,'EXTERNAL_RSS_TITLE_1',1,'Dolibarr.org News','chaine',0,'','2016-07-30 11:15:25'),(5640,'EXTERNAL_RSS_URLRSS_1',1,'https://www.dolibarr.org/rss','chaine',0,'','2016-07-30 11:15:25'),(5641,'MAIN_MODULE_DON',1,'1',NULL,0,NULL,'2016-07-30 11:16:22'),(5642,'SOCIETE_CODECOMPTA_ADDON',1,'mod_codecompta_aquarium','chaine',0,'','2016-07-30 11:16:42'),(5707,'CASHDESK_NO_DECREASE_STOCK',1,'1','chaine',0,'','2016-07-30 13:38:11'),(5708,'MAIN_MODULE_PRODUCTBATCH',1,'1',NULL,0,NULL,'2016-07-30 13:38:11'),(5710,'MAIN_MODULE_STOCK',1,'1',NULL,0,NULL,'2016-07-30 13:38:11'),(5711,'MAIN_MODULE_PRODUCT',1,'1',NULL,0,NULL,'2016-07-30 13:38:11'),(5712,'MAIN_MODULE_EXPEDITION',1,'1',NULL,0,NULL,'2016-07-30 13:38:11'),(5713,'MAIN_MODULE_COMMANDE',1,'1',NULL,0,NULL,'2016-07-30 13:38:11'),(5715,'MAIN_MODULE_FOURNISSEUR',1,'1',NULL,0,NULL,'2016-07-30 13:38:11'),(5765,'MAIN_MODULE_AGENDA',1,'1',NULL,0,NULL,'2016-07-30 15:42:32'),(5808,'MARGIN_TYPE',1,'costprice','chaine',0,'','2016-07-30 16:32:18'),(5809,'DISPLAY_MARGIN_RATES',1,'1','chaine',0,'','2016-07-30 16:32:20'),(5810,'MAIN_FEATURES_LEVEL',0,'0','chaine',1,'Level of features to show (0=stable only, 1=stable+experimental, 2=stable+experimental+development','2016-07-30 18:36:15'),(5812,'MAIN_MODULE_OPENSURVEY',1,'1',NULL,0,NULL,'2016-07-30 19:04:07'),(5813,'USER_PASSWORD_PATTERN',1,'8;1;1;1;3;1','chaine',0,'','2016-07-31 16:04:58'),(5814,'MAIN_MODULE_EXPENSEREPORT',1,'1',NULL,0,NULL,'2016-07-31 21:14:32'),(5817,'MAIN_SIZE_SHORTLIST_LIMIT',1,'3','chaine',0,'Max length for small lists (tabs)','2016-12-12 10:54:09'),(5830,'LOAN_ACCOUNTING_ACCOUNT_CAPITAL',1,'164','chaine',0,NULL,'2017-01-29 15:11:51'),(5831,'LOAN_ACCOUNTING_ACCOUNT_INSURANCE',1,'6162','chaine',0,NULL,'2017-01-29 15:11:51'),(5833,'ACCOUNTING_EXPORT_SEPARATORCSV',1,',','string',0,NULL,'2017-01-29 15:11:56'),(5834,'ACCOUNTING_ACCOUNT_SUSPENSE',1,'471','chaine',0,NULL,'2017-01-29 15:11:56'),(5835,'ACCOUNTING_SELL_JOURNAL',1,'VTE','chaine',0,NULL,'2017-01-29 15:11:56'),(5836,'ACCOUNTING_PURCHASE_JOURNAL',1,'ACH','chaine',0,NULL,'2017-01-29 15:11:56'),(5837,'ACCOUNTING_SOCIAL_JOURNAL',1,'SOC','chaine',0,NULL,'2017-01-29 15:11:56'),(5838,'ACCOUNTING_MISCELLANEOUS_JOURNAL',1,'OD','chaine',0,NULL,'2017-01-29 15:11:56'),(5839,'ACCOUNTING_ACCOUNT_TRANSFER_CASH',1,'58','chaine',0,NULL,'2017-01-29 15:11:56'),(5840,'CHARTOFACCOUNTS',1,'2','chaine',0,NULL,'2017-01-29 15:11:56'),(5841,'ACCOUNTING_EXPORT_MODELCSV',1,'1','chaine',0,NULL,'2017-01-29 15:11:56'),(5842,'ACCOUNTING_LENGTH_GACCOUNT',1,'','chaine',0,NULL,'2017-01-29 15:11:56'),(5843,'ACCOUNTING_LENGTH_AACCOUNT',1,'','chaine',0,NULL,'2017-01-29 15:11:56'),(5844,'ACCOUNTING_LIST_SORT_VENTILATION_TODO',1,'1','yesno',0,NULL,'2017-01-29 15:11:56'),(5845,'ACCOUNTING_LIST_SORT_VENTILATION_DONE',1,'1','yesno',0,NULL,'2017-01-29 15:11:56'),(5846,'ACCOUNTING_EXPORT_DATE',1,'%d%m%Y','chaine',0,NULL,'2017-01-29 15:11:56'),(5847,'ACCOUNTING_EXPENSEREPORT_JOURNAL',1,'ER','chaine',0,NULL,'2017-01-29 15:11:56'),(5848,'ACCOUNTING_EXPORT_FORMAT',1,'csv','chaine',0,NULL,'2017-01-29 15:11:56'),(5853,'MAIN_MODULE_WORKFLOW',1,'1',NULL,0,NULL,'2017-01-29 15:12:12'),(5854,'MAIN_MODULE_NOTIFICATION',1,'1',NULL,0,NULL,'2017-01-29 15:12:35'),(5855,'MAIN_MODULE_OAUTH',1,'1',NULL,0,NULL,'2017-01-29 15:12:41'),(5856,'MAIN_MODULE_PRINTING',1,'1',NULL,0,NULL,'2017-01-29 15:12:44'),(5864,'MAIN_INFO_SOCIETE_TEL',1,'09123123','chaine',0,'','2017-01-29 15:13:51'),(5865,'MAIN_INFO_SOCIETE_FAX',1,'09123124','chaine',0,'','2017-01-29 15:13:51'),(5866,'MAIN_INFO_SOCIETE_MAIL',1,'myemail@mybigcompany.com','chaine',0,'','2017-01-29 15:13:51'),(5867,'MAIN_INFO_SOCIETE_WEB',1,'https://www.dolibarr.org','chaine',0,'','2017-01-29 15:13:51'),(5868,'MAIN_INFO_SOCIETE_NOTE',1,'This is note about my company','chaine',0,'','2017-01-29 15:13:51'),(5869,'MAIN_INFO_SOCIETE_GENCOD',1,'1234567890','chaine',0,'','2017-01-29 15:13:51'),(5870,'MAIN_INFO_SOCIETE_MANAGERS',1,'Zack Zeceo','chaine',0,'','2017-01-29 15:13:51'),(5871,'MAIN_INFO_CAPITAL',1,'10000','chaine',0,'','2017-01-29 15:13:51'),(5872,'MAIN_INFO_SOCIETE_FORME_JURIDIQUE',1,'0','chaine',0,'','2017-01-29 15:13:51'),(5873,'MAIN_INFO_SIREN',1,'123456','chaine',0,'','2017-01-29 15:13:51'),(5874,'MAIN_INFO_TVAINTRA',1,'FR1234567','chaine',0,'','2017-01-29 15:13:51'),(5875,'MAIN_INFO_SOCIETE_OBJECT',1,'A company demo to show how Dolibarr ERP CRM is wonderfull','chaine',0,'','2017-01-29 15:13:51'),(5876,'SOCIETE_FISCAL_MONTH_START',1,'1','chaine',0,'','2017-01-29 15:13:51'),(5877,'FACTURE_TVAOPTION',1,'1','chaine',0,'','2017-01-29 15:13:51'),(5878,'FACTURE_LOCAL_TAX1_OPTION',1,'localtax1on','chaine',0,'','2017-01-29 15:13:51'),(5879,'MAIN_INFO_VALUE_LOCALTAX1',1,'0','chaine',0,'','2017-01-29 15:13:51'),(5880,'MAIN_INFO_LOCALTAX_CALC1',1,'0','chaine',0,'','2017-01-29 15:13:51'),(5883,'MAILING_LIMIT_SENDBYWEB',0,'15','chaine',1,'Number of targets to defined packet size when sending mass email','2017-01-29 17:36:33'),(5884,'MAIN_MAIL_DEBUG',1,'0','chaine',1,'','2017-01-29 18:53:02'),(5885,'MAIN_SOAP_DEBUG',1,'0','chaine',1,'','2017-01-29 18:53:02'),(5887,'PROJECT_USE_OPPORTUNITIES',1,'1','chaine',0,'','2017-02-01 12:23:56'),(5888,'PROJECT_HIDE_TASKS',1,'1','chaine',0,'','2017-02-01 12:23:56'),(5889,'MAIN_AGENDA_ACTIONAUTO_COMPANY_SENTBYMAIL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5890,'MAIN_AGENDA_ACTIONAUTO_COMPANY_CREATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5891,'MAIN_AGENDA_ACTIONAUTO_PROPAL_CLOSE_REFUSED',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5892,'MAIN_AGENDA_ACTIONAUTO_PROPAL_CLOSE_SIGNED',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5893,'MAIN_AGENDA_ACTIONAUTO_PROPAL_CLASSIFY_BILLED',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5894,'MAIN_AGENDA_ACTIONAUTO_PROPAL_VALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5895,'MAIN_AGENDA_ACTIONAUTO_PROPAL_SENTBYMAIL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5896,'MAIN_AGENDA_ACTIONAUTO_ORDER_VALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5897,'MAIN_AGENDA_ACTIONAUTO_ORDER_CLOSE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5898,'MAIN_AGENDA_ACTIONAUTO_ORDER_CANCEL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5899,'MAIN_AGENDA_ACTIONAUTO_ORDER_SENTBYMAIL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5900,'MAIN_AGENDA_ACTIONAUTO_ORDER_CLASSIFY_BILLED',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5901,'MAIN_AGENDA_ACTIONAUTO_BILL_VALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5902,'MAIN_AGENDA_ACTIONAUTO_BILL_PAYED',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5903,'MAIN_AGENDA_ACTIONAUTO_BILL_CANCEL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5904,'MAIN_AGENDA_ACTIONAUTO_BILL_SENTBYMAIL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5905,'MAIN_AGENDA_ACTIONAUTO_BILL_UNVALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5906,'MAIN_AGENDA_ACTIONAUTO_ORDER_SUPPLIER_VALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5907,'MAIN_AGENDA_ACTIONAUTO_ORDER_SUPPLIER_APPROVE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5908,'MAIN_AGENDA_ACTIONAUTO_ORDER_SUPPLIER_RECEIVE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5909,'MAIN_AGENDA_ACTIONAUTO_ORDER_SUPPLIER_SUBMIT',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5910,'MAIN_AGENDA_ACTIONAUTO_ORDER_SUPPLIER_REFUSE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5911,'MAIN_AGENDA_ACTIONAUTO_ORDER_SUPPLIER_CLASSIFY_BILLED',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5912,'MAIN_AGENDA_ACTIONAUTO_ORDER_SUPPLIER_SENTBYMAIL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5913,'MAIN_AGENDA_ACTIONAUTO_BILL_SUPPLIER_UNVALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5914,'MAIN_AGENDA_ACTIONAUTO_BILL_SUPPLIER_VALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5915,'MAIN_AGENDA_ACTIONAUTO_BILL_SUPPLIER_PAYED',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5916,'MAIN_AGENDA_ACTIONAUTO_BILL_SUPPLIER_SENTBYMAIL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5917,'MAIN_AGENDA_ACTIONAUTO_BILL_SUPPLIER_CANCELED',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5918,'MAIN_AGENDA_ACTIONAUTO_CONTRACT_VALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5919,'MAIN_AGENDA_ACTIONAUTO_FICHINTER_REOPEN',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5920,'MAIN_AGENDA_ACTIONAUTO_FICHINTER_SENTBYMAIL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5921,'MAIN_AGENDA_ACTIONAUTO_FICHINTER_VALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5922,'MAIN_AGENDA_ACTIONAUTO_SHIPPING_VALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5923,'MAIN_AGENDA_ACTIONAUTO_SHIPPING_SENTBYMAIL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5924,'MAIN_AGENDA_ACTIONAUTO_MEMBER_VALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5925,'MAIN_AGENDA_ACTIONAUTO_MEMBER_SUBSCRIPTION',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5926,'MAIN_AGENDA_ACTIONAUTO_MEMBER_MODIFY',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5927,'MAIN_AGENDA_ACTIONAUTO_MEMBER_RESILIATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5928,'MAIN_AGENDA_ACTIONAUTO_MEMBER_DELETE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5929,'MAIN_AGENDA_ACTIONAUTO_PROJECT_CREATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5930,'MAIN_AGENDA_ACTIONAUTO_PROJECT_DELETE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5931,'DATABASE_PWD_ENCRYPTED',1,'1','chaine',0,'','2017-02-01 15:06:04'),(5932,'MAIN_DISABLE_ALL_MAILS',1,'0','chaine',0,'','2017-02-01 15:09:09'),(5933,'MAIN_MAIL_SENDMODE',1,'mail','chaine',0,'','2017-02-01 15:09:09'),(5934,'MAIN_MAIL_SMTP_PORT',1,'465','chaine',0,'','2017-02-01 15:09:09'),(5935,'MAIN_MAIL_SMTP_SERVER',1,'smtp.mail.com','chaine',0,'','2017-02-01 15:09:09'),(5936,'MAIN_MAIL_SMTPS_ID',1,'eldy10@mail.com','chaine',0,'','2017-02-01 15:09:09'),(5937,'MAIN_MAIL_SMTPS_PW',1,'bidonge','chaine',0,'','2017-02-01 15:09:09'),(5938,'MAIN_MAIL_EMAIL_FROM',1,'robot@example.com','chaine',0,'','2017-02-01 15:09:09'),(5939,'MAIN_MAIL_DEFAULT_FROMTYPE',1,'user','chaine',0,'','2017-02-01 15:09:09'),(5940,'PRELEVEMENT_ID_BANKACCOUNT',1,'1','chaine',0,'','2017-02-06 04:04:47'),(5941,'PRELEVEMENT_ICS',1,'ICS123456','chaine',0,'','2017-02-06 04:04:47'),(5942,'PRELEVEMENT_USER',1,'1','chaine',0,'','2017-02-06 04:04:47'),(5943,'BANKADDON_PDF',1,'sepamandate','chaine',0,'','2017-02-06 04:13:52'),(5947,'CHEQUERECEIPTS_THYME_MASK',1,'CHK{yy}{mm}-{0000@1}','chaine',0,'','2017-02-06 04:16:27'),(5948,'MAIN_MODULE_LOAN',1,'1',NULL,0,NULL,'2017-02-06 19:19:05'),(5954,'MAIN_SUBMODULE_EXPEDITION',1,'1','chaine',0,'','2017-02-06 23:57:37'),(5960,'MAIN_MODULE_ACCOUNTING',1,'1',NULL,0,NULL,'2017-02-07 18:56:11'),(5963,'MAIN_MODULE_BANQUE',1,'1',NULL,0,NULL,'2017-02-07 18:56:12'),(5964,'MAIN_MODULE_TAX',1,'1',NULL,0,NULL,'2017-02-07 18:56:12'),(5995,'MAIN_MODULE_SOCIETE',1,'1',NULL,0,NULL,'2017-02-12 19:15:56'),(5996,'CABINETMED_RHEUMATOLOGY_ON',1,'0','texte',0,'','2017-02-12 19:20:04'),(5999,'MAIN_SEARCHFORM_SOCIETE',1,'1','texte',0,'','2017-02-12 19:20:04'),(6000,'CABINETMED_BANK_PATIENT_REQUIRED',1,'0','texte',0,'','2017-02-12 19:20:04'),(6004,'MAIN_MODULE_MULTICOMPANY_CSS',1,'[\"\\/multicompany\\/css\\/multicompany.css.php\"]','chaine',0,NULL,'2017-02-15 17:17:11'),(6019,'MAIN_INFO_SOCIETE_COUNTRY',2,'1:FR:France','chaine',0,'','2017-02-15 17:18:22'),(6020,'MAIN_INFO_SOCIETE_NOM',2,'MySecondCompany','chaine',0,'','2017-02-15 17:18:22'),(6021,'MAIN_INFO_SOCIETE_STATE',2,'0','chaine',0,'','2017-02-15 17:18:22'),(6022,'MAIN_MONNAIE',2,'EUR','chaine',0,'','2017-02-15 17:18:22'),(6023,'MAIN_LANG_DEFAULT',2,'auto','chaine',0,'','2017-02-15 17:18:22'),(6024,'MAIN_INFO_SOCIETE_COUNTRY',1,'14:CA:Canada','chaine',0,'','2017-02-15 17:18:41'),(6025,'MAIN_INFO_SOCIETE_NOM',1,'MyBigCompany','chaine',0,'','2017-02-15 17:18:41'),(6026,'MAIN_INFO_SOCIETE_ADDRESS',1,'21 Jump street','chaine',0,'','2017-02-15 17:18:41'),(6027,'MAIN_INFO_SOCIETE_TOWN',1,'MyTown','chaine',0,'','2017-02-15 17:18:41'),(6028,'MAIN_INFO_SOCIETE_ZIP',1,'75500','chaine',0,'','2017-02-15 17:18:41'),(6029,'MAIN_INFO_SOCIETE_STATE',1,'1514','chaine',0,'','2017-02-15 17:18:41'),(6030,'MAIN_MONNAIE',1,'EUR','chaine',0,'','2017-02-15 17:18:41'),(6031,'MAIN_LANG_DEFAULT',1,'auto','chaine',0,'','2017-02-15 17:18:41'),(6032,'MAIN_MODULE_MULTICURRENCY',1,'1',NULL,0,NULL,'2017-02-15 17:29:59'),(6047,'MAIN_MODULE_SYSLOG',0,'1',NULL,0,NULL,'2017-02-15 22:36:58'),(6048,'SYSLOG_FACILITY',0,'LOG_USER','chaine',0,'','2017-02-15 22:37:01'),(6049,'SYSLOG_FIREPHP_INCLUDEPATH',0,'/home/ldestailleur/git/dolibarr_5.0/htdocs/includes/firephp/firephp-core/lib/','chaine',0,'','2017-02-15 22:37:01'),(6050,'SYSLOG_FILE',0,'DOL_DATA_ROOT/dolibarr.log','chaine',0,'','2017-02-15 22:37:01'),(6051,'SYSLOG_CHROMEPHP_INCLUDEPATH',0,'/home/ldestailleur/git/dolibarr_5.0/htdocs/includes/ccampbell/chromephp/','chaine',0,'','2017-02-15 22:37:01'),(6052,'SYSLOG_HANDLERS',0,'[\"mod_syslog_file\"]','chaine',0,'','2017-02-15 22:37:01'),(6054,'SYSLOG_LEVEL',0,'7','chaine',0,'','2017-02-15 22:37:21'),(6074,'CABINETMED_DELAY_TO_LOCK_RECORD',1,'','chaine',1,'Number of days before locking edit of consultation','2017-02-21 00:04:15'),(6087,'MAIN_MODULE_BARCODE',1,'1',NULL,0,NULL,'2017-02-21 11:03:40'),(6088,'MAIN_MODULE_CRON',1,'1',NULL,0,NULL,'2017-02-21 11:03:40'),(6089,'MAIN_MODULE_FACTURE',1,'1',NULL,0,NULL,'2017-02-21 11:03:40'),(6090,'MAIN_VERSION_LAST_UPGRADE',0,'5.0.0','chaine',0,'Dolibarr version for last upgrade','2017-02-21 11:03:42'); +INSERT INTO `llx_const` VALUES (8,'MAIN_UPLOAD_DOC',0,'2048','chaine',0,'Max size for file upload (0 means no upload allowed)','2010-07-08 11:17:57'),(9,'MAIN_SEARCHFORM_SOCIETE',0,'1','yesno',0,'Show form for quick company search','2010-07-08 11:17:57'),(10,'MAIN_SEARCHFORM_CONTACT',0,'1','yesno',0,'Show form for quick contact search','2010-07-08 11:17:57'),(11,'MAIN_SEARCHFORM_PRODUITSERVICE',0,'1','yesno',0,'Show form for quick product search','2010-07-08 11:17:58'),(12,'MAIN_SEARCHFORM_ADHERENT',0,'1','yesno',0,'Show form for quick member search','2010-07-08 11:17:58'),(16,'MAIN_SIZE_LISTE_LIMIT',0,'25','chaine',0,'Longueur maximum des listes','2010-07-08 11:17:58'),(17,'MAIN_SHOW_WORKBOARD',0,'1','yesno',0,'Affichage tableau de bord de travail Dolibarr','2010-07-08 11:17:58'),(29,'MAIN_DELAY_NOT_ACTIVATED_SERVICES',1,'0','chaine',0,'Tolérance de retard avant alerte (en jours) sur services à activer','2010-07-08 11:17:58'),(33,'SOCIETE_NOLIST_COURRIER',0,'1','yesno',0,'Liste les fichiers du repertoire courrier','2010-07-08 11:17:58'),(36,'ADHERENT_MAIL_REQUIRED',1,'1','yesno',0,'EMail required to create a new member','2010-07-08 11:17:58'),(37,'ADHERENT_MAIL_FROM',1,'adherents@domain.com','chaine',0,'Sender EMail for automatic emails','2010-07-08 11:17:58'),(38,'ADHERENT_MAIL_RESIL',1,'Your subscription has been resiliated.\r\nWe hope to see you soon again','texte',0,'Mail resiliation','2010-07-08 11:17:58'),(39,'ADHERENT_MAIL_VALID',1,'Your subscription has been validated.\r\nThis is a remind of your personal information :\r\n\r\n%INFOS%\r\n\r\n','texte',0,'Mail de validation','2010-07-08 11:17:59'),(40,'ADHERENT_MAIL_COTIS',1,'Hello %PRENOM%,\r\nThanks for your subscription.\r\nThis email confirms that your subscription has been received and processed.\r\n\r\n','texte',0,'Mail de validation de cotisation','2010-07-08 11:17:59'),(41,'ADHERENT_MAIL_VALID_SUBJECT',1,'Your subscription has been validated','chaine',0,'Sujet du mail de validation','2010-07-08 11:17:59'),(42,'ADHERENT_MAIL_RESIL_SUBJECT',1,'Resiliating your subscription','chaine',0,'Sujet du mail de resiliation','2010-07-08 11:17:59'),(43,'ADHERENT_MAIL_COTIS_SUBJECT',1,'Receipt of your subscription','chaine',0,'Sujet du mail de validation de cotisation','2010-07-08 11:17:59'),(44,'MAILING_EMAIL_FROM',1,'dolibarr@domain.com','chaine',0,'EMail emmetteur pour les envois d emailings','2010-07-08 11:17:59'),(45,'ADHERENT_USE_MAILMAN',1,'0','yesno',0,'Utilisation de Mailman','2010-07-08 11:17:59'),(46,'ADHERENT_MAILMAN_UNSUB_URL',1,'http://lists.domain.com/cgi-bin/mailman/admin/%LISTE%/members?adminpw=%MAILMAN_ADMINPW%&user=%EMAIL%','chaine',0,'Url de desinscription aux listes mailman','2010-07-08 11:17:59'),(47,'ADHERENT_MAILMAN_URL',1,'http://lists.domain.com/cgi-bin/mailman/admin/%LISTE%/members?adminpw=%MAILMAN_ADMINPW%&send_welcome_msg_to_this_batch=1&subscribees=%EMAIL%','chaine',0,'Url pour les inscriptions mailman','2010-07-08 11:17:59'),(48,'ADHERENT_MAILMAN_LISTS',1,'test-test,test-test2','chaine',0,'Listes auxquelles inscrire les nouveaux adherents','2010-07-08 11:17:59'),(49,'ADHERENT_MAILMAN_ADMINPW',1,'','chaine',0,'Mot de passe Admin des liste mailman','2010-07-08 11:17:59'),(50,'ADHERENT_MAILMAN_SERVER',1,'lists.domain.com','chaine',0,'Serveur hebergeant les interfaces d Admin des listes mailman','2010-07-08 11:17:59'),(51,'ADHERENT_MAILMAN_LISTS_COTISANT',1,'','chaine',0,'Liste(s) auxquelles les nouveaux cotisants sont inscris automatiquement','2010-07-08 11:17:59'),(52,'ADHERENT_USE_SPIP',1,'0','yesno',0,'Utilisation de SPIP ?','2010-07-08 11:17:59'),(53,'ADHERENT_USE_SPIP_AUTO',1,'0','yesno',0,'Utilisation de SPIP automatiquement','2010-07-08 11:17:59'),(54,'ADHERENT_SPIP_USER',1,'user','chaine',0,'user spip','2010-07-08 11:17:59'),(55,'ADHERENT_SPIP_PASS',1,'pass','chaine',0,'Pass de connection','2010-07-08 11:17:59'),(56,'ADHERENT_SPIP_SERVEUR',1,'localhost','chaine',0,'serveur spip','2010-07-08 11:17:59'),(57,'ADHERENT_SPIP_DB',1,'spip','chaine',0,'db spip','2010-07-08 11:17:59'),(58,'ADHERENT_CARD_HEADER_TEXT',1,'%ANNEE%','chaine',0,'Texte imprime sur le haut de la carte adherent','2010-07-08 11:17:59'),(59,'ADHERENT_CARD_FOOTER_TEXT',1,'Association AZERTY','chaine',0,'Texte imprime sur le bas de la carte adherent','2010-07-08 11:17:59'),(61,'FCKEDITOR_ENABLE_USER',1,'1','yesno',0,'Activation fckeditor sur notes utilisateurs','2010-07-08 11:17:59'),(62,'FCKEDITOR_ENABLE_SOCIETE',1,'1','yesno',0,'Activation fckeditor sur notes societe','2010-07-08 11:17:59'),(63,'FCKEDITOR_ENABLE_PRODUCTDESC',1,'1','yesno',0,'Activation fckeditor sur notes produits','2010-07-08 11:17:59'),(64,'FCKEDITOR_ENABLE_MEMBER',1,'1','yesno',0,'Activation fckeditor sur notes adherent','2010-07-08 11:17:59'),(65,'FCKEDITOR_ENABLE_MAILING',1,'1','yesno',0,'Activation fckeditor sur emailing','2010-07-08 11:17:59'),(67,'DON_ADDON_MODEL',1,'html_cerfafr','chaine',0,'','2010-07-08 11:18:00'),(68,'PROPALE_ADDON',1,'mod_propale_marbre','chaine',0,'','2010-07-08 11:18:00'),(69,'PROPALE_ADDON_PDF',1,'azur','chaine',0,'','2010-07-08 11:18:00'),(70,'COMMANDE_ADDON',1,'mod_commande_marbre','chaine',0,'','2010-07-08 11:18:00'),(71,'COMMANDE_ADDON_PDF',1,'einstein','chaine',0,'','2010-07-08 11:18:00'),(72,'COMMANDE_SUPPLIER_ADDON',1,'mod_commande_fournisseur_muguet','chaine',0,'','2010-07-08 11:18:00'),(73,'COMMANDE_SUPPLIER_ADDON_PDF',1,'muscadet','chaine',0,'','2010-07-08 11:18:00'),(74,'EXPEDITION_ADDON',1,'enlevement','chaine',0,'','2010-07-08 11:18:00'),(76,'FICHEINTER_ADDON',1,'pacific','chaine',0,'','2010-07-08 11:18:00'),(77,'FICHEINTER_ADDON_PDF',1,'soleil','chaine',0,'','2010-07-08 11:18:00'),(79,'FACTURE_ADDON_PDF',1,'crabe','chaine',0,'','2010-07-08 11:18:00'),(80,'PROPALE_VALIDITY_DURATION',1,'15','chaine',0,'Durée de validitée des propales','2010-07-08 11:18:00'),(230,'COMPANY_ADDON_PDF_ODT_PATH',1,'DOL_DATA_ROOT/doctemplates/thirdparties','chaine',0,NULL,'2010-07-08 11:26:20'),(238,'LIVRAISON_ADDON_PDF',1,'typhon','chaine',0,'Nom du gestionnaire de generation des commandes en PDF','2010-07-08 11:26:27'),(239,'LIVRAISON_ADDON_NUMBER',1,'mod_livraison_jade','chaine',0,'Nom du gestionnaire de numerotation des bons de livraison','2013-03-20 13:17:36'),(245,'FACTURE_ADDON_PDF_ODT_PATH',1,'DOL_DATA_ROOT/doctemplates/invoices','chaine',0,NULL,'2010-07-08 11:28:53'),(249,'DON_FORM',1,'fsfe.fr.php','chaine',0,'Nom du gestionnaire de formulaire de dons','2010-07-08 11:29:00'),(253,'ADHERENT_BANK_USE_AUTO',1,'','yesno',0,'Insertion automatique des cotisation dans le compte banquaire','2010-07-08 11:29:05'),(254,'ADHERENT_BANK_ACCOUNT',1,'','chaine',0,'ID du Compte banquaire utilise','2010-07-08 11:29:05'),(255,'ADHERENT_BANK_CATEGORIE',1,'','chaine',0,'ID de la categorie banquaire des cotisations','2010-07-08 11:29:05'),(256,'ADHERENT_ETIQUETTE_TYPE',1,'L7163','chaine',0,'Type d etiquette (pour impression de planche d etiquette)','2010-07-08 11:29:05'),(269,'PROJECT_ADDON_PDF',1,'baleine','chaine',0,'Nom du gestionnaire de generation des projets en PDF','2010-07-08 11:29:33'),(270,'PROJECT_ADDON',1,'mod_project_simple','chaine',0,'Nom du gestionnaire de numerotation des projets','2010-07-08 11:29:33'),(368,'STOCK_USERSTOCK_AUTOCREATE',1,'1','chaine',0,'','2010-07-08 22:44:59'),(369,'EXPEDITION_ADDON_PDF',1,'merou','chaine',0,'','2010-07-08 22:58:07'),(377,'FACTURE_ADDON',1,'mod_facture_terre','chaine',0,'','2010-07-08 23:08:12'),(380,'ADHERENT_CARD_TEXT',1,'%TYPE% n° %ID%\r\n%PRENOM% %NOM%\r\n<%EMAIL%>\r\n%ADRESSE%\r\n%CP% %VILLE%\r\n%PAYS%','',0,'Texte imprime sur la carte adherent','2010-07-08 23:14:46'),(381,'ADHERENT_CARD_TEXT_RIGHT',1,'aaa','',0,'','2010-07-08 23:14:55'),(385,'PRODUIT_USE_SEARCH_TO_SELECT',1,'1','chaine',0,'','2010-07-08 23:22:19'),(386,'STOCK_CALCULATE_ON_SHIPMENT',1,'1','chaine',0,'','2010-07-08 23:23:21'),(387,'STOCK_CALCULATE_ON_SUPPLIER_DISPATCH_ORDER',1,'1','chaine',0,'','2010-07-08 23:23:26'),(392,'MAIN_AGENDA_XCAL_EXPORTKEY',1,'dolibarr','chaine',0,'','2010-07-08 23:27:50'),(393,'MAIN_AGENDA_EXPORT_PAST_DELAY',1,'100','chaine',0,'','2010-07-08 23:27:50'),(610,'CASHDESK_ID_THIRDPARTY',1,'7','chaine',0,'','2010-07-11 17:08:18'),(611,'CASHDESK_ID_BANKACCOUNT_CASH',1,'3','chaine',0,'','2010-07-11 17:08:18'),(612,'CASHDESK_ID_BANKACCOUNT_CHEQUE',1,'1','chaine',0,'','2010-07-11 17:08:18'),(613,'CASHDESK_ID_BANKACCOUNT_CB',1,'1','chaine',0,'','2010-07-11 17:08:18'),(614,'CASHDESK_ID_WAREHOUSE',1,'2','chaine',0,'','2010-07-11 17:08:18'),(660,'LDAP_USER_DN',1,'ou=users,dc=my-domain,dc=com','chaine',0,NULL,'2010-07-18 10:25:27'),(661,'LDAP_GROUP_DN',1,'ou=groups,dc=my-domain,dc=com','chaine',0,NULL,'2010-07-18 10:25:27'),(662,'LDAP_FILTER_CONNECTION',1,'&(objectClass=user)(objectCategory=person)','chaine',0,NULL,'2010-07-18 10:25:27'),(663,'LDAP_FIELD_LOGIN',1,'uid','chaine',0,NULL,'2010-07-18 10:25:27'),(664,'LDAP_FIELD_FULLNAME',1,'cn','chaine',0,NULL,'2010-07-18 10:25:27'),(665,'LDAP_FIELD_NAME',1,'sn','chaine',0,NULL,'2010-07-18 10:25:27'),(666,'LDAP_FIELD_FIRSTNAME',1,'givenname','chaine',0,NULL,'2010-07-18 10:25:27'),(667,'LDAP_FIELD_MAIL',1,'mail','chaine',0,NULL,'2010-07-18 10:25:27'),(668,'LDAP_FIELD_PHONE',1,'telephonenumber','chaine',0,NULL,'2010-07-18 10:25:27'),(669,'LDAP_FIELD_FAX',1,'facsimiletelephonenumber','chaine',0,NULL,'2010-07-18 10:25:27'),(670,'LDAP_FIELD_MOBILE',1,'mobile','chaine',0,NULL,'2010-07-18 10:25:27'),(671,'LDAP_SERVER_TYPE',1,'openldap','chaine',0,'','2010-07-18 10:25:46'),(672,'LDAP_SERVER_PROTOCOLVERSION',1,'3','chaine',0,'','2010-07-18 10:25:47'),(673,'LDAP_SERVER_HOST',1,'localhost','chaine',0,'','2010-07-18 10:25:47'),(674,'LDAP_SERVER_PORT',1,'389','chaine',0,'','2010-07-18 10:25:47'),(675,'LDAP_SERVER_USE_TLS',1,'0','chaine',0,'','2010-07-18 10:25:47'),(676,'LDAP_SYNCHRO_ACTIVE',1,'dolibarr2ldap','chaine',0,'','2010-07-18 10:25:47'),(677,'LDAP_CONTACT_ACTIVE',1,'1','chaine',0,'','2010-07-18 10:25:47'),(678,'LDAP_MEMBER_ACTIVE',1,'1','chaine',0,'','2010-07-18 10:25:47'),(974,'MAIN_MODULE_WORKFLOW_TRIGGERS',1,'1','chaine',0,NULL,'2011-07-18 18:02:20'),(975,'WORKFLOW_PROPAL_AUTOCREATE_ORDER',1,'1','chaine',0,'','2011-07-18 18:02:24'),(980,'PRELEVEMENT_NUMERO_NATIONAL_EMETTEUR',1,'1234567','chaine',0,'','2011-07-18 18:05:50'),(983,'FACTURE_RIB_NUMBER',1,'1','chaine',0,'','2011-07-18 18:35:14'),(984,'FACTURE_CHQ_NUMBER',1,'1','chaine',0,'','2011-07-18 18:35:14'),(1016,'GOOGLE_DUPLICATE_INTO_GCAL',1,'1','chaine',0,'','2011-07-18 21:40:20'),(1152,'SOCIETE_CODECLIENT_ADDON',1,'mod_codeclient_monkey','chaine',0,'','2011-07-29 20:50:02'),(1231,'MAIN_UPLOAD_DOC',1,'2048','chaine',0,'','2011-07-29 21:04:00'),(1234,'MAIN_UMASK',1,'0664','chaine',0,'','2011-07-29 21:04:11'),(1240,'MAIN_LOGEVENTS_USER_LOGIN',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1241,'MAIN_LOGEVENTS_USER_LOGIN_FAILED',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1242,'MAIN_LOGEVENTS_USER_LOGOUT',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1243,'MAIN_LOGEVENTS_USER_CREATE',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1244,'MAIN_LOGEVENTS_USER_MODIFY',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1245,'MAIN_LOGEVENTS_USER_NEW_PASSWORD',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1246,'MAIN_LOGEVENTS_USER_ENABLEDISABLE',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1247,'MAIN_LOGEVENTS_USER_DELETE',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1248,'MAIN_LOGEVENTS_GROUP_CREATE',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1249,'MAIN_LOGEVENTS_GROUP_MODIFY',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1250,'MAIN_LOGEVENTS_GROUP_DELETE',1,'1','chaine',0,'','2011-07-29 21:05:01'),(1251,'MAIN_BOXES_MAXLINES',1,'5','',0,'','2011-07-29 21:05:42'),(1482,'EXPEDITION_ADDON_NUMBER',1,'mod_expedition_safor','chaine',0,'Nom du gestionnaire de numerotation des expeditions','2011-08-05 17:53:11'),(1490,'CONTRACT_ADDON',1,'mod_contract_serpis','chaine',0,'Nom du gestionnaire de numerotation des contrats','2011-08-05 18:11:58'),(1677,'COMMANDE_ADDON_PDF_ODT_PATH',1,'DOL_DATA_ROOT/doctemplates/orders','chaine',0,NULL,'2012-12-08 13:11:02'),(1698,'PRODUCT_CODEPRODUCT_ADDON',1,'mod_codeproduct_leopard','yesno',0,'Module to control product codes','2012-12-08 13:11:25'),(1724,'PROPALE_ADDON_PDF_ODT_PATH',1,'DOL_DATA_ROOT/doctemplates/proposals','chaine',0,NULL,'2012-12-08 13:17:14'),(1730,'OPENSTREETMAP_ENABLE_MAPS',1,'1','chaine',0,'','2012-12-08 13:22:47'),(1731,'OPENSTREETMAP_ENABLE_MAPS_CONTACTS',1,'1','chaine',0,'','2012-12-08 13:22:47'),(1732,'OPENSTREETMAP_ENABLE_MAPS_MEMBERS',1,'1','chaine',0,'','2012-12-08 13:22:47'),(1733,'OPENSTREETMAP_MAPS_ZOOM_LEVEL',1,'15','chaine',0,'','2012-12-08 13:22:47'),(1742,'MAIN_MAIL_EMAIL_FROM',2,'dolibarr-robot@domain.com','chaine',0,'EMail emetteur pour les emails automatiques Dolibarr','2012-12-08 14:08:14'),(1743,'MAIN_MENU_STANDARD',2,'eldy_menu.php','chaine',0,'Module de gestion de la barre de menu du haut pour utilisateurs internes','2013-02-11 19:43:54'),(1744,'MAIN_MENUFRONT_STANDARD',2,'eldy_menu.php','chaine',0,'Module de gestion de la barre de menu du haut pour utilisateurs externes','2013-02-11 19:43:54'),(1745,'MAIN_MENU_SMARTPHONE',2,'iphone_backoffice.php','chaine',0,'Module de gestion de la barre de menu smartphone pour utilisateurs internes','2012-12-08 14:08:14'),(1746,'MAIN_MENUFRONT_SMARTPHONE',2,'iphone_frontoffice.php','chaine',0,'Module de gestion de la barre de menu smartphone pour utilisateurs externes','2012-12-08 14:08:14'),(1747,'MAIN_THEME',2,'eldy','chaine',0,'Default theme','2012-12-08 14:08:14'),(1748,'MAIN_DELAY_ACTIONS_TODO',2,'7','chaine',0,'Tolérance de retard avant alerte (en jours) sur actions planifiées non réalisées','2012-12-08 14:08:14'),(1749,'MAIN_DELAY_ORDERS_TO_PROCESS',2,'2','chaine',0,'Tolérance de retard avant alerte (en jours) sur commandes clients non traitées','2012-12-08 14:08:14'),(1750,'MAIN_DELAY_SUPPLIER_ORDERS_TO_PROCESS',2,'7','chaine',0,'Tolérance de retard avant alerte (en jours) sur commandes fournisseurs non traitées','2012-12-08 14:08:14'),(1751,'MAIN_DELAY_PROPALS_TO_CLOSE',2,'31','chaine',0,'Tolérance de retard avant alerte (en jours) sur propales à cloturer','2012-12-08 14:08:14'),(1752,'MAIN_DELAY_PROPALS_TO_BILL',2,'7','chaine',0,'Tolérance de retard avant alerte (en jours) sur propales non facturées','2012-12-08 14:08:14'),(1753,'MAIN_DELAY_CUSTOMER_BILLS_UNPAYED',2,'31','chaine',0,'Tolérance de retard avant alerte (en jours) sur factures client impayées','2012-12-08 14:08:14'),(1754,'MAIN_DELAY_SUPPLIER_BILLS_TO_PAY',2,'2','chaine',0,'Tolérance de retard avant alerte (en jours) sur factures fournisseur impayées','2012-12-08 14:08:14'),(1755,'MAIN_DELAY_NOT_ACTIVATED_SERVICES',2,'0','chaine',0,'Tolérance de retard avant alerte (en jours) sur services à activer','2012-12-08 14:08:14'),(1756,'MAIN_DELAY_RUNNING_SERVICES',2,'0','chaine',0,'Tolérance de retard avant alerte (en jours) sur services expirés','2012-12-08 14:08:14'),(1757,'MAIN_DELAY_MEMBERS',2,'31','chaine',0,'Tolérance de retard avant alerte (en jours) sur cotisations adhérent en retard','2012-12-08 14:08:14'),(1758,'MAIN_DELAY_TRANSACTIONS_TO_CONCILIATE',2,'62','chaine',0,'Tolérance de retard avant alerte (en jours) sur rapprochements bancaires à faire','2012-12-08 14:08:14'),(1759,'MAILING_EMAIL_FROM',2,'dolibarr@domain.com','chaine',0,'EMail emmetteur pour les envois d emailings','2012-12-08 14:08:14'),(1760,'MAIN_INFO_SOCIETE_COUNTRY',3,'1:FR:France','chaine',0,'','2013-02-26 21:56:28'),(1761,'MAIN_INFO_SOCIETE_NOM',3,'bbb','chaine',0,'','2012-12-08 14:08:20'),(1762,'MAIN_INFO_SOCIETE_STATE',3,'0','chaine',0,'','2013-02-27 14:20:27'),(1763,'MAIN_MONNAIE',3,'EUR','chaine',0,'','2012-12-08 14:08:20'),(1764,'MAIN_LANG_DEFAULT',3,'auto','chaine',0,'','2012-12-08 14:08:20'),(1765,'MAIN_MAIL_EMAIL_FROM',3,'dolibarr-robot@domain.com','chaine',0,'EMail emetteur pour les emails automatiques Dolibarr','2012-12-08 14:08:20'),(1766,'MAIN_MENU_STANDARD',3,'eldy_menu.php','chaine',0,'Module de gestion de la barre de menu du haut pour utilisateurs internes','2013-02-11 19:43:54'),(1767,'MAIN_MENUFRONT_STANDARD',3,'eldy_menu.php','chaine',0,'Module de gestion de la barre de menu du haut pour utilisateurs externes','2013-02-11 19:43:54'),(1768,'MAIN_MENU_SMARTPHONE',3,'iphone_backoffice.php','chaine',0,'Module de gestion de la barre de menu smartphone pour utilisateurs internes','2012-12-08 14:08:20'),(1769,'MAIN_MENUFRONT_SMARTPHONE',3,'iphone_frontoffice.php','chaine',0,'Module de gestion de la barre de menu smartphone pour utilisateurs externes','2012-12-08 14:08:20'),(1770,'MAIN_THEME',3,'eldy','chaine',0,'Default theme','2012-12-08 14:08:20'),(1771,'MAIN_DELAY_ACTIONS_TODO',3,'7','chaine',0,'Tolérance de retard avant alerte (en jours) sur actions planifiées non réalisées','2012-12-08 14:08:20'),(1772,'MAIN_DELAY_ORDERS_TO_PROCESS',3,'2','chaine',0,'Tolérance de retard avant alerte (en jours) sur commandes clients non traitées','2012-12-08 14:08:20'),(1773,'MAIN_DELAY_SUPPLIER_ORDERS_TO_PROCESS',3,'7','chaine',0,'Tolérance de retard avant alerte (en jours) sur commandes fournisseurs non traitées','2012-12-08 14:08:20'),(1774,'MAIN_DELAY_PROPALS_TO_CLOSE',3,'31','chaine',0,'Tolérance de retard avant alerte (en jours) sur propales à cloturer','2012-12-08 14:08:20'),(1775,'MAIN_DELAY_PROPALS_TO_BILL',3,'7','chaine',0,'Tolérance de retard avant alerte (en jours) sur propales non facturées','2012-12-08 14:08:20'),(1776,'MAIN_DELAY_CUSTOMER_BILLS_UNPAYED',3,'31','chaine',0,'Tolérance de retard avant alerte (en jours) sur factures client impayées','2012-12-08 14:08:20'),(1777,'MAIN_DELAY_SUPPLIER_BILLS_TO_PAY',3,'2','chaine',0,'Tolérance de retard avant alerte (en jours) sur factures fournisseur impayées','2012-12-08 14:08:20'),(1778,'MAIN_DELAY_NOT_ACTIVATED_SERVICES',3,'0','chaine',0,'Tolérance de retard avant alerte (en jours) sur services à activer','2012-12-08 14:08:20'),(1779,'MAIN_DELAY_RUNNING_SERVICES',3,'0','chaine',0,'Tolérance de retard avant alerte (en jours) sur services expirés','2012-12-08 14:08:20'),(1780,'MAIN_DELAY_MEMBERS',3,'31','chaine',0,'Tolérance de retard avant alerte (en jours) sur cotisations adhérent en retard','2012-12-08 14:08:20'),(1781,'MAIN_DELAY_TRANSACTIONS_TO_CONCILIATE',3,'62','chaine',0,'Tolérance de retard avant alerte (en jours) sur rapprochements bancaires à faire','2012-12-08 14:08:20'),(1782,'MAILING_EMAIL_FROM',3,'dolibarr@domain.com','chaine',0,'EMail emmetteur pour les envois d emailings','2012-12-08 14:08:20'),(1803,'SYSLOG_FILE',1,'DOL_DATA_ROOT/dolibarr.log','chaine',0,'','2012-12-08 14:15:08'),(1804,'SYSLOG_HANDLERS',1,'[\"mod_syslog_file\"]','chaine',0,'','2012-12-08 14:15:08'),(1805,'MAIN_MODULE_SKINCOLOREDITOR',3,'1',NULL,0,NULL,'2012-12-08 14:35:40'),(1806,'MAIN_MODULE_SKINCOLOREDITOR_TABS_0',3,'user:+tabskincoloreditors:ColorEditor:skincoloreditor@skincoloreditor:/skincoloreditor/usercolors.php?id=__ID__','chaine',0,NULL,'2012-12-08 14:35:40'),(1922,'PAYPAL_API_SANDBOX',1,'1','chaine',0,'','2012-12-12 12:11:05'),(1923,'PAYPAL_API_USER',1,'seller_1355312017_biz_api1.nltechno.com','chaine',0,'','2012-12-12 12:11:05'),(1924,'PAYPAL_API_PASSWORD',1,'1355312040','chaine',0,'','2012-12-12 12:11:05'),(1925,'PAYPAL_API_SIGNATURE',1,'AXqqdsWBzvfn0q5iNmbuiDv1y.3EAXIMWyl4C5KvDReR9HDwwAd6dQ4Q','chaine',0,'','2012-12-12 12:11:05'),(1926,'PAYPAL_API_INTEGRAL_OR_PAYPALONLY',1,'integral','chaine',0,'','2012-12-12 12:11:05'),(1927,'PAYPAL_SECURITY_TOKEN',1,'50c82fab36bb3b6aa83e2a50691803b2','chaine',0,'','2012-12-12 12:11:05'),(1928,'PAYPAL_SECURITY_TOKEN_UNIQUE',1,'0','chaine',0,'','2012-12-12 12:11:05'),(1929,'PAYPAL_ADD_PAYMENT_URL',1,'1','chaine',0,'','2012-12-12 12:11:05'),(1980,'MAIN_PDF_FORMAT',1,'EUA4','chaine',0,'','2012-12-12 19:58:05'),(1981,'MAIN_PROFID1_IN_ADDRESS',1,'0','chaine',0,'','2012-12-12 19:58:05'),(1982,'MAIN_PROFID2_IN_ADDRESS',1,'0','chaine',0,'','2012-12-12 19:58:05'),(1983,'MAIN_PROFID3_IN_ADDRESS',1,'0','chaine',0,'','2012-12-12 19:58:05'),(1984,'MAIN_PROFID4_IN_ADDRESS',1,'0','chaine',0,'','2012-12-12 19:58:05'),(1985,'MAIN_GENERATE_DOCUMENTS_WITHOUT_VAT',1,'0','chaine',0,'','2012-12-12 19:58:05'),(1990,'MAIN_SMS_SENDMODE',1,'ovh','chaine',0,'This is to enable OVH SMS engine','2012-12-17 21:19:01'),(2251,'FCKEDITOR_TEST',1,'Test
\r\n\"\"fdfs','chaine',0,'','2012-12-19 19:12:24'),(2293,'SYSTEMTOOLS_MYSQLDUMP',1,'/usr/bin/mysqldump','chaine',0,'','2012-12-27 02:02:00'),(2835,'MAIN_USE_CONNECT_TIMEOUT',1,'10','chaine',0,'','2013-01-16 19:28:50'),(2836,'MAIN_USE_RESPONSE_TIMEOUT',1,'30','chaine',0,'','2013-01-16 19:28:50'),(2837,'MAIN_PROXY_USE',1,'0','chaine',0,'','2013-01-16 19:28:50'),(2838,'MAIN_PROXY_HOST',1,'localhost','chaine',0,'','2013-01-16 19:28:50'),(2839,'MAIN_PROXY_PORT',1,'8080','chaine',0,'','2013-01-16 19:28:50'),(2840,'MAIN_PROXY_USER',1,'aaa','chaine',0,'','2013-01-16 19:28:50'),(2841,'MAIN_PROXY_PASS',1,'bbb','chaine',0,'','2013-01-16 19:28:50'),(2848,'OVHSMS_NICK',1,'BN196-OVH','chaine',0,'','2013-01-16 19:32:36'),(2849,'OVHSMS_PASS',1,'bigone-10','chaine',0,'','2013-01-16 19:32:36'),(2850,'OVHSMS_SOAPURL',1,'https://www.ovh.com/soapi/soapi-re-1.55.wsdl','chaine',0,'','2013-01-16 19:32:36'),(2854,'THEME_ELDY_RGB',1,'bfbf00','chaine',0,'','2013-01-18 10:02:53'),(2855,'THEME_ELDY_ENABLE_PERSONALIZED',1,'0','chaine',0,'','2013-01-18 10:02:55'),(2858,'MAIN_SESSION_TIMEOUT',1,'2000','chaine',0,'','2013-01-19 17:01:53'),(2862,'TICKET_ADDON',1,'mod_ticket_avenc','chaine',0,'Nom du gestionnaire de numerotation des tickets','2013-01-19 17:16:10'),(2867,'FACSIM_ADDON',1,'mod_facsim_alcoy','chaine',0,'','2013-01-19 17:16:25'),(2868,'POS_SERVICES',1,'0','chaine',0,'','2013-01-19 17:16:51'),(2869,'POS_USE_TICKETS',1,'1','chaine',0,'','2013-01-19 17:16:51'),(2870,'POS_MAX_TTC',1,'100','chaine',0,'','2013-01-19 17:16:51'),(3190,'MAIN_MODULE_HOLIDAY',2,'1',NULL,0,NULL,'2013-02-01 08:52:34'),(3191,'MAIN_MODULE_HOLIDAY_TABS_0',2,'user:+paidholidays:CPTitreMenu:holiday:$user->rights->holiday->write:/holiday/index.php?mainmenu=holiday&id=__ID__','chaine',0,NULL,'2013-02-01 08:52:34'),(3195,'INVOICE_SUPPLIER_ADDON_PDF',1,'canelle','chaine',0,'','2013-02-10 19:50:27'),(3199,'MAIN_FORCE_RELOAD_PAGE',1,'1','chaine',0,NULL,'2013-02-12 16:22:55'),(3217,'MAIN_PDF_TITLE_BACKGROUND_COLOR',1,'240,240,240','chaine',1,'','2013-02-13 15:18:02'),(3223,'OVH_THIRDPARTY_IMPORT',1,'2','chaine',0,'','2013-02-13 16:20:18'),(3241,'COMPANY_USE_SEARCH_TO_SELECT',1,'2','chaine',0,'','2013-02-17 14:33:39'),(3409,'AGENDA_USE_EVENT_TYPE',1,'1','chaine',0,'','2013-02-27 18:12:24'),(3886,'MAIN_REMOVE_INSTALL_WARNING',1,'1','chaine',1,'','2013-03-02 18:32:50'),(4013,'MAIN_DELAY_ACTIONS_TODO',1,'7','chaine',0,'','2013-03-06 08:59:12'),(4014,'MAIN_DELAY_PROPALS_TO_CLOSE',1,'31','chaine',0,'','2013-03-06 08:59:12'),(4015,'MAIN_DELAY_PROPALS_TO_BILL',1,'7','chaine',0,'','2013-03-06 08:59:12'),(4016,'MAIN_DELAY_ORDERS_TO_PROCESS',1,'2','chaine',0,'','2013-03-06 08:59:12'),(4017,'MAIN_DELAY_CUSTOMER_BILLS_UNPAYED',1,'31','chaine',0,'','2013-03-06 08:59:12'),(4018,'MAIN_DELAY_SUPPLIER_ORDERS_TO_PROCESS',1,'7','chaine',0,'','2013-03-06 08:59:12'),(4019,'MAIN_DELAY_SUPPLIER_BILLS_TO_PAY',1,'2','chaine',0,'','2013-03-06 08:59:12'),(4020,'MAIN_DELAY_RUNNING_SERVICES',1,'-15','chaine',0,'','2013-03-06 08:59:12'),(4021,'MAIN_DELAY_TRANSACTIONS_TO_CONCILIATE',1,'62','chaine',0,'','2013-03-06 08:59:13'),(4022,'MAIN_DELAY_MEMBERS',1,'31','chaine',0,'','2013-03-06 08:59:13'),(4023,'MAIN_DISABLE_METEO',1,'0','chaine',0,'','2013-03-06 08:59:13'),(4044,'ADHERENT_VAT_FOR_SUBSCRIPTIONS',1,'0','',0,'','2013-03-06 16:06:38'),(4047,'ADHERENT_BANK_USE',1,'bankviainvoice','',0,'','2013-03-06 16:12:30'),(4049,'PHPSANE_SCANIMAGE',1,'/usr/bin/scanimage','chaine',0,'','2013-03-06 21:54:13'),(4050,'PHPSANE_PNMTOJPEG',1,'/usr/bin/pnmtojpeg','chaine',0,'','2013-03-06 21:54:13'),(4051,'PHPSANE_PNMTOTIFF',1,'/usr/bin/pnmtotiff','chaine',0,'','2013-03-06 21:54:13'),(4052,'PHPSANE_OCR',1,'/usr/bin/gocr','chaine',0,'','2013-03-06 21:54:13'),(4548,'ECM_AUTO_TREE_ENABLED',1,'1','chaine',0,'','2013-03-10 15:57:21'),(4579,'MAIN_MODULE_AGENDA',2,'1',NULL,0,NULL,'2013-03-13 15:29:19'),(4580,'MAIN_AGENDA_ACTIONAUTO_COMPANY_CREATE',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4581,'MAIN_AGENDA_ACTIONAUTO_CONTRACT_VALIDATE',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4582,'MAIN_AGENDA_ACTIONAUTO_PROPAL_VALIDATE',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4583,'MAIN_AGENDA_ACTIONAUTO_PROPAL_SENTBYMAIL',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4584,'MAIN_AGENDA_ACTIONAUTO_ORDER_VALIDATE',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4585,'MAIN_AGENDA_ACTIONAUTO_ORDER_SENTBYMAIL',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4586,'MAIN_AGENDA_ACTIONAUTO_BILL_VALIDATE',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4587,'MAIN_AGENDA_ACTIONAUTO_BILL_PAYED',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4588,'MAIN_AGENDA_ACTIONAUTO_BILL_CANCEL',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4589,'MAIN_AGENDA_ACTIONAUTO_BILL_SENTBYMAIL',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4590,'MAIN_AGENDA_ACTIONAUTO_ORDER_SUPPLIER_VALIDATE',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4591,'MAIN_AGENDA_ACTIONAUTO_BILL_SUPPLIER_VALIDATE',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4592,'MAIN_AGENDA_ACTIONAUTO_SHIPPING_VALIDATE',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4593,'MAIN_AGENDA_ACTIONAUTO_SHIPPING_SENTBYMAIL',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4594,'MAIN_AGENDA_ACTIONAUTO_BILL_UNVALIDATE',2,'1','chaine',0,NULL,'2013-03-13 15:29:19'),(4595,'MAIN_MODULE_GOOGLE',2,'1',NULL,0,NULL,'2013-03-13 15:29:47'),(4596,'MAIN_MODULE_GOOGLE_TABS_0',2,'agenda:+gcal:MenuAgendaGoogle:google@google:$conf->google->enabled && $conf->global->GOOGLE_ENABLE_AGENDA:/google/index.php','chaine',0,NULL,'2013-03-13 15:29:47'),(4597,'MAIN_MODULE_GOOGLE_TABS_1',2,'user:+gsetup:GoogleUserConf:google@google:$conf->google->enabled && $conf->global->GOOGLE_DUPLICATE_INTO_GCAL:/google/admin/google_calsync_user.php?id=__ID__','chaine',0,NULL,'2013-03-13 15:29:47'),(4598,'MAIN_MODULE_GOOGLE_TRIGGERS',2,'1','chaine',0,NULL,'2013-03-13 15:29:47'),(4599,'MAIN_MODULE_GOOGLE_HOOKS',2,'[\"toprightmenu\"]','chaine',0,NULL,'2013-03-13 15:29:47'),(4688,'GOOGLE_ENABLE_AGENDA',2,'1','chaine',0,'','2013-03-13 15:36:29'),(4689,'GOOGLE_AGENDA_NAME1',2,'eldy','chaine',0,'','2013-03-13 15:36:29'),(4690,'GOOGLE_AGENDA_SRC1',2,'eldy10@mail.com','chaine',0,'','2013-03-13 15:36:29'),(4691,'GOOGLE_AGENDA_COLOR1',2,'BE6D00','chaine',0,'','2013-03-13 15:36:29'),(4692,'GOOGLE_AGENDA_COLOR2',2,'7A367A','chaine',0,'','2013-03-13 15:36:29'),(4693,'GOOGLE_AGENDA_COLOR3',2,'7A367A','chaine',0,'','2013-03-13 15:36:29'),(4694,'GOOGLE_AGENDA_COLOR4',2,'7A367A','chaine',0,'','2013-03-13 15:36:29'),(4695,'GOOGLE_AGENDA_COLOR5',2,'7A367A','chaine',0,'','2013-03-13 15:36:29'),(4696,'GOOGLE_AGENDA_TIMEZONE',2,'Europe/Paris','chaine',0,'','2013-03-13 15:36:29'),(4697,'GOOGLE_AGENDA_NB',2,'5','chaine',0,'','2013-03-13 15:36:29'),(4711,'GOOGLE_ENABLE_AGENDA',1,'1','chaine',0,'','2013-03-13 19:37:38'),(4712,'GOOGLE_AGENDA_NAME1',1,'asso master','chaine',0,'','2013-03-13 19:37:38'),(4713,'GOOGLE_AGENDA_SRC1',1,'assodolibarr@mail.com','chaine',0,'','2013-03-13 19:37:38'),(4714,'GOOGLE_AGENDA_COLOR1',1,'1B887A','chaine',0,'','2013-03-13 19:37:38'),(4715,'GOOGLE_AGENDA_COLOR2',1,'7A367A','chaine',0,'','2013-03-13 19:37:38'),(4716,'GOOGLE_AGENDA_COLOR3',1,'7A367A','chaine',0,'','2013-03-13 19:37:38'),(4717,'GOOGLE_AGENDA_COLOR4',1,'7A367A','chaine',0,'','2013-03-13 19:37:38'),(4718,'GOOGLE_AGENDA_COLOR5',1,'7A367A','chaine',0,'','2013-03-13 19:37:38'),(4719,'GOOGLE_AGENDA_TIMEZONE',1,'Europe/Paris','chaine',0,'','2013-03-13 19:37:38'),(4720,'GOOGLE_AGENDA_NB',1,'5','chaine',0,'','2013-03-13 19:37:38'),(4725,'SOCIETE_CODECLIENT_ADDON',2,'mod_codeclient_leopard','chaine',0,'Module to control third parties codes','2013-03-13 20:21:35'),(4726,'SOCIETE_CODECOMPTA_ADDON',2,'mod_codecompta_panicum','chaine',0,'Module to control third parties codes','2013-03-13 20:21:35'),(4727,'SOCIETE_FISCAL_MONTH_START',2,'','chaine',0,'Mettre le numero du mois du debut d\\\'annee fiscale, ex: 9 pour septembre','2013-03-13 20:21:35'),(4728,'MAIN_SEARCHFORM_SOCIETE',2,'1','yesno',0,'Show form for quick company search','2013-03-13 20:21:35'),(4729,'MAIN_SEARCHFORM_CONTACT',2,'1','yesno',0,'Show form for quick contact search','2013-03-13 20:21:35'),(4730,'COMPANY_ADDON_PDF_ODT_PATH',2,'DOL_DATA_ROOT/doctemplates/thirdparties','chaine',0,NULL,'2013-03-13 20:21:35'),(4743,'MAIN_MODULE_CLICKTODIAL',2,'1',NULL,0,NULL,'2013-03-13 20:30:28'),(4744,'MAIN_MODULE_NOTIFICATION',2,'1',NULL,0,NULL,'2013-03-13 20:30:34'),(4745,'MAIN_MODULE_WEBSERVICES',2,'1',NULL,0,NULL,'2013-03-13 20:30:41'),(4746,'MAIN_MODULE_PROPALE',2,'1',NULL,0,NULL,'2013-03-13 20:32:38'),(4747,'PROPALE_ADDON_PDF',2,'azur','chaine',0,'Nom du gestionnaire de generation des propales en PDF','2013-03-13 20:32:38'),(4748,'PROPALE_ADDON',2,'mod_propale_marbre','chaine',0,'Nom du gestionnaire de numerotation des propales','2013-03-13 20:32:38'),(4749,'PROPALE_VALIDITY_DURATION',2,'15','chaine',0,'Duration of validity of business proposals','2013-03-13 20:32:38'),(4750,'PROPALE_ADDON_PDF_ODT_PATH',2,'DOL_DATA_ROOT/doctemplates/proposals','chaine',0,NULL,'2013-03-13 20:32:38'),(4752,'MAIN_MODULE_TAX',2,'1',NULL,0,NULL,'2013-03-13 20:32:47'),(4753,'MAIN_MODULE_DON',2,'1',NULL,0,NULL,'2013-03-13 20:32:54'),(4754,'DON_ADDON_MODEL',2,'html_cerfafr','chaine',0,'Nom du gestionnaire de generation de recu de dons','2013-03-13 20:32:54'),(4755,'POS_USE_TICKETS',2,'1','chaine',0,'','2013-03-13 20:33:09'),(4756,'POS_MAX_TTC',2,'100','chaine',0,'','2013-03-13 20:33:09'),(4757,'MAIN_MODULE_POS',2,'1',NULL,0,NULL,'2013-03-13 20:33:09'),(4758,'TICKET_ADDON',2,'mod_ticket_avenc','chaine',0,'Nom du gestionnaire de numerotation des tickets','2013-03-13 20:33:09'),(4759,'MAIN_MODULE_BANQUE',2,'1',NULL,0,NULL,'2013-03-13 20:33:09'),(4760,'MAIN_MODULE_FACTURE',2,'1',NULL,0,NULL,'2013-03-13 20:33:09'),(4761,'FACTURE_ADDON_PDF',2,'crabe','chaine',0,'Name of PDF model of invoice','2013-03-13 20:33:09'),(4762,'FACTURE_ADDON',2,'mod_facture_terre','chaine',0,'Name of numbering numerotation rules of invoice','2013-03-13 20:33:09'),(4763,'FACTURE_ADDON_PDF_ODT_PATH',2,'DOL_DATA_ROOT/doctemplates/invoices','chaine',0,NULL,'2013-03-13 20:33:09'),(4764,'MAIN_MODULE_SOCIETE',2,'1',NULL,0,NULL,'2013-03-13 20:33:09'),(4765,'MAIN_MODULE_PRODUCT',2,'1',NULL,0,NULL,'2013-03-13 20:33:09'),(4766,'PRODUCT_CODEPRODUCT_ADDON',2,'mod_codeproduct_leopard','chaine',0,'Module to control product codes','2013-03-13 20:33:09'),(4767,'MAIN_SEARCHFORM_PRODUITSERVICE',2,'1','yesno',0,'Show form for quick product search','2013-03-13 20:33:09'),(4772,'FACSIM_ADDON',2,'mod_facsim_alcoy','chaine',0,'','2013-03-13 20:33:32'),(4773,'MAIN_MODULE_MAILING',2,'1',NULL,0,NULL,'2013-03-13 20:33:37'),(4774,'MAIN_MODULE_OPENSURVEY',2,'1',NULL,0,NULL,'2013-03-13 20:33:42'),(4782,'AGENDA_USE_EVENT_TYPE',2,'1','chaine',0,'','2013-03-13 20:53:36'),(4884,'AGENDA_DISABLE_EXT',2,'1','chaine',0,'','2013-03-13 22:03:40'),(4928,'COMMANDE_SUPPLIER_ADDON_NUMBER',1,'mod_commande_fournisseur_muguet','chaine',0,'Nom du gestionnaire de numerotation des commandes fournisseur','2013-03-22 09:24:29'),(4929,'INVOICE_SUPPLIER_ADDON_NUMBER',1,'mod_facture_fournisseur_cactus','chaine',0,'Nom du gestionnaire de numerotation des factures fournisseur','2013-03-22 09:24:29'),(5001,'MAIN_CRON_KEY',0,'bc54582fe30d5d4a830c6f582ec28810','chaine',0,'','2013-03-23 17:54:53'),(5009,'CRON_KEY',0,'2c2e755c20be2014098f629865598006','chaine',0,'','2013-03-23 18:06:24'),(5075,'MAIN_MENU_STANDARD',1,'eldy_menu.php','chaine',0,'','2013-03-24 02:51:13'),(5076,'MAIN_MENU_SMARTPHONE',1,'eldy_menu.php','chaine',0,'','2013-03-24 02:51:13'),(5077,'MAIN_MENUFRONT_STANDARD',1,'eldy_menu.php','chaine',0,'','2013-03-24 02:51:13'),(5078,'MAIN_MENUFRONT_SMARTPHONE',1,'eldy_menu.php','chaine',0,'','2013-03-24 02:51:13'),(5139,'SOCIETE_ADD_REF_IN_LIST',1,'','yesno',0,'Display customer ref into select list','2013-09-08 23:06:08'),(5150,'PROJECT_TASK_ADDON_PDF',1,'','chaine',0,'Name of PDF/ODT tasks manager class','2013-09-08 23:06:14'),(5151,'PROJECT_TASK_ADDON',1,'mod_task_simple','chaine',0,'Name of Numbering Rule task manager class','2013-09-08 23:06:14'),(5152,'PROJECT_TASK_ADDON_PDF_ODT_PATH',1,'DOL_DATA_ROOT/doctemplates/tasks','chaine',0,'','2013-09-08 23:06:14'),(5195,'GOOGLE_DUPLICATE_INTO_THIRDPARTIES',1,'1','chaine',0,'','2013-11-07 00:02:34'),(5196,'GOOGLE_DUPLICATE_INTO_CONTACTS',1,'0','chaine',0,'','2013-11-07 00:02:34'),(5197,'GOOGLE_DUPLICATE_INTO_MEMBERS',1,'0','chaine',0,'','2013-11-07 00:02:34'),(5198,'GOOGLE_CONTACT_LOGIN',1,'eldy10@mail.com','chaine',0,'','2013-11-07 00:02:34'),(5199,'GOOGLE_CONTACT_PASSWORD',1,'bidonge','chaine',0,'','2013-11-07 00:02:34'),(5200,'GOOGLE_TAG_PREFIX',1,'Dolibarr (Thirdparties)','chaine',0,'','2013-11-07 00:02:34'),(5201,'GOOGLE_TAG_PREFIX_CONTACTS',1,'Dolibarr (Contacts/Addresses)','chaine',0,'','2013-11-07 00:02:34'),(5202,'GOOGLE_TAG_PREFIX_MEMBERS',1,'Dolibarr (Members)','chaine',0,'','2013-11-07 00:02:34'),(5239,'BOOKMARKS_SHOW_IN_MENU',1,'10','chaine',0,'','2014-03-02 15:42:26'),(5271,'DONATION_ART200',1,'','yesno',0,'Option Française - Eligibilité Art200 du CGI','2014-12-21 12:51:28'),(5272,'DONATION_ART238',1,'','yesno',0,'Option Française - Eligibilité Art238 bis du CGI','2014-12-21 12:51:28'),(5273,'DONATION_ART885',1,'','yesno',0,'Option Française - Eligibilité Art885-0 V bis du CGI','2014-12-21 12:51:28'),(5274,'DONATION_MESSAGE',1,'Thank you','chaine',0,'Message affiché sur le récépissé de versements ou dons','2014-12-21 12:51:28'),(5288,'DONATION_ACCOUNTINGACCOUNT',1,'7581','chaine',0,'Compte comptable de remise des versements ou dons','2015-07-19 13:41:21'),(5339,'MAIN_MULTILANGS',1,'1','chaine',0,'','2015-10-03 10:11:33'),(5340,'MAIN_SIZE_LISTE_LIMIT',1,'25','chaine',0,'','2015-10-03 10:11:33'),(5341,'MAIN_DISABLE_JAVASCRIPT',1,'0','chaine',0,'','2015-10-03 10:11:33'),(5342,'MAIN_BUTTON_HIDE_UNAUTHORIZED',1,'0','chaine',0,'','2015-10-03 10:11:33'),(5343,'MAIN_START_WEEK',1,'1','chaine',0,'','2015-10-03 10:11:33'),(5344,'MAIN_DEFAULT_WORKING_DAYS',1,'1-5','chaine',0,'','2015-10-03 10:11:33'),(5345,'MAIN_DEFAULT_WORKING_HOURS',1,'9-18','chaine',0,'','2015-10-03 10:11:33'),(5346,'MAIN_SHOW_LOGO',1,'1','chaine',0,'','2015-10-03 10:11:33'),(5347,'MAIN_FIRSTNAME_NAME_POSITION',1,'0','chaine',0,'','2015-10-03 10:11:33'),(5348,'MAIN_THEME',1,'eldy','chaine',0,'','2015-10-03 10:11:33'),(5349,'MAIN_SEARCHFORM_CONTACT',1,'1','chaine',0,'','2015-10-03 10:11:33'),(5351,'MAIN_SEARCHFORM_PRODUITSERVICE',1,'1','chaine',0,'','2015-10-03 10:11:33'),(5352,'MAIN_SEARCHFORM_PRODUITSERVICE_SUPPLIER',1,'0','chaine',0,'','2015-10-03 10:11:33'),(5353,'MAIN_SEARCHFORM_ADHERENT',1,'1','chaine',0,'','2015-10-03 10:11:33'),(5354,'MAIN_SEARCHFORM_PROJECT',1,'0','chaine',0,'','2015-10-03 10:11:33'),(5355,'MAIN_HELPCENTER_DISABLELINK',0,'1','chaine',0,'','2015-10-03 10:11:33'),(5356,'MAIN_HOME',1,'__(NoteSomeFeaturesAreDisabled)__
\r\n
\r\n__(SomeTranslationAreUncomplete)__
','chaine',0,'','2015-10-03 10:11:33'),(5357,'MAIN_HELP_DISABLELINK',0,'0','chaine',0,'','2015-10-03 10:11:33'),(5358,'MAIN_BUGTRACK_ENABLELINK',1,'0','chaine',0,'','2015-10-03 10:11:33'),(5359,'THEME_ELDY_USE_HOVER',1,'1','chaine',0,'','2015-10-03 10:11:33'),(5394,'FCKEDITOR_ENABLE_DETAILS',1,'1','yesno',0,'WYSIWIG for products details lines for all entities','2015-11-04 15:27:44'),(5395,'FCKEDITOR_ENABLE_USERSIGN',1,'1','yesno',0,'WYSIWIG for user signature','2015-11-04 15:27:44'),(5396,'FCKEDITOR_ENABLE_MAIL',1,'1','yesno',0,'WYSIWIG for products details lines for all entities','2015-11-04 15:27:44'),(5398,'CATEGORIE_RECURSIV_ADD',1,'','yesno',0,'Affect parent categories','2015-11-04 15:27:46'),(5403,'MAIN_MODULE_FCKEDITOR',1,'1',NULL,0,NULL,'2015-11-04 15:41:40'),(5404,'MAIN_MODULE_CATEGORIE',1,'1',NULL,0,NULL,'2015-11-04 15:41:43'),(5415,'EXPEDITION_ADDON_PDF_ODT_PATH',1,'DOL_DATA_ROOT/doctemplates/shipment','chaine',0,NULL,'2015-11-15 22:38:28'),(5416,'LIVRAISON_ADDON_PDF_ODT_PATH',1,'DOL_DATA_ROOT/doctemplates/delivery','chaine',0,NULL,'2015-11-15 22:38:28'),(5419,'MAIN_MODULE_CASHDESK',1,'1',NULL,0,NULL,'2015-11-15 22:38:33'),(5426,'MAIN_MODULE_PROJET',1,'1',NULL,0,NULL,'2015-11-15 22:38:44'),(5427,'PROJECT_ADDON_PDF_ODT_PATH',1,'DOL_DATA_ROOT/doctemplates/projects','chaine',0,NULL,'2015-11-15 22:38:44'),(5428,'PROJECT_USE_OPPORTUNIES',1,'1','chaine',0,NULL,'2015-11-15 22:38:44'),(5430,'MAIN_MODULE_EXPORT',1,'1',NULL,0,NULL,'2015-11-15 22:38:56'),(5431,'MAIN_MODULE_IMPORT',1,'1',NULL,0,NULL,'2015-11-15 22:38:58'),(5432,'MAIN_MODULE_MAILING',1,'1',NULL,0,NULL,'2015-11-15 22:39:00'),(5434,'EXPENSEREPORT_ADDON_PDF',1,'standard','chaine',0,'Name of manager to build PDF expense reports documents','2015-11-15 22:39:05'),(5435,'MAIN_MODULE_SALARIES',1,'1',NULL,0,NULL,'2015-11-15 22:39:08'),(5436,'SALARIES_ACCOUNTING_ACCOUNT_PAYMENT',1,'421','chaine',0,NULL,'2015-11-15 22:39:08'),(5437,'SALARIES_ACCOUNTING_ACCOUNT_CHARGE',1,'641','chaine',0,NULL,'2015-11-15 22:39:08'),(5441,'ADHERENT_ETIQUETTE_TEXT',1,'%FULLNAME%\n%ADDRESS%\n%ZIP% %TOWN%\n%COUNTRY%','texte',0,'Text to print on member address sheets','2015-11-15 22:39:17'),(5443,'MAIN_MODULE_PRELEVEMENT',1,'1',NULL,0,NULL,'2015-11-15 22:39:33'),(5453,'MAIN_MODULE_CONTRAT',1,'1',NULL,0,NULL,'2015-11-15 22:39:52'),(5455,'MAIN_MODULE_FICHEINTER',1,'1',NULL,0,NULL,'2015-11-15 22:39:56'),(5459,'MAIN_MODULE_PAYPAL',1,'1',NULL,0,NULL,'2015-11-15 22:41:02'),(5460,'MAIN_MODULE_MARGIN',1,'1',NULL,0,NULL,'2015-11-15 22:41:47'),(5461,'MAIN_MODULE_MARGIN_TABS_0',1,'product:+margin:Margins:margins:$user->rights->margins->liretous:/margin/tabs/productMargins.php?id=__ID__','chaine',0,NULL,'2015-11-15 22:41:47'),(5462,'MAIN_MODULE_MARGIN_TABS_1',1,'thirdparty:+margin:Margins:margins:empty($user->societe_id) && $user->rights->margins->liretous && ($object->client > 0):/margin/tabs/thirdpartyMargins.php?socid=__ID__','chaine',0,NULL,'2015-11-15 22:41:47'),(5463,'MAIN_MODULE_PROPALE',1,'1',NULL,0,NULL,'2015-11-15 22:41:47'),(5483,'GENBARCODE_BARCODETYPE_THIRDPARTY',1,'6','chaine',0,'','2016-01-16 15:49:43'),(5484,'PRODUIT_DEFAULT_BARCODE_TYPE',1,'2','chaine',0,'','2016-01-16 15:49:46'),(5539,'PRODUCT_USE_OLD_PATH_FOR_PHOTO',0,'0','chaine',1,'Use old path for products images','2016-01-22 13:34:23'),(5541,'MODULE_GOOGLE_DEBUG',1,'0','chaine',1,'','2016-01-22 13:34:57'),(5548,'MAIN_MODULE_ECM',1,'1',NULL,0,NULL,'2016-01-22 17:26:43'),(5551,'MAIN_MODULE_HOLIDAY',1,'1',NULL,0,NULL,'2016-01-22 17:26:43'),(5552,'MAIN_MODULE_HOLIDAY_TABS_0',1,'user:+paidholidays:CPTitreMenu:holiday:$user->rights->holiday->read:/holiday/list.php?mainmenu=holiday&id=__ID__','chaine',0,NULL,'2016-01-22 17:26:43'),(5555,'MAIN_MODULE_SERVICE',1,'1',NULL,0,NULL,'2016-01-22 17:26:43'),(5586,'MAIN_DELAY_EXPENSEREPORTS_TO_PAY',1,'31','chaine',0,'Tolérance de retard avant alerte (en jours) sur les notes de frais impayées','2016-01-22 17:28:18'),(5587,'MAIN_FIX_FOR_BUGGED_MTA',1,'1','chaine',1,'Set constant to fix email ending from PHP with some linux ike system','2016-01-22 17:28:18'),(5589,'MAIN_MODULE_USER',0,'1',NULL,0,NULL,'2016-01-22 17:28:42'),(5590,'MAIN_VERSION_LAST_INSTALL',0,'3.8.3','chaine',0,'Dolibarr version when install','2016-01-22 17:28:42'),(5604,'MAIN_INFO_SOCIETE_LOGO',1,'mybigcompany.png','chaine',0,'','2016-01-22 17:33:49'),(5605,'MAIN_INFO_SOCIETE_LOGO_SMALL',1,'mybigcompany_small.png','chaine',0,'','2016-01-22 17:33:49'),(5606,'MAIN_INFO_SOCIETE_LOGO_MINI',1,'mybigcompany_mini.png','chaine',0,'','2016-01-22 17:33:49'),(5612,'MAIN_ENABLE_LOG_TO_HTML',0,'0','chaine',1,'If this option is set to 1, it is possible to see log output at end of HTML sources by adding paramater logtohtml=1 on URL','2016-03-13 10:54:45'),(5614,'MAIN_SIZE_SHORTLISTE_LIMIT',1,'4','chaine',0,'Longueur maximum des listes courtes (fiche client)','2016-03-13 10:54:46'),(5626,'MAIN_MODULE_SUPPLIERPROPOSAL',1,'1',NULL,0,NULL,'2016-07-30 11:13:20'),(5627,'SUPPLIER_PROPOSAL_ADDON_PDF',1,'aurore','chaine',0,'Name of submodule to generate PDF for supplier quotation request','2016-07-30 11:13:20'),(5628,'SUPPLIER_PROPOSAL_ADDON',1,'mod_supplier_proposal_marbre','chaine',0,'Name of submodule to number supplier quotation request','2016-07-30 11:13:20'),(5629,'SUPPLIER_PROPOSAL_ADDON_PDF_ODT_PATH',1,'DOL_DATA_ROOT/doctemplates/supplier_proposal','chaine',0,NULL,'2016-07-30 11:13:20'),(5632,'MAIN_MODULE_RESOURCE',1,'1',NULL,0,NULL,'2016-07-30 11:13:32'),(5633,'MAIN_MODULE_API',1,'1',NULL,0,NULL,'2016-07-30 11:13:54'),(5634,'MAIN_MODULE_WEBSERVICES',1,'1',NULL,0,NULL,'2016-07-30 11:13:56'),(5635,'WEBSERVICES_KEY',1,'dolibarrkey','chaine',0,'','2016-07-30 11:14:04'),(5638,'MAIN_MODULE_EXTERNALRSS',1,'1',NULL,0,NULL,'2016-07-30 11:15:04'),(5639,'EXTERNAL_RSS_TITLE_1',1,'Dolibarr.org News','chaine',0,'','2016-07-30 11:15:25'),(5640,'EXTERNAL_RSS_URLRSS_1',1,'https://www.dolibarr.org/rss','chaine',0,'','2016-07-30 11:15:25'),(5641,'MAIN_MODULE_DON',1,'1',NULL,0,NULL,'2016-07-30 11:16:22'),(5642,'SOCIETE_CODECOMPTA_ADDON',1,'mod_codecompta_aquarium','chaine',0,'','2016-07-30 11:16:42'),(5707,'CASHDESK_NO_DECREASE_STOCK',1,'1','chaine',0,'','2016-07-30 13:38:11'),(5708,'MAIN_MODULE_PRODUCTBATCH',1,'1',NULL,0,NULL,'2016-07-30 13:38:11'),(5710,'MAIN_MODULE_STOCK',1,'1',NULL,0,NULL,'2016-07-30 13:38:11'),(5711,'MAIN_MODULE_PRODUCT',1,'1',NULL,0,NULL,'2016-07-30 13:38:11'),(5712,'MAIN_MODULE_EXPEDITION',1,'1',NULL,0,NULL,'2016-07-30 13:38:11'),(5713,'MAIN_MODULE_COMMANDE',1,'1',NULL,0,NULL,'2016-07-30 13:38:11'),(5715,'MAIN_MODULE_FOURNISSEUR',1,'1',NULL,0,NULL,'2016-07-30 13:38:11'),(5765,'MAIN_MODULE_AGENDA',1,'1',NULL,0,NULL,'2016-07-30 15:42:32'),(5808,'MARGIN_TYPE',1,'costprice','chaine',0,'','2016-07-30 16:32:18'),(5809,'DISPLAY_MARGIN_RATES',1,'1','chaine',0,'','2016-07-30 16:32:20'),(5810,'MAIN_FEATURES_LEVEL',0,'0','chaine',1,'Level of features to show (0=stable only, 1=stable+experimental, 2=stable+experimental+development','2016-07-30 18:36:15'),(5812,'MAIN_MODULE_OPENSURVEY',1,'1',NULL,0,NULL,'2016-07-30 19:04:07'),(5813,'USER_PASSWORD_PATTERN',1,'8;1;1;1;3;1','chaine',0,'','2016-07-31 16:04:58'),(5814,'MAIN_MODULE_EXPENSEREPORT',1,'1',NULL,0,NULL,'2016-07-31 21:14:32'),(5817,'MAIN_SIZE_SHORTLIST_LIMIT',1,'3','chaine',0,'Max length for small lists (tabs)','2016-12-12 10:54:09'),(5830,'LOAN_ACCOUNTING_ACCOUNT_CAPITAL',1,'164','chaine',0,NULL,'2017-01-29 15:11:51'),(5831,'LOAN_ACCOUNTING_ACCOUNT_INSURANCE',1,'6162','chaine',0,NULL,'2017-01-29 15:11:51'),(5833,'ACCOUNTING_EXPORT_SEPARATORCSV',1,',','string',0,NULL,'2017-01-29 15:11:56'),(5834,'ACCOUNTING_ACCOUNT_SUSPENSE',1,'471','chaine',0,NULL,'2017-01-29 15:11:56'),(5835,'ACCOUNTING_SELL_JOURNAL',1,'VTE','chaine',0,NULL,'2017-01-29 15:11:56'),(5836,'ACCOUNTING_PURCHASE_JOURNAL',1,'ACH','chaine',0,NULL,'2017-01-29 15:11:56'),(5837,'ACCOUNTING_SOCIAL_JOURNAL',1,'SOC','chaine',0,NULL,'2017-01-29 15:11:56'),(5838,'ACCOUNTING_MISCELLANEOUS_JOURNAL',1,'OD','chaine',0,NULL,'2017-01-29 15:11:56'),(5839,'ACCOUNTING_ACCOUNT_TRANSFER_CASH',1,'58','chaine',0,NULL,'2017-01-29 15:11:56'),(5840,'CHARTOFACCOUNTS',1,'2','chaine',0,NULL,'2017-01-29 15:11:56'),(5841,'ACCOUNTING_EXPORT_MODELCSV',1,'1','chaine',0,NULL,'2017-01-29 15:11:56'),(5842,'ACCOUNTING_LENGTH_GACCOUNT',1,'','chaine',0,NULL,'2017-01-29 15:11:56'),(5843,'ACCOUNTING_LENGTH_AACCOUNT',1,'','chaine',0,NULL,'2017-01-29 15:11:56'),(5844,'ACCOUNTING_LIST_SORT_VENTILATION_TODO',1,'1','yesno',0,NULL,'2017-01-29 15:11:56'),(5845,'ACCOUNTING_LIST_SORT_VENTILATION_DONE',1,'1','yesno',0,NULL,'2017-01-29 15:11:56'),(5846,'ACCOUNTING_EXPORT_DATE',1,'%d%m%Y','chaine',0,NULL,'2017-01-29 15:11:56'),(5847,'ACCOUNTING_EXPENSEREPORT_JOURNAL',1,'ER','chaine',0,NULL,'2017-01-29 15:11:56'),(5848,'ACCOUNTING_EXPORT_FORMAT',1,'csv','chaine',0,NULL,'2017-01-29 15:11:56'),(5853,'MAIN_MODULE_WORKFLOW',1,'1',NULL,0,NULL,'2017-01-29 15:12:12'),(5854,'MAIN_MODULE_NOTIFICATION',1,'1',NULL,0,NULL,'2017-01-29 15:12:35'),(5855,'MAIN_MODULE_OAUTH',1,'1',NULL,0,NULL,'2017-01-29 15:12:41'),(5856,'MAIN_MODULE_PRINTING',1,'1',NULL,0,NULL,'2017-01-29 15:12:44'),(5864,'MAIN_INFO_SOCIETE_TEL',1,'09123123','chaine',0,'','2017-01-29 15:13:51'),(5865,'MAIN_INFO_SOCIETE_FAX',1,'09123124','chaine',0,'','2017-01-29 15:13:51'),(5866,'MAIN_INFO_SOCIETE_MAIL',1,'myemail@mybigcompany.com','chaine',0,'','2017-01-29 15:13:51'),(5867,'MAIN_INFO_SOCIETE_WEB',1,'https://www.dolibarr.org','chaine',0,'','2017-01-29 15:13:51'),(5868,'MAIN_INFO_SOCIETE_NOTE',1,'This is note about my company','chaine',0,'','2017-01-29 15:13:51'),(5869,'MAIN_INFO_SOCIETE_GENCOD',1,'1234567890','chaine',0,'','2017-01-29 15:13:51'),(5870,'MAIN_INFO_SOCIETE_MANAGERS',1,'Zack Zeceo','chaine',0,'','2017-01-29 15:13:51'),(5871,'MAIN_INFO_CAPITAL',1,'10000','chaine',0,'','2017-01-29 15:13:51'),(5872,'MAIN_INFO_SOCIETE_FORME_JURIDIQUE',1,'0','chaine',0,'','2017-01-29 15:13:51'),(5873,'MAIN_INFO_SIREN',1,'123456','chaine',0,'','2017-01-29 15:13:51'),(5874,'MAIN_INFO_TVAINTRA',1,'FR1234567','chaine',0,'','2017-01-29 15:13:51'),(5875,'MAIN_INFO_SOCIETE_OBJECT',1,'A company demo to show how Dolibarr ERP CRM is wonderfull','chaine',0,'','2017-01-29 15:13:51'),(5876,'SOCIETE_FISCAL_MONTH_START',1,'1','chaine',0,'','2017-01-29 15:13:51'),(5877,'FACTURE_TVAOPTION',1,'1','chaine',0,'','2017-01-29 15:13:51'),(5878,'FACTURE_LOCAL_TAX1_OPTION',1,'localtax1on','chaine',0,'','2017-01-29 15:13:51'),(5879,'MAIN_INFO_VALUE_LOCALTAX1',1,'0','chaine',0,'','2017-01-29 15:13:51'),(5880,'MAIN_INFO_LOCALTAX_CALC1',1,'0','chaine',0,'','2017-01-29 15:13:51'),(5883,'MAILING_LIMIT_SENDBYWEB',0,'15','chaine',1,'Number of targets to defined packet size when sending mass email','2017-01-29 17:36:33'),(5884,'MAIN_MAIL_DEBUG',1,'0','chaine',1,'','2017-01-29 18:53:02'),(5885,'MAIN_SOAP_DEBUG',1,'0','chaine',1,'','2017-01-29 18:53:02'),(5887,'PROJECT_USE_OPPORTUNITIES',1,'1','chaine',0,'','2017-02-01 12:23:56'),(5888,'PROJECT_HIDE_TASKS',1,'1','chaine',0,'','2017-02-01 12:23:56'),(5889,'MAIN_AGENDA_ACTIONAUTO_COMPANY_SENTBYMAIL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5890,'MAIN_AGENDA_ACTIONAUTO_COMPANY_CREATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5891,'MAIN_AGENDA_ACTIONAUTO_PROPAL_CLOSE_REFUSED',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5892,'MAIN_AGENDA_ACTIONAUTO_PROPAL_CLOSE_SIGNED',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5893,'MAIN_AGENDA_ACTIONAUTO_PROPAL_CLASSIFY_BILLED',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5894,'MAIN_AGENDA_ACTIONAUTO_PROPAL_VALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5895,'MAIN_AGENDA_ACTIONAUTO_PROPAL_SENTBYMAIL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5896,'MAIN_AGENDA_ACTIONAUTO_ORDER_VALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5897,'MAIN_AGENDA_ACTIONAUTO_ORDER_CLOSE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5898,'MAIN_AGENDA_ACTIONAUTO_ORDER_CANCEL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5899,'MAIN_AGENDA_ACTIONAUTO_ORDER_SENTBYMAIL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5900,'MAIN_AGENDA_ACTIONAUTO_ORDER_CLASSIFY_BILLED',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5901,'MAIN_AGENDA_ACTIONAUTO_BILL_VALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5902,'MAIN_AGENDA_ACTIONAUTO_BILL_PAYED',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5903,'MAIN_AGENDA_ACTIONAUTO_BILL_CANCEL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5904,'MAIN_AGENDA_ACTIONAUTO_BILL_SENTBYMAIL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5905,'MAIN_AGENDA_ACTIONAUTO_BILL_UNVALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5906,'MAIN_AGENDA_ACTIONAUTO_ORDER_SUPPLIER_VALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5907,'MAIN_AGENDA_ACTIONAUTO_ORDER_SUPPLIER_APPROVE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5908,'MAIN_AGENDA_ACTIONAUTO_ORDER_SUPPLIER_RECEIVE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5909,'MAIN_AGENDA_ACTIONAUTO_ORDER_SUPPLIER_SUBMIT',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5910,'MAIN_AGENDA_ACTIONAUTO_ORDER_SUPPLIER_REFUSE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5911,'MAIN_AGENDA_ACTIONAUTO_ORDER_SUPPLIER_CLASSIFY_BILLED',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5912,'MAIN_AGENDA_ACTIONAUTO_ORDER_SUPPLIER_SENTBYMAIL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5913,'MAIN_AGENDA_ACTIONAUTO_BILL_SUPPLIER_UNVALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5914,'MAIN_AGENDA_ACTIONAUTO_BILL_SUPPLIER_VALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5915,'MAIN_AGENDA_ACTIONAUTO_BILL_SUPPLIER_PAYED',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5916,'MAIN_AGENDA_ACTIONAUTO_BILL_SUPPLIER_SENTBYMAIL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5917,'MAIN_AGENDA_ACTIONAUTO_BILL_SUPPLIER_CANCELED',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5918,'MAIN_AGENDA_ACTIONAUTO_CONTRACT_VALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5919,'MAIN_AGENDA_ACTIONAUTO_FICHINTER_REOPEN',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5920,'MAIN_AGENDA_ACTIONAUTO_FICHINTER_SENTBYMAIL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5921,'MAIN_AGENDA_ACTIONAUTO_FICHINTER_VALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5922,'MAIN_AGENDA_ACTIONAUTO_SHIPPING_VALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5923,'MAIN_AGENDA_ACTIONAUTO_SHIPPING_SENTBYMAIL',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5924,'MAIN_AGENDA_ACTIONAUTO_MEMBER_VALIDATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5925,'MAIN_AGENDA_ACTIONAUTO_MEMBER_SUBSCRIPTION',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5926,'MAIN_AGENDA_ACTIONAUTO_MEMBER_MODIFY',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5927,'MAIN_AGENDA_ACTIONAUTO_MEMBER_RESILIATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5928,'MAIN_AGENDA_ACTIONAUTO_MEMBER_DELETE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5929,'MAIN_AGENDA_ACTIONAUTO_PROJECT_CREATE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5930,'MAIN_AGENDA_ACTIONAUTO_PROJECT_DELETE',1,'1','chaine',0,'','2017-02-01 14:48:55'),(5931,'DATABASE_PWD_ENCRYPTED',1,'1','chaine',0,'','2017-02-01 15:06:04'),(5932,'MAIN_DISABLE_ALL_MAILS',1,'0','chaine',0,'','2017-02-01 15:09:09'),(5933,'MAIN_MAIL_SENDMODE',1,'mail','chaine',0,'','2017-02-01 15:09:09'),(5934,'MAIN_MAIL_SMTP_PORT',1,'465','chaine',0,'','2017-02-01 15:09:09'),(5935,'MAIN_MAIL_SMTP_SERVER',1,'smtp.mail.com','chaine',0,'','2017-02-01 15:09:09'),(5936,'MAIN_MAIL_SMTPS_ID',1,'eldy10@mail.com','chaine',0,'','2017-02-01 15:09:09'),(5937,'MAIN_MAIL_SMTPS_PW',1,'bidonge','chaine',0,'','2017-02-01 15:09:09'),(5938,'MAIN_MAIL_EMAIL_FROM',1,'robot@example.com','chaine',0,'','2017-02-01 15:09:09'),(5939,'MAIN_MAIL_DEFAULT_FROMTYPE',1,'user','chaine',0,'','2017-02-01 15:09:09'),(5940,'PRELEVEMENT_ID_BANKACCOUNT',1,'1','chaine',0,'','2017-02-06 04:04:47'),(5941,'PRELEVEMENT_ICS',1,'ICS123456','chaine',0,'','2017-02-06 04:04:47'),(5942,'PRELEVEMENT_USER',1,'1','chaine',0,'','2017-02-06 04:04:47'),(5943,'BANKADDON_PDF',1,'sepamandate','chaine',0,'','2017-02-06 04:13:52'),(5947,'CHEQUERECEIPTS_THYME_MASK',1,'CHK{yy}{mm}-{0000@1}','chaine',0,'','2017-02-06 04:16:27'),(5948,'MAIN_MODULE_LOAN',1,'1',NULL,0,NULL,'2017-02-06 19:19:05'),(5954,'MAIN_SUBMODULE_EXPEDITION',1,'1','chaine',0,'','2017-02-06 23:57:37'),(5963,'MAIN_MODULE_BANQUE',1,'1',NULL,0,NULL,'2017-02-07 18:56:12'),(5964,'MAIN_MODULE_TAX',1,'1',NULL,0,NULL,'2017-02-07 18:56:12'),(5995,'MAIN_MODULE_SOCIETE',1,'1',NULL,0,NULL,'2017-02-12 19:15:56'),(5996,'CABINETMED_RHEUMATOLOGY_ON',1,'0','texte',0,'','2017-02-12 19:20:04'),(5999,'MAIN_SEARCHFORM_SOCIETE',1,'1','texte',0,'','2017-02-12 19:20:04'),(6000,'CABINETMED_BANK_PATIENT_REQUIRED',1,'0','texte',0,'','2017-02-12 19:20:04'),(6004,'MAIN_MODULE_MULTICOMPANY_CSS',1,'[\"\\/multicompany\\/css\\/multicompany.css.php\"]','chaine',0,NULL,'2017-02-15 17:17:11'),(6019,'MAIN_INFO_SOCIETE_COUNTRY',2,'1:FR:France','chaine',0,'','2017-02-15 17:18:22'),(6020,'MAIN_INFO_SOCIETE_NOM',2,'MySecondCompany','chaine',0,'','2017-02-15 17:18:22'),(6021,'MAIN_INFO_SOCIETE_STATE',2,'0','chaine',0,'','2017-02-15 17:18:22'),(6022,'MAIN_MONNAIE',2,'EUR','chaine',0,'','2017-02-15 17:18:22'),(6023,'MAIN_LANG_DEFAULT',2,'auto','chaine',0,'','2017-02-15 17:18:22'),(6024,'MAIN_INFO_SOCIETE_COUNTRY',1,'14:CA:Canada','chaine',0,'','2017-02-15 17:18:41'),(6025,'MAIN_INFO_SOCIETE_NOM',1,'MyBigCompany','chaine',0,'','2017-02-15 17:18:41'),(6026,'MAIN_INFO_SOCIETE_ADDRESS',1,'21 Jump street','chaine',0,'','2017-02-15 17:18:41'),(6027,'MAIN_INFO_SOCIETE_TOWN',1,'MyTown','chaine',0,'','2017-02-15 17:18:41'),(6028,'MAIN_INFO_SOCIETE_ZIP',1,'75500','chaine',0,'','2017-02-15 17:18:41'),(6029,'MAIN_INFO_SOCIETE_STATE',1,'1514','chaine',0,'','2017-02-15 17:18:41'),(6030,'MAIN_MONNAIE',1,'EUR','chaine',0,'','2017-02-15 17:18:41'),(6031,'MAIN_LANG_DEFAULT',1,'auto','chaine',0,'','2017-02-15 17:18:41'),(6032,'MAIN_MODULE_MULTICURRENCY',1,'1',NULL,0,NULL,'2017-02-15 17:29:59'),(6047,'MAIN_MODULE_SYSLOG',0,'1',NULL,0,NULL,'2017-02-15 22:36:58'),(6048,'SYSLOG_FACILITY',0,'LOG_USER','chaine',0,'','2017-02-15 22:37:01'),(6049,'SYSLOG_FIREPHP_INCLUDEPATH',0,'/home/ldestailleur/git/dolibarr_5.0/htdocs/includes/firephp/firephp-core/lib/','chaine',0,'','2017-02-15 22:37:01'),(6050,'SYSLOG_FILE',0,'DOL_DATA_ROOT/dolibarr.log','chaine',0,'','2017-02-15 22:37:01'),(6051,'SYSLOG_CHROMEPHP_INCLUDEPATH',0,'/home/ldestailleur/git/dolibarr_5.0/htdocs/includes/ccampbell/chromephp/','chaine',0,'','2017-02-15 22:37:01'),(6052,'SYSLOG_HANDLERS',0,'[\"mod_syslog_file\"]','chaine',0,'','2017-02-15 22:37:01'),(6054,'SYSLOG_LEVEL',0,'7','chaine',0,'','2017-02-15 22:37:21'),(6074,'CABINETMED_DELAY_TO_LOCK_RECORD',1,'','chaine',1,'Number of days before locking edit of consultation','2017-02-21 00:04:15'),(6092,'MAIN_SIZE_SHORTLIST_LIMIT',0,'3','chaine',0,'Max length for small lists (tabs)','2017-05-12 09:02:38'),(6094,'MAIN_MODULE_BARCODE',1,'1',NULL,0,NULL,'2017-05-12 09:02:42'),(6095,'MAIN_MODULE_CRON',1,'1',NULL,0,NULL,'2017-05-12 09:02:42'),(6096,'MAIN_MODULE_FACTURE',1,'1',NULL,0,NULL,'2017-05-12 09:02:42'),(6097,'MAIN_VERSION_LAST_UPGRADE',0,'5.0.3','chaine',0,'Dolibarr version for last upgrade','2017-05-12 09:02:43'),(6099,'MAIN_MODULE_SKYPE',1,'1',NULL,0,NULL,'2017-05-12 09:03:51'),(6100,'MAIN_MODULE_GRAVATAR',1,'1',NULL,0,NULL,'2017-05-12 09:03:54'),(6101,'MAIN_MODULE_ACCOUNTING',1,'1',NULL,0,NULL,'2017-05-12 09:14:30'); /*!40000 ALTER TABLE `llx_const` ENABLE KEYS */; UNLOCK TABLES; @@ -3210,6 +3211,7 @@ CREATE TABLE `llx_contratdet` ( `date_fin_validite` datetime DEFAULT NULL, `date_cloture` datetime DEFAULT NULL, `tva_tx` double(6,3) DEFAULT '0.000', + `vat_src_code` varchar(10) DEFAULT '', `localtax1_tx` double(6,3) DEFAULT '0.000', `localtax1_type` varchar(10) NOT NULL DEFAULT '0', `localtax2_tx` double(6,3) DEFAULT '0.000', @@ -3258,7 +3260,7 @@ CREATE TABLE `llx_contratdet` ( LOCK TABLES `llx_contratdet` WRITE; /*!40000 ALTER TABLE `llx_contratdet` DISABLE KEYS */; -INSERT INTO `llx_contratdet` VALUES (1,'2013-03-06 09:00:00',1,3,4,'','',NULL,NULL,'2010-07-09 00:00:00','2010-07-09 12:00:00','2013-03-15 00:00:00',NULL,0.000,0.000,'',0.000,'',1,0,0.00000000,0,NULL,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,1,0,0,0.00000000,0,1,1,'',NULL,NULL,NULL,0.00000000,0.00000000,0.00000000,0.00000000),(2,'2010-07-10 16:14:14',2,NULL,0,'','Abonnement annuel assurance',NULL,NULL,'2010-07-10 00:00:00',NULL,'2011-07-10 00:00:00',NULL,1.000,0.000,'',0.000,'',1,0,10.00000000,10,0,10.00000000,0.10000000,0.00000000,0.00000000,10.10000000,1,0,NULL,0.00000000,0,NULL,NULL,NULL,NULL,NULL,NULL,0.00000000,0.00000000,0.00000000,0.00000000),(3,'2013-03-05 10:20:58',2,3,5,'','gdfg',NULL,NULL,'2010-07-10 00:00:00','2010-07-10 12:00:00','2011-07-09 00:00:00','2013-03-06 12:00:00',4.000,0.000,'',0.000,'',1,0,0.00000000,0,NULL,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,1,0,0,0.00000000,0,1,1,'',NULL,NULL,NULL,0.00000000,0.00000000,0.00000000,0.00000000),(4,'2012-12-08 13:11:17',2,3,0,'','',NULL,NULL,'2010-07-10 00:00:00',NULL,NULL,NULL,0.000,0.000,'',0.000,'',1,10,40.00000000,40,NULL,36.00000000,0.00000000,0.00000000,0.00000000,36.00000000,1,0,NULL,0.00000000,0,NULL,1,'',NULL,NULL,NULL,0.00000000,0.00000000,0.00000000,0.00000000),(5,'2013-03-06 09:05:40',3,NULL,4,'','gfdg',NULL,NULL,NULL,'2013-03-06 12:00:00','2013-03-07 12:00:00',NULL,0.000,0.000,'',0.000,'',1,0,10.00000000,10,NULL,10.00000000,0.00000000,0.00000000,0.00000000,10.00000000,1,0,0,0.00000000,0,1,1,'',NULL,NULL,NULL,0.00000000,0.00000000,0.00000000,0.00000000); +INSERT INTO `llx_contratdet` VALUES (1,'2013-03-06 09:00:00',1,3,4,'','',NULL,NULL,'2010-07-09 00:00:00','2010-07-09 12:00:00','2013-03-15 00:00:00',NULL,0.000,'',0.000,'',0.000,'',1,0,0.00000000,0,NULL,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,1,0,0,0.00000000,0,1,1,'',NULL,NULL,NULL,0.00000000,0.00000000,0.00000000,0.00000000),(2,'2010-07-10 16:14:14',2,NULL,0,'','Abonnement annuel assurance',NULL,NULL,'2010-07-10 00:00:00',NULL,'2011-07-10 00:00:00',NULL,1.000,'',0.000,'',0.000,'',1,0,10.00000000,10,0,10.00000000,0.10000000,0.00000000,0.00000000,10.10000000,1,0,NULL,0.00000000,0,NULL,NULL,NULL,NULL,NULL,NULL,0.00000000,0.00000000,0.00000000,0.00000000),(3,'2013-03-05 10:20:58',2,3,5,'','gdfg',NULL,NULL,'2010-07-10 00:00:00','2010-07-10 12:00:00','2011-07-09 00:00:00','2013-03-06 12:00:00',4.000,'',0.000,'',0.000,'',1,0,0.00000000,0,NULL,0.00000000,0.00000000,0.00000000,0.00000000,0.00000000,1,0,0,0.00000000,0,1,1,'',NULL,NULL,NULL,0.00000000,0.00000000,0.00000000,0.00000000),(4,'2012-12-08 13:11:17',2,3,0,'','',NULL,NULL,'2010-07-10 00:00:00',NULL,NULL,NULL,0.000,'',0.000,'',0.000,'',1,10,40.00000000,40,NULL,36.00000000,0.00000000,0.00000000,0.00000000,36.00000000,1,0,NULL,0.00000000,0,NULL,1,'',NULL,NULL,NULL,0.00000000,0.00000000,0.00000000,0.00000000),(5,'2013-03-06 09:05:40',3,NULL,4,'','gfdg',NULL,NULL,NULL,'2013-03-06 12:00:00','2013-03-07 12:00:00',NULL,0.000,'',0.000,'',0.000,'',1,0,10.00000000,10,NULL,10.00000000,0.00000000,0.00000000,0.00000000,10.00000000,1,0,0,0.00000000,0,1,1,'',NULL,NULL,NULL,0.00000000,0.00000000,0.00000000,0.00000000); /*!40000 ALTER TABLE `llx_contratdet` ENABLE KEYS */; UNLOCK TABLES; @@ -3393,7 +3395,7 @@ CREATE TABLE `llx_cronjob` ( `fk_mailing` int(11) DEFAULT NULL, `test` varchar(255) DEFAULT '1', PRIMARY KEY (`rowid`) -) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -3402,7 +3404,7 @@ CREATE TABLE `llx_cronjob` ( LOCK TABLES `llx_cronjob` WRITE; /*!40000 ALTER TABLE `llx_cronjob` DISABLE KEYS */; -INSERT INTO `llx_cronjob` VALUES (1,'2013-03-23 18:18:39','2013-03-23 19:18:39','command','aaa','aaaa','','','','','','',0,NULL,NULL,'2013-03-23 19:18:00',NULL,NULL,NULL,NULL,'3600',3600,0,0,1,1,'',NULL,0,0,0,NULL,'1'),(16,'2017-02-21 11:03:40','2017-02-21 15:03:40','method','PurgeDeleteTemporaryFilesShort',NULL,'core/class/utils.class.php','Utils','purgeFiles',NULL,NULL,'cron',10,NULL,NULL,'2017-02-21 15:03:40',NULL,NULL,NULL,NULL,'604800',2,NULL,1,NULL,NULL,'PurgeDeleteTemporaryFiles',NULL,1,0,0,NULL,'1'),(17,'2017-02-21 11:03:40','2017-02-21 15:03:40','method','MakeLocalDatabaseDumpShort',NULL,'core/class/utils.class.php','Utils','dumpDatabase','none',NULL,'cron',20,NULL,NULL,'2017-02-21 15:03:40',NULL,NULL,NULL,NULL,'604800',1,NULL,0,NULL,NULL,'MakeLocalDatabaseDump',NULL,1,0,0,NULL,'1'),(18,'2017-02-21 11:03:40','2017-02-21 15:03:40','method','RecurringInvoices',NULL,'compta/facture/class/facture-rec.class.php','FactureRec','createRecurringInvoices',NULL,NULL,'facture',0,NULL,NULL,'2017-02-21 15:03:40',NULL,NULL,NULL,NULL,'86400',1,NULL,1,NULL,NULL,'Generate recurring invoices',NULL,1,0,0,NULL,''); +INSERT INTO `llx_cronjob` VALUES (1,'2013-03-23 18:18:39','2013-03-23 19:18:39','command','aaa','aaaa','','','','','','',0,NULL,NULL,'2013-03-23 19:18:00',NULL,NULL,NULL,NULL,'3600',3600,0,0,1,1,'',NULL,0,0,0,NULL,'1'),(19,'2017-05-12 09:02:42','2017-05-12 13:02:42','method','PurgeDeleteTemporaryFilesShort',NULL,'core/class/utils.class.php','Utils','purgeFiles',NULL,NULL,'cron',10,NULL,NULL,'2017-05-12 13:02:42',NULL,NULL,NULL,NULL,'604800',2,NULL,1,NULL,NULL,'PurgeDeleteTemporaryFiles',NULL,1,0,0,NULL,'1'),(20,'2017-05-12 09:02:42','2017-05-12 13:02:42','method','MakeLocalDatabaseDumpShort',NULL,'core/class/utils.class.php','Utils','dumpDatabase','none,auto,1,auto,10',NULL,'cron',20,NULL,NULL,'2017-05-12 13:02:42',NULL,NULL,NULL,NULL,'604800',1,NULL,0,NULL,NULL,'MakeLocalDatabaseDump',NULL,1,0,0,NULL,'1'),(21,'2017-05-12 09:02:42','2017-05-12 13:02:42','method','RecurringInvoices',NULL,'compta/facture/class/facture-rec.class.php','FactureRec','createRecurringInvoices',NULL,NULL,'facture',0,NULL,NULL,'2017-05-12 13:02:42',NULL,NULL,NULL,NULL,'86400',1,NULL,1,NULL,NULL,'Generate recurring invoices',NULL,1,0,0,NULL,''); /*!40000 ALTER TABLE `llx_cronjob` ENABLE KEYS */; UNLOCK TABLES; @@ -3461,7 +3463,7 @@ CREATE TABLE `llx_document_model` ( `description` text, PRIMARY KEY (`rowid`), UNIQUE KEY `uk_document_model` (`nom`,`type`,`entity`) -) ENGINE=InnoDB AUTO_INCREMENT=285 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=286 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -3470,7 +3472,7 @@ CREATE TABLE `llx_document_model` ( LOCK TABLES `llx_document_model` WRITE; /*!40000 ALTER TABLE `llx_document_model` DISABLE KEYS */; -INSERT INTO `llx_document_model` VALUES (9,'merou',1,'shipping',NULL,NULL),(15,'fsfe.fr.php',1,'donation',NULL,NULL),(181,'generic_invoice_odt',1,'invoice','ODT templates','FACTURE_ADDON_PDF_ODT_PATH'),(193,'canelle2',1,'invoice_supplier','canelle2',NULL),(195,'canelle',1,'invoice_supplier','canelle',NULL),(198,'azur',2,'propal',NULL,NULL),(199,'html_cerfafr',2,'donation',NULL,NULL),(200,'crabe',2,'invoice',NULL,NULL),(201,'generic_odt',1,'company','ODT templates','COMPANY_ADDON_PDF_ODT_PATH'),(250,'baleine',1,'project',NULL,NULL),(255,'soleil',1,'ficheinter',NULL,NULL),(256,'azur',1,'propal',NULL,NULL),(270,'aurore',1,'supplier_proposal',NULL,NULL),(272,'html_cerfafr',1,'donation',NULL,NULL),(273,'beluga',1,'project','beluga',NULL),(274,'rouget',1,'shipping',NULL,NULL),(275,'typhon',1,'delivery',NULL,NULL),(276,'einstein',1,'order',NULL,NULL),(277,'muscadet',1,'order_supplier',NULL,NULL),(278,'standard',1,'expensereport',NULL,NULL),(281,'sepamandate',1,'bankaccount','sepamandate',NULL),(284,'crabe',1,'invoice',NULL,NULL); +INSERT INTO `llx_document_model` VALUES (9,'merou',1,'shipping',NULL,NULL),(15,'fsfe.fr.php',1,'donation',NULL,NULL),(181,'generic_invoice_odt',1,'invoice','ODT templates','FACTURE_ADDON_PDF_ODT_PATH'),(193,'canelle2',1,'invoice_supplier','canelle2',NULL),(195,'canelle',1,'invoice_supplier','canelle',NULL),(198,'azur',2,'propal',NULL,NULL),(199,'html_cerfafr',2,'donation',NULL,NULL),(200,'crabe',2,'invoice',NULL,NULL),(201,'generic_odt',1,'company','ODT templates','COMPANY_ADDON_PDF_ODT_PATH'),(250,'baleine',1,'project',NULL,NULL),(255,'soleil',1,'ficheinter',NULL,NULL),(256,'azur',1,'propal',NULL,NULL),(270,'aurore',1,'supplier_proposal',NULL,NULL),(272,'html_cerfafr',1,'donation',NULL,NULL),(273,'beluga',1,'project','beluga',NULL),(274,'rouget',1,'shipping',NULL,NULL),(275,'typhon',1,'delivery',NULL,NULL),(276,'einstein',1,'order',NULL,NULL),(277,'muscadet',1,'order_supplier',NULL,NULL),(278,'standard',1,'expensereport',NULL,NULL),(281,'sepamandate',1,'bankaccount','sepamandate',NULL),(285,'crabe',1,'invoice',NULL,NULL); /*!40000 ALTER TABLE `llx_document_model` ENABLE KEYS */; UNLOCK TABLES; @@ -4090,12 +4092,12 @@ CREATE TABLE `llx_events` ( `dateevent` datetime DEFAULT NULL, `fk_user` int(11) DEFAULT NULL, `description` varchar(250) NOT NULL, - `ip` varchar(32) NOT NULL, + `ip` varchar(250) DEFAULT NULL, `user_agent` varchar(255) DEFAULT NULL, `fk_object` int(11) DEFAULT NULL, PRIMARY KEY (`rowid`), KEY `idx_events_dateevent` (`dateevent`) -) ENGINE=InnoDB AUTO_INCREMENT=842 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=843 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -4104,7 +4106,7 @@ CREATE TABLE `llx_events` ( LOCK TABLES `llx_events` WRITE; /*!40000 ALTER TABLE `llx_events` DISABLE KEYS */; -INSERT INTO `llx_events` VALUES (30,'2011-07-18 18:23:06','USER_LOGOUT',1,'2011-07-18 20:23:06',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(31,'2011-07-18 18:23:12','USER_LOGIN_FAILED',1,'2011-07-18 20:23:12',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(32,'2011-07-18 18:23:17','USER_LOGIN',1,'2011-07-18 20:23:17',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(33,'2011-07-18 20:10:51','USER_LOGIN_FAILED',1,'2011-07-18 22:10:51',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(34,'2011-07-18 20:10:55','USER_LOGIN',1,'2011-07-18 22:10:55',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(35,'2011-07-18 21:18:57','USER_LOGIN',1,'2011-07-18 23:18:57',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(36,'2011-07-20 10:34:10','USER_LOGIN',1,'2011-07-20 12:34:10',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(37,'2011-07-20 12:36:44','USER_LOGIN',1,'2011-07-20 14:36:44',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(38,'2011-07-20 13:20:51','USER_LOGIN_FAILED',1,'2011-07-20 15:20:51',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(39,'2011-07-20 13:20:54','USER_LOGIN',1,'2011-07-20 15:20:54',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(40,'2011-07-20 15:03:46','USER_LOGIN_FAILED',1,'2011-07-20 17:03:46',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(41,'2011-07-20 15:03:55','USER_LOGIN',1,'2011-07-20 17:03:55',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(42,'2011-07-20 18:05:05','USER_LOGIN_FAILED',1,'2011-07-20 20:05:05',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(43,'2011-07-20 18:05:08','USER_LOGIN',1,'2011-07-20 20:05:08',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(44,'2011-07-20 21:08:53','USER_LOGIN_FAILED',1,'2011-07-20 23:08:53',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(45,'2011-07-20 21:08:56','USER_LOGIN',1,'2011-07-20 23:08:56',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(46,'2011-07-21 01:26:12','USER_LOGIN',1,'2011-07-21 03:26:12',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(47,'2011-07-21 22:35:45','USER_LOGIN_FAILED',1,'2011-07-22 00:35:45',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(48,'2011-07-21 22:35:49','USER_LOGIN',1,'2011-07-22 00:35:49',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(49,'2011-07-26 23:09:47','USER_LOGIN_FAILED',1,'2011-07-27 01:09:47',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(50,'2011-07-26 23:09:50','USER_LOGIN',1,'2011-07-27 01:09:50',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(51,'2011-07-27 17:02:27','USER_LOGIN_FAILED',1,'2011-07-27 19:02:27',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(52,'2011-07-27 17:02:32','USER_LOGIN',1,'2011-07-27 19:02:32',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(53,'2011-07-27 23:33:37','USER_LOGIN_FAILED',1,'2011-07-28 01:33:37',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(54,'2011-07-27 23:33:41','USER_LOGIN',1,'2011-07-28 01:33:41',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(55,'2011-07-28 18:20:36','USER_LOGIN_FAILED',1,'2011-07-28 20:20:36',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(56,'2011-07-28 18:20:38','USER_LOGIN',1,'2011-07-28 20:20:38',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(57,'2011-07-28 20:13:30','USER_LOGIN_FAILED',1,'2011-07-28 22:13:30',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(58,'2011-07-28 20:13:34','USER_LOGIN',1,'2011-07-28 22:13:34',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(59,'2011-07-28 20:22:51','USER_LOGIN',1,'2011-07-28 22:22:51',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(60,'2011-07-28 23:05:06','USER_LOGIN',1,'2011-07-29 01:05:06',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(61,'2011-07-29 20:15:50','USER_LOGIN_FAILED',1,'2011-07-29 22:15:50',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(62,'2011-07-29 20:15:53','USER_LOGIN',1,'2011-07-29 22:15:53',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(68,'2011-07-29 20:51:01','USER_LOGOUT',1,'2011-07-29 22:51:01',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(69,'2011-07-29 20:51:05','USER_LOGIN',1,'2011-07-29 22:51:05',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(70,'2011-07-30 08:46:20','USER_LOGIN_FAILED',1,'2011-07-30 10:46:20',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(71,'2011-07-30 08:46:38','USER_LOGIN_FAILED',1,'2011-07-30 10:46:38',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(72,'2011-07-30 08:46:42','USER_LOGIN',1,'2011-07-30 10:46:42',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(73,'2011-07-30 10:05:12','USER_LOGIN_FAILED',1,'2011-07-30 12:05:12',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(74,'2011-07-30 10:05:15','USER_LOGIN',1,'2011-07-30 12:05:15',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(75,'2011-07-30 12:15:46','USER_LOGIN',1,'2011-07-30 14:15:46',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(76,'2011-07-31 22:19:30','USER_LOGIN',1,'2011-08-01 00:19:30',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(77,'2011-07-31 23:32:52','USER_LOGIN',1,'2011-08-01 01:32:52',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(78,'2011-08-01 01:24:50','USER_LOGIN_FAILED',1,'2011-08-01 03:24:50',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(79,'2011-08-01 01:24:54','USER_LOGIN',1,'2011-08-01 03:24:54',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(80,'2011-08-01 19:31:36','USER_LOGIN_FAILED',1,'2011-08-01 21:31:35',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(81,'2011-08-01 19:31:39','USER_LOGIN',1,'2011-08-01 21:31:39',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(82,'2011-08-01 20:01:36','USER_LOGIN',1,'2011-08-01 22:01:36',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(83,'2011-08-01 20:52:54','USER_LOGIN_FAILED',1,'2011-08-01 22:52:54',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(84,'2011-08-01 20:52:58','USER_LOGIN',1,'2011-08-01 22:52:58',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(85,'2011-08-01 21:17:28','USER_LOGIN_FAILED',1,'2011-08-01 23:17:28',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(86,'2011-08-01 21:17:31','USER_LOGIN',1,'2011-08-01 23:17:31',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(87,'2011-08-04 11:55:17','USER_LOGIN',1,'2011-08-04 13:55:17',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(88,'2011-08-04 20:19:03','USER_LOGIN_FAILED',1,'2011-08-04 22:19:03',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(89,'2011-08-04 20:19:07','USER_LOGIN',1,'2011-08-04 22:19:07',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(90,'2011-08-05 17:51:42','USER_LOGIN_FAILED',1,'2011-08-05 19:51:42',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(91,'2011-08-05 17:51:47','USER_LOGIN',1,'2011-08-05 19:51:47',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(92,'2011-08-05 17:56:03','USER_LOGIN',1,'2011-08-05 19:56:03',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(93,'2011-08-05 17:59:10','USER_LOGIN',1,'2011-08-05 19:59:10',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30',NULL),(94,'2011-08-05 18:01:58','USER_LOGIN',1,'2011-08-05 20:01:58',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30',NULL),(95,'2011-08-05 19:59:56','USER_LOGIN',1,'2011-08-05 21:59:56',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(96,'2011-08-06 18:33:22','USER_LOGIN',1,'2011-08-06 20:33:22',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(97,'2011-08-07 00:56:59','USER_LOGIN',1,'2011-08-07 02:56:59',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(98,'2011-08-07 22:49:14','USER_LOGIN',1,'2011-08-08 00:49:14',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(99,'2011-08-07 23:05:18','USER_LOGOUT',1,'2011-08-08 01:05:18',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(105,'2011-08-08 00:41:09','USER_LOGIN',1,'2011-08-08 02:41:09',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(106,'2011-08-08 11:58:55','USER_LOGIN',1,'2011-08-08 13:58:55',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(107,'2011-08-08 14:35:48','USER_LOGIN',1,'2011-08-08 16:35:48',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(108,'2011-08-08 14:36:31','USER_LOGOUT',1,'2011-08-08 16:36:31',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(109,'2011-08-08 14:38:28','USER_LOGIN',1,'2011-08-08 16:38:28',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(110,'2011-08-08 14:39:02','USER_LOGOUT',1,'2011-08-08 16:39:02',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(111,'2011-08-08 14:39:10','USER_LOGIN',1,'2011-08-08 16:39:10',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(112,'2011-08-08 14:39:28','USER_LOGOUT',1,'2011-08-08 16:39:28',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(113,'2011-08-08 14:39:37','USER_LOGIN',1,'2011-08-08 16:39:37',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(114,'2011-08-08 14:50:02','USER_LOGOUT',1,'2011-08-08 16:50:02',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(115,'2011-08-08 14:51:45','USER_LOGIN_FAILED',1,'2011-08-08 16:51:45',NULL,'Identifiants login ou mot de passe incorrects - login=','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(116,'2011-08-08 14:51:52','USER_LOGIN',1,'2011-08-08 16:51:52',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(117,'2011-08-08 15:09:54','USER_LOGOUT',1,'2011-08-08 17:09:54',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(118,'2011-08-08 15:10:19','USER_LOGIN_FAILED',1,'2011-08-08 17:10:19',NULL,'Identifiants login ou mot de passe incorrects - login=','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(119,'2011-08-08 15:10:28','USER_LOGIN',1,'2011-08-08 17:10:28',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(121,'2011-08-08 15:14:58','USER_LOGOUT',1,'2011-08-08 17:14:58',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(122,'2011-08-08 15:15:00','USER_LOGIN_FAILED',1,'2011-08-08 17:15:00',NULL,'Identifiants login ou mot de passe incorrects - login=','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(123,'2011-08-08 15:17:57','USER_LOGIN',1,'2011-08-08 17:17:57',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(124,'2011-08-08 15:35:56','USER_LOGOUT',1,'2011-08-08 17:35:56',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(125,'2011-08-08 15:36:05','USER_LOGIN',1,'2011-08-08 17:36:05',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(126,'2011-08-08 17:32:42','USER_LOGIN',1,'2011-08-08 19:32:42',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(127,'2012-12-08 13:49:37','USER_LOGOUT',1,'2012-12-08 14:49:37',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(128,'2012-12-08 13:49:42','USER_LOGIN',1,'2012-12-08 14:49:42',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(129,'2012-12-08 13:50:12','USER_LOGOUT',1,'2012-12-08 14:50:12',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(130,'2012-12-08 13:50:14','USER_LOGIN',1,'2012-12-08 14:50:14',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(131,'2012-12-08 13:50:17','USER_LOGOUT',1,'2012-12-08 14:50:17',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(132,'2012-12-08 13:52:47','USER_LOGIN',1,'2012-12-08 14:52:47',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(133,'2012-12-08 13:53:08','USER_MODIFY',1,'2012-12-08 14:53:08',1,'User admin modified','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(134,'2012-12-08 14:08:45','USER_LOGOUT',1,'2012-12-08 15:08:45',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(135,'2012-12-08 14:09:09','USER_LOGIN',1,'2012-12-08 15:09:09',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(136,'2012-12-08 14:11:43','USER_LOGOUT',1,'2012-12-08 15:11:43',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(137,'2012-12-08 14:11:45','USER_LOGIN',1,'2012-12-08 15:11:45',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(138,'2012-12-08 14:22:53','USER_LOGOUT',1,'2012-12-08 15:22:53',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(139,'2012-12-08 14:22:54','USER_LOGIN',1,'2012-12-08 15:22:54',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(140,'2012-12-08 14:23:10','USER_LOGOUT',1,'2012-12-08 15:23:10',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(141,'2012-12-08 14:23:11','USER_LOGIN',1,'2012-12-08 15:23:11',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(142,'2012-12-08 14:23:49','USER_LOGOUT',1,'2012-12-08 15:23:49',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(143,'2012-12-08 14:23:50','USER_LOGIN',1,'2012-12-08 15:23:50',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(144,'2012-12-08 14:28:08','USER_LOGOUT',1,'2012-12-08 15:28:08',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(145,'2012-12-08 14:35:15','USER_LOGIN',1,'2012-12-08 15:35:15',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(146,'2012-12-08 14:35:18','USER_LOGOUT',1,'2012-12-08 15:35:18',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(147,'2012-12-08 14:36:07','USER_LOGIN',1,'2012-12-08 15:36:07',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(148,'2012-12-08 14:36:09','USER_LOGOUT',1,'2012-12-08 15:36:09',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(149,'2012-12-08 14:36:41','USER_LOGIN',1,'2012-12-08 15:36:41',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(150,'2012-12-08 15:59:13','USER_LOGIN',1,'2012-12-08 16:59:13',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(151,'2012-12-09 11:49:52','USER_LOGIN',1,'2012-12-09 12:49:52',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(152,'2012-12-09 13:46:31','USER_LOGIN',1,'2012-12-09 14:46:31',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(153,'2012-12-09 19:03:14','USER_LOGIN',1,'2012-12-09 20:03:14',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(154,'2012-12-10 00:16:31','USER_LOGIN',1,'2012-12-10 01:16:31',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(170,'2012-12-11 22:03:31','USER_LOGIN',1,'2012-12-11 23:03:31',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(171,'2012-12-12 00:32:39','USER_LOGIN',1,'2012-12-12 01:32:39',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(172,'2012-12-12 10:49:59','USER_LOGIN',1,'2012-12-12 11:49:59',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(175,'2012-12-12 10:57:40','USER_MODIFY',1,'2012-12-12 11:57:40',1,'Modification utilisateur admin','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(176,'2012-12-12 13:29:15','USER_LOGIN',1,'2012-12-12 14:29:15',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(177,'2012-12-12 13:30:15','USER_LOGIN',1,'2012-12-12 14:30:15',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(178,'2012-12-12 13:40:08','USER_LOGOUT',1,'2012-12-12 14:40:08',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(179,'2012-12-12 13:40:10','USER_LOGIN',1,'2012-12-12 14:40:10',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(180,'2012-12-12 13:40:26','USER_MODIFY',1,'2012-12-12 14:40:26',1,'Modification utilisateur admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(181,'2012-12-12 13:40:34','USER_LOGOUT',1,'2012-12-12 14:40:34',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(182,'2012-12-12 13:42:23','USER_LOGIN',1,'2012-12-12 14:42:23',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(183,'2012-12-12 13:43:02','USER_NEW_PASSWORD',1,'2012-12-12 14:43:02',NULL,'Changement mot de passe de admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(184,'2012-12-12 13:43:25','USER_LOGOUT',1,'2012-12-12 14:43:25',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(185,'2012-12-12 13:43:27','USER_LOGIN_FAILED',1,'2012-12-12 14:43:27',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(186,'2012-12-12 13:43:30','USER_LOGIN',1,'2012-12-12 14:43:30',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(187,'2012-12-12 14:52:11','USER_LOGIN',1,'2012-12-12 15:52:11',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(188,'2012-12-12 17:53:00','USER_LOGIN_FAILED',1,'2012-12-12 18:53:00',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(189,'2012-12-12 17:53:07','USER_LOGIN_FAILED',1,'2012-12-12 18:53:07',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(190,'2012-12-12 17:53:51','USER_NEW_PASSWORD',1,'2012-12-12 18:53:51',NULL,'Changement mot de passe de admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(191,'2012-12-12 17:54:00','USER_LOGIN',1,'2012-12-12 18:54:00',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(192,'2012-12-12 17:54:10','USER_NEW_PASSWORD',1,'2012-12-12 18:54:10',1,'Changement mot de passe de admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(193,'2012-12-12 17:54:10','USER_MODIFY',1,'2012-12-12 18:54:10',1,'Modification utilisateur admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(194,'2012-12-12 18:57:09','USER_LOGIN',1,'2012-12-12 19:57:09',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(195,'2012-12-12 23:04:08','USER_LOGIN',1,'2012-12-13 00:04:08',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(196,'2012-12-17 20:03:14','USER_LOGIN',1,'2012-12-17 21:03:14',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(197,'2012-12-17 21:18:45','USER_LOGIN',1,'2012-12-17 22:18:45',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(198,'2012-12-17 22:30:08','USER_LOGIN',1,'2012-12-17 23:30:08',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(199,'2012-12-18 23:32:03','USER_LOGIN',1,'2012-12-19 00:32:03',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(200,'2012-12-19 09:38:03','USER_LOGIN',1,'2012-12-19 10:38:03',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(201,'2012-12-19 11:23:35','USER_LOGIN',1,'2012-12-19 12:23:35',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(202,'2012-12-19 12:46:22','USER_LOGIN',1,'2012-12-19 13:46:22',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(214,'2012-12-19 19:11:31','USER_LOGIN',1,'2012-12-19 20:11:31',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(215,'2012-12-21 16:36:57','USER_LOGIN',1,'2012-12-21 17:36:57',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(216,'2012-12-21 16:38:43','USER_NEW_PASSWORD',1,'2012-12-21 17:38:43',1,'Changement mot de passe de adupont','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(217,'2012-12-21 16:38:43','USER_MODIFY',1,'2012-12-21 17:38:43',1,'Modification utilisateur adupont','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(218,'2012-12-21 16:38:51','USER_LOGOUT',1,'2012-12-21 17:38:51',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(219,'2012-12-21 16:38:55','USER_LOGIN',1,'2012-12-21 17:38:55',3,'(UserLogged,adupont)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(220,'2012-12-21 16:48:18','USER_LOGOUT',1,'2012-12-21 17:48:18',3,'(UserLogoff,adupont)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(221,'2012-12-21 16:48:20','USER_LOGIN',1,'2012-12-21 17:48:20',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(222,'2012-12-26 18:28:18','USER_LOGIN',1,'2012-12-26 19:28:18',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(223,'2012-12-26 20:00:24','USER_LOGIN',1,'2012-12-26 21:00:24',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(224,'2012-12-27 01:10:27','USER_LOGIN',1,'2012-12-27 02:10:27',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(225,'2012-12-28 19:12:08','USER_LOGIN',1,'2012-12-28 20:12:08',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(226,'2012-12-28 20:16:58','USER_LOGIN',1,'2012-12-28 21:16:58',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(227,'2012-12-29 14:35:46','USER_LOGIN',1,'2012-12-29 15:35:46',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(228,'2012-12-29 14:37:59','USER_LOGOUT',1,'2012-12-29 15:37:59',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(229,'2012-12-29 14:38:00','USER_LOGIN',1,'2012-12-29 15:38:00',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(230,'2012-12-29 17:16:48','USER_LOGIN',1,'2012-12-29 18:16:48',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(231,'2012-12-31 12:02:59','USER_LOGIN',1,'2012-12-31 13:02:59',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(232,'2013-01-02 20:32:51','USER_LOGIN',1,'2013-01-02 21:32:51',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0',NULL),(233,'2013-01-02 20:58:59','USER_LOGIN',1,'2013-01-02 21:58:59',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(234,'2013-01-03 09:25:07','USER_LOGIN',1,'2013-01-03 10:25:07',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(235,'2013-01-03 19:39:31','USER_LOGIN',1,'2013-01-03 20:39:31',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(236,'2013-01-04 22:40:19','USER_LOGIN',1,'2013-01-04 23:40:19',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(237,'2013-01-05 12:59:59','USER_LOGIN',1,'2013-01-05 13:59:59',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(238,'2013-01-05 15:28:52','USER_LOGIN',1,'2013-01-05 16:28:52',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(239,'2013-01-05 17:02:08','USER_LOGIN',1,'2013-01-05 18:02:08',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(240,'2013-01-06 12:13:33','USER_LOGIN',1,'2013-01-06 13:13:33',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(241,'2013-01-07 01:21:15','USER_LOGIN',1,'2013-01-07 02:21:15',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(242,'2013-01-07 01:46:31','USER_LOGOUT',1,'2013-01-07 02:46:31',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(243,'2013-01-07 19:54:50','USER_LOGIN',1,'2013-01-07 20:54:50',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(244,'2013-01-08 21:55:01','USER_LOGIN',1,'2013-01-08 22:55:01',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(245,'2013-01-09 11:13:28','USER_LOGIN',1,'2013-01-09 12:13:28',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(246,'2013-01-10 18:30:46','USER_LOGIN',1,'2013-01-10 19:30:46',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(247,'2013-01-11 18:03:26','USER_LOGIN',1,'2013-01-11 19:03:26',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(248,'2013-01-12 11:15:04','USER_LOGIN',1,'2013-01-12 12:15:04',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(249,'2013-01-12 14:42:44','USER_LOGIN',1,'2013-01-12 15:42:44',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(250,'2013-01-13 12:07:17','USER_LOGIN',1,'2013-01-13 13:07:17',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(251,'2013-01-13 17:37:58','USER_LOGIN',1,'2013-01-13 18:37:58',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(252,'2013-01-13 19:24:21','USER_LOGIN',1,'2013-01-13 20:24:21',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(253,'2013-01-13 19:29:19','USER_LOGOUT',1,'2013-01-13 20:29:19',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(254,'2013-01-13 21:39:39','USER_LOGIN',1,'2013-01-13 22:39:39',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(255,'2013-01-14 00:52:21','USER_LOGIN',1,'2013-01-14 01:52:21',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(256,'2013-01-16 11:34:31','USER_LOGIN',1,'2013-01-16 12:34:31',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(257,'2013-01-16 15:36:21','USER_LOGIN',1,'2013-01-16 16:36:21',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(258,'2013-01-16 19:17:36','USER_LOGIN',1,'2013-01-16 20:17:36',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(259,'2013-01-16 19:48:08','GROUP_CREATE',1,'2013-01-16 20:48:08',1,'Création groupe ggg','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(260,'2013-01-16 21:48:53','USER_LOGIN',1,'2013-01-16 22:48:53',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(261,'2013-01-17 19:55:53','USER_LOGIN',1,'2013-01-17 20:55:53',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(262,'2013-01-18 09:48:01','USER_LOGIN',1,'2013-01-18 10:48:01',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(263,'2013-01-18 13:22:36','USER_LOGIN',1,'2013-01-18 14:22:36',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(264,'2013-01-18 16:10:23','USER_LOGIN',1,'2013-01-18 17:10:22',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(265,'2013-01-18 17:41:40','USER_LOGIN',1,'2013-01-18 18:41:40',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(266,'2013-01-19 14:33:48','USER_LOGIN',1,'2013-01-19 15:33:48',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(267,'2013-01-19 16:47:43','USER_LOGIN',1,'2013-01-19 17:47:43',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(268,'2013-01-19 16:59:43','USER_LOGIN',1,'2013-01-19 17:59:43',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(269,'2013-01-19 17:00:22','USER_LOGIN',1,'2013-01-19 18:00:22',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(270,'2013-01-19 17:04:16','USER_LOGOUT',1,'2013-01-19 18:04:16',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(271,'2013-01-19 17:04:18','USER_LOGIN',1,'2013-01-19 18:04:18',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(272,'2013-01-20 00:34:19','USER_LOGIN',1,'2013-01-20 01:34:19',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(273,'2013-01-21 11:54:17','USER_LOGIN',1,'2013-01-21 12:54:17',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(274,'2013-01-21 13:48:15','USER_LOGIN',1,'2013-01-21 14:48:15',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(275,'2013-01-21 14:30:22','USER_LOGIN',1,'2013-01-21 15:30:22',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(276,'2013-01-21 15:10:46','USER_LOGIN',1,'2013-01-21 16:10:46',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(277,'2013-01-21 17:27:43','USER_LOGIN',1,'2013-01-21 18:27:43',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(278,'2013-01-21 21:48:15','USER_LOGIN',1,'2013-01-21 22:48:15',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(279,'2013-01-21 21:50:42','USER_LOGIN',1,'2013-01-21 22:50:42',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(280,'2013-01-23 09:28:26','USER_LOGIN',1,'2013-01-23 10:28:26',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(281,'2013-01-23 13:21:57','USER_LOGIN',1,'2013-01-23 14:21:57',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(282,'2013-01-23 16:52:00','USER_LOGOUT',1,'2013-01-23 17:52:00',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(283,'2013-01-23 16:52:05','USER_LOGIN_FAILED',1,'2013-01-23 17:52:05',NULL,'Bad value for login or password - login=bbb','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(284,'2013-01-23 16:52:09','USER_LOGIN',1,'2013-01-23 17:52:09',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(285,'2013-01-23 16:52:27','USER_CREATE',1,'2013-01-23 17:52:27',1,'Création utilisateur aaa','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(286,'2013-01-23 16:52:27','USER_NEW_PASSWORD',1,'2013-01-23 17:52:27',1,'Changement mot de passe de aaa','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(287,'2013-01-23 16:52:37','USER_CREATE',1,'2013-01-23 17:52:37',1,'Création utilisateur bbb','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(288,'2013-01-23 16:52:37','USER_NEW_PASSWORD',1,'2013-01-23 17:52:37',1,'Changement mot de passe de bbb','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(289,'2013-01-23 16:53:15','USER_LOGOUT',1,'2013-01-23 17:53:15',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(290,'2013-01-23 16:53:20','USER_LOGIN',1,'2013-01-23 17:53:20',4,'(UserLogged,aaa)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(291,'2013-01-23 19:16:58','USER_LOGIN',1,'2013-01-23 20:16:58',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(292,'2013-01-26 10:54:07','USER_LOGIN',1,'2013-01-26 11:54:07',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(293,'2013-01-29 10:15:36','USER_LOGIN',1,'2013-01-29 11:15:36',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(294,'2013-01-30 17:42:50','USER_LOGIN',1,'2013-01-30 18:42:50',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(295,'2013-02-01 08:49:55','USER_LOGIN',1,'2013-02-01 09:49:55',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(296,'2013-02-01 08:51:57','USER_LOGOUT',1,'2013-02-01 09:51:57',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(297,'2013-02-01 08:52:39','USER_LOGIN',1,'2013-02-01 09:52:39',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(298,'2013-02-01 21:03:01','USER_LOGIN',1,'2013-02-01 22:03:01',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(299,'2013-02-10 19:48:39','USER_LOGIN',1,'2013-02-10 20:48:39',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(300,'2013-02-10 20:46:48','USER_LOGIN',1,'2013-02-10 21:46:48',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(301,'2013-02-10 21:39:23','USER_LOGIN',1,'2013-02-10 22:39:23',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(302,'2013-02-11 19:00:13','USER_LOGIN',1,'2013-02-11 20:00:13',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(303,'2013-02-11 19:43:44','USER_LOGIN_FAILED',1,'2013-02-11 20:43:44',NULL,'Unknown column \'u.fk_user\' in \'field list\'','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(304,'2013-02-11 19:44:01','USER_LOGIN',1,'2013-02-11 20:44:01',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(305,'2013-02-12 00:27:35','USER_LOGIN',1,'2013-02-12 01:27:35',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(306,'2013-02-12 00:27:38','USER_LOGOUT',1,'2013-02-12 01:27:38',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(307,'2013-02-12 00:28:07','USER_LOGIN',1,'2013-02-12 01:28:07',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(308,'2013-02-12 00:28:09','USER_LOGOUT',1,'2013-02-12 01:28:09',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(309,'2013-02-12 00:28:26','USER_LOGIN',1,'2013-02-12 01:28:26',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(310,'2013-02-12 00:28:30','USER_LOGOUT',1,'2013-02-12 01:28:30',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(311,'2013-02-12 12:42:15','USER_LOGIN',1,'2013-02-12 13:42:15',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(312,'2013-02-12 13:46:16','USER_LOGIN',1,'2013-02-12 14:46:16',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(313,'2013-02-12 14:54:28','USER_LOGIN',1,'2013-02-12 15:54:28',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(314,'2013-02-12 16:04:46','USER_LOGIN',1,'2013-02-12 17:04:46',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(315,'2013-02-13 14:02:43','USER_LOGIN',1,'2013-02-13 15:02:43',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(316,'2013-02-13 14:48:30','USER_LOGIN',1,'2013-02-13 15:48:30',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(317,'2013-02-13 17:44:53','USER_LOGIN',1,'2013-02-13 18:44:53',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(318,'2013-02-15 08:44:36','USER_LOGIN',1,'2013-02-15 09:44:36',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(319,'2013-02-15 08:53:20','USER_LOGIN',1,'2013-02-15 09:53:20',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(320,'2013-02-16 19:10:28','USER_LOGIN',1,'2013-02-16 20:10:28',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(321,'2013-02-16 19:22:40','USER_CREATE',1,'2013-02-16 20:22:40',1,'Création utilisateur aaab','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(322,'2013-02-16 19:22:40','USER_NEW_PASSWORD',1,'2013-02-16 20:22:40',1,'Changement mot de passe de aaab','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(323,'2013-02-16 19:48:15','USER_CREATE',1,'2013-02-16 20:48:15',1,'Création utilisateur zzz','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(324,'2013-02-16 19:48:15','USER_NEW_PASSWORD',1,'2013-02-16 20:48:15',1,'Changement mot de passe de zzz','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(325,'2013-02-16 19:50:08','USER_CREATE',1,'2013-02-16 20:50:08',1,'Création utilisateur zzzg','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(326,'2013-02-16 19:50:08','USER_NEW_PASSWORD',1,'2013-02-16 20:50:08',1,'Changement mot de passe de zzzg','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(327,'2013-02-16 21:20:03','USER_LOGIN',1,'2013-02-16 22:20:03',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(328,'2013-02-17 14:30:51','USER_LOGIN',1,'2013-02-17 15:30:51',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(329,'2013-02-17 17:21:22','USER_LOGIN',1,'2013-02-17 18:21:22',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(330,'2013-02-17 17:48:43','USER_MODIFY',1,'2013-02-17 18:48:43',1,'Modification utilisateur aaa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(331,'2013-02-17 17:48:47','USER_MODIFY',1,'2013-02-17 18:48:47',1,'Modification utilisateur aaa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(332,'2013-02-17 17:48:51','USER_MODIFY',1,'2013-02-17 18:48:51',1,'Modification utilisateur aaa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(333,'2013-02-17 17:48:56','USER_MODIFY',1,'2013-02-17 18:48:56',1,'Modification utilisateur aaa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(334,'2013-02-18 22:00:01','USER_LOGIN',1,'2013-02-18 23:00:01',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(335,'2013-02-19 08:19:52','USER_LOGIN',1,'2013-02-19 09:19:52',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(336,'2013-02-19 22:00:52','USER_LOGIN',1,'2013-02-19 23:00:52',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(337,'2013-02-20 09:34:52','USER_LOGIN',1,'2013-02-20 10:34:52',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(338,'2013-02-20 13:12:28','USER_LOGIN',1,'2013-02-20 14:12:28',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(339,'2013-02-20 17:19:44','USER_LOGIN',1,'2013-02-20 18:19:44',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(340,'2013-02-20 19:07:21','USER_MODIFY',1,'2013-02-20 20:07:21',1,'Modification utilisateur adupont','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(341,'2013-02-20 19:47:17','USER_LOGIN',1,'2013-02-20 20:47:17',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(342,'2013-02-20 19:48:01','USER_MODIFY',1,'2013-02-20 20:48:01',1,'Modification utilisateur aaa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(343,'2013-02-21 08:27:07','USER_LOGIN',1,'2013-02-21 09:27:07',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(344,'2013-02-23 13:34:13','USER_LOGIN',1,'2013-02-23 14:34:13',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(345,'2013-02-24 01:06:41','USER_LOGIN_FAILED',1,'2013-02-24 02:06:41',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(346,'2013-02-24 01:06:45','USER_LOGIN_FAILED',1,'2013-02-24 02:06:45',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(347,'2013-02-24 01:06:55','USER_LOGIN_FAILED',1,'2013-02-24 02:06:55',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(348,'2013-02-24 01:07:03','USER_LOGIN_FAILED',1,'2013-02-24 02:07:03',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(349,'2013-02-24 01:07:21','USER_LOGIN_FAILED',1,'2013-02-24 02:07:21',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(350,'2013-02-24 01:08:12','USER_LOGIN_FAILED',1,'2013-02-24 02:08:12',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(351,'2013-02-24 01:08:42','USER_LOGIN_FAILED',1,'2013-02-24 02:08:42',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(352,'2013-02-24 01:08:50','USER_LOGIN_FAILED',1,'2013-02-24 02:08:50',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(353,'2013-02-24 01:09:08','USER_LOGIN_FAILED',1,'2013-02-24 02:09:08',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(354,'2013-02-24 01:09:42','USER_LOGIN_FAILED',1,'2013-02-24 02:09:42',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(355,'2013-02-24 01:09:50','USER_LOGIN_FAILED',1,'2013-02-24 02:09:50',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(356,'2013-02-24 01:10:05','USER_LOGIN_FAILED',1,'2013-02-24 02:10:05',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(357,'2013-02-24 01:10:22','USER_LOGIN_FAILED',1,'2013-02-24 02:10:22',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(358,'2013-02-24 01:10:30','USER_LOGIN_FAILED',1,'2013-02-24 02:10:30',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(359,'2013-02-24 01:10:56','USER_LOGIN_FAILED',1,'2013-02-24 02:10:56',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(360,'2013-02-24 01:11:26','USER_LOGIN_FAILED',1,'2013-02-24 02:11:26',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(361,'2013-02-24 01:12:06','USER_LOGIN_FAILED',1,'2013-02-24 02:12:06',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(362,'2013-02-24 01:21:14','USER_LOGIN_FAILED',1,'2013-02-24 02:21:14',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(363,'2013-02-24 01:21:25','USER_LOGIN_FAILED',1,'2013-02-24 02:21:25',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(364,'2013-02-24 01:21:54','USER_LOGIN_FAILED',1,'2013-02-24 02:21:54',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(365,'2013-02-24 01:22:14','USER_LOGIN_FAILED',1,'2013-02-24 02:22:14',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(366,'2013-02-24 01:22:37','USER_LOGIN_FAILED',1,'2013-02-24 02:22:37',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(367,'2013-02-24 01:23:01','USER_LOGIN_FAILED',1,'2013-02-24 02:23:01',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(368,'2013-02-24 01:23:39','USER_LOGIN_FAILED',1,'2013-02-24 02:23:39',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(369,'2013-02-24 01:24:04','USER_LOGIN_FAILED',1,'2013-02-24 02:24:04',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(370,'2013-02-24 01:24:39','USER_LOGIN_FAILED',1,'2013-02-24 02:24:39',NULL,'Bad value for login or password - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(371,'2013-02-24 01:25:01','USER_LOGIN_FAILED',1,'2013-02-24 02:25:01',NULL,'Bad value for login or password - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(372,'2013-02-24 01:25:12','USER_LOGIN_FAILED',1,'2013-02-24 02:25:12',NULL,'Bad value for login or password - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(373,'2013-02-24 01:27:30','USER_LOGIN_FAILED',1,'2013-02-24 02:27:30',NULL,'Bad value for login or password - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(374,'2013-02-24 01:28:00','USER_LOGIN_FAILED',1,'2013-02-24 02:28:00',NULL,'Bad value for login or password - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(375,'2013-02-24 01:28:35','USER_LOGIN_FAILED',1,'2013-02-24 02:28:35',NULL,'Bad value for login or password - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(376,'2013-02-24 01:29:03','USER_LOGIN_FAILED',1,'2013-02-24 02:29:03',NULL,'Bad value for login or password - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(377,'2013-02-24 01:29:55','USER_LOGIN_FAILED',1,'2013-02-24 02:29:55',NULL,'Bad value for login or password - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(378,'2013-02-24 01:32:40','USER_LOGIN_FAILED',1,'2013-02-24 02:32:40',NULL,'Bad value for login or password - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(379,'2013-02-24 01:39:33','USER_LOGIN_FAILED',1,'2013-02-24 02:39:33',NULL,'Identifiants login ou mot de passe incorrects - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(380,'2013-02-24 01:39:38','USER_LOGIN_FAILED',1,'2013-02-24 02:39:38',NULL,'Identifiants login ou mot de passe incorrects - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(381,'2013-02-24 01:39:47','USER_LOGIN_FAILED',1,'2013-02-24 02:39:47',NULL,'Identifiants login ou mot de passe incorrects - login=lmkm','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(382,'2013-02-24 01:40:54','USER_LOGIN_FAILED',1,'2013-02-24 02:40:54',NULL,'Identifiants login ou mot de passe incorrects - login=lmkm','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(383,'2013-02-24 01:47:57','USER_LOGIN_FAILED',1,'2013-02-24 02:47:57',NULL,'Identifiants login ou mot de passe incorrects - login=lmkm','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(384,'2013-02-24 01:48:05','USER_LOGIN_FAILED',1,'2013-02-24 02:48:05',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(385,'2013-02-24 01:48:07','USER_LOGIN_FAILED',1,'2013-02-24 02:48:07',NULL,'Unknown column \'u.lastname\' in \'field list\'','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(386,'2013-02-24 01:48:35','USER_LOGIN',1,'2013-02-24 02:48:35',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(387,'2013-02-24 01:56:32','USER_LOGIN',1,'2013-02-24 02:56:32',1,'(UserLogged,admin)','192.168.0.254','Mozilla/5.0 (Linux; U; Android 2.2; en-us; sdk Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1',NULL),(388,'2013-02-24 02:05:55','USER_LOGOUT',1,'2013-02-24 03:05:55',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(389,'2013-02-24 02:39:52','USER_LOGIN',1,'2013-02-24 03:39:52',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(390,'2013-02-24 02:51:10','USER_LOGOUT',1,'2013-02-24 03:51:10',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(391,'2013-02-24 12:46:41','USER_LOGIN',1,'2013-02-24 13:46:41',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(392,'2013-02-24 12:46:52','USER_LOGOUT',1,'2013-02-24 13:46:52',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(393,'2013-02-24 12:46:56','USER_LOGIN',1,'2013-02-24 13:46:56',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(394,'2013-02-24 12:47:56','USER_LOGOUT',1,'2013-02-24 13:47:56',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(395,'2013-02-24 12:48:00','USER_LOGIN',1,'2013-02-24 13:48:00',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(396,'2013-02-24 12:48:11','USER_LOGOUT',1,'2013-02-24 13:48:11',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(397,'2013-02-24 12:48:32','USER_LOGIN',1,'2013-02-24 13:48:32',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(398,'2013-02-24 12:52:22','USER_LOGOUT',1,'2013-02-24 13:52:22',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(399,'2013-02-24 12:52:27','USER_LOGIN',1,'2013-02-24 13:52:27',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(400,'2013-02-24 12:52:54','USER_LOGOUT',1,'2013-02-24 13:52:54',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(401,'2013-02-24 12:52:59','USER_LOGIN',1,'2013-02-24 13:52:59',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(402,'2013-02-24 12:55:39','USER_LOGOUT',1,'2013-02-24 13:55:39',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(403,'2013-02-24 12:55:59','USER_LOGIN',1,'2013-02-24 13:55:59',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(404,'2013-02-24 12:56:07','USER_LOGOUT',1,'2013-02-24 13:56:07',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(405,'2013-02-24 12:56:23','USER_LOGIN',1,'2013-02-24 13:56:23',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(406,'2013-02-24 12:56:46','USER_LOGOUT',1,'2013-02-24 13:56:46',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(407,'2013-02-24 12:58:30','USER_LOGIN',1,'2013-02-24 13:58:30',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(408,'2013-02-24 12:58:33','USER_LOGOUT',1,'2013-02-24 13:58:33',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(409,'2013-02-24 12:58:51','USER_LOGIN',1,'2013-02-24 13:58:51',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(410,'2013-02-24 12:58:58','USER_LOGOUT',1,'2013-02-24 13:58:58',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(411,'2013-02-24 13:18:53','USER_LOGIN',1,'2013-02-24 14:18:53',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(412,'2013-02-24 13:19:52','USER_LOGOUT',1,'2013-02-24 14:19:52',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(413,'2013-02-24 15:39:31','USER_LOGIN_FAILED',1,'2013-02-24 16:39:31',NULL,'ErrorBadValueForCode - login=admin','127.0.0.1',NULL,NULL),(414,'2013-02-24 15:42:07','USER_LOGIN',1,'2013-02-24 16:42:07',1,'(UserLogged,admin)','127.0.0.1',NULL,NULL),(415,'2013-02-24 15:42:52','USER_LOGOUT',1,'2013-02-24 16:42:52',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7',NULL),(416,'2013-02-24 16:04:21','USER_LOGIN',1,'2013-02-24 17:04:21',1,'(UserLogged,admin)','192.168.0.254','Mozilla/5.0 (Linux; U; Android 2.2; en-us; sdk Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1',NULL),(417,'2013-02-24 16:11:28','USER_LOGIN_FAILED',1,'2013-02-24 17:11:28',NULL,'ErrorBadValueForCode - login=admin','127.0.0.1','Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7',NULL),(418,'2013-02-24 16:11:37','USER_LOGIN',1,'2013-02-24 17:11:37',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7',NULL),(419,'2013-02-24 16:36:52','USER_LOGOUT',1,'2013-02-24 17:36:52',1,'(UserLogoff,admin)','192.168.0.254','Mozilla/5.0 (Linux; U; Android 2.2; en-us; sdk Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1',NULL),(420,'2013-02-24 16:40:37','USER_LOGIN',1,'2013-02-24 17:40:37',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(421,'2013-02-24 16:57:16','USER_LOGIN',1,'2013-02-24 17:57:16',1,'(UserLogged,admin)','192.168.0.254','Mozilla/5.0 (Linux; U; Android 2.2; en-us; sdk Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 2131034114',NULL),(422,'2013-02-24 17:01:30','USER_LOGOUT',1,'2013-02-24 18:01:30',1,'(UserLogoff,admin)','192.168.0.254','Mozilla/5.0 (Linux; U; Android 2.2; en-us; sdk Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 2131034114',NULL),(423,'2013-02-24 17:02:33','USER_LOGIN',1,'2013-02-24 18:02:33',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(424,'2013-02-24 17:14:22','USER_LOGOUT',1,'2013-02-24 18:14:22',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(425,'2013-02-24 17:15:07','USER_LOGIN_FAILED',1,'2013-02-24 18:15:07',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(426,'2013-02-24 17:15:20','USER_LOGIN',1,'2013-02-24 18:15:20',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(427,'2013-02-24 17:20:14','USER_LOGIN',1,'2013-02-24 18:20:14',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(428,'2013-02-24 17:20:51','USER_LOGIN',1,'2013-02-24 18:20:51',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(429,'2013-02-24 17:20:54','USER_LOGOUT',1,'2013-02-24 18:20:54',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(430,'2013-02-24 17:21:19','USER_LOGIN',1,'2013-02-24 18:21:19',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(431,'2013-02-24 17:32:35','USER_LOGIN',1,'2013-02-24 18:32:35',1,'(UserLogged,admin)','192.168.0.254','Mozilla/5.0 (Linux; U; Android 2.2; en-us; sdk Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 2131034114',NULL),(432,'2013-02-24 18:28:48','USER_LOGIN',1,'2013-02-24 19:28:48',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(433,'2013-02-24 18:29:27','USER_LOGOUT',1,'2013-02-24 19:29:27',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7',NULL),(434,'2013-02-24 18:29:32','USER_LOGIN',1,'2013-02-24 19:29:32',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7',NULL),(435,'2013-02-24 20:13:13','USER_LOGOUT',1,'2013-02-24 21:13:13',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(436,'2013-02-24 20:13:17','USER_LOGIN',1,'2013-02-24 21:13:17',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(437,'2013-02-25 08:57:16','USER_LOGIN',1,'2013-02-25 09:57:16',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(438,'2013-02-25 08:57:59','USER_LOGOUT',1,'2013-02-25 09:57:59',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(439,'2013-02-25 09:15:02','USER_LOGIN',1,'2013-02-25 10:15:02',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(440,'2013-02-25 09:15:50','USER_LOGOUT',1,'2013-02-25 10:15:50',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(441,'2013-02-25 09:15:57','USER_LOGIN',1,'2013-02-25 10:15:57',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(442,'2013-02-25 09:16:12','USER_LOGOUT',1,'2013-02-25 10:16:12',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(443,'2013-02-25 09:16:19','USER_LOGIN',1,'2013-02-25 10:16:19',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(444,'2013-02-25 09:16:25','USER_LOGOUT',1,'2013-02-25 10:16:25',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(445,'2013-02-25 09:16:39','USER_LOGIN_FAILED',1,'2013-02-25 10:16:39',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(446,'2013-02-25 09:16:42','USER_LOGIN_FAILED',1,'2013-02-25 10:16:42',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(447,'2013-02-25 09:16:54','USER_LOGIN_FAILED',1,'2013-02-25 10:16:54',NULL,'Identificadors d'usuari o contrasenya incorrectes - login=gfdg','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(448,'2013-02-25 09:17:53','USER_LOGIN',1,'2013-02-25 10:17:53',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(449,'2013-02-25 09:18:37','USER_LOGOUT',1,'2013-02-25 10:18:37',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(450,'2013-02-25 09:18:41','USER_LOGIN',1,'2013-02-25 10:18:41',4,'(UserLogged,aaa)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(451,'2013-02-25 09:18:47','USER_LOGOUT',1,'2013-02-25 10:18:47',4,'(UserLogoff,aaa)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(452,'2013-02-25 10:05:34','USER_LOGIN',1,'2013-02-25 11:05:34',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(453,'2013-02-26 21:51:40','USER_LOGIN',1,'2013-02-26 22:51:40',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(454,'2013-02-26 23:30:06','USER_LOGIN',1,'2013-02-27 00:30:06',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(455,'2013-02-27 14:13:11','USER_LOGIN',1,'2013-02-27 15:13:11',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(456,'2013-02-27 18:12:06','USER_LOGIN_FAILED',1,'2013-02-27 19:12:06',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(457,'2013-02-27 18:12:10','USER_LOGIN',1,'2013-02-27 19:12:10',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(458,'2013-02-27 20:20:08','USER_LOGIN',1,'2013-02-27 21:20:08',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(459,'2013-03-01 22:12:03','USER_LOGIN',1,'2013-03-01 23:12:03',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(460,'2013-03-02 11:45:50','USER_LOGIN',1,'2013-03-02 12:45:50',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(461,'2013-03-02 15:53:51','USER_LOGIN_FAILED',1,'2013-03-02 16:53:51',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(462,'2013-03-02 15:53:53','USER_LOGIN',1,'2013-03-02 16:53:53',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(463,'2013-03-02 18:32:32','USER_LOGIN',1,'2013-03-02 19:32:32',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(464,'2013-03-02 22:59:36','USER_LOGIN',1,'2013-03-02 23:59:36',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(465,'2013-03-03 16:26:26','USER_LOGIN',1,'2013-03-03 17:26:26',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(466,'2013-03-03 22:50:27','USER_LOGIN',1,'2013-03-03 23:50:27',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(467,'2013-03-04 08:29:27','USER_LOGIN',1,'2013-03-04 09:29:27',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(468,'2013-03-04 18:27:28','USER_LOGIN',1,'2013-03-04 19:27:28',1,'(UserLogged,admin)','192.168.0.254','Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; NP06)',NULL),(469,'2013-03-04 19:27:23','USER_LOGIN',1,'2013-03-04 20:27:23',1,'(UserLogged,admin)','192.168.0.254','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',NULL),(470,'2013-03-04 19:35:14','USER_LOGIN',1,'2013-03-04 20:35:14',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(471,'2013-03-04 19:55:49','USER_LOGIN',1,'2013-03-04 20:55:49',1,'(UserLogged,admin)','192.168.0.254','Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',NULL),(472,'2013-03-04 21:16:13','USER_LOGIN',1,'2013-03-04 22:16:13',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(473,'2013-03-05 10:17:30','USER_LOGIN',1,'2013-03-05 11:17:30',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(474,'2013-03-05 11:02:43','USER_LOGIN',1,'2013-03-05 12:02:43',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(475,'2013-03-05 23:14:39','USER_LOGIN',1,'2013-03-06 00:14:39',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(476,'2013-03-06 08:58:57','USER_LOGIN',1,'2013-03-06 09:58:57',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(477,'2013-03-06 14:29:40','USER_LOGIN',1,'2013-03-06 15:29:40',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(478,'2013-03-06 21:53:02','USER_LOGIN',1,'2013-03-06 22:53:02',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(479,'2013-03-07 21:14:39','USER_LOGIN',1,'2013-03-07 22:14:39',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(480,'2013-03-08 00:06:05','USER_LOGIN',1,'2013-03-08 01:06:05',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(481,'2013-03-08 01:38:13','USER_LOGIN',1,'2013-03-08 02:38:13',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(482,'2013-03-08 08:59:50','USER_LOGIN',1,'2013-03-08 09:59:50',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(483,'2013-03-09 12:08:51','USER_LOGIN',1,'2013-03-09 13:08:51',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(484,'2013-03-09 15:19:53','USER_LOGIN',1,'2013-03-09 16:19:53',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(495,'2013-03-09 18:06:21','USER_LOGIN',1,'2013-03-09 19:06:21',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(496,'2013-03-09 20:01:24','USER_LOGIN',1,'2013-03-09 21:01:24',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(497,'2013-03-09 23:36:45','USER_LOGIN',1,'2013-03-10 00:36:45',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(498,'2013-03-10 14:37:13','USER_LOGIN',1,'2013-03-10 15:37:13',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(499,'2013-03-10 17:54:12','USER_LOGIN',1,'2013-03-10 18:54:12',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(500,'2013-03-11 08:57:09','USER_LOGIN',1,'2013-03-11 09:57:09',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(501,'2013-03-11 22:05:13','USER_LOGIN',1,'2013-03-11 23:05:13',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(502,'2013-03-12 08:34:27','USER_LOGIN',1,'2013-03-12 09:34:27',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(503,'2013-03-13 09:11:02','USER_LOGIN',1,'2013-03-13 10:11:02',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(504,'2013-03-13 10:02:11','USER_LOGIN',1,'2013-03-13 11:02:11',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(505,'2013-03-13 13:20:58','USER_LOGIN',1,'2013-03-13 14:20:58',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(506,'2013-03-13 16:19:28','USER_LOGIN',1,'2013-03-13 17:19:28',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(507,'2013-03-13 18:34:30','USER_LOGIN',1,'2013-03-13 19:34:30',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(508,'2013-03-14 08:25:02','USER_LOGIN',1,'2013-03-14 09:25:02',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(509,'2013-03-14 19:15:22','USER_LOGIN',1,'2013-03-14 20:15:22',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(510,'2013-03-14 21:58:53','USER_LOGIN',1,'2013-03-14 22:58:53',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(511,'2013-03-14 21:58:59','USER_LOGOUT',1,'2013-03-14 22:58:59',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(512,'2013-03-14 21:59:07','USER_LOGIN',1,'2013-03-14 22:59:07',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(513,'2013-03-14 22:58:22','USER_LOGOUT',1,'2013-03-14 23:58:22',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(514,'2013-03-14 23:00:25','USER_LOGIN',1,'2013-03-15 00:00:25',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(515,'2013-03-16 12:14:28','USER_LOGIN',1,'2013-03-16 13:14:28',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(516,'2013-03-16 16:09:01','USER_LOGIN',1,'2013-03-16 17:09:01',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(517,'2013-03-16 16:57:11','USER_LOGIN',1,'2013-03-16 17:57:11',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(518,'2013-03-16 19:31:31','USER_LOGIN',1,'2013-03-16 20:31:31',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(519,'2013-03-17 17:44:39','USER_LOGIN',1,'2013-03-17 18:44:39',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(520,'2013-03-17 20:40:57','USER_LOGIN',1,'2013-03-17 21:40:57',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(521,'2013-03-17 23:14:05','USER_LOGIN',1,'2013-03-18 00:14:05',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(522,'2013-03-17 23:28:47','USER_LOGOUT',1,'2013-03-18 00:28:47',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(523,'2013-03-17 23:28:54','USER_LOGIN',1,'2013-03-18 00:28:54',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(524,'2013-03-18 17:37:30','USER_LOGIN',1,'2013-03-18 18:37:30',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(525,'2013-03-18 18:11:37','USER_LOGIN',1,'2013-03-18 19:11:37',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(526,'2013-03-19 08:35:08','USER_LOGIN',1,'2013-03-19 09:35:08',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(527,'2013-03-19 09:20:23','USER_LOGIN',1,'2013-03-19 10:20:23',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(528,'2013-03-20 13:17:13','USER_LOGIN',1,'2013-03-20 14:17:13',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(529,'2013-03-20 14:44:31','USER_LOGIN',1,'2013-03-20 15:44:31',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(530,'2013-03-20 18:24:25','USER_LOGIN',1,'2013-03-20 19:24:25',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(531,'2013-03-20 19:15:54','USER_LOGIN',1,'2013-03-20 20:15:54',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(532,'2013-03-21 18:40:47','USER_LOGIN',1,'2013-03-21 19:40:47',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(533,'2013-03-21 21:42:24','USER_LOGIN',1,'2013-03-21 22:42:24',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(534,'2013-03-22 08:39:23','USER_LOGIN',1,'2013-03-22 09:39:23',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(535,'2013-03-23 13:04:55','USER_LOGIN',1,'2013-03-23 14:04:55',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(536,'2013-03-23 15:47:43','USER_LOGIN',1,'2013-03-23 16:47:43',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(537,'2013-03-23 22:56:36','USER_LOGIN',1,'2013-03-23 23:56:36',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(538,'2013-03-24 01:22:32','USER_LOGIN',1,'2013-03-24 02:22:32',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(539,'2013-03-24 14:40:42','USER_LOGIN',1,'2013-03-24 15:40:42',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(540,'2013-03-24 15:30:26','USER_LOGOUT',1,'2013-03-24 16:30:26',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(541,'2013-03-24 15:30:29','USER_LOGIN',1,'2013-03-24 16:30:29',2,'(UserLogged,demo)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(542,'2013-03-24 15:49:40','USER_LOGOUT',1,'2013-03-24 16:49:40',2,'(UserLogoff,demo)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(543,'2013-03-24 15:49:48','USER_LOGIN',1,'2013-03-24 16:49:48',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(544,'2013-03-24 15:52:35','USER_MODIFY',1,'2013-03-24 16:52:35',1,'Modification utilisateur zzzg','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(545,'2013-03-24 15:52:52','USER_MODIFY',1,'2013-03-24 16:52:52',1,'Modification utilisateur zzzg','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(546,'2013-03-24 15:53:09','USER_MODIFY',1,'2013-03-24 16:53:09',1,'Modification utilisateur zzzg','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(547,'2013-03-24 15:53:23','USER_MODIFY',1,'2013-03-24 16:53:23',1,'Modification utilisateur zzzg','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(548,'2013-03-24 16:00:04','USER_MODIFY',1,'2013-03-24 17:00:04',1,'Modification utilisateur zzzg','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(549,'2013-03-24 16:01:50','USER_MODIFY',1,'2013-03-24 17:01:50',1,'Modification utilisateur zzzg','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(550,'2013-03-24 16:10:14','USER_MODIFY',1,'2013-03-24 17:10:14',1,'Modification utilisateur zzzg','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(551,'2013-03-24 16:55:13','USER_LOGIN',1,'2013-03-24 17:55:13',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(552,'2013-03-24 17:44:29','USER_LOGIN',1,'2013-03-24 18:44:29',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(553,'2013-09-08 23:06:26','USER_LOGIN',1,'2013-09-09 01:06:26',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36',NULL),(554,'2013-10-21 22:32:28','USER_LOGIN',1,'2013-10-22 00:32:28',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.66 Safari/537.36',NULL),(555,'2013-10-21 22:32:48','USER_LOGIN',1,'2013-10-22 00:32:48',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.66 Safari/537.36',NULL),(556,'2013-11-07 00:01:51','USER_LOGIN',1,'2013-11-07 01:01:51',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.114 Safari/537.36',NULL),(557,'2014-03-02 15:21:07','USER_LOGIN',1,'2014-03-02 16:21:07',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36',NULL),(558,'2014-03-02 15:36:53','USER_LOGIN',1,'2014-03-02 16:36:53',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36',NULL),(559,'2014-03-02 18:54:23','USER_LOGIN',1,'2014-03-02 19:54:23',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36',NULL),(560,'2014-03-02 19:11:17','USER_LOGIN',1,'2014-03-02 20:11:17',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36',NULL),(561,'2014-03-03 18:19:24','USER_LOGIN',1,'2014-03-03 19:19:24',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36',NULL),(562,'2014-12-21 12:51:38','USER_LOGIN',1,'2014-12-21 13:51:38',1,'(UserLogged,admin) - TZ=1;TZString=CET;Screen=1920x969','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36',NULL),(563,'2014-12-21 19:52:09','USER_LOGIN',1,'2014-12-21 20:52:09',1,'(UserLogged,admin) - TZ=1;TZString=CET;Screen=1920x969','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36',NULL),(566,'2015-10-03 08:49:43','USER_NEW_PASSWORD',1,'2015-10-03 10:49:43',1,'Password change for admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(567,'2015-10-03 08:49:43','USER_MODIFY',1,'2015-10-03 10:49:43',1,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(568,'2015-10-03 09:03:12','USER_MODIFY',1,'2015-10-03 11:03:12',1,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(569,'2015-10-03 09:03:42','USER_MODIFY',1,'2015-10-03 11:03:42',1,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(570,'2015-10-03 09:07:36','USER_MODIFY',1,'2015-10-03 11:07:36',1,'User demo modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(571,'2015-10-03 09:08:58','USER_NEW_PASSWORD',1,'2015-10-03 11:08:58',1,'Password change for pcurie','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(572,'2015-10-03 09:08:58','USER_MODIFY',1,'2015-10-03 11:08:58',1,'User pcurie modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(573,'2015-10-03 09:09:23','USER_MODIFY',1,'2015-10-03 11:09:23',1,'User pcurie modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(574,'2015-10-03 09:11:04','USER_NEW_PASSWORD',1,'2015-10-03 11:11:04',1,'Password change for athestudent','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(575,'2015-10-03 09:11:04','USER_MODIFY',1,'2015-10-03 11:11:04',1,'User athestudent modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(576,'2015-10-03 09:11:53','USER_MODIFY',1,'2015-10-03 11:11:53',1,'User abookkeeper modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(577,'2015-10-03 09:42:12','USER_LOGIN_FAILED',1,'2015-10-03 11:42:11',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(578,'2015-10-03 09:42:19','USER_LOGIN_FAILED',1,'2015-10-03 11:42:19',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(579,'2015-10-03 09:42:42','USER_LOGIN_FAILED',1,'2015-10-03 11:42:42',NULL,'Bad value for login or password - login=aeinstein','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(580,'2015-10-03 09:43:50','USER_LOGIN',1,'2015-10-03 11:43:50',1,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x788','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(581,'2015-10-03 09:44:44','GROUP_MODIFY',1,'2015-10-03 11:44:44',1,'Group Sale representatives modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(582,'2015-10-03 09:46:25','GROUP_CREATE',1,'2015-10-03 11:46:25',1,'Group Management created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(583,'2015-10-03 09:46:46','GROUP_CREATE',1,'2015-10-03 11:46:46',1,'Group Scientists created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(584,'2015-10-03 09:47:41','USER_CREATE',1,'2015-10-03 11:47:41',1,'User mcurie created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(585,'2015-10-03 09:47:41','USER_NEW_PASSWORD',1,'2015-10-03 11:47:41',1,'Password change for mcurie','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(586,'2015-10-03 09:47:53','USER_MODIFY',1,'2015-10-03 11:47:53',1,'User mcurie modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(587,'2015-10-03 09:48:32','USER_DELETE',1,'2015-10-03 11:48:32',1,'User bbb removed','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(588,'2015-10-03 09:48:52','USER_MODIFY',1,'2015-10-03 11:48:52',1,'User bookkeeper modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(589,'2015-10-03 10:01:28','USER_MODIFY',1,'2015-10-03 12:01:28',1,'User bookkeeper modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(590,'2015-10-03 10:01:39','USER_MODIFY',1,'2015-10-03 12:01:39',1,'User bookkeeper modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(591,'2015-10-05 06:32:38','USER_LOGIN_FAILED',1,'2015-10-05 08:32:38',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(592,'2015-10-05 06:32:44','USER_LOGIN',1,'2015-10-05 08:32:44',1,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(593,'2015-10-05 07:07:52','USER_CREATE',1,'2015-10-05 09:07:52',1,'User atheceo created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(594,'2015-10-05 07:07:52','USER_NEW_PASSWORD',1,'2015-10-05 09:07:52',1,'Password change for atheceo','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(595,'2015-10-05 07:09:08','USER_NEW_PASSWORD',1,'2015-10-05 09:09:08',1,'Password change for aeinstein','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(596,'2015-10-05 07:09:08','USER_MODIFY',1,'2015-10-05 09:09:08',1,'User aeinstein modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(597,'2015-10-05 07:09:46','USER_CREATE',1,'2015-10-05 09:09:46',1,'User admin created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(598,'2015-10-05 07:09:46','USER_NEW_PASSWORD',1,'2015-10-05 09:09:46',1,'Password change for admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(599,'2015-10-05 07:10:20','USER_MODIFY',1,'2015-10-05 09:10:20',1,'User demo modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(600,'2015-10-05 07:10:48','USER_MODIFY',1,'2015-10-05 09:10:48',1,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(601,'2015-10-05 07:11:22','USER_NEW_PASSWORD',1,'2015-10-05 09:11:22',1,'Password change for bbookkeeper','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(602,'2015-10-05 07:11:22','USER_MODIFY',1,'2015-10-05 09:11:22',1,'User bbookkeeper modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(603,'2015-10-05 07:12:37','USER_MODIFY',1,'2015-10-05 09:12:37',1,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(604,'2015-10-05 07:13:27','USER_MODIFY',1,'2015-10-05 09:13:27',1,'User demo modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(605,'2015-10-05 07:13:52','USER_MODIFY',1,'2015-10-05 09:13:52',1,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(606,'2015-10-05 07:14:35','USER_LOGOUT',1,'2015-10-05 09:14:35',1,'(UserLogoff,aeinstein)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(607,'2015-10-05 07:14:40','USER_LOGIN_FAILED',1,'2015-10-05 09:14:40',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(608,'2015-10-05 07:14:44','USER_LOGIN_FAILED',1,'2015-10-05 09:14:44',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(609,'2015-10-05 07:14:49','USER_LOGIN',1,'2015-10-05 09:14:49',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(610,'2015-10-05 07:57:18','USER_MODIFY',1,'2015-10-05 09:57:18',12,'User aeinstein modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(611,'2015-10-05 08:06:54','USER_LOGOUT',1,'2015-10-05 10:06:54',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(612,'2015-10-05 08:07:03','USER_LOGIN',1,'2015-10-05 10:07:03',11,'(UserLogged,atheceo) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(613,'2015-10-05 19:18:46','USER_LOGIN',1,'2015-10-05 21:18:46',11,'(UserLogged,atheceo) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(614,'2015-10-05 19:29:35','USER_CREATE',1,'2015-10-05 21:29:35',11,'User ccommercy created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(615,'2015-10-05 19:29:35','USER_NEW_PASSWORD',1,'2015-10-05 21:29:35',11,'Password change for ccommercy','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(616,'2015-10-05 19:30:13','GROUP_CREATE',1,'2015-10-05 21:30:13',11,'Group Commercial created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(617,'2015-10-05 19:31:37','USER_NEW_PASSWORD',1,'2015-10-05 21:31:37',11,'Password change for admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(618,'2015-10-05 19:31:37','USER_MODIFY',1,'2015-10-05 21:31:37',11,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(619,'2015-10-05 19:32:00','USER_MODIFY',1,'2015-10-05 21:32:00',11,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(620,'2015-10-05 19:33:33','USER_CREATE',1,'2015-10-05 21:33:33',11,'User sscientol created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(621,'2015-10-05 19:33:33','USER_NEW_PASSWORD',1,'2015-10-05 21:33:33',11,'Password change for sscientol','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(622,'2015-10-05 19:33:47','USER_NEW_PASSWORD',1,'2015-10-05 21:33:47',11,'Password change for mcurie','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(623,'2015-10-05 19:33:47','USER_MODIFY',1,'2015-10-05 21:33:47',11,'User mcurie modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(624,'2015-10-05 19:34:23','USER_NEW_PASSWORD',1,'2015-10-05 21:34:23',11,'Password change for pcurie','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(625,'2015-10-05 19:34:23','USER_MODIFY',1,'2015-10-05 21:34:23',11,'User pcurie modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(626,'2015-10-05 19:34:42','USER_MODIFY',1,'2015-10-05 21:34:42',11,'User aeinstein modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(627,'2015-10-05 19:36:06','USER_NEW_PASSWORD',1,'2015-10-05 21:36:06',11,'Password change for ccommercy','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(628,'2015-10-05 19:36:06','USER_MODIFY',1,'2015-10-05 21:36:06',11,'User ccommercy modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(629,'2015-10-05 19:36:57','USER_NEW_PASSWORD',1,'2015-10-05 21:36:57',11,'Password change for atheceo','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(630,'2015-10-05 19:36:57','USER_MODIFY',1,'2015-10-05 21:36:57',11,'User atheceo modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(631,'2015-10-05 19:37:27','USER_LOGOUT',1,'2015-10-05 21:37:27',11,'(UserLogoff,atheceo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(632,'2015-10-05 19:37:35','USER_LOGIN_FAILED',1,'2015-10-05 21:37:35',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(633,'2015-10-05 19:37:39','USER_LOGIN_FAILED',1,'2015-10-05 21:37:39',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(634,'2015-10-05 19:37:44','USER_LOGIN_FAILED',1,'2015-10-05 21:37:44',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(635,'2015-10-05 19:37:49','USER_LOGIN_FAILED',1,'2015-10-05 21:37:49',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(636,'2015-10-05 19:38:12','USER_LOGIN_FAILED',1,'2015-10-05 21:38:12',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(637,'2015-10-05 19:40:48','USER_LOGIN_FAILED',1,'2015-10-05 21:40:48',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(638,'2015-10-05 19:40:55','USER_LOGIN',1,'2015-10-05 21:40:55',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(639,'2015-10-05 19:43:34','USER_MODIFY',1,'2015-10-05 21:43:34',12,'User aeinstein modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(640,'2015-10-05 19:45:43','USER_CREATE',1,'2015-10-05 21:45:43',12,'User aaa created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(641,'2015-10-05 19:45:43','USER_NEW_PASSWORD',1,'2015-10-05 21:45:43',12,'Password change for aaa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(642,'2015-10-05 19:46:18','USER_DELETE',1,'2015-10-05 21:46:18',12,'User aaa removed','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(643,'2015-10-05 19:47:09','USER_MODIFY',1,'2015-10-05 21:47:09',12,'User demo modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(644,'2015-10-05 19:47:22','USER_MODIFY',1,'2015-10-05 21:47:22',12,'User demo modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(645,'2015-10-05 19:52:05','USER_MODIFY',1,'2015-10-05 21:52:05',12,'User sscientol modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(646,'2015-10-05 19:52:23','USER_MODIFY',1,'2015-10-05 21:52:23',12,'User bbookkeeper modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(647,'2015-10-05 19:54:54','USER_NEW_PASSWORD',1,'2015-10-05 21:54:54',12,'Password change for zzeceo','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(648,'2015-10-05 19:54:54','USER_MODIFY',1,'2015-10-05 21:54:54',12,'User zzeceo modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(649,'2015-10-05 19:57:02','USER_MODIFY',1,'2015-10-05 21:57:02',12,'User zzeceo modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(650,'2015-10-05 19:57:57','USER_NEW_PASSWORD',1,'2015-10-05 21:57:57',12,'Password change for pcurie','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(651,'2015-10-05 19:57:57','USER_MODIFY',1,'2015-10-05 21:57:57',12,'User pcurie modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(652,'2015-10-05 19:59:42','USER_NEW_PASSWORD',1,'2015-10-05 21:59:42',12,'Password change for admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(653,'2015-10-05 19:59:42','USER_MODIFY',1,'2015-10-05 21:59:42',12,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(654,'2015-10-05 20:00:21','USER_MODIFY',1,'2015-10-05 22:00:21',12,'User adminx modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(655,'2015-10-05 20:05:36','USER_MODIFY',1,'2015-10-05 22:05:36',12,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(656,'2015-10-05 20:06:25','USER_MODIFY',1,'2015-10-05 22:06:25',12,'User ccommercy modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(657,'2015-10-05 20:07:18','USER_MODIFY',1,'2015-10-05 22:07:18',12,'User mcurie modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(658,'2015-10-05 20:07:36','USER_MODIFY',1,'2015-10-05 22:07:36',12,'User aeinstein modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(659,'2015-10-05 20:08:34','USER_MODIFY',1,'2015-10-05 22:08:34',12,'User bbookkeeper modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(660,'2015-10-05 20:47:52','USER_CREATE',1,'2015-10-05 22:47:52',12,'User cc1 created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(661,'2015-10-05 20:47:52','USER_NEW_PASSWORD',1,'2015-10-05 22:47:52',12,'Password change for cc1','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(662,'2015-10-05 20:47:55','USER_LOGOUT',1,'2015-10-05 22:47:55',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(663,'2015-10-05 20:48:08','USER_LOGIN',1,'2015-10-05 22:48:08',11,'(UserLogged,zzeceo) - TZ=1;TZString=Europe/Berlin;Screen=1590x434','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(664,'2015-10-05 20:48:39','USER_CREATE',1,'2015-10-05 22:48:39',11,'User cc2 created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(665,'2015-10-05 20:48:39','USER_NEW_PASSWORD',1,'2015-10-05 22:48:39',11,'Password change for cc2','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(666,'2015-10-05 20:48:59','USER_NEW_PASSWORD',1,'2015-10-05 22:48:59',11,'Password change for cc1','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(667,'2015-10-05 20:48:59','USER_MODIFY',1,'2015-10-05 22:48:59',11,'User cc1 modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(668,'2015-10-05 21:06:36','USER_LOGOUT',1,'2015-10-05 23:06:35',11,'(UserLogoff,zzeceo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(669,'2015-10-05 21:06:44','USER_LOGIN_FAILED',1,'2015-10-05 23:06:44',NULL,'Bad value for login or password - login=cc1','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(670,'2015-10-05 21:07:12','USER_LOGIN_FAILED',1,'2015-10-05 23:07:12',NULL,'Bad value for login or password - login=cc1','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(671,'2015-10-05 21:07:19','USER_LOGIN_FAILED',1,'2015-10-05 23:07:19',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(672,'2015-10-05 21:07:27','USER_LOGIN_FAILED',1,'2015-10-05 23:07:27',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(673,'2015-10-05 21:07:32','USER_LOGIN',1,'2015-10-05 23:07:32',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(674,'2015-10-05 21:12:28','USER_NEW_PASSWORD',1,'2015-10-05 23:12:28',12,'Password change for cc1','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(675,'2015-10-05 21:12:28','USER_MODIFY',1,'2015-10-05 23:12:28',12,'User cc1 modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(676,'2015-10-05 21:13:00','USER_CREATE',1,'2015-10-05 23:13:00',12,'User aaa created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(677,'2015-10-05 21:13:00','USER_NEW_PASSWORD',1,'2015-10-05 23:13:00',12,'Password change for aaa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(678,'2015-10-05 21:13:40','USER_DELETE',1,'2015-10-05 23:13:40',12,'User aaa removed','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(679,'2015-10-05 21:14:47','USER_LOGOUT',1,'2015-10-05 23:14:47',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(680,'2015-10-05 21:14:56','USER_LOGIN',1,'2015-10-05 23:14:56',16,'(UserLogged,cc1) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(681,'2015-10-05 21:15:56','USER_LOGOUT',1,'2015-10-05 23:15:56',16,'(UserLogoff,cc1)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(682,'2015-10-05 21:16:06','USER_LOGIN',1,'2015-10-05 23:16:06',17,'(UserLogged,cc2) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(683,'2015-10-05 21:37:25','USER_LOGOUT',1,'2015-10-05 23:37:25',17,'(UserLogoff,cc2)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(684,'2015-10-05 21:37:31','USER_LOGIN',1,'2015-10-05 23:37:31',16,'(UserLogged,cc1) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(685,'2015-10-05 21:43:53','USER_LOGOUT',1,'2015-10-05 23:43:53',16,'(UserLogoff,cc1)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(686,'2015-10-05 21:44:00','USER_LOGIN',1,'2015-10-05 23:44:00',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(687,'2015-10-05 21:46:17','USER_LOGOUT',1,'2015-10-05 23:46:17',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(688,'2015-10-05 21:46:24','USER_LOGIN',1,'2015-10-05 23:46:24',16,'(UserLogged,cc1) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(689,'2015-11-04 15:17:06','USER_LOGIN',1,'2015-11-04 16:17:06',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(690,'2015-11-15 22:04:04','USER_LOGIN',1,'2015-11-15 23:04:04',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(691,'2015-11-15 22:23:45','USER_MODIFY',1,'2015-11-15 23:23:45',12,'User ccommercy modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(692,'2015-11-15 22:24:22','USER_MODIFY',1,'2015-11-15 23:24:22',12,'User cc1 modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(693,'2015-11-15 22:24:53','USER_MODIFY',1,'2015-11-15 23:24:53',12,'User cc2 modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(694,'2015-11-15 22:25:17','USER_MODIFY',1,'2015-11-15 23:25:17',12,'User cc1 modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(695,'2015-11-15 22:45:37','USER_LOGOUT',1,'2015-11-15 23:45:37',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(696,'2015-11-18 13:41:02','USER_LOGIN',1,'2015-11-18 14:41:02',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(697,'2015-11-18 14:23:35','USER_LOGIN',1,'2015-11-18 15:23:35',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(698,'2015-11-18 15:15:46','USER_LOGOUT',1,'2015-11-18 16:15:46',2,'(UserLogoff,demo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(699,'2015-11-18 15:15:51','USER_LOGIN',1,'2015-11-18 16:15:51',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(700,'2015-11-30 17:52:08','USER_LOGIN',1,'2015-11-30 18:52:08',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(701,'2016-01-10 16:45:43','USER_LOGIN',1,'2016-01-10 17:45:43',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(702,'2016-01-10 16:45:52','USER_LOGOUT',1,'2016-01-10 17:45:52',2,'(UserLogoff,demo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(703,'2016-01-10 16:46:06','USER_LOGIN',1,'2016-01-10 17:46:06',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(704,'2016-01-16 14:53:47','USER_LOGIN',1,'2016-01-16 15:53:47',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(705,'2016-01-16 15:04:29','USER_LOGOUT',1,'2016-01-16 16:04:29',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(706,'2016-01-16 15:04:40','USER_LOGIN',1,'2016-01-16 16:04:40',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(707,'2016-01-22 09:33:26','USER_LOGIN',1,'2016-01-22 10:33:26',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(708,'2016-01-22 09:35:19','USER_LOGOUT',1,'2016-01-22 10:35:19',2,'(UserLogoff,demo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(709,'2016-01-22 09:35:29','USER_LOGIN',1,'2016-01-22 10:35:29',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(710,'2016-01-22 10:47:34','USER_CREATE',1,'2016-01-22 11:47:34',12,'User aaa created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(711,'2016-01-22 10:47:34','USER_NEW_PASSWORD',1,'2016-01-22 11:47:34',12,'Password change for aaa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(712,'2016-01-22 12:07:56','USER_LOGIN',1,'2016-01-22 13:07:56',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(713,'2016-01-22 12:36:25','USER_NEW_PASSWORD',1,'2016-01-22 13:36:25',12,'Password change for admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(714,'2016-01-22 12:36:25','USER_MODIFY',1,'2016-01-22 13:36:25',12,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(715,'2016-01-22 12:56:32','USER_MODIFY',1,'2016-01-22 13:56:32',12,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(716,'2016-01-22 12:58:05','USER_MODIFY',1,'2016-01-22 13:58:05',12,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(717,'2016-01-22 13:01:02','USER_MODIFY',1,'2016-01-22 14:01:02',12,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(718,'2016-01-22 13:01:18','USER_MODIFY',1,'2016-01-22 14:01:18',12,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(719,'2016-01-22 13:13:42','USER_MODIFY',1,'2016-01-22 14:13:42',12,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(720,'2016-01-22 13:15:20','USER_DELETE',1,'2016-01-22 14:15:20',12,'User aaa removed','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(721,'2016-01-22 13:19:21','USER_LOGOUT',1,'2016-01-22 14:19:21',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(722,'2016-01-22 13:19:32','USER_LOGIN',1,'2016-01-22 14:19:32',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(723,'2016-01-22 13:19:51','USER_LOGOUT',1,'2016-01-22 14:19:51',2,'(UserLogoff,demo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(724,'2016-01-22 13:20:01','USER_LOGIN',1,'2016-01-22 14:20:01',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(725,'2016-01-22 13:28:22','USER_LOGOUT',1,'2016-01-22 14:28:22',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(726,'2016-01-22 13:28:35','USER_LOGIN',1,'2016-01-22 14:28:35',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(727,'2016-01-22 13:33:54','USER_LOGOUT',1,'2016-01-22 14:33:54',2,'(UserLogoff,demo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(728,'2016-01-22 13:34:05','USER_LOGIN',1,'2016-01-22 14:34:05',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(729,'2016-01-22 13:51:46','USER_MODIFY',1,'2016-01-22 14:51:46',12,'User ccommercy modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(730,'2016-01-22 16:20:12','USER_LOGIN',1,'2016-01-22 17:20:12',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(731,'2016-01-22 16:20:22','USER_LOGOUT',1,'2016-01-22 17:20:22',2,'(UserLogoff,demo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(732,'2016-01-22 16:20:36','USER_LOGIN',1,'2016-01-22 17:20:36',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(733,'2016-01-22 16:27:02','USER_CREATE',1,'2016-01-22 17:27:02',12,'User ldestailleur created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(734,'2016-01-22 16:27:02','USER_NEW_PASSWORD',1,'2016-01-22 17:27:02',12,'Password change for ldestailleur','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(735,'2016-01-22 16:28:34','USER_MODIFY',1,'2016-01-22 17:28:34',12,'User ldestailleur modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(736,'2016-01-22 16:30:01','USER_ENABLEDISABLE',1,'2016-01-22 17:30:01',12,'User cc2 activated','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(737,'2016-01-22 17:11:06','USER_LOGIN',1,'2016-01-22 18:11:06',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(738,'2016-01-22 18:00:02','USER_DELETE',1,'2016-01-22 19:00:02',12,'User zzz removed','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(739,'2016-01-22 18:01:40','USER_DELETE',1,'2016-01-22 19:01:40',12,'User aaab removed','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(740,'2016-01-22 18:01:52','USER_DELETE',1,'2016-01-22 19:01:52',12,'User zzzg removed','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(741,'2016-03-13 10:54:59','USER_LOGIN',1,'2016-03-13 14:54:59',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x971','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36',NULL),(742,'2016-07-30 11:13:10','USER_LOGIN',1,'2016-07-30 15:13:10',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(743,'2016-07-30 12:50:23','USER_CREATE',1,'2016-07-30 16:50:23',12,'User eldy created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(744,'2016-07-30 12:50:23','USER_CREATE',1,'2016-07-30 16:50:23',12,'User eldy created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(745,'2016-07-30 12:50:23','USER_NEW_PASSWORD',1,'2016-07-30 16:50:23',12,'Password change for eldy','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(746,'2016-07-30 12:50:38','USER_MODIFY',1,'2016-07-30 16:50:38',12,'User eldy modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(747,'2016-07-30 12:50:54','USER_DELETE',1,'2016-07-30 16:50:54',12,'User eldy removed','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(748,'2016-07-30 12:51:23','USER_NEW_PASSWORD',1,'2016-07-30 16:51:23',12,'Password change for ldestailleur','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(749,'2016-07-30 12:51:23','USER_MODIFY',1,'2016-07-30 16:51:23',12,'User ldestailleur modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(750,'2016-07-30 18:26:58','USER_LOGIN',1,'2016-07-30 22:26:58',18,'(UserLogged,ldestailleur) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(751,'2016-07-30 18:27:40','USER_LOGOUT',1,'2016-07-30 22:27:40',18,'(UserLogoff,ldestailleur)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(752,'2016-07-30 18:27:47','USER_LOGIN',1,'2016-07-30 22:27:47',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(753,'2016-07-30 19:00:00','USER_LOGOUT',1,'2016-07-30 23:00:00',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(754,'2016-07-30 19:00:04','USER_LOGIN',1,'2016-07-30 23:00:04',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(755,'2016-07-30 19:00:14','USER_LOGOUT',1,'2016-07-30 23:00:14',2,'(UserLogoff,demo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(756,'2016-07-30 19:00:19','USER_LOGIN',1,'2016-07-30 23:00:19',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(757,'2016-07-30 19:00:43','USER_LOGOUT',1,'2016-07-30 23:00:43',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(758,'2016-07-30 19:00:48','USER_LOGIN',1,'2016-07-30 23:00:48',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(759,'2016-07-30 19:03:52','USER_LOGOUT',1,'2016-07-30 23:03:52',2,'(UserLogoff,demo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(760,'2016-07-30 19:03:57','USER_LOGIN_FAILED',1,'2016-07-30 23:03:57',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(761,'2016-07-30 19:03:59','USER_LOGIN',1,'2016-07-30 23:03:59',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(762,'2016-07-30 19:04:13','USER_LOGOUT',1,'2016-07-30 23:04:13',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(763,'2016-07-30 19:04:17','USER_LOGIN',1,'2016-07-30 23:04:17',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(764,'2016-07-30 19:04:26','USER_LOGOUT',1,'2016-07-30 23:04:26',2,'(UserLogoff,demo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(765,'2016-07-30 19:04:31','USER_LOGIN',1,'2016-07-30 23:04:31',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(766,'2016-07-30 19:10:50','USER_LOGOUT',1,'2016-07-30 23:10:50',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(767,'2016-07-30 19:10:54','USER_LOGIN',1,'2016-07-30 23:10:54',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(768,'2016-07-31 10:15:52','USER_LOGIN',1,'2016-07-31 14:15:52',12,'(UserLogged,admin) - TZ=;TZString=;Screen=x','127.0.0.1','Lynx/2.8.8pre.4 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/2.12.23',NULL),(769,'2016-07-31 10:16:27','USER_LOGIN',1,'2016-07-31 14:16:27',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(770,'2016-07-31 10:32:14','USER_LOGIN',1,'2016-07-31 14:32:14',12,'(UserLogged,admin) - TZ=;TZString=;Screen=x','127.0.0.1','Lynx/2.8.8pre.4 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/2.12.23',NULL),(771,'2016-07-31 10:36:28','USER_LOGIN',1,'2016-07-31 14:36:28',12,'(UserLogged,admin) - TZ=;TZString=;Screen=x','127.0.0.1','Links (2.8; Linux 3.19.0-46-generic x86_64; GNU C 4.8.2; text)',NULL),(772,'2016-07-31 10:40:10','USER_LOGIN',1,'2016-07-31 14:40:10',12,'(UserLogged,admin) - TZ=;TZString=;Screen=x','127.0.0.1','Links (2.8; Linux 3.19.0-46-generic x86_64; GNU C 4.8.2; text)',NULL),(773,'2016-07-31 10:54:16','USER_LOGIN',1,'2016-07-31 14:54:16',12,'(UserLogged,admin) - TZ=;TZString=;Screen=x','127.0.0.1','Lynx/2.8.8pre.4 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/2.12.23',NULL),(774,'2016-07-31 12:52:52','USER_LOGIN',1,'2016-07-31 16:52:52',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x592','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(775,'2016-07-31 13:25:33','USER_LOGOUT',1,'2016-07-31 17:25:33',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(776,'2016-07-31 13:26:32','USER_LOGIN',1,'2016-07-31 17:26:32',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1280x751','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(777,'2016-07-31 14:13:57','USER_LOGOUT',1,'2016-07-31 18:13:57',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(778,'2016-07-31 14:14:04','USER_LOGIN',1,'2016-07-31 18:14:04',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(779,'2016-07-31 16:04:35','USER_LOGIN',1,'2016-07-31 20:04:34',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(780,'2016-07-31 21:14:14','USER_LOGIN',1,'2016-08-01 01:14:14',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(781,'2017-01-29 15:14:05','USER_LOGOUT',1,'2017-01-29 19:14:05',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(782,'2017-01-29 15:34:43','USER_LOGIN',1,'2017-01-29 19:34:43',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x571','192.168.0.254','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(783,'2017-01-29 15:35:04','USER_LOGOUT',1,'2017-01-29 19:35:04',12,'(UserLogoff,admin)','192.168.0.254','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(784,'2017-01-29 15:35:12','USER_LOGIN',1,'2017-01-29 19:35:12',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','192.168.0.254','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(785,'2017-01-29 15:36:43','USER_LOGOUT',1,'2017-01-29 19:36:43',12,'(UserLogoff,admin)','192.168.0.254','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(786,'2017-01-29 15:41:21','USER_LOGIN',1,'2017-01-29 19:41:21',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x571','192.168.0.254','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(787,'2017-01-29 15:41:41','USER_LOGOUT',1,'2017-01-29 19:41:41',12,'(UserLogoff,admin)','192.168.0.254','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(788,'2017-01-29 15:42:43','USER_LOGIN',1,'2017-01-29 19:42:43',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x571','192.168.0.254','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(789,'2017-01-29 15:43:18','USER_LOGOUT',1,'2017-01-29 19:43:18',12,'(UserLogoff,admin)','192.168.0.254','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(790,'2017-01-29 15:46:31','USER_LOGIN',1,'2017-01-29 19:46:31',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x571','192.168.0.254','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(791,'2017-01-29 16:18:56','USER_LOGIN',1,'2017-01-29 20:18:56',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=360x526','192.168.0.254','Mozilla/5.0 (Linux; Android 6.0; LG-H818 Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.2883.91 Mobile Safari/537.36 - DoliDroid - Android client pour Dolibarr ERP-CRM',NULL),(792,'2017-01-29 17:20:59','USER_LOGIN',1,'2017-01-29 21:20:59',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(793,'2017-01-30 11:19:40','USER_LOGIN',1,'2017-01-30 15:19:40',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(794,'2017-01-31 16:49:39','USER_LOGIN',1,'2017-01-31 20:49:39',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x520','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(795,'2017-02-01 10:55:23','USER_LOGIN',1,'2017-02-01 14:55:23',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(796,'2017-02-01 13:34:31','USER_LOGIN',1,'2017-02-01 17:34:31',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(797,'2017-02-01 14:41:26','USER_LOGIN',1,'2017-02-01 18:41:26',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(798,'2017-02-01 23:51:48','USER_LOGIN_FAILED',1,'2017-02-02 03:51:48',NULL,'Bad value for login or password - login=autologin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(799,'2017-02-01 23:52:55','USER_LOGIN',1,'2017-02-02 03:52:55',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(800,'2017-02-01 23:55:45','USER_CREATE',1,'2017-02-02 03:55:45',12,'User aboston created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(801,'2017-02-01 23:55:45','USER_NEW_PASSWORD',1,'2017-02-02 03:55:45',12,'Password change for aboston','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(802,'2017-02-01 23:56:38','USER_MODIFY',1,'2017-02-02 03:56:38',12,'User aboston modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(803,'2017-02-01 23:56:50','USER_MODIFY',1,'2017-02-02 03:56:50',12,'User aboston modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(804,'2017-02-02 01:14:44','USER_LOGIN',1,'2017-02-02 05:14:44',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(805,'2017-02-03 10:27:18','USER_LOGIN',1,'2017-02-03 14:27:18',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(806,'2017-02-04 10:22:34','USER_LOGIN',1,'2017-02-04 14:22:34',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x489','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(807,'2017-02-06 04:01:31','USER_LOGIN',1,'2017-02-06 08:01:31',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(808,'2017-02-06 10:21:32','USER_LOGIN',1,'2017-02-06 14:21:32',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(809,'2017-02-06 19:09:27','USER_LOGIN',1,'2017-02-06 23:09:27',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(810,'2017-02-06 23:39:17','USER_LOGIN',1,'2017-02-07 03:39:17',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(811,'2017-02-07 11:36:34','USER_LOGIN',1,'2017-02-07 15:36:34',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x676','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(812,'2017-02-07 18:51:53','USER_LOGIN',1,'2017-02-07 22:51:53',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(813,'2017-02-07 23:13:40','USER_LOGIN',1,'2017-02-08 03:13:40',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(814,'2017-02-08 09:29:12','USER_LOGIN',1,'2017-02-08 13:29:12',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(815,'2017-02-08 17:33:12','USER_LOGIN',1,'2017-02-08 21:33:12',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(816,'2017-02-09 17:30:34','USER_LOGIN',1,'2017-02-09 21:30:34',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(817,'2017-02-10 09:30:02','USER_LOGIN',1,'2017-02-10 13:30:02',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(818,'2017-02-10 16:16:14','USER_LOGIN',1,'2017-02-10 20:16:14',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(819,'2017-02-10 17:28:15','USER_LOGIN',1,'2017-02-10 21:28:15',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(820,'2017-02-11 12:54:03','USER_LOGIN',1,'2017-02-11 16:54:03',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(821,'2017-02-11 17:23:52','USER_LOGIN',1,'2017-02-11 21:23:52',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(822,'2017-02-12 12:44:03','USER_LOGIN',1,'2017-02-12 16:44:03',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(823,'2017-02-12 16:42:13','USER_LOGIN',1,'2017-02-12 20:42:13',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(824,'2017-02-12 19:14:18','USER_LOGIN',1,'2017-02-12 23:14:18',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(825,'2017-02-15 17:17:00','USER_LOGIN',1,'2017-02-15 21:17:00',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(826,'2017-02-15 22:02:40','USER_LOGIN',1,'2017-02-16 02:02:40',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(827,'2017-02-16 22:13:27','USER_LOGIN',1,'2017-02-17 02:13:27',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x619','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(828,'2017-02-16 23:54:04','USER_LOGIN',1,'2017-02-17 03:54:04',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(829,'2017-02-17 09:14:27','USER_LOGIN',1,'2017-02-17 13:14:27',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(830,'2017-02-17 12:07:05','USER_LOGIN',1,'2017-02-17 16:07:05',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(831,'2017-02-19 21:22:20','USER_LOGIN',1,'2017-02-20 01:22:20',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(832,'2017-02-20 09:26:47','USER_LOGIN',1,'2017-02-20 13:26:47',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(833,'2017-02-20 16:39:55','USER_LOGIN',1,'2017-02-20 20:39:55',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(834,'2017-02-20 16:49:00','USER_MODIFY',1,'2017-02-20 20:49:00',12,'Modification utilisateur ccommerson','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(835,'2017-02-20 17:57:15','USER_LOGIN',1,'2017-02-20 21:57:14',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(836,'2017-02-20 19:43:48','USER_LOGIN',1,'2017-02-20 23:43:48',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(837,'2017-02-21 00:04:05','USER_LOGIN',1,'2017-02-21 04:04:05',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(838,'2017-02-21 10:23:13','USER_LOGIN',1,'2017-02-21 14:23:13',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(839,'2017-02-21 10:30:17','USER_LOGOUT',1,'2017-02-21 14:30:17',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(840,'2017-02-21 10:30:22','USER_LOGIN',1,'2017-02-21 14:30:22',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(841,'2017-02-21 11:44:05','USER_LOGIN',1,'2017-02-21 15:44:05',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL); +INSERT INTO `llx_events` VALUES (30,'2011-07-18 18:23:06','USER_LOGOUT',1,'2011-07-18 20:23:06',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(31,'2011-07-18 18:23:12','USER_LOGIN_FAILED',1,'2011-07-18 20:23:12',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(32,'2011-07-18 18:23:17','USER_LOGIN',1,'2011-07-18 20:23:17',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(33,'2011-07-18 20:10:51','USER_LOGIN_FAILED',1,'2011-07-18 22:10:51',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(34,'2011-07-18 20:10:55','USER_LOGIN',1,'2011-07-18 22:10:55',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(35,'2011-07-18 21:18:57','USER_LOGIN',1,'2011-07-18 23:18:57',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(36,'2011-07-20 10:34:10','USER_LOGIN',1,'2011-07-20 12:34:10',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(37,'2011-07-20 12:36:44','USER_LOGIN',1,'2011-07-20 14:36:44',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(38,'2011-07-20 13:20:51','USER_LOGIN_FAILED',1,'2011-07-20 15:20:51',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(39,'2011-07-20 13:20:54','USER_LOGIN',1,'2011-07-20 15:20:54',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(40,'2011-07-20 15:03:46','USER_LOGIN_FAILED',1,'2011-07-20 17:03:46',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(41,'2011-07-20 15:03:55','USER_LOGIN',1,'2011-07-20 17:03:55',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(42,'2011-07-20 18:05:05','USER_LOGIN_FAILED',1,'2011-07-20 20:05:05',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(43,'2011-07-20 18:05:08','USER_LOGIN',1,'2011-07-20 20:05:08',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(44,'2011-07-20 21:08:53','USER_LOGIN_FAILED',1,'2011-07-20 23:08:53',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(45,'2011-07-20 21:08:56','USER_LOGIN',1,'2011-07-20 23:08:56',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(46,'2011-07-21 01:26:12','USER_LOGIN',1,'2011-07-21 03:26:12',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(47,'2011-07-21 22:35:45','USER_LOGIN_FAILED',1,'2011-07-22 00:35:45',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(48,'2011-07-21 22:35:49','USER_LOGIN',1,'2011-07-22 00:35:49',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(49,'2011-07-26 23:09:47','USER_LOGIN_FAILED',1,'2011-07-27 01:09:47',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(50,'2011-07-26 23:09:50','USER_LOGIN',1,'2011-07-27 01:09:50',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(51,'2011-07-27 17:02:27','USER_LOGIN_FAILED',1,'2011-07-27 19:02:27',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(52,'2011-07-27 17:02:32','USER_LOGIN',1,'2011-07-27 19:02:32',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(53,'2011-07-27 23:33:37','USER_LOGIN_FAILED',1,'2011-07-28 01:33:37',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(54,'2011-07-27 23:33:41','USER_LOGIN',1,'2011-07-28 01:33:41',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(55,'2011-07-28 18:20:36','USER_LOGIN_FAILED',1,'2011-07-28 20:20:36',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(56,'2011-07-28 18:20:38','USER_LOGIN',1,'2011-07-28 20:20:38',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(57,'2011-07-28 20:13:30','USER_LOGIN_FAILED',1,'2011-07-28 22:13:30',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(58,'2011-07-28 20:13:34','USER_LOGIN',1,'2011-07-28 22:13:34',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(59,'2011-07-28 20:22:51','USER_LOGIN',1,'2011-07-28 22:22:51',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(60,'2011-07-28 23:05:06','USER_LOGIN',1,'2011-07-29 01:05:06',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(61,'2011-07-29 20:15:50','USER_LOGIN_FAILED',1,'2011-07-29 22:15:50',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(62,'2011-07-29 20:15:53','USER_LOGIN',1,'2011-07-29 22:15:53',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(68,'2011-07-29 20:51:01','USER_LOGOUT',1,'2011-07-29 22:51:01',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(69,'2011-07-29 20:51:05','USER_LOGIN',1,'2011-07-29 22:51:05',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(70,'2011-07-30 08:46:20','USER_LOGIN_FAILED',1,'2011-07-30 10:46:20',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(71,'2011-07-30 08:46:38','USER_LOGIN_FAILED',1,'2011-07-30 10:46:38',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(72,'2011-07-30 08:46:42','USER_LOGIN',1,'2011-07-30 10:46:42',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(73,'2011-07-30 10:05:12','USER_LOGIN_FAILED',1,'2011-07-30 12:05:12',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(74,'2011-07-30 10:05:15','USER_LOGIN',1,'2011-07-30 12:05:15',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(75,'2011-07-30 12:15:46','USER_LOGIN',1,'2011-07-30 14:15:46',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(76,'2011-07-31 22:19:30','USER_LOGIN',1,'2011-08-01 00:19:30',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(77,'2011-07-31 23:32:52','USER_LOGIN',1,'2011-08-01 01:32:52',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(78,'2011-08-01 01:24:50','USER_LOGIN_FAILED',1,'2011-08-01 03:24:50',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(79,'2011-08-01 01:24:54','USER_LOGIN',1,'2011-08-01 03:24:54',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(80,'2011-08-01 19:31:36','USER_LOGIN_FAILED',1,'2011-08-01 21:31:35',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(81,'2011-08-01 19:31:39','USER_LOGIN',1,'2011-08-01 21:31:39',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(82,'2011-08-01 20:01:36','USER_LOGIN',1,'2011-08-01 22:01:36',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(83,'2011-08-01 20:52:54','USER_LOGIN_FAILED',1,'2011-08-01 22:52:54',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(84,'2011-08-01 20:52:58','USER_LOGIN',1,'2011-08-01 22:52:58',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(85,'2011-08-01 21:17:28','USER_LOGIN_FAILED',1,'2011-08-01 23:17:28',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(86,'2011-08-01 21:17:31','USER_LOGIN',1,'2011-08-01 23:17:31',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(87,'2011-08-04 11:55:17','USER_LOGIN',1,'2011-08-04 13:55:17',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(88,'2011-08-04 20:19:03','USER_LOGIN_FAILED',1,'2011-08-04 22:19:03',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(89,'2011-08-04 20:19:07','USER_LOGIN',1,'2011-08-04 22:19:07',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(90,'2011-08-05 17:51:42','USER_LOGIN_FAILED',1,'2011-08-05 19:51:42',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(91,'2011-08-05 17:51:47','USER_LOGIN',1,'2011-08-05 19:51:47',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(92,'2011-08-05 17:56:03','USER_LOGIN',1,'2011-08-05 19:56:03',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(93,'2011-08-05 17:59:10','USER_LOGIN',1,'2011-08-05 19:59:10',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30',NULL),(94,'2011-08-05 18:01:58','USER_LOGIN',1,'2011-08-05 20:01:58',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.100 Safari/534.30',NULL),(95,'2011-08-05 19:59:56','USER_LOGIN',1,'2011-08-05 21:59:56',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(96,'2011-08-06 18:33:22','USER_LOGIN',1,'2011-08-06 20:33:22',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(97,'2011-08-07 00:56:59','USER_LOGIN',1,'2011-08-07 02:56:59',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(98,'2011-08-07 22:49:14','USER_LOGIN',1,'2011-08-08 00:49:14',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(99,'2011-08-07 23:05:18','USER_LOGOUT',1,'2011-08-08 01:05:18',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(105,'2011-08-08 00:41:09','USER_LOGIN',1,'2011-08-08 02:41:09',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(106,'2011-08-08 11:58:55','USER_LOGIN',1,'2011-08-08 13:58:55',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(107,'2011-08-08 14:35:48','USER_LOGIN',1,'2011-08-08 16:35:48',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(108,'2011-08-08 14:36:31','USER_LOGOUT',1,'2011-08-08 16:36:31',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(109,'2011-08-08 14:38:28','USER_LOGIN',1,'2011-08-08 16:38:28',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(110,'2011-08-08 14:39:02','USER_LOGOUT',1,'2011-08-08 16:39:02',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(111,'2011-08-08 14:39:10','USER_LOGIN',1,'2011-08-08 16:39:10',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(112,'2011-08-08 14:39:28','USER_LOGOUT',1,'2011-08-08 16:39:28',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(113,'2011-08-08 14:39:37','USER_LOGIN',1,'2011-08-08 16:39:37',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(114,'2011-08-08 14:50:02','USER_LOGOUT',1,'2011-08-08 16:50:02',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(115,'2011-08-08 14:51:45','USER_LOGIN_FAILED',1,'2011-08-08 16:51:45',NULL,'Identifiants login ou mot de passe incorrects - login=','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(116,'2011-08-08 14:51:52','USER_LOGIN',1,'2011-08-08 16:51:52',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(117,'2011-08-08 15:09:54','USER_LOGOUT',1,'2011-08-08 17:09:54',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(118,'2011-08-08 15:10:19','USER_LOGIN_FAILED',1,'2011-08-08 17:10:19',NULL,'Identifiants login ou mot de passe incorrects - login=','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(119,'2011-08-08 15:10:28','USER_LOGIN',1,'2011-08-08 17:10:28',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(121,'2011-08-08 15:14:58','USER_LOGOUT',1,'2011-08-08 17:14:58',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(122,'2011-08-08 15:15:00','USER_LOGIN_FAILED',1,'2011-08-08 17:15:00',NULL,'Identifiants login ou mot de passe incorrects - login=','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(123,'2011-08-08 15:17:57','USER_LOGIN',1,'2011-08-08 17:17:57',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(124,'2011-08-08 15:35:56','USER_LOGOUT',1,'2011-08-08 17:35:56',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(125,'2011-08-08 15:36:05','USER_LOGIN',1,'2011-08-08 17:36:05',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(126,'2011-08-08 17:32:42','USER_LOGIN',1,'2011-08-08 19:32:42',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0',NULL),(127,'2012-12-08 13:49:37','USER_LOGOUT',1,'2012-12-08 14:49:37',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(128,'2012-12-08 13:49:42','USER_LOGIN',1,'2012-12-08 14:49:42',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(129,'2012-12-08 13:50:12','USER_LOGOUT',1,'2012-12-08 14:50:12',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(130,'2012-12-08 13:50:14','USER_LOGIN',1,'2012-12-08 14:50:14',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(131,'2012-12-08 13:50:17','USER_LOGOUT',1,'2012-12-08 14:50:17',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(132,'2012-12-08 13:52:47','USER_LOGIN',1,'2012-12-08 14:52:47',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(133,'2012-12-08 13:53:08','USER_MODIFY',1,'2012-12-08 14:53:08',1,'User admin modified','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(134,'2012-12-08 14:08:45','USER_LOGOUT',1,'2012-12-08 15:08:45',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(135,'2012-12-08 14:09:09','USER_LOGIN',1,'2012-12-08 15:09:09',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(136,'2012-12-08 14:11:43','USER_LOGOUT',1,'2012-12-08 15:11:43',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(137,'2012-12-08 14:11:45','USER_LOGIN',1,'2012-12-08 15:11:45',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(138,'2012-12-08 14:22:53','USER_LOGOUT',1,'2012-12-08 15:22:53',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(139,'2012-12-08 14:22:54','USER_LOGIN',1,'2012-12-08 15:22:54',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(140,'2012-12-08 14:23:10','USER_LOGOUT',1,'2012-12-08 15:23:10',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(141,'2012-12-08 14:23:11','USER_LOGIN',1,'2012-12-08 15:23:11',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(142,'2012-12-08 14:23:49','USER_LOGOUT',1,'2012-12-08 15:23:49',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(143,'2012-12-08 14:23:50','USER_LOGIN',1,'2012-12-08 15:23:50',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(144,'2012-12-08 14:28:08','USER_LOGOUT',1,'2012-12-08 15:28:08',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(145,'2012-12-08 14:35:15','USER_LOGIN',1,'2012-12-08 15:35:15',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(146,'2012-12-08 14:35:18','USER_LOGOUT',1,'2012-12-08 15:35:18',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(147,'2012-12-08 14:36:07','USER_LOGIN',1,'2012-12-08 15:36:07',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(148,'2012-12-08 14:36:09','USER_LOGOUT',1,'2012-12-08 15:36:09',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(149,'2012-12-08 14:36:41','USER_LOGIN',1,'2012-12-08 15:36:41',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(150,'2012-12-08 15:59:13','USER_LOGIN',1,'2012-12-08 16:59:13',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(151,'2012-12-09 11:49:52','USER_LOGIN',1,'2012-12-09 12:49:52',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(152,'2012-12-09 13:46:31','USER_LOGIN',1,'2012-12-09 14:46:31',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(153,'2012-12-09 19:03:14','USER_LOGIN',1,'2012-12-09 20:03:14',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(154,'2012-12-10 00:16:31','USER_LOGIN',1,'2012-12-10 01:16:31',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(170,'2012-12-11 22:03:31','USER_LOGIN',1,'2012-12-11 23:03:31',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(171,'2012-12-12 00:32:39','USER_LOGIN',1,'2012-12-12 01:32:39',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(172,'2012-12-12 10:49:59','USER_LOGIN',1,'2012-12-12 11:49:59',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(175,'2012-12-12 10:57:40','USER_MODIFY',1,'2012-12-12 11:57:40',1,'Modification utilisateur admin','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(176,'2012-12-12 13:29:15','USER_LOGIN',1,'2012-12-12 14:29:15',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(177,'2012-12-12 13:30:15','USER_LOGIN',1,'2012-12-12 14:30:15',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(178,'2012-12-12 13:40:08','USER_LOGOUT',1,'2012-12-12 14:40:08',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(179,'2012-12-12 13:40:10','USER_LOGIN',1,'2012-12-12 14:40:10',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(180,'2012-12-12 13:40:26','USER_MODIFY',1,'2012-12-12 14:40:26',1,'Modification utilisateur admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(181,'2012-12-12 13:40:34','USER_LOGOUT',1,'2012-12-12 14:40:34',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(182,'2012-12-12 13:42:23','USER_LOGIN',1,'2012-12-12 14:42:23',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(183,'2012-12-12 13:43:02','USER_NEW_PASSWORD',1,'2012-12-12 14:43:02',NULL,'Changement mot de passe de admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(184,'2012-12-12 13:43:25','USER_LOGOUT',1,'2012-12-12 14:43:25',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(185,'2012-12-12 13:43:27','USER_LOGIN_FAILED',1,'2012-12-12 14:43:27',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(186,'2012-12-12 13:43:30','USER_LOGIN',1,'2012-12-12 14:43:30',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(187,'2012-12-12 14:52:11','USER_LOGIN',1,'2012-12-12 15:52:11',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.95 Safari/537.11',NULL),(188,'2012-12-12 17:53:00','USER_LOGIN_FAILED',1,'2012-12-12 18:53:00',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(189,'2012-12-12 17:53:07','USER_LOGIN_FAILED',1,'2012-12-12 18:53:07',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(190,'2012-12-12 17:53:51','USER_NEW_PASSWORD',1,'2012-12-12 18:53:51',NULL,'Changement mot de passe de admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(191,'2012-12-12 17:54:00','USER_LOGIN',1,'2012-12-12 18:54:00',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(192,'2012-12-12 17:54:10','USER_NEW_PASSWORD',1,'2012-12-12 18:54:10',1,'Changement mot de passe de admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(193,'2012-12-12 17:54:10','USER_MODIFY',1,'2012-12-12 18:54:10',1,'Modification utilisateur admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(194,'2012-12-12 18:57:09','USER_LOGIN',1,'2012-12-12 19:57:09',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(195,'2012-12-12 23:04:08','USER_LOGIN',1,'2012-12-13 00:04:08',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(196,'2012-12-17 20:03:14','USER_LOGIN',1,'2012-12-17 21:03:14',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(197,'2012-12-17 21:18:45','USER_LOGIN',1,'2012-12-17 22:18:45',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(198,'2012-12-17 22:30:08','USER_LOGIN',1,'2012-12-17 23:30:08',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(199,'2012-12-18 23:32:03','USER_LOGIN',1,'2012-12-19 00:32:03',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(200,'2012-12-19 09:38:03','USER_LOGIN',1,'2012-12-19 10:38:03',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(201,'2012-12-19 11:23:35','USER_LOGIN',1,'2012-12-19 12:23:35',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(202,'2012-12-19 12:46:22','USER_LOGIN',1,'2012-12-19 13:46:22',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(214,'2012-12-19 19:11:31','USER_LOGIN',1,'2012-12-19 20:11:31',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(215,'2012-12-21 16:36:57','USER_LOGIN',1,'2012-12-21 17:36:57',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(216,'2012-12-21 16:38:43','USER_NEW_PASSWORD',1,'2012-12-21 17:38:43',1,'Changement mot de passe de adupont','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(217,'2012-12-21 16:38:43','USER_MODIFY',1,'2012-12-21 17:38:43',1,'Modification utilisateur adupont','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(218,'2012-12-21 16:38:51','USER_LOGOUT',1,'2012-12-21 17:38:51',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(219,'2012-12-21 16:38:55','USER_LOGIN',1,'2012-12-21 17:38:55',3,'(UserLogged,adupont)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(220,'2012-12-21 16:48:18','USER_LOGOUT',1,'2012-12-21 17:48:18',3,'(UserLogoff,adupont)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(221,'2012-12-21 16:48:20','USER_LOGIN',1,'2012-12-21 17:48:20',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(222,'2012-12-26 18:28:18','USER_LOGIN',1,'2012-12-26 19:28:18',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(223,'2012-12-26 20:00:24','USER_LOGIN',1,'2012-12-26 21:00:24',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(224,'2012-12-27 01:10:27','USER_LOGIN',1,'2012-12-27 02:10:27',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(225,'2012-12-28 19:12:08','USER_LOGIN',1,'2012-12-28 20:12:08',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(226,'2012-12-28 20:16:58','USER_LOGIN',1,'2012-12-28 21:16:58',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(227,'2012-12-29 14:35:46','USER_LOGIN',1,'2012-12-29 15:35:46',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(228,'2012-12-29 14:37:59','USER_LOGOUT',1,'2012-12-29 15:37:59',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(229,'2012-12-29 14:38:00','USER_LOGIN',1,'2012-12-29 15:38:00',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(230,'2012-12-29 17:16:48','USER_LOGIN',1,'2012-12-29 18:16:48',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(231,'2012-12-31 12:02:59','USER_LOGIN',1,'2012-12-31 13:02:59',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(232,'2013-01-02 20:32:51','USER_LOGIN',1,'2013-01-02 21:32:51',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:17.0) Gecko/20100101 Firefox/17.0',NULL),(233,'2013-01-02 20:58:59','USER_LOGIN',1,'2013-01-02 21:58:59',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(234,'2013-01-03 09:25:07','USER_LOGIN',1,'2013-01-03 10:25:07',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(235,'2013-01-03 19:39:31','USER_LOGIN',1,'2013-01-03 20:39:31',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(236,'2013-01-04 22:40:19','USER_LOGIN',1,'2013-01-04 23:40:19',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(237,'2013-01-05 12:59:59','USER_LOGIN',1,'2013-01-05 13:59:59',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(238,'2013-01-05 15:28:52','USER_LOGIN',1,'2013-01-05 16:28:52',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(239,'2013-01-05 17:02:08','USER_LOGIN',1,'2013-01-05 18:02:08',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(240,'2013-01-06 12:13:33','USER_LOGIN',1,'2013-01-06 13:13:33',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(241,'2013-01-07 01:21:15','USER_LOGIN',1,'2013-01-07 02:21:15',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(242,'2013-01-07 01:46:31','USER_LOGOUT',1,'2013-01-07 02:46:31',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(243,'2013-01-07 19:54:50','USER_LOGIN',1,'2013-01-07 20:54:50',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(244,'2013-01-08 21:55:01','USER_LOGIN',1,'2013-01-08 22:55:01',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(245,'2013-01-09 11:13:28','USER_LOGIN',1,'2013-01-09 12:13:28',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(246,'2013-01-10 18:30:46','USER_LOGIN',1,'2013-01-10 19:30:46',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(247,'2013-01-11 18:03:26','USER_LOGIN',1,'2013-01-11 19:03:26',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(248,'2013-01-12 11:15:04','USER_LOGIN',1,'2013-01-12 12:15:04',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(249,'2013-01-12 14:42:44','USER_LOGIN',1,'2013-01-12 15:42:44',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(250,'2013-01-13 12:07:17','USER_LOGIN',1,'2013-01-13 13:07:17',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(251,'2013-01-13 17:37:58','USER_LOGIN',1,'2013-01-13 18:37:58',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(252,'2013-01-13 19:24:21','USER_LOGIN',1,'2013-01-13 20:24:21',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(253,'2013-01-13 19:29:19','USER_LOGOUT',1,'2013-01-13 20:29:19',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(254,'2013-01-13 21:39:39','USER_LOGIN',1,'2013-01-13 22:39:39',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(255,'2013-01-14 00:52:21','USER_LOGIN',1,'2013-01-14 01:52:21',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97 Safari/537.11',NULL),(256,'2013-01-16 11:34:31','USER_LOGIN',1,'2013-01-16 12:34:31',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(257,'2013-01-16 15:36:21','USER_LOGIN',1,'2013-01-16 16:36:21',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(258,'2013-01-16 19:17:36','USER_LOGIN',1,'2013-01-16 20:17:36',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(259,'2013-01-16 19:48:08','GROUP_CREATE',1,'2013-01-16 20:48:08',1,'Création groupe ggg','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(260,'2013-01-16 21:48:53','USER_LOGIN',1,'2013-01-16 22:48:53',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(261,'2013-01-17 19:55:53','USER_LOGIN',1,'2013-01-17 20:55:53',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(262,'2013-01-18 09:48:01','USER_LOGIN',1,'2013-01-18 10:48:01',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(263,'2013-01-18 13:22:36','USER_LOGIN',1,'2013-01-18 14:22:36',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(264,'2013-01-18 16:10:23','USER_LOGIN',1,'2013-01-18 17:10:22',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(265,'2013-01-18 17:41:40','USER_LOGIN',1,'2013-01-18 18:41:40',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(266,'2013-01-19 14:33:48','USER_LOGIN',1,'2013-01-19 15:33:48',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(267,'2013-01-19 16:47:43','USER_LOGIN',1,'2013-01-19 17:47:43',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(268,'2013-01-19 16:59:43','USER_LOGIN',1,'2013-01-19 17:59:43',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(269,'2013-01-19 17:00:22','USER_LOGIN',1,'2013-01-19 18:00:22',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(270,'2013-01-19 17:04:16','USER_LOGOUT',1,'2013-01-19 18:04:16',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(271,'2013-01-19 17:04:18','USER_LOGIN',1,'2013-01-19 18:04:18',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(272,'2013-01-20 00:34:19','USER_LOGIN',1,'2013-01-20 01:34:19',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(273,'2013-01-21 11:54:17','USER_LOGIN',1,'2013-01-21 12:54:17',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(274,'2013-01-21 13:48:15','USER_LOGIN',1,'2013-01-21 14:48:15',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(275,'2013-01-21 14:30:22','USER_LOGIN',1,'2013-01-21 15:30:22',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(276,'2013-01-21 15:10:46','USER_LOGIN',1,'2013-01-21 16:10:46',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(277,'2013-01-21 17:27:43','USER_LOGIN',1,'2013-01-21 18:27:43',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(278,'2013-01-21 21:48:15','USER_LOGIN',1,'2013-01-21 22:48:15',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(279,'2013-01-21 21:50:42','USER_LOGIN',1,'2013-01-21 22:50:42',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.52 Safari/537.17',NULL),(280,'2013-01-23 09:28:26','USER_LOGIN',1,'2013-01-23 10:28:26',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(281,'2013-01-23 13:21:57','USER_LOGIN',1,'2013-01-23 14:21:57',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(282,'2013-01-23 16:52:00','USER_LOGOUT',1,'2013-01-23 17:52:00',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(283,'2013-01-23 16:52:05','USER_LOGIN_FAILED',1,'2013-01-23 17:52:05',NULL,'Bad value for login or password - login=bbb','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(284,'2013-01-23 16:52:09','USER_LOGIN',1,'2013-01-23 17:52:09',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(285,'2013-01-23 16:52:27','USER_CREATE',1,'2013-01-23 17:52:27',1,'Création utilisateur aaa','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(286,'2013-01-23 16:52:27','USER_NEW_PASSWORD',1,'2013-01-23 17:52:27',1,'Changement mot de passe de aaa','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(287,'2013-01-23 16:52:37','USER_CREATE',1,'2013-01-23 17:52:37',1,'Création utilisateur bbb','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(288,'2013-01-23 16:52:37','USER_NEW_PASSWORD',1,'2013-01-23 17:52:37',1,'Changement mot de passe de bbb','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(289,'2013-01-23 16:53:15','USER_LOGOUT',1,'2013-01-23 17:53:15',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(290,'2013-01-23 16:53:20','USER_LOGIN',1,'2013-01-23 17:53:20',4,'(UserLogged,aaa)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(291,'2013-01-23 19:16:58','USER_LOGIN',1,'2013-01-23 20:16:58',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(292,'2013-01-26 10:54:07','USER_LOGIN',1,'2013-01-26 11:54:07',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(293,'2013-01-29 10:15:36','USER_LOGIN',1,'2013-01-29 11:15:36',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(294,'2013-01-30 17:42:50','USER_LOGIN',1,'2013-01-30 18:42:50',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.56 Safari/537.17',NULL),(295,'2013-02-01 08:49:55','USER_LOGIN',1,'2013-02-01 09:49:55',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(296,'2013-02-01 08:51:57','USER_LOGOUT',1,'2013-02-01 09:51:57',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(297,'2013-02-01 08:52:39','USER_LOGIN',1,'2013-02-01 09:52:39',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(298,'2013-02-01 21:03:01','USER_LOGIN',1,'2013-02-01 22:03:01',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(299,'2013-02-10 19:48:39','USER_LOGIN',1,'2013-02-10 20:48:39',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(300,'2013-02-10 20:46:48','USER_LOGIN',1,'2013-02-10 21:46:48',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(301,'2013-02-10 21:39:23','USER_LOGIN',1,'2013-02-10 22:39:23',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(302,'2013-02-11 19:00:13','USER_LOGIN',1,'2013-02-11 20:00:13',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(303,'2013-02-11 19:43:44','USER_LOGIN_FAILED',1,'2013-02-11 20:43:44',NULL,'Unknown column \'u.fk_user\' in \'field list\'','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(304,'2013-02-11 19:44:01','USER_LOGIN',1,'2013-02-11 20:44:01',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(305,'2013-02-12 00:27:35','USER_LOGIN',1,'2013-02-12 01:27:35',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(306,'2013-02-12 00:27:38','USER_LOGOUT',1,'2013-02-12 01:27:38',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(307,'2013-02-12 00:28:07','USER_LOGIN',1,'2013-02-12 01:28:07',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(308,'2013-02-12 00:28:09','USER_LOGOUT',1,'2013-02-12 01:28:09',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(309,'2013-02-12 00:28:26','USER_LOGIN',1,'2013-02-12 01:28:26',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(310,'2013-02-12 00:28:30','USER_LOGOUT',1,'2013-02-12 01:28:30',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(311,'2013-02-12 12:42:15','USER_LOGIN',1,'2013-02-12 13:42:15',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17',NULL),(312,'2013-02-12 13:46:16','USER_LOGIN',1,'2013-02-12 14:46:16',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(313,'2013-02-12 14:54:28','USER_LOGIN',1,'2013-02-12 15:54:28',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(314,'2013-02-12 16:04:46','USER_LOGIN',1,'2013-02-12 17:04:46',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(315,'2013-02-13 14:02:43','USER_LOGIN',1,'2013-02-13 15:02:43',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(316,'2013-02-13 14:48:30','USER_LOGIN',1,'2013-02-13 15:48:30',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(317,'2013-02-13 17:44:53','USER_LOGIN',1,'2013-02-13 18:44:53',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(318,'2013-02-15 08:44:36','USER_LOGIN',1,'2013-02-15 09:44:36',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(319,'2013-02-15 08:53:20','USER_LOGIN',1,'2013-02-15 09:53:20',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(320,'2013-02-16 19:10:28','USER_LOGIN',1,'2013-02-16 20:10:28',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(321,'2013-02-16 19:22:40','USER_CREATE',1,'2013-02-16 20:22:40',1,'Création utilisateur aaab','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(322,'2013-02-16 19:22:40','USER_NEW_PASSWORD',1,'2013-02-16 20:22:40',1,'Changement mot de passe de aaab','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(323,'2013-02-16 19:48:15','USER_CREATE',1,'2013-02-16 20:48:15',1,'Création utilisateur zzz','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(324,'2013-02-16 19:48:15','USER_NEW_PASSWORD',1,'2013-02-16 20:48:15',1,'Changement mot de passe de zzz','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(325,'2013-02-16 19:50:08','USER_CREATE',1,'2013-02-16 20:50:08',1,'Création utilisateur zzzg','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(326,'2013-02-16 19:50:08','USER_NEW_PASSWORD',1,'2013-02-16 20:50:08',1,'Changement mot de passe de zzzg','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(327,'2013-02-16 21:20:03','USER_LOGIN',1,'2013-02-16 22:20:03',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(328,'2013-02-17 14:30:51','USER_LOGIN',1,'2013-02-17 15:30:51',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(329,'2013-02-17 17:21:22','USER_LOGIN',1,'2013-02-17 18:21:22',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(330,'2013-02-17 17:48:43','USER_MODIFY',1,'2013-02-17 18:48:43',1,'Modification utilisateur aaa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(331,'2013-02-17 17:48:47','USER_MODIFY',1,'2013-02-17 18:48:47',1,'Modification utilisateur aaa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(332,'2013-02-17 17:48:51','USER_MODIFY',1,'2013-02-17 18:48:51',1,'Modification utilisateur aaa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(333,'2013-02-17 17:48:56','USER_MODIFY',1,'2013-02-17 18:48:56',1,'Modification utilisateur aaa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(334,'2013-02-18 22:00:01','USER_LOGIN',1,'2013-02-18 23:00:01',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(335,'2013-02-19 08:19:52','USER_LOGIN',1,'2013-02-19 09:19:52',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(336,'2013-02-19 22:00:52','USER_LOGIN',1,'2013-02-19 23:00:52',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(337,'2013-02-20 09:34:52','USER_LOGIN',1,'2013-02-20 10:34:52',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(338,'2013-02-20 13:12:28','USER_LOGIN',1,'2013-02-20 14:12:28',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(339,'2013-02-20 17:19:44','USER_LOGIN',1,'2013-02-20 18:19:44',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(340,'2013-02-20 19:07:21','USER_MODIFY',1,'2013-02-20 20:07:21',1,'Modification utilisateur adupont','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(341,'2013-02-20 19:47:17','USER_LOGIN',1,'2013-02-20 20:47:17',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(342,'2013-02-20 19:48:01','USER_MODIFY',1,'2013-02-20 20:48:01',1,'Modification utilisateur aaa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(343,'2013-02-21 08:27:07','USER_LOGIN',1,'2013-02-21 09:27:07',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(344,'2013-02-23 13:34:13','USER_LOGIN',1,'2013-02-23 14:34:13',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.69 Safari/537.17',NULL),(345,'2013-02-24 01:06:41','USER_LOGIN_FAILED',1,'2013-02-24 02:06:41',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(346,'2013-02-24 01:06:45','USER_LOGIN_FAILED',1,'2013-02-24 02:06:45',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(347,'2013-02-24 01:06:55','USER_LOGIN_FAILED',1,'2013-02-24 02:06:55',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(348,'2013-02-24 01:07:03','USER_LOGIN_FAILED',1,'2013-02-24 02:07:03',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(349,'2013-02-24 01:07:21','USER_LOGIN_FAILED',1,'2013-02-24 02:07:21',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(350,'2013-02-24 01:08:12','USER_LOGIN_FAILED',1,'2013-02-24 02:08:12',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(351,'2013-02-24 01:08:42','USER_LOGIN_FAILED',1,'2013-02-24 02:08:42',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(352,'2013-02-24 01:08:50','USER_LOGIN_FAILED',1,'2013-02-24 02:08:50',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(353,'2013-02-24 01:09:08','USER_LOGIN_FAILED',1,'2013-02-24 02:09:08',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(354,'2013-02-24 01:09:42','USER_LOGIN_FAILED',1,'2013-02-24 02:09:42',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(355,'2013-02-24 01:09:50','USER_LOGIN_FAILED',1,'2013-02-24 02:09:50',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(356,'2013-02-24 01:10:05','USER_LOGIN_FAILED',1,'2013-02-24 02:10:05',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(357,'2013-02-24 01:10:22','USER_LOGIN_FAILED',1,'2013-02-24 02:10:22',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(358,'2013-02-24 01:10:30','USER_LOGIN_FAILED',1,'2013-02-24 02:10:30',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(359,'2013-02-24 01:10:56','USER_LOGIN_FAILED',1,'2013-02-24 02:10:56',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(360,'2013-02-24 01:11:26','USER_LOGIN_FAILED',1,'2013-02-24 02:11:26',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(361,'2013-02-24 01:12:06','USER_LOGIN_FAILED',1,'2013-02-24 02:12:06',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(362,'2013-02-24 01:21:14','USER_LOGIN_FAILED',1,'2013-02-24 02:21:14',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(363,'2013-02-24 01:21:25','USER_LOGIN_FAILED',1,'2013-02-24 02:21:25',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(364,'2013-02-24 01:21:54','USER_LOGIN_FAILED',1,'2013-02-24 02:21:54',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(365,'2013-02-24 01:22:14','USER_LOGIN_FAILED',1,'2013-02-24 02:22:14',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(366,'2013-02-24 01:22:37','USER_LOGIN_FAILED',1,'2013-02-24 02:22:37',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(367,'2013-02-24 01:23:01','USER_LOGIN_FAILED',1,'2013-02-24 02:23:01',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(368,'2013-02-24 01:23:39','USER_LOGIN_FAILED',1,'2013-02-24 02:23:39',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(369,'2013-02-24 01:24:04','USER_LOGIN_FAILED',1,'2013-02-24 02:24:04',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(370,'2013-02-24 01:24:39','USER_LOGIN_FAILED',1,'2013-02-24 02:24:39',NULL,'Bad value for login or password - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(371,'2013-02-24 01:25:01','USER_LOGIN_FAILED',1,'2013-02-24 02:25:01',NULL,'Bad value for login or password - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(372,'2013-02-24 01:25:12','USER_LOGIN_FAILED',1,'2013-02-24 02:25:12',NULL,'Bad value for login or password - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(373,'2013-02-24 01:27:30','USER_LOGIN_FAILED',1,'2013-02-24 02:27:30',NULL,'Bad value for login or password - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(374,'2013-02-24 01:28:00','USER_LOGIN_FAILED',1,'2013-02-24 02:28:00',NULL,'Bad value for login or password - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(375,'2013-02-24 01:28:35','USER_LOGIN_FAILED',1,'2013-02-24 02:28:35',NULL,'Bad value for login or password - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(376,'2013-02-24 01:29:03','USER_LOGIN_FAILED',1,'2013-02-24 02:29:03',NULL,'Bad value for login or password - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(377,'2013-02-24 01:29:55','USER_LOGIN_FAILED',1,'2013-02-24 02:29:55',NULL,'Bad value for login or password - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(378,'2013-02-24 01:32:40','USER_LOGIN_FAILED',1,'2013-02-24 02:32:40',NULL,'Bad value for login or password - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(379,'2013-02-24 01:39:33','USER_LOGIN_FAILED',1,'2013-02-24 02:39:33',NULL,'Identifiants login ou mot de passe incorrects - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(380,'2013-02-24 01:39:38','USER_LOGIN_FAILED',1,'2013-02-24 02:39:38',NULL,'Identifiants login ou mot de passe incorrects - login=aa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(381,'2013-02-24 01:39:47','USER_LOGIN_FAILED',1,'2013-02-24 02:39:47',NULL,'Identifiants login ou mot de passe incorrects - login=lmkm','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(382,'2013-02-24 01:40:54','USER_LOGIN_FAILED',1,'2013-02-24 02:40:54',NULL,'Identifiants login ou mot de passe incorrects - login=lmkm','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(383,'2013-02-24 01:47:57','USER_LOGIN_FAILED',1,'2013-02-24 02:47:57',NULL,'Identifiants login ou mot de passe incorrects - login=lmkm','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(384,'2013-02-24 01:48:05','USER_LOGIN_FAILED',1,'2013-02-24 02:48:05',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(385,'2013-02-24 01:48:07','USER_LOGIN_FAILED',1,'2013-02-24 02:48:07',NULL,'Unknown column \'u.lastname\' in \'field list\'','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(386,'2013-02-24 01:48:35','USER_LOGIN',1,'2013-02-24 02:48:35',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(387,'2013-02-24 01:56:32','USER_LOGIN',1,'2013-02-24 02:56:32',1,'(UserLogged,admin)','192.168.0.254','Mozilla/5.0 (Linux; U; Android 2.2; en-us; sdk Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1',NULL),(388,'2013-02-24 02:05:55','USER_LOGOUT',1,'2013-02-24 03:05:55',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(389,'2013-02-24 02:39:52','USER_LOGIN',1,'2013-02-24 03:39:52',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(390,'2013-02-24 02:51:10','USER_LOGOUT',1,'2013-02-24 03:51:10',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(391,'2013-02-24 12:46:41','USER_LOGIN',1,'2013-02-24 13:46:41',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(392,'2013-02-24 12:46:52','USER_LOGOUT',1,'2013-02-24 13:46:52',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(393,'2013-02-24 12:46:56','USER_LOGIN',1,'2013-02-24 13:46:56',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(394,'2013-02-24 12:47:56','USER_LOGOUT',1,'2013-02-24 13:47:56',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(395,'2013-02-24 12:48:00','USER_LOGIN',1,'2013-02-24 13:48:00',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(396,'2013-02-24 12:48:11','USER_LOGOUT',1,'2013-02-24 13:48:11',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(397,'2013-02-24 12:48:32','USER_LOGIN',1,'2013-02-24 13:48:32',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(398,'2013-02-24 12:52:22','USER_LOGOUT',1,'2013-02-24 13:52:22',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(399,'2013-02-24 12:52:27','USER_LOGIN',1,'2013-02-24 13:52:27',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(400,'2013-02-24 12:52:54','USER_LOGOUT',1,'2013-02-24 13:52:54',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(401,'2013-02-24 12:52:59','USER_LOGIN',1,'2013-02-24 13:52:59',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(402,'2013-02-24 12:55:39','USER_LOGOUT',1,'2013-02-24 13:55:39',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(403,'2013-02-24 12:55:59','USER_LOGIN',1,'2013-02-24 13:55:59',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(404,'2013-02-24 12:56:07','USER_LOGOUT',1,'2013-02-24 13:56:07',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(405,'2013-02-24 12:56:23','USER_LOGIN',1,'2013-02-24 13:56:23',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(406,'2013-02-24 12:56:46','USER_LOGOUT',1,'2013-02-24 13:56:46',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(407,'2013-02-24 12:58:30','USER_LOGIN',1,'2013-02-24 13:58:30',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(408,'2013-02-24 12:58:33','USER_LOGOUT',1,'2013-02-24 13:58:33',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(409,'2013-02-24 12:58:51','USER_LOGIN',1,'2013-02-24 13:58:51',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(410,'2013-02-24 12:58:58','USER_LOGOUT',1,'2013-02-24 13:58:58',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(411,'2013-02-24 13:18:53','USER_LOGIN',1,'2013-02-24 14:18:53',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(412,'2013-02-24 13:19:52','USER_LOGOUT',1,'2013-02-24 14:19:52',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(413,'2013-02-24 15:39:31','USER_LOGIN_FAILED',1,'2013-02-24 16:39:31',NULL,'ErrorBadValueForCode - login=admin','127.0.0.1',NULL,NULL),(414,'2013-02-24 15:42:07','USER_LOGIN',1,'2013-02-24 16:42:07',1,'(UserLogged,admin)','127.0.0.1',NULL,NULL),(415,'2013-02-24 15:42:52','USER_LOGOUT',1,'2013-02-24 16:42:52',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7',NULL),(416,'2013-02-24 16:04:21','USER_LOGIN',1,'2013-02-24 17:04:21',1,'(UserLogged,admin)','192.168.0.254','Mozilla/5.0 (Linux; U; Android 2.2; en-us; sdk Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1',NULL),(417,'2013-02-24 16:11:28','USER_LOGIN_FAILED',1,'2013-02-24 17:11:28',NULL,'ErrorBadValueForCode - login=admin','127.0.0.1','Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7',NULL),(418,'2013-02-24 16:11:37','USER_LOGIN',1,'2013-02-24 17:11:37',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7',NULL),(419,'2013-02-24 16:36:52','USER_LOGOUT',1,'2013-02-24 17:36:52',1,'(UserLogoff,admin)','192.168.0.254','Mozilla/5.0 (Linux; U; Android 2.2; en-us; sdk Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1',NULL),(420,'2013-02-24 16:40:37','USER_LOGIN',1,'2013-02-24 17:40:37',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(421,'2013-02-24 16:57:16','USER_LOGIN',1,'2013-02-24 17:57:16',1,'(UserLogged,admin)','192.168.0.254','Mozilla/5.0 (Linux; U; Android 2.2; en-us; sdk Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 2131034114',NULL),(422,'2013-02-24 17:01:30','USER_LOGOUT',1,'2013-02-24 18:01:30',1,'(UserLogoff,admin)','192.168.0.254','Mozilla/5.0 (Linux; U; Android 2.2; en-us; sdk Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 2131034114',NULL),(423,'2013-02-24 17:02:33','USER_LOGIN',1,'2013-02-24 18:02:33',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(424,'2013-02-24 17:14:22','USER_LOGOUT',1,'2013-02-24 18:14:22',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(425,'2013-02-24 17:15:07','USER_LOGIN_FAILED',1,'2013-02-24 18:15:07',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(426,'2013-02-24 17:15:20','USER_LOGIN',1,'2013-02-24 18:15:20',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(427,'2013-02-24 17:20:14','USER_LOGIN',1,'2013-02-24 18:20:14',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(428,'2013-02-24 17:20:51','USER_LOGIN',1,'2013-02-24 18:20:51',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(429,'2013-02-24 17:20:54','USER_LOGOUT',1,'2013-02-24 18:20:54',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(430,'2013-02-24 17:21:19','USER_LOGIN',1,'2013-02-24 18:21:19',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(431,'2013-02-24 17:32:35','USER_LOGIN',1,'2013-02-24 18:32:35',1,'(UserLogged,admin)','192.168.0.254','Mozilla/5.0 (Linux; U; Android 2.2; en-us; sdk Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1 - 2131034114',NULL),(432,'2013-02-24 18:28:48','USER_LOGIN',1,'2013-02-24 19:28:48',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(433,'2013-02-24 18:29:27','USER_LOGOUT',1,'2013-02-24 19:29:27',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7',NULL),(434,'2013-02-24 18:29:32','USER_LOGIN',1,'2013-02-24 19:29:32',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7',NULL),(435,'2013-02-24 20:13:13','USER_LOGOUT',1,'2013-02-24 21:13:13',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(436,'2013-02-24 20:13:17','USER_LOGIN',1,'2013-02-24 21:13:17',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(437,'2013-02-25 08:57:16','USER_LOGIN',1,'2013-02-25 09:57:16',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(438,'2013-02-25 08:57:59','USER_LOGOUT',1,'2013-02-25 09:57:59',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(439,'2013-02-25 09:15:02','USER_LOGIN',1,'2013-02-25 10:15:02',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(440,'2013-02-25 09:15:50','USER_LOGOUT',1,'2013-02-25 10:15:50',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(441,'2013-02-25 09:15:57','USER_LOGIN',1,'2013-02-25 10:15:57',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(442,'2013-02-25 09:16:12','USER_LOGOUT',1,'2013-02-25 10:16:12',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(443,'2013-02-25 09:16:19','USER_LOGIN',1,'2013-02-25 10:16:19',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(444,'2013-02-25 09:16:25','USER_LOGOUT',1,'2013-02-25 10:16:25',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(445,'2013-02-25 09:16:39','USER_LOGIN_FAILED',1,'2013-02-25 10:16:39',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(446,'2013-02-25 09:16:42','USER_LOGIN_FAILED',1,'2013-02-25 10:16:42',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(447,'2013-02-25 09:16:54','USER_LOGIN_FAILED',1,'2013-02-25 10:16:54',NULL,'Identificadors d'usuari o contrasenya incorrectes - login=gfdg','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(448,'2013-02-25 09:17:53','USER_LOGIN',1,'2013-02-25 10:17:53',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(449,'2013-02-25 09:18:37','USER_LOGOUT',1,'2013-02-25 10:18:37',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(450,'2013-02-25 09:18:41','USER_LOGIN',1,'2013-02-25 10:18:41',4,'(UserLogged,aaa)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(451,'2013-02-25 09:18:47','USER_LOGOUT',1,'2013-02-25 10:18:47',4,'(UserLogoff,aaa)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(452,'2013-02-25 10:05:34','USER_LOGIN',1,'2013-02-25 11:05:34',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(453,'2013-02-26 21:51:40','USER_LOGIN',1,'2013-02-26 22:51:40',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(454,'2013-02-26 23:30:06','USER_LOGIN',1,'2013-02-27 00:30:06',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(455,'2013-02-27 14:13:11','USER_LOGIN',1,'2013-02-27 15:13:11',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(456,'2013-02-27 18:12:06','USER_LOGIN_FAILED',1,'2013-02-27 19:12:06',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(457,'2013-02-27 18:12:10','USER_LOGIN',1,'2013-02-27 19:12:10',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(458,'2013-02-27 20:20:08','USER_LOGIN',1,'2013-02-27 21:20:08',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(459,'2013-03-01 22:12:03','USER_LOGIN',1,'2013-03-01 23:12:03',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(460,'2013-03-02 11:45:50','USER_LOGIN',1,'2013-03-02 12:45:50',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(461,'2013-03-02 15:53:51','USER_LOGIN_FAILED',1,'2013-03-02 16:53:51',NULL,'Identifiants login ou mot de passe incorrects - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(462,'2013-03-02 15:53:53','USER_LOGIN',1,'2013-03-02 16:53:53',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(463,'2013-03-02 18:32:32','USER_LOGIN',1,'2013-03-02 19:32:32',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(464,'2013-03-02 22:59:36','USER_LOGIN',1,'2013-03-02 23:59:36',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(465,'2013-03-03 16:26:26','USER_LOGIN',1,'2013-03-03 17:26:26',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(466,'2013-03-03 22:50:27','USER_LOGIN',1,'2013-03-03 23:50:27',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(467,'2013-03-04 08:29:27','USER_LOGIN',1,'2013-03-04 09:29:27',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(468,'2013-03-04 18:27:28','USER_LOGIN',1,'2013-03-04 19:27:28',1,'(UserLogged,admin)','192.168.0.254','Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; NP06)',NULL),(469,'2013-03-04 19:27:23','USER_LOGIN',1,'2013-03-04 20:27:23',1,'(UserLogged,admin)','192.168.0.254','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)',NULL),(470,'2013-03-04 19:35:14','USER_LOGIN',1,'2013-03-04 20:35:14',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(471,'2013-03-04 19:55:49','USER_LOGIN',1,'2013-03-04 20:55:49',1,'(UserLogged,admin)','192.168.0.254','Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',NULL),(472,'2013-03-04 21:16:13','USER_LOGIN',1,'2013-03-04 22:16:13',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(473,'2013-03-05 10:17:30','USER_LOGIN',1,'2013-03-05 11:17:30',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(474,'2013-03-05 11:02:43','USER_LOGIN',1,'2013-03-05 12:02:43',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(475,'2013-03-05 23:14:39','USER_LOGIN',1,'2013-03-06 00:14:39',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(476,'2013-03-06 08:58:57','USER_LOGIN',1,'2013-03-06 09:58:57',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(477,'2013-03-06 14:29:40','USER_LOGIN',1,'2013-03-06 15:29:40',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(478,'2013-03-06 21:53:02','USER_LOGIN',1,'2013-03-06 22:53:02',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(479,'2013-03-07 21:14:39','USER_LOGIN',1,'2013-03-07 22:14:39',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(480,'2013-03-08 00:06:05','USER_LOGIN',1,'2013-03-08 01:06:05',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(481,'2013-03-08 01:38:13','USER_LOGIN',1,'2013-03-08 02:38:13',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(482,'2013-03-08 08:59:50','USER_LOGIN',1,'2013-03-08 09:59:50',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(483,'2013-03-09 12:08:51','USER_LOGIN',1,'2013-03-09 13:08:51',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(484,'2013-03-09 15:19:53','USER_LOGIN',1,'2013-03-09 16:19:53',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(495,'2013-03-09 18:06:21','USER_LOGIN',1,'2013-03-09 19:06:21',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(496,'2013-03-09 20:01:24','USER_LOGIN',1,'2013-03-09 21:01:24',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(497,'2013-03-09 23:36:45','USER_LOGIN',1,'2013-03-10 00:36:45',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(498,'2013-03-10 14:37:13','USER_LOGIN',1,'2013-03-10 15:37:13',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(499,'2013-03-10 17:54:12','USER_LOGIN',1,'2013-03-10 18:54:12',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(500,'2013-03-11 08:57:09','USER_LOGIN',1,'2013-03-11 09:57:09',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(501,'2013-03-11 22:05:13','USER_LOGIN',1,'2013-03-11 23:05:13',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(502,'2013-03-12 08:34:27','USER_LOGIN',1,'2013-03-12 09:34:27',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(503,'2013-03-13 09:11:02','USER_LOGIN',1,'2013-03-13 10:11:02',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(504,'2013-03-13 10:02:11','USER_LOGIN',1,'2013-03-13 11:02:11',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(505,'2013-03-13 13:20:58','USER_LOGIN',1,'2013-03-13 14:20:58',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(506,'2013-03-13 16:19:28','USER_LOGIN',1,'2013-03-13 17:19:28',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(507,'2013-03-13 18:34:30','USER_LOGIN',1,'2013-03-13 19:34:30',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(508,'2013-03-14 08:25:02','USER_LOGIN',1,'2013-03-14 09:25:02',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(509,'2013-03-14 19:15:22','USER_LOGIN',1,'2013-03-14 20:15:22',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(510,'2013-03-14 21:58:53','USER_LOGIN',1,'2013-03-14 22:58:53',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(511,'2013-03-14 21:58:59','USER_LOGOUT',1,'2013-03-14 22:58:59',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(512,'2013-03-14 21:59:07','USER_LOGIN',1,'2013-03-14 22:59:07',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(513,'2013-03-14 22:58:22','USER_LOGOUT',1,'2013-03-14 23:58:22',1,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(514,'2013-03-14 23:00:25','USER_LOGIN',1,'2013-03-15 00:00:25',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(515,'2013-03-16 12:14:28','USER_LOGIN',1,'2013-03-16 13:14:28',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(516,'2013-03-16 16:09:01','USER_LOGIN',1,'2013-03-16 17:09:01',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(517,'2013-03-16 16:57:11','USER_LOGIN',1,'2013-03-16 17:57:11',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(518,'2013-03-16 19:31:31','USER_LOGIN',1,'2013-03-16 20:31:31',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.97 Safari/537.22',NULL),(519,'2013-03-17 17:44:39','USER_LOGIN',1,'2013-03-17 18:44:39',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(520,'2013-03-17 20:40:57','USER_LOGIN',1,'2013-03-17 21:40:57',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(521,'2013-03-17 23:14:05','USER_LOGIN',1,'2013-03-18 00:14:05',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(522,'2013-03-17 23:28:47','USER_LOGOUT',1,'2013-03-18 00:28:47',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(523,'2013-03-17 23:28:54','USER_LOGIN',1,'2013-03-18 00:28:54',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(524,'2013-03-18 17:37:30','USER_LOGIN',1,'2013-03-18 18:37:30',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(525,'2013-03-18 18:11:37','USER_LOGIN',1,'2013-03-18 19:11:37',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(526,'2013-03-19 08:35:08','USER_LOGIN',1,'2013-03-19 09:35:08',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(527,'2013-03-19 09:20:23','USER_LOGIN',1,'2013-03-19 10:20:23',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(528,'2013-03-20 13:17:13','USER_LOGIN',1,'2013-03-20 14:17:13',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(529,'2013-03-20 14:44:31','USER_LOGIN',1,'2013-03-20 15:44:31',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(530,'2013-03-20 18:24:25','USER_LOGIN',1,'2013-03-20 19:24:25',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(531,'2013-03-20 19:15:54','USER_LOGIN',1,'2013-03-20 20:15:54',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(532,'2013-03-21 18:40:47','USER_LOGIN',1,'2013-03-21 19:40:47',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(533,'2013-03-21 21:42:24','USER_LOGIN',1,'2013-03-21 22:42:24',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(534,'2013-03-22 08:39:23','USER_LOGIN',1,'2013-03-22 09:39:23',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(535,'2013-03-23 13:04:55','USER_LOGIN',1,'2013-03-23 14:04:55',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(536,'2013-03-23 15:47:43','USER_LOGIN',1,'2013-03-23 16:47:43',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(537,'2013-03-23 22:56:36','USER_LOGIN',1,'2013-03-23 23:56:36',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(538,'2013-03-24 01:22:32','USER_LOGIN',1,'2013-03-24 02:22:32',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(539,'2013-03-24 14:40:42','USER_LOGIN',1,'2013-03-24 15:40:42',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(540,'2013-03-24 15:30:26','USER_LOGOUT',1,'2013-03-24 16:30:26',1,'(UserLogoff,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(541,'2013-03-24 15:30:29','USER_LOGIN',1,'2013-03-24 16:30:29',2,'(UserLogged,demo)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(542,'2013-03-24 15:49:40','USER_LOGOUT',1,'2013-03-24 16:49:40',2,'(UserLogoff,demo)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(543,'2013-03-24 15:49:48','USER_LOGIN',1,'2013-03-24 16:49:48',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(544,'2013-03-24 15:52:35','USER_MODIFY',1,'2013-03-24 16:52:35',1,'Modification utilisateur zzzg','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(545,'2013-03-24 15:52:52','USER_MODIFY',1,'2013-03-24 16:52:52',1,'Modification utilisateur zzzg','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(546,'2013-03-24 15:53:09','USER_MODIFY',1,'2013-03-24 16:53:09',1,'Modification utilisateur zzzg','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(547,'2013-03-24 15:53:23','USER_MODIFY',1,'2013-03-24 16:53:23',1,'Modification utilisateur zzzg','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(548,'2013-03-24 16:00:04','USER_MODIFY',1,'2013-03-24 17:00:04',1,'Modification utilisateur zzzg','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(549,'2013-03-24 16:01:50','USER_MODIFY',1,'2013-03-24 17:01:50',1,'Modification utilisateur zzzg','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(550,'2013-03-24 16:10:14','USER_MODIFY',1,'2013-03-24 17:10:14',1,'Modification utilisateur zzzg','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(551,'2013-03-24 16:55:13','USER_LOGIN',1,'2013-03-24 17:55:13',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(552,'2013-03-24 17:44:29','USER_LOGIN',1,'2013-03-24 18:44:29',1,'(UserLogged,admin)','::1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22',NULL),(553,'2013-09-08 23:06:26','USER_LOGIN',1,'2013-09-09 01:06:26',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36',NULL),(554,'2013-10-21 22:32:28','USER_LOGIN',1,'2013-10-22 00:32:28',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.66 Safari/537.36',NULL),(555,'2013-10-21 22:32:48','USER_LOGIN',1,'2013-10-22 00:32:48',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.66 Safari/537.36',NULL),(556,'2013-11-07 00:01:51','USER_LOGIN',1,'2013-11-07 01:01:51',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.114 Safari/537.36',NULL),(557,'2014-03-02 15:21:07','USER_LOGIN',1,'2014-03-02 16:21:07',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36',NULL),(558,'2014-03-02 15:36:53','USER_LOGIN',1,'2014-03-02 16:36:53',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36',NULL),(559,'2014-03-02 18:54:23','USER_LOGIN',1,'2014-03-02 19:54:23',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36',NULL),(560,'2014-03-02 19:11:17','USER_LOGIN',1,'2014-03-02 20:11:17',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36',NULL),(561,'2014-03-03 18:19:24','USER_LOGIN',1,'2014-03-03 19:19:24',1,'(UserLogged,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.117 Safari/537.36',NULL),(562,'2014-12-21 12:51:38','USER_LOGIN',1,'2014-12-21 13:51:38',1,'(UserLogged,admin) - TZ=1;TZString=CET;Screen=1920x969','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36',NULL),(563,'2014-12-21 19:52:09','USER_LOGIN',1,'2014-12-21 20:52:09',1,'(UserLogged,admin) - TZ=1;TZString=CET;Screen=1920x969','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36',NULL),(566,'2015-10-03 08:49:43','USER_NEW_PASSWORD',1,'2015-10-03 10:49:43',1,'Password change for admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(567,'2015-10-03 08:49:43','USER_MODIFY',1,'2015-10-03 10:49:43',1,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(568,'2015-10-03 09:03:12','USER_MODIFY',1,'2015-10-03 11:03:12',1,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(569,'2015-10-03 09:03:42','USER_MODIFY',1,'2015-10-03 11:03:42',1,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(570,'2015-10-03 09:07:36','USER_MODIFY',1,'2015-10-03 11:07:36',1,'User demo modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(571,'2015-10-03 09:08:58','USER_NEW_PASSWORD',1,'2015-10-03 11:08:58',1,'Password change for pcurie','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(572,'2015-10-03 09:08:58','USER_MODIFY',1,'2015-10-03 11:08:58',1,'User pcurie modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(573,'2015-10-03 09:09:23','USER_MODIFY',1,'2015-10-03 11:09:23',1,'User pcurie modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(574,'2015-10-03 09:11:04','USER_NEW_PASSWORD',1,'2015-10-03 11:11:04',1,'Password change for athestudent','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(575,'2015-10-03 09:11:04','USER_MODIFY',1,'2015-10-03 11:11:04',1,'User athestudent modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(576,'2015-10-03 09:11:53','USER_MODIFY',1,'2015-10-03 11:11:53',1,'User abookkeeper modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(577,'2015-10-03 09:42:12','USER_LOGIN_FAILED',1,'2015-10-03 11:42:11',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(578,'2015-10-03 09:42:19','USER_LOGIN_FAILED',1,'2015-10-03 11:42:19',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(579,'2015-10-03 09:42:42','USER_LOGIN_FAILED',1,'2015-10-03 11:42:42',NULL,'Bad value for login or password - login=aeinstein','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(580,'2015-10-03 09:43:50','USER_LOGIN',1,'2015-10-03 11:43:50',1,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x788','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(581,'2015-10-03 09:44:44','GROUP_MODIFY',1,'2015-10-03 11:44:44',1,'Group Sale representatives modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(582,'2015-10-03 09:46:25','GROUP_CREATE',1,'2015-10-03 11:46:25',1,'Group Management created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(583,'2015-10-03 09:46:46','GROUP_CREATE',1,'2015-10-03 11:46:46',1,'Group Scientists created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(584,'2015-10-03 09:47:41','USER_CREATE',1,'2015-10-03 11:47:41',1,'User mcurie created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(585,'2015-10-03 09:47:41','USER_NEW_PASSWORD',1,'2015-10-03 11:47:41',1,'Password change for mcurie','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(586,'2015-10-03 09:47:53','USER_MODIFY',1,'2015-10-03 11:47:53',1,'User mcurie modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(587,'2015-10-03 09:48:32','USER_DELETE',1,'2015-10-03 11:48:32',1,'User bbb removed','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(588,'2015-10-03 09:48:52','USER_MODIFY',1,'2015-10-03 11:48:52',1,'User bookkeeper modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(589,'2015-10-03 10:01:28','USER_MODIFY',1,'2015-10-03 12:01:28',1,'User bookkeeper modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(590,'2015-10-03 10:01:39','USER_MODIFY',1,'2015-10-03 12:01:39',1,'User bookkeeper modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(591,'2015-10-05 06:32:38','USER_LOGIN_FAILED',1,'2015-10-05 08:32:38',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(592,'2015-10-05 06:32:44','USER_LOGIN',1,'2015-10-05 08:32:44',1,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(593,'2015-10-05 07:07:52','USER_CREATE',1,'2015-10-05 09:07:52',1,'User atheceo created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(594,'2015-10-05 07:07:52','USER_NEW_PASSWORD',1,'2015-10-05 09:07:52',1,'Password change for atheceo','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(595,'2015-10-05 07:09:08','USER_NEW_PASSWORD',1,'2015-10-05 09:09:08',1,'Password change for aeinstein','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(596,'2015-10-05 07:09:08','USER_MODIFY',1,'2015-10-05 09:09:08',1,'User aeinstein modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(597,'2015-10-05 07:09:46','USER_CREATE',1,'2015-10-05 09:09:46',1,'User admin created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(598,'2015-10-05 07:09:46','USER_NEW_PASSWORD',1,'2015-10-05 09:09:46',1,'Password change for admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(599,'2015-10-05 07:10:20','USER_MODIFY',1,'2015-10-05 09:10:20',1,'User demo modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(600,'2015-10-05 07:10:48','USER_MODIFY',1,'2015-10-05 09:10:48',1,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(601,'2015-10-05 07:11:22','USER_NEW_PASSWORD',1,'2015-10-05 09:11:22',1,'Password change for bbookkeeper','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(602,'2015-10-05 07:11:22','USER_MODIFY',1,'2015-10-05 09:11:22',1,'User bbookkeeper modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(603,'2015-10-05 07:12:37','USER_MODIFY',1,'2015-10-05 09:12:37',1,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(604,'2015-10-05 07:13:27','USER_MODIFY',1,'2015-10-05 09:13:27',1,'User demo modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(605,'2015-10-05 07:13:52','USER_MODIFY',1,'2015-10-05 09:13:52',1,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(606,'2015-10-05 07:14:35','USER_LOGOUT',1,'2015-10-05 09:14:35',1,'(UserLogoff,aeinstein)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(607,'2015-10-05 07:14:40','USER_LOGIN_FAILED',1,'2015-10-05 09:14:40',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(608,'2015-10-05 07:14:44','USER_LOGIN_FAILED',1,'2015-10-05 09:14:44',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(609,'2015-10-05 07:14:49','USER_LOGIN',1,'2015-10-05 09:14:49',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(610,'2015-10-05 07:57:18','USER_MODIFY',1,'2015-10-05 09:57:18',12,'User aeinstein modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(611,'2015-10-05 08:06:54','USER_LOGOUT',1,'2015-10-05 10:06:54',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(612,'2015-10-05 08:07:03','USER_LOGIN',1,'2015-10-05 10:07:03',11,'(UserLogged,atheceo) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(613,'2015-10-05 19:18:46','USER_LOGIN',1,'2015-10-05 21:18:46',11,'(UserLogged,atheceo) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(614,'2015-10-05 19:29:35','USER_CREATE',1,'2015-10-05 21:29:35',11,'User ccommercy created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(615,'2015-10-05 19:29:35','USER_NEW_PASSWORD',1,'2015-10-05 21:29:35',11,'Password change for ccommercy','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(616,'2015-10-05 19:30:13','GROUP_CREATE',1,'2015-10-05 21:30:13',11,'Group Commercial created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(617,'2015-10-05 19:31:37','USER_NEW_PASSWORD',1,'2015-10-05 21:31:37',11,'Password change for admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(618,'2015-10-05 19:31:37','USER_MODIFY',1,'2015-10-05 21:31:37',11,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(619,'2015-10-05 19:32:00','USER_MODIFY',1,'2015-10-05 21:32:00',11,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(620,'2015-10-05 19:33:33','USER_CREATE',1,'2015-10-05 21:33:33',11,'User sscientol created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(621,'2015-10-05 19:33:33','USER_NEW_PASSWORD',1,'2015-10-05 21:33:33',11,'Password change for sscientol','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(622,'2015-10-05 19:33:47','USER_NEW_PASSWORD',1,'2015-10-05 21:33:47',11,'Password change for mcurie','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(623,'2015-10-05 19:33:47','USER_MODIFY',1,'2015-10-05 21:33:47',11,'User mcurie modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(624,'2015-10-05 19:34:23','USER_NEW_PASSWORD',1,'2015-10-05 21:34:23',11,'Password change for pcurie','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(625,'2015-10-05 19:34:23','USER_MODIFY',1,'2015-10-05 21:34:23',11,'User pcurie modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(626,'2015-10-05 19:34:42','USER_MODIFY',1,'2015-10-05 21:34:42',11,'User aeinstein modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(627,'2015-10-05 19:36:06','USER_NEW_PASSWORD',1,'2015-10-05 21:36:06',11,'Password change for ccommercy','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(628,'2015-10-05 19:36:06','USER_MODIFY',1,'2015-10-05 21:36:06',11,'User ccommercy modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(629,'2015-10-05 19:36:57','USER_NEW_PASSWORD',1,'2015-10-05 21:36:57',11,'Password change for atheceo','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(630,'2015-10-05 19:36:57','USER_MODIFY',1,'2015-10-05 21:36:57',11,'User atheceo modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(631,'2015-10-05 19:37:27','USER_LOGOUT',1,'2015-10-05 21:37:27',11,'(UserLogoff,atheceo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(632,'2015-10-05 19:37:35','USER_LOGIN_FAILED',1,'2015-10-05 21:37:35',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(633,'2015-10-05 19:37:39','USER_LOGIN_FAILED',1,'2015-10-05 21:37:39',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(634,'2015-10-05 19:37:44','USER_LOGIN_FAILED',1,'2015-10-05 21:37:44',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(635,'2015-10-05 19:37:49','USER_LOGIN_FAILED',1,'2015-10-05 21:37:49',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(636,'2015-10-05 19:38:12','USER_LOGIN_FAILED',1,'2015-10-05 21:38:12',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(637,'2015-10-05 19:40:48','USER_LOGIN_FAILED',1,'2015-10-05 21:40:48',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(638,'2015-10-05 19:40:55','USER_LOGIN',1,'2015-10-05 21:40:55',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(639,'2015-10-05 19:43:34','USER_MODIFY',1,'2015-10-05 21:43:34',12,'User aeinstein modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(640,'2015-10-05 19:45:43','USER_CREATE',1,'2015-10-05 21:45:43',12,'User aaa created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(641,'2015-10-05 19:45:43','USER_NEW_PASSWORD',1,'2015-10-05 21:45:43',12,'Password change for aaa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(642,'2015-10-05 19:46:18','USER_DELETE',1,'2015-10-05 21:46:18',12,'User aaa removed','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(643,'2015-10-05 19:47:09','USER_MODIFY',1,'2015-10-05 21:47:09',12,'User demo modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(644,'2015-10-05 19:47:22','USER_MODIFY',1,'2015-10-05 21:47:22',12,'User demo modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(645,'2015-10-05 19:52:05','USER_MODIFY',1,'2015-10-05 21:52:05',12,'User sscientol modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(646,'2015-10-05 19:52:23','USER_MODIFY',1,'2015-10-05 21:52:23',12,'User bbookkeeper modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(647,'2015-10-05 19:54:54','USER_NEW_PASSWORD',1,'2015-10-05 21:54:54',12,'Password change for zzeceo','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(648,'2015-10-05 19:54:54','USER_MODIFY',1,'2015-10-05 21:54:54',12,'User zzeceo modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(649,'2015-10-05 19:57:02','USER_MODIFY',1,'2015-10-05 21:57:02',12,'User zzeceo modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(650,'2015-10-05 19:57:57','USER_NEW_PASSWORD',1,'2015-10-05 21:57:57',12,'Password change for pcurie','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(651,'2015-10-05 19:57:57','USER_MODIFY',1,'2015-10-05 21:57:57',12,'User pcurie modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(652,'2015-10-05 19:59:42','USER_NEW_PASSWORD',1,'2015-10-05 21:59:42',12,'Password change for admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(653,'2015-10-05 19:59:42','USER_MODIFY',1,'2015-10-05 21:59:42',12,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(654,'2015-10-05 20:00:21','USER_MODIFY',1,'2015-10-05 22:00:21',12,'User adminx modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(655,'2015-10-05 20:05:36','USER_MODIFY',1,'2015-10-05 22:05:36',12,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(656,'2015-10-05 20:06:25','USER_MODIFY',1,'2015-10-05 22:06:25',12,'User ccommercy modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(657,'2015-10-05 20:07:18','USER_MODIFY',1,'2015-10-05 22:07:18',12,'User mcurie modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(658,'2015-10-05 20:07:36','USER_MODIFY',1,'2015-10-05 22:07:36',12,'User aeinstein modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(659,'2015-10-05 20:08:34','USER_MODIFY',1,'2015-10-05 22:08:34',12,'User bbookkeeper modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(660,'2015-10-05 20:47:52','USER_CREATE',1,'2015-10-05 22:47:52',12,'User cc1 created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(661,'2015-10-05 20:47:52','USER_NEW_PASSWORD',1,'2015-10-05 22:47:52',12,'Password change for cc1','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(662,'2015-10-05 20:47:55','USER_LOGOUT',1,'2015-10-05 22:47:55',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(663,'2015-10-05 20:48:08','USER_LOGIN',1,'2015-10-05 22:48:08',11,'(UserLogged,zzeceo) - TZ=1;TZString=Europe/Berlin;Screen=1590x434','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(664,'2015-10-05 20:48:39','USER_CREATE',1,'2015-10-05 22:48:39',11,'User cc2 created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(665,'2015-10-05 20:48:39','USER_NEW_PASSWORD',1,'2015-10-05 22:48:39',11,'Password change for cc2','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(666,'2015-10-05 20:48:59','USER_NEW_PASSWORD',1,'2015-10-05 22:48:59',11,'Password change for cc1','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(667,'2015-10-05 20:48:59','USER_MODIFY',1,'2015-10-05 22:48:59',11,'User cc1 modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(668,'2015-10-05 21:06:36','USER_LOGOUT',1,'2015-10-05 23:06:35',11,'(UserLogoff,zzeceo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(669,'2015-10-05 21:06:44','USER_LOGIN_FAILED',1,'2015-10-05 23:06:44',NULL,'Bad value for login or password - login=cc1','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(670,'2015-10-05 21:07:12','USER_LOGIN_FAILED',1,'2015-10-05 23:07:12',NULL,'Bad value for login or password - login=cc1','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(671,'2015-10-05 21:07:19','USER_LOGIN_FAILED',1,'2015-10-05 23:07:19',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(672,'2015-10-05 21:07:27','USER_LOGIN_FAILED',1,'2015-10-05 23:07:27',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(673,'2015-10-05 21:07:32','USER_LOGIN',1,'2015-10-05 23:07:32',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(674,'2015-10-05 21:12:28','USER_NEW_PASSWORD',1,'2015-10-05 23:12:28',12,'Password change for cc1','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(675,'2015-10-05 21:12:28','USER_MODIFY',1,'2015-10-05 23:12:28',12,'User cc1 modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(676,'2015-10-05 21:13:00','USER_CREATE',1,'2015-10-05 23:13:00',12,'User aaa created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(677,'2015-10-05 21:13:00','USER_NEW_PASSWORD',1,'2015-10-05 23:13:00',12,'Password change for aaa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(678,'2015-10-05 21:13:40','USER_DELETE',1,'2015-10-05 23:13:40',12,'User aaa removed','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(679,'2015-10-05 21:14:47','USER_LOGOUT',1,'2015-10-05 23:14:47',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(680,'2015-10-05 21:14:56','USER_LOGIN',1,'2015-10-05 23:14:56',16,'(UserLogged,cc1) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(681,'2015-10-05 21:15:56','USER_LOGOUT',1,'2015-10-05 23:15:56',16,'(UserLogoff,cc1)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(682,'2015-10-05 21:16:06','USER_LOGIN',1,'2015-10-05 23:16:06',17,'(UserLogged,cc2) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(683,'2015-10-05 21:37:25','USER_LOGOUT',1,'2015-10-05 23:37:25',17,'(UserLogoff,cc2)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(684,'2015-10-05 21:37:31','USER_LOGIN',1,'2015-10-05 23:37:31',16,'(UserLogged,cc1) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(685,'2015-10-05 21:43:53','USER_LOGOUT',1,'2015-10-05 23:43:53',16,'(UserLogoff,cc1)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(686,'2015-10-05 21:44:00','USER_LOGIN',1,'2015-10-05 23:44:00',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(687,'2015-10-05 21:46:17','USER_LOGOUT',1,'2015-10-05 23:46:17',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(688,'2015-10-05 21:46:24','USER_LOGIN',1,'2015-10-05 23:46:24',16,'(UserLogged,cc1) - TZ=1;TZString=Europe/Berlin;Screen=1590x767','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36',NULL),(689,'2015-11-04 15:17:06','USER_LOGIN',1,'2015-11-04 16:17:06',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(690,'2015-11-15 22:04:04','USER_LOGIN',1,'2015-11-15 23:04:04',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(691,'2015-11-15 22:23:45','USER_MODIFY',1,'2015-11-15 23:23:45',12,'User ccommercy modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(692,'2015-11-15 22:24:22','USER_MODIFY',1,'2015-11-15 23:24:22',12,'User cc1 modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(693,'2015-11-15 22:24:53','USER_MODIFY',1,'2015-11-15 23:24:53',12,'User cc2 modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(694,'2015-11-15 22:25:17','USER_MODIFY',1,'2015-11-15 23:25:17',12,'User cc1 modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(695,'2015-11-15 22:45:37','USER_LOGOUT',1,'2015-11-15 23:45:37',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(696,'2015-11-18 13:41:02','USER_LOGIN',1,'2015-11-18 14:41:02',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(697,'2015-11-18 14:23:35','USER_LOGIN',1,'2015-11-18 15:23:35',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(698,'2015-11-18 15:15:46','USER_LOGOUT',1,'2015-11-18 16:15:46',2,'(UserLogoff,demo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(699,'2015-11-18 15:15:51','USER_LOGIN',1,'2015-11-18 16:15:51',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(700,'2015-11-30 17:52:08','USER_LOGIN',1,'2015-11-30 18:52:08',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(701,'2016-01-10 16:45:43','USER_LOGIN',1,'2016-01-10 17:45:43',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(702,'2016-01-10 16:45:52','USER_LOGOUT',1,'2016-01-10 17:45:52',2,'(UserLogoff,demo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(703,'2016-01-10 16:46:06','USER_LOGIN',1,'2016-01-10 17:46:06',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(704,'2016-01-16 14:53:47','USER_LOGIN',1,'2016-01-16 15:53:47',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(705,'2016-01-16 15:04:29','USER_LOGOUT',1,'2016-01-16 16:04:29',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(706,'2016-01-16 15:04:40','USER_LOGIN',1,'2016-01-16 16:04:40',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(707,'2016-01-22 09:33:26','USER_LOGIN',1,'2016-01-22 10:33:26',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(708,'2016-01-22 09:35:19','USER_LOGOUT',1,'2016-01-22 10:35:19',2,'(UserLogoff,demo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(709,'2016-01-22 09:35:29','USER_LOGIN',1,'2016-01-22 10:35:29',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(710,'2016-01-22 10:47:34','USER_CREATE',1,'2016-01-22 11:47:34',12,'User aaa created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(711,'2016-01-22 10:47:34','USER_NEW_PASSWORD',1,'2016-01-22 11:47:34',12,'Password change for aaa','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(712,'2016-01-22 12:07:56','USER_LOGIN',1,'2016-01-22 13:07:56',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(713,'2016-01-22 12:36:25','USER_NEW_PASSWORD',1,'2016-01-22 13:36:25',12,'Password change for admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(714,'2016-01-22 12:36:25','USER_MODIFY',1,'2016-01-22 13:36:25',12,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(715,'2016-01-22 12:56:32','USER_MODIFY',1,'2016-01-22 13:56:32',12,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(716,'2016-01-22 12:58:05','USER_MODIFY',1,'2016-01-22 13:58:05',12,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(717,'2016-01-22 13:01:02','USER_MODIFY',1,'2016-01-22 14:01:02',12,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(718,'2016-01-22 13:01:18','USER_MODIFY',1,'2016-01-22 14:01:18',12,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(719,'2016-01-22 13:13:42','USER_MODIFY',1,'2016-01-22 14:13:42',12,'User admin modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(720,'2016-01-22 13:15:20','USER_DELETE',1,'2016-01-22 14:15:20',12,'User aaa removed','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(721,'2016-01-22 13:19:21','USER_LOGOUT',1,'2016-01-22 14:19:21',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(722,'2016-01-22 13:19:32','USER_LOGIN',1,'2016-01-22 14:19:32',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(723,'2016-01-22 13:19:51','USER_LOGOUT',1,'2016-01-22 14:19:51',2,'(UserLogoff,demo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(724,'2016-01-22 13:20:01','USER_LOGIN',1,'2016-01-22 14:20:01',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(725,'2016-01-22 13:28:22','USER_LOGOUT',1,'2016-01-22 14:28:22',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(726,'2016-01-22 13:28:35','USER_LOGIN',1,'2016-01-22 14:28:35',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(727,'2016-01-22 13:33:54','USER_LOGOUT',1,'2016-01-22 14:33:54',2,'(UserLogoff,demo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(728,'2016-01-22 13:34:05','USER_LOGIN',1,'2016-01-22 14:34:05',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(729,'2016-01-22 13:51:46','USER_MODIFY',1,'2016-01-22 14:51:46',12,'User ccommercy modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36',NULL),(730,'2016-01-22 16:20:12','USER_LOGIN',1,'2016-01-22 17:20:12',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(731,'2016-01-22 16:20:22','USER_LOGOUT',1,'2016-01-22 17:20:22',2,'(UserLogoff,demo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(732,'2016-01-22 16:20:36','USER_LOGIN',1,'2016-01-22 17:20:36',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(733,'2016-01-22 16:27:02','USER_CREATE',1,'2016-01-22 17:27:02',12,'User ldestailleur created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(734,'2016-01-22 16:27:02','USER_NEW_PASSWORD',1,'2016-01-22 17:27:02',12,'Password change for ldestailleur','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(735,'2016-01-22 16:28:34','USER_MODIFY',1,'2016-01-22 17:28:34',12,'User ldestailleur modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(736,'2016-01-22 16:30:01','USER_ENABLEDISABLE',1,'2016-01-22 17:30:01',12,'User cc2 activated','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(737,'2016-01-22 17:11:06','USER_LOGIN',1,'2016-01-22 18:11:06',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=1600x790','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(738,'2016-01-22 18:00:02','USER_DELETE',1,'2016-01-22 19:00:02',12,'User zzz removed','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(739,'2016-01-22 18:01:40','USER_DELETE',1,'2016-01-22 19:01:40',12,'User aaab removed','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(740,'2016-01-22 18:01:52','USER_DELETE',1,'2016-01-22 19:01:52',12,'User zzzg removed','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.82 Safari/537.36',NULL),(741,'2016-03-13 10:54:59','USER_LOGIN',1,'2016-03-13 14:54:59',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x971','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36',NULL),(742,'2016-07-30 11:13:10','USER_LOGIN',1,'2016-07-30 15:13:10',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(743,'2016-07-30 12:50:23','USER_CREATE',1,'2016-07-30 16:50:23',12,'User eldy created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(744,'2016-07-30 12:50:23','USER_CREATE',1,'2016-07-30 16:50:23',12,'User eldy created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(745,'2016-07-30 12:50:23','USER_NEW_PASSWORD',1,'2016-07-30 16:50:23',12,'Password change for eldy','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(746,'2016-07-30 12:50:38','USER_MODIFY',1,'2016-07-30 16:50:38',12,'User eldy modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(747,'2016-07-30 12:50:54','USER_DELETE',1,'2016-07-30 16:50:54',12,'User eldy removed','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(748,'2016-07-30 12:51:23','USER_NEW_PASSWORD',1,'2016-07-30 16:51:23',12,'Password change for ldestailleur','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(749,'2016-07-30 12:51:23','USER_MODIFY',1,'2016-07-30 16:51:23',12,'User ldestailleur modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(750,'2016-07-30 18:26:58','USER_LOGIN',1,'2016-07-30 22:26:58',18,'(UserLogged,ldestailleur) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(751,'2016-07-30 18:27:40','USER_LOGOUT',1,'2016-07-30 22:27:40',18,'(UserLogoff,ldestailleur)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(752,'2016-07-30 18:27:47','USER_LOGIN',1,'2016-07-30 22:27:47',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(753,'2016-07-30 19:00:00','USER_LOGOUT',1,'2016-07-30 23:00:00',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(754,'2016-07-30 19:00:04','USER_LOGIN',1,'2016-07-30 23:00:04',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(755,'2016-07-30 19:00:14','USER_LOGOUT',1,'2016-07-30 23:00:14',2,'(UserLogoff,demo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(756,'2016-07-30 19:00:19','USER_LOGIN',1,'2016-07-30 23:00:19',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(757,'2016-07-30 19:00:43','USER_LOGOUT',1,'2016-07-30 23:00:43',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(758,'2016-07-30 19:00:48','USER_LOGIN',1,'2016-07-30 23:00:48',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(759,'2016-07-30 19:03:52','USER_LOGOUT',1,'2016-07-30 23:03:52',2,'(UserLogoff,demo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(760,'2016-07-30 19:03:57','USER_LOGIN_FAILED',1,'2016-07-30 23:03:57',NULL,'Bad value for login or password - login=admin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(761,'2016-07-30 19:03:59','USER_LOGIN',1,'2016-07-30 23:03:59',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(762,'2016-07-30 19:04:13','USER_LOGOUT',1,'2016-07-30 23:04:13',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(763,'2016-07-30 19:04:17','USER_LOGIN',1,'2016-07-30 23:04:17',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(764,'2016-07-30 19:04:26','USER_LOGOUT',1,'2016-07-30 23:04:26',2,'(UserLogoff,demo)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(765,'2016-07-30 19:04:31','USER_LOGIN',1,'2016-07-30 23:04:31',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(766,'2016-07-30 19:10:50','USER_LOGOUT',1,'2016-07-30 23:10:50',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(767,'2016-07-30 19:10:54','USER_LOGIN',1,'2016-07-30 23:10:54',2,'(UserLogged,demo) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(768,'2016-07-31 10:15:52','USER_LOGIN',1,'2016-07-31 14:15:52',12,'(UserLogged,admin) - TZ=;TZString=;Screen=x','127.0.0.1','Lynx/2.8.8pre.4 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/2.12.23',NULL),(769,'2016-07-31 10:16:27','USER_LOGIN',1,'2016-07-31 14:16:27',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(770,'2016-07-31 10:32:14','USER_LOGIN',1,'2016-07-31 14:32:14',12,'(UserLogged,admin) - TZ=;TZString=;Screen=x','127.0.0.1','Lynx/2.8.8pre.4 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/2.12.23',NULL),(771,'2016-07-31 10:36:28','USER_LOGIN',1,'2016-07-31 14:36:28',12,'(UserLogged,admin) - TZ=;TZString=;Screen=x','127.0.0.1','Links (2.8; Linux 3.19.0-46-generic x86_64; GNU C 4.8.2; text)',NULL),(772,'2016-07-31 10:40:10','USER_LOGIN',1,'2016-07-31 14:40:10',12,'(UserLogged,admin) - TZ=;TZString=;Screen=x','127.0.0.1','Links (2.8; Linux 3.19.0-46-generic x86_64; GNU C 4.8.2; text)',NULL),(773,'2016-07-31 10:54:16','USER_LOGIN',1,'2016-07-31 14:54:16',12,'(UserLogged,admin) - TZ=;TZString=;Screen=x','127.0.0.1','Lynx/2.8.8pre.4 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/2.12.23',NULL),(774,'2016-07-31 12:52:52','USER_LOGIN',1,'2016-07-31 16:52:52',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x592','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(775,'2016-07-31 13:25:33','USER_LOGOUT',1,'2016-07-31 17:25:33',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(776,'2016-07-31 13:26:32','USER_LOGIN',1,'2016-07-31 17:26:32',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1280x751','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(777,'2016-07-31 14:13:57','USER_LOGOUT',1,'2016-07-31 18:13:57',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(778,'2016-07-31 14:14:04','USER_LOGIN',1,'2016-07-31 18:14:04',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(779,'2016-07-31 16:04:35','USER_LOGIN',1,'2016-07-31 20:04:34',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(780,'2016-07-31 21:14:14','USER_LOGIN',1,'2016-08-01 01:14:14',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',NULL),(781,'2017-01-29 15:14:05','USER_LOGOUT',1,'2017-01-29 19:14:05',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(782,'2017-01-29 15:34:43','USER_LOGIN',1,'2017-01-29 19:34:43',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x571','192.168.0.254','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(783,'2017-01-29 15:35:04','USER_LOGOUT',1,'2017-01-29 19:35:04',12,'(UserLogoff,admin)','192.168.0.254','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(784,'2017-01-29 15:35:12','USER_LOGIN',1,'2017-01-29 19:35:12',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','192.168.0.254','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(785,'2017-01-29 15:36:43','USER_LOGOUT',1,'2017-01-29 19:36:43',12,'(UserLogoff,admin)','192.168.0.254','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(786,'2017-01-29 15:41:21','USER_LOGIN',1,'2017-01-29 19:41:21',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x571','192.168.0.254','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(787,'2017-01-29 15:41:41','USER_LOGOUT',1,'2017-01-29 19:41:41',12,'(UserLogoff,admin)','192.168.0.254','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(788,'2017-01-29 15:42:43','USER_LOGIN',1,'2017-01-29 19:42:43',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x571','192.168.0.254','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(789,'2017-01-29 15:43:18','USER_LOGOUT',1,'2017-01-29 19:43:18',12,'(UserLogoff,admin)','192.168.0.254','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(790,'2017-01-29 15:46:31','USER_LOGIN',1,'2017-01-29 19:46:31',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x571','192.168.0.254','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(791,'2017-01-29 16:18:56','USER_LOGIN',1,'2017-01-29 20:18:56',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Berlin;Screen=360x526','192.168.0.254','Mozilla/5.0 (Linux; Android 6.0; LG-H818 Build/MRA58K; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/55.0.2883.91 Mobile Safari/537.36 - DoliDroid - Android client pour Dolibarr ERP-CRM',NULL),(792,'2017-01-29 17:20:59','USER_LOGIN',1,'2017-01-29 21:20:59',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(793,'2017-01-30 11:19:40','USER_LOGIN',1,'2017-01-30 15:19:40',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(794,'2017-01-31 16:49:39','USER_LOGIN',1,'2017-01-31 20:49:39',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x520','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(795,'2017-02-01 10:55:23','USER_LOGIN',1,'2017-02-01 14:55:23',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(796,'2017-02-01 13:34:31','USER_LOGIN',1,'2017-02-01 17:34:31',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(797,'2017-02-01 14:41:26','USER_LOGIN',1,'2017-02-01 18:41:26',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(798,'2017-02-01 23:51:48','USER_LOGIN_FAILED',1,'2017-02-02 03:51:48',NULL,'Bad value for login or password - login=autologin','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(799,'2017-02-01 23:52:55','USER_LOGIN',1,'2017-02-02 03:52:55',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(800,'2017-02-01 23:55:45','USER_CREATE',1,'2017-02-02 03:55:45',12,'User aboston created','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(801,'2017-02-01 23:55:45','USER_NEW_PASSWORD',1,'2017-02-02 03:55:45',12,'Password change for aboston','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(802,'2017-02-01 23:56:38','USER_MODIFY',1,'2017-02-02 03:56:38',12,'User aboston modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(803,'2017-02-01 23:56:50','USER_MODIFY',1,'2017-02-02 03:56:50',12,'User aboston modified','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(804,'2017-02-02 01:14:44','USER_LOGIN',1,'2017-02-02 05:14:44',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',NULL),(805,'2017-02-03 10:27:18','USER_LOGIN',1,'2017-02-03 14:27:18',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(806,'2017-02-04 10:22:34','USER_LOGIN',1,'2017-02-04 14:22:34',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x489','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(807,'2017-02-06 04:01:31','USER_LOGIN',1,'2017-02-06 08:01:31',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(808,'2017-02-06 10:21:32','USER_LOGIN',1,'2017-02-06 14:21:32',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(809,'2017-02-06 19:09:27','USER_LOGIN',1,'2017-02-06 23:09:27',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(810,'2017-02-06 23:39:17','USER_LOGIN',1,'2017-02-07 03:39:17',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(811,'2017-02-07 11:36:34','USER_LOGIN',1,'2017-02-07 15:36:34',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x676','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(812,'2017-02-07 18:51:53','USER_LOGIN',1,'2017-02-07 22:51:53',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(813,'2017-02-07 23:13:40','USER_LOGIN',1,'2017-02-08 03:13:40',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(814,'2017-02-08 09:29:12','USER_LOGIN',1,'2017-02-08 13:29:12',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(815,'2017-02-08 17:33:12','USER_LOGIN',1,'2017-02-08 21:33:12',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(816,'2017-02-09 17:30:34','USER_LOGIN',1,'2017-02-09 21:30:34',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(817,'2017-02-10 09:30:02','USER_LOGIN',1,'2017-02-10 13:30:02',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(818,'2017-02-10 16:16:14','USER_LOGIN',1,'2017-02-10 20:16:14',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(819,'2017-02-10 17:28:15','USER_LOGIN',1,'2017-02-10 21:28:15',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(820,'2017-02-11 12:54:03','USER_LOGIN',1,'2017-02-11 16:54:03',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(821,'2017-02-11 17:23:52','USER_LOGIN',1,'2017-02-11 21:23:52',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(822,'2017-02-12 12:44:03','USER_LOGIN',1,'2017-02-12 16:44:03',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(823,'2017-02-12 16:42:13','USER_LOGIN',1,'2017-02-12 20:42:13',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(824,'2017-02-12 19:14:18','USER_LOGIN',1,'2017-02-12 23:14:18',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(825,'2017-02-15 17:17:00','USER_LOGIN',1,'2017-02-15 21:17:00',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(826,'2017-02-15 22:02:40','USER_LOGIN',1,'2017-02-16 02:02:40',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(827,'2017-02-16 22:13:27','USER_LOGIN',1,'2017-02-17 02:13:27',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x619','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(828,'2017-02-16 23:54:04','USER_LOGIN',1,'2017-02-17 03:54:04',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(829,'2017-02-17 09:14:27','USER_LOGIN',1,'2017-02-17 13:14:27',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(830,'2017-02-17 12:07:05','USER_LOGIN',1,'2017-02-17 16:07:05',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(831,'2017-02-19 21:22:20','USER_LOGIN',1,'2017-02-20 01:22:20',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(832,'2017-02-20 09:26:47','USER_LOGIN',1,'2017-02-20 13:26:47',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(833,'2017-02-20 16:39:55','USER_LOGIN',1,'2017-02-20 20:39:55',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(834,'2017-02-20 16:49:00','USER_MODIFY',1,'2017-02-20 20:49:00',12,'Modification utilisateur ccommerson','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(835,'2017-02-20 17:57:15','USER_LOGIN',1,'2017-02-20 21:57:14',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(836,'2017-02-20 19:43:48','USER_LOGIN',1,'2017-02-20 23:43:48',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(837,'2017-02-21 00:04:05','USER_LOGIN',1,'2017-02-21 04:04:05',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(838,'2017-02-21 10:23:13','USER_LOGIN',1,'2017-02-21 14:23:13',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(839,'2017-02-21 10:30:17','USER_LOGOUT',1,'2017-02-21 14:30:17',12,'(UserLogoff,admin)','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(840,'2017-02-21 10:30:22','USER_LOGIN',1,'2017-02-21 14:30:22',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(841,'2017-02-21 11:44:05','USER_LOGIN',1,'2017-02-21 15:44:05',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',NULL),(842,'2017-05-12 09:02:48','USER_LOGIN',1,'2017-05-12 13:02:48',12,'(UserLogged,admin) - TZ=1;TZString=Europe/Paris;Screen=1920x937','127.0.0.1','Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36',NULL); /*!40000 ALTER TABLE `llx_events` ENABLE KEYS */; UNLOCK TABLES; @@ -4553,7 +4555,7 @@ CREATE TABLE `llx_extrafields` ( LOCK TABLES `llx_extrafields` WRITE; /*!40000 ALTER TABLE `llx_extrafields` DISABLE KEYS */; -INSERT INTO `llx_extrafields` VALUES (2,'adherent','zzz',1,'2013-09-08 23:04:20','zzz','varchar','255',0,0,NULL,0,0,NULL,0,0),(23,'societe','anotheraddedfield',1,'2015-10-03 09:36:35','Another added field','varchar','15',0,1,'a:1:{s:7:\"options\";a:1:{s:0:\"\";N;}}',0,0,NULL,0,0),(27,'projet','priority',1,'2016-07-30 11:28:27','Priority','select','',0,1,'a:1:{s:7:\"options\";a:5:{i:1;s:1:\"1\";i:2;s:1:\"2\";i:3;s:1:\"3\";i:4;s:1:\"4\";i:5;s:1:\"5\";}}',0,0,NULL,0,0),(28,'societe','height',1,'2017-02-12 19:15:52','Height','varchar','128',1,0,'0',0,0,NULL,0,0),(29,'societe','weight',1,'2017-02-12 19:15:53','Weigth','varchar','128',2,0,'0',0,0,NULL,0,0),(30,'societe','prof',1,'2017-02-12 19:15:53','Profession','varchar','128',3,0,'0',0,0,NULL,0,0),(31,'societe','birthdate',1,'2017-02-12 19:15:53','Date of birth','date','0',4,0,'0',0,0,NULL,0,0); +INSERT INTO `llx_extrafields` VALUES (2,'adherent','zzz',1,'2013-09-08 23:04:20','zzz','varchar','255',0,0,NULL,0,0,NULL,0,0),(27,'projet','priority',1,'2016-07-30 11:28:27','Priority','select','',0,1,'a:1:{s:7:\"options\";a:5:{i:1;s:1:\"1\";i:2;s:1:\"2\";i:3;s:1:\"3\";i:4;s:1:\"4\";i:5;s:1:\"5\";}}',0,0,NULL,0,0); /*!40000 ALTER TABLE `llx_extrafields` ENABLE KEYS */; UNLOCK TABLES; @@ -5053,6 +5055,7 @@ CREATE TABLE `llx_facturedet_rec` ( `label` varchar(255) DEFAULT NULL, `description` text, `tva_tx` double(6,3) DEFAULT NULL, + `vat_src_code` varchar(10) DEFAULT '', `localtax1_tx` double(6,3) DEFAULT '0.000', `localtax1_type` varchar(10) NOT NULL DEFAULT '0', `localtax2_tx` double(6,3) DEFAULT '0.000', @@ -5091,7 +5094,7 @@ CREATE TABLE `llx_facturedet_rec` ( LOCK TABLES `llx_facturedet_rec` WRITE; /*!40000 ALTER TABLE `llx_facturedet_rec` DISABLE KEYS */; -INSERT INTO `llx_facturedet_rec` VALUES (1,1,NULL,NULL,0,NULL,'ùkù',0.000,0.000,'0',0.000,'0',1,0,NULL,10.00000000,10.00000000,10.00000000,0.00000000,0.00000000,0.00000000,10.00000000,0,0,1,NULL,NULL,NULL,NULL,NULL,0.00000000,0.00000000,0.00000000,0.00000000),(3,2,NULL,NULL,0,NULL,'ddd',0.000,0.000,'0',0.000,'0',1,0,NULL,5.00000000,5.00000000,5.00000000,0.00000000,0.00000000,0.00000000,5.00000000,0,0,1,NULL,NULL,NULL,NULL,NULL,0.00000000,0.00000000,0.00000000,0.00000000); +INSERT INTO `llx_facturedet_rec` VALUES (1,1,NULL,NULL,0,NULL,'ùkù',0.000,'',0.000,'0',0.000,'0',1,0,NULL,10.00000000,10.00000000,10.00000000,0.00000000,0.00000000,0.00000000,10.00000000,0,0,1,NULL,NULL,NULL,NULL,NULL,0.00000000,0.00000000,0.00000000,0.00000000),(3,2,NULL,NULL,0,NULL,'ddd',0.000,'',0.000,'0',0.000,'0',1,0,NULL,5.00000000,5.00000000,5.00000000,0.00000000,0.00000000,0.00000000,5.00000000,0,0,1,NULL,NULL,NULL,NULL,NULL,0.00000000,0.00000000,0.00000000,0.00000000); /*!40000 ALTER TABLE `llx_facturedet_rec` ENABLE KEYS */; UNLOCK TABLES; @@ -5742,7 +5745,7 @@ CREATE TABLE `llx_menu` ( PRIMARY KEY (`rowid`), UNIQUE KEY `idx_menu_uk_menu` (`menu_handler`,`fk_menu`,`position`,`url`,`entity`), KEY `idx_menu_menuhandler_type` (`menu_handler`,`type`) -) ENGINE=InnoDB AUTO_INCREMENT=145149 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=145152 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -5751,7 +5754,7 @@ CREATE TABLE `llx_menu` ( LOCK TABLES `llx_menu` WRITE; /*!40000 ALTER TABLE `llx_menu` DISABLE KEYS */; -INSERT INTO `llx_menu` VALUES (103094,'all',2,'agenda','top','agenda',0,NULL,NULL,100,'/comm/action/index.php','','Agenda','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103095,'all',2,'agenda','left','agenda',103094,NULL,NULL,100,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda','','Actions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103096,'all',2,'agenda','left','agenda',103095,NULL,NULL,101,'/comm/action/card.php?mainmenu=agenda&leftmenu=agenda&action=create','','NewAction','commercial',NULL,NULL,'($user->rights->agenda->myactions->create||$user->rights->agenda->allactions->create)','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103097,'all',2,'agenda','left','agenda',103095,NULL,NULL,102,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda','','Calendar','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103098,'all',2,'agenda','left','agenda',103097,NULL,NULL,103,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda&status=todo&filter=mine','','MenuToDoMyActions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103099,'all',2,'agenda','left','agenda',103097,NULL,NULL,104,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda&status=done&filter=mine','','MenuDoneMyActions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103100,'all',2,'agenda','left','agenda',103097,NULL,NULL,105,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda&status=todo','','MenuToDoActions','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$user->rights->agenda->allactions->read',2,'2013-03-13 15:29:19'),(103101,'all',2,'agenda','left','agenda',103097,NULL,NULL,106,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda&status=done','','MenuDoneActions','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$user->rights->agenda->allactions->read',2,'2013-03-13 15:29:19'),(103102,'all',2,'agenda','left','agenda',103095,NULL,NULL,112,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda','','List','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103103,'all',2,'agenda','left','agenda',103102,NULL,NULL,113,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda&status=todo&filter=mine','','MenuToDoMyActions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103104,'all',2,'agenda','left','agenda',103102,NULL,NULL,114,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda&status=done&filter=mine','','MenuDoneMyActions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103105,'all',2,'agenda','left','agenda',103102,NULL,NULL,115,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda&status=todo','','MenuToDoActions','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$user->rights->agenda->allactions->read',2,'2013-03-13 15:29:19'),(103106,'all',2,'agenda','left','agenda',103102,NULL,NULL,116,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda&status=done','','MenuDoneActions','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$user->rights->agenda->allactions->read',2,'2013-03-13 15:29:19'),(103107,'all',2,'agenda','left','agenda',103095,NULL,NULL,120,'/comm/action/rapport/index.php?mainmenu=agenda&leftmenu=agenda','','Reportings','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103108,'all',2,'pos','top','pos',0,NULL,NULL,100,'/pos/backend/listefac.php','','POS','pos@pos',NULL,'1','1','1',2,'2013-03-13 20:33:09'),(103109,'all',2,'pos','left','pos',103108,NULL,NULL,100,'/pos/backend/list.php','','Tickets','pos@pos',NULL,NULL,'$user->rights->pos->backend','$conf->global->POS_USE_TICKETS',0,'2013-03-13 20:33:09'),(103110,'all',2,'pos','left','pos',103109,NULL,NULL,100,'/pos/backend/list.php','','List','main',NULL,NULL,'$user->rights->pos->backend','$conf->global->POS_USE_TICKETS',0,'2013-03-13 20:33:09'),(103111,'all',2,'pos','left','pos',103110,NULL,NULL,100,'/pos/backend/list.php?viewstatut=0','','StatusTicketDraft','pos@pos',NULL,NULL,'$user->rights->pos->backend','$conf->global->POS_USE_TICKETS',0,'2013-03-13 20:33:09'),(103112,'all',2,'pos','left','@pos',103110,NULL,NULL,100,'/pos/backend/list.php?viewstatut=1','','StatusTicketClosed','main',NULL,NULL,'$user->rights->pos->backend','$conf->global->POS_USE_TICKETS',0,'2013-03-13 20:33:09'),(103113,'all',2,'pos','left','@pos',103110,NULL,NULL,100,'/pos/backend/list.php?viewstatut=2','','StatusTicketProcessed','main',NULL,NULL,'$user->rights->pos->backend','$conf->global->POS_USE_TICKETS',0,'2013-03-13 20:33:09'),(103114,'all',2,'pos','left','@pos',103110,NULL,NULL,100,'/pos/backend/list.php?viewtype=1','','StatusTicketReturned','main',NULL,NULL,'$user->rights->pos->backend','$conf->global->POS_USE_TICKETS',0,'2013-03-13 20:33:09'),(103115,'all',2,'pos','left','pos',103108,NULL,NULL,100,'/pos/backend/listefac.php','','Factures','pos@pos',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103116,'all',2,'pos','left','pos',103115,NULL,NULL,100,'/pos/backend/listefac.php','','List','main',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103117,'all',2,'pos','left','pos',103116,NULL,NULL,100,'/pos/backend/listefac.php?viewstatut=0','','BillStatusDraft','bills',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103118,'all',2,'pos','left','@pos',103116,NULL,NULL,100,'/pos/backend/listefac.php?viewstatut=1','','BillStatusValidated','bills',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103119,'all',2,'pos','left','@pos',103116,NULL,NULL,100,'/pos/backend/listefac.php?viewstatut=2&viewtype=0','','BillStatusPaid','bills',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103120,'all',2,'pos','left','@pos',103116,NULL,NULL,100,'/pos/backend/listefac.php?viewtype=2','','BillStatusReturned','main',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103121,'all',2,'pos','left','@pos',103108,NULL,NULL,100,'/pos/frontend/index.php','','POS','main',NULL,NULL,'$user->rights->pos->frontend','1',0,'2013-03-13 20:33:09'),(103122,'all',2,'pos','left','@pos',103121,NULL,NULL,100,'/pos/frontend/index.php','','NewTicket','main',NULL,NULL,'$user->rights->pos->frontend','1',0,'2013-03-13 20:33:09'),(103123,'all',2,'pos','left','@pos',103121,NULL,NULL,101,'/pos/backend/closes.php','','CloseandArching','main',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103124,'all',2,'pos','left','@pos',103108,NULL,NULL,100,'/pos/backend/terminal/cash.php','','Terminal','main',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103125,'all',2,'pos','left','@pos',103124,NULL,NULL,100,'/pos/backend/terminal/card.php?action=create','','NewCash','main',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103126,'all',2,'pos','left','@pos',103124,NULL,NULL,101,'/pos/backend/terminal/cash.php','','List','main',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103127,'all',2,'pos','left','@pos',103123,NULL,NULL,101,'/pos/backend/closes.php?viewstatut=0','','Arqueo','main',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103128,'all',2,'pos','left','@pos',103123,NULL,NULL,102,'/pos/backend/closes.php?viewstatut=1','','Closes','main',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103129,'all',2,'pos','left','@pos',103108,NULL,NULL,102,'/pos/backend/transfers.php','','Transfer','main',NULL,NULL,'$user->rights->pos->transfer','1',0,'2013-03-13 20:33:09'),(103130,'all',2,'pos','left','@pos',103108,NULL,NULL,102,'/pos/backend/resultat/index.php','','Rapport','main',NULL,NULL,'$user->rights->pos->stats','1',0,'2013-03-13 20:33:09'),(103131,'all',2,'pos','left','@pos',103130,NULL,NULL,102,'/pos/backend/resultat/casoc.php','','ReportsCustomer','main',NULL,NULL,'$user->rights->pos->stats','1',0,'2013-03-13 20:33:09'),(103132,'all',2,'pos','left','@pos',103130,NULL,NULL,102,'/pos/backend/resultat/causer.php','','ReportsUser','main',NULL,NULL,'$user->rights->pos->stats','1',0,'2013-03-13 20:33:09'),(103133,'all',2,'pos','left','@pos',103130,NULL,NULL,102,'/pos/backend/resultat/sellsjournal.php','','ReportsSells','main',NULL,NULL,'$user->rights->pos->stats','1',0,'2013-03-13 20:33:09'),(103134,'all',2,'opensurvey','top','opensurvey',0,NULL,NULL,200,'/opensurvey/index.php','','Surveys','opensurvey',NULL,NULL,'$user->rights->opensurvey->survey->read','$conf->opensurvey->enabled',0,'2013-03-13 20:33:42'),(103135,'all',2,'opensurvey','left','opensurvey',-1,NULL,'opensurvey',200,'/opensurvey/index.php?mainmenu=opensurvey&leftmenu=opensurvey','','Survey','opensurvey@opensurvey',NULL,'opensurvey','','$conf->opensurvey->enabled',0,'2013-03-13 20:33:42'),(103136,'all',2,'opensurvey','left','opensurvey',-1,'opensurvey','opensurvey',210,'/opensurvey/public/index.php','_blank','NewSurvey','opensurvey@opensurvey',NULL,'opensurvey_new','','$conf->opensurvey->enabled',0,'2013-03-13 20:33:42'),(103137,'all',2,'opensurvey','left','opensurvey',-1,'opensurvey','opensurvey',220,'/opensurvey/list.php','','List','opensurvey@opensurvey',NULL,'opensurvey_list','','$conf->opensurvey->enabled',0,'2013-03-13 20:33:42'),(124179,'all',1,'cashdesk','top','cashdesk',0,NULL,NULL,100,'/cashdesk/index.php?user=__LOGIN__','pointofsale','CashDeskMenu','cashdesk',NULL,NULL,'$user->rights->cashdesk->use','$conf->cashdesk->enabled',0,'2015-11-15 22:38:33'),(124210,'all',1,'margins','left','accountancy',-1,NULL,'accountancy',100,'/margin/index.php','','Margins','margins',NULL,'margins','$user->rights->margins->liretous','$conf->margin->enabled',2,'2015-11-15 22:41:47'),(134675,'all',1,'ecm','top','ecm',0,NULL,NULL,100,'/ecm/index.php','','MenuECM','ecm',NULL,NULL,'$user->rights->ecm->read || $user->rights->ecm->upload || $user->rights->ecm->setup','$conf->ecm->enabled',2,'2016-01-22 17:26:43'),(134676,'all',1,'ecm','left','ecm',-1,NULL,'ecm',101,'/ecm/index.php?mainmenu=ecm&leftmenu=ecm','','ECMArea','ecm',NULL,'ecm','$user->rights->ecm->read || $user->rights->ecm->upload','$user->rights->ecm->read || $user->rights->ecm->upload',2,'2016-01-22 17:26:43'),(134677,'all',1,'ecm','left','ecm',-1,'ecm','ecm',102,'/ecm/index.php?action=file_manager&mainmenu=ecm&leftmenu=ecm','','ECMSectionsManual','ecm',NULL,'ecm_manual','$user->rights->ecm->read || $user->rights->ecm->upload','$user->rights->ecm->read || $user->rights->ecm->upload',2,'2016-01-22 17:26:43'),(134678,'all',1,'ecm','left','ecm',-1,'ecm','ecm',103,'/ecm/index_auto.php?action=file_manager&mainmenu=ecm&leftmenu=ecm','','ECMSectionsAuto','ecm',NULL,NULL,'$user->rights->ecm->read || $user->rights->ecm->upload','$user->rights->ecm->read || $user->rights->ecm->upload',2,'2016-01-22 17:26:43'),(139885,'auguria',1,'','top','home',0,NULL,NULL,10,'/index.php?mainmenu=home&leftmenu=','','Home','',-1,'','','1',2,'2016-07-30 11:13:00'),(139886,'auguria',1,'societe|fournisseur','top','companies',0,NULL,NULL,20,'/societe/index.php?mainmenu=companies&leftmenu=','','ThirdParties','companies',-1,'','$user->rights->societe->lire || $user->rights->societe->contact->lire','( ! empty($conf->societe->enabled) && (empty($conf->global->SOCIETE_DISABLE_PROSPECTS) || empty($conf->global->SOCIETE_DISABLE_CUSTOMERS))) || ! empty($conf->fournisseur->enabled)',2,'2016-07-30 11:13:00'),(139887,'auguria',1,'product|service','top','products',0,NULL,NULL,30,'/product/index.php?mainmenu=products&leftmenu=','','Products/Services','products',-1,'','$user->rights->produit->lire||$user->rights->service->lire','$conf->product->enabled || $conf->service->enabled',0,'2016-07-30 11:13:00'),(139889,'auguria',1,'propal|commande|fournisseur|contrat|ficheinter','top','commercial',0,NULL,NULL,40,'/comm/index.php?mainmenu=commercial&leftmenu=','','Commercial','commercial',-1,'','$user->rights->societe->lire || $user->rights->societe->contact->lire','$conf->propal->enabled || $conf->commande->enabled || $conf->supplier_order->enabled || $conf->contrat->enabled || $conf->ficheinter->enabled',2,'2016-07-30 11:13:00'),(139890,'auguria',1,'comptabilite|accounting|facture|don|tax|salaries|loan','top','accountancy',0,NULL,NULL,50,'/compta/index.php?mainmenu=accountancy&leftmenu=','','MenuFinancial','compta',-1,'','$user->rights->compta->resultat->lire || $user->rights->accounting->plancompte->lire || $user->rights->facture->lire|| $user->rights->don->lire || $user->rights->tax->charges->lire || $user->rights->salaries->read || $user->rights->loan->read','$conf->comptabilite->enabled || $conf->accounting->enabled || $conf->facture->enabled || $conf->don->enabled || $conf->tax->enabled || $conf->salaries->enabled || $conf->supplier_invoice->enabled || $conf->loan->enabled',2,'2016-07-30 11:13:00'),(139891,'auguria',1,'projet','top','project',0,NULL,NULL,70,'/projet/index.php?mainmenu=project&leftmenu=','','Projects','projects',-1,'','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(139892,'auguria',1,'mailing|export|import|opensurvey|resource','top','tools',0,NULL,NULL,90,'/core/tools.php?mainmenu=tools&leftmenu=','','Tools','other',-1,'','$user->rights->mailing->lire || $user->rights->export->lire || $user->rights->import->run || $user->rights->opensurvey->read || $user->rights->resource->read','$conf->mailing->enabled || $conf->export->enabled || $conf->import->enabled || $conf->opensurvey->enabled || $conf->resource->enabled',2,'2016-07-30 11:13:00'),(139897,'auguria',1,'adherent','top','members',0,NULL,NULL,110,'/adherents/index.php?mainmenu=members&leftmenu=','','Members','members',-1,'','$user->rights->adherent->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(139898,'auguria',1,'banque|prelevement','top','bank',0,NULL,NULL,60,'/compta/bank/index.php?mainmenu=bank&leftmenu=bank','','MenuBankCash','banks',-1,'','$user->rights->banque->lire || $user->rights->prelevement->bons->lire','$conf->banque->enabled || $conf->prelevement->enabled',0,'2016-07-30 11:13:00'),(139899,'auguria',1,'hrm|holiday|deplacement|expensereport','top','hrm',0,NULL,NULL,80,'/hrm/hrm.php?mainmenu=hrm&leftmenu=','','HRM','holiday',-1,'','$user->rights->hrm->employee->read || $user->rights->holiday->write || $user->rights->deplacement->lire || $user->rights->expensereport->lire','$conf->hrm->enabled || $conf->holiday->enabled || $conf->deplacement->enabled || $conf->expensereport->enabled',0,'2016-07-30 11:13:00'),(139974,'auguria',1,'','left','home',139885,NULL,NULL,0,'/index.php','','Dashboard','',0,'','','1',2,'2016-07-30 11:13:00'),(139984,'auguria',1,'','left','home',139885,NULL,NULL,1,'/admin/index.php?leftmenu=setup','','Setup','admin',0,'setup','','$user->admin',2,'2016-07-30 11:13:00'),(139985,'auguria',1,'','left','home',139984,NULL,NULL,1,'/admin/company.php?leftmenu=setup','','MenuCompanySetup','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139986,'auguria',1,'','left','home',139984,NULL,NULL,4,'/admin/ihm.php?leftmenu=setup','','GUISetup','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139987,'auguria',1,'','left','home',139984,NULL,NULL,2,'/admin/modules.php?leftmenu=setup','','Modules','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139988,'auguria',1,'','left','home',139984,NULL,NULL,6,'/admin/boxes.php?leftmenu=setup','','Boxes','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139989,'auguria',1,'','left','home',139984,NULL,NULL,3,'/admin/menus.php?leftmenu=setup','','Menus','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139990,'auguria',1,'','left','home',139984,NULL,NULL,7,'/admin/delais.php?leftmenu=setup','','Alerts','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139991,'auguria',1,'','left','home',139984,NULL,NULL,10,'/admin/pdf.php?leftmenu=setup','','PDF','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139992,'auguria',1,'','left','home',139984,NULL,NULL,8,'/admin/security_other.php?leftmenu=setup','','Security','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139993,'auguria',1,'','left','home',139984,NULL,NULL,11,'/admin/mails.php?leftmenu=setup','','Emails','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139994,'auguria',1,'','left','home',139984,NULL,NULL,9,'/admin/limits.php?leftmenu=setup','','MenuLimits','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139995,'auguria',1,'','left','home',139984,NULL,NULL,13,'/admin/dict.php?leftmenu=setup','','Dictionary','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139996,'auguria',1,'','left','home',139984,NULL,NULL,14,'/admin/const.php?leftmenu=setup','','OtherSetup','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139997,'auguria',1,'','left','home',139984,NULL,NULL,12,'/admin/sms.php?leftmenu=setup','','SMS','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139998,'auguria',1,'','left','home',139984,NULL,NULL,4,'/admin/translation.php?leftmenu=setup','','Translation','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139999,'auguria',1,'','left','home',139984,NULL,NULL,4,'/accountancy/admin/fiscalyear.php?mainmenu=setup','','Fiscalyear','admin',1,'','','$leftmenu==\"setup\" && $conf->accounting->enabled',2,'2016-07-30 11:13:00'),(140085,'auguria',1,'','left','home',140184,NULL,NULL,0,'/admin/system/dolibarr.php?leftmenu=admintools','','InfoDolibarr','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140086,'auguria',1,'','left','home',140085,NULL,NULL,2,'/admin/system/modules.php?leftmenu=admintools','','Modules','admin',2,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140087,'auguria',1,'','left','home',140085,NULL,NULL,3,'/admin/triggers.php?leftmenu=admintools','','Triggers','admin',2,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140089,'auguria',1,'','left','home',140184,NULL,NULL,1,'/admin/system/browser.php?leftmenu=admintools','','InfoBrowser','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140090,'auguria',1,'','left','home',140184,NULL,NULL,2,'/admin/system/os.php?leftmenu=admintools','','InfoOS','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140091,'auguria',1,'','left','home',140184,NULL,NULL,3,'/admin/system/web.php?leftmenu=admintools','','InfoWebServer','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140092,'auguria',1,'','left','home',140184,NULL,NULL,4,'/admin/system/phpinfo.php?leftmenu=admintools','','InfoPHP','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140094,'auguria',1,'','left','home',140184,NULL,NULL,5,'/admin/system/database.php?leftmenu=admintools','','InfoDatabase','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140184,'auguria',1,'','left','home',139885,NULL,NULL,2,'/admin/tools/index.php?leftmenu=admintools','','AdminTools','admin',0,'admintools','','$user->admin',2,'2016-07-30 11:13:00'),(140185,'auguria',1,'','left','home',140184,NULL,NULL,6,'/admin/tools/dolibarr_export.php?leftmenu=admintools','','Backup','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140186,'auguria',1,'','left','home',140184,NULL,NULL,7,'/admin/tools/dolibarr_import.php?leftmenu=admintools','','Restore','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140189,'auguria',1,'','left','home',140184,NULL,NULL,8,'/admin/tools/update.php?leftmenu=admintools','','MenuUpgrade','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140190,'auguria',1,'','left','home',140184,NULL,NULL,9,'/admin/tools/eaccelerator.php?leftmenu=admintools','','EAccelerator','admin',1,'','','$leftmenu==\"admintools\" && function_exists(\"eaccelerator_info\")',2,'2016-07-30 11:13:00'),(140191,'auguria',1,'','left','home',140184,NULL,NULL,10,'/admin/tools/listevents.php?leftmenu=admintools','','Audit','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140192,'auguria',1,'','left','home',140184,NULL,NULL,11,'/admin/tools/listsessions.php?leftmenu=admintools','','Sessions','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140193,'auguria',1,'','left','home',140184,NULL,NULL,12,'/admin/tools/purge.php?leftmenu=admintools','','Purge','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140194,'auguria',1,'','left','home',140184,NULL,NULL,13,'/support/index.php?leftmenu=admintools','_blank','HelpCenter','help',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140195,'auguria',1,'','left','home',140184,NULL,NULL,14,'/admin/system/about.php?leftmenu=admintools','','About','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140204,'auguria',1,'','left','home',140184,NULL,NULL,0,'/product/admin/product_tools.php?mainmenu=home&leftmenu=admintools','','ProductVatMassChange','products',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140205,'auguria',1,'','left','home',140184,NULL,NULL,0,'/accountancy/admin/productaccount.php?mainmenu=home&leftmenu=admintools','','InitAccountancy','accountancy',1,'','','$leftmenu==\"admintools\" && $conf->accounting->enabled',2,'2016-07-30 11:13:00'),(140284,'auguria',1,'','left','home',139885,NULL,NULL,4,'/user/home.php?leftmenu=users','','MenuUsersAndGroups','users',0,'users','','1',2,'2016-07-30 11:13:00'),(140285,'auguria',1,'','left','home',140284,NULL,NULL,0,'/user/index.php?leftmenu=users','','Users','users',1,'','$user->rights->user->user->lire || $user->admin','$leftmenu==\"users\"',2,'2016-07-30 11:13:00'),(140286,'auguria',1,'','left','home',140285,NULL,NULL,0,'/user/card.php?leftmenu=users&action=create','','NewUser','users',2,'','$user->rights->user->user->creer || $user->admin','$leftmenu==\"users\"',2,'2016-07-30 11:13:00'),(140287,'auguria',1,'','left','home',140284,NULL,NULL,1,'/user/group/index.php?leftmenu=users','','Groups','users',1,'','($conf->global->MAIN_USE_ADVANCED_PERMS?$user->rights->user->group_advance->read:$user->rights->user->user->lire) || $user->admin','$leftmenu==\"users\"',2,'2016-07-30 11:13:00'),(140288,'auguria',1,'','left','home',140287,NULL,NULL,0,'/user/group/card.php?leftmenu=users&action=create','','NewGroup','users',2,'','($conf->global->MAIN_USE_ADVANCED_PERMS?$user->rights->user->group_advance->write:$user->rights->user->user->creer) || $user->admin','$leftmenu==\"users\"',2,'2016-07-30 11:13:00'),(140384,'auguria',1,'','left','companies',139886,NULL,NULL,0,'/societe/index.php?leftmenu=thirdparties','','ThirdParty','companies',0,'thirdparties','$user->rights->societe->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140385,'auguria',1,'','left','companies',140384,NULL,NULL,0,'/societe/soc.php?action=create','','MenuNewThirdParty','companies',1,'','$user->rights->societe->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140386,'auguria',1,'','left','companies',140384,NULL,NULL,0,'/societe/list.php?action=create','','List','companies',1,'','$user->rights->societe->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140387,'auguria',1,'','left','companies',140384,NULL,NULL,5,'/societe/list.php?type=f&leftmenu=suppliers','','ListSuppliersShort','suppliers',1,'','$user->rights->societe->lire && $user->rights->fournisseur->lire','$conf->societe->enabled && $conf->fournisseur->enabled',2,'2016-07-30 11:13:00'),(140388,'auguria',1,'','left','companies',140387,NULL,NULL,0,'/societe/soc.php?leftmenu=supplier&action=create&type=f','','NewSupplier','suppliers',2,'','$user->rights->societe->creer','$conf->societe->enabled && $conf->fournisseur->enabled',2,'2016-07-30 11:13:00'),(140390,'auguria',1,'','left','companies',140384,NULL,NULL,3,'/societe/list.php?type=p&leftmenu=prospects','','ListProspectsShort','companies',1,'','$user->rights->societe->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140391,'auguria',1,'','left','companies',140390,NULL,NULL,0,'/societe/soc.php?leftmenu=prospects&action=create&type=p','','MenuNewProspect','companies',2,'','$user->rights->societe->creer','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140393,'auguria',1,'','left','companies',140384,NULL,NULL,4,'/societe/list.php?type=c&leftmenu=customers','','ListCustomersShort','companies',1,'','$user->rights->societe->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140394,'auguria',1,'','left','companies',140393,NULL,NULL,0,'/societe/soc.php?leftmenu=customers&action=create&type=c','','MenuNewCustomer','companies',2,'','$user->rights->societe->creer','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140484,'auguria',1,'','left','companies',139886,NULL,NULL,1,'/contact/list.php?leftmenu=contacts','','ContactsAddresses','companies',0,'contacts','$user->rights->societe->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140485,'auguria',1,'','left','companies',140484,NULL,NULL,0,'/contact/card.php?leftmenu=contacts&action=create','','NewContactAddress','companies',1,'','$user->rights->societe->creer','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140486,'auguria',1,'','left','companies',140484,NULL,NULL,1,'/contact/list.php?leftmenu=contacts','','List','companies',1,'','$user->rights->societe->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140488,'auguria',1,'','left','companies',140486,NULL,NULL,1,'/contact/list.php?leftmenu=contacts&type=p','','ThirdPartyProspects','companies',2,'','$user->rights->societe->contact->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140489,'auguria',1,'','left','companies',140486,NULL,NULL,2,'/contact/list.php?leftmenu=contacts&type=c','','ThirdPartyCustomers','companies',2,'','$user->rights->societe->contact->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140490,'auguria',1,'','left','companies',140486,NULL,NULL,3,'/contact/list.php?leftmenu=contacts&type=f','','ThirdPartySuppliers','companies',2,'','$user->rights->societe->contact->lire','$conf->societe->enabled && $conf->fournisseur->enabled',2,'2016-07-30 11:13:00'),(140491,'auguria',1,'','left','companies',140486,NULL,NULL,4,'/contact/list.php?leftmenu=contacts&type=o','','Others','companies',2,'','$user->rights->societe->contact->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140534,'auguria',1,'','left','companies',139886,NULL,NULL,3,'/categories/index.php?leftmenu=cat&type=1','','SuppliersCategoriesShort','categories',0,'cat','$user->rights->categorie->lire','$conf->societe->enabled && $conf->categorie->enabled',2,'2016-07-30 11:13:00'),(140535,'auguria',1,'','left','companies',140534,NULL,NULL,0,'/categories/card.php?action=create&type=1','','NewCategory','categories',1,'','$user->rights->categorie->creer','$conf->societe->enabled && $conf->categorie->enabled',2,'2016-07-30 11:13:00'),(140544,'auguria',1,'','left','companies',139886,NULL,NULL,4,'/categories/index.php?leftmenu=cat&type=2','','CustomersProspectsCategoriesShort','categories',0,'cat','$user->rights->categorie->lire','$conf->fournisseur->enabled && $conf->categorie->enabled',2,'2016-07-30 11:13:00'),(140545,'auguria',1,'','left','companies',140544,NULL,NULL,0,'/categories/card.php?action=create&type=2','','NewCategory','categories',1,'','$user->rights->categorie->creer','$conf->fournisseur->enabled && $conf->categorie->enabled',2,'2016-07-30 11:13:00'),(140554,'auguria',1,'','left','companies',139886,NULL,NULL,3,'/categories/index.php?leftmenu=cat&type=4','','ContactCategoriesShort','categories',0,'cat','$user->rights->categorie->lire','$conf->societe->enabled && $conf->categorie->enabled',2,'2016-07-30 11:13:00'),(140555,'auguria',1,'','left','companies',140554,NULL,NULL,0,'/categories/card.php?action=create&type=4','','NewCategory','categories',1,'','$user->rights->categorie->creer','$conf->societe->enabled && $conf->categorie->enabled',2,'2016-07-30 11:13:00'),(140984,'auguria',1,'','left','commercial',139889,NULL,NULL,4,'/comm/propal/index.php?leftmenu=propals','','Prop','propal',0,'propals','$user->rights->propale->lire','$conf->propal->enabled',2,'2016-07-30 11:13:00'),(140985,'auguria',1,'','left','commercial',140984,NULL,NULL,0,'/comm/propal/card.php?action=create&leftmenu=propals','','NewPropal','propal',1,'','$user->rights->propale->creer','$conf->propal->enabled',2,'2016-07-30 11:13:00'),(140986,'auguria',1,'','left','commercial',140984,NULL,NULL,1,'/comm/propal/list.php?leftmenu=propals','','List','propal',1,'','$user->rights->propale->lire','$conf->propal->enabled',2,'2016-07-30 11:13:00'),(140987,'auguria',1,'','left','commercial',140986,NULL,NULL,2,'/comm/propal/list.php?leftmenu=propals&viewstatut=0','','PropalsDraft','propal',1,'','$user->rights->propale->lire','$conf->propal->enabled && $leftmenu==\"propals\"',2,'2016-07-30 11:13:00'),(140988,'auguria',1,'','left','commercial',140986,NULL,NULL,3,'/comm/propal/list.php?leftmenu=propals&viewstatut=1','','PropalsOpened','propal',1,'','$user->rights->propale->lire','$conf->propal->enabled && $leftmenu==\"propals\"',2,'2016-07-30 11:13:00'),(140989,'auguria',1,'','left','commercial',140986,NULL,NULL,4,'/comm/propal/list.php?leftmenu=propals&viewstatut=2','','PropalStatusSigned','propal',1,'','$user->rights->propale->lire','$conf->propal->enabled && $leftmenu==\"propals\"',2,'2016-07-30 11:13:00'),(140990,'auguria',1,'','left','commercial',140986,NULL,NULL,5,'/comm/propal/list.php?leftmenu=propals&viewstatut=3','','PropalStatusNotSigned','propal',1,'','$user->rights->propale->lire','$conf->propal->enabled && $leftmenu==\"propals\"',2,'2016-07-30 11:13:00'),(140991,'auguria',1,'','left','commercial',140986,NULL,NULL,6,'/comm/propal/list.php?leftmenu=propals&viewstatut=4','','PropalStatusBilled','propal',1,'','$user->rights->propale->lire','$conf->propal->enabled && $leftmenu==\"propals\"',2,'2016-07-30 11:13:00'),(140994,'auguria',1,'','left','commercial',140984,NULL,NULL,4,'/comm/propal/stats/index.php?leftmenu=propals','','Statistics','propal',1,'','$user->rights->propale->lire','$conf->propal->enabled',2,'2016-07-30 11:13:00'),(141084,'auguria',1,'','left','commercial',139889,NULL,NULL,5,'/commande/index.php?leftmenu=orders','','CustomersOrders','orders',0,'orders','$user->rights->commande->lire','$conf->commande->enabled',2,'2016-07-30 11:13:00'),(141085,'auguria',1,'','left','commercial',141084,NULL,NULL,0,'/commande/card.php?action=create&leftmenu=orders','','NewOrder','orders',1,'','$user->rights->commande->creer','$conf->commande->enabled',2,'2016-07-30 11:13:00'),(141086,'auguria',1,'','left','commercial',141084,NULL,NULL,1,'/commande/list.php?leftmenu=orders','','List','orders',1,'','$user->rights->commande->lire','$conf->commande->enabled',2,'2016-07-30 11:13:00'),(141087,'auguria',1,'','left','commercial',141086,NULL,NULL,2,'/commande/list.php?leftmenu=orders&viewstatut=0','','StatusOrderDraftShort','orders',1,'','$user->rights->commande->lire','$conf->commande->enabled && $leftmenu==\"orders\"',2,'2016-07-30 11:13:00'),(141088,'auguria',1,'','left','commercial',141086,NULL,NULL,3,'/commande/list.php?leftmenu=orders&viewstatut=1','','StatusOrderValidated','orders',1,'','$user->rights->commande->lire','$conf->commande->enabled && $leftmenu==\"orders\"',2,'2016-07-30 11:13:00'),(141089,'auguria',1,'','left','commercial',141086,NULL,NULL,4,'/commande/list.php?leftmenu=orders&viewstatut=2','','StatusOrderOnProcessShort','orders',1,'','$user->rights->commande->lire','$conf->commande->enabled && $leftmenu==\"orders\"',2,'2016-07-30 11:13:00'),(141090,'auguria',1,'','left','commercial',141086,NULL,NULL,5,'/commande/list.php?leftmenu=orders&viewstatut=3','','StatusOrderToBill','orders',1,'','$user->rights->commande->lire','$conf->commande->enabled && $leftmenu==\"orders\"',2,'2016-07-30 11:13:00'),(141091,'auguria',1,'','left','commercial',141086,NULL,NULL,6,'/commande/list.php?leftmenu=orders&viewstatut=4','','StatusOrderProcessed','orders',1,'','$user->rights->commande->lire','$conf->commande->enabled && $leftmenu==\"orders\"',2,'2016-07-30 11:13:00'),(141092,'auguria',1,'','left','commercial',141086,NULL,NULL,7,'/commande/list.php?leftmenu=orders&viewstatut=-1','','StatusOrderCanceledShort','orders',1,'','$user->rights->commande->lire','$conf->commande->enabled && $leftmenu==\"orders\"',2,'2016-07-30 11:13:00'),(141093,'auguria',1,'','left','commercial',141084,NULL,NULL,4,'/commande/stats/index.php?leftmenu=orders','','Statistics','orders',1,'','$user->rights->commande->lire','$conf->commande->enabled',2,'2016-07-30 11:13:00'),(141184,'auguria',1,'','left','commercial',139887,NULL,NULL,6,'/expedition/index.php?leftmenu=sendings','','Shipments','sendings',0,'sendings','$user->rights->expedition->lire','$conf->expedition->enabled',2,'2016-07-30 11:13:00'),(141185,'auguria',1,'','left','commercial',141184,NULL,NULL,0,'/expedition/card.php?action=create2&leftmenu=sendings','','NewSending','sendings',1,'','$user->rights->expedition->creer','$conf->expedition->enabled && $leftmenu==\"sendings\"',2,'2016-07-30 11:13:00'),(141186,'auguria',1,'','left','commercial',141184,NULL,NULL,1,'/expedition/list.php?leftmenu=sendings','','List','sendings',1,'','$user->rights->expedition->lire','$conf->expedition->enabled && $leftmenu==\"sendings\"',2,'2016-07-30 11:13:00'),(141187,'auguria',1,'','left','commercial',141184,NULL,NULL,2,'/expedition/stats/index.php?leftmenu=sendings','','Statistics','sendings',1,'','$user->rights->expedition->lire','$conf->expedition->enabled && $leftmenu==\"sendings\"',2,'2016-07-30 11:13:00'),(141284,'auguria',1,'','left','commercial',139889,NULL,NULL,7,'/contrat/index.php?leftmenu=contracts','','Contracts','contracts',0,'contracts','$user->rights->contrat->lire','$conf->contrat->enabled',2,'2016-07-30 11:13:00'),(141285,'auguria',1,'','left','commercial',141284,NULL,NULL,0,'/contrat/card.php?&action=create&leftmenu=contracts','','NewContract','contracts',1,'','$user->rights->contrat->creer','$conf->contrat->enabled',2,'2016-07-30 11:13:00'),(141286,'auguria',1,'','left','commercial',141284,NULL,NULL,1,'/contrat/list.php?leftmenu=contracts','','List','contracts',1,'','$user->rights->contrat->lire','$conf->contrat->enabled',2,'2016-07-30 11:13:00'),(141287,'auguria',1,'','left','commercial',141284,NULL,NULL,2,'/contrat/services.php?leftmenu=contracts','','MenuServices','contracts',1,'','$user->rights->contrat->lire','$conf->contrat->enabled',2,'2016-07-30 11:13:00'),(141288,'auguria',1,'','left','commercial',141287,NULL,NULL,0,'/contrat/services.php?leftmenu=contracts&mode=0','','MenuInactiveServices','contracts',2,'','$user->rights->contrat->lire','$conf->contrat->enabled&&$leftmenu==\"contracts\"',2,'2016-07-30 11:13:00'),(141289,'auguria',1,'','left','commercial',141287,NULL,NULL,1,'/contrat/services.php?leftmenu=contracts&mode=4','','MenuRunningServices','contracts',2,'','$user->rights->contrat->lire','$conf->contrat->enabled&&$leftmenu==\"contracts\"',2,'2016-07-30 11:13:00'),(141290,'auguria',1,'','left','commercial',141287,NULL,NULL,2,'/contrat/services.php?leftmenu=contracts&mode=4&filter=expired','','MenuExpiredServices','contracts',2,'','$user->rights->contrat->lire','$conf->contrat->enabled&&$leftmenu==\"contracts\"',2,'2016-07-30 11:13:00'),(141291,'auguria',1,'','left','commercial',141287,NULL,NULL,3,'/contrat/services.php?leftmenu=contracts&mode=5','','MenuClosedServices','contracts',2,'','$user->rights->contrat->lire','$conf->contrat->enabled&&$leftmenu==\"contracts\"',2,'2016-07-30 11:13:00'),(141384,'auguria',1,'','left','commercial',139889,NULL,NULL,8,'/fichinter/list.php?leftmenu=ficheinter','','Interventions','interventions',0,'ficheinter','$user->rights->ficheinter->lire','$conf->ficheinter->enabled',2,'2016-07-30 11:13:00'),(141385,'auguria',1,'','left','commercial',141384,NULL,NULL,0,'/fichinter/card.php?action=create&leftmenu=ficheinter','','NewIntervention','interventions',1,'','$user->rights->ficheinter->creer','$conf->ficheinter->enabled',2,'2016-07-30 11:13:00'),(141386,'auguria',1,'','left','commercial',141384,NULL,NULL,1,'/fichinter/list.php?leftmenu=ficheinter','','List','interventions',1,'','$user->rights->ficheinter->lire','$conf->ficheinter->enabled',2,'2016-07-30 11:13:00'),(141387,'auguria',1,'','left','commercial',141384,NULL,NULL,2,'/fichinter/stats/index.php?leftmenu=ficheinter','','Statistics','interventions',1,'','$user->rights->ficheinter->lire','$conf->ficheinter->enabled',2,'2016-07-30 11:13:00'),(141484,'auguria',1,'','left','accountancy',139890,NULL,NULL,3,'/fourn/facture/list.php?leftmenu=suppliers_bills','','BillsSuppliers','bills',0,'supplier_bills','$user->rights->fournisseur->facture->lire','$conf->supplier_invoice->enabled',2,'2016-07-30 11:13:00'),(141485,'auguria',1,'','left','accountancy',141484,NULL,NULL,0,'/fourn/facture/card.php?action=create&leftmenu=suppliers_bills','','NewBill','bills',1,'','$user->rights->fournisseur->facture->creer','$conf->supplier_invoice->enabled',2,'2016-07-30 11:13:00'),(141486,'auguria',1,'','left','accountancy',141484,NULL,NULL,1,'/fourn/facture/impayees.php?leftmenu=suppliers_bills','','Unpaid','bills',1,'','$user->rights->fournisseur->facture->lire','$conf->supplier_invoice->enabled',2,'2016-07-30 11:13:00'),(141487,'auguria',1,'','left','accountancy',141484,NULL,NULL,2,'/fourn/facture/paiement.php?leftmenu=suppliers_bills','','Payments','bills',1,'','$user->rights->fournisseur->facture->lire','$conf->supplier_invoice->enabled',2,'2016-07-30 11:13:00'),(141488,'auguria',1,'','left','accountancy',141484,NULL,NULL,8,'/compta/facture/stats/index.php?leftmenu=customers_bills&mode=supplier','','Statistics','bills',1,'','$user->rights->fournisseur->facture->lire','$conf->supplier_invoice->enabled',2,'2016-07-30 11:13:00'),(141584,'auguria',1,'','left','accountancy',139890,NULL,NULL,3,'/compta/facture/list.php?leftmenu=customers_bills','','BillsCustomers','bills',0,'customer_bills','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141585,'auguria',1,'','left','accountancy',141584,NULL,NULL,3,'/compta/facture.php?action=create&leftmenu=customers_bills','','NewBill','bills',1,'','$user->rights->facture->creer','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141586,'auguria',1,'','left','accountancy',141584,NULL,NULL,5,'/compta/facture/fiche-rec.php?leftmenu=customers_bills','','ListOfTemplates','bills',1,'','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141588,'auguria',1,'','left','accountancy',141584,NULL,NULL,6,'/compta/paiement/list.php?leftmenu=customers_bills','','Payments','bills',1,'','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141589,'auguria',1,'','left','accountancy',141584,NULL,NULL,4,'/compta/facture/list.php?leftmenu=customers_bills','','List','bills',1,'','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141594,'auguria',1,'','left','accountancy',141588,NULL,NULL,1,'/compta/paiement/rapport.php?leftmenu=customers_bills','','Reportings','bills',2,'','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141595,'auguria',1,'','left','accountancy',139898,NULL,NULL,9,'/compta/paiement/cheque/index.php?leftmenu=checks&mainmenu=bank','','MenuChequeDeposits','bills',0,'checks','$user->rights->banque->lire','empty($conf->global->BANK_DISABLE_CHECK_DEPOSIT) && ! empty($conf->banque->enabled) && (! empty($conf->facture->enabled) || ! empty($conf->global->MAIN_MENU_CHEQUE_DEPOSIT_ON))',2,'2016-07-30 11:13:00'),(141596,'auguria',1,'','left','accountancy',141595,NULL,NULL,0,'/compta/paiement/cheque/card.php?leftmenu=checks&action=new','','NewCheckDeposit','compta',1,'','$user->rights->banque->lire','empty($conf->global->BANK_DISABLE_CHECK_DEPOSIT) && ! empty($conf->banque->enabled) && (! empty($conf->facture->enabled) || ! empty($conf->global->MAIN_MENU_CHEQUE_DEPOSIT_ON))',2,'2016-07-30 11:13:00'),(141597,'auguria',1,'','left','accountancy',141595,NULL,NULL,1,'/compta/paiement/cheque/list.php?leftmenu=checks','','List','bills',1,'','$user->rights->banque->lire','empty($conf->global->BANK_DISABLE_CHECK_DEPOSIT) && ! empty($conf->banque->enabled) && (! empty($conf->facture->enabled) || ! empty($conf->global->MAIN_MENU_CHEQUE_DEPOSIT_ON))',2,'2016-07-30 11:13:00'),(141598,'auguria',1,'','left','accountancy',141584,NULL,NULL,8,'/compta/facture/stats/index.php?leftmenu=customers_bills','','Statistics','bills',1,'','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141604,'auguria',1,'','left','accountancy',141589,NULL,NULL,1,'/compta/facture/list.php?leftmenu=customers_bills&search_status=0','','BillShortStatusDraft','bills',2,'','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141605,'auguria',1,'','left','accountancy',141589,NULL,NULL,2,'/compta/facture/list.php?leftmenu=customers_bills&search_status=1','','BillShortStatusNotPaid','bills',2,'','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141606,'auguria',1,'','left','accountancy',141589,NULL,NULL,3,'/compta/facture/list.php?leftmenu=customers_bills&search_status=2','','BillShortStatusPaid','bills',2,'','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141607,'auguria',1,'','left','accountancy',141589,NULL,NULL,4,'/compta/facture/list.php?leftmenu=customers_bills&search_status=3','','BillShortStatusCanceled','bills',2,'','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141784,'auguria',1,'','left','accountancy',139890,NULL,NULL,3,'/commande/list.php?leftmenu=orders&viewstatut=3','','MenuOrdersToBill','orders',0,'orders','$user->rights->commande->lire','$conf->commande->enabled',0,'2016-07-30 11:13:00'),(141884,'auguria',1,'','left','accountancy',139890,NULL,NULL,4,'/don/index.php?leftmenu=donations&mainmenu=accountancy','','Donations','donations',0,'donations','$user->rights->don->lire','$conf->don->enabled',2,'2016-07-30 11:13:00'),(141885,'auguria',1,'','left','accountancy',141884,NULL,NULL,0,'/don/card.php?leftmenu=donations&mainmenu=accountancy&action=create','','NewDonation','donations',1,'','$user->rights->don->creer','$conf->don->enabled && $leftmenu==\"donations\"',2,'2016-07-30 11:13:00'),(141886,'auguria',1,'','left','accountancy',141884,NULL,NULL,1,'/don/list.php?leftmenu=donations&mainmenu=accountancy','','List','donations',1,'','$user->rights->don->lire','$conf->don->enabled && $leftmenu==\"donations\"',2,'2016-07-30 11:13:00'),(141984,'auguria',1,'','left','accountancy',139899,NULL,NULL,5,'/compta/deplacement/index.php?leftmenu=tripsandexpenses','','TripsAndExpenses','trips',0,'tripsandexpenses','$user->rights->deplacement->lire','$conf->deplacement->enabled',0,'2016-07-30 11:13:00'),(141985,'auguria',1,'','left','accountancy',141984,NULL,NULL,1,'/compta/deplacement/card.php?action=create&leftmenu=tripsandexpenses','','New','trips',1,'','$user->rights->deplacement->creer','$conf->deplacement->enabled',0,'2016-07-30 11:13:00'),(141986,'auguria',1,'','left','accountancy',141984,NULL,NULL,2,'/compta/deplacement/list.php?leftmenu=tripsandexpenses','','List','trips',1,'','$user->rights->deplacement->lire','$conf->deplacement->enabled',0,'2016-07-30 11:13:00'),(141987,'auguria',1,'','left','accountancy',141984,NULL,NULL,2,'/compta/deplacement/stats/index.php?leftmenu=tripsandexpenses','','Statistics','trips',1,'','$user->rights->deplacement->lire','$conf->deplacement->enabled',0,'2016-07-30 11:13:00'),(142084,'auguria',1,'','left','accountancy',139890,NULL,NULL,6,'/compta/charges/index.php?leftmenu=tax&mainmenu=accountancy','','MenuSpecialExpenses','compta',0,'tax','(! empty($conf->tax->enabled) && $user->rights->tax->charges->lire) || (! empty($conf->salaries->enabled) && $user->rights->salaries->read)','$conf->tax->enabled || $conf->salaries->enabled',0,'2016-07-30 11:13:00'),(142094,'auguria',1,'','left','accountancy',142084,NULL,NULL,1,'/compta/salaries/index.php?leftmenu=tax_salary&mainmenu=accountancy','','Salaries','salaries',1,'tax_sal','$user->rights->salaries->read','$conf->salaries->enabled',0,'2016-07-30 11:13:00'),(142095,'auguria',1,'','left','accountancy',142094,NULL,NULL,2,'/compta/salaries/card.php?leftmenu=tax_salary&action=create','','NewPayment','companies',2,'','$user->rights->salaries->write','$conf->salaries->enabled && $leftmenu==\"tax_salary\"',0,'2016-07-30 11:13:00'),(142096,'auguria',1,'','left','accountancy',142094,NULL,NULL,3,'/compta/salaries/index.php?leftmenu=tax_salary','','Payments','companies',2,'','$user->rights->salaries->read','$conf->salaries->enabled && $leftmenu==\"tax_salary\"',0,'2016-07-30 11:13:00'),(142104,'auguria',1,'','left','accountancy',142084,NULL,NULL,1,'/loan/index.php?leftmenu=tax_loan&mainmenu=accountancy','','Loans','loan',1,'tax_loan','$user->rights->loan->read','$conf->loan->enabled',0,'2016-07-30 11:13:00'),(142105,'auguria',1,'','left','accountancy',142104,NULL,NULL,2,'/loan/card.php?leftmenu=tax_loan&action=create','','NewLoan','loan',2,'','$user->rights->loan->write','$conf->loan->enabled && $leftmenu==\"tax_loan\"',0,'2016-07-30 11:13:00'),(142107,'auguria',1,'','left','accountancy',142104,NULL,NULL,4,'/loan/calc.php?leftmenu=tax_loan','','Calculator','companies',2,'','$user->rights->loan->calc','$conf->loan->enabled && $leftmenu==\"tax_loan\" && ! empty($conf->global->LOAN_SHOW_CALCULATOR)',0,'2016-07-30 11:13:00'),(142134,'auguria',1,'','left','accountancy',142084,NULL,NULL,1,'/compta/sociales/index.php?leftmenu=tax_social','','SocialContributions','',1,'tax_social','$user->rights->tax->charges->lire','$conf->tax->enabled',0,'2016-07-30 11:13:00'),(142135,'auguria',1,'','left','accountancy',142134,NULL,NULL,2,'/compta/sociales/charges.php?leftmenu=tax_social&action=create','','MenuNewSocialContribution','',2,'','$user->rights->tax->charges->creer','$conf->tax->enabled && $leftmenu==\"tax_social\"',0,'2016-07-30 11:13:00'),(142136,'auguria',1,'','left','accountancy',142134,NULL,NULL,3,'/compta/charges/index.php?leftmenu=tax_social&mainmenu=accountancy&mode=sconly','','Payments','',2,'','$user->rights->tax->charges->lire','$conf->tax->enabled && $leftmenu==\"tax_social\"',0,'2016-07-30 11:13:00'),(142184,'auguria',1,'','left','accountancy',142084,NULL,NULL,7,'/compta/tva/index.php?leftmenu=tax_vat&mainmenu=accountancy','','VAT','companies',1,'tax_vat','$user->rights->tax->charges->lire','$conf->tax->enabled && empty($conf->global->TAX_DISABLE_VAT_MENUS)',0,'2016-07-30 11:13:00'),(142185,'auguria',1,'','left','accountancy',142184,NULL,NULL,0,'/compta/tva/card.php?leftmenu=tax_vat&action=create','','New','companies',2,'','$user->rights->tax->charges->creer','$conf->tax->enabled && empty($conf->global->TAX_DISABLE_VAT_MENUS) && $leftmenu==\"tax_vat\"',0,'2016-07-30 11:13:00'),(142186,'auguria',1,'','left','accountancy',142184,NULL,NULL,1,'/compta/tva/reglement.php?leftmenu=tax_vat','','List','companies',2,'','$user->rights->tax->charges->lire','$conf->tax->enabled && empty($conf->global->TAX_DISABLE_VAT_MENUS) && $leftmenu==\"tax_vat\"',0,'2016-07-30 11:13:00'),(142187,'auguria',1,'','left','accountancy',142184,NULL,NULL,2,'/compta/tva/clients.php?leftmenu=tax_vat','','ReportByCustomers','companies',2,'','$user->rights->tax->charges->lire','$conf->tax->enabled && empty($conf->global->TAX_DISABLE_VAT_MENUS) && $leftmenu==\"tax_vat\"',0,'2016-07-30 11:13:00'),(142188,'auguria',1,'','left','accountancy',142184,NULL,NULL,3,'/compta/tva/quadri_detail.php?leftmenu=tax_vat','','ReportByQuarter','companies',2,'','$user->rights->tax->charges->lire','$conf->tax->enabled && empty($conf->global->TAX_DISABLE_VAT_MENUS) && $leftmenu==\"tax_vat\"',0,'2016-07-30 11:13:00'),(142284,'auguria',1,'','left','accountancy',139890,NULL,NULL,7,'/accountancy/customer/index.php?leftmenu=accounting','','MenuAccountancy','accountancy',0,'accounting','! empty($conf->accounting->enabled) || $user->rights->accounting->ventilation->read || $user->rights->accounting->ventilation->dispatch || $user->rights->compta->resultat->lire','$conf->accounting->enabled',0,'2016-07-30 11:13:00'),(142285,'auguria',1,'','left','accountancy',142284,NULL,NULL,1,'/accountancy/customer/index.php?leftmenu=dispatch_customer','','CustomersVentilation','accountancy',1,'dispatch_customer','$user->rights->accounting->ventilation->read','$conf->accounting->enabled',0,'2016-07-30 11:13:00'),(142286,'auguria',1,'','left','accountancy',142285,NULL,NULL,2,'/accountancy/customer/list.php','','ToDispatch','accountancy',2,'','$user->rights->accounting->ventilation->dispatch','$conf->accounting->enabled && $leftmenu==\"dispatch_customer\"',0,'2016-07-30 11:13:00'),(142287,'auguria',1,'','left','accountancy',142285,NULL,NULL,3,'/accountancy/customer/lines.php','','Dispatched','accountancy',2,'','$user->rights->accounting->ventilation->read','$conf->accounting->enabled && $leftmenu==\"dispatch_customer\"',0,'2016-07-30 11:13:00'),(142294,'auguria',1,'','left','accountancy',142284,NULL,NULL,4,'/accountancy/supplier/index.php?leftmenu=dispatch_supplier','','SuppliersVentilation','accountancy',1,'ventil_supplier','$user->rights->accounting->ventilation->read','$conf->accounting->enabled && $conf->fournisseur->enabled',0,'2016-07-30 11:13:00'),(142295,'auguria',1,'','left','accountancy',142294,NULL,NULL,5,'/accountancy/supplier/list.php','','ToDispatch','accountancy',2,'','$user->rights->accounting->ventilation->dispatch','$conf->accounting->enabled && $conf->fournisseur->enabled && $leftmenu==\"dispatch_supplier\"',0,'2016-07-30 11:13:00'),(142296,'auguria',1,'','left','accountancy',142294,NULL,NULL,6,'/accountancy/supplier/lines.php','','Dispatched','accountancy',2,'','$user->rights->accounting->ventilation->read','$conf->accounting->enabled && $conf->fournisseur->enabled && $leftmenu==\"dispatch_supplier\"',0,'2016-07-30 11:13:00'),(142314,'auguria',1,'','left','accountancy',142284,NULL,NULL,15,'/accountancy/bookkeeping/list.php','','Bookkeeping','accountancy',1,'bookkeeping','$user->rights->accounting->mouvements->lire','$conf->accounting->enabled',0,'2016-07-30 11:13:00'),(142319,'auguria',1,'','left','accountancy',142284,NULL,NULL,16,'/accountancy/bookkeeping/balance.php','','AccountBalance','accountancy',1,'balance','$user->rights->accounting->mouvements->lire','$conf->accounting->enabled',0,'2016-07-30 11:13:00'),(142324,'auguria',1,'','left','accountancy',142284,NULL,NULL,17,'/accountancy/report/result.php?leftmenu=ca&mainmenu=accountancy','','Reportings','main',1,'report','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->accounting->enabled',0,'2016-07-30 11:13:00'),(142325,'auguria',1,'','left','accountancy',142324,NULL,NULL,18,'/accountancy/report/result.php?leftmenu=ca','','ReportInOut','main',2,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->accounting->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142326,'auguria',1,'','left','accountancy',142324,NULL,NULL,19,'/compta/resultat/index.php?leftmenu=ca','','ByExpenseIncome','main',3,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->accounting->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142327,'auguria',1,'','left','accountancy',142324,NULL,NULL,20,'/compta/resultat/clientfourn.php?leftmenu=ca','','ByCompanies','main',3,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->accounting->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142328,'auguria',1,'','left','accountancy',142324,NULL,NULL,21,'/compta/stats/index.php?leftmenu=ca','','ReportTurnover','main',2,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->accounting->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142329,'auguria',1,'','left','accountancy',142324,NULL,NULL,22,'/compta/stats/casoc.php?leftmenu=ca','','ByCompanies','main',3,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->accounting->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142330,'auguria',1,'','left','accountancy',142324,NULL,NULL,23,'/compta/stats/cabyuser.php?leftmenu=ca','','ByUsers','main',3,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->accounting->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142331,'auguria',1,'','left','accountancy',142324,NULL,NULL,24,'/compta/stats/cabyprodserv.php?leftmenu=ca','','ByProductsAndServices','main',3,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->accounting->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142335,'auguria',1,'','left','home',142284,NULL,NULL,25,'/accountancy/admin/account.php?mainmenu=accountancy','','Chartofaccounts','admin',1,'','$user->rights->accounting->chartofaccount','$conf->accounting->enabled',0,'2016-07-30 11:13:00'),(142384,'auguria',1,'','left','accountancy',139898,NULL,NULL,9,'/compta/prelevement/index.php?leftmenu=withdraw&mainmenu=bank','','StandingOrders','withdrawals',0,'withdraw','$user->rights->prelevement->bons->lire','$conf->prelevement->enabled',2,'2016-07-30 11:13:00'),(142386,'auguria',1,'','left','accountancy',142384,NULL,NULL,0,'/compta/prelevement/create.php?leftmenu=withdraw','','NewStandingOrder','withdrawals',1,'','$user->rights->prelevement->bons->lire','$conf->prelevement->enabled && $leftmenu==\"withdraw\"',2,'2016-07-30 11:13:00'),(142387,'auguria',1,'','left','accountancy',142384,NULL,NULL,2,'/compta/prelevement/bons.php?leftmenu=withdraw','','WithdrawalsReceipts','withdrawals',1,'','$user->rights->prelevement->bons->lire','$conf->prelevement->enabled && $leftmenu==\"withdraw\"',2,'2016-07-30 11:13:00'),(142388,'auguria',1,'','left','accountancy',142384,NULL,NULL,3,'/compta/prelevement/list.php?leftmenu=withdraw','','WithdrawalsLines','withdrawals',1,'','$user->rights->prelevement->bons->lire','$conf->prelevement->enabled && $leftmenu==\"withdraw\"',2,'2016-07-30 11:13:00'),(142390,'auguria',1,'','left','accountancy',142384,NULL,NULL,5,'/compta/prelevement/rejets.php?leftmenu=withdraw','','Rejects','withdrawals',1,'','$user->rights->prelevement->bons->lire','$conf->prelevement->enabled && $leftmenu==\"withdraw\"',2,'2016-07-30 11:13:00'),(142391,'auguria',1,'','left','accountancy',142384,NULL,NULL,6,'/compta/prelevement/stats.php?leftmenu=withdraw','','Statistics','withdrawals',1,'','$user->rights->prelevement->bons->lire','$conf->prelevement->enabled && $leftmenu==\"withdraw\"',2,'2016-07-30 11:13:00'),(142484,'auguria',1,'','left','accountancy',139898,NULL,NULL,1,'/compta/bank/index.php?leftmenu=bank&mainmenu=bank','','MenuBankCash','banks',0,'bank','$user->rights->banque->lire','$conf->banque->enabled',0,'2016-07-30 11:13:00'),(142485,'auguria',1,'','left','accountancy',142484,NULL,NULL,0,'/compta/bank/card.php?action=create&leftmenu=bank','','MenuNewFinancialAccount','banks',1,'','$user->rights->banque->configurer','$conf->banque->enabled && ($leftmenu==\"bank\" || $leftmenu==\"checks\" || $leftmenu==\"withdraw\")',0,'2016-07-30 11:13:00'),(142487,'auguria',1,'','left','accountancy',142484,NULL,NULL,2,'/compta/bank/search.php?leftmenu=bank','','ListTransactions','banks',1,'','$user->rights->banque->lire','$conf->banque->enabled && ($leftmenu==\"bank\" || $leftmenu==\"checks\" || $leftmenu==\"withdraw\")',0,'2016-07-30 11:13:00'),(142488,'auguria',1,'','left','accountancy',142484,NULL,NULL,3,'/compta/bank/budget.php?leftmenu=bank','','ListTransactionsByCategory','banks',1,'','$user->rights->banque->lire','$conf->banque->enabled && ($leftmenu==\"bank\" || $leftmenu==\"checks\" || $leftmenu==\"withdraw\")',0,'2016-07-30 11:13:00'),(142490,'auguria',1,'','left','accountancy',142484,NULL,NULL,5,'/compta/bank/virement.php?leftmenu=bank','','BankTransfers','banks',1,'','$user->rights->banque->transfer','$conf->banque->enabled && ($leftmenu==\"bank\" || $leftmenu==\"checks\" || $leftmenu==\"withdraw\")',0,'2016-07-30 11:13:00'),(142534,'auguria',1,'','left','accountancy',139898,NULL,NULL,4,'/categories/index.php?leftmenu=cat&type=5','','Categories','categories',0,'cat','$user->rights->categorie->lire','$conf->categorie->enabled',2,'2016-07-30 11:13:00'),(142535,'auguria',1,'','left','accountancy',142534,NULL,NULL,0,'/categories/card.php?action=create&type=5','','NewCategory','categories',1,'','$user->rights->categorie->creer','$conf->categorie->enabled',2,'2016-07-30 11:13:00'),(142584,'auguria',1,'','left','accountancy',139890,NULL,NULL,11,'/compta/resultat/index.php?leftmenu=ca&mainmenu=accountancy','','Reportings','main',0,'ca','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->comptabilite->enabled',0,'2016-07-30 11:13:00'),(142585,'auguria',1,'','left','accountancy',142584,NULL,NULL,0,'/compta/resultat/index.php?leftmenu=ca','','ReportInOut','main',1,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->comptabilite->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142586,'auguria',1,'','left','accountancy',142585,NULL,NULL,0,'/compta/resultat/clientfourn.php?leftmenu=ca','','ByCompanies','main',2,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->comptabilite->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142587,'auguria',1,'','left','accountancy',142584,NULL,NULL,1,'/compta/stats/index.php?leftmenu=ca','','ReportTurnover','main',1,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->comptabilite->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142588,'auguria',1,'','left','accountancy',142587,NULL,NULL,0,'/compta/stats/casoc.php?leftmenu=ca','','ByCompanies','main',2,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->comptabilite->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142589,'auguria',1,'','left','accountancy',142587,NULL,NULL,1,'/compta/stats/cabyuser.php?leftmenu=ca','','ByUsers','main',2,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->comptabilite->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142590,'auguria',1,'','left','accountancy',142584,NULL,NULL,1,'/compta/journal/sellsjournal.php?leftmenu=ca','','SellsJournal','main',1,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->comptabilite->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142591,'auguria',1,'','left','accountancy',142584,NULL,NULL,1,'/compta/journal/purchasesjournal.php?leftmenu=ca','','PurchasesJournal','main',1,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->comptabilite->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142592,'auguria',1,'','left','accountancy',142587,NULL,NULL,1,'/compta/stats/cabyprodserv.php?leftmenu=ca','','ByProductsAndServices','main',2,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->comptabilite->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142684,'auguria',1,'','left','products',139887,NULL,NULL,0,'/product/index.php?leftmenu=product&type=0','','Products','products',0,'product','$user->rights->produit->lire','$conf->product->enabled',2,'2016-07-30 11:13:00'),(142685,'auguria',1,'','left','products',142684,NULL,NULL,0,'/product/card.php?leftmenu=product&action=create&type=0','','NewProduct','products',1,'','$user->rights->produit->creer','$conf->product->enabled',2,'2016-07-30 11:13:00'),(142686,'auguria',1,'','left','products',142684,NULL,NULL,1,'/product/list.php?leftmenu=product&type=0','','List','products',1,'','$user->rights->produit->lire','$conf->product->enabled',2,'2016-07-30 11:13:00'),(142687,'auguria',1,'','left','products',142684,NULL,NULL,4,'/product/reassort.php?type=0','','Stocks','products',1,'','$user->rights->produit->lire && $user->rights->stock->lire','$conf->product->enabled',2,'2016-07-30 11:13:00'),(142688,'auguria',1,'','left','products',142684,NULL,NULL,6,'/product/stats/card.php?id=all&leftmenu=stats&type=0','','Statistics','main',1,'','$user->rights->produit->lire','$conf->propal->enabled',2,'2016-07-30 11:13:00'),(142689,'auguria',1,'','left','products',142684,NULL,NULL,5,'/product/reassortlot.php?type=0','','StocksByLotSerial','products',1,'','$user->rights->produit->lire && $user->rights->stock->lire','$conf->productbatch->enabled',2,'2016-07-30 11:13:00'),(142784,'auguria',1,'','left','products',139887,NULL,NULL,1,'/product/index.php?leftmenu=service&type=1','','Services','products',0,'service','$user->rights->service->lire','$conf->service->enabled',2,'2016-07-30 11:13:00'),(142785,'auguria',1,'','left','products',142784,NULL,NULL,0,'/product/card.php?leftmenu=service&action=create&type=1','','NewService','products',1,'','$user->rights->service->creer','$conf->service->enabled',2,'2016-07-30 11:13:00'),(142786,'auguria',1,'','left','products',142784,NULL,NULL,1,'/product/list.php?leftmenu=service&type=1','','List','products',1,'','$user->rights->service->lire','$conf->service->enabled',2,'2016-07-30 11:13:00'),(142787,'auguria',1,'','left','products',142784,NULL,NULL,5,'/product/stats/card.php?id=all&leftmenu=stats&type=1','','Statistics','main',1,'','$user->rights->service->lire','$conf->propal->enabled',2,'2016-07-30 11:13:00'),(142984,'auguria',1,'','left','products',139887,NULL,NULL,3,'/product/stock/index.php?leftmenu=stock','','Stock','stocks',0,'stock','$user->rights->stock->lire','$conf->stock->enabled',2,'2016-07-30 11:13:00'),(142985,'auguria',1,'','left','products',142984,NULL,NULL,0,'/product/stock/card.php?action=create','','MenuNewWarehouse','stocks',1,'','$user->rights->stock->creer','$conf->stock->enabled',2,'2016-07-30 11:13:00'),(142986,'auguria',1,'','left','products',142984,NULL,NULL,1,'/product/stock/list.php','','List','stocks',1,'','$user->rights->stock->lire','$conf->stock->enabled',2,'2016-07-30 11:13:00'),(142988,'auguria',1,'','left','products',142984,NULL,NULL,3,'/product/stock/mouvement.php','','Movements','stocks',1,'','$user->rights->stock->mouvement->lire','$conf->stock->enabled',2,'2016-07-30 11:13:00'),(142989,'auguria',1,'','left','products',142984,NULL,NULL,4,'/product/stock/replenish.php','','Replenishments','stocks',1,'','$user->rights->stock->mouvement->creer && $user->rights->fournisseur->lire','$conf->stock->enabled && $conf->supplier_order->enabled',2,'2016-07-30 11:13:00'),(142990,'auguria',1,'','left','products',142984,NULL,NULL,5,'/product/stock/massstockmove.php','','MassStockTransferShort','stocks',1,'','$user->rights->stock->mouvement->creer','$conf->stock->enabled',2,'2016-07-30 11:13:00'),(143084,'auguria',1,'','left','products',139887,NULL,NULL,4,'/categories/index.php?leftmenu=cat&type=0','','Categories','categories',0,'cat','$user->rights->categorie->lire','$conf->categorie->enabled',2,'2016-07-30 11:13:00'),(143085,'auguria',1,'','left','products',143084,NULL,NULL,0,'/categories/card.php?action=create&type=0','','NewCategory','categories',1,'','$user->rights->categorie->creer','$conf->categorie->enabled',2,'2016-07-30 11:13:00'),(143484,'auguria',1,'','left','project',139891,NULL,NULL,0,'/projet/index.php?leftmenu=projects','','Projects','projects',0,'projects','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143485,'auguria',1,'','left','project',143484,NULL,NULL,1,'/projet/card.php?leftmenu=projects&action=create','','NewProject','projects',1,'','$user->rights->projet->creer','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143486,'auguria',1,'','left','project',143484,NULL,NULL,2,'/projet/list.php?leftmenu=projects','','List','projects',1,'','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143494,'auguria',1,'','left','project',139891,NULL,NULL,0,'/projet/index.php?leftmenu=projects&mode=mine','','MyProjects','projects',0,'myprojects','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143495,'auguria',1,'','left','project',143494,NULL,NULL,1,'/projet/card.php?leftmenu=projects&action=create&mode=mine','','NewProject','projects',1,'','$user->rights->projet->creer','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143496,'auguria',1,'','left','project',143494,NULL,NULL,2,'/projet/list.php?leftmenu=projects&mode=mine','','List','projects',1,'','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143584,'auguria',1,'','left','project',139891,NULL,NULL,0,'/projet/activity/index.php?leftmenu=projects','','Activities','projects',0,'','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143585,'auguria',1,'','left','project',143584,NULL,NULL,1,'/projet/tasks.php?leftmenu=projects&action=create','','NewTask','projects',1,'','$user->rights->projet->creer','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143586,'auguria',1,'','left','project',143584,NULL,NULL,2,'/projet/tasks/list.php?leftmenu=projects','','List','projects',1,'','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143587,'auguria',1,'','left','project',143584,NULL,NULL,3,'/projet/activity/perweek.php?leftmenu=projects','','NewTimeSpent','projects',1,'','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143684,'auguria',1,'','left','project',139891,NULL,NULL,0,'/projet/activity/index.php?leftmenu=projects&mode=mine','','MyActivities','projects',0,'','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143685,'auguria',1,'','left','project',143684,NULL,NULL,1,'/projet/tasks.php?leftmenu=projects&action=create','','NewTask','projects',1,'','$user->rights->projet->creer','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143686,'auguria',1,'','left','project',143684,NULL,NULL,2,'/projet/tasks/list.php?leftmenu=projects&mode=mine','','List','projects',1,'','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143687,'auguria',1,'','left','project',143684,NULL,NULL,3,'/projet/activity/perweek.php?leftmenu=projects&mode=mine','','NewTimeSpent','projects',1,'','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143784,'auguria',1,'','left','tools',139892,NULL,NULL,0,'/comm/mailing/index.php?leftmenu=mailing','','EMailings','mails',0,'mailing','$user->rights->mailing->lire','$conf->mailing->enabled',0,'2016-07-30 11:13:00'),(143785,'auguria',1,'','left','tools',143784,NULL,NULL,0,'/comm/mailing/card.php?leftmenu=mailing&action=create','','NewMailing','mails',1,'','$user->rights->mailing->creer','$conf->mailing->enabled',0,'2016-07-30 11:13:00'),(143786,'auguria',1,'','left','tools',143784,NULL,NULL,1,'/comm/mailing/list.php?leftmenu=mailing','','List','mails',1,'','$user->rights->mailing->lire','$conf->mailing->enabled',0,'2016-07-30 11:13:00'),(143984,'auguria',1,'','left','tools',139892,NULL,NULL,2,'/exports/index.php?leftmenu=export','','FormatedExport','exports',0,'export','$user->rights->export->lire','$conf->export->enabled',2,'2016-07-30 11:13:00'),(143985,'auguria',1,'','left','tools',143984,NULL,NULL,0,'/exports/export.php?leftmenu=export','','NewExport','exports',1,'','$user->rights->export->creer','$conf->export->enabled',2,'2016-07-30 11:13:00'),(144014,'auguria',1,'','left','tools',139892,NULL,NULL,2,'/imports/index.php?leftmenu=import','','FormatedImport','exports',0,'import','$user->rights->import->run','$conf->import->enabled',2,'2016-07-30 11:13:00'),(144015,'auguria',1,'','left','tools',144014,NULL,NULL,0,'/imports/import.php?leftmenu=import','','NewImport','exports',1,'','$user->rights->import->run','$conf->import->enabled',2,'2016-07-30 11:13:00'),(144084,'auguria',1,'','left','members',139897,NULL,NULL,0,'/adherents/index.php?leftmenu=members&mainmenu=members','','Members','members',0,'members','$user->rights->adherent->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144085,'auguria',1,'','left','members',144084,NULL,NULL,0,'/adherents/card.php?leftmenu=members&action=create','','NewMember','members',1,'','$user->rights->adherent->creer','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144086,'auguria',1,'','left','members',144084,NULL,NULL,1,'/adherents/list.php','','List','members',1,'','$user->rights->adherent->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144087,'auguria',1,'','left','members',144086,NULL,NULL,2,'/adherents/list.php?leftmenu=members&statut=-1','','MenuMembersToValidate','members',2,'','$user->rights->adherent->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144088,'auguria',1,'','left','members',144086,NULL,NULL,3,'/adherents/list.php?leftmenu=members&statut=1','','MenuMembersValidated','members',2,'','$user->rights->adherent->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144089,'auguria',1,'','left','members',144086,NULL,NULL,4,'/adherents/list.php?leftmenu=members&statut=1&filter=outofdate','','MenuMembersNotUpToDate','members',2,'','$user->rights->adherent->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144090,'auguria',1,'','left','members',144086,NULL,NULL,5,'/adherents/list.php?leftmenu=members&statut=1&filter=uptodate','','MenuMembersUpToDate','members',2,'','$user->rights->adherent->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144091,'auguria',1,'','left','members',144086,NULL,NULL,6,'/adherents/list.php?leftmenu=members&statut=0','','MenuMembersResiliated','members',2,'','$user->rights->adherent->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144092,'auguria',1,'','left','members',144084,NULL,NULL,7,'/adherents/stats/geo.php?leftmenu=members&mode=memberbycountry','','MenuMembersStats','members',1,'','$user->rights->adherent->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144184,'auguria',1,'','left','members',139897,NULL,NULL,1,'/adherents/index.php?leftmenu=members&mainmenu=members','','Subscriptions','compta',0,'','$user->rights->adherent->cotisation->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144185,'auguria',1,'','left','members',144184,NULL,NULL,0,'/adherents/list.php?statut=-1&leftmenu=accountancy&mainmenu=members','','NewSubscription','compta',1,'','$user->rights->adherent->cotisation->creer','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144186,'auguria',1,'','left','members',144184,NULL,NULL,1,'/adherents/cotisations.php?leftmenu=members','','List','compta',1,'','$user->rights->adherent->cotisation->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144187,'auguria',1,'','left','members',144184,NULL,NULL,7,'/adherents/stats/index.php?leftmenu=members','','MenuMembersStats','members',1,'','$user->rights->adherent->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144384,'auguria',1,'','left','members',139897,NULL,NULL,3,'/adherents/index.php?leftmenu=export&mainmenu=members','','Exports','members',0,'export','$user->rights->adherent->export','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144385,'auguria',1,'','left','members',144384,NULL,NULL,0,'/exports/index.php?leftmenu=export','','Datas','members',1,'','$user->rights->adherent->export','$conf->adherent->enabled && $conf->export->enabled',2,'2016-07-30 11:13:00'),(144386,'auguria',1,'','left','members',144384,NULL,NULL,1,'/adherents/htpasswd.php?leftmenu=export','','Filehtpasswd','members',1,'','$user->rights->adherent->export','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144387,'auguria',1,'','left','members',144384,NULL,NULL,2,'/adherents/cartes/carte.php?leftmenu=export','','MembersCards','members',1,'','$user->rights->adherent->export','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144484,'auguria',1,'','left','hrm',139899,NULL,NULL,1,'/user/index.php?&leftmenu=hrm&mode=employee','','Employees','hrm',0,'hrm','$user->rights->hrm->employee->read','$conf->hrm->enabled',0,'2016-07-30 11:13:00'),(144485,'auguria',1,'','left','hrm',144484,NULL,NULL,1,'/user/card.php?&action=create','','NewEmployee','hrm',1,'','$user->rights->hrm->employee->write','$conf->hrm->enabled',0,'2016-07-30 11:13:00'),(144486,'auguria',1,'','left','hrm',144484,NULL,NULL,2,'/user/index.php?$leftmenu=hrm&mode=employee','','List','hrm',1,'','$user->rights->hrm->employee->read','$conf->hrm->enabled',0,'2016-07-30 11:13:00'),(144584,'auguria',1,'','left','members',139897,NULL,NULL,5,'/adherents/type.php?leftmenu=setup&mainmenu=members','','MembersTypes','members',0,'setup','$user->rights->adherent->configurer','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144585,'auguria',1,'','left','members',144584,NULL,NULL,0,'/adherents/type.php?leftmenu=setup&mainmenu=members&action=create','','New','members',1,'','$user->rights->adherent->configurer','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144586,'auguria',1,'','left','members',144584,NULL,NULL,1,'/adherents/type.php?leftmenu=setup&mainmenu=members','','List','members',1,'','$user->rights->adherent->configurer','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144884,'auguria',1,'','left','hrm',139899,NULL,NULL,1,'/holiday/list.php?&leftmenu=hrm','','CPTitreMenu','holiday',0,'hrm','$user->rights->holiday->read','$conf->holiday->enabled',0,'2016-07-30 11:13:00'),(144885,'auguria',1,'','left','hrm',144884,NULL,NULL,1,'/holiday/card.php?&action=request','','MenuAddCP','holiday',1,'','$user->rights->holiday->write','$conf->holiday->enabled',0,'2016-07-30 11:13:00'),(144886,'auguria',1,'','left','hrm',144884,NULL,NULL,1,'/holiday/list.php?&leftmenu=hrm','','List','holiday',1,'','$user->rights->holiday->read','$conf->holiday->enabled',0,'2016-07-30 11:13:00'),(144887,'auguria',1,'','left','hrm',144886,NULL,NULL,1,'/holiday/list.php?select_statut=2&leftmenu=hrm','','ListToApprove','trips',2,'','$user->rights->holiday->read','$conf->holiday->enabled',0,'2016-07-30 11:13:00'),(144888,'auguria',1,'','left','hrm',144884,NULL,NULL,2,'/holiday/define_holiday.php?&action=request','','MenuConfCP','holiday',1,'','$user->rights->holiday->define_holiday','$conf->holiday->enabled',0,'2016-07-30 11:13:00'),(144889,'auguria',1,'','left','hrm',144884,NULL,NULL,3,'/holiday/view_log.php?&action=request','','MenuLogCP','holiday',1,'','$user->rights->holiday->define_holiday','$conf->holiday->enabled',0,'2016-07-30 11:13:00'),(144984,'auguria',1,'','left','commercial',139889,NULL,NULL,6,'/fourn/commande/index.php?leftmenu=orders_suppliers','','SuppliersOrders','orders',0,'orders_suppliers','$user->rights->fournisseur->commande->lire','$conf->supplier_order->enabled',2,'2016-07-30 11:13:00'),(144985,'auguria',1,'','left','commercial',144984,NULL,NULL,0,'/fourn/commande/card.php?action=create&leftmenu=orders_suppliers','','NewOrder','orders',1,'','$user->rights->fournisseur->commande->creer','$conf->supplier_order->enabled',2,'2016-07-30 11:13:00'),(144986,'auguria',1,'','left','commercial',144984,NULL,NULL,1,'/fourn/commande/list.php?leftmenu=orders_suppliers&viewstatut=0','','List','orders',1,'','$user->rights->fournisseur->commande->lire','$conf->supplier_order->enabled',2,'2016-07-30 11:13:00'),(144992,'auguria',1,'','left','commercial',144984,NULL,NULL,7,'/commande/stats/index.php?leftmenu=orders_suppliers&mode=supplier','','Statistics','orders',1,'','$user->rights->fournisseur->commande->lire','$conf->supplier_order->enabled',2,'2016-07-30 11:13:00'),(145084,'auguria',1,'','left','members',139897,NULL,NULL,3,'/categories/index.php?leftmenu=cat&type=3','','MembersCategoriesShort','categories',0,'cat','$user->rights->categorie->lire','$conf->adherent->enabled && $conf->categorie->enabled',2,'2016-07-30 11:13:00'),(145085,'auguria',1,'','left','members',145084,NULL,NULL,0,'/categories/card.php?action=create&type=3','','NewCategory','categories',1,'','$user->rights->categorie->creer','$conf->adherent->enabled && $conf->categorie->enabled',2,'2016-07-30 11:13:00'),(145086,'all',1,'supplier_proposal','left','commercial',-1,NULL,'commercial',300,'/supplier_proposal/index.php','','SupplierProposalsShort','supplier_proposal',NULL,'supplier_proposalsubmenu','$user->rights->supplier_proposal->lire','$conf->supplier_proposal->enabled',2,'2016-07-30 11:13:20'),(145087,'all',1,'supplier_proposal','left','commercial',-1,'supplier_proposalsubmenu','commercial',301,'/supplier_proposal/card.php?action=create&leftmenu=supplier_proposals','','SupplierProposalNew','supplier_proposal',NULL,NULL,'$user->rights->supplier_proposal->creer','$conf->supplier_proposal->enabled',2,'2016-07-30 11:13:20'),(145088,'all',1,'supplier_proposal','left','commercial',-1,'supplier_proposalsubmenu','commercial',302,'/supplier_proposal/list.php?leftmenu=supplier_proposals','','List','supplier_proposal',NULL,NULL,'$user->rights->supplier_proposal->lire','$conf->supplier_proposal->enabled',2,'2016-07-30 11:13:20'),(145089,'all',1,'supplier_proposal','left','commercial',-1,'supplier_proposalsubmenu','commercial',303,'/comm/propal/stats/index.php?leftmenu=supplier_proposals&mode=supplier','','Statistics','supplier_proposal',NULL,NULL,'$user->rights->supplier_proposal->lire','$conf->supplier_proposal->enabled',2,'2016-07-30 11:13:20'),(145090,'all',1,'resource','left','tools',-1,NULL,'tools',100,'/resource/list.php','','MenuResourceIndex','resource',NULL,'resource','$user->rights->resource->read','1',0,'2016-07-30 11:13:32'),(145091,'all',1,'resource','left','tools',-1,'resource','tools',101,'/resource/add.php','','MenuResourceAdd','resource',NULL,NULL,'$user->rights->resource->read','1',0,'2016-07-30 11:13:32'),(145092,'all',1,'resource','left','tools',-1,'resource','tools',102,'/resource/list.php','','List','resource',NULL,NULL,'$user->rights->resource->read','1',0,'2016-07-30 11:13:32'),(145094,'all',1,'agenda','top','agenda',0,NULL,NULL,100,'/comm/action/index.php','','Agenda','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145095,'all',1,'agenda','left','agenda',145094,NULL,NULL,100,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda','','Actions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145096,'all',1,'agenda','left','agenda',145095,NULL,NULL,101,'/comm/action/card.php?mainmenu=agenda&leftmenu=agenda&action=create','','NewAction','commercial',NULL,NULL,'($user->rights->agenda->myactions->create||$user->rights->agenda->allactions->create)','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145097,'all',1,'agenda','left','agenda',145095,NULL,NULL,102,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda','','Agenda','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145098,'all',1,'agenda','left','agenda',145097,NULL,NULL,103,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda&status=todo&filter=mine','','MenuToDoMyActions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145099,'all',1,'agenda','left','agenda',145097,NULL,NULL,104,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda&status=done&filter=mine','','MenuDoneMyActions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145100,'all',1,'agenda','left','agenda',145097,NULL,NULL,105,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda&status=todo&filtert=-1','','MenuToDoActions','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$user->rights->agenda->allactions->read',2,'2016-07-30 15:42:32'),(145101,'all',1,'agenda','left','agenda',145097,NULL,NULL,106,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda&status=done&filtert=-1','','MenuDoneActions','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$user->rights->agenda->allactions->read',2,'2016-07-30 15:42:32'),(145102,'all',1,'agenda','left','agenda',145095,NULL,NULL,112,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda','','List','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145103,'all',1,'agenda','left','agenda',145102,NULL,NULL,113,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda&status=todo&filter=mine','','MenuToDoMyActions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145104,'all',1,'agenda','left','agenda',145102,NULL,NULL,114,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda&status=done&filter=mine','','MenuDoneMyActions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145105,'all',1,'agenda','left','agenda',145102,NULL,NULL,115,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda&status=todo&filtert=-1','','MenuToDoActions','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$user->rights->agenda->allactions->read',2,'2016-07-30 15:42:32'),(145106,'all',1,'agenda','left','agenda',145102,NULL,NULL,116,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda&status=done&filtert=-1','','MenuDoneActions','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$user->rights->agenda->allactions->read',2,'2016-07-30 15:42:32'),(145107,'all',1,'agenda','left','agenda',145095,NULL,NULL,120,'/comm/action/rapport/index.php?mainmenu=agenda&leftmenu=agenda','','Reportings','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145111,'all',1,'opensurvey','left','tools',-1,NULL,'tools',200,'/opensurvey/index.php?mainmenu=tools&leftmenu=opensurvey','','Survey','opensurvey',NULL,'opensurvey','$user->rights->opensurvey->read','$conf->opensurvey->enabled',0,'2016-07-30 19:04:07'),(145112,'all',1,'opensurvey','left','tools',-1,'opensurvey','tools',210,'/opensurvey/wizard/index.php','','NewSurvey','opensurvey',NULL,'opensurvey_new','$user->rights->opensurvey->write','$conf->opensurvey->enabled',0,'2016-07-30 19:04:07'),(145113,'all',1,'opensurvey','left','tools',-1,'opensurvey','tools',220,'/opensurvey/list.php','','List','opensurvey',NULL,'opensurvey_list','$user->rights->opensurvey->read','$conf->opensurvey->enabled',0,'2016-07-30 19:04:07'),(145127,'all',1,'printing','left','home',-1,'admintools','home',300,'/printing/index.php?mainmenu=home&leftmenu=admintools','','MenuDirectPrinting','printing',NULL,NULL,'$user->rights->printing->read','$conf->printing->enabled && $leftmenu==\'admintools\'',0,'2017-01-29 15:12:44'),(145146,'all',1,'barcode','left','tools',-1,NULL,'tools',200,'/barcode/printsheet.php?mainmenu=tools&leftmenu=barcodeprint','','BarCodePrintsheet','products',NULL,'barcodeprint','($conf->global->MAIN_USE_ADVANCED_PERMS && $user->rights->barcode->lire_advance) || (! $conf->global->MAIN_USE_ADVANCED_PERMS)','$conf->barcode->enabled',2,'2017-02-21 11:03:40'),(145147,'all',1,'barcode','left','home',-1,'admintools','home',300,'/barcode/codeinit.php?mainmenu=home&leftmenu=admintools','','MassBarcodeInit','products',NULL,NULL,'($conf->global->MAIN_USE_ADVANCED_PERMS && $user->rights->barcode->creer_advance) || (! $conf->global->MAIN_USE_ADVANCED_PERMS)','$conf->barcode->enabled && $leftmenu==\"admintools\"',0,'2017-02-21 11:03:40'),(145148,'all',1,'cron','left','home',-1,'admintools','home',200,'/cron/list.php?status=-2&leftmenu=admintools','','CronList','cron',NULL,NULL,'$user->rights->cron->read','$leftmenu==\'admintools\'',2,'2017-02-21 11:03:40'); +INSERT INTO `llx_menu` VALUES (103094,'all',2,'agenda','top','agenda',0,NULL,NULL,100,'/comm/action/index.php','','Agenda','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103095,'all',2,'agenda','left','agenda',103094,NULL,NULL,100,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda','','Actions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103096,'all',2,'agenda','left','agenda',103095,NULL,NULL,101,'/comm/action/card.php?mainmenu=agenda&leftmenu=agenda&action=create','','NewAction','commercial',NULL,NULL,'($user->rights->agenda->myactions->create||$user->rights->agenda->allactions->create)','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103097,'all',2,'agenda','left','agenda',103095,NULL,NULL,102,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda','','Calendar','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103098,'all',2,'agenda','left','agenda',103097,NULL,NULL,103,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda&status=todo&filter=mine','','MenuToDoMyActions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103099,'all',2,'agenda','left','agenda',103097,NULL,NULL,104,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda&status=done&filter=mine','','MenuDoneMyActions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103100,'all',2,'agenda','left','agenda',103097,NULL,NULL,105,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda&status=todo','','MenuToDoActions','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$user->rights->agenda->allactions->read',2,'2013-03-13 15:29:19'),(103101,'all',2,'agenda','left','agenda',103097,NULL,NULL,106,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda&status=done','','MenuDoneActions','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$user->rights->agenda->allactions->read',2,'2013-03-13 15:29:19'),(103102,'all',2,'agenda','left','agenda',103095,NULL,NULL,112,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda','','List','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103103,'all',2,'agenda','left','agenda',103102,NULL,NULL,113,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda&status=todo&filter=mine','','MenuToDoMyActions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103104,'all',2,'agenda','left','agenda',103102,NULL,NULL,114,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda&status=done&filter=mine','','MenuDoneMyActions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103105,'all',2,'agenda','left','agenda',103102,NULL,NULL,115,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda&status=todo','','MenuToDoActions','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$user->rights->agenda->allactions->read',2,'2013-03-13 15:29:19'),(103106,'all',2,'agenda','left','agenda',103102,NULL,NULL,116,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda&status=done','','MenuDoneActions','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$user->rights->agenda->allactions->read',2,'2013-03-13 15:29:19'),(103107,'all',2,'agenda','left','agenda',103095,NULL,NULL,120,'/comm/action/rapport/index.php?mainmenu=agenda&leftmenu=agenda','','Reportings','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$conf->agenda->enabled',2,'2013-03-13 15:29:19'),(103108,'all',2,'pos','top','pos',0,NULL,NULL,100,'/pos/backend/listefac.php','','POS','pos@pos',NULL,'1','1','1',2,'2013-03-13 20:33:09'),(103109,'all',2,'pos','left','pos',103108,NULL,NULL,100,'/pos/backend/list.php','','Tickets','pos@pos',NULL,NULL,'$user->rights->pos->backend','$conf->global->POS_USE_TICKETS',0,'2013-03-13 20:33:09'),(103110,'all',2,'pos','left','pos',103109,NULL,NULL,100,'/pos/backend/list.php','','List','main',NULL,NULL,'$user->rights->pos->backend','$conf->global->POS_USE_TICKETS',0,'2013-03-13 20:33:09'),(103111,'all',2,'pos','left','pos',103110,NULL,NULL,100,'/pos/backend/list.php?viewstatut=0','','StatusTicketDraft','pos@pos',NULL,NULL,'$user->rights->pos->backend','$conf->global->POS_USE_TICKETS',0,'2013-03-13 20:33:09'),(103112,'all',2,'pos','left','@pos',103110,NULL,NULL,100,'/pos/backend/list.php?viewstatut=1','','StatusTicketClosed','main',NULL,NULL,'$user->rights->pos->backend','$conf->global->POS_USE_TICKETS',0,'2013-03-13 20:33:09'),(103113,'all',2,'pos','left','@pos',103110,NULL,NULL,100,'/pos/backend/list.php?viewstatut=2','','StatusTicketProcessed','main',NULL,NULL,'$user->rights->pos->backend','$conf->global->POS_USE_TICKETS',0,'2013-03-13 20:33:09'),(103114,'all',2,'pos','left','@pos',103110,NULL,NULL,100,'/pos/backend/list.php?viewtype=1','','StatusTicketReturned','main',NULL,NULL,'$user->rights->pos->backend','$conf->global->POS_USE_TICKETS',0,'2013-03-13 20:33:09'),(103115,'all',2,'pos','left','pos',103108,NULL,NULL,100,'/pos/backend/listefac.php','','Factures','pos@pos',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103116,'all',2,'pos','left','pos',103115,NULL,NULL,100,'/pos/backend/listefac.php','','List','main',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103117,'all',2,'pos','left','pos',103116,NULL,NULL,100,'/pos/backend/listefac.php?viewstatut=0','','BillStatusDraft','bills',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103118,'all',2,'pos','left','@pos',103116,NULL,NULL,100,'/pos/backend/listefac.php?viewstatut=1','','BillStatusValidated','bills',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103119,'all',2,'pos','left','@pos',103116,NULL,NULL,100,'/pos/backend/listefac.php?viewstatut=2&viewtype=0','','BillStatusPaid','bills',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103120,'all',2,'pos','left','@pos',103116,NULL,NULL,100,'/pos/backend/listefac.php?viewtype=2','','BillStatusReturned','main',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103121,'all',2,'pos','left','@pos',103108,NULL,NULL,100,'/pos/frontend/index.php','','POS','main',NULL,NULL,'$user->rights->pos->frontend','1',0,'2013-03-13 20:33:09'),(103122,'all',2,'pos','left','@pos',103121,NULL,NULL,100,'/pos/frontend/index.php','','NewTicket','main',NULL,NULL,'$user->rights->pos->frontend','1',0,'2013-03-13 20:33:09'),(103123,'all',2,'pos','left','@pos',103121,NULL,NULL,101,'/pos/backend/closes.php','','CloseandArching','main',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103124,'all',2,'pos','left','@pos',103108,NULL,NULL,100,'/pos/backend/terminal/cash.php','','Terminal','main',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103125,'all',2,'pos','left','@pos',103124,NULL,NULL,100,'/pos/backend/terminal/card.php?action=create','','NewCash','main',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103126,'all',2,'pos','left','@pos',103124,NULL,NULL,101,'/pos/backend/terminal/cash.php','','List','main',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103127,'all',2,'pos','left','@pos',103123,NULL,NULL,101,'/pos/backend/closes.php?viewstatut=0','','Arqueo','main',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103128,'all',2,'pos','left','@pos',103123,NULL,NULL,102,'/pos/backend/closes.php?viewstatut=1','','Closes','main',NULL,NULL,'$user->rights->pos->backend','1',0,'2013-03-13 20:33:09'),(103129,'all',2,'pos','left','@pos',103108,NULL,NULL,102,'/pos/backend/transfers.php','','Transfer','main',NULL,NULL,'$user->rights->pos->transfer','1',0,'2013-03-13 20:33:09'),(103130,'all',2,'pos','left','@pos',103108,NULL,NULL,102,'/pos/backend/resultat/index.php','','Rapport','main',NULL,NULL,'$user->rights->pos->stats','1',0,'2013-03-13 20:33:09'),(103131,'all',2,'pos','left','@pos',103130,NULL,NULL,102,'/pos/backend/resultat/casoc.php','','ReportsCustomer','main',NULL,NULL,'$user->rights->pos->stats','1',0,'2013-03-13 20:33:09'),(103132,'all',2,'pos','left','@pos',103130,NULL,NULL,102,'/pos/backend/resultat/causer.php','','ReportsUser','main',NULL,NULL,'$user->rights->pos->stats','1',0,'2013-03-13 20:33:09'),(103133,'all',2,'pos','left','@pos',103130,NULL,NULL,102,'/pos/backend/resultat/sellsjournal.php','','ReportsSells','main',NULL,NULL,'$user->rights->pos->stats','1',0,'2013-03-13 20:33:09'),(103134,'all',2,'opensurvey','top','opensurvey',0,NULL,NULL,200,'/opensurvey/index.php','','Surveys','opensurvey',NULL,NULL,'$user->rights->opensurvey->survey->read','$conf->opensurvey->enabled',0,'2013-03-13 20:33:42'),(103135,'all',2,'opensurvey','left','opensurvey',-1,NULL,'opensurvey',200,'/opensurvey/index.php?mainmenu=opensurvey&leftmenu=opensurvey','','Survey','opensurvey@opensurvey',NULL,'opensurvey','','$conf->opensurvey->enabled',0,'2013-03-13 20:33:42'),(103136,'all',2,'opensurvey','left','opensurvey',-1,'opensurvey','opensurvey',210,'/opensurvey/public/index.php','_blank','NewSurvey','opensurvey@opensurvey',NULL,'opensurvey_new','','$conf->opensurvey->enabled',0,'2013-03-13 20:33:42'),(103137,'all',2,'opensurvey','left','opensurvey',-1,'opensurvey','opensurvey',220,'/opensurvey/list.php','','List','opensurvey@opensurvey',NULL,'opensurvey_list','','$conf->opensurvey->enabled',0,'2013-03-13 20:33:42'),(124179,'all',1,'cashdesk','top','cashdesk',0,NULL,NULL,100,'/cashdesk/index.php?user=__LOGIN__','pointofsale','CashDeskMenu','cashdesk',NULL,NULL,'$user->rights->cashdesk->use','$conf->cashdesk->enabled',0,'2015-11-15 22:38:33'),(124210,'all',1,'margins','left','accountancy',-1,NULL,'accountancy',100,'/margin/index.php','','Margins','margins',NULL,'margins','$user->rights->margins->liretous','$conf->margin->enabled',2,'2015-11-15 22:41:47'),(134675,'all',1,'ecm','top','ecm',0,NULL,NULL,100,'/ecm/index.php','','MenuECM','ecm',NULL,NULL,'$user->rights->ecm->read || $user->rights->ecm->upload || $user->rights->ecm->setup','$conf->ecm->enabled',2,'2016-01-22 17:26:43'),(134676,'all',1,'ecm','left','ecm',-1,NULL,'ecm',101,'/ecm/index.php?mainmenu=ecm&leftmenu=ecm','','ECMArea','ecm',NULL,'ecm','$user->rights->ecm->read || $user->rights->ecm->upload','$user->rights->ecm->read || $user->rights->ecm->upload',2,'2016-01-22 17:26:43'),(134677,'all',1,'ecm','left','ecm',-1,'ecm','ecm',102,'/ecm/index.php?action=file_manager&mainmenu=ecm&leftmenu=ecm','','ECMSectionsManual','ecm',NULL,'ecm_manual','$user->rights->ecm->read || $user->rights->ecm->upload','$user->rights->ecm->read || $user->rights->ecm->upload',2,'2016-01-22 17:26:43'),(134678,'all',1,'ecm','left','ecm',-1,'ecm','ecm',103,'/ecm/index_auto.php?action=file_manager&mainmenu=ecm&leftmenu=ecm','','ECMSectionsAuto','ecm',NULL,NULL,'$user->rights->ecm->read || $user->rights->ecm->upload','$user->rights->ecm->read || $user->rights->ecm->upload',2,'2016-01-22 17:26:43'),(139885,'auguria',1,'','top','home',0,NULL,NULL,10,'/index.php?mainmenu=home&leftmenu=','','Home','',-1,'','','1',2,'2016-07-30 11:13:00'),(139886,'auguria',1,'societe|fournisseur','top','companies',0,NULL,NULL,20,'/societe/index.php?mainmenu=companies&leftmenu=','','ThirdParties','companies',-1,'','$user->rights->societe->lire || $user->rights->societe->contact->lire','( ! empty($conf->societe->enabled) && (empty($conf->global->SOCIETE_DISABLE_PROSPECTS) || empty($conf->global->SOCIETE_DISABLE_CUSTOMERS))) || ! empty($conf->fournisseur->enabled)',2,'2016-07-30 11:13:00'),(139887,'auguria',1,'product|service','top','products',0,NULL,NULL,30,'/product/index.php?mainmenu=products&leftmenu=','','Products/Services','products',-1,'','$user->rights->produit->lire||$user->rights->service->lire','$conf->product->enabled || $conf->service->enabled',0,'2016-07-30 11:13:00'),(139889,'auguria',1,'propal|commande|fournisseur|contrat|ficheinter','top','commercial',0,NULL,NULL,40,'/comm/index.php?mainmenu=commercial&leftmenu=','','Commercial','commercial',-1,'','$user->rights->societe->lire || $user->rights->societe->contact->lire','$conf->propal->enabled || $conf->commande->enabled || $conf->supplier_order->enabled || $conf->contrat->enabled || $conf->ficheinter->enabled',2,'2016-07-30 11:13:00'),(139890,'auguria',1,'comptabilite|accounting|facture|don|tax|salaries|loan','top','accountancy',0,NULL,NULL,50,'/compta/index.php?mainmenu=accountancy&leftmenu=','','MenuFinancial','compta',-1,'','$user->rights->compta->resultat->lire || $user->rights->accounting->plancompte->lire || $user->rights->facture->lire|| $user->rights->don->lire || $user->rights->tax->charges->lire || $user->rights->salaries->read || $user->rights->loan->read','$conf->comptabilite->enabled || $conf->accounting->enabled || $conf->facture->enabled || $conf->don->enabled || $conf->tax->enabled || $conf->salaries->enabled || $conf->supplier_invoice->enabled || $conf->loan->enabled',2,'2016-07-30 11:13:00'),(139891,'auguria',1,'projet','top','project',0,NULL,NULL,70,'/projet/index.php?mainmenu=project&leftmenu=','','Projects','projects',-1,'','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(139892,'auguria',1,'mailing|export|import|opensurvey|resource','top','tools',0,NULL,NULL,90,'/core/tools.php?mainmenu=tools&leftmenu=','','Tools','other',-1,'','$user->rights->mailing->lire || $user->rights->export->lire || $user->rights->import->run || $user->rights->opensurvey->read || $user->rights->resource->read','$conf->mailing->enabled || $conf->export->enabled || $conf->import->enabled || $conf->opensurvey->enabled || $conf->resource->enabled',2,'2016-07-30 11:13:00'),(139898,'auguria',1,'banque|prelevement','top','bank',0,NULL,NULL,60,'/compta/bank/index.php?mainmenu=bank&leftmenu=bank','','MenuBankCash','banks',-1,'','$user->rights->banque->lire || $user->rights->prelevement->bons->lire','$conf->banque->enabled || $conf->prelevement->enabled',0,'2016-07-30 11:13:00'),(139899,'auguria',1,'hrm|holiday|deplacement|expensereport','top','hrm',0,NULL,NULL,80,'/hrm/hrm.php?mainmenu=hrm&leftmenu=','','HRM','holiday',-1,'','$user->rights->hrm->employee->read || $user->rights->holiday->write || $user->rights->deplacement->lire || $user->rights->expensereport->lire','$conf->hrm->enabled || $conf->holiday->enabled || $conf->deplacement->enabled || $conf->expensereport->enabled',0,'2016-07-30 11:13:00'),(139974,'auguria',1,'','left','home',139885,NULL,NULL,0,'/index.php','','Dashboard','',0,'','','1',2,'2016-07-30 11:13:00'),(139984,'auguria',1,'','left','home',139885,NULL,NULL,1,'/admin/index.php?leftmenu=setup','','Setup','admin',0,'setup','','$user->admin',2,'2016-07-30 11:13:00'),(139985,'auguria',1,'','left','home',139984,NULL,NULL,1,'/admin/company.php?leftmenu=setup','','MenuCompanySetup','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139986,'auguria',1,'','left','home',139984,NULL,NULL,4,'/admin/ihm.php?leftmenu=setup','','GUISetup','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139987,'auguria',1,'','left','home',139984,NULL,NULL,2,'/admin/modules.php?leftmenu=setup','','Modules','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139988,'auguria',1,'','left','home',139984,NULL,NULL,6,'/admin/boxes.php?leftmenu=setup','','Boxes','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139989,'auguria',1,'','left','home',139984,NULL,NULL,3,'/admin/menus.php?leftmenu=setup','','Menus','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139990,'auguria',1,'','left','home',139984,NULL,NULL,7,'/admin/delais.php?leftmenu=setup','','Alerts','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139991,'auguria',1,'','left','home',139984,NULL,NULL,10,'/admin/pdf.php?leftmenu=setup','','PDF','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139992,'auguria',1,'','left','home',139984,NULL,NULL,8,'/admin/security_other.php?leftmenu=setup','','Security','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139993,'auguria',1,'','left','home',139984,NULL,NULL,11,'/admin/mails.php?leftmenu=setup','','Emails','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139994,'auguria',1,'','left','home',139984,NULL,NULL,9,'/admin/limits.php?leftmenu=setup','','MenuLimits','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139995,'auguria',1,'','left','home',139984,NULL,NULL,13,'/admin/dict.php?leftmenu=setup','','Dictionary','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139996,'auguria',1,'','left','home',139984,NULL,NULL,14,'/admin/const.php?leftmenu=setup','','OtherSetup','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139997,'auguria',1,'','left','home',139984,NULL,NULL,12,'/admin/sms.php?leftmenu=setup','','SMS','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139998,'auguria',1,'','left','home',139984,NULL,NULL,4,'/admin/translation.php?leftmenu=setup','','Translation','admin',1,'','','$leftmenu==\"setup\"',2,'2016-07-30 11:13:00'),(139999,'auguria',1,'','left','home',139984,NULL,NULL,4,'/accountancy/admin/fiscalyear.php?mainmenu=setup','','Fiscalyear','admin',1,'','','$leftmenu==\"setup\" && $conf->accounting->enabled',2,'2016-07-30 11:13:00'),(140085,'auguria',1,'','left','home',140184,NULL,NULL,0,'/admin/system/dolibarr.php?leftmenu=admintools','','InfoDolibarr','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140086,'auguria',1,'','left','home',140085,NULL,NULL,2,'/admin/system/modules.php?leftmenu=admintools','','Modules','admin',2,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140087,'auguria',1,'','left','home',140085,NULL,NULL,3,'/admin/triggers.php?leftmenu=admintools','','Triggers','admin',2,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140089,'auguria',1,'','left','home',140184,NULL,NULL,1,'/admin/system/browser.php?leftmenu=admintools','','InfoBrowser','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140090,'auguria',1,'','left','home',140184,NULL,NULL,2,'/admin/system/os.php?leftmenu=admintools','','InfoOS','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140091,'auguria',1,'','left','home',140184,NULL,NULL,3,'/admin/system/web.php?leftmenu=admintools','','InfoWebServer','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140092,'auguria',1,'','left','home',140184,NULL,NULL,4,'/admin/system/phpinfo.php?leftmenu=admintools','','InfoPHP','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140094,'auguria',1,'','left','home',140184,NULL,NULL,5,'/admin/system/database.php?leftmenu=admintools','','InfoDatabase','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140184,'auguria',1,'','left','home',139885,NULL,NULL,2,'/admin/tools/index.php?leftmenu=admintools','','AdminTools','admin',0,'admintools','','$user->admin',2,'2016-07-30 11:13:00'),(140185,'auguria',1,'','left','home',140184,NULL,NULL,6,'/admin/tools/dolibarr_export.php?leftmenu=admintools','','Backup','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140186,'auguria',1,'','left','home',140184,NULL,NULL,7,'/admin/tools/dolibarr_import.php?leftmenu=admintools','','Restore','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140189,'auguria',1,'','left','home',140184,NULL,NULL,8,'/admin/tools/update.php?leftmenu=admintools','','MenuUpgrade','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140190,'auguria',1,'','left','home',140184,NULL,NULL,9,'/admin/tools/eaccelerator.php?leftmenu=admintools','','EAccelerator','admin',1,'','','$leftmenu==\"admintools\" && function_exists(\"eaccelerator_info\")',2,'2016-07-30 11:13:00'),(140191,'auguria',1,'','left','home',140184,NULL,NULL,10,'/admin/tools/listevents.php?leftmenu=admintools','','Audit','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140192,'auguria',1,'','left','home',140184,NULL,NULL,11,'/admin/tools/listsessions.php?leftmenu=admintools','','Sessions','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140193,'auguria',1,'','left','home',140184,NULL,NULL,12,'/admin/tools/purge.php?leftmenu=admintools','','Purge','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140194,'auguria',1,'','left','home',140184,NULL,NULL,13,'/support/index.php?leftmenu=admintools','_blank','HelpCenter','help',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140195,'auguria',1,'','left','home',140184,NULL,NULL,14,'/admin/system/about.php?leftmenu=admintools','','About','admin',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140204,'auguria',1,'','left','home',140184,NULL,NULL,0,'/product/admin/product_tools.php?mainmenu=home&leftmenu=admintools','','ProductVatMassChange','products',1,'','','$leftmenu==\"admintools\"',2,'2016-07-30 11:13:00'),(140205,'auguria',1,'','left','home',140184,NULL,NULL,0,'/accountancy/admin/productaccount.php?mainmenu=home&leftmenu=admintools','','InitAccountancy','accountancy',1,'','','$leftmenu==\"admintools\" && $conf->accounting->enabled',2,'2016-07-30 11:13:00'),(140284,'auguria',1,'','left','home',139885,NULL,NULL,4,'/user/home.php?leftmenu=users','','MenuUsersAndGroups','users',0,'users','','1',2,'2016-07-30 11:13:00'),(140285,'auguria',1,'','left','home',140284,NULL,NULL,0,'/user/index.php?leftmenu=users','','Users','users',1,'','$user->rights->user->user->lire || $user->admin','$leftmenu==\"users\"',2,'2016-07-30 11:13:00'),(140286,'auguria',1,'','left','home',140285,NULL,NULL,0,'/user/card.php?leftmenu=users&action=create','','NewUser','users',2,'','$user->rights->user->user->creer || $user->admin','$leftmenu==\"users\"',2,'2016-07-30 11:13:00'),(140287,'auguria',1,'','left','home',140284,NULL,NULL,1,'/user/group/index.php?leftmenu=users','','Groups','users',1,'','($conf->global->MAIN_USE_ADVANCED_PERMS?$user->rights->user->group_advance->read:$user->rights->user->user->lire) || $user->admin','$leftmenu==\"users\"',2,'2016-07-30 11:13:00'),(140288,'auguria',1,'','left','home',140287,NULL,NULL,0,'/user/group/card.php?leftmenu=users&action=create','','NewGroup','users',2,'','($conf->global->MAIN_USE_ADVANCED_PERMS?$user->rights->user->group_advance->write:$user->rights->user->user->creer) || $user->admin','$leftmenu==\"users\"',2,'2016-07-30 11:13:00'),(140384,'auguria',1,'','left','companies',139886,NULL,NULL,0,'/societe/index.php?leftmenu=thirdparties','','ThirdParty','companies',0,'thirdparties','$user->rights->societe->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140385,'auguria',1,'','left','companies',140384,NULL,NULL,0,'/societe/soc.php?action=create','','MenuNewThirdParty','companies',1,'','$user->rights->societe->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140386,'auguria',1,'','left','companies',140384,NULL,NULL,0,'/societe/list.php?action=create','','List','companies',1,'','$user->rights->societe->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140387,'auguria',1,'','left','companies',140384,NULL,NULL,5,'/societe/list.php?type=f&leftmenu=suppliers','','ListSuppliersShort','suppliers',1,'','$user->rights->societe->lire && $user->rights->fournisseur->lire','$conf->societe->enabled && $conf->fournisseur->enabled',2,'2016-07-30 11:13:00'),(140388,'auguria',1,'','left','companies',140387,NULL,NULL,0,'/societe/soc.php?leftmenu=supplier&action=create&type=f','','NewSupplier','suppliers',2,'','$user->rights->societe->creer','$conf->societe->enabled && $conf->fournisseur->enabled',2,'2016-07-30 11:13:00'),(140390,'auguria',1,'','left','companies',140384,NULL,NULL,3,'/societe/list.php?type=p&leftmenu=prospects','','ListProspectsShort','companies',1,'','$user->rights->societe->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140391,'auguria',1,'','left','companies',140390,NULL,NULL,0,'/societe/soc.php?leftmenu=prospects&action=create&type=p','','MenuNewProspect','companies',2,'','$user->rights->societe->creer','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140393,'auguria',1,'','left','companies',140384,NULL,NULL,4,'/societe/list.php?type=c&leftmenu=customers','','ListCustomersShort','companies',1,'','$user->rights->societe->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140394,'auguria',1,'','left','companies',140393,NULL,NULL,0,'/societe/soc.php?leftmenu=customers&action=create&type=c','','MenuNewCustomer','companies',2,'','$user->rights->societe->creer','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140484,'auguria',1,'','left','companies',139886,NULL,NULL,1,'/contact/list.php?leftmenu=contacts','','ContactsAddresses','companies',0,'contacts','$user->rights->societe->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140485,'auguria',1,'','left','companies',140484,NULL,NULL,0,'/contact/card.php?leftmenu=contacts&action=create','','NewContactAddress','companies',1,'','$user->rights->societe->creer','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140486,'auguria',1,'','left','companies',140484,NULL,NULL,1,'/contact/list.php?leftmenu=contacts','','List','companies',1,'','$user->rights->societe->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140488,'auguria',1,'','left','companies',140486,NULL,NULL,1,'/contact/list.php?leftmenu=contacts&type=p','','ThirdPartyProspects','companies',2,'','$user->rights->societe->contact->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140489,'auguria',1,'','left','companies',140486,NULL,NULL,2,'/contact/list.php?leftmenu=contacts&type=c','','ThirdPartyCustomers','companies',2,'','$user->rights->societe->contact->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140490,'auguria',1,'','left','companies',140486,NULL,NULL,3,'/contact/list.php?leftmenu=contacts&type=f','','ThirdPartySuppliers','companies',2,'','$user->rights->societe->contact->lire','$conf->societe->enabled && $conf->fournisseur->enabled',2,'2016-07-30 11:13:00'),(140491,'auguria',1,'','left','companies',140486,NULL,NULL,4,'/contact/list.php?leftmenu=contacts&type=o','','Others','companies',2,'','$user->rights->societe->contact->lire','$conf->societe->enabled',2,'2016-07-30 11:13:00'),(140534,'auguria',1,'','left','companies',139886,NULL,NULL,3,'/categories/index.php?leftmenu=cat&type=1','','SuppliersCategoriesShort','categories',0,'cat','$user->rights->categorie->lire','$conf->societe->enabled && $conf->categorie->enabled',2,'2016-07-30 11:13:00'),(140535,'auguria',1,'','left','companies',140534,NULL,NULL,0,'/categories/card.php?action=create&type=1','','NewCategory','categories',1,'','$user->rights->categorie->creer','$conf->societe->enabled && $conf->categorie->enabled',2,'2016-07-30 11:13:00'),(140544,'auguria',1,'','left','companies',139886,NULL,NULL,4,'/categories/index.php?leftmenu=cat&type=2','','CustomersProspectsCategoriesShort','categories',0,'cat','$user->rights->categorie->lire','$conf->fournisseur->enabled && $conf->categorie->enabled',2,'2016-07-30 11:13:00'),(140545,'auguria',1,'','left','companies',140544,NULL,NULL,0,'/categories/card.php?action=create&type=2','','NewCategory','categories',1,'','$user->rights->categorie->creer','$conf->fournisseur->enabled && $conf->categorie->enabled',2,'2016-07-30 11:13:00'),(140554,'auguria',1,'','left','companies',139886,NULL,NULL,3,'/categories/index.php?leftmenu=cat&type=4','','ContactCategoriesShort','categories',0,'cat','$user->rights->categorie->lire','$conf->societe->enabled && $conf->categorie->enabled',2,'2016-07-30 11:13:00'),(140555,'auguria',1,'','left','companies',140554,NULL,NULL,0,'/categories/card.php?action=create&type=4','','NewCategory','categories',1,'','$user->rights->categorie->creer','$conf->societe->enabled && $conf->categorie->enabled',2,'2016-07-30 11:13:00'),(140984,'auguria',1,'','left','commercial',139889,NULL,NULL,4,'/comm/propal/index.php?leftmenu=propals','','Prop','propal',0,'propals','$user->rights->propale->lire','$conf->propal->enabled',2,'2016-07-30 11:13:00'),(140985,'auguria',1,'','left','commercial',140984,NULL,NULL,0,'/comm/propal/card.php?action=create&leftmenu=propals','','NewPropal','propal',1,'','$user->rights->propale->creer','$conf->propal->enabled',2,'2016-07-30 11:13:00'),(140986,'auguria',1,'','left','commercial',140984,NULL,NULL,1,'/comm/propal/list.php?leftmenu=propals','','List','propal',1,'','$user->rights->propale->lire','$conf->propal->enabled',2,'2016-07-30 11:13:00'),(140987,'auguria',1,'','left','commercial',140986,NULL,NULL,2,'/comm/propal/list.php?leftmenu=propals&viewstatut=0','','PropalsDraft','propal',1,'','$user->rights->propale->lire','$conf->propal->enabled && $leftmenu==\"propals\"',2,'2016-07-30 11:13:00'),(140988,'auguria',1,'','left','commercial',140986,NULL,NULL,3,'/comm/propal/list.php?leftmenu=propals&viewstatut=1','','PropalsOpened','propal',1,'','$user->rights->propale->lire','$conf->propal->enabled && $leftmenu==\"propals\"',2,'2016-07-30 11:13:00'),(140989,'auguria',1,'','left','commercial',140986,NULL,NULL,4,'/comm/propal/list.php?leftmenu=propals&viewstatut=2','','PropalStatusSigned','propal',1,'','$user->rights->propale->lire','$conf->propal->enabled && $leftmenu==\"propals\"',2,'2016-07-30 11:13:00'),(140990,'auguria',1,'','left','commercial',140986,NULL,NULL,5,'/comm/propal/list.php?leftmenu=propals&viewstatut=3','','PropalStatusNotSigned','propal',1,'','$user->rights->propale->lire','$conf->propal->enabled && $leftmenu==\"propals\"',2,'2016-07-30 11:13:00'),(140991,'auguria',1,'','left','commercial',140986,NULL,NULL,6,'/comm/propal/list.php?leftmenu=propals&viewstatut=4','','PropalStatusBilled','propal',1,'','$user->rights->propale->lire','$conf->propal->enabled && $leftmenu==\"propals\"',2,'2016-07-30 11:13:00'),(140994,'auguria',1,'','left','commercial',140984,NULL,NULL,4,'/comm/propal/stats/index.php?leftmenu=propals','','Statistics','propal',1,'','$user->rights->propale->lire','$conf->propal->enabled',2,'2016-07-30 11:13:00'),(141084,'auguria',1,'','left','commercial',139889,NULL,NULL,5,'/commande/index.php?leftmenu=orders','','CustomersOrders','orders',0,'orders','$user->rights->commande->lire','$conf->commande->enabled',2,'2016-07-30 11:13:00'),(141085,'auguria',1,'','left','commercial',141084,NULL,NULL,0,'/commande/card.php?action=create&leftmenu=orders','','NewOrder','orders',1,'','$user->rights->commande->creer','$conf->commande->enabled',2,'2016-07-30 11:13:00'),(141086,'auguria',1,'','left','commercial',141084,NULL,NULL,1,'/commande/list.php?leftmenu=orders','','List','orders',1,'','$user->rights->commande->lire','$conf->commande->enabled',2,'2016-07-30 11:13:00'),(141087,'auguria',1,'','left','commercial',141086,NULL,NULL,2,'/commande/list.php?leftmenu=orders&viewstatut=0','','StatusOrderDraftShort','orders',1,'','$user->rights->commande->lire','$conf->commande->enabled && $leftmenu==\"orders\"',2,'2016-07-30 11:13:00'),(141088,'auguria',1,'','left','commercial',141086,NULL,NULL,3,'/commande/list.php?leftmenu=orders&viewstatut=1','','StatusOrderValidated','orders',1,'','$user->rights->commande->lire','$conf->commande->enabled && $leftmenu==\"orders\"',2,'2016-07-30 11:13:00'),(141089,'auguria',1,'','left','commercial',141086,NULL,NULL,4,'/commande/list.php?leftmenu=orders&viewstatut=2','','StatusOrderOnProcessShort','orders',1,'','$user->rights->commande->lire','$conf->commande->enabled && $leftmenu==\"orders\"',2,'2016-07-30 11:13:00'),(141090,'auguria',1,'','left','commercial',141086,NULL,NULL,5,'/commande/list.php?leftmenu=orders&viewstatut=3','','StatusOrderToBill','orders',1,'','$user->rights->commande->lire','$conf->commande->enabled && $leftmenu==\"orders\"',2,'2016-07-30 11:13:00'),(141091,'auguria',1,'','left','commercial',141086,NULL,NULL,6,'/commande/list.php?leftmenu=orders&viewstatut=4','','StatusOrderProcessed','orders',1,'','$user->rights->commande->lire','$conf->commande->enabled && $leftmenu==\"orders\"',2,'2016-07-30 11:13:00'),(141092,'auguria',1,'','left','commercial',141086,NULL,NULL,7,'/commande/list.php?leftmenu=orders&viewstatut=-1','','StatusOrderCanceledShort','orders',1,'','$user->rights->commande->lire','$conf->commande->enabled && $leftmenu==\"orders\"',2,'2016-07-30 11:13:00'),(141093,'auguria',1,'','left','commercial',141084,NULL,NULL,4,'/commande/stats/index.php?leftmenu=orders','','Statistics','orders',1,'','$user->rights->commande->lire','$conf->commande->enabled',2,'2016-07-30 11:13:00'),(141184,'auguria',1,'','left','commercial',139887,NULL,NULL,6,'/expedition/index.php?leftmenu=sendings','','Shipments','sendings',0,'sendings','$user->rights->expedition->lire','$conf->expedition->enabled',2,'2016-07-30 11:13:00'),(141185,'auguria',1,'','left','commercial',141184,NULL,NULL,0,'/expedition/card.php?action=create2&leftmenu=sendings','','NewSending','sendings',1,'','$user->rights->expedition->creer','$conf->expedition->enabled && $leftmenu==\"sendings\"',2,'2016-07-30 11:13:00'),(141186,'auguria',1,'','left','commercial',141184,NULL,NULL,1,'/expedition/list.php?leftmenu=sendings','','List','sendings',1,'','$user->rights->expedition->lire','$conf->expedition->enabled && $leftmenu==\"sendings\"',2,'2016-07-30 11:13:00'),(141187,'auguria',1,'','left','commercial',141184,NULL,NULL,2,'/expedition/stats/index.php?leftmenu=sendings','','Statistics','sendings',1,'','$user->rights->expedition->lire','$conf->expedition->enabled && $leftmenu==\"sendings\"',2,'2016-07-30 11:13:00'),(141284,'auguria',1,'','left','commercial',139889,NULL,NULL,7,'/contrat/index.php?leftmenu=contracts','','Contracts','contracts',0,'contracts','$user->rights->contrat->lire','$conf->contrat->enabled',2,'2016-07-30 11:13:00'),(141285,'auguria',1,'','left','commercial',141284,NULL,NULL,0,'/contrat/card.php?&action=create&leftmenu=contracts','','NewContract','contracts',1,'','$user->rights->contrat->creer','$conf->contrat->enabled',2,'2016-07-30 11:13:00'),(141286,'auguria',1,'','left','commercial',141284,NULL,NULL,1,'/contrat/list.php?leftmenu=contracts','','List','contracts',1,'','$user->rights->contrat->lire','$conf->contrat->enabled',2,'2016-07-30 11:13:00'),(141287,'auguria',1,'','left','commercial',141284,NULL,NULL,2,'/contrat/services.php?leftmenu=contracts','','MenuServices','contracts',1,'','$user->rights->contrat->lire','$conf->contrat->enabled',2,'2016-07-30 11:13:00'),(141288,'auguria',1,'','left','commercial',141287,NULL,NULL,0,'/contrat/services.php?leftmenu=contracts&mode=0','','MenuInactiveServices','contracts',2,'','$user->rights->contrat->lire','$conf->contrat->enabled&&$leftmenu==\"contracts\"',2,'2016-07-30 11:13:00'),(141289,'auguria',1,'','left','commercial',141287,NULL,NULL,1,'/contrat/services.php?leftmenu=contracts&mode=4','','MenuRunningServices','contracts',2,'','$user->rights->contrat->lire','$conf->contrat->enabled&&$leftmenu==\"contracts\"',2,'2016-07-30 11:13:00'),(141290,'auguria',1,'','left','commercial',141287,NULL,NULL,2,'/contrat/services.php?leftmenu=contracts&mode=4&filter=expired','','MenuExpiredServices','contracts',2,'','$user->rights->contrat->lire','$conf->contrat->enabled&&$leftmenu==\"contracts\"',2,'2016-07-30 11:13:00'),(141291,'auguria',1,'','left','commercial',141287,NULL,NULL,3,'/contrat/services.php?leftmenu=contracts&mode=5','','MenuClosedServices','contracts',2,'','$user->rights->contrat->lire','$conf->contrat->enabled&&$leftmenu==\"contracts\"',2,'2016-07-30 11:13:00'),(141384,'auguria',1,'','left','commercial',139889,NULL,NULL,8,'/fichinter/list.php?leftmenu=ficheinter','','Interventions','interventions',0,'ficheinter','$user->rights->ficheinter->lire','$conf->ficheinter->enabled',2,'2016-07-30 11:13:00'),(141385,'auguria',1,'','left','commercial',141384,NULL,NULL,0,'/fichinter/card.php?action=create&leftmenu=ficheinter','','NewIntervention','interventions',1,'','$user->rights->ficheinter->creer','$conf->ficheinter->enabled',2,'2016-07-30 11:13:00'),(141386,'auguria',1,'','left','commercial',141384,NULL,NULL,1,'/fichinter/list.php?leftmenu=ficheinter','','List','interventions',1,'','$user->rights->ficheinter->lire','$conf->ficheinter->enabled',2,'2016-07-30 11:13:00'),(141387,'auguria',1,'','left','commercial',141384,NULL,NULL,2,'/fichinter/stats/index.php?leftmenu=ficheinter','','Statistics','interventions',1,'','$user->rights->ficheinter->lire','$conf->ficheinter->enabled',2,'2016-07-30 11:13:00'),(141484,'auguria',1,'','left','accountancy',139890,NULL,NULL,3,'/fourn/facture/list.php?leftmenu=suppliers_bills','','BillsSuppliers','bills',0,'supplier_bills','$user->rights->fournisseur->facture->lire','$conf->supplier_invoice->enabled',2,'2016-07-30 11:13:00'),(141485,'auguria',1,'','left','accountancy',141484,NULL,NULL,0,'/fourn/facture/card.php?action=create&leftmenu=suppliers_bills','','NewBill','bills',1,'','$user->rights->fournisseur->facture->creer','$conf->supplier_invoice->enabled',2,'2016-07-30 11:13:00'),(141486,'auguria',1,'','left','accountancy',141484,NULL,NULL,1,'/fourn/facture/impayees.php?leftmenu=suppliers_bills','','Unpaid','bills',1,'','$user->rights->fournisseur->facture->lire','$conf->supplier_invoice->enabled',2,'2016-07-30 11:13:00'),(141487,'auguria',1,'','left','accountancy',141484,NULL,NULL,2,'/fourn/facture/paiement.php?leftmenu=suppliers_bills','','Payments','bills',1,'','$user->rights->fournisseur->facture->lire','$conf->supplier_invoice->enabled',2,'2016-07-30 11:13:00'),(141488,'auguria',1,'','left','accountancy',141484,NULL,NULL,8,'/compta/facture/stats/index.php?leftmenu=customers_bills&mode=supplier','','Statistics','bills',1,'','$user->rights->fournisseur->facture->lire','$conf->supplier_invoice->enabled',2,'2016-07-30 11:13:00'),(141584,'auguria',1,'','left','accountancy',139890,NULL,NULL,3,'/compta/facture/list.php?leftmenu=customers_bills','','BillsCustomers','bills',0,'customer_bills','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141585,'auguria',1,'','left','accountancy',141584,NULL,NULL,3,'/compta/facture.php?action=create&leftmenu=customers_bills','','NewBill','bills',1,'','$user->rights->facture->creer','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141586,'auguria',1,'','left','accountancy',141584,NULL,NULL,5,'/compta/facture/fiche-rec.php?leftmenu=customers_bills','','ListOfTemplates','bills',1,'','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141588,'auguria',1,'','left','accountancy',141584,NULL,NULL,6,'/compta/paiement/list.php?leftmenu=customers_bills','','Payments','bills',1,'','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141589,'auguria',1,'','left','accountancy',141584,NULL,NULL,4,'/compta/facture/list.php?leftmenu=customers_bills','','List','bills',1,'','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141594,'auguria',1,'','left','accountancy',141588,NULL,NULL,1,'/compta/paiement/rapport.php?leftmenu=customers_bills','','Reportings','bills',2,'','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141595,'auguria',1,'','left','accountancy',139898,NULL,NULL,9,'/compta/paiement/cheque/index.php?leftmenu=checks&mainmenu=bank','','MenuChequeDeposits','bills',0,'checks','$user->rights->banque->lire','empty($conf->global->BANK_DISABLE_CHECK_DEPOSIT) && ! empty($conf->banque->enabled) && (! empty($conf->facture->enabled) || ! empty($conf->global->MAIN_MENU_CHEQUE_DEPOSIT_ON))',2,'2016-07-30 11:13:00'),(141596,'auguria',1,'','left','accountancy',141595,NULL,NULL,0,'/compta/paiement/cheque/card.php?leftmenu=checks&action=new','','NewCheckDeposit','compta',1,'','$user->rights->banque->lire','empty($conf->global->BANK_DISABLE_CHECK_DEPOSIT) && ! empty($conf->banque->enabled) && (! empty($conf->facture->enabled) || ! empty($conf->global->MAIN_MENU_CHEQUE_DEPOSIT_ON))',2,'2016-07-30 11:13:00'),(141597,'auguria',1,'','left','accountancy',141595,NULL,NULL,1,'/compta/paiement/cheque/list.php?leftmenu=checks','','List','bills',1,'','$user->rights->banque->lire','empty($conf->global->BANK_DISABLE_CHECK_DEPOSIT) && ! empty($conf->banque->enabled) && (! empty($conf->facture->enabled) || ! empty($conf->global->MAIN_MENU_CHEQUE_DEPOSIT_ON))',2,'2016-07-30 11:13:00'),(141598,'auguria',1,'','left','accountancy',141584,NULL,NULL,8,'/compta/facture/stats/index.php?leftmenu=customers_bills','','Statistics','bills',1,'','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141604,'auguria',1,'','left','accountancy',141589,NULL,NULL,1,'/compta/facture/list.php?leftmenu=customers_bills&search_status=0','','BillShortStatusDraft','bills',2,'','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141605,'auguria',1,'','left','accountancy',141589,NULL,NULL,2,'/compta/facture/list.php?leftmenu=customers_bills&search_status=1','','BillShortStatusNotPaid','bills',2,'','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141606,'auguria',1,'','left','accountancy',141589,NULL,NULL,3,'/compta/facture/list.php?leftmenu=customers_bills&search_status=2','','BillShortStatusPaid','bills',2,'','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141607,'auguria',1,'','left','accountancy',141589,NULL,NULL,4,'/compta/facture/list.php?leftmenu=customers_bills&search_status=3','','BillShortStatusCanceled','bills',2,'','$user->rights->facture->lire','$conf->facture->enabled',2,'2016-07-30 11:13:00'),(141784,'auguria',1,'','left','accountancy',139890,NULL,NULL,3,'/commande/list.php?leftmenu=orders&viewstatut=3','','MenuOrdersToBill','orders',0,'orders','$user->rights->commande->lire','$conf->commande->enabled',0,'2016-07-30 11:13:00'),(141884,'auguria',1,'','left','accountancy',139890,NULL,NULL,4,'/don/index.php?leftmenu=donations&mainmenu=accountancy','','Donations','donations',0,'donations','$user->rights->don->lire','$conf->don->enabled',2,'2016-07-30 11:13:00'),(141885,'auguria',1,'','left','accountancy',141884,NULL,NULL,0,'/don/card.php?leftmenu=donations&mainmenu=accountancy&action=create','','NewDonation','donations',1,'','$user->rights->don->creer','$conf->don->enabled && $leftmenu==\"donations\"',2,'2016-07-30 11:13:00'),(141886,'auguria',1,'','left','accountancy',141884,NULL,NULL,1,'/don/list.php?leftmenu=donations&mainmenu=accountancy','','List','donations',1,'','$user->rights->don->lire','$conf->don->enabled && $leftmenu==\"donations\"',2,'2016-07-30 11:13:00'),(141984,'auguria',1,'','left','accountancy',139899,NULL,NULL,5,'/compta/deplacement/index.php?leftmenu=tripsandexpenses','','TripsAndExpenses','trips',0,'tripsandexpenses','$user->rights->deplacement->lire','$conf->deplacement->enabled',0,'2016-07-30 11:13:00'),(141985,'auguria',1,'','left','accountancy',141984,NULL,NULL,1,'/compta/deplacement/card.php?action=create&leftmenu=tripsandexpenses','','New','trips',1,'','$user->rights->deplacement->creer','$conf->deplacement->enabled',0,'2016-07-30 11:13:00'),(141986,'auguria',1,'','left','accountancy',141984,NULL,NULL,2,'/compta/deplacement/list.php?leftmenu=tripsandexpenses','','List','trips',1,'','$user->rights->deplacement->lire','$conf->deplacement->enabled',0,'2016-07-30 11:13:00'),(141987,'auguria',1,'','left','accountancy',141984,NULL,NULL,2,'/compta/deplacement/stats/index.php?leftmenu=tripsandexpenses','','Statistics','trips',1,'','$user->rights->deplacement->lire','$conf->deplacement->enabled',0,'2016-07-30 11:13:00'),(142084,'auguria',1,'','left','accountancy',139890,NULL,NULL,6,'/compta/charges/index.php?leftmenu=tax&mainmenu=accountancy','','MenuSpecialExpenses','compta',0,'tax','(! empty($conf->tax->enabled) && $user->rights->tax->charges->lire) || (! empty($conf->salaries->enabled) && $user->rights->salaries->read)','$conf->tax->enabled || $conf->salaries->enabled',0,'2016-07-30 11:13:00'),(142094,'auguria',1,'','left','accountancy',142084,NULL,NULL,1,'/compta/salaries/index.php?leftmenu=tax_salary&mainmenu=accountancy','','Salaries','salaries',1,'tax_sal','$user->rights->salaries->read','$conf->salaries->enabled',0,'2016-07-30 11:13:00'),(142095,'auguria',1,'','left','accountancy',142094,NULL,NULL,2,'/compta/salaries/card.php?leftmenu=tax_salary&action=create','','NewPayment','companies',2,'','$user->rights->salaries->write','$conf->salaries->enabled && $leftmenu==\"tax_salary\"',0,'2016-07-30 11:13:00'),(142096,'auguria',1,'','left','accountancy',142094,NULL,NULL,3,'/compta/salaries/index.php?leftmenu=tax_salary','','Payments','companies',2,'','$user->rights->salaries->read','$conf->salaries->enabled && $leftmenu==\"tax_salary\"',0,'2016-07-30 11:13:00'),(142104,'auguria',1,'','left','accountancy',142084,NULL,NULL,1,'/loan/index.php?leftmenu=tax_loan&mainmenu=accountancy','','Loans','loan',1,'tax_loan','$user->rights->loan->read','$conf->loan->enabled',0,'2016-07-30 11:13:00'),(142105,'auguria',1,'','left','accountancy',142104,NULL,NULL,2,'/loan/card.php?leftmenu=tax_loan&action=create','','NewLoan','loan',2,'','$user->rights->loan->write','$conf->loan->enabled && $leftmenu==\"tax_loan\"',0,'2016-07-30 11:13:00'),(142107,'auguria',1,'','left','accountancy',142104,NULL,NULL,4,'/loan/calc.php?leftmenu=tax_loan','','Calculator','companies',2,'','$user->rights->loan->calc','$conf->loan->enabled && $leftmenu==\"tax_loan\" && ! empty($conf->global->LOAN_SHOW_CALCULATOR)',0,'2016-07-30 11:13:00'),(142134,'auguria',1,'','left','accountancy',142084,NULL,NULL,1,'/compta/sociales/index.php?leftmenu=tax_social','','SocialContributions','',1,'tax_social','$user->rights->tax->charges->lire','$conf->tax->enabled',0,'2016-07-30 11:13:00'),(142135,'auguria',1,'','left','accountancy',142134,NULL,NULL,2,'/compta/sociales/charges.php?leftmenu=tax_social&action=create','','MenuNewSocialContribution','',2,'','$user->rights->tax->charges->creer','$conf->tax->enabled && $leftmenu==\"tax_social\"',0,'2016-07-30 11:13:00'),(142136,'auguria',1,'','left','accountancy',142134,NULL,NULL,3,'/compta/charges/index.php?leftmenu=tax_social&mainmenu=accountancy&mode=sconly','','Payments','',2,'','$user->rights->tax->charges->lire','$conf->tax->enabled && $leftmenu==\"tax_social\"',0,'2016-07-30 11:13:00'),(142184,'auguria',1,'','left','accountancy',142084,NULL,NULL,7,'/compta/tva/index.php?leftmenu=tax_vat&mainmenu=accountancy','','VAT','companies',1,'tax_vat','$user->rights->tax->charges->lire','$conf->tax->enabled && empty($conf->global->TAX_DISABLE_VAT_MENUS)',0,'2016-07-30 11:13:00'),(142185,'auguria',1,'','left','accountancy',142184,NULL,NULL,0,'/compta/tva/card.php?leftmenu=tax_vat&action=create','','New','companies',2,'','$user->rights->tax->charges->creer','$conf->tax->enabled && empty($conf->global->TAX_DISABLE_VAT_MENUS) && $leftmenu==\"tax_vat\"',0,'2016-07-30 11:13:00'),(142186,'auguria',1,'','left','accountancy',142184,NULL,NULL,1,'/compta/tva/reglement.php?leftmenu=tax_vat','','List','companies',2,'','$user->rights->tax->charges->lire','$conf->tax->enabled && empty($conf->global->TAX_DISABLE_VAT_MENUS) && $leftmenu==\"tax_vat\"',0,'2016-07-30 11:13:00'),(142187,'auguria',1,'','left','accountancy',142184,NULL,NULL,2,'/compta/tva/clients.php?leftmenu=tax_vat','','ReportByCustomers','companies',2,'','$user->rights->tax->charges->lire','$conf->tax->enabled && empty($conf->global->TAX_DISABLE_VAT_MENUS) && $leftmenu==\"tax_vat\"',0,'2016-07-30 11:13:00'),(142188,'auguria',1,'','left','accountancy',142184,NULL,NULL,3,'/compta/tva/quadri_detail.php?leftmenu=tax_vat','','ReportByQuarter','companies',2,'','$user->rights->tax->charges->lire','$conf->tax->enabled && empty($conf->global->TAX_DISABLE_VAT_MENUS) && $leftmenu==\"tax_vat\"',0,'2016-07-30 11:13:00'),(142284,'auguria',1,'','left','accountancy',139890,NULL,NULL,7,'/accountancy/customer/index.php?leftmenu=accounting','','MenuAccountancy','accountancy',0,'accounting','! empty($conf->accounting->enabled) || $user->rights->accounting->ventilation->read || $user->rights->accounting->ventilation->dispatch || $user->rights->compta->resultat->lire','$conf->accounting->enabled',0,'2016-07-30 11:13:00'),(142285,'auguria',1,'','left','accountancy',142284,NULL,NULL,1,'/accountancy/customer/index.php?leftmenu=dispatch_customer','','CustomersVentilation','accountancy',1,'dispatch_customer','$user->rights->accounting->ventilation->read','$conf->accounting->enabled',0,'2016-07-30 11:13:00'),(142286,'auguria',1,'','left','accountancy',142285,NULL,NULL,2,'/accountancy/customer/list.php','','ToDispatch','accountancy',2,'','$user->rights->accounting->ventilation->dispatch','$conf->accounting->enabled && $leftmenu==\"dispatch_customer\"',0,'2016-07-30 11:13:00'),(142287,'auguria',1,'','left','accountancy',142285,NULL,NULL,3,'/accountancy/customer/lines.php','','Dispatched','accountancy',2,'','$user->rights->accounting->ventilation->read','$conf->accounting->enabled && $leftmenu==\"dispatch_customer\"',0,'2016-07-30 11:13:00'),(142294,'auguria',1,'','left','accountancy',142284,NULL,NULL,4,'/accountancy/supplier/index.php?leftmenu=dispatch_supplier','','SuppliersVentilation','accountancy',1,'ventil_supplier','$user->rights->accounting->ventilation->read','$conf->accounting->enabled && $conf->fournisseur->enabled',0,'2016-07-30 11:13:00'),(142295,'auguria',1,'','left','accountancy',142294,NULL,NULL,5,'/accountancy/supplier/list.php','','ToDispatch','accountancy',2,'','$user->rights->accounting->ventilation->dispatch','$conf->accounting->enabled && $conf->fournisseur->enabled && $leftmenu==\"dispatch_supplier\"',0,'2016-07-30 11:13:00'),(142296,'auguria',1,'','left','accountancy',142294,NULL,NULL,6,'/accountancy/supplier/lines.php','','Dispatched','accountancy',2,'','$user->rights->accounting->ventilation->read','$conf->accounting->enabled && $conf->fournisseur->enabled && $leftmenu==\"dispatch_supplier\"',0,'2016-07-30 11:13:00'),(142314,'auguria',1,'','left','accountancy',142284,NULL,NULL,15,'/accountancy/bookkeeping/list.php','','Bookkeeping','accountancy',1,'bookkeeping','$user->rights->accounting->mouvements->lire','$conf->accounting->enabled',0,'2016-07-30 11:13:00'),(142319,'auguria',1,'','left','accountancy',142284,NULL,NULL,16,'/accountancy/bookkeeping/balance.php','','AccountBalance','accountancy',1,'balance','$user->rights->accounting->mouvements->lire','$conf->accounting->enabled',0,'2016-07-30 11:13:00'),(142324,'auguria',1,'','left','accountancy',142284,NULL,NULL,17,'/accountancy/report/result.php?leftmenu=ca&mainmenu=accountancy','','Reportings','main',1,'report','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->accounting->enabled',0,'2016-07-30 11:13:00'),(142325,'auguria',1,'','left','accountancy',142324,NULL,NULL,18,'/accountancy/report/result.php?leftmenu=ca','','ReportInOut','main',2,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->accounting->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142326,'auguria',1,'','left','accountancy',142324,NULL,NULL,19,'/compta/resultat/index.php?leftmenu=ca','','ByExpenseIncome','main',3,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->accounting->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142327,'auguria',1,'','left','accountancy',142324,NULL,NULL,20,'/compta/resultat/clientfourn.php?leftmenu=ca','','ByCompanies','main',3,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->accounting->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142328,'auguria',1,'','left','accountancy',142324,NULL,NULL,21,'/compta/stats/index.php?leftmenu=ca','','ReportTurnover','main',2,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->accounting->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142329,'auguria',1,'','left','accountancy',142324,NULL,NULL,22,'/compta/stats/casoc.php?leftmenu=ca','','ByCompanies','main',3,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->accounting->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142330,'auguria',1,'','left','accountancy',142324,NULL,NULL,23,'/compta/stats/cabyuser.php?leftmenu=ca','','ByUsers','main',3,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->accounting->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142331,'auguria',1,'','left','accountancy',142324,NULL,NULL,24,'/compta/stats/cabyprodserv.php?leftmenu=ca','','ByProductsAndServices','main',3,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->accounting->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142335,'auguria',1,'','left','home',142284,NULL,NULL,25,'/accountancy/admin/account.php?mainmenu=accountancy','','Chartofaccounts','admin',1,'','$user->rights->accounting->chartofaccount','$conf->accounting->enabled',0,'2016-07-30 11:13:00'),(142384,'auguria',1,'','left','accountancy',139898,NULL,NULL,9,'/compta/prelevement/index.php?leftmenu=withdraw&mainmenu=bank','','StandingOrders','withdrawals',0,'withdraw','$user->rights->prelevement->bons->lire','$conf->prelevement->enabled',2,'2016-07-30 11:13:00'),(142386,'auguria',1,'','left','accountancy',142384,NULL,NULL,0,'/compta/prelevement/create.php?leftmenu=withdraw','','NewStandingOrder','withdrawals',1,'','$user->rights->prelevement->bons->lire','$conf->prelevement->enabled && $leftmenu==\"withdraw\"',2,'2016-07-30 11:13:00'),(142387,'auguria',1,'','left','accountancy',142384,NULL,NULL,2,'/compta/prelevement/bons.php?leftmenu=withdraw','','WithdrawalsReceipts','withdrawals',1,'','$user->rights->prelevement->bons->lire','$conf->prelevement->enabled && $leftmenu==\"withdraw\"',2,'2016-07-30 11:13:00'),(142388,'auguria',1,'','left','accountancy',142384,NULL,NULL,3,'/compta/prelevement/list.php?leftmenu=withdraw','','WithdrawalsLines','withdrawals',1,'','$user->rights->prelevement->bons->lire','$conf->prelevement->enabled && $leftmenu==\"withdraw\"',2,'2016-07-30 11:13:00'),(142390,'auguria',1,'','left','accountancy',142384,NULL,NULL,5,'/compta/prelevement/rejets.php?leftmenu=withdraw','','Rejects','withdrawals',1,'','$user->rights->prelevement->bons->lire','$conf->prelevement->enabled && $leftmenu==\"withdraw\"',2,'2016-07-30 11:13:00'),(142391,'auguria',1,'','left','accountancy',142384,NULL,NULL,6,'/compta/prelevement/stats.php?leftmenu=withdraw','','Statistics','withdrawals',1,'','$user->rights->prelevement->bons->lire','$conf->prelevement->enabled && $leftmenu==\"withdraw\"',2,'2016-07-30 11:13:00'),(142484,'auguria',1,'','left','accountancy',139898,NULL,NULL,1,'/compta/bank/index.php?leftmenu=bank&mainmenu=bank','','MenuBankCash','banks',0,'bank','$user->rights->banque->lire','$conf->banque->enabled',0,'2016-07-30 11:13:00'),(142485,'auguria',1,'','left','accountancy',142484,NULL,NULL,0,'/compta/bank/card.php?action=create&leftmenu=bank','','MenuNewFinancialAccount','banks',1,'','$user->rights->banque->configurer','$conf->banque->enabled && ($leftmenu==\"bank\" || $leftmenu==\"checks\" || $leftmenu==\"withdraw\")',0,'2016-07-30 11:13:00'),(142487,'auguria',1,'','left','accountancy',142484,NULL,NULL,2,'/compta/bank/search.php?leftmenu=bank','','ListTransactions','banks',1,'','$user->rights->banque->lire','$conf->banque->enabled && ($leftmenu==\"bank\" || $leftmenu==\"checks\" || $leftmenu==\"withdraw\")',0,'2016-07-30 11:13:00'),(142488,'auguria',1,'','left','accountancy',142484,NULL,NULL,3,'/compta/bank/budget.php?leftmenu=bank','','ListTransactionsByCategory','banks',1,'','$user->rights->banque->lire','$conf->banque->enabled && ($leftmenu==\"bank\" || $leftmenu==\"checks\" || $leftmenu==\"withdraw\")',0,'2016-07-30 11:13:00'),(142490,'auguria',1,'','left','accountancy',142484,NULL,NULL,5,'/compta/bank/virement.php?leftmenu=bank','','BankTransfers','banks',1,'','$user->rights->banque->transfer','$conf->banque->enabled && ($leftmenu==\"bank\" || $leftmenu==\"checks\" || $leftmenu==\"withdraw\")',0,'2016-07-30 11:13:00'),(142534,'auguria',1,'','left','accountancy',139898,NULL,NULL,4,'/categories/index.php?leftmenu=cat&type=5','','Categories','categories',0,'cat','$user->rights->categorie->lire','$conf->categorie->enabled',2,'2016-07-30 11:13:00'),(142535,'auguria',1,'','left','accountancy',142534,NULL,NULL,0,'/categories/card.php?action=create&type=5','','NewCategory','categories',1,'','$user->rights->categorie->creer','$conf->categorie->enabled',2,'2016-07-30 11:13:00'),(142584,'auguria',1,'','left','accountancy',139890,NULL,NULL,11,'/compta/resultat/index.php?leftmenu=ca&mainmenu=accountancy','','Reportings','main',0,'ca','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->comptabilite->enabled',0,'2016-07-30 11:13:00'),(142585,'auguria',1,'','left','accountancy',142584,NULL,NULL,0,'/compta/resultat/index.php?leftmenu=ca','','ReportInOut','main',1,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->comptabilite->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142586,'auguria',1,'','left','accountancy',142585,NULL,NULL,0,'/compta/resultat/clientfourn.php?leftmenu=ca','','ByCompanies','main',2,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->comptabilite->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142587,'auguria',1,'','left','accountancy',142584,NULL,NULL,1,'/compta/stats/index.php?leftmenu=ca','','ReportTurnover','main',1,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->comptabilite->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142588,'auguria',1,'','left','accountancy',142587,NULL,NULL,0,'/compta/stats/casoc.php?leftmenu=ca','','ByCompanies','main',2,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->comptabilite->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142589,'auguria',1,'','left','accountancy',142587,NULL,NULL,1,'/compta/stats/cabyuser.php?leftmenu=ca','','ByUsers','main',2,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->comptabilite->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142590,'auguria',1,'','left','accountancy',142584,NULL,NULL,1,'/compta/journal/sellsjournal.php?leftmenu=ca','','SellsJournal','main',1,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->comptabilite->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142591,'auguria',1,'','left','accountancy',142584,NULL,NULL,1,'/compta/journal/purchasesjournal.php?leftmenu=ca','','PurchasesJournal','main',1,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->comptabilite->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142592,'auguria',1,'','left','accountancy',142587,NULL,NULL,1,'/compta/stats/cabyprodserv.php?leftmenu=ca','','ByProductsAndServices','main',2,'','$user->rights->compta->resultat->lire || $user->rights->accounting->comptarapport->lire','$conf->comptabilite->enabled && $leftmenu==\"ca\"',0,'2016-07-30 11:13:00'),(142684,'auguria',1,'','left','products',139887,NULL,NULL,0,'/product/index.php?leftmenu=product&type=0','','Products','products',0,'product','$user->rights->produit->lire','$conf->product->enabled',2,'2016-07-30 11:13:00'),(142685,'auguria',1,'','left','products',142684,NULL,NULL,0,'/product/card.php?leftmenu=product&action=create&type=0','','NewProduct','products',1,'','$user->rights->produit->creer','$conf->product->enabled',2,'2016-07-30 11:13:00'),(142686,'auguria',1,'','left','products',142684,NULL,NULL,1,'/product/list.php?leftmenu=product&type=0','','List','products',1,'','$user->rights->produit->lire','$conf->product->enabled',2,'2016-07-30 11:13:00'),(142687,'auguria',1,'','left','products',142684,NULL,NULL,4,'/product/reassort.php?type=0','','Stocks','products',1,'','$user->rights->produit->lire && $user->rights->stock->lire','$conf->product->enabled',2,'2016-07-30 11:13:00'),(142688,'auguria',1,'','left','products',142684,NULL,NULL,6,'/product/stats/card.php?id=all&leftmenu=stats&type=0','','Statistics','main',1,'','$user->rights->produit->lire','$conf->propal->enabled',2,'2016-07-30 11:13:00'),(142689,'auguria',1,'','left','products',142684,NULL,NULL,5,'/product/reassortlot.php?type=0','','StocksByLotSerial','products',1,'','$user->rights->produit->lire && $user->rights->stock->lire','$conf->productbatch->enabled',2,'2016-07-30 11:13:00'),(142784,'auguria',1,'','left','products',139887,NULL,NULL,1,'/product/index.php?leftmenu=service&type=1','','Services','products',0,'service','$user->rights->service->lire','$conf->service->enabled',2,'2016-07-30 11:13:00'),(142785,'auguria',1,'','left','products',142784,NULL,NULL,0,'/product/card.php?leftmenu=service&action=create&type=1','','NewService','products',1,'','$user->rights->service->creer','$conf->service->enabled',2,'2016-07-30 11:13:00'),(142786,'auguria',1,'','left','products',142784,NULL,NULL,1,'/product/list.php?leftmenu=service&type=1','','List','products',1,'','$user->rights->service->lire','$conf->service->enabled',2,'2016-07-30 11:13:00'),(142787,'auguria',1,'','left','products',142784,NULL,NULL,5,'/product/stats/card.php?id=all&leftmenu=stats&type=1','','Statistics','main',1,'','$user->rights->service->lire','$conf->propal->enabled',2,'2016-07-30 11:13:00'),(142984,'auguria',1,'','left','products',139887,NULL,NULL,3,'/product/stock/index.php?leftmenu=stock','','Stock','stocks',0,'stock','$user->rights->stock->lire','$conf->stock->enabled',2,'2016-07-30 11:13:00'),(142985,'auguria',1,'','left','products',142984,NULL,NULL,0,'/product/stock/card.php?action=create','','MenuNewWarehouse','stocks',1,'','$user->rights->stock->creer','$conf->stock->enabled',2,'2016-07-30 11:13:00'),(142986,'auguria',1,'','left','products',142984,NULL,NULL,1,'/product/stock/list.php','','List','stocks',1,'','$user->rights->stock->lire','$conf->stock->enabled',2,'2016-07-30 11:13:00'),(142988,'auguria',1,'','left','products',142984,NULL,NULL,3,'/product/stock/mouvement.php','','Movements','stocks',1,'','$user->rights->stock->mouvement->lire','$conf->stock->enabled',2,'2016-07-30 11:13:00'),(142989,'auguria',1,'','left','products',142984,NULL,NULL,4,'/product/stock/replenish.php','','Replenishments','stocks',1,'','$user->rights->stock->mouvement->creer && $user->rights->fournisseur->lire','$conf->stock->enabled && $conf->supplier_order->enabled',2,'2016-07-30 11:13:00'),(142990,'auguria',1,'','left','products',142984,NULL,NULL,5,'/product/stock/massstockmove.php','','MassStockTransferShort','stocks',1,'','$user->rights->stock->mouvement->creer','$conf->stock->enabled',2,'2016-07-30 11:13:00'),(143084,'auguria',1,'','left','products',139887,NULL,NULL,4,'/categories/index.php?leftmenu=cat&type=0','','Categories','categories',0,'cat','$user->rights->categorie->lire','$conf->categorie->enabled',2,'2016-07-30 11:13:00'),(143085,'auguria',1,'','left','products',143084,NULL,NULL,0,'/categories/card.php?action=create&type=0','','NewCategory','categories',1,'','$user->rights->categorie->creer','$conf->categorie->enabled',2,'2016-07-30 11:13:00'),(143484,'auguria',1,'','left','project',139891,NULL,NULL,0,'/projet/index.php?leftmenu=projects','','Projects','projects',0,'projects','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143485,'auguria',1,'','left','project',143484,NULL,NULL,1,'/projet/card.php?leftmenu=projects&action=create','','NewProject','projects',1,'','$user->rights->projet->creer','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143486,'auguria',1,'','left','project',143484,NULL,NULL,2,'/projet/list.php?leftmenu=projects','','List','projects',1,'','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143494,'auguria',1,'','left','project',139891,NULL,NULL,0,'/projet/index.php?leftmenu=projects&mode=mine','','MyProjects','projects',0,'myprojects','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143495,'auguria',1,'','left','project',143494,NULL,NULL,1,'/projet/card.php?leftmenu=projects&action=create&mode=mine','','NewProject','projects',1,'','$user->rights->projet->creer','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143496,'auguria',1,'','left','project',143494,NULL,NULL,2,'/projet/list.php?leftmenu=projects&mode=mine','','List','projects',1,'','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143584,'auguria',1,'','left','project',139891,NULL,NULL,0,'/projet/activity/index.php?leftmenu=projects','','Activities','projects',0,'','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143585,'auguria',1,'','left','project',143584,NULL,NULL,1,'/projet/tasks.php?leftmenu=projects&action=create','','NewTask','projects',1,'','$user->rights->projet->creer','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143586,'auguria',1,'','left','project',143584,NULL,NULL,2,'/projet/tasks/list.php?leftmenu=projects','','List','projects',1,'','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143587,'auguria',1,'','left','project',143584,NULL,NULL,3,'/projet/activity/perweek.php?leftmenu=projects','','NewTimeSpent','projects',1,'','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143684,'auguria',1,'','left','project',139891,NULL,NULL,0,'/projet/activity/index.php?leftmenu=projects&mode=mine','','MyActivities','projects',0,'','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143685,'auguria',1,'','left','project',143684,NULL,NULL,1,'/projet/tasks.php?leftmenu=projects&action=create','','NewTask','projects',1,'','$user->rights->projet->creer','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143686,'auguria',1,'','left','project',143684,NULL,NULL,2,'/projet/tasks/list.php?leftmenu=projects&mode=mine','','List','projects',1,'','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143687,'auguria',1,'','left','project',143684,NULL,NULL,3,'/projet/activity/perweek.php?leftmenu=projects&mode=mine','','NewTimeSpent','projects',1,'','$user->rights->projet->lire','$conf->projet->enabled',2,'2016-07-30 11:13:00'),(143784,'auguria',1,'','left','tools',139892,NULL,NULL,0,'/comm/mailing/index.php?leftmenu=mailing','','EMailings','mails',0,'mailing','$user->rights->mailing->lire','$conf->mailing->enabled',0,'2016-07-30 11:13:00'),(143785,'auguria',1,'','left','tools',143784,NULL,NULL,0,'/comm/mailing/card.php?leftmenu=mailing&action=create','','NewMailing','mails',1,'','$user->rights->mailing->creer','$conf->mailing->enabled',0,'2016-07-30 11:13:00'),(143786,'auguria',1,'','left','tools',143784,NULL,NULL,1,'/comm/mailing/list.php?leftmenu=mailing','','List','mails',1,'','$user->rights->mailing->lire','$conf->mailing->enabled',0,'2016-07-30 11:13:00'),(143984,'auguria',1,'','left','tools',139892,NULL,NULL,2,'/exports/index.php?leftmenu=export','','FormatedExport','exports',0,'export','$user->rights->export->lire','$conf->export->enabled',2,'2016-07-30 11:13:00'),(143985,'auguria',1,'','left','tools',143984,NULL,NULL,0,'/exports/export.php?leftmenu=export','','NewExport','exports',1,'','$user->rights->export->creer','$conf->export->enabled',2,'2016-07-30 11:13:00'),(144014,'auguria',1,'','left','tools',139892,NULL,NULL,2,'/imports/index.php?leftmenu=import','','FormatedImport','exports',0,'import','$user->rights->import->run','$conf->import->enabled',2,'2016-07-30 11:13:00'),(144015,'auguria',1,'','left','tools',144014,NULL,NULL,0,'/imports/import.php?leftmenu=import','','NewImport','exports',1,'','$user->rights->import->run','$conf->import->enabled',2,'2016-07-30 11:13:00'),(144084,'auguria',1,'','left','members',139897,NULL,NULL,0,'/adherents/index.php?leftmenu=members&mainmenu=members','','Members','members',0,'members','$user->rights->adherent->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144085,'auguria',1,'','left','members',144084,NULL,NULL,0,'/adherents/card.php?leftmenu=members&action=create','','NewMember','members',1,'','$user->rights->adherent->creer','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144086,'auguria',1,'','left','members',144084,NULL,NULL,1,'/adherents/list.php','','List','members',1,'','$user->rights->adherent->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144087,'auguria',1,'','left','members',144086,NULL,NULL,2,'/adherents/list.php?leftmenu=members&statut=-1','','MenuMembersToValidate','members',2,'','$user->rights->adherent->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144088,'auguria',1,'','left','members',144086,NULL,NULL,3,'/adherents/list.php?leftmenu=members&statut=1','','MenuMembersValidated','members',2,'','$user->rights->adherent->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144089,'auguria',1,'','left','members',144086,NULL,NULL,4,'/adherents/list.php?leftmenu=members&statut=1&filter=outofdate','','MenuMembersNotUpToDate','members',2,'','$user->rights->adherent->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144090,'auguria',1,'','left','members',144086,NULL,NULL,5,'/adherents/list.php?leftmenu=members&statut=1&filter=uptodate','','MenuMembersUpToDate','members',2,'','$user->rights->adherent->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144091,'auguria',1,'','left','members',144086,NULL,NULL,6,'/adherents/list.php?leftmenu=members&statut=0','','MenuMembersResiliated','members',2,'','$user->rights->adherent->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144092,'auguria',1,'','left','members',144084,NULL,NULL,7,'/adherents/stats/geo.php?leftmenu=members&mode=memberbycountry','','MenuMembersStats','members',1,'','$user->rights->adherent->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144184,'auguria',1,'','left','members',139897,NULL,NULL,1,'/adherents/index.php?leftmenu=members&mainmenu=members','','Subscriptions','compta',0,'','$user->rights->adherent->cotisation->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144185,'auguria',1,'','left','members',144184,NULL,NULL,0,'/adherents/list.php?statut=-1&leftmenu=accountancy&mainmenu=members','','NewSubscription','compta',1,'','$user->rights->adherent->cotisation->creer','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144186,'auguria',1,'','left','members',144184,NULL,NULL,1,'/adherents/cotisations.php?leftmenu=members','','List','compta',1,'','$user->rights->adherent->cotisation->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144187,'auguria',1,'','left','members',144184,NULL,NULL,7,'/adherents/stats/index.php?leftmenu=members','','MenuMembersStats','members',1,'','$user->rights->adherent->lire','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144384,'auguria',1,'','left','members',139897,NULL,NULL,3,'/adherents/index.php?leftmenu=export&mainmenu=members','','Exports','members',0,'export','$user->rights->adherent->export','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144385,'auguria',1,'','left','members',144384,NULL,NULL,0,'/exports/index.php?leftmenu=export','','Datas','members',1,'','$user->rights->adherent->export','$conf->adherent->enabled && $conf->export->enabled',2,'2016-07-30 11:13:00'),(144386,'auguria',1,'','left','members',144384,NULL,NULL,1,'/adherents/htpasswd.php?leftmenu=export','','Filehtpasswd','members',1,'','$user->rights->adherent->export','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144387,'auguria',1,'','left','members',144384,NULL,NULL,2,'/adherents/cartes/carte.php?leftmenu=export','','MembersCards','members',1,'','$user->rights->adherent->export','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144484,'auguria',1,'','left','hrm',139899,NULL,NULL,1,'/user/index.php?&leftmenu=hrm&mode=employee','','Employees','hrm',0,'hrm','$user->rights->hrm->employee->read','$conf->hrm->enabled',0,'2016-07-30 11:13:00'),(144485,'auguria',1,'','left','hrm',144484,NULL,NULL,1,'/user/card.php?&action=create','','NewEmployee','hrm',1,'','$user->rights->hrm->employee->write','$conf->hrm->enabled',0,'2016-07-30 11:13:00'),(144486,'auguria',1,'','left','hrm',144484,NULL,NULL,2,'/user/index.php?$leftmenu=hrm&mode=employee','','List','hrm',1,'','$user->rights->hrm->employee->read','$conf->hrm->enabled',0,'2016-07-30 11:13:00'),(144584,'auguria',1,'','left','members',139897,NULL,NULL,5,'/adherents/type.php?leftmenu=setup&mainmenu=members','','MembersTypes','members',0,'setup','$user->rights->adherent->configurer','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144585,'auguria',1,'','left','members',144584,NULL,NULL,0,'/adherents/type.php?leftmenu=setup&mainmenu=members&action=create','','New','members',1,'','$user->rights->adherent->configurer','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144586,'auguria',1,'','left','members',144584,NULL,NULL,1,'/adherents/type.php?leftmenu=setup&mainmenu=members','','List','members',1,'','$user->rights->adherent->configurer','$conf->adherent->enabled',2,'2016-07-30 11:13:00'),(144884,'auguria',1,'','left','hrm',139899,NULL,NULL,1,'/holiday/list.php?&leftmenu=hrm','','CPTitreMenu','holiday',0,'hrm','$user->rights->holiday->read','$conf->holiday->enabled',0,'2016-07-30 11:13:00'),(144885,'auguria',1,'','left','hrm',144884,NULL,NULL,1,'/holiday/card.php?&action=request','','MenuAddCP','holiday',1,'','$user->rights->holiday->write','$conf->holiday->enabled',0,'2016-07-30 11:13:00'),(144886,'auguria',1,'','left','hrm',144884,NULL,NULL,1,'/holiday/list.php?&leftmenu=hrm','','List','holiday',1,'','$user->rights->holiday->read','$conf->holiday->enabled',0,'2016-07-30 11:13:00'),(144887,'auguria',1,'','left','hrm',144886,NULL,NULL,1,'/holiday/list.php?select_statut=2&leftmenu=hrm','','ListToApprove','trips',2,'','$user->rights->holiday->read','$conf->holiday->enabled',0,'2016-07-30 11:13:00'),(144888,'auguria',1,'','left','hrm',144884,NULL,NULL,2,'/holiday/define_holiday.php?&action=request','','MenuConfCP','holiday',1,'','$user->rights->holiday->define_holiday','$conf->holiday->enabled',0,'2016-07-30 11:13:00'),(144889,'auguria',1,'','left','hrm',144884,NULL,NULL,3,'/holiday/view_log.php?&action=request','','MenuLogCP','holiday',1,'','$user->rights->holiday->define_holiday','$conf->holiday->enabled',0,'2016-07-30 11:13:00'),(144984,'auguria',1,'','left','commercial',139889,NULL,NULL,6,'/fourn/commande/index.php?leftmenu=orders_suppliers','','SuppliersOrders','orders',0,'orders_suppliers','$user->rights->fournisseur->commande->lire','$conf->supplier_order->enabled',2,'2016-07-30 11:13:00'),(144985,'auguria',1,'','left','commercial',144984,NULL,NULL,0,'/fourn/commande/card.php?action=create&leftmenu=orders_suppliers','','NewOrder','orders',1,'','$user->rights->fournisseur->commande->creer','$conf->supplier_order->enabled',2,'2016-07-30 11:13:00'),(144986,'auguria',1,'','left','commercial',144984,NULL,NULL,1,'/fourn/commande/list.php?leftmenu=orders_suppliers&viewstatut=0','','List','orders',1,'','$user->rights->fournisseur->commande->lire','$conf->supplier_order->enabled',2,'2016-07-30 11:13:00'),(144992,'auguria',1,'','left','commercial',144984,NULL,NULL,7,'/commande/stats/index.php?leftmenu=orders_suppliers&mode=supplier','','Statistics','orders',1,'','$user->rights->fournisseur->commande->lire','$conf->supplier_order->enabled',2,'2016-07-30 11:13:00'),(145084,'auguria',1,'','left','members',139897,NULL,NULL,3,'/categories/index.php?leftmenu=cat&type=3','','MembersCategoriesShort','categories',0,'cat','$user->rights->categorie->lire','$conf->adherent->enabled && $conf->categorie->enabled',2,'2016-07-30 11:13:00'),(145085,'auguria',1,'','left','members',145084,NULL,NULL,0,'/categories/card.php?action=create&type=3','','NewCategory','categories',1,'','$user->rights->categorie->creer','$conf->adherent->enabled && $conf->categorie->enabled',2,'2016-07-30 11:13:00'),(145086,'all',1,'supplier_proposal','left','commercial',-1,NULL,'commercial',300,'/supplier_proposal/index.php','','SupplierProposalsShort','supplier_proposal',NULL,'supplier_proposalsubmenu','$user->rights->supplier_proposal->lire','$conf->supplier_proposal->enabled',2,'2016-07-30 11:13:20'),(145087,'all',1,'supplier_proposal','left','commercial',-1,'supplier_proposalsubmenu','commercial',301,'/supplier_proposal/card.php?action=create&leftmenu=supplier_proposals','','SupplierProposalNew','supplier_proposal',NULL,NULL,'$user->rights->supplier_proposal->creer','$conf->supplier_proposal->enabled',2,'2016-07-30 11:13:20'),(145088,'all',1,'supplier_proposal','left','commercial',-1,'supplier_proposalsubmenu','commercial',302,'/supplier_proposal/list.php?leftmenu=supplier_proposals','','List','supplier_proposal',NULL,NULL,'$user->rights->supplier_proposal->lire','$conf->supplier_proposal->enabled',2,'2016-07-30 11:13:20'),(145089,'all',1,'supplier_proposal','left','commercial',-1,'supplier_proposalsubmenu','commercial',303,'/comm/propal/stats/index.php?leftmenu=supplier_proposals&mode=supplier','','Statistics','supplier_proposal',NULL,NULL,'$user->rights->supplier_proposal->lire','$conf->supplier_proposal->enabled',2,'2016-07-30 11:13:20'),(145090,'all',1,'resource','left','tools',-1,NULL,'tools',100,'/resource/list.php','','MenuResourceIndex','resource',NULL,'resource','$user->rights->resource->read','1',0,'2016-07-30 11:13:32'),(145091,'all',1,'resource','left','tools',-1,'resource','tools',101,'/resource/add.php','','MenuResourceAdd','resource',NULL,NULL,'$user->rights->resource->read','1',0,'2016-07-30 11:13:32'),(145092,'all',1,'resource','left','tools',-1,'resource','tools',102,'/resource/list.php','','List','resource',NULL,NULL,'$user->rights->resource->read','1',0,'2016-07-30 11:13:32'),(145094,'all',1,'agenda','top','agenda',0,NULL,NULL,100,'/comm/action/index.php','','Agenda','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145095,'all',1,'agenda','left','agenda',145094,NULL,NULL,100,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda','','Actions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145096,'all',1,'agenda','left','agenda',145095,NULL,NULL,101,'/comm/action/card.php?mainmenu=agenda&leftmenu=agenda&action=create','','NewAction','commercial',NULL,NULL,'($user->rights->agenda->myactions->create||$user->rights->agenda->allactions->create)','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145097,'all',1,'agenda','left','agenda',145095,NULL,NULL,102,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda','','Agenda','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145098,'all',1,'agenda','left','agenda',145097,NULL,NULL,103,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda&status=todo&filter=mine','','MenuToDoMyActions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145099,'all',1,'agenda','left','agenda',145097,NULL,NULL,104,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda&status=done&filter=mine','','MenuDoneMyActions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145100,'all',1,'agenda','left','agenda',145097,NULL,NULL,105,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda&status=todo&filtert=-1','','MenuToDoActions','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$user->rights->agenda->allactions->read',2,'2016-07-30 15:42:32'),(145101,'all',1,'agenda','left','agenda',145097,NULL,NULL,106,'/comm/action/index.php?mainmenu=agenda&leftmenu=agenda&status=done&filtert=-1','','MenuDoneActions','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$user->rights->agenda->allactions->read',2,'2016-07-30 15:42:32'),(145102,'all',1,'agenda','left','agenda',145095,NULL,NULL,112,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda','','List','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145103,'all',1,'agenda','left','agenda',145102,NULL,NULL,113,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda&status=todo&filter=mine','','MenuToDoMyActions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145104,'all',1,'agenda','left','agenda',145102,NULL,NULL,114,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda&status=done&filter=mine','','MenuDoneMyActions','agenda',NULL,NULL,'$user->rights->agenda->myactions->read','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145105,'all',1,'agenda','left','agenda',145102,NULL,NULL,115,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda&status=todo&filtert=-1','','MenuToDoActions','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$user->rights->agenda->allactions->read',2,'2016-07-30 15:42:32'),(145106,'all',1,'agenda','left','agenda',145102,NULL,NULL,116,'/comm/action/listactions.php?mainmenu=agenda&leftmenu=agenda&status=done&filtert=-1','','MenuDoneActions','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$user->rights->agenda->allactions->read',2,'2016-07-30 15:42:32'),(145107,'all',1,'agenda','left','agenda',145095,NULL,NULL,120,'/comm/action/rapport/index.php?mainmenu=agenda&leftmenu=agenda','','Reportings','agenda',NULL,NULL,'$user->rights->agenda->allactions->read','$conf->agenda->enabled',2,'2016-07-30 15:42:32'),(145111,'all',1,'opensurvey','left','tools',-1,NULL,'tools',200,'/opensurvey/index.php?mainmenu=tools&leftmenu=opensurvey','','Survey','opensurvey',NULL,'opensurvey','$user->rights->opensurvey->read','$conf->opensurvey->enabled',0,'2016-07-30 19:04:07'),(145112,'all',1,'opensurvey','left','tools',-1,'opensurvey','tools',210,'/opensurvey/wizard/index.php','','NewSurvey','opensurvey',NULL,'opensurvey_new','$user->rights->opensurvey->write','$conf->opensurvey->enabled',0,'2016-07-30 19:04:07'),(145113,'all',1,'opensurvey','left','tools',-1,'opensurvey','tools',220,'/opensurvey/list.php','','List','opensurvey',NULL,'opensurvey_list','$user->rights->opensurvey->read','$conf->opensurvey->enabled',0,'2016-07-30 19:04:07'),(145127,'all',1,'printing','left','home',-1,'admintools','home',300,'/printing/index.php?mainmenu=home&leftmenu=admintools','','MenuDirectPrinting','printing',NULL,NULL,'$user->rights->printing->read','$conf->printing->enabled && $leftmenu==\'admintools\'',0,'2017-01-29 15:12:44'),(145149,'all',1,'barcode','left','tools',-1,NULL,'tools',200,'/barcode/printsheet.php?mainmenu=tools&leftmenu=barcodeprint','','BarCodePrintsheet','products',NULL,'barcodeprint','($conf->global->MAIN_USE_ADVANCED_PERMS && $user->rights->barcode->lire_advance) || (! $conf->global->MAIN_USE_ADVANCED_PERMS)','$conf->barcode->enabled',2,'2017-05-12 09:02:42'),(145150,'all',1,'barcode','left','home',-1,'admintools','home',300,'/barcode/codeinit.php?mainmenu=home&leftmenu=admintools','','MassBarcodeInit','products',NULL,NULL,'($conf->global->MAIN_USE_ADVANCED_PERMS && $user->rights->barcode->creer_advance) || (! $conf->global->MAIN_USE_ADVANCED_PERMS)','$conf->barcode->enabled && ($leftmenu==\"admintools\" || $leftmenu==\"admintools_info\")',0,'2017-05-12 09:02:42'),(145151,'all',1,'cron','left','home',-1,'admintools','home',200,'/cron/list.php?status=-2&leftmenu=admintools','','CronList','cron',NULL,NULL,'$user->rights->cron->read','($leftmenu==\'admintools\' || $leftmenu==\'admintools_info\')',2,'2017-05-12 09:02:42'); /*!40000 ALTER TABLE `llx_menu` ENABLE KEYS */; UNLOCK TABLES; @@ -6966,6 +6969,7 @@ CREATE TABLE `llx_product_fournisseur_price` ( `charges` double(24,8) DEFAULT '0.00000000', `unitcharges` double(24,8) DEFAULT '0.00000000', `tva_tx` double(6,3) NOT NULL DEFAULT '0.000', + `default_vat_code` varchar(10) DEFAULT NULL, `info_bits` int(11) NOT NULL DEFAULT '0', `fk_user` int(11) DEFAULT NULL, `import_key` varchar(14) DEFAULT NULL, @@ -6990,7 +6994,7 @@ CREATE TABLE `llx_product_fournisseur_price` ( LOCK TABLES `llx_product_fournisseur_price` WRITE; /*!40000 ALTER TABLE `llx_product_fournisseur_price` DISABLE KEYS */; -INSERT INTO `llx_product_fournisseur_price` VALUES (1,'2010-07-11 18:45:42','2012-12-08 13:11:08',4,1,'ABCD',NULL,10.00000000,1,0,0,10.00000000,0.00000000,0.00000000,0.000,0,1,NULL,1,NULL,NULL,NULL,NULL),(2,'2016-07-30 17:34:38','2016-07-30 13:34:38',12,10,'BASIC',0,9.00000000,1,0,0,9.00000000,0.00000000,0.00000000,0.000,0,12,NULL,1,NULL,NULL,NULL,'FAVORITE'),(3,'2017-02-02 05:17:08','2017-02-02 01:17:08',1,10,'aaa',0,100.00000000,1,10,0,100.00000000,0.00000000,0.00000000,12.500,0,12,NULL,1,NULL,NULL,NULL,NULL); +INSERT INTO `llx_product_fournisseur_price` VALUES (1,'2010-07-11 18:45:42','2012-12-08 13:11:08',4,1,'ABCD',NULL,10.00000000,1,0,0,10.00000000,0.00000000,0.00000000,0.000,NULL,0,1,NULL,1,NULL,NULL,NULL,NULL),(2,'2016-07-30 17:34:38','2016-07-30 13:34:38',12,10,'BASIC',0,9.00000000,1,0,0,9.00000000,0.00000000,0.00000000,0.000,NULL,0,12,NULL,1,NULL,NULL,NULL,'FAVORITE'),(3,'2017-02-02 05:17:08','2017-02-02 01:17:08',1,10,'aaa',0,100.00000000,1,10,0,100.00000000,0.00000000,0.00000000,12.500,NULL,0,12,NULL,1,NULL,NULL,NULL,NULL); /*!40000 ALTER TABLE `llx_product_fournisseur_price` ENABLE KEYS */; UNLOCK TABLES; @@ -7125,7 +7129,7 @@ CREATE TABLE `llx_product_price` ( `entity` int(11) NOT NULL DEFAULT '1', `tms` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `fk_product` int(11) NOT NULL, - `date_price` datetime NOT NULL, + `date_price` datetime DEFAULT NULL, `price_level` smallint(6) DEFAULT '1', `price` double(24,8) DEFAULT NULL, `price_ttc` double(24,8) DEFAULT NULL, @@ -7133,6 +7137,7 @@ CREATE TABLE `llx_product_price` ( `price_min_ttc` double(24,8) DEFAULT NULL, `price_base_type` varchar(3) DEFAULT 'HT', `tva_tx` double(6,3) NOT NULL, + `default_vat_code` varchar(10) DEFAULT NULL, `recuperableonly` int(11) NOT NULL DEFAULT '0', `localtax1_tx` double(6,3) DEFAULT '0.000', `localtax1_type` varchar(10) NOT NULL DEFAULT '0', @@ -7160,7 +7165,7 @@ CREATE TABLE `llx_product_price` ( LOCK TABLES `llx_product_price` WRITE; /*!40000 ALTER TABLE `llx_product_price` DISABLE KEYS */; -INSERT INTO `llx_product_price` VALUES (1,1,'2010-07-08 12:33:17',1,'2010-07-08 14:33:17',1,0.00000000,0.00000000,0.00000000,0.00000000,'HT',12.500,0,0.000,'0',0.000,'0',1,1,0,NULL,NULL,NULL,NULL,0.00000000),(2,1,'2010-07-08 22:30:01',2,'2010-07-09 00:30:01',1,0.00000000,0.00000000,0.00000000,0.00000000,'HT',12.500,0,0.000,'0',0.000,'0',1,1,0,NULL,NULL,NULL,NULL,0.00000000),(3,1,'2010-07-08 22:30:25',3,'2010-07-09 00:30:25',1,0.00000000,0.00000000,0.00000000,0.00000000,'HT',12.500,0,0.000,'0',0.000,'0',1,1,0,NULL,NULL,NULL,NULL,0.00000000),(4,1,'2010-07-10 12:44:06',4,'2010-07-10 14:44:06',1,0.00000000,0.00000000,0.00000000,0.00000000,'HT',12.500,0,0.000,'0',0.000,'0',1,1,0,NULL,NULL,NULL,NULL,0.00000000),(5,1,'2011-07-20 21:11:38',5,'2011-07-20 23:11:38',1,0.00000000,0.00000000,0.00000000,0.00000000,'HT',19.600,0,0.000,'0',0.000,'0',1,1,0,NULL,NULL,NULL,NULL,0.00000000),(6,1,'2011-07-27 17:02:59',5,'2011-07-27 19:02:59',1,10.00000000,11.96000000,0.00000000,0.00000000,'HT',19.600,0,0.000,'0',0.000,'0',1,1,0,NULL,NULL,NULL,NULL,0.00000000),(10,1,'2011-07-31 22:34:27',4,'2011-08-01 00:34:27',1,5.00000000,5.62500000,0.00000000,0.00000000,'HT',12.500,0,0.000,'0',0.000,'0',1,1,0,NULL,NULL,NULL,NULL,0.00000000),(12,1,'2013-01-13 19:24:59',11,'2013-01-13 20:24:59',1,0.00000000,0.00000000,0.00000000,0.00000000,'HT',0.000,0,0.000,'0',0.000,'0',1,1,0,NULL,NULL,NULL,NULL,0.00000000),(13,1,'2013-03-12 09:30:24',1,'2013-03-12 10:30:24',1,100.00000000,112.50000000,90.00000000,101.25000000,'HT',12.500,0,0.000,'0',0.000,'0',1,1,0,NULL,NULL,NULL,NULL,0.00000000),(14,1,'2016-07-30 13:31:29',12,'2016-07-30 17:31:29',1,9.00000000,9.00000000,9.00000000,9.00000000,'HT',0.000,0,0.000,'0',0.000,'0',12,1,0,NULL,NULL,NULL,NULL,0.00000000),(15,1,'2017-02-15 23:49:00',13,'2017-02-16 03:49:00',1,100.00000000,110.00000000,0.00000000,0.00000000,'HT',10.000,0,0.000,'0',0.000,'0',12,0,0,NULL,NULL,NULL,NULL,0.00000000); +INSERT INTO `llx_product_price` VALUES (1,1,'2010-07-08 12:33:17',1,'2010-07-08 14:33:17',1,0.00000000,0.00000000,0.00000000,0.00000000,'HT',12.500,NULL,0,0.000,'0',0.000,'0',1,1,0,NULL,NULL,NULL,NULL,0.00000000),(2,1,'2010-07-08 22:30:01',2,'2010-07-09 00:30:01',1,0.00000000,0.00000000,0.00000000,0.00000000,'HT',12.500,NULL,0,0.000,'0',0.000,'0',1,1,0,NULL,NULL,NULL,NULL,0.00000000),(3,1,'2010-07-08 22:30:25',3,'2010-07-09 00:30:25',1,0.00000000,0.00000000,0.00000000,0.00000000,'HT',12.500,NULL,0,0.000,'0',0.000,'0',1,1,0,NULL,NULL,NULL,NULL,0.00000000),(4,1,'2010-07-10 12:44:06',4,'2010-07-10 14:44:06',1,0.00000000,0.00000000,0.00000000,0.00000000,'HT',12.500,NULL,0,0.000,'0',0.000,'0',1,1,0,NULL,NULL,NULL,NULL,0.00000000),(5,1,'2011-07-20 21:11:38',5,'2011-07-20 23:11:38',1,0.00000000,0.00000000,0.00000000,0.00000000,'HT',19.600,NULL,0,0.000,'0',0.000,'0',1,1,0,NULL,NULL,NULL,NULL,0.00000000),(6,1,'2011-07-27 17:02:59',5,'2011-07-27 19:02:59',1,10.00000000,11.96000000,0.00000000,0.00000000,'HT',19.600,NULL,0,0.000,'0',0.000,'0',1,1,0,NULL,NULL,NULL,NULL,0.00000000),(10,1,'2011-07-31 22:34:27',4,'2011-08-01 00:34:27',1,5.00000000,5.62500000,0.00000000,0.00000000,'HT',12.500,NULL,0,0.000,'0',0.000,'0',1,1,0,NULL,NULL,NULL,NULL,0.00000000),(12,1,'2013-01-13 19:24:59',11,'2013-01-13 20:24:59',1,0.00000000,0.00000000,0.00000000,0.00000000,'HT',0.000,NULL,0,0.000,'0',0.000,'0',1,1,0,NULL,NULL,NULL,NULL,0.00000000),(13,1,'2013-03-12 09:30:24',1,'2013-03-12 10:30:24',1,100.00000000,112.50000000,90.00000000,101.25000000,'HT',12.500,NULL,0,0.000,'0',0.000,'0',1,1,0,NULL,NULL,NULL,NULL,0.00000000),(14,1,'2016-07-30 13:31:29',12,'2016-07-30 17:31:29',1,9.00000000,9.00000000,9.00000000,9.00000000,'HT',0.000,NULL,0,0.000,'0',0.000,'0',12,1,0,NULL,NULL,NULL,NULL,0.00000000),(15,1,'2017-02-15 23:49:00',13,'2017-02-16 03:49:00',1,100.00000000,110.00000000,0.00000000,0.00000000,'HT',10.000,NULL,0,0.000,'0',0.000,'0',12,0,0,NULL,NULL,NULL,NULL,0.00000000); /*!40000 ALTER TABLE `llx_product_price` ENABLE KEYS */; UNLOCK TABLES; @@ -7823,7 +7828,7 @@ CREATE TABLE `llx_rights_def` ( LOCK TABLES `llx_rights_def` WRITE; /*!40000 ALTER TABLE `llx_rights_def` DISABLE KEYS */; -INSERT INTO `llx_rights_def` VALUES (11,'Lire les factures','facture',1,'lire',NULL,'a',0),(11,'Lire les factures','facture',2,'lire',NULL,'a',1),(12,'Creer/modifier les factures','facture',1,'creer',NULL,'a',0),(12,'Creer/modifier les factures','facture',2,'creer',NULL,'a',0),(13,'Dévalider les factures','facture',1,'invoice_advance','unvalidate','a',0),(13,'Dévalider les factures','facture',2,'invoice_advance','unvalidate','a',0),(14,'Valider les factures','facture',1,'invoice_advance','validate','a',0),(14,'Valider les factures','facture',2,'valider',NULL,'a',0),(15,'Envoyer les factures par mail','facture',1,'invoice_advance','send','a',0),(15,'Envoyer les factures par mail','facture',2,'invoice_advance','send','a',0),(16,'Emettre des paiements sur les factures','facture',1,'paiement',NULL,'a',0),(16,'Emettre des paiements sur les factures','facture',2,'paiement',NULL,'a',0),(19,'Supprimer les factures','facture',1,'supprimer',NULL,'a',0),(19,'Supprimer les factures','facture',2,'supprimer',NULL,'a',0),(21,'Lire les propositions commerciales','propale',1,'lire',NULL,'r',1),(21,'Lire les propositions commerciales','propale',2,'lire',NULL,'r',1),(22,'Creer/modifier les propositions commerciales','propale',1,'creer',NULL,'w',0),(22,'Creer/modifier les propositions commerciales','propale',2,'creer',NULL,'w',0),(24,'Valider les propositions commerciales','propale',1,'propal_advance','validate','d',0),(24,'Valider les propositions commerciales','propale',2,'valider',NULL,'d',0),(25,'Envoyer les propositions commerciales aux clients','propale',1,'propal_advance','send','d',0),(25,'Envoyer les propositions commerciales aux clients','propale',2,'propal_advance','send','d',0),(26,'Cloturer les propositions commerciales','propale',1,'cloturer',NULL,'d',0),(26,'Cloturer les propositions commerciales','propale',2,'cloturer',NULL,'d',0),(27,'Supprimer les propositions commerciales','propale',1,'supprimer',NULL,'d',0),(27,'Supprimer les propositions commerciales','propale',2,'supprimer',NULL,'d',0),(28,'Exporter les propositions commerciales et attributs','propale',1,'export',NULL,'r',0),(28,'Exporter les propositions commerciales et attributs','propale',2,'export',NULL,'r',0),(31,'Lire les produits','produit',1,'lire',NULL,'r',1),(31,'Lire les produits','produit',2,'lire',NULL,'r',1),(32,'Creer/modifier les produits','produit',1,'creer',NULL,'w',0),(32,'Creer/modifier les produits','produit',2,'creer',NULL,'w',0),(34,'Supprimer les produits','produit',1,'supprimer',NULL,'d',0),(34,'Supprimer les produits','produit',2,'supprimer',NULL,'d',0),(38,'Exporter les produits','produit',1,'export',NULL,'r',0),(38,'Exporter les produits','produit',2,'export',NULL,'r',0),(41,'Read projects and tasks (shared projects or projects I am contact for). Can also enter time consumed on assigned tasks (timesheet)','projet',1,'lire',NULL,'r',1),(42,'Create/modify projects and tasks (shared projects or projects I am contact for)','projet',1,'creer',NULL,'w',0),(44,'Delete project and tasks (shared projects or projects I am contact for)','projet',1,'supprimer',NULL,'d',0),(45,'Export projects','projet',1,'export',NULL,'d',0),(61,'Lire les fiches d\'intervention','ficheinter',1,'lire',NULL,'r',1),(62,'Creer/modifier les fiches d\'intervention','ficheinter',1,'creer',NULL,'w',0),(64,'Supprimer les fiches d\'intervention','ficheinter',1,'supprimer',NULL,'d',0),(67,'Exporter les fiches interventions','ficheinter',1,'export',NULL,'r',0),(68,'Envoyer les fiches d\'intervention par courriel','ficheinter',1,'ficheinter_advance','send','r',0),(69,'Valider les fiches d\'intervention ','ficheinter',1,'ficheinter_advance','validate','a',0),(70,'Dévalider les fiches d\'intervention','ficheinter',1,'ficheinter_advance','unvalidate','a',0),(71,'Read members\' card','adherent',1,'lire',NULL,'r',1),(72,'Create/modify members (need also user module permissions if member linked to a user)','adherent',1,'creer',NULL,'w',0),(74,'Remove members','adherent',1,'supprimer',NULL,'d',0),(75,'Setup types of membership','adherent',1,'configurer',NULL,'w',0),(76,'Export members','adherent',1,'export',NULL,'r',0),(78,'Read subscriptions','adherent',1,'cotisation','lire','r',1),(79,'Create/modify/remove subscriptions','adherent',1,'cotisation','creer','w',0),(81,'Lire les commandes clients','commande',1,'lire',NULL,'r',1),(82,'Creer/modifier les commandes clients','commande',1,'creer',NULL,'w',0),(84,'Valider les commandes clients','commande',1,'order_advance','validate','d',0),(86,'Envoyer les commandes clients','commande',1,'order_advance','send','d',0),(87,'Cloturer les commandes clients','commande',1,'cloturer',NULL,'d',0),(88,'Annuler les commandes clients','commande',1,'order_advance','annuler','d',0),(89,'Supprimer les commandes clients','commande',1,'supprimer',NULL,'d',0),(91,'Lire les charges','tax',1,'charges','lire','r',0),(91,'Lire les charges','tax',2,'charges','lire','r',1),(92,'Creer/modifier les charges','tax',1,'charges','creer','w',0),(92,'Creer/modifier les charges','tax',2,'charges','creer','w',0),(93,'Supprimer les charges','tax',1,'charges','supprimer','d',0),(93,'Supprimer les charges','tax',2,'charges','supprimer','d',0),(94,'Exporter les charges','tax',1,'charges','export','r',0),(94,'Exporter les charges','tax',2,'charges','export','r',0),(101,'Lire les expeditions','expedition',1,'lire',NULL,'r',1),(102,'Creer modifier les expeditions','expedition',1,'creer',NULL,'w',0),(104,'Valider les expeditions','expedition',1,'shipping_advance','validate','d',0),(105,'Envoyer les expeditions aux clients','expedition',1,'shipping_advance','send','d',0),(106,'Exporter les expeditions','expedition',1,'shipment','export','r',0),(109,'Supprimer les expeditions','expedition',1,'supprimer',NULL,'d',0),(111,'Lire les comptes bancaires','banque',1,'lire',NULL,'r',0),(111,'Lire les comptes bancaires','banque',2,'lire',NULL,'r',1),(112,'Creer/modifier montant/supprimer ecriture bancaire','banque',1,'modifier',NULL,'w',0),(112,'Creer/modifier montant/supprimer ecriture bancaire','banque',2,'modifier',NULL,'w',0),(113,'Configurer les comptes bancaires (creer, gerer categories)','banque',1,'configurer',NULL,'a',0),(113,'Configurer les comptes bancaires (creer, gerer categories)','banque',2,'configurer',NULL,'a',0),(114,'Rapprocher les ecritures bancaires','banque',1,'consolidate',NULL,'w',0),(114,'Rapprocher les ecritures bancaires','banque',2,'consolidate',NULL,'w',0),(115,'Exporter transactions et releves','banque',1,'export',NULL,'r',0),(115,'Exporter transactions et releves','banque',2,'export',NULL,'r',0),(116,'Virements entre comptes','banque',1,'transfer',NULL,'w',0),(116,'Virements entre comptes','banque',2,'transfer',NULL,'w',0),(117,'Gerer les envois de cheques','banque',1,'cheque',NULL,'w',0),(117,'Gerer les envois de cheques','banque',2,'cheque',NULL,'w',0),(121,'Lire les societes','societe',1,'lire',NULL,'r',1),(121,'Lire les societes','societe',2,'lire',NULL,'r',1),(122,'Creer modifier les societes','societe',1,'creer',NULL,'w',0),(122,'Creer modifier les societes','societe',2,'creer',NULL,'w',0),(125,'Supprimer les societes','societe',1,'supprimer',NULL,'d',0),(125,'Supprimer les societes','societe',2,'supprimer',NULL,'d',0),(126,'Exporter les societes','societe',1,'export',NULL,'r',0),(126,'Exporter les societes','societe',2,'export',NULL,'r',0),(141,'Read all projects and tasks (also private projects I am not contact for)','projet',1,'all','lire','r',0),(142,'Create/modify all projects and tasks (also private projects I am not contact for)','projet',1,'all','creer','w',0),(144,'Delete all projects and tasks (also private projects I am not contact for)','projet',1,'all','supprimer','d',0),(151,'Read withdrawals','prelevement',1,'bons','lire','r',1),(152,'Create/modify a withdrawals','prelevement',1,'bons','creer','w',0),(153,'Send withdrawals to bank','prelevement',1,'bons','send','a',0),(154,'credit/refuse withdrawals','prelevement',1,'bons','credit','a',0),(161,'Lire les contrats','contrat',1,'lire',NULL,'r',1),(162,'Creer / modifier les contrats','contrat',1,'creer',NULL,'w',0),(163,'Activer un service d\'un contrat','contrat',1,'activer',NULL,'w',0),(164,'Desactiver un service d\'un contrat','contrat',1,'desactiver',NULL,'w',0),(165,'Supprimer un contrat','contrat',1,'supprimer',NULL,'d',0),(167,'Export contracts','contrat',1,'export',NULL,'r',0),(221,'Consulter les mailings','mailing',1,'lire',NULL,'r',1),(221,'Consulter les mailings','mailing',2,'lire',NULL,'r',1),(222,'Creer/modifier les mailings (sujet, destinataires...)','mailing',1,'creer',NULL,'w',0),(222,'Creer/modifier les mailings (sujet, destinataires...)','mailing',2,'creer',NULL,'w',0),(223,'Valider les mailings (permet leur envoi)','mailing',1,'valider',NULL,'w',0),(223,'Valider les mailings (permet leur envoi)','mailing',2,'valider',NULL,'w',0),(229,'Supprimer les mailings','mailing',1,'supprimer',NULL,'d',0),(229,'Supprimer les mailings','mailing',2,'supprimer',NULL,'d',0),(237,'View recipients and info','mailing',1,'mailing_advance','recipient','r',0),(237,'View recipients and info','mailing',2,'mailing_advance','recipient','r',0),(238,'Manually send mailings','mailing',1,'mailing_advance','send','w',0),(238,'Manually send mailings','mailing',2,'mailing_advance','send','w',0),(239,'Delete mailings after validation and/or sent','mailing',1,'mailing_advance','delete','d',0),(239,'Delete mailings after validation and/or sent','mailing',2,'mailing_advance','delete','d',0),(241,'Lire les categories','categorie',1,'lire',NULL,'r',1),(242,'Creer/modifier les categories','categorie',1,'creer',NULL,'w',0),(243,'Supprimer les categories','categorie',1,'supprimer',NULL,'d',0),(251,'Consulter les autres utilisateurs','user',1,'user','lire','r',0),(252,'Consulter les permissions des autres utilisateurs','user',1,'user_advance','readperms','r',0),(253,'Creer/modifier utilisateurs internes et externes','user',1,'user','creer','w',0),(254,'Creer/modifier utilisateurs externes seulement','user',1,'user_advance','write','w',0),(255,'Modifier le mot de passe des autres utilisateurs','user',1,'user','password','w',0),(256,'Supprimer ou desactiver les autres utilisateurs','user',1,'user','supprimer','d',0),(262,'Consulter tous les tiers par utilisateurs internes (sinon uniquement si contact commercial). Non effectif pour utilisateurs externes (tjs limités à eux-meme).','societe',1,'client','voir','r',1),(262,'Consulter tous les tiers par utilisateurs internes (sinon uniquement si contact commercial). Non effectif pour utilisateurs externes (tjs limités à eux-meme).','societe',2,'client','voir','r',1),(281,'Lire les contacts','societe',1,'contact','lire','r',1),(281,'Lire les contacts','societe',2,'contact','lire','r',1),(282,'Creer modifier les contacts','societe',1,'contact','creer','w',0),(282,'Creer modifier les contacts','societe',2,'contact','creer','w',0),(283,'Supprimer les contacts','societe',1,'contact','supprimer','d',0),(283,'Supprimer les contacts','societe',2,'contact','supprimer','d',0),(286,'Exporter les contacts','societe',1,'contact','export','d',0),(286,'Exporter les contacts','societe',2,'contact','export','d',0),(300,'Read barcodes','barcode',1,'lire_advance',NULL,'r',1),(301,'Create/modify barcodes','barcode',1,'creer_advance',NULL,'w',0),(331,'Lire les bookmarks','bookmark',1,'lire',NULL,'r',1),(332,'Creer/modifier les bookmarks','bookmark',1,'creer',NULL,'r',1),(333,'Supprimer les bookmarks','bookmark',1,'supprimer',NULL,'r',0),(341,'Consulter ses propres permissions','user',1,'self_advance','readperms','r',1),(342,'Creer/modifier ses propres infos utilisateur','user',1,'self','creer','w',1),(343,'Modifier son propre mot de passe','user',1,'self','password','w',1),(344,'Modifier ses propres permissions','user',1,'self_advance','writeperms','w',1),(351,'Consulter les groupes','user',1,'group_advance','read','r',0),(352,'Consulter les permissions des groupes','user',1,'group_advance','readperms','r',0),(353,'Creer/modifier les groupes et leurs permissions','user',1,'group_advance','write','w',0),(354,'Supprimer ou desactiver les groupes','user',1,'group_advance','delete','d',0),(358,'Exporter les utilisateurs','user',1,'user','export','r',0),(510,'Read salaries','salaries',1,'read',NULL,'r',0),(511,'Read employee contracts/salaries','salaries',1,'read',NULL,'r',0),(512,'Create/modify salaries','salaries',1,'write',NULL,'w',0),(513,'Create/modify payment of salaries','salaries',1,'write',NULL,'w',0),(514,'Delete salaries','salaries',1,'delete',NULL,'d',0),(517,'Export salaries','salaries',1,'export',NULL,'r',0),(520,'Read loans','loan',1,'read',NULL,'r',0),(522,'Create/modify loans','loan',1,'write',NULL,'w',0),(524,'Delete loans','loan',1,'delete',NULL,'d',0),(525,'Access loan calculator','loan',1,'calc',NULL,'r',0),(527,'Export loans','loan',1,'export',NULL,'r',0),(531,'Lire les services','service',1,'lire',NULL,'r',1),(532,'Creer/modifier les services','service',1,'creer',NULL,'w',0),(534,'Supprimer les services','service',1,'supprimer',NULL,'d',0),(538,'Exporter les services','service',1,'export',NULL,'r',0),(701,'Lire les dons','don',1,'lire',NULL,'r',1),(701,'Lire les dons','don',2,'lire',NULL,'r',1),(702,'Creer/modifier les dons','don',1,'creer',NULL,'w',0),(702,'Creer/modifier les dons','don',2,'creer',NULL,'w',0),(703,'Supprimer les dons','don',1,'supprimer',NULL,'d',0),(703,'Supprimer les dons','don',2,'supprimer',NULL,'d',0),(771,'Read expense reports (yours and your subordinates)','expensereport',1,'lire',NULL,'r',1),(772,'Create/modify expense reports','expensereport',1,'creer',NULL,'w',0),(773,'Delete expense reports','expensereport',1,'supprimer',NULL,'d',0),(774,'Read all expense reports','expensereport',1,'readall',NULL,'r',1),(775,'Approve expense reports','expensereport',1,'approve',NULL,'w',0),(776,'Pay expense reports','expensereport',1,'to_paid',NULL,'w',0),(777,'Read expense reports of everybody','expensereport',1,'readall',NULL,'r',1),(778,'Create expense reports for everybody','expensereport',1,'writeall_advance',NULL,'w',0),(779,'Export expense reports','expensereport',1,'export',NULL,'r',0),(1001,'Lire les stocks','stock',1,'lire',NULL,'r',1),(1002,'Creer/Modifier les stocks','stock',1,'creer',NULL,'w',0),(1003,'Supprimer les stocks','stock',1,'supprimer',NULL,'d',0),(1004,'Lire mouvements de stocks','stock',1,'mouvement','lire','r',1),(1005,'Creer/modifier mouvements de stocks','stock',1,'mouvement','creer','w',0),(1101,'Lire les bons de livraison','expedition',1,'livraison','lire','r',1),(1102,'Creer modifier les bons de livraison','expedition',1,'livraison','creer','w',0),(1104,'Valider les bons de livraison','expedition',1,'livraison_advance','validate','d',0),(1109,'Supprimer les bons de livraison','expedition',1,'livraison','supprimer','d',0),(1121,'Read supplier proposals','supplier_proposal',1,'lire',NULL,'w',1),(1122,'Create/modify supplier proposals','supplier_proposal',1,'creer',NULL,'w',0),(1123,'Validate supplier proposals','supplier_proposal',1,'validate_advance',NULL,'w',0),(1124,'Envoyer les demandes fournisseurs','supplier_proposal',1,'send_advance',NULL,'w',0),(1125,'Delete supplier proposals','supplier_proposal',1,'supprimer',NULL,'w',0),(1126,'Close supplier price requests','supplier_proposal',1,'cloturer',NULL,'w',0),(1181,'Consulter les fournisseurs','fournisseur',1,'lire',NULL,'r',1),(1182,'Consulter les commandes fournisseur','fournisseur',1,'commande','lire','r',1),(1183,'Creer une commande fournisseur','fournisseur',1,'commande','creer','w',0),(1184,'Valider une commande fournisseur','fournisseur',1,'supplier_order_advance','validate','w',0),(1185,'Approuver une commande fournisseur','fournisseur',1,'commande','approuver','w',0),(1186,'Commander une commande fournisseur','fournisseur',1,'commande','commander','w',0),(1187,'Receptionner une commande fournisseur','fournisseur',1,'commande','receptionner','d',0),(1188,'Supprimer une commande fournisseur','fournisseur',1,'commande','supprimer','d',0),(1189,'Check/Uncheck a supplier order reception','fournisseur',1,'commande_advance','check','w',0),(1201,'Lire les exports','export',1,'lire',NULL,'r',1),(1202,'Creer/modifier un export','export',1,'creer',NULL,'w',0),(1231,'Consulter les factures fournisseur','fournisseur',1,'facture','lire','r',1),(1232,'Creer une facture fournisseur','fournisseur',1,'facture','creer','w',0),(1233,'Valider une facture fournisseur','fournisseur',1,'supplier_invoice_advance','validate','w',0),(1234,'Supprimer une facture fournisseur','fournisseur',1,'facture','supprimer','d',0),(1235,'Envoyer les factures par mail','fournisseur',1,'supplier_invoice_advance','send','a',0),(1236,'Exporter les factures fournisseurs, attributs et reglements','fournisseur',1,'facture','export','r',0),(1237,'Exporter les commande fournisseurs, attributs','fournisseur',1,'commande','export','r',0),(1251,'Run mass imports of external data (data load)','import',1,'run',NULL,'r',0),(1321,'Exporter les factures clients, attributs et reglements','facture',1,'facture','export','r',0),(1321,'Exporter les factures clients, attributs et reglements','facture',2,'facture','export','r',0),(1322,'Rouvrir une facture totalement réglée','facture',1,'invoice_advance','reopen','r',0),(1421,'Exporter les commandes clients et attributs','commande',1,'commande','export','r',0),(2401,'Read actions/tasks linked to his account','agenda',1,'myactions','read','r',1),(2401,'Read actions/tasks linked to his account','agenda',2,'myactions','read','r',1),(2402,'Create/modify actions/tasks linked to his account','agenda',1,'myactions','create','w',0),(2402,'Create/modify actions/tasks linked to his account','agenda',2,'myactions','create','w',0),(2403,'Delete actions/tasks linked to his account','agenda',1,'myactions','delete','w',0),(2403,'Delete actions/tasks linked to his account','agenda',2,'myactions','delete','w',0),(2411,'Read actions/tasks of others','agenda',1,'allactions','read','r',0),(2411,'Read actions/tasks of others','agenda',2,'allactions','read','r',0),(2412,'Create/modify actions/tasks of others','agenda',1,'allactions','create','w',0),(2412,'Create/modify actions/tasks of others','agenda',2,'allactions','create','w',0),(2413,'Delete actions/tasks of others','agenda',1,'allactions','delete','w',0),(2413,'Delete actions/tasks of others','agenda',2,'allactions','delete','w',0),(2414,'Export actions/tasks of others','agenda',1,'export',NULL,'w',0),(2501,'Consulter/Télécharger les documents','ecm',1,'read',NULL,'r',1),(2503,'Soumettre ou supprimer des documents','ecm',1,'upload',NULL,'w',0),(2515,'Administrer les rubriques de documents','ecm',1,'setup',NULL,'w',0),(20001,'Read your own holidays','holiday',1,'read',NULL,'w',1),(20001,'Créer / Modifier / Lire ses demandes de congés payés','holiday',2,'write',NULL,'w',1),(20002,'Create/modify your own holidays','holiday',1,'write',NULL,'w',1),(20002,'Lire / Modifier toutes les demandes de congés payés','holiday',2,'lire_tous',NULL,'w',0),(20003,'Delete holidays','holiday',1,'delete',NULL,'w',0),(20003,'Supprimer des demandes de congés payés','holiday',2,'delete',NULL,'w',0),(20004,'Read holidays for everybody','holiday',1,'read_all',NULL,'w',0),(20004,'Définir les congés payés des utilisateurs','holiday',2,'define_holiday',NULL,'w',0),(20005,'Create/modify holidays for everybody','holiday',1,'write_all',NULL,'w',0),(20005,'Voir les logs de modification des congés payés','holiday',2,'view_log',NULL,'w',0),(20006,'Setup holidays of users (setup and update balance)','holiday',1,'define_holiday',NULL,'w',0),(20006,'Accéder au rapport mensuel des congés payés','holiday',2,'month_report',NULL,'w',0),(23001,'Read cron jobs','cron',1,'read',NULL,'w',0),(23002,'Create cron Jobs','cron',1,'create',NULL,'w',0),(23003,'Delete cron Jobs','cron',1,'delete',NULL,'w',0),(23004,'Execute cron Jobs','cron',1,'execute',NULL,'w',0),(50101,'Use point of sale','cashdesk',1,'use',NULL,'a',1),(50401,'Bind products and invoices with accounting accounts','accounting',1,'bind','write','r',0),(50411,'Read operations in General Ledger','accounting',1,'mouvements','lire','r',0),(50412,'Write/Edit operations in General Ledger','accounting',1,'mouvements','creer','w',0),(50420,'Report and export reports (turnover, balance, journals, general ledger)','accounting',1,'comptarapport','lire','r',0),(50430,'Define and close a fiscal year','accounting',1,'fiscalyear',NULL,'r',0),(50440,'Manage chart of accounts, setup of accountancy','accounting',1,'chartofaccount',NULL,'r',0),(55001,'Read surveys','opensurvey',1,'read',NULL,'r',0),(55002,'Create/modify surveys','opensurvey',1,'write',NULL,'w',0),(59001,'Visualiser les marges','margins',1,'liretous',NULL,'r',1),(59002,'Définir les marges','margins',1,'creer',NULL,'w',0),(59003,'Read every user margin','margins',1,'read','all','r',0),(63001,'Read resources','resource',1,'read',NULL,'w',1),(63002,'Create/Modify resources','resource',1,'write',NULL,'w',0),(63003,'Delete resources','resource',1,'delete',NULL,'w',0),(63004,'Link resources','resource',1,'link',NULL,'w',0),(64001,'DirectPrint','printing',1,'read',NULL,'r',0),(101250,'Read surveys','opensurvey',2,'survey','read','r',0),(101251,'Create/modify surveys','opensurvey',2,'survey','write','w',0),(400051,'Use POS','pos',2,'frontend',NULL,'a',1),(400052,'Use Backend','pos',2,'backend',NULL,'a',1),(400053,'Make Transfers','pos',2,'transfer',NULL,'a',1),(400055,'Stats','pos',2,'stats',NULL,'a',1); +INSERT INTO `llx_rights_def` VALUES (11,'Lire les factures','facture',1,'lire',NULL,'a',0),(11,'Lire les factures','facture',2,'lire',NULL,'a',1),(12,'Creer/modifier les factures','facture',1,'creer',NULL,'a',0),(12,'Creer/modifier les factures','facture',2,'creer',NULL,'a',0),(13,'Dévalider les factures','facture',1,'invoice_advance','unvalidate','a',0),(13,'Dévalider les factures','facture',2,'invoice_advance','unvalidate','a',0),(14,'Valider les factures','facture',1,'invoice_advance','validate','a',0),(14,'Valider les factures','facture',2,'valider',NULL,'a',0),(15,'Envoyer les factures par mail','facture',1,'invoice_advance','send','a',0),(15,'Envoyer les factures par mail','facture',2,'invoice_advance','send','a',0),(16,'Emettre des paiements sur les factures','facture',1,'paiement',NULL,'a',0),(16,'Emettre des paiements sur les factures','facture',2,'paiement',NULL,'a',0),(19,'Supprimer les factures','facture',1,'supprimer',NULL,'a',0),(19,'Supprimer les factures','facture',2,'supprimer',NULL,'a',0),(21,'Lire les propositions commerciales','propale',1,'lire',NULL,'r',1),(21,'Lire les propositions commerciales','propale',2,'lire',NULL,'r',1),(22,'Creer/modifier les propositions commerciales','propale',1,'creer',NULL,'w',0),(22,'Creer/modifier les propositions commerciales','propale',2,'creer',NULL,'w',0),(24,'Valider les propositions commerciales','propale',1,'propal_advance','validate','d',0),(24,'Valider les propositions commerciales','propale',2,'valider',NULL,'d',0),(25,'Envoyer les propositions commerciales aux clients','propale',1,'propal_advance','send','d',0),(25,'Envoyer les propositions commerciales aux clients','propale',2,'propal_advance','send','d',0),(26,'Cloturer les propositions commerciales','propale',1,'cloturer',NULL,'d',0),(26,'Cloturer les propositions commerciales','propale',2,'cloturer',NULL,'d',0),(27,'Supprimer les propositions commerciales','propale',1,'supprimer',NULL,'d',0),(27,'Supprimer les propositions commerciales','propale',2,'supprimer',NULL,'d',0),(28,'Exporter les propositions commerciales et attributs','propale',1,'export',NULL,'r',0),(28,'Exporter les propositions commerciales et attributs','propale',2,'export',NULL,'r',0),(31,'Lire les produits','produit',1,'lire',NULL,'r',1),(31,'Lire les produits','produit',2,'lire',NULL,'r',1),(32,'Creer/modifier les produits','produit',1,'creer',NULL,'w',0),(32,'Creer/modifier les produits','produit',2,'creer',NULL,'w',0),(34,'Supprimer les produits','produit',1,'supprimer',NULL,'d',0),(34,'Supprimer les produits','produit',2,'supprimer',NULL,'d',0),(38,'Exporter les produits','produit',1,'export',NULL,'r',0),(38,'Exporter les produits','produit',2,'export',NULL,'r',0),(41,'Read projects and tasks (shared projects or projects I am contact for). Can also enter time consumed on assigned tasks (timesheet)','projet',1,'lire',NULL,'r',1),(42,'Create/modify projects and tasks (shared projects or projects I am contact for)','projet',1,'creer',NULL,'w',0),(44,'Delete project and tasks (shared projects or projects I am contact for)','projet',1,'supprimer',NULL,'d',0),(45,'Export projects','projet',1,'export',NULL,'d',0),(61,'Lire les fiches d\'intervention','ficheinter',1,'lire',NULL,'r',1),(62,'Creer/modifier les fiches d\'intervention','ficheinter',1,'creer',NULL,'w',0),(64,'Supprimer les fiches d\'intervention','ficheinter',1,'supprimer',NULL,'d',0),(67,'Exporter les fiches interventions','ficheinter',1,'export',NULL,'r',0),(68,'Envoyer les fiches d\'intervention par courriel','ficheinter',1,'ficheinter_advance','send','r',0),(69,'Valider les fiches d\'intervention ','ficheinter',1,'ficheinter_advance','validate','a',0),(70,'Dévalider les fiches d\'intervention','ficheinter',1,'ficheinter_advance','unvalidate','a',0),(81,'Lire les commandes clients','commande',1,'lire',NULL,'r',1),(82,'Creer/modifier les commandes clients','commande',1,'creer',NULL,'w',0),(84,'Valider les commandes clients','commande',1,'order_advance','validate','d',0),(86,'Envoyer les commandes clients','commande',1,'order_advance','send','d',0),(87,'Cloturer les commandes clients','commande',1,'cloturer',NULL,'d',0),(88,'Annuler les commandes clients','commande',1,'order_advance','annuler','d',0),(89,'Supprimer les commandes clients','commande',1,'supprimer',NULL,'d',0),(91,'Lire les charges','tax',1,'charges','lire','r',0),(91,'Lire les charges','tax',2,'charges','lire','r',1),(92,'Creer/modifier les charges','tax',1,'charges','creer','w',0),(92,'Creer/modifier les charges','tax',2,'charges','creer','w',0),(93,'Supprimer les charges','tax',1,'charges','supprimer','d',0),(93,'Supprimer les charges','tax',2,'charges','supprimer','d',0),(94,'Exporter les charges','tax',1,'charges','export','r',0),(94,'Exporter les charges','tax',2,'charges','export','r',0),(101,'Lire les expeditions','expedition',1,'lire',NULL,'r',1),(102,'Creer modifier les expeditions','expedition',1,'creer',NULL,'w',0),(104,'Valider les expeditions','expedition',1,'shipping_advance','validate','d',0),(105,'Envoyer les expeditions aux clients','expedition',1,'shipping_advance','send','d',0),(106,'Exporter les expeditions','expedition',1,'shipment','export','r',0),(109,'Supprimer les expeditions','expedition',1,'supprimer',NULL,'d',0),(111,'Lire les comptes bancaires','banque',1,'lire',NULL,'r',0),(111,'Lire les comptes bancaires','banque',2,'lire',NULL,'r',1),(112,'Creer/modifier montant/supprimer ecriture bancaire','banque',1,'modifier',NULL,'w',0),(112,'Creer/modifier montant/supprimer ecriture bancaire','banque',2,'modifier',NULL,'w',0),(113,'Configurer les comptes bancaires (creer, gerer categories)','banque',1,'configurer',NULL,'a',0),(113,'Configurer les comptes bancaires (creer, gerer categories)','banque',2,'configurer',NULL,'a',0),(114,'Rapprocher les ecritures bancaires','banque',1,'consolidate',NULL,'w',0),(114,'Rapprocher les ecritures bancaires','banque',2,'consolidate',NULL,'w',0),(115,'Exporter transactions et releves','banque',1,'export',NULL,'r',0),(115,'Exporter transactions et releves','banque',2,'export',NULL,'r',0),(116,'Virements entre comptes','banque',1,'transfer',NULL,'w',0),(116,'Virements entre comptes','banque',2,'transfer',NULL,'w',0),(117,'Gerer les envois de cheques','banque',1,'cheque',NULL,'w',0),(117,'Gerer les envois de cheques','banque',2,'cheque',NULL,'w',0),(121,'Lire les societes','societe',1,'lire',NULL,'r',1),(121,'Lire les societes','societe',2,'lire',NULL,'r',1),(122,'Creer modifier les societes','societe',1,'creer',NULL,'w',0),(122,'Creer modifier les societes','societe',2,'creer',NULL,'w',0),(125,'Supprimer les societes','societe',1,'supprimer',NULL,'d',0),(125,'Supprimer les societes','societe',2,'supprimer',NULL,'d',0),(126,'Exporter les societes','societe',1,'export',NULL,'r',0),(126,'Exporter les societes','societe',2,'export',NULL,'r',0),(141,'Read all projects and tasks (also private projects I am not contact for)','projet',1,'all','lire','r',0),(142,'Create/modify all projects and tasks (also private projects I am not contact for)','projet',1,'all','creer','w',0),(144,'Delete all projects and tasks (also private projects I am not contact for)','projet',1,'all','supprimer','d',0),(151,'Read withdrawals','prelevement',1,'bons','lire','r',1),(152,'Create/modify a withdrawals','prelevement',1,'bons','creer','w',0),(153,'Send withdrawals to bank','prelevement',1,'bons','send','a',0),(154,'credit/refuse withdrawals','prelevement',1,'bons','credit','a',0),(161,'Lire les contrats','contrat',1,'lire',NULL,'r',1),(162,'Creer / modifier les contrats','contrat',1,'creer',NULL,'w',0),(163,'Activer un service d\'un contrat','contrat',1,'activer',NULL,'w',0),(164,'Desactiver un service d\'un contrat','contrat',1,'desactiver',NULL,'w',0),(165,'Supprimer un contrat','contrat',1,'supprimer',NULL,'d',0),(167,'Export contracts','contrat',1,'export',NULL,'r',0),(221,'Consulter les mailings','mailing',1,'lire',NULL,'r',1),(221,'Consulter les mailings','mailing',2,'lire',NULL,'r',1),(222,'Creer/modifier les mailings (sujet, destinataires...)','mailing',1,'creer',NULL,'w',0),(222,'Creer/modifier les mailings (sujet, destinataires...)','mailing',2,'creer',NULL,'w',0),(223,'Valider les mailings (permet leur envoi)','mailing',1,'valider',NULL,'w',0),(223,'Valider les mailings (permet leur envoi)','mailing',2,'valider',NULL,'w',0),(229,'Supprimer les mailings','mailing',1,'supprimer',NULL,'d',0),(229,'Supprimer les mailings','mailing',2,'supprimer',NULL,'d',0),(237,'View recipients and info','mailing',1,'mailing_advance','recipient','r',0),(237,'View recipients and info','mailing',2,'mailing_advance','recipient','r',0),(238,'Manually send mailings','mailing',1,'mailing_advance','send','w',0),(238,'Manually send mailings','mailing',2,'mailing_advance','send','w',0),(239,'Delete mailings after validation and/or sent','mailing',1,'mailing_advance','delete','d',0),(239,'Delete mailings after validation and/or sent','mailing',2,'mailing_advance','delete','d',0),(241,'Lire les categories','categorie',1,'lire',NULL,'r',1),(242,'Creer/modifier les categories','categorie',1,'creer',NULL,'w',0),(243,'Supprimer les categories','categorie',1,'supprimer',NULL,'d',0),(251,'Consulter les autres utilisateurs','user',1,'user','lire','r',0),(252,'Consulter les permissions des autres utilisateurs','user',1,'user_advance','readperms','r',0),(253,'Creer/modifier utilisateurs internes et externes','user',1,'user','creer','w',0),(254,'Creer/modifier utilisateurs externes seulement','user',1,'user_advance','write','w',0),(255,'Modifier le mot de passe des autres utilisateurs','user',1,'user','password','w',0),(256,'Supprimer ou desactiver les autres utilisateurs','user',1,'user','supprimer','d',0),(262,'Consulter tous les tiers par utilisateurs internes (sinon uniquement si contact commercial). Non effectif pour utilisateurs externes (tjs limités à eux-meme).','societe',1,'client','voir','r',1),(262,'Consulter tous les tiers par utilisateurs internes (sinon uniquement si contact commercial). Non effectif pour utilisateurs externes (tjs limités à eux-meme).','societe',2,'client','voir','r',1),(281,'Lire les contacts','societe',1,'contact','lire','r',1),(281,'Lire les contacts','societe',2,'contact','lire','r',1),(282,'Creer modifier les contacts','societe',1,'contact','creer','w',0),(282,'Creer modifier les contacts','societe',2,'contact','creer','w',0),(283,'Supprimer les contacts','societe',1,'contact','supprimer','d',0),(283,'Supprimer les contacts','societe',2,'contact','supprimer','d',0),(286,'Exporter les contacts','societe',1,'contact','export','d',0),(286,'Exporter les contacts','societe',2,'contact','export','d',0),(300,'Read barcodes','barcode',1,'lire_advance',NULL,'r',1),(301,'Create/modify barcodes','barcode',1,'creer_advance',NULL,'w',0),(341,'Consulter ses propres permissions','user',1,'self_advance','readperms','r',1),(342,'Creer/modifier ses propres infos utilisateur','user',1,'self','creer','w',1),(343,'Modifier son propre mot de passe','user',1,'self','password','w',1),(344,'Modifier ses propres permissions','user',1,'self_advance','writeperms','w',1),(351,'Consulter les groupes','user',1,'group_advance','read','r',0),(352,'Consulter les permissions des groupes','user',1,'group_advance','readperms','r',0),(353,'Creer/modifier les groupes et leurs permissions','user',1,'group_advance','write','w',0),(354,'Supprimer ou desactiver les groupes','user',1,'group_advance','delete','d',0),(358,'Exporter les utilisateurs','user',1,'user','export','r',0),(510,'Read salaries','salaries',1,'read',NULL,'r',0),(511,'Read employee contracts/salaries','salaries',1,'read',NULL,'r',0),(512,'Create/modify salaries','salaries',1,'write',NULL,'w',0),(513,'Create/modify payment of salaries','salaries',1,'write',NULL,'w',0),(514,'Delete salaries','salaries',1,'delete',NULL,'d',0),(517,'Export salaries','salaries',1,'export',NULL,'r',0),(520,'Read loans','loan',1,'read',NULL,'r',0),(522,'Create/modify loans','loan',1,'write',NULL,'w',0),(524,'Delete loans','loan',1,'delete',NULL,'d',0),(525,'Access loan calculator','loan',1,'calc',NULL,'r',0),(527,'Export loans','loan',1,'export',NULL,'r',0),(531,'Lire les services','service',1,'lire',NULL,'r',1),(532,'Creer/modifier les services','service',1,'creer',NULL,'w',0),(534,'Supprimer les services','service',1,'supprimer',NULL,'d',0),(538,'Exporter les services','service',1,'export',NULL,'r',0),(701,'Lire les dons','don',1,'lire',NULL,'r',1),(701,'Lire les dons','don',2,'lire',NULL,'r',1),(702,'Creer/modifier les dons','don',1,'creer',NULL,'w',0),(702,'Creer/modifier les dons','don',2,'creer',NULL,'w',0),(703,'Supprimer les dons','don',1,'supprimer',NULL,'d',0),(703,'Supprimer les dons','don',2,'supprimer',NULL,'d',0),(771,'Read expense reports (yours and your subordinates)','expensereport',1,'lire',NULL,'r',1),(772,'Create/modify expense reports','expensereport',1,'creer',NULL,'w',0),(773,'Delete expense reports','expensereport',1,'supprimer',NULL,'d',0),(774,'Read all expense reports','expensereport',1,'readall',NULL,'r',1),(775,'Approve expense reports','expensereport',1,'approve',NULL,'w',0),(776,'Pay expense reports','expensereport',1,'to_paid',NULL,'w',0),(777,'Read expense reports of everybody','expensereport',1,'readall',NULL,'r',1),(778,'Create expense reports for everybody','expensereport',1,'writeall_advance',NULL,'w',0),(779,'Export expense reports','expensereport',1,'export',NULL,'r',0),(1001,'Lire les stocks','stock',1,'lire',NULL,'r',1),(1002,'Creer/Modifier les stocks','stock',1,'creer',NULL,'w',0),(1003,'Supprimer les stocks','stock',1,'supprimer',NULL,'d',0),(1004,'Lire mouvements de stocks','stock',1,'mouvement','lire','r',1),(1005,'Creer/modifier mouvements de stocks','stock',1,'mouvement','creer','w',0),(1101,'Lire les bons de livraison','expedition',1,'livraison','lire','r',1),(1102,'Creer modifier les bons de livraison','expedition',1,'livraison','creer','w',0),(1104,'Valider les bons de livraison','expedition',1,'livraison_advance','validate','d',0),(1109,'Supprimer les bons de livraison','expedition',1,'livraison','supprimer','d',0),(1121,'Read supplier proposals','supplier_proposal',1,'lire',NULL,'w',1),(1122,'Create/modify supplier proposals','supplier_proposal',1,'creer',NULL,'w',0),(1123,'Validate supplier proposals','supplier_proposal',1,'validate_advance',NULL,'w',0),(1124,'Envoyer les demandes fournisseurs','supplier_proposal',1,'send_advance',NULL,'w',0),(1125,'Delete supplier proposals','supplier_proposal',1,'supprimer',NULL,'w',0),(1126,'Close supplier price requests','supplier_proposal',1,'cloturer',NULL,'w',0),(1181,'Consulter les fournisseurs','fournisseur',1,'lire',NULL,'r',1),(1182,'Consulter les commandes fournisseur','fournisseur',1,'commande','lire','r',1),(1183,'Creer une commande fournisseur','fournisseur',1,'commande','creer','w',0),(1184,'Valider une commande fournisseur','fournisseur',1,'supplier_order_advance','validate','w',0),(1185,'Approuver une commande fournisseur','fournisseur',1,'commande','approuver','w',0),(1186,'Commander une commande fournisseur','fournisseur',1,'commande','commander','w',0),(1187,'Receptionner une commande fournisseur','fournisseur',1,'commande','receptionner','d',0),(1188,'Supprimer une commande fournisseur','fournisseur',1,'commande','supprimer','d',0),(1189,'Check/Uncheck a supplier order reception','fournisseur',1,'commande_advance','check','w',0),(1201,'Lire les exports','export',1,'lire',NULL,'r',1),(1202,'Creer/modifier un export','export',1,'creer',NULL,'w',0),(1231,'Consulter les factures fournisseur','fournisseur',1,'facture','lire','r',1),(1232,'Creer une facture fournisseur','fournisseur',1,'facture','creer','w',0),(1233,'Valider une facture fournisseur','fournisseur',1,'supplier_invoice_advance','validate','w',0),(1234,'Supprimer une facture fournisseur','fournisseur',1,'facture','supprimer','d',0),(1235,'Envoyer les factures par mail','fournisseur',1,'supplier_invoice_advance','send','a',0),(1236,'Exporter les factures fournisseurs, attributs et reglements','fournisseur',1,'facture','export','r',0),(1237,'Exporter les commande fournisseurs, attributs','fournisseur',1,'commande','export','r',0),(1251,'Run mass imports of external data (data load)','import',1,'run',NULL,'r',0),(1321,'Exporter les factures clients, attributs et reglements','facture',1,'facture','export','r',0),(1321,'Exporter les factures clients, attributs et reglements','facture',2,'facture','export','r',0),(1322,'Rouvrir une facture totalement réglée','facture',1,'invoice_advance','reopen','r',0),(1421,'Exporter les commandes clients et attributs','commande',1,'commande','export','r',0),(2401,'Read actions/tasks linked to his account','agenda',1,'myactions','read','r',1),(2401,'Read actions/tasks linked to his account','agenda',2,'myactions','read','r',1),(2402,'Create/modify actions/tasks linked to his account','agenda',1,'myactions','create','w',0),(2402,'Create/modify actions/tasks linked to his account','agenda',2,'myactions','create','w',0),(2403,'Delete actions/tasks linked to his account','agenda',1,'myactions','delete','w',0),(2403,'Delete actions/tasks linked to his account','agenda',2,'myactions','delete','w',0),(2411,'Read actions/tasks of others','agenda',1,'allactions','read','r',0),(2411,'Read actions/tasks of others','agenda',2,'allactions','read','r',0),(2412,'Create/modify actions/tasks of others','agenda',1,'allactions','create','w',0),(2412,'Create/modify actions/tasks of others','agenda',2,'allactions','create','w',0),(2413,'Delete actions/tasks of others','agenda',1,'allactions','delete','w',0),(2413,'Delete actions/tasks of others','agenda',2,'allactions','delete','w',0),(2414,'Export actions/tasks of others','agenda',1,'export',NULL,'w',0),(2501,'Consulter/Télécharger les documents','ecm',1,'read',NULL,'r',1),(2503,'Soumettre ou supprimer des documents','ecm',1,'upload',NULL,'w',0),(2515,'Administrer les rubriques de documents','ecm',1,'setup',NULL,'w',0),(20001,'Read your own holidays','holiday',1,'read',NULL,'w',1),(20001,'Créer / Modifier / Lire ses demandes de congés payés','holiday',2,'write',NULL,'w',1),(20002,'Create/modify your own holidays','holiday',1,'write',NULL,'w',1),(20002,'Lire / Modifier toutes les demandes de congés payés','holiday',2,'lire_tous',NULL,'w',0),(20003,'Delete holidays','holiday',1,'delete',NULL,'w',0),(20003,'Supprimer des demandes de congés payés','holiday',2,'delete',NULL,'w',0),(20004,'Read holidays for everybody','holiday',1,'read_all',NULL,'w',0),(20004,'Définir les congés payés des utilisateurs','holiday',2,'define_holiday',NULL,'w',0),(20005,'Create/modify holidays for everybody','holiday',1,'write_all',NULL,'w',0),(20005,'Voir les logs de modification des congés payés','holiday',2,'view_log',NULL,'w',0),(20006,'Setup holidays of users (setup and update balance)','holiday',1,'define_holiday',NULL,'w',0),(20006,'Accéder au rapport mensuel des congés payés','holiday',2,'month_report',NULL,'w',0),(23001,'Read cron jobs','cron',1,'read',NULL,'w',0),(23002,'Create cron Jobs','cron',1,'create',NULL,'w',0),(23003,'Delete cron Jobs','cron',1,'delete',NULL,'w',0),(23004,'Execute cron Jobs','cron',1,'execute',NULL,'w',0),(50101,'Use point of sale','cashdesk',1,'use',NULL,'a',1),(50401,'Bind products and invoices with accounting accounts','accounting',1,'bind','write','r',0),(50411,'Read operations in General Ledger','accounting',1,'mouvements','lire','r',0),(50412,'Write/Edit operations in General Ledger','accounting',1,'mouvements','creer','w',0),(50420,'Report and export reports (turnover, balance, journals, general ledger)','accounting',1,'comptarapport','lire','r',0),(50430,'Define and close a fiscal year','accounting',1,'fiscalyear',NULL,'r',0),(50440,'Manage chart of accounts, setup of accountancy','accounting',1,'chartofaccount',NULL,'r',0),(55001,'Read surveys','opensurvey',1,'read',NULL,'r',0),(55002,'Create/modify surveys','opensurvey',1,'write',NULL,'w',0),(59001,'Visualiser les marges','margins',1,'liretous',NULL,'r',1),(59002,'Définir les marges','margins',1,'creer',NULL,'w',0),(59003,'Read every user margin','margins',1,'read','all','r',0),(63001,'Read resources','resource',1,'read',NULL,'w',1),(63002,'Create/Modify resources','resource',1,'write',NULL,'w',0),(63003,'Delete resources','resource',1,'delete',NULL,'w',0),(63004,'Link resources','resource',1,'link',NULL,'w',0),(64001,'DirectPrint','printing',1,'read',NULL,'r',0),(101250,'Read surveys','opensurvey',2,'survey','read','r',0),(101251,'Create/modify surveys','opensurvey',2,'survey','write','w',0),(400051,'Use POS','pos',2,'frontend',NULL,'a',1),(400052,'Use Backend','pos',2,'backend',NULL,'a',1),(400053,'Make Transfers','pos',2,'transfer',NULL,'a',1),(400055,'Stats','pos',2,'stats',NULL,'a',1); /*!40000 ALTER TABLE `llx_rights_def` ENABLE KEYS */; UNLOCK TABLES; @@ -7929,7 +7934,7 @@ CREATE TABLE `llx_societe` ( LOCK TABLES `llx_societe` WRITE; /*!40000 ALTER TABLE `llx_societe` DISABLE KEYS */; -INSERT INTO `llx_societe` VALUES (1,0,NULL,'2016-01-16 15:21:09','2010-07-08 14:21:44','Indian SAS',1,NULL,NULL,'CU1212-0007','SU1212-0005','7050','6050','1 alalah road',NULL,'Delhi',0,117,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,'0','','','','','',5000,1,NULL,NULL,NULL,1,1,NULL,NULL,0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,0.000,NULL,0.000,NULL,NULL,'en_IN',NULL,NULL,1,'indiancompany.png','','',0,NULL,NULL,'',0,NULL,NULL,NULL,NULL,NULL),(2,0,NULL,'2016-07-30 11:45:49','2010-07-08 14:23:48','Teclib',1,NULL,NULL,'CU1108-0001','SU1108-0001','411CU11080001','401SU11080001','',NULL,'Paris',0,1,NULL,NULL,'www.teclib.com',NULL,NULL,4,3,57,'0','123456789','','ACE14','','',400000,0,NULL,NULL,NULL,3,1,NULL,'',0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,0,0.000,NULL,0.000,NULL,NULL,'fr_FR',NULL,NULL,1,'teclibcompany.png','','',0,NULL,NULL,'',0,NULL,NULL,0,'',NULL),(3,0,NULL,'2017-02-16 00:47:25','2010-07-08 22:42:12','Spanish Comp',1,NULL,NULL,'SPANISHCOMP','SU1601-0009',NULL,NULL,'1 via mallere',NULL,'Madrid',123,4,NULL,NULL,NULL,NULL,NULL,3,4,408,'0','','','','','',10000,0,NULL,NULL,NULL,1,1,NULL,NULL,0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,0.000,NULL,0.000,NULL,NULL,'es_AR',NULL,NULL,1,'spanishcompany.png','','',0,NULL,NULL,'',0,NULL,NULL,NULL,NULL,NULL),(4,0,NULL,'2016-01-22 17:24:53','2010-07-08 22:48:18','Prospector Vaalen',1,NULL,NULL,'CU1303-0014',NULL,NULL,NULL,'',NULL,'Bruxelles',103,2,NULL,NULL,NULL,NULL,NULL,3,4,201,'0','12345678','','','','',0,0,NULL,NULL,NULL,3,0,NULL,'PL_LOW',0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,0.000,NULL,0.000,NULL,NULL,NULL,NULL,NULL,1,'valeencompany.png','','',0,NULL,NULL,'',0,NULL,NULL,NULL,NULL,NULL),(5,0,NULL,'2017-02-21 11:01:17','2010-07-08 23:22:57','NoCountry GmBh',1,NULL,NULL,NULL,NULL,NULL,NULL,'',NULL,NULL,0,0,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,'0','','','','','',0,0,NULL,NULL,NULL,0,0,NULL,'',0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,0,0.000,NULL,0.000,NULL,NULL,NULL,NULL,NULL,1,'nocountrycomp.png','','',0,NULL,NULL,'',0,NULL,NULL,1,'EUR',NULL),(6,0,NULL,'2016-01-16 15:35:56','2010-07-09 00:15:09','Swiss Touch',1,NULL,NULL,'CU1601-0018','SU1601-0010',NULL,NULL,'',NULL,'Genevia',0,6,NULL,NULL,NULL,'swisstouch@example.ch',NULL,2,2,601,'0','','','','','',56000,0,NULL,NULL,NULL,3,1,NULL,NULL,0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,0.000,NULL,0.000,NULL,NULL,NULL,NULL,NULL,1,'swisstouch.png','','',0,NULL,NULL,'',0,NULL,NULL,NULL,NULL,NULL),(7,0,NULL,'2016-01-16 15:38:32','2010-07-09 01:24:26','Generic customer',1,NULL,NULL,'CU1302-0011',NULL,NULL,NULL,'',NULL,NULL,0,7,NULL,NULL,NULL,'ttt@ttt.com',NULL,NULL,8,NULL,'0','','','','','',0,0,'Generic customer to use for Point Of Sale module.
',NULL,NULL,1,0,NULL,NULL,0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,0.000,NULL,0.000,NULL,NULL,NULL,NULL,NULL,1,'genericcustomer.png','','',0,NULL,NULL,'',0,NULL,NULL,NULL,NULL,NULL),(10,0,NULL,'2016-01-16 15:44:20','2010-07-10 15:13:08','NLTechno',1,NULL,NULL,'CU1212-0005','SU1601-0011',NULL,NULL,'',NULL,NULL,0,1,NULL,NULL,NULL,'notanemail@nltechno.com',NULL,1,4,54,'0','493861496','49386149600039','6209Z','22-01-2007','FR123456789',10000,0,NULL,NULL,NULL,1,1,NULL,NULL,0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,0.000,NULL,0.000,'123456789012',NULL,'fr_FR',NULL,NULL,1,'logo_nltechno_94x100.png','','',0,NULL,NULL,'The OpenSource company',0,NULL,NULL,NULL,NULL,NULL),(11,0,NULL,'2016-01-22 17:11:20','2010-07-10 18:35:57','Company Corp 1',1,NULL,NULL,'CU1510-0017',NULL,'7051',NULL,'',NULL,NULL,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,'0','','','','','',0,0,NULL,NULL,NULL,3,0,NULL,'PL_LOW',0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,0.000,NULL,0.000,NULL,NULL,NULL,NULL,NULL,1,'comapnycorp1company.png','','',0,NULL,NULL,'',0,NULL,NULL,NULL,NULL,NULL),(12,0,NULL,'2016-01-22 16:41:56','2010-07-11 16:18:08','Dupont Alain',1,NULL,NULL,'CU1601-0019',NULL,NULL,NULL,'',NULL,NULL,0,1,NULL,NULL,NULL,'dalain@example.com',NULL,NULL,0,NULL,'0','','','','','',0,0,NULL,NULL,NULL,1,0,NULL,NULL,0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,0.000,NULL,0.000,NULL,NULL,NULL,NULL,NULL,1,'pierrecurie.jpg','','',0,NULL,NULL,'',0,NULL,NULL,NULL,NULL,NULL),(13,0,NULL,'2016-01-22 17:13:16','2010-07-11 17:13:20','Company Corp 2',1,NULL,NULL,NULL,'SU1510-0008',NULL,NULL,'',NULL,NULL,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,'0','','','','','',0,0,NULL,NULL,NULL,0,1,NULL,NULL,0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,0.000,NULL,0.000,NULL,NULL,NULL,NULL,NULL,1,'companycorp2company.png','','',0,NULL,NULL,'',0,NULL,NULL,NULL,NULL,NULL),(17,0,NULL,'2017-02-15 22:55:34','2011-08-01 02:41:26','Book Keeping Company',1,NULL,NULL,'CU1108-0004','SU1108-0004',NULL,'401SU11080004','The French Company',NULL,NULL,0,1,NULL,NULL,NULL,NULL,NULL,1,0,NULL,'0','','','','','',0,0,NULL,NULL,NULL,0,1,NULL,'',0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,0,0.000,NULL,0.000,NULL,NULL,NULL,NULL,NULL,1,'bookkeepercompany.png','','',0,NULL,NULL,'',0,NULL,NULL,1,'EUR',NULL),(19,0,NULL,'2017-02-21 11:51:40','2013-01-12 12:23:05','Magic Food Store',1,NULL,NULL,'CU1301-0008',NULL,NULL,NULL,'65 holdywood boulevard','123456','BigTown',0,4,NULL,'0101',NULL,'myemail@domain.com',NULL,NULL,0,NULL,'0','','','10/10/2010','','',0,0,NULL,NULL,NULL,1,0,NULL,NULL,0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,0.000,NULL,0.000,NULL,NULL,'en_US','patient@cabinetmed',NULL,1,'magicfoodstore.png','','',0,NULL,NULL,'',0,NULL,'sepamandate',NULL,NULL,NULL),(25,0,NULL,'2016-01-22 17:21:17','2013-03-10 15:47:37','Print Company',1,NULL,NULL,'CU1303-0016','SU1303-0007',NULL,NULL,'21 Gutenberg street','45600','Berlin',0,5,NULL,NULL,NULL,'printcompany@example.com',NULL,NULL,0,NULL,'0','','','','','',0,0,NULL,NULL,NULL,0,1,NULL,NULL,0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,0.000,NULL,0.000,NULL,NULL,'de_DE',NULL,NULL,1,'printcompany.png','','',0,NULL,NULL,'',0,NULL,NULL,NULL,NULL,NULL),(26,0,NULL,'2017-02-21 00:05:05','2017-02-12 23:17:04','Patient SuperIll',1,NULL,NULL,'CU1702-0020',NULL,'411CU17020020',NULL,'',NULL,NULL,0,14,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,'','','','','',NULL,0,NULL,NULL,NULL,3,0,NULL,'',0,0,0,12,12,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0.000,NULL,0.000,NULL,NULL,'en_US','patient@cabinetmed',NULL,1,NULL,'','',0,NULL,NULL,'',0,NULL,NULL,0,'',NULL); +INSERT INTO `llx_societe` VALUES (1,0,NULL,'2016-01-16 15:21:09','2010-07-08 14:21:44','Indian SAS',1,NULL,NULL,'CU1212-0007','SU1212-0005','7050','6050','1 alalah road',NULL,'Delhi',0,117,NULL,NULL,NULL,NULL,NULL,NULL,4,NULL,'0','','','','','',5000,1,NULL,NULL,NULL,1,1,NULL,NULL,0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,0.000,NULL,0.000,NULL,NULL,'en_IN',NULL,NULL,1,'indiancompany.png','','',0,NULL,NULL,'',0,NULL,NULL,NULL,NULL,NULL),(2,0,NULL,'2016-07-30 11:45:49','2010-07-08 14:23:48','Teclib',1,NULL,NULL,'CU1108-0001','SU1108-0001','411CU11080001','401SU11080001','',NULL,'Paris',0,1,NULL,NULL,'www.teclib.com',NULL,NULL,4,3,57,'0','123456789','','ACE14','','',400000,0,NULL,NULL,NULL,3,1,NULL,'',0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,0,0.000,NULL,0.000,NULL,NULL,'fr_FR',NULL,NULL,1,'teclibcompany.png','','',0,NULL,NULL,'',0,NULL,NULL,0,'',NULL),(3,0,NULL,'2017-02-16 00:47:25','2010-07-08 22:42:12','Spanish Comp',1,NULL,NULL,'SPANISHCOMP','SU1601-0009',NULL,NULL,'1 via mallere',NULL,'Madrid',123,4,NULL,NULL,NULL,NULL,NULL,3,4,408,'0','','','','','',10000,0,NULL,NULL,NULL,1,1,NULL,NULL,0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,0.000,NULL,0.000,NULL,NULL,'es_AR',NULL,NULL,1,'spanishcompany.png','','',0,NULL,NULL,'',0,NULL,NULL,NULL,NULL,NULL),(4,0,NULL,'2016-01-22 17:24:53','2010-07-08 22:48:18','Prospector Vaalen',1,NULL,NULL,'CU1303-0014',NULL,NULL,NULL,'',NULL,'Bruxelles',103,2,NULL,NULL,NULL,NULL,NULL,3,4,201,'0','12345678','','','','',0,0,NULL,NULL,NULL,3,0,NULL,'PL_LOW',0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,0.000,NULL,0.000,NULL,NULL,NULL,NULL,NULL,1,'valeencompany.png','','',0,NULL,NULL,'',0,NULL,NULL,NULL,NULL,NULL),(5,0,NULL,'2017-02-21 11:01:17','2010-07-08 23:22:57','NoCountry GmBh',1,NULL,NULL,NULL,NULL,NULL,NULL,'',NULL,NULL,0,0,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,'0','','','','','',0,0,NULL,NULL,NULL,0,0,NULL,'',0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,0,0.000,NULL,0.000,NULL,NULL,NULL,NULL,NULL,1,'nocountrycomp.png','','',0,NULL,NULL,'',0,NULL,NULL,1,'EUR',NULL),(6,0,NULL,'2016-01-16 15:35:56','2010-07-09 00:15:09','Swiss Touch',1,NULL,NULL,'CU1601-0018','SU1601-0010',NULL,NULL,'',NULL,'Genevia',0,6,NULL,NULL,NULL,'swisstouch@example.ch',NULL,2,2,601,'0','','','','','',56000,0,NULL,NULL,NULL,3,1,NULL,NULL,0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,0.000,NULL,0.000,NULL,NULL,NULL,NULL,NULL,1,'swisstouch.png','','',0,NULL,NULL,'',0,NULL,NULL,NULL,NULL,NULL),(7,0,NULL,'2016-01-16 15:38:32','2010-07-09 01:24:26','Generic customer',1,NULL,NULL,'CU1302-0011',NULL,NULL,NULL,'',NULL,NULL,0,7,NULL,NULL,NULL,'ttt@ttt.com',NULL,NULL,8,NULL,'0','','','','','',0,0,'Generic customer to use for Point Of Sale module.
',NULL,NULL,1,0,NULL,NULL,0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,0.000,NULL,0.000,NULL,NULL,NULL,NULL,NULL,1,'genericcustomer.png','','',0,NULL,NULL,'',0,NULL,NULL,NULL,NULL,NULL),(10,0,NULL,'2016-01-16 15:44:20','2010-07-10 15:13:08','NLTechno',1,NULL,NULL,'CU1212-0005','SU1601-0011',NULL,NULL,'',NULL,NULL,0,1,NULL,NULL,NULL,'notanemail@nltechno.com',NULL,1,4,54,'0','493861496','49386149600039','6209Z','22-01-2007','FR123456789',10000,0,NULL,NULL,NULL,1,1,NULL,NULL,0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,0.000,NULL,0.000,'123456789012',NULL,'fr_FR',NULL,NULL,1,'logo_nltechno_94x100.png','','',0,NULL,NULL,'The OpenSource company',0,NULL,NULL,NULL,NULL,NULL),(11,0,NULL,'2017-05-12 09:06:31','2010-07-10 18:35:57','Company Corp 1',1,NULL,NULL,'CU1510-0017',NULL,'7051',NULL,'21 Green Hill street','75500','Los Angeles',0,11,'444123456',NULL,'companycorp1.com','companycorp1@example.com','corp1',1,1,NULL,'0','AB1234567','','','','USABS123',10000,0,NULL,NULL,NULL,3,0,NULL,'PL_LOW',0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,0,0.000,NULL,0.000,NULL,NULL,'en_US',NULL,NULL,1,'comapnycorp1company.png','','',0,NULL,NULL,'',0,NULL,NULL,1,'EUR',NULL),(12,0,NULL,'2016-01-22 16:41:56','2010-07-11 16:18:08','Dupont Alain',1,NULL,NULL,'CU1601-0019',NULL,NULL,NULL,'',NULL,NULL,0,1,NULL,NULL,NULL,'dalain@example.com',NULL,NULL,0,NULL,'0','','','','','',0,0,NULL,NULL,NULL,1,0,NULL,NULL,0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,0.000,NULL,0.000,NULL,NULL,NULL,NULL,NULL,1,'pierrecurie.jpg','','',0,NULL,NULL,'',0,NULL,NULL,NULL,NULL,NULL),(13,0,NULL,'2016-01-22 17:13:16','2010-07-11 17:13:20','Company Corp 2',1,NULL,NULL,NULL,'SU1510-0008',NULL,NULL,'',NULL,NULL,0,1,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,'0','','','','','',0,0,NULL,NULL,NULL,0,1,NULL,NULL,0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,0.000,NULL,0.000,NULL,NULL,NULL,NULL,NULL,1,'companycorp2company.png','','',0,NULL,NULL,'',0,NULL,NULL,NULL,NULL,NULL),(17,0,NULL,'2017-02-15 22:55:34','2011-08-01 02:41:26','Book Keeping Company',1,NULL,NULL,'CU1108-0004','SU1108-0004',NULL,'401SU11080004','The French Company',NULL,NULL,0,1,NULL,NULL,NULL,NULL,NULL,1,0,NULL,'0','','','','','',0,0,NULL,NULL,NULL,0,1,NULL,'',0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,0,0.000,NULL,0.000,NULL,NULL,NULL,NULL,NULL,1,'bookkeepercompany.png','','',0,NULL,NULL,'',0,NULL,NULL,1,'EUR',NULL),(19,0,NULL,'2017-02-21 11:51:40','2013-01-12 12:23:05','Magic Food Store',1,NULL,NULL,'CU1301-0008',NULL,NULL,NULL,'65 holdywood boulevard','123456','BigTown',0,4,NULL,'0101',NULL,'myemail@domain.com',NULL,NULL,0,NULL,'0','','','10/10/2010','','',0,0,NULL,NULL,NULL,1,0,NULL,NULL,0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,0.000,NULL,0.000,NULL,NULL,'en_US','patient@cabinetmed',NULL,1,'magicfoodstore.png','','',0,NULL,NULL,'',0,NULL,'sepamandate',NULL,NULL,NULL),(25,0,NULL,'2016-01-22 17:21:17','2013-03-10 15:47:37','Print Company',1,NULL,NULL,'CU1303-0016','SU1303-0007',NULL,NULL,'21 Gutenberg street','45600','Berlin',0,5,NULL,NULL,NULL,'printcompany@example.com',NULL,NULL,0,NULL,'0','','','','','',0,0,NULL,NULL,NULL,0,1,NULL,NULL,0,0,0,1,12,0,NULL,NULL,NULL,NULL,NULL,NULL,1,NULL,0.000,NULL,0.000,NULL,NULL,'de_DE',NULL,NULL,1,'printcompany.png','','',0,NULL,NULL,'',0,NULL,NULL,NULL,NULL,NULL),(26,0,NULL,'2017-02-21 00:05:05','2017-02-12 23:17:04','Patient SuperIll',1,NULL,NULL,'CU1702-0020',NULL,'411CU17020020',NULL,'',NULL,NULL,0,14,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,'','','','','',NULL,0,NULL,NULL,NULL,3,0,NULL,'',0,0,0,12,12,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0.000,NULL,0.000,NULL,NULL,'en_US','patient@cabinetmed',NULL,1,NULL,'','',0,NULL,NULL,'',0,NULL,NULL,0,'',NULL); /*!40000 ALTER TABLE `llx_societe` ENABLE KEYS */; UNLOCK TABLES; @@ -8008,14 +8013,9 @@ CREATE TABLE `llx_societe_extrafields` ( `tms` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `fk_object` int(11) NOT NULL, `import_key` varchar(14) DEFAULT NULL, - `anotheraddedfield` varchar(15) DEFAULT NULL, - `height` varchar(128) DEFAULT NULL, - `weight` varchar(128) DEFAULT NULL, - `prof` varchar(128) DEFAULT NULL, - `birthdate` date DEFAULT NULL, PRIMARY KEY (`rowid`), UNIQUE KEY `uk_societe_extrafields` (`fk_object`) -) ENGINE=InnoDB AUTO_INCREMENT=97 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=98 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -8024,7 +8024,7 @@ CREATE TABLE `llx_societe_extrafields` ( LOCK TABLES `llx_societe_extrafields` WRITE; /*!40000 ALTER TABLE `llx_societe_extrafields` DISABLE KEYS */; -INSERT INTO `llx_societe_extrafields` VALUES (75,'2016-01-22 16:40:03',10,NULL,NULL,NULL,NULL,NULL,NULL),(77,'2016-01-22 16:41:56',12,NULL,NULL,NULL,NULL,NULL,NULL),(78,'2016-01-22 17:11:20',11,NULL,NULL,NULL,NULL,NULL,NULL),(79,'2016-01-22 17:13:16',13,NULL,NULL,NULL,NULL,NULL,NULL),(81,'2016-01-22 17:18:08',19,NULL,NULL,NULL,NULL,NULL,NULL),(82,'2016-01-22 17:21:17',25,NULL,NULL,NULL,NULL,NULL,NULL),(83,'2016-01-22 17:21:51',1,NULL,NULL,NULL,NULL,NULL,NULL),(85,'2016-01-22 17:22:32',3,NULL,NULL,NULL,NULL,NULL,NULL),(86,'2016-01-22 17:24:53',4,NULL,NULL,NULL,NULL,NULL,NULL),(88,'2016-01-22 17:25:26',6,NULL,NULL,NULL,NULL,NULL,NULL),(89,'2016-01-22 17:25:41',7,NULL,NULL,NULL,NULL,NULL,NULL),(92,'2016-07-30 11:45:49',2,NULL,NULL,NULL,NULL,NULL,NULL),(94,'2017-02-15 22:55:34',17,NULL,NULL,NULL,NULL,NULL,NULL),(95,'2017-02-21 00:05:05',26,NULL,NULL,NULL,NULL,NULL,NULL),(96,'2017-02-21 11:01:17',5,NULL,NULL,NULL,NULL,NULL,NULL); +INSERT INTO `llx_societe_extrafields` VALUES (75,'2016-01-22 16:40:03',10,NULL),(77,'2016-01-22 16:41:56',12,NULL),(79,'2016-01-22 17:13:16',13,NULL),(81,'2016-01-22 17:18:08',19,NULL),(82,'2016-01-22 17:21:17',25,NULL),(83,'2016-01-22 17:21:51',1,NULL),(85,'2016-01-22 17:22:32',3,NULL),(86,'2016-01-22 17:24:53',4,NULL),(88,'2016-01-22 17:25:26',6,NULL),(89,'2016-01-22 17:25:41',7,NULL),(92,'2016-07-30 11:45:49',2,NULL),(94,'2017-02-15 22:55:34',17,NULL),(95,'2017-02-21 00:05:05',26,NULL),(96,'2017-02-21 11:01:17',5,NULL),(97,'2017-05-12 09:06:31',11,NULL); /*!40000 ALTER TABLE `llx_societe_extrafields` ENABLE KEYS */; UNLOCK TABLES; @@ -8251,7 +8251,7 @@ CREATE TABLE `llx_socpeople` ( KEY `idx_socpeople_fk_user_creat` (`fk_user_creat`), CONSTRAINT `fk_socpeople_fk_soc` FOREIGN KEY (`fk_soc`) REFERENCES `llx_societe` (`rowid`), CONSTRAINT `fk_socpeople_user_creat_user_rowid` FOREIGN KEY (`fk_user_creat`) REFERENCES `llx_user` (`rowid`) -) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -8260,7 +8260,7 @@ CREATE TABLE `llx_socpeople` ( LOCK TABLES `llx_socpeople` WRITE; /*!40000 ALTER TABLE `llx_socpeople` DISABLE KEYS */; -INSERT INTO `llx_socpeople` VALUES (1,'2010-07-08 14:26:14','2016-01-16 15:07:51',1,1,NULL,'MR','Indra','Mahala','','','',297,117,'2010-07-08','Project leader','','','','','','','',NULL,0,0,1,12,'Met during a congress at Dubai','',NULL,NULL,NULL,1),(2,'2010-07-08 22:44:50','2010-07-08 20:59:57',NULL,1,NULL,'MR','Freeman','Public','','','',200,11,NULL,'','','','','','','',NULL,NULL,0,0,1,1,'A friend that is a free contact not linked to any company',NULL,NULL,NULL,NULL,1),(3,'2010-07-08 22:59:02','2016-01-22 17:30:07',NULL,1,NULL,'MR','Mywife','Nicy','','','',NULL,11,'1980-10-03','','','','','','','','',NULL,1,0,1,12,'This is a private contact','',NULL,NULL,NULL,1),(4,'2010-07-09 00:16:58','2010-07-08 22:16:58',6,1,NULL,'MR','Rotchield','Evan','','','',NULL,6,NULL,'Bank director','','','','','','',NULL,NULL,0,0,1,1,'The bank director',NULL,NULL,NULL,NULL,1),(6,'2011-08-01 02:41:26','2016-01-22 17:29:53',17,1,NULL,'','Bookkeeper','Bob','99 account street','123456','BigTown',NULL,4,NULL,'book keeper','','','','','','','',NULL,0,0,1,12,'','',NULL,NULL,NULL,1),(7,'2016-07-30 16:11:06','2016-07-30 12:16:07',NULL,1,'','MR','Dad','','','','',NULL,14,'1967-09-04','','','','','','','','','',1,0,12,12,'','',NULL,NULL,NULL,1),(8,'2016-07-30 16:13:03','2016-07-30 12:15:58',NULL,1,'','MLE','Mom','','','','',NULL,14,NULL,'','','','','','','','','',1,0,12,12,'','',NULL,NULL,NULL,1),(9,'2016-07-30 16:14:41','2016-07-30 12:15:51',NULL,1,'','MR','Francky','','','89455','Virigia',NULL,205,'1980-07-09','Baker','555-98989898','','','','francky@example.com','','','',0,0,12,12,'','',NULL,NULL,NULL,1),(10,'2016-07-30 16:26:22','2016-07-30 12:52:38',10,1,'','MR','Eldy','','','33600','Pessac',NULL,1,'1972-10-10','Dolibarr project leader','','','','','eldy@example.com','','','ldestailleur_200x200.jpg',0,0,NULL,12,'','',NULL,NULL,NULL,1); +INSERT INTO `llx_socpeople` VALUES (1,'2010-07-08 14:26:14','2016-01-16 15:07:51',1,1,NULL,'MR','Indra','Mahala','','','',297,117,'2010-07-08','Project leader','','','','','','','',NULL,0,0,1,12,'Met during a congress at Dubai','',NULL,NULL,NULL,1),(2,'2010-07-08 22:44:50','2010-07-08 20:59:57',NULL,1,NULL,'MR','Freeman','Public','','','',200,11,NULL,'','','','','','','',NULL,NULL,0,0,1,1,'A friend that is a free contact not linked to any company',NULL,NULL,NULL,NULL,1),(3,'2010-07-08 22:59:02','2016-01-22 17:30:07',NULL,1,NULL,'MR','Mywife','Nicy','','','',NULL,11,'1980-10-03','','','','','','','','',NULL,1,0,1,12,'This is a private contact','',NULL,NULL,NULL,1),(4,'2010-07-09 00:16:58','2010-07-08 22:16:58',6,1,NULL,'MR','Rotchield','Evan','','','',NULL,6,NULL,'Bank director','','','','','','',NULL,NULL,0,0,1,1,'The bank director',NULL,NULL,NULL,NULL,1),(6,'2011-08-01 02:41:26','2016-01-22 17:29:53',17,1,NULL,'','Bookkeeper','Bob','99 account street','123456','BigTown',NULL,4,NULL,'book keeper','','','','','','','',NULL,0,0,1,12,'','',NULL,NULL,NULL,1),(7,'2016-07-30 16:11:06','2016-07-30 12:16:07',NULL,1,'','MR','Dad','','','','',NULL,14,'1967-09-04','','','','','','','','','',1,0,12,12,'','',NULL,NULL,NULL,1),(8,'2016-07-30 16:13:03','2016-07-30 12:15:58',NULL,1,'','MLE','Mom','','','','',NULL,14,NULL,'','','','','','','','','',1,0,12,12,'','',NULL,NULL,NULL,1),(9,'2016-07-30 16:14:41','2016-07-30 12:15:51',NULL,1,'','MR','Francky','','','89455','Virigia',NULL,205,'1980-07-09','Baker','555-98989898','','','','francky@example.com','','','',0,0,12,12,'','',NULL,NULL,NULL,1),(10,'2016-07-30 16:26:22','2016-07-30 12:52:38',10,1,'','MR','Eldy','','','33600','Pessac',NULL,1,'1972-10-10','Dolibarr project leader','','','','','eldy@example.com','','','ldestailleur_200x200.jpg',0,0,NULL,12,'','',NULL,NULL,NULL,1),(11,'2017-05-12 13:16:36','2017-05-12 09:18:20',11,1,'','MR','Smith','Laurent','45 Big road','897','Seattle',NULL,11,NULL,'Director','','','','','','','','ldestailleur_200x200.png',0,0,12,12,'','',NULL,NULL,NULL,1),(12,'2017-05-12 13:19:31','2017-05-12 09:19:42',11,1,'','MR','Einstein','','','','',NULL,11,NULL,'Genius','333444555','','','','genius@example.com','','','Einstein.jpg',0,0,12,12,'','',NULL,NULL,NULL,1); /*!40000 ALTER TABLE `llx_socpeople` ENABLE KEYS */; UNLOCK TABLES; @@ -8494,6 +8494,7 @@ CREATE TABLE `llx_supplier_proposaldet` ( `multicurrency_total_ht` double(24,8) DEFAULT '0.00000000', `multicurrency_total_tva` double(24,8) DEFAULT '0.00000000', `multicurrency_total_ttc` double(24,8) DEFAULT '0.00000000', + `fk_unit` int(11) DEFAULT NULL, PRIMARY KEY (`rowid`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; @@ -8504,7 +8505,7 @@ CREATE TABLE `llx_supplier_proposaldet` ( LOCK TABLES `llx_supplier_proposaldet` WRITE; /*!40000 ALTER TABLE `llx_supplier_proposaldet` DISABLE KEYS */; -INSERT INTO `llx_supplier_proposaldet` VALUES (2,2,NULL,NULL,NULL,'A powerfull computer with 8Gb memory.',NULL,0.000,'',0.000,'0',0.000,'0',1,0,0,NULL,200.00000000,200.00000000,0.00000000,0.00000000,0.00000000,200.00000000,0,0,0.00000000,NULL,0,1,'',1,'EUR',200.00000000,200.00000000,0.00000000,200.00000000); +INSERT INTO `llx_supplier_proposaldet` VALUES (2,2,NULL,NULL,NULL,'A powerfull computer with 8Gb memory.',NULL,0.000,'',0.000,'0',0.000,'0',1,0,0,NULL,200.00000000,200.00000000,0.00000000,0.00000000,0.00000000,200.00000000,0,0,0.00000000,NULL,0,1,'',1,'EUR',200.00000000,200.00000000,0.00000000,200.00000000,NULL); /*!40000 ALTER TABLE `llx_supplier_proposaldet` ENABLE KEYS */; UNLOCK TABLES; @@ -8652,7 +8653,7 @@ CREATE TABLE `llx_user` ( LOCK TABLES `llx_user` WRITE; /*!40000 ALTER TABLE `llx_user` DISABLE KEYS */; -INSERT INTO `llx_user` VALUES (1,'2010-07-08 13:20:11','2017-02-01 15:06:04',NULL,NULL,'aeinstein',0,NULL,NULL,NULL,1,0,NULL,'11c9c772d6471aa24c27274bdd8a223b',NULL,NULL,'Einstein','Albert','','','123456789','','','aeinstein@example.com','',0,'',1,1,NULL,NULL,NULL,'','2015-10-05 08:32:44','2015-10-03 11:43:50',NULL,'',1,'alberteinstein.jpg',NULL,NULL,14,NULL,'','','',NULL,NULL,'aaaaff','',NULL,0,0,NULL,NULL,NULL,NULL,'man',NULL,NULL),(2,'2010-07-08 13:54:48','2017-02-01 15:06:04',NULL,NULL,'demo',1,NULL,NULL,NULL,1,0,NULL,'fe01ce2a7fbac8fafaed7c982a04e229',NULL,NULL,'Doe','David','','','09123123','','','daviddoe@mycompany.com','',0,'',1,1,NULL,NULL,NULL,'','2016-07-30 23:10:54','2016-07-30 23:04:17',NULL,'',1,'johndoe.png',NULL,NULL,11,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,NULL,'man',NULL,NULL),(3,'2010-07-11 16:18:59','2017-02-01 15:06:04',NULL,NULL,'pcurie',1,NULL,NULL,NULL,1,0,NULL,'ab335b4eb4c3c99334f656e5db9584c9',NULL,NULL,'Curie','Pierre','','','','','','pcurie@example.com','',0,'',1,1,NULL,NULL,2,'','2012-12-21 17:38:55',NULL,NULL,'',1,'pierrecurie.jpg',NULL,NULL,14,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(4,'2013-01-23 17:52:27','2017-02-01 15:06:04',NULL,NULL,'bbookkeeper',1,NULL,NULL,NULL,1,0,NULL,'a7d30b58d647fcf59b7163f9592b1dbb',NULL,NULL,'Bookkeeper','Bob','Bookkeeper','','','','','','',0,'',1,1,17,6,NULL,'','2013-02-25 10:18:41','2013-01-23 17:53:20',NULL,'',1,NULL,NULL,NULL,11,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,NULL,'man',NULL,NULL),(10,'2015-10-03 11:47:41','2017-02-01 15:06:04',NULL,NULL,'mcurie',1,NULL,NULL,NULL,1,0,NULL,'52cda011808bb282d1d3625ab607a145',NULL,'t3mnkbhs','Curie','Marie','','','','','','','',0,NULL,1,1,NULL,NULL,NULL,'',NULL,NULL,NULL,'',1,'mariecurie.jpg',NULL,NULL,14,NULL,'','','',NULL,NULL,'ffaaff','',NULL,0,0,NULL,NULL,NULL,NULL,'woman',NULL,NULL),(11,'2015-10-05 09:07:52','2017-02-01 15:06:04',NULL,NULL,'zzeceo',1,NULL,NULL,NULL,1,0,NULL,'92af989c4c3a5140fb5d73eb77a52454',NULL,'cq78nf9m','Zeceo','Zack','President','','','','','','',0,NULL,1,1,NULL,NULL,NULL,'','2015-10-05 22:48:08','2015-10-05 21:18:46',NULL,'',1,NULL,NULL,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(12,'2015-10-05 09:09:46','2017-02-01 15:06:04',NULL,NULL,'admin',0,NULL,NULL,NULL,1,0,NULL,'21232f297a57a5a743894a0e4a801fc3',NULL,'nd6hgbcr','Adminson','Alice','Admin Technical','','','','','','',1,NULL,1,1,NULL,NULL,NULL,'','2017-02-21 15:44:05','2017-02-21 14:30:22',NULL,'',1,'mariecurie.jpg',NULL,NULL,11,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,NULL,'woman',NULL,NULL),(13,'2015-10-05 21:29:35','2017-02-01 15:06:04',NULL,NULL,'ccommercy',1,NULL,NULL,NULL,1,0,NULL,'179858e041af35e8f4c81d68c55fe9da',NULL,'y451ksdv','Commercy','Charle','Commercial leader','','','','','','',0,NULL,1,1,NULL,NULL,NULL,'',NULL,NULL,NULL,'',1,NULL,NULL,NULL,11,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,NULL,'man',NULL,NULL),(14,'2015-10-05 21:33:33','2017-02-01 15:06:04',NULL,NULL,'sscientol',1,NULL,NULL,NULL,1,0,NULL,'39bee07ac42f31c98e79cdcd5e5fe4c5',NULL,'s2hp8bxd','Scientol','Sam','Scientist leader','','','','','','',0,NULL,1,1,NULL,NULL,NULL,'',NULL,NULL,NULL,'',1,NULL,NULL,NULL,11,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(16,'2015-10-05 22:47:52','2017-02-20 16:49:00',NULL,NULL,'ccommerson',1,NULL,NULL,NULL,1,0,NULL,'d68005ccf362b82d084551b6291792a3',NULL,'cx9y1dk0','Charle1','Commerson','Sale representative','','','','','','',0,NULL,1,1,NULL,NULL,NULL,'','2015-10-05 23:46:24','2015-10-05 23:37:31',NULL,'',1,NULL,NULL,NULL,13,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(17,'2015-10-05 22:48:39','2017-02-01 15:06:04',NULL,NULL,'cc2',1,NULL,NULL,NULL,1,0,NULL,'a964065211872fb76f876c6c3e952ea3',NULL,'gw8cb7xj','Charle2','Commerson','Sale representative','','','','','','',0,NULL,1,1,NULL,NULL,NULL,'','2015-10-05 23:16:06',NULL,NULL,'',0,NULL,NULL,NULL,13,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,NULL,'man',NULL,NULL),(18,'2016-01-22 17:27:02','2017-02-01 15:06:04',NULL,NULL,'ldestailleur',1,NULL,NULL,NULL,1,0,NULL,'1bb7805145a7a5066df9e6d585b8b645',NULL,'87g06wbx','Destailleur','Laurent','Project leader of Dolibarr ERP CRM','','','','','ldestailleur@example.com','

Laurent DESTAILLEUR
\r\n\r\n
\r\n
Project Director
\r\nldestailleur@example.com
\r\n\r\n
 
\r\n\r\n\r\n
',0,NULL,1,1,10,10,NULL,'More information on http://www.destailleur.fr','2016-07-30 22:26:58',NULL,NULL,'',1,'ldestailleur_200x200.jpg',NULL,NULL,NULL,NULL,'','','',NULL,NULL,'007f7f','',NULL,0,0,NULL,NULL,NULL,NULL,'man',NULL,NULL),(19,'2017-02-02 03:55:44','2017-02-01 23:56:50',NULL,NULL,'aboston',1,NULL,NULL,NULL,1,0,NULL,'a7a77a5aff2d5fc2f75f2f61507c88d4',NULL,NULL,'Boston','Alex','','','','','','aboston@example.com','Alex Boston
\r\nAdmin support service - 555 01 02 03 04',0,NULL,1,1,NULL,NULL,NULL,'',NULL,NULL,NULL,'',1,NULL,NULL,NULL,12,25.00000000,'','','',NULL,NULL,'ff00ff','',NULL,0,0,NULL,NULL,NULL,32.00000000,NULL,NULL,'2014-11-04 00:00:00'); +INSERT INTO `llx_user` VALUES (1,'2010-07-08 13:20:11','2017-02-01 15:06:04',NULL,NULL,'aeinstein',0,NULL,NULL,NULL,1,0,NULL,'11c9c772d6471aa24c27274bdd8a223b',NULL,NULL,'Einstein','Albert','','','123456789','','','aeinstein@example.com','',0,'',1,1,NULL,NULL,NULL,'','2015-10-05 08:32:44','2015-10-03 11:43:50',NULL,'',1,'alberteinstein.jpg',NULL,NULL,14,NULL,'','','',NULL,NULL,'aaaaff','',NULL,0,0,NULL,NULL,NULL,NULL,'man',NULL,NULL),(2,'2010-07-08 13:54:48','2017-02-01 15:06:04',NULL,NULL,'demo',1,NULL,NULL,NULL,1,0,NULL,'fe01ce2a7fbac8fafaed7c982a04e229',NULL,NULL,'Doe','David','','','09123123','','','daviddoe@mycompany.com','',0,'',1,1,NULL,NULL,NULL,'','2016-07-30 23:10:54','2016-07-30 23:04:17',NULL,'',1,'johndoe.png',NULL,NULL,11,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,NULL,'man',NULL,NULL),(3,'2010-07-11 16:18:59','2017-02-01 15:06:04',NULL,NULL,'pcurie',1,NULL,NULL,NULL,1,0,NULL,'ab335b4eb4c3c99334f656e5db9584c9',NULL,NULL,'Curie','Pierre','','','','','','pcurie@example.com','',0,'',1,1,NULL,NULL,2,'','2012-12-21 17:38:55',NULL,NULL,'',1,'pierrecurie.jpg',NULL,NULL,14,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(4,'2013-01-23 17:52:27','2017-02-01 15:06:04',NULL,NULL,'bbookkeeper',1,NULL,NULL,NULL,1,0,NULL,'a7d30b58d647fcf59b7163f9592b1dbb',NULL,NULL,'Bookkeeper','Bob','Bookkeeper','','','','','','',0,'',1,1,17,6,NULL,'','2013-02-25 10:18:41','2013-01-23 17:53:20',NULL,'',1,NULL,NULL,NULL,11,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,NULL,'man',NULL,NULL),(10,'2015-10-03 11:47:41','2017-02-01 15:06:04',NULL,NULL,'mcurie',1,NULL,NULL,NULL,1,0,NULL,'52cda011808bb282d1d3625ab607a145',NULL,'t3mnkbhs','Curie','Marie','','','','','','','',0,NULL,1,1,NULL,NULL,NULL,'',NULL,NULL,NULL,'',1,'mariecurie.jpg',NULL,NULL,14,NULL,'','','',NULL,NULL,'ffaaff','',NULL,0,0,NULL,NULL,NULL,NULL,'woman',NULL,NULL),(11,'2015-10-05 09:07:52','2017-02-01 15:06:04',NULL,NULL,'zzeceo',1,NULL,NULL,NULL,1,0,NULL,'92af989c4c3a5140fb5d73eb77a52454',NULL,'cq78nf9m','Zeceo','Zack','President','','','','','','',0,NULL,1,1,NULL,NULL,NULL,'','2015-10-05 22:48:08','2015-10-05 21:18:46',NULL,'',1,NULL,NULL,NULL,NULL,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(12,'2015-10-05 09:09:46','2017-02-01 15:06:04',NULL,NULL,'admin',0,NULL,NULL,NULL,1,0,NULL,'21232f297a57a5a743894a0e4a801fc3',NULL,'nd6hgbcr','Adminson','Alice','Admin Technical','','','','','','',1,NULL,1,1,NULL,NULL,NULL,'','2017-05-12 13:02:48','2017-02-21 15:44:05',NULL,'',1,'mariecurie.jpg',NULL,NULL,11,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,NULL,'woman',NULL,NULL),(13,'2015-10-05 21:29:35','2017-02-01 15:06:04',NULL,NULL,'ccommercy',1,NULL,NULL,NULL,1,0,NULL,'179858e041af35e8f4c81d68c55fe9da',NULL,'y451ksdv','Commercy','Charle','Commercial leader','','','','','','',0,NULL,1,1,NULL,NULL,NULL,'',NULL,NULL,NULL,'',1,NULL,NULL,NULL,11,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,NULL,'man',NULL,NULL),(14,'2015-10-05 21:33:33','2017-02-01 15:06:04',NULL,NULL,'sscientol',1,NULL,NULL,NULL,1,0,NULL,'39bee07ac42f31c98e79cdcd5e5fe4c5',NULL,'s2hp8bxd','Scientol','Sam','Scientist leader','','','','','','',0,NULL,1,1,NULL,NULL,NULL,'',NULL,NULL,NULL,'',1,NULL,NULL,NULL,11,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(16,'2015-10-05 22:47:52','2017-02-20 16:49:00',NULL,NULL,'ccommerson',1,NULL,NULL,NULL,1,0,NULL,'d68005ccf362b82d084551b6291792a3',NULL,'cx9y1dk0','Charle1','Commerson','Sale representative','','','','','','',0,NULL,1,1,NULL,NULL,NULL,'','2015-10-05 23:46:24','2015-10-05 23:37:31',NULL,'',1,NULL,NULL,NULL,13,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL),(17,'2015-10-05 22:48:39','2017-02-01 15:06:04',NULL,NULL,'cc2',1,NULL,NULL,NULL,1,0,NULL,'a964065211872fb76f876c6c3e952ea3',NULL,'gw8cb7xj','Charle2','Commerson','Sale representative','','','','','','',0,NULL,1,1,NULL,NULL,NULL,'','2015-10-05 23:16:06',NULL,NULL,'',0,NULL,NULL,NULL,13,NULL,'','','',NULL,NULL,'','',NULL,0,0,NULL,NULL,NULL,NULL,'man',NULL,NULL),(18,'2016-01-22 17:27:02','2017-02-01 15:06:04',NULL,NULL,'ldestailleur',1,NULL,NULL,NULL,1,0,NULL,'1bb7805145a7a5066df9e6d585b8b645',NULL,'87g06wbx','Destailleur','Laurent','Project leader of Dolibarr ERP CRM','','','','','ldestailleur@example.com','
Laurent DESTAILLEUR
\r\n\r\n
\r\n
Project Director
\r\nldestailleur@example.com
\r\n\r\n
 
\r\n\r\n\r\n
',0,NULL,1,1,10,10,NULL,'More information on http://www.destailleur.fr','2016-07-30 22:26:58',NULL,NULL,'',1,'ldestailleur_200x200.jpg',NULL,NULL,NULL,NULL,'','','',NULL,NULL,'007f7f','',NULL,0,0,NULL,NULL,NULL,NULL,'man',NULL,NULL),(19,'2017-02-02 03:55:44','2017-02-01 23:56:50',NULL,NULL,'aboston',1,NULL,NULL,NULL,1,0,NULL,'a7a77a5aff2d5fc2f75f2f61507c88d4',NULL,NULL,'Boston','Alex','','','','','','aboston@example.com','Alex Boston
\r\nAdmin support service - 555 01 02 03 04',0,NULL,1,1,NULL,NULL,NULL,'',NULL,NULL,NULL,'',1,NULL,NULL,NULL,12,25.00000000,'','','',NULL,NULL,'ff00ff','',NULL,0,0,NULL,NULL,NULL,32.00000000,NULL,NULL,'2014-11-04 00:00:00'); /*!40000 ALTER TABLE `llx_user` ENABLE KEYS */; UNLOCK TABLES; @@ -8851,7 +8852,7 @@ CREATE TABLE `llx_user_rights` ( PRIMARY KEY (`rowid`), UNIQUE KEY `uk_user_rights` (`fk_user`,`fk_id`), CONSTRAINT `fk_user_rights_fk_user_user` FOREIGN KEY (`fk_user`) REFERENCES `llx_user` (`rowid`) -) ENGINE=InnoDB AUTO_INCREMENT=15469 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=15505 DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -8860,7 +8861,7 @@ CREATE TABLE `llx_user_rights` ( LOCK TABLES `llx_user_rights` WRITE; /*!40000 ALTER TABLE `llx_user_rights` DISABLE KEYS */; -INSERT INTO `llx_user_rights` VALUES (12402,1,11),(12380,1,12),(12385,1,13),(12389,1,14),(12393,1,15),(12398,1,16),(12404,1,19),(9726,1,21),(9700,1,22),(9706,1,24),(9711,1,25),(9716,1,26),(9722,1,27),(9728,1,28),(9978,1,31),(9968,1,32),(9974,1,34),(1910,1,36),(9980,1,38),(11573,1,41),(11574,1,42),(11575,1,44),(11576,1,45),(7184,1,61),(7181,1,62),(7183,1,64),(7185,1,67),(7186,1,68),(1678,1,71),(1673,1,72),(1675,1,74),(1679,1,75),(1677,1,76),(1681,1,78),(1682,1,79),(12322,1,81),(12309,1,82),(12312,1,84),(12314,1,86),(12317,1,87),(12320,1,88),(12323,1,89),(11580,1,91),(11581,1,92),(11582,1,93),(11583,1,94),(10097,1,95),(10099,1,96),(10103,1,97),(10104,1,98),(7139,1,101),(7134,1,102),(7136,1,104),(7137,1,105),(7138,1,106),(7140,1,109),(10229,1,111),(10201,1,112),(10207,1,113),(10213,1,114),(10219,1,115),(10225,1,116),(10231,1,117),(12518,1,121),(12508,1,122),(12514,1,125),(12520,1,126),(11577,1,141),(11578,1,142),(11579,1,144),(2307,1,151),(2304,1,152),(2306,1,153),(2308,1,154),(10092,1,161),(10093,1,162),(10094,1,163),(10095,1,164),(10096,1,165),(1585,1,170),(12342,1,171),(12331,1,172),(12335,1,173),(12339,1,174),(12343,1,178),(10000,1,221),(9990,1,222),(9996,1,223),(10002,1,229),(10007,1,237),(10011,1,238),(10015,1,239),(1686,1,241),(1685,1,242),(1687,1,243),(12604,1,251),(12566,1,252),(12569,1,253),(12572,1,254),(12575,1,255),(12579,1,256),(1617,1,258),(12525,1,262),(12544,1,281),(12534,1,282),(12540,1,283),(12546,1,286),(12288,1,300),(12290,1,301),(11591,1,302),(1763,1,331),(1762,1,332),(1764,1,333),(12582,1,341),(12584,1,342),(12586,1,343),(12588,1,344),(12600,1,351),(12593,1,352),(12597,1,353),(12601,1,354),(12605,1,358),(12560,1,531),(12553,1,532),(12557,1,534),(1625,1,536),(12561,1,538),(12358,1,700),(12348,1,701),(12354,1,702),(12360,1,703),(1755,1,1001),(1754,1,1002),(1756,1,1003),(1758,1,1004),(1759,1,1005),(7146,1,1101),(7143,1,1102),(7145,1,1104),(7147,1,1109),(12412,1,1181),(12458,1,1182),(12417,1,1183),(12420,1,1184),(12423,1,1185),(12427,1,1186),(12431,1,1187),(12437,1,1188),(12434,1,1189),(1578,1,1201),(1579,1,1202),(12454,1,1231),(12443,1,1232),(12446,1,1233),(12449,1,1234),(12452,1,1235),(12455,1,1236),(12459,1,1237),(1736,1,1251),(12409,1,1321),(12326,1,1421),(8190,1,1791),(8187,1,1792),(8191,1,1793),(12264,1,2401),(12260,1,2402),(12266,1,2403),(12280,1,2411),(12276,1,2412),(12282,1,2413),(12286,1,2414),(1618,1,2500),(12370,1,2501),(12367,1,2503),(12371,1,2515),(9610,1,5001),(9611,1,5002),(12490,1,20001),(12468,1,20002),(12474,1,20003),(12480,1,20004),(12486,1,20005),(12492,1,20006),(12302,1,23001),(12295,1,23002),(12299,1,23003),(12303,1,23004),(7701,1,50101),(4984,1,50401),(4983,1,50402),(4985,1,50403),(4987,1,50411),(4988,1,50412),(4989,1,50415),(12498,1,55001),(12499,1,55002),(3564,1,100700),(3565,1,100701),(9596,1,101051),(9598,1,101052),(9600,1,101053),(9604,1,101060),(9605,1,101061),(7177,1,101201),(7178,1,101202),(10353,1,101250),(10355,1,101251),(8980,1,101261),(8981,1,101262),(7616,1,101331),(10030,1,101701),(10031,1,101702),(3582,1,102000),(3583,1,102001),(9819,1,400051),(9823,1,400052),(9827,1,400053),(9831,1,400055),(132,2,11),(133,2,12),(134,2,13),(135,2,14),(136,2,16),(137,2,19),(138,2,21),(139,2,22),(140,2,24),(141,2,25),(142,2,26),(143,2,27),(10359,2,31),(145,2,32),(10361,2,34),(146,2,36),(147,2,41),(148,2,42),(149,2,44),(150,2,61),(151,2,62),(152,2,64),(153,2,71),(154,2,72),(155,2,74),(156,2,75),(157,2,78),(158,2,79),(159,2,81),(160,2,82),(161,2,84),(162,2,86),(163,2,87),(164,2,88),(165,2,89),(166,2,91),(167,2,92),(168,2,93),(2475,2,95),(2476,2,96),(2477,2,97),(2478,2,98),(169,2,101),(170,2,102),(171,2,104),(172,2,109),(173,2,111),(174,2,112),(175,2,113),(176,2,114),(177,2,116),(178,2,117),(179,2,121),(180,2,122),(181,2,125),(182,2,141),(183,2,142),(184,2,144),(2479,2,151),(2480,2,152),(2481,2,153),(2482,2,154),(185,2,161),(186,2,162),(187,2,163),(188,2,164),(189,2,165),(190,2,170),(2471,2,171),(192,2,172),(2472,2,173),(193,2,221),(194,2,222),(195,2,229),(196,2,241),(197,2,242),(198,2,243),(199,2,251),(201,2,262),(202,2,281),(203,2,282),(204,2,283),(205,2,331),(15072,2,510),(2483,2,531),(207,2,532),(2484,2,534),(208,2,536),(2473,2,700),(210,2,701),(211,2,702),(2474,2,703),(15064,2,771),(15057,2,772),(15059,2,773),(15061,2,774),(15063,2,775),(15065,2,776),(212,2,1001),(213,2,1002),(214,2,1003),(215,2,1004),(216,2,1005),(217,2,1101),(218,2,1102),(219,2,1104),(220,2,1109),(15073,2,1121),(15074,2,1122),(15075,2,1123),(15076,2,1124),(15077,2,1125),(15078,2,1126),(221,2,1181),(222,2,1182),(223,2,1183),(224,2,1184),(225,2,1185),(226,2,1186),(227,2,1187),(228,2,1188),(229,2,1201),(230,2,1202),(231,2,1231),(232,2,1232),(233,2,1233),(234,2,1234),(235,2,1421),(236,2,2401),(237,2,2402),(238,2,2403),(239,2,2411),(240,2,2412),(241,2,2413),(242,2,2500),(2470,2,2501),(243,2,2515),(10363,2,20001),(10364,2,20002),(10365,2,20003),(10366,2,20004),(10367,2,20005),(10368,2,20006),(15054,2,23001),(10362,2,50101),(15067,2,55001),(15066,2,59001),(15068,2,63001),(15069,2,63002),(15070,2,63003),(15071,2,63004),(10372,2,101250),(1807,3,11),(1808,3,31),(1809,3,36),(1810,3,41),(1811,3,61),(1812,3,71),(1813,3,72),(1814,3,74),(1815,3,75),(1816,3,78),(1817,3,79),(1818,3,91),(1819,3,95),(1820,3,97),(1821,3,111),(1822,3,121),(1823,3,122),(1824,3,125),(1825,3,161),(1826,3,170),(1827,3,171),(1828,3,172),(1829,3,221),(1830,3,222),(1831,3,229),(1832,3,241),(1833,3,242),(1834,3,243),(1835,3,251),(1836,3,255),(1837,3,256),(1838,3,262),(1839,3,281),(1840,3,282),(1841,3,283),(1842,3,331),(1843,3,531),(1844,3,536),(1845,3,700),(1846,3,1001),(1847,3,1002),(1848,3,1003),(1849,3,1004),(1850,3,1005),(1851,3,1181),(1852,3,1182),(1853,3,1201),(1854,3,1202),(1855,3,1231),(1856,3,2401),(1857,3,2402),(1858,3,2403),(1859,3,2411),(1860,3,2412),(1861,3,2413),(1862,3,2500),(1863,3,2515),(8026,4,11),(8027,4,21),(8028,4,31),(8029,4,41),(8030,4,61),(8031,4,71),(8032,4,72),(8033,4,74),(8034,4,75),(8035,4,78),(8036,4,79),(8037,4,81),(8038,4,91),(8039,4,95),(8040,4,97),(8041,4,101),(8042,4,111),(8043,4,121),(8044,4,151),(8045,4,161),(8046,4,171),(8047,4,221),(8048,4,222),(8049,4,229),(8050,4,241),(8051,4,242),(8052,4,243),(8146,4,251),(8147,4,253),(8053,4,262),(8054,4,281),(8055,4,331),(8056,4,341),(8057,4,342),(8058,4,343),(8059,4,344),(8060,4,531),(8061,4,700),(8062,4,1001),(8063,4,1002),(8064,4,1003),(8065,4,1004),(8066,4,1005),(8067,4,1101),(8068,4,1181),(8069,4,1182),(8070,4,1201),(8071,4,1202),(8072,4,1231),(8073,4,2401),(8074,4,2501),(8075,4,2503),(8076,4,2515),(8077,4,20001),(8078,4,50101),(8079,4,101201),(8080,4,101261),(8081,4,102000),(8082,4,400051),(8083,4,400052),(8084,4,400053),(8085,4,400055),(12608,10,11),(12609,10,21),(12610,10,31),(12611,10,41),(12612,10,61),(12613,10,71),(12614,10,72),(12615,10,74),(12616,10,75),(12617,10,78),(12618,10,79),(12619,10,81),(12620,10,91),(12621,10,95),(12622,10,97),(12623,10,101),(12624,10,111),(12625,10,121),(12626,10,151),(12627,10,161),(12628,10,171),(12629,10,221),(12630,10,222),(12631,10,229),(12632,10,241),(12633,10,242),(12634,10,243),(12635,10,262),(12636,10,281),(12637,10,300),(12638,10,331),(12639,10,341),(12640,10,342),(12641,10,343),(12642,10,344),(12643,10,531),(12644,10,700),(12645,10,1001),(12646,10,1002),(12647,10,1003),(12648,10,1004),(12649,10,1005),(12650,10,1101),(12651,10,1181),(12652,10,1182),(12653,10,1201),(12654,10,1202),(12655,10,1231),(12656,10,2401),(12657,10,2501),(12658,10,2503),(12659,10,2515),(12660,10,20001),(12661,10,20002),(12662,10,23001),(12663,10,50101),(12664,11,11),(12665,11,21),(12666,11,31),(12667,11,41),(12668,11,61),(12669,11,71),(12670,11,72),(12671,11,74),(12672,11,75),(12673,11,78),(12674,11,79),(12675,11,81),(12676,11,91),(12677,11,95),(12678,11,97),(12679,11,101),(12680,11,111),(12681,11,121),(12682,11,151),(12683,11,161),(12684,11,171),(12685,11,221),(12686,11,222),(12687,11,229),(12688,11,241),(12689,11,242),(12690,11,243),(12691,11,262),(12692,11,281),(12693,11,300),(12694,11,331),(12695,11,341),(12696,11,342),(12697,11,343),(12698,11,344),(12699,11,531),(12700,11,700),(12701,11,1001),(12702,11,1002),(12703,11,1003),(12704,11,1004),(12705,11,1005),(12706,11,1101),(12707,11,1181),(12708,11,1182),(12709,11,1201),(12710,11,1202),(12711,11,1231),(12712,11,2401),(12713,11,2501),(12714,11,2503),(12715,11,2515),(12716,11,20001),(12717,11,20002),(12718,11,23001),(12719,11,50101),(15463,12,11),(15453,12,12),(15455,12,13),(15457,12,14),(15459,12,15),(15462,12,16),(15465,12,19),(14146,12,21),(14135,12,22),(14137,12,24),(14139,12,25),(14142,12,26),(14145,12,27),(14148,12,28),(14930,12,31),(14926,12,32),(14929,12,34),(14932,12,38),(13816,12,41),(13813,12,42),(13815,12,44),(13817,12,45),(14094,12,61),(14091,12,62),(14093,12,64),(14095,12,67),(14096,12,68),(13891,12,71),(13886,12,72),(13888,12,74),(13892,12,75),(13890,12,76),(13894,12,78),(13895,12,79),(14955,12,81),(14949,12,82),(14950,12,84),(14951,12,86),(14953,12,87),(14954,12,88),(14956,12,89),(15401,12,91),(15397,12,92),(15400,12,93),(15403,12,94),(13990,12,95),(12734,12,97),(14939,12,101),(14935,12,102),(14936,12,104),(14937,12,105),(14938,12,106),(14940,12,109),(15390,12,111),(15377,12,112),(15380,12,113),(15383,12,114),(15386,12,115),(15389,12,116),(15392,12,117),(15415,12,121),(15411,12,122),(15414,12,125),(15417,12,126),(13821,12,141),(13820,12,142),(13822,12,144),(13912,12,151),(13909,12,152),(13911,12,153),(13913,12,154),(14063,12,161),(14056,12,162),(14058,12,163),(14060,12,164),(14062,12,165),(14064,12,167),(13350,12,171),(13345,12,172),(13347,12,173),(13349,12,174),(13351,12,178),(13838,12,221),(13834,12,222),(13837,12,223),(13840,12,229),(13842,12,237),(13844,12,238),(13846,12,239),(13516,12,241),(13515,12,242),(13517,12,243),(14730,12,251),(14711,12,252),(14713,12,253),(14714,12,254),(14716,12,255),(14718,12,256),(15419,12,262),(15428,12,281),(15424,12,282),(15427,12,283),(15430,12,286),(15440,12,300),(15441,12,301),(14126,12,331),(14125,12,332),(14127,12,333),(14719,12,341),(14720,12,342),(14721,12,343),(14722,12,344),(14728,12,351),(14725,12,352),(14727,12,353),(14729,12,354),(14731,12,358),(13865,12,510),(13862,12,512),(13864,12,514),(13866,12,517),(15291,12,520),(15286,12,522),(15288,12,524),(15290,12,525),(15292,12,527),(14686,12,531),(14683,12,532),(14685,12,534),(14687,12,538),(13358,12,700),(14832,12,701),(14831,12,702),(14834,12,703),(15090,12,771),(15081,12,772),(15083,12,773),(15085,12,774),(15087,12,775),(15089,12,776),(15091,12,779),(14917,12,1001),(14916,12,1002),(14918,12,1003),(14920,12,1004),(14921,12,1005),(14945,12,1101),(14943,12,1102),(14944,12,1104),(14946,12,1109),(14762,12,1121),(14755,12,1122),(14757,12,1123),(14759,12,1124),(14761,12,1125),(14763,12,1126),(14982,12,1181),(15005,12,1182),(14985,12,1183),(14986,12,1184),(14988,12,1185),(14990,12,1186),(14992,12,1187),(14995,12,1188),(14993,12,1189),(13827,12,1201),(13828,12,1202),(15003,12,1231),(14998,12,1232),(14999,12,1233),(15001,12,1234),(15002,12,1235),(15004,12,1236),(15006,12,1237),(13829,12,1251),(15467,12,1321),(15468,12,1322),(14957,12,1421),(15036,12,2401),(15035,12,2402),(15038,12,2403),(15044,12,2411),(15043,12,2412),(15046,12,2413),(15047,12,2414),(14591,12,2501),(14590,12,2503),(14592,12,2515),(15435,12,5001),(15436,12,5002),(14651,12,20001),(14641,12,20002),(14644,12,20003),(14647,12,20004),(14650,12,20005),(14653,12,20006),(15447,12,23001),(15444,12,23002),(15446,12,23003),(15448,12,23004),(13712,12,50101),(15323,12,50401),(15325,12,50411),(15326,12,50412),(15327,12,50420),(15328,12,50430),(15322,12,50440),(15052,12,55001),(15053,12,55002),(14128,12,59001),(14129,12,59002),(14130,12,59003),(14818,12,63001),(14815,12,63002),(14817,12,63003),(14819,12,63004),(15241,12,64001),(15438,12,101701),(15439,12,101702),(12776,13,11),(12777,13,21),(12778,13,31),(12779,13,41),(12780,13,61),(12781,13,71),(12782,13,72),(12783,13,74),(12784,13,75),(12785,13,78),(12786,13,79),(12787,13,81),(12788,13,91),(12789,13,95),(12790,13,97),(12791,13,101),(12792,13,111),(12793,13,121),(12794,13,151),(12795,13,161),(12796,13,171),(12797,13,221),(12798,13,222),(12799,13,229),(12800,13,241),(12801,13,242),(12802,13,243),(12803,13,262),(12804,13,281),(12805,13,300),(12806,13,331),(12807,13,341),(12808,13,342),(12809,13,343),(12810,13,344),(12811,13,531),(12812,13,700),(12813,13,1001),(12814,13,1002),(12815,13,1003),(12816,13,1004),(12817,13,1005),(12818,13,1101),(12819,13,1181),(12820,13,1182),(12821,13,1201),(12822,13,1202),(12823,13,1231),(12824,13,2401),(12825,13,2501),(12826,13,2503),(12827,13,2515),(12828,13,20001),(12829,13,20002),(12830,13,23001),(12831,13,50101),(12832,14,11),(12833,14,21),(12834,14,31),(12835,14,41),(12836,14,61),(12837,14,71),(12838,14,72),(12839,14,74),(12840,14,75),(12841,14,78),(12842,14,79),(12843,14,81),(12844,14,91),(12845,14,95),(12846,14,97),(12847,14,101),(12848,14,111),(12849,14,121),(12850,14,151),(12851,14,161),(12852,14,171),(12853,14,221),(12854,14,222),(12855,14,229),(12856,14,241),(12857,14,242),(12858,14,243),(12859,14,262),(12860,14,281),(12861,14,300),(12862,14,331),(12863,14,341),(12864,14,342),(12865,14,343),(12866,14,344),(12867,14,531),(12868,14,700),(12869,14,1001),(12870,14,1002),(12871,14,1003),(12872,14,1004),(12873,14,1005),(12874,14,1101),(12875,14,1181),(12876,14,1182),(12877,14,1201),(12878,14,1202),(12879,14,1231),(12880,14,2401),(12881,14,2501),(12882,14,2503),(12883,14,2515),(12884,14,20001),(12885,14,20002),(12886,14,23001),(12887,14,50101),(12944,16,11),(12945,16,21),(12946,16,31),(13056,16,41),(13057,16,42),(13058,16,44),(13059,16,45),(12948,16,61),(12949,16,71),(12950,16,72),(12951,16,74),(12952,16,75),(12953,16,78),(12954,16,79),(12955,16,81),(12956,16,91),(12957,16,95),(12958,16,97),(12959,16,101),(12960,16,111),(12961,16,121),(13060,16,141),(13061,16,142),(13062,16,144),(12962,16,151),(12963,16,161),(12964,16,171),(12965,16,221),(12966,16,222),(12967,16,229),(12968,16,241),(12969,16,242),(12970,16,243),(13128,16,251),(13064,16,262),(12972,16,281),(12973,16,300),(12974,16,331),(12975,16,341),(12976,16,342),(12977,16,343),(12978,16,344),(12979,16,531),(12980,16,700),(12981,16,1001),(12982,16,1002),(12983,16,1003),(12984,16,1004),(12985,16,1005),(12986,16,1101),(12987,16,1181),(12988,16,1182),(12989,16,1201),(12990,16,1202),(12991,16,1231),(12992,16,2401),(12993,16,2501),(12994,16,2503),(12995,16,2515),(12996,16,20001),(12997,16,20002),(12998,16,23001),(12999,16,50101),(13000,17,11),(13001,17,21),(13002,17,31),(13065,17,41),(13066,17,42),(13067,17,44),(13068,17,45),(13004,17,61),(13005,17,71),(13006,17,72),(13007,17,74),(13008,17,75),(13009,17,78),(13010,17,79),(13011,17,81),(13012,17,91),(13013,17,95),(13014,17,97),(13015,17,101),(13016,17,111),(13017,17,121),(13069,17,141),(13070,17,142),(13071,17,144),(13018,17,151),(13019,17,161),(13020,17,171),(13021,17,221),(13022,17,222),(13023,17,229),(13024,17,241),(13025,17,242),(13026,17,243),(13028,17,281),(13029,17,300),(13030,17,331),(13031,17,341),(13032,17,342),(13033,17,343),(13034,17,344),(13035,17,531),(13036,17,700),(13037,17,1001),(13038,17,1002),(13039,17,1003),(13040,17,1004),(13041,17,1005),(13042,17,1101),(13043,17,1181),(13044,17,1182),(13045,17,1201),(13046,17,1202),(13047,17,1231),(13048,17,2401),(13049,17,2501),(13050,17,2503),(13051,17,2515),(13052,17,20001),(13053,17,20002),(13054,17,23001),(13055,17,50101),(14504,18,11),(14505,18,21),(14506,18,31),(14507,18,41),(14508,18,61),(14509,18,71),(14510,18,78),(14511,18,81),(14512,18,91),(14513,18,95),(14514,18,101),(14515,18,111),(14516,18,121),(14517,18,151),(14518,18,161),(14519,18,221),(14520,18,241),(14521,18,262),(14522,18,281),(14523,18,300),(14524,18,331),(14525,18,332),(14526,18,333),(14527,18,341),(14528,18,342),(14529,18,343),(14530,18,344),(14531,18,531),(14532,18,701),(14533,18,771),(14534,18,774),(14535,18,1001),(14536,18,1004),(14537,18,1101),(14538,18,1181),(14539,18,1182),(14540,18,1201),(14541,18,1231),(14542,18,2401),(14543,18,2501),(14544,18,2503),(14545,18,2515),(14546,18,20001),(14547,18,20002),(14548,18,50101),(14549,18,59001),(15242,19,21),(15243,19,31),(15244,19,41),(15245,19,61),(15246,19,71),(15247,19,78),(15248,19,81),(15249,19,101),(15250,19,121),(15251,19,151),(15252,19,161),(15253,19,221),(15254,19,241),(15255,19,262),(15256,19,281),(15257,19,300),(15258,19,331),(15259,19,332),(15260,19,341),(15261,19,342),(15262,19,343),(15263,19,344),(15264,19,531),(15265,19,701),(15266,19,771),(15267,19,774),(15268,19,777),(15269,19,1001),(15270,19,1004),(15271,19,1101),(15272,19,1121),(15273,19,1181),(15274,19,1182),(15275,19,1201),(15276,19,1231),(15277,19,2401),(15278,19,2501),(15279,19,20001),(15280,19,20002),(15281,19,50101),(15282,19,59001),(15283,19,63001); +INSERT INTO `llx_user_rights` VALUES (12402,1,11),(12380,1,12),(12385,1,13),(12389,1,14),(12393,1,15),(12398,1,16),(12404,1,19),(9726,1,21),(9700,1,22),(9706,1,24),(9711,1,25),(9716,1,26),(9722,1,27),(9728,1,28),(9978,1,31),(9968,1,32),(9974,1,34),(1910,1,36),(9980,1,38),(11573,1,41),(11574,1,42),(11575,1,44),(11576,1,45),(7184,1,61),(7181,1,62),(7183,1,64),(7185,1,67),(7186,1,68),(1678,1,71),(1673,1,72),(1675,1,74),(1679,1,75),(1677,1,76),(1681,1,78),(1682,1,79),(12322,1,81),(12309,1,82),(12312,1,84),(12314,1,86),(12317,1,87),(12320,1,88),(12323,1,89),(11580,1,91),(11581,1,92),(11582,1,93),(11583,1,94),(10097,1,95),(10099,1,96),(10103,1,97),(10104,1,98),(7139,1,101),(7134,1,102),(7136,1,104),(7137,1,105),(7138,1,106),(7140,1,109),(10229,1,111),(10201,1,112),(10207,1,113),(10213,1,114),(10219,1,115),(10225,1,116),(10231,1,117),(12518,1,121),(12508,1,122),(12514,1,125),(12520,1,126),(11577,1,141),(11578,1,142),(11579,1,144),(2307,1,151),(2304,1,152),(2306,1,153),(2308,1,154),(10092,1,161),(10093,1,162),(10094,1,163),(10095,1,164),(10096,1,165),(1585,1,170),(12342,1,171),(12331,1,172),(12335,1,173),(12339,1,174),(12343,1,178),(10000,1,221),(9990,1,222),(9996,1,223),(10002,1,229),(10007,1,237),(10011,1,238),(10015,1,239),(1686,1,241),(1685,1,242),(1687,1,243),(12604,1,251),(12566,1,252),(12569,1,253),(12572,1,254),(12575,1,255),(12579,1,256),(1617,1,258),(12525,1,262),(12544,1,281),(12534,1,282),(12540,1,283),(12546,1,286),(12288,1,300),(12290,1,301),(11591,1,302),(1763,1,331),(1762,1,332),(1764,1,333),(12582,1,341),(12584,1,342),(12586,1,343),(12588,1,344),(12600,1,351),(12593,1,352),(12597,1,353),(12601,1,354),(12605,1,358),(12560,1,531),(12553,1,532),(12557,1,534),(1625,1,536),(12561,1,538),(12358,1,700),(12348,1,701),(12354,1,702),(12360,1,703),(1755,1,1001),(1754,1,1002),(1756,1,1003),(1758,1,1004),(1759,1,1005),(7146,1,1101),(7143,1,1102),(7145,1,1104),(7147,1,1109),(12412,1,1181),(12458,1,1182),(12417,1,1183),(12420,1,1184),(12423,1,1185),(12427,1,1186),(12431,1,1187),(12437,1,1188),(12434,1,1189),(1578,1,1201),(1579,1,1202),(12454,1,1231),(12443,1,1232),(12446,1,1233),(12449,1,1234),(12452,1,1235),(12455,1,1236),(12459,1,1237),(1736,1,1251),(12409,1,1321),(12326,1,1421),(8190,1,1791),(8187,1,1792),(8191,1,1793),(12264,1,2401),(12260,1,2402),(12266,1,2403),(12280,1,2411),(12276,1,2412),(12282,1,2413),(12286,1,2414),(1618,1,2500),(12370,1,2501),(12367,1,2503),(12371,1,2515),(9610,1,5001),(9611,1,5002),(12490,1,20001),(12468,1,20002),(12474,1,20003),(12480,1,20004),(12486,1,20005),(12492,1,20006),(12302,1,23001),(12295,1,23002),(12299,1,23003),(12303,1,23004),(7701,1,50101),(4984,1,50401),(4983,1,50402),(4985,1,50403),(4987,1,50411),(4988,1,50412),(4989,1,50415),(12498,1,55001),(12499,1,55002),(3564,1,100700),(3565,1,100701),(9596,1,101051),(9598,1,101052),(9600,1,101053),(9604,1,101060),(9605,1,101061),(7177,1,101201),(7178,1,101202),(10353,1,101250),(10355,1,101251),(8980,1,101261),(8981,1,101262),(7616,1,101331),(10030,1,101701),(10031,1,101702),(3582,1,102000),(3583,1,102001),(9819,1,400051),(9823,1,400052),(9827,1,400053),(9831,1,400055),(132,2,11),(133,2,12),(134,2,13),(135,2,14),(136,2,16),(137,2,19),(138,2,21),(139,2,22),(140,2,24),(141,2,25),(142,2,26),(143,2,27),(10359,2,31),(145,2,32),(10361,2,34),(146,2,36),(147,2,41),(148,2,42),(149,2,44),(150,2,61),(151,2,62),(152,2,64),(153,2,71),(154,2,72),(155,2,74),(156,2,75),(157,2,78),(158,2,79),(159,2,81),(160,2,82),(161,2,84),(162,2,86),(163,2,87),(164,2,88),(165,2,89),(166,2,91),(167,2,92),(168,2,93),(2475,2,95),(2476,2,96),(2477,2,97),(2478,2,98),(169,2,101),(170,2,102),(171,2,104),(172,2,109),(173,2,111),(174,2,112),(175,2,113),(176,2,114),(177,2,116),(178,2,117),(179,2,121),(180,2,122),(181,2,125),(182,2,141),(183,2,142),(184,2,144),(2479,2,151),(2480,2,152),(2481,2,153),(2482,2,154),(185,2,161),(186,2,162),(187,2,163),(188,2,164),(189,2,165),(190,2,170),(2471,2,171),(192,2,172),(2472,2,173),(193,2,221),(194,2,222),(195,2,229),(196,2,241),(197,2,242),(198,2,243),(199,2,251),(201,2,262),(202,2,281),(203,2,282),(204,2,283),(205,2,331),(15072,2,510),(2483,2,531),(207,2,532),(2484,2,534),(208,2,536),(2473,2,700),(210,2,701),(211,2,702),(2474,2,703),(15064,2,771),(15057,2,772),(15059,2,773),(15061,2,774),(15063,2,775),(15065,2,776),(212,2,1001),(213,2,1002),(214,2,1003),(215,2,1004),(216,2,1005),(217,2,1101),(218,2,1102),(219,2,1104),(220,2,1109),(15073,2,1121),(15074,2,1122),(15075,2,1123),(15076,2,1124),(15077,2,1125),(15078,2,1126),(221,2,1181),(222,2,1182),(223,2,1183),(224,2,1184),(225,2,1185),(226,2,1186),(227,2,1187),(228,2,1188),(229,2,1201),(230,2,1202),(231,2,1231),(232,2,1232),(233,2,1233),(234,2,1234),(235,2,1421),(236,2,2401),(237,2,2402),(238,2,2403),(239,2,2411),(240,2,2412),(241,2,2413),(242,2,2500),(2470,2,2501),(243,2,2515),(10363,2,20001),(10364,2,20002),(10365,2,20003),(10366,2,20004),(10367,2,20005),(10368,2,20006),(15054,2,23001),(10362,2,50101),(15067,2,55001),(15066,2,59001),(15068,2,63001),(15069,2,63002),(15070,2,63003),(15071,2,63004),(10372,2,101250),(1807,3,11),(1808,3,31),(1809,3,36),(1810,3,41),(1811,3,61),(1812,3,71),(1813,3,72),(1814,3,74),(1815,3,75),(1816,3,78),(1817,3,79),(1818,3,91),(1819,3,95),(1820,3,97),(1821,3,111),(1822,3,121),(1823,3,122),(1824,3,125),(1825,3,161),(1826,3,170),(1827,3,171),(1828,3,172),(1829,3,221),(1830,3,222),(1831,3,229),(1832,3,241),(1833,3,242),(1834,3,243),(1835,3,251),(1836,3,255),(1837,3,256),(1838,3,262),(1839,3,281),(1840,3,282),(1841,3,283),(1842,3,331),(1843,3,531),(1844,3,536),(1845,3,700),(1846,3,1001),(1847,3,1002),(1848,3,1003),(1849,3,1004),(1850,3,1005),(1851,3,1181),(1852,3,1182),(1853,3,1201),(1854,3,1202),(1855,3,1231),(1856,3,2401),(1857,3,2402),(1858,3,2403),(1859,3,2411),(1860,3,2412),(1861,3,2413),(1862,3,2500),(1863,3,2515),(8026,4,11),(8027,4,21),(8028,4,31),(8029,4,41),(8030,4,61),(8031,4,71),(8032,4,72),(8033,4,74),(8034,4,75),(8035,4,78),(8036,4,79),(8037,4,81),(8038,4,91),(8039,4,95),(8040,4,97),(8041,4,101),(8042,4,111),(8043,4,121),(8044,4,151),(8045,4,161),(8046,4,171),(8047,4,221),(8048,4,222),(8049,4,229),(8050,4,241),(8051,4,242),(8052,4,243),(8146,4,251),(8147,4,253),(8053,4,262),(8054,4,281),(8055,4,331),(8056,4,341),(8057,4,342),(8058,4,343),(8059,4,344),(8060,4,531),(8061,4,700),(8062,4,1001),(8063,4,1002),(8064,4,1003),(8065,4,1004),(8066,4,1005),(8067,4,1101),(8068,4,1181),(8069,4,1182),(8070,4,1201),(8071,4,1202),(8072,4,1231),(8073,4,2401),(8074,4,2501),(8075,4,2503),(8076,4,2515),(8077,4,20001),(8078,4,50101),(8079,4,101201),(8080,4,101261),(8081,4,102000),(8082,4,400051),(8083,4,400052),(8084,4,400053),(8085,4,400055),(12608,10,11),(12609,10,21),(12610,10,31),(12611,10,41),(12612,10,61),(12613,10,71),(12614,10,72),(12615,10,74),(12616,10,75),(12617,10,78),(12618,10,79),(12619,10,81),(12620,10,91),(12621,10,95),(12622,10,97),(12623,10,101),(12624,10,111),(12625,10,121),(12626,10,151),(12627,10,161),(12628,10,171),(12629,10,221),(12630,10,222),(12631,10,229),(12632,10,241),(12633,10,242),(12634,10,243),(12635,10,262),(12636,10,281),(12637,10,300),(12638,10,331),(12639,10,341),(12640,10,342),(12641,10,343),(12642,10,344),(12643,10,531),(12644,10,700),(12645,10,1001),(12646,10,1002),(12647,10,1003),(12648,10,1004),(12649,10,1005),(12650,10,1101),(12651,10,1181),(12652,10,1182),(12653,10,1201),(12654,10,1202),(12655,10,1231),(12656,10,2401),(12657,10,2501),(12658,10,2503),(12659,10,2515),(12660,10,20001),(12661,10,20002),(12662,10,23001),(12663,10,50101),(12664,11,11),(12665,11,21),(12666,11,31),(12667,11,41),(12668,11,61),(12669,11,71),(12670,11,72),(12671,11,74),(12672,11,75),(12673,11,78),(12674,11,79),(12675,11,81),(12676,11,91),(12677,11,95),(12678,11,97),(12679,11,101),(12680,11,111),(12681,11,121),(12682,11,151),(12683,11,161),(12684,11,171),(12685,11,221),(12686,11,222),(12687,11,229),(12688,11,241),(12689,11,242),(12690,11,243),(12691,11,262),(12692,11,281),(12693,11,300),(12694,11,331),(12695,11,341),(12696,11,342),(12697,11,343),(12698,11,344),(12699,11,531),(12700,11,700),(12701,11,1001),(12702,11,1002),(12703,11,1003),(12704,11,1004),(12705,11,1005),(12706,11,1101),(12707,11,1181),(12708,11,1182),(12709,11,1201),(12710,11,1202),(12711,11,1231),(12712,11,2401),(12713,11,2501),(12714,11,2503),(12715,11,2515),(12716,11,20001),(12717,11,20002),(12718,11,23001),(12719,11,50101),(15492,12,11),(15482,12,12),(15484,12,13),(15486,12,14),(15488,12,15),(15491,12,16),(15494,12,19),(14146,12,21),(14135,12,22),(14137,12,24),(14139,12,25),(14142,12,26),(14145,12,27),(14148,12,28),(14930,12,31),(14926,12,32),(14929,12,34),(14932,12,38),(13816,12,41),(13813,12,42),(13815,12,44),(13817,12,45),(14094,12,61),(14091,12,62),(14093,12,64),(14095,12,67),(14096,12,68),(13891,12,71),(13886,12,72),(13888,12,74),(13892,12,75),(13890,12,76),(13894,12,78),(13895,12,79),(14955,12,81),(14949,12,82),(14950,12,84),(14951,12,86),(14953,12,87),(14954,12,88),(14956,12,89),(15401,12,91),(15397,12,92),(15400,12,93),(15403,12,94),(13990,12,95),(12734,12,97),(14939,12,101),(14935,12,102),(14936,12,104),(14937,12,105),(14938,12,106),(14940,12,109),(15390,12,111),(15377,12,112),(15380,12,113),(15383,12,114),(15386,12,115),(15389,12,116),(15392,12,117),(15415,12,121),(15411,12,122),(15414,12,125),(15417,12,126),(13821,12,141),(13820,12,142),(13822,12,144),(13912,12,151),(13909,12,152),(13911,12,153),(13913,12,154),(14063,12,161),(14056,12,162),(14058,12,163),(14060,12,164),(14062,12,165),(14064,12,167),(13350,12,171),(13345,12,172),(13347,12,173),(13349,12,174),(13351,12,178),(13838,12,221),(13834,12,222),(13837,12,223),(13840,12,229),(13842,12,237),(13844,12,238),(13846,12,239),(13516,12,241),(13515,12,242),(13517,12,243),(14730,12,251),(14711,12,252),(14713,12,253),(14714,12,254),(14716,12,255),(14718,12,256),(15419,12,262),(15428,12,281),(15424,12,282),(15427,12,283),(15430,12,286),(15469,12,300),(15470,12,301),(14126,12,331),(14125,12,332),(14127,12,333),(14719,12,341),(14720,12,342),(14721,12,343),(14722,12,344),(14728,12,351),(14725,12,352),(14727,12,353),(14729,12,354),(14731,12,358),(13865,12,510),(13862,12,512),(13864,12,514),(13866,12,517),(15291,12,520),(15286,12,522),(15288,12,524),(15290,12,525),(15292,12,527),(14686,12,531),(14683,12,532),(14685,12,534),(14687,12,538),(13358,12,700),(14832,12,701),(14831,12,702),(14834,12,703),(15090,12,771),(15081,12,772),(15083,12,773),(15085,12,774),(15087,12,775),(15089,12,776),(15091,12,779),(14917,12,1001),(14916,12,1002),(14918,12,1003),(14920,12,1004),(14921,12,1005),(14945,12,1101),(14943,12,1102),(14944,12,1104),(14946,12,1109),(14762,12,1121),(14755,12,1122),(14757,12,1123),(14759,12,1124),(14761,12,1125),(14763,12,1126),(14982,12,1181),(15005,12,1182),(14985,12,1183),(14986,12,1184),(14988,12,1185),(14990,12,1186),(14992,12,1187),(14995,12,1188),(14993,12,1189),(13827,12,1201),(13828,12,1202),(15003,12,1231),(14998,12,1232),(14999,12,1233),(15001,12,1234),(15002,12,1235),(15004,12,1236),(15006,12,1237),(13829,12,1251),(15496,12,1321),(15497,12,1322),(14957,12,1421),(15036,12,2401),(15035,12,2402),(15038,12,2403),(15044,12,2411),(15043,12,2412),(15046,12,2413),(15047,12,2414),(14591,12,2501),(14590,12,2503),(14592,12,2515),(15435,12,5001),(15436,12,5002),(14651,12,20001),(14641,12,20002),(14644,12,20003),(14647,12,20004),(14650,12,20005),(14653,12,20006),(15476,12,23001),(15473,12,23002),(15475,12,23003),(15477,12,23004),(13712,12,50101),(15499,12,50401),(15501,12,50411),(15502,12,50412),(15503,12,50420),(15504,12,50430),(15498,12,50440),(15052,12,55001),(15053,12,55002),(14128,12,59001),(14129,12,59002),(14130,12,59003),(14818,12,63001),(14815,12,63002),(14817,12,63003),(14819,12,63004),(15241,12,64001),(15438,12,101701),(15439,12,101702),(12776,13,11),(12777,13,21),(12778,13,31),(12779,13,41),(12780,13,61),(12781,13,71),(12782,13,72),(12783,13,74),(12784,13,75),(12785,13,78),(12786,13,79),(12787,13,81),(12788,13,91),(12789,13,95),(12790,13,97),(12791,13,101),(12792,13,111),(12793,13,121),(12794,13,151),(12795,13,161),(12796,13,171),(12797,13,221),(12798,13,222),(12799,13,229),(12800,13,241),(12801,13,242),(12802,13,243),(12803,13,262),(12804,13,281),(12805,13,300),(12806,13,331),(12807,13,341),(12808,13,342),(12809,13,343),(12810,13,344),(12811,13,531),(12812,13,700),(12813,13,1001),(12814,13,1002),(12815,13,1003),(12816,13,1004),(12817,13,1005),(12818,13,1101),(12819,13,1181),(12820,13,1182),(12821,13,1201),(12822,13,1202),(12823,13,1231),(12824,13,2401),(12825,13,2501),(12826,13,2503),(12827,13,2515),(12828,13,20001),(12829,13,20002),(12830,13,23001),(12831,13,50101),(12832,14,11),(12833,14,21),(12834,14,31),(12835,14,41),(12836,14,61),(12837,14,71),(12838,14,72),(12839,14,74),(12840,14,75),(12841,14,78),(12842,14,79),(12843,14,81),(12844,14,91),(12845,14,95),(12846,14,97),(12847,14,101),(12848,14,111),(12849,14,121),(12850,14,151),(12851,14,161),(12852,14,171),(12853,14,221),(12854,14,222),(12855,14,229),(12856,14,241),(12857,14,242),(12858,14,243),(12859,14,262),(12860,14,281),(12861,14,300),(12862,14,331),(12863,14,341),(12864,14,342),(12865,14,343),(12866,14,344),(12867,14,531),(12868,14,700),(12869,14,1001),(12870,14,1002),(12871,14,1003),(12872,14,1004),(12873,14,1005),(12874,14,1101),(12875,14,1181),(12876,14,1182),(12877,14,1201),(12878,14,1202),(12879,14,1231),(12880,14,2401),(12881,14,2501),(12882,14,2503),(12883,14,2515),(12884,14,20001),(12885,14,20002),(12886,14,23001),(12887,14,50101),(12944,16,11),(12945,16,21),(12946,16,31),(13056,16,41),(13057,16,42),(13058,16,44),(13059,16,45),(12948,16,61),(12949,16,71),(12950,16,72),(12951,16,74),(12952,16,75),(12953,16,78),(12954,16,79),(12955,16,81),(12956,16,91),(12957,16,95),(12958,16,97),(12959,16,101),(12960,16,111),(12961,16,121),(13060,16,141),(13061,16,142),(13062,16,144),(12962,16,151),(12963,16,161),(12964,16,171),(12965,16,221),(12966,16,222),(12967,16,229),(12968,16,241),(12969,16,242),(12970,16,243),(13128,16,251),(13064,16,262),(12972,16,281),(12973,16,300),(12974,16,331),(12975,16,341),(12976,16,342),(12977,16,343),(12978,16,344),(12979,16,531),(12980,16,700),(12981,16,1001),(12982,16,1002),(12983,16,1003),(12984,16,1004),(12985,16,1005),(12986,16,1101),(12987,16,1181),(12988,16,1182),(12989,16,1201),(12990,16,1202),(12991,16,1231),(12992,16,2401),(12993,16,2501),(12994,16,2503),(12995,16,2515),(12996,16,20001),(12997,16,20002),(12998,16,23001),(12999,16,50101),(13000,17,11),(13001,17,21),(13002,17,31),(13065,17,41),(13066,17,42),(13067,17,44),(13068,17,45),(13004,17,61),(13005,17,71),(13006,17,72),(13007,17,74),(13008,17,75),(13009,17,78),(13010,17,79),(13011,17,81),(13012,17,91),(13013,17,95),(13014,17,97),(13015,17,101),(13016,17,111),(13017,17,121),(13069,17,141),(13070,17,142),(13071,17,144),(13018,17,151),(13019,17,161),(13020,17,171),(13021,17,221),(13022,17,222),(13023,17,229),(13024,17,241),(13025,17,242),(13026,17,243),(13028,17,281),(13029,17,300),(13030,17,331),(13031,17,341),(13032,17,342),(13033,17,343),(13034,17,344),(13035,17,531),(13036,17,700),(13037,17,1001),(13038,17,1002),(13039,17,1003),(13040,17,1004),(13041,17,1005),(13042,17,1101),(13043,17,1181),(13044,17,1182),(13045,17,1201),(13046,17,1202),(13047,17,1231),(13048,17,2401),(13049,17,2501),(13050,17,2503),(13051,17,2515),(13052,17,20001),(13053,17,20002),(13054,17,23001),(13055,17,50101),(14504,18,11),(14505,18,21),(14506,18,31),(14507,18,41),(14508,18,61),(14509,18,71),(14510,18,78),(14511,18,81),(14512,18,91),(14513,18,95),(14514,18,101),(14515,18,111),(14516,18,121),(14517,18,151),(14518,18,161),(14519,18,221),(14520,18,241),(14521,18,262),(14522,18,281),(14523,18,300),(14524,18,331),(14525,18,332),(14526,18,333),(14527,18,341),(14528,18,342),(14529,18,343),(14530,18,344),(14531,18,531),(14532,18,701),(14533,18,771),(14534,18,774),(14535,18,1001),(14536,18,1004),(14537,18,1101),(14538,18,1181),(14539,18,1182),(14540,18,1201),(14541,18,1231),(14542,18,2401),(14543,18,2501),(14544,18,2503),(14545,18,2515),(14546,18,20001),(14547,18,20002),(14548,18,50101),(14549,18,59001),(15242,19,21),(15243,19,31),(15244,19,41),(15245,19,61),(15246,19,71),(15247,19,78),(15248,19,81),(15249,19,101),(15250,19,121),(15251,19,151),(15252,19,161),(15253,19,221),(15254,19,241),(15255,19,262),(15256,19,281),(15257,19,300),(15258,19,331),(15259,19,332),(15260,19,341),(15261,19,342),(15262,19,343),(15263,19,344),(15264,19,531),(15265,19,701),(15266,19,771),(15267,19,774),(15268,19,777),(15269,19,1001),(15270,19,1004),(15271,19,1101),(15272,19,1121),(15273,19,1181),(15274,19,1182),(15275,19,1201),(15276,19,1231),(15277,19,2401),(15278,19,2501),(15279,19,20001),(15280,19,20002),(15281,19,50101),(15282,19,59001),(15283,19,63001); /*!40000 ALTER TABLE `llx_user_rights` ENABLE KEYS */; UNLOCK TABLES; @@ -9052,4 +9053,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2017-02-21 13:19:55 +-- Dump completed on 2017-05-12 12:07:24 From 245ef7a188dc2fbfa3fe1834d9fc210bdf4fd996 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 12 May 2017 13:05:03 +0200 Subject: [PATCH 095/299] Add screenshot --- doc/images/dolibarr_screenshot11_1280x800.png | Bin 0 -> 212848 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 doc/images/dolibarr_screenshot11_1280x800.png diff --git a/doc/images/dolibarr_screenshot11_1280x800.png b/doc/images/dolibarr_screenshot11_1280x800.png new file mode 100644 index 0000000000000000000000000000000000000000..1f19a884a3796efd2eca399a1d13e9296e4a0021 GIT binary patch literal 212848 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

ohAy|5ET*yt$MqfdYmEay>V+zg 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

PRZn?Du6A)c>rDNe8?`3<-F4FWg%MDnv8|< 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 oCJ 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 a09c?~)+3=`qeB4zzvN_;q{}6ZgZ>}mYe^XZ literal 0 HcmV?d00001 From 5581e5da7289803ce19aab3fde0a5368a407634c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 12 May 2017 13:12:17 +0200 Subject: [PATCH 096/299] FIX New vat code not correctly implemented if "1 price per customer". --- htdocs/comm/propal/card.php | 7 ++++--- htdocs/install/mysql/migration/4.0.0-5.0.0.sql | 3 +++ .../mysql/tables/llx_product_customer_price.sql | 1 + .../tables/llx_product_customer_price_log.sql | 1 + .../class/productcustomerprice.class.php | 17 +++++++++++++---- htdocs/product/price.php | 16 ++++++++++------ 6 files changed, 32 insertions(+), 13 deletions(-) diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index 150abdf5f46..407a461a1a1 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -750,7 +750,7 @@ if (empty($reshook)) $tva_tx = get_default_tva($mysoc, $object->thirdparty, $prod->id); $tva_npr = get_default_npr($mysoc, $object->thirdparty, $prod->id); if (empty($tva_tx)) $tva_npr=0; - + $pu_ht = $prod->price; $pu_ttc = $prod->price_ttc; $price_min = $prod->price_min; @@ -775,15 +775,16 @@ if (empty($reshook)) $prodcustprice = new Productcustomerprice($db); - $filter = array('t.fk_product' => $prod->id,'t.fk_soc' => $object->thirdparty->id); + $filter = array('t.fk_product' => $prod->id, 't.fk_soc' => $object->thirdparty->id); $result = $prodcustprice->fetch_all('', '', 0, 0, $filter); if ($result) { + // If there is some prices specific to the customer if (count($prodcustprice->lines) > 0) { $pu_ht = price($prodcustprice->lines[0]->price); $pu_ttc = price($prodcustprice->lines[0]->price_ttc); $price_base_type = $prodcustprice->lines[0]->price_base_type; - $tva_tx = $prodcustprice->lines[0]->tva_tx; + $tva_tx = ($prodcustprice->lines[0]->default_vat_code ? $prodcustprice->lines[0]->tva_tx . ' ('.$prodcustprice->lines[0]->default_vat_code.' )' : $prodcustprice->lines[0]->tva_tx); } } } diff --git a/htdocs/install/mysql/migration/4.0.0-5.0.0.sql b/htdocs/install/mysql/migration/4.0.0-5.0.0.sql index dd4ac9fde4b..fa185f2864b 100644 --- a/htdocs/install/mysql/migration/4.0.0-5.0.0.sql +++ b/htdocs/install/mysql/migration/4.0.0-5.0.0.sql @@ -263,6 +263,9 @@ update llx_accounting_account set account_parent = 0 where account_parent = ''; ALTER TABLE llx_product_price ALTER COLUMN date_price SET DEFAULT NULL; ALTER TABLE llx_product_price ADD COLUMN default_vat_code varchar(10) after tva_tx; +ALTER TABLE llx_product_customer_price ADD COLUMN default_vat_code varchar(10) after tva_tx; +ALTER TABLE llx_product_customer_price_log ADD COLUMN default_vat_code varchar(10) after tva_tx; ALTER TABLE llx_product_fournisseur_price ADD COLUMN default_vat_code varchar(10) after tva_tx; + ALTER TABLE llx_events MODIFY COLUMN ip varchar(250); diff --git a/htdocs/install/mysql/tables/llx_product_customer_price.sql b/htdocs/install/mysql/tables/llx_product_customer_price.sql index 8098ae5f028..339de2bb4be 100644 --- a/htdocs/install/mysql/tables/llx_product_customer_price.sql +++ b/htdocs/install/mysql/tables/llx_product_customer_price.sql @@ -33,6 +33,7 @@ create table llx_product_customer_price price_min double(24,8) DEFAULT 0, price_min_ttc double(24,8) DEFAULT 0, price_base_type varchar(3) DEFAULT 'HT', + default_vat_code varchar(10), -- Same code than into table llx_c_tva (but no constraints). Should be used in priority to find default vat, npr, localtaxes for product. tva_tx double(6,3), recuperableonly integer NOT NULL DEFAULT '0', -- Other NPR VAT localtax1_tx double(6,3) DEFAULT 0, -- Other local VAT 1 diff --git a/htdocs/install/mysql/tables/llx_product_customer_price_log.sql b/htdocs/install/mysql/tables/llx_product_customer_price_log.sql index 699060cdc98..bd4fe54a586 100644 --- a/htdocs/install/mysql/tables/llx_product_customer_price_log.sql +++ b/htdocs/install/mysql/tables/llx_product_customer_price_log.sql @@ -30,6 +30,7 @@ create table llx_product_customer_price_log price_min double(24,8) DEFAULT 0, price_min_ttc double(24,8) DEFAULT 0, price_base_type varchar(3) DEFAULT 'HT', + default_vat_code varchar(10), -- Same code than into table llx_c_tva (but no constraints). Should be used in priority to find default vat, npr, localtaxes for product. tva_tx double(6,3), recuperableonly integer NOT NULL DEFAULT '0', -- Other NPR VAT localtax1_tx double(6,3) DEFAULT 0, -- Other local VAT 1 diff --git a/htdocs/product/class/productcustomerprice.class.php b/htdocs/product/class/productcustomerprice.class.php index fd36c55dcf9..5b9050077c9 100644 --- a/htdocs/product/class/productcustomerprice.class.php +++ b/htdocs/product/class/productcustomerprice.class.php @@ -140,7 +140,6 @@ class Productcustomerprice extends CommonObject // Insert request $sql = "INSERT INTO " . MAIN_DB_PREFIX . "product_customer_price("; - $sql .= "entity,"; $sql .= "datec,"; $sql .= "fk_product,"; @@ -150,6 +149,7 @@ class Productcustomerprice extends CommonObject $sql .= "price_min,"; $sql .= "price_min_ttc,"; $sql .= "price_base_type,"; + $sql .= "default_vat_code,"; $sql .= "tva_tx,"; $sql .= "recuperableonly,"; $sql .= "localtax1_type,"; @@ -158,9 +158,7 @@ class Productcustomerprice extends CommonObject $sql .= "localtax2_tx,"; $sql .= "fk_user,"; $sql .= "import_key"; - $sql .= ") VALUES ("; - $sql .= " " . $conf->entity . ","; $sql .= " '" . $this->db->idate(dol_now()) . "',"; $sql .= " " . (! isset($this->fk_product) ? 'NULL' : "'" . $this->fk_product . "'") . ","; @@ -170,6 +168,7 @@ class Productcustomerprice extends CommonObject $sql .= " " . (empty($this->price_min) ? '0' : "'" . $this->price_min . "'") . ","; $sql .= " " . (empty($this->price_min_ttc) ? '0' : "'" . $this->price_min_ttc . "'") . ","; $sql .= " " . (! isset($this->price_base_type) ? 'NULL' : "'" . $this->db->escape($this->price_base_type) . "'") . ","; + $sql .= " ".($this->default_vat_code ? "'".$this->db->escape($this->default_vat_code)."'" : "null").","; $sql .= " " . (! isset($this->tva_tx) ? 'NULL' : "'" . $this->tva_tx . "'") . ","; $sql .= " " . (! isset($this->recuperableonly) ? 'NULL' : "'" . $this->recuperableonly . "'") . ","; $sql .= " " . (empty($this->localtax1_type) ? "'0'" : "'" . $this->localtax1_type . "'") . ","; @@ -178,7 +177,6 @@ class Productcustomerprice extends CommonObject $sql .= " " . (! isset($this->localtax2_tx) ? 'NULL' : "'" . $this->localtax2_tx . "'") . ","; $sql .= " " . $user->id . ","; $sql .= " " . (! isset($this->import_key) ? 'NULL' : "'" . $this->db->escape($this->import_key) . "'") . ""; - $sql .= ")"; $this->db->begin(); @@ -250,6 +248,7 @@ class Productcustomerprice extends CommonObject $sql .= " t.price_min,"; $sql .= " t.price_min_ttc,"; $sql .= " t.price_base_type,"; + $sql .= " t.default_vat_code,"; $sql .= " t.tva_tx,"; $sql .= " t.recuperableonly,"; $sql .= " t.localtax1_tx,"; @@ -278,6 +277,7 @@ class Productcustomerprice extends CommonObject $this->price_min = $obj->price_min; $this->price_min_ttc = $obj->price_min_ttc; $this->price_base_type = $obj->price_base_type; + $this->default_vat_code = $obj->default_vat_code; $this->tva_tx = $obj->tva_tx; $this->recuperableonly = $obj->recuperableonly; $this->localtax1_tx = $obj->localtax1_tx; @@ -324,6 +324,7 @@ class Productcustomerprice extends CommonObject $sql .= " t.price_min,"; $sql .= " t.price_min_ttc,"; $sql .= " t.price_base_type,"; + $sql .= " t.default_vat_code,"; $sql .= " t.tva_tx,"; $sql .= " t.recuperableonly,"; $sql .= " t.localtax1_tx,"; @@ -380,6 +381,7 @@ class Productcustomerprice extends CommonObject $line->price_min = $obj->price_min; $line->price_min_ttc = $obj->price_min_ttc; $line->price_base_type = $obj->price_base_type; + $line->default_vat_code = $obj->default_vat_code; $line->tva_tx = $obj->tva_tx; $line->recuperableonly = $obj->recuperableonly; $line->localtax1_tx = $obj->localtax1_tx; @@ -429,6 +431,7 @@ class Productcustomerprice extends CommonObject $sql .= " t.price_min,"; $sql .= " t.price_min_ttc,"; $sql .= " t.price_base_type,"; + $sql .= " t.default_vat_code,"; $sql .= " t.tva_tx,"; $sql .= " t.recuperableonly,"; $sql .= " t.localtax1_tx,"; @@ -484,6 +487,7 @@ class Productcustomerprice extends CommonObject $line->price_min = $obj->price_min; $line->price_min_ttc = $obj->price_min_ttc; $line->price_base_type = $obj->price_base_type; + $line->default_vat_code = $obj->default_vat_code; $line->tva_tx = $obj->tva_tx; $line->recuperableonly = $obj->recuperableonly; $line->localtax1_tx = $obj->localtax1_tx; @@ -595,6 +599,7 @@ class Productcustomerprice extends CommonObject $sql .= "price_min,"; $sql .= "price_min_ttc,"; $sql .= "price_base_type,"; + $sql .= "default_vat_code,"; $sql .= "tva_tx,"; $sql .= "recuperableonly,"; $sql .= "localtax1_tx,"; @@ -616,6 +621,7 @@ class Productcustomerprice extends CommonObject $sql .= " t.price_min,"; $sql .= " t.price_min_ttc,"; $sql .= " t.price_base_type,"; + $sql .= " t.default_vat_code,"; $sql .= " t.tva_tx,"; $sql .= " t.recuperableonly,"; $sql .= " t.localtax1_tx,"; @@ -649,6 +655,7 @@ class Productcustomerprice extends CommonObject $sql .= " price_min=" . (isset($this->price_min) ? $this->price_min : "null") . ","; $sql .= " price_min_ttc=" . (isset($this->price_min_ttc) ? $this->price_min_ttc : "null") . ","; $sql .= " price_base_type=" . (isset($this->price_base_type) ? "'" . $this->db->escape($this->price_base_type) . "'" : "null") . ","; + $sql .= " default_vat_code = ".($this->default_vat_code ? "'".$this->db->escape($this->default_vat_code)."'" : "null").","; $sql .= " tva_tx=" . (isset($this->tva_tx) ? $this->tva_tx : "null") . ","; $sql .= " recuperableonly=" . (isset($this->recuperableonly) ? $this->recuperableonly : "null") . ","; $sql .= " localtax1_tx=" . (isset($this->localtax1_tx) ? $this->localtax1_tx : "null") . ","; @@ -918,6 +925,7 @@ class Productcustomerprice extends CommonObject $this->price_min = ''; $this->price_min_ttc = ''; $this->price_base_type = ''; + $this->default_vat_code = ''; $this->tva_tx = ''; $this->recuperableonly = ''; $this->localtax1_tx = ''; @@ -943,6 +951,7 @@ class PriceByCustomerLine var $price_min; var $price_min_ttc; var $price_base_type; + var $default_vat_code; var $tva_tx; var $recuperableonly; var $localtax1_tx; diff --git a/htdocs/product/price.php b/htdocs/product/price.php index e6bde28d27e..1e9bcec3d52 100644 --- a/htdocs/product/price.php +++ b/htdocs/product/price.php @@ -1518,13 +1518,13 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) print ''; print '' . $langs->trans('ThirdParty') . ''; print ''; - print $form->select_company('', 'socid', 's.client in (1,2,3) AND s.rowid NOT IN (SELECT fk_soc FROM ' . MAIN_DB_PREFIX . 'product_customer_price WHERE fk_product='.$object->id.')', 'SelectThirdParty', 0, 0, array(), 0, 'minwidth300'); + print $form->select_company('', 'socid', 's.client in (1,2,3)', 'SelectThirdParty', 0, 0, array(), 0, 'minwidth300'); print ''; print ''; // VAT print '' . $langs->trans("VATRate") . ''; - print $form->load_tva("tva_tx", $object->tva_tx, $mysoc, '', $object->id, $object->tva_npr, $object->type, false, 1); + print $form->load_tva("tva_tx", $object->default_vat_code ? $object->tva_tx.' ('.$object->default_vat_code.')' : $object->tva_tx, $mysoc, '', $object->id, $object->tva_npr, $object->type, false, 1); print ''; // Price base @@ -1610,9 +1610,9 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) // VAT print '' . $langs->trans("VATRate") . ''; - print $form->load_tva("tva_tx", $prodcustprice->tva_tx, $mysoc, '', $object->id, $prodcustprice->recuperableonly, $object->type, false, 1); + print $form->load_tva("tva_tx", $prodcustprice->default_vat_code ? $prodcustprice->tva_tx.' ('.$prodcustprice->default_vat_code.')' : $prodcustprice->tva_tx, $mysoc, '', $object->id, $prodcustprice->recuperableonly, $object->type, false, 1); print ''; - + // Price base print ''; print $langs->trans('PriceBase'); @@ -1731,8 +1731,10 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) print "" . $staticsoc->getNomUrl(1) . ""; print "" . dol_print_date($line->datec, "dayhour") . ""; + $tva_tx = $line->default_vat_code ? $line->tva_tx.' ('.$line->default_vat_code.')' : $line->tva_tx; + print '' . $langs->trans($line->price_base_type) . ""; - print '' . vatrate($line->tva_tx, true, $line->recuperableonly) . ""; + print '' . vatrate($tva_tx, true, $line->recuperableonly) . ""; print '' . price($line->price) . ""; print '' . price($line->price_ttc) . ""; print '' . price($line->price_min) . ''; @@ -1844,11 +1846,13 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) $staticsoc = new Societe($db); $staticsoc->fetch($line->fk_soc); + $tva_tx = $line->default_vat_code ? $line->tva_tx.' ('.$line->default_vat_code.')' : $line->tva_tx; + print "" . $staticsoc->getNomUrl(1) . ""; print "" . dol_print_date($line->datec, "dayhour") . ""; print '' . $langs->trans($line->price_base_type) . ""; - print '' . vatrate($line->tva_tx, true, $line->recuperableonly) . ""; + print '' . vatrate($tva_tx, true, $line->recuperableonly) . ""; print '' . price($line->price) . ""; print '' . price($line->price_ttc) . ""; print '' . price($line->price_min) . ''; From 419c15ee8efd6b7554ff084c3e4f5acb3c62f324 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 12 May 2017 15:28:10 +0200 Subject: [PATCH 097/299] Fix escaping class --- htdocs/adherents/class/adherent.class.php | 10 +++---- htdocs/comm/propal/class/propal.class.php | 8 +++--- htdocs/commande/class/commande.class.php | 6 ++--- htdocs/compta/bank/class/account.class.php | 26 +++++++++---------- htdocs/compta/facture/class/facture.class.php | 10 +++---- .../compta/localtax/class/localtax.class.php | 8 +++--- .../cheque/class/remisecheque.class.php | 2 +- .../salaries/class/paymentsalary.class.php | 10 +++---- .../sociales/class/chargesociales.class.php | 4 +-- htdocs/compta/tva/class/tva.class.php | 8 +++--- htdocs/contrat/class/contrat.class.php | 26 +++++++++---------- htdocs/theme/eldy/style.css.php | 4 +-- 12 files changed, 61 insertions(+), 61 deletions(-) diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index e12c49732dd..5a4c6ad08a0 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -433,18 +433,18 @@ class Adherent extends CommonObject $sql.= ", town=" .($this->town?"'".$this->db->escape($this->town)."'":"null"); $sql.= ", country=".($this->country_id>0?"'".$this->country_id."'":"null"); $sql.= ", state_id=".($this->state_id>0?"'".$this->state_id."'":"null"); - $sql.= ", email='".$this->email."'"; - $sql.= ", skype='".$this->skype."'"; + $sql.= ", email='".$this->db->escape($this->email)."'"; + $sql.= ", skype='".$this->db->escape($this->skype)."'"; $sql.= ", phone=" .($this->phone?"'".$this->db->escape($this->phone)."'":"null"); $sql.= ", phone_perso=" .($this->phone_perso?"'".$this->db->escape($this->phone_perso)."'":"null"); $sql.= ", phone_mobile=" .($this->phone_mobile?"'".$this->db->escape($this->phone_mobile)."'":"null"); $sql.= ", note_private=" .($this->note_private?"'".$this->db->escape($this->note_private)."'":"null"); $sql.= ", note_public=" .($this->note_private?"'".$this->db->escape($this->note_public)."'":"null"); $sql.= ", photo=" .($this->photo?"'".$this->photo."'":"null"); - $sql.= ", public='".$this->public."'"; + $sql.= ", public='".$this->db->escape($this->public)."'"; $sql.= ", statut=" .$this->statut; $sql.= ", fk_adherent_type=".$this->typeid; - $sql.= ", morphy='".$this->morphy."'"; + $sql.= ", morphy='".$this->db->escape($this->morphy)."'"; $sql.= ", birth=" .($this->birth?"'".$this->db->idate($this->birth)."'":"null"); if ($this->datefin) $sql.= ", datefin='".$this->db->idate($this->datefin)."'"; // Ne doit etre modifie que par effacement cotisation if ($this->datevalid) $sql.= ", datevalid='".$this->db->idate($this->datevalid)."'"; // Ne doit etre modifie que par validation adherent @@ -643,7 +643,7 @@ class Adherent extends CommonObject // Search for last subscription id and end date $sql = "SELECT rowid, datec as dateop, dateadh as datedeb, datef as datefin"; $sql.= " FROM ".MAIN_DB_PREFIX."cotisation"; - $sql.= " WHERE fk_adherent='".$this->id."'"; + $sql.= " WHERE fk_adherent=".$this->id; $sql.= " ORDER by dateadh DESC"; // Sort by start subscription date dol_syslog(get_class($this)."::update_end_date", LOG_DEBUG); diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index f272120477f..5dbb8541838 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -911,7 +911,7 @@ class Propal extends CommonObject if ($this->id) { $this->ref='(PROV'.$this->id.')'; - $sql = 'UPDATE '.MAIN_DB_PREFIX."propal SET ref='".$this->ref."' WHERE rowid=".$this->id; + $sql = 'UPDATE '.MAIN_DB_PREFIX."propal SET ref='".$this->db->escape($this->ref)."' WHERE rowid=".$this->id; dol_syslog(get_class($this)."::create", LOG_DEBUG); $resql=$this->db->query($sql); @@ -3443,14 +3443,14 @@ class PropaleLigne extends CommonObjectLine $sql.= " , tva_tx='".price2num($this->tva_tx)."'"; $sql.= " , localtax1_tx=".price2num($this->localtax1_tx); $sql.= " , localtax2_tx=".price2num($this->localtax2_tx); - $sql.= " , localtax1_type='".$this->localtax1_type."'"; - $sql.= " , localtax2_type='".$this->localtax2_type."'"; + $sql.= " , localtax1_type='".$this->db->escape($this->localtax1_type)."'"; + $sql.= " , localtax2_type='".$this->db->escape($this->localtax2_type)."'"; $sql.= " , qty='".price2num($this->qty)."'"; $sql.= " , subprice=".price2num($this->subprice).""; $sql.= " , remise_percent=".price2num($this->remise_percent).""; $sql.= " , price=".price2num($this->price).""; // TODO A virer $sql.= " , remise=".price2num($this->remise).""; // TODO A virer - $sql.= " , info_bits='".$this->info_bits."'"; + $sql.= " , info_bits='".$this->db->escape($this->info_bits)."'"; if (empty($this->skip_update_total)) { $sql.= " , total_ht=".price2num($this->total_ht).""; diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index cd97a6295f7..4aee6ae057d 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -3633,7 +3633,7 @@ class OrderLine extends CommonOrderLine $this->db->begin(); - $sql = 'DELETE FROM '.MAIN_DB_PREFIX."commandedet WHERE rowid='".$this->rowid."';"; + $sql = 'DELETE FROM '.MAIN_DB_PREFIX."commandedet WHERE rowid=".$this->rowid; dol_syslog("OrderLine::delete", LOG_DEBUG); $resql=$this->db->query($sql); @@ -3874,8 +3874,8 @@ class OrderLine extends CommonOrderLine $sql.= " , tva_tx=".price2num($this->tva_tx); $sql.= " , localtax1_tx=".price2num($this->localtax1_tx); $sql.= " , localtax2_tx=".price2num($this->localtax2_tx); - $sql.= " , localtax1_type='".$this->localtax1_type."'"; - $sql.= " , localtax2_type='".$this->localtax2_type."'"; + $sql.= " , localtax1_type='".$this->db->escape($this->localtax1_type)."'"; + $sql.= " , localtax2_type='".$this->db->escape($this->localtax2_type)."'"; $sql.= " , qty=".price2num($this->qty); $sql.= " , subprice=".price2num($this->subprice).""; $sql.= " , remise_percent=".price2num($this->remise_percent).""; diff --git a/htdocs/compta/bank/class/account.class.php b/htdocs/compta/bank/class/account.class.php index 96661f4074a..01c683285f5 100644 --- a/htdocs/compta/bank/class/account.class.php +++ b/htdocs/compta/bank/class/account.class.php @@ -683,17 +683,17 @@ class Account extends CommonObject $sql.= ",accountancy_journal = '".$this->accountancy_journal."'"; $sql.= ",bank = '".$this->db->escape($this->bank)."'"; - $sql.= ",code_banque='".$this->code_banque."'"; - $sql.= ",code_guichet='".$this->code_guichet."'"; - $sql.= ",number='".$this->number."'"; - $sql.= ",cle_rib='".$this->cle_rib."'"; - $sql.= ",bic='".$this->bic."'"; - $sql.= ",iban_prefix = '".$this->iban."'"; + $sql.= ",code_banque='".$this->db->escape($this->code_banque)."'"; + $sql.= ",code_guichet='".$this->db->escape($this->code_guichet)."'"; + $sql.= ",number='".$this->db->escape($this->number)."'"; + $sql.= ",cle_rib='".$this->db->escape($this->cle_rib)."'"; + $sql.= ",bic='".$this->db->escape($this->bic)."'"; + $sql.= ",iban_prefix = '".$this->db->escape($this->iban)."'"; $sql.= ",domiciliation='".$this->db->escape($this->domiciliation)."'"; $sql.= ",proprio = '".$this->db->escape($this->proprio)."'"; $sql.= ",owner_address = '".$this->db->escape($this->owner_address)."'"; - $sql.= ",currency_code = '".$this->currency_code."'"; + $sql.= ",currency_code = '".$this->db->escape($this->currency_code)."'"; $sql.= ",min_allowed = ".($this->min_allowed != '' ? price2num($this->min_allowed) : "null"); $sql.= ",min_desired = ".($this->min_desired != '' ? price2num($this->min_desired) : "null"); @@ -767,12 +767,12 @@ class Account extends CommonObject $sql = "UPDATE ".MAIN_DB_PREFIX."bank_account SET "; $sql.= " bank = '".$this->db->escape($this->bank)."'"; - $sql.= ",code_banque='".$this->code_banque."'"; - $sql.= ",code_guichet='".$this->code_guichet."'"; - $sql.= ",number='".$this->number."'"; - $sql.= ",cle_rib='".$this->cle_rib."'"; - $sql.= ",bic='".$this->bic."'"; - $sql.= ",iban_prefix = '".$this->iban."'"; + $sql.= ",code_banque='".$this->db->escape($this->code_banque)."'"; + $sql.= ",code_guichet='".$this->db->escape($this->code_guichet)."'"; + $sql.= ",number='".$this->db->escape($this->number)."'"; + $sql.= ",cle_rib='".$this->db->escape($this->cle_rib)."'"; + $sql.= ",bic='".$this->db->escape($this->bic)."'"; + $sql.= ",iban_prefix = '".$this->db->escape($this->iban)."'"; $sql.= ",domiciliation='".$this->db->escape($this->domiciliation)."'"; $sql.= ",proprio = '".$this->db->escape($this->proprio)."'"; $sql.= ",owner_address = '".$this->db->escape($this->owner_address)."'"; diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index ba834856fab..a1364702d52 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -392,7 +392,7 @@ class Facture extends CommonInvoice // Update ref with new one $this->ref='(PROV'.$this->id.')'; - $sql = 'UPDATE '.MAIN_DB_PREFIX."facture SET facnumber='".$this->ref."' WHERE rowid=".$this->id; + $sql = 'UPDATE '.MAIN_DB_PREFIX."facture SET facnumber='".$this->db->escape($this->ref)."' WHERE rowid=".$this->id; dol_syslog(get_class($this)."::create", LOG_DEBUG); $resql=$this->db->query($sql); @@ -4375,14 +4375,14 @@ class FactureLigne extends CommonInvoiceLine $sql.= ",tva_tx=".price2num($this->tva_tx).""; $sql.= ",localtax1_tx=".price2num($this->localtax1_tx).""; $sql.= ",localtax2_tx=".price2num($this->localtax2_tx).""; - $sql.= ",localtax1_type='".$this->localtax1_type."'"; - $sql.= ",localtax2_type='".$this->localtax2_type."'"; + $sql.= ",localtax1_type='".$this->db->escape($this->localtax1_type)."'"; + $sql.= ",localtax2_type='".$this->db->escape($this->localtax2_type)."'"; $sql.= ",qty=".price2num($this->qty).""; $sql.= ",date_start=".(! empty($this->date_start)?"'".$this->db->idate($this->date_start)."'":"null"); $sql.= ",date_end=".(! empty($this->date_end)?"'".$this->db->idate($this->date_end)."'":"null"); $sql.= ",product_type=".$this->product_type; - $sql.= ",info_bits='".$this->info_bits."'"; - $sql.= ",special_code='".$this->special_code."'"; + $sql.= ",info_bits='".$this->db->escape($this->info_bits)."'"; + $sql.= ",special_code='".$this->db->escape($this->special_code)."'"; if (empty($this->skip_update_total)) { $sql.= ",total_ht=".price2num($this->total_ht).""; diff --git a/htdocs/compta/localtax/class/localtax.class.php b/htdocs/compta/localtax/class/localtax.class.php index 067c8dc9cbe..e59b2c6ce2b 100644 --- a/htdocs/compta/localtax/class/localtax.class.php +++ b/htdocs/compta/localtax/class/localtax.class.php @@ -154,12 +154,12 @@ class Localtax extends CommonObject $sql.= " tms=".$this->db->idate($this->tms).","; $sql.= " datep=".$this->db->idate($this->datep).","; $sql.= " datev=".$this->db->idate($this->datev).","; - $sql.= " amount='".$this->amount."',"; + $sql.= " amount=".price2num($this->amount).","; $sql.= " label='".$this->db->escape($this->label)."',"; $sql.= " note='".$this->db->escape($this->note)."',"; - $sql.= " fk_bank='".$this->fk_bank."',"; - $sql.= " fk_user_creat='".$this->fk_user_creat."',"; - $sql.= " fk_user_modif='".$this->fk_user_modif."'"; + $sql.= " fk_bank=".$this->fk_bank.","; + $sql.= " fk_user_creat=".$this->fk_user_creat.","; + $sql.= " fk_user_modif=".$this->fk_user_modif; $sql.= " WHERE rowid=".$this->id; dol_syslog(get_class($this)."::update", LOG_DEBUG); diff --git a/htdocs/compta/paiement/cheque/class/remisecheque.class.php b/htdocs/compta/paiement/cheque/class/remisecheque.class.php index 6ab43a277c0..0d327e2832f 100644 --- a/htdocs/compta/paiement/cheque/class/remisecheque.class.php +++ b/htdocs/compta/paiement/cheque/class/remisecheque.class.php @@ -177,7 +177,7 @@ class RemiseCheque extends CommonObject { $sql = "UPDATE ".MAIN_DB_PREFIX."bordereau_cheque"; $sql.= " SET ref='(PROV".$this->id.")'"; - $sql.= " WHERE rowid='".$this->id."';"; + $sql.= " WHERE rowid=".$this->id.""; dol_syslog("RemiseCheque::Create", LOG_DEBUG); $resql = $this->db->query($sql); diff --git a/htdocs/compta/salaries/class/paymentsalary.class.php b/htdocs/compta/salaries/class/paymentsalary.class.php index a4bee09d7de..871a938a9c9 100644 --- a/htdocs/compta/salaries/class/paymentsalary.class.php +++ b/htdocs/compta/salaries/class/paymentsalary.class.php @@ -97,19 +97,19 @@ class PaymentSalary extends CommonObject $sql = "UPDATE ".MAIN_DB_PREFIX."payment_salary SET"; $sql.= " tms=".$this->db->idate($this->tms).","; - $sql.= " fk_user='".$this->fk_user."',"; + $sql.= " fk_user=".$this->fk_user.","; $sql.= " datep=".$this->db->idate($this->datep).","; $sql.= " datev=".$this->db->idate($this->datev).","; - $sql.= " amount='".$this->amount."',"; + $sql.= " amount=".price2num($this->amount).","; $sql.= " fk_typepayment=".$this->fk_typepayment."',"; - $sql.= " num_payment='".$this->num_payment."',"; + $sql.= " num_payment='".$this->db->escape($this->num_payment)."',"; $sql.= " label='".$this->db->escape($this->label)."',"; $sql.= " datesp=".$this->db->idate($this->datesp).","; $sql.= " dateep=".$this->db->idate($this->dateep).","; $sql.= " note='".$this->db->escape($this->note)."',"; $sql.= " fk_bank=".($this->fk_bank > 0 ? "'".$this->fk_bank."'":"null").","; - $sql.= " fk_user_author='".$this->fk_user_author."',"; - $sql.= " fk_user_modif='".$this->fk_user_modif."'"; + $sql.= " fk_user_author=".$this->fk_user_author.","; + $sql.= " fk_user_modif=".$this->fk_user_modif; $sql.= " WHERE rowid=".$this->id; diff --git a/htdocs/compta/sociales/class/chargesociales.class.php b/htdocs/compta/sociales/class/chargesociales.class.php index e5653ba2ee3..da79bbffb75 100644 --- a/htdocs/compta/sociales/class/chargesociales.class.php +++ b/htdocs/compta/sociales/class/chargesociales.class.php @@ -216,7 +216,7 @@ class ChargeSociales extends CommonObject // Delete payments if (! $error) { - $sql = "DELETE FROM ".MAIN_DB_PREFIX."paiementcharge where fk_charge='".$this->id."'"; + $sql = "DELETE FROM ".MAIN_DB_PREFIX."paiementcharge where fk_charge=".$this->id; dol_syslog(get_class($this)."::delete", LOG_DEBUG); $resql=$this->db->query($sql); if (! $resql) @@ -228,7 +228,7 @@ class ChargeSociales extends CommonObject if (! $error) { - $sql = "DELETE FROM ".MAIN_DB_PREFIX."chargesociales where rowid='".$this->id."'"; + $sql = "DELETE FROM ".MAIN_DB_PREFIX."chargesociales where rowid=".$this->id; dol_syslog(get_class($this)."::delete", LOG_DEBUG); $resql=$this->db->query($sql); if (! $resql) diff --git a/htdocs/compta/tva/class/tva.class.php b/htdocs/compta/tva/class/tva.class.php index eb4ee3a2408..d7ba51d6dc8 100644 --- a/htdocs/compta/tva/class/tva.class.php +++ b/htdocs/compta/tva/class/tva.class.php @@ -175,12 +175,12 @@ class Tva extends CommonObject $sql.= " tms=".$this->db->idate($this->tms).","; $sql.= " datep=".$this->db->idate($this->datep).","; $sql.= " datev=".$this->db->idate($this->datev).","; - $sql.= " amount='".$this->amount."',"; + $sql.= " amount=".price2num($this->amount).","; $sql.= " label='".$this->db->escape($this->label)."',"; $sql.= " note='".$this->db->escape($this->note)."',"; - $sql.= " fk_bank='".$this->fk_bank."',"; - $sql.= " fk_user_creat='".$this->fk_user_creat."',"; - $sql.= " fk_user_modif='".$this->fk_user_modif."'"; + $sql.= " fk_bank=".$this->fk_bank.","; + $sql.= " fk_user_creat=".$this->fk_user_creat.","; + $sql.= " fk_user_modif=".$this->fk_user_modif.""; $sql.= " WHERE rowid=".$this->id; diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 6ad972a11eb..d9addfff113 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -2606,9 +2606,9 @@ class ContratLigne extends CommonObjectLine // Update request $sql = "UPDATE ".MAIN_DB_PREFIX."contratdet SET"; - $sql.= " fk_contrat='".$this->fk_contrat."',"; + $sql.= " fk_contrat=".$this->fk_contrat.","; $sql.= " fk_product=".($this->fk_product?"'".$this->fk_product."'":'null').","; - $sql.= " statut='".$this->statut."',"; + $sql.= " statut=".$this->statut.","; $sql.= " label='".$this->db->escape($this->label)."',"; $sql.= " description='".$this->db->escape($this->description)."',"; $sql.= " date_commande=".($this->date_commande!=''?"'".$this->db->idate($this->date_commande)."'":"null").","; @@ -2616,23 +2616,23 @@ class ContratLigne extends CommonObjectLine $sql.= " date_ouverture=".($this->date_ouverture!=''?"'".$this->db->idate($this->date_ouverture)."'":"null").","; $sql.= " date_fin_validite=".($this->date_fin_validite!=''?"'".$this->db->idate($this->date_fin_validite)."'":"null").","; $sql.= " date_cloture=".($this->date_cloture!=''?"'".$this->db->idate($this->date_cloture)."'":"null").","; - $sql.= " tva_tx='".$this->tva_tx."',"; - $sql.= " localtax1_tx='".$this->localtax1_tx."',"; - $sql.= " localtax2_tx='".$this->localtax2_tx."',"; - $sql.= " qty='".$this->qty."',"; - $sql.= " remise_percent='".$this->remise_percent."',"; + $sql.= " tva_tx=".$this->tva_tx.","; + $sql.= " localtax1_tx=".$this->localtax1_tx.","; + $sql.= " localtax2_tx=".$this->localtax2_tx.","; + $sql.= " qty=".$this->qty.","; + $sql.= " remise_percent=".$this->remise_percent.","; $sql.= " remise=".($this->remise?"'".$this->remise."'":"null").","; $sql.= " fk_remise_except=".($this->fk_remise_except?"'".$this->fk_remise_except."'":"null").","; $sql.= " subprice=".($this->subprice != '' ? $this->subprice : "null").","; $sql.= " price_ht=".($this->price_ht != '' ? $this->price_ht : "null").","; - $sql.= " total_ht='".$this->total_ht."',"; - $sql.= " total_tva='".$this->total_tva."',"; - $sql.= " total_localtax1='".$this->total_localtax1."',"; - $sql.= " total_localtax2='".$this->total_localtax2."',"; - $sql.= " total_ttc='".$this->total_ttc."',"; + $sql.= " total_ht=".$this->total_ht.","; + $sql.= " total_tva=".$this->total_tva.","; + $sql.= " total_localtax1=".$this->total_localtax1.","; + $sql.= " total_localtax2=".$this->total_localtax2.","; + $sql.= " total_ttc=".$this->total_ttc.","; $sql.= " fk_product_fournisseur_price=".(!empty($this->fk_fournprice)?$this->fk_fournprice:"NULL").","; $sql.= " buy_price_ht='".price2num($this->pa_ht)."',"; - $sql.= " info_bits='".$this->info_bits."',"; + $sql.= " info_bits='".$this->db->escape($this->info_bits)."',"; $sql.= " fk_user_author=".($this->fk_user_author >= 0?$this->fk_user_author:"NULL").","; $sql.= " fk_user_ouverture=".($this->fk_user_ouverture > 0?$this->fk_user_ouverture:"NULL").","; $sql.= " fk_user_cloture=".($this->fk_user_cloture > 0?$this->fk_user_cloture:"NULL").","; diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index d03ff95a50f..fef5f3d1e64 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -53,8 +53,8 @@ else header('Cache-Control: no-cache'); // On the fly GZIP compression for all pages (if browser support it). Must set the bit 3 of constant to 1. if (isset($conf->global->MAIN_OPTIMIZE_SPEED) && ($conf->global->MAIN_OPTIMIZE_SPEED & 0x04)) { ob_start("ob_gzhandler"); } -if (GETPOST('lang')) $langs->setDefaultLang(GETPOST('lang')); // If language was forced on URL -if (GETPOST('theme')) $conf->theme=GETPOST('theme'); // If theme was forced on URL +if (GETPOST('lang')) $langs->setDefaultLang(GETPOST('lang', 'alpha')); // If language was forced on URL +if (GETPOST('theme')) $conf->theme=GETPOST('theme', 'alpha'); // If theme was forced on URL $langs->load("main",0,1); $right=($langs->trans("DIRECTION")=='rtl'?'left':'right'); $left=($langs->trans("DIRECTION")=='rtl'?'right':'left'); From 88e7d54915feac7e61256c9a7f00731393ab8928 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 12 May 2017 15:45:00 +0200 Subject: [PATCH 098/299] Add phpunit to detect SQL not escaped string. --- test/phpunit/CodingPHPTest.php | 177 +++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 test/phpunit/CodingPHPTest.php diff --git a/test/phpunit/CodingPHPTest.php b/test/phpunit/CodingPHPTest.php new file mode 100644 index 00000000000..b8d7bc90816 --- /dev/null +++ b/test/phpunit/CodingPHPTest.php @@ -0,0 +1,177 @@ + + * + * 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 3 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 . + * or see http://www.gnu.org/ + */ + +/** + * \file test/phpunit/SqlTest.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/core/lib/security.lib.php'; +require_once dirname(__FILE__).'/../../htdocs/core/lib/security2.lib.php'; + +if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); +if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); +if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); +if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); +if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK','1'); +if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL','1'); +if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU','1'); // If there is no menu to show +if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML','1'); // If we don't need to load the html.form.class.php +if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); +if (! defined("NOLOGIN")) define("NOLOGIN",'1'); // If this page is public (can be called outside logged session) + +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 CodingPhpTest extends PHPUnit_Framework_TestCase +{ + protected $savconf; + protected $savuser; + protected $savlangs; + protected $savdb; + + /** + * Constructor + * We save global variables into local variables + * + * @return SecurityTest + */ + function __construct() + { + //$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"; + } + + // tear down after class + public static function tearDownAfterClass() + { + global $conf,$user,$langs,$db; + $db->rollback(); + + print __METHOD__."\n"; + } + + /** + * Init phpunit tests + * + * @return void + */ + protected function setUp() + { + global $conf,$user,$langs,$db; + $conf=$this->savconf; + $user=$this->savuser; + $langs=$this->savlangs; + $db=$this->savdb; + + print __METHOD__."\n"; + } + + /** + * End phpunit tests + * + * @return void + */ + protected function tearDown() + { + print __METHOD__."\n"; + } + + /** + * testSql + * + * @return string + */ + public function testPHP() + { + global $conf,$user,$langs,$db; + $conf=$this->savconf; + $user=$this->savuser; + $langs=$this->savlangs; + $db=$this->savdb; + + include DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + $filesarray = dol_dir_list(DOL_DOCUMENT_ROOT, 'files', 1, '\.php', null, 'fullname'); + + foreach($filesarray as $key => $file) + { + if (preg_match('/\/htdocs\/includes\//', $file['fullname'])) continue; + if (preg_match('/\/htdocs\/custom\//', $file['fullname'])) continue; + if (preg_match('/\/htdocs\/nltechno/', $file['fullname'])) continue; + if (preg_match('/\/htdocs\/dolimed/', $file['fullname'])) continue; + + print 'Check php file '.$file['fullname']."\n"; + $filecontent=file_get_contents($file['fullname']); + + $ok=true; + $matches=array(); + preg_match_all('/=\'".\$this->(..)/', $filecontent, $matches, PREG_SET_ORDER); + foreach($matches as $key => $val) + { + if ($val[1] != 'db') + { + $ok=false; + break; + } + //if ($reg[0] != 'db') $ok=false; + } + //print __METHOD__." Result for checking we don't have non escaped string in sql requests for file ".$file."\n"; + $this->assertTrue($ok, 'Found non escaped string in building of a sql request '.$file['fullname'].'. Bad.'); + //exit; + } + + return; + } + +} From a534f796687d2ebddb79acca13a3b33c0d16474a Mon Sep 17 00:00:00 2001 From: philippe grand Date: Fri, 12 May 2017 16:02:01 +0200 Subject: [PATCH 099/299] Update code using new css class --- htdocs/contrat/card.php | 8 ++++---- htdocs/contrat/index.php | 16 +++------------- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index e88372c4835..4accbed5636 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -1757,7 +1757,7 @@ else if ($action == 'deleteline' && ! $_REQUEST["cancel"] && $user->rights->contrat->creer && $object->lines[$cursorline-1]->id == GETPOST('rowid')) { print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id."&lineid=".GETPOST('rowid'),$langs->trans("DeleteContractLine"),$langs->trans("ConfirmDeleteContractLine"),"confirm_deleteline",'',0,1); - if ($ret == 'html') print '
'; + if ($ret == 'html') print '
'; } /* @@ -1777,7 +1777,7 @@ else array('type' => 'select', 'name' => 'newcid', 'values' => $arraycontractid)); $form->form_confirm($_SERVER["PHP_SELF"]."?id=".$object->id."&lineid=".GETPOST('rowid'),$langs->trans("MoveToAnotherContract"),$langs->trans("ConfirmMoveToAnotherContract"),"confirm_move",$formquestion); - print '
'; + print '
'; } /* @@ -1789,7 +1789,7 @@ else $dateactend = dol_mktime(12, 0, 0, GETPOST('endmonth'), GETPOST('endday'), GETPOST('endyear')); $comment = GETPOST('comment'); $form->form_confirm($_SERVER["PHP_SELF"]."?id=".$object->id."&ligne=".GETPOST('ligne')."&date=".$dateactstart."&dateend=".$dateactend."&comment=".urlencode($comment),$langs->trans("ActivateService"),$langs->trans("ConfirmActivateService",dol_print_date($dateactstart,"%A %d %B %Y")),"confirm_active", '', 0, 1); - print '
'; + print '
'; } /* @@ -1801,7 +1801,7 @@ else $dateactend = dol_mktime(12, 0, 0, GETPOST('endmonth'), GETPOST('endday'), GETPOST('endyear')); $comment = GETPOST('comment'); $form->form_confirm($_SERVER["PHP_SELF"]."?id=".$object->id."&ligne=".GETPOST('ligne')."&date=".$dateactstart."&dateend=".$dateactend."&comment=".urlencode($comment), $langs->trans("CloseService"), $langs->trans("ConfirmCloseService",dol_print_date($dateactend,"%A %d %B %Y")), "confirm_closeline", '', 0, 1); - print '
'; + print '
'; } diff --git a/htdocs/contrat/index.php b/htdocs/contrat/index.php index ea9c06d0b2f..924958319a4 100644 --- a/htdocs/contrat/index.php +++ b/htdocs/contrat/index.php @@ -77,7 +77,6 @@ if (! empty($conf->global->MAIN_SEARCH_FORM_ON_HOME_AREAS)) // This is usele // Search contract if (! empty($conf->contrat->enabled)) { - $var=false; print '

'; print ''; print ''; @@ -181,7 +180,6 @@ else print '
'; print ''."\n"; -$var=true; $listofstatus=array(0,4,4,5); $bool=false; foreach($listofstatus as $status) { @@ -204,13 +202,11 @@ if (! empty($conf->use_javascript_ajax)) dol_print_graph('stats',300,180,$data,1,'pie',1); print ''; } -$var=true; $listofstatus=array(0,4,4,5); $bool=false; foreach($listofstatus as $status) { if (empty($conf->use_javascript_ajax)) - { - + { print ''; print ''; print ''; @@ -243,7 +239,6 @@ if (! empty($conf->contrat->enabled) && $user->rights->contrat->lire) if ( $resql ) { - $var = false; $num = $db->num_rows($resql); print '
'.$langs->trans("Statistics").' - '.$langs->trans("Services").'
'.$staticcontratligne->LibStatut($status,0,($bool?1:0)).''.($nb[$status.$bool]?$nb[$status.$bool]:0).' '.$staticcontratligne->LibStatut($status,3,($bool?1:0)).'
'; @@ -277,7 +272,7 @@ if (! empty($conf->contrat->enabled) && $user->rights->contrat->lire) } else { - print ''; + print ''; } print "
'.$langs->trans("NoContracts").'
'.$langs->trans("NoContracts").'

"; $db->free($resql); @@ -330,11 +325,9 @@ if ($result) print ''.$langs->trans("Services").''; print "\n"; - $var=True; while ($i < $num) { - $obj = $db->fetch_object($result); - + $obj = $db->fetch_object($result); print ''; print ''; @@ -397,7 +390,6 @@ if ($resql) print ''.$langs->trans("LastModifiedServices",$max).''; print "\n"; - $var=True; while ($i < min($num,$max)) { $obj = $db->fetch_object($resql); @@ -478,7 +470,6 @@ if ($resql) print ''.$langs->trans("NotActivatedServices").'
'.$num.''; print "\n"; - $var=True; while ($i < $num) { $obj = $db->fetch_object($resql); @@ -559,7 +550,6 @@ if ($resql) print ''.$langs->trans("ListOfExpiredServices").' '.$num.''; print "\n"; - $var=True; while ($i < $num) { $obj = $db->fetch_object($resql); From fa290c34fad108ec7c0751c0372ae9c4b4f63b06 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 12 May 2017 16:55:11 +0200 Subject: [PATCH 100/299] Fix against SQL injection. Add phpunit to detect missing escapement. --- .../class/accountingaccount.class.php | 8 ++--- .../accountancy/class/bookkeeping.class.php | 10 +++--- htdocs/adherents/class/adherent.class.php | 4 +-- .../adherents/class/adherent_type.class.php | 4 +-- htdocs/bookmarks/class/bookmark.class.php | 6 ++-- htdocs/categories/class/categorie.class.php | 10 +++--- htdocs/comm/action/class/actioncomm.class.php | 12 +++---- htdocs/comm/mailing/class/mailing.class.php | 10 +++--- htdocs/comm/propal/class/propal.class.php | 2 +- htdocs/compta/bank/class/account.class.php | 6 ++-- .../bank/class/paymentvarious.class.php | 12 +++---- .../deplacement/class/deplacement.class.php | 4 +-- .../cheque/class/remisecheque.class.php | 2 +- .../class/bonprelevement.class.php | 8 ++--- htdocs/contact/class/contact.class.php | 2 +- htdocs/contrat/class/contrat.class.php | 10 +++--- htdocs/core/class/commonobject.class.php | 32 +++++++++---------- htdocs/core/class/events.class.php | 2 +- htdocs/core/class/fiscalyear.class.php | 4 +-- htdocs/core/class/link.class.php | 4 +-- htdocs/core/class/menubase.class.php | 8 ++--- htdocs/core/modules/DolibarrModules.class.php | 12 +++---- htdocs/core/modules/modAdherent.class.php | 4 +-- htdocs/core/modules/modCommande.class.php | 4 +-- htdocs/core/modules/modDon.class.php | 4 +-- htdocs/core/modules/modExpedition.class.php | 8 ++--- htdocs/core/modules/modFacture.class.php | 4 +-- htdocs/core/modules/modFicheinter.class.php | 4 +-- htdocs/core/modules/modFournisseur.class.php | 4 +-- htdocs/core/modules/modPrelevement.class.php | 4 +-- htdocs/core/modules/modProjet.class.php | 8 ++--- htdocs/core/modules/modPropale.class.php | 4 +-- .../modules/modSupplierProposal.class.php | 4 +-- htdocs/don/class/don.class.php | 8 ++--- htdocs/ecm/class/ecmdirectory.class.php | 2 +- htdocs/ecm/class/ecmfiles.class.php | 2 +- htdocs/expedition/class/expedition.class.php | 10 +++--- .../class/expensereport.class.php | 16 +++++----- htdocs/fichinter/class/fichinter.class.php | 4 +-- .../class/fournisseur.commande.class.php | 8 ++--- .../fourn/class/fournisseur.facture.class.php | 6 ++-- htdocs/holiday/class/holiday.class.php | 12 +++---- htdocs/hrm/class/establishment.class.php | 10 +++--- htdocs/livraison/class/livraison.class.php | 2 +- htdocs/loan/class/loan.class.php | 4 +-- .../product/actions_card_product.class.php | 2 +- .../service/actions_card_service.class.php | 2 +- htdocs/product/class/product.class.php | 18 +++++------ htdocs/projet/class/project.class.php | 2 +- htdocs/projet/class/projectstats.class.php | 2 +- .../class/companybankaccount.class.php | 12 +++---- htdocs/societe/class/societe.class.php | 16 +++++----- .../class/supplier_proposal.class.php | 8 ++--- htdocs/user/class/userbankaccount.class.php | 12 +++---- test/phpunit/AllTests.php | 9 ++++-- .../{CodingPHPTest.php => CodingPhpTest.php} | 9 +++--- .../{SqlTest.php => CodingSqlTest.php} | 0 57 files changed, 202 insertions(+), 198 deletions(-) rename test/phpunit/{CodingPHPTest.php => CodingPhpTest.php} (94%) rename test/phpunit/{SqlTest.php => CodingSqlTest.php} (100%) diff --git a/htdocs/accountancy/class/accountingaccount.class.php b/htdocs/accountancy/class/accountingaccount.class.php index 8bf7dfe0c44..a526f9171a6 100644 --- a/htdocs/accountancy/class/accountingaccount.class.php +++ b/htdocs/accountancy/class/accountingaccount.class.php @@ -251,12 +251,12 @@ class AccountingAccount extends CommonObject $sql .= " SET fk_pcg_version = " . ($this->fk_pcg_version ? "'" . $this->db->escape($this->fk_pcg_version) . "'" : "null"); $sql .= " , pcg_type = " . ($this->pcg_type ? "'" . $this->db->escape($this->pcg_type) . "'" : "null"); $sql .= " , pcg_subtype = " . ($this->pcg_subtype ? "'" . $this->db->escape($this->pcg_subtype) . "'" : "null"); - $sql .= " , account_number = '" . $this->account_number . "'"; - $sql .= " , account_parent = '" . $this->account_parent . "'"; + $sql .= " , account_number = '" . $this->db->escape($this->account_number) . "'"; + $sql .= " , account_parent = '" . $this->db->escape($this->account_parent) . "'"; $sql .= " , label = " . ($this->label ? "'" . $this->db->escape($this->label) . "'" : "null"); - $sql .= " , fk_accounting_category = '" . $this->account_category . "'"; + $sql .= " , fk_accounting_category = '" . $this->db->escape($this->account_category) . "'"; $sql .= " , fk_user_modif = " . $user->id; - $sql .= " , active = '" . $this->active . "'"; + $sql .= " , active = " . $this->active; $sql .= " WHERE rowid = " . $this->id; dol_syslog(get_class($this) . "::update sql=" . $sql, LOG_DEBUG); diff --git a/htdocs/accountancy/class/bookkeeping.class.php b/htdocs/accountancy/class/bookkeeping.class.php index 8f31b40bc54..a59d92eb63a 100644 --- a/htdocs/accountancy/class/bookkeeping.class.php +++ b/htdocs/accountancy/class/bookkeeping.class.php @@ -189,10 +189,10 @@ class BookKeeping extends CommonObject // First check if line not yet already in bookkeeping $sql = "SELECT count(*) as nb"; $sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element; - $sql .= " WHERE doc_type = '" . $this->doc_type . "'"; + $sql .= " WHERE doc_type = '" . $this->db->escape($this->doc_type) . "'"; $sql .= " AND fk_doc = " . $this->fk_doc; $sql .= " AND fk_docdet = " . $this->fk_docdet; // This field can be 0 is record is for several lines - $sql .= " AND numero_compte = '" . $this->numero_compte . "'"; + $sql .= " AND numero_compte = '" . $this->db->escape($this->numero_compte) . "'"; $sql .= " AND entity IN (" . getEntity("accountancy", 1) . ")"; $resql = $this->db->query($sql); @@ -204,9 +204,9 @@ class BookKeeping extends CommonObject // Determine piece_num $sqlnum = "SELECT piece_num"; $sqlnum .= " FROM " . MAIN_DB_PREFIX . $this->table_element; - $sqlnum .= " WHERE doc_type = '" . $this->doc_type . "'"; // For example doc_type = 'bank' - $sqlnum .= " AND fk_docdet = '" . $this->fk_docdet . "'"; // fk_docdet is rowid into llx_bank or llx_facturedet or llx_facturefourndet, or ... - $sqlnum .= " AND doc_ref = '" . $this->doc_ref . "'"; // ref of source object + $sqlnum .= " WHERE doc_type = '" . $this->db->escape($this->doc_type) . "'"; // For example doc_type = 'bank' + $sqlnum .= " AND fk_docdet = " . $this->db->escape($this->fk_docdet); // fk_docdet is rowid into llx_bank or llx_facturedet or llx_facturefourndet, or ... + $sqlnum .= " AND doc_ref = '" . $this->db->escape($this->doc_ref) . "'"; // ref of source object $sqlnum .= " AND entity IN (" . getEntity("accountancy", 1) . ")"; dol_syslog(get_class($this) . ":: create sqlnum=" . $sqlnum, LOG_DEBUG); diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 17fad129d80..92449005d1f 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -345,7 +345,7 @@ class Adherent extends CommonObject { // Add link to user $sql = "UPDATE ".MAIN_DB_PREFIX."user SET"; - $sql.= " fk_member = '".$this->id."'"; + $sql.= " fk_member = ".$this->id; $sql.= " WHERE rowid = ".$this->user_id; dol_syslog(get_class($this)."::create", LOG_DEBUG); $resql = $this->db->query($sql); @@ -1099,7 +1099,7 @@ class Adherent extends CommonObject elseif ($ref || $fk_soc) { $sql.= " AND d.entity IN (".getEntity().")"; if ($ref) $sql.= " AND d.rowid='".$this->db->escape($ref)."'"; - elseif ($fk_soc) $sql.= " AND d.fk_soc='".$fk_soc."'"; + elseif ($fk_soc > 0) $sql.= " AND d.fk_soc=".$fk_soc; } elseif ($ref_ext) { diff --git a/htdocs/adherents/class/adherent_type.class.php b/htdocs/adherents/class/adherent_type.class.php index c756cc51949..d6ee9958162 100644 --- a/htdocs/adherents/class/adherent_type.class.php +++ b/htdocs/adherents/class/adherent_type.class.php @@ -123,9 +123,9 @@ class AdherentType extends CommonObject $sql.= "SET "; $sql.= "statut = ".$this->statut.","; $sql.= "libelle = '".$this->db->escape($this->libelle) ."',"; - $sql.= "subscription = '".$this->subscription."',"; + $sql.= "subscription = '".$this->db->escape($this->subscription)."',"; $sql.= "note = '".$this->db->escape($this->note)."',"; - $sql.= "vote = '".$this->vote."',"; + $sql.= "vote = '".$this->db->escape($this->vote)."',"; $sql.= "mail_valid = '".$this->db->escape($this->mail_valid)."'"; $sql .= " WHERE rowid =".$this->id; diff --git a/htdocs/bookmarks/class/bookmark.class.php b/htdocs/bookmarks/class/bookmark.class.php index 0e0d6df5f35..26eabc5a5ed 100644 --- a/htdocs/bookmarks/class/bookmark.class.php +++ b/htdocs/bookmarks/class/bookmark.class.php @@ -173,10 +173,10 @@ class Bookmark extends CommonObject $sql.= " SET fk_user = ".($this->fk_user > 0?"'".$this->fk_user."'":"0"); $sql.= " ,dateb = '".$this->db->idate($this->datec)."'"; $sql.= " ,url = '".$this->db->escape($this->url)."'"; - $sql.= " ,target = '".$this->target."'"; + $sql.= " ,target = '".$this->db->escape($this->target)."'"; $sql.= " ,title = '".$this->db->escape($this->title)."'"; - $sql.= " ,favicon = '".$this->favicon."'"; - $sql.= " ,position = '".$this->position."'"; + $sql.= " ,favicon = '".$this->db->escape($this->favicon)."'"; + $sql.= " ,position = '".$this->db->escape($this->position)."'"; $sql.= " WHERE rowid = ".$this->id; dol_syslog("Bookmark::update", LOG_DEBUG); diff --git a/htdocs/categories/class/categorie.class.php b/htdocs/categories/class/categorie.class.php index b2cd3d3dd31..518c3faa683 100644 --- a/htdocs/categories/class/categorie.class.php +++ b/htdocs/categories/class/categorie.class.php @@ -189,9 +189,9 @@ class Categorie extends CommonObject $sql = "SELECT rowid, fk_parent, entity, label, description, color, fk_soc, visible, type"; $sql.= " FROM ".MAIN_DB_PREFIX."categorie"; - if ($id) + if ($id > 0) { - $sql.= " WHERE rowid = '".$id."'"; + $sql.= " WHERE rowid = ".$id; } else { @@ -399,7 +399,7 @@ class Categorie extends CommonObject { $sql .= ", fk_soc = ".($this->socid != -1 ? $this->socid : 'null'); } - $sql .= ", visible = '".$this->visible."'"; + $sql .= ", visible = '".$this->db->escape($this->visible)."'"; $sql .= ", fk_parent = ".$this->fk_parent; $sql .= " WHERE rowid = ".$this->id; @@ -1670,7 +1670,7 @@ class Categorie extends CommonObject $sql2 = "UPDATE ".MAIN_DB_PREFIX."categorie_lang"; $sql2.= " SET label='".$this->db->escape($this->label)."',"; $sql2.= " description='".$this->db->escape($this->description)."'"; - $sql2.= " WHERE fk_category=".$this->id." AND lang='".$key."'"; + $sql2.= " WHERE fk_category=".$this->id." AND lang='".$this->db->escape($key)."'"; } else { @@ -1692,7 +1692,7 @@ class Categorie extends CommonObject $sql2 = "UPDATE ".MAIN_DB_PREFIX."categorie_lang"; $sql2.= " SET label='".$this->db->escape($this->multilangs["$key"]["label"])."',"; $sql2.= " description='".$this->db->escape($this->multilangs["$key"]["description"])."'"; - $sql2.= " WHERE fk_category=".$this->id." AND lang='".$key."'"; + $sql2.= " WHERE fk_category=".$this->id." AND lang='".$this->db->escape($key)."'"; } else { diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index fc0bbebb901..a9695abcb35 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -753,8 +753,8 @@ class ActionComm extends CommonObject $this->db->begin(); $sql = "UPDATE ".MAIN_DB_PREFIX."actioncomm "; - $sql.= " SET percent = '".$this->percentage."'"; - if ($this->fk_action > 0) $sql.= ", fk_action = '".$this->fk_action."'"; + $sql.= " SET percent = '".$this->db->escape($this->percentage)."'"; + if ($this->fk_action > 0) $sql.= ", fk_action = '".$this->db->escape($this->fk_action)."'"; $sql.= ", label = ".($this->label ? "'".$this->db->escape($this->label)."'":"null"); $sql.= ", datep = ".(strval($this->datep)!='' ? "'".$this->db->idate($this->datep)."'" : 'null'); $sql.= ", datep2 = ".(strval($this->datef)!='' ? "'".$this->db->idate($this->datef)."'" : 'null'); @@ -763,11 +763,11 @@ class ActionComm extends CommonObject $sql.= ", fk_project =". ($this->fk_project > 0 ? "'".$this->fk_project."'":"null"); $sql.= ", fk_soc =". ($socid > 0 ? "'".$socid."'":"null"); $sql.= ", fk_contact =". ($contactid > 0 ? "'".$contactid."'":"null"); - $sql.= ", priority = '".$this->priority."'"; - $sql.= ", fulldayevent = '".$this->fulldayevent."'"; + $sql.= ", priority = '".$this->db->escape($this->priority)."'"; + $sql.= ", fulldayevent = '".$this->db->escape($this->fulldayevent)."'"; $sql.= ", location = ".($this->location ? "'".$this->db->escape($this->location)."'":"null"); - $sql.= ", transparency = '".$this->transparency."'"; - $sql.= ", fk_user_mod = '".$user->id."'"; + $sql.= ", transparency = '".$this->db->escape($this->transparency)."'"; + $sql.= ", fk_user_mod = ".$user->id; $sql.= ", fk_user_action=".($userownerid > 0 ? "'".$userownerid."'":"null"); $sql.= ", fk_user_done=".($userdoneid > 0 ? "'".$userdoneid."'":"null"); if (! empty($this->fk_element)) $sql.= ", fk_element=".($this->fk_element?$this->fk_element:"null"); diff --git a/htdocs/comm/mailing/class/mailing.class.php b/htdocs/comm/mailing/class/mailing.class.php index 43a3cdcb78d..93c47f8aa51 100644 --- a/htdocs/comm/mailing/class/mailing.class.php +++ b/htdocs/comm/mailing/class/mailing.class.php @@ -159,11 +159,11 @@ class Mailing extends CommonObject $sql .= " SET titre = '".$this->db->escape($this->titre)."'"; $sql .= ", sujet = '".$this->db->escape($this->sujet)."'"; $sql .= ", body = '".$this->db->escape($this->body)."'"; - $sql .= ", email_from = '".$this->email_from."'"; - $sql .= ", email_replyto = '".$this->email_replyto."'"; - $sql .= ", email_errorsto = '".$this->email_errorsto."'"; - $sql .= ", bgcolor = '".($this->bgcolor?$this->bgcolor:null)."'"; - $sql .= ", bgimage = '".($this->bgimage?$this->bgimage:null)."'"; + $sql .= ", email_from = '".$this->db->escape($this->email_from)."'"; + $sql .= ", email_replyto = '".$this->db->escape($this->email_replyto)."'"; + $sql .= ", email_errorsto = '".$this->db->escape($this->email_errorsto)."'"; + $sql .= ", bgcolor = '".($this->bgcolor?$this->db->escape($this->bgcolor):null)."'"; + $sql .= ", bgimage = '".($this->bgimage?$this->db->escape($this->bgimage):null)."'"; $sql .= " WHERE rowid = ".$this->id; dol_syslog("Mailing::Update", LOG_DEBUG); diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index dfb53b07621..224cb77eee1 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -1021,7 +1021,7 @@ class Propal extends CommonObject { $sql = "UPDATE ".MAIN_DB_PREFIX."propal"; $sql.= " SET fk_delivery_address = ".$this->fk_delivery_address; - $sql.= " WHERE ref = '".$this->ref."'"; + $sql.= " WHERE ref = '".$this->db->escape($this->ref)."'"; $sql.= " AND entity = ".$conf->entity; $result=$this->db->query($sql); diff --git a/htdocs/compta/bank/class/account.class.php b/htdocs/compta/bank/class/account.class.php index e2ad8c64bd1..9fdd329fd3d 100644 --- a/htdocs/compta/bank/class/account.class.php +++ b/htdocs/compta/bank/class/account.class.php @@ -701,8 +701,8 @@ class Account extends CommonObject $sql.= ",clos = ".$this->clos; $sql.= ",rappro = ".$this->rappro; $sql.= ",url = ".($this->url?"'".$this->url."'":"null"); - $sql.= ",account_number = '".$this->account_number."'"; - $sql.= ",fk_accountancy_journal = '".$this->fk_accountancy_journal."'"; + $sql.= ",account_number = '".$this->db->escape($this->account_number)."'"; + $sql.= ",fk_accountancy_journal = '".$this->db->escape($this->fk_accountancy_journal)."'"; $sql.= ",bank = '".$this->db->escape($this->bank)."'"; $sql.= ",code_banque='".$this->db->escape($this->code_banque)."'"; @@ -1858,7 +1858,7 @@ class AccountLine extends CommonObject $sql = "UPDATE ".MAIN_DB_PREFIX."bank SET"; $sql.= " rappro = 1"; - $sql.= ", num_releve = '".$this->num_releve."'"; + $sql.= ", num_releve = '".$this->db->escape($this->num_releve)."'"; $sql.= ", fk_user_rappro = ".$user->id; $sql.= " WHERE rowid = ".$this->id; diff --git a/htdocs/compta/bank/class/paymentvarious.class.php b/htdocs/compta/bank/class/paymentvarious.class.php index 2cbd75146df..d0c0d61a954 100644 --- a/htdocs/compta/bank/class/paymentvarious.class.php +++ b/htdocs/compta/bank/class/paymentvarious.class.php @@ -88,19 +88,19 @@ class PaymentVarious extends CommonObject $sql = "UPDATE ".MAIN_DB_PREFIX."payment_salary SET"; $sql.= " tms=".$this->db->idate($this->tms).","; - $sql.= " fk_user='".$this->fk_user."',"; + $sql.= " fk_user=".$this->fk_user.","; $sql.= " datep=".$this->db->idate($this->datep).","; $sql.= " datev=".$this->db->idate($this->datev).","; $sql.= " sens=".$this->sens.","; - $sql.= " amount='".$this->amount."',"; + $sql.= " amount=".price2num($this->amount).","; $sql.= " fk_typepayment=".$this->fk_typepayment."',"; - $sql.= " num_payment='".$this->num_payment."',"; + $sql.= " num_payment='".$this->db->escape($this->num_payment)."',"; $sql.= " label='".$this->db->escape($this->label)."',"; $sql.= " note='".$this->db->escape($this->note)."',"; $sql.= " accountancy_code='".$this->db->escape($this->accountancy_code)."',"; - $sql.= " fk_bank=".($this->fk_bank > 0 ? "'".$this->fk_bank."'":"null").","; - $sql.= " fk_user_author='".$this->fk_user_author."',"; - $sql.= " fk_user_modif='".$this->fk_user_modif."'"; + $sql.= " fk_bank=".($this->fk_bank > 0 ? $this->fk_bank:"null").","; + $sql.= " fk_user_author=".$this->fk_user_author.","; + $sql.= " fk_user_modif=".$this->fk_user_modif; $sql.= " WHERE rowid=".$this->id; diff --git a/htdocs/compta/deplacement/class/deplacement.class.php b/htdocs/compta/deplacement/class/deplacement.class.php index 4b2dce9f14e..fa8911cecf7 100644 --- a/htdocs/compta/deplacement/class/deplacement.class.php +++ b/htdocs/compta/deplacement/class/deplacement.class.php @@ -187,8 +187,8 @@ class Deplacement extends CommonObject $sql = "UPDATE ".MAIN_DB_PREFIX."deplacement "; $sql .= " SET km = ".$this->km; // This is a distance or amount $sql .= " , dated = '".$this->db->idate($this->date)."'"; - $sql .= " , type = '".$this->type."'"; - $sql .= " , fk_statut = '".$this->statut."'"; + $sql .= " , type = '".$this->db->escape($this->type)."'"; + $sql .= " , fk_statut = '".$this->db->escape($this->statut)."'"; $sql .= " , fk_user = ".$this->fk_user; $sql .= " , fk_user_modif = ".$user->id; $sql .= " , fk_soc = ".($this->socid > 0?$this->socid:'null'); diff --git a/htdocs/compta/paiement/cheque/class/remisecheque.class.php b/htdocs/compta/paiement/cheque/class/remisecheque.class.php index 6aa0714d5c9..4889693857b 100644 --- a/htdocs/compta/paiement/cheque/class/remisecheque.class.php +++ b/htdocs/compta/paiement/cheque/class/remisecheque.class.php @@ -308,7 +308,7 @@ class RemiseCheque extends CommonObject if ( $this->errno === 0) { $sql = "UPDATE ".MAIN_DB_PREFIX."bank"; $sql.= " SET fk_bordereau = 0"; - $sql.= " WHERE fk_bordereau = '".$this->id."'"; + $sql.= " WHERE fk_bordereau = ".$this->id; $resql = $this->db->query($sql); if (!$resql) diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php index d7489b8aca0..90ba6a22431 100644 --- a/htdocs/compta/prelevement/class/bonprelevement.class.php +++ b/htdocs/compta/prelevement/class/bonprelevement.class.php @@ -1082,19 +1082,19 @@ class BonPrelevement extends CommonObject { $this->db->begin(); - $sql = "DELETE FROM ".MAIN_DB_PREFIX."prelevement_facture WHERE fk_prelevement_lignes IN (SELECT rowid FROM ".MAIN_DB_PREFIX."prelevement_lignes WHERE fk_prelevement_bons = '".$this->id."')"; + $sql = "DELETE FROM ".MAIN_DB_PREFIX."prelevement_facture WHERE fk_prelevement_lignes IN (SELECT rowid FROM ".MAIN_DB_PREFIX."prelevement_lignes WHERE fk_prelevement_bons = ".$this->id.")"; $resql1=$this->db->query($sql); if (! $resql1) dol_print_error($this->db); - $sql = "DELETE FROM ".MAIN_DB_PREFIX."prelevement_lignes WHERE fk_prelevement_bons = '".$this->id."'"; + $sql = "DELETE FROM ".MAIN_DB_PREFIX."prelevement_lignes WHERE fk_prelevement_bons = ".$this->id; $resql2=$this->db->query($sql); if (! $resql2) dol_print_error($this->db); - $sql = "DELETE FROM ".MAIN_DB_PREFIX."prelevement_bons WHERE rowid = '".$this->id."'"; + $sql = "DELETE FROM ".MAIN_DB_PREFIX."prelevement_bons WHERE rowid = ".$this->id; $resql3=$this->db->query($sql); if (! $resql3) dol_print_error($this->db); - $sql = "UPDATE ".MAIN_DB_PREFIX."prelevement_facture_demande SET fk_prelevement_bons = NULL, traite = 0 WHERE fk_prelevement_bons = '".$this->id."'"; + $sql = "UPDATE ".MAIN_DB_PREFIX."prelevement_facture_demande SET fk_prelevement_bons = NULL, traite = 0 WHERE fk_prelevement_bons = ".$this->id; $resql4=$this->db->query($sql); if (! $resql4) dol_print_error($this->db); diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index 216cce41171..b80a300431a 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -317,7 +317,7 @@ class Contact extends CommonObject $sql .= ", phone_perso = ".(isset($this->phone_perso)?"'".$this->db->escape($this->phone_perso)."'":"null"); $sql .= ", phone_mobile = ".(isset($this->phone_mobile)?"'".$this->db->escape($this->phone_mobile)."'":"null"); $sql .= ", jabberid = ".(isset($this->jabberid)?"'".$this->db->escape($this->jabberid)."'":"null"); - $sql .= ", priv = '".$this->priv."'"; + $sql .= ", priv = '".$this->db->escape($this->priv)."'"; $sql .= ", statut = ".$this->statut; $sql .= ", fk_user_modif=".($user->id > 0 ? "'".$user->id."'":"NULL"); $sql .= ", default_lang=".($this->default_lang?"'".$this->default_lang."'":"NULL"); diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 8564edd6ddf..db6464edb6a 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -2801,10 +2801,10 @@ class ContratLigne extends CommonObjectLine $sql.= " tva_tx=".price2num($this->tva_tx).","; $sql.= " localtax1_tx=".price2num($this->localtax1_tx).","; $sql.= " localtax2_tx=".price2num($this->localtax2_tx).","; - $sql.= " qty='".$this->qty."',"; + $sql.= " qty=".price2num($this->qty).","; $sql.= " remise_percent=".price2num($this->remise_percent).","; - $sql.= " remise=".($this->remise?"'".$this->remise."'":"null").","; - $sql.= " fk_remise_except=".($this->fk_remise_except?"'".$this->fk_remise_except."'":"null").","; + $sql.= " remise=".($this->remise?price2num($this->remise):"null").","; + $sql.= " fk_remise_except=".($this->fk_remise_except > 0?$this->fk_remise_except:"null").","; $sql.= " subprice=".($this->subprice != '' ? $this->subprice : "null").","; $sql.= " price_ht=".($this->price_ht != '' ? $this->price_ht : "null").","; $sql.= " total_ht=".$this->total_ht.","; @@ -2818,8 +2818,8 @@ class ContratLigne extends CommonObjectLine $sql.= " fk_user_author=".($this->fk_user_author >= 0?$this->fk_user_author:"NULL").","; $sql.= " fk_user_ouverture=".($this->fk_user_ouverture > 0?$this->fk_user_ouverture:"NULL").","; $sql.= " fk_user_cloture=".($this->fk_user_cloture > 0?$this->fk_user_cloture:"NULL").","; - $sql.= " commentaire='".$this->db->escape($this->commentaire)."'"; - $sql.= ", fk_unit=".(!$this->fk_unit ? 'NULL' : $this->fk_unit); + $sql.= " commentaire='".$this->db->escape($this->commentaire)."',"; + $sql.= " fk_unit=".(!$this->fk_unit ? 'NULL' : $this->fk_unit); $sql.= " WHERE rowid=".$this->id; dol_syslog(get_class($this)."::update", LOG_DEBUG); diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 947d99af545..f3f4e689467 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -579,7 +579,7 @@ abstract class CommonObject // On recherche id type_contact $sql = "SELECT tc.rowid"; $sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact as tc"; - $sql.= " WHERE tc.element='".$this->element."'"; + $sql.= " WHERE tc.element='".$this->db->escape($this->element)."'"; $sql.= " AND tc.source='".$source."'"; $sql.= " AND tc.code='".$type_contact."' AND tc.active=1"; //print $sql; @@ -791,7 +791,7 @@ abstract class CommonObject if ($source == 'external'|| $source == 'thirdparty') $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."socpeople t on ec.fk_socpeople = t.rowid"; $sql.= " WHERE ec.element_id =".$this->id; $sql.= " AND ec.fk_c_type_contact=tc.rowid"; - $sql.= " AND tc.element='".$this->element."'"; + $sql.= " AND tc.element='".$this->db->escape($this->element)."'"; if ($code) $sql.= " AND tc.code = '".$this->db->escape($code)."'"; if ($source == 'internal') $sql.= " AND tc.source = 'internal'"; if ($source == 'external' || $source == 'thirdparty') $sql.= " AND tc.source = 'external'"; @@ -852,7 +852,7 @@ abstract class CommonObject //$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople as s ON ec.fk_socpeople=s.rowid"; // Si contact de type external, alors il est lie a une societe $sql.= " WHERE ec.rowid =".$rowid; $sql.= " AND ec.fk_c_type_contact=tc.rowid"; - $sql.= " AND tc.element = '".$this->element."'"; + $sql.= " AND tc.element = '".$this->db->escape($this->element)."'"; dol_syslog(get_class($this)."::swapContactStatus", LOG_DEBUG); $resql=$this->db->query($sql); @@ -893,10 +893,10 @@ abstract class CommonObject $tab = array(); $sql = "SELECT DISTINCT tc.rowid, tc.code, tc.libelle, tc.position"; $sql.= " FROM ".MAIN_DB_PREFIX."c_type_contact as tc"; - $sql.= " WHERE tc.element='".$this->element."'"; + $sql.= " WHERE tc.element='".$this->db->escape($this->element)."'"; if ($activeonly == 1) $sql.= " AND tc.active=1"; // only the active types - if (! empty($source) && $source != 'all') $sql.= " AND tc.source='".$source."'"; - if (! empty($code)) $sql.= " AND tc.code='".$code."'"; + if (! empty($source) && $source != 'all') $sql.= " AND tc.source='".$this->db->escape($source)."'"; + if (! empty($code)) $sql.= " AND tc.code='".$this->db->escape($code)."'"; $sql.= $this->db->order($order,'ASC'); //print "sql=".$sql; @@ -2691,16 +2691,16 @@ abstract class CommonObject if ($updatesource) { $sql.= "fk_source = ".$sourceid; - $sql.= ", sourcetype = '".$sourcetype."'"; + $sql.= ", sourcetype = '".$this->db->escape($sourcetype)."'"; $sql.= " WHERE fk_target = ".$this->id; - $sql.= " AND targettype = '".$this->element."'"; + $sql.= " AND targettype = '".$this->db->escape($this->element)."'"; } else if ($updatetarget) { $sql.= "fk_target = ".$targetid; - $sql.= ", targettype = '".$targettype."'"; + $sql.= ", targettype = '".$this->db->escape($targettype)."'"; $sql.= " WHERE fk_source = ".$this->id; - $sql.= " AND sourcetype = '".$this->element."'"; + $sql.= " AND sourcetype = '".$this->db->escape($this->element)."'"; } dol_syslog(get_class($this)."::updateObjectLinked", LOG_DEBUG); @@ -2749,19 +2749,19 @@ abstract class CommonObject { if ($deletesource) { - $sql.= " fk_source = ".$sourceid." AND sourcetype = '".$sourcetype."'"; - $sql.= " AND fk_target = ".$this->id." AND targettype = '".$this->element."'"; + $sql.= " fk_source = ".$sourceid." AND sourcetype = '".$this->db->escape($sourcetype)."'"; + $sql.= " AND fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."'"; } else if ($deletetarget) { - $sql.= " fk_target = ".$targetid." AND targettype = '".$targettype."'"; - $sql.= " AND fk_source = ".$this->id." AND sourcetype = '".$this->element."'"; + $sql.= " fk_target = ".$targetid." AND targettype = '".$this->db->escape($targettype)."'"; + $sql.= " AND fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."'"; } else { - $sql.= " (fk_source = ".$this->id." AND sourcetype = '".$this->element."')"; + $sql.= " (fk_source = ".$this->id." AND sourcetype = '".$this->db->escape($this->element)."')"; $sql.= " OR"; - $sql.= " (fk_target = ".$this->id." AND targettype = '".$this->element."')"; + $sql.= " (fk_target = ".$this->id." AND targettype = '".$this->db->escape($this->element)."')"; } } diff --git a/htdocs/core/class/events.class.php b/htdocs/core/class/events.class.php index e091743833c..2cfedfb7d1a 100644 --- a/htdocs/core/class/events.class.php +++ b/htdocs/core/class/events.class.php @@ -171,7 +171,7 @@ class Events // extends CommonObject // Update request $sql = "UPDATE ".MAIN_DB_PREFIX."events SET"; - $sql.= " type='".$this->type."',"; + $sql.= " type='".$this->db->escape($this->type)."',"; $sql.= " dateevent=".$this->db->idate($this->dateevent).","; $sql.= " description='".$this->db->escape($this->description)."'"; $sql.= " WHERE rowid=".$this->id; diff --git a/htdocs/core/class/fiscalyear.class.php b/htdocs/core/class/fiscalyear.class.php index 912c1e34879..22b26983bcc 100644 --- a/htdocs/core/class/fiscalyear.class.php +++ b/htdocs/core/class/fiscalyear.class.php @@ -142,10 +142,10 @@ class Fiscalyear extends CommonObject $this->db->begin(); $sql = "UPDATE ".MAIN_DB_PREFIX."accounting_fiscalyear"; - $sql .= " SET label = '".$this->label."'"; + $sql .= " SET label = '".$this->db->escape($this->label)."'"; $sql .= ", date_start = '".$this->db->idate($this->date_start)."'"; $sql .= ", date_end = ".($this->date_end ? "'".$this->db->idate($this->date_end)."'" : "null"); - $sql .= ", statut = '".$this->statut."'"; + $sql .= ", statut = '".$this->db->escape($this->statut)."'"; $sql .= ", datec = " . ($this->datec != '' ? "'".$this->db->idate($this->datec)."'" : 'null'); $sql .= ", fk_user_modif = " . $user->id; $sql .= " WHERE rowid = ".$this->id; diff --git a/htdocs/core/class/link.class.php b/htdocs/core/class/link.class.php index 62bcf9d22c5..f604e85e11d 100644 --- a/htdocs/core/class/link.class.php +++ b/htdocs/core/class/link.class.php @@ -174,9 +174,9 @@ class Link extends CommonObject $sql .= ", datea = '" . $this->db->idate(dol_now()) . "'"; $sql .= ", url = '" . $this->db->escape($this->url) . "'"; $sql .= ", label = '" . $this->db->escape($this->label) . "'"; - $sql .= ", objecttype = '" . $this->objecttype . "'"; + $sql .= ", objecttype = '" . $this->db->escape($this->objecttype) . "'"; $sql .= ", objectid = " . $this->objectid; - $sql .= " WHERE rowid = '" . $this->id ."'"; + $sql .= " WHERE rowid = " . $this->id; dol_syslog(get_class($this)."::update sql = " .$sql); $resql = $this->db->query($sql); diff --git a/htdocs/core/class/menubase.class.php b/htdocs/core/class/menubase.class.php index 93037117cb8..ed6b9929a32 100644 --- a/htdocs/core/class/menubase.class.php +++ b/htdocs/core/class/menubase.class.php @@ -216,20 +216,20 @@ class Menubase $sql = "UPDATE ".MAIN_DB_PREFIX."menu SET"; $sql.= " menu_handler='".$this->db->escape($this->menu_handler)."',"; $sql.= " module='".$this->db->escape($this->module)."',"; - $sql.= " type='".$this->type."',"; + $sql.= " type='".$this->db->escape($this->type)."',"; $sql.= " mainmenu='".$this->db->escape($this->mainmenu)."',"; $sql.= " leftmenu='".$this->db->escape($this->leftmenu)."',"; - $sql.= " fk_menu='".$this->fk_menu."',"; + $sql.= " fk_menu='".$this->db->escape($this->fk_menu)."',"; $sql.= " fk_mainmenu=".($this->fk_mainmenu?"'".$this->fk_mainmenu."'":"null").","; $sql.= " fk_leftmenu=".($this->fk_leftmenu?"'".$this->fk_leftmenu."'":"null").","; - $sql.= " position='".$this->position."',"; + $sql.= " position=".($this->position > 0 ? $this->position : 0).","; $sql.= " url='".$this->db->escape($this->url)."',"; $sql.= " target='".$this->db->escape($this->target)."',"; $sql.= " titre='".$this->db->escape($this->titre)."',"; $sql.= " langs='".$this->db->escape($this->langs)."',"; $sql.= " perms='".$this->db->escape($this->perms)."',"; $sql.= " enabled='".$this->db->escape($this->enabled)."',"; - $sql.= " usertype='".$this->user."'"; + $sql.= " usertype='".$this->db->escape($this->user)."'"; $sql.= " WHERE rowid=".$this->id; dol_syslog(get_class($this)."::update", LOG_DEBUG); diff --git a/htdocs/core/modules/DolibarrModules.class.php b/htdocs/core/modules/DolibarrModules.class.php index d0559268c52..f501d33c29a 100644 --- a/htdocs/core/modules/DolibarrModules.class.php +++ b/htdocs/core/modules/DolibarrModules.class.php @@ -779,7 +779,7 @@ class DolibarrModules // Can not be abstract, because we need to insta global $conf; $sql = "SELECT tms FROM ".MAIN_DB_PREFIX."const"; - $sql.= " WHERE ".$this->db->decrypt('name')." = '".$this->const_name."'"; + $sql.= " WHERE ".$this->db->decrypt('name')." = '".$this->db->escape($this->const_name)."'"; $sql.= " AND entity IN (0, ".$conf->entity.")"; dol_syslog(get_class($this)."::getLastActiveDate", LOG_DEBUG); @@ -805,7 +805,7 @@ class DolibarrModules // Can not be abstract, because we need to insta global $conf; $sql = "SELECT tms, note FROM ".MAIN_DB_PREFIX."const"; - $sql.= " WHERE ".$this->db->decrypt('name')." = '".$this->const_name."'"; + $sql.= " WHERE ".$this->db->decrypt('name')." = '".$this->db->escape($this->const_name)."'"; $sql.= " AND entity IN (0, ".$conf->entity.")"; dol_syslog(get_class($this)."::getLastActiveDate", LOG_DEBUG); @@ -841,7 +841,7 @@ class DolibarrModules // Can not be abstract, because we need to insta $entity = ((! empty($this->always_enabled) || ! empty($this->core_enabled)) ? 0 : $conf->entity); $sql = "DELETE FROM ".MAIN_DB_PREFIX."const"; - $sql.= " WHERE ".$this->db->decrypt('name')." = '".$this->const_name."'"; + $sql.= " WHERE ".$this->db->decrypt('name')." = '".$this->db->escape($this->const_name)."'"; $sql.= " AND entity IN (0, ".$entity.")"; dol_syslog(get_class($this)."::_active", LOG_DEBUG); @@ -879,7 +879,7 @@ class DolibarrModules // Can not be abstract, because we need to insta $entity = ((! empty($this->always_enabled) || ! empty($this->core_enabled)) ? 0 : $conf->entity); $sql = "DELETE FROM ".MAIN_DB_PREFIX."const"; - $sql.= " WHERE ".$this->db->decrypt('name')." = '".$this->const_name."'"; + $sql.= " WHERE ".$this->db->decrypt('name')." = '".$this->db->escape($this->const_name)."'"; $sql.= " AND entity IN (0, ".$entity.")"; dol_syslog(get_class($this)."::_unactive", LOG_DEBUG); @@ -1520,7 +1520,7 @@ class DolibarrModules // Can not be abstract, because we need to insta // Test if module is activated $sql_del = "SELECT ".$this->db->decrypt('value')." as value"; $sql_del.= " FROM ".MAIN_DB_PREFIX."const"; - $sql_del.= " WHERE ".$this->db->decrypt('name')." = '".$this->const_name."'"; + $sql_del.= " WHERE ".$this->db->decrypt('name')." = '".$this->db->escape($this->const_name)."'"; $sql_del.= " AND entity IN (0,".$entity.")"; dol_syslog(get_class($this)."::insert_permissions", LOG_DEBUG); @@ -1655,7 +1655,7 @@ class DolibarrModules // Can not be abstract, because we need to insta $err=0; $sql = "DELETE FROM ".MAIN_DB_PREFIX."rights_def"; - $sql.= " WHERE module = '".$this->rights_class."'"; + $sql.= " WHERE module = '".$this->db->escape($this->rights_class)."'"; $sql.= " AND entity = ".$conf->entity; dol_syslog(get_class($this)."::delete_permissions", LOG_DEBUG); if (! $this->db->query($sql)) diff --git a/htdocs/core/modules/modAdherent.class.php b/htdocs/core/modules/modAdherent.class.php index 3081cc8c726..4b3d1e5d34f 100644 --- a/htdocs/core/modules/modAdherent.class.php +++ b/htdocs/core/modules/modAdherent.class.php @@ -369,8 +369,8 @@ class modAdherent extends DolibarrModules }*/ $sql = array( - "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[0][2]."' AND type='member' AND entity = ".$conf->entity, - "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->const[0][2]."','member',".$conf->entity.")" + "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[0][2])."' AND type='member' AND entity = ".$conf->entity, + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[0][2])."','member',".$conf->entity.")" ); return $this->_init($sql,$options); diff --git a/htdocs/core/modules/modCommande.class.php b/htdocs/core/modules/modCommande.class.php index f9c10eef6de..1806bfdea71 100644 --- a/htdocs/core/modules/modCommande.class.php +++ b/htdocs/core/modules/modCommande.class.php @@ -256,8 +256,8 @@ class modCommande extends DolibarrModules } $sql = array( - "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[0][2]."' AND type = 'order' AND entity = ".$conf->entity, - "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->const[0][2]."','order',".$conf->entity.")" + "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[0][2])."' AND type = 'order' AND entity = ".$conf->entity, + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[0][2])."','order',".$conf->entity.")" ); return $this->_init($sql,$options); diff --git a/htdocs/core/modules/modDon.class.php b/htdocs/core/modules/modDon.class.php index 26dd397c913..881dd27e414 100644 --- a/htdocs/core/modules/modDon.class.php +++ b/htdocs/core/modules/modDon.class.php @@ -157,8 +157,8 @@ class modDon extends DolibarrModules global $conf; $sql = array( - "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[0][2]."' AND type = 'donation' AND entity = ".$conf->entity, - "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->const[0][2]."','donation',".$conf->entity.")", + "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[0][2])."' AND type = 'donation' AND entity = ".$conf->entity, + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[0][2])."','donation',".$conf->entity.")", ); return $this->_init($sql,$options); diff --git a/htdocs/core/modules/modExpedition.class.php b/htdocs/core/modules/modExpedition.class.php index 63f7b536c1b..7320eba6736 100644 --- a/htdocs/core/modules/modExpedition.class.php +++ b/htdocs/core/modules/modExpedition.class.php @@ -318,10 +318,10 @@ class modExpedition extends DolibarrModules $sql = array(); $sql = array( - "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[0][2]."' AND type = 'shipping' AND entity = ".$conf->entity, - "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->const[0][2]."','shipping',".$conf->entity.")", - "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[3][2]."' AND type = 'delivery' AND entity = ".$conf->entity, - "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->const[3][2]."','delivery',".$conf->entity.")", + "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[0][2])."' AND type = 'shipping' AND entity = ".$conf->entity, + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[0][2])."','shipping',".$conf->entity.")", + "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[3][2])."' AND type = 'delivery' AND entity = ".$conf->entity, + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[3][2])."','delivery',".$conf->entity.")", ); return $this->_init($sql,$options); diff --git a/htdocs/core/modules/modFacture.class.php b/htdocs/core/modules/modFacture.class.php index 148dd965abb..7029b7ffd78 100644 --- a/htdocs/core/modules/modFacture.class.php +++ b/htdocs/core/modules/modFacture.class.php @@ -311,8 +311,8 @@ class modFacture extends DolibarrModules } $sql = array( - "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[0][2]."' AND type = 'invoice' AND entity = ".$conf->entity, - "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->const[0][2]."','invoice',".$conf->entity.")" + "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[0][2])."' AND type = 'invoice' AND entity = ".$conf->entity, + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[0][2])."','invoice',".$conf->entity.")" ); return $this->_init($sql,$options); diff --git a/htdocs/core/modules/modFicheinter.class.php b/htdocs/core/modules/modFicheinter.class.php index 98ac6f9b3f2..55deaf2403f 100644 --- a/htdocs/core/modules/modFicheinter.class.php +++ b/htdocs/core/modules/modFicheinter.class.php @@ -194,8 +194,8 @@ class modFicheinter extends DolibarrModules $this->remove($options); $sql = array( - "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[0][2]."' AND type = 'ficheinter' AND entity = ".$conf->entity, - "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->const[0][2]."','ficheinter',".$conf->entity.")", + "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[0][2])."' AND type = 'ficheinter' AND entity = ".$conf->entity, + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[0][2])."','ficheinter',".$conf->entity.")", ); return $this->_init($sql,$options); diff --git a/htdocs/core/modules/modFournisseur.class.php b/htdocs/core/modules/modFournisseur.class.php index 269d4d04a17..fc2572d3669 100644 --- a/htdocs/core/modules/modFournisseur.class.php +++ b/htdocs/core/modules/modFournisseur.class.php @@ -572,8 +572,8 @@ class modFournisseur extends DolibarrModules $this->remove($options); $sql = array( - "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[0][2]."' AND type = 'order_supplier' AND entity = ".$conf->entity, - "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->const[0][2]."','order_supplier',".$conf->entity.")", + "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[0][2])."' AND type = 'order_supplier' AND entity = ".$conf->entity, + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[0][2])."','order_supplier',".$conf->entity.")", ); return $this->_init($sql,$options); diff --git a/htdocs/core/modules/modPrelevement.class.php b/htdocs/core/modules/modPrelevement.class.php index 6be4022438c..542a02e7589 100644 --- a/htdocs/core/modules/modPrelevement.class.php +++ b/htdocs/core/modules/modPrelevement.class.php @@ -153,8 +153,8 @@ class modPrelevement extends DolibarrModules $this->remove($options); $sql = array( - "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[0][2]."' AND type = 'bankaccount' AND entity = ".$conf->entity, - "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->const[0][2]."','bankaccount',".$conf->entity.")", + "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[0][2])."' AND type = 'bankaccount' AND entity = ".$conf->entity, + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[0][2])."','bankaccount',".$conf->entity.")", ); return $this->_init($sql,$options); diff --git a/htdocs/core/modules/modProjet.class.php b/htdocs/core/modules/modProjet.class.php index 4ad3a86771a..96e5a96b384 100644 --- a/htdocs/core/modules/modProjet.class.php +++ b/htdocs/core/modules/modProjet.class.php @@ -353,13 +353,13 @@ class modProjet extends DolibarrModules } $sql = array( - "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[0][2]."' AND type = 'project' AND entity = ".$conf->entity, - "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->const[0][2]."','project',".$conf->entity.")", + "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[0][2])."' AND type = 'project' AND entity = ".$conf->entity, + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[0][2])."','project',".$conf->entity.")", ); $sql = array( - "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[3][2]."' AND type = 'task' AND entity = ".$conf->entity, - "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->const[3][2]."','task',".$conf->entity.")" + "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[3][2])."' AND type = 'task' AND entity = ".$conf->entity, + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[3][2])."','task',".$conf->entity.")" ); return $this->_init($sql,$options); diff --git a/htdocs/core/modules/modPropale.class.php b/htdocs/core/modules/modPropale.class.php index ce23e996e0a..3dd39b336bc 100644 --- a/htdocs/core/modules/modPropale.class.php +++ b/htdocs/core/modules/modPropale.class.php @@ -248,8 +248,8 @@ class modPropale extends DolibarrModules } $sql = array( - "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[0][2]."' AND type = 'propal' AND entity = ".$conf->entity, - "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->const[0][2]."','propal',".$conf->entity.")", + "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[0][2])."' AND type = 'propal' AND entity = ".$conf->entity, + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[0][2])."','propal',".$conf->entity.")", ); return $this->_init($sql,$options); diff --git a/htdocs/core/modules/modSupplierProposal.class.php b/htdocs/core/modules/modSupplierProposal.class.php index 054fdca6c90..8869f0cd343 100644 --- a/htdocs/core/modules/modSupplierProposal.class.php +++ b/htdocs/core/modules/modSupplierProposal.class.php @@ -227,8 +227,8 @@ class modSupplierProposal extends DolibarrModules } $sql = array( - "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->const[0][2]."' AND type = 'supplier_proposal' AND entity = ".$conf->entity, - "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->const[0][2]."','supplier_proposal',".$conf->entity.")", + "DELETE FROM ".MAIN_DB_PREFIX."document_model WHERE nom = '".$this->db->escape($this->const[0][2])."' AND type = 'supplier_proposal' AND entity = ".$conf->entity, + "INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$this->db->escape($this->const[0][2])."','supplier_proposal',".$conf->entity.")", ); return $this->_init($sql, $options); diff --git a/htdocs/don/class/don.class.php b/htdocs/don/class/don.class.php index 74349a16271..bfcbd6b7059 100644 --- a/htdocs/don/class/don.class.php +++ b/htdocs/don/class/don.class.php @@ -464,11 +464,11 @@ class Don extends CommonObject $sql .= ",note_public=".(!empty($this->note_public)?("'".$this->db->escape($this->note_public)."'"):"NULL"); $sql .= ",datedon='".$this->db->idate($this->date)."'"; $sql .= ",date_valid=".($this->date_valid?"'".$this->db->idate($this->date)."'":"null"); - $sql .= ",email='".$this->email."'"; - $sql .= ",phone='".$this->phone."'"; - $sql .= ",phone_mobile='".$this->phone_mobile."'"; + $sql .= ",email='".$this->db->escape($this->email)."'"; + $sql .= ",phone='".$this->db->escape($this->phone)."'"; + $sql .= ",phone_mobile='".$this->db->escape($this->phone_mobile)."'"; $sql .= ",fk_statut=".$this->statut; - $sql .= " WHERE rowid = '".$this->id."'"; + $sql .= " WHERE rowid = ".$this->id; dol_syslog(get_class($this)."::Update", LOG_DEBUG); $resql=$this->db->query($sql); diff --git a/htdocs/ecm/class/ecmdirectory.class.php b/htdocs/ecm/class/ecmdirectory.class.php index 82fd7f49d58..31439fa5ba3 100644 --- a/htdocs/ecm/class/ecmdirectory.class.php +++ b/htdocs/ecm/class/ecmdirectory.class.php @@ -202,7 +202,7 @@ class EcmDirectory // extends CommonObject // Update request $sql = "UPDATE ".MAIN_DB_PREFIX."ecm_directories SET"; $sql.= " label='".$this->db->escape($this->label)."',"; - $sql.= " fk_parent='".$this->fk_parent."',"; + $sql.= " fk_parent='".$this->db->escape($this->fk_parent)."',"; $sql.= " description='".$this->db->escape($this->description)."'"; $sql.= " WHERE rowid=".$this->id; diff --git a/htdocs/ecm/class/ecmfiles.class.php b/htdocs/ecm/class/ecmfiles.class.php index 2089a5b3bb8..a48d3171020 100644 --- a/htdocs/ecm/class/ecmfiles.class.php +++ b/htdocs/ecm/class/ecmfiles.class.php @@ -140,7 +140,7 @@ class EcmFiles //extends CommonObject if (empty($this->position)) // Get max used { $sql = "SELECT MAX(position) as maxposition FROM " . MAIN_DB_PREFIX . $this->table_element; - $sql.= " WHERE filepath ='".$this->filepath."'"; + $sql.= " WHERE filepath ='".$this->db->escape($this->filepath)."'"; $resql = $this->db->query($sql); if ($resql) diff --git a/htdocs/expedition/class/expedition.class.php b/htdocs/expedition/class/expedition.class.php index 99d81852734..8d6822fd360 100644 --- a/htdocs/expedition/class/expedition.class.php +++ b/htdocs/expedition/class/expedition.class.php @@ -487,7 +487,7 @@ class Expedition extends CommonObject $sql.= ', e.fk_incoterms, e.location_incoterms'; $sql.= ', i.libelle as libelle_incoterms'; $sql.= " FROM ".MAIN_DB_PREFIX."expedition as e"; - $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."element_element as el ON el.fk_target = e.rowid AND el.targettype = '".$this->element."'"; + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."element_element as el ON el.fk_target = e.rowid AND el.targettype = '".$this->db->escape($this->element)."'"; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_incoterms as i ON e.fk_incoterms = i.rowid'; $sql.= " WHERE e.entity IN (".getEntity('expedition', 1).")"; if ($id) $sql.= " AND e.rowid=".$id; @@ -1753,10 +1753,10 @@ class Expedition extends CommonObject else { $sql = "UPDATE ".MAIN_DB_PREFIX."c_shipment_mode SET"; - $sql.= " code='".$this->update['code']."'"; - $sql.= ",libelle='".$this->update['libelle']."'"; - $sql.= ",description='".$this->update['description']."'"; - $sql.= ",tracking='".$this->update['tracking']."'"; + $sql.= " code='".$this->db->escape($this->update['code'])."'"; + $sql.= ",libelle='".$this->db->escape($this->update['libelle'])."'"; + $sql.= ",description='".$this->db->escape($this->update['description'])."'"; + $sql.= ",tracking='".$this->db->escape($this->update['tracking'])."'"; $sql.= " WHERE rowid=".$id; $resql = $this->db->query($sql); } diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php index 898b5c4cd1f..eb16583df26 100644 --- a/htdocs/expensereport/class/expensereport.class.php +++ b/htdocs/expensereport/class/expensereport.class.php @@ -183,7 +183,7 @@ class ExpenseReport extends CommonObject $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX.$this->table_element); $this->ref='(PROV'.$this->id.')'; - $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element." SET ref='".$this->ref."' WHERE rowid=".$this->id; + $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element." SET ref='".$this->db->escape($this->ref)."' WHERE rowid=".$this->id; $resql=$this->db->query($sql); if (!$resql) $error++; @@ -1078,7 +1078,7 @@ class ExpenseReport extends CommonObject $this->db->begin(); $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element; - $sql.= " SET ref = '".$this->ref."', fk_statut = 2, fk_user_valid = ".$fuser->id.", date_valid='".$this->db->idate($now)."'"; + $sql.= " SET ref = '".$this->db->escape($this->ref)."', fk_statut = 2, fk_user_valid = ".$fuser->id.", date_valid='".$this->db->idate($now)."'"; if ($update_number_int) { $sql.= ", ref_number_int = ".$ref_number_int; } @@ -1189,8 +1189,8 @@ class ExpenseReport extends CommonObject $this->db->begin(); $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element; - $sql.= " SET ref = '".$this->ref."', fk_statut = 5, fk_user_approve = ".$fuser->id.","; - $sql.= " date_approve='".$this->date_approve."'"; + $sql.= " SET ref = '".$this->db->escape($this->ref)."', fk_statut = 5, fk_user_approve = ".$fuser->id.","; + $sql.= " date_approve='".$this->db->idate($this->date_approve)."'"; $sql.= ' WHERE rowid = '.$this->id; if ($this->db->query($sql)) { @@ -1248,7 +1248,7 @@ class ExpenseReport extends CommonObject if ($this->fk_statut != 99) { $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element; - $sql.= " SET ref = '".$this->ref."', fk_statut = 99, fk_user_refuse = ".$fuser->id.","; + $sql.= " SET ref = '".$this->db->escape($this->ref)."', fk_statut = 99, fk_user_refuse = ".$fuser->id.","; $sql.= " date_refuse='".$this->db->idate($now)."',"; $sql.= " detail_refuse='".$this->db->escape($details)."',"; $sql.= " fk_user_approve = NULL"; @@ -1373,7 +1373,7 @@ class ExpenseReport extends CommonObject $sql = 'UPDATE '.MAIN_DB_PREFIX.$this->table_element; $sql.= " SET fk_statut = 4, fk_user_cancel = ".$fuser->id; - $sql.= ", date_cancel='".$this->date_cancel."'"; + $sql.= ", date_cancel='".$this->db->idate($this->date_cancel)."'"; $sql.= " ,detail_cancel='".$this->db->escape($detail)."'"; $sql.= ' WHERE rowid = '.$this->id; @@ -2154,8 +2154,8 @@ class ExpenseReportLine // Mise a jour ligne en base $sql = "UPDATE ".MAIN_DB_PREFIX."expensereport_det SET"; $sql.= " comments='".$this->db->escape($this->comments)."'"; - $sql.= ",value_unit=".$this->value_unit.""; - $sql.= ",qty=".$this->qty.""; + $sql.= ",value_unit=".$this->value_unit; + $sql.= ",qty=".$this->qty; $sql.= ",date='".$this->db->idate($this->date)."'"; $sql.= ",total_ht=".$this->total_ht.""; $sql.= ",total_tva=".$this->total_tva.""; diff --git a/htdocs/fichinter/class/fichinter.class.php b/htdocs/fichinter/class/fichinter.class.php index d9912edfca1..6142d87de7a 100644 --- a/htdocs/fichinter/class/fichinter.class.php +++ b/htdocs/fichinter/class/fichinter.class.php @@ -212,7 +212,7 @@ class Fichinter extends CommonObject if ($this->id) { $this->ref='(PROV'.$this->id.')'; - $sql = 'UPDATE '.MAIN_DB_PREFIX."fichinter SET ref='".$this->ref."' WHERE rowid=".$this->id; + $sql = 'UPDATE '.MAIN_DB_PREFIX."fichinter SET ref='".$this->db->escape($this->ref)."' WHERE rowid=".$this->id; dol_syslog(get_class($this)."::create", LOG_DEBUG); $resql=$this->db->query($sql); @@ -1375,7 +1375,7 @@ class FichinterLigne extends CommonObjectLine $sql.= " description='".$this->db->escape($this->desc)."'"; $sql.= ",date='".$this->db->idate($this->datei)."'"; $sql.= ",duree=".$this->duration; - $sql.= ",rang='".$this->rang."'"; + $sql.= ",rang='".$this->db->escape($this->rang)."'"; $sql.= " WHERE rowid = ".$this->rowid; dol_syslog("FichinterLigne::update", LOG_DEBUG); diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index 6b9ded02160..cb47a2d99df 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -3213,12 +3213,12 @@ class CommandeFournisseurLigne extends CommonOrderLine $sql.= ", tva_tx='".price2num($this->tva_tx)."'"; $sql.= ", localtax1_tx='".price2num($this->total_localtax1)."'"; $sql.= ", localtax2_tx='".price2num($this->total_localtax2)."'"; - $sql.= ", localtax1_type='".$this->localtax1_type."'"; - $sql.= ", localtax2_type='".$this->localtax2_type."'"; + $sql.= ", localtax1_type='".$this->db->escape($this->localtax1_type)."'"; + $sql.= ", localtax2_type='".$this->db->escape($this->localtax2_type)."'"; $sql.= ", qty='".price2num($this->qty)."'"; $sql.= ", date_start=".(! empty($this->date_start)?"'".$this->db->idate($this->date_start)."'":"null"); $sql.= ", date_end=".(! empty($this->date_end)?"'".$this->db->idate($this->date_end)."'":"null"); - $sql.= ", info_bits='".$this->info_bits."'"; + $sql.= ", info_bits='".$this->db->escape($this->info_bits)."'"; $sql.= ", total_ht='".price2num($this->total_ht)."'"; $sql.= ", total_tva='".price2num($this->total_tva)."'"; $sql.= ", total_localtax1='".price2num($this->total_localtax1)."'"; @@ -3295,7 +3295,7 @@ class CommandeFournisseurLigne extends CommonOrderLine $this->db->begin(); - $sql = 'DELETE FROM '.MAIN_DB_PREFIX."commande_fournisseurdet WHERE rowid='".$this->rowid."';"; + $sql = 'DELETE FROM '.MAIN_DB_PREFIX."commande_fournisseurdet WHERE rowid=".$this->rowid; dol_syslog(__METHOD__, LOG_DEBUG); $resql=$this->db->query($sql); diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index 496c4660895..f9df07e96cc 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -300,7 +300,7 @@ class FactureFournisseur extends CommonInvoice // Update ref with new one $this->ref='(PROV'.$this->id.')'; - $sql = 'UPDATE '.MAIN_DB_PREFIX."facture_fourn SET ref='".$this->ref."' WHERE rowid=".$this->id; + $sql = 'UPDATE '.MAIN_DB_PREFIX."facture_fourn SET ref='".$this->db->escape($this->ref)."' WHERE rowid=".$this->id; dol_syslog(get_class($this)."::create", LOG_DEBUG); $resql=$this->db->query($sql); @@ -2559,8 +2559,8 @@ class SupplierInvoiceLine extends CommonObjectLine $sql.= ", tva_tx = ".price2num($this->tva_tx); $sql.= ", localtax1_tx = ".price2num($this->localtax1_tx); $sql.= ", localtax2_tx = ".price2num($this->localtax2_tx); - $sql.= ", localtax1_type = '".$this->localtax1_type."'"; - $sql.= ", localtax2_type = '".$this->localtax2_type."'"; + $sql.= ", localtax1_type = '".$this->db->escape($this->localtax1_type)."'"; + $sql.= ", localtax2_type = '".$this->db->escape($this->localtax2_type)."'"; $sql.= ", total_ht = ".price2num($this->total_ht); $sql.= ", tva= ".price2num($this->total_tva); $sql.= ", total_localtax1= ".price2num($this->total_localtax1); diff --git a/htdocs/holiday/class/holiday.class.php b/htdocs/holiday/class/holiday.class.php index e69fd312f45..5f244dcb9bf 100644 --- a/htdocs/holiday/class/holiday.class.php +++ b/htdocs/holiday/class/holiday.class.php @@ -546,12 +546,12 @@ class Holiday extends CommonObject } $sql.= " halfday = ".$this->halfday.","; if(!empty($this->statut) && is_numeric($this->statut)) { - $sql.= " statut = '".$this->statut."',"; + $sql.= " statut = ".$this->statut.","; } else { $error++; } if(!empty($this->fk_validator)) { - $sql.= " fk_validator = '".$this->fk_validator."',"; + $sql.= " fk_validator = '".$this->db->escape($this->fk_validator)."',"; } else { $error++; } @@ -561,7 +561,7 @@ class Holiday extends CommonObject $sql.= " date_valid = NULL,"; } if(!empty($this->fk_user_valid)) { - $sql.= " fk_user_valid = '".$this->fk_user_valid."',"; + $sql.= " fk_user_valid = '".$this->db->escape($this->fk_user_valid)."',"; } else { $sql.= " fk_user_valid = NULL,"; } @@ -571,7 +571,7 @@ class Holiday extends CommonObject $sql.= " date_refuse = NULL,"; } if(!empty($this->fk_user_refuse)) { - $sql.= " fk_user_refuse = '".$this->fk_user_refuse."',"; + $sql.= " fk_user_refuse = '".$this->db->escape($this->fk_user_refuse)."',"; } else { $sql.= " fk_user_refuse = NULL,"; } @@ -581,7 +581,7 @@ class Holiday extends CommonObject $sql.= " date_cancel = NULL,"; } if(!empty($this->fk_user_cancel)) { - $sql.= " fk_user_cancel = '".$this->fk_user_cancel."',"; + $sql.= " fk_user_cancel = '".$this->db->escape($this->fk_user_cancel)."',"; } else { $sql.= " fk_user_cancel = NULL,"; } @@ -591,7 +591,7 @@ class Holiday extends CommonObject $sql.= " detail_refuse = NULL"; } - $sql.= " WHERE rowid= '".$this->id."'"; + $sql.= " WHERE rowid= ".$this->id; $this->db->begin(); diff --git a/htdocs/hrm/class/establishment.class.php b/htdocs/hrm/class/establishment.class.php index 4438f3ea6ad..a171a111889 100644 --- a/htdocs/hrm/class/establishment.class.php +++ b/htdocs/hrm/class/establishment.class.php @@ -153,12 +153,12 @@ class Establishment extends CommonObject $this->db->begin(); $sql = "UPDATE ".MAIN_DB_PREFIX."establishment"; - $sql .= " SET name = '".$this->name."'"; - $sql .= ", address = '".$this->address."'"; - $sql .= ", zip = '".$this->zip."'"; - $sql .= ", town = '".$this->town."'"; + $sql .= " SET name = '".$this->db->escape($this->name)."'"; + $sql .= ", address = '".$this->db->escape($this->address)."'"; + $sql .= ", zip = '".$this->db->escape($this->zip)."'"; + $sql .= ", town = '".$this->db->escape($this->town)."'"; $sql .= ", fk_country = ".($this->country_id > 0 ? $this->country_id : 'null'); - $sql .= ", status = '".$this->status."'"; + $sql .= ", status = '".$this->db->escape($this->status)."'"; $sql .= ", fk_user_mod = " . $user->id; $sql .= " WHERE rowid = ".$this->id; diff --git a/htdocs/livraison/class/livraison.class.php b/htdocs/livraison/class/livraison.class.php index 3a18abf2cbb..383b2276d6c 100644 --- a/htdocs/livraison/class/livraison.class.php +++ b/htdocs/livraison/class/livraison.class.php @@ -263,7 +263,7 @@ class Livraison extends CommonObject $sql.= ', l.fk_incoterms, l.location_incoterms'; $sql.= ", i.libelle as libelle_incoterms"; $sql.= " FROM ".MAIN_DB_PREFIX."livraison as l"; - $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."element_element as el ON el.fk_target = l.rowid AND el.targettype = '".$this->element."'"; + $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."element_element as el ON el.fk_target = l.rowid AND el.targettype = '".$this->db->escape($this->element)."'"; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'c_incoterms as i ON l.fk_incoterms = i.rowid'; $sql.= " WHERE l.rowid = ".$id; diff --git a/htdocs/loan/class/loan.class.php b/htdocs/loan/class/loan.class.php index d9d4da6fb20..734c2356b3a 100644 --- a/htdocs/loan/class/loan.class.php +++ b/htdocs/loan/class/loan.class.php @@ -236,7 +236,7 @@ class Loan extends CommonObject // Delete payments if (! $error) { - $sql = "DELETE FROM ".MAIN_DB_PREFIX."payment_loan where fk_loan='".$this->id."'"; + $sql = "DELETE FROM ".MAIN_DB_PREFIX."payment_loan where fk_loan=".$this->id; dol_syslog(get_class($this)."::delete", LOG_DEBUG); $resql=$this->db->query($sql); if (! $resql) @@ -248,7 +248,7 @@ class Loan extends CommonObject if (! $error) { - $sql = "DELETE FROM ".MAIN_DB_PREFIX."loan where rowid='".$this->id."'"; + $sql = "DELETE FROM ".MAIN_DB_PREFIX."loan where rowid=".$this->id; dol_syslog(get_class($this)."::delete", LOG_DEBUG); $resql=$this->db->query($sql); if (! $resql) diff --git a/htdocs/product/canvas/product/actions_card_product.class.php b/htdocs/product/canvas/product/actions_card_product.class.php index 8db1ae21469..a60694ca7cb 100644 --- a/htdocs/product/canvas/product/actions_card_product.class.php +++ b/htdocs/product/canvas/product/actions_card_product.class.php @@ -269,7 +269,7 @@ class ActionsCardProduct $sql = "SELECT rowid, name, alias, title, align, sort, search, enabled, rang"; $sql.= " FROM ".MAIN_DB_PREFIX."c_field_list"; - $sql.= " WHERE element = '".$this->fieldListName."'"; + $sql.= " WHERE element = '".$this->db->escape($this->fieldListName)."'"; $sql.= " AND entity = ".$conf->entity; $sql.= " ORDER BY rang ASC"; diff --git a/htdocs/product/canvas/service/actions_card_service.class.php b/htdocs/product/canvas/service/actions_card_service.class.php index af6fbccc320..970ac535273 100644 --- a/htdocs/product/canvas/service/actions_card_service.class.php +++ b/htdocs/product/canvas/service/actions_card_service.class.php @@ -248,7 +248,7 @@ class ActionsCardService $sql = "SELECT rowid, name, alias, title, align, sort, search, enabled, rang"; $sql.= " FROM ".MAIN_DB_PREFIX."c_field_list"; - $sql.= " WHERE element = '".$this->fieldListName."'"; + $sql.= " WHERE element = '".$this->db->escape($this->fieldListName)."'"; $sql.= " AND entity = ".$conf->entity; $sql.= " ORDER BY rang ASC"; diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 4e6c3f49738..4a8c1e9f8fb 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -494,7 +494,7 @@ class Product extends CommonObject $sql = "SELECT count(*) as nb"; $sql.= " FROM ".MAIN_DB_PREFIX."product"; $sql.= " WHERE entity IN (".getEntity('product', 1).")"; - $sql.= " AND ref = '" .$this->ref."'"; + $sql.= " AND ref = '" .$this->db->escape($this->ref)."'"; $result = $this->db->query($sql); if ($result) @@ -1212,14 +1212,14 @@ class Product extends CommonObject $sql2.= " label='".$this->db->escape($this->label)."',"; $sql2.= " description='".$this->db->escape($this->description)."'"; if (! empty($conf->global->PRODUCT_USE_OTHER_FIELD_IN_TRANSLATION)) $sql2.= ", note='".$this->db->escape($this->note)."'"; - $sql2.= " WHERE fk_product=".$this->id." AND lang='".$key."'"; + $sql2.= " WHERE fk_product=".$this->id." AND lang='".$this->db->escape($key)."'"; } else { $sql2 = "INSERT INTO ".MAIN_DB_PREFIX."product_lang (fk_product, lang, label, description"; if (! empty($conf->global->PRODUCT_USE_OTHER_FIELD_IN_TRANSLATION)) $sql2.=", note"; $sql2.= ")"; - $sql2.= " VALUES(".$this->id.",'".$key."','". $this->db->escape($this->label)."',"; + $sql2.= " VALUES(".$this->id.",'".$this->db->escape($key)."','". $this->db->escape($this->label)."',"; $sql2.= " '".$this->db->escape($this->description)."'"; if (! empty($conf->global->PRODUCT_USE_OTHER_FIELD_IN_TRANSLATION)) $sql2.= ", '".$this->db->escape($this->note)."'"; $sql2.= ")"; @@ -1247,14 +1247,14 @@ class Product extends CommonObject $sql2.= " label='".$this->db->escape($this->multilangs["$key"]["label"])."',"; $sql2.= " description='".$this->db->escape($this->multilangs["$key"]["description"])."'"; if (! empty($conf->global->PRODUCT_USE_OTHER_FIELD_IN_TRANSLATION)) $sql2.= ", note='".$this->db->escape($this->multilangs["$key"]["note"])."'"; - $sql2.= " WHERE fk_product=".$this->id." AND lang='".$key."'"; + $sql2.= " WHERE fk_product=".$this->id." AND lang='".$this->db->escape($key)."'"; } else { $sql2 = "INSERT INTO ".MAIN_DB_PREFIX."product_lang (fk_product, lang, label, description"; if (! empty($conf->global->PRODUCT_USE_OTHER_FIELD_IN_TRANSLATION)) $sql2.=", note"; $sql2.= ")"; - $sql2.= " VALUES(".$this->id.",'".$key."','". $this->db->escape($this->multilangs["$key"]["label"])."',"; + $sql2.= " VALUES(".$this->id.",'".$this->db->escape($key)."','". $this->db->escape($this->multilangs["$key"]["label"])."',"; $sql2.= " '".$this->db->escape($this->multilangs["$key"]["description"])."'"; if (! empty($conf->global->PRODUCT_USE_OTHER_FIELD_IN_TRANSLATION)) $sql2.= ", '".$this->db->escape($this->note)."'"; $sql2.= ")"; @@ -1944,7 +1944,7 @@ class Product extends CommonObject $sql.= " FROM ".MAIN_DB_PREFIX."product_price"; $sql.= " WHERE entity IN (".getEntity('productprice', 1).")"; $sql.= " AND price_level=".$i; - $sql.= " AND fk_product = '".$this->id."'"; + $sql.= " AND fk_product = ".$this->id; $sql.= " ORDER BY date_price DESC, rowid DESC"; $sql.= " LIMIT 1"; $resql = $this->db->query($sql); @@ -1969,7 +1969,7 @@ class Product extends CommonObject { $sql = "SELECT rowid, price, unitprice, quantity, remise_percent, remise"; $sql.= " FROM ".MAIN_DB_PREFIX."product_price_by_qty"; - $sql.= " WHERE fk_product_price = '".$this->prices_by_qty_id[$i]."'"; + $sql.= " WHERE fk_product_price = ".$this->prices_by_qty_id[$i]; $sql.= " ORDER BY quantity ASC"; $resultat=array(); $resql = $this->db->query($sql); @@ -2006,7 +2006,7 @@ class Product extends CommonObject $sql = "SELECT price, price_ttc, price_min, price_min_ttc,"; $sql.= " price_base_type, tva_tx, default_vat_code, tosell, price_by_qty, rowid"; $sql.= " FROM ".MAIN_DB_PREFIX."product_price"; - $sql.= " WHERE fk_product = '".$this->id."'"; + $sql.= " WHERE fk_product = ".$this->id; $sql.= " ORDER BY date_price DESC, rowid DESC"; $sql.= " LIMIT 1"; $resql = $this->db->query($sql); @@ -2022,7 +2022,7 @@ class Product extends CommonObject { $sql = "SELECT rowid,price, unitprice, quantity, remise_percent, remise"; $sql.= " FROM ".MAIN_DB_PREFIX."product_price_by_qty"; - $sql.= " WHERE fk_product_price = '".$this->prices_by_qty_id[0]."'"; + $sql.= " WHERE fk_product_price = ".$this->prices_by_qty_id[0]; $sql.= " ORDER BY quantity ASC"; $resultat=array(); $resql = $this->db->query($sql); diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 309107ed233..5efaae1fd78 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -1113,7 +1113,7 @@ class Project extends CommonObject // Get id of types of contacts for projects (This list never contains a lot of elements) $listofprojectcontacttype=array(); $sql2 = "SELECT ctc.rowid, ctc.code FROM ".MAIN_DB_PREFIX."c_type_contact as ctc"; - $sql2.= " WHERE ctc.element = '" . $this->element . "'"; + $sql2.= " WHERE ctc.element = '" . $this->db->escape($this->element) . "'"; $sql2.= " AND ctc.source = 'internal'"; $resql = $this->db->query($sql2); if ($resql) diff --git a/htdocs/projet/class/projectstats.class.php b/htdocs/projet/class/projectstats.class.php index 88eb8ef5ced..4485117fb0f 100644 --- a/htdocs/projet/class/projectstats.class.php +++ b/htdocs/projet/class/projectstats.class.php @@ -143,7 +143,7 @@ class ProjectStats extends Stats if (! empty($this->socid)) $sqlwhere[] = ' t.fk_soc=' . $this->socid; if (! empty($this->year) && empty($this->yearmonth)) - $sqlwhere[] = " date_format(t.datec,'%Y')='" . $this->year . "'"; + $sqlwhere[] = " date_format(t.datec,'%Y')='" . $this->db->escape($this->year) . "'"; if (! empty($this->yearmonth)) $sqlwhere[] = " t.datec BETWEEN '" . $this->db->idate(dol_get_first_day($this->yearmonth)) . "' AND '" . $this->db->idate(dol_get_last_day($this->yearmonth)) . "'"; diff --git a/htdocs/societe/class/companybankaccount.class.php b/htdocs/societe/class/companybankaccount.class.php index 652cd8d5d7e..65c3ca37e0a 100644 --- a/htdocs/societe/class/companybankaccount.class.php +++ b/htdocs/societe/class/companybankaccount.class.php @@ -144,12 +144,12 @@ class CompanyBankAccount extends Account $sql = "UPDATE ".MAIN_DB_PREFIX."societe_rib SET"; $sql.= " bank = '" .$this->db->escape($this->bank)."'"; - $sql.= ",code_banque='".$this->code_banque."'"; - $sql.= ",code_guichet='".$this->code_guichet."'"; - $sql.= ",number='".$this->number."'"; - $sql.= ",cle_rib='".$this->cle_rib."'"; - $sql.= ",bic='".$this->bic."'"; - $sql.= ",iban_prefix = '".$this->iban."'"; + $sql.= ",code_banque='".$this->db->escape($this->code_banque)."'"; + $sql.= ",code_guichet='".$this->db->escape($this->code_guichet)."'"; + $sql.= ",number='".$this->db->escape($this->number)."'"; + $sql.= ",cle_rib='".$this->db->escape($this->cle_rib)."'"; + $sql.= ",bic='".$this->db->escape($this->bic)."'"; + $sql.= ",iban_prefix = '".$this->db->escape($this->iban)."'"; $sql.= ",domiciliation='".$this->db->escape($this->domiciliation)."'"; $sql.= ",proprio = '".$this->db->escape($this->proprio)."'"; $sql.= ",owner_address = '".$this->db->escape($this->owner_address)."'"; diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 6d3464ccc20..fb486629731 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -841,7 +841,7 @@ class Societe extends CommonObject $sql .= ",fk_effectif = ".(! empty($this->effectif_id)?"'".$this->db->escape($this->effectif_id)."'":"null"); if (isset($this->stcomm_id)) { - $sql .= ",fk_stcomm='".$this->stcomm_id."'"; + $sql .= ",fk_stcomm=".($this->stcomm_id > 0 ? $this->stcomm_id : "null"); } $sql .= ",fk_typent = ".(! empty($this->typent_id)?"'".$this->db->escape($this->typent_id)."'":"0"); @@ -859,7 +859,7 @@ class Societe extends CommonObject $sql .= ",default_lang = ".(! empty($this->default_lang)?"'".$this->db->escape($this->default_lang)."'":"null"); $sql .= ",logo = ".(! empty($this->logo)?"'".$this->db->escape($this->logo)."'":"null"); $sql .= ",outstanding_limit= ".($this->outstanding_limit!=''?$this->outstanding_limit:'null'); - $sql .= ",fk_prospectlevel='".$this->fk_prospectlevel."'"; + $sql .= ",fk_prospectlevel='".$this->db->escape($this->fk_prospectlevel)."'"; $sql .= ",webservices_url = ".(! empty($this->webservices_url)?"'".$this->db->escape($this->webservices_url)."'":"null"); $sql .= ",webservices_key = ".(! empty($this->webservices_key)?"'".$this->db->escape($this->webservices_key)."'":"null"); @@ -2080,7 +2080,7 @@ class Societe extends CommonObject $sql = "SELECT rowid, email, statut, phone_mobile, lastname, poste, firstname"; $sql.= " FROM ".MAIN_DB_PREFIX."socpeople"; - $sql.= " WHERE fk_soc = '".$this->id."'"; + $sql.= " WHERE fk_soc = ".$this->id; $resql=$this->db->query($sql); if ($resql) @@ -2140,7 +2140,7 @@ class Societe extends CommonObject { $contacts = array(); - $sql = "SELECT rowid, lastname, firstname FROM ".MAIN_DB_PREFIX."socpeople WHERE fk_soc = '".$this->id."'"; + $sql = "SELECT rowid, lastname, firstname FROM ".MAIN_DB_PREFIX."socpeople WHERE fk_soc = ".$this->id; $resql=$this->db->query($sql); if ($resql) { @@ -2173,7 +2173,7 @@ class Societe extends CommonObject require_once DOL_DOCUMENT_ROOT . '/contact/class/contact.class.php'; $contacts = array(); - $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."socpeople WHERE fk_soc = '".$this->id."'"; + $sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."socpeople WHERE fk_soc = ".$this->id; $resql=$this->db->query($sql); if ($resql) { @@ -3157,7 +3157,7 @@ class Societe extends CommonObject { $sql = "SELECT t.localtax1, t.localtax2"; $sql .= " FROM ".MAIN_DB_PREFIX."c_tva as t, ".MAIN_DB_PREFIX."c_country as c"; - $sql .= " WHERE t.fk_pays = c.rowid AND c.code = '".$this->country_code."'"; + $sql .= " WHERE t.fk_pays = c.rowid AND c.code = '".$this->db->escape($this->country_code)."'"; $sql .= " AND t.active = 1"; if (empty($localTaxNum)) $sql .= " AND (t.localtax1_type <> '0' OR t.localtax2_type <> '0')"; elseif ($localTaxNum == 1) $sql .= " AND t.localtax1_type <> '0'"; @@ -3181,7 +3181,7 @@ class Societe extends CommonObject { $sql = "SELECT t.rowid"; $sql .= " FROM ".MAIN_DB_PREFIX."c_tva as t, ".MAIN_DB_PREFIX."c_country as c"; - $sql .= " WHERE t.fk_pays = c.rowid AND c.code = '".$this->country_code."'"; + $sql .= " WHERE t.fk_pays = c.rowid AND c.code = '".$this->db->escape($this->country_code)."'"; $sql .= " AND t.active = 1 AND t.recuperableonly = 1"; dol_syslog("useNPR", LOG_DEBUG); @@ -3202,7 +3202,7 @@ class Societe extends CommonObject { $sql = "SELECT COUNT(*) as nb"; $sql .= " FROM ".MAIN_DB_PREFIX."c_revenuestamp as r, ".MAIN_DB_PREFIX."c_country as c"; - $sql .= " WHERE r.fk_pays = c.rowid AND c.code = '".$this->country_code."'"; + $sql .= " WHERE r.fk_pays = c.rowid AND c.code = '".$this->db->escape($this->country_code)."'"; $sql .= " AND r.active = 1"; dol_syslog("useRevenueStamp", LOG_DEBUG); diff --git a/htdocs/supplier_proposal/class/supplier_proposal.class.php b/htdocs/supplier_proposal/class/supplier_proposal.class.php index 00ca20bcd5a..7019933fb9c 100644 --- a/htdocs/supplier_proposal/class/supplier_proposal.class.php +++ b/htdocs/supplier_proposal/class/supplier_proposal.class.php @@ -839,7 +839,7 @@ class SupplierProposal extends CommonObject if ($this->id) { $this->ref='(PROV'.$this->id.')'; - $sql = 'UPDATE '.MAIN_DB_PREFIX."supplier_proposal SET ref='".$this->ref."' WHERE rowid=".$this->id; + $sql = 'UPDATE '.MAIN_DB_PREFIX."supplier_proposal SET ref='".$this->db->escape($this->ref)."' WHERE rowid=".$this->id; dol_syslog(get_class($this)."::create", LOG_DEBUG); $resql=$this->db->query($sql); @@ -3002,14 +3002,14 @@ class SupplierProposalLine extends CommonObjectLine $sql.= " , tva_tx='".price2num($this->tva_tx)."'"; $sql.= " , localtax1_tx=".price2num($this->localtax1_tx); $sql.= " , localtax2_tx=".price2num($this->localtax2_tx); - $sql.= " , localtax1_type='".$this->localtax1_type."'"; - $sql.= " , localtax2_type='".$this->localtax2_type."'"; + $sql.= " , localtax1_type='".$this->db->escape($this->localtax1_type)."'"; + $sql.= " , localtax2_type='".$this->db->escape($this->localtax2_type)."'"; $sql.= " , qty='".price2num($this->qty)."'"; $sql.= " , subprice=".price2num($this->subprice).""; $sql.= " , remise_percent=".price2num($this->remise_percent).""; $sql.= " , price=".price2num($this->price).""; // TODO A virer $sql.= " , remise=".price2num($this->remise).""; // TODO A virer - $sql.= " , info_bits='".$this->info_bits."'"; + $sql.= " , info_bits='".$this->db->escape($this->info_bits)."'"; if (empty($this->skip_update_total)) { $sql.= " , total_ht=".price2num($this->total_ht).""; diff --git a/htdocs/user/class/userbankaccount.class.php b/htdocs/user/class/userbankaccount.class.php index a7aba35fc64..00d350c3b0f 100644 --- a/htdocs/user/class/userbankaccount.class.php +++ b/htdocs/user/class/userbankaccount.class.php @@ -100,12 +100,12 @@ class UserBankAccount extends Account $sql = "UPDATE ".MAIN_DB_PREFIX."user_rib SET"; $sql.= " bank = '" .$this->db->escape($this->bank)."'"; - $sql.= ",code_banque='".$this->code_banque."'"; - $sql.= ",code_guichet='".$this->code_guichet."'"; - $sql.= ",number='".$this->number."'"; - $sql.= ",cle_rib='".$this->cle_rib."'"; - $sql.= ",bic='".$this->bic."'"; - $sql.= ",iban_prefix = '".$this->iban."'"; + $sql.= ",code_banque='".$this->db->escape($this->code_banque)."'"; + $sql.= ",code_guichet='".$this->db->escape($this->code_guichet)."'"; + $sql.= ",number='".$this->db->escape($this->number)."'"; + $sql.= ",cle_rib='".$this->db->escape($this->cle_rib)."'"; + $sql.= ",bic='".$this->db->escape($this->bic)."'"; + $sql.= ",iban_prefix = '".$this->db->escape($this->iban)."'"; $sql.= ",domiciliation='".$this->db->escape($this->domiciliation)."'"; $sql.= ",proprio = '".$this->db->escape($this->proprio)."'"; $sql.= ",owner_address = '".$this->db->escape($this->owner_address)."'"; diff --git a/test/phpunit/AllTests.php b/test/phpunit/AllTests.php index 99f9faf260d..812ec85117c 100644 --- a/test/phpunit/AllTests.php +++ b/test/phpunit/AllTests.php @@ -100,11 +100,14 @@ class AllTests require_once dirname(__FILE__).'/XCalLibTest.php'; $suite->addTestSuite('XCalLibTest'); + // Rules into source files content require_once dirname(__FILE__).'/LangTest.php'; $suite->addTestSuite('LangTest'); - require_once dirname(__FILE__).'/SqlTest.php'; - $suite->addTestSuite('SqlTest'); - + require_once dirname(__FILE__).'/CodingSqlTest.php'; + $suite->addTestSuite('CodingSqlTest'); + require_once dirname(__FILE__).'/CodingPhpTest.php'; + $suite->addTestSuite('PhpTest'); + require_once dirname(__FILE__).'/SecurityTest.php'; $suite->addTestSuite('SecurityTest'); diff --git a/test/phpunit/CodingPHPTest.php b/test/phpunit/CodingPhpTest.php similarity index 94% rename from test/phpunit/CodingPHPTest.php rename to test/phpunit/CodingPhpTest.php index b8d7bc90816..4860e5b5e38 100644 --- a/test/phpunit/CodingPHPTest.php +++ b/test/phpunit/CodingPhpTest.php @@ -148,18 +148,19 @@ class CodingPhpTest extends PHPUnit_Framework_TestCase { if (preg_match('/\/htdocs\/includes\//', $file['fullname'])) continue; if (preg_match('/\/htdocs\/custom\//', $file['fullname'])) continue; - if (preg_match('/\/htdocs\/nltechno/', $file['fullname'])) continue; if (preg_match('/\/htdocs\/dolimed/', $file['fullname'])) continue; + if (preg_match('/\/htdocs\/nltechno/', $file['fullname'])) continue; + if (preg_match('/\/htdocs\/teclib/', $file['fullname'])) continue; print 'Check php file '.$file['fullname']."\n"; $filecontent=file_get_contents($file['fullname']); $ok=true; $matches=array(); - preg_match_all('/=\'".\$this->(..)/', $filecontent, $matches, PREG_SET_ORDER); + preg_match_all('/=\s*\'"\s*\.\s*\$this->(....)/', $filecontent, $matches, PREG_SET_ORDER); foreach($matches as $key => $val) { - if ($val[1] != 'db') + if ($val[1] != 'db->' && $val[1] != 'esca') { $ok=false; break; @@ -167,7 +168,7 @@ class CodingPhpTest extends PHPUnit_Framework_TestCase //if ($reg[0] != 'db') $ok=false; } //print __METHOD__." Result for checking we don't have non escaped string in sql requests for file ".$file."\n"; - $this->assertTrue($ok, 'Found non escaped string in building of a sql request '.$file['fullname'].'. Bad.'); + $this->assertTrue($ok, 'Found non escaped string in building of a sql request '.$file['fullname'].' ('.$val[0].'). Bad.'); //exit; } diff --git a/test/phpunit/SqlTest.php b/test/phpunit/CodingSqlTest.php similarity index 100% rename from test/phpunit/SqlTest.php rename to test/phpunit/CodingSqlTest.php From 1a016524e0ee866877666b1a0af2a5b769a72d48 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 12 May 2017 17:44:51 +0200 Subject: [PATCH 101/299] Fix log --- scripts/cron/cron_run_jobs.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/scripts/cron/cron_run_jobs.php b/scripts/cron/cron_run_jobs.php index d60218fba22..fb03cad5757 100755 --- a/scripts/cron/cron_run_jobs.php +++ b/scripts/cron/cron_run_jobs.php @@ -90,7 +90,7 @@ if ($userlogin == 'firstadmin') if ($obj) { $userlogin = $obj->login; - echo "First admin user found is login '".$userlogin."'\n
"; + echo "First admin user found is login '".$userlogin."'\n"; } } else dol_print_error($db); @@ -146,7 +146,8 @@ if(is_array($object->lines) && (count($object->lines)>0)) // Loop over job foreach($object->lines as $line) { - dol_syslog("cron_run_jobs.php cronjobid: ".$line->id, LOG_WARNING); + dol_syslog("cron_run_jobs.php cronjobid: ".$line->id, LOG_DEBUG); + echo "cron_run_jobs.php cronjobid: ".$line->id."\n"; //If date_next_jobs is less of current date, execute the program, and store the execution time of the next execution in database if (($line->datenextrun < $now) && (empty($line->datestart) || $line->datestart <= $now) && (empty($line->dateend) || $line->dateend >= $now)) From 8fc285c8b35806f5da7e0bdefa2d1eaeb198f924 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 12 May 2017 18:32:13 +0200 Subject: [PATCH 102/299] Fix bad date usage --- htdocs/cron/list.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/cron/list.php b/htdocs/cron/list.php index 880235a9a17..5056f4711d3 100644 --- a/htdocs/cron/list.php +++ b/htdocs/cron/list.php @@ -404,11 +404,11 @@ if ($num > 0) print ''; print ''; - if(!empty($obj->datestart)) {print dol_print_date($obj->datestart,'dayhour');} + if(!empty($obj->datestart)) {print dol_print_date($db->jdate($obj->datestart),'dayhour');} print ''; print ''; - if(!empty($obj->dateend)) {print dol_print_date($obj->dateend,'dayhour');} + if(!empty($obj->dateend)) {print dol_print_date($db->jdate($obj->dateend),'dayhour');} print ''; print ''; @@ -420,11 +420,11 @@ if ($num > 0) print ''; print ''; - if(!empty($obj->datenextrun)) {print dol_print_date($obj->datenextrun,'dayhour');} + if(!empty($obj->datenextrun)) {print dol_print_date($db->jdate($obj->datenextrun),'dayhour');} print ''; print ''; - if(!empty($obj->datelastrun)) {print dol_print_date($obj->datelastrun,'dayhour');} + if(!empty($obj->datelastrun)) {print dol_print_date($db->jdate($obj->datelastrun),'dayhour');} print ''; print ''; From f6dcb2860ab2aa500805b54cd6dc3c1af9dc3b05 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 12 May 2017 19:14:54 +0200 Subject: [PATCH 103/299] More complete help message --- htdocs/cron/list.php | 6 ++++-- htdocs/langs/en_US/admin.lang | 3 ++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/htdocs/cron/list.php b/htdocs/cron/list.php index 630430e8d59..82d5fb04130 100644 --- a/htdocs/cron/list.php +++ b/htdocs/cron/list.php @@ -289,8 +289,10 @@ print_barre_liste($pagetitle, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $ print $langs->trans('CronInfo').'
'; -print $stringcurrentdate.'
'; -if (! empty($conf->global->CRON_WARNING_DELAY_HOURS)) print info_admin($langs->trans("WarningCronDelayed", $conf->global->CRON_WARNING_DELAY_HOURS)); + +$text =$langs->trans("HoursOnThisPageAreOnServerTZ").' '.$stringcurrentdate.'
'; +if (! empty($conf->global->CRON_WARNING_DELAY_HOURS)) $text.=$langs->trans("WarningCronDelayed", $conf->global->CRON_WARNING_DELAY_HOURS); +print info_admin($text); print '
'; diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 71e5b614abb..3662e8aca1c 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -123,7 +123,8 @@ PHPTZ=PHP server Time Zone DaylingSavingTime=Daylight saving time CurrentHour=PHP Time (server) CurrentSessionTimeOut=Current session timeout -YouCanEditPHPTZ=To set a different PHP timezone (not required), you can try to add a file .htacces with a line like this "SetEnv TZ Europe/Paris" +YouCanEditPHPTZ=To set a different PHP timezone (not required), you can try to add a file .htaccess with a line like this "SetEnv TZ Europe/Paris" +HoursOnThisPageAreOnServerTZ=Warning, in contrary of other screens, hours on this page are not in your local timezone, but for the timezone of the server. Box=Widget Boxes=Widgets MaxNbOfLinesForBoxes=Max number of lines for widgets From f8403d502050150ad0ba811d07dbd4a544c3f076 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 12 May 2017 20:01:45 +0200 Subject: [PATCH 104/299] Fix phpunit test --- htdocs/langs/en_US/cron.lang | 4 ++-- test/phpunit/AllTests.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/langs/en_US/cron.lang b/htdocs/langs/en_US/cron.lang index 76b1a92a365..a1d3c6a9986 100644 --- a/htdocs/langs/en_US/cron.lang +++ b/htdocs/langs/en_US/cron.lang @@ -25,7 +25,7 @@ CronDelete=Delete scheduled jobs CronConfirmDelete=Are you sure you want to delete these scheduled jobs? CronExecute=Launch scheduled job CronConfirmExecute=Are you sure you want to execute these scheduled jobs now? -CronInfo=Scheduled job module allow to execute job that have been planned +CronInfo=Scheduled job module allows to schedule jobs to execute them automatically. Jobs can also be started manually. CronTask=Job CronNone=None CronDtStart=Not before @@ -76,4 +76,4 @@ UseMenuModuleToolsToAddCronJobs=Go into menu "Home - Admin tools - Scheduled job JobDisabled=Job disabled MakeLocalDatabaseDumpShort=Local database backup MakeLocalDatabaseDump=Create a local database dump -WarningCronDelayed=Attention, for performance purpose, whatever is next date of execution of active jobs, your jobs may be delayed to a maximum of %s hours, before being run. +WarningCronDelayed=Attention, for performance purpose, whatever is next date of execution of enabled jobs, your jobs may be delayed to a maximum of %s hours, before being run. diff --git a/test/phpunit/AllTests.php b/test/phpunit/AllTests.php index 812ec85117c..de8cc397cf4 100644 --- a/test/phpunit/AllTests.php +++ b/test/phpunit/AllTests.php @@ -106,7 +106,7 @@ class AllTests require_once dirname(__FILE__).'/CodingSqlTest.php'; $suite->addTestSuite('CodingSqlTest'); require_once dirname(__FILE__).'/CodingPhpTest.php'; - $suite->addTestSuite('PhpTest'); + $suite->addTestSuite('CodingPhpTest'); require_once dirname(__FILE__).'/SecurityTest.php'; $suite->addTestSuite('SecurityTest'); From f7e042d7b82a67eabbd973c003fbba6e6f11f838 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 13 May 2017 13:02:55 +0200 Subject: [PATCH 105/299] Look and feel v6 --- htdocs/adherents/admin/adherent.php | 141 +++++++++--------- .../adherents/admin/adherent_extrafields.php | 2 +- .../admin/adherent_type_extrafields.php | 2 +- htdocs/adherents/admin/public.php | 7 +- htdocs/core/lib/admin.lib.php | 8 +- 5 files changed, 81 insertions(+), 79 deletions(-) diff --git a/htdocs/adherents/admin/adherent.php b/htdocs/adherents/admin/adherent.php index 2754c2d3690..8050a0ec019 100644 --- a/htdocs/adherents/admin/adherent.php +++ b/htdocs/adherents/admin/adherent.php @@ -48,6 +48,37 @@ $action = GETPOST('action','alpha'); * Actions */ +// +if ($action == 'updateall') +{ + $db->begin(); + $res1=$res2=$res3=$res4=$res5=$res6=0; + $res1=dolibarr_set_const($db, 'ADHERENT_LOGIN_NOT_REQUIRED', GETPOST('ADHERENT_LOGIN_NOT_REQUIRED', 'alpha'), 'chaine', 0, '', $conf->entity); + $res2=dolibarr_set_const($db, 'ADHERENT_MAIL_REQUIRED', GETPOST('ADHERENT_MAIL_REQUIRED', 'alpha'), 'chaine', 0, '', $conf->entity); + $res3=dolibarr_set_const($db, 'ADHERENT_DEFAULT_SENDINFOBYMAIL', GETPOST('ADHERENT_DEFAULT_SENDINFOBYMAIL', 'alpha'), 'chaine', 0, '', $conf->entity); + $res4=dolibarr_set_const($db, 'ADHERENT_BANK_USE', GETPOST('ADHERENT_BANK_USE', 'alpha'), 'chaine', 0, '', $conf->entity); + // Use vat for invoice creation + if ($conf->facture->enabled) + { + $res4=dolibarr_set_const($db, 'ADHERENT_VAT_FOR_SUBSCRIPTIONS', GETPOST('ADHERENT_VAT_FOR_SUBSCRIPTIONS', 'alpha'), 'chaine', 0, '', $conf->entity); + $res5=dolibarr_set_const($db, 'ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS', GETPOST('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS', 'alpha'), 'chaine', 0, '', $conf->entity); + if (! empty($conf->product->enabled) || ! empty($conf->service->enabled)) + { + $res6=dolibarr_set_const($db, 'ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS', GETPOST('ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS', 'alpha'), 'chaine', 0, '', $conf->entity); + } + } + if ($res1 < 0 || $res2 < 0 || $res3 < 0 || $res4 < 0 || $res5 < 0 || $res6 < 0) + { + setEventMessages('ErrorFailedToSaveDate', null, 'errors'); + $db->rollback(); + } + else + { + setEventMessages('RecordModifiedSuccessfully', null, 'mesgs'); + $db->commit(); + } +} + // Action mise a jour ou ajout d'une constante if ($action == 'update' || $action == 'add') { @@ -116,113 +147,81 @@ print load_fiche_titre($langs->trans("MembersSetup"),$linkback,'title_setup'); $head = member_admin_prepare_head(); -dol_fiche_head($head, 'general', $langs->trans("Members"), 0, 'user'); +dol_fiche_head($head, 'general', $langs->trans("Members"), -1, 'user'); + +print ''; +print ''; +print ''; print load_fiche_titre($langs->trans("MemberMainOptions"),'',''); print ''; print ''; print ''; print ''; -print ''; print "\n"; // Login/Pass required for members -print ''; -print ''; -print ''; -print ''; print '\n"; -print ''; // Mail required for members -print ''; -print ''; -print ''; -print ''; print '\n"; -print ''; // Send mail information is on by default -print ''; -print ''; -print ''; -print ''; print '\n"; -print ''; // Insert subscription into bank account -print ''; -print ''; -print ''; -print ''; print ''; $arraychoices=array('0'=>$langs->trans("None")); if (! empty($conf->banque->enabled)) $arraychoices['bankdirect']=$langs->trans("MoreActionBankDirect"); if (! empty($conf->banque->enabled) && ! empty($conf->societe->enabled) && ! empty($conf->facture->enabled)) $arraychoices['invoiceonly']=$langs->trans("MoreActionInvoiceOnly"); if (! empty($conf->banque->enabled) && ! empty($conf->societe->enabled) && ! empty($conf->facture->enabled)) $arraychoices['bankviainvoice']=$langs->trans("MoreActionBankViaInvoice"); print ''; print "\n"; -print ''; // Use vat for invoice creation if ($conf->facture->enabled) { - print ''; - print ''; - print ''; - print ''; print ''; if (! empty($conf->banque->enabled)) { print ''; } else { - print ''; } print "\n"; - print ''; - + if (! empty($conf->product->enabled) || ! empty($conf->service->enabled)) { - print ''; - print ''; - print ''; - print ''; print ''; print ''; } print "\n"; - print ''; } print '
'.$langs->trans("Description").''.$langs->trans("Value").''.$langs->trans("Action").'
'.$langs->trans("AdherentLoginRequired").''; -print $form->selectyesno('constvalue',(! empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)?0:1),1); -print ''; -print ''; +print $form->selectyesno('ADHERENT_LOGIN_NOT_REQUIRED',(! empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)?0:1),1); print "
'.$langs->trans("AdherentMailRequired").''; -print $form->selectyesno('constvalue',(! empty($conf->global->ADHERENT_MAIL_REQUIRED)?$conf->global->ADHERENT_MAIL_REQUIRED:0),1); -print ''; -print ''; +print $form->selectyesno('ADHERENT_MAIL_REQUIRED',(! empty($conf->global->ADHERENT_MAIL_REQUIRED)?$conf->global->ADHERENT_MAIL_REQUIRED:0),1); print "
'.$langs->trans("MemberSendInformationByMailByDefault").''; -print $form->selectyesno('constvalue',(! empty($conf->global->ADHERENT_DEFAULT_SENDINFOBYMAIL)?$conf->global->ADHERENT_DEFAULT_SENDINFOBYMAIL:0),1); -print ''; -print ''; +print $form->selectyesno('ADHERENT_DEFAULT_SENDINFOBYMAIL',(! empty($conf->global->ADHERENT_DEFAULT_SENDINFOBYMAIL)?$conf->global->ADHERENT_DEFAULT_SENDINFOBYMAIL:0),1); print "
'.$langs->trans("MoreActionsOnSubscription").''; -print $form->selectarray('constvalue',$arraychoices,$conf->global->ADHERENT_BANK_USE,0); -print ''; -print ''; +print $form->selectarray('ADHERENT_BANK_USE',$arraychoices,$conf->global->ADHERENT_BANK_USE,0); print '
'.$langs->trans("VATToUseForSubscriptions").''; - print $form->selectarray('constvalue', array('0'=>$langs->trans("NoVatOnSubscription"),'defaultforfoundationcountry'=>$langs->trans("Default")), (empty($conf->global->ADHERENT_VAT_FOR_SUBSCRIPTIONS)?'0':$conf->global->ADHERENT_VAT_FOR_SUBSCRIPTIONS), 0); - print ''; - print ''; + print $form->selectarray('ADHERENT_VAT_FOR_SUBSCRIPTIONS', array('0'=>$langs->trans("NoVatOnSubscription"),'defaultforfoundationcountry'=>$langs->trans("Default")), (empty($conf->global->ADHERENT_VAT_FOR_SUBSCRIPTIONS)?'0':$conf->global->ADHERENT_VAT_FOR_SUBSCRIPTIONS), 0); print ''; + print ''; print $langs->trans("WarningModuleNotActive",$langs->transnoentities("Module85Name")); print '
'.$langs->trans("ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS").''; - $form->select_produits($conf->global->ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS, 'constvalue_ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS'); - print ''; - print ''; + $form->select_produits($conf->global->ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS, 'ADHERENT_PRODUCT_ID_FOR_SUBSCRIPTIONS'); print '
'; + +print '
'; +print ''; +print '
'; + +print ''; + print '
'; @@ -240,13 +239,12 @@ $constantes=array( print load_fiche_titre($langs->trans("MembersCards"),'',''); -form_constantes($constantes); +$helptext='*'.$langs->trans("FollowingConstantsWillBeSubstituted").'
'; +$helptext.='%DOL_MAIN_URL_ROOT%, %ID%, %FIRSTNAME%, %LASTNAME%, %FULLNAME%, %LOGIN%, %PASSWORD%, '; +$helptext.='%COMPANY%, %ADDRESS%, %ZIP%, %TOWN%, %COUNTRY%, %EMAIL%, %BIRTH%, %PHOTO%, %TYPE%, '; +$helptext.='%YEAR%, %MONTH%, %DAY%'; -print '*'.$langs->trans("FollowingConstantsWillBeSubstituted").'
'; -print '%DOL_MAIN_URL_ROOT%, %ID%, %FIRSTNAME%, %LASTNAME%, %FULLNAME%, %LOGIN%, %PASSWORD%, '; -print '%COMPANY%, %ADDRESS%, %ZIP%, %TOWN%, %COUNTRY%, %EMAIL%, %BIRTH%, %PHOTO%, %TYPE%, '; -print '%YEAR%, %MONTH%, %DAY%'; -print '
'; +form_constantes($constantes, 0, $helptext); print '
'; @@ -258,13 +256,12 @@ $constantes=array('ADHERENT_ETIQUETTE_TYPE','ADHERENT_ETIQUETTE_TEXT'); print load_fiche_titre($langs->trans("MembersTickets"),'',''); -form_constantes($constantes); +$helptext='*'.$langs->trans("FollowingConstantsWillBeSubstituted").'
'; +$helptext.='%DOL_MAIN_URL_ROOT%, %ID%, %FIRSTNAME%, %LASTNAME%, %FULLNAME%, %LOGIN%, %PASSWORD%, '; +$helptext.='%COMPANY%, %ADDRESS%, %ZIP%, %TOWN%, %COUNTRY%, %EMAIL%, %BIRTH%, %PHOTO%, %TYPE%, '; +$helptext.='%YEAR%, %MONTH%, %DAY%'; -print '*'.$langs->trans("FollowingConstantsWillBeSubstituted").'
'; -print '%DOL_MAIN_URL_ROOT%, %ID%, %FIRSTNAME%, %LASTNAME%, %FULLNAME%, %LOGIN%, %PASSWORD%, '; -print '%COMPANY%, %ADDRESS%, %ZIP%, %TOWN%, %COUNTRY%, %EMAIL%, %BIRTH%, %PHOTO%, %TYPE%, '; -print '%YEAR%, %MONTH%, %DAY%'; -print '
'; +form_constantes($constantes, 0, $helptext); print '
'; @@ -288,13 +285,17 @@ $constantes=array( print load_fiche_titre($langs->trans("Other"),'',''); -form_constantes($constantes); +$helptext='*'.$langs->trans("FollowingConstantsWillBeSubstituted").'
'; +$helptext.='%DOL_MAIN_URL_ROOT%, %ID%, %FIRSTNAME%, %LASTNAME%, %FULLNAME%, %LOGIN%, %PASSWORD%, '; +$helptext.='%COMPANY%, %ADDRESS%, %ZIP%, %TOWN%, %COUNTRY%, %EMAIL%, %BIRTH%, %PHOTO%, %TYPE%, '; +$helptext.='%YEAR%, %MONTH%, %DAY%'; -print '*'.$langs->trans("FollowingConstantsWillBeSubstituted").'
'; -print '%DOL_MAIN_URL_ROOT%, %ID%, %FIRSTNAME%, %LASTNAME%, %FULLNAME%, %LOGIN%, %PASSWORD%, '; -print '%COMPANY%, %ADDRESS%, %ZIP%, %TOWN%, %COUNTRY%, %EMAIL%, %BIRTH%, %PHOTO%, %TYPE%, '; -//print '%YEAR%, %MONTH%, %DAY%'; // Not supported -print '
'; +$helptext='*'.$langs->trans("FollowingConstantsWillBeSubstituted").'
'; +$helptext.='%DOL_MAIN_URL_ROOT%, %ID%, %FIRSTNAME%, %LASTNAME%, %FULLNAME%, %LOGIN%, %PASSWORD%, '; +$helptext.='%COMPANY%, %ADDRESS%, %ZIP%, %TOWN%, %COUNTRY%, %EMAIL%, %BIRTH%, %PHOTO%, %TYPE%, '; +//$helptext.='%YEAR%, %MONTH%, %DAY%'; // Not supported + +form_constantes($constantes, 0, $helptext); dol_fiche_end(); diff --git a/htdocs/adherents/admin/adherent_extrafields.php b/htdocs/adherents/admin/adherent_extrafields.php index 32bf1c87b11..542b4f29a57 100644 --- a/htdocs/adherents/admin/adherent_extrafields.php +++ b/htdocs/adherents/admin/adherent_extrafields.php @@ -70,7 +70,7 @@ print load_fiche_titre($langs->trans("MembersSetup"),$linkback,'title_setup'); $head = member_admin_prepare_head(); -dol_fiche_head($head, 'attributes', $langs->trans("Members"), 0, 'user'); +dol_fiche_head($head, 'attributes', $langs->trans("Members"), -1, 'user'); require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; diff --git a/htdocs/adherents/admin/adherent_type_extrafields.php b/htdocs/adherents/admin/adherent_type_extrafields.php index 835bd05ea5f..8e0d5f9eaa8 100644 --- a/htdocs/adherents/admin/adherent_type_extrafields.php +++ b/htdocs/adherents/admin/adherent_type_extrafields.php @@ -73,7 +73,7 @@ print load_fiche_titre($langs->trans("MembersSetup"),$linkback,'title_setup'); $head = member_admin_prepare_head(); -dol_fiche_head($head, 'attributes_type', $langs->trans("Members"), 0, 'user'); +dol_fiche_head($head, 'attributes_type', $langs->trans("Members"), -1, 'user'); require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; diff --git a/htdocs/adherents/admin/public.php b/htdocs/adherents/admin/public.php index 5c16a34793c..9c982884dd9 100644 --- a/htdocs/adherents/admin/public.php +++ b/htdocs/adherents/admin/public.php @@ -92,8 +92,9 @@ $head = member_admin_prepare_head(); print '
'; print ''; +print ''; -dol_fiche_head($head, 'public', $langs->trans("Members"), 0, 'user'); +dol_fiche_head($head, 'public', $langs->trans("Members"), -1, 'user'); if ($conf->use_javascript_ajax) { @@ -147,7 +148,6 @@ print ''.$langs->trans("Value").''; print "\n"; // Allow public form -print ''; print ''; print $langs->trans("EnablePublicSubscriptionForm"); print ''; @@ -156,7 +156,6 @@ print "\n"; // Force Type $adht = new AdherentType($db); -print ''; print ''; print $langs->trans("ForceMemberType"); print ''; @@ -167,7 +166,6 @@ print $form->selectarray("MEMBER_NEWFORM_FORCETYPE", $listofval, $forcetype, cou print "\n"; // Amount -print ''; print ''; print $langs->trans("DefaultAmount"); print ''; @@ -175,7 +173,6 @@ print '\n"; // Can edit -print ''; print ''; print $langs->trans("CanEditAmount"); print ''; diff --git a/htdocs/core/lib/admin.lib.php b/htdocs/core/lib/admin.lib.php index 2016807efe9..6a0336aab38 100644 --- a/htdocs/core/lib/admin.lib.php +++ b/htdocs/core/lib/admin.lib.php @@ -1180,9 +1180,10 @@ function complete_elementList_with_modules(&$elementList) * * @param array $tableau Array of constants * @param int $strictw3c 0=Include form into table (deprecated), 1=Form is outside table to respect W3C (no form into table), 2=No form nor button at all + * @param string $helptext Help * @return void */ -function form_constantes($tableau,$strictw3c=0) +function form_constantes($tableau, $strictw3c=0, $helptext='') { global $db,$bc,$langs,$conf,$_Avery_Labels; @@ -1193,7 +1194,10 @@ function form_constantes($tableau,$strictw3c=0) print ''; print ''; print ''; - print ''; + print ''; if (empty($strictw3c)) print ''; print "\n"; $var=true; From 6f9e67b1fb2eabe886f2431b20780031d4062430 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 13 May 2017 13:08:25 +0200 Subject: [PATCH 106/299] Remove no more used constant --- htdocs/core/modules/modAdherent.class.php | 7 ------- htdocs/install/mysql/migration/5.0.0-6.0.0.sql | 2 ++ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/htdocs/core/modules/modAdherent.class.php b/htdocs/core/modules/modAdherent.class.php index 4b3d1e5d34f..b75d674b41f 100644 --- a/htdocs/core/modules/modAdherent.class.php +++ b/htdocs/core/modules/modAdherent.class.php @@ -160,13 +160,6 @@ class modAdherent extends DolibarrModules $this->const[$r][4] = 0; $r++; - $this->const[$r][0] = "ADHERENT_BANK_USE_AUTO"; - $this->const[$r][1] = "yesno"; - $this->const[$r][2] = ""; - $this->const[$r][3] = "Insertion automatique des cotisations dans le compte bancaire"; - $this->const[$r][4] = 0; - $r++; - $this->const[$r][0] = "ADHERENT_BANK_ACCOUNT"; $this->const[$r][1] = "chaine"; $this->const[$r][2] = ""; diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index 58ad642266e..9a3ab73d133 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -148,6 +148,8 @@ ALTER TABLE llx_societe_remise_except ADD CONSTRAINT fk_societe_remise_fk_invoic ALTER TABLE llx_facture_rec ADD COLUMN vat_src_code varchar(10) DEFAULT ''; +DELETE FROM llx_const where name = 'ADHERENT_BANK_USE_AUTO'; + UPDATE llx_const set value='moono-lisa' where value = 'moono' AND name = 'FCKEDITOR_SKIN'; ALTER TABLE llx_product_price ADD COLUMN default_vat_code varchar(10) after tva_tx; From 54088f38fbad784c9678fdc495af524b3609c2fc Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 13 May 2017 14:03:09 +0200 Subject: [PATCH 107/299] Code standardization on online payment code --- htdocs/core/lib/payments.lib.php | 71 +++++++- htdocs/paybox/lib/paybox.lib.php | 116 ------------ htdocs/paypal/lib/paypal.lib.php | 138 --------------- htdocs/public/paybox/paymentko.php | 11 +- htdocs/public/paybox/paymentok.php | 12 +- htdocs/public/payment/paymentko.php | 4 +- htdocs/public/payment/paymentok.php | 265 ++++++++++++++++------------ htdocs/public/paypal/paymentko.php | 11 +- htdocs/public/paypal/paymentok.php | 11 +- 9 files changed, 254 insertions(+), 385 deletions(-) diff --git a/htdocs/core/lib/payments.lib.php b/htdocs/core/lib/payments.lib.php index 591956bbffc..3a4d6b684f5 100644 --- a/htdocs/core/lib/payments.lib.php +++ b/htdocs/core/lib/payments.lib.php @@ -86,4 +86,73 @@ function payment_supplier_prepare_head(Paiement $object) { complete_head_from_modules($conf,$langs,$object,$head,$h,'payment_supplier', 'remove'); return $head; -} \ No newline at end of file +} + + + +/** + * Show footer of company in HTML pages + * + * @param Societe $fromcompany Third party + * @param Translate $langs Output language + * @return void + */ +function htmlPrintOnlinePaymentFooter($fromcompany,$langs) +{ + global $conf; + + // Juridical status + $line1=""; + if ($fromcompany->forme_juridique_code) + { + $line1.=($line1?" - ":"").getFormeJuridiqueLabel($fromcompany->forme_juridique_code); + } + // Capital + if ($fromcompany->capital) + { + $line1.=($line1?" - ":"").$langs->transnoentities("CapitalOf",$fromcompany->capital)." ".$langs->transnoentities("Currency".$conf->currency); + } + // Prof Id 1 + if ($fromcompany->idprof1 && ($fromcompany->country_code != 'FR' || ! $fromcompany->idprof2)) + { + $field=$langs->transcountrynoentities("ProfId1",$fromcompany->country_code); + if (preg_match('/\((.*)\)/i',$field,$reg)) $field=$reg[1]; + $line1.=($line1?" - ":"").$field.": ".$fromcompany->idprof1; + } + // Prof Id 2 + if ($fromcompany->idprof2) + { + $field=$langs->transcountrynoentities("ProfId2",$fromcompany->country_code); + if (preg_match('/\((.*)\)/i',$field,$reg)) $field=$reg[1]; + $line1.=($line1?" - ":"").$field.": ".$fromcompany->idprof2; + } + + // Second line of company infos + $line2=""; + // Prof Id 3 + if ($fromcompany->idprof3) + { + $field=$langs->transcountrynoentities("ProfId3",$fromcompany->country_code); + if (preg_match('/\((.*)\)/i',$field,$reg)) $field=$reg[1]; + $line2.=($line2?" - ":"").$field.": ".$fromcompany->idprof3; + } + // Prof Id 4 + if ($fromcompany->idprof4) + { + $field=$langs->transcountrynoentities("ProfId4",$fromcompany->country_code); + if (preg_match('/\((.*)\)/i',$field,$reg)) $field=$reg[1]; + $line2.=($line2?" - ":"").$field.": ".$fromcompany->idprof4; + } + // IntraCommunautary VAT + if ($fromcompany->tva_intra != '') + { + $line2.=($line2?" - ":"").$langs->transnoentities("VATIntraShort").": ".$fromcompany->tva_intra; + } + + print '


'."\n"; + print '
'."\n"; + print $fromcompany->name.'
'; + print $line1.'
'; + print $line2; + print '
'."\n"; +} diff --git a/htdocs/paybox/lib/paybox.lib.php b/htdocs/paybox/lib/paybox.lib.php index ca5fd6a71ad..09848ed905e 100644 --- a/htdocs/paybox/lib/paybox.lib.php +++ b/htdocs/paybox/lib/paybox.lib.php @@ -24,54 +24,6 @@ -/** - * Show header - * - * @param string $title Title of page - * @param string $head Head string to add int head section - * @return void - */ -function llxHeaderPaybox($title, $head = "") -{ - global $user, $conf, $langs; - - header("Content-type: text/html; charset=".$conf->file->character_set_client); - header("X-Content-Type-Options: nosniff"); - - print ''; - //print ''; - print "\n"; - print "\n"; - print "\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print "".$title."\n"; - if ($head) print $head."\n"; - if (! empty($conf->global->PAYBOX_CSS_URL)) print ''."\n"; - else - { - print ''."\n"; - print ''; - } - print "\n"; - print ''."\n"; -} - -/** - * Show footer - * - * @return void - */ -function llxFooterPayBox() -{ - print "\n"; - print "\n"; -} - /** * Create a redirect form to paybox form @@ -220,71 +172,3 @@ function print_paybox_redirect($PRICE,$CURRENCY,$EMAIL,$urlok,$urlko,$TAG) return; } - -/** - * Show footer of company in HTML pages - * - * @param Societe $fromcompany Third party - * @param Translate $langs Output language - * @return void - */ -function html_print_paybox_footer($fromcompany,$langs) -{ - global $conf; - - // Juridical status - $line1=""; - if ($fromcompany->forme_juridique_code) - { - $line1.=($line1?" - ":"").getFormeJuridiqueLabel($fromcompany->forme_juridique_code); - } - // Capital - if ($fromcompany->capital) - { - $line1.=($line1?" - ":"").$langs->transnoentities("CapitalOf",$fromcompany->capital)." ".$langs->transnoentities("Currency".$conf->currency); - } - // Prof Id 1 - if ($fromcompany->idprof1 && ($fromcompany->country_code != 'FR' || ! $fromcompany->idprof2)) - { - $field=$langs->transcountrynoentities("ProfId1",$fromcompany->country_code); - if (preg_match('/\((.*)\)/i',$field,$reg)) $field=$reg[1]; - $line1.=($line1?" - ":"").$field.": ".$fromcompany->idprof1; - } - // Prof Id 2 - if ($fromcompany->idprof2) - { - $field=$langs->transcountrynoentities("ProfId2",$fromcompany->country_code); - if (preg_match('/\((.*)\)/i',$field,$reg)) $field=$reg[1]; - $line1.=($line1?" - ":"").$field.": ".$fromcompany->idprof2; - } - - // Second line of company infos - $line2=""; - // Prof Id 3 - if ($fromcompany->idprof3) - { - $field=$langs->transcountrynoentities("ProfId3",$fromcompany->country_code); - if (preg_match('/\((.*)\)/i',$field,$reg)) $field=$reg[1]; - $line2.=($line2?" - ":"").$field.": ".$fromcompany->idprof3; - } - // Prof Id 4 - if ($fromcompany->idprof4) - { - $field=$langs->transcountrynoentities("ProfId4",$fromcompany->country_code); - if (preg_match('/\((.*)\)/i',$field,$reg)) $field=$reg[1]; - $line2.=($line2?" - ":"").$field.": ".$fromcompany->idprof4; - } - // IntraCommunautary VAT - if ($fromcompany->tva_intra != '') - { - $line2.=($line2?" - ":"").$langs->transnoentities("VATIntraShort").": ".$fromcompany->tva_intra; - } - - print '


'."\n"; - print '
'."\n"; - print $fromcompany->name.'
'; - print $line1.'
'; - print $line2; - print '
'."\n"; -} - diff --git a/htdocs/paypal/lib/paypal.lib.php b/htdocs/paypal/lib/paypal.lib.php index b1be8f56647..9f08ffcb924 100644 --- a/htdocs/paypal/lib/paypal.lib.php +++ b/htdocs/paypal/lib/paypal.lib.php @@ -23,144 +23,6 @@ */ -/** - * Show header - * - * @param string $title Title - * @param string $head More header to add - * @return void - */ -function llxHeaderPaypal($title, $head = "") -{ - global $user, $conf, $langs; - - header("Content-type: text/html; charset=".$conf->file->character_set_client); - header("X-Content-Type-Options: nosniff"); - - $appli='Dolibarr'; - if (!empty($conf->global->MAIN_APPLICATION_TITLE)) $appli=$conf->global->MAIN_APPLICATION_TITLE; - - print ''; - //print ''; - print "\n"; - print "\n"; - print "\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print "".$title."\n"; - if ($head) print $head."\n"; - if (! empty($conf->global->PAYPAL_CSS_URL)) print ''."\n"; - else - { - print ''."\n"; - print ''; - } - - if ($conf->use_javascript_ajax) - { - print ''."\n"; - print ''."\n"; // JNotify - - // Output standard javascript links - $ext='.js'; - - // JQuery. Must be before other includes - print ''."\n"; - print ''."\n"; - // jQuery jnotify - if (empty($conf->global->MAIN_DISABLE_JQUERY_JNOTIFY)) - { - print ''."\n"; - print ''."\n"; - } - } - print "\n"; - print ''."\n"; -} - -/** - * Show footer - * - * @return void - */ -function llxFooterPaypal() -{ - print "\n"; - print "\n"; -} - - -/** - * Show footer of company in HTML pages - * - * @param Societe $fromcompany Third party - * @param Translate $langs Output language - * @return void - */ -function html_print_paypal_footer($fromcompany,$langs) -{ - global $conf; - - // Juridical status - $line1=""; - if ($fromcompany->forme_juridique_code) - { - $line1.=($line1?" - ":"").getFormeJuridiqueLabel($fromcompany->forme_juridique_code); - } - // Capital - if ($fromcompany->capital) - { - $line1.=($line1?" - ":"").$langs->transnoentities("CapitalOf",$fromcompany->capital)." ".$langs->transnoentities("Currency".$conf->currency); - } - // Prof Id 1 - if ($fromcompany->idprof1 && ($fromcompany->country_code != 'FR' || ! $fromcompany->idprof2)) - { - $field=$langs->transcountrynoentities("ProfId1",$fromcompany->country_code); - if (preg_match('/\((.*)\)/i',$field,$reg)) $field=$reg[1]; - $line1.=($line1?" - ":"").$field.": ".$fromcompany->idprof1; - } - // Prof Id 2 - if ($fromcompany->idprof2) - { - $field=$langs->transcountrynoentities("ProfId2",$fromcompany->country_code); - if (preg_match('/\((.*)\)/i',$field,$reg)) $field=$reg[1]; - $line1.=($line1?" - ":"").$field.": ".$fromcompany->idprof2; - } - - // Second line of company infos - $line2=""; - // Prof Id 3 - if ($fromcompany->idprof3) - { - $field=$langs->transcountrynoentities("ProfId3",$fromcompany->country_code); - if (preg_match('/\((.*)\)/i',$field,$reg)) $field=$reg[1]; - $line2.=($line2?" - ":"").$field.": ".$fromcompany->idprof3; - } - // Prof Id 4 - if ($fromcompany->idprof4) - { - $field=$langs->transcountrynoentities("ProfId4",$fromcompany->country_code); - if (preg_match('/\((.*)\)/i',$field,$reg)) $field=$reg[1]; - $line2.=($line2?" - ":"").$field.": ".$fromcompany->idprof4; - } - // IntraCommunautary VAT - if ($fromcompany->tva_intra != '') - { - $line2.=($line2?" - ":"").$langs->transnoentities("VATIntraShort").": ".$fromcompany->tva_intra; - } - - print '


'."\n"; - print '
'."\n"; - print $fromcompany->name.'
'; - print $line1.'
'; - print $line2; - print '
'."\n"; -} - /** * Define head array for tabs of paypal tools setup pages * diff --git a/htdocs/public/paybox/paymentko.php b/htdocs/public/paybox/paymentko.php index 09de4525b39..0b6b0955bb2 100644 --- a/htdocs/public/paybox/paymentko.php +++ b/htdocs/public/paybox/paymentko.php @@ -35,6 +35,7 @@ if (is_numeric($entity)) define("DOLENTITY", $entity); require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/paybox/lib/paybox.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; // Security check if (empty($conf->paybox->enabled)) accessforbidden('',0,0,1); @@ -93,7 +94,11 @@ if (! empty($conf->global->PAYBOX_PAYONLINE_SENDEMAIL)) } -llxHeaderPayBox($langs->trans("PaymentForm")); +$head=''; +if (! empty($conf->global->PAYBOX_CSS_URL)) $head=''."\n"; + + +llxHeader($head, $langs->trans("PaymentForm")); // Show message @@ -107,9 +112,9 @@ if (! empty($conf->global->PAYBOX_MESSAGE_KO)) print $conf->global->PAYBOX_MESSA print "\n\n"; -html_print_paybox_footer($mysoc,$langs); +htmlPrintOnlinePaymentFooter($mysoc,$langs); -llxFooterPayBox(); +llxFooter(); $db->close(); diff --git a/htdocs/public/paybox/paymentok.php b/htdocs/public/paybox/paymentok.php index 9c3030a86ba..482f58ed909 100644 --- a/htdocs/public/paybox/paymentok.php +++ b/htdocs/public/paybox/paymentok.php @@ -35,6 +35,7 @@ if (is_numeric($entity)) define("DOLENTITY", $entity); require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/paybox/lib/paybox.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; // Security check if (empty($conf->paybox->enabled)) accessforbidden('',0,0,1); @@ -76,7 +77,12 @@ $tracepost = ""; foreach($_POST as $k => $v) $tracepost .= "{$k} - {$v}\n"; dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_paybox'); -llxHeaderPayBox($langs->trans("PaymentForm")); + +$head=''; +if (! empty($conf->global->PAYBOX_CSS_URL)) $head=''."\n"; + + +llxHeader($head, $langs->trans("PaymentForm")); // Show message @@ -164,9 +170,9 @@ if (! empty($conf->global->PAYBOX_PAYONLINE_SENDEMAIL)) print "\n\n"; -html_print_paybox_footer($mysoc,$langs); +htmlPrintOnlinePaymentFooter($mysoc,$langs); -llxFooterPayBox(); +llxFooter(); $db->close(); diff --git a/htdocs/public/payment/paymentko.php b/htdocs/public/payment/paymentko.php index 70dac3c960b..5bd09f845da 100644 --- a/htdocs/public/payment/paymentko.php +++ b/htdocs/public/payment/paymentko.php @@ -37,6 +37,8 @@ if (is_numeric($entity)) define("DOLENTITY", $entity); require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; + if (! empty($conf->paypal->enabled)) { require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypal.lib.php'; @@ -138,7 +140,7 @@ if (! empty($conf->global->PAYPAL_MESSAGE_KO)) print $conf->global->PAYPAL_MESSA print "\n\n"; -html_print_paypal_footer($mysoc,$langs); +htmlPrintOnlinePaymentFooter($mysoc,$langs); llxFooter(); diff --git a/htdocs/public/payment/paymentok.php b/htdocs/public/payment/paymentok.php index ce3fcd8bb29..221abec032f 100644 --- a/htdocs/public/payment/paymentok.php +++ b/htdocs/public/payment/paymentok.php @@ -37,15 +37,14 @@ if (is_numeric($entity)) define("DOLENTITY", $entity); require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; + if (! empty($conf->paypal->enabled)) { require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypal.lib.php'; require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypalfunctions.lib.php'; } -// Security check -//if (empty($conf->paypal->enabled)) accessforbidden('',0,0,1); - $langs->load("main"); $langs->load("other"); $langs->load("dict"); @@ -84,16 +83,17 @@ if (! empty($conf->paypal->enabled)) dol_print_error('',"Paypal setup param PAYPAL_API_SIGNATURE not defined"); return -1; } + + $PAYPALTOKEN=GETPOST('TOKEN'); + if (empty($PAYPALTOKEN)) $PAYPALTOKEN=GETPOST('token'); + $PAYPALPAYERID=GETPOST('PAYERID'); + if (empty($PAYPALPAYERID)) $PAYPALPAYERID=GETPOST('PayerID'); + $PAYPALFULLTAG=GETPOST('FULLTAG'); + if (empty($PAYPALFULLTAG)) $PAYPALFULLTAG=GETPOST('fulltag'); } $source=GETPOST('source'); $ref=GETPOST('ref'); -$PAYPALTOKEN=GETPOST('TOKEN'); -if (empty($PAYPALTOKEN)) $PAYPALTOKEN=GETPOST('token'); -$PAYPALPAYERID=GETPOST('PAYERID'); -if (empty($PAYPALPAYERID)) $PAYPALPAYERID=GETPOST('PayerID'); -$PAYPALFULLTAG=GETPOST('FULLTAG'); -if (empty($PAYPALFULLTAG)) $PAYPALFULLTAG=GETPOST('fulltag'); $paymentmethod=array(); if (! empty($conf->paypal->enabled)) $paymentmethod['paypal']='paypal'; @@ -104,6 +104,14 @@ if (! empty($conf->paybox->enabled)) $paymentmethod['paybox']='paybox'; if (empty($paymentmethod)) accessforbidden('', 0, 0, 1); +// If payment is ok +$PAYMENTSTATUS=$TRANSACTIONID=$TAXAMT=$NOTE=''; +// If payment is ko +$ErrorCode=$ErrorShortMsg=$ErrorLongMsg=$ErrorSeverityCode=''; + +$ispaymentok = false; + + /* * Actions */ @@ -123,13 +131,16 @@ dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_payment'); $head=''; if (! empty($conf->global->PAYMENT_CSS_URL)) $head=''."\n"; + llxHeader($head, $langs->trans("PaymentForm")); + // Show message print ''."\n"; print '
'."\n"; + if (! empty($conf->paypal->enabled)) { if ($PAYPALTOKEN) @@ -147,7 +158,6 @@ if (! empty($conf->paypal->enabled)) dol_syslog("Call paymentok with token=".$token." paymentType=".$paymentType." currencyCodeType=".$currencyCodeType." payerID=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt." fulltag=".$fulltag, LOG_DEBUG, 0, '_paypal'); - // Validate record if (! empty($paymentType)) { @@ -159,7 +169,7 @@ if (! empty($conf->paypal->enabled)) $resArray=confirmPayment($token, $paymentType, $currencyCodeType, $payerID, $ipaddress, $FinalPaymentAmt, $fulltag); $ack = strtoupper($resArray["ACK"]); - if($ack=="SUCCESS" || $ack=="SUCCESSWITHWARNING") + if ($ack=="SUCCESS" || $ack=="SUCCESSWITHWARNING") { $object = new stdClass(); @@ -175,132 +185,153 @@ if (! empty($conf->paypal->enabled)) $TRANSACTIONID=urldecode($resArray["TRANSACTIONID"]); $TAXAMT=urldecode($resArray["TAXAMT"]); $NOTE=urldecode($resArray["NOTE"]); - - print $langs->trans("YourPaymentHasBeenRecorded")."
\n"; - print $langs->trans("ThisIsTransactionId",$TRANSACTIONID)."

\n"; - if (! empty($conf->global->PAYPAL_MESSAGE_OK)) print $conf->global->PAYPAL_MESSAGE_OK; - - // Appel des triggers - include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; - $interface=new Interfaces($db); - $result=$interface->run_triggers('PAYPAL_PAYMENT_OK',$object,$user,$langs,$conf); - if ($result < 0) { $error++; $errors=$interface->errors; } - // Fin appel triggers - - // Send an email - if (! empty($conf->global->PAYPAL_PAYONLINE_SENDEMAIL)) - { - $sendto=$conf->global->PAYPAL_PAYONLINE_SENDEMAIL; - $from=$conf->global->MAILING_EMAIL_FROM; - // Define $urlwithroot - $urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root)); - $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file - //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current - - $urlback=$_SERVER["REQUEST_URI"]; - $topic='['.$conf->global->MAIN_APPLICATION_TITLE.'] '.$langs->transnoentitiesnoconv("NewPaypalPaymentReceived"); - $tmptag=dolExplodeIntoArray($fulltag,'.','='); - $content=""; - if (! empty($tmptag['MEM'])) - { - $langs->load("members"); - $url=$urlwithroot."/adherents/card_subscriptions.php?rowid=".$tmptag['MEM']; - $content.=$langs->trans("PaymentSubscription")."
\n"; - $content.=$langs->trans("MemberId").': '.$tmptag['MEM']."
\n"; - $content.=$langs->trans("Link").': '.$url.''."
\n"; - } - else - { - $content.=$langs->transnoentitiesnoconv("NewPaypalPaymentReceived")."
\n"; - } - $content.="
\n"; - $content.=$langs->transnoentitiesnoconv("TechnicalInformation").":
\n"; - $content.=$langs->transnoentitiesnoconv("ReturnURLAfterPayment").': '.$urlback."
\n"; - $content.="tag=".$fulltag." token=".$token." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; - - $ishtml=dol_textishtml($content); // May contain urls - - require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; - $mailfile = new CMailFile($topic, $sendto, $from, $content, array(), array(), array(), '', '', 0, $ishtml); - - $result=$mailfile->sendfile(); - if ($result) - { - dol_syslog("EMail sent to ".$sendto, LOG_DEBUG, 0, '_payment'); - } - else - { - dol_syslog("Failed to send EMail to ".$sendto, LOG_ERR, 0, '_payment'); - } - } + + $ispaymentok=True; } else - { + { //Display a user friendly Error on the page using any of the following error information returned by PayPal $ErrorCode = urldecode($resArray["L_ERRORCODE0"]); $ErrorShortMsg = urldecode($resArray["L_SHORTMESSAGE0"]); $ErrorLongMsg = urldecode($resArray["L_LONGMESSAGE0"]); $ErrorSeverityCode = urldecode($resArray["L_SEVERITYCODE0"]); - - echo $langs->trans('DoExpressCheckoutPaymentAPICallFailed') . "
\n"; - echo $langs->trans('DetailedErrorMessage') . ": " . $ErrorLongMsg."
\n"; - echo $langs->trans('ShortErrorMessage') . ": " . $ErrorShortMsg."
\n"; - echo $langs->trans('ErrorCode') . ": " . $ErrorCode."
\n"; - echo $langs->trans('ErrorSeverityCode') . ": " . $ErrorSeverityCode."
\n"; - - if ($mysoc->email) echo "\nPlease, send a screenshot of this page to ".$mysoc->email."
\n"; - - // Send an email - if (! empty($conf->global->PAYPAL_PAYONLINE_SENDEMAIL)) - { - $sendto=$conf->global->PAYPAL_PAYONLINE_SENDEMAIL; - $from=$conf->global->MAILING_EMAIL_FROM; - // Define $urlwithroot - $urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root)); - $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file - //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current - - $urlback=$_SERVER["REQUEST_URI"]; - $topic='['.$conf->global->MAIN_APPLICATION_TITLE.'] '.$langs->transnoentitiesnoconv("ValidationOfPaypalPaymentFailed"); - $content=""; - $content.=$langs->transnoentitiesnoconv("PaypalConfirmPaymentPageWasCalledButFailed")."\n"; - $content.="\n"; - $content.=$langs->transnoentitiesnoconv("TechnicalInformation").":\n"; - $content.=$langs->transnoentitiesnoconv("ReturnURLAfterPayment").': '.$urlback."\n"; - $content.="tag=".$fulltag."\ntoken=".$token." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; - - $ishtml=dol_textishtml($content); // May contain urls - - require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; - $mailfile = new CMailFile($topic, $sendto, $from, $content, array(), array(), array(), '', '', 0, $ishtml); - - $result=$mailfile->sendfile(); - if ($result) - { - dol_syslog("EMail sent to ".$sendto, LOG_DEBUG, 0, '_payment'); - } - else - { - dol_syslog("Failed to send EMail to ".$sendto, LOG_ERR, 0, '_payment'); - } - } } } else { dol_print_error('','Session expired'); - } + } + } + else + { + dol_print_error('','$PAYPALTOKEN not defined'); + } +} + + + +if ($ispaymentok) +{ + // Appel des triggers + include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + $interface=new Interfaces($db); + $result=$interface->run_triggers('PAYMENTONLINE_PAYMENT_OK',$object,$user,$langs,$conf); + if ($result < 0) { $error++; $errors=$interface->errors; } + // Fin appel triggers + + + print $langs->trans("YourPaymentHasBeenRecorded")."
\n"; + print $langs->trans("ThisIsTransactionId",$TRANSACTIONID)."

\n"; + if (! empty($conf->global->PAYMENT_MESSAGE_OK)) print $conf->global->PAYMENT_MESSAGE_OK; + + + // Send an email + if (! empty($conf->global->PAYMENTONLINE_SENDEMAIL)) + { + $sendto=$conf->global->PAYMENTONLINE_SENDEMAIL; + $from=$conf->global->MAILING_EMAIL_FROM; + // Define $urlwithroot + $urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root)); + $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file + //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current + + $urlback=$_SERVER["REQUEST_URI"]; + $topic='['.$conf->global->MAIN_APPLICATION_TITLE.'] '.$langs->transnoentitiesnoconv("NewPaypalPaymentReceived"); + $tmptag=dolExplodeIntoArray($fulltag,'.','='); + $content=""; + if (! empty($tmptag['MEM'])) + { + $langs->load("members"); + $url=$urlwithroot."/adherents/card_subscriptions.php?rowid=".$tmptag['MEM']; + $content.=$langs->trans("PaymentSubscription")."
\n"; + $content.=$langs->trans("MemberId").': '.$tmptag['MEM']."
\n"; + $content.=$langs->trans("Link").': '.$url.''."
\n"; + } + else + { + $content.=$langs->transnoentitiesnoconv("NewPaypalPaymentReceived")."
\n"; + } + $content.="
\n"; + $content.=$langs->transnoentitiesnoconv("TechnicalInformation").":
\n"; + $content.=$langs->transnoentitiesnoconv("ReturnURLAfterPayment").': '.$urlback."
\n"; + $content.="tag=".$fulltag." token=".$token." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; + + $ishtml=dol_textishtml($content); // May contain urls + + require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; + $mailfile = new CMailFile($topic, $sendto, $from, $content, array(), array(), array(), '', '', 0, $ishtml); + + $result=$mailfile->sendfile(); + if ($result) + { + dol_syslog("EMail sent to ".$sendto, LOG_DEBUG, 0, '_payment'); + } + else + { + dol_syslog("Failed to send EMail to ".$sendto, LOG_ERR, 0, '_payment'); + } } } else { - // No TOKEN parameter in URL - dol_print_error('','No TOKEN parameter in URL'); + // Appel des triggers + include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + $interface=new Interfaces($db); + $result=$interface->run_triggers('PAYMENTONLINE_PAYMENT_KO',$object,$user,$langs,$conf); + if ($result < 0) { $error++; $errors=$interface->errors; } + // Fin appel triggers + + + print $langs->trans('DoExpressCheckoutPaymentAPICallFailed') . "
\n"; + print $langs->trans('DetailedErrorMessage') . ": " . $ErrorLongMsg."
\n"; + print $langs->trans('ShortErrorMessage') . ": " . $ErrorShortMsg."
\n"; + print $langs->trans('ErrorCode') . ": " . $ErrorCode."
\n"; + print $langs->trans('ErrorSeverityCode') . ": " . $ErrorSeverityCode."
\n"; + + if ($mysoc->email) print "\nPlease, send a screenshot of this page to ".$mysoc->email."
\n"; + + + // Send an email + if (! empty($conf->global->PAYMENTONLINE_SENDEMAIL)) + { + $sendto=$conf->global->PAYMENTONLINE_SENDEMAIL; + $from=$conf->global->MAILING_EMAIL_FROM; + // Define $urlwithroot + $urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root)); + $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file + //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current + + $urlback=$_SERVER["REQUEST_URI"]; + $topic='['.$conf->global->MAIN_APPLICATION_TITLE.'] '.$langs->transnoentitiesnoconv("ValidationOfPaypalPaymentFailed"); + $content=""; + $content.=$langs->transnoentitiesnoconv("PaypalConfirmPaymentPageWasCalledButFailed")."\n"; + $content.="\n"; + $content.=$langs->transnoentitiesnoconv("TechnicalInformation").":\n"; + $content.=$langs->transnoentitiesnoconv("ReturnURLAfterPayment").': '.$urlback."\n"; + $content.="tag=".$fulltag."\ntoken=".$token." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; + + $ishtml=dol_textishtml($content); // May contain urls + + require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; + $mailfile = new CMailFile($topic, $sendto, $from, $content, array(), array(), array(), '', '', 0, $ishtml); + + $result=$mailfile->sendfile(); + if ($result) + { + dol_syslog("EMail sent to ".$sendto, LOG_DEBUG, 0, '_payment'); + } + else + { + dol_syslog("Failed to send EMail to ".$sendto, LOG_ERR, 0, '_payment'); + } + } } + print "\n
\n"; -html_print_paypal_footer($mysoc,$langs); + +htmlPrintOnlinePaymentFooter($mysoc,$langs); llxFooter(); diff --git a/htdocs/public/paypal/paymentko.php b/htdocs/public/paypal/paymentko.php index 4bad572ed8b..7436693a1c1 100644 --- a/htdocs/public/paypal/paymentko.php +++ b/htdocs/public/paypal/paymentko.php @@ -39,6 +39,7 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypal.lib.php'; require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypalfunctions.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; // Security check if (empty($conf->paypal->enabled)) accessforbidden('',0,0,1); @@ -113,7 +114,11 @@ if (! empty($conf->global->PAYPAL_PAYONLINE_SENDEMAIL)) } -llxHeaderPaypal($langs->trans("PaymentForm")); +$head=''; +if (! empty($conf->global->PAYPAL_CSS_URL)) $head=''."\n"; + + +llxHeader($head, $langs->trans("PaymentForm")); // Show ko message @@ -125,9 +130,9 @@ if (! empty($conf->global->PAYPAL_MESSAGE_KO)) print $conf->global->PAYPAL_MESSA print "\n\n"; -html_print_paypal_footer($mysoc,$langs); +htmlPrintOnlinePaymentFooter($mysoc,$langs); -llxFooterPaypal(); +llxFooter(); $db->close(); diff --git a/htdocs/public/paypal/paymentok.php b/htdocs/public/paypal/paymentok.php index 90f13aa6f17..984c282d161 100644 --- a/htdocs/public/paypal/paymentok.php +++ b/htdocs/public/paypal/paymentok.php @@ -39,6 +39,7 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypal.lib.php'; require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypalfunctions.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; // Security check if (empty($conf->paypal->enabled)) accessforbidden('',0,0,1); @@ -107,7 +108,11 @@ foreach($_POST as $k => $v) $tracepost .= "{$k} - {$v}\n"; dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_paypal'); -llxHeaderPaypal($langs->trans("PaymentForm")); +$head=''; +if (! empty($conf->global->PAYPAL_CSS_URL)) $head=''."\n"; + + +llxHeader($head, $langs->trans("PaymentForm")); // Show message @@ -281,9 +286,9 @@ else print "\n\n"; -html_print_paypal_footer($mysoc,$langs); +htmlPrintOnlinePaymentFooter($mysoc,$langs); -llxFooterPaypal(); +llxFooter(); $db->close(); From b5b97816c897e9875d5bdb7a926b3735484b8da8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 13 May 2017 14:06:14 +0200 Subject: [PATCH 108/299] FIX #6803 --- htdocs/install/mysql/migration/5.0.0-6.0.0.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index 9a3ab73d133..bf28e6a3db6 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -212,7 +212,9 @@ ALTER TABLE llx_default_values ADD UNIQUE INDEX uk_default_values(type, entity, ALTER TABLE llx_supplier_proposaldet ADD INDEX idx_supplier_proposaldet_fk_supplier_proposal (fk_supplier_proposal); ALTER TABLE llx_supplier_proposaldet ADD INDEX idx_supplier_proposaldet_fk_product (fk_product); +UPDATE llx_supplier_proposaldet SET fk_unit = NULL where fk_unit not in (SELECT rowid from llx_c_units); ALTER TABLE llx_supplier_proposaldet ADD CONSTRAINT fk_supplier_proposaldet_fk_unit FOREIGN KEY (fk_unit) REFERENCES llx_c_units (rowid); + ALTER TABLE llx_supplier_proposaldet ADD CONSTRAINT fk_supplier_proposaldet_fk_supplier_proposal FOREIGN KEY (fk_supplier_proposal) REFERENCES llx_supplier_proposal (rowid); -- NEW inventory module From 71833f598776928ce6eb93ee9cb24a45b6730683 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 13 May 2017 15:19:35 +0200 Subject: [PATCH 109/299] Standardize code --- htdocs/externalsite/frametop.php | 4 + htdocs/main.inc.php | 31 ++--- htdocs/paybox/lib/paybox.lib.php | 2 +- htdocs/paypal/admin/paypal.php | 5 +- htdocs/paypal/lib/paypal.lib.php | 6 +- htdocs/public/members/new.php | 1 + htdocs/public/paybox/newpayment.php | 27 ++-- htdocs/public/paybox/paymentko.php | 6 +- htdocs/public/paybox/paymentok.php | 12 +- htdocs/public/payment/newpayment.php | 143 +++++++++++++++++----- htdocs/public/payment/paymentko.php | 21 ++-- htdocs/public/payment/paymentok.php | 40 ++++-- htdocs/public/paypal/newpayment.php | 19 ++- htdocs/public/paypal/paymentko.php | 12 +- htdocs/public/paypal/paymentok.php | 12 +- htdocs/societe/checkvat/checkVatPopup.php | 8 +- htdocs/theme/eldy/style.css.php | 3 + htdocs/websites/frametop.php | 5 +- htdocs/websites/index.php | 4 +- 19 files changed, 251 insertions(+), 110 deletions(-) diff --git a/htdocs/externalsite/frametop.php b/htdocs/externalsite/frametop.php index f33c8ae61a2..3fb50ec6745 100644 --- a/htdocs/externalsite/frametop.php +++ b/htdocs/externalsite/frametop.php @@ -27,5 +27,9 @@ require ("../main.inc.php"); $langs->load("externalsite"); top_htmlhead("",""); + +print '' . "\n"; + top_menu("","","_top"); +print ''; diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 333eb25ad89..c6bf910a8af 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -950,20 +950,24 @@ if (! function_exists("llxHeader")) * @param array $arrayofjs Array of complementary js files * @param array $arrayofcss Array of complementary css files * @param string $morequerystring Query string to add to the link "print" to get same parameters (use only if autodetect fails) + * @param string $morecssonbody More CSS on body tag. * @return void */ - function llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='') + function llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='') { global $conf; // html header top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss); + print '' . "\n"; + // top menu and left menu area if (empty($conf->dol_hide_topmenu)) { top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url); } + if (empty($conf->dol_hide_leftmenu)) { left_menu('', $help_url, '', '', 1, $title, 1); @@ -1219,19 +1223,6 @@ function top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs print ''."\n"; print ''."\n"; } - // jQuery File Upload - /* - if (! empty($conf->global->MAIN_USE_JQUERY_FILEUPLOAD) || (defined('REQUIRE_JQUERY_FILEUPLOAD') && constant('REQUIRE_JQUERY_FILEUPLOAD'))) - { - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - }*/ // jQuery DataTables /* Removed a old hidden problematic feature never used in Dolibarr. If an external module need datatable, the module must provide all lib it needs and manage version problems with other dolibarr components if (! empty($conf->global->MAIN_USE_JQUERY_DATATABLES) || (defined('REQUIRE_JQUERY_DATATABLES') && constant('REQUIRE_JQUERY_DATATABLES'))) @@ -1377,9 +1368,11 @@ function top_menu($head, $title='', $target='', $disablejs=0, $disablehead=0, $a $toprightmenu=''; // For backward compatibility with old modules - if (empty($conf->headerdone)) top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss); - - print '' . "\n"; + if (empty($conf->headerdone)) + { + top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss); + print ''; + } /* * Top menu @@ -1762,6 +1755,7 @@ function main_area($title='') print "\n"; print ''."\n".'
'."\n"; + if (! empty($conf->global->MAIN_ONLY_LOGIN_ALLOWED)) print info_admin($langs->trans("WarningYouAreInMaintenanceMode",$conf->global->MAIN_ONLY_LOGIN_ALLOWED)); } @@ -1899,7 +1893,8 @@ if (! function_exists("llxFooter")) } print "\n\n"; - print '
'."\n"; + + print ' '."\n"; // End div fiche if (empty($conf->dol_hide_leftmenu)) print ' '; // End div id-right diff --git a/htdocs/paybox/lib/paybox.lib.php b/htdocs/paybox/lib/paybox.lib.php index 09848ed905e..a4106488f53 100644 --- a/htdocs/paybox/lib/paybox.lib.php +++ b/htdocs/paybox/lib/paybox.lib.php @@ -33,7 +33,7 @@ * @param string $EMAIL EMail * @param string $urlok Url to go back if payment is OK * @param string $urlko Url to go back if payment is KO - * @param string $TAG Tag + * @param string $TAG Full tag * @return int 1 if OK, -1 if ERROR */ function print_paybox_redirect($PRICE,$CURRENCY,$EMAIL,$urlok,$urlko,$TAG) diff --git a/htdocs/paypal/admin/paypal.php b/htdocs/paypal/admin/paypal.php index 4942d15a9ce..ef0c40f2813 100644 --- a/htdocs/paypal/admin/paypal.php +++ b/htdocs/paypal/admin/paypal.php @@ -96,7 +96,6 @@ llxHeader('',$langs->trans("PaypalSetup")); $linkback=''.$langs->trans("BackToModuleList").''; print load_fiche_titre($langs->trans("ModuleSetup").' PayPal',$linkback); -print '
'; $head=paypaladmin_prepare_head(); @@ -105,7 +104,7 @@ print ''; print ''; -dol_fiche_head($head, 'paypalaccount', ''); +dol_fiche_head($head, 'paypalaccount', '', -1); print $langs->trans("PaypalDesc")."
\n"; @@ -138,7 +137,7 @@ print ''; print '
'; diff --git a/htdocs/paypal/lib/paypal.lib.php b/htdocs/paypal/lib/paypal.lib.php index 9f08ffcb924..944afd34b1a 100644 --- a/htdocs/paypal/lib/paypal.lib.php +++ b/htdocs/paypal/lib/paypal.lib.php @@ -191,7 +191,7 @@ function getPaypalPaymentUrl($mode,$type,$ref='',$amount='9.99',$freetag='your_f * @param string $paymentType Payment type * @param string $returnURL Url to use if payment is OK * @param string $cancelURL Url to use if payment is KO - * @param string $tag Tag + * @param string $tag Full tag * @return void */ function print_paypal_redirect($paymentAmount,$currencyCodeType,$paymentType,$returnURL,$cancelURL,$tag) @@ -306,7 +306,7 @@ function print_paypal_redirect($paymentAmount,$currencyCodeType,$paymentType,$re * @param string $paymentType Payment type * @param string $returnURL Return Url * @param string $cancelURL Cancel Url - * @param string $tag Tag + * @param string $tag Full tag * @param string $solutionType Type * @param string $landingPage Landing page * @param string $shipToName Ship to name @@ -429,7 +429,7 @@ function getDetails($token) * @param string $payerID Payer ID * @param string $ipaddress IP Address * @param string $FinalPaymentAmt Amount - * @param string $tag Tag + * @param string $tag Full tag * @return void */ function confirmPayment($token, $paymentType, $currencyCodeType, $payerID, $ipaddress, $FinalPaymentAmt, $tag) diff --git a/htdocs/public/members/new.php b/htdocs/public/members/new.php index c307512e257..4130b616a0e 100644 --- a/htdocs/public/members/new.php +++ b/htdocs/public/members/new.php @@ -91,6 +91,7 @@ $extrafields = new ExtraFields($db); function llxHeaderVierge($title, $head="", $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='') { global $user, $conf, $langs, $mysoc; + top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss); // Show html headers print ''; diff --git a/htdocs/public/paybox/newpayment.php b/htdocs/public/paybox/newpayment.php index b4b978009b7..a52358dab24 100644 --- a/htdocs/public/paybox/newpayment.php +++ b/htdocs/public/paybox/newpayment.php @@ -36,6 +36,7 @@ if (is_numeric($entity)) define("DOLENTITY", $entity); require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/paybox/lib/paybox.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; @@ -95,6 +96,7 @@ $ref=$REF=GETPOST('ref','alpha'); $TAG=GETPOST("tag",'alpha'); $FULLTAG=GETPOST("fulltag",'alpha'); // fulltag is tag with more informations $SECUREKEY=GETPOST("securekey"); // Secure key +$FULLTAG.=($FULLTAG?'.':'').'PM=paybox'; if (! empty($SOURCE)) { @@ -126,19 +128,22 @@ $valid=true; /* * Actions */ + if (GETPOST("action") == 'dopayment') { $PRICE=price2num(GETPOST("newamount"),'MT'); $email=GETPOST("email"); + $origfulltag=GETPOST("fulltag",'alpha'); + $mesg=''; if (empty($PRICE) || ! is_numeric($PRICE)) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Amount")); - elseif (empty($email)) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("YourEMail")); - elseif (! isValidEMail($email)) $mesg=$langs->trans("ErrorBadEMail",$email); - elseif (empty($FULLTAG)) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("PaymentCode")); - elseif (dol_strlen($urlok) > 150) $mesg='Error urlok too long '.$urlok; + elseif (empty($email)) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("YourEMail")); + elseif (! isValidEMail($email)) $mesg=$langs->trans("ErrorBadEMail",$email); + elseif (! $origfulltag) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("PaymentCode")); + elseif (dol_strlen($urlok) > 150) $mesg='Error urlok too long '.$urlok; elseif (dol_strlen($urlko) > 150) $mesg='Error urlko too long '.$urlko; - + if (empty($mesg)) { dol_syslog("newpayment.php call paybox api and do redirect", LOG_DEBUG); @@ -156,7 +161,13 @@ if (GETPOST("action") == 'dopayment') * View */ -llxHeaderPayBox($langs->trans("PaymentForm")); +$head=''; +if (! empty($conf->global->PAYBOX_CSS_URL)) $head=''."\n"; + +$conf->dol_hide_topmenu=1; +$conf->dol_hide_leftmenu=1; + +llxHeader($head, $langs->trans("PaymentForm"), '', '', 0, 0, '', '', '', 'onlinepaymentbody'); // Common variables @@ -782,9 +793,9 @@ print ''."\n"; print '
'; -html_print_paybox_footer($mysoc,$langs); +htmlPrintOnlinePaymentFooter($mysoc,$langs); -llxFooterPayBox(); +llxFooter('', 'public'); $db->close(); diff --git a/htdocs/public/paybox/paymentko.php b/htdocs/public/paybox/paymentko.php index 0b6b0955bb2..f5f42c8a529 100644 --- a/htdocs/public/paybox/paymentko.php +++ b/htdocs/public/paybox/paymentko.php @@ -97,8 +97,10 @@ if (! empty($conf->global->PAYBOX_PAYONLINE_SENDEMAIL)) $head=''; if (! empty($conf->global->PAYBOX_CSS_URL)) $head=''."\n"; +$conf->dol_hide_topmenu=1; +$conf->dol_hide_leftmenu=1; -llxHeader($head, $langs->trans("PaymentForm")); +llxHeader($head, $langs->trans("PaymentForm"), '', '', 0, 0, '', '', '', 'onlinepaymentbody'); // Show message @@ -115,6 +117,6 @@ print "\n\n"; htmlPrintOnlinePaymentFooter($mysoc,$langs); -llxFooter(); +llxFooter('', 'public'); $db->close(); diff --git a/htdocs/public/paybox/paymentok.php b/htdocs/public/paybox/paymentok.php index 482f58ed909..92bd484cde5 100644 --- a/htdocs/public/paybox/paymentok.php +++ b/htdocs/public/paybox/paymentok.php @@ -55,8 +55,8 @@ if (empty($PAYBOXTOKEN)) $PAYBOXTOKEN=GETPOST('token'); $PAYBOXPAYERID=GETPOST('PAYERID'); if (empty($PAYBOXPAYERID)) $PAYBOXPAYERID=GETPOST('PayerID'); */ -$PAYBOXFULLTAG=GETPOST('FULLTAG'); -if (empty($PAYBOXFULLTAG)) $PAYBOXFULLTAG=GETPOST('fulltag'); +$FULLTAG=GETPOST('FULLTAG'); +if (empty($FULLTAG)) $FULLTAG=GETPOST('fulltag'); /* @@ -81,8 +81,10 @@ dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_paybox'); $head=''; if (! empty($conf->global->PAYBOX_CSS_URL)) $head=''."\n"; +$conf->dol_hide_topmenu=1; +$conf->dol_hide_leftmenu=1; -llxHeader($head, $langs->trans("PaymentForm")); +llxHeader($head, $langs->trans("PaymentForm"), '', '', 0, 0, '', '', '', 'onlinepaymentbody'); // Show message @@ -93,7 +95,7 @@ print '
'."\n"; /* $token = $PAYBOXTOKEN; */ -$fulltag = $PAYBOXFULLTAG; +$fulltag = $FULLTAG; /*$payerID = $PAYBOXPAYERID; // Set by newpayment.php $paymentType = $_SESSION['PaymentType']; @@ -173,6 +175,6 @@ print "\n
\n"; htmlPrintOnlinePaymentFooter($mysoc,$langs); -llxFooter(); +llxFooter('', 'public'); $db->close(); diff --git a/htdocs/public/payment/newpayment.php b/htdocs/public/payment/newpayment.php index 4c4b6863aaa..1ea8e7385ea 100644 --- a/htdocs/public/payment/newpayment.php +++ b/htdocs/public/payment/newpayment.php @@ -16,7 +16,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . * - * For test: https://developer.paypal.com/ + * For paypal test: https://developer.paypal.com/ + * For paybox test: ??? */ /** @@ -37,6 +38,7 @@ if (is_numeric($entity)) define("DOLENTITY", $entity); require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; @@ -49,6 +51,9 @@ $langs->load("dict"); $langs->load("bills"); $langs->load("companies"); $langs->load("errors"); +$langs->load("paybox"); // File with generic data + +$action=GETPOST('action','alpha'); // Input are: // type ('invoice','order','contractline'), @@ -62,7 +67,7 @@ $amount=price2num(GETPOST("amount")); if (! GETPOST("currency",'alpha')) $currency=$conf->currency; else $currency=GETPOST("currency",'alpha'); -if (! GETPOST("action")) +if (! $action) { if (! GETPOST("amount") && ! GETPOST("source")) { @@ -81,10 +86,25 @@ if (! GETPOST("action")) } } + +$paymentmethod=''; +$validpaymentmethod=array(); + +// Detect $paymentmethod +foreach($_POST as $key => $val) +{ + if (preg_match('/^dopayment_(.*)$/', $key, $reg)) + { + $paymentmethod=$reg[1]; + break; + } +} + + // Define $urlwithroot //$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root)); //$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file -$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current +$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current. For Paypal payment, we can use internal URL like localhost. $urlok=$urlwithroot.'/public/payment/paymentok.php?'; $urlko=$urlwithroot.'/public/payment/paymentko.php?'; @@ -95,6 +115,7 @@ $ref=$REF=GETPOST('ref','alpha'); $TAG=GETPOST("tag",'alpha'); $FULLTAG=GETPOST("fulltag",'alpha'); // fulltag is tag with more informations $SECUREKEY=GETPOST("securekey"); // Secure key +if ($paymentmethod) $FULLTAG.=($FULLTAG?'.':'').'PM='.$paymentmethod; if (! empty($SOURCE)) { @@ -129,9 +150,10 @@ if (! empty($entity)) $urlok=preg_replace('/&$/','',$urlok); // Remove last & $urlko=preg_replace('/&$/','',$urlko); // Remove last & -$paymentmethod=array(); -// Check parameters + +// Find valid payment methods + if (! empty($conf->paypal->enabled)) { $langs->load("paypal"); @@ -158,7 +180,7 @@ if (! empty($conf->paypal->enabled)) dol_print_error('',"Paypal setup param PAYPAL_API_SIGNATURE not defined"); return -1; } - + // Check security token $valid=true; if (! empty($conf->global->PAYPAL_SECURITY_TOKEN)) @@ -173,28 +195,57 @@ if (! empty($conf->paypal->enabled)) $token = $conf->global->PAYPAL_SECURITY_TOKEN; } if ($SECUREKEY != $token) $valid=false; - + if (! $valid) { print '
Bad value for key.
'; //print 'SECUREKEY='.$SECUREKEY.' token='.$token.' valid='.$valid; exit; } - else - { - $paymentmethod[]='paypal'; - } } + + $validpaymentmethod['paypal']='valid'; } + if (! empty($conf->paybox->enabled)) { $langs->load("paybox"); + // TODO + + $validpaymentmethod['paybox']='valid'; } + // TODO Add check of other payment mode -if (empty($paymentmethod)) accessforbidden('', 0, 0, 1); +// Check security token +$valid=true; +if (! empty($conf->global->PAYMENT_SECURITY_TOKEN)) +{ + if (! empty($conf->global->PAYMENT_SECURITY_TOKEN_UNIQUE)) + { + if ($SOURCE && $REF) $token = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN . $SOURCE . $REF, 2); // Use the source in the hash to avoid duplicates if the references are identical + else $token = dol_hash($conf->global->PAYMENT_SECURITY_TOKEN, 2); + } + else + { + $token = $conf->global->PAYMENT_SECURITY_TOKEN; + } + if ($SECUREKEY != $token) $valid=false; + + if (! $valid) + { + print '
Bad value for key.
'; + //print 'SECUREKEY='.$SECUREKEY.' token='.$token.' valid='.$valid; + exit; + } +} + + + + +if (empty($validpaymentmethod)) accessforbidden('', 0, 0, 1); @@ -202,13 +253,15 @@ if (empty($paymentmethod)) accessforbidden('', 0, 0, 1); * Actions */ -if (GETPOST("action") == 'dopayment') + +if ($action == 'dopayment') { - if (GETPOST('paymentmethod') == 'paypal') + if ($paymentmethod == 'paypal') { $PAYPAL_API_PRICE=price2num(GETPOST("newamount"),'MT'); $PAYPAL_PAYMENT_TYPE='Sale'; + $origfulltag=GETPOST("fulltag",'alpha'); $shipToName=GETPOST("shipToName"); $shipToStreet=GETPOST("shipToStreet"); $shipToCity=GETPOST("shipToCity"); @@ -224,7 +277,7 @@ if (GETPOST("action") == 'dopayment') if (empty($PAYPAL_API_PRICE) || ! is_numeric($PAYPAL_API_PRICE)) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Amount")); //elseif (empty($EMAIL)) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("YourEMail")); //elseif (! isValidEMail($EMAIL)) $mesg=$langs->trans("ErrorBadEMail",$EMAIL); - elseif (empty($FULLTAG)) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("PaymentCode")); + elseif (! $origfulltag) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("PaymentCode")); //var_dump($_POST); if (empty($mesg)) @@ -275,7 +328,14 @@ if (GETPOST("action") == 'dopayment') * View */ -llxHeaderPaypal($langs->trans("PaymentForm")); +$head=''; +if (! empty($conf->global->PAYMENT_CSS_URL)) $head=''."\n"; + +$conf->dol_hide_topmenu=1; +$conf->dol_hide_leftmenu=1; + +llxHeader($head, $langs->trans("PaymentForm"), '', '', 0, 0, '', '', '', 'onlinepaymentbody'); + if (! empty($conf->paypal->enabled)) { @@ -302,12 +362,18 @@ print ''."\n"; print ''; print "\n"; print ''."\n"; +// Additionnal information for each payment system if (! empty($conf->paypal->enabled)) { print ''."\n"; print ''."\n"; print ''."\n"; } +if (! empty($conf->paybox->enabled)) +{ + +} +// TODO Add others print ''."\n"; print ''."\n"; print "\n"; @@ -370,7 +436,7 @@ $error=0; $var=false; // Free payment -if (! GETPOST("source") && $valid) +if (! GETPOST("source")) { $found=true; $tag=GETPOST("tag"); @@ -417,7 +483,7 @@ if (! GETPOST("source") && $valid) // Payment on customer order -if (GETPOST("source") == 'order' && $valid) +if (GETPOST("source") == 'order') { $found=true; $langs->load("orders"); @@ -524,7 +590,7 @@ if (GETPOST("source") == 'order' && $valid) // Payment on customer invoice -if (GETPOST("source") == 'invoice' && $valid) +if (GETPOST("source") == 'invoice') { $found=true; $langs->load("bills"); @@ -630,7 +696,7 @@ if (GETPOST("source") == 'invoice' && $valid) } // Payment on contract line -if (GETPOST("source") == 'contractline' && $valid) +if (GETPOST("source") == 'contractline') { $found=true; $langs->load("contracts"); @@ -825,7 +891,7 @@ if (GETPOST("source") == 'contractline' && $valid) } // Payment on member subscription -if (GETPOST("source") == 'membersubscription' && $valid) +if (GETPOST("source") == 'membersubscription') { $found=true; $langs->load("members"); @@ -971,16 +1037,29 @@ print "\n"; if ($found && ! $error) // We are in a management option and no error { - if (empty($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY)) $conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY='integral'; + // Buttons for all payments registration methods + + if (! empty($conf->paypal->enabled)) + { + if (empty($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY)) $conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY='integral'; + + if ($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY == 'integral') + { + print '
'; + } + if ($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY == 'paypalonly') + { + print '
'; + } + } - if ($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY == 'integral') - { - print '
'; - } - if ($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY == 'paypalonly') - { - print '
'; - } + if (! empty($conf->paypal->enabled)) + { + + + } + + // TODO Other methods } else { @@ -995,8 +1074,8 @@ print ''."\n"; print '
'; -html_print_paypal_footer($mysoc,$langs); +htmlPrintOnlinePaymentFooter($mysoc,$langs); -llxFooterPaypal(); +llxFooter('', 'public'); $db->close(); diff --git a/htdocs/public/payment/paymentko.php b/htdocs/public/payment/paymentko.php index 5bd09f845da..ceface2a9c0 100644 --- a/htdocs/public/payment/paymentko.php +++ b/htdocs/public/payment/paymentko.php @@ -57,16 +57,16 @@ $PAYPALTOKEN=GETPOST('TOKEN'); if (empty($PAYPALTOKEN)) $PAYPALTOKEN=GETPOST('token'); $PAYPALPAYERID=GETPOST('PAYERID'); if (empty($PAYPALPAYERID)) $PAYPALPAYERID=GETPOST('PayerID'); -$PAYPALFULLTAG=GETPOST('FULLTAG'); -if (empty($PAYPALFULLTAG)) $PAYPALFULLTAG=GETPOST('fulltag'); +$FULLTAG=GETPOST('FULLTAG'); +if (empty($FULLTAG)) $FULLTAG=GETPOST('fulltag'); -$paymentmethod=array(); -if (! empty($conf->paypal->enabled)) $paymentmethod['paypal']='paypal'; -if (! empty($conf->paybox->enabled)) $paymentmethod['paybox']='paybox'; +$validpaymentmethod=array(); +if (! empty($conf->paypal->enabled)) $validpaymentmethod['paypal']='paypal'; +if (! empty($conf->paybox->enabled)) $validpaymentmethod['paybox']='paybox'; // Security check -if (empty($paymentmethod)) accessforbidden('', 0, 0, 1); +if (empty($validpaymentmethod)) accessforbidden('', 0, 0, 1); /* @@ -94,7 +94,7 @@ if (! empty($conf->paypal->enabled)) { // Get on url call $token = $PAYPALTOKEN; - $fulltag = $PAYPALFULLTAG; + $fulltag = $FULLTAG; $payerID = $PAYPALPAYERID; // Set by newpayment.php $paymentType = $_SESSION['PaymentType']; @@ -128,7 +128,10 @@ if (! empty($conf->paypal->enabled)) $head=''; if (! empty($conf->global->PAYMENT_CSS_URL)) $head=''."\n"; -llxHeader($head, $langs->trans("PaymentForm")); +$conf->dol_hide_topmenu=1; +$conf->dol_hide_leftmenu=1; + +llxHeader($head, $langs->trans("PaymentForm"), '', '', 0, 0, '', '', '', 'onlinepaymentbody'); // Show ko message @@ -143,6 +146,6 @@ print "\n\n"; htmlPrintOnlinePaymentFooter($mysoc,$langs); -llxFooter(); +llxFooter('', 'public'); $db->close(); diff --git a/htdocs/public/payment/paymentok.php b/htdocs/public/payment/paymentok.php index 221abec032f..c138cc29267 100644 --- a/htdocs/public/payment/paymentok.php +++ b/htdocs/public/payment/paymentok.php @@ -88,28 +88,46 @@ if (! empty($conf->paypal->enabled)) if (empty($PAYPALTOKEN)) $PAYPALTOKEN=GETPOST('token'); $PAYPALPAYERID=GETPOST('PAYERID'); if (empty($PAYPALPAYERID)) $PAYPALPAYERID=GETPOST('PayerID'); - $PAYPALFULLTAG=GETPOST('FULLTAG'); - if (empty($PAYPALFULLTAG)) $PAYPALFULLTAG=GETPOST('fulltag'); + $FULLTAG=GETPOST('FULLTAG'); + if (empty($FULLTAG)) $FULLTAG=GETPOST('fulltag'); } $source=GETPOST('source'); $ref=GETPOST('ref'); -$paymentmethod=array(); -if (! empty($conf->paypal->enabled)) $paymentmethod['paypal']='paypal'; -if (! empty($conf->paybox->enabled)) $paymentmethod['paybox']='paybox'; +// Detect $paymentmethod +$paymentmethod=''; +if (preg_match('/PM=([^\.]+)/', $FULLTAG, $reg)) +{ + $paymentmethod=$reg[1]; +} +if (empty($paymentmethod)) +{ + dol_print_error(null, 'The back url does not contains a parameter fulltag that should help us to find the payment method used'); + exit; +} +else +{ + dol_syslog("paymentmethod=".$paymentmethod); +} + + +$validpaymentmethod=array(); +if (! empty($conf->paypal->enabled)) $validpaymentmethod['paypal']='paypal'; +if (! empty($conf->paybox->enabled)) $validpaymentmethod['paybox']='paybox'; // Security check -if (empty($paymentmethod)) accessforbidden('', 0, 0, 1); +if (empty($validpaymentmethod)) accessforbidden('', 0, 0, 1); +$ispaymentok = false; // If payment is ok $PAYMENTSTATUS=$TRANSACTIONID=$TAXAMT=$NOTE=''; // If payment is ko $ErrorCode=$ErrorShortMsg=$ErrorLongMsg=$ErrorSeverityCode=''; -$ispaymentok = false; + /* @@ -131,8 +149,10 @@ dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_payment'); $head=''; if (! empty($conf->global->PAYMENT_CSS_URL)) $head=''."\n"; +$conf->dol_hide_topmenu=1; +$conf->dol_hide_leftmenu=1; -llxHeader($head, $langs->trans("PaymentForm")); +llxHeader($head, $langs->trans("PaymentForm"), '', '', 0, 0, '', '', '', 'onlinepaymentbody'); @@ -147,7 +167,7 @@ if (! empty($conf->paypal->enabled)) { // Get on url call $token = $PAYPALTOKEN; - $fulltag = $PAYPALFULLTAG; + $fulltag = $FULLTAG; $payerID = $PAYPALPAYERID; // Set by newpayment.php $paymentType = $_SESSION['PaymentType']; @@ -334,6 +354,6 @@ print "\n\n"; htmlPrintOnlinePaymentFooter($mysoc,$langs); -llxFooter(); +llxFooter('', 'public'); $db->close(); diff --git a/htdocs/public/paypal/newpayment.php b/htdocs/public/paypal/newpayment.php index 4acce4ac803..9698f42afa7 100644 --- a/htdocs/public/paypal/newpayment.php +++ b/htdocs/public/paypal/newpayment.php @@ -39,6 +39,7 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypal.lib.php'; require_once DOL_DOCUMENT_ROOT.'/paypal/lib/paypalfunctions.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; @@ -51,7 +52,7 @@ $langs->load("dict"); $langs->load("bills"); $langs->load("companies"); $langs->load("errors"); -$langs->load("paybox"); +$langs->load("paybox"); // File with generic data $langs->load("paypal"); // Input are: @@ -99,6 +100,7 @@ $ref=$REF=GETPOST('ref','alpha'); $TAG=GETPOST("tag",'alpha'); $FULLTAG=GETPOST("fulltag",'alpha'); // fulltag is tag with more informations $SECUREKEY=GETPOST("securekey"); // Secure key +$FULLTAG.=($FULLTAG?'.':'').'PM=paypal'; if (! empty($SOURCE)) { @@ -188,6 +190,7 @@ if (GETPOST("action") == 'dopayment') $PAYPAL_API_PRICE=price2num(GETPOST("newamount"),'MT'); $PAYPAL_PAYMENT_TYPE='Sale'; + $origfulltag=GETPOST("fulltag",'alpha'); $shipToName=GETPOST("shipToName"); $shipToStreet=GETPOST("shipToStreet"); $shipToCity=GETPOST("shipToCity"); @@ -203,7 +206,7 @@ if (GETPOST("action") == 'dopayment') if (empty($PAYPAL_API_PRICE) || ! is_numeric($PAYPAL_API_PRICE)) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Amount")); //elseif (empty($EMAIL)) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("YourEMail")); //elseif (! isValidEMail($EMAIL)) $mesg=$langs->trans("ErrorBadEMail",$EMAIL); - elseif (empty($FULLTAG)) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("PaymentCode")); + elseif (! $origfulltag) $mesg=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("PaymentCode")); //var_dump($_POST); if (empty($mesg)) @@ -254,7 +257,13 @@ if (GETPOST("action") == 'dopayment') * View */ -llxHeaderPaypal($langs->trans("PaymentForm")); +$head=''; +if (! empty($conf->global->PAYPAL_CSS_URL)) $head=''."\n"; + +$conf->dol_hide_topmenu=1; +$conf->dol_hide_leftmenu=1; + +llxHeader($head, $langs->trans("PaymentForm"), '', '', 0, 0, '', '', '', 'onlinepaymentbody'); if (! empty($PAYPAL_API_SANDBOX)) { @@ -968,8 +977,8 @@ print ''."\n"; print '
'; -html_print_paypal_footer($mysoc,$langs); +htmlPrintOnlinePaymentFooter($mysoc,$langs); -llxFooterPaypal(); +llxFooter('', 'public'); $db->close(); diff --git a/htdocs/public/paypal/paymentko.php b/htdocs/public/paypal/paymentko.php index 7436693a1c1..a3ff8b5b7a3 100644 --- a/htdocs/public/paypal/paymentko.php +++ b/htdocs/public/paypal/paymentko.php @@ -56,8 +56,8 @@ $PAYPALTOKEN=GETPOST('TOKEN'); if (empty($PAYPALTOKEN)) $PAYPALTOKEN=GETPOST('token'); $PAYPALPAYERID=GETPOST('PAYERID'); if (empty($PAYPALPAYERID)) $PAYPALPAYERID=GETPOST('PayerID'); -$PAYPALFULLTAG=GETPOST('FULLTAG'); -if (empty($PAYPALFULLTAG)) $PAYPALFULLTAG=GETPOST('fulltag'); +$FULLTAG=GETPOST('FULLTAG'); +if (empty($FULLTAG)) $FULLTAG=GETPOST('fulltag'); /* @@ -83,7 +83,7 @@ if (! empty($conf->global->PAYPAL_PAYONLINE_SENDEMAIL)) { // Get on url call $token = $PAYPALTOKEN; - $fulltag = $PAYPALFULLTAG; + $fulltag = $FULLTAG; $payerID = $PAYPALPAYERID; // Set by newpayment.php $paymentType = $_SESSION['PaymentType']; @@ -117,8 +117,10 @@ if (! empty($conf->global->PAYPAL_PAYONLINE_SENDEMAIL)) $head=''; if (! empty($conf->global->PAYPAL_CSS_URL)) $head=''."\n"; +$conf->dol_hide_topmenu=1; +$conf->dol_hide_leftmenu=1; -llxHeader($head, $langs->trans("PaymentForm")); +llxHeader($head, $langs->trans("PaymentForm"), '', '', 0, 0, '', '', '', 'onlinepaymentbody'); // Show ko message @@ -133,6 +135,6 @@ print "\n\n"; htmlPrintOnlinePaymentFooter($mysoc,$langs); -llxFooter(); +llxFooter('', 'public'); $db->close(); diff --git a/htdocs/public/paypal/paymentok.php b/htdocs/public/paypal/paymentok.php index 984c282d161..c38612c8ac8 100644 --- a/htdocs/public/paypal/paymentok.php +++ b/htdocs/public/paypal/paymentok.php @@ -87,8 +87,8 @@ $PAYPALTOKEN=GETPOST('TOKEN'); if (empty($PAYPALTOKEN)) $PAYPALTOKEN=GETPOST('token'); $PAYPALPAYERID=GETPOST('PAYERID'); if (empty($PAYPALPAYERID)) $PAYPALPAYERID=GETPOST('PayerID'); -$PAYPALFULLTAG=GETPOST('FULLTAG'); -if (empty($PAYPALFULLTAG)) $PAYPALFULLTAG=GETPOST('fulltag'); +$FULLTAG=GETPOST('FULLTAG'); +if (empty($FULLTAG)) $FULLTAG=GETPOST('fulltag'); /* @@ -111,8 +111,10 @@ dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_paypal'); $head=''; if (! empty($conf->global->PAYPAL_CSS_URL)) $head=''."\n"; +$conf->dol_hide_topmenu=1; +$conf->dol_hide_leftmenu=1; -llxHeader($head, $langs->trans("PaymentForm")); +llxHeader($head, $langs->trans("PaymentForm"), '', '', 0, 0, '', '', '', 'onlinepaymentbody'); // Show message @@ -123,7 +125,7 @@ if ($PAYPALTOKEN) { // Get on url call $token = $PAYPALTOKEN; - $fulltag = $PAYPALFULLTAG; + $fulltag = $FULLTAG; $payerID = $PAYPALPAYERID; // Set by newpayment.php $paymentType = $_SESSION['PaymentType']; @@ -289,6 +291,6 @@ print "\n\n"; htmlPrintOnlinePaymentFooter($mysoc,$langs); -llxFooter(); +llxFooter('', 'public'); $db->close(); diff --git a/htdocs/societe/checkvat/checkVatPopup.php b/htdocs/societe/checkvat/checkVatPopup.php index dd1cd7df740..f1e56d4a359 100644 --- a/htdocs/societe/checkvat/checkVatPopup.php +++ b/htdocs/societe/checkvat/checkVatPopup.php @@ -34,8 +34,12 @@ $WS_DOL_URL_WSDL='http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl $WS_METHOD ='checkVat'; -top_htmlhead("", $langs->trans("VATIntraCheckableOnEUSite")); -print ''; + +$conf->dol_hide_topmenu=1; +$conf->dol_hide_leftmenu=1; + +llxHeader('', $langs->trans("VATIntraCheckableOnEUSite")); + print '
'; print '
'; diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index f1d17801072..39f17317076 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -988,6 +988,9 @@ div.fiche { dol_hide_leftmenu) && ! empty($conf->dol_hide_topmenu)) print 'margin-top: 4px;'."\n"; ?> dol_hide_leftmenu)) print 'margin-bottom: 12px;'."\n"; ?> } +body.onlinepaymentbody div.fiche { /* For online payment page */ + margin: 40px !important; +} div.fiche>table:first-child { margin-bottom: 15px !important; } diff --git a/htdocs/websites/frametop.php b/htdocs/websites/frametop.php index 9001691b72c..7cebf239e28 100644 --- a/htdocs/websites/frametop.php +++ b/htdocs/websites/frametop.php @@ -28,11 +28,14 @@ require ("../main.inc.php"); $langs->load("externalsite"); top_htmlhead("",""); + +print '' . "\n"; + top_menu("","","_top"); +print ''; /* $website = new Website($db); $listofwebsites = $website->fetchAll(); */ -print 'rrr'; diff --git a/htdocs/websites/index.php b/htdocs/websites/index.php index b78a172e01f..e7dbb898145 100644 --- a/htdocs/websites/index.php +++ b/htdocs/websites/index.php @@ -38,7 +38,7 @@ define('NOSTYLECHECK',1); * @param int $disablehead More content into html header * @param array $arrayofjs Array of complementary js files * @param array $arrayofcss Array of complementary css files - * @param string $morequerystring Query string to add to the link "print" to get same parameters (use only if autodetect fails) + * @param string $morequerystring Query string to add to the link "print" to get same parameters (set this only if autodetect fails) * @return void */ function llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='') @@ -48,6 +48,8 @@ function llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, // html header top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss); + print ''; + // top menu and left menu area if (empty($conf->dol_hide_topmenu)) { From 1e825e9f1e657d153fe8919715f72056f02c08c2 Mon Sep 17 00:00:00 2001 From: philippe grand Date: Sat, 13 May 2017 17:25:35 +0200 Subject: [PATCH 110/299] Update code using new css class --- htdocs/don/admin/donation.php | 16 ++++------------ htdocs/don/card.php | 5 +---- 2 files changed, 5 insertions(+), 16 deletions(-) diff --git a/htdocs/don/admin/donation.php b/htdocs/don/admin/donation.php index 98000ad6e98..2888b911700 100644 --- a/htdocs/don/admin/donation.php +++ b/htdocs/don/admin/donation.php @@ -1,7 +1,7 @@ * Copyright (C) 2012-2015 Juanjo Menent - * Copyright (C) 2013-2016 Philippe Grand + * Copyright (C) 2013-2017 Philippe Grand * Copyright (C) 2015 Alexandre Spangaro * Copyright (C) 2015 Benoit Bruchard * @@ -250,14 +250,12 @@ clearstatcache(); $handle=opendir($dir); -$var=True; if (is_resource($handle)) { while (($file = readdir($handle))!==false) { if (preg_match('/\.modules\.php$/i',$file)) { - $var = !$var; $name = substr($file, 0, dol_strlen($file) -12); $classname = substr($file, 0, dol_strlen($file) -12); @@ -353,13 +351,11 @@ print '
'; print '\n"; print ''; print "\n"; -$var=true; print ''; print ''; print ''; -$var=! $var; print ''; print ''; print ''; print "\n"; - - print ""; + print ''; print ''; if (! empty($conf->global->DONATION_ART200)) { print ''; } print ''; - - print ""; + print ''; print ''; if (! empty($conf->global->DONATION_ART238)) { print ''; } print ''; - - print ""; + print ''; print ''; if (! empty($conf->global->DONATION_ART885)) { print ''; print ''; - $var=True; while ($i < $num) { $objp = $db->fetch_object($resql); - print "'; print '\n"; $labeltype=$langs->trans("PaymentType".$objp->type_code)!=("PaymentType".$objp->type_code)?$langs->trans("PaymentType".$objp->type_code):$objp->paiement_type; @@ -809,8 +808,6 @@ if (! empty($id) && $action != 'edit') $genallowed = ($object->statut == 2 && ($object->paid == 0 || $user->admin) && $user->rights->don->creer); $delallowed = $user->rights->don->supprimer; - $var=true; - print $formfile->showdocuments('donation',$filename,$filedir,$urlsource,$genallowed,$delallowed,$object->modelpdf); print '
'; From 70b73c73f7d3004dae99686b0b7d0213ae338128 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 13 May 2017 18:34:57 +0200 Subject: [PATCH 111/299] Fix coding style --- htdocs/cashdesk/validation_verif.php | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/htdocs/cashdesk/validation_verif.php b/htdocs/cashdesk/validation_verif.php index 3328fa52886..0722b3fb92e 100644 --- a/htdocs/cashdesk/validation_verif.php +++ b/htdocs/cashdesk/validation_verif.php @@ -39,15 +39,11 @@ $bankaccountid=GETPOST('cashdeskbank'); switch ($action) { - default: - - $redirection = DOL_URL_ROOT.'/cashdesk/affIndex.php?menutpl=validation'; + $redirection = DOL_URL_ROOT.'/cashdesk/affIndex.php?menutpl=validation'; break; - case 'valide_achat': - $thirdpartyid = $_SESSION['CASHDESK_ID_THIRDPARTY']; $company=new Societe($db); @@ -115,13 +111,11 @@ switch ($action) case 'retour': - $redirection = 'affIndex.php?menutpl=facturation'; break; case 'valide_facture': - $now=dol_now(); // Recuperation de la date et de l'heure @@ -363,3 +357,4 @@ switch ($action) $_SESSION['serObjFacturation'] = serialize($obj_facturation); header('Location: '.$redirection); +exit; From 553f5b990c910bc181af2d4e44fdbaf7e31b12c9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 13 May 2017 18:50:55 +0200 Subject: [PATCH 112/299] Fix scrutinizer errors --- htdocs/accountancy/admin/categories_list.php | 6 +++--- htdocs/admin/dict.php | 13 +++++++------ htdocs/comm/mailing/class/mailing.class.php | 2 +- htdocs/commande/class/commande.class.php | 5 ----- 4 files changed, 11 insertions(+), 15 deletions(-) diff --git a/htdocs/accountancy/admin/categories_list.php b/htdocs/accountancy/admin/categories_list.php index 0580a9688ed..14475119461 100644 --- a/htdocs/accountancy/admin/categories_list.php +++ b/htdocs/accountancy/admin/categories_list.php @@ -669,7 +669,7 @@ if ($id) if (empty($reshook)) { - fieldList($fieldlist,$obj,$tabname[$id],'add'); + fieldListAccountingCategories($fieldlist,$obj,$tabname[$id],'add'); } print '
'; print ''; @@ -1147,7 +1147,7 @@ $db->close(); * @param string $context 'add'=Output field for the "add form", 'edit'=Output field for the "edit form", 'hide'=Output field for the "add form" but we dont want it to be rendered * @return void */ -function fieldList($fieldlist, $obj='', $tabname='', $context='') +function fieldListAccountingCategories($fieldlist, $obj='', $tabname='', $context='') { global $conf,$langs,$db; global $form, $mysoc; diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index c2730e6c034..28e99d02606 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -1753,15 +1753,16 @@ function fieldList($fieldlist, $obj='', $tabname='', $context='') print ''; continue; } // For region page, we do not show the country input $valuetoshow=$langs->trans("Country"); } - if ($fieldlist[$field]=='recuperableonly') { $valuetoshow=$langs->trans("NPR"); $align="center"; } - if ($fieldlist[$field]=='nbjour') { $valuetoshow=$langs->trans("NbOfDays"); } - if ($fieldlist[$field]=='type_cdr') { $valuetoshow=$langs->trans("AtEndOfMonth"); $align="center"; } - if ($fieldlist[$field]=='decalage') { $valuetoshow=$langs->trans("Offset"); } - if ($fieldlist[$field]=='width' || $fieldlist[$field]=='nx') { $valuetoshow=$langs->trans("Width"); } - if ($fieldlist[$field]=='height' || $fieldlist[$field]=='ny') { $valuetoshow=$langs->trans("Height"); } - if ($fieldlist[$field]=='unit' || $fieldlist[$field]=='metric') { $valuetoshow=$langs->trans("MeasuringUnit"); } if ($fieldlist[$field]=='region_id' || $fieldlist[$field]=='country_id') { $valuetoshow=''; } if ($fieldlist[$field]=='accountancy_code'){ $valuetoshow=$langs->trans("AccountancyCode"); } if ($fieldlist[$field]=='accountancy_code_sell'){ $valuetoshow=$langs->trans("AccountancyCodeSell"); } if ($fieldlist[$field]=='accountancy_code_buy'){ $valuetoshow=$langs->trans("AccountancyCodeBuy"); } if ($fieldlist[$field]=='pcg_version' || $fieldlist[$field]=='fk_pcg_version') { $valuetoshow=$langs->trans("Pcg_version"); } - if ($fieldlist[$field]=='account_parent') { $valuetoshow=$langs->trans("Accountparent"); } - if ($fieldlist[$field]=='pcg_type') { $valuetoshow=$langs->trans("Pcg_type"); } - if ($fieldlist[$field]=='pcg_subtype') { $valuetoshow=$langs->trans("Pcg_subtype"); } - if ($fieldlist[$field]=='sortorder') { $valuetoshow=$langs->trans("SortOrder"); } - if ($fieldlist[$field]=='short_label') { $valuetoshow=$langs->trans("ShortLabel"); } - if ($fieldlist[$field]=='type_template') { $valuetoshow=$langs->trans("TypeOfTemplate"); } - if ($fieldlist[$field]=='range_account') { $valuetoshow=$langs->trans("Range"); } + if ($fieldlist[$field]=='range_account') { $valuetoshow=$langs->trans("Range"); } if ($fieldlist[$field]=='sens') { $valuetoshow=$langs->trans("Sens"); } if ($fieldlist[$field]=='category_type') { $valuetoshow=$langs->trans("Calculated"); } - if ($fieldlist[$field]=='formula') { $valuetoshow=$langs->trans("Formula"); } - if ($fieldlist[$field]=='paper_size') { $valuetoshow=$langs->trans("PaperSize"); } - if ($fieldlist[$field]=='orientation') { $valuetoshow=$langs->trans("Orientation"); } - if ($fieldlist[$field]=='leftmargin') { $valuetoshow=$langs->trans("LeftMargin"); } - if ($fieldlist[$field]=='topmargin') { $valuetoshow=$langs->trans("TopMargin"); } - if ($fieldlist[$field]=='spacex') { $valuetoshow=$langs->trans("SpaceX"); } - if ($fieldlist[$field]=='spacey') { $valuetoshow=$langs->trans("SpaceY"); } - if ($fieldlist[$field]=='font_size') { $valuetoshow=$langs->trans("FontSize"); } - if ($fieldlist[$field]=='custom_x') { $valuetoshow=$langs->trans("CustomX"); } - if ($fieldlist[$field]=='custom_y') { $valuetoshow=$langs->trans("CustomY"); } - if ($fieldlist[$field]=='content') { $valuetoshow=$langs->trans("Content"); } - if ($fieldlist[$field]=='percent') { $valuetoshow=$langs->trans("Percentage"); } - if ($fieldlist[$field]=='affect') { $valuetoshow=$langs->trans("Info"); } - if ($fieldlist[$field]=='delay') { $valuetoshow=$langs->trans("NoticePeriod"); } - if ($fieldlist[$field]=='newbymonth') { $valuetoshow=$langs->trans("NewByMonth"); } if ($valuetoshow != '') { @@ -639,7 +565,6 @@ if ($id) if ($fieldlist[$field]=='libelle' || $fieldlist[$field]=='label') $alabelisused=1; } - if ($id == 4) print ''; print ''; @@ -649,7 +574,7 @@ if ($id) print ''; // Line to enter new values - print ""; + print ''; $obj = new stdClass(); // If data was already input, we define them in obj to populate input fields. @@ -679,15 +604,9 @@ if ($id) $colspan=count($fieldlist)+3; - if (! empty($alabelisused)) // If there is one label among fields, we show legend of * - { - print ''; - } print ''; // Keep   to have a line with enough height } - - // List of available record in database dol_syslog("htdocs/admin/dict", LOG_DEBUG); $resql=$db->query($sql); @@ -712,101 +631,8 @@ if ($id) print ''; } - // Title of lines - print ''; - foreach ($fieldlist as $field => $value) - { - // Determine le nom du champ par rapport aux noms possibles - // dans les dictionnaires de donnees - $showfield=1; // By defaut - $align="left"; - $sortable=1; - $valuetoshow=''; - /* - $tmparray=getLabelOfField($fieldlist[$field]); - $showfield=$tmp['showfield']; - $valuetoshow=$tmp['valuetoshow']; - $align=$tmp['align']; - $sortable=$tmp['sortable']; - */ - $valuetoshow=ucfirst($fieldlist[$field]); // By defaut - $valuetoshow=$langs->trans($valuetoshow); // try to translate - if ($fieldlist[$field]=='source') { $valuetoshow=$langs->trans("Contact"); } - if ($fieldlist[$field]=='price') { $valuetoshow=$langs->trans("PriceUHT"); } - if ($fieldlist[$field]=='taux') { - if ($tabname[$id] != MAIN_DB_PREFIX."c_revenuestamp") $valuetoshow=$langs->trans("Rate"); - else $valuetoshow=$langs->trans("Amount"); - $align='center'; - } - if ($fieldlist[$field]=='localtax1_type') { $valuetoshow=$langs->trans("UseLocalTax")." 2"; $align="center"; $sortable=0; } - if ($fieldlist[$field]=='localtax1') { $valuetoshow=$langs->trans("Rate")." 2"; $align="center"; $sortable=0; } - if ($fieldlist[$field]=='localtax2_type') { $valuetoshow=$langs->trans("UseLocalTax")." 3"; $align="center"; $sortable=0; } - if ($fieldlist[$field]=='localtax2') { $valuetoshow=$langs->trans("Rate")." 3"; $align="center"; $sortable=0; } - if ($fieldlist[$field]=='organization') { $valuetoshow=$langs->trans("Organization"); } - if ($fieldlist[$field]=='lang') { $valuetoshow=$langs->trans("Language"); } - if ($fieldlist[$field]=='type') { $valuetoshow=$langs->trans("Type"); } - if ($fieldlist[$field]=='code') { $valuetoshow=$langs->trans("Code"); } - if ($fieldlist[$field]=='libelle' || $fieldlist[$field]=='label') - { - $valuetoshow=$langs->trans("Label"); - if ($id != 25) $valuetoshow.="*"; - } - if ($fieldlist[$field]=='libelle_facture') { $valuetoshow=$langs->trans("LabelOnDocuments")."*"; } - if ($fieldlist[$field]=='country') { $valuetoshow=$langs->trans("Country"); } - if ($fieldlist[$field]=='recuperableonly') { $valuetoshow=$langs->trans("NPR"); $align="center"; } - if ($fieldlist[$field]=='nbjour') { $valuetoshow=$langs->trans("NbOfDays"); } - if ($fieldlist[$field]=='type_cdr') { $valuetoshow=$langs->trans("AtEndOfMonth"); $align="center"; } - if ($fieldlist[$field]=='decalage') { $valuetoshow=$langs->trans("Offset"); } - if ($fieldlist[$field]=='width' || $fieldlist[$field]=='nx') { $valuetoshow=$langs->trans("Width"); } - if ($fieldlist[$field]=='height' || $fieldlist[$field]=='ny') { $valuetoshow=$langs->trans("Height"); } - if ($fieldlist[$field]=='unit' || $fieldlist[$field]=='metric') { $valuetoshow=$langs->trans("MeasuringUnit"); } - if ($fieldlist[$field]=='region_id' || $fieldlist[$field]=='country_id') { $showfield=0; } - if ($fieldlist[$field]=='accountancy_code'){ $valuetoshow=$langs->trans("AccountancyCode"); } - if ($fieldlist[$field]=='accountancy_code_sell'){ $valuetoshow=$langs->trans("AccountancyCodeSell"); $sortable=0; } - if ($fieldlist[$field]=='accountancy_code_buy'){ $valuetoshow=$langs->trans("AccountancyCodeBuy"); $sortable=0; } - if ($fieldlist[$field]=='fk_pcg_version') { $valuetoshow=$langs->trans("Pcg_version"); } - if ($fieldlist[$field]=='account_parent') { $valuetoshow=$langs->trans("Accountsparent"); } - if ($fieldlist[$field]=='pcg_type') { $valuetoshow=$langs->trans("Pcg_type"); } - if ($fieldlist[$field]=='pcg_subtype') { $valuetoshow=$langs->trans("Pcg_subtype"); } - if ($fieldlist[$field]=='sortorder') { $valuetoshow=$langs->trans("SortOrder"); } - if ($fieldlist[$field]=='short_label') { $valuetoshow=$langs->trans("ShortLabel"); } - if ($fieldlist[$field]=='type_template') { $valuetoshow=$langs->trans("TypeOfTemplate"); } - if ($fieldlist[$field]=='range_account') { $valuetoshow=$langs->trans("Range"); } - if ($fieldlist[$field]=='sens') { $valuetoshow=$langs->trans("Sens"); } - if ($fieldlist[$field]=='category_type') { $valuetoshow=$langs->trans("Calculated"); } - if ($fieldlist[$field]=='formula') { $valuetoshow=$langs->trans("Formula"); } - if ($fieldlist[$field]=='paper_size') { $valuetoshow=$langs->trans("PaperSize"); } - if ($fieldlist[$field]=='orientation') { $valuetoshow=$langs->trans("Orientation"); } - if ($fieldlist[$field]=='leftmargin') { $valuetoshow=$langs->trans("LeftMargin"); } - if ($fieldlist[$field]=='topmargin') { $valuetoshow=$langs->trans("TopMargin"); } - if ($fieldlist[$field]=='spacex') { $valuetoshow=$langs->trans("SpaceX"); } - if ($fieldlist[$field]=='spacey') { $valuetoshow=$langs->trans("SpaceY"); } - if ($fieldlist[$field]=='font_size') { $valuetoshow=$langs->trans("FontSize"); } - if ($fieldlist[$field]=='custom_x') { $valuetoshow=$langs->trans("CustomX"); } - if ($fieldlist[$field]=='custom_y') { $valuetoshow=$langs->trans("CustomY"); } - if ($fieldlist[$field]=='content') { $valuetoshow=$langs->trans("Content"); } - if ($fieldlist[$field]=='percent') { $valuetoshow=$langs->trans("Percentage"); } - if ($fieldlist[$field]=='affect') { $valuetoshow=$langs->trans("Info"); } - if ($fieldlist[$field]=='delay') { $valuetoshow=$langs->trans("NoticePeriod"); } - if ($fieldlist[$field]=='newbymonth') { $valuetoshow=$langs->trans("NewByMonth"); } - - // Affiche nom du champ - if ($showfield) - { - print getTitleFieldOfList($valuetoshow, 0, $_SERVER["PHP_SELF"], ($sortable?$fieldlist[$field]:''), ($page?'page='.$page.'&':''), $param, "align=".$align, $sortfield, $sortorder); - } - } - // Favorite - Only activated on country dictionary - if ($id == 4) print getTitleFieldOfList($langs->trans("Favorite"), 0, $_SERVER["PHP_SELF"], "favorite", ($page?'page='.$page.'&':''), $param, 'align="center"', $sortfield, $sortorder); - - print getTitleFieldOfList($langs->trans("Status"), 0, $_SERVER["PHP_SELF"], "active", ($page?'page='.$page.'&':''), $param, 'align="center"', $sortfield, $sortorder); - print getTitleFieldOfList(''); - print getTitleFieldOfList(''); - print getTitleFieldOfList(''); - print ''; - // Title line with search boxes - print ''; + print ''; $filterfound=0; foreach ($fieldlist as $field => $value) { @@ -829,7 +655,6 @@ if ($id) } } } - if ($id == 4) print ''; print ''; print ''; print ''; @@ -841,7 +666,59 @@ if ($id) } print ''; print ''; - + + // Title of lines + print ''; + foreach ($fieldlist as $field => $value) + { + // Determine le nom du champ par rapport aux noms possibles + // dans les dictionnaires de donnees + $showfield=1; // By defaut + $align="left"; + $sortable=1; + $valuetoshow=''; + + $valuetoshow=ucfirst($fieldlist[$field]); // By defaut + $valuetoshow=$langs->trans($valuetoshow); // try to translate + if ($fieldlist[$field]=='source') { $valuetoshow=$langs->trans("Contact"); } + if ($fieldlist[$field]=='price') { $valuetoshow=$langs->trans("PriceUHT"); } + if ($fieldlist[$field]=='taux') { + if ($tabname[$id] != MAIN_DB_PREFIX."c_revenuestamp") $valuetoshow=$langs->trans("Rate"); + else $valuetoshow=$langs->trans("Amount"); + $align='center'; + } + if ($fieldlist[$field]=='type') { $valuetoshow=$langs->trans("Type"); } + if ($fieldlist[$field]=='code') { $valuetoshow=$langs->trans("Code"); } + if ($fieldlist[$field]=='libelle' || $fieldlist[$field]=='label') + { + $valuetoshow=$langs->trans("Label"); + if ($id != 25) $valuetoshow.="*"; + } + if ($fieldlist[$field]=='country') { $valuetoshow=$langs->trans("Country"); } + if ($fieldlist[$field]=='region_id' || $fieldlist[$field]=='country_id') { $showfield=0; } + if ($fieldlist[$field]=='accountancy_code'){ $valuetoshow=$langs->trans("AccountancyCode"); } + if ($fieldlist[$field]=='accountancy_code_sell'){ $valuetoshow=$langs->trans("AccountancyCodeSell"); $sortable=0; } + if ($fieldlist[$field]=='accountancy_code_buy'){ $valuetoshow=$langs->trans("AccountancyCodeBuy"); $sortable=0; } + if ($fieldlist[$field]=='fk_pcg_version') { $valuetoshow=$langs->trans("Pcg_version"); } + if ($fieldlist[$field]=='account_parent') { $valuetoshow=$langs->trans("Accountsparent"); } + if ($fieldlist[$field]=='pcg_type') { $valuetoshow=$langs->trans("Pcg_type"); } + if ($fieldlist[$field]=='pcg_subtype') { $valuetoshow=$langs->trans("Pcg_subtype"); } + if ($fieldlist[$field]=='type_template') { $valuetoshow=$langs->trans("TypeOfTemplate"); } + if ($fieldlist[$field]=='range_account') { $valuetoshow=$langs->trans("Range"); } + if ($fieldlist[$field]=='sens') { $valuetoshow=$langs->trans("Sens"); } + if ($fieldlist[$field]=='category_type') { $valuetoshow=$langs->trans("Calculated"); } + // Affiche nom du champ + if ($showfield) + { + print getTitleFieldOfList($valuetoshow, 0, $_SERVER["PHP_SELF"], ($sortable?$fieldlist[$field]:''), ($page?'page='.$page.'&':''), $param, "align=".$align, $sortfield, $sortorder); + } + } + print getTitleFieldOfList($langs->trans("Status"), 0, $_SERVER["PHP_SELF"], "active", ($page?'page='.$page.'&':''), $param, 'align="center"', $sortfield, $sortorder); + print getTitleFieldOfList(''); + print getTitleFieldOfList(''); + print getTitleFieldOfList(''); + print ''; + if ($num) { // Lines with values @@ -912,19 +789,6 @@ if ($id) $valuetoshow=($key != "Country".strtoupper($obj->country_code)?$obj->country_code." - ".$key:$obj->country); } } - else if ($fieldlist[$field]=='recuperableonly' || $fieldlist[$field] == 'deductible' || $fieldlist[$field] == 'category_type') { - $valuetoshow=yn($valuetoshow); - $align="center"; - } - else if ($fieldlist[$field]=='type_cdr') { - if(empty($valuetoshow)) $valuetoshow = $langs->trans('None'); - elseif($valuetoshow == 1) $valuetoshow = $langs->trans('AtEndOfMonth'); - elseif($valuetoshow == 2) $valuetoshow = $langs->trans('CurrentNext'); - $align="center"; - } - else if ($fieldlist[$field]=='price' || preg_match('/^amount/i',$fieldlist[$field])) { - $valuetoshow=price($valuetoshow); - } else if ($fieldlist[$field]=='libelle_facture') { $langs->load("bills"); $key=$langs->trans("PaymentCondition".strtoupper($obj->code)); @@ -1003,9 +867,6 @@ if ($id) else if ($fieldlist[$field]=='region_id' || $fieldlist[$field]=='country_id') { $showfield=0; } - else if ($fieldlist[$field]=='unicode') { - $valuetoshow = $langs->getCurrencySymbol($obj->code,1); - } else if ($fieldlist[$field]=='label' && $tabname[$_GET["id"]]==MAIN_DB_PREFIX.'c_units') { $langs->load("products"); $valuetoshow=$langs->trans($obj->{$fieldlist[$field]}); @@ -1014,32 +875,6 @@ if ($id) $langs->load("products"); $valuetoshow = $langs->trans($obj->{$fieldlist[$field]}); } - else if (($fieldlist[$field] == 'unit') && ($tabname[$id] == MAIN_DB_PREFIX.'c_paper_format')) - { - $key = $langs->trans('SizeUnit'.strtolower($obj->unit)); - $valuetoshow = ($obj->code && $key != 'SizeUnit'.strtolower($obj->unit) ? $key : $obj->{$fieldlist[$field]}); - } - else if ($fieldlist[$field]=='localtax1' || $fieldlist[$field]=='localtax2') { - $align="center"; - } - else if ($fieldlist[$field]=='localtax1_type') { - if ($obj->localtax1 != 0) - $valuetoshow=$localtax_typeList[$valuetoshow]; - else - $valuetoshow = ''; - $align="center"; - } - else if ($fieldlist[$field]=='localtax2_type') { - if ($obj->localtax2 != 0) - $valuetoshow=$localtax_typeList[$valuetoshow]; - else - $valuetoshow = ''; - $align="center"; - } - else if ($fieldlist[$field]=='taux') { - $valuetoshow = price($valuetoshow, 0, $langs, 0, 0); - $align="center"; - } else if (in_array($fieldlist[$field],array('recuperableonly'))) { $align="center"; @@ -1057,7 +892,7 @@ if ($id) // Can an entry be erased or disabled ? $iserasable=1;$canbedisabled=1;$canbemodified=1; // true by default - if (isset($obj->code) && $id != 10) + if (isset($obj->code)) { if (($obj->code == '0' || $obj->code == '' || preg_match('/unknown/i',$obj->code))) { $iserasable = 0; $canbedisabled = 0; } else if ($obj->code == 'RECEP') { $iserasable = 0; $canbedisabled = 0; } @@ -1073,16 +908,6 @@ if ($id) if ($param) $url .= '&'.$param; $url.='&'; - // Favorite - // Only activated on country dictionary - if ($id == 4) - { - print ''; - } - // Active print ''."\n"; diff --git a/htdocs/public/paypal/newpayment.php b/htdocs/public/paypal/newpayment.php index cd963eec798..c9cedcfd32d 100644 --- a/htdocs/public/paypal/newpayment.php +++ b/htdocs/public/paypal/newpayment.php @@ -418,10 +418,13 @@ if (GETPOST("source") == 'order') $result=$order->fetch_thirdparty($order->socid); } - $amount=$order->total_ttc; - if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); - $amount=price2num($amount); - + if ($action != 'dopayment') // Do not change amount if we just click on first dopayment + { + $amount=$order->total_ttc; + if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); + $amount=price2num($amount); + } + $fulltag='ORD='.$order->ref.'.CUS='.$order->thirdparty->id; //$fulltag.='.NAM='.strtr($order->thirdparty->name,"-"," "); if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; } @@ -525,10 +528,13 @@ if (GETPOST("source") == 'invoice') $result=$invoice->fetch_thirdparty($invoice->socid); } - $amount=price2num($invoice->total_ttc - $invoice->getSommePaiement()); - if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); - $amount=price2num($amount); - + if ($action != 'dopayment') // Do not change amount if we just click on first dopayment + { + $amount=price2num($invoice->total_ttc - $invoice->getSommePaiement()); + if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); + $amount=price2num($amount); + } + $fulltag='INV='.$invoice->ref.'.CUS='.$invoice->thirdparty->id; //$fulltag.='.NAM='.strtr($invoice->thirdparty->name,"-"," "); if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; } @@ -649,35 +655,38 @@ if (GETPOST("source") == 'contractline') } } - $amount=$contractline->total_ttc; - if ($contractline->fk_product) - { - $product=new Product($db); - $result=$product->fetch($contractline->fk_product); - - // We define price for product (TODO Put this in a method in product class) - if (! empty($conf->global->PRODUIT_MULTIPRICES)) - { - $pu_ht = $product->multiprices[$contract->thirdparty->price_level]; - $pu_ttc = $product->multiprices_ttc[$contract->thirdparty->price_level]; - $price_base_type = $product->multiprices_base_type[$contract->thirdparty->price_level]; - } - else - { - $pu_ht = $product->price; - $pu_ttc = $product->price_ttc; - $price_base_type = $product->price_base_type; - } - - $amount=$pu_ttc; - if (empty($amount)) - { - dol_print_error('','ErrorNoPriceDefinedForThisProduct'); - exit; - } - } - if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); - $amount=price2num($amount); + if ($action != 'dopayment') // Do not change amount if we just click on first dopayment + { + $amount=$contractline->total_ttc; + if ($contractline->fk_product) + { + $product=new Product($db); + $result=$product->fetch($contractline->fk_product); + + // We define price for product (TODO Put this in a method in product class) + if (! empty($conf->global->PRODUIT_MULTIPRICES)) + { + $pu_ht = $product->multiprices[$contract->thirdparty->price_level]; + $pu_ttc = $product->multiprices_ttc[$contract->thirdparty->price_level]; + $price_base_type = $product->multiprices_base_type[$contract->thirdparty->price_level]; + } + else + { + $pu_ht = $product->price; + $pu_ttc = $product->price_ttc; + $price_base_type = $product->price_base_type; + } + + $amount=$pu_ttc; + if (empty($amount)) + { + dol_print_error('','ErrorNoPriceDefinedForThisProduct'); + exit; + } + } + if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); + $amount=price2num($amount); + } $fulltag='COL='.$contractline->ref.'.CON='.$contract->ref.'.CUS='.$contract->thirdparty->id.'.DAT='.dol_print_date(dol_now(),'%Y%m%d%H%M'); //$fulltag.='.NAM='.strtr($contract->thirdparty->name,"-"," "); @@ -827,10 +836,13 @@ if (GETPOST("source") == 'membersubscription') $subscription=new Subscription($db); } - $amount=$subscription->total_ttc; - if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); - $amount=price2num($amount); - + if ($action != 'dopayment') // Do not change amount if we just click on first dopayment + { + $amount=$subscription->total_ttc; + if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); + $amount=price2num($amount); + } + $fulltag='MEM='.$member->id.'.DAT='.dol_print_date(dol_now(),'%Y%m%d%H%M'); if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; } $fulltag=dol_string_unaccent($fulltag); diff --git a/htdocs/public/stripe/index.php b/htdocs/public/stripe/index.php index 0b7ad1c82e4..6a86f3ed88e 100644 --- a/htdocs/public/stripe/index.php +++ b/htdocs/public/stripe/index.php @@ -16,7 +16,7 @@ */ /** - * \file htdocs/public/paybox/index.php + * \file htdocs/public/stripe/index.php * \ingroup core * \brief A redirect page to an error * \author Laurent Destailleur diff --git a/htdocs/public/stripe/newpayment.php b/htdocs/public/stripe/newpayment.php index 0d6cefd357a..95f0f9f2134 100644 --- a/htdocs/public/stripe/newpayment.php +++ b/htdocs/public/stripe/newpayment.php @@ -23,213 +23,1145 @@ * \brief Page to do payment with Stripe */ -define("NOLOGIN",1); -define("NOCSRFCHECK",1); +define("NOLOGIN",1); // This means this output page does not require to be logged. +define("NOCSRFCHECK",1); // We accept to go on this page from external web site. + +// For MultiCompany module. +// Do not use GETPOST here, function is not defined and define must be done before including main.inc.php +// TODO This should be useless. Because entity must be retreive from object ref and not from url. +$entity=(! empty($_GET['entity']) ? (int) $_GET['entity'] : (! empty($_POST['entity']) ? (int) $_POST['entity'] : 1)); +if (is_numeric($entity)) define("DOLENTITY", $entity); require '../../main.inc.php'; + +require_once DOL_DOCUMENT_ROOT.'/stripe/config.php'; +/* included into config.php +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; require_once DOL_DOCUMENT_ROOT.'/stripe/lib/stripe.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/public/stripe/config.php'; require_once DOL_DOCUMENT_ROOT.'/includes/stripe/init.php'; +*/ // Security check if (empty($conf->stripe->enabled)) accessforbidden('',0,0,1); $langs->load("main"); +$langs->load("companies"); $langs->load("other"); $langs->load("paybox"); // File with generic data $langs->load("stripe"); -$source=GETPOST("source",'alpha'); -$ref=GETPOST('ref','alpha'); +$action=GETPOST('action','alpha'); -$form = new Form($db); +// Input are: +// type ('invoice','order','contractline'), +// id (object id), +// amount (required if id is empty), +// tag (a free text, required if type is empty) +// currency (iso code) + +$suffix=GETPOST("suffix",'alpha'); +$amount=price2num(GETPOST("amount")); +if (! GETPOST("currency",'alpha')) $currency=$conf->currency; +else $currency=GETPOST("currency",'alpha'); + +if (! $action) +{ + if (! GETPOST("amount") && ! GETPOST("source")) + { + dol_print_error('',$langs->trans('ErrorBadParameters')." - amount or source"); + exit; + } + if (is_numeric($amount) && ! GETPOST("tag") && ! GETPOST("source")) + { + dol_print_error('',$langs->trans('ErrorBadParameters')." - tag or source"); + exit; + } + if (GETPOST("source") && ! GETPOST("ref")) + { + dol_print_error('',$langs->trans('ErrorBadParameters')." - ref"); + exit; + } +} + +// Define $urlwithroot +//$urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root)); +//$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file +$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current + +$urlok=$urlwithroot.'/public/paypal/paymentok.php?'; +$urlko=$urlwithroot.'/public/paypal/paymentko.php?'; + +// Complete urls for post treatment +$SOURCE=GETPOST("source",'alpha'); +$ref=$REF=GETPOST('ref','alpha'); +$TAG=GETPOST("tag",'alpha'); +$FULLTAG=GETPOST("fulltag",'alpha'); // fulltag is tag with more informations +$SECUREKEY=GETPOST("securekey"); // Secure key +$FULLTAG.=($FULLTAG?'.':'').'PM=stripe'; + +if (! empty($SOURCE)) +{ + $urlok.='source='.urlencode($SOURCE).'&'; + $urlko.='source='.urlencode($SOURCE).'&'; +} +if (! empty($REF)) +{ + $urlok.='ref='.urlencode($REF).'&'; + $urlko.='ref='.urlencode($REF).'&'; +} +if (! empty($TAG)) +{ + $urlok.='tag='.urlencode($TAG).'&'; + $urlko.='tag='.urlencode($TAG).'&'; +} +if (! empty($FULLTAG)) +{ + $urlok.='fulltag='.urlencode($FULLTAG).'&'; + $urlko.='fulltag='.urlencode($FULLTAG).'&'; +} +if (! empty($SECUREKEY)) +{ + $urlok.='securekey='.urlencode($SECUREKEY).'&'; + $urlko.='securekey='.urlencode($SECUREKEY).'&'; +} +if (! empty($entity)) +{ + $urlok.='entity='.urlencode($entity).'&'; + $urlko.='entity='.urlencode($entity).'&'; +} +$urlok=preg_replace('/&$/','',$urlok); // Remove last & +$urlko=preg_replace('/&$/','',$urlko); // Remove last & + +// Check parameters +/* +$STRIPE_API_OK=""; +if ($urlok) $STRIPE_API_OK=$urlok; +$STRIPE_API_KO=""; +if ($urlko) $STRIPE_API_KO=$urlko; +if (empty($STRIPE_API_USER)) +{ + dol_print_error('',"Paypal setup param STRIPE_API_USER not defined"); + return -1; +} +if (empty($STRIPE_API_PASSWORD)) +{ + dol_print_error('',"Paypal setup param STRIPE_API_PASSWORD not defined"); + return -1; +} +if (empty($STRIPE_API_SIGNATURE)) +{ + dol_print_error('',"Paypal setup param STRIPE_API_SIGNATURE not defined"); + return -1; +} +*/ + + +// Check security token +$valid=true; +if (! empty($conf->global->STRIPE_SECURITY_TOKEN)) +{ + if (! empty($conf->global->STRIPE_SECURITY_TOKEN_UNIQUE)) + { + if ($SOURCE && $REF) $token = dol_hash($conf->global->STRIPE_SECURITY_TOKEN . $SOURCE . $REF, 2); // Use the source in the hash to avoid duplicates if the references are identical + else $token = dol_hash($conf->global->STRIPE_SECURITY_TOKEN, 2); + } + else + { + $token = $conf->global->STRIPE_SECURITY_TOKEN; + } + if ($SECUREKEY != $token) $valid=false; + + if (! $valid) + { + print '
Bad value for key.
'; + //print 'SECUREKEY='.$SECUREKEY.' token='.$token.' valid='.$valid; + exit; + } +} + + +/* + * Actions + */ + +if ($action == 'dopayment') // We click on button Create payment that lead on this page +{ + if (GETPOST('newamount')) $amount = GETPOST('newamount'); + else + { + setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Amount")), null, 'errors'); + $action = ''; + } +} + +if ($action == 'charge') +{ + dol_syslog("POST keys : ".join(',', array_keys($_POST))); + dol_syslog("POST values: ".join(',', $_POST)); + + $token = GETPOST("stripeToken"); + $email = GETPOST("stripeEmail"); + + try { + $customer = \Stripe\Customer::create(array( + 'email' => $email, + 'card' => $token + // TODO + )); + + $charge = \Stripe\Charge::create(array( + 'customer' => $customer->id, + 'amount' => price2num($amount, 'MU'), + 'currency' => $conf->currency, + // TODO + 'description' => 'Invoice payment N: '.$ref + )); + } catch(\Stripe\Error\Card $e) { + // Since it's a decline, \Stripe\Error\Card will be caught + $body = $e->getJsonBody(); + $err = $body['error']; + + print('Status is:' . $e->getHttpStatus() . "\n"); + print('Type is:' . $err['type'] . "\n"); + print('Code is:' . $err['code'] . "\n"); + // param is '' in this case + print('Param is:' . $err['param'] . "\n"); + print('Message is:' . $err['message'] . "\n"); + + setEventMessages($e->getMessage(), null, 'errors'); + $action=''; + } catch (\Stripe\Error\RateLimit $e) { + // Too many requests made to the API too quickly + setEventMessages($e->getMessage(), null, 'errors'); + $action=''; + } catch (\Stripe\Error\InvalidRequest $e) { + // Invalid parameters were supplied to Stripe's API + setEventMessages($e->getMessage(), null, 'errors'); + $action=''; + } catch (\Stripe\Error\Authentication $e) { + // Authentication with Stripe's API failed + // (maybe you changed API keys recently) + setEventMessages($e->getMessage(), null, 'errors'); + $action=''; + } catch (\Stripe\Error\ApiConnection $e) { + // Network communication with Stripe failed + setEventMessages($e->getMessage(), null, 'errors'); + $action=''; + } catch (\Stripe\Error\Base $e) { + // Display a very generic error to the user, and maybe send + // yourself an email + setEventMessages($e->getMessage(), null, 'errors'); + $action=''; + } catch (Exception $e) { + // Something else happened, completely unrelated to Stripe + setEventMessages($e->getMessage(), null, 'errors'); + $action=''; + } + + // TODO + dol_syslog("Action Pay."); + + +} + + +/* + * View + */ + +$head=''; +if (! empty($conf->global->STRIPE_CSS_URL)) $head=''."\n"; + +$conf->dol_hide_topmenu=1; +$conf->dol_hide_leftmenu=1; + +llxHeader($head, $langs->trans("PaymentForm"), '', '', 0, 0, '', '', '', 'onlinepaymentbody'); + +if (! empty($STRIPE_API_SANDBOX)) +{ + dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode'),'','warning'); +} + +// Common variables +$creditor=$mysoc->name; +$paramcreditor='STRIPE_CREDITOR_'.$suffix; +if (! empty($conf->global->$paramcreditor)) $creditor=$conf->global->$paramcreditor; +else if (! empty($conf->global->STRIPE_CREDITOR)) $creditor=$conf->global->STRIPE_CREDITOR; + +print ''."\n"; +print '
'."\n"; +print '
'."\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; +print ''; +print "\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; +print ''."\n"; +print "\n"; + +print '
'.$langs->trans("Description").''.$langs->trans("Value").'*'; + $text = $langs->trans("Value"); + print $form->textwithpicto($text, $helptext, 1, 'help', '', 0, 2, 'idhelptext'); + print ''.$langs->trans("Action").'
'; print $langs->trans("PAYPAL_API_USER").''; print ''; -print '   '.$langs->trans("Example").': paypal_api1.mywebsite.com'; +print '   '.$langs->trans("Example").': admin-facilitator_api1.example.com, paypal_api1.mywebsite.com'; print '
'.$langs->trans("Parameters").''.$langs->trans("Value")."
'; @@ -383,7 +379,6 @@ print ''; print ''; print ''; -$var=! $var; print '
'; print $langs->trans("FreeTextOnDonations").' '.img_info($langs->trans("AddCRIfTooLong")).'
'; print ''; @@ -406,9 +401,8 @@ if (preg_match('/fr/i',$conf->global->MAIN_INFO_SOCIETE_COUNTRY)) print '
' . $langs->trans('Parameters') . '
' . $langs->trans("DONATION_ART200") . ''; @@ -420,9 +414,8 @@ if (preg_match('/fr/i',$conf->global->MAIN_INFO_SOCIETE_COUNTRY)) print '
' . $langs->trans("DONATION_ART238") . ''; @@ -434,9 +427,8 @@ if (preg_match('/fr/i',$conf->global->MAIN_INFO_SOCIETE_COUNTRY)) print '
' . $langs->trans("DONATION_ART885") . ''; diff --git a/htdocs/don/card.php b/htdocs/don/card.php index f6584628d25..882b80ec339 100644 --- a/htdocs/don/card.php +++ b/htdocs/don/card.php @@ -699,12 +699,11 @@ if (! empty($id) && $action != 'edit') print ''.$langs->trans("Amount").'
"; + print '
'; print ''.img_object($langs->trans("Payment"),"payment").' '.$objp->rowid.''.dol_print_date($db->jdate($objp->dp),'day')."'; @@ -858,7 +858,7 @@ if ($id) $error=$hookmanager->error; $errors=$hookmanager->errors; // Show fields - if (empty($reshook)) fieldList($fieldlist,$obj,$tabname[$id],'edit'); + if (empty($reshook)) fieldListAccountingCategories($fieldlist,$obj,$tabname[$id],'edit'); print ''; $transfound=0; // Special case for labels - if ($tabname == MAIN_DB_PREFIX.'c_payment_term') { + if ($tabname == MAIN_DB_PREFIX.'c_payment_term') + { $langs->load("bills"); $transkey="PaymentCondition".strtoupper($obj->code); + if ($langs->trans($transkey) != $transkey) + { + $transfound=1; + print $form->textwithpicto($langs->trans($transkey), $langs->trans("GoIntoTranslationMenuToChangeThis")); + } } - if ($langs->trans($transkey) != $transkey) - { - $transfound=1; - print $form->textwithpicto($langs->trans($transkey), $langs->trans("GoIntoTranslationMenuToChangeThis")); - } if (! $transfound) { print ''; diff --git a/htdocs/comm/mailing/class/mailing.class.php b/htdocs/comm/mailing/class/mailing.class.php index 93c47f8aa51..72c2b6d4690 100644 --- a/htdocs/comm/mailing/class/mailing.class.php +++ b/htdocs/comm/mailing/class/mailing.class.php @@ -585,7 +585,7 @@ class Mailing extends CommonObject * @param strin $desc Desc error * @return string Label */ - static public function libStatutDest($statut,$mode=0,$desc='') + public static function libStatutDest($statut,$mode=0,$desc='') { global $langs; $langs->load('mails'); diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 4c8870c5cb0..a12a563e58c 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -2875,11 +2875,6 @@ class Commande extends CommonOrder $this->error=$langs->trans('ErrorStockIsNotEnoughToAddProductOnOrder', $product->ref); dol_syslog(get_class($this)."::addline error=Product ".$product->ref.": ".$this->error, LOG_ERR); $this->db->rollback(); - unset($_POST['productid']); - unset($_POST['tva_tx']); - unset($_POST['price_ht']); - unset($_POST['qty']); - unset($_POST['buying_price']); return self::STOCK_NOT_ENOUGH_FOR_ORDER; } } From 4343f93c00b90c294c21f714a0e581ccf6247868 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 13 May 2017 19:36:28 +0200 Subject: [PATCH 113/299] Remove a lot of useless code --- htdocs/accountancy/admin/categories_list.php | 291 ++++--------------- 1 file changed, 58 insertions(+), 233 deletions(-) diff --git a/htdocs/accountancy/admin/categories_list.php b/htdocs/accountancy/admin/categories_list.php index 14475119461..7b1eb44545a 100644 --- a/htdocs/accountancy/admin/categories_list.php +++ b/htdocs/accountancy/admin/categories_list.php @@ -168,9 +168,6 @@ if (GETPOST('actionadd') || GETPOST('actionmodify')) { if ($value == 'country_id' && in_array($tablib[$id],array('DictionaryVAT','DictionaryRegion','DictionaryCompanyType','DictionaryHolidayTypes','DictionaryRevenueStamp','DictionaryAccountancysystem','DictionaryAccountancyCategory'))) continue; // For some pages, country is not mandatory if ($value == 'country' && in_array($tablib[$id],array('DictionaryCanton','DictionaryCompanyType','DictionaryRevenueStamp'))) continue; // For some pages, country is not mandatory - if ($value == 'localtax1' && empty($_POST['localtax1_type'])) continue; - if ($value == 'localtax2' && empty($_POST['localtax2_type'])) continue; - if ($value == 'color' && empty($_POST['color'])) continue; if ($value == 'formula' && empty($_POST['formula'])) continue; if ((! isset($_POST[$value]) || $_POST[$value]=='') && (! in_array($listfield[$f], array('decalage','module','accountancy_code','accountancy_code_sell','accountancy_code_buy')) // Fields that are not mandatory @@ -183,17 +180,12 @@ if (GETPOST('actionadd') || GETPOST('actionmodify')) // We take translate key of field if ($fieldnamekey == 'libelle' || ($fieldnamekey == 'label')) $fieldnamekey='Label'; if ($fieldnamekey == 'libelle_facture') $fieldnamekey = 'LabelOnDocuments'; - if ($fieldnamekey == 'nbjour') $fieldnamekey='NbOfDays'; - if ($fieldnamekey == 'decalage') $fieldnamekey='Offset'; if ($fieldnamekey == 'module') $fieldnamekey='Module'; if ($fieldnamekey == 'code') $fieldnamekey = 'Code'; if ($fieldnamekey == 'note') $fieldnamekey = 'Note'; if ($fieldnamekey == 'taux') $fieldnamekey = 'Rate'; if ($fieldnamekey == 'type') $fieldnamekey = 'Type'; if ($fieldnamekey == 'position') $fieldnamekey = 'Position'; - if ($fieldnamekey == 'unicode') $fieldnamekey = 'Unicode'; - if ($fieldnamekey == 'deductible') $fieldnamekey = 'Deductible'; - if ($fieldnamekey == 'sortorder') $fieldnamekey = 'SortOrder'; if ($fieldnamekey == 'category_type') $fieldnamekey = 'Calculated'; setEventMessages($langs->transnoentities("ErrorFieldRequired", $langs->transnoentities($fieldnamekey)), null, 'errors'); @@ -217,7 +209,7 @@ if (GETPOST('actionadd') || GETPOST('actionmodify')) $msg .= $langs->transnoentities('ErrorFieldFormat', $langs->transnoentities('Code')).'
'; }*/ } - if (isset($_POST["country"]) && ($_POST["country"]=='0') && ($id != 2)) + if (isset($_POST["country"]) && ($_POST["country"]=='0')) { if (in_array($tablib[$id],array('DictionaryCompanyType','DictionaryHolidayTypes'))) // Field country is no mandatory for such dictionaries { @@ -229,15 +221,8 @@ if (GETPOST('actionadd') || GETPOST('actionmodify')) setEventMessages($langs->transnoentities("ErrorFieldRequired",$langs->transnoentities("Country")), null, 'errors'); } } - if ($id == 3 && ! is_numeric($_POST["code"])) - { - $ok=0; - setEventMessages($langs->transnoentities("ErrorFieldMustBeANumeric",$langs->transnoentities("Code")), null, 'errors'); - } // Clean some parameters - if ((! empty($_POST["localtax1_type"]) || ($_POST['localtax1_type'] == '0')) && empty($_POST["localtax1"])) $_POST["localtax1"]='0'; // If empty, we force to 0 - if ((! empty($_POST["localtax2_type"]) || ($_POST['localtax2_type'] == '0')) && empty($_POST["localtax2"])) $_POST["localtax2"]='0'; // If empty, we force to 0 if ($_POST["accountancy_code"] <= 0) $_POST["accountancy_code"]=''; // If empty, we force to null if ($_POST["accountancy_code_sell"] <= 0) $_POST["accountancy_code_sell"]=''; // If empty, we force to null if ($_POST["accountancy_code_buy"] <= 0) $_POST["accountancy_code_buy"]=''; // If empty, we force to null @@ -474,26 +459,9 @@ if ($id) $linkback=''.$langs->trans("BackToDictionaryList").''; } $titlepicto='title_setup'; -if ($id == 10 && GETPOST('from') == 'accountancy') -{ - $titre=$langs->trans("MenuVatAccounts"); - $titlepicto='title_accountancy'; -} -if ($id == 7 && GETPOST('from') == 'accountancy') -{ - $titre=$langs->trans("MenuTaxAccounts"); - $titlepicto='title_accountancy'; -} print load_fiche_titre($titre,$linkback,$titlepicto); -if (empty($id)) -{ - print $langs->trans("DictionaryDesc"); - print " ".$langs->trans("OnlyActiveElementsAreShown")."
\n"; -} -print "
\n"; - // Confirmation de la suppression de la ligne if ($action == 'delete') @@ -563,19 +531,6 @@ if ($id) $valuetoshow=ucfirst($fieldlist[$field]); // Par defaut $valuetoshow=$langs->trans($valuetoshow); // try to translate $align="left"; - if ($fieldlist[$field]=='source') { $valuetoshow=$langs->trans("Contact"); } - if ($fieldlist[$field]=='price') { $valuetoshow=$langs->trans("PriceUHT"); } - if ($fieldlist[$field]=='taux') { - if ($tabname[$id] != MAIN_DB_PREFIX."c_revenuestamp") $valuetoshow=$langs->trans("Rate"); - else $valuetoshow=$langs->trans("Amount"); - $align='center'; - } - if ($fieldlist[$field]=='localtax1_type') { $valuetoshow=$langs->trans("UseLocalTax")." 2"; $align="center"; $sortable=0; } - if ($fieldlist[$field]=='localtax1') { $valuetoshow=$langs->trans("Rate")." 2"; $align="center"; } - if ($fieldlist[$field]=='localtax2_type') { $valuetoshow=$langs->trans("UseLocalTax")." 3"; $align="center"; $sortable=0; } - if ($fieldlist[$field]=='localtax2') { $valuetoshow=$langs->trans("Rate")." 3"; $align="center"; } - if ($fieldlist[$field]=='organization') { $valuetoshow=$langs->trans("Organization"); } - if ($fieldlist[$field]=='lang') { $valuetoshow=$langs->trans("Language"); } if ($fieldlist[$field]=='type') { if ($tabname[$id] == MAIN_DB_PREFIX."c_paiement") $valuetoshow=$form->textwithtooltip($langs->trans("Type"),$langs->trans("TypePaymentDesc"),2,1,img_help(1,'')); else $valuetoshow=$langs->trans("Type"); @@ -584,49 +539,20 @@ if ($id) if ($fieldlist[$field]=='libelle' || $fieldlist[$field]=='label') { $valuetoshow=$langs->trans("Label"); - if ($id != 25) $valuetoshow.="*"; } if ($fieldlist[$field]=='libelle_facture') { $valuetoshow=$langs->trans("LabelOnDocuments")."*"; } if ($fieldlist[$field]=='country') { if (in_array('region_id',$fieldlist)) { print '
 '; print ''; print '
* '.$langs->trans("LabelUsedByDefault").'.
 
'; - if ($iserasable) print ''.$actl[$obj->favorite].''; - else print $langs->trans("AlwaysActive"); - print ''; if ($canbedisabled) print ''.$actl[$obj->active].''; From 5729bdb2c92a04e8521a0490e2f4b19ea55ae363 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 13 May 2017 19:51:31 +0200 Subject: [PATCH 114/299] Fix phpunit --- test/phpunit/CodingSqlTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/phpunit/CodingSqlTest.php b/test/phpunit/CodingSqlTest.php index 0a9acc50220..c6123df3e77 100644 --- a/test/phpunit/CodingSqlTest.php +++ b/test/phpunit/CodingSqlTest.php @@ -57,7 +57,7 @@ $conf->global->MAIN_DISABLE_ALL_MAILS=1; * @backupStaticAttributes enabled * @remarks backupGlobals must be disabled to have db,conf,user and lang not erased. */ -class SqlTest extends PHPUnit_Framework_TestCase +class CodingSqlTest extends PHPUnit_Framework_TestCase { protected $savconf; protected $savuser; From 955c9f4217b4dd7a943f9c07b505833397b8defd Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 13 May 2017 21:10:56 +0200 Subject: [PATCH 115/299] Standardize the way online payments are working. Removed the trigger file of PAYPAL module that stored data that was not used by Dolibarr. The trigger event still exists, but if an external module need action on it, it must provides itself its trigger file. --- ChangeLog | 2 + ...face_20_modPaypal_PaypalWorkflow.class.php | 112 ----------------- ...face_20_modStripe_StripeWorkflow.class.php | 113 ------------------ htdocs/paybox/admin/paybox.php | 15 ++- htdocs/paypal/admin/paypal.php | 3 - htdocs/public/paybox/paymentko.php | 9 ++ htdocs/public/paybox/paymentok.php | 4 + htdocs/public/payment/paymentko.php | 11 ++ htdocs/public/payment/paymentok.php | 27 +++-- htdocs/public/paypal/paymentko.php | 11 ++ htdocs/public/paypal/paymentok.php | 14 ++- 11 files changed, 78 insertions(+), 243 deletions(-) delete mode 100644 htdocs/core/triggers/interface_20_modPaypal_PaypalWorkflow.class.php delete mode 100644 htdocs/core/triggers/interface_20_modStripe_StripeWorkflow.class.php diff --git a/ChangeLog b/ChangeLog index f48de97d970..68e9674d0da 100644 --- a/ChangeLog +++ b/ChangeLog @@ -16,6 +16,8 @@ Following changes may create regression for some external modules, but were nece * Removed CommonObject::displayMarginInfos (was deprecated in 3.8). Use same method into html.formmargin.class.php * Removed Societe::set_commnucation_level (was deprecated in 4.0). Was not used. +* Removed the trigger file of PAYPAL module that stored data that was not used by Dolibarr. The trigger event still + exists, but if an external module need action on it, it must provides itself its trigger file. ***** ChangeLog for 5.0.2 compared to 5.0.1 ***** FIX: #6468 + Fix missing translation diff --git a/htdocs/core/triggers/interface_20_modPaypal_PaypalWorkflow.class.php b/htdocs/core/triggers/interface_20_modPaypal_PaypalWorkflow.class.php deleted file mode 100644 index 1d57f598d57..00000000000 --- a/htdocs/core/triggers/interface_20_modPaypal_PaypalWorkflow.class.php +++ /dev/null @@ -1,112 +0,0 @@ - - * Copyright (C) 2014 Marcos García - * - * 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 3 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/core/triggers/interface_20_modPaypal_PaypalWorkflow.class.php - * \ingroup paypal - * \brief Trigger file for paypal workflow - */ - -require_once DOL_DOCUMENT_ROOT.'/core/triggers/dolibarrtriggers.class.php'; - - -/** - * Class of triggers for paypal module - */ -class InterfacePaypalWorkflow extends DolibarrTriggers -{ - public $picto = 'paypal@paypal'; - public $family = 'paypal'; - public $description = "Triggers of this module allows to manage paypal workflow"; - public $version = self::VERSION_DOLIBARR; - - /** - * Function called when a Dolibarrr business event is done. - * All functions "runTrigger" are triggered if file is inside directory htdocs/core/triggers or htdocs/module/code/triggers (and declared) - * - * @param string $action Event action code - * @param Object $object Object - * @param User $user Object user - * @param Translate $langs Object langs - * @param conf $conf Object conf - * @return int <0 if KO, 0 if no triggered ran, >0 if OK - */ - public function runTrigger($action, $object, User $user, Translate $langs, Conf $conf) - { - // Mettre ici le code a executer en reaction de l'action - // Les donnees de l'action sont stockees dans $object - - if ($action == 'PAYPAL_PAYMENT_OK') - { - dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". source=".$object->source." ref=".$object->ref); - - if (! empty($object->source)) - { - if ($object->source == 'membersubscription') - { - //require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherents.class.php'; - - // TODO add subscription treatment - } - else - { - require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; - - $soc = new Societe($this->db); - - // Parse element/subelement (ex: project_task) - $element = $path = $filename = $object->source; - if (preg_match('/^([^_]+)_([^_]+)/i',$object->source,$regs)) - { - $element = $path = $regs[1]; - $filename = $regs[2]; - } - // For compatibility - if ($element == 'order') { - $path = $filename = 'commande'; - } - if ($element == 'invoice') { - $path = 'compta/facture'; $filename = 'facture'; - } - - dol_include_once('/'.$path.'/class/'.$filename.'.class.php'); - - $classname = ucfirst($filename); - $obj = new $classname($this->db); - - $ret = $obj->fetch('',$object->ref); - if ($ret < 0) return -1; - - // Add payer id - $soc->setValueFrom('ref_int', $object->payerID, 'societe', $obj->socid); - - // Add transaction id - $obj->setValueFrom('ref_int',$object->resArray["TRANSACTIONID"]); - } - } - else - { - // TODO add free tag treatment - } - - } - - return 0; - } - -} diff --git a/htdocs/core/triggers/interface_20_modStripe_StripeWorkflow.class.php b/htdocs/core/triggers/interface_20_modStripe_StripeWorkflow.class.php deleted file mode 100644 index 4fbf29c7b07..00000000000 --- a/htdocs/core/triggers/interface_20_modStripe_StripeWorkflow.class.php +++ /dev/null @@ -1,113 +0,0 @@ - - * Copyright (C) 2014 Marcos García - * Copyright (C) 2017 Alexandre Spangaro - * - * 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 3 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/core/triggers/interface_20_modStripe_StripeWorkflow.class.php - * \ingroup stripe - * \brief Trigger file for stripe workflow - */ - -require_once DOL_DOCUMENT_ROOT.'/core/triggers/dolibarrtriggers.class.php'; - - -/** - * Class of triggers for stripe module - */ -class InterfaceStripeWorkflow extends DolibarrTriggers -{ - public $picto = 'stripe@stripe'; - public $family = 'stripe'; - public $description = "Triggers of this module allows to manage stripe workflow"; - public $version = self::VERSION_DOLIBARR; - - /** - * Function called when a Dolibarrr business event is done. - * All functions "runTrigger" are triggered if file is inside directory htdocs/core/triggers or htdocs/module/code/triggers (and declared) - * - * @param string $action Event action code - * @param Object $object Object - * @param User $user Object user - * @param Translate $langs Object langs - * @param conf $conf Object conf - * @return int <0 if KO, 0 if no triggered ran, >0 if OK - */ - public function runTrigger($action, $object, User $user, Translate $langs, Conf $conf) - { - // Mettre ici le code a executer en reaction de l'action - // Les donnees de l'action sont stockees dans $object - - if ($action == 'STRIPE_PAYMENT_OK') - { - dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". source=".$object->source." ref=".$object->ref); - - if (! empty($object->source)) - { - if ($object->source == 'membersubscription') - { - //require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherents.class.php'; - - // TODO add subscription treatment - } - else - { - require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; - - $soc = new Societe($this->db); - - // Parse element/subelement (ex: project_task) - $element = $path = $filename = $object->source; - if (preg_match('/^([^_]+)_([^_]+)/i',$object->source,$regs)) - { - $element = $path = $regs[1]; - $filename = $regs[2]; - } - // For compatibility - if ($element == 'order') { - $path = $filename = 'commande'; - } - if ($element == 'invoice') { - $path = 'compta/facture'; $filename = 'facture'; - } - - dol_include_once('/'.$path.'/class/'.$filename.'.class.php'); - - $classname = ucfirst($filename); - $obj = new $classname($this->db); - - $ret = $obj->fetch('',$object->ref); - if ($ret < 0) return -1; - - // Add payer id - $soc->setValueFrom('ref_int', $object->payerID, 'societe', $obj->socid); - - // Add transaction id - $obj->setValueFrom('ref_int',$object->resArray["TRANSACTIONID"]); - } - } - else - { - // TODO add free tag treatment - } - - } - - return 0; - } - -} diff --git a/htdocs/paybox/admin/paybox.php b/htdocs/paybox/admin/paybox.php index 1a020ab86bf..ffbc2e41e0c 100644 --- a/htdocs/paybox/admin/paybox.php +++ b/htdocs/paybox/admin/paybox.php @@ -93,16 +93,22 @@ llxHeader(); $linkback=''.$langs->trans("BackToModuleList").''; print load_fiche_titre($langs->trans("PayBoxSetup"),$linkback,'title_setup'); -print $langs->trans("PayBoxDesc")."
\n"; +$h = 0; +$head = array(); + +$head[$h][0] = DOL_URL_ROOT."/paybox/admin/paybox.php"; +$head[$h][1] = $langs->trans("PayBox"); +$head[$h][2] = 'payboxaccount'; +$h++; -print '
'; print ''; print ''; print ''; -dol_fiche_head(null, 'payboxaccount', ''); +dol_fiche_head($head, 'payboxaccount', '', -1); -$var=true; +print $langs->trans("PayBoxDesc")."
\n"; +print '
'; print ''; print ''; @@ -131,7 +137,6 @@ print 'trans("Test").')'; print ''; -$var=true; print ''; print ''; print ''; diff --git a/htdocs/paypal/admin/paypal.php b/htdocs/paypal/admin/paypal.php index ef0c40f2813..6d52fea8d99 100644 --- a/htdocs/paypal/admin/paypal.php +++ b/htdocs/paypal/admin/paypal.php @@ -121,7 +121,6 @@ print '
'; print '
'.$langs->trans("UsageParameter").''.$langs->trans("Value").'
'; // Account Parameters -$var=true; print ''; print ''; print ''; @@ -160,7 +159,6 @@ print $form->selectarray("PAYPAL_SSLVERSION",array('1'=> $langs->trans('TLSv1'), print ''; // Usage Parameters -$var=true; print ''; print ''; print ''; @@ -220,7 +218,6 @@ print ''; -$var=true; print ''; print ''; print ''; diff --git a/htdocs/public/paybox/paymentko.php b/htdocs/public/paybox/paymentko.php index 1d450a91af2..e417aad12c7 100644 --- a/htdocs/public/paybox/paymentko.php +++ b/htdocs/public/paybox/paymentko.php @@ -50,6 +50,7 @@ $langs->load("paypal"); $langs->load("stripe"); +$object = new stdClass(); // For triggers /* @@ -71,6 +72,14 @@ foreach($_POST as $k => $v) $tracepost .= "{$k} - {$v}\n"; dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_paybox'); +// Appel des triggers +include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; +$interface=new Interfaces($db); +$result=$interface->run_triggers('PAYBOX_PAYMENT_OK',$object,$user,$langs,$conf); +if ($result < 0) { $error++; $errors=$interface->errors; } +// Fin appel triggers + + // Send an email if (! empty($conf->global->PAYBOX_PAYONLINE_SENDEMAIL)) { diff --git a/htdocs/public/paybox/paymentok.php b/htdocs/public/paybox/paymentok.php index 93d93a88cbe..5b88dcb65d7 100644 --- a/htdocs/public/paybox/paymentok.php +++ b/htdocs/public/paybox/paymentok.php @@ -60,6 +60,9 @@ $FULLTAG=GETPOST('FULLTAG'); if (empty($FULLTAG)) $FULLTAG=GETPOST('fulltag'); +$object = new stdClass(); // For triggers + + /* * Actions */ @@ -113,6 +116,7 @@ print $langs->trans("YourPaymentHasBeenRecorded")."

\n"; if (! empty($conf->global->PAYBOX_MESSAGE_OK)) print $conf->global->PAYBOX_MESSAGE_OK; + // Appel des triggers include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; $interface=new Interfaces($db); diff --git a/htdocs/public/payment/paymentko.php b/htdocs/public/payment/paymentko.php index ceface2a9c0..6ce1c3badfa 100644 --- a/htdocs/public/payment/paymentko.php +++ b/htdocs/public/payment/paymentko.php @@ -69,6 +69,9 @@ if (! empty($conf->paybox->enabled)) $validpaymentmethod['paybox']='paybox'; if (empty($validpaymentmethod)) accessforbidden('', 0, 0, 1); +$object = new stdClass(); // For triggers + + /* * Actions */ @@ -87,6 +90,14 @@ foreach($_POST as $k => $v) $tracepost .= "{$k} - {$v}\n"; dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_payment'); +// Appel des triggers +include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; +$interface=new Interfaces($db); +$result=$interface->run_triggers('PAYMENTONLINE_PAYMENT_KO',$object,$user,$langs,$conf); +if ($result < 0) { $error++; $errors=$interface->errors; } +// Fin appel triggers + + // Send an email if (! empty($conf->paypal->enabled)) { diff --git a/htdocs/public/payment/paymentok.php b/htdocs/public/payment/paymentok.php index c138cc29267..c1b4329c7be 100644 --- a/htdocs/public/payment/paymentok.php +++ b/htdocs/public/payment/paymentok.php @@ -128,6 +128,9 @@ $PAYMENTSTATUS=$TRANSACTIONID=$TAXAMT=$NOTE=''; $ErrorCode=$ErrorShortMsg=$ErrorLongMsg=$ErrorSeverityCode=''; +$object = new stdClass(); // For triggers + + /* @@ -191,8 +194,6 @@ if (! empty($conf->paypal->enabled)) $ack = strtoupper($resArray["ACK"]); if ($ack=="SUCCESS" || $ack=="SUCCESSWITHWARNING") { - $object = new stdClass(); - $object->source = $source; $object->ref = $ref; $object->payerID = $payerID; @@ -244,11 +245,16 @@ if ($ispaymentok) print $langs->trans("ThisIsTransactionId",$TRANSACTIONID)."

\n"; if (! empty($conf->global->PAYMENT_MESSAGE_OK)) print $conf->global->PAYMENT_MESSAGE_OK; + $sendemail = ''; + if (! empty($conf->global->PAYMENTONLINE_SENDEMAIL)) $sendemail=$conf->global->PAYMENTONLINE_SENDEMAIL; + // TODO Remove local option to keep only the generic one ? + if ($paymentmethod == 'paypal' && ! empty($conf->global->PAYPAL_PAYONLINE_SENDEMAIL)) $sendemail=$conf->global->PAYPAL_PAYONLINE_SENDEMAIL; + if ($paymentmethod == 'paybox' && ! empty($conf->global->PAYBOX_PAYONLINE_SENDEMAIL)) $sendemail=$conf->global->PAYBOX_PAYONLINE_SENDEMAIL; // Send an email - if (! empty($conf->global->PAYMENTONLINE_SENDEMAIL)) + if ($sendemail) { - $sendto=$conf->global->PAYMENTONLINE_SENDEMAIL; + $sendto=$sendemail; $from=$conf->global->MAILING_EMAIL_FROM; // Define $urlwithroot $urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root)); @@ -269,10 +275,11 @@ if ($ispaymentok) } else { - $content.=$langs->transnoentitiesnoconv("NewPaypalPaymentReceived")."
\n"; + $content.=$langs->transnoentitiesnoconv("NewOnlinePaymentReceived")."
\n"; } $content.="
\n"; $content.=$langs->transnoentitiesnoconv("TechnicalInformation").":
\n"; + $content.=$langs->transnoentitiesnoconv("PaymentSystem").': '.$paymentmethod."
\n"; $content.=$langs->transnoentitiesnoconv("ReturnURLAfterPayment").': '.$urlback."
\n"; $content.="tag=".$fulltag." token=".$token." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; @@ -310,11 +317,16 @@ else if ($mysoc->email) print "\nPlease, send a screenshot of this page to ".$mysoc->email."
\n"; + $sendemail = ''; + if (! empty($conf->global->PAYMENTONLINE_SENDEMAIL)) $sendemail=$conf->global->PAYMENTONLINE_SENDEMAIL; + // TODO Remove local option to keep only the generic one ? + if ($paymentmethod == 'paypal' && ! empty($conf->global->PAYPAL_PAYONLINE_SENDEMAIL)) $sendemail=$conf->global->PAYPAL_PAYONLINE_SENDEMAIL; + if ($paymentmethod == 'paybox' && ! empty($conf->global->PAYBOX_PAYONLINE_SENDEMAIL)) $sendemail=$conf->global->PAYBOX_PAYONLINE_SENDEMAIL; // Send an email - if (! empty($conf->global->PAYMENTONLINE_SENDEMAIL)) + if ($sendemail) { - $sendto=$conf->global->PAYMENTONLINE_SENDEMAIL; + $sendto=$sendemail; $from=$conf->global->MAILING_EMAIL_FROM; // Define $urlwithroot $urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root)); @@ -327,6 +339,7 @@ else $content.=$langs->transnoentitiesnoconv("PaypalConfirmPaymentPageWasCalledButFailed")."\n"; $content.="\n"; $content.=$langs->transnoentitiesnoconv("TechnicalInformation").":\n"; + $content.=$langs->transnoentitiesnoconv("PaymentSystem").': '.$paymentmethod."
\n"; $content.=$langs->transnoentitiesnoconv("ReturnURLAfterPayment").': '.$urlback."\n"; $content.="tag=".$fulltag."\ntoken=".$token." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; diff --git a/htdocs/public/paypal/paymentko.php b/htdocs/public/paypal/paymentko.php index 0bc3c9ca9e6..2d3c67beecb 100644 --- a/htdocs/public/paypal/paymentko.php +++ b/htdocs/public/paypal/paymentko.php @@ -61,6 +61,9 @@ $FULLTAG=GETPOST('FULLTAG'); if (empty($FULLTAG)) $FULLTAG=GETPOST('fulltag'); +$object = new stdClass(); // For triggers + + /* * Actions */ @@ -79,6 +82,14 @@ foreach($_POST as $k => $v) $tracepost .= "{$k} - {$v}\n"; dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_paypal'); +// Appel des triggers +include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; +$interface=new Interfaces($db); +$result=$interface->run_triggers('PAYPAL_PAYMENT_KO',$object,$user,$langs,$conf); +if ($result < 0) { $error++; $errors=$interface->errors; } +// Fin appel triggers + + // Send an email if (! empty($conf->global->PAYPAL_PAYONLINE_SENDEMAIL)) { diff --git a/htdocs/public/paypal/paymentok.php b/htdocs/public/paypal/paymentok.php index ca6a376e60d..ddb779d621e 100644 --- a/htdocs/public/paypal/paymentok.php +++ b/htdocs/public/paypal/paymentok.php @@ -92,6 +92,9 @@ $FULLTAG=GETPOST('FULLTAG'); if (empty($FULLTAG)) $FULLTAG=GETPOST('fulltag'); +$object = new stdClass(); // For triggers + + /* * Actions */ @@ -151,8 +154,6 @@ if ($PAYPALTOKEN) $ack = strtoupper($resArray["ACK"]); if($ack=="SUCCESS" || $ack=="SUCCESSWITHWARNING") { - $object = new stdClass(); - $object->source = $source; $object->ref = $ref; $object->payerID = $payerID; @@ -226,7 +227,14 @@ if ($PAYPALTOKEN) } else { - //Display a user friendly Error on the page using any of the following error information returned by PayPal + // Appel des triggers + include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + $interface=new Interfaces($db); + $result=$interface->run_triggers('PAYPAL_PAYMENT_KO',$object,$user,$langs,$conf); + if ($result < 0) { $error++; $errors=$interface->errors; } + // Fin appel triggers + + //Display a user friendly Error on the page using any of the following error information returned by PayPal $ErrorCode = urldecode($resArray["L_ERRORCODE0"]); $ErrorShortMsg = urldecode($resArray["L_SHORTMESSAGE0"]); $ErrorLongMsg = urldecode($resArray["L_LONGMESSAGE0"]); From 8dcec30d8938b302382b652dfabd494b99eb8db1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 13 May 2017 21:17:08 +0200 Subject: [PATCH 116/299] Start debug of module stripe --- htdocs/stripe/lib/stripe.lib.php | 45 -------------------------------- 1 file changed, 45 deletions(-) diff --git a/htdocs/stripe/lib/stripe.lib.php b/htdocs/stripe/lib/stripe.lib.php index c454296a304..5f0b1bd0404 100644 --- a/htdocs/stripe/lib/stripe.lib.php +++ b/htdocs/stripe/lib/stripe.lib.php @@ -51,52 +51,7 @@ function stripeadmin_prepare_head() return $head; } -/** - * Show header - * - * @param string $title Title of page - * @param string $head Head string to add int head section - * @return void - */ -function llxHeaderStripe($title, $head = "") -{ - global $user, $conf, $langs; - header("Content-type: text/html; charset=".$conf->file->character_set_client); - - print ''; - //print ''; - print "\n"; - print "\n"; - print "\n"; - print ''."\n"; - print ''."\n"; - print ''."\n"; - print "".$title."\n"; - if ($head) print $head."\n"; - if (! empty($conf->global->STRIPE_CSS_URL)) print ''."\n"; - else - { - print ''."\n"; - print ''; - } - print "\n"; - print ''."\n"; -} - -/** - * Show footer - * - * @return void - */ -function llxFooterStripe() -{ - print "\n"; - print "\n"; -} /** * Return string with full Url From 0ed4b607b21d198f86ad2b6041411fc434590c9d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 13 May 2017 22:05:58 +0200 Subject: [PATCH 117/299] Standardize code for payment --- htdocs/paypal/admin/paypal.php | 1 + htdocs/public/paybox/paymentko.php | 15 ++- htdocs/public/paybox/paymentok.php | 15 ++- htdocs/public/paypal/newpayment.php | 17 ++-- htdocs/public/paypal/paymentko.php | 15 ++- htdocs/public/paypal/paymentok.php | 30 +++++- htdocs/public/stripe/newpayment.php | 2 + htdocs/stripe/admin/stripe.php | 147 +++++++++++++++++++++------- 8 files changed, 195 insertions(+), 47 deletions(-) diff --git a/htdocs/paypal/admin/paypal.php b/htdocs/paypal/admin/paypal.php index 6d52fea8d99..36c8df9d0d6 100644 --- a/htdocs/paypal/admin/paypal.php +++ b/htdocs/paypal/admin/paypal.php @@ -43,6 +43,7 @@ $action = GETPOST('action','alpha'); if ($action == 'setvalue' && $user->admin) { $db->begin(); + $result=dolibarr_set_const($db, "PAYPAL_API_SANDBOX",GETPOST('PAYPAL_API_SANDBOX','alpha'),'chaine',0,'',$conf->entity); if (! $result > 0) $error++; $result=dolibarr_set_const($db, "PAYPAL_API_USER",GETPOST('PAYPAL_API_USER','alpha'),'chaine',0,'',$conf->entity); diff --git a/htdocs/public/paybox/paymentko.php b/htdocs/public/paybox/paymentko.php index e417aad12c7..be5b388f6ed 100644 --- a/htdocs/public/paybox/paymentko.php +++ b/htdocs/public/paybox/paymentko.php @@ -86,8 +86,21 @@ if (! empty($conf->global->PAYBOX_PAYONLINE_SENDEMAIL)) $sendto=$conf->global->PAYBOX_PAYONLINE_SENDEMAIL; $from=$conf->global->MAILING_EMAIL_FROM; + // Define link to login card + $appli=constant('DOL_APPLICATION_TITLE'); + if (! empty($conf->global->MAIN_APPLICATION_TITLE)) + { + $appli=$conf->global->MAIN_APPLICATION_TITLE; + if (preg_match('/\d\.\d/', $appli)) + { + if (! preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) $appli.=" (".DOL_VERSION.")"; // If new title contains a version that is different than core + } + else $appli.=" ".DOL_VERSION; + } + else $appli.=" ".DOL_VERSION; + $urlback=$_SERVER["REQUEST_URI"]; - $topic='['.$conf->global->MAIN_APPLICATION_TITLE.'] '.$langs->transnoentitiesnoconv("NewPayboxPaymentFailed"); + $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("NewPayboxPaymentFailed"); $content=$langs->transnoentitiesnoconv("NewPayboxPaymentFailed")."\n".$fulltag; require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; $mailfile = new CMailFile($topic, $sendto, $from, $content); diff --git a/htdocs/public/paybox/paymentok.php b/htdocs/public/paybox/paymentok.php index 5b88dcb65d7..0e91189e242 100644 --- a/htdocs/public/paybox/paymentok.php +++ b/htdocs/public/paybox/paymentok.php @@ -135,8 +135,21 @@ if (! empty($conf->global->PAYBOX_PAYONLINE_SENDEMAIL)) $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current + // Define link to login card + $appli=constant('DOL_APPLICATION_TITLE'); + if (! empty($conf->global->MAIN_APPLICATION_TITLE)) + { + $appli=$conf->global->MAIN_APPLICATION_TITLE; + if (preg_match('/\d\.\d/', $appli)) + { + if (! preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) $appli.=" (".DOL_VERSION.")"; // If new title contains a version that is different than core + } + else $appli.=" ".DOL_VERSION; + } + else $appli.=" ".DOL_VERSION; + $urlback=$_SERVER["REQUEST_URI"]; - $topic='['.$conf->global->MAIN_APPLICATION_TITLE.'] '.$langs->transnoentitiesnoconv("NewPayboxPaymentReceived"); + $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("NewPayboxPaymentReceived"); $tmptag=dolExplodeIntoArray($fulltag,'.','='); $content=""; if (! empty($tmptag['MEM'])) diff --git a/htdocs/public/paypal/newpayment.php b/htdocs/public/paypal/newpayment.php index e118d769476..cd963eec798 100644 --- a/htdocs/public/paypal/newpayment.php +++ b/htdocs/public/paypal/newpayment.php @@ -1,11 +1,11 @@ - * Copyright (C) 2006-2012 Laurent Destailleur + * Copyright (C) 2006-2017 Laurent Destailleur * Copyright (C) 2009-2012 Regis Houssin * - * This program is free software; you can redistribute it and/or modify + * 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 3 of the License, or + * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -23,7 +23,6 @@ * \file htdocs/public/paypal/newpayment.php * \ingroup paypal * \brief File to offer a way to make a payment for a particular Dolibarr entity - * \author Laurent Destailleur */ define("NOLOGIN",1); // This means this output page does not require to be logged. @@ -353,7 +352,7 @@ $error=0; $var=false; // Free payment -if (! GETPOST("source") && $valid) +if (! GETPOST("source")) { $found=true; $tag=GETPOST("tag"); @@ -400,7 +399,7 @@ if (! GETPOST("source") && $valid) // Payment on customer order -if (GETPOST("source") == 'order' && $valid) +if (GETPOST("source") == 'order') { $found=true; $langs->load("orders"); @@ -507,7 +506,7 @@ if (GETPOST("source") == 'order' && $valid) // Payment on customer invoice -if (GETPOST("source") == 'invoice' && $valid) +if (GETPOST("source") == 'invoice') { $found=true; $langs->load("bills"); @@ -613,7 +612,7 @@ if (GETPOST("source") == 'invoice' && $valid) } // Payment on contract line -if (GETPOST("source") == 'contractline' && $valid) +if (GETPOST("source") == 'contractline') { $found=true; $langs->load("contracts"); @@ -808,7 +807,7 @@ if (GETPOST("source") == 'contractline' && $valid) } // Payment on member subscription -if (GETPOST("source") == 'membersubscription' && $valid) +if (GETPOST("source") == 'membersubscription') { $found=true; $langs->load("members"); diff --git a/htdocs/public/paypal/paymentko.php b/htdocs/public/paypal/paymentko.php index 2d3c67beecb..e432db2e317 100644 --- a/htdocs/public/paypal/paymentko.php +++ b/htdocs/public/paypal/paymentko.php @@ -108,8 +108,21 @@ if (! empty($conf->global->PAYPAL_PAYONLINE_SENDEMAIL)) $sendto=$conf->global->PAYPAL_PAYONLINE_SENDEMAIL; $from=$conf->global->MAILING_EMAIL_FROM; + // Define link to login card + $appli=constant('DOL_APPLICATION_TITLE'); + if (! empty($conf->global->MAIN_APPLICATION_TITLE)) + { + $appli=$conf->global->MAIN_APPLICATION_TITLE; + if (preg_match('/\d\.\d/', $appli)) + { + if (! preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) $appli.=" (".DOL_VERSION.")"; // If new title contains a version that is different than core + } + else $appli.=" ".DOL_VERSION; + } + else $appli.=" ".DOL_VERSION; + $urlback=$_SERVER["REQUEST_URI"]; - $topic='['.$conf->global->MAIN_APPLICATION_TITLE.'] '.$langs->transnoentitiesnoconv("NewPaypalPaymentFailed"); + $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("NewPaypalPaymentFailed"); $content=$langs->transnoentitiesnoconv("NewPaypalPaymentFailed")."\ntag=".$fulltag."\ntoken=".$token." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; $mailfile = new CMailFile($topic, $sendto, $from, $content); diff --git a/htdocs/public/paypal/paymentok.php b/htdocs/public/paypal/paymentok.php index ddb779d621e..e3f2ed201e5 100644 --- a/htdocs/public/paypal/paymentok.php +++ b/htdocs/public/paypal/paymentok.php @@ -188,8 +188,21 @@ if ($PAYPALTOKEN) $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current + // Define link to login card + $appli=constant('DOL_APPLICATION_TITLE'); + if (! empty($conf->global->MAIN_APPLICATION_TITLE)) + { + $appli=$conf->global->MAIN_APPLICATION_TITLE; + if (preg_match('/\d\.\d/', $appli)) + { + if (! preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) $appli.=" (".DOL_VERSION.")"; // If new title contains a version that is different than core + } + else $appli.=" ".DOL_VERSION; + } + else $appli.=" ".DOL_VERSION; + $urlback=$_SERVER["REQUEST_URI"]; - $topic='['.$conf->global->MAIN_APPLICATION_TITLE.'] '.$langs->transnoentitiesnoconv("NewPaypalPaymentReceived"); + $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("NewPaypalPaymentReceived"); $tmptag=dolExplodeIntoArray($fulltag,'.','='); $content=""; if (! empty($tmptag['MEM'])) @@ -258,8 +271,21 @@ if ($PAYPALTOKEN) $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current + // Define link to login card + $appli=constant('DOL_APPLICATION_TITLE'); + if (! empty($conf->global->MAIN_APPLICATION_TITLE)) + { + $appli=$conf->global->MAIN_APPLICATION_TITLE; + if (preg_match('/\d\.\d/', $appli)) + { + if (! preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) $appli.=" (".DOL_VERSION.")"; // If new title contains a version that is different than core + } + else $appli.=" ".DOL_VERSION; + } + else $appli.=" ".DOL_VERSION; + $urlback=$_SERVER["REQUEST_URI"]; - $topic='['.$conf->global->MAIN_APPLICATION_TITLE.'] '.$langs->transnoentitiesnoconv("ValidationOfPaypalPaymentFailed"); + $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("ValidationOfPaypalPaymentFailed"); $content=""; $content.=$langs->transnoentitiesnoconv("PaypalConfirmPaymentPageWasCalledButFailed")."\n"; $content.="\n"; diff --git a/htdocs/public/stripe/newpayment.php b/htdocs/public/stripe/newpayment.php index 71f581000b2..0d6cefd357a 100644 --- a/htdocs/public/stripe/newpayment.php +++ b/htdocs/public/stripe/newpayment.php @@ -1,6 +1,7 @@ * Copyright (C) 2017 Saasprov + * Copyright (C) 2017 Laurent Destailleur * * 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 @@ -35,6 +36,7 @@ if (empty($conf->stripe->enabled)) accessforbidden('',0,0,1); $langs->load("main"); $langs->load("other"); +$langs->load("paybox"); // File with generic data $langs->load("stripe"); $source=GETPOST("source",'alpha'); diff --git a/htdocs/stripe/admin/stripe.php b/htdocs/stripe/admin/stripe.php index 6274197a301..3dd238b2f1d 100644 --- a/htdocs/stripe/admin/stripe.php +++ b/htdocs/stripe/admin/stripe.php @@ -36,8 +36,7 @@ $langs->load("paypal"); $langs->load("paybox"); $langs->load("stripe"); -if (!$user->admin) - accessforbidden(); +if (! $user->admin) accessforbidden(); $action = GETPOST('action','alpha'); @@ -96,6 +95,8 @@ if ($action=="setlive") * View */ +$form=new Form($db); + $SECRET_TEST_KEY="sk_test_xxxxxxxxxxxxxxxxxxxxxxxx"; // Stripe test secret key if (empty($conf->global->STRIPE_TEST_SECRET_KEY)) $conf->global->STRIPE_TEST_SECRET_KEY = $SECRET_TEST_KEY; $PUBLISHABLE_TEST_KEY="pk_test_xxxxxxxxxxxxxxxxxxxxxxxx"; // Stripe test publishable key @@ -108,10 +109,8 @@ if (empty($conf->global->STRIPE_LIVE_PUBLISHABLE_KEY)) $conf->global->STRIPE_LIV llxHeader('',$langs->trans("StripeSetup")); - $linkback=''.$langs->trans("BackToModuleList").''; print load_fiche_titre($langs->trans("ModuleSetup").' Stripe',$linkback); -print '
'; $head=stripeadmin_prepare_head(); @@ -119,22 +118,19 @@ print ''; print ''; print ''; -dol_fiche_head($head, 'stripeaccount', ''); +dol_fiche_head($head, 'stripeaccount', '', -1); print $langs->trans("StripeDesc")."
\n"; print '
'; -$var=true; - print '
'.$langs->trans("AccountParameter").''.$langs->trans("Value").'
'.$langs->trans("UsageParameter").''.$langs->trans("Value").'
'.$langs->trans("UrlGenerationParameters").''.$langs->trans("Value").'
'; print ''; print ''; print ''; print "\n"; -$var=!$var; -print ''; +print ''; print ''; -$var=!$var; -print ''; -$var=!$var; -print ''; -$var=!$var; -print ''; -$var=!$var; -print ''; print ''; print "\n"; -$var=!$var; -print ''; -$var=!$var; -print ''; -$var=!$var; -print ''; -$var=!$var; -print '
'.$langs->trans("AccountParameter").''.$langs->trans("Value").'
'; print $langs->trans("StripeLiveEnabled").''; if (!empty($conf->global->STRIPE_LIVE)) @@ -149,29 +145,25 @@ else } print '
'; +print '
'; print ''.$langs->trans("STRIPE_TEST_SECRET_KEY").''; print ''; print '
'.$langs->trans("Example").': sk_test_xxxxxxxxxxxxxxxxxxxxxxxx'; print '
'; +print '
'; print ''.$langs->trans("STRIPE_TEST_PUBLISHABLE_KEY").''; print ''; print '
'.$langs->trans("Example").': pk_test_xxxxxxxxxxxxxxxxxxxxxxxx'; print '
'; +print '
'; print ''.$langs->trans("STRIPE_LIVE_SECRET_KEY").''; print ''; print '
'.$langs->trans("Example").': sk_live_xxxxxxxxxxxxxxxxxxxxxxxx'; print '
'; +print '
'; print ''.$langs->trans("STRIPE_LIVE_PUBLISHABLE_KEY").''; print ''; print '
'.$langs->trans("Example").': pk_live_xxxxxxxxxxxxxxxxxxxxxxxx'; @@ -187,29 +179,25 @@ print '
'.$langs->trans("UsageParameter").''.$langs->trans("Value").'
'; +print '
'; print $langs->trans("VendorName").''; print ''; print '
'.$langs->trans("Example").': '.$mysoc->name; print '
'; +print '
'; print $langs->trans("CSSUrlForPaymentForm").''; print ''; print '
'.$langs->trans("Example").': http://mysite/mycss.css'; print '
'; +print '
'; print $langs->trans("MessageOK").''; $doleditor=new DolEditor('STRIPE_MESSAGE_OK',$conf->global->STRIPE_MESSAGE_OK,'',100,'dolibarr_details','In',false,true,true,ROWS_2,'90%'); $doleditor->Create(); print '
'; +print '
'; print $langs->trans("MessageKO").''; $doleditor=new DolEditor('STRIPE_MESSAGE_KO',$conf->global->STRIPE_MESSAGE_KO,'',100,'dolibarr_details','In',false,true,true,ROWS_2,'90%'); $doleditor->Create(); @@ -225,35 +213,128 @@ print ''; print '

'; -/* + +$token=''; + + +// Url list print ''.$langs->trans("FollowingUrlAreAvailableToMakePayments").':
'; print img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePaymentOnFreeAmount",$servicename).':
'; -print ''.DOL_MAIN_URL_ROOT.'/public/stripe/newpayment.php?amount=9.99&tag=your_free_tag'."
\n"; +print ''.getStripePaymentUrl(1,'free')."

\n"; if (! empty($conf->commande->enabled)) { print img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePaymentOnOrder",$servicename).':
'; - print ''.DOL_MAIN_URL_ROOT.'/public/stripe/newpayment.php?source=order&ref=order_ref'."
\n"; + print ''.getStripePaymentUrl(1,'order')."
\n"; + if (! empty($conf->global->STRIPE_SECURITY_TOKEN) && ! empty($conf->global->STRIPE_SECURITY_TOKEN_UNIQUE)) + { + $langs->load("orders"); + print '
'; + print $langs->trans("EnterRefToBuildUrl",$langs->transnoentitiesnoconv("Order")).': '; + print ''; + print ''; + if (GETPOST('generate_order_ref','alpha')) + { + print '
-> '; + $url=getStripePaymentUrl(0,'order',GETPOST('generate_order_ref','alpha')); + print $url; + print "
\n"; + } + print '
'; + } + print '
'; } if (! empty($conf->facture->enabled)) { print img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePaymentOnInvoice",$servicename).':
'; - print ''.DOL_MAIN_URL_ROOT.'/public/stripe/newpayment.php?source=invoice&ref=invoice_ref'."
\n"; + print ''.getStripePaymentUrl(1,'invoice')."
\n"; + if (! empty($conf->global->STRIPE_SECURITY_TOKEN) && ! empty($conf->global->STRIPE_SECURITY_TOKEN_UNIQUE)) + { + $langs->load("bills"); + print '
'; + print $langs->trans("EnterRefToBuildUrl",$langs->transnoentitiesnoconv("Invoice")).': '; + print ''; + print ''; + if (GETPOST('generate_invoice_ref','alpha')) + { + print '
-> '; + $url=getPaypalPaymentUrl(0,'invoice',GETPOST('generate_invoice_ref','alpha')); + print $url; + print "
\n"; + } + print '
'; + } + print '
'; } if (! empty($conf->contrat->enabled)) { print img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePaymentOnContractLine",$servicename).':
'; - print ''.DOL_MAIN_URL_ROOT.'/public/stripe/newpayment.php?source=contractline&ref=contractline_ref'."
\n"; + print ''.getStripePaymentUrl(1,'contractline')."
\n"; + if (! empty($conf->global->STRIPE_SECURITY_TOKEN) && ! empty($conf->global->STRIPE_SECURITY_TOKEN_UNIQUE)) + { + $langs->load("contract"); + print '
'; + print $langs->trans("EnterRefToBuildUrl",$langs->transnoentitiesnoconv("Contract")).': '; + print ''; + print ''; + if (GETPOST('generate_contract_ref')) + { + print '
-> '; + $url=getPaypalPaymentUrl(0,'contractline',GETPOST('generate_contract_ref','alpha')); + print $url; + print "
\n"; + } + print '
'; + } + print '
'; } if (! empty($conf->adherent->enabled)) { print img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePaymentOnMemberSubscription",$servicename).':
'; - print ''.DOL_MAIN_URL_ROOT.'/public/stripe/newpayment.php?source=membersubscription&ref=member_ref'."
\n"; + print ''.getStripePaymentUrl(1,'membersubscription')."
\n"; + if (! empty($conf->global->STRIPE_SECURITY_TOKEN) && ! empty($conf->global->STRIPE_SECURITY_TOKEN_UNIQUE)) + { + $langs->load("members"); + print '
'; + print $langs->trans("EnterRefToBuildUrl",$langs->transnoentitiesnoconv("Member")).': '; + print ''; + print ''; + if (GETPOST('generate_member_ref')) + { + print '
-> '; + $url=getPaypalPaymentUrl(0,'membersubscription',GETPOST('generate_member_ref','alpha')); + print $url; + print "
\n"; + } + print '
'; + } } print "
"; print info_admin($langs->trans("YouCanAddTagOnUrl")); -*/ + +if (! empty($conf->use_javascript_ajax)) +{ + print "\n".''; +} + llxFooter(); - $db->close(); From 169e63d49a5108737f5d951a477e82f54badbb1f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 13 May 2017 22:23:03 +0200 Subject: [PATCH 118/299] Fix set of background for left menu --- htdocs/theme/eldy/style.css.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 92424afbb55..a8e7729f31b 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -918,6 +918,7 @@ td.showDragHandle { display: table-cell; border-right: 1px solid #d0d0d0; box-shadow: 3px 0 6px -2px #eee; + background: rgb(); } div.blockvmenulogo { From 9e4e72baee649d03ca33e5eefaf0f8fde66379b7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 14 May 2017 05:26:19 +0200 Subject: [PATCH 119/299] Enhance module stripe --- htdocs/langs/en_US/paybox.lang | 1 + htdocs/public/payment/newpayment.php | 150 +-- htdocs/public/paypal/newpayment.php | 94 +- htdocs/public/stripe/index.php | 2 +- htdocs/public/stripe/newpayment.php | 1278 +++++++++++++++++++++---- htdocs/stripe/admin/stripe.php | 46 +- htdocs/{public => }/stripe/config.php | 14 +- 7 files changed, 1276 insertions(+), 309 deletions(-) rename htdocs/{public => }/stripe/config.php (82%) diff --git a/htdocs/langs/en_US/paybox.lang b/htdocs/langs/en_US/paybox.lang index c0a55888e7c..91fe071627c 100644 --- a/htdocs/langs/en_US/paybox.lang +++ b/htdocs/langs/en_US/paybox.lang @@ -11,6 +11,7 @@ YourEMail=Email to receive payment confirmation Creditor=Creditor PaymentCode=Payment code PayBoxDoPayment=Go on payment +ToPay=Do payment YouWillBeRedirectedOnPayBox=You will be redirected on secured Paybox page to input you credit card information Continue=Next ToOfferALinkForOnlinePayment=URL for %s payment diff --git a/htdocs/public/payment/newpayment.php b/htdocs/public/payment/newpayment.php index 1ea8e7385ea..744f477782e 100644 --- a/htdocs/public/payment/newpayment.php +++ b/htdocs/public/payment/newpayment.php @@ -1,6 +1,6 @@ - * Copyright (C) 2006-2012 Laurent Destailleur + * Copyright (C) 2006-2017 Laurent Destailleur * Copyright (C) 2009-2012 Regis Houssin * * This program is free software; you can redistribute it and/or modify @@ -24,7 +24,6 @@ * \file htdocs/public/payment/newpayment.php * \ingroup core * \brief File to offer a way to make a payment for a particular Dolibarr entity - * \author Laurent Destailleur */ define("NOLOGIN",1); // This means this output page does not require to be logged. @@ -43,7 +42,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; // Security check -//if (empty($conf->paypal->enabled)) accessforbidden('',0,0,1); +// No check on module enabled. Done later according to $validpaymentmethod $langs->load("main"); $langs->load("other"); @@ -502,10 +501,13 @@ if (GETPOST("source") == 'order') $result=$order->fetch_thirdparty($order->socid); } - $amount=$order->total_ttc; - if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); - $amount=price2num($amount); - + if ($action != 'dopayment') // Do not change amount if we just click on first dopayment + { + $amount=$order->total_ttc; + if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); + $amount=price2num($amount); + } + $fulltag='ORD='.$order->ref.'.CUS='.$order->thirdparty->id; //$fulltag.='.NAM='.strtr($order->thirdparty->name,"-"," "); if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; } @@ -609,10 +611,13 @@ if (GETPOST("source") == 'invoice') $result=$invoice->fetch_thirdparty($invoice->socid); } - $amount=price2num($invoice->total_ttc - $invoice->getSommePaiement()); - if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); - $amount=price2num($amount); - + if ($action != 'dopayment') // Do not change amount if we just click on first dopayment + { + $amount=price2num($invoice->total_ttc - $invoice->getSommePaiement()); + if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); + $amount=price2num($amount); + } + $fulltag='INV='.$invoice->ref.'.CUS='.$invoice->thirdparty->id; //$fulltag.='.NAM='.strtr($invoice->thirdparty->name,"-"," "); if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; } @@ -733,35 +738,38 @@ if (GETPOST("source") == 'contractline') } } - $amount=$contractline->total_ttc; - if ($contractline->fk_product) - { - $product=new Product($db); - $result=$product->fetch($contractline->fk_product); - - // We define price for product (TODO Put this in a method in product class) - if (! empty($conf->global->PRODUIT_MULTIPRICES)) - { - $pu_ht = $product->multiprices[$contract->thirdparty->price_level]; - $pu_ttc = $product->multiprices_ttc[$contract->thirdparty->price_level]; - $price_base_type = $product->multiprices_base_type[$contract->thirdparty->price_level]; - } - else - { - $pu_ht = $product->price; - $pu_ttc = $product->price_ttc; - $price_base_type = $product->price_base_type; - } - - $amount=$pu_ttc; - if (empty($amount)) - { - dol_print_error('','ErrorNoPriceDefinedForThisProduct'); - exit; - } - } - if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); - $amount=price2num($amount); + if ($action != 'dopayment') // Do not change amount if we just click on first dopayment + { + $amount=$contractline->total_ttc; + if ($contractline->fk_product) + { + $product=new Product($db); + $result=$product->fetch($contractline->fk_product); + + // We define price for product (TODO Put this in a method in product class) + if (! empty($conf->global->PRODUIT_MULTIPRICES)) + { + $pu_ht = $product->multiprices[$contract->thirdparty->price_level]; + $pu_ttc = $product->multiprices_ttc[$contract->thirdparty->price_level]; + $price_base_type = $product->multiprices_base_type[$contract->thirdparty->price_level]; + } + else + { + $pu_ht = $product->price; + $pu_ttc = $product->price_ttc; + $price_base_type = $product->price_base_type; + } + + $amount=$pu_ttc; + if (empty($amount)) + { + dol_print_error('','ErrorNoPriceDefinedForThisProduct'); + exit; + } + } + if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); + $amount=price2num($amount); + } $fulltag='COL='.$contractline->ref.'.CON='.$contract->ref.'.CUS='.$contract->thirdparty->id.'.DAT='.dol_print_date(dol_now(),'%Y%m%d%H%M'); //$fulltag.='.NAM='.strtr($contract->thirdparty->name,"-"," "); @@ -911,10 +919,13 @@ if (GETPOST("source") == 'membersubscription') $subscription=new Subscription($db); } - $amount=$subscription->total_ttc; - if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); - $amount=price2num($amount); - + if ($action != 'dopayment') // Do not change amount if we just click on first dopayment + { + $amount=$subscription->total_ttc; + if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); + $amount=price2num($amount); + } + $fulltag='MEM='.$member->id.'.DAT='.dol_print_date(dol_now(),'%Y%m%d%H%M'); if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; } $fulltag=dol_string_unaccent($fulltag); @@ -1035,35 +1046,42 @@ if ($mesg) print '

'. print '
'."\n"; print "\n"; -if ($found && ! $error) // We are in a management option and no error +if ($action != 'dopayment') { - // Buttons for all payments registration methods - - if (! empty($conf->paypal->enabled)) + if ($found && ! $error) // We are in a management option and no error { - if (empty($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY)) $conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY='integral'; - - if ($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY == 'integral') - { - print '
'; - } - if ($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY == 'paypalonly') - { - print '
'; - } - } - - if (! empty($conf->paypal->enabled)) - { - + // Buttons for all payments registration methods - } + if (! empty($conf->paypal->enabled)) + { + if (empty($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY)) $conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY='integral'; + + if ($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY == 'integral') + { + print '
'; + } + if ($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY == 'paypalonly') + { + print '
'; + } + } - // TODO Other methods + if (! empty($conf->paybox->enabled)) + { + + + } + + // TODO Other methods + } + else + { + dol_print_error_email('ERRORNEWPAYMENTPAYPAL'); + } } else { - dol_print_error_email('ERRORNEWPAYMENTPAYPAL'); + // Print } print '
'."\n"; + +// Show logo (search order: logo defined by PAYBOX_LOGO_suffix, then PAYBOX_LOGO, then small company logo, large company logo, theme logo, common logo) +$width=0; +// Define logo and logosmall +$logosmall=$mysoc->logo_small; +$logo=$mysoc->logo; +$paramlogo='STRIPE_LOGO_'.$suffix; +if (! empty($conf->global->$paramlogo)) $logosmall=$conf->global->$paramlogo; +else if (! empty($conf->global->STRIPE_LOGO)) $logosmall=$conf->global->STRIPE_LOGO; +//print ''."\n"; +// Define urllogo +$urllogo=''; +if (! empty($logosmall) && is_readable($conf->mycompany->dir_output.'/logos/thumbs/'.$logosmall)) +{ + $urllogo=DOL_URL_ROOT.'/viewimage.php?modulepart=mycompany&file='.urlencode('thumbs/'.$logosmall); +} +elseif (! empty($logo) && is_readable($conf->mycompany->dir_output.'/logos/'.$logo)) +{ + $urllogo=DOL_URL_ROOT.'/viewimage.php?modulepart=mycompany&file='.urlencode($logo); + $width=96; +} +// Output html code for logo +if ($urllogo) +{ + print ''; + print ''; + print ''."\n"; +} + +// Output introduction text +$text=''; +if (! empty($conf->global->STRIPE_NEWFORM_TEXT)) +{ + $langs->load("members"); + if (preg_match('/^\((.*)\)$/',$conf->global->STRIPE_NEWFORM_TEXT,$reg)) $text.=$langs->trans($reg[1])."
\n"; + else $text.=$conf->global->STRIPE_NEWFORM_TEXT."
\n"; + $text=''."\n"; +} +if (empty($text)) +{ + $text.=''."\n"; + $text.=''."\n"; +} +print $text; + +// Output payment summary form +print '

'.$text.'

'.$langs->trans("WelcomeOnPaymentPage").'

'.$langs->trans("ThisScreenAllowsYouToPay",$creditor).'

'; +print ''; +print ''."\n"; + +$found=false; +$error=0; +$var=false; + +// Free payment +if (! GETPOST("source")) +{ + $found=true; + $tag=GETPOST("tag"); + $fulltag=$tag; + + // Creditor + print ''."\n"; + + // Amount + print ''."\n"; + + // Tag + + print ''."\n"; + + // We do not add fields shipToName, shipToStreet, shipToCity, shipToState, shipToCountryCode, shipToZip, shipToStreet2, phoneNum + // as they don't exists (buyer is unknown, tag is free). +} + + +// Payment on customer order +if (GETPOST("source") == 'order') +{ + $found=true; + $langs->load("orders"); + + require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php'; + + $order=new Commande($db); + $result=$order->fetch('',$ref); + if ($result < 0) + { + $mesg=$order->error; + $error++; + } + else + { + $result=$order->fetch_thirdparty($order->socid); + } + + if ($action != 'dopayment') // Do not change amount if we just click on first dopayment + { + $amount=$order->total_ttc; + if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); + $amount=price2num($amount); + } + + $fulltag='ORD='.$order->ref.'.CUS='.$order->thirdparty->id; + //$fulltag.='.NAM='.strtr($order->thirdparty->name,"-"," "); + if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; } + $fulltag=dol_string_unaccent($fulltag); + + // Creditor + + print ''."\n"; + + // Debitor + + print ''."\n"; + + // Amount + + print ''."\n"; + + // Tag + + print ''."\n"; + + // Shipping address + $shipToName=$order->thirdparty->name; + $shipToStreet=$order->thirdparty->address; + $shipToCity=$order->thirdparty->town; + $shipToState=$order->thirdparty->state_code; + $shipToCountryCode=$order->thirdparty->country_code; + $shipToZip=$order->thirdparty->zip; + $shipToStreet2=''; + $phoneNum=$order->thirdparty->phone; + if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) + { + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + } + else + { + print ''."\n"; + } + print ''."\n"; + print 'ref.'">'."\n"; +} -$invoice = null; // Payment on customer invoice -if ($source == 'invoice') +if (GETPOST("source") == 'invoice') { - $found=true; - $langs->load("bills"); + $found=true; + $langs->load("bills"); - require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; + require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; - $invoice=new Facture($db); - $result=$invoice->fetch('',$ref); - if ($result < 0) - { - $mesg=$invoice->error; - $error++; - } - else - { - $result=$invoice->fetch_thirdparty($invoice->socid); - } + $invoice=new Facture($db); + $result=$invoice->fetch('',$ref); + if ($result < 0) + { + $mesg=$invoice->error; + $error++; + } + else + { + $result=$invoice->fetch_thirdparty($invoice->socid); + } + + if ($action != 'dopayment') // Do not change amount if we just click on first dopayment + { + $amount=price2num($invoice->total_ttc - $invoice->getSommePaiement()); + if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); + $amount=price2num($amount); + } + + $fulltag='INV='.$invoice->ref.'.CUS='.$invoice->thirdparty->id; + //$fulltag.='.NAM='.strtr($invoice->thirdparty->name,"-"," "); + if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; } + $fulltag=dol_string_unaccent($fulltag); + + // Creditor + + print ''."\n"; + + // Debitor + + print ''."\n"; + + // Amount + + print ''."\n"; + + // Tag + + print ''."\n"; + + // Shipping address + $shipToName=$invoice->thirdparty->name; + $shipToStreet=$invoice->thirdparty->address; + $shipToCity=$invoice->thirdparty->town; + $shipToState=$invoice->thirdparty->state_code; + $shipToCountryCode=$invoice->thirdparty->country_code; + $shipToZip=$invoice->thirdparty->zip; + $shipToStreet2=''; + $phoneNum=$invoice->thirdparty->phone; + if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) + { + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + } + else + { + print ''."\n"; + } + print ''."\n"; + print 'ref.'">'."\n"; } -$pay = false; -$ttc = $invoice->total_ttc ; -$ttc = $ttc * 100; -if (GETPOST("action") == 'charge') +// Payment on contract line +if (GETPOST("source") == 'contractline') { - $token = GETPOST("stripeToken"); - $email = GETPOST("stripeEmail"); + $found=true; + $langs->load("contracts"); - $customer = \stripe\Customer::create(array( - 'email' => $email, - 'card' => $token - )); - - $ttc = round($ttc, 2); - $charge = \stripe\Charge::create(array( - 'customer' => $customer->id, - 'amount' => $ttc, - 'currency' => $conf->currency, - 'description' => 'Invoice payment N: '.$ref - )); + require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php'; - $pay = true; - + $contractline=new ContratLigne($db); + $result=$contractline->fetch('',$ref); + if ($result < 0) + { + $mesg=$contractline->error; + $error++; + } + else + { + if ($contractline->fk_contrat > 0) + { + $contract=new Contrat($db); + $result=$contract->fetch($contractline->fk_contrat); + if ($result > 0) + { + $result=$contract->fetch_thirdparty($contract->socid); + } + else + { + $mesg=$contract->error; + $error++; + } + } + else + { + $mesg='ErrorRecordNotFound'; + $error++; + } + } + + if ($action != 'dopayment') // Do not change amount if we just click on first dopayment + { + $amount=$contractline->total_ttc; + if ($contractline->fk_product) + { + $product=new Product($db); + $result=$product->fetch($contractline->fk_product); + + // We define price for product (TODO Put this in a method in product class) + if (! empty($conf->global->PRODUIT_MULTIPRICES)) + { + $pu_ht = $product->multiprices[$contract->thirdparty->price_level]; + $pu_ttc = $product->multiprices_ttc[$contract->thirdparty->price_level]; + $price_base_type = $product->multiprices_base_type[$contract->thirdparty->price_level]; + } + else + { + $pu_ht = $product->price; + $pu_ttc = $product->price_ttc; + $price_base_type = $product->price_base_type; + } + + $amount=$pu_ttc; + if (empty($amount)) + { + dol_print_error('','ErrorNoPriceDefinedForThisProduct'); + exit; + } + } + + if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); + $amount=price2num($amount); + } + + $fulltag='COL='.$contractline->ref.'.CON='.$contract->ref.'.CUS='.$contract->thirdparty->id.'.DAT='.dol_print_date(dol_now(),'%Y%m%d%H%M'); + //$fulltag.='.NAM='.strtr($contract->thirdparty->name,"-"," "); + if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; } + $fulltag=dol_string_unaccent($fulltag); + + $qty=1; + if (GETPOST('qty')) $qty=GETPOST('qty'); + + // Creditor + + print ''."\n"; + + // Debitor + + print ''."\n"; + + // Quantity + + $label=$langs->trans("Quantity"); + $qty=1; + $duration=''; + if ($contractline->fk_product) + { + if ($product->isService() && $product->duration_value > 0) + { + $label=$langs->trans("Duration"); + + // TODO Put this in a global method + if ($product->duration_value > 1) + { + $dur=array("h"=>$langs->trans("Hours"),"d"=>$langs->trans("DurationDays"),"w"=>$langs->trans("DurationWeeks"),"m"=>$langs->trans("DurationMonths"),"y"=>$langs->trans("DurationYears")); + } + else + { + $dur=array("h"=>$langs->trans("Hour"),"d"=>$langs->trans("DurationDay"),"w"=>$langs->trans("DurationWeek"),"m"=>$langs->trans("DurationMonth"),"y"=>$langs->trans("DurationYear")); + } + $duration=$product->duration_value.' '.$dur[$product->duration_unit]; + } + } + print ''; + print ''."\n"; + + // Amount + + print ''."\n"; + + // Tag + + print ''."\n"; + + // Shipping address + $shipToName=$contract->thirdparty->name; + $shipToStreet=$contract->thirdparty->address; + $shipToCity=$contract->thirdparty->town; + $shipToState=$contract->thirdparty->state_code; + $shipToCountryCode=$contract->thirdparty->country_code; + $shipToZip=$contract->thirdparty->zip; + $shipToStreet2=''; + $phoneNum=$contract->thirdparty->phone; + if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) + { + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + } + else + { + print ''."\n"; + } + print ''."\n"; + print 'ref.'">'."\n"; +} + +// Payment on member subscription +if (GETPOST("source") == 'membersubscription') +{ + $found=true; + $langs->load("members"); + + require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; + require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php'; + + $member=new Adherent($db); + $result=$member->fetch('',$ref); + if ($result < 0) + { + $mesg=$member->error; + $error++; + } + else + { + $subscription=new Subscription($db); + } + + if ($action != 'dopayment') // Do not change amount if we just click on first dopayment + { + $amount=$subscription->total_ttc; + if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); + $amount=price2num($amount); + } + + $fulltag='MEM='.$member->id.'.DAT='.dol_print_date(dol_now(),'%Y%m%d%H%M'); + if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; } + $fulltag=dol_string_unaccent($fulltag); + + // Creditor + + print ''."\n"; + + // Debitor + + print ''."\n"; + + if ($member->last_subscription_date || $member->last_subscription_amount) + { + // Last subscription date + + print ''."\n"; + + // Last subscription amount + + print ''."\n"; + + if (empty($amount) && ! GETPOST('newamount')) $_GET['newamount']=$member->last_subscription_amount; + } + + // Amount + + print ''."\n"; + + // Tag + + print ''."\n"; + + // Shipping address + $shipToName=$member->getFullName($langs); + $shipToStreet=$member->address; + $shipToCity=$member->town; + $shipToState=$member->state_code; + $shipToCountryCode=$member->country_code; + $shipToZip=$member->zip; + $shipToStreet2=''; + $phoneNum=$member->phone; + if ($shipToName && $shipToStreet && $shipToCity && $shipToCountryCode && $shipToZip) + { + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + } + else + { + print ''."\n"; + } + print ''."\n"; + print ''."\n"; } -?> +if (! $found && ! $mesg) $mesg=$langs->trans("ErrorBadParameters"); - - - - - <?php echo $langs->trans('PaymentForm'); ?> - - +if ($mesg) print ''."\n"; - -
-
'.$langs->trans("ThisIsInformationOnPayment").' :
'.$langs->trans("Creditor"); + print ''.$creditor.''; + print ''; + print '
'.$langs->trans("Amount"); + if (empty($amount)) print ' ('.$langs->trans("ToComplete").')'; + print ''; + if (empty($amount) || ! is_numeric($amount)) + { + print ''; + print ''; + } + else { + print ''.price($amount).''; + print ''; + print ''; + } + // Currency + print ' '.$langs->trans("Currency".$currency).''; + print ''; + print '
'.$langs->trans("PaymentCode"); + print ''.$fulltag.''; + print ''; + print ''; + print '
'.$langs->trans("Creditor"); + print ''.$creditor.''; + print ''; + print '
'.$langs->trans("ThirdParty"); + print ''.$order->thirdparty->name.''; + + // Object + + $text=''.$langs->trans("PaymentOrderRef",$order->ref).''; + print '
'.$langs->trans("Designation"); + print ''.$text; + print ''; + print ''; + print '
'.$langs->trans("Amount"); + if (empty($amount)) print ' ('.$langs->trans("ToComplete").')'; + print ''; + if (empty($amount) || ! is_numeric($amount)) + { + print ''; + print ''; + } + else { + print ''.price($amount).''; + print ''; + print ''; + } + // Currency + print ' '.$langs->trans("Currency".$currency).''; + print ''; + print '
'.$langs->trans("PaymentCode"); + print ''.$fulltag.''; + print ''; + print ''; + print '
'.$langs->trans("Creditor"); + print ''.$creditor.''; + print ''; + print '
'.$langs->trans("ThirdParty"); + print ''.$invoice->thirdparty->name.''; + + // Object + + $text=''.$langs->trans("PaymentInvoiceRef",$invoice->ref).''; + print '
'.$langs->trans("Designation"); + print ''.$text; + print ''; + print ''; + print '
'.$langs->trans("Amount"); + if (empty($amount)) print ' ('.$langs->trans("ToComplete").')'; + print ''; + if (empty($amount) || ! is_numeric($amount)) + { + print ''; + print ''; + } + else { + print ''.price($amount).''; + print ''; + print ''; + } + // Currency + print ' '.$langs->trans("Currency".$currency).''; + print ''; + print '
'.$langs->trans("PaymentCode"); + print ''.$fulltag.''; + print ''; + print ''; + print '
'.$langs->trans("Creditor"); + print ''.$creditor.''; + print ''; + print '
'.$langs->trans("ThirdParty"); + print ''.$contract->thirdparty->name.''; + + // Object + + $text=''.$langs->trans("PaymentRenewContractId",$contract->ref,$contractline->ref).''; + if ($contractline->fk_product) + { + $text.='
'.$product->ref.($product->label?' - '.$product->label:''); + } + if ($contractline->description) $text.='
'.dol_htmlentitiesbr($contractline->description); + //if ($contractline->date_fin_validite) { + // $text.='
'.$langs->trans("DateEndPlanned").': '; + // $text.=dol_print_date($contractline->date_fin_validite); + //} + if ($contractline->date_fin_validite) + { + $text.='
'.$langs->trans("ExpiredSince").': '.dol_print_date($contractline->date_fin_validite); + } + + print '
'.$langs->trans("Designation"); + print ''.$text; + print ''; + print ''; + print '
'.$label.''.($duration?$duration:$qty).''; + print ''; + print '
'.$langs->trans("Amount"); + if (empty($amount)) print ' ('.$langs->trans("ToComplete").')'; + print ''; + if (empty($amount) || ! is_numeric($amount)) + { + print ''; + print ''; + } + else { + print ''.price($amount).''; + print ''; + print ''; + } + // Currency + print ' '.$langs->trans("Currency".$currency).''; + print ''; + print '
'.$langs->trans("PaymentCode"); + print ''.$fulltag.''; + print ''; + print ''; + print '
'.$langs->trans("Creditor"); + print ''.$creditor.''; + print ''; + print '
'.$langs->trans("Member"); + print ''; + if ($member->morphy == 'mor' && ! empty($member->societe)) print $member->societe; + else print $member->getFullName($langs); + print ''; + + // Object + + $text=''.$langs->trans("PaymentSubscription").''; + print '
'.$langs->trans("Designation"); + print ''.$text; + print ''; + print ''; + print '
'.$langs->trans("LastSubscriptionDate"); + print ''.dol_print_date($member->last_subscription_date,'day'); + print '
'.$langs->trans("LastSubscriptionAmount"); + print ''.price($member->last_subscription_amount); + print '
'.$langs->trans("Amount"); + if (empty($amount)) + { + print ' ('.$langs->trans("ToComplete"); + if (! empty($conf->global->MEMBER_EXT_URL_SUBSCRIPTION_INFO)) print ' - '.$langs->trans("SeeHere").''; + print ')'; + } + print ''; + if (empty($amount) || ! is_numeric($amount)) + { + $valtoshow=GETPOST("newamount",'int'); + if (! empty($conf->global->MEMBER_MIN_AMOUNT) && $valtoshow) $valtoshow=max($conf->global->MEMBER_MIN_AMOUNT,$valtoshow); + print ''; + print ''; + } + else { + $valtoshow=$amount; + if (! empty($conf->global->MEMBER_MIN_AMOUNT) && $valtoshow) $valtoshow=max($conf->global->MEMBER_MIN_AMOUNT,$valtoshow); + print ''.price($valtoshow).''; + print ''; + print ''; + } + // Currency + print ' '.$langs->trans("Currency".$currency).''; + print ''; + print '
'.$langs->trans("PaymentCode"); + print ''.$fulltag.''; + print ''; + print ''; + print '

'.$mesg.'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - -
- '; - print ''; - - ?> - - - - - trans("Invoice") . ' : ' . $invoice->ref; ?>
- trans('Date') . ' : ' . dol_print_date($invoice->date, 'day'); ?>
- trans('DateMaxPayment') . ' : ' . dol_print_date($invoice->date_validation, 'day'); ?> -
-
- - - - - - -
- thirdparty->name; ?>
- thirdparty->address; ?>
- thirdparty->zip . ', ' . $invoice->thirdparty->town .' '. $invoice->thirdparty->country_code ; ?> -
- -
-
- trans('PaymentConditionsShort'); ?> - - form_conditions_reglement('', $invoice->cond_reglement_id, 'none'); ?> -
- TOTAL - -
- trans('AmountHT'); ?> - - total_ht, 1, '', 1, - 1, - 1, $conf->currency); ?> -
- trans('AmountVAT'); ?> - - total_tva, 1, '', 1, - 1, - 1, $conf->currency); ?> -
- trans('AmountTTC'); ?> - - total_ttc, 1, '', 1, - 1, - 1, $conf->currency); ?> -
- Total: total_ttc, 1, '', 1, - 1, - 1, $conf->currency); ?> -
- - - - - - - - +print '
'."\n"; +print "\n"; + + +if ($action != 'dopayment') +{ + if ($found && ! $error) // We are in a management option and no error + { + print '
'; + } + else + { + dol_print_error_email('ERRORNEWPAYMENTSTRIPE'); + } +} + + +print ''."\n"; + +print ''."\n"; +print ''."\n"; +print '
'."\n"; +print '
'; + + +// Add more content on page for some services +if (preg_match('/^dopayment/',$action)) +{ + // Simple checkout + /* + print ''; + */ + + // Personalized checkout + print ''; + + print ' + +
+
'; + + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''; + + print ' + +
+ +
+ +
+
+ + + +
+
+ + +
+ +
- - + + + + + '; +} +htmlPrintOnlinePaymentFooter($mysoc,$langs); + +llxFooter('', 'public'); + +$db->close(); diff --git a/htdocs/stripe/admin/stripe.php b/htdocs/stripe/admin/stripe.php index 3dd238b2f1d..484b7537755 100644 --- a/htdocs/stripe/admin/stripe.php +++ b/htdocs/stripe/admin/stripe.php @@ -47,15 +47,15 @@ if ($action == 'setvalue' && $user->admin) $result=dolibarr_set_const($db, "STRIPE_LIVE",GETPOST('STRIPE_LIVE','alpha'),'chaine',0,'',$conf->entity); if (! $result > 0) $error++; - $result=dolibarr_set_const($db, "STRIPE_TEST_SECRET_KEY",GETPOST('STRIPE_TEST_SECRET_KEY','alpha'),'chaine',0,'',$conf->entity); - if (! $result > 0) $error++; $result=dolibarr_set_const($db, "STRIPE_TEST_PUBLISHABLE_KEY",GETPOST('STRIPE_TEST_PUBLISHABLE_KEY','alpha'),'chaine',0,'',$conf->entity); if (! $result > 0) $error++; - $result=dolibarr_set_const($db, "STRIPE_LIVE_SECRET_KEY",GETPOST('STRIPE_LIVE_SECRET_KEY','alpha'),'chaine',0,'',$conf->entity); + $result=dolibarr_set_const($db, "STRIPE_TEST_SECRET_KEY",GETPOST('STRIPE_TEST_SECRET_KEY','alpha'),'chaine',0,'',$conf->entity); if (! $result > 0) $error++; $result=dolibarr_set_const($db, "STRIPE_LIVE_PUBLISHABLE_KEY",GETPOST('STRIPE_LIVE_PUBLISHABLE_KEY','alpha'),'chaine',0,'',$conf->entity); if (! $result > 0) $error++; - $result=dolibarr_set_const($db, "STRIPE_CREDITOR",GETPOST('STRIPE_CREDITOR','alpha'),'chaine',0,'',$conf->entity); + $result=dolibarr_set_const($db, "STRIPE_LIVE_SECRET_KEY",GETPOST('STRIPE_LIVE_SECRET_KEY','alpha'),'chaine',0,'',$conf->entity); + if (! $result > 0) $error++; + $result=dolibarr_set_const($db, "STRIPE_CREDITOR",GETPOST('STRIPE_CREDITOR','alpha'),'chaine',0,'',$conf->entity); if (! $result > 0) $error++; $result=dolibarr_set_const($db, "STRIPE_CSS_URL",GETPOST('STRIPE_CSS_URL','alpha'),'chaine',0,'',$conf->entity); if (! $result > 0) $error++; @@ -97,15 +97,15 @@ if ($action=="setlive") $form=new Form($db); -$SECRET_TEST_KEY="sk_test_xxxxxxxxxxxxxxxxxxxxxxxx"; // Stripe test secret key -if (empty($conf->global->STRIPE_TEST_SECRET_KEY)) $conf->global->STRIPE_TEST_SECRET_KEY = $SECRET_TEST_KEY; -$PUBLISHABLE_TEST_KEY="pk_test_xxxxxxxxxxxxxxxxxxxxxxxx"; // Stripe test publishable key -if (empty($conf->global->STRIPE_TEST_PUBLISHABLE_KEY)) $conf->global->STRIPE_TEST_PUBLISHABLE_KEY = $PUBLISHABLE_TEST_KEY; +//$SECRET_TEST_KEY="sk_test_xxxxxxxxxxxxxxxxxxxxxxxx"; // Stripe test secret key +//if (empty($conf->global->STRIPE_TEST_SECRET_KEY)) $conf->global->STRIPE_TEST_SECRET_KEY = $SECRET_TEST_KEY; +//$PUBLISHABLE_TEST_KEY="pk_test_xxxxxxxxxxxxxxxxxxxxxxxx"; // Stripe test publishable key +//if (empty($conf->global->STRIPE_TEST_PUBLISHABLE_KEY)) $conf->global->STRIPE_TEST_PUBLISHABLE_KEY = $PUBLISHABLE_TEST_KEY; -$SECRET_LIVE_KEY="sk_live_xxxxxxxxxxxxxxxxxxxxxxxx"; // Stripe live secret key -if (empty($conf->global->STRIPE_LIVE_SECRET_KEY)) $conf->global->STRIPE_LIVE_SECRET_KEY = $SECRET_LIVE_KEY; -$PUBLISHABLE_LIVE_KEY="pk_live_xxxxxxxxxxxxxxxxxxxxxxxx"; // Stripe live publishable key -if (empty($conf->global->STRIPE_LIVE_PUBLISHABLE_KEY)) $conf->global->STRIPE_LIVE_PUBLISHABLE_KEY = $PUBLISHABLE_LIVE_KEY; +//$SECRET_LIVE_KEY="sk_live_xxxxxxxxxxxxxxxxxxxxxxxx"; // Stripe live secret key +//if (empty($conf->global->STRIPE_LIVE_SECRET_KEY)) $conf->global->STRIPE_LIVE_SECRET_KEY = $SECRET_LIVE_KEY; +//$PUBLISHABLE_LIVE_KEY="pk_live_xxxxxxxxxxxxxxxxxxxxxxxx"; // Stripe live publishable key +//if (empty($conf->global->STRIPE_LIVE_PUBLISHABLE_KEY)) $conf->global->STRIPE_LIVE_PUBLISHABLE_KEY = $PUBLISHABLE_LIVE_KEY; llxHeader('',$langs->trans("StripeSetup")); @@ -145,30 +145,30 @@ else } print ''; -print ''; -print ''.$langs->trans("STRIPE_TEST_SECRET_KEY").''; -print ''; -print '
'.$langs->trans("Example").': sk_test_xxxxxxxxxxxxxxxxxxxxxxxx'; -print ''; - print ''; print ''.$langs->trans("STRIPE_TEST_PUBLISHABLE_KEY").''; -print ''; +print ''; print '
'.$langs->trans("Example").': pk_test_xxxxxxxxxxxxxxxxxxxxxxxx'; print ''; print ''; -print ''.$langs->trans("STRIPE_LIVE_SECRET_KEY").''; -print ''; -print '
'.$langs->trans("Example").': sk_live_xxxxxxxxxxxxxxxxxxxxxxxx'; +print ''.$langs->trans("STRIPE_TEST_SECRET_KEY").''; +print ''; +print '
'.$langs->trans("Example").': sk_test_xxxxxxxxxxxxxxxxxxxxxxxx'; print ''; print ''; print ''.$langs->trans("STRIPE_LIVE_PUBLISHABLE_KEY").''; -print ''; +print ''; print '
'.$langs->trans("Example").': pk_live_xxxxxxxxxxxxxxxxxxxxxxxx'; print ''; +print ''; +print ''.$langs->trans("STRIPE_LIVE_SECRET_KEY").''; +print ''; +print '
'.$langs->trans("Example").': sk_live_xxxxxxxxxxxxxxxxxxxxxxxx'; +print ''; + print ''; print '
'; diff --git a/htdocs/public/stripe/config.php b/htdocs/stripe/config.php similarity index 82% rename from htdocs/public/stripe/config.php rename to htdocs/stripe/config.php index dfd0ea6aa1a..0cc15c7fb60 100644 --- a/htdocs/public/stripe/config.php +++ b/htdocs/stripe/config.php @@ -17,21 +17,22 @@ */ /** -* \file stripe/config.php +* \file htdocs/public/stripe/config.php * \ingroup Stripe * \brief Page to move config in api */ -require '../../main.inc.php'; - require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/stripe/lib/stripe.lib.php'; require_once DOL_DOCUMENT_ROOT.'/includes/stripe/init.php'; +global $stripe; +global $conf; + //use \includes\stripe as stripe; $stripe = array(); -if(empty($conf->global->SKYPE_LIVE)) +if (empty($conf->global->SKYPE_LIVE)) { $stripe = array( "secret_key" => $conf->global->STRIPE_TEST_SECRET_KEY, @@ -46,4 +47,7 @@ else ); } -\includes\stripe::setApiKey($stripe['secret_key']); \ No newline at end of file +require_once DOL_DOCUMENT_ROOT."/includes/stripe/lib/Stripe.php"; +require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; + +\Stripe\Stripe::setApiKey($stripe['secret_key']); From 143c019905e571321feb4fa7a385cc82aa9d6e85 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sun, 14 May 2017 08:07:34 +0200 Subject: [PATCH 120/299] Fix : Sql error on salaries index for accountancy multijournal + debug --- htdocs/compta/bank/card.php | 51 +++++++------------ htdocs/compta/bank/class/account.class.php | 2 +- htdocs/compta/salaries/index.php | 15 ++++-- .../core/class/html.formaccounting.class.php | 4 +- 4 files changed, 34 insertions(+), 38 deletions(-) diff --git a/htdocs/compta/bank/card.php b/htdocs/compta/bank/card.php index 804d2c5511d..5c9fcf7802a 100644 --- a/htdocs/compta/bank/card.php +++ b/htdocs/compta/bank/card.php @@ -101,7 +101,8 @@ if ($action == 'add') $account_number = GETPOST('account_number','alpha'); if ($account_number <= 0) { $object->account_number = ''; } else { $object->account_number = $account_number; } - $object->fk_accountancy_journal = trim($_POST["fk_accountancy_journal"]); + $fk_accountancy_journal = GETPOST('fk_accountancy_journal','int'); + if ($fk_accountancy_journal <= 0) { $object->fk_accountancy_journal = ''; } else { $object->fk_accountancy_journal = $fk_accountancy_journal; } $object->solde = $_POST["solde"]; $object->date_solde = dol_mktime(12,0,0,$_POST["remonth"],$_POST["reday"],$_POST["reyear"]); @@ -199,7 +200,8 @@ if ($action == 'update') $account_number = GETPOST('account_number', 'int'); if ($account_number <= 0) { $object->account_number = ''; } else { $object->account_number = $account_number; } - $object->fk_accountancy_journal = trim($_POST["fk_accountancy_journal"]); + $fk_accountancy_journal = GETPOST('fk_accountancy_journal','int'); + if ($fk_accountancy_journal <= 0) { $object->fk_accountancy_journal = ''; } else { $object->fk_accountancy_journal = $fk_accountancy_journal; } $object->currency_code = trim($_POST["account_currency_code"]); @@ -502,35 +504,20 @@ if ($action == 'create') print ''; // Accountancy code - if (! empty($conf->global->MAIN_BANK_ACCOUNTANCY_CODE_ALWAYS_REQUIRED)) - { - if (! empty($conf->accounting->enabled)) - { - print ''; - print ''; - } - else - { - print ''; - print ''; - } + $fieldrequired=''; + if (! empty($conf->global->MAIN_BANK_ACCOUNTANCY_CODE_ALWAYS_REQUIRED)) $fieldrequired='fieldrequired '; + + if (! empty($conf->accounting->enabled)) + { + print ''; + print ''; } - else - { - if (! empty($conf->accounting->enabled)) - { - print ''; - print ''; - } - else - { - print ''; - print ''; - } + else + { + print ''; + print ''; } // Accountancy journal @@ -538,7 +525,7 @@ if ($action == 'create') { print ''; print ''; } @@ -994,7 +981,7 @@ else { print ''; print ''; } diff --git a/htdocs/compta/bank/class/account.class.php b/htdocs/compta/bank/class/account.class.php index 9fdd329fd3d..2a615ad4b69 100644 --- a/htdocs/compta/bank/class/account.class.php +++ b/htdocs/compta/bank/class/account.class.php @@ -1259,7 +1259,7 @@ class Account extends CommonObject include_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; $langs->load("accountancy"); $label .= '
' . $langs->trans('AccountAccounting') . ': ' . length_accountg($this->account_number); - $label .= '
' . $langs->trans('AccountancyJournal') . ': ' . $this->fk_accountancy_journal; + $label .= '
' . $langs->trans('AccountancyJournal') . ': ' . $this->accountancy_journal; } $linkclose = '" title="'.dol_escape_htmltag($label, 1).'" class="classfortooltip">'; diff --git a/htdocs/compta/salaries/index.php b/htdocs/compta/salaries/index.php index 597b8aabad0..5e78a070796 100644 --- a/htdocs/compta/salaries/index.php +++ b/htdocs/compta/salaries/index.php @@ -26,6 +26,7 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/compta/salaries/class/paymentsalary.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; +if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingjournal.class.php'; $langs->load("compta"); $langs->load("salaries"); @@ -94,7 +95,7 @@ $accountstatic = new Account($db); $sql = "SELECT u.rowid as uid, u.lastname, u.firstname, u.login, u.email, u.admin, u.salary as current_salary, u.fk_soc as fk_soc,"; $sql.= " s.rowid, s.fk_user, s.amount, s.salary, s.label, s.datep as datep, s.datev as datev, s.fk_typepayment as type, s.num_payment, s.fk_bank,"; -$sql.= " ba.rowid as bid, ba.ref as bref, ba.number as bnumber, ba.account_number, ba.accountancy_journal, ba.label as blabel,"; +$sql.= " ba.rowid as bid, ba.ref as bref, ba.number as bnumber, ba.account_number, ba.fk_accountancy_journal, ba.label as blabel,"; $sql.= " pst.code as payment_code"; $sql.= " FROM ".MAIN_DB_PREFIX."payment_salary as s"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_paiement as pst ON s.fk_typepayment = pst.id"; @@ -236,8 +237,16 @@ if ($result) $accountstatic->id=$obj->bid; $accountstatic->ref=$obj->bref; $accountstatic->number=$obj->bnumber; - $accountstatic->accountancy_number=$obj->account_number; - $accountstatic->accountancy_journal=$obj->accountancy_journal; + + if (! empty($conf->accounting->enabled)) + { + $accountstatic->account_number=$obj->account_number; + + $accountingjournal = new AccountingJournal($db); + $accountingjournal->fetch($obj->fk_accountancy_journal); + + $accountstatic->accountancy_journal = $accountingjournal->getNomUrl(0,1,1,'',1); + } $accountstatic->label=$obj->blabel; print $accountstatic->getNomUrl(1); } diff --git a/htdocs/core/class/html.formaccounting.class.php b/htdocs/core/class/html.formaccounting.class.php index a87b566d0d6..97f31f05e99 100644 --- a/htdocs/core/class/html.formaccounting.class.php +++ b/htdocs/core/class/html.formaccounting.class.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2016-2017 Alexandre Spangaro * * 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 @@ -121,7 +121,7 @@ class FormAccounting extends Form } } - $out .= Form::selectarray($htmlname, $options, $select, $showempty, 0, 0, '', 0, 0, 0, '', $morecss, 1); + $out .= Form::selectarray($htmlname, $options, $selected, $showempty, 0, 0, '', 0, 0, 0, '', $morecss, 1); return $out; } From 9b550ae178a57901884cf1a72f898cf6e9717f8f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 14 May 2017 12:54:26 +0200 Subject: [PATCH 121/299] Fix migration of accountancy_journal from char to num. --- .../install/mysql/migration/5.0.0-6.0.0.sql | 38 +++++++++++-------- .../mysql/tables/llx_bank_account.key.sql | 3 +- htdocs/public/stripe/newpayment.php | 4 +- 3 files changed, 27 insertions(+), 18 deletions(-) diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index bf28e6a3db6..7572e0d2030 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -117,17 +117,33 @@ CREATE TABLE llx_product_attribute_combination entity INT DEFAULT 1 NOT NULL ); -INSERT INTO llx_accounting_journal (rowid, code, label, nature, active) VALUES (1,'VT', 'Journal des ventes', 1, 1); -INSERT INTO llx_accounting_journal (rowid, code, label, nature, active) VALUES (2,'AC', 'Journal des achats', 2, 1); -INSERT INTO llx_accounting_journal (rowid, code, label, nature, active) VALUES (3,'BQ', 'Journal de banque', 3, 1); -INSERT INTO llx_accounting_journal (rowid, code, label, nature, active) VALUES (4,'OD', 'Journal des opérations diverses', 0, 1); -INSERT INTO llx_accounting_journal (rowid, code, label, nature, active) VALUES (5,'AN', 'Journal des à-nouveaux', 9, 1); -ALTER TABLE llx_accounting_journal ADD COLUMN entity integer DEFAULT 1; +ALTER TABLE llx_bank_account drop foreign key bank_fk_accountancy_journal; + +-- Add journal entries +INSERT INTO llx_accounting_journal (rowid, code, label, nature, active) VALUES (1,'VT', 'Sale journal', 2, 1); +INSERT INTO llx_accounting_journal (rowid, code, label, nature, active) VALUES (2,'AC', 'Purchase journal', 3, 1); +INSERT INTO llx_accounting_journal (rowid, code, label, nature, active) VALUES (3,'BQ', 'Bank journal', 4, 1); +INSERT INTO llx_accounting_journal (rowid, code, label, nature, active) VALUES (4,'OD', 'Other journal', 1, 1); +INSERT INTO llx_accounting_journal (rowid, code, label, nature, active) VALUES (5,'AN', 'Has new journal', 9, 1); +-- Fix old entries +UPDATE llx_accounting_journal SET nature = 1 where code = 'OD' and nature = 0; +UPDATE llx_accounting_journal SET nature = 2 where code = 'VT' and nature = 1; +UPDATE llx_accounting_journal SET nature = 3 where code = 'AC' and nature = 2; +UPDATE llx_accounting_journal SET nature = 4 where (code = 'BK' or code = 'BQ') and nature = 3; + +UPDATE llx_bank_account as ba set accountancy_journal = 'BQ' where accountancy_journal = 'BK'; +UPDATE llx_bank_account as ba set accountancy_journal = 'OD' where accountancy_journal IS NULL; + +ALTER TABLE llx_bank_account ADD COLUMN fk_accountancy_journal integer; +ALTER TABLE llx_bank_account ADD INDEX idx_fk_accountancy_journal (fk_accountancy_journal); + +UPDATE llx_bank_account as ba set fk_accountancy_journal = (SELECT rowid FROM llx_accounting_journal as aj where ba.accountancy_journal = aj.code) where accountancy_journal not in ('1', '2', '3', '4', '5', '6', '5', '8', '9', '10', '11', '12', '13', '14', '15'); +ALTER TABLE llx_bank_account ADD CONSTRAINT fk_bank_account_accountancy_journal FOREIGN KEY (fk_accountancy_journal) REFERENCES llx_accounting_journal (rowid); + ALTER TABLE llx_paiementfourn ADD COLUMN model_pdf varchar(255); - insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('EXPENSE_REPORT_CREATE','Expense report created','Executed when an expense report is created','expensereport',201); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('EXPENSE_REPORT_VALIDATE','Expense report validated','Executed when an expense report is validated','expensereport',202); insert into llx_c_action_trigger (code,label,description,elementtype,rang) values ('EXPENSE_REPORT_APPROVE','Expense report approved','Executed when an expense report is approved','expensereport',203); @@ -262,14 +278,6 @@ insert into llx_c_tva(fk_pays,taux,code,recuperableonly,localtax1,localtax1_type ALTER TABLE llx_events MODIFY COLUMN ip varchar(250); -UPDATE llx_accounting_journal SET nature = 1 where code = 'OD' and nature = 0; -UPDATE llx_accounting_journal SET nature = 2 where code = 'VT' and nature = 1; -UPDATE llx_accounting_journal SET nature = 3 where code = 'AC' and nature = 2; -UPDATE llx_accounting_journal SET nature = 4 where (code = 'BK' or code = 'BQ') and nature = 3; - - -ALTER TABLE llx_bank_account CHANGE COLUMN accountancy_journal fk_accountancy_journal integer; ---ALTER TABLE llx_bank_account ADD CONSTRAINT bank_fk_accountancy_journal FOREIGN KEY (fk_accountancy_journal) REFERENCES llx_accounting_journal (rowid); diff --git a/htdocs/install/mysql/tables/llx_bank_account.key.sql b/htdocs/install/mysql/tables/llx_bank_account.key.sql index 986ca7ea550..c5f2786fd24 100644 --- a/htdocs/install/mysql/tables/llx_bank_account.key.sql +++ b/htdocs/install/mysql/tables/llx_bank_account.key.sql @@ -19,5 +19,6 @@ ALTER TABLE llx_bank_account ADD UNIQUE uk_bank_account_label (label,entity); +ALTER TABLE llx_bank_account ADD INDEX idx_fk_accountancy_journal (fk_accountancy_journal); --- ALTER TABLE llx_bank_account ADD CONSTRAINT bank_fk_accountancy_journal FOREIGN KEY (fk_accountancy_journal) REFERENCES llx_accounting_journal (rowid); +ALTER TABLE llx_bank_account ADD CONSTRAINT fk_bank_account_accountancy_journal FOREIGN KEY (fk_accountancy_journal) REFERENCES llx_accounting_journal (rowid); diff --git a/htdocs/public/stripe/newpayment.php b/htdocs/public/stripe/newpayment.php index 95f0f9f2134..7578be73745 100644 --- a/htdocs/public/stripe/newpayment.php +++ b/htdocs/public/stripe/newpayment.php @@ -537,14 +537,14 @@ if (GETPOST("source") == 'invoice') { $result=$invoice->fetch_thirdparty($invoice->socid); } - + if ($action != 'dopayment') // Do not change amount if we just click on first dopayment { $amount=price2num($invoice->total_ttc - $invoice->getSommePaiement()); if (GETPOST("amount",'int')) $amount=GETPOST("amount",'int'); $amount=price2num($amount); } - + $fulltag='INV='.$invoice->ref.'.CUS='.$invoice->thirdparty->id; //$fulltag.='.NAM='.strtr($invoice->thirdparty->name,"-"," "); if (! empty($TAG)) { $tag=$TAG; $fulltag.='.TAG='.$TAG; } From 8e68aa86acd2297ed4f1bff6487dde4f9be83c1e Mon Sep 17 00:00:00 2001 From: BENKE Charlie Date: Sun, 14 May 2017 15:17:40 +0200 Subject: [PATCH 122/299] problems with additionnal template type If i active my new xml templater, and keep odt, the odt folder is added on folder to scan on my xml path ex : odt folder defined : c:\toto xml folder defined : c:\tata folder scanned with odt : c:\toto folder scanned with odt : c:\toto,c:\tata --- htdocs/core/lib/functions2.lib.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/htdocs/core/lib/functions2.lib.php b/htdocs/core/lib/functions2.lib.php index b36da631635..2f46ad49b80 100644 --- a/htdocs/core/lib/functions2.lib.php +++ b/htdocs/core/lib/functions2.lib.php @@ -1530,8 +1530,10 @@ function getListOfModels($db,$type,$maxfilenamelength=0) include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; $const=$obj->description; - $dirtoscan.=($dirtoscan?',':'').preg_replace('/[\r\n]+/',',',trim($conf->global->$const)); - $listoffiles=array(); + //irtoscan.=($dirtoscan?',':'').preg_replace('/[\r\n]+/',',',trim($conf->global->$const)); + $dirtoscan= preg_replace('/[\r\n]+/',',',trim($conf->global->$const)); + + $listoffiles=array(); // Now we add models found in directories scanned $listofdir=explode(',',$dirtoscan); @@ -2111,4 +2113,4 @@ function cartesianArray(array $input) { } return $result; -} \ No newline at end of file +} From 998254d9c6426bd22980b6ccb332012650f43f8f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 14 May 2017 16:17:00 +0200 Subject: [PATCH 123/299] Finish rewrite and debug of module Stripe. --- htdocs/core/modules/modStripe.class.php | 2 +- htdocs/langs/en_US/paypal.lang | 9 +- htdocs/langs/en_US/stripe.lang | 1 + htdocs/public/paybox/paymentko.php | 110 ++++++++----- htdocs/public/paybox/paymentok.php | 12 +- htdocs/public/payment/newpayment.php | 2 +- htdocs/public/payment/paymentko.php | 165 ++++++++++++++------ htdocs/public/payment/paymentok.php | 80 ++++++++-- htdocs/public/paypal/paymentko.php | 103 ++++++------ htdocs/public/paypal/paymentok.php | 27 ++-- htdocs/public/stripe/newpayment.php | 81 ++++++++-- htdocs/public/stripe/paymentko.php | 165 ++++++++++++++++++++ htdocs/public/stripe/paymentok.php | 199 ++++++++++++++++++++++++ htdocs/stripe/admin/stripe.php | 20 ++- htdocs/stripe/lib/stripe.lib.php | 1 + 15 files changed, 781 insertions(+), 196 deletions(-) create mode 100644 htdocs/public/stripe/paymentko.php create mode 100644 htdocs/public/stripe/paymentok.php diff --git a/htdocs/core/modules/modStripe.class.php b/htdocs/core/modules/modStripe.class.php index 4f4b15fa0a4..e7e20be5b83 100644 --- a/htdocs/core/modules/modStripe.class.php +++ b/htdocs/core/modules/modStripe.class.php @@ -65,7 +65,7 @@ class modStripe extends DolibarrModules $this->picto='stripe@stripe'; // Data directories to create when module is enabled. - $this->dirs = array('/stripe/temp'); + $this->dirs = array(); // Config pages. Put here list of php page names stored in admmin directory used to setup module. $this->config_page_url = array("stripe.php@stripe"); diff --git a/htdocs/langs/en_US/paypal.lang b/htdocs/langs/en_US/paypal.lang index 3c699527018..63999f31234 100644 --- a/htdocs/langs/en_US/paypal.lang +++ b/htdocs/langs/en_US/paypal.lang @@ -16,15 +16,16 @@ ThisIsTransactionId=This is id of transaction: %s PAYPAL_ADD_PAYMENT_URL=Add the url of Paypal payment when you send a document by mail PredefinedMailContentLink=You can click on the secure link below to make your payment (PayPal) if it is not already done.\n\n%s\n\n YouAreCurrentlyInSandboxMode=You are currently in the "sandbox" mode -NewPaypalPaymentReceived=New Paypal payment received -NewPaypalPaymentFailed=New Paypal payment tried but failed +NewOnlinePaymentReceived=New online payment received +NewOnlinePaymentFailed=New online payment tried but failed PAYPAL_PAYONLINE_SENDEMAIL=EMail to warn after a payment (success or not) ReturnURLAfterPayment=Return URL after payment -ValidationOfPaypalPaymentFailed=Validation of Paypal payment failed -PaypalConfirmPaymentPageWasCalledButFailed=Payment confirmation page for Paypal was called by Paypal but confirmation failed +ValidationOfOnlinePaymentFailed=Validation of online payment failed +PaymentSystemConfirmPaymentPageWasCalledButFailed=Payment confirmation page was called by payment system returned an error SetExpressCheckoutAPICallFailed=SetExpressCheckout API call failed. DoExpressCheckoutPaymentAPICallFailed=DoExpressCheckoutPayment API call failed. DetailedErrorMessage=Detailed Error Message ShortErrorMessage=Short Error Message ErrorCode=Error Code ErrorSeverityCode=Error Severity Code +OnlinePaymentSystem=Online payment system \ No newline at end of file diff --git a/htdocs/langs/en_US/stripe.lang b/htdocs/langs/en_US/stripe.lang index 3f85dc2d544..68b853ac25b 100644 --- a/htdocs/langs/en_US/stripe.lang +++ b/htdocs/langs/en_US/stripe.lang @@ -9,6 +9,7 @@ ThisScreenAllowsYouToPay=This screen allow you to make an online payment to %s. ThisIsInformationOnPayment=This is information on payment to do ToComplete=To complete YourEMail=Email to receive payment confirmation +STRIPE_PAYONLINE_SENDEMAIL=EMail to warn after a payment (success or not) Creditor=Creditor PaymentCode=Payment code StripeDoPayment=Go on payment diff --git a/htdocs/public/paybox/paymentko.php b/htdocs/public/paybox/paymentko.php index be5b388f6ed..9cc8a07ea70 100644 --- a/htdocs/public/paybox/paymentko.php +++ b/htdocs/public/paybox/paymentko.php @@ -20,7 +20,6 @@ * \file htdocs/public/paybox/paymentko.php * \ingroup paybox * \brief File to show page after a failed payment - * \author Laurent Destailleur */ define("NOLOGIN",1); // This means this output page does not require to be logged. @@ -52,6 +51,8 @@ $langs->load("stripe"); $object = new stdClass(); // For triggers +$paymentmethod='paybox'; + /* * Actions @@ -72,51 +73,74 @@ foreach($_POST as $k => $v) $tracepost .= "{$k} - {$v}\n"; dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_paybox'); -// Appel des triggers -include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; -$interface=new Interfaces($db); -$result=$interface->run_triggers('PAYBOX_PAYMENT_OK',$object,$user,$langs,$conf); -if ($result < 0) { $error++; $errors=$interface->errors; } -// Fin appel triggers - - -// Send an email -if (! empty($conf->global->PAYBOX_PAYONLINE_SENDEMAIL)) +if (! empty($_SESSION['ipaddress'])) // To avoid to make action twice { - $sendto=$conf->global->PAYBOX_PAYONLINE_SENDEMAIL; - $from=$conf->global->MAILING_EMAIL_FROM; - - // Define link to login card - $appli=constant('DOL_APPLICATION_TITLE'); - if (! empty($conf->global->MAIN_APPLICATION_TITLE)) - { - $appli=$conf->global->MAIN_APPLICATION_TITLE; - if (preg_match('/\d\.\d/', $appli)) - { - if (! preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) $appli.=" (".DOL_VERSION.")"; // If new title contains a version that is different than core - } - else $appli.=" ".DOL_VERSION; - } - else $appli.=" ".DOL_VERSION; - - $urlback=$_SERVER["REQUEST_URI"]; - $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("NewPayboxPaymentFailed"); - $content=$langs->transnoentitiesnoconv("NewPayboxPaymentFailed")."\n".$fulltag; - require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; - $mailfile = new CMailFile($topic, $sendto, $from, $content); - - $result=$mailfile->sendfile(); - if ($result) - { - dol_syslog("EMail sent to ".$sendto, LOG_DEBUG, 0, '_paybox'); - } - else - { - dol_syslog("Failed to send EMail to ".$sendto, LOG_ERR, 0, '_paybox'); - } + // Get on url call + $fulltag = $FULLTAG; + $onlinetoken = empty($PAYPALTOKEN)?$_SESSION['onlinetoken']:$PAYPALTOKEN; + $payerID = empty($PAYPALPAYERID)?$_SESSION['payerID']:$PAYPALPAYERID; + // Set by newpayment.php + $paymentType = $_SESSION['PaymentType']; + $currencyCodeType = $_SESSION['currencyCodeType']; + $FinalPaymentAmt = $_SESSION["Payment_Amount"]; + // From env + $ipaddress = $_SESSION['ipaddress']; + + // Appel des triggers + include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + $interface=new Interfaces($db); + $result=$interface->run_triggers('PAYBOX_PAYMENT_OK',$object,$user,$langs,$conf); + if ($result < 0) { $error++; $errors=$interface->errors; } + // Fin appel triggers + + // Send an email + $sendemail = ''; + if (! empty($conf->global->PAYBOX_PAYONLINE_SENDEMAIL)) $sendemail=$conf->global->PAYBOX_PAYONLINE_SENDEMAIL; + + if ($sendemail) + { + $sendto=$sendemail; + $from=$conf->global->MAILING_EMAIL_FROM; + + // Define link to login card + $appli=constant('DOL_APPLICATION_TITLE'); + if (! empty($conf->global->MAIN_APPLICATION_TITLE)) + { + $appli=$conf->global->MAIN_APPLICATION_TITLE; + if (preg_match('/\d\.\d/', $appli)) + { + if (! preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) $appli.=" (".DOL_VERSION.")"; // If new title contains a version that is different than core + } + else $appli.=" ".DOL_VERSION; + } + else $appli.=" ".DOL_VERSION; + + $urlback=$_SERVER["REQUEST_URI"]; + $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("NewOnlinePaymentFailed"); + $content=""; + $content.=$langs->transnoentitiesnoconv("ValidationOfOnlinePaymentFailed")."\n"; + $content.="\n"; + $content.=$langs->transnoentitiesnoconv("TechnicalInformation").":\n"; + $content.=$langs->transnoentitiesnoconv("OnlinePaymentSystem").': '.$paymentmethod."
\n"; + $content.=$langs->transnoentitiesnoconv("ReturnURLAfterPayment").': '.$urlback."\n"; + $content.="tag=".$fulltag."\npaymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; + require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; + $mailfile = new CMailFile($topic, $sendto, $from, $content); + + $result=$mailfile->sendfile(); + if ($result) + { + dol_syslog("EMail sent to ".$sendto, LOG_DEBUG, 0, '_paybox'); + } + else + { + dol_syslog("Failed to send EMail to ".$sendto, LOG_ERR, 0, '_paybox'); + } + } + + unset($_SESSION['ipaddress']); } - $head=''; if (! empty($conf->global->PAYBOX_CSS_URL)) $head=''."\n"; diff --git a/htdocs/public/paybox/paymentok.php b/htdocs/public/paybox/paymentok.php index 0e91189e242..b59034b774e 100644 --- a/htdocs/public/paybox/paymentok.php +++ b/htdocs/public/paybox/paymentok.php @@ -20,7 +20,6 @@ * \file htdocs/public/paybox/paymentok.php * \ingroup paybox * \brief File to show page after a successful payment - * \author Laurent Destailleur */ define("NOLOGIN",1); // This means this output page does not require to be logged. @@ -62,6 +61,8 @@ if (empty($FULLTAG)) $FULLTAG=GETPOST('fulltag'); $object = new stdClass(); // For triggers +$paymentmethod='paybox'; + /* * Actions @@ -97,7 +98,7 @@ print '
'."\n"; // Get on url call /* -$token = $PAYBOXTOKEN; +$onlinetoken = $PAYBOXTOKEN; */ $fulltag = $FULLTAG; /*$payerID = $PAYBOXPAYERID; @@ -108,7 +109,7 @@ $FinalPaymentAmt = $_SESSION["Payment_Amount"]; // From env $ipaddress = $_SESSION['ipaddress']; -dol_syslog("Call newpaymentok with token=".$token." paymentType=".$paymentType." currencyCodeType=".$currencyCodeType." payerID=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt." fulltag=".$fulltag); +dol_syslog("Call newpaymentok with token=".$onlinetoken." paymentType=".$paymentType." currencyCodeType=".$currencyCodeType." payerID=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt." fulltag=".$fulltag); */ @@ -149,7 +150,7 @@ if (! empty($conf->global->PAYBOX_PAYONLINE_SENDEMAIL)) else $appli.=" ".DOL_VERSION; $urlback=$_SERVER["REQUEST_URI"]; - $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("NewPayboxPaymentReceived"); + $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("NewOnlinePaymentReceived"); $tmptag=dolExplodeIntoArray($fulltag,'.','='); $content=""; if (! empty($tmptag['MEM'])) @@ -162,10 +163,11 @@ if (! empty($conf->global->PAYBOX_PAYONLINE_SENDEMAIL)) } else { - $content.=$langs->transnoentitiesnoconv("NewPayboxPaymentReceived")."
\n"; + $content.=$langs->transnoentitiesnoconv("NewOnlinePaymentReceived")."
\n"; } $content.="
\n"; $content.=$langs->transnoentitiesnoconv("TechnicalInformation").":
\n"; + $content.=$langs->transnoentitiesnoconv("OnlinePaymentSystem").': '.$paymentmethod."
\n"; $content.=$langs->transnoentitiesnoconv("ReturnURLAfterPayment").': '.$urlback."
\n"; $content.="tag=".$fulltag."
\n"; diff --git a/htdocs/public/payment/newpayment.php b/htdocs/public/payment/newpayment.php index 744f477782e..788321b6212 100644 --- a/htdocs/public/payment/newpayment.php +++ b/htdocs/public/payment/newpayment.php @@ -114,7 +114,7 @@ $ref=$REF=GETPOST('ref','alpha'); $TAG=GETPOST("tag",'alpha'); $FULLTAG=GETPOST("fulltag",'alpha'); // fulltag is tag with more informations $SECUREKEY=GETPOST("securekey"); // Secure key -if ($paymentmethod) $FULLTAG.=($FULLTAG?'.':'').'PM='.$paymentmethod; +if ($paymentmethod && ! preg_match('/'.preg_quote('PM='.$paymentmethod,'/').'/', $FULLTAG)) $FULLTAG.=($FULLTAG?'.':'').'PM='.$paymentmethod; if (! empty($SOURCE)) { diff --git a/htdocs/public/payment/paymentko.php b/htdocs/public/payment/paymentko.php index 6ce1c3badfa..9abcfcf2c58 100644 --- a/htdocs/public/payment/paymentko.php +++ b/htdocs/public/payment/paymentko.php @@ -23,7 +23,6 @@ * \brief File to show page after a failed payment. * This page is called by payment system with url provided to it competed with parameter TOKEN=xxx * This token can be used to get more informations. - * \author Laurent Destailleur */ define("NOLOGIN",1); // This means this output page does not require to be logged. @@ -53,16 +52,40 @@ $langs->load("companies"); $langs->load("paybox"); $langs->load("paypal"); -$PAYPALTOKEN=GETPOST('TOKEN'); -if (empty($PAYPALTOKEN)) $PAYPALTOKEN=GETPOST('token'); -$PAYPALPAYERID=GETPOST('PAYERID'); -if (empty($PAYPALPAYERID)) $PAYPALPAYERID=GETPOST('PayerID'); +if (! empty($conf->paypal->enabled)) +{ + $PAYPALTOKEN=GETPOST('TOKEN'); + if (empty($PAYPALTOKEN)) $PAYPALTOKEN=GETPOST('token'); + $PAYPALPAYERID=GETPOST('PAYERID'); + if (empty($PAYPALPAYERID)) $PAYPALPAYERID=GETPOST('PayerID'); +} +// TODO Other payment method + $FULLTAG=GETPOST('FULLTAG'); if (empty($FULLTAG)) $FULLTAG=GETPOST('fulltag'); + +// Detect $paymentmethod +$paymentmethod=''; +if (preg_match('/PM=([^\.]+)/', $FULLTAG, $reg)) +{ + $paymentmethod=$reg[1]; +} +if (empty($paymentmethod)) +{ + dol_print_error(null, 'The back url does not contains a parameter fulltag that should help us to find the payment method used'); + exit; +} +else +{ + dol_syslog("paymentmethod=".$paymentmethod); +} + + $validpaymentmethod=array(); if (! empty($conf->paypal->enabled)) $validpaymentmethod['paypal']='paypal'; if (! empty($conf->paybox->enabled)) $validpaymentmethod['paybox']='paybox'; +if (! empty($conf->stripe->enabled)) $validpaymentmethod['stripe']='stripe'; // Security check @@ -90,50 +113,94 @@ foreach($_POST as $k => $v) $tracepost .= "{$k} - {$v}\n"; dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_payment'); -// Appel des triggers -include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; -$interface=new Interfaces($db); -$result=$interface->run_triggers('PAYMENTONLINE_PAYMENT_KO',$object,$user,$langs,$conf); -if ($result < 0) { $error++; $errors=$interface->errors; } -// Fin appel triggers - - -// Send an email -if (! empty($conf->paypal->enabled)) +if (! empty($_SESSION['ipaddress'])) // To avoid to make action twice { - if (! empty($conf->global->PAYPAL_PAYONLINE_SENDEMAIL)) - { - // Get on url call - $token = $PAYPALTOKEN; - $fulltag = $FULLTAG; - $payerID = $PAYPALPAYERID; - // Set by newpayment.php - $paymentType = $_SESSION['PaymentType']; - $currencyCodeType = $_SESSION['currencyCodeType']; - $FinalPaymentAmt = $_SESSION["Payment_Amount"]; - // From env - $ipaddress = $_SESSION['ipaddress']; - - - $sendto=$conf->global->PAYPAL_PAYONLINE_SENDEMAIL; - $from=$conf->global->MAILING_EMAIL_FROM; - - $urlback=$_SERVER["REQUEST_URI"]; - $topic='['.$conf->global->MAIN_APPLICATION_TITLE.'] '.$langs->transnoentitiesnoconv("NewPaypalPaymentFailed"); - $content=$langs->transnoentitiesnoconv("NewPaypalPaymentFailed")."\ntag=".$fulltag."\ntoken=".$token." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; - require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; - $mailfile = new CMailFile($topic, $sendto, $from, $content); - - $result=$mailfile->sendfile(); - if ($result) - { - dol_syslog("EMail sent to ".$sendto, LOG_DEBUG, 0, '_payment'); - } - else - { - dol_syslog("Failed to send EMail to ".$sendto, LOG_ERR, 0, '_payment'); - } - } + // Get on url call + $fulltag = $FULLTAG; + $onlinetoken = empty($PAYPALTOKEN)?$_SESSION['onlinetoken']:$PAYPALTOKEN; + $payerID = empty($PAYPALPAYERID)?$_SESSION['payerID']:$PAYPALPAYERID; + // Set by newpayment.php + $paymentType = $_SESSION['PaymentType']; + $currencyCodeType = $_SESSION['currencyCodeType']; + $FinalPaymentAmt = $_SESSION["Payment_Amount"]; + // From env + $ipaddress = $_SESSION['ipaddress']; + + // Appel des triggers + include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + $interface=new Interfaces($db); + $result=$interface->run_triggers('PAYMENTONLINE_PAYMENT_KO',$object,$user,$langs,$conf); + if ($result < 0) { $error++; $errors=$interface->errors; } + // Fin appel triggers + + // Send an email + $sendemail = ''; + if (! empty($conf->paypal->enabled)) + { + if (! empty($conf->global->PAYPAL_PAYONLINE_SENDEMAIL)) + { + $sendemail = $conf->global->PAYPAL_PAYONLINE_SENDEMAIL; + } + } + // Send an email + if (! empty($conf->paybox->enabled)) + { + if (! empty($conf->global->PAYBOX_PAYONLINE_SENDEMAIL)) + { + $sendemail = $conf->global->PAYBOX_PAYONLINE_SENDEMAIL; + } + } + // Send an email + if (! empty($conf->stripe->enabled)) + { + if (! empty($conf->global->STRIPE_PAYONLINE_SENDEMAIL)) + { + $sendemail = $conf->global->STRIPE_PAYONLINE_SENDEMAIL; + } + } + + if ($sendemail) + { + $from=$conf->global->MAILING_EMAIL_FROM; + $sendto=$sendemail; + + // Define link to login card + $appli=constant('DOL_APPLICATION_TITLE'); + if (! empty($conf->global->MAIN_APPLICATION_TITLE)) + { + $appli=$conf->global->MAIN_APPLICATION_TITLE; + if (preg_match('/\d\.\d/', $appli)) + { + if (! preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) $appli.=" (".DOL_VERSION.")"; // If new title contains a version that is different than core + } + else $appli.=" ".DOL_VERSION; + } + else $appli.=" ".DOL_VERSION; + + $urlback=$_SERVER["REQUEST_URI"]; + $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("NewOnlinePaymentFailed"); + $content=""; + $content.=$langs->transnoentitiesnoconv("ValidationOfOnlinePaymentFailed")."\n"; + $content.="\n"; + $content.=$langs->transnoentitiesnoconv("TechnicalInformation").":\n"; + $content.=$langs->transnoentitiesnoconv("OnlinePaymentSystem").': '.$paymentmethod."
\n"; + $content.=$langs->transnoentitiesnoconv("ReturnURLAfterPayment").': '.$urlback."\n"; + $content.="tag=".$fulltag."\ntoken=".$onlinetoken." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; + require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; + $mailfile = new CMailFile($topic, $sendto, $from, $content); + + $result=$mailfile->sendfile(); + if ($result) + { + dol_syslog("EMail sent to ".$sendto, LOG_DEBUG, 0, '_payment'); + } + else + { + dol_syslog("Failed to send EMail to ".$sendto, LOG_ERR, 0, '_payment'); + } + } + + unset($_SESSION['ipaddress']); } $head=''; @@ -150,7 +217,7 @@ print ''."\n"; print '
'."\n"; print $langs->trans("YourPaymentHasNotBeenRecorded")."

"; -if (! empty($conf->global->PAYPAL_MESSAGE_KO)) print $conf->global->PAYPAL_MESSAGE_KO; +if (! empty($conf->global->PAYMENT_MESSAGE_KO)) print $conf->global->PAYMENT_MESSAGE_KO; print "\n
\n"; diff --git a/htdocs/public/payment/paymentok.php b/htdocs/public/payment/paymentok.php index c1b4329c7be..26022dcd4f8 100644 --- a/htdocs/public/payment/paymentok.php +++ b/htdocs/public/payment/paymentok.php @@ -23,7 +23,6 @@ * \brief File to show page after a successful payment * This page is called by payment system with url provided to it completed with parameter TOKEN=xxx * This token can be used to get more informations. - * \author Laurent Destailleur */ define("NOLOGIN",1); // This means this output page does not require to be logged. @@ -88,10 +87,10 @@ if (! empty($conf->paypal->enabled)) if (empty($PAYPALTOKEN)) $PAYPALTOKEN=GETPOST('token'); $PAYPALPAYERID=GETPOST('PAYERID'); if (empty($PAYPALPAYERID)) $PAYPALPAYERID=GETPOST('PayerID'); - $FULLTAG=GETPOST('FULLTAG'); - if (empty($FULLTAG)) $FULLTAG=GETPOST('fulltag'); } +$FULLTAG=GETPOST('FULLTAG'); +if (empty($FULLTAG)) $FULLTAG=GETPOST('fulltag'); $source=GETPOST('source'); $ref=GETPOST('ref'); @@ -116,6 +115,7 @@ else $validpaymentmethod=array(); if (! empty($conf->paypal->enabled)) $validpaymentmethod['paypal']='paypal'; if (! empty($conf->paybox->enabled)) $validpaymentmethod['paybox']='paybox'; +if (! empty($conf->stripe->enabled)) $validpaymentmethod['stripe']='stripe'; // Security check if (empty($validpaymentmethod)) accessforbidden('', 0, 0, 1); @@ -169,7 +169,7 @@ if (! empty($conf->paypal->enabled)) if ($PAYPALTOKEN) { // Get on url call - $token = $PAYPALTOKEN; + $onlinetoken = $PAYPALTOKEN; $fulltag = $FULLTAG; $payerID = $PAYPALPAYERID; // Set by newpayment.php @@ -179,17 +179,17 @@ if (! empty($conf->paypal->enabled)) // From env $ipaddress = $_SESSION['ipaddress']; - dol_syslog("Call paymentok with token=".$token." paymentType=".$paymentType." currencyCodeType=".$currencyCodeType." payerID=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt." fulltag=".$fulltag, LOG_DEBUG, 0, '_paypal'); + dol_syslog("Call paymentok with token=".$onlinetoken." paymentType=".$paymentType." currencyCodeType=".$currencyCodeType." payerID=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt." fulltag=".$fulltag, LOG_DEBUG, 0, '_paypal'); // Validate record if (! empty($paymentType)) { dol_syslog("We call GetExpressCheckoutDetails", LOG_DEBUG, 0, '_payment'); - $resArray=getDetails($token); + $resArray=getDetails($onlinetoken); //var_dump($resarray); - dol_syslog("We call DoExpressCheckoutPayment token=".$token." paymentType=".$paymentType." currencyCodeType=".$currencyCodeType." payerID=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt." fulltag=".$fulltag, LOG_DEBUG, 0, '_payment'); - $resArray=confirmPayment($token, $paymentType, $currencyCodeType, $payerID, $ipaddress, $FinalPaymentAmt, $fulltag); + dol_syslog("We call DoExpressCheckoutPayment token=".$onlinetoken." paymentType=".$paymentType." currencyCodeType=".$currencyCodeType." payerID=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt." fulltag=".$fulltag, LOG_DEBUG, 0, '_payment'); + $resArray=confirmPayment($onlinetoken, $paymentType, $currencyCodeType, $payerID, $ipaddress, $FinalPaymentAmt, $fulltag); $ack = strtoupper($resArray["ACK"]); if ($ack=="SUCCESS" || $ack=="SUCCESSWITHWARNING") @@ -233,6 +233,17 @@ if (! empty($conf->paypal->enabled)) if ($ispaymentok) { + // Get on url call + $fulltag = $FULLTAG; + $onlinetoken = empty($PAYPALTOKEN)?$_SESSION['onlinetoken']:$PAYPALTOKEN; + $payerID = empty($PAYPALPAYERID)?$_SESSION['payerID']:$PAYPALPAYERID; + // Set by newpayment.php + $paymentType = $_SESSION['PaymentType']; + $currencyCodeType = $_SESSION['currencyCodeType']; + $FinalPaymentAmt = $_SESSION["Payment_Amount"]; + // From env + $ipaddress = $_SESSION['ipaddress']; + // Appel des triggers include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; $interface=new Interfaces($db); @@ -250,6 +261,7 @@ if ($ispaymentok) // TODO Remove local option to keep only the generic one ? if ($paymentmethod == 'paypal' && ! empty($conf->global->PAYPAL_PAYONLINE_SENDEMAIL)) $sendemail=$conf->global->PAYPAL_PAYONLINE_SENDEMAIL; if ($paymentmethod == 'paybox' && ! empty($conf->global->PAYBOX_PAYONLINE_SENDEMAIL)) $sendemail=$conf->global->PAYBOX_PAYONLINE_SENDEMAIL; + if ($paymentmethod == 'stripe' && ! empty($conf->global->STRIPE_PAYONLINE_SENDEMAIL)) $sendemail=$conf->global->STRIPE_PAYONLINE_SENDEMAIL; // Send an email if ($sendemail) @@ -261,8 +273,21 @@ if ($ispaymentok) $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current + // Define link to login card + $appli=constant('DOL_APPLICATION_TITLE'); + if (! empty($conf->global->MAIN_APPLICATION_TITLE)) + { + $appli=$conf->global->MAIN_APPLICATION_TITLE; + if (preg_match('/\d\.\d/', $appli)) + { + if (! preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) $appli.=" (".DOL_VERSION.")"; // If new title contains a version that is different than core + } + else $appli.=" ".DOL_VERSION; + } + else $appli.=" ".DOL_VERSION; + $urlback=$_SERVER["REQUEST_URI"]; - $topic='['.$conf->global->MAIN_APPLICATION_TITLE.'] '.$langs->transnoentitiesnoconv("NewPaypalPaymentReceived"); + $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("NewOnlinePaymentReceived"); $tmptag=dolExplodeIntoArray($fulltag,'.','='); $content=""; if (! empty($tmptag['MEM'])) @@ -279,9 +304,9 @@ if ($ispaymentok) } $content.="
\n"; $content.=$langs->transnoentitiesnoconv("TechnicalInformation").":
\n"; - $content.=$langs->transnoentitiesnoconv("PaymentSystem").': '.$paymentmethod."
\n"; + $content.=$langs->transnoentitiesnoconv("OnlinePaymentSystem").': '.$paymentmethod."
\n"; $content.=$langs->transnoentitiesnoconv("ReturnURLAfterPayment").': '.$urlback."
\n"; - $content.="tag=".$fulltag." token=".$token." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; + $content.="tag=".$fulltag."\ntoken=".$onlinetoken." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; $ishtml=dol_textishtml($content); // May contain urls @@ -301,6 +326,17 @@ if ($ispaymentok) } else { + // Get on url call + $fulltag = $FULLTAG; + $onlinetoken = empty($PAYPALTOKEN)?$_SESSION['onlinetoken']:$PAYPALTOKEN; + $payerID = empty($PAYPALPAYERID)?$_SESSION['payerID']:$PAYPALPAYERID; + // Set by newpayment.php + $paymentType = $_SESSION['PaymentType']; + $currencyCodeType = $_SESSION['currencyCodeType']; + $FinalPaymentAmt = $_SESSION["Payment_Amount"]; + // From env + $ipaddress = $_SESSION['ipaddress']; + // Appel des triggers include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; $interface=new Interfaces($db); @@ -322,6 +358,7 @@ else // TODO Remove local option to keep only the generic one ? if ($paymentmethod == 'paypal' && ! empty($conf->global->PAYPAL_PAYONLINE_SENDEMAIL)) $sendemail=$conf->global->PAYPAL_PAYONLINE_SENDEMAIL; if ($paymentmethod == 'paybox' && ! empty($conf->global->PAYBOX_PAYONLINE_SENDEMAIL)) $sendemail=$conf->global->PAYBOX_PAYONLINE_SENDEMAIL; + if ($paymentmethod == 'stripe' && ! empty($conf->global->STRIPE_PAYONLINE_SENDEMAIL)) $sendemail=$conf->global->STRIPE_PAYONLINE_SENDEMAIL; // Send an email if ($sendemail) @@ -333,15 +370,28 @@ else $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current + // Define link to login card + $appli=constant('DOL_APPLICATION_TITLE'); + if (! empty($conf->global->MAIN_APPLICATION_TITLE)) + { + $appli=$conf->global->MAIN_APPLICATION_TITLE; + if (preg_match('/\d\.\d/', $appli)) + { + if (! preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) $appli.=" (".DOL_VERSION.")"; // If new title contains a version that is different than core + } + else $appli.=" ".DOL_VERSION; + } + else $appli.=" ".DOL_VERSION; + $urlback=$_SERVER["REQUEST_URI"]; - $topic='['.$conf->global->MAIN_APPLICATION_TITLE.'] '.$langs->transnoentitiesnoconv("ValidationOfPaypalPaymentFailed"); + $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("ValidationOfPaymentFailed"); $content=""; - $content.=$langs->transnoentitiesnoconv("PaypalConfirmPaymentPageWasCalledButFailed")."\n"; + $content.=$langs->transnoentitiesnoconv("PaymentSystemConfirmPaymentPageWasCalledButFailed")."\n"; $content.="\n"; $content.=$langs->transnoentitiesnoconv("TechnicalInformation").":\n"; - $content.=$langs->transnoentitiesnoconv("PaymentSystem").': '.$paymentmethod."
\n"; + $content.=$langs->transnoentitiesnoconv("OnlinePaymentSystem").': '.$paymentmethod."\n"; $content.=$langs->transnoentitiesnoconv("ReturnURLAfterPayment").': '.$urlback."\n"; - $content.="tag=".$fulltag."\ntoken=".$token." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; + $content.="tag=".$fulltag."\ntoken=".$onlinetoken." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; $ishtml=dol_textishtml($content); // May contain urls diff --git a/htdocs/public/paypal/paymentko.php b/htdocs/public/paypal/paymentko.php index e432db2e317..a4e3c0a83ca 100644 --- a/htdocs/public/paypal/paymentko.php +++ b/htdocs/public/paypal/paymentko.php @@ -23,7 +23,6 @@ * \brief File to show page after a failed payment. * This page is called by paypal with url provided to payal competed with parameter TOKEN=xxx * This token can be used to get more informations. - * \author Laurent Destailleur */ define("NOLOGIN",1); // This means this output page does not require to be logged. @@ -63,6 +62,8 @@ if (empty($FULLTAG)) $FULLTAG=GETPOST('fulltag'); $object = new stdClass(); // For triggers +$paymentmethod='paypal'; + /* * Actions @@ -81,61 +82,73 @@ $tracepost = ""; foreach($_POST as $k => $v) $tracepost .= "{$k} - {$v}\n"; dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_paypal'); - -// Appel des triggers -include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; -$interface=new Interfaces($db); -$result=$interface->run_triggers('PAYPAL_PAYMENT_KO',$object,$user,$langs,$conf); -if ($result < 0) { $error++; $errors=$interface->errors; } -// Fin appel triggers - - -// Send an email -if (! empty($conf->global->PAYPAL_PAYONLINE_SENDEMAIL)) +if (! empty($_SESSION['ipaddress'])) // To avoid to make action twice { // Get on url call - $token = $PAYPALTOKEN; $fulltag = $FULLTAG; - $payerID = $PAYPALPAYERID; + $onlinetoken = empty($PAYPALTOKEN)?$_SESSION['onlinetoken']:$PAYPALTOKEN; + $payerID = empty($PAYPALPAYERID)?$_SESSION['payerID']:$PAYPALPAYERID; // Set by newpayment.php $paymentType = $_SESSION['PaymentType']; $currencyCodeType = $_SESSION['currencyCodeType']; $FinalPaymentAmt = $_SESSION["Payment_Amount"]; // From env $ipaddress = $_SESSION['ipaddress']; + + // Appel des triggers + include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + $interface=new Interfaces($db); + $result=$interface->run_triggers('PAYPAL_PAYMENT_KO',$object,$user,$langs,$conf); + if ($result < 0) { $error++; $errors=$interface->errors; } + // Fin appel triggers + // Send an email + $sendemail = ''; + if (! empty($conf->global->PAYPAL_PAYONLINE_SENDEMAIL)) $sendemail=$conf->global->PAYPAL_PAYONLINE_SENDEMAIL; - $sendto=$conf->global->PAYPAL_PAYONLINE_SENDEMAIL; - $from=$conf->global->MAILING_EMAIL_FROM; - - // Define link to login card - $appli=constant('DOL_APPLICATION_TITLE'); - if (! empty($conf->global->MAIN_APPLICATION_TITLE)) - { - $appli=$conf->global->MAIN_APPLICATION_TITLE; - if (preg_match('/\d\.\d/', $appli)) - { - if (! preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) $appli.=" (".DOL_VERSION.")"; // If new title contains a version that is different than core - } - else $appli.=" ".DOL_VERSION; - } - else $appli.=" ".DOL_VERSION; - - $urlback=$_SERVER["REQUEST_URI"]; - $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("NewPaypalPaymentFailed"); - $content=$langs->transnoentitiesnoconv("NewPaypalPaymentFailed")."\ntag=".$fulltag."\ntoken=".$token." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; - require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; - $mailfile = new CMailFile($topic, $sendto, $from, $content); - - $result=$mailfile->sendfile(); - if ($result) - { - dol_syslog("EMail sent to ".$sendto, LOG_DEBUG, 0, '_paypal'); - } - else - { - dol_syslog("Failed to send EMail to ".$sendto, LOG_ERR, 0, '_paypal'); - } + if ($sendemail) + { + $sendto=$sendemail; + $from=$conf->global->MAILING_EMAIL_FROM; + + // Define link to login card + $appli=constant('DOL_APPLICATION_TITLE'); + if (! empty($conf->global->MAIN_APPLICATION_TITLE)) + { + $appli=$conf->global->MAIN_APPLICATION_TITLE; + if (preg_match('/\d\.\d/', $appli)) + { + if (! preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) $appli.=" (".DOL_VERSION.")"; // If new title contains a version that is different than core + } + else $appli.=" ".DOL_VERSION; + } + else $appli.=" ".DOL_VERSION; + + $urlback=$_SERVER["REQUEST_URI"]; + $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("NewOnlinePaymentFailed"); + $content=""; + $content.=$langs->transnoentitiesnoconv("ValidationOfOnlinePaymentFailed")."\n"; + $content.="\n"; + $content.=$langs->transnoentitiesnoconv("TechnicalInformation").":\n"; + $content.=$langs->transnoentitiesnoconv("OnlinePaymentSystem").': '.$paymentmethod."
\n"; + $content.=$langs->transnoentitiesnoconv("ReturnURLAfterPayment").': '.$urlback."\n"; + $content.="tag=".$fulltag."\ntoken=".$onlinetoken." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; + + require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; + $mailfile = new CMailFile($topic, $sendto, $from, $content); + + $result=$mailfile->sendfile(); + if ($result) + { + dol_syslog("EMail sent to ".$sendto, LOG_DEBUG, 0, '_paypal'); + } + else + { + dol_syslog("Failed to send EMail to ".$sendto, LOG_ERR, 0, '_paypal'); + } + } + + unset($_SESSION['ipaddress']); } diff --git a/htdocs/public/paypal/paymentok.php b/htdocs/public/paypal/paymentok.php index e3f2ed201e5..d98a6085e3e 100644 --- a/htdocs/public/paypal/paymentok.php +++ b/htdocs/public/paypal/paymentok.php @@ -23,7 +23,6 @@ * \brief File to show page after a successful payment * This page is called by paypal with url provided to payal completed with parameter TOKEN=xxx * This token can be used to get more informations. - * \author Laurent Destailleur */ define("NOLOGIN",1); // This means this output page does not require to be logged. @@ -94,6 +93,8 @@ if (empty($FULLTAG)) $FULLTAG=GETPOST('fulltag'); $object = new stdClass(); // For triggers +$paymentmethod='paypal'; + /* * Actions @@ -128,7 +129,7 @@ print '
'."\n"; if ($PAYPALTOKEN) { // Get on url call - $token = $PAYPALTOKEN; + $onlinetoken = $PAYPALTOKEN; $fulltag = $FULLTAG; $payerID = $PAYPALPAYERID; // Set by newpayment.php @@ -138,18 +139,18 @@ if ($PAYPALTOKEN) // From env $ipaddress = $_SESSION['ipaddress']; - dol_syslog("Call paymentok with token=".$token." paymentType=".$paymentType." currencyCodeType=".$currencyCodeType." payerID=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt." fulltag=".$fulltag, LOG_DEBUG, 0, '_paypal'); + dol_syslog("Call paymentok with token=".$onlinetoken." paymentType=".$paymentType." currencyCodeType=".$currencyCodeType." payerID=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt." fulltag=".$fulltag, LOG_DEBUG, 0, '_paypal'); // Validate record if (! empty($paymentType)) { dol_syslog("We call GetExpressCheckoutDetails", LOG_DEBUG, 0, '_paypal'); - $resArray=getDetails($token); + $resArray=getDetails($onlinetoken); //var_dump($resarray); - dol_syslog("We call DoExpressCheckoutPayment token=".$token." paymentType=".$paymentType." currencyCodeType=".$currencyCodeType." payerID=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt." fulltag=".$fulltag, LOG_DEBUG, 0, '_paypal'); - $resArray=confirmPayment($token, $paymentType, $currencyCodeType, $payerID, $ipaddress, $FinalPaymentAmt, $fulltag); + dol_syslog("We call DoExpressCheckoutPayment token=".$onlinetoken." paymentType=".$paymentType." currencyCodeType=".$currencyCodeType." payerID=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt." fulltag=".$fulltag, LOG_DEBUG, 0, '_paypal'); + $resArray=confirmPayment($onlinetoken, $paymentType, $currencyCodeType, $payerID, $ipaddress, $FinalPaymentAmt, $fulltag); $ack = strtoupper($resArray["ACK"]); if($ack=="SUCCESS" || $ack=="SUCCESSWITHWARNING") @@ -202,7 +203,7 @@ if ($PAYPALTOKEN) else $appli.=" ".DOL_VERSION; $urlback=$_SERVER["REQUEST_URI"]; - $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("NewPaypalPaymentReceived"); + $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("NewOnlinePaymentReceived"); $tmptag=dolExplodeIntoArray($fulltag,'.','='); $content=""; if (! empty($tmptag['MEM'])) @@ -215,12 +216,13 @@ if ($PAYPALTOKEN) } else { - $content.=$langs->transnoentitiesnoconv("NewPaypalPaymentReceived")."
\n"; + $content.=$langs->transnoentitiesnoconv("NewOnlinePaymentReceived")."
\n"; } $content.="
\n"; $content.=$langs->transnoentitiesnoconv("TechnicalInformation").":
\n"; + $content.=$langs->transnoentitiesnoconv("OnlinePaymentSystem").': '.$paymentmethod."
\n"; $content.=$langs->transnoentitiesnoconv("ReturnURLAfterPayment").': '.$urlback."
\n"; - $content.="tag=".$fulltag." token=".$token." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; + $content.="tag=".$fulltag."\ntoken=".$onlinetoken." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; $ishtml=dol_textishtml($content); // May contain urls @@ -285,13 +287,14 @@ if ($PAYPALTOKEN) else $appli.=" ".DOL_VERSION; $urlback=$_SERVER["REQUEST_URI"]; - $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("ValidationOfPaypalPaymentFailed"); + $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("ValidationOfPaymentFailed"); $content=""; - $content.=$langs->transnoentitiesnoconv("PaypalConfirmPaymentPageWasCalledButFailed")."\n"; + $content.=$langs->transnoentitiesnoconv("PaymentSystemConfirmPaymentPageWasCalledButFailed")."\n"; $content.="\n"; $content.=$langs->transnoentitiesnoconv("TechnicalInformation").":\n"; + $content.=$langs->transnoentitiesnoconv("OnlinePaymentSystem").': '.$paymentmethod."\n"; $content.=$langs->transnoentitiesnoconv("ReturnURLAfterPayment").': '.$urlback."\n"; - $content.="tag=".$fulltag."\ntoken=".$token." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; + $content.="tag=".$fulltag."\ntoken=".$onlinetoken." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; $ishtml=dol_textishtml($content); // May contain urls diff --git a/htdocs/public/stripe/newpayment.php b/htdocs/public/stripe/newpayment.php index 7578be73745..5975d349fe4 100644 --- a/htdocs/public/stripe/newpayment.php +++ b/htdocs/public/stripe/newpayment.php @@ -98,7 +98,7 @@ $ref=$REF=GETPOST('ref','alpha'); $TAG=GETPOST("tag",'alpha'); $FULLTAG=GETPOST("fulltag",'alpha'); // fulltag is tag with more informations $SECUREKEY=GETPOST("securekey"); // Secure key -$FULLTAG.=($FULLTAG?'.':'').'PM=stripe'; +if (! preg_match('/'.preg_quote('PM=stripe','/').'/', $FULLTAG)) $FULLTAG.=($FULLTAG?'.':'').'PM=stripe'; if (! empty($SOURCE)) { @@ -185,7 +185,7 @@ if (! empty($conf->global->STRIPE_SECURITY_TOKEN)) * Actions */ -if ($action == 'dopayment') // We click on button Create payment that lead on this page +if ($action == 'dopayment') // We click on button Create payment { if (GETPOST('newamount')) $amount = GETPOST('newamount'); else @@ -197,25 +197,37 @@ if ($action == 'dopayment') // We click on button Create payment that lead on if ($action == 'charge') { - dol_syslog("POST keys : ".join(',', array_keys($_POST))); - dol_syslog("POST values: ".join(',', $_POST)); + // Correct the amount according to unit of currency + // See https://support.stripe.com/questions/which-zero-decimal-currencies-does-stripe-support + $arrayzerounitcurrency=array('BIF', 'CLP', 'DJF', 'GNF', 'JPY', 'KMF', 'KRW', 'MGA', 'PYG', 'RWF', 'VND', 'VUV', 'XAF', 'XOF', 'XPF'); + if (! in_array($currency, $arrayzerounitcurrency)) $amount=$amount * 100; - $token = GETPOST("stripeToken"); - $email = GETPOST("stripeEmail"); + dol_syslog("POST keys : ".join(',', array_keys($_POST)), LOG_DEBUG, 0, '_stripe'); + dol_syslog("POST values: ".join(',', $_POST), LOG_DEBUG, 0, '_stripe'); + + $stripeToken = GETPOST("stripeToken",'alpha'); + $email = GETPOST("stripeEmail",'alpha'); + dol_syslog("stripeToken = ".$stripeToken, LOG_DEBUG, 0, '_stripe'); + dol_syslog("stripeEmail = ".$stripeEmail, LOG_DEBUG, 0, '_stripe'); + + $error = 0; + try { + dol_syslog("Create customer", LOG_DEBUG, 0, '_stripe'); $customer = \Stripe\Customer::create(array( 'email' => $email, - 'card' => $token + 'card' => $stripeToken // TODO )); + dol_syslog("Create charge", LOG_DEBUG, 0, '_stripe'); $charge = \Stripe\Charge::create(array( 'customer' => $customer->id, 'amount' => price2num($amount, 'MU'), - 'currency' => $conf->currency, - // TODO - 'description' => 'Invoice payment N: '.$ref + 'currency' => $currency, + 'description' => 'Stripe payment: '.$FULLTAG, + 'statement_descriptor' => dol_trunc(dol_trunc(dol_string_unaccent($mysoc->name), 6, 'right', 'UTF-8', 1).' '.$FULLTAG, 22, 'right', 'UTF-8', 1) // 22 chars )); } catch(\Stripe\Error\Card $e) { // Since it's a decline, \Stripe\Error\Card will be caught @@ -229,39 +241,73 @@ if ($action == 'charge') print('Param is:' . $err['param'] . "\n"); print('Message is:' . $err['message'] . "\n"); + $error++; setEventMessages($e->getMessage(), null, 'errors'); + dol_syslog($e->getMessage(), LOG_WARNING, 0, '_stripe'); $action=''; } catch (\Stripe\Error\RateLimit $e) { // Too many requests made to the API too quickly + $error++; + dol_syslog($e->getMessage(), LOG_WARNING, 0, '_stripe'); setEventMessages($e->getMessage(), null, 'errors'); $action=''; } catch (\Stripe\Error\InvalidRequest $e) { // Invalid parameters were supplied to Stripe's API + $error++; + dol_syslog($e->getMessage(), LOG_WARNING, 0, '_stripe'); setEventMessages($e->getMessage(), null, 'errors'); $action=''; } catch (\Stripe\Error\Authentication $e) { // Authentication with Stripe's API failed // (maybe you changed API keys recently) + $error++; + dol_syslog($e->getMessage(), LOG_WARNING, 0, '_stripe'); setEventMessages($e->getMessage(), null, 'errors'); $action=''; } catch (\Stripe\Error\ApiConnection $e) { // Network communication with Stripe failed + $error++; + dol_syslog($e->getMessage(), LOG_WARNING, 0, '_stripe'); setEventMessages($e->getMessage(), null, 'errors'); $action=''; } catch (\Stripe\Error\Base $e) { // Display a very generic error to the user, and maybe send // yourself an email + $error++; + dol_syslog($e->getMessage(), LOG_WARNING, 0, '_stripe'); setEventMessages($e->getMessage(), null, 'errors'); $action=''; } catch (Exception $e) { // Something else happened, completely unrelated to Stripe + $error++; + dol_syslog($e->getMessage(), LOG_WARNING, 0, '_stripe'); setEventMessages($e->getMessage(), null, 'errors'); $action=''; } - // TODO - dol_syslog("Action Pay."); + $_SESSION["onlinetoken"] = $stripeToken; + $_SESSION["FinalPaymentAmt"] = $amount; + $_SESSION["currencyCodeType"] = $currency; + $_SESSION["paymentType"] = ''; + $_SESSION['ipaddress'] = $_SERVER['REMOTE_ADDR']; // Payer ip + $_SESSION['payerID'] = is_object($customer)?$customer->id:''; + $_SESSION['TRANSACTIONID'] = is_object($charge)?$charge->id:''; + dol_syslog("Action charge stripe result=".$error." ip=".$_SESSION['ipaddress'], LOG_DEBUG, 0, '_stripe'); + dol_syslog("onlinetoken=".$_SESSION["onlinetoken"]." FinalPaymentAmt=".$_SESSION["FinalPaymentAmt"]." currencyCodeType=".$_SESSION["currencyCodeType"]." payerID=".$_SESSION['payerID']." TRANSACTIONID=".$_SESSION['TRANSACTIONID'], LOG_DEBUG, 0, '_stripe'); + dol_syslog("FULLTAG=".$FULLTAG, LOG_DEBUG, 0, '_stripe'); + dol_syslog("Now call the redirect to paymentok or paymentko", LOG_DEBUG, 0, '_stripe'); + + if ($error) + { + header("Location: ".DOL_URL_ROOT.'/public/stripe/paymentko.php?FULLTAG='.urlencode($FULLTAG)); + exit; + } + else + { + header("Location: ".DOL_URL_ROOT.'/public/stripe/paymentok.php?FULLTAG='.urlencode($FULLTAG)); + exit; + } } @@ -1046,11 +1092,16 @@ if (preg_match('/^dopayment/',$action)) print ''."\n"; print ''."\n"; print ''."\n"; - print ''."\n"; - print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; + print ''."\n"; print ''."\n"; print ''; - + print ''."\n"; + print ''."\n"; + print '
'.$langs->trans("AccountancyCode").''; - print $formaccountancy->select_account($object->account_number, 'account_number', 1, '', 1, 1); - print '
'.$langs->trans("AccountancyCode").'account_number).'">
'.$langs->trans("AccountancyCode").''; + print $formaccountancy->select_account($object->account_number, 'account_number', 1, '', 1, 1); + print '
'.$langs->trans("AccountancyCode").''; - print $formaccountancy->select_account($object->account_number, 'account_number', 1, '', 1, 1); - print '
'.$langs->trans("AccountancyCode").'account_number).'">
'.$langs->trans("AccountancyCode").'account_number).'">
'.$langs->trans("AccountancyJournal").''; - print $formaccountancy2->select_journal($object->fk_accountancy_journal, 'fk_accountancy_journal', 4, 1, '', 1, 1); + print $formaccountancy2->select_journal($object->fk_accountancy_journal, 'fk_accountancy_journal', 4, 1, '', 0, 0); print '
'.$langs->trans("AccountancyJournal").''; - print $formaccountancy2->select_journal($object->fk_accountancy_journal, 'fk_accountancy_journal', 4, 1, '', 1, 1); + print $formaccountancy2->select_journal($object->fk_accountancy_journal, 'fk_accountancy_journal', 4, 1, '', 0, 0); print '
'; print ''; print ''; print ''; print ''; print '
diff --git a/htdocs/public/stripe/paymentko.php b/htdocs/public/stripe/paymentko.php new file mode 100644 index 00000000000..01000939b37 --- /dev/null +++ b/htdocs/public/stripe/paymentko.php @@ -0,0 +1,165 @@ + +* + * 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 3 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/public/stripe/paymentko.php + * \ingroup core + * \brief File to show page after a failed payment. + * This page is called by payment system with url provided to it competed with parameter FULLTAG=xxx + * More data like token are saved into session. This token can be used to get more informations. + */ + +define("NOLOGIN",1); // This means this output page does not require to be logged. +define("NOCSRFCHECK",1); // We accept to go on this page from external web site. + +// For MultiCompany module. +// Do not use GETPOST here, function is not defined and define must be done before including main.inc.php +// TODO This should be useless. Because entity must be retreive from object ref and not from url. +$entity=(! empty($_GET['entity']) ? (int) $_GET['entity'] : (! empty($_POST['entity']) ? (int) $_POST['entity'] : 1)); +if (is_numeric($entity)) define("DOLENTITY", $entity); + +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; + +$langs->load("main"); +$langs->load("other"); +$langs->load("dict"); +$langs->load("bills"); +$langs->load("companies"); +$langs->load("paybox"); +$langs->load("paypal"); +$langs->load("stripe"); + +$FULLTAG=GETPOST('FULLTAG'); +if (empty($FULLTAG)) $FULLTAG=GETPOST('fulltag'); + +// Security check +if (empty($conf->stripe->enabled)) accessforbidden('',0,0,1); + +$object = new stdClass(); // For triggers + +$paymentmethod='stripe'; + + +/* + * Actions + */ + + + + +/* + * View + */ + +dol_syslog("Callback url when a PayPal payment was canceled. query_string=".(empty($_SERVER["QUERY_STRING"])?'':$_SERVER["QUERY_STRING"])." script_uri=".(empty($_SERVER["SCRIPT_URI"])?'':$_SERVER["SCRIPT_URI"]), LOG_DEBUG, 0, '_stripe'); + +$tracepost = ""; +foreach($_POST as $k => $v) $tracepost .= "{$k} - {$v}\n"; +dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_stripe'); + +if (! empty($_SESSION['ipaddress'])) // To avoid to make action twice +{ + $fulltag = $FULLTAG; + $onlinetoken = empty($PAYPALTOKEN)?$_SESSION['onlinetoken']:$PAYPALTOKEN; + $payerID = empty($PAYPALPAYERID)?$_SESSION['payerID']:$PAYPALPAYERID; + $currencyCodeType = $_SESSION['currencyCodeType']; + $paymentType = $_SESSION['paymentType']; + $FinalPaymentAmt = $_SESSION['FinalPaymentAmt']; + $ipaddress = $_SESSION['ipaddress']; + + // Appel des triggers + include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + $interface=new Interfaces($db); + $result=$interface->run_triggers('STRIPE_PAYMENT_KO',$object,$user,$langs,$conf); + if ($result < 0) { $error++; $errors=$interface->errors; } + // Fin appel triggers + + // Send an email + $sendemail = ''; + if (! empty($conf->global->PAYPAL_PAYONLINE_SENDEMAIL)) $sendemail=$conf->global->PAYPAL_PAYONLINE_SENDEMAIL; + + if ($sendemail) + { + // Get on url call + $sendto=$sendemail; + $from=$conf->global->MAILING_EMAIL_FROM; + + // Define link to login card + $appli=constant('DOL_APPLICATION_TITLE'); + if (! empty($conf->global->MAIN_APPLICATION_TITLE)) + { + $appli=$conf->global->MAIN_APPLICATION_TITLE; + if (preg_match('/\d\.\d/', $appli)) + { + if (! preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) $appli.=" (".DOL_VERSION.")"; // If new title contains a version that is different than core + } + else $appli.=" ".DOL_VERSION; + } + else $appli.=" ".DOL_VERSION; + + $urlback=$_SERVER["REQUEST_URI"]; + $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("NewOnlinePaymentFailed"); + $content=""; + $content.=$langs->transnoentitiesnoconv("ValidationOfOnlinePaymentFailed")."\n"; + $content.="\n"; + $content.=$langs->transnoentitiesnoconv("TechnicalInformation").":\n"; + $content.=$langs->transnoentitiesnoconv("OnlinePaymentSystem").': '.$paymentmethod."\n"; + $content.=$langs->transnoentitiesnoconv("ReturnURLAfterPayment").': '.$urlback."\n"; + $content.="tag=".$fulltag."\ntoken=".$onlinetoken." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; + require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; + $mailfile = new CMailFile($topic, $sendto, $from, $content); + + $result=$mailfile->sendfile(); + if ($result) + { + dol_syslog("EMail sent to ".$sendto, LOG_DEBUG, 0, '_stripe'); + } + else + { + dol_syslog("Failed to send EMail to ".$sendto, LOG_ERR, 0, '_stripe'); + } + } + + unset($_SESSION['ipaddress']); +} + +$head=''; +if (! empty($conf->global->STRIPE_CSS_URL)) $head=''."\n"; + +$conf->dol_hide_topmenu=1; +$conf->dol_hide_leftmenu=1; + +llxHeader($head, $langs->trans("PaymentForm"), '', '', 0, 0, '', '', '', 'onlinepaymentbody'); + + +// Show ko message +print ''."\n"; +print '
'."\n"; +print $langs->trans("YourPaymentHasNotBeenRecorded")."

"; + +if (! empty($conf->global->STRIPE_MESSAGE_KO)) print $conf->global->STRIPE_MESSAGE_KO; +print "\n
\n"; + + +htmlPrintOnlinePaymentFooter($mysoc,$langs); + + +llxFooter('', 'public'); + +$db->close(); diff --git a/htdocs/public/stripe/paymentok.php b/htdocs/public/stripe/paymentok.php new file mode 100644 index 00000000000..4eede2e9544 --- /dev/null +++ b/htdocs/public/stripe/paymentok.php @@ -0,0 +1,199 @@ + + * + * 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 3 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/public/stripe/paymentok.php + * \ingroup core + * \brief File to show page after a successful payment + * This page is called by payment system with url provided to it completed with parameter FULLTAG=xxx + * More data like token are saved into session. This token can be used to get more informations. + */ + +define("NOLOGIN",1); // This means this output page does not require to be logged. +define("NOCSRFCHECK",1); // We accept to go on this page from external web site. + +// For MultiCompany module. +// Do not use GETPOST here, function is not defined and define must be done before including main.inc.php +// TODO This should be useless. Because entity must be retreive from object ref and not from url. +$entity=(! empty($_GET['entity']) ? (int) $_GET['entity'] : (! empty($_POST['entity']) ? (int) $_POST['entity'] : 1)); +if (is_numeric($entity)) define("DOLENTITY", $entity); + +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/payments.lib.php'; + +$langs->load("main"); +$langs->load("other"); +$langs->load("dict"); +$langs->load("bills"); +$langs->load("companies"); +$langs->load("paybox"); +$langs->load("paypal"); + +$FULLTAG=GETPOST('FULLTAG'); +if (empty($FULLTAG)) $FULLTAG=GETPOST('fulltag'); +$source=GETPOST('source'); +$ref=GETPOST('ref'); + +// Security check +if (empty($conf->stripe->enabled)) accessforbidden('', 0, 0, 1); + + +$ispaymentok = false; +// If payment is ok +$PAYMENTSTATUS=$TRANSACTIONID=$TAXAMT=$NOTE=''; +// If payment is ko +$ErrorCode=$ErrorShortMsg=$ErrorLongMsg=$ErrorSeverityCode=''; + + +$object = new stdClass(); // For triggers + +$paymentmethod='stripe'; + + +/* + * Actions + */ + + + +/* + * View + */ + +dol_syslog("Callback url when a payment was done. query_string=".(empty($_SERVER["QUERY_STRING"])?'':$_SERVER["QUERY_STRING"])." script_uri=".(empty($_SERVER["SCRIPT_URI"])?'':$_SERVER["SCRIPT_URI"]), LOG_DEBUG, 0, '_stripe'); + +$tracepost = ""; +foreach($_POST as $k => $v) $tracepost .= "{$k} - {$v}\n"; +dol_syslog("POST=".$tracepost, LOG_DEBUG, 0, '_stripe'); + +$head=''; +if (! empty($conf->global->STRIPE_CSS_URL)) $head=''."\n"; + +$conf->dol_hide_topmenu=1; +$conf->dol_hide_leftmenu=1; + +llxHeader($head, $langs->trans("PaymentForm"), '', '', 0, 0, '', '', '', 'onlinepaymentbody'); + + + +// Show message +print ''."\n"; +print '
'."\n"; + +$ispaymentok = true; // We call this page if payment is ok +if ($ispaymentok) +{ + // Get on url call + $fulltag = $FULLTAG; + $onlinetoken = empty($PAYPALTOKEN)?$_SESSION['onlinetoken']:$PAYPALTOKEN; + $payerID = empty($PAYPALPAYERID)?$_SESSION['payerID']:$PAYPALPAYERID; + // Set by newpayment.php + $paymentType = $_SESSION['PaymentType']; + $currencyCodeType = $_SESSION['currencyCodeType']; + $FinalPaymentAmt = $_SESSION["Payment_Amount"]; + // From env + $ipaddress = $_SESSION['ipaddress']; + $TRANSACTIONID = $_SESSION['TRANSACTIONID']; + + // Appel des triggers + include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + $interface=new Interfaces($db); + $result=$interface->run_triggers('STRIPE_PAYMENT_OK',$object,$user,$langs,$conf); + if ($result < 0) { $error++; $errors=$interface->errors; } + // Fin appel triggers + + + print $langs->trans("YourPaymentHasBeenRecorded")."
\n"; + print $langs->trans("ThisIsTransactionId",$TRANSACTIONID)."

\n"; + if (! empty($conf->global->STRIPE_MESSAGE_OK)) print $conf->global->STRIPE_MESSAGE_OK; + + $sendemail = ''; + if (! empty($conf->global->STRIPE_PAYONLINE_SENDEMAIL)) $sendemail=$conf->global->STRIPE_PAYONLINE_SENDEMAIL; + + // Send an email + if ($sendemail) + { + $sendto=$sendemail; + $from=$conf->global->MAILING_EMAIL_FROM; + // Define $urlwithroot + $urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($dolibarr_main_url_root)); + $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file + //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current + + // Define link to login card + $appli=constant('DOL_APPLICATION_TITLE'); + if (! empty($conf->global->MAIN_APPLICATION_TITLE)) + { + $appli=$conf->global->MAIN_APPLICATION_TITLE; + if (preg_match('/\d\.\d/', $appli)) + { + if (! preg_match('/'.preg_quote(DOL_VERSION).'/', $appli)) $appli.=" (".DOL_VERSION.")"; // If new title contains a version that is different than core + } + else $appli.=" ".DOL_VERSION; + } + else $appli.=" ".DOL_VERSION; + + $urlback=$_SERVER["REQUEST_URI"]; + $topic='['.$appli.'] '.$langs->transnoentitiesnoconv("NewOnlinePaymentReceived"); + $tmptag=dolExplodeIntoArray($fulltag,'.','='); + $content=""; + if (! empty($tmptag['MEM'])) + { + $langs->load("members"); + $url=$urlwithroot."/adherents/card_subscriptions.php?rowid=".$tmptag['MEM']; + $content.=$langs->trans("PaymentSubscription")."
\n"; + $content.=$langs->trans("MemberId").': '.$tmptag['MEM']."
\n"; + $content.=$langs->trans("Link").': '.$url.''."
\n"; + } + else + { + $content.=$langs->transnoentitiesnoconv("NewOnlinePaymentReceived")."
\n"; + } + $content.="
\n"; + $content.=$langs->transnoentitiesnoconv("TechnicalInformation").":
\n"; + $content.=$langs->transnoentitiesnoconv("OnlinePaymentSystem").': '.$paymentmethod."
\n"; + $content.=$langs->transnoentitiesnoconv("ReturnURLAfterPayment").': '.$urlback."
\n"; + $content.="tag=".$fulltag."\ntoken=".$onlinetoken." paymentType=".$paymentType." currencycodeType=".$currencyCodeType." payerId=".$payerID." ipaddress=".$ipaddress." FinalPaymentAmt=".$FinalPaymentAmt; + + $ishtml=dol_textishtml($content); // May contain urls + + require_once DOL_DOCUMENT_ROOT.'/core/class/CMailFile.class.php'; + $mailfile = new CMailFile($topic, $sendto, $from, $content, array(), array(), array(), '', '', 0, $ishtml); + + $result=$mailfile->sendfile(); + if ($result) + { + dol_syslog("EMail sent to ".$sendto, LOG_DEBUG, 0, '_stripe'); + } + else + { + dol_syslog("Failed to send EMail to ".$sendto, LOG_ERR, 0, '_stripe'); + } + } +} + + +print "\n
\n"; + + +htmlPrintOnlinePaymentFooter($mysoc,$langs); + + +llxFooter('', 'public'); + +$db->close(); diff --git a/htdocs/stripe/admin/stripe.php b/htdocs/stripe/admin/stripe.php index 484b7537755..6ca9073a9df 100644 --- a/htdocs/stripe/admin/stripe.php +++ b/htdocs/stripe/admin/stripe.php @@ -63,6 +63,8 @@ if ($action == 'setvalue' && $user->admin) if (! $result > 0) $error++; $result=dolibarr_set_const($db, "STRIPE_MESSAGE_KO",GETPOST('STRIPE_MESSAGE_KO','alpha'),'chaine',0,'',$conf->entity); if (! $result > 0) $error++; + $result=dolibarr_set_const($db, "STRIPE_PAYONLINE_SENDEMAIL",GETPOST('STRIPE_PAYONLINE_SENDEMAIL'),'chaine',0,'',$conf->entity); + if (! $result > 0) $error++; if (! $error) { @@ -148,25 +150,25 @@ print '
'; print ''.$langs->trans("STRIPE_TEST_PUBLISHABLE_KEY").''; print ''; -print '
'.$langs->trans("Example").': pk_test_xxxxxxxxxxxxxxxxxxxxxxxx'; +print '   '.$langs->trans("Example").': pk_test_xxxxxxxxxxxxxxxxxxxxxxxx'; print '
'; print ''.$langs->trans("STRIPE_TEST_SECRET_KEY").''; print ''; -print '
'.$langs->trans("Example").': sk_test_xxxxxxxxxxxxxxxxxxxxxxxx'; +print '   '.$langs->trans("Example").': sk_test_xxxxxxxxxxxxxxxxxxxxxxxx'; print '
'; print ''.$langs->trans("STRIPE_LIVE_PUBLISHABLE_KEY").''; print ''; -print '
'.$langs->trans("Example").': pk_live_xxxxxxxxxxxxxxxxxxxxxxxx'; +print '   '.$langs->trans("Example").': pk_live_xxxxxxxxxxxxxxxxxxxxxxxx'; print '
'; print ''.$langs->trans("STRIPE_LIVE_SECRET_KEY").''; print ''; -print '
'.$langs->trans("Example").': sk_live_xxxxxxxxxxxxxxxxxxxxxxxx'; +print '   '.$langs->trans("Example").': sk_live_xxxxxxxxxxxxxxxxxxxxxxxx'; print '
'; @@ -182,13 +184,13 @@ print "\n"; print ''; print $langs->trans("VendorName").''; print ''; -print '
'.$langs->trans("Example").': '.$mysoc->name; +print '   '.$langs->trans("Example").': '.$mysoc->name; print ''; print ''; print $langs->trans("CSSUrlForPaymentForm").''; print ''; -print '
'.$langs->trans("Example").': http://mysite/mycss.css'; +print '   '.$langs->trans("Example").': http://mysite/mycss.css'; print ''; print ''; @@ -203,6 +205,12 @@ $doleditor=new DolEditor('STRIPE_MESSAGE_KO',$conf->global->STRIPE_MESSAGE_KO,'' $doleditor->Create(); print ''; +print ''; +print $langs->trans("STRIPE_PAYONLINE_SENDEMAIL").''; +print ''; +print '   '.$langs->trans("Example").': myemail@myserver.com'; +print ''; + print ''; dol_fiche_end(); diff --git a/htdocs/stripe/lib/stripe.lib.php b/htdocs/stripe/lib/stripe.lib.php index 5f0b1bd0404..fbafd47c3ab 100644 --- a/htdocs/stripe/lib/stripe.lib.php +++ b/htdocs/stripe/lib/stripe.lib.php @@ -73,6 +73,7 @@ function showStripePaymentUrl($type,$ref) $out.=img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePayment",$servicename).'
'; $url=getStripePaymentUrl(0,$type,$ref); $out.='
'; + $out.=ajax_autoselect("stripeurl", 0); return $out; } From caae7e41718a23491ea6b78f8100b52e6a0dcf9f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 14 May 2017 17:05:13 +0200 Subject: [PATCH 124/299] NEW It's easier to switch between sandbox and live for paypal --- htdocs/langs/en_US/paypal.lang | 3 ++- htdocs/langs/en_US/stripe.lang | 2 +- htdocs/paypal/admin/paypal.php | 35 +++++++++++++++++++++++------ htdocs/public/paypal/newpayment.php | 2 +- htdocs/public/stripe/newpayment.php | 7 +++--- htdocs/stripe/admin/stripe.php | 1 + 6 files changed, 37 insertions(+), 13 deletions(-) diff --git a/htdocs/langs/en_US/paypal.lang b/htdocs/langs/en_US/paypal.lang index 63999f31234..a0cadc88096 100644 --- a/htdocs/langs/en_US/paypal.lang +++ b/htdocs/langs/en_US/paypal.lang @@ -28,4 +28,5 @@ DetailedErrorMessage=Detailed Error Message ShortErrorMessage=Short Error Message ErrorCode=Error Code ErrorSeverityCode=Error Severity Code -OnlinePaymentSystem=Online payment system \ No newline at end of file +OnlinePaymentSystem=Online payment system +PaypalLiveEnabled=Paypal live enabled (otherwise test/sandbox mode) \ No newline at end of file diff --git a/htdocs/langs/en_US/stripe.lang b/htdocs/langs/en_US/stripe.lang index 68b853ac25b..c115a76603c 100644 --- a/htdocs/langs/en_US/stripe.lang +++ b/htdocs/langs/en_US/stripe.lang @@ -39,4 +39,4 @@ STRIPE_TEST_SECRET_KEY=Secret test key STRIPE_TEST_PUBLISHABLE_KEY=Publishable test key STRIPE_LIVE_SECRET_KEY=Secret live key STRIPE_LIVE_PUBLISHABLE_KEY=Publishable live key -StripeLiveEnabled=Stripe live enabled \ No newline at end of file +StripeLiveEnabled=Stripe live enabled (otherwise test/sandbox mode) \ No newline at end of file diff --git a/htdocs/paypal/admin/paypal.php b/htdocs/paypal/admin/paypal.php index 36c8df9d0d6..2d0be83c80d 100644 --- a/htdocs/paypal/admin/paypal.php +++ b/htdocs/paypal/admin/paypal.php @@ -44,8 +44,6 @@ if ($action == 'setvalue' && $user->admin) { $db->begin(); - $result=dolibarr_set_const($db, "PAYPAL_API_SANDBOX",GETPOST('PAYPAL_API_SANDBOX','alpha'),'chaine',0,'',$conf->entity); - if (! $result > 0) $error++; $result=dolibarr_set_const($db, "PAYPAL_API_USER",GETPOST('PAYPAL_API_USER','alpha'),'chaine',0,'',$conf->entity); if (! $result > 0) $error++; $result=dolibarr_set_const($db, "PAYPAL_API_PASSWORD",GETPOST('PAYPAL_API_PASSWORD','alpha'),'chaine',0,'',$conf->entity); @@ -85,6 +83,21 @@ if ($action == 'setvalue' && $user->admin) } } +if ($action=="setlive") +{ + $liveenable = GETPOST('value','int')?0:1; + $res = dolibarr_set_const($db, "PAYPAL_API_SANDBOX", $liveenable,'yesno',0,'',$conf->entity); + if (! $res > 0) $error++; + if (! $error) + { + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); + } + else + { + setEventMessages($langs->trans("Error"), null, 'errors'); + } +} + /* * View @@ -127,13 +140,21 @@ print ''.$langs->trans("AccountParameter").''; print ''.$langs->trans("Value").''; print "\n"; - -print ''; -print $langs->trans("PAYPAL_API_SANDBOX").''; -print $form->selectyesno("PAYPAL_API_SANDBOX",$conf->global->PAYPAL_API_SANDBOX,1); +print ''; +print ''; +print $langs->trans("PaypalLiveEnabled").''; +if (empty($conf->global->PAYPAL_API_SANDBOX)) +{ + print ''; + print img_picto($langs->trans("Activated"),'switch_on'); +} +else +{ + print ''; + print img_picto($langs->trans("Disabled"),'switch_off'); +} print ''; - print ''; print $langs->trans("PAYPAL_API_USER").''; print ''; diff --git a/htdocs/public/paypal/newpayment.php b/htdocs/public/paypal/newpayment.php index c9cedcfd32d..08bf0c4faed 100644 --- a/htdocs/public/paypal/newpayment.php +++ b/htdocs/public/paypal/newpayment.php @@ -265,7 +265,7 @@ $conf->dol_hide_leftmenu=1; llxHeader($head, $langs->trans("PaymentForm"), '', '', 0, 0, '', '', '', 'onlinepaymentbody'); -if (! empty($PAYPAL_API_SANDBOX)) +if (! empty($conf->global->PAYPAL_API_SANDBOX)) { dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode'),'','warning'); } diff --git a/htdocs/public/stripe/newpayment.php b/htdocs/public/stripe/newpayment.php index 5975d349fe4..64ea70cfbeb 100644 --- a/htdocs/public/stripe/newpayment.php +++ b/htdocs/public/stripe/newpayment.php @@ -49,6 +49,7 @@ $langs->load("main"); $langs->load("companies"); $langs->load("other"); $langs->load("paybox"); // File with generic data +$langs->load("paypal"); $langs->load("stripe"); $action=GETPOST('action','alpha'); @@ -300,12 +301,12 @@ if ($action == 'charge') if ($error) { - header("Location: ".DOL_URL_ROOT.'/public/stripe/paymentko.php?FULLTAG='.urlencode($FULLTAG)); + header("Location: ".$urlko); exit; } else { - header("Location: ".DOL_URL_ROOT.'/public/stripe/paymentok.php?FULLTAG='.urlencode($FULLTAG)); + header("Location: ".$urlok); exit; } @@ -324,7 +325,7 @@ $conf->dol_hide_leftmenu=1; llxHeader($head, $langs->trans("PaymentForm"), '', '', 0, 0, '', '', '', 'onlinepaymentbody'); -if (! empty($STRIPE_API_SANDBOX)) +if (empty($conf->global->STRIPE_LIVE)) { dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode'),'','warning'); } diff --git a/htdocs/stripe/admin/stripe.php b/htdocs/stripe/admin/stripe.php index 6ca9073a9df..056e43690b2 100644 --- a/htdocs/stripe/admin/stripe.php +++ b/htdocs/stripe/admin/stripe.php @@ -93,6 +93,7 @@ if ($action=="setlive") } } + /* * View */ From 93554b7e30d4b6d4830292a054cdf7154885f132 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sun, 14 May 2017 21:06:33 +0200 Subject: [PATCH 125/299] Typo searchpicto --- htdocs/accountancy/admin/categories_list.php | 4 ++-- htdocs/accountancy/admin/journals_list.php | 4 ++-- htdocs/accountancy/admin/productaccount.php | 4 ++-- htdocs/accountancy/bookkeeping/balance.php | 4 ++-- htdocs/accountancy/bookkeeping/listbyaccount.php | 4 ++-- htdocs/adherents/list.php | 4 ++-- htdocs/adherents/subscription/list.php | 4 ++-- htdocs/admin/dict.php | 4 ++-- htdocs/admin/tools/listevents.php | 4 ++-- htdocs/admin/translation.php | 4 ++-- htdocs/comm/action/listactions.php | 4 ++-- htdocs/comm/mailing/cibles.php | 4 ++-- htdocs/comm/mailing/list.php | 4 ++-- htdocs/comm/propal/list.php | 4 ++-- htdocs/commande/list.php | 4 ++-- htdocs/compta/bank/bankentries.php | 4 ++-- htdocs/compta/bank/index.php | 4 ++-- htdocs/compta/deplacement/list.php | 4 ++-- htdocs/compta/facture/fiche-rec.php | 4 ++-- htdocs/compta/facture/list.php | 4 ++-- htdocs/compta/paiement/cheque/list.php | 4 ++-- htdocs/compta/paiement/list.php | 4 ++-- htdocs/compta/prelevement/bons.php | 4 ++-- htdocs/compta/prelevement/demandes.php | 4 ++-- htdocs/compta/prelevement/list.php | 4 ++-- htdocs/compta/salaries/index.php | 4 ++-- htdocs/compta/sociales/index.php | 4 ++-- htdocs/compta/tva/reglement.php | 4 ++-- htdocs/contrat/list.php | 4 ++-- htdocs/contrat/services.php | 4 ++-- htdocs/core/lib/company.lib.php | 4 ++-- htdocs/don/list.php | 4 ++-- htdocs/expedition/list.php | 4 ++-- htdocs/expensereport/list.php | 4 ++-- htdocs/fichinter/list.php | 4 ++-- htdocs/fourn/commande/list.php | 4 ++-- htdocs/fourn/facture/impayees.php | 4 ++-- htdocs/fourn/facture/list.php | 4 ++-- htdocs/fourn/facture/paiement.php | 4 ++-- htdocs/holiday/list.php | 4 ++-- htdocs/opensurvey/list.php | 4 ++-- htdocs/product/list.php | 4 ++-- htdocs/product/price.php | 4 ++-- htdocs/product/reassort.php | 4 ++-- htdocs/product/reassortlot.php | 4 ++-- htdocs/projet/list.php | 4 ++-- htdocs/projet/tasks.php | 4 ++-- htdocs/resource/list.php | 4 ++-- htdocs/societe/consumption.php | 4 ++-- htdocs/societe/list.php | 4 ++-- htdocs/societe/price.php | 4 ++-- htdocs/supplier_proposal/list.php | 4 ++-- 52 files changed, 104 insertions(+), 104 deletions(-) diff --git a/htdocs/accountancy/admin/categories_list.php b/htdocs/accountancy/admin/categories_list.php index 7b1eb44545a..86be6aa52ab 100644 --- a/htdocs/accountancy/admin/categories_list.php +++ b/htdocs/accountancy/admin/categories_list.php @@ -661,8 +661,8 @@ if ($id) print ''; if ($filterfound) { - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; } print ''; print ''; diff --git a/htdocs/accountancy/admin/journals_list.php b/htdocs/accountancy/admin/journals_list.php index 0b13bfc7d4d..facb507c530 100644 --- a/htdocs/accountancy/admin/journals_list.php +++ b/htdocs/accountancy/admin/journals_list.php @@ -577,8 +577,8 @@ if ($id) print ''; if ($filterfound) { - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; } print ''; print ''; diff --git a/htdocs/accountancy/admin/productaccount.php b/htdocs/accountancy/admin/productaccount.php index dda7d545043..4f82db33e94 100644 --- a/htdocs/accountancy/admin/productaccount.php +++ b/htdocs/accountancy/admin/productaccount.php @@ -329,8 +329,8 @@ if ($result) print ''; print ' '; print ''; - $searchpitco=$form->showFilterButtons(); - print $searchpitco; + $searchpicto=$form->showFilterButtons(); + print $searchpicto; print ''; print ''; diff --git a/htdocs/accountancy/bookkeeping/balance.php b/htdocs/accountancy/bookkeeping/balance.php index 5f4801da32c..9e5be25eb73 100644 --- a/htdocs/accountancy/bookkeeping/balance.php +++ b/htdocs/accountancy/bookkeeping/balance.php @@ -192,8 +192,8 @@ else { print $formventilation->select_account($search_accountancy_code_end, 'search_accountancy_code_end', 1, array(), 1, 1, ''); print ''; print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print ''; diff --git a/htdocs/accountancy/bookkeeping/listbyaccount.php b/htdocs/accountancy/bookkeeping/listbyaccount.php index 2323f3afcb8..eb8a53561d2 100644 --- a/htdocs/accountancy/bookkeeping/listbyaccount.php +++ b/htdocs/accountancy/bookkeeping/listbyaccount.php @@ -239,8 +239,8 @@ print ' '; print ' '; print ''; print ''; -$searchpitco=$form->showFilterAndCheckAddButtons(0); -print $searchpitco; +$searchpicto=$form->showFilterAndCheckAddButtons(0); +print $searchpicto; print ''; print ''; diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php index 7a6013b9b78..37237b29073 100644 --- a/htdocs/adherents/list.php +++ b/htdocs/adherents/list.php @@ -560,8 +560,8 @@ if (! empty($arrayfields['d.statut']['checked'])) } // Action column print ''; -$searchpitco=$form->showFilterButtons(); -print $searchpitco; +$searchpicto=$form->showFilterButtons(); +print $searchpicto; print ''; print "\n"; diff --git a/htdocs/adherents/subscription/list.php b/htdocs/adherents/subscription/list.php index 750ad483461..206f5ebf8c9 100644 --- a/htdocs/adherents/subscription/list.php +++ b/htdocs/adherents/subscription/list.php @@ -239,8 +239,8 @@ if ($result) // Action column print ''; - $searchpitco=$form->showFilterButtons(); - print $searchpitco; + $searchpicto=$form->showFilterButtons(); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index 28e99d02606..46a8001b02a 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -1188,8 +1188,8 @@ if ($id) print ''; if ($filterfound) { - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; } print ''; print ''; diff --git a/htdocs/admin/tools/listevents.php b/htdocs/admin/tools/listevents.php index f5e6afd36b1..47f4af17dcf 100644 --- a/htdocs/admin/tools/listevents.php +++ b/htdocs/admin/tools/listevents.php @@ -249,8 +249,8 @@ if ($result) print ''; print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/admin/translation.php b/htdocs/admin/translation.php index 44387bc2041..c9488f919fe 100644 --- a/htdocs/admin/translation.php +++ b/htdocs/admin/translation.php @@ -421,8 +421,8 @@ if ($mode == 'searchkey') print ''; // Action column print ''; - $searchpitco=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); + print $searchpicto; print ''; print ''; diff --git a/htdocs/comm/action/listactions.php b/htdocs/comm/action/listactions.php index 3e6224e0c41..232eb0fc9b1 100644 --- a/htdocs/comm/action/listactions.php +++ b/htdocs/comm/action/listactions.php @@ -361,8 +361,8 @@ if ($resql) print ''; // Action column print ''; - $searchpitco=$form->showFilterButtons(); - print $searchpitco; + $searchpicto=$form->showFilterButtons(); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/comm/mailing/cibles.php b/htdocs/comm/mailing/cibles.php index 118cc336fb7..01924526c66 100644 --- a/htdocs/comm/mailing/cibles.php +++ b/htdocs/comm/mailing/cibles.php @@ -484,8 +484,8 @@ if ($object->fetch($id) >= 0) print ''; // Action column print ''; - $searchpitco=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); + print $searchpicto; print ''; print ''; diff --git a/htdocs/comm/mailing/list.php b/htdocs/comm/mailing/list.php index 8a9c01787d1..f5efbf54383 100644 --- a/htdocs/comm/mailing/list.php +++ b/htdocs/comm/mailing/list.php @@ -135,8 +135,8 @@ if ($result) print ' '; print ' '; print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index 3595d871c72..ac5cee3bebc 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -696,8 +696,8 @@ if ($resql) } // Action column print ''; - $searchpitco=$form->showFilterButtons(); - print $searchpitco; + $searchpicto=$form->showFilterButtons(); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 8cab07c9780..c73258cff89 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -989,8 +989,8 @@ if ($resql) } // Action column print ''; - $searchpitco=$form->showFilterButtons(); - print $searchpitco; + $searchpicto=$form->showFilterButtons(); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/compta/bank/bankentries.php b/htdocs/compta/bank/bankentries.php index 286836b0103..ed8241de427 100644 --- a/htdocs/compta/bank/bankentries.php +++ b/htdocs/compta/bank/bankentries.php @@ -797,8 +797,8 @@ if ($resql) print ''; print ''; print ''; - $searchpitco=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/compta/bank/index.php b/htdocs/compta/bank/index.php index f5d4fee1fc0..37883c29c0f 100644 --- a/htdocs/compta/bank/index.php +++ b/htdocs/compta/bank/index.php @@ -393,8 +393,8 @@ if (! empty($arrayfields['balance']['checked'])) } // Action column print ''; -$searchpitco=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); -print $searchpitco; +$searchpicto=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); +print $searchpicto; print ''; print ''; diff --git a/htdocs/compta/deplacement/list.php b/htdocs/compta/deplacement/list.php index 95f4082e082..1cf976325ec 100644 --- a/htdocs/compta/deplacement/list.php +++ b/htdocs/compta/deplacement/list.php @@ -165,8 +165,8 @@ if ($resql) // print ''; print ''; print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/compta/facture/fiche-rec.php b/htdocs/compta/facture/fiche-rec.php index acf97a3893a..bfede218eb8 100644 --- a/htdocs/compta/facture/fiche-rec.php +++ b/htdocs/compta/facture/fiche-rec.php @@ -1769,8 +1769,8 @@ else } // Action column print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0, 'checkforselect', 1); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0, 'checkforselect', 1); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index 5b01c445960..638ca033e1a 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -936,8 +936,8 @@ if ($resql) } // Action column print ''; - $searchpitco=$form->showFilterButtons(); - print $searchpitco; + $searchpicto=$form->showFilterButtons(); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/compta/paiement/cheque/list.php b/htdocs/compta/paiement/cheque/list.php index f1a9a839792..9798e2d28b4 100644 --- a/htdocs/compta/paiement/cheque/list.php +++ b/htdocs/compta/paiement/cheque/list.php @@ -175,8 +175,8 @@ if ($resql) print ''; print ''; print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/compta/paiement/list.php b/htdocs/compta/paiement/list.php index d0ba0373457..ab4189d5338 100644 --- a/htdocs/compta/paiement/list.php +++ b/htdocs/compta/paiement/list.php @@ -254,8 +254,8 @@ if ($resql) print ''; print ''; print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; if (! empty($conf->global->BILL_ADD_PAYMENT_VALIDATION)) { diff --git a/htdocs/compta/prelevement/bons.php b/htdocs/compta/prelevement/bons.php index 973135765dc..7319de4a7bd 100644 --- a/htdocs/compta/prelevement/bons.php +++ b/htdocs/compta/prelevement/bons.php @@ -124,8 +124,8 @@ if ($result) print ''; print ' '; print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print ''; diff --git a/htdocs/compta/prelevement/demandes.php b/htdocs/compta/prelevement/demandes.php index c1c8bd7e929..e619b28e994 100644 --- a/htdocs/compta/prelevement/demandes.php +++ b/htdocs/compta/prelevement/demandes.php @@ -124,8 +124,8 @@ if ($resql) print ''; // Action column print ''; - $searchpitco=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); + print $searchpicto; print ''; print ''; diff --git a/htdocs/compta/prelevement/list.php b/htdocs/compta/prelevement/list.php index 2fa8a255407..9b1f1ff461e 100644 --- a/htdocs/compta/prelevement/list.php +++ b/htdocs/compta/prelevement/list.php @@ -154,8 +154,8 @@ if ($result) print ' '; print ' '; print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print ''; diff --git a/htdocs/compta/salaries/index.php b/htdocs/compta/salaries/index.php index 5e78a070796..e193374a552 100644 --- a/htdocs/compta/salaries/index.php +++ b/htdocs/compta/salaries/index.php @@ -184,8 +184,8 @@ if ($result) print ''; print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print ''; diff --git a/htdocs/compta/sociales/index.php b/htdocs/compta/sociales/index.php index e76a6edc49a..50e14823a5f 100644 --- a/htdocs/compta/sociales/index.php +++ b/htdocs/compta/sociales/index.php @@ -202,8 +202,8 @@ if ($resql) print ''; print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/compta/tva/reglement.php b/htdocs/compta/tva/reglement.php index 15a6df0a717..94895062bc3 100644 --- a/htdocs/compta/tva/reglement.php +++ b/htdocs/compta/tva/reglement.php @@ -182,8 +182,8 @@ if ($result) } print ''; print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php index 3bf4a45bb10..318a24931be 100644 --- a/htdocs/contrat/list.php +++ b/htdocs/contrat/list.php @@ -509,8 +509,8 @@ if ($resql) print ''; } print ''; - $searchpitco=$form->showFilterButtons(); - print $searchpitco; + $searchpicto=$form->showFilterButtons(); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/contrat/services.php b/htdocs/contrat/services.php index d92bcd16679..f283502bc3e 100644 --- a/htdocs/contrat/services.php +++ b/htdocs/contrat/services.php @@ -503,8 +503,8 @@ if (! empty($arrayfields['status']['checked'])) } // Action column print ''; -$searchpitco=$form->showFilterAndCheckAddButtons(0); -print $searchpitco; +$searchpicto=$form->showFilterAndCheckAddButtons(0); +print $searchpicto; print ''; print "\n"; diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php index 6847cd7b9c2..3fef1265f9d 100644 --- a/htdocs/core/lib/company.lib.php +++ b/htdocs/core/lib/company.lib.php @@ -1264,8 +1264,8 @@ function show_actions_done($conf, $langs, $db, $filterobj, $objcon='', $noprint= $out.=''; // Action column $out.=''; - $searchpitco=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); - $out.=$searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); + $out.=$searchpicto; $out.=''; $out.=''; diff --git a/htdocs/don/list.php b/htdocs/don/list.php index d271ea3e894..b0cd414ed28 100644 --- a/htdocs/don/list.php +++ b/htdocs/don/list.php @@ -183,8 +183,8 @@ if ($resql) print ''; print ''; print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/expedition/list.php b/htdocs/expedition/list.php index bff7991fdeb..50454e3f253 100644 --- a/htdocs/expedition/list.php +++ b/htdocs/expedition/list.php @@ -421,8 +421,8 @@ if ($resql) } // Action column print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index 204115d8112..06998059aa5 100644 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -461,8 +461,8 @@ if ($resql) } // Action column print ''; - $searchpitco=$form->showFilterButtons(); - print $searchpitco; + $searchpicto=$form->showFilterButtons(); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/fichinter/list.php b/htdocs/fichinter/list.php index b5a6bcb0e94..9963794fd9f 100644 --- a/htdocs/fichinter/list.php +++ b/htdocs/fichinter/list.php @@ -402,8 +402,8 @@ if ($resql) print ''; } print ''; - $searchpitco=$form->showFilterButtons(); - print $searchpitco; + $searchpicto=$form->showFilterButtons(); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/fourn/commande/list.php b/htdocs/fourn/commande/list.php index 80a98cc5886..8ca86a1e6c5 100644 --- a/htdocs/fourn/commande/list.php +++ b/htdocs/fourn/commande/list.php @@ -1019,8 +1019,8 @@ if ($resql) } // Action column print ''; - $searchpitco=$form->showFilterButtons(); - print $searchpitco; + $searchpicto=$form->showFilterButtons(); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/fourn/facture/impayees.php b/htdocs/fourn/facture/impayees.php index 4538351b6ad..4ade0a6dbb0 100644 --- a/htdocs/fourn/facture/impayees.php +++ b/htdocs/fourn/facture/impayees.php @@ -216,8 +216,8 @@ if ($user->rights->fournisseur->facture->lire) print ''; print ''; print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index 2924a40001a..9ad1bf63ce2 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -818,8 +818,8 @@ if ($resql) } // Action column print ''; - $searchpitco=$form->showFilterButtons('checkforselect', 0); - print $searchpitco; + $searchpicto=$form->showFilterButtons('checkforselect', 0); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/fourn/facture/paiement.php b/htdocs/fourn/facture/paiement.php index 5f1d8cd2d99..b6825e93d82 100644 --- a/htdocs/fourn/facture/paiement.php +++ b/htdocs/fourn/facture/paiement.php @@ -722,8 +722,8 @@ if (empty($action)) print ''; print ''; print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index ab8a89670ae..063c3042e3b 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -373,8 +373,8 @@ print ''; // ACTION print ''; -$searchpitco=$form->showFilterAndCheckAddButtons(0); -print $searchpitco; +$searchpicto=$form->showFilterAndCheckAddButtons(0); +print $searchpicto; print ''; print "\n"; diff --git a/htdocs/opensurvey/list.php b/htdocs/opensurvey/list.php index 203602bde6e..3f9411c9879 100644 --- a/htdocs/opensurvey/list.php +++ b/htdocs/opensurvey/list.php @@ -105,8 +105,8 @@ $arraystatus=array(''=>' ','expired'=>$langs->trans("Expired"),'opened'=>$l print ''. $form->selectarray('status', $arraystatus, $status).''; print ''; print ''; -$searchpitco=$form->showFilterAndCheckAddButtons(0); -print $searchpitco; +$searchpicto=$form->showFilterAndCheckAddButtons(0); +print $searchpicto; print ''; print ''."\n"; diff --git a/htdocs/product/list.php b/htdocs/product/list.php index b779d4b7bfa..9d256f33831 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -611,8 +611,8 @@ else print ''; } print ''; - $searchpitco=$form->showFilterButtons(); - print $searchpitco; + $searchpicto=$form->showFilterButtons(); + print $searchpicto; print ''; print ''; diff --git a/htdocs/product/price.php b/htdocs/product/price.php index d765411ed8c..407fe18bc61 100644 --- a/htdocs/product/price.php +++ b/htdocs/product/price.php @@ -1797,8 +1797,8 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) print ' '; // Print the search button print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print ''; } diff --git a/htdocs/product/reassort.php b/htdocs/product/reassort.php index ca335558899..a87fecd36b7 100644 --- a/htdocs/product/reassort.php +++ b/htdocs/product/reassort.php @@ -276,8 +276,8 @@ if ($resql) print ' '; print ''; print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print ''; diff --git a/htdocs/product/reassortlot.php b/htdocs/product/reassortlot.php index 183242c3c52..660d0e78bd3 100644 --- a/htdocs/product/reassortlot.php +++ b/htdocs/product/reassortlot.php @@ -280,8 +280,8 @@ if ($resql) print ' '; print ' '; print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print ''; diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index a7285e1f410..6e1bd638d29 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -605,8 +605,8 @@ if (! empty($arrayfields['p.fk_statut']['checked'])) } // Action column print ''; -$searchpitco=$form->showFilterButtons(); -print $searchpitco; +$searchpicto=$form->showFilterButtons(); +print $searchpicto; print ''; print ''."\n"; diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php index 35a7812d4fa..72736531356 100644 --- a/htdocs/projet/tasks.php +++ b/htdocs/projet/tasks.php @@ -501,8 +501,8 @@ else if ($id > 0 || ! empty($ref)) // Action column print ''; - $searchpitco=$form->showFilterButtons(); - print $searchpitco; + $searchpicto=$form->showFilterButtons(); + print $searchpicto; print ''; } diff --git a/htdocs/resource/list.php b/htdocs/resource/list.php index 559dbce4b06..c0b58523994 100644 --- a/htdocs/resource/list.php +++ b/htdocs/resource/list.php @@ -232,8 +232,8 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab } // Action column print ''; -$searchpitco=$form->showFilterAndCheckAddButtons(0); -print $searchpitco; +$searchpicto=$form->showFilterAndCheckAddButtons(0); +print $searchpicto; print ''; print "\n"; diff --git a/htdocs/societe/consumption.php b/htdocs/societe/consumption.php index d0f92bb9c14..17018091951 100644 --- a/htdocs/societe/consumption.php +++ b/htdocs/societe/consumption.php @@ -388,8 +388,8 @@ if ($sql_select) print ''; print ''; print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print ''; diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index 7693da9d818..37134fbd313 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -863,8 +863,8 @@ if (! empty($arrayfields['s.status']['checked'])) } // Action column print ''; -$searchpitco=$form->showFilterButtons(); -print $searchpitco; +$searchpicto=$form->showFilterButtons(); +print $searchpicto; print ''; print "\n"; diff --git a/htdocs/societe/price.php b/htdocs/societe/price.php index e8dc595c6c3..952a34a9a59 100644 --- a/htdocs/societe/price.php +++ b/htdocs/societe/price.php @@ -510,8 +510,8 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) { print ' '; // Print the search button print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print ''; } diff --git a/htdocs/supplier_proposal/list.php b/htdocs/supplier_proposal/list.php index efd0ae16647..56f8df0f825 100644 --- a/htdocs/supplier_proposal/list.php +++ b/htdocs/supplier_proposal/list.php @@ -553,8 +553,8 @@ if ($result) print ''; // Check boxes print ''; - $searchpitco=$form->showFilterButtons(); - print $searchpitco; + $searchpicto=$form->showFilterButtons(); + print $searchpicto; print ''; print "\n"; From 4dc7d5cd8d2ee6d1320ae634a77005a878b32a83 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sun, 14 May 2017 21:20:35 +0200 Subject: [PATCH 126/299] Fix : tooltip on bank in customer invoice card --- htdocs/compta/facture/card.php | 14 ++++++++++++-- htdocs/modulebuilder/skeletons/skeleton_list.php | 4 ++-- htdocs/product/canvas/product/tpl/list.tpl.php | 4 ++-- htdocs/product/canvas/service/tpl/list.tpl.php | 4 ++-- htdocs/product/stock/list.php | 4 ++-- htdocs/product/stock/mouvement.php | 4 ++-- htdocs/product/stock/productlot_list.php | 4 ++-- htdocs/product/stock/replenish.php | 4 ++-- htdocs/product/stock/replenishorders.php | 4 ++-- htdocs/projet/activity/perday.php | 4 ++-- htdocs/projet/activity/perweek.php | 4 ++-- htdocs/projet/tasks/list.php | 4 ++-- htdocs/projet/tasks/time.php | 4 ++-- htdocs/user/hierarchy.php | 4 ++-- htdocs/user/index.php | 4 ++-- htdocs/variants/combinations.php | 4 ++-- 16 files changed, 42 insertions(+), 32 deletions(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 6f7f4d84879..9525f63b722 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -59,6 +59,9 @@ require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php'; if (!empty($conf->variants->enabled)) { require_once DOL_DOCUMENT_ROOT.'/variants/class/ProductCombination.class.php'; } +if (! empty($conf->accounting->enabled)) { + require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingjournal.class.php'; +} $langs->load('bills'); $langs->load('companies'); @@ -3685,7 +3688,7 @@ else if ($id > 0 || ! empty($ref)) $sql = 'SELECT p.datep as dp, p.ref, p.num_paiement, p.rowid, p.fk_bank,'; $sql .= ' c.code as payment_code, c.libelle as payment_label,'; $sql .= ' pf.amount,'; - $sql .= ' ba.rowid as baid, ba.ref as baref, ba.label'; + $sql .= ' ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.fk_accountancy_journal'; $sql .= ' FROM ' . MAIN_DB_PREFIX . 'c_paiement as c, ' . MAIN_DB_PREFIX . 'paiement_facture as pf, ' . MAIN_DB_PREFIX . 'paiement as p'; $sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'bank as b ON p.fk_bank = b.rowid'; $sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'bank_account as ba ON b.fk_account = ba.rowid'; @@ -3717,7 +3720,14 @@ else if ($id > 0 || ! empty($ref)) $bankaccountstatic->id = $objp->baid; $bankaccountstatic->ref = $objp->baref; $bankaccountstatic->label = $objp->baref; - print ''; + $bankaccountstatic->number = $objp->banumber; + $bankaccountstatic->account_number = $objp->account_number; + + $accountingjournal = new AccountingJournal($db); + $accountingjournal->fetch($objp->fk_accountancy_journal); + $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0,1,1,'',1); + + print ''; if ($bankaccountstatic->id) print $bankaccountstatic->getNomUrl(1, 'transactions'); print ''; diff --git a/htdocs/modulebuilder/skeletons/skeleton_list.php b/htdocs/modulebuilder/skeletons/skeleton_list.php index 51158664889..205fcf4be8c 100644 --- a/htdocs/modulebuilder/skeletons/skeleton_list.php +++ b/htdocs/modulebuilder/skeletons/skeleton_list.php @@ -420,8 +420,8 @@ if (! empty($arrayfields['t.tms']['checked'])) }*/ // Action column print ''; -$searchpitco=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); -print $searchpitco; +$searchpicto=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); +print $searchpicto; print ''; print ''."\n"; diff --git a/htdocs/product/canvas/product/tpl/list.tpl.php b/htdocs/product/canvas/product/tpl/list.tpl.php index ad00d75259e..db7cac7e51c 100644 --- a/htdocs/product/canvas/product/tpl/list.tpl.php +++ b/htdocs/product/canvas/product/tpl/list.tpl.php @@ -71,8 +71,8 @@ '; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; } else { ?>   diff --git a/htdocs/product/canvas/service/tpl/list.tpl.php b/htdocs/product/canvas/service/tpl/list.tpl.php index a7efe4f86ba..ee2a894de98 100644 --- a/htdocs/product/canvas/service/tpl/list.tpl.php +++ b/htdocs/product/canvas/service/tpl/list.tpl.php @@ -71,8 +71,8 @@ '; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; } else { ?>   diff --git a/htdocs/product/stock/list.php b/htdocs/product/stock/list.php index 78b5b612da1..b3361f0b328 100644 --- a/htdocs/product/stock/list.php +++ b/htdocs/product/stock/list.php @@ -168,8 +168,8 @@ if ($result) print ''; print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print ''; diff --git a/htdocs/product/stock/mouvement.php b/htdocs/product/stock/mouvement.php index bc4099f66ec..82a85ae83b0 100644 --- a/htdocs/product/stock/mouvement.php +++ b/htdocs/product/stock/mouvement.php @@ -861,8 +861,8 @@ if ($resql) } // Actions print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; print ''; print "\n"; diff --git a/htdocs/product/stock/productlot_list.php b/htdocs/product/stock/productlot_list.php index d8879d1fa28..df97621c07b 100644 --- a/htdocs/product/stock/productlot_list.php +++ b/htdocs/product/stock/productlot_list.php @@ -399,8 +399,8 @@ if ($resql) }*/ // Action column print ''; - $searchpitco=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); + print $searchpicto; print ''; print ''."\n"; diff --git a/htdocs/product/stock/replenish.php b/htdocs/product/stock/replenish.php index fabfe736683..1a3d7c9edb2 100644 --- a/htdocs/product/stock/replenish.php +++ b/htdocs/product/stock/replenish.php @@ -513,8 +513,8 @@ print '' . $langs->trans('AlertOnly') . '& print '' . $langs->trans('Draft') . ' '; print ' '; print ''; -$searchpitco=$form->showFilterAndCheckAddButtons(0); -print $searchpitco; +$searchpicto=$form->showFilterAndCheckAddButtons(0); +print $searchpicto; print ''; print ''; diff --git a/htdocs/product/stock/replenishorders.php b/htdocs/product/stock/replenishorders.php index 8967fd672d6..d190c4d704d 100644 --- a/htdocs/product/stock/replenishorders.php +++ b/htdocs/product/stock/replenishorders.php @@ -179,8 +179,8 @@ if ($resql) $form->select_date('', 'search_date', 0, 0, 1, '', 1, 0, 1, 0, ''). ''. ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons(0); + print $searchpicto; ''. ''; diff --git a/htdocs/projet/activity/perday.php b/htdocs/projet/activity/perday.php index c1aa8aaa469..4c57b45ed50 100644 --- a/htdocs/projet/activity/perday.php +++ b/htdocs/projet/activity/perday.php @@ -421,8 +421,8 @@ print ''; print ''; // Action column print ''; -$searchpitco=$form->showFilterAndCheckAddButtons(0); -print $searchpitco; +$searchpicto=$form->showFilterAndCheckAddButtons(0); +print $searchpicto; print ''; print "\n"; diff --git a/htdocs/projet/activity/perweek.php b/htdocs/projet/activity/perweek.php index 905b93393dd..5720c71b88c 100644 --- a/htdocs/projet/activity/perweek.php +++ b/htdocs/projet/activity/perweek.php @@ -417,8 +417,8 @@ for($i=0;$i<7;$i++) } // Action column print ''; -$searchpitco=$form->showFilterAndCheckAddButtons(0); -print $searchpitco; +$searchpicto=$form->showFilterAndCheckAddButtons(0); +print $searchpicto; print ''; print "\n"; diff --git a/htdocs/projet/tasks/list.php b/htdocs/projet/tasks/list.php index 8579d436d71..d739324716a 100644 --- a/htdocs/projet/tasks/list.php +++ b/htdocs/projet/tasks/list.php @@ -579,8 +579,8 @@ if (! empty($arrayfields['t.tms']['checked'])) } // Action column print ''; -$searchpitco=$form->showFilterButtons(); -print $searchpitco; +$searchpicto=$form->showFilterButtons(); +print $searchpicto; print ''; print "\n"; diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index eed7bae2734..dab06bbda74 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -776,8 +776,8 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) print $hookmanager->resPrint; // Action column print ''; - $searchpitco=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); - print $searchpitco; + $searchpicto=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); + print $searchpicto; print ''; print ''."\n"; diff --git a/htdocs/user/hierarchy.php b/htdocs/user/hierarchy.php index ef5380e9678..9e7f6583f6e 100644 --- a/htdocs/user/hierarchy.php +++ b/htdocs/user/hierarchy.php @@ -153,8 +153,8 @@ print ''; print $form->selectarray('search_statut', array('-1'=>'','1'=>$langs->trans('Enabled')),$search_statut); print ''; print ''; -$searchpitco=$form->showFilterAndCheckAddButtons(0); -print $searchpitco; +$searchpicto=$form->showFilterAndCheckAddButtons(0); +print $searchpicto; print ''; print ''; diff --git a/htdocs/user/index.php b/htdocs/user/index.php index 9592eed863f..04acb9b56f7 100644 --- a/htdocs/user/index.php +++ b/htdocs/user/index.php @@ -419,8 +419,8 @@ if (! empty($arrayfields['u.statut']['checked'])) } // Action column print ''; -$searchpitco=$form->showFilterAndCheckAddButtons(0); -print $searchpitco; +$searchpicto=$form->showFilterAndCheckAddButtons(0); +print $searchpicto; print ''; print "\n"; diff --git a/htdocs/variants/combinations.php b/htdocs/variants/combinations.php index 4342b352478..76a091ad8a2 100644 --- a/htdocs/variants/combinations.php +++ b/htdocs/variants/combinations.php @@ -638,8 +638,8 @@ if (! empty($id) || ! empty($ref)) '; - $searchpitco=$form->showCheckAddButtons('checkforselect', 1); - print $searchpitco; + $searchpicto=$form->showCheckAddButtons('checkforselect', 1); + print $searchpicto; print ''; ?> From b29d0385e68a5a89ac164610ad7687025acb500a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 15 May 2017 00:15:56 +0200 Subject: [PATCH 127/299] NEW Can send an email to a user from its card. --- htdocs/core/actions_sendmails.inc.php | 5 +- htdocs/core/class/CMailFile.class.php | 5 + htdocs/core/class/html.formmail.class.php | 4 +- htdocs/user/card.php | 1034 ++++++++++++--------- 4 files changed, 592 insertions(+), 456 deletions(-) diff --git a/htdocs/core/actions_sendmails.inc.php b/htdocs/core/actions_sendmails.inc.php index d031f318eb9..cf50d05d6bf 100644 --- a/htdocs/core/actions_sendmails.inc.php +++ b/htdocs/core/actions_sendmails.inc.php @@ -116,6 +116,7 @@ if (($action == 'send' || $action == 'relance') && ! $_POST['addfile'] && ! $_PO if (method_exists($object,"fetch_thirdparty") && $object->element != 'societe') { $result=$object->fetch_thirdparty(); + if ($object->element == 'user' && $result == 0) $result=1; // Even if not found, we consider ok $thirdparty=$object->thirdparty; $sendtosocid=$thirdparty->id; } @@ -187,7 +188,7 @@ if (($action == 'send' || $action == 'relance') && ! $_POST['addfile'] && ! $_PO { $tmparray[] = $thirdparty->name.' <'.$thirdparty->email.'>'; } - else // Id du contact + elseif ($val) // Id du contact { $tmparray[] = $thirdparty->contact_get_property((int) $val,'email'); $sendtoid[] = $val; @@ -217,7 +218,7 @@ if (($action == 'send' || $action == 'relance') && ! $_POST['addfile'] && ! $_PO { $tmparray[] = $thirdparty->name.' <'.$thirdparty->email.'>'; } - else // Id du contact + elseif ($val) // Id du contact { $tmparray[] = $thirdparty->contact_get_property((int) $val,'email'); //$sendtoid[] = $val; TODO Add also id of contact in CC ? diff --git a/htdocs/core/class/CMailFile.class.php b/htdocs/core/class/CMailFile.class.php index 3da7f3abcf3..3b3efe96fb0 100644 --- a/htdocs/core/class/CMailFile.class.php +++ b/htdocs/core/class/CMailFile.class.php @@ -153,6 +153,11 @@ class CMailFile $this->error='ErrorSubjectIsRequired'; return; } + if (empty($msg)) + { + dol_syslog("CMailFile::CMailfile: Try to send an email with empty body"); + $msg='.'; // Avoid empty message (with empty message conten show a multipart structure) + } // Detect if message is HTML (use fast method) if ($msgishtml == -1) diff --git a/htdocs/core/class/html.formmail.class.php b/htdocs/core/class/html.formmail.class.php index 00262b99bb5..020382095a3 100644 --- a/htdocs/core/class/html.formmail.class.php +++ b/htdocs/core/class/html.formmail.class.php @@ -634,11 +634,11 @@ class FormMail extends Form if ($this->withtopicreadonly) { $out.= $defaulttopic; - $out.= ''; + $out.= ''; } else { - $out.= ''; + $out.= ''; } $out.= "\n"; } diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 3682088b552..cf6a1096a7b 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -592,6 +592,14 @@ if (empty($reshook)) { } } + // Actions to send emails + $actiontypecode='AC_OTH_AUTO'; + $trigger_name='USER_SENTBYMAIL'; + $paramname='id'; // Name of param key to open the card + $mode='emailfromuser'; + $trackid='use'.$object->id; + include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php'; + // Actions to build doc $upload_dir = $conf->user->dir_output; $permissioncreate=$user->rights->user->user->creer; @@ -1575,6 +1583,17 @@ else print '
'; + if (! empty($object->email)) + { + $langs->load("mails"); + print ''; + } + else + { + $langs->load("mails"); + print ''; + } + if ($caneditfield && (empty($conf->multicompany->enabled) || ! $user->entity || ($object->entity == $conf->entity) || ($conf->multicompany->transverse_mode && $conf->entity == 1))) { if (! empty($conf->global->MAIN_ONLY_LOGIN_ALLOWED)) @@ -1647,6 +1666,116 @@ else + //Select mail models is same action as presend + if (GETPOST('modelselected')) { + $action = 'presend'; + } + if ($action == 'presend') + { + /* + * Affiche formulaire mail + */ + + // By default if $action=='presend' + $titreform='SendMail'; + $topicmail=''; + $action='send'; + $modelmail='user'; + + print '
'; + print load_fiche_titre($langs->trans($titreform)); + + dol_fiche_head(); + + // Define output language + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && ! empty($_REQUEST['lang_id'])) + $newlang = $_REQUEST['lang_id']; + + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) + $newlang = $object->default_lang; + + // Cree l'objet formulaire mail + include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php'; + $formmail = new FormMail($db); + $formmail->param['langsmodels']=(empty($newlang)?$langs->defaultlang:$newlang); + $formmail->fromtype = (GETPOST('fromtype')?GETPOST('fromtype'):(!empty($conf->global->MAIN_MAIL_DEFAULT_FROMTYPE)?$conf->global->MAIN_MAIL_DEFAULT_FROMTYPE:'user')); + + if($formmail->fromtype === 'user'){ + $formmail->fromid = $user->id; + + } + $formmail->trackid='thi'.$object->id; + if (! empty($conf->global->MAIN_EMAIL_ADD_TRACK_ID) && ($conf->global->MAIN_EMAIL_ADD_TRACK_ID & 2)) // If bit 2 is set + { + include DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; + $formmail->frommail=dolAddEmailTrackId($formmail->frommail, 'thi'.$object->id); + } + $formmail->withfrom=1; + $formmail->withtopic=1; + $formmail->withto=GETPOST('sendto')?GETPOST('sendto'):$object->email; + $formmail->withtofree=1; + $formmail->withtocc=1; + $formmail->withtoccc=$conf->global->MAIN_EMAIL_USECCC; + $formmail->withfile=2; + $formmail->withbody=1; + $formmail->withdeliveryreceipt=1; + $formmail->withcancel=1; + // Tableau des substitutions + //$formmail->setSubstitFromObject($object); + $formmail->substit['__LASTNAME__']=$object->lastname; + $formmail->substit['__FIRSTNAME__']=$object->firstname; + $formmail->substit['__SIGNATURE__']=$user->signature; + $formmail->substit['__PERSONALIZED__']=''; + + //Find the good contact adress + /* + $custcontact=''; + $contactarr=array(); + $contactarr=$object->liste_contact(-1,'external'); + + if (is_array($contactarr) && count($contactarr)>0) + { + foreach($contactarr as $contact) + { + if ($contact['libelle']==$langs->trans('TypeContact_facture_external_BILLING')) { + + require_once DOL_DOCUMENT_ROOT . '/contact/class/contact.class.php'; + + $contactstatic=new Contact($db); + $contactstatic->fetch($contact['id']); + $custcontact=$contactstatic->getFullName($langs,1); + } + } + + if (!empty($custcontact)) { + $formmail->substit['__CONTACTCIVNAME__']=$custcontact; + } + }*/ + + + // Tableau des parametres complementaires du post + $formmail->param['action']=$action; + $formmail->param['models']=$modelmail; + $formmail->param['models_id']=GETPOST('modelmailselected','int'); + $formmail->param['socid']=$object->id; + $formmail->param['returnurl']=$_SERVER["PHP_SELF"].'?id='.$object->id; + + // Init list of files + if (GETPOST("mode")=='init') + { + $formmail->clear_attached_files(); + $formmail->add_attached_files($file,basename($file),dol_mimetype($file)); + } + print $formmail->get_form(); + + dol_fiche_end(); + } + } + + if (GETPOST('action') != 'presend' && GETPOST('action') != 'send') + { /* * List of groups of user */ @@ -1775,486 +1904,485 @@ else } print "
"; } - } - - /* - * Fiche en mode edition - */ - if ($action == 'edit' && ($canedituser || $caneditfield || $caneditpassword || ($user->id == $object->id))) - { - print '
'; - print ''; - print ''; - print ''; - - dol_fiche_head($head, 'user', $title, 0, 'user'); - - print ''; - - // Ref/ID - if (! empty($conf->global->MAIN_SHOW_TECHNICAL_ID)) - { - print ''; - print ''; - print ''; - } - - // Lastname - print ""; - print ''; - print ''; - print ''; - - // Firstname - print "".''; - print ''; - - // Employee - print ''; - print ''; - - // Position/Job - print ''; - print ''; - - // Gender - print ''; - print ''; - - // Login - print "".''; - print ''; - print ''; - - // Pass - print ''; - print '
'.$langs->trans("Ref").''; - print $object->id; - print '
'.$langs->trans("Lastname").''; - if ($caneditfield && !$object->ldap_sid) + + /* + * Fiche en mode edition + */ + if ($action == 'edit' && ($canedituser || $caneditfield || $caneditpassword || ($user->id == $object->id))) { - print ''; - } - else - { - print ''; - print $object->lastname; - } - print '
'.$langs->trans("Firstname").''; - if ($caneditfield && !$object->ldap_sid) - { - print ''; - } - else - { - print ''; - print $object->firstname; - } - print '
'.fieldLabel('Employee','employee',0).''; - print $form->selectyesno("employee",$object->employee,1); - print '
'.$langs->trans("PostOrFunction").''; - if ($caneditfield) - { - print ''; - } - else - { - print ''; - print $object->job; - } - print '
'.$langs->trans("Gender").''; - $arraygender=array('man'=>$langs->trans("Genderman"),'woman'=>$langs->trans("Genderwoman")); - print $form->selectarray('gender', $arraygender, GETPOST('gender')?GETPOST('gender'):$object->gender, 1); - print '
'.$langs->trans("Login").''; - if ($user->admin && !$object->ldap_sid) - { - print ''; - } - else - { - print ''; - print $object->login; - } - print '
'.$langs->trans("Password").''; - if ($object->ldap_sid) - { - $text=$langs->trans("DomainPassword"); - } - else if ($caneditpassword) - { - $text=''; - if ($dolibarr_main_authentication && $dolibarr_main_authentication == 'http') + print ''; + print ''; + print ''; + print ''; + + dol_fiche_head($head, 'user', $title, 0, 'user'); + + print ''; + + // Ref/ID + if (! empty($conf->global->MAIN_SHOW_TECHNICAL_ID)) + { + print ''; + print ''; + print ''; + } + + // Lastname + print ""; + print ''; + print '\n"; - - // API key - if(! empty($conf->api->enabled) && $user->admin) { - print ''; - print ''; - } - - // Administrator - print ''; - if ($object->societe_id > 0) - { - $langs->load("admin"); - print ''; - } - else - { - print ''; + print ''; + + // Firstname + print "".''; + print ''; + + // Employee + print ''; + print ''; + + // Position/Job + print ''; + print ''; + + // Gender + print ''; + print ''; + + // Login + print "".''; + print ''; + print ''; + + // Pass + print ''; + print '\n"; + + // API key + if(! empty($conf->api->enabled) && $user->admin) { + print ''; + print ''; + } + + // Administrator + print ''; + if ($object->societe_id > 0) + { + $langs->load("admin"); + print ''; + } + else + { + print ''; + } + + // Type + print ''; + print ''; + + // Address + print ''; + print ''; + + // Zip + print ''; - } - - // Type - print ''; - print ''; - - // Address - print ''; - print ''; - - // Zip - print ''; - - // Town - print ''; - - // Country - print ''; - - // State - if (empty($conf->global->USER_DISABLE_STATE)) - { - print ''; - } - - // Tel pro - print "".''; - print ''; - - // Tel mobile - print "".''; - print ''; - - // Fax - print "".''; - print ''; - - // Skype - if (! empty($conf->skype->enabled)) - { - print ''; + + // Country + print ''; + + // State + if (empty($conf->global->USER_DISABLE_STATE)) + { + print ''; + } + + // Tel pro + print "".''; print ''; - } - - // EMail - print "".'global->USER_MAIL_REQUIRED)?' class="fieldrequired"':'').'>'.$langs->trans("EMail").''; - print ''; - - // Signature - print "".''; - print ''; - - // OpenID url - if (isset($conf->file->main_authentication) && preg_match('/openid/',$conf->file->main_authentication) && ! empty($conf->global->MAIN_OPENIDURL_PERUSER)) - { - print "".''; + + // Tel mobile + print "".''; + print ''; + + // Fax + print "".''; + print ''; + + // Skype + if (! empty($conf->skype->enabled)) + { + print ''; + print ''; + } + + // EMail + print "".'global->USER_MAIL_REQUIRED)?' class="fieldrequired"':'').'>'.$langs->trans("EMail").''; + print ''; + + // Signature + print "".''; print ''; - } - - // Hierarchy - print ''; - print ''; - print "\n"; - - if (! empty($conf->salaries->enabled) && ! empty($user->rights->salaries->read)) - { - $langs->load("salaries"); - - // THM - print ''; - print ''; - print "\n"; - - // TJM - print ''; - print ''; - print "\n"; - - // Salary - print ''; - print ''; - print "\n"; - } - - // Weeklyhours - print ''; - print ''; - print "\n"; - - // Date employment - print ''; - print ''; - print "\n"; - - // Accountancy code - if ($conf->accounting->enabled) + + // OpenID url + if (isset($conf->file->main_authentication) && preg_match('/openid/',$conf->file->main_authentication) && ! empty($conf->global->MAIN_OPENIDURL_PERUSER)) + { + print "".''; + print ''; + } + + // Hierarchy + print ''; + print ''; + print "\n"; + + if (! empty($conf->salaries->enabled) && ! empty($user->rights->salaries->read)) + { + $langs->load("salaries"); + + // THM + print ''; + print ''; + print "\n"; + + // TJM + print ''; + print ''; + print "\n"; + + // Salary + print ''; + print ''; + print "\n"; + } + + // Weeklyhours + print ''; + print ''; + print "\n"; + + // Date employment + print ''; + print ''; + print "\n"; + + // Accountancy code + if ($conf->accounting->enabled) + { + print ""; + print ''; + print ''; + print ""; + } + + // User color + if (! empty($conf->agenda->enabled)) + { + print ''; + print ''; + } + + // Photo + print ''; + print ''; + print ''; + print ''; + + // Categories + if (!empty( $conf->categorie->enabled ) && !empty( $user->rights->categorie->lire )) { - print ""; - print ''; - print ''; - print ""; - } - - // User color - if (! empty($conf->agenda->enabled)) - { - print ''; - print ''; - } - - // Photo - print ''; - print ''; - print ''; - print ''; - - // Categories - if (!empty( $conf->categorie->enabled ) && !empty( $user->rights->categorie->lire )) - { - print ''; - print '"; - } + print ''; + print '"; + } // Status print ''; @@ -2373,6 +2501,8 @@ else print ''; + } + } if (! empty($conf->ldap->enabled) && ! empty($object->ldap_sid)) $ldap->close(); From becd023032f78b43c2818339c90f8ccd469ebdba Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Mon, 15 May 2017 05:11:00 +0200 Subject: [PATCH 128/299] Fix : tooltip on supplier invoice payment --- htdocs/compta/facture/card.php | 11 +++++++---- htdocs/fourn/facture/card.php | 15 +++++++++++++-- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 9525f63b722..023b2049ee9 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -3721,11 +3721,14 @@ else if ($id > 0 || ! empty($ref)) $bankaccountstatic->ref = $objp->baref; $bankaccountstatic->label = $objp->baref; $bankaccountstatic->number = $objp->banumber; - $bankaccountstatic->account_number = $objp->account_number; - $accountingjournal = new AccountingJournal($db); - $accountingjournal->fetch($objp->fk_accountancy_journal); - $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0,1,1,'',1); + if (! empty($conf->accounting->enabled)) { + $bankaccountstatic->account_number = $objp->account_number; + + $accountingjournal = new AccountingJournal($db); + $accountingjournal->fetch($objp->fk_accountancy_journal); + $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0,1,1,'',1); + } print ''; From 4d9016c49f9bc0738c4254888a12f945dd29c7b9 Mon Sep 17 00:00:00 2001 From: phf Date: Thu, 11 May 2017 09:53:23 +0200 Subject: [PATCH 129/299] Fix create propal form from propal with project id, fk_project is not used to init select project --- htdocs/commande/card.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index 8459a4a5e9e..93b4e8ec02b 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -1589,9 +1589,6 @@ if ($action == 'create' && $user->rights->commande->creer) // Project if (! empty($conf->projet->enabled) && $socid > 0) { - $projectid = GETPOST('projectid')?GETPOST('projectid'):0; - if ($origin == 'project') $projectid = ($originid ? $originid : 0); - $langs->load("projects"); print ''; print ''; print "\n"; print ''; -print ''."\n"; print '
'.$langs->trans("Ref").''; + print $object->id; + print '
'.$langs->trans("Lastname").''; + if ($caneditfield && !$object->ldap_sid) { - $text=$form->textwithpicto($text,$langs->trans("DolibarrInHttpAuthenticationSoPasswordUseless",$dolibarr_main_authentication),1,'warning'); + print ''; } - } - else - { - $text=preg_replace('/./i','*',$object->pass); - } - print $text; - print "
'.$langs->trans("ApiKey").''; - print ''; - if (! empty($conf->use_javascript_ajax)) - print ' '.img_picto($langs->trans('Generate'), 'refresh', 'id="generate_api_key" class="linkobject"'); - print '
'.$langs->trans("Administrator").''; - print ''.yn($object->admin); - print ' ('.$langs->trans("ExternalUser").')'; - print '
'; - $nbAdmin = $user->getNbOfUsers('active','',1); - $nbSuperAdmin = $user->getNbOfUsers('active','superadmin',1); - //var_dump($nbAdmin); - //var_dump($nbSuperAdmin); - if ($user->admin // Need to be admin to allow downgrade of an admin - && ($user->id != $object->id) // Don't downgrade ourself - && ( - (empty($conf->multicompany->enabled) && $nbAdmin >= 1) - || (! empty($conf->multicompany->enabled) && ($object->entity > 0 || $nbSuperAdmin > 1)) // Don't downgrade a superadmin if alone - ) - ) + else { - print $form->selectyesno('admin',$object->admin,1); - - if (! empty($conf->multicompany->enabled) && ! $user->entity && empty($conf->multicompany->transverse_mode)) + print ''; + print $object->lastname; + } + print '
'.$langs->trans("Firstname").''; + if ($caneditfield && !$object->ldap_sid) + { + print ''; + } + else + { + print ''; + print $object->firstname; + } + print '
'.fieldLabel('Employee','employee',0).''; + print $form->selectyesno("employee",$object->employee,1); + print '
'.$langs->trans("PostOrFunction").''; + if ($caneditfield) + { + print ''; + } + else + { + print ''; + print $object->job; + } + print '
'.$langs->trans("Gender").''; + $arraygender=array('man'=>$langs->trans("Genderman"),'woman'=>$langs->trans("Genderwoman")); + print $form->selectarray('gender', $arraygender, GETPOST('gender')?GETPOST('gender'):$object->gender, 1); + print '
'.$langs->trans("Login").''; + if ($user->admin && !$object->ldap_sid) + { + print ''; + } + else + { + print ''; + print $object->login; + } + print '
'.$langs->trans("Password").''; + if ($object->ldap_sid) + { + $text=$langs->trans("DomainPassword"); + } + else if ($caneditpassword) + { + $text=''; + if ($dolibarr_main_authentication && $dolibarr_main_authentication == 'http') { - if ($conf->use_javascript_ajax) - { - print ''; - } - - $checked=(($object->admin && ! $object->entity) ? ' checked' : ''); - print ' '.$langs->trans("SuperAdministrator"); + $text=$form->textwithpicto($text,$langs->trans("DolibarrInHttpAuthenticationSoPasswordUseless",$dolibarr_main_authentication),1,'warning'); } } else { - $yn = yn($object->admin); - print ''; - print ''; - if (! empty($conf->multicompany->enabled) && empty($object->entity)) print $form->textwithpicto($yn,$langs->trans("DontDowngradeSuperAdmin"),1,'warning'); - else print $yn; + $text=preg_replace('/./i','*',$object->pass); } + print $text; + print "
'.$langs->trans("ApiKey").''; + print ''; + if (! empty($conf->use_javascript_ajax)) + print ' '.img_picto($langs->trans('Generate'), 'refresh', 'id="generate_api_key" class="linkobject"'); + print '
'.$langs->trans("Administrator").''; + print ''.yn($object->admin); + print ' ('.$langs->trans("ExternalUser").')'; + print '
'; + $nbAdmin = $user->getNbOfUsers('active','',1); + $nbSuperAdmin = $user->getNbOfUsers('active','superadmin',1); + //var_dump($nbAdmin); + //var_dump($nbSuperAdmin); + if ($user->admin // Need to be admin to allow downgrade of an admin + && ($user->id != $object->id) // Don't downgrade ourself + && ( + (empty($conf->multicompany->enabled) && $nbAdmin >= 1) + || (! empty($conf->multicompany->enabled) && ($object->entity > 0 || $nbSuperAdmin > 1)) // Don't downgrade a superadmin if alone + ) + ) + { + print $form->selectyesno('admin',$object->admin,1); + + if (! empty($conf->multicompany->enabled) && ! $user->entity && empty($conf->multicompany->transverse_mode)) + { + if ($conf->use_javascript_ajax) + { + print ''; + } + + $checked=(($object->admin && ! $object->entity) ? ' checked' : ''); + print ' '.$langs->trans("SuperAdministrator"); + } + } + else + { + $yn = yn($object->admin); + print ''; + print ''; + if (! empty($conf->multicompany->enabled) && empty($object->entity)) print $form->textwithpicto($yn,$langs->trans("DontDowngradeSuperAdmin"),1,'warning'); + else print $yn; + } + print '
'.$langs->trans("Type").''; + if ($user->id == $object->id || ! $user->admin) + { + $type=$langs->trans("Internal"); + if ($object->societe_id) $type=$langs->trans("External"); + print $form->textwithpicto($type,$langs->trans("InternalExternalDesc")); + if ($object->ldap_sid) print ' ('.$langs->trans("DomainUser").')'; + } + else + { + $type=0; + if ($object->contact_id) $type=$object->contact_id; + print $form->selectcontacts(0,$type,'contactid',2,'','',1,'',false,1); + if ($object->ldap_sid) print ' ('.$langs->trans("DomainUser").')'; + } + print '
'.fieldLabel('Address','address').'
'.fieldLabel('Zip','zipcode').''; + print $formcompany->select_ziptown($object->zip, 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6); print '
'.$langs->trans("Type").''; - if ($user->id == $object->id || ! $user->admin) - { - $type=$langs->trans("Internal"); - if ($object->societe_id) $type=$langs->trans("External"); - print $form->textwithpicto($type,$langs->trans("InternalExternalDesc")); - if ($object->ldap_sid) print ' ('.$langs->trans("DomainUser").')'; - } - else - { - $type=0; - if ($object->contact_id) $type=$object->contact_id; - print $form->selectcontacts(0,$type,'contactid',2,'','',1,'',false,1); - if ($object->ldap_sid) print ' ('.$langs->trans("DomainUser").')'; - } - print '
'.fieldLabel('Address','address').'
'.fieldLabel('Zip','zipcode').''; - print $formcompany->select_ziptown($object->zip, 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6); - print '
'.fieldLabel('Town','town').''; - print $formcompany->select_ziptown($object->town, 'town', array('zipcode', 'selectcountry_id', 'state_id')); - print '
'.fieldLabel('Country','selectcounty_id').''; - print $form->select_country((GETPOST('country_id')!=''?GETPOST('country_id'):$object->country_id),'country_id'); - if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); - print '
'.fieldLabel('State','state_id').''; - print $formcompany->select_state($object->state_id,$object->country_code, 'state_id'); + + // Town + print '
'.fieldLabel('Town','town').''; + print $formcompany->select_ziptown($object->town, 'town', array('zipcode', 'selectcountry_id', 'state_id')); print '
'.$langs->trans("PhonePro").''; - if ($caneditfield && empty($object->ldap_sid)) - { - print ''; - } - else - { - print ''; - print $object->office_phone; - } - print '
'.$langs->trans("PhoneMobile").''; - if ($caneditfield && empty($object->ldap_sid)) - { - print ''; - } - else - { - print ''; - print $object->user_mobile; - } - print '
'.$langs->trans("Fax").''; - if ($caneditfield && empty($object->ldap_sid)) - { - print ''; - } - else - { - print ''; - print $object->office_fax; - } - print '
'.$langs->trans("Skype").'
'.fieldLabel('Country','selectcounty_id').''; + print $form->select_country((GETPOST('country_id')!=''?GETPOST('country_id'):$object->country_id),'country_id'); + if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); + print '
'.fieldLabel('State','state_id').''; + print $formcompany->select_state($object->state_id,$object->country_code, 'state_id'); + print '
'.$langs->trans("PhonePro").''; if ($caneditfield && empty($object->ldap_sid)) { - print ''; + print ''; } else { - print ''; - print $object->skype; + print ''; + print $object->office_phone; } print '
'; - if ($caneditfield && empty($object->ldap_sid)) - { - print ''; - } - else - { - print ''; - print $object->email; - } - print '
'.$langs->trans("Signature").''; - if ($caneditfield) - { - require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; - $doleditor=new DolEditor('signature',$object->signature,'',138,'dolibarr_mailings','In',false,true,empty($conf->global->FCKEDITOR_ENABLE_USERSIGN)?0:1,ROWS_4,'90%'); - print $doleditor->Create(1); - } - else - { - print dol_htmlentitiesbr($object->signature); - } - print '
'.$langs->trans("OpenIDURL").'
'.$langs->trans("PhoneMobile").''; + if ($caneditfield && empty($object->ldap_sid)) + { + print ''; + } + else + { + print ''; + print $object->user_mobile; + } + print '
'.$langs->trans("Fax").''; + if ($caneditfield && empty($object->ldap_sid)) + { + print ''; + } + else + { + print ''; + print $object->office_fax; + } + print '
'.$langs->trans("Skype").''; + if ($caneditfield && empty($object->ldap_sid)) + { + print ''; + } + else + { + print ''; + print $object->skype; + } + print '
'; + if ($caneditfield && empty($object->ldap_sid)) + { + print ''; + } + else + { + print ''; + print $object->email; + } + print '
'.$langs->trans("Signature").''; if ($caneditfield) { - print ''; + require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; + $doleditor=new DolEditor('signature',$object->signature,'',138,'dolibarr_mailings','In',false,true,empty($conf->global->FCKEDITOR_ENABLE_USERSIGN)?0:1,ROWS_4,'90%'); + print $doleditor->Create(1); } else - { - print ''; - print $object->openid; + { + print dol_htmlentitiesbr($object->signature); } print '
'.$langs->trans("HierarchicalResponsible").''; - if ($caneditfield) - { - print $form->select_dolusers($object->fk_user, 'fk_user', 1, array($object->id), 0, '', 0, $object->entity, 0, 0, '', 0, '', 'maxwidth300'); - } - else - { - print ''; - $huser=new User($db); - $huser->fetch($object->fk_user); - print $huser->getNomUrl(1); - } - print '
'; - $text=$langs->trans("THM"); - print $form->textwithpicto($text, $langs->trans("THMDescription"), 1, 'help', 'classthm'); - print ''; - print ''; - print '
'; - $text=$langs->trans("TJM"); - print $form->textwithpicto($text, $langs->trans("TJMDescription"), 1, 'help', 'classthm'); - print ''; - print ''; - print '
'.$langs->trans("Salary").''; - print ''; - print '
'.$langs->trans("WeeklyHours").''; - print ''; - print '
'.$langs->trans("DateEmployment").''; - echo $form->select_date(GETPOST('dateemployment')?GETPOST('dateemployment'):$object->dateemployment,'dateemployment',0,0,1,'form'.'dateemployment',1,0,1); - print '
'.$langs->trans("OpenIDURL").''; + if ($caneditfield) + { + print ''; + } + else + { + print ''; + print $object->openid; + } + print '
'.$langs->trans("HierarchicalResponsible").''; + if ($caneditfield) + { + print $form->select_dolusers($object->fk_user, 'fk_user', 1, array($object->id), 0, '', 0, $object->entity, 0, 0, '', 0, '', 'maxwidth300'); + } + else + { + print ''; + $huser=new User($db); + $huser->fetch($object->fk_user); + print $huser->getNomUrl(1); + } + print '
'; + $text=$langs->trans("THM"); + print $form->textwithpicto($text, $langs->trans("THMDescription"), 1, 'help', 'classthm'); + print ''; + print ''; + print '
'; + $text=$langs->trans("TJM"); + print $form->textwithpicto($text, $langs->trans("TJMDescription"), 1, 'help', 'classthm'); + print ''; + print ''; + print '
'.$langs->trans("Salary").''; + print ''; + print '
'.$langs->trans("WeeklyHours").''; + print ''; + print '
'.$langs->trans("DateEmployment").''; + echo $form->select_date(GETPOST('dateemployment')?GETPOST('dateemployment'):$object->dateemployment,'dateemployment',0,0,1,'form'.'dateemployment',1,0,1); + print '
'.$langs->trans("AccountancyCode").''; + if ($caneditfield) + { + print ''; + } + else + { + print ''; + print $object->accountancy_code; + } + print '
'.$langs->trans("ColorUser").''; + print $formother->selectColor(GETPOST('color')?GETPOST('color'):$object->color, 'color', null, 1, '', 'hideifnotset'); + print '
'.$langs->trans("Photo").''; + print $form->showphoto('userphoto',$object,60,0,$caneditfield,'photowithmargin','small'); + print '
'.$langs->trans("AccountancyCode").''; - if ($caneditfield) - { - print ''; - } - else - { - print ''; - print $object->accountancy_code; - } - print '
'.$langs->trans("ColorUser").''; - print $formother->selectColor(GETPOST('color')?GETPOST('color'):$object->color, 'color', null, 1, '', 'hideifnotset'); - print '
'.$langs->trans("Photo").''; - print $form->showphoto('userphoto',$object,60,0,$caneditfield,'photowithmargin','small'); - print '
' . fieldLabel( 'Categories', 'usercats' ) . ''; - $cate_arbo = $form->select_all_categories( Categorie::TYPE_CONTACT, null, null, null, null, 1 ); - $c = new Categorie( $db ); - $cats = $c->containing($object->id, Categorie::TYPE_USER); - foreach ($cats as $cat) { - $arrayselected[] = $cat->id; - } - print $form->multiselectarray( 'usercats', $cate_arbo, $arrayselected, '', 0, '', 0, '90%' ); - print "
' . fieldLabel( 'Categories', 'usercats' ) . ''; + $cate_arbo = $form->select_all_categories( Categorie::TYPE_CONTACT, null, null, null, null, 1 ); + $c = new Categorie( $db ); + $cats = $c->containing($object->id, Categorie::TYPE_USER); + foreach ($cats as $cat) { + $arrayselected[] = $cat->id; + } + print $form->multiselectarray( 'usercats', $cate_arbo, $arrayselected, '', 0, '', 0, '90%' ); + print "
'.$langs->trans("Status").''; if ($bankaccountstatic->id) diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index f930ad87979..838e5cf25c0 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -8,7 +8,7 @@ * Copyright (C) 2013-2015 Philippe Grand * Copyright (C) 2013 Florian Henry * Copyright (C) 2014-2016 Marcos García - * Copyright (C) 2016 Alexandre Spangaro + * Copyright (C) 2016-2017 Alexandre Spangaro * * 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 @@ -49,6 +49,7 @@ if (!empty($conf->projet->enabled)) { if (!empty($conf->variants->enabled)) { require_once DOL_DOCUMENT_ROOT.'/variants/class/ProductCombination.class.php'; } +if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingjournal.class.php'; $langs->load('bills'); @@ -2317,7 +2318,7 @@ else $sql = 'SELECT p.datep as dp, p.ref, p.num_paiement, p.rowid, p.fk_bank,'; $sql.= ' c.id as paiement_type,'; $sql.= ' pf.amount,'; - $sql.= ' ba.rowid as baid, ba.ref as baref, ba.label'; + $sql.= ' ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.fk_accountancy_journal'; $sql.= ' FROM '.MAIN_DB_PREFIX.'paiementfourn as p'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank as b ON p.fk_bank = b.rowid'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'bank_account as ba ON b.fk_account = ba.rowid'; @@ -2365,6 +2366,16 @@ else $bankaccountstatic->id=$objp->baid; $bankaccountstatic->ref=$objp->baref; $bankaccountstatic->label=$objp->baref; + $bankaccountstatic->number = $objp->banumber; + + if (! empty($conf->accounting->enabled)) { + $bankaccountstatic->account_number = $objp->account_number; + + $accountingjournal = new AccountingJournal($db); + $accountingjournal->fetch($objp->fk_accountancy_journal); + $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0,1,1,'',1); + } + print ''; if ($objp->baid > 0) print $bankaccountstatic->getNomUrl(1,'transactions'); print '
' . $langs->trans("Project") . ''; From d120a391f9ac4f6b617e7d95883647d1657021dd Mon Sep 17 00:00:00 2001 From: phf Date: Mon, 15 May 2017 10:26:40 +0200 Subject: [PATCH 130/299] Fix use $numlines instead $i --- htdocs/compta/facture/card.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 06b64d02da6..91f64dc8693 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -1084,9 +1084,9 @@ if (empty($reshook)) } if ($totalamount != 0) { - $i = $i > 0 ? $i-1 : 0; - $tva_tx = $lines[$i]->tva_tx; - if (! empty($lines[$i]->vat_src_code) && ! preg_match('/\(/', $tva_tx)) $tva_tx .= ' ('.$lines[$i]->vat_src_code.')'; + if ($numlines > 0) $numlines = $numlines-1; + $tva_tx = $lines[$numlines]->tva_tx; + if (! empty($lines[$numlines]->vat_src_code) && ! preg_match('/\(/', $tva_tx)) $tva_tx .= ' ('.$lines[$numlines]->vat_src_code.')'; $amountdeposit[$tva_tx] = ($totalamount * $valuedeposit) / 100; } else { $amountdeposit[0] = 0; From b3245fb4557d1e7da0b851f4293ead067eb6ef9c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 15 May 2017 10:27:21 +0200 Subject: [PATCH 131/299] NEW Include an hourglass icon when we click on online payment button --- htdocs/paypal/admin/paypal.php | 2 +- htdocs/public/paypal/newpayment.php | 20 +++- htdocs/public/stripe/newpayment.php | 156 ++++++++++++++------------- htdocs/stripe/admin/stripe.php | 7 +- htdocs/theme/common/dolibarr_box.png | Bin 31433 -> 34121 bytes htdocs/theme/eldy/style.css.php | 6 +- htdocs/theme/md/style.css.php | 6 +- 7 files changed, 101 insertions(+), 96 deletions(-) diff --git a/htdocs/paypal/admin/paypal.php b/htdocs/paypal/admin/paypal.php index 2d0be83c80d..4c3dd2d961e 100644 --- a/htdocs/paypal/admin/paypal.php +++ b/htdocs/paypal/admin/paypal.php @@ -141,7 +141,7 @@ print ''.$langs->trans("Value").'
'; +print ''; print $langs->trans("PaypalLiveEnabled").''; if (empty($conf->global->PAYPAL_API_SANDBOX)) { diff --git a/htdocs/public/paypal/newpayment.php b/htdocs/public/paypal/newpayment.php index 08bf0c4faed..5be4e49f232 100644 --- a/htdocs/public/paypal/newpayment.php +++ b/htdocs/public/paypal/newpayment.php @@ -276,7 +276,7 @@ $paramcreditor='PAYPAL_CREDITOR_'.$suffix; if (! empty($conf->global->$paramcreditor)) $creditor=$conf->global->$paramcreditor; else if (! empty($conf->global->PAYPAL_CREDITOR)) $creditor=$conf->global->PAYPAL_CREDITOR; -print ''."\n"; +print ''."\n"; print '
'."\n"; print ''."\n"; print ''."\n"; @@ -969,12 +969,13 @@ if ($found && ! $error) // We are in a management option and no error if ($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY == 'integral') { - print '
'; + print '
'; } if ($conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY == 'paypalonly') { - print '
'; + print '
'; } + print ''; } else { @@ -986,9 +987,22 @@ print '
'."\n"; print ''."\n"; print ''."\n"; + + +print ''; + + print '
'; + htmlPrintOnlinePaymentFooter($mysoc,$langs); llxFooter('', 'public'); diff --git a/htdocs/public/stripe/newpayment.php b/htdocs/public/stripe/newpayment.php index 64ea70cfbeb..a430baafb59 100644 --- a/htdocs/public/stripe/newpayment.php +++ b/htdocs/public/stripe/newpayment.php @@ -90,8 +90,8 @@ if (! $action) //$urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file $urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current -$urlok=$urlwithroot.'/public/paypal/paymentok.php?'; -$urlko=$urlwithroot.'/public/paypal/paymentko.php?'; +$urlok=$urlwithroot.'/public/stripe/paymentok.php?'; +$urlko=$urlwithroot.'/public/stripe/paymentko.php?'; // Complete urls for post treatment $SOURCE=GETPOST("source",'alpha'); @@ -1119,8 +1119,8 @@ if (preg_match('/^dopayment/',$action))
- - + +
@@ -1131,82 +1131,84 @@ if (preg_match('/^dopayment/',$action)) '; + print ''; } diff --git a/htdocs/stripe/admin/stripe.php b/htdocs/stripe/admin/stripe.php index 056e43690b2..f135927b28a 100644 --- a/htdocs/stripe/admin/stripe.php +++ b/htdocs/stripe/admin/stripe.php @@ -134,7 +134,7 @@ print ''.$langs->trans("Value").''; print "\n"; print ''; -print ''; +print ''; print $langs->trans("StripeLiveEnabled").''; if (!empty($conf->global->STRIPE_LIVE)) { @@ -229,7 +229,7 @@ $token=''; // Url list print ''.$langs->trans("FollowingUrlAreAvailableToMakePayments").':
'; print img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePaymentOnFreeAmount",$servicename).':
'; -print ''.getStripePaymentUrl(1,'free')."

\n"; +print ''.getStripePaymentUrl(1,'free')."
\n"; if (! empty($conf->commande->enabled)) { print img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePaymentOnOrder",$servicename).':
'; @@ -250,7 +250,6 @@ if (! empty($conf->commande->enabled)) } print ''; } - print '
'; } if (! empty($conf->facture->enabled)) { @@ -272,7 +271,6 @@ if (! empty($conf->facture->enabled)) } print ''; } - print '
'; } if (! empty($conf->contrat->enabled)) { @@ -294,7 +292,6 @@ if (! empty($conf->contrat->enabled)) } print ''; } - print '
'; } if (! empty($conf->adherent->enabled)) { diff --git a/htdocs/theme/common/dolibarr_box.png b/htdocs/theme/common/dolibarr_box.png index 074b41951badb0f25e1f06b8c0c3d6b43a21f8df..69595524187aecf0831e12606a8a43d7c0fce971 100644 GIT binary patch literal 34121 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 Hu0mjf6-o*L literal 31433 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

|Epti)GR)Y#rjPZ3=c9 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 diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index a8e7729f31b..80edfc6fea9 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -3264,7 +3264,7 @@ div.visible { display: block; } -div.hidden { +div.hidden, td.hidden, img.hidden { display: none; } @@ -3272,10 +3272,6 @@ tr.visible { display: block; } -td.hidden { - display: none; -} - /* ============================================================================== */ /* Module website */ diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 5c96fa501ae..36e2dc4e6f3 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -3362,7 +3362,7 @@ div.visible { display: block; } -div.hidden { +div.hidden, td.hidden, img.hidden { display: none; } @@ -3370,10 +3370,6 @@ tr.visible { display: block; } -td.hidden { - display: none; -} - /* ============================================================================== */ /* Module website */ From f2aa0ea48837fb9517d03f6ff99d42d86a105f31 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 15 May 2017 10:39:14 +0200 Subject: [PATCH 132/299] Look and feel v6 --- htdocs/paybox/admin/paybox.php | 3 +-- htdocs/paypal/admin/paypal.php | 8 ++++---- htdocs/stripe/admin/stripe.php | 9 ++++++--- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/htdocs/paybox/admin/paybox.php b/htdocs/paybox/admin/paybox.php index ffbc2e41e0c..56a8482fcfc 100644 --- a/htdocs/paybox/admin/paybox.php +++ b/htdocs/paybox/admin/paybox.php @@ -212,7 +212,7 @@ print ''; print '

'; -print ''.$langs->trans("FollowingUrlAreAvailableToMakePayments").':
'; +print ''.$langs->trans("FollowingUrlAreAvailableToMakePayments").':

'; print img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePaymentOnFreeAmount",$servicename).':
'; print ''.DOL_MAIN_URL_ROOT.'/public/paybox/newpayment.php?amount=9.99&tag=your_free_tag'."
\n"; if (! empty($conf->commande->enabled)) @@ -237,7 +237,6 @@ if (! empty($conf->adherent->enabled)) print ''.DOL_MAIN_URL_ROOT.'/public/paybox/newpayment.php?source=membersubscription&ref=member_ref'."
\n"; } -print "
"; print info_admin($langs->trans("YouCanAddTagOnUrl")); llxFooter(); diff --git a/htdocs/paypal/admin/paypal.php b/htdocs/paypal/admin/paypal.php index 4c3dd2d961e..cc83dc10fab 100644 --- a/htdocs/paypal/admin/paypal.php +++ b/htdocs/paypal/admin/paypal.php @@ -175,7 +175,7 @@ print '
'.$langs->trans("Example").': ASsqXEmw4KzmX-CPChWSVDNCNfd.A3YNR7uz-Vn print ''; -print ''; +print ''; print $langs->trans("PAYPAL_SSLVERSION").''; print $form->selectarray("PAYPAL_SSLVERSION",array('1'=> $langs->trans('TLSv1'),'6'=> $langs->trans('TLSv1.2')),$conf->global->PAYPAL_SSLVERSION); print ''; @@ -187,7 +187,7 @@ print ''.$langs->trans("Value").''; print "\n"; -print ''; +print ''; print $langs->trans("PAYPAL_API_INTEGRAL_OR_PAYPALONLY").''; print $form->selectarray("PAYPAL_API_INTEGRAL_OR_PAYPALONLY",array('integral'=> $langs->trans('PaypalModeIntegral'),'paypalonly'=> $langs->trans('PaypalModeOnlyPaypal')),$conf->global->PAYPAL_API_INTEGRAL_OR_PAYPALONLY); print ''; @@ -296,7 +296,7 @@ $token=''; // Url list -print ''.$langs->trans("FollowingUrlAreAvailableToMakePayments").':
'; +print ''.$langs->trans("FollowingUrlAreAvailableToMakePayments").':

'; print img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePaymentOnFreeAmount",$servicename).':
'; print ''.getPaypalPaymentUrl(1,'free')."

\n"; if (! empty($conf->commande->enabled)) @@ -385,9 +385,9 @@ if (! empty($conf->adherent->enabled)) } print ''; } + print '
'; } -print "
"; print info_admin($langs->trans("YouCanAddTagOnUrl")); if (! empty($conf->use_javascript_ajax)) diff --git a/htdocs/stripe/admin/stripe.php b/htdocs/stripe/admin/stripe.php index f135927b28a..c2c33edc189 100644 --- a/htdocs/stripe/admin/stripe.php +++ b/htdocs/stripe/admin/stripe.php @@ -227,9 +227,9 @@ $token=''; // Url list -print ''.$langs->trans("FollowingUrlAreAvailableToMakePayments").':
'; +print ''.$langs->trans("FollowingUrlAreAvailableToMakePayments").':

'; print img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePaymentOnFreeAmount",$servicename).':
'; -print ''.getStripePaymentUrl(1,'free')."
\n"; +print ''.getStripePaymentUrl(1,'free')."

\n"; if (! empty($conf->commande->enabled)) { print img_picto('','object_globe.png').' '.$langs->trans("ToOfferALinkForOnlinePaymentOnOrder",$servicename).':
'; @@ -250,6 +250,7 @@ if (! empty($conf->commande->enabled)) } print ''; } + print '
'; } if (! empty($conf->facture->enabled)) { @@ -271,6 +272,7 @@ if (! empty($conf->facture->enabled)) } print ''; } + print '
'; } if (! empty($conf->contrat->enabled)) { @@ -292,6 +294,7 @@ if (! empty($conf->contrat->enabled)) } print ''; } + print '
'; } if (! empty($conf->adherent->enabled)) { @@ -313,9 +316,9 @@ if (! empty($conf->adherent->enabled)) } print ''; } + print '
'; } -print "
"; print info_admin($langs->trans("YouCanAddTagOnUrl")); if (! empty($conf->use_javascript_ajax)) From 789fbb6dc3ea6a16133288a6faa163dc45b31b0c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 15 May 2017 12:57:08 +0200 Subject: [PATCH 133/299] Enhance tooltips --- htdocs/admin/system/perf.php | 9 ++++++--- htdocs/langs/en_US/admin.lang | 2 ++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/htdocs/admin/system/perf.php b/htdocs/admin/system/perf.php index 3e6a9df4a25..9b23dc74089 100644 --- a/htdocs/admin/system/perf.php +++ b/htdocs/admin/system/perf.php @@ -112,7 +112,7 @@ $test=function_exists('opcache_get_status'); if (! $foundcache && $test) { $foundcache++; - print img_picto('','tick.png').' '.$langs->trans("ZendOPCacheInstalled"); // Should be by defautl starting with PHP 5.5 + print img_picto('','tick.png').' '.$langs->trans("ZendOPCacheInstalled"); // Should be by default starting with PHP 5.5 //$tmp=opcache_get_status(); //var_dump($tmp); } @@ -376,7 +376,8 @@ jQuery(document).ready(function() { print '
'; print ''.$langs->trans("HTTPCacheStaticResources").' - '; -print $langs->trans("CacheByServer").':
'; +print $form->textwithpicto($langs->trans("CacheByServer"), $langs->trans("CacheByServerDesc")); +print ':
'; // No cahce on PHP //print '

'.img_picto('','warning.png').' '.$langs->trans("FilesOfTypeNotCompressed",'php (.php)').'
'; //print '
'.img_picto('','tick.png').' '.$langs->trans("FilesOfTypeNotCached",'php (.php)').'
'; @@ -399,7 +400,9 @@ print $langs->trans("TestNotPossibleWithCurrentBrowsers").'
'; // Compressions print '
'; -print ''.$langs->trans("CompressionOfResources").': '; +print ''; +print $form->textwithpicto($langs->trans("CompressionOfResources"), $langs->trans("CompressionOfResourcesDesc")); +print ': '; //$tmp=getURLContent(DOL_URL_ROOT.'/index.php','GET');var_dump($tmp); print '
'; // on PHP diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 3662e8aca1c..1c9ac65e4b8 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1353,8 +1353,10 @@ FilesOfTypeNotCached=Files of type %s are not cached by HTTP server FilesOfTypeCompressed=Files of type %s are compressed by HTTP server FilesOfTypeNotCompressed=Files of type %s are not compressed by HTTP server CacheByServer=Cache by server +CacheByServerDesc=For exemple using the Apache directive "ExpiresByType image/gif A2592000" CacheByClient=Cache by browser CompressionOfResources=Compression of HTTP responses +CompressionOfResourcesDesc=For exemple using the Apache directive "AddOutputFilterByType DEFLATE" TestNotPossibleWithCurrentBrowsers=Such an automatic detection is not possible with current browsers DefaultValuesDesc=You can define/force here the default value you want to get when your create a new record, and/or defaut filters or sort order when your list record. DefaultCreateForm=Default values for new objects From f10b77f1909a9ff3c105ad450fe005237a345754 Mon Sep 17 00:00:00 2001 From: phf Date: Mon, 15 May 2017 15:05:42 +0200 Subject: [PATCH 134/299] Fix html id 'tablelines' exist twice --- htdocs/compta/facture.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index aad8b77811f..c871594f16a 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -3811,7 +3811,7 @@ else if ($id > 0 || ! empty($ref)) print ''; print ''; - print ''; + print '
'; print ''; if (!empty($conf->global->MAIN_VIEW_LINE_NUMBER)) { From 3da7b9543df6bd94712ea493195172c3faba1da5 Mon Sep 17 00:00:00 2001 From: phf Date: Mon, 15 May 2017 15:10:15 +0200 Subject: [PATCH 135/299] Fix double quote --- htdocs/compta/facture.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index c871594f16a..6637d1332f2 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -3806,7 +3806,7 @@ else if ($id > 0 || ! empty($ref)) if ($object->situation_cycle_ref && $object->statut == 0) { print '
'; - print '
'; + print ''; print ''; print ''; print ''; From bdb2f851032c9f4a8a6253cd45bde4470eb6374e Mon Sep 17 00:00:00 2001 From: philippe grand Date: Mon, 15 May 2017 16:25:51 +0200 Subject: [PATCH 136/299] Update code using new css class --- htdocs/expedition/card.php | 2 +- htdocs/expedition/index.php | 22 +++++++--------------- htdocs/expedition/stats/index.php | 6 ++---- 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/htdocs/expedition/card.php b/htdocs/expedition/card.php index cbe602f7313..a0280ce9e39 100644 --- a/htdocs/expedition/card.php +++ b/htdocs/expedition/card.php @@ -1013,7 +1013,7 @@ if ($action == 'create') { $img=img_warning($langs->trans("StockTooLow")); } - print "
"; diff --git a/htdocs/expedition/index.php b/htdocs/expedition/index.php index c3e277ad7b0..039a038f18a 100644 --- a/htdocs/expedition/index.php +++ b/htdocs/expedition/index.php @@ -90,17 +90,15 @@ if ($resql) print ''; print ''; $i = 0; - $var = True; while ($i < $num) { $obj = $db->fetch_object($resql); $shipment->id=$obj->rowid; $shipment->ref=$obj->ref; - $shipment->ref_customer=$obj->ref_customer; - + $shipment->ref_customer=$obj->ref_customer; - print ""; print ''; diff --git a/htdocs/comm/action/index.php b/htdocs/comm/action/index.php index 0a8ab49ea38..307d6417285 100644 --- a/htdocs/comm/action/index.php +++ b/htdocs/comm/action/index.php @@ -160,7 +160,6 @@ if ($action =='delete_action') } - /* * View */ diff --git a/htdocs/core/class/conf.class.php b/htdocs/core/class/conf.class.php index 28a287971a8..578ed17049e 100644 --- a/htdocs/core/class/conf.class.php +++ b/htdocs/core/class/conf.class.php @@ -580,6 +580,12 @@ class Conf if (empty($this->global->MAIN_SIZE_SHORTLIST_LIMIT)) $this->global->MAIN_SIZE_SHORTLIST_LIMIT=3; + // Save inconsistent option + if (empty($conf->global->AGENDA_USE_EVENT_TYPE) && $conf->global->AGENDA_DEFAULT_FILTER_TYPE == 'AC_NON_AUTO') + { + $conf->global->AGENDA_DEFAULT_FILTER_TYPE='0'; // 'AC_NON_AUTO' does not exists when AGENDA_DEFAULT_FILTER_TYPE is not on. + } + // For backward compatibility if (isset($this->product)) $this->produit=$this->product; if (isset($this->facture)) $this->invoice=$this->facture; diff --git a/htdocs/societe/ajax/company.php b/htdocs/societe/ajax/company.php index 32f57f73c25..d57a6f3fca6 100644 --- a/htdocs/societe/ajax/company.php +++ b/htdocs/societe/ajax/company.php @@ -83,11 +83,11 @@ else sort($match); $id = (! empty($match[0]) ? $match[0] : ''); - if (! GETPOST($htmlname) && ! GETPOST($id)) return; - // When used from jQuery, the search term is added as GET param "term". - $searchkey=(GETPOST($id)?GETPOST($id):(GETPOST($htmlname)?GETPOST($htmlname):'')); + $searchkey=(($id && GETPOST($id, 'alpha'))?GETPOST($id, 'alpha'):(($htmlname && GETPOST($htmlname, 'alpha'))?GETPOST($htmlname, 'alpha'):'')); + if (! $searchkey) return; + $form = new Form($db); $arrayresult=$form->select_thirdparty_list(0,$htmlname,$filter,1,0,0,null,$searchkey,$outjson); From ba5fb700baae1931aba39baa32e5e1bd238a4dba Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 19 May 2017 18:35:52 +0200 Subject: [PATCH 193/299] Missing translation --- htdocs/langs/en_US/contracts.lang | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/langs/en_US/contracts.lang b/htdocs/langs/en_US/contracts.lang index 880f00a9331..f742ca4cecd 100644 --- a/htdocs/langs/en_US/contracts.lang +++ b/htdocs/langs/en_US/contracts.lang @@ -83,6 +83,8 @@ NoteListOfYourExpiredServices=This list contains only services of contracts for StandardContractsTemplate=Standard contracts template ContactNameAndSignature=For %s, name and signature: OnlyLinesWithTypeServiceAreUsed=Only lines with type "Service" will be cloned. +CloneContract=Clone contract +ConfirmCloneContract=Are you sure you want to clone the contract %s? ##### Types de contacts ##### TypeContact_contrat_internal_SALESREPSIGN=Sales representative signing contract From 06b37d0e8285112ed10553ca636619b6bfdbd0c1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 19 May 2017 20:17:33 +0200 Subject: [PATCH 194/299] Work on dol_check_secure_access_document to support write question --- htdocs/core/lib/files.lib.php | 20 ++++++++++++++------ htdocs/core/lib/security.lib.php | 1 + test/phpunit/FilesLibTest.php | 21 +++++++++++++++++++++ 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 4c3be3cc4d1..f9f6efea8d5 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -1642,9 +1642,11 @@ function dol_most_recent_file($dir,$regexfilter='',$excludefilter=array('(\.meta * @param string $entity Restrict onto entity * @param User $fuser User object (forced) * @param string $refname Ref of object to check permission for external users (autodetect if not provided) + * @param string $more Check permission for 'read' or 'write' * @return mixed Array with access information : 'accessallowed' & 'sqlprotectagainstexternals' & 'original_file' (as a full path name) + * @see restrictedArea */ -function dol_check_secure_access_document($modulepart,$original_file,$entity,$fuser='',$refname='') +function dol_check_secure_access_document($modulepart,$original_file,$entity,$fuser='',$refname='',$mode='read') { global $user, $conf, $db; global $dolibarr_main_data_root; @@ -2246,6 +2248,12 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // If modulepart=module Allows any module to open a file if file is in directory called DOL_DATA_ROOT/modulepart else { + $lire='lire'; $read='read'; $download='download'; + if ($mode == 'write') + { + $lire='creer'; $read='write'; $download='upload'; + } + if (preg_match('/^specimen/i',$original_file)) $accessallowed=1; // If link to a file called specimen. Test must be done before changing $original_file int full path. if ($fuser->admin) $accessallowed=1; // If user is admin @@ -2257,7 +2265,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu dol_print_error('','Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.')'); exit; } - if ($fuser->rights->{$reg[1]}->lire || $fuser->rights->{$reg[1]}->read || ($fuser->rights->{$reg[1]}->download)) $accessallowed=1; + if ($fuser->rights->{$reg[1]}->{$lire} || $fuser->rights->{$reg[1]}->{$read} || ($fuser->rights->{$reg[1]}->{$download})) $accessallowed=1; $original_file=$conf->{$reg[1]}->dir_temp.'/'.$fuser->id.'/'.$original_file; } else if (preg_match('/^([a-z]+)_temp$/i',$modulepart,$reg)) @@ -2267,7 +2275,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu dol_print_error('','Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.')'); exit; } - if ($fuser->rights->{$reg[1]}->lire || $fuser->rights->{$reg[1]}->read || ($fuser->rights->{$reg[1]}->download)) $accessallowed=1; + if ($fuser->rights->{$reg[1]}->{$lire} || $fuser->rights->{$reg[1]}->{$read} || ($fuser->rights->{$reg[1]}->{$download})) $accessallowed=1; $original_file=$conf->{$reg[1]}->dir_temp.'/'.$original_file; } else if (preg_match('/^([a-z]+)_user$/i',$modulepart,$reg)) @@ -2277,7 +2285,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu dol_print_error('','Error call dol_check_secure_access_document with not supported value for modulepart parameter ('.$modulepart.')'); exit; } - if ($fuser->rights->{$reg[1]}->lire || $fuser->rights->{$reg[1]}->read || ($fuser->rights->{$reg[1]}->download)) $accessallowed=1; + if ($fuser->rights->{$reg[1]}->{$lire} || $fuser->rights->{$reg[1]}->{$read} || ($fuser->rights->{$reg[1]}->{$download})) $accessallowed=1; $original_file=$conf->{$reg[1]}->dir_output.'/'.$fuser->id.'/'.$original_file; } else @@ -2297,7 +2305,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu } else { - if ($fuser->rights->$modulepart->lire || $fuser->rights->$modulepart->read) $accessallowed=1; + if ($fuser->rights->$modulepart->{$lire} || $fuser->rights->$modulepart->{$read}) $accessallowed=1; $original_file=$conf->$modulepart->dir_output.'/'.$original_file; } } @@ -2307,7 +2315,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu if (! empty($conf->global->$subPermCategoryConstName)) { $subPermCategory = $conf->global->$subPermCategoryConstName; - if (! empty($subPermCategory) && (($fuser->rights->$modulepart->$subPermCategory->lire) || ($fuser->rights->$modulepart->$subPermCategory->read) || ($fuser->rights->$modulepart->$subPermCategory->download))) + if (! empty($subPermCategory) && (($fuser->rights->$modulepart->$subPermCategory->{$lire}) || ($fuser->rights->$modulepart->$subPermCategory->{$read}) || ($fuser->rights->$modulepart->$subPermCategory->{$download}))) { $accessallowed=1; } diff --git a/htdocs/core/lib/security.lib.php b/htdocs/core/lib/security.lib.php index ccc8a68a5d9..6993ad496ea 100644 --- a/htdocs/core/lib/security.lib.php +++ b/htdocs/core/lib/security.lib.php @@ -109,6 +109,7 @@ function dol_hash($chain,$type=0) * @param string $dbt_select Field name for select if not rowid. Not used if objectid is null (optional) * @param Canvas $objcanvas Object canvas * @return int Always 1, die process if not allowed + * @see dol_check_secure_access_document */ function restrictedArea($user, $features, $objectid=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $objcanvas=null) { diff --git a/test/phpunit/FilesLibTest.php b/test/phpunit/FilesLibTest.php index f9000006b46..ddfcb8ed217 100644 --- a/test/phpunit/FilesLibTest.php +++ b/test/phpunit/FilesLibTest.php @@ -418,4 +418,25 @@ class FilesLibTest extends PHPUnit_Framework_TestCase $this->assertEquals(1,count($founddirs)); } + + /** + * testDolCheckSecureAccessDocument + * + * @return void + */ + public function testDolCheckSecureAccessDocument() + { + global $conf,$user,$langs,$db; + $conf=$this->savconf; + $user=$this->savuser; + $langs=$this->savlangs; + $db=$this->savdb; + + //$dummyuser=new User($db); + //$result=restrictedArea($dummyuser,'societe'); + + //$result=dol_check_secure_access_document($user,'societe'); + //$this->assertEquals(1,$result); + } + } From 035cae656f185961e9b8600429b27bc6fa70a8c3 Mon Sep 17 00:00:00 2001 From: Inovea Conseil Date: Fri, 19 May 2017 22:14:34 +0200 Subject: [PATCH 195/299] Fix bug in insert method Missing the last comma in the insert method --- dev/skeletons/build_class_from_table.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dev/skeletons/build_class_from_table.php b/dev/skeletons/build_class_from_table.php index 62ad1188759..537975365ef 100755 --- a/dev/skeletons/build_class_from_table.php +++ b/dev/skeletons/build_class_from_table.php @@ -251,7 +251,7 @@ $cleanparam=''; $i=0; foreach($property as $key => $prop) { - $i++; + $addfield=1; if ($prop['field'] == 'tms') $addfield=0; // This is a field of type timestamp edited automatically if ($prop['extra'] == 'auto_increment') $addfield=0; @@ -263,6 +263,7 @@ foreach($property as $key => $prop) $varprop.="';"; $varprop.="\n"; } + $i++; } $targetcontent=preg_replace('/\$sql \.= \' field1,\';/', $varprop, $targetcontent); $targetcontent=preg_replace('/\$sql \.= \' field2\';/', '', $targetcontent); From 4ff9607011e5cd83a9cbd0a82b47474afbbd963d Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sat, 20 May 2017 07:56:33 +0200 Subject: [PATCH 196/299] Update table accounting_bookeeping to prepare FEC format and harmonization --- .../install/mysql/migration/5.0.0-6.0.0.sql | 12 +++++ .../tables/llx_accounting_bookkeeping.sql | 54 +++++++++++-------- 2 files changed, 43 insertions(+), 23 deletions(-) diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index 6ba7707b249..00f616ca56f 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -141,6 +141,18 @@ ALTER TABLE llx_bank_account ADD INDEX idx_fk_accountancy_journal (fk_accountanc UPDATE llx_bank_account as ba set fk_accountancy_journal = (SELECT rowid FROM llx_accounting_journal as aj where ba.accountancy_journal = aj.code) where accountancy_journal not in ('1', '2', '3', '4', '5', '6', '5', '8', '9', '10', '11', '12', '13', '14', '15'); ALTER TABLE llx_bank_account ADD CONSTRAINT fk_bank_account_accountancy_journal FOREIGN KEY (fk_accountancy_journal) REFERENCES llx_accounting_journal (rowid); +--Update general ledger for FEC format & harmonization +ALTER TABLE llx_accounting_bookkeeping MODIFY COLUMN code_tiers varchar(32); +ALTER TABLE llx_accounting_bookkeeping MODIFY COLUMN label_compte varchar(255); +ALTER TABLE llx_accounting_bookkeeping MODIFY COLUMN code_journal varchar(32); +ALTER TABLE llx_accounting_bookkeeping ADD COLUMN thirdparty_label varchar(255) AFTER code_tiers; +ALTER TABLE llx_accounting_bookkeeping ADD COLUMN label_operation varchar(255) AFTER label_compte; +ALTER TABLE llx_accounting_bookkeeping ADD COLUMN multicurrency_amount double AFTER sens; +ALTER TABLE llx_accounting_bookkeeping ADD COLUMN multicurrency_code varchar(255) AFTER multicurrency_amount; +ALTER TABLE llx_accounting_bookkeeping ADD COLUMN lettering_code varchar(255) AFTER multicurrency_code; +ALTER TABLE llx_accounting_bookkeeping ADD COLUMN date_lettering datetime AFTER lettering_code; +ALTER TABLE llx_accounting_bookkeeping ADD COLUMN journal_label varchar(255) AFTER code_journal; +ALTER TABLE llx_accounting_bookkeeping ADD COLUMN date_validated datetime AFTER validated; ALTER TABLE llx_paiementfourn ADD COLUMN model_pdf varchar(255); diff --git a/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql b/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql index c72186c6910..651fee6c339 100644 --- a/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql +++ b/htdocs/install/mysql/tables/llx_accounting_bookkeeping.sql @@ -1,6 +1,6 @@ -- ============================================================================ -- Copyright (C) 2013-2014 Olivier Geffroy --- Copyright (C) 2013-2014 Alexandre Spangaro +-- Copyright (C) 2013-2017 Alexandre Spangaro -- -- 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 @@ -19,26 +19,34 @@ CREATE TABLE llx_accounting_bookkeeping ( - rowid integer NOT NULL AUTO_INCREMENT PRIMARY KEY, - entity integer DEFAULT 1 NOT NULL, -- multi company id - doc_date date NOT NULL, - doc_type varchar(30) NOT NULL, -- facture_client/reglement_client/facture_fournisseur/reglement_fournisseur - doc_ref varchar(300) NOT NULL, -- facture_client/reglement_client/... reference number - fk_doc integer NOT NULL, -- facture_client/reglement_client/... rowid - fk_docdet integer NOT NULL, -- facture_client/reglement_client/... line rowid - code_tiers varchar(24), -- code tiers - numero_compte varchar(32) NOT NULL, - label_compte varchar(128) NOT NULL, - debit double NOT NULL, - credit double NOT NULL, - montant double NOT NULL, - sens varchar(1) DEFAULT NULL, - fk_user_author integer NOT NULL, -- user creating - fk_user_modif integer, -- user making last change - date_creation datetime, -- date de creation - tms timestamp, -- date last modification - import_key varchar(14), - code_journal varchar(10) NOT NULL, - piece_num integer NOT NULL, - validated tinyint DEFAULT 0 NOT NULL -- 0 line not validated / 1 line validated (No deleting / No modification) + rowid integer NOT NULL AUTO_INCREMENT PRIMARY KEY, + entity integer DEFAULT 1 NOT NULL, -- | multi company id + doc_date date NOT NULL, -- FEC:PieceDate + doc_type varchar(30) NOT NULL, -- FEC:PieceRef | facture_client/reglement_client/facture_fournisseur/reglement_fournisseur + doc_ref varchar(300) NOT NULL, -- | facture_client/reglement_client/... reference number + fk_doc integer NOT NULL, -- | facture_client/reglement_client/... rowid + fk_docdet integer NOT NULL, -- | facture_client/reglement_client/... line rowid + code_tiers varchar(32), -- FEC:CompAuxNum | account number of auxiliary account + thirdparty_label varchar(255), -- FEC:CompAuxLib | label of auxiliary account + numero_compte varchar(32) NOT NULL, -- FEC:CompteNum | account number + label_compte varchar(255) NOT NULL, -- FEC:CompteLib | label of account + label_operation varchar(255), -- FEC:EcritureLib | label of the operation + debit double NOT NULL, -- FEC:Debit + credit double NOT NULL, -- FEC:Credit + montant double NOT NULL, -- FEC:Montant (Not necessary) + sens varchar(1) DEFAULT NULL, -- FEC:Sens (Not necessary) + multicurrency_amount double, -- FEC:Montantdevise + multicurrency_code varchar(255), -- FEC:Idevise + lettering_code varchar(255), -- FEC:EcritureLet + date_lettering datetime, -- FEC:DateLet + fk_user_author integer NOT NULL, -- | user creating + fk_user_modif integer, -- | user making last change + date_creation datetime, -- FEC:EcritureDate | creation date + tms timestamp, -- | date last modification + import_key varchar(14), + code_journal varchar(32) NOT NULL, -- FEC:JournalCode + journal_label varchar(255), -- FEC:JournalLib + piece_num integer NOT NULL, -- FEC:EcritureNum + validated tinyint DEFAULT 0 NOT NULL, -- | 0 line not validated / 1 line validated (No deleting / No modification) + date_validated datetime -- FEC:ValidDate ) ENGINE=innodb; From df05980c3a7d9f011000a7f7a5b20fdd0daab450 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 20 May 2017 10:42:45 +0200 Subject: [PATCH 197/299] Prepare table of notification per object (exemple agenda events) --- .../install/mysql/migration/5.0.0-6.0.0.sql | 13 ++++++++ .../install/mysql/tables/llx_actioncomm.sql | 2 +- htdocs/install/mysql/tables/llx_notify.sql | 1 + .../install/mysql/tables/llx_notify_def.sql | 5 ++-- .../mysql/tables/llx_notify_def_object.sql | 30 +++++++++++++++++++ 5 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 htdocs/install/mysql/tables/llx_notify_def_object.sql diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index 99a00b033c6..fc4bdceb149 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -24,6 +24,19 @@ -- -- VPGSQL8.2 DELETE FROM llx_usergroup_user WHERE fk_user NOT IN (SELECT rowid from llx_user); -- -- VMYSQL4.1 DELETE FROM llx_usergroup_user WHERE fk_usergroup NOT IN (SELECT rowid from llx_usergroup); + +create table llx_notify_def_object +( + id integer AUTO_INCREMENT PRIMARY KEY, + entity integer DEFAULT 1 NOT NULL, -- multi company id + objet_type varchar(16), -- 'actioncomm' + objet_id integer NOT NULL, -- id of parent key + type_notif varchar(16) DEFAULT 'browser', -- 'browser', 'email', 'sms', 'webservice', ... + date_notif datetime, -- date notification + user_id integer, -- notification is for this user + moreparam varchar(255) +)ENGINE=innodb; + ALTER TABLE llx_facturedet_rec ADD COLUMN vat_src_code varchar(10) DEFAULT '' AFTER tva_tx; ALTER TABLE llx_extrafields ADD COLUMN langs varchar(24); diff --git a/htdocs/install/mysql/tables/llx_actioncomm.sql b/htdocs/install/mysql/tables/llx_actioncomm.sql index 46017d1e739..4849aacb690 100644 --- a/htdocs/install/mysql/tables/llx_actioncomm.sql +++ b/htdocs/install/mysql/tables/llx_actioncomm.sql @@ -64,7 +64,7 @@ create table llx_actioncomm email_tobcc varchar(256), -- when event was an email, we store here the email_tobcc errors_to varchar(256), -- when event was an email, we store here the erros_to - recurid varchar(128), -- used to store event id to link each other all the repeating event records + recurid varchar(128), -- used to store event id to link each other all the repeating event record recurrule varchar(128), -- contains string with ical format recurring rule like "FREQ=MONTHLY;INTERVAL=2;BYMONTHDAY=19" or "FREQ=WEEKLY;BYDAY=MO" recurdateend datetime, -- no more recurring event after this date diff --git a/htdocs/install/mysql/tables/llx_notify.sql b/htdocs/install/mysql/tables/llx_notify.sql index f595dc7c126..b0fa333dbb9 100644 --- a/htdocs/install/mysql/tables/llx_notify.sql +++ b/htdocs/install/mysql/tables/llx_notify.sql @@ -16,6 +16,7 @@ -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- +-- Table of notification done -- =================================================================== create table llx_notify diff --git a/htdocs/install/mysql/tables/llx_notify_def.sql b/htdocs/install/mysql/tables/llx_notify_def.sql index a3fc123c8dd..3641e8cd2e7 100644 --- a/htdocs/install/mysql/tables/llx_notify_def.sql +++ b/htdocs/install/mysql/tables/llx_notify_def.sql @@ -15,16 +15,17 @@ -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -- +-- Table to declare permanent notifications (per workflow event) -- =================================================================== create table llx_notify_def ( rowid integer AUTO_INCREMENT PRIMARY KEY, tms timestamp, - datec date, -- date de creation + datec date, -- date de creation fk_action integer NOT NULL, fk_soc integer, fk_contact integer, fk_user integer, - type varchar(16) DEFAULT 'email' + type varchar(16) DEFAULT 'email' -- 'browser', 'email', 'sms', 'webservice', ... )ENGINE=innodb; diff --git a/htdocs/install/mysql/tables/llx_notify_def_object.sql b/htdocs/install/mysql/tables/llx_notify_def_object.sql new file mode 100644 index 00000000000..d1ddd2d1b99 --- /dev/null +++ b/htdocs/install/mysql/tables/llx_notify_def_object.sql @@ -0,0 +1,30 @@ +-- ======================================================================== +-- Copyright (C) 2017 Laurent Destailleur +-- +-- 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 3 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 . +-- +-- Table to declare notifications (per object) +-- ======================================================================== + +create table llx_notify_def_object +( + id integer AUTO_INCREMENT PRIMARY KEY, + entity integer DEFAULT 1 NOT NULL, -- multi company id + objet_type varchar(16), -- 'actioncomm' + objet_id integer NOT NULL, -- id of parent key + type_notif varchar(16) DEFAULT 'browser', -- 'browser', 'email', 'sms', 'webservice', ... + date_notif datetime, -- date notification + user_id integer, -- notification is for this user + moreparam varchar(255) +)ENGINE=innodb; From 601f3ea75e585eff80142a1929ee5ea09d0ba4d7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 20 May 2017 11:31:03 +0200 Subject: [PATCH 198/299] Fix dol_check_secure_access_document in write mode, add phpunit tests --- htdocs/core/lib/files.lib.php | 123 +++++++++++++++++----------------- test/phpunit/FilesLibTest.php | 45 ++++++++++++- 2 files changed, 104 insertions(+), 64 deletions(-) diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index f9f6efea8d5..437811d8e98 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -1639,14 +1639,14 @@ function dol_most_recent_file($dir,$regexfilter='',$excludefilter=array('(\.meta * * @param string $modulepart Module of document ('module', 'module_user_temp', 'module_user' or 'module_temp') * @param string $original_file Relative path with filename, relative to modulepart. - * @param string $entity Restrict onto entity + * @param string $entity Restrict onto entity (0=no restriction) * @param User $fuser User object (forced) * @param string $refname Ref of object to check permission for external users (autodetect if not provided) * @param string $more Check permission for 'read' or 'write' * @return mixed Array with access information : 'accessallowed' & 'sqlprotectagainstexternals' & 'original_file' (as a full path name) * @see restrictedArea */ -function dol_check_secure_access_document($modulepart,$original_file,$entity,$fuser='',$refname='',$mode='read') +function dol_check_secure_access_document($modulepart, $original_file, $entity, $fuser='', $refname='', $mode='read') { global $user, $conf, $db; global $dolibarr_main_data_root; @@ -1666,6 +1666,13 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu $relative_original_file = $original_file; + // Define possible keys to use for permission check + $lire='lire'; $read='read'; $download='download'; + if ($mode == 'write') + { + $lire='creer'; $read='write'; $download='upload'; + } + // Wrapping for some images if (($modulepart == 'mycompany' || $modulepart == 'companylogo') && !empty($conf->mycompany->dir_output)) { @@ -1687,125 +1694,125 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping pour les apercu factures elseif ($modulepart == 'apercufacture' && !empty($conf->facture->dir_output)) { - if ($fuser->rights->facture->lire) $accessallowed=1; + if ($fuser->rights->facture->{$lire}) $accessallowed=1; $original_file=$conf->facture->dir_output.'/'.$original_file; } // Wrapping pour les apercu propal elseif ($modulepart == 'apercupropal' && !empty($conf->propal->dir_output)) { - if ($fuser->rights->propale->lire) $accessallowed=1; + if ($fuser->rights->propale->{$lire}) $accessallowed=1; $original_file=$conf->propal->dir_output.'/'.$original_file; } // Wrapping pour les apercu commande elseif ($modulepart == 'apercucommande' && !empty($conf->commande->dir_output)) { - if ($fuser->rights->commande->lire) $accessallowed=1; + if ($fuser->rights->commande->{$lire}) $accessallowed=1; $original_file=$conf->commande->dir_output.'/'.$original_file; } // Wrapping pour les apercu intervention elseif (($modulepart == 'apercufichinter' || $modulepart == 'apercuficheinter') && !empty($conf->ficheinter->dir_output)) { - if ($fuser->rights->ficheinter->lire) $accessallowed=1; + if ($fuser->rights->ficheinter->{$lire}) $accessallowed=1; $original_file=$conf->ficheinter->dir_output.'/'.$original_file; } // Wrapping pour les apercu conat elseif (($modulepart == 'apercucontract') && !empty($conf->contrat->dir_output)) { - if ($fuser->rights->contrat->lire) $accessallowed=1; + if ($fuser->rights->contrat->{$lire}) $accessallowed=1; $original_file=$conf->contrat->dir_output.'/'.$original_file; } // Wrapping pour les apercu supplier proposal elseif (($modulepart == 'apercusupplier_proposal' || $modulepart == 'apercusupplier_proposal') && !empty($conf->supplier_proposal->dir_output)) { - if ($fuser->rights->supplier_proposal->lire) $accessallowed=1; + if ($fuser->rights->supplier_proposal->{$lire}) $accessallowed=1; $original_file=$conf->supplier_proposal->dir_output.'/'.$original_file; } // Wrapping pour les apercu supplier order elseif (($modulepart == 'apercusupplier_order' || $modulepart == 'apercusupplier_order') && !empty($conf->fournisseur->commande->dir_output)) { - if ($fuser->rights->fournisseur->commande->lire) $accessallowed=1; + if ($fuser->rights->fournisseur->commande->{$lire}) $accessallowed=1; $original_file=$conf->fournisseur->commande->dir_output.'/'.$original_file; } // Wrapping pour les apercu supplier invoice elseif (($modulepart == 'apercusupplier_invoice' || $modulepart == 'apercusupplier_invoice') && !empty($conf->fournisseur->facture->dir_output)) { - if ($fuser->rights->fournisseur->facture->lire) $accessallowed=1; + if ($fuser->rights->fournisseur->facture->{$lire}) $accessallowed=1; $original_file=$conf->fournisseur->facture->dir_output.'/'.$original_file; } // Wrapping pour les images des stats propales elseif ($modulepart == 'propalstats' && !empty($conf->propal->dir_temp)) { - if ($fuser->rights->propale->lire) $accessallowed=1; + if ($fuser->rights->propale->{$lire}) $accessallowed=1; $original_file=$conf->propal->dir_temp.'/'.$original_file; } // Wrapping pour les images des stats commandes elseif ($modulepart == 'orderstats' && !empty($conf->commande->dir_temp)) { - if ($fuser->rights->commande->lire) $accessallowed=1; + if ($fuser->rights->commande->{$lire}) $accessallowed=1; $original_file=$conf->commande->dir_temp.'/'.$original_file; } elseif ($modulepart == 'orderstatssupplier' && !empty($conf->fournisseur->dir_output)) { - if ($fuser->rights->fournisseur->commande->lire) $accessallowed=1; + if ($fuser->rights->fournisseur->commande->{$lire}) $accessallowed=1; $original_file=$conf->fournisseur->dir_output.'/commande/temp/'.$original_file; } // Wrapping pour les images des stats factures elseif ($modulepart == 'billstats' && !empty($conf->facture->dir_temp)) { - if ($fuser->rights->facture->lire) $accessallowed=1; + if ($fuser->rights->facture->{$lire}) $accessallowed=1; $original_file=$conf->facture->dir_temp.'/'.$original_file; } elseif ($modulepart == 'billstatssupplier' && !empty($conf->fournisseur->dir_output)) { - if ($fuser->rights->fournisseur->facture->lire) $accessallowed=1; + if ($fuser->rights->fournisseur->facture->{$lire}) $accessallowed=1; $original_file=$conf->fournisseur->dir_output.'/facture/temp/'.$original_file; } // Wrapping pour les images des stats expeditions elseif ($modulepart == 'expeditionstats' && !empty($conf->expedition->dir_temp)) { - if ($fuser->rights->expedition->lire) $accessallowed=1; + if ($fuser->rights->expedition->{$lire}) $accessallowed=1; $original_file=$conf->expedition->dir_temp.'/'.$original_file; } // Wrapping pour les images des stats expeditions elseif ($modulepart == 'tripsexpensesstats' && !empty($conf->deplacement->dir_temp)) { - if ($fuser->rights->deplacement->lire) $accessallowed=1; + if ($fuser->rights->deplacement->{$lire}) $accessallowed=1; $original_file=$conf->deplacement->dir_temp.'/'.$original_file; } // Wrapping pour les images des stats expeditions elseif ($modulepart == 'memberstats' && !empty($conf->adherent->dir_temp)) { - if ($fuser->rights->adherent->lire) $accessallowed=1; + if ($fuser->rights->adherent->{$lire}) $accessallowed=1; $original_file=$conf->adherent->dir_temp.'/'.$original_file; } // Wrapping pour les images des stats produits elseif (preg_match('/^productstats_/i',$modulepart) && !empty($conf->product->dir_temp)) { - if ($fuser->rights->produit->lire || $fuser->rights->service->lire) $accessallowed=1; + if ($fuser->rights->produit->{$lire} || $fuser->rights->service->{$lire}) $accessallowed=1; $original_file=(!empty($conf->product->multidir_temp[$entity])?$conf->product->multidir_temp[$entity]:$conf->service->multidir_temp[$entity]).'/'.$original_file; } // Wrapping for taxes elseif ($modulepart == 'tax' && !empty($conf->tax->dir_output)) { - if ($fuser->rights->tax->charges->lire) $accessallowed=1; + if ($fuser->rights->tax->charges->{$lire}) $accessallowed=1; $original_file=$conf->tax->dir_output.'/'.$original_file; } // Wrapping for events elseif ($modulepart == 'actions' && !empty($conf->agenda->dir_output)) { - if ($fuser->rights->agenda->myactions->read) $accessallowed=1; + if ($fuser->rights->agenda->myactions->{$read}) $accessallowed=1; $original_file=$conf->agenda->dir_output.'/'.$original_file; } // Wrapping for categories elseif ($modulepart == 'category' && !empty($conf->categorie->dir_output)) { - if ($fuser->rights->categorie->lire) $accessallowed=1; + if ($fuser->rights->categorie->{$lire}) $accessallowed=1; $original_file=$conf->categorie->multidir_output[$entity].'/'.$original_file; } // Wrapping pour les prelevements elseif ($modulepart == 'prelevement' && !empty($conf->prelevement->dir_output)) { - if ($fuser->rights->prelevement->bons->lire || preg_match('/^specimen/i',$original_file)) $accessallowed=1; + if ($fuser->rights->prelevement->bons->{$lire} || preg_match('/^specimen/i',$original_file)) $accessallowed=1; $original_file=$conf->prelevement->dir_output.'/'.$original_file; } // Wrapping pour les graph energie @@ -1856,7 +1863,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping for users else if ($modulepart == 'user' && !empty($conf->user->dir_output)) { - $canreaduser=(! empty($fuser->admin) || $fuser->rights->user->user->lire); + $canreaduser=(! empty($fuser->admin) || $fuser->rights->user->user->{$lire}); if ($fuser->id == (int) $refname) { $canreaduser=1; } // A user can always read its own card if ($canreaduser || preg_match('/^specimen/i',$original_file)) { @@ -1868,7 +1875,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping for third parties else if (($modulepart == 'company' || $modulepart == 'societe') && !empty($conf->societe->dir_output)) { - if ($fuser->rights->societe->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->societe->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1879,7 +1886,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping for contact else if ($modulepart == 'contact' && !empty($conf->societe->dir_output)) { - if ($fuser->rights->societe->lire) + if ($fuser->rights->societe->{$lire}) { $accessallowed=1; } @@ -1889,7 +1896,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping for invoices else if (($modulepart == 'facture' || $modulepart == 'invoice') && !empty($conf->facture->dir_output)) { - if ($fuser->rights->facture->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->facture->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1899,7 +1906,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping for mass actions else if ($modulepart == 'massfilesarea_proposals' && !empty($conf->propal->dir_output)) { - if ($fuser->rights->propal->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->propal->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1907,7 +1914,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu } else if ($modulepart == 'massfilesarea_orders') { - if ($fuser->rights->commande->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->commande->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1915,7 +1922,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu } else if ($modulepart == 'massfilesarea_invoices') { - if ($fuser->rights->facture->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->facture->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1923,7 +1930,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu } else if ($modulepart == 'massfilesarea_expensereport') { - if ($fuser->rights->facture->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->facture->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1931,7 +1938,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu } else if ($modulepart == 'massfilesarea_interventions') { - if ($fuser->rights->ficheinter->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->ficheinter->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1939,7 +1946,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu } else if ($modulepart == 'massfilesarea_supplier_proposal' && !empty($conf->propal->dir_output)) { - if ($fuser->rights->supplier_proposal->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->supplier_proposal->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1947,7 +1954,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu } else if ($modulepart == 'massfilesarea_supplier_order') { - if ($fuser->rights->fournisseur->commande->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->fournisseur->commande->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1955,7 +1962,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu } else if ($modulepart == 'massfilesarea_supplier_invoice') { - if ($fuser->rights->fournisseur->facture->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->fournisseur->facture->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1965,7 +1972,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping for interventions else if (($modulepart == 'fichinter' || $modulepart == 'ficheinter') && !empty($conf->ficheinter->dir_output)) { - if ($fuser->rights->ficheinter->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->ficheinter->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1976,7 +1983,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping pour les deplacements et notes de frais else if ($modulepart == 'deplacement' && !empty($conf->deplacement->dir_output)) { - if ($fuser->rights->deplacement->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->deplacement->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1986,7 +1993,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping pour les propales else if ($modulepart == 'propal' && !empty($conf->propal->dir_output)) { - if ($fuser->rights->propale->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->propale->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -1998,7 +2005,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping pour les commandes else if (($modulepart == 'commande' || $modulepart == 'order') && !empty($conf->commande->dir_output)) { - if ($fuser->rights->commande->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->commande->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -2009,7 +2016,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping pour les projets else if ($modulepart == 'project' && !empty($conf->projet->dir_output)) { - if ($fuser->rights->projet->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->projet->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -2018,7 +2025,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu } else if ($modulepart == 'project_task' && !empty($conf->projet->dir_output)) { - if ($fuser->rights->projet->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->projet->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -2029,7 +2036,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping pour les commandes fournisseurs else if (($modulepart == 'commande_fournisseur' || $modulepart == 'order_supplier') && !empty($conf->fournisseur->commande->dir_output)) { - if ($fuser->rights->fournisseur->commande->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->fournisseur->commande->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -2040,7 +2047,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping pour les factures fournisseurs else if (($modulepart == 'facture_fournisseur' || $modulepart == 'invoice_supplier') && !empty($conf->fournisseur->facture->dir_output)) { - if ($fuser->rights->fournisseur->facture->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->fournisseur->facture->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -2050,7 +2057,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping pour les rapport de paiements else if ($modulepart == 'supplier_payment') { - if ($fuser->rights->fournisseur->facture->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->fournisseur->facture->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -2061,7 +2068,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping pour les rapport de paiements else if ($modulepart == 'facture_paiement' && !empty($conf->facture->dir_output)) { - if ($fuser->rights->facture->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->facture->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -2082,7 +2089,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping pour les expedition else if ($modulepart == 'expedition' && !empty($conf->expedition->dir_output)) { - if ($fuser->rights->expedition->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->expedition->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -2091,7 +2098,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping pour les bons de livraison else if ($modulepart == 'livraison' && !empty($conf->expedition->dir_output)) { - if ($fuser->rights->expedition->livraison->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->expedition->livraison->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -2101,7 +2108,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping pour les actions else if ($modulepart == 'actions' && !empty($conf->agenda->dir_output)) { - if ($fuser->rights->agenda->myactions->read || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->agenda->myactions->{$read} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -2111,7 +2118,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping pour les actions else if ($modulepart == 'actionsreport' && !empty($conf->agenda->dir_temp)) { - if ($fuser->rights->agenda->allactions->read || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->agenda->allactions->{$read} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -2121,7 +2128,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping pour les produits et services else if ($modulepart == 'product' || $modulepart == 'produit' || $modulepart == 'service' || $modulepart == 'produit|service') { - if (($fuser->rights->produit->lire || $fuser->rights->service->lire) || preg_match('/^specimen/i',$original_file)) + if (($fuser->rights->produit->{$lire} || $fuser->rights->service->{$lire}) || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -2132,7 +2139,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping pour les contrats else if ($modulepart == 'contract' && !empty($conf->contrat->dir_output)) { - if ($fuser->rights->contrat->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->contrat->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -2143,7 +2150,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping pour les dons else if ($modulepart == 'donation' && !empty($conf->don->dir_output)) { - if ($fuser->rights->don->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->don->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -2153,7 +2160,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping pour les remises de cheques else if ($modulepart == 'remisecheque' && !empty($conf->banque->dir_output)) { - if ($fuser->rights->banque->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->banque->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -2164,7 +2171,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping for bank else if ($modulepart == 'bank' && !empty($conf->bank->dir_output)) { - if ($fuser->rights->banque->lire) + if ($fuser->rights->banque->{$lire}) { $accessallowed=1; } @@ -2227,7 +2234,7 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // Wrapping pour Foundation module else if ($modulepart == 'member' && !empty($conf->adherent->dir_output)) { - if ($fuser->rights->adherent->lire || preg_match('/^specimen/i',$original_file)) + if ($fuser->rights->adherent->{$lire} || preg_match('/^specimen/i',$original_file)) { $accessallowed=1; } @@ -2248,12 +2255,6 @@ function dol_check_secure_access_document($modulepart,$original_file,$entity,$fu // If modulepart=module Allows any module to open a file if file is in directory called DOL_DATA_ROOT/modulepart else { - $lire='lire'; $read='read'; $download='download'; - if ($mode == 'write') - { - $lire='creer'; $read='write'; $download='upload'; - } - if (preg_match('/^specimen/i',$original_file)) $accessallowed=1; // If link to a file called specimen. Test must be done before changing $original_file int full path. if ($fuser->admin) $accessallowed=1; // If user is admin diff --git a/test/phpunit/FilesLibTest.php b/test/phpunit/FilesLibTest.php index ddfcb8ed217..819c44216fe 100644 --- a/test/phpunit/FilesLibTest.php +++ b/test/phpunit/FilesLibTest.php @@ -434,9 +434,48 @@ class FilesLibTest extends PHPUnit_Framework_TestCase //$dummyuser=new User($db); //$result=restrictedArea($dummyuser,'societe'); + + $user->rights->facture->lire = 0; + $user->rights->facture->creer = 0; + $filename='SPECIMEN.pdf'; // Filename relative to module part + $result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'read'); + $this->assertEquals(1,$result['accessallowed']); + + + // Check read permission + $user->rights->facture->lire = 1; + $user->rights->facture->creer = 1; + $filename='FA010101/FA010101.pdf'; // Filename relative to module part + $result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'read'); + $this->assertEquals(1,$result['accessallowed']); + + $user->rights->facture->lire = 0; + $user->rights->facture->creer = 0; + $filename='FA010101/FA010101.pdf'; // Filename relative to module part + $result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'read'); + $this->assertEquals(0,$result['accessallowed']); + + // Check write permission + $user->rights->facture->lire = 0; + $user->rights->facture->creer = 0; + $filename='FA010101/FA010101.pdf'; // Filename relative to module part + $result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'write'); + var_dump($result); + $this->assertEquals(0,$result['accessallowed']); + + $user->rights->facture->lire = 1; + $user->rights->facture->creer = 1; + $filename='FA010101/FA010101.pdf'; // Filename relative to module part + $result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'write'); + var_dump($result); + $this->assertEquals(1,$result['accessallowed']); - //$result=dol_check_secure_access_document($user,'societe'); - //$this->assertEquals(1,$result); + $user->rights->facture->lire = 1; + $user->rights->facture->creer = 0; + $filename='FA010101/FA010101.pdf'; // Filename relative to module part + $result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'write'); + var_dump($result); + $this->assertEquals(0,$result['accessallowed']); } - + } From 864dc0d9897dc2f84599b58fa5dc258e97ff89cb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 20 May 2017 11:59:32 +0200 Subject: [PATCH 199/299] Remove var_dump --- test/phpunit/FilesLibTest.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/test/phpunit/FilesLibTest.php b/test/phpunit/FilesLibTest.php index 819c44216fe..d1a5f48ae8d 100644 --- a/test/phpunit/FilesLibTest.php +++ b/test/phpunit/FilesLibTest.php @@ -460,21 +460,18 @@ class FilesLibTest extends PHPUnit_Framework_TestCase $user->rights->facture->creer = 0; $filename='FA010101/FA010101.pdf'; // Filename relative to module part $result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'write'); - var_dump($result); $this->assertEquals(0,$result['accessallowed']); $user->rights->facture->lire = 1; $user->rights->facture->creer = 1; $filename='FA010101/FA010101.pdf'; // Filename relative to module part $result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'write'); - var_dump($result); $this->assertEquals(1,$result['accessallowed']); $user->rights->facture->lire = 1; $user->rights->facture->creer = 0; $filename='FA010101/FA010101.pdf'; // Filename relative to module part $result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'write'); - var_dump($result); $this->assertEquals(0,$result['accessallowed']); } From 80cbc2838585997c50731d647059e8a78be3a10b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 20 May 2017 15:52:36 +0200 Subject: [PATCH 200/299] NEW Add REST API to push a file. --- htdocs/accountancy/admin/categories_list.php | 2 +- htdocs/accountancy/admin/journals_list.php | 2 +- htdocs/admin/dict.php | 4 +- htdocs/admin/mails_templates.php | 2 +- htdocs/api/admin/explorer.php | 2 + ....php => api_dictionarycountries.class.php} | 5 +- ...lass.php => api_dictionarytowns.class.php} | 5 +- htdocs/api/class/api_documents.class.php | 127 +++++++++++++----- htdocs/api/class/api_login.class.php | 2 +- htdocs/core/class/html.form.class.php | 2 +- htdocs/core/lib/functions.lib.php | 4 +- htdocs/core/modules/modResource.class.php | 2 +- .../install/mysql/migration/4.0.0-5.0.0.sql | 2 +- .../mysql/tables/llx_user_employment.sql | 2 +- htdocs/variants/generator.php | 14 +- test/phpunit/RestAPIDocumentTest.php | 21 ++- 16 files changed, 126 insertions(+), 72 deletions(-) rename htdocs/api/class/{api_dictionnarycountries.class.php => api_dictionarycountries.class.php} (97%) rename htdocs/api/class/{api_dictionnarytowns.class.php => api_dictionarytowns.class.php} (95%) diff --git a/htdocs/accountancy/admin/categories_list.php b/htdocs/accountancy/admin/categories_list.php index 86be6aa52ab..c0fa895ae4c 100644 --- a/htdocs/accountancy/admin/categories_list.php +++ b/htdocs/accountancy/admin/categories_list.php @@ -929,7 +929,7 @@ if ($id) { print ''; } else print ''; diff --git a/htdocs/accountancy/admin/journals_list.php b/htdocs/accountancy/admin/journals_list.php index facb507c530..1421d71be97 100644 --- a/htdocs/accountancy/admin/journals_list.php +++ b/htdocs/accountancy/admin/journals_list.php @@ -676,7 +676,7 @@ if ($id) { print ''; } else print ''; diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index 8319ccd0450..28db9ef8b49 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -1100,7 +1100,7 @@ if ($id) $reshook=$hookmanager->executeHooks('createDictionaryFieldlist',$parameters, $obj, $tmpaction); // Note that $action and $object may have been modified by some hooks $error=$hookmanager->error; $errors=$hookmanager->errors; - if ($id == 3) unset($fieldlist[2]); // Remove field ??? if dictionnary Regions + if ($id == 3) unset($fieldlist[2]); // Remove field ??? if dictionary Regions if (empty($reshook)) { @@ -1555,7 +1555,7 @@ if ($id) { print ''; } else print ''; diff --git a/htdocs/admin/mails_templates.php b/htdocs/admin/mails_templates.php index a403cf1f493..b9e5df738ad 100644 --- a/htdocs/admin/mails_templates.php +++ b/htdocs/admin/mails_templates.php @@ -767,7 +767,7 @@ if ($resql) { print ''; } else print ''; diff --git a/htdocs/api/admin/explorer.php b/htdocs/api/admin/explorer.php index c83d759dcd6..b09acb6772a 100644 --- a/htdocs/api/admin/explorer.php +++ b/htdocs/api/admin/explorer.php @@ -14,6 +14,8 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see . + * + * @deprecated Old explorer. Not using Swagger. See instead explorer in htdocs/api/index.php. */ /** diff --git a/htdocs/api/class/api_dictionnarycountries.class.php b/htdocs/api/class/api_dictionarycountries.class.php similarity index 97% rename from htdocs/api/class/api_dictionnarycountries.class.php rename to htdocs/api/class/api_dictionarycountries.class.php index ddb3e2474a9..070be509a8a 100644 --- a/htdocs/api/class/api_dictionnarycountries.class.php +++ b/htdocs/api/class/api_dictionarycountries.class.php @@ -27,7 +27,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/ccountry.class.php'; * @access protected * @class DolibarrApiAccess {@requires user,external} */ -class DictionnaryCountries extends DolibarrApi +class DictionaryCountries extends DolibarrApi { private $translations = null; @@ -93,7 +93,8 @@ class DictionnaryCountries extends DolibarrApi if ($result) { $num = $this->db->num_rows($result); - for ($i = 0; $i < min($num, ($limit <= 0 ? $num : $limit)); $i++) { + $min = min($num, ($limit <= 0 ? $num : $limit)); + for ($i = 0; $i < $min; $i++) { $obj = $this->db->fetch_object($result); $country = new Ccountry($this->db); if ($country->fetch($obj->rowid) > 0) { diff --git a/htdocs/api/class/api_dictionnarytowns.class.php b/htdocs/api/class/api_dictionarytowns.class.php similarity index 95% rename from htdocs/api/class/api_dictionnarytowns.class.php rename to htdocs/api/class/api_dictionarytowns.class.php index da58c9109eb..0ebcfbe0b17 100644 --- a/htdocs/api/class/api_dictionnarytowns.class.php +++ b/htdocs/api/class/api_dictionarytowns.class.php @@ -27,7 +27,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/ccountry.class.php'; * @access protected * @class DolibarrApiAccess {@requires user,external} */ -class DictionnaryTowns extends DolibarrApi +class DictionaryTowns extends DolibarrApi { /** * Constructor @@ -88,7 +88,8 @@ class DictionnaryTowns extends DolibarrApi if ($result) { $num = $this->db->num_rows($result); - for ($i = 0; $i < min($num, ($limit <= 0 ? $num : $limit)); $i++) { + $min = min($num, ($limit <= 0 ? $num : $limit)); + for ($i = 0; $i < $min; $i++) { $list[] = $this->db->fetch_object($result); } } else { diff --git a/htdocs/api/class/api_documents.class.php b/htdocs/api/class/api_documents.class.php index ca10b2befce..6650fc45401 100644 --- a/htdocs/api/class/api_documents.class.php +++ b/htdocs/api/class/api_documents.class.php @@ -58,23 +58,33 @@ class Documents extends DolibarrApi * * @return array * @throws RestException - * */ + /* public function get($module_part, $filename) { - } + }*/ /** - * Receive file + * Push a file. + * Test sample: { "filename": "mynewfile.txt", "modulepart": "facture", "ref": "FA1701-001", "subdir": "", "filecontent": "content text", "fileencoding": "" } * - * @param array $request_data Request datas - * - * @return bool State of copy + * @param string $filename Name of file to create ('FA1705-0123') + * @param string $modulepart Module part ('facture', ...) + * @param string $ref Reference of object (This will define subdir automatically and store submited file into it) + * @param string $subdir Subdirectory (Only if refname not provided) + * @param string $filecontent File content (string with file content. An empty file will be created if this parameter is not provided) + * @param string $fileencoding File encoding (''=no encoding, 'base64'=Base 64) + * @return bool State of copy * @throws RestException */ - public function post($request_data) { - global $conf; + public function post($filename, $modulepart, $ref='', $subdir='', $filecontent='', $fileencoding='') { + global $db, $conf; + + /*var_dump($modulepart); + var_dump($filename); + var_dump($filecontent); + exit;*/ require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; @@ -82,46 +92,89 @@ class Documents extends DolibarrApi throw new RestException(401); } - // Suppression de la chaine de caractere ../ dans $original_file - $original_file = str_replace("../","/", $request_data['name']); - $refname = str_replace("../","/", $request_data['refname']); + $newfilecontent = ''; + if (empty($fileencoding)) $newfilecontent = $filecontent; + if ($fileencoding == 'base64') $newfilecontent = base64_decode($filecontent); - // find the subdirectory name as the reference - if (empty($request_data['refname'])) $refname=basename(dirname($original_file)."/"); + $original_file = dol_sanitizeFileName($filename); + // Define $uploadir + $object = null; + $entity = $user->entity; + if ($ref) + { + if ($modulepart == 'facture' || $modulepart == 'invoice') + { + $modulepart='facture'; + $object=new Facture($db); + $result = $object->fetch('', $ref); + if (! ($result > 0)) + { + throw new RestException(500, 'The object '.$modulepart." with ref '".$ref."' was not found."); + } + if (! empty($entity)) + { + $tmpreldir = get_exdir(0, 0, 0, 0, $object, $modulepart); + $upload_dir = $conf->{$modulepart}->multidir_output[$entity].'/'.$tmpreldir.$object->ref; + } + else + { + $tmpreldir = get_exdir(0, 0, 0, 0, $object, $modulepart); + $upload_dir = $conf->{$modulepart}->dir_output.'/'.$tmpreldir.$object->ref; + } + } + + if (empty($upload_dir) || $upload_dir == '/') + { + throw new RestException(500, 'This value of modulepart does not support yet usage of refname. Check modulepart parameter or try to use subdir parameter instead of ref.'); + } + } + else + { + if ($modulepart == 'invoice') $modulepart ='facture'; + if (empty($conf->{$modulepart}->dir_output)) + { + throw new RestException(500, 'This value of modulepart is not supported with refname not defined.'); + } + $upload_dir = $conf->{$modulepart}->multidir_output[$entity]; + + if (empty($upload_dir) || $upload_dir == '/') + { + throw new RestException(500, 'This value of modulepart is not yet supported.'); + } + } + $upload_dir = dol_sanitizePathName($upload_dir); + // Security: - // On interdit les remontees de repertoire ainsi que les pipe dans - // les noms de fichiers. - if (preg_match('/\.\./',$original_file) || preg_match('/[<>|]/',$original_file)) - { - throw new RestException(401,'Refused to deliver file '.$original_file); - } - if (preg_match('/\.\./',$refname) || preg_match('/[<>|]/',$refname)) - { - throw new RestException(401,'Refused to deliver file '.$refname); - } - - $modulepart = $request_data['modulepart']; + // TODO Use dol_check_secure_access_document // Check mandatory fields - $result = $this->_validate_file($request_data); + //$result = $this->_validate_file($request_data); - $upload_dir = DOL_DATA_ROOT . '/' .$modulepart.'/'.dol_sanitizeFileName($refname); - $destfile = $upload_dir . $original_file; + $destfile = $upload_dir . '/' . $original_file; - if (!is_dir($upload_dir)) { + if (!dol_is_dir($upload_dir)) { throw new RestException(401,'Directory not exists : '.$upload_dir); } - $file = $_FILES['file']; - $srcfile = $file['tmp_name']; - $res = dol_move($srcfile, $destfile, 0, 1); - - if (!$res) { - throw new RestException(500); + if (dol_is_file($destfile)) + { + throw new RestException(500, "File with name '".$original_file."' already exists."); } - - return $res; + + $fhandle = fopen($destfile, 'w'); + if ($fhandle) + { + $nbofbyteswrote = fwrite($fhandle, $newfilecontent); + fclose($fhandle); + @chmod($destfile, octdec($conf->global->MAIN_UMASK)); + } + else + { + throw new RestException(500, 'Failed to open file for write'); + } + + return true; } /** diff --git a/htdocs/api/class/api_login.class.php b/htdocs/api/class/api_login.class.php index 76a9befebc9..9b965e24c33 100644 --- a/htdocs/api/class/api_login.class.php +++ b/htdocs/api/class/api_login.class.php @@ -36,7 +36,7 @@ class Login * * Request the API token for a couple username / password. * Using method POST is recommanded for security reasons (method GET is often logged by default by web servers with parameters so with login and pass into server log file). - * Both method are provided for developer conveniance. Best is to not use at all the login API method and enter directly the "api_key" into field at the top right of page (Note: "api_key" can be found/set on the user page). + * Both methods are provided for developer conveniance. Best is to not use at all the login API method and enter directly the "api_key" into field at the top right of page (Note: "api_key" can be found/set on the user page). * * @param string $login User login * @param string $password User password diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 26001e8e1f1..f58e96087b8 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -2502,7 +2502,7 @@ class Form } if ($objp->supplier_reputation) { - //TODO dictionnary + //TODO dictionary $reputations=array(''=>$langs->trans('Standard'),'FAVORITE'=>$langs->trans('Favorite'),'NOTTHGOOD'=>$langs->trans('NotTheGoodQualitySupplier'), 'DONOTORDER'=>$langs->trans('DoNotOrderThisProductToThisSupplier')); $opt .= " - ".$reputations[$objp->supplier_reputation]; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 09856131da7..2d3b1420e81 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -4555,8 +4555,8 @@ function yn($yesno, $case=1, $color=0) /** * Return a path to have a directory according to object. - * New usage: $conf->module->multidir_output[$object->entity].'/'.get_exdir(0, 0, 0, 1, $object, 'modulepart') - * or: $conf->module->dir_output.'/'.get_exdir(0, 0, 0, 1, $object, 'modulepart') if multidir_output not defined. + * New usage: $conf->module->multidir_output[$object->entity].'/'.get_exdir(0, 0, 0, 1, $object, $modulepart) + * or: $conf->module->dir_output.'/'.get_exdir(0, 0, 0, 1, $object, $modulepart) if multidir_output not defined. * Old usage: '015' with level 3->"0/1/5/", '015' with level 1->"5/", 'ABC-1' with level 3 ->"0/0/1/" * * @param string $num Id of object (deprecated, $object will be used in future) diff --git a/htdocs/core/modules/modResource.class.php b/htdocs/core/modules/modResource.class.php index f6674bdcfd7..020fa92e9f3 100644 --- a/htdocs/core/modules/modResource.class.php +++ b/htdocs/core/modules/modResource.class.php @@ -305,7 +305,7 @@ class modResource extends DolibarrModules ); //$this->import_convertvalue_array[$r]=array('s.fk_soc'=>array('rule'=>'lastrowid',table='t'); $this->import_regex_array[$r]=array('s.datec'=>'^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]( [0-9][0-9]:[0-9][0-9]:[0-9][0-9])?$'); - $this->import_examplevalues_array[$r]=array('r.ref'=>"REF1",'r.fk_code_type_resource'=>"Code from dictionnary resource type",'r.datec'=>"2017-01-01 or 2017-01-01 12:30:00"); + $this->import_examplevalues_array[$r]=array('r.ref'=>"REF1",'r.fk_code_type_resource'=>"Code from dictionary resource type",'r.datec'=>"2017-01-01 or 2017-01-01 12:30:00"); $this->import_updatekeys_array[$r]=array('r.rf'=>'ResourceFormLabel_ref'); } diff --git a/htdocs/install/mysql/migration/4.0.0-5.0.0.sql b/htdocs/install/mysql/migration/4.0.0-5.0.0.sql index 7eb08612611..a750581ae49 100644 --- a/htdocs/install/mysql/migration/4.0.0-5.0.0.sql +++ b/htdocs/install/mysql/migration/4.0.0-5.0.0.sql @@ -218,7 +218,7 @@ create table llx_user_employment tms timestamp, fk_user_creat integer, fk_user_modif integer, - job varchar(128), -- job position. may be a dictionnary + job varchar(128), -- job position. may be a dictionary status integer NOT NULL, -- draft, active, closed salary double(24,8), -- last and current value stored into llx_user salaryextra double(24,8), -- last and current value stored into llx_user diff --git a/htdocs/install/mysql/tables/llx_user_employment.sql b/htdocs/install/mysql/tables/llx_user_employment.sql index 4dfa2548c2f..80520ce3dd8 100644 --- a/htdocs/install/mysql/tables/llx_user_employment.sql +++ b/htdocs/install/mysql/tables/llx_user_employment.sql @@ -28,7 +28,7 @@ create table llx_user_employment tms timestamp, fk_user_creat integer, fk_user_modif integer, - job varchar(128), -- job position. may be a dictionnary + job varchar(128), -- job position. may be a dictionary status integer NOT NULL, -- draft, active, closed salary double(24,8), -- last and current value stored into llx_user salaryextra double(24,8), -- last and current value stored into llx_user diff --git a/htdocs/variants/generator.php b/htdocs/variants/generator.php index 7b0358fd176..d4162899874 100644 --- a/htdocs/variants/generator.php +++ b/htdocs/variants/generator.php @@ -162,19 +162,19 @@ if (! empty($id) || ! empty($ref)) { print_fiche_titre($langs->trans('ProductCombinationGenerator')); - $dictionnary_attr = array(); + $dictionary_attr = array(); foreach ($prodattr->fetchAll() as $attr) { - $dictionnary_attr[$attr->id] = $attr; + $dictionary_attr[$attr->id] = $attr; foreach ($prodattrval->fetchAllByProductAttribute($attr->id) as $attrval) { - $dictionnary_attr[$attr->id]->values[$attrval->id] = $attrval; + $dictionary_attr[$attr->id]->values[$attrval->id] = $attrval; } } ?> '; } + print ''."\n"; print '
      -> + print "
      -> ".$value['fullpath']." (".$value['nb'].") ".$value['nb_total']."   ".$value['stock']." ".$img."
'.$langs->trans("SendingsToValidate").'
'; + print '
'; print $shipment->getNomUrl(1); print "'; @@ -142,7 +140,6 @@ if ($resql) print ''; print ''; print ''; - $var = True; while ($i < $num) { $obj = $db->fetch_object($resql); @@ -154,8 +151,7 @@ if ($resql) $orderstatic->facturee=0; $companystatic->name=$obj->name; - $companystatic->id=$obj->socid; - + $companystatic->id=$obj->socid; print ''; print '\n"; + + print "
'.$langs->trans("OrdersToProcess").'
'; @@ -204,7 +200,6 @@ if ( $resql ) print ''; print ''; print ''; - $var = True; while ($i < $num) { $obj = $db->fetch_object($resql); @@ -216,10 +211,9 @@ if ( $resql ) $orderstatic->facturee=$obj->billed; $companystatic->name=$obj->name; - $companystatic->id=$obj->socid; - + $companystatic->id=$obj->socid; - print "'; print ''."\n"; } - print "
'.$langs->trans("OrdersInProcess").'
"; + print '
'; print $orderstatic->getNomUrl(1); print ''; @@ -264,16 +258,14 @@ if ($resql) $i = 0; print ''; print ''; - print ''; - $var = True; + print ''; while ($i < $num) { $obj = $db->fetch_object($resql); $shipment->id=$obj->rowid; $shipment->ref=$obj->ref; - $shipment->ref_customer=$obj->ref_customer; - + $shipment->ref_customer=$obj->ref_customer; print '';*/ print ''; $oldyear=0; -$var=true; foreach ($data as $val) { $year = $val['year']; @@ -278,7 +277,7 @@ foreach ($data as $val) $oldyear--; - print ''; + print ''; print ''; print ''; @@ -286,9 +285,8 @@ foreach ($data as $val) print '';*/ print ''; } - - print ''; + print ''; print '
'.$langs->trans("LastSendings",$num).'
'.$langs->trans("LastSendings", $num).'
'; print $shipment->getNomUrl(1); diff --git a/htdocs/expedition/stats/index.php b/htdocs/expedition/stats/index.php index cccfc0d90a0..53837c76fd1 100644 --- a/htdocs/expedition/stats/index.php +++ b/htdocs/expedition/stats/index.php @@ -269,7 +269,6 @@ print ''.$langs->trans("AmountAverage").'
'.$oldyear.'00
'; if ($year) print ''.$year.''; else print $langs->trans("ValidationDateNotDefinedEvenIfShipmentValidated"); From ce84990414d00d4e5a74f73bf68bdb456f84628a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 16 May 2017 02:43:05 +0200 Subject: [PATCH 137/299] NEW On invoices generated by template, we save if of source template. --- htdocs/compta/facture/class/facture-rec.class.php | 4 +++- htdocs/compta/facture/class/facture.class.php | 5 ++++- htdocs/compta/facture/fiche-rec.php | 5 +++-- htdocs/install/mysql/migration/5.0.0-6.0.0.sql | 2 +- htdocs/install/mysql/tables/llx_facture.sql | 3 ++- htdocs/langs/en_US/other.lang | 12 ++++++++++++ 6 files changed, 25 insertions(+), 6 deletions(-) diff --git a/htdocs/compta/facture/class/facture-rec.class.php b/htdocs/compta/facture/class/facture-rec.class.php index ef23a30b878..927be3fa25e 100644 --- a/htdocs/compta/facture/class/facture-rec.class.php +++ b/htdocs/compta/facture/class/facture-rec.class.php @@ -446,7 +446,7 @@ class FactureRec extends CommonInvoice } else { - $this->error=$this->db-lasterror(); + $this->error=$this->db->lasterror(); return -3; } } @@ -849,6 +849,8 @@ class FactureRec extends CommonInvoice $facture = new Facture($db); $facture->fac_rec = $facturerec->id; // We will create $facture from this recurring invoice + $facture->fk_fac_rec_source = $facturerec->id; // We will create $facture from this recurring invoice + $facture->type = self::TYPE_STANDARD; $facture->brouillon = 1; $facture->date = $facturerec->date_when; // We could also use dol_now here but we prefer date_when so invoice has real date when we would like even if we generate later. diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index 844e217cccb..e46b5718d22 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -279,6 +279,8 @@ class Facture extends CommonInvoice // Create invoice from a template invoice if ($this->fac_rec > 0) { + $this->fk_fac_rec_source = $this->fac_rec; + require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture-rec.class.php'; $_facrec = new FactureRec($this->db); $result=$_facrec->fetch($this->fac_rec); @@ -386,7 +388,7 @@ class Facture extends CommonInvoice $sql.= ", note_public"; $sql.= ", ref_client, ref_int"; $sql.= ", fk_account"; - $sql.= ", fk_facture_source, fk_user_author, fk_projet"; + $sql.= ", fk_fac_rec_source, fk_facture_source, fk_user_author, fk_projet"; $sql.= ", fk_cond_reglement, fk_mode_reglement, date_lim_reglement, model_pdf"; $sql.= ", situation_cycle_ref, situation_counter, situation_final"; $sql.= ", fk_incoterms, location_incoterms"; @@ -410,6 +412,7 @@ class Facture extends CommonInvoice $sql.= ", ".($this->ref_client?"'".$this->db->escape($this->ref_client)."'":"null"); $sql.= ", ".($this->ref_int?"'".$this->db->escape($this->ref_int)."'":"null"); $sql.= ", ".($this->fk_account>0?$this->fk_account:'NULL'); + $sql.= ", ".($this->fk_fac_rec_source?"'".$this->db->escape($this->fk_fac_rec_source)."'":"null"); $sql.= ", ".($this->fk_facture_source?"'".$this->db->escape($this->fk_facture_source)."'":"null"); $sql.= ", ".($user->id > 0 ? "'".$user->id."'":"null"); $sql.= ", ".($this->fk_project?$this->fk_project:"null"); diff --git a/htdocs/compta/facture/fiche-rec.php b/htdocs/compta/facture/fiche-rec.php index acf97a3893a..773f04d2ca0 100644 --- a/htdocs/compta/facture/fiche-rec.php +++ b/htdocs/compta/facture/fiche-rec.php @@ -44,6 +44,7 @@ require_once DOL_DOCUMENT_ROOT . '/core/lib/invoice.lib.php'; $langs->load('bills'); $langs->load('compta'); $langs->load('admin'); +$langs->load('other'); // Security check $id=(GETPOST('facid','int')?GETPOST('facid','int'):GETPOST('id','int')); @@ -940,7 +941,7 @@ if ($action == 'create') '__INVOICE_YEAR__' => $langs->trans("PreviousYearOfInvoice").' ('.$langs->trans("Example").': '.dol_print_date($object->date,'%Y').')', '__INVOICE_NEXT_YEAR__' => $langs->trans("NextYearOfInvoice").' ('.$langs->trans("Example").': '.dol_print_date(dol_time_plus_duree($object->date, 1, 'y'),'%Y').')' ); - $substitutionarray['__(TRANSKEY)__']=$langs->trans("TransKey"); + $substitutionarray['__(TransKey)__']=$langs->trans("TransKey"); $htmltext = ''.$langs->trans("FollowingConstantsWillBeSubstituted").':
'; foreach($substitutionarray as $key => $val) @@ -1258,7 +1259,7 @@ else '__INVOICE_YEAR__' => $langs->trans("PreviousYearOfInvoice").' ('.$langs->trans("Example").': '.dol_print_date($dateexample,'%Y').')', '__INVOICE_NEXT_YEAR__' => $langs->trans("NextYearOfInvoice").' ('.$langs->trans("Example").': '.dol_print_date(dol_time_plus_duree($dateexample, 1, 'y'),'%Y').')' ); - $substitutionarray['__(TRANSKEY)__']=$langs->trans("TransKey"); + $substitutionarray['__(TransKey)__']=$langs->trans("TransKey"); $htmltext = ''.$langs->trans("FollowingConstantsWillBeSubstituted").':
'; foreach($substitutionarray as $key => $val) diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index 7572e0d2030..88260498f28 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -278,7 +278,7 @@ insert into llx_c_tva(fk_pays,taux,code,recuperableonly,localtax1,localtax1_type ALTER TABLE llx_events MODIFY COLUMN ip varchar(250); - +ALTER TABLE llx_facture ADD COLUMN fk_fac_rec_source integer; diff --git a/htdocs/install/mysql/tables/llx_facture.sql b/htdocs/install/mysql/tables/llx_facture.sql index aaf467a06b0..014572cd7e6 100644 --- a/htdocs/install/mysql/tables/llx_facture.sql +++ b/htdocs/install/mysql/tables/llx_facture.sql @@ -63,7 +63,8 @@ create table llx_facture fk_user_modif integer, -- user making last change fk_user_valid integer, -- user validating - fk_facture_source integer, -- facture origine si facture avoir + fk_fac_rec_source integer, -- facture rec source + fk_facture_source integer, -- facture origin if credit notes or replacement invoice fk_projet integer DEFAULT NULL, -- projet auquel est associee la facture fk_account integer, -- bank account diff --git a/htdocs/langs/en_US/other.lang b/htdocs/langs/en_US/other.lang index a37927566e3..11a09af3373 100644 --- a/htdocs/langs/en_US/other.lang +++ b/htdocs/langs/en_US/other.lang @@ -9,6 +9,18 @@ BirthdayDate=Birthday date DateToBirth=Date of birth BirthdayAlertOn=birthday alert active BirthdayAlertOff=birthday alert inactive +TransKey=Translation of the key TransKey +MonthOfInvoice=Month (number 1-12) of invoice date +TextMonthOfInvoice=Month (tex) of invoice date +PreviousMonthOfInvoice=Previous month (number 1-12) of invoice date +TextPreviousMonthOfInvoice=Previous month (text) of invoice date +NextMonthOfInvoice=Following month (number 1-12) of invoice date +TextNextMonthOfInvoice=Following month (text) of invoice date + +YearOfInvoice=Year of invoice date +PreviousYearOfInvoice=Previous year of invoice date +NextYearOfInvoice=Following year of invoice date + Notify_FICHINTER_ADD_CONTACT=Added contact to Intervention Notify_FICHINTER_VALIDATE=Intervention validated Notify_FICHINTER_SENTBYMAIL=Intervention sent by mail From ab444ce73049adaf09625d0ab33b5f657e51d243 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 16 May 2017 03:02:00 +0200 Subject: [PATCH 138/299] Prepare for module collab/pad --- build/rpm/dolibarr_fedora.spec | 5 +- build/rpm/dolibarr_generic.spec | 11 +- build/rpm/dolibarr_mandriva.spec | 4 +- build/rpm/dolibarr_opensuse.spec | 5 +- htdocs/collab/index.php | 507 +++++++++++++++++++++++++++++++ 5 files changed, 521 insertions(+), 11 deletions(-) create mode 100644 htdocs/collab/index.php diff --git a/build/rpm/dolibarr_fedora.spec b/build/rpm/dolibarr_fedora.spec index fb818e285fb..a0f981b8c11 100755 --- a/build/rpm/dolibarr_fedora.spec +++ b/build/rpm/dolibarr_fedora.spec @@ -18,8 +18,8 @@ License: GPLv3+ #Packager: Laurent Destailleur (Eldy) Vendor: Dolibarr dev team -URL: http://www.dolibarr.org -Source0: http://www.dolibarr.org/files/lastbuild/package_rpm_redhat-fedora/%{name}-%{version}.tgz +URL: https://www.dolibarr.org +Source0: https://www.dolibarr.org/files/lastbuild/package_rpm_redhat-fedora/%{name}-%{version}.tgz Patch0: %{name}-forrpm.patch BuildArch: noarch BuildRoot: %{_tmppath}/%{name}-%{version}-build @@ -165,6 +165,7 @@ done >>%{name}.lang %_datadir/dolibarr/htdocs/bookmarks %_datadir/dolibarr/htdocs/cashdesk %_datadir/dolibarr/htdocs/categories +%_datadir/dolibarr/htdocs/collab %_datadir/dolibarr/htdocs/comm %_datadir/dolibarr/htdocs/commande %_datadir/dolibarr/htdocs/compta diff --git a/build/rpm/dolibarr_generic.spec b/build/rpm/dolibarr_generic.spec index 7b12a20eebb..446e0e0d5f7 100755 --- a/build/rpm/dolibarr_generic.spec +++ b/build/rpm/dolibarr_generic.spec @@ -26,17 +26,17 @@ License: GPL-3.0+ #Packager: Laurent Destailleur (Eldy) Vendor: Dolibarr dev team -URL: http://www.dolibarr.org +URL: https://www.dolibarr.org %if 0%{?fedora} || 0%{?rhel_version} || 0%{?centos_version} -Source0: http://www.dolibarr.org/files/lastbuild/package_rpm_redhat-fedora/%{name}-%{version}.tgz +Source0: https://www.dolibarr.org/files/lastbuild/package_rpm_redhat-fedora/%{name}-%{version}.tgz %else %if 0%{?mdkversion} -Source0: http://www.dolibarr.org/files/lastbuild/package_rpm_mandriva/%{name}-%{version}.tgz +Source0: https://www.dolibarr.org/files/lastbuild/package_rpm_mandriva/%{name}-%{version}.tgz %else %if 0%{?suse_version} -Source0: http://www.dolibarr.org/files/lastbuild/package_rpm_opensuse/%{name}-%{version}.tgz +Source0: https://www.dolibarr.org/files/lastbuild/package_rpm_opensuse/%{name}-%{version}.tgz %else -Source0: http://www.dolibarr.org/files/lastbuild/package_rpm_generic/%{name}-%{version}.tgz +Source0: https://www.dolibarr.org/files/lastbuild/package_rpm_generic/%{name}-%{version}.tgz %endif %endif %endif @@ -245,6 +245,7 @@ done >>%{name}.lang %_datadir/dolibarr/htdocs/bookmarks %_datadir/dolibarr/htdocs/cashdesk %_datadir/dolibarr/htdocs/categories +%_datadir/dolibarr/htdocs/collab %_datadir/dolibarr/htdocs/comm %_datadir/dolibarr/htdocs/commande %_datadir/dolibarr/htdocs/compta diff --git a/build/rpm/dolibarr_mandriva.spec b/build/rpm/dolibarr_mandriva.spec index fd35227a242..1fb1b7fcc75 100755 --- a/build/rpm/dolibarr_mandriva.spec +++ b/build/rpm/dolibarr_mandriva.spec @@ -18,8 +18,8 @@ License: GPL-3.0+ #Packager: Laurent Destailleur (Eldy) Vendor: Dolibarr dev team -URL: http://www.dolibarr.org -Source0: http://www.dolibarr.org/files/lastbuild/package_rpm_mandriva/%{name}-%{version}.tgz +URL: https://www.dolibarr.org +Source0: https://www.dolibarr.org/files/lastbuild/package_rpm_mandriva/%{name}-%{version}.tgz Patch0: %{name}-forrpm.patch BuildArch: noarch BuildRoot: %{_tmppath}/%{name}-%{version}-build diff --git a/build/rpm/dolibarr_opensuse.spec b/build/rpm/dolibarr_opensuse.spec index 02a5f8a1819..1bb7ef061e6 100755 --- a/build/rpm/dolibarr_opensuse.spec +++ b/build/rpm/dolibarr_opensuse.spec @@ -18,8 +18,8 @@ License: GPL-3.0+ #Packager: Laurent Destailleur (Eldy) Vendor: Dolibarr dev team -URL: http://www.dolibarr.org -Source0: http://www.dolibarr.org/files/lastbuild/package_rpm_opensuse/%{name}-%{version}.tgz +URL: https://www.dolibarr.org +Source0: https://www.dolibarr.org/files/lastbuild/package_rpm_opensuse/%{name}-%{version}.tgz Patch0: %{name}-forrpm.patch BuildArch: noarch BuildRoot: %{_tmppath}/%{name}-%{version}-build @@ -173,6 +173,7 @@ done >>%{name}.lang %_datadir/dolibarr/htdocs/bookmarks %_datadir/dolibarr/htdocs/cashdesk %_datadir/dolibarr/htdocs/categories +%_datadir/dolibarr/htdocs/collab %_datadir/dolibarr/htdocs/comm %_datadir/dolibarr/htdocs/commande %_datadir/dolibarr/htdocs/compta diff --git a/htdocs/collab/index.php b/htdocs/collab/index.php new file mode 100644 index 00000000000..0c892c4e776 --- /dev/null +++ b/htdocs/collab/index.php @@ -0,0 +1,507 @@ + + * + * 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 3 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/collab/index.php + * \ingroup collab + * \brief Page to work on a shared document (PAD) + */ + +define('NOSCANPOSTFORINJECTION',1); +define('NOSTYLECHECK',1); + + +/** + * Show HTML header HTML + BODY + Top menu + left menu + DIV + * + * @param string $head Optionnal head lines + * @param string $title HTML title + * @param string $help_url Url links to help page + * Syntax is: For a wiki page: EN:EnglishPage|FR:FrenchPage|ES:SpanishPage + * For other external page: http://server/url + * @param string $target Target to use on links + * @param int $disablejs More content into html header + * @param int $disablehead More content into html header + * @param array $arrayofjs Array of complementary js files + * @param array $arrayofcss Array of complementary css files + * @param string $morequerystring Query string to add to the link "print" to get same parameters (set this only if autodetect fails) + * @return void + */ +function llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='') +{ + global $conf; + + // html header + top_htmlhead($head, $title, $disablejs, $disablehead, $arrayofjs, $arrayofcss); + + print ''; + + // top menu and left menu area + if (empty($conf->dol_hide_topmenu)) + { + top_menu($head, $title, $target, $disablejs, $disablehead, $arrayofjs, $arrayofcss, $morequerystring, $help_url); + } + if (empty($conf->dol_hide_leftmenu)) + { + left_menu('', $help_url, '', '', 1, $title, 1); + } + + // main area + //main_area($title); + print ''."\n".'
'."\n"; +} + + + +require '../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + +$langs->load("admin"); +$langs->load("other"); +$langs->load("website"); + +if (! $user->admin) accessforbidden(); + +if (! ((GETPOST('testmenuhider') || ! empty($conf->global->MAIN_TESTMENUHIDER)) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER))) +{ + $conf->dol_hide_leftmenu = 1; // Force hide of left menu. +} + +$error=0; +$website=GETPOST('website', 'alpha'); +$page=GETPOST('page', 'alpha'); +$pageid=GETPOST('pageid', 'int'); +$action=GETPOST('action','alpha'); + +if (GETPOST('delete')) { $action='delete'; } +if (GETPOST('preview')) $action='preview'; +if (GETPOST('create')) { $action='create'; } +if (GETPOST('editmedia')) { $action='editmedia'; } +if (GETPOST('editcss')) { $action='editcss'; } +if (GETPOST('editmenu')) { $action='editmenu'; } +if (GETPOST('setashome')) { $action='setashome'; } +if (GETPOST('editmeta')) { $action='editmeta'; } +if (GETPOST('editcontent')) { $action='editcontent'; } + +if (empty($action)) $action='preview'; + + + + +/* + * Actions + */ + +if (GETPOST('refreshsite')) $pageid=0; // If we change the site, we reset the pageid. +if (GETPOST('refreshpage')) $action='preview'; + + +// Add a collab page +if ($action == 'add') +{ + $db->begin(); + + $objectpage->title = GETPOST('WEBSITE_TITLE'); + $objectpage->pageurl = GETPOST('WEBSITE_PAGENAME'); + $objectpage->description = GETPOST('WEBSITE_DESCRIPTION'); + $objectpage->keywords = GETPOST('WEBSITE_KEYWORD'); + + if (empty($objectpage->title)) + { + setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("WEBSITE_PAGENAME")), null, 'errors'); + $error++; + } + + if (! $error) + { + $res = $objectpage->create($user); + if ($res <= 0) + { + $error++; + setEventMessages($objectpage->error, $objectpage->errors, 'errors'); + } + } + if (! $error) + { + $db->commit(); + setEventMessages($langs->trans("PageAdded", $objectpage->pageurl), null, 'mesgs'); + $action=''; + } + else + { + $db->rollback(); + } + + $action = 'preview'; + $id = $objectpage->id; +} + +// Update page +if ($action == 'delete') +{ + $db->begin(); + + $res = $object->fetch(0, $website); + + $res = $objectpage->fetch($pageid, $object->fk_website); + + if ($res > 0) + { + $res = $objectpage->delete($user); + if (! $res > 0) + { + $error++; + setEventMessages($objectpage->error, $objectpage->errors, 'errors'); + } + + if (! $error) + { + $db->commit(); + setEventMessages($langs->trans("PageDeleted", $objectpage->pageurl, $website), null, 'mesgs'); + + header("Location: ".$_SERVER["PHP_SELF"].'?website='.$website); + exit; + } + else + { + $db->rollback(); + } + } + else + { + dol_print_error($db); + } +} + + + +/* + * View + */ + +$form = new Form($db); + +$help_url=''; + +llxHeader('', $langs->trans("WebsiteSetup"), $help_url); + +print "\n".'
'; +print ''; +if ($action == 'create') +{ + print ''; +} + + +// Add a margin under toolbar ? +$style=''; +if ($action != 'preview' && $action != 'editcontent') $style=' margin-bottom: 5px;'; + +//var_dump($objectpage);exit; +print '
'; + +if (count($object->records) > 0) +{ + // ***** Part for web sites + + print '
'; + print $langs->trans("Website").': '; + print '
'; + + // List of websites + print '
'; + $out=''; + $out.=''; + $out.=ajax_combobox('website'); + print $out; + print ''; + + if ($website) + { + $virtualurl=''; + $dataroot=DOL_DATA_ROOT.'/websites/'.$website; + if (! empty($object->virtualhost)) $virtualurl=$object->virtualhost; + } + + if ($website && $action == 'preview') + { + $disabled=''; + if (empty($user->rights->websites->write)) $disabled=' disabled="disabled"'; + + print '   '; + + //print ''; + print ''; + print ''; + print ''; + } + + print '
'; + + // Button for websites + print '
'; + + if ($action == 'preview') + { + print '
'; + print ''; + //print ''; + $htmltext=$langs->trans("SetHereVirtualHost", $dataroot); + print $form->textwithpicto('', $htmltext); + print '
'; + + $urlext=$virtualurl; + $urlint=$urlwithroot.'/public/websites/index.php?website='.$website; + //if (! empty($object->virtualhost)) + //{ + print 'transnoentitiesnoconv("Site"), $langs->transnoentitiesnoconv("Site"), $dataroot, $urlext)).'">'; + print $form->textwithpicto('', $langs->trans("PreviewSiteServedByWebServer", $langs->transnoentitiesnoconv("Site"), $langs->transnoentitiesnoconv("Site"), $dataroot, $urlext?$urlext:$langs->trans("VirtualHostUrlNotDefined")), 1, 'preview_ext'); + print ''; + //} + + print 'transnoentitiesnoconv("Site"), $langs->transnoentitiesnoconv("Site"), $urlint)).'">'; + print $form->textwithpicto('', $langs->trans("PreviewSiteServedByDolibarr", $langs->transnoentitiesnoconv("Site"), $langs->transnoentitiesnoconv("Site"), $urlint, $dataroot), 1, 'preview'); + print ''; + } + + if (in_array($action, array('editcss','editmenu','create'))) + { + if ($action != 'preview') print ''; + if (preg_match('/^create/',$action)) print ''; + if (preg_match('/^edit/',$action)) print ''; + } + + print '
'; + + + // ***** Part for pages + + if ($website) + { + print '
'; + + $array=$objectpage->fetchAll($object->id); + if (! is_array($array) && $array < 0) dol_print_error('', $objectpage->error, $objectpage->errors); + $atleastonepage=(is_array($array) && count($array) > 0); + + print '
'; + print '
'; + print $langs->trans("Page").': '; + print '
'; + print '
'; + + if ($action != 'add') + { + $out=''; + $out.=''; + $out.=ajax_combobox('pageid'); + print $out; + } + else + { + print $langs->trans("New"); + } + + print ''; + //print $form->selectarray('page', $array); + + if ($action == 'preview') + { + $disabled=''; + if (empty($user->rights->websites->write)) $disabled=' disabled="disabled"'; + + if ($pageid > 0) + { + print '   '; + + if ($object->fk_default_home > 0 && $pageid == $object->fk_default_home) print ''; + else print ''; + print ''; + print ''; + //print ''.dol_escape_htmltag($langs->trans("EditPageMeta")).''; + //print ''.dol_escape_htmltag($langs->trans("EditPageContent")).''; + print ''; + } + } + + print '
'; + print '
'; + print '
'; + + print '
'; + + if ($website && $pageid > 0 && $action == 'preview') + { + $websitepage = new WebSitePage($db); + $websitepage->fetch($pageid); + + $realpage=$urlwithroot.'/public/websites/index.php?website='.$website.'&page='.$pageid; + $pagealias = $websitepage->pageurl; + + print '
'; + print ''; + //print ''; + $htmltext=$langs->trans("WEBSITE_PAGENAME", $pagealias); + print $form->textwithpicto('', $htmltext); + print '
'; + + if (! empty($object->virtualhost)) + { + $urlext=$virtualurl.'/'.$pagealias.'.php'; + print 'transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $dataroot, $urlext)).'">'; + print $form->textwithpicto('', $langs->trans("PreviewSiteServedByWebServer", $langs->transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $dataroot, $urlext?$urlext:$langs->trans("VirtualHostUrlNotDefined")), 1, 'preview_ext'); + print ''; + } + else + { + print ''; + print $form->textwithpicto('', $langs->trans("PreviewSiteServedByWebServer", $langs->transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $dataroot, $urlext?$urlext:$langs->trans("VirtualHostUrlNotDefined")), 1, 'preview_ext'); + print ''; + } + + print 'transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $realpage)).'">'; + print $form->textwithpicto('', $langs->trans("PreviewSiteServedByDolibarr", $langs->transnoentitiesnoconv("Page"), $langs->transnoentitiesnoconv("Page"), $realpage, $dataroot), 1, 'preview'); + print ''; // View page in new Tab + //print ''; + + // TODO Add js to save alias like we save virtual host name and use dynamic virtual host for url of id=previewpageext + } + if (! in_array($action, array('editcss','editmenu','create'))) + { + if ($action != 'preview') print ''; + if (preg_match('/^create/',$action)) print ''; + if (preg_match('/^edit/',$action)) print ''; + } + + print '
'; + + if ($action == 'preview') + { + // Adding jquery code to change on the fly url of preview ext + if (! empty($conf->use_javascript_ajax)) + { + print ''; + } + } + } +} +else +{ + print '
'; + $langs->load("errors"); + print $langs->trans("ErrorModuleSetupNotComplete"); + print '
'; + $action=''; +} + + +print '
'; + +$head = array(); + +if ($action == 'editcontent') +{ + /* + * Editing global variables not related to a specific theme + */ + + $csscontent = @file_get_contents($filecss); + + $contentforedit = ''; + /*$contentforedit.=''."\n";*/ + $contentforedit .= $objectpage->content; + + require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; + $doleditor=new DolEditor('PAGE_CONTENT',$contentforedit,'',500,'Full','',true,true,true,ROWS_5,'90%'); + $doleditor->Create(0, '', false); +} + +print "
\n\n"; + + + + +llxFooter(); + +$db->close(); From cc95e046e52ae44e35ff6e64e38e56351fe6191f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 16 May 2017 03:34:49 +0200 Subject: [PATCH 139/299] NEW Can sort customer balance summary on date --- htdocs/compta/recap-compta.php | 50 ++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/htdocs/compta/recap-compta.php b/htdocs/compta/recap-compta.php index 2a1234fccc1..a383f841a47 100644 --- a/htdocs/compta/recap-compta.php +++ b/htdocs/compta/recap-compta.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2016 Laurent Destailleur + * Copyright (C) 2004-2017 Laurent Destailleur * * 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 @@ -39,6 +39,30 @@ $result = restrictedArea($user, 'societe', $id, '&societe'); $object = new Societe($db); if ($id > 0) $object->fetch($id); +// Load variable for pagination +$limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit; +$sortfield = GETPOST('sortfield','alpha'); +$sortorder = GETPOST('sortorder','alpha'); +$page = GETPOST('page','int'); +if ($page == -1) { $page = 0; } +$offset = $limit * $page; +$pageprev = $page - 1; +$pagenext = $page + 1; +if (! $sortfield) $sortfield="f.datef"; // Set here default search field +if (! $sortorder) $sortorder="DESC"; + + +$arrayfields=array( + 'f.datef'=>array('label'=>"Date", 'checked'=>1), + //... +); + +/* + * Actions + */ + +// None + /* * View @@ -55,10 +79,10 @@ llxHeader('',$title,$help_url); if ($id > 0) { - /* - * Affichage onglets - */ - $head = societe_prepare_head($object); + $param=''; + if ($id > 0) $param.='&socid='.$id; + + $head = societe_prepare_head($object); dol_fiche_head($head, 'customer', $langs->trans("ThirdParty"), 0, 'company'); dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom', '', '', 0, '', '', 1); @@ -71,7 +95,7 @@ if ($id > 0) print ''; print ''; - print ''; + if (! empty($arrayfields['f.datef']['checked'])) print_liste_field_titre($arrayfields['f.datef']['label'],$_SERVER["PHP_SELF"],"f.datef","",$param,'align="center" class="nowrap"',$sortfield,$sortorder); print ''; print ''; print ''; @@ -90,7 +114,7 @@ if ($id > 0) $sql.= " WHERE f.fk_soc = s.rowid AND s.rowid = ".$object->id; $sql.= " AND f.entity = ".$conf->entity; $sql.= " AND f.fk_user_valid = u.rowid"; - $sql.= " ORDER BY f.datef ASC"; + $sql.= $db->order($sortfield, $sortorder); $resql=$db->query($sql); if ($resql) @@ -177,13 +201,13 @@ if ($id > 0) } if(empty($TData)) { - print ''; + print ''; } else { - + // Sort array by date asort($TDataSort); array_multisort($TData,$TDataSort); - + // Balance calculation foreach($TData as &$data1) { $balance += $data1['amount']; @@ -191,7 +215,8 @@ if ($id > 0) } // Reverse array to have last elements on top - $TData = array_reverse($TData); + $TData = dol_sort_array($TData, 'date', $sortorder); + $totalDebit = 0; $totalCredit = 0; @@ -223,7 +248,8 @@ if ($id > 0) print ''; print ''; print ''; - print ''; + print ''; + print ''; print "\n"; } From c9738aa7ea0fa41af59963cc27144bdec4f1c866 Mon Sep 17 00:00:00 2001 From: arnaud Date: Tue, 16 May 2017 11:34:00 +0200 Subject: [PATCH 140/299] FIX doactions hook missing in invoice model page --- htdocs/compta/facture/fiche-rec.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/htdocs/compta/facture/fiche-rec.php b/htdocs/compta/facture/fiche-rec.php index 289ac8d704a..a6b238ba3c7 100644 --- a/htdocs/compta/facture/fiche-rec.php +++ b/htdocs/compta/facture/fiche-rec.php @@ -124,6 +124,10 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab * Actions */ +$parameters = array('socid' => $socid); +$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks +if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + // Set note include DOL_DOCUMENT_ROOT.'/core/actions_setnotes.inc.php'; // Must be include, not include_once From cc16bb0befc906751b4dc29d22ac0497d17c20b4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 16 May 2017 12:22:55 +0200 Subject: [PATCH 141/299] Debug default value feature. --- htdocs/admin/defaultvalues.php | 6 +++ htdocs/core/lib/functions.lib.php | 74 +++++++++++++++---------------- htdocs/projet/card.php | 12 ++--- 3 files changed, 48 insertions(+), 44 deletions(-) diff --git a/htdocs/admin/defaultvalues.php b/htdocs/admin/defaultvalues.php index 013be811b5b..7ebc67472d1 100644 --- a/htdocs/admin/defaultvalues.php +++ b/htdocs/admin/defaultvalues.php @@ -271,6 +271,12 @@ if ($mode != 'focus') $texthelp.='__DAY__
'; $texthelp.='__MONTH__
'; $texthelp.='__YEAR__
'; + $texthelp.='__PREVIOUS_DAY__
'; + $texthelp.='__PREVIOUS_MONTH__
'; + $texthelp.='__PREVIOUS_YEAR__
'; + $texthelp.='__NEXT_DAY__
'; + $texthelp.='__NEXT_MONTH__
'; + $texthelp.='__NEXT_YEAR__
'; if (! empty($conf->multicompany->enabled)) $texthelp.='__ENTITYID__
'; $textvalue=$form->textwithpicto($langs->trans("Value"), $texthelp, 1, 'help', '', 0, 2, ''); } diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index d2638898a33..63990112be5 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -240,7 +240,7 @@ function dol_shutdown() * Return value of a param into GET or POST supervariable * * @param string $paramname Name of parameter to found - * @param string $check Type of check (''=no check, 'int'=check it's numeric, 'alpha'=check it's text and sign, 'aZ'=check it's a-z only, 'array'=check it's array, 'san_alpha'=Use filter_var with FILTER_SANITIZE_STRING (do not use this for free text string), 'day', 'month', 'year', 'custom'= custom filter specify $filter and $options) + * @param string $check Type of check (''=no check, 'none'=no check, 'int'=check it's numeric, 'alpha'=check it's text and sign, 'aZ'=check it's a-z only, 'array'=check it's array, 'san_alpha'=Use filter_var with FILTER_SANITIZE_STRING (do not use this for free text string), 'day', 'month', 'year', 'custom'= custom filter specify $filter and $options) * @param int $method Type of method (0 = get then post, 1 = only get, 2 = only post, 3 = post then get, 4 = post then get then cookie) * @param int $filter Filter to apply when $check is set to 'custom'. (See http://php.net/manual/en/filter.filters.php for détails) * @param mixed $options Options to pass to filter_var when $check is set to 'custom'. @@ -249,6 +249,8 @@ function dol_shutdown() */ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) { + global $mysoc,$user,$conf; + if (empty($method)) $out = isset($_GET[$paramname])?$_GET[$paramname]:(isset($_POST[$paramname])?$_POST[$paramname]:''); elseif ($method==1) $out = isset($_GET[$paramname])?$_GET[$paramname]:''; elseif ($method==2) $out = isset($_POST[$paramname])?$_POST[$paramname]:''; @@ -258,8 +260,6 @@ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) if (empty($method) || $method == 3 || $method == 4) { - global $conf; - // Management of default values if (! isset($_GET['sortfield']) && ! empty($conf->global->MAIN_ENABLE_DEFAULT_VALUES)) // If we did a click on a field to sort, we do no apply default values. Same if option MAIN_DISABLE_DEFAULT_VALUES is on { @@ -320,43 +320,41 @@ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) if (! empty($check)) { // Replace vars like __DAY__, __MONTH__, __YEAR__, __MYCOUNTRYID__, __USERID__, __ENTITYID__ - // TODO Add more var like __PREVIOUSDAY__, __PREVIOUSMONTH__, __PREVIOUSYEAR__ - if (! is_array($out) && preg_match('/^__([a-z0-9]+)__$/i', $out, $reg)) + if (! is_array($out)) { - if ($reg[1] == 'DAY') + $maxloop=20; $loopnb=0; // Protection against infinite loop + while (preg_match('/__([A-Z0-9]+_?[A-Z0-9]+)__/i', $out, $reg) && ($loopnb < $maxloop)) // Detect '__ABCDEF__' as key 'ABCDEF' and '__ABC_DEF__' as key 'ABC_DEF' { - $tmp=dol_getdate(dol_now(), true); - $out = $tmp['mday']; - } - elseif ($reg[1] == 'MONTH') - { - $tmp=dol_getdate(dol_now(), true); - $out = $tmp['mon']; - } - elseif ($reg[1] == 'YEAR') - { - $tmp=dol_getdate(dol_now(), true); - $out = $tmp['year']; - } - elseif ($reg[1] == 'MYCOUNTRYID') - { - global $mysoc; - $out = $mysoc->country_id; - } - elseif ($reg[1] == 'USERID') - { - global $user; - $out = $user->id; - } - elseif ($reg[1] == 'SUPERVISORID') - { - global $user; - $out = $user->fk_user; - } - elseif ($reg[1] == 'ENTITYID') - { - global $conf; - $out = $conf->entity; + $loopnb++; $newout = ''; + + if ($reg[1] == 'DAY') { $tmp=dol_getdate(dol_now(), true); $newout = $tmp['mday']; } + elseif ($reg[1] == 'MONTH') { $tmp=dol_getdate(dol_now(), true); $newout = $tmp['mon']; } + elseif ($reg[1] == 'YEAR') { $tmp=dol_getdate(dol_now(), true); $newout = $tmp['year']; } + elseif ($reg[1] == 'PREVIOUS_DAY') { $tmp=dol_getdate(dol_now(), true); $tmp2=dol_get_prev_day($tmp['mday'], $tmp['mon'], $tmp['year']); $newout = $tmp2['day']; } + elseif ($reg[1] == 'PREVIOUS_MONTH') { $tmp=dol_getdate(dol_now(), true); $tmp2=dol_get_prev_month($tmp['mday'], $tmp['mon'], $tmp['year']); $newout = $tmp2['month']; } + elseif ($reg[1] == 'PREVIOUS_YEAR') { $tmp=dol_getdate(dol_now(), true); $newout = ($tmp['year'] - 1); } + elseif ($reg[1] == 'NEXT_DAY') { $tmp=dol_getdate(dol_now(), true); $tmp2=dol_get_next_day($tmp['mday'], $tmp['mon'], $tmp['year']); $newout = $tmp2['day']; } + elseif ($reg[1] == 'NEXT_MONTH') { $tmp=dol_getdate(dol_now(), true); $tmp2=dol_get_next_month($tmp['mday'], $tmp['mon'], $tmp['year']); $newout = $tmp2['month']; } + elseif ($reg[1] == 'NEXT_YEAR') { $tmp=dol_getdate(dol_now(), true); $newout = ($tmp['year'] + 1); } + elseif ($reg[1] == 'MYCOUNTRYID') + { + $newout = $mysoc->country_id; + } + elseif ($reg[1] == 'USERID') + { + $newout = $user->id; + } + elseif ($reg[1] == 'SUPERVISORID') + { + $newout = $user->fk_user; + } + elseif ($reg[1] == 'ENTITYID') + { + $newout = $conf->entity; + } + else $newout = ''; // Key not found, we replace with empty string + //var_dump('__'.$reg[1].'__ -> '.$newout); + $out = preg_replace('/__'.preg_quote($reg[1],'/').'__/', $newout, $out); } } diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index 791cd6855f0..1ee81f7b917 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -142,9 +142,9 @@ if (empty($reshook)) $db->begin(); $object->ref = GETPOST('ref','alpha'); - $object->title = GETPOST('title'); // Do not use 'alpha' here, we want field as it is + $object->title = GETPOST('title','none'); // Do not use 'alpha' here, we want field as it is $object->socid = GETPOST('socid','int'); - $object->description = GETPOST('description'); // Do not use 'alpha' here, we want field as it is + $object->description = GETPOST('description','none'); // Do not use 'alpha' here, we want field as it is $object->public = GETPOST('public','alpha'); $object->opp_amount = price2num(GETPOST('opp_amount')); $object->budget_amount = price2num(GETPOST('budget_amount')); @@ -243,9 +243,9 @@ if (empty($reshook)) $old_start_date = $object->date_start; $object->ref = GETPOST('ref','alpha'); - $object->title = GETPOST('title'); // Do not use 'alpha' here, we want field as it is + $object->title = GETPOST('title','none'); // Do not use 'alpha' here, we want field as it is $object->socid = GETPOST('socid','int'); - $object->description = GETPOST('description'); // Do not use 'alpha' here, we want field as it is + $object->description = GETPOST('description','none'); // Do not use 'alpha' here, we want field as it is $object->public = GETPOST('public','alpha'); $object->date_start = empty($_POST["projectstart"])?'':$date_start; $object->date_end = empty($_POST["projectend"])?'':$date_end; @@ -509,7 +509,7 @@ if ($action == 'create' && $user->rights->projet->creer) print ''; // Label - print '
'; + print ''; // Thirdparty if ($conf->societe->enabled) @@ -588,7 +588,7 @@ if ($action == 'create' && $user->rights->projet->creer) // Description print ''; print ''; if ($conf->categorie->enabled) { From 99cc67d12312d0a7952883d053443eecd5a8a56a Mon Sep 17 00:00:00 2001 From: philippe grand Date: Tue, 16 May 2017 12:43:16 +0200 Subject: [PATCH 142/299] Update code using new css class --- htdocs/compta/resultat/clientfourn.php | 67 ++++++++------------------ 1 file changed, 21 insertions(+), 46 deletions(-) diff --git a/htdocs/compta/resultat/clientfourn.php b/htdocs/compta/resultat/clientfourn.php index 5c77bbba21d..1b5a232b812 100644 --- a/htdocs/compta/resultat/clientfourn.php +++ b/htdocs/compta/resultat/clientfourn.php @@ -231,13 +231,11 @@ $result = $db->query($sql); if ($result) { $num = $db->num_rows($result); $i = 0; - $var=true; while ($i < $num) { $objp = $db->fetch_object($result); - - print ""; + print ''; print "\n"; if ($modecompta == 'CREANCES-DETTES') @@ -282,7 +280,7 @@ if ($modecompta != 'CREANCES-DETTES') $objp = $db->fetch_object($result); - print ""; + print ''; print ""; +{ + print ''; print ''; print ''; } @@ -361,15 +358,13 @@ $result = $db->query($sql); if ($result) { $num = $db->num_rows($result); $i = 0; - $var=true; if ($num > 0) { while ($i < $num) { $objp = $db->fetch_object($result); - - print ""; + print ''; print "\n"; if ($modecompta == 'CREANCES-DETTES') @@ -386,9 +381,8 @@ if ($result) { } } else - { - - print ""; + { + print ''; print ''; print ''; } @@ -447,7 +441,6 @@ $subtotal_ht = 0; $subtotal_ttc = 0; if ($result) { $num = $db->num_rows($result); - $var=true; $i = 0; if ($num) { while ($i < $num) { @@ -458,8 +451,7 @@ if ($result) { $subtotal_ht += $obj->amount; $subtotal_ttc += $obj->amount; - $var = !$var; - print ""; + print ''; print ''; if ($modecompta == 'CREANCES-DETTES') print ''; print ''; @@ -468,8 +460,7 @@ if ($result) { } } else { - $var = !$var; - print ""; + print ''; print ''; print ''; } @@ -526,7 +517,6 @@ $subtotal_ht = 0; $subtotal_ttc = 0; if ($result) { $num = $db->num_rows($result); - $var=true; $i = 0; if ($num) { while ($i < $num) { @@ -537,8 +527,7 @@ if ($result) { $subtotal_ht += $obj->amount; $subtotal_ttc += $obj->amount; - $var = !$var; - print ""; + print ''; print ''; if ($modecompta == 'CREANCES-DETTES') print ''; @@ -548,8 +537,7 @@ if ($result) { } } else { - $var = !$var; - print ""; + print ''; print ''; print ''; } @@ -615,7 +603,6 @@ if (! empty($conf->salaries->enabled)) if ($result) { $num = $db->num_rows($result); - $var=true; $i = 0; if ($num) { @@ -628,8 +615,7 @@ if (! empty($conf->salaries->enabled)) $subtotal_ht += $obj->amount; $subtotal_ttc += $obj->amount; - $var = !$var; - print ""; + print ''; print "\n"; @@ -641,8 +627,7 @@ if (! empty($conf->salaries->enabled)) } else { - $var = !$var; - print ""; + print ''; print ''; print ''; } @@ -704,7 +689,6 @@ if (! empty($conf->expensereport->enabled)) if ($result) { $num = $db->num_rows($result); - $var=true; if ($num) { while ($obj = $db->fetch_object($result)) @@ -714,8 +698,7 @@ if (! empty($conf->expensereport->enabled)) $subtotal_ht += $obj->amount_ht; $subtotal_ttc += $obj->amount_ttc; - $var = !$var; - print ""; + print ''; print "\n"; @@ -726,8 +709,7 @@ if (! empty($conf->expensereport->enabled)) } else { - $var = !$var; - print ""; + print ''; print ''; print ''; } @@ -782,7 +764,6 @@ if (! empty($conf->don->enabled)) if ($result) { $num = $db->num_rows($result); - $var=true; $i = 0; if ($num) { @@ -795,8 +776,7 @@ if (! empty($conf->don->enabled)) $subtotal_ht += $obj->amount; $subtotal_ttc += $obj->amount; - $var = !$var; - print ""; + print ''; print "\n"; @@ -808,8 +788,7 @@ if (! empty($conf->don->enabled)) } else { - $var = !$var; - print ""; + print ''; print ''; print ''; } @@ -859,7 +838,6 @@ if ($modecompta == 'CREANCES-DETTES') if ($result) { $num = $db->num_rows($result); - $var=false; $i = 0; if ($num) { @@ -878,7 +856,7 @@ if ($modecompta == 'CREANCES-DETTES') } else { dol_print_error($db); } - print ""; + print ''; print "\n"; print "\n"; print "\n"; @@ -908,7 +886,6 @@ if ($modecompta == 'CREANCES-DETTES') if ($result) { $num = $db->num_rows($result); - $var=true; $i = 0; if ($num) { @@ -928,7 +905,7 @@ if ($modecompta == 'CREANCES-DETTES') } else { dol_print_error($db); } - print ""; + print ''; print "\n"; print "\n"; print "\n"; @@ -955,7 +932,6 @@ else $result=$db->query($sql); if ($result) { $num = $db->num_rows($result); - $var=false; $i = 0; if ($num) { while ($i < $num) { @@ -974,7 +950,7 @@ else } else { dol_print_error($db); } - print ""; + print ''; print "\n"; if ($modecompta == 'CREANCES-DETTES') print "\n"; @@ -1000,7 +976,6 @@ else $result=$db->query($sql); if ($result) { $num = $db->num_rows($result); - $var=true; $i = 0; if ($num) { while ($i < $num) { @@ -1021,7 +996,7 @@ else { dol_print_error($db); } - print ""; + print ''; print "\n"; if ($modecompta == 'CREANCES-DETTES') print "\n"; From 68e333879fee345e90523e6b424d944fa85f4143 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 16 May 2017 13:27:32 +0200 Subject: [PATCH 143/299] Fix var not sanitized --- htdocs/accountancy/admin/account.php | 2 +- htdocs/accountancy/admin/card.php | 2 +- htdocs/accountancy/admin/categories.php | 2 +- htdocs/accountancy/admin/fiscalyear.php | 2 +- htdocs/accountancy/bookkeeping/card.php | 2 +- htdocs/accountancy/expensereport/index.php | 2 +- htdocs/accountancy/journal/bankjournal.php | 2 +- .../journal/expensereportsjournal.php | 2 +- .../accountancy/journal/purchasesjournal.php | 2 +- htdocs/accountancy/journal/sellsjournal.php | 2 +- htdocs/accountancy/report/result.php | 2 +- htdocs/adherents/ldap.php | 2 +- htdocs/adherents/list.php | 2 +- htdocs/admin/clicktodial.php | 2 +- htdocs/admin/company.php | 2 +- htdocs/admin/events.php | 2 +- htdocs/admin/external_rss.php | 2 +- htdocs/admin/geoipmaxmind.php | 2 +- htdocs/admin/ihm.php | 2 +- htdocs/admin/ldap.php | 2 +- htdocs/admin/ldap_contacts.php | 2 +- htdocs/admin/ldap_groups.php | 2 +- htdocs/admin/ldap_members.php | 2 +- htdocs/admin/ldap_users.php | 2 +- htdocs/admin/mailman.php | 2 +- htdocs/admin/menus.php | 2 +- htdocs/admin/menus/edit.php | 2 +- htdocs/admin/notification.php | 2 +- htdocs/admin/perms.php | 2 +- htdocs/admin/proxy.php | 2 +- htdocs/admin/security.php | 2 +- htdocs/admin/sms.php | 2 +- htdocs/admin/spip.php | 2 +- htdocs/admin/syslog.php | 2 +- htdocs/admin/system/perf.php | 2 +- htdocs/admin/system/xcache.php | 2 +- htdocs/api/admin/index.php | 2 +- htdocs/barcode/codeinit.php | 2 +- htdocs/barcode/printsheet.php | 2 +- htdocs/cashdesk/validation_verif.php | 2 +- htdocs/categories/admin/categorie.php | 2 +- htdocs/categories/edit.php | 2 +- htdocs/categories/photos.php | 2 +- htdocs/categories/viewcat.php | 2 +- htdocs/collab/index.php | 2 +- htdocs/comm/card.php | 2 +- htdocs/comm/mailing/advtargetemailing.php | 2 +- htdocs/comm/mailing/cibles.php | 2 +- htdocs/comm/remise.php | 2 +- htdocs/comm/remx.php | 2 +- htdocs/commande/customer.php | 2 +- htdocs/commande/document.php | 2 +- htdocs/compta/bank/card.php | 2 +- htdocs/compta/bank/categ.php | 4 +- htdocs/compta/bank/various_payment/info.php | 2 +- htdocs/compta/clients.php | 2 +- htdocs/compta/paiement.php | 2 +- htdocs/compta/paiement/rapport.php | 2 +- htdocs/compta/payment_sc/card.php | 2 +- htdocs/compta/salaries/card.php | 2 +- htdocs/compta/salaries/info.php | 2 +- htdocs/compta/sociales/card.php | 2 +- htdocs/compta/sociales/document.php | 2 +- htdocs/compta/sociales/info.php | 2 +- htdocs/compta/tva/info.php | 2 +- htdocs/contact/document.php | 2 +- htdocs/contact/ldap.php | 2 +- htdocs/contact/note.php | 2 +- htdocs/core/ajax/ajaxdirpreview.php | 2 +- htdocs/core/ajax/bankconciliate.php | 2 +- .../boxes/box_graph_invoices_permonth.php | 4 +- .../box_graph_invoices_supplier_permonth.php | 4 +- .../core/boxes/box_graph_orders_permonth.php | 4 +- .../box_graph_orders_supplier_permonth.php | 4 +- .../boxes/box_graph_product_distribution.php | 6 +- .../boxes/box_graph_propales_permonth.php | 4 +- htdocs/core/class/html.form.class.php | 14 ++-- htdocs/core/class/html.formfile.class.php | 6 +- htdocs/core/datepicker.php | 1 - htdocs/core/get_menudiv.php | 1 - htdocs/core/lib/functions.lib.php | 22 ++++++- htdocs/core/lib/security.lib.php | 8 +-- htdocs/core/lib/security2.lib.php | 2 +- htdocs/core/lib/usergroups.lib.php | 2 +- htdocs/core/menus/standard/auguria.lib.php | 4 +- htdocs/core/menus/standard/eldy.lib.php | 4 +- htdocs/core/menus/standard/empty.php | 2 +- htdocs/core/search_page.php | 1 - htdocs/core/tpl/ajaxrow.tpl.php | 2 +- htdocs/core/tpl/notes.tpl.php | 4 +- htdocs/document.php | 4 +- htdocs/don/payment/card.php | 2 +- htdocs/don/payment/payment.php | 4 +- htdocs/ecm/docfile.php | 4 +- htdocs/ecm/index.php | 2 +- htdocs/ecm/index_auto.php | 2 +- htdocs/expensereport/card.php | 2 +- htdocs/expensereport/payment/card.php | 2 +- htdocs/expensereport/payment/payment.php | 4 +- htdocs/externalsite/frames.php | 2 +- htdocs/fourn/card.php | 2 +- htdocs/fourn/commande/dispatch.php | 2 +- htdocs/fourn/commande/note.php | 2 +- htdocs/fourn/facture/card.php | 2 +- htdocs/fourn/facture/rapport.php | 2 +- htdocs/ftp/index.php | 2 +- htdocs/holiday/define_holiday.php | 2 +- htdocs/index.php | 2 +- htdocs/install/repair.php | 2 +- htdocs/install/step2.php | 2 +- htdocs/install/upgrade.php | 4 +- htdocs/install/upgrade2.php | 4 +- htdocs/loan/card.php | 2 +- htdocs/loan/document.php | 2 +- htdocs/loan/info.php | 2 +- htdocs/loan/note.php | 2 +- htdocs/loan/payment/card.php | 2 +- htdocs/loan/payment/payment.php | 2 +- htdocs/main.inc.php | 66 +++++++++---------- htdocs/master.inc.php | 2 +- htdocs/opensurvey/card.php | 2 +- htdocs/opensurvey/exportcsv.php | 2 +- htdocs/opensurvey/list.php | 2 +- htdocs/opensurvey/results.php | 2 +- htdocs/product/note.php | 2 +- htdocs/product/stock/card.php | 2 +- htdocs/product/stock/mouvement.php | 2 +- htdocs/product/stock/product.php | 2 +- htdocs/projet/activity/perday.php | 2 +- htdocs/projet/activity/perweek.php | 2 +- htdocs/projet/note.php | 2 +- htdocs/public/demo/index.php | 2 +- htdocs/public/opensurvey/studs.php | 2 +- htdocs/public/paybox/newpayment.php | 4 +- htdocs/public/paypal/newpayment.php | 4 +- htdocs/societe/card.php | 2 +- htdocs/societe/document.php | 2 +- htdocs/societe/note.php | 2 +- htdocs/societe/notify/card.php | 2 +- htdocs/theme/eldy/style.css.php | 31 +++++---- htdocs/theme/md/style.css.php | 31 +++++---- htdocs/user/card.php | 2 +- htdocs/user/document.php | 2 +- htdocs/user/note.php | 2 +- htdocs/user/notify/card.php | 2 +- htdocs/user/passwordforgotten.php | 2 +- htdocs/variants/list.php | 2 +- htdocs/viewimage.php | 12 ++-- htdocs/websites/index.php | 2 +- .../accountancy/export-thirdpartyaccount.php | 2 +- 150 files changed, 261 insertions(+), 248 deletions(-) diff --git a/htdocs/accountancy/admin/account.php b/htdocs/accountancy/admin/account.php index 7f909cd2f13..d3556135972 100644 --- a/htdocs/accountancy/admin/account.php +++ b/htdocs/accountancy/admin/account.php @@ -37,7 +37,7 @@ $langs->load("accountancy"); $langs->load("salaries"); $mesg = ''; -$action = GETPOST('action'); +$action = GETPOST('action','aZ09'); $cancel = GETPOST('cancel'); $id = GETPOST('id', 'int'); $rowid = GETPOST('rowid', 'int'); diff --git a/htdocs/accountancy/admin/card.php b/htdocs/accountancy/admin/card.php index 8e77c4a5dab..3522460e07b 100644 --- a/htdocs/accountancy/admin/card.php +++ b/htdocs/accountancy/admin/card.php @@ -37,7 +37,7 @@ $langs->load("bills"); $langs->load("accountancy"); $mesg = ''; -$action = GETPOST('action'); +$action = GETPOST('action','aZ09'); $backtopage = GETPOST('backtopage'); $id = GETPOST('id', 'int'); $rowid = GETPOST('rowid', 'int'); diff --git a/htdocs/accountancy/admin/categories.php b/htdocs/accountancy/admin/categories.php index 19c33d848c8..fd8c67246f4 100644 --- a/htdocs/accountancy/admin/categories.php +++ b/htdocs/accountancy/admin/categories.php @@ -36,7 +36,7 @@ $mesg = ''; $id = GETPOST('id', 'int'); $rowid = GETPOST('rowid', 'int'); $cancel = GETPOST('cancel'); -$action = GETPOST('action'); +$action = GETPOST('action','aZ09'); $cat_id = GETPOST('account_category'); $selectcpt = GETPOST('cpt_bk', 'array'); $cpt_id = GETPOST('cptid'); diff --git a/htdocs/accountancy/admin/fiscalyear.php b/htdocs/accountancy/admin/fiscalyear.php index 507a68a3c01..16e11225d49 100644 --- a/htdocs/accountancy/admin/fiscalyear.php +++ b/htdocs/accountancy/admin/fiscalyear.php @@ -25,7 +25,7 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT . '/core/class/fiscalyear.class.php'; -$action = GETPOST('action'); +$action = GETPOST('action','aZ09'); // Load variable for pagination $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit; diff --git a/htdocs/accountancy/bookkeeping/card.php b/htdocs/accountancy/bookkeeping/card.php index 055451016e9..7ee3e6bb4fe 100644 --- a/htdocs/accountancy/bookkeeping/card.php +++ b/htdocs/accountancy/bookkeeping/card.php @@ -43,7 +43,7 @@ if ($user->societe_id > 0) { accessforbidden(); } -$action = GETPOST('action'); +$action = GETPOST('action','aZ09'); $piece_num = GETPOST("piece_num"); $mesg = ''; diff --git a/htdocs/accountancy/expensereport/index.php b/htdocs/accountancy/expensereport/index.php index 4bfeb630b02..a38194356bd 100644 --- a/htdocs/accountancy/expensereport/index.php +++ b/htdocs/accountancy/expensereport/index.php @@ -55,7 +55,7 @@ if ($year == 0) { } // Validate History -$action = GETPOST('action'); +$action = GETPOST('action','aZ09'); /* diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index a68798869a2..d1602bedf00 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -71,7 +71,7 @@ $date_startyear = GETPOST('date_startyear'); $date_endmonth = GETPOST('date_endmonth'); $date_endday = GETPOST('date_endday'); $date_endyear = GETPOST('date_endyear'); -$action = GETPOST('action'); +$action = GETPOST('action','aZ09'); $now = dol_now(); diff --git a/htdocs/accountancy/journal/expensereportsjournal.php b/htdocs/accountancy/journal/expensereportsjournal.php index 8e343bcbb08..f67224e3996 100644 --- a/htdocs/accountancy/journal/expensereportsjournal.php +++ b/htdocs/accountancy/journal/expensereportsjournal.php @@ -58,7 +58,7 @@ $now = dol_now(); if ($user->societe_id > 0) accessforbidden(); -$action = GETPOST('action'); +$action = GETPOST('action','aZ09'); /* diff --git a/htdocs/accountancy/journal/purchasesjournal.php b/htdocs/accountancy/journal/purchasesjournal.php index 232a6d7611c..f9cd162b6a0 100644 --- a/htdocs/accountancy/journal/purchasesjournal.php +++ b/htdocs/accountancy/journal/purchasesjournal.php @@ -57,7 +57,7 @@ $now = dol_now(); if ($user->societe_id > 0) accessforbidden(); -$action = GETPOST('action'); +$action = GETPOST('action','aZ09'); /* diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php index 9af2bd2d135..85ce7361394 100644 --- a/htdocs/accountancy/journal/sellsjournal.php +++ b/htdocs/accountancy/journal/sellsjournal.php @@ -60,7 +60,7 @@ $now = dol_now(); if ($user->societe_id > 0) accessforbidden(); -$action = GETPOST('action'); +$action = GETPOST('action','aZ09'); /* diff --git a/htdocs/accountancy/report/result.php b/htdocs/accountancy/report/result.php index a487cb641ff..aa31185604a 100644 --- a/htdocs/accountancy/report/result.php +++ b/htdocs/accountancy/report/result.php @@ -35,7 +35,7 @@ $langs->load("accountancy"); $langs->load("compta"); $mesg = ''; -$action = GETPOST('action'); +$action = GETPOST('action','aZ09'); $cat_id = GETPOST('account_category'); $selectcpt = GETPOST('cpt_bk'); $id = GETPOST('id', 'int'); diff --git a/htdocs/adherents/ldap.php b/htdocs/adherents/ldap.php index a5f61a45642..38e90663c0f 100644 --- a/htdocs/adherents/ldap.php +++ b/htdocs/adherents/ldap.php @@ -35,7 +35,7 @@ $langs->load("ldap"); $langs->load("admin"); $rowid = GETPOST('id','int'); -$action = GETPOST('action'); +$action = GETPOST('action','aZ09'); // Protection $socid=0; diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php index 7a6013b9b78..33d175e6350 100644 --- a/htdocs/adherents/list.php +++ b/htdocs/adherents/list.php @@ -37,7 +37,7 @@ $langs->load("companies"); // Security check $result=restrictedArea($user,'adherent'); -$action=GETPOST("action"); +$action=GETPOST('action','aZ09'); $filter=GETPOST("filter"); $statut=GETPOST("statut"); $search=GETPOST("search"); diff --git a/htdocs/admin/clicktodial.php b/htdocs/admin/clicktodial.php index 86b94d8ecf0..df3c54f758c 100644 --- a/htdocs/admin/clicktodial.php +++ b/htdocs/admin/clicktodial.php @@ -30,7 +30,7 @@ $langs->load("admin"); if (!$user->admin) accessforbidden(); -$action = GETPOST("action"); +$action = GETPOST('action','aZ09'); /* diff --git a/htdocs/admin/company.php b/htdocs/admin/company.php index ef22d8ecb4a..4487f81c2fe 100644 --- a/htdocs/admin/company.php +++ b/htdocs/admin/company.php @@ -36,7 +36,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); $langs->load("admin"); $langs->load("companies"); diff --git a/htdocs/admin/events.php b/htdocs/admin/events.php index 74525a6855b..7a8c71c0130 100644 --- a/htdocs/admin/events.php +++ b/htdocs/admin/events.php @@ -35,7 +35,7 @@ $langs->load("users"); $langs->load("admin"); $langs->load("other"); -$action=GETPOST("action"); +$action=GETPOST('action','aZ09'); $securityevent=new Events($db); diff --git a/htdocs/admin/external_rss.php b/htdocs/admin/external_rss.php index 30646b749fa..1d9621ad378 100644 --- a/htdocs/admin/external_rss.php +++ b/htdocs/admin/external_rss.php @@ -38,7 +38,7 @@ if (!$user->admin) accessforbidden(); $def = array(); $lastexternalrss=0; -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); /* diff --git a/htdocs/admin/geoipmaxmind.php b/htdocs/admin/geoipmaxmind.php index 5a69a356777..5ae1a04e2ea 100644 --- a/htdocs/admin/geoipmaxmind.php +++ b/htdocs/admin/geoipmaxmind.php @@ -33,7 +33,7 @@ accessforbidden(); $langs->load("admin"); $langs->load("errors"); -$action = GETPOST("action"); +$action = GETPOST('action','aZ09'); /* * Actions diff --git a/htdocs/admin/ihm.php b/htdocs/admin/ihm.php index 6e5c814639b..7c23b62f230 100644 --- a/htdocs/admin/ihm.php +++ b/htdocs/admin/ihm.php @@ -45,7 +45,7 @@ $langs->load("agenda"); if (! $user->admin) accessforbidden(); -$action = GETPOST('action'); +$action = GETPOST('action','aZ09'); if (! defined("MAIN_MOTD")) define("MAIN_MOTD",""); diff --git a/htdocs/admin/ldap.php b/htdocs/admin/ldap.php index 770d91d1d11..4d8dab035ca 100644 --- a/htdocs/admin/ldap.php +++ b/htdocs/admin/ldap.php @@ -36,7 +36,7 @@ $langs->load("admin"); if (!$user->admin) accessforbidden(); - $action = GETPOST("action"); + $action = GETPOST('action','aZ09'); /* * Actions diff --git a/htdocs/admin/ldap_contacts.php b/htdocs/admin/ldap_contacts.php index 27e32f8cd7c..d5ca994c258 100644 --- a/htdocs/admin/ldap_contacts.php +++ b/htdocs/admin/ldap_contacts.php @@ -38,7 +38,7 @@ $langs->load("errors"); if (!$user->admin) accessforbidden(); -$action = GETPOST("action"); +$action = GETPOST('action','aZ09'); /* * Actions diff --git a/htdocs/admin/ldap_groups.php b/htdocs/admin/ldap_groups.php index 192b11bfd8d..3f8869de70f 100644 --- a/htdocs/admin/ldap_groups.php +++ b/htdocs/admin/ldap_groups.php @@ -39,7 +39,7 @@ $langs->load("errors"); if (!$user->admin) accessforbidden(); -$action = GETPOST("action"); +$action = GETPOST('action','aZ09'); /* diff --git a/htdocs/admin/ldap_members.php b/htdocs/admin/ldap_members.php index 8c7291c3dc4..afbf8da375a 100644 --- a/htdocs/admin/ldap_members.php +++ b/htdocs/admin/ldap_members.php @@ -39,7 +39,7 @@ $langs->load("errors"); if (!$user->admin) accessforbidden(); -$action = GETPOST("action"); +$action = GETPOST('action','aZ09'); /* * Actions diff --git a/htdocs/admin/ldap_users.php b/htdocs/admin/ldap_users.php index 79f34001a63..43a6720a448 100644 --- a/htdocs/admin/ldap_users.php +++ b/htdocs/admin/ldap_users.php @@ -39,7 +39,7 @@ $langs->load("errors"); if (!$user->admin) accessforbidden(); -$action = GETPOST("action"); +$action = GETPOST('action','aZ09'); /* * Actions diff --git a/htdocs/admin/mailman.php b/htdocs/admin/mailman.php index 27d7b59553a..3048f519a86 100644 --- a/htdocs/admin/mailman.php +++ b/htdocs/admin/mailman.php @@ -41,7 +41,7 @@ if (! $user->admin) accessforbidden(); $type=array('yesno','texte','chaine'); -$action = GETPOST("action"); +$action = GETPOST('action','aZ09'); $testsubscribeemail = GETPOST("testsubscribeemail"); $testunsubscribeemail = GETPOST("testunsubscribeemail"); diff --git a/htdocs/admin/menus.php b/htdocs/admin/menus.php index ddfb4d0cd62..888045f3297 100644 --- a/htdocs/admin/menus.php +++ b/htdocs/admin/menus.php @@ -27,7 +27,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); $langs->load("companies"); $langs->load("products"); diff --git a/htdocs/admin/menus/edit.php b/htdocs/admin/menus/edit.php index 0a2669e960d..db03407fed1 100644 --- a/htdocs/admin/menus/edit.php +++ b/htdocs/admin/menus/edit.php @@ -43,7 +43,7 @@ foreach($dirmenus as $dirmenu) $dirsmartphone[]=$dirmenu.'smartphone'; } -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); $menu_handler_top=$conf->global->MAIN_MENU_STANDARD; $menu_handler_smartphone=$conf->global->MAIN_MENU_SMARTPHONE; diff --git a/htdocs/admin/notification.php b/htdocs/admin/notification.php index c82e64d48ea..73fb3d91587 100644 --- a/htdocs/admin/notification.php +++ b/htdocs/admin/notification.php @@ -41,7 +41,7 @@ $langs->load("mails"); if (!$user->admin) accessforbidden(); -$action = GETPOST("action"); +$action = GETPOST('action','aZ09'); /* diff --git a/htdocs/admin/perms.php b/htdocs/admin/perms.php index 5acbeb2e627..0c7ed656d9f 100644 --- a/htdocs/admin/perms.php +++ b/htdocs/admin/perms.php @@ -32,7 +32,7 @@ $langs->load("admin"); $langs->load("users"); $langs->load("other"); -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); if (!$user->admin) accessforbidden(); diff --git a/htdocs/admin/proxy.php b/htdocs/admin/proxy.php index 224fac14ce7..ee22f377200 100644 --- a/htdocs/admin/proxy.php +++ b/htdocs/admin/proxy.php @@ -40,7 +40,7 @@ $upload_dir=$conf->admin->dir_temp; * Actions */ -if (GETPOST("action") == 'set_proxy') +if (GETPOST('action','aZ09') == 'set_proxy') { if (GETPOST("MAIN_USE_CONNECT_TIMEOUT") && ! is_numeric(GETPOST("MAIN_USE_CONNECT_TIMEOUT"))) { diff --git a/htdocs/admin/security.php b/htdocs/admin/security.php index 4d0415dbd01..9627164f534 100644 --- a/htdocs/admin/security.php +++ b/htdocs/admin/security.php @@ -27,7 +27,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php'; -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); $langs->load("users"); $langs->load("admin"); diff --git a/htdocs/admin/sms.php b/htdocs/admin/sms.php index faf05b7fb0f..0027f2e834d 100644 --- a/htdocs/admin/sms.php +++ b/htdocs/admin/sms.php @@ -43,7 +43,7 @@ $substitutionarrayfortest=array( '__FIRSTNAME__' => 'TESTFirstname' ); -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); /* diff --git a/htdocs/admin/spip.php b/htdocs/admin/spip.php index 241062732a4..12fc15823bd 100644 --- a/htdocs/admin/spip.php +++ b/htdocs/admin/spip.php @@ -41,7 +41,7 @@ if (! $user->admin) accessforbidden(); $type=array('yesno','texte','chaine'); -$action = GETPOST("action"); +$action = GETPOST('action','aZ09'); /* diff --git a/htdocs/admin/syslog.php b/htdocs/admin/syslog.php index 03a1872c90c..65933c25639 100644 --- a/htdocs/admin/syslog.php +++ b/htdocs/admin/syslog.php @@ -35,7 +35,7 @@ $langs->load("admin"); $langs->load("other"); $error=0; -$action = GETPOST("action"); +$action = GETPOST('action','aZ09'); $syslogModules = array(); $activeModules = array(); diff --git a/htdocs/admin/system/perf.php b/htdocs/admin/system/perf.php index 9b23dc74089..25079d8f185 100644 --- a/htdocs/admin/system/perf.php +++ b/htdocs/admin/system/perf.php @@ -33,7 +33,7 @@ $langs->load("other"); if (! $user->admin) accessforbidden(); -if (GETPOST('action') == 'donothing') +if (GETPOST('action','aZ09') == 'donothing') { exit; } diff --git a/htdocs/admin/system/xcache.php b/htdocs/admin/system/xcache.php index 361be2b461a..53eaeec085f 100644 --- a/htdocs/admin/system/xcache.php +++ b/htdocs/admin/system/xcache.php @@ -26,7 +26,7 @@ $langs->load("admin"); if (!$user->admin) accessforbidden(); -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); /* diff --git a/htdocs/api/admin/index.php b/htdocs/api/admin/index.php index 8142b564c1e..d7f002d02aa 100644 --- a/htdocs/api/admin/index.php +++ b/htdocs/api/admin/index.php @@ -34,7 +34,7 @@ $langs->load("admin"); if (! $user->admin) accessforbidden(); -$action=GETPOST("action"); +$action=GETPOST('action','aZ09'); //Activate ProfId if ($action == 'setproductionmode') diff --git a/htdocs/barcode/codeinit.php b/htdocs/barcode/codeinit.php index ebe121301b7..1ebd512e772 100644 --- a/htdocs/barcode/codeinit.php +++ b/htdocs/barcode/codeinit.php @@ -38,7 +38,7 @@ $forbarcode=GETPOST('forbarcode'); $fk_barcode_type=GETPOST('fk_barcode_type'); $eraseallbarcode=GETPOST('eraseallbarcode'); -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); $producttmp=new Product($db); $thirdpartytmp=new Societe($db); diff --git a/htdocs/barcode/printsheet.php b/htdocs/barcode/printsheet.php index a60ac19d0af..a4857c94e87 100644 --- a/htdocs/barcode/printsheet.php +++ b/htdocs/barcode/printsheet.php @@ -45,7 +45,7 @@ $numberofsticker=GETPOST('numberofsticker','int'); $mesg=''; -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); $producttmp=new Product($db); $thirdpartytmp=new Societe($db); diff --git a/htdocs/cashdesk/validation_verif.php b/htdocs/cashdesk/validation_verif.php index 0722b3fb92e..5e4ed9b028e 100644 --- a/htdocs/cashdesk/validation_verif.php +++ b/htdocs/cashdesk/validation_verif.php @@ -34,7 +34,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; $obj_facturation = unserialize($_SESSION['serObjFacturation']); unset ($_SESSION['serObjFacturation']); -$action =GETPOST('action'); +$action =GETPOST('action','aZ09'); $bankaccountid=GETPOST('cashdeskbank'); switch ($action) diff --git a/htdocs/categories/admin/categorie.php b/htdocs/categories/admin/categorie.php index bc27be9bb12..d16b081e6ae 100644 --- a/htdocs/categories/admin/categorie.php +++ b/htdocs/categories/admin/categorie.php @@ -32,7 +32,7 @@ accessforbidden(); $langs->load("categories"); -$action=GETPOST("action"); +$action=GETPOST('action','aZ09'); /* * Actions diff --git a/htdocs/categories/edit.php b/htdocs/categories/edit.php index b96042d7a8e..9981d09cda0 100644 --- a/htdocs/categories/edit.php +++ b/htdocs/categories/edit.php @@ -34,7 +34,7 @@ $langs->load("categories"); $id=GETPOST('id','int'); $ref=GETPOST('ref'); $type=GETPOST('type'); -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); $confirm=GETPOST('confirm'); $cancel=GETPOST('cancel'); diff --git a/htdocs/categories/photos.php b/htdocs/categories/photos.php index 100d2d0d48e..e99e081e015 100644 --- a/htdocs/categories/photos.php +++ b/htdocs/categories/photos.php @@ -39,7 +39,7 @@ $langs->load("bills"); $id=GETPOST('id','int'); $ref=GETPOST('ref'); $type=GETPOST('type'); -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); $confirm=GETPOST('confirm'); if ($id == "") diff --git a/htdocs/categories/viewcat.php b/htdocs/categories/viewcat.php index d04d0baebd2..665b033936e 100644 --- a/htdocs/categories/viewcat.php +++ b/htdocs/categories/viewcat.php @@ -37,7 +37,7 @@ $langs->load("categories"); $id=GETPOST('id','int'); $ref=GETPOST('ref'); $type=GETPOST('type'); -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); $confirm=GETPOST('confirm'); $removeelem = GETPOST('removeelem','int'); $elemid=GETPOST('elemid'); diff --git a/htdocs/collab/index.php b/htdocs/collab/index.php index 0c892c4e776..ea7abde4151 100644 --- a/htdocs/collab/index.php +++ b/htdocs/collab/index.php @@ -77,7 +77,7 @@ $langs->load("website"); if (! $user->admin) accessforbidden(); -if (! ((GETPOST('testmenuhider') || ! empty($conf->global->MAIN_TESTMENUHIDER)) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER))) +if (! ((GETPOST('testmenuhider','int') || ! empty($conf->global->MAIN_TESTMENUHIDER)) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER))) { $conf->dol_hide_leftmenu = 1; // Force hide of left menu. } diff --git a/htdocs/comm/card.php b/htdocs/comm/card.php index b933289be4f..b26ce4fa7ac 100644 --- a/htdocs/comm/card.php +++ b/htdocs/comm/card.php @@ -60,7 +60,7 @@ $id = (GETPOST('socid','int') ? GETPOST('socid','int') : GETPOST('id','int')); if ($user->societe_id > 0) $id=$user->societe_id; $result = restrictedArea($user,'societe',$id,'&societe'); -$action = GETPOST('action'); +$action = GETPOST('action','aZ09'); $mode = GETPOST("mode"); $sortfield = GETPOST("sortfield",'alpha'); diff --git a/htdocs/comm/mailing/advtargetemailing.php b/htdocs/comm/mailing/advtargetemailing.php index 362bec914b6..0a9cdca7abc 100644 --- a/htdocs/comm/mailing/advtargetemailing.php +++ b/htdocs/comm/mailing/advtargetemailing.php @@ -59,7 +59,7 @@ if (! $sortfield) $id = GETPOST('id', 'int'); $rowid = GETPOST('rowid', 'int'); -$action = GETPOST("action"); +$action = GETPOST('action','aZ09'); $search_nom = GETPOST("search_nom"); $search_prenom = GETPOST("search_prenom"); $search_email = GETPOST("search_email"); diff --git a/htdocs/comm/mailing/cibles.php b/htdocs/comm/mailing/cibles.php index 118cc336fb7..0020a8fd771 100644 --- a/htdocs/comm/mailing/cibles.php +++ b/htdocs/comm/mailing/cibles.php @@ -52,7 +52,7 @@ if (! $sortorder) $sortorder="ASC"; $id=GETPOST('id','int'); $rowid=GETPOST('rowid','int'); -$action=GETPOST("action"); +$action=GETPOST('action','aZ09'); $search_lastname=GETPOST("search_lastname"); $search_firstname=GETPOST("search_firstname"); $search_email=GETPOST("search_email"); diff --git a/htdocs/comm/remise.php b/htdocs/comm/remise.php index 2be1981c5ae..bca371977a7 100644 --- a/htdocs/comm/remise.php +++ b/htdocs/comm/remise.php @@ -52,7 +52,7 @@ if (GETPOST('cancel') && ! empty($backtopage)) exit; } -if (GETPOST("action") == 'setremise') +if (GETPOST('action','aZ09') == 'setremise') { $object = new Societe($db); $object->fetch($id); diff --git a/htdocs/comm/remx.php b/htdocs/comm/remx.php index 375b4d0ecb8..9964db9ecde 100644 --- a/htdocs/comm/remx.php +++ b/htdocs/comm/remx.php @@ -185,7 +185,7 @@ if ($action == 'setremise' && $user->rights->societe->creer) } } -if (GETPOST("action") == 'confirm_remove' && GETPOST("confirm")=='yes') +if (GETPOST('action','aZ09') == 'confirm_remove' && GETPOST("confirm")=='yes') { //if ($user->rights->societe->creer) //if ($user->rights->facture->creer) diff --git a/htdocs/commande/customer.php b/htdocs/commande/customer.php index b5672f276e7..431a54b9f76 100644 --- a/htdocs/commande/customer.php +++ b/htdocs/commande/customer.php @@ -30,7 +30,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php'; -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); // Secrutiy check if ($user->societe_id > 0) diff --git a/htdocs/commande/document.php b/htdocs/commande/document.php index ef4f220f3e4..0b6cb908ef3 100644 --- a/htdocs/commande/document.php +++ b/htdocs/commande/document.php @@ -36,7 +36,7 @@ require_once DOL_DOCUMENT_ROOT .'/commande/class/commande.class.php'; $langs->load('companies'); $langs->load('other'); -$action = GETPOST('action'); +$action = GETPOST('action','aZ09'); $confirm = GETPOST('confirm'); $id = GETPOST('id','int'); $ref = GETPOST('ref'); diff --git a/htdocs/compta/bank/card.php b/htdocs/compta/bank/card.php index 804d2c5511d..be16e1f8bd6 100644 --- a/htdocs/compta/bank/card.php +++ b/htdocs/compta/bank/card.php @@ -46,7 +46,7 @@ $langs->load("categories"); $langs->load("companies"); $langs->load("compta"); -$action=GETPOST("action"); +$action=GETPOST('action','aZ09'); $cancel = GETPOST('cancel', 'alpha'); // Security check diff --git a/htdocs/compta/bank/categ.php b/htdocs/compta/bank/categ.php index 0cf88224e63..83e1f15ef36 100644 --- a/htdocs/compta/bank/categ.php +++ b/htdocs/compta/bank/categ.php @@ -33,7 +33,7 @@ require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/bankcateg.class.php'; $langs->load("banks"); $langs->load("categories"); -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); if (!$user->rights->banque->configurer) accessforbidden(); @@ -108,7 +108,7 @@ if ($result) print ''; print ''; - if (GETPOST("action") == 'edit' && GETPOST("categid")== $objp->rowid) + if (GETPOST('action','aZ09') == 'edit' && GETPOST("categid")== $objp->rowid) { print "'."\n"; } - // Signature - print '\n"; - + // Accountancy code + if ($conf->accounting->enabled) + { + print ''; + print ''; + } + + // TODO Move this into RH Tab (visible if RH module on) + // Hierarchy print ''; print ''; print "\n"; - if (! empty($conf->salaries->enabled) && ! empty($user->rights->salaries->read)) + if ((! empty($conf->salaries->enabled) && ! empty($user->rights->salaries->read)) + || (! empty($conf->hrm->enabled) && ! empty($user->rights->hrm->employee->read))) { $langs->load("salaries"); @@ -1435,13 +1440,6 @@ else print ''; print "\n"; - // Accountancy code - if ($conf->accounting->enabled) - { - print ''; - print ''; - } - // Date employment print ''; print ''; print "\n"; - print '
'.$langs->trans("Date").''.$langs->trans("Element").''.$langs->trans("Status").''.$langs->trans("Debit").'
'.$langs->trans("NoInvoice").'
'.$langs->trans("NoInvoice").'
 '.price($totalDebit).''.price($totalCredit).' '.price(price2num($totalDebit - $totalCredit, 'MT')).'
'.$langs->trans("Label").'
'.$langs->trans("Label").'
'.$langs->trans("Description").''; - print ''; + print ''; print '
 
 ".$langs->trans("Bills").' '.$objp->name."
 
 ".$langs->trans("Bills")." ".$langs->trans("Other")." (".$langs->trans("PaymentsNotLinkedToInvoice").")\n"; if ($modecompta == 'CREANCES-DETTES') @@ -303,9 +301,8 @@ if ($modecompta != 'CREANCES-DETTES') } if ($total_ttc == 0) -{ - - print "
 
 '.$langs->trans("None").'
 
 ".$langs->trans("Bills")." socid."\">".$objp->name."
 
 '.$langs->trans("None").'
 
 '.$obj->label.''.price(-$obj->amount).''.price(-$obj->amount).'
 
 '.$langs->trans("None").'
 
 '.$obj->label.''.price(-$obj->amount).'
 
 '.$langs->trans("None").'
 
 ".$langs->trans("Salary")." fk_user."\">".$obj->firstname." ".$obj->lastname."
 
 '.$langs->trans("None").'
 
 ".$langs->trans("ExpenseReport")." userid."\">".$obj->firstname." ".$obj->lastname."
 
 '.$langs->trans("None").'
 
 ".$langs->trans("Donation")." name."&search_name=".$obj->firstname." ".$obj->lastname."\">".$obj->name. " ".$obj->firstname." ".$obj->lastname."
 
 '.$langs->trans("None").'
 
 ".$langs->trans("VATToPay")." ".price($amount)."
 
 ".$langs->trans("VATToCollect")." ".price($amount)."
 
 ".$langs->trans("VATPaid")."".price($amount)."
 
 ".$langs->trans("VATCollected")."".price($amount)."
'.$objp->rowid.'"; print ''; diff --git a/htdocs/compta/bank/various_payment/info.php b/htdocs/compta/bank/various_payment/info.php index 73c1baa5c02..cda6b4ce137 100644 --- a/htdocs/compta/bank/various_payment/info.php +++ b/htdocs/compta/bank/various_payment/info.php @@ -31,7 +31,7 @@ $langs->load("bills"); $langs->load("salaries"); $id=GETPOST('id','int'); -$action=GETPOST("action"); +$action=GETPOST('action','aZ09'); // Security check $socid = GETPOST('socid','int'); diff --git a/htdocs/compta/clients.php b/htdocs/compta/clients.php index 28eaa0a7c9b..59fb3af2f00 100644 --- a/htdocs/compta/clients.php +++ b/htdocs/compta/clients.php @@ -27,7 +27,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php'; -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); // Secrutiy check if ($user->societe_id > 0) diff --git a/htdocs/compta/paiement.php b/htdocs/compta/paiement.php index 8cd924a0df8..0881ce061dc 100644 --- a/htdocs/compta/paiement.php +++ b/htdocs/compta/paiement.php @@ -817,7 +817,7 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie /** * Show list of payments */ -if (! GETPOST('action')) +if (! GETPOST('action','aZ09')) { if ($page == -1) $page = 0 ; $limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit; diff --git a/htdocs/compta/paiement/rapport.php b/htdocs/compta/paiement/rapport.php index c73f79c60a4..a185f0aba6e 100644 --- a/htdocs/compta/paiement/rapport.php +++ b/htdocs/compta/paiement/rapport.php @@ -31,7 +31,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; // Security check if (! $user->rights->facture->lire) accessforbidden(); -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); $socid=0; if ($user->societe_id > 0) diff --git a/htdocs/compta/payment_sc/card.php b/htdocs/compta/payment_sc/card.php index 2d653f2ba05..45762ed95bb 100644 --- a/htdocs/compta/payment_sc/card.php +++ b/htdocs/compta/payment_sc/card.php @@ -38,7 +38,7 @@ $langs->load('companies'); // Security check $id=GETPOST("id",'int'); -$action=GETPOST("action"); +$action=GETPOST('action','aZ09'); $confirm=GETPOST('confirm'); if ($user->societe_id) $socid=$user->societe_id; // TODO ajouter regle pour restreindre acces paiement diff --git a/htdocs/compta/salaries/card.php b/htdocs/compta/salaries/card.php index 569aa81629e..0ea91dc2857 100644 --- a/htdocs/compta/salaries/card.php +++ b/htdocs/compta/salaries/card.php @@ -39,7 +39,7 @@ $langs->load("salaries"); $langs->load('hrm'); $id=GETPOST("id",'int'); -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); // Security check $socid = GETPOST("socid","int"); diff --git a/htdocs/compta/salaries/info.php b/htdocs/compta/salaries/info.php index 429efc27a33..f15aac021ec 100644 --- a/htdocs/compta/salaries/info.php +++ b/htdocs/compta/salaries/info.php @@ -32,7 +32,7 @@ $langs->load("bills"); $langs->load("salaries"); $id=GETPOST('id','int'); -$action=GETPOST("action"); +$action=GETPOST('action','aZ09'); // Security check $socid = GETPOST('socid','int'); diff --git a/htdocs/compta/sociales/card.php b/htdocs/compta/sociales/card.php index aa479ec4369..f34ff9b1a31 100644 --- a/htdocs/compta/sociales/card.php +++ b/htdocs/compta/sociales/card.php @@ -38,7 +38,7 @@ $langs->load("compta"); $langs->load("bills"); $id=GETPOST('id','int'); -$action=GETPOST("action"); +$action=GETPOST('action','aZ09'); $confirm=GETPOST('confirm'); $projectid = (GETPOST('projectid') ? GETPOST('projectid', 'int') : 0); diff --git a/htdocs/compta/sociales/document.php b/htdocs/compta/sociales/document.php index cf42a11b515..95c72cbedb2 100644 --- a/htdocs/compta/sociales/document.php +++ b/htdocs/compta/sociales/document.php @@ -40,7 +40,7 @@ $langs->load("compta"); $langs->load("bills"); $id = GETPOST('id','int'); -$action = GETPOST("action"); +$action = GETPOST('action','aZ09'); $confirm = GETPOST('confirm', 'alpha'); // Security check diff --git a/htdocs/compta/sociales/info.php b/htdocs/compta/sociales/info.php index 7caa212be9e..bbacfafd430 100644 --- a/htdocs/compta/sociales/info.php +++ b/htdocs/compta/sociales/info.php @@ -30,7 +30,7 @@ $langs->load("compta"); $langs->load("bills"); $id=GETPOST('id','int'); -$action=GETPOST("action"); +$action=GETPOST('action','aZ09'); // Security check $socid = GETPOST('socid','int'); diff --git a/htdocs/compta/tva/info.php b/htdocs/compta/tva/info.php index f85ab9fc2b0..0c6ce29475a 100644 --- a/htdocs/compta/tva/info.php +++ b/htdocs/compta/tva/info.php @@ -30,7 +30,7 @@ $langs->load("compta"); $langs->load("bills"); $id=GETPOST('id','int'); -$action=GETPOST("action"); +$action=GETPOST('action','aZ09'); // Security check $socid = GETPOST('socid','int'); diff --git a/htdocs/contact/document.php b/htdocs/contact/document.php index b0067d81ec1..5d70ba7b4e1 100644 --- a/htdocs/contact/document.php +++ b/htdocs/contact/document.php @@ -34,7 +34,7 @@ $langs->load("companies"); $langs->load("contact"); $id = GETPOST('id','int'); -$action = GETPOST("action"); +$action = GETPOST('action','aZ09'); $confirm = GETPOST('confirm', 'alpha'); $object = new Contact($db); diff --git a/htdocs/contact/ldap.php b/htdocs/contact/ldap.php index af8fccfd7b9..3e998b43ec5 100644 --- a/htdocs/contact/ldap.php +++ b/htdocs/contact/ldap.php @@ -32,7 +32,7 @@ $langs->load("companies"); $langs->load("ldap"); $langs->load("admin"); -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); // Security check $id = GETPOST('id', 'int'); diff --git a/htdocs/contact/note.php b/htdocs/contact/note.php index eed044cdadf..c49dbc9f787 100644 --- a/htdocs/contact/note.php +++ b/htdocs/contact/note.php @@ -29,7 +29,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/contact.lib.php'; require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; -$action = GETPOST('action'); +$action = GETPOST('action','aZ09'); $langs->load("companies"); diff --git a/htdocs/core/ajax/ajaxdirpreview.php b/htdocs/core/ajax/ajaxdirpreview.php index 3fec57091cb..8d8f48ec141 100644 --- a/htdocs/core/ajax/ajaxdirpreview.php +++ b/htdocs/core/ajax/ajaxdirpreview.php @@ -40,7 +40,7 @@ if (! isset($mode) || $mode != 'noajax') // For ajax call require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; require_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmdirectory.class.php'; - $action=GETPOST("action"); + $action=GETPOST('action','aZ09'); $file=urldecode(GETPOST('file')); $section=GETPOST("section"); $module=GETPOST("module"); diff --git a/htdocs/core/ajax/bankconciliate.php b/htdocs/core/ajax/bankconciliate.php index 3a8a3e30687..24318be6cf8 100644 --- a/htdocs/core/ajax/bankconciliate.php +++ b/htdocs/core/ajax/bankconciliate.php @@ -31,7 +31,7 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; -$action=GETPOST('action'); +$action=GETPOST('action','aZ09'); /* diff --git a/htdocs/core/boxes/box_graph_invoices_permonth.php b/htdocs/core/boxes/box_graph_invoices_permonth.php index d313d10b310..8d8fea71411 100644 --- a/htdocs/core/boxes/box_graph_invoices_permonth.php +++ b/htdocs/core/boxes/box_graph_invoices_permonth.php @@ -122,7 +122,7 @@ class box_graph_invoices_permonth extends ModeleBoxes // Build graphic number of object. $data = array(array('Lib',val1,val2,val3),...) if ($shownb) { - $data1 = $stats->getNbByMonthWithPrevYear($endyear,$startyear,(GETPOST('action')==$refreshaction?-1:(3600*24))); + $data1 = $stats->getNbByMonthWithPrevYear($endyear,$startyear,(GETPOST('action','aZ09')==$refreshaction?-1:(3600*24))); $filenamenb = $dir."/".$prefix."invoicesnbinyear-".$endyear.".png"; if ($mode == 'customer') $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=billstats&file=invoicesnbinyear-'.$endyear.'.png'; @@ -162,7 +162,7 @@ class box_graph_invoices_permonth extends ModeleBoxes // Build graphic number of object. $data = array(array('Lib',val1,val2,val3),...) if ($showtot) { - $data2 = $stats->getAmountByMonthWithPrevYear($endyear,$startyear,(GETPOST('action')==$refreshaction?-1:(3600*24))); + $data2 = $stats->getAmountByMonthWithPrevYear($endyear,$startyear,(GETPOST('action','aZ09')==$refreshaction?-1:(3600*24))); $filenamenb = $dir."/".$prefix."invoicesamountinyear-".$endyear.".png"; if ($mode == 'customer') $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=billstats&file=invoicesamountinyear-'.$endyear.'.png'; diff --git a/htdocs/core/boxes/box_graph_invoices_supplier_permonth.php b/htdocs/core/boxes/box_graph_invoices_supplier_permonth.php index 7c3d6ab4e7f..e7ece7a2a53 100644 --- a/htdocs/core/boxes/box_graph_invoices_supplier_permonth.php +++ b/htdocs/core/boxes/box_graph_invoices_supplier_permonth.php @@ -121,7 +121,7 @@ class box_graph_invoices_supplier_permonth extends ModeleBoxes // Build graphic number of object. $data = array(array('Lib',val1,val2,val3),...) if ($shownb) { - $data1 = $stats->getNbByMonthWithPrevYear($endyear,$startyear,(GETPOST('action')==$refreshaction?-1:(3600*24))); + $data1 = $stats->getNbByMonthWithPrevYear($endyear,$startyear,(GETPOST('action','aZ09')==$refreshaction?-1:(3600*24))); $filenamenb = $dir."/".$prefix."invoicessuppliernbinyear-".$year.".png"; if ($mode == 'customer') $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=billstats&file=invoicesnbinyear-'.$year.'.png'; @@ -161,7 +161,7 @@ class box_graph_invoices_supplier_permonth extends ModeleBoxes // Build graphic number of object. $data = array(array('Lib',val1,val2,val3),...) if ($showtot) { - $data2 = $stats->getAmountByMonthWithPrevYear($endyear,$startyear,(GETPOST('action')==$refreshaction?-1:(3600*24))); + $data2 = $stats->getAmountByMonthWithPrevYear($endyear,$startyear,(GETPOST('action','aZ09')==$refreshaction?-1:(3600*24))); $filenamenb = $dir."/".$prefix."invoicessupplieramountinyear-".$year.".png"; if ($mode == 'customer') $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=billstats&file=invoicesamountinyear-'.$year.'.png'; diff --git a/htdocs/core/boxes/box_graph_orders_permonth.php b/htdocs/core/boxes/box_graph_orders_permonth.php index 0d3077a82ce..ec45cc3dde7 100644 --- a/htdocs/core/boxes/box_graph_orders_permonth.php +++ b/htdocs/core/boxes/box_graph_orders_permonth.php @@ -124,7 +124,7 @@ class box_graph_orders_permonth extends ModeleBoxes // Build graphic number of object. $data = array(array('Lib',val1,val2,val3),...) if ($shownb) { - $data1 = $stats->getNbByMonthWithPrevYear($endyear,$startyear,(GETPOST('action')==$refreshaction?-1:(3600*24))); + $data1 = $stats->getNbByMonthWithPrevYear($endyear,$startyear,(GETPOST('action','aZ09')==$refreshaction?-1:(3600*24))); $filenamenb = $dir."/".$prefix."ordersnbinyear-".$endyear.".png"; if ($mode == 'customer') $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=orderstats&file=ordersnbinyear-'.$endyear.'.png'; @@ -162,7 +162,7 @@ class box_graph_orders_permonth extends ModeleBoxes // Build graphic number of object. $data = array(array('Lib',val1,val2,val3),...) if ($showtot) { - $data2 = $stats->getAmountByMonthWithPrevYear($endyear,$startyear,(GETPOST('action')==$refreshaction?-1:(3600*24))); + $data2 = $stats->getAmountByMonthWithPrevYear($endyear,$startyear,(GETPOST('action','aZ09')==$refreshaction?-1:(3600*24))); $filenamenb = $dir."/".$prefix."ordersamountinyear-".$endyear.".png"; if ($mode == 'customer') $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=orderstats&file=ordersamountinyear-'.$endyear.'.png'; diff --git a/htdocs/core/boxes/box_graph_orders_supplier_permonth.php b/htdocs/core/boxes/box_graph_orders_supplier_permonth.php index d16bfbc0f90..28335c79b62 100644 --- a/htdocs/core/boxes/box_graph_orders_supplier_permonth.php +++ b/htdocs/core/boxes/box_graph_orders_supplier_permonth.php @@ -123,7 +123,7 @@ class box_graph_orders_supplier_permonth extends ModeleBoxes // Build graphic number of object. $data = array(array('Lib',val1,val2,val3),...) if ($shownb) { - $data1 = $stats->getNbByMonthWithPrevYear($endyear,$startyear,(GETPOST('action')==$refreshaction?-1:(3600*24))); + $data1 = $stats->getNbByMonthWithPrevYear($endyear,$startyear,(GETPOST('action','aZ09')==$refreshaction?-1:(3600*24))); $filenamenb = $dir."/".$prefix."orderssuppliernbinyear-".$endyear.".png"; if ($mode == 'customer') $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=orderstats&file=ordersnbinyear-'.$endyear.'.png'; @@ -161,7 +161,7 @@ class box_graph_orders_supplier_permonth extends ModeleBoxes // Build graphic number of object. $data = array(array('Lib',val1,val2,val3),...) if ($showtot) { - $data2 = $stats->getAmountByMonthWithPrevYear($endyear,$startyear,(GETPOST('action')==$refreshaction?-1:(3600*24))); + $data2 = $stats->getAmountByMonthWithPrevYear($endyear,$startyear,(GETPOST('action','aZ09')==$refreshaction?-1:(3600*24))); $filenamenb = $dir."/".$prefix."orderssupplieramountinyear-".$endyear.".png"; if ($mode == 'customer') $fileurlnb = DOL_URL_ROOT.'/viewimage.php?modulepart=orderstats&file=ordersamountinyear-'.$endyear.'.png'; diff --git a/htdocs/core/boxes/box_graph_product_distribution.php b/htdocs/core/boxes/box_graph_product_distribution.php index 2b3c69a9e15..44d5d0b0c15 100644 --- a/htdocs/core/boxes/box_graph_product_distribution.php +++ b/htdocs/core/boxes/box_graph_product_distribution.php @@ -139,7 +139,7 @@ class box_graph_product_distribution extends ModeleBoxes $showpointvalue = 1; $nocolor = 0; $mode='customer'; $stats_invoice = new FactureStats($this->db, $socid, $mode, ($userid>0?$userid:0)); - $data1 = $stats_invoice->getAllByProductEntry($year,(GETPOST('action')==$refreshaction?-1:(3600*24))); + $data1 = $stats_invoice->getAllByProductEntry($year,(GETPOST('action','aZ09')==$refreshaction?-1:(3600*24))); if (empty($data1)) { $showpointvalue=0; @@ -197,7 +197,7 @@ class box_graph_product_distribution extends ModeleBoxes $showpointvalue = 1; $nocolor = 0; $stats_proposal = new PropaleStats($this->db, $socid, ($userid>0?$userid:0)); - $data2 = $stats_proposal->getAllByProductEntry($year,(GETPOST('action')==$refreshaction?-1:(3600*24))); + $data2 = $stats_proposal->getAllByProductEntry($year,(GETPOST('action','aZ09')==$refreshaction?-1:(3600*24))); if (empty($data2)) { $showpointvalue = 0; @@ -259,7 +259,7 @@ class box_graph_product_distribution extends ModeleBoxes $showpointvalue = 1; $nocolor = 0; $mode='customer'; $stats_order = new CommandeStats($this->db, $socid, $mode, ($userid>0?$userid:0)); - $data3 = $stats_order->getAllByProductEntry($year,(GETPOST('action')==$refreshaction?-1:(3600*24))); + $data3 = $stats_order->getAllByProductEntry($year,(GETPOST('action','aZ09')==$refreshaction?-1:(3600*24))); if (empty($data3)) { $showpointvalue = 0; diff --git a/htdocs/core/boxes/box_graph_propales_permonth.php b/htdocs/core/boxes/box_graph_propales_permonth.php index 2a29cf27314..ccce8372d1f 100644 --- a/htdocs/core/boxes/box_graph_propales_permonth.php +++ b/htdocs/core/boxes/box_graph_propales_permonth.php @@ -121,7 +121,7 @@ class box_graph_propales_permonth extends ModeleBoxes // Build graphic number of object. $data = array(array('Lib',val1,val2,val3),...) if ($shownb) { - $data1 = $stats->getNbByMonthWithPrevYear($endyear,$startyear,(GETPOST('action')==$refreshaction?-1:(3600*24))); + $data1 = $stats->getNbByMonthWithPrevYear($endyear,$startyear,(GETPOST('action','aZ09')==$refreshaction?-1:(3600*24))); $datatype1 = array_pad(array(), ($endyear-$startyear+1), 'bars'); $filenamenb = $dir."/".$prefix."propalsnbinyear-".$endyear.".png"; @@ -160,7 +160,7 @@ class box_graph_propales_permonth extends ModeleBoxes // Build graphic number of object. $data = array(array('Lib',val1,val2,val3),...) if ($showtot) { - $data2 = $stats->getAmountByMonthWithPrevYear($endyear,$startyear,(GETPOST('action')==$refreshaction?-1:(3600*24))); + $data2 = $stats->getAmountByMonthWithPrevYear($endyear,$startyear,(GETPOST('action','aZ09')==$refreshaction?-1:(3600*24))); $datatype2 = array_pad(array(), ($endyear-$startyear+1), 'bars'); //$datatype2 = array('lines','bars'); diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index b12e58fe8f7..afa2006864f 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -110,18 +110,18 @@ class Form } else { - if (empty($notabletag) && GETPOST('action') != 'edit'.$htmlname && $perm) $ret.=''; + if (empty($notabletag) && GETPOST('action','aZ09') != 'edit'.$htmlname && $perm) $ret.='
'; + if (empty($notabletag) && GETPOST('action','aZ09') != 'edit'.$htmlname && $perm) $ret.=''; - if (empty($notabletag) && GETPOST('action') != 'edit'.$htmlname && $perm) $ret.=''; + if (empty($notabletag) && GETPOST('action','aZ09') != 'edit'.$htmlname && $perm) $ret.=''; - if (empty($notabletag) && GETPOST('action') != 'edit'.$htmlname && $perm) $ret.='
'; if ($fieldrequired) $ret.=''; $ret.=$langs->trans($text); if ($fieldrequired) $ret.=''; if (! empty($notabletag)) $ret.=' '; - if (empty($notabletag) && GETPOST('action') != 'edit'.$htmlname && $perm) $ret.=''; - if ($htmlname && GETPOST('action') != 'edit'.$htmlname && $perm) $ret.='id.$moreparam.'">'.img_edit($langs->trans('Edit'), ($notabletag ? 0 : 1)).''; + if (empty($notabletag) && GETPOST('action','aZ09') != 'edit'.$htmlname && $perm) $ret.=''; + if ($htmlname && GETPOST('action','aZ09') != 'edit'.$htmlname && $perm) $ret.='id.$moreparam.'">'.img_edit($langs->trans('Edit'), ($notabletag ? 0 : 1)).''; if (! empty($notabletag) && $notabletag == 1) $ret.=' : '; if (! empty($notabletag) && $notabletag == 3) $ret.=' '; - if (empty($notabletag) && GETPOST('action') != 'edit'.$htmlname && $perm) $ret.='
'; + if (empty($notabletag) && GETPOST('action','aZ09') != 'edit'.$htmlname && $perm) $ret.='
'; } return $ret; @@ -159,7 +159,7 @@ class Form } else { - if (GETPOST('action') == 'edit'.$htmlname) + if (GETPOST('action','aZ09') == 'edit'.$htmlname) { $ret.="\n"; $ret.='
'; diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index adacddb2163..225825d6699 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -994,7 +994,7 @@ class FormFile if (empty($url)) $url=$_SERVER["PHP_SELF"]; print ''."\n"; - if (GETPOST('action') == 'editfile' && $permtoeditline) + if (GETPOST('action','aZ09') == 'editfile' && $permtoeditline) { print ''; print ''; @@ -1131,7 +1131,7 @@ class FormFile print img_mime($file['name'],$file['name'].' ('.dol_print_size($file['size'],0,0).')').' '; if ($showrelpart == 1) print $relativepath; //print dol_trunc($file['name'],$maxlength,'middle'); - if (GETPOST('action') == 'editfile' && $file['name'] == basename(GETPOST('urlfile'))) + if (GETPOST('action','aZ09') == 'editfile' && $file['name'] == basename(GETPOST('urlfile'))) { print ''; print ''; @@ -1268,7 +1268,7 @@ class FormFile } } - if (GETPOST('action') == 'editfile' && $permtoeditline) + if (GETPOST('action','aZ09') == 'editfile' && $permtoeditline) { print '
'; } diff --git a/htdocs/core/datepicker.php b/htdocs/core/datepicker.php index eeb20ee265c..d2441487231 100644 --- a/htdocs/core/datepicker.php +++ b/htdocs/core/datepicker.php @@ -39,7 +39,6 @@ if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML',1); require_once '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; -if (GETPOST('lang')) $langs->setDefaultLang(GETPOST('lang')); // If language was forced on URL by the main.inc.php $langs->load("main"); $langs->load("agenda"); $right=($langs->trans("DIRECTION")=='rtl'?'left':'right'); diff --git a/htdocs/core/get_menudiv.php b/htdocs/core/get_menudiv.php index fd80124e7df..0e2f0bcb7c3 100644 --- a/htdocs/core/get_menudiv.php +++ b/htdocs/core/get_menudiv.php @@ -47,7 +47,6 @@ if (! defined('DISABLE_SELECT2')) define('DISABLE_SELECT2',1); require_once '../main.inc.php'; -if (GETPOST('lang')) $langs->setDefaultLang(GETPOST('lang')); // If language was forced on URL by the main.inc.php $langs->load("main"); $right=($langs->trans("DIRECTION")=='rtl'?'left':'right'); $left=($langs->trans("DIRECTION")=='rtl'?'right':'left'); diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 63990112be5..06ed76c5008 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -240,7 +240,17 @@ function dol_shutdown() * Return value of a param into GET or POST supervariable * * @param string $paramname Name of parameter to found - * @param string $check Type of check (''=no check, 'none'=no check, 'int'=check it's numeric, 'alpha'=check it's text and sign, 'aZ'=check it's a-z only, 'array'=check it's array, 'san_alpha'=Use filter_var with FILTER_SANITIZE_STRING (do not use this for free text string), 'day', 'month', 'year', 'custom'= custom filter specify $filter and $options) + * @param string $check Type of check + * ''=no check (deprecated) + * 'none'=no check (only for param that should have very rich content) + * 'int'=check it's numeric + * 'alpha'=check it's text and sign + * 'aZ'=check it's a-z only + * 'aZ09'=check it's simple alpha string (recommended for keys) + * 'array'=check it's array + * 'san_alpha'=Use filter_var with FILTER_SANITIZE_STRING (do not use this for free text string) + * 'nohtml', 'alphanohtml'=check there is no html content + * 'custom'= custom filter specify $filter and $options) * @param int $method Type of method (0 = get then post, 1 = only get, 2 = only post, 3 = post then get, 4 = post then get then cookie) * @param int $filter Filter to apply when $check is set to 'custom'. (See http://php.net/manual/en/filter.filters.php for détails) * @param mixed $options Options to pass to filter_var when $check is set to 'custom'. @@ -317,9 +327,14 @@ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) } } + if (empty($check) && $conf->global->MAIN_FEATURES_LEVEL > 0) + { + dol_syslog("A GETPOST is called with 1st param = ".$paramname." and 2nd param not defined, when calling page ".$_SERVER["PHP_SELF"], LOG_WARNING); + } + if (! empty($check)) { - // Replace vars like __DAY__, __MONTH__, __YEAR__, __MYCOUNTRYID__, __USERID__, __ENTITYID__ + // Replace vars like __DAY__, __MONTH__, __YEAR__, __MYCOUNTRYID__, __USERID__, __ENTITYID__, ... if (! is_array($out)) { $maxloop=20; $loopnb=0; // Protection against infinite loop @@ -358,8 +373,11 @@ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) } } + // Check is done after replacement switch ($check) { + case 'none': + break; case 'int': if (! is_numeric($out)) { $out=''; } break; diff --git a/htdocs/core/lib/security.lib.php b/htdocs/core/lib/security.lib.php index 7870824285a..ccc8a68a5d9 100644 --- a/htdocs/core/lib/security.lib.php +++ b/htdocs/core/lib/security.lib.php @@ -98,7 +98,7 @@ function dol_hash($chain,$type=0) /** * Check permissions of a user to show a page and an object. Check read permission. - * If GETPOST('action') defined, we also check write and delete permission. + * If GETPOST('action','aZ09') defined, we also check write and delete permission. * * @param User $user User to check * @param string $features Features to check (it must be module name. Examples: 'societe', 'contact', 'produit&service', 'produit|service', ...) @@ -207,7 +207,7 @@ function restrictedArea($user, $features, $objectid=0, $tableandshare='', $featu // Check write permission from module $createok=1; $nbko=0; - if (GETPOST("action") == 'create') + if (GETPOST('action','aZ09') == 'create') { foreach ($featuresarray as $feature) { @@ -262,7 +262,7 @@ function restrictedArea($user, $features, $objectid=0, $tableandshare='', $featu // Check create user permission $createuserok=1; - if (GETPOST("action") == 'confirm_create_user' && GETPOST("confirm") == 'yes') + if (GETPOST('action','aZ09') == 'confirm_create_user' && GETPOST("confirm") == 'yes') { if (! $user->rights->user->user->creer) $createuserok=0; @@ -272,7 +272,7 @@ function restrictedArea($user, $features, $objectid=0, $tableandshare='', $featu // Check delete permission from module $deleteok=1; $nbko=0; - if ((GETPOST("action") == 'confirm_delete' && GETPOST("confirm") == 'yes') || GETPOST("action") == 'delete') + if ((GETPOST('action','aZ09') == 'confirm_delete' && GETPOST("confirm") == 'yes') || GETPOST('action','aZ09') == 'delete') { foreach ($featuresarray as $feature) { diff --git a/htdocs/core/lib/security2.lib.php b/htdocs/core/lib/security2.lib.php index a14645a3152..b6b8d4ddd72 100644 --- a/htdocs/core/lib/security2.lib.php +++ b/htdocs/core/lib/security2.lib.php @@ -155,7 +155,7 @@ function dol_loginfunction($langs,$conf,$mysoc) $titletruedolibarrversion=constant('DOL_VERSION'); // $title used by login template after the @ to inform of true Dolibarr version // Note: $conf->css looks like '/theme/eldy/style.css.php' - $conf->css = "/theme/".(GETPOST('theme')?GETPOST('theme','alpha'):$conf->theme)."/style.css.php"; + $conf->css = "/theme/".(GETPOST('theme','alpha')?GETPOST('theme','alpha'):$conf->theme)."/style.css.php"; //$themepath=dol_buildpath((empty($conf->global->MAIN_FORCETHEMEDIR)?'':$conf->global->MAIN_FORCETHEMEDIR).$conf->css,1); $themepath=dol_buildpath($conf->css,1); if (! empty($conf->modules_parts['theme'])) // Using this feature slow down application diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php index 797af488f46..2cea718dcc0 100644 --- a/htdocs/core/lib/usergroups.lib.php +++ b/htdocs/core/lib/usergroups.lib.php @@ -417,7 +417,7 @@ function show_theme($fuser,$edit=0,$foruserprofile=false) $file=$dirtheme."/".$subdir."/thumb.png"; $url=$urltheme."/".$subdir."/thumb.png"; if (! file_exists($file)) $url=DOL_URL_ROOT.'/public/theme/common/nophoto.png'; - print 'id:'').'" style="font-weight: normal;" alt="'.$langs->trans("Preview").'">'; + print 'id:'').'" style="font-weight: normal;" alt="'.$langs->trans("Preview").'">'; if ($subdir == $conf->global->MAIN_THEME) $title=$langs->trans("ThemeCurrentlyActive"); else $title=$langs->trans("ShowPreview"); print ''.$title.''; diff --git a/htdocs/core/menus/standard/auguria.lib.php b/htdocs/core/menus/standard/auguria.lib.php index d2d8e36b8ca..7272eb000d4 100644 --- a/htdocs/core/menus/standard/auguria.lib.php +++ b/htdocs/core/menus/standard/auguria.lib.php @@ -53,7 +53,7 @@ function print_auguria_menu($db,$atarget,$type_user,&$tabMenu,&$menu,$noout=0,$m if (empty($noout)) print_start_menu_array_auguria(); - $usemenuhider = (GETPOST('testmenuhider') || ! empty($conf->global->MAIN_TESTMENUHIDER)); + $usemenuhider = (GETPOST('testmenuhider','int') || ! empty($conf->global->MAIN_TESTMENUHIDER)); // Show/Hide vertical menu if ($mode != 'jmobile' && $mode != 'topnb' && $usemenuhider && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) @@ -248,7 +248,7 @@ function print_left_auguria_menu($db,$menu_array_before,$menu_array_after,&$tabM $mainmenu=($forcemainmenu?$forcemainmenu:$_SESSION["mainmenu"]); $leftmenu=($forceleftmenu?'':(empty($_SESSION["leftmenu"])?'none':$_SESSION["leftmenu"])); - $usemenuhider = (GETPOST('testmenuhider') || ! empty($conf->global->MAIN_TESTMENUHIDER)); + $usemenuhider = (GETPOST('testmenuhider','int') || ! empty($conf->global->MAIN_TESTMENUHIDER)); global $usemenuhider; // Show logo company diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index b7a372e50bd..4aa5064977d 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -51,7 +51,7 @@ function print_eldy_menu($db,$atarget,$type_user,&$tabMenu,&$menu,$noout=0,$mode if (empty($noout)) print_start_menu_array(); - $usemenuhider = (GETPOST('testmenuhider') || ! empty($conf->global->MAIN_TESTMENUHIDER)); + $usemenuhider = (GETPOST('testmenuhider','int') || ! empty($conf->global->MAIN_TESTMENUHIDER)); // Show/Hide vertical menu if ($mode != 'jmobile' && $mode != 'topnb' && $usemenuhider && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) @@ -458,7 +458,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu $mainmenu=($forcemainmenu?$forcemainmenu:$_SESSION["mainmenu"]); $leftmenu=($forceleftmenu?'':(empty($_SESSION["leftmenu"])?'none':$_SESSION["leftmenu"])); - $usemenuhider = (GETPOST('testmenuhider') || ! empty($conf->global->MAIN_TESTMENUHIDER)); + $usemenuhider = (GETPOST('testmenuhider','int') || ! empty($conf->global->MAIN_TESTMENUHIDER)); // Show logo company if (empty($conf->global->MAIN_MENU_INVERT) && empty($noout) && ! empty($conf->global->MAIN_SHOW_LOGO) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) diff --git a/htdocs/core/menus/standard/empty.php b/htdocs/core/menus/standard/empty.php index 9a98fa4ffa4..501216ec860 100644 --- a/htdocs/core/menus/standard/empty.php +++ b/htdocs/core/menus/standard/empty.php @@ -93,7 +93,7 @@ class MenuManager $classname='class="tmenusel"'; // Show/Hide vertical menu - if ($mode != 'jmobile' && $mode != 'topnb' && (GETPOST('testmenuhider') || ! empty($conf->global->MAIN_TESTMENUHIDER)) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) + if ($mode != 'jmobile' && $mode != 'topnb' && (GETPOST('testmenuhider','int') || ! empty($conf->global->MAIN_TESTMENUHIDER)) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) { $showmode=1; $classname = 'class="tmenu menuhider"'; diff --git a/htdocs/core/search_page.php b/htdocs/core/search_page.php index ffbad81a30f..36f1e29e558 100644 --- a/htdocs/core/search_page.php +++ b/htdocs/core/search_page.php @@ -35,7 +35,6 @@ if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU',1); require_once '../main.inc.php'; -if (GETPOST('lang')) $langs->setDefaultLang(GETPOST('lang')); // If language was forced on URL by the main.inc.php $langs->load("main"); $right=($langs->trans("DIRECTION")=='rtl'?'left':'right'); $left=($langs->trans("DIRECTION")=='rtl'?'right':'left'); diff --git a/htdocs/core/tpl/ajaxrow.tpl.php b/htdocs/core/tpl/ajaxrow.tpl.php index 0708ae07a51..96be9b49196 100644 --- a/htdocs/core/tpl/ajaxrow.tpl.php +++ b/htdocs/core/tpl/ajaxrow.tpl.php @@ -31,7 +31,7 @@ $forcereloadpage=empty($conf->global->MAIN_FORCE_RELOAD_PAGE)?0:1; $tagidfortablednd=(empty($tagidfortablednd)?'tablelines':$tagidfortablednd); $filepath=(empty($filepath)?'':$filepath); -if (GETPOST('action') != 'editline' && $nboflines > 1) { ?> +if (GETPOST('action','aZ09') != 'editline' && $nboflines > 1) { ?> ' . "\n"; - } + } // Wrapper to manage dropdown if ($conf->use_javascript_ajax) diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 5efaae1fd78..6a7b130ac0d 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -922,15 +922,16 @@ class Project extends CommonObject /** * Return clicable name (with picto eventually) * - * @param int $withpicto 0=No picto, 1=Include picto into link, 2=Only picto - * @param string $option Variant ('', 'nolink') - * @param int $addlabel 0=Default, 1=Add label into string, >1=Add first chars into string - * @param string $moreinpopup Text to add into popup - * @param string $sep Separator between ref and label if option addlabel is set - * @param int $notooltip 1=Disable tooltip - * @return string Chaine avec URL + * @param int $withpicto 0=No picto, 1=Include picto into link, 2=Only picto + * @param string $option Variant ('', 'nolink') + * @param int $addlabel 0=Default, 1=Add label into string, >1=Add first chars into string + * @param string $moreinpopup Text to add into popup + * @param string $sep Separator between ref and label if option addlabel is set + * @param int $notooltip 1=Disable tooltip + * @param int $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking + * @return string String with URL */ - function getNomUrl($withpicto=0, $option='', $addlabel=0, $moreinpopup='', $sep=' - ', $notooltip=0) + function getNomUrl($withpicto=0, $option='', $addlabel=0, $moreinpopup='', $sep=' - ', $notooltip=0, $save_lastsearch_value=-1) { global $conf, $langs, $user; @@ -940,10 +941,8 @@ class Project extends CommonObject $label=''; if ($option != 'nolink') $label = '' . $langs->trans("ShowProject") . ''; - if (! empty($this->ref)) - $label .= ($label?'
':'').'' . $langs->trans('Ref') . ': ' . $this->ref; // The space must be after the : to not being explode when showing the title in img_picto - if (! empty($this->title)) - $label .= ($label?'
':'').'' . $langs->trans('Label') . ': ' . $this->title; // The space must be after the : to not being explode when showing the title in img_picto + $label .= ($label?'
':'').'' . $langs->trans('Ref') . ': ' . $this->ref; // The space must be after the : to not being explode when showing the title in img_picto + $label .= ($label?'
':'').'' . $langs->trans('Label') . ': ' . $this->title; // The space must be after the : to not being explode when showing the title in img_picto if (! empty($this->thirdparty_name)) $label .= ($label?'
':'').'' . $langs->trans('ThirdParty') . ': ' . $this->thirdparty_name; // The space must be after the : to not being explode when showing the title in img_picto if (! empty($this->dateo)) @@ -965,6 +964,10 @@ class Project extends CommonObject { $url = DOL_URL_ROOT . '/projet/card.php?id=' . $this->id; } + // Add param to save lastsearch_values or not + $add_save_lastsearch_values=($save_lastsearch_value == 1 ? 1 : 0); + if ($save_lastsearch_value == -1 && preg_match('/list\.php/',$_SERVER["PHP_SELF"])) $add_save_lastsearch_values=1; + if ($add_save_lastsearch_values) $url.='&save_lastsearch_values=1'; } $linkclose=''; diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index fb486629731..6aebf0e8786 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -1824,13 +1824,14 @@ class Societe extends CommonObject /** * Return a link on thirdparty (with picto) * - * @param int $withpicto Add picto into link (0=No picto, 1=Include picto with link, 2=Picto only) - * @param string $option Target of link ('', 'customer', 'prospect', 'supplier', 'project') - * @param int $maxlen Max length of name - * @param int $notooltip 1=Disable tooltip - * @return string String with URL + * @param int $withpicto Add picto into link (0=No picto, 1=Include picto with link, 2=Picto only) + * @param string $option Target of link ('', 'customer', 'prospect', 'supplier', 'project') + * @param int $maxlen Max length of name + * @param int $notooltip 1=Disable tooltip + * @param int $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking + * @return string String with URL */ - function getNomUrl($withpicto=0, $option='', $maxlen=0, $notooltip=0) + function getNomUrl($withpicto=0, $option='', $maxlen=0, $notooltip=0, $save_lastsearch_value=-1) { global $conf, $langs, $hookmanager; @@ -1929,7 +1930,12 @@ class Societe extends CommonObject $label.= ''; // Add type of canvas - $linkstart.=(!empty($this->canvas)?'&canvas='.$this->canvas:'').'"'; + $linkstart.=(!empty($this->canvas)?'&canvas='.$this->canvas:''); + // Add param to save lastsearch_values or not + $add_save_lastsearch_values=($save_lastsearch_value == 1 ? 1 : 0); + if ($save_lastsearch_value == -1 && preg_match('/list\.php/',$_SERVER["PHP_SELF"])) $add_save_lastsearch_values=1; + if ($add_save_lastsearch_values) $linkstart.='&save_lastsearch_values=1'; + $linkstart.='"'; $linkclose=''; if (empty($notooltip)) From 7931c548c78650ab31843f8be27bea665395ec47 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 16 May 2017 23:57:41 +0200 Subject: [PATCH 150/299] Better translation --- htdocs/install/mysql/data/llx_c_shipment_mode.sql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/install/mysql/data/llx_c_shipment_mode.sql b/htdocs/install/mysql/data/llx_c_shipment_mode.sql index 7bc3f8f590d..189bd3ea94b 100644 --- a/htdocs/install/mysql/data/llx_c_shipment_mode.sql +++ b/htdocs/install/mysql/data/llx_c_shipment_mode.sql @@ -1,6 +1,6 @@ -- Copyright (C) 2001-2004 Rodolphe Quiedeville -- Copyright (C) 2003 Jean-Louis Bergamo --- Copyright (C) 2004-2009 Laurent Destailleur +-- Copyright (C) 2004-2017 Laurent Destailleur -- Copyright (C) 2004 Benoit Mortier -- Copyright (C) 2004 Guillaume Delecourt -- Copyright (C) 2005-2011 Regis Houssin @@ -29,8 +29,8 @@ -- -- Sending method -- -INSERT INTO llx_c_shipment_mode (rowid,code,libelle,description,tracking,active) VALUES (1,'CATCH','Catch','Catch by client','',1); -INSERT INTO llx_c_shipment_mode (rowid,code,libelle,description,tracking,active) VALUES (2,'TRANS','Transporter','Generic transporter','',1); +INSERT INTO llx_c_shipment_mode (rowid,code,libelle,description,tracking,active) VALUES (1,'CATCH','At-Store Reclamation','At-Store Reclamation by the customer','',1); +INSERT INTO llx_c_shipment_mode (rowid,code,libelle,description,tracking,active) VALUES (2,'TRANS','Generic transporter','Generic transporter','',1); INSERT INTO llx_c_shipment_mode (rowid,code,libelle,description,tracking,active) VALUES (3,'COLSUI','Colissimo Suivi','Colissimo Suivi','http://www.colissimo.fr/portail_colissimo/suivre.do?colispart={TRACKID}',0); INSERT INTO llx_c_shipment_mode (rowid,code,libelle,description,tracking,active) VALUES (4,'LETTREMAX','Lettre Max','Courrier Suivi et Lettre Max','',0); INSERT INTO llx_c_shipment_mode (rowid,code,libelle,description,tracking,active) VALUES (5,'UPS','UPS','United Parcel Service','http://wwwapps.ups.com/etracking/tracking.cgi?InquiryNumber2=&InquiryNumber3=&tracknums_displayed=3&loc=fr_FR&TypeOfInquiryNumber=T&HTMLVersion=4.0&InquiryNumber22=&InquiryNumber32=&track=Track&Suivi.x=64&Suivi.y=7&Suivi=Valider&InquiryNumber1={TRACKID}',0); From 1a98886aa3012008920a72000c5aaf087afb73f9 Mon Sep 17 00:00:00 2001 From: Sergio Sanchis Climent Date: Wed, 17 May 2017 00:42:29 +0200 Subject: [PATCH 151/299] FIX: #6813 --- htdocs/admin/supplier_proposal.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/supplier_proposal.php b/htdocs/admin/supplier_proposal.php index 069c90ead8a..6752566a70f 100644 --- a/htdocs/admin/supplier_proposal.php +++ b/htdocs/admin/supplier_proposal.php @@ -274,7 +274,7 @@ foreach ($dirmodels as $reldir) while (($file = readdir($handle))!==false) { - if (substr($file, 0, 21) == 'mod_supplier_proposal_' && substr($file, dol_strlen($file)-3, 3) == 'php') + if (substr($file, 0, 22) == 'mod_supplier_proposal_' && substr($file, dol_strlen($file)-3, 3) == 'php') { $file = substr($file, 0, dol_strlen($file)-4); From d86b42b024cdf8ffb5d793ff935ffa28663dc70b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 17 May 2017 14:45:08 +0200 Subject: [PATCH 152/299] Missing title, bad css --- htdocs/langs/en_US/suppliers.lang | 1 + htdocs/product/fournisseurs.php | 8 +++++--- htdocs/product/price.php | 7 ++++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/htdocs/langs/en_US/suppliers.lang b/htdocs/langs/en_US/suppliers.lang index b890919ace5..d84925d0676 100644 --- a/htdocs/langs/en_US/suppliers.lang +++ b/htdocs/langs/en_US/suppliers.lang @@ -14,6 +14,7 @@ TotalSellingPriceMinShort=Total of subproducts selling prices SomeSubProductHaveNoPrices=Some sub-products have no price defined AddSupplierPrice=Add buying price ChangeSupplierPrice=Change buying price +SupplierPrices=Supplier prices ReferenceSupplierIsAlreadyAssociatedWithAProduct=This reference supplier is already associated with a reference: %s NoRecordedSuppliers=No suppliers recorded SupplierPayment=Supplier payment diff --git a/htdocs/product/fournisseurs.php b/htdocs/product/fournisseurs.php index 6ff8d9deca0..1d54495b605 100644 --- a/htdocs/product/fournisseurs.php +++ b/htdocs/product/fournisseurs.php @@ -584,6 +584,11 @@ if ($id > 0 || $ref) if ($user->rights->fournisseur->lire) { + $product_fourn = new ProductFournisseur($db); + $product_fourn_list = $product_fourn->list_product_fournisseur_price($object->id, $sortfield, $sortorder); + $nbtotalofrecords = count($product_fourn_list); + print_barre_liste($langs->trans('SupplierPrices'), $page, $_SERVEUR ['PHP_SELF'], $option, $sortfield, $sortorder, '', count($product_fourn_list), $nbtotalofrecords, 'title_accountancy.png'); + // Suppliers list title print '
'; print ''; @@ -611,9 +616,6 @@ if ($id > 0 || $ref) print_liste_field_titre(''); print "\n"; - $product_fourn = new ProductFournisseur($db); - $product_fourn_list = $product_fourn->list_product_fournisseur_price($object->id, $sortfield, $sortorder); - if (is_array($product_fourn_list)) { $var=true; diff --git a/htdocs/product/price.php b/htdocs/product/price.php index 1e9bcec3d52..607d6e07097 100644 --- a/htdocs/product/price.php +++ b/htdocs/product/price.php @@ -1755,7 +1755,8 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) else if ($action != 'showlog_default_price' && $action != 'edit_price') { // List of all prices by customers - + print ''."\n"; + // Count total nb of records $nbtotalofrecords = ''; if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { @@ -1792,8 +1793,8 @@ if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) if (count($prodcustprice->lines) > 0 || $search_soc) { print ''; - print ''; - print ''; + print ''; + print ''; // Print the search button print ''; // Charges ???? + /* if ($conf->global->PRODUCT_CHARGES) { if (! empty($conf->margin->enabled)) @@ -686,7 +687,7 @@ if ($id > 0 || $ref) print $productfourn->fourn_unitcharges?price($productfourn->fourn_unitcharges) : ($productfourn->fourn_qty?price($productfourn->fourn_charges/$productfourn->fourn_qty):" "); print ''; } - } + }*/ if (is_object($hookmanager)) { From 56989ae5aff33d76a79d365374e16b6e1bfba6da Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 17 May 2017 15:10:45 +0200 Subject: [PATCH 154/299] Add missing fields making not possible to enter reference price of products into another currency --- htdocs/install/mysql/migration/5.0.0-6.0.0.sql | 16 ++++++++++++++++ .../tables/llx_product_fournisseur_price.sql | 8 +++++++- .../tables/llx_product_fournisseur_price_log.sql | 7 ++++++- .../install/mysql/tables/llx_product_price.sql | 5 ++++- 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index 88260498f28..6ba7707b249 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -189,6 +189,22 @@ ALTER TABLE llx_cronjob ADD COLUMN processing integer NOT NULL DEFAULT 0; ALTER TABLE llx_website ADD COLUMN fk_user_create integer; ALTER TABLE llx_website ADD COLUMN fk_user_modif integer; +-- Add missing fields making not possible to enter reference price of products into another currency +ALTER TABLE llx_product_fournisseur_price ADD COLUMN multicurrency_tx double(24,8) DEFAULT 1; +ALTER TABLE llx_product_fournisseur_price ADD COLUMN multicurrency_price_ttc double(24,8) DEFAULT NULL; + +ALTER TABLE llx_product_fournisseur_price ADD COLUMN fk_multicurrency integer; +ALTER TABLE llx_product_fournisseur_price ADD COLUMN multicurrency_code varchar(255); +ALTER TABLE llx_product_fournisseur_price ADD COLUMN multicurrency_tx double(24,8) DEFAULT 1; +ALTER TABLE llx_product_fournisseur_price ADD COLUMN multicurrency_price double(24,8) DEFAULT NULL; +ALTER TABLE llx_product_fournisseur_price ADD COLUMN multicurrency_price_ttc double(24,8) DEFAULT NULL; + +ALTER TABLE llx_product_fournisseur_price_log ADD COLUMN fk_multicurrency integer; +ALTER TABLE llx_product_fournisseur_price_log ADD COLUMN multicurrency_code varchar(255); +ALTER TABLE llx_product_fournisseur_price_log ADD COLUMN multicurrency_tx double(24,8) DEFAULT 1; +ALTER TABLE llx_product_fournisseur_price_log ADD COLUMN multicurrency_price double(24,8) DEFAULT NULL; +ALTER TABLE llx_product_fournisseur_price_log ADD COLUMN multicurrency_price_ttc double(24,8) DEFAULT NULL; + create table llx_payment_various ( diff --git a/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql b/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql index 94032b784f4..f341b103edb 100755 --- a/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql +++ b/htdocs/install/mysql/tables/llx_product_fournisseur_price.sql @@ -43,5 +43,11 @@ create table llx_product_fournisseur_price fk_supplier_price_expression integer, -- Link to the rule for dynamic price calculation import_key varchar(14), -- Import key delivery_time_days integer, - supplier_reputation varchar(10) + supplier_reputation varchar(10), + + fk_multicurrency integer, + multicurrency_code varchar(255), + multicurrency_tx double(24,8) DEFAULT 1, + multicurrency_price double(24,8) DEFAULT NULL, + multicurrency_price_ttc double(24,8) DEFAULT NULL )ENGINE=innodb; diff --git a/htdocs/install/mysql/tables/llx_product_fournisseur_price_log.sql b/htdocs/install/mysql/tables/llx_product_fournisseur_price_log.sql index 3d54f9ef341..e9b78922413 100644 --- a/htdocs/install/mysql/tables/llx_product_fournisseur_price_log.sql +++ b/htdocs/install/mysql/tables/llx_product_fournisseur_price_log.sql @@ -24,6 +24,11 @@ create table llx_product_fournisseur_price_log fk_product_fournisseur integer NOT NULL, price double(24,8) DEFAULT 0, quantity double, - fk_user integer + fk_user integer, + fk_multicurrency integer, + multicurrency_code varchar(255), + multicurrency_tx double(24,8) DEFAULT 1, + multicurrency_price double(24,8) DEFAULT NULL, + multicurrency_price_ttc double(24,8) DEFAULT NULL )ENGINE=innodb; diff --git a/htdocs/install/mysql/tables/llx_product_price.sql b/htdocs/install/mysql/tables/llx_product_price.sql index ee2ee953c49..a7f9ba38751 100755 --- a/htdocs/install/mysql/tables/llx_product_price.sql +++ b/htdocs/install/mysql/tables/llx_product_price.sql @@ -46,6 +46,9 @@ create table llx_product_price fk_multicurrency integer, multicurrency_code varchar(255), - multicurrency_price double(24,8) DEFAULT NULL + multicurrency_tx double(24,8) DEFAULT 1, + multicurrency_price double(24,8) DEFAULT NULL, + multicurrency_price_ttc double(24,8) DEFAULT NULL + )ENGINE=innodb; From 1d6b4cb28ace17c701a6e647288610358002fade Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 17 May 2017 15:25:09 +0200 Subject: [PATCH 155/299] Look and feel v6 --- htdocs/product/price.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/htdocs/product/price.php b/htdocs/product/price.php index cce87bfae5a..d3e144b91ca 100644 --- a/htdocs/product/price.php +++ b/htdocs/product/price.php @@ -1080,6 +1080,7 @@ if ($action == 'edit_price' && $object->getRights()->creer) if (empty($conf->global->PRODUIT_MULTIPRICES)) { + print ''."\n"; print '
'; print ''; print ''; @@ -1184,7 +1185,8 @@ if ($action == 'edit_price' && $object->getRights()->creer) } else { - ?> + print ''."\n"; + ?> '; } - + return $ret; } @@ -1013,7 +1013,7 @@ class Form { global $conf,$user,$langs; - $out=''; + $out=''; $num=0; $outarray=array(); @@ -1055,8 +1055,6 @@ class Form $resql=$this->db->query($sql); if ($resql) { - $events = null; - if ($conf->use_javascript_ajax && ! $forcecombo) { include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php'; @@ -1420,7 +1418,7 @@ class Form // Build list includeUsers to have only hierarchy and current user $includeUsers = implode(",",$user->getAllChildIds(1)); } - + $out=''; // On recherche les utilisateurs @@ -1637,7 +1635,7 @@ class Form $i++; } if ($nbassignetouser) $out.=''; - + //$out.=''; return $out; } @@ -1663,7 +1661,7 @@ class Form * @param int $hidepriceinlabel 1=Hide prices in label * @param string $warehouseStatus warehouse status filter, following comma separated filter options can be used * 'warehouseopen' = select products from open warehouses, - * 'warehouseclosed' = select products from closed warehouses, + * 'warehouseclosed' = select products from closed warehouses, * 'warehouseinternal' = select products from warehouses for internal correct/transfer only * @return void */ @@ -1730,7 +1728,7 @@ class Form * @param int $hidepriceinlabel 1=Hide prices in label * @param string $warehouseStatus warehouse status filter, following comma separated filter options can be used * 'warehouseopen' = select products from open warehouses, - * 'warehouseclosed' = select products from closed warehouses, + * 'warehouseclosed' = select products from closed warehouses, * 'warehouseinternal' = select products from warehouses for internal correct/transfer only * @return array Array of keys for json */ @@ -1745,19 +1743,19 @@ class Form if (! empty($warehouseStatus)) { require_once DOL_DOCUMENT_ROOT.'/product/stock/class/entrepot.class.php'; - if (preg_match('/warehouseclosed/', $warehouseStatus)) + if (preg_match('/warehouseclosed/', $warehouseStatus)) { $warehouseStatusArray[] = Entrepot::STATUS_CLOSED; } - if (preg_match('/warehouseopen/', $warehouseStatus)) + if (preg_match('/warehouseopen/', $warehouseStatus)) { $warehouseStatusArray[] = Entrepot::STATUS_OPEN_ALL; } - if (preg_match('/warehouseinternal/', $warehouseStatus)) + if (preg_match('/warehouseinternal/', $warehouseStatus)) { $warehouseStatusArray[] = Entrepot::STATUS_OPEN_INTERNAL; } - } + } $selectFields = " p.rowid, p.label, p.ref, p.description, p.barcode, p.fk_product_type, p.price, p.price_ttc, p.price_base_type, p.tva_tx, p.duration, p.fk_price_expression"; (count($warehouseStatusArray)) ? $selectFieldsGrouped = ", sum(ps.reel) as stock" : $selectFieldsGrouped = ", p.stock"; @@ -1796,7 +1794,7 @@ class Form $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_stock as ps on ps.fk_product = p.rowid"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."entrepot as e on ps.fk_entrepot = e.rowid"; } - + //Price by customer if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES) && !empty($socid)) { $sql.=" LEFT JOIN ".MAIN_DB_PREFIX."product_customer_price as pcp ON pcp.fk_soc=".$socid." AND pcp.fk_product=p.rowid"; @@ -1863,7 +1861,7 @@ class Form $num = $this->db->num_rows($result); $events=null; - + if ($conf->use_javascript_ajax && ! $forcecombo) { include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php'; @@ -1871,9 +1869,9 @@ class Form $out.= $comboenhancement; $nodatarole=($comboenhancement?' data-role="none"':''); } - + $out.=''; if ($addempty) print ''; foreach($this->cache_conditions_paiements as $id => $arrayconditions) @@ -3409,7 +3407,7 @@ class Form // Clean parameters $newselectedchoice=empty($selectedchoice)?"no":$selectedchoice; if ($conf->browser->layout == 'phone') $width='95%'; - + if (is_array($formquestion) && ! empty($formquestion)) { // First add hidden fields and value @@ -3675,7 +3673,7 @@ class Form require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; $out=''; - + $formproject=new FormProjets($this->db); $langs->load("project"); @@ -3703,8 +3701,8 @@ class Form $out.=" "; } } - - if (empty($nooutput)) + + if (empty($nooutput)) { print $out; return ''; @@ -4049,7 +4047,7 @@ class Form } print ''; } - if ($more) + if ($more) { print '
'; print $more; @@ -4259,7 +4257,7 @@ class Form // Make select dynamic include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php'; $out.= ajax_combobox($htmlname); - + return $out; } @@ -4454,13 +4452,13 @@ class Form $key.= $rate['nprtva'] ? '*': ''; if ($mode > 0 && $rate['code']) $key.=' ('.$rate['code'].')'; if ($mode < 0) $key = $rate['rowid']; - + $return.= '
'; return $ret; From 0b0dbd9649462722a7856e5a5b2ab25032a618d6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 18 May 2017 17:57:20 +0200 Subject: [PATCH 177/299] Code comment --- htdocs/install/mysql/tables/llx_actioncomm.sql | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/install/mysql/tables/llx_actioncomm.sql b/htdocs/install/mysql/tables/llx_actioncomm.sql index e022b46a859..46017d1e739 100644 --- a/htdocs/install/mysql/tables/llx_actioncomm.sql +++ b/htdocs/install/mysql/tables/llx_actioncomm.sql @@ -40,14 +40,14 @@ create table llx_actioncomm fk_soc integer, fk_contact integer, fk_parent integer NOT NULL default 0, - fk_user_action integer, -- user id of owner of action (note that assigned users to event are store into another table) + fk_user_action integer, -- user id of owner of action (note that users assigned to event are stored into another table) fk_user_done integer, -- user id of user that has made action (deprecated) - transparency integer, -- transparency (ical standard). used to say if user assigned to event are busy or not by event. This field may be deprecated if we want to store transparency for each assigned user, so into table llx_actioncomm_resources. + transparency integer, -- transparency (ical standard). used to say if user assigned to event are busy or not by event. This field may be deprecated if we want to store transparency for each assigned user, moved into table llx_actioncomm_resources. priority smallint, -- priority (ical standard) - fulldayevent smallint NOT NULL default 0, -- priority (ical standard) - punctual smallint NOT NULL default 1, -- deprecated. milestone is event with date start (datep) = date end (datep2) + fulldayevent smallint NOT NULL default 0, -- priority (ical standard) + punctual smallint NOT NULL default 1, -- deprecated. milestone is event with date start (datep) = date end (datep2) percent smallint NOT NULL default 0, location varchar(128), durationp real, -- planed duration @@ -64,9 +64,9 @@ create table llx_actioncomm email_tobcc varchar(256), -- when event was an email, we store here the email_tobcc errors_to varchar(256), -- when event was an email, we store here the erros_to - recurid varchar(128), -- used to store event id to link all recurring event records each other + recurid varchar(128), -- used to store event id to link each other all the repeating event records recurrule varchar(128), -- contains string with ical format recurring rule like "FREQ=MONTHLY;INTERVAL=2;BYMONTHDAY=19" or "FREQ=WEEKLY;BYDAY=MO" - recurdateend datetime, + recurdateend datetime, -- no more recurring event after this date fk_element integer DEFAULT NULL, -- For link to an element (proposal, invoice, order, ...) elementtype varchar(255) DEFAULT NULL -- For link to an element (proposal, invoice, order, ...) From ef575166c0195b74affa042e117dc30338ad542b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 18 May 2017 19:10:05 +0200 Subject: [PATCH 178/299] FIX #6651 --- htdocs/comm/propal/list.php | 10 +- htdocs/supplier_proposal/list.php | 586 +++++++++++++++++++++++------- 2 files changed, 456 insertions(+), 140 deletions(-) diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index ac5cee3bebc..af9ffa6d778 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -84,7 +84,7 @@ $day=GETPOST("day","int"); $month=GETPOST("month","int"); $year=GETPOST("year","int"); -$limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit; +$limit = GETPOST('limit')?GETPOST('limit','int'):$conf->liste_limit; $sortfield = GETPOST("sortfield",'alpha'); $sortorder = GETPOST("sortorder",'alpha'); $page = GETPOST("page",'int'); @@ -242,6 +242,7 @@ $sql.= " typent.code as typent_code,"; $sql.= " state.code_departement as state_code, state.nom as state_name,"; $sql.= ' p.rowid, p.note_private, p.total_ht, p.tva as total_vat, p.total as total_ttc, p.localtax1, p.localtax2, p.ref, p.ref_client, p.fk_statut, p.fk_user_author, p.datep as dp, p.fin_validite as dfv,'; $sql.= ' p.datec as date_creation, p.tms as date_update,'; +$sql.= " pr.rowid as project_id, pr.ref as project_ref,"; if (! $user->rights->societe->client->voir && ! $socid) $sql .= " sc.fk_soc, sc.fk_user,"; $sql.= ' u.login'; // Add fields from extrafields @@ -259,6 +260,7 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab if ($sall || $search_product_category > 0) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'propaldet as pd ON p.rowid=pd.fk_propal'; if ($search_product_category > 0) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_product as cp ON cp.fk_product=pd.fk_product'; $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'user as u ON p.fk_user_author = u.rowid'; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."projet as pr ON pr.rowid = p.fk_projet"; // We'll need this table joined to the select in order to filter by sale if ($search_sale > 0 || (! $user->rights->societe->client->voir && ! $socid)) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; if ($search_user > 0) @@ -377,6 +379,7 @@ if ($resql) if ($search_montant_ht) $param.='&search_montant_ht='.$search_montant_ht; if ($search_login) $param.='&search_login='.$search_login; if ($search_town) $param.='&search_town='.$search_town; + if ($search_zip) $param.='&search_zip='.$search_zip; if ($socid > 0) $param.='&socid='.$socid; if ($optioncss != '') $param.='&optioncss='.$optioncss; // Add $param from extra fields @@ -532,7 +535,7 @@ if ($resql) $moreforfilter.=$form->select_dolusers($search_user, 'search_user', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); $moreforfilter.=''; } - // If the user can view prospects other than his' + // If the user can view products if ($conf->categorie->enabled && ($user->rights->produit->lire || $user->rights->service->lire)) { include_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; @@ -566,7 +569,7 @@ if ($resql) { print '
'; + print ''; } if (! empty($arrayfields['p.ref_client']['checked'])) { @@ -1001,7 +1004,6 @@ if ($resql) else print ''; } print ''; - } $db->free($resql); diff --git a/htdocs/supplier_proposal/list.php b/htdocs/supplier_proposal/list.php index 56f8df0f825..c5f994f8a10 100644 --- a/htdocs/supplier_proposal/list.php +++ b/htdocs/supplier_proposal/list.php @@ -61,8 +61,15 @@ $search_user=GETPOST('search_user','int'); $search_sale=GETPOST('search_sale','int'); $search_ref=GETPOST('sf_ref')?GETPOST('sf_ref','alpha'):GETPOST('search_ref','alpha'); $search_societe=GETPOST('search_societe','alpha'); -$search_montant_ht=GETPOST('search_montant_ht','alpha'); $search_author=GETPOST('search_author','alpha'); +$search_town=GETPOST('search_town','alpha'); +$search_zip=GETPOST('search_zip','alpha'); +$search_state=trim(GETPOST("search_state")); +$search_country=GETPOST("search_country",'int'); +$search_type_thirdparty=GETPOST("search_type_thirdparty",'int'); +$search_montant_ht=GETPOST('search_montant_ht','alpha'); +$search_montant_vat=GETPOST('search_montant_vat','alpha'); +$search_montant_ttc=GETPOST('search_montant_ttc','alpha'); $search_status=GETPOST('viewstatut','alpha')?GETPOST('viewstatut','alpha'):GETPOST('search_status','int'); $object_statut=$db->escape(GETPOST('supplier_proposal_statut')); @@ -121,28 +128,28 @@ $fieldstosearchall = array( 'p.ref'=>'Ref', 's.nom'=>'Supplier', 'pd.description'=>'Description', - 'p.note_private'=>"NotePrivate", 'p.note_public'=>'NotePublic', ); +if (empty($user->socid)) $fieldstosearchall["p.note_private"]="NotePrivate"; -// TODO Use field of supplier proposal +$checkedtypetiers=0; $arrayfields=array( - 'p.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1), + 'sp.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1), 's.nom'=>array('label'=>$langs->trans("Supplier"), 'checked'=>1), 's.town'=>array('label'=>$langs->trans("Town"), 'checked'=>1), 's.zip'=>array('label'=>$langs->trans("Zip"), 'checked'=>1), 'state.nom'=>array('label'=>$langs->trans("StateShort"), 'checked'=>0), 'country.code_iso'=>array('label'=>$langs->trans("Country"), 'checked'=>0), 'typent.code'=>array('label'=>$langs->trans("ThirdPartyType"), 'checked'=>$checkedtypetiers), - 'p.date'=>array('label'=>$langs->trans("Date"), 'checked'=>1), - 'p.fin_validite'=>array('label'=>$langs->trans("DateEnd"), 'checked'=>1), - 'p.total_ht'=>array('label'=>$langs->trans("AmountHT"), 'checked'=>1), - 'p.total_vat'=>array('label'=>$langs->trans("AmountVAT"), 'checked'=>0), - 'p.total_ttc'=>array('label'=>$langs->trans("AmountTTC"), 'checked'=>0), + 'sp.date_valid'=>array('label'=>$langs->trans("Date"), 'checked'=>1), + 'sp.date_livraison'=>array('label'=>$langs->trans("DateEnd"), 'checked'=>1), + 'sp.total_ht'=>array('label'=>$langs->trans("AmountHT"), 'checked'=>1), + 'sp.total_vat'=>array('label'=>$langs->trans("AmountVAT"), 'checked'=>0), + 'sp.total_ttc'=>array('label'=>$langs->trans("AmountTTC"), 'checked'=>0), 'u.login'=>array('label'=>$langs->trans("Author"), 'checked'=>1, 'position'=>10), - 'p.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), - 'p.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500), - 'p.fk_statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000), + 'sp.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), + 'sp.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500), + 'sp.fk_statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000), ); // Extra fields if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) @@ -169,6 +176,7 @@ if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'e include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php'; +// Do we click on purge search criteria ? if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") ||GETPOST("button_removefilter")) // All tests are required to be compatible with all browsers { $search_categ=''; @@ -177,6 +185,16 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") ||GETPO $search_ref=''; $search_societe=''; $search_montant_ht=''; + $search_montant_vat=''; + $search_montant_ttc=''; + $search_login=''; + $search_product_category=''; + $search_town=''; + $search_zip=""; + $search_state=""; + $search_type=''; + $search_country=''; + $search_type_thirdparty=''; $search_author=''; $yearvalid=''; $monthvalid=''; @@ -186,10 +204,6 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") ||GETPO $object_statut=''; } -$parameters=array('socid'=>$socid); -$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks -if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); - if (empty($reshook)) { $objectclass='SupplierProposal'; @@ -215,15 +229,18 @@ $formpropal = new FormPropal($db); $companystatic=new Societe($db); $formcompany=new FormCompany($db); -llxHeader('',$langs->trans('CommRequest'),'EN:Ask_Price_Supplier|FR:Demande_de_prix_fournisseur'); +$help_url='EN:Ask_Price_Supplier|FR:Demande_de_prix_fournisseur'; +llxHeader('',$langs->trans('CommRequest'),$help_url); $sql = 'SELECT'; if ($sall || $search_product_category > 0) $sql = 'SELECT DISTINCT'; -$sql.= ' s.rowid as socid, s.nom as name, s.town, s.client, s.code_client,'; +$sql.= ' s.rowid as socid, s.nom as name, s.town, s.zip, s.fk_pays, s.client, s.code_client,'; $sql.= " typent.code as typent_code,"; $sql.= " state.code_departement as state_code, state.nom as state_name,"; -$sql.= ' sp.rowid, sp.note_private, sp.total_ht, sp.ref, sp.fk_statut, sp.fk_user_author, sp.date_valid, sp.date_livraison as dp,'; +$sql.= ' sp.rowid, sp.note_private, sp.total_ht, sp.tva as total_vat, sp.total as total_ttc, sp.localtax1, sp.localtax2, sp.ref, sp.fk_statut, sp.fk_user_author, sp.date_valid, sp.date_livraison as dp,'; +$sql.= ' sp.datec as date_creation, sp.tms as date_update,'; $sql.= " p.rowid as project_id, p.ref as project_ref,"; +if (! $user->rights->societe->client->voir && ! $socid) $sql .= " sc.fk_soc, sc.fk_user,"; $sql.= " u.firstname, u.lastname, u.photo, u.login"; // Add fields from extrafields foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : ''); @@ -231,7 +248,7 @@ foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->att $parameters=array(); $reshook=$hookmanager->executeHooks('printFieldListSelect',$parameters); // Note that $action and $object may have been modified by hook $sql.=$hookmanager->resPrint; -$sql.= " FROM ".MAIN_DB_PREFIX."societe as s"; +$sql.= ' FROM '.MAIN_DB_PREFIX.'societe as s'; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_country as country on (country.rowid = s.fk_pays)"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_typent as typent on (typent.id = s.fk_typent)"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = s.fk_departement)"; @@ -254,10 +271,17 @@ if (! $user->rights->societe->client->voir && ! $socid) //restriction { $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; } +if ($search_town) $sql.= natural_search('s.town', $search_town); +if ($search_zip) $sql.= natural_search("s.zip",$search_zip); +if ($search_state) $sql.= natural_search("state.nom",$search_state); +if ($search_country) $sql .= " AND s.fk_pays IN (".$search_country.')'; +if ($search_type_thirdparty) $sql .= " AND s.fk_typent IN (".$search_type_thirdparty.')'; if ($search_ref) $sql .= natural_search('sp.ref', $search_ref); if ($search_societe) $sql .= natural_search('s.nom', $search_societe); if ($search_author) $sql .= natural_search('u.login', $search_author); -if ($search_montant_ht) $sql.= " AND sp.total_ht='".$db->escape(price2num(trim($search_montant_ht)))."'"; +if ($search_montant_ht) $sql.= natural_search('sp.total_ht=', $search_montant_ht, 1); +if ($search_montant_vat != '') $sql.= natural_search("sp.tva", $search_montant_vat, 1); +if ($search_montant_ttc != '') $sql.= natural_search("sp.total", $search_montant_ttc, 1); if ($sall) $sql .= natural_search(array_keys($fieldstosearchall), $sall); if ($socid) $sql.= ' AND s.rowid = '.$socid; if ($search_status >= 0 && $search_status != '') $sql.= ' AND sp.fk_statut IN ('.$search_status.')'; @@ -292,6 +316,23 @@ if ($search_user > 0) { $sql.= " AND c.fk_c_type_contact = tc.rowid AND tc.element='supplier_proposal' AND tc.source='internal' AND c.element_id = sp.rowid AND c.fk_socpeople = ".$search_user; } +// Add where from extra fields +foreach ($search_array_options as $key => $val) +{ + $crit=$val; + $tmpkey=preg_replace('/search_options_/','',$key); + $typ=$extrafields->attribute_type[$tmpkey]; + $mode=0; + if (in_array($typ, array('int','double'))) $mode=1; // Search on a numeric + if ($val && ( ($crit != '' && ! in_array($typ, array('select'))) || ! empty($crit))) + { + $sql .= natural_search('ef.'.$tmpkey, $crit, $mode); + } +} +// Add where from hooks +$parameters=array(); +$reshook=$hookmanager->executeHooks('printFieldListWhere',$parameters); // Note that $action and $object may have been modified by hook +$sql.=$hookmanager->resPrint; $sql.= $db->order($sortfield,$sortorder); $sql.=', sp.ref DESC'; @@ -300,14 +341,14 @@ $sql.=', sp.ref DESC'; $nbtotalofrecords = ''; if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { - $result = $db->query($sql); - $nbtotalofrecords = $db->num_rows($result); + $resql = $db->query($sql); + $nbtotalofrecords = $db->num_rows($resql); } $sql.= $db->plimit($limit + 1,$offset); -$result=$db->query($sql); -if ($result) +$resql=$db->query($sql); +if ($resql) { $objectstatic=new SupplierProposal($db); $userstatic=new User($db); @@ -323,7 +364,7 @@ if ($result) $title = $langs->trans('ListOfSupplierProposals'); } - $num = $db->num_rows($result); + $num = $db->num_rows($resql); $arrayofselected=is_array($toselect)?$toselect:array(); @@ -339,6 +380,8 @@ if ($result) if ($search_sale > 0) $param.='&search_sale='.$search_sale; if ($search_montant_ht) $param.='&search_montant_ht='.$search_montant_ht; if ($search_author) $param.='&search_author='.$search_author; + if ($search_town) $param.='&search_town='.$search_town; + if ($search_zip) $param.='&search_zip='.$search_zip; if ($socid > 0) $param.='&socid='.$socid; if ($search_status != '') $param.='&search_status='.$search_status; if ($optioncss != '') $param.='&optioncss='.$optioncss; @@ -495,6 +538,16 @@ if ($result) $moreforfilter.=$form->select_dolusers($search_user, 'search_user', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); $moreforfilter.=''; } + // If the user can view products + if ($conf->categorie->enabled && ($user->rights->produit->lire || $user->rights->service->lire)) + { + include_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; + $moreforfilter.='
'; + $moreforfilter.=$langs->trans('IncludingProductWithTag'). ': '; + $cate_arbo = $form->select_all_categories(Categorie::TYPE_PRODUCT, null, 'parent', null, null, 1); + $moreforfilter.=$form->selectarray('search_product_category', $cate_arbo, $search_product_category, 1, 0, 0, '', 0, 0, 0, 0, 'maxwidth300', 1); + $moreforfilter.='
'; + } $parameters=array(); $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook if (empty($reshook)) $moreforfilter .= $hookmanager->resPrint; @@ -512,46 +565,142 @@ if ($result) if ($massactionbutton) $selectedfields.=$form->showCheckAddButtons('checkforselect', 1); print '
'; - print '
  '; $searchpitco=$form->showFilterAndCheckAddButtons(0); From e2a7b0943f8e63034a5e46bf7ae332c495999834 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 17 May 2017 14:52:27 +0200 Subject: [PATCH 153/299] Clean dead code --- htdocs/fourn/ajax/getSupplierPrices.php | 6 ------ htdocs/fourn/class/fournisseur.product.class.php | 4 ++-- htdocs/margin/lib/margins.lib.php | 2 -- htdocs/product/fournisseurs.php | 3 ++- 4 files changed, 4 insertions(+), 11 deletions(-) diff --git a/htdocs/fourn/ajax/getSupplierPrices.php b/htdocs/fourn/ajax/getSupplierPrices.php index af3d728dc78..817f83f7ab6 100644 --- a/htdocs/fourn/ajax/getSupplierPrices.php +++ b/htdocs/fourn/ajax/getSupplierPrices.php @@ -78,12 +78,6 @@ if ($idprod > 0) $title.= price($unitprice,0,$langs,0,0,-1,$conf->currency)."/".$langs->trans("Unit"); $price = $unitprice; } - if ($productSupplier->fourn_unitcharges > 0 && ($conf->global->MARGIN_TYPE == "2")) - { - $title.=" + "; - $title.= price($productSupplier->fourn_unitcharges,0,$langs,0,0,-1,$conf->currency); - $price += $productSupplier->fourn_unitcharges; - } $label = price($price,0,$langs,0,0,-1,$conf->currency)."/".$langs->trans("Unit"); if ($productSupplier->fourn_ref) $label.=' ('.$productSupplier->fourn_ref.')'; diff --git a/htdocs/fourn/class/fournisseur.product.class.php b/htdocs/fourn/class/fournisseur.product.class.php index eaff46ddc2c..4f576148099 100644 --- a/htdocs/fourn/class/fournisseur.product.class.php +++ b/htdocs/fourn/class/fournisseur.product.class.php @@ -229,12 +229,12 @@ class ProductFournisseur extends Product $sql.= " remise_percent = ".$remise_percent.","; $sql.= " remise = ".$remise.","; $sql.= " unitprice = ".$unitBuyPrice.","; - $sql.= " unitcharges = ".$unitCharges.","; + $sql.= " unitcharges = ".$unitCharges.","; // deprecated $sql.= " tva_tx = ".$tva_tx.","; $sql.= " fk_availability = ".$availability.","; $sql.= " entity = ".$conf->entity.","; $sql.= " info_bits = ".$newnpr.","; - $sql.= " charges = ".$charges.","; + $sql.= " charges = ".$charges.","; // deprecated $sql.= " delivery_time_days = ".($delivery_time_days != '' ? $delivery_time_days : 'null').","; $sql.= " supplier_reputation = ".(empty($supplier_reputation) ? 'NULL' : "'".$this->db->escape($supplier_reputation)."'"); $sql.= " WHERE rowid = ".$this->product_fourn_price_id; diff --git a/htdocs/margin/lib/margins.lib.php b/htdocs/margin/lib/margins.lib.php index d7dbd5d81eb..e1c2d59b7b8 100644 --- a/htdocs/margin/lib/margins.lib.php +++ b/htdocs/margin/lib/margins.lib.php @@ -124,8 +124,6 @@ function getMarginInfos($pvht, $remise_percent, $tva_tx, $localtax1_tx, $localta if ($product->fetch_product_fournisseur_price($fk_pa)) { $paht_ret = $product->fourn_unitprice * (1 - $product->fourn_remise_percent / 100); - if ($conf->global->MARGIN_TYPE == "2" && $product->fourn_unitcharges > 0) - $paht_ret += $product->fourn_unitcharges; } else { diff --git a/htdocs/product/fournisseurs.php b/htdocs/product/fournisseurs.php index 546d94773a3..2c0a5cd15d7 100644 --- a/htdocs/product/fournisseurs.php +++ b/htdocs/product/fournisseurs.php @@ -678,6 +678,7 @@ if ($id > 0 || $ref) print''; print ''; - print '
'; + print '
'."\n"; print ''; - print ''; - print ''; - - // Date valid - print ''; - + if (! empty($arrayfields['sp.ref']['checked'])) + { + print ''; + } + if (! empty($arrayfields['s.nom']['checked'])) + { + print ''; + } + if (! empty($arrayfields['s.town']['checked'])) print ''; + if (! empty($arrayfields['s.zip']['checked'])) print ''; + // State + if (! empty($arrayfields['state.nom']['checked'])) + { + print ''; + } + // Country + if (! empty($arrayfields['country.code_iso']['checked'])) + { + print ''; + } + // Company type + if (! empty($arrayfields['typent.code']['checked'])) + { + print ''; + } // Date - print ''; + if (! empty($arrayfields['sp.date_valid']['checked'])) + { + print ''; + } + // Date + if (! empty($arrayfields['sp.date_livraison']['checked'])) + { + print ''; + } - // Amount - print ''; - // Author - print ''; - print ''; - // Check boxes + if (! empty($arrayfields['sp.total_ht']['checked'])) + { + // Amount + print ''; + } + if (! empty($arrayfields['sp.total_vat']['checked'])) + { + // Amount + print ''; + } + if (! empty($arrayfields['sp.total_ttc']['checked'])) + { + // Amount + print ''; + } + if (! empty($arrayfields['u.login']['checked'])) + { + // Author + print ''; + } + // Extra fields + if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) + { + foreach($extrafields->attribute_label as $key => $val) + { + if (! empty($arrayfields["ef.".$key]['checked'])) + { + $align=$extrafields->getAlignFlag($key); + $typeofextrafield=$extrafields->attribute_type[$key]; + print ''; + } + } + } + // Fields from hook + $parameters=array('arrayfields'=>$arrayfields); + $reshook=$hookmanager->executeHooks('printFieldListOption',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Date creation + if (! empty($arrayfields['sp.datec']['checked'])) + { + print ''; + } + // Date modification + if (! empty($arrayfields['sp.tms']['checked'])) + { + print ''; + } + // Status + if (! empty($arrayfields['sp.fk_statut']['checked'])) + { + print ''; + } + // Action column print ''; - print_liste_field_titre($langs->trans('Ref'),$_SERVER["PHP_SELF"],'sp.ref','',$param,'',$sortfield,$sortorder); - print_liste_field_titre($langs->trans('Supplier'),$_SERVER["PHP_SELF"],'s.nom','',$param,'',$sortfield,$sortorder); - print_liste_field_titre($langs->trans('Date'),$_SERVER["PHP_SELF"],'sp.date_valid','',$param, 'align="center"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans('SupplierProposalDate'),$_SERVER["PHP_SELF"],'sp.date_livraison','',$param, 'align="center"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans('AmountHT'),$_SERVER["PHP_SELF"],'sp.total_ht','',$param, 'align="right"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans('Author'),$_SERVER["PHP_SELF"],'u.login','',$param,'align="center"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans('Status'),$_SERVER["PHP_SELF"],'sp.fk_statut','',$param,'align="right"',$sortfield,$sortorder); + if (! empty($arrayfields['sp.ref']['checked'])) print_liste_field_titre($arrayfields['sp.ref']['label'],$_SERVER["PHP_SELF"],'sp.ref','',$param,'',$sortfield,$sortorder); + if (! empty($arrayfields['s.nom']['checked'])) print_liste_field_titre($arrayfields['s.nom']['label'],$_SERVER["PHP_SELF"],'s.nom','',$param,'',$sortfield,$sortorder); + if (! empty($arrayfields['s.town']['checked'])) print_liste_field_titre($arrayfields['s.town']['label'],$_SERVER["PHP_SELF"],'s.town','',$param,'',$sortfield,$sortorder); + if (! empty($arrayfields['s.zip']['checked'])) print_liste_field_titre($arrayfields['s.zip']['label'],$_SERVER["PHP_SELF"],'s.zip','',$param,'',$sortfield,$sortorder); + if (! empty($arrayfields['state.nom']['checked'])) print_liste_field_titre($arrayfields['state.nom']['label'],$_SERVER["PHP_SELF"],"state.nom","",$param,'',$sortfield,$sortorder); + if (! empty($arrayfields['country.code_iso']['checked'])) print_liste_field_titre($arrayfields['country.code_iso']['label'],$_SERVER["PHP_SELF"],"country.code_iso","",$param,'align="center"',$sortfield,$sortorder); + if (! empty($arrayfields['typent.code']['checked'])) print_liste_field_titre($arrayfields['typent.code']['label'],$_SERVER["PHP_SELF"],"typent.code","",$param,'align="center"',$sortfield,$sortorder); + if (! empty($arrayfields['sp.date_valid']['checked'])) print_liste_field_titre($arrayfields['sp.date_valid']['label'],$_SERVER["PHP_SELF"],'sp.date_valid','',$param, 'align="center"',$sortfield,$sortorder); + if (! empty($arrayfields['sp.date_livraison']['checked'])) print_liste_field_titre($arrayfields['sp.date_livraison']['label'],$_SERVER["PHP_SELF"],'sp.date_livraison','',$param, 'align="center"',$sortfield,$sortorder); + if (! empty($arrayfields['sp.total_ht']['checked'])) print_liste_field_titre($arrayfields['sp.total_ht']['label'],$_SERVER["PHP_SELF"],'sp.total_ht','',$param, 'align="right"',$sortfield,$sortorder); + if (! empty($arrayfields['sp.total_vat']['checked'])) print_liste_field_titre($arrayfields['sp.total_vat']['label'],$_SERVER["PHP_SELF"],'sp.total_vat','',$param, 'align="right"',$sortfield,$sortorder); + if (! empty($arrayfields['sp.total_ttc']['checked'])) print_liste_field_titre($arrayfields['sp.total_ttc']['label'],$_SERVER["PHP_SELF"],'sp.total_ttc','',$param, 'align="right"',$sortfield,$sortorder); + if (! empty($arrayfields['u.login']['checked'])) print_liste_field_titre($arrayfields['u.login']['label'],$_SERVER["PHP_SELF"],'u.login','',$param,'align="center"',$sortfield,$sortorder); + // Extra fields + if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) + { + foreach($extrafields->attribute_label as $key => $val) + { + if (! empty($arrayfields["ef.".$key]['checked'])) + { + $align=$extrafields->getAlignFlag($key); + print_liste_field_titre($langs->trans($extralabels[$key]),$_SERVER["PHP_SELF"],"ef.".$key,"",$param,($align?'align="'.$align.'"':''),$sortfield,$sortorder); + } + } + } + // Hook fields + $parameters=array('arrayfields'=>$arrayfields); + $reshook=$hookmanager->executeHooks('printFieldListTitle',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + if (! empty($arrayfields['sp.datec']['checked'])) print_liste_field_titre($arrayfields['sp.datec']['label'],$_SERVER["PHP_SELF"],"sp.datec","",$param,'align="center" class="nowrap"',$sortfield,$sortorder); + if (! empty($arrayfields['sp.tms']['checked'])) print_liste_field_titre($arrayfields['sp.tms']['label'],$_SERVER["PHP_SELF"],"sp.tms","",$param,'align="center" class="nowrap"',$sortfield,$sortorder); + if (! empty($arrayfields['sp.fk_statut']['checked'])) print_liste_field_titre($arrayfields['sp.fk_statut']['label'],$_SERVER["PHP_SELF"],"sp.fk_statut","",$param,'align="right"',$sortfield,$sortorder); print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"],"",'','','align="center"',$sortfield,$sortorder,'maxwidthsearch '); - print "\n"; + print ''."\n"; $now = dol_now(); - $var=true; + $i=0; $total=0; $subtotal=0; $totalarray=array(); while ($i < min($num,$limit)) { - $obj = $db->fetch_object($result); + $obj = $db->fetch_object($resql); - $objectstatic->id=$obj->rowid; $objectstatic->ref=$obj->ref; print ''; - print '\n"; - + $url = DOL_URL_ROOT.'/comm/card.php?socid='.$obj->socid; // Company @@ -625,30 +803,157 @@ if ($result) $companystatic->name=$obj->name; $companystatic->client=$obj->client; $companystatic->code_client=$obj->code_client; - print ''; - // Date - print '\n"; + // Thirdparty + if (! empty($arrayfields['s.nom']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + + // Town + if (! empty($arrayfields['s.town']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Zip + if (! empty($arrayfields['s.zip']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + // State + if (! empty($arrayfields['state.nom']['checked'])) + { + print "\n"; + if (! $i) $totalarray['nbfield']++; + } + // Country + if (! empty($arrayfields['country.code_iso']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Type ent + if (! empty($arrayfields['typent.code']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + + // Date proposal + if (! empty($arrayfields['sp.date_valid']['checked'])) + { + print '\n"; + if (! $i) $totalarray['nbfield']++; + } // Date delivery - print '\n"; - - print '\n"; + if (! empty($arrayfields['sp.date_livraison']['checked'])) + { + print '\n"; + if (! $i) $totalarray['nbfield']++; + } + // Amount HT + if (! empty($arrayfields['sp.total_ht']['checked'])) + { + print '\n"; + if (! $i) $totalarray['nbfield']++; + if (! $i) $totalarray['totalhtfield']=$totalarray['nbfield']; + $totalarray['totalht'] += $obj->total_ht; + } + // Amount VAT + if (! empty($arrayfields['sp.total_vat']['checked'])) + { + print '\n"; + if (! $i) $totalarray['nbfield']++; + if (! $i) $totalarray['totalvatfield']=$totalarray['nbfield']; + $totalarray['totalvat'] += $obj->total_vat; + } + // Amount TTC + if (! empty($arrayfields['sp.total_ttc']['checked'])) + { + print '\n"; + if (! $i) $totalarray['nbfield']++; + if (! $i) $totalarray['totalttcfield']=$totalarray['nbfield']; + $totalarray['totalttc'] += $obj->total_ttc; + } + $userstatic->id=$obj->fk_user_author; $userstatic->login=$obj->login; - print '\n"; - print '\n"; + // Author + if (! empty($arrayfields['u.login']['checked'])) + { + print '\n"; + if (! $i) $totalarray['nbfield']++; + } + + // Extra fields + if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) + { + foreach($extrafields->attribute_label as $key => $val) + { + if (! empty($arrayfields["ef.".$key]['checked'])) + { + print 'getAlignFlag($key); + if ($align) print ' align="'.$align.'"'; + print '>'; + $tmpkey='options_'.$key; + print $extrafields->showOutputField($key, $obj->$tmpkey, '', 1); + print ''; + if (! $i) $totalarray['nbfield']++; + } + } + } + // Fields from hook + $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $reshook=$hookmanager->executeHooks('printFieldListValue',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Date creation + if (! empty($arrayfields['sp.datec']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Date modification + if (! empty($arrayfields['sp.tms']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Status + if (! empty($arrayfields['sp.fk_statut']['checked'])) + { + print '\n"; + if (! $i) $totalarray['nbfield']++; + } // Action column print ''; - + if (! $i) $totalarray['nbfield']++; + print "\n"; $total += $obj->total_ht; @@ -668,22 +974,30 @@ if ($result) $i++; } - if ($total>0) + // Show total line + if (isset($totalarray['totalhtfield']) + || isset($totalarray['totalvatfield']) + || isset($totalarray['totalttcfield']) + || isset($totalarray['totalamfield']) + || isset($totalarray['totalrtpfield']) + ) { - if($num<$limit){ - - print ''; - print ''; - print ''; - } - else - { - - print ''; - print ''; - print ''; - } - + print ''; + $i=0; + while ($i < $totalarray['nbfield']) + { + $i++; + if ($i == 1) + { + if ($num < $limit && empty($offset)) print ''; + else print ''; + } + elseif ($totalarray['totalhtfield'] == $i) print ''; + elseif ($totalarray['totalvatfield'] == $i) print ''; + elseif ($totalarray['totalttcfield'] == $i) print ''; + else print ''; + } + print ''; } $db->free($resql); From 88fc7dbc3e7596a19b38fa93d0630665fae18b4c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 18 May 2017 19:19:55 +0200 Subject: [PATCH 179/299] Fix remove warning --- htdocs/core/modules/DolibarrModules.class.php | 2 +- test/phpunit/CodingPhpTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/DolibarrModules.class.php b/htdocs/core/modules/DolibarrModules.class.php index f501d33c29a..cdb4ea33f73 100644 --- a/htdocs/core/modules/DolibarrModules.class.php +++ b/htdocs/core/modules/DolibarrModules.class.php @@ -848,7 +848,7 @@ class DolibarrModules // Can not be abstract, because we need to insta $resql=$this->db->query($sql); if (! $resql) $err++; - $note=json_encode(array('authorid'=>$user->id, 'ip'=>$_SERVER['REMOTE_ADDR'])); + $note=json_encode(array('authorid'=>$user->id, 'ip'=>(empty($_SERVER['REMOTE_ADDR'])?'':$_SERVER['REMOTE_ADDR']))); $sql = "INSERT INTO ".MAIN_DB_PREFIX."const (name, value, visible, entity, note) VALUES"; $sql.= " (".$this->db->encrypt($this->const_name,1); diff --git a/test/phpunit/CodingPhpTest.php b/test/phpunit/CodingPhpTest.php index 4860e5b5e38..159323a9e83 100644 --- a/test/phpunit/CodingPhpTest.php +++ b/test/phpunit/CodingPhpTest.php @@ -141,7 +141,7 @@ class CodingPhpTest extends PHPUnit_Framework_TestCase $langs=$this->savlangs; $db=$this->savdb; - include DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; $filesarray = dol_dir_list(DOL_DOCUMENT_ROOT, 'files', 1, '\.php', null, 'fullname'); foreach($filesarray as $key => $file) From a28f8c84e42b2dfb2b636c803465c17f0e85bdd8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 18 May 2017 22:23:59 +0200 Subject: [PATCH 180/299] Fix travis error --- htdocs/webservices/server_order.php | 1 + htdocs/webservices/server_payment.php | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/webservices/server_order.php b/htdocs/webservices/server_order.php index b0f794dd55f..c84eefa3480 100644 --- a/htdocs/webservices/server_order.php +++ b/htdocs/webservices/server_order.php @@ -793,6 +793,7 @@ function createOrder($authentication,$order) * * @param array $authentication Array of authentication information * @param int $id Id of order to validate + * @param int $id_warehouse Id of warehouse to use for stock decrease * @return array Array result */ function validOrder($authentication,$id='',$id_warehouse=0) diff --git a/htdocs/webservices/server_payment.php b/htdocs/webservices/server_payment.php index e8e4f5e1cb0..d6cd261a686 100644 --- a/htdocs/webservices/server_payment.php +++ b/htdocs/webservices/server_payment.php @@ -129,12 +129,13 @@ $server->register( 'WS to create a new payment' ); + /** * Create a payment * * @param array $authentication Array of authentication information - * @param Facture $invoice Invoice - * @return array Array result + * @param Object $payment Payment + * @return array Array result */ function createPayment($authentication, $payment) { From ff2a268831c157ec261f7425e423aeb8e556b40a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 19 May 2017 00:52:13 +0200 Subject: [PATCH 181/299] NEW Architecture to manage search criteria persistance (using save_lastsearch_values=1 on exit links and restore_lastsearch_values=1 in entry links) --- htdocs/core/lib/functions.lib.php | 42 +++++++++++++++++++--- htdocs/core/menus/standard/auguria.lib.php | 8 +++++ htdocs/core/menus/standard/eldy.lib.php | 16 +++++---- htdocs/main.inc.php | 4 ++- htdocs/projet/card.php | 2 +- htdocs/projet/contact.php | 2 +- htdocs/projet/document.php | 2 +- htdocs/projet/element.php | 2 +- htdocs/projet/ganttview.php | 2 +- htdocs/projet/index.php | 2 +- htdocs/projet/info.php | 2 +- htdocs/projet/note.php | 4 +-- htdocs/projet/tasks.php | 2 +- 13 files changed, 68 insertions(+), 22 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index c9ec77c76de..4e17c62d3f5 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -264,6 +264,8 @@ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) { global $mysoc,$user,$conf; + if (empty($paramname)) return 'BadFirstParameterForGETPOST'; + if (empty($method)) $out = isset($_GET[$paramname])?$_GET[$paramname]:(isset($_POST[$paramname])?$_POST[$paramname]:''); elseif ($method==1) $out = isset($_GET[$paramname])?$_GET[$paramname]:''; elseif ($method==2) $out = isset($_POST[$paramname])?$_POST[$paramname]:''; @@ -279,11 +281,11 @@ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) $relativepathstring = preg_replace('/^\//', '', $relativepathstring); // Management of default values - if (! isset($_GET['sortfield']) && ! empty($conf->global->MAIN_ENABLE_DEFAULT_VALUES)) // If we did a click on a field to sort, we do no apply default values. Same if option MAIN_DISABLE_DEFAULT_VALUES is on + if (! isset($_GET['sortfield']) && ! empty($conf->global->MAIN_ENABLE_DEFAULT_VALUES)) // If we did a click on a field to sort, we do no apply default values. Same if option MAIN_ENABLE_DEFAULT_VALUES is not set { - if (! empty($_GET['action']) && $_GET['action'] == 'create' && ! empty($paramname) && ! isset($_GET[$paramname]) && ! isset($_POST[$paramname])) + if (! empty($_GET['action']) && $_GET['action'] == 'create' && ! isset($_GET[$paramname]) && ! isset($_POST[$paramname])) { - if (! empty($user->default_values)) // $user->default_values defined from menu default values, and values loaded not at first + if (! empty($user->default_values)) // $user->default_values defined from menu default values { //var_dump($user->default_values[$relativepathstring]['createform']); if (isset($user->default_values[$relativepathstring]['createform'][$paramname])) $out = $user->default_values[$relativepathstring]['createform'][$paramname]; @@ -328,11 +330,34 @@ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) } } } + + // Retrieve values into restore_lastsearch_values + if ($_GET['restore_lastsearch_values']) // Keep $_GET here + { + if (! empty($_SESSION['lastsearch_values_'.$relativepathstring])) + { + $tmp=json_decode($_SESSION['lastsearch_values_'.$relativepathstring], true); + if (is_array($tmp)) + { + foreach($tmp as $key => $val) + { + if ($key == $paramname) + { + $out=$val; + break; + } + } + } + } + } + } if (empty($check) && ! empty($conf->global->MAIN_FEATURES_LEVEL) && $conf->global->MAIN_FEATURES_LEVEL >= 2) { dol_syslog("Deprecated use of GETPOST, called with 1st param = ".$paramname." and 2nd param not defined, when calling page ".$_SERVER["PHP_SELF"], LOG_WARNING); + // Enable this line to know who call the GETPOST with empty $check parameter. + //var_dump(debug_backtrace()[0]); } if (! empty($check)) @@ -423,14 +448,23 @@ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) } } + // Code for search criteria persistence. // Save data into session if key start with 'search_' or is 'smonth', 'syear', 'month', 'year' if (empty($method) || $method == 3 || $method == 4) { //if (preg_match('/^search_/', $paramname) || in_array($paramname, array('sortorder', 'sortfield", 'smonth', 'syear', 'month', 'year'))) if (preg_match('/^search_/', $paramname) || in_array($paramname, array('sortorder','sortfield'))) { + //var_dump($user->default_values[$relativepathstring]);exit; //if ($paramname == 'sortorder') var_dump($paramname.' - '.$out); - $user->lastsearch_values_tmp[$relativepathstring][$paramname]=$out; + + // We save search key only if: + // - not empty, or + // - if value is empty and a default value exists that is not empty (it means we did a filter to an empty value when default was not). + if (! empty($out) || ! empty($user->default_values[$relativepathstring][$paramname])) + { + $user->lastsearch_values_tmp[$relativepathstring][$paramname]=$out; + } } } diff --git a/htdocs/core/menus/standard/auguria.lib.php b/htdocs/core/menus/standard/auguria.lib.php index 7272eb000d4..3cc9c569120 100644 --- a/htdocs/core/menus/standard/auguria.lib.php +++ b/htdocs/core/menus/standard/auguria.lib.php @@ -103,6 +103,14 @@ function print_auguria_menu($db,$atarget,$type_user,&$tabMenu,&$menu,$noout=0,$m $url=preg_replace('/__USERID__/',$user->id,$url); $shorturl=preg_replace('/__USERID__/',$user->id,$shorturl); + // TODO Find a generic solution + if (preg_match('/search_project_user=__search_project_user__/', $shorturl)) + { + $search_project_user = GETPOST('search_project_user','int'); + if ($search_project_user) $shorturl=preg_replace('/search_project_user=__search_project_user__/', 'search_project_user='.$search_project_user, $shorturl); + else $shorturl=preg_replace('/search_project_user=__search_project_user__/', '', $shorturl); + } + // Define the class (top menu selected or not) if (! empty($_SESSION['idmenu']) && $newTabMenu[$i]['rowid'] == $_SESSION['idmenu']) $classname='class="tmenusel"'; else if (! empty($_SESSION["mainmenu"]) && $newTabMenu[$i]['mainmenu'] == $_SESSION["mainmenu"]) $classname='class="tmenusel"'; diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index 4aa5064977d..521fd6831f2 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -1299,11 +1299,13 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu if (! empty($conf->projet->enabled)) { $langs->load("projects"); - + + $search_project_user = GETPOST('search_project_user','int'); + // Project affected to user - $newmenu->add("/projet/index.php?leftmenu=projects&search_project_user=".GETPOST('search_project_user'), $langs->trans("Projects"), 0, $user->rights->projet->lire, '', $mainmenu, 'projects'); - $newmenu->add("/projet/card.php?leftmenu=projects&action=create&search_project_user=".GETPOST('search_project_user'), $langs->trans("NewProject"), 1, $user->rights->projet->creer); - $newmenu->add("/projet/list.php?leftmenu=projects&search_project_user=".GETPOST('search_project_user')."&search_status=99", $langs->trans("List"), 1, $user->rights->projet->lire); + $newmenu->add("/projet/index.php?leftmenu=projects".($search_project_user?'&search_project_user='.$search_project_user:''), $langs->trans("Projects"), 0, $user->rights->projet->lire, '', $mainmenu, 'projects'); + $newmenu->add("/projet/card.php?leftmenu=projects&action=create".($search_project_user?'&search_project_user='.$search_project_user:''), $langs->trans("NewProject"), 1, $user->rights->projet->creer); + $newmenu->add("/projet/list.php?leftmenu=projects".($search_project_user?'&search_project_user='.$search_project_user:'')."&search_status=99", $langs->trans("List"), 1, $user->rights->projet->lire); // All project i have permission on /* @@ -1316,10 +1318,10 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu if (empty($conf->global->PROJECT_HIDE_TASKS)) { // Project affected to user - $newmenu->add("/projet/activity/index.php?leftmenu=tasks&search_project_user=".GETPOST('search_project_user'), $langs->trans("Activities"), 0, $user->rights->projet->lire); + $newmenu->add("/projet/activity/index.php?leftmenu=tasks".($search_project_user?'&search_project_user='.$search_project_user:''), $langs->trans("Activities"), 0, $user->rights->projet->lire); $newmenu->add("/projet/tasks.php?leftmenu=tasks&action=create", $langs->trans("NewTask"), 1, $user->rights->projet->creer); - $newmenu->add("/projet/tasks/list.php?leftmenu=tasks&search_project_user=".GETPOST('search_project_user'), $langs->trans("List"), 1, $user->rights->projet->lire); - $newmenu->add("/projet/activity/perweek.php?leftmenu=tasks&search_project_user=".GETPOST('search_project_user'), $langs->trans("NewTimeSpent"), 1, $user->rights->projet->lire); + $newmenu->add("/projet/tasks/list.php?leftmenu=tasks".($search_project_user?'&search_project_user='.$search_project_user:''), $langs->trans("List"), 1, $user->rights->projet->lire); + $newmenu->add("/projet/activity/perweek.php?leftmenu=tasks".($search_project_user?'&search_project_user='.$search_project_user:''), $langs->trans("NewTimeSpent"), 1, $user->rights->projet->lire); // All project i have permission on /*$newmenu->add("/projet/activity/index.php", $langs->trans("Activities"), 0, $user->rights->projet->lire && $user->rights->projet->lire); diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index d632e91d537..73f0a815413 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -646,6 +646,7 @@ if (! defined('NOLOGIN')) // Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array $hookmanager->initHooks(array('main')); + // Code for search criteria persistence. if (! empty($_GET['save_lastsearch_values'])) // Keep $_GET here { $relativepathstring = preg_replace('/\?.*$/','',$_SERVER["HTTP_REFERER"]); @@ -1886,6 +1887,7 @@ if (! function_exists("llxFooter")) // Global html output events ($mesgs, $errors, $warnings) dol_htmloutput_events(); + // Code for search criteria persistence. // Save $user->lastsearch_values if defined (define on list pages when a form field search_xxx exists) if (is_object($user) && ! empty($user->lastsearch_values_tmp) && is_array($user->lastsearch_values_tmp)) { @@ -1897,7 +1899,7 @@ if (! function_exists("llxFooter")) { if (empty($val['sortfield'])) unset($val['sortfield']); if (empty($val['sortorder'])) unset($val['sortorder']); - dol_syslog('Save lastsearch_values_tmp_'.$key.'='.json_encode($val, 0, 1)); + dol_syslog('Save lastsearch_values_tmp_'.$key.'='.json_encode($val, 0, 1)." (systematic recording of last search criteria)"); $_SESSION['lastsearch_values_tmp_'.$key]=json_encode($val); unset($_SESSION['lastsearch_values_'.$key]); } diff --git a/htdocs/projet/card.php b/htdocs/projet/card.php index 47d0f1c3148..f6355ec5566 100644 --- a/htdocs/projet/card.php +++ b/htdocs/projet/card.php @@ -837,7 +837,7 @@ elseif ($object->id > 0) { // Project card - $linkback = ''.$langs->trans("BackToList").''; + $linkback = ''.$langs->trans("BackToList").''; $morehtmlref='
'; // Title diff --git a/htdocs/projet/contact.php b/htdocs/projet/contact.php index e843d4951e4..72b82ac2bb0 100644 --- a/htdocs/projet/contact.php +++ b/htdocs/projet/contact.php @@ -151,7 +151,7 @@ if ($id > 0 || ! empty($ref)) // Project card - $linkback = ''.$langs->trans("BackToList").''; + $linkback = ''.$langs->trans("BackToList").''; $morehtmlref='
'; // Title diff --git a/htdocs/projet/document.php b/htdocs/projet/document.php index 2d5a6cd71d0..21dd30f560c 100644 --- a/htdocs/projet/document.php +++ b/htdocs/projet/document.php @@ -109,7 +109,7 @@ if ($object->id > 0) // Project card - $linkback = ''.$langs->trans("BackToList").''; + $linkback = ''.$langs->trans("BackToList").''; $morehtmlref='
'; // Title diff --git a/htdocs/projet/element.php b/htdocs/projet/element.php index 8aebe756d70..f745c71d761 100644 --- a/htdocs/projet/element.php +++ b/htdocs/projet/element.php @@ -128,7 +128,7 @@ dol_fiche_head($head, 'element', $langs->trans("Project"), -1, ($object->public? // Project card -$linkback = ''.$langs->trans("BackToList").''; +$linkback = ''.$langs->trans("BackToList").''; $morehtmlref='
'; // Title diff --git a/htdocs/projet/ganttview.php b/htdocs/projet/ganttview.php index 36fbfccca77..7ec9dcf1a4b 100644 --- a/htdocs/projet/ganttview.php +++ b/htdocs/projet/ganttview.php @@ -102,7 +102,7 @@ if ($id > 0 || ! empty($ref)) // Project card - $linkback = ''.$langs->trans("BackToList").''; + $linkback = ''.$langs->trans("BackToList").''; $morehtmlref='
'; // Title diff --git a/htdocs/projet/index.php b/htdocs/projet/index.php index 8295e106be9..c7f0181dbf5 100644 --- a/htdocs/projet/index.php +++ b/htdocs/projet/index.php @@ -33,7 +33,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; $langs->load("projects"); $langs->load("companies"); -$mine = GETPOST('mode')=='mine' ? 1 : 0; +$mine = GETPOST('mode','aZ09')=='mine' ? 1 : 0; $search_project_user = GETPOST('search_project_user','int'); // Security check diff --git a/htdocs/projet/info.php b/htdocs/projet/info.php index 3206fd51244..74015626b9e 100644 --- a/htdocs/projet/info.php +++ b/htdocs/projet/info.php @@ -112,7 +112,7 @@ dol_fiche_head($head, 'agenda', $langs->trans("Project"), -1, ($object->public?' // Project card -$linkback = ''.$langs->trans("BackToList").''; +$linkback = ''.$langs->trans("BackToList").''; $morehtmlref='
'; // Title diff --git a/htdocs/projet/note.php b/htdocs/projet/note.php index 9a73e481666..88217fbfb1c 100644 --- a/htdocs/projet/note.php +++ b/htdocs/projet/note.php @@ -30,7 +30,7 @@ $langs->load('projects'); $action=GETPOST('action','aZ09'); $id = GETPOST('id','int'); -$ref= GETPOST('ref'); +$ref= GETPOST('ref','alpha'); $mine = $_REQUEST['mode']=='mine' ? 1 : 0; //if (! $user->rights->projet->all->lire) $mine=1; // Special for projects @@ -82,7 +82,7 @@ if ($id > 0 || ! empty($ref)) // Project card - $linkback = ''.$langs->trans("BackToList").''; + $linkback = ''.$langs->trans("BackToList").''; $morehtmlref='
'; // Title diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php index e8a949f3191..85fa0f640e9 100644 --- a/htdocs/projet/tasks.php +++ b/htdocs/projet/tasks.php @@ -225,7 +225,7 @@ if ($id > 0 || ! empty($ref)) // Project card - $linkback = ''.$langs->trans("BackToList").''; + $linkback = ''.$langs->trans("BackToList").''; $morehtmlref='
'; // Title From 7b784a1dcbc5e3af7c83e3dda89252871845c4ee Mon Sep 17 00:00:00 2001 From: absnc Date: Fri, 19 May 2017 17:50:10 +1100 Subject: [PATCH 182/299] Enable shipments for project overview tab --- htdocs/expedition/card.php | 16 ++ htdocs/expedition/class/expedition.class.php | 2 + htdocs/expedition/shipment.php | 1 + .../install/mysql/migration/5.0.0-6.0.0.sql | 2 + .../install/mysql/tables/llx_expedition.sql | 1 + htdocs/langs/en_US/projects.lang | 1 + htdocs/langs/fr_FR/projects.lang | 1 + htdocs/langs/fr_NC/projects.lang | 197 ++++++++++++++++++ htdocs/langs/fr_NC/sendings.lang | 71 +++++++ htdocs/projet/element.php | 12 ++ 10 files changed, 304 insertions(+) create mode 100644 htdocs/langs/fr_NC/projects.lang create mode 100644 htdocs/langs/fr_NC/sendings.lang diff --git a/htdocs/expedition/card.php b/htdocs/expedition/card.php index a0280ce9e39..8924577009f 100644 --- a/htdocs/expedition/card.php +++ b/htdocs/expedition/card.php @@ -191,6 +191,7 @@ if (empty($reshook)) $object->note = GETPOST('note','alpha'); $object->origin = $origin; $object->origin_id = $origin_id; + $object->fk_project = GETPOST('projectid'); $object->weight = GETPOST('weight','int')==''?"NULL":GETPOST('weight','int'); $object->sizeH = GETPOST('sizeH','int')==''?"NULL":GETPOST('sizeH','int'); $object->sizeW = GETPOST('sizeW','int')==''?"NULL":GETPOST('sizeW','int'); @@ -696,6 +697,21 @@ if ($action == 'create') print '
'; print ''; + // Project + if (! empty($conf->projet->enabled)) + { + $projectid = GETPOST('projectid')?GETPOST('projectid'):0; + if ($origin == 'project') $projectid = ($originid ? $originid : 0); + + $langs->load("projects"); + print ''; + print ''; + print ''; + } + // Date delivery planned print ''; print ''; + print ''; + + print "
'; - print ''; - print ''; - print ''; - print ''; - //print $langs->trans('Month').': '; - print ''; - //print ' '.$langs->trans('Year').': '; - $syearvalid = $yearvalid; - $formother->select_year($syearvalid,'yearvalid',1, 20, 5); - print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print $form->select_country($search_country,'search_country','',0,'maxwidth100'); + print ''; + print $form->selectarray("search_type_thirdparty", $formcompany->typent_array(0), $search_type_thirdparty, 0, 0, 0, '', 0, 0, 0, (empty($conf->global->SOCIETE_SORT_ON_TYPEENT)?'ASC':$conf->global->SOCIETE_SORT_ON_TYPEENT)); + print ''; - //print $langs->trans('Month').': '; - print ''; - //print ' '.$langs->trans('Year').': '; - $syear = $year; - $formother->select_year($syear,'year',1, 20, 5); - print ''; + //print $langs->trans('Month').': '; + print ''; + //print ' '.$langs->trans('Year').': '; + $syearvalid = $yearvalid; + $formother->select_year($syearvalid,'yearvalid',1, 20, 5); + print ''; + //print $langs->trans('Month').': '; + print ''; + //print ' '.$langs->trans('Year').': '; + $syear = $year; + $formother->select_year($syear,'year',1, 20, 5); + print ''; - print ''; - print ''; - print ''; - print ''; - $formpropal->selectProposalStatus($search_status,1,0,1,'supplier','search_status'); - print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + if (in_array($typeofextrafield, array('varchar', 'int', 'double', 'select'))) + { + $crit=$val; + $tmpkey=preg_replace('/search_options_/','',$key); + $searchclass=''; + if (in_array($typeofextrafield, array('varchar', 'select'))) $searchclass='searchstring'; + if (in_array($typeofextrafield, array('int', 'double'))) $searchclass='searchnum'; + print ''; + } + print ''; + print ''; + print ''; + $formpropal->selectProposalStatus($search_status,1,0,1,'supplier','search_status'); + print ''; $searchpicto=$form->showFilterButtons(); print $searchpicto; @@ -561,63 +710,92 @@ if ($result) // Fields title print '
'; + + if (! empty($arrayfields['sp.ref']['checked'])) + { + print ''; - print ''; - // Picto + Ref - print ''; - // Warning - $warnornote=''; - if ($obj->fk_statut == 1 && $db->jdate($obj->date_valid) < ($now - $conf->supplier_proposal->warning_delay)) $warnornote.=img_warning($langs->trans("Late")); - if (! empty($obj->note_private)) - { - $warnornote.=($warnornote?' ':''); - $warnornote.= ''; - $warnornote.= ''.img_picto($langs->trans("ViewPrivateNote"),'object_generic').''; - $warnornote.= ''; - } - if ($warnornote) - { - print '\n"; + if (! $i) $totalarray['nbfield']++; } - // Other picto tool - print '
'; - print $objectstatic->getNomUrl(1); - print ''; - print $warnornote; + print ''; + // Picto + Ref + print ''; + // Warning + $warnornote=''; + if ($obj->fk_statut == 1 && $db->jdate($obj->date_valid) < ($now - $conf->supplier_proposal->warning_delay)) $warnornote.=img_warning($langs->trans("Late")); + if (! empty($obj->note_private)) + { + $warnornote.=($warnornote?' ':''); + $warnornote.= ''; + $warnornote.= ''.img_picto($langs->trans("ViewPrivateNote"),'object_generic').''; + $warnornote.= ''; + } + if ($warnornote) + { + print ''; + } + // Other picto tool + print '
'; + print $objectstatic->getNomUrl(1); print ''; + print $warnornote; + print ''; + $filename=dol_sanitizeFileName($obj->ref); + $filedir=$conf->supplier_proposal->dir_output . '/' . dol_sanitizeFileName($obj->ref); + $urlsource=$_SERVER['PHP_SELF'].'?id='.$obj->rowid; + print $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir); + print '
'; + + print "
'; - $filename=dol_sanitizeFileName($obj->ref); - $filedir=$conf->supplier_proposal->dir_output . '/' . dol_sanitizeFileName($obj->ref); - $urlsource=$_SERVER['PHP_SELF'].'?id='.$obj->rowid; - print $formfile->getDocumentsLink($objectstatic->element, $filename, $filedir); - print '
'; - - print "
'; - print $companystatic->getNomUrl(1,'customer'); - print ''; - print dol_print_date($db->jdate($obj->date_valid), 'day'); - print "'; + print $companystatic->getNomUrl(1,'customer'); + print ''; + print $obj->town; + print ''; + print $obj->zip; + print '".$obj->state_name."'; + $tmparray=getCountry($obj->fk_pays,'all'); + print $tmparray['label']; + print ''; + if (count($typenArray)==0) $typenArray = $formcompany->typent_array(1); + print $typenArray[$obj->typent_code]; + print ''; + print dol_print_date($db->jdate($obj->date_valid), 'day'); + print "'; - print dol_print_date($db->jdate($obj->dp), 'day'); - print "'.price($obj->total_ht)."'; + print dol_print_date($db->jdate($obj->dp), 'day'); + print "'.price($obj->total_ht)."'.price($obj->total_vat)."'.price($obj->total_ttc)."'; - if ($userstatic->id) print $userstatic->getLoginUrl(1); - else print ' '; - print "'.$objectstatic->LibStatut($obj->fk_statut,5)."'; + if ($userstatic->id) print $userstatic->getLoginUrl(1); + else print ' '; + print "'; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour'); + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour'); + print ''.$objectstatic->LibStatut($obj->fk_statut,5)."'; @@ -659,7 +964,8 @@ if ($result) print ''; } print '
'.$langs->trans("TotalHT").''.price($total).'
'.$langs->trans("TotalHTforthispage").''.price($total).'
'.$langs->trans("Total").''.$langs->trans("Totalforthispage").''.price($totalarray['totalht']).''.price($totalarray['totalvat']).''.price($totalarray['totalttc']).'
'.$soc->getNomUrl(1).'
' . $langs->trans("Project") . ''; + $numprojet = $formproject->select_projects($soc->id, $projectid, 'projectid', 0); + print '   id).'">' . $langs->trans("AddProject") . ''; + print '
'.$langs->trans("DateDeliveryPlanned").''; diff --git a/htdocs/expedition/class/expedition.class.php b/htdocs/expedition/class/expedition.class.php index 8d6822fd360..2b7ada7a0c2 100644 --- a/htdocs/expedition/class/expedition.class.php +++ b/htdocs/expedition/class/expedition.class.php @@ -211,6 +211,7 @@ class Expedition extends CommonObject $sql.= ", date_expedition"; $sql.= ", date_delivery"; $sql.= ", fk_soc"; + $sql.= ", fk_projet"; $sql.= ", fk_address"; $sql.= ", fk_shipping_method"; $sql.= ", tracking_number"; @@ -234,6 +235,7 @@ class Expedition extends CommonObject $sql.= ", ".($this->date_expedition>0?"'".$this->db->idate($this->date_expedition)."'":"null"); $sql.= ", ".($this->date_delivery>0?"'".$this->db->idate($this->date_delivery)."'":"null"); $sql.= ", ".$this->socid; + $sql.= ", ".$this->fk_project; $sql.= ", ".($this->fk_delivery_address>0?$this->fk_delivery_address:"null"); $sql.= ", ".($this->shipping_method_id>0?$this->shipping_method_id:"null"); $sql.= ", '".$this->db->escape($this->tracking_number)."'"; diff --git a/htdocs/expedition/shipment.php b/htdocs/expedition/shipment.php index ede1cc6bec9..849053c610c 100644 --- a/htdocs/expedition/shipment.php +++ b/htdocs/expedition/shipment.php @@ -880,6 +880,7 @@ if ($id > 0 || ! empty($ref)) print ''; print ''; print ''; + print ''; //print ''; $langs->load("stocks"); diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index 6ba7707b249..72ef855f96b 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -47,6 +47,8 @@ ALTER TABLE llx_ecm_files ADD INDEX idx_ecm_files_label (label); ALTER TABLE llx_holiday ADD COLUMN import_key varchar(14); ALTER TABLE llx_holiday ADD COLUMN extraparams varchar(255); +ALTER TABLE llx_expedition ADD COLUMN fk_projet integer DEFAULT NULL after fk_soc; + ALTER TABLE llx_expensereport ADD COLUMN import_key varchar(14); ALTER TABLE llx_expensereport ADD COLUMN extraparams varchar(255); diff --git a/htdocs/install/mysql/tables/llx_expedition.sql b/htdocs/install/mysql/tables/llx_expedition.sql index aa71e62c0a2..088e4893c06 100644 --- a/htdocs/install/mysql/tables/llx_expedition.sql +++ b/htdocs/install/mysql/tables/llx_expedition.sql @@ -26,6 +26,7 @@ create table llx_expedition ref varchar(30) NOT NULL, entity integer DEFAULT 1 NOT NULL, -- multi company id fk_soc integer NOT NULL, + fk_projet integer DEFAULT NULL, ref_ext varchar(30), -- reference into an external system (not used by dolibarr) ref_int varchar(30), -- reference into an internal system (used by dolibarr to store extern id like paypal info) diff --git a/htdocs/langs/en_US/projects.lang b/htdocs/langs/en_US/projects.lang index 97d47589d53..c98c2120e21 100644 --- a/htdocs/langs/en_US/projects.lang +++ b/htdocs/langs/en_US/projects.lang @@ -82,6 +82,7 @@ ListPredefinedInvoicesAssociatedProject=List of customer template invoices assoc ListSupplierOrdersAssociatedProject=List of supplier orders associated with the project ListSupplierInvoicesAssociatedProject=List of supplier invoices associated with the project ListContractAssociatedProject=List of contracts associated with the project +ListShippingAssociatedProject=List of shippings associated with the project ListFichinterAssociatedProject=List of interventions associated with the project ListExpenseReportsAssociatedProject=List of expense reports associated with the project ListDonationsAssociatedProject=List of donations associated with the project diff --git a/htdocs/langs/fr_FR/projects.lang b/htdocs/langs/fr_FR/projects.lang index fed1df8c59f..34553656359 100644 --- a/htdocs/langs/fr_FR/projects.lang +++ b/htdocs/langs/fr_FR/projects.lang @@ -79,6 +79,7 @@ ListSupplierOrdersAssociatedProject=Liste des commandes fournisseurs associées ListSupplierInvoicesAssociatedProject=Liste des factures fournisseurs associées au projet ListContractAssociatedProject=Liste des contrats associés au projet ListFichinterAssociatedProject=Liste des interventions associées au projet +ListShippingAssociatedProject=Liste des expéditions associées au projet ListExpenseReportsAssociatedProject=Liste des notes de frais associées avec ce projet ListDonationsAssociatedProject=Liste des dons associés au projet ListActionsAssociatedProject=Liste des événements associés au projet diff --git a/htdocs/langs/fr_NC/projects.lang b/htdocs/langs/fr_NC/projects.lang new file mode 100644 index 00000000000..34553656359 --- /dev/null +++ b/htdocs/langs/fr_NC/projects.lang @@ -0,0 +1,197 @@ +# Dolibarr language file - Source file is en_US - projects +RefProject=Réf. projet +ProjectRef=Ref projet +ProjectId=Id projet +ProjectLabel=Libellé projet +Project=Projet +Projects=Projets +ProjectsArea=Espace projets +ProjectStatus=Statut projet +SharedProject=Tout le monde +PrivateProject=Contacts projet +MyProjectsDesc=Cette vue projet est restreinte aux projets pour lesquels vous êtes un contact affecté (quel qu'en soit le type). +ProjectsPublicDesc=Cette vue présente tous les projets pour lesquels vous êtes habilité à avoir une visibilité. +TasksOnProjectsPublicDesc=Cette vue affiche toutes les tâches de projets selon vos permissions utilisateur +ProjectsPublicTaskDesc=Cette vue présente tous les projets et tâches pour lesquels vous êtes habilité à avoir une visibilité. +ProjectsDesc=Cette vue présente tous les projets (vos habilitations vous offrant une vue exhaustive). +TasksOnProjectsDesc=Cette vue présente toutes les tâches sur tous les projets (vos permissions d'utilisateur vous accordent la permission de voir tout). +MyTasksDesc=Cette vue est restreinte aux projets et tâches pour lesquels vous êtes un contact affecté à au moins une tâche (quel qu'en soit le type). +OnlyOpenedProject=Seuls les projets ouverts sont visibles (les projets à l'état brouillon ou fermé ne sont pas visibles). +ClosedProjectsAreHidden=Les projets fermés ne sont pas visible. +TasksPublicDesc=Cette vue présente tous les projets et tâches pour lesquels vous êtes habilité à avoir une visibilité. +TasksDesc=Cette vue présente tous les projets et tâches (vos habilitations vous offrant une vue exhaustive). +AllTaskVisibleButEditIfYouAreAssigned=Toutes les tâches d'un tel projet sont visibles mais il n'est possible de saisir du temps passé que sur celles qui vous sont assignées.\nAssignez vous la tache pour pouvoir saisir un temps passé. +OnlyYourTaskAreVisible=Seules les tâches qui vous sont assignées sont visibles. Assignez vous une tâche pour la voir et saisir du temps passé +ImportDatasetTasks=Tâches des projets +NewProject=Nouveau projet +AddProject=Créer projet +DeleteAProject=Supprimer un projet +DeleteATask=Supprimer une tâche +ConfirmDeleteAProject=Êtes-vous sûr de vouloir supprimer ce projet ? +ConfirmDeleteATask=Êtes-vous sûr de vouloir supprimer cette tâche ? +OpenedProjects=Projets ouverts +OpenedTasks=Tâches ouvertes +OpportunitiesStatusForOpenedProjects=Montant des opportunités des projets ouverts par statut +OpportunitiesStatusForProjects=Montant des opportunités des projets par statut +ShowProject=Afficher projet +SetProject=Définir projet +NoProject=Aucun projet défini ou responsable +NbOfProjects=Nombre de projets +TimeSpent=Temps consommé +TimeSpentByYou=Temps consommé par vous +TimeSpentByUser=Temps consommé par utilisateur +TimesSpent=Temps consommés +RefTask=Ref. tâche +LabelTask=Libellé tâche +TaskTimeSpent=Temps consommé sur les tâches +TaskTimeUser=Utilisateur +TaskTimeNote=Note +TaskTimeDate=Date +TasksOnOpenedProject=Tâches sur projets ouverts +WorkloadNotDefined=Charge de travail non définie +NewTimeSpent=Nouveau consommé +MyTimeSpent=Mon consommé +Tasks=Tâches +Task=Tâche +TaskDateStart=Date de début de tâche +TaskDateEnd=Date de fin de tâche +TaskDescription=Description de la tâche +NewTask=Nouvelle tâche +AddTask=Créer tâche +AddTimeSpent=Saisir temps consommé +Activity=Activité +Activities=Tâches/activités +MyActivities=Mes tâches/activités +MyProjects=Mes projets +MyProjectsArea=Espace Mes projets +DurationEffective=Durée effective +ProgressDeclared=Progression déclarée +ProgressCalculated=Progression calculée +Time=Temps +ListOfTasks=Liste de tâches +GoToListOfTimeConsumed=Aller à la liste des temps consommés +GoToListOfTasks=Aller à la liste des tâches +ListProposalsAssociatedProject=Liste des propositions commerciales associées au projet +ListOrdersAssociatedProject=Liste des commandes clients associées au projet +ListInvoicesAssociatedProject=Liste des factures clients associées au projet +ListPredefinedInvoicesAssociatedProject=Liste des modèles de facture client associées au projet +ListSupplierOrdersAssociatedProject=Liste des commandes fournisseurs associées au projet +ListSupplierInvoicesAssociatedProject=Liste des factures fournisseurs associées au projet +ListContractAssociatedProject=Liste des contrats associés au projet +ListFichinterAssociatedProject=Liste des interventions associées au projet +ListShippingAssociatedProject=Liste des expéditions associées au projet +ListExpenseReportsAssociatedProject=Liste des notes de frais associées avec ce projet +ListDonationsAssociatedProject=Liste des dons associés au projet +ListActionsAssociatedProject=Liste des événements associés au projet +ListTaskTimeUserProject=Liste du temps consommé sur les tâches d'un projet +ActivityOnProjectToday=Activité projet aujourd'hui +ActivityOnProjectYesterday=Activité projet hier +ActivityOnProjectThisWeek=Activité sur les projets cette semaine +ActivityOnProjectThisMonth=Activité sur les projets ce mois +ActivityOnProjectThisYear=Activité sur les projets cette année +ChildOfTask=Fille du projet/tâche +NotOwnerOfProject=Non responsable de ce projet privé +AffectedTo=Affecté à +CantRemoveProject=Ce projet ne peut être supprimé car il est référencé par de nombreux objets (factures, commandes ou autre). voir la liste sur l'onglet Reférents. +ValidateProject=Valider projet +ConfirmValidateProject=Êtes-vous sûr de vouloir valider ce projet ? +CloseAProject=Clore projet +ConfirmCloseAProject=Êtes-vous sûr de vouloir clore ce projet ? +AlsoCloseAProject=Fermer également le projet (laissez-le ouvert si vous devez suivre la production de tâches dessus) +ReOpenAProject=Réouvrir projet +ConfirmReOpenAProject=Êtes-vous sûr de vouloir rouvrir ce projet ? +ProjectContact=Contacts projet +ActionsOnProject=Événements sur le projet +YouAreNotContactOfProject=Vous n'êtes pas contact de ce projet privé +DeleteATimeSpent=Suppression du temps consommé +ConfirmDeleteATimeSpent=Êtes-vous sûr de vouloir supprimer ce temps consommé ? +DoNotShowMyTasksOnly=Voir aussi les tâches qui ne me sont pas affectées +ShowMyTasksOnly=Ne voir que les tâches qui me sont affectées +TaskRessourceLinks=Ressources +ProjectsDedicatedToThisThirdParty=Projets dédiés à ce tiers +NoTasks=Aucune tâche pour ce projet +LinkedToAnotherCompany=Liés à autre société +TaskIsNotAffectedToYou=Tâche qui ne vous sont pas affectées +ErrorTimeSpentIsEmpty=Le temps consommé n'est pas renseigné +ThisWillAlsoRemoveTasks=Cette opération détruira également les tâches du projet (%s tâches actuellement) et le suivi des consommés. +IfNeedToUseOhterObjectKeepEmpty=Si des objets (facture, commande, ...), appartenant à un autre tiers que celui choisi, doivent être liés au projet à créer, laisser vide afin de laisser le projet multi-tiers. +CloneProject=Cloner le projet +CloneTasks=Cloner les tâches +CloneContacts=Cloner les contacts +CloneNotes=Cloner les notes +CloneProjectFiles=Cloner les pièces jointes du projet +CloneTaskFiles=Cloner les pièces jointes des tâche(s) (si tâche(s) cloner) +CloneMoveDate=Mettre à jour les dates projet/tâches à partir de maintenant +ConfirmCloneProject=Êtes-vous sûr de vouloir cloner ce projet ? +ProjectReportDate=Reporter les dates des tâches en fonction de la date de départ. +ErrorShiftTaskDate=Une erreur s'est produite dans le report des dates des tâches. +ProjectsAndTasksLines=Projets et tâches +ProjectCreatedInDolibarr=Projet %s créé +ProjectModifiedInDolibarr=Projet %s modifié +TaskCreatedInDolibarr=Tâche %s créée +TaskModifiedInDolibarr=Tâche %s modifiée +TaskDeletedInDolibarr=Tâche %s supprimée +OpportunityStatus=Statut opportunité +OpportunityStatusShort=Status opp. +OpportunityProbability=Probabilité d'opportunité +OpportunityProbabilityShort=Prob. opp. +OpportunityAmount=Montant opportunité +OpportunityAmountShort=Montant Opp. +OpportunityAmountAverageShort=montant moyen des opportunités +OpportunityAmountWeigthedShort=Montant pondéré des opportunités +WonLostExcluded=hors opportunités remportées/perdues +##### Types de contacts ##### +TypeContact_project_internal_PROJECTLEADER=Chef de projet +TypeContact_project_external_PROJECTLEADER=Chef de projet +TypeContact_project_internal_PROJECTCONTRIBUTOR=Contributeur +TypeContact_project_external_PROJECTCONTRIBUTOR=Contributeur +TypeContact_project_task_internal_TASKEXECUTIVE=Responsable +TypeContact_project_task_external_TASKEXECUTIVE=Responsable +TypeContact_project_task_internal_TASKCONTRIBUTOR=Contributeur +TypeContact_project_task_external_TASKCONTRIBUTOR=Contributeur +SelectElement=Séléctionnez l'élément +AddElement=Associer l'élément +# Documents models +DocumentModelBeluga=Modèle de document de rapport pour l'aperçu projet +DocumentModelBaleine=Modèles de document de rapport de tâches de projets +PlannedWorkload=Charge de travail prévue +PlannedWorkloadShort=Charge de travail +ProjectReferers=Objets associés +ProjectMustBeValidatedFirst=Le projet doit être validé d'abord +FirstAddRessourceToAllocateTime=Affecter un utilisateur pour saisir des temps +InputPerDay=Saisie par jour +InputPerWeek=Saisie par semaine +InputPerAction=Saisie par action +TimeAlreadyRecorded=Temps consommé déjà enregistré pour cette tâche/jour et utilisateur %s +ProjectsWithThisUserAsContact=Projets avec cet utilisateur comme contact +TasksWithThisUserAsContact=Tâches assignées à cet utilisateur +ResourceNotAssignedToProject=Non assigné à un projet +ResourceNotAssignedToTheTask=Non assigné à la tache +AssignTaskToMe=M'assigner la tâche +AssignTask=Assigner +ProjectOverview=Vue d'ensemble +ManageTasks=Utiliser les projets pour suivre les tâches +ManageOpportunitiesStatus=Utiliser les projets pour suivre les affaires / opportunités +ProjectNbProjectByMonth=Nb de projets créés par mois +ProjectOppAmountOfProjectsByMonth=Montant des opportunités par mois +ProjectWeightedOppAmountOfProjectsByMonth=Montant pondéré des opportunités par mois +ProjectOpenedProjectByOppStatus=Opportunités/affaires ouvertes par statut +ProjectsStatistics=Statistics sur les projets +TaskAssignedToEnterTime=Tâche assignée. La saisie de temps sur cette tâche devrait être possible. +IdTaskTime=Id ligne de temps +YouCanCompleteRef=SI vous souhaitez compléter la référence avec d'autres informations filtrables, il est recommandé d'ajouter le caractère - entre les données. La numérotation automatique sera alors fonctionnelle pour le prochain compteur. Par exemple %s-ABC. Il est également possible d'ajouter des mots-clés dans le libellé. Il est cependant recommandé d'utiliser un attribut supplémentaire ou extrafield. +OpenedProjectsByThirdparties=Projets ouverts par tiers +OnlyOpportunitiesShort=Opportunités uniquement +OpenedOpportunitiesShort=Opportunités ouvertes +NotAnOpportunityShort=Non une opportunité +OpportunityTotalAmount=Montant total des opportunités +OpportunityPonderatedAmount=Montant pondéré des opportunités +OpportunityPonderatedAmountDesc=Montant des opportunités pondéré par la probabilité +OppStatusPROSP=Prospection +OppStatusQUAL=Qualification +OppStatusPROPO=Proposition +OppStatusNEGO=Négociation +OppStatusPENDING=En attente +OppStatusWON=Gagné +OppStatusLOST=Perdu +Budget=Budget diff --git a/htdocs/langs/fr_NC/sendings.lang b/htdocs/langs/fr_NC/sendings.lang new file mode 100644 index 00000000000..5c3974dc11c --- /dev/null +++ b/htdocs/langs/fr_NC/sendings.lang @@ -0,0 +1,71 @@ +# Dolibarr language file - Source file is en_US - sendings +RefSending=Réf. expédition +Sending=Expédition +Sendings=Expéditions +AllSendings=Toutes les expéditions +Shipment=Expédition +Shipments=Expéditions +ShowSending=Afficher Expéditions +Receivings=Bons de réceptions +SendingsArea=Espace expéditions +ListOfSendings=Liste des expéditions +SendingMethod=Méthode d'expédition +LastSendings=Les %s dernières expéditions +StatisticsOfSendings=Statistiques des expéditions +NbOfSendings=Nombre d'expéditions +NumberOfShipmentsByMonth=Nombre d'expéditions par mois +SendingCard=Fiche expédition +NewSending=Nouvelle expédition +CreateShipment=Créer expédition +QtyShipped=Qté. expédiée +QtyPreparedOrShipped=Quantité préparée ou envoyée +QtyToShip=Qté. à expédier +QtyReceived=Qté. reçue +QtyInOtherShipments=Qté dans les autres expéditions +KeepToShip=Reste à expédier +OtherSendingsForSameOrder=Autres expéditions pour cette commande +SendingsAndReceivingForSameOrder=Expéditions et réceptions pour cette commande +SendingsToValidate=Expéditions à valider +StatusSendingCanceled=Annulée +StatusSendingDraft=Brouillon +StatusSendingValidated=Validée (produits à envoyer ou envoyés) +StatusSendingProcessed=Traitée +StatusSendingDraftShort=Brouillon +StatusSendingValidatedShort=Validée +StatusSendingProcessedShort=Traitée +SendingSheet=Fiche expédition +ConfirmDeleteSending=Êtes-vous sûr de vouloir supprimer cette expédition ? +ConfirmValidateSending=Êtes-vous sûr de vouloir valider cette expédition sous la référence %s? +ConfirmCancelSending=Êtes-vous sûr de vouloir annuler cette expédition ? +DocumentModelSimple=Modèle simple +DocumentModelMerou=Modèle Merou A5 +WarningNoQtyLeftToSend=Alerte, aucun produit en attente d'expédition. +StatsOnShipmentsOnlyValidated=Statistiques effectuées sur les expéditions validées uniquement. La date prise en compte est la date de validation (la date de prévision de livraison n'étant pas toujours renseignée). +DateDeliveryPlanned=Date prévue de livraison +RefDeliveryReceipt=Ref bon de réception +StatusReceipt=Status du bon de réception +DateReceived=Date de réception réelle +SendShippingByEMail=Envoyer bon d'expédition par email +SendShippingRef=Envoi du bordereau d'expédition %s +ActionsOnShipping=Événements sur l'expédition +LinkToTrackYourPackage=Lien pour le suivi de votre colis +ShipmentCreationIsDoneFromOrder=Pour le moment, la création d'une nouvelle expédition se fait depuis la fiche commande. +ShipmentLine=Ligne d'expédition +ProductQtyInCustomersOrdersRunning=Quantité de produit en commandes client ouvertes +ProductQtyInSuppliersOrdersRunning=Quantité de produit en commandes fournisseur ouvertes +ProductQtyInShipmentAlreadySent=Quantité du produit parmi les commandes clients déjà envoyées +ProductQtyInSuppliersShipmentAlreadyRecevied=Quantité de produit déjà reçu en commandes fournisseur ouvertes +NoProductToShipFoundIntoStock=Aucun produit à expédier n'a été trouver dans l'entrepôt %s. Corrigez l'inventaire ou retourner choisir un autre entrepôt. +WeightVolShort=Poids/vol. +ValidateOrderFirstBeforeShipment=Vous devez d'abord valider la commande pour pouvoir créer une expédition. + +# Sending methods +# ModelDocument +DocumentModelTyphon=Modèle de bon de réception/livraison complet (logo…) +Error_EXPEDITION_ADDON_NUMBER_NotDefined=Constante EXPEDITION_ADDON_NUMBER non définie +SumOfProductVolumes=Somme des volumes des produits +SumOfProductWeights=Somme des poids des produits + +# warehouse details +DetailWarehouseNumber= Détail de l'entrepôt +DetailWarehouseFormat= W:%s (Qté : %d) diff --git a/htdocs/projet/element.php b/htdocs/projet/element.php index f745c71d761..93e15f2fe77 100644 --- a/htdocs/projet/element.php +++ b/htdocs/projet/element.php @@ -43,6 +43,7 @@ if (! empty($conf->fournisseur->enabled)) require_once DOL_DOCUMENT_ROOT.'/fourn if (! empty($conf->fournisseur->enabled)) require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php'; if (! empty($conf->contrat->enabled)) require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php'; if (! empty($conf->ficheinter->enabled)) require_once DOL_DOCUMENT_ROOT.'/fichinter/class/fichinter.class.php'; +if (! empty($conf->expedition->enabled)) require_once DOL_DOCUMENT_ROOT.'/expedition/class/expedition.class.php'; if (! empty($conf->deplacement->enabled)) require_once DOL_DOCUMENT_ROOT.'/compta/deplacement/class/deplacement.class.php'; if (! empty($conf->expensereport->enabled)) require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php'; if (! empty($conf->agenda->enabled)) require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php'; @@ -341,6 +342,17 @@ $listofreferent=array( 'buttonnew'=>'AddIntervention', 'testnew'=>$user->rights->ficheinter->creer, 'test'=>$conf->ficheinter->enabled && $user->rights->ficheinter->lire), +'shipping'=>array( + 'name'=>"Shippings", + 'title'=>"ListShippingAssociatedProject", + 'class'=>'Expedition', + 'table'=>'expedition', + 'datefieldname'=>'date_valid', + 'urlnew'=>DOL_URL_ROOT.'/expedition/card.php?action=create&origin=project&originid='.$id.'&socid='.$socid, + 'lang'=>'sendings', + 'buttonnew'=>'CreateShipment', + 'testnew'=>0, + 'test'=>$conf->expedition->enabled && $user->rights->expedition->lire), 'trip'=>array( 'name'=>"TripsAndExpenses", 'title'=>"ListExpenseReportsAssociatedProject", From a2764bc4c2e6dc5de914dd1fb78082dde3b8d380 Mon Sep 17 00:00:00 2001 From: absys Date: Fri, 19 May 2017 18:14:42 +1100 Subject: [PATCH 183/299] Fix indent. --- htdocs/expedition/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/expedition/card.php b/htdocs/expedition/card.php index 8924577009f..2bf63907d68 100644 --- a/htdocs/expedition/card.php +++ b/htdocs/expedition/card.php @@ -191,7 +191,7 @@ if (empty($reshook)) $object->note = GETPOST('note','alpha'); $object->origin = $origin; $object->origin_id = $origin_id; - $object->fk_project = GETPOST('projectid'); + $object->fk_project = GETPOST('projectid'); $object->weight = GETPOST('weight','int')==''?"NULL":GETPOST('weight','int'); $object->sizeH = GETPOST('sizeH','int')==''?"NULL":GETPOST('sizeH','int'); $object->sizeW = GETPOST('sizeW','int')==''?"NULL":GETPOST('sizeW','int'); From 2382a0a4ee32b12bf4721a144d34ceddd2761e57 Mon Sep 17 00:00:00 2001 From: KHELIFA Date: Fri, 19 May 2017 10:46:29 +0200 Subject: [PATCH 184/299] Core dictionaries: Adds the ability to change the color and position of the dictionary 'Types of agenda events' --- htdocs/admin/dict.php | 42 ++++++++++++++++++++++++++--------- htdocs/langs/en_US/admin.lang | 1 + htdocs/langs/fr_FR/admin.lang | 1 + 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index 46a8001b02a..2b422074f1b 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -431,7 +431,7 @@ $tabhelp[2] = array('code'=>$langs->trans("EnterAnyCode")); $tabhelp[3] = array('code'=>$langs->trans("EnterAnyCode")); $tabhelp[4] = array('code'=>$langs->trans("EnterAnyCode")); $tabhelp[5] = array('code'=>$langs->trans("EnterAnyCode")); -$tabhelp[6] = array('code'=>$langs->trans("EnterAnyCode"), 'position'=>$langs->trans("PositionIntoComboList")); +$tabhelp[6] = array('code'=>$langs->trans("EnterAnyCode"), 'color'=>$langs->trans("ColorFormat"), 'position'=>$langs->trans("PositionIntoComboList")); $tabhelp[7] = array('code'=>$langs->trans("EnterAnyCode")); $tabhelp[8] = array('code'=>$langs->trans("EnterAnyCode"), 'position'=>$langs->trans("PositionIntoComboList")); $tabhelp[9] = array('code'=>$langs->trans("EnterAnyCode"), 'unicode'=>$langs->trans("UnicodeCurrency")); @@ -581,6 +581,12 @@ if (GETPOST('actionadd') || GETPOST('actionmodify')) $listfieldmodify=explode(',',$tabfieldinsert[$id]); $listfieldvalue=explode(',',$tabfieldvalue[$id]); + if (GETPOST('actionmodify') && $tabname[$id] == MAIN_DB_PREFIX . "c_actioncomm" && isset($_POST["type"]) && in_array($_POST["type"],array('system','systemauto'))) { + $listfield=explode(',','color,position'); + $listfieldmodify=explode(',','color,position'); + $listfieldvalue=explode(',','color,position'); + } + // Check that all fields are filled $ok=1; foreach ($listfield as $f => $value) @@ -619,7 +625,7 @@ if (GETPOST('actionadd') || GETPOST('actionmodify')) } } // Other checks - if ($tabname[$id] == MAIN_DB_PREFIX."c_actioncomm" && isset($_POST["type"]) && in_array($_POST["type"],array('system','systemauto'))) { + if (GETPOST('actionadd') && $tabname[$id] == MAIN_DB_PREFIX."c_actioncomm" && isset($_POST["type"]) && in_array($_POST["type"],array('system','systemauto'))) { $ok=0; setEventMessages($langs->transnoentities('ErrorReservedTypeSystemSystemAuto'), null, 'errors'); } @@ -1104,7 +1110,7 @@ if ($id) if (empty($reshook)) { - fieldList($fieldlist,$obj,$tabname[$id],'add'); + fieldList($fieldlist,$langs,$obj,$tabname[$id],'add'); } if ($id == 4) print ''; @@ -1304,7 +1310,13 @@ if ($id) $error=$hookmanager->error; $errors=$hookmanager->errors; // Show fields - if (empty($reshook)) fieldList($fieldlist,$obj,$tabname[$id],'edit'); + if (empty($reshook)) { + $fieldl = $fieldlist; + if ($tabname[$id] == MAIN_DB_PREFIX . "c_actioncomm" && in_array($obj->type, array('system', 'systemauto'))) { + $fieldl=array(array('code'),array('libelle'),array('type'),'color','position'); + } + fieldList($fieldl, $langs, $obj, $tabname[$id], 'edit'); + } print ''; } + elseif (is_array($fieldlist[$field])) + { + $hidden = (! empty($obj->{$fieldlist[$field][0]})?$obj->{$fieldlist[$field][0]}:''); + print ''; + } else { $classtd=''; $class=''; diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 1c9ac65e4b8..070b58d40c2 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1632,6 +1632,7 @@ MinimumNoticePeriod=Minimum notice period (Your leave request must be done befor NbAddedAutomatically=Number of days added to counters of users (automatically) each month EnterAnyCode=This field contains a reference to identify line. Enter any value of your choice, but without special characters. UnicodeCurrency=Enter here between braces, list of byte number that represent the currency symbol. For exemple: for $, enter [36] - for brazil real R$ [82,36] - for €, enter [8364] +ColorFormat=The RGB color is in HEX format, eg: FF0000 PositionIntoComboList=Position of line into combo lists SellTaxRate=Sale tax rate RecuperableOnly=Yes for VAT "Non Perçue Récupérable" dedicated for some state in France. Keep value to "No" in all other cases. diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index bd3d6405843..4eac426571d 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -1600,6 +1600,7 @@ MinimumNoticePeriod=Période de préavis minimum (Votre demande de congé doit NbAddedAutomatically=Nombre de jours ajoutés aux compteurs des utilisateurs (automatiquement) chaque mois EnterAnyCode=Ce champ contient une référence pour identifier le champ. Entrez une valeur de votre choix, mais sans caractères spéciaux. UnicodeCurrency=Saisissez ici entre accolades, la liste du numéro des octets qui représentent le symbole de la monnaie. Pour exemple: pour $, entrez [36] - pour le Real Brésilien R$ [82,36] - pour l'euro €, entrez [8364] +ColorFormat=La couleur RVB est au format HEX, ex: FF0000 PositionIntoComboList=Position de la ligne dans des listes déroulantes SellTaxRate=Taux de TVA RecuperableOnly=Oui pour une TVA "Perçue Non Récupérable" dédiée à certains pays comme la France. Gardez la valeur à "Non" dans tous les autres cas. From aec4cef5de4f8e4cc3b63d4f112bed5f66f8f42e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 19 May 2017 12:58:38 +0200 Subject: [PATCH 185/299] Clean some code for type of event deprecated since 3.3 --- htdocs/admin/mails.php | 4 +- htdocs/comm/propal/card.php | 2 +- htdocs/commande/card.php | 1 - htdocs/compta/facture/card.php | 1 - htdocs/contrat/card.php | 1 - htdocs/core/actions_massactions.inc.php | 8 +- htdocs/core/actions_sendmails.inc.php | 43 +- htdocs/core/class/html.formmail.class.php | 2 +- htdocs/core/lib/usergroups.lib.php | 2 +- ...terface_50_modAgenda_ActionsAuto.class.php | 58 +- htdocs/expedition/card.php | 1 - htdocs/fichinter/card.php | 2 - htdocs/fourn/commande/card.php | 1 - htdocs/fourn/facture/card.php | 1 - .../install/mysql/data/llx_c_actioncomm.sql | 12 +- .../install/mysql/migration/5.0.0-6.0.0.sql | 3 +- htdocs/langs/en_US/main.lang | 1 + htdocs/societe/card.php | 1 - htdocs/supplier_proposal/card.php | 1 - htdocs/theme/eldy/style.css.php | 1 + htdocs/theme/md/style.css.php | 3 +- htdocs/user/card.php | 1174 +++++++++-------- 22 files changed, 638 insertions(+), 685 deletions(-) diff --git a/htdocs/admin/mails.php b/htdocs/admin/mails.php index 219cd85c2fe..03cce1dff09 100644 --- a/htdocs/admin/mails.php +++ b/htdocs/admin/mails.php @@ -86,8 +86,8 @@ if ($action == 'update' && empty($_POST["cancel"])) // Actions to send emails $id=0; -$actiontypecode=''; -$trigger_name=''; +$actiontypecode=''; // Not an event for agenda +$trigger_name=''; // Disable triggers $paramname='id'; $mode='emailfortest'; $trackid=(($action == 'testhtml')?"testhtml":"test"); diff --git a/htdocs/comm/propal/card.php b/htdocs/comm/propal/card.php index 0ee995e4784..df86464281a 100644 --- a/htdocs/comm/propal/card.php +++ b/htdocs/comm/propal/card.php @@ -644,7 +644,7 @@ if (empty($reshook)) */ // Actions to send emails - $actiontypecode='AC_PROP'; + $actiontypecode='AC_OTH_AUTO'; $trigger_name='PROPAL_SENTBYMAIL'; $paramname='id'; $mode='emailfromproposal'; diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index 07f25b40ed8..fe91f0b6ff8 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -1259,7 +1259,6 @@ if (empty($reshook)) // Actions to send emails - $actiontypecode='AC_COM'; $trigger_name='ORDER_SENTBYMAIL'; $paramname='id'; $mode='emailfromorder'; diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index 02b67c814ef..4835b53b277 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -1911,7 +1911,6 @@ if (empty($reshook)) // Actions to send emails if (empty($id)) $id=$facid; - $actiontypecode='AC_FAC'; $trigger_name='BILL_SENTBYMAIL'; $paramname='id'; $mode='emailfrominvoice'; diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index 0e0f8c84090..f00816e9d4b 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -953,7 +953,6 @@ if (empty($reshook)) */ // Actions to send emails - $actiontypecode='AC_CONT'; $trigger_name='CONTRACT_SENTBYMAIL'; $paramname='id'; $mode='emailfromcontract'; diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index 58e47a29ec8..92d1011b923 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -274,12 +274,12 @@ if (! $error && $massaction == 'confirm_presend') // Insert logs into agenda foreach($listofqualifiedinvoice as $invid => $object) { - if ($objectclass == 'Propale') $actiontypecode='AC_PROP'; + /*if ($objectclass == 'Propale') $actiontypecode='AC_PROP'; if ($objectclass == 'Commande') $actiontypecode='AC_COM'; if ($objectclass == 'Facture') $actiontypecode='AC_FAC'; if ($objectclass == 'Supplier_Proposal') $actiontypecode='AC_SUP_PRO'; if ($objectclass == 'CommandeFournisseur') $actiontypecode='AC_SUP_ORD'; - if ($objectclass == 'FactureFournisseur') $actiontypecode='AC_SUP_INV'; + if ($objectclass == 'FactureFournisseur') $actiontypecode='AC_SUP_INV';*/ $actionmsg=$langs->transnoentities('MailSentBy').' '.$from.' '.$langs->transnoentities('To').' '.$sendto; if ($message) @@ -289,10 +289,10 @@ if (! $error && $massaction == 'confirm_presend') $actionmsg = dol_concatdesc($actionmsg, $langs->transnoentities('TextUsedInTheMessageBody') . ":"); $actionmsg = dol_concatdesc($actionmsg, $message); } - + $actionmsg2=''; + // Initialisation donnees $object->sendtoid = 0; - $object->actiontypecode = $actiontypecode; $object->actionmsg = $actionmsg; // Long text $object->actionmsg2 = $actionmsg2; // Short text $object->fk_element = $invid; diff --git a/htdocs/core/actions_sendmails.inc.php b/htdocs/core/actions_sendmails.inc.php index cf50d05d6bf..dded23e6cbf 100644 --- a/htdocs/core/actions_sendmails.inc.php +++ b/htdocs/core/actions_sendmails.inc.php @@ -23,11 +23,11 @@ // $mysoc must be defined // $id must be defined -// $actiontypecode must be defined // $paramname must be defined // $mode must be defined -// $object and $uobject may be defined. - +// $trigger_name must be set (can be '') +// $actiontypecode can be set +// $object and $uobject may be defined /* * Add file in email form @@ -155,7 +155,7 @@ if (($action == 'send' || $action == 'relance') && ! $_POST['addfile'] && ! $_PO } } } - else dol_print_error('','Use actions_sendmails.in.php for a type that is not supported'); + else dol_print_error('','Use actions_sendmails.in.php for an element/object that is not supported'); } else $thirdparty = $mysoc; @@ -347,7 +347,7 @@ if (($action == 'send' || $action == 'relance') && ! $_POST['addfile'] && ! $_PO { $error=0; - // FIXME This must be moved into a trigger for action $trigger_name + // FIXME This must be moved into the trigger for action $trigger_name if (! empty($conf->dolimail->enabled)) { $mid = (GETPOST('mid','int') ? GETPOST('mid','int') : 0); // Original mail id is set ? @@ -370,21 +370,26 @@ if (($action == 'send' || $action == 'relance') && ! $_POST['addfile'] && ! $_PO // Initialisation of datas if (is_object($object)) { - $object->socid = $sendtosocid; // To link to a company - $object->sendtoid = $sendtoid; // To link to contacts/addresses. This is an array. - $object->actiontypecode = $actiontypecode; - $object->actionmsg = $actionmsg; // Long text - $object->actionmsg2 = $actionmsg2; // Short text + if (empty($actiontypecode)) $actiontypecode='AC_OTH_AUTO'; // Event insert into agenda automatically + + $object->socid = $sendtosocid; // To link to a company + $object->sendtoid = $sendtoid; // To link to contacts/addresses. This is an array. + $object->actiontypecode = $actiontypecode; // Type of event ('AC_OTH', 'AC_OTH_AUTO', 'AC_XXX'...) + $object->actionmsg = $actionmsg; // Long text + $object->actionmsg2 = $actionmsg2; // Short text $object->trackid = $trackid; $object->fk_element = $object->id; $object->elementtype = $object->element; // Call of triggers - include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; - $interface=new Interfaces($db); - $result=$interface->run_triggers($trigger_name,$object,$user,$langs,$conf); - if ($result < 0) { - $error++; $errors=$interface->errors; + if (! empty($trigger_name)) + { + include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; + $interface=new Interfaces($db); + $result=$interface->run_triggers($trigger_name,$object,$user,$langs,$conf); + if ($result < 0) { + $error++; $errors=$interface->errors; + } } } @@ -398,8 +403,12 @@ if (($action == 'send' || $action == 'relance') && ! $_POST['addfile'] && ! $_PO // This avoid sending mail twice if going out and then back to page $mesg=$langs->trans('MailSuccessfulySent',$mailfile->getValidAddress($from,2),$mailfile->getValidAddress($sendto,2)); setEventMessages($mesg, null, 'mesgs'); - if ($conf->dolimail->enabled) header('Location: '.$_SERVER["PHP_SELF"].'?'.($paramname?$paramname:'id').'='.$object->id.'&'.($paramname2?$paramname2:'mid').'='.$parm2val); - else header('Location: '.$_SERVER["PHP_SELF"].'?'.($paramname?$paramname:'id').'='.$object->id); + if ($conf->dolimail->enabled) + { + header('Location: '.$_SERVER["PHP_SELF"].'?'.($paramname?$paramname:'id').'='.(is_object($object)?$object->id:'').'&'.($paramname2?$paramname2:'mid').'='.$parm2val); + exit; + } + header('Location: '.$_SERVER["PHP_SELF"].'?'.($paramname?$paramname:'id').'='.(is_object($object)?$object->id:'')); exit; } } diff --git a/htdocs/core/class/html.formmail.class.php b/htdocs/core/class/html.formmail.class.php index 020382095a3..3641ac87cef 100644 --- a/htdocs/core/class/html.formmail.class.php +++ b/htdocs/core/class/html.formmail.class.php @@ -297,7 +297,7 @@ class FormMail extends Form $arraydefaultmessage=$this->getEMailTemplate($this->db, $this->param["models"], $user, $outputlangs, $model_id); //var_dump($arraydefaultmessage); - $out.= "\n\n"; + $out.= "\n".'
'."\n"; if ($this->withform == 1) { $out.= '
'."\n"; diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php index 2cea718dcc0..f48974acb02 100644 --- a/htdocs/core/lib/usergroups.lib.php +++ b/htdocs/core/lib/usergroups.lib.php @@ -145,7 +145,7 @@ function user_prepare_head($object) { // Bank $head[$h][0] = DOL_URL_ROOT.'/user/bank.php?id='.$object->id; - $head[$h][1] = $langs->trans("BankAccounts"); + $head[$h][1] = $langs->trans("HR"); $head[$h][2] = 'bank'; $h++; } diff --git a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php index 9da1ada59ad..1160fb2625d 100644 --- a/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php +++ b/htdocs/core/triggers/interface_50_modAgenda_ActionsAuto.class.php @@ -76,6 +76,8 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("agenda"); + if (empty($object->actiontypecode)) $object->actiontypecode='AC_OTH_AUTO'; + // Actions if ($action == 'COMPANY_CREATE') { @@ -83,7 +85,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("companies"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("NewCompanyToDolibarr",$object->name); $object->actionmsg=$langs->transnoentities("NewCompanyToDolibarr",$object->name); if (! empty($object->prefix)) $object->actionmsg.=" (".$object->prefix.")"; @@ -97,7 +98,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("orders"); - if (empty($object->actiontypecode)) $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) dol_syslog('Trigger called with property actionmsg2 on object not defined', LOG_ERR); // Parameters $object->sendtoid defined by caller @@ -109,7 +109,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("contracts"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("ContractValidatedInDolibarr",($object->newref?$object->newref:$object->ref)); $object->actionmsg=$langs->transnoentities("ContractValidatedInDolibarr",($object->newref?$object->newref:$object->ref)); @@ -121,7 +120,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("propal"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("PropalValidatedInDolibarr",($object->newref?$object->newref:$object->ref)); $object->actionmsg=$langs->transnoentities("PropalValidatedInDolibarr",($object->newref?$object->newref:$object->ref)); @@ -133,7 +131,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("propal"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("ProposalSentByEMail",$object->ref); if (empty($object->actionmsg)) { @@ -149,7 +146,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("propal"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("PropalClosedSignedInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("PropalClosedSignedInDolibarr",$object->ref); @@ -161,7 +157,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("propal"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("PropalClassifiedBilledInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("PropalClassifiedBilledInDolibarr",$object->ref); @@ -173,7 +168,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("propal"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("PropalClosedRefusedInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("PropalClosedRefusedInDolibarr",$object->ref); @@ -184,7 +178,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("agenda"); $langs->load("orders"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("OrderValidatedInDolibarr",($object->newref?$object->newref:$object->ref)); $object->actionmsg=$langs->transnoentities("OrderValidatedInDolibarr",($object->newref?$object->newref:$object->ref)); @@ -196,7 +189,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("orders"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("OrderDeliveredInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("OrderDeliveredInDolibarr",$object->ref); @@ -208,7 +200,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("orders"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("OrderBilledInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("OrderBilledInDolibarr",$object->ref); @@ -220,7 +211,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("orders"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("OrderCanceledInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("OrderCanceledInDolibarr",$object->ref); @@ -232,7 +222,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("orders"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("OrderSentByEMail",$object->ref); if (empty($object->actionmsg)) { @@ -248,7 +237,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("bills"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InvoiceValidatedInDolibarr",($object->newref?$object->newref:$object->ref)); $object->actionmsg=$langs->transnoentities("InvoiceValidatedInDolibarr",($object->newref?$object->newref:$object->ref)); @@ -260,7 +248,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("bills"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InvoiceBackToDraftInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("InvoiceBackToDraftInDolibarr",$object->ref); @@ -272,7 +259,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("bills"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InvoiceSentByEMail",$object->ref); if (empty($object->actionmsg)) { @@ -289,7 +275,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("bills"); // Values for this action can't be defined by caller. - $object->actiontypecode='AC_OTH_AUTO'; $object->actionmsg2=$langs->transnoentities("InvoicePaidInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("InvoicePaidInDolibarr",$object->ref); @@ -301,7 +286,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("bills"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InvoiceCanceledInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("InvoiceCanceledInDolibarr",$object->ref); @@ -313,7 +297,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("interventions"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InterventionCreatedInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("InterventionCreatedInDolibarr",$object->ref); @@ -327,7 +310,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("interventions"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InterventionValidatedInDolibarr",($object->newref?$object->newref:$object->ref)); $object->actionmsg=$langs->transnoentities("InterventionValidatedInDolibarr",($object->newref?$object->newref:$object->ref)); @@ -341,7 +323,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("interventions"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InterventionModifiedInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("InterventionModifiedInDolibarr",$object->ref); @@ -355,7 +336,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("interventions"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InterventionSentByEMail",$object->ref); $object->actionmsg=$langs->transnoentities("InterventionSentByEMail",$object->ref); @@ -368,7 +348,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("interventions"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InterventionClassifiedBilledInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("InterventionClassifiedBilledInDolibarr",$object->ref); @@ -380,7 +359,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("interventions"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InterventionClassifiedUnbilledInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("InterventionClassifiedUnbilledInDolibarr",$object->ref); @@ -392,7 +370,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("interventions"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InterventionDeletedInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("InterventionDeletedInDolibarr",$object->ref); @@ -406,7 +383,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("sendings"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("ShippingValidated",($object->newref?$object->newref:$object->ref)); if (empty($object->actionmsg)) { @@ -422,7 +398,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("sendings"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("ShippingSentByEMail",$object->ref); if (empty($object->actionmsg)) { @@ -438,7 +413,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("orders"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("OrderCreatedInDolibarr",($object->newref?$object->newref:$object->ref)); $object->actionmsg=$langs->transnoentities("OrderCreatedInDolibarr",($object->newref?$object->newref:$object->ref)); @@ -450,7 +424,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("orders"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("OrderValidatedInDolibarr",($object->newref?$object->newref:$object->ref)); $object->actionmsg=$langs->transnoentities("OrderValidatedInDolibarr",($object->newref?$object->newref:$object->ref)); @@ -462,7 +435,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("orders"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("OrderApprovedInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("OrderApprovedInDolibarr",$object->ref); @@ -474,7 +446,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("orders"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("OrderRefusedInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("OrderRefusedInDolibarr",$object->ref); @@ -486,7 +457,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("orders"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("SupplierOrderSubmitedInDolibarr",($object->newref?$object->newref:$object->ref)); $object->actionmsg=$langs->transnoentities("SupplierOrderSubmitedInDolibarr",($object->newref?$object->newref:$object->ref)); @@ -498,7 +468,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("orders"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("SupplierOrderReceivedInDolibarr",($object->newref?$object->newref:$object->ref)); $object->actionmsg=$langs->transnoentities("SupplierOrderReceivedInDolibarr",($object->newref?$object->newref:$object->ref)); @@ -511,7 +480,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("bills"); $langs->load("orders"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("SupplierOrderSentByEMail",$object->ref); if (empty($object->actionmsg)) { @@ -528,7 +496,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("bills"); $langs->load("orders"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("SupplierOrderClassifiedBilled",$object->ref); if (empty($object->actionmsg)) { @@ -543,7 +510,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("bills"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InvoiceValidatedInDolibarr",($object->newref?$object->newref:$object->ref)); $object->actionmsg=$langs->transnoentities("InvoiceValidatedInDolibarr",($object->newref?$object->newref:$object->ref)); @@ -555,7 +521,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("bills"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InvoiceBackToDraftInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("InvoiceBackToDraftInDolibarr",$object->ref); @@ -568,7 +533,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("bills"); $langs->load("orders"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("SupplierInvoiceSentByEMail",$object->ref); if (empty($object->actionmsg)) { @@ -584,7 +548,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("bills"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InvoicePaidInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("InvoicePaidInDolibarr",$object->ref); @@ -596,7 +559,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("bills"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("InvoiceCanceledInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("InvoiceCanceledInDolibarr",$object->ref); @@ -610,7 +572,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("members"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("MemberValidatedInDolibarr",($object->newref?$object->newref:$object->ref)); $object->actionmsg=$langs->transnoentities("MemberValidatedInDolibarr",($object->newref?$object->newref:$object->ref)); $object->actionmsg.="\n".$langs->transnoentities("Member").': '.$object->getFullName($langs); @@ -624,7 +585,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("members"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("MemberModifiedInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("MemberModifiedInDolibarr",$object->ref); $object->actionmsg.="\n".$langs->transnoentities("Member").': '.$object->getFullName($langs); @@ -638,7 +598,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("members"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("MemberSubscriptionAddedInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("MemberSubscriptionAddedInDolibarr",$object->ref); $object->actionmsg.="\n".$langs->transnoentities("Member").': '.$object->getFullName($langs); @@ -654,7 +613,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("members"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("MemberResiliatedInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("MemberResiliatedInDolibarr",$object->ref); $object->actionmsg.="\n".$langs->transnoentities("Member").': '.$object->getFullName($langs); @@ -668,7 +626,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("members"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("MemberDeletedInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("MemberDeletedInDolibarr",$object->ref); $object->actionmsg.="\n".$langs->transnoentities("Member").': '.$object->getFullName($langs); @@ -684,7 +641,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("projects"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("ProjectCreatedInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("ProjectCreatedInDolibarr",$object->ref); $object->actionmsg.="\n".$langs->transnoentities("Project").': '.$object->ref; @@ -696,8 +652,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("projects"); - $object->actiontypecode='AC_OTH_AUTO'; - if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("ProjectValidatedInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("ProjectValidatedInDolibarr",$object->ref); $object->actionmsg.="\n".$langs->transnoentities("Project").': '.$object->ref; @@ -709,7 +663,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("projects"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("ProjectModifiedInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("ProjectModifieddInDolibarr",$object->ref); $object->actionmsg.="\n".$langs->transnoentities("Task").': '.$object->ref; @@ -723,8 +676,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("projects"); - $object->actiontypecode='AC_OTH_AUTO'; - if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("TaskCreatedInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("TaskCreatedInDolibarr",$object->ref); $object->actionmsg.="\n".$langs->transnoentities("Task").': '.$object->ref; @@ -737,7 +688,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("projects"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("TaskModifiedInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("TaskModifieddInDolibarr",$object->ref); $object->actionmsg.="\n".$langs->transnoentities("Task").': '.$object->ref; @@ -750,7 +700,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("other"); $langs->load("projects"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities("TaskDeletedInDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities("TaskDeletedInDolibarr",$object->ref); $object->actionmsg.="\n".$langs->transnoentities("Task").': '.$object->ref; @@ -763,7 +712,6 @@ class InterfaceActionsAuto extends DolibarrTriggers $langs->load("agenda"); $langs->load("other"); - $object->actiontypecode='AC_OTH_AUTO'; if (empty($object->actionmsg2)) $object->actionmsg2=$langs->transnoentities($action."InDolibarr",$object->ref); $object->actionmsg=$langs->transnoentities($action."InDolibarr",$object->ref); @@ -805,7 +753,7 @@ class InterfaceActionsAuto extends DolibarrTriggers // Insertion action require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php'; $actioncomm = new ActionComm($this->db); - $actioncomm->type_code = $object->actiontypecode; // code of parent table llx_c_actioncomm (will be deprecated) + $actioncomm->type_code = $object->actiontypecode; // Type of event ('AC_OTH', 'AC_OTH_AUTO', 'AC_XXX'...) $actioncomm->code = 'AC_'.$action; $actioncomm->label = $object->actionmsg2; $actioncomm->note = $object->actionmsg; // TODO Replace with $actioncomm->email_msgid ? $object->email_content : $object->actionmsg diff --git a/htdocs/expedition/card.php b/htdocs/expedition/card.php index a0280ce9e39..fdd477cc63d 100644 --- a/htdocs/expedition/card.php +++ b/htdocs/expedition/card.php @@ -595,7 +595,6 @@ if (empty($reshook)) // Actions to send emails if (empty($id)) $id=$facid; - $actiontypecode='AC_SHIP'; $trigger_name='SHIPPING_SENTBYMAIL'; $paramname='id'; $mode='emailfromshipment'; diff --git a/htdocs/fichinter/card.php b/htdocs/fichinter/card.php index 91e094c1a50..51cd5a62d3f 100644 --- a/htdocs/fichinter/card.php +++ b/htdocs/fichinter/card.php @@ -719,8 +719,6 @@ if (empty($reshook)) */ // Actions to send emails - $actiontypecode='AC_OTH_AUTO'; - $trigger_name='FICHINTER_SENTBYMAIL'; $paramname='id'; $mode='emailfromintervention'; $trackid='int'.$object->id; diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index 378fab9f50c..a6f0cc248f1 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -1154,7 +1154,6 @@ if (empty($reshook)) */ // Actions to send emails - $actiontypecode='AC_SUP_ORD'; $trigger_name='ORDER_SUPPLIER_SENTBYMAIL'; $paramname='id'; $mode='emailfromsupplierorder'; diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index bda155efe88..04e6ea98481 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -1188,7 +1188,6 @@ if (empty($reshook)) */ // Actions to send emails - $actiontypecode='AC_SUP_INV'; $trigger_name='BILL_SUPPLIER_SENTBYMAIL'; $paramname='id'; $mode='emailfromsupplierinvoice'; diff --git a/htdocs/install/mysql/data/llx_c_actioncomm.sql b/htdocs/install/mysql/data/llx_c_actioncomm.sql index 2b84ee6ff82..6b89ed74dd2 100644 --- a/htdocs/install/mysql/data/llx_c_actioncomm.sql +++ b/htdocs/install/mysql/data/llx_c_actioncomm.sql @@ -38,12 +38,12 @@ insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 5,'AC_RDV','system','Rendez-vous',NULL, 1, 1); insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values (11,'AC_INT','system','Intervention on site',NULL, 1, 4); -- Code kept for backward compatibility < 3.3 -insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 3,'AC_PROP','systemauto', 'Send commercial proposal by email','propal',0,10); -insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 8,'AC_COM','systemauto','Send customer order by email','order', 0,8); -insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 9,'AC_FAC','systemauto', 'Send customer invoice by email','invoice',0,6); -insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 10,'AC_SHIP','systemauto', 'Send shipping by email','shipping',0,11); -insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 30,'AC_SUP_ORD','systemauto','Send supplier order by email','order_supplier',0,9); -insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 31,'AC_SUP_INV','systemauto','Send supplier invoice by email','invoice_supplier',0,7); +--insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 3,'AC_PROP','systemauto', 'Send commercial proposal by email','propal',0,10); +--insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 8,'AC_COM','systemauto','Send customer order by email','order', 0,8); +--insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 9,'AC_FAC','systemauto', 'Send customer invoice by email','invoice',0,6); +--insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 10,'AC_SHIP','systemauto', 'Send shipping by email','shipping',0,11); +--insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 30,'AC_SUP_ORD','systemauto','Send supplier order by email','order_supplier',0,9); +--insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 31,'AC_SUP_INV','systemauto','Send supplier invoice by email','invoice_supplier',0,7); -- Code used from 3.3+ when type of event is not used insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 40,'AC_OTH_AUTO','systemauto','Other (automatically inserted events)',NULL, 1, 20); insert into llx_c_actioncomm (id, code, type, libelle, module, active, position) values ( 50,'AC_OTH','system','Other (manually inserted events)',NULL, 1, 5); diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index 6ba7707b249..725eca55daa 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -296,7 +296,6 @@ ALTER TABLE llx_events MODIFY COLUMN ip varchar(250); ALTER TABLE llx_facture ADD COLUMN fk_fac_rec_source integer; - - +DELETE from llx_c_actioncomm where code in ('AC_PROP','AC_COM','AC_FAC','AC_SHIP','AC_SUP_ORD','AC_SUP_INV') AND id NOT IN (SELECT DISTINCT fk_action FROM llx_actioncomm); diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 79927cc888c..a5f2ddf1e7e 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -771,6 +771,7 @@ ModuleBuilder=Module Builder SetMultiCurrencyCode=Set currency BulkActions=Bulk actions ClickToShowHelp=Click to show tooltip help +HR=HR # Week day Monday=Monday Tuesday=Tuesday diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index 5a53a2c6ed2..14e8e4b4679 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -750,7 +750,6 @@ if (empty($reshook)) // Actions to send emails $id=$socid; - $actiontypecode='AC_OTH_AUTO'; $trigger_name='COMPANY_SENTBYMAIL'; $paramname='socid'; $mode='emailfromthirdparty'; diff --git a/htdocs/supplier_proposal/card.php b/htdocs/supplier_proposal/card.php index d36b471a721..86c350ecc22 100644 --- a/htdocs/supplier_proposal/card.php +++ b/htdocs/supplier_proposal/card.php @@ -466,7 +466,6 @@ if (empty($reshook)) include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php'; // Actions to send emails - $actiontypecode='AC_ASKPRICE'; $trigger_name='SUPPLIER_PROPOSAL_SENTBYMAIL'; $paramname='id'; $mode='emailfromsupplierproposal'; diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 66f880da786..4ae7d400a09 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -1101,6 +1101,7 @@ div.nopadding { padding-top: 1px; padding-bottom: 1px; width: 44px; + text-align:center; } div.attacharea { padding-top: 18px; diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 04732ef0305..2beef147c02 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -1145,6 +1145,7 @@ img.hideonsmartphone.pictoactionview { padding-top: 1px; padding-bottom: 1px; width: 44px; + text-align:center; } div.attacharea { padding-top: 18px; @@ -3054,7 +3055,7 @@ div.info { -moz-border-radius: 4px; -webkit-border-radius: 4px; border-radius: 4px; - background: #EaE4Ea; + background: #868; text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); } diff --git a/htdocs/user/card.php b/htdocs/user/card.php index d98ef682e90..9249e8f295e 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -593,7 +593,6 @@ if (empty($reshook)) { } // Actions to send emails - $actiontypecode='AC_OTH_AUTO'; $trigger_name='USER_SENTBYMAIL'; $paramname='id'; // Name of param key to open the card $mode='emailfromuser'; @@ -1005,14 +1004,6 @@ if (($action == 'create') || ($action == 'adduserldap')) } print '
'; - // Signature - print ''; - print ''; - // Multicompany if (! empty($conf->multicompany->enabled)) { @@ -1028,6 +1019,15 @@ if (($action == 'create') || ($action == 'adduserldap')) } } + // Accountancy code + if ($conf->accounting->enabled) + { + print ''; + print ''; + } + // Hierarchy print ''; print ''; print "\n"; - if ($conf->salaries->enabled && ! empty($user->rights->salaries->read)) + if ((! empty($conf->salaries->enabled) && ! empty($user->rights->salaries->read)) + || (! empty($conf->hrm->enabled) && ! empty($user->rights->hrm->employee->read))) { $langs->load("salaries"); @@ -1081,15 +1082,6 @@ if (($action == 'create') || ($action == 'adduserldap')) print ''; print "\n"; - // Accountancy code - if ($conf->accounting->enabled) - { - print ''; - print ''; - } - // User color if (! empty($conf->agenda->enabled)) { @@ -1108,6 +1100,14 @@ if (($action == 'create') || ($action == 'adduserldap')) null, '90%' ); print ""; } + + // Other attributes + $parameters=array('objectsrc' => $objectsrc, 'colspan' => ' colspan="3"'); + $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$object,$action); // Note that $action and $object may have been modified by hook + if (empty($reshook) && ! empty($extrafields->attribute_label)) + { + print $object->showOptionals($extrafields,'edit'); + } // Note print '\n"; - // Other attributes - $parameters=array('objectsrc' => $objectsrc, 'colspan' => ' colspan="3"'); - $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$object,$action); // Note that $action and $object may have been modified by hook - if (empty($reshook) && ! empty($extrafields->attribute_label)) - { - print $object->showOptionals($extrafields,'edit'); - } - - print "
'; print '
'; @@ -1512,6 +1524,7 @@ if ($id) if (in_array($obj->code, array('AC_OTH','AC_OTH_AUTO')) || in_array($obj->type, array('systemauto'))) { $canbedisabled=0; $canbedisabled = 0; } $canbemodified=$iserasable; if ($obj->code == 'RECEP') $canbemodified=1; + if ($tabname[$id] == MAIN_DB_PREFIX."c_actioncomm") $canbemodified=1; // Url $rowidcol=$tabrowid[$id]; @@ -1643,15 +1656,16 @@ $db->close(); /** * Show fields in insert/edit mode * - * @param array $fieldlist Array of fields - * @param Object $obj If we show a particular record, obj is filled with record fields - * @param string $tabname Name of SQL table - * @param string $context 'add'=Output field for the "add form", 'edit'=Output field for the "edit form", 'hide'=Output field for the "add form" but we dont want it to be rendered + * @param array $fieldlist Array of fields + * @param Translate $langs Translate class + * @param Object $obj If we show a particular record, obj is filled with record fields + * @param string $tabname Name of SQL table + * @param string $context 'add'=Output field for the "add form", 'edit'=Output field for the "edit form", 'hide'=Output field for the "add form" but we dont want it to be rendered * @return void */ -function fieldList($fieldlist, $obj='', $tabname='', $context='') +function fieldList($fieldlist, $langs, $obj='', $tabname='', $context='') { - global $conf,$langs,$db; + global $conf,$db; global $form; global $region_id; global $elementList,$sourceList,$localtax_typeList; @@ -1809,6 +1823,14 @@ function fieldList($fieldlist, $obj='', $tabname='', $context='') } print '
'; + print ''; + print $langs->trans($hidden); + print '
'.$langs->trans("Signature").''; - require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; - $doleditor=new DolEditor('signature',GETPOST('signature'),'',138,'dolibarr_mailings','In',true,true,empty($conf->global->FCKEDITOR_ENABLE_USERSIGN)?0:1,ROWS_4,'90%'); - print $doleditor->Create(1); - print '
'.$langs->trans("AccountancyCode").''; + print ''; + print '
'.$langs->trans("HierarchicalResponsible").''; @@ -1035,7 +1035,8 @@ if (($action == 'create') || ($action == 'adduserldap')) print '
'.$langs->trans("AccountancyCode").''; - print ''; - print '
'; @@ -1118,15 +1118,15 @@ if (($action == 'create') || ($action == 'adduserldap')) $doleditor->Create(); print "
\n"; + // Signature + print '
'.$langs->trans("Signature").''; + require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; + $doleditor=new DolEditor('signature',GETPOST('signature'),'',138,'dolibarr_mailings','In',true,true,empty($conf->global->FCKEDITOR_ENABLE_USERSIGN)?0:1,ROWS_4,'90%'); + print $doleditor->Create(1); + print '
\n"; dol_fiche_end(); @@ -1379,11 +1379,15 @@ else print '
'.$langs->trans('Signature').''; - print dol_htmlentitiesbr($object->signature); - print "
'.$langs->trans("AccountancyCode").''.$object->accountancy_code.'
'.$langs->trans("HierarchicalResponsible").''; @@ -1396,7 +1400,8 @@ else print '
'.$langs->trans("AccountancyCode").''.$object->accountancy_code.'
'.$langs->trans("DateEmployment").''; @@ -1449,7 +1447,7 @@ else print '
'; + print '
'; print ''; print '
'; @@ -1567,7 +1565,12 @@ else print '
\n"; + // Signature + print '
'.$langs->trans('Signature').''; + print dol_htmlentitiesbr($object->signature); + print "
\n"; print ''; print ''; @@ -1772,586 +1775,574 @@ else dol_fiche_end(); } - } - if (GETPOST('action','aZ09') != 'presend' && GETPOST('action','aZ09') != 'send') - { - /* - * List of groups of user - */ - - if ($canreadgroup) + if (GETPOST('action','aZ09') != 'presend' && GETPOST('action','aZ09') != 'send') { - print load_fiche_titre($langs->trans("ListOfGroupsForUser"),'',''); - - // On selectionne les groupes auquel fait parti le user - $exclude = array(); - - $usergroup=new UserGroup($db); - $groupslist = $usergroup->listGroupsForUser($object->id); - - if (! empty($groupslist)) - { - if (! (! empty($conf->multicompany->enabled) && ! empty($conf->multicompany->transverse_mode))) - { - foreach($groupslist as $groupforuser) - { - $exclude[]=$groupforuser->id; - } - } - } - - if ($caneditgroup) - { - print ''."\n"; - print ''; - print ''; - } - - print ''."\n"; - print ''."\n"; - if(! empty($conf->multicompany->enabled) && !empty($conf->multicompany->transverse_mode) && $conf->entity == 1 && $user->admin && ! $user->entity) - { - print ''; - } - print ''; - print "'."\n"; - /* - * Groups assigned to user + * List of groups of user */ - if (! empty($groupslist)) + + if ($canreadgroup) { - foreach($groupslist as $group) + print load_fiche_titre($langs->trans("ListOfGroupsForUser"),'',''); + + // On selectionne les groupes auquel fait parti le user + $exclude = array(); + + $usergroup=new UserGroup($db); + $groupslist = $usergroup->listGroupsForUser($object->id); + + if (! empty($groupslist)) { - - - print ''; - print ''; - if (! empty($conf->multicompany->enabled) && ! empty($conf->multicompany->transverse_mode) && $conf->entity == 1 && $user->admin && ! $user->entity) - { - print '\n"; - } - } - else - { - print ''; - } - - print "
'.$langs->trans("Groups").''.$langs->trans("Entity").''; - if ($caneditgroup) - { - print $form->select_dolgroups('', 'group', 1, $exclude, 0, '', '', $object->entity); - print '   '; - // Multicompany - if (! empty($conf->multicompany->enabled)) - { - if ($conf->entity == 1 && $conf->multicompany->transverse_mode) - { - print ''.$langs->trans("Entity").'".$mc->select_entities($conf->entity); - } - else - { - print ''; - } - } - else - { - print ''; - } - print ''; - } - print '
'; - if ($caneditgroup) + if (! (! empty($conf->multicompany->enabled) && ! empty($conf->multicompany->transverse_mode))) { - print ''.img_object($langs->trans("ShowGroup"),"group").' '.$group->name.''; - } - else - { - print img_object($langs->trans("ShowGroup"),"group").' '.$group->name; - } - print ''; - if (! empty($group->usergroup_entity)) - { - $nb=0; - foreach($group->usergroup_entity as $group_entity) - { - $mc->getInfo($group_entity); - print ($nb > 0 ? ', ' : '').$mc->label; - print ''; - print img_delete($langs->trans("RemoveFromGroup")); - print ''; - $nb++; - } - } - } - print ''; - if ($caneditgroup && empty($conf->multicompany->transverse_mode)) - { - print ''; - print img_delete($langs->trans("RemoveFromGroup")); - print ''; - } - else - { - print " "; - } - print "
'.$langs->trans("None").'
"; - - if ($caneditgroup) - { - print ''; - } - print "
"; - } - - /* - * Fiche en mode edition - */ - if ($action == 'edit' && ($canedituser || $caneditfield || $caneditpassword || ($user->id == $object->id))) - { - print '
'; - print ''; - print ''; - print ''; - - dol_fiche_head($head, 'user', $title, 0, 'user'); - - print ''; - - // Ref/ID - if (! empty($conf->global->MAIN_SHOW_TECHNICAL_ID)) - { - print ''; - print ''; - print ''; - } - - // Lastname - print ""; - print ''; - print ''; - print ''; - - // Firstname - print "".''; - print ''; - - // Employee - print ''; - print ''; - - // Position/Job - print ''; - print ''; - - // Gender - print ''; - print ''; - - // Login - print "".''; - print ''; - print ''; - - // Pass - print ''; - print '\n"; - - // API key - if(! empty($conf->api->enabled) && $user->admin) { - print ''; - print ''; - } - - // Administrator - print ''; - if ($object->societe_id > 0) - { - $langs->load("admin"); - print ''; - } - else - { - print ''; + print "
"; } - - // EMail - print "".'global->USER_MAIL_REQUIRED)?' class="fieldrequired"':'').'>'.$langs->trans("EMail").''; - print ''; @@ -1310,13 +1304,7 @@ if ($id) $error=$hookmanager->error; $errors=$hookmanager->errors; // Show fields - if (empty($reshook)) { - $fieldl = $fieldlist; - if ($tabname[$id] == MAIN_DB_PREFIX . "c_actioncomm" && in_array($obj->type, array('system', 'systemauto'))) { - $fieldl=array(array('code'),array('libelle'),array('type'),'color','position'); - } - fieldList($fieldl, $langs, $obj, $tabname[$id], 'edit'); - } + if (empty($reshook)) fieldList($fieldlist, $obj, $tabname[$id], 'edit'); print ''; + } + elseif ($fieldlist[$field] == 'country') { if (in_array('region_id',$fieldlist)) { @@ -1823,14 +1818,6 @@ function fieldList($fieldlist, $langs, $obj='', $tabname='', $context='') } print ''; } - elseif (is_array($fieldlist[$field])) - { - $hidden = (! empty($obj->{$fieldlist[$field][0]})?$obj->{$fieldlist[$field][0]}:''); - print ''; - } else { $classtd=''; $class=''; From b35b40e2bf21cb827fd2c8ee3bfd00ae005db61e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 19 May 2017 17:08:42 +0200 Subject: [PATCH 190/299] Align position of right --- htdocs/admin/dict.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index ee21a8ccfbe..8319ccd0450 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -1228,6 +1228,7 @@ if ($id) if ($fieldlist[$field]=='lang') { $valuetoshow=$langs->trans("Language"); } if ($fieldlist[$field]=='type') { $valuetoshow=$langs->trans("Type"); } if ($fieldlist[$field]=='code') { $valuetoshow=$langs->trans("Code"); } + if ($fieldlist[$field]=='position') { $align='right'; } if ($fieldlist[$field]=='libelle' || $fieldlist[$field]=='label') { //if ($id != 25) $valuetoshow=$form->textwithtooltip($langs->trans("Label"), $langs->trans("LabelUsedByDefault"),2,1,img_help(1,'')); @@ -1494,6 +1495,7 @@ if ($id) $class='tddict'; if ($fieldlist[$field] == 'tracking') $class.=' tdoverflowauto'; if ($fieldlist[$field] == 'code') $class.=' width100'; + if ($fieldlist[$field] == 'position') $class.=' right'; // Show value for field if ($showfield) print ''; } From c30dcf78cb329dae0711f734ecc0c061390d95f5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 19 May 2017 17:24:15 +0200 Subject: [PATCH 191/299] Show info when link has been deleted --- htdocs/comm/action/card.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/htdocs/comm/action/card.php b/htdocs/comm/action/card.php index 30b13bc3007..2b10f0c2f26 100644 --- a/htdocs/comm/action/card.php +++ b/htdocs/comm/action/card.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2016 Laurent Destailleur + * Copyright (C) 2004-2017 Laurent Destailleur * Copyright (C) 2005 Simon TOSSER * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2010-2013 Juanjo Menent @@ -1396,7 +1396,11 @@ if ($id > 0) { include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; print ''; - print ''; + $link=dolGetElementUrl($object->fk_element,$object->elementtype,1); + print ''; } // Description From 807c77f754f922133e78c9c93c392a0b8eeded89 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 19 May 2017 18:03:49 +0200 Subject: [PATCH 192/299] Fix inconsistent options --- htdocs/admin/agenda_other.php | 23 ----------------------- htdocs/comm/action/card.php | 2 +- htdocs/comm/action/index.php | 1 - htdocs/core/class/conf.class.php | 6 ++++++ htdocs/societe/ajax/company.php | 6 +++--- 5 files changed, 10 insertions(+), 28 deletions(-) diff --git a/htdocs/admin/agenda_other.php b/htdocs/admin/agenda_other.php index 55b61145b6a..bd9587a4440 100644 --- a/htdocs/admin/agenda_other.php +++ b/htdocs/admin/agenda_other.php @@ -432,29 +432,6 @@ if ($conf->global->MAIN_FEATURES_LEVEL > 0) } } -// AGENDA_SHOW_LINKED_OBJECT -$var=!$var; -print ''."\n"; -print ''."\n"; -print ''."\n"; -print ''."\n"; - print '
'.$langs->trans("Ref").''; - print $object->id; - print '
'.$langs->trans("Lastname").''; - if ($caneditfield && !$object->ldap_sid) - { - print ''; - } - else - { - print ''; - print $object->lastname; - } - print '
'.$langs->trans("Firstname").''; - if ($caneditfield && !$object->ldap_sid) - { - print ''; - } - else - { - print ''; - print $object->firstname; - } - print '
'.fieldLabel('Employee','employee',0).''; - print $form->selectyesno("employee",$object->employee,1); - print '
'.$langs->trans("PostOrFunction").''; - if ($caneditfield) - { - print ''; - } - else - { - print ''; - print $object->job; - } - print '
'.$langs->trans("Gender").''; - $arraygender=array('man'=>$langs->trans("Genderman"),'woman'=>$langs->trans("Genderwoman")); - print $form->selectarray('gender', $arraygender, GETPOST('gender')?GETPOST('gender'):$object->gender, 1); - print '
'.$langs->trans("Login").''; - if ($user->admin && !$object->ldap_sid) - { - print ''; - } - else - { - print ''; - print $object->login; - } - print '
'.$langs->trans("Password").''; - if ($object->ldap_sid) - { - $text=$langs->trans("DomainPassword"); - } - else if ($caneditpassword) - { - $text=''; - if ($dolibarr_main_authentication && $dolibarr_main_authentication == 'http') - { - $text=$form->textwithpicto($text,$langs->trans("DolibarrInHttpAuthenticationSoPasswordUseless",$dolibarr_main_authentication),1,'warning'); - } - } - else - { - $text=preg_replace('/./i','*',$object->pass); - } - print $text; - print "
'.$langs->trans("ApiKey").''; - print ''; - if (! empty($conf->use_javascript_ajax)) - print ' '.img_picto($langs->trans('Generate'), 'refresh', 'id="generate_api_key" class="linkobject"'); - print '
'.$langs->trans("Administrator").''; - print ''.yn($object->admin); - print ' ('.$langs->trans("ExternalUser").')'; - print '
'; - $nbAdmin = $user->getNbOfUsers('active','',1); - $nbSuperAdmin = $user->getNbOfUsers('active','superadmin',1); - //var_dump($nbAdmin); - //var_dump($nbSuperAdmin); - if ($user->admin // Need to be admin to allow downgrade of an admin - && ($user->id != $object->id) // Don't downgrade ourself - && ( - (empty($conf->multicompany->enabled) && $nbAdmin >= 1) - || (! empty($conf->multicompany->enabled) && ($object->entity > 0 || $nbSuperAdmin > 1)) // Don't downgrade a superadmin if alone - ) - ) - { - print $form->selectyesno('admin',$object->admin,1); - - if (! empty($conf->multicompany->enabled) && ! $user->entity && empty($conf->multicompany->transverse_mode)) - { - if ($conf->use_javascript_ajax) + foreach($groupslist as $groupforuser) { - print ''; + $exclude[]=$groupforuser->id; } + } + } - $checked=(($object->admin && ! $object->entity) ? ' checked' : ''); - print ' '.$langs->trans("SuperAdministrator"); + if ($caneditgroup) + { + print ''."\n"; + print ''; + print ''; + } + + print ''."\n"; + print ''."\n"; + if(! empty($conf->multicompany->enabled) && !empty($conf->multicompany->transverse_mode) && $conf->entity == 1 && $user->admin && ! $user->entity) + { + print ''; + } + print ''; + print "'."\n"; + + /* + * Groups assigned to user + */ + if (! empty($groupslist)) + { + foreach($groupslist as $group) + { + + + print ''; + print ''; + if (! empty($conf->multicompany->enabled) && ! empty($conf->multicompany->transverse_mode) && $conf->entity == 1 && $user->admin && ! $user->entity) + { + print '\n"; } } else { - $yn = yn($object->admin); - print ''; - print ''; - if (! empty($conf->multicompany->enabled) && empty($object->entity)) print $form->textwithpicto($yn,$langs->trans("DontDowngradeSuperAdmin"),1,'warning'); - else print $yn; + print ''; } - print ''; - } - // Type - print ''; - print ''; - - // Address - print ''; - print ''; - - // Zip - print ''; - - // Town - print ''; - - // Country - print ''; - - // State - if (empty($conf->global->USER_DISABLE_STATE)) - { - print ''; - } - - // Tel pro - print "".''; - print ''; - - // Tel mobile - print "".''; - print ''; - - // Fax - print "".''; - print ''; - - // Skype - if (! empty($conf->skype->enabled)) - { - print ''; - print '
'.$langs->trans("Groups").''.$langs->trans("Entity").''; + if ($caneditgroup) + { + print $form->select_dolgroups('', 'group', 1, $exclude, 0, '', '', $object->entity); + print '   '; + // Multicompany + if (! empty($conf->multicompany->enabled)) + { + if ($conf->entity == 1 && $conf->multicompany->transverse_mode) + { + print ''.$langs->trans("Entity").'".$mc->select_entities($conf->entity); + } + else + { + print ''; + } + } + else + { + print ''; + } + print ''; + } + print '
'; + if ($caneditgroup) + { + print ''.img_object($langs->trans("ShowGroup"),"group").' '.$group->name.''; + } + else + { + print img_object($langs->trans("ShowGroup"),"group").' '.$group->name; + } + print ''; + if (! empty($group->usergroup_entity)) + { + $nb=0; + foreach($group->usergroup_entity as $group_entity) + { + $mc->getInfo($group_entity); + print ($nb > 0 ? ', ' : '').$mc->label; + print ''; + print img_delete($langs->trans("RemoveFromGroup")); + print ''; + $nb++; + } + } + } + print ''; + if ($caneditgroup && empty($conf->multicompany->transverse_mode)) + { + print ''; + print img_delete($langs->trans("RemoveFromGroup")); + print ''; + } + else + { + print " "; + } + print "
'.$langs->trans("None").'
'.$langs->trans("Type").''; - if ($user->id == $object->id || ! $user->admin) - { - $type=$langs->trans("Internal"); - if ($object->societe_id) $type=$langs->trans("External"); - print $form->textwithpicto($type,$langs->trans("InternalExternalDesc")); - if ($object->ldap_sid) print ' ('.$langs->trans("DomainUser").')'; - } - else - { - $type=0; - if ($object->contact_id) $type=$object->contact_id; - print $form->selectcontacts(0,$type,'contactid',2,'','',1,'',false,1); - if ($object->ldap_sid) print ' ('.$langs->trans("DomainUser").')'; - } - print '
'.fieldLabel('Address','address').'
'.fieldLabel('Zip','zipcode').''; - print $formcompany->select_ziptown($object->zip, 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6); - print '
'.fieldLabel('Town','town').''; - print $formcompany->select_ziptown($object->town, 'town', array('zipcode', 'selectcountry_id', 'state_id')); - print '
'.fieldLabel('Country','selectcounty_id').''; - print $form->select_country((GETPOST('country_id')!=''?GETPOST('country_id'):$object->country_id),'country_id'); - if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); - print '
'.fieldLabel('State','state_id').''; - print $formcompany->select_state($object->state_id,$object->country_code, 'state_id'); - print '
'.$langs->trans("PhonePro").''; - if ($caneditfield && empty($object->ldap_sid)) - { - print ''; - } - else - { - print ''; - print $object->office_phone; - } - print '
'.$langs->trans("PhoneMobile").''; - if ($caneditfield && empty($object->ldap_sid)) - { - print ''; - } - else - { - print ''; - print $object->user_mobile; - } - print '
'.$langs->trans("Fax").''; - if ($caneditfield && empty($object->ldap_sid)) - { - print ''; - } - else - { - print ''; - print $object->office_fax; - } - print '
'.$langs->trans("Skype").''; - if ($caneditfield && empty($object->ldap_sid)) + print "
"; + + if ($caneditgroup) { - print ''; + print ''; } - else - { - print ''; - print $object->skype; - } - print '
'; - if ($caneditfield && empty($object->ldap_sid)) + } + } + + /* + * Fiche en mode edition + */ + if ($action == 'edit' && ($canedituser || $caneditfield || $caneditpassword || ($user->id == $object->id))) + { + print '
'; + print ''; + print ''; + print ''; + + dol_fiche_head($head, 'user', $title, 0, 'user'); + + print ''; + + // Ref/ID + if (! empty($conf->global->MAIN_SHOW_TECHNICAL_ID)) + { + print ''; + print ''; + print ''; + } + + // Lastname + print ""; + print ''; + print ''; + print ''; + + // Firstname + print "".''; + print ''; + + // Employee + print ''; + print ''; + + // Position/Job + print ''; + print ''; + + // Gender + print ''; + print ''; + + // Login + print "".''; + print ''; + print ''; + + // Pass + print ''; + print '\n"; + + // API key + if(! empty($conf->api->enabled) && $user->admin) + { + print ''; + print ''; + } + + // Administrator + print ''; + if ($object->societe_id > 0) + { + $langs->load("admin"); + print ''; + } + else + { + print ''; - - // Signature - print "".''; + } + + // Type + print ''; + print ''; + + // Address + print ''; + print ''; + + // Zip + print ''; + + // Town + print ''; + + // Country + print ''; + + // State + if (empty($conf->global->USER_DISABLE_STATE)) + { + print ''; + } + + // Tel pro + print "".''; + print ''; + + // Tel mobile + print "".''; + print ''; + + // Fax + print "".''; + print ''; + + // Skype + if (! empty($conf->skype->enabled)) + { + print ''; + print ''; + } + + // EMail + print "".'global->USER_MAIL_REQUIRED)?' class="fieldrequired"':'').'>'.$langs->trans("EMail").''; + print ''; + + // OpenID url + if (isset($conf->file->main_authentication) && preg_match('/openid/',$conf->file->main_authentication) && ! empty($conf->global->MAIN_OPENIDURL_PERUSER)) + { + print "".''; print ''; - - // OpenID url - if (isset($conf->file->main_authentication) && preg_match('/openid/',$conf->file->main_authentication) && ! empty($conf->global->MAIN_OPENIDURL_PERUSER)) - { - print "".''; - print ''; - } - - // Hierarchy - print ''; + } + + // Accountancy code + if ($conf->accounting->enabled) + { + print ""; + print ''; print ''; - print "\n"; - - if (! empty($conf->salaries->enabled) && ! empty($user->rights->salaries->read)) - { - $langs->load("salaries"); - - // THM - print ''; - print ''; - print "\n"; - - // TJM - print ''; - print ''; - print "\n"; - - // Salary - print ''; - print ''; - print "\n"; - } - - // Weeklyhours - print ''; - print ''; - print "\n"; - - // Date employment - print ''; - print ''; - print "\n"; - - // Accountancy code - if ($conf->accounting->enabled) - { - print ""; - print ''; - print ''; - print ""; - } - + print ""; + } + + // Hierarchy + print ''; + print ''; + print "\n"; + + if ((! empty($conf->salaries->enabled) && ! empty($user->rights->salaries->read)) + || (! empty($conf->hrm->enabled) && ! empty($user->rights->hrm->employee->read))) + { + $langs->load("salaries"); + + // THM + print ''; + print ''; + print "\n"; + + // TJM + print ''; + print ''; + print "\n"; + + // Salary + print ''; + print ''; + print "\n"; + } + + // Weeklyhours + print ''; + print ''; + print "\n"; + + // Date employment + print ''; + print ''; + print "\n"; + // User color if (! empty($conf->agenda->enabled)) { @@ -2461,6 +2452,21 @@ else print $object->showOptionals($extrafields,'edit'); } + // Signature + print "".''; + print ''; + print '
'.$langs->trans("Ref").''; + print $object->id; + print '
'.$langs->trans("Lastname").''; + if ($caneditfield && !$object->ldap_sid) + { + print ''; + } + else + { + print ''; + print $object->lastname; + } + print '
'.$langs->trans("Firstname").''; + if ($caneditfield && !$object->ldap_sid) + { + print ''; + } + else + { + print ''; + print $object->firstname; + } + print '
'.fieldLabel('Employee','employee',0).''; + print $form->selectyesno("employee",$object->employee,1); + print '
'.$langs->trans("PostOrFunction").''; + if ($caneditfield) + { + print ''; + } + else + { + print ''; + print $object->job; + } + print '
'.$langs->trans("Gender").''; + $arraygender=array('man'=>$langs->trans("Genderman"),'woman'=>$langs->trans("Genderwoman")); + print $form->selectarray('gender', $arraygender, GETPOST('gender')?GETPOST('gender'):$object->gender, 1); + print '
'.$langs->trans("Login").''; + if ($user->admin && !$object->ldap_sid) + { + print ''; + } + else + { + print ''; + print $object->login; + } + print '
'.$langs->trans("Password").''; + if ($object->ldap_sid) + { + $text=$langs->trans("DomainPassword"); + } + else if ($caneditpassword) + { + $text=''; + if ($dolibarr_main_authentication && $dolibarr_main_authentication == 'http') { - print ''; + $text=$form->textwithpicto($text,$langs->trans("DolibarrInHttpAuthenticationSoPasswordUseless",$dolibarr_main_authentication),1,'warning'); + } + } + else + { + $text=preg_replace('/./i','*',$object->pass); + } + print $text; + print "
'.$langs->trans("ApiKey").''; + print ''; + if (! empty($conf->use_javascript_ajax)) + print ' '.img_picto($langs->trans('Generate'), 'refresh', 'id="generate_api_key" class="linkobject"'); + print '
'.$langs->trans("Administrator").''; + print ''.yn($object->admin); + print ' ('.$langs->trans("ExternalUser").')'; + print '
'; + $nbAdmin = $user->getNbOfUsers('active','',1); + $nbSuperAdmin = $user->getNbOfUsers('active','superadmin',1); + //var_dump($nbAdmin); + //var_dump($nbSuperAdmin); + if ($user->admin // Need to be admin to allow downgrade of an admin + && ($user->id != $object->id) // Don't downgrade ourself + && ( + (empty($conf->multicompany->enabled) && $nbAdmin >= 1) + || (! empty($conf->multicompany->enabled) && ($object->entity > 0 || $nbSuperAdmin > 1)) // Don't downgrade a superadmin if alone + ) + ) + { + print $form->selectyesno('admin',$object->admin,1); + + if (! empty($conf->multicompany->enabled) && ! $user->entity && empty($conf->multicompany->transverse_mode)) + { + if ($conf->use_javascript_ajax) + { + print ''; + } + + $checked=(($object->admin && ! $object->entity) ? ' checked' : ''); + print ' '.$langs->trans("SuperAdministrator"); + } } else { - print ''; - print $object->email; + $yn = yn($object->admin); + print ''; + print ''; + if (! empty($conf->multicompany->enabled) && empty($object->entity)) print $form->textwithpicto($yn,$langs->trans("DontDowngradeSuperAdmin"),1,'warning'); + else print $yn; } print '
'.$langs->trans("Signature").'
'.$langs->trans("Type").''; + if ($user->id == $object->id || ! $user->admin) + { + $type=$langs->trans("Internal"); + if ($object->societe_id) $type=$langs->trans("External"); + print $form->textwithpicto($type,$langs->trans("InternalExternalDesc")); + if ($object->ldap_sid) print ' ('.$langs->trans("DomainUser").')'; + } + else + { + $type=0; + if ($object->contact_id) $type=$object->contact_id; + print $form->selectcontacts(0,$type,'contactid',2,'','',1,'',false,1); + if ($object->ldap_sid) print ' ('.$langs->trans("DomainUser").')'; + } + print '
'.fieldLabel('Address','address').'
'.fieldLabel('Zip','zipcode').''; + print $formcompany->select_ziptown($object->zip, 'zipcode', array('town', 'selectcountry_id', 'state_id'), 6); + print '
'.fieldLabel('Town','town').''; + print $formcompany->select_ziptown($object->town, 'town', array('zipcode', 'selectcountry_id', 'state_id')); + print '
'.fieldLabel('Country','selectcounty_id').''; + print $form->select_country((GETPOST('country_id')!=''?GETPOST('country_id'):$object->country_id),'country_id'); + if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); + print '
'.fieldLabel('State','state_id').''; + print $formcompany->select_state($object->state_id,$object->country_code, 'state_id'); + print '
'.$langs->trans("PhonePro").''; + if ($caneditfield && empty($object->ldap_sid)) + { + print ''; + } + else + { + print ''; + print $object->office_phone; + } + print '
'.$langs->trans("PhoneMobile").''; + if ($caneditfield && empty($object->ldap_sid)) + { + print ''; + } + else + { + print ''; + print $object->user_mobile; + } + print '
'.$langs->trans("Fax").''; + if ($caneditfield && empty($object->ldap_sid)) + { + print ''; + } + else + { + print ''; + print $object->office_fax; + } + print '
'.$langs->trans("Skype").''; + if ($caneditfield && empty($object->ldap_sid)) + { + print ''; + } + else + { + print ''; + print $object->skype; + } + print '
'; + if ($caneditfield && empty($object->ldap_sid)) + { + print ''; + } + else + { + print ''; + print $object->email; + } + print '
'.$langs->trans("OpenIDURL").''; if ($caneditfield) { - require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; - $doleditor=new DolEditor('signature',$object->signature,'',138,'dolibarr_mailings','In',false,true,empty($conf->global->FCKEDITOR_ENABLE_USERSIGN)?0:1,ROWS_4,'90%'); - print $doleditor->Create(1); + print ''; } else - { - print dol_htmlentitiesbr($object->signature); + { + print ''; + print $object->openid; } print '
'.$langs->trans("OpenIDURL").''; - if ($caneditfield) - { - print ''; - } - else - { - print ''; - print $object->openid; - } - print '
'.$langs->trans("HierarchicalResponsible").'
'.$langs->trans("AccountancyCode").''; if ($caneditfield) { - print $form->select_dolusers($object->fk_user, 'fk_user', 1, array($object->id), 0, '', 0, $object->entity, 0, 0, '', 0, '', 'maxwidth300'); + print ''; } else { - print ''; - $huser=new User($db); - $huser->fetch($object->fk_user); - print $huser->getNomUrl(1); + print ''; + print $object->accountancy_code; } print '
'; - $text=$langs->trans("THM"); - print $form->textwithpicto($text, $langs->trans("THMDescription"), 1, 'help', 'classthm'); - print ''; - print ''; - print '
'; - $text=$langs->trans("TJM"); - print $form->textwithpicto($text, $langs->trans("TJMDescription"), 1, 'help', 'classthm'); - print ''; - print ''; - print '
'.$langs->trans("Salary").''; - print ''; - print '
'.$langs->trans("WeeklyHours").''; - print ''; - print '
'.$langs->trans("DateEmployment").''; - echo $form->select_date(GETPOST('dateemployment')?GETPOST('dateemployment'):$object->dateemployment,'dateemployment',0,0,1,'form'.'dateemployment',1,0,1); - print '
'.$langs->trans("AccountancyCode").''; - if ($caneditfield) - { - print ''; - } - else - { - print ''; - print $object->accountancy_code; - } - print '
'.$langs->trans("HierarchicalResponsible").''; + if ($caneditfield) + { + print $form->select_dolusers($object->fk_user, 'fk_user', 1, array($object->id), 0, '', 0, $object->entity, 0, 0, '', 0, '', 'maxwidth300'); + } + else + { + print ''; + $huser=new User($db); + $huser->fetch($object->fk_user); + print $huser->getNomUrl(1); + } + print '
'; + $text=$langs->trans("THM"); + print $form->textwithpicto($text, $langs->trans("THMDescription"), 1, 'help', 'classthm'); + print ''; + print ''; + print '
'; + $text=$langs->trans("TJM"); + print $form->textwithpicto($text, $langs->trans("TJMDescription"), 1, 'help', 'classthm'); + print ''; + print ''; + print '
'.$langs->trans("Salary").''; + print ''; + print '
'.$langs->trans("WeeklyHours").''; + print ''; + print '
'.$langs->trans("DateEmployment").''; + echo $form->select_date(GETPOST('dateemployment')?GETPOST('dateemployment'):$object->dateemployment,'dateemployment',0,0,1,'form'.'dateemployment',1,0,1); + print '
'.$langs->trans("Signature").''; + if ($caneditfield) + { + require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; + $doleditor=new DolEditor('signature',$object->signature,'',138,'dolibarr_mailings','In',false,true,empty($conf->global->FCKEDITOR_ENABLE_USERSIGN)?0:1,ROWS_4,'90%'); + print $doleditor->Create(1); + } + else + { + print dol_htmlentitiesbr($object->signature); + } + print '
'; dol_fiche_end(); @@ -2501,8 +2507,6 @@ else print ''; - } - } if (! empty($conf->ldap->enabled) && ! empty($object->ldap_sid)) $ldap->close(); From 4e7353f8a0525448aff1884580b0171f83bdcef0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 19 May 2017 13:39:00 +0200 Subject: [PATCH 186/299] Clean code --- htdocs/core/lib/usergroups.lib.php | 7 ++--- htdocs/core/modules/modHRM.class.php | 2 +- htdocs/core/modules/modSalaries.class.php | 2 +- htdocs/hrm/admin/admin_establishment.php | 2 +- htdocs/hrm/admin/admin_hrm.php | 2 +- htdocs/hrm/class/establishment.class.php | 2 ++ htdocs/hrm/establishment/info.php | 2 +- htdocs/langs/en_US/admin.lang | 6 ++--- htdocs/langs/en_US/main.lang | 1 + htdocs/user/bank.php | 31 ++++++++++++++++------- htdocs/user/card.php | 10 +++++--- 11 files changed, 44 insertions(+), 23 deletions(-) diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php index f48974acb02..3086e7d264a 100644 --- a/htdocs/core/lib/usergroups.lib.php +++ b/htdocs/core/lib/usergroups.lib.php @@ -141,16 +141,17 @@ function user_prepare_head($object) // $this->tabs = array('entity:-tabname); to remove a tab complete_head_from_modules($conf,$langs,$object,$head,$h,'user'); - if (! empty($conf->hrm->enabled) && $user->rights->hrm->employee->read) + if ((! empty($conf->salaries->enabled) && ! empty($user->rights->salaries->read)) + || (! empty($conf->hrm->enabled) && ! empty($user->rights->hrm->employee->read))) { // Bank $head[$h][0] = DOL_URL_ROOT.'/user/bank.php?id='.$object->id; - $head[$h][1] = $langs->trans("HR"); + $head[$h][1] = $langs->trans("HRAndBank"); $head[$h][2] = 'bank'; $h++; } - //Info on users is visible only by internal user + // Such info on users is visible only by internal user if (empty($user->societe_id)) { // Notes diff --git a/htdocs/core/modules/modHRM.class.php b/htdocs/core/modules/modHRM.class.php index 74a0107aedb..3d1ea43f63c 100644 --- a/htdocs/core/modules/modHRM.class.php +++ b/htdocs/core/modules/modHRM.class.php @@ -45,7 +45,7 @@ class modHRM extends DolibarrModules $this->family = "hr"; // Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module) $this->name = preg_replace( '/^mod/i', '', get_class($this)); - $this->description = "Management of employees carrier and feelings"; + $this->description = "Management of employees carrier and feelings (department, employment contract)"; // Possible values for version are: 'development', 'experimental', 'dolibarr' or version $this->version = 'development'; diff --git a/htdocs/core/modules/modSalaries.class.php b/htdocs/core/modules/modSalaries.class.php index a1f4753b12d..d5e982bcccc 100644 --- a/htdocs/core/modules/modSalaries.class.php +++ b/htdocs/core/modules/modSalaries.class.php @@ -54,7 +54,7 @@ class modSalaries extends DolibarrModules // Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module) $this->name = preg_replace('/^mod/i','',get_class($this)); // Module description used if translation string 'ModuleXXXDesc' not found (where XXX is value of numeric property 'numero' of module) - $this->description = "Employees contracts and salaries management"; + $this->description = "Payment of salaries"; // Possible values for version are: 'development', 'experimental', 'dolibarr' or version $this->version = 'dolibarr'; diff --git a/htdocs/hrm/admin/admin_establishment.php b/htdocs/hrm/admin/admin_establishment.php index 291169aa30d..1f1e9e53f73 100644 --- a/htdocs/hrm/admin/admin_establishment.php +++ b/htdocs/hrm/admin/admin_establishment.php @@ -74,7 +74,7 @@ print load_fiche_titre($langs->trans("HRMSetup"), $linkback); // Configuration header $head = hrm_admin_prepare_head(); -dol_fiche_head($head, 'establishments', $langs->trans("HRM"), 0, "user"); +dol_fiche_head($head, 'establishments', $langs->trans("HRM"), -1, "user"); $sql = "SELECT e.rowid, e.name, e.address, e.zip, e.town, e.status"; $sql.= " FROM ".MAIN_DB_PREFIX."establishment as e"; diff --git a/htdocs/hrm/admin/admin_hrm.php b/htdocs/hrm/admin/admin_hrm.php index 7f9ed583b98..f488eb562e5 100644 --- a/htdocs/hrm/admin/admin_hrm.php +++ b/htdocs/hrm/admin/admin_hrm.php @@ -78,7 +78,7 @@ print ''; print ''; print ''; -dol_fiche_head($head, 'parameters', $langs->trans("HRM"), 0, "user"); +dol_fiche_head($head, 'parameters', $langs->trans("HRM"), -1, "user"); print ''; print ''; diff --git a/htdocs/hrm/class/establishment.class.php b/htdocs/hrm/class/establishment.class.php index a171a111889..d449af14972 100644 --- a/htdocs/hrm/class/establishment.class.php +++ b/htdocs/hrm/class/establishment.class.php @@ -96,6 +96,7 @@ class Establishment extends CommonObject $sql.= ", entity"; $sql.= ", datec"; $sql.= ", fk_user_author"; + $sql.= ", fk_user_mod"; $sql.= ") VALUES ("; $sql.= " '".$this->db->escape($this->name)."'"; $sql.= ", '".$this->db->escape($this->address)."'"; @@ -106,6 +107,7 @@ class Establishment extends CommonObject $sql.= ", ".$conf->entity; $sql.= ", '".$this->db->idate($now)."'"; $sql.= ", ". $user->id; + $sql.= ", ". $user->id; $sql.= ")"; dol_syslog(get_class($this)."::create", LOG_DEBUG); diff --git a/htdocs/hrm/establishment/info.php b/htdocs/hrm/establishment/info.php index 1ef523fa607..29b571e58ce 100644 --- a/htdocs/hrm/establishment/info.php +++ b/htdocs/hrm/establishment/info.php @@ -44,7 +44,7 @@ if ($id) $head = establishment_prepare_head($object); - dol_fiche_head($head, 'info', $langs->trans("Establishment"), 0, 'building'); + dol_fiche_head($head, 'info', $langs->trans("Establishment"), -1, 'building'); print '
'; print ''; print "\n"; diff --git a/htdocs/hrm/class/establishment.class.php b/htdocs/hrm/class/establishment.class.php index d449af14972..413cb0cb584 100644 --- a/htdocs/hrm/class/establishment.class.php +++ b/htdocs/hrm/class/establishment.class.php @@ -33,8 +33,10 @@ class Establishment extends CommonObject public $table_element_line = ''; public $fk_element = 'fk_establishment'; protected $ismultientitymanaged = 1; // 0=No test on entity, 1=Test with field entity, 2=Test with link by societe - - public $id; + public $picto='building'; + + public $id; + public $ref; public $rowid; public $name; @@ -160,7 +162,7 @@ class Establishment extends CommonObject $sql .= ", zip = '".$this->db->escape($this->zip)."'"; $sql .= ", town = '".$this->db->escape($this->town)."'"; $sql .= ", fk_country = ".($this->country_id > 0 ? $this->country_id : 'null'); - $sql .= ", status = '".$this->db->escape($this->status)."'"; + $sql .= ", status = ".$this->db->escape($this->status); $sql .= ", fk_user_mod = " . $user->id; $sql .= " WHERE rowid = ".$this->id; @@ -197,6 +199,7 @@ class Establishment extends CommonObject $obj = $this->db->fetch_object($result); $this->id = $obj->rowid; + $this->ref = $obj->rowid; $this->name = $obj->name; $this->address = $obj->address; $this->zip = $obj->zip; @@ -249,9 +252,9 @@ class Establishment extends CommonObject * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto * @return string Label */ - function getLibStatus($mode=0) + function getLibStatut($mode=0) { - return $this->LibStatus($this->status,$mode); + return $this->LibStatut($this->status,$mode); } /** @@ -261,7 +264,7 @@ class Establishment extends CommonObject * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto * @return string Label */ - function LibStatus($status,$mode=0) + function LibStatut($status,$mode=0) { global $langs; @@ -383,4 +386,16 @@ class Establishment extends CommonObject return ''; } + + /** + * Initialise object with example values + * Id must be 0 if object instance is a specimen + * + * @return void + */ + public function initAsSpecimen() + { + $this->id = 0; + $this->ref = 'DEAAA'; + } } diff --git a/htdocs/hrm/establishment/card.php b/htdocs/hrm/establishment/card.php index eafa302886f..3a08ae197a2 100644 --- a/htdocs/hrm/establishment/card.php +++ b/htdocs/hrm/establishment/card.php @@ -140,7 +140,8 @@ else if ($action == 'update') $object->town = GETPOST('town', 'alpha'); $object->country_id = GETPOST('country_id', 'int'); $object->fk_user_mod = $user->id; - + $object->status = GETPOST('status','int'); + $result = $object->update($user); if ($result > 0) @@ -184,13 +185,13 @@ if ($action == 'create') print '
'; dol_print_object_info($object); diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 1c9ac65e4b8..be7451caffa 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -519,8 +519,8 @@ Module410Name=Webcalendar Module410Desc=Webcalendar integration Module500Name=Special expenses Module500Desc=Management of special expenses (taxes, social or fiscal taxes, dividends) -Module510Name=Employee contracts and salaries -Module510Desc=Management of employees contracts, salaries and payments +Module510Name=Payment of employee wages +Module510Desc=Record and follow payment of your employee wages Module520Name=Loan Module520Desc=Management of loans Module600Name=Notifications @@ -563,7 +563,7 @@ Module2900Desc=GeoIP Maxmind conversions capabilities Module3100Name=Skype Module3100Desc=Add a Skype button into users / third parties / contacts / members cards Module4000Name=HRM -Module4000Desc=Human resources management +Module4000Desc=Human resources management (mangement of department, employee contracts and feelings) Module5000Name=Multi-company Module5000Desc=Allows you to manage multiple companies Module6000Name=Workflow diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index a5f2ddf1e7e..01aa5537c13 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -772,6 +772,7 @@ SetMultiCurrencyCode=Set currency BulkActions=Bulk actions ClickToShowHelp=Click to show tooltip help HR=HR +HRAndBank=HR and Bank # Week day Monday=Monday Tuesday=Tuesday diff --git a/htdocs/user/bank.php b/htdocs/user/bank.php index c86ca27bf34..939f7c35aa7 100644 --- a/htdocs/user/bank.php +++ b/htdocs/user/bank.php @@ -24,7 +24,7 @@ /** * \file htdocs/user/bank.php * \ingroup HRM - * \brief BAN tab for users + * \brief Tab for HRM */ require '../main.inc.php'; @@ -47,7 +47,7 @@ $socid=0; if ($user->societe_id > 0) $socid = $user->societe_id; $feature2 = (($socid && $user->rights->user->self->creer)?'':'user'); if ($user->id == $id) $feature2=''; // A user can always read its own card -$result = restrictedArea($user, 'user', $id, 'user&user', $feature2); +$result = restrictedArea($user, 'salaries|hrm', $id, 'user&user', $feature2); $object = new User($db); if ($id > 0 || ! empty($ref)) @@ -155,14 +155,27 @@ if ($account->id && $action != 'edit') print '
'; + print '
'; + + print ''; + + print ''; + print ''; + + print '
'.$langs->trans("xxx").'
'; + + print '
'; + + print load_fiche_titre($langs->trans("BAN")); + print '
'; print ''; print ''; - print ''; + print ''; print ''; - print ''; + print ''; // Show fields of bank account foreach ($account->getFieldsToShow() as $val) { @@ -182,7 +195,7 @@ if ($account->id && $action != 'edit') } print ''; - print ''; print ''; - print ''; - print '\n"; - print '\n"; - print '\n"; diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 9249e8f295e..92951de98e8 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -1028,6 +1028,8 @@ if (($action == 'create') || ($action == 'adduserldap')) print ''; } + // TODO Move this into tab RH (HierarchicalResponsible must be on both tab) + // Hierarchy print ''; print ''; } - // TODO Move this into RH Tab (visible if RH module on) - + // TODO Move this into tab RH, visible when salarie or RH is visible (HierarchicalResponsible must be on both tab) + // Hierarchy print ''; print '"; } + // TODO Move this into tab RH (HierarchicalResponsible must be on both tab) + // Hierarchy print ''; print '' . "\n"; - /* - * Contact de la commande - */ + // Contact of order if ($socid > 0) { print "
'.$langs->trans("LabelRIB").''.$account->label.'
'.$account->label.'
'.$langs->trans("BankName").''.$account->bank.'
'.$account->bank.'
'.$langs->trans("IBAN").''.$account->iban . ' '; + print ''.$account->iban . ' '; if (! empty($account->iban)) { if (! checkIbanForAccount($account)) { print img_picto($langs->trans("IbanNotValid"),'warning'); @@ -193,7 +206,7 @@ if ($account->id && $action != 'edit') print '
'.$langs->trans("BIC").''.$account->bic.' '; + print ''.$account->bic.' '; if (! empty($account->bic)) { if (! checkSwiftForAccount($account)) { print img_picto($langs->trans("SwiftNotValid"),'warning'); @@ -203,15 +216,15 @@ if ($account->id && $action != 'edit') } print '
'.$langs->trans("BankAccountDomiciliation").''; + print '
'.$langs->trans("BankAccountDomiciliation").''; print $account->domiciliation; print "
'.$langs->trans("BankAccountOwner").''; + print '
'.$langs->trans("BankAccountOwner").''; print $account->proprio; print "
'.$langs->trans("BankAccountOwnerAddress").''; + print '
'.$langs->trans("BankAccountOwnerAddress").''; print $account->owner_address; print "
'.$langs->trans("HierarchicalResponsible").''; @@ -1264,7 +1266,7 @@ else */ if ($action != 'edit') { - dol_fiche_head($head, 'user', $title, 0, 'user'); + dol_fiche_head($head, 'user', $title, -1, 'user'); dol_banner_tab($object,'id',$linkback,$user->rights->user->user->lire || $user->admin); @@ -1386,8 +1388,8 @@ else print ''.$object->accountancy_code.'
'.$langs->trans("HierarchicalResponsible").''; @@ -2279,6 +2281,8 @@ else print "
'.$langs->trans("HierarchicalResponsible").''; From 30cedd154ef5737e717ff13bdd9b7c18ef22a324 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 19 May 2017 15:34:38 +0200 Subject: [PATCH 187/299] Fix default value must apply only if restore_lastsearch_values is on --- htdocs/core/lib/functions.lib.php | 49 +++++++++++++++---------------- 1 file changed, 23 insertions(+), 26 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 4e17c62d3f5..09856131da7 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -280,8 +280,24 @@ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) $relativepathstring = preg_replace('/^custom\//', '', $relativepathstring); $relativepathstring = preg_replace('/^\//', '', $relativepathstring); - // Management of default values - if (! isset($_GET['sortfield']) && ! empty($conf->global->MAIN_ENABLE_DEFAULT_VALUES)) // If we did a click on a field to sort, we do no apply default values. Same if option MAIN_ENABLE_DEFAULT_VALUES is not set + // Retrieve values if restore_lastsearch_values is set and there is saved values + if ($_GET['restore_lastsearch_values'] && ! empty($_SESSION['lastsearch_values_'.$relativepathstring])) // Keep $_GET here + { + $tmp=json_decode($_SESSION['lastsearch_values_'.$relativepathstring], true); + if (is_array($tmp)) + { + foreach($tmp as $key => $val) + { + if ($key == $paramname) + { + $out=$val; + break; + } + } + } + } + // Else, retreive default values if we are not doing a sort + elseif (! isset($_GET['sortfield']) && ! empty($conf->global->MAIN_ENABLE_DEFAULT_VALUES)) // If we did a click on a field to sort, we do no apply default values. Same if option MAIN_ENABLE_DEFAULT_VALUES is not set { if (! empty($_GET['action']) && $_GET['action'] == 'create' && ! isset($_GET[$paramname]) && ! isset($_POST[$paramname])) { @@ -331,26 +347,6 @@ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) } } - // Retrieve values into restore_lastsearch_values - if ($_GET['restore_lastsearch_values']) // Keep $_GET here - { - if (! empty($_SESSION['lastsearch_values_'.$relativepathstring])) - { - $tmp=json_decode($_SESSION['lastsearch_values_'.$relativepathstring], true); - if (is_array($tmp)) - { - foreach($tmp as $key => $val) - { - if ($key == $paramname) - { - $out=$val; - break; - } - } - } - } - } - } if (empty($check) && ! empty($conf->global->MAIN_FEATURES_LEVEL) && $conf->global->MAIN_FEATURES_LEVEL >= 2) @@ -455,13 +451,14 @@ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) //if (preg_match('/^search_/', $paramname) || in_array($paramname, array('sortorder', 'sortfield", 'smonth', 'syear', 'month', 'year'))) if (preg_match('/^search_/', $paramname) || in_array($paramname, array('sortorder','sortfield'))) { - //var_dump($user->default_values[$relativepathstring]);exit; - //if ($paramname == 'sortorder') var_dump($paramname.' - '.$out); - + //var_dump($paramname.' - '.$out.' '.$user->default_values[$relativepathstring]['filters'][$paramname]); + // We save search key only if: // - not empty, or // - if value is empty and a default value exists that is not empty (it means we did a filter to an empty value when default was not). - if (! empty($out) || ! empty($user->default_values[$relativepathstring][$paramname])) + + //if (! empty($out) || ! empty($user->default_values[$relativepathstring]['filters'][$paramname])) + if (! empty($out)) { $user->lastsearch_values_tmp[$relativepathstring][$paramname]=$out; } From 470165615f49805053a46a3c79fcb1ea1c5ee0b0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 19 May 2017 16:32:23 +0200 Subject: [PATCH 188/299] Fix look and feel v6 --- htdocs/commande/card.php | 22 +- htdocs/hrm/admin/admin_establishment.php | 2 +- htdocs/hrm/class/establishment.class.php | 27 +- htdocs/hrm/establishment/card.php | 184 +++++----- .../modulebuilder/skeletons/skeleton_card.php | 313 ++++++++++++++++-- 5 files changed, 405 insertions(+), 143 deletions(-) diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index fe91f0b6ff8..d06e03a48e7 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -1327,13 +1327,7 @@ $formorder = new FormOrder($db); $formmargin = new FormMargin($db); if (! empty($conf->projet->enabled)) { $formproject = new FormProjets($db); } -/** - * ******************************************************************* - * - * Mode creation - * - * ******************************************************************* - */ +// Mode creation if ($action == 'create' && $user->rights->commande->creer) { print load_fiche_titre($langs->trans('CreateOrder'),'','title_commercial.png'); @@ -1501,9 +1495,7 @@ if ($action == 'create' && $user->rights->commande->creer) } print '
" . $langs->trans("DefaultContact") . ''; $form->select_contacts($soc->id, $setcontact, 'contactid', 1, $srccontactslist); @@ -1748,11 +1740,7 @@ if ($action == 'create' && $user->rights->commande->creer) print '
'; } } else { - /* *************************************************************************** */ - /* */ - /* Mode vue et edition */ - /* */ - /* *************************************************************************** */ + // Mode view $now = dol_now(); if ($object->id > 0) { @@ -2447,8 +2435,8 @@ if ($action == 'create' && $user->rights->commande->creer) dol_fiche_end(); /* - * Boutons actions - */ + * Buttons for actions + */ if ($action != 'presend' && $action != 'editline') { print '
'; diff --git a/htdocs/hrm/admin/admin_establishment.php b/htdocs/hrm/admin/admin_establishment.php index 1f1e9e53f73..091a2a15f06 100644 --- a/htdocs/hrm/admin/admin_establishment.php +++ b/htdocs/hrm/admin/admin_establishment.php @@ -120,7 +120,7 @@ if ($result) print '
'.$obj->town.''; - print $establishmentstatic->getLibStatus(5); + print $establishmentstatic->getLibStatut(5); print '
'; // Name - print ''; + print ''; // Address print ''; print ''; print ''; print ''; @@ -220,7 +221,7 @@ if ($action == 'create') print ''; print ''; print ''; print ''; @@ -229,7 +230,7 @@ if ($action == 'create') print ''; print ''; print ''; print '
'. fieldLabel('Name','name',1).'
'. fieldLabel('Name','name',1).'
'.fieldLabel('Address','address',0).''; - print ''; + print ''; print '
'.fieldLabel('Country','selectcountry_id',0).''; - print $form->select_country($mysoc->country_id,'country_id'); + print $form->select_country(GETPOST('country_id','int')>0?GETPOST('country_id','int'):$mysoc->country_id,'country_id'); if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); print '
'.fieldLabel('Status','status',1).''; - print $form->selectarray('status',$status2label,GETPOST('status')); + print $form->selectarray('status',$status2label,GETPOST('status','alpha')); print '
'; @@ -244,7 +245,9 @@ if ($action == 'create') print ''; } -else if ($id) + +// Part to edit record +if (($id || $ref) && $action == 'edit') { $result = $object->fetch($id); if ($result > 0) @@ -316,91 +319,94 @@ else if ($id) print ''; } - else - { - /* - * Confirm delete - */ - if ($action == 'delete') - { - print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$id,$langs->trans("DeleteEstablishment"),$langs->trans("ConfirmDeleteEstablishment"),"confirm_delete"); - - } - - dol_fiche_head($head, 'card', $langs->trans("Establishment"), 0, 'building'); - - print ''; - - $linkback = ''.$langs->trans("BackToList").''; - - // Ref - print ''; - - // Name - print ''; - print ''; - print ''; - print ''; - - // Address - print ''; - print ''; - print ''; - print ''; - - // Zipcode - print ''; - print ''; - print ''; - print ''; - - // Town - print ''; - print ''; - print ''; - print ''; - - // Country - print ''; - print ''; - print ''; - print ''; - - // Status - print ''; - - print "
'.$langs->trans("Ref").''; - print $object->id; - print ''; - print $linkback; - print '
'.$langs->trans("Name").''.$object->name.'
'.$langs->trans("Address").''.$object->address.'
'.$langs->trans("Zipcode").''.$object->zip.'
'.$langs->trans("Town").''.$object->town.'
'.$langs->trans("Country").''; - if ($object->country_id > 0) - { - $img=picto_from_langcode($object->country_code); - print $img?$img.' ':''; - print getCountry($object->getCountryCode(),0,$db); - } - print '
'.$langs->trans("Status").''; - print $object->getLibStatus(4).'
"; - - dol_fiche_end(); - - /* - * Barre d'actions - */ - - print '
'; - print ''.$langs->trans('Modify').''; - print ''.$langs->trans('Delete').''; - print '
'; - } - } - else - { - dol_print_error($db); } + else dol_print_error($db); } -llxFooter(); +if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'create'))) +{ + $res = $object->fetch_optionals($object->id, $extralabels); + + $head = establishment_prepare_head($object); + dol_fiche_head($head, 'card', $langs->trans("Establishment"), -1, 'building'); + + // Confirmation to delete + if ($action == 'delete') + { + print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$id,$langs->trans("DeleteEstablishment"),$langs->trans("ConfirmDeleteEstablishment"),"confirm_delete"); + } + + + // Object card + // ------------------------------------------------------------ + + $linkback = '' . $langs->trans("BackToList") . ''; + + $morehtmlref='
'; + $morehtmlref.='
'; + + dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'id', $morehtmlref); + + + print '
'; + //print '
'; + print '
'; + print ''."\n"; + + // Name + print ''; + print ''; + print ''; + print ''; + + // Address + print ''; + print ''; + print ''; + print ''; + + // Zipcode + print ''; + print ''; + print ''; + print ''; + + // Town + print ''; + print ''; + print ''; + print ''; + + // Country + print ''; + print ''; + print ''; + print ''; + + print '
'.$langs->trans("Name").''.$object->name.'
'.$langs->trans("Address").''.$object->address.'
'.$langs->trans("Zipcode").''.$object->zip.'
'.$langs->trans("Town").''.$object->town.'
'.$langs->trans("Country").''; + if ($object->country_id > 0) + { + $img=picto_from_langcode($object->country_code); + print $img?$img.' ':''; + print getCountry($object->getCountryCode(),0,$db); + } + print '
'; + print '
'; + + print '

'; + + dol_fiche_end(); + + /* + * Barre d'actions + */ + + print '
'; + print ''.$langs->trans('Modify').''; + print ''.$langs->trans('Delete').''; + print '
'; +} + +llxFooter(); $db->close(); diff --git a/htdocs/modulebuilder/skeletons/skeleton_card.php b/htdocs/modulebuilder/skeletons/skeleton_card.php index 84cbcbb2160..49683af79c8 100644 --- a/htdocs/modulebuilder/skeletons/skeleton_card.php +++ b/htdocs/modulebuilder/skeletons/skeleton_card.php @@ -297,52 +297,305 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea { $res = $object->fetch_optionals($object->id, $extralabels); - $head = commande_prepare_head($object); - dol_fiche_head($head, 'order', $langs->trans("CustomerOrder"), 0, 'order'); + $head = mymodule_prepare_head($object); + dol_fiche_head($head, 'order', $langs->trans("CustomerOrder"), -1, 'order'); - print load_fiche_titre($langs->trans("MyModule")); - - dol_fiche_head(); - + $formconfirm = ''; + + // Confirmation to delete if ($action == 'delete') { - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('DeleteMyOjbect'), $langs->trans('ConfirmDeleteMyObject'), 'confirm_delete', '', 0, 1); - print $formconfirm; + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('DeleteOrder'), $langs->trans('ConfirmDeleteOrder'), 'confirm_delete', '', 0, 1); } + // Confirmation of action xxxx + if ($action == 'xxx') + { + $formquestion=array(); + /* + $formquestion = array( + // 'text' => $langs->trans("ConfirmClone"), + // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1), + // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1), + // array('type' => 'other', 'name' => 'idwarehouse', 'label' => $langs->trans("SelectWarehouseForStockDecrease"), 'value' => $formproduct->selectWarehouses(GETPOST('idwarehouse')?GETPOST('idwarehouse'):'ifone', 'idwarehouse', '', 1))); + }*/ + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('XXX'), $text, 'confirm_xxx', $formquestion, 0, 1, 220); + } + + if (! $formconfirm) { + $parameters = array('lineid' => $lineid); + $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + if (empty($reshook)) $formconfirm.=$hookmanager->resPrint; + elseif ($reshook > 0) $formconfirm=$hookmanager->resPrint; + } + + // Print form confirm + print $formconfirm; + + + + // Object card + // ------------------------------------------------------------ + + $linkback = '' . $langs->trans("BackToList") . ''; + + + $morehtmlref='
'; + /* + // Ref bis + $morehtmlref.=$form->editfieldkey("RefBis", 'ref_client', $object->ref_client, $object, $user->rights->mymodule->creer, 'string', '', 0, 1); + $morehtmlref.=$form->editfieldval("RefBis", 'ref_client', $object->ref_client, $object, $user->rights->mymodule->creer, 'string', '', null, null, '', 1); + // Thirdparty + $morehtmlref.='
'.$langs->trans('ThirdParty') . ' : ' . $soc->getNomUrl(1); + // Project + if (! empty($conf->projet->enabled)) + { + $langs->load("projects"); + $morehtmlref.='
'.$langs->trans('Project') . ' '; + if ($user->rights->mymodule->creer) + { + if ($action != 'classify') + { + $morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : '; + if ($action == 'classify') { + //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1); + $morehtmlref.='
'; + $morehtmlref.=''; + $morehtmlref.=''; + $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1); + $morehtmlref.=''; + $morehtmlref.='
'; + } else { + $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1); + } + } + } else { + if (! empty($object->fk_project)) { + $proj = new Project($db); + $proj->fetch($object->fk_project); + $morehtmlref.=''; + $morehtmlref.=$proj->ref; + $morehtmlref.=''; + } else { + $morehtmlref.=''; + } + } + } + */ + $morehtmlref.='
'; + + + dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref); + + + print '
'; + print '
'; + print '
'; print ''."\n"; // print ''; // LIST_OF_TD_LABEL_FIELDS_VIEW + + + // Other attributes + $cols = 2; + include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php'; + print '
'.$langs->trans("Label").''.$object->label.'
'; + print '
'; + print '
'; + print '
'; + print '
'; + print ''; + + + + print '
'; + print '
'; + print '
'; + print '
'; + + print '

'; dol_fiche_end(); - // Buttons - print '
'."\n"; - $parameters=array(); - $reshook=$hookmanager->executeHooks('addMoreActionsButtons',$parameters,$object,$action); // Note that $action and $object may have been modified by hook - if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); - - if (empty($reshook)) - { - if ($user->rights->mymodule->write) - { - print ''."\n"; - } - - if ($user->rights->mymodule->delete) - { - print ''."\n"; - } + // Buttons for actions + if ($action != 'presend' && $action != 'editline') { + print '
'."\n"; + $parameters=array(); + $reshook=$hookmanager->executeHooks('addMoreActionsButtons',$parameters,$object,$action); // Note that $action and $object may have been modified by hook + if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + + if (empty($reshook)) + { + if ($user->rights->mymodule->write) + { + print ''."\n"; + } + + if ($user->rights->mymodule->delete) + { + print ''."\n"; + } + } + print '
'."\n"; } - print '
'."\n"; + + // Select mail models is same action as presend + if (GETPOST('modelselected')) { + $action = 'presend'; + } + + if ($action != 'presend') + { + print '
'; + print ''; // ancre + // Documents + $comref = dol_sanitizeFileName($object->ref); + $relativepath = $comref . '/' . $comref . '.pdf'; + $filedir = $conf->mymodule->dir_output . '/' . $comref; + $urlsource = $_SERVER["PHP_SELF"] . "?id=" . $object->id; + $genallowed = $user->rights->mymodule->creer; + $delallowed = $user->rights->mymodule->supprimer; + print $formfile->showdocuments('mymodule', $comref, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', '', '', $soc->default_lang); + + + // Show links to link elements + $linktoelem = $form->showLinkToObjectBlock($object, null, array('order')); + $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem); + + + print '
'; + + // List of actions on element + include_once DOL_DOCUMENT_ROOT . '/core/class/html.formactions.class.php'; + $formactions = new FormActions($db); + $somethingshown = $formactions->showactions($object, 'order', $socid); + + print '
'; + } + - // Example 2 : Adding links to objects - // Show links to link elements - //$linktoelem = $form->showLinkToObjectBlock($object, null, array('skeleton')); - //$somethingshown = $form->showLinkedObjectBlock($object, $linktoelem); + /* + * Action presend + */ + /* + if ($action == 'presend') + { + $object->fetch_projet(); + $ref = dol_sanitizeFileName($object->ref); + include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; + $fileparams = dol_most_recent_file($conf->commande->dir_output . '/' . $ref, preg_quote($ref, '/').'[^\-]+'); + $file = $fileparams['fullname']; + + // Define output language + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && ! empty($_REQUEST['lang_id'])) + $newlang = $_REQUEST['lang_id']; + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) + $newlang = $object->thirdparty->default_lang; + + if (!empty($newlang)) + { + $outputlangs = new Translate('', $conf); + $outputlangs->setDefaultLang($newlang); + $outputlangs->load('commercial'); + } + + // Build document if it not exists + if (! $file || ! is_readable($file)) { + $result = $object->generateDocument(GETPOST('model') ? GETPOST('model') : $object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + if ($result <= 0) { + dol_print_error($db, $object->error, $object->errors); + exit(); + } + $fileparams = dol_most_recent_file($conf->commande->dir_output . '/' . $ref, preg_quote($ref, '/').'[^\-]+'); + $file = $fileparams['fullname']; + } + + print '
'; + print '
'; + print '
'; + print load_fiche_titre($langs->trans('SendOrderByMail')); + + dol_fiche_head(''); + + // Cree l'objet formulaire mail + include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php'; + $formmail = new FormMail($db); + $formmail->param['langsmodels']=(empty($newlang)?$langs->defaultlang:$newlang); + $formmail->fromtype = (GETPOST('fromtype')?GETPOST('fromtype'):(!empty($conf->global->MAIN_MAIL_DEFAULT_FROMTYPE)?$conf->global->MAIN_MAIL_DEFAULT_FROMTYPE:'user')); + + if($formmail->fromtype === 'user'){ + $formmail->fromid = $user->id; + + } + $formmail->trackid='ord'.$object->id; + if (! empty($conf->global->MAIN_EMAIL_ADD_TRACK_ID) && ($conf->global->MAIN_EMAIL_ADD_TRACK_ID & 2)) // If bit 2 is set + { + include DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; + $formmail->frommail=dolAddEmailTrackId($formmail->frommail, 'ord'.$object->id); + } + $formmail->withfrom = 1; + $liste = array(); + foreach ($object->thirdparty->thirdparty_and_contact_email_array(1) as $key => $value) + $liste [$key] = $value; + $formmail->withto = GETPOST('sendto') ? GETPOST('sendto') : $liste; + $formmail->withtocc = $liste; + $formmail->withtoccc = $conf->global->MAIN_EMAIL_USECCC; + if (empty($object->ref_client)) { + $formmail->withtopic = $outputlangs->trans('SendOrderRef', '__ORDERREF__'); + } else if (! empty($object->ref_client)) { + $formmail->withtopic = $outputlangs->trans('SendOrderRef', '__ORDERREF__ (__REFCLIENT__)'); + } + $formmail->withfile = 2; + $formmail->withbody = 1; + $formmail->withdeliveryreceipt = 1; + $formmail->withcancel = 1; + // Tableau des substitutions + $formmail->setSubstitFromObject($object); + $formmail->substit ['__ORDERREF__'] = $object->ref; + + $custcontact = ''; + $contactarr = array(); + $contactarr = $object->liste_contact(- 1, 'external'); + + if (is_array($contactarr) && count($contactarr) > 0) + { + foreach ($contactarr as $contact) + { + if ($contact['libelle'] == $langs->trans('TypeContact_commande_external_CUSTOMER')) { // TODO Use code and not label + $contactstatic = new Contact($db); + $contactstatic->fetch($contact ['id']); + $custcontact = $contactstatic->getFullName($langs, 1); + } + } + + if (! empty($custcontact)) { + $formmail->substit['__CONTACTCIVNAME__'] = $custcontact; + } + } + + // Tableau des parametres complementaires + $formmail->param['action'] = 'send'; + $formmail->param['models'] = 'order_send'; + $formmail->param['models_id']=GETPOST('modelmailselected','int'); + $formmail->param['orderid'] = $object->id; + $formmail->param['returnurl'] = $_SERVER["PHP_SELF"] . '?id=' . $object->id; + + // Init list of files + if (GETPOST("mode") == 'init') { + $formmail->clear_attached_files(); + $formmail->add_attached_files($file, basename($file), dol_mimetype($file)); + } + + // Show form + print $formmail->get_form(); + + dol_fiche_end(); + }*/ } From f65b29c1351e1fc3172eb58df494c9bddbd9cc73 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 19 May 2017 16:57:38 +0200 Subject: [PATCH 189/299] FIX #6867 - Rewrite code to solve regression (not mixing array/string type and solve php warnings). Also restore $langs as a global var. --- htdocs/admin/dict.php | 39 +++++++++++++-------------------------- 1 file changed, 13 insertions(+), 26 deletions(-) diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index 2b422074f1b..ee21a8ccfbe 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -581,12 +581,6 @@ if (GETPOST('actionadd') || GETPOST('actionmodify')) $listfieldmodify=explode(',',$tabfieldinsert[$id]); $listfieldvalue=explode(',',$tabfieldvalue[$id]); - if (GETPOST('actionmodify') && $tabname[$id] == MAIN_DB_PREFIX . "c_actioncomm" && isset($_POST["type"]) && in_array($_POST["type"],array('system','systemauto'))) { - $listfield=explode(',','color,position'); - $listfieldmodify=explode(',','color,position'); - $listfieldvalue=explode(',','color,position'); - } - // Check that all fields are filled $ok=1; foreach ($listfield as $f => $value) @@ -1110,7 +1104,7 @@ if ($id) if (empty($reshook)) { - fieldList($fieldlist,$langs,$obj,$tabname[$id],'add'); + fieldList($fieldlist, $obj, $tabname[$id], 'add'); } if ($id == 4) print '
'; print '
'; @@ -1657,15 +1645,14 @@ $db->close(); * Show fields in insert/edit mode * * @param array $fieldlist Array of fields - * @param Translate $langs Translate class * @param Object $obj If we show a particular record, obj is filled with record fields * @param string $tabname Name of SQL table * @param string $context 'add'=Output field for the "add form", 'edit'=Output field for the "edit form", 'hide'=Output field for the "add form" but we dont want it to be rendered * @return void */ -function fieldList($fieldlist, $langs, $obj='', $tabname='', $context='') +function fieldList($fieldlist, $obj='', $tabname='', $context='') { - global $conf,$db; + global $conf,$langs,$db; global $form; global $region_id; global $elementList,$sourceList,$localtax_typeList; @@ -1677,7 +1664,15 @@ function fieldList($fieldlist, $langs, $obj='', $tabname='', $context='') foreach ($fieldlist as $field => $value) { - if ($fieldlist[$field] == 'country') + if (in_array($fieldlist[$field], array('code', 'libelle', 'type')) && $tabname == MAIN_DB_PREFIX."c_actioncomm" && in_array($obj->type, array('system','systemauto'))) + { + $hidden = (! empty($obj->{$fieldlist[$field]})?$obj->{$fieldlist[$field]}:''); + print '
'; + print ''; + print $langs->trans($hidden); + print ''; - print ''; - print $langs->trans($hidden); - print ''.$valuetoshow.'
'.$langs->trans("LinkedObject").''.dolGetElementUrl($object->fk_element,$object->elementtype,1).'
'; + if (empty($link)) print ''.$langs->trans("ObjectDeleted").''; + else print $link; + print '
'.$langs->trans("AGENDA_SHOW_LINKED_OBJECT").' '."\n"; -if (! empty($conf->use_javascript_ajax)) -{ - print ajax_constantonoff('AGENDA_SHOW_LINKED_OBJECT'); -} -else -{ - if (empty($conf->global->AGENDA_SHOW_LINKED_OBJECT)) - { - print ''.img_picto($langs->trans("Disabled"),'switch_off').''; - } - else - { - print ''.img_picto($langs->trans("Enabled"),'switch_on').''; - } -} -print '
'; dol_fiche_end(); diff --git a/htdocs/comm/action/card.php b/htdocs/comm/action/card.php index 2b10f0c2f26..02ee84dc2de 100644 --- a/htdocs/comm/action/card.php +++ b/htdocs/comm/action/card.php @@ -1114,7 +1114,7 @@ if ($id > 0) $events[]=array('method' => 'getContacts', 'url' => dol_buildpath('/core/ajax/contacts.php?showempty=1',1), 'htmlname' => 'contactid', 'params' => array('add-customer-contact' => 'disabled')); // TODO Refresh also list of project if $conf->global->PROJECT_ALLOW_TO_LINK_FROM_OTHER_COMPANY not defined with list linked to socid ? // FIXME If we change company, we may get a project that does not match - print $form->select_company($object->socid, 'socid', '', 'SelectThirdParty', 1, 0, $events, 0); + print $form->select_company($object->socid, 'socid', '', 'SelectThirdParty', 1, 0, $events, 0, 'minwidth200'); print ''; print '
'; if ($user->admin) print ''.img_delete().''; - //else print ''.img_delete().''; // Some dictionnary can be edited by other profile than admin + //else print ''.img_delete().''; // Some dictionary can be edited by other profile than admin print ' '; if ($user->admin) print ''.img_delete().''; - //else print ''.img_delete().''; // Some dictionnary can be edited by other profile than admin + //else print ''.img_delete().''; // Some dictionary can be edited by other profile than admin print ' '; if ($user->admin) print ''.img_delete().''; - //else print ''.img_delete().''; // Some dictionnary can be edited by other profile than admin + //else print ''.img_delete().''; // Some dictionary can be edited by other profile than admin print ' '; if ($user->admin) print ''.img_delete().''; - //else print ''.img_delete().''; // Some dictionnary can be edited by other profile than admin + //else print ''.img_delete().''; // Some dictionary can be edited by other profile than admin print ' 
'; print ''; print ''; @@ -232,7 +233,7 @@ class FormMargin if (! empty($conf->product->enabled)) { //if ($marginInfo['margin_on_products'] != 0 && $marginInfo['margin_on_services'] != 0) { - print ''; + print ''; print ''; print ''; print ''; @@ -246,7 +247,7 @@ class FormMargin if (! empty($conf->service->enabled)) { - print ''; + print ''; print ''; print ''; print ''; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 2d3b1420e81..b6365a23b9a 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -2734,7 +2734,7 @@ function img_edit($titlealt = 'default', $float = 0, $other = 'class="pictoedit" if ($titlealt == 'default') $titlealt = $langs->trans('Modify'); - return img_picto($titlealt, 'edit.png', ($float ? 'style="float: '.($langs->tab_translate["DIRECTION"] == 'rtl'?'left':'right').'"' : $other)); + return img_picto($titlealt, 'edit.png', ($float ? 'style="float: '.($langs->tab_translate["DIRECTION"] == 'rtl'?'left':'right').'"' : "") . ($other?' '.$other:'')); } /** diff --git a/htdocs/core/lib/functions2.lib.php b/htdocs/core/lib/functions2.lib.php index 2f46ad49b80..c8d617ec99d 100644 --- a/htdocs/core/lib/functions2.lib.php +++ b/htdocs/core/lib/functions2.lib.php @@ -780,11 +780,26 @@ function get_next_value($db,$mask,$table,$field,$where='',$objsoc='',$date='',$m $masktype_value=''; } + // Personalized field {XXX-1} à {XXX-9} + $maskperso=array(); + $maskpersonew=array(); + $tmpmask=$mask; + while (preg_match('/\{([A-Z]+)\-([1-9])\}/i',$tmpmask,$regKey)) + { + $maskperso[$regKey[1]]='\{'.$regKey[1]+'\-'.$regKey[2].'\}'; + $maskpersonew[$regKey[1]]=str_pad('', '_', $regKey[2], STR_PAD_RIGHT); + $tmpmask=preg_replace('/\{'.$regKey[1].'\-'.$regKey[2].'\}/i', $maskpersonew, $tmpmask); + } + $maskwithonlyymcode=$mask; $maskwithonlyymcode=preg_replace('/\{(0+)([@\+][0-9\-\+\=]+)?([@\+][0-9\-\+\=]+)?\}/i',$maskcounter,$maskwithonlyymcode); $maskwithonlyymcode=preg_replace('/\{dd\}/i','dd',$maskwithonlyymcode); $maskwithonlyymcode=preg_replace('/\{(c+)(0*)\}/i',$maskrefclient,$maskwithonlyymcode); $maskwithonlyymcode=preg_replace('/\{(t+)\}/i',$masktype_value,$maskwithonlyymcode); + foreach($maskperso as $key => $val) + { + $maskwithonlyymcode=preg_replace('/'.$val.'/i', $maskpersonew[$key], $maskwithonlyymcode); + } $maskwithnocode=$maskwithonlyymcode; $maskwithnocode=preg_replace('/\{yyyy\}/i','yyyy',$maskwithnocode); $maskwithnocode=preg_replace('/\{yy\}/i','yy',$maskwithnocode); diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 4ae7d400a09..b8f31b4e224 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -273,7 +273,7 @@ input[type=submit] { } input, input.flat, form.flat select, select, select.flat, .dataTables_length label select { global->THEME_ELDY_SHOW_BORDER_INPUT)) - print "border: none;" + print "border: none;" ?> } input, input.flat, textarea, textarea.flat, form.flat select, select, select.flat, .dataTables_length label select { @@ -281,7 +281,7 @@ input, input.flat, textarea, textarea.flat, form.flat select, select, select.fla font-family: ; outline: none; margin: 0px 0px 0px 0px; - border-bottom: solid 1px rgba(0,0,0,.2); + border-bottom: solid 1px rgba(0,0,0,.4); } input { @@ -460,6 +460,9 @@ form { padding:0px; margin:0px; } +form#addproduct { + padding-top: 6px; +} div.float { float:; @@ -2238,12 +2241,12 @@ div .tdtop { } table.border td, div.border div div.tagtd { - padding: 3px 2px 3px 2px; + padding: 5px 2px 5px 2px; border-collapse: collapse; } div.tabBar .fichecenter table.border>tbody>tr>td, div.tabBar .fichecenter div.border div div.tagtd, div.tabBar div.border div div.tagtd { - padding-top: 4px; + padding-top: 5px; border-bottom: 1px solid #E0E0E0; } @@ -2709,9 +2712,6 @@ tr.liste_sub_total, tr.liste_sub_total td { { padding-left: 2px; } -.margintable td { - border: 0px !important; -} /* Disable shadows */ .noshadow { diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 2beef147c02..91a4c0922d9 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -2801,9 +2801,6 @@ tr.liste_sub_total, tr.liste_sub_total td { { padding-left: 2px; } -.margintable td { - border: 0px !important; -} /* Disable shadows */ .noshadow { From 2a9c6d9387e0c63ffd064558b45edd63cf9c8480 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 20 May 2017 21:11:31 +0200 Subject: [PATCH 205/299] Complete ignore file --- htdocs/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/.gitignore b/htdocs/.gitignore index 608ef55d106..5e2113ec179 100644 --- a/htdocs/.gitignore +++ b/htdocs/.gitignore @@ -4,6 +4,7 @@ /dolimed* /ecommerce* /extensions* +/forceproject* /google* /lead /multicompany* From b3dc73e61161634de13f7c3664f6e2d8d89078ca Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 21 May 2017 02:43:51 +0200 Subject: [PATCH 206/299] Look and feel v6 --- htdocs/accountancy/admin/productaccount.php | 1 + htdocs/accountancy/bookkeeping/list.php | 1 + htdocs/accountancy/customer/lines.php | 1 + htdocs/accountancy/customer/list.php | 3 +- htdocs/accountancy/expensereport/lines.php | 3 +- htdocs/accountancy/expensereport/list.php | 5 +- htdocs/accountancy/supplier/lines.php | 3 +- htdocs/accountancy/supplier/list.php | 3 +- htdocs/adherents/list.php | 1 + htdocs/adherents/subscription/list.php | 1 + htdocs/adherents/type.php | 1 + htdocs/admin/defaultvalues.php | 1 + htdocs/admin/modules.php | 3 +- htdocs/admin/translation.php | 1 + htdocs/comm/action/listactions.php | 1 + htdocs/comm/action/rapport/index.php | 1 + htdocs/comm/mailing/cibles.php | 2 + htdocs/comm/mailing/list.php | 1 + htdocs/comm/propal/list.php | 3 +- htdocs/commande/list.php | 3 +- htdocs/compta/bank/bankentries.php | 1 + htdocs/compta/bank/index.php | 1 + htdocs/compta/bank/various_payment/index.php | 3 +- htdocs/compta/charges/index.php | 1 + htdocs/compta/facture/contact.php | 2 +- htdocs/compta/facture/fiche-rec.php | 1 + htdocs/compta/facture/list.php | 5 +- htdocs/compta/facture/prelevement.php | 2 +- htdocs/compta/paiement/cheque/list.php | 1 + htdocs/compta/paiement/list.php | 1 + htdocs/compta/prelevement/bons.php | 1 + htdocs/compta/prelevement/factures.php | 3 +- htdocs/compta/salaries/index.php | 3 +- htdocs/compta/sociales/card.php | 81 ++++++++++--------- htdocs/compta/sociales/document.php | 23 +++++- htdocs/compta/sociales/index.php | 1 + htdocs/compta/sociales/info.php | 27 ++++++- htdocs/compta/sociales/payments.php | 1 + htdocs/compta/tva/reglement.php | 1 + htdocs/contact/list.php | 1 + htdocs/contrat/list.php | 1 + htdocs/contrat/services.php | 1 + htdocs/core/lib/company.lib.php | 4 +- htdocs/cron/list.php | 1 + htdocs/don/list.php | 1 + htdocs/expedition/list.php | 1 + htdocs/expensereport/list.php | 1 + htdocs/fichinter/list.php | 1 + htdocs/fourn/commande/list.php | 1 + htdocs/fourn/facture/list.php | 1 + htdocs/fourn/facture/paiement.php | 3 +- htdocs/fourn/product/list.php | 1 + htdocs/holiday/list.php | 1 + htdocs/loan/index.php | 1 + .../modulebuilder/skeletons/skeleton_list.php | 1 + htdocs/opensurvey/list.php | 1 + htdocs/product/list-with-listview.php | 1 + htdocs/product/list.php | 1 + htdocs/product/reassort.php | 1 + htdocs/product/reassortlot.php | 1 + htdocs/product/stock/list.php | 3 +- htdocs/product/stock/mouvement.php | 1 + htdocs/product/stock/productlot_list.php | 1 + htdocs/projet/list.php | 1 + htdocs/projet/tasks.php | 1 + htdocs/projet/tasks/list.php | 1 + htdocs/projet/tasks/time.php | 3 +- htdocs/resource/list.php | 1 + htdocs/societe/list.php | 1 + htdocs/societe/notify/card.php | 1 + htdocs/supplier_proposal/list.php | 1 + htdocs/user/group/index.php | 1 + htdocs/user/index.php | 1 + htdocs/user/notify/card.php | 1 + 74 files changed, 178 insertions(+), 64 deletions(-) diff --git a/htdocs/accountancy/admin/productaccount.php b/htdocs/accountancy/admin/productaccount.php index 4f82db33e94..359a8b40c12 100644 --- a/htdocs/accountancy/admin/productaccount.php +++ b/htdocs/accountancy/admin/productaccount.php @@ -279,6 +279,7 @@ if ($result) print ''; print ''; print ''; + print ''; print load_fiche_titre($langs->trans("ProductsBinding"), '', 'title_accountancy'); print '
'; diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index b382d855994..0c49ac0e1ba 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -355,6 +355,7 @@ print ''; print ''; print ''; print ''; +print ''; $button = ''; if (count($filter)) $button.= $langs->trans("ExportFilteredList"); diff --git a/htdocs/accountancy/customer/lines.php b/htdocs/accountancy/customer/lines.php index 428e490aff7..52b3a31d6f0 100644 --- a/htdocs/accountancy/customer/lines.php +++ b/htdocs/accountancy/customer/lines.php @@ -248,6 +248,7 @@ if ($result) { print ''; print ''; print ''; + print ''; print_barre_liste($langs->trans("InvoiceLinesDone"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num_lines, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit); print $langs->trans("DescVentilDoneCustomer") . '
'; diff --git a/htdocs/accountancy/customer/list.php b/htdocs/accountancy/customer/list.php index 46cb19c2ae1..bbd875e0dbf 100644 --- a/htdocs/accountancy/customer/list.php +++ b/htdocs/accountancy/customer/list.php @@ -263,8 +263,7 @@ if ($result) { print ''; print ''; print ''; - - //$center='
'; + print ''; print_barre_liste($langs->trans("InvoiceLines"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num_lines, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit); diff --git a/htdocs/accountancy/expensereport/lines.php b/htdocs/accountancy/expensereport/lines.php index 4205a497c1a..6d0ffbd4476 100644 --- a/htdocs/accountancy/expensereport/lines.php +++ b/htdocs/accountancy/expensereport/lines.php @@ -219,7 +219,8 @@ if ($result) { print ''; print ''; print ''; - + print ''; + print_barre_liste($langs->trans("ExpenseReportLinesDone"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num_lines, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit); print $langs->trans("DescVentilDoneExpenseReport") . '
'; diff --git a/htdocs/accountancy/expensereport/list.php b/htdocs/accountancy/expensereport/list.php index 114fd2c99ea..72316e4c4d6 100644 --- a/htdocs/accountancy/expensereport/list.php +++ b/htdocs/accountancy/expensereport/list.php @@ -246,9 +246,8 @@ if ($result) { print ''; print ''; print ''; - - //$center='
'; - + print ''; + print_barre_liste($langs->trans("ExpenseReportLines"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num_lines, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit); print $langs->trans("DescVentilTodoExpenseReport") . '

'; diff --git a/htdocs/accountancy/supplier/lines.php b/htdocs/accountancy/supplier/lines.php index 09cf552c7bb..1a95262f861 100644 --- a/htdocs/accountancy/supplier/lines.php +++ b/htdocs/accountancy/supplier/lines.php @@ -230,7 +230,8 @@ if ($result) { print ''; print ''; print ''; - + print ''; + print_barre_liste($langs->trans("InvoiceLinesDone"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num_lines, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit); print $langs->trans("DescVentilDoneSupplier") . '
'; diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php index e702aa8add8..061e465b1e7 100644 --- a/htdocs/accountancy/supplier/list.php +++ b/htdocs/accountancy/supplier/list.php @@ -260,8 +260,7 @@ if ($result) { print ''; print ''; print ''; - - //$center='
'; + print ''; print_barre_liste($langs->trans("InvoiceLines"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num_lines, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit); diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php index 9e0de6f1d75..1b059d8616d 100644 --- a/htdocs/adherents/list.php +++ b/htdocs/adherents/list.php @@ -353,6 +353,7 @@ print ''; print ''; print ''; +print ''; print ''; print_barre_liste($titre, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_generic.png', 0, '', '', $limit); diff --git a/htdocs/adherents/subscription/list.php b/htdocs/adherents/subscription/list.php index 206f5ebf8c9..55b832e327c 100644 --- a/htdocs/adherents/subscription/list.php +++ b/htdocs/adherents/subscription/list.php @@ -189,6 +189,7 @@ if ($result) print ''; print ''; print ''; + print ''; print ''; print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_generic.png', 0, '', '', $limit); diff --git a/htdocs/adherents/type.php b/htdocs/adherents/type.php index fb147750e0b..083ab4bda3b 100644 --- a/htdocs/adherents/type.php +++ b/htdocs/adherents/type.php @@ -191,6 +191,7 @@ if (! $rowid && $action != 'create' && $action != 'edit') print ''; print ''; print ''; + print ''; print ''; print_barre_liste($langs->trans("MembersTypes"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_generic.png', 0, '', '', $limit); diff --git a/htdocs/admin/defaultvalues.php b/htdocs/admin/defaultvalues.php index 7ebc67472d1..40e63de8aea 100644 --- a/htdocs/admin/defaultvalues.php +++ b/htdocs/admin/defaultvalues.php @@ -220,6 +220,7 @@ print ''; print ''; print ''; +print ''; $head=defaultvalues_prepare_head(); diff --git a/htdocs/admin/modules.php b/htdocs/admin/modules.php index 433508be908..5c4291ff3f3 100644 --- a/htdocs/admin/modules.php +++ b/htdocs/admin/modules.php @@ -436,7 +436,8 @@ if ($mode == 'common') print ''; print ''; print ''; - + print ''; + dol_fiche_head($head, $mode, '', -1); $moreforfilter = ''; diff --git a/htdocs/admin/translation.php b/htdocs/admin/translation.php index c9488f919fe..72aaa7fe355 100644 --- a/htdocs/admin/translation.php +++ b/htdocs/admin/translation.php @@ -209,6 +209,7 @@ print ''; print ''; print ''; +print ''; $head=translation_prepare_head(); diff --git a/htdocs/comm/action/listactions.php b/htdocs/comm/action/listactions.php index 301cf63620e..6ed846c0ebe 100644 --- a/htdocs/comm/action/listactions.php +++ b/htdocs/comm/action/listactions.php @@ -324,6 +324,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print ''; $nav=''; if ($optioncss != '') $nav.= ''; diff --git a/htdocs/comm/action/rapport/index.php b/htdocs/comm/action/rapport/index.php index 760d82f0246..125355a3386 100644 --- a/htdocs/comm/action/rapport/index.php +++ b/htdocs/comm/action/rapport/index.php @@ -111,6 +111,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print_barre_liste($langs->trans("Actions"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_agenda', 0, '', '', $limit); diff --git a/htdocs/comm/mailing/cibles.php b/htdocs/comm/mailing/cibles.php index c302dea1e43..719dba1a622 100644 --- a/htdocs/comm/mailing/cibles.php +++ b/htdocs/comm/mailing/cibles.php @@ -428,6 +428,7 @@ if ($object->fetch($id) >= 0) print ''; print ''; print ''; + print ''; print ''; $cleartext=''; @@ -443,6 +444,7 @@ if ($object->fetch($id) >= 0) print ''; print ''; print ''; + print ''; print ''; print ''; diff --git a/htdocs/comm/mailing/list.php b/htdocs/comm/mailing/list.php index f5efbf54383..e7775a6485e 100644 --- a/htdocs/comm/mailing/list.php +++ b/htdocs/comm/mailing/list.php @@ -116,6 +116,7 @@ if ($result) print ''; print ''; print ''; + print ''; $moreforfilter = ''; diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index af9ffa6d778..d2a6c6e926f 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -407,7 +407,8 @@ if ($resql) print ''; print ''; print ''; - + print ''; + print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_commercial.png', 0, '', '', $limit); if ($massaction == 'presend') diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index c73258cff89..b9102e78ddc 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -648,7 +648,8 @@ if ($resql) print ''; print ''; print ''; - print ''; + print ''; + print ''; print ''; print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_commercial.png', 0, '', '', $limit); diff --git a/htdocs/compta/bank/bankentries.php b/htdocs/compta/bank/bankentries.php index ed8241de427..fd3c1ec9825 100644 --- a/htdocs/compta/bank/bankentries.php +++ b/htdocs/compta/bank/bankentries.php @@ -578,6 +578,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print ''; print ''; if (GETPOST('bid')) print ''; diff --git a/htdocs/compta/bank/index.php b/htdocs/compta/bank/index.php index 37883c29c0f..8ff5f1964fc 100644 --- a/htdocs/compta/bank/index.php +++ b/htdocs/compta/bank/index.php @@ -256,6 +256,7 @@ print ''; print ''; print ''; +print ''; print ''; print_barre_liste($title,$page,$_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num,$nbtotalofrecords,'title_bank.png',0,$newcardbutton,'',$limit, 1); diff --git a/htdocs/compta/bank/various_payment/index.php b/htdocs/compta/bank/various_payment/index.php index abf6d23d22e..f189eeef306 100644 --- a/htdocs/compta/bank/various_payment/index.php +++ b/htdocs/compta/bank/various_payment/index.php @@ -141,7 +141,8 @@ if ($result) print ''; print ''; print ''; - + print ''; + print_barre_liste($langs->trans("VariousPayments"),$page,$_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num, $totalnboflines, 'title_accountancy.png', 0, '', '', $limit); print '
'; diff --git a/htdocs/compta/charges/index.php b/htdocs/compta/charges/index.php index ee71290be2d..a690478a53e 100644 --- a/htdocs/compta/charges/index.php +++ b/htdocs/compta/charges/index.php @@ -89,6 +89,7 @@ print ''; print ''; print ''; print ''; +print ''; print ''; if ($mode != 'sconly') diff --git a/htdocs/compta/facture/contact.php b/htdocs/compta/facture/contact.php index cdca425d5f6..93b23834e9f 100644 --- a/htdocs/compta/facture/contact.php +++ b/htdocs/compta/facture/contact.php @@ -140,7 +140,7 @@ if ($id > 0 || ! empty($ref)) $totalpaye = $object->getSommePaiement(); - dol_fiche_head($head, 'contact', $langs->trans('InvoiceCustomer'), 0, 'bill'); + dol_fiche_head($head, 'contact', $langs->trans('InvoiceCustomer'), -1, 'bill'); // Invoice content diff --git a/htdocs/compta/facture/fiche-rec.php b/htdocs/compta/facture/fiche-rec.php index 3c22b96a1d4..b09bd7f60f3 100644 --- a/htdocs/compta/facture/fiche-rec.php +++ b/htdocs/compta/facture/fiche-rec.php @@ -1652,6 +1652,7 @@ else print ''; print ''; print ''; + print ''; print ''; print_barre_liste($langs->trans("RepeatableInvoices"),$page,$_SERVER['PHP_SELF'],$param,$sortfield,$sortorder,'',$num,$nbtotalofrecords,'title_accountancy.png',0,'','',$limit); diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index 638ca033e1a..10b11812b1a 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -433,7 +433,7 @@ if ($search_status != '' && $search_status >= 0) if ($search_status == '2') $sql.=" AND f.fk_statut = 2"; // payed Not that some corrupted data may contains f.fk_statut = 1 AND f.paye = 1 (it means payed too but should not happend. If yes, reopen and reclassify billed) if ($search_status == '3') $sql.=" AND f.fk_statut = 3"; // abandonned } -if ($search_paymentmode > 0) $sql .= " AND f.fk_mode_reglement = ".$search_paymentmode.""; +if ($search_paymentmode > 0) $sql .= " AND f.fk_mode_reglement = ".$search_paymentmode; if ($month > 0) { if ($year > 0 && empty($day)) @@ -454,7 +454,7 @@ if ($month_lim > 0) else if ($year_lim > 0 && ! empty($day_lim)) $sql.= " AND f.date_lim_reglement BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $month_lim, $day_lim, $year_lim))."' AND '".$db->idate(dol_mktime(23, 59, 59, $month_lim, $day_lim, $year_lim))."'"; else - $sql.= " AND date_format(f.date_lim_reglement, '%m') = '".$month_lim."'"; + $sql.= " AND date_format(f.date_lim_reglement, '%m') = '".$db->escape($month_lim)."'"; } else if ($year_lim > 0) { @@ -600,6 +600,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print ''; print_barre_liste($langs->trans('BillsCustomers').' '.($socid?' '.$soc->name:''), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_accountancy.png', 0, '', '', $limit); diff --git a/htdocs/compta/facture/prelevement.php b/htdocs/compta/facture/prelevement.php index f3d83278885..e9b1694808b 100644 --- a/htdocs/compta/facture/prelevement.php +++ b/htdocs/compta/facture/prelevement.php @@ -147,7 +147,7 @@ if ($object->id > 0) $head = facture_prepare_head($object); - dol_fiche_head($head, 'standingorders', $langs->trans('InvoiceCustomer'),0,'bill'); + dol_fiche_head($head, 'standingorders', $langs->trans('InvoiceCustomer'), -1, 'bill'); // Invoice content diff --git a/htdocs/compta/paiement/cheque/list.php b/htdocs/compta/paiement/cheque/list.php index 9798e2d28b4..a4fac965e7a 100644 --- a/htdocs/compta/paiement/cheque/list.php +++ b/htdocs/compta/paiement/cheque/list.php @@ -138,6 +138,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print_barre_liste($langs->trans("MenuChequeDeposits"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_bank.png', '', '', $limit); diff --git a/htdocs/compta/paiement/list.php b/htdocs/compta/paiement/list.php index ab4189d5338..daf70556213 100644 --- a/htdocs/compta/paiement/list.php +++ b/htdocs/compta/paiement/list.php @@ -218,6 +218,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print ''; print_barre_liste($langs->trans("ReceivedCustomersPayments"), $page, $_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num, $nbtotalofrecords,'title_accountancy.png', 0, '', '', $limit); diff --git a/htdocs/compta/prelevement/bons.php b/htdocs/compta/prelevement/bons.php index 7319de4a7bd..302e1e9e59c 100644 --- a/htdocs/compta/prelevement/bons.php +++ b/htdocs/compta/prelevement/bons.php @@ -105,6 +105,7 @@ if ($result) print ''; print ''; print ''; + print ''; print ''; print_barre_liste($langs->trans("WithdrawalsReceipts"), $page, $_SERVER["PHP_SELF"], $urladd, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_generic', 0, '', '', $limit); diff --git a/htdocs/compta/prelevement/factures.php b/htdocs/compta/prelevement/factures.php index 72d775a49c3..6136ee48499 100644 --- a/htdocs/compta/prelevement/factures.php +++ b/htdocs/compta/prelevement/factures.php @@ -166,7 +166,8 @@ if ($result) print ''; print ''; print ''; - print ''; + print ''; + print ''; print ''; $massactionbutton=''; diff --git a/htdocs/compta/salaries/index.php b/htdocs/compta/salaries/index.php index e193374a552..dc95b06bc52 100644 --- a/htdocs/compta/salaries/index.php +++ b/htdocs/compta/salaries/index.php @@ -150,7 +150,8 @@ if ($result) print ''; print ''; print ''; - + print ''; + print_barre_liste($langs->trans("SalariesPayments"),$page,$_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num, $totalnboflines, 'title_accountancy.png', 0, '', '', $limit); print '
'; diff --git a/htdocs/compta/sociales/card.php b/htdocs/compta/sociales/card.php index f34ff9b1a31..630197cfc78 100644 --- a/htdocs/compta/sociales/card.php +++ b/htdocs/compta/sociales/card.php @@ -77,6 +77,13 @@ if ($action == 'reopen' && $user->rights->tax->charges->creer) { } } +// Link to a project +if ($action == 'classin' && $user->rights->tax->charges->creer) +{ + $object->fetch($id); + $object->setProject(GETPOST('projectid')); +} + if ($action == 'setlib' && $user->rights->tax->charges->creer) { $object->fetch($id); @@ -203,11 +210,9 @@ if ($action == 'update' && ! $_POST["cancel"] && $user->rights->tax->charges->cr { $result=$object->fetch($id); - $object->lib = GETPOST('label'); $object->date_ech = $dateech; $object->periode = $dateperiod; $object->amount = price2num($amount); - $object->fk_project = GETPOST("fk_project"); $result=$object->update($user); if ($result <= 0) @@ -276,6 +281,7 @@ if ($action == 'confirm_clone' && $confirm == 'yes' && ($user->rights->tax->char $form = new Form($db); $formsocialcontrib = new FormSocialContrib($db); +if (! empty($conf->projet->enabled)) { $formproject = new FormProjets($db); } $title = $langs->trans("SocialContribution") . ' - ' . $langs->trans("Card"); $help_url='EN:Module_Taxes_and_social_contributions|FR:Module Taxes et dividendes|ES:Módulo Impuestos y cargas sociales (IVA, impuestos)'; @@ -430,15 +436,47 @@ if ($id > 0) print ''; } - dol_fiche_head($head, 'card', $langs->trans("SocialContribution"),0,'bill'); + dol_fiche_head($head, 'card', $langs->trans("SocialContribution"), -1, 'bill'); $morehtmlref='
'; // Ref customer $morehtmlref.=$form->editfieldkey("Label", 'lib', $object->lib, $object, $user->rights->tax->charges->creer, 'string', '', 0, 1); $morehtmlref.=$form->editfieldval("Label", 'lib', $object->lib, $object, $user->rights->tax->charges->creer, 'string', '', null, null, '', 1); + // Project + if (! empty($conf->projet->enabled)) + { + $langs->load("projects"); + $morehtmlref.='
'.$langs->trans('Project') . ' '; + if ($user->rights->tax->charges->creer) + { + if ($action != 'classify') + $morehtmlref.='
' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : '; + if ($action == 'classify') { + //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1); + $morehtmlref.='
'; + $morehtmlref.=''; + $morehtmlref.=''; + $morehtmlref.=$formproject->select_projects(0, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1); + $morehtmlref.=''; + $morehtmlref.=''; + } else { + $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1); + } + } else { + if (! empty($object->fk_project)) { + $proj = new Project($db); + $proj->fetch($object->fk_project); + $morehtmlref.=''; + $morehtmlref.=$proj->ref; + $morehtmlref.=''; + } else { + $morehtmlref.=''; + } + } + } $morehtmlref.='
'; - $linkback = '' . $langs->trans("BackToList") . ''; + $linkback = '' . $langs->trans("BackToList") . ''; $object->totalpaye = $totalpaye; // To give a chance to dol_banner_tab to use already paid amount to show correct status @@ -449,25 +487,6 @@ if ($id > 0) print '
'; print '
'.$langs->trans('Margins').'
'.$langs->trans('MarginOnProducts').''.price($marginInfo['pv_products'], null, null, null, null, $rounding).''.price($marginInfo['pa_products'], null, null, null, null, $rounding).'
'.$langs->trans('MarginOnServices').''.price($marginInfo['pv_services'], null, null, null, null, $rounding).''.price($marginInfo['pa_services'], null, null, null, null, $rounding).'
'; - - /* - // Ref - print '"; - */ - - // Label - /*if ($action == 'edit') - { - print ''; - } - else - { - print ''; - }*/ // Type print '"; @@ -508,22 +527,6 @@ if ($id > 0) print ''; } - // Project - if (! empty($conf->projet->enabled)){ - print ''; - } - // Mode of payment print ''; + + print "
'.$langs->trans("Ref").''; - print $form->showrefnav($object,'id',$linkback); - print "
'.$langs->trans("Label").''; - print ''; - print '
'.$langs->trans("Label").''.$object->lib.'
'.$langs->trans("Type")."".$object->type_libelle."
'.$langs->trans("AmountTTC").''.price($object->amount,0,$outputlangs,1,-1,-1,$conf->currency).'
'; - print $langs->trans("Project"); - print ''; - if ($action == 'edit') { - $formproject=new FormProjets($db); - $numproject=$formproject->select_projects(-1,$object->fk_project,'fk_project',16,0,1,1); - } else { - $project=new Project($db); - $project->fetch($object->fk_project); - print $project->getNomUrl(1,'',1);; - } - print '
'; print ''; @@ -687,7 +711,7 @@ if ($resql) if (! empty($arrayfields['f.date_lim_reglement']['checked'])) { print ''; } // Town - if (! empty($arrayfields['s.town']['checked'])) print ''; + if (! empty($arrayfields['s.town']['checked'])) print ''; // Zip - if (! empty($arrayfields['s.zip']['checked'])) print ''; + if (! empty($arrayfields['s.zip']['checked'])) print ''; // State if (! empty($arrayfields['state.nom']['checked'])) { @@ -739,14 +763,14 @@ if ($resql) { // Amount print ''; } if (! empty($arrayfields['f.total_vat']['checked'])) { // Amount print ''; } if (! empty($arrayfields['f.total_localtax1']['checked'])) @@ -767,9 +791,19 @@ if ($resql) { // Amount print ''; } + if (! empty($arrayfields['dynamount_payed']['checked'])) + { + print ''; + } + if (! empty($arrayfields['rtp']['checked'])) + { + print ''; + } // Extra fields if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) { @@ -819,7 +853,7 @@ if ($resql) } // Action column print ''; @@ -844,6 +878,8 @@ if ($resql) if (! empty($arrayfields['f.total_localtax1']['checked'])) print_liste_field_titre($arrayfields['f.total_localtax1']['label'],$_SERVER['PHP_SELF'],'f.localtax1','',$param,'align="right"',$sortfield,$sortorder); if (! empty($arrayfields['f.total_localtax2']['checked'])) print_liste_field_titre($arrayfields['f.total_localtax2']['label'],$_SERVER['PHP_SELF'],'f.localtax2','',$param,'align="right"',$sortfield,$sortorder); if (! empty($arrayfields['f.total_ttc']['checked'])) print_liste_field_titre($arrayfields['f.total_ttc']['label'],$_SERVER['PHP_SELF'],'f.total_ttc','',$param,'align="right"',$sortfield,$sortorder); + if (! empty($arrayfields['dynamount_payed']['checked'])) print_liste_field_titre($arrayfields['dynamount_payed']['label'],$_SERVER['PHP_SELF'],'','',$param,'align="right"',$sortfield,$sortorder); + if (! empty($arrayfields['rtp']['checked'])) print_liste_field_titre($arrayfields['rtp']['label'],$_SERVER['PHP_SELF'],'','',$param,'align="right"',$sortfield,$sortorder); // Extra fields if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) { @@ -880,14 +916,20 @@ if ($resql) { $obj = $db->fetch_object($resql); - $datelimit=$db->jdate($obj->datelimite); $facturestatic->id=$obj->facid; $facturestatic->ref=$obj->ref; + $facturestatic->type=$obj->type; $facturestatic->ref_supplier=$obj->ref_supplier; $facturestatic->date_echeance = $db->jdate($obj->datelimite); $facturestatic->statut = $obj->fk_statut; - + + $paiement = $facturestatic->getSommePaiement(); + $totalcreditnotes = $facturestatic->getSumCreditNotesUsed(); + $totaldeposits = $facturestatic->getSumDepositsUsed(); + $totalpay = $paiement + $totalcreditnotes + $totaldeposits; + $remaintopay = $obj->total_ttc - $totalpay; + print ''; if (! empty($arrayfields['f.ref']['checked'])) { @@ -969,7 +1011,7 @@ if ($resql) // Third party if (! empty($arrayfields['s.nom']['checked'])) { - print ''; + print ''; // TODO Use a denormalized field if (! $i) $totalarray['nbfield']++; if (! $i) $totalarray['totalamfield']=$totalarray['nbfield']; - $totalarray['totalam'] += $paiement; + $totalarray['totalam'] += $totalpay; } if (! empty($arrayfields['rtp']['checked'])) { - print ''; + print ''; // TODO Use a denormalized field if (! $i) $totalarray['nbfield']++; if (! $i) $totalarray['totalrtpfield']=$totalarray['nbfield']; $totalarray['totalrtp'] += $remaintopay; } + // Extra fields if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) { @@ -1135,7 +1178,6 @@ if ($resql) } // Action column - // Action column print '
'; diff --git a/htdocs/compta/sociales/document.php b/htdocs/compta/sociales/document.php index 95c72cbedb2..ce2f853c935 100644 --- a/htdocs/compta/sociales/document.php +++ b/htdocs/compta/sociales/document.php @@ -33,6 +33,11 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/tax.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; +if (! empty($conf->projet->enabled)) +{ + require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; + require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; +} $langs->load("other"); $langs->load("companies"); @@ -88,6 +93,7 @@ if ($action == 'setlib' && $user->rights->tax->charges->creer) */ $form = new Form($db); +if (! empty($conf->projet->enabled)) { $formproject = new FormProjets($db); } $title = $langs->trans("SocialContribution") . ' - ' . $langs->trans("Documents"); $help_url='EN:Module_Taxes_and_social_contributions|FR:Module Taxes et dividendes|ES:Módulo Impuestos y cargas sociales (IVA, impuestos)'; @@ -105,9 +111,24 @@ if ($object->id) // Label of social contribution $morehtmlref.=$form->editfieldkey("Label", 'lib', $object->lib, $object, $user->rights->tax->charges->creer, 'string', '', 0, 1); $morehtmlref.=$form->editfieldval("Label", 'lib', $object->lib, $object, $user->rights->tax->charges->creer, 'string', '', null, null, '', 1); + // Project + if (! empty($conf->projet->enabled)) + { + $langs->load("projects"); + $morehtmlref.='
'.$langs->trans('Project') . ' : '; + if (! empty($object->fk_project)) { + $proj = new Project($db); + $proj->fetch($object->fk_project); + $morehtmlref.=''; + $morehtmlref.=$proj->ref; + $morehtmlref.=''; + } else { + $morehtmlref.=''; + } + } $morehtmlref.=''; - $linkback = '' . $langs->trans("BackToList") . ''; + $linkback = '' . $langs->trans("BackToList") . ''; $object->totalpaye = $totalpaye; // To give a chance to dol_banner_tab to use already paid amount to show correct status diff --git a/htdocs/compta/sociales/index.php b/htdocs/compta/sociales/index.php index 50e14823a5f..194c3f38d99 100644 --- a/htdocs/compta/sociales/index.php +++ b/htdocs/compta/sociales/index.php @@ -152,6 +152,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print ''; if ($year) diff --git a/htdocs/compta/sociales/info.php b/htdocs/compta/sociales/info.php index bbacfafd430..91334134a2c 100644 --- a/htdocs/compta/sociales/info.php +++ b/htdocs/compta/sociales/info.php @@ -25,6 +25,11 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/tax.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; +if (! empty($conf->projet->enabled)) +{ + require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; + require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; +} $langs->load("compta"); $langs->load("bills"); @@ -37,6 +42,7 @@ $socid = GETPOST('socid','int'); if ($user->societe_id) $socid=$user->societe_id; $result = restrictedArea($user, 'tax', $id, 'chargesociales','charges'); + /* * Actions */ @@ -49,9 +55,13 @@ if ($action == 'setlib' && $user->rights->tax->charges->creer) setEventMessages($object->error, $object->errors, 'errors'); } + /* * View */ + +if (! empty($conf->projet->enabled)) { $formproject = new FormProjets($db); } + $title = $langs->trans("SocialContribution") . ' - ' . $langs->trans("Info"); $help_url = 'EN:Module_Taxes_and_social_contributions|FR:Module Taxes et dividendes|ES:Módulo Impuestos y cargas sociales (IVA, impuestos)'; llxHeader("",$title,$help_url); @@ -68,9 +78,24 @@ $morehtmlref='
'; // Label of social contribution $morehtmlref.=$form->editfieldkey("Label", 'lib', $object->lib, $object, $user->rights->tax->charges->creer, 'string', '', 0, 1); $morehtmlref.=$form->editfieldval("Label", 'lib', $object->lib, $object, $user->rights->tax->charges->creer, 'string', '', null, null, '', 1); +// Project +if (! empty($conf->projet->enabled)) +{ + $langs->load("projects"); + $morehtmlref.='
'.$langs->trans('Project') . ' : '; + if (! empty($object->fk_project)) { + $proj = new Project($db); + $proj->fetch($object->fk_project); + $morehtmlref.=''; + $morehtmlref.=$proj->ref; + $morehtmlref.=''; + } else { + $morehtmlref.=''; + } +} $morehtmlref.='
'; -$linkback = '' . $langs->trans("BackToList") . ''; +$linkback = '' . $langs->trans("BackToList") . ''; $object->totalpaye = $totalpaye; // To give a chance to dol_banner_tab to use already paid amount to show correct status diff --git a/htdocs/compta/sociales/payments.php b/htdocs/compta/sociales/payments.php index eda1633480a..ae7240c204a 100644 --- a/htdocs/compta/sociales/payments.php +++ b/htdocs/compta/sociales/payments.php @@ -85,6 +85,7 @@ print ''; print ''; print ''; print ''; +print ''; print ''; if ($mode != 'sconly') diff --git a/htdocs/compta/tva/reglement.php b/htdocs/compta/tva/reglement.php index 94895062bc3..076978a86fb 100644 --- a/htdocs/compta/tva/reglement.php +++ b/htdocs/compta/tva/reglement.php @@ -154,6 +154,7 @@ if ($result) print ''; print ''; print ''; + print ''; print_barre_liste($langs->trans("VATPayments"),$page,$_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num,$totalnboflines, 'title_accountancy', 0, '', '', $limit); diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index 929dbdc91e8..fc601cf8a53 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -433,6 +433,7 @@ print ''; print ''; print ''; +print ''; print_barre_liste($titre, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_companies.png', 0, '', '', $limit); diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php index 318a24931be..43cce90bd1c 100644 --- a/htdocs/contrat/list.php +++ b/htdocs/contrat/list.php @@ -340,6 +340,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print_barre_liste($langs->trans("ListOfContracts"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $totalnboflines, 'title_commercial.png', 0, '', '', $limit); diff --git a/htdocs/contrat/services.php b/htdocs/contrat/services.php index f283502bc3e..adac837f3e0 100644 --- a/htdocs/contrat/services.php +++ b/htdocs/contrat/services.php @@ -308,6 +308,7 @@ print ''; print ''; print ''; +print ''; $title=$langs->trans("ListOfServices"); if ($mode == "0") $title=$langs->trans("ListOfInactiveServices"); // Must use == "0" diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php index 3fef1265f9d..2fa2599e4d3 100644 --- a/htdocs/core/lib/company.lib.php +++ b/htdocs/core/lib/company.lib.php @@ -698,6 +698,7 @@ function show_contacts($conf,$langs,$db,$object,$backtopage='') $sortfield = GETPOST("sortfield",'alpha'); $sortorder = GETPOST("sortorder",'alpha'); + $page = GETPOST('page','int'); $search_status = GETPOST("search_status",'int'); if ($search_status=='') $search_status=1; // always display activ customer first $search_name = GETPOST("search_name",'alpha'); @@ -733,7 +734,8 @@ function show_contacts($conf,$langs,$db,$object,$backtopage='') print ''; print ''; print ''; - + print ''; + print "\n".''."\n"; $param="socid=".$object->id; diff --git a/htdocs/cron/list.php b/htdocs/cron/list.php index 2eff05868d4..95338247eca 100644 --- a/htdocs/cron/list.php +++ b/htdocs/cron/list.php @@ -273,6 +273,7 @@ print ''; print ''; print ''; print ''; +print ''; print ''; // Line with explanation and button new job diff --git a/htdocs/don/list.php b/htdocs/don/list.php index b0cd414ed28..daa6f7aa1f2 100644 --- a/htdocs/don/list.php +++ b/htdocs/don/list.php @@ -149,6 +149,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print ''; if ($search_all) diff --git a/htdocs/expedition/list.php b/htdocs/expedition/list.php index 50454e3f253..c838c002cc9 100644 --- a/htdocs/expedition/list.php +++ b/htdocs/expedition/list.php @@ -280,6 +280,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print ''; print ''; diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index 06998059aa5..f95952db482 100644 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -314,6 +314,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print ''; print ''; diff --git a/htdocs/fichinter/list.php b/htdocs/fichinter/list.php index 9963794fd9f..9271a348558 100644 --- a/htdocs/fichinter/list.php +++ b/htdocs/fichinter/list.php @@ -288,6 +288,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print ''; print ''; print ''; diff --git a/htdocs/fourn/commande/list.php b/htdocs/fourn/commande/list.php index 8ca86a1e6c5..544d882cda3 100644 --- a/htdocs/fourn/commande/list.php +++ b/htdocs/fourn/commande/list.php @@ -677,6 +677,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print ''; print ''; print ''; diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index 9ad1bf63ce2..e449ed83371 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -453,6 +453,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print ''; print ''; print ''; diff --git a/htdocs/fourn/facture/paiement.php b/htdocs/fourn/facture/paiement.php index b6825e93d82..10851e629e3 100644 --- a/htdocs/fourn/facture/paiement.php +++ b/htdocs/fourn/facture/paiement.php @@ -679,7 +679,8 @@ if (empty($action)) print ''; print ''; print ''; - + print ''; + $moreforfilter=''; $parameters=array(); diff --git a/htdocs/fourn/product/list.php b/htdocs/fourn/product/list.php index 94302eca4be..ca874511c94 100644 --- a/htdocs/fourn/product/list.php +++ b/htdocs/fourn/product/list.php @@ -170,6 +170,7 @@ if ($resql) if ($fourn_id > 0) print ''; print ''; print ''; + print ''; print ''; print '
'; diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index 063c3042e3b..30d3dc14f69 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -282,6 +282,7 @@ print ''; print ''; print ''; print ''; +print ''; if ($id > 0) print ''; if ($sall) diff --git a/htdocs/loan/index.php b/htdocs/loan/index.php index fdc8cf67073..b04d3bd90b3 100644 --- a/htdocs/loan/index.php +++ b/htdocs/loan/index.php @@ -117,6 +117,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print ''; print_barre_liste($langs->trans("Loans"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_accountancy.png', 0, '', '', $limit); diff --git a/htdocs/modulebuilder/skeletons/skeleton_list.php b/htdocs/modulebuilder/skeletons/skeleton_list.php index 205fcf4be8c..9c258162759 100644 --- a/htdocs/modulebuilder/skeletons/skeleton_list.php +++ b/htdocs/modulebuilder/skeletons/skeleton_list.php @@ -307,6 +307,7 @@ print ''; print ''; print ''; +print ''; print ''; print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_companies', 0, '', '', $limit); diff --git a/htdocs/opensurvey/list.php b/htdocs/opensurvey/list.php index 636611f91f0..510a0545372 100644 --- a/htdocs/opensurvey/list.php +++ b/htdocs/opensurvey/list.php @@ -89,6 +89,7 @@ print ''; print ''; print ''; print ''; +print ''; $moreforfilter = ''; diff --git a/htdocs/product/list-with-listview.php b/htdocs/product/list-with-listview.php index e3103d8f426..1ebbf256c9c 100644 --- a/htdocs/product/list-with-listview.php +++ b/htdocs/product/list-with-listview.php @@ -689,6 +689,7 @@ else print ''; print ''; print ''; + print ''; print ''; echo $listHTML; diff --git a/htdocs/product/list.php b/htdocs/product/list.php index c957606b66a..7e6ae9b47f4 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -429,6 +429,7 @@ else print ''; print ''; print ''; + print ''; print ''; print_barre_liste($texte, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_products.png', 0, '', '', $limit); diff --git a/htdocs/product/reassort.php b/htdocs/product/reassort.php index a87fecd36b7..e460bbec7c5 100644 --- a/htdocs/product/reassort.php +++ b/htdocs/product/reassort.php @@ -189,6 +189,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print ''; if ($sref || $snom || $sall || GETPOST('search')) diff --git a/htdocs/product/reassortlot.php b/htdocs/product/reassortlot.php index 660d0e78bd3..6ab18ac87cb 100644 --- a/htdocs/product/reassortlot.php +++ b/htdocs/product/reassortlot.php @@ -200,6 +200,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print ''; if ($sref || $snom || $sall || GETPOST('search')) diff --git a/htdocs/product/stock/list.php b/htdocs/product/stock/list.php index b3361f0b328..eefbe3deee9 100644 --- a/htdocs/product/stock/list.php +++ b/htdocs/product/stock/list.php @@ -135,7 +135,8 @@ if ($result) print ''; print ''; print ''; - + print ''; + print_barre_liste($langs->trans("ListOfWarehouses"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $totalnboflines, 'title_generic.png', 0, '', '', $limit); if ($sall) diff --git a/htdocs/product/stock/mouvement.php b/htdocs/product/stock/mouvement.php index 506ee68e42b..5f0f9c213dc 100644 --- a/htdocs/product/stock/mouvement.php +++ b/htdocs/product/stock/mouvement.php @@ -695,6 +695,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print ''; print ''; if ($id > 0) print ''; diff --git a/htdocs/product/stock/productlot_list.php b/htdocs/product/stock/productlot_list.php index df97621c07b..78d3c470cb1 100644 --- a/htdocs/product/stock/productlot_list.php +++ b/htdocs/product/stock/productlot_list.php @@ -309,6 +309,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_companies', 0, '', '', $limit); diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index cbf036ef7e3..6230626a320 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -416,6 +416,7 @@ print ''; print ''; print ''; +print ''; print ''; print ''; diff --git a/htdocs/projet/tasks.php b/htdocs/projet/tasks.php index 85fa0f640e9..064281633c8 100644 --- a/htdocs/projet/tasks.php +++ b/htdocs/projet/tasks.php @@ -468,6 +468,7 @@ else if ($id > 0 || ! empty($ref)) print ''; print ''; print ''; + print ''; print ''; $title=$langs->trans("ListOfTasks"); diff --git a/htdocs/projet/tasks/list.php b/htdocs/projet/tasks/list.php index 8c9f56f1d94..1f2459e85db 100644 --- a/htdocs/projet/tasks/list.php +++ b/htdocs/projet/tasks/list.php @@ -412,6 +412,7 @@ print ''; print ''; print ''; print ''; +print ''; print ''; print ''; diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index ddbd59ed11f..cbdfece9d45 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -707,7 +707,8 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) else print ''; print ''; print ''; - + print ''; + print ''; print ''; print ''; diff --git a/htdocs/resource/list.php b/htdocs/resource/list.php index c0b58523994..f8a1fb6be61 100644 --- a/htdocs/resource/list.php +++ b/htdocs/resource/list.php @@ -187,6 +187,7 @@ print ''; print ''; print ''; +print ''; print ''; $moreforfilter = ''; diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index 4670036d70b..40ca07783c4 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -547,6 +547,7 @@ print ''; print ''; print ''; print ''; +print ''; print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_companies', 0, '', '', $limit); diff --git a/htdocs/societe/notify/card.php b/htdocs/societe/notify/card.php index b17ea678853..7e7648db712 100644 --- a/htdocs/societe/notify/card.php +++ b/htdocs/societe/notify/card.php @@ -454,6 +454,7 @@ if ($result > 0) print ''; print ''; print ''; + print ''; print ''; // List of active notifications diff --git a/htdocs/supplier_proposal/list.php b/htdocs/supplier_proposal/list.php index c5f994f8a10..2c10e2451a6 100644 --- a/htdocs/supplier_proposal/list.php +++ b/htdocs/supplier_proposal/list.php @@ -410,6 +410,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_commercial.png', 0, '', '', $limit); diff --git a/htdocs/user/group/index.php b/htdocs/user/group/index.php index 6956a1ad5eb..38fdf68b2ba 100644 --- a/htdocs/user/group/index.php +++ b/htdocs/user/group/index.php @@ -131,6 +131,7 @@ if ($resql) print ''; print ''; print ''; + print ''; print ''; print ''; diff --git a/htdocs/user/index.php b/htdocs/user/index.php index 04acb9b56f7..4cec562ce44 100644 --- a/htdocs/user/index.php +++ b/htdocs/user/index.php @@ -296,6 +296,7 @@ print ''; print ''; print ''; print ''; +print ''; print ''; print ''; diff --git a/htdocs/user/notify/card.php b/htdocs/user/notify/card.php index 3c186ac3cae..e39d8153cac 100644 --- a/htdocs/user/notify/card.php +++ b/htdocs/user/notify/card.php @@ -435,6 +435,7 @@ if ($result > 0) print ''; print ''; print ''; + print ''; print ''; // List of notifications done From 5992175b687e7a7b226951269eb24cc4bbe10ea1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 21 May 2017 03:23:44 +0200 Subject: [PATCH 207/299] Standardize code between customer and supplier invoice list. --- htdocs/compta/facture/list.php | 33 ++++++-- htdocs/core/lib/functions.lib.php | 2 +- htdocs/fourn/facture/list.php | 124 ++++++++++++++++++++++-------- 3 files changed, 119 insertions(+), 40 deletions(-) diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index 10b11812b1a..1ab17765d8f 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -536,7 +536,7 @@ if ($resql) $param='&socid='.$socid; if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage; if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit; - if ($sall) $param.='&sall='.$sall; + if ($sall) $param.='&sall='.urlencode($sall); if ($day) $param.='&day='.urlencode($day); if ($month) $param.='&month='.urlencode($month); if ($year) $param.='&year=' .urlencode($year); @@ -760,14 +760,14 @@ if ($resql) // Filters lines print ''; // Ref - if (! empty($arrayfields['f.facnumber']['checked'])) + if (! empty($arrayfields['f.facnumber']['checked'])) { print ''; } // Ref customer - if (! empty($arrayfields['f.ref_client']['checked'])) + if (! empty($arrayfields['f.ref_client']['checked'])) { print ''; } + // Project + if (! empty($arrayfields['p.ref']['checked'])) + { + print ''; + } // Thirpdarty if (! empty($arrayfields['s.nom']['checked'])) { @@ -1016,7 +1021,7 @@ if ($resql) print ''; print ''; + if (! $i) $totalarray['nbfield']++; + } + // Third party if (! empty($arrayfields['s.nom']['checked'])) { @@ -1295,15 +1314,13 @@ if ($resql) print $hookmanager->resPrint; print "
'; print ''; print ''; print ''; @@ -806,6 +806,11 @@ if ($resql) print '
'.$langs->trans("Late"); print '
'; print $facturestatic->getNomUrl(1,'',200,0,'',0,1); - print $obj->increment; + print empty($obj->increment)?'':' ('.$obj->increment.')'; print ''; @@ -1071,6 +1076,20 @@ if ($resql) if (! $i) $totalarray['nbfield']++; } + // Project + if (! empty($arrayfields['p.ref']['checked'])) + { + print ''; + if ($obj->project_id > 0) + { + $projectstatic->id=$obj->project_id; + $projectstatic->ref=$obj->project_ref; + print $projectstatic->getNomUrl(1); + } + print '
\n"; - print ""; + print ''; print "\n"; if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) { - /* - * Show list of available documents - */ + // Show list of available documents $urlsource=$_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder; $urlsource.=str_replace('&','&',$param); diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index b6365a23b9a..14f61d99590 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -105,7 +105,7 @@ function getDoliDBInstance($type, $host, $user, $pass, $name, $port) * @param string $element Current element * 'societe', 'socpeople', 'actioncomm', 'agenda', 'resource', * 'product', 'productprice', 'stock', - * 'propal', 'facture', 'facture_fourn', + * 'propal', 'supplier_proposal', 'facture', 'facture_fourn', * 'categorie', 'bank_account', 'bank_account', 'adherent', 'user', * 'commande', 'commande_fournisseur', 'expedition', 'intervention', 'survey', * 'contract', 'tax', 'expensereport', 'holiday', 'multicurrency', 'project', diff --git a/htdocs/fourn/facture/list.php b/htdocs/fourn/facture/list.php index e449ed83371..0918423908e 100644 --- a/htdocs/fourn/facture/list.php +++ b/htdocs/fourn/facture/list.php @@ -163,6 +163,8 @@ $arrayfields=array( 'f.total_localtax1'=>array('label'=>$langs->transcountry("AmountLT1", $mysoc->country_code), 'checked'=>0, 'enabled'=>$mysoc->localtax1_assuj=="1"), 'f.total_localtax2'=>array('label'=>$langs->transcountry("AmountLT2", $mysoc->country_code), 'checked'=>0, 'enabled'=>$mysoc->localtax2_assuj=="1"), 'f.total_ttc'=>array('label'=>$langs->trans("AmountTTC"), 'checked'=>0), + 'dynamount_payed'=>array('label'=>$langs->trans("Payed"), 'checked'=>0), + 'rtp'=>array('label'=>$langs->trans("Rest"), 'checked'=>0), 'f.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), 'f.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500), 'f.fk_statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000), @@ -263,7 +265,9 @@ $sql.= " s.rowid as socid, s.nom as name, s.town, s.zip, s.fk_pays, s.client, s. $sql.= " typent.code as typent_code,"; $sql.= " state.code_departement as state_code, state.nom as state_name,"; $sql.= " p.rowid as project_id, p.ref as project_ref"; -if (!$user->rights->societe->client->voir && !$socid) $sql .= ", sc.fk_soc, sc.fk_user "; +// We need dynamount_payed to be able to sort on status (value is surely wrong because we can count several lines several times due to other left join or link with contacts. But what we need is just 0 or > 0) +// TODO Better solution to be able to sort on already payed or remain to pay is to store amount_payed in a denormalized field. +if (! $search_all) $sql.= ', SUM(pf.amount) as dynamount_payed'; // Add fields from extrafields foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : ''); // Add fields from hooks @@ -276,6 +280,7 @@ $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_typent as typent on (typent.id = s.fk_typ $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as state on (state.rowid = s.fk_departement)"; $sql.= ', '.MAIN_DB_PREFIX.'facture_fourn as f'; if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."facture_fourn_extrafields as ef on (f.rowid = ef.fk_object)"; +if (! $search_all) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'paiementfourn_facturefourn as pf ON pf.fk_facturefourn = f.rowid'; if ($search_all || $search_product_category > 0) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'facture_fourn_det as pd ON f.rowid=pd.fk_facture_fourn'; if ($search_product_category > 0) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_product as cp ON cp.fk_product=pd.fk_product'; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."projet as p ON p.rowid = f.fk_projet"; @@ -287,14 +292,10 @@ if ($search_user > 0) $sql.=", ".MAIN_DB_PREFIX."c_type_contact as tc"; } $sql.= ' WHERE f.fk_soc = s.rowid'; -$sql.= " AND f.entity = ".$conf->entity; +$sql.= ' AND f.entity IN ('.getEntity('facture_fourn', 1).')'; if (!$user->rights->societe->client->voir && !$socid) $sql .= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; if ($search_product_category > 0) $sql.=" AND cp.fk_categorie = ".$search_product_category; if ($socid > 0) $sql .= ' AND s.rowid = '.$socid; -if ($search_all) -{ - $sql.= natural_search(array_keys($fieldstosearchall), $search_all); -} if ($search_ref) { if (is_numeric($search_ref)) $sql .= natural_search(array('f.ref'), $search_ref); @@ -337,7 +338,7 @@ if ($month_lim > 0) else if ($year_lim > 0 && ! empty($day_lim)) $sql.= " AND f.date_lim_reglement BETWEEN '".$db->idate(dol_mktime(0, 0, 0, $month_lim, $day_lim, $year_lim))."' AND '".$db->idate(dol_mktime(23, 59, 59, $month_lim, $day_lim, $year_lim))."'"; else - $sql.= " AND date_format(f.date_lim_reglement, '%m') = '".$month_lim."'"; + $sql.= " AND date_format(f.date_lim_reglement, '%m') = '".$db->escape($month_lim)."'"; } else if ($year_lim > 0) { @@ -382,6 +383,26 @@ $parameters=array(); $reshook=$hookmanager->executeHooks('printFieldListWhere',$parameters); // Note that $action and $object may have been modified by hook $sql.=$hookmanager->resPrint; +if (! $search_all) +{ + $sql.= " GROUP BY f.rowid, f.ref, f.ref_supplier, f.datef, f.date_lim_reglement, f.fk_mode_reglement,"; + $sql.= " f.total_ht, f.total_ttc, f.total_tva, f.paye, f.fk_statut, f.libelle, f.datec, f.tms,"; + $sql.= " f.localtax1, f.localtax2,"; + $sql.= " s.rowid, s.nom, s.town, s.zip, s.fk_pays, s.client, s.code_client,"; + $sql.= " typent.code,"; + $sql.= " state.code_departement, state.nom,"; + $sql.= " p.rowid, p.ref"; + + foreach ($extrafields->attribute_label as $key => $val) //prevent error with sql_mode=only_full_group_by + { + $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key : ''); + } +} +else +{ + $sql.= natural_search(array_keys($fieldstosearchall), $search_all); +} + $sql.= $db->order($sortfield,$sortorder); $nbtotalofrecords = ''; @@ -410,7 +431,8 @@ if ($resql) $param='&socid='.$socid; if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage; if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit; - if ($day) $param.='&day='.urlencode($day); + if ($search_all) $param.='&search_all='.urlencode($search_all); + if ($day) $param.='&day='.urlencode($day); if ($month) $param.='&month='.urlencode($month); if ($year) $param.='&year=' .urlencode($year); if ($day_lim) $param.='&day_lim='.urlencode($day_lim); @@ -428,6 +450,8 @@ if ($resql) if ($search_amount_no_tax) $param.='&search_amount_no_tax='.urlencode($search_amount_no_tax); if ($search_amount_all_tax) $param.='&search_amount_all_tax='.urlencode($search_amount_all_tax); if ($search_status >= 0) $param.="&search_status=".urlencode($search_status); + if ($show_files) $param.='&show_files=' .$show_files; + if ($option) $param.="&option=".$option; if ($optioncss != '') $param.='&optioncss='.$optioncss; // Add $param from extra fields foreach ($search_array_options as $key => $val) @@ -453,13 +477,13 @@ if ($resql) print ''; print ''; print ''; - print ''; print ''; print ''; + print ''; print ''; print ''; - print_barre_liste($langs->trans("BillsSuppliers").($socid?" - $soc->name":""), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit); + print_barre_liste($langs->trans("BillsSuppliers").($socid?' '.$soc->name:''), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit); if ($massaction == 'presend') { @@ -467,7 +491,7 @@ if ($resql) if (! GETPOST('cancel')) { - $objecttmp=new Commande($db); + $objecttmp=new FactureFourn($db); $listofselectedid=array(); $listofselectedthirdparties=array(); $listofselectedref=array(); @@ -491,8 +515,8 @@ if ($resql) dol_fiche_head(null, '', ''); - $topicmail="SendOrderRef"; - $modelmail="order_send"; + $topicmail="SendBillRef"; + $modelmail="supplier_invoice_send"; // Cree l'objet formulaire mail include_once DOL_DOCUMENT_ROOT.'/core/class/html.formmail.class.php'; @@ -506,12 +530,12 @@ if ($resql) } if (! empty($conf->global->MAIN_EMAIL_ADD_TRACK_ID) && ($conf->global->MAIN_EMAIL_ADD_TRACK_ID & 1)) // If bit 1 is set { - $formmail->trackid='ord'.$object->id; + $formmail->trackid='sinv'.$object->id; } if (! empty($conf->global->MAIN_EMAIL_ADD_TRACK_ID) && ($conf->global->MAIN_EMAIL_ADD_TRACK_ID & 2)) // If bit 2 is set { include DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; - $formmail->frommail=dolAddEmailTrackId($formmail->frommail, 'ord'.$object->id); + $formmail->frommail=dolAddEmailTrackId($formmail->frommail, 'sinv'.$object->id); } $formmail->withfrom=1; $liste=$langs->trans("AllRecipientSelected"); @@ -678,7 +702,7 @@ if ($resql) if (! empty($arrayfields['f.datef']['checked'])) { print '
'; - if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; + if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; print ''; $formother->select_year($year?$year:-1,'year',1, 20, 5); print ''; - if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; + if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; print ''; $formother->select_year($year_lim?$year_lim:-1,'year_lim',1, 20, 5); print '
'.$langs->trans("Late"); @@ -704,9 +728,9 @@ if ($resql) print '
'; - print ''; + print ''; print ''; - print ''; + print ''; print ''; - print ''; + print ''; print ''; + print ''; + print ''; - $searchpicto=$form->showFilterButtons('checkforselect', 0); + $searchpicto=$form->showFilterButtons(); print $searchpicto; print '
'; + print ''; $thirdparty=new Societe($db); $thirdparty->id=$obj->socid; $thirdparty->name=$obj->name; @@ -1070,22 +1112,23 @@ if ($resql) $totalarray['totalttc'] += $obj->total_ttc; } - if (! empty($arrayfields['am']['checked'])) + if (! empty($arrayfields['dynamount_payed']['checked'])) { - print ''.(! empty($paiement)?price($paiement,0,$langs):' ').''.(! empty($totalpay)?price($totalpay,0,$langs):' ').''.(! empty($remaintopay)?price($remaintopay,0,$langs):' ').''.(! empty($remaintopay)?price($remaintopay,0,$langs):' ').''; if ($massactionbutton || $massaction) // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined { @@ -1193,7 +1235,27 @@ if ($resql) print "
\n"; print ''; + print "\n"; + + /* + if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) + { + // Show list of available documents + $urlsource=$_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder; + $urlsource.=str_replace('&','&',$param); + + $filedir=$diroutputmassaction; + $genallowed=$user->rights->facture->lire; + $delallowed=$user->rights->facture->lire; + + print $formfile->showdocuments('massfilesarea_invoices','',$filedir,$urlsource,0,$delallowed,'',1,1,0,48,1,$param,$title,''); + } + else + { + print '
'.$langs->trans("ShowTempMassFilesArea").''; + } + */ } else { From 52b5a8ece787e4d0c6d5ae893819777fdfe4368a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 21 May 2017 14:06:43 +0200 Subject: [PATCH 208/299] More powerfull dol_move function. --- htdocs/api/class/api_documents.class.php | 26 +-- htdocs/core/class/antivir.class.php | 7 + htdocs/core/lib/files.lib.php | 216 ++++++++++++++--------- test/phpunit/RestAPIDocumentTest.php | 2 +- 4 files changed, 160 insertions(+), 91 deletions(-) diff --git a/htdocs/api/class/api_documents.class.php b/htdocs/api/class/api_documents.class.php index 18ccee58b07..9794dad4a12 100644 --- a/htdocs/api/class/api_documents.class.php +++ b/htdocs/api/class/api_documents.class.php @@ -65,8 +65,8 @@ class Documents extends DolibarrApi /** * Push a file. - * Test sample 1: { "filename": "mynewfile.txt", "modulepart": "facture", "ref": "FA1701-001", "subdir": "", "filecontent": "content text", "fileencoding": "" }. - * Test sample 2: { "filename": "mynewfile.txt", "modulepart": "medias", "ref": "", "subdir": "mysubdir1/mysubdir2", "filecontent": "content text", "fileencoding": "" }. + * Test sample 1: { "filename": "mynewfile.txt", "modulepart": "facture", "ref": "FA1701-001", "subdir": "", "filecontent": "content text", "fileencoding": "", "overwriteifexists": "0" }. + * Test sample 2: { "filename": "mynewfile.txt", "modulepart": "medias", "ref": "", "subdir": "mysubdir1/mysubdir2", "filecontent": "content text", "fileencoding": "", "overwriteifexists": "0" }. * * @param string $filename Name of file to create ('FA1705-0123') * @param string $modulepart Name of module or area concerned by file upload ('facture', ...) @@ -74,10 +74,12 @@ class Documents extends DolibarrApi * @param string $subdir Subdirectory (Only if ref not provided) * @param string $filecontent File content (string with file content. An empty file will be created if this parameter is not provided) * @param string $fileencoding File encoding (''=no encoding, 'base64'=Base 64) + * @param int $overwriteifexists Overwrite file if exists (1 by default) * @return bool State of copy * @throws RestException */ - public function post($filename, $modulepart, $ref='', $subdir='', $filecontent='', $fileencoding='') { + public function post($filename, $modulepart, $ref='', $subdir='', $filecontent='', $fileencoding='', $overwriteifexists=0) + { global $db, $conf; /*var_dump($modulepart); @@ -138,30 +140,34 @@ class Documents extends DolibarrApi $upload_dir = dol_sanitizePathName($upload_dir); - $destfile = $upload_dir . '/' . $original_file; - + $destfile = $upload_dir . '/' . $original_file; + $destfiletmp = DOL_DATA_ROOT.'/admin/temp/' . $original_file; + dol_delete_file($destfiletmp); + if (!dol_is_dir($upload_dir)) { throw new RestException(401,'Directory not exists : '.$upload_dir); } - if (dol_is_file($destfile)) + if (! $overwriteifexists && dol_is_file($destfile)) { throw new RestException(500, "File with name '".$original_file."' already exists."); } - $fhandle = fopen($destfile, 'w'); + $fhandle = @fopen($destfiletmp, 'w'); if ($fhandle) { $nbofbyteswrote = fwrite($fhandle, $newfilecontent); fclose($fhandle); - @chmod($destfile, octdec($conf->global->MAIN_UMASK)); + @chmod($destfiletmp, octdec($conf->global->MAIN_UMASK)); } else { - throw new RestException(500, 'Failed to open file for write'); + throw new RestException(500, "Failed to open file '".$destfiletmp."' for write"); } - return true; + $result = dol_move($destfiletmp, $destfile, 0, $overwriteifexists, 1); + + return $result; } /** diff --git a/htdocs/core/class/antivir.class.php b/htdocs/core/class/antivir.class.php index d7f765fa510..357f184eea8 100644 --- a/htdocs/core/class/antivir.class.php +++ b/htdocs/core/class/antivir.class.php @@ -49,6 +49,7 @@ class AntiVir /** * Scan a file with antivirus. * This function runs the command defined in setup. This antivirus command must return 0 if OK. + * Return also true (virus found) if file end with '.virus' (so we can make test safely). * * @param string $file File to scan * @return int <0 if KO (-98 if error, -99 if virus), 0 if OK @@ -59,6 +60,12 @@ class AntiVir $return = 0; + if (preg_match('/\.virus$/i', $file)) + { + $this->errors='File has an extension saying file is a virus'; + return -97; + } + $fullcommand=$this->getCliCommand($file); //$fullcommand='"c:\Program Files (x86)\ClamWin\bin\clamscan.exe" --database="C:\Program Files (x86)\ClamWin\lib" "c:\temp\aaa.txt"'; $fullcommand.=' 2>&1'; // This is to get error output diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 437811d8e98..008f4c15e3c 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -648,15 +648,19 @@ function dolCopyDir($srcfile, $destfile, $newmask, $overwriteifexists) /** * Move a file into another name. - * This function differs from dol_move_uploaded_file, because it can be called in any context. + * Note: + * - This function differs from dol_move_uploaded_file, because it can be called in any context. + * - Database of files is updated. + * - Test on antivirus is done only if param testvirus is provided and an antivirus was set. * * @param string $srcfile Source file (can't be a directory. use native php @rename() to move a directory) * @param string $destfile Destination file (can't be a directory. use native php @rename() to move a directory) * @param integer $newmask Mask in octal string for new file (0 by default means $conf->global->MAIN_UMASK) * @param int $overwriteifexists Overwrite file if exists (1 by default) * @return boolean True if OK, false if KO + * @see dol_move_uploaded_file */ -function dol_move($srcfile, $destfile, $newmask=0, $overwriteifexists=1) +function dol_move($srcfile, $destfile, $newmask=0, $overwriteifexists=1, $testvirus=0) { global $user, $db, $conf; $result=false; @@ -676,6 +680,18 @@ function dol_move($srcfile, $destfile, $newmask=0, $overwriteifexists=1) $newpathofsrcfile=dol_osencode($srcfile); $newpathofdestfile=dol_osencode($destfile); + // Check virus + $testvirusarray=array(); + if ($testvirus) + { + $testvirusarray=dolCheckVirus($newpathofsrcfile); + if (count($testvirusarray)) + { + dol_syslog("files.lib.php::dol_move canceled because a virus was found into source file. we ignore the move request.", LOG_WARNING); + return false; + } + } + $result=@rename($newpathofsrcfile, $newpathofdestfile); // To see errors, remove @ if (! $result) { @@ -703,9 +719,17 @@ function dol_move($srcfile, $destfile, $newmask=0, $overwriteifexists=1) dol_syslog("Try to rename also entries in database for full relative path before = ".$rel_filetorenamebefore." after = ".$rel_filetorenameafter, LOG_DEBUG); include_once DOL_DOCUMENT_ROOT.'/ecm/class/ecmfiles.class.php'; + + $ecmfiletarget=new EcmFiles($db); + $resultecmtarget = $ecmfiletarget->fetch(0, '', $rel_filetorenameafter); + if ($resultecmtarget > 0) // An entry for target name already exists for target, we delete it, a new one will be created. + { + $ecmfiletarget->delete($user); + } + $ecmfile=new EcmFiles($db); - $result = $ecmfile->fetch(0, '', $rel_filetorenamebefore); - if ($result > 0) // If found + $resultecm = $ecmfile->fetch(0, '', $rel_filetorenamebefore); + if ($resultecm > 0) // If an entry was found for src file, we use it to move entry { $filename = basename($rel_filetorenameafter); $rel_dir = dirname($rel_filetorenameafter); @@ -714,9 +738,9 @@ function dol_move($srcfile, $destfile, $newmask=0, $overwriteifexists=1) $ecmfile->filepath = $rel_dir; $ecmfile->filename = $filename; - $result = $ecmfile->update($user); + $resultecm = $ecmfile->update($user); } - elseif ($result == 0) // If not found + elseif ($resultecm == 0) // If no entry were found for src files, create/update target file { $filename = basename($rel_filetorenameafter); $rel_dir = dirname($rel_filetorenameafter); @@ -730,16 +754,19 @@ function dol_move($srcfile, $destfile, $newmask=0, $overwriteifexists=1) $ecmfile->gen_or_uploaded = 'unknown'; $ecmfile->description = ''; // indexed content $ecmfile->keyword = ''; // keyword content - $result = $ecmfile->create($user); - if ($result < 0) + $resultecm = $ecmfile->create($user); + if ($resultecm < 0) { setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings'); - } + } } - elseif ($result < 0) + elseif ($resultecm < 0) { setEventMessages($ecmfile->error, $ecmfile->errors, 'warnings'); } + + if ($resultecm > 0) $result=true; + else $result = false; } } @@ -769,10 +796,41 @@ function dol_unescapefile($filename) return trim(basename($filename), ".\x00..\x20"); } + +/** + * Check virus into a file + * + * @param string $src_file Source file to check + * @return array Array of errors or empty array if not virus found + */ +function dolCheckVirus($src_file) +{ + global $conf; + + if (! empty($conf->global->MAIN_ANTIVIRUS_COMMAND)) + { + if (! class_exists('AntiVir')) { + require_once DOL_DOCUMENT_ROOT.'/core/class/antivir.class.php'; + } + $antivir=new AntiVir($db); + $result = $antivir->dol_avscan_file($src_file); + if ($result < 0) // If virus or error, we stop here + { + $reterrors=$antivir->errors; + return $reterrors; + } + } + return array(); +} + + /** * Make control on an uploaded file from an GUI page and move it to final destination. * If there is errors (virus found, antivir in error, bad filename), file is not moved. - * Note: This function can be used only into a HTML page context. Use dol_move if you are outside. + * Note: + * - This function can be used only into a HTML page context. Use dol_move if you are outside. + * - Database of files is not updated. + * - Test on antivirus is always done (if antivirus set). * * @param string $src_file Source full path filename ($_FILES['field']['tmp_name']) * @param string $dest_file Target full path filename ($_FILES['field']['name']) @@ -794,80 +852,78 @@ function dol_move_uploaded_file($src_file, $dest_file, $allowoverwrite, $disable if (empty($nohook)) { - // If an upload error has been reported - if ($uploaderrorcode) - { - switch($uploaderrorcode) - { - case UPLOAD_ERR_INI_SIZE: // 1 - return 'ErrorFileSizeTooLarge'; - break; - case UPLOAD_ERR_FORM_SIZE: // 2 - return 'ErrorFileSizeTooLarge'; - break; - case UPLOAD_ERR_PARTIAL: // 3 - return 'ErrorPartialFile'; - break; - case UPLOAD_ERR_NO_TMP_DIR: // - return 'ErrorNoTmpDir'; - break; - case UPLOAD_ERR_CANT_WRITE: - return 'ErrorFailedToWriteInDir'; - break; - case UPLOAD_ERR_EXTENSION: - return 'ErrorUploadBlockedByAddon'; - break; - default: - break; - } - } - - // If we need to make a virus scan - if (empty($disablevirusscan) && file_exists($src_file) && ! empty($conf->global->MAIN_ANTIVIRUS_COMMAND)) - { - if (! class_exists('AntiVir')) { - require_once DOL_DOCUMENT_ROOT.'/core/class/antivir.class.php'; - } - $antivir=new AntiVir($db); - $result = $antivir->dol_avscan_file($src_file); - if ($result < 0) // If virus or error, we stop here - { - $reterrors=$antivir->errors; - dol_syslog('Files.lib::dol_move_uploaded_file File "'.$src_file.'" (target name "'.$dest_file.'") KO with antivirus: result='.$result.' errors='.join(',',$antivir->errors), LOG_WARNING); - return 'ErrorFileIsInfectedWithAVirus: '.join(',',$reterrors); - } - } - - // Security: - // Disallow file with some extensions. We renamed them. - // Car si on a mis le rep documents dans un rep de la racine web (pas bien), cela permet d'executer du code a la demande. - if (preg_match('/\.htm|\.html|\.php|\.pl|\.cgi$/i',$dest_file) && empty($conf->global->MAIN_DOCUMENT_IS_OUTSIDE_WEBROOT_SO_NOEXE_NOT_REQUIRED)) - { - $file_name.= '.noexe'; - } - - // Security: - // We refuse cache files/dirs, upload using .. and pipes into filenames. - if (preg_match('/^\./',$src_file) || preg_match('/\.\./',$src_file) || preg_match('/[<>|]/',$src_file)) - { - dol_syslog("Refused to deliver file ".$src_file, LOG_WARNING); - return -1; - } - - // Security: - // On interdit fichiers caches, remontees de repertoire ainsi que les pipe dans les noms de fichiers. - if (preg_match('/^\./',$dest_file) || preg_match('/\.\./',$dest_file) || preg_match('/[<>|]/',$dest_file)) - { - dol_syslog("Refused to deliver file ".$dest_file, LOG_WARNING); - return -2; - } - $reshook=$hookmanager->initHooks(array('fileslib')); $parameters=array('dest_file' => $dest_file, 'src_file' => $src_file, 'file_name' => $file_name, 'varfiles' => $varfiles, 'allowoverwrite' => $allowoverwrite); $reshook=$hookmanager->executeHooks('moveUploadedFile', $parameters, $object); } - + + if (empty($reshook)) + { + // If an upload error has been reported + if ($uploaderrorcode) + { + switch($uploaderrorcode) + { + case UPLOAD_ERR_INI_SIZE: // 1 + return 'ErrorFileSizeTooLarge'; + break; + case UPLOAD_ERR_FORM_SIZE: // 2 + return 'ErrorFileSizeTooLarge'; + break; + case UPLOAD_ERR_PARTIAL: // 3 + return 'ErrorPartialFile'; + break; + case UPLOAD_ERR_NO_TMP_DIR: // + return 'ErrorNoTmpDir'; + break; + case UPLOAD_ERR_CANT_WRITE: + return 'ErrorFailedToWriteInDir'; + break; + case UPLOAD_ERR_EXTENSION: + return 'ErrorUploadBlockedByAddon'; + break; + default: + break; + } + } + + // If we need to make a virus scan + if (empty($disablevirusscan) && file_exists($src_file)) + { + $checkvirusarray=dolCheckVirus($src_file); + if (count($checkvirusarray)) + { + dol_syslog('Files.lib::dol_move_uploaded_file File "'.$src_file.'" (target name "'.$dest_file.'") KO with antivirus: result='.$result.' errors='.join(',',$checkvirusarray), LOG_WARNING); + return 'ErrorFileIsInfectedWithAVirus: '.join(',',$checkvirusarray); + } + } + + // Security: + // Disallow file with some extensions. We renamed them. + // Car si on a mis le rep documents dans un rep de la racine web (pas bien), cela permet d'executer du code a la demande. + if (preg_match('/\.htm|\.html|\.php|\.pl|\.cgi$/i',$dest_file) && empty($conf->global->MAIN_DOCUMENT_IS_OUTSIDE_WEBROOT_SO_NOEXE_NOT_REQUIRED)) + { + $file_name.= '.noexe'; + } + + // Security: + // We refuse cache files/dirs, upload using .. and pipes into filenames. + if (preg_match('/^\./',$src_file) || preg_match('/\.\./',$src_file) || preg_match('/[<>|]/',$src_file)) + { + dol_syslog("Refused to deliver file ".$src_file, LOG_WARNING); + return -1; + } + + // Security: + // On interdit fichiers caches, remontees de repertoire ainsi que les pipe dans les noms de fichiers. + if (preg_match('/^\./',$dest_file) || preg_match('/\.\./',$dest_file) || preg_match('/[<>|]/',$dest_file)) + { + dol_syslog("Refused to deliver file ".$dest_file, LOG_WARNING); + return -2; + } + } + if ($reshook < 0) // At least one blocking error returned by one hook { $errmsg = join(',', $hookmanager->errors); diff --git a/test/phpunit/RestAPIDocumentTest.php b/test/phpunit/RestAPIDocumentTest.php index b180586aa91..b60a7e9e833 100644 --- a/test/phpunit/RestAPIDocumentTest.php +++ b/test/phpunit/RestAPIDocumentTest.php @@ -172,7 +172,7 @@ class RestAPIDocumentTest extends PHPUnit_Framework_TestCase dol_mkdir(DOL_DATA_ROOT.'/medias/tmpphpunit/tmpphpunit2'); $data = array( - 'filename'=>"mynewfilethatwillfails.txt", + 'filename'=>"mynewfile.txt", 'modulepart'=>"medias", 'ref'=>"", 'subdir'=>"tmpphpunit/tmpphpunit2", From d834cbf7baeb2fef8698c84ff634726160d3e437 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sun, 21 May 2017 15:24:16 +0200 Subject: [PATCH 209/299] Use getNomUrl for accounting account in product card --- htdocs/product/card.php | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/htdocs/product/card.php b/htdocs/product/card.php index 71f7cd8e7f6..5885775a1f1 100644 --- a/htdocs/product/card.php +++ b/htdocs/product/card.php @@ -1,20 +1,20 @@ +/* Copyright (C) 2001-2007 Rodolphe Quiedeville * Copyright (C) 2004-2016 Laurent Destailleur - * Copyright (C) 2005 Eric Seigne + * Copyright (C) 2005 Eric Seigne * Copyright (C) 2005-2015 Regis Houssin * Copyright (C) 2006 Andre Cianfarani * Copyright (C) 2006 Auguria SARL * Copyright (C) 2010-2015 Juanjo Menent * Copyright (C) 2013-2016 Marcos García * Copyright (C) 2012-2013 Cédric Salvador - * Copyright (C) 2011-2016 Alexandre Spangaro + * Copyright (C) 2011-2017 Alexandre Spangaro * Copyright (C) 2014 Cédric Gross * Copyright (C) 2014-2015 Ferran Marcet * Copyright (C) 2015 Jean-François Ferry * Copyright (C) 2015 Raphaël Doursenaud * Copyright (C) 2016 Charlie Benke - * Copyright (C) 2016 Meziane Sof + * Copyright (C) 2016 Meziane Sof * * 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 @@ -51,8 +51,8 @@ require_once DOL_DOCUMENT_ROOT.'/core/modules/product/modules_product.php'; if (! empty($conf->propal->enabled)) require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'; if (! empty($conf->facture->enabled)) require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; if (! empty($conf->commande->enabled)) require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php'; -if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT.'/accountancy/class/html.formventilation.class.php'; +if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php'; $langs->load("products"); $langs->load("other"); @@ -272,7 +272,7 @@ if (empty($reshook)) $object->volume_units = GETPOST('volume_units'); $object->finished = GETPOST('finished'); $object->fk_unit = GETPOST('units'); - + $accountancy_code_sell = GETPOST('accountancy_code_sell'); $accountancy_code_buy = GETPOST('accountancy_code_buy'); @@ -399,7 +399,7 @@ if (empty($reshook)) $accountancy_code_sell = GETPOST('accountancy_code_sell'); $accountancy_code_buy = GETPOST('accountancy_code_buy'); - + if ($accountancy_code_sell <= 0) { $object->accountancy_code_sell = ''; } else { $object->accountancy_code_sell = $accountancy_code_sell; } if ($accountancy_code_buy <= 0) { $object->accountancy_code_buy = ''; } else { $object->accountancy_code_buy = $accountancy_code_buy; } @@ -1107,7 +1107,7 @@ else // Accountancy codes print ''; - + if (! empty($conf->accounting->enabled)) { // Accountancy_code_sell @@ -1121,7 +1121,7 @@ else print ''; - } + } else // For external software { // Accountancy_code_sell @@ -1414,7 +1414,7 @@ else print ''; - } + } else // For external software { // Accountancy_code_sell @@ -1530,8 +1530,12 @@ else print '
'; print $formaccountancy->select_account(GETPOST('accountancy_code_buy'), 'accountancy_code_buy', 1, null, 1, 1, ''); print '
'; print $formaccountancy->select_account($object->accountancy_code_buy, 'accountancy_code_buy', 1, '', 1, 1); print '
'; print $langs->trans("ProductAccountancySellCode"); print ''; - if (! empty($conf->accounting->enabled)) { - print length_accountg($object->accountancy_code_sell); + if (! empty($conf->accounting->enabled)) + { + $accountingaccount = new AccountingAccount($db); + $accountingaccount->fetch('',$object->accountancy_code_sell); + + print $accountingaccount->getNomUrl(0,1,1,'',1); } else { print $object->accountancy_code_sell; } @@ -1541,8 +1545,12 @@ else print '
'; print $langs->trans("ProductAccountancyBuyCode"); print ''; - if (! empty($conf->accounting->enabled)) { - print length_accountg($object->accountancy_code_buy); + if (! empty($conf->accounting->enabled)) + { + $accountingaccount2 = new AccountingAccount($db); + $accountingaccount2->fetch('',$object->accountancy_code_buy); + + print $accountingaccount2->getNomUrl(0,1,1,'',1); } else { print $object->accountancy_code_buy; } From 6aa6ef1f9f1a13db8853935b6030db5ff13584ac Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 21 May 2017 18:30:43 +0200 Subject: [PATCH 210/299] Fix travis error --- htdocs/core/lib/files.lib.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 008f4c15e3c..0920158b720 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -657,6 +657,7 @@ function dolCopyDir($srcfile, $destfile, $newmask, $overwriteifexists) * @param string $destfile Destination file (can't be a directory. use native php @rename() to move a directory) * @param integer $newmask Mask in octal string for new file (0 by default means $conf->global->MAIN_UMASK) * @param int $overwriteifexists Overwrite file if exists (1 by default) + * @param int $testvirus Do an antivirus test. Move is canceled if a virus is found. * @return boolean True if OK, false if KO * @see dol_move_uploaded_file */ @@ -1698,7 +1699,7 @@ function dol_most_recent_file($dir,$regexfilter='',$excludefilter=array('(\.meta * @param string $entity Restrict onto entity (0=no restriction) * @param User $fuser User object (forced) * @param string $refname Ref of object to check permission for external users (autodetect if not provided) - * @param string $more Check permission for 'read' or 'write' + * @param string $mode Check permission for 'read' or 'write' * @return mixed Array with access information : 'accessallowed' & 'sqlprotectagainstexternals' & 'original_file' (as a full path name) * @see restrictedArea */ From 5cb38ece19b6922a2646ca45a01fbde90b874ae4 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 21 May 2017 19:37:15 +0200 Subject: [PATCH 211/299] Fix travis errors --- htdocs/core/lib/functions.lib.php | 2 +- htdocs/core/modules/DolibarrModules.class.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 14f61d99590..8462cdc76ff 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -281,7 +281,7 @@ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) $relativepathstring = preg_replace('/^\//', '', $relativepathstring); // Retrieve values if restore_lastsearch_values is set and there is saved values - if ($_GET['restore_lastsearch_values'] && ! empty($_SESSION['lastsearch_values_'.$relativepathstring])) // Keep $_GET here + if (! empty($_GET['restore_lastsearch_values']) && ! empty($_SESSION['lastsearch_values_'.$relativepathstring])) // Keep $_GET here { $tmp=json_decode($_SESSION['lastsearch_values_'.$relativepathstring], true); if (is_array($tmp)) diff --git a/htdocs/core/modules/DolibarrModules.class.php b/htdocs/core/modules/DolibarrModules.class.php index cdb4ea33f73..71de341a769 100644 --- a/htdocs/core/modules/DolibarrModules.class.php +++ b/htdocs/core/modules/DolibarrModules.class.php @@ -848,8 +848,8 @@ class DolibarrModules // Can not be abstract, because we need to insta $resql=$this->db->query($sql); if (! $resql) $err++; - $note=json_encode(array('authorid'=>$user->id, 'ip'=>(empty($_SERVER['REMOTE_ADDR'])?'':$_SERVER['REMOTE_ADDR']))); - + $note=json_encode(array('authorid'=>(is_object($user)?$user->id:0), 'ip'=>(empty($_SERVER['REMOTE_ADDR'])?'':$_SERVER['REMOTE_ADDR']))); + $sql = "INSERT INTO ".MAIN_DB_PREFIX."const (name, value, visible, entity, note) VALUES"; $sql.= " (".$this->db->encrypt($this->const_name,1); $sql.= ", ".$this->db->encrypt('1',1); From 965e23b71190a8d77e2042e4f568d5233d9b664a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 21 May 2017 19:45:47 +0200 Subject: [PATCH 212/299] Test to fix a regression --- htdocs/core/lib/functions2.lib.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/core/lib/functions2.lib.php b/htdocs/core/lib/functions2.lib.php index c8d617ec99d..8934447fdfe 100644 --- a/htdocs/core/lib/functions2.lib.php +++ b/htdocs/core/lib/functions2.lib.php @@ -781,7 +781,7 @@ function get_next_value($db,$mask,$table,$field,$where='',$objsoc='',$date='',$m } // Personalized field {XXX-1} à {XXX-9} - $maskperso=array(); + /*$maskperso=array(); $maskpersonew=array(); $tmpmask=$mask; while (preg_match('/\{([A-Z]+)\-([1-9])\}/i',$tmpmask,$regKey)) @@ -789,17 +789,17 @@ function get_next_value($db,$mask,$table,$field,$where='',$objsoc='',$date='',$m $maskperso[$regKey[1]]='\{'.$regKey[1]+'\-'.$regKey[2].'\}'; $maskpersonew[$regKey[1]]=str_pad('', '_', $regKey[2], STR_PAD_RIGHT); $tmpmask=preg_replace('/\{'.$regKey[1].'\-'.$regKey[2].'\}/i', $maskpersonew, $tmpmask); - } + }*/ $maskwithonlyymcode=$mask; $maskwithonlyymcode=preg_replace('/\{(0+)([@\+][0-9\-\+\=]+)?([@\+][0-9\-\+\=]+)?\}/i',$maskcounter,$maskwithonlyymcode); $maskwithonlyymcode=preg_replace('/\{dd\}/i','dd',$maskwithonlyymcode); $maskwithonlyymcode=preg_replace('/\{(c+)(0*)\}/i',$maskrefclient,$maskwithonlyymcode); $maskwithonlyymcode=preg_replace('/\{(t+)\}/i',$masktype_value,$maskwithonlyymcode); - foreach($maskperso as $key => $val) + /*foreach($maskperso as $key => $val) { $maskwithonlyymcode=preg_replace('/'.$val.'/i', $maskpersonew[$key], $maskwithonlyymcode); - } + }*/ $maskwithnocode=$maskwithonlyymcode; $maskwithnocode=preg_replace('/\{yyyy\}/i','yyyy',$maskwithnocode); $maskwithnocode=preg_replace('/\{yy\}/i','yy',$maskwithnocode); From 6e31de731b8cd376a0b185b30cf8a78e7d7e8b57 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 21 May 2017 20:24:56 +0200 Subject: [PATCH 213/299] Fix phpunit --- htdocs/societe/class/societe.class.php | 2 +- test/phpunit/SocieteTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 6aebf0e8786..995c16719cb 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -841,7 +841,7 @@ class Societe extends CommonObject $sql .= ",fk_effectif = ".(! empty($this->effectif_id)?"'".$this->db->escape($this->effectif_id)."'":"null"); if (isset($this->stcomm_id)) { - $sql .= ",fk_stcomm=".($this->stcomm_id > 0 ? $this->stcomm_id : "null"); + $sql .= ",fk_stcomm=".($this->stcomm_id > 0 ? $this->stcomm_id : "0"); } $sql .= ",fk_typent = ".(! empty($this->typent_id)?"'".$this->db->escape($this->typent_id)."'":"0"); diff --git a/test/phpunit/SocieteTest.php b/test/phpunit/SocieteTest.php index 24b868b743e..31aa98fd082 100755 --- a/test/phpunit/SocieteTest.php +++ b/test/phpunit/SocieteTest.php @@ -79,7 +79,7 @@ class SocieteTest extends PHPUnit_Framework_TestCase if ($conf->global->SOCIETE_CODECLIENT_ADDON != 'mod_codeclient_monkey') { print "\n".__METHOD__." third party ref checker must be setup to 'mod_codeclient_monkey' not to '".$conf->global->SOCIETE_CODECLIENT_ADDON."'.\n"; die(); } - if (! empty($conf->global->MAIN_DISABLEPROFIDRULES)) { print "\n".__METHOD__." constant MAIN_DISABLEPROFIDRULE must be empty (if a module set it, disable module).\n"; die(); } + if (! empty($conf->global->MAIN_DISABLEPROFIDRULES)) { print "\n".__METHOD__." constant MAIN_DISABLEPROFIDRULES must be empty (if a module set it, disable module).\n"; die(); } $db->begin(); // This is to have all actions inside a transaction even if test launched without suite. From ff35229be58e84c049540c47f0a2c12fb0b874b7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 21 May 2017 20:46:11 +0200 Subject: [PATCH 214/299] Fix phpunit --- test/phpunit/UserTest.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/phpunit/UserTest.php b/test/phpunit/UserTest.php index 4e0c0ba58ca..e0802ff17a2 100644 --- a/test/phpunit/UserTest.php +++ b/test/phpunit/UserTest.php @@ -75,6 +75,9 @@ class UserTest extends PHPUnit_Framework_TestCase public static function setUpBeforeClass() { global $conf,$user,$langs,$db; + + if (! empty($conf->global->MAIN_LDAP_ENABLED)) { print "\n".__METHOD__." module LDAP must be disabled.\n"; die(); } + $db->begin(); // This is to have all actions inside a transaction even if test launched without suite. print __METHOD__."\n"; @@ -187,7 +190,7 @@ class UserTest extends PHPUnit_Framework_TestCase $newlocalobject=new User($this->savdb); $newlocalobject->initAsSpecimen(); $this->changeProperties($newlocalobject); - $this->assertEquals($this->objCompare($localobject,$newlocalobject,true,array('id','socid','societe_id','ref','pass_indatabase','pass_indatabase_crypted','datec','datem','datelastlogin','datepreviouslogin')), array()); // Actual, Expected + $this->assertEquals($this->objCompare($localobject,$newlocalobject,true,array('id','socid','societe_id','ref','pass','pass_indatabase','pass_indatabase_crypted','datec','datem','datelastlogin','datepreviouslogin')), array()); // Actual, Expected return $localobject; } From 3e381aa5a29345136f1468e731948187d5b7fcfb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 21 May 2017 21:04:20 +0200 Subject: [PATCH 215/299] Fix phpunit --- test/phpunit/AdherentTest.php | 6 ++++-- test/phpunit/UserTest.php | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/test/phpunit/AdherentTest.php b/test/phpunit/AdherentTest.php index 42b4ff7cf7f..b998c346b7b 100644 --- a/test/phpunit/AdherentTest.php +++ b/test/phpunit/AdherentTest.php @@ -83,7 +83,9 @@ class AdherentTest extends PHPUnit_Framework_TestCase print "\n".__METHOD__." Company must be setup to have name-firstname in order 'Firstname Lastname'\n"; die(); } - + if (! empty($conf->global->MAIN_MODULE_LDAP)) { print "\n".__METHOD__." module LDAP must be disabled.\n"; die(); } + if (! empty($conf->global->MAIN_MODULE_MAILMANSPIP)) { print "\n".__METHOD__." module MailmanSpip must be disabled.\n"; die(); } + print __METHOD__."\n"; } @@ -322,7 +324,7 @@ class AdherentTest extends PHPUnit_Framework_TestCase $expected = DOL_MAIN_URL_ROOT.','.$localobject->id.',,New firstname,New name,New firstname New name,'. 'New company,New address,New zip,New town,Belgium,newemail@newemail.com,'.dol_print_date($localobject->birth,'day').',,'. - 'newlogin,dolibspec,New firstname,New name,New company,New address,New zip,New town,Belgium'; + 'newlogin,,New firstname,New name,New company,New address,New zip,New town,Belgium'; $result = $localobject->makeSubstitution($template); print __METHOD__." result=".$result."\n"; diff --git a/test/phpunit/UserTest.php b/test/phpunit/UserTest.php index e0802ff17a2..b932d2e2221 100644 --- a/test/phpunit/UserTest.php +++ b/test/phpunit/UserTest.php @@ -76,7 +76,7 @@ class UserTest extends PHPUnit_Framework_TestCase { global $conf,$user,$langs,$db; - if (! empty($conf->global->MAIN_LDAP_ENABLED)) { print "\n".__METHOD__." module LDAP must be disabled.\n"; die(); } + if (! empty($conf->global->MAIN_MODULE_LDAP)) { print "\n".__METHOD__." module LDAP must be disabled.\n"; die(); } $db->begin(); // This is to have all actions inside a transaction even if test launched without suite. From 4a085a8cc0ebf22036b97b9f1b5c1532fd77cbec Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 21 May 2017 21:21:44 +0200 Subject: [PATCH 216/299] Fix phpunit --- htdocs/compta/bank/class/account.class.php | 5 ++--- test/phpunit/WebservicesInvoicesTest.php | 2 ++ test/phpunit/WebservicesOrdersTest.php | 2 ++ test/phpunit/WebservicesOtherTest.php | 2 ++ test/phpunit/WebservicesProductsTest.php | 2 ++ test/phpunit/WebservicesThirdpartyTest.php | 2 ++ test/phpunit/WebservicesUserTest.php | 2 ++ 7 files changed, 14 insertions(+), 3 deletions(-) diff --git a/htdocs/compta/bank/class/account.class.php b/htdocs/compta/bank/class/account.class.php index 2a615ad4b69..b77ed4db1a5 100644 --- a/htdocs/compta/bank/class/account.class.php +++ b/htdocs/compta/bank/class/account.class.php @@ -569,7 +569,7 @@ class Account extends CommonObject $sql.= ", '".$this->db->escape($this->label)."'"; $sql.= ", ".$conf->entity; $sql.= ", '".$this->db->escape($this->account_number)."'"; - $sql.= ", '".$this->db->escape($this->fk_accountancy_journal)."'"; + $sql.= ", ".($this->fk_accountancy_journal > 0 ? $this->db->escape($this->fk_accountancy_journal) : "null"); $sql.= ", '".$this->db->escape($this->bank)."'"; $sql.= ", '".$this->code_banque."'"; $sql.= ", '".$this->code_guichet."'"; @@ -702,8 +702,7 @@ class Account extends CommonObject $sql.= ",rappro = ".$this->rappro; $sql.= ",url = ".($this->url?"'".$this->url."'":"null"); $sql.= ",account_number = '".$this->db->escape($this->account_number)."'"; - $sql.= ",fk_accountancy_journal = '".$this->db->escape($this->fk_accountancy_journal)."'"; - + $sql.= ",fk_accountancy_journal = ".($this->fk_accountancy_journal > 0 ? $this->db->escape($this->fk_accountancy_journal) : "null"); $sql.= ",bank = '".$this->db->escape($this->bank)."'"; $sql.= ",code_banque='".$this->db->escape($this->code_banque)."'"; $sql.= ",code_guichet='".$this->db->escape($this->code_guichet)."'"; diff --git a/test/phpunit/WebservicesInvoicesTest.php b/test/phpunit/WebservicesInvoicesTest.php index 470bcbf4900..07bd95e01f2 100644 --- a/test/phpunit/WebservicesInvoicesTest.php +++ b/test/phpunit/WebservicesInvoicesTest.php @@ -39,6 +39,8 @@ if (empty($user->id)) } $conf->global->MAIN_DISABLE_ALL_MAILS=1; +$conf->global->MAIN_UMASK='0666'; + /** * Class for PHPUnit tests diff --git a/test/phpunit/WebservicesOrdersTest.php b/test/phpunit/WebservicesOrdersTest.php index 06ead4f4873..e81ee2d3604 100644 --- a/test/phpunit/WebservicesOrdersTest.php +++ b/test/phpunit/WebservicesOrdersTest.php @@ -38,6 +38,8 @@ if (empty($user->id)) { } $conf->global->MAIN_DISABLE_ALL_MAILS=1; +$conf->global->MAIN_UMASK='0666'; + /** * Class for PHPUnit tests diff --git a/test/phpunit/WebservicesOtherTest.php b/test/phpunit/WebservicesOtherTest.php index d04fc6b9b9c..e3725c8609c 100644 --- a/test/phpunit/WebservicesOtherTest.php +++ b/test/phpunit/WebservicesOtherTest.php @@ -38,6 +38,8 @@ if (empty($user->id)) { } $conf->global->MAIN_DISABLE_ALL_MAILS=1; +$conf->global->MAIN_UMASK='0666'; + /** * Class for PHPUnit tests diff --git a/test/phpunit/WebservicesProductsTest.php b/test/phpunit/WebservicesProductsTest.php index fecc58a65e1..796ee700221 100644 --- a/test/phpunit/WebservicesProductsTest.php +++ b/test/phpunit/WebservicesProductsTest.php @@ -40,6 +40,8 @@ if (empty($user->id)) { } $conf->global->MAIN_DISABLE_ALL_MAILS=1; +$conf->global->MAIN_UMASK='0666'; + if (empty($conf->service->enabled)) { print "Error: Module service must be enabled.\n"; diff --git a/test/phpunit/WebservicesThirdpartyTest.php b/test/phpunit/WebservicesThirdpartyTest.php index 2888c432e73..59907b36194 100644 --- a/test/phpunit/WebservicesThirdpartyTest.php +++ b/test/phpunit/WebservicesThirdpartyTest.php @@ -38,6 +38,8 @@ if (empty($user->id)) { } $conf->global->MAIN_DISABLE_ALL_MAILS=1; +$conf->global->MAIN_UMASK='0666'; + /** * Class for PHPUnit tests diff --git a/test/phpunit/WebservicesUserTest.php b/test/phpunit/WebservicesUserTest.php index 78d3d311fe0..5098da22e6e 100644 --- a/test/phpunit/WebservicesUserTest.php +++ b/test/phpunit/WebservicesUserTest.php @@ -38,6 +38,8 @@ if (empty($user->id)) { } $conf->global->MAIN_DISABLE_ALL_MAILS=1; +$conf->global->MAIN_UMASK='0666'; + /** * Class for PHPUnit tests From e85f31f456068c1ed8998a4ab3dca38811dcf546 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 21 May 2017 21:33:24 +0200 Subject: [PATCH 217/299] Fix phpunit --- test/phpunit/WebservicesProductsTest.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/phpunit/WebservicesProductsTest.php b/test/phpunit/WebservicesProductsTest.php index 796ee700221..e3500a68f5b 100644 --- a/test/phpunit/WebservicesProductsTest.php +++ b/test/phpunit/WebservicesProductsTest.php @@ -169,7 +169,9 @@ class WebservicesProductsTest extends PHPUnit_Framework_TestCase 'ref'=>'NewProductFromWS'.$datestring, 'label'=>'New Product From WS '.$datestring, 'type'=>1, - 'description'=>'This is a new product created from WS PHPUnit test case' + 'description'=>'This is a new product created from WS PHPUnit test case', + 'barcode'=>'123456789012', + 'barcode_type'=>2 ) ); print __METHOD__." call method ".$WS_METHOD."\n"; From 6052d2d8ed3dbfa965469838a2aa2c8b4d660f96 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 21 May 2017 21:37:33 +0200 Subject: [PATCH 218/299] Try to output log after error --- test/phpunit/NumberingModulesTest.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/test/phpunit/NumberingModulesTest.php b/test/phpunit/NumberingModulesTest.php index b29cd03b2c9..e0d175b75d5 100644 --- a/test/phpunit/NumberingModulesTest.php +++ b/test/phpunit/NumberingModulesTest.php @@ -158,6 +158,10 @@ class NumberingModulesTest extends PHPUnit_Framework_TestCase $numbering=new mod_facture_mercure(); $result=$numbering->getNextValue($mysoc, $localobject2, 'last'); print __METHOD__." result=".$result."\n"; + + $out=file_get_contents(DOL_DATA_ROOT.'/dolibarr.log'); + print $out; + $this->assertEquals('1915-0001', $result, "Test to get last value with param 'last'"); $result=$numbering->getNextValue($mysoc, $localobject2); $result2=$localobject2->create($user,1); From 246fa9748b708ed2cbc9f86eda4aa713e7b307de Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 21 May 2017 23:06:45 +0200 Subject: [PATCH 219/299] Debug travis error --- test/phpunit/ModulesTest.php | 5 +++++ test/phpunit/NumberingModulesTest.php | 23 ++++++++++++++--------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/test/phpunit/ModulesTest.php b/test/phpunit/ModulesTest.php index e769ce9dd51..a4ff51333e0 100755 --- a/test/phpunit/ModulesTest.php +++ b/test/phpunit/ModulesTest.php @@ -143,6 +143,11 @@ class ModulesTest extends PHPUnit_Framework_TestCase $result=$mod->init(); $this->assertLessThan($result, 0, $modlabel); print __METHOD__." test remove/init for module ".$modlabel.", result=".$result."\n"; + + if (in_array($modlabel, array('Ldap', 'MailmanSpip'))) + { + $result=$mod->remove(); + } } return 0; diff --git a/test/phpunit/NumberingModulesTest.php b/test/phpunit/NumberingModulesTest.php index e0d175b75d5..d7f3eaf611c 100644 --- a/test/phpunit/NumberingModulesTest.php +++ b/test/phpunit/NumberingModulesTest.php @@ -144,30 +144,35 @@ class NumberingModulesTest extends PHPUnit_Framework_TestCase $localobject->date=dol_mktime(12, 0, 0, 1, 1, 1915); // we use year 1915 to be sure to not have existing invoice for this year $numbering=new mod_facture_mercure(); $result=$numbering->getNextValue($mysoc, $localobject); - $result2=$localobject->create($user,1); - $result3=$localobject->validate($user, $result); // create invoice by forcing ref print __METHOD__." result=".$result."\n"; $this->assertEquals('1915-0001', $result, 'Test for {yyyy}-{0000}, 1st invoice'); // counter must start to 1 + $result2=$localobject->create($user,1); + print __METHOD__." result2=".$result."\n"; + $result3=$localobject->validate($user, $result); // create invoice by forcing ref + print __METHOD__." result3=".$result."\n"; + $this->assertEquals(1, $result3, 'Test validation of invoice with forced ref is ok'); // counter must start to 1 $result=$localobject->is_erasable(); print __METHOD__." is_erasable=".$result."\n"; - $this->assertEquals(1, $result, 'Test for is_erasable, 1st invoice'); // Can be deleted + $this->assertEquals(1, $result, 'Test for is_erasable, 1st invoice'); // Can be deleted + $out=file_get_contents(DOL_DATA_ROOT.'/dolibarr.log'); + print $out; + $localobject2=new Facture($this->savdb); $localobject2->initAsSpecimen(); $localobject2->date=dol_mktime(12, 0, 0, 1, 1, 1916); // we use following year for second invoice (there is no reset into mask) $numbering=new mod_facture_mercure(); $result=$numbering->getNextValue($mysoc, $localobject2, 'last'); print __METHOD__." result=".$result."\n"; - - $out=file_get_contents(DOL_DATA_ROOT.'/dolibarr.log'); - print $out; - $this->assertEquals('1915-0001', $result, "Test to get last value with param 'last'"); $result=$numbering->getNextValue($mysoc, $localobject2); - $result2=$localobject2->create($user,1); - $result3=$localobject2->validate($user, $result); // create invoice by forcing ref print __METHOD__." result=".$result."\n"; $this->assertEquals('1916-0002', $result); // counter must be now 2 (not reseted) + $result2=$localobject2->create($user,1); + print __METHOD__." result2=".$result."\n"; + $result3=$localobject2->validate($user, $result); // create invoice by forcing ref + print __METHOD__." result3=".$result."\n"; + $this->assertEquals(1, $result3, 'Test validation of invoice with forced ref is ok'); // counter must start to 1 $result=$localobject2->is_erasable(); print __METHOD__." is_erasable=".$result."\n"; $this->assertEquals(1, $result); // Can be deleted From 090a7028d77d9c702d21dbe3169b6d690bf1a9ff Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 21 May 2017 23:41:04 +0200 Subject: [PATCH 220/299] Fix constant usage --- htdocs/core/lib/files.lib.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 0920158b720..9d04cb82a1e 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -1572,6 +1572,8 @@ function dol_convert_file($fileinput,$ext='png',$fileoutput='') */ function dol_compress_file($inputfile, $outputfile, $mode="gz") { + global $conf; + $foundhandler=0; try @@ -1627,10 +1629,10 @@ function dol_uncompress($inputfile,$outputdir) { global $conf, $langs; - if (! empty($conf->global->ODTPHP_PATHTOPCLZIP)) + if (defined('ODTPHP_PATHTOPCLZIP')) { - dol_syslog("Constant ODTPHP_PATHTOPCLZIP for pclzip library is set to ".$conf->global->ODTPHP_PATHTOPCLZIP.", so we use Pclzip to unzip into ".$outputdir); - include_once $conf->global->ODTPHP_PATHTOPCLZIP.'/pclzip.lib.php'; + dol_syslog("Constant ODTPHP_PATHTOPCLZIP for pclzip library is set to ".ODTPHP_PATHTOPCLZIP.", so we use Pclzip to unzip into ".$outputdir); + include_once ODTPHP_PATHTOPCLZIP.'/pclzip.lib.php'; $archive = new PclZip($inputfile); $result=$archive->extract(PCLZIP_OPT_PATH, $outputdir); //var_dump($result); From ef9cf6ef5235ef37ecfbb03dea295809bcc7d17c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 21 May 2017 23:54:37 +0200 Subject: [PATCH 221/299] Add test on phpunit --- test/phpunit/FunctionsLibTest.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/phpunit/FunctionsLibTest.php b/test/phpunit/FunctionsLibTest.php index 28e55fd793b..8c57e8a178a 100644 --- a/test/phpunit/FunctionsLibTest.php +++ b/test/phpunit/FunctionsLibTest.php @@ -81,6 +81,8 @@ class FunctionsLibTest extends PHPUnit_Framework_TestCase global $conf,$user,$langs,$db; //$db->begin(); // This is to have all actions inside a transaction even if test launched without suite. + if (! function_exists('mb_substr')) { print "\n".__METHOD__." function mb_substr must be enabled.\n"; die(); } + print __METHOD__."\n"; } From ecce1c20374ed1ab51cea9211b8a07751351b7f7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 21 May 2017 23:58:19 +0200 Subject: [PATCH 222/299] Remove conf --- htdocs/core/lib/files.lib.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 9d04cb82a1e..c60464ed0fd 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -1572,8 +1572,6 @@ function dol_convert_file($fileinput,$ext='png',$fileoutput='') */ function dol_compress_file($inputfile, $outputfile, $mode="gz") { - global $conf; - $foundhandler=0; try @@ -1627,7 +1625,7 @@ function dol_compress_file($inputfile, $outputfile, $mode="gz") */ function dol_uncompress($inputfile,$outputdir) { - global $conf, $langs; + global $langs; if (defined('ODTPHP_PATHTOPCLZIP')) { From a3eef35ce647dbc17d1e5f5e1b3ea36815a95f40 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 22 May 2017 01:19:16 +0200 Subject: [PATCH 223/299] Fix travis error --- htdocs/adherents/card.php.bak | 1787 ------------------------- htdocs/core/lib/functions.lib.php | 13 +- test/phpunit/AllTests.php | 2 +- test/phpunit/FilesLibTest.php | 14 +- test/phpunit/NumberingModulesTest.php | 10 +- 5 files changed, 24 insertions(+), 1802 deletions(-) delete mode 100644 htdocs/adherents/card.php.bak diff --git a/htdocs/adherents/card.php.bak b/htdocs/adherents/card.php.bak deleted file mode 100644 index 48461c64b02..00000000000 --- a/htdocs/adherents/card.php.bak +++ /dev/null @@ -1,1787 +0,0 @@ - - * Copyright (C) 2002-2003 Jean-Louis Bergamo - * Copyright (C) 2004-2012 Laurent Destailleur - * Copyright (C) 2005-2012 Regis Houssin - * Copyright (C) 2012 Marcos García - * Copyright (C) 2012-2016 Philippe Grand - * Copyright (C) 2015-2016 Alexandre Spangaro - * - * 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 3 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/adherents/card.php - * \ingroup member - * \brief Page of member - */ - -require '../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/member.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/images.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; -require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php'; -require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php'; -require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; -require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; - -$langs->load("companies"); -$langs->load("bills"); -$langs->load("members"); -$langs->load("users"); -$langs->load('other'); - -$action=GETPOST('action','alpha'); -$cancel=GETPOST('cancel','alpha'); -$backtopage=GETPOST('backtopage','alpha'); -$confirm=GETPOST('confirm','alpha'); -$rowid=GETPOST('rowid','int'); -$id=GETPOST('id')?GETPOST('id','int'):$rowid; -$typeid=GETPOST('typeid','int'); -$userid=GETPOST('userid','int'); -$socid=GETPOST('socid','int'); - -if (! empty($conf->mailmanspip->enabled)) -{ - include_once DOL_DOCUMENT_ROOT.'/mailmanspip/class/mailmanspip.class.php'; - - $langs->load('mailmanspip'); - - $mailmanspip = new MailmanSpip($db); -} - -$object = new Adherent($db); -$extrafields = new ExtraFields($db); - -// fetch optionals attributes and labels -$extralabels=$extrafields->fetch_name_optionals_label($object->table_element); - -// Get object canvas (By default, this is not defined, so standard usage of dolibarr) -$object->getCanvas($id); -$canvas = $object->canvas?$object->canvas:GETPOST("canvas"); -$objcanvas=null; -if (! empty($canvas)) -{ - require_once DOL_DOCUMENT_ROOT.'/core/class/canvas.class.php'; - $objcanvas = new Canvas($db, $action); - $objcanvas->getCanvas('adherent', 'membercard', $canvas); -} - -// Security check -$result=restrictedArea($user, 'adherent', $id, '', '', 'fk_soc', 'rowid', $objcanvas); - -if ($id > 0) -{ - // Load member - $result = $object->fetch($id); - - // Define variables to know what current user can do on users - $canadduser=($user->admin || $user->rights->user->user->creer); - // Define variables to know what current user can do on properties of user linked to edited member - if ($object->user_id) - { - // $ User is the user who edits, $ object->user_id is the id of the related user in the edited member - $caneditfielduser=((($user->id == $object->user_id) && $user->rights->user->self->creer) - || (($user->id != $object->user_id) && $user->rights->user->user->creer)); - $caneditpassworduser=((($user->id == $object->user_id) && $user->rights->user->self->password) - || (($user->id != $object->user_id) && $user->rights->user->user->password)); - } -} - -// Define variables to determine what the current user can do on the members -$canaddmember=$user->rights->adherent->creer; -// Define variables to determine what the current user can do on the properties of a member -if ($id) -{ - $caneditfieldmember=$user->rights->adherent->creer; -} - -// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array -$hookmanager->initHooks(array('membercard','globalcard')); - - - -/* - * Actions - */ - -if ($cancel) $action=''; - -$parameters=array('id'=>$id, 'rowid'=>$id, 'objcanvas'=>$objcanvas); -$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks -if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); - -if (empty($reshook)) -{ - if ($action == 'setuserid' && ($user->rights->user->self->creer || $user->rights->user->user->creer)) - { - $error=0; - if (empty($user->rights->user->user->creer)) // If can edit only itself user, we can link to itself only - { - if ($userid != $user->id && $userid != $object->user_id) - { - $error++; - setEventMessages($langs->trans("ErrorUserPermissionAllowsToLinksToItselfOnly"), null, 'errors'); - } - } - - if (! $error) - { - if ($userid != $object->user_id) // If link differs from currently in database - { - $result=$object->setUserId($userid); - if ($result < 0) dol_print_error($object->db,$object->error); - $action=''; - } - } - } - - if ($action == 'setsocid') - { - $error=0; - if (! $error) - { - if ($socid != $object->fk_soc) // If link differs from currently in database - { - $sql ="SELECT rowid FROM ".MAIN_DB_PREFIX."adherent"; - $sql.=" WHERE fk_soc = '".$socid."'"; - $sql.=" AND entity = ".$conf->entity; - $resql = $db->query($sql); - if ($resql) - { - $obj = $db->fetch_object($resql); - if ($obj && $obj->rowid > 0) - { - $othermember=new Adherent($db); - $othermember->fetch($obj->rowid); - $thirdparty=new Societe($db); - $thirdparty->fetch($socid); - $error++; - setEventMessages($langs->trans("ErrorMemberIsAlreadyLinkedToThisThirdParty",$othermember->getFullName($langs),$othermember->login,$thirdparty->name), null, 'errors'); - } - } - - if (! $error) - { - $result=$object->setThirdPartyId($socid); - if ($result < 0) dol_print_error($object->db,$object->error); - $action=''; - } - } - } - } - - // Create user from a member - if ($action == 'confirm_create_user' && $confirm == 'yes' && $user->rights->user->user->creer) - { - if ($result > 0) - { - // Creation user - $nuser = new User($db); - $result=$nuser->create_from_member($object,GETPOST('login')); - - if ($result < 0) - { - $langs->load("errors"); - setEventMessages($langs->trans($nuser->error), null, 'errors'); - } - } - else - { - setEventMessages($object->errors, $object->error, 'errors'); - } - } - - // Create third party from a member - if ($action == 'confirm_create_thirdparty' && $confirm == 'yes' && $user->rights->societe->creer) - { - if ($result > 0) - { - // User creation - $company = new Societe($db); - $result=$company->create_from_member($object,GETPOST('companyname')); - - if ($result < 0) - { - $langs->load("errors"); - setEventMessages($langs->trans($company->error), null, 'errors'); - setEventMessages($company->error, $company->errors, 'errors'); - } - } - else - { - setEventMessages($object->error, $object->errors, 'errors'); - } - } - - if ($action == 'confirm_sendinfo' && $confirm == 'yes') - { - if ($object->email) - { - $from=$conf->email_from; - if (! empty($conf->global->ADHERENT_MAIL_FROM)) $from=$conf->global->ADHERENT_MAIL_FROM; - - $result=$object->send_an_email($langs->transnoentitiesnoconv("ThisIsContentOfYourCard")."\n\n%INFOS%\n\n",$langs->transnoentitiesnoconv("CardContent")); - - $langs->load("mails"); - setEventMessages($langs->trans("MailSuccessfulySent", $from, $object->email), null, 'mesgs'); - } - } - - if ($action == 'update' && ! $cancel && $user->rights->adherent->creer) - { - require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; - - $birthdate=''; - if (isset($_POST["birthday"]) && $_POST["birthday"] - && isset($_POST["birthmonth"]) && $_POST["birthmonth"] - && isset($_POST["birthyear"]) && $_POST["birthyear"]) - { - $birthdate=dol_mktime(12, 0, 0, $_POST["birthmonth"], $_POST["birthday"], $_POST["birthyear"]); - } - $lastname=$_POST["lastname"]; - $firstname=$_POST["firstname"]; - $societe=$_POST["societe"]; - $morphy=$_POST["morphy"]; - $login=$_POST["login"]; - if ($morphy != 'mor' && empty($lastname)) { - $error++; - $langs->load("errors"); - setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Lastname")), null, 'errors'); - } - if ($morphy != 'mor' && (!isset($firstname) || $firstname=='')) { - $error++; - $langs->load("errors"); - setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Firstname")), null, 'errors'); - } - if ($morphy == 'mor' && empty($societe)) { - $error++; - $langs->load("errors"); - setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Company")), null, 'errors'); - } - // Test si le login existe deja - if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) - { - if (empty($login)) { - $error++; - setEventMessages($langs->trans("ErrorFieldRequired", $langs->trans("Login")), null, 'errors'); - } - } - // Create new object - if ($result > 0 && ! $error) - { - $object->oldcopy = clone $object; - - // Change values - $object->civility_id = trim($_POST["civility_id"]); - $object->firstname = trim($_POST["firstname"]); - $object->lastname = trim($_POST["lastname"]); - $object->login = trim($_POST["login"]); - $object->pass = trim($_POST["pass"]); - - $object->societe = trim($_POST["societe"]); - $object->company = trim($_POST["societe"]); - - $object->address = trim($_POST["address"]); - $object->zip = trim($_POST["zipcode"]); - $object->town = trim($_POST["town"]); - $object->state_id = $_POST["state_id"]; - $object->country_id = $_POST["country_id"]; - - $object->phone = trim($_POST["phone"]); - $object->phone_perso = trim($_POST["phone_perso"]); - $object->phone_mobile= trim($_POST["phone_mobile"]); - $object->email = trim($_POST["email"]); - $object->skype = trim($_POST["skype"]); - $object->birth = $birthdate; - - $object->typeid = $_POST["typeid"]; - //$object->note = trim($_POST["comment"]); - $object->morphy = $_POST["morphy"]; - - if (GETPOST('deletephoto')) $object->photo=''; - elseif (! empty($_FILES['photo']['name'])) $object->photo = dol_sanitizeFileName($_FILES['photo']['name']); - - // Get status and public property - $object->statut = $_POST["statut"]; - $object->public = $_POST["public"]; - - // Fill array 'array_options' with data from add form - $ret = $extrafields->setOptionalsFromPost($extralabels,$object); - if ($ret < 0) $error++; - - // Check if we need to also synchronize user information - $nosyncuser=0; - if ($object->user_id) // If linked to a user - { - if ($user->id != $object->user_id && empty($user->rights->user->user->creer)) $nosyncuser=1; // Disable synchronizing - } - - // Check if we need to also synchronize password information - $nosyncuserpass=0; - if ($object->user_id) // If linked to a user - { - if ($user->id != $object->user_id && empty($user->rights->user->user->password)) $nosyncuserpass=1; // Disable synchronizing - } - - $result=$object->update($user,0,$nosyncuser,$nosyncuserpass); - - if ($result >= 0 && ! count($object->errors)) - { - $categories = GETPOST('memcats', 'array'); - $object->setCategories($categories); - - // Logo/Photo save - $dir= $conf->adherent->dir_output . '/' . get_exdir(0,0,0,1,$object,'member').'/photos'; - $file_OK = is_uploaded_file($_FILES['photo']['tmp_name']); - if ($file_OK) - { - if (GETPOST('deletephoto')) - { - require_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; - $fileimg=$conf->adherent->dir_output.'/'.get_exdir(0,0,0,1,$object,'member').'/photos/'.$object->photo; - $dirthumbs=$conf->adherent->dir_output.'/'.get_exdir(0,0,0,1,$object,'member').'/photos/thumbs'; - dol_delete_file($fileimg); - dol_delete_dir_recursive($dirthumbs); - } - - if (image_format_supported($_FILES['photo']['name']) > 0) - { - dol_mkdir($dir); - - if (@is_dir($dir)) - { - $newfile=$dir.'/'.dol_sanitizeFileName($_FILES['photo']['name']); - if (! dol_move_uploaded_file($_FILES['photo']['tmp_name'],$newfile,1,0,$_FILES['photo']['error']) > 0) - { - setEventMessages($langs->trans("ErrorFailedToSaveFile"), null, 'errors'); - } - else - { - // Create thumbs - $object->addThumbs($newfile); - } - } - } - else - { - setEventMessages("ErrorBadImageFormat", null, 'errors'); - } - } - else - { - switch($_FILES['photo']['error']) - { - case 1: //uploaded file exceeds the upload_max_filesize directive in php.ini - case 2: //uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form - $errors[] = "ErrorFileSizeTooLarge"; - break; - case 3: //uploaded file was only partially uploaded - $errors[] = "ErrorFilePartiallyUploaded"; - break; - } - } - - $rowid=$object->id; - $id=$object->id; - $action=''; - - if (! empty($backtopage)) - { - header("Location: ".$backtopage); - exit; - } - } - else - { - setEventMessages($object->error, $object->errors, 'errors'); - $action=''; - } - } - else - { - $action='edit'; - } - } - - if ($action == 'add' && $user->rights->adherent->creer) - { - if ($canvas) $object->canvas=$canvas; - $birthdate=''; - if (isset($_POST["birthday"]) && $_POST["birthday"] - && isset($_POST["birthmonth"]) && $_POST["birthmonth"] - && isset($_POST["birthyear"]) && $_POST["birthyear"]) - { - $birthdate=dol_mktime(12, 0, 0, $_POST["birthmonth"], $_POST["birthday"], $_POST["birthyear"]); - } - $datesubscription=''; - if (isset($_POST["reday"]) && isset($_POST["remonth"]) && isset($_POST["reyear"])) - { - $datesubscription=dol_mktime(12, 0, 0, $_POST["remonth"], $_POST["reday"], $_POST["reyear"]); - } - - $typeid=$_POST["typeid"]; - $civility_id=$_POST["civility_id"]; - $lastname=$_POST["lastname"]; - $firstname=$_POST["firstname"]; - $societe=$_POST["societe"]; - $address=$_POST["address"]; - $zip=$_POST["zipcode"]; - $town=$_POST["town"]; - $state_id=$_POST["state_id"]; - $country_id=$_POST["country_id"]; - - $phone=$_POST["phone"]; - $phone_perso=$_POST["phone_perso"]; - $phone_mobile=$_POST["phone_mobile"]; - $skype=$_POST["member_skype"]; - $email=$_POST["member_email"]; - $login=$_POST["member_login"]; - $pass=$_POST["password"]; - $photo=$_POST["photo"]; - //$comment=$_POST["comment"]; - $morphy=$_POST["morphy"]; - $subscription=$_POST["subscription"]; - $public=$_POST["public"]; - - $userid=$_POST["userid"]; - $socid=$_POST["socid"]; - - $object->civility_id = $civility_id; - $object->firstname = $firstname; - $object->lastname = $lastname; - $object->societe = $societe; - $object->address = $address; - $object->zip = $zip; - $object->town = $town; - $object->state_id = $state_id; - $object->country_id = $country_id; - $object->phone = $phone; - $object->phone_perso = $phone_perso; - $object->phone_mobile= $phone_mobile; - $object->skype = $skype; - $object->email = $email; - $object->login = $login; - $object->pass = $pass; - $object->birth = $birthdate; - $object->photo = $photo; - $object->typeid = $typeid; - //$object->note = $comment; - $object->morphy = $morphy; - $object->user_id = $userid; - $object->fk_soc = $socid; - $object->public = $public; - - // Fill array 'array_options' with data from add form - $ret = $extrafields->setOptionalsFromPost($extralabels,$object); - if ($ret < 0) $error++; - - // Check parameters - if (empty($morphy) || $morphy == "-1") { - $error++; - setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Nature")), null, 'errors'); - } - // Tests if the login already exists - if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) - { - if (empty($login)) { - $error++; - setEventMessages($langs->trans("ErrorFieldRequired", $langs->trans("Login")), null, 'errors'); - } - else { - $sql = "SELECT login FROM ".MAIN_DB_PREFIX."adherent WHERE login='".$db->escape($login)."'"; - $result = $db->query($sql); - if ($result) { - $num = $db->num_rows($result); - } - if ($num) { - $error++; - $langs->load("errors"); - setEventMessages($langs->trans("ErrorLoginAlreadyExists",$login), null, 'errors'); - } - } - if (empty($pass)) { - $error++; - setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Password")), null, 'errors'); - } - } - if ($morphy == 'mor' && empty($societe)) { - $error++; - $langs->load("errors"); - setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Company")), null, 'errors'); - } - if ($morphy != 'mor' && empty($lastname)) { - $error++; - $langs->load("errors"); - setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Lastname")), null, 'errors'); - } - if ($morphy != 'mor' && (!isset($firstname) || $firstname=='')) { - $error++; - $langs->load("errors"); - setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Firstname")), null, 'errors'); - } - if (! ($typeid > 0)) { // Keep () before ! - $error++; - setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Type")), null, 'errors'); - } - if ($conf->global->ADHERENT_MAIL_REQUIRED && ! isValidEMail($email)) { - $error++; - $langs->load("errors"); - setEventMessages($langs->trans("ErrorBadEMail",$email), null, 'errors'); - } - $public=0; - if (isset($public)) $public=1; - - if (! $error) - { - $db->begin(); - - // Email about right and login does not exist - $result=$object->create($user); - if ($result > 0) - { - // Foundation categories - $memcats = GETPOST('memcats', 'array'); - $object->setCategories($memcats); - - $db->commit(); - $rowid=$object->id; - $id=$object->id; - $action=''; - } - else - { - $db->rollback(); - - if ($object->error) { - setEventMessages($object->error, $object->errors, 'errors'); - } else { - setEventMessages($object->error, $object->errors, 'errors'); - } - - $action = 'create'; - } - } - else { - $action = 'create'; - } - } - - if ($user->rights->adherent->supprimer && $action == 'confirm_delete' && $confirm == 'yes') - { - $result=$object->delete($id); - if ($result > 0) - { - if (! empty($backtopage)) - { - header("Location: ".$backtopage); - exit; - } - else - { - header("Location: list.php"); - exit; - } - } - else - { - $errmesg=$object->error; - } - } - - if ($user->rights->adherent->creer && $action == 'confirm_valid' && $confirm == 'yes') - { - $error=0; - - $db->begin(); - - $adht = new AdherentType($db); - $adht->fetch($object->typeid); - - $result=$object->validate($user); - - if ($result >= 0 && ! count($object->errors)) - { - // Send confirmation email (according to parameters of member type. Otherwise generic) - if ($object->email && GETPOST("send_mail")) - { - $result=$object->send_an_email($adht->getMailOnValid(),$conf->global->ADHERENT_MAIL_VALID_SUBJECT,array(),array(),array(),"","",0,2); - if ($result < 0) - { - $error++; - setEventMessages($object->error, $object->errors, 'errors'); - } - } - } - else - { - $error++; - if ($object->error) { - setEventMessages($object->error, $object->errors, 'errors'); - } else { - setEventMessages($object->error, $object->errors, 'errors'); - } - } - - if (! $error) - { - $db->commit(); - } - else - { - $db->rollback(); - } - $action=''; - } - - if ($user->rights->adherent->supprimer && $action == 'confirm_resign') - { - $error = 0; - - if ($confirm == 'yes') - { - $adht = new AdherentType($db); - $adht->fetch($object->typeid); - - $result=$object->resiliate($user); - - if ($result >= 0 && ! count($object->errors)) - { - if ($object->email && GETPOST("send_mail")) - { - $result=$object->send_an_email($adht->getMailOnResiliate(),$conf->global->ADHERENT_MAIL_RESIL_SUBJECT,array(),array(),array(),"","",0,-1); - } - if ($result < 0) - { - $error++; - setEventMessages($object->error, $object->errors, 'errors'); - } - } - else - { - $error++; - - if ($object->error) { - setEventMessages($object->error, $object->errors, 'errors'); - } else { - setEventMessages($object->error, $object->errors, 'errors'); - } - $action=''; - } - } - if (! empty($backtopage) && ! $error) - { - header("Location: ".$backtopage); - exit; - } - } - - // SPIP Management - if ($user->rights->adherent->supprimer && $action == 'confirm_del_spip' && $confirm == 'yes') - { - if (! count($object->errors)) - { - if (!$mailmanspip->del_to_spip($object)) - { - setEventMessages($langs->trans('DeleteIntoSpipError').': '.$mailmanspip->error, null, 'errors'); - } - } - } - - if ($user->rights->adherent->creer && $action == 'confirm_add_spip' && $confirm == 'yes') - { - if (! count($object->errors)) - { - if (!$mailmanspip->add_to_spip($object)) - { - setEventMessages($langs->trans('AddIntoSpipError').': '.$mailmanspip->error, null, 'errors'); - } - } - } - - // Actions to build doc - $upload_dir = $conf->adherent->dir_output; - $permissioncreate=$user->rights->adherent->creer; - include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php'; -} - - -/* - * View - */ - -$form = new Form($db); -$formfile = new FormFile($db); -$formcompany = new FormCompany($db); - -$title=$langs->trans("Member") . " - " . $langs->trans("Card"); -$help_url='EN:Module_Foundations|FR:Module_Adhérents|ES:Módulo_Miembros'; -llxHeader('',$title,$help_url); - -$countrynotdefined=$langs->trans("ErrorSetACountryFirst").' ('.$langs->trans("SeeAbove").')'; - -if (is_object($objcanvas) && $objcanvas->displayCanvasExists($action)) -{ - // ----------------------------------------- - // When used with CANVAS - // ----------------------------------------- - if (empty($object->error) && $id) - { - $object = new Adherent($db); - $result=$object->fetch($id); - if ($result <= 0) dol_print_error('',$object->error); - } - $objcanvas->assign_values($action, $object->id, $object->ref); // Set value for templates - $objcanvas->display_canvas($action); // Show template -} -else -{ - // ----------------------------------------- - // When used in standard mode - // ----------------------------------------- - - if ($action == 'create') - { - /* ************************************************************************** */ - /* */ - /* Creation mode */ - /* */ - /* ************************************************************************** */ - $object->canvas=$canvas; - $object->state_id = GETPOST('state_id', 'int'); - - // We set country_id, country_code and country for the selected country - $object->country_id=GETPOST('country_id','int')?GETPOST('country_id','int'):$mysoc->country_id; - if ($object->country_id) - { - $tmparray=getCountry($object->country_id,'all'); - $object->country_code=$tmparray['code']; - $object->country=$tmparray['label']; - } - - $adht = new AdherentType($db); - - print load_fiche_titre($langs->trans("NewMember")); - - if ($conf->use_javascript_ajax) - { - print "\n".''."\n"; - } - - print '
'; - print ''; - print ''; - - dol_fiche_head(''); - - print ''; - print ''; - - // Login - if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) - { - print ''; - } - - // Type - print '\n"; - - // Morphy - $morphys["phy"] = $langs->trans("Physical"); - $morphys["mor"] = $langs->trans("Moral"); - print '\n"; - - // Company - print ''; - - // Civility - print ''; - print ''; - - // Lastname - print ''; - print ''; - - // Firstname - print ''; - print ''; - - // EMail - print ''; - - // Password - if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) - { - require_once DOL_DOCUMENT_ROOT.'/core/lib/security2.lib.php'; - $generated_password=getRandomPassword(false); - print ''; - } - - // Address - print ''; - - // Zip / Town - print ''; - - // Country - $object->country_id=$object->country_id?$object->country_id:$mysoc->country_id; - print ''; - - // State - if (empty($conf->global->MEMBER_DISABLE_STATE)) - { - print ''; - } - - // Pro phone - print ''; - - // Personal phone - print ''; - - // Mobile phone - print ''; - - // Skype - if (! empty($conf->skype->enabled)) - { - print ''; - } - - // Birthday - print "\n"; - - // Public profil - print "\n"; - - // Categories - if (! empty($conf->categorie->enabled) && ! empty($user->rights->categorie->lire)) - { - print '"; - } - - // Other attributes - $parameters=array(); - $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$object,$action); // Note that $action and $object may have been modified by hook - if (empty($reshook) && ! empty($extrafields->attribute_label)) - { - print $object->showOptionals($extrafields,'edit'); - } - - /* - // Third party Dolibarr - if (! empty($conf->societe->enabled)) - { - print ''; - } - - // Login Dolibarr - print ''; - */ - print ''; - print "
'.$langs->trans("Login").' / '.$langs->trans("Id").'login).'">
'.$langs->trans("MemberType").''; - $listetype=$adht->liste_array(); - if (count($listetype)) - { - print $form->selectarray("typeid", $listetype, GETPOST('typeid','int')?GETPOST('typeid','int'):$typeid, count($listetype)>1?1:0); - } else { - print ''.$langs->trans("NoTypeDefinedGoToSetup").''; - } - print "
'.$langs->trans("Nature")."\n"; - print $form->selectarray("morphy", $morphys, GETPOST('morphy','alpha')?GETPOST('morphy','alpha'):$object->morphy, 1); - print "
'.$langs->trans("Company").'
'.$langs->trans("UserTitle").''; - print $formcompany->select_civility(GETPOST('civility_id','int')?GETPOST('civility_id','int'):$object->civility_id,'civility_id').'
'.$langs->trans("Lastname").'
'.$langs->trans("Firstname").'
'.($conf->global->ADHERENT_MAIL_REQUIRED?'':'').$langs->trans("EMail").($conf->global->ADHERENT_MAIL_REQUIRED?'':'').'
'.$langs->trans("Password").''; - print ''; - print '
'.$langs->trans("Address").''; - print ''; - print '
'.$langs->trans("Zip").' / '.$langs->trans("Town").''; - print $formcompany->select_ziptown((GETPOST('zipcode','alpha')?GETPOST('zipcode','alpha'):$object->zip),'zipcode',array('town','selectcountry_id','state_id'),6); - print ' '; - print $formcompany->select_ziptown((GETPOST('town','alpha')?GETPOST('town','alpha'):$object->town),'town',array('zipcode','selectcountry_id','state_id')); - print '
'.$langs->trans('Country').''; - print $form->select_country(GETPOST('country_id','alpha')?GETPOST('country_id','alpha'):$object->country_id,'country_id'); - if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); - print '
'.$langs->trans('State').''; - if ($object->country_id) - { - print $formcompany->select_state(GETPOST('state_id','int')?GETPOST('state_id','int'):$object->state_id,$object->country_code); - } - else - { - print $countrynotdefined; - } - print '
'.$langs->trans("PhonePro").'
'.$langs->trans("PhonePerso").'
'.$langs->trans("PhoneMobile").'
'.$langs->trans("Skype").'
".$langs->trans("Birthday")."\n"; - $form->select_date(($object->birth ? $object->birth : -1),'birth','','',1,'formsoc'); - print "
".$langs->trans("Public")."\n"; - print $form->selectyesno("public",$object->public,1); - print "
' . fieldLabel('Categories', 'memcars') . ''; - $cate_arbo = $form->select_all_categories(Categorie::TYPE_MEMBER, null, 'parent', null, null, 1); - print $form->multiselectarray('memcats', $cate_arbo, GETPOST('memcats', 'array'), null, null, null, null, '100%'); - print "
'.$langs->trans("LinkedToDolibarrThirdParty").''; - print $form->select_company($object->fk_soc,'socid','',1); - print '
'.$langs->trans("LinkedToDolibarrUser").''; - print $form->select_dolusers($object->user_id, 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); - print '
\n"; - - dol_fiche_end(); - - print '
'; - print ''; - print '     '; - print ''; - print '
'; - - print "
\n"; - } - - if ($action == 'edit') - { - /******************************************** - * - * Edition mode - * - ********************************************/ - - $res=$object->fetch($id); - if ($res < 0) { - dol_print_error($db,$object->error); exit; - } - $res=$object->fetch_optionals($object->id,$extralabels); - if ($res < 0) { - dol_print_error($db); exit; - } - - $adht = new AdherentType($db); - $adht->fetch($object->typeid); - - // We set country_id, and country_code, country of the chosen country - $country=GETPOST('country','int'); - if (!empty($country) || $object->country_id) - { - $sql = "SELECT rowid, code, label from ".MAIN_DB_PREFIX."c_country where rowid = ".(!empty($country)?$country:$object->country_id); - $resql=$db->query($sql); - if ($resql) - { - $obj = $db->fetch_object($resql); - } - else - { - dol_print_error($db); - } - $object->country_id=$obj->rowid; - $object->country_code=$obj->code; - $object->country=$langs->trans("Country".$obj->code)?$langs->trans("Country".$obj->code):$obj->label; - } - - $head = member_prepare_head($object); - - - if ($conf->use_javascript_ajax) - { - print "\n".''."\n"; - } - - print '
'; - print ''; - print ''; - print ''; - print ''; - if ($backtopage) print ''; - - dol_fiche_head($head, 'general', $langs->trans("Member"), 0, 'user'); - - print ''; - - // Ref - print ''; - - // Login - if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) - { - print ''; - } - - // Morphy - $morphys["phy"] = $langs->trans("Physical"); - $morphys["mor"] = $langs->trans("Morale"); - print '"; - - // Type - print '"; - - // Company - print ''; - - // Civility - print ''; - print ''; - - // Lastname - print ''; - print ''; - - // Firstname - print ''; - print ''; - - // Photo - print ''; - print ''; - - // EMail - print ''; - - // Password - if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) - { - print ''; - } - - // Address - print ''; - - // Zip / Town - print ''; - - // Country - //$object->country_id=$object->country_id?$object->country_id:$mysoc->country_id; // In edit mode we don't force to company country if not defined - print ''; - - // State - if (empty($conf->global->MEMBER_DISABLE_STATE)) - { - print ''; - } - - // Pro phone - print ''; - - // Personal phone - print ''; - - // Mobile phone - print ''; - - // Skype - if (! empty($conf->skype->enabled)) - { - print ''; - } - - // Birthday - print "\n"; - - // Public profil - print "\n"; - - // Categories - if (! empty( $conf->categorie->enabled ) && !empty( $user->rights->categorie->lire )) - { - print ''; - print '"; - } - - // Other attributes - $parameters=array("colspan"=>2); - $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$object,$action); // Note that $action and $object may have been modified by hook - if (empty($reshook) && ! empty($extrafields->attribute_label)) - { - print $object->showOptionals($extrafields,'edit',$parameters); - } - - // Third party Dolibarr - if (! empty($conf->societe->enabled)) - { - print ''; - } - - // Login Dolibarr - print ''; - - print '
'.$langs->trans("Ref").''.$object->id.'
'.$langs->trans("Login").' / '.$langs->trans("Id").'login).'">
'.$langs->trans("Nature").''; - print $form->selectarray("morphy", $morphys, isset($_POST["morphy"])?$_POST["morphy"]:$object->morphy); - print "
'.$langs->trans("Type").''; - if ($user->rights->adherent->creer) - { - print $form->selectarray("typeid", $adht->liste_array(), (isset($_POST["typeid"])?$_POST["typeid"]:$object->typeid)); - } - else - { - print $adht->getNomUrl(1); - print ''; - } - print "
'.$langs->trans("Company").'societe).'">
'.$langs->trans("UserTitle").''; - print $formcompany->select_civility(isset($_POST["civility_id"])?$_POST["civility_id"]:$object->civility_id)."\n"; - print '
'.$langs->trans("Lastname").'lastname).'">
'.$langs->trans("Firstname").'firstname).'">
'.$langs->trans("Photo").''; - print $form->showphoto('memberphoto',$object)."\n"; - if ($caneditfieldmember) - { - if ($object->photo) print "
\n"; - print ''; - if ($object->photo) print ''; - print ''; - print ''; - print '
'.$langs->trans("Delete").'

'.$langs->trans("PhotoFile").'
'; - } - print '
'.($conf->global->ADHERENT_MAIL_REQUIRED?'':'').$langs->trans("EMail").($conf->global->ADHERENT_MAIL_REQUIRED?'':'').'email).'">
'.$langs->trans("Password").'pass).'">
'.$langs->trans("Address").''; - print ''; - print '
'.$langs->trans("Zip").' / '.$langs->trans("Town").''; - print $formcompany->select_ziptown((isset($_POST["zipcode"])?GETPOST("zipcode",'',2):$object->zip),'zipcode',array('town','selectcountry_id','state_id'),6); - print ' '; - print $formcompany->select_ziptown((isset($_POST["town"])?GETPOST("town",'',2):$object->town),'town',array('zipcode','selectcountry_id','state_id')); - print '
'.$langs->trans('Country').''; - print $form->select_country(isset($_POST["country_id"])?$_POST["country_id"]:$object->country_id,'country_id'); - if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); - print '
'.$langs->trans('State').''; - print $formcompany->select_state($object->state_id,isset($_POST["country_id"])?GETPOST("country_id"):$object->country_id); - print '
'.$langs->trans("PhonePro").'phone).'">
'.$langs->trans("PhonePerso").'phone_perso).'">
'.$langs->trans("PhoneMobile").'phone_mobile).'">
'.$langs->trans("Skype").'skype).'">
".$langs->trans("Birthday")."\n"; - $form->select_date(($object->birth ? $object->birth : -1),'birth','','',1,'formsoc'); - print "
".$langs->trans("Public")."\n"; - print $form->selectyesno("public",(isset($_POST["public"])?GETPOST("public",'',2):$object->public),1); - print "
' . fieldLabel('Categories', 'memcats') . ''; - $cate_arbo = $form->select_all_categories(Categorie::TYPE_MEMBER, null, null, null, null, 1); - $c = new Categorie($db); - $cats = $c->containing($object->id, Categorie::TYPE_MEMBER); - foreach ($cats as $cat) { - $arrayselected[] = $cat->id; - } - print $form->multiselectarray('memcats', $cate_arbo, $arrayselected, '', 0, '', 0, '100%'); - print "
'.$langs->trans("LinkedToDolibarrThirdParty").''; - if ($object->fk_soc) - { - $company=new Societe($db); - $result=$company->fetch($object->fk_soc); - print $company->getNomUrl(1); - } - else - { - print $langs->trans("NoThirdPartyAssociatedToMember"); - } - print '
'.$langs->trans("LinkedToDolibarrUser").''; - if ($object->user_id) - { - $form->form_users($_SERVER['PHP_SELF'].'?rowid='.$object->id,$object->user_id,'none'); - } - else print $langs->trans("NoDolibarrAccess"); - print '
'; - - dol_fiche_end(); - - print '
'; - print ''; - print '     '; - print ''; - print '
'; - - print '
'; - - } - - if ($id > 0 && $action != 'edit') - { - /* ************************************************************************** */ - /* */ - /* View mode */ - /* */ - /* ************************************************************************** */ - - $res=$object->fetch($id); - if ($res < 0) { - dol_print_error($db,$object->error); exit; - } - $res=$object->fetch_optionals($object->id,$extralabels); - if ($res < 0) { - dol_print_error($db); exit; - } - - $adht = new AdherentType($db); - $res=$adht->fetch($object->typeid); - if ($res < 0) { - dol_print_error($db); exit; - } - - - /* - * Show tabs - */ - $head = member_prepare_head($object); - - dol_fiche_head($head, 'general', $langs->trans("Member"), 0, 'user'); - - // Confirm create user - if ($action == 'create_user') - { - $login=$object->login; - if (empty($login)) - { - // Full firstname and name separated with a dot : firstname.name - include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; - $login=dol_buildlogin($object->lastname,$object->firstname); - } - if (empty($login)) $login=strtolower(substr($object->firstname, 0, 4)) . strtolower(substr($object->lastname, 0, 4)); - - // Create a form array - $formquestion=array( - array('label' => $langs->trans("LoginToCreate"), 'type' => 'text', 'name' => 'login', 'value' => $login) - ); - $text=$langs->trans("ConfirmCreateLogin").'
'; - if (! empty($conf->societe->enabled)) - { - if ($object->fk_soc > 0) $text.=$langs->trans("UserWillBeExternalUser"); - else $text.=$langs->trans("UserWillBeInternalUser"); - } - print $form->formconfirm($_SERVER["PHP_SELF"]."?rowid=".$object->id,$langs->trans("CreateDolibarrLogin"),$text,"confirm_create_user",$formquestion,'yes'); - } - - // Confirm create third party - if ($action == 'create_thirdparty') - { - $name = $object->getFullName($langs); - if (! empty($name)) - { - if ($object->societe) $name.=' ('.$object->societe.')'; - } - else - { - $name=$object->societe; - } - - // Create a form array - $formquestion=array( array('label' => $langs->trans("NameToCreate"), 'type' => 'text', 'name' => 'companyname', 'value' => $name)); - - print $form->formconfirm($_SERVER["PHP_SELF"]."?rowid=".$object->id,$langs->trans("CreateDolibarrThirdParty"),$langs->trans("ConfirmCreateThirdParty"),"confirm_create_thirdparty",$formquestion,1); - } - - // Confirm validate member - if ($action == 'valid') - { - $langs->load("mails"); - - $adht = new AdherentType($db); - $adht->fetch($object->typeid); - - $subjecttosend=$object->makeSubstitution($conf->global->ADHERENT_MAIL_VALID_SUBJECT); - $texttosend=$object->makeSubstitution($adht->getMailOnValid()); - - $tmp=$langs->trans("SendAnEMailToMember"); - $tmp.='
('.$langs->trans("MailFrom").': '.$conf->global->ADHERENT_MAIL_FROM.', '; - $tmp.=$langs->trans("MailRecipient").': '.$object->email.')'; - $helpcontent=''; - $helpcontent.=''.$langs->trans("MailFrom").': '.$conf->global->ADHERENT_MAIL_FROM.'
'."\n"; - $helpcontent.=''.$langs->trans("MailRecipient").': '.$object->email.'
'."\n"; - $helpcontent.=''.$langs->trans("Subject").':
'."\n"; - $helpcontent.=$subjecttosend."\n"; - $helpcontent.="
"; - $helpcontent.=''.$langs->trans("Content").':
'; - $helpcontent.=dol_htmlentitiesbr($texttosend)."\n"; - $label=$form->textwithpicto($tmp,$helpcontent,1,'help'); - - // Create form popup - $formquestion=array(); - if ($object->email) $formquestion[]=array('type' => 'checkbox', 'name' => 'send_mail', 'label' => $label, 'value' => ($conf->global->ADHERENT_DEFAULT_SENDINFOBYMAIL?true:false)); - if (! empty($conf->mailman->enabled) && ! empty($conf->global->ADHERENT_USE_MAILMAN)) { - $formquestion[]=array('type'=>'other','label'=>$langs->transnoentitiesnoconv("SynchroMailManEnabled"),'value'=>''); - } - if (! empty($conf->mailman->enabled) && ! empty($conf->global->ADHERENT_USE_SPIP)) { - $formquestion[]=array('type'=>'other','label'=>$langs->transnoentitiesnoconv("SynchroSpipEnabled"),'value'=>''); - } - print $form->formconfirm("card.php?rowid=".$id,$langs->trans("ValidateMember"),$langs->trans("ConfirmValidateMember"),"confirm_valid",$formquestion,1,1); - } - - // Confirm send card by mail - if ($action == 'sendinfo') - { - print $form->formconfirm("card.php?rowid=".$id,$langs->trans("SendCardByMail"),$langs->trans("ConfirmSendCardByMail",$object->email),"confirm_sendinfo",'',0,1); - } - - // Confirm terminate - if ($action == 'resign') - { - $langs->load("mails"); - - $adht = new AdherentType($db); - $adht->fetch($object->typeid); - - $subjecttosend=$object->makeSubstitution($conf->global->ADHERENT_MAIL_RESIL_SUBJECT); - $texttosend=$object->makeSubstitution($adht->getMailOnResiliate()); - - $tmp=$langs->trans("SendAnEMailToMember"); - $tmp.='
('.$langs->trans("MailFrom").': '.$conf->global->ADHERENT_MAIL_FROM.', '; - $tmp.=$langs->trans("MailRecipient").': '.$object->email.')'; - $helpcontent=''; - $helpcontent.=''.$langs->trans("MailFrom").': '.$conf->global->ADHERENT_MAIL_FROM.'
'."\n"; - $helpcontent.=''.$langs->trans("MailRecipient").': '.$object->email.'
'."\n"; - $helpcontent.=''.$langs->trans("Subject").':
'."\n"; - $helpcontent.=$subjecttosend."\n"; - $helpcontent.="
"; - $helpcontent.=''.$langs->trans("Content").':
'; - $helpcontent.=dol_htmlentitiesbr($texttosend)."\n"; - $label=$form->textwithpicto($tmp,$helpcontent,1,'help'); - - // Create an array - $formquestion=array(); - if ($object->email) $formquestion[]=array('type' => 'checkbox', 'name' => 'send_mail', 'label' => $label, 'value' => (! empty($conf->global->ADHERENT_DEFAULT_SENDINFOBYMAIL)?'true':'false')); - if ($backtopage) $formquestion[]=array('type' => 'hidden', 'name' => 'backtopage', 'value' => ($backtopage != '1' ? $backtopage : $_SERVER["HTTP_REFERER"])); - print $form->formconfirm("card.php?rowid=".$id,$langs->trans("ResiliateMember"),$langs->trans("ConfirmResiliateMember"),"confirm_resign",$formquestion,'no',1); - } - - // Confirm remove member - if ($action == 'delete') - { - $formquestion=array(); - if ($backtopage) $formquestion[]=array('type' => 'hidden', 'name' => 'backtopage', 'value' => ($backtopage != '1' ? $backtopage : $_SERVER["HTTP_REFERER"])); - print $form->formconfirm("card.php?rowid=".$id,$langs->trans("DeleteMember"),$langs->trans("ConfirmDeleteMember"),"confirm_delete",$formquestion,0,1); - } - - // Confirm add in spip - if ($action == 'add_spip') - { - print $form->formconfirm("card.php?rowid=".$id, $langs->trans('AddIntoSpip'), $langs->trans('AddIntoSpipConfirmation'), 'confirm_add_spip'); - } - // Confirm removed from spip - if ($action == 'del_spip') - { - print $form->formconfirm("card.php?rowid=$id", $langs->trans('DeleteIntoSpip'), $langs->trans('DeleteIntoSpipConfirmation'), 'confirm_del_spip'); - } - - $rowspan=17; - if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) $rowspan++; - if (! empty($conf->societe->enabled)) $rowspan++; - - $linkback = ''.$langs->trans("BackToList").''; - - dol_banner_tab($object, 'rowid', $linkback); - - print '
'; - print '
'; - - print '
'; - print ''; - - // Login - if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) - { - print ''; - } - - // Type - print '\n"; - - // Morphy - print ''; - print ''; - - // Company - print ''; - - // Civility - print ''; - print ''; - - // Password - if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) - { - print ''; - } - - print '
'.$langs->trans("Login").' / '.$langs->trans("Id").''.$object->login.' 
'.$langs->trans("Type").''.$adht->getNomUrl(1)."
'.$langs->trans("Nature").''.$object->getmorphylib().'
'.$langs->trans("Company").''.$object->societe.'
'.$langs->trans("UserTitle").''.$object->getCivilityLabel().' 
'.$langs->trans("Password").''.preg_replace('/./i','*',$object->pass); - if ($object->pass) print preg_replace('/./i','*',$object->pass); - else - { - if ($user->admin) print $langs->trans("Crypted").': '.$object->pass_indatabase_crypted; - else print $langs->trans("Hidden"); - } - if ((! empty($object->pass) || ! empty($object->pass_crypted)) && empty($object->user_id)) - { - $langs->load("errors"); - $htmltext=$langs->trans("WarningPasswordSetWithNoAccount"); - print ' '.$form->textwithpicto('', $htmltext,1,'warning'); - } - print '
'; - - print '
'; - print '
'; - - print '
'; - print ''; - - // Birthday - print ''; - - // Public - print ''; - - // Categories - if (! empty($conf->categorie->enabled) && ! empty($user->rights->categorie->lire)) - { - print ''; - print ''; - } - - // Other attributes - $parameters=array('colspan'=>2); - $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$object,$action); // Note that $action and $object may have been modified by hook - if (empty($reshook) && ! empty($extrafields->attribute_label)) - { - print $object->showOptionals($extrafields, 'view', $parameters); - } - - // Date end subscription - print ''; - - // Third party Dolibarr - if (! empty($conf->societe->enabled)) - { - print ''; - } - - // Login Dolibarr - print ''; - - print "
'.$langs->trans("Birthday").''.dol_print_date($object->birth,'day').'
'.$langs->trans("Public").''.yn($object->public).'
' . $langs->trans("Categories") . ''; - print $form->showCategories($object->id, 'member', 1); - print '
'.$langs->trans("SubscriptionEndDate").''; - if ($object->datefin) - { - print dol_print_date($object->datefin,'day'); - if ($object->hasDelay()) { - print " ".img_warning($langs->trans("Late")); - } - } - else - { - if (! $adht->subscription) - { - print $langs->trans("SubscriptionNotRecorded"); - if ($object->statut > 0) print " ".img_warning($langs->trans("Late")); // displays delay Pictogram only if not a draft and not terminated - } - else - { - print $langs->trans("SubscriptionNotReceived"); - if ($object->statut > 0) print " ".img_warning($langs->trans("Late")); // displays delay Pictogram only if not a draft and not terminated - } - } - print '
'; - print ''; - if ($action != 'editthirdparty' && $user->rights->adherent->creer) print ''; - print '
'; - print $langs->trans("LinkedToDolibarrThirdParty"); - print 'id.'">'.img_edit($langs->trans('SetLinkToThirdParty'),1).'
'; - print '
'; - if ($action == 'editthirdparty') - { - $htmlname='socid'; - print '
'; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print '
'; - print $form->select_company($object->fk_soc,'socid','',1); - print '
'; - } - else - { - if ($object->fk_soc) - { - $company=new Societe($db); - $result=$company->fetch($object->fk_soc); - print $company->getNomUrl(1); - } - else - { - print $langs->trans("NoThirdPartyAssociatedToMember"); - } - } - print '
'; - print ''; - if ($action != 'editlogin' && $user->rights->adherent->creer) - { - print ''; - } - print '
'; - print $langs->trans("LinkedToDolibarrUser"); - print ''; - if ($user->rights->user->user->creer) - { - print 'id.'">'.img_edit($langs->trans('SetLinkToUser'),1).''; - } - print '
'; - print '
'; - if ($action == 'editlogin') - { - $form->form_users($_SERVER['PHP_SELF'].'?rowid='.$object->id,$object->user_id,'userid',''); - } - else - { - if ($object->user_id) - { - $form->form_users($_SERVER['PHP_SELF'].'?rowid='.$object->id,$object->user_id,'none'); - } - else print $langs->trans("NoDolibarrAccess"); - } - print '
\n"; - - print "
\n"; - print '
'; - - dol_fiche_end(); - - - /* - * Hotbar - */ - - print '
'; - $parameters = array(); - $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been - if (empty($reshook)) { - if ($action != 'valid' && $action != 'editlogin' && $action != 'editthirdparty') - { - // Modify - if ($user->rights->adherent->creer) - { - print '"; - } - else - { - print '
'.$langs->trans("Modify").'
'; - } - - // Validate - if ($object->statut == -1) - { - if ($user->rights->adherent->creer) - { - print '\n"; - } - else - { - print '
'.$langs->trans("Validate").'
'; - } - } - - // Reactivate - if ($object->statut == 0) - { - if ($user->rights->adherent->creer) - { - print '\n"; - } - else - { - print '
'.$langs->trans("Reenable")."
"; - } - } - - // Send card by email - if ($user->rights->adherent->creer) - { - if ($object->statut >= 1) - { - if ($object->email) print '\n"; - else print '\n"; - } - else - { - print '
'.$langs->trans("SendCardByMail")."
"; - } - } - else - { - print '
'.$langs->trans("SendCardByMail")."
"; - } - - // Terminate - if ($object->statut >= 1) - { - if ($user->rights->adherent->supprimer) - { - print '\n"; - } - else - { - print '
'.$langs->trans("Resiliate")."
"; - } - } - - // Create third party - if (! empty($conf->societe->enabled) && ! $object->fk_soc) - { - if ($user->rights->societe->creer) - { - if ($object->statut != -1) print ''; - else print ''; - } - else - { - print '
'.$langs->trans("CreateDolibarrThirdParty")."
"; - } - } - - // Create user - if (! $user->societe_id && ! $object->user_id) - { - if ($user->rights->user->user->creer) - { - if ($object->statut != -1) print ''; - else print ''; - } - else - { - print '
'.$langs->trans("CreateDolibarrLogin")."
"; - } - } - - // Delete - if ($user->rights->adherent->supprimer) - { - print '\n"; - } - else - { - print '
'.$langs->trans("Delete")."
"; - } - - // Action SPIP - if (! empty($conf->mailmanspip->enabled) && ! empty($conf->global->ADHERENT_USE_SPIP)) - { - $isinspip = $mailmanspip->is_in_spip($object); - - if ($isinspip == 1) - { - print '\n"; - } - if ($isinspip == 0) - { - print '\n"; - } - } - - } - } - print '
'; - - if ($isinspip == -1) - { - print '

'.$langs->trans('SPIPConnectionFailed').': '.$mailmanspip->error.''; - } - - - - print '
'; - print ''; // ancre - - // Documents generes - $filename = dol_sanitizeFileName($object->ref); - //$filename = 'tmp_cards.php'; - //$filedir = $conf->adherent->dir_output . '/' . get_exdir($object->id, 2, 0, 0, $object, 'member') . dol_sanitizeFileName($object->ref); - $filedir = $conf->adherent->dir_output . '/' . get_exdir(0, 0, 0, 0, $object, 'member'); - $urlsource = $_SERVER['PHP_SELF'] . '?id=' . $object->id; - $genallowed = $user->rights->adherent->creer; - $delallowed = $user->rights->adherent->supprimer; - - print $formfile->showdocuments('member', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', '', '', $object->default_lang, '', $object); - $somethingshown = $formfile->numoffiles; - - // Show links to link elements - //$linktoelem = $form->showLinkToObjectBlock($object, null, array('subscription')); - //$somethingshown = $form->showLinkedObjectBlock($object, ''); - - // Show links to link elements - /*$linktoelem = $form->showLinkToObjectBlock($object,array('order')); - if ($linktoelem) print ($somethingshown?'':'
').$linktoelem; - - // Link for paypal payment - /* - if (! empty($conf->paypal->enabled) && $object->statut != 0) { - include_once DOL_DOCUMENT_ROOT . '/paypal/lib/paypal.lib.php'; - print showPaypalPaymentUrl('invoice', $object->ref); - } - */ - print '
'; - - // List of actions on element - /* Already in tab Agenda/Events - include_once DOL_DOCUMENT_ROOT . '/core/class/html.formactions.class.php'; - $formactions = new FormActions($db); - $somethingshown = $formactions->showactions($object, 'member', $socid); - */ - print '
'; - - } -} - -llxFooter(); - -$db->close(); diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 8462cdc76ff..30e1579c33e 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -615,19 +615,20 @@ function dol_buildpath($path, $type=0) } /** - * Create a clone of instance of object (new instance with same properties) - * This function works for both PHP4 and PHP5 + * Create a clone of instance of object (new instance with same value for properties) + * Property that are reference are also new object (true clone) * * @param object $object Object to clone * @return object Object clone - * @deprecated Dolibarr no longer supports PHP4, use PHP5 native clone construct * @see https://php.net/manual/language.oop5.cloning.php */ function dol_clone($object) { - dol_syslog(__FUNCTION__ . " is deprecated", LOG_WARNING); + //dol_syslog(__FUNCTION__ . " is deprecated", LOG_WARNING); - $myclone = clone $object; + //$myclone = clone $object; // PHP clone is a shallow copy only, not a real clone, so properties of references will keep references (refer to the same target/variable + $myclone=unserialize(serialize($object)); + return $myclone; } @@ -2469,7 +2470,7 @@ function dol_trunc($string,$size=40,$trunc='right',$stringencoding='UTF-8',$nodo if ($trunc == 'right') { $newstring=dol_textishtml($string)?dol_string_nohtmltag($string,1):$string; - if (dol_strlen($newstring,$stringencoding) > ($size+($nodot?0:1))) + if (dol_strlen($newstring,$stringencoding) > ($size+($nodot?0:1))) return dol_substr($newstring,0,$size,$stringencoding).($nodot?'':'...'); else return $string; diff --git a/test/phpunit/AllTests.php b/test/phpunit/AllTests.php index de8cc397cf4..a417824867b 100644 --- a/test/phpunit/AllTests.php +++ b/test/phpunit/AllTests.php @@ -121,7 +121,7 @@ class AllTests $suite->addTestSuite('BuildDocTest'); require_once dirname(__FILE__).'/CMailFileTest.php'; $suite->addTestSuite('CMailFileTest'); - + require_once dirname(__FILE__).'/CommonObjectTest.php'; $suite->addTestSuite('CommonObjectTest'); diff --git a/test/phpunit/FilesLibTest.php b/test/phpunit/FilesLibTest.php index d1a5f48ae8d..c0a4ce845a9 100644 --- a/test/phpunit/FilesLibTest.php +++ b/test/phpunit/FilesLibTest.php @@ -431,10 +431,17 @@ class FilesLibTest extends PHPUnit_Framework_TestCase $user=$this->savuser; $langs=$this->savlangs; $db=$this->savdb; - + + //$dummyuser=new User($db); //$result=restrictedArea($dummyuser,'societe'); + // We save user properties + $savpermlire = $user->rights->facture->lire; + $savpermcreer = $user->rights->facture->creer; + + + // Check access to SPECIMEN $user->rights->facture->lire = 0; $user->rights->facture->creer = 0; $filename='SPECIMEN.pdf'; // Filename relative to module part @@ -473,6 +480,11 @@ class FilesLibTest extends PHPUnit_Framework_TestCase $filename='FA010101/FA010101.pdf'; // Filename relative to module part $result=dol_check_secure_access_document('facture', $filename, 0, '', '', 'write'); $this->assertEquals(0,$result['accessallowed']); + + + // We restore user properties + $user->rights->facture->lire = $savpermlire; + $user->rights->facture->creer = $savpermcreer; } } diff --git a/test/phpunit/NumberingModulesTest.php b/test/phpunit/NumberingModulesTest.php index d7f3eaf611c..401b7ce0058 100644 --- a/test/phpunit/NumberingModulesTest.php +++ b/test/phpunit/NumberingModulesTest.php @@ -128,7 +128,7 @@ class NumberingModulesTest extends PHPUnit_Framework_TestCase $user=$this->savuser; $langs=$this->savlangs; $db=$this->savdb; - + require_once dirname(__FILE__).'/../../htdocs/compta/facture/class/facture.class.php'; require_once dirname(__FILE__).'/../../htdocs/core/modules/facture/mod_facture_mercure.php'; @@ -138,8 +138,8 @@ class NumberingModulesTest extends PHPUnit_Framework_TestCase $conf->global->FACTURE_MERCURE_MASK_CREDIT='{yyyy}-{0000}'; $conf->global->FACTURE_MERCURE_MASK_INVOICE='{yyyy}-{0000}'; $conf->global->INVOICE_CAN_ALWAYS_BE_REMOVED=0; - - $localobject=new Facture($this->savdb); + + $localobject=new Facture($this->savdb); $localobject->initAsSpecimen(); $localobject->date=dol_mktime(12, 0, 0, 1, 1, 1915); // we use year 1915 to be sure to not have existing invoice for this year $numbering=new mod_facture_mercure(); @@ -154,10 +154,6 @@ class NumberingModulesTest extends PHPUnit_Framework_TestCase $result=$localobject->is_erasable(); print __METHOD__." is_erasable=".$result."\n"; $this->assertEquals(1, $result, 'Test for is_erasable, 1st invoice'); // Can be deleted - - $out=file_get_contents(DOL_DATA_ROOT.'/dolibarr.log'); - print $out; - $localobject2=new Facture($this->savdb); $localobject2->initAsSpecimen(); $localobject2->date=dol_mktime(12, 0, 0, 1, 1, 1916); // we use following year for second invoice (there is no reset into mask) From dd5976066a6fe052f13d80238347a0d8ee7c0756 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 22 May 2017 02:04:43 +0200 Subject: [PATCH 224/299] Fix travis --- test/phpunit/AdherentTest.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/phpunit/AdherentTest.php b/test/phpunit/AdherentTest.php index b998c346b7b..5db9808c9ab 100644 --- a/test/phpunit/AdherentTest.php +++ b/test/phpunit/AdherentTest.php @@ -322,9 +322,10 @@ class AdherentTest extends PHPUnit_Framework_TestCase '%ADDRESS%,%ZIP%,%TOWN%,%COUNTRY%,%EMAIL%,%BIRTH%,%PHOTO%,%LOGIN%,%PASSWORD%,%PRENOM%,'. '%NOM%,%SOCIETE%,%ADDRESS%,%ZIP%,%TOWN%,%COUNTRY%'; + // If option to store clear password has been set, we get 'dolibspec' into PASSWORD field. $expected = DOL_MAIN_URL_ROOT.','.$localobject->id.',,New firstname,New name,New firstname New name,'. 'New company,New address,New zip,New town,Belgium,newemail@newemail.com,'.dol_print_date($localobject->birth,'day').',,'. - 'newlogin,,New firstname,New name,New company,New address,New zip,New town,Belgium'; + 'newlogin,dolibspec,New firstname,New name,New company,New address,New zip,New town,Belgium'; $result = $localobject->makeSubstitution($template); print __METHOD__." result=".$result."\n"; From 9bc60b8aa5d738d99ebcec0e25ff72d97aba8e20 Mon Sep 17 00:00:00 2001 From: phf Date: Mon, 22 May 2017 09:26:10 +0200 Subject: [PATCH 225/299] Fix missing column ref on migration for inventory --- htdocs/install/mysql/migration/5.0.0-6.0.0.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index 0bd68ddfcfb..67ad5017999 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -326,3 +326,4 @@ ALTER TABLE llx_facture ADD COLUMN fk_fac_rec_source integer; DELETE from llx_c_actioncomm where code in ('AC_PROP','AC_COM','AC_FAC','AC_SHIP','AC_SUP_ORD','AC_SUP_INV') AND id NOT IN (SELECT DISTINCT fk_action FROM llx_actioncomm); +ALTER TABLE llx_inventory ADD COLUMN ref varchar(48); \ No newline at end of file From f72ac3cf456d11b66c99bb38100ee3ab89e94fa0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 22 May 2017 10:07:29 +0200 Subject: [PATCH 226/299] Fix php7 compatibility --- htdocs/api/class/api_documents.class.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/htdocs/api/class/api_documents.class.php b/htdocs/api/class/api_documents.class.php index 9794dad4a12..eb6380a19e4 100644 --- a/htdocs/api/class/api_documents.class.php +++ b/htdocs/api/class/api_documents.class.php @@ -49,20 +49,23 @@ class Documents extends DolibarrApi $this->db = $db; } + /** * Return a document * * @param string $module_part Module part for file * @param string $filename File name - * + * + * @url GET {module_part}/{filename} + * * @return array Array with data of file * @throws RestException */ - public function index($module_part, $filename) { - return array('note'=>'FeatureNotYetAvailable'); - } - - + public function get($module_part, $filename) { + return array('note'=>'FeatureNotYetAvailable'); + } + + /** * Push a file. * Test sample 1: { "filename": "mynewfile.txt", "modulepart": "facture", "ref": "FA1701-001", "subdir": "", "filecontent": "content text", "fileencoding": "", "overwriteifexists": "0" }. From 8301e24261a5c5660ed2d018dbe93c6f2028c7f3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 22 May 2017 10:40:24 +0200 Subject: [PATCH 227/299] PHP7 compatibility --- htdocs/api/class/api.class.php | 3 +- htdocs/api/class/api_documents.class.php | 38 ++++++++++++------- .../bank/class/api_bankaccounts.class.php | 3 +- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/htdocs/api/class/api.class.php b/htdocs/api/class/api.class.php index 082e6188379..190e24d326c 100644 --- a/htdocs/api/class/api.class.php +++ b/htdocs/api/class/api.class.php @@ -66,6 +66,7 @@ class DolibarrApi * * @return array */ + /* Disabled, most APIs does not share same signature for method index function index() { return array( @@ -74,7 +75,7 @@ class DolibarrApi 'message' => __class__.' is up and running!' ) ); - } + }*/ /** diff --git a/htdocs/api/class/api_documents.class.php b/htdocs/api/class/api_documents.class.php index eb6380a19e4..e26486981fa 100644 --- a/htdocs/api/class/api_documents.class.php +++ b/htdocs/api/class/api_documents.class.php @@ -36,8 +36,7 @@ class Documents extends DolibarrApi * @var array $DOCUMENT_FIELDS Mandatory fields, checked when create and update object */ static $DOCUMENT_FIELDS = array( - 'modulepart', - 'filename' + 'modulepart' ); /** @@ -49,23 +48,36 @@ class Documents extends DolibarrApi $this->db = $db; } - + /** - * Return a document + * Return list of documents. + * + * @param string $module_part Name of module or area concerned by file download ('facture', ...) + * @param string $ref Reference of object (This will define subdir automatically) + * @param string $subdir Subdirectory (Only if ref not provided) + * @return array List of documents * - * @param string $module_part Module part for file - * @param string $filename File name - * - * @url GET {module_part}/{filename} - * - * @return array Array with data of file * @throws RestException */ - public function get($module_part, $filename) { + public function index($module_part, $ref='', $subdir='') { return array('note'=>'FeatureNotYetAvailable'); } - - + + + /** + * Return a document. + * + * @param int $id ID of document + * @return array Array with data of file + * + * @throws RestException + */ + /* + public function get($id) { + return array('note'=>'xxx'); + }*/ + + /** * Push a file. * Test sample 1: { "filename": "mynewfile.txt", "modulepart": "facture", "ref": "FA1701-001", "subdir": "", "filecontent": "content text", "fileencoding": "", "overwriteifexists": "0" }. diff --git a/htdocs/compta/bank/class/api_bankaccounts.class.php b/htdocs/compta/bank/class/api_bankaccounts.class.php index 7eaf673c2e7..10994d7d525 100644 --- a/htdocs/compta/bank/class/api_bankaccounts.class.php +++ b/htdocs/compta/bank/class/api_bankaccounts.class.php @@ -98,7 +98,8 @@ class BankAccounts extends DolibarrApi if ($result) { $num = $this->db->num_rows($result); - for ($i = 0; $i < min($num, ($limit <= 0 ? $num : $limit)); $i++) { + $minnum = min($num, ($limit <= 0 ? $num : $limit)); + for ($i = 0; $i < $minnum; $i++) { $obj = $this->db->fetch_object($result); $account = new Account($this->db); if ($account->fetch($obj->rowid) > 0) { From f5e29d6c86ad885301fa96528baa4c853269e3d0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 22 May 2017 10:45:02 +0200 Subject: [PATCH 228/299] Fix phpcs warning --- htdocs/categories/class/api_categories.class.php | 6 ++++-- htdocs/categories/class/api_deprecated_category.class.php | 6 ++++-- htdocs/comm/action/class/api_agendaevents.class.php | 3 ++- htdocs/comm/propal/class/api_proposals.class.php | 3 ++- htdocs/commande/class/api_deprecated_commande.class.php | 3 ++- htdocs/commande/class/api_orders.class.php | 3 ++- htdocs/compta/bank/class/api_bankaccounts.class.php | 4 ++-- .../compta/facture/class/api_deprecated_invoice.class.php | 3 ++- htdocs/compta/facture/class/api_invoices.class.php | 3 ++- htdocs/expensereport/class/api_expensereports.class.php | 3 ++- htdocs/fourn/class/api_supplier_invoices.class.php | 3 ++- htdocs/product/class/api_deprecated_product.class.php | 6 ++++-- htdocs/product/class/api_products.class.php | 3 ++- htdocs/product/stock/class/api_stockmovements.class.php | 3 ++- htdocs/product/stock/class/api_warehouses.class.php | 3 ++- htdocs/projet/class/api_projects.class.php | 3 ++- htdocs/projet/class/api_tasks.class.php | 3 ++- htdocs/societe/class/api_contacts.class.php | 3 ++- htdocs/societe/class/api_deprecated_contact.class.php | 3 ++- htdocs/societe/class/api_deprecated_thirdparty.class.php | 3 ++- htdocs/societe/class/api_thirdparties.class.php | 3 ++- htdocs/user/class/api_users.class.php | 3 ++- 22 files changed, 50 insertions(+), 26 deletions(-) diff --git a/htdocs/categories/class/api_categories.class.php b/htdocs/categories/class/api_categories.class.php index a08abdfc545..fc7aca368f4 100644 --- a/htdocs/categories/class/api_categories.class.php +++ b/htdocs/categories/class/api_categories.class.php @@ -146,7 +146,8 @@ class Categories extends DolibarrApi { $i=0; $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $category_static = new Categorie($db); @@ -232,7 +233,8 @@ class Categories extends DolibarrApi { $i=0; $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $category_static = new Categorie($db); diff --git a/htdocs/categories/class/api_deprecated_category.class.php b/htdocs/categories/class/api_deprecated_category.class.php index 271f2900502..efbcac82124 100644 --- a/htdocs/categories/class/api_deprecated_category.class.php +++ b/htdocs/categories/class/api_deprecated_category.class.php @@ -147,7 +147,8 @@ class CategoryApi extends DolibarrApi { $i=0; $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $category_static = new Categorie($db); @@ -228,7 +229,8 @@ class CategoryApi extends DolibarrApi { $i=0; $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $category_static = new Categorie($db); diff --git a/htdocs/comm/action/class/api_agendaevents.class.php b/htdocs/comm/action/class/api_agendaevents.class.php index 5eeca63a4aa..376df238a95 100644 --- a/htdocs/comm/action/class/api_agendaevents.class.php +++ b/htdocs/comm/action/class/api_agendaevents.class.php @@ -147,7 +147,8 @@ class AgendaEvents extends DolibarrApi if ($result) { $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $actioncomm_static = new ActionComm($db); diff --git a/htdocs/comm/propal/class/api_proposals.class.php b/htdocs/comm/propal/class/api_proposals.class.php index fd508b03256..190f6cdca87 100644 --- a/htdocs/comm/propal/class/api_proposals.class.php +++ b/htdocs/comm/propal/class/api_proposals.class.php @@ -148,7 +148,8 @@ class Proposals extends DolibarrApi if ($result) { $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $propal_static = new Propal($db); diff --git a/htdocs/commande/class/api_deprecated_commande.class.php b/htdocs/commande/class/api_deprecated_commande.class.php index aa1584c4fed..c0b3a634825 100644 --- a/htdocs/commande/class/api_deprecated_commande.class.php +++ b/htdocs/commande/class/api_deprecated_commande.class.php @@ -163,7 +163,8 @@ class CommandeApi extends DolibarrApi { $i=0; $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $commande_static = new Commande($db); diff --git a/htdocs/commande/class/api_orders.class.php b/htdocs/commande/class/api_orders.class.php index 81a2ad79d69..1bd4e44a877 100644 --- a/htdocs/commande/class/api_orders.class.php +++ b/htdocs/commande/class/api_orders.class.php @@ -152,7 +152,8 @@ class Orders extends DolibarrApi if ($result) { $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $commande_static = new Commande($db); diff --git a/htdocs/compta/bank/class/api_bankaccounts.class.php b/htdocs/compta/bank/class/api_bankaccounts.class.php index 10994d7d525..98ee2672d3b 100644 --- a/htdocs/compta/bank/class/api_bankaccounts.class.php +++ b/htdocs/compta/bank/class/api_bankaccounts.class.php @@ -98,8 +98,8 @@ class BankAccounts extends DolibarrApi if ($result) { $num = $this->db->num_rows($result); - $minnum = min($num, ($limit <= 0 ? $num : $limit)); - for ($i = 0; $i < $minnum; $i++) { + $min = min($num, ($limit <= 0 ? $num : $limit)); + for ($i = 0; $i < $min; $i++) { $obj = $this->db->fetch_object($result); $account = new Account($this->db); if ($account->fetch($obj->rowid) > 0) { diff --git a/htdocs/compta/facture/class/api_deprecated_invoice.class.php b/htdocs/compta/facture/class/api_deprecated_invoice.class.php index b638a46b920..36aa232de9e 100644 --- a/htdocs/compta/facture/class/api_deprecated_invoice.class.php +++ b/htdocs/compta/facture/class/api_deprecated_invoice.class.php @@ -161,7 +161,8 @@ class InvoiceApi extends DolibarrApi { $i=0; $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $invoice_static = new Facture($db); diff --git a/htdocs/compta/facture/class/api_invoices.class.php b/htdocs/compta/facture/class/api_invoices.class.php index 4efc997cc42..e2842df0530 100644 --- a/htdocs/compta/facture/class/api_invoices.class.php +++ b/htdocs/compta/facture/class/api_invoices.class.php @@ -155,7 +155,8 @@ class Invoices extends DolibarrApi { $i=0; $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $invoice_static = new Facture($db); diff --git a/htdocs/expensereport/class/api_expensereports.class.php b/htdocs/expensereport/class/api_expensereports.class.php index 03ecb51de79..763b550d34e 100644 --- a/htdocs/expensereport/class/api_expensereports.class.php +++ b/htdocs/expensereport/class/api_expensereports.class.php @@ -134,7 +134,8 @@ class ExpenseReports extends DolibarrApi if ($result) { $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $expensereport_static = new ExpenseReport($db); diff --git a/htdocs/fourn/class/api_supplier_invoices.class.php b/htdocs/fourn/class/api_supplier_invoices.class.php index 3bf5c3f5934..1eb1872126c 100644 --- a/htdocs/fourn/class/api_supplier_invoices.class.php +++ b/htdocs/fourn/class/api_supplier_invoices.class.php @@ -155,7 +155,8 @@ class SupplierInvoices extends DolibarrApi { $i = 0; $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $invoice_static = new FactureFournisseur($db); diff --git a/htdocs/product/class/api_deprecated_product.class.php b/htdocs/product/class/api_deprecated_product.class.php index e2ee97e0100..e33c7dd3e32 100644 --- a/htdocs/product/class/api_deprecated_product.class.php +++ b/htdocs/product/class/api_deprecated_product.class.php @@ -149,7 +149,8 @@ class ProductApi extends DolibarrApi { $i=0; $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $product_static = new Product($db); @@ -235,7 +236,8 @@ class ProductApi extends DolibarrApi { $i=0; $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $product_static = new Product($db); diff --git a/htdocs/product/class/api_products.class.php b/htdocs/product/class/api_products.class.php index 14885532952..a733a554fd5 100644 --- a/htdocs/product/class/api_products.class.php +++ b/htdocs/product/class/api_products.class.php @@ -146,7 +146,8 @@ class Products extends DolibarrApi if ($result) { $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $product_static = new Product($db); diff --git a/htdocs/product/stock/class/api_stockmovements.class.php b/htdocs/product/stock/class/api_stockmovements.class.php index 677d34d9fcb..79e17749991 100644 --- a/htdocs/product/stock/class/api_stockmovements.class.php +++ b/htdocs/product/stock/class/api_stockmovements.class.php @@ -133,7 +133,8 @@ class StockMovements extends DolibarrApi { $i=0; $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $stockmovement_static = new MouvementStock($db); diff --git a/htdocs/product/stock/class/api_warehouses.class.php b/htdocs/product/stock/class/api_warehouses.class.php index d09c7bc527f..d50f590c30c 100644 --- a/htdocs/product/stock/class/api_warehouses.class.php +++ b/htdocs/product/stock/class/api_warehouses.class.php @@ -131,7 +131,8 @@ class Warehouses extends DolibarrApi { $i=0; $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $warehouse_static = new Entrepot($db); diff --git a/htdocs/projet/class/api_projects.class.php b/htdocs/projet/class/api_projects.class.php index 5bb7e8dfc7e..0f4f85c05af 100644 --- a/htdocs/projet/class/api_projects.class.php +++ b/htdocs/projet/class/api_projects.class.php @@ -153,7 +153,8 @@ class Projects extends DolibarrApi if ($result) { $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $project_static = new Project($db); diff --git a/htdocs/projet/class/api_tasks.class.php b/htdocs/projet/class/api_tasks.class.php index ad72a36fa45..d2d7b81d865 100644 --- a/htdocs/projet/class/api_tasks.class.php +++ b/htdocs/projet/class/api_tasks.class.php @@ -160,7 +160,8 @@ class Tasks extends DolibarrApi if ($result) { $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $task_static = new Task($db); diff --git a/htdocs/societe/class/api_contacts.class.php b/htdocs/societe/class/api_contacts.class.php index de50799e430..02c1410fcbf 100644 --- a/htdocs/societe/class/api_contacts.class.php +++ b/htdocs/societe/class/api_contacts.class.php @@ -153,7 +153,8 @@ class Contacts extends DolibarrApi if ($result) { $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $contact_static = new Contact($db); diff --git a/htdocs/societe/class/api_deprecated_contact.class.php b/htdocs/societe/class/api_deprecated_contact.class.php index 196a1386b5d..8cb61fa3eb0 100644 --- a/htdocs/societe/class/api_deprecated_contact.class.php +++ b/htdocs/societe/class/api_deprecated_contact.class.php @@ -167,7 +167,8 @@ class ContactApi extends DolibarrApi { $i = 0; $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $contact_static = new Contact($db); diff --git a/htdocs/societe/class/api_deprecated_thirdparty.class.php b/htdocs/societe/class/api_deprecated_thirdparty.class.php index 96a2ebac321..a8146f4cca6 100644 --- a/htdocs/societe/class/api_deprecated_thirdparty.class.php +++ b/htdocs/societe/class/api_deprecated_thirdparty.class.php @@ -214,7 +214,8 @@ class ThirdpartyApi extends DolibarrApi { $i = 0; $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $soc_static = new Societe($db); diff --git a/htdocs/societe/class/api_thirdparties.class.php b/htdocs/societe/class/api_thirdparties.class.php index f8e96d82e47..df7965d6d8c 100644 --- a/htdocs/societe/class/api_thirdparties.class.php +++ b/htdocs/societe/class/api_thirdparties.class.php @@ -156,7 +156,8 @@ class Thirdparties extends DolibarrApi if ($result) { $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $soc_static = new Societe($db); diff --git a/htdocs/user/class/api_users.class.php b/htdocs/user/class/api_users.class.php index 80065f8d8d2..aa2569fb3ca 100644 --- a/htdocs/user/class/api_users.class.php +++ b/htdocs/user/class/api_users.class.php @@ -106,7 +106,8 @@ class Users extends DolibarrApi if ($result) { $num = $db->num_rows($result); - while ($i < min($num, ($limit <= 0 ? $num : $limit))) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { $obj = $db->fetch_object($result); $user_static = new User($db); From 82560b912614a139b60ab0e6d9168d123d213478 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 22 May 2017 10:58:20 +0200 Subject: [PATCH 229/299] Look and feel v6 --- htdocs/adherents/card.php | 2 +- htdocs/adherents/subscription.php | 2 +- htdocs/langs/en_US/main.lang | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/adherents/card.php b/htdocs/adherents/card.php index 270430c899f..1234f75e059 100644 --- a/htdocs/adherents/card.php +++ b/htdocs/adherents/card.php @@ -1273,7 +1273,7 @@ else */ $head = member_prepare_head($object); - dol_fiche_head($head, 'general', $langs->trans("Member"), 0, 'user'); + dol_fiche_head($head, 'general', $langs->trans("Member"), -1, 'user'); // Confirm create user if ($action == 'create_user') diff --git a/htdocs/adherents/subscription.php b/htdocs/adherents/subscription.php index 658cdfee323..1874a0b37a7 100644 --- a/htdocs/adherents/subscription.php +++ b/htdocs/adherents/subscription.php @@ -578,7 +578,7 @@ if ($rowid > 0) print ''; print ''; - dol_fiche_head($head, 'subscription', $langs->trans("Member"), 0, 'user'); + dol_fiche_head($head, 'subscription', $langs->trans("Member"), -1, 'user'); $linkback = ''.$langs->trans("BackToList").''; diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 01aa5537c13..77b5af78f81 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -762,7 +762,7 @@ Calendar=Calendar GroupBy=Group by... ViewFlatList=View flat list RemoveString=Remove string '%s' -SomeTranslationAreUncomplete=Some languages may be partially translated or may contains errors. If you detect some, you can fix language files registering to http://transifex.com/projects/p/dolibarr/. +SomeTranslationAreUncomplete=Some languages may be partially translated or may contains errors. If you detect some, you can fix language files registering to https://transifex.com/projects/p/dolibarr/. DirectDownloadLink=Direct download link Download=Download ActualizeCurrency=Update currency rate From 1a8884bbbee037f128875d5d138a98571b0be2f9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 22 May 2017 15:20:52 +0200 Subject: [PATCH 230/299] NEW Can filter on year and product tags on the product statistic page --- htdocs/categories/class/categorie.class.php | 26 +- htdocs/core/class/html.form.class.php | 2 +- htdocs/langs/en_US/other.lang | 24 +- htdocs/product/ajax/products.php | 4 +- htdocs/product/card.php | 3 +- htdocs/product/class/product.class.php | 57 +- htdocs/product/composition/card.php | 81 ++- htdocs/product/list.php | 68 +- htdocs/product/stats/card.php | 631 +++++++++--------- htdocs/product/stats/commande.php | 2 +- htdocs/product/stats/commande_fournisseur.php | 2 +- htdocs/product/stats/contrat.php | 2 +- htdocs/product/stats/facture.php | 2 +- htdocs/product/stats/facture_fournisseur.php | 2 +- htdocs/product/stats/propal.php | 2 +- 15 files changed, 500 insertions(+), 408 deletions(-) diff --git a/htdocs/categories/class/categorie.class.php b/htdocs/categories/class/categorie.class.php index 518c3faa683..142cc22fe75 100644 --- a/htdocs/categories/class/categorie.class.php +++ b/htdocs/categories/class/categorie.class.php @@ -792,11 +792,12 @@ class Categorie extends CommonObject /** * Return list of fetched instance of elements having this category * - * @param string $type Type of category ('customer', 'supplier', 'contact', 'product', 'member') - * - * @return mixed -1 if KO, array of instance of object if OK + * @param string $type Type of category ('customer', 'supplier', 'contact', 'product', 'member') + * @param int $onlyids Return only ids of objects (consume less memory) + * @return mixed -1 if KO, array of instance of object if OK + * @see containsObject */ - function getObjectsInCateg($type) + function getObjectsInCateg($type, $onlyids=0) { $objs = array(); @@ -813,10 +814,18 @@ class Categorie extends CommonObject $resql = $this->db->query($sql); if ($resql) { - while ($rec = $this->db->fetch_array($resql)) { - $obj = new $this->MAP_OBJ_CLASS[$type]( $this->db ); - $obj->fetch( $rec['fk_' . $this->MAP_CAT_FK[$type]]); - $objs[] = $obj; + while ($rec = $this->db->fetch_array($resql)) + { + if ($onlyids) + { + $objs[] = $rec['fk_' . $this->MAP_CAT_FK[$type]]; + } + else + { + $obj = new $this->MAP_OBJ_CLASS[$type]( $this->db ); + $obj->fetch( $rec['fk_' . $this->MAP_CAT_FK[$type]]); + $objs[] = $obj; + } } return $objs; } @@ -834,6 +843,7 @@ class Categorie extends CommonObject * @param int $object_id id of the object to search * * @return int number of occurrences + * @see getObjectsInCateg */ function containsObject($type, $object_id ) { diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index f58e96087b8..561504f7845 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -4783,7 +4783,7 @@ class Form { $retstring.=''; - for ($year = $syear - 5; $year < $syear + 10 ; $year++) + for ($year = $syear - 10; $year < $syear + 10 ; $year++) { $retstring.=''; } diff --git a/htdocs/langs/en_US/other.lang b/htdocs/langs/en_US/other.lang index 11a09af3373..02fa209c340 100644 --- a/htdocs/langs/en_US/other.lang +++ b/htdocs/langs/en_US/other.lang @@ -160,18 +160,18 @@ ProfIdShortDesc=Prof Id %s is an information depending on third party cou DolibarrDemo=Dolibarr ERP/CRM demo StatsByNumberOfUnits=Statistics in number of products/services units StatsByNumberOfEntities=Statistics in number of referring entities -NumberOfProposals=Number of proposals in past 12 months -NumberOfCustomerOrders=Number of customer orders in past 12 months -NumberOfCustomerInvoices=Number of customer invoices in past 12 months -NumberOfSupplierProposals=Number of supplier proposals in past 12 months -NumberOfSupplierOrders=Number of supplier orders in past 12 months -NumberOfSupplierInvoices=Number of supplier invoices in past 12 months -NumberOfUnitsProposals=Number of units on proposals in past 12 months -NumberOfUnitsCustomerOrders=Number of units on customer orders in past 12 months -NumberOfUnitsCustomerInvoices=Number of units on customer invoices in past 12 months -NumberOfUnitsSupplierProposals=Number of units on supplier proposals in past 12 months -NumberOfUnitsSupplierOrders=Number of units on supplier orders in past 12 months -NumberOfUnitsSupplierInvoices=Number of units on supplier invoices in past 12 months +NumberOfProposals=Number of proposals +NumberOfCustomerOrders=Number of customer orders +NumberOfCustomerInvoices=Number of customer invoices +NumberOfSupplierProposals=Number of supplier proposals +NumberOfSupplierOrders=Number of supplier orders +NumberOfSupplierInvoices=Number of supplier invoices +NumberOfUnitsProposals=Number of units on proposals +NumberOfUnitsCustomerOrders=Number of units on customer orders +NumberOfUnitsCustomerInvoices=Number of units on customer invoices +NumberOfUnitsSupplierProposals=Number of units on supplier proposals +NumberOfUnitsSupplierOrders=Number of units on supplier orders +NumberOfUnitsSupplierInvoices=Number of units on supplier invoices EMailTextInterventionAddedContact=A newintervention %s has been assigned to you. EMailTextInterventionValidated=The intervention %s has been validated. EMailTextInvoiceValidated=The invoice %s has been validated. diff --git a/htdocs/product/ajax/products.php b/htdocs/product/ajax/products.php index 0510299fbd7..8867011101b 100644 --- a/htdocs/product/ajax/products.php +++ b/htdocs/product/ajax/products.php @@ -178,11 +178,11 @@ else $idprod = (! empty($match[0]) ? $match[0] : ''); - if (! GETPOST($htmlname) && ! GETPOST($idprod)) + if (! $htmlname && (! $idprod || ! GETPOST($idprod,'alpha'))) return; // When used from jQuery, the search term is added as GET param "term". - $searchkey = (GETPOST($idprod) ? GETPOST($idprod) : (GETPOST($htmlname) ? GETPOST($htmlname) : '')); + $searchkey = (($idprod && GETPOST($idprod,'alpha')) ? GETPOST($idprod,'alpha') : (GETPOST($htmlname, 'alpha') ? GETPOST($htmlname, 'alpha') : '')); $form = new Form($db); if (empty($mode) || $mode == 1) { // mode=1: customer diff --git a/htdocs/product/card.php b/htdocs/product/card.php index 71f7cd8e7f6..7cd86404afa 100644 --- a/htdocs/product/card.php +++ b/htdocs/product/card.php @@ -1448,7 +1448,8 @@ else $head=product_prepare_head($object); $titre=$langs->trans("CardProduct".$object->type); $picto=($object->type== Product::TYPE_SERVICE?'service':'product'); - dol_fiche_head($head, 'card', $titre, 0, $picto); + + dol_fiche_head($head, 'card', $titre, -1, $picto); $linkback = ''.$langs->trans("BackToList").''; $object->next_prev_filter=" fk_product_type = ".$object->type; diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 1225eb82696..d866e3ec2ae 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -2459,9 +2459,10 @@ class Product extends CommonObject * * @param string $sql Request to execute * @param string $mode 'byunit'=number of unit, 'bynumber'=nb of entities + * @param int $year Year (0=current year) * @return array <0 if KO, result[month]=array(valuex,valuey) where month is 0 to 11 */ - function _get_stats($sql,$mode) + function _get_stats($sql, $mode, $year=0) { $resql = $this->db->query($sql); if ($resql) @@ -2482,8 +2483,15 @@ class Product extends CommonObject return -1; } - $year = strftime('%Y',time()); - $month = strftime('%m',time()); + if (empty($year)) + { + $year = strftime('%Y',time()); + $month = strftime('%m',time()); + } + else + { + $month=12; // We imagine we are at end of year, so we get last 12 month before, so all correct year. + } $result = array(); for ($j = 0 ; $j < 12 ; $j++) @@ -2516,9 +2524,11 @@ class Product extends CommonObject * @param int $socid Limit count on a particular third party id * @param string $mode 'byunit'=number of unit, 'bynumber'=nb of entities * @param int $filteronproducttype 0=To filter on product only, 1=To filter on services only + * @param int $year Year (0=last 12 month) + * @param string $morefilter More sql filters * @return array <0 if KO, result[month]=array(valuex,valuey) where month is 0 to 11 */ - function get_nb_vente($socid, $mode, $filteronproducttype=-1) + function get_nb_vente($socid, $mode, $filteronproducttype=-1, $year=0, $morefilter='') { global $conf; global $user; @@ -2536,10 +2546,11 @@ class Product extends CommonObject $sql.= " AND f.entity IN (".getEntity('facture', 1).")"; if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND f.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id; if ($socid > 0) $sql.= " AND f.fk_soc = $socid"; + $sql.=$morefilter; $sql.= " GROUP BY date_format(f.datef,'%Y%m')"; $sql.= " ORDER BY date_format(f.datef,'%Y%m') DESC"; - return $this->_get_stats($sql,$mode); + return $this->_get_stats($sql,$mode, $year); } @@ -2549,9 +2560,11 @@ class Product extends CommonObject * @param int $socid Limit count on a particular third party id * @param string $mode 'byunit'=number of unit, 'bynumber'=nb of entities * @param int $filteronproducttype 0=To filter on product only, 1=To filter on services only + * @param int $year Year (0=last 12 month) + * @param string $morefilter More sql filters * @return array <0 if KO, result[month]=array(valuex,valuey) where month is 0 to 11 */ - function get_nb_achat($socid, $mode, $filteronproducttype=-1) + function get_nb_achat($socid, $mode, $filteronproducttype=-1, $year=0, $morefilter='') { global $conf; global $user; @@ -2569,11 +2582,11 @@ class Product extends CommonObject $sql.= " AND f.entity IN (".getEntity('facture_fourn', 1).")"; if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND f.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id; if ($socid > 0) $sql.= " AND f.fk_soc = $socid"; + $sql.=$morefilter; $sql.= " GROUP BY date_format(f.datef,'%Y%m')"; $sql.= " ORDER BY date_format(f.datef,'%Y%m') DESC"; - $resarray=$this->_get_stats($sql,$mode); - return $resarray; + return $this->_get_stats($sql,$mode, $year); } /** @@ -2582,9 +2595,11 @@ class Product extends CommonObject * @param int $socid Limit count on a particular third party id * @param string $mode 'byunit'=number of unit, 'bynumber'=nb of entities * @param int $filteronproducttype 0=To filter on product only, 1=To filter on services only + * @param int $year Year (0=last 12 month) + * @param string $morefilter More sql filters * @return array <0 if KO, result[month]=array(valuex,valuey) where month is 0 to 11 */ - function get_nb_propal($socid, $mode, $filteronproducttype=-1) + function get_nb_propal($socid, $mode, $filteronproducttype=-1, $year=0, $morefilter='') { global $conf; global $user; @@ -2602,10 +2617,11 @@ class Product extends CommonObject $sql.= " AND p.entity IN (".getEntity('propal', 1).")"; if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND p.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id; if ($socid > 0) $sql.= " AND p.fk_soc = ".$socid; + $sql.=$morefilter; $sql.= " GROUP BY date_format(p.datep,'%Y%m')"; $sql.= " ORDER BY date_format(p.datep,'%Y%m') DESC"; - return $this->_get_stats($sql,$mode); + return $this->_get_stats($sql,$mode, $year); } /** @@ -2614,9 +2630,11 @@ class Product extends CommonObject * @param int $socid Limit count on a particular third party id * @param string $mode 'byunit'=number of unit, 'bynumber'=nb of entities * @param int $filteronproducttype 0=To filter on product only, 1=To filter on services only + * @param int $year Year (0=last 12 month) + * @param string $morefilter More sql filters * @return array <0 if KO, result[month]=array(valuex,valuey) where month is 0 to 11 */ - function get_nb_propalsupplier($socid, $mode, $filteronproducttype=-1) + function get_nb_propalsupplier($socid, $mode, $filteronproducttype=-1, $year=0, $morefilter='') { global $conf; global $user; @@ -2634,10 +2652,11 @@ class Product extends CommonObject $sql.= " AND p.entity IN (".getEntity('propal', 1).")"; if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND p.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id; if ($socid > 0) $sql.= " AND p.fk_soc = ".$socid; + $sql.=$morefilter; $sql.= " GROUP BY date_format(p.date_valid,'%Y%m')"; $sql.= " ORDER BY date_format(p.date_valid,'%Y%m') DESC"; - return $this->_get_stats($sql,$mode); + return $this->_get_stats($sql,$mode, $year); } /** @@ -2646,9 +2665,11 @@ class Product extends CommonObject * @param int $socid Limit count on a particular third party id * @param string $mode 'byunit'=number of unit, 'bynumber'=nb of entities * @param int $filteronproducttype 0=To filter on product only, 1=To filter on services only + * @param int $year Year (0=last 12 month) + * @param string $morefilter More sql filters * @return array <0 if KO, result[month]=array(valuex,valuey) where month is 0 to 11 */ - function get_nb_order($socid, $mode, $filteronproducttype=-1) + function get_nb_order($socid, $mode, $filteronproducttype=-1, $year=0, $morefilter='') { global $conf, $user; @@ -2665,10 +2686,11 @@ class Product extends CommonObject $sql.= " AND c.entity IN (".getEntity('commande', 1).")"; if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND c.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id; if ($socid > 0) $sql.= " AND c.fk_soc = ".$socid; + $sql.=$morefilter; $sql.= " GROUP BY date_format(c.date_commande,'%Y%m')"; $sql.= " ORDER BY date_format(c.date_commande,'%Y%m') DESC"; - return $this->_get_stats($sql,$mode); + return $this->_get_stats($sql,$mode, $year); } /** @@ -2677,9 +2699,11 @@ class Product extends CommonObject * @param int $socid Limit count on a particular third party id * @param string $mode 'byunit'=number of unit, 'bynumber'=nb of entities * @param int $filteronproducttype 0=To filter on product only, 1=To filter on services only + * @param int $year Year (0=last 12 month) + * @param string $morefilter More sql filters * @return array <0 if KO, result[month]=array(valuex,valuey) where month is 0 to 11 */ - function get_nb_ordersupplier($socid, $mode, $filteronproducttype=-1) + function get_nb_ordersupplier($socid, $mode, $filteronproducttype=-1, $year=0, $morefilter='') { global $conf, $user; @@ -2696,10 +2720,11 @@ class Product extends CommonObject $sql.= " AND c.entity IN (".getEntity('supplier_order', 1).")"; if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND c.fk_soc = sc.fk_soc AND sc.fk_user = " .$user->id; if ($socid > 0) $sql.= " AND c.fk_soc = ".$socid; + $sql.=$morefilter; $sql.= " GROUP BY date_format(c.date_commande,'%Y%m')"; $sql.= " ORDER BY date_format(c.date_commande,'%Y%m') DESC"; - return $this->_get_stats($sql,$mode); + return $this->_get_stats($sql,$mode, $year); } /** diff --git a/htdocs/product/composition/card.php b/htdocs/product/composition/card.php index 37068a1daca..aa1cf4137e9 100644 --- a/htdocs/product/composition/card.php +++ b/htdocs/product/composition/card.php @@ -193,7 +193,7 @@ llxHeader('', $title, $helpurl); $head=product_prepare_head($object); $titre=$langs->trans("CardProduct".$object->type); $picto=($object->type==Product::TYPE_SERVICE?'service':'product'); -dol_fiche_head($head, 'subproduct', $titre, 0, $picto); +dol_fiche_head($head, 'subproduct', $titre, -1, $picto); if ($id > 0 || ! empty($ref)) @@ -209,48 +209,47 @@ if ($id > 0 || ! empty($ref)) if ($object->type!=Product::TYPE_SERVICE || empty($conf->global->PRODUIT_MULTIPRICES)) { + print '
'; print '
'; print ''; - } - // Nature - if ($object->type!=Product::TYPE_SERVICE) - { - print ''; - } + // Nature + if ($object->type!=Product::TYPE_SERVICE) + { + print ''; + } + + if (empty($conf->global->PRODUIT_MULTIPRICES)) + { + // Price + print ''; + + // Price minimum + print ''; + } - if (empty($conf->global->PRODUIT_MULTIPRICES)) - { - // Price - print ''; - - // Price minimum - print ''; - } - - if ($object->type!=Product::TYPE_SERVICE || empty($conf->global->PRODUIT_MULTIPRICES)) - { - print '
'.$langs->trans("Nature").''; - print $object->getLibFinished(); - print '
'.$langs->trans("Nature").''; + print $object->getLibFinished(); + print '
'.$langs->trans("SellingPrice").''; + if ($object->price_base_type == 'TTC') + { + print price($object->price_ttc).' '.$langs->trans($object->price_base_type); + } + else + { + print price($object->price).' '.$langs->trans($object->price_base_type?$object->price_base_type:'HT'); + } + print '
'.$langs->trans("MinPrice").''; + if ($object->price_base_type == 'TTC') + { + print price($object->price_min_ttc).' '.$langs->trans($object->price_base_type); + } + else + { + print price($object->price_min).' '.$langs->trans($object->price_base_type?$object->price_base_type:'HT'); + } + print '
'.$langs->trans("SellingPrice").''; - if ($object->price_base_type == 'TTC') - { - print price($object->price_ttc).' '.$langs->trans($object->price_base_type); - } - else - { - print price($object->price).' '.$langs->trans($object->price_base_type?$object->price_base_type:'HT'); - } - print '
'.$langs->trans("MinPrice").''; - if ($object->price_base_type == 'TTC') - { - print price($object->price_min_ttc).' '.$langs->trans($object->price_base_type); - } - else - { - print price($object->price_min).' '.$langs->trans($object->price_base_type?$object->price_base_type:'HT'); - } - print '
'; + print '
'; + print ''; } dol_fiche_end(); @@ -271,7 +270,7 @@ if ($id > 0 || ! empty($ref)) //if (count($prodsfather) > 0) //{ - print load_fiche_titre($langs->trans("ProductParentList"),'','').'
'; + print load_fiche_titre($langs->trans("ProductParentList"),'',''); print ''; print ''; print ''; @@ -320,7 +319,7 @@ if ($id > 0 || ! empty($ref)) //if (count($prods_arbo) > 0) //{ $atleastonenotdefined=0; - print load_fiche_titre($langs->trans("ProductAssociationList"),'','').'
'; + print load_fiche_titre($langs->trans("ProductAssociationList"),'',''); print ''; print ''; diff --git a/htdocs/product/list.php b/htdocs/product/list.php index 7e6ae9b47f4..74f9c59cff3 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -55,6 +55,7 @@ $sall=GETPOST('sall', 'alphanohtml'); $sref=GETPOST("sref"); $sbarcode=GETPOST("sbarcode"); $snom=GETPOST("snom"); +$search_type = GETPOST("search_type",'int'); $search_sale = GETPOST("search_sale"); $search_categ = GETPOST("search_categ",'int'); $tosell = GETPOST("tosell", 'int'); @@ -65,7 +66,7 @@ $search_tobatch = GETPOST("search_tobatch",'int'); $search_accountancy_code_sell = GETPOST("search_accountancy_code_sell",'alpha'); $search_accountancy_code_buy = GETPOST("search_accountancy_code_buy",'alpha'); $optioncss = GETPOST('optioncss','alpha'); -$type= (int) GETPOST("type","int"); +$type=(int) GETPOST("type","int"); //Show/hide child products. Hidden by default if (!$_POST) { @@ -114,8 +115,8 @@ if (! empty($canvas)) } // Security check -if ($type=='0') $result=restrictedArea($user,'produit','','','','','',$objcanvas); -else if ($type=='1') $result=restrictedArea($user,'service','','','','','',$objcanvas); +if ($search_type=='0') $result=restrictedArea($user,'produit','','','','','',$objcanvas); +else if ($search_type=='1') $result=restrictedArea($user,'service','','','','','',$objcanvas); else $result=restrictedArea($user,'produit|service','','','','','',$objcanvas); // Define virtualdiffersfromphysical @@ -158,7 +159,8 @@ $arrayfields=array( 'p.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1), //'pfp.ref_fourn'=>array('label'=>$langs->trans("RefSupplier"), 'checked'=>1, 'enabled'=>(! empty($conf->barcode->enabled))), 'p.label'=>array('label'=>$langs->trans("Label"), 'checked'=>1), - 'p.barcode'=>array('label'=>$langs->trans("Gencod"), 'checked'=>($contextpage != 'servicelist'), 'enabled'=>(! empty($conf->barcode->enabled))), + 'p.fk_product_type'=>array('label'=>$langs->trans("Type"), 'checked'=>0, 'enabled'=>(! empty($conf->produit->enabled) && ! empty($conf->service->enabled))), + 'p.barcode'=>array('label'=>$langs->trans("Gencod"), 'checked'=>($contextpage != 'servicelist'), 'enabled'=>(! empty($conf->barcode->enabled))), 'p.duration'=>array('label'=>$langs->trans("Duration"), 'checked'=>($contextpage != 'productlist'), 'enabled'=>(! empty($conf->service->enabled))), 'p.sellprice'=>array('label'=>$langs->trans("SellingPrice"), 'checked'=>1, 'enabled'=>empty($conf->global->PRODUIT_MULTIPRICES)), 'p.minbuyprice'=>array('label'=>$langs->trans("BuyingPriceMinShort"), 'checked'=>1, 'enabled'=>(! empty($user->rights->fournisseur->lire))), @@ -212,6 +214,7 @@ if (empty($reshook)) $tosell=""; $tobuy=""; $search_tobatch=''; + $search_type=''; $search_accountancy_code_sell=''; $search_accountancy_code_buy=''; $search_array_options=array(); @@ -219,8 +222,8 @@ if (empty($reshook)) // Mass actions $objectclass='Product'; - if ((string) $type == '1') { $objectlabel='Services'; } - if ((string) $type == '0') { $objectlabel='Products'; } + if ((string) $search_type == '1') { $objectlabel='Services'; } + if ((string) $search_type == '0') { $objectlabel='Products'; } $permtoread = $user->rights->produit->lire; $permtodelete = $user->rights->produit->supprimer; @@ -244,9 +247,9 @@ else { $title=$langs->trans("ProductsAndServices"); - if (isset($type)) + if ($search_type != '' && $search_type != '-1') { - if ($type==1) + if ($search_type==1) { $texte = $langs->trans("Services"); } @@ -260,13 +263,13 @@ else $texte = $langs->trans("ProductsAndServices"); } - $sql = 'SELECT DISTINCT p.rowid, p.ref, p.label, p.barcode, p.price, p.price_ttc, p.price_base_type, p.entity,'; + $sql = 'SELECT DISTINCT p.rowid, p.ref, p.label, p.fk_product_type, p.barcode, p.price, p.price_ttc, p.price_base_type, p.entity,'; $sql.= ' p.fk_product_type, p.duration, p.tosell, p.tobuy, p.seuil_stock_alerte, p.desiredstock,'; $sql.= ' p.tobatch, p.accountancy_code_sell, p.accountancy_code_buy,'; $sql.= ' p.datec as date_creation, p.tms as date_update,'; //$sql.= ' pfp.ref_fourn as ref_supplier, '; $sql.= ' MIN(pfp.unitprice) as minsellprice'; - if (!empty($conf->variants->enabled) && $search_hidechildproducts && ($type === 0)) { + if (!empty($conf->variants->enabled) && $search_hidechildproducts && ($search_type === 0)) { $sql .= ', pac.rowid prod_comb_id'; } // Add fields from extrafields @@ -281,17 +284,17 @@ else $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_fournisseur_price as pfp ON p.rowid = pfp.fk_product"; // multilang if (! empty($conf->global->MAIN_MULTILANGS)) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product_lang as pl ON pl.fk_product = p.rowid AND pl.lang = '".$langs->getDefaultLang() ."'"; - if (!empty($conf->variants->enabled) && $search_hidechildproducts && ($type === 0)) { + if (!empty($conf->variants->enabled) && $search_hidechildproducts && ($search_type === 0)) { $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."product_attribute_combination pac ON pac.fk_product_child = p.rowid"; } $sql.= ' WHERE p.entity IN ('.getEntity('product', 1).')'; if ($sall) $sql .= natural_search(array_keys($fieldstosearchall), $sall); // if the type is not 1, we show all products (type = 0,2,3) - if (dol_strlen($type)) + if (dol_strlen($search_type) && $search_type != '-1') { - if ($type == 1) $sql.= " AND p.fk_product_type = '1'"; - else $sql.= " AND p.fk_product_type <> '1'"; + if ($search_type == 1) $sql.= " AND p.fk_product_type = 1"; + else $sql.= " AND p.fk_product_type <> 1"; } if ($sref) $sql .= natural_search('p.ref', $sref); if ($snom) $sql .= natural_search('p.label', $snom); @@ -309,7 +312,7 @@ else if ($search_accountancy_code_sell) $sql.= natural_search('p.accountancy_code_buy', $search_accountancy_code_buy); // Add where from extra fields - if (!empty($conf->variants->enabled) && $search_hidechildproducts && ($type === 0)) { + if (!empty($conf->variants->enabled) && $search_hidechildproducts && ($search_type === 0)) { $sql .= " AND pac.rowid IS NULL"; } @@ -333,7 +336,7 @@ else $sql.= " GROUP BY p.rowid, p.ref, p.label, p.barcode, p.price, p.price_ttc, p.price_base_type,"; $sql.= " p.fk_product_type, p.duration, p.tosell, p.tobuy, p.seuil_stock_alerte, p.desiredstock,"; $sql.= ' p.datec, p.tms, p.entity, p.tobatch, p.accountancy_code_sell, p.accountancy_code_buy'; - if (!empty($conf->variants->enabled) && $search_hidechildproducts && ($type === 0)) { + if (!empty($conf->variants->enabled) && $search_hidechildproducts && ($search_type === 0)) { $sql .= ', pac.rowid'; } // Add fields from extrafields @@ -368,13 +371,13 @@ else } $helpurl=''; - if (isset($type)) + if ($search_type != '') { - if ($type == 0) + if ($search_type == 0) { $helpurl='EN:Module_Products|FR:Module_Produits|ES:Módulo_Productos'; } - else if ($type == 1) + else if ($search_type == 1) { $helpurl='EN:Module_Services_En|FR:Module_Services|ES:Módulo_Servicios'; } @@ -401,7 +404,8 @@ else if ($fourn_id > 0) $param.=($fourn_id?"&fourn_id=".$fourn_id:""); if ($seach_categ) $param.=($search_categ?"&search_categ=".urlencode($search_categ):""); if ($type != '') $param.='&type='.urlencode($type); - if ($optioncss != '') $param.='&optioncss='.urlencode($optioncss); + if ($search_type != '') $param.='&search_type='.urlencode($search_type); + if ($optioncss != '') $param.='&optioncss='.urlencode($optioncss); if ($search_tobatch) $param="&search_ref_supplier=".urlencode($search_ref_supplier); if ($search_accountancy_code_sell) $param="&search_accountancy_code_sell=".urlencode($search_accountancy_code_sell); if ($search_accountancy_code_buy) $param="&search_accountancy_code_buy=".urlencode($search_accountancy_code_buy); @@ -430,7 +434,8 @@ else print ''; print ''; print ''; - print ''; + print ''; + if (empty($arrayfields['p.fk_product_type']['checked'])) print ''; print_barre_liste($texte, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_products.png', 0, '', '', $limit); @@ -480,7 +485,7 @@ else } //Show/hide child products. Hidden by default - if (!empty($conf->variants->enabled) && $type === 0) { + if (!empty($conf->variants->enabled) && $search_type === 0) { $moreforfilter.='
'; $moreforfilter.= ''; $moreforfilter.= ' '; @@ -524,6 +529,14 @@ else print ''; print ''; } + // Type + if (! empty($arrayfields['p.fk_product_type']['checked'])) + { + print '
'; + } // Barcode if (! empty($arrayfields['p.barcode']['checked'])) { @@ -622,6 +635,7 @@ else if (! empty($arrayfields['p.ref']['checked'])) print_liste_field_titre($arrayfields['p.ref']['label'], $_SERVER["PHP_SELF"],"p.ref","",$param,"",$sortfield,$sortorder); if (! empty($arrayfields['pfp.ref_fourn']['checked'])) print_liste_field_titre($arrayfields['pfp.ref_fourn']['label'], $_SERVER["PHP_SELF"],"pfp.ref_fourn","",$param,"",$sortfield,$sortorder); if (! empty($arrayfields['p.label']['checked'])) print_liste_field_titre($arrayfields['p.label']['label'], $_SERVER["PHP_SELF"],"p.label","",$param,"",$sortfield,$sortorder); + if (! empty($arrayfields['p.fk_product_type']['checked'])) print_liste_field_titre($arrayfields['p.fk_product_type']['label'], $_SERVER["PHP_SELF"],"p.fk_product_type","",$param,"",$sortfield,$sortorder); if (! empty($arrayfields['p.barcode']['checked'])) print_liste_field_titre($arrayfields['p.barcode']['label'], $_SERVER["PHP_SELF"],"p.barcode","",$param,"",$sortfield,$sortorder); if (! empty($arrayfields['p.duration']['checked'])) print_liste_field_titre($arrayfields['p.duration']['label'], $_SERVER["PHP_SELF"],"p.duration","",$param,'align="center"',$sortfield,$sortorder); if (! empty($arrayfields['p.sellprice']['checked'])) print_liste_field_titre($arrayfields['p.sellprice']['label'], $_SERVER["PHP_SELF"],"","",$param,'align="right"',$sortfield,$sortorder); @@ -690,7 +704,7 @@ else $product_static->status = $obj->tosell; $product_static->entity = $obj->entity; - if (! empty($conf->stock->enabled) && $user->rights->stock->lire && $type != 1) // To optimize call of load_stock + if (! empty($conf->stock->enabled) && $user->rights->stock->lire && $search_type != 1) // To optimize call of load_stock { if ($obj->fk_product_type != 1) // Not a service { @@ -721,7 +735,13 @@ else print ''; } - // Barcode + // Type + if (! empty($arrayfields['p.fk_product_type']['checked'])) + { + print ''; + } + + // Barcode if (! empty($arrayfields['p.barcode']['checked'])) { print ''; diff --git a/htdocs/product/stats/card.php b/htdocs/product/stats/card.php index d0a85756c04..0477491518c 100644 --- a/htdocs/product/stats/card.php +++ b/htdocs/product/stats/card.php @@ -1,6 +1,6 @@ - * Copyright (c) 2004-2015 Laurent Destailleur + * Copyright (c) 2004-2017 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2005 Eric Seigne * Copyright (C) 2013 Juanjo Menent @@ -30,6 +30,8 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/dolgraph.class.php'; +require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; $WIDTH=DolGraph::getDefaultGraphSizeForStats('width',380); $HEIGHT=DolGraph::getDefaultGraphSizeForStats('height',160); @@ -43,6 +45,9 @@ $langs->load("other"); $id = GETPOST('id','int'); // For this page, id can also be 'all' $ref = GETPOST('ref'); $mode = (GETPOST('mode') ? GETPOST('mode') : 'byunit'); +$search_year = GETPOST('search_year','int'); +$search_categ = GETPOST('search_categ','int'); + $error = 0; $mesg = ''; $graphfiles=array(); @@ -55,348 +60,380 @@ $fieldvalue = (! empty($id) ? $id : $ref); $fieldtype = (! empty($ref) ? 'ref' : 'rowid'); $result=restrictedArea($user,'produit|service',$fieldvalue,'product&product','','',$fieldtype); +$tmp=dol_getdate(dol_now()); +$currentyear=$tmp['year']; +if (empty($search_year)) $search_year=$currentyear; + + +/* + * Actions + */ + +// None + /* * View */ $form = new Form($db); +$htmlother = new FormOther($db); -if (! empty($id) || ! empty($ref) || GETPOST('id') == 'all') +$object = new Product($db); +if (! $id) { - $object = new Product($db); - if (GETPOST('id') == 'all') + llxHeader("",$langs->trans("ProductStatistics")); + + $type = GETPOST('type','int'); + + $helpurl=''; + if ($type == '0') { - llxHeader("",$langs->trans("ProductStatistics")); - - $type = GETPOST('type'); - - $helpurl=''; - if ($type == '0') - { - $helpurl='EN:Module_Products|FR:Module_Produits|ES:Módulo_Productos'; - //$title=$langs->trans("StatisticsOfProducts"); - $title=$langs->trans("Statistics"); - } - else if ($type == '1') - { - $helpurl='EN:Module_Services_En|FR:Module_Services|ES:Módulo_Servicios'; - //$title=$langs->trans("StatisticsOfServices"); - $title=$langs->trans("Statistics"); - } - else - { - $helpurl='EN:Module_Services_En|FR:Module_Services|ES:Módulo_Servicios'; - //$title=$langs->trans("StatisticsOfProductsOrServices"); - $title=$langs->trans("Statistics"); - } - - print load_fiche_titre($title, $mesg,'title_products.png'); + $helpurl='EN:Module_Products|FR:Module_Produits|ES:Módulo_Productos'; + //$title=$langs->trans("StatisticsOfProducts"); + $title=$langs->trans("Statistics"); + } + else if ($type == '1') + { + $helpurl='EN:Module_Services_En|FR:Module_Services|ES:Módulo_Servicios'; + //$title=$langs->trans("StatisticsOfServices"); + $title=$langs->trans("Statistics"); } else { - $result = $object->fetch($id,$ref); - - $title = $langs->trans('ProductServiceCard'); - $helpurl = ''; - $shortlabel = dol_trunc($object->label,16); - if (GETPOST("type") == '0' || ($object->type == Product::TYPE_PRODUCT)) - { - $title = $langs->trans('Product')." ". $shortlabel ." - ".$langs->trans('Statistics'); - $helpurl='EN:Module_Products|FR:Module_Produits|ES:Módulo_Productos'; - } - if (GETPOST("type") == '1' || ($object->type == Product::TYPE_SERVICE)) - { - $title = $langs->trans('Service')." ". $shortlabel ." - ".$langs->trans('Statistics'); - $helpurl='EN:Module_Services_En|FR:Module_Services|ES:Módulo_Servicios'; - } - - llxHeader('', $title, $helpurl); + $helpurl='EN:Module_Services_En|FR:Module_Services|ES:Módulo_Servicios'; + //$title=$langs->trans("StatisticsOfProductsOrServices"); + $title=$langs->trans("Statistics"); } + print load_fiche_titre($title, $mesg,'title_products.png'); +} +else +{ + $result = $object->fetch($id,$ref); - if ($result && (! empty($id) || ! empty($ref))) + $title = $langs->trans('ProductServiceCard'); + $helpurl = ''; + $shortlabel = dol_trunc($object->label,16); + if (GETPOST("type") == '0' || ($object->type == Product::TYPE_PRODUCT)) { - $head=product_prepare_head($object); - $titre=$langs->trans("CardProduct".$object->type); - $picto=($object->type==Product::TYPE_SERVICE?'service':'product'); + $title = $langs->trans('Product')." ". $shortlabel ." - ".$langs->trans('Statistics'); + $helpurl='EN:Module_Products|FR:Module_Produits|ES:Módulo_Productos'; + } + if (GETPOST("type") == '1' || ($object->type == Product::TYPE_SERVICE)) + { + $title = $langs->trans('Service')." ". $shortlabel ." - ".$langs->trans('Statistics'); + $helpurl='EN:Module_Services_En|FR:Module_Services|ES:Módulo_Servicios'; + } - dol_fiche_head($head, 'stats', $titre, 0, $picto); + llxHeader('', $title, $helpurl); +} - $linkback = ''.$langs->trans("BackToList").''; + +if ($result && (! empty($id) || ! empty($ref))) +{ + $head=product_prepare_head($object); + $titre=$langs->trans("CardProduct".$object->type); + $picto=($object->type==Product::TYPE_SERVICE?'service':'product'); + + dol_fiche_head($head, 'stats', $titre, -1, $picto); + + $linkback = ''.$langs->trans("BackToList").''; + + dol_banner_tab($object, 'ref', $linkback, ($user->societe_id?0:1), 'ref', '', '', '', 0, '', '', 1); + + dol_fiche_end(); +} +if (empty($id) & empty($ref)) +{ + $h=0; + $head = array(); + + $head[$h][0] = DOL_URL_ROOT.'/product/stats/card.php'.($type != ''?'?type='.$type:''); + $head[$h][1] = $langs->trans("Chart"); + $head[$h][2] = 'chart'; + $h++; + + $title = $langs->trans("ListProductServiceByPopularity"); + if ((string) $type == '1') { + $title = $langs->trans("ListServiceByPopularity"); + } + if ((string) $type == '0') { + $title = $langs->trans("ListProductByPopularity"); + } + + $head[$h][0] = DOL_URL_ROOT.'/product/popuprop.php'.($type != ''?'?type='.$type:''); + $head[$h][1] = $title; + $head[$h][2] = 'popularityprop'; + $h++; + + dol_fiche_head($head, 'chart', $langs->trans("Statistics"), -1); +} + + +if ($result || empty($id)) +{ + print ''; + print ''; + + print '
'.$langs->trans('ParentProducts').'
'; + $array=array('-1'=>' ', '0'=>$langs->trans('Product'), '1'=>$langs->trans('Service')); + print $form->selectarray('search_type', $array, $search_type); + print ''.dol_trunc($obj->label,40).''.$obj->fk_product_type.''.$obj->barcode.'
'; + print ''; + + if (empty($id)) + { + // Type + print ''; - dol_banner_tab($object, 'ref', $linkback, ($user->societe_id?0:1), 'ref', '', '', '', 0, '', '', 1); - - dol_fiche_end(); - } - if (GETPOST('id') == 'all') - { - $h=0; - $head = array(); - - $head[$h][0] = DOL_URL_ROOT.'/product/stats/card.php?id=all'; - $head[$h][1] = $langs->trans("Chart"); - $head[$h][2] = 'chart'; - $h++; - - $title = $langs->trans("ListProductServiceByPopularity"); - if ((string) $type == '1') { - $title = $langs->trans("ListServiceByPopularity"); - } - if ((string) $type == '0') { - $title = $langs->trans("ListProductByPopularity"); - } - - $head[$h][0] = DOL_URL_ROOT.'/product/popuprop.php'.($type != ''?'?type='.$type:''); - $head[$h][1] = $title; - $head[$h][2] = 'popularityprop'; - $h++; - - dol_fiche_head($head,'chart',$langs->trans("Statistics")); - } - - - if ($result || GETPOST('id') == 'all') - { - if (GETPOST('id') == 'all') - { - // Choice of type of product - if (! empty($conf->dol_use_jmobile)) print "\n".'
'."\n".'
'."\n"; - else print '   /   '; - - if ((string) $type != '1') print 'id).'&type=1'.($mode?'&mode='.$mode:'').'">'; - else print img_picto('','tick').' '; - print $langs->trans("Services"); - if ((string) $type != '1') print ''; - - if (! empty($conf->dol_use_jmobile)) print '
'."\n".'
'."\n"; - else print '   /   '; - - if ((string) $type == '0' || (string) $type == '1') print 'id).($mode?'&mode='.$mode:'').'">'; - else print img_picto('','tick').' '; - print $langs->trans("ProductsAndServices"); - if ((string) $type == '0' || (string) $type == '1') print ''; - - if (! empty($conf->dol_use_jmobile)) print '
'; - else print '
'; - print '
'; - } - - // Choice of stats mode (byunit or bynumber) - if (! empty($conf->dol_use_jmobile)) print "\n".''; - else print '
'; - print '
'; - - //print '
'.$langs->trans("Filter").'
'.$langs->trans("ProductsAndServices").''; + $array=array('-1'=>' ', '0'=>$langs->trans('Product'), '1'=>$langs->trans('Service')); + print $form->selectarray('type', $array, $type); + print '
'; - - // Generation des graphs - $dir = (! empty($conf->product->multidir_temp[$object->entity])?$conf->product->multidir_temp[$object->entity]:$conf->service->multidir_temp[$object->entity]); - if ($object->id > 0) // We are on statistics for a dedicated product - { - if (! file_exists($dir.'/'.$object->id)) + // Tag + if ($conf->categorie->enabled) { - if (dol_mkdir($dir.'/'.$object->id) < 0) - { - $mesg = $langs->trans("ErrorCanNotCreateDir",$dir); - $error++; - } + print ''; } - } - - if($conf->propal->enabled) { - $graphfiles['propal']=array('modulepart'=>'productstats_proposals', - 'file' => $object->id.'/propal12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.'.png', - 'label' => ($mode=='byunit'?$langs->transnoentitiesnoconv("NumberOfUnitsProposals"):$langs->transnoentitiesnoconv("NumberOfProposals"))); - } - - if($conf->supplier_proposal->enabled) { - $graphfiles['proposalssuppliers']=array('modulepart'=>'productstats_proposalssuppliers', - 'file' => $object->id.'/proposalssuppliers12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.'.png', - 'label' => ($mode=='byunit'?$langs->transnoentitiesnoconv("NumberOfUnitsSupplierProposals"):$langs->transnoentitiesnoconv("NumberOfSupplierProposals"))); - } - - if($conf->order->enabled) { - $graphfiles['orders']=array('modulepart'=>'productstats_orders', - 'file' => $object->id.'/orders12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.'.png', - 'label' => ($mode=='byunit'?$langs->transnoentitiesnoconv("NumberOfUnitsCustomerOrders"):$langs->transnoentitiesnoconv("NumberOfCustomerOrders"))); - } - - if($conf->fournisseur->enabled) { - $graphfiles['orderssuppliers']=array('modulepart'=>'productstats_orderssuppliers', - 'file' => $object->id.'/orderssuppliers12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.'.png', - 'label' => ($mode=='byunit'?$langs->transnoentitiesnoconv("NumberOfUnitsSupplierOrders"):$langs->transnoentitiesnoconv("NumberOfSupplierOrders"))); - } - - if($conf->facture->enabled) { - $graphfiles['invoices']=array('modulepart'=>'productstats_invoices', - 'file' => $object->id.'/invoices12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.'.png', - 'label' => ($mode=='byunit'?$langs->transnoentitiesnoconv("NumberOfUnitsCustomerInvoices"):$langs->transnoentitiesnoconv("NumberOfCustomerInvoices"))); - - $graphfiles['invoicessuppliers']=array('modulepart'=>'productstats_invoicessuppliers', - 'file' => $object->id.'/invoicessuppliers12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.'.png', - 'label' => ($mode=='byunit'?$langs->transnoentitiesnoconv("NumberOfUnitsSupplierInvoices"):$langs->transnoentitiesnoconv("NumberOfSupplierInvoices"))); - } - - $px = new DolGraph(); - - if (! $error && count($graphfiles)>0) + } + + // Year + print ''; + print '
'.$langs->trans("Categories").''; + //$moreforfilter.='
'; + $moreforfilter.=$htmlother->select_categories(Categorie::TYPE_PRODUCT,$search_categ,'search_categ',1); + //$moreforfilter.='
'; + print $moreforfilter; + print '
'.$langs->trans("Year").''; + $arrayyears=array(); + for ($year = $currentyear - 10; $year < $currentyear + 10 ; $year++) { - $mesg = $px->isGraphKo(); - if (! $mesg) - { - foreach($graphfiles as $key => $val) - { - if (! $graphfiles[$key]['file']) continue; - - $graph_data = array(); - - if (dol_is_file($dir . '/' . $graphfiles[$key]['file'])) - { - // TODO Load cachefile $graphfiles[$key]['file'] - } - else - { - if ($key == 'propal') $graph_data = $object->get_nb_propal($socid,$mode,((string) $type != '' ? $type : -1)); - if ($key == 'orders') $graph_data = $object->get_nb_order($socid,$mode,((string) $type != '' ? $type : -1)); - if ($key == 'invoices') $graph_data = $object->get_nb_vente($socid,$mode,((string) $type != '' ? $type : -1)); - if ($key == 'proposalssuppliers') $graph_data = $object->get_nb_propalsupplier($socid,$mode,((string) $type != '' ? $type : -1)); - if ($key == 'invoicessuppliers') $graph_data = $object->get_nb_achat($socid,$mode,((string) $type != '' ? $type : -1)); - if ($key == 'orderssuppliers') $graph_data = $object->get_nb_ordersupplier($socid,$mode,((string) $type != '' ? $type : -1)); - - // TODO Save cachefile $graphfiles[$key]['file'] - } - - if (is_array($graph_data)) - { - $px->SetData($graph_data); - $px->SetYLabel($graphfiles[$key]['label']); - $px->SetMaxValue($px->GetCeilMaxValue()<0?0:$px->GetCeilMaxValue()); - $px->SetMinValue($px->GetFloorMinValue()>0?0:$px->GetFloorMinValue()); - $px->SetWidth($WIDTH); - $px->SetHeight($HEIGHT); - $px->SetHorizTickIncrement(1); - $px->SetPrecisionY(0); - $px->SetShading(3); - //print 'x '.$key.' '.$graphfiles[$key]['file']; - - $url=DOL_URL_ROOT.'/viewimage.php?modulepart='.$graphfiles[$key]['modulepart'].'&entity='.$object->entity.'&file='.urlencode($graphfiles[$key]['file']); - $px->draw($dir."/".$graphfiles[$key]['file'],$url); - - $graphfiles[$key]['output']=$px->show(); - } - else - { - dol_print_error($db,'Error for calculating graph on key='.$key.' - '.$object->error); - } - } - } - - $mesg = $langs->trans("ChartGenerated"); + $arrayyears[$year]=$year; } + if (! in_array($year,$arrayyears)) $arrayyears[$year]=$year; + if (! in_array($nowyear,$arrayyears)) $arrayyears[$nowyear]=$nowyear; + arsort($arrayyears); + print $form->selectarray('search_year',$arrayyears,$search_year,0); + print '
'; + print '
'; + print ''; + + print '
'; + - // Show graphs - $i=0; - if ( count($graphfiles)>0) + // Choice of stats mode (byunit or bynumber) + if (! empty($conf->dol_use_jmobile)) print "\n".''; + else print '
'; + print '
'; + + //print ''; + + // Generation des graphs + $dir = (! empty($conf->product->multidir_temp[$object->entity])?$conf->product->multidir_temp[$object->entity]:$conf->service->multidir_temp[$object->entity]); + if ($object->id > 0) // We are on statistics for a dedicated product + { + if (! file_exists($dir.'/'.$object->id)) + { + if (dol_mkdir($dir.'/'.$object->id) < 0) + { + $mesg = $langs->trans("ErrorCanNotCreateDir",$dir); + $error++; + } + } + } + + if($conf->propal->enabled) { + $graphfiles['propal']=array('modulepart'=>'productstats_proposals', + 'file' => $object->id.'/propal12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year?'_year'.$search_year:'').'.png', + 'label' => ($mode=='byunit'?$langs->transnoentitiesnoconv("NumberOfUnitsProposals"):$langs->transnoentitiesnoconv("NumberOfProposals"))); + } + + if($conf->supplier_proposal->enabled) { + $graphfiles['proposalssuppliers']=array('modulepart'=>'productstats_proposalssuppliers', + 'file' => $object->id.'/proposalssuppliers12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year?'_year'.$search_year:'').'.png', + 'label' => ($mode=='byunit'?$langs->transnoentitiesnoconv("NumberOfUnitsSupplierProposals"):$langs->transnoentitiesnoconv("NumberOfSupplierProposals"))); + } + + if($conf->order->enabled) { + $graphfiles['orders']=array('modulepart'=>'productstats_orders', + 'file' => $object->id.'/orders12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year?'_year'.$search_year:'').'.png', + 'label' => ($mode=='byunit'?$langs->transnoentitiesnoconv("NumberOfUnitsCustomerOrders"):$langs->transnoentitiesnoconv("NumberOfCustomerOrders"))); + } + + if($conf->fournisseur->enabled) { + $graphfiles['orderssuppliers']=array('modulepart'=>'productstats_orderssuppliers', + 'file' => $object->id.'/orderssuppliers12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year?'_year'.$search_year:'').'.png', + 'label' => ($mode=='byunit'?$langs->transnoentitiesnoconv("NumberOfUnitsSupplierOrders"):$langs->transnoentitiesnoconv("NumberOfSupplierOrders"))); + } + + if($conf->facture->enabled) { + $graphfiles['invoices']=array('modulepart'=>'productstats_invoices', + 'file' => $object->id.'/invoices12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year?'_year'.$search_year:'').'.png', + 'label' => ($mode=='byunit'?$langs->transnoentitiesnoconv("NumberOfUnitsCustomerInvoices"):$langs->transnoentitiesnoconv("NumberOfCustomerInvoices"))); + + $graphfiles['invoicessuppliers']=array('modulepart'=>'productstats_invoicessuppliers', + 'file' => $object->id.'/invoicessuppliers12m'.((string) $type != '' ? '_type'.$type : '').'_'.$mode.($search_year?'_year'.$search_year:'').'.png', + 'label' => ($mode=='byunit'?$langs->transnoentitiesnoconv("NumberOfUnitsSupplierInvoices"):$langs->transnoentitiesnoconv("NumberOfSupplierInvoices"))); + } + + $px = new DolGraph(); + + if (! $error && count($graphfiles)>0) + { + $mesg = $px->isGraphKo(); + if (! $mesg) { foreach($graphfiles as $key => $val) { if (! $graphfiles[$key]['file']) continue; - - if ($graphfiles == 'propal' && ! $user->rights->propale->lire) continue; - if ($graphfiles == 'order' && ! $user->rights->commande->lire) continue; - if ($graphfiles == 'invoices' && ! $user->rights->facture->lire) continue; - if ($graphfiles == 'proposals_suppliers' && ! $user->rights->supplier_proposal->lire) continue; - if ($graphfiles == 'invoices_suppliers' && ! $user->rights->fournisseur->facture->lire) continue; - if ($graphfiles == 'orders_suppliers' && ! $user->rights->fournisseur->commande->lire) continue; - - - if ($i % 2 == 0) + + $graph_data = array(); + + if (dol_is_file($dir . '/' . $graphfiles[$key]['file'])) { - print "\n".'
'."\n"; + // TODO Load cachefile $graphfiles[$key]['file'] } else { - print "\n".'
'."\n"; + $morefilters=''; + if ($search_categ > 0) + { + $categ=new Categorie($db); + $categ->fetch($search_categ); + $listofprodids = $categ->getObjectsInCateg('product', 1); + $morefilters=' AND d.fk_product IN ('.((is_array($listofprodids) && count($listofprodids)) ? join(',',$listofprodids):'0').')'; + } + if ($search_categ == -2) + { + $morefilters=' AND d.fk_product NOT IN (SELECT cp.fk_product from '.MAIN_DB_PREFIX.'categorie_product as cp)'; + } + + if ($key == 'propal') $graph_data = $object->get_nb_propal($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters); + if ($key == 'orders') $graph_data = $object->get_nb_order($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters); + if ($key == 'invoices') $graph_data = $object->get_nb_vente($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters); + if ($key == 'proposalssuppliers') $graph_data = $object->get_nb_propalsupplier($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters); + if ($key == 'invoicessuppliers') $graph_data = $object->get_nb_achat($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters); + if ($key == 'orderssuppliers') $graph_data = $object->get_nb_ordersupplier($socid, $mode, ((string) $type != '' ? $type : -1), $search_year, $morefilters); + + // TODO Save cachefile $graphfiles[$key]['file'] } - - // Date generation - if ($graphfiles[$key]['output'] && ! $px->isGraphKo()) + + if (is_array($graph_data)) { - if (file_exists($dir."/".$graphfiles[$key]['file']) && filemtime($dir."/".$graphfiles[$key]['file'])) $dategenerated=$langs->trans("GeneratedOn",dol_print_date(filemtime($dir."/".$graphfiles[$key]['file']),"dayhour")); - else $dategenerated=$langs->trans("GeneratedOn",dol_print_date(dol_now(),"dayhour")); + $px->SetData($graph_data); + $px->SetYLabel($graphfiles[$key]['label']); + $px->SetMaxValue($px->GetCeilMaxValue()<0?0:$px->GetCeilMaxValue()); + $px->SetMinValue($px->GetFloorMinValue()>0?0:$px->GetFloorMinValue()); + $px->SetWidth($WIDTH); + $px->SetHeight($HEIGHT); + $px->SetHorizTickIncrement(1); + $px->SetPrecisionY(0); + $px->SetShading(3); + //print 'x '.$key.' '.$graphfiles[$key]['file']; + + $url=DOL_URL_ROOT.'/viewimage.php?modulepart='.$graphfiles[$key]['modulepart'].'&entity='.$object->entity.'&file='.urlencode($graphfiles[$key]['file']); + $px->draw($dir."/".$graphfiles[$key]['file'],$url); + + $graphfiles[$key]['output']=$px->show(); } else { - print $dategenerated=($mesg?''.$mesg.'':$langs->trans("ChartNotGenerated")); + dol_print_error($db,'Error for calculating graph on key='.$key.' - '.$object->error); } - $linktoregenerate='id).((string) $type != ''?'&type='.$type:'').'&action=recalcul&mode='.$mode.'">'.img_picto($langs->trans("ReCalculate").' ('.$dategenerated.')','refresh').''; - - // Show graph - print '
'; - // Label - print ''; - print ''; - print ''; - // Image - print ''; - print '
'; - print $graphfiles[$key]['label']; - print ''.$linktoregenerate.'
'; - print $graphfiles[$key]['output']; - print '
'; - - if ($i % 2 == 0) - { - print "\n".''."\n"; - } - else - { - print "\n".''; - print '

'."\n"; - } - - $i++; } } - // div not closed - if ($i % 2 == 1) - { - print "\n".'
'."\n"; - print "\n".'
'; - print '

'."\n"; - } + + $mesg = $langs->trans("ChartGenerated"); } - if (GETPOST('id') == 'all') + // Show graphs + $i=0; + if ( count($graphfiles)>0) { - dol_fiche_end(); + foreach($graphfiles as $key => $val) + { + if (! $graphfiles[$key]['file']) continue; + + if ($graphfiles == 'propal' && ! $user->rights->propale->lire) continue; + if ($graphfiles == 'order' && ! $user->rights->commande->lire) continue; + if ($graphfiles == 'invoices' && ! $user->rights->facture->lire) continue; + if ($graphfiles == 'proposals_suppliers' && ! $user->rights->supplier_proposal->lire) continue; + if ($graphfiles == 'invoices_suppliers' && ! $user->rights->fournisseur->facture->lire) continue; + if ($graphfiles == 'orders_suppliers' && ! $user->rights->fournisseur->commande->lire) continue; + + + if ($i % 2 == 0) + { + print "\n".'
'."\n"; + } + else + { + print "\n".'
'."\n"; + } + + // Date generation + if ($graphfiles[$key]['output'] && ! $px->isGraphKo()) + { + if (file_exists($dir."/".$graphfiles[$key]['file']) && filemtime($dir."/".$graphfiles[$key]['file'])) $dategenerated=$langs->trans("GeneratedOn",dol_print_date(filemtime($dir."/".$graphfiles[$key]['file']),"dayhour")); + else $dategenerated=$langs->trans("GeneratedOn",dol_print_date(dol_now(),"dayhour")); + } + else + { + print $dategenerated=($mesg?''.$mesg.'':$langs->trans("ChartNotGenerated")); + } + $linktoregenerate='id).((string) $type != ''?'&type='.$type:'').'&action=recalcul&mode='.$mode.'&search_year='.$search_year.'&search_categ='.$search_categ.'">'.img_picto($langs->trans("ReCalculate").' ('.$dategenerated.')','refresh').''; + + // Show graph + print ''; + // Label + print ''; + print ''; + print ''; + // Image + print ''; + print '
'; + print $graphfiles[$key]['label']; + print ''.$linktoregenerate.'
'; + print $graphfiles[$key]['output']; + print '
'; + + if ($i % 2 == 0) + { + print "\n".'
'."\n"; + } + else + { + print "\n".'
'; + print '

'."\n"; + } + + $i++; + } + } + // div not closed + if ($i % 2 == 1) + { + print "\n".'
'."\n"; + print "\n".'
'; + print '

'."\n"; } } -else + +if (! $id) { - dol_print_error(); + dol_fiche_end(); } llxFooter(); diff --git a/htdocs/product/stats/commande.php b/htdocs/product/stats/commande.php index 341d002a1af..1c72d5f6615 100644 --- a/htdocs/product/stats/commande.php +++ b/htdocs/product/stats/commande.php @@ -94,7 +94,7 @@ if ($id > 0 || ! empty($ref)) $head=product_prepare_head($product); $titre=$langs->trans("CardProduct".$product->type); $picto=($product->type==Product::TYPE_SERVICE?'service':'product'); - dol_fiche_head($head, 'referers', $titre, 0, $picto); + dol_fiche_head($head, 'referers', $titre, -1, $picto); $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$product,$action); // Note that $action and $object may have been modified by hook if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); diff --git a/htdocs/product/stats/commande_fournisseur.php b/htdocs/product/stats/commande_fournisseur.php index bed3be1892f..3201e7ed2e8 100644 --- a/htdocs/product/stats/commande_fournisseur.php +++ b/htdocs/product/stats/commande_fournisseur.php @@ -101,7 +101,7 @@ if ($id > 0 || ! empty($ref)) { $head = product_prepare_head($product); $titre = $langs->trans("CardProduct" . $product->type); $picto = ($product->type == Product::TYPE_SERVICE ? 'service' : 'product'); - dol_fiche_head($head, 'referers', $titre, 0, $picto); + dol_fiche_head($head, 'referers', $titre, -1, $picto); $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $product, $action); // Note that $action and $object may have been modified by hook if ($reshook < 0) diff --git a/htdocs/product/stats/contrat.php b/htdocs/product/stats/contrat.php index 6a8183ca7de..e2f5bccc430 100644 --- a/htdocs/product/stats/contrat.php +++ b/htdocs/product/stats/contrat.php @@ -84,7 +84,7 @@ if ($id > 0 || ! empty($ref)) $head=product_prepare_head($product); $titre=$langs->trans("CardProduct".$product->type); $picto=($product->type==Product::TYPE_SERVICE?'service':'product'); - dol_fiche_head($head, 'referers', $titre, 0, $picto); + dol_fiche_head($head, 'referers', $titre, -1, $picto); $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$product,$action); // Note that $action and $object may have been modified by hook if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); diff --git a/htdocs/product/stats/facture.php b/htdocs/product/stats/facture.php index f0e5b0f13c4..506689a6001 100644 --- a/htdocs/product/stats/facture.php +++ b/htdocs/product/stats/facture.php @@ -111,7 +111,7 @@ if ($id > 0 || ! empty($ref)) $head=product_prepare_head($product); $titre=$langs->trans("CardProduct".$product->type); $picto=($product->type==Product::TYPE_SERVICE?'service':'product'); - dol_fiche_head($head, 'referers', $titre, 0, $picto); + dol_fiche_head($head, 'referers', $titre, -1, $picto); $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$product,$action); // Note that $action and $object may have been modified by hook if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); diff --git a/htdocs/product/stats/facture_fournisseur.php b/htdocs/product/stats/facture_fournisseur.php index 6fe189c7700..ac2849fefcf 100644 --- a/htdocs/product/stats/facture_fournisseur.php +++ b/htdocs/product/stats/facture_fournisseur.php @@ -96,7 +96,7 @@ if ($id > 0 || ! empty($ref)) $head = product_prepare_head($product); $titre = $langs->trans("CardProduct" . $product->type); $picto = ($product->type == Product::TYPE_SERVICE ? 'service' : 'product'); - dol_fiche_head($head, 'referers', $titre, 0, $picto); + dol_fiche_head($head, 'referers', $titre, -1, $picto); $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $product, $action); // Note that $action and $object may have been modified by hook if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); diff --git a/htdocs/product/stats/propal.php b/htdocs/product/stats/propal.php index 289cf3d3578..06d43838bce 100644 --- a/htdocs/product/stats/propal.php +++ b/htdocs/product/stats/propal.php @@ -94,7 +94,7 @@ if ($id > 0 || ! empty($ref)) $head = product_prepare_head($product); $titre = $langs->trans("CardProduct" . $product->type); $picto = ($product->type == Product::TYPE_SERVICE ? 'service' : 'product'); - dol_fiche_head($head, 'referers', $titre, 0, $picto); + dol_fiche_head($head, 'referers', $titre, -1, $picto); $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $product, $action); // Note that $action and $object may have been modified by hook if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); From 2b9f654b8cb4837a0c499ce6203c3d65b6e6c6d0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 22 May 2017 15:31:05 +0200 Subject: [PATCH 231/299] Fix translation --- htdocs/langs/en_US/other.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/langs/en_US/other.lang b/htdocs/langs/en_US/other.lang index 02fa209c340..280a1666b02 100644 --- a/htdocs/langs/en_US/other.lang +++ b/htdocs/langs/en_US/other.lang @@ -158,8 +158,8 @@ AuthenticationDoesNotAllowSendNewPassword=Authentication mode is %s.
Prof Id %s is an information depending on third party country.
For example, for country %s, it's code %s. DolibarrDemo=Dolibarr ERP/CRM demo -StatsByNumberOfUnits=Statistics in number of products/services units -StatsByNumberOfEntities=Statistics in number of referring entities +StatsByNumberOfUnits=Statistics for sum of qty of products/services +StatsByNumberOfEntities=Statistics in number of referring entities (nb of invoice, or order...) NumberOfProposals=Number of proposals NumberOfCustomerOrders=Number of customer orders NumberOfCustomerInvoices=Number of customer invoices From 0cd030d856357497860b1f64dd86399738afc65b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 23 May 2017 00:13:07 +0200 Subject: [PATCH 232/299] NEW Introduce mass actions on contacts --- htdocs/contact/list.php | 105 +++++++++++++++++++++++++++------------- htdocs/main.inc.php | 2 +- htdocs/societe/list.php | 10 ++-- 3 files changed, 79 insertions(+), 38 deletions(-) diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index fc601cf8a53..39557a6e455 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -32,8 +32,13 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; -$langs->load("companies"); -$langs->load("suppliers"); +$langs->loadLangs(array("companies", "suppliers")); + +$action=GETPOST('action','alpha'); +$massaction=GETPOST('massaction','alpha'); +$show_files=GETPOST('show_files','int'); +$confirm=GETPOST('confirm','alpha'); +$toselect = GETPOST('toselect', 'array'); // Security check $id = GETPOST('id','int'); @@ -177,7 +182,7 @@ if (empty($reshook)) // Selection of new fields include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php'; - // Purge search criteria + // Did we click on purge search criteria ? if (GETPOST('button_removefilter_x') || GETPOST('button_removefilter.x') || GETPOST('button_removefilter')) // All tests are required to be compatible with all browsers { $sall=""; @@ -198,6 +203,7 @@ if (empty($reshook)) $search_categ=''; $search_categ_thirdparty=''; $search_categ_supplier=''; + $toselect=''; $search_array_options=array(); } @@ -205,7 +211,7 @@ if (empty($reshook)) $objectclass='Contact'; $objectlabel='Contact'; $permtoread = $user->rights->societe->lire; - $permtodelete = $user->rights->societe->delete; + $permtodelete = $user->rights->societe->supprimer; $uploaddir = $conf->societe->dir_output; include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php'; } @@ -224,7 +230,7 @@ $contactstatic=new Contact($db); $title = (! empty($conf->global->SOCIETE_ADDRESSES_MANAGEMENT) ? $langs->trans("Contacts") : $langs->trans("ContactsAddresses")); $sql = "SELECT s.rowid as socid, s.nom as name,"; -$sql.= " p.rowid as cidp, p.lastname as lastname, p.statut, p.firstname, p.zip, p.town, p.poste, p.email, p.skype,"; +$sql.= " p.rowid, p.lastname as lastname, p.statut, p.firstname, p.zip, p.town, p.poste, p.email, p.skype,"; $sql.= " p.phone as phone_pro, p.phone_mobile, p.phone_perso, p.fax, p.fk_pays, p.priv, p.datec as date_creation, p.tms as date_update,"; $sql.= " co.code as country_code"; // Add fields from extrafields @@ -374,8 +380,6 @@ if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) $sql.= $db->plimit($limit+1, $offset); -//print $sql; -dol_syslog("contact/list.php", LOG_DEBUG); $result = $db->query($sql); if (! $result) { @@ -385,15 +389,18 @@ if (! $result) $num = $db->num_rows($result); +$arrayofselected=is_array($toselect)?$toselect:array(); + if ($num == 1 && ! empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $sall) { $obj = $db->fetch_object($resql); - $id = $obj->cidp; + $id = $obj->rowid; header("Location: ".DOL_URL_ROOT.'/contact/card.php?id='.$id); exit; } -llxHeader('',$title,'EN:Module_Third_Parties|FR:Module_Tiers|ES:Módulo_Empresas'); +$help_url='EN:Module_Third_Parties|FR:Module_Tiers|ES:Módulo_Empresas'; +llxHeader('',$title,$help_url); $param=''; if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage; @@ -426,16 +433,26 @@ foreach ($search_array_options as $key => $val) if ($val != '') $param.='&search_options_'.$tmpkey.'='.urlencode($val); } -print '
'; +// List of mass actions available +$arrayofmassactions = array( +// 'presend'=>$langs->trans("SendByMail"), +// 'builddoc'=>$langs->trans("PDFMerge"), +); +//if($user->rights->societe->creer) $arrayofmassactions['createbills']=$langs->trans("CreateInvoiceForThisCustomer"); +if ($user->rights->societe->supprimer) $arrayofmassactions['delete']=$langs->trans("Delete"); +if ($massaction == 'presend') $arrayofmassactions=array(); +$massactionbutton=$form->selectMassAction('', $arrayofmassactions); + +print ''; if ($optioncss != '') print ''; print ''; print ''; -print ''; print ''; print ''; print ''; +print ''; -print_barre_liste($titre, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_companies.png', 0, '', '', $limit); +print_barre_liste($titre, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_companies.png', 0, '', '', $limit); if ($sall) { @@ -447,6 +464,7 @@ if ($search_firstlast_only) print $langs->trans("FilterOnInto", $search_firstlast_only) . $langs->trans("Lastname").", ".$langs->trans("Firstname"); } +$moreforfilter=''; if (! empty($conf->categorie->enabled)) { require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php'; @@ -483,6 +501,7 @@ if ($moreforfilter) $varpage=empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage; $selectedfields=$form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields +if ($massactionbutton) $selectedfields.=$form->showCheckAddButtons('checkforselect', 1); print '
'; print ''."\n"; @@ -575,7 +594,18 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab { if (! empty($arrayfields["ef.".$key]['checked'])) { - print ''; } } @@ -596,15 +626,17 @@ if (! empty($arrayfields['p.tms']['checked'])) print ''; } +// Status if (! empty($arrayfields['p.statut']['checked'])) { print ''; } +// Action column print ''; print ''; @@ -656,7 +688,7 @@ while ($i < min($num,$limit)) $contactstatic->lastname=$obj->lastname; $contactstatic->firstname=''; - $contactstatic->id=$obj->cidp; + $contactstatic->id=$obj->rowid; $contactstatic->statut=$obj->statut; $contactstatic->poste=$obj->poste; $contactstatic->email=$obj->email; @@ -696,32 +728,32 @@ while ($i < min($num,$limit)) // Phone if (! empty($arrayfields['p.phone']['checked'])) { - print ''; + print ''; } // Phone perso if (! empty($arrayfields['p.phone_perso']['checked'])) { - print ''; + print ''; } // Phone mobile if (! empty($arrayfields['p.phone_mobile']['checked'])) { - print ''; + print ''; } // Fax if (! empty($arrayfields['p.fax']['checked'])) { - print ''; + print ''; } // EMail if (! empty($arrayfields['p.email']['checked'])) { - print ''; + print ''; } // Skype if (! empty($arrayfields['p.skype']['checked'])) { - if (! empty($conf->skype->enabled)) { print ''; } + if (! empty($conf->skype->enabled)) { print ''; } } // Company if (! empty($arrayfields['p.thirdparty']['checked'])) @@ -784,28 +816,35 @@ while ($i < min($num,$limit)) { print ''; } - // Action column - Links Add action and Export vcard - print ''; + // Action column + print ''; + if (! $i) $totalarray['nbfield']++; + print "\n"; $i++; } +$db->free($result); + +$parameters=array('arrayfields'=>$arrayfields, 'sql'=>$sql); +$reshook=$hookmanager->executeHooks('printFieldListFooter',$parameters); // Note that $action and $object may have been modified by hook +print $hookmanager->resPrint; + print "
'; + $align=$extrafields->getAlignFlag($key); + $typeofextrafield=$extrafields->attribute_type[$key]; + print ''; + if (in_array($typeofextrafield, array('varchar', 'int', 'double', 'select'))) + { + $crit=$val; + $tmpkey=preg_replace('/search_options_/','',$key); + $searchclass=''; + if (in_array($typeofextrafield, array('varchar', 'select'))) $searchclass='searchstring'; + if (in_array($typeofextrafield, array('int', 'double'))) $searchclass='searchnum'; + print ''; + } print ''; print ''; print $form->selectarray('search_status', array('-1'=>'', '0'=>$langs->trans('ActivityCeased'),'1'=>$langs->trans('InActivity')),$search_status); print ''; -print ''; -print ''; +$searchpicto=$form->showFilterButtons(); +print $searchpicto; print '
'.dol_print_phone($obj->phone_pro,$obj->country_code,$obj->cidp,$obj->socid,'AC_TEL').''.dol_print_phone($obj->phone_pro,$obj->country_code,$obj->rowid,$obj->socid,'AC_TEL').''.dol_print_phone($obj->phone_perso,$obj->country_code,$obj->cidp,$obj->socid,'AC_TEL').''.dol_print_phone($obj->phone_perso,$obj->country_code,$obj->rowid,$obj->socid,'AC_TEL').''.dol_print_phone($obj->phone_mobile,$obj->country_code,$obj->cidp,$obj->socid,'AC_TEL').''.dol_print_phone($obj->phone_mobile,$obj->country_code,$obj->rowid,$obj->socid,'AC_TEL').''.dol_print_phone($obj->fax,$obj->country_code,$obj->cidp,$obj->socid,'AC_TEL').''.dol_print_phone($obj->fax,$obj->country_code,$obj->rowid,$obj->socid,'AC_TEL').''.dol_print_email($obj->email,$obj->cidp,$obj->socid,'AC_EMAIL',18).''.dol_print_email($obj->email,$obj->rowid,$obj->socid,'AC_EMAIL',18).''.dol_print_skype($obj->skype,$obj->cidp,$obj->socid,'AC_SKYPE',18).''.dol_print_skype($obj->skype,$obj->rowid,$obj->socid,'AC_SKYPE',18).''.$contactstatic->getLibStatut(3).''; - /*print ''.img_object($langs->trans("AddAction"),"action").''; - print '   '; - print ''; - print img_picto($langs->trans("VCard"),'vcard.png').' '; - print ''; */ - print ''; + if ($massactionbutton || $massaction) // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + { + $selected=0; + if (in_array($obj->rowid, $arrayofselected)) $selected=1; + print ''; + } + print '
"; print "
"; -if ($num > $limit || $page) print_barre_liste('', $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_companies.png', 0, '', '', $limit, 1); +//if ($num > $limit || $page) print_barre_liste('', $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_companies.png', 0, '', '', $limit, 1); print '
'; -$db->free($result); - llxFooter(); $db->close(); diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 73f0a815413..e674aea6d5c 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -859,7 +859,7 @@ if (! defined('NOLOGIN')) } -dol_syslog("--- Access to ".$_SERVER["PHP_SELF"]); +dol_syslog("--- Access to ".$_SERVER["PHP_SELF"].' - action='.GETPOST('action','az09').', massaction='.GETPOST('massaction','az09')); //Another call for easy debugg //dol_syslog("Access to ".$_SERVER["PHP_SELF"].' GET='.join(',',array_keys($_GET)).'->'.join(',',$_GET).' POST:'.join(',',array_keys($_POST)).'->'.join(',',$_POST)); diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index 40ca07783c4..48e1b67a69c 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -187,6 +187,8 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab } } +$object = new Societe($db); + /* * Actions @@ -196,7 +198,7 @@ if (GETPOST('cancel')) { $action='list'; $massaction=''; } if (! GETPOST('confirmmassaction') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction=''; } $parameters=array(); -$reshook=$hookmanager->executeHooks('doActions',$parameters); // Note that $action and $object may have been modified by some hooks +$reshook=$hookmanager->executeHooks('doActions',$parameters, $object, $action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); if (empty($reshook)) @@ -204,7 +206,7 @@ if (empty($reshook)) // Selection of new fields include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php'; - // Do we click on purge search criteria ? + // Did we click on purge search criteria ? if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) // All tests are required to be compatible with all browsers { $search_nom=''; @@ -603,7 +605,7 @@ if ($user->rights->societe->client->voir || $socid) $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user, 0, 1, 'maxwidth300'); $moreforfilter.=''; } -if (! empty($moreforfilter)) +if ($moreforfilter) { print '
'; print $moreforfilter; @@ -905,7 +907,7 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab if (! empty($arrayfields["ef.".$key]['checked'])) { $align=$extrafields->getAlignFlag($key); - print_liste_field_titre($extralabels[$key],$_SERVER["PHP_SELF"],"ef.".$key,"",$param,($align?'align="'.$align.'"':''),$sortfield,$sortorder); + print_liste_field_titre($langs->trans($extralabels[$key]),$_SERVER["PHP_SELF"],"ef.".$key,"",$param,($align?'align="'.$align.'"':''),$sortfield,$sortorder); } } } From 2da50f1eca2aa36fb56f540e93c8e0068e6b7417 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 23 May 2017 01:32:19 +0200 Subject: [PATCH 233/299] Look and feel v6 --- htdocs/comm/card.php | 2 +- htdocs/contact/agenda.php | 2 +- htdocs/contact/card.php | 2 +- htdocs/contact/document.php | 2 +- htdocs/contact/info.php | 2 +- htdocs/contact/ldap.php | 2 +- htdocs/contact/note.php | 50 +------------------------------------ htdocs/contact/perso.php | 2 +- htdocs/fourn/card.php | 2 +- htdocs/societe/card.php | 8 +++--- 10 files changed, 14 insertions(+), 60 deletions(-) diff --git a/htdocs/comm/card.php b/htdocs/comm/card.php index b26ce4fa7ac..7599cce4cfd 100644 --- a/htdocs/comm/card.php +++ b/htdocs/comm/card.php @@ -204,7 +204,7 @@ if ($id > 0) { $head = societe_prepare_head($object); - dol_fiche_head($head, 'customer', $langs->trans("ThirdParty"),0,'company'); + dol_fiche_head($head, 'customer', $langs->trans("ThirdParty"), -1, 'company'); $linkback = ''.$langs->trans("BackToList").''; diff --git a/htdocs/contact/agenda.php b/htdocs/contact/agenda.php index e97263ebf00..f57e088e00e 100644 --- a/htdocs/contact/agenda.php +++ b/htdocs/contact/agenda.php @@ -208,7 +208,7 @@ else dol_htmloutput_errors($error,$errors); - dol_fiche_head($head, 'agenda', $title, 0, 'contact'); + dol_fiche_head($head, 'agenda', $title, -1, 'contact'); $linkback = ''.$langs->trans("BackToList").''; diff --git a/htdocs/contact/card.php b/htdocs/contact/card.php index dfa6eec515c..fde2e428169 100644 --- a/htdocs/contact/card.php +++ b/htdocs/contact/card.php @@ -1021,7 +1021,7 @@ else dol_htmloutput_errors($error,$errors); - dol_fiche_head($head, 'card', $title, 0, 'contact'); + dol_fiche_head($head, 'card', $title, -1, 'contact'); if ($action == 'create_user') { diff --git a/htdocs/contact/document.php b/htdocs/contact/document.php index 5d70ba7b4e1..da8ef616a4f 100644 --- a/htdocs/contact/document.php +++ b/htdocs/contact/document.php @@ -96,7 +96,7 @@ if ($object->id) $head = contact_prepare_head($object); $title = (! empty($conf->global->SOCIETE_ADDRESSES_MANAGEMENT) ? $langs->trans("Contacts") : $langs->trans("ContactsAddresses")); - dol_fiche_head($head, 'documents', $title, 0, 'contact'); + dol_fiche_head($head, 'documents', $title, -1, 'contact'); // Construit liste des fichiers diff --git a/htdocs/contact/info.php b/htdocs/contact/info.php index 0250691e88d..20d379b50d0 100644 --- a/htdocs/contact/info.php +++ b/htdocs/contact/info.php @@ -59,7 +59,7 @@ if ($id > 0) $head = contact_prepare_head($object); - dol_fiche_head($head, 'info', $title, 0, 'contact'); + dol_fiche_head($head, 'info', $title, -1, 'contact'); $linkback = ''.$langs->trans("BackToList").''; diff --git a/htdocs/contact/ldap.php b/htdocs/contact/ldap.php index 3e998b43ec5..16c00bf92cb 100644 --- a/htdocs/contact/ldap.php +++ b/htdocs/contact/ldap.php @@ -88,7 +88,7 @@ $form = new Form($db); $head = contact_prepare_head($object); -dol_fiche_head($head, 'ldap', $title, 0, 'contact'); +dol_fiche_head($head, 'ldap', $title, -1, 'contact'); dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', ''); diff --git a/htdocs/contact/note.php b/htdocs/contact/note.php index c49dbc9f787..b52f9bf8727 100644 --- a/htdocs/contact/note.php +++ b/htdocs/contact/note.php @@ -73,7 +73,7 @@ if ($id > 0) $head = contact_prepare_head($object); - dol_fiche_head($head, 'note', $title,0,'contact'); + dol_fiche_head($head, 'note', $title, -1, 'contact'); $linkback = ''.$langs->trans("BackToList").''; @@ -100,61 +100,13 @@ if ($id > 0) print ''; - // Company - if (empty($conf->global->SOCIETE_DISABLE_CONTACTS)) - { - if ($object->socid > 0) - { - $objsoc = new Societe($db); - $objsoc->fetch($object->socid); - - print ''; - } - - else - { - print ''; - } - } - // Civility print ''; - // Date To Birth - print ''; - if (! empty($object->birthday)) - { - include_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; - - print ''; - } - else - { - print '"; - } - print ""; - print "
'.$langs->trans("ThirdParty").''.$objsoc->getNomUrl(1).'
'.$langs->trans("ThirdParty").''; - print $langs->trans("ContactNotLinkedToCompany"); - print '
'.$langs->trans("UserTitle").''; print $object->getCivilityLabel(); print '
'.$langs->trans("DateToBirth").''.dol_print_date($object->birthday,"day"); - - print '   '; - //var_dump($birthdatearray); - $ageyear=convertSecondToTime($now-$object->birthday,'year')-1970; - $agemonth=convertSecondToTime($now-$object->birthday,'month')-1; - if ($ageyear >= 2) print '('.$ageyear.' '.$langs->trans("DurationYears").')'; - else if ($agemonth >= 2) print '('.$agemonth.' '.$langs->trans("DurationMonths").')'; - else print '('.$agemonth.' '.$langs->trans("DurationMonth").')'; - - - print '   -   '; - if ($object->birthday_alert) print $langs->trans("BirthdayAlertOn"); - else print $langs->trans("BirthdayAlertOff"); - print ''.$langs->trans("DateToBirth").''.$langs->trans("Unknown")."
"; - print '
'; $cssclass="titlefield"; include DOL_DOCUMENT_ROOT.'/core/tpl/notes.tpl.php'; diff --git a/htdocs/contact/perso.php b/htdocs/contact/perso.php index bc4443dd8bf..30fa10b5ddc 100644 --- a/htdocs/contact/perso.php +++ b/htdocs/contact/perso.php @@ -229,7 +229,7 @@ else { // View mode - dol_fiche_head($head, 'perso', $title, 0, 'contact'); + dol_fiche_head($head, 'perso', $title, -1, 'contact'); $linkback = ''.$langs->trans("BackToList").''; diff --git a/htdocs/fourn/card.php b/htdocs/fourn/card.php index 6243a9e3a16..cfa88b187f0 100644 --- a/htdocs/fourn/card.php +++ b/htdocs/fourn/card.php @@ -130,7 +130,7 @@ if ($object->id > 0) */ $head = societe_prepare_head($object); - dol_fiche_head($head, 'supplier', $langs->trans("ThirdParty"),0,'company'); + dol_fiche_head($head, 'supplier', $langs->trans("ThirdParty"), -1, 'company'); $linkback = ''.$langs->trans("BackToList").''; diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index 14e8e4b4679..346f4ea38dc 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -1544,7 +1544,7 @@ else dol_fiche_head($head, 'card', $langs->trans("ThirdParty"), 0, 'company'); - + print '
'; print ''; // Ref/ID @@ -1934,7 +1934,8 @@ else print ''; print '
'; - + print '
'; + dol_fiche_end(); print '
'; @@ -1951,13 +1952,14 @@ else /* * View */ + if (!empty($object->id)) $res=$object->fetch_optionals($object->id,$extralabels); //if ($res < 0) { dol_print_error($db); exit; } $head = societe_prepare_head($object); - dol_fiche_head($head, 'card', $langs->trans("ThirdParty"), 0, 'company'); + dol_fiche_head($head, 'card', $langs->trans("ThirdParty"), -1, 'company'); // Confirm delete third party if ($action == 'delete' || ($conf->use_javascript_ajax && empty($conf->dol_use_jmobile))) From 8781a19e0e10d18317d81f6580bb04b8d87a9a2f Mon Sep 17 00:00:00 2001 From: arnaud Date: Tue, 23 May 2017 12:22:53 +0200 Subject: [PATCH 234/299] FIX pagination on resources --- htdocs/resource/list.php | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/htdocs/resource/list.php b/htdocs/resource/list.php index 2c97b68f7ed..6e171eef934 100644 --- a/htdocs/resource/list.php +++ b/htdocs/resource/list.php @@ -91,15 +91,11 @@ if (empty($sortorder)) $sortorder="ASC"; if (empty($sortfield)) $sortfield="t.rowid"; if (empty($arch)) $arch = 0; -$page = GETPOST('page','int'); -if ($page == -1) { - $page = 0 ; -} +$limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit; +$page = GETPOST("page"); $page = is_numeric($page) ? $page : 0; $page = $page == -1 ? 0 : $page; -if (! $sortfield) $sortfield="p.ref"; -if (! $sortorder) $sortorder="ASC"; -$offset = $conf->liste_limit * $page ; +$offset = $limit * $page ; $pageprev = $page - 1; $pagenext = $page + 1; From 71bd69a8048c2d16d10d31d9cb5c996e730e1864 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 23 May 2017 13:25:12 +0200 Subject: [PATCH 235/299] Better link to show part to edit --- htdocs/api/admin/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/api/admin/index.php b/htdocs/api/admin/index.php index d7f002d02aa..c22a12fee61 100644 --- a/htdocs/api/admin/index.php +++ b/htdocs/api/admin/index.php @@ -111,7 +111,7 @@ $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain // Show message $message=''; -$url=''.$urlwithroot.'/api/index.php/login?login='.urlencode($user->login).'&password=yourpassword[&reset=1]'; +$url=$urlwithroot.'/api/index.php/login?login=auserlogin&userpassword=thepassword[&reset=1]'; $message.=$langs->trans("UrlToGetKeyToUseAPIs").':
'; $message.=img_picto('','object_globe.png').' '.$url; print $message; From 5ebe71166567ac84835d9b87b0a8f8eb93fefa28 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 23 May 2017 13:38:48 +0200 Subject: [PATCH 236/299] Look and feel v6 --- htdocs/resource/card.php | 39 +++++++++++----- htdocs/resource/class/dolresource.class.php | 51 ++++++++++++++++----- htdocs/resource/contact.php | 31 ++++++++----- htdocs/resource/document.php | 28 +++++++---- htdocs/resource/note.php | 29 ++++++++---- 5 files changed, 125 insertions(+), 53 deletions(-) diff --git a/htdocs/resource/card.php b/htdocs/resource/card.php index d2ec14efd71..7f0a96a7ab4 100644 --- a/htdocs/resource/card.php +++ b/htdocs/resource/card.php @@ -221,29 +221,41 @@ if ( $object->fetch($id) > 0 ) } else { - dol_fiche_head($head, 'resource', $langs->trans("ResourceSingular"),0,'resource'); + dol_fiche_head($head, 'resource', $langs->trans("ResourceSingular"), -1, 'resource'); + $formconfirm = ''; + // Confirm deleting resource line if ($action == 'delete') { - print $form->formconfirm("card.php?&id=".$id,$langs->trans("DeleteResource"),$langs->trans("ConfirmDeleteResource"),"confirm_delete_resource",'','',1); + $formconfirm = $form->formconfirm("card.php?&id=".$id,$langs->trans("DeleteResource"),$langs->trans("ConfirmDeleteResource"),"confirm_delete_resource",'','',1); } - + // Print form confirm + print $formconfirm; + + + $linkback = '' . $langs->trans("BackToList") . ''; + + + $morehtmlref='
'; + $morehtmlref.='
'; + + + dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref); + + + print '
'; + print '
'; + /*--------------------------------------- * View object */ print ''; - print ''; - print ''; - // Resource type print ''; - print ''; + print ''; print ''; @@ -267,9 +279,14 @@ if ( $object->fetch($id) > 0 ) print ''; print '
'.$langs->trans("ResourceFormLabel_ref").''; - $linkback = $objet->ref.' '.$langs->trans("BackToList").''; - print $form->showrefnav($object, 'id', $linkback,1,"rowid"); - print '
' . $langs->trans("ResourceType") . '' . $langs->trans("ResourceType") . ''; print $object->type_label; print '
'; + + print '
'; + + print '

'; + + dol_fiche_end(); } - print '
'; /* * Boutons actions diff --git a/htdocs/resource/class/dolresource.class.php b/htdocs/resource/class/dolresource.class.php index 6e418e2e649..51024cfe7ee 100644 --- a/htdocs/resource/class/dolresource.class.php +++ b/htdocs/resource/class/dolresource.class.php @@ -30,18 +30,19 @@ require_once DOL_DOCUMENT_ROOT."/core/lib/functions2.lib.php"; */ class Dolresource extends CommonObject { - var $element='dolresource'; //!< Id that identify managed objects - var $table_element='resource'; //!< Name of table without prefix where object is stored - - var $resource_id; - var $resource_type; - var $element_id; - var $element_type; - var $busy; - var $mandatory; - var $fk_user_create; - var $type_label; - var $tms=''; + public $element='dolresource'; //!< Id that identify managed objects + public $table_element='resource'; //!< Name of table without prefix where object is stored + public $picto = 'resource'; + + public $resource_id; + public $resource_type; + public $element_id; + public $element_type; + public $busy; + public $mandatory; + public $fk_user_create; + public $type_label; + public $tms=''; /** * Constructor @@ -974,4 +975,30 @@ class Dolresource extends CommonObject $result.=$link.$this->ref.$linkend; return $result; } + + + /** + * Retourne le libelle du status d'un user (actif, inactif) + * + * @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto + * @return string Label of status + */ + function getLibStatut($mode=0) + { + return $this->LibStatut($this->status,$mode); + } + + /** + * Return the status + * + * @param int $status Id status + * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 5=Long label + Picto + * @return string Label of status + */ + static function LibStatut($status,$mode=0) + { + global $langs; + + return ''; + } } diff --git a/htdocs/resource/contact.php b/htdocs/resource/contact.php index 97dbb0de1be..007ecd8025d 100644 --- a/htdocs/resource/contact.php +++ b/htdocs/resource/contact.php @@ -119,23 +119,30 @@ if ($id > 0 || ! empty($ref)) $head = resource_prepare_head($object); - dol_fiche_head($head, 'contact', $langs->trans("ResourceSingular"), 0, 'resource'); + dol_fiche_head($head, 'contact', $langs->trans("ResourceSingular"), -1, 'resource'); - /* - * Resource synthese pour rappel - */ + $linkback = '' . $langs->trans("BackToList") . ''; + + + $morehtmlref='
'; + $morehtmlref.='
'; + + + dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref); + + + print '
'; + print '
'; + + + // Object + print ''; - print ''; - print ''; - // Resource type print ''; - print ''; + print ''; print ''; @@ -144,6 +151,8 @@ if ($id > 0 || ! empty($ref)) print '
'.$langs->trans("ResourceFormLabel_ref").''; - $linkback = $objet->ref.' '.$langs->trans("BackToList").''; - print $form->showrefnav($object, 'id', $linkback,1,"rowid"); - print '
' . $langs->trans("ResourceType") . '' . $langs->trans("ResourceType") . ''; print $object->type_label; print '
'; print '
'; + dol_fiche_end(); + print '
'; if (! empty($conf->global->RESOURCE_HIDE_ADD_CONTACT_USER)) $hideaddcontactforuser=1; diff --git a/htdocs/resource/document.php b/htdocs/resource/document.php index 1078e8bb94a..2d8e260d85a 100644 --- a/htdocs/resource/document.php +++ b/htdocs/resource/document.php @@ -89,7 +89,7 @@ if ($object->id) $head=resource_prepare_head($object); - dol_fiche_head($head, 'documents', $langs->trans("ResourceSingular"), 0, 'resource'); + dol_fiche_head($head, 'documents', $langs->trans("ResourceSingular"), -1, 'resource'); // Construit liste des fichiers @@ -100,19 +100,25 @@ if ($object->id) $totalsize+=$file['size']; } - + + $linkback = '' . $langs->trans("BackToList") . ''; + + + $morehtmlref='
'; + $morehtmlref.='
'; + + + dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref); + + + print '
'; + print '
'; + print ''; - - print ''; - print ''; - // Resource type print ''; - print ''; + print ''; print ''; @@ -124,6 +130,8 @@ if ($object->id) print ''; + dol_fiche_end(); + $modulepart = 'dolresource'; $permission = $user->rights->resource->write; $param = '&id=' . $object->id; diff --git a/htdocs/resource/note.php b/htdocs/resource/note.php index 30e37eba77f..20d96591c7b 100644 --- a/htdocs/resource/note.php +++ b/htdocs/resource/note.php @@ -64,24 +64,35 @@ $form = new Form($db); if ($id > 0 || ! empty($ref)) { $head = resource_prepare_head($object); - dol_fiche_head($head, 'note', $langs->trans('ResourceSingular'), 0, 'resource'); + dol_fiche_head($head, 'note', $langs->trans('ResourceSingular'), -1, 'resource'); + $linkback = '' . $langs->trans("BackToList") . ''; + + + $morehtmlref='
'; + $morehtmlref.='
'; + + + dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref); + + + print '
'; + print '
'; + print '
'.$langs->trans("ResourceFormLabel_ref").''; - $linkback = $objet->ref.' '.$langs->trans("BackToList").''; - print $form->showrefnav($object, 'id', $linkback,1,"rowid"); - print '
' . $langs->trans("ResourceType") . '' . $langs->trans("ResourceType") . ''; print $object->type_label; print '
'; - print ''; - print ''; // Resource type print ''; - print ''; + print ''; print ''; - print ''; print "
'.$langs->trans("ResourceFormLabel_ref").''; - $linkback = $objet->ref.' '.$langs->trans("BackToList").''; - print $form->showrefnav($object, 'id', $linkback,1,"rowid"); - print '
' . $langs->trans("ResourceType") . '' . $langs->trans("ResourceType") . ''; print $object->type_label; print '
"; + print '
"; - print '
'; + print '
'; + $permission=$user->rights->resource->write; $cssclass='titlefield'; include DOL_DOCUMENT_ROOT.'/core/tpl/notes.tpl.php'; From 3e37185b74de67d4f6cf5e77fdd5e2cb5ed06e28 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 23 May 2017 13:44:18 +0200 Subject: [PATCH 237/299] FIX download attached file on resource --- htdocs/core/lib/files.lib.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index c60464ed0fd..4c492d1693e 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -2214,6 +2214,16 @@ function dol_check_secure_access_document($modulepart, $original_file, $entity, $original_file=$conf->don->dir_output.'/'.$original_file; } + // Wrapping pour les dons + else if ($modulepart == 'dolresource' && !empty($conf->resource->dir_output)) + { + if ($fuser->rights->resource->{$read} || preg_match('/^specimen/i',$original_file)) + { + $accessallowed=1; + } + $original_file=$conf->resource->dir_output.'/'.$original_file; + } + // Wrapping pour les remises de cheques else if ($modulepart == 'remisecheque' && !empty($conf->banque->dir_output)) { From 80ce8da7a388f157beb81e46ed465b952004a857 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 23 May 2017 15:13:52 +0200 Subject: [PATCH 238/299] Fix migration errors and responsive design --- htdocs/contrat/card.php | 67 ++++++++++--------- htdocs/core/class/html.formactions.class.php | 5 +- htdocs/install/default.css | 6 +- .../install/mysql/migration/5.0.0-6.0.0.sql | 17 +++++ .../mysql/tables/llx_opensurvey_sondage.sql | 2 +- htdocs/install/step5.php | 8 +-- htdocs/theme/eldy/style.css.php | 2 +- htdocs/theme/md/style.css.php | 17 +++-- 8 files changed, 72 insertions(+), 52 deletions(-) diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index f00816e9d4b..31e5d6f3094 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -2083,44 +2083,45 @@ else print "
"; } - // Select mail models is same action as presend - if (GETPOST('modelselected')) { - $action = 'presend'; - } - - if ($action != 'presend') - { - print '
'; - - /* - * Documents generes - */ - $filename = dol_sanitizeFileName($object->ref); - $filedir = $conf->contrat->dir_output . "/" . dol_sanitizeFileName($object->ref); - $urlsource = $_SERVER["PHP_SELF"] . "?id=" . $object->id; - $genallowed = $user->rights->contrat->creer; - $delallowed = $user->rights->contrat->supprimer; - - $var = true; - - print $formfile->showdocuments('contract', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', 0, '', $soc->default_lang); - - - // Show links to link elements - $linktoelem = $form->showLinkToObjectBlock($object, null, array('contrat')); - $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem); - - - print '
'; - + + // Select mail models is same action as presend + if (GETPOST('modelselected')) { + $action = 'presend'; + } + + if ($action != 'presend') + { + print '
'; + + /* + * Documents generes + */ + $filename = dol_sanitizeFileName($object->ref); + $filedir = $conf->contrat->dir_output . "/" . dol_sanitizeFileName($object->ref); + $urlsource = $_SERVER["PHP_SELF"] . "?id=" . $object->id; + $genallowed = $user->rights->contrat->creer; + $delallowed = $user->rights->contrat->supprimer; + + $var = true; + + print $formfile->showdocuments('contract', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', 0, '', $soc->default_lang); + + + // Show links to link elements + $linktoelem = $form->showLinkToObjectBlock($object, null, array('contrat')); + $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem); + + + print '
'; + // List of actions on element include_once DOL_DOCUMENT_ROOT . '/core/class/html.formactions.class.php'; $formactions = new FormActions($db); $somethingshown = $formactions->showactions($object, 'contract', $socid); - - print '
'; - } + + print '
'; + } /* * Action presend diff --git a/htdocs/core/class/html.formactions.class.php b/htdocs/core/class/html.formactions.class.php index 452ff89d914..456faa7931e 100644 --- a/htdocs/core/class/html.formactions.class.php +++ b/htdocs/core/class/html.formactions.class.php @@ -189,7 +189,9 @@ class FormActions $page=0; $param=''; $sortfield='a.datep'; - $total = 0; $var=true; + $total = 0; + + print '
'; print ''; print ''; print_liste_field_titre($langs->trans('Ref'), $_SERVER["PHP_SELF"], '', $page, $param, ''); @@ -243,6 +245,7 @@ class FormActions print ''; } print '
'; + print '
'; } return $num; diff --git a/htdocs/install/default.css b/htdocs/install/default.css index 9725b06b8bc..b3905e63a49 100644 --- a/htdocs/install/default.css +++ b/htdocs/install/default.css @@ -54,9 +54,9 @@ span.titre { font-weight: bold; background: #FFFFFF; color: #444; - border: 1px solid #999; - padding: 5px 5px 5px 5px; - margin: 0 0 0 15px; + border: 1px solid #bbb; + padding: 10px 10px 10px 10px; + margin: 0 0 10px 10px; } div.soustitre { diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index 0bd68ddfcfb..a21c340b556 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -25,6 +25,23 @@ -- -- VMYSQL4.1 DELETE FROM llx_usergroup_user WHERE fk_usergroup NOT IN (SELECT rowid from llx_usergroup); +-- Clean corrupted values for tms +-- VMYSQL4.1 SET sql_mode = 'ALLOW_INVALID_DATES'; +-- VMYSQL4.1 update llx_opensurvey_sondage set tms = date_fin where DATE(STR_TO_DATE(tms, '%Y-%m-%d')) IS NULL; +-- VMYSQL4.1 SET sql_mode = 'NO_ZERO_DATE'; +-- VMYSQL4.1 update llx_opensurvey_sondage set tms = date_fin where DATE(STR_TO_DATE(tms, '%Y-%m-%d')) IS NULL; +-- Remove default not null on date_fin +-- VMYSQL4.3 ALTER TABLE llx_opensurvey_sondage MODIFY COLUMN date_fin DATETIME NULL DEFAULT NULL; +-- VPGSQL8.2 ALTER TABLE llx_opensurvey_sondage ALTER COLUMN date_fin DROP NOT NULL; + +ALTER TABLE llx_opensurvey_sondage MODIFY COLUMN tms timestamp DEFAULT CURRENT_TIMESTAMP; + +ALTER TABLE llx_opensurvey_sondage ADD COLUMN fk_user_creat integer NOT NULL DEFAULT 0; +ALTER TABLE llx_opensurvey_sondage ADD COLUMN status integer DEFAULT 1 after date_fin; +ALTER TABLE llx_opensurvey_sondage ADD COLUMN entity integer DEFAULT 1 NOT NULL; +ALTER TABLE llx_opensurvey_sondage ADD COLUMN allow_comments tinyint NOT NULL DEFAULT 1; + + create table llx_notify_def_object ( id integer AUTO_INCREMENT PRIMARY KEY, diff --git a/htdocs/install/mysql/tables/llx_opensurvey_sondage.sql b/htdocs/install/mysql/tables/llx_opensurvey_sondage.sql index 5ea2183758a..e9b2481757d 100644 --- a/htdocs/install/mysql/tables/llx_opensurvey_sondage.sql +++ b/htdocs/install/mysql/tables/llx_opensurvey_sondage.sql @@ -23,7 +23,7 @@ CREATE TABLE llx_opensurvey_sondage ( nom_admin VARCHAR(64), fk_user_creat integer NOT NULL, titre TEXT NOT NULL, - date_fin DATETIME NOT NULL, + date_fin DATETIME NULL, status integer DEFAULT 1, format VARCHAR(2) NOT NULL, -- 'A' = Text choice (choices are saved into sujet field), 'D' = Date choice (choices are saved into sujet field), 'F' = Form survey mailsonde tinyint NOT NULL DEFAULT 0, diff --git a/htdocs/install/step5.php b/htdocs/install/step5.php index 96cc1c4fdcf..875fd9378f2 100644 --- a/htdocs/install/step5.php +++ b/htdocs/install/step5.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2012 Laurent Destailleur + * Copyright (C) 2004-2017 Laurent Destailleur * Copyright (C) 2004 Benoit Mortier * Copyright (C) 2004 Sebastien DiCintio * Copyright (C) 2005-2012 Regis Houssin @@ -395,11 +395,11 @@ elseif (empty($action) || preg_match('/upgrade/i',$action)) print '
'.$langs->trans("WarningRemoveInstallDir")."
"; } - print "
"; + print "

"; print ''; + print $langs->trans("GoToDolibarr").'...'; + print '

'; } else { diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index b8f31b4e224..a8eddcd825f 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -698,7 +698,7 @@ div.fiche>form>div.div-table-responsive { justify-content: flex-start; } .thumbstat { - flex: 1 1 114px; + flex: 1 1 116px; } .thumbstat150 { flex: 1 1 170px; diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 91a4c0922d9..943540fa02f 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -544,7 +544,7 @@ textarea.centpercent { .cursorpointer { cursor: pointer; } -.cusormove { +.cursormove { cursor: move; } .badge { @@ -701,7 +701,7 @@ div.fiche>form>div.div-table-responsive { justify-content: flex-start; } .thumbstat { - flex: 1 1 114px; + flex: 1 1 116px; } .thumbstat150 { flex: 1 1 150px; @@ -1979,9 +1979,10 @@ div.tabsElem { margin-top: 6px; } /* To avoid overlap of tabs when not browser div.tabBar { color: #; - padding-top: px; - padding-left: px; - padding-right: px; + padding-top: 16px; + padding-left: 16px; + padding-right: 16px; + padding-bottom: 16px; margin: 0px 0px 16px 0px; -moz-border-radius:3px; -webkit-border-radius: 3px; @@ -1991,8 +1992,6 @@ div.tabBar { border-top: 1px solid #CCC; width: auto; background: rgb(); - - padding-bottom: 12px; border-bottom: 1px solid #aaa; } div.tabBar div.titre { @@ -4627,8 +4626,8 @@ border-top-right-radius: 6px; } div.tabBar { - padding-left: 0px; - padding-right: 0px; + padding-left: 8px; + padding-right: 8px; -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0px; From cea98ce5cbfe4baaee079cbab4923e862650c461 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 23 May 2017 15:30:56 +0200 Subject: [PATCH 239/299] Look and feel v6 --- .../install/mysql/migration/5.0.0-6.0.0.sql | 2 ++ htdocs/opensurvey/card.php | 31 ++++++++-------- .../class/opensurveysondage.class.php | 25 ++++++------- htdocs/opensurvey/results.php | 35 ++++++++++--------- 4 files changed, 47 insertions(+), 46 deletions(-) diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index a21c340b556..6c71f279867 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -40,6 +40,8 @@ ALTER TABLE llx_opensurvey_sondage ADD COLUMN fk_user_creat integer NOT NULL DEF ALTER TABLE llx_opensurvey_sondage ADD COLUMN status integer DEFAULT 1 after date_fin; ALTER TABLE llx_opensurvey_sondage ADD COLUMN entity integer DEFAULT 1 NOT NULL; ALTER TABLE llx_opensurvey_sondage ADD COLUMN allow_comments tinyint NOT NULL DEFAULT 1; +ALTER TABLE llx_opensurvey_sondage ADD COLUMN allow_spy tinyint NOT NULL DEFAULT 1 AFTER allow_comments; +ALTER TABLE llx_opensurvey_sondage ADD COLUMN sujet TEXT; create table llx_notify_def_object diff --git a/htdocs/opensurvey/card.php b/htdocs/opensurvey/card.php index d7a466a5217..707af9f7115 100644 --- a/htdocs/opensurvey/card.php +++ b/htdocs/opensurvey/card.php @@ -212,22 +212,23 @@ print ''; $head = opensurvey_prepare_head($object); -dol_fiche_head($head,'general',$langs->trans("Survey"),0,dol_buildpath('/opensurvey/img/object_opensurvey.png',1),1); +dol_fiche_head($head,'general',$langs->trans("Survey"), -1, DOL_URL_ROOT.'/opensurvey/img/object_opensurvey.png', 1); + +$morehtmlref = ''; + +$linkback = ''.$langs->trans("BackToList").''; + +dol_banner_tab($object, 'id', $linkback, 1, 'id_sondage', 'id_sondage', $morehtmlref); + + +print '
'; +print '
'; print ''; -$linkback = ''.$langs->trans("BackToList").''; - -// Ref -print ''; -print ''; -print ''; - // Type $type=($object->format=="A")?'classic':'date'; -print ''; @@ -242,12 +243,6 @@ if ($action == 'edit') else print dol_htmlentities($object->titre); print ''; -// Status -print ''; - // Description print ''; print '
'.$langs->trans('Ref').''; -print $form->showrefnav($object, 'id', $linkback, 1, 'id_sondage', 'id_sondage'); -print '
'.$langs->trans("Type").''; +print '
'.$langs->trans("Type").''; print img_picto('',dol_buildpath('/opensurvey/img/'.($type == 'classic'?'chart-32.png':'calendar-32.png'),1),'width="16"',1); print ' '.$langs->trans($type=='classic'?"TypeClassic":"TypeDate").'
'; -print $langs->trans("Status") .''; -print $object->getLibStatut(4); -print '
'.$langs->trans("Description") .''; if ($action == 'edit') @@ -345,6 +340,8 @@ print '
'; +print '
'; + dol_fiche_end(); if ($action == 'edit') diff --git a/htdocs/opensurvey/class/opensurveysondage.class.php b/htdocs/opensurvey/class/opensurveysondage.class.php index 5ad27731d88..95af2b130d5 100644 --- a/htdocs/opensurvey/class/opensurveysondage.class.php +++ b/htdocs/opensurvey/class/opensurveysondage.class.php @@ -34,19 +34,20 @@ require_once(DOL_DOCUMENT_ROOT."/core/class/commonobject.class.php"); */ class Opensurveysondage extends CommonObject { - var $element='opensurvey_sondage'; //!< Id that identify managed objects - var $table_element='opensurvey_sondage'; //!< Name of table without prefix where object is stored - - var $id_sondage; + public $element='opensurvey_sondage'; //!< Id that identify managed objects + public $table_element='opensurvey_sondage'; //!< Name of table without prefix where object is stored + public $picto = 'opensurvey'; + + public $id_sondage; /** * @deprecated * @see description */ - var $commentaires; + public $commentaires; public $description; - var $mail_admin; - var $nom_admin; + public $mail_admin; + public $nom_admin; /** * Id of user author of the poll @@ -54,11 +55,11 @@ class Opensurveysondage extends CommonObject */ public $fk_user_creat; - var $titre; - var $date_fin=''; - var $status=1; - var $format; - var $mailsonde; + public $titre; + public $date_fin=''; + public $status=1; + public $format; + public $mailsonde; public $sujet; diff --git a/htdocs/opensurvey/results.php b/htdocs/opensurvey/results.php index f10e21effe1..9bfb15b2c24 100644 --- a/htdocs/opensurvey/results.php +++ b/htdocs/opensurvey/results.php @@ -426,23 +426,23 @@ print '
'."\n"; $head = opensurvey_prepare_head($object); -print dol_get_fiche_head($head,'preview',$langs->trans("Survey"),0,dol_buildpath('/opensurvey/img/object_opensurvey.png',1),1); +dol_fiche_head($head,'preview',$langs->trans("Survey"), -1, DOL_URL_ROOT.'/opensurvey/img/object_opensurvey.png', 1); +$morehtmlref = ''; + +$linkback = ''.$langs->trans("BackToList").''; + +dol_banner_tab($object, 'id', $linkback, 1, 'id_sondage', 'id_sondage', $morehtmlref); + + +print '
'; +print '
'; print ''; -$linkback = ''.$langs->trans("BackToList").''; - -// Ref -print ''; -print ''; -print ''; - // Type $type=($object->format=="A")?'classic':'date'; -print ''; @@ -499,6 +499,8 @@ print ''; print '
'.$langs->trans('Ref').''; -print $form->showrefnav($object, 'id', $linkback, 1, 'id_sondage', 'id_sondage'); -print '
'.$langs->trans("Type").''; +print '
'.$langs->trans("Type").''; print img_picto('',dol_buildpath('/opensurvey/img/'.($type == 'classic'?'chart-32.png':'calendar-32.png'),1),'width="16"',1); print ' '.$langs->trans($type=='classic'?"TypeClassic":"TypeDate").'
'; +print '
'; + dol_fiche_end(); print '
'."\n"; @@ -1045,7 +1047,7 @@ print ''."\n"; print '
'."\n"; -$toutsujet = explode(",", $object->sujet); +$toutsujet = explode(",", $object->sujet); // With old versions, this field was not set $compteursujet = 0; $meilleursujet = ''; @@ -1056,7 +1058,7 @@ for ($i = 0; $i < $nbcolonnes; $i++) { if ($object->format == "D") { $meilleursujetexport = $toutsujet[$i]; - if (strpos($toutsujet[$i], '@') !== false) { + if (strpos($toutsujet[$i], '@') !== false) { $toutsujetdate = explode("@", $toutsujet[$i]); $meilleursujet .= dol_print_date($toutsujetdate[0],'daytext'). ' ('.dol_print_date($toutsujetdate[0],'%A').')' . ' - ' . $toutsujetdate[1]; } else { @@ -1072,8 +1074,7 @@ for ($i = 0; $i < $nbcolonnes; $i++) { $compteursujet++; } } - -$meilleursujet = substr("$meilleursujet", 1); +$meilleursujet = substr($meilleursujet, 1); $meilleursujet = str_replace("°", "'", $meilleursujet); // Show best choice @@ -1083,9 +1084,9 @@ if ($nbofcheckbox >= 2) print '

'."\n"; if (isset($meilleurecolonne) && $compteursujet == "1") { - print " " . $langs->trans('TheBestChoice') . ": ".$meilleursujet." " . $langs->trans("with") . " $meilleurecolonne " . $vote_str . ".\n"; + print " " . $langs->trans('TheBestChoice') . ": ".$meilleursujet." " . $langs->trans("with") . " ".$meilleurecolonne."" . $vote_str . ".\n"; } elseif (isset($meilleurecolonne)) { - print " " . $langs->trans('TheBestChoices') . ": ".$meilleursujet." " . $langs->trans("with") . " $meilleurecolonne " . $vote_str . ".\n"; + print " " . $langs->trans('TheBestChoices') . ": ".$meilleursujet." " . $langs->trans("with") . " ".$meilleurecolonne."" . $vote_str . ".\n"; } print '


'."\n"; } From 67b3e3da99cbcbcc974f08bb240b31dee3d7d2b0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 23 May 2017 15:51:39 +0200 Subject: [PATCH 240/299] FIX #6784 --- htdocs/core/lib/ajax.lib.php | 6 +++--- htdocs/opensurvey/card.php | 4 ++-- htdocs/public/opensurvey/studs.php | 3 +++ 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/htdocs/core/lib/ajax.lib.php b/htdocs/core/lib/ajax.lib.php index 9ba57abf302..d278f29b897 100644 --- a/htdocs/core/lib/ajax.lib.php +++ b/htdocs/core/lib/ajax.lib.php @@ -354,9 +354,9 @@ function ajax_dialog($title,$message,$w=350,$h=150) * Make content of an input box selected when we click into input field. * * @param string $htmlname Id of html object - * @param int $addlink Add a link to after + * @param string $addlink Add a 'link to' after */ -function ajax_autoselect($htmlname, $addlink=0) +function ajax_autoselect($htmlname, $addlink='') { global $langs; $out = ''; - if ($addlink) $out.=' '.$langs->trans("Link").''; + if ($addlink) $out.=' '.$langs->trans("Link").''; return $out; } diff --git a/htdocs/opensurvey/card.php b/htdocs/opensurvey/card.php index 707af9f7115..18326321a4b 100644 --- a/htdocs/opensurvey/card.php +++ b/htdocs/opensurvey/card.php @@ -332,9 +332,9 @@ $urlwithouturlroot=preg_replace('/'.preg_quote(DOL_URL_ROOT,'/').'$/i','',trim($ $urlwithroot=$urlwithouturlroot.DOL_URL_ROOT; // This is to use external domain name found into config file //$urlwithroot=DOL_MAIN_URL_ROOT; // This is to use same domain name than current -$url=$urlwithouturlroot.dol_buildpath('/public/opensurvey/studs.php',1).'?sondage='.$object->id_sondage; +$url=$urlwithroot.'/public/opensurvey/studs.php?sondage='.$object->id_sondage; print ''; -if ($action != 'edit') print ajax_autoselect("opensurveyurl", 1); +if ($action != 'edit') print ajax_autoselect("opensurveyurl", $url); print ''; diff --git a/htdocs/public/opensurvey/studs.php b/htdocs/public/opensurvey/studs.php index 98d267fdd72..8e769452ec1 100644 --- a/htdocs/public/opensurvey/studs.php +++ b/htdocs/public/opensurvey/studs.php @@ -47,6 +47,9 @@ $nblignes=$object->fetch_lines(); //If the survey has not yet finished, then it can be modified $canbemodified = ((empty($object->date_fin) || $object->date_fin > dol_now()) && $object->status != Opensurveysondage::STATUS_CLOSED); +// Security check +if (empty($conf->opensurvey->enabled)) accessforbidden('',0,0,1); + /* * Actions From c98f0ba45713c6f66750c4328b3e76323ef6bfe6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 23 May 2017 15:57:18 +0200 Subject: [PATCH 241/299] Fix typo --- htdocs/langs/en_US/stocks.lang | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/langs/en_US/stocks.lang b/htdocs/langs/en_US/stocks.lang index 0d2f10a2165..97ddedc3231 100644 --- a/htdocs/langs/en_US/stocks.lang +++ b/htdocs/langs/en_US/stocks.lang @@ -119,7 +119,7 @@ NbOfProductBeforePeriod=Quantity of product %s in stock before selected period ( NbOfProductAfterPeriod=Quantity of product %s in stock after selected period (> %s) MassMovement=Mass movement SelectProductInAndOutWareHouse=Select a product, a quantity, a source warehouse and a target warehouse, then click "%s". Once this is done for all required movements, click onto "%s". -RecordMovement=Record transfert +RecordMovement=Record transfer ReceivingForSameOrder=Receipts for this order StockMovementRecorded=Stock movements recorded RuleForStockAvailability=Rules on stock requirements From 3898cfe02f4acf744595eee9fdd51fac5a562a57 Mon Sep 17 00:00:00 2001 From: David Date: Tue, 23 May 2017 18:27:41 +0200 Subject: [PATCH 242/299] FIX: REST API not possible to add agendaevents --- htdocs/comm/action/class/api_agendaevents.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/action/class/api_agendaevents.class.php b/htdocs/comm/action/class/api_agendaevents.class.php index 5eeca63a4aa..b1014b9171a 100644 --- a/htdocs/comm/action/class/api_agendaevents.class.php +++ b/htdocs/comm/action/class/api_agendaevents.class.php @@ -289,7 +289,7 @@ class AgendaEvents extends DolibarrApi function _validate($data) { $event = array(); - foreach (Events::$FIELDS as $field) { + foreach (AgendaEvents::$FIELDS as $field) { if (!isset($data[$field])) throw new RestException(400, "$field field missing"); $event[$field] = $data[$field]; From a3d8da0a73f5c1c3ec2248b1bac9dc9a17e51c43 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Wed, 24 May 2017 11:27:27 +0200 Subject: [PATCH 243/299] Fix: wrong SPECIMEN value --- htdocs/user/class/usergroup.class.php | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/htdocs/user/class/usergroup.class.php b/htdocs/user/class/usergroup.class.php index 81c5e986444..319b48dfffa 100644 --- a/htdocs/user/class/usergroup.class.php +++ b/htdocs/user/class/usergroup.class.php @@ -335,16 +335,16 @@ class UserGroup extends CommonObject $error++; dol_print_error($this->db); } - + if (! $error) { $this->context = array('audit'=>$langs->trans("PermissionsAdd")); - + // Call trigger $result=$this->call_trigger('GROUP_MODIFY',$user); if ($result < 0) { $error++; } // End call triggers - } + } } if ($error) { @@ -444,11 +444,11 @@ class UserGroup extends CommonObject $error++; dol_print_error($this->db); } - + if (! $error) { $this->context = array('audit'=>$langs->trans("PermissionsDelete")); - + // Call trigger $result=$this->call_trigger('GROUP_MODIFY',$user); if ($result < 0) { $error++; } @@ -805,7 +805,7 @@ class UserGroup extends CommonObject $muser=new User($this->db); $muser->fetch($val->id); $info2 = $muser->_load_ldap_info(); - $valueofldapfield[] = $muser->_load_ldap_dn($info2); + $valueofldapfield[] = $muser->_load_ldap_dn($info2); } $info[$conf->global->LDAP_GROUP_FIELD_GROUPMEMBERS] = (!empty($valueofldapfield)?$valueofldapfield:''); } @@ -833,7 +833,11 @@ class UserGroup extends CommonObject $this->note='This is a note'; $this->datec=time(); $this->datem=time(); - $this->members=array($user->id); // Members of this group is just me + + // Members of this group is just me + $this->members=array( + $user->id => $user + ); } } From 6d4c5e4b4afe56d1247f7a02bb35db26b746b5f0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 24 May 2017 11:20:56 +0200 Subject: [PATCH 244/299] Code comment --- htdocs/core/lib/functions.lib.php | 1 + htdocs/main.inc.php | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 30e1579c33e..e8ead0ed829 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -280,6 +280,7 @@ function GETPOST($paramname, $check='', $method=0, $filter=NULL, $options=NULL) $relativepathstring = preg_replace('/^custom\//', '', $relativepathstring); $relativepathstring = preg_replace('/^\//', '', $relativepathstring); + // Code for search criteria persistence. // Retrieve values if restore_lastsearch_values is set and there is saved values if (! empty($_GET['restore_lastsearch_values']) && ! empty($_SESSION['lastsearch_values_'.$relativepathstring])) // Keep $_GET here { diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index e674aea6d5c..da9e65f47ce 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1935,7 +1935,6 @@ if (! function_exists("llxFooter")) if ($comment) print ''."\n"; printCommonFooter($zone); - //var_dump($langs); // Uncommment to see the property _tab_loaded to see which language file were loaded if (empty($conf->dol_hide_leftmenu) && empty($conf->dol_use_jmobile)) print '
'."\n"; // End div container From 6eeb82ec70cd07d16d9b9711aff7ac45d1998015 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 24 May 2017 13:45:26 +0200 Subject: [PATCH 245/299] FIX dialog window with md theme must not be hidden by left menu part. --- htdocs/core/class/html.form.class.php | 2 +- htdocs/theme/eldy/style.css.php | 4 ++-- htdocs/theme/md/style.css.php | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 29ac151152a..f2249d673b8 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -968,7 +968,7 @@ class Form $out.= ajax_autocompleter($selected, $htmlname, DOL_URL_ROOT.'/societe/ajax/company.php', $urloption, $conf->global->COMPANY_USE_SEARCH_TO_SELECT, 0, $ajaxoptions); $out.=''; if (empty($hidelabel)) print $langs->trans("RefOrLabel").' : '; diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index c9562e80bad..dd91fc17d28 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -866,7 +866,7 @@ div.vmenu, td.vmenu { } .side-nav { position: absolute; - z-index: 200; + z-index: 90; display: none; } div.blockvmenulogo @@ -4222,7 +4222,7 @@ span.noborderoncategories { /* ============================================================================== */ ul.ulselectedfields { - z-index: 100; /* To have the select box appears on first plan even when near buttons are decorated by jmobile */ + z-index: 95; /* To have the select box appears on first plan even when near buttons are decorated by jmobile */ } dl.dropdown { margin:0px; diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 0d6d0fad7af..05b127250cb 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -832,7 +832,7 @@ td.showDragHandle { position: fixed; top: 50px; - z-index: 200; + z-index: 90; -webkit-transform: translateZ(0); -moz-transform: translateZ(0); -ms-transform: translateZ(0); @@ -889,7 +889,7 @@ div.login_block { position: auto; top: auto; - z-index: 200; + z-index: 90; } div.login_block { /* position: initial !important;*/ @@ -899,7 +899,7 @@ div.login_block { padding-left: 0 ! important; } #id-left { - z-index: 201; + z-index: 91; background: #FFF; border-right: 1px solid rgba(0,0,0,0.3); global->MAIN_TESTMENUHIDER)) && empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) { ?> @@ -4116,7 +4116,7 @@ span.noborderoncategories { /* ============================================================================== */ ul.ulselectedfields { - z-index: 100; /* To have the select box appears on first plan even when near buttons are decorated by jmobile */ + z-index: 90; /* To have the select box appears on first plan even when near buttons are decorated by jmobile */ } dl.dropdown { margin:0px; From f011197e0017cb7e49f51dfbbf6897dc7514c207 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 24 May 2017 15:12:45 +0200 Subject: [PATCH 246/299] Update swagger to 2.0.24 --- COPYRIGHT | 137 +----- .../Luracast/Restler/explorer/css/screen.css | 43 +- .../Restler/explorer/images/logo_small.png | Bin 1620 -> 770 bytes .../Restler/explorer/images/pet_store_api.png | Bin 0 -> 824 bytes .../Restler/explorer/images/wordnik_api.png | Bin 0 -> 980 bytes .../Luracast/Restler/explorer/index.html | 34 +- .../Restler/explorer/lib/swagger-oauth.js | 103 ++--- .../Luracast/Restler/explorer/lib/swagger.js | 425 +++++++++++------- .../Luracast/Restler/explorer/swagger-ui.js | 331 ++++++++------ .../Restler/explorer/swagger-ui.min.js | 2 +- 10 files changed, 552 insertions(+), 523 deletions(-) create mode 100644 htdocs/includes/restler/framework/Luracast/Restler/explorer/images/pet_store_api.png create mode 100644 htdocs/includes/restler/framework/Luracast/Restler/explorer/images/wordnik_api.png diff --git a/COPYRIGHT b/COPYRIGHT index 61a0f2de6bd..04f0358a655 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -21,13 +21,13 @@ GeoIP 1.4 LGPL-2.1+ Yes Mobiledetect 2.8.17 MIT License Yes Detect mobile devices browsers NuSoap 0.9.5 LGPL 2.1+ Yes Library to develop SOAP Web services (not into rpm and deb package) PEAR Mail_MIME 1.8.9 BSD Yes NuSoap dependency -odtPHP 1.0.1 GPL-2+ b Yes Library to build/edit ODT files +odtPHP 1.0.1 GPL-2+ Yes Library to build/edit ODT files ParseDown 1.6 MIT License Yes Markdown parser PHPExcel 1.8.1 LGPL-2.1+ Yes Read/Write XLS files, read ODS files php-iban 1.4.7 LGPL-3+ Yes Parse and validate IBAN (and IIBAN) bank account information in PHP PHPoAuthLib 0.8.2 MIT License Yes Library to provide oauth1 and oauth2 to different service PHPPrintIPP 1.3 GPL-2+ Yes Library to send print IPP requests -Restler 3.0.0RC6 LGPL-3+ Yes Library to develop REST Web services +Restler 3.0.0RC6 LGPL-3+ Yes Library to develop REST Web services (+ swagger-ui js lib into dir explorer) TCPDF 6.2.12 LGPL-3+ Yes PDF generation TCPDI 1.0.0 LGPL-3+ / Apache 2.0 Yes FPDI replacement Swift Mailer 5.4.2-DEV MIT license Yes Comprehensive mailing tools for PHP @@ -52,138 +52,13 @@ jQuery Timepicker 1.1.0 GPL and MIT License Yes jQuery Tiptip 1.3 GPL and MIT License Yes JS library for tooltips jsGanttImproved 1.7.5.2 BSD License Yes JS library (to build Gantt reports) JsTimezoneDetect 1.0.6 MIT License Yes JS library to detect user timezone +SwaggerUI 2.0.24 GPL-2+ Yes JS library to offer the REST API explorer For licenses compatibility informations: http://www.gnu.org/licenses/licenses.en.html -Copyright ---------- - -Copyright (C) 2016 - -Copyright (C) 2015 -- Laurent Destailleur -- Marcos García -- Alexandre Spangaro -- Frederic France -- Regis Houssin - -Copyright (C) 2014 -- Laurent Destailleur -- Raphaël Doursenaud -- Jean-François Ferry -- Marcos García -- Philippe Grand -- Florian Henry -- Regis Houssin -- Maxime Kohlhaas -- Juanjo Menent -- Alexandre Spangaro -- Frederic France - -Copyright (C) 2013 -- Christophe Battarel -- Laurent Destailleur -- Jean-François Ferry -- Marcos García -- Philippe Grand -- Florian Henry -- Regis Houssin -- Maxime Kohlhaas -- Juanjo Menent -- Adolfo Segura -- Alexandre Spangaro - -Copyright (C) 2012 -- Christophe Battarel -- Laurent Destailleur -- Jean-François Ferry -- Marcos García -- Philippe Grand -- Jean Heimburger -- Florian Henry -- Regis Houssin -- Maxime Kohlhaas -- Juanjo Menent -- Nicolas Péré -- Alexandre Spangaro - -Copyright (C) 2011 -- Laurent Destailleur -- Regis Houssin -- Juanjo Menent -- Philippe Grand -- Jean Heimburger - -Copyright (C) 2010 -- Laurent Destailleur -- Regis Houssin -- Juanjo Menent -- r2gnl -- meos - -Copyright (C) 2009 -- Laurent Destailleur -- Regis Houssin -- Juanjo Menent - -Copyright (C) 2008 -- Laurent Destailleur -- Regis Houssin -- Rodolphe Quiedeville -- Jeremie Ollivier - -Copyright (C) 2007 -- Rodolphe Quiedeville -- Laurent Destailleur -- Regis Houssin -- Auguria SARL -- Jean Heimburger -- Jeremie Ollivier - -Copyright (C) 2006 -- Auguria SARL -- Marc Barilley/Ocebo -- Laurent Destailleur -- Rodolphe Quiedeville -- Regis Houssin -- Andre Cianfarani -- Yannick Warnier -- Jean Heimburger - -Copyright (C) 2005 -- Brice Davoleau -- Laurent Destailleur -- Benoit Mortier -- Rodolphe Quiedeville -- Eric Seigne -- Matthieu Valleton -- Regis Houssin - -Copyright (C) 2004 -- Laurent Destailleur -- Rodolphe Quiedeville -- Eric Seigne -- Benoit Mortier -- Christophe Combelles -- Sebastien Di Cintio - -Copyright (C) 2003 -- Jean-Louis Bergamo -- Xavier Dutoit -- Rodolphe Quiedeville -- Emmanuel Raviart -- Eric Seigne - -Copyright (C) 2002 -- Jean-Louis Bergamo -- Rodolphe Quiedeville - -Copyright (C) 2001 -- Rodolphe Quiedeville - - - - +Copyright / Authors +------------------- +See page https://github.com/Dolibarr/dolibarr/graphs/contributors diff --git a/htdocs/includes/restler/framework/Luracast/Restler/explorer/css/screen.css b/htdocs/includes/restler/framework/Luracast/Restler/explorer/css/screen.css index 2ac5625af06..478b99837d7 100644 --- a/htdocs/includes/restler/framework/Luracast/Restler/explorer/css/screen.css +++ b/htdocs/includes/restler/framework/Luracast/Restler/explorer/css/screen.css @@ -350,7 +350,7 @@ font-size: .85em; line-height: 1.2em; overflow: auto; - max-height: 400px; + max-height: 200px; cursor: pointer; } .swagger-section .swagger-ui-wrap .model-signature ul.signature-nav { @@ -743,17 +743,20 @@ display: inline-block; font-size: 0.9em; } -.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header img { - display: block; - clear: none; - float: right; -} .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header input.submit { display: block; clear: none; float: left; padding: 6px 8px; } +.swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content div.sandbox_header span.response_throbber { + background-image: url('../images/throbber.gif'); + width: 128px; + height: 16px; + display: block; + clear: none; + float: right; +} .swagger-section .swagger-ui-wrap ul#resources li.resource ul.endpoints li.endpoint ul.operations li.operation div.content form input[type='text'].error { outline: 2px solid black; outline-color: #cc0000; @@ -1158,7 +1161,7 @@ cursor: pointer; } .swagger-section #header { - background-color: #646257; + background-color: #89bf04; padding: 14px; } .swagger-section #header a#logo { @@ -1193,7 +1196,7 @@ padding: 6px 8px; font-size: 0.9em; color: white; - background-color: #000000; + background-color: #547f00; -moz-border-radius: 4px; -webkit-border-radius: 4px; -o-border-radius: 4px; @@ -1202,35 +1205,13 @@ border-radius: 4px; } .swagger-section #header form#api_selector .input a#explore:hover { - background-color: #a41e22; + background-color: #547f00; } .swagger-section #header form#api_selector .input input { font-size: 0.9em; padding: 3px; margin: 0; } -.swagger-section #footer-nav { - margin-top: 50px; - color: #bbb; - float: left; - list-style: none; - font-size: 0.8em; -} -.swagger-section #footer-nav li { - display: block; - float: left; -} -.swagger-section #footer-nav a { - margin-right: 4px; - text-decoration: none; - font-weight: none; - padding: 4px 2px; - font-size: 0.9em; - color: #999; -} -.swagger-section #footer-nav a:hover { - color: #555; -} .swagger-section #content_message { margin: 10px 15px; font-style: italic; diff --git a/htdocs/includes/restler/framework/Luracast/Restler/explorer/images/logo_small.png b/htdocs/includes/restler/framework/Luracast/Restler/explorer/images/logo_small.png index 2ed3cf64be72132f93719f8014a6f440b06d818a..5496a65579ae903d4008f9d268fac422ef9d3679 100644 GIT binary patch delta 757 zcmVeSaefwW^{L9a%BKPWN%_+AW3auXJt}l zVPtu6$z?nM00N{*L_t(|+Qe5qY|}s#esPzIE@o)O=n+8&R{|*#L(PIfT{3hiQ=F}c zp~=FUc0*!FJHWzFGqE6%NL1<;XChLEdTG@Sk5yS*2~bDg=YQT+mVIX@wF56YoppY> z@BMu5<%Q@!N$oaYTJMs{o1Hj{zU)vi6JQ2&cx&>)ZfVp2{)tzg4GBvD3&5@boJKre zJ30eu1)x3N+9gsM@#-+RHxaPN;V_lQG6K)HlLvDutp^T$uMiaC@ST^ZBO1#CLla(m z1{Ks3e94Adynh&~zGdCBX<^=^@I0X3SCR7OMbn}sUKdeFKO-flaJa%@kJ27@Rod?J z9=+Qx5|=PtG8n>y~9rIu}+48M}FW5Bbqw3 zt#po?c?kmG!FX32W(dOjzTb+U@64MzHItoeB!M0JcYm^KBq0?}5!|tR}5&*k=hqU1Np`{I?Gbb7b+;Y=z!O$nm8}UUSzrCVok2dMe##j1t zbxF~$^O(JOe=y#o&iZF&|1KS!4Pqm~YUtPaa}xR)WTS{s(z8WTpAfl&Oi~ADARd;i zc|2dJ>wo#Wf#fv~himh7V?Smz%4rfoBw(of_O7l9t{Vt<5?^=8(OEx}+adud!kbfi zfsy(V&q!X~mXJ{r*stQof-;iQPXh1hwBR*L1G&ztYv`a7B=K~d#e8-HEJhShIm0li z01l!p6##<^07Z%Eh62^kB5plKKb=vl4A{YyOl}|0VpD{ nD)OJ^fG<28}?}J(t ztryNcu>M1Y8rg+jhiC`b|TlKDJ7A5P}ONxTFekIUo1iHR@_b6}X8z-4neaq(;x zi?xi&WX3QVOeUSdpfMQH0DAP2=x7>kN#s&mB#jmY{Hatjl}cGej_~+~FC>MBg@u4M z0d3%>RmwaX5>H-%K)?s75kAbHVKzGqCvdr3jwf$CNX=%mLH4*fR$MF-IIvhTK*Qs} zc&`B*fC&(oHSuTw6Ut%=DBEo1B7g~r6y_lW6xmbe1>gsOQm@i#bTX-0z>}vWNxAVL zBUl<3X_89~QW2V*l+K3{4m(dFH7le!GO-B}7)AW76n>_Fmn{)xBZ4BCxG)vTmk0|a zh#3*&A%a{{a=J+L!dz{q}EO5*5<5lFX ztT~aF-W=wwXlAasy!KA#{!_vCc8`r){wOYAfK|}Zg9PJbxS`Drk;)p~zY|Tt-88>* zwriWWb1zVDZtTG?paYc|7T*|z0vmc|>Drcq6j5NpMz|2?cHb`i@?uwOi^ zq83NCbnz;42Pc0dj34#(XLPH(clD@>^Tx(273Y3H^+xZ#{TS}&gSD83m-~j}1AOfv zMVs~g)RU1HH|1RUcD`si?r4G*GZO0OveK+}{)fDYSTMi+hjRZR>cge1S zR@On$u^Zq1me^ji^p@q(E2tfBTvg3>Jq*E-5aaR-qd1lcM;WU z`vf>j9jA6B>rS5l-}&OHq0;I0;+3!cMzi&fqek1LqNjZyefrl8q?U<>9#!evrstg< z9UZRNU`5UKvUD!GPtvYGoKo%T9HASStIj)gc|l1glldggnPy|@c4zEtP{iK5USC1K ziz=MEGQLy=x@c#Hg$F8HUC&hyzUtY|{)^#UHYzzVSzcQ3^7e(a`*rm1RIaV^#o0IS z_w{vkWbY|374IK1=xA3vqFX{vwfG#EEU9>G9xCaaa>Z+G%+t}diAF+FEzVq};smoa zbi)HvbN`b!s}nDrr&Ia{2953Bcl~x&Cvp!-BYU1?)gSHc36Gp-R=&RcbjO;eQEGE& ta!w9m(NDOMo}d5m!&kLnqYQAv9LOHZ7#!&yyal!|q>!SLGf3{ne*t=UPFDZ` diff --git a/htdocs/includes/restler/framework/Luracast/Restler/explorer/images/pet_store_api.png b/htdocs/includes/restler/framework/Luracast/Restler/explorer/images/pet_store_api.png new file mode 100644 index 0000000000000000000000000000000000000000..f9f9cd4aeb35a108c4b2f1dddb59977d56c595d8 GIT binary patch literal 824 zcmV-81IPS{P)n=Rd;8mVwQNY4k4xJQ%YT}s;WA7;r!W@XgqjG_4og} z8w>{OB9REiMa8-B85td+y}bji^~2KA`Md4j-u{zw=H%Da@83%_8qEnl9k1WK;pWX- zb-lg)pQYAreK@>)*5Clqni{IZVYGG+NY67Bp-^bn;L{Nbh44I6CIK+n7p8#U?;fCA zYMFcy%UEjup4fgnli%NyzSe*@419QuU9lJ|T$?f9w?HIQ$RwEJGK7^!y7LhxIgVJp z9c!kB{0aydM1epU1NJ=h(}2X?Y{qn70yEN$dwm~favs=VbQ+T?!AvSl{P~PE zS&zsJbTQttne>kdM4$jBhLMFy@I1)3u-4cAzrY*l!o9eK^w%+jqY!oi(Ri8sMauvK zwnCP#%3hEH#FtNqq{iT(?=_JA_8XC>5Y8Y@!wmxKb|A87ZbpHA`+%v~0pt{5Nko1L zLKR^25YExt1lH7L1{t{|P z@n)yHyZf~3>LZ@#&CNw1rA#OlY^|)UJQKUrlKKO&x%wPhH}6&e0000dvj&>@zN_HP5m0E=+A=efDBI*IG*Gy%%< zz@yc%2XvGm)QQv5k^ZC6!9MwX8BCmQ{3eAX|GTwn#>(PS6PoB=$Pwn*?wz?%Tx2gwJ4apoy`A15D=>?%}hj`fV*p=6XW=YR(sp))`dxTnqHE&{&; zPdeO}SVkf*6_$c45W3Z}u|Z&a8{r!6ZNY62S>5{jAd)Hkjg@h%@c)c#BvZK2lmGw| z`Vh+%ECkF{t=)XpF3Z1bj=Pe9LpHbnQwjeTU#=4hB76#52DU2P2Ouj~^lRWwRd%eN zBw_z%FL0CUlk!`s2!`>QG&H__i_)I9=AuA=jn40z>;@hRsg)>J(58cx;l;h_zE*-R7Wbz6Ff#1Mss*)zTImU4`2@?a7y;v4 zH=lJ_PM5Rkw*AU`Cmq6aa>chASJ&Z3Ebj`y;w$MM!fa6`13VU7Kc|T5Xl#7ecj?mp zREV-nBJ6C)`?&}QDe_(KM>BrlN|iF{7-90j+J>N0^vY=LK;8!^9Y_m*aRPX{!S6ag zgRw(13pJvt`;{^S-vgUk?8pV_Vh4a4P7~}uHT)ENFMqd71QIOl8Q6+24TM_+158z) z54U-*C{M)S&!2Bfu&`?Ti6;WojY;%6+I;uCof+*T2iUMz!7Eg<{}#DJSx)C$5f zP(oSf>_s1t06cJ-U3?<9poS4O{Go>H>hro^ks;r3mm1Ehfq?m(_YE8UiVUgG%W9ZY z!@O^}KR%JW*0e=66rUYj5BP~=x%$^x92-m_ Api Explorer - + @@ -27,10 +26,11 @@ $(function () { window.swaggerUi = new SwaggerUi({ url: "resources.json", + validatorUrl: null, dom_id: "swagger-ui-container", - supportedSubmitMethods: ['get', 'post', 'put', 'patch', 'delete'], + supportedSubmitMethods: ['get', 'post', 'put', 'delete'], onComplete: function(swaggerApi, swaggerUi){ - log("Loaded Api Explorer"); + log("Loaded API Explorer"); if(typeof initOAuth == "function") { /* @@ -45,15 +45,19 @@ hljs.highlightBlock(e) }); }, + defaultModelRendering: 'model', onFailure: function(data) { - log("Unable to Load Api Explorer"); + log("Unable to Load API Explorer"); }, - docExpansion: "none" + docExpansion: "none", + /*showRequestHeaders: true, + jsonEditor: true */ + /*, sorter : "alpha"*/ }); $('#input_apiKey').change(function() { var key = $('#input_apiKey')[0].value; - + log("key: " + key); if(key && key.trim() != "") { /* DOL_CHANGE LDR We set DOLAPIKEY into header */ log("added key " + key); @@ -67,11 +71,15 @@ console.log("header DOLAPIKEY added with value "+key); } }) - window.swaggerUi.load(); }); - + + @@ -79,6 +87,14 @@
+
diff --git a/htdocs/includes/restler/framework/Luracast/Restler/explorer/lib/swagger-oauth.js b/htdocs/includes/restler/framework/Luracast/Restler/explorer/lib/swagger-oauth.js index 19777eb90f0..8bb17fb076a 100644 --- a/htdocs/includes/restler/framework/Luracast/Restler/explorer/lib/swagger-oauth.js +++ b/htdocs/includes/restler/framework/Luracast/Restler/explorer/lib/swagger-oauth.js @@ -48,72 +48,65 @@ function handleLogin() { str += ''; popup.append(str); } - + } - var $win = $(window), - dw = $win.width(), - dh = $win.height(), - st = $win.scrollTop(), - dlgWd = popupDialog.outerWidth(), - dlgHt = popupDialog.outerHeight(), - top = (dh -dlgHt)/2 + st, - left = (dw - dlgWd)/2; + var $win = $(window), + dw = $win.width(), + dh = $win.height(), + st = $win.scrollTop(), + dlgWd = popupDialog.outerWidth(), + dlgHt = popupDialog.outerHeight(), + top = (dh -dlgHt)/2 + st, + left = (dw - dlgWd)/2; - popupDialog.css({ - top: (top < 0? 0 : top) + 'px', - left: (left < 0? 0 : left) + 'px' - }); + popupDialog.css({ + top: (top < 0? 0 : top) + 'px', + left: (left < 0? 0 : left) + 'px' + }); - popupDialog.find('button.api-popup-cancel').click(function() { - popupMask.hide(); - popupDialog.hide(); - }); - popupDialog.find('button.api-popup-authbtn').click(function() { - popupMask.hide(); - popupDialog.hide(); + popupDialog.find('button.api-popup-cancel').click(function() { + popupMask.hide(); + popupDialog.hide(); + }); + popupDialog.find('button.api-popup-authbtn').click(function() { + popupMask.hide(); + popupDialog.hide(); - var authSchemes = window.swaggerUi.api.authSchemes; - var location = window.location; - var locationUrl = location.protocol + '//' + location.host + location.pathname; - var redirectUrl = locationUrl.replace("index.html","").concat("/o2c.html").replace("//o2c.html","/o2c.html"); - var url = null; + var authSchemes = window.swaggerUi.api.authSchemes; + var host = window.location; + var pathname = location.pathname.substring(0, location.pathname.lastIndexOf("/")); + var redirectUrl = host.protocol + '//' + host.host + pathname + "/o2c.html"; + var url = null; - var p = window.swaggerUi.api.authSchemes; - for (var key in p) { - if (p.hasOwnProperty(key)) { - var o = p[key].grantTypes; - for(var t in o) { - if(o.hasOwnProperty(t) && t === 'implicit') { - var dets = o[t]; - url = dets.loginEndpoint.url + "?response_type=token"; - window.swaggerUi.tokenName = dets.tokenName; - } + for (var key in authSchemes) { + if (authSchemes.hasOwnProperty(key)) { + var o = authSchemes[key].grantTypes; + for(var t in o) { + if(o.hasOwnProperty(t) && t === 'implicit') { + var dets = o[t]; + url = dets.loginEndpoint.url + "?response_type=token"; + window.swaggerUi.tokenName = dets.tokenName; } } } - var scopes = []; - var scopeForUrl=''; - var o = $('.api-popup-scopes').find('input:checked'); + } + var scopes = [] + var o = $('.api-popup-scopes').find('input:checked'); - for(var k =0; k < o.length; k++) { - scopes.push($(o[k]).attr("scope")); - if(k > 0){ - scopeForUrl+=' '; - } - scopeForUrl+=$(o[k]).attr("scope"); - } + for(k =0; k < o.length; k++) { + scopes.push($(o[k]).attr("scope")); + } - window.enabledScopes=scopes; - + window.enabledScopes=scopes; - url += '&redirect_uri=' + encodeURIComponent(redirectUrl); - url += '&realm=' + encodeURIComponent(realm); - url += '&client_id=' + encodeURIComponent(clientId); - url += '&scope=' + encodeURIComponent(scopeForUrl); + url += '&redirect_uri=' + encodeURIComponent(redirectUrl); + url += '&realm=' + encodeURIComponent(realm); + url += '&client_id=' + encodeURIComponent(clientId); + url += '&scope=' + encodeURIComponent(scopes); + + window.open(url); + }); - window.open(url); - }); - } popupMask.show(); popupDialog.show(); return; @@ -211,7 +204,7 @@ function onOAuthComplete(token) { } }); - window.authorizations.add("key", new ApiKeyAuthorization("Authorization", "Bearer " + b, "header")); + window.authorizations.add("oauth2", new ApiKeyAuthorization("Authorization", "Bearer " + b, "header")); } } } diff --git a/htdocs/includes/restler/framework/Luracast/Restler/explorer/lib/swagger.js b/htdocs/includes/restler/framework/Luracast/Restler/explorer/lib/swagger.js index 2100bb81e83..9e73a9b33e2 100644 --- a/htdocs/includes/restler/framework/Luracast/Restler/explorer/lib/swagger.js +++ b/htdocs/includes/restler/framework/Luracast/Restler/explorer/lib/swagger.js @@ -1,5 +1,5 @@ // swagger.js -// version 2.0.30 +// version 2.0.39 var __bind = function(fn, me){ return function(){ @@ -11,10 +11,20 @@ log = function(){ log.history = log.history || []; log.history.push(arguments); if(this.console){ - console.log( Array.prototype.slice.call(arguments) ); + console.log( Array.prototype.slice.call(arguments)[0] ); } }; +// if you want to apply conditional formatting of parameter values +parameterMacro = function(value) { + return value; +} + +// if you want to apply conditional formatting of model property values +modelPropertyMacro = function(value) { + return value; +} + if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(obj, start) { for (var i = (start || 0), j = this.length; i < j; i++) { @@ -45,48 +55,50 @@ if (!('map' in Array.prototype)) { } Object.keys = Object.keys || (function () { - var hasOwnProperty = Object.prototype.hasOwnProperty, - hasDontEnumBug = !{toString:null}.propertyIsEnumerable("toString"), - DontEnums = [ - 'toString', - 'toLocaleString', - 'valueOf', - 'hasOwnProperty', - 'isPrototypeOf', - 'propertyIsEnumerable', - 'constructor' - ], - DontEnumsLength = DontEnums.length; - - return function (o) { - if (typeof o != "object" && typeof o != "function" || o === null) - throw new TypeError("Object.keys called on a non-object"); - - var result = []; - for (var name in o) { - if (hasOwnProperty.call(o, name)) - result.push(name); - } - - if (hasDontEnumBug) { - for (var i = 0; i < DontEnumsLength; i++) { - if (hasOwnProperty.call(o, DontEnums[i])) - result.push(DontEnums[i]); - } - } - - return result; - }; + var hasOwnProperty = Object.prototype.hasOwnProperty, + hasDontEnumBug = !{toString:null}.propertyIsEnumerable("toString"), + DontEnums = [ + 'toString', + 'toLocaleString', + 'valueOf', + 'hasOwnProperty', + 'isPrototypeOf', + 'propertyIsEnumerable', + 'constructor' + ], + DontEnumsLength = DontEnums.length; + + return function (o) { + if (typeof o != "object" && typeof o != "function" || o === null) + throw new TypeError("Object.keys called on a non-object"); + + var result = []; + for (var name in o) { + if (hasOwnProperty.call(o, name)) + result.push(name); + } + + if (hasDontEnumBug) { + for (var i = 0; i < DontEnumsLength; i++) { + if (hasOwnProperty.call(o, DontEnums[i])) + result.push(DontEnums[i]); + } + } + + return result; + }; })(); - var SwaggerApi = function(url, options) { + this.isBuilt = false; this.url = null; this.debug = false; this.basePath = null; this.authorizations = null; this.authorizationScheme = null; this.info = null; + this.useJQuery = false; + this.modelsArray = []; options = (options||{}); if (url) @@ -103,13 +115,20 @@ var SwaggerApi = function(url, options) { if (options.success != null) this.success = options.success; + if (typeof options.useJQuery === 'boolean') + this.useJQuery = options.useJQuery; + this.failure = options.failure != null ? options.failure : function() {}; this.progress = options.progress != null ? options.progress : function() {}; - if (options.success != null) + if (options.success != null) { this.build(); + this.isBuilt = true; + } } SwaggerApi.prototype.build = function() { + if(this.isBuilt) + return this; var _this = this; this.progress('fetching resource list: ' + this.url); var obj = { @@ -117,7 +136,7 @@ SwaggerApi.prototype.build = function() { url: this.url, method: "get", headers: { - accept: "application/json" + accept: "application/json,application/json;charset=\"utf-8\",*/*" }, on: { error: function(response) { @@ -154,6 +173,7 @@ SwaggerApi.prototype.buildFromSpec = function(response) { } this.apis = {}; this.apisArray = []; + this.consumes = response.consumes; this.produces = response.produces; this.authSchemes = response.authorizations; if (response.info != null) { @@ -171,13 +191,13 @@ SwaggerApi.prototype.buildFromSpec = function(response) { } } } - if (response.basePath) { + if (response.basePath) this.basePath = response.basePath; - } else if (this.url.indexOf('?') > 0) { + else if (this.url.indexOf('?') > 0) this.basePath = this.url.substring(0, this.url.lastIndexOf('?')); - } else { + else this.basePath = this.url; - } + if (isApi) { var newName = response.resourcePath.replace(/\//g, ''); this.resourcePath = response.resourcePath; @@ -272,7 +292,6 @@ SwaggerApi.prototype.fail = function(message) { SwaggerApi.prototype.setConsolidatedModels = function() { var model, modelName, resource, resource_name, _i, _len, _ref, _ref1, _results; - this.modelsArray = []; this.models = {}; _ref = this.apis; for (resource_name in _ref) { @@ -317,8 +336,8 @@ var SwaggerResource = function(resourceObj, api) { var _this = this; this.api = api; this.api = this.api; - produces = []; - consumes = []; + consumes = (this.consumes | []); + produces = (this.produces | []); this.path = this.api.resourcePath != null ? this.api.resourcePath : resourceObj.path; this.description = resourceObj.description; @@ -349,7 +368,7 @@ var SwaggerResource = function(resourceObj, api) { method: "get", useJQuery: this.useJQuery, headers: { - accept: "application/json" + accept: "application/json,application/json;charset=\"utf-8\",*/*" }, on: { response: function(resp) { @@ -368,22 +387,28 @@ var SwaggerResource = function(resourceObj, api) { } } -SwaggerResource.prototype.getAbsoluteBasePath = function(relativeBasePath) { - var parts, pos, url; +SwaggerResource.prototype.getAbsoluteBasePath = function (relativeBasePath) { + var pos, url; url = this.api.basePath; pos = url.lastIndexOf(relativeBasePath); - if (pos === -1) { - parts = url.split("/"); - url = parts[0] + "//" + parts[2]; - if (relativeBasePath.indexOf("/") === 0) { - return url + relativeBasePath; - } else { - return url + "/" + relativeBasePath; - } - } else if (relativeBasePath === "/") { - return url.substring(0, pos); - } else { - return url.substring(0, pos) + relativeBasePath; + var parts = url.split("/"); + var rootUrl = parts[0] + "//" + parts[2]; + + if(relativeBasePath.indexOf("http") === 0) + return relativeBasePath; + if(relativeBasePath === "/") + return rootUrl; + if(relativeBasePath.substring(0, 1) == "/") { + // use root + relative + return rootUrl + relativeBasePath; + } + else { + var pos = this.basePath.lastIndexOf("/"); + var base = this.basePath.substring(0, pos); + if(base.substring(base.length - 1) == "/") + return base + relativeBasePath; + else + return base + "/" + relativeBasePath; } }; @@ -478,8 +503,7 @@ SwaggerResource.prototype.addOperations = function(resource_path, ops, consumes, SwaggerResource.prototype.sanitize = function(nickname) { var op; - op = nickname.replace(/[\s!@#$%^&*()_+=\[{\]};:<>|./?,\\'""-]/g, '_'); - //' + op = nickname.replace(/[\s!@#$%^&*()_+=\[{\]};:<>|.\/?,\\'""-]/g, '_'); op = op.replace(/((_){2,})/g, '_'); op = op.replace(/^(_)*/g, ''); op = op.replace(/([_])*$/g, ''); @@ -584,6 +608,7 @@ var SwaggerModelProperty = function(name, obj) { this.isCollection = this.dataType && (this.dataType.toLowerCase() === 'array' || this.dataType.toLowerCase() === 'list' || this.dataType.toLowerCase() === 'set'); this.descr = obj.description; this.required = obj.required; + this.defaultValue = modelPropertyMacro(obj.defaultValue); if (obj.items != null) { if (obj.items.type != null) { this.refDataType = obj.items.type; @@ -629,7 +654,9 @@ SwaggerModelProperty.prototype.getSampleValue = function(modelsToIgnore) { SwaggerModelProperty.prototype.toSampleValue = function(value) { var result; - if (value === "integer") { + if ((typeof this.defaultValue !== 'undefined') && this.defaultValue !== null) { + result = this.defaultValue; + } else if (value === "integer") { result = 0; } else if (value === "boolean") { result = false; @@ -759,6 +786,7 @@ var SwaggerOperation = function(nickname, path, method, parameters, summary, not } } } + param.defaultValue = parameterMacro(param.defaultValue); } this.resource[this.nickname] = function(args, callback, error) { return _this["do"](args, callback, error); @@ -812,7 +840,7 @@ SwaggerOperation.prototype.getSampleJSON = function(type, models) { else return JSON.stringify(val, null, 2); } - else + else return val; } }; @@ -1073,7 +1101,7 @@ SwaggerOperation.prototype.formatXml = function(xml) { var SwaggerRequest = function(type, url, params, opts, successCallback, errorCallback, operation, execution) { var _this = this; var errors = []; - this.useJQuery = (typeof operation.useJQuery !== 'undefined' ? operation.useJQuery : null); + this.useJQuery = (typeof operation.resource.useJQuery !== 'undefined' ? operation.resource.useJQuery : null); this.type = (type||errors.push("SwaggerRequest type is required (get/post/put/delete/patch/options).")); this.url = (url||errors.push("SwaggerRequest url is required.")); this.params = params; @@ -1090,96 +1118,59 @@ var SwaggerRequest = function(type, url, params, opts, successCallback, errorCal this.type = this.type.toUpperCase(); - var myHeaders = {}; + // set request, response content type headers + var headers = this.setHeaders(params, this.operation); var body = params.body; - var parent = params["parent"]; - var requestContentType = "application/json"; - var formParams = []; - var fileParams = []; - var params = this.operation.parameters; - - - for(var i = 0; i < params.length; i++) { - var param = params[i]; - if(param.paramType === "form") - formParams.push(param); - else if(param.paramType === "file") - fileParams.push(param); - } - - - if (body && (this.type === "POST" || this.type === "PUT" || this.type === "PATCH")) { - if (this.opts.requestContentType) { - requestContentType = this.opts.requestContentType; - } - } else { - // if any form params, content type must be set - if(formParams.length > 0) { - if(fileParams.length > 0) - requestContentType = "multipart/form-data"; - else - requestContentType = "application/x-www-form-urlencoded"; - } - else if (this.type != "DELETE") - requestContentType = null; - } - - if (requestContentType && this.operation.consumes) { - if (this.operation.consumes[requestContentType] === 'undefined') { - log("server doesn't consume " + requestContentType + ", try " + JSON.stringify(this.operation.consumes)); - if (this.requestContentType === null) { - requestContentType = this.operation.consumes[0]; - } - } - } - - var responseContentType = null; - if (this.opts.responseContentType) { - responseContentType = this.opts.responseContentType; - } else { - responseContentType = "application/json"; - } - if (responseContentType && this.operation.produces) { - if (this.operation.produces[responseContentType] === 'undefined') { - log("server can't produce " + responseContentType); - } - } - if (requestContentType && requestContentType.indexOf("application/x-www-form-urlencoded") === 0) { - var fields = {}; - var possibleParams = {}; + // encode the body for form submits + if (headers["Content-Type"]) { var values = {}; - var key; - for(key in formParams){ - var param = formParams[key]; - values[param.name] = param; + var i; + var operationParams = this.operation.parameters; + for(i = 0; i < operationParams.length; i++) { + var param = operationParams[i]; + if(param.paramType === "form") + values[param.name] = param; } - var encoded = ""; - var key; - for(key in values) { - value = this.params[key]; - if(typeof value !== 'undefined'){ - if(encoded !== "") - encoded += "&"; - encoded += encodeURIComponent(key) + '=' + encodeURIComponent(value); + if(headers["Content-Type"].indexOf("application/x-www-form-urlencoded") === 0) { + var encoded = ""; + var key; + for(key in values) { + value = this.params[key]; + if(typeof value !== 'undefined'){ + if(encoded !== "") + encoded += "&"; + encoded += encodeURIComponent(key) + '=' + encodeURIComponent(value); + } } + body = encoded; + } + else if (headers["Content-Type"].indexOf("multipart/form-data") === 0) { + // encode the body for form submits + var data = ""; + var boundary = "----SwaggerFormBoundary" + Date.now(); + var key; + for(key in values) { + value = this.params[key]; + if(typeof value !== 'undefined') { + data += '--' + boundary + '\n'; + data += 'Content-Disposition: form-data; name="' + key + '"'; + data += '\n\n'; + data += value + "\n"; + } + } + data += "--" + boundary + "--\n"; + headers["Content-Type"] = "multipart/form-data; boundary=" + boundary; + body = data; } - body = encoded; } - var name; - for (name in this.headers) - myHeaders[name] = this.headers[name]; - if ((requestContentType && body !== "") || (requestContentType === "application/x-www-form-urlencoded")) - myHeaders["Content-Type"] = requestContentType; - if (responseContentType) - myHeaders["Accept"] = responseContentType; if (!((this.headers != null) && (this.headers.mock != null))) { obj = { url: this.url, method: this.type, - headers: myHeaders, + headers: headers, body: body, useJQuery: this.useJQuery, on: { @@ -1216,6 +1207,77 @@ var SwaggerRequest = function(type, url, params, opts, successCallback, errorCal } }; +SwaggerRequest.prototype.setHeaders = function(params, operation) { + // default type + var accepts = "application/json"; + var consumes = "application/json"; + + var allDefinedParams = this.operation.parameters; + var definedFormParams = []; + var definedFileParams = []; + var body = params.body; + var headers = {}; + + // get params from the operation and set them in definedFileParams, definedFormParams, headers + var i; + for(i = 0; i < allDefinedParams.length; i++) { + var param = allDefinedParams[i]; + if(param.paramType === "form") + definedFormParams.push(param); + else if(param.paramType === "file") + definedFileParams.push(param); + else if(param.paramType === "header" && this.params.headers) { + var key = param.name; + var headerValue = this.params.headers[param.name]; + if(typeof this.params.headers[param.name] !== 'undefined') + headers[key] = headerValue; + } + } + + // if there's a body, need to set the accepts header via requestContentType + if (body && (this.type === "POST" || this.type === "PUT" || this.type === "PATCH" || this.type === "DELETE")) { + if (this.opts.requestContentType) + consumes = this.opts.requestContentType; + } else { + // if any form params, content type must be set + if(definedFormParams.length > 0) { + if(definedFileParams.length > 0) + consumes = "multipart/form-data"; + else + consumes = "application/x-www-form-urlencoded"; + } + else if (this.type === "DELETE") + body = "{}"; + else if (this.type != "DELETE") + accepts = null; + } + + if (consumes && this.operation.consumes) { + if (this.operation.consumes.indexOf(consumes) === -1) { + log("server doesn't consume " + consumes + ", try " + JSON.stringify(this.operation.consumes)); + consumes = this.operation.consumes[0]; + } + } + + if (this.opts.responseContentType) { + accepts = this.opts.responseContentType; + } else { + accepts = "application/json"; + } + if (accepts && this.operation.produces) { + if (this.operation.produces.indexOf(accepts) === -1) { + log("server can't produce " + accepts); + accepts = this.operation.produces[0]; + } + } + + if ((consumes && body !== "") || (consumes === "application/x-www-form-urlencoded")) + headers["Content-Type"] = consumes; + if (accepts) + headers["Accept"] = accepts; + return headers; +} + SwaggerRequest.prototype.asCurl = function() { var results = []; if(this.headers) { @@ -1259,9 +1321,16 @@ SwaggerHttp.prototype.isIE8 = function() { }; /* - * JQueryHttpClient lets a browser take advantage of JQuery's cross-browser magic + * JQueryHttpClient lets a browser take advantage of JQuery's cross-browser magic. + * NOTE: when jQuery is available it will export both '$' and 'jQuery' to the global space. + * Since we are using closures here we need to alias it for internal use. */ -var JQueryHttpClient = function(options) {} +var JQueryHttpClient = function(options) { + "use strict"; + if(!jQuery){ + var jQuery = window.jQuery; + } +} JQueryHttpClient.prototype.execute = function(obj) { var cb = obj.on; @@ -1335,8 +1404,8 @@ JQueryHttpClient.prototype.execute = function(obj) { return cb.response(out); }; - $.support.cors = true; - return $.ajax(obj); + jQuery.support.cors = true; + return jQuery.ajax(obj); } /* @@ -1411,11 +1480,36 @@ ShredHttpClient.prototype.execute = function(obj) { return out; }; + // Transform an error into a usable response-like object + var transformError = function(error) { + var out = { + // Default to a status of 0 - The client will treat this as a generic permissions sort of error + status: 0, + data: error.message || error + }; + + if(error.code) { + out.obj = error; + + if(error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED' ) { + // We can tell the client that this should be treated as a missing resource and not as a permissions thing + out.status = 404; + } + } + + return out; + }; + res = { error: function(response) { if (obj) return cb.error(transform(response)); }, + // Catch the Shred error raised when the request errors as it is made (i.e. No Response is coming) + request_error: function(err) { + if(obj) + return cb.error(transformError(err)); + }, redirect: function(response) { if (obj) return cb.redirect(transform(response)); @@ -1452,26 +1546,42 @@ SwaggerAuthorizations.prototype.remove = function(name) { }; SwaggerAuthorizations.prototype.apply = function(obj, authorizations) { - status = null; + var status = null; var key; - for (key in this.authz) { - value = this.authz[key]; - result = value.apply(obj, authorizations); - if (result === false) - status = false; - if (result === true) - status = true; + + // if the "authorizations" key is undefined, or has an empty array, add all keys + if(typeof authorizations === 'undefined' || Object.keys(authorizations).length == 0) { + for (key in this.authz) { + value = this.authz[key]; + result = value.apply(obj, authorizations); + if (result === true) + status = true; + } } + else { + for(name in authorizations) { + for (key in this.authz) { + if(key == name) { + value = this.authz[key]; + result = value.apply(obj, authorizations); + if (result === true) + status = true; + } + } + } + } + return status; }; /** * ApiKeyAuthorization allows a query param or header to be injected */ -var ApiKeyAuthorization = function(name, value, type) { +var ApiKeyAuthorization = function(name, value, type, delimiter) { this.name = name; this.value = value; this.type = type; + this.delimiter = delimiter; }; ApiKeyAuthorization.prototype.apply = function(obj, authorizations) { @@ -1482,7 +1592,12 @@ ApiKeyAuthorization.prototype.apply = function(obj, authorizations) { obj.url = obj.url + "?" + this.name + "=" + this.value; return true; } else if (this.type === "header") { - obj.headers[this.name] = this.value; + if(typeof obj.headers[this.name] !== 'undefined') { + if(typeof this.delimiter !== 'undefined') + obj.headers[this.name] = obj.headers[this.name] + this.delimiter + this.value; + } + else + obj.headers[this.name] = this.value; return true; } }; diff --git a/htdocs/includes/restler/framework/Luracast/Restler/explorer/swagger-ui.js b/htdocs/includes/restler/framework/Luracast/Restler/explorer/swagger-ui.js index 5c6aad20be6..c28bf145ab6 100644 --- a/htdocs/includes/restler/framework/Luracast/Restler/explorer/swagger-ui.js +++ b/htdocs/includes/restler/framework/Luracast/Restler/explorer/swagger-ui.js @@ -1,5 +1,5 @@ // swagger-ui.js -// version 2.0.17 +// version 2.0.23 $(function() { // Helper function for vertically aligning DOM elements @@ -68,7 +68,7 @@ log = function(){ log.history = log.history || []; log.history.push(arguments); if(this.console){ - console.log( Array.prototype.slice.call(arguments) ); + console.log( Array.prototype.slice.call(arguments)[0] ); } }; @@ -240,67 +240,74 @@ helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; function program1(depth0,data) { var buffer = "", stack1, stack2; - buffer += "\n "; + buffer += "\n
" + + escapeExpression(((stack1 = ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.title)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) + + "
\n
"; + stack2 = ((stack1 = ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.description)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1); + if(stack2 || stack2 === 0) { buffer += stack2; } + buffer += "
\n "; stack2 = helpers['if'].call(depth0, ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.termsOfServiceUrl), {hash:{},inverse:self.noop,fn:self.program(2, program2, data),data:data}); if(stack2 || stack2 === 0) { buffer += stack2; } - buffer += "\n "; + buffer += "\n "; stack2 = helpers['if'].call(depth0, ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.contact), {hash:{},inverse:self.noop,fn:self.program(4, program4, data),data:data}); if(stack2 || stack2 === 0) { buffer += stack2; } - buffer += "\n "; + buffer += "\n "; stack2 = helpers['if'].call(depth0, ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.license), {hash:{},inverse:self.noop,fn:self.program(6, program6, data),data:data}); if(stack2 || stack2 === 0) { buffer += stack2; } - buffer += "\n "; + buffer += "\n "; return buffer; } function program2(depth0,data) { var buffer = "", stack1; - buffer += "
  • Terms
  • "; + + "\">Terms of service
    "; return buffer; } function program4(depth0,data) { var buffer = "", stack1; - buffer += "
  • Contact
  • "; + + "\">Contact the developer
    "; return buffer; } function program6(depth0,data) { var buffer = "", stack1; - buffer += "
  • " + escapeExpression(((stack1 = ((stack1 = depth0.info),stack1 == null || stack1 === false ? stack1 : stack1.license)),typeof stack1 === functionType ? stack1.apply(depth0) : stack1)) - + "\"> License
  • "; + + "
    "; return buffer; } function program8(depth0,data) { var buffer = "", stack1; - buffer += " v"; + buffer += "\n , api version: "; if (stack1 = helpers.apiVersion) { stack1 = stack1.call(depth0, {hash:{},data:data}); } else { stack1 = depth0.apiVersion; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } - buffer += escapeExpression(stack1); + buffer += escapeExpression(stack1) + + "\n "; return buffer; } - buffer += "
    \n
    \n
    \n
      \n
    \n\n
    \n
      \n "; + buffer += "
      \n "; stack1 = helpers['if'].call(depth0, depth0.info, {hash:{},inverse:self.noop,fn:self.program(1, program1, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } - buffer += "\n
    • \n "; + buffer += "\n
    • \n
      \n
        \n
      \n\n
      \n
      \n
      \n

      [ base url: "; if (stack1 = helpers.basePath) { stack1 = stack1.call(depth0, {hash:{},data:data}); } else { stack1 = depth0.basePath; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } - buffer += escapeExpression(stack1); + buffer += escapeExpression(stack1) + + "\n "; stack1 = helpers['if'].call(depth0, depth0.apiVersion, {hash:{},inverse:self.noop,fn:self.program(8, program8, data),data:data}); if(stack1 || stack1 === 0) { buffer += stack1; } - buffer += " Powered by Restler & Swagger\n \n

    \n
    \n
    \n"; + buffer += "]\n \n\n"; return buffer; }); })(); @@ -389,7 +396,7 @@ function program18(depth0,data) { function program20(depth0,data) { - return "\n
    \n \n \n \n
    \n "; + return "\n
    \n \n \n \n
    \n "; } buffer += "\n
      \n
    • \n "; + + "'/>\n "; return buffer; } -function program12(depth0,data) { +function program13(depth0,data) { var buffer = "", stack1; - buffer += "\n \n "; + + "' placeholder='' type='text' value=''/>\n "; return buffer; } @@ -1057,23 +1073,19 @@ helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; function program1(depth0,data) { - var buffer = "", stack1; - buffer += " : "; - if (stack1 = helpers.description) { stack1 = stack1.call(depth0, {hash:{},data:data}); } - else { stack1 = depth0.description; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } - if(stack1 || stack1 === 0) { buffer += stack1; } - return buffer; + + return " : "; } buffer += "
      \n

      \n "; + + "\">"; if (stack1 = helpers.name) { stack1 = stack1.call(depth0, {hash:{},data:data}); } else { stack1 = depth0.name; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } buffer += escapeExpression(stack1) @@ -1083,6 +1095,9 @@ function program1(depth0,data) { else { stack1 = depth0.description; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } if (!helpers.description) { stack1 = blockHelperMissing.call(depth0, stack1, options); } if(stack1 || stack1 === 0) { buffer += stack1; } + if (stack1 = helpers.description) { stack1 = stack1.call(depth0, {hash:{},data:data}); } + else { stack1 = depth0.description; stack1 = typeof stack1 === functionType ? stack1.apply(depth0) : stack1; } + if(stack1 || stack1 === 0) { buffer += stack1; } buffer += "\n

      \n
        \n
      • \n Show/Hide\n
      • \n
      • \n Show/Hide\n
      • \n
      • \n \n List Operations\n \n
      • \n
      • \n \n List Operations\n \n
      • \n
      • \n \n Expand Operations\n \n
      • \n
      • \n 0) { map[o.name] = o.value; } @@ -1708,16 +1750,16 @@ helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; isFileUpload = true; } } - _ref1 = form.find("textarea"); - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - o = _ref1[_j]; + _ref6 = form.find("textarea"); + for (_j = 0, _len1 = _ref6.length; _j < _len1; _j++) { + o = _ref6[_j]; if ((o.value != null) && jQuery.trim(o.value).length > 0) { map["body"] = o.value; } } - _ref2 = form.find("select"); - for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { - o = _ref2[_k]; + _ref7 = form.find("select"); + for (_k = 0, _len2 = _ref7.length; _k < _len2; _k++) { + o = _ref7[_k]; val = this.getSelectedValue(o); if ((val != null) && jQuery.trim(val).length > 0) { map[o.name] = val; @@ -1739,46 +1781,46 @@ helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; }; OperationView.prototype.handleFileUpload = function(map, form) { - var bodyParam, el, headerParams, o, obj, param, params, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref, _ref1, _ref2, _ref3, + var bodyParam, el, headerParams, o, obj, param, params, _i, _j, _k, _l, _len, _len1, _len2, _len3, _ref5, _ref6, _ref7, _ref8, _this = this; - _ref = form.serializeArray(); - for (_i = 0, _len = _ref.length; _i < _len; _i++) { - o = _ref[_i]; + _ref5 = form.serializeArray(); + for (_i = 0, _len = _ref5.length; _i < _len; _i++) { + o = _ref5[_i]; if ((o.value != null) && jQuery.trim(o.value).length > 0) { map[o.name] = o.value; } } bodyParam = new FormData(); params = 0; - _ref1 = this.model.parameters; - for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) { - param = _ref1[_j]; + _ref6 = this.model.parameters; + for (_j = 0, _len1 = _ref6.length; _j < _len1; _j++) { + param = _ref6[_j]; if (param.paramType === 'form') { - if (map[param.name] !== void 0) { + if (param.type.toLowerCase() !== 'file' && map[param.name] !== void 0) { bodyParam.append(param.name, map[param.name]); } } } headerParams = {}; - _ref2 = this.model.parameters; - for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) { - param = _ref2[_k]; + _ref7 = this.model.parameters; + for (_k = 0, _len2 = _ref7.length; _k < _len2; _k++) { + param = _ref7[_k]; if (param.paramType === 'header') { headerParams[param.name] = map[param.name]; } } log(headerParams); - _ref3 = form.find('input[type~="file"]'); - for (_l = 0, _len3 = _ref3.length; _l < _len3; _l++) { - el = _ref3[_l]; + _ref8 = form.find('input[type~="file"]'); + for (_l = 0, _len3 = _ref8.length; _l < _len3; _l++) { + el = _ref8[_l]; if (typeof el.files[0] !== 'undefined') { bodyParam.append($(el).attr('name'), el.files[0]); params += 1; } } - log(bodyParam); this.invocationUrl = this.model.supportHeaderParams() ? (headerParams = this.model.getHeaderParams(map), this.model.urlify(map, false)) : this.model.urlify(map, true); - $(".request_url", $(this.el)).html("
        " + this.invocationUrl + "
        "); + $(".request_url", $(this.el)).html("
        ");
        +      $(".request_url pre", $(this.el)).text(this.invocationUrl);
               obj = {
                 type: this.model.method,
                 url: this.invocationUrl,
        @@ -1829,14 +1871,14 @@ helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
             };
         
             OperationView.prototype.getSelectedValue = function(select) {
        -      var opt, options, _i, _len, _ref;
        +      var opt, options, _i, _len, _ref5;
               if (!select.multiple) {
                 return select.value;
               } else {
                 options = [];
        -        _ref = select.options;
        -        for (_i = 0, _len = _ref.length; _i < _len; _i++) {
        -          opt = _ref[_i];
        +        _ref5 = select.options;
        +        for (_i = 0, _len = _ref5.length; _i < _len; _i++) {
        +          opt = _ref5[_i];
                   if (opt.selected) {
                     options.push(opt.value);
                   }
        @@ -1924,9 +1966,9 @@ helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
                 padding = '';
                 indent += transitions[fromTo];
                 padding = ((function() {
        -          var _j, _ref, _results;
        +          var _j, _ref5, _results;
                   _results = [];
        -          for (j = _j = 0, _ref = indent; 0 <= _ref ? _j < _ref : _j > _ref; j = 0 <= _ref ? ++_j : --_j) {
        +          for (j = _j = 0, _ref5 = indent; 0 <= _ref5 ? _j < _ref5 : _j > _ref5; j = 0 <= _ref5 ? ++_j : --_j) {
                     _results.push('  ');
                   }
                   return _results;
        @@ -1945,7 +1987,7 @@ helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
             };
         
             OperationView.prototype.showStatus = function(response) {
        -      var code, content, contentType, headers, pre, response_body, url;
        +      var code, content, contentType, headers, opts, pre, response_body, response_body_el, url;
               if (response.content === void 0) {
                 content = response.data;
                 url = response.url;
        @@ -1974,14 +2016,21 @@ helpers = this.merge(helpers, Handlebars.helpers); data = data || {};
                 pre = $('
        ').append(code);
               }
               response_body = pre;
        -      $(".request_url", $(this.el)).html("
        " + url + "
        "); + $(".request_url", $(this.el)).html("
        ");
        +      $(".request_url pre", $(this.el)).text(url);
               $(".response_code", $(this.el)).html("
        " + response.status + "
        "); $(".response_body", $(this.el)).html(response_body); - $(".response_headers", $(this.el)).html("
        " + JSON.stringify(response.headers, null, "  ").replace(/\n/g, "
        ") + "
        "); + $(".response_headers", $(this.el)).html("
        " + _.escape(JSON.stringify(response.headers, null, "  ")).replace(/\n/g, "
        ") + "
        "); $(".response", $(this.el)).slideDown(); $(".response_hider", $(this.el)).show(); $(".response_throbber", $(this.el)).hide(); - return hljs.highlightBlock($('.response_body', $(this.el))[0]); + response_body_el = $('.response_body', $(this.el))[0]; + opts = this.options.swaggerOptions; + if (opts.highlightSizeThreshold && response.data.length > opts.highlightSizeThreshold) { + return response_body_el; + } else { + return hljs.highlightBlock(response_body_el); + } }; OperationView.prototype.toggleOperationContent = function() { @@ -1999,11 +2048,11 @@ helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; })(Backbone.View); StatusCodeView = (function(_super) { - __extends(StatusCodeView, _super); function StatusCodeView() { - StatusCodeView.__super__.constructor.apply(this, arguments); + _ref5 = StatusCodeView.__super__.constructor.apply(this, arguments); + return _ref5; } StatusCodeView.prototype.initialize = function() {}; @@ -2038,11 +2087,11 @@ helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; })(Backbone.View); ParameterView = (function(_super) { - __extends(ParameterView, _super); function ParameterView() { - ParameterView.__super__.constructor.apply(this, arguments); + _ref6 = ParameterView.__super__.constructor.apply(this, arguments); + return _ref6; } ParameterView.prototype.initialize = function() { @@ -2127,11 +2176,11 @@ helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; })(Backbone.View); SignatureView = (function(_super) { - __extends(SignatureView, _super); function SignatureView() { - SignatureView.__super__.constructor.apply(this, arguments); + _ref7 = SignatureView.__super__.constructor.apply(this, arguments); + return _ref7; } SignatureView.prototype.events = { @@ -2146,7 +2195,7 @@ helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; var template; template = this.template(); $(this.el).html(template(this.model)); - this.switchToDescription(); + this.switchToSnippet(); this.isParam = this.model.isParam; if (this.isParam) { $('.notice', $(this.el)).text('Click to set as parameter value'); @@ -2196,11 +2245,11 @@ helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; })(Backbone.View); ContentTypeView = (function(_super) { - __extends(ContentTypeView, _super); function ContentTypeView() { - ContentTypeView.__super__.constructor.apply(this, arguments); + _ref8 = ContentTypeView.__super__.constructor.apply(this, arguments); + return _ref8; } ContentTypeView.prototype.initialize = function() {}; @@ -2222,11 +2271,11 @@ helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; })(Backbone.View); ResponseContentTypeView = (function(_super) { - __extends(ResponseContentTypeView, _super); function ResponseContentTypeView() { - ResponseContentTypeView.__super__.constructor.apply(this, arguments); + _ref9 = ResponseContentTypeView.__super__.constructor.apply(this, arguments); + return _ref9; } ResponseContentTypeView.prototype.initialize = function() {}; @@ -2248,11 +2297,11 @@ helpers = this.merge(helpers, Handlebars.helpers); data = data || {}; })(Backbone.View); ParameterContentTypeView = (function(_super) { - __extends(ParameterContentTypeView, _super); function ParameterContentTypeView() { - ParameterContentTypeView.__super__.constructor.apply(this, arguments); + _ref10 = ParameterContentTypeView.__super__.constructor.apply(this, arguments); + return _ref10; } ParameterContentTypeView.prototype.initialize = function() {}; diff --git a/htdocs/includes/restler/framework/Luracast/Restler/explorer/swagger-ui.min.js b/htdocs/includes/restler/framework/Luracast/Restler/explorer/swagger-ui.min.js index a1e827a1029..2956b613b0f 100644 --- a/htdocs/includes/restler/framework/Luracast/Restler/explorer/swagger-ui.min.js +++ b/htdocs/includes/restler/framework/Luracast/Restler/explorer/swagger-ui.min.js @@ -1 +1 @@ -$(function(){$.fn.vAlign=function(){return this.each(function(c){var a=$(this).height();var d=$(this).parent().height();var b=(d-a)/2;$(this).css("margin-top",b)})};$.fn.stretchFormtasticInputWidthToParent=function(){return this.each(function(b){var d=$(this).closest("form").innerWidth();var c=parseInt($(this).closest("form").css("padding-left"),10)+parseInt($(this).closest("form").css("padding-right"),10);var a=parseInt($(this).css("padding-left"),10)+parseInt($(this).css("padding-right"),10);$(this).css("width",d-c-a)})};$("form.formtastic li.string input, form.formtastic textarea").stretchFormtasticInputWidthToParent();$("ul.downplayed li div.content p").vAlign();$("form.sandbox").submit(function(){var a=true;$(this).find("input.required").each(function(){$(this).removeClass("error");if($(this).val()==""){$(this).addClass("error");$(this).wiggle();a=false}});return a})});function clippyCopiedCallback(b){$("#api_key_copied").fadeIn().delay(1000).fadeOut()}log=function(){log.history=log.history||[];log.history.push(arguments);if(this.console){console.log(Array.prototype.slice.call(arguments))}};if(Function.prototype.bind&&console&&typeof console.log=="object"){["log","info","warn","error","assert","dir","clear","profile","profileEnd"].forEach(function(a){console[a]=this.bind(console[a],console)},Function.prototype.call)}var Docs={shebang:function(){var b=$.param.fragment().split("/");b.shift();switch(b.length){case 1:log("shebang resource:"+b[0]);var d="resource_"+b[0];Docs.expandEndpointListForResource(b[0]);$("#"+d).slideto({highlight:false});break;case 2:log("shebang endpoint: "+b.join("_"));Docs.expandEndpointListForResource(b[0]);$("#"+d).slideto({highlight:false});var c=b.join("_");var a=c+"_content";log("li_dom_id "+c);log("li_content_dom_id "+a);Docs.expandOperation($("#"+a));$("#"+c).slideto({highlight:false});break}},toggleEndpointListForResource:function(b){var a=$("li#resource_"+Docs.escapeResourceName(b)+" ul.endpoints");if(a.is(":visible")){Docs.collapseEndpointListForResource(b)}else{Docs.expandEndpointListForResource(b)}},expandEndpointListForResource:function(b){var b=Docs.escapeResourceName(b);if(b==""){$(".resource ul.endpoints").slideDown();return}$("li#resource_"+b).addClass("active");var a=$("li#resource_"+b+" ul.endpoints");a.slideDown()},collapseEndpointListForResource:function(b){var b=Docs.escapeResourceName(b);$("li#resource_"+b).removeClass("active");var a=$("li#resource_"+b+" ul.endpoints");a.slideUp()},expandOperationsForResource:function(a){Docs.expandEndpointListForResource(a);if(a==""){$(".resource ul.endpoints li.operation div.content").slideDown();return}$("li#resource_"+Docs.escapeResourceName(a)+" li.operation div.content").each(function(){Docs.expandOperation($(this))})},collapseOperationsForResource:function(a){Docs.expandEndpointListForResource(a);$("li#resource_"+Docs.escapeResourceName(a)+" li.operation div.content").each(function(){Docs.collapseOperation($(this))})},escapeResourceName:function(a){return a.replace(/[!"#$%&'()*+,.\/:;<=>?@\[\\\]\^`{|}~]/g,"\\$&")},expandOperation:function(a){a.slideDown()},collapseOperation:function(a){a.slideUp()}};(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.content_type=b(function(g,l,f,k,j){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);j=j||{};var i="",c,h="function",m=this;function e(r,q){var o="",p;o+="\n ";p=f.each.call(r,r.produces,{hash:{},inverse:m.noop,fn:m.program(2,d,q),data:q});if(p||p===0){o+=p}o+="\n";return o}function d(r,q){var o="",p;o+='\n \n ";return o}function n(p,o){return'\n \n'}i+='\n\n";return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.main=b(function(g,m,f,l,k){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);k=k||{};var i="",c,h="function",j=this.escapeExpression,p=this;function e(v,u){var r="",t,s;r+="\n ";s=f["if"].call(v,((t=v.info),t==null||t===false?t:t.termsOfServiceUrl),{hash:{},inverse:p.noop,fn:p.program(2,d,u),data:u});if(s||s===0){r+=s}r+="\n ";s=f["if"].call(v,((t=v.info),t==null||t===false?t:t.contact),{hash:{},inverse:p.noop,fn:p.program(4,q,u),data:u});if(s||s===0){r+=s}r+="\n ";s=f["if"].call(v,((t=v.info),t==null||t===false?t:t.license),{hash:{},inverse:p.noop,fn:p.program(6,o,u),data:u});if(s||s===0){r+=s}r+="\n ";return r}function d(u,t){var r="",s;r+='
      • Terms
      • ';return r}function q(u,t){var r="",s;r+='
      • Contact
      • ';return r}function o(u,t){var r="",s;r+='
      • License
      • ';return r}function n(u,t){var r="",s;r+=" v";if(s=f.apiVersion){s=s.call(u,{hash:{},data:t})}else{s=u.apiVersion;s=typeof s===h?s.apply(u):s}r+=j(s);return r}i+="
        \n
        \n
        \n
          \n
        \n\n
        \n
          \n ";c=f["if"].call(m,m.info,{hash:{},inverse:p.noop,fn:p.program(1,e,k),data:k});if(c||c===0){i+=c}i+="\n
        • \n ";if(c=f.basePath){c=c.call(m,{hash:{},data:k})}else{c=m.basePath;c=typeof c===h?c.apply(m):c}i+=j(c);c=f["if"].call(m,m.apiVersion,{hash:{},inverse:p.noop,fn:p.program(8,n,k),data:k});if(c||c===0){i+=c}i+=" Powered by Restler & Swagger\n
        • \n
        \n
        \n
        \n";return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.operation=b(function(g,s,q,m,y){this.compilerInfo=[4,">= 1.0.0"];q=this.merge(q,g.helpers);y=y||{};var r="",i,f,e="function",d=this.escapeExpression,p=this,c=q.blockHelperMissing;function o(C,B){var z="",A;z+="\n

        Implementation Notes

        \n

        ";if(A=q.notes){A=A.call(C,{hash:{},data:B})}else{A=C.notes;A=typeof A===e?A.apply(C):A}if(A||A===0){z+=A}z+="

        \n ";return z}function n(A,z){return'\n
        \n '}function l(C,B){var z="",A;z+='\n \n ";return z}function k(D,C){var z="",B,A;z+="\n
        "+d(((B=D.scope),typeof B===e?B.apply(D):B))+"
        \n ";return z}function h(A,z){return"
        "}function x(A,z){return'\n
        \n \n
        \n '}function w(A,z){return'\n

        Response Class

        \n

        \n
        \n
        \n '}function v(A,z){return'\n

        Parameters

        \n \n \n \n \n \n \n \n \n \n \n \n\n \n
        ParameterValueDescriptionParameter TypeData Type
        \n '}function u(A,z){return"\n
        \n

        Response Messages

        \n \n \n \n \n \n \n \n \n \n \n \n
        HTTP Status CodeReasonResponse Model
        \n "}function t(A,z){return"\n "}function j(A,z){return"\n
        \n \n \n \n
        \n "}r+="\n
          \n
        • \n \n \n
        • \n
        \n";return r})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param=b(function(f,q,o,j,s){this.compilerInfo=[4,">= 1.0.0"];o=this.merge(o,f.helpers);s=s||{};var p="",g,d="function",c=this.escapeExpression,n=this;function m(x,w){var u="",v;u+="\n ";v=o["if"].call(x,x.isFile,{hash:{},inverse:n.program(4,k,w),fn:n.program(2,l,w),data:w});if(v||v===0){u+=v}u+="\n ";return u}function l(x,w){var u="",v;u+='\n \n
        \n ';return u}function k(x,w){var u="",v;u+="\n ";v=o["if"].call(x,x.defaultValue,{hash:{},inverse:n.program(7,h,w),fn:n.program(5,i,w),data:w});if(v||v===0){u+=v}u+="\n ";return u}function i(x,w){var u="",v;u+="\n \n ";return u}function h(x,w){var u="",v;u+="\n \n
        \n
        \n ';return u}function e(x,w){var u="",v;u+="\n ";v=o["if"].call(x,x.defaultValue,{hash:{},inverse:n.program(12,r,w),fn:n.program(10,t,w),data:w});if(v||v===0){u+=v}u+="\n ";return u}function t(x,w){var u="",v;u+="\n \n ";return u}function r(x,w){var u="",v;u+="\n \n ";return u}p+="";if(g=o.name){g=g.call(q,{hash:{},data:s})}else{g=q.name;g=typeof g===d?g.apply(q):g}p+=c(g)+"\n\n\n ";g=o["if"].call(q,q.isBody,{hash:{},inverse:n.program(9,e,s),fn:n.program(1,m,s),data:s});if(g||g===0){p+=g}p+="\n\n\n";if(g=o.description){g=g.call(q,{hash:{},data:s})}else{g=q.description;g=typeof g===d?g.apply(q):g}if(g||g===0){p+=g}p+="\n";if(g=o.paramType){g=g.call(q,{hash:{},data:s})}else{g=q.paramType;g=typeof g===d?g.apply(q):g}if(g||g===0){p+=g}p+='\n\n \n\n';return p})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_list=b(function(h,t,r,m,y){this.compilerInfo=[4,">= 1.0.0"];r=this.merge(r,h.helpers);y=y||{};var s="",j,g,e,p=this,q=r.helperMissing,d="function",c=this.escapeExpression;function o(A,z){return" multiple='multiple'"}function n(A,z){return"\n "}function l(C,B){var z="",A;z+="\n ";A=r["if"].call(C,C.defaultValue,{hash:{},inverse:p.program(8,i,B),fn:p.program(6,k,B),data:B});if(A||A===0){z+=A}z+="\n ";return z}function k(A,z){return"\n "}function i(E,D){var z="",C,B,A;z+="\n ";A={hash:{},inverse:p.program(11,x,D),fn:p.program(9,f,D),data:D};B=((C=r.isArray||E.isArray),C?C.call(E,E,A):q.call(E,"isArray",E,A));if(B||B===0){z+=B}z+="\n ";return z}function f(A,z){return"\n "}function x(A,z){return"\n \n "}function w(C,B){var z="",A;z+="\n ";A=r["if"].call(C,C.isDefault,{hash:{},inverse:p.program(16,u,B),fn:p.program(14,v,B),data:B});if(A||A===0){z+=A}z+="\n ";return z}function v(C,B){var z="",A;z+='\n \n ";return z}function u(C,B){var z="",A;z+="\n \n ";return z}s+="";if(j=r.name){j=j.call(t,{hash:{},data:y})}else{j=t.name;j=typeof j===d?j.apply(t):j}s+=c(j)+"\n\n \n\n";if(g=r.description){g=g.call(t,{hash:{},data:y})}else{g=t.description;g=typeof g===d?g.apply(t):g}if(g||g===0){s+=g}s+="\n";if(g=r.paramType){g=g.call(t,{hash:{},data:y})}else{g=t.paramType;g=typeof g===d?g.apply(t):g}if(g||g===0){s+=g}s+='\n';return s})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_readonly=b(function(g,m,f,l,k){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);k=k||{};var i="",d,h="function",j=this.escapeExpression,o=this;function e(t,s){var q="",r;q+="\n \n ";return q}function c(t,s){var q="",r;q+="\n ";r=f["if"].call(t,t.defaultValue,{hash:{},inverse:o.program(6,n,s),fn:o.program(4,p,s),data:s});if(r||r===0){q+=r}q+="\n ";return q}function p(t,s){var q="",r;q+="\n ";if(r=f.defaultValue){r=r.call(t,{hash:{},data:s})}else{r=t.defaultValue;r=typeof r===h?r.apply(t):r}q+=j(r)+"\n ";return q}function n(r,q){return"\n (empty)\n "}i+="";if(d=f.name){d=d.call(m,{hash:{},data:k})}else{d=m.name;d=typeof d===h?d.apply(m):d}i+=j(d)+"\n\n ";d=f["if"].call(m,m.isBody,{hash:{},inverse:o.program(3,c,k),fn:o.program(1,e,k),data:k});if(d||d===0){i+=d}i+="\n\n";if(d=f.description){d=d.call(m,{hash:{},data:k})}else{d=m.description;d=typeof d===h?d.apply(m):d}if(d||d===0){i+=d}i+="\n";if(d=f.paramType){d=d.call(m,{hash:{},data:k})}else{d=m.paramType;d=typeof d===h?d.apply(m):d}if(d||d===0){i+=d}i+='\n\n';return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_readonly_required=b(function(g,m,f,l,k){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);k=k||{};var i="",d,h="function",j=this.escapeExpression,o=this;function e(t,s){var q="",r;q+="\n \n ";return q}function c(t,s){var q="",r;q+="\n ";r=f["if"].call(t,t.defaultValue,{hash:{},inverse:o.program(6,n,s),fn:o.program(4,p,s),data:s});if(r||r===0){q+=r}q+="\n ";return q}function p(t,s){var q="",r;q+="\n ";if(r=f.defaultValue){r=r.call(t,{hash:{},data:s})}else{r=t.defaultValue;r=typeof r===h?r.apply(t):r}q+=j(r)+"\n ";return q}function n(r,q){return"\n (empty)\n "}i+="";if(d=f.name){d=d.call(m,{hash:{},data:k})}else{d=m.name;d=typeof d===h?d.apply(m):d}i+=j(d)+"\n\n ";d=f["if"].call(m,m.isBody,{hash:{},inverse:o.program(3,c,k),fn:o.program(1,e,k),data:k});if(d||d===0){i+=d}i+="\n\n";if(d=f.description){d=d.call(m,{hash:{},data:k})}else{d=m.description;d=typeof d===h?d.apply(m):d}if(d||d===0){i+=d}i+="\n";if(d=f.paramType){d=d.call(m,{hash:{},data:k})}else{d=m.paramType;d=typeof d===h?d.apply(m):d}if(d||d===0){i+=d}i+='\n\n';return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_required=b(function(f,q,o,j,u){this.compilerInfo=[4,">= 1.0.0"];o=this.merge(o,f.helpers);u=u||{};var p="",g,d="function",c=this.escapeExpression,n=this;function m(z,y){var w="",x;w+="\n ";x=o["if"].call(z,z.isFile,{hash:{},inverse:n.program(4,k,y),fn:n.program(2,l,y),data:y});if(x||x===0){w+=x}w+="\n ";return w}function l(z,y){var w="",x;w+='\n \n ";return w}function k(z,y){var w="",x;w+="\n ";x=o["if"].call(z,z.defaultValue,{hash:{},inverse:n.program(7,h,y),fn:n.program(5,i,y),data:y});if(x||x===0){w+=x}w+="\n ";return w}function i(z,y){var w="",x;w+="\n \n ";return w}function h(z,y){var w="",x;w+="\n \n
        \n
        \n ';return w}function e(z,y){var w="",x;w+="\n ";x=o["if"].call(z,z.isFile,{hash:{},inverse:n.program(12,t,y),fn:n.program(10,v,y),data:y});if(x||x===0){w+=x}w+="\n ";return w}function v(z,y){var w="",x;w+="\n \n ";return w}function t(z,y){var w="",x;w+="\n ";x=o["if"].call(z,z.defaultValue,{hash:{},inverse:n.program(15,r,y),fn:n.program(13,s,y),data:y});if(x||x===0){w+=x}w+="\n ";return w}function s(z,y){var w="",x;w+="\n \n ";return w}function r(z,y){var w="",x;w+="\n \n ";return w}p+="";if(g=o.name){g=g.call(q,{hash:{},data:u})}else{g=q.name;g=typeof g===d?g.apply(q):g}p+=c(g)+"\n\n ";g=o["if"].call(q,q.isBody,{hash:{},inverse:n.program(9,e,u),fn:n.program(1,m,u),data:u});if(g||g===0){p+=g}p+="\n\n\n ";if(g=o.description){g=g.call(q,{hash:{},data:u})}else{g=q.description;g=typeof g===d?g.apply(q):g}if(g||g===0){p+=g}p+="\n\n";if(g=o.paramType){g=g.call(q,{hash:{},data:u})}else{g=q.paramType;g=typeof g===d?g.apply(q):g}if(g||g===0){p+=g}p+='\n\n';return p})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.parameter_content_type=b(function(g,l,f,k,j){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);j=j||{};var i="",c,h="function",m=this;function e(r,q){var o="",p;o+="\n ";p=f.each.call(r,r.consumes,{hash:{},inverse:m.noop,fn:m.program(2,d,q),data:q});if(p||p===0){o+=p}o+="\n";return o}function d(r,q){var o="",p;o+='\n \n ";return o}function n(p,o){return'\n \n'}i+='\n\n";return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.resource=b(function(f,l,e,k,j){this.compilerInfo=[4,">= 1.0.0"];e=this.merge(e,f.helpers);j=j||{};var h="",c,o,g="function",i=this.escapeExpression,n=this,m=e.blockHelperMissing;function d(s,r){var p="",q;p+=" : ";if(q=e.description){q=q.call(s,{hash:{},data:r})}else{q=s.description;q=typeof q===g?q.apply(s):q}if(q||q===0){p+=q}return p}h+="
        \n

        \n ";if(c=e.name){c=c.call(l,{hash:{},data:j})}else{c=l.name;c=typeof c===g?c.apply(l):c}h+=i(c)+" ";o={hash:{},inverse:n.noop,fn:n.program(1,d,j),data:j};if(c=e.description){c=c.call(l,o)}else{c=l.description;c=typeof c===g?c.apply(l):c}if(!e.description){c=m.call(l,c,o)}if(c||c===0){h+=c}h+="\n

        \n \n
        \n\n";return h})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.response_content_type=b(function(g,l,f,k,j){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);j=j||{};var i="",c,h="function",m=this;function e(r,q){var o="",p;o+="\n ";p=f.each.call(r,r.produces,{hash:{},inverse:m.noop,fn:m.program(2,d,q),data:q});if(p||p===0){o+=p}o+="\n";return o}function d(r,q){var o="",p;o+='\n \n ";return o}function n(p,o){return'\n \n'}i+='\n\n";return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.signature=b(function(e,k,d,j,i){this.compilerInfo=[4,">= 1.0.0"];d=this.merge(d,e.helpers);i=i||{};var g="",c,f="function",h=this.escapeExpression;g+='
        \n\n
        \n\n
        \n
        \n ';if(c=d.signature){c=c.call(k,{hash:{},data:i})}else{c=k.signature;c=typeof c===f?c.apply(k):c}if(c||c===0){g+=c}g+='\n
        \n\n
        \n
        ';if(c=d.sampleJSON){c=c.call(k,{hash:{},data:i})}else{c=k.sampleJSON;c=typeof c===f?c.apply(k):c}g+=h(c)+'
        \n \n
        \n
        \n\n';return g})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.status_code=b(function(e,k,d,j,i){this.compilerInfo=[4,">= 1.0.0"];d=this.merge(d,e.helpers);i=i||{};var g="",c,f="function",h=this.escapeExpression;g+="";if(c=d.code){c=c.call(k,{hash:{},data:i})}else{c=k.code;c=typeof c===f?c.apply(k):c}g+=h(c)+"\n";if(c=d.message){c=c.call(k,{hash:{},data:i})}else{c=k.message;c=typeof c===f?c.apply(k):c}if(c||c===0){g+=c}g+="\n";return g})})();(function(){var g,c,i,d,m,f,k,a,l,j,b,h={}.hasOwnProperty,e=function(q,o){for(var n in o){if(h.call(o,n)){q[n]=o[n]}}function p(){this.constructor=q}p.prototype=o.prototype;q.prototype=new p();q.__super__=o.prototype;return q};b=(function(o){e(n,o);function n(){n.__super__.constructor.apply(this,arguments)}n.prototype.dom_id="swagger_ui";n.prototype.options=null;n.prototype.api=null;n.prototype.headerView=null;n.prototype.mainView=null;n.prototype.initialize=function(p){var q=this;if(p==null){p={}}if(p.dom_id!=null){this.dom_id=p.dom_id;delete p.dom_id}if($("#"+this.dom_id)==null){$("body").append('
        ')}this.options=p;this.options.success=function(){return q.render()};this.options.progress=function(r){return q.showMessage(r)};this.options.failure=function(r){return q.onLoadFailure(r)};this.headerView=new c({el:$("#header")});return this.headerView.on("update-swagger-ui",function(r){return q.updateSwaggerUi(r)})};n.prototype.updateSwaggerUi=function(p){this.options.url=p.url;return this.load()};n.prototype.load=function(){var p,q;if((q=this.mainView)!=null){q.clear()}p=this.options.url;if(p.indexOf("http")!==0){p=this.buildUrl(window.location.href.toString(),p)}this.options.url=p;this.headerView.update(p);this.api=new SwaggerApi(this.options);this.api.build();return this.api};n.prototype.render=function(){var p=this;this.showMessage("Finished Loading Resource Information. Rendering Swagger UI...");this.headerView.updateInfo(this.api.info);this.mainView=new i({model:this.api,el:$("#"+this.dom_id)}).render();this.showMessage();switch(this.options.docExpansion){case"full":Docs.expandOperationsForResource("");break;case"list":Docs.collapseOperationsForResource("")}if(this.options.onComplete){this.options.onComplete(this.api,this)}return setTimeout(function(){return Docs.shebang()},400)};n.prototype.buildUrl=function(r,p){var q,s;log("base is "+r);if(p.indexOf("/")===0){s=r.split("/");r=s[0]+"//"+s[2];return r+p}else{q=r.length;if(r.indexOf("?")>-1){q=Math.min(q,r.indexOf("?"))}if(r.indexOf("#")>-1){q=Math.min(q,r.indexOf("#"))}r=r.substring(0,q);if(r.indexOf("/",r.length-1)!==-1){return r+p}return r+"/"+p}};n.prototype.showMessage=function(p){if(p==null){p=""}$("#message-bar").removeClass("message-fail");$("#message-bar").addClass("message-success");return $("#message-bar").html(p)};n.prototype.onLoadFailure=function(p){var q;if(p==null){p=""}$("#message-bar").removeClass("message-success");$("#message-bar").addClass("message-fail");q=$("#message-bar").html(p);if(this.options.onFailure!=null){this.options.onFailure(p)}return q};return n})(Backbone.Router);window.SwaggerUi=b;c=(function(o){e(n,o);function n(){n.__super__.constructor.apply(this,arguments)}n.prototype.events={"click #show-pet-store-icon":"showPetStore","click #show-wordnik-dev-icon":"showWordnikDev","click #explore":"showCustom","keyup #input_baseUrl":"showCustomOnKeyup","keyup #input_apiKey":"showCustomOnKeyup"};n.prototype.initialize=function(){};n.prototype.showPetStore=function(p){return this.trigger("update-swagger-ui",{url:"http://petstore.swagger.wordnik.com/api/api-docs"})};n.prototype.showWordnikDev=function(p){return this.trigger("update-swagger-ui",{url:"http://api.wordnik.com/v4/resources.json"})};n.prototype.showCustomOnKeyup=function(p){if(p.keyCode===13){return this.showCustom()}};n.prototype.showCustom=function(p){if(p!=null){p.preventDefault()}return this.trigger("update-swagger-ui",{url:$("#input_baseUrl").val(),apiKey:$("#input_apiKey").val()})};n.prototype.update=function(q,r,p){if(p==null){p=false}$("#input_baseUrl").val(q);if(p){return this.trigger("update-swagger-ui",{url:q})}};n.prototype.updateInfo=function(p){if(p.title!=null){$("#logo").text(p.title)}if(p.description!=null){$("#logo").attr("title",p.description)}if(p.termsOfServiceUrl!=null){return $("#logo").attr("href",p.termsOfServiceUrl)}};return n})(Backbone.View);i=(function(n){e(o,n);function o(){o.__super__.constructor.apply(this,arguments)}o.prototype.initialize=function(){};o.prototype.render=function(){var q,v,t,u,s,p,r;$(this.el).html(Handlebars.templates.main(this.model));u={};q=0;r=this.model.apisArray;for(s=0,p=r.length;sq){B=q-r}if(Bp){w=p-t}if(w0){r[u.name]=u.value}if(u.type==="file"){C=true}}y=t.find("textarea");for(z=0,s=y.length;z0){r.body=u.value}}w=t.find("select");for(x=0,q=w.length;x0){r[u.name]=v}}p.responseContentType=$("div select[name=responseContentType]",$(this.el)).val();p.requestContentType=$("div select[name=parameterContentType]",$(this.el)).val();$(".response_throbber",$(this.el)).show();if(C){return this.handleFileUpload(r,t)}else{return this.model["do"](r,p,this.showCompleteStatus,this.showErrorStatus,this)}}};n.prototype.success=function(p,q){return q.showCompleteStatus(p)};n.prototype.handleFileUpload=function(H,u){var C,t,p,D,B,z,F,w,s,r,q,G,K,J,I,A,y,x,v,E=this;A=u.serializeArray();for(w=0,G=A.length;w0){H[D.name]=D.value}}C=new FormData();F=0;y=this.model.parameters;for(s=0,K=y.length;s"+this.invocationUrl+"
        ");B={type:this.model.method,url:this.invocationUrl,headers:p,data:C,dataType:"json",contentType:false,processData:false,error:function(M,N,L){return E.showErrorStatus(E.wrap(M),E)},success:function(L){return E.showResponse(L,E)},complete:function(L){return E.showCompleteStatus(E.wrap(L),E)}};if(window.authorizations){window.authorizations.apply(B)}if(F===0){B.data.append("fake","true")}jQuery.ajax(B);return false};n.prototype.wrap=function(t){var r,u,w,q,v,s,p;w={};u=t.getAllResponseHeaders().split("\r");for(s=0,p=u.length;s0){return r.join(",")}else{return null}}};n.prototype.hideResponse=function(p){if(p!=null){p.preventDefault()}$(".response",$(this.el)).slideUp();return $(".response_hider",$(this.el)).fadeOut()};n.prototype.showResponse=function(p){var q;q=JSON.stringify(p,null,"\t").replace(/\n/g,"
        ");return $(".response_body",$(this.el)).html(escape(q))};n.prototype.showErrorStatus=function(q,p){return p.showStatus(q)};n.prototype.showCompleteStatus=function(q,p){return p.showStatus(q)};n.prototype.formatXml=function(w){var s,v,q,x,C,y,r,p,A,B,u,t,z;p=/(>)(<)(\/*)/g;B=/[ ]*(.*)[ ]+\n/g;s=/(<.+>)(.+\n)/g;w=w.replace(p,"$1\n$2$3").replace(B,"$1\n").replace(s,"$1\n$2");r=0;v="";C=w.split("\n");q=0;x="other";A={"single->single":0,"single->closing":-1,"single->opening":0,"single->other":0,"closing->single":0,"closing->closing":-1,"closing->opening":0,"closing->other":0,"opening->single":1,"opening->closing":0,"opening->opening":1,"opening->other":1,"other->single":0,"other->closing":-1,"other->opening":0,"other->other":0};u=function(I){var E,D,G,K,H,F,J;F={single:Boolean(I.match(/<.+\/>/)),closing:Boolean(I.match(/<\/.+>/)),opening:Boolean(I.match(/<[^!?].*>/))};H=((function(){var L;L=[];for(G in F){J=F[G];if(J){L.push(G)}}return L})())[0];H=H===void 0?"other":H;E=x+"->"+H;x=H;K="";q+=A[E];K=((function(){var M,N,L;L=[];for(D=M=0,N=q;0<=N?MN;D=0<=N?++M:--M){L.push(" ")}return L})()).join("");if(E==="opening->closing"){return v=v.substr(0,v.length-1)+I+"\n"}else{return v+=K+I+"\n"}};for(t=0,z=C.length;t").text("no content");u=$('
        ').append(t)}else{if(w==="application/json"||/\+json$/.test(w)){t=$("").text(JSON.stringify(JSON.parse(s),null,"  "));u=$('
        ').append(t)}else{if(w==="application/xml"||/\+xml$/.test(w)){t=$("").text(this.formatXml(s));u=$('
        ').append(t)}else{if(w==="text/html"){t=$("").html(s);u=$('
        ').append(t)}else{if(/^image\//.test(w)){u=$("").attr("src",q)}else{t=$("").text(s);u=$('
        ').append(t)}}}}}r=u;$(".request_url",$(this.el)).html("
        "+q+"
        ");$(".response_code",$(this.el)).html("
        "+p.status+"
        ");$(".response_body",$(this.el)).html(r);$(".response_headers",$(this.el)).html("
        "+JSON.stringify(p.headers,null,"  ").replace(/\n/g,"
        ")+"
        ");$(".response",$(this.el)).slideDown();$(".response_hider",$(this.el)).show();$(".response_throbber",$(this.el)).hide();return hljs.highlightBlock($(".response_body",$(this.el))[0])};n.prototype.toggleOperationContent=function(){var p;p=$("#"+Docs.escapeResourceName(this.model.parentId)+"_"+this.model.nickname+"_content");if(p.is(":visible")){return Docs.collapseOperation(p)}else{return Docs.expandOperation(p)}};return n})(Backbone.View);j=(function(o){e(n,o);function n(){n.__super__.constructor.apply(this,arguments)}n.prototype.initialize=function(){};n.prototype.render=function(){var q,p,r;r=this.template();$(this.el).html(r(this.model));if(swaggerUi.api.models.hasOwnProperty(this.model.responseModel)){q={sampleJSON:JSON.stringify(swaggerUi.api.models[this.model.responseModel].createJSONSample(),null,2),isParam:false,signature:swaggerUi.api.models[this.model.responseModel].getMockSignature()};p=new l({model:q,tagName:"div"});$(".model-signature",this.$el).append(p.render().el)}else{$(".model-signature",this.$el).html("")}return this};n.prototype.template=function(){return Handlebars.templates.status_code};return n})(Backbone.View);f=(function(o){e(n,o);function n(){n.__super__.constructor.apply(this,arguments)}n.prototype.initialize=function(){return Handlebars.registerHelper("isArray",function(q,p){if(q.type.toLowerCase()==="array"||q.allowMultiple){return p.fn(this)}else{return p.inverse(this)}})};n.prototype.render=function(){var v,p,r,u,q,w,t,s;s=this.model.type||this.model.dataType;if(this.model.paramType==="body"){this.model.isBody=true}if(s.toLowerCase()==="file"){this.model.isFile=true}t=this.template();$(this.el).html(t(this.model));q={sampleJSON:this.model.sampleJSON,isParam:true,signature:this.model.signature};if(this.model.sampleJSON){w=new l({model:q,tagName:"div"});$(".model-signature",$(this.el)).append(w.render().el)}else{$(".model-signature",$(this.el)).html(this.model.signature)}p=false;if(this.model.isBody){p=true}v={isParam:p};v.consumes=this.model.consumes;if(p){r=new m({model:v});$(".parameter-content-type",$(this.el)).append(r.render().el)}else{u=new a({model:v});$(".response-content-type",$(this.el)).append(u.render().el)}return this};n.prototype.template=function(){if(this.model.isList){return Handlebars.templates.param_list}else{if(this.options.readOnly){if(this.model.required){return Handlebars.templates.param_readonly_required}else{return Handlebars.templates.param_readonly}}else{if(this.model.required){return Handlebars.templates.param_required}else{return Handlebars.templates.param}}}};return n})(Backbone.View);l=(function(o){e(n,o);function n(){n.__super__.constructor.apply(this,arguments)}n.prototype.events={"click a.description-link":"switchToDescription","click a.snippet-link":"switchToSnippet","mousedown .snippet":"snippetToTextArea"};n.prototype.initialize=function(){};n.prototype.render=function(){var p;p=this.template();$(this.el).html(p(this.model));this.switchToDescription();this.isParam=this.model.isParam;if(this.isParam){$(".notice",$(this.el)).text("Click to set as parameter value")}return this};n.prototype.template=function(){return Handlebars.templates.signature};n.prototype.switchToDescription=function(p){if(p!=null){p.preventDefault()}$(".snippet",$(this.el)).hide();$(".description",$(this.el)).show();$(".description-link",$(this.el)).addClass("selected");return $(".snippet-link",$(this.el)).removeClass("selected")};n.prototype.switchToSnippet=function(p){if(p!=null){p.preventDefault()}$(".description",$(this.el)).hide();$(".snippet",$(this.el)).show();$(".snippet-link",$(this.el)).addClass("selected");return $(".description-link",$(this.el)).removeClass("selected")};n.prototype.snippetToTextArea=function(p){var q;if(this.isParam){if(p!=null){p.preventDefault()}q=$("textarea",$(this.el.parentNode.parentNode.parentNode));if($.trim(q.val())===""){return q.val(this.model.sampleJSON)}}};return n})(Backbone.View);g=(function(n){e(o,n);function o(){o.__super__.constructor.apply(this,arguments)}o.prototype.initialize=function(){};o.prototype.render=function(){var p;p=this.template();$(this.el).html(p(this.model));$("label[for=contentType]",$(this.el)).text("Response Content Type");return this};o.prototype.template=function(){return Handlebars.templates.content_type};return o})(Backbone.View);a=(function(n){e(o,n);function o(){o.__super__.constructor.apply(this,arguments)}o.prototype.initialize=function(){};o.prototype.render=function(){var p;p=this.template();$(this.el).html(p(this.model));$("label[for=responseContentType]",$(this.el)).text("Response Content Type");return this};o.prototype.template=function(){return Handlebars.templates.response_content_type};return o})(Backbone.View);m=(function(o){e(n,o);function n(){n.__super__.constructor.apply(this,arguments)}n.prototype.initialize=function(){};n.prototype.render=function(){var p;p=this.template();$(this.el).html(p(this.model));$("label[for=parameterContentType]",$(this.el)).text("Parameter content type:");return this};n.prototype.template=function(){return Handlebars.templates.parameter_content_type};return n})(Backbone.View)}).call(this); \ No newline at end of file +$(function(){$.fn.vAlign=function(){return this.each(function(c){var a=$(this).height();var d=$(this).parent().height();var b=(d-a)/2;$(this).css("margin-top",b)})};$.fn.stretchFormtasticInputWidthToParent=function(){return this.each(function(b){var d=$(this).closest("form").innerWidth();var c=parseInt($(this).closest("form").css("padding-left"),10)+parseInt($(this).closest("form").css("padding-right"),10);var a=parseInt($(this).css("padding-left"),10)+parseInt($(this).css("padding-right"),10);$(this).css("width",d-c-a)})};$("form.formtastic li.string input, form.formtastic textarea").stretchFormtasticInputWidthToParent();$("ul.downplayed li div.content p").vAlign();$("form.sandbox").submit(function(){var a=true;$(this).find("input.required").each(function(){$(this).removeClass("error");if($(this).val()==""){$(this).addClass("error");$(this).wiggle();a=false}});return a})});function clippyCopiedCallback(b){$("#api_key_copied").fadeIn().delay(1000).fadeOut()}log=function(){log.history=log.history||[];log.history.push(arguments);if(this.console){console.log(Array.prototype.slice.call(arguments)[0])}};if(Function.prototype.bind&&console&&typeof console.log=="object"){["log","info","warn","error","assert","dir","clear","profile","profileEnd"].forEach(function(a){console[a]=this.bind(console[a],console)},Function.prototype.call)}var Docs={shebang:function(){var b=$.param.fragment().split("/");b.shift();switch(b.length){case 1:log("shebang resource:"+b[0]);var d="resource_"+b[0];Docs.expandEndpointListForResource(b[0]);$("#"+d).slideto({highlight:false});break;case 2:log("shebang endpoint: "+b.join("_"));Docs.expandEndpointListForResource(b[0]);$("#"+d).slideto({highlight:false});var c=b.join("_");var a=c+"_content";log("li_dom_id "+c);log("li_content_dom_id "+a);Docs.expandOperation($("#"+a));$("#"+c).slideto({highlight:false});break}},toggleEndpointListForResource:function(b){var a=$("li#resource_"+Docs.escapeResourceName(b)+" ul.endpoints");if(a.is(":visible")){Docs.collapseEndpointListForResource(b)}else{Docs.expandEndpointListForResource(b)}},expandEndpointListForResource:function(b){var b=Docs.escapeResourceName(b);if(b==""){$(".resource ul.endpoints").slideDown();return}$("li#resource_"+b).addClass("active");var a=$("li#resource_"+b+" ul.endpoints");a.slideDown()},collapseEndpointListForResource:function(b){var b=Docs.escapeResourceName(b);$("li#resource_"+b).removeClass("active");var a=$("li#resource_"+b+" ul.endpoints");a.slideUp()},expandOperationsForResource:function(a){Docs.expandEndpointListForResource(a);if(a==""){$(".resource ul.endpoints li.operation div.content").slideDown();return}$("li#resource_"+Docs.escapeResourceName(a)+" li.operation div.content").each(function(){Docs.expandOperation($(this))})},collapseOperationsForResource:function(a){Docs.expandEndpointListForResource(a);$("li#resource_"+Docs.escapeResourceName(a)+" li.operation div.content").each(function(){Docs.collapseOperation($(this))})},escapeResourceName:function(a){return a.replace(/[!"#$%&'()*+,.\/:;<=>?@\[\\\]\^`{|}~]/g,"\\$&")},expandOperation:function(a){a.slideDown()},collapseOperation:function(a){a.slideUp()}};(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.content_type=b(function(g,l,f,k,j){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);j=j||{};var i="",c,h="function",m=this;function e(r,q){var o="",p;o+="\n ";p=f.each.call(r,r.produces,{hash:{},inverse:m.noop,fn:m.program(2,d,q),data:q});if(p||p===0){o+=p}o+="\n";return o}function d(r,q){var o="",p;o+='\n \n ";return o}function n(p,o){return'\n \n'}i+='\n\n";return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.main=b(function(g,m,f,l,k){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);k=k||{};var i="",c,h="function",j=this.escapeExpression,p=this;function e(v,u){var r="",t,s;r+='\n
        '+j(((t=((t=v.info),t==null||t===false?t:t.title)),typeof t===h?t.apply(v):t))+'
        \n
        ';s=((t=((t=v.info),t==null||t===false?t:t.description)),typeof t===h?t.apply(v):t);if(s||s===0){r+=s}r+="
        \n ";s=f["if"].call(v,((t=v.info),t==null||t===false?t:t.termsOfServiceUrl),{hash:{},inverse:p.noop,fn:p.program(2,d,u),data:u});if(s||s===0){r+=s}r+="\n ";s=f["if"].call(v,((t=v.info),t==null||t===false?t:t.contact),{hash:{},inverse:p.noop,fn:p.program(4,q,u),data:u});if(s||s===0){r+=s}r+="\n ";s=f["if"].call(v,((t=v.info),t==null||t===false?t:t.license),{hash:{},inverse:p.noop,fn:p.program(6,o,u),data:u});if(s||s===0){r+=s}r+="\n ";return r}function d(u,t){var r="",s;r+='';return r}function q(u,t){var r="",s;r+="';return r}function o(u,t){var r="",s;r+="";return r}function n(u,t){var r="",s;r+='\n , api version: ';if(s=f.apiVersion){s=s.call(u,{hash:{},data:t})}else{s=u.apiVersion;s=typeof s===h?s.apply(u):s}r+=j(s)+"\n ";return r}i+="
        \n ";c=f["if"].call(m,m.info,{hash:{},inverse:p.noop,fn:p.program(1,e,k),data:k});if(c||c===0){i+=c}i+="\n
        \n
        \n
          \n
        \n\n
        \n
        \n
        \n

        [ base url: ";if(c=f.basePath){c=c.call(m,{hash:{},data:k})}else{c=m.basePath;c=typeof c===h?c.apply(m):c}i+=j(c)+"\n ";c=f["if"].call(m,m.apiVersion,{hash:{},inverse:p.noop,fn:p.program(8,n,k),data:k});if(c||c===0){i+=c}i+="]

        \n
        \n
        \n";return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.operation=b(function(g,s,q,m,y){this.compilerInfo=[4,">= 1.0.0"];q=this.merge(q,g.helpers);y=y||{};var r="",i,f,e="function",d=this.escapeExpression,p=this,c=q.blockHelperMissing;function o(C,B){var z="",A;z+="\n

        Implementation Notes

        \n

        ";if(A=q.notes){A=A.call(C,{hash:{},data:B})}else{A=C.notes;A=typeof A===e?A.apply(C):A}if(A||A===0){z+=A}z+="

        \n ";return z}function n(A,z){return'\n
        \n '}function l(C,B){var z="",A;z+='\n \n ";return z}function k(D,C){var z="",B,A;z+="\n
        "+d(((B=D.scope),typeof B===e?B.apply(D):B))+"
        \n ";return z}function h(A,z){return"
        "}function x(A,z){return'\n
        \n \n
        \n '}function w(A,z){return'\n

        Response Class

        \n

        \n
        \n
        \n '}function v(A,z){return'\n

        Parameters

        \n \n \n \n \n \n \n \n \n \n \n \n\n \n
        ParameterValueDescriptionParameter TypeData Type
        \n '}function u(A,z){return"\n
        \n

        Response Messages

        \n \n \n \n \n \n \n \n \n \n \n \n
        HTTP Status CodeReasonResponse Model
        \n "}function t(A,z){return"\n "}function j(A,z){return"\n
        \n \n \n \n
        \n "}r+="\n
          \n
        • \n \n \n
        • \n
        \n";return r})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param=b(function(f,q,o,j,t){this.compilerInfo=[4,">= 1.0.0"];o=this.merge(o,f.helpers);t=t||{};var p="",g,d="function",c=this.escapeExpression,n=this;function m(y,x){var v="",w;v+="\n ";w=o["if"].call(y,y.isFile,{hash:{},inverse:n.program(4,k,x),fn:n.program(2,l,x),data:x});if(w||w===0){v+=w}v+="\n ";return v}function l(y,x){var v="",w;v+='\n \n
        \n ';return v}function k(y,x){var v="",w;v+="\n ";w=o["if"].call(y,y.defaultValue,{hash:{},inverse:n.program(7,h,x),fn:n.program(5,i,x),data:x});if(w||w===0){v+=w}v+="\n ";return v}function i(y,x){var v="",w;v+="\n \n ";return v}function h(y,x){var v="",w;v+="\n \n
        \n
        \n ';return v}function e(y,x){var v="",w;v+="\n ";w=o["if"].call(y,y.isFile,{hash:{},inverse:n.program(10,u,x),fn:n.program(2,l,x),data:x});if(w||w===0){v+=w}v+="\n ";return v}function u(y,x){var v="",w;v+="\n ";w=o["if"].call(y,y.defaultValue,{hash:{},inverse:n.program(13,r,x),fn:n.program(11,s,x),data:x});if(w||w===0){v+=w}v+="\n ";return v}function s(y,x){var v="",w;v+="\n \n ";return v}function r(y,x){var v="",w;v+="\n \n ";return v}p+="";if(g=o.name){g=g.call(q,{hash:{},data:t})}else{g=q.name;g=typeof g===d?g.apply(q):g}p+=c(g)+"\n\n\n ";g=o["if"].call(q,q.isBody,{hash:{},inverse:n.program(9,e,t),fn:n.program(1,m,t),data:t});if(g||g===0){p+=g}p+="\n\n\n";if(g=o.description){g=g.call(q,{hash:{},data:t})}else{g=q.description;g=typeof g===d?g.apply(q):g}if(g||g===0){p+=g}p+="\n";if(g=o.paramType){g=g.call(q,{hash:{},data:t})}else{g=q.paramType;g=typeof g===d?g.apply(q):g}if(g||g===0){p+=g}p+='\n\n \n\n';return p})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_list=b(function(h,t,r,m,y){this.compilerInfo=[4,">= 1.0.0"];r=this.merge(r,h.helpers);y=y||{};var s="",j,g,e,p=this,q=r.helperMissing,d="function",c=this.escapeExpression;function o(A,z){return" multiple='multiple'"}function n(A,z){return"\n "}function l(C,B){var z="",A;z+="\n ";A=r["if"].call(C,C.defaultValue,{hash:{},inverse:p.program(8,i,B),fn:p.program(6,k,B),data:B});if(A||A===0){z+=A}z+="\n ";return z}function k(A,z){return"\n "}function i(E,D){var z="",C,B,A;z+="\n ";A={hash:{},inverse:p.program(11,x,D),fn:p.program(9,f,D),data:D};B=((C=r.isArray||E.isArray),C?C.call(E,E,A):q.call(E,"isArray",E,A));if(B||B===0){z+=B}z+="\n ";return z}function f(A,z){return"\n "}function x(A,z){return"\n \n "}function w(C,B){var z="",A;z+="\n ";A=r["if"].call(C,C.isDefault,{hash:{},inverse:p.program(16,u,B),fn:p.program(14,v,B),data:B});if(A||A===0){z+=A}z+="\n ";return z}function v(C,B){var z="",A;z+='\n \n ";return z}function u(C,B){var z="",A;z+="\n \n ";return z}s+="";if(j=r.name){j=j.call(t,{hash:{},data:y})}else{j=t.name;j=typeof j===d?j.apply(t):j}s+=c(j)+"\n\n \n\n";if(g=r.description){g=g.call(t,{hash:{},data:y})}else{g=t.description;g=typeof g===d?g.apply(t):g}if(g||g===0){s+=g}s+="\n";if(g=r.paramType){g=g.call(t,{hash:{},data:y})}else{g=t.paramType;g=typeof g===d?g.apply(t):g}if(g||g===0){s+=g}s+='\n';return s})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_readonly=b(function(g,m,f,l,k){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);k=k||{};var i="",d,h="function",j=this.escapeExpression,o=this;function e(t,s){var q="",r;q+="\n \n ";return q}function c(t,s){var q="",r;q+="\n ";r=f["if"].call(t,t.defaultValue,{hash:{},inverse:o.program(6,n,s),fn:o.program(4,p,s),data:s});if(r||r===0){q+=r}q+="\n ";return q}function p(t,s){var q="",r;q+="\n ";if(r=f.defaultValue){r=r.call(t,{hash:{},data:s})}else{r=t.defaultValue;r=typeof r===h?r.apply(t):r}q+=j(r)+"\n ";return q}function n(r,q){return"\n (empty)\n "}i+="";if(d=f.name){d=d.call(m,{hash:{},data:k})}else{d=m.name;d=typeof d===h?d.apply(m):d}i+=j(d)+"\n\n ";d=f["if"].call(m,m.isBody,{hash:{},inverse:o.program(3,c,k),fn:o.program(1,e,k),data:k});if(d||d===0){i+=d}i+="\n\n";if(d=f.description){d=d.call(m,{hash:{},data:k})}else{d=m.description;d=typeof d===h?d.apply(m):d}if(d||d===0){i+=d}i+="\n";if(d=f.paramType){d=d.call(m,{hash:{},data:k})}else{d=m.paramType;d=typeof d===h?d.apply(m):d}if(d||d===0){i+=d}i+='\n\n';return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_readonly_required=b(function(g,m,f,l,k){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);k=k||{};var i="",d,h="function",j=this.escapeExpression,o=this;function e(t,s){var q="",r;q+="\n \n ";return q}function c(t,s){var q="",r;q+="\n ";r=f["if"].call(t,t.defaultValue,{hash:{},inverse:o.program(6,n,s),fn:o.program(4,p,s),data:s});if(r||r===0){q+=r}q+="\n ";return q}function p(t,s){var q="",r;q+="\n ";if(r=f.defaultValue){r=r.call(t,{hash:{},data:s})}else{r=t.defaultValue;r=typeof r===h?r.apply(t):r}q+=j(r)+"\n ";return q}function n(r,q){return"\n (empty)\n "}i+="";if(d=f.name){d=d.call(m,{hash:{},data:k})}else{d=m.name;d=typeof d===h?d.apply(m):d}i+=j(d)+"\n\n ";d=f["if"].call(m,m.isBody,{hash:{},inverse:o.program(3,c,k),fn:o.program(1,e,k),data:k});if(d||d===0){i+=d}i+="\n\n";if(d=f.description){d=d.call(m,{hash:{},data:k})}else{d=m.description;d=typeof d===h?d.apply(m):d}if(d||d===0){i+=d}i+="\n";if(d=f.paramType){d=d.call(m,{hash:{},data:k})}else{d=m.paramType;d=typeof d===h?d.apply(m):d}if(d||d===0){i+=d}i+='\n\n';return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.param_required=b(function(f,q,o,j,u){this.compilerInfo=[4,">= 1.0.0"];o=this.merge(o,f.helpers);u=u||{};var p="",g,d="function",c=this.escapeExpression,n=this;function m(z,y){var w="",x;w+="\n ";x=o["if"].call(z,z.isFile,{hash:{},inverse:n.program(4,k,y),fn:n.program(2,l,y),data:y});if(x||x===0){w+=x}w+="\n ";return w}function l(z,y){var w="",x;w+='\n \n ";return w}function k(z,y){var w="",x;w+="\n ";x=o["if"].call(z,z.defaultValue,{hash:{},inverse:n.program(7,h,y),fn:n.program(5,i,y),data:y});if(x||x===0){w+=x}w+="\n ";return w}function i(z,y){var w="",x;w+="\n \n ";return w}function h(z,y){var w="",x;w+="\n \n
        \n
        \n ';return w}function e(z,y){var w="",x;w+="\n ";x=o["if"].call(z,z.isFile,{hash:{},inverse:n.program(12,t,y),fn:n.program(10,v,y),data:y});if(x||x===0){w+=x}w+="\n ";return w}function v(z,y){var w="",x;w+="\n \n ";return w}function t(z,y){var w="",x;w+="\n ";x=o["if"].call(z,z.defaultValue,{hash:{},inverse:n.program(15,r,y),fn:n.program(13,s,y),data:y});if(x||x===0){w+=x}w+="\n ";return w}function s(z,y){var w="",x;w+="\n \n ";return w}function r(z,y){var w="",x;w+="\n \n ";return w}p+="";if(g=o.name){g=g.call(q,{hash:{},data:u})}else{g=q.name;g=typeof g===d?g.apply(q):g}p+=c(g)+"\n\n ";g=o["if"].call(q,q.isBody,{hash:{},inverse:n.program(9,e,u),fn:n.program(1,m,u),data:u});if(g||g===0){p+=g}p+="\n\n\n ";if(g=o.description){g=g.call(q,{hash:{},data:u})}else{g=q.description;g=typeof g===d?g.apply(q):g}if(g||g===0){p+=g}p+="\n\n";if(g=o.paramType){g=g.call(q,{hash:{},data:u})}else{g=q.paramType;g=typeof g===d?g.apply(q):g}if(g||g===0){p+=g}p+='\n\n';return p})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.parameter_content_type=b(function(g,l,f,k,j){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);j=j||{};var i="",c,h="function",m=this;function e(r,q){var o="",p;o+="\n ";p=f.each.call(r,r.consumes,{hash:{},inverse:m.noop,fn:m.program(2,d,q),data:q});if(p||p===0){o+=p}o+="\n";return o}function d(r,q){var o="",p;o+='\n \n ";return o}function n(p,o){return'\n \n'}i+='\n\n";return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.resource=b(function(f,l,e,k,j){this.compilerInfo=[4,">= 1.0.0"];e=this.merge(e,f.helpers);j=j||{};var h="",c,o,g="function",i=this.escapeExpression,n=this,m=e.blockHelperMissing;function d(q,p){return" : "}h+="
        \n

        \n ';if(c=e.name){c=c.call(l,{hash:{},data:j})}else{c=l.name;c=typeof c===g?c.apply(l):c}h+=i(c)+" ";o={hash:{},inverse:n.noop,fn:n.program(1,d,j),data:j};if(c=e.description){c=c.call(l,o)}else{c=l.description;c=typeof c===g?c.apply(l):c}if(!e.description){c=m.call(l,c,o)}if(c||c===0){h+=c}if(c=e.description){c=c.call(l,{hash:{},data:j})}else{c=l.description;c=typeof c===g?c.apply(l):c}if(c||c===0){h+=c}h+="\n

        \n \n
        \n\n";return h})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.response_content_type=b(function(g,l,f,k,j){this.compilerInfo=[4,">= 1.0.0"];f=this.merge(f,g.helpers);j=j||{};var i="",c,h="function",m=this;function e(r,q){var o="",p;o+="\n ";p=f.each.call(r,r.produces,{hash:{},inverse:m.noop,fn:m.program(2,d,q),data:q});if(p||p===0){o+=p}o+="\n";return o}function d(r,q){var o="",p;o+='\n \n ";return o}function n(p,o){return'\n \n'}i+='\n\n";return i})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.signature=b(function(e,k,d,j,i){this.compilerInfo=[4,">= 1.0.0"];d=this.merge(d,e.helpers);i=i||{};var g="",c,f="function",h=this.escapeExpression;g+='
        \n\n
        \n\n
        \n
        \n ';if(c=d.signature){c=c.call(k,{hash:{},data:i})}else{c=k.signature;c=typeof c===f?c.apply(k):c}if(c||c===0){g+=c}g+='\n
        \n\n
        \n
        ';if(c=d.sampleJSON){c=c.call(k,{hash:{},data:i})}else{c=k.sampleJSON;c=typeof c===f?c.apply(k):c}g+=h(c)+'
        \n \n
        \n
        \n\n';return g})})();(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a.status_code=b(function(e,k,d,j,i){this.compilerInfo=[4,">= 1.0.0"];d=this.merge(d,e.helpers);i=i||{};var g="",c,f="function",h=this.escapeExpression;g+="";if(c=d.code){c=c.call(k,{hash:{},data:i})}else{c=k.code;c=typeof c===f?c.apply(k):c}g+=h(c)+"\n";if(c=d.message){c=c.call(k,{hash:{},data:i})}else{c=k.message;c=typeof c===f?c.apply(k):c}if(c||c===0){g+=c}g+="\n";return g})})();(function(){var j,r,u,o,l,k,n,m,i,p,s,q,h,c,g,f,e,d,b,a,x,w,t={}.hasOwnProperty,v=function(B,z){for(var y in z){if(t.call(z,y)){B[y]=z[y]}}function A(){this.constructor=B}A.prototype=z.prototype;B.prototype=new A();B.__super__=z.prototype;return B};s=(function(z){v(y,z);function y(){q=y.__super__.constructor.apply(this,arguments);return q}y.prototype.dom_id="swagger_ui";y.prototype.options=null;y.prototype.api=null;y.prototype.headerView=null;y.prototype.mainView=null;y.prototype.initialize=function(A){var B=this;if(A==null){A={}}if(A.dom_id!=null){this.dom_id=A.dom_id;delete A.dom_id}if($("#"+this.dom_id)==null){$("body").append('
        ')}this.options=A;this.options.success=function(){return B.render()};this.options.progress=function(C){return B.showMessage(C)};this.options.failure=function(C){return B.onLoadFailure(C)};this.headerView=new r({el:$("#header")});return this.headerView.on("update-swagger-ui",function(C){return B.updateSwaggerUi(C)})};y.prototype.updateSwaggerUi=function(A){this.options.url=A.url;return this.load()};y.prototype.load=function(){var B,A;if((A=this.mainView)!=null){A.clear()}B=this.options.url;if(B.indexOf("http")!==0){B=this.buildUrl(window.location.href.toString(),B)}this.options.url=B;this.headerView.update(B);this.api=new SwaggerApi(this.options);this.api.build();return this.api};y.prototype.render=function(){var A=this;this.showMessage("Finished Loading Resource Information. Rendering Swagger UI...");this.mainView=new u({model:this.api,el:$("#"+this.dom_id),swaggerOptions:this.options}).render();this.showMessage();switch(this.options.docExpansion){case"full":Docs.expandOperationsForResource("");break;case"list":Docs.collapseOperationsForResource("")}if(this.options.onComplete){this.options.onComplete(this.api,this)}return setTimeout(function(){return Docs.shebang()},400)};y.prototype.buildUrl=function(C,A){var B,D;log("base is "+C);if(A.indexOf("/")===0){D=C.split("/");C=D[0]+"//"+D[2];return C+A}else{B=C.length;if(C.indexOf("?")>-1){B=Math.min(B,C.indexOf("?"))}if(C.indexOf("#")>-1){B=Math.min(B,C.indexOf("#"))}C=C.substring(0,B);if(C.indexOf("/",C.length-1)!==-1){return C+A}return C+"/"+A}};y.prototype.showMessage=function(A){if(A==null){A=""}$("#message-bar").removeClass("message-fail");$("#message-bar").addClass("message-success");return $("#message-bar").html(A)};y.prototype.onLoadFailure=function(A){var B;if(A==null){A=""}$("#message-bar").removeClass("message-success");$("#message-bar").addClass("message-fail");B=$("#message-bar").html(A);if(this.options.onFailure!=null){this.options.onFailure(A)}return B};return y})(Backbone.Router);window.SwaggerUi=s;r=(function(z){v(y,z);function y(){h=y.__super__.constructor.apply(this,arguments);return h}y.prototype.events={"click #show-pet-store-icon":"showPetStore","click #show-wordnik-dev-icon":"showWordnikDev","click #explore":"showCustom","keyup #input_baseUrl":"showCustomOnKeyup","keyup #input_apiKey":"showCustomOnKeyup"};y.prototype.initialize=function(){};y.prototype.showPetStore=function(A){return this.trigger("update-swagger-ui",{url:"http://petstore.swagger.wordnik.com/api/api-docs"})};y.prototype.showWordnikDev=function(A){return this.trigger("update-swagger-ui",{url:"http://api.wordnik.com/v4/resources.json"})};y.prototype.showCustomOnKeyup=function(A){if(A.keyCode===13){return this.showCustom()}};y.prototype.showCustom=function(A){if(A!=null){A.preventDefault()}return this.trigger("update-swagger-ui",{url:$("#input_baseUrl").val(),apiKey:$("#input_apiKey").val()})};y.prototype.update=function(B,C,A){if(A==null){A=false}$("#input_baseUrl").val(B);if(A){return this.trigger("update-swagger-ui",{url:B})}};return y})(Backbone.View);u=(function(y){var z;v(A,y);function A(){g=A.__super__.constructor.apply(this,arguments);return g}z={alpha:function(C,B){return C.path.localeCompare(B.path)},method:function(C,B){return C.method.localeCompare(B.method)}};A.prototype.initialize=function(D){var C,H,F,E,B,G;if(D==null){D={}}if(D.swaggerOptions.sorter){F=D.swaggerOptions.sorter;H=z[F];G=this.model.apisArray;for(E=0,B=G.length;EB){K=B-C}if(KA){H=A-E}if(H0){D[I.name]=I.value}if(I.type==="file"){N=true}}E=G.find("textarea");for(L=0,F=E.length;L0){D.body=I.value}}B=G.find("select");for(K=0,C=B.length;K0){D[I.name]=J}}A.responseContentType=$("div select[name=responseContentType]",$(this.el)).val();A.requestContentType=$("div select[name=parameterContentType]",$(this.el)).val();$(".response_throbber",$(this.el)).show();if(N){return this.handleFileUpload(D,G)}else{return this.model["do"](D,A,this.showCompleteStatus,this.showErrorStatus,this)}}};y.prototype.success=function(A,B){return B.showCompleteStatus(A)};y.prototype.handleFileUpload=function(R,I){var M,H,C,N,L,K,P,J,G,F,D,Q,U,T,S,E,B,A,V,O=this;E=I.serializeArray();for(J=0,Q=E.length;J0){R[N.name]=N.value}}M=new FormData();P=0;B=this.model.parameters;for(G=0,U=B.length;G
        ");$(".request_url pre",$(this.el)).text(this.invocationUrl);L={type:this.model.method,url:this.invocationUrl,headers:C,data:M,dataType:"json",contentType:false,processData:false,error:function(X,Y,W){return O.showErrorStatus(O.wrap(X),O)},success:function(W){return O.showResponse(W,O)},complete:function(W){return O.showCompleteStatus(O.wrap(W),O)}};if(window.authorizations){window.authorizations.apply(L)}if(P===0){L.data.append("fake","true")}jQuery.ajax(L);return false};y.prototype.wrap=function(E){var C,F,H,B,G,D,A;H={};F=E.getAllResponseHeaders().split("\r");for(D=0,A=F.length;D0){return C.join(",")}else{return null}}};y.prototype.hideResponse=function(A){if(A!=null){A.preventDefault()}$(".response",$(this.el)).slideUp();return $(".response_hider",$(this.el)).fadeOut()};y.prototype.showResponse=function(A){var B;B=JSON.stringify(A,null,"\t").replace(/\n/g,"
        ");return $(".response_body",$(this.el)).html(escape(B))};y.prototype.showErrorStatus=function(B,A){return A.showStatus(B)};y.prototype.showCompleteStatus=function(B,A){return A.showStatus(B)};y.prototype.formatXml=function(H){var D,G,B,I,N,J,C,A,L,M,F,E,K;A=/(>)(<)(\/*)/g;M=/[ ]*(.*)[ ]+\n/g;D=/(<.+>)(.+\n)/g;H=H.replace(A,"$1\n$2$3").replace(M,"$1\n").replace(D,"$1\n$2");C=0;G="";N=H.split("\n");B=0;I="other";L={"single->single":0,"single->closing":-1,"single->opening":0,"single->other":0,"closing->single":0,"closing->closing":-1,"closing->opening":0,"closing->other":0,"opening->single":1,"opening->closing":0,"opening->opening":1,"opening->other":1,"other->single":0,"other->closing":-1,"other->opening":0,"other->other":0};F=function(T){var P,O,R,V,S,Q,U;Q={single:Boolean(T.match(/<.+\/>/)),closing:Boolean(T.match(/<\/.+>/)),opening:Boolean(T.match(/<[^!?].*>/))};S=((function(){var W;W=[];for(R in Q){U=Q[R];if(U){W.push(R)}}return W})())[0];S=S===void 0?"other":S;P=I+"->"+S;I=S;V="";B+=L[P];V=((function(){var X,Y,W;W=[];for(O=X=0,Y=B;0<=Y?XY;O=0<=Y?++X:--X){W.push(" ")}return W})()).join("");if(P==="opening->closing"){return G=G.substr(0,G.length-1)+T+"\n"}else{return G+=V+T+"\n"}};for(E=0,K=N.length;E").text("no content");E=$('
        ').append(C)}else{if(J==="application/json"||/\+json$/.test(J)){C=$("").text(JSON.stringify(JSON.parse(H),null,"  "));E=$('
        ').append(C)}else{if(J==="application/xml"||/\+xml$/.test(J)){C=$("").text(this.formatXml(H));E=$('
        ').append(C)}else{if(J==="text/html"){C=$("").html(H);E=$('
        ').append(C)}else{if(/^image\//.test(J)){E=$("").attr("src",B)}else{C=$("").text(H);E=$('
        ').append(C)}}}}}I=E;$(".request_url",$(this.el)).html("
        ");$(".request_url pre",$(this.el)).text(B);$(".response_code",$(this.el)).html("
        "+F.status+"
        ");$(".response_body",$(this.el)).html(I);$(".response_headers",$(this.el)).html("
        "+_.escape(JSON.stringify(F.headers,null,"  ")).replace(/\n/g,"
        ")+"
        ");$(".response",$(this.el)).slideDown();$(".response_hider",$(this.el)).show();$(".response_throbber",$(this.el)).hide();G=$(".response_body",$(this.el))[0];A=this.options.swaggerOptions;if(A.highlightSizeThreshold&&F.data.length>A.highlightSizeThreshold){return G}else{return hljs.highlightBlock(G)}};y.prototype.toggleOperationContent=function(){var A;A=$("#"+Docs.escapeResourceName(this.model.parentId)+"_"+this.model.nickname+"_content");if(A.is(":visible")){return Docs.collapseOperation(A)}else{return Docs.expandOperation(A)}};return y})(Backbone.View);p=(function(z){v(y,z);function y(){d=y.__super__.constructor.apply(this,arguments);return d}y.prototype.initialize=function(){};y.prototype.render=function(){var B,A,C;C=this.template();$(this.el).html(C(this.model));if(swaggerUi.api.models.hasOwnProperty(this.model.responseModel)){B={sampleJSON:JSON.stringify(swaggerUi.api.models[this.model.responseModel].createJSONSample(),null,2),isParam:false,signature:swaggerUi.api.models[this.model.responseModel].getMockSignature()};A=new i({model:B,tagName:"div"});$(".model-signature",this.$el).append(A.render().el)}else{$(".model-signature",this.$el).html("")}return this};y.prototype.template=function(){return Handlebars.templates.status_code};return y})(Backbone.View);k=(function(z){v(y,z);function y(){b=y.__super__.constructor.apply(this,arguments);return b}y.prototype.initialize=function(){return Handlebars.registerHelper("isArray",function(B,A){if(B.type.toLowerCase()==="array"||B.allowMultiple){return A.fn(this)}else{return A.inverse(this)}})};y.prototype.render=function(){var G,A,C,F,B,H,E,D;D=this.model.type||this.model.dataType;if(this.model.paramType==="body"){this.model.isBody=true}if(D.toLowerCase()==="file"){this.model.isFile=true}E=this.template();$(this.el).html(E(this.model));B={sampleJSON:this.model.sampleJSON,isParam:true,signature:this.model.signature};if(this.model.sampleJSON){H=new i({model:B,tagName:"div"});$(".model-signature",$(this.el)).append(H.render().el)}else{$(".model-signature",$(this.el)).html(this.model.signature)}A=false;if(this.model.isBody){A=true}G={isParam:A};G.consumes=this.model.consumes;if(A){C=new l({model:G});$(".parameter-content-type",$(this.el)).append(C.render().el)}else{F=new m({model:G});$(".response-content-type",$(this.el)).append(F.render().el)}return this};y.prototype.template=function(){if(this.model.isList){return Handlebars.templates.param_list}else{if(this.options.readOnly){if(this.model.required){return Handlebars.templates.param_readonly_required}else{return Handlebars.templates.param_readonly}}else{if(this.model.required){return Handlebars.templates.param_required}else{return Handlebars.templates.param}}}};return y})(Backbone.View);i=(function(z){v(y,z);function y(){a=y.__super__.constructor.apply(this,arguments);return a}y.prototype.events={"click a.description-link":"switchToDescription","click a.snippet-link":"switchToSnippet","mousedown .snippet":"snippetToTextArea"};y.prototype.initialize=function(){};y.prototype.render=function(){var A;A=this.template();$(this.el).html(A(this.model));this.switchToSnippet();this.isParam=this.model.isParam;if(this.isParam){$(".notice",$(this.el)).text("Click to set as parameter value")}return this};y.prototype.template=function(){return Handlebars.templates.signature};y.prototype.switchToDescription=function(A){if(A!=null){A.preventDefault()}$(".snippet",$(this.el)).hide();$(".description",$(this.el)).show();$(".description-link",$(this.el)).addClass("selected");return $(".snippet-link",$(this.el)).removeClass("selected")};y.prototype.switchToSnippet=function(A){if(A!=null){A.preventDefault()}$(".description",$(this.el)).hide();$(".snippet",$(this.el)).show();$(".snippet-link",$(this.el)).addClass("selected");return $(".description-link",$(this.el)).removeClass("selected")};y.prototype.snippetToTextArea=function(A){var B;if(this.isParam){if(A!=null){A.preventDefault()}B=$("textarea",$(this.el.parentNode.parentNode.parentNode));if($.trim(B.val())===""){return B.val(this.model.sampleJSON)}}};return y})(Backbone.View);j=(function(y){v(z,y);function z(){x=z.__super__.constructor.apply(this,arguments);return x}z.prototype.initialize=function(){};z.prototype.render=function(){var A;A=this.template();$(this.el).html(A(this.model));$("label[for=contentType]",$(this.el)).text("Response Content Type");return this};z.prototype.template=function(){return Handlebars.templates.content_type};return z})(Backbone.View);m=(function(y){v(z,y);function z(){w=z.__super__.constructor.apply(this,arguments);return w}z.prototype.initialize=function(){};z.prototype.render=function(){var A;A=this.template();$(this.el).html(A(this.model));$("label[for=responseContentType]",$(this.el)).text("Response Content Type");return this};z.prototype.template=function(){return Handlebars.templates.response_content_type};return z})(Backbone.View);l=(function(z){v(y,z);function y(){c=y.__super__.constructor.apply(this,arguments);return c}y.prototype.initialize=function(){};y.prototype.render=function(){var A;A=this.template();$(this.el).html(A(this.model));$("label[for=parameterContentType]",$(this.el)).text("Parameter content type:");return this};y.prototype.template=function(){return Handlebars.templates.parameter_content_type};return y})(Backbone.View)}).call(this); \ No newline at end of file From 160eb194ea28e33f12953aa2b5bf5d64b1033537 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 24 May 2017 15:24:35 +0200 Subject: [PATCH 247/299] Clean REST response for user and third parties --- .../societe/class/api_thirdparties.class.php | 21 ++++++++++++++++++- htdocs/user/class/api_users.class.php | 20 ++++++++++++++---- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/htdocs/societe/class/api_thirdparties.class.php b/htdocs/societe/class/api_thirdparties.class.php index df7965d6d8c..507fd62ec48 100644 --- a/htdocs/societe/class/api_thirdparties.class.php +++ b/htdocs/societe/class/api_thirdparties.class.php @@ -311,7 +311,26 @@ class Thirdparties extends DolibarrApi return $this->company; } - /** + /** + * Clean sensible object datas + * + * @param object $object Object to clean + * @return array Array of cleaned object properties + */ + function _cleanObjectDatas($object) { + + $object = parent::_cleanObjectDatas($object); + + unset($object->total_ht); + unset($object->total_tva); + unset($object->total_localtax1); + unset($object->total_localtax2); + unset($object->total_ttc); + + return $object; + } + + /** * Validate fields before create or update object * * @param array $data Datas to validate diff --git a/htdocs/user/class/api_users.class.php b/htdocs/user/class/api_users.class.php index aa2569fb3ca..af1b8441293 100644 --- a/htdocs/user/class/api_users.class.php +++ b/htdocs/user/class/api_users.class.php @@ -225,9 +225,9 @@ class Users extends DolibarrApi /** * add user to group * - * @param int $id User ID - * @param int $group Group ID - * @return int + * @param int $id User ID + * @param int $group Group ID + * @return int 1 if success * * @url GET {id}/setGroup/{group} */ @@ -246,7 +246,13 @@ class Users extends DolibarrApi throw new RestException(401, 'Access not allowed for login ' . DolibarrApiAccess::$user->login); } - return $this->useraccount->SetInGroup($group,1); + $result = $this->useraccount->SetInGroup($group,1); + if (! ($result > 0)) + { + throw new RestException(500, $this->useraccount->error); + } + + return 1; } /** @@ -287,6 +293,12 @@ class Users extends DolibarrApi unset($object->lastsearch_values); unset($object->lastsearch_values_tmp); + unset($object->total_ht); + unset($object->total_tva); + unset($object->total_localtax1); + unset($object->total_localtax2); + unset($object->total_ttc); + return $object; } From 55121c5e05cfee1fcd84e818f46fcb449972c245 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Wed, 24 May 2017 16:35:02 +0200 Subject: [PATCH 248/299] Fix: use encrypt for llx_const data --- htdocs/install/mysql/migration/5.0.0-6.0.0.sql | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index 6c71f279867..8ae10636373 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -210,22 +210,22 @@ ALTER TABLE llx_societe_remise_except ADD CONSTRAINT fk_societe_remise_fk_invoic ALTER TABLE llx_facture_rec ADD COLUMN vat_src_code varchar(10) DEFAULT ''; -DELETE FROM llx_const where name = 'ADHERENT_BANK_USE_AUTO'; +DELETE FROM llx_const WHERE name = __ENCRYPT('ADHERENT_BANK_USE_AUTO')__; -UPDATE llx_const set value='moono-lisa' where value = 'moono' AND name = 'FCKEDITOR_SKIN'; +UPDATE llx_const SET value = __ENCRYPT('moono-lisa')__ WHERE value = __ENCRYPT('moono')__ AND name = __ENCRYPT('FCKEDITOR_SKIN')__; -ALTER TABLE llx_product_price ADD COLUMN default_vat_code varchar(10) after tva_tx; -ALTER TABLE llx_product_fournisseur_price ADD COLUMN default_vat_code varchar(10) after tva_tx; +ALTER TABLE llx_product_price ADD COLUMN default_vat_code varchar(10) AFTER tva_tx; +ALTER TABLE llx_product_fournisseur_price ADD COLUMN default_vat_code varchar(10) AFTER tva_tx; ALTER TABLE llx_user ADD COLUMN model_pdf varchar(255); ALTER TABLE llx_usergroup ADD COLUMN model_pdf varchar(255); -INSERT INTO llx_const (name, entity, value, type, visible, note) VALUES ('PRODUCT_ADDON_PDF_ODT_PATH', 1, 'DOL_DATA_ROOT/doctemplates/products', 'chaine', 0, ''); -INSERT INTO llx_const (name, entity, value, type, visible, note) VALUES ('CONTRACT_ADDON_PDF_ODT_PATH', 1, 'DOL_DATA_ROOT/doctemplates/contracts', 'chaine', 0, ''); -INSERT INTO llx_const (name, entity, value, type, visible, note) VALUES ('USERGROUP_ADDON_PDF_ODT_PATH', 1, 'DOL_DATA_ROOT/doctemplates/usergroups', 'chaine', 0, ''); -INSERT INTO llx_const (name, entity, value, type, visible, note) VALUES ('USER_ADDON_PDF_ODT_PATH', 1, 'DOL_DATA_ROOT/doctemplates/users', 'chaine', 0, ''); +INSERT INTO llx_const (name, entity, value, type, visible, note) VALUES (__ENCRYPT('PRODUCT_ADDON_PDF_ODT_PATH')__, 1, __ENCRYPT('DOL_DATA_ROOT/doctemplates/products')__, 'chaine', 0, ''); +INSERT INTO llx_const (name, entity, value, type, visible, note) VALUES (__ENCRYPT('CONTRACT_ADDON_PDF_ODT_PATH')__, 1, __ENCRYPT('DOL_DATA_ROOT/doctemplates/contracts')__, 'chaine', 0, ''); +INSERT INTO llx_const (name, entity, value, type, visible, note) VALUES (__ENCRYPT('USERGROUP_ADDON_PDF_ODT_PATH')__, 1, __ENCRYPT('DOL_DATA_ROOT/doctemplates/usergroups')__, 'chaine', 0, ''); +INSERT INTO llx_const (name, entity, value, type, visible, note) VALUES (__ENCRYPT('USER_ADDON_PDF_ODT_PATH')__, 1, __ENCRYPT('DOL_DATA_ROOT/doctemplates/users')__, 'chaine', 0, ''); -INSERT INTO llx_const (name, entity, value, type, visible, note) VALUES ('MAIN_ENABLE_OVERWRITE_TRANSLATION', 1, '1', 'chaine', 0, 'Enable overwrote of translation'); +INSERT INTO llx_const (name, entity, value, type, visible, note) VALUES (__ENCRYPT('MAIN_ENABLE_OVERWRITE_TRANSLATION')__, 1, __ENCRYPT('1')__, 'chaine', 0, 'Enable overwrote of translation'); ALTER TABLE llx_chargesociales ADD COLUMN ref varchar(16); ALTER TABLE llx_chargesociales ADD COLUMN fk_projet integer DEFAULT NULL; From 339d9dbfdf6a800b12387ba2226a95d2172d6865 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Wed, 24 May 2017 18:44:03 +0200 Subject: [PATCH 249/299] New: add REST api "dictionaryevents" for to use with "agendaevents" --- .../api/class/api_dictionaryevents.class.php | 100 ++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 htdocs/api/class/api_dictionaryevents.class.php diff --git a/htdocs/api/class/api_dictionaryevents.class.php b/htdocs/api/class/api_dictionaryevents.class.php new file mode 100644 index 00000000000..23d7e8e5dba --- /dev/null +++ b/htdocs/api/class/api_dictionaryevents.class.php @@ -0,0 +1,100 @@ + + * + * 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 3 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 . + */ + +use Luracast\Restler\RestException; + +require_once DOL_DOCUMENT_ROOT.'/main.inc.php'; + +/** + * API class for events type (content of the actioncomm dictionary) + * + * @access protected + * @class DolibarrApiAccess {@requires user,external} + */ +class DictionaryEvents extends DolibarrApi +{ + /** + * Constructor + */ + function __construct() + { + global $db; + $this->db = $db; + } + + /** + * Get the list of events types. + * + * @param string $sortfield Sort field + * @param string $sortorder Sort order + * @param int $limit Number of items per page + * @param int $page Page number (starting from zero) + * @param string $type To filter on type of event + * @param string $module To filter on module events + * @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.code:like:'A%') and (t.active:>=:0)" + * @return List of events types + * + * @throws RestException + */ + function index($sortfield = "code", $sortorder = 'ASC', $limit = 100, $page = 0, $type = '', $module = '', $sqlfilters = '') + { + $list = array(); + + $sql = "SELECT id, code, type, libelle as label, module"; + $sql.= " FROM ".MAIN_DB_PREFIX."c_actioncomm as t"; + $sql.= " WHERE t.active = 1"; + if ($type) $sql.=" AND t.type LIKE '%" . $this->db->escape($type) . "%'"; + if ($module) $sql.=" AND t.module LIKE '%" . $this->db->escape($module) . "%'"; + // Add sql filters + if ($sqlfilters) + { + if (! DolibarrApi::_checkFilters($sqlfilters)) + { + throw new RestException(503, 'Error when validating parameter sqlfilters '.$sqlfilters); + } + $regexstring='\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)'; + $sql.=" AND (".preg_replace_callback('/'.$regexstring.'/', 'DolibarrApi::_forge_criteria_callback', $sqlfilters).")"; + } + + + $sql.= $this->db->order($sortfield, $sortorder); + + if ($limit) { + if ($page < 0) { + $page = 0; + } + $offset = $limit * $page; + + $sql .= $this->db->plimit($limit, $offset); + } + + $result = $this->db->query($sql); + + if ($result) { + $num = $this->db->num_rows($result); + $min = min($num, ($limit <= 0 ? $num : $limit)); + for ($i = 0; $i < $min; $i++) { + $list[] = $this->db->fetch_object($result); + } + } else { + throw new RestException(503, 'Error when retrieving list of events types : '.$this->db->lasterror()); + } + + return $list; + } + +} From 659436f1ed0d62085aa0edfc56299fa3e4965d70 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Wed, 24 May 2017 19:33:44 +0200 Subject: [PATCH 250/299] Fix: wrong min value --- htdocs/adherents/class/api_members.class.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/htdocs/adherents/class/api_members.class.php b/htdocs/adherents/class/api_members.class.php index 9ea36bf579a..3b1bda41250 100644 --- a/htdocs/adherents/class/api_members.class.php +++ b/htdocs/adherents/class/api_members.class.php @@ -106,7 +106,7 @@ class Members extends DolibarrApi $sql.= ' AND t.fk_adherent_type='.$typeid; } // Add sql filters - if ($sqlfilters) + if ($sqlfilters) { if (! DolibarrApi::_checkFilters($sqlfilters)) { @@ -115,7 +115,7 @@ class Members extends DolibarrApi $regexstring='\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)'; $sql.=" AND (".preg_replace_callback('/'.$regexstring.'/', 'DolibarrApi::_forge_criteria_callback', $sqlfilters).")"; } - + $sql.= $db->order($sortfield, $sortorder); if ($limit) { if ($page < 0) @@ -132,9 +132,10 @@ class Members extends DolibarrApi { $i=0; $num = $db->num_rows($result); - while ($i < min($limit, $num)) + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) { - $obj = $db->fetch_object($result); + $obj = $db->fetch_object($result); $member = new Adherent($this->db); if($member->fetch($obj->rowid)) { $obj_ret[] = $this->_cleanObjectDatas($member); From 3782bc445888981404e16b246dd8729e182ed637 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 24 May 2017 18:00:26 +0200 Subject: [PATCH 251/299] Look and feel v6 --- htdocs/projet/admin/project.php | 2 +- htdocs/projet/admin/project_extrafields.php | 2 +- htdocs/projet/admin/project_task_extrafields.php | 2 +- htdocs/projet/tasks/time.php | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/htdocs/projet/admin/project.php b/htdocs/projet/admin/project.php index 42cacc19272..fbcecf032cf 100644 --- a/htdocs/projet/admin/project.php +++ b/htdocs/projet/admin/project.php @@ -318,7 +318,7 @@ print load_fiche_titre($langs->trans("ProjectsSetup"),$linkback,'title_setup'); $head=project_admin_prepare_head(); -dol_fiche_head($head, 'project', $langs->trans("Projects"), 0, 'project'); +dol_fiche_head($head, 'project', $langs->trans("Projects"), -1, 'project'); diff --git a/htdocs/projet/admin/project_extrafields.php b/htdocs/projet/admin/project_extrafields.php index e3e070a3473..26a6286f034 100644 --- a/htdocs/projet/admin/project_extrafields.php +++ b/htdocs/projet/admin/project_extrafields.php @@ -70,7 +70,7 @@ print load_fiche_titre($langs->trans("ProjectsSetup"),$linkback,'title_setup'); $head = project_admin_prepare_head(); -dol_fiche_head($head, 'attributes', $langs->trans("Projects"), 0, 'project'); +dol_fiche_head($head, 'attributes', $langs->trans("Projects"), -1, 'project'); require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; diff --git a/htdocs/projet/admin/project_task_extrafields.php b/htdocs/projet/admin/project_task_extrafields.php index 3d6e1d78fe8..58f91e863fc 100644 --- a/htdocs/projet/admin/project_task_extrafields.php +++ b/htdocs/projet/admin/project_task_extrafields.php @@ -69,7 +69,7 @@ print load_fiche_titre($langs->trans("ProjectsSetup"),$linkback,'title_setup'); $head = project_admin_prepare_head(); -dol_fiche_head($head, 'attributes_task', $langs->trans("Projects"), 0, 'project'); +dol_fiche_head($head, 'attributes_task', $langs->trans("Projects"), -1, 'project'); require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index cbdfece9d45..b35cc4d707d 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -96,7 +96,7 @@ if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'e include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php'; // Purge search criteria -if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") ||GETPOST("button_removefilter")) // All test are required to be compatible with all browsers +if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") ||GETPOST("button_removefilter")) // All tests are required to be compatible with all browsers { $search_date=''; $search_datehour=''; @@ -305,7 +305,7 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) // Tabs for project $tab='tasks'; $head=project_prepare_head($projectstatic); - dol_fiche_head($head, $tab, $langs->trans("Project"), 0, ($projectstatic->public?'projectpub':'project')); + dol_fiche_head($head, $tab, $langs->trans("Project"), -1, ($projectstatic->public?'projectpub':'project')); $param=($mode=='mine'?'&mode=mine':''); From e5fe629a0e761063f74b6787ea61735d71880981 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 24 May 2017 22:48:44 +0200 Subject: [PATCH 252/299] NEW Extrafields support formulas to be computed using PHP expressions --- htdocs/contact/list.php | 6 +- htdocs/core/actions_extrafields.inc.php | 108 ++++++++++-------- htdocs/core/class/extrafields.class.php | 97 +++++++++++----- htdocs/core/lib/functions.lib.php | 24 +++- htdocs/core/tpl/admin_extrafields_add.tpl.php | 67 ++++++++--- .../core/tpl/admin_extrafields_edit.tpl.php | 59 ++++++++-- .../core/tpl/admin_extrafields_view.tpl.php | 6 +- .../install/mysql/migration/5.0.0-6.0.0.sql | 5 +- .../install/mysql/tables/llx_extrafields.sql | 6 +- htdocs/langs/en_US/admin.lang | 12 +- htdocs/langs/en_US/main.lang | 1 + .../modulebuilder/skeletons/skeleton_list.php | 20 ++-- htdocs/projet/list.php | 50 ++++---- htdocs/projet/tasks/list.php | 37 +++--- htdocs/societe/class/societe.class.php | 2 - htdocs/societe/list.php | 6 +- 16 files changed, 335 insertions(+), 171 deletions(-) diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index 39557a6e455..9bcfee7ccae 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -597,7 +597,7 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab $align=$extrafields->getAlignFlag($key); $typeofextrafield=$extrafields->attribute_type[$key]; print ''; - if (in_array($typeofextrafield, array('varchar', 'int', 'double', 'select'))) + if (in_array($typeofextrafield, array('varchar', 'int', 'double', 'select')) && empty($extrafields->attribute_computed[$key])) { $crit=$val; $tmpkey=preg_replace('/search_options_/','',$key); @@ -664,7 +664,9 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab if (! empty($arrayfields["ef.".$key]['checked'])) { $align=$extrafields->getAlignFlag($key); - print_liste_field_titre($langs->trans($extralabels[$key]),$_SERVER["PHP_SELF"],"ef.".$key,"",$param,($align?'align="'.$align.'"':''),$sortfield,$sortorder); + $sortonfield = "ef.".$key; + if (! empty($extrafields->attribute_computed[$key])) $sortonfield=''; + print_liste_field_titre($langs->trans($extralabels[$key]),$_SERVER["PHP_SELF"],$sortonfield,"",$param,($align?'align="'.$align.'"':''),$sortfield,$sortorder); } } } diff --git a/htdocs/core/actions_extrafields.inc.php b/htdocs/core/actions_extrafields.inc.php index afcf929589b..b34cbe886ab 100644 --- a/htdocs/core/actions_extrafields.inc.php +++ b/htdocs/core/actions_extrafields.inc.php @@ -14,6 +14,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . * or see http://www.gnu.org/ + * + * $elementype must be defined. */ /** @@ -24,11 +26,14 @@ $maxsizestring=255; $maxsizeint=10; -$extrasize=GETPOST('size'); -if (GETPOST('type')=='double' && strpos($extrasize,',')===false) $extrasize='24,8'; -if (GETPOST('type')=='date') $extrasize=''; -if (GETPOST('type')=='datetime') $extrasize=''; -if (GETPOST('type')=='select') $extrasize=''; +$extrasize=GETPOST('size','int'); +$type=GETPOST('type','alpha'); +$param=GETPOST('param','alpha');; + +if ($type=='double' && strpos($extrasize,',')===false) $extrasize='24,8'; +if ($type=='date') $extrasize=''; +if ($type=='datetime') $extrasize=''; +if ($type=='select') $extrasize=''; // Add attribute @@ -37,73 +42,73 @@ if ($action == 'add') if ($_POST["button"] != $langs->trans("Cancel")) { // Check values - if (! GETPOST('type')) + if (! $type) { $error++; $langs->load("errors"); $mesg[]=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Type")); $action = 'create'; } - if (GETPOST('type')=='varchar' && $extrasize <= 0) + if ($type=='varchar' && $extrasize <= 0) { $error++; $langs->load("errors"); $mesg[]=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Size")); $action = 'edit'; } - if (GETPOST('type')=='varchar' && $extrasize > $maxsizestring) + if ($type=='varchar' && $extrasize > $maxsizestring) { $error++; $langs->load("errors"); $mesg[]=$langs->trans("ErrorSizeTooLongForVarcharType",$maxsizestring); $action = 'create'; } - if (GETPOST('type')=='int' && $extrasize > $maxsizeint) + if ($type=='int' && $extrasize > $maxsizeint) { $error++; $langs->load("errors"); $mesg[]=$langs->trans("ErrorSizeTooLongForIntType",$maxsizeint); $action = 'create'; } - if (GETPOST('type')=='select' && !GETPOST('param')) + if ($type=='select' && !$param) { $error++; $langs->load("errors"); $mesg[]=$langs->trans("ErrorNoValueForSelectType"); $action = 'create'; } - if (GETPOST('type')=='sellist' && !GETPOST('param')) + if ($type=='sellist' && !$param) { $error++; $langs->load("errors"); $mesg[]=$langs->trans("ErrorNoValueForSelectListType"); $action = 'create'; } - if (GETPOST('type')=='checkbox' && !GETPOST('param')) + if ($type=='checkbox' && !$param) { $error++; $langs->load("errors"); $mesg[]=$langs->trans("ErrorNoValueForCheckBoxType"); $action = 'create'; } - if (GETPOST('type')=='link' && !GETPOST('param')) + if ($type=='link' && !$param) { $error++; $langs->load("errors"); $mesg[]=$langs->trans("ErrorNoValueForLinkType"); $action = 'create'; } - if (GETPOST('type')=='radio' && !GETPOST('param')) + if ($type=='radio' && !$param) { $error++; $langs->load("errors"); $mesg[]=$langs->trans("ErrorNoValueForRadioType"); $action = 'create'; } - if (((GETPOST('type')=='radio') || (GETPOST('type')=='checkbox')) && GETPOST('param')) + if ((($type=='radio') || ($type=='checkbox')) && $param) { // Construct array for parameter (value of select list) - $parameters = GETPOST('param'); + $parameters = $param; $parameters_array = explode("\r\n",$parameters); foreach($parameters_array as $param_ligne) { @@ -134,11 +139,11 @@ if ($action == 'add') if (isset($_POST["attrname"]) && preg_match("/^[a-z0-9-_]+$/",$_POST['attrname']) && !is_numeric($_POST["attrname"])) { // Construct array for parameter (value of select list) - $default_value = GETPOST('default_value'); - $parameters = GETPOST('param'); + $default_value = GETPOST('default_value','alpha'); + $parameters = $param; $parameters_array = explode("\r\n",$parameters); //In sellist we have only one line and it can have come to do SQL expression - if (GETPOST('type')=='sellist') { + if ($type=='sellist') { foreach($parameters_array as $param_ligne) { $params['options'] = array($parameters=>null); @@ -155,20 +160,21 @@ if ($action == 'add') } $result=$extrafields->addExtraField( - GETPOST('attrname'), - GETPOST('label'), - GETPOST('type'), - GETPOST('pos'), + GETPOST('attrname', 'alpha'), + GETPOST('label', 'alpha'), + $type, + GETPOST('pos', 'alpha'), $extrasize, $elementtype, - (GETPOST('unique')?1:0), - (GETPOST('required')?1:0), + (GETPOST('unique', 'alpha')?1:0), + (GETPOST('required', 'alpha')?1:0), $default_value, $params, - (GETPOST('alwayseditable')?1:0), - (GETPOST('perms')?GETPOST('perms'):''), - (GETPOST('list')?1:0), - (GETPOST('ishidden')?1:0) + (GETPOST('alwayseditable', 'alpha')?1:0), + (GETPOST('perms', 'alpha')?GETPOST('perms', 'alpha'):''), + (GETPOST('list', 'alpha')?1:0), + (GETPOST('ishidden', 'alpha')?1:0), + GETPOST('computed_value','alpha') ); if ($result > 0) { @@ -205,66 +211,66 @@ if ($action == 'update') if ($_POST["button"] != $langs->trans("Cancel")) { // Check values - if (! GETPOST('type')) + if (! $type) { $error++; $langs->load("errors"); $mesg[]=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Type")); $action = 'edit'; } - if (GETPOST('type')=='varchar' && $extrasize <= 0) + if ($type=='varchar' && $extrasize <= 0) { $error++; $langs->load("errors"); $mesg[]=$langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Size")); $action = 'edit'; } - if (GETPOST('type')=='varchar' && $extrasize > $maxsizestring) + if ($type=='varchar' && $extrasize > $maxsizestring) { $error++; $langs->load("errors"); $mesg[]=$langs->trans("ErrorSizeTooLongForVarcharType",$maxsizestring); $action = 'edit'; } - if (GETPOST('type')=='int' && $extrasize > $maxsizeint) + if ($type=='int' && $extrasize > $maxsizeint) { $error++; $langs->load("errors"); $mesg[]=$langs->trans("ErrorSizeTooLongForIntType",$maxsizeint); $action = 'edit'; } - if (GETPOST('type')=='select' && !GETPOST('param')) + if ($type=='select' && !$param) { $error++; $langs->load("errors"); $mesg[]=$langs->trans("ErrorNoValueForSelectType"); $action = 'edit'; } - if (GETPOST('type')=='sellist' && !GETPOST('param')) + if ($type=='sellist' && !$param) { $error++; $langs->load("errors"); $mesg[]=$langs->trans("ErrorNoValueForSelectListType"); $action = 'edit'; } - if (GETPOST('type')=='checkbox' && !GETPOST('param')) + if ($type=='checkbox' && !$param) { $error++; $langs->load("errors"); $mesg[]=$langs->trans("ErrorNoValueForCheckBoxType"); $action = 'edit'; } - if (GETPOST('type')=='radio' && !GETPOST('param')) + if ($type=='radio' && !$param) { $error++; $langs->load("errors"); $mesg[]=$langs->trans("ErrorNoValueForRadioType"); $action = 'edit'; } - if (((GETPOST('type')=='radio') || (GETPOST('type')=='checkbox')) && GETPOST('param')) + if ((($type=='radio') || ($type=='checkbox')) && $param) { // Construct array for parameter (value of select list) - $parameters = GETPOST('param'); + $parameters = $param; $parameters_array = explode("\r\n",$parameters); foreach($parameters_array as $param_ligne) { @@ -295,10 +301,10 @@ if ($action == 'update') { $pos = GETPOST('pos','int'); // Construct array for parameter (value of select list) - $parameters = GETPOST('param'); + $parameters = $param; $parameters_array = explode("\r\n",$parameters); //In sellist we have only one line and it can have come to do SQL expression - if (GETPOST('type')=='sellist') { + if ($type=='sellist') { foreach($parameters_array as $param_ligne) { $params['options'] = array($parameters=>null); @@ -315,19 +321,21 @@ if ($action == 'update') } $result=$extrafields->update( - GETPOST('attrname'), - GETPOST('label'), - GETPOST('type'), + GETPOST('attrname', 'alpha'), + GETPOST('label', 'alpha'), + $type, $extrasize, $elementtype, - (GETPOST('unique')?1:0), - (GETPOST('required')?1:0), + (GETPOST('unique', 'alpha')?1:0), + (GETPOST('required', 'alpha')?1:0), $pos, $params, - (GETPOST('alwayseditable')?1:0), - (GETPOST('perms')?GETPOST('perms'):''), - (GETPOST('list')?1:0), - (GETPOST('ishidden')?1:0) + (GETPOST('alwayseditable', 'alpha')?1:0), + (GETPOST('perms', 'alpha')?GETPOST('perms', 'alpha'):''), + (GETPOST('list', 'alpha')?1:0), + (GETPOST('ishidden', 'alpha')?1:0), + GETPOST('default_value','alpha'), + GETPOST('computed_value','alpha') ); if ($result > 0) { diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index f86f786e0fb..c89fc593745 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -36,14 +36,22 @@ class ExtraFields { var $db; - // Tableau contenant le nom des champs en clef et la definition de ces champs + + // type of element (for what object is the extrafield) + var $attribute_elementtype; + + // Array with type of the extra field var $attribute_type; - // Tableau contenant le nom des champs en clef et le label de ces champs en value + // Array with label of extra field var $attribute_label; - // Tableau contenant le nom des champs en clef et la taille/longueur max de ces champs en value + // Array with size of extra field var $attribute_size; - // Tableau contenant le nom des choix en clef et la valeur de ces choix en value + // array with list of possible values for some types of extra fields var $attribute_choice; + // Array to store compute formula for computed fields + var $attribute_computed; + // Array to store default value + var $attribute_default; // Array to store if attribute is unique or not var $attribute_unique; // Array to store if attribute is required or not @@ -77,16 +85,17 @@ class ExtraFields 'phone'=>'ExtrafieldPhone', 'mail'=>'ExtrafieldMail', 'url'=>'ExtrafieldUrl', + 'password' => 'ExtrafieldPassword', 'select' => 'ExtrafieldSelect', 'sellist' => 'ExtrafieldSelectList', 'radio' => 'ExtrafieldRadio', 'checkbox' => 'ExtrafieldCheckBox', 'chkbxlst' => 'ExtrafieldCheckBoxFromList', 'link' => 'ExtrafieldLink', - 'password' => 'ExtrafieldPassword', 'separate' => 'ExtrafieldSeparator', ); + /** * Constructor * @@ -96,10 +105,12 @@ class ExtraFields { $this->db = $db; $this->error = array(); + $this->attribute_elementtype = array(); $this->attribute_type = array(); $this->attribute_label = array(); $this->attribute_size = array(); - $this->attribute_elementtype = array(); + $this->attribute_computed = array(); + $this->attribute_default = array(); $this->attribute_unique = array(); $this->attribute_required = array(); $this->attribute_perms = array(); @@ -118,15 +129,16 @@ class ExtraFields * @param string $elementtype Element type ('member', 'product', 'thirdparty', ...) * @param int $unique Is field unique or not * @param int $required Is field required or not - * @param string $default_value Defaulted value (Example: '', '0', 'null', 'avalue') + * @param string $default_value Defaulted value (In database. use the default_value feature for default value on screen. Example: '', '0', 'null', 'avalue') * @param array $param Params for field * @param int $alwayseditable Is attribute always editable regardless of the document status * @param string $perms Permission to check * @param int $list Into list view by default * @param int $ishidden Is hidden extrafield (warning, do not rely on this. If your module need a hidden data, it must use its own table) + * @param string $computed Computed value * @return int <=0 if KO, >0 if OK */ - function addExtraField($attrname, $label, $type, $pos, $size, $elementtype, $unique=0, $required=0, $default_value='', $param=0, $alwayseditable=0, $perms='', $list=0, $ishidden=0) + function addExtraField($attrname, $label, $type, $pos, $size, $elementtype, $unique=0, $required=0, $default_value='', $param=0, $alwayseditable=0, $perms='', $list=0, $ishidden=0, $computed='') { if (empty($attrname)) return -1; if (empty($label)) return -1; @@ -137,13 +149,13 @@ class ExtraFields // Create field into database except for separator type which is not stored in database if ($type != 'separate') { - $result=$this->create($attrname, $type, $size, $elementtype, $unique, $required, $default_value, $param, $perms, $list); + $result=$this->create($attrname, $type, $size, $elementtype, $unique, $required, $default_value, $param, $perms, $list, $copmputed); } $err1=$this->errno; if ($result > 0 || $err1 == 'DB_ERROR_COLUMN_ALREADY_EXISTS' || $type == 'separate') { // Add declaration of field into table - $result2=$this->create_label($attrname,$label,$type,$pos,$size,$elementtype, $unique, $required, $param, $alwayseditable, $perms, $list, $ishidden); + $result2=$this->create_label($attrname, $label, $type, $pos, $size, $elementtype, $unique, $required, $param, $alwayseditable, $perms, $list, $ishidden, $default, $computed); $err2=$this->errno; if ($result2 > 0 || ($err1 == 'DB_ERROR_COLUMN_ALREADY_EXISTS' && $err2 == 'DB_ERROR_RECORD_ALREADY_EXISTS')) { @@ -169,13 +181,14 @@ class ExtraFields * @param string $elementtype Element type ('member', 'product', 'thirdparty', 'contact', ...) * @param int $unique Is field unique or not * @param int $required Is field required or not - * @param string $default_value Default value for field + * @param string $default_value Default value for field (in database) * @param array $param Params for field (ex for select list : array('options'=>array('value'=>'label of option')) * @param string $perms Permission * @param int $list Into list view by default + * @param string $computed Computed value * @return int <=0 if KO, >0 if OK */ - private function create($attrname, $type='varchar', $length=255, $elementtype='member', $unique=0, $required=0, $default_value='',$param='', $perms='', $list=0) + private function create($attrname, $type='varchar', $length=255, $elementtype='member', $unique=0, $required=0, $default_value='',$param='', $perms='', $list=0, $computed='') { if ($elementtype == 'thirdparty') $elementtype='societe'; if ($elementtype == 'contact') $elementtype='socpeople'; @@ -258,9 +271,11 @@ class ExtraFields * @param string $perms Permission to check * @param int $list Into list view by default * @param int $ishidden Is hidden extrafield (warning, do not rely on this. If your module need a hidden data, it must use its own table) + * @param string $default Default value (in database. use the default_value feature for default value on screen). + * @param string $computed Computed value * @return int <=0 if KO, >0 if OK */ - private function create_label($attrname, $label='', $type='', $pos=0, $size=0, $elementtype='member', $unique=0, $required=0, $param='', $alwayseditable=0, $perms='', $list=0, $ishidden=0) + private function create_label($attrname, $label='', $type='', $pos=0, $size=0, $elementtype='member', $unique=0, $required=0, $param='', $alwayseditable=0, $perms='', $list=0, $ishidden=0, $default='', $computed='') { global $conf; @@ -286,7 +301,7 @@ class ExtraFields $params=''; } - $sql = "INSERT INTO ".MAIN_DB_PREFIX."extrafields(name, label, type, pos, size, entity, elementtype, fieldunique, fieldrequired, param, alwayseditable, perms, list, ishidden)"; + $sql = "INSERT INTO ".MAIN_DB_PREFIX."extrafields(name, label, type, pos, size, entity, elementtype, fieldunique, fieldrequired, param, alwayseditable, perms, list, ishidden, fielddefault, fieldcomputed)"; $sql.= " VALUES('".$attrname."',"; $sql.= " '".$this->db->escape($label)."',"; $sql.= " '".$type."',"; @@ -299,8 +314,10 @@ class ExtraFields $sql.= " '".$params."',"; $sql.= " '".$alwayseditable."',"; $sql.= " ".($perms?"'".$this->db->escape($perms)."'":"null").","; - $sql.= " ".$list; - $sql.= ", ".$ishidden; + $sql.= " ".$list.","; + $sql.= " ".$ishidden.","; + $sql.= " ".($default?"'".$this->db->escape($default)."'":"null").","; + $sql.= " ".($computed?"'".$this->db->escape($computed)."'":"null"); $sql.=')'; dol_syslog(get_class($this)."::create_label", LOG_DEBUG); @@ -430,9 +447,11 @@ class ExtraFields * @param string $perms Permission to check * @param int $list Into list view by default * @param int $ishidden Is hidden extrafield (warning, do not rely on this. If your module need a hidden data, it must use its own table) + * @param string $default Default value (in database. use the default_value feature for default value on screen). + * @param string $computed Computed value * @return int >0 if OK, <=0 if KO */ - function update($attrname,$label,$type,$length,$elementtype,$unique=0,$required=0,$pos=0,$param='',$alwayseditable=0, $perms='',$list='',$ishidden=0) + function update($attrname,$label,$type,$length,$elementtype,$unique=0,$required=0,$pos=0,$param='',$alwayseditable=0, $perms='',$list='',$ishidden=0,$default='',$computed='') { if ($elementtype == 'thirdparty') $elementtype='societe'; if ($elementtype == 'contact') $elementtype='socpeople'; @@ -479,7 +498,7 @@ class ExtraFields { if ($label) { - $result=$this->update_label($attrname,$label,$type,$length,$elementtype,$unique,$required,$pos,$param,$alwayseditable,$perms,$list,$ishidden); + $result=$this->update_label($attrname,$label,$type,$length,$elementtype,$unique,$required,$pos,$param,$alwayseditable,$perms,$list,$ishidden,$default,$computed); } if ($result > 0) { @@ -531,12 +550,14 @@ class ExtraFields * @param string $perms Permission to check * @param int $list Into list view by default * @param int $ishidden Is hidden extrafield (warning, do not rely on this. If your module need a hidden data, it must use its own table) + * @param string $default Default value (in database. use the default_value feature for default value on screen). + * @param string $computed Computed value * @return int <=0 if KO, >0 if OK */ - private function update_label($attrname,$label,$type,$size,$elementtype,$unique=0,$required=0,$pos=0,$param='',$alwayseditable=0,$perms='',$list=0,$ishidden=0) + private function update_label($attrname,$label,$type,$size,$elementtype,$unique=0,$required=0,$pos=0,$param='',$alwayseditable=0,$perms='',$list=0,$ishidden=0,$default='',$computed='') { global $conf; - dol_syslog(get_class($this)."::update_label ".$attrname.", ".$label.", ".$type.", ".$size.", ".$elementtype.", ".$unique.", ".$required.", ".$pos.", ".$alwayseditable.", ".$perms.", ".$list.", ".$ishidden); + dol_syslog(get_class($this)."::update_label ".$attrname.", ".$label.", ".$type.", ".$size.", ".$elementtype.", ".$unique.", ".$required.", ".$pos.", ".$alwayseditable.", ".$perms.", ".$list.", ".$ishidden.", ".$default.", ".$computed); // Clean parameters if ($elementtype == 'thirdparty') $elementtype='societe'; @@ -557,7 +578,7 @@ class ExtraFields $sql_del.= " WHERE name = '".$attrname."'"; $sql_del.= " AND entity = ".$conf->entity; $sql_del.= " AND elementtype = '".$elementtype."'"; - dol_syslog(get_class($this)."::update_label", LOG_DEBUG); + $resql1=$this->db->query($sql_del); $sql = "INSERT INTO ".MAIN_DB_PREFIX."extrafields("; @@ -573,8 +594,10 @@ class ExtraFields $sql.= " pos,"; $sql.= " alwayseditable,"; $sql.= " param,"; - $sql.= " list"; - $sql.= ", ishidden"; + $sql.= " list,"; + $sql.= " ishidden,"; + $sql.= " fielddefault,"; + $sql.= " fieldcomputed"; $sql.= ") VALUES ("; $sql.= "'".$attrname."',"; $sql.= " ".$conf->entity.","; @@ -588,10 +611,12 @@ class ExtraFields $sql.= " '".$pos."',"; $sql.= " '".$alwayseditable."',"; $sql.= " '".$param."',"; - $sql.= " ".$list; - $sql.= ", ".$ishidden; + $sql.= " ".$list.", "; + $sql.= " ".$ishidden.", "; + $sql.= " ".($default?"'".$this->db->escape($default)."'":"null").","; + $sql.= " ".($computed?"'".$this->db->escape($computed)."'":"null"); $sql.= ")"; - dol_syslog(get_class($this)."::update_label", LOG_DEBUG); + $resql2=$this->db->query($sql); if ($resql1 && $resql2) @@ -635,7 +660,7 @@ class ExtraFields // For avoid conflicts with external modules if (!$forceload && !empty($conf->global->MAIN_EXTRAFIELDS_DISABLED)) return $array_name_label; - $sql = "SELECT rowid,name,label,type,size,elementtype,fieldunique,fieldrequired,param,pos,alwayseditable,perms,list,ishidden"; + $sql = "SELECT rowid,name,label,type,size,elementtype,fieldunique,fieldrequired,param,pos,alwayseditable,perms,list,ishidden,fielddefault,fieldcomputed"; $sql.= " FROM ".MAIN_DB_PREFIX."extrafields"; $sql.= " WHERE entity IN (0,".$conf->entity.")"; if ($elementtype) $sql.= " AND elementtype = '".$elementtype."'"; @@ -658,6 +683,8 @@ class ExtraFields $this->attribute_label[$tab->name]=$tab->label; $this->attribute_size[$tab->name]=$tab->size; $this->attribute_elementtype[$tab->name]=$tab->elementtype; + $this->attribute_default[$tab->name]=$tab->fielddefault; + $this->attribute_computed[$tab->name]=$tab->fieldcomputed; $this->attribute_unique[$tab->name]=$tab->fieldunique; $this->attribute_required[$tab->name]=$tab->fieldrequired; $this->attribute_param[$tab->name]=($tab->param ? unserialize($tab->param) : ''); @@ -699,6 +726,8 @@ class ExtraFields $type =$this->attribute_type[$key]; $size =$this->attribute_size[$key]; $elementtype=$this->attribute_elementtype[$key]; + $default=$this->attribute_default[$key]; + $computed=$this->attribute_computed[$key]; $unique=$this->attribute_unique[$key]; $required=$this->attribute_required[$key]; $param=$this->attribute_param[$key]; @@ -706,6 +735,8 @@ class ExtraFields $list=$this->attribute_list[$key]; $hidden=$this->attribute_hidden[$key]; + if ($computed) return ''.$langs->trans("AutomaticallyCalculated").''; + if (empty($showsize)) { if ($type == 'date') @@ -1218,10 +1249,12 @@ class ExtraFields { global $conf,$langs; + $elementtype=$this->attribute_elementtype[$key]; $label=$this->attribute_label[$key]; $type=$this->attribute_type[$key]; $size=$this->attribute_size[$key]; - $elementtype=$this->attribute_elementtype[$key]; + $default=$this->attribute_default[$key]; + $computed=$this->attribute_computed[$key]; $unique=$this->attribute_unique[$key]; $required=$this->attribute_required[$key]; $params=$this->attribute_param[$key]; @@ -1229,6 +1262,14 @@ class ExtraFields $list=$this->attribute_list[$key]; $hidden=$this->attribute_hidden[$key]; // warning, do not rely on this. If your module need a hidden data, it must use its own table. + // If field is a computed field, value must become result of compute + if ($computed) + { + // Make the eval of compute string + //var_dump($computed); + $value = dol_eval($computed, 1, 0); + } + $showsize=0; if ($type == 'date') { diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index e8ead0ed829..9ecfdc037f3 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -5604,20 +5604,32 @@ function verifCond($strRights) * * @param string $s String to evaluate * @param int $returnvalue 0=No return (used to execute eval($a=something)). 1=Value of eval is returned (used to eval($something)). + * @param int $hideerrors 1=Hide errors * @return mixed Nothing or return of eval */ -function dol_eval($s,$returnvalue=0) +function dol_eval($s, $returnvalue=0, $hideerrors=1) { // Only global variables can be changed by eval function and returned to caller - global $langs, $user, $conf; - global $leftmenu; + global $db, $langs, $user, $conf; + global $mainmenu, $leftmenu; global $rights; global $object; - global $soc; + global $mysoc; + + global $obj; // To get $obj used into list when dol_eval is used for computed fields and $obj is not yet $object + global $soc; // For backward compatibility //print $s."
        \n"; - if ($returnvalue) return @eval('return '.$s.';'); - else @eval($s); + if ($returnvalue) + { + if ($hideerrors) return @eval('return '.$s.';'); + else return eval('return '.$s.';'); + } + else + { + if ($hideerrors) @eval($s); + else eval($s); + } } /** diff --git a/htdocs/core/tpl/admin_extrafields_add.tpl.php b/htdocs/core/tpl/admin_extrafields_add.tpl.php index 9e4fd464ee6..62821372e56 100644 --- a/htdocs/core/tpl/admin_extrafields_add.tpl.php +++ b/htdocs/core/tpl/admin_extrafields_add.tpl.php @@ -18,10 +18,12 @@ */ /** - * The following vars must be defined + * The following vars must be defined: * $type2label * $form * $conf, $lang, + * The following vars may also be defined: + * $elementtype */ ?> @@ -31,15 +33,16 @@ jQuery(document).ready(function() { function init_typeoffields(type) { - console.log("select new type "+type); + console.log("selected type is "+type); var size = jQuery("#size"); + var computed_value = jQuery("#computed_value"); + var default_value = jQuery("#default_value"); var unique = jQuery("#unique"); var required = jQuery("#required"); - var default_value = jQuery("#default_value"); var alwayseditable = jQuery("#alwayseditable"); var list = jQuery("#list"); + // Case of computed field + console.log(type); + if (type == '' || type == 'varchar' || type == 'int' || type == 'double' || type == 'price') { + jQuery("tr.extra_computed_value").show(); + } else { + computed_value.val(''); jQuery("tr.extra_computed_value").hide(); + } + if (computed_value.val()) + { + console.log("We enter a computed formula"); + jQuery("#default_value").val(''); + /* jQuery("#unique, #required, #alwayseditable, #ishidden, #list").removeAttr('checked'); */ + jQuery("#default_value, #unique, #required, #alwayseditable, #ishidden, #list").attr('disabled', true); + jQuery("tr.extra_default_value, tr.extra_unique, tr.extra_required, tr.extra_alwayseditable, tr.extra_ishidden, tr.extra_list").hide(); + } + else + { + console.log("No computed formula"); + jQuery("#default_value, #unique, #required, #alwayseditable, #ishidden, #list").attr('disabled', false); + jQuery("tr.extra_default_value, tr.extra_unique, tr.extra_required, tr.extra_alwayseditable, tr.extra_ishidden, tr.extra_list").show(); + } + if (type == 'date') { size.val('').prop('disabled', true); unique.removeAttr('disabled'); jQuery("#value_choice").hide();jQuery("#helpchkbxlst").hide(); } else if (type == 'datetime') { size.val('').prop('disabled', true); unique.removeAttr('disabled'); jQuery("#value_choice").hide(); jQuery("#helpchkbxlst").hide();} else if (type == 'double') { size.val('24,8').removeAttr('disabled'); unique.removeAttr('disabled'); jQuery("#value_choice").hide(); jQuery("#helpchkbxlst").hide();} @@ -65,7 +90,10 @@ else if (type == 'checkbox') { size.val('').prop('disabled', true); unique.removeAttr('checked').prop('disabled', true); jQuery("#value_choice").show();jQuery("#helpselect").show();jQuery("#helpsellist").hide();jQuery("#helpchkbxlst").hide();jQuery("#helplink").hide();} else if (type == 'chkbxlst') { size.val('').prop('disabled', true); unique.removeAttr('checked').prop('disabled', true); jQuery("#value_choice").show();jQuery("#helpselect").hide();jQuery("#helpsellist").hide();jQuery("#helpchkbxlst").show();jQuery("#helplink").hide();} else if (type == 'link') { size.val('').prop('disabled', true); unique.removeAttr('disabled'); jQuery("#value_choice").show();jQuery("#helpselect").hide();jQuery("#helpsellist").hide();jQuery("#helpchkbxlst").hide();jQuery("#helplink").show();} - else if (type == 'separate') { size.val('').prop('disabled', true); unique.removeAttr('checked').prop('disabled', true); required.val('').prop('disabled', true); default_value.val('').prop('disabled', true); jQuery("#value_choice").hide();jQuery("#helpselect").hide();jQuery("#helpsellist").hide();jQuery("#helpchkbxlst").hide();jQuery("#helplink").hide();} + else if (type == 'separate') { + size.val('').prop('disabled', true); unique.removeAttr('checked').prop('disabled', true); required.val('').prop('disabled', true); + jQuery("#value_choice").hide();jQuery("#helpselect").hide();jQuery("#helpsellist").hide();jQuery("#helpchkbxlst").hide();jQuery("#helplink").hide(); + } else { // type = string size.val('').prop('disabled', true); unique.removeAttr('disabled'); @@ -73,10 +101,12 @@ if (type == 'separate') { - unique.removeAttr('checked').prop('disabled', true); required.removeAttr('checked').prop('disabled', true); alwayseditable.removeAttr('checked').prop('disabled', true); list.val('').prop('disabled', true); + required.removeAttr('checked').prop('disabled', true); alwayseditable.removeAttr('checked').prop('disabled', true); list.val('').prop('disabled', true); + jQuery('#size, #default_value').val('').prop('disabled', true); } else { + default_value.removeAttr('disabled'); required.removeAttr('disabled'); alwayseditable.removeAttr('disabled'); list.val('').removeAttr('disabled'); } } @@ -84,6 +114,11 @@ jQuery("#type").change(function() { init_typeoffields($(this).val()); }); + + // If we enter a formula, we disable other fields + jQuery("#computed_value").keyup(function() { + init_typeoffields(jQuery('#type').val()); + }); }); @@ -103,9 +138,7 @@ selectarray('type',$type2label,GETPOST('type')); ?> -trans("Size"); ?> - -trans("Position"); ?> +trans("Size"); ?> @@ -124,17 +157,21 @@ - -trans("DefaultValue"); ?>"> + +trans("Position"); ?> + +textwithpicto($langs->trans("ComputedFormula"), $langs->trans("ComputedFormulaDesc"), 1, 'help', '', 0, 2, 'tooltipcompute'); ?>"> + +trans("DefaultValue").' ('.$langs->trans("Database").')'; ?>"> -trans("Unique"); ?>> +trans("Unique"); ?>> -trans("Required"); ?>> +trans("Required"); ?>> -trans("AlwaysEditable"); ?>> +trans("AlwaysEditable"); ?>> global->MAIN_CAN_HIDE_EXTRAFIELDS)) { ?> -trans("Hidden"); ?>> +trans("Hidden"); ?>> global->MAIN_FEATURES_LEVEL >= 2) { ?> diff --git a/htdocs/core/tpl/admin_extrafields_edit.tpl.php b/htdocs/core/tpl/admin_extrafields_edit.tpl.php index b6c43b10ce9..6f049c506a3 100644 --- a/htdocs/core/tpl/admin_extrafields_edit.tpl.php +++ b/htdocs/core/tpl/admin_extrafields_edit.tpl.php @@ -15,6 +15,16 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + +/** + * The following vars must be defined: + * $type2label + * $form + * $conf, $lang, + * The following vars may also be defined: + * $elementtype + */ + ?> @@ -24,9 +34,10 @@ { console.log("select new type "+type); var size = jQuery("#size"); + var computed_value = jQuery("#computed_value"); + var default_value = jQuery("#default_value"); var unique = jQuery("#unique"); var required = jQuery("#required"); - var default_value = jQuery("#default_value"); var alwayseditable = jQuery("#alwayseditable"); var list = jQuery("#list"); + // Case of computed field + if (type == 'varchar' || type == 'int' || type == 'double' || type == 'price') { + jQuery("tr.extra_computed_value").show(); + } else { + computed_value.val(''); jQuery("tr.extra_computed_value").hide(); + } + if (computed_value.val()) + { + console.log("We enter a computed formula"); + jQuery("#default_value").val(''); + /* jQuery("#unique, #required, #alwayseditable, #ishidden, #list").removeAttr('checked'); */ + jQuery("#default_value, #unique, #required, #alwayseditable, #ishidden, #list").attr('disabled', true); + jQuery("tr.extra_default_value, tr.extra_unique, tr.extra_required, tr.extra_alwayseditable, tr.extra_ishidden, tr.extra_list").hide(); + } + else + { + console.log("No computed formula"); + jQuery("#default_value, #unique, #required, #alwayseditable, #ishidden, #list").attr('disabled', false); + jQuery("tr.extra_default_value, tr.extra_unique, tr.extra_required, tr.extra_alwayseditable, tr.extra_ishidden, tr.extra_list").show(); + } + if (type == 'date') { size.val('').prop('disabled', true); unique.removeAttr('disabled'); jQuery("#value_choice").hide();jQuery("#helpchkbxlst").hide(); } else if (type == 'datetime') { size.val('').prop('disabled', true); unique.removeAttr('disabled'); jQuery("#value_choice").hide(); jQuery("#helpchkbxlst").hide();} else if (type == 'double') { size.removeAttr('disabled'); unique.removeAttr('disabled'); jQuery("#value_choice").hide(); jQuery("#helpchkbxlst").hide();} @@ -65,9 +97,11 @@ if (type == 'separate') { required.removeAttr('checked').prop('disabled', true); alwayseditable.removeAttr('checked').prop('disabled', true); list.val('').prop('disabled', true); + jQuery('#size, #default_value').val('').prop('disabled', true); } else { + default_value.removeAttr('disabled'); required.removeAttr('disabled'); alwayseditable.removeAttr('disabled'); list.val('').removeAttr('disabled'); } } @@ -75,6 +109,11 @@ jQuery("#type").change(function() { init_typeoffields($(this).val()); }); + + // If we enter a formula, we disable other fields + jQuery("#computed_value").keyup(function() { + init_typeoffields(jQuery('#type').val()); + }); }); @@ -92,6 +131,8 @@ attribute_type[$attrname]; $size=$extrafields->attribute_size[$attrname]; +$computed=$extrafields->attribute_computed[$attrname]; +$default=$extrafields->attribute_default[$attrname]; $unique=$extrafields->attribute_unique[$attrname]; $required=$extrafields->attribute_required[$attrname]; $pos=$extrafields->attribute_pos[$attrname]; @@ -156,9 +197,7 @@ else ?> -trans("Size"); ?> - -trans("Position"); ?> +trans("Size"); ?> @@ -177,12 +216,18 @@ else + +trans("Position"); ?> + +textwithpicto($langs->trans("ComputedFormula"), $langs->trans("ComputedFormulaDesc"), 1, 'help', '', 0, 2, 'tooltipcompute'); ?> + + -trans("Unique"); ?>> +trans("Unique"); ?>> -trans("Required"); ?>> +trans("Required"); ?>> -trans("AlwaysEditable"); ?>> +trans("AlwaysEditable"); ?>> global->MAIN_CAN_HIDE_EXTRAFIELDS)) { ?> trans("Hidden"); ?>> diff --git a/htdocs/core/tpl/admin_extrafields_view.tpl.php b/htdocs/core/tpl/admin_extrafields_view.tpl.php index 3242a388a3d..a6d7e735735 100644 --- a/htdocs/core/tpl/admin_extrafields_view.tpl.php +++ b/htdocs/core/tpl/admin_extrafields_view.tpl.php @@ -37,12 +37,15 @@ print '
        '; print ''; print ''; -print ''; +print ''; print ''; print ''; print ''; print ''; print ''; +print ''; print ''; print ''; if (! empty($conf->global->MAIN_CAN_HIDE_EXTRAFIELDS)) print ''; @@ -61,6 +64,7 @@ if (count($extrafields->attribute_type)) print "\n"; print '\n"; print '\n"; + print '\n"; print '\n"; print '\n"; if (! empty($conf->global->MAIN_CAN_HIDE_EXTRAFIELDS)) print '\n"; // Add hidden option on not working feature. Why hide if user can't see it. diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index 6c71f279867..f7ed5b7575b 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -34,6 +34,10 @@ -- VMYSQL4.3 ALTER TABLE llx_opensurvey_sondage MODIFY COLUMN date_fin DATETIME NULL DEFAULT NULL; -- VPGSQL8.2 ALTER TABLE llx_opensurvey_sondage ALTER COLUMN date_fin DROP NOT NULL; + +ALTER TABLE llx_extrafields ADD COLUMN fieldcomputed text; +ALTER TABLE llx_extrafields ADD COLUMN fielddefault varchar(255); + ALTER TABLE llx_opensurvey_sondage MODIFY COLUMN tms timestamp DEFAULT CURRENT_TIMESTAMP; ALTER TABLE llx_opensurvey_sondage ADD COLUMN fk_user_creat integer NOT NULL DEFAULT 0; @@ -251,7 +255,6 @@ ALTER TABLE llx_product_fournisseur_price_log ADD COLUMN multicurrency_tx d ALTER TABLE llx_product_fournisseur_price_log ADD COLUMN multicurrency_price double(24,8) DEFAULT NULL; ALTER TABLE llx_product_fournisseur_price_log ADD COLUMN multicurrency_price_ttc double(24,8) DEFAULT NULL; - create table llx_payment_various ( rowid integer AUTO_INCREMENT PRIMARY KEY, diff --git a/htdocs/install/mysql/tables/llx_extrafields.sql b/htdocs/install/mysql/tables/llx_extrafields.sql index 2cc144db092..aee51524e6f 100644 --- a/htdocs/install/mysql/tables/llx_extrafields.sql +++ b/htdocs/install/mysql/tables/llx_extrafields.sql @@ -21,12 +21,14 @@ create table llx_extrafields ( rowid integer AUTO_INCREMENT PRIMARY KEY, name varchar(64) NOT NULL, -- name of field into extrafields tables - entity integer DEFAULT 1 NOT NULL, -- multi company id - elementtype varchar(64) NOT NULL DEFAULT 'member', -- for which element this extra fields is for + entity integer DEFAULT 1 NOT NULL, -- multi company id + elementtype varchar(64) NOT NULL DEFAULT 'member', -- for which element this extra fields is for tms timestamp, -- date of last update label varchar(255) NOT NULL, -- label to show for attribute type varchar(8), size varchar(8) DEFAULT NULL, + fieldcomputed text, + fielddefault varchar(255), fieldunique integer DEFAULT 0, fieldrequired integer DEFAULT 0, perms varchar(255), -- not used yet diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index d25a97c28e5..fe547931908 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -375,19 +375,21 @@ Int=Integer Float=Float DateAndTime=Date and hour Unique=Unique -Boolean=Boolean (Checkbox) +Boolean=Boolean (one checkbox) ExtrafieldPhone = Phone ExtrafieldPrice = Price ExtrafieldMail = Email ExtrafieldUrl = Url ExtrafieldSelect = Select list ExtrafieldSelectList = Select from table -ExtrafieldSeparator=Separator +ExtrafieldSeparator=Separator (not a field) ExtrafieldPassword=Password -ExtrafieldCheckBox=Checkbox -ExtrafieldRadio=Radio button -ExtrafieldCheckBoxFromList= Checkbox from table +ExtrafieldRadio=Radio buttons (on choice only) +ExtrafieldCheckBox=Checkboxes +ExtrafieldCheckBoxFromList=Checkboxes from table ExtrafieldLink=Link to an object +ComputedFormula=Computed field +ComputedFormulaDesc=You can enter here a formula using other properties of object or any PHP coding to get a dynamic computed value. You can use any PHP compatible formulas including the "?" condition operator, and following global object: $db, $conf, $langs, $mysoc, $user, $object.
        WARNING: Only some properties of $object may be available. If you need a properties not loaded, just fetch yourself the object into your formula like in the second example.
        Using a computed field means you can't enter yourself any value from interface. Also, if there is a syntax error, the formula may return nothing.

        Example of formula:
        $object->id < 5 ? round($object->id / 2, 2) : ($object->id + 2*$user->id) * (int) substr($mysoc->zip, 1, 2)

        Example of formula to force load of object and its parent object:
        (($reloadedobj = new Task($db)) && ($reloadedobj->fetch($object->id) > 0) && ($secondloadedobj = new Project($db)) && ($secondloadedobj->fetch($reloadedobj->fk_project) > 0)) ? $secondloadedobj->ref : 'Parent project not found'

        Other example to reload object
        (($reloadedobj = new Societe($db)) && ($reloadedobj->fetch($obj->id ? $obj->id : ($obj->rowid ? $obj->rowid : $object->id)) > 0)) ? round($reloadedobj->capital / 5) : '-1' ExtrafieldParamHelpselect=Parameters list have to be like key,value

        for example :
        1,value1
        2,value2
        3,value3
        ...

        In order to have the list depending on another complementary attribute list :
        1,value1|options_parent_list_code:parent_key
        2,value2|options_parent_list_code:parent_key

        In order to have the list depending on another list :
        1,value1|parent_list_code:parent_key
        2,value2|parent_list_code:parent_key ExtrafieldParamHelpcheckbox=Parameters list have to be like key,value

        for example :
        1,value1
        2,value2
        3,value3
        ... ExtrafieldParamHelpradio=Parameters list have to be like key,value

        for example :
        1,value1
        2,value2
        3,value3
        ... diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 77b5af78f81..a170bc3f6e1 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -773,6 +773,7 @@ BulkActions=Bulk actions ClickToShowHelp=Click to show tooltip help HR=HR HRAndBank=HR and Bank +AutomaticallyCalculated=Automatically calculated # Week day Monday=Monday Tuesday=Tuesday diff --git a/htdocs/modulebuilder/skeletons/skeleton_list.php b/htdocs/modulebuilder/skeletons/skeleton_list.php index 9c258162759..47aeda79fdc 100644 --- a/htdocs/modulebuilder/skeletons/skeleton_list.php +++ b/htdocs/modulebuilder/skeletons/skeleton_list.php @@ -126,13 +126,7 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab } -// Load object if id or ref is provided as parameter $object=new Skeleton_Class($db); -if (($id > 0 || ! empty($ref)) && $action != 'add') -{ - $result=$object->fetch($id,$ref); - if ($result < 0) dol_print_error($db); -} @@ -354,7 +348,9 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab if (! empty($arrayfields["ef.".$key]['checked'])) { $align=$extrafields->getAlignFlag($key); - print_liste_field_titre($langs->trans($extralabels[$key]),$_SERVER["PHP_SELF"],"ef.".$key,"",$param,($align?'align="'.$align.'"':''),$sortfield,$sortorder); + $sortonfield = "ef.".$key; + if (! empty($extrafields->attribute_computed[$key])) $sortonfield=''; + print_liste_field_titre($langs->trans($extralabels[$key]),$_SERVER["PHP_SELF"],$sortonfield,"",$param,($align?'align="'.$align.'"':''),$sortfield,$sortorder); } } } @@ -383,7 +379,7 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab $align=$extrafields->getAlignFlag($key); $typeofextrafield=$extrafields->attribute_type[$key]; print ''; print ''."\n"; +// Detect if we need a fetch on each output line +$needToFetchEachLine=0; +foreach ($extrafields->attribute_computed as $key => $val) +{ + if (preg_match('/\$object/',$val)) $needToFetchEachLine++; // There is at least one compute field that use $object +} + + $i=0; $totalarray=array(); while ($i < min($num, $limit)) diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index 6230626a320..b327573e3db 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -141,6 +141,8 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab } } +$object = new Project($db); + /* * Actions @@ -200,7 +202,6 @@ if (empty($reshook)) * View */ -$projectstatic = new Project($db); $socstatic = new Societe($db); $form = new Form($db); $formother = new FormOther($db); @@ -212,12 +213,12 @@ $title=$langs->trans("Projects"); // Get list of project id allowed to user (in a string list separated by coma) $projectsListId=''; -if (! $user->rights->projet->all->lire) $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user,0,1,$socid); +if (! $user->rights->projet->all->lire) $projectsListId = $object->getProjectsAuthorizedForUser($user,0,1,$socid); // Get id of types of contacts for projects (This list never contains a lot of elements) $listofprojectcontacttype=array(); $sql = "SELECT ctc.rowid, ctc.code FROM ".MAIN_DB_PREFIX."c_type_contact as ctc"; -$sql.= " WHERE ctc.element = '" . $projectstatic->element . "'"; +$sql.= " WHERE ctc.element = '" . $object->element . "'"; $sql.= " AND ctc.source = 'internal'"; $resql = $db->query($sql); if ($resql) @@ -232,7 +233,7 @@ if (count($listofprojectcontacttype) == 0) $listofprojectcontacttype[0]='0'; $distinct='DISTINCT'; // We add distinct until we are added a protection to be sure a contact of a project and task is only once. -$sql = "SELECT ".$distinct." p.rowid as projectid, p.ref, p.title, p.fk_statut, p.fk_opp_status, p.public, p.fk_user_creat"; +$sql = "SELECT ".$distinct." p.rowid as id, p.ref, p.title, p.fk_statut, p.fk_opp_status, p.public, p.fk_user_creat"; $sql.= ", p.datec as date_creation, p.dateo as date_start, p.datee as date_end, p.opp_amount, p.opp_percent, p.tms as date_update, p.budget_amount"; $sql.= ", s.nom as name, s.rowid as socid"; $sql.= ", cls.code as opp_status_code"; @@ -360,8 +361,7 @@ $arrayofselected=is_array($toselect)?$toselect:array(); if ($num == 1 && ! empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $search_all) { $obj = $db->fetch_object($resql); - $id = $obj->projectid; - header("Location: ".DOL_URL_ROOT.'/projet/card.php?id='.$id); + header("Location: ".DOL_URL_ROOT.'/projet/card.php?id='.$obj->id); exit; } @@ -566,7 +566,7 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab $align=$extrafields->getAlignFlag($key); $typeofextrafield=$extrafields->attribute_type[$key]; print ''; @@ -632,7 +632,9 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab if (! empty($arrayfields["ef.".$key]['checked'])) { $align=$extrafields->getAlignFlag($key); - print_liste_field_titre($langs->trans($extralabels[$key]),$_SERVER["PHP_SELF"],"ef.".$key,"",$param,($align?'align="'.$align.'"':''),$sortfield,$sortorder); + $sortonfield = "ef.".$key; + if (! empty($extrafields->attribute_computed[$key])) $sortonfield=''; + print_liste_field_titre($langs->trans($extralabels[$key]),$_SERVER["PHP_SELF"],$sortonfield,"",$param,($align?'align="'.$align.'"':''),$sortfield,$sortorder); } } } @@ -652,15 +654,15 @@ while ($i < min($num,$limit)) { $obj = $db->fetch_object($resql); - $projectstatic->id = $obj->projectid; - $projectstatic->user_author_id = $obj->fk_user_creat; - $projectstatic->public = $obj->public; - $projectstatic->ref = $obj->ref; - $projectstatic->datee = $db->jdate($obj->date_end); - $projectstatic->statut = $obj->fk_statut; - $projectstatic->opp_status = $obj->fk_opp_status; - - $userAccess = $projectstatic->restrictedProjectArea($user); // why this ? + $object->id = $obj->id; + $object->user_author_id = $obj->fk_user_creat; + $object->public = $obj->public; + $object->ref = $obj->ref; + $object->datee = $db->jdate($obj->date_end); + $object->statut = $obj->fk_statut; + $object->opp_status = $obj->fk_opp_status; + + $userAccess = $object->restrictedProjectArea($user); // why this ? if ($userAccess >= 0) { print ''; @@ -669,8 +671,8 @@ while ($i < min($num,$limit)) if (! empty($arrayfields['p.ref']['checked'])) { print ''; if (! $i) $totalarray['nbfield']++; } @@ -851,8 +853,7 @@ while ($i < min($num,$limit)) // Status if (! empty($arrayfields['p.fk_statut']['checked'])) { - $projectstatic->statut = $obj->fk_statut; - print ''; + print ''; if (! $i) $totalarray['nbfield']++; } // Action column @@ -860,8 +861,8 @@ while ($i < min($num,$limit)) if ($massactionbutton || $massaction) // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined { $selected=0; - if (in_array($obj->projectid, $arrayofselected)) $selected=1; - print ''; + if (in_array($obj->id, $arrayofselected)) $selected=1; + print ''; } print ''; if (! $i) $totalarray['nbfield']++; @@ -871,7 +872,6 @@ while ($i < min($num,$limit)) } $i++; - } // Show total line diff --git a/htdocs/projet/tasks/list.php b/htdocs/projet/tasks/list.php index 1f2459e85db..4e31434dbc4 100644 --- a/htdocs/projet/tasks/list.php +++ b/htdocs/projet/tasks/list.php @@ -131,6 +131,8 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab } } +$object = new Task($db); + /* * Actions @@ -190,11 +192,11 @@ if (empty($search_projectstatus) && $search_projectstatus == '') $search_project * View */ +$now = dol_now(); $form=new Form($db); $formother=new FormOther($db); $socstatic=new Societe($db); $projectstatic = new Project($db); -$taskstatic = new Task($db); $puser=new User($db); $tuser=new User($db); if ($search_project_user > 0) $puser->fetch($search_project_user); @@ -231,7 +233,7 @@ if (count($listofprojectcontacttype) == 0) $listofprojectcontacttype[0]='0'; // Get id of types of contacts for tasks (This list never contains a lot of elements) $listoftaskcontacttype=array(); $sql = "SELECT ctc.rowid, ctc.code FROM ".MAIN_DB_PREFIX."c_type_contact as ctc"; -$sql.= " WHERE ctc.element = '" . $taskstatic->element . "'"; +$sql.= " WHERE ctc.element = '" . $object->element . "'"; $sql.= " AND ctc.source = 'internal'"; $resql = $db->query($sql); if ($resql) @@ -549,7 +551,7 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab $align=$extrafields->getAlignFlag($key); $typeofextrafield=$extrafields->attribute_type[$key]; print ''; if (! $i) $totalarray['nbfield']++; } @@ -665,7 +668,7 @@ while ($i < min($num,$limit)) if (! empty($arrayfields['t.label']['checked'])) { print ''; if (! $i) $totalarray['nbfield']++; } diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 995c16719cb..ebd06dbd5c4 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -389,8 +389,6 @@ class Societe extends CommonObject $this->forme_juridique_code = 0; $this->tva_assuj = 1; $this->status = 1; - - return 1; } diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index 48e1b67a69c..51d4b41e6bb 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -831,7 +831,7 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab $align=$extrafields->getAlignFlag($key); $typeofextrafield=$extrafields->attribute_type[$key]; print ''; - + print ''; - + print ''; - + // Colonne choix du compte print ''; - + print ''; - + print ''; - + // Colonne choix ligne a ventiler - $checked = ('label' == 'O') ? ' checked' : ''; - + print ''; - + print ''; $i ++; } diff --git a/htdocs/accountancy/class/html.formventilation.class.php b/htdocs/accountancy/class/html.formventilation.class.php index 112bde76038..d7a827f2480 100644 --- a/htdocs/accountancy/class/html.formventilation.class.php +++ b/htdocs/accountancy/class/html.formventilation.class.php @@ -151,97 +151,6 @@ class FormVentilation extends Form return $out; } - /** - * Return list of accounts with label by class of accounts - * - * @param string $selectid Preselected pcg_type - * @param string $htmlname Name of field in html form - * @param int $showempty Add an empty field - * @param array $event Event options - * - * @return string String with HTML select - */ - function select_pcgtype($selectid, $htmlname = 'pcg_type', $showempty = 0, $event = array()) { - global $conf; - - $sql = "SELECT DISTINCT pcg_type "; - $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_account as aa"; - $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "accounting_system as asy ON aa.fk_pcg_version = asy.pcg_version"; - $sql .= " AND asy.rowid = " . $conf->global->CHARTOFACCOUNTS; - $sql .= " ORDER BY pcg_type"; - - dol_syslog(get_class($this) . "::select_pcgtype", LOG_DEBUG); - $resql = $this->db->query($sql); - - if (!$resql) { - $this->error = "Error ".$this->db->lasterror(); - dol_syslog(get_class($this)."::select_pcgtype ".$this->error, LOG_ERR); - return -1; - } - - $options = array(); - $out = ajax_combobox($htmlname, $event); - - while ($obj = $this->db->fetch_object($resql)) - { - if ($obj->pcg_type != '-1') - { - $options[$obj->pcg_type] = $obj->pcg_type; - } - } - - $out .= Form::selectarray($htmlname, $options, $selectid, $showempty, 0, 0, '', 0, 0, 0, '', 'minwidth200'); - - $this->db->free($resql); - return $out; - } - - /** - * Return list of accounts with label by sub_class of accounts - * - * @param string $selectid Preselected pcg_type - * @param string $htmlname Name of field in html form - * @param int $showempty Add an empty field - * @param array $event Event options - * - * @return string String with HTML select - */ - function select_pcgsubtype($selectid, $htmlname = 'pcg_subtype', $showempty = 0, $event = array()) - { - global $conf; - - $sql = "SELECT DISTINCT pcg_subtype "; - $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_account as aa"; - $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "accounting_system as asy ON aa.fk_pcg_version = asy.pcg_version"; - $sql .= " AND asy.rowid = " . $conf->global->CHARTOFACCOUNTS; - $sql .= " ORDER BY pcg_subtype"; - - dol_syslog(get_class($this) . "::select_pcgsubtype", LOG_DEBUG); - $resql = $this->db->query($sql); - - if (!$resql) { - $this->error = "Error ".$this->db->lasterror(); - dol_syslog(get_class($this)."::select_pcgsubtype ".$this->error, LOG_ERR); - return -1; - } - - $options = array(); - $out = ajax_combobox($htmlname, $event); - - while ($obj = $this->db->fetch_object($resql)) - { - if ($obj->pcg_type != '-1') - { - $options[$obj->pcg_subtype] = $obj->pcg_subtype; - } - } - - $out .= Form::selectarray($htmlname, $options, $selectid, $showempty, 0, 0, '', 0, 0, 0, '', 'minwidth200'); - - $this->db->free($resql); - return $out; - } - /** * Return list of auxilary thirdparty accounts * From 1f079fac9d92bd8baabad8a947f849c6acc36c4e Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Thu, 25 May 2017 06:57:28 +0200 Subject: [PATCH 255/299] Move html.formventilation.class.php to html.formaccounting.class.php --- htdocs/accountancy/admin/account.php | 1 - htdocs/accountancy/admin/accountmodel.php | 8 +- htdocs/accountancy/admin/card.php | 6 +- htdocs/accountancy/admin/categories_list.php | 6 +- htdocs/accountancy/admin/defaultaccounts.php | 6 +- htdocs/accountancy/admin/importaccounts.php | 33 +- htdocs/accountancy/admin/index.php | 15 +- htdocs/accountancy/admin/productaccount.php | 4 +- htdocs/accountancy/bookkeeping/balance.php | 8 +- htdocs/accountancy/bookkeeping/card.php | 12 +- htdocs/accountancy/bookkeeping/list.php | 18 +- .../accountancy/bookkeeping/listbyaccount.php | 6 +- htdocs/accountancy/bookkeeping/listbyyear.php | 12 +- .../class/html.formventilation.class.php | 292 ------------------ htdocs/accountancy/customer/card.php | 38 ++- htdocs/accountancy/customer/lines.php | 34 +- htdocs/accountancy/customer/list.php | 43 ++- htdocs/accountancy/expensereport/card.php | 6 +- htdocs/accountancy/expensereport/lines.php | 6 +- htdocs/accountancy/expensereport/list.php | 6 +- htdocs/accountancy/supplier/card.php | 36 +-- htdocs/accountancy/supplier/lines.php | 10 +- htdocs/accountancy/supplier/list.php | 39 ++- htdocs/admin/dict.php | 6 +- htdocs/admin/loan.php | 8 +- htdocs/admin/mails_templates.php | 4 +- htdocs/admin/salaries.php | 6 +- htdocs/admin/taxes.php | 6 +- htdocs/compta/bank/card.php | 31 +- htdocs/compta/bank/various_payment/card.php | 8 +- .../core/class/html.formaccounting.class.php | 264 +++++++++++++++- htdocs/don/admin/donation.php | 18 +- htdocs/loan/card.php | 18 +- htdocs/product/card.php | 14 +- 34 files changed, 490 insertions(+), 538 deletions(-) delete mode 100644 htdocs/accountancy/class/html.formventilation.class.php diff --git a/htdocs/accountancy/admin/account.php b/htdocs/accountancy/admin/account.php index d3556135972..62e35fa0f57 100644 --- a/htdocs/accountancy/admin/account.php +++ b/htdocs/accountancy/admin/account.php @@ -27,7 +27,6 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingaccount.class.php'; -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; // Langs $langs->load("compta"); diff --git a/htdocs/accountancy/admin/accountmodel.php b/htdocs/accountancy/admin/accountmodel.php index 55c194cd416..ca26c35c442 100644 --- a/htdocs/accountancy/admin/accountmodel.php +++ b/htdocs/accountancy/admin/accountmodel.php @@ -39,7 +39,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; -if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; $langs->load("errors"); $langs->load("admin"); @@ -1258,8 +1258,8 @@ function fieldListAccountModel($fieldlist, $obj='', $tabname='', $context='') $formadmin = new FormAdmin($db); $formcompany = new FormCompany($db); - $formaccountancy = new FormVentilation($db); - + $formaccounting = new FormAccounting($db); + foreach ($fieldlist as $field => $value) { if ($fieldlist[$field] == 'country') @@ -1400,7 +1400,7 @@ function fieldListAccountModel($fieldlist, $obj='', $tabname='', $context='') if (! empty($conf->accounting->enabled)) { $accountancy_account = (! empty($obj->$fieldlist[$field]) ? $obj->$fieldlist[$field] : 0); - print $formaccountancy->select_account($accountancy_account, $fieldlist[$field], 1, '', 1, 1, 'maxwidth200 maxwidthonsmartphone'); + print $formaccounting->select_account($accountancy_account, $fieldlist[$field], 1, '', 1, 1, 'maxwidth200 maxwidthonsmartphone'); } else { diff --git a/htdocs/accountancy/admin/card.php b/htdocs/accountancy/admin/card.php index b23f5cb5421..73e3fdf6dd9 100644 --- a/htdocs/accountancy/admin/card.php +++ b/htdocs/accountancy/admin/card.php @@ -27,7 +27,6 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingaccount.class.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountancysystem.class.php'; -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; $error = 0; @@ -196,7 +195,6 @@ $helpurl = ''; llxheader('', $title, $helpurl); $form = new Form($db); -$htmlacc = new FormVentilation($db); $formaccounting = new FormAccounting($db); $accountsystem = new AccountancySystem($db); @@ -231,7 +229,7 @@ if ($action == 'create') { // Account parent print ''; print ''; // Category @@ -295,7 +293,7 @@ if ($action == 'create') { // Account parent print ''; print ''; // Category diff --git a/htdocs/accountancy/admin/categories_list.php b/htdocs/accountancy/admin/categories_list.php index c0fa895ae4c..f3a35350084 100644 --- a/htdocs/accountancy/admin/categories_list.php +++ b/htdocs/accountancy/admin/categories_list.php @@ -39,7 +39,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; -require_once DOL_DOCUMENT_ROOT.'/accountancy/class/html.formventilation.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php'; $langs->load("errors"); $langs->load("admin"); @@ -982,7 +982,7 @@ function fieldListAccountingCategories($fieldlist, $obj='', $tabname='', $contex $formadmin = new FormAdmin($db); $formcompany = new FormCompany($db); - if (! empty($conf->accounting->enabled)) $formaccountancy = new FormVentilation($db); + if (! empty($conf->accounting->enabled)) $formaccounting = new FormAccounting($db); foreach ($fieldlist as $field => $value) { @@ -1125,7 +1125,7 @@ function fieldListAccountingCategories($fieldlist, $obj='', $tabname='', $contex { $fieldname = $fieldlist[$field]; $accountancy_account = (! empty($obj->$fieldname) ? $obj->$fieldname : 0); - print $formaccountancy->select_account($accountancy_account, $fieldlist[$field], 1, '', 1, 1, 'maxwidth200 maxwidthonsmartphone'); + print $formaccounting->select_account($accountancy_account, $fieldlist[$field], 1, '', 1, 1, 'maxwidth200 maxwidthonsmartphone'); } else { diff --git a/htdocs/accountancy/admin/defaultaccounts.php b/htdocs/accountancy/admin/defaultaccounts.php index 4b733bee5a6..c2a6453ffee 100644 --- a/htdocs/accountancy/admin/defaultaccounts.php +++ b/htdocs/accountancy/admin/defaultaccounts.php @@ -32,7 +32,7 @@ require '../../main.inc.php'; // Class require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; $langs->load("compta"); $langs->load("bills"); @@ -117,7 +117,7 @@ if ($action == 'update') { llxHeader(); $form = new Form($db); -$formaccountancy = new FormVentilation($db); +$formaccounting = new FormAccounting($db); $linkback = ''; print load_fiche_titre($langs->trans('MenuDefaultAccounts'), $linkback, 'title_accountancy'); @@ -142,7 +142,7 @@ foreach ( $list_account as $key ) { print ''; // Value print ''; print ''; } diff --git a/htdocs/accountancy/admin/importaccounts.php b/htdocs/accountancy/admin/importaccounts.php index f4f155c0b59..1bb1bf178b3 100644 --- a/htdocs/accountancy/admin/importaccounts.php +++ b/htdocs/accountancy/admin/importaccounts.php @@ -1,8 +1,7 @@ - * Copyright (C) 2013-2014 Alexandre Spangaro - * Copyright (C) 2014 Florian Henry +/* Copyright (C) 2013-2014 Olivier Geffroy + * Copyright (C) 2013-2017 Alexandre Spangaro + * Copyright (C) 2014 Florian Henry * * 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 @@ -28,7 +27,7 @@ require '../../main.inc.php'; // Class require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingaccount.class.php'; -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; // langs $langs->load("compta"); @@ -65,22 +64,22 @@ if ($_POST["action"] == 'import') { if (is_array($to_import) && count($to_import) > 0) { print '
        ' . count($to_import) . ' ' . $langs->trans("SelectedLines") . '
        '; $sql = 'SELECT pcg_version FROM ' . MAIN_DB_PREFIX . 'accounting_system WHERE rowid=' . $conf->global->CHARTOFACCOUNTS; - + $result = $db->query($sql); if ($result && ($db->num_rows($result) > 0)) { - + $obj = $db->fetch_object($result); - + $cpt = 0; foreach ( $to_import as $maLigneCochee ) { - + $accounting = new AccountingAccount($db); - + $monLabel = GETPOST('label' . $maLigneCochee); $monParentAccount = GETPOST('AccountParent' . $maLigneCochee); $monType = GETPOST('pcgType' . $maLigneCochee); $monSubType = GETPOST('pcgSubType' . $maLigneCochee); - + $accounting->fk_pcg_version = $obj->pcg_version; $accounting->account_number = $maLigneCochee; $accounting->label = $monLabel; @@ -126,10 +125,10 @@ if ($result) { $num_lines = $db->num_rows($result); $i = 0; print_barre_liste($langs->trans("ImportAccount"), $page, $_SERVER["PHP_SELF"], "", $sortfield, $sortorder, '', $num_lines); - + print '
        ' . "\n"; print ''; - + print '
        '.$langs->trans("Position").''.$langs->trans("Position"); +print ''; +print ''.$langs->trans("Label").''.$langs->trans("AttributeCode").''.$langs->trans("Type").''.$langs->trans("Size").''.$langs->trans("Unique").''.$langs->trans("ComputedFormula").''.$langs->trans("Required").''.$langs->trans("AlwaysEditable").''.$langs->trans("Hidden").'".$type2label[$extrafields->attribute_type[$key]]."'.$extrafields->attribute_size[$key]."'.yn($extrafields->attribute_unique[$key])."'.dol_trunc($extrafields->attribute_computed[$key], 20)."'.yn($extrafields->attribute_required[$key])."'.yn($extrafields->attribute_alwayseditable[$key])."'.yn($extrafields->attribute_hidden[$key])."'; - if (in_array($typeofextrafield, array('varchar', 'int', 'double', 'select'))) + if (in_array($typeofextrafield, array('varchar', 'int', 'double', 'select')) && empty($extrafields->attribute_computed[$key])) { $crit=$val; $tmpkey=preg_replace('/search_options_/','',$key); @@ -427,6 +423,14 @@ print '
        '; - if (in_array($typeofextrafield, array('varchar', 'int', 'double', 'select'))) + if (in_array($typeofextrafield, array('varchar', 'int', 'double', 'select')) && empty($extrafields->attribute_computed[$key])) { $crit=$val; $tmpkey=preg_replace('/search_options_/','',$key); @@ -599,7 +599,7 @@ if (! empty($arrayfields['p.fk_statut']['checked'])) { print ''; $arrayofstatus = array(); - foreach($projectstatic->statuts_short as $key => $val) $arrayofstatus[$key]=$langs->trans($val); + foreach($object->statuts_short as $key => $val) $arrayofstatus[$key]=$langs->trans($val); $arrayofstatus['99']=$langs->trans("NotClosed").' ('.$langs->trans('Draft').'+'.$langs->trans('Opened').')'; print $form->selectarray('search_status', $arrayofstatus, $search_status, 1, 0, 0, '', 0, 0, 0, '', 'maxwidth100'); print '
        '; - print $projectstatic->getNomUrl(1); - if ($projectstatic->hasDelay()) print img_warning($langs->trans('Late')); + print $object->getNomUrl(1); + if ($object->hasDelay()) print img_warning($langs->trans('Late')); print ''.$projectstatic->getLibStatut(5).''.$object->getLibStatut(5).''; - if (in_array($typeofextrafield, array('varchar', 'int', 'double', 'select'))) + if (in_array($typeofextrafield, array('varchar', 'int', 'double', 'select')) && empty($extrafields->attribute_computed[$key])) { $crit=$val; $tmpkey=preg_replace('/search_options_/','',$key); @@ -606,7 +608,9 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab if (! empty($arrayfields["ef.".$key]['checked'])) { $align=$extrafields->getAlignFlag($key); - print_liste_field_titre($langs->trans($extralabels[$key]),$_SERVER["PHP_SELF"],"ef.".$key,"",$param,($align?'align="'.$align.'"':''),$sortfield,$sortorder); + $sortonfield = "ef.".$key; + if (! empty($extrafields->attribute_computed[$key])) $sortonfield=''; + print_liste_field_titre($langs->trans($extralabels[$key]),$_SERVER["PHP_SELF"],$sortonfield,"",$param,($align?'align="'.$align.'"':''),$sortfield,$sortorder); } } } @@ -624,14 +628,21 @@ $plannedworkloadoutputformat='allhourmin'; $timespentoutputformat='allhourmin'; if (! empty($conf->global->PROJECT_PLANNED_WORKLOAD_FORMAT)) $plannedworkloadoutputformat=$conf->global->PROJECT_PLANNED_WORKLOAD_FORMAT; if (! empty($conf->global->PROJECT_TIMES_SPENT_FORMAT)) $timespentoutputformat=$conf->global->PROJECT_TIME_SPENT_FORMAT; - -$now = dol_now(); + $i=0; $totalarray=array(); while ($i < min($num,$limit)) { $obj = $db->fetch_object($resql); + $object->id = $obj->id; + $object->ref = $obj->ref; + $object->label = $obj->label; + $object->fk_statut = $obj->fk_statut; + $object->progress = $obj->progress; + $object->datee = $db->jdate($obj->date_end); // deprecated + $object->date_end = $db->jdate($obj->date_end); + $projectstatic->id = $obj->projectid; $projectstatic->ref = $obj->projectref; $projectstatic->title = $obj->projecttitle; @@ -639,14 +650,6 @@ while ($i < min($num,$limit)) $projectstatic->statut = $obj->projectstatus; $projectstatic->datee = $db->jdate($obj->projectdatee); - $taskstatic->id = $obj->id; - $taskstatic->ref = $obj->ref; - $taskstatic->label = $obj->label; - $taskstatic->fk_statut = $obj->fk_statut; - $taskstatic->progress = $obj->progress; - $taskstatic->datee = $db->jdate($obj->date_end); // deprecated - $taskstatic->date_end = $db->jdate($obj->date_end); - $userAccess = $projectstatic->restrictedProjectArea($user); // why this ? if ($userAccess >= 0) { @@ -656,8 +659,8 @@ while ($i < min($num,$limit)) if (! empty($arrayfields['t.ref']['checked'])) { print ''; - print $taskstatic->getNomUrl(1,'withproject'); - if ($taskstatic->hasDelay()) print img_warning("Late"); + print $object->getNomUrl(1,'withproject'); + if ($object->hasDelay()) print img_warning("Late"); print ''; - print $taskstatic->label; + print $object->label; print ''; - if (in_array($typeofextrafield, array('varchar', 'int', 'double', 'select'))) + if (in_array($typeofextrafield, array('varchar', 'int', 'double', 'select')) && empty($extrafields->attribute_computed[$key])) { $crit=$val; $tmpkey=preg_replace('/search_options_/','',$key); @@ -907,7 +907,9 @@ if (is_array($extrafields->attribute_label) && count($extrafields->attribute_lab if (! empty($arrayfields["ef.".$key]['checked'])) { $align=$extrafields->getAlignFlag($key); - print_liste_field_titre($langs->trans($extralabels[$key]),$_SERVER["PHP_SELF"],"ef.".$key,"",$param,($align?'align="'.$align.'"':''),$sortfield,$sortorder); + $sortonfield = "ef.".$key; + if (! empty($extrafields->attribute_computed[$key])) $sortonfield=''; + print_liste_field_titre($langs->trans($extralabels[$key]),$_SERVER["PHP_SELF"],$sortonfield,"",$param,($align?'align="'.$align.'"':''),$sortfield,$sortorder); } } } From ba7e75417409e7103fbc5c7cfb5c5f76c11d9b81 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Thu, 25 May 2017 05:32:13 +0200 Subject: [PATCH 253/299] Remove old code (journal) --- htdocs/accountancy/admin/journal.php | 207 ------------------------ htdocs/accountancy/bookkeeping/list.php | 1 - htdocs/core/lib/accounting.lib.php | 48 +----- 3 files changed, 7 insertions(+), 249 deletions(-) delete mode 100644 htdocs/accountancy/admin/journal.php diff --git a/htdocs/accountancy/admin/journal.php b/htdocs/accountancy/admin/journal.php deleted file mode 100644 index 8e19a3e3e87..00000000000 --- a/htdocs/accountancy/admin/journal.php +++ /dev/null @@ -1,207 +0,0 @@ - - * Copyright (C) 2013-2017 Alexandre Spangaro - * Copyright (C) 2014 Florian Henry - * Copyright (C) 2014 Marcos García - * Copyright (C) 2014 Juanjo Menent - * Copyright (C) 2015 Jean-François Ferry - * Copyright (C) 2016 Laurent Destailleur - * - * 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 3 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/accountancy/admin/journal.php -* \ingroup Advanced accountancy -* \brief Setup page to configure accounting expert module -*/ -require '../../main.inc.php'; - -// Class -require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php'; -require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; -require_once DOL_DOCUMENT_ROOT . '/core/lib/bank.lib.php'; -require_once DOL_DOCUMENT_ROOT . '/compta/bank/class/account.class.php'; - -$langs->load("compta"); -$langs->load("bills"); -$langs->load("admin"); -$langs->load("accountancy"); -$langs->load("salaries"); - -// Security check -if (empty($user->admin) || ! empty($user->rights->accountancy->chartofaccount)) -{ - accessforbidden(); -} - -$action = GETPOST('action', 'alpha'); - -// Other parameters ACCOUNTING_* -$list = array ( - 'ACCOUNTING_SELL_JOURNAL', - 'ACCOUNTING_PURCHASE_JOURNAL', - 'ACCOUNTING_SOCIAL_JOURNAL', - 'ACCOUNTING_MISCELLANEOUS_JOURNAL', - 'ACCOUNTING_EXPENSEREPORT_JOURNAL' -); - -/* - * Actions -*/ - -if ($action == 'update') { - $error = 0; - - // Save vars - foreach ($list as $constname) - { - $constvalue = GETPOST($constname, 'alpha'); - - if (! dolibarr_set_const($db, $constname, $constvalue, 'chaine', 0, '', $conf->entity)) { - $error ++; - } - } - - // Save bank account journals - $arrayofbankaccount = GETPOST('bank_account', 'array'); - foreach($arrayofbankaccount as $key => $code) - { - $bankaccount = new Account($db); - $res = $bankaccount->fetch($key); - if ($res > 0) - { - $bankaccount->accountancy_journal = $code; - $bankaccount->update($user); - } - else - { - $error++; - break; - } - } - - if (! $error) { - setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); - } else { - setEventMessages($langs->trans("Error"), null, 'errors'); - } -} - -/* - * View -*/ - -llxHeader(); - -$form = new Form($db); - -$linkback = '' . $langs->trans("BackToModuleList") . ''; -print load_fiche_titre($langs->trans('ConfigAccountingExpert'), $linkback, 'title_setup'); - -$head = admin_accounting_prepare_head(null); - -print '
        '; -print ''; -print ''; - -dol_fiche_head($head, 'journal', $langs->trans("Configuration"), 0, 'cron'); - -print ''; -print ''; -print ''; -print "\n"; - -foreach ( $list as $key ) { - - print ''; - - // Param - $label = $langs->trans($key); - print ''; - - // Value - print ''; -} - -print "
        ' . $langs->trans('Journaux') . '
        '; - print ''; - print '
        \n"; - -print '
        '; - -print ''; -print ''; -print ''; -print "\n"; - -// Bank account -$sql = "SELECT rowid, ref, label, number, account_number, accountancy_journal"; -$sql .= " FROM " . MAIN_DB_PREFIX . "bank_account"; -$sql .= " WHERE entity = " . $conf->entity; -$sql .= " AND clos = 0"; -$sql .= " ORDER BY label"; - -$resql = $db->query($sql); -if ($resql) { - $numr = $db->num_rows($resql); - $i = 0; - - if ($numr > 0) - - $bankaccountstatic = new Account($db); - - while ( $i < $numr ) { - $objp = $db->fetch_object($resql); - - $bankaccountstatic->rowid = $objp->rowid; - $bankaccountstatic->id = $objp->rowid; - $bankaccountstatic->ref = $objp->ref; - $bankaccountstatic->label = $objp->label; - $bankaccountstatic->number = $objp->number; - $bankaccountstatic->account_number = $objp->account_number; - $bankaccountstatic->accountancy_journal = $objp->accountancy_journal; - - print ''; - - // Param - print ''; - - // Value - print ''; - - $i ++; - } - $db->free($resql); -} -else -{ - dol_print_error($db); -} - -print "
        ' . $langs->trans('JournalFinancial') . ' ('.$langs->trans('Opened').')
        '; - print ''; - print '
        \n"; - -dol_fiche_end(); - -print '
        '; - -print '
        '; - -llxFooter(); -$db->close(); \ No newline at end of file diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index 0c49ac0e1ba..72385bab746 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -292,7 +292,6 @@ $title_page = $langs->trans("Bookkeeping"); llxHeader('', $title_page); // List - $nbtotalofrecords = ''; if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { $nbtotalofrecords = $object->fetchAll($sortorder, $sortfield, 0, 0, $filter); diff --git a/htdocs/core/lib/accounting.lib.php b/htdocs/core/lib/accounting.lib.php index c8863ce8f61..7952c0eda7d 100644 --- a/htdocs/core/lib/accounting.lib.php +++ b/htdocs/core/lib/accounting.lib.php @@ -1,7 +1,7 @@ * Copyright (C) 2013-2017 Alexandre Spangaro - * Copyright (C) 2014 Florian Henry + * Copyright (C) 2014 Florian Henry * * 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 @@ -27,7 +27,7 @@ * Prepare array with list of admin tabs * * @param AccountingAccount $object Object instance we show card - * @return array Array of tabs to show + * @return array Array of tabs to show */ function admin_accounting_prepare_head(AccountingAccount $object=null) { @@ -41,11 +41,6 @@ function admin_accounting_prepare_head(AccountingAccount $object=null) $head[$h][2] = 'general'; $h ++; - $head[$h][0] = DOL_URL_ROOT.'/accountancy/admin/journals.php'; - $head[$h][1] = $langs->trans("Journaux"); - $head[$h][2] = 'journal'; - $h ++; - $head[$h][0] = DOL_URL_ROOT.'/accountancy/admin/export.php'; $head[$h][1] = $langs->trans("ExportOptions"); $head[$h][2] = 'export'; @@ -91,35 +86,6 @@ function accounting_prepare_head(AccountingAccount $object) return $head; } -/** - * Prepare array with list of tabs - * - * @param AccountingAccount $object Accounting account - * @return array Array of tabs to show - */ -function accounting_journal_prepare_head(AccountingJournal $object) -{ - global $langs, $conf; - - $h = 0; - $head = array (); - - $head[$h][0] = DOL_URL_ROOT.'/accountancy/admin/journals_card.php?id=' . $object->id; - $head[$h][1] = $langs->trans("Card"); - $head[$h][2] = 'card'; - $h ++; - - // Show more tabs from modules - // Entries must be declared in modules descriptor with line - // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab - // $this->tabs = array('entity:-tabname); to remove a tab - complete_head_from_modules($conf, $langs, $object, $head, $h, 'accounting_journal'); - - complete_head_from_modules($conf, $langs, $object, $head, $h, 'accounting_journal', 'remove'); - - return $head; -} - /** * Return accounting account without zero on the right * @@ -129,7 +95,7 @@ function accounting_journal_prepare_head(AccountingJournal $object) function clean_account($account) { $account = rtrim($account,"0"); - + return $account; } @@ -144,9 +110,9 @@ function length_accountg($account) global $conf; if ($account < 0 || empty($account)) return ''; - + if (! empty($conf->global->ACCOUNTING_MANAGE_ZERO)) return $account; - + $g = $conf->global->ACCOUNTING_LENGTH_GACCOUNT; if (! empty($g)) { // Clean parameters @@ -179,9 +145,9 @@ function length_accounta($accounta) global $conf, $langs; if ($accounta < 0 || empty($accounta)) return ''; - + if (! empty($conf->global->ACCOUNTING_MANAGE_ZERO)) return $accounta; - + $a = $conf->global->ACCOUNTING_LENGTH_AACCOUNT; if (! empty($a)) { // Clean parameters From a086b82f84b477ec01ce4f67884808fc911104e6 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Thu, 25 May 2017 05:40:41 +0200 Subject: [PATCH 254/299] Removed old code (Function select_pcgtype/subtype) --- htdocs/accountancy/admin/card.php | 93 +++++++++---------- htdocs/accountancy/admin/importaccounts.php | 21 ++--- .../class/html.formventilation.class.php | 91 ------------------ 3 files changed, 53 insertions(+), 152 deletions(-) diff --git a/htdocs/accountancy/admin/card.php b/htdocs/accountancy/admin/card.php index 3522460e07b..b23f5cb5421 100644 --- a/htdocs/accountancy/admin/card.php +++ b/htdocs/accountancy/admin/card.php @@ -1,7 +1,7 @@ - * Copyright (C) 2013-2016 Alexandre Spangaro - * Copyright (C) 2014 Florian Henry + * Copyright (C) 2013-2017 Alexandre Spangaro + * Copyright (C) 2014 Florian Henry * * 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 @@ -19,7 +19,7 @@ /** * \file htdocs/accountancy/admin/card.php - * \ingroup Advanced accountancy + * \ingroup Advanced accountancy * \brief Card of accounting account */ @@ -59,7 +59,7 @@ if (GETPOST('cancel')) header("Location: ".$urltogo); exit; } - + if ($action == 'add' && $user->rights->accounting->chartofaccount) { if (! $cancel) { @@ -86,7 +86,7 @@ if ($action == 'add' && $user->rights->accounting->chartofaccount) } else { $account_parent = GETPOST('account_parent','int'); } - + $object->fk_pcg_version = $obj->pcg_version; $object->pcg_type = GETPOST('pcg_type'); $object->pcg_subtype = GETPOST('pcg_subtype'); @@ -95,7 +95,7 @@ if ($action == 'add' && $user->rights->accounting->chartofaccount) $object->account_category = GETPOST('account_category'); $object->label = GETPOST('label', 'alpha'); $object->active = 1; - + $res = $object->create($user); if ($res == - 3) { $error = 1; @@ -124,9 +124,9 @@ if ($action == 'add' && $user->rights->accounting->chartofaccount) } else if ($action == 'edit' && $user->rights->accounting->chartofaccount) { if (! $cancel) { $result = $object->fetch($id); - + $sql = 'SELECT pcg_version FROM ' . MAIN_DB_PREFIX . 'accounting_system WHERE rowid=' . $conf->global->CHARTOFACCOUNTS; - + dol_syslog('accountancy/admin/card.php:: $sql=' . $sql); $result2 = $db->query($sql); $obj = $db->fetch_object($result2); @@ -156,9 +156,9 @@ if ($action == 'add' && $user->rights->accounting->chartofaccount) $object->account_parent = $account_parent; $object->account_category = GETPOST('account_category'); $object->label = GETPOST('label', 'alpha'); - + $result = $object->update($user); - + if ($result > 0) { $urltogo=$backtopage?$backtopage:($_SERVER["PHP_SELF"]."?id=".$id); header("Location: " . $urltogo); @@ -205,13 +205,13 @@ $accountsystem->fetch($conf->global->CHARTOFACCOUNTS); // Create mode if ($action == 'create') { print load_fiche_titre($langs->trans('NewAccountingAccount')); - + print '
        ' . "\n"; print ''; print ''; - + dol_fiche_head(); - + print ''; // Chart of account @@ -219,8 +219,7 @@ if ($action == 'create') { print ''; - - + // Account number print ''; print ''; @@ -245,56 +244,54 @@ if ($action == 'create') { print ''; print ''; // Chart of acounts subtype print ''; print ''; - + print '
        '; print $accountsystem->ref; print '
        ' . $langs->trans("AccountNumber") . '
        ' . $langs->trans("Pcgtype") . ''; print ''; - //print $htmlacc->select_pcgtype($object->pcg_type, 'pcg_type', 1); print '
        ' . $langs->trans("Pcgsubtype") . ''; print ''; - //print $htmlacc->select_pcgsubtype($object->pcg_subtype, 'pcg_subtype', 1); print '
        '; - + dol_fiche_end(); - + print '
        '; print ''; print '     '; print ''; print '
        '; - + print '
        '; } else if ($id) { $result = $object->fetch($id); - + if ($result > 0) { dol_htmloutput_mesg($mesg); - + $head = accounting_prepare_head($object); - + // Edit mode if ($action == 'update') { dol_fiche_head($head, 'card', $langs->trans('AccountAccounting'), 0, 'billr'); - + print '
        ' . "\n"; print ''; print ''; print ''; print ''; - + print ''; - + // Account number print ''; print ''; - + // Label print ''; print ''; - + // Account parent print ''; print ''; // Category - print ''; + print ''; print ''; + $formaccounting->select_accounting_category($object->account_category, 'account_category', 1); + print ''; // Chart of accounts type print ''; print ''; @@ -318,29 +314,27 @@ if ($action == 'create') { print ''; print ''; - + print '
        ' . $langs->trans("AccountNumber") . '
        ' . $langs->trans("Label") . '
        ' . $langs->trans("Accountparent") . ''; @@ -302,15 +299,14 @@ if ($action == 'create') { print '
        '.$langs->trans("AccountingCategory").'
        '.$langs->trans("AccountingCategory").''; - $formaccounting->select_accounting_category($object->account_category, 'account_category', 1); - print '
        ' . $langs->trans("Pcgtype") . ''; - //print $htmlacc->select_pcgtype($object->pcg_type, 'pcg_type', 1); print ''; print '
        ' . $langs->trans("Pcgsubtype") . ''; print ''; - //print $htmlacc->select_pcgsubtype($object->pcg_subtype, 'pcg_subtype', 1); print '
        '; - + dol_fiche_end(); - + print '
        '; print ''; print '     '; print ''; print '
        '; - + print '
        '; } else { - // View mode $linkback = '' . $langs->trans("BackToChartofaccounts") . ''; - + dol_fiche_head($head, 'card', $langs->trans('AccountAccounting'), 0, 'billr'); - + print ''; - + // Account number print ''; print ''; @@ -378,31 +372,30 @@ if ($action == 'create') { } else { print img_picto($langs->trans("Activated"), 'switch_on'); }*/ - + print ''; - + print '
        ' . $langs->trans("AccountNumber") . '' . $object->account_number . '
        '; - + dol_fiche_end(); - + /* * Actions buttons */ - print '
        '; - + if (! empty($user->rights->accounting->chartofaccount)) { print '' . $langs->trans('Modify') . ''; } else { print '' . $langs->trans('Modify') . ''; } - + if (! empty($user->rights->accounting->chartofaccount)) { print '' . $langs->trans('Delete') . ''; } else { print '' . $langs->trans('Delete') . ''; } - + print '
        '; } } else { diff --git a/htdocs/accountancy/admin/importaccounts.php b/htdocs/accountancy/admin/importaccounts.php index 4a6c82cb581..f4f155c0b59 100644 --- a/htdocs/accountancy/admin/importaccounts.php +++ b/htdocs/accountancy/admin/importaccounts.php @@ -146,36 +146,35 @@ if ($result) { while ( $i < min($num_lines, $limit) ) { $objp = $db->fetch_object($result); print '
        '; print $objp->accounting; print ''; print ''; print ''; print $htmlacc->select_account($accounting->account_parent, 'AccountParent'); print ''; - print $htmlacc->select_pcgtype($accounting->pcg_type, 'pcgType'); + print ''; print ''; - print $htmlacc->select_pcgsubtype($accounting->pcg_subtype, 'pcgSubType'); + print ''; print ''; print ''; print '
        ' . $langs->trans("Accountparent") . ''; - print $htmlacc->select_account($object->account_parent, 'account_parent', 1, null, 0, 0, 'minwidth200'); + print $formaccounting->select_account($object->account_parent, 'account_parent', 1, null, 0, 0, 'minwidth200'); print '
        ' . $langs->trans("Accountparent") . ''; - print $htmlacc->select_account($object->account_parent, 'account_parent', 1); + print $formaccounting->select_account($object->account_parent, 'account_parent', 1); print '
        ' . $label . ''; // Do not force align=right, or it align also the content of the select box - print $formaccountancy->select_account($conf->global->$key, $key, 1, '', 1, 1); + print $formaccounting->select_account($conf->global->$key, $key, 1, '', 1, 1); print '
        '; print ''; print ''; @@ -138,10 +137,10 @@ if ($result) { print ''; print ''; print ''; - + $form = new Form($db); - $htmlacc = new FormVentilation($db); - + $formaccounting = new FormAccounting($db); + $var = true; while ( $i < min($num_lines, $limit) ) { $objp = $db->fetch_object($result); @@ -157,7 +156,7 @@ if ($result) { // Colonne choix du compte print ''; print ''; print ''; print ''; print ''; print ''; print ''; @@ -433,10 +431,10 @@ if ($action == 'create') { if ($action == "" || $action == 'add') { print ''; print ''; print ''; print ''; print ''; diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index 72385bab746..a955d671475 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -28,10 +28,10 @@ require '../../main.inc.php'; // Class require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/bookkeeping.class.php'; -require_once DOL_DOCUMENT_ROOT . '/core/class/html.formother.class.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingjournal.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formother.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; // Langs $langs->load("accountancy"); @@ -94,7 +94,7 @@ if ($sortfield == "") $sortfield = "t.rowid"; $object = new BookKeeping($db); -$formventilation = new FormVentilation($db); +$formaccounting = new FormAccounting($db); $formother = new FormOther($db); $form = new Form($db); @@ -321,8 +321,8 @@ if ($action == 'delbookkeepingyear') { if (empty($delyear)) { $delyear = dol_print_date(dol_now(), '%Y'); } - $year_array = $formventilation->selectyear_accountancy_bookkepping($delyear, 'delyear', 0, 'array'); - $journal_array = $formventilation->selectjournal_accountancy_bookkepping($deljournal, 'deljournal', 0, 'array'); + $year_array = $formaccounting->selectyear_accountancy_bookkepping($delyear, 'delyear', 0, 'array'); + $journal_array = $formaccounting->selectjournal_accountancy_bookkepping($deljournal, 'deljournal', 0, 'array'); $form_question['delyear'] = array ( 'name' => 'delyear', @@ -385,17 +385,17 @@ print ''; print ''; print ''; print ''; print ''; print ''; print '
        ' . $langs->trans("AccountAccouting") . '' . $langs->trans("label") . '' . $langs->trans("Pcgsubtype") . '' . $langs->trans("Import") . '
        '; - print $htmlacc->select_account($accounting->account_parent, 'AccountParent'); + print $formaccounting->select_account($accounting->account_parent, 'AccountParent'); print ''; diff --git a/htdocs/accountancy/admin/index.php b/htdocs/accountancy/admin/index.php index 899aaa1a3d2..0e1f67a0e61 100644 --- a/htdocs/accountancy/admin/index.php +++ b/htdocs/accountancy/admin/index.php @@ -1,11 +1,11 @@ - * Copyright (C) 2013-2014 Florian Henry - * Copyright (C) 2013-2017 Alexandre Spangaro - * Copyright (C) 2014-2015 Ari Elbaz (elarifr) +/* Copyright (C) 2013-2014 Olivier Geffroy + * Copyright (C) 2013-2014 Florian Henry + * Copyright (C) 2013-2017 Alexandre Spangaro + * Copyright (C) 2014-2015 Ari Elbaz (elarifr) * Copyright (C) 2014 Marcos García - * Copyright (C) 2014 Juanjo Menent - * Copyright (C) 2015 Jean-François Ferry + * Copyright (C) 2014 Juanjo Menent + * Copyright (C) 2015 Jean-François Ferry * * 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 @@ -31,8 +31,6 @@ require '../../main.inc.php'; // Class require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php'; -require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; $langs->load("compta"); $langs->load("bills"); @@ -160,7 +158,6 @@ if ($action == 'setdisabledirectinput') { llxHeader(); $form = new Form($db); -$formaccountancy = new FormVentilation($db); $linkback = '' . $langs->trans("BackToModuleList") . ''; print load_fiche_titre($langs->trans('ConfigAccountingExpert'), $linkback, 'title_setup'); diff --git a/htdocs/accountancy/admin/productaccount.php b/htdocs/accountancy/admin/productaccount.php index 359a8b40c12..fcb44c6f858 100644 --- a/htdocs/accountancy/admin/productaccount.php +++ b/htdocs/accountancy/admin/productaccount.php @@ -31,7 +31,7 @@ require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/report.lib.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php'; -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingaccount.class.php'; require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php'; @@ -184,7 +184,7 @@ if ($action == 'update') { * View */ -$form = new FormVentilation($db); +$form = new FormAccounting($db); // Defaut AccountingAccount RowId Product / Service // at this time ACCOUNTING_SERVICE_SOLD_ACCOUNT & ACCOUNTING_PRODUCT_SOLD_ACCOUNT are account number not accountingacount rowid diff --git a/htdocs/accountancy/bookkeeping/balance.php b/htdocs/accountancy/bookkeeping/balance.php index 9e5be25eb73..3111707cff6 100644 --- a/htdocs/accountancy/bookkeeping/balance.php +++ b/htdocs/accountancy/bookkeeping/balance.php @@ -28,8 +28,8 @@ require '../../main.inc.php'; // Class require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/bookkeeping.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/class/html.formother.class.php'; // Langs @@ -61,7 +61,7 @@ $offset = $limit * $page; $object = new BookKeeping($db); -$formventilation = new FormVentilation($db); +$formaccounting = new FormAccounting($db); $formother = new FormOther($db); $form = new Form($db); @@ -186,10 +186,10 @@ else { print '
        '; print $langs->trans('From'); - print $formventilation->select_account($search_accountancy_code_start, 'search_accountancy_code_start', 1, array(), 1, 1, ''); + print $formaccounting->select_account($search_accountancy_code_start, 'search_accountancy_code_start', 1, array(), 1, 1, ''); print ' '; print $langs->trans('to'); - print $formventilation->select_account($search_accountancy_code_end, 'search_accountancy_code_end', 1, array(), 1, 1, ''); + print $formaccounting->select_account($search_accountancy_code_end, 'search_accountancy_code_end', 1, array(), 1, 1, ''); print ''; $searchpicto=$form->showFilterAndCheckAddButtons(0); diff --git a/htdocs/accountancy/bookkeeping/card.php b/htdocs/accountancy/bookkeeping/card.php index 7ee3e6bb4fe..4443fb959b2 100644 --- a/htdocs/accountancy/bookkeeping/card.php +++ b/htdocs/accountancy/bookkeeping/card.php @@ -27,9 +27,8 @@ require '../../main.inc.php'; // Class require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/bookkeeping.class.php'; -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; -require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingjournal.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; // Langs $langs->load("accountancy"); @@ -215,7 +214,6 @@ else if ($action == "confirm_create") { llxHeader(); $html = new Form($db); -$formventilation = new FormVentilation($db); $formaccountancy = new FormAccounting($db); /* @@ -389,10 +387,10 @@ if ($action == 'create') { if ($action == 'update' && $line->id == $id) { print ''; - print $formventilation->select_account($line->numero_compte, 'account_number', 0, array (), 1, 1, ''); + print $formaccounting->select_account($line->numero_compte, 'account_number', 0, array (), 1, 1, ''); print ''; - print $formventilation->select_auxaccount($line->code_tiers, 'code_tiers', 1); + print $formaccounting->select_auxaccount($line->code_tiers, 'code_tiers', 1); print '
        '; - print $formventilation->select_account($account_number, 'account_number', 0, array (), 1, 1, ''); + print $formaccounting->select_account($account_number, 'account_number', 0, array (), 1, 1, ''); print ''; - print $formventilation->select_auxaccount($code_tiers, 'code_tiers', 1); + print $formaccounting->select_auxaccount($code_tiers, 'code_tiers', 1); print ''; print $langs->trans('From'); -print $formventilation->select_account($search_accountancy_code_start, 'search_accountancy_code_start', 1, array (), 1, 1, ''); +print $formaccounting->select_account($search_accountancy_code_start, 'search_accountancy_code_start', 1, array (), 1, 1, ''); print '
        '; print $langs->trans('to'); -print $formventilation->select_account($search_accountancy_code_end, 'search_accountancy_code_end', 1, array (), 1, 1, ''); +print $formaccounting->select_account($search_accountancy_code_end, 'search_accountancy_code_end', 1, array (), 1, 1, ''); print '
        '; print $langs->trans('From'); -print $formventilation->select_auxaccount($search_accountancy_aux_code_start, 'search_accountancy_aux_code_start', 1); +print $formaccounting->select_auxaccount($search_accountancy_aux_code_start, 'search_accountancy_aux_code_start', 1); print '
        '; print $langs->trans('to'); -print $formventilation->select_auxaccount($search_accountancy_aux_code_end, 'search_accountancy_aux_code_end', 1); +print $formaccounting->select_auxaccount($search_accountancy_aux_code_end, 'search_accountancy_aux_code_end', 1); print '
        '; print ''; diff --git a/htdocs/accountancy/bookkeeping/listbyaccount.php b/htdocs/accountancy/bookkeeping/listbyaccount.php index eb8a53561d2..6b329e421ad 100644 --- a/htdocs/accountancy/bookkeeping/listbyaccount.php +++ b/htdocs/accountancy/bookkeeping/listbyaccount.php @@ -29,8 +29,8 @@ require '../../main.inc.php'; // Class require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/bookkeeping.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/class/html.formother.class.php'; // Langs @@ -75,7 +75,7 @@ if (empty($search_date_end)) $search_date_end = dol_mktime(0, 0, 0, 12, 31, dol_ $object = new BookKeeping($db); -$formventilation = new FormVentilation($db); +$formaccounting = new FormAccounting($db); $formother = new FormOther($db); $form = new Form($db); @@ -188,7 +188,7 @@ if ($action == 'delbookkeepingyear') { if (empty($delyear)) { $delyear = dol_print_date(dol_now(), '%Y'); } - $year_array = $formventilation->selectyear_accountancy_bookkepping($delyear, 'delyear', 0, 'array'); + $year_array = $formaccounting->selectyear_accountancy_bookkepping($delyear, 'delyear', 0, 'array'); $form_question['delyear'] = array ( 'name' => 'delyear', diff --git a/htdocs/accountancy/bookkeeping/listbyyear.php b/htdocs/accountancy/bookkeeping/listbyyear.php index 263f293043a..5fba55f2eba 100644 --- a/htdocs/accountancy/bookkeeping/listbyyear.php +++ b/htdocs/accountancy/bookkeeping/listbyyear.php @@ -29,7 +29,7 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/bookkeeping.class.php'; -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; // Langs $langs->load("accountancy"); @@ -67,7 +67,7 @@ $search_code_journal = GETPOST('search_code_journal', 'alpha'); $object = new BookKeeping($db); $form = new Form($db); -$formventilation = new FormVentilation($db); +$formaccounting = new FormAccounting($db); // Filter if (empty($search_date_start)) { @@ -182,15 +182,15 @@ print $form->select_date($search_date_end, 'date_end'); print ''; print '
        '; print $langs->trans('From') . ' ' . $langs->trans('AccountAccounting') . ': '; -print $formventilation->select_account($search_numero_compte_start, 'search_numero_compte_start', 1, array (), 1, 1, ''); +print $formaccounting->select_account($search_numero_compte_start, 'search_numero_compte_start', 1, array (), 1, 1, ''); print $langs->trans('To') . ' ' . $langs->trans('AccountAccounting') . ': '; -print $formventilation->select_account($search_numero_compte_end, 'search_numero_compte_end', 1, array (), 1, 1, ''); +print $formaccounting->select_account($search_numero_compte_end, 'search_numero_compte_end', 1, array (), 1, 1, ''); print '
        '; print '
        '; print $langs->trans('From') . ' ' . $langs->trans('ThirdPartyAccount') . ': '; -print $formventilation->select_auxaccount($search_code_tiers_start, 'search_code_tiers_start', 1); +print $formaccounting->select_auxaccount($search_code_tiers_start, 'search_code_tiers_start', 1); print $langs->trans('To') . ' ' . $langs->trans('ThirdPartyAccount') . ': '; -print $formventilation->select_auxaccount($search_code_tiers_end, 'searchcode_tiers_end', 1); +print $formaccounting->select_auxaccount($search_code_tiers_end, 'searchcode_tiers_end', 1); print '
        '; print ""; diff --git a/htdocs/accountancy/class/html.formventilation.class.php b/htdocs/accountancy/class/html.formventilation.class.php deleted file mode 100644 index d7a827f2480..00000000000 --- a/htdocs/accountancy/class/html.formventilation.class.php +++ /dev/null @@ -1,292 +0,0 @@ - - * Copyright (C) 2013-2014 Olivier Geffroy - * Copyright (C) 2013-2016 Alexandre Spangaro - * Copyright (C) 2015 Ari Elbaz (elarifr) - * Copyright (C) 2016 Marcos García - * - * 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 3 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/accountancy/class/html.formventilation.class.php - * \ingroup Advanced accountancy - * \brief File of class with all html predefined components - */ - -/** - * Class to manage generation of HTML components for bank module - */ -class FormVentilation extends Form -{ - - private $options_cache = array(); - - - /** - * Return select filter with date of transaction - * - * @param string $htmlname Name of select field - * @param string $selectedkey Value - * @return string HTML edit field - */ - function select_bookkeeping_importkey($htmlname = 'importkey', $selectedkey = '') { - $options = array(); - - $sql = 'SELECT DISTINCT import_key from ' . MAIN_DB_PREFIX . 'accounting_bookkeeping'; - $sql .= " WHERE entity IN (" . getEntity("accountancy", 1) . ")"; - $sql .= ' ORDER BY import_key DESC'; - - dol_syslog(get_class($this) . "::select_bookkeeping_importkey", LOG_DEBUG); - $resql = $this->db->query($sql); - - if (!$resql) { - $this->error = "Error " . $this->db->lasterror(); - dol_syslog(get_class($this) . "::select_bookkeeping_importkey " . $this->error, LOG_ERR); - return - 1; - } - - while ($obj = $this->db->fetch_object($resql)) { - $options[$obj->import_key] = dol_print_date($obj->import_key, 'dayhourtext'); - } - - return Form::selectarray($htmlname, $options, $selectedkey); - } - - /** - * Return list of accounts with label by chart of accounts - * - * @param string $selectid Preselected id or code of accounting accounts (depends on $select_in) - * @param string $htmlname Name of field in html form - * @param int $showempty Add an empty field - * @param array $event Event options - * @param int $select_in 0=selectid value is a aa.rowid (default) or 1=selectid is aa.account_number - * @param int $select_out Set value returned by select. 0=rowid (default), 1=account_number - * @param string $morecss More css non HTML object - * @param string $usecache Key to use to store result into a cache. Next call with same key will reuse the cache. - * @return string String with HTML select - */ - function select_account($selectid, $htmlname = 'account', $showempty = 0, $event = array(), $select_in = 0, $select_out = 0, $morecss='maxwidth300 maxwidthonsmartphone', $usecache='') - { - global $conf; - - require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; - - $out = ''; - - $options = array(); - if ($usecache && ! empty($this->options_cache[$usecache])) - { - $options = $this->options_cache[$usecache]; - $selected=$selectid; - } - else - { - $trunclength = defined('ACCOUNTING_LENGTH_DESCRIPTION_ACCOUNT') ? $conf->global->ACCOUNTING_LENGTH_DESCRIPTION_ACCOUNT : 50; - - $sql = "SELECT DISTINCT aa.account_number, aa.label, aa.rowid, aa.fk_pcg_version"; - $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_account as aa"; - $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "accounting_system as asy ON aa.fk_pcg_version = asy.pcg_version"; - $sql .= " AND asy.rowid = " . $conf->global->CHARTOFACCOUNTS; - $sql .= " AND aa.active = 1"; - $sql .= " ORDER BY aa.account_number"; - - dol_syslog(get_class($this) . "::select_account", LOG_DEBUG); - $resql = $this->db->query($sql); - - if (!$resql) { - $this->error = "Error " . $this->db->lasterror(); - dol_syslog(get_class($this) . "::select_account " . $this->error, LOG_ERR); - return -1; - } - - $out .= ajax_combobox($htmlname, $event); - - $selected = 0; - while ($obj = $this->db->fetch_object($resql)) - { - $label = length_accountg($obj->account_number) . ' - ' . $obj->label; - $label = dol_trunc($label, $trunclength); - - $select_value_in = $obj->rowid; - $select_value_out = $obj->rowid; - - // Try to guess if we have found default value - if ($select_in == 1) { - $select_value_in = $obj->account_number; - } - if ($select_out == 1) { - $select_value_out = $obj->account_number; - } - // Remember guy's we store in database llx_facturedet the rowid of accounting_account and not the account_number - // Because same account_number can be share between different accounting_system and do have the same meaning - if ($selectid != '' && $selectid == $select_value_in) { - //var_dump("Found ".$selectid." ".$select_value_in); - $selected = $select_value_out; - } - - $options[$select_value_out] = $label; - } - $this->db->free($resql); - - if ($usecache) - { - $this->options_cache[$usecache] = $options; - } - } - - $out .= Form::selectarray($htmlname, $options, $selected, $showempty, 0, 0, '', 0, 0, 0, '', $morecss, 1); - - return $out; - } - - /** - * Return list of auxilary thirdparty accounts - * - * @param string $selectid Preselected pcg_type - * @param string $htmlname Name of field in html form - * @param int $showempty Add an empty field - * @param array $event Event options - * - * @return string String with HTML select - */ - function select_auxaccount($selectid, $htmlname = 'account_num_aux', $showempty = 0, $event = array()) { - - $aux_account = array(); - - // Auxiliary customer account - $sql = "SELECT DISTINCT code_compta, nom "; - $sql .= " FROM ".MAIN_DB_PREFIX."societe"; - $sql .= " WHERE entity IN (" . getEntity("societe", 1) . ")"; - $sql .= " ORDER BY code_compta"; - dol_syslog(get_class($this)."::select_auxaccount", LOG_DEBUG); - $resql = $this->db->query($sql); - if ($resql) { - while ($obj = $this->db->fetch_object($resql)) { - if (!empty($obj->code_compta)) { - $aux_account[$obj->code_compta] = $obj->code_compta.' ('.$obj->nom.')'; - } - } - } else { - $this->error = "Error ".$this->db->lasterror(); - dol_syslog(get_class($this)."::select_pcgsubtype ".$this->error, LOG_ERR); - return -1; - } - $this->db->free($resql); - - // Auxiliary supplier account - $sql = "SELECT DISTINCT code_compta_fournisseur, nom "; - $sql .= " FROM ".MAIN_DB_PREFIX."societe"; - $sql .= " WHERE entity IN (" . getEntity("societe", 1) . ")"; - $sql .= " ORDER BY code_compta_fournisseur"; - dol_syslog(get_class($this)."::select_auxaccount", LOG_DEBUG); - $resql = $this->db->query($sql); - if ($resql) { - while ($obj = $this->db->fetch_object($resql)) { - if (!empty($obj->code_compta_fournisseur)) { - $aux_account[$obj->code_compta_fournisseur] = $obj->code_compta_fournisseur.' ('.$obj->nom.')'; - } - } - } else { - $this->error = "Error ".$this->db->lasterror(); - dol_syslog(get_class($this)."::select_pcgsubtype ".$this->error, LOG_ERR); - return -1; - } - $this->db->free($resql); - - // Build select - $out = ajax_combobox($htmlname, $event); - $out .= Form::selectarray($htmlname, $aux_account, $selectid, $showempty, 0, 0, '', 0, 0, 0, '', 'maxwidth300'); - - return $out; - } - - /** - * Return HTML combo list of years existing into book keepping - * - * @param string $selected Preselected value - * @param string $htmlname Name of HTML select object - * @param int $useempty Affiche valeur vide dans liste - * @param string $output_format (html/opton (for option html only)/array (to return options arrays - * @return string/array - */ - function selectyear_accountancy_bookkepping($selected = '', $htmlname = 'yearid', $useempty = 0, $output_format = 'html') - { - global $conf; - - $out_array = array(); - - $sql = "SELECT DISTINCT date_format(doc_date,'%Y') as dtyear"; - $sql .= " FROM ".MAIN_DB_PREFIX."accounting_bookkeeping"; - $sql .= " WHERE entity IN (" . getEntity("accountancy", 1) . ")"; - $sql .= " ORDER BY date_format(doc_date,'%Y')"; - dol_syslog(get_class($this)."::".__METHOD__, LOG_DEBUG); - $resql = $this->db->query($sql); - - if (!$resql) { - $this->error = "Error ".$this->db->lasterror(); - dol_syslog(get_class($this)."::".__METHOD__.$this->error, LOG_ERR); - return -1; - } - while ($obj = $this->db->fetch_object($resql)) { - $out_array[$obj->dtyear] = $obj->dtyear; - } - $this->db->free($resql); - - if ($output_format == 'html') { - return Form::selectarray($htmlname, $out_array, $selected, $useempty, 0, 0, 'placeholder="aa"'); - } else { - return $out_array; - } - } - - /** - * Return HTML combo list of years existing into book keepping - * - * @param string $selected Preselected value - * @param string $htmlname Name of HTML select object - * @param int $useempty Affiche valeur vide dans liste - * @param string $output_format Html/option (for option html only)/array (to return options arrays - * @return string/array - */ - function selectjournal_accountancy_bookkepping($selected = '', $htmlname = 'journalid', $useempty = 0, $output_format = 'html') - { - global $conf,$langs; - - $out_array = array(); - - $sql = "SELECT DISTINCT code_journal"; - $sql .= " FROM ".MAIN_DB_PREFIX."accounting_bookkeeping"; - $sql .= " WHERE entity IN (" . getEntity("accountancy", 1) . ")"; - $sql .= " ORDER BY code_journal"; - dol_syslog(get_class($this)."::".__METHOD__, LOG_DEBUG); - $resql = $this->db->query($sql); - - if (!$resql) { - $this->error = "Error ".$this->db->lasterror(); - dol_syslog(get_class($this)."::".__METHOD__.$this->error, LOG_ERR); - return -1; - } - while ($obj = $this->db->fetch_object($resql)) { - $out_array[$obj->code_journal] = $obj->code_journal?$obj->code_journal:$langs->trans("NotDefined"); // TODO Not defined is accepted ? We should avoid this, shouldn't we ? - } - $this->db->free($resql); - - if ($output_format == 'html') { - return Form::selectarray($htmlname, $out_array, $selected, $useempty, 0, 0, 'placeholder="aa"'); - } else { - return $out_array; - } - } -} diff --git a/htdocs/accountancy/customer/card.php b/htdocs/accountancy/customer/card.php index baa70bf51e8..eca3be1d477 100644 --- a/htdocs/accountancy/customer/card.php +++ b/htdocs/accountancy/customer/card.php @@ -1,7 +1,7 @@ * Copyright (C) 2013-2014 Florian Henry - * Copyright (C) 2013-2015 Alexandre Spangaro + * Copyright (C) 2013-2017 Alexandre Spangaro * * 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 @@ -26,7 +26,7 @@ require '../../main.inc.php'; // Class require_once DOL_DOCUMENT_ROOT . '/compta/facture/class/facture.class.php'; -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; // Langs $langs->load("bills"); @@ -39,9 +39,7 @@ $id = GETPOST('id'); // Security check if ($user->societe_id > 0) accessforbidden(); - - - + /* * Actions */ @@ -84,7 +82,7 @@ if ($cancel == $langs->trans("Cancel")) { */ $form = new Form($db); $facture_static = new Facture($db); -$formventilation = new FormVentilation($db); +$formaccounting = new FormAccounting($db); if (! empty($id)) { $sql = "SELECT f.facnumber, f.rowid as facid, l.fk_product, l.description, l.price,"; @@ -96,50 +94,50 @@ if (! empty($id)) { $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "facture as f ON f.rowid = l.fk_facture"; $sql .= " WHERE f.fk_statut > 0 AND l.rowid = " . $id; $sql .= " AND f.entity IN (" . getEntity("facture", 0) . ")"; // We don't share object for accountancy - + dol_syslog("/accounting/customer/card.php sql=" . $sql, LOG_DEBUG); $result = $db->query($sql); - + if ($result) { $num_lines = $db->num_rows($result); $i = 0; - + if ($num_lines) { - + $objp = $db->fetch_object($result); - + print '' . "\n"; print ''; print ''; - + print load_fiche_titre($langs->trans('CustomersVentilation'), '', 'title_setup'); - + dol_fiche_head(); - + print '
        '; - + // Ref facture print ''; $facture_static->ref = $objp->facnumber; $facture_static->id = $objp->facid; print ''; print ''; - + print ''; print ''; print ''; print '
        ' . $langs->trans("Invoice") . '' . $facture_static->getNomUrl(1) . '
        ' . $langs->trans("Line") . '' . nl2br($objp->description) . '
        ' . $langs->trans("Account") . ''; - print $formventilation->select_account($objp->fk_code_ventilation, 'codeventil', 1); + print $formaccounting->select_account($objp->fk_code_ventilation, 'codeventil', 1); print '
        '; - + dol_fiche_end(); - + print '
        '; print ''; print '     '; print ''; print '
        '; - + print ''; } else { print "Error"; diff --git a/htdocs/accountancy/customer/lines.php b/htdocs/accountancy/customer/lines.php index 52b3a31d6f0..f3763dd9ca0 100644 --- a/htdocs/accountancy/customer/lines.php +++ b/htdocs/accountancy/customer/lines.php @@ -28,7 +28,7 @@ require '../../main.inc.php'; // Class -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; require_once DOL_DOCUMENT_ROOT . '/compta/facture/class/facture.class.php'; require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; @@ -77,7 +77,7 @@ if ($user->societe_id > 0) if (! $user->rights->accounting->bind->write) accessforbidden(); -$formventilation = new FormVentilation($db); +$formaccounting = new FormAccounting($db); /* @@ -254,14 +254,14 @@ if ($result) { print $langs->trans("DescVentilDoneCustomer") . '
        '; print '
        ' . $langs->trans("ChangeAccount") . '
        '; - print $formventilation->select_account($account_parent, 'account_parent', 1); + print $formaccounting->select_account($account_parent, 'account_parent', 1); print '
        '; $moreforfilter = ''; - - print '
        '; + + print '
        '; print ''."\n"; - + print ''; print ''; print ''; @@ -278,7 +278,7 @@ if ($result) { $searchpicto=$form->showFilterButtons(); print $searchpicto; print "\n"; - + print ''; print_liste_field_titre($langs->trans("LineId"), $_SERVER["PHP_SELF"], "fd.rowid", "", $param, '', $sortfield, $sortorder); print_liste_field_titre($langs->trans("Invoice"), $_SERVER["PHP_SELF"], "f.facnumber", "", $param, '', $sortfield, $sortorder); @@ -303,16 +303,16 @@ if ($result) { $facture_static->ref = $objp->facnumber; $facture_static->id = $objp->rowid; - + $product_static->ref = $objp->product_ref; $product_static->id = $objp->product_id; $product_static->type = $objp->product_type; $product_static->label = $objp->product_label; - + print ''; print ''; - + // Ref Invoice print ''; @@ -324,13 +324,13 @@ if ($result) { print $product_static->getNomUrl(1); if ($objp->product_label) print '
        '.$objp->product_label; print ''; - + print ''; - + print ''; print ''; print ''; - + print ''; - + print ''; - + print ''; print ""; $i ++; } - + print "
        ' . $objp->rowid . '' . $facture_static->getNomUrl(1) . ''; $text = dolGetFirstLineOfText(dol_string_nohtmltag($objp->description)); $trunclength = defined('ACCOUNTING_LENGTH_DESCRIPTION') ? ACCOUNTING_LENGTH_DESCRIPTION : 32; print $form->textwithtooltip(dol_trunc($text,$trunclength), $objp->description); print '' . price($objp->total_ht) . '' . price($objp->tva_tx) . ''; @@ -338,20 +338,20 @@ if ($result) { print img_edit(); print ''; print '' . $objp->country .'' . $objp->tva_intra . '
        "; print "
        "; - + if ($nbtotalofrecords > $limit) { print_barre_liste('', $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num_lines, $nbtotalofrecords, '', 0, '', '', $limit, 1); } diff --git a/htdocs/accountancy/customer/list.php b/htdocs/accountancy/customer/list.php index bbd875e0dbf..8af289f2c99 100644 --- a/htdocs/accountancy/customer/list.php +++ b/htdocs/accountancy/customer/list.php @@ -30,7 +30,7 @@ require '../../main.inc.php'; // Class require_once DOL_DOCUMENT_ROOT . '/compta/facture/class/facture.class.php'; require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php'; -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingaccount.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; @@ -85,7 +85,7 @@ if ($user->societe_id > 0) if (! $user->rights->accounting->bind->write) accessforbidden(); -$formventilation = new FormVentilation($db); +$formaccounting = new FormAccounting($db); $accounting = new AccountingAccount($db); $aarowid_s = $accounting->fetch('', $conf->global->ACCOUNTING_SERVICE_SOLD_ACCOUNT, 1); $aarowid_p = $accounting->fetch('', $conf->global->ACCOUNTING_PRODUCT_SOLD_ACCOUNT, 1); @@ -101,7 +101,7 @@ if (! GETPOST('confirmmassaction') && $massaction != 'presend' && $massaction != // Purge search criteria if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) // All test are required to be compatible with all browsers { - $search_lineid = ''; + $search_lineid = ''; $search_ref = ''; $search_invoice = ''; $search_label = ''; @@ -241,7 +241,7 @@ if ($result) { $i = 0; $arrayofselected=is_array($toselect)?$toselect:array(); - + $param=''; if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage; if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit; @@ -254,8 +254,7 @@ if ($result) { //if ($user->rights->mymodule->supprimer) $arrayofmassactions['delete']=$langs->trans("Delete"); //if ($massaction == 'presend') $arrayofmassactions=array(); $massactionbutton=$form->selectMassAction('ventil', $arrayofmassactions, 1); - - + print '
        ' . "\n"; print ''; if ($optioncss != '') print ''; @@ -264,16 +263,16 @@ if ($result) { print ''; print ''; print ''; - + print_barre_liste($langs->trans("InvoiceLines"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num_lines, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit); print $langs->trans("DescVentilTodoCustomer") . '

        '; if ($msg) print $msg.'
        '; - + $moreforfilter = ''; - - print '
        '; + + print '
        '; print ''."\n"; // We add search filter @@ -309,7 +308,7 @@ if ($result) { if ($massactionbutton) $checkpicto=$form->showCheckAddButtons('checkforselect', 1); print_liste_field_titre($checkpicto, '', '', '', '', 'align="center"'); print "\n"; - + $facture_static = new Facture($db); $product_static = new Product($db); $form = new Form($db); @@ -330,7 +329,7 @@ if ($result) { $facture_static->ref = $objp->facnumber; $facture_static->id = $objp->facid; $facture_static->type = $objp->ftype; - + $code_sell_p_notset = ''; $objp->aarowid_suggest = $objp->aarowid; @@ -350,30 +349,30 @@ if ($result) { if (! empty($objp->code_sell)) { $objp->code_sell_p = $objp->code_sell; // Code on product } else { - $code_sell_p_notset = 'color:orange'; + $code_sell_p_notset = 'color:orange'; } if (empty($objp->code_sell_l) && empty($objp->code_sell_p)) $code_sell_p_notset = 'color:red'; - + // $objp->code_sell_p is now code of product/service // $objp->code_sell_l is now default code of product/service - + print ''; // Line id print ''; - + // Ref Invoice print ''; print ''; - + // Ref Product print ''; - + print ''; - + // Vat rate if ($objp->vat_tx_l != $objp->vat_tx_p) $code_vat_differ = 'font-weight:bold; text-decoration:blink; color:red'; print ''; - + // Current account print ''; print '
        ' . $objp->rowid . '' . $facture_static->getNomUrl(1) . '' . dol_print_date($db->jdate($objp->datef), 'day') . ''; if ($product_static->id) print $product_static->getNomUrl(1); if ($objp->product_label) print '
        '.$objp->product_label; print '
        '; $text = dolGetFirstLineOfText(dol_string_nohtmltag($objp->description)); $trunclength = defined('ACCOUNTING_LENGTH_DESCRIPTION') ? ACCOUNTING_LENGTH_DESCRIPTION : 32; @@ -383,14 +382,14 @@ if ($result) { print ''; print price($objp->total_ht); print ''; print price($objp->tva_tx_line); print ''; print (($objp->type_l == 1)?$langs->trans("DefaultForService"):$langs->trans("DefaultForProduct")) . ' = ' . ($objp->code_sell_l > 0 ? length_accountg($objp->code_sell_l) : $langs->trans("Unknown")); @@ -403,7 +402,7 @@ if ($result) { // Suggested accounting account print ''; - print $formventilation->select_account($objp->aarowid_suggest, 'codeventil'.$objp->rowid, 1, array(), 0, 0, 'maxwidth300 maxwidthonsmartphone', 'cachewithshowemptyone'); + print $formaccounting->select_account($objp->aarowid_suggest, 'codeventil'.$objp->rowid, 1, array(), 0, 0, 'maxwidth300 maxwidthonsmartphone', 'cachewithshowemptyone'); print ''; @@ -414,7 +413,7 @@ if ($result) { } print '
        '; print "
        "; - + print ''; } else { print $db->error(); diff --git a/htdocs/accountancy/expensereport/card.php b/htdocs/accountancy/expensereport/card.php index 52440385e50..e37b35f1003 100644 --- a/htdocs/accountancy/expensereport/card.php +++ b/htdocs/accountancy/expensereport/card.php @@ -30,7 +30,7 @@ require '../../main.inc.php'; // Class require_once DOL_DOCUMENT_ROOT . '/expensereport/class/expensereport.class.php'; -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; // Langs $langs->load("bills"); @@ -85,7 +85,7 @@ if ($cancel == $langs->trans("Cancel")) { // Create $form = new Form($db); $expensereport_static = new ExpenseReport($db); -$formventilation = new FormVentilation($db); +$formaccounting = new FormAccounting($db); if (! empty($id)) { $sql = "SELECT er.ref, er.rowid as facid, erd.fk_c_type_fees, erd.comments, erd.rowid, erd.fk_code_ventilation,"; @@ -135,7 +135,7 @@ if (! empty($id)) { print '
        ' . ($langs->trans($objp->type_fees_code) == $objp->type_fees_code ? $objp->type_fees_label : $langs->trans(($objp->type_fees_code))) . '
        ' . $langs->trans("Account") . ''; - print $formventilation->select_account($objp->fk_code_ventilation, 'codeventil', 1); + print $formaccounting->select_account($objp->fk_code_ventilation, 'codeventil', 1); print '
        '; diff --git a/htdocs/accountancy/expensereport/lines.php b/htdocs/accountancy/expensereport/lines.php index 6d0ffbd4476..b3936bbf1a6 100644 --- a/htdocs/accountancy/expensereport/lines.php +++ b/htdocs/accountancy/expensereport/lines.php @@ -27,7 +27,7 @@ require '../../main.inc.php'; // Class -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; require_once DOL_DOCUMENT_ROOT . '/expensereport/class/expensereport.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; @@ -74,7 +74,7 @@ if ($user->societe_id > 0) if (! $user->rights->accounting->bind->write) accessforbidden(); -$formventilation = new FormVentilation($db); +$formaccounting = new FormAccounting($db); /* @@ -226,7 +226,7 @@ if ($result) { print $langs->trans("DescVentilDoneExpenseReport") . '
        '; print '
        ' . $langs->trans("ChangeAccount") . '
        '; - print $formventilation->select_account(GETPOST('account_parent'), 'account_parent', 1); + print $formaccounting->select_account(GETPOST('account_parent'), 'account_parent', 1); print '
        '; $moreforfilter = ''; diff --git a/htdocs/accountancy/expensereport/list.php b/htdocs/accountancy/expensereport/list.php index 72316e4c4d6..b1a86c96838 100644 --- a/htdocs/accountancy/expensereport/list.php +++ b/htdocs/accountancy/expensereport/list.php @@ -29,7 +29,7 @@ require '../../main.inc.php'; // Class require_once DOL_DOCUMENT_ROOT . '/expensereport/class/expensereport.class.php'; -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingaccount.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; @@ -83,7 +83,7 @@ if ($user->societe_id > 0) if (! $user->rights->accounting->bind->write) accessforbidden(); -$formventilation = new FormVentilation($db); +$formaccounting = new FormAccounting($db); $accounting = new AccountingAccount($db); @@ -343,7 +343,7 @@ if ($result) { // Suggested accounting account print ''; - print $formventilation->select_account($objp->aarowid_suggest, 'codeventil'.$objp->rowid, 1, array(), 0, 0, 'maxwidth300 maxwidthonsmartphone', 'cachewithshowemptyone'); + print $formaccounting->select_account($objp->aarowid_suggest, 'codeventil'.$objp->rowid, 1, array(), 0, 0, 'maxwidth300 maxwidthonsmartphone', 'cachewithshowemptyone'); print ''; print ''; diff --git a/htdocs/accountancy/supplier/card.php b/htdocs/accountancy/supplier/card.php index b7c5979aa7a..47a99c88496 100644 --- a/htdocs/accountancy/supplier/card.php +++ b/htdocs/accountancy/supplier/card.php @@ -1,11 +1,11 @@ * Copyright (C) 2005 Simon TOSSER - * Copyright (C) 2013-2015 Alexandre Spangaro + * Copyright (C) 2013-2017 Alexandre Spangaro * Copyright (C) 2013-2014 Olivier Geffroy - * Copyright (C) 2013-2014 Florian Henry - * Copyright (C) 2014 Juanjo Menent - * Copyright (C) 2015 Jean-François Ferry + * Copyright (C) 2013-2014 Florian Henry + * Copyright (C) 2014 Juanjo Menent + * Copyright (C) 2015 Jean-François Ferry * * 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 @@ -30,7 +30,7 @@ require '../../main.inc.php'; // Class require_once DOL_DOCUMENT_ROOT . '/fourn/class/fournisseur.facture.class.php'; -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; // Langs $langs->load("bills"); @@ -52,11 +52,11 @@ if ($user->societe_id > 0) if ($action == 'ventil' && $user->rights->accounting->bind->write) { if (! GETPOST('cancel', 'alpha')) { if ($codeventil < 0) $codeventil = 0; - + $sql = " UPDATE " . MAIN_DB_PREFIX . "facture_fourn_det"; $sql .= " SET fk_code_ventilation = " . $codeventil; $sql .= " WHERE rowid = " . $id; - + $resql = $db->query($sql); if (! $resql) { setEventMessages($db->lasterror(), null, 'errors'); @@ -85,7 +85,7 @@ if ($cancel == $langs->trans("Cancel")) { // Create $form = new Form($db); $facturefournisseur_static = new FactureFournisseur($db); -$formventilation = new FormVentilation($db); +$formaccounting = new FormAccounting($db); if (! empty($id)) { $sql = "SELECT f.ref as facnumber, f.rowid as facid, l.fk_product, l.description, l.rowid, l.fk_code_ventilation, "; @@ -107,41 +107,41 @@ if (! empty($id)) { if ($num_lines) { $objp = $db->fetch_object($result); - + print '
        ' . "\n"; print ''; print ''; - + print load_fiche_titre($langs->trans('SuppliersVentilation'), '', 'title_setup'); - + dol_fiche_head(); - + print ''; - + // ref invoice print ''; $facturefournisseur_static->ref = $objp->facnumber; $facturefournisseur_static->id = $objp->facid; print ''; print ''; - + print ''; print ''; print ''; print ''; print ''; print '
        ' . $langs->trans("BillsSuppliers") . '' . $facturefournisseur_static->getNomUrl(1) . '
        ' . $langs->trans("Line") . '' . stripslashes(nl2br($objp->description)) . '
        ' . $langs->trans("ProductLabel") . '' . dol_trunc($objp->product_label, 24) . '
        ' . $langs->trans("Account") . ''; - print $formventilation->select_account($objp->fk_code_ventilation, 'codeventil', 1); + print $formaccounting->select_account($objp->fk_code_ventilation, 'codeventil', 1); print '
        '; - + dol_fiche_end(); - + print '
        '; print ''; print '     '; print ''; print '
        '; - + print '
        '; } else { print "Error"; diff --git a/htdocs/accountancy/supplier/lines.php b/htdocs/accountancy/supplier/lines.php index 1a95262f861..2757b6d8aec 100644 --- a/htdocs/accountancy/supplier/lines.php +++ b/htdocs/accountancy/supplier/lines.php @@ -1,9 +1,9 @@ - * Copyright (C) 2013-2016 Alexandre Spangaro + * Copyright (C) 2013-2017 Alexandre Spangaro * Copyright (C) 2014-2015 Ari Elbaz (elarifr) * Copyright (C) 2013-2016 Florian Henry - * Copyright (C) 2014 Juanjo Menent + * Copyright (C) 2014 Juanjo Menent * * 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 @@ -27,7 +27,7 @@ require '../../main.inc.php'; // Class -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; require_once DOL_DOCUMENT_ROOT . '/fourn/class/fournisseur.facture.class.php'; require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php'; @@ -76,7 +76,7 @@ if ($user->societe_id > 0) if (! $user->rights->accounting->bind->write) accessforbidden(); -$formventilation = new FormVentilation($db); +$formaccounting = new FormAccounting($db); /* @@ -237,7 +237,7 @@ if ($result) { print $langs->trans("DescVentilDoneSupplier") . '
        '; print '
        ' . $langs->trans("ChangeAccount") . '
        '; - print $formventilation->select_account(GETPOST('account_parent'), 'account_parent', 1); + print $formaccounting->select_account(GETPOST('account_parent'), 'account_parent', 1); print '
        '; $moreforfilter = ''; diff --git a/htdocs/accountancy/supplier/list.php b/htdocs/accountancy/supplier/list.php index 061e465b1e7..9c822425a1c 100644 --- a/htdocs/accountancy/supplier/list.php +++ b/htdocs/accountancy/supplier/list.php @@ -1,10 +1,10 @@ - * Copyright (C) 2013-2016 Alexandre Spangaro + * Copyright (C) 2013-2017 Alexandre Spangaro * Copyright (C) 2014-2015 Ari Elbaz (elarifr) * Copyright (C) 2013-2014 Florian Henry * Copyright (C) 2014 Juanjo Menent s - * Copyright (C) 2016 Laurent Destailleur + * Copyright (C) 2016 Laurent Destailleur * * 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 @@ -30,7 +30,7 @@ require '../../main.inc.php'; // Class require_once DOL_DOCUMENT_ROOT . '/fourn/class/fournisseur.facture.class.php'; require_once DOL_DOCUMENT_ROOT . '/fourn/class/fournisseur.product.class.php'; -require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingaccount.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; @@ -85,7 +85,7 @@ if ($user->societe_id > 0) if (! $user->rights->accounting->bind->write) accessforbidden(); -$formventilation = new FormVentilation($db); +$formaccounting = new FormAccounting($db); $accounting = new AccountingAccount($db); // TODO: we should need to check if result is a really exist accountaccount rowid..... $aarowid_s = $accounting->fetch('', $conf->global->ACCOUNTING_SERVICE_BUY_ACCOUNT, 1); @@ -238,11 +238,11 @@ if ($result) { $i = 0; $arrayofselected=is_array($toselect)?$toselect:array(); - + $param=''; if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage; if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit; - + $arrayofmassactions = array( 'ventil'=>$langs->trans("Ventilate") //'presend'=>$langs->trans("SendByMail"), @@ -251,8 +251,7 @@ if ($result) { //if ($user->rights->mymodule->supprimer) $arrayofmassactions['delete']=$langs->trans("Delete"); //if ($massaction == 'presend') $arrayofmassactions=array(); $massactionbutton=$form->selectMassAction('ventil', $arrayofmassactions, 1); - - + print '
        ' . "\n"; print ''; if ($optioncss != '') print ''; @@ -261,15 +260,15 @@ if ($result) { print ''; print ''; print ''; - + print_barre_liste($langs->trans("InvoiceLines"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num_lines, $nbtotalofrecords, 'title_accountancy', 0, '', '', $limit); print $langs->trans("DescVentilTodoCustomer") . '

        '; if ($msg) print $msg.'
        '; - + $moreforfilter = ''; - + print '
        '; print ''."\n"; @@ -329,7 +328,7 @@ if ($result) { $productfourn_static->id = $objp->product_id; $productfourn_static->type = $objp->type; $productfourn_static->label = $objp->product_label; - + $facturefourn_static->ref = $objp->ref; $facturefourn_static->id = $objp->facid; $facturefourn_static->type = $objp->type; @@ -347,14 +346,14 @@ if ($result) { $objp->aarowid_suggest = $aarowid_p; } if ($objp->code_buy_l == -1) $objp->code_buy_l=''; - + if (! empty($objp->code_buy)) { $objp->code_buy_p = $objp->code_buy; // Code on product } else { $code_buy_p_notset = 'color:orange'; } if (empty($objp->code_buy_l) && empty($objp->code_buy_p)) $code_buy_p_notset = 'color:red'; - + // $objp->code_buy_p is now code of product/service // $objp->code_buy_l is now default code of product/service @@ -362,23 +361,23 @@ if ($result) { // Line id print ''; - + // Ref Invoice print ''; print ''; - + print ''; - + // Ref product print ''; - + // Description print ''; - + // Colonne choix ligne a ventiler print ''; print ''; } else @@ -525,7 +523,7 @@ if ($action == 'create') { print ''; print ''; } @@ -957,43 +955,42 @@ else //print '
        '; - + print '
        ' . $objp->rowid . '' . $facturefourn_static->getNomUrl(1) . ''; print $objp->invoice_label; print '' . dol_print_date($db->jdate($objp->datef), 'day') . ''; if ($productfourn_static->id) print $productfourn_static->getNomUrl(1); if ($objp->product_label) print '
        '.$objp->product_label; print '
        '; $text = dolGetFirstLineOfText(dol_string_nohtmltag($objp->description)); @@ -409,9 +408,9 @@ if ($result) { // Suggested accounting account print ''; - print $formventilation->select_account($objp->aarowid_suggest, 'codeventil'.$objp->rowid, 1, array(), 0, 0, 'maxwidth300 maxwidthonsmartphone', 'cachewithshowemptyone'); + print $formaccounting->select_account($objp->aarowid_suggest, 'codeventil'.$objp->rowid, 1, array(), 0, 0, 'maxwidth300 maxwidthonsmartphone', 'cachewithshowemptyone'); print ''; print 'aarowid ? "checked" : "") . '/>'; diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index 28db9ef8b49..913fcf75de6 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -39,7 +39,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; -if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; $langs->load("errors"); $langs->load("admin"); @@ -1662,7 +1662,7 @@ function fieldList($fieldlist, $obj='', $tabname='', $context='') $formadmin = new FormAdmin($db); $formcompany = new FormCompany($db); - if (! empty($conf->accounting->enabled)) $formaccountancy = new FormVentilation($db); + if (! empty($conf->accounting->enabled)) $formaccounting = new FormAccounting($db); foreach ($fieldlist as $field => $value) { @@ -1811,7 +1811,7 @@ function fieldList($fieldlist, $obj='', $tabname='', $context='') { $fieldname = $fieldlist[$field]; $accountancy_account = (! empty($obj->$fieldname) ? $obj->$fieldname : 0); - print $formaccountancy->select_account($accountancy_account, $fieldlist[$field], 1, '', 1, 1, 'maxwidth200 maxwidthonsmartphone'); + print $formaccounting->select_account($accountancy_account, $fieldlist[$field], 1, '', 1, 1, 'maxwidth200 maxwidthonsmartphone'); } else { diff --git a/htdocs/admin/loan.php b/htdocs/admin/loan.php index 86d963ed54f..c3e8bad9f6d 100644 --- a/htdocs/admin/loan.php +++ b/htdocs/admin/loan.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2014-2017 Alexandre Spangaro * * 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 @@ -26,7 +26,7 @@ require '../main.inc.php'; // Class require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; -if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; $langs->load("admin"); $langs->load("loan"); @@ -77,7 +77,7 @@ if ($action == 'update') llxHeader(); $form = new Form($db); -if (! empty($conf->accounting->enabled)) $formaccountancy = New FormVentilation($db); +if (! empty($conf->accounting->enabled)) $formaccounting = New FormAccounting($db); $linkback=''.$langs->trans("BackToModuleList").''; print load_fiche_titre($langs->trans('ConfigLoan'),$linkback,'title_setup'); @@ -106,7 +106,7 @@ foreach ($list as $key) print ''; if (! empty($conf->accounting->enabled)) { - print $formaccountancy->select_account($conf->global->$key, $key, 1, '', 1, 1); + print $formaccounting->select_account($conf->global->$key, $key, 1, '', 1, 1); } else { diff --git a/htdocs/admin/mails_templates.php b/htdocs/admin/mails_templates.php index b9e5df738ad..caea3bef9f7 100644 --- a/htdocs/admin/mails_templates.php +++ b/htdocs/admin/mails_templates.php @@ -39,7 +39,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; -if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; $langs->load("errors"); $langs->load("admin"); @@ -841,7 +841,7 @@ function fieldList($fieldlist, $obj='', $tabname='', $context='') $formadmin = new FormAdmin($db); $formcompany = new FormCompany($db); - if (! empty($conf->accounting->enabled)) $formaccountancy = new FormVentilation($db); + if (! empty($conf->accounting->enabled)) $formaccounting = new FormAccounting($db); foreach ($fieldlist as $field => $value) { diff --git a/htdocs/admin/salaries.php b/htdocs/admin/salaries.php index 8f115d3963b..85603de2ae5 100644 --- a/htdocs/admin/salaries.php +++ b/htdocs/admin/salaries.php @@ -26,7 +26,7 @@ require '../main.inc.php'; // Class require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; -if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; $langs->load("admin"); $langs->load("salaries"); @@ -76,7 +76,7 @@ if ($action == 'update') llxHeader('',$langs->trans('SalariesSetup')); $form = new Form($db); -if (! empty($conf->accounting->enabled)) $formaccountancy = New FormVentilation($db); +if (! empty($conf->accounting->enabled)) $formaccounting = New FormAccounting($db); $linkback=''.$langs->trans("BackToModuleList").''; print load_fiche_titre($langs->trans('SalariesSetup'),$linkback,'title_setup'); @@ -109,7 +109,7 @@ foreach ($list as $key) print ''; if (! empty($conf->accounting->enabled)) { - print $formaccountancy->select_account($conf->global->$key, $key, 1, '', 1, 1); + print $formaccounting->select_account($conf->global->$key, $key, 1, '', 1, 1); } else { diff --git a/htdocs/admin/taxes.php b/htdocs/admin/taxes.php index dbdce59c3c5..59796919a8b 100644 --- a/htdocs/admin/taxes.php +++ b/htdocs/admin/taxes.php @@ -27,7 +27,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php'; -if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; $langs->load('admin'); @@ -113,7 +113,7 @@ if ($action == 'update') { llxHeader(); $form=new Form($db); -if (! empty($conf->accounting->enabled)) $formaccountancy = New FormVentilation($db); +if (! empty($conf->accounting->enabled)) $formaccounting = New FormAccounting($db); $linkback=''.$langs->trans("BackToModuleList").''; print load_fiche_titre($langs->trans('TaxSetup'),$linkback,'title_setup'); @@ -216,7 +216,7 @@ foreach ($list as $key) print ''; if (! empty($conf->accounting->enabled)) { - print $formaccountancy->select_account($conf->global->$key, $key, 1, '', 1, 1); + print $formaccounting->select_account($conf->global->$key, $key, 1, '', 1, 1); } else { diff --git a/htdocs/compta/bank/card.php b/htdocs/compta/bank/card.php index a8263a74916..2cb90b6a44a 100644 --- a/htdocs/compta/bank/card.php +++ b/htdocs/compta/bank/card.php @@ -35,7 +35,6 @@ require_once DOL_DOCUMENT_ROOT . '/core/class/html.formbank.class.php'; require_once DOL_DOCUMENT_ROOT . '/compta/bank/class/account.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/class/extrafields.class.php'; if (! empty($conf->categorie->enabled)) require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php'; -if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingaccount.class.php'; if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingjournal.class.php'; @@ -281,8 +280,7 @@ if ($action == 'confirm_delete' && $_POST["confirm"] == "yes" && $user->rights-> $form = new Form($db); $formbank = new FormBank($db); $formcompany = new FormCompany($db); -if (! empty($conf->accounting->enabled)) $formaccountancy = New FormVentilation($db); -if (! empty($conf->accounting->enabled)) $formaccountancy2 = New FormAccounting($db); +if (! empty($conf->accounting->enabled)) $formaccounting = New FormAccounting($db); $countrynotdefined=$langs->trans("ErrorSetACountryFirst").' ('.$langs->trans("SeeAbove").')'; @@ -511,7 +509,7 @@ if ($action == 'create') { print '
        '.$langs->trans("AccountancyCode").''; - print $formaccountancy->select_account($object->account_number, 'account_number', 1, '', 1, 1); + print $formaccounting->select_account($object->account_number, 'account_number', 1, '', 1, 1); print '
        '.$langs->trans("AccountancyJournal").''; - print $formaccountancy2->select_journal($object->fk_accountancy_journal, 'fk_accountancy_journal', 4, 1, '', 0, 0); + print $formaccounting->select_journal($object->fk_accountancy_journal, 'fk_accountancy_journal', 4, 1, '', 0, 0); print '
        '; - + // Accountancy code $tdextra = ' class="titlefieldcreate"'; - + if (!empty($conf->global->MAIN_BANK_ACCOUNTANCY_CODE_ALWAYS_REQUIRED)) { $tdextra = ' class="fieldrequired titlefieldcreate"'; } - + print ''.$langs->trans("AccountancyCode").''; print ''; - + // Accountancy journal if (! empty($conf->accounting->enabled)) { print ''; print ''; } - + print '
        '; if (!empty($conf->accounting->enabled)) { - print $formaccountancy->select_account($object->account_number, 'account_number', 1, '', 1, 1); + print $formaccounting->select_account($object->account_number, 'account_number', 1, '', 1, 1); } else { print 'account_number).'">'; } print '
        '.$langs->trans("AccountancyJournal").''; - print $formaccountancy2->select_journal($object->fk_accountancy_journal, 'fk_accountancy_journal', 4, 1, '', 0, 0); + print $formaccounting->select_journal($object->fk_accountancy_journal, 'fk_accountancy_journal', 4, 1, '', 0, 0); print '
        '; - - + if ($_POST["type"] == Account::TYPE_SAVINGS || $_POST["type"] == Account::TYPE_CURRENT) { print '
        '; - + //print '
        '; - + print ''; // If bank account diff --git a/htdocs/compta/bank/various_payment/card.php b/htdocs/compta/bank/various_payment/card.php index 4875ac593c6..20c49c71468 100644 --- a/htdocs/compta/bank/various_payment/card.php +++ b/htdocs/compta/bank/various_payment/card.php @@ -26,7 +26,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/paymentvarious.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; -if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT.'/accountancy/class/html.formventilation.class.php'; +if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php'; if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT.'/accountancy/class/accountingaccount.class.php'; $langs->load("compta"); @@ -180,7 +180,7 @@ if ($action == 'delete') llxHeader("",$langs->trans("VariousPayment")); $form = new Form($db); -if (! empty($conf->accounting->enabled)) $formaccountancy = New FormVentilation($db); +if (! empty($conf->accounting->enabled)) $formaccounting = New FormAccounting($db); if ($id) { @@ -271,9 +271,9 @@ if ($action == 'create') { print ''; print ''; - } + } else // For external software { print ''; diff --git a/htdocs/core/class/html.formaccounting.class.php b/htdocs/core/class/html.formaccounting.class.php index 97f31f05e99..3ad3721c9d4 100644 --- a/htdocs/core/class/html.formaccounting.class.php +++ b/htdocs/core/class/html.formaccounting.class.php @@ -1,5 +1,9 @@ +/* Copyright (C) 2013-2016 Florian Henry + * Copyright (C) 2013-2014 Olivier Geffroy + * Copyright (C) 2015 Ari Elbaz (elarifr) + * Copyright (C) 2016 Marcos García + * Copyright (C) 2016-2017 Alexandre Spangaro * * 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 @@ -28,7 +32,7 @@ class FormAccounting extends Form { - private $options_cache = array(); + private $options_cache = array(); var $db; var $error; @@ -205,5 +209,261 @@ class FormAccounting extends Form print $out; } + + /** + * Return select filter with date of transaction + * + * @param string $htmlname Name of select field + * @param string $selectedkey Value + * @return string HTML edit field + */ + function select_bookkeeping_importkey($htmlname = 'importkey', $selectedkey = '') { + $options = array(); + + $sql = 'SELECT DISTINCT import_key from ' . MAIN_DB_PREFIX . 'accounting_bookkeeping'; + $sql .= " WHERE entity IN (" . getEntity("accountancy", 1) . ")"; + $sql .= ' ORDER BY import_key DESC'; + + dol_syslog(get_class($this) . "::select_bookkeeping_importkey", LOG_DEBUG); + $resql = $this->db->query($sql); + + if (!$resql) { + $this->error = "Error " . $this->db->lasterror(); + dol_syslog(get_class($this) . "::select_bookkeeping_importkey " . $this->error, LOG_ERR); + return - 1; + } + + while ($obj = $this->db->fetch_object($resql)) { + $options[$obj->import_key] = dol_print_date($obj->import_key, 'dayhourtext'); + } + + return Form::selectarray($htmlname, $options, $selectedkey); + } + + /** + * Return list of accounts with label by chart of accounts + * + * @param string $selectid Preselected id or code of accounting accounts (depends on $select_in) + * @param string $htmlname Name of field in html form + * @param int $showempty Add an empty field + * @param array $event Event options + * @param int $select_in 0=selectid value is a aa.rowid (default) or 1=selectid is aa.account_number + * @param int $select_out Set value returned by select. 0=rowid (default), 1=account_number + * @param string $morecss More css non HTML object + * @param string $usecache Key to use to store result into a cache. Next call with same key will reuse the cache. + * @return string String with HTML select + */ + function select_account($selectid, $htmlname = 'account', $showempty = 0, $event = array(), $select_in = 0, $select_out = 0, $morecss='maxwidth300 maxwidthonsmartphone', $usecache='') + { + global $conf; + + require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; + + $out = ''; + + $options = array(); + if ($usecache && ! empty($this->options_cache[$usecache])) + { + $options = $this->options_cache[$usecache]; + $selected=$selectid; + } + else + { + $trunclength = defined('ACCOUNTING_LENGTH_DESCRIPTION_ACCOUNT') ? $conf->global->ACCOUNTING_LENGTH_DESCRIPTION_ACCOUNT : 50; + + $sql = "SELECT DISTINCT aa.account_number, aa.label, aa.rowid, aa.fk_pcg_version"; + $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_account as aa"; + $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "accounting_system as asy ON aa.fk_pcg_version = asy.pcg_version"; + $sql .= " AND asy.rowid = " . $conf->global->CHARTOFACCOUNTS; + $sql .= " AND aa.active = 1"; + $sql .= " ORDER BY aa.account_number"; + + dol_syslog(get_class($this) . "::select_account", LOG_DEBUG); + $resql = $this->db->query($sql); + + if (!$resql) { + $this->error = "Error " . $this->db->lasterror(); + dol_syslog(get_class($this) . "::select_account " . $this->error, LOG_ERR); + return -1; + } + + $out .= ajax_combobox($htmlname, $event); + + $selected = 0; + while ($obj = $this->db->fetch_object($resql)) + { + $label = length_accountg($obj->account_number) . ' - ' . $obj->label; + $label = dol_trunc($label, $trunclength); + + $select_value_in = $obj->rowid; + $select_value_out = $obj->rowid; + + // Try to guess if we have found default value + if ($select_in == 1) { + $select_value_in = $obj->account_number; + } + if ($select_out == 1) { + $select_value_out = $obj->account_number; + } + // Remember guy's we store in database llx_facturedet the rowid of accounting_account and not the account_number + // Because same account_number can be share between different accounting_system and do have the same meaning + if ($selectid != '' && $selectid == $select_value_in) { + //var_dump("Found ".$selectid." ".$select_value_in); + $selected = $select_value_out; + } + + $options[$select_value_out] = $label; + } + $this->db->free($resql); + + if ($usecache) + { + $this->options_cache[$usecache] = $options; + } + } + + $out .= Form::selectarray($htmlname, $options, $selected, $showempty, 0, 0, '', 0, 0, 0, '', $morecss, 1); + + return $out; + } + + /** + * Return list of auxilary thirdparty accounts + * + * @param string $selectid Preselected pcg_type + * @param string $htmlname Name of field in html form + * @param int $showempty Add an empty field + * @param array $event Event options + * + * @return string String with HTML select + */ + function select_auxaccount($selectid, $htmlname = 'account_num_aux', $showempty = 0, $event = array()) { + + $aux_account = array(); + + // Auxiliary customer account + $sql = "SELECT DISTINCT code_compta, nom "; + $sql .= " FROM ".MAIN_DB_PREFIX."societe"; + $sql .= " WHERE entity IN (" . getEntity("societe", 1) . ")"; + $sql .= " ORDER BY code_compta"; + dol_syslog(get_class($this)."::select_auxaccount", LOG_DEBUG); + $resql = $this->db->query($sql); + if ($resql) { + while ($obj = $this->db->fetch_object($resql)) { + if (!empty($obj->code_compta)) { + $aux_account[$obj->code_compta] = $obj->code_compta.' ('.$obj->nom.')'; + } + } + } else { + $this->error = "Error ".$this->db->lasterror(); + dol_syslog(get_class($this)."::select_pcgsubtype ".$this->error, LOG_ERR); + return -1; + } + $this->db->free($resql); + + // Auxiliary supplier account + $sql = "SELECT DISTINCT code_compta_fournisseur, nom "; + $sql .= " FROM ".MAIN_DB_PREFIX."societe"; + $sql .= " WHERE entity IN (" . getEntity("societe", 1) . ")"; + $sql .= " ORDER BY code_compta_fournisseur"; + dol_syslog(get_class($this)."::select_auxaccount", LOG_DEBUG); + $resql = $this->db->query($sql); + if ($resql) { + while ($obj = $this->db->fetch_object($resql)) { + if (!empty($obj->code_compta_fournisseur)) { + $aux_account[$obj->code_compta_fournisseur] = $obj->code_compta_fournisseur.' ('.$obj->nom.')'; + } + } + } else { + $this->error = "Error ".$this->db->lasterror(); + dol_syslog(get_class($this)."::select_pcgsubtype ".$this->error, LOG_ERR); + return -1; + } + $this->db->free($resql); + + // Build select + $out = ajax_combobox($htmlname, $event); + $out .= Form::selectarray($htmlname, $aux_account, $selectid, $showempty, 0, 0, '', 0, 0, 0, '', 'maxwidth300'); + + return $out; + } + + /** + * Return HTML combo list of years existing into book keepping + * + * @param string $selected Preselected value + * @param string $htmlname Name of HTML select object + * @param int $useempty Affiche valeur vide dans liste + * @param string $output_format (html/opton (for option html only)/array (to return options arrays + * @return string/array + */ + function selectyear_accountancy_bookkepping($selected = '', $htmlname = 'yearid', $useempty = 0, $output_format = 'html') + { + global $conf; + + $out_array = array(); + + $sql = "SELECT DISTINCT date_format(doc_date,'%Y') as dtyear"; + $sql .= " FROM ".MAIN_DB_PREFIX."accounting_bookkeeping"; + $sql .= " WHERE entity IN (" . getEntity("accountancy", 1) . ")"; + $sql .= " ORDER BY date_format(doc_date,'%Y')"; + dol_syslog(get_class($this)."::".__METHOD__, LOG_DEBUG); + $resql = $this->db->query($sql); + + if (!$resql) { + $this->error = "Error ".$this->db->lasterror(); + dol_syslog(get_class($this)."::".__METHOD__.$this->error, LOG_ERR); + return -1; + } + while ($obj = $this->db->fetch_object($resql)) { + $out_array[$obj->dtyear] = $obj->dtyear; + } + $this->db->free($resql); + + if ($output_format == 'html') { + return Form::selectarray($htmlname, $out_array, $selected, $useempty, 0, 0, 'placeholder="aa"'); + } else { + return $out_array; + } + } + + /** + * Return HTML combo list of years existing into book keepping + * + * @param string $selected Preselected value + * @param string $htmlname Name of HTML select object + * @param int $useempty Affiche valeur vide dans liste + * @param string $output_format Html/option (for option html only)/array (to return options arrays + * @return string/array + */ + function selectjournal_accountancy_bookkepping($selected = '', $htmlname = 'journalid', $useempty = 0, $output_format = 'html') + { + global $conf,$langs; + + $out_array = array(); + + $sql = "SELECT DISTINCT code_journal"; + $sql .= " FROM ".MAIN_DB_PREFIX."accounting_bookkeeping"; + $sql .= " WHERE entity IN (" . getEntity("accountancy", 1) . ")"; + $sql .= " ORDER BY code_journal"; + dol_syslog(get_class($this)."::".__METHOD__, LOG_DEBUG); + $resql = $this->db->query($sql); + + if (!$resql) { + $this->error = "Error ".$this->db->lasterror(); + dol_syslog(get_class($this)."::".__METHOD__.$this->error, LOG_ERR); + return -1; + } + while ($obj = $this->db->fetch_object($resql)) { + $out_array[$obj->code_journal] = $obj->code_journal?$obj->code_journal:$langs->trans("NotDefined"); // TODO Not defined is accepted ? We should avoid this, shouldn't we ? + } + $this->db->free($resql); + + if ($output_format == 'html') { + return Form::selectarray($htmlname, $out_array, $selected, $useempty, 0, 0, 'placeholder="aa"'); + } else { + return $out_array; + } + } } diff --git a/htdocs/don/admin/donation.php b/htdocs/don/admin/donation.php index 2888b911700..c8d8be2461d 100644 --- a/htdocs/don/admin/donation.php +++ b/htdocs/don/admin/donation.php @@ -1,9 +1,9 @@ - * Copyright (C) 2012-2015 Juanjo Menent + * Copyright (C) 2012-2015 Juanjo Menent * Copyright (C) 2013-2017 Philippe Grand - * Copyright (C) 2015 Alexandre Spangaro - * Copyright (C) 2015 Benoit Bruchard + * Copyright (C) 2015-2017 Alexandre Spangaro + * Copyright (C) 2015 Benoit Bruchard * * 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 @@ -29,7 +29,7 @@ require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/donation.lib.php'; require_once DOL_DOCUMENT_ROOT . '/don/class/don.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php'; -if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/accountancy/class/html.formventilation.class.php'; +if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT . '/core/class/html.formaccounting.class.php'; $langs->load("admin"); $langs->load("donations"); @@ -199,7 +199,7 @@ else if ($action == 'setart885') { $dir = "../../core/modules/dons/"; $form=new Form($db); -if (! empty($conf->accounting->enabled)) $formaccountancy = New FormVentilation($db); +if (! empty($conf->accounting->enabled)) $formaccounting = New FormAccounting($db); llxHeader('',$langs->trans("DonationsSetup"),'DonConfiguration'); $linkback=''.$langs->trans("BackToModuleList").''; @@ -364,7 +364,7 @@ print ''; print ''; print ''; print "\n"; - + print ''; print ''; if (! empty($conf->global->DONATION_ART200)) { @@ -414,7 +414,7 @@ if (preg_match('/fr/i',$conf->global->MAIN_INFO_SOCIETE_COUNTRY)) print ''; } print ''; - + print ''; print ''; if (! empty($conf->global->DONATION_ART238)) { @@ -427,7 +427,7 @@ if (preg_match('/fr/i',$conf->global->MAIN_INFO_SOCIETE_COUNTRY)) print ''; } print ''; - + print ''; print ''; if (! empty($conf->global->DONATION_ART885)) { diff --git a/htdocs/loan/card.php b/htdocs/loan/card.php index b58bfb929d9..81d43e46ab0 100644 --- a/htdocs/loan/card.php +++ b/htdocs/loan/card.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2014-2017 Alexandre Spangaro * Copyright (C) 2015 Frederic France * * This program is free software; you can redistribute it and/or modify @@ -27,7 +27,7 @@ require_once DOL_DOCUMENT_ROOT.'/loan/class/loan.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/loan.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; -if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT.'/accountancy/class/html.formventilation.class.php'; +if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php'; require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; @@ -235,7 +235,7 @@ if (empty($reshook)) $form = new Form($db); $formproject = new FormProjets($db); -if (! empty($conf->accounting->enabled)) $formaccountancy = New FormVentilation($db); +if (! empty($conf->accounting->enabled)) $formaccounting = New FormAccounting($db); $title = $langs->trans("Loan") . ' - ' . $langs->trans("Card"); $help_url = 'EN:Module_Loan|FR:Module_Emprunt'; @@ -337,19 +337,19 @@ if ($action == 'create') // Accountancy_account_capital print ''; print ''; // Accountancy_account_insurance print ''; print ''; // Accountancy_account_interest print ''; print ''; } else // For external software @@ -541,7 +541,7 @@ if ($id > 0) { if (! empty($conf->accounting->enabled)) { - print $formaccountancy->select_account($object->account_capital, 'accountancy_account_capital', 1, '', 0, 1); + print $formaccounting->select_account($object->account_capital, 'accountancy_account_capital', 1, '', 0, 1); } else { @@ -566,7 +566,7 @@ if ($id > 0) { if (! empty($conf->accounting->enabled)) { - print $formaccountancy->select_account($object->account_insurance, 'accountancy_account_insurance', 1, '', 0, 1); + print $formaccounting->select_account($object->account_insurance, 'accountancy_account_insurance', 1, '', 0, 1); } else { @@ -591,7 +591,7 @@ if ($id > 0) { if (! empty($conf->accounting->enabled)) { - print $formaccountancy->select_account($object->account_interest, 'accountancy_account_interest', 1, '', 0, 1); + print $formaccounting->select_account($object->account_interest, 'accountancy_account_interest', 1, '', 0, 1); } else { diff --git a/htdocs/product/card.php b/htdocs/product/card.php index 7cd86404afa..2869e0f557c 100644 --- a/htdocs/product/card.php +++ b/htdocs/product/card.php @@ -52,7 +52,7 @@ if (! empty($conf->propal->enabled)) require_once DOL_DOCUMENT_ROOT.'/comm/p if (! empty($conf->facture->enabled)) require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; if (! empty($conf->commande->enabled)) require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php'; if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT.'/core/lib/accounting.lib.php'; -if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT.'/accountancy/class/html.formventilation.class.php'; +if (! empty($conf->accounting->enabled)) require_once DOL_DOCUMENT_ROOT.'/core/class/html.formaccounting.class.php'; $langs->load("products"); $langs->load("other"); @@ -808,7 +808,7 @@ llxHeader('', $title, $helpurl); $form = new Form($db); $formfile = new FormFile($db); $formproduct = new FormProduct($db); -if (! empty($conf->accounting->enabled)) $formaccountancy = New FormVentilation($db); +if (! empty($conf->accounting->enabled)) $formaccounting = New FormAccounting($db); // Load object modBarCodeProduct $res=0; @@ -1113,13 +1113,13 @@ else // Accountancy_code_sell print ''; print ''; // Accountancy_code_buy print ''; print ''; } else // For external software @@ -1406,15 +1406,15 @@ else // Accountancy_code_sell print ''; print ''; // Accountancy_code_buy print ''; print ''; - } + } else // For external software { // Accountancy_code_sell From e4f5d45c4593dad2b2b39834844fec8369548715 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Thu, 25 May 2017 07:10:09 +0200 Subject: [PATCH 256/299] Remove old code (selectjournal_accountancy_bookkepping) --- htdocs/accountancy/bookkeeping/list.php | 2 +- .../core/class/html.formaccounting.class.php | 39 ------------------- 2 files changed, 1 insertion(+), 40 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index a955d671475..369dd7afcec 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -322,7 +322,7 @@ if ($action == 'delbookkeepingyear') { $delyear = dol_print_date(dol_now(), '%Y'); } $year_array = $formaccounting->selectyear_accountancy_bookkepping($delyear, 'delyear', 0, 'array'); - $journal_array = $formaccounting->selectjournal_accountancy_bookkepping($deljournal, 'deljournal', 0, 'array'); + $journal_array = $formaccounting->selectjournal($deljournal, 'deljournal', '', 1, 'array', 1, 1); $form_question['delyear'] = array ( 'name' => 'delyear', diff --git a/htdocs/core/class/html.formaccounting.class.php b/htdocs/core/class/html.formaccounting.class.php index 3ad3721c9d4..f3db5777783 100644 --- a/htdocs/core/class/html.formaccounting.class.php +++ b/htdocs/core/class/html.formaccounting.class.php @@ -426,44 +426,5 @@ class FormAccounting extends Form return $out_array; } } - - /** - * Return HTML combo list of years existing into book keepping - * - * @param string $selected Preselected value - * @param string $htmlname Name of HTML select object - * @param int $useempty Affiche valeur vide dans liste - * @param string $output_format Html/option (for option html only)/array (to return options arrays - * @return string/array - */ - function selectjournal_accountancy_bookkepping($selected = '', $htmlname = 'journalid', $useempty = 0, $output_format = 'html') - { - global $conf,$langs; - - $out_array = array(); - - $sql = "SELECT DISTINCT code_journal"; - $sql .= " FROM ".MAIN_DB_PREFIX."accounting_bookkeeping"; - $sql .= " WHERE entity IN (" . getEntity("accountancy", 1) . ")"; - $sql .= " ORDER BY code_journal"; - dol_syslog(get_class($this)."::".__METHOD__, LOG_DEBUG); - $resql = $this->db->query($sql); - - if (!$resql) { - $this->error = "Error ".$this->db->lasterror(); - dol_syslog(get_class($this)."::".__METHOD__.$this->error, LOG_ERR); - return -1; - } - while ($obj = $this->db->fetch_object($resql)) { - $out_array[$obj->code_journal] = $obj->code_journal?$obj->code_journal:$langs->trans("NotDefined"); // TODO Not defined is accepted ? We should avoid this, shouldn't we ? - } - $this->db->free($resql); - - if ($output_format == 'html') { - return Form::selectarray($htmlname, $out_array, $selected, $useempty, 0, 0, 'placeholder="aa"'); - } else { - return $out_array; - } - } } From db6d7d9e21c63669241dfdcf3989fbce594460fa Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Thu, 25 May 2017 07:15:36 +0200 Subject: [PATCH 257/299] Spaces --- .../accountancy/class/bookkeeping.class.php | 114 +++++++++--------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/htdocs/accountancy/class/bookkeeping.class.php b/htdocs/accountancy/class/bookkeeping.class.php index a59d92eb63a..c885d6228cb 100644 --- a/htdocs/accountancy/class/bookkeeping.class.php +++ b/htdocs/accountancy/class/bookkeeping.class.php @@ -1053,23 +1053,23 @@ class BookKeeping extends CommonObject */ function deleteByYearAndJournal($delyear='', $journal='') { global $conf; - + if (empty($delyear) && empty($journal)) { return -1; } - + $this->db->begin(); - + // first check if line not yet in bookkeeping $sql = "DELETE"; $sql.= " FROM " . MAIN_DB_PREFIX . $this->table_element; $sql.= " WHERE 1 = 1"; if (! empty($delyear)) $sql.= " AND YEAR(doc_date) = " . $delyear; // FIXME Must use between if (! empty($journal)) $sql.= " AND code_journal = '".$journal."'"; - $sql .= " AND entity IN (" . getEntity("accountancy", 1) . ")"; + $sql .= " AND entity IN (" . getEntity("accountancy", 1) . ")"; $resql = $this->db->query($sql); - + if (! $resql) { $this->errors[] = "Error " . $this->db->lasterror(); foreach ( $this->errors as $errmsg ) { @@ -1083,7 +1083,7 @@ class BookKeeping extends CommonObject $this->db->commit(); return 1; } - + /** * Delete bookkepping by piece number * @@ -1092,17 +1092,17 @@ class BookKeeping extends CommonObject */ function deleteMvtNum($piecenum) { global $conf; - + $this->db->begin(); // first check if line not yet in bookkeeping $sql = "DELETE"; $sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element; $sql .= " WHERE piece_num = " . $piecenum; - $sql .= " AND entity IN (" . getEntity("accountancy", 1) . ")"; - + $sql .= " AND entity IN (" . getEntity("accountancy", 1) . ")"; + $resql = $this->db->query($sql); - + if (! $resql) { $this->errors[] = "Error " . $this->db->lasterror(); foreach ( $this->errors as $errmsg ) { @@ -1116,7 +1116,7 @@ class BookKeeping extends CommonObject $this->db->commit(); return 1; } - + /** * Load an object from its id and create a new one in database * @@ -1130,27 +1130,27 @@ class BookKeeping extends CommonObject global $user; $error = 0; $object = new Accountingbookkeeping($this->db); - + $this->db->begin(); - + // Load source object $object->fetch($fromid); // Reset object $object->id = 0; - + // Clear fields // ... - + // Create clone $result = $object->create($user); - + // Other options if ($result < 0) { $error ++; $this->errors = $object->errors; dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR); } - + // End if (! $error) { $this->db->commit(); @@ -1158,11 +1158,11 @@ class BookKeeping extends CommonObject return $object->id; } else { $this->db->rollback(); - + return - 1; } } - + /** * Initialise object with example values * Id must be 0 if object instance is a specimen @@ -1171,9 +1171,9 @@ class BookKeeping extends CommonObject */ public function initAsSpecimen() { global $user; - + $now=dol_now(); - + $this->id = 0; $this->doc_date = $now; $this->doc_type = ''; @@ -1192,7 +1192,7 @@ class BookKeeping extends CommonObject $this->code_journal = ''; $this->piece_num = ''; } - + /** * Load an accounting document into memory from database * @@ -1201,17 +1201,17 @@ class BookKeeping extends CommonObject */ public function fetchPerMvt($piecenum) { global $conf; - - $sql = "SELECT piece_num,doc_date,code_journal,doc_ref,doc_type"; + + $sql = "SELECT piece_num,doc_date,code_journal,doc_ref,doc_type"; $sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element; $sql .= " WHERE piece_num = " . $piecenum; - $sql .= " AND entity IN (" . getEntity("accountancy", 1) . ")"; - + $sql .= " AND entity IN (" . getEntity("accountancy", 1) . ")"; + dol_syslog(get_class($this) . "::" . __METHOD__, LOG_DEBUG); $result = $this->db->query($sql); if ($result) { $obj = $this->db->fetch_object($result); - + $this->piece_num = $obj->piece_num; $this->code_journal = $obj->code_journal; $this->doc_date = $this->db->jdate($obj->doc_date); @@ -1222,10 +1222,10 @@ class BookKeeping extends CommonObject dol_syslog(get_class($this) . "::" . __METHOD__ . $this->error, LOG_ERR); return - 1; } - + return 1; } - + /** * Return next number movement * @@ -1233,8 +1233,8 @@ class BookKeeping extends CommonObject */ public function getNextNumMvt() { - global $conf; - + global $conf; + $sql = "SELECT MAX(piece_num)+1 as max FROM " . MAIN_DB_PREFIX . $this->table_element; $sql .= " WHERE entity IN (" . getEntity("accountancy", 1) . ")"; @@ -1243,16 +1243,16 @@ class BookKeeping extends CommonObject if ($result) { $obj = $this->db->fetch_object($result); - if ($obj) $result = $obj->max; - if (empty($result)) $result = 1; - return $result; + if ($obj) $result = $obj->max; + if (empty($result)) $result = 1; + return $result; } else { $this->error = "Error " . $this->db->lasterror(); dol_syslog(get_class($this) . "::getNextNumMvt " . $this->error, LOG_ERR); return - 1; } } - + /** * Load all informations of accountancy document * @@ -1260,26 +1260,26 @@ class BookKeeping extends CommonObject * @return int <0 if KO, >0 if OK */ function fetch_all_per_mvt($piecenum) { - global $conf; - + global $conf; + $sql = "SELECT rowid, doc_date, doc_type,"; $sql .= " doc_ref, fk_doc, fk_docdet, code_tiers,"; $sql .= " numero_compte, label_compte, debit, credit,"; $sql .= " montant, sens, fk_user_author, import_key, code_journal, piece_num"; $sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element; $sql .= " WHERE piece_num = " . $piecenum; - $sql .= " AND entity IN (" . getEntity("accountancy", 1) . ")"; - + $sql .= " AND entity IN (" . getEntity("accountancy", 1) . ")"; + dol_syslog(get_class($this) . "::" . __METHOD__, LOG_DEBUG); $result = $this->db->query($sql); if ($result) { - + while ( $obj = $this->db->fetch_object($result) ) { - + $line = new BookKeepingLine(); - + $line->id = $obj->rowid; - + $line->doc_date = $this->db->jdate($obj->doc_date); $line->doc_type = $obj->doc_type; $line->doc_ref = $obj->doc_ref; @@ -1294,7 +1294,7 @@ class BookKeeping extends CommonObject $line->sens = $obj->sens; $line->code_journal = $obj->code_journal; $line->piece_num = $obj->piece_num; - + $this->linesmvt[] = $line; } } else { @@ -1302,10 +1302,10 @@ class BookKeeping extends CommonObject dol_syslog(get_class($this) . "::" . __METHOD__ . $this->error, LOG_ERR); return - 1; } - + return 1; } - + /** * Export bookkeping * @@ -1313,28 +1313,28 @@ class BookKeeping extends CommonObject * @return int Result */ function export_bookkeping($model = 'ebp') { - global $conf; - + global $conf; + $sql = "SELECT rowid, doc_date, doc_type,"; $sql .= " doc_ref, fk_doc, fk_docdet, code_tiers,"; $sql .= " numero_compte, label_compte, debit, credit,"; $sql .= " montant, sens, fk_user_author, import_key, code_journal, piece_num"; $sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element; - $sql .= " WHERE entity IN (" . getEntity("accountancy", 1) . ")"; - + $sql .= " WHERE entity IN (" . getEntity("accountancy", 1) . ")"; + dol_syslog(get_class($this) . "::export_bookkeping", LOG_DEBUG); - + $resql = $this->db->query($sql); - + if ($resql) { $this->linesexport = array (); - + $num = $this->db->num_rows($resql); while ( $obj = $this->db->fetch_object($resql) ) { $line = new BookKeepingLine(); - + $line->id = $obj->rowid; - + $line->doc_date = $this->db->jdate($obj->doc_date); $line->doc_type = $obj->doc_type; $line->doc_ref = $obj->doc_ref; @@ -1349,11 +1349,11 @@ class BookKeeping extends CommonObject $line->sens = $obj->sens; $line->code_journal = $obj->code_journal; $line->piece_num = $obj->piece_num; - + $this->linesexport[] = $line; } $this->db->free($resql); - + return $num; } else { $this->error = "Error " . $this->db->lasterror(); From b0bac770e555864c01539a7b760321920ac93504 Mon Sep 17 00:00:00 2001 From: BENKE Charlie Date: Thu, 25 May 2017 08:07:11 +0200 Subject: [PATCH 258/299] menu descriptor must be only present in main If we add the same menu descriptor the additionnal menu are added on the second, not the main I propose to suppress it OR change "customers_bills" as "customers_bills_list" who allow to add some menu as sub-menu --- htdocs/core/menus/standard/eldy.lib.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index 521fd6831f2..25ab9e9c154 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -802,7 +802,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu $langs->load("bills"); $newmenu->add("/compta/facture/list.php?leftmenu=customers_bills",$langs->trans("BillsCustomers"),0,$user->rights->facture->lire, '', $mainmenu, 'customers_bills'); $newmenu->add("/compta/facture/card.php?action=create",$langs->trans("NewBill"),1,$user->rights->facture->creer); - $newmenu->add("/compta/facture/list.php?leftmenu=customers_bills",$langs->trans("List"),1,$user->rights->facture->lire, '', $mainmenu, 'customers_bills'); + $newmenu->add("/compta/facture/list.php?leftmenu=customers_bills",$langs->trans("List"),1,$user->rights->facture->lire); if ($usemenuhider || empty($leftmenu) || preg_match('/customers_bills/', $leftmenu)) { @@ -830,7 +830,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu $langs->load("bills"); $newmenu->add("/fourn/facture/list.php?leftmenu=suppliers_bills", $langs->trans("BillsSuppliers"),0,$user->rights->fournisseur->facture->lire, '', $mainmenu, 'suppliers_bills'); $newmenu->add("/fourn/facture/card.php?action=create",$langs->trans("NewBill"),1,$user->rights->fournisseur->facture->creer); - $newmenu->add("/fourn/facture/list.php?leftmenu=suppliers_bills", $langs->trans("List"),1,$user->rights->fournisseur->facture->lire, '', $mainmenu, 'suppliers_bills'); + $newmenu->add("/fourn/facture/list.php?leftmenu=suppliers_bills", $langs->trans("List"),1,$user->rights->fournisseur->facture->lire); if ($usemenuhider || empty($leftmenu) || preg_match('/suppliers_bills/', $leftmenu)) { $newmenu->add("/fourn/facture/list.php?leftmenu=suppliers_bills_draft&search_status=0", $langs->trans("BillShortStatusDraft"),2,$user->rights->fournisseur->facture->lire, '', $mainmenu, 'suppliers_bills_draft'); From 18886849eb87d7f63c9bf5df2de060b4587a6247 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Thu, 25 May 2017 08:48:59 +0200 Subject: [PATCH 259/299] New: add REST api "memberstypes" --- .../adherents/class/adherent_type.class.php | 25 +- .../class/api_memberstypes.class.php | 322 ++++++++++++++++++ htdocs/adherents/type.php | 68 ++-- htdocs/core/class/html.form.class.php | 54 +-- htdocs/core/lib/functions.lib.php | 108 +++--- 5 files changed, 455 insertions(+), 122 deletions(-) create mode 100644 htdocs/adherents/class/api_memberstypes.class.php diff --git a/htdocs/adherents/class/adherent_type.class.php b/htdocs/adherents/class/adherent_type.class.php index d6ee9958162..a7775332812 100644 --- a/htdocs/adherents/class/adherent_type.class.php +++ b/htdocs/adherents/class/adherent_type.class.php @@ -1,8 +1,8 @@ - * Copyright (C) 2004-2008 Laurent Destailleur - * Copyright (C) 2009 Regis Houssin - * Copyright (C) 2016 Charlie Benke +/* Copyright (C) 2002 Rodolphe Quiedeville + * Copyright (C) 2004-2008 Laurent Destailleur + * Copyright (C) 2009-2017 Regis Houssin + * Copyright (C) 2016 Charlie Benke * * 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 @@ -36,7 +36,13 @@ class AdherentType extends CommonObject public $table_element = 'adherent_type'; public $element = 'adherent_type'; public $picto = 'group'; - + + /** + * @var string + * @deprecated Use label + * @see label + */ + public $libelle; /** @var string Label */ public $label; /** @@ -81,12 +87,13 @@ class AdherentType extends CommonObject global $conf; $this->statut=(int) $this->statut; + $this->label=(!empty($this->libelle)?trim($this->libelle):trim($this->label)); $sql = "INSERT INTO ".MAIN_DB_PREFIX."adherent_type ("; $sql.= "libelle"; $sql.= ", entity"; $sql.= ") VALUES ("; - $sql.= "'".$this->db->escape($this->libelle)."'"; + $sql.= "'".$this->db->escape($this->label)."'"; $sql.= ", ".$conf->entity; $sql.= ")"; @@ -117,12 +124,12 @@ class AdherentType extends CommonObject $error=0; - $this->libelle=trim($this->libelle); + $this->label=(!empty($this->libelle)?trim($this->libelle):trim($this->label)); $sql = "UPDATE ".MAIN_DB_PREFIX."adherent_type "; $sql.= "SET "; $sql.= "statut = ".$this->statut.","; - $sql.= "libelle = '".$this->db->escape($this->libelle) ."',"; + $sql.= "libelle = '".$this->db->escape($this->label) ."',"; $sql.= "subscription = '".$this->db->escape($this->subscription)."',"; $sql.= "note = '".$this->db->escape($this->note)."',"; $sql.= "vote = '".$this->db->escape($this->vote)."',"; @@ -307,7 +314,7 @@ class AdherentType extends CommonObject { return ''; } - + /** * getMailOnValid * diff --git a/htdocs/adherents/class/api_memberstypes.class.php b/htdocs/adherents/class/api_memberstypes.class.php new file mode 100644 index 00000000000..18c828eb9e5 --- /dev/null +++ b/htdocs/adherents/class/api_memberstypes.class.php @@ -0,0 +1,322 @@ + + * + * 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 3 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 . + */ + +use Luracast\Restler\RestException; + +require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php'; + +/** + * API class for members types + * + * @access protected + * @class DolibarrApiAccess {@requires user,external} + */ +class MembersTypes extends DolibarrApi +{ + /** + * @var array $FIELDS Mandatory fields, checked when create and update object + */ + static $FIELDS = array( + 'label' + ); + + /** + * Constructor + */ + function __construct() + { + global $db, $conf; + $this->db = $db; + } + + /** + * Get properties of a member type object + * + * Return an array with member type informations + * + * @param int $id ID of member type + * @return array|mixed data without useless information + * + * @throws RestException + */ + function get($id) + { + if(! DolibarrApiAccess::$user->rights->adherent->lire) { + throw new RestException(401); + } + + $membertype = new AdherentType($this->db); + $result = $membertype->fetch($id); + if( ! $result ) { + throw new RestException(404, 'member type not found'); + } + + if( ! DolibarrApi::_checkAccessToResource('member',$membertype->id,'adherent_type')) { + throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); + } + + return $this->_cleanObjectDatas($membertype); + } + + /** + * List members types + * + * Get a list of members types + * + * @param string $sortfield Sort field + * @param string $sortorder Sort order + * @param int $limit Limit for list + * @param int $page Page number + * @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.libelle:like:'SO-%') and (t.subscription:=:'1')" + * @return array Array of member type objects + * + * @throws RestException + */ + function index($sortfield = "t.rowid", $sortorder = 'ASC', $limit = 0, $page = 0, $sqlfilters = '') { + global $db, $conf; + + $obj_ret = array(); + + if(! DolibarrApiAccess::$user->rights->adherent->lire) { + throw new RestException(401); + } + + $sql = "SELECT t.rowid"; + $sql.= " FROM ".MAIN_DB_PREFIX."adherent_type as t"; + $sql.= ' WHERE t.entity IN ('.getEntity('adherent', 1).')'; + + // Add sql filters + if ($sqlfilters) + { + if (! DolibarrApi::_checkFilters($sqlfilters)) + { + throw new RestException(503, 'Error when validating parameter sqlfilters '.$sqlfilters); + } + $regexstring='\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)'; + $sql.=" AND (".preg_replace_callback('/'.$regexstring.'/', 'DolibarrApi::_forge_criteria_callback', $sqlfilters).")"; + } + + $sql.= $db->order($sortfield, $sortorder); + if ($limit) { + if ($page < 0) + { + $page = 0; + } + $offset = $limit * $page; + + $sql.= $db->plimit($limit + 1, $offset); + } + + $result = $db->query($sql); + if ($result) + { + $i=0; + $num = $db->num_rows($result); + $min = min($num, ($limit <= 0 ? $num : $limit)); + while ($i < $min) + { + $obj = $db->fetch_object($result); + $membertype = new AdherentType($this->db); + if ($membertype->fetch($obj->rowid)) { + $obj_ret[] = $this->_cleanObjectDatas($membertype); + } + $i++; + } + } + else { + throw new RestException(503, 'Error when retrieve member type list : '.$db->lasterror()); + } + if ( ! count($obj_ret)) { + throw new RestException(404, 'No member type found'); + } + + return $obj_ret; + } + + /** + * Create member type object + * + * @param array $request_data Request data + * @return int ID of member type + */ + function post($request_data = null) + { + if (! DolibarrApiAccess::$user->rights->adherent->configurer) { + throw new RestException(401); + } + // Check mandatory fields + $result = $this->_validate($request_data); + + $membertype = new AdherentType($this->db); + foreach($request_data as $field => $value) { + $membertype->$field = $value; + } + if ($membertype->create(DolibarrApiAccess::$user) < 0) { + throw new RestException(500, 'Error creating member type', array_merge(array($membertype->error), $membertype->errors)); + } + return $membertype->id; + } + + /** + * Update member type + * + * @param int $id ID of member type to update + * @param array $request_data Datas + * @return int + */ + function put($id, $request_data = null) + { + if (! DolibarrApiAccess::$user->rights->adherent->configurer) { + throw new RestException(401); + } + + $membertype = new AdherentType($this->db); + $result = $membertype->fetch($id); + if( ! $result ) { + throw new RestException(404, 'member type not found'); + } + + if( ! DolibarrApi::_checkAccessToResource('member',$membertype->id,'adherent_type')) { + throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); + } + + foreach($request_data as $field => $value) { + if ($field == 'id') continue; + // Process the status separately because it must be updated using + // the validate() and resiliate() methods of the class AdherentType. + $membertype->$field = $value; + } + + // If there is no error, update() returns the number of affected rows + // so if the update is a no op, the return value is zero. + if ($membertype->update(DolibarrApiAccess::$user) >= 0) + return $this->get($id); + + return false; + } + + /** + * Delete member type + * + * @param int $id member type ID + * @return array + */ + function delete($id) + { + if (! DolibarrApiAccess::$user->rights->adherent->configurer) { + throw new RestException(401); + } + $membertype = new AdherentType($this->db); + $result = $membertype->fetch($id); + if( ! $result ) { + throw new RestException(404, 'member type not found'); + } + + if ( ! DolibarrApi::_checkAccessToResource('member',$membertype->id,'adherent_type')) { + throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); + } + + if (! $membertype->delete($membertype->id)) { + throw new RestException(401,'error when deleting member type'); + } + + return array( + 'success' => array( + 'code' => 200, + 'message' => 'member type deleted' + ) + ); + } + + /** + * Validate fields before creating an object + * + * @param array|null $data Data to validate + * @return array + * + * @throws RestException + */ + function _validate($data) + { + $membertype = array(); + foreach (MembersTypes::$FIELDS as $field) { + if (!isset($data[$field])) + throw new RestException(400, "$field field missing"); + $membertype[$field] = $data[$field]; + } + return $membertype; + } + + /** + * Clean sensible object datas + * + * @param object $object Object to clean + * @return array Array of cleaned object properties + */ + function _cleanObjectDatas($object) { + + $object = parent::_cleanObjectDatas($object); + + unset($object->cotisation); + unset($object->libelle); + + unset($object->import_key); + unset($object->array_options); + unset($object->linkedObjectsIds); + unset($object->context); + unset($object->canvas); + unset($object->fk_project); + unset($object->contact); + unset($object->contact_id); + unset($object->thirdparty); + unset($object->user); + unset($object->origin); + unset($object->origin_id); + unset($object->ref_ext); + unset($object->country); + unset($object->country_id); + unset($object->country_code); + unset($object->barcode_type); + unset($object->barcode_type_code); + unset($object->barcode_type_label); + unset($object->barcode_type_coder); + unset($object->mode_reglement_id); + unset($object->cond_reglement_id); + unset($object->cond_reglement); + unset($object->fk_delivery_address); + unset($object->shipping_method_id); + unset($object->modelpdf); + unset($object->fk_account); + unset($object->note_public); + unset($object->note_private); + unset($object->fk_incoterms); + unset($object->libelle_incoterms); + unset($object->location_incoterms); + unset($object->name); + unset($object->lastname); + unset($object->firstname); + unset($object->civility_id); + unset($object->total_ht); + unset($object->total_tva); + unset($object->total_localtax1); + unset($object->total_localtax2); + unset($object->total_ttc); + + return $object; + } + +} diff --git a/htdocs/adherents/type.php b/htdocs/adherents/type.php index 083ab4bda3b..31a40e96669 100644 --- a/htdocs/adherents/type.php +++ b/htdocs/adherents/type.php @@ -1,10 +1,10 @@ - * Copyright (C) 2003 Jean-Louis Bergamo - * Copyright (C) 2004-2011 Laurent Destailleur - * Copyright (C) 2005-2012 Regis Houssin - * Copyright (C) 2013 Florian Henry - * Copyright (C) 2015 Alexandre Spangaro +/* Copyright (C) 2001-2002 Rodolphe Quiedeville + * Copyright (C) 2003 Jean-Louis Bergamo + * Copyright (C) 2004-2011 Laurent Destailleur + * Copyright (C) 2005-2017 Regis Houssin + * Copyright (C) 2013 Florian Henry + * Copyright (C) 2015 Alexandre Spangaro * * 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 @@ -55,7 +55,7 @@ $pagenext = $page + 1; if (! $sortorder) { $sortorder="DESC"; } if (! $sortfield) { $sortfield="d.lastname"; } -$label=GETPOST("libelle","alpha"); +$label=GETPOST("label","alpha"); $subscription=GETPOST("subscription","int"); $vote=GETPOST("vote","int"); $comment=GETPOST("comment"); @@ -93,17 +93,17 @@ if ($action == 'add' && $user->rights->adherent->configurer) { $object = new AdherentType($db); - $object->libelle = trim($label); - $object->subscription = (int) trim($subscription); - $object->note = trim($comment); - $object->mail_valid = (boolean) trim($mail_valid); - $object->vote = (boolean) trim($vote); + $object->label = trim($label); + $object->subscription = (int) trim($subscription); + $object->note = trim($comment); + $object->mail_valid = (boolean) trim($mail_valid); + $object->vote = (boolean) trim($vote); // Fill array 'array_options' with data from add form $ret = $extrafields->setOptionalsFromPost($extralabels,$object); if ($ret < 0) $error++; - if ($object->libelle) + if ($object->label) { $id=$object->create($user); if ($id > 0) @@ -131,7 +131,7 @@ if ($action == 'update' && $user->rights->adherent->configurer) { $object = new AdherentType($db); $object->id = $rowid; - $object->libelle = trim($label); + $object->label = trim($label); $object->subscription = (int) trim($subscription); $object->note = trim($comment); $object->mail_valid = (boolean) trim($mail_valid); @@ -171,7 +171,7 @@ if (! $rowid && $action != 'create' && $action != 'edit') { //dol_fiche_head(''); - $sql = "SELECT d.rowid, d.libelle, d.subscription, d.vote"; + $sql = "SELECT d.rowid, d.libelle as label, d.subscription, d.vote"; $sql.= " FROM ".MAIN_DB_PREFIX."adherent_type as d"; $sql.= " WHERE d.entity IN (".getEntity().")"; @@ -180,11 +180,11 @@ if (! $rowid && $action != 'create' && $action != 'edit') { $num = $db->num_rows($result); $nbtotalofrecords = $num; - + $i = 0; $param = ''; - + print ''; if ($optioncss != '') print ''; print ''; @@ -193,14 +193,14 @@ if (! $rowid && $action != 'create' && $action != 'edit') print ''; print ''; print ''; - + print_barre_liste($langs->trans("MembersTypes"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_generic.png', 0, '', '', $limit); - + $moreforfilter = ''; - + print '
        '; print '
        '.$langs->trans("AccountAccounting").''; - print $formaccountancy->select_account($accountancy_code, 'accountancy_code', 1, null, 1, 1, ''); + print $formaccounting->select_account($accountancy_code, 'accountancy_code', 1, null, 1, 1, ''); print '
        '.$langs->trans("AccountAccounting").''; if (! empty($conf->accounting->enabled)) { - print $formaccountancy->select_account($conf->global->DONATION_ACCOUNTINGACCOUNT, 'DONATION_ACCOUNTINGACCOUNT', 1, '', 1, 1); + print $formaccounting->select_account($conf->global->DONATION_ACCOUNTINGACCOUNT, 'DONATION_ACCOUNTINGACCOUNT', 1, '', 1, 1); } else { @@ -401,7 +401,7 @@ if (preg_match('/fr/i',$conf->global->MAIN_INFO_SOCIETE_COUNTRY)) print '
        ' . $langs->trans('Parameters') . '
        ' . $langs->trans("DONATION_ART200") . '
        ' . $langs->trans("DONATION_ART238") . '
        ' . $langs->trans("DONATION_ART885") . '
        '.$langs->trans("LoanAccountancyCapitalCode").''; - print $formaccountancy->select_account($object->accountancy_account_capital, 'accountancy_account_capital', 1, '', 0, 1); + print $formaccounting->select_account($object->accountancy_account_capital, 'accountancy_account_capital', 1, '', 0, 1); print '
        '.$langs->trans("LoanAccountancyInsuranceCode").''; - print $formaccountancy->select_account($object->accountancy_account_insurance, 'accountancy_account_insurance', 1, '', 0, 1); + print $formaccounting->select_account($object->accountancy_account_insurance, 'accountancy_account_insurance', 1, '', 0, 1); print '
        '.$langs->trans("LoanAccountancyInterestCode").''; - print $formaccountancy->select_account($object->accountancy_account_interest, 'accountancy_account_interest', 1, '', 0, 1); + print $formaccounting->select_account($object->accountancy_account_interest, 'accountancy_account_interest', 1, '', 0, 1); print '
        '.$langs->trans("ProductAccountancySellCode").''; - print $formaccountancy->select_account(GETPOST('accountancy_code_sell'), 'accountancy_code_sell', 1, null, 1, 1, ''); + print $formaccounting->select_account(GETPOST('accountancy_code_sell'), 'accountancy_code_sell', 1, null, 1, 1, ''); print '
        '.$langs->trans("ProductAccountancyBuyCode").''; - print $formaccountancy->select_account(GETPOST('accountancy_code_buy'), 'accountancy_code_buy', 1, null, 1, 1, ''); + print $formaccounting->select_account(GETPOST('accountancy_code_buy'), 'accountancy_code_buy', 1, null, 1, 1, ''); print '
        '.$langs->trans("ProductAccountancySellCode").''; - print $formaccountancy->select_account($object->accountancy_code_sell, 'accountancy_code_sell', 1, '', 1, 1); + print $formaccounting->select_account($object->accountancy_code_sell, 'accountancy_code_sell', 1, '', 1, 1); print '
        '.$langs->trans("ProductAccountancyBuyCode").''; - print $formaccountancy->select_account($object->accountancy_code_buy, 'accountancy_code_buy', 1, '', 1, 1); + print $formaccounting->select_account($object->accountancy_code_buy, 'accountancy_code_buy', 1, '', 1, 1); print '
        '."\n"; - + print ''; print ''; print ''; @@ -214,7 +214,7 @@ if (! $rowid && $action != 'create' && $action != 'edit') $objp = $db->fetch_object($result); print ''; print ''; - print ''; + print ''; print ''; print ''; if ($user->rights->adherent->configurer) @@ -226,7 +226,7 @@ if (! $rowid && $action != 'create' && $action != 'edit') } print "
        '.$langs->trans("Ref").''.$langs->trans("Label").'
        '.img_object($langs->trans("ShowType"),'group').' '.$objp->rowid.''.dol_escape_htmltag($objp->libelle).''.dol_escape_htmltag($objp->label).''.yn($objp->subscription).''.yn($objp->vote).'
        "; print '
        '; - + print '
        '; } else @@ -256,7 +256,7 @@ if ($action == 'create') print ''; print ''; - print ''; + print ''; print ''; - + print '
        '; print_barre_liste('',$page,$_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num,$nbtotalofrecords); - + $moreforfilter = ''; - + print '
        '; print '
        '.$langs->trans("Label").'
        '.$langs->trans("Label").'
        '.$langs->trans("SubscriptionRequired").''; print $form->selectyesno("subscription",1,1); @@ -316,10 +316,10 @@ if ($rowid > 0) $linkback = ''.$langs->trans("BackToList").''; dol_banner_tab($object, 'rowid', $linkback); - + print '
        '; print '
        '; - + print ''; print '
        '.$langs->trans("SubscriptionRequired").''; @@ -347,7 +347,7 @@ if ($rowid > 0) print '
        '; print '
        '; - + dol_fiche_end(); @@ -460,7 +460,7 @@ if ($rowid > 0) { $membertype=new AdherentType($db); $result=$membertype->fetch($type); - $titre.=" (".$membertype->libelle.")"; + $titre.=" (".$membertype->label.")"; } $param="&rowid=".$rowid; @@ -478,12 +478,12 @@ if ($rowid > 0) print '
        '; print '
        '."\n"; @@ -548,7 +548,7 @@ if ($rowid > 0) // Type /*print ''; */ @@ -613,7 +613,7 @@ if ($rowid > 0) print "
        '; $membertypestatic->id=$objp->type_id; - $membertypestatic->libelle=$objp->type; + $membertypestatic->label=$objp->type; print $membertypestatic->getNomUrl(1,12); print '
        \n"; print '
        '; print ''; - + if ($num > $conf->liste_limit) { print_barre_liste('',$page,$_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num,$nbtotalofrecords,''); @@ -652,7 +652,7 @@ if ($rowid > 0) print ''.$langs->trans("Ref").''.$object->id.''; - print ''.$langs->trans("Label").''; + print ''.$langs->trans("Label").''; print ''.$langs->trans("SubscriptionRequired").''; print $form->selectyesno("subscription",$object->subscription,1); diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 561504f7845..46eed944460 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -429,23 +429,23 @@ class Form if ($direction > 0) { $extracss=($extracss?$extracss.' ':'').'inline-block'; $extrastyle='padding: 0px; padding-right: 3px !important;'; } $classfortooltip='classfortooltip'; - + $s='';$textfordialog=''; - + $htmltext=str_replace('"',""",$htmltext); - if ($tooltiptrigger != '') + if ($tooltiptrigger != '') { $classfortooltip='classfortooltiponclick'; $textfordialog.=''; } - if ($tooltipon == 2 || $tooltipon == 3) + if ($tooltipon == 2 || $tooltipon == 3) { $paramfortooltipimg=' class="'.$classfortooltip.' inline-block'.($extracss?' '.$extracss:'').'" style="padding: 0px;'.($extrastyle?' '.$extrastyle:'').'"'; if ($tooltiptrigger == '') $paramfortooltipimg.=' title="'.($noencodehtmltext?$htmltext:dol_escape_htmltag($htmltext,1)).'"'; // Attribut to put on img tag to store tooltip else $paramfortooltipimg.=' dolid="'.$tooltiptrigger.'"'; } else $paramfortooltipimg =($extracss?' class="'.$extracss.'"':'').($extrastyle?' style="'.$extrastyle.'"':''); // Attribut to put on td text tag - if ($tooltipon == 1 || $tooltipon == 3) + if ($tooltipon == 1 || $tooltipon == 3) { $paramfortooltiptd=' class="'.($tooltipon == 3 ? 'cursorpointer ' : '').$classfortooltip.' inline-block'.($extracss?' '.$extracss:'').'" style="padding: 0px;'.($extrastyle?' '.$extrastyle:'').'" '; if ($tooltiptrigger == '') $paramfortooltiptd.=' title="'.($noencodehtmltext?$htmltext:dol_escape_htmltag($htmltext,1)).'"'; // Attribut to put on td tag to store tooltip @@ -496,7 +496,7 @@ class Form $alt = ''; if ($tooltiptrigger) $alt=$langs->trans("ClickToShowHelp"); - + //For backwards compatibility if ($type == '0') $type = 'info'; elseif ($type == '1') $type = 'help'; @@ -577,16 +577,16 @@ class Form jQuery(".massaction").hide(); } } - + jQuery(document).ready(function () { initCheckForSelect(); jQuery(".checkforselect").click(function() { initCheckForSelect(); }); jQuery(".massactionselect").change(function() { - var massaction = $( this ).val(); + var massaction = $( this ).val(); var urlform = $( this ).closest("form").attr("action").replace("#show_files",""); - if (massaction == "builddoc") + if (massaction == "builddoc") { urlform = urlform + "#show_files"; } @@ -1034,7 +1034,7 @@ class Form { global $conf,$user,$langs; - $out=''; + $out=''; $num=0; $outarray=array(); @@ -1077,7 +1077,7 @@ class Form if ($resql) { $events = null; - + if ($conf->use_javascript_ajax && ! $forcecombo) { include_once DOL_DOCUMENT_ROOT . '/core/lib/ajax.lib.php'; @@ -3450,7 +3450,7 @@ class Form $cat = new Categorie($this->db); $cate_arbo = $cat->get_full_arbo($type,$excludeafterid); } - + $output = ''; } - + if ($typehour!='text') $retstring.=' '.$langs->trans('MinuteShort'); //$retstring.=" "; @@ -5594,7 +5594,7 @@ class Form { $listofidcompanytoscan=$object->thirdparty->id; if (($object->thirdparty->parent > 0) && ! empty($conf->global->THIRDPARTY_INCLUDE_PARENT_IN_LINKTO)) $listofidcompanytoscan.=','.$object->thirdparty->parent; - + $possiblelinks=array( 'propal'=>array('enabled'=>$conf->propal->enabled, 'perms'=>1, 'label'=>'LinkToProposal', 'sql'=>"SELECT s.rowid as socid, s.nom as name, s.client, t.rowid, t.ref, t.ref_client, t.total_ht FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."propal as t WHERE t.fk_soc = s.rowid AND t.fk_soc IN (".$listofidcompanytoscan.') AND t.entity IN ('.getEntity('propal',1).')'), 'order'=>array('enabled'=>$conf->commande->enabled, 'perms'=>1, 'label'=>'LinkToOrder', 'sql'=>"SELECT s.rowid as socid, s.nom as name, s.client, t.rowid, t.ref, t.ref_client, t.total_ht FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."commande as t WHERE t.fk_soc = s.rowid AND t.fk_soc IN (".$listofidcompanytoscan.') AND t.entity IN ('.getEntity('commande',1).')'), @@ -5606,7 +5606,7 @@ class Form 'invoice_supplier'=>array('enabled'=>$conf->fournisseur->facture->enabled , 'perms'=>1, 'label'=>'LinkToSupplierInvoice', 'sql'=>"SELECT s.rowid as socid, s.nom as name, s.client, t.rowid, t.ref, t.ref_supplier, t.total_ht FROM ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."facture_fourn as t WHERE t.fk_soc = s.rowid AND t.fk_soc IN (".$listofidcompanytoscan.') AND t.entity IN ('.getEntity('facture_fourn',1).')') ); } - + global $action; // Can complete the possiblelink array @@ -5845,7 +5845,7 @@ class Form //print "paramid=$paramid,morehtml=$morehtml,shownav=$shownav,$fieldid,$fieldref,$morehtmlref,$moreparam"; $object->load_previous_next_ref((isset($object->next_prev_filter)?$object->next_prev_filter:''),$fieldid,$nodbprefix); - + $navurl = $_SERVER["PHP_SELF"]; // Special case for project/task page if ($paramid == 'project_ref') @@ -5902,11 +5902,15 @@ class Form } else if (in_array($object->element, array('action', 'agenda'))) { - $ret.=$object->ref.'
        '.$object->label; + $ret.=$object->ref.'
        '.$object->label; + } + else if (in_array($object->element, array('adherent_type'))) + { + $ret.=$object->label; } else if ($fieldref != 'none') $ret.=dol_htmlentities($object->$fieldref); - - + + if ($morehtmlref) { $ret.=' '.$morehtmlref; @@ -6207,7 +6211,7 @@ class Form return $out; } - + /** * Return HTML to show the search and clear seach button * @@ -6216,7 +6220,7 @@ class Form function showFilterButtons() { global $conf, $langs; - + $out='
        '; $out.=''; $out.=''; @@ -6235,7 +6239,7 @@ class Form function showCheckAddButtons($cssclass='checkforaction', $calljsfunction=0) { global $conf, $langs; - + $out=''; if (! empty($conf->use_javascript_ajax)) $out.='
        '; $out.=''."\n"; } @@ -6000,9 +6000,9 @@ function natural_search($fields, $value, $mode=0, $nofirstand=0) { $value=preg_replace('/([<>=]+)\s+([0-9'.preg_quote($langs->trans("DecimalSeparator"),'/').'\-])/','\1\2',$value); // Clean string '< 10' into '<10' so we can the explode on space to get all tests to do } - + $value = preg_replace('/\s*\|\s*/','|', $value); - + $crits = explode(' ', $value); $res = ''; if (! is_array($fields)) $fields = array($fields); @@ -6125,7 +6125,7 @@ function getImageFileNameForSize($file, $extName, $extImgTarget='') * * @param string $modulepart propal, facture, facture_fourn, ... * @param string $relativepath Relative path of docs. - * @param int $alldata Return array with all components (1 is recommended, then use a simple a href link with the class, target and mime attribute added. 'documentpreview' css class is handled by jquery code into main.inc.php) + * @param int $alldata Return array with all components (1 is recommended, then use a simple a href link with the class, target and mime attribute added. 'documentpreview' css class is handled by jquery code into main.inc.php) * @param string $param More param on http links * @return string|array Output string with href link or array with all components of link */ @@ -6139,8 +6139,8 @@ function getAdvancedPreviewUrl($modulepart, $relativepath, $alldata=0, $param='' //$mime_preview[]='vnd.oasis.opendocument.presentation'; //$mime_preview[]='archive'; $num_mime = array_search(dol_mimetype($relativepath, '', 1), $mime_preview); - - if ($alldata == 1) + + if ($alldata == 1) { if ($num_mime !== false) return array('target'=>'_blank', 'css'=>'documentpreview', 'url'=>DOL_URL_ROOT.'/document.php?modulepart='.$modulepart.'&attachment=0&file='.urlencode($relativepath), 'mime'=>dol_mimetype($relativepath), ); else return array(); From 954670731d69009b4c3ed7589fc52d6831ff838a Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Thu, 25 May 2017 09:05:19 +0200 Subject: [PATCH 260/299] Fix: changelog --- ChangeLog | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ChangeLog b/ChangeLog index 68e9674d0da..c76617b2f8a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -4,6 +4,9 @@ English Dolibarr ChangeLog ***** ChangeLog for 6.0.0 compared to 5.0.* ***** +For developers: +NEW: Add a lot of API REST: dictionaryevents, memberstypes, ... + WARNING: Following changes may create regression for some external modules, but were necessary to make Dolibarr better: From 74e9b9bf0a6a5015e5995d9cac8e9006b7c99ade Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Thu, 25 May 2017 13:48:30 +0200 Subject: [PATCH 261/299] Fix: Wrong path for external module API REST --- htdocs/api/index.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/api/index.php b/htdocs/api/index.php index fa96da6b139..1e04590da14 100644 --- a/htdocs/api/index.php +++ b/htdocs/api/index.php @@ -1,6 +1,7 @@ +/* Copyright (C) 2015 Jean-François Ferry * Copyright (C) 2016 Laurent Destailleur + * Copyright (C) 2017 Regis Houssin * * 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 @@ -143,10 +144,9 @@ foreach ($modulesdir as $dir) * * Search files named api_.class.php into /htdocs//class directory * - * @todo : take care of externals module! * @todo : use getElementProperties() function ? */ - $dir_part = DOL_DOCUMENT_ROOT.'/'.$moduledirforclass.'/class/'; + $dir_part = dol_buildpath('/'.$moduledirforclass.'/class/'); $handle_part=@opendir(dol_osencode($dir_part)); if (is_resource($handle_part)) From 9dfc8a9dc8e735a637fa0f4f53c24d4d04644619 Mon Sep 17 00:00:00 2001 From: philippe grand Date: Thu, 25 May 2017 19:13:13 +0200 Subject: [PATCH 262/299] fix : bad link --- htdocs/core/lib/accounting.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/accounting.lib.php b/htdocs/core/lib/accounting.lib.php index c8863ce8f61..ab28cb997ed 100644 --- a/htdocs/core/lib/accounting.lib.php +++ b/htdocs/core/lib/accounting.lib.php @@ -41,7 +41,7 @@ function admin_accounting_prepare_head(AccountingAccount $object=null) $head[$h][2] = 'general'; $h ++; - $head[$h][0] = DOL_URL_ROOT.'/accountancy/admin/journals.php'; + $head[$h][0] = DOL_URL_ROOT.'/accountancy/admin/journal.php'; $head[$h][1] = $langs->trans("Journaux"); $head[$h][2] = 'journal'; $h ++; From ca08f814c1ded69a054fab469c7dc7615f2e71b9 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 25 May 2017 19:38:42 +0200 Subject: [PATCH 263/299] Remove deprecated files --- htdocs/install/fileconf.php | 40 ++++++++++++++-------------- htdocs/theme/common/ical.gif | Bin 460 -> 0 bytes htdocs/theme/common/information.png | Bin 4180 -> 0 bytes htdocs/theme/common/rss.gif | Bin 476 -> 0 bytes htdocs/theme/common/vcal.gif | Bin 1079 -> 0 bytes htdocs/theme/login_background.png | Bin 79 -> 0 bytes 6 files changed, 20 insertions(+), 20 deletions(-) delete mode 100644 htdocs/theme/common/ical.gif delete mode 100644 htdocs/theme/common/information.png delete mode 100644 htdocs/theme/common/rss.gif delete mode 100644 htdocs/theme/common/vcal.gif delete mode 100644 htdocs/theme/login_background.png diff --git a/htdocs/install/fileconf.php b/htdocs/install/fileconf.php index cdd639ad50b..424126b63b6 100644 --- a/htdocs/install/fileconf.php +++ b/htdocs/install/fileconf.php @@ -86,7 +86,7 @@ if (! is_writable($conffile)) if (! empty($force_install_message)) { - print '
        '.$langs->trans($force_install_message).'
        '; + print '

        '.$langs->trans($force_install_message).'
        '; /*print ' - - '; - + '; + $i = 0; - + // Title $bankcateg=new BankCateg($db); $morehtml='
        '; @@ -669,7 +665,7 @@ if ($resql) $morehtml.=''; $morehtml.='/'.$nbtotalofpages.' '; $morehtml.='
        '; - + $picto='title_bank'; if ($id > 0 || ! empty($ref)) $picto=''; if (GETPOST("bid")) @@ -681,13 +677,12 @@ if ($resql) { print_barre_liste($langs->trans("BankTransactions"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, $picto, 0, $morehtml, '', $limit); } - + // We can add page now to param if ($page != '') $param.='&page='.urlencode($page); - - + $moreforfilter = ''; - + $moreforfilter.='
        '; $moreforfilter .= $langs->trans('DateOperationShort').' : '; $moreforfilter .= '
        '.$langs->trans('From') . ' '; @@ -695,7 +690,7 @@ if ($resql) //$moreforfilter .= ' - '; $moreforfilter .= '
        '.$langs->trans('to') . ' ' . $form->select_date($search_dt_end, 'search_end_dt', 0, 0, 1, "search_form", 1, 0, 1).'
        '; $moreforfilter .= '
        '; - + $moreforfilter.='
        '; $moreforfilter .= $langs->trans('DateValueShort').' : '; $moreforfilter .= '
        '.$langs->trans('From') . ' '; @@ -703,7 +698,7 @@ if ($resql) //$moreforfilter .= ' - '; $moreforfilter .= '
        '.$langs->trans('to') . ' ' . $form->select_date($search_dv_end, 'search_end_dv', 0, 0, 1, "search_form", 1, 0, 1).'
        '; $moreforfilter .= '
        '; - + $parameters=array(); $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook if (empty($reshook)) $moreforfilter .= $hookmanager->resPrint; @@ -715,10 +710,10 @@ if ($resql) print $moreforfilter; print '
        '."\n"; } - + $varpage=empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage; $selectedfields=$form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields - + print '
        '; print ''."\n"; @@ -803,7 +798,6 @@ if ($resql) print ''; print "\n"; - // Fields title print ''; if (! empty($arrayfields['b.rowid']['checked'])) print_liste_field_titre($arrayfields['b.rowid']['label'],$_SERVER['PHP_SELF'],'b.rowid','',$param,'',$sortfield,$sortorder); @@ -838,14 +832,13 @@ if ($resql) print_liste_field_titre('', $_SERVER["PHP_SELF"],"",'','','align="right"',$sortfield,$sortorder,'maxwidthsearch '); print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"],"",'','','align="center"',$sortfield,$sortorder,'maxwidthsearch '); print "\n"; - - + $balance = 0; // For balance $balancecalculated = false; - + // Loop on each record $sign = 1; - + $totalarray=array(); while ($i < min($num,$limit)) { @@ -885,9 +878,9 @@ if ($resql) $balancecalculated=true; } - + $balance = price2num($balance + ($sign * $objp->amount),'MT'); - + if (empty($cachebankaccount[$objp->bankid])) { $bankaccounttmp = new Account($db); @@ -899,8 +892,6 @@ if ($resql) { $bankaccount = $cachebankaccount[$objp->bankid]; } - - print ''; @@ -1012,19 +1003,19 @@ if ($resql) } elseif ($links[$key]['type']=='company') { - + } elseif ($links[$key]['type']=='user') { - + } elseif ($links[$key]['type']=='member') { - + } elseif ($links[$key]['type']=='sc') { - + } else { @@ -1044,11 +1035,10 @@ if ($resql) print ''; } } - print ''; if (! $i) $totalarray['nbfield']++; } - + // Date ope if (! empty($arrayfields['b.dateo']['checked'])) { @@ -1089,7 +1079,7 @@ if ($resql) print '\n"; if (! $i) $totalarray['nbfield']++; } - + // Third party if (! empty($arrayfields['bu.label']['checked'])) { @@ -1114,7 +1104,7 @@ if ($resql) print ''; if (! $i) $totalarray['nbfield']++; } - + // Bank account if (! empty($arrayfields['ba.ref']['checked'])) { @@ -1123,7 +1113,7 @@ if ($resql) print "\n"; if (! $i) $totalarray['nbfield']++; } - + // Debit if (! empty($arrayfields['b.debit']['checked'])) { @@ -1137,6 +1127,7 @@ if ($resql) if (! $i) $totalarray['nbfield']++; if (! $i) $totalarray['totaldebfield']=$totalarray['nbfield']; } + // Credit if (! empty($arrayfields['b.credit']['checked'])) { @@ -1150,7 +1141,7 @@ if ($resql) if (! $i) $totalarray['nbfield']++; if (! $i) $totalarray['totalcredfield']=$totalarray['nbfield']; } - + // Balance if (! empty($arrayfields['balance']['checked'])) { @@ -1169,8 +1160,9 @@ if ($resql) { print ''; } + if (! $i) $totalarray['nbfield']++; } - + if (! empty($arrayfields['b.num_releve']['checked'])) { print ''; if (! $i) $totalarray['nbfield']++; } - + // Action edit/delete print '
        '.($objp->num_chq?$objp->num_chq:"")."-'; @@ -1197,7 +1189,7 @@ if ($resql) print ''; // Transaction reconciliated or edit link @@ -1254,7 +1246,7 @@ if ($resql) $i++; } - + // Show total line if (isset($totalarray['totaldebfield']) || isset($totalarray['totalcredfield'])) { @@ -1277,7 +1269,7 @@ if ($resql) print "
        "; print "
        "; - + print ''; $db->free($resql); } From 783cec0d6d0eaf8910a8ec7abe7cac3ac54ee55f Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sat, 27 May 2017 07:21:59 +0200 Subject: [PATCH 270/299] Move to getNomUrl for expense report in bank entries --- htdocs/compta/bank/bankentries.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/htdocs/compta/bank/bankentries.php b/htdocs/compta/bank/bankentries.php index 2598d1659d0..f98c48b1aba 100644 --- a/htdocs/compta/bank/bankentries.php +++ b/htdocs/compta/bank/bankentries.php @@ -42,7 +42,7 @@ require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/salaries/class/paymentsalary.class.php'; require_once DOL_DOCUMENT_ROOT.'/don/class/don.class.php'; -require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php'; +require_once DOL_DOCUMENT_ROOT.'/expensereport/class/paymentexpensereport.class.php'; require_once DOL_DOCUMENT_ROOT.'/loan/class/loan.class.php'; require_once DOL_DOCUMENT_ROOT.'/fourn/class/paiementfourn.class.php'; @@ -345,7 +345,7 @@ $paymentsupplierstatic=new PaiementFourn($db); $paymentvatstatic=new TVA($db); $paymentsalstatic=new PaymentSalary($db); $donstatic=new Don($db); -$expensereportstatic=new ExpenseReport($db); +$paymentexpensereportstatic=new PaymentExpenseReport($db); $bankstatic=new Account($db); $banklinestatic=new AccountLine($db); @@ -966,9 +966,9 @@ if ($resql) } elseif ($links[$key]['type']=='payment_expensereport') { - print ''; - print ' '.img_object($langs->trans('ShowPayment'),'payment').' '; - print ''; + $paymentexpensereportstatic->id=$links[$key]['url_id']; + $paymentexpensereportstatic->ref=$links[$key]['url_id']; + print ' '.$paymentexpensereportstatic->getNomUrl(2); } elseif ($links[$key]['type']=='banktransfert') { From 570f9aaa9e104fe4b85cea1901a68796bb0d9413 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sat, 27 May 2017 08:18:53 +0200 Subject: [PATCH 271/299] Review old payment page for expense report --- htdocs/core/lib/expensereport.lib.php | 33 ++++ .../class/paymentexpensereport.class.php | 73 +++++++- htdocs/expensereport/payment/card.php | 159 ++++++++++-------- htdocs/expensereport/payment/info.php | 81 +++++++++ 4 files changed, 273 insertions(+), 73 deletions(-) create mode 100644 htdocs/expensereport/payment/info.php diff --git a/htdocs/core/lib/expensereport.lib.php b/htdocs/core/lib/expensereport.lib.php index f253f077243..a5f19174a84 100644 --- a/htdocs/core/lib/expensereport.lib.php +++ b/htdocs/core/lib/expensereport.lib.php @@ -78,7 +78,40 @@ function expensereport_prepare_head($object) return $head; } +/** + * Returns an array with the tabs for the "Expense report payment" section + * It loads tabs from modules looking for the entity payment + * + * @param Paiement $object Current payment object + * @return array Tabs for the payment section + */ +function payment_expensereport_prepare_head(PaymentExpenseReport $object) { + global $langs, $conf; + + $h = 0; + $head = array(); + + $head[$h][0] = DOL_URL_ROOT.'/expensereport/payment/card.php?id='.$object->id; + $head[$h][1] = $langs->trans("Card"); + $head[$h][2] = 'payment'; + $h++; + + // Show more tabs from modules + // Entries must be declared in modules descriptor with line + // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab + // $this->tabs = array('entity:-tabname); to remove a tab + complete_head_from_modules($conf,$langs,$object,$head,$h,'payment_expensereport'); + + $head[$h][0] = DOL_URL_ROOT.'/expensereport/payment/info.php?id='.$object->id; + $head[$h][1] = $langs->trans("Info"); + $head[$h][2] = 'info'; + $h++; + + complete_head_from_modules($conf,$langs,$object,$head,$h,'payment_expensereport', 'remove'); + + return $head; +} /** * Return array head with list of tabs to view object informations. diff --git a/htdocs/expensereport/class/paymentexpensereport.class.php b/htdocs/expensereport/class/paymentexpensereport.class.php index 9fc8c7627dd..edd80a0bff5 100644 --- a/htdocs/expensereport/class/paymentexpensereport.class.php +++ b/htdocs/expensereport/class/paymentexpensereport.class.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2015-2017 Alexandre Spangaro * * 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 @@ -31,6 +31,7 @@ class PaymentExpenseReport extends CommonObject { public $element='payment_expensereport'; //!< Id that identify managed objects public $table_element='payment_expensereport'; //!< Name of table without prefix where object is stored + public $picto = 'payment'; var $rowid; @@ -425,6 +426,32 @@ class PaymentExpenseReport extends CommonObject } + /** + * Retourne le libelle du statut d'un don (brouillon, validee, abandonnee, payee) + * + * @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long + * @return string Libelle + */ + function getLibStatut($mode=0) + { + return ''; + } + + /** + * Renvoi le libelle d'un statut donne + * + * @param int $statut Id statut + * @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto + * @return string Libelle du statut + */ + function LibStatut($statut,$mode=0) + { + global $langs; + + return ''; + } + + /** * Initialise an instance with random values. * Used to build previews or test instances. @@ -613,4 +640,48 @@ class PaymentExpenseReport extends CommonObject return $result; } + + /** + * Tab information on object + * + * @param int $id Payment id + * @return void + */ + function info($id) + { + $sql = 'SELECT e.rowid, e.datec, e.fk_user_creat, e.fk_user_modif, e.tms'; + $sql.= ' FROM '.MAIN_DB_PREFIX.'payment_expensereport as e'; + $sql.= ' WHERE e.rowid = '.$id; + + dol_syslog(get_class($this).'::info', LOG_DEBUG); + $result = $this->db->query($sql); + + if ($result) + { + if ($this->db->num_rows($result)) + { + $obj = $this->db->fetch_object($result); + $this->id = $obj->rowid; + if ($obj->fk_user_creat) + { + $cuser = new User($this->db); + $cuser->fetch($obj->fk_user_creat); + $this->user_creation = $cuser; + } + if ($obj->fk_user_modif) + { + $muser = new User($this->db); + $muser->fetch($obj->fk_user_modif); + $this->user_modification = $muser; + } + $this->date_creation = $this->db->jdate($obj->datec); + $this->date_modification = $this->db->jdate($obj->tms); + } + $this->db->free($result); + } + else + { + dol_print_error($this->db); + } + } } diff --git a/htdocs/expensereport/payment/card.php b/htdocs/expensereport/payment/card.php index bc956955258..de01f01a5df 100644 --- a/htdocs/expensereport/payment/card.php +++ b/htdocs/expensereport/payment/card.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2015-2017 Alexandre Spangaro * * 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 @@ -24,29 +24,25 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php'; require_once DOL_DOCUMENT_ROOT.'/expensereport/class/paymentexpensereport.class.php'; -require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/modules/facture/modules_facture.php'; +require_once DOL_DOCUMENT_ROOT.'/core/modules/expensereport/modules_expensereport.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/expensereport.lib.php'; if (! empty($conf->banque->enabled)) require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; $langs->load('bills'); $langs->load('banks'); $langs->load('companies'); +$langs->load('trips'); -// Security check $id=GETPOST('rowid')?GETPOST('rowid','int'):GETPOST('id','int'); $action=GETPOST('action','aZ09'); $confirm=GETPOST('confirm'); + +// Security check if ($user->societe_id) $socid=$user->societe_id; // TODO Add rule to restrict access payment //$result = restrictedArea($user, 'facture', $id,''); -$payment = new PaymentExpenseReport($db); -if ($id > 0) -{ - $result=$payment->fetch($id); - if (! $result) dol_print_error($db,'Failed to get payment id '.$id); -} - +$object = new PaymentExpenseReport($db); /* * Actions @@ -57,7 +53,7 @@ if ($action == 'confirm_delete' && $confirm == 'yes' && $user->rights->expensere { $db->begin(); - $result = $payment->delete($user); + $result = $object->delete($user); if ($result > 0) { $db->commit(); @@ -66,7 +62,7 @@ if ($action == 'confirm_delete' && $confirm == 'yes' && $user->rights->expensere } else { - setEventMessages($payment->error, $payment->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); $db->rollback(); } } @@ -76,7 +72,7 @@ if ($action == 'confirm_valide' && $confirm == 'yes' && $user->rights->expensere { $db->begin(); - $result=$payment->valide(); + $result=$object->valide(); if ($result > 0) { @@ -99,12 +95,12 @@ if ($action == 'confirm_valide' && $confirm == 'yes' && $user->rights->expensere } } - header('Location: card.php?id='.$payment->id); + header('Location: card.php?id='.$object->id); exit; } else { - setEventMessages($payment->error, $payment->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); $db->rollback(); } } @@ -114,27 +110,27 @@ if ($action == 'confirm_valide' && $confirm == 'yes' && $user->rights->expensere * View */ -llxHeader(); +llxHeader('', $langs->trans("ExpenseReportPayment")); + +if ($id > 0) +{ + $result=$object->fetch($id); + if (! $result) dol_print_error($db,'Failed to get payment id '.$id); +} -$expensereport = new ExpenseReport($db); $form = new Form($db); -$h=0; +$head = payment_expensereport_prepare_head($object); -$head[$h][0] = DOL_URL_ROOT.'/expensereport/payment/card.php?id='.$id; -$head[$h][1] = $langs->trans("Card"); -$hselected = $h; -$h++; - -dol_fiche_head($head, $hselected, $langs->trans("ExpenseReportPayment"), 0, 'payment'); +dol_fiche_head($head, 'payment', $langs->trans("ExpenseReportPayment"), -1, 'payment'); /* * Confirm deleting of the payment */ if ($action == 'delete') { - print $form->formconfirm('card.php?id='.$payment->id, $langs->trans("DeletePayment"), $langs->trans("ConfirmDeletePayment"), 'confirm_delete','',0,2); - + print $form->formconfirm('card.php?id='.$object->id, $langs->trans("DeletePayment"), $langs->trans("ConfirmDeletePayment"), 'confirm_delete','',0,2); + } /* @@ -143,46 +139,61 @@ if ($action == 'delete') if ($action == 'valide') { $facid = $_GET['facid']; - print $form->formconfirm('card.php?id='.$payment->id.'&facid='.$facid, $langs->trans("ValidatePayment"), $langs->trans("ConfirmValidatePayment"), 'confirm_valide','',0,2); - + print $form->formconfirm($_SERVER['PHP_SELF'].'?id='.$object->id.'&facid='.$facid, $langs->trans("ValidatePayment"), $langs->trans("ConfirmValidatePayment"), 'confirm_valide','',0,2); + } +// $linkback = '' . $langs->trans("BackToList") . ''; -print ''; +dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', ''); -// Ref -print ''; -print ''; +print '
        '; +print '
        '; -// Date -print '
        '; +print '
        '.$langs->trans('Ref').''; -print $form->showrefnav($payment,'id','',1,'rowid','id'); -print '
        '.$langs->trans('Date').''.dol_print_date($payment->datep,'day').'
        '."\n"; + +// Date payment +print ''; // Mode -print ''; +print ''; // Number -print ''; +print ''; // Amount -print ''; +print ''; // Note -print ''; +print ''; +$disable_delete = 0; // Bank account if (! empty($conf->banque->enabled)) { - if ($payment->bank_account) + if ($object->bank_account) { $bankline=new AccountLine($db); - $bankline->fetch($payment->bank_line); + $bankline->fetch($object->bank_line); + if ($bankline->rappro) + { + $disable_delete = 1; + $title_button = dol_escape_htmltag($langs->transnoentitiesnoconv("CantRemoveConciliatedPayment")); + } print ''; print ''; print ''; + print ''; + + print ''; + print ''; + print ''; print ''; } @@ -190,13 +201,16 @@ if (! empty($conf->banque->enabled)) print '
        '.$langs->trans('Date').''.dol_print_date($object->datep,'day').'
        '.$langs->trans('Mode').''.$langs->trans("PaymentType".$payment->type_code).'
        '.$langs->trans('PaymentMode').''.$langs->trans("PaymentType".$object->type_code).'
        '.$langs->trans('Numero').''.$payment->num_payment.'
        '.$langs->trans('Numero').''.$object->num_payment.'
        '.$langs->trans('Amount').''.price($payment->amount, 0, $outputlangs, 1, -1, -1, $conf->currency).'
        '.$langs->trans('Amount').''.price($object->amount, 0, $outputlangs, 1, -1, -1, $conf->currency).'
        '.$langs->trans('Note').''.nl2br($payment->note).'
        '.$langs->trans('Note').''.nl2br($object->note).'
        '.$langs->trans('BankTransactionLine').''; - print $bankline->getNomUrl(1,0,'showall'); + print $bankline->getNomUrl(1,0,'showconciliated'); + print '
        '.$langs->trans('BankAccount').''; + $accountstatic=new Account($db); + $accountstatic->fetch($bankline->fk_account); + print $accountstatic->getNomUrl(1); print '
        '; +print '
        '; + +dol_fiche_end(); + /* - * List of donations paid + * List of expense report paid */ -$disable_delete = 0; -$sql = 'SELECT er.rowid as did, er.paid, er.total_ttc, per.amount'; +$sql = 'SELECT er.rowid as eid, er.paid, er.total_ttc, per.amount'; $sql.= ' FROM '.MAIN_DB_PREFIX.'payment_expensereport as per,'.MAIN_DB_PREFIX.'expensereport as er'; $sql.= ' WHERE per.fk_expensereport = er.rowid'; $sql.= ' AND er.entity IN ('.getEntity('expensereport', 1).')'; @@ -210,12 +224,17 @@ if ($resql) $i = 0; $total = 0; - print '
        '; + print '
        '; + + print '
        '; + print '
        '; + print ''; print ''; - print ''; - print ''; + print ''; print ''; + print ''; + print ''; print "\n"; if ($num > 0) @@ -226,19 +245,28 @@ if ($resql) { $objp = $db->fetch_object($resql); - print ''; - // Ref + + $expensereport=new ExpenseReport($db); + $expensereport->fetch($objp->eid); + + // Expense report print '\n"; + // Expected to pay print ''; - // Status - print ''; + // Amount paid print ''; + + // Remain to pay + print ''; + + // Status + print ''; + print "\n"; if ($objp->paid == 1) // If at least one invoice is paid, disable delete { @@ -251,6 +279,8 @@ if ($resql) print "
        '.$langs->trans('ExpenseReport').''.$langs->trans('ExpectedToPay').''.$langs->trans('Status').''.$langs->trans('ExpectedToPay').''.$langs->trans('PayedByThisPayment').''.$langs->trans('RemainderToPay').''.$langs->trans('Status').'
        '; - $expensereport->fetch($objp->did); print $expensereport->getNomUrl(1); print "'.price($objp->total_ttc).''.$expensereport->getLibStatut(4,$objp->amount).''.price($objp->amount).''.price($remaintopay).''.$expensereport->getLibStatut(4,$objp->amount).'
        \n"; + print '
        '; + $db->free($resql); } else @@ -266,26 +296,13 @@ print ''; */ print '
        '; -/* -if (! empty($conf->global->BILL_ADD_PAYMENT_VALIDATION)) -{ - if ($user->societe_id == 0 && $payment->statut == 0 && $_GET['action'] == '') - { - if ($user->rights->facture->paiement) - { - print ''.$langs->trans('Valid').''; - } - } -} -*/ - -if ($_GET['action'] == '') +if ($action == '') { if ($user->rights->expensereport->supprimer) { if (! $disable_delete) { - print ''.$langs->trans('Delete').''; + print ''.$langs->trans('Delete').''; } else { @@ -296,8 +313,6 @@ if ($_GET['action'] == '') print '
        '; - - llxFooter(); $db->close(); diff --git a/htdocs/expensereport/payment/info.php b/htdocs/expensereport/payment/info.php new file mode 100644 index 00000000000..bcecc54276b --- /dev/null +++ b/htdocs/expensereport/payment/info.php @@ -0,0 +1,81 @@ + + * Copyright (C) 2004-2009 Laurent Destailleur + * Copyright (C) 2013 Marcos García + * Copyright (C) 2015 Alexandre Spangaro + * + * 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 3 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/expensereport/payment/info.php + * \ingroup Expense report + * \brief Tab payment info + */ + +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/expensereport/class/paymentexpensereport.class.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/expensereport.lib.php'; + +$langs->load("bills"); +$langs->load("trips"); + +$id=GETPOST('id'); +$ref=GETPOST('ref', 'alpha'); +$action=GETPOST('action','alpha'); +$confirm=GETPOST('confirm','alpha'); + +/* + * Actions + */ + +// None + + +/* + * View + */ + +llxHeader('', $langs->trans("Payment")); + +$object = new PaymentExpenseReport($db); +$object->fetch($id, $ref); +$object->info($object->id); + +$head = payment_expensereport_prepare_head($object); + +dol_fiche_head($head, 'info', $langs->trans("ExpenseReportPayment"), -1, 'payment'); + + +//$linkback = '' . $langs->trans("BackToList") . ''; + +dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', ''); + + +print '
        '; +print '
        '; + +print '
        '; + +print '
        '; +dol_print_object_info($object); +print '
        '; + +print '
        '; + +dol_fiche_end(); + +llxFooter(); +$db->close(); From c651f1da4561101e1430951eb531988bff8211f6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 27 May 2017 13:46:34 +0200 Subject: [PATCH 272/299] Work on modulebuilder tool --- htdocs/core/ajax/check_notifications.php | 2 +- htdocs/core/lib/files.lib.php | 4 +- htdocs/langs/en_US/errors.lang | 1 + htdocs/langs/en_US/modulebuilder.lang | 1 + htdocs/modulebuilder/README.md | 221 +++++ htdocs/modulebuilder/index.php | 64 +- htdocs/modulebuilder/template/README.md | 223 +---- htdocs/modulebuilder/template/admin/about.php | 2 +- htdocs/modulebuilder/template/admin/setup.php | 6 +- .../template/class/MyTrigger.php | 51 -- .../template/class/actions_mymodule.class.php | 2 +- .../template/class/myclass.class.php | 361 -------- .../template/class/myobject.class.php | 607 +++++++++++++ .../class/myobject_api_class.class.php | 292 +++++++ .../core/modules/modMyModule.class.php | 817 +++++------------- ...terface_99_modMyModule_Triggers.class.php} | 69 +- ...ect_mymodule.png => myobject_mymodule.png} | Bin .../modulebuilder/template/js/mymodule.js.php | 2 +- .../modulebuilder/template/myobject_card.php | 386 +++++++-- .../modulebuilder/template/myobject_list.php | 490 ++++++++++- .../template/scripts/myobject.php | 165 ++++ .../template/scripts/myscript.php | 203 ----- htdocs/modulebuilder/template/sql/data.sql | 2 +- ...x_mytable.key.sql => llx_myobject.key.sql} | 2 +- .../sql/{llx_mytable.sql => llx_myobject.sql} | 2 +- .../MyModuleFunctionalTest.php | 0 .../MyObjectTest.php} | 10 +- 27 files changed, 2327 insertions(+), 1658 deletions(-) create mode 100644 htdocs/modulebuilder/README.md delete mode 100644 htdocs/modulebuilder/template/class/MyTrigger.php delete mode 100644 htdocs/modulebuilder/template/class/myclass.class.php create mode 100644 htdocs/modulebuilder/template/class/myobject.class.php create mode 100644 htdocs/modulebuilder/template/class/myobject_api_class.class.php rename htdocs/modulebuilder/template/core/triggers/{interface_99_modMyModule_MyTrigger.class.php => interface_99_modMyModule_Triggers.class.php} (91%) rename htdocs/modulebuilder/template/img/{object_mymodule.png => myobject_mymodule.png} (100%) create mode 100644 htdocs/modulebuilder/template/scripts/myobject.php delete mode 100644 htdocs/modulebuilder/template/scripts/myscript.php rename htdocs/modulebuilder/template/sql/{llx_mytable.key.sql => llx_myobject.key.sql} (90%) rename htdocs/modulebuilder/template/sql/{llx_mytable.sql => llx_myobject.sql} (97%) rename htdocs/modulebuilder/template/test/{functional => phpunit}/MyModuleFunctionalTest.php (100%) rename htdocs/modulebuilder/template/test/{unit/MyClassTest.php => phpunit/MyObjectTest.php} (91%) diff --git a/htdocs/core/ajax/check_notifications.php b/htdocs/core/ajax/check_notifications.php index 332626fbabd..6984bbff5b4 100644 --- a/htdocs/core/ajax/check_notifications.php +++ b/htdocs/core/ajax/check_notifications.php @@ -33,7 +33,7 @@ top_httphead('text/html'); // TODO Use a json mime type global $user, $db, $langs, $conf; -$time = (int) GETPOST('time'); // Use the time parameter that is always increased by time_update, even if call is late +$time = (int) GETPOST('time','int'); // Use the time parameter that is always increased by time_update, even if call is late //$time=dol_now(); diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 4c492d1693e..2d5b8d2f6db 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -54,7 +54,7 @@ function dol_basename($pathfile) * @return array Array of array('name'=>'xxx','fullname'=>'/abc/xxx','date'=>'yyy','size'=>99,'type'=>'dir|file',...) * @see dol_dir_list_indatabase */ -function dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter="", $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=false) +function dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefilter="", $sortcriteria="name", $sortorder=SORT_ASC, $mode=0, $nohook=0) { global $db, $hookmanager; global $object; @@ -483,6 +483,8 @@ function dolReplaceInFile($srcfile, $arrayreplacement, $destfile='', $newmask=0) dol_delete_file($tmpdestfile); + // Create $newpathoftmpdestfile from $newpathofsrcfile + diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index 79984981e87..aea5ad68113 100644 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -18,6 +18,7 @@ ErrorFailToCreateFile=Failed to create file '%s'. ErrorFailToRenameDir=Failed to rename directory '%s' into '%s'. ErrorFailToCreateDir=Failed to create directory '%s'. ErrorFailToDeleteDir=Failed to delete directory '%s'. +ErrorFailToMakeReplacementInto=Failed to make replacement into file '%s'. ErrorThisContactIsAlreadyDefinedAsThisType=This contact is already defined as contact for this type. ErrorCashAccountAcceptsOnlyCashMoney=This bank account is a cash account, so it accepts payments of type cash only. ErrorFromToAccountsMustDiffers=Source and targets bank accounts must be different. diff --git a/htdocs/langs/en_US/modulebuilder.lang b/htdocs/langs/en_US/modulebuilder.lang index 18b7044b55d..de0c2fc216a 100644 --- a/htdocs/langs/en_US/modulebuilder.lang +++ b/htdocs/langs/en_US/modulebuilder.lang @@ -1,5 +1,6 @@ # Dolibarr language file - Source file is en_US - loan ModuleBuilderDesc=This tools give you utilites to build or edit your own module. +EnterNameOfModuleDesc=Enter name of the module to create with no spaces. Use uppercase to separate words (For example: MyModule, EcommerceForShop, SyncWithMySystem...) ModuleBuilderDesc2=Path were modules are generated/edited (first alternative directory defined into %s): %s ModuleBuilderDesc3=Generated/editable modules found: %s (they are detected as editable when the file %s exists in root of module directory). NewModule=New module diff --git a/htdocs/modulebuilder/README.md b/htdocs/modulebuilder/README.md new file mode 100644 index 00000000000..5e2af06a430 --- /dev/null +++ b/htdocs/modulebuilder/README.md @@ -0,0 +1,221 @@ +Dolibarr Module Template (aka My Module) +======================================== + +This is a full featured module template for Dolibarr. +It's a tool for module developers to kickstart their project and give an hands-on sample of which features Dolibarr has to offer for module development. + +If you're not a module developer you have no use for this. + +Documentation +------------- + +[Module tutorial](http://wiki.dolibarr.org/index.php/Module_development) + +[Dolibarr development](http://wiki.dolibarr.org/index.php/Developer_documentation) + +### Translations + +Dolibarr uses [Transifex](http://transifex.com) to manage it's translations. + +This template also contains a sample configuration for Transifex managed translations under the hidden [.tx](.tx) directory. + +For more informations, see the [translator's documentation](http://wiki.dolibarr.org/index.php/Translator_documentation). + +There is a [Transifex project](http://transifex.com/projects/p/dolibarr-module-template) for this module. + +Install +------- + +### Manually + +- Make sure Dolibarr (>= 3.3.x) is already installed and configured on your workstation or development server. + +- In your Dolibarr installation directory, edit the ```htdocs/conf/conf.php``` file + +- Find the following lines: + ```php + //$dolibarr_main_url_root_alt ... + //$dolibarr_main_document_root_alt ... + ``` + +- Uncomment these lines (delete the leading ```//```) and assign a sensible value according to your Dolibarr installation + + For example : + + - UNIX: + ```php + $dolibarr_main_url_root = 'http://localhost/Dolibarr/htdocs'; + $dolibarr_main_document_root = '/var/www/Dolibarr/htdocs'; + $dolibarr_main_url_root_alt = '/custom'; + $dolibarr_main_document_root_alt = '/var/www/Dolibarr/htdocs/custom'; + ``` + + - Windows: + ```php + $dolibarr_main_url_root = 'http://localhost/Dolibarr/htdocs'; + $dolibarr_main_document_root = 'C:/My Web Sites/Dolibarr/htdocs'; + $dolibarr_main_url_root_alt = '/custom'; + $dolibarr_main_document_root_alt = 'C:/My Web Sites/Dolibarr/htdocs/custom'; + ``` + + For more information about the ```conf.php``` file take a look at the conf.php.example file. + +*Note that for Dolibarr versions before 3.5, the ```$dolibarr_main_url_root_alt``` has to be an absolute path* + +- Clone the repository in ```$dolibarr_main_document_root_alt/mymodule``` + +*(You may have to create the ```htdocs/custom``` directory first if it doesn't exist yet.)* +```sh +git clone git@github.com:Dolibarr/dolibarr-module-template.git mymodule +``` + +- Install [Composer](https://getcomposer.org) dependencies: +```sh +composer install +``` + +Follow the [final steps](#final_steps). + +### Using [Composer](https://getcomposer.org) +Require this repository from Dolibarr's composer: +```json +{ + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/dolibarr/dolibarr-module-template" + } + ], + "require": { + "dolibarr/mymodule": "dev-master" + } +} +``` + +Run +```sh +composer update +``` + +Follow the [final steps](#final_steps). + +### Final steps + +From your browser: + + - Log into Dolibarr as a super-administrator + - Under "Setup" -> "Other setup", set ```MAIN_FEATURES_LEVEL``` to ```2``` + - Go to "Setup" -> "Modules" + - The module is under one of the tabs + - You should now be able to enable the new module and start coding ;) + +Provided tools +-------------- + +### Starting a new module + +A [script](dev/newmodule.sh) allows you to rename most of the code to your own module name. +It requires ```find```, ```sed``` and ```rename``` commands on your system. +Just make sure you provide a CamelCase name. +```sh +./dev/newmodule.sh [NewName] +``` + +Some work still has to be done manually: +- Rename the directory holding the code +- Maybe rename some other bits (Search for 'my' in filenames and code) +- Update your module ID in the module descriptor +- Update your language files + - Keywords based on the module ID + - String referencing the template +- Remove the features you don't plan to use +- Fill the copyright notices at the top of each file +- Add your logo: see [images README](dev/img/README.md) for specifications +- Start a new GIT history +``` +git checkout --orphan [new_branch_name] +``` +- Build an awesome module ;) + +### Composer scripts + +Only the main commands are listed here. +See the [composer comments](composer-comments.md) or the [composer.json](composer.json) itself for more informations. + +#### Check + +Run a linter, a PHP compatibility version checker and checks coding style. +```sh +composer check +``` + +#### Test + +Run unit and functional tests. +```sh +composer test +``` + +#### Doc +Build code and user documentation. + +#### Release + +Run the checks and tests then build a distribution ZIP. +```sh +composer release +``` + +#### Git hooks + +Optional [GIT hooks](https://git-scm.com/book/it/v2/Customizing-Git-Git-Hooks) are provided. +These are just wrappers calling composer scripts. +They ensure best practices are followed during module development. + +Install: +```sh +composer git_hooks_install +``` + +Remove: +```sh +composer git_hooks_remove +``` + +## Publishing the module +The de-facto standard for publishing and marketing modules for Dolibarr is the [Dolistore](https://www.dolistore.com). +Templates for required images and texts are [provided](dev/dolistore). +Check the dedicated [README](dev/dolistore/README.md) for more informations. + +Contributions +------------- + +Feel free to contribute and report defects on our [issue tracker](http://github.com/Dolibarr/dolibarr-module-template/issues). + +Licenses +-------- + +### Main code + +![GPLv3 logo](img/gplv3.png) + +GPLv3 or (at your option) any later version. + +See [COPYING](COPYING) for more information. + +### Other Licenses + +#### [Parsedown](http://parsedown.org/) + +Used to display this README in the module's about page. +Licensed under MIT. + +#### [GNU Licenses logos](https://www.gnu.org/graphics/license-logos.html) + +Public domain + +#### Documentation + +All texts and readmes. + +![GFDL logo](img/gfdl.png) diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index bdad41e8556..a033bd1be23 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -32,15 +32,15 @@ $langs->load("other"); $action=GETPOST('action','alpha'); $confirm=GETPOST('confirm','alpha'); $module=GETPOST('module'); -$tab=GETPOST('tab'); if (empty($module)) $module='initmodule'; if (empty($tab)) $tab='description'; +$modulename=dol_sanitizeFileName(GETPOST('modulename','alpha')); + // Security check if (! $user->admin && empty($conf->global->MODULEBUILDER_FOREVERYONE)) accessforbidden('ModuleBuilderNotAllowed'); -$modulename=dol_sanitizeFileName(GETPOST('modulename','alpha')); // Dir for custom dirs $tmp=explode(',', $dolibarr_main_document_root_alt); @@ -55,35 +55,59 @@ $FILEFLAG='modulebuilder.txt'; if ($dircustom && $action == 'initmodule' && $modulename) { - $srcfile = DOL_DOCUMENT_ROOT.'/modulebuilder/template'; - $destfile = $dircustom.'/'.$modulename; - $result = dolCopyDir($srcfile, $destfile, 0, 0); + $srcdir = DOL_DOCUMENT_ROOT.'/modulebuilder/template'; + $destdir = $dircustom.'/'.$modulename; + + $arrayreplacement=array( + 'mymodule'=>strtolower($modulename), + 'MyModule'=>$modulename + ); + + $result = dolCopyDir($srcdir, $destdir, 0, 0); //dol_mkdir($destfile); if ($result <= 0) { $error++; - setEventMessages($langs->trans("ErrorFailedToCopyDir"), null, 'errors'); + $langs->load("errors"); + setEventMessages($langs->trans("ErrorFailToCopyDir", $srcdir, $destdir), null, 'errors'); } // Edit PHP files - $listofphpfilestoedit = dol_dir_list($destfile, 'files', 1, '\.php$', 'fullname', SORT_ASC, 0, true); - foreach($listofphpfilestoedit as $phpfileval) + if (! $error) { - $arrayreplacement=array( - 'mymodule'=>$modulename - ); - $result=dolReplaceInFile($phpfileval['fullname'], $arrayreplacement); - var_dump($phpfileval); - var_dump($result); - } - + $listofphpfilestoedit = dol_dir_list($destdir, 'files', 1, '\.php$', '', 'fullname', SORT_ASC, 0, 1); + foreach($listofphpfilestoedit as $phpfileval) + { + var_dump($phpfileval['fullname']); + + $arrayreplacement=array( + 'mymodule'=>strtolower($modulename), + 'MyModule'=>$modulename, + 'MYMODULE'=>strtoupper($modulename), + 'My module'=>$modulename, + 'htdocs/modulebuilder/template/'=>'', + ); + + + $result=dolReplaceInFile($phpfileval['fullname'], $arrayreplacement); + //var_dump($result); + if ($result < 0) + { + setEventMessages($langs->trans("ErrorFailToMakeReplacementInto", $phpfileval['fullname']), null, 'errors'); + } + } + } + if (! $error) { setEventMessages('ModuleInitialized', null); + $module=$modulename; + $modulename = ''; } } + /* * View */ @@ -96,6 +120,7 @@ $text=$langs->trans("ModuleBuilder"); print load_fiche_titre($text, '', 'title_setup'); $listofmodules=array(); + /* if (!empty($conf->modulebuilder->enabled) && $mainmenu == 'modulebuilder') // Entry for Module builder { @@ -124,7 +149,7 @@ if (!empty($conf->modulebuilder->enabled) && $mainmenu == 'modulebuilder') // En $newmenu->add('', 'NoGeneratedModuleFound', 0, 0); }*/ - + // Show description of content print $langs->trans("ModuleBuilderDesc").'
        '; print $langs->trans("ModuleBuilderDesc2", 'conf/conf.php', $dircustom).'
        '; @@ -161,7 +186,10 @@ if ($module == 'initmodule') print ''; print ''; print ''; - print ''; + + print $langs->trans("EnterNameOfModuleDesc").'

        '; + + print ''; print ''; print ''; } diff --git a/htdocs/modulebuilder/template/README.md b/htdocs/modulebuilder/template/README.md index 5e2af06a430..ba723bf5195 100644 --- a/htdocs/modulebuilder/template/README.md +++ b/htdocs/modulebuilder/template/README.md @@ -1,221 +1,6 @@ -Dolibarr Module Template (aka My Module) -======================================== +# MYMODULE FOR DOLIBARR ERP CRM -This is a full featured module template for Dolibarr. -It's a tool for module developers to kickstart their project and give an hands-on sample of which features Dolibarr has to offer for module development. +## Features +MyModuleDescription -If you're not a module developer you have no use for this. - -Documentation -------------- - -[Module tutorial](http://wiki.dolibarr.org/index.php/Module_development) - -[Dolibarr development](http://wiki.dolibarr.org/index.php/Developer_documentation) - -### Translations - -Dolibarr uses [Transifex](http://transifex.com) to manage it's translations. - -This template also contains a sample configuration for Transifex managed translations under the hidden [.tx](.tx) directory. - -For more informations, see the [translator's documentation](http://wiki.dolibarr.org/index.php/Translator_documentation). - -There is a [Transifex project](http://transifex.com/projects/p/dolibarr-module-template) for this module. - -Install -------- - -### Manually - -- Make sure Dolibarr (>= 3.3.x) is already installed and configured on your workstation or development server. - -- In your Dolibarr installation directory, edit the ```htdocs/conf/conf.php``` file - -- Find the following lines: - ```php - //$dolibarr_main_url_root_alt ... - //$dolibarr_main_document_root_alt ... - ``` - -- Uncomment these lines (delete the leading ```//```) and assign a sensible value according to your Dolibarr installation - - For example : - - - UNIX: - ```php - $dolibarr_main_url_root = 'http://localhost/Dolibarr/htdocs'; - $dolibarr_main_document_root = '/var/www/Dolibarr/htdocs'; - $dolibarr_main_url_root_alt = '/custom'; - $dolibarr_main_document_root_alt = '/var/www/Dolibarr/htdocs/custom'; - ``` - - - Windows: - ```php - $dolibarr_main_url_root = 'http://localhost/Dolibarr/htdocs'; - $dolibarr_main_document_root = 'C:/My Web Sites/Dolibarr/htdocs'; - $dolibarr_main_url_root_alt = '/custom'; - $dolibarr_main_document_root_alt = 'C:/My Web Sites/Dolibarr/htdocs/custom'; - ``` - - For more information about the ```conf.php``` file take a look at the conf.php.example file. - -*Note that for Dolibarr versions before 3.5, the ```$dolibarr_main_url_root_alt``` has to be an absolute path* - -- Clone the repository in ```$dolibarr_main_document_root_alt/mymodule``` - -*(You may have to create the ```htdocs/custom``` directory first if it doesn't exist yet.)* -```sh -git clone git@github.com:Dolibarr/dolibarr-module-template.git mymodule -``` - -- Install [Composer](https://getcomposer.org) dependencies: -```sh -composer install -``` - -Follow the [final steps](#final_steps). - -### Using [Composer](https://getcomposer.org) -Require this repository from Dolibarr's composer: -```json -{ - "repositories": [ - { - "type": "vcs", - "url": "https://github.com/dolibarr/dolibarr-module-template" - } - ], - "require": { - "dolibarr/mymodule": "dev-master" - } -} -``` - -Run -```sh -composer update -``` - -Follow the [final steps](#final_steps). - -### Final steps - -From your browser: - - - Log into Dolibarr as a super-administrator - - Under "Setup" -> "Other setup", set ```MAIN_FEATURES_LEVEL``` to ```2``` - - Go to "Setup" -> "Modules" - - The module is under one of the tabs - - You should now be able to enable the new module and start coding ;) - -Provided tools --------------- - -### Starting a new module - -A [script](dev/newmodule.sh) allows you to rename most of the code to your own module name. -It requires ```find```, ```sed``` and ```rename``` commands on your system. -Just make sure you provide a CamelCase name. -```sh -./dev/newmodule.sh [NewName] -``` - -Some work still has to be done manually: -- Rename the directory holding the code -- Maybe rename some other bits (Search for 'my' in filenames and code) -- Update your module ID in the module descriptor -- Update your language files - - Keywords based on the module ID - - String referencing the template -- Remove the features you don't plan to use -- Fill the copyright notices at the top of each file -- Add your logo: see [images README](dev/img/README.md) for specifications -- Start a new GIT history -``` -git checkout --orphan [new_branch_name] -``` -- Build an awesome module ;) - -### Composer scripts - -Only the main commands are listed here. -See the [composer comments](composer-comments.md) or the [composer.json](composer.json) itself for more informations. - -#### Check - -Run a linter, a PHP compatibility version checker and checks coding style. -```sh -composer check -``` - -#### Test - -Run unit and functional tests. -```sh -composer test -``` - -#### Doc -Build code and user documentation. - -#### Release - -Run the checks and tests then build a distribution ZIP. -```sh -composer release -``` - -#### Git hooks - -Optional [GIT hooks](https://git-scm.com/book/it/v2/Customizing-Git-Git-Hooks) are provided. -These are just wrappers calling composer scripts. -They ensure best practices are followed during module development. - -Install: -```sh -composer git_hooks_install -``` - -Remove: -```sh -composer git_hooks_remove -``` - -## Publishing the module -The de-facto standard for publishing and marketing modules for Dolibarr is the [Dolistore](https://www.dolistore.com). -Templates for required images and texts are [provided](dev/dolistore). -Check the dedicated [README](dev/dolistore/README.md) for more informations. - -Contributions -------------- - -Feel free to contribute and report defects on our [issue tracker](http://github.com/Dolibarr/dolibarr-module-template/issues). - -Licenses --------- - -### Main code - -![GPLv3 logo](img/gplv3.png) - -GPLv3 or (at your option) any later version. - -See [COPYING](COPYING) for more information. - -### Other Licenses - -#### [Parsedown](http://parsedown.org/) - -Used to display this README in the module's about page. -Licensed under MIT. - -#### [GNU Licenses logos](https://www.gnu.org/graphics/license-logos.html) - -Public domain - -#### Documentation - -All texts and readmes. - -![GFDL logo](img/gfdl.png) +Other modules are available on Dolistore.com. diff --git a/htdocs/modulebuilder/template/admin/about.php b/htdocs/modulebuilder/template/admin/about.php index 6953af2ef38..844c444bad2 100644 --- a/htdocs/modulebuilder/template/admin/about.php +++ b/htdocs/modulebuilder/template/admin/about.php @@ -17,7 +17,7 @@ */ /** - * \file admin/about.php + * \file htdocs/modulebuilder/template/admin/about.php * \ingroup mymodule * \brief About page of module MyModule. * diff --git a/htdocs/modulebuilder/template/admin/setup.php b/htdocs/modulebuilder/template/admin/setup.php index 8bc2c6d9ded..63b92bc6468 100644 --- a/htdocs/modulebuilder/template/admin/setup.php +++ b/htdocs/modulebuilder/template/admin/setup.php @@ -17,7 +17,7 @@ */ /** - * \file admin/setup.php + * \file htdocs/modulebuilder/template/admin/setup.php * \ingroup mymodule * \brief Example module setup page. * @@ -57,8 +57,8 @@ $page_name = "MyModuleSetup"; llxHeader('', $langs->trans($page_name)); // Subheader -$linkback = '' - . $langs->trans("BackToModuleList") . ''; +$linkback = '' . $langs->trans("BackToModuleList") . ''; + print load_fiche_titre($langs->trans($page_name), $linkback); // Configuration header diff --git a/htdocs/modulebuilder/template/class/MyTrigger.php b/htdocs/modulebuilder/template/class/MyTrigger.php deleted file mode 100644 index 61604b7ff72..00000000000 --- a/htdocs/modulebuilder/template/class/MyTrigger.php +++ /dev/null @@ -1,51 +0,0 @@ - - * Copyright (C) - * - * 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 3 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 class/MyTrigger.php - * \ingroup mymodule - * \brief Compatibility class for triggers in Dolibarr < 3.7. - * - * Hack for compatibility with Dolibarr versions < 3.7. - * Remove this and extend DolibarrTriggers directly from interface_99_modMyModule_MyTrigger.class.php - * if you don't intend to support these versions. - */ - -// We ignore the PSR1.Classes.ClassDeclaration.MultipleClasses rule. -// @codingStandardsIgnoreStart -$dolibarr_version = versiondolibarrarray(); -if ($dolibarr_version[0] < 3 || ($dolibarr_version[0] == 3 && $dolibarr_version[1] < 7)) { // DOL_VERSION < 3.7 - /** - * Class MyTrigger - * - * For Dolibarr < 3.7. - */ - abstract class MyTrigger - { - } -} else { - /** - * Class MyTrigger - * - * For Dolibarr >= 3.7 - */ - abstract class MyTrigger extends DolibarrTriggers - { - } -} -// @codingStandardsIgnoreEnd diff --git a/htdocs/modulebuilder/template/class/actions_mymodule.class.php b/htdocs/modulebuilder/template/class/actions_mymodule.class.php index 7047332bbfc..f3ce5963aa6 100644 --- a/htdocs/modulebuilder/template/class/actions_mymodule.class.php +++ b/htdocs/modulebuilder/template/class/actions_mymodule.class.php @@ -17,7 +17,7 @@ */ /** - * \file class/actions_mymodule.class.php + * \file htdocs/modulebuilder/template/class/actions_mymodule.class.php * \ingroup mymodule * \brief Example hook overload. * diff --git a/htdocs/modulebuilder/template/class/myclass.class.php b/htdocs/modulebuilder/template/class/myclass.class.php deleted file mode 100644 index 336ccf7c98a..00000000000 --- a/htdocs/modulebuilder/template/class/myclass.class.php +++ /dev/null @@ -1,361 +0,0 @@ - - * Copyright (C) - * - * 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 3 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 class/myclass.class.php - * \ingroup mymodule - * \brief Example CRUD (Create/Read/Update/Delete) class. - * - * Put detailed description here. - */ - -/** Includes */ -//require_once DOL_DOCUMENT_ROOT."/core/class/commonobject.class.php"; -//require_once DOL_DOCUMENT_ROOT."/societe/class/societe.class.php"; -//require_once DOL_DOCUMENT_ROOT."/product/class/product.class.php"; - -/** - * Put your class' description here - */ -class MyClass // extends CommonObject -{ - - /** @var DoliDb Database handler */ - private $db; - /** @var string Error code or message */ - public $error; - /** @var array Several error codes or messages */ - public $errors = array(); - /** @var string Id to identify managed object */ - //public $element='myelement'; - /** @var string Name of table without prefix where object is stored */ - //public $table_element='mytable'; - /** @var int An example ID */ - public $id; - /** @var mixed An example property */ - public $prop1; - /** @var mixed An example property */ - public $prop2; - - /** - * Constructor - * - * @param DoliDb $db Database handler - */ - public function __construct($db) - { - $this->db = $db; - - return 1; - } - - /** - * Create object into database - * - * @param User $user User that create - * @param int $notrigger 0=launch triggers after, 1=disable triggers - * @return int <0 if KO, Id of created object if OK - */ - public function create($user, $notrigger = 0) - { - global $conf, $langs; - $error = 0; - - // Clean parameters - if (isset($this->prop1)) { - $this->prop1 = trim($this->prop1); - } - if (isset($this->prop2)) { - $this->prop2 = trim($this->prop2); - } - - // Check parameters - // Put here code to add control on parameters values - // Insert request - $sql = "INSERT INTO " . MAIN_DB_PREFIX . "mytable("; - $sql.= " field1,"; - $sql.= " field2"; - - $sql.= ") VALUES ("; - $sql.= " '" . $this->prop1 . "',"; - $sql.= " '" . $this->prop2 . "'"; - - $sql.= ")"; - - $this->db->begin(); - - dol_syslog(__METHOD__ . " sql=" . $sql, LOG_DEBUG); - $resql = $this->db->query($sql); - if (! $resql) { - $error ++; - $this->errors[] = "Error " . $this->db->lasterror(); - } - - if (! $error) { - $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . "mytable"); - - if (! $notrigger) { - // Uncomment this and change MYOBJECT to your own tag if you - // want this action call a trigger. - //// Call triggers - //include_once DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php"; - //$interface=new Interfaces($this->db); - //$result=$interface->run_triggers('MYOBJECT_CREATE',$this,$user,$langs,$conf); - //if ($result < 0) { $error++; $this->errors=$interface->errors; } - //// End call triggers - } - } - - // Commit or rollback - if ($error) { - foreach ($this->errors as $errmsg) { - dol_syslog(__METHOD__ . " " . $errmsg, LOG_ERR); - $this->error.=($this->error ? ', ' . $errmsg : $errmsg); - } - $this->db->rollback(); - - return -1 * $error; - } else { - $this->db->commit(); - - return $this->id; - } - } - - /** - * Load object in memory from database - * - * @param int $id Id object - * @return int <0 if KO, >0 if OK - */ - public function fetch($id) - { - global $langs; - $sql = "SELECT"; - $sql.= " t.rowid,"; - $sql.= " t.field1,"; - $sql.= " t.field2"; - //... - $sql.= " FROM " . MAIN_DB_PREFIX . "mytable as t"; - $sql.= " WHERE t.rowid = " . $id; - - dol_syslog(__METHOD__ . " sql=" . $sql, LOG_DEBUG); - $resql = $this->db->query($sql); - if ($resql) { - if ($this->db->num_rows($resql)) { - $obj = $this->db->fetch_object($resql); - - $this->id = $obj->rowid; - $this->prop1 = $obj->field1; - $this->prop2 = $obj->field2; - //... - } - $this->db->free($resql); - - return 1; - } else { - $this->error = "Error " . $this->db->lasterror(); - dol_syslog(__METHOD__ . " " . $this->error, LOG_ERR); - - return -1; - } - } - - /** - * Update object into database - * - * @param User $user User that modify - * @param int $notrigger 0=launch triggers after, 1=disable triggers - * @return int <0 if KO, >0 if OK - */ - public function update($user = 0, $notrigger = 0) - { - global $conf, $langs; - $error = 0; - - // Clean parameters - if (isset($this->prop1)) { - $this->prop1 = trim($this->prop1); - } - if (isset($this->prop2)) { - $this->prop2 = trim($this->prop2); - } - - // Check parameters - // Put here code to add control on parameters values - // Update request - $sql = "UPDATE " . MAIN_DB_PREFIX . "mytable SET"; - $sql.= " field1=" . (isset($this->field1) ? "'" . $this->db->escape($this->field1) . "'" : "null") . ","; - $sql.= " field2=" . (isset($this->field2) ? "'" . $this->db->escape($this->field2) . "'" : "null") . ""; - - $sql.= " WHERE rowid=" . $this->id; - - $this->db->begin(); - - dol_syslog(__METHOD__ . " sql=" . $sql, LOG_DEBUG); - $resql = $this->db->query($sql); - if (! $resql) { - $error ++; - $this->errors[] = "Error " . $this->db->lasterror(); - } - - if (! $error) { - if (! $notrigger) { - // Uncomment this and change MYOBJECT to your own tag if you - // want this action call a trigger. - //// Call triggers - //include_once DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php"; - //$interface=new Interfaces($this->db); - //$result=$interface->run_triggers('MYOBJECT_MODIFY',$this,$user,$langs,$conf); - //if ($result < 0) { $error++; $this->errors=$interface->errors; } - //// End call triggers - } - } - - // Commit or rollback - if ($error) { - foreach ($this->errors as $errmsg) { - dol_syslog(__METHOD__ . " " . $errmsg, LOG_ERR); - $this->error.=($this->error ? ', ' . $errmsg : $errmsg); - } - $this->db->rollback(); - - return -1 * $error; - } else { - $this->db->commit(); - - return 1; - } - } - - /** - * Delete object in database - * - * @param User $user User that delete - * @param int $notrigger 0=launch triggers after, 1=disable triggers - * @return int <0 if KO, >0 if OK - */ - public function delete($user, $notrigger = 0) - { - global $conf, $langs; - $error = 0; - - $this->db->begin(); - - if (! $error) { - if (! $notrigger) { - // Uncomment this and change MYOBJECT to your own tag if you - // want this action call a trigger. - //// Call triggers - //include_once DOL_DOCUMENT_ROOT . "/core/class/interfaces.class.php"; - //$interface=new Interfaces($this->db); - //$result=$interface->run_triggers('MYOBJECT_DELETE',$this,$user,$langs,$conf); - //if ($result < 0) { $error++; $this->errors=$interface->errors; } - //// End call triggers - } - } - - if (! $error) { - $sql = "DELETE FROM " . MAIN_DB_PREFIX . "mytable"; - $sql.= " WHERE rowid=" . $this->id; - - dol_syslog(__METHOD__ . " sql=" . $sql); - $resql = $this->db->query($sql); - if (! $resql) { - $error ++; - $this->errors[] = "Error " . $this->db->lasterror(); - } - } - - // Commit or rollback - if ($error) { - foreach ($this->errors as $errmsg) { - dol_syslog(__METHOD__ . " " . $errmsg, LOG_ERR); - $this->error.=($this->error ? ', ' . $errmsg : $errmsg); - } - $this->db->rollback(); - - return -1 * $error; - } else { - $this->db->commit(); - - return 1; - } - } - - /** - * Load an object from its id and create a new one in database - * - * @param int $fromid Id of object to clone - * @return int New id of clone - */ - public function createFromClone($fromid) - { - global $user, $langs; - - $error = 0; - - $object = new SkeletonClass($this->db); - - $this->db->begin(); - - // Load source object - $object->fetch($fromid); - $object->id = 0; - $object->statut = 0; - - // Clear fields - // ... - // Create clone - $result = $object->create($user); - - // Other options - if ($result < 0) { - $this->error = $object->error; - $error ++; - } - - if (! $error) { - // Do something - } - - // End - if (! $error) { - $this->db->commit(); - - return $object->id; - } else { - $this->db->rollback(); - - return -1; - } - } - - /** - * Initialise object with example values - * Id must be 0 if object instance is a specimen - * - * @return void - */ - public function initAsSpecimen() - { - $this->id = 0; - $this->prop1 = 'prop1'; - $this->prop2 = 'prop2'; - } -} diff --git a/htdocs/modulebuilder/template/class/myobject.class.php b/htdocs/modulebuilder/template/class/myobject.class.php new file mode 100644 index 00000000000..292c6a139a4 --- /dev/null +++ b/htdocs/modulebuilder/template/class/myobject.class.php @@ -0,0 +1,607 @@ + + * Copyright (C) 2014-2016 Juanjo Menent + * Copyright (C) 2015 Florian Henry + * Copyright (C) 2015 Raphaël Doursenaud + * Copyright (C) ---Put here your own copyright and developer email--- + * + * 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 3 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/modulebuilder/template/class/myobject.class.php + * \ingroup mymodule othermodule1 othermodule2 + * \brief This file is an example for a CRUD class file (Create/Read/Update/Delete) + */ + +// Put here all includes required by your class file +require_once DOL_DOCUMENT_ROOT . '/core/class/commonobject.class.php'; +//require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php'; +//require_once DOL_DOCUMENT_ROOT . '/product/class/product.class.php'; + +/** + * Class MyModuleObject + * + * Put here description of your class. + */ +class MyModuleObject extends CommonObject +{ + /** + * @var string Id to identify managed object + */ + public $element = 'mymoduleobject'; + /** + * @var string Name of table without prefix where object is stored + */ + public $table_element = 'mymoduleobject'; + /** + * @var array Array with all fields and their property + */ + public $picto = 'generic'; + /** + * @var array Array with all fields and their property + */ + public $fields; + + /** + * @var mixed Sample property 1 + */ + public $prop1; + /** + * @var mixed Sample property 2 + */ + public $prop2; + + //... + + protected $ismultientitymanaged = 1; // 0=No test on entity, 1=Test with field entity, 2=Test with link by societe + + public $table_element_line = 'mymoduleobjectdet'; + public $class_element_line = 'MyModuleObjectline'; + public $fk_element = 'fk_mymoduleobject'; + + /** + * @var MyModuleObjectLine[] Lines + */ + public $lines = array(); + + + + /** + * Constructor + * + * @param DoliDb $db Database handler + */ + public function __construct(DoliDB $db) + { + $this->db = $db; + } + + /** + * Create object into database + * + * @param User $user User that creates + * @param bool $notrigger false=launch triggers after, true=disable triggers + * + * @return int <0 if KO, Id of created object if OK + */ + public function create(User $user, $notrigger = false) + { + dol_syslog(__METHOD__, LOG_DEBUG); + + $error = 0; + + // Clean parameters + if (isset($this->prop1)) { + $this->prop1 = trim($this->prop1); + } + if (isset($this->prop2)) { + $this->prop2 = trim($this->prop2); + } + //... + + // Check parameters + // Put here code to add control on parameters values + + // Insert request + $sql = 'INSERT INTO ' . MAIN_DB_PREFIX . $this->table_element . '('; + $sql .= ' field1,'; + $sql .= ' field2'; + //... + $sql .= ') VALUES ('; + $sql .= ' \'' . $this->prop1 . '\','; + $sql .= ' \'' . $this->prop2 . '\''; + //... + $sql .= ')'; + + $this->db->begin(); + + $resql = $this->db->query($sql); + if (!$resql) { + $error ++; + $this->errors[] = 'Error ' . $this->db->lasterror(); + dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR); + } + + if (!$error) { + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . $this->table_element); + + if (!$notrigger) { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action to call a trigger. + + //// Call triggers + //$result=$this->call_trigger('MYOBJECT_CREATE',$user); + //if ($result < 0) $error++; + //// End call triggers + } + } + + // Commit or rollback + if ($error) { + $this->db->rollback(); + + return - 1 * $error; + } else { + $this->db->commit(); + + return $this->id; + } + } + + /** + * Load object in memory from the database + * + * @param int $id Id object + * @param string $ref Ref + * + * @return int <0 if KO, 0 if not found, >0 if OK + */ + public function fetch($id, $ref = null) + { + dol_syslog(__METHOD__, LOG_DEBUG); + + $sql = 'SELECT'; + $sql .= ' t.rowid,'; + $sql .= ' t.field1,'; + $sql .= ' t.field2'; + //... + $sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element . ' as t'; + $sql.= ' WHERE 1 = 1'; + if (! empty($conf->multicompany->enabled)) { + $sql .= " AND entity IN (" . getEntity("mymoduleobject", 1) . ")"; + } + if (null !== $ref) { + $sql .= ' AND t.ref = ' . '\'' . $ref . '\''; + } else { + $sql .= ' AND t.rowid = ' . $id; + } + + $resql = $this->db->query($sql); + if ($resql) { + $numrows = $this->db->num_rows($resql); + if ($numrows) { + $obj = $this->db->fetch_object($resql); + + $this->id = $obj->rowid; + $this->prop1 = $obj->field1; + $this->prop2 = $obj->field2; + //... + } + + // Retrieve all extrafields for invoice + // fetch optionals attributes and labels + /* + require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; + $extrafields=new ExtraFields($this->db); + $extralabels=$extrafields->fetch_name_optionals_label($this->table_element,true); + $this->fetch_optionals($this->id,$extralabels); + */ + + // $this->fetch_lines(); + + $this->db->free($resql); + + if ($numrows) { + return 1; + } else { + return 0; + } + } else { + $this->errors[] = 'Error ' . $this->db->lasterror(); + dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR); + + return - 1; + } + } + + /** + * Load object in memory from the database + * + * @param string $sortorder Sort Order + * @param string $sortfield Sort field + * @param int $limit offset limit + * @param int $offset offset limit + * @param array $filter filter array + * @param string $filtermode filter mode (AND or OR) + * + * @return int <0 if KO, >0 if OK + */ + public function fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, array $filter = array(), $filtermode='AND') + { + dol_syslog(__METHOD__, LOG_DEBUG); + + $sql = 'SELECT'; + $sql .= ' t.rowid,'; + $sql .= ' t.field1,'; + $sql .= ' t.field2'; + //... + $sql .= ' FROM ' . MAIN_DB_PREFIX . $this->table_element. ' as t'; + + // Manage filter + $sqlwhere = array(); + if (count($filter) > 0) { + foreach ($filter as $key => $value) { + $sqlwhere [] = $key . ' LIKE \'%' . $this->db->escape($value) . '%\''; + } + } + $sql.= ' WHERE 1 = 1'; + if (! empty($conf->multicompany->enabled)) { + $sql .= " AND entity IN (" . getEntity("mymoduleobject", 1) . ")"; + } + if (count($sqlwhere) > 0) { + $sql .= ' AND ' . implode(' '.$filtermode.' ', $sqlwhere); + } + if (!empty($sortfield)) { + $sql .= $this->db->order($sortfield,$sortorder); + } + if (!empty($limit)) { + $sql .= ' ' . $this->db->plimit($limit, $offset); + } + + $resql = $this->db->query($sql); + if ($resql) { + $num = $this->db->num_rows($resql); + + while ($obj = $this->db->fetch_object($resql)) { + $line = new self($this->db); + + $line->id = $obj->rowid; + $line->prop1 = $obj->field1; + $line->prop2 = $obj->field2; + //... + } + $this->db->free($resql); + + return $num; + } else { + $this->errors[] = 'Error ' . $this->db->lasterror(); + dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR); + + return - 1; + } + } + + /** + * Update object into database + * + * @param User $user User that modifies + * @param bool $notrigger false=launch triggers after, true=disable triggers + * + * @return int <0 if KO, >0 if OK + */ + public function update(User $user, $notrigger = false) + { + dol_syslog(__METHOD__, LOG_DEBUG); + + $error = 0; + + // Clean parameters + if (isset($this->prop1)) { + $this->prop1 = trim($this->prop1); + } + if (isset($this->prop2)) { + $this->prop2 = trim($this->prop2); + } + //... + + // Check parameters + // Put here code to add a control on parameters values + + // Update request + $sql = 'UPDATE ' . MAIN_DB_PREFIX . $this->table_element . ' SET'; + $sql .= " field1=".(isset($this->field1)?"'".$this->db->escape($this->field1)."'":"null").","; + $sql .= " field2=".(isset($this->field2)?"'".$this->db->escape($this->field2)."'":"null").""; + //... + $sql .= ' WHERE rowid=' . $this->id; + + $this->db->begin(); + + $resql = $this->db->query($sql); + if (!$resql) { + $error ++; + $this->errors[] = 'Error ' . $this->db->lasterror(); + dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR); + } + + if (!$error && !$notrigger) { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action calls a trigger. + + //// Call triggers + //$result=$this->call_trigger('MYOBJECT_MODIFY',$user); + //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} + //// End call triggers + } + + // Commit or rollback + if ($error) { + $this->db->rollback(); + + return - 1 * $error; + } else { + $this->db->commit(); + + return 1; + } + } + + /** + * Delete object in database + * + * @param User $user User that deletes + * @param bool $notrigger false=launch triggers after, true=disable triggers + * + * @return int <0 if KO, >0 if OK + */ + public function delete(User $user, $notrigger = false) + { + dol_syslog(__METHOD__, LOG_DEBUG); + + $error = 0; + + $this->db->begin(); + + if (!$error) { + if (!$notrigger) { + // Uncomment this and change MYOBJECT to your own tag if you + // want this action calls a trigger. + + //// Call triggers + //$result=$this->call_trigger('MYOBJECT_DELETE',$user); + //if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} + //// End call triggers + } + } + + // If you need to delete child tables to, you can insert them here + + if (!$error) { + $sql = 'DELETE FROM ' . MAIN_DB_PREFIX . $this->table_element; + $sql .= ' WHERE rowid=' . $this->id; + + $resql = $this->db->query($sql); + if (!$resql) { + $error ++; + $this->errors[] = 'Error ' . $this->db->lasterror(); + dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR); + } + } + + // Commit or rollback + if ($error) { + $this->db->rollback(); + + return - 1 * $error; + } else { + $this->db->commit(); + + return 1; + } + } + + /** + * Load an object from its id and create a new one in database + * + * @param int $fromid Id of object to clone + * + * @return int New id of clone + */ + public function createFromClone($fromid) + { + dol_syslog(__METHOD__, LOG_DEBUG); + + global $user; + $error = 0; + $object = new MyModuleObject($this->db); + + $this->db->begin(); + + // Load source object + $object->fetch($fromid); + // Reset object + $object->id = 0; + + // Clear fields + // ... + + // Create clone + $result = $object->create($user); + + // Other options + if ($result < 0) { + $error ++; + $this->errors = $object->errors; + dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR); + } + + // End + if (!$error) { + $this->db->commit(); + + return $object->id; + } else { + $this->db->rollback(); + + return - 1; + } + } + + /** + * Return a link to the object card (with optionaly the picto) + * + * @param int $withpicto Include picto in link (0=No picto, 1=Include picto into link, 2=Only picto) + * @param string $option On what the link point to + * @param int $notooltip 1=Disable tooltip + * @param int $maxlen Max length of visible user name + * @param string $morecss Add more css on link + * @return string String with URL + */ + function getNomUrl($withpicto=0, $option='', $notooltip=0, $maxlen=24, $morecss='') + { + global $db, $conf, $langs; + global $dolibarr_main_authentication, $dolibarr_main_demo; + global $menumanager; + + if (! empty($conf->dol_no_mouse_hover)) $notooltip=1; // Force disable tooltips + + $result = ''; + $companylink = ''; + + $label = '' . $langs->trans("MyModule") . ''; + $label.= '
        '; + $label.= '' . $langs->trans('Ref') . ': ' . $this->ref; + + $url = DOL_URL_ROOT.'/mymodule/'.$this->table_name.'_card.php?id='.$this->id; + + $linkclose=''; + if (empty($notooltip)) + { + if (! empty($conf->global->MAIN_OPTIMIZEFORTEXTBROWSER)) + { + $label=$langs->trans("ShowProject"); + $linkclose.=' alt="'.dol_escape_htmltag($label, 1).'"'; + } + $linkclose.=' title="'.dol_escape_htmltag($label, 1).'"'; + $linkclose.=' class="classfortooltip'.($morecss?' '.$morecss:'').'"'; + } + else $linkclose = ($morecss?' class="'.$morecss.'"':''); + + $linkstart = ''; + $linkend=''; + + if ($withpicto) + { + $result.=($linkstart.img_object(($notooltip?'':$label), 'label', ($notooltip?'':'class="classfortooltip"')).$linkend); + if ($withpicto != 2) $result.=' '; + } + $result.= $linkstart . $this->ref . $linkend; + return $result; + } + + /** + * Retourne le libelle du status d'un user (actif, inactif) + * + * @param int $mode 0=libelle long, 1=libelle court, 2=Picto + Libelle court, 3=Picto, 4=Picto + Libelle long, 5=Libelle court + Picto + * @return string Label of status + */ + function getLibStatut($mode=0) + { + return $this->LibStatut($this->status,$mode); + } + + /** + * Return the status + * + * @param int $status Id status + * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 5=Long label + Picto + * @return string Label of status + */ + static function LibStatut($status,$mode=0) + { + global $langs; + + if ($mode == 0) + { + $prefix=''; + if ($status == 1) return $langs->trans('Enabled'); + if ($status == 0) return $langs->trans('Disabled'); + } + if ($mode == 1) + { + if ($status == 1) return $langs->trans('Enabled'); + if ($status == 0) return $langs->trans('Disabled'); + } + if ($mode == 2) + { + if ($status == 1) return img_picto($langs->trans('Enabled'),'statut4').' '.$langs->trans('Enabled'); + if ($status == 0) return img_picto($langs->trans('Disabled'),'statut5').' '.$langs->trans('Disabled'); + } + if ($mode == 3) + { + if ($status == 1) return img_picto($langs->trans('Enabled'),'statut4'); + if ($status == 0) return img_picto($langs->trans('Disabled'),'statut5'); + } + if ($mode == 4) + { + if ($status == 1) return img_picto($langs->trans('Enabled'),'statut4').' '.$langs->trans('Enabled'); + if ($status == 0) return img_picto($langs->trans('Disabled'),'statut5').' '.$langs->trans('Disabled'); + } + if ($mode == 5) + { + if ($status == 1) return $langs->trans('Enabled').' '.img_picto($langs->trans('Enabled'),'statut4'); + if ($status == 0) return $langs->trans('Disabled').' '.img_picto($langs->trans('Disabled'),'statut5'); + } + if ($mode == 6) + { + if ($status == 1) return $langs->trans('Enabled').' '.img_picto($langs->trans('Enabled'),'statut4'); + if ($status == 0) return $langs->trans('Disabled').' '.img_picto($langs->trans('Disabled'),'statut5'); + } + } + + + /** + * Initialise object with example values + * Id must be 0 if object instance is a specimen + * + * @return void + */ + public function initAsSpecimen() + { + $this->id = 0; + $this->prop1 = 'prop1'; + $this->prop2 = 'prop2'; + } + +} + +/** + * Class MyModuleObjectLine + */ +class MyModuleObjectLine +{ + /** + * @var int ID + */ + public $id; + /** + * @var mixed Sample line property 1 + */ + public $prop1; + /** + * @var mixed Sample line property 2 + */ + public $prop2; +} diff --git a/htdocs/modulebuilder/template/class/myobject_api_class.class.php b/htdocs/modulebuilder/template/class/myobject_api_class.class.php new file mode 100644 index 00000000000..8f0dbee2e38 --- /dev/null +++ b/htdocs/modulebuilder/template/class/myobject_api_class.class.php @@ -0,0 +1,292 @@ + + * + * 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 3 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 . + */ + +use Luracast\Restler\RestException; + +/** + * \file htdocs/modulebuilder/template/class/myobject_api_class.class.php + * \ingroup mymodule + * \brief File for API management of myobject. + */ + +/** + * API class for mymodule myobject + * + * @smart-auto-routing false + * @access protected + * @class DolibarrApiAccess {@requires user,external} + */ +class MyObjectApi extends DolibarrApi +{ + /** + * @var array $FIELDS Mandatory fields, checked when create and update object + */ + static $FIELDS = array( + 'name' + ); + + /** + * @var MyObject $myobject {@type MyObject} + */ + public $myobject; + + /** + * Constructor + * + * @url GET myobject/ + * + */ + function __construct() + { + global $db, $conf; + $this->db = $db; + $this->myobject = new MyObject($this->db); + } + + /** + * Get properties of a myobject object + * + * Return an array with myobject informations + * + * @param int $id ID of myobject + * @return array|mixed data without useless information + * + * @url GET myobject/{id} + * @throws RestException + */ + function get($id) + { + if(! DolibarrApiAccess::$user->rights->myobject->read) { + throw new RestException(401); + } + + $result = $this->myobject->fetch($id); + if( ! $result ) { + throw new RestException(404, 'MyObject not found'); + } + + if( ! DolibarrApi::_checkAccessToResource('myobject',$this->myobject->id)) { + throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); + } + + return $this->_cleanObjectDatas($this->myobject); + } + + /** + * List myobjects + * + * Get a list of myobjects + * + * @param int $mode Use this param to filter list + * @param string $sortfield Sort field + * @param string $sortorder Sort order + * @param int $limit Limit for list + * @param int $page Page number + * @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.ref:like:'SO-%') and (t.date_creation:<:'20160101') or (t.import_key:=:'20160101')" + * @return array Array of myobject objects + * + * @url GET /myobjects/ + */ + function index($mode, $sortfield = "t.rowid", $sortorder = 'ASC', $limit = 0, $page = 0, $sqlfilters = '') { + global $db, $conf; + + $obj_ret = array(); + + $socid = DolibarrApiAccess::$user->societe_id ? DolibarrApiAccess::$user->societe_id : ''; + + // If the internal user must only see his customers, force searching by him + if (! DolibarrApiAccess::$user->rights->societe->client->voir && !$socid) $search_sale = DolibarrApiAccess::$user->id; + + $sql = "SELECT s.rowid"; + if ((!DolibarrApiAccess::$user->rights->societe->client->voir && !$socid) || $search_sale > 0) $sql .= ", sc.fk_soc, sc.fk_user"; // We need these fields in order to filter by sale (including the case where the user can only see his prospects) + $sql.= " FROM ".MAIN_DB_PREFIX."myobject as s"; + + if ((!DolibarrApiAccess::$user->rights->societe->client->voir && !$socid) || $search_sale > 0) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; // We need this table joined to the select in order to filter by sale + $sql.= ", ".MAIN_DB_PREFIX."c_stcomm as st"; + $sql.= " WHERE s.fk_stcomm = st.id"; + + // Example of use $mode + //if ($mode == 1) $sql.= " AND s.client IN (1, 3)"; + //if ($mode == 2) $sql.= " AND s.client IN (2, 3)"; + + $sql.= ' AND s.entity IN ('.getEntity('myobject', 1).')'; + if ((!DolibarrApiAccess::$user->rights->societe->client->voir && !$socid) || $search_sale > 0) $sql.= " AND s.fk_soc = sc.fk_soc"; + if ($socid) $sql.= " AND s.fk_soc = ".$socid; + if ($search_sale > 0) $sql.= " AND s.rowid = sc.fk_soc"; // Join for the needed table to filter by sale + // Insert sale filter + if ($search_sale > 0) + { + $sql .= " AND sc.fk_user = ".$search_sale; + } + if ($sqlfilters) + { + if (! DolibarrApi::_checkFilters($sqlfilters)) + { + throw new RestException(503, 'Error when validating parameter sqlfilters '.$sqlfilters); + } + $regexstring='\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)'; + $sql.=" AND (".preg_replace_callback('/'.$regexstring.'/', 'DolibarrApi::_forge_criteria_callback', $sqlfilters).")"; + } + + $sql.= $db->order($sortfield, $sortorder); + if ($limit) { + if ($page < 0) + { + $page = 0; + } + $offset = $limit * $page; + + $sql.= $db->plimit($limit + 1, $offset); + } + + $result = $db->query($sql); + if ($result) + { + $num = $db->num_rows($result); + while ($i < $num) + { + $obj = $db->fetch_object($result); + $myobject_static = new MyObject($db); + if($myobject_static->fetch($obj->rowid)) { + $obj_ret[] = parent::_cleanObjectDatas($myobject_static); + } + $i++; + } + } + else { + throw new RestException(503, 'Error when retrieve myobject list'); + } + if( ! count($obj_ret)) { + throw new RestException(404, 'No myobject found'); + } + return $obj_ret; + } + + /** + * Create myobject object + * + * @param array $request_data Request datas + * @return int ID of myobject + * + * @url POST myobject/ + */ + function post($request_data = NULL) + { + if(! DolibarrApiAccess::$user->rights->myobject->create) { + throw new RestException(401); + } + // Check mandatory fields + $result = $this->_validate($request_data); + + foreach($request_data as $field => $value) { + $this->myobject->$field = $value; + } + if( ! $this->myobject->create(DolibarrApiAccess::$user)) { + throw new RestException(500); + } + return $this->myobject->id; + } + + /** + * Update myobject + * + * @param int $id Id of myobject to update + * @param array $request_data Datas + * @return int + * + * @url PUT myobject/{id} + */ + function put($id, $request_data = NULL) + { + if(! DolibarrApiAccess::$user->rights->myobject->create) { + throw new RestException(401); + } + + $result = $this->myobject->fetch($id); + if( ! $result ) { + throw new RestException(404, 'MyObject not found'); + } + + if( ! DolibarrApi::_checkAccessToResource('myobject',$this->myobject->id)) { + throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); + } + + foreach($request_data as $field => $value) { + $this->myobject->$field = $value; + } + + if($this->myobject->update($id, DolibarrApiAccess::$user)) + return $this->get ($id); + + return false; + } + + /** + * Delete myobject + * + * @param int $id MyObject ID + * @return array + * + * @url DELETE myobject/{id} + */ + function delete($id) + { + if(! DolibarrApiAccess::$user->rights->myobject->supprimer) { + throw new RestException(401); + } + $result = $this->myobject->fetch($id); + if( ! $result ) { + throw new RestException(404, 'MyObject not found'); + } + + if( ! DolibarrApi::_checkAccessToResource('myobject',$this->myobject->id)) { + throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); + } + + if( !$this->myobject->delete($id)) + { + throw new RestException(500); + } + + return array( + 'success' => array( + 'code' => 200, + 'message' => 'MyObject deleted' + ) + ); + + } + + /** + * Validate fields before create or update object + * + * @param array $data Data to validate + * @return array + * + * @throws RestException + */ + function _validate($data) + { + $myobject = array(); + foreach (MyObjectApi::$FIELDS as $field) { + if (!isset($data[$field])) + throw new RestException(400, "$field field missing"); + $myobject[$field] = $data[$field]; + } + return $myobject; + } +} diff --git a/htdocs/modulebuilder/template/core/modules/modMyModule.class.php b/htdocs/modulebuilder/template/core/modules/modMyModule.class.php index 152059cd79a..71948b0e1be 100644 --- a/htdocs/modulebuilder/template/core/modules/modMyModule.class.php +++ b/htdocs/modulebuilder/template/core/modules/modMyModule.class.php @@ -1,10 +1,11 @@ - * Copyright (C) +/* Copyright (C) 2003 Rodolphe Quiedeville + * Copyright (C) 2004-2015 Laurent Destailleur + * Copyright (C) 2005-2016 Regis Houssin * - * This program is free software: you can redistribute it and/or modify + * 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 3 of the License, or + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -13,309 +14,28 @@ * 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 . + * along with this program. If not, see . */ /** - * \defgroup mymodule MyModule module - * \brief MyModule module descriptor. + * \defgroup mymodule Module MyModule + * \brief MyModule module descriptor. * - * Put detailed description here. + * \file htdocs/mymodule/core/modules/modMyModule.class.php + * \ingroup mymodule + * \brief Description and activation file for module MyModule */ +include_once DOL_DOCUMENT_ROOT .'/core/modules/DolibarrModules.class.php'; -/** - * \file core/modules/modMyModule.class.php - * \ingroup mymodule - * \brief Example module description and activation file. - * - * Put detailed description here. - */ - -include_once DOL_DOCUMENT_ROOT . "/core/modules/DolibarrModules.class.php"; // The class name should start with a lower case mod for Dolibarr to pick it up // so we ignore the Squiz.Classes.ValidClassName.NotCamelCaps rule. // @codingStandardsIgnoreStart /** - * Description and activation class for module MyModule + * Description and activation class for module MyModule */ class modMyModule extends DolibarrModules { - /** @var DoliDB Database handler */ - public $db; - - /** - * @var int numero Module unique ID - * @see http://wiki.dolibarr.org/index.php/List_of_modules_id Available ranges - */ - public $numero = 500000; - - /** @var string Text key to reference module (for permissions, menus, etc.) */ - public $rights_class = 'mymodule'; - - /** - * @var string Module family. - * Used to group modules in module setup page. - * Can be one of 'crm', 'financial', 'hr', 'projects', 'products', 'ecm', 'technic', 'other' - */ - public $family = 'other'; - - /** @var int Module position in the family */ - public $module_position = 500; - - /** @var array Provide a custom family and options */ - public $familyinfo = array( -// 'myownfamily' => array( -// 'position' => '001', -// 'label' => 'MyOwnFamily' -// ) - ); - - /** @var string Module name */ - public $name = "My Module"; - - /** @var string Module short description */ - public $description = "Description of module MyModule"; - - /** @var string Module long description */ - public $descriptionlong = "A very long description. Can be a full HTML content"; - - /** - * @var string Module editor name - * @since 4.0 - */ - public $editor_name = "My Company"; - - /** - * @var string Module editor website - * @since 4.0 - */ - public $editor_url = "http://www.example.com"; - - /** - * @var string Module version string - * Special values to hide the module behind MAIN_FEATURES_LEVEL: development, experimental - * @see https://semver.org - */ - public $version = 'development'; - - /** @var string Key used in llx_const table to save module status enabled/disabled */ - public $const_name = 'MAIN_MODULE_MYMODULE'; - - /** - * @var string Module logo - * Should be named object_mymodule.png and store under mymodule/img - */ - public $picto = 'mymodule@mymodule'; - - /** @var array Define module parts */ - public $module_parts = array( - /** @var bool Module ships triggers in mymodule/core/triggers */ - 'triggers' => true, - /** - * @var bool Module ships login in mymodule/core/login - * @todo: example - */ - 'login' => false, - /** - * @var bool Module ships substitution functions - * @todo example - */ - 'substitutions' => false, - /** - * @var bool Module ships menu handlers - * @todo example - */ - 'menus' => false, - /** - * @var bool Module ships theme in mymodule/theme - * @todo example - */ - 'theme' => false, - /** - * @var bool Module shipped templates in mymodule/core/tpl overload core ones - * @todo example - */ - 'tpl' => false, - /** - * @var bool Module ships barcode functions - * @todo example - */ - 'barcode' => false, - /** - * @var bool Module ships models - * @todo example - */ - 'models' => false, - /** @var string[] List of module shipped custom CSS relative file paths */ - 'css' => array( - 'mymodule/css/mycss.css.php' - ), - /** @var string[] List of module shipped custom JavaScript relative file paths */ - 'js' => array( - 'mymodule/js/myjs.js.php' - ), - /** - * @var string[] List of hook contexts managed by the module - * @ todo example - */ - 'hooks' => array(), - /** - * @var array List of default directory names to force - * @todo example - */ - 'dir' => array(), - /** - * @var array List of workflow contexts managed by the module - */ - 'workflow' => array(), - ); - - /** @var string Data directories to create when module is enabled */ - public $dirs = array( - '/mymodule/temp' - ); - - /** @var array Configuration page declaration */ - public $config_page_url = 'setup.php@mymodule'; - - /** @var bool Control module visibility */ - public $hidden = false; - - /** @var string[] List of class names of modules to enable when this one is enabled */ - public $depends = array(); - - /** @var string[] List of class names of modules to disable when this one is disabled */ - public $requiredby = array(); - - /** @var string List of class names of modules this module conflicts with */ - public $conflictwith = array(); - - /** @var int[] Minimum PHP version required by this module */ - public $phpmin = array(5, 3); - - /** @var int[] Minimum Dolibarr version required by this module */ - public $need_dolibarr_version = array(3, 2); - - /** @var string[] List of language files */ - public $langfiles = array('mymodule@mymodule'); - - /** @var array Indexed list of constants options */ - public $const = array( - 0 => array( - /** @var string Constant name */ - 'MYMODULE_MYNEWCONST1', - /** - * @var string Constant type - * @todo Are there other types than 'chaine'? - */ - 'chaine', - /** @var string Constant initial value */ - 'myvalue', - /** @var string Constant description */ - 'This is a configuration constant', - /** @var bool Constant visibility */ - true, - /** - * @var string Multi-company entities - * 'current' or 'allentities' - */ - 'current', - /** @var bool Delete constant when module is disabled */ - true - ) - ); - - /** - * @var string List of pages to add as tab in a specific view - * @todo example - */ - public $tabs = array(); - - /** - * @var array Dictionaries declared by the module - *@todo example - */ - public $dictionaries = array(); - - /** @var array Indexed list of boxes options */ - public $boxes = array( - 0 => array( - 'file' => 'mybox@mymodule', - 'note' => '', - 'enabledbydefaulton' => 'Home' - ) - ); - - /** - * @var array Indexed list of cronjobs options - * @todo: example - */ - public $cronjobs = array(); - - /** - * @var array Indexed list of permissions options - * @todo example - */ - public $rights = array(); - - /** - * @var array Indexed list of menu options - * @todo example - */ - public $menu = array(); - - /** - * @var array Indexed list of export IDs - * @todo example - */ - public $export_code = array(); - - /** - * @var array Indexed list of export names - * @todo example - */ - public $export_label = array(); - - /** - * @var array Indexed list of export enabling conditions - * @todo example - */ - public $export_enabled = array(); - - /** - * @var array Indexed list of export required permissions - * @todo example - */ - public $export_permission = array(); - - /** - * @var array Indexed list of export fields - * @todo example - */ - public $export_fields_array = array(); - - /** - * @var array Indexed list of export entities - * @todo example - */ - public $export_entities_array = array(); - - /** - * @var array Indexed list of export SQL queries start - * @todo example - */ - public $export_sql_start = array(); - - /** - * @var array Indexed list of export SQL queries end - * @todo example - */ - public $export_sql_end = array(); - - /** @var bool Module only enabled / disabled in main company when multi-company is in use */ - public $core_enabled = false; - // @codingStandardsIgnoreEnd /** * Constructor. Define names, constants, directories, boxes, permissions @@ -324,61 +44,90 @@ class modMyModule extends DolibarrModules */ public function __construct($db) { - global $langs, $conf; + global $langs,$conf; - // DolibarrModules is abstract in Dolibarr < 3.8 - if (is_callable('parent::__construct')) { - parent::__construct($db); - } else { - global $db; - $this->db = $db; - } + $this->db = $db; - // Declare custom family with translated label - //$this->familyinfo = array( - // 'myownfamily' => array( - // 'position' => '001', - // 'label' => $langs->trans("MyOwnFamily") - // ) - //); + // Id for module (must be unique). + // Use here a free id (See in Home -> System information -> Dolibarr for list of used modules id). + $this->numero = 500000; // TODO Go on page http://wiki.dolibarr.org/index.php/List_of_modules_id to reserve id number for your module + // Key text used to identify module (for permissions, menus, etc...) + $this->rights_class = 'mymodule'; - // Lazy automatic module naming from class names - //$this->name = preg_replace('/^mod/i', '', get_class($this)); + // Family can be 'crm','financial','hr','projects','products','ecm','technic','interface','other' + // It is used to group modules by family in module setup page + $this->family = "other"; + // Module position in the family + $this->module_position = 500; + // Gives the possibility to the module, to provide his own family info and position of this family (Overwrite $this->family and $this->module_position. Avoid this) + //$this->familyinfo = array('myownfamily' => array('position' => '001', 'label' => $langs->trans("MyOwnFamily"))); - // Lazy automatic constant naming from module name - //$this->const_name = 'MAIN_MODULE_' . strtoupper($this->name); + // Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module) + $this->name = preg_replace('/^mod/i','',get_class($this)); + // Module description, used if translation string 'ModuleXXXDesc' not found (where XXX is value of numeric property 'numero' of module) + $this->description = "MyModuleDescription"; + $this->descriptionlong = "MyModuleDescription (Long)"; + $this->editor_name = 'Editor name'; + $this->editor_url = 'https://www.example.com'; + + // Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated' or a version string like 'x.y.z' + $this->version = '1.0'; + // Key used in llx_const table to save module status enabled/disabled (where MYMODULE is value of property name of module in uppercase) + $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); + // Name of image file used for this module. + // If file is in theme/yourtheme/img directory under name object_pictovalue.png, use this->picto='pictovalue' + // If file is in module/img directory under name object_pictovalue.png, use this->picto='pictovalue@module' + $this->picto='generic'; - // Examples for complex types + // Defined all module parts (triggers, login, substitutions, menus, css, etc...) + // for default path (eg: /mymodule/core/xxxxx) (0=disable, 1=enable) + // for specific path of parts (eg: /mymodule/core/modules/barcode) + // for specific css file (eg: /mymodule/css/mymodule.css.php) //$this->module_parts = array( - // Set here all hooks context managed by module - // 'hooks' => array('hookcontext1','hookcontext2'), - // To force the default directories names - // 'dir' => array('output' => 'othermodulename'), - // Set here all workflow context managed by module - // Don't forget to depend on modWorkflow! - // The description translation key will be descWORKFLOW_MODULE1_YOURACTIONTYPE_MODULE2 - // You will be able to check if it is enabled with the $conf->global->WORKFLOW_MODULE1_YOURACTIONTYPE_MODULE2 constant - // Implementation is up to you and is usually done in a trigger. - // 'workflow' => array( - // 'WORKFLOW_MODULE1_YOURACTIONTYPE_MODULE2' => array( - // 'enabled' => '! empty($conf->module1->enabled) && ! empty($conf->module2->enabled)', - // 'picto' => 'yourpicto@mymodule', - // 'warning' => 'WarningTextTranslationKey', - // ), - // ), - //); + // 'triggers' => 0, // Set this to 1 if module has its own trigger directory (core/triggers) + // 'login' => 0, // Set this to 1 if module has its own login method directory (core/login) + // 'substitutions' => 0, // Set this to 1 if module has its own substitution function file (core/substitutions) + // 'menus' => 0, // Set this to 1 if module has its own menus handler directory (core/menus) + // 'theme' => 0, // Set this to 1 if module has its own theme directory (theme) + // 'tpl' => 0, // Set this to 1 if module overwrite template dir (core/tpl) + // 'barcode' => 0, // Set this to 1 if module has its own barcode directory (core/modules/barcode) + // 'models' => 0, // Set this to 1 if module has its own models directory (core/modules/xxx) + // 'css' => array('/mymodule/css/mymodule.css.php'), // Set this to relative path of css file if module has its own css file + // 'js' => array('/mymodule/js/mymodule.js'), // Set this to relative path of js file if module must load a js on all pages + // 'hooks' => array('hookcontext1','hookcontext2',...) // Set here all hooks context managed by module. You can also set hook context 'all' + // 'dir' => array('output' => 'othermodulename'), // To force the default directories names + // 'workflow' => array('WORKFLOW_MODULE1_YOURACTIONTYPE_MODULE2'=>array('enabled'=>'! empty($conf->module1->enabled) && ! empty($conf->module2->enabled)', 'picto'=>'yourpicto@mymodule')) // Set here all workflow context managed by module + // ); + $this->module_parts = array(); + // Data directories to create when module is enabled. + // Example: this->dirs = array("/mymodule/temp"); + $this->dirs = array(); + + // Config pages. Put here list of php page, stored into mymodule/admin directory, to use to setup module. + $this->config_page_url = array("setup.php@mymodule"); + + // Dependencies + $this->hidden = false; // A condition to hide module + $this->depends = array(); // List of module class names as string that must be enabled if this module is enabled + $this->requiredby = array(); // List of module ids to disable if this one is disabled + $this->conflictwith = array(); // List of module class names as string this module is in conflict with + $this->phpmin = array(5,0); // Minimum version of PHP required by module + $this->need_dolibarr_version = array(3,0); // Minimum version of Dolibarr required by module + $this->langfiles = array("mymodule@mymodule"); + + // Constants + // List of particular constants to add when module is enabled (key, 'chaine', value, desc, visible, 'current' or 'allentities', deleteonunactive) + // Example: $this->const=array(0=>array('MYMODULE_MYNEWCONST1','chaine','myvalue','This is a constant to add',1), + // 1=>array('MYMODULE_MYNEWCONST2','chaine','myvalue','This is another constant to add',0, 'current', 1) + // ); + $this->const = array(); // Array to add new pages in new tabs - // Example: - //$this->tabs = array( - // // To add a new tab identified by code tabname1 - // 'objecttype:+tabname1:Title1:langfile@mymodule:$user->rights->mymodule->read:/mymodule/mynewtab1.php?id=__ID__', - // // To add another new tab identified by code tabname2 - // 'objecttype:+tabname2:Title2:langfile@mymodule:$user->rights->othermodule->read:/mymodule/mynewtab2.php?id=__ID__', - // // To remove an existing tab identified by code tabname - // 'objecttype:-tabname' - //); + // Example: $this->tabs = array('objecttype:+tabname1:Title1:mylangfile@mymodule:$user->rights->mymodule->read:/mymodule/mynewtab1.php?id=__ID__', // To add a new tab identified by code tabname1 + // 'objecttype:+tabname2:SUBSTITUTION_Title2:mylangfile@mymodule:$user->rights->othermodule->read:/mymodule/mynewtab2.php?id=__ID__', // To add another new tab identified by code tabname2. Label will be result of calling all substitution functions on 'Title2' key. + // 'objecttype:-tabname:NU:conditiontoremove'); // To remove an existing tab identified by code tabname + // where objecttype can be // 'categories_x' to add a tab in category view (replace 'x' by type of category (0=product, 1=supplier, 2=customer, 3=member) // 'contact' to add a tab in contact view // 'contract' to add a tab in contract view @@ -398,317 +147,142 @@ class modMyModule extends DolibarrModules // 'stock' to add a tab in stock view // 'thirdparty' to add a tab in third party view // 'user' to add a tab in user view + $this->tabs = array(); - // Dictionaries - if (! isset($conf->mymodule->enabled)) { - $conf->mymodule=new stdClass(); - $conf->mymodule->enabled = 0; - } - //$this->dictionaries = array(); - /* Example: - $this->dictionaries=array( - 'langs'=>'mymodule@mymodule', - // List of tables we want to see into dictonary editor - 'tabname'=>array( - MAIN_DB_PREFIX."table1", - MAIN_DB_PREFIX."table2", - MAIN_DB_PREFIX."table3" - ), - // Label of tables - 'tablib'=>array("Table1","Table2","Table3"), - // Query to select fields - 'tabsql'=>array( - 'SELECT f.rowid as rowid, f.code, f.label, f.active' - . ' FROM ' . MAIN_DB_PREFIX . 'table1 as f', - 'SELECT f.rowid as rowid, f.code, f.label, f.active' - . ' FROM ' . MAIN_DB_PREFIX . 'table2 as f', - 'SELECT f.rowid as rowid, f.code, f.label, f.active' - . ' FROM ' . MAIN_DB_PREFIX . 'table3 as f' - ), - // Sort order - 'tabsqlsort'=>array("label ASC","label ASC","label ASC"), - // List of fields (result of select to show dictionary) - 'tabfield'=>array("code,label","code,label","code,label"), - // List of fields (list of fields to edit a record) - 'tabfieldvalue'=>array("code,label","code,label","code,label"), - // List of fields (list of fields for insert) - 'tabfieldinsert'=>array("code,label","code,label","code,label"), - // Name of columns with primary key (try to always name it 'rowid') - 'tabrowid'=>array("rowid","rowid","rowid"), - // Condition to show each dictionary - 'tabcond'=>array( - $conf->mymodule->enabled, - $conf->mymodule->enabled, - $conf->mymodule->enabled - ) - ); - */ + if (! isset($conf->mymodule) || ! isset($conf->mymodule->enabled)) + { + $conf->mymodule=new stdClass(); + $conf->mymodule->enabled=0; + } + + // Dictionaries + $this->dictionaries=array(); + /* Example: + $this->dictionaries=array( + 'langs'=>'mylangfile@mymodule', + 'tabname'=>array(MAIN_DB_PREFIX."table1",MAIN_DB_PREFIX."table2",MAIN_DB_PREFIX."table3"), // List of tables we want to see into dictonnary editor + 'tablib'=>array("Table1","Table2","Table3"), // Label of tables + 'tabsql'=>array('SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table1 as f','SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table2 as f','SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.MAIN_DB_PREFIX.'table3 as f'), // Request to select fields + 'tabsqlsort'=>array("label ASC","label ASC","label ASC"), // Sort order + 'tabfield'=>array("code,label","code,label","code,label"), // List of fields (result of select to show dictionary) + 'tabfieldvalue'=>array("code,label","code,label","code,label"), // List of fields (list of fields to edit a record) + 'tabfieldinsert'=>array("code,label","code,label","code,label"), // List of fields (list of fields for insert) + 'tabrowid'=>array("rowid","rowid","rowid"), // Name of columns with primary key (try to always name it 'rowid') + 'tabcond'=>array($conf->mymodule->enabled,$conf->mymodule->enabled,$conf->mymodule->enabled) // Condition to show each dictionary + ); + */ + + // Boxes + // Add here list of php file(s) stored in core/boxes that contains class to show a box. + $this->boxes = array(); // List of boxes + // Example: + //$this->boxes=array( + // 0=>array('file'=>'myboxa.php@mymodule','note'=>'','enabledbydefaulton'=>'Home'), + // 1=>array('file'=>'myboxb.php@mymodule','note'=>''), + // 2=>array('file'=>'myboxc.php@mymodule','note'=>'') + //); // Cronjobs - // List of cron jobs entries to add - //$this->cronjobs = array(); - // Example: - // $this->cronjobs = array( - // 0 => array( - // 'label' => 'My label', - // 'jobtype' => 'method', - // 'class' => '/dir/class/file.class.php', - // 'objectname' => 'MyClass', - // 'method' => 'myMethod', - // 'parameters' => '', - // 'comment' => 'Comment', - // 'frequency' => 2, - // 'unitfrequency' => 3600, - // 'test' => true - // ), - // 1 => array( - // 'label' => 'My label', - // 'jobtype' => 'command', - // 'command' => '', - // 'parameters' => '', - // 'comment' => 'Comment', - // 'frequency' => 1, - // 'unitfrequency' => 3600 * 24, - // 'test' => true - // ) - // ); + $this->cronjobs = array(); // List of cron jobs entries to add + // Example: $this->cronjobs=array(0=>array('label'=>'My label', 'jobtype'=>'method', 'class'=>'/dir/class/file.class.php', 'objectname'=>'MyClass', 'method'=>'myMethod', 'parameters'=>'', 'comment'=>'Comment', 'frequency'=>2, 'unitfrequency'=>3600, 'test'=>true), + // 1=>array('label'=>'My label', 'jobtype'=>'command', 'command'=>'', 'parameters'=>'', 'comment'=>'Comment', 'frequency'=>1, 'unitfrequency'=>3600*24, 'test'=>true) + // ); // Permissions - //$r = 0; - // Add here list of permission defined by - // an id, a label, a boolean and two constant strings. - // Example: - //// Permission id (must not be already used) - //$this->rights[$r][0] = 2000; - //// Permission label - //$this->rights[$r][1] = 'Permision label'; - //// Permission by default for new user (0/1) - //$this->rights[$r][3] = 1; - //// In php code, permission will be checked by test - //// if ($user->rights->permkey->level1->level2) - //$this->rights[$r][4] = 'level1'; - //// In php code, permission will be checked by test - //// if ($user->rights->permkey->level1->level2) - //$this->rights[$r][5] = 'level2'; - //$r++; - // Main menu entries + $this->rights = array(); // Permission array used by this module + $r=0; - // Menu entries + // Add here list of permission defined by an id, a label, a boolean and two constant strings. + // Example: + // $this->rights[$r][0] = $this->numero + $r; // Permission id (must not be already used) + // $this->rights[$r][1] = 'Permision label'; // Permission label + // $this->rights[$r][3] = 1; // Permission by default for new user (0/1) + // $this->rights[$r][4] = 'level1'; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2) + // $this->rights[$r][5] = 'level2'; // In php code, permission will be checked by test if ($user->rights->permkey->level1->level2) + // $r++; + + // Main menu entries + $this->menu = array(); // List of menus to add + $r=0; + + // Add here entries to declare new menus + // // Example to declare a new Top Menu entry and its Left menu entry: - //$this->menu[]=array( - // // Put 0 if this is a top menu - // 'fk_menu'=>0, - // // This is a Top menu entry - // 'type'=>'top', - // Menu's title. FIXME: use a translation key - // 'titre'=>'MyModule top menu', - // This menu's mainmenu ID - // 'mainmenu'=>'mymodule', - // This menu's leftmenu ID - // 'leftmenu'=>'mymodule', - // 'url'=>'/mymodule/pagetop.php', - // // Lang file to use (without .lang) by module. - // // File must be in langs/code_CODE/ directory. - // 'langs'=>'mylangfile', - // 'position'=>100, - // // Define condition to show or hide menu entry. - // // Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - // 'enabled'=>'$conf->mymodule->enabled', - // // Use 'perms'=>'$user->rights->mymodule->level1->level2' - // // if you want your menu with a permission rules - // 'perms'=>'1', - // 'target'=>'', - // // 0=Menu for internal users, 1=external users, 2=both - // 'user'=>2 - //); - //$this->menu[]=array( - // // Use r=value where r is index key used for the parent menu entry - // // (higher parent must be a top menu entry) - // 'fk_menu'=>'r=0', - // // This is a Left menu entry - // 'type'=>'left', - // Menu's title. FIXME: use a translation key - // 'titre'=>'MyModule left menu', - // This menu's mainmenu ID - // 'mainmenu'=>'mymodule', - // This menu's leftmenu ID - // 'leftmenu'=>'mymodule', - // 'url'=>'/mymodule/pagelevel1.php', - // // Lang file to use (without .lang) by module. - // // File must be in langs/code_CODE/ directory. - // 'langs'=>'mylangfile', - // 'position'=>100, - // // Define condition to show or hide menu entry. - // // Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - // 'enabled'=>'$conf->mymodule->enabled', - // // Use 'perms'=>'$user->rights->mymodule->level1->level2' - // // if you want your menu with a permission rules - // 'perms'=>'1', - // 'target'=>'', - // // 0=Menu for internal users, 1=external users, 2=both - // 'user'=>2 - //); + // $this->menu[$r]=array( 'fk_menu'=>'', // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode + // 'type'=>'top', // This is a Top menu entry + // 'titre'=>'MyModule top menu', + // 'mainmenu'=>'mymodule', + // 'leftmenu'=>'mymodule', + // 'url'=>'/mymodule/pagetop.php', + // 'langs'=>'mylangfile@mymodule', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. + // 'position'=>100, + // 'enabled'=>'$conf->mymodule->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. + // 'perms'=>'1', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules + // 'target'=>'', + // 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both + // $r++; // // Example to declare a Left Menu entry into an existing Top menu entry: - //$this->menu[]=array( - // // Use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' - // 'fk_menu'=>'fk_mainmenu=mainmenucode', - // // This is a Left menu entry - // 'type'=>'left', - // Menu's title. FIXME: use a translation key - // 'titre'=>'MyModule left menu', - // This menu's mainmenu ID - // 'mainmenu'=>'mainmenucode', - // This menu's leftmenu ID - // 'leftmenu'=>'mymodule', - // 'url'=>'/mymodule/pagelevel2.php', - // // Lang file to use (without .lang) by module. - // // File must be in langs/code_CODE/ directory. - // 'langs'=>'mylangfile', - // 'position'=>100, - // // Define condition to show or hide menu entry. - // // Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - // // Use '$leftmenu==\'system\'' to show if leftmenu system is selected. - // 'enabled'=>'$conf->mymodule->enabled', - // // Use 'perms'=>'$user->rights->mymodule->level1->level2' - // // if you want your menu with a permission rules - // 'perms'=>'1', - // 'target'=>'', - // // 0=Menu for internal users, 1=external users, 2=both - // 'user'=>2 - //); + // $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=xxx', // '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode + // 'type'=>'left', // This is a Left menu entry + // 'titre'=>'MyModule left menu', + // 'mainmenu'=>'xxx', + // 'leftmenu'=>'mymodule', + // 'url'=>'/mymodule/pagelevel2.php', + // 'langs'=>'mylangfile@mymodule', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. + // 'position'=>100, + // 'enabled'=>'$conf->mymodule->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected. + // 'perms'=>'1', // Use 'perms'=>'$user->rights->mymodule->level1->level2' if you want your menu with a permission rules + // 'target'=>'', + // 'user'=>2); // 0=Menu for internal users, 1=external users, 2=both + // $r++; + // Exports - //$r = 0; + $r=1; + // Example: - //$this->export_code[$r]=$this->rights_class.'_'.$r; - //// Translation key (used only if key ExportDataset_xxx_z not found) - //$this->export_label[$r]='CustomersInvoicesAndInvoiceLines'; - //// Condition to show export in list (ie: '$user->id==3'). - //// Set to 1 to always show when module is enabled. - //$this->export_enabled[$r]='1'; - //$this->export_permission[$r]=array(array("facture","facture","export")); - //$this->export_fields_array[$r]=array( - // 's.rowid'=>"IdCompany", - // 's.nom'=>'CompanyName', - // 's.address'=>'Address', - // 's.cp'=>'Zip', - // 's.ville'=>'Town', - // 's.fk_pays'=>'Country', - // 's.tel'=>'Phone', - // 's.siren'=>'ProfId1', - // 's.siret'=>'ProfId2', - // 's.ape'=>'ProfId3', - // 's.idprof4'=>'ProfId4', - // 's.code_compta'=>'CustomerAccountancyCode', - // 's.code_compta_fournisseur'=>'SupplierAccountancyCode', - // 'f.rowid'=>"InvoiceId", - // 'f.facnumber'=>"InvoiceRef", - // 'f.datec'=>"InvoiceDateCreation", - // 'f.datef'=>"DateInvoice", - // 'f.total'=>"TotalHT", - // 'f.total_ttc'=>"TotalTTC", - // 'f.tva'=>"TotalVAT", - // 'f.paye'=>"InvoicePaid", - // 'f.fk_statut'=>'InvoiceStatus', - // 'f.note'=>"InvoiceNote", - // 'fd.rowid'=>'LineId', - // 'fd.description'=>"LineDescription", - // 'fd.price'=>"LineUnitPrice", - // 'fd.tva_tx'=>"LineVATRate", - // 'fd.qty'=>"LineQty", - // 'fd.total_ht'=>"LineTotalHT", - // 'fd.total_tva'=>"LineTotalTVA", - // 'fd.total_ttc'=>"LineTotalTTC", - // 'fd.date_start'=>"DateStart", - // 'fd.date_end'=>"DateEnd", - // 'fd.fk_product'=>'ProductId', - // 'p.ref'=>'ProductRef' - //); - //$this->export_entities_array[$r]=array('s.rowid'=>"company", - // 's.nom'=>'company', - // 's.address'=>'company', - // 's.cp'=>'company', - // 's.ville'=>'company', - // 's.fk_pays'=>'company', - // 's.tel'=>'company', - // 's.siren'=>'company', - // 's.siret'=>'company', - // 's.ape'=>'company', - // 's.idprof4'=>'company', - // 's.code_compta'=>'company', - // 's.code_compta_fournisseur'=>'company', - // 'f.rowid'=>"invoice", - // 'f.facnumber'=>"invoice", - // 'f.datec'=>"invoice", - // 'f.datef'=>"invoice", - // 'f.total'=>"invoice", - // 'f.total_ttc'=>"invoice", - // 'f.tva'=>"invoice", - // 'f.paye'=>"invoice", - // 'f.fk_statut'=>'invoice', - // 'f.note'=>"invoice", - // 'fd.rowid'=>'invoice_line', - // 'fd.description'=>"invoice_line", - // 'fd.price'=>"invoice_line", - // 'fd.total_ht'=>"invoice_line", - // 'fd.total_tva'=>"invoice_line", - // 'fd.total_ttc'=>"invoice_line", - // 'fd.tva_tx'=>"invoice_line", - // 'fd.qty'=>"invoice_line", - // 'fd.date_start'=>"invoice_line", - // 'fd.date_end'=>"invoice_line", - // 'fd.fk_product'=>'product', - // 'p.ref'=>'product' - //); - //$this->export_sql_start[$r] = 'SELECT DISTINCT '; - //$this->export_sql_end[$r] = ' FROM (' . MAIN_DB_PREFIX . 'facture as f, ' - // . MAIN_DB_PREFIX . 'facturedet as fd, ' . MAIN_DB_PREFIX . 'societe as s)'; - //$this->export_sql_end[$r] .= ' LEFT JOIN ' . MAIN_DB_PREFIX - // . 'product as p on (fd.fk_product = p.rowid)'; - //$this->export_sql_end[$r] .= ' WHERE f.fk_soc = s.rowid ' - // . 'AND f.rowid = fd.fk_facture'; - //$r++; + // $this->export_code[$r]=$this->rights_class.'_'.$r; + // $this->export_label[$r]='MyModule'; // Translation key (used only if key ExportDataset_xxx_z not found) + // $this->export_enabled[$r]='1'; // Condition to show export in list (ie: '$user->id==3'). Set to 1 to always show when module is enabled. + // $this->export_icon[$r]='generic:MyModule'; // Put here code of icon then string for translation key of module name + // $this->export_permission[$r]=array(array("mymodule","level1","level2")); + // $this->export_fields_array[$r]=array('s.rowid'=>"IdCompany",'s.nom'=>'CompanyName','s.address'=>'Address','s.zip'=>'Zip','s.town'=>'Town','s.fk_pays'=>'Country','s.phone'=>'Phone','s.siren'=>'ProfId1','s.siret'=>'ProfId2','s.ape'=>'ProfId3','s.idprof4'=>'ProfId4','s.code_compta'=>'CustomerAccountancyCode','s.code_compta_fournisseur'=>'SupplierAccountancyCode','f.rowid'=>"InvoiceId",'f.facnumber'=>"InvoiceRef",'f.datec'=>"InvoiceDateCreation",'f.datef'=>"DateInvoice",'f.total'=>"TotalHT",'f.total_ttc'=>"TotalTTC",'f.tva'=>"TotalVAT",'f.paye'=>"InvoicePaid",'f.fk_statut'=>'InvoiceStatus','f.note'=>"InvoiceNote",'fd.rowid'=>'LineId','fd.description'=>"LineDescription",'fd.price'=>"LineUnitPrice",'fd.tva_tx'=>"LineVATRate",'fd.qty'=>"LineQty",'fd.total_ht'=>"LineTotalHT",'fd.total_tva'=>"LineTotalTVA",'fd.total_ttc'=>"LineTotalTTC",'fd.date_start'=>"DateStart",'fd.date_end'=>"DateEnd",'fd.fk_product'=>'ProductId','p.ref'=>'ProductRef'); + // $this->export_TypeFields_array[$r]=array('t.date'=>'Date', 't.qte'=>'Numeric', 't.poids'=>'Numeric', 't.fad'=>'Numeric', 't.paq'=>'Numeric', 't.stockage'=>'Numeric', 't.fadparliv'=>'Numeric', 't.livau100'=>'Numeric', 't.forfait'=>'Numeric', 's.nom'=>'Text','s.address'=>'Text','s.zip'=>'Text','s.town'=>'Text','c.code'=>'Text','s.phone'=>'Text','s.siren'=>'Text','s.siret'=>'Text','s.ape'=>'Text','s.idprof4'=>'Text','s.code_compta'=>'Text','s.code_compta_fournisseur'=>'Text','s.tva_intra'=>'Text','f.facnumber'=>"Text",'f.datec'=>"Date",'f.datef'=>"Date",'f.date_lim_reglement'=>"Date",'f.total'=>"Numeric",'f.total_ttc'=>"Numeric",'f.tva'=>"Numeric",'f.paye'=>"Boolean",'f.fk_statut'=>'Status','f.note_private'=>"Text",'f.note_public'=>"Text",'fd.description'=>"Text",'fd.subprice'=>"Numeric",'fd.tva_tx'=>"Numeric",'fd.qty'=>"Numeric",'fd.total_ht'=>"Numeric",'fd.total_tva'=>"Numeric",'fd.total_ttc'=>"Numeric",'fd.date_start'=>"Date",'fd.date_end'=>"Date",'fd.special_code'=>'Numeric','fd.product_type'=>"Numeric",'fd.fk_product'=>'List:product:label','p.ref'=>'Text','p.label'=>'Text','p.accountancy_code_sell'=>'Text'); + // $this->export_entities_array[$r]=array('s.rowid'=>"company",'s.nom'=>'company','s.address'=>'company','s.zip'=>'company','s.town'=>'company','s.fk_pays'=>'company','s.phone'=>'company','s.siren'=>'company','s.siret'=>'company','s.ape'=>'company','s.idprof4'=>'company','s.code_compta'=>'company','s.code_compta_fournisseur'=>'company','f.rowid'=>"invoice",'f.facnumber'=>"invoice",'f.datec'=>"invoice",'f.datef'=>"invoice",'f.total'=>"invoice",'f.total_ttc'=>"invoice",'f.tva'=>"invoice",'f.paye'=>"invoice",'f.fk_statut'=>'invoice','f.note'=>"invoice",'fd.rowid'=>'invoice_line','fd.description'=>"invoice_line",'fd.price'=>"invoice_line",'fd.total_ht'=>"invoice_line",'fd.total_tva'=>"invoice_line",'fd.total_ttc'=>"invoice_line",'fd.tva_tx'=>"invoice_line",'fd.qty'=>"invoice_line",'fd.date_start'=>"invoice_line",'fd.date_end'=>"invoice_line",'fd.fk_product'=>'product','p.ref'=>'product'); + // $this->export_dependencies_array[$r]=array('invoice_line'=>'fd.rowid','product'=>'fd.rowid'); // To add unique key if we ask a field of a child to avoid the DISTINCT to discard them + // $this->export_sql_start[$r]='SELECT DISTINCT '; + // $this->export_sql_end[$r] =' FROM ('.MAIN_DB_PREFIX.'facture as f, '.MAIN_DB_PREFIX.'facturedet as fd, '.MAIN_DB_PREFIX.'societe as s)'; + // $this->export_sql_end[$r] .=' LEFT JOIN '.MAIN_DB_PREFIX.'product as p on (fd.fk_product = p.rowid)'; + // $this->export_sql_end[$r] .=' WHERE f.fk_soc = s.rowid AND f.rowid = fd.fk_facture'; + // $this->export_sql_order[$r] .=' ORDER BY s.nom'; + // $r++; } /** - * Function called when module is enabled. - * The init function add constants, boxes, permissions and menus - * (defined in constructor) into Dolibarr database. - * It also creates data directories + * Function called when module is enabled. + * The init function add constants, boxes, permissions and menus (defined in constructor) into Dolibarr database. + * It also creates data directories * - * @param string $options Options when enabling module ('', 'noboxes') - * @return int 1 if OK, 0 if KO + * @param string $options Options when enabling module ('', 'noboxes') + * @return int 1 if OK, 0 if KO */ - public function init($options = '') + public function init($options='') { $sql = array(); - $result = $this->loadTables(); + $this->_load_tables('/mymodule/sql/'); return $this->_init($sql, $options); } - /** - * Create tables, keys and data required by module - * Files llx_table1.sql, llx_table1.key.sql llx_data.sql with create table, create keys - * and create data commands must be stored in directory /mymodule/sql/ - * This function is called by this->init - * - * @return int <=0 if KO, >0 if OK - */ - private function loadTables() - { - return $this->_load_tables('/mymodule/sql/'); - } - /** * Function called when module is disabled. * Remove from database constants, boxes and permissions from Dolibarr database. * Data directories are not deleted * - * @param string $options Options when enabling module ('', 'noboxes') - * @return int 1 if OK, 0 if KO + * @param string $options Options when enabling module ('', 'noboxes') + * @return int 1 if OK, 0 if KO */ public function remove($options = '') { @@ -716,4 +290,5 @@ class modMyModule extends DolibarrModules return $this->_remove($sql, $options); } + } diff --git a/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyTrigger.class.php b/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_Triggers.class.php similarity index 91% rename from htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyTrigger.class.php rename to htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_Triggers.class.php index 761a717d944..56f00ab8b02 100644 --- a/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyTrigger.class.php +++ b/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_Triggers.class.php @@ -17,7 +17,7 @@ */ /** - * \file core/triggers/interface_99_modMyModule_MyTrigger.class.php + * \file core/triggers/interface_99_modMyModule_Triggers.class.php * \ingroup mymodule * \brief Example trigger. * @@ -30,17 +30,16 @@ * - The file must stay in core/triggers * - The class name must be InterfaceMytrigger * - The constructor method must be named InterfaceMytrigger - * - The name property name must be Mytrigger + * - The name property name must be MyTrigger */ -/** Includes */ -require_once DOL_DOCUMENT_ROOT . '/core/lib/admin.lib.php'; -require_once DOL_DOCUMENT_ROOT . dol_buildpath('/mymodule/class/MyTrigger.php', 1); +require_once DOL_DOCUMENT_ROOT.'/core/triggers/dolibarrtriggers.class.php'; + /** - * Class InterfaceMytrigger + * Class of triggers for MyModule module */ -class InterfaceMytrigger extends MyTrigger +class InterfaceMyModuleTrigger extends DolibarrTriggers { /** * @var DoliDB Database handler @@ -58,9 +57,7 @@ class InterfaceMytrigger extends MyTrigger $this->name = preg_replace('/^Interface/i', '', get_class($this)); $this->family = "demo"; - $this->description = "Triggers of this module are empty functions." - . "They have no effect." - . "They are provided for tutorial purpose only."; + $this->description = "MyModule triggers."; // 'development', 'experimental', 'dolibarr' or version $this->version = 'development'; $this->picto = 'mymodule@mymodule'; @@ -86,58 +83,18 @@ class InterfaceMytrigger extends MyTrigger return $this->description; } - /** - * Trigger version - * - * @return string Version of trigger file - */ - public function getVersion() - { - global $langs; - $langs->load("admin"); - - if ($this->version == 'development') { - return $langs->trans("Development"); - } elseif ($this->version == 'experimental') { - return $langs->trans("Experimental"); - } elseif ($this->version == 'dolibarr') { - return DOL_VERSION; - } elseif ($this->version) { - return $this->version; - } else { - return $langs->trans("Unknown"); - } - } - - // @codingStandardsIgnoreStart - /** - * Compatibility trigger function for Dolibarr < 3.7 - * - * @param int $action Trigger action - * @param CommonObject $object Object trigged from - * @param User $user User that trigged - * @param Translate $langs Translations handler - * @param Conf $conf Configuration - * @return int <0 if KO, 0 if no triggered ran, >0 if OK - * @deprecated Replaced by DolibarrTriggers::runTrigger() - */ - public function run_trigger($action, $object, $user, $langs, $conf) - { - return $this->runTrigger($action, $object, $user, $langs, $conf); - } - // @codingStandardsIgnoreEnd /** * Function called when a Dolibarrr business event is done. * All functions "runTrigger" are triggered if file * is inside directory core/triggers * - * @param string $action Event action code - * @param CommonObject $object Object - * @param User $user Object user - * @param Translate $langs Object langs - * @param Conf $conf Object conf - * @return int <0 if KO, 0 if no triggered ran, >0 if OK + * @param string $action Event action code + * @param CommonObject $object Object + * @param User $user Object user + * @param Translate $langs Object langs + * @param Conf $conf Object conf + * @return int <0 if KO, 0 if no triggered ran, >0 if OK */ public function runTrigger($action, $object, User $user, Translate $langs, Conf $conf) { diff --git a/htdocs/modulebuilder/template/img/object_mymodule.png b/htdocs/modulebuilder/template/img/myobject_mymodule.png similarity index 100% rename from htdocs/modulebuilder/template/img/object_mymodule.png rename to htdocs/modulebuilder/template/img/myobject_mymodule.png diff --git a/htdocs/modulebuilder/template/js/mymodule.js.php b/htdocs/modulebuilder/template/js/mymodule.js.php index ae8ce6cbe0d..a08ae02c2fc 100644 --- a/htdocs/modulebuilder/template/js/mymodule.js.php +++ b/htdocs/modulebuilder/template/js/mymodule.js.php @@ -17,7 +17,7 @@ */ /** - * \file js/mymodule.js.php + * \file htdocs/modulebuilder/template/js/mymodule.js.php * \ingroup mymodule * \brief Example JavaScript. * diff --git a/htdocs/modulebuilder/template/myobject_card.php b/htdocs/modulebuilder/template/myobject_card.php index a257149c72a..6db376ff9b1 100644 --- a/htdocs/modulebuilder/template/myobject_card.php +++ b/htdocs/modulebuilder/template/myobject_card.php @@ -1,10 +1,10 @@ - * Copyright (C) +/* Copyright (C) 2007-2015 Laurent Destailleur + * Copyright (C) ---Put here your own copyright and developer email--- * - * This program is free software: you can redistribute it and/or modify + * 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 3 of the License, or + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -13,21 +13,20 @@ * 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 . + * along with this program. If not, see . */ /** - * \file myobject_list.php - * \ingroup mymodule - * \brief Page with list of myobject. - * - * List of myobject + * \file htdocs/modulebuilder/template/myobject_card.php + * \ingroup mymodule othermodule1 othermodule2 + * \brief This file is an example of a php page + * Put here some comments */ -//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); -//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); -//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); -//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); +//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); +//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); +//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); +//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); //if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK','1'); // Do not check anti CSRF attack test //if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK','1'); // Do not check style html tag into posted data //if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL','1'); // Do not check anti POST attack test @@ -36,28 +35,31 @@ //if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); //if (! defined("NOLOGIN")) define("NOLOGIN",'1'); // If this page is public (can be called outside logged session) -// Change the following lines to use the correct relative path (../, ../../, etc) +// Change this following line to use the correct relative path (../, ../../, etc) +$res=0; +if (! $res && file_exists("../main.inc.php")) $res=@include '../main.inc.php'; // to work if your module directory is into dolibarr root htdocs directory +if (! $res && file_exists("../../main.inc.php")) $res=@include '../../main.inc.php'; // to work if your module directory is into a subdir of root htdocs directory +if (! $res && file_exists("../../../dolibarr/htdocs/main.inc.php")) $res=@include '../../../dolibarr/htdocs/main.inc.php'; // Used on dev env only +if (! $res && file_exists("../../../../dolibarr/htdocs/main.inc.php")) $res=@include '../../../../dolibarr/htdocs/main.inc.php'; // Used on dev env only +if (! $res) die("Include of main fails"); +// Change this following line to use the correct relative path from htdocs +include_once(DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'); +dol_include_once('/mymodule/class/myobject_class.class.php'); -// Load Dolibarr environment -if (false === (@include '../../main.inc.php')) { // From htdocs directory - require '../../../main.inc.php'; // From "custom" directory -} - -require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; -dol_include_once('/mymodule/class/myclass.class.php'); - -// Load translation files required by the page -$langs->load("mymodule@mymodule"); +// Load traductions files requiredby by page +$langs->load("mymodule"); +$langs->load("other"); // Get parameters -$action = GETPOST('action','alpha'); -$confirm = GETPOST('confirm','alpha'); - $id = GETPOST('id','int'); +$action = GETPOST('action','alpha'); +$cancel = GETPOST('cancel'); $backtopage = GETPOST('backtopage'); -// TODO Add here list of search params $myparam = GETPOST('myparam','alpha'); +$search_field1=GETPOST("search_field1"); +$search_field2=GETPOST("search_field2"); + if (empty($action) && empty($id) && empty($ref)) $action='view'; // Protection if external user @@ -67,7 +69,8 @@ if ($user->societe_id > 0) } //$result = restrictedArea($user, 'mymodule', $id); -$object = new Skeleton_Class($db); + +$object = new MyObject_Class($db); $extrafields = new ExtraFields($db); // fetch optionals attributes and labels @@ -77,7 +80,8 @@ $extralabels = $extrafields->fetch_name_optionals_label($object->table_element); include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once // Must be include, not include_once. Include fetch and fetch_thirdparty but not fetch_optionals // Initialize technical object to manage hooks of modules. Note that conf->hooks_modules contains array array -$hookmanager->initHooks(array('skeleton')); +$hookmanager->initHooks(array('mymodule')); + /* @@ -86,7 +90,6 @@ $hookmanager->initHooks(array('skeleton')); * Put here all code to do according to value of "action" parameter */ - $parameters=array(); $reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); @@ -206,15 +209,16 @@ if (empty($reshook)) + /* * VIEW * * Put here all code to build page */ -$form = new Form($db); +$form=new Form($db); -llxHeader('', $langs->trans('MyPageName'), ''); +llxHeader('','MyPageName',''); // Put here content of your page @@ -293,54 +297,308 @@ if ($object->id > 0 && (empty($action) || ($action != 'edit' && $action != 'crea { $res = $object->fetch_optionals($object->id, $extralabels); - $head = commande_prepare_head($object); - dol_fiche_head($head, 'order', $langs->trans("CustomerOrder"), 0, 'order'); + $head = mymodule_prepare_head($object); + dol_fiche_head($head, 'order', $langs->trans("CustomerOrder"), -1, 'order'); - print load_fiche_titre($langs->trans("MyModule")); - - dol_fiche_head(); - + $formconfirm = ''; + + // Confirmation to delete if ($action == 'delete') { - $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('DeleteMyOjbect'), $langs->trans('ConfirmDeleteMyObject'), 'confirm_delete', '', 0, 1); - print $formconfirm; + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('DeleteOrder'), $langs->trans('ConfirmDeleteOrder'), 'confirm_delete', '', 0, 1); } + // Confirmation of action xxxx + if ($action == 'xxx') + { + $formquestion=array(); + /* + $formquestion = array( + // 'text' => $langs->trans("ConfirmClone"), + // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => 1), + // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' => 1), + // array('type' => 'other', 'name' => 'idwarehouse', 'label' => $langs->trans("SelectWarehouseForStockDecrease"), 'value' => $formproduct->selectWarehouses(GETPOST('idwarehouse')?GETPOST('idwarehouse'):'ifone', 'idwarehouse', '', 1))); + }*/ + $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('XXX'), $text, 'confirm_xxx', $formquestion, 0, 1, 220); + } + + if (! $formconfirm) { + $parameters = array('lineid' => $lineid); + $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook + if (empty($reshook)) $formconfirm.=$hookmanager->resPrint; + elseif ($reshook > 0) $formconfirm=$hookmanager->resPrint; + } + + // Print form confirm + print $formconfirm; + + + + // Object card + // ------------------------------------------------------------ + + $linkback = '' . $langs->trans("BackToList") . ''; + + + $morehtmlref='
        '; + /* + // Ref bis + $morehtmlref.=$form->editfieldkey("RefBis", 'ref_client', $object->ref_client, $object, $user->rights->mymodule->creer, 'string', '', 0, 1); + $morehtmlref.=$form->editfieldval("RefBis", 'ref_client', $object->ref_client, $object, $user->rights->mymodule->creer, 'string', '', null, null, '', 1); + // Thirdparty + $morehtmlref.='
        '.$langs->trans('ThirdParty') . ' : ' . $soc->getNomUrl(1); + // Project + if (! empty($conf->projet->enabled)) + { + $langs->load("projects"); + $morehtmlref.='
        '.$langs->trans('Project') . ' '; + if ($user->rights->mymodule->creer) + { + if ($action != 'classify') + { + $morehtmlref.='' . img_edit($langs->transnoentitiesnoconv('SetProject')) . ' : '; + if ($action == 'classify') { + //$morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'projectid', 0, 0, 1, 1); + $morehtmlref.='
        '; + $morehtmlref.=''; + $morehtmlref.=''; + $morehtmlref.=$formproject->select_projects($object->socid, $object->fk_project, 'projectid', $maxlength, 0, 1, 0, 1, 0, 0, '', 1); + $morehtmlref.=''; + $morehtmlref.='
        '; + } else { + $morehtmlref.=$form->form_project($_SERVER['PHP_SELF'] . '?id=' . $object->id, $object->socid, $object->fk_project, 'none', 0, 0, 0, 1); + } + } + } else { + if (! empty($object->fk_project)) { + $proj = new Project($db); + $proj->fetch($object->fk_project); + $morehtmlref.=''; + $morehtmlref.=$proj->ref; + $morehtmlref.=''; + } else { + $morehtmlref.=''; + } + } + } + */ + $morehtmlref.='
        '; + + + dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref); + + + print '
        '; + print '
        '; + print '
        '; print ''."\n"; // print ''; // LIST_OF_TD_LABEL_FIELDS_VIEW + + + // Other attributes + $cols = 2; + include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php'; + print '
        '.$langs->trans("Label").''.$object->label.'
        '; + print '
        '; + print '
        '; + print '
        '; + print '
        '; + print ''; + + + + print '
        '; + print '
        '; + print '
        '; + print '
        '; + + print '

        '; dol_fiche_end(); - // Buttons - print '
        '."\n"; - $parameters=array(); - $reshook=$hookmanager->executeHooks('addMoreActionsButtons',$parameters,$object,$action); // Note that $action and $object may have been modified by hook - if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); - - if (empty($reshook)) - { - if ($user->rights->mymodule->write) - { - print ''."\n"; - } - - if ($user->rights->mymodule->delete) - { - print ''."\n"; - } + // Buttons for actions + if ($action != 'presend' && $action != 'editline') { + print '
        '."\n"; + $parameters=array(); + $reshook=$hookmanager->executeHooks('addMoreActionsButtons',$parameters,$object,$action); // Note that $action and $object may have been modified by hook + if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + + if (empty($reshook)) + { + if ($user->rights->mymodule->write) + { + print ''."\n"; + } + + if ($user->rights->mymodule->delete) + { + print ''."\n"; + } + } + print '
        '."\n"; } - print '
        '."\n"; + + // Select mail models is same action as presend + if (GETPOST('modelselected')) { + $action = 'presend'; + } + + if ($action != 'presend') + { + print '
        '; + print ''; // ancre + // Documents + $comref = dol_sanitizeFileName($object->ref); + $relativepath = $comref . '/' . $comref . '.pdf'; + $filedir = $conf->mymodule->dir_output . '/' . $comref; + $urlsource = $_SERVER["PHP_SELF"] . "?id=" . $object->id; + $genallowed = $user->rights->mymodule->creer; + $delallowed = $user->rights->mymodule->supprimer; + print $formfile->showdocuments('mymodule', $comref, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', '', '', $soc->default_lang); + + + // Show links to link elements + $linktoelem = $form->showLinkToObjectBlock($object, null, array('order')); + $somethingshown = $form->showLinkedObjectBlock($object, $linktoelem); + + + print '
        '; + + // List of actions on element + include_once DOL_DOCUMENT_ROOT . '/core/class/html.formactions.class.php'; + $formactions = new FormActions($db); + $somethingshown = $formactions->showactions($object, 'order', $socid); + + print '
        '; + } + - // Example 2 : Adding links to objects - // Show links to link elements - //$linktoelem = $form->showLinkToObjectBlock($object, null, array('skeleton')); - //$somethingshown = $form->showLinkedObjectBlock($object, $linktoelem); + /* + * Action presend + */ + /* + if ($action == 'presend') + { + $object->fetch_projet(); + $ref = dol_sanitizeFileName($object->ref); + include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; + $fileparams = dol_most_recent_file($conf->commande->dir_output . '/' . $ref, preg_quote($ref, '/').'[^\-]+'); + $file = $fileparams['fullname']; + + // Define output language + $outputlangs = $langs; + $newlang = ''; + if ($conf->global->MAIN_MULTILANGS && empty($newlang) && ! empty($_REQUEST['lang_id'])) + $newlang = $_REQUEST['lang_id']; + if ($conf->global->MAIN_MULTILANGS && empty($newlang)) + $newlang = $object->thirdparty->default_lang; + + if (!empty($newlang)) + { + $outputlangs = new Translate('', $conf); + $outputlangs->setDefaultLang($newlang); + $outputlangs->load('commercial'); + } + + // Build document if it not exists + if (! $file || ! is_readable($file)) { + $result = $object->generateDocument(GETPOST('model') ? GETPOST('model') : $object->modelpdf, $outputlangs, $hidedetails, $hidedesc, $hideref); + if ($result <= 0) { + dol_print_error($db, $object->error, $object->errors); + exit(); + } + $fileparams = dol_most_recent_file($conf->commande->dir_output . '/' . $ref, preg_quote($ref, '/').'[^\-]+'); + $file = $fileparams['fullname']; + } + + print '
        '; + print '
        '; + print '
        '; + print load_fiche_titre($langs->trans('SendOrderByMail')); + + dol_fiche_head(''); + + // Cree l'objet formulaire mail + include_once DOL_DOCUMENT_ROOT . '/core/class/html.formmail.class.php'; + $formmail = new FormMail($db); + $formmail->param['langsmodels']=(empty($newlang)?$langs->defaultlang:$newlang); + $formmail->fromtype = (GETPOST('fromtype')?GETPOST('fromtype'):(!empty($conf->global->MAIN_MAIL_DEFAULT_FROMTYPE)?$conf->global->MAIN_MAIL_DEFAULT_FROMTYPE:'user')); + + if($formmail->fromtype === 'user'){ + $formmail->fromid = $user->id; + + } + $formmail->trackid='ord'.$object->id; + if (! empty($conf->global->MAIN_EMAIL_ADD_TRACK_ID) && ($conf->global->MAIN_EMAIL_ADD_TRACK_ID & 2)) // If bit 2 is set + { + include DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; + $formmail->frommail=dolAddEmailTrackId($formmail->frommail, 'ord'.$object->id); + } + $formmail->withfrom = 1; + $liste = array(); + foreach ($object->thirdparty->thirdparty_and_contact_email_array(1) as $key => $value) + $liste [$key] = $value; + $formmail->withto = GETPOST('sendto') ? GETPOST('sendto') : $liste; + $formmail->withtocc = $liste; + $formmail->withtoccc = $conf->global->MAIN_EMAIL_USECCC; + if (empty($object->ref_client)) { + $formmail->withtopic = $outputlangs->trans('SendOrderRef', '__ORDERREF__'); + } else if (! empty($object->ref_client)) { + $formmail->withtopic = $outputlangs->trans('SendOrderRef', '__ORDERREF__ (__REFCLIENT__)'); + } + $formmail->withfile = 2; + $formmail->withbody = 1; + $formmail->withdeliveryreceipt = 1; + $formmail->withcancel = 1; + // Tableau des substitutions + $formmail->setSubstitFromObject($object); + $formmail->substit ['__ORDERREF__'] = $object->ref; + + $custcontact = ''; + $contactarr = array(); + $contactarr = $object->liste_contact(- 1, 'external'); + + if (is_array($contactarr) && count($contactarr) > 0) + { + foreach ($contactarr as $contact) + { + if ($contact['libelle'] == $langs->trans('TypeContact_commande_external_CUSTOMER')) { // TODO Use code and not label + $contactstatic = new Contact($db); + $contactstatic->fetch($contact ['id']); + $custcontact = $contactstatic->getFullName($langs, 1); + } + } + + if (! empty($custcontact)) { + $formmail->substit['__CONTACTCIVNAME__'] = $custcontact; + } + } + + // Tableau des parametres complementaires + $formmail->param['action'] = 'send'; + $formmail->param['models'] = 'order_send'; + $formmail->param['models_id']=GETPOST('modelmailselected','int'); + $formmail->param['orderid'] = $object->id; + $formmail->param['returnurl'] = $_SERVER["PHP_SELF"] . '?id=' . $object->id; + + // Init list of files + if (GETPOST("mode") == 'init') { + $formmail->clear_attached_files(); + $formmail->add_attached_files($file, basename($file), dol_mimetype($file)); + } + + // Show form + print $formmail->get_form(); + + dol_fiche_end(); + }*/ } + // End of page llxFooter(); $db->close(); diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index c249f165242..ad105480901 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -1,10 +1,10 @@ - * Copyright (C) +/* Copyright (C) 2007-2016 Laurent Destailleur + * Copyright (C) ---Put here your own copyright and developer email--- * - * This program is free software: you can redistribute it and/or modify + * 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 3 of the License, or + * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, @@ -13,21 +13,20 @@ * 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 . + * along with this program. If not, see . */ /** - * \file myobject_list.php - * \ingroup mymodule - * \brief Page with list of myobject. - * - * List of myobject + * \file htdocs/modulebuilder/template/myobject_list.php + * \ingroup mymodule othermodule1 othermodule2 + * \brief This file is an example of a php page + * Put here some comments */ -//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); -//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); -//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); -//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); +//if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); +//if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); +//if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); +//if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); //if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK','1'); // Do not check anti CSRF attack test //if (! defined('NOSTYLECHECK')) define('NOSTYLECHECK','1'); // Do not check style html tag into posted data //if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL','1'); // Do not check anti POST attack test @@ -36,31 +35,39 @@ //if (! defined('NOREQUIREAJAX')) define('NOREQUIREAJAX','1'); //if (! defined("NOLOGIN")) define("NOLOGIN",'1'); // If this page is public (can be called outside logged session) -// Change the following lines to use the correct relative path (../, ../../, etc) - -// Load Dolibarr environment -if (false === (@include '../../main.inc.php')) { // From htdocs directory - require '../../../main.inc.php'; // From "custom" directory -} - +// Change this following line to use the correct relative path (../, ../../, etc) +$res=0; +if (! $res && file_exists("../main.inc.php")) $res=@include '../main.inc.php'; // to work if your module directory is into dolibarr root htdocs directory +if (! $res && file_exists("../../main.inc.php")) $res=@include '../../main.inc.php'; // to work if your module directory is into a subdir of root htdocs directory +if (! $res && file_exists("../../../dolibarr/htdocs/main.inc.php")) $res=@include '../../../dolibarr/htdocs/main.inc.php'; // Used on dev env only +if (! $res && file_exists("../../../../dolibarr/htdocs/main.inc.php")) $res=@include '../../../../dolibarr/htdocs/main.inc.php'; // Used on dev env only +if (! $res) die("Include of main fails"); +// Change this following line to use the correct relative path from htdocs +require_once(DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'); require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; -dol_include_once('/mymodule/class/myclass.class.php'); +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +dol_include_once('/mymodule/class/skeleton_class.class.php'); -// Load translation files required by the page -$langs->load("mymodule@mymodule"); +// Load traductions files requiredby by page +$langs->load("mymodule"); +$langs->load("other"); -// Get parameters -$action = GETPOST('action','alpha'); -$massaction = GETPOST('massaction','alpha'); -$show_files = GETPOST('show_files','int'); -$confirm = GETPOST('confirm','alpha'); -$toselect = GETPOST('toselect', 'array'); +$action=GETPOST('action','alpha'); +$massaction=GETPOST('massaction','alpha'); +$show_files=GETPOST('show_files','int'); +$confirm=GETPOST('confirm','alpha'); +$toselect = GETPOST('toselect', 'array'); $id = GETPOST('id','int'); $backtopage = GETPOST('backtopage'); -// TODO Add here list of search params $myparam = GETPOST('myparam','alpha'); +$search_all=trim(GETPOST("sall")); +$search_field1=GETPOST("search_field1"); +$search_field2=GETPOST("search_field2"); +$search_myfield=GETPOST('search_myfield'); +$optioncss = GETPOST('optioncss','alpha'); + // Load variable for pagination $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit; $sortfield = GETPOST('sortfield','alpha'); @@ -74,11 +81,12 @@ if (! $sortfield) $sortfield="t.rowid"; // Set here default search field if (! $sortorder) $sortorder="ASC"; // Protection if external user +$socid=0; if ($user->societe_id > 0) { + $socid = $user->societe_id; //accessforbidden(); } -//$result = restrictedArea($user, 'mymodule', $id); // Initialize technical object to manage context to save list fields $contextpage=GETPOST('contextpage','aZ')?GETPOST('contextpage','aZ'):'mymodulelist'; @@ -87,14 +95,41 @@ $contextpage=GETPOST('contextpage','aZ')?GETPOST('contextpage','aZ'):'mymoduleli $hookmanager->initHooks(array('mymodulelist')); $extrafields = new ExtraFields($db); -// Load object if id or ref is provided as parameter -$object = new MyClass($db); -if (($id > 0 || ! empty($ref)) && $action != 'add') { - $result = $object->fetch($id, $ref); - if ($result < 0) dol_print_error($db); +// fetch optionals attributes and labels +$extralabels = $extrafields->fetch_name_optionals_label('mymodule'); +$search_array_options=$extrafields->getOptionalsFromPost($extralabels,'','search_'); + +// List of fields to search into when doing a "search in all" +$fieldstosearchall = array( + 't.ref'=>'Ref', + 't.note_public'=>'NotePublic', +); +if (empty($user->socid)) $fieldstosearchall["t.note_private"]="NotePrivate"; + +// Definition of fields for list +$arrayfields=array( + 't.field1'=>array('label'=>"Field1", 'checked'=>1), + 't.field2'=>array('label'=>"Field2", 'checked'=>1), + //'t.entity'=>array('label'=>"Entity", 'checked'=>1, 'enabled'=>(! empty($conf->multicompany->enabled) && empty($conf->multicompany->transverse_mode))), + 't.datec'=>array('label'=>"DateCreationShort", 'checked'=>0, 'position'=>500), + 't.tms'=>array('label'=>"DateModificationShort", 'checked'=>0, 'position'=>500), + //'t.statut'=>array('label'=>"Status", 'checked'=>1, 'position'=>1000), +); +// Extra fields +if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) +{ + foreach($extrafields->attribute_label as $key => $val) + { + $arrayfields["ef.".$key]=array('label'=>$extrafields->attribute_label[$key], 'checked'=>$extrafields->attribute_list[$key], 'position'=>$extrafields->attribute_pos[$key], 'enabled'=>$extrafields->attribute_perms[$key]); + } } +$object=new Skeleton_Class($db); + + + + /* * ACTIONS * @@ -116,10 +151,10 @@ if (empty($reshook)) // Purge search criteria if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") ||GETPOST("button_removefilter")) // All tests are required to be compatible with all browsers { - $search_field1=''; - $search_field2=''; - $search_date_creation=''; - $search_date_update=''; + $search_field1=''; + $search_field2=''; + $search_date_creation=''; + $search_date_update=''; $toselect=''; $search_array_options=array(); } @@ -134,18 +169,24 @@ if (empty($reshook)) } + /* * VIEW * * Put here all code to build page */ -llxHeader('', $langs->trans('MyPageName'), ''); +$now=dol_now(); -$form = new Form($db); +$form=new Form($db); + +//$help_url="EN:Module_Customers_Orders|FR:Module_Commandes_Clients|ES:Módulo_Pedidos_de_clientes"; +$help_url=''; +$title = $langs->trans('MyModuleListTitle'); // Put here content of your page -// Example 1: Adding jquery code + +// Example : Adding jquery code print ''; +$sql = "SELECT"; +$sql.= " t.rowid,"; +$sql.= " t.field1,"; +$sql.= " t.field2"; +// Add fields from extrafields +foreach ($extrafields->attribute_label as $key => $val) $sql.=($extrafields->attribute_type[$key] != 'separate' ? ",ef.".$key.' as options_'.$key : ''); +// Add fields from hooks +$parameters=array(); +$reshook=$hookmanager->executeHooks('printFieldListSelect',$parameters); // Note that $action and $object may have been modified by hook +$sql.=$hookmanager->resPrint; +$sql.= " FROM ".MAIN_DB_PREFIX."mytable as t"; +if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."mytable_extrafields as ef on (t.rowid = ef.fk_object)"; +$sql.= " WHERE 1 = 1"; +//$sql.= " WHERE u.entity IN (".getEntity('mytable',1).")"; +if ($search_field1) $sql.= natural_search("field1",$search_field1); +if ($search_field2) $sql.= natural_search("field2",$search_field2); +if ($sall) $sql.= natural_search(array_keys($fieldstosearchall), $sall); +// Add where from extra fields +foreach ($search_array_options as $key => $val) +{ + $crit=$val; + $tmpkey=preg_replace('/search_options_/','',$key); + $typ=$extrafields->attribute_type[$tmpkey]; + $mode=0; + if (in_array($typ, array('int','double'))) $mode=1; // Search on a numeric + if ($val && ( ($crit != '' && ! in_array($typ, array('select'))) || ! empty($crit))) + { + $sql .= natural_search('ef.'.$tmpkey, $crit, $mode); + } +} +// Add where from hooks +$parameters=array(); +$reshook=$hookmanager->executeHooks('printFieldListWhere',$parameters); // Note that $action and $object may have been modified by hook +$sql.=$hookmanager->resPrint; +$sql.=$db->order($sortfield,$sortorder); -// TODO +// Count total nb of records +$nbtotalofrecords = ''; +if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) +{ + $result = $db->query($sql); + $nbtotalofrecords = $db->num_rows($result); +} + +$sql.= $db->plimit($limit+1, $offset); + +dol_syslog($script_file, LOG_DEBUG); +$resql=$db->query($sql); +if (! $resql) +{ + dol_print_error($db); + exit; +} + +$num = $db->num_rows($resql); + +// Direct jump if only one record found +if ($num == 1 && ! empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $search_all) +{ + $obj = $db->fetch_object($resql); + $id = $obj->rowid; + header("Location: ".DOL_URL_ROOT.'/skeleton/card.php?id='.$id); + exit; +} + +llxHeader('', $title, $help_url); + +$arrayofselected=is_array($toselect)?$toselect:array(); + +$param=''; +if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage; +if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit; +if ($search_field1 != '') $param.= '&search_field1='.urlencode($search_field1); +if ($search_field2 != '') $param.= '&search_field2='.urlencode($search_field2); +if ($optioncss != '') $param.='&optioncss='.$optioncss; +// Add $param from extra fields +foreach ($search_array_options as $key => $val) +{ + $crit=$val; + $tmpkey=preg_replace('/search_options_/','',$key); + if ($val != '') $param.='&search_options_'.$tmpkey.'='.urlencode($val); +} + +$arrayofmassactions = array( + 'presend'=>$langs->trans("SendByMail"), + 'builddoc'=>$langs->trans("PDFMerge"), +); +if ($user->rights->mymodule->supprimer) $arrayofmassactions['delete']=$langs->trans("Delete"); +if ($massaction == 'presend') $arrayofmassactions=array(); +$massactionbutton=$form->selectMassAction('', $arrayofmassactions); + +print '
        '; +if ($optioncss != '') print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; + +print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_companies', 0, '', '', $limit); + +if ($sall) +{ + foreach($fieldstosearchall as $key => $val) $fieldstosearchall[$key]=$langs->trans($val); + print $langs->trans("FilterOnInto", $sall) . join(', ',$fieldstosearchall); +} + +$moreforfilter = ''; +$moreforfilter.='
        '; +$moreforfilter.= $langs->trans('MyFilter') . ': '; +$moreforfilter.= '
        '; + +$parameters=array(); +$reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook +if (empty($reshook)) $moreforfilter .= $hookmanager->resPrint; +else $moreforfilter = $hookmanager->resPrint; + +if (! empty($moreforfilter)) +{ + print '
        '; + print $moreforfilter; + print '
        '; +} + +$varpage=empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage; +$selectedfields=$form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields + +print '
        '; +print ''."\n"; + +// Fields title +print ''; +// LIST_OF_TD_TITLE_FIELDS +//if (! empty($arrayfields['t.field1']['checked'])) print_liste_field_titre($arrayfields['t.field1']['label'],$_SERVER['PHP_SELF'],'t.field1','',$param,'',$sortfield,$sortorder); +//if (! empty($arrayfields['t.field2']['checked'])) print_liste_field_titre($arrayfields['t.field2']['label'],$_SERVER['PHP_SELF'],'t.field2','',$param,'',$sortfield,$sortorder); +// Extra fields +if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) +{ + foreach($extrafields->attribute_label as $key => $val) + { + if (! empty($arrayfields["ef.".$key]['checked'])) + { + $align=$extrafields->getAlignFlag($key); + $sortonfield = "ef.".$key; + if (! empty($extrafields->attribute_computed[$key])) $sortonfield=''; + print_liste_field_titre($langs->trans($extralabels[$key]),$_SERVER["PHP_SELF"],$sortonfield,"",$param,($align?'align="'.$align.'"':''),$sortfield,$sortorder); + } + } +} +// Hook fields +$parameters=array('arrayfields'=>$arrayfields); +$reshook=$hookmanager->executeHooks('printFieldListTitle',$parameters); // Note that $action and $object may have been modified by hook +print $hookmanager->resPrint; +if (! empty($arrayfields['t.datec']['checked'])) print_liste_field_titre($arrayfields['t.datec']['label'],$_SERVER["PHP_SELF"],"t.datec","",$param,'align="center" class="nowrap"',$sortfield,$sortorder); +if (! empty($arrayfields['t.tms']['checked'])) print_liste_field_titre($arrayfields['t.tms']['label'],$_SERVER["PHP_SELF"],"t.tms","",$param,'align="center" class="nowrap"',$sortfield,$sortorder); +//if (! empty($arrayfields['t.status']['checked'])) print_liste_field_titre($langs->trans("Status"),$_SERVER["PHP_SELF"],"t.status","",$param,'align="center"',$sortfield,$sortorder); +print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"],"",'','','align="center"',$sortfield,$sortorder,'maxwidthsearch '); +print ''."\n"; + +// Fields title search +print ''; +// LIST_OF_TD_TITLE_SEARCH +//if (! empty($arrayfields['t.field1']['checked'])) print ''; +//if (! empty($arrayfields['t.field2']['checked'])) print ''; +// Extra fields +if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) +{ + foreach($extrafields->attribute_label as $key => $val) + { + if (! empty($arrayfields["ef.".$key]['checked'])) + { + $align=$extrafields->getAlignFlag($key); + $typeofextrafield=$extrafields->attribute_type[$key]; + print ''; + } + } +} +// Fields from hook +$parameters=array('arrayfields'=>$arrayfields); +$reshook=$hookmanager->executeHooks('printFieldListOption',$parameters); // Note that $action and $object may have been modified by hook +print $hookmanager->resPrint; +if (! empty($arrayfields['t.datec']['checked'])) +{ + // Date creation + print ''; +} +if (! empty($arrayfields['t.tms']['checked'])) +{ + // Date modification + print ''; +} +/*if (! empty($arrayfields['u.statut']['checked'])) +{ + // Status + print ''; +}*/ +// Action column +print ''; +print ''."\n"; + + +// Detect if we need a fetch on each output line +$needToFetchEachLine=0; +foreach ($extrafields->attribute_computed as $key => $val) +{ + if (preg_match('/\$object/',$val)) $needToFetchEachLine++; // There is at least one compute field that use $object +} +$i=0; +$totalarray=array(); +while ($i < min($num, $limit)) +{ + $obj = $db->fetch_object($resql); + if ($obj) + { + // Show here line of result + print ''; + // LIST_OF_TD_FIELDS_LIST + /* + if (! empty($arrayfields['t.field1']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + if (! empty($arrayfields['t.field2']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + }*/ + // Extra fields + if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) + { + foreach($extrafields->attribute_label as $key => $val) + { + if (! empty($arrayfields["ef.".$key]['checked'])) + { + print 'getAlignFlag($key); + if ($align) print ' align="'.$align.'"'; + print '>'; + $tmpkey='options_'.$key; + print $extrafields->showOutputField($key, $obj->$tmpkey, '', 1); + print ''; + if (! $i) $totalarray['nbfield']++; + } + } + } + // Fields from hook + $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $reshook=$hookmanager->executeHooks('printFieldListValue',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Date creation + if (! empty($arrayfields['t.datec']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Date modification + if (! empty($arrayfields['t.tms']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Status + /* + if (! empty($arrayfields['u.statut']['checked'])) + { + $userstatic->statut=$obj->statut; + print ''; + }*/ + + // Action column + print ''; + if (! $i) $totalarray['nbfield']++; + + print ''; + } + $i++; +} + +// Show total line +if (isset($totalarray['totalhtfield'])) +{ + print ''; + $i=0; + while ($i < $totalarray['nbfield']) + { + $i++; + if ($i == 1) + { + if ($num < $limit) print ''; + else print ''; + } + elseif ($totalarray['totalhtfield'] == $i) print ''; + elseif ($totalarray['totalvatfield'] == $i) print ''; + elseif ($totalarray['totalttcfield'] == $i) print ''; + else print ''; + } + print ''; +} + +$db->free($resql); + +$parameters=array('arrayfields'=>$arrayfields, 'sql'=>$sql); +$reshook=$hookmanager->executeHooks('printFieldListFooter',$parameters); // Note that $action and $object may have been modified by hook +print $hookmanager->resPrint; + +print '
        '; + if (in_array($typeofextrafield, array('varchar', 'int', 'double', 'select')) && empty($extrafields->attribute_computed[$key])) + { + $crit=$val; + $tmpkey=preg_replace('/search_options_/','',$key); + $searchclass=''; + if (in_array($typeofextrafield, array('varchar', 'select'))) $searchclass='searchstring'; + if (in_array($typeofextrafield, array('int', 'double'))) $searchclass='searchnum'; + print ''; + } + print ''; + print ''; + print ''; + print $form->selectarray('search_statut', array('-1'=>'','0'=>$langs->trans('Disabled'),'1'=>$langs->trans('Enabled')),$search_statut); + print ''; +$searchpicto=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); +print $searchpicto; +print '
        '.$obj->field1.''.$obj->field2.''; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour'); + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour'); + print ''.$userstatic->getLibStatut(3).''; + if ($massactionbutton || $massaction) // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + { + $selected=0; + if (in_array($obj->rowid, $arrayofselected)) $selected=1; + print ''; + } + print '
        '.$langs->trans("Total").''.$langs->trans("Totalforthispage").''.price($totalarray['totalht']).''.price($totalarray['totalvat']).''.price($totalarray['totalttc']).'
        '."\n"; +print '
        '."\n"; + +print '
        '."\n"; -// Example 2: Adding links to objects -// The class must extend CommonObject for this method to be available -$somethingshown = $form->showLinkedObjectBlock($myobject); +if ($massaction == 'builddoc' || $action == 'remove_file' || $show_files) +{ + // Show list of available documents + $urlsource=$_SERVER['PHP_SELF'].'?sortfield='.$sortfield.'&sortorder='.$sortorder; + $urlsource.=str_replace('&','&',$param); + + $filedir=$diroutputmassaction; + $genallowed=$user->rights->facture->lire; + $delallowed=$user->rights->facture->lire; + + print $formfile->showdocuments('massfilesarea_mymodule','',$filedir,$urlsource,0,$delallowed,'',1,1,0,48,1,$param,$title,''); +} +else +{ + print '
        '.$langs->trans("ShowTempMassFilesArea").''; +} + // End of page llxFooter(); +$db->close(); diff --git a/htdocs/modulebuilder/template/scripts/myobject.php b/htdocs/modulebuilder/template/scripts/myobject.php new file mode 100644 index 00000000000..af381b0bfae --- /dev/null +++ b/htdocs/modulebuilder/template/scripts/myobject.php @@ -0,0 +1,165 @@ +#!/usr/bin/env php + + * Copyright (C) ---Put here your own copyright and developer email--- + * + * 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 3 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/modulebuilder/template/scripts/myobject.php + * \ingroup mymodule + * \brief This file is an example for a command line script to work on MyObject + */ + +$sapi_type = php_sapi_name(); +$script_file = basename(__FILE__); +$path=dirname(__FILE__).'/'; + +// Test if batch mode +if (substr($sapi_type, 0, 3) == 'cgi') { + echo "Error: You are using PHP for CGI. To execute ".$script_file." from command line, you must use PHP for CLI mode.\n"; + exit(-1); +} + +// Global variables +$version='1.0'; +$error=0; + + +// -------------------- START OF YOUR CODE HERE -------------------- +@set_time_limit(0); // No timeout for this script +define('EVEN_IF_ONLY_LOGIN_ALLOWED',1); // Set this define to 0 if you want to lock your script when dolibarr setup is "locked to admin user only". + +// Include and load Dolibarr environment variables +require_once($path."../../htdocs/master.inc.php"); +// After this $db, $mysoc, $langs, $conf and $hookmanager are defined (Opened $db handler to database will be closed at end of file). +// $user is created but empty. + +//$langs->setDefaultLang('en_US'); // To change default language of $langs +$langs->load("main"); // To load language file for default language + +// Load user and its permissions +$result=$user->fetch('','admin'); // Load user for login 'admin'. Comment line to run as anonymous user. +if (! $result > 0) { dol_print_error('',$user->error); exit; } +$user->getrights(); + + +print "***** ".$script_file." (".$version.") pid=".dol_getmypid()." *****\n"; +if (! isset($argv[1])) { // Check parameters + print "Usage: ".$script_file." param1 param2 ...\n"; + exit(-1); +} +print '--- start'."\n"; +print 'Argument 1='.$argv[1]."\n"; +print 'Argument 2='.$argv[2]."\n"; + + +// Start of transaction +$db->begin(); + + +// Examples for manipulating class MyObject +dol_include_once("/mymodule/class/myobject.class.php"); +$myobject=new MyObject($db); + +// Example for inserting creating object in database +/* +dol_syslog($script_file." CREATE", LOG_DEBUG); +$myobject->prop1='value_prop1'; +$myobject->prop2='value_prop2'; +$id=$myobject->create($user); +if ($id < 0) { $error++; dol_print_error($db,$myobject->error); } +else print "Object created with id=".$id."\n"; +*/ + +// Example for reading object from database +/* +dol_syslog($script_file." FETCH", LOG_DEBUG); +$result=$myobject->fetch($id); +if ($result < 0) { $error; dol_print_error($db,$myobject->error); } +else print "Object with id=".$id." loaded\n"; +*/ + +// Example for updating object in database ($myobject must have been loaded by a fetch before) +/* +dol_syslog($script_file." UPDATE", LOG_DEBUG); +$myobject->prop1='newvalue_prop1'; +$myobject->prop2='newvalue_prop2'; +$result=$myobject->update($user); +if ($result < 0) { $error++; dol_print_error($db,$myobject->error); } +else print "Object with id ".$myobject->id." updated\n"; +*/ + +// Example for deleting object in database ($myobject must have been loaded by a fetch before) +/* +dol_syslog($script_file." DELETE", LOG_DEBUG); +$result=$myobject->delete($user); +if ($result < 0) { $error++; dol_print_error($db,$myobject->error); } +else print "Object with id ".$myobject->id." deleted\n"; +*/ + + +// An example of a direct SQL read without using the fetch method +/* +$sql = "SELECT field1, field2"; +$sql.= " FROM ".MAIN_DB_PREFIX."myobject"; +$sql.= " WHERE field3 = 'xxx'"; +$sql.= " ORDER BY field1 ASC"; + +dol_syslog($script_file, LOG_DEBUG); +$resql=$db->query($sql); +if ($resql) +{ + $num = $db->num_rows($resql); + $i = 0; + if ($num) + { + while ($i < $num) + { + $obj = $db->fetch_object($resql); + if ($obj) + { + // You can use here results + print $obj->field1; + print $obj->field2; + } + $i++; + } + } +} +else +{ + $error++; + dol_print_error($db); +} +*/ + + +// -------------------- END OF YOUR CODE -------------------- + +if (! $error) +{ + $db->commit(); + print '--- end ok'."\n"; +} +else +{ + print '--- end error code='.$error."\n"; + $db->rollback(); +} + +$db->close(); // Close $db database opened handler + +exit($error); diff --git a/htdocs/modulebuilder/template/scripts/myscript.php b/htdocs/modulebuilder/template/scripts/myscript.php deleted file mode 100644 index 468729c59f3..00000000000 --- a/htdocs/modulebuilder/template/scripts/myscript.php +++ /dev/null @@ -1,203 +0,0 @@ -#!/usr/bin/env php - - * Copyright (C) - * - * 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 3 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 scripts/myscript.php - * \ingroup mymodule - * \brief Example command line script. - * - * Put detailed description here. - */ - -$sapi_type = php_sapi_name(); -$script_file = basename(__FILE__); -$path = dirname(__FILE__) . '/'; - -// Test if batch mode -if (substr($sapi_type, 0, 3) == 'cgi') { - echo "Error: You are using PHP for CGI. To execute "; - echo $script_file; - echo " from command line, you must use PHP for CLI mode.\n"; - exit; -} - -// Global variables -$version = '1.0.0'; -$error = 0; - - -/* - * -------------------- YOUR CODE STARTS HERE -------------------- - */ -/* Set this define to 0 if you want to allow execution of your script - * even if dolibarr setup is "locked to admin user only". */ -define('EVEN_IF_ONLY_LOGIN_ALLOWED', 0); - -/* Include Dolibarr environment - * Customize to your needs - */ -require_once $path . '../../../master.inc.php'; -/* After this $db, $conf, $langs, $mysoc, $user and other Dolibarr utility variables should be defined. - * Warning: this still requires a valid htdocs/conf.php file - */ - -global $conf, $db, $langs, $mysoc, $user; - -// No timeout for this script -@set_time_limit(0); - -// Set the default language -//$langs->setDefaultLang('en_US'); - -// Load translations for the default language -$langs->load("main"); - -/* User and permissions loading - * Loads user for login 'admin'. - * Comment out to run as anonymous user. */ -$result = $user->fetch('', 'admin'); -if (! $result > 0) { - dol_print_error('', $user->error); - exit; -} -$user->getrights(); - -// Display banner and help -echo "***** " . $script_file . " (" . $version . ") pid=" . getmypid() . " *****\n"; -dol_syslog($script_file . " launched with arg " . join(',', $argv)); -if (! isset($argv[1])) { - // Check parameters - echo "Usage: " . $script_file . " param1 param2 ...\n"; - exit; -} -echo '--- start' . "\n"; -echo 'Argument 1=' . $argv[1] . "\n"; -echo 'Argument 2=' . $argv[2] . "\n"; - -// Start database transaction -$db->begin(); - -// Examples for manipulating a class -require_once '../class/myclass.class.php'; -$myobject = new MyClass($db); - -// Example for inserting creating object in database -/* - dol_syslog($script_file . " CREATE", LOG_DEBUG); - $myobject->prop1 = 'value_prop1'; - $myobject->prop2 = 'value_prop2'; - $id = $myobject->create($user); - if ($id < 0) { - $error++; - dol_print_error($db, $myobject->error); - } else { - echo "Object created with id=" . $id . "\n"; - } - */ - -// Example for reading object from database -/* - dol_syslog($script_file . " FETCH", LOG_DEBUG); - $result = $myobject->fetch($id); - if ($result < 0) { - $error; - dol_print_error($db, $myobject->error); - } else { - echo "Object with id=" . $id . " loaded\n"; - } - */ - -// Example for updating object in database -// ($myobject must have been loaded by a fetch before) -/* - dol_syslog($script_file . " UPDATE", LOG_DEBUG); - $myobject->prop1 = 'newvalue_prop1'; - $myobject->prop2 = 'newvalue_prop2'; - $result = $myobject->update($user); - if ($result < 0) { - $error++; - dol_print_error($db, $myobject->error); - } else { - echo "Object with id " . $myobject->id . " updated\n"; - } - */ - -// Example for deleting object in database -// ($myobject must have been loaded by a fetch before) -/* - dol_syslog($script_file . " DELETE", LOG_DEBUG); - $result = $myobject->delete($user); - if ($result < 0) { - $error++; - dol_print_error($db, $myobject->error); - } else { - echo "Object with id " . $myobject->id . " deleted\n"; - } - */ - -// An example of a direct SQL read without using the fetch method -/* - $sql = "SELECT field1, field2"; - $sql.= " FROM " . MAIN_DB_PREFIX . "c_pays"; - $sql.= " WHERE field3 = 'xxx'"; - $sql.= " ORDER BY field1 ASC"; - - dol_syslog($script_file . " sql=" . $sql, LOG_DEBUG); - $resql=$db->query($sql); - if ($resql) { - $num = $db->num_rows($resql); - $i = 0; - if ($num) { - while ($i < $num) { - $obj = $db->fetch_object($resql); - if ($obj) { - // You can use here results - echo $obj->field1; - echo $obj->field2; - } - $i++; - } - } - } else { - $error++; - dol_print_error($db); - } - */ - - -/* - * --------------------- YOUR CODE ENDS HERE ---------------------- - */ - -// Error management -if (! $error) { - $db->commit(); - echo '--- end ok' . "\n"; - $exit_status = 0; // UNIX no errors exit status -} else { - echo '--- end error code=' . $error . "\n"; - $db->rollback(); - $exit_status = 1; // UNIX general error exit status -} - -// Close database handler -$db->close(); - -// Return exit status code -return $exit_status; diff --git a/htdocs/modulebuilder/template/sql/data.sql b/htdocs/modulebuilder/template/sql/data.sql index 90e9e0ced2b..82266dc08b3 100644 --- a/htdocs/modulebuilder/template/sql/data.sql +++ b/htdocs/modulebuilder/template/sql/data.sql @@ -14,6 +14,6 @@ -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -INSERT INTO llx_mytable VALUES ( +INSERT INTO llx_myobject VALUES ( 1, 1, 'mydata' ); diff --git a/htdocs/modulebuilder/template/sql/llx_mytable.key.sql b/htdocs/modulebuilder/template/sql/llx_myobject.key.sql similarity index 90% rename from htdocs/modulebuilder/template/sql/llx_mytable.key.sql rename to htdocs/modulebuilder/template/sql/llx_myobject.key.sql index 56975f55a01..6fd4bb4cda6 100644 --- a/htdocs/modulebuilder/template/sql/llx_mytable.key.sql +++ b/htdocs/modulebuilder/template/sql/llx_myobject.key.sql @@ -14,4 +14,4 @@ -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -ALTER TABLE llx_mytable ADD UNIQUE INDEX uk_fk_othertable (fk_othertable); +ALTER TABLE llx_myobject ADD UNIQUE INDEX uk_fk_othertable (fk_othertable); diff --git a/htdocs/modulebuilder/template/sql/llx_mytable.sql b/htdocs/modulebuilder/template/sql/llx_myobject.sql similarity index 97% rename from htdocs/modulebuilder/template/sql/llx_mytable.sql rename to htdocs/modulebuilder/template/sql/llx_myobject.sql index 2ef08b7fca1..edcd7a7c26d 100644 --- a/htdocs/modulebuilder/template/sql/llx_mytable.sql +++ b/htdocs/modulebuilder/template/sql/llx_myobject.sql @@ -14,7 +14,7 @@ -- You should have received a copy of the GNU General Public License -- along with this program. If not, see . -CREATE TABLE llx_mytable( +CREATE TABLE llx_myobject( rowid INTEGER AUTO_INCREMENT PRIMARY KEY, entity INTEGER DEFAULT 1 NOT NULL, fk_othertable INTEGER NOT NULL, diff --git a/htdocs/modulebuilder/template/test/functional/MyModuleFunctionalTest.php b/htdocs/modulebuilder/template/test/phpunit/MyModuleFunctionalTest.php similarity index 100% rename from htdocs/modulebuilder/template/test/functional/MyModuleFunctionalTest.php rename to htdocs/modulebuilder/template/test/phpunit/MyModuleFunctionalTest.php diff --git a/htdocs/modulebuilder/template/test/unit/MyClassTest.php b/htdocs/modulebuilder/template/test/phpunit/MyObjectTest.php similarity index 91% rename from htdocs/modulebuilder/template/test/unit/MyClassTest.php rename to htdocs/modulebuilder/template/test/phpunit/MyObjectTest.php index 94898e9209b..37a65323fda 100644 --- a/htdocs/modulebuilder/template/test/unit/MyClassTest.php +++ b/htdocs/modulebuilder/template/test/phpunit/MyObjectTest.php @@ -17,20 +17,18 @@ */ /** - * \file test/unit/MyClassTest.php + * \file test/unit/MyObjectTest.php * \ingroup mymodule - * \brief Example PHPUnit test. - * - * Put detailed description here. + * \brief PHPUnit test for MyObject class. */ namespace test\unit; /** - * Class MyClassTest + * Class MyObjectTest * @package Testmymodule */ -class MyClassTest extends \PHPUnit_Framework_TestCase +class MyObjectTest extends \PHPUnit_Framework_TestCase { /** * Global test setup From 48477e00fd6d4fe6a249ae6af92cfedaba109b76 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sun, 28 May 2017 06:49:17 +0200 Subject: [PATCH 273/299] Review payment part on expense report card --- htdocs/expensereport/card.php | 330 +++++++++++++++++++--------------- 1 file changed, 183 insertions(+), 147 deletions(-) diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php index fe546cd1064..1dbcbfc1335 100644 --- a/htdocs/expensereport/card.php +++ b/htdocs/expensereport/card.php @@ -2,7 +2,7 @@ /* Copyright (C) 2003 Rodolphe Quiedeville * Copyright (C) 2004-2017 Laurent Destailleur * Copyright (C) 2005-2009 Regis Houssin - * Copyright (C) 2015-2016 Alexandre Spangaro + * Copyright (C) 2015-2017 Alexandre Spangaro * Copyright (C) 2017 Ferran Marcet * * This program is free software; you can redistribute it and/or modify @@ -37,9 +37,12 @@ require_once DOL_DOCUMENT_ROOT . '/core/lib/expensereport.lib.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/price.lib.php'; require_once DOL_DOCUMENT_ROOT . '/core/modules/expensereport/modules_expensereport.php'; require_once DOL_DOCUMENT_ROOT . '/expensereport/class/expensereport.class.php'; -require_once DOL_DOCUMENT_ROOT . '/compta/paiement/class/paiement.class.php'; +require_once DOL_DOCUMENT_ROOT . '/expensereport/class/paymentexpensereport.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/class/doleditor.class.php'; require_once DOL_DOCUMENT_ROOT . '/core/class/extrafields.class.php'; +if (! empty($conf->accounting->enabled)) { + require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingjournal.class.php'; +} $langs->load("trips"); $langs->load("bills"); @@ -647,14 +650,14 @@ if (empty($reshook)) { setEventMessages($object->error, $object->errors, 'errors'); } - + if ($action == "confirm_refuse" && GETPOST('confirm')=="yes" && $id > 0 && $user->rights->expensereport->approve) { $object = new ExpenseReport($db); $object->fetch($id); - + $result = $object->setDeny($user,GETPOST('detail_refuse')); - + if ($result > 0) { // Define output language @@ -674,11 +677,11 @@ if (empty($reshook)) $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); } } - + if ($result > 0) { // Send mail - + // TO $destinataire = new User($db); $destinataire->fetch($object->fk_user_author); @@ -714,10 +717,10 @@ if (empty($reshook)) array_push($mimetype,"application/pdf"); } */ - + // PREPARE SEND $mailfile = new CMailFile($subject,$emailTo,$emailFrom,$message,$filedir,$mimetype,$filename); - + if ($mailfile) { // SEND @@ -767,17 +770,17 @@ if (empty($reshook)) { setEventMessages($object->error, $object->errors, 'errors'); } - + //var_dump($user->id == $object->fk_user_validator);exit; if ($action == "confirm_cancel" && GETPOST('confirm')=="yes" && GETPOST('detail_cancel') && $id > 0 && $user->rights->expensereport->creer) { $object = new ExpenseReport($db); $object->fetch($id); - + if ($user->id == $object->fk_user_valid || $user->id == $object->fk_user_author) { $result = $object->set_cancel($user,GETPOST('detail_cancel')); - + if ($result > 0) { // Define output language @@ -797,16 +800,16 @@ if (empty($reshook)) $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); } } - + if ($result > 0) { // Send mail - + // TO $destinataire = new User($db); $destinataire->fetch($object->fk_user_author); $emailTo = $destinataire->email; - + // FROM $expediteur = new User($db); $expediteur->fetch($object->fk_user_cancel); @@ -891,7 +894,7 @@ if (empty($reshook)) setEventMessages($object->error, $object->errors, 'errors'); } } - + if ($action == "confirm_brouillonner" && GETPOST('confirm')=="yes" && $id > 0 && $user->rights->expensereport->creer) { $object = new ExpenseReport($db); @@ -899,7 +902,7 @@ if (empty($reshook)) if ($user->id == $object->fk_user_author || $user->id == $object->fk_user_valid) { $result = $object->setStatut(0); - + if ($result > 0) { // Define output language @@ -919,7 +922,7 @@ if (empty($reshook)) $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); } } - + if ($result > 0) { header("Location: ".$_SERVER["PHP_SELF"]."?id=".$id); @@ -935,14 +938,14 @@ if (empty($reshook)) setEventMessages("NOT_AUTHOR", '', 'errors'); } } - + if ($action == 'set_paid' && $id > 0 && $user->rights->expensereport->to_paid) { $object = new ExpenseReport($db); $object->fetch($id); - + $result = $object->set_paid($id, $user); - + if ($result > 0) { // Define output language @@ -962,46 +965,46 @@ if (empty($reshook)) $object->generateDocument($model, $outputlangs, $hidedetails, $hidedesc, $hideref); } } - + if ($result > 0) { // Send mail - + // TO $destinataire = new User($db); $destinataire->fetch($object->fk_user_author); $emailTo = $destinataire->email; - + // FROM $expediteur = new User($db); $expediteur->fetch($user->id); $emailFrom = $expediteur->email; - + if ($emailFrom && $emailTo) { $filename=array(); $filedir=array(); $mimetype=array(); // SUBJECT $subject = $langs->transnoentities("ExpenseReportPaid"); - + // CONTENT $link = $urlwithroot.'/expensereport/card.php?id='.$object->id; $message = $langs->transnoentities("ExpenseReportPaidMessage", $object->ref, $destinataire->getFullName($langs), $expediteur->getFullName($langs), $link); - + // CONTENT $message = "Bonjour {$destinataire->firstname},\n\n"; $message.= "Votre note de frais \"{$object->ref}\" vient d'être payée.\n"; $message.= "- Payeur : {$expediteur->firstname} {$expediteur->lastname}\n"; $message.= "- Lien : {$dolibarr_main_url_root}/expensereport/card.php?id={$object->id}\n\n"; $message.= "Bien cordialement,\n' SI"; - + // Generate pdf before attachment $object->setDocModel($user,""); $resultPDF = expensereport_pdf_create($db,$object,'',"",$langs); - + // PREPARE SEND $mailfile = new CMailFile($subject,$emailTo,$emailFrom,$message,$filedir,$mimetype,$filename); - + if ($mailfile) { // SEND @@ -1055,45 +1058,44 @@ if (empty($reshook)) if ($action == "addline" && $user->rights->expensereport->creer) { $error = 0; - + $db->begin(); - + $object_ligne = new ExpenseReportLine($db); - + $vatrate = GETPOST('vatrate'); $object_ligne->comments = GETPOST('comments'); $qty = GETPOST('qty','int'); if (empty($qty)) $qty=1; $object_ligne->qty = $qty; - + $up=price2num(GETPOST('value_unit'),'MU'); $object_ligne->value_unit = $up; - + $object_ligne->date = $date; - + $object_ligne->fk_c_type_fees = GETPOST('fk_c_type_fees'); - + // if VAT is not used in Dolibarr, set VAT rate to 0 because VAT rate is necessary. if (empty($vatrate)) $vatrate = "0.000"; $object_ligne->vatrate = price2num($vatrate); - + $object_ligne->fk_projet = $fk_projet; - - + if (! GETPOST('fk_c_type_fees') > 0) { $error++; setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Type")), null, 'errors'); $action=''; } - + if ($vatrate < 0 || $vatrate == '') { $error++; setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("VAT")), null, 'errors'); $action=''; } - + /* Projects are never required. To force them, check module forceproject if ($conf->projet->enabled) { @@ -1103,7 +1105,7 @@ if (empty($reshook)) setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Project")), null, 'errors'); } }*/ - + // Si aucune date n'est rentrée if (empty($object_ligne->date) || $object_ligne->date=="--") { @@ -1116,21 +1118,21 @@ if (empty($reshook)) $error++; setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("PriceUTTC")), null, 'errors'); } - + // S'il y'a eu au moins une erreur if (! $error) { $object_ligne->fk_expensereport = $_POST['fk_expensereport']; - + $type = 0; // TODO What if service ? $seller = ''; // seller is unknown $tmp = calcul_price_total($qty, $up, 0, $vatrate, 0, 0, 0, 'TTC', 0, $type, $seller); - + $object_ligne->vatrate = price2num($vatrate); $object_ligne->total_ttc = $tmp[2]; $object_ligne->total_ht = $tmp[0]; $object_ligne->total_tva = $tmp[1]; - + $result = $object_ligne->insert(); if ($result > 0) { @@ -1144,10 +1146,10 @@ if (empty($reshook)) $db->rollback(); } } - + $action=''; } - + if ($action == 'confirm_delete_line' && GETPOST("confirm") == "yes" && $user->rights->expensereport->creer) { $object = new ExpenseReport($db); @@ -1157,7 +1159,7 @@ if (empty($reshook)) $object_ligne->fetch(GETPOST("rowid")); $total_ht = $object_ligne->total_ht; $total_tva = $object_ligne->total_tva; - + $result=$object->deleteline(GETPOST("rowid"), $user); if ($result >= 0) { @@ -1190,12 +1192,12 @@ if (empty($reshook)) setEventMessages($object->error, $object->errors, 'errors'); } } - + if ($action == "updateligne" && $user->rights->expensereport->creer) { $object = new ExpenseReport($db); $object->fetch($id); - + $rowid = $_POST['rowid']; $type_fees_id = GETPOST('fk_c_type_fees'); $projet_id = $fk_projet; @@ -1207,7 +1209,7 @@ if (empty($reshook)) // if VAT is not used in Dolibarr, set VAT rate to 0 because VAT rate is necessary. if (empty($vatrate)) $vatrate = "0.000"; $vatrate = price2num($vatrate); - + if (! GETPOST('fk_c_type_fees') > 0) { $error++; @@ -1220,7 +1222,7 @@ if (empty($reshook)) setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Vat")), null, 'errors'); $action=''; } - + if (! $error) { // TODO Use update method of ExpenseReportLine @@ -1258,7 +1260,7 @@ if (empty($reshook)) } } } - + // Actions to build doc $upload_dir = $conf->expensereport->dir_output; $permissioncreate = $user->rights->expensereport->creer; @@ -1278,6 +1280,8 @@ $form = new Form($db); $formfile = new FormFile($db); $formproject = new FormProjets($db); $projecttmp = new Project($db); +$paymentexpensereportstatic=new PaymentExpenseReport($db); +$bankaccountstatic = new Account($db); // Create if ($action == 'create') @@ -1320,7 +1324,7 @@ if ($action == 'create') print $s; print ''; print ''; - + print ''; print ''.$langs->trans("VALIDATOR").''; print ''; @@ -1376,7 +1380,7 @@ if ($action == 'create') if (empty($reshook) && ! empty($extrafields->attribute_label)) { print $object->showOptionals($extrafields, 'edit'); } - + print ''; print ''; @@ -1447,7 +1451,7 @@ else $userfee->fetch($object->fk_user_author); print $userfee->getNomUrl(-1); print ''; - + // Ref print ''.$langs->trans("Ref").''; print $form->showrefnav($object, 'ref', $linkback, 1, 'ref', 'ref', ''); @@ -1542,7 +1546,7 @@ else // Paiement incomplet. On demande si motif = escompte ou autre $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('CloneExpenseReport'), $langs->trans('ConfirmCloneExpenseReport', $object->ref), 'confirm_clone', $formquestion, 'yes', 1); } - + if ($action == 'save') { $formconfirm=$form->form_confirm($_SERVER["PHP_SELF"]."?id=".$id,$langs->trans("SaveTrip"),$langs->trans("ConfirmSaveTrip"),"confirm_validate","","",1); @@ -1592,13 +1596,10 @@ else // Print form confirm print $formconfirm; - - + // Expense report card - $linkback = ''.$langs->trans("BackToList").''; - - + $morehtmlref='
        '; /* // Ref customer @@ -1639,15 +1640,13 @@ else } }*/ $morehtmlref.='
        '; - - + dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref); - - + print '
        '; print '
        '; print '
        '; - + print ''; // Author @@ -1662,7 +1661,7 @@ else print $userauthor->getNomUrl(-1); } print ''; - + print ''; print ''; print ''; } - // Amount - print ''; - print ''; - print ''; - $rowspan = 5; - if ($object->fk_statut < 3) $rowspan++; - elseif($object->fk_statut == 4) $rowspan+=2; - else $rowspan+=2; - if ($object->fk_statut==99 || !empty($object->detail_refuse)) $rowspan+=2; - if($object->fk_statut==6) $rowspan+=2; - print ""; - print ''; - - print ''; - print ''; - print ''; - print ''; - - print ''; - print ''; - print ''; - print ''; - // Validation date print ''; print ''; @@ -1740,7 +1716,7 @@ else print $userfee->getNomUrl(-1); } print ''; - + print ''; print ''; print ''; @@ -1762,7 +1738,7 @@ else print $userapp->getNomUrl(-1); } print ''; - + print ''; print ''; print ''; @@ -1778,7 +1754,7 @@ else $userfee->fetch($object->fk_user_refuse); print $userfee->getNomUrl(-1); print ''; - + print ''; print ''; print '
        '.$langs->trans("Period").''; @@ -1677,29 +1676,6 @@ else print '
        '.$langs->trans("AmountHT").''.price($object->total_ht).'
        '.$langs->trans("AmountVAT").''.price($object->total_tva).'
        '.$langs->trans("AmountTTC").''.price($object->total_ttc).'
        '.$langs->trans("DATE_SAVE").'
        '.$langs->trans("MOTIF_CANCEL").''.$object->detail_cancel.'
        '.$langs->trans("DateApprove").''.dol_print_date($object->date_approve,'dayhour').'
        '.$langs->trans("DATE_REFUS").''.dol_print_date($object->date_refuse,'dayhour'); @@ -1805,67 +1781,130 @@ else } // Other attributes - $cols = 3; + $cols = 2; include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php'; - + print '
        '; print '
        '; print '
        '; print '
        '; - //print '
        '; - - // List of payments - $sql = "SELECT p.rowid, p.num_payment, p.datep as dp, p.amount,"; - $sql.= "c.code as type_code,c.libelle as payment_type"; - $sql.= " FROM ".MAIN_DB_PREFIX."payment_expensereport as p"; + print '
        '; + + print ''; + + // Amount + print ''; + print ''; + print ''; + $rowspan = 5; + if ($object->fk_statut < 3) $rowspan++; + elseif($object->fk_statut == 4) $rowspan+=2; + else $rowspan+=2; + if ($object->fk_statut==99 || !empty($object->detail_refuse)) $rowspan+=2; + if($object->fk_statut==6) $rowspan+=2; + print ""; + print ''; + + print ''; + print ''; + print ''; + print ''; + + print ''; + print ''; + print ''; + print ''; + + // List of payments already done + $nbcols = 3; + if (! empty($conf->banque->enabled)) { + $nbrows ++; + $nbcols ++; + } + + print '
        '.$langs->trans("AmountHT").''.price($object->total_ht, 1, '', 1, - 1, - 1, $conf->currency).'
        '.$langs->trans("AmountVAT").''.price($object->total_tva, 1, '', 1, - 1, - 1, $conf->currency).'
        '.$langs->trans("AmountTTC").''.price($object->total_ttc, 1, '', 1, - 1, - 1, $conf->currency).'
        '; + + print ''; + print ''; + print ''; + print ''; + if (! empty($conf->banque->enabled)) { + print ''; + } + print ''; + print ''; + print ''; + + // Payments already done (from payment on this expensereport) + $sql = "SELECT p.rowid, p.num_payment, p.datep as dp, p.amount, p.fk_bank,"; + $sql.= "c.code as p_code, c.libelle as payment_type,"; + $sql.= "ba.rowid as baid, ba.ref as baref, ba.label, ba.number as banumber, ba.account_number, ba.fk_accountancy_journal"; + $sql.= " FROM ".MAIN_DB_PREFIX."expensereport as e"; $sql.= ", ".MAIN_DB_PREFIX."c_paiement as c "; - $sql.= ", ".MAIN_DB_PREFIX."expensereport as e"; + $sql.= ", ".MAIN_DB_PREFIX."payment_expensereport as p"; + $sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'bank as b ON p.fk_bank = b.rowid'; + $sql .= ' LEFT JOIN ' . MAIN_DB_PREFIX . 'bank_account as ba ON b.fk_account = ba.rowid'; $sql.= " WHERE e.rowid = '".$id."'"; $sql.= " AND p.fk_expensereport = e.rowid"; $sql.= " AND e.entity = ".$conf->entity; $sql.= " AND p.fk_typepayment = c.id"; $sql.= " ORDER BY dp"; - + $resql = $db->query($sql); if ($resql) { $num = $db->num_rows($resql); $i = 0; $total = 0; - print '
        ' . $langs->trans('Payments') . '' . $langs->trans('Date') . '' . $langs->trans('Type') . '' . $langs->trans('BankAccount') . '' . $langs->trans('Amount') . ' 
        '; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - - $var=True; while ($i < $num) { $objp = $db->fetch_object($resql); - - print "'; + + print ''; print '\n"; - $labeltype=$langs->trans("PaymentType".$objp->type_code)!=("PaymentType".$objp->type_code)?$langs->trans("PaymentType".$objp->type_code):$objp->fk_typepayment; + $labeltype=$langs->trans("PaymentType".$objp->p_code)!=("PaymentType".$objp->p_code)?$langs->trans("PaymentType".$objp->p_code):$objp->fk_typepayment; print "\n"; - print '\n"; + if (! empty($conf->banque->enabled)) { + $bankaccountstatic->id = $objp->baid; + $bankaccountstatic->ref = $objp->baref; + $bankaccountstatic->label = $objp->baref; + $bankaccountstatic->number = $objp->banumber; + + if (! empty($conf->accounting->enabled)) { + $bankaccountstatic->account_number = $objp->account_number; + + $accountingjournal = new AccountingJournal($db); + $accountingjournal->fetch($objp->fk_accountancy_journal); + $bankaccountstatic->accountancy_journal = $accountingjournal->getNomUrl(0,1,1,'',1); + } + + print ''; + } + print '"; print ""; $totalpaid += $objp->amount; $i++; } - + if ($object->paid == 0) { - print "\n"; - print "\n"; + print ''; + print ''; $remaintopay = $object->total_ttc - $totalpaid; - print ""; - print '\n"; + print ''; + print ''; } print "
        '.$langs->trans("RefPayment").''.$langs->trans("Date").''.$langs->trans("Type").''.$langs->trans("Amount").' 
        "; - print ''.img_object($langs->trans("Payment"),"payment").' '.$objp->rowid.'
        '; + $paymentexpensereportstatic->id = $objp->rowid; + $paymentexpensereportstatic->datepaye = $db->jdate($objp->dp); + $paymentexpensereportstatic->ref = $objp->rowid; + $paymentexpensereportstatic->num_paiement = $objp->num_paiement; + $paymentexpensereportstatic->payment_code = $objp->payment_code; + print $paymentexpensereportstatic->getNomUrl(1); + print ''.dol_print_date($db->jdate($objp->dp),'day')."".$labeltype.' '.$objp->num_payment."'.price($objp->amount)." ".$langs->trans("Currency".$conf->currency)."'; + if ($bankaccountstatic->id) + print $bankaccountstatic->getNomUrl(1, 'transactions'); + print ''.price($objp->amount)."
        ".$langs->trans("AlreadyPaid")." :".price($totalpaid)."
        ".$langs->trans("AmountExpected")." :".price($object->total_ttc)."
        '.$langs->trans("AlreadyPaid").':'.price($totalpaid).'
        '.$langs->trans("AmountExpected").':'.price($object->total_ttc).'
        ".$langs->trans("RemainderToPay")." :'.price($remaintopay)."
        '.$langs->trans("RemainderToPay").':'.price($remaintopay).'
        "; $db->free($resql); @@ -1873,15 +1912,13 @@ else else { dol_print_error($db); - } - + } + print '
        '; print '
        '; print '
        '; - + print '

        '; - - print '
        '; // Fetch Lines of current expense report $sql = 'SELECT fde.rowid, fde.fk_expensereport, fde.fk_c_type_fees, fde.fk_projet, fde.date,'; @@ -1898,18 +1935,17 @@ else $actiontouse='updateligne'; if (($object->fk_statut==0 || $object->fk_statut==99) && $action != 'editline') $actiontouse='addline'; - + print '
        '; print ''; print ''; print ''; print ''; - - + print '
        '; print ''; - - $resql = $db->query($sql); + + $resql = $db->query($sql); if ($resql) { $num_lignes = $db->num_rows($resql); @@ -1989,7 +2025,7 @@ else print ''; } - + print ''; } @@ -2042,7 +2078,7 @@ else print ''; print ''; } - + print ''; print ''; - + print ''; print ''; - + // Select date print ''; + print ''; } - + // Select type print '"; if ($val['soclib'] == '') { - print ""; + print ""; } else { - print ""; + print ""; } print ""; print ""; From d03d179fa31baa67c32709e5f2d3eadc3906e309 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 28 May 2017 23:43:24 +0200 Subject: [PATCH 277/299] FIX Fullname when member is a moral entity with no name. --- htdocs/core/class/commonobject.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 868ec97d349..529bb20a89b 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -397,8 +397,8 @@ abstract class CommonObject //print "lastname=".$this->lastname." name=".$this->name." nom=".$this->nom."
        \n"; $lastname=$this->lastname; $firstname=$this->firstname; - if (empty($lastname)) $lastname=(isset($this->lastname)?$this->lastname:(isset($this->name)?$this->name:(isset($this->nom)?$this->nom:''))); - + if (empty($lastname)) $lastname=(isset($this->lastname)?$this->lastname:(isset($this->name)?$this->name:(isset($this->nom)?$this->nom:(isset($this->societe)?$this->societe:(isset($this->company)?$this->company:''))))); + $ret=''; if ($option && $this->civility_id) { From d0f01085d882f497f25ed039a0e93b167b179952 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 29 May 2017 02:44:14 +0200 Subject: [PATCH 278/299] Add more information on stripe payment --- htdocs/public/stripe/newpayment.php | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/htdocs/public/stripe/newpayment.php b/htdocs/public/stripe/newpayment.php index a430baafb59..01ae19c7032 100644 --- a/htdocs/public/stripe/newpayment.php +++ b/htdocs/public/stripe/newpayment.php @@ -181,6 +181,13 @@ if (! empty($conf->global->STRIPE_SECURITY_TOKEN)) } } +// Common variables +$creditor=$mysoc->name; +$paramcreditor='STRIPE_CREDITOR_'.$suffix; +if (! empty($conf->global->$paramcreditor)) $creditor=$conf->global->$paramcreditor; +else if (! empty($conf->global->STRIPE_CREDITOR)) $creditor=$conf->global->STRIPE_CREDITOR; + + /* * Actions @@ -218,17 +225,20 @@ if ($action == 'charge') dol_syslog("Create customer", LOG_DEBUG, 0, '_stripe'); $customer = \Stripe\Customer::create(array( 'email' => $email, - 'card' => $stripeToken - // TODO + 'description' => ($email?'Customer for '.$email:null), + 'metadata' => array('ipaddress'=>$_SERVER['REMOTE_ADDR']), + 'source' => $stripeToken // source can be a token OR array('object'=>'card', 'exp_month'=>xx, 'exp_year'=>xxxx, 'number'=>xxxxxxx, 'cvc'=>xxx, 'name'=>'Cardholder's full name', zip ?) )); - + // TODO Add 'business_vat_id' ? + dol_syslog("Create charge", LOG_DEBUG, 0, '_stripe'); $charge = \Stripe\Charge::create(array( 'customer' => $customer->id, 'amount' => price2num($amount, 'MU'), 'currency' => $currency, 'description' => 'Stripe payment: '.$FULLTAG, - 'statement_descriptor' => dol_trunc(dol_trunc(dol_string_unaccent($mysoc->name), 6, 'right', 'UTF-8', 1).' '.$FULLTAG, 22, 'right', 'UTF-8', 1) // 22 chars + 'metadata' => array("FULLTAG" => $FULLTAG, 'Recipient' => $mysoc->name), + 'statement_descriptor' => dol_trunc(dol_trunc(dol_string_unaccent($mysoc->name), 6, 'right', 'UTF-8', 1).' '.$FULLTAG, 22, 'right', 'UTF-8', 1) // 22 chars that appears on bank receipt )); } catch(\Stripe\Error\Card $e) { // Since it's a decline, \Stripe\Error\Card will be caught @@ -330,12 +340,6 @@ if (empty($conf->global->STRIPE_LIVE)) dol_htmloutput_mesg($langs->trans('YouAreCurrentlyInSandboxMode'),'','warning'); } -// Common variables -$creditor=$mysoc->name; -$paramcreditor='STRIPE_CREDITOR_'.$suffix; -if (! empty($conf->global->$paramcreditor)) $creditor=$conf->global->$paramcreditor; -else if (! empty($conf->global->STRIPE_CREDITOR)) $creditor=$conf->global->STRIPE_CREDITOR; - print ''."\n"; print '
        '."\n"; print '
        '."\n"; From dad1abd55b4805bce9ab9fe7bf41ad57efba8b7d Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Mon, 29 May 2017 06:22:21 +0200 Subject: [PATCH 279/299] NEW : Move employee in dol_banner in salaries --- htdocs/compta/salaries/card.php | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/htdocs/compta/salaries/card.php b/htdocs/compta/salaries/card.php index 0ea91dc2857..63b5139ce29 100644 --- a/htdocs/compta/salaries/card.php +++ b/htdocs/compta/salaries/card.php @@ -1,5 +1,5 @@ +/* Copyright (C) 2011-2017 Alexandre Spangaro * Copyright (C) 2014 Laurent Destailleur * Copyright (C) 2015 Jean-François Ferry * Copyright (C) 2015 Charlie BENKE @@ -331,23 +331,24 @@ if ($id) dol_fiche_head($head, 'card', $langs->trans("SalaryPayment"), -1, 'payment'); $linkback = ''.$langs->trans("BackToList").''; - - dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', ''); - + + $morehtmlref='
        '; + + $userstatic=new User($db); + $userstatic->fetch($object->fk_user); + + $morehtmlref.=$langs->trans('Employee') . ' : ' . $userstatic->getNomUrl(1); + $morehtmlref.='
        '; + + dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', ''); + print '
        '; print '
        '; print '
        '.$langs->trans('AmountHT').''.$langs->trans('AmountTTC').''; print ''; print ''; @@ -2078,11 +2114,11 @@ else print '
        '; $form->select_date($date?$date:-1,'date'); @@ -2091,11 +2127,11 @@ else // Select project if (! empty($conf->projet->enabled)) { - print ''; - $formproject->select_projects(-1, $fk_projet, 'fk_projet', 0, 0, 1, 1); - print ''; + $formproject->select_projects(-1, $fk_projet, 'fk_projet', 0, 0, 1, 1); + print ''; select_type_fees_id($fk_c_type_fees,'fk_c_type_fees',1); @@ -2249,7 +2285,7 @@ if ($action != 'create' && $action != 'edit') } } - + // If status is Appoved // -------------------- @@ -2257,7 +2293,7 @@ if ($action != 'create' && $action != 'edit') { print ''; } - + // If bank module is used if ($user->rights->expensereport->to_paid && ! empty($conf->banque->enabled) && $object->fk_statut == 5) { @@ -2272,7 +2308,7 @@ if ($action != 'create' && $action != 'edit') } } - // If bank module is not used + // If bank module is not used if (($user->rights->expensereport->to_paid || empty($conf->banque->enabled)) && $object->fk_statut == 5) { //if ((round($remaintopay) == 0 || empty($conf->banque->enabled)) && $object->paid == 0) From c4f09b889414a59cb8b116bc1d59d1aaed6c9721 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 28 May 2017 14:43:17 +0200 Subject: [PATCH 274/299] Work on modulebuilder --- dev/translation/sanity_check_en_langfiles.php | 2 + htdocs/admin/triggers.php | 1 - htdocs/core/class/interfaces.class.php | 11 +- htdocs/core/lib/files.lib.php | 65 ++-- htdocs/langs/en_US/modulebuilder.lang | 10 +- htdocs/modulebuilder/index.php | 287 ++++++++++++++---- .../{skeletons => oldskeletons}/.gitignore | 0 .../{skeletons => oldskeletons}/README | 0 .../build_api_class.php | 0 .../build_class_from_table.php | 0 .../build_webservice_from_class.php | 0 .../modMyModule.class.php | 0 .../skeleton_api_class.class.php | 0 .../skeleton_card.php | 0 .../skeleton_class.class.php | 0 .../skeleton_list.php | 0 .../skeleton_script.php | 0 .../skeleton_webservice_server.php | 0 .../core/modules/modMyModule.class.php | 29 +- ...99_modMyModule_MyModuleTriggers.class.php} | 4 +- .../modulebuilder/template/modulebuilder.txt | 2 +- .../modulebuilder/template/myobject_card.php | 2 +- .../modulebuilder/template/myobject_list.php | 2 +- 23 files changed, 306 insertions(+), 109 deletions(-) rename htdocs/modulebuilder/{skeletons => oldskeletons}/.gitignore (100%) rename htdocs/modulebuilder/{skeletons => oldskeletons}/README (100%) rename htdocs/modulebuilder/{skeletons => oldskeletons}/build_api_class.php (100%) rename htdocs/modulebuilder/{skeletons => oldskeletons}/build_class_from_table.php (100%) rename htdocs/modulebuilder/{skeletons => oldskeletons}/build_webservice_from_class.php (100%) rename htdocs/modulebuilder/{skeletons => oldskeletons}/modMyModule.class.php (100%) rename htdocs/modulebuilder/{skeletons => oldskeletons}/skeleton_api_class.class.php (100%) rename htdocs/modulebuilder/{skeletons => oldskeletons}/skeleton_card.php (100%) rename htdocs/modulebuilder/{skeletons => oldskeletons}/skeleton_class.class.php (100%) rename htdocs/modulebuilder/{skeletons => oldskeletons}/skeleton_list.php (100%) rename htdocs/modulebuilder/{skeletons => oldskeletons}/skeleton_script.php (100%) rename htdocs/modulebuilder/{skeletons => oldskeletons}/skeleton_webservice_server.php (100%) rename htdocs/modulebuilder/template/core/triggers/{interface_99_modMyModule_Triggers.class.php => interface_99_modMyModule_MyModuleTriggers.class.php} (99%) diff --git a/dev/translation/sanity_check_en_langfiles.php b/dev/translation/sanity_check_en_langfiles.php index bb3430eb22c..9136c192739 100755 --- a/dev/translation/sanity_check_en_langfiles.php +++ b/dev/translation/sanity_check_en_langfiles.php @@ -310,6 +310,8 @@ if ((! empty($_REQUEST['unused']) && $_REQUEST['unused'] == 'true') || (isset($a if (preg_match('/^.*Bytes$/', $value)) $qualifiedforclean=0; if (preg_match('/^NoteSomeFeaturesAreDisabled/', $value)) $qualifiedforclean=0; if (preg_match('/^(DoTest|Under|Limits|Cards|CurrentValue|DateLimit|DateAndHour|NbOfLines|NbOfObjects|NbOfReferes|TotalTTCShort|VATs)/', $value)) $qualifiedforclean=0; + // modulebuilder + if (preg_match('/^ModuleBuilderDesc/', $value)) $qualifiedforclean=0; // orders if (preg_match('/^OrderSource/', $value)) $qualifiedforclean=0; if (preg_match('/^TypeContact_/', $value)) $qualifiedforclean=0; diff --git a/htdocs/admin/triggers.php b/htdocs/admin/triggers.php index 0aae9c6915e..0dddfb3c4af 100644 --- a/htdocs/admin/triggers.php +++ b/htdocs/admin/triggers.php @@ -47,7 +47,6 @@ print load_fiche_titre($langs->trans("TriggersAvailable"),'','title_setup'); print $langs->trans("TriggersDesc")."
        "; print "
        \n"; -$template_dir = DOL_DOCUMENT_ROOT.'/core/tpl/'; $interfaces = new Interfaces($db); $triggers = $interfaces->getTriggersList(); diff --git a/htdocs/core/class/interfaces.class.php b/htdocs/core/class/interfaces.class.php index 87ae81db856..cd4a56f4174 100644 --- a/htdocs/core/class/interfaces.class.php +++ b/htdocs/core/class/interfaces.class.php @@ -226,9 +226,10 @@ class Interfaces * Return list of triggers. Function used by admin page htdoc/admin/triggers. * List is sorted by trigger filename so by priority to run. * - * @return array Array list of triggers + * @param array $forcedirtriggers null=All default directories. This parameter is used by modulebuilder module only. + * @return array Array list of triggers */ - function getTriggersList() + function getTriggersList($forcedirtriggers=null) { global $conf, $langs; @@ -241,11 +242,15 @@ class Interfaces $i = 0; $dirtriggers=array_merge(array('/core/triggers/'),$conf->modules_parts['triggers']); + if (is_array($forcedirtriggers)) + { + $dirtriggers=$forcedirtriggers; + } + foreach($dirtriggers as $reldir) { $dir=dol_buildpath($reldir,0); $newdir=dol_osencode($dir); - //print "xx".$dir;exit; // Check if directory exists (we do not use dol_is_dir to avoid loading files.lib.php at each call) if (! is_dir($newdir)) continue; diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 2d5b8d2f6db..ad800708522 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -448,14 +448,15 @@ function dol_filemtime($pathoffile) * @param array $arrayreplacement Array with strings to replace * @param string $destfile Destination file (can't be a directory). If empty, will be same than source file. * @param int $newmask Mask for new file (0 by default means $conf->global->MAIN_UMASK). Example: '0666' + * @param int $indexdatabase Index new file into database. * @return int <0 if error, 0 if nothing done (dest file already exists), >0 if OK * @see dolCopyr */ -function dolReplaceInFile($srcfile, $arrayreplacement, $destfile='', $newmask=0) +function dolReplaceInFile($srcfile, $arrayreplacement, $destfile='', $newmask=0, $indexdatabase=0) { global $conf; - dol_syslog("files.lib.php::dolReplaceInFile srcfile=".$srcfile." destfile=".$destfile." newmask=".$newmask); + dol_syslog("files.lib.php::dolReplaceInFile srcfile=".$srcfile." destfile=".$destfile." newmask=".$newmask." indexdatabase=".$indexdatabase); if (empty($srcfile)) return -1; if (empty($destfile)) $destfile=$srcfile; @@ -484,12 +485,15 @@ function dolReplaceInFile($srcfile, $arrayreplacement, $destfile='', $newmask=0) dol_delete_file($tmpdestfile); // Create $newpathoftmpdestfile from $newpathofsrcfile + $content=file_get_contents($newpathofsrcfile, 'r'); + $content = make_substitutions($content, $arrayreplacement, null); - + file_put_contents($newpathoftmpdestfile, $content); + @chmod($newpathoftmpdestfile, octdec($newmask)); // Rename - $result=dol_move($newpathoftmpdestfile, $newpathofdestfile, $newmask, (($destfile == $srcfile)?1:0)); + $result=dol_move($newpathoftmpdestfile, $newpathofdestfile, $newmask, (($destfile == $srcfile)?1:0), 0, $indexdatabase); if (! $result) { dol_syslog("files.lib.php::dolReplaceInFile failed to move tmp file to final dest", LOG_WARNING); @@ -569,10 +573,11 @@ function dol_copy($srcfile, $destfile, $newmask=0, $overwriteifexists=1) * @param string $destfile Destination file (a directory) * @param int $newmask Mask for new file (0 by default means $conf->global->MAIN_UMASK). Example: '0666' * @param int $overwriteifexists Overwrite file if exists (1 by default) - * @return int <0 if error, 0 if nothing done (dest dir already exists and overwriteifexists=0), >0 if OK + * @param array $arrayreplacement Array to use to replace filenames with another one during the copy (works only on file names, not on directory names). + * @return int <0 if error, 0 if nothing done (all files already exists and overwriteifexists=0), >0 if OK * @see dol_copy */ -function dolCopyDir($srcfile, $destfile, $newmask, $overwriteifexists) +function dolCopyDir($srcfile, $destfile, $newmask, $overwriteifexists, $arrayreplacement=null) { global $conf; @@ -583,7 +588,7 @@ function dolCopyDir($srcfile, $destfile, $newmask, $overwriteifexists) if (empty($srcfile) || empty($destfile)) return -1; $destexists=dol_is_dir($destfile); - if (! $overwriteifexists && $destexists) return 0; + //if (! $overwriteifexists && $destexists) return 0; // The overwriteifexists is for files only, so propaated to dol_copy only. if (! $destexists) { @@ -592,37 +597,37 @@ function dolCopyDir($srcfile, $destfile, $newmask, $overwriteifexists) $dirmaskdec=octdec($newmask); if (empty($newmask) && ! empty($conf->global->MAIN_UMASK)) $dirmaskdec=octdec($conf->global->MAIN_UMASK); $dirmaskdec |= octdec('0200'); // Set w bit required to be able to create content for recursive subdirs files - dol_mkdir($destfile."/".$file, '', decoct($dirmaskdec)); + dol_mkdir($destfile, '', decoct($dirmaskdec)); } - $srcfile=dol_osencode($srcfile); - $destfile=dol_osencode($destfile); + $ossrcfile=dol_osencode($srcfile); + $osdestfile=dol_osencode($destfile); - // recursive function to copy - // all subdirectories and contents: - if (is_dir($srcfile)) + // Recursive function to copy all subdirectories and contents: + if (is_dir($ossrcfile)) { - $dir_handle=opendir($srcfile); + $dir_handle=opendir($ossrcfile); while ($file=readdir($dir_handle)) { if ($file!="." && $file!="..") { - if (is_dir($srcfile."/".$file)) + if (is_dir($ossrcfile."/".$file)) { - if (!is_dir($destfile."/".$file)) - { - // We must set mask just before creating dir, becaause it can be set differently by dol_copy - umask(0); - $dirmaskdec=octdec($newmask); - if (empty($newmask) && ! empty($conf->global->MAIN_UMASK)) $dirmaskdec=octdec($conf->global->MAIN_UMASK); - $dirmaskdec |= octdec('0200'); // Set w bit required to be able to create content for recursive subdirs files - dol_mkdir($destfile."/".$file, '', decoct($dirmaskdec)); - } - $tmpresult=dolCopyDir($srcfile."/".$file, $destfile."/".$file, $newmask, $overwriteifexists); + //var_dump("xxx dolCopyDir $srcfile/$file, $destfile/$file, $newmask, $overwriteifexists"); + $tmpresult=dolCopyDir($srcfile."/".$file, $destfile."/".$file, $newmask, $overwriteifexists, $arrayreplacement); } else { - $tmpresult=dol_copy($srcfile."/".$file, $destfile."/".$file, $newmask, $overwriteifexists); + $newfile = $file; + // Replace destination filename with a new one + if (is_array($arrayreplacement)) + { + foreach($arrayreplacement as $key => $val) + { + $newfile = str_replace($key, $val, $newfile); + } + } + $tmpresult=dol_copy($srcfile."/".$file, $destfile."/".$newfile, $newmask, $overwriteifexists); } // Set result if ($result > 0 && $tmpresult >= 0) @@ -641,7 +646,8 @@ function dolCopyDir($srcfile, $destfile, $newmask, $overwriteifexists) } else { - $result=dol_copy($srcfile, $destfile, $newmask, $overwriteifexists); + // Source directory does not exists + $result = -2; } return $result; @@ -660,10 +666,11 @@ function dolCopyDir($srcfile, $destfile, $newmask, $overwriteifexists) * @param integer $newmask Mask in octal string for new file (0 by default means $conf->global->MAIN_UMASK) * @param int $overwriteifexists Overwrite file if exists (1 by default) * @param int $testvirus Do an antivirus test. Move is canceled if a virus is found. + * @param int $indexdatabase Index new file into database. * @return boolean True if OK, false if KO * @see dol_move_uploaded_file */ -function dol_move($srcfile, $destfile, $newmask=0, $overwriteifexists=1, $testvirus=0) +function dol_move($srcfile, $destfile, $newmask=0, $overwriteifexists=1, $testvirus=0, $indexdatabase=1) { global $user, $db, $conf; $result=false; @@ -709,7 +716,7 @@ function dol_move($srcfile, $destfile, $newmask=0, $overwriteifexists=1, $testvi } // Move ok - if ($result) + if ($result && $indexdatabase) { // Rename entry into ecm database $rel_filetorenamebefore = preg_replace('/^'.preg_quote(DOL_DATA_ROOT,'/').'/', '', $srcfile); diff --git a/htdocs/langs/en_US/modulebuilder.lang b/htdocs/langs/en_US/modulebuilder.lang index de0c2fc216a..7336a020fa6 100644 --- a/htdocs/langs/en_US/modulebuilder.lang +++ b/htdocs/langs/en_US/modulebuilder.lang @@ -6,4 +6,12 @@ ModuleBuilderDesc3=Generated/editable modules found: %s (they a NewModule=New module ModuleKey=Key for new module ModuleInitialized=Module initialized - +ModuleBuilderDescdescription=Enter here all general information that describe your module +ModuleBuilderDescobjects=Define here the new objects you want to manage with our module. A page to list them and a page to create/edit/view a card will be generated. +ModuleBuilderDescmenus=This tab is dedicated to define menu entries provided by your module. +ModuleBuilderDescpermissions=This tab is dedicated to define the new permissions you want to provide with our module. +ModuleBuilderDesctriggers=This is the view of triggers provided by your module. To include code executed when a triggered business event is launched, just edit this file with your IDE. +ModuleBuilderDescbuildpackage=You can generate here a "ready to distribute" package file (a normalized .zip file) of your module. Just click on button to get your module package file. +BuildPackage=Build package +ModuleIsNotActive=This module was not activated yet (go into Home-Setup-Module to make it live) +ModuleIsLive=This module has been activated. Any change on it may break a current active feature. \ No newline at end of file diff --git a/htdocs/modulebuilder/index.php b/htdocs/modulebuilder/index.php index a033bd1be23..e11ff31a303 100644 --- a/htdocs/modulebuilder/index.php +++ b/htdocs/modulebuilder/index.php @@ -29,9 +29,10 @@ $langs->load("admin"); $langs->load("modulebuilder"); $langs->load("other"); -$action=GETPOST('action','alpha'); +$action=GETPOST('action','aZ09'); $confirm=GETPOST('confirm','alpha'); -$module=GETPOST('module'); +$module=GETPOST('module','alpha'); +$tab=GETPOST('tab','aZ09'); if (empty($module)) $module='initmodule'; if (empty($tab)) $tab='description'; @@ -56,30 +57,36 @@ $FILEFLAG='modulebuilder.txt'; if ($dircustom && $action == 'initmodule' && $modulename) { $srcdir = DOL_DOCUMENT_ROOT.'/modulebuilder/template'; - $destdir = $dircustom.'/'.$modulename; + $destdir = $dircustom.'/'.strtolower($modulename); $arrayreplacement=array( 'mymodule'=>strtolower($modulename), 'MyModule'=>$modulename ); - $result = dolCopyDir($srcdir, $destdir, 0, 0); + $result = dolCopyDir($srcdir, $destdir, 0, 0, $arrayreplacement); //dol_mkdir($destfile); if ($result <= 0) { - $error++; - $langs->load("errors"); - setEventMessages($langs->trans("ErrorFailToCopyDir", $srcdir, $destdir), null, 'errors'); + if ($result < 0) + { + $error++; + $langs->load("errors"); + setEventMessages($langs->trans("ErrorFailToCopyDir", $srcdir, $destdir), null, 'errors'); + } + else // $result == 0 + { + setEventMessages($langs->trans("AllFilesDidAlreadyExist", $srcdir, $destdir), null, 'warnings'); + } } // Edit PHP files if (! $error) { - $listofphpfilestoedit = dol_dir_list($destdir, 'files', 1, '\.php$', '', 'fullname', SORT_ASC, 0, 1); + $listofphpfilestoedit = dol_dir_list($destdir, 'files', 1, '\.(php|MD|js)$', '', 'fullname', SORT_ASC, 0, 1); foreach($listofphpfilestoedit as $phpfileval) { - var_dump($phpfileval['fullname']); - + //var_dump($phpfileval['fullname']); $arrayreplacement=array( 'mymodule'=>strtolower($modulename), 'MyModule'=>$modulename, @@ -106,6 +113,12 @@ if ($dircustom && $action == 'initmodule' && $modulename) } } +if ($dircustom && $action == 'generatepackage') +{ + $dir = $dircustom.'/'.$modulename; + + +} /* @@ -138,7 +151,16 @@ if (!empty($conf->modulebuilder->enabled) && $mainmenu == 'modulebuilder') // En $fullname = $dircustomcursor['fullname']; if (dol_is_file($fullname.'/'.$FILEFLAG)) { - $listofmodules[$dircustomcursor['name']]=$fullname; + // Get real name of module (MyModule instead of mymodule) + $descriptorfiles = dol_dir_list($fullname.'/core/modules/', 'files', 0, 'mod.*\.class\.php'); + $modulenamewithcase=''; + foreach($descriptorfiles as $descriptorcursor) + { + $modulenamewithcase=preg_replace('/^mod/', '', $descriptorcursor['name']); + $modulenamewithcase=preg_replace('/\.class\.php$/', '', $modulenamewithcase); + } + if ($modulenamewithcase) $listofmodules[$dircustomcursor['name']]=$modulenamewithcase; + //var_dump($listofmodules); } } } @@ -154,11 +176,44 @@ if (!empty($conf->modulebuilder->enabled) && $mainmenu == 'modulebuilder') // En print $langs->trans("ModuleBuilderDesc").'
        '; print $langs->trans("ModuleBuilderDesc2", 'conf/conf.php', $dircustom).'
        '; print $langs->trans("ModuleBuilderDesc3", count($listofmodules), $FILEFLAG).'
        '; -print '
        '; - - +//print '
        '; + + +// Load module descriptor +$error=0; +$moduleobj = null; + +if (! empty($module) && $module != 'initmodule') +{ + $modulelowercase=strtolower($module); + + // Load module + dol_include_once($modulelowercase.'/core/modules/mod'.$module.'.class.php'); + $class='mod'.$module; + + if (class_exists($class)) + { + try { + $moduleobj = new $class($db); + } + catch(Exception $e) + { + $error++; + print $e->getMessage(); + } + } + else + { + $error++; + $langs->load("errors"); + print img_warning('').' '.$langs->trans("ErrorFailedToLoadModuleDescriptorForXXX", $module); + } +} + print '
        '; + +// Tabs for all modules $head = array(); $h=0; @@ -167,11 +222,11 @@ $head[$h][1] = $langs->trans("NewModule"); $head[$h][2] = 'initmodule'; $h++; -foreach($listofmodules as $tmpmodule => $fullname) +foreach($listofmodules as $tmpmodule => $tmpmodulewithcase) { - $head[$h][0] = $_SERVER["PHP_SELF"].'?module='.$tmpmodule; - $head[$h][1] = $tmpmodule; - $head[$h][2] = $tmpmodule; + $head[$h][0] = $_SERVER["PHP_SELF"].'?module='.$tmpmodulewithcase; + $head[$h][1] = $tmpmodulewithcase; + $head[$h][2] = $tmpmodulewithcase; $h++; } @@ -195,73 +250,197 @@ if ($module == 'initmodule') } elseif (! empty($module)) { - $error=0; - - // Load module - dol_include_once($module.'/core/modules/mod'.ucfirst($module).'.class.php'); - $class='mod'.ucfirst($module); - if (class_exists($class)) - { - try { - $moduleobj = new $class($db); - } - catch(Exception $e) - { - $error++; - print $e->getMessage(); - } - } - else - { - $error++; - $langs->load("errors"); - print img_warning('').' '.$langs->trans("ErrorFailedToLoadModuleDescriptorForXXX", $module); - } - - // Button to delete module - - // Tabs for module if (! $error) { $head2 = array(); $h=0; - - foreach($listofmodules as $tmpmodule => $fullname) + + $modulestatusinfo=img_info('').' '.$langs->trans("ModuleIsNotActive"); + if (! empty($conf->$module->enabled)) { - $head2[$h][0] = $_SERVER["PHP_SELF"].'?tab=description'; + $modulestatusinfo=img_warning().' '.$langs->trans("ModuleIsLive"); + } + + foreach($listofmodules as $tmpmodule => $tmpmodulewithcase) + { + $head2[$h][0] = $_SERVER["PHP_SELF"].'?tab=description&module='.$tmpmodulewithcase; $head2[$h][1] = $langs->trans("Description"); $head2[$h][2] = 'description'; $h++; - $head2[$h][0] = $_SERVER["PHP_SELF"].'?tab=objects'; + $head2[$h][0] = $_SERVER["PHP_SELF"].'?tab=objects&module='.$tmpmodulewithcase; $head2[$h][1] = $langs->trans("Objects"); $head2[$h][2] = 'objects'; $h++; - $head2[$h][0] = $_SERVER["PHP_SELF"].'?tab='.$tmpmodule; + $head2[$h][0] = $_SERVER["PHP_SELF"].'?tab=menus&module='.$tmpmodulewithcase; $head2[$h][1] = $langs->trans("Menus"); $head2[$h][2] = 'menus'; $h++; - $head2[$h][0] = $_SERVER["PHP_SELF"].'?tab='.$tmpmodule; + $head2[$h][0] = $_SERVER["PHP_SELF"].'?tab=permissions&module='.$tmpmodulewithcase; $head2[$h][1] = $langs->trans("Permissions"); $head2[$h][2] = 'permissions'; $h++; - $head2[$h][0] = $_SERVER["PHP_SELF"].'?tab='.$tmpmodule; + $head2[$h][0] = $_SERVER["PHP_SELF"].'?tab=triggers&module='.$tmpmodulewithcase; $head2[$h][1] = $langs->trans("Triggers"); $head2[$h][2] = 'triggers'; $h++; + + $head2[$h][0] = $_SERVER["PHP_SELF"].'?tab=buildpackage&module='.$tmpmodulewithcase; + $head2[$h][1] = $langs->trans("BuildPackage"); + $head2[$h][2] = 'buildpackage'; + $h++; + } + + print $modulestatusinfo.'

        '; + + dol_fiche_head($head2, $tab, '', -1, ''); + + print $langs->trans("ModuleBuilderDesc".$tab).'

        '; + + if ($tab == 'description') + { + print '
        '; + print '
        '; + + print ''; + print ''; + + print ''; + + print ''; + + print ''; + + print ''; + + print ''; + + print ''; + + print ''; + + print ''; + + print '
        '; + print $langs->trans("Parameter"); + print ''; + print $langs->trans("Value"); + print '
        '; + print $langs->trans("Numero"); + print ''; + print $moduleobj->numero; + print '
        '; + print $langs->trans("Name"); + print ''; + print $moduleobj->getName(); + print '
        '; + print $langs->trans("Version"); + print ''; + print $moduleobj->getVersion(); + print '
        '; + print $langs->trans("Family"); + print "
        'crm','financial','hr','projects','products','ecm','technic','interface','other'"; + print '
        '; + print $moduleobj->family; + print '
        '; + print $langs->trans("EditorName"); + print ''; + print $moduleobj->editor_name; + print '
        '; + print $langs->trans("EditorUrl"); + print ''; + print $moduleobj->editor_url; + print '
        '; + print $langs->trans("Description"); + print ''; + print $moduleobj->getDesc(); + print '
        '; + print $langs->trans("LongDescription"); + print ''; + print $moduleobj->getDescLong(); + print '
        '; + + print '
        '; + + print '

        '; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; } - dol_fiche_head($head2, $tab, '', -1, ''); + if ($tab == 'objects') + { + print $langs->trans("FeatureNotYetAvailable"); + - print $moduleobj->getDescLong(); - + } + if ($tab == 'menus') + { + print $langs->trans("FeatureNotYetAvailable"); + + } + if ($tab == 'permissions') + { + print $langs->trans("FeatureNotYetAvailable"); + + } + + if ($tab == 'triggers') + { + require_once DOL_DOCUMENT_ROOT.'/core/class/interfaces.class.php'; + + $interfaces = new Interfaces($db); + $triggers = $interfaces->getTriggersList(array('/'.strtolower($module).'/core/triggers')); + + print '
        '; + print ' + + + + + + '; + + $var=True; + foreach ($triggers as $trigger) + { + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + } + + print '
        '.$langs->trans("File").''.$langs->trans("Active").' 
        '.$trigger['picto'].''.$trigger['file'].''.$trigger['status'].''; + $text=$trigger['info']; + $text.="
        \n".$langs->trans("File").":
        \n".$trigger['relpath']; + //$text.="\n".$langs->trans("ExternalModule",$trigger['isocreorexternal']); + print $form->textwithpicto('', $text); + print '
        '; + print '
        '; + } + + if ($tab == 'buildpackage') + { + print '
        '; + print ''; + print ''; + print ''; + print ''; + print '
        '; + } dol_fiche_end(); } diff --git a/htdocs/modulebuilder/skeletons/.gitignore b/htdocs/modulebuilder/oldskeletons/.gitignore similarity index 100% rename from htdocs/modulebuilder/skeletons/.gitignore rename to htdocs/modulebuilder/oldskeletons/.gitignore diff --git a/htdocs/modulebuilder/skeletons/README b/htdocs/modulebuilder/oldskeletons/README similarity index 100% rename from htdocs/modulebuilder/skeletons/README rename to htdocs/modulebuilder/oldskeletons/README diff --git a/htdocs/modulebuilder/skeletons/build_api_class.php b/htdocs/modulebuilder/oldskeletons/build_api_class.php similarity index 100% rename from htdocs/modulebuilder/skeletons/build_api_class.php rename to htdocs/modulebuilder/oldskeletons/build_api_class.php diff --git a/htdocs/modulebuilder/skeletons/build_class_from_table.php b/htdocs/modulebuilder/oldskeletons/build_class_from_table.php similarity index 100% rename from htdocs/modulebuilder/skeletons/build_class_from_table.php rename to htdocs/modulebuilder/oldskeletons/build_class_from_table.php diff --git a/htdocs/modulebuilder/skeletons/build_webservice_from_class.php b/htdocs/modulebuilder/oldskeletons/build_webservice_from_class.php similarity index 100% rename from htdocs/modulebuilder/skeletons/build_webservice_from_class.php rename to htdocs/modulebuilder/oldskeletons/build_webservice_from_class.php diff --git a/htdocs/modulebuilder/skeletons/modMyModule.class.php b/htdocs/modulebuilder/oldskeletons/modMyModule.class.php similarity index 100% rename from htdocs/modulebuilder/skeletons/modMyModule.class.php rename to htdocs/modulebuilder/oldskeletons/modMyModule.class.php diff --git a/htdocs/modulebuilder/skeletons/skeleton_api_class.class.php b/htdocs/modulebuilder/oldskeletons/skeleton_api_class.class.php similarity index 100% rename from htdocs/modulebuilder/skeletons/skeleton_api_class.class.php rename to htdocs/modulebuilder/oldskeletons/skeleton_api_class.class.php diff --git a/htdocs/modulebuilder/skeletons/skeleton_card.php b/htdocs/modulebuilder/oldskeletons/skeleton_card.php similarity index 100% rename from htdocs/modulebuilder/skeletons/skeleton_card.php rename to htdocs/modulebuilder/oldskeletons/skeleton_card.php diff --git a/htdocs/modulebuilder/skeletons/skeleton_class.class.php b/htdocs/modulebuilder/oldskeletons/skeleton_class.class.php similarity index 100% rename from htdocs/modulebuilder/skeletons/skeleton_class.class.php rename to htdocs/modulebuilder/oldskeletons/skeleton_class.class.php diff --git a/htdocs/modulebuilder/skeletons/skeleton_list.php b/htdocs/modulebuilder/oldskeletons/skeleton_list.php similarity index 100% rename from htdocs/modulebuilder/skeletons/skeleton_list.php rename to htdocs/modulebuilder/oldskeletons/skeleton_list.php diff --git a/htdocs/modulebuilder/skeletons/skeleton_script.php b/htdocs/modulebuilder/oldskeletons/skeleton_script.php similarity index 100% rename from htdocs/modulebuilder/skeletons/skeleton_script.php rename to htdocs/modulebuilder/oldskeletons/skeleton_script.php diff --git a/htdocs/modulebuilder/skeletons/skeleton_webservice_server.php b/htdocs/modulebuilder/oldskeletons/skeleton_webservice_server.php similarity index 100% rename from htdocs/modulebuilder/skeletons/skeleton_webservice_server.php rename to htdocs/modulebuilder/oldskeletons/skeleton_webservice_server.php diff --git a/htdocs/modulebuilder/template/core/modules/modMyModule.class.php b/htdocs/modulebuilder/template/core/modules/modMyModule.class.php index 71948b0e1be..5799d5bbab7 100644 --- a/htdocs/modulebuilder/template/core/modules/modMyModule.class.php +++ b/htdocs/modulebuilder/template/core/modules/modMyModule.class.php @@ -83,22 +83,19 @@ class modMyModule extends DolibarrModules // for default path (eg: /mymodule/core/xxxxx) (0=disable, 1=enable) // for specific path of parts (eg: /mymodule/core/modules/barcode) // for specific css file (eg: /mymodule/css/mymodule.css.php) - //$this->module_parts = array( - // 'triggers' => 0, // Set this to 1 if module has its own trigger directory (core/triggers) - // 'login' => 0, // Set this to 1 if module has its own login method directory (core/login) - // 'substitutions' => 0, // Set this to 1 if module has its own substitution function file (core/substitutions) - // 'menus' => 0, // Set this to 1 if module has its own menus handler directory (core/menus) - // 'theme' => 0, // Set this to 1 if module has its own theme directory (theme) - // 'tpl' => 0, // Set this to 1 if module overwrite template dir (core/tpl) - // 'barcode' => 0, // Set this to 1 if module has its own barcode directory (core/modules/barcode) - // 'models' => 0, // Set this to 1 if module has its own models directory (core/modules/xxx) - // 'css' => array('/mymodule/css/mymodule.css.php'), // Set this to relative path of css file if module has its own css file - // 'js' => array('/mymodule/js/mymodule.js'), // Set this to relative path of js file if module must load a js on all pages - // 'hooks' => array('hookcontext1','hookcontext2',...) // Set here all hooks context managed by module. You can also set hook context 'all' - // 'dir' => array('output' => 'othermodulename'), // To force the default directories names - // 'workflow' => array('WORKFLOW_MODULE1_YOURACTIONTYPE_MODULE2'=>array('enabled'=>'! empty($conf->module1->enabled) && ! empty($conf->module2->enabled)', 'picto'=>'yourpicto@mymodule')) // Set here all workflow context managed by module - // ); - $this->module_parts = array(); + $this->module_parts = array( + 'triggers' => 1, // Set this to 1 if module has its own trigger directory (core/triggers) + 'login' => 0, // Set this to 1 if module has its own login method directory (core/login) + 'substitutions' => 0, // Set this to 1 if module has its own substitution function file (core/substitutions) + 'menus' => 0, // Set this to 1 if module has its own menus handler directory (core/menus) + 'theme' => 0, // Set this to 1 if module has its own theme directory (theme) + 'tpl' => 0, // Set this to 1 if module overwrite template dir (core/tpl) + 'barcode' => 0, // Set this to 1 if module has its own barcode directory (core/modules/barcode) + 'models' => 0, // Set this to 1 if module has its own models directory (core/modules/xxx) + 'css' => array('/mymodule/css/mymodule.css.php'), // Set this to relative path of css file if module has its own css file + 'js' => array('/mymodule/js/mymodule.js'), // Set this to relative path of js file if module must load a js on all pages + 'hooks' => array('hookcontext1','hookcontext2') // Set here all hooks context managed by module. You can also set hook context 'all' + ); // Data directories to create when module is enabled. // Example: this->dirs = array("/mymodule/temp"); diff --git a/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_Triggers.class.php b/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.php similarity index 99% rename from htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_Triggers.class.php rename to htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.php index 56f00ab8b02..0140e1cc2b9 100644 --- a/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_Triggers.class.php +++ b/htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.php @@ -17,7 +17,7 @@ */ /** - * \file core/triggers/interface_99_modMyModule_Triggers.class.php + * \file core/triggers/interface_99_modMyModule_MyModuleTriggers.class.php * \ingroup mymodule * \brief Example trigger. * @@ -39,7 +39,7 @@ require_once DOL_DOCUMENT_ROOT.'/core/triggers/dolibarrtriggers.class.php'; /** * Class of triggers for MyModule module */ -class InterfaceMyModuleTrigger extends DolibarrTriggers +class InterfaceMyModuleTriggers extends DolibarrTriggers { /** * @var DoliDB Database handler diff --git a/htdocs/modulebuilder/template/modulebuilder.txt b/htdocs/modulebuilder/template/modulebuilder.txt index 4c726c35394..5cdb6c6e6e8 100644 --- a/htdocs/modulebuilder/template/modulebuilder.txt +++ b/htdocs/modulebuilder/template/modulebuilder.txt @@ -1,2 +1,2 @@ -File to flag module build using official module template. +File to flag module built using official module template. When this file is present into a module directory, you can edit it with the module builder tool. \ No newline at end of file diff --git a/htdocs/modulebuilder/template/myobject_card.php b/htdocs/modulebuilder/template/myobject_card.php index 6db376ff9b1..1d22c464212 100644 --- a/htdocs/modulebuilder/template/myobject_card.php +++ b/htdocs/modulebuilder/template/myobject_card.php @@ -44,7 +44,7 @@ if (! $res && file_exists("../../../../dolibarr/htdocs/main.inc.php")) $res=@inc if (! $res) die("Include of main fails"); // Change this following line to use the correct relative path from htdocs include_once(DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'); -dol_include_once('/mymodule/class/myobject_class.class.php'); +dol_include_once('/mymodule/class/myobject.class.php'); // Load traductions files requiredby by page $langs->load("mymodule"); diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index ad105480901..a935b87bd58 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -46,7 +46,7 @@ if (! $res) die("Include of main fails"); require_once(DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'); require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; -dol_include_once('/mymodule/class/skeleton_class.class.php'); +dol_include_once('/mymodule/class/myobject.class.php'); // Load traductions files requiredby by page $langs->load("mymodule"); From 095545e8d95eda034cc1629931603fc2611569c9 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sun, 28 May 2017 21:56:18 +0200 Subject: [PATCH 275/299] Fix : Correct bank transfert when we write operation on general ledger --- .../accountancy/class/bookkeeping.class.php | 328 +++++++++--------- htdocs/accountancy/journal/bankjournal.php | 46 ++- 2 files changed, 192 insertions(+), 182 deletions(-) diff --git a/htdocs/accountancy/class/bookkeeping.class.php b/htdocs/accountancy/class/bookkeeping.class.php index a59d92eb63a..1da95f26ce3 100644 --- a/htdocs/accountancy/class/bookkeeping.class.php +++ b/htdocs/accountancy/class/bookkeeping.class.php @@ -54,18 +54,15 @@ class BookKeeping extends CommonObject * @var string Name of table without prefix where object is stored */ public $table_element = 'accounting_bookkeeping'; - - + public $entity = 1; - - + /** * * @var BookKeepingLine[] Lines */ public $lines = array (); - - + /** * * @var int ID @@ -89,10 +86,10 @@ class BookKeeping extends CommonObject public $import_key; public $code_journal; public $piece_num; - + /** */ - + /** * Constructor * @@ -101,7 +98,7 @@ class BookKeeping extends CommonObject public function __construct(DoliDB $db) { $this->db = $db; } - + /** * Create object into database * @@ -110,12 +107,12 @@ class BookKeeping extends CommonObject * @return int <0 if KO, Id of created object if OK */ public function create(User $user, $notrigger = false) { - global $conf, $langs; - + global $conf, $langs; + dol_syslog(__METHOD__, LOG_DEBUG); - + $error = 0; - + // Clean parameters if (isset($this->doc_type)) { $this->doc_type = trim($this->doc_type); @@ -177,15 +174,14 @@ class BookKeeping extends CommonObject { $this->errors[]=$langs->trans('ErrorFieldAccountNotDefinedForInvoiceLine', $this->fk_doc, $this->doc_type); } - + return -1; } - - + $this->db->begin(); - + $this->piece_num = 0; - + // First check if line not yet already in bookkeeping $sql = "SELECT count(*) as nb"; $sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element; @@ -193,10 +189,10 @@ class BookKeeping extends CommonObject $sql .= " AND fk_doc = " . $this->fk_doc; $sql .= " AND fk_docdet = " . $this->fk_docdet; // This field can be 0 is record is for several lines $sql .= " AND numero_compte = '" . $this->db->escape($this->numero_compte) . "'"; - $sql .= " AND entity IN (" . getEntity("accountancy", 1) . ")"; - + $sql .= " AND entity IN (" . getEntity("accountancy", 1) . ")"; + $resql = $this->db->query($sql); - + if ($resql) { $row = $this->db->fetch_object($resql); if ($row->nb == 0) @@ -207,8 +203,8 @@ class BookKeeping extends CommonObject $sqlnum .= " WHERE doc_type = '" . $this->db->escape($this->doc_type) . "'"; // For example doc_type = 'bank' $sqlnum .= " AND fk_docdet = " . $this->db->escape($this->fk_docdet); // fk_docdet is rowid into llx_bank or llx_facturedet or llx_facturefourndet, or ... $sqlnum .= " AND doc_ref = '" . $this->db->escape($this->doc_ref) . "'"; // ref of source object - $sqlnum .= " AND entity IN (" . getEntity("accountancy", 1) . ")"; - + $sqlnum .= " AND entity IN (" . getEntity("accountancy", 1) . ")"; + dol_syslog(get_class($this) . ":: create sqlnum=" . $sqlnum, LOG_DEBUG); $resqlnum = $this->db->query($sqlnum); if ($resqlnum) { @@ -219,8 +215,8 @@ class BookKeeping extends CommonObject if (empty($this->piece_num)) { $sqlnum = "SELECT MAX(piece_num)+1 as maxpiecenum"; $sqlnum .= " FROM " . MAIN_DB_PREFIX . $this->table_element; - $sqlnum .= " WHERE entity IN (" . getEntity("accountancy", 1) . ")"; - + $sqlnum .= " WHERE entity IN (" . getEntity("accountancy", 1) . ")"; + dol_syslog(get_class($this) . ":: create sqlnum=" . $sqlnum, LOG_DEBUG); $resqlnum = $this->db->query($sqlnum); if ($resqlnum) { @@ -232,12 +228,12 @@ class BookKeeping extends CommonObject if (empty($this->piece_num)) { $this->piece_num = 1; } - + $now = dol_now(); if (empty($this->date_create)) { $this->date_create = $now; } - + $sql = "INSERT INTO " . MAIN_DB_PREFIX . $this->table_element . " ("; $sql .= "doc_date"; $sql .= ", doc_type"; @@ -275,7 +271,7 @@ class BookKeeping extends CommonObject $sql .= "," . $this->piece_num; $sql .= ", " . (! isset($this->entity) ? '1' : $this->entity); $sql .= ")"; - + dol_syslog(get_class($this) . ":: create sql=" . $sql, LOG_DEBUG); $resql = $this->db->query($sql); if ($resql) { @@ -308,7 +304,7 @@ class BookKeeping extends CommonObject $this->errors[] = 'Error ' . $this->db->lasterror(); dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR); } - + if (! $error) { if (! $notrigger) { @@ -321,7 +317,7 @@ class BookKeeping extends CommonObject // // End call triggers } } - + // Commit or rollback if ($error) { $this->db->rollback(); @@ -331,7 +327,7 @@ class BookKeeping extends CommonObject return $result; } } - + /** * Create object into database * @@ -341,11 +337,11 @@ class BookKeeping extends CommonObject */ public function createStd(User $user, $notrigger = false) { dol_syslog(__METHOD__, LOG_DEBUG); - + $error = 0; - + // Clean parameters - + if (isset($this->doc_type)) { $this->doc_type = trim($this->doc_type); } @@ -393,10 +389,10 @@ class BookKeeping extends CommonObject } if (empty($this->debit)) $this->debit = 0; if (empty($this->credit)) $this->credit = 0; - + // Check parameters // Put here code to add control on parameters values - + // Insert request $sql = 'INSERT INTO ' . MAIN_DB_PREFIX . $this->table_element . '('; $sql .= 'doc_date,'; @@ -435,19 +431,19 @@ class BookKeeping extends CommonObject $sql .= ' ' . (empty($this->piece_num) ? 'NULL' : $this->piece_num).','; $sql .= ' ' . (! isset($this->entity) ? '1' : $this->entity); $sql .= ')'; - + $this->db->begin(); - + $resql = $this->db->query($sql); if (! $resql) { $error ++; $this->errors[] = 'Error ' . $this->db->lasterror(); dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR); } - + if (! $error) { $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . $this->table_element); - + if (! $notrigger) { // Uncomment this and change MYOBJECT to your own tag if you // want this action to call a trigger. @@ -458,7 +454,7 @@ class BookKeeping extends CommonObject // // End call triggers } } - + // Commit or rollback if ($error) { $this->db->rollback(); @@ -470,7 +466,7 @@ class BookKeeping extends CommonObject return $this->id; } } - + /** * Load object in memory from the database * @@ -481,9 +477,9 @@ class BookKeeping extends CommonObject */ public function fetch($id, $ref = null) { global $conf; - + dol_syslog(__METHOD__, LOG_DEBUG); - + $sql = 'SELECT'; $sql .= ' t.rowid,'; $sql .= " t.doc_date,"; @@ -510,15 +506,15 @@ class BookKeeping extends CommonObject } else { $sql .= ' AND t.rowid = ' . $id; } - + $resql = $this->db->query($sql); if ($resql) { $numrows = $this->db->num_rows($resql); if ($numrows) { $obj = $this->db->fetch_object($resql); - + $this->id = $obj->rowid; - + $this->doc_date = $this->db->jdate($obj->doc_date); $this->doc_type = $obj->doc_type; $this->doc_ref = $obj->doc_ref; @@ -537,7 +533,7 @@ class BookKeeping extends CommonObject $this->piece_num = $obj->piece_num; } $this->db->free($resql); - + if ($numrows) { return 1; } else { @@ -565,9 +561,9 @@ class BookKeeping extends CommonObject */ public function fetchAllByAccount($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND') { global $conf; - - dol_syslog(__METHOD__, LOG_DEBUG); - + + dol_syslog(__METHOD__, LOG_DEBUG); + $sql = 'SELECT'; $sql .= ' t.rowid,'; $sql .= " t.doc_date,"; @@ -622,16 +618,16 @@ class BookKeeping extends CommonObject $sql .= ' ' . $this->db->plimit($limit + 1, $offset); } $this->lines = array (); - + $resql = $this->db->query($sql); if ($resql) { $num = $this->db->num_rows($resql); - + while ( $obj = $this->db->fetch_object($resql) ) { $line = new BookKeepingLine(); - + $line->id = $obj->rowid; - + $line->doc_date = $this->db->jdate($obj->doc_date); $line->doc_type = $obj->doc_type; $line->doc_ref = $obj->doc_ref; @@ -648,16 +644,16 @@ class BookKeeping extends CommonObject $line->import_key = $obj->import_key; $line->code_journal = $obj->code_journal; $line->piece_num = $obj->piece_num; - + $this->lines[] = $line; } $this->db->free($resql); - + return $num; } else { $this->errors[] = 'Error ' . $this->db->lasterror(); dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR); - + return - 1; } } @@ -677,9 +673,9 @@ class BookKeeping extends CommonObject */ public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND') { global $conf; - + dol_syslog(__METHOD__, LOG_DEBUG); - + $sql = 'SELECT'; $sql .= ' t.rowid,'; $sql .= " t.doc_date,"; @@ -723,7 +719,7 @@ class BookKeeping extends CommonObject if (count($sqlwhere) > 0) { $sql .= ' AND ' . implode(' ' . $filtermode . ' ', $sqlwhere); } - + if (! empty($sortfield)) { $sql .= $this->db->order($sortfield, $sortorder); } @@ -731,16 +727,16 @@ class BookKeeping extends CommonObject $sql .= ' ' . $this->db->plimit($limit + 1, $offset); } $this->lines = array (); - + $resql = $this->db->query($sql); if ($resql) { $num = $this->db->num_rows($resql); - + while ( $obj = $this->db->fetch_object($resql) ) { $line = new BookKeepingLine(); - + $line->id = $obj->rowid; - + $line->doc_date = $this->db->jdate($obj->doc_date); $line->doc_type = $obj->doc_type; $line->doc_ref = $obj->doc_ref; @@ -757,20 +753,20 @@ class BookKeeping extends CommonObject $line->import_key = $obj->import_key; $line->code_journal = $obj->code_journal; $line->piece_num = $obj->piece_num; - + $this->lines[] = $line; } $this->db->free($resql); - + return $num; } else { $this->errors[] = 'Error ' . $this->db->lasterror(); dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR); - + return - 1; } } - + /** * Load object in memory from the database * @@ -785,9 +781,9 @@ class BookKeeping extends CommonObject */ public function fetchAllBalance($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND') { global $conf; - + dol_syslog(__METHOD__, LOG_DEBUG); - + $sql = 'SELECT'; $sql .= " t.numero_compte,"; $sql .= " SUM(t.debit) as debit,"; @@ -817,9 +813,9 @@ class BookKeeping extends CommonObject if (count($sqlwhere) > 0) { $sql .= ' AND ' . implode(' ' . $filtermode . ' ', $sqlwhere); } - + $sql .= ' GROUP BY t.numero_compte'; - + if (! empty($sortfield)) { $sql .= $this->db->order($sortfield, $sortorder); } @@ -827,30 +823,30 @@ class BookKeeping extends CommonObject $sql .= ' ' . $this->db->plimit($limit + 1, $offset); } $this->lines = array (); - + $resql = $this->db->query($sql); if ($resql) { $num = $this->db->num_rows($resql); - + while ( $obj = $this->db->fetch_object($resql) ) { $line = new BookKeepingLine(); - + $line->numero_compte = $obj->numero_compte; $line->debit = $obj->debit; $line->credit = $obj->credit; $this->lines[] = $line; } $this->db->free($resql); - + return $num; } else { $this->errors[] = 'Error ' . $this->db->lasterror(); dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR); - + return - 1; } } - + /** * Update object into database * @@ -861,11 +857,10 @@ class BookKeeping extends CommonObject */ public function update(User $user, $notrigger = false) { $error = 0; - + dol_syslog(__METHOD__, LOG_DEBUG); - + // Clean parameters - if (isset($this->doc_type)) { $this->doc_type = trim($this->doc_type); } @@ -911,10 +906,10 @@ class BookKeeping extends CommonObject if (isset($this->piece_num)) { $this->piece_num = trim($this->piece_num); } - + // Check parameters // Put here code to add a control on parameters values - + // Update request $sql = 'UPDATE ' . MAIN_DB_PREFIX . $this->table_element . ' SET'; $sql .= ' doc_date = ' . (! isset($this->doc_date) || dol_strlen($this->doc_date) != 0 ? "'" . $this->db->idate($this->doc_date) . "'" : 'null') . ','; @@ -934,16 +929,16 @@ class BookKeeping extends CommonObject $sql .= ' code_journal = ' . (isset($this->code_journal) ? "'" . $this->db->escape($this->code_journal) . "'" : "null") . ','; $sql .= ' piece_num = ' . (isset($this->piece_num) ? $this->piece_num : "null"); $sql .= ' WHERE rowid=' . $this->id; - + $this->db->begin(); - + $resql = $this->db->query($sql); if (! $resql) { $error ++; $this->errors[] = 'Error ' . $this->db->lasterror(); dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR); } - + if (! $error && ! $notrigger) { // Uncomment this and change MYOBJECT to your own tag if you // want this action calls a trigger. @@ -953,19 +948,19 @@ class BookKeeping extends CommonObject // if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} // // End call triggers } - + // Commit or rollback if ($error) { $this->db->rollback(); - + return - 1 * $error; } else { $this->db->commit(); - + return 1; } } - + /** * Delete object in database * @@ -976,27 +971,27 @@ class BookKeeping extends CommonObject */ public function delete(User $user, $notrigger = false) { dol_syslog(__METHOD__, LOG_DEBUG); - + $error = 0; - + $this->db->begin(); - + if (! $error) { if (! $notrigger) { // Uncomment this and change MYOBJECT to your own tag if you // want this action calls a trigger. - + // // Call triggers // $result=$this->call_trigger('MYOBJECT_DELETE',$user); // if ($result < 0) { $error++; //Do also what you must do to rollback action if trigger fail} // // End call triggers } } - + if (! $error) { $sql = 'DELETE FROM ' . MAIN_DB_PREFIX . $this->table_element; $sql .= ' WHERE rowid=' . $this->id; - + $resql = $this->db->query($sql); if (! $resql) { $error ++; @@ -1004,19 +999,19 @@ class BookKeeping extends CommonObject dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR); } } - + // Commit or rollback if ($error) { $this->db->rollback(); - + return - 1 * $error; } else { $this->db->commit(); - + return 1; } } - + /** * Delete bookkepping by importkey * @@ -1025,25 +1020,25 @@ class BookKeeping extends CommonObject */ function deleteByImportkey($importkey) { $this->db->begin(); - + // first check if line not yet in bookkeeping $sql = "DELETE"; $sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element; $sql .= " WHERE import_key = '" . $importkey . "'"; - + $resql = $this->db->query($sql); - + if (! $resql) { $this->errors[] = "Error " . $this->db->lasterror(); dol_syslog(get_class($this)."::delete Error " . $this->db->lasterror(), LOG_ERR); $this->db->rollback(); return - 1; } - + $this->db->commit(); return 1; } - + /** * Delete bookkepping by year * @@ -1053,14 +1048,14 @@ class BookKeeping extends CommonObject */ function deleteByYearAndJournal($delyear='', $journal='') { global $conf; - + if (empty($delyear) && empty($journal)) { return -1; } - + $this->db->begin(); - + // first check if line not yet in bookkeeping $sql = "DELETE"; $sql.= " FROM " . MAIN_DB_PREFIX . $this->table_element; @@ -1069,7 +1064,7 @@ class BookKeeping extends CommonObject if (! empty($journal)) $sql.= " AND code_journal = '".$journal."'"; $sql .= " AND entity IN (" . getEntity("accountancy", 1) . ")"; $resql = $this->db->query($sql); - + if (! $resql) { $this->errors[] = "Error " . $this->db->lasterror(); foreach ( $this->errors as $errmsg ) { @@ -1079,11 +1074,11 @@ class BookKeeping extends CommonObject $this->db->rollback(); return -1; } - + $this->db->commit(); return 1; } - + /** * Delete bookkepping by piece number * @@ -1092,17 +1087,17 @@ class BookKeeping extends CommonObject */ function deleteMvtNum($piecenum) { global $conf; - + $this->db->begin(); - + // first check if line not yet in bookkeeping $sql = "DELETE"; $sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element; $sql .= " WHERE piece_num = " . $piecenum; $sql .= " AND entity IN (" . getEntity("accountancy", 1) . ")"; - + $resql = $this->db->query($sql); - + if (! $resql) { $this->errors[] = "Error " . $this->db->lasterror(); foreach ( $this->errors as $errmsg ) { @@ -1112,11 +1107,11 @@ class BookKeeping extends CommonObject $this->db->rollback(); return - 1; } - + $this->db->commit(); return 1; } - + /** * Load an object from its id and create a new one in database * @@ -1126,43 +1121,43 @@ class BookKeeping extends CommonObject */ public function createFromClone($fromid) { dol_syslog(__METHOD__, LOG_DEBUG); - + global $user; $error = 0; $object = new Accountingbookkeeping($this->db); - + $this->db->begin(); - + // Load source object $object->fetch($fromid); // Reset object $object->id = 0; - + // Clear fields // ... - + // Create clone $result = $object->create($user); - + // Other options if ($result < 0) { $error ++; $this->errors = $object->errors; dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR); } - + // End if (! $error) { $this->db->commit(); - + return $object->id; } else { $this->db->rollback(); - + return - 1; } } - + /** * Initialise object with example values * Id must be 0 if object instance is a specimen @@ -1171,9 +1166,9 @@ class BookKeeping extends CommonObject */ public function initAsSpecimen() { global $user; - + $now=dol_now(); - + $this->id = 0; $this->doc_date = $now; $this->doc_type = ''; @@ -1192,7 +1187,7 @@ class BookKeeping extends CommonObject $this->code_journal = ''; $this->piece_num = ''; } - + /** * Load an accounting document into memory from database * @@ -1201,17 +1196,17 @@ class BookKeeping extends CommonObject */ public function fetchPerMvt($piecenum) { global $conf; - + $sql = "SELECT piece_num,doc_date,code_journal,doc_ref,doc_type"; $sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element; $sql .= " WHERE piece_num = " . $piecenum; $sql .= " AND entity IN (" . getEntity("accountancy", 1) . ")"; - + dol_syslog(get_class($this) . "::" . __METHOD__, LOG_DEBUG); $result = $this->db->query($sql); if ($result) { $obj = $this->db->fetch_object($result); - + $this->piece_num = $obj->piece_num; $this->code_journal = $obj->code_journal; $this->doc_date = $this->db->jdate($obj->doc_date); @@ -1225,7 +1220,7 @@ class BookKeeping extends CommonObject return 1; } - + /** * Return next number movement * @@ -1234,10 +1229,10 @@ class BookKeeping extends CommonObject public function getNextNumMvt() { global $conf; - + $sql = "SELECT MAX(piece_num)+1 as max FROM " . MAIN_DB_PREFIX . $this->table_element; $sql .= " WHERE entity IN (" . getEntity("accountancy", 1) . ")"; - + dol_syslog(get_class($this) . "getNextNumMvt sql=" . $sql, LOG_DEBUG); $result = $this->db->query($sql); @@ -1252,7 +1247,7 @@ class BookKeeping extends CommonObject return - 1; } } - + /** * Load all informations of accountancy document * @@ -1261,7 +1256,7 @@ class BookKeeping extends CommonObject */ function fetch_all_per_mvt($piecenum) { global $conf; - + $sql = "SELECT rowid, doc_date, doc_type,"; $sql .= " doc_ref, fk_doc, fk_docdet, code_tiers,"; $sql .= " numero_compte, label_compte, debit, credit,"; @@ -1269,17 +1264,17 @@ class BookKeeping extends CommonObject $sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element; $sql .= " WHERE piece_num = " . $piecenum; $sql .= " AND entity IN (" . getEntity("accountancy", 1) . ")"; - + dol_syslog(get_class($this) . "::" . __METHOD__, LOG_DEBUG); $result = $this->db->query($sql); if ($result) { - + while ( $obj = $this->db->fetch_object($result) ) { - + $line = new BookKeepingLine(); - + $line->id = $obj->rowid; - + $line->doc_date = $this->db->jdate($obj->doc_date); $line->doc_type = $obj->doc_type; $line->doc_ref = $obj->doc_ref; @@ -1294,7 +1289,7 @@ class BookKeeping extends CommonObject $line->sens = $obj->sens; $line->code_journal = $obj->code_journal; $line->piece_num = $obj->piece_num; - + $this->linesmvt[] = $line; } } else { @@ -1305,7 +1300,7 @@ class BookKeeping extends CommonObject return 1; } - + /** * Export bookkeping * @@ -1314,27 +1309,27 @@ class BookKeeping extends CommonObject */ function export_bookkeping($model = 'ebp') { global $conf; - + $sql = "SELECT rowid, doc_date, doc_type,"; $sql .= " doc_ref, fk_doc, fk_docdet, code_tiers,"; $sql .= " numero_compte, label_compte, debit, credit,"; $sql .= " montant, sens, fk_user_author, import_key, code_journal, piece_num"; $sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element; $sql .= " WHERE entity IN (" . getEntity("accountancy", 1) . ")"; - + dol_syslog(get_class($this) . "::export_bookkeping", LOG_DEBUG); - + $resql = $this->db->query($sql); - + if ($resql) { $this->linesexport = array (); - + $num = $this->db->num_rows($resql); while ( $obj = $this->db->fetch_object($resql) ) { $line = new BookKeepingLine(); - + $line->id = $obj->rowid; - + $line->doc_date = $this->db->jdate($obj->doc_date); $line->doc_type = $obj->doc_type; $line->doc_ref = $obj->doc_ref; @@ -1349,11 +1344,11 @@ class BookKeeping extends CommonObject $line->sens = $obj->sens; $line->code_journal = $obj->code_journal; $line->piece_num = $obj->piece_num; - + $this->linesexport[] = $line; } $this->db->free($resql); - + return $num; } else { $this->error = "Error " . $this->db->lasterror(); @@ -1433,8 +1428,7 @@ class BookKeeping extends CommonObject return $out; } - - + /** * Description of a root accounting account * @@ -1442,10 +1436,10 @@ class BookKeeping extends CommonObject * @return string Root account */ function get_compte_racine($account = null) - { + { global $conf; $pcgver = $conf->global->CHARTOFACCOUNTS; - + $sql = "SELECT root.account_number, root.label as label"; $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_account as aa"; $sql .= " INNER JOIN " . MAIN_DB_PREFIX . "accounting_system as asy ON aa.fk_pcg_version = asy.pcg_version"; @@ -1456,7 +1450,7 @@ class BookKeeping extends CommonObject $sql .= " AND parent.active = 1"; $sql .= " AND root.active = 1"; $sql .= " AND aa.entity IN (" . getEntity("accountancy", 1) . ")"; - + dol_syslog(get_class($this) . "::select_account sql=" . $sql, LOG_DEBUG); $resql = $this->db->query($sql); if ($resql) { @@ -1464,9 +1458,9 @@ class BookKeeping extends CommonObject if ($this->db->num_rows($resql)) { $obj = $this->db->fetch_object($resql); } - + return $obj->label; - + } else { $this->error = "Error " . $this->db->lasterror(); dol_syslog(__METHOD__ . " " . $this->error, LOG_ERR); @@ -1483,9 +1477,9 @@ class BookKeeping extends CommonObject * @return string Account desc */ function get_compte_desc($account = null) - { + { global $conf; - + $pcgver = $conf->global->CHARTOFACCOUNTS; $sql = "SELECT aa.account_number, aa.label, aa.rowid, aa.fk_pcg_version, cat.label as category"; $sql .= " FROM " . MAIN_DB_PREFIX . "accounting_account as aa "; @@ -1495,7 +1489,7 @@ class BookKeeping extends CommonObject $sql .= " AND aa.active = 1"; $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "c_accounting_category as cat ON aa.fk_accounting_category = cat.rowid"; $sql .= " WHERE aa.entity IN (" . getEntity("accountancy", 1) . ")"; - + dol_syslog(get_class($this) . "::select_account sql=" . $sql, LOG_DEBUG); $resql = $this->db->query($sql); if ($resql) { @@ -1503,12 +1497,10 @@ class BookKeeping extends CommonObject if ($this->db->num_rows($resql)) { $obj = $this->db->fetch_object($resql); } - - if(empty($obj->category)){ + if(empty($obj->category)){ return $obj->label; }else{ return $obj->label.' ('.$obj->category.')'; - } } else { $this->error = "Error " . $this->db->lasterror(); diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index d1602bedf00..0b19697ef2b 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -34,6 +34,7 @@ require_once DOL_DOCUMENT_ROOT . '/core/lib/report.lib.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/date.lib.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/bank.lib.php'; require_once DOL_DOCUMENT_ROOT . '/core/lib/accounting.lib.php'; +require_once DOL_DOCUMENT_ROOT . '/accountancy/class/accountingjournal.class.php'; require_once DOL_DOCUMENT_ROOT . '/societe/class/societe.class.php'; require_once DOL_DOCUMENT_ROOT . '/user/class/user.class.php'; require_once DOL_DOCUMENT_ROOT . '/adherents/class/adherent.class.php'; @@ -63,7 +64,10 @@ $langs->load("accountancy"); $langs->load("trips"); $langs->load("hrm"); +// Old system menu $id_bank_account = GETPOST('id_account', 'int'); +// Multi journal +$code_journal = GETPOST('code_journal', 'alpha'); $date_startmonth = GETPOST('date_startmonth'); $date_startday = GETPOST('date_startday'); @@ -83,9 +87,9 @@ if ($user->societe_id > 0 && empty($id_bank_account)) /* * Actions */ - + $error = 0; - + $year_current = strftime("%Y", dol_now()); $pastmonth = strftime("%m", dol_now()) - 1; $pastmonthyear = $year_current; @@ -134,9 +138,20 @@ $paymentsalstatic = new PaymentSalary($db); $paymentexpensereportstatic = new PaymentExpenseReport($db); // Get code of finance journal -$bank_code_journal = new Account($db); -$result = $bank_code_journal->fetch($id_bank_account); -$journal = $bank_code_journal->accountancy_journal; +$journal = ''; +$bankstatic = new Account($db); +$bankstatic->fetch($id_bank_account); +$bankstatic->rowid; +$bankstatic->label; +$bankstatic->fk_accountancy_journal; + +$accountingjournalstatic = new AccountingJournal($db); +if(! empty($id_bank_account) { + $accountingjournalstatic->fetch($bankstatic->fk_accountancy_journal); +} else { + $accountingjournalstatic->fetch('',$code_journal); +} +$journal = $accountingjournalstatic->code; dol_syslog("accountancy/journal/bankjournal.php", LOG_DEBUG); $result = $db->query($sql); @@ -179,7 +194,7 @@ if ($result) { 'name' => $obj->name, 'code_compta' => $compta_soc, ); - + $compta_user = (! empty($obj->accountancy_code) ? $obj->accountancy_code : $account_employee); $tabuser[$obj->rowid] = array ( @@ -205,8 +220,8 @@ if ($result) { if (is_array($links)) { // Now loop on each link of record in bank. foreach ( $links as $key => $val ) { - - if (in_array($links[$key]['type'], array('sc', 'payment_sc', 'payment', 'payment_supplier', 'payment_vat', 'payment_expensereport'))) // So we excluded 'company' here + + if (in_array($links[$key]['type'], array('sc', 'payment_sc', 'payment', 'payment_supplier', 'payment_vat', 'payment_expensereport', 'banktransfert'))) // So we excluded 'company' here { // We save tabtype for a future use, to remember what kind of payment it is $tabtype[$obj->rowid] = $links[$key]['type']; @@ -330,11 +345,11 @@ if (! $error && $action == 'writebookkeeping') { $error = 0; foreach ( $tabpay as $key => $val ) { // $key is rowid into llx_bank - + $errorforline = 0; - + $db->begin(); - + // Bank if (! $errorforline) { @@ -473,6 +488,9 @@ if (! $error && $action == 'writebookkeeping') { } $bookkeeping->code_tiers = $tabcompany[$key]['code_compta']; $bookkeeping->numero_compte = $k; + } else if ($tabtype[$key] == 'banktransfert') { + $bookkeeping->code_tiers = ''; + $bookkeeping->numero_compte = $k; } else { // FIXME Should be a temporary account ??? $bookkeeping->doc_ref = $k; @@ -705,17 +723,17 @@ if (empty($action) || $action == 'view') { $invoicestatic = new Facture($db); $invoicesupplierstatic = new FactureFournisseur($db); $expensereportstatic = new ExpenseReport($db); - + llxHeader('', $langs->trans("FinanceJournal")); - $nom = $langs->trans("FinanceJournal") . ' - ' . $bank_code_journal->getNomUrl(1); + $nom = $langs->trans("FinanceJournal") . ' - ' . $bankstatic->getNomUrl(1); $builddate = time(); //$description = $langs->trans("DescFinanceJournal") . '
        '; $description.= $langs->trans("DescJournalOnlyBindedVisible").'
        '; $period = $form->select_date($date_start, 'date_start', 0, 0, 0, '', 1, 0, 1) . ' - ' . $form->select_date($date_end, 'date_end', 0, 0, 0, '', 1, 0, 1); $varlink = 'id_account=' . $id_bank_account; - + journalHead($nom, $nomlink, $period, $periodlink, $description, $builddate, $exportlink, array('action' => ''), '', $varlink); /*if ($conf->global->ACCOUNTING_EXPORT_MODELCSV != 1 && $conf->global->ACCOUNTING_EXPORT_MODELCSV != 2) { From b0f2e95c7b678ea7cd1911b7b18b6e8160218380 Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Sun, 28 May 2017 22:11:57 +0200 Subject: [PATCH 276/299] Debug --- htdocs/accountancy/journal/bankjournal.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index 0b19697ef2b..ea98d678671 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -142,11 +142,12 @@ $journal = ''; $bankstatic = new Account($db); $bankstatic->fetch($id_bank_account); $bankstatic->rowid; +$bankstatic->number; $bankstatic->label; $bankstatic->fk_accountancy_journal; $accountingjournalstatic = new AccountingJournal($db); -if(! empty($id_bank_account) { +if(! empty($id_bank_account)) { $accountingjournalstatic->fetch($bankstatic->fk_accountancy_journal); } else { $accountingjournalstatic->fetch('',$code_journal); @@ -870,9 +871,9 @@ if (empty($action) || $action == 'view') { else print $accountoshow; print "
        " . $bank_code_journal->label . " - " . $val["ref"] . "" . $bankstatic->label . " - " . $val["ref"] . "" . $bank_code_journal->label . " - " . $val['soclib'] . "" . $bankstatic->label . " - " . $val['soclib'] . "" . $val["type_payment"] . "" . ($mt >= 0 ? price($mt) : '') . "
        '; - // Employee - print ''; - // Label - print ''; + print ''; print ""; print '
        '.$langs->trans("Employee").''; - $usersal=new User($db); - $usersal->fetch($object->fk_user); - print $usersal->getNomUrl(1); - print '
        '.$langs->trans("Label").''.$object->label.'
        '.$langs->trans("Label").''.$object->label.'
        '.$langs->trans("DateStartPeriod").''; From 0d3c5bcfa8638436c8b8b78d7344f7d3aa39dd9e Mon Sep 17 00:00:00 2001 From: Alexandre SPANGARO Date: Mon, 29 May 2017 06:35:53 +0200 Subject: [PATCH 280/299] Update documents & info page - better look & feel v6 --- htdocs/compta/salaries/card.php | 4 +-- htdocs/compta/salaries/document.php | 43 ++++++++++++++++------------- htdocs/compta/salaries/info.php | 31 +++++++++++++++++---- 3 files changed, 51 insertions(+), 27 deletions(-) diff --git a/htdocs/compta/salaries/card.php b/htdocs/compta/salaries/card.php index 63b5139ce29..68f59d03cfa 100644 --- a/htdocs/compta/salaries/card.php +++ b/htdocs/compta/salaries/card.php @@ -391,9 +391,9 @@ if ($id) $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$object,$action); // Note that $action and $object may have been modified by hook print '
        '; - + print '
        '; - + dol_fiche_end(); diff --git a/htdocs/compta/salaries/document.php b/htdocs/compta/salaries/document.php index 7b24a0762f3..03a69a764cf 100644 --- a/htdocs/compta/salaries/document.php +++ b/htdocs/compta/salaries/document.php @@ -6,7 +6,7 @@ * Copyright (C) 2005 Simon TOSSER * Copyright (C) 2011-2012 Juanjo Menent * Copyright (C) 2013 Cédric Salvador - * Copyright (C) 2015-2016 Alexandre Spangaro + * Copyright (C) 2015-2017 Alexandre Spangaro * * 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 @@ -36,7 +36,9 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/salaries.lib.php'; require_once DOL_DOCUMENT_ROOT.'/compta/salaries/class/paymentsalary.class.php'; $langs->load("other"); +$langs->load("users"); $langs->load("salaries"); +$langs->load('hrm'); $langs->load("companies"); $id = GETPOST('id','int'); @@ -83,7 +85,6 @@ $form = new Form($db); llxHeader("",$langs->trans("SalaryPayment")); - if ($object->id) { $object->fetch_thirdparty(); @@ -92,7 +93,6 @@ if ($object->id) dol_fiche_head($head, 'documents', $langs->trans("SalaryPayment"), 0, 'payment'); - // Construit liste des fichiers $filearray=dol_dir_list($upload_dir,"files",0,'','(\.meta|_preview.*\.png)$',$sortfield,(strtolower($sortorder)=='desc'?SORT_DESC:SORT_ASC),1); $totalsize=0; @@ -101,29 +101,34 @@ if ($object->id) $totalsize+=$file['size']; } + $linkback = ''.$langs->trans("BackToList").''; - print ''; + $morehtmlref='
        '; - $linkback = ''.$langs->trans("BackToList").''; + $userstatic=new User($db); + $userstatic->fetch($object->fk_user); - // Ref - print '
        '; + $morehtmlref.=$langs->trans('Employee') . ' : ' . $userstatic->getNomUrl(1); + $morehtmlref.=''; - // Societe - //print ""; + dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', ''); - print ''; - print ''; - print '
        '.$langs->trans("Ref").''; - print $form->showrefnav($object, 'id', $linkback, 1, 'rowid', 'ref', ''); - print '
        ".$langs->trans("Company")."".$object->client->getNomUrl(1)."
        '.$langs->trans("NbOfAttachedFiles").''.count($filearray).'
        '.$langs->trans("TotalSizeOfAttachedFiles").''.$totalsize.' '.$langs->trans("bytes").'
        '; + print '
        '; + print '
        '; - print '
        '; + print ''; + print ''; + print ''; + print '
        '.$langs->trans("NbOfAttachedFiles").''.count($filearray).'
        '.$langs->trans("TotalSizeOfAttachedFiles").''.$totalsize.' '.$langs->trans("bytes").'
        '; - $modulepart = 'salaries'; - $permission = $user->rights->salaries->write; - $param = '&id=' . $object->id; - include_once DOL_DOCUMENT_ROOT . '/core/tpl/document_actions_post_headers.tpl.php'; + print ''; + + dol_fiche_end(); + + $modulepart = 'salaries'; + $permission = $user->rights->salaries->write; + $param = '&id=' . $object->id; + include_once DOL_DOCUMENT_ROOT . '/core/tpl/document_actions_post_headers.tpl.php'; } else diff --git a/htdocs/compta/salaries/info.php b/htdocs/compta/salaries/info.php index f15aac021ec..05dc7835b68 100644 --- a/htdocs/compta/salaries/info.php +++ b/htdocs/compta/salaries/info.php @@ -1,6 +1,7 @@ - * Copyright (C) 2015 Charlie BENKE + * Copyright (C) 2015 Charlie BENKE + * Copyright (C) 2017 Alexandre Spangaro * * 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 @@ -29,7 +30,9 @@ require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; $langs->load("compta"); $langs->load("bills"); +$langs->load("users"); $langs->load("salaries"); +$langs->load('hrm'); $id=GETPOST('id','int'); $action=GETPOST('action','aZ09'); @@ -46,21 +49,37 @@ $result = restrictedArea($user, 'salaries', '', '', ''); llxHeader("",$langs->trans("SalaryPayment")); -$salpayment = new PaymentSalary($db); -$result = $salpayment->fetch($id); -$salpayment->info($id); +$object = new PaymentSalary($db); +$object->fetch($id); +$object->info($id); -$head = salaries_prepare_head($salpayment); +$head = salaries_prepare_head($object); dol_fiche_head($head, 'info', $langs->trans("SalaryPayment"), 0, 'payment'); +$linkback = ''.$langs->trans("BackToList").''; + +$morehtmlref='
        '; + +$userstatic=new User($db); +$userstatic->fetch($object->fk_user); + +$morehtmlref.=$langs->trans('Employee') . ' : ' . $userstatic->getNomUrl(1); +$morehtmlref.='
        '; + +dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', $morehtmlref, '', 0, '', ''); + +print '
        '; +print '
        '; print '
        '; -dol_print_object_info($salpayment); +dol_print_object_info($object); print '
        '; print '
        '; +dol_fiche_end(); + llxFooter(); $db->close(); From 70636cc59ffa1ffbc0ce3dba315d7d9b837aad04 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 29 May 2017 09:57:05 +0200 Subject: [PATCH 281/299] FIX SQL injection on user/index.php parameter search_statut. --- htdocs/core/lib/functions.lib.php | 3 +++ htdocs/user/index.php | 16 ++++++++-------- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 2db8ecdb111..c678e0bc7df 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -286,6 +286,9 @@ function GETPOST($paramname,$check='',$method=0,$filter=NULL,$options=NULL) case 'int': if (! is_numeric($out)) { $out=''; } break; + case 'intcomma': + if (preg_match('/[^0-9,]+/i',$out)) $out=''; + break; case 'alpha': $out=trim($out); // '"' is dangerous because param in url can close the href= or src= and add javascript functions. diff --git a/htdocs/user/index.php b/htdocs/user/index.php index 9e7c78f9799..35a05ad4be1 100644 --- a/htdocs/user/index.php +++ b/htdocs/user/index.php @@ -119,9 +119,9 @@ $search_gender=GETPOST('search_gender','alpha'); $search_employee=GETPOST('search_employee','alpha'); $search_accountancy_code=GETPOST('search_accountancy_code','alpha'); $search_email=GETPOST('search_email','alpha'); -$search_statut=GETPOST('search_statut','alpha'); +$search_statut=GETPOST('search_statut','intcomma'); $search_thirdparty=GETPOST('search_thirdparty','alpha'); -$search_supervisor=GETPOST('search_supervisor','alpha'); +$search_supervisor=GETPOST('search_supervisor','intcomma'); $search_previousconn=GETPOST('search_previousconn','alpha'); $optioncss = GETPOST('optioncss','alpha'); @@ -148,7 +148,7 @@ if (empty($reshook)) include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php'; // Purge search criteria - if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") ||GETPOST("button_removefilter")) // All test are required to be compatible with all browsers + if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") ||GETPOST("button_removefilter")) // All tests are required to be compatible with all browsers { $search_user=""; $search_login=""; @@ -203,8 +203,8 @@ else } if ($socid > 0) $sql.= " AND u.fk_soc = ".$socid; //if ($search_user != '') $sql.=natural_search(array('u.login', 'u.lastname', 'u.firstname'), $search_user); -if ($search_supervisor > 0) $sql.= " AND u.fk_user = ".$search_supervisor; -if ($search_thirdparty != '') $sql.=natural_search(array('s.nom'), $search_thirdparty); +if ($search_supervisor > 0) $sql.= " AND u.fk_user = ".$db->escape($search_supervisor); +if ($search_thirdparty != '') $sql.= natural_search(array('s.nom'), $search_thirdparty); if ($search_login != '') $sql.= natural_search("u.login", $search_login); if ($search_lastname != '') $sql.= natural_search("u.lastname", $search_lastname); if ($search_firstname != '') $sql.= natural_search("u.firstname", $search_firstname); @@ -213,9 +213,9 @@ if (is_numeric($search_employee) && $search_employee >= 0) { $sql .= ' AND u.employee = '.(int) $search_employee; } if ($search_accountancy_code != '') $sql.= natural_search("u.accountancy_code", $search_accountancy_code); -if ($search_email != '') $sql.= natural_search("u.email", $search_email); -if ($search_statut != '' && $search_statut >= 0) $sql.= " AND (u.statut=".$search_statut.")"; -if ($sall) $sql.= natural_search(array_keys($fieldstosearchall), $sall); +if ($search_email != '') $sql.= natural_search("u.email", $search_email); +if ($search_statut != '' && $search_statut >= 0) $sql.= " AND u.statut IN (".$db->escape($search_statut).")"; +if ($sall) $sql.= natural_search(array_keys($fieldstosearchall), $sall); // Add where from extra fields foreach ($search_array_options as $key => $val) { From aa0a369f06c28a635e23b276c1015c9d0bcb5e94 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 29 May 2017 10:15:10 +0200 Subject: [PATCH 282/299] Fix typo --- htdocs/user/class/usergroup.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/user/class/usergroup.class.php b/htdocs/user/class/usergroup.class.php index 81c5e986444..41cbdc44964 100644 --- a/htdocs/user/class/usergroup.class.php +++ b/htdocs/user/class/usergroup.class.php @@ -68,7 +68,7 @@ class UserGroup extends CommonObject /** - * Charge un objet group avec toutes ces caracteristiques (excpet ->members array) + * Charge un objet group avec toutes ces caracteristiques (except ->members array) * * @param int $id id du groupe a charger * @param string $groupname name du groupe a charger From 4c382f94e1698b4a7abecfd3b5ae5c092742894a Mon Sep 17 00:00:00 2001 From: BENKE Charlie Date: Mon, 29 May 2017 10:39:02 +0200 Subject: [PATCH 283/299] Changes done --- htdocs/core/menus/standard/eldy.lib.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index 25ab9e9c154..54fdae3aba0 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -802,7 +802,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu $langs->load("bills"); $newmenu->add("/compta/facture/list.php?leftmenu=customers_bills",$langs->trans("BillsCustomers"),0,$user->rights->facture->lire, '', $mainmenu, 'customers_bills'); $newmenu->add("/compta/facture/card.php?action=create",$langs->trans("NewBill"),1,$user->rights->facture->creer); - $newmenu->add("/compta/facture/list.php?leftmenu=customers_bills",$langs->trans("List"),1,$user->rights->facture->lire); + $newmenu->add("/compta/facture/list.php?leftmenu=customers_bills",$langs->trans("List"),1,$user->rights->facture->lire'customers_bills_list'); if ($usemenuhider || empty($leftmenu) || preg_match('/customers_bills/', $leftmenu)) { @@ -830,7 +830,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu $langs->load("bills"); $newmenu->add("/fourn/facture/list.php?leftmenu=suppliers_bills", $langs->trans("BillsSuppliers"),0,$user->rights->fournisseur->facture->lire, '', $mainmenu, 'suppliers_bills'); $newmenu->add("/fourn/facture/card.php?action=create",$langs->trans("NewBill"),1,$user->rights->fournisseur->facture->creer); - $newmenu->add("/fourn/facture/list.php?leftmenu=suppliers_bills", $langs->trans("List"),1,$user->rights->fournisseur->facture->lire); + $newmenu->add("/fourn/facture/list.php?leftmenu=suppliers_bills", $langs->trans("List"),1,$user->rights->fournisseur->facture->lire, 'suppliers_bills_list'); if ($usemenuhider || empty($leftmenu) || preg_match('/suppliers_bills/', $leftmenu)) { $newmenu->add("/fourn/facture/list.php?leftmenu=suppliers_bills_draft&search_status=0", $langs->trans("BillShortStatusDraft"),2,$user->rights->fournisseur->facture->lire, '', $mainmenu, 'suppliers_bills_draft'); From 85c3880479740994dad8dfc82d74fdfb588cc62f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 29 May 2017 10:58:41 +0200 Subject: [PATCH 284/299] Look and feel v6 --- htdocs/compta/deplacement/card.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/deplacement/card.php b/htdocs/compta/deplacement/card.php index 6bc4f628ba9..aa315e5c854 100644 --- a/htdocs/compta/deplacement/card.php +++ b/htdocs/compta/deplacement/card.php @@ -276,7 +276,7 @@ if ($action == 'create') // Public note print ''; - print ''.$langs->trans('NotePublic').''; + print ''.$langs->trans('NotePublic').''; print ''; $doleditor = new DolEditor('note_public', GETPOST('note_public', 'alpha'), '', 200, 'dolibarr_notes', 'In', false, true, true, ROWS_8,'90%'); @@ -288,7 +288,7 @@ if ($action == 'create') if (empty($user->societe_id)) { print ''; - print ''.$langs->trans('NotePrivate').''; + print ''.$langs->trans('NotePrivate').''; print ''; $doleditor = new DolEditor('note_private', GETPOST('note_private', 'alpha'), '', 200, 'dolibarr_notes', 'In', false, true, true, ROWS_8, '90%'); From 30bc8b9a322cd4b88bef58bf58d0c18b9776d70b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 29 May 2017 11:00:36 +0200 Subject: [PATCH 285/299] Fix typo --- htdocs/langs/en_US/main.lang | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index a170bc3f6e1..96973ad1b46 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -741,8 +741,8 @@ Hello=Hello Sincerely=Sincerely DeleteLine=Delete line ConfirmDeleteLine=Are you sure you want to delete this line? -NoPDFAvailableForDocGenAmongChecked=No PDF were available for the document generation among checked records -TooManyRecordForMassAction=Too many record selected for mass action. The action is restricted to a list of %s records. +NoPDFAvailableForDocGenAmongChecked=No PDF were available for the document generation among checked record +TooManyRecordForMassAction=Too many record selected for mass action. The action is restricted to a list of %s record. NoRecordSelected=No record selected MassFilesArea=Area for files built by mass actions ShowTempMassFilesArea=Show area of files built by mass actions From 395d361d663420e1338f9ad6ce362c9dc098d12c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 29 May 2017 11:17:33 +0200 Subject: [PATCH 286/299] Look and feel v6 --- htdocs/accountancy/admin/account.php | 39 ++++++++------- htdocs/accountancy/admin/accountmodel.php | 50 +------------------ htdocs/accountancy/admin/categories_list.php | 7 +-- htdocs/accountancy/admin/defaultaccounts.php | 1 - htdocs/compta/paiement.php | 9 +++- htdocs/expensereport/payment/card.php | 1 + htdocs/expensereport/payment/payment.php | 52 ++++++++++++-------- htdocs/langs/en_US/accountancy.lang | 2 +- 8 files changed, 65 insertions(+), 96 deletions(-) diff --git a/htdocs/accountancy/admin/account.php b/htdocs/accountancy/admin/account.php index 62e35fa0f57..c2b6997d96e 100644 --- a/htdocs/accountancy/admin/account.php +++ b/htdocs/accountancy/admin/account.php @@ -55,7 +55,6 @@ if (! $user->rights->accounting->chartofaccount) accessforbidden(); $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit; $sortfield = GETPOST("sortfield", 'alpha'); $sortorder = GETPOST("sortorder", 'sortorder'); -$limit = GETPOST('limit') ? GETPOST('limit', 'int') : $conf->liste_limit; $page = GETPOST("page", 'int'); if ($page == - 1) { $page = 0; @@ -63,10 +62,8 @@ if ($page == - 1) { $offset = $limit * $page; $pageprev = $page - 1; $pagenext = $page + 1; -if (! $sortfield) - $sortfield = "aa.account_number"; -if (! $sortorder) - $sortorder = "ASC"; +if (! $sortfield) $sortfield = "aa.account_number"; +if (! $sortorder) $sortorder = "ASC"; $arrayfields=array( 'aa.account_number'=>array('label'=>$langs->trans("AccountNumber"), 'checked'=>1), @@ -79,6 +76,9 @@ $arrayfields=array( $accounting = new AccountingAccount($db); +// Initialize technical object to manage context to save list fields +$contextpage=GETPOST('contextpage','aZ')?GETPOST('contextpage','aZ'):'accountingaccountlist'; + /* * Actions @@ -145,6 +145,7 @@ if (empty($reshook)) /* * View */ + $form=new Form($db); llxHeader('', $langs->trans("ListAccounts")); @@ -170,7 +171,6 @@ if (strlen(trim($search_label))) $sql .= natural_search("aa.label", $search_la if (strlen(trim($search_accountparent))) $sql .= natural_search("aa.account_parent", $search_accountparent); if (strlen(trim($search_pcgtype))) $sql .= natural_search("aa.pcg_type", $search_pcgtype); if (strlen(trim($search_pcgsubtype))) $sql .= natural_search("aa.pcg_subtype", $search_pcgsubtype); - $sql .= $db->order($sortfield, $sortorder); // Count total nb of records @@ -192,22 +192,29 @@ if ($resql) $params=''; if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage; - if ($search_account) $params.= '&search_account='.urlencode($search_account); - if ($search_label) $params.= '&search_label='.urlencode($search_label); - if ($search_accountparent) $params.= '&search_accountparent='.urlencode($search_accountparent); - if ($search_pcgtype) $params.= '&search_pcgtype='.urlencode($search_pcgtype); - if ($search_pcgsubtype) $params.= '&search_pcgsubtype='.urlencode($search_pcgsubtype); + if ($search_account) $params.= '&search_account='.urlencode($search_account); + if ($search_label) $params.= '&search_label='.urlencode($search_label); + if ($search_accountparent) $params.= '&search_accountparent='.urlencode($search_accountparent); + if ($search_pcgtype) $params.= '&search_pcgtype='.urlencode($search_pcgtype); + if ($search_pcgsubtype) $params.= '&search_pcgsubtype='.urlencode($search_pcgsubtype); if ($optioncss != '') $param.='&optioncss='.$optioncss; - print ''; + print ''; + if ($optioncss != '') print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; $htmlbuttonadd = '' . $langs->trans("Addanaccount") . ''; print_barre_liste($langs->trans('ListAccounts'), $page, $_SERVER["PHP_SELF"], $params, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_accountancy', 0, $htmlbuttonadd); // Box to select active chart of account - $var = ! $var; print $langs->trans("Selectchartofaccounts") . " : "; print ''; } - elseif ($fieldlist[$field]=='unit') { - print ''; - $units = array( - 'mm' => $langs->trans('SizeUnitmm'), - 'cm' => $langs->trans('SizeUnitcm'), - 'point' => $langs->trans('SizeUnitpoint'), - 'inch' => $langs->trans('SizeUnitinch') - ); - print $form->selectarray('unit', $units, (! empty($obj->{$fieldlist[$field]})?$obj->{$fieldlist[$field]}:''), 0, 0, 0); - print ''; - } - // Le type de taxe locale - elseif ($fieldlist[$field] == 'localtax1_type' || $fieldlist[$field] == 'localtax2_type') - { - print ''; - print $form->selectarray($fieldlist[$field], $localtax_typeList, (! empty($obj->{$fieldlist[$field]})?$obj->{$fieldlist[$field]}:'')); - print ''; - } elseif ($fieldlist[$field] == 'accountancy_code' || $fieldlist[$field] == 'accountancy_code_sell' || $fieldlist[$field] == 'accountancy_code_buy') { print ''; diff --git a/htdocs/accountancy/admin/categories_list.php b/htdocs/accountancy/admin/categories_list.php index f3a35350084..e78737c3fb9 100644 --- a/htdocs/accountancy/admin/categories_list.php +++ b/htdocs/accountancy/admin/categories_list.php @@ -451,13 +451,8 @@ $formadmin=new FormAdmin($db); llxHeader(); -$titre=$langs->trans("DictionarySetup"); +$titre=$langs->trans($tablib[$id]); $linkback=''; -if ($id) -{ - $titre.=' - '.$langs->trans($tablib[$id]); - $linkback=''.$langs->trans("BackToDictionaryList").''; -} $titlepicto='title_setup'; print load_fiche_titre($titre,$linkback,$titlepicto); diff --git a/htdocs/accountancy/admin/defaultaccounts.php b/htdocs/accountancy/admin/defaultaccounts.php index c2a6453ffee..aaf98a0fa8b 100644 --- a/htdocs/accountancy/admin/defaultaccounts.php +++ b/htdocs/accountancy/admin/defaultaccounts.php @@ -122,7 +122,6 @@ $formaccounting = new FormAccounting($db); $linkback = ''; print load_fiche_titre($langs->trans('MenuDefaultAccounts'), $linkback, 'title_accountancy'); -print '
        '; print $langs->trans("DefaultBindingDesc").'
        '; print '
        '; diff --git a/htdocs/compta/paiement.php b/htdocs/compta/paiement.php index 0881ce061dc..cdc5eb2e545 100644 --- a/htdocs/compta/paiement.php +++ b/htdocs/compta/paiement.php @@ -309,9 +309,11 @@ if (empty($reshook)) * View */ +$form=new Form($db); + + llxHeader('', $langs->trans("Payment")); -$form=new Form($db); if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paiement') @@ -575,6 +577,7 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie //print ''; print '
        '; print ''; + print ''; print ''; print ''; @@ -741,11 +744,13 @@ if ($action == 'create' || $action == 'confirm_paiement' || $action == 'add_paie $totalrecudeposits+=$deposits; $i++; } + if ($i > 1) { // Print total print ''; - print ''; + print ''; + if (!empty($conf->multicurrency->enabled)) print ''; if (!empty($conf->multicurrency->enabled)) print ''; if (!empty($conf->multicurrency->enabled)) print ''; if (!empty($conf->multicurrency->enabled)) print ''; diff --git a/htdocs/expensereport/payment/card.php b/htdocs/expensereport/payment/card.php index de01f01a5df..ce6e0da8c5a 100644 --- a/htdocs/expensereport/payment/card.php +++ b/htdocs/expensereport/payment/card.php @@ -143,6 +143,7 @@ if ($action == 'valide') } +$linkback = ''; // $linkback = '' . $langs->trans("BackToList") . ''; dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', ''); diff --git a/htdocs/expensereport/payment/payment.php b/htdocs/expensereport/payment/payment.php index 40c4fad2513..cb81598fc83 100644 --- a/htdocs/expensereport/payment/payment.php +++ b/htdocs/expensereport/payment/payment.php @@ -30,7 +30,8 @@ require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; $langs->load("bills"); $langs->load("banks"); -$chid=GETPOST("id"); +$chid=GETPOST("id",'int'); +$ref=GETPOST('ref','alpha'); $action=GETPOST('action','aZ09'); $amounts = array(); $accountid=GETPOST('accountid','int'); @@ -59,7 +60,7 @@ if ($action == 'add_payment') } $expensereport = new ExpenseReport($db); - $expensereport->fetch($chid); + $expensereport->fetch($chid, $ref); $datepaid = dol_mktime(12, 0, 0, $_POST["remonth"], $_POST["reday"], $_POST["reyear"]); @@ -160,7 +161,7 @@ if ($action == 'add_payment') } } - $_GET["action"]='create'; + $action='create'; } @@ -174,10 +175,10 @@ $form=new Form($db); // Form to create expense report payment -if (GETPOST('action','aZ09') == 'create') +if ($action == 'create' || empty($action)) { $expensereport = new ExpenseReport($db); - $expensereport->fetch($chid); + $expensereport->fetch($chid, $ref); $total = $expensereport->total_ttc; @@ -189,15 +190,20 @@ if (GETPOST('action','aZ09') == 'create') print ''; print ''; - dol_fiche_head(); + dol_fiche_head(null, '0', '', -1); - print '
        '.$arraytitle.''.$langs->trans('Date').'
        '.$langs->trans('TotalTTC').''.$langs->trans('TotalTTC').'
        '; - - print ''; - - print ''; - print ''; - print ''; + $linkback = ''; + // $linkback = '' . $langs->trans("BackToList") . ''; + + dol_banner_tab($expensereport, 'ref', $linkback, 1, 'ref', 'ref', ''); + + print '
        '; + print '
        '; + + print '
        '.$langs->trans("ExpenseReport").'
        '.$langs->trans("Ref").''.$expensereport->ref.'
        '.$langs->trans("Period").''.get_date_range($expensereport->date_debut,$expensereport->date_fin,"",$langs,0).'
        '.$langs->trans("Amount").''.price($expensereport->total_ttc,0,$outputlangs,1,-1,-1,$conf->currency).'
        '."\n"; + + print ''; + print ''; $sql = "SELECT sum(p.amount) as total"; $sql.= " FROM ".MAIN_DB_PREFIX."payment_expensereport as p, ".MAIN_DB_PREFIX."expensereport as e"; @@ -210,14 +216,18 @@ if (GETPOST('action','aZ09') == 'create') $sumpaid = $obj->total; $db->free(); } - print ''; - print ''; + print ''; + print ''; - print ''; - print "'; - print ''; - - print '
        '.$langs->trans("Period").''.get_date_range($expensereport->date_debut,$expensereport->date_fin,"",$langs,0).'
        '.$langs->trans("Amount").''.price($expensereport->total_ttc,0,$outputlangs,1,-1,-1,$conf->currency).'
        '.$langs->trans("AlreadyPaid").''.price($sumpaid,0,$outputlangs,1,-1,-1,$conf->currency).'
        '.$langs->trans("RemainderToPay").''.price($total-$sumpaid,0,$outputlangs,1,-1,-1,$conf->currency).'
        '.$langs->trans("AlreadyPaid").''.price($sumpaid,0,$outputlangs,1,-1,-1,$conf->currency).'
        '.$langs->trans("RemainderToPay").''.price($total-$sumpaid,0,$outputlangs,1,-1,-1,$conf->currency).'
        ".$langs->trans("Payment").'
        '.$langs->trans("Date").''; + print '
        '; + + print '
        '; + + print '
        '; + + print ''."\n"; + + print '
        '.$langs->trans("Date").''; $datepaid = dol_mktime(12, 0, 0, $_POST["remonth"], $_POST["reday"], $_POST["reyear"]); $datepayment=empty($conf->global->MAIN_AUTOFILL_DATE)?(empty($_POST["remonth"])?-1:$datepaid):0; $form->select_date($datepayment,'','','','',"add_payment",1,1); @@ -251,6 +261,8 @@ if (GETPOST('action','aZ09') == 'create') print '
        '; + print ''; + dol_fiche_end(); // List of expenses ereport not already paid completely diff --git a/htdocs/langs/en_US/accountancy.lang b/htdocs/langs/en_US/accountancy.lang index 33434f03394..5f3d4eef2da 100644 --- a/htdocs/langs/en_US/accountancy.lang +++ b/htdocs/langs/en_US/accountancy.lang @@ -168,7 +168,7 @@ DescThirdPartyReport=Consult here the list of the third party customers and supp ListAccounts=List of the accounting accounts Pcgtype=Class of account -Pcgsubtype=Under class of account +Pcgsubtype=Subclass of account TotalVente=Total turnover before tax TotalMarge=Total sales margin From 3402718425cc8ba7cff570c8201cc2cdb9685a81 Mon Sep 17 00:00:00 2001 From: KHELIFA Date: Mon, 29 May 2017 11:58:16 +0200 Subject: [PATCH 287/299] Core Holiday: Add triggers for create, update and delete a holiday Fix the user parameter in the call of the create, update and delete functions of the class Holiday --- htdocs/holiday/card.php | 12 ++++++------ htdocs/holiday/class/holiday.class.php | 24 ++++++++++++++++++++++-- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/htdocs/holiday/card.php b/htdocs/holiday/card.php index ba4f210793e..e4c09546e6e 100644 --- a/htdocs/holiday/card.php +++ b/htdocs/holiday/card.php @@ -248,7 +248,7 @@ if ($action == 'update') $object->halfday = $halfday; // Update - $verif = $object->update($user->id); + $verif = $object->update($user); if ($verif > 0) { header('Location: '.$_SERVER["PHP_SELF"].'?id='.$object->id); @@ -285,7 +285,7 @@ if ($action == 'confirm_delete' && GETPOST('confirm') == 'yes' && $user->rights- // Si l'utilisateur à le droit de lire cette demande, il peut la supprimer if ($canedit) { - $result=$object->delete($object->id); + $result=$object->delete($user); } else { @@ -318,7 +318,7 @@ if ($action == 'confirm_send') { $object->statut = 2; - $verif = $object->update($user->id); + $verif = $object->update($user); // Si pas d'erreur SQL on redirige vers la fiche de la demande if ($verif > 0) @@ -419,7 +419,7 @@ if ($action == 'confirm_valid') $object->fk_user_valid = $user->id; $object->statut = 3; - $verif = $object->update($user->id); + $verif = $object->update($user); // Si pas d'erreur SQL on redirige vers la fiche de la demande if ($verif > 0) @@ -506,7 +506,7 @@ if ($action == 'confirm_refuse') $object->statut = 5; $object->detail_refuse = $_POST['detail_refuse']; - $verif = $object->update($user->id); + $verif = $object->update($user); // Si pas d'erreur SQL on redirige vers la fiche de la demande if ($verif > 0) @@ -586,7 +586,7 @@ if ($action == 'confirm_cancel' && GETPOST('confirm') == 'yes') $object->fk_user_cancel = $user->id; $object->statut = 4; - $result = $object->update($user->id); + $result = $object->update($user); if ($result >= 0 && $oldstatus == 3) // holiday was already validated, status 3, so we must increase back sold { diff --git a/htdocs/holiday/class/holiday.class.php b/htdocs/holiday/class/holiday.class.php index 5f244dcb9bf..ba36d911971 100644 --- a/htdocs/holiday/class/holiday.class.php +++ b/htdocs/holiday/class/holiday.class.php @@ -167,6 +167,14 @@ class Holiday extends CommonObject if (! $error) { $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX."holiday"); + + if (! $notrigger) + { + // Call trigger + $result=$this->call_trigger('HOLIDAY_CREATE',$user); + if ($result < 0) { $error++; } + // End call triggers + } } // Commit or rollback @@ -603,7 +611,13 @@ class Holiday extends CommonObject if (! $error) { - + if (! $notrigger) + { + // Call trigger + $result=$this->call_trigger('HOLIDAY_MODIFY',$user); + if ($result < 0) { $error++; } + // End call triggers + } } // Commit or rollback @@ -650,7 +664,13 @@ class Holiday extends CommonObject if (! $error) { - + if (! $notrigger) + { + // Call trigger + $result=$this->call_trigger('HOLIDAY_DELETE',$user); + if ($result < 0) { $error++; } + // End call triggers + } } // Commit or rollback From b74a0dd5fd448ea00985693a75f650d45a4e3771 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 29 May 2017 12:06:26 +0200 Subject: [PATCH 288/299] Look and feel v6 --- htdocs/accountancy/bookkeeping/balance.php | 6 +++--- htdocs/accountancy/expensereport/index.php | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/balance.php b/htdocs/accountancy/bookkeeping/balance.php index 3111707cff6..34db60f7a0f 100644 --- a/htdocs/accountancy/bookkeeping/balance.php +++ b/htdocs/accountancy/bookkeeping/balance.php @@ -98,7 +98,7 @@ if (! empty($search_accountancy_code_end)) { * Action */ -if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers +if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) // All tests are required to be compatible with all browsers { $search_accountancy_code_start = ''; $search_accountancy_code_end = ''; @@ -137,7 +137,7 @@ if ($action == 'export_csv') { } else { - $title_page = $langs->trans("AccountBalance") . ' ' . dol_print_date($search_date_start) . '-' . dol_print_date($search_date_end); + $title_page = $langs->trans("AccountBalance") . (($search_date_start || $search_date_end) ? ' ' . dol_print_date($search_date_start) . '-' . dol_print_date($search_date_end) : ''); llxHeader('', $title_page); @@ -160,7 +160,7 @@ else { print ''; $button = ''; - print_barre_liste($title_page, $page, $_SERVER["PHP_SELF"], $options, $sortfield, $sortorder, '', $result, 0, 'title_accountancy', 0, $button); + print_barre_liste($title_page, $page, $_SERVER["PHP_SELF"], $options, $sortfield, $sortorder, '', $result, $result, 'title_accountancy', 0, $button); $moreforfilter = ''; diff --git a/htdocs/accountancy/expensereport/index.php b/htdocs/accountancy/expensereport/index.php index a38194356bd..c062d4e09c2 100644 --- a/htdocs/accountancy/expensereport/index.php +++ b/htdocs/accountancy/expensereport/index.php @@ -167,7 +167,7 @@ print '
        '; //print '
        '; // TODO Remove this. Should be done always. -if ($conf->global->MAIN_FEATURES_LEVEL > 0) print '' . $langs->trans("CleanFixHistory", $year_current) . ''; +if ($conf->global->MAIN_FEATURES_LEVEL > 1) print '' . $langs->trans("CleanFixHistory", $year_current) . ''; //print '
        '; From 6f723490c25291435ebb50495925139d7ff48214 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 29 May 2017 12:58:23 +0200 Subject: [PATCH 289/299] Fix syntax error --- htdocs/core/menus/standard/eldy.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index 54fdae3aba0..6248f294476 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -802,7 +802,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu $langs->load("bills"); $newmenu->add("/compta/facture/list.php?leftmenu=customers_bills",$langs->trans("BillsCustomers"),0,$user->rights->facture->lire, '', $mainmenu, 'customers_bills'); $newmenu->add("/compta/facture/card.php?action=create",$langs->trans("NewBill"),1,$user->rights->facture->creer); - $newmenu->add("/compta/facture/list.php?leftmenu=customers_bills",$langs->trans("List"),1,$user->rights->facture->lire'customers_bills_list'); + $newmenu->add("/compta/facture/list.php?leftmenu=customers_bills",$langs->trans("List"),1,$user->rights->facture->lire, '', $mainmenu, 'customers_bills_list'); if ($usemenuhider || empty($leftmenu) || preg_match('/customers_bills/', $leftmenu)) { From 7066ec7dabeb311880b18afd755dc7d52628afda Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 29 May 2017 13:19:45 +0200 Subject: [PATCH 290/299] NEW Can clone expense report on another user --- htdocs/expensereport/card.php | 38 ++++++++++--------- .../class/expensereport.class.php | 12 +++--- htdocs/expensereport/payment/payment.php | 9 ++--- htdocs/langs/en_US/main.lang | 1 + htdocs/langs/en_US/trips.lang | 2 +- 5 files changed, 32 insertions(+), 30 deletions(-) diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php index 1dbcbfc1335..dff27139581 100644 --- a/htdocs/expensereport/card.php +++ b/htdocs/expensereport/card.php @@ -156,10 +156,10 @@ if (empty($reshook)) { if ($object->id > 0) { - // Because createFromClone modifies the object, we must clone it so that we can restore it later + // Because createFromClone modifies the object, we must clone it so that we can restore it later if it fails $orig = clone $object; - $result=$object->createFromClone($socid); + $result=$object->createFromClone(GETPOST('fk_user_author','int')); if ($result > 0) { header("Location: ".$_SERVER['PHP_SELF'].'?id='.$result); @@ -1448,8 +1448,11 @@ else print ''.$langs->trans("User").''; print ''; $userfee=new User($db); - $userfee->fetch($object->fk_user_author); - print $userfee->getNomUrl(-1); + if ($object->fk_user_author > 0) + { + $userfee->fetch($object->fk_user_author); + print $userfee->getNomUrl(-1); + } print ''; // Ref @@ -1536,12 +1539,11 @@ else // Clone confirmation if ($action == 'clone') { // Create an array for form + $criteriaforfilter='hierarchyme'; + if (! empty($user->rights->expensereport->readall)) $criteriaforfilter=''; $formquestion = array( - // 'text' => $langs->trans("ConfirmClone"), - // array('type' => 'checkbox', 'name' => 'clone_content', 'label' => $langs->trans("CloneMainAttributes"), 'value' => - // 1), - // array('type' => 'checkbox', 'name' => 'update_prices', 'label' => $langs->trans("PuttingPricesUpToDate"), 'value' - // => 1), + 'text' => '', + array('type' => 'other','name' => 'fk_user_author','label' => $langs->trans("SelectTargetUser"),'value' => $form->select_dolusers((GETPOST('fk_user_author', 'int')> 0 ? GETPOST('fk_user_author', 'int') : $user->id), 'fk_user_author', 0, null, 0, $criteriaforfilter)) ); // Paiement incomplet. On demande si motif = escompte ou autre $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"] . '?id=' . $object->id, $langs->trans('CloneExpenseReport'), $langs->trans('ConfirmCloneExpenseReport', $object->ref), 'confirm_clone', $formquestion, 'yes', 1); @@ -1658,7 +1660,7 @@ else $userauthor=new User($db); $result=$userauthor->fetch($object->fk_user_author); if ($result < 0) dol_print_error('',$userauthor->error); - print $userauthor->getNomUrl(-1); + elseif ($result > 0) print $userauthor->getNomUrl(-1); } print ''; @@ -1694,8 +1696,8 @@ else if ($object->fk_user_validator > 0) { $userfee=new User($db); - $userfee->fetch($object->fk_user_validator); - print $userfee->getNomUrl(-1); + $result = $userfee->fetch($object->fk_user_validator); + if ($result > 0) print $userfee->getNomUrl(-1); if (empty($userfee->email) || ! isValidEmail($userfee->email)) { $langs->load("errors"); @@ -1712,8 +1714,8 @@ else if ($object->fk_user_cancel > 0) { $userfee=new User($db); - $userfee->fetch($object->fk_user_cancel); - print $userfee->getNomUrl(-1); + $result = $userfee->fetch($object->fk_user_cancel); + if ($result > 0) print $userfee->getNomUrl(-1); } print ''; @@ -1734,8 +1736,8 @@ else if ($object->fk_user_approve > 0) { $userapp=new User($db); - $userapp->fetch($object->fk_user_approve); - print $userapp->getNomUrl(-1); + $result = $userapp->fetch($object->fk_user_approve); + if ($result > 0) print $userapp->getNomUrl(-1); } print ''; @@ -1751,8 +1753,8 @@ else print ''.$langs->trans("REFUSEUR").''; print ''; $userfee=new User($db); - $userfee->fetch($object->fk_user_refuse); - print $userfee->getNomUrl(-1); + $result = $userfee->fetch($object->fk_user_refuse); + if ($result > 0) print $userfee->getNomUrl(-1); print ''; print ''; diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php index eb16583df26..d62de0596e1 100644 --- a/htdocs/expensereport/class/expensereport.class.php +++ b/htdocs/expensereport/class/expensereport.class.php @@ -256,17 +256,19 @@ class ExpenseReport extends CommonObject /** * Load an object from its id and create a new one in database * - * @param int $socid Id of thirdparty - * @return int New id of clone + * @param int $fk_user_author Id of new user + * @return int New id of clone */ - function createFromClone($socid=0) + function createFromClone($fk_user_author) { global $user,$hookmanager; $error=0; + if (empty($fk_user_author)) $fk_user_author = $user->id; + $this->context['createfromclone'] = 'createfromclone'; - + $this->db->begin(); // get extrafields so they will be clone @@ -282,7 +284,7 @@ class ExpenseReport extends CommonObject $this->fk_statut=0; // Clear fields - $this->fk_user_author = $user->id; // Note fk_user_author is not the 'author' but the guy the expense report is for. + $this->fk_user_author = $fk_user_author; // Note fk_user_author is not the 'author' but the guy the expense report is for. $this->fk_user_valid = ''; $this->date_create = ''; $this->date_creation = ''; diff --git a/htdocs/expensereport/payment/payment.php b/htdocs/expensereport/payment/payment.php index cb81598fc83..fdac304ffcb 100644 --- a/htdocs/expensereport/payment/payment.php +++ b/htdocs/expensereport/payment/payment.php @@ -29,6 +29,7 @@ require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; $langs->load("bills"); $langs->load("banks"); +$langs->load("trips"); $chid=GETPOST("id",'int'); $ref=GETPOST('ref','alpha'); @@ -285,16 +286,11 @@ if ($action == 'create' || empty($action)) { $objp = $expensereport; - - print ''; print ''.price($objp->total_ttc).""; - print ''.price($sumpaid).""; - print ''.price($objp->total_ttc - $sumpaid).""; - print ''; if ($sumpaid < $objp->total_ttc) { @@ -308,6 +304,7 @@ if ($action == 'create' || empty($action)) print ""; print "\n"; + $total+=$objp->total; $total_ttc+=$objp->total_ttc; $totalrecu+=$objp->am; @@ -316,7 +313,7 @@ if ($action == 'create' || empty($action)) if ($i > 1) { // Print total - print ""; + print ''; print ''.$langs->trans("Total").':'; print "".price($total_ttc).""; print "".price($totalrecu).""; diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 96973ad1b46..1ff0b9a9aa4 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -715,6 +715,7 @@ from=from toward=toward Access=Access SelectAction=Select action +SelectTargetUser=Select target user/employee HelpCopyToClipboard=Use Ctrl+C to copy to clipboard SaveUploadedFileWithMask=Save file on server with name "%s" (otherwise "%s") OriginFileName=Original filename diff --git a/htdocs/langs/en_US/trips.lang b/htdocs/langs/en_US/trips.lang index 9c6902d3279..a51a392499b 100644 --- a/htdocs/langs/en_US/trips.lang +++ b/htdocs/langs/en_US/trips.lang @@ -88,5 +88,5 @@ NoTripsToExportCSV=No expense report to export for this period. ExpenseReportPayment=Expense report payment ExpenseReportsToApprove=Expense reports to approve ExpenseReportsToPay=Expense reports to pay -CloneExpenseReport=Clone expese report +CloneExpenseReport=Clone expense report ConfirmCloneExpenseReport=Are you sure you want to clone this expense report ? \ No newline at end of file From c26e072694190a73800268c25b178a4c541a3f6a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 29 May 2017 13:29:27 +0200 Subject: [PATCH 291/299] Code comment --- test/phpunit/CodingPhpTest.php | 1 + 1 file changed, 1 insertion(+) diff --git a/test/phpunit/CodingPhpTest.php b/test/phpunit/CodingPhpTest.php index 159323a9e83..dbd02ffdfc9 100644 --- a/test/phpunit/CodingPhpTest.php +++ b/test/phpunit/CodingPhpTest.php @@ -157,6 +157,7 @@ class CodingPhpTest extends PHPUnit_Framework_TestCase $ok=true; $matches=array(); + // Check string ='".$this->xxx with xxx that is not 'escape'. It means we forget a db->escape when forging sql request. preg_match_all('/=\s*\'"\s*\.\s*\$this->(....)/', $filecontent, $matches, PREG_SET_ORDER); foreach($matches as $key => $val) { From 85e0ded5736742b376352536db6d88047afe26fc Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 29 May 2017 13:35:51 +0200 Subject: [PATCH 292/299] FIX #6881 --- htdocs/install/upgrade2.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/htdocs/install/upgrade2.php b/htdocs/install/upgrade2.php index 4646c3b6eb9..264a45bca91 100644 --- a/htdocs/install/upgrade2.php +++ b/htdocs/install/upgrade2.php @@ -468,11 +468,11 @@ if (! GETPOST('action','aZ09') || preg_match('/upgrade/i',GETPOST('action','aZ09 $db->close(); - // Actions for all version (not in database) + // Actions for all versions (not in database) migrate_delete_old_files($db, $langs, $conf); - migrate_delete_old_dir($db, $langs, $conf); + dol_mkdir(DOL_DATA_ROOT.'/bank'); migrate_directories($db, $langs, $conf, '/banque/bordereau', '/bank/checkdeposits'); } @@ -3941,7 +3941,11 @@ function migrate_delete_old_files($db,$langs,$conf) DOL_DOCUMENT_ROOT.'/core/modules/mailings/poire.modules.php', DOL_DOCUMENT_ROOT.'/core/modules/mailings/kiwi.modules.php', DOL_DOCUMENT_ROOT.'/core/modules/facture/pdf_crabe.modules.php', - DOL_DOCUMENT_ROOT.'/core/modules/facture/pdf_oursin.modules.php' + DOL_DOCUMENT_ROOT.'/core/modules/facture/pdf_oursin.modules.php', + + DOL_DOCUMENT_ROOT.'/compta/facture/class/api_invoice.class.php', + DOL_DOCUMENT_ROOT.'/commande/class/api_commande.class.php', + DOL_DOCUMENT_ROOT.'/user/class/api_user.class.php' ); foreach ($filetodeletearray as $filetodelete) From 482494236971b600f7776761161a2cb484eff179 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 29 May 2017 13:39:07 +0200 Subject: [PATCH 293/299] FIX #6877 --- htdocs/install/mysql/migration/5.0.0-6.0.0.sql | 1 + htdocs/install/mysql/tables/llx_projet.sql | 1 + 2 files changed, 2 insertions(+) diff --git a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql index 85c1ff61017..f8b638b079a 100644 --- a/htdocs/install/mysql/migration/5.0.0-6.0.0.sql +++ b/htdocs/install/mysql/migration/5.0.0-6.0.0.sql @@ -104,6 +104,7 @@ ALTER TABLE llx_c_email_templates ADD COLUMN content_lines text; ALTER TABLE llx_loan ADD COLUMN fk_projet integer DEFAULT NULL; ALTER TABLE llx_holiday ADD COLUMN fk_user_modif integer; +ALTER TABLE llx_projet ADD COLUMN fk_user_modif integer; ALTER TABLE llx_projet_task_time ADD COLUMN datec date; ALTER TABLE llx_projet_task_time ADD COLUMN tms timestamp; diff --git a/htdocs/install/mysql/tables/llx_projet.sql b/htdocs/install/mysql/tables/llx_projet.sql index d50547b711b..8ca404d3a0e 100644 --- a/htdocs/install/mysql/tables/llx_projet.sql +++ b/htdocs/install/mysql/tables/llx_projet.sql @@ -30,6 +30,7 @@ create table llx_projet title varchar(255) NOT NULL, description text, fk_user_creat integer NOT NULL, -- createur du projet + fk_user_modif integer, public integer, -- project is public or not fk_statut integer DEFAULT 0 NOT NULL, -- open or close fk_opp_status integer DEFAULT NULL, -- if project is used to manage opportunities From ae6c58fb579c25e13580728d5162f758fcd0ab4c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 29 May 2017 14:16:09 +0200 Subject: [PATCH 294/299] FIX #6808 --- htdocs/compta/facture/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/facture/card.php b/htdocs/compta/facture/card.php index e6278d1fc6a..b739e551b9d 100644 --- a/htdocs/compta/facture/card.php +++ b/htdocs/compta/facture/card.php @@ -4186,7 +4186,7 @@ else if ($id > 0 || ! empty($ref)) { if (! $objectidnext && count($object->lines) > 0) { - print ''; + print ''; } } From c71488e58bb3beddd2b3c161a6f770e85ce8111e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 29 May 2017 15:09:13 +0200 Subject: [PATCH 295/299] Removed deprecated code --- htdocs/core/lib/security2.lib.php | 1 - htdocs/core/lib/usergroups.lib.php | 1 - htdocs/main.inc.php | 7 ++++--- htdocs/user/passwordforgotten.php | 1 - 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/htdocs/core/lib/security2.lib.php b/htdocs/core/lib/security2.lib.php index b6b8d4ddd72..3f41e74b7f6 100644 --- a/htdocs/core/lib/security2.lib.php +++ b/htdocs/core/lib/security2.lib.php @@ -156,7 +156,6 @@ function dol_loginfunction($langs,$conf,$mysoc) // Note: $conf->css looks like '/theme/eldy/style.css.php' $conf->css = "/theme/".(GETPOST('theme','alpha')?GETPOST('theme','alpha'):$conf->theme)."/style.css.php"; - //$themepath=dol_buildpath((empty($conf->global->MAIN_FORCETHEMEDIR)?'':$conf->global->MAIN_FORCETHEMEDIR).$conf->css,1); $themepath=dol_buildpath($conf->css,1); if (! empty($conf->modules_parts['theme'])) // Using this feature slow down application { diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php index 3086e7d264a..1c919237f44 100644 --- a/htdocs/core/lib/usergroups.lib.php +++ b/htdocs/core/lib/usergroups.lib.php @@ -326,7 +326,6 @@ function show_theme($fuser,$edit=0,$foruserprofile=false) $formother = new FormOther($db); - //$dirthemes=array(empty($conf->global->MAIN_FORCETHEMEDIR)?'/theme':$conf->global->MAIN_FORCETHEMEDIR.'/theme'); $dirthemes=array('/theme'); if (! empty($conf->modules_parts['theme'])) // Using this feature slow down application { diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index da9e65f47ce..730c2caba4a 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1005,8 +1005,10 @@ function top_httphead($contenttype='text/html') if ($contenttype == 'text/html' ) header("Content-Type: text/html; charset=".$conf->file->character_set_client); else header("Content-Type: ".$contenttype); - header("X-Content-Type-Options: nosniff"); - header("X-Frame-Options: SAMEORIGIN"); + // Security options + header("X-Content-Type-Options: nosniff"); // With the nosniff option, if the server says the content is text/html, the browser will render it as text/html (note that most browsers now force this option to on) + header("X-Frame-Options: SAMEORIGIN"); // Frames allowed only if on same domain (stop some XSS attacks) + // TODO Content-Security-Policy // On the fly GZIP compression for all pages (if browser support it). Must set the bit 3 of constant to 1. /*if (isset($conf->global->MAIN_OPTIMIZE_SPEED) && ($conf->global->MAIN_OPTIMIZE_SPEED & 0x04)) { @@ -1121,7 +1123,6 @@ function top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs print ''."\n"; // Output style sheets (optioncss='print' or ''). Note: $conf->css looks like '/theme/eldy/style.css.php' - //$themepath=dol_buildpath((empty($conf->global->MAIN_FORCETHEMEDIR)?'':$conf->global->MAIN_FORCETHEMEDIR).$conf->css,1); $themepath=dol_buildpath($conf->css,1); $themesubdir=''; if (! empty($conf->modules_parts['theme'])) // This slow down diff --git a/htdocs/user/passwordforgotten.php b/htdocs/user/passwordforgotten.php index 6530a4f8536..0e906fe0738 100644 --- a/htdocs/user/passwordforgotten.php +++ b/htdocs/user/passwordforgotten.php @@ -173,7 +173,6 @@ else // Note: $conf->css looks like '/theme/eldy/style.css.php' $conf->css = "/theme/".(GETPOST('theme','alpha')?GETPOST('theme','alpha'):$conf->theme)."/style.css.php"; -//$themepath=dol_buildpath((empty($conf->global->MAIN_FORCETHEMEDIR)?'':$conf->global->MAIN_FORCETHEMEDIR).$conf->css,1); $themepath=dol_buildpath($conf->css,1); if (! empty($conf->modules_parts['theme'])) // This slow down { From 400b3320aa60ecd2255278fe66555febaeeb8cad Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 29 May 2017 15:20:50 +0200 Subject: [PATCH 296/299] NEW Introduction option MAIN_HTTP_CONTENT_SECURITY_POLICY --- htdocs/main.inc.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 730c2caba4a..26f455131cd 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1008,7 +1008,15 @@ function top_httphead($contenttype='text/html') // Security options header("X-Content-Type-Options: nosniff"); // With the nosniff option, if the server says the content is text/html, the browser will render it as text/html (note that most browsers now force this option to on) header("X-Frame-Options: SAMEORIGIN"); // Frames allowed only if on same domain (stop some XSS attacks) - // TODO Content-Security-Policy + if (! empty($conf->global->MAIN_HTTP_CONTENT_SECURITY_POLICY)) + { + // For example, to restrict script, object, frames or img to some domains + // script-src https://api.google.com https://anotherhost.com; object-src https://youtube.com; child-src https://youtube.com; img-src: https://static.example.com + // For example, to restrict everything to one domain, except object, ... + // default-src https://cdn.example.net; object-src 'none' + header("Content-Security-Policy: ".$conf->global->MAIN_HTTP_CONTENT_SECURITY_POLICY); + } + // On the fly GZIP compression for all pages (if browser support it). Must set the bit 3 of constant to 1. /*if (isset($conf->global->MAIN_OPTIMIZE_SPEED) && ($conf->global->MAIN_OPTIMIZE_SPEED & 0x04)) { From 59ab9a442199d1907543c833c76f9c57fc4b8171 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 29 May 2017 15:25:37 +0200 Subject: [PATCH 297/299] FIX #6850 --- htdocs/admin/bank.php | 2 +- htdocs/admin/bank_extrafields.php | 2 +- htdocs/admin/chequereceipts.php | 5 +++-- htdocs/admin/commande.php | 1 + htdocs/admin/contract.php | 1 + htdocs/admin/expedition.php | 1 + htdocs/admin/expensereport.php | 1 + htdocs/admin/facture.php | 1 + htdocs/admin/fichinter.php | 1 + htdocs/admin/livraison.php | 1 + htdocs/admin/propal.php | 1 + htdocs/admin/supplier_invoice.php | 1 + htdocs/admin/supplier_order.php | 1 + htdocs/admin/supplier_proposal.php | 1 + 14 files changed, 16 insertions(+), 4 deletions(-) diff --git a/htdocs/admin/bank.php b/htdocs/admin/bank.php index 8ed1e3cd9ac..afe60acff2e 100644 --- a/htdocs/admin/bank.php +++ b/htdocs/admin/bank.php @@ -166,7 +166,7 @@ $linkback=''.$langs->trans("BackToM print load_fiche_titre($langs->trans("BankSetupModule"),$linkback,'title_setup'); $head = bank_admin_prepare_head(null); -dol_fiche_head($head, 'general', $langs->trans("BankSetupModule"), 0, 'account'); +dol_fiche_head($head, 'general', $langs->trans("BankSetupModule"), -1, 'account'); $var=true; diff --git a/htdocs/admin/bank_extrafields.php b/htdocs/admin/bank_extrafields.php index 2d03c51e34d..794483350f1 100644 --- a/htdocs/admin/bank_extrafields.php +++ b/htdocs/admin/bank_extrafields.php @@ -71,7 +71,7 @@ print load_fiche_titre($langs->trans("BankSetupModule"),$linkback,'title_setup') $head = bank_admin_prepare_head(null); -dol_fiche_head($head, 'attributes', $langs->trans("BankSetupModule"), 0, 'account'); +dol_fiche_head($head, 'attributes', $langs->trans("BankSetupModule"), -1, 'account'); require DOL_DOCUMENT_ROOT.'/core/tpl/admin_extrafields_view.tpl.php'; diff --git a/htdocs/admin/chequereceipts.php b/htdocs/admin/chequereceipts.php index fd1da0c328b..bc55eb4b9f6 100644 --- a/htdocs/admin/chequereceipts.php +++ b/htdocs/admin/chequereceipts.php @@ -27,6 +27,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/bank.lib.php'; require_once DOL_DOCUMENT_ROOT.'/compta/paiement/cheque/class/remisecheque.class.php'; @@ -71,7 +72,7 @@ if ($action == 'updateMask') if ($action == 'setmod') { - dolibarr_set_const($db, "CHEQUERECEIPTS_ADDON",$value,'chaine',0,'',$conf->entity); + dolibarr_set_const($db, "CHEQUERECEIPTS_ADDON",$value, 'chaine', 0, '', $conf->entity); } if ($action == 'set_BANK_CHEQUERECEIPT_FREE_TEXT') @@ -105,7 +106,7 @@ $linkback=''.$langs->trans("BackToM print load_fiche_titre($langs->trans("BankSetupModule"),$linkback,'title_setup'); $head = bank_admin_prepare_head(null); -dol_fiche_head($head, 'checkreceipts', $langs->trans("BankSetupModule"), 0, 'account'); +dol_fiche_head($head, 'checkreceipts', $langs->trans("BankSetupModule"), -1, 'account'); /* * Numbering module diff --git a/htdocs/admin/commande.php b/htdocs/admin/commande.php index a4680f4d16e..d60144a3492 100644 --- a/htdocs/admin/commande.php +++ b/htdocs/admin/commande.php @@ -32,6 +32,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; require_once DOL_DOCUMENT_ROOT.'/commande/class/commande.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/order.lib.php'; diff --git a/htdocs/admin/contract.php b/htdocs/admin/contract.php index 37c0b9bccde..4c0a9572761 100644 --- a/htdocs/admin/contract.php +++ b/htdocs/admin/contract.php @@ -24,6 +24,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; require_once DOL_DOCUMENT_ROOT.'/contrat/class/contrat.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/contract.lib.php'; diff --git a/htdocs/admin/expedition.php b/htdocs/admin/expedition.php index d31b788a1ab..3c89960ede6 100644 --- a/htdocs/admin/expedition.php +++ b/htdocs/admin/expedition.php @@ -30,6 +30,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/expedition.lib.php'; require_once DOL_DOCUMENT_ROOT.'/expedition/class/expedition.class.php'; diff --git a/htdocs/admin/expensereport.php b/htdocs/admin/expensereport.php index b8626827595..eefe5747abd 100644 --- a/htdocs/admin/expensereport.php +++ b/htdocs/admin/expensereport.php @@ -30,6 +30,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/expensereport.lib.php'; require_once DOL_DOCUMENT_ROOT.'/expensereport/class/expensereport.class.php'; diff --git a/htdocs/admin/facture.php b/htdocs/admin/facture.php index d89c9711e3f..77230dc3f68 100644 --- a/htdocs/admin/facture.php +++ b/htdocs/admin/facture.php @@ -29,6 +29,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/invoice.lib.php'; require_once DOL_DOCUMENT_ROOT.'/compta/facture/class/facture.class.php'; diff --git a/htdocs/admin/fichinter.php b/htdocs/admin/fichinter.php index d99fd9456d9..3ce82ce59cb 100644 --- a/htdocs/admin/fichinter.php +++ b/htdocs/admin/fichinter.php @@ -30,6 +30,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/fichinter.lib.php'; require_once DOL_DOCUMENT_ROOT.'/fichinter/class/fichinter.class.php'; diff --git a/htdocs/admin/livraison.php b/htdocs/admin/livraison.php index 143c54ec24d..74081266f43 100644 --- a/htdocs/admin/livraison.php +++ b/htdocs/admin/livraison.php @@ -30,6 +30,7 @@ */ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/expedition.lib.php'; require_once DOL_DOCUMENT_ROOT.'/livraison/class/livraison.class.php'; diff --git a/htdocs/admin/propal.php b/htdocs/admin/propal.php index 6a9884e263c..7c8413a28a6 100644 --- a/htdocs/admin/propal.php +++ b/htdocs/admin/propal.php @@ -30,6 +30,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; require_once DOL_DOCUMENT_ROOT.'/comm/propal/class/propal.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/propal.lib.php'; $langs->load("admin"); diff --git a/htdocs/admin/supplier_invoice.php b/htdocs/admin/supplier_invoice.php index de128184d18..d408657ac8c 100644 --- a/htdocs/admin/supplier_invoice.php +++ b/htdocs/admin/supplier_invoice.php @@ -29,6 +29,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/fourn.lib.php'; require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php'; require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; diff --git a/htdocs/admin/supplier_order.php b/htdocs/admin/supplier_order.php index 030a507ce20..acce3a38c7c 100644 --- a/htdocs/admin/supplier_order.php +++ b/htdocs/admin/supplier_order.php @@ -29,6 +29,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/fourn.lib.php'; require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.class.php'; require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.commande.class.php'; diff --git a/htdocs/admin/supplier_proposal.php b/htdocs/admin/supplier_proposal.php index 8fc0c4877c8..8a8d2a181a4 100644 --- a/htdocs/admin/supplier_proposal.php +++ b/htdocs/admin/supplier_proposal.php @@ -25,6 +25,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/pdf.lib.php'; require_once DOL_DOCUMENT_ROOT.'/supplier_proposal/class/supplier_proposal.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/supplier_proposal.lib.php'; $langs->load("admin"); From ad656e6d35a20daa658b966c9a526acdd7aeaced Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 29 May 2017 15:34:00 +0200 Subject: [PATCH 298/299] Look and feel v6 --- htdocs/margin/admin/margin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/margin/admin/margin.php b/htdocs/margin/admin/margin.php index 8f39f695952..1918a9aa137 100644 --- a/htdocs/margin/admin/margin.php +++ b/htdocs/margin/admin/margin.php @@ -119,7 +119,7 @@ print load_fiche_titre($langs->trans("margesSetup"),$linkback,'title_setup'); $head = marges_admin_prepare_head(); -dol_fiche_head($head, 'parameters', $langs->trans("Margins"), 0, 'margin'); +dol_fiche_head($head, 'parameters', $langs->trans("Margins"), -1, 'margin'); print load_fiche_titre($langs->trans("MemberMainOptions"),'',''); print ''; From df729d8889196cb7c30fd5efea1755342438e348 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 29 May 2017 19:28:43 +0200 Subject: [PATCH 299/299] Fix travis --- htdocs/core/class/html.form.class.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 640c784436a..cf6ae18f568 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -5017,16 +5017,10 @@ class Form * @param string $sort 'ASC' or 'DESC' = Sort on label, '' or 'NONE' or 'POS' = Do not sort, we keep original order * @param string $morecss Add more class to css styles * @param int $addjscombo Add js combo -<<<<<<< HEAD * @param string $moreparamonempty Add more param on the empty option line. Not used if show_empty not set * @param int $disablebademail Check if an email is found into value and if not disable and colorize entry * @param int $nohtmlescape No html escaping. - * @return string HTML select string -======= - * @param string $moreparamonempty Add more param on the empty option line. Not used if show_empty not set. - * @param int $disablebademail Check if an email is found into value and if not disable and colorize entry. * @return string HTML select string. ->>>>>>> branch '5.0' of git@github.com:Dolibarr/dolibarr.git * @see multiselectarray */ static function selectarray($htmlname, $array, $id='', $show_empty=0, $key_in_label=0, $value_as_key=0, $moreparam='', $translate=0, $maxlen=0, $disabled=0, $sort='', $morecss='', $addjscombo=0, $moreparamonempty='',$disablebademail=0, $nohtmlescape=0)