From 33251fc97e14af5a1cc27d9ccb35c5ff4ae528e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 1 Aug 2016 11:09:11 +0200 Subject: [PATCH 01/41] FIX #4608 [Debian] Don't hard depend on mysql-server Allows using a separate MySQL server and switching to MariaDB. --- build/debian/control | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build/debian/control b/build/debian/control index 9a76856505a..d5c4a913713 100755 --- a/build/debian/control +++ b/build/debian/control @@ -26,11 +26,11 @@ Depends: libapache2-mod-php5 | libapache2-mod-php5filter | php5-cgi | php5-fpm | # Misc dependencies # fonts-dejavu-core | ttf-dejavu-core, xdg-utils, - mysql-server, - mysql-client, + virtual-mysql-client, ${misc:Depends}, ${perl:Depends} -Recommends: apache2 | lighttpd | httpd +Recommends: apache2 | lighttpd | httpd, + virtual-mysql-server Suggests: www-browser, php5-geoip Description: Web based software to manage a company or foundation Dolibarr ERP & CRM is an easy to use open source/free software package for From 49cb61b53029cdb8582488f3b50bf9d800dda2d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 16 Aug 2016 02:55:18 +0200 Subject: [PATCH 02/41] CLOSE #5627 Allowed external logging modules. Removed Sentry logging. --- composer.json | 107 +++++----- htdocs/admin/syslog.php | 45 ++-- htdocs/core/class/conf.class.php | 68 +++--- .../core/modules/syslog/mod_syslog_sentry.php | 195 ------------------ htdocs/langs/ar_SA/admin.lang | 2 - htdocs/langs/bg_BG/admin.lang | 2 - htdocs/langs/bn_BD/admin.lang | 2 - htdocs/langs/bs_BA/admin.lang | 2 - htdocs/langs/ca_ES/admin.lang | 2 - htdocs/langs/cs_CZ/admin.lang | 2 - htdocs/langs/da_DK/admin.lang | 2 - htdocs/langs/de_DE/admin.lang | 2 - htdocs/langs/el_GR/admin.lang | 2 - htdocs/langs/en_US/admin.lang | 2 - htdocs/langs/es_ES/admin.lang | 2 - htdocs/langs/et_EE/admin.lang | 2 - htdocs/langs/eu_ES/admin.lang | 2 - htdocs/langs/fa_IR/admin.lang | 2 - htdocs/langs/fi_FI/admin.lang | 2 - htdocs/langs/fr_FR/admin.lang | 2 - htdocs/langs/he_IL/admin.lang | 2 - htdocs/langs/hr_HR/admin.lang | 2 - htdocs/langs/hu_HU/admin.lang | 2 - htdocs/langs/id_ID/admin.lang | 2 - htdocs/langs/is_IS/admin.lang | 2 - htdocs/langs/it_IT/admin.lang | 2 - htdocs/langs/ja_JP/admin.lang | 2 - htdocs/langs/ka_GE/admin.lang | 2 - htdocs/langs/kn_IN/admin.lang | 2 - htdocs/langs/ko_KR/admin.lang | 2 - htdocs/langs/lo_LA/admin.lang | 2 - htdocs/langs/lt_LT/admin.lang | 2 - htdocs/langs/lv_LV/admin.lang | 2 - htdocs/langs/mk_MK/admin.lang | 2 - htdocs/langs/nb_NO/admin.lang | 2 - htdocs/langs/nl_NL/admin.lang | 2 - htdocs/langs/pl_PL/admin.lang | 2 - htdocs/langs/pt_BR/admin.lang | 1 - htdocs/langs/pt_PT/admin.lang | 2 - htdocs/langs/ro_RO/admin.lang | 2 - htdocs/langs/ru_RU/admin.lang | 2 - htdocs/langs/sk_SK/admin.lang | 2 - htdocs/langs/sl_SI/admin.lang | 2 - htdocs/langs/sq_AL/admin.lang | 2 - htdocs/langs/sr_RS/admin.lang | 2 - htdocs/langs/sv_SE/admin.lang | 2 - htdocs/langs/sw_SW/admin.lang | 2 - htdocs/langs/th_TH/admin.lang | 2 - htdocs/langs/tr_TR/admin.lang | 2 - htdocs/langs/uk_UA/admin.lang | 2 - htdocs/langs/uz_UZ/admin.lang | 2 - htdocs/langs/vi_VN/admin.lang | 2 - htdocs/langs/zh_CN/admin.lang | 2 - htdocs/langs/zh_TW/admin.lang | 2 - htdocs/main.inc.php | 27 --- 55 files changed, 124 insertions(+), 417 deletions(-) delete mode 100644 htdocs/core/modules/syslog/mod_syslog_sentry.php diff --git a/composer.json b/composer.json index fb3109fbc40..c6a8999a3ac 100644 --- a/composer.json +++ b/composer.json @@ -1,52 +1,59 @@ { - "name": "dolibarr/dolibarr", - "type": "project", - "description": "Dolibarr ERP & CRM is a modern and easy to use web software to manage your business", - "keywords": ["erp","crm","invoice","sme","proposal","order","stock"], - "homepage": "http://www.dolibarr.org", - "license": "GPL-3.0+", - "support": { - "issues": "https://github.com/Dolibarr/dolibarr/issues", - "forum": "http://www.dolibarr.org/forum", - "wiki": "http://wiki.dolibarr.org", - "irc": "irc://chat.freenode.net/dolibarr", - "source": "https://github.com/Dolibarr/dolibarr" - }, - "config": { - "vendor-dir": "htdocs/includes" - }, - "require": { - "php": ">=5.3.0", - "ext-curl": "*", - "ccampbell/chromephp": "4.1.0", - "ckeditor/ckeditor": "dev-full/stable", - "mike42/escpos-php": "1.2.1", - "mobiledetect/mobiledetectlib": "2.8.17", - "phpoffice/phpexcel": "1.8.1", - "restler/framework": "3.0.0-RC6", - "tecnickcom/tcpdf": "6.2.12" - }, - "require-dev": { - "jakub-onderka/php-parallel-lint": "^0", - "jakub-onderka/php-console-highlighter": "^0", - "phpunit/phpunit": "^4", - "squizlabs/php_codesniffer": "^2" - }, - "suggest": { - "ext-mysqlnd": "To use with MySQL or MariaDB", - "ext-mysqli": "To use with MySQL or MariaDB", - "ext-pgsql": "To use with PostgreSQL", - "ext-mssql": "To use with MSSQL (experimental)", - "ext-pdo_sqlite": "To use with SQLite (experimental)", - "ext-gd": "Image manipulation (Required but maybe built-in PHP)", - "ext-imagick": "Image manipulation (TCPDF)", - "ext-mcrypt": "(Required but maybe built-in PHP)", - "ext-openssl": "Secure connections (Emails, SOAP…)", - "ext-mbstring": "Handle non UTF-8 databases", - "ext-soap": "Native SOAP", - "ext-zip": "ODT and Excel support", - "ext-xml": "Excel support", - "firephp/firephp-core": "Logging to Firebug console support", - "raven/raven": "Sentry logging server support" - } + "name": "dolibarr/dolibarr", + "type": "project", + "description": "Dolibarr ERP & CRM is a modern and easy to use web software to manage your business", + "keywords": [ + "erp", + "crm", + "invoice", + "sme", + "proposal", + "order", + "stock" + ], + "homepage": "http://www.dolibarr.org", + "license": "GPL-3.0+", + "support": { + "issues": "https://github.com/Dolibarr/dolibarr/issues", + "forum": "http://www.dolibarr.org/forum", + "wiki": "http://wiki.dolibarr.org", + "irc": "irc://chat.freenode.net/dolibarr", + "source": "https://github.com/Dolibarr/dolibarr" + }, + "config": { + "vendor-dir": "htdocs/includes" + }, + "require": { + "php": ">=5.3.0", + "ext-curl": "*", + "ccampbell/chromephp": "4.1.0", + "ckeditor/ckeditor": "dev-full/stable", + "mike42/escpos-php": "1.2.1", + "mobiledetect/mobiledetectlib": "2.8.17", + "phpoffice/phpexcel": "1.8.1", + "restler/framework": "3.0.0-RC6", + "tecnickcom/tcpdf": "6.2.12" + }, + "require-dev": { + "jakub-onderka/php-parallel-lint": "^0", + "jakub-onderka/php-console-highlighter": "^0", + "phpunit/phpunit": "^4", + "squizlabs/php_codesniffer": "^2" + }, + "suggest": { + "ext-mysqlnd": "To use with MySQL or MariaDB", + "ext-mysqli": "To use with MySQL or MariaDB", + "ext-pgsql": "To use with PostgreSQL", + "ext-mssql": "To use with MSSQL (experimental)", + "ext-pdo_sqlite": "To use with SQLite (experimental)", + "ext-gd": "Image manipulation (Required but maybe built-in PHP)", + "ext-imagick": "Image manipulation (TCPDF)", + "ext-mcrypt": "(Required but maybe built-in PHP)", + "ext-openssl": "Secure connections (Emails, SOAP…)", + "ext-mbstring": "Handle non UTF-8 databases", + "ext-soap": "Native SOAP", + "ext-zip": "ODT and Excel support", + "ext-xml": "Excel support", + "firephp/firephp-core": "Logging to Firebug console support" + } } diff --git a/htdocs/admin/syslog.php b/htdocs/admin/syslog.php index f3cfcff9807..ae32c073349 100644 --- a/htdocs/admin/syslog.php +++ b/htdocs/admin/syslog.php @@ -27,6 +27,8 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +global $conf; + if (!$user->admin) accessforbidden(); $langs->load("admin"); @@ -40,34 +42,37 @@ $activeModules = array(); if (defined('SYSLOG_HANDLERS')) $activeModules = json_decode(constant('SYSLOG_HANDLERS')); -$dir = dol_buildpath('/core/modules/syslog/'); +$dirsyslogs = array_merge(array('/core/modules/syslog/'), $conf->modules_parts['syslog']); +foreach ($dirsyslogs as $reldir) { + $dir = dol_buildpath($reldir, 0); + $newdir = dol_osencode($dir); + if (is_dir($newdir)) { + $handle = opendir($newdir); -if (is_dir($dir)) -{ - $handle = opendir($dir); + if (is_resource($handle)) { + $var = true; - if (is_resource($handle)) - { - $var=true; + while (($file = readdir($handle)) !== false) { + if (substr($file, 0, 11) == 'mod_syslog_' && substr($file, dol_strlen($file) - 3, 3) == 'php') { + $file = substr($file, 0, dol_strlen($file) - 4); - while (($file = readdir($handle))!==false) - { - if (substr($file, 0, 11) == 'mod_syslog_' && substr($file, dol_strlen($file)-3, 3) == 'php') - { - $file = substr($file, 0, dol_strlen($file)-4); + require_once $newdir . $file . '.php'; - require_once $dir.$file.'.php'; + $module = new $file; - $module = new $file; + // Show modules according to features level + if ($module->getVersion() == 'development' && $conf->global->MAIN_FEATURES_LEVEL < 2) { + continue; + } + if ($module->getVersion() == 'experimental' && $conf->global->MAIN_FEATURES_LEVEL < 1) { + continue; + } - // Show modules according to features level - if ($module->getVersion() == 'development' && $conf->global->MAIN_FEATURES_LEVEL < 2) continue; - if ($module->getVersion() == 'experimental' && $conf->global->MAIN_FEATURES_LEVEL < 1) continue; - - $syslogModules[] = $file; + $syslogModules[] = $file; + } } + closedir($handle); } - closedir($handle); } } diff --git a/htdocs/core/class/conf.class.php b/htdocs/core/class/conf.class.php index 3ac15c7a8c8..4b7e2a3d79b 100644 --- a/htdocs/core/class/conf.class.php +++ b/htdocs/core/class/conf.class.php @@ -51,7 +51,7 @@ class Conf public $standard_menu; public $modules = array(); // List of activated modules - public $modules_parts = array('css'=>array(),'js'=>array(),'tabs'=>array(),'triggers'=>array(),'login'=>array(),'substitutions'=>array(),'menus'=>array(),'theme'=>array(),'sms'=>array(),'tpl'=>array(),'barcode'=>array(),'models'=>array(),'societe'=>array(),'hooks'=>array(),'dir'=>array()); + public $modules_parts = array('css'=>array(),'js'=>array(),'tabs'=>array(),'triggers'=>array(),'login'=>array(),'substitutions'=>array(),'menus'=>array(),'theme'=>array(),'sms'=>array(),'tpl'=>array(),'barcode'=>array(),'models'=>array(),'societe'=>array(),'hooks'=>array(),'dir'=>array(), 'syslog' =>array()); var $logbuffer = array(); @@ -123,6 +123,8 @@ class Conf */ function setValues($db) { + global $conf; + dol_syslog(get_class($this)."::setValues"); /* @@ -203,7 +205,7 @@ class Conf $db->free($resql); } - + // Include other local consts.php files and fetch their values to the corresponding database constants if (! empty($this->global->LOCAL_CONSTS_FILES)) { $filesList = explode(":", $this->global->LOCAL_CONSTS_FILES); @@ -342,7 +344,7 @@ class Conf $this->fournisseur->facture=new stdClass(); $this->fournisseur->facture->dir_output =$rootfordata."/fournisseur/facture"; $this->fournisseur->facture->dir_temp =$rootfordata."/fournisseur/facture/temp"; - + // To prepare split of module fournisseur into fournisseur + supplier_order + supplier_invoice if (! empty($this->fournisseur->enabled) && empty($this->global->MAIN_USE_NEW_SUPPLIERMOD)) // By default, if module supplier is on, we set new properties { @@ -379,7 +381,7 @@ class Conf // Set some default values $this->global->MAIN_ACTIVATE_HTML5=1; - + // societe if (empty($this->global->SOCIETE_CODECLIENT_ADDON)) $this->global->SOCIETE_CODECLIENT_ADDON="mod_codeclient_leopard"; if (empty($this->global->SOCIETE_CODECOMPTA_ADDON)) $this->global->SOCIETE_CODECOMPTA_ADDON="mod_codecompta_panicum"; @@ -483,10 +485,10 @@ class Conf // By default, we propagate contacts if (! isset($this->global->MAIN_PROPAGATE_CONTACTS_FROM_ORIGIN)) $this->global->MAIN_PROPAGATE_CONTACTS_FROM_ORIGIN='*'; // Can be also '*' or '^(BILLING|SHIPPING|CUSTOMER|.*)$' (regex not yet implemented) - + // By default, we use the zip town autofill if (! isset($this->global->MAIN_USE_ZIPTOWN_DICTIONNARY)) $this->global->MAIN_USE_ZIPTOWN_DICTIONNARY=1; - + // Define list of limited modules if (! isset($this->global->MAIN_MODULES_FOR_EXTERNAL)) $this->global->MAIN_MODULES_FOR_EXTERNAL='user,supplier_proposal,facture,categorie,commande,fournisseur,contact,propal,projet,contrat,societe,ficheinter,expedition,agenda,adherent'; // '' means 'all'. Note that contact is added here as it should be a module later. @@ -510,13 +512,13 @@ class Conf $this->adherent->cotisation->warning_delay=(isset($this->global->MAIN_DELAY_MEMBERS)?$this->global->MAIN_DELAY_MEMBERS:0)*24*60*60; } if (isset($this->agenda)) $this->agenda->warning_delay=(isset($this->global->MAIN_DELAY_ACTIONS_TODO)?$this->global->MAIN_DELAY_ACTIONS_TODO:7)*24*60*60; - if (isset($this->projet)) + if (isset($this->projet)) { $this->projet->warning_delay=(isset($this->global->MAIN_DELAY_PROJECT_TO_CLOSE)?$this->global->MAIN_DELAY_PROJECT_TO_CLOSE:7)*24*60*60; $this->projet->task = new StdClass(); $this->projet->task->warning_delay=(isset($this->global->MAIN_DELAY_TASKS_TODO)?$this->global->MAIN_DELAY_TASKS_TODO:7)*24*60*60; } - + if (isset($this->commande)) { $this->commande->client = new stdClass(); $this->commande->fournisseur = new stdClass(); @@ -570,26 +572,40 @@ class Conf if (is_object($mc)) $mc->setValues($this); } - // We init log handlers - if (defined('SYSLOG_HANDLERS')) $handlers = json_decode(constant('SYSLOG_HANDLERS')); - else $handlers = array(); - foreach ($handlers as $handler) - { - $file = DOL_DOCUMENT_ROOT.'/core/modules/syslog/'.$handler.'.php'; - if (!file_exists($file)) - { - throw new Exception('Missing log handler file '.$handler.'.php'); - } + // We init log handlers + if (defined('SYSLOG_HANDLERS')) { + $handlers = json_decode(constant('SYSLOG_HANDLERS')); + } else { + $handlers = array(); + } + foreach ($handlers as $handler) { + $handler_files = array(); + $dirsyslogs = array_merge(array('/core/modules/syslog/'), $conf->modules_parts['syslog']); + foreach ($dirsyslogs as $reldir) { + $dir = dol_buildpath($reldir, 0); + $newdir = dol_osencode($dir); + if (is_dir($newdir)) { + $file = $newdir . $handler . '.php'; + if (file_exists($file)) { + $handler_files[] = $file; + } + } + } - require_once $file; - $loghandlerinstance = new $handler(); - if (!$loghandlerinstance instanceof LogHandlerInterface) - { - throw new Exception('Log handler does not extend LogHandlerInterface'); - } + if (empty($handler_files)) { + throw new Exception('Missing log handler file ' . $handler . '.php'); + } - if (empty($this->loghandlers[$handler])) $this->loghandlers[$handler]=$loghandlerinstance; - } + require_once $handler_files[0]; + $loghandlerinstance = new $handler(); + if (!$loghandlerinstance instanceof LogHandlerInterface) { + throw new Exception('Log handler does not extend LogHandlerInterface'); + } + + if (empty($this->loghandlers[$handler])) { + $this->loghandlers[$handler] = $loghandlerinstance; + } + } } } diff --git a/htdocs/core/modules/syslog/mod_syslog_sentry.php b/htdocs/core/modules/syslog/mod_syslog_sentry.php deleted file mode 100644 index fa5b61744cf..00000000000 --- a/htdocs/core/modules/syslog/mod_syslog_sentry.php +++ /dev/null @@ -1,195 +0,0 @@ - - * Copyright (C) 2004-2015 Laurent Destailleur - * Copyright (C) 2015 Raphaël Doursenaud - * - * 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 . - */ - -require_once DOL_DOCUMENT_ROOT.'/core/modules/syslog/logHandler.php'; -if (file_exists(DOL_DOCUMENT_ROOT.'/includes/raven/raven/lib/Raven/Autoloader.php')) -{ - require_once DOL_DOCUMENT_ROOT.'/includes/raven/raven/lib/Raven/Autoloader.php'; - Raven_Autoloader::register(); -} - -/** - * Class to manage logging to Sentry - * - * @see https://docs.getsentry.com/on-premise/clients/php/ - */ -class mod_syslog_sentry extends LogHandler implements LogHandlerInterface -{ - /** - * @var string Log handler code - */ - public $code = 'sentry'; - - /** - * Return name of logger - * - * @return string Name of logger - */ - public function getName() - { - return 'Sentry'; - } - - /** - * Version of the module ('x.y.z' or 'dolibarr' or 'experimental' or 'development') - * - * @return string - */ - public function getVersion() - { - return 'dolibarr'; - } - - /** - * Content of the info tooltip. - * - * @return false|string - */ - public function getInfo() - { - global $langs; - return $langs->trans('SyslogSentryFromProject'); - } - - /** - * Is the module active ? - * - * @return boolean - */ - public function isActive() - { - return file_exists(DOL_DOCUMENT_ROOT.'/includes/raven/raven/lib/Raven/Autoloader.php'); - } - - /** - * Return array of configuration data - * - * @return array Return array of configuration data - */ - public function configure() - { - global $langs; - return array( - array( - 'constant' => 'SYSLOG_SENTRY_DSN', - 'name' => $langs->trans('SyslogSentryDSN'), - 'default' => '', - 'attr' => 'size="100" placeholder="https://:@app.getsentry.com/"' - ) - ); - } - - /** - * Return if configuration is valid - * - * @return array Array of errors. Empty array if ok. - */ - public function checkConfiguration() - { - global $conf; - - $errors = array(); - - $dsn = $conf->global->SYSLOG_SENTRY_DSN; - - try { - $client = new Raven_Client( - $dsn, - array('curl_method' => 'sync') - ); - } catch (InvalidArgumentException $ex) { - $errors[] = "ERROR: There was an error parsing your DSN:\n " . $ex->getMessage(); - } - - if (!$errors) { - // Send test event and check for errors - $client->captureMessage('TEST: Sentry syslog configuration check', null, Raven_Client::DEBUG); - $last_error = $client->getLastError(); - if ($last_error) { - $errors[] = $last_error; - } - } - - if (!$errors) { - // Install handlers - $error_handler = new Raven_ErrorHandler($client); - $error_handler->registerExceptionHandler(); - $error_handler->registerErrorHandler(); - $error_handler->registerShutdownFunction(); - } - - return $errors; - } - - /** - * Export the message - * - * @param array $content Array containing the info about the message - * @return void - */ - public function export($content) - { - if (! $this->isActive()) { - return; - } - - global $conf; - $dsn = $conf->global->SYSLOG_SENTRY_DSN; - $client = new Raven_Client( - $dsn, - array('curl_method' => 'exec') - ); - - $client->user_context(array( - 'username' => ($content['user'] ? $content['user'] : ''), - 'ip_address' => $content['ip'] - )); - - $client->tags_context(array( - 'version' => DOL_VERSION - )); - - $client->registerSeverityMap(array( - LOG_EMERG => Raven_Client::FATAL, - LOG_ALERT => Raven_Client::FATAL, - LOG_CRIT => Raven_Client::ERROR, - LOG_ERR => Raven_Client::ERROR, - LOG_WARNING => Raven_Client::WARNING, - LOG_NOTICE => Raven_Client::WARNING, - LOG_INFO => Raven_Client::INFO, - LOG_DEBUG => Raven_Client::DEBUG, - )); - - if (substr($content['message'], 0, 3) === 'sql') { - global $db; - $query = substr($content['message'], 4, strlen($content['message'])); - $client->captureQuery( - $query, - $client->translateSeverity($content['level']), - $db->type - ); - } else { - $client->captureMessage( - $content['message'], - null, - $client->translateSeverity($content['level']) - ); - } - } -} diff --git a/htdocs/langs/ar_SA/admin.lang b/htdocs/langs/ar_SA/admin.lang index 7a74e18dbf0..b92401e009e 100644 --- a/htdocs/langs/ar_SA/admin.lang +++ b/htdocs/langs/ar_SA/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=اسم الملف ومسار YouCanUseDOL_DATA_ROOT=يمكنك استخدام DOL_DATA_ROOT / dolibarr.log لملف الدخول في Dolibarr "وثائق" دليل. يمكنك أن تحدد مسارا مختلفا لتخزين هذا الملف. ErrorUnknownSyslogConstant=ثابت %s ليس ثابت سيسلوغ معروفة OnlyWindowsLOG_USER=نوافذ يعتمد فقط LOG_USER -SyslogSentryDSN=ترقب DSN -SyslogSentryFromProject=DSN من مشروع ترقب بك ##### Donations ##### DonationsSetup=وحدة الإعداد للتبرع DonationsReceiptModel=قالب من استلام التبرع diff --git a/htdocs/langs/bg_BG/admin.lang b/htdocs/langs/bg_BG/admin.lang index f67745edb12..9b158ca8a6d 100644 --- a/htdocs/langs/bg_BG/admin.lang +++ b/htdocs/langs/bg_BG/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Име на файла и пътя YouCanUseDOL_DATA_ROOT=Можете да използвате DOL_DATA_ROOT / dolibarr.log за лог файл в Dolibarr директория "документи". Можете да зададете различен път, за да се съхранява този файл. ErrorUnknownSyslogConstant=Постоянни %s не е известен Syslog постоянно OnlyWindowsLOG_USER=Windows поддържа само LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Настройка на модул Дарение DonationsReceiptModel=Шаблон на получаване на дарение diff --git a/htdocs/langs/bn_BD/admin.lang b/htdocs/langs/bn_BD/admin.lang index f6a9f3010da..af313850ba1 100644 --- a/htdocs/langs/bn_BD/admin.lang +++ b/htdocs/langs/bn_BD/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=File name and path YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file. ErrorUnknownSyslogConstant=Constant %s is not a known Syslog constant OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donation module setup DonationsReceiptModel=Template of donation receipt diff --git a/htdocs/langs/bs_BA/admin.lang b/htdocs/langs/bs_BA/admin.lang index 68d33510781..66732bca8db 100644 --- a/htdocs/langs/bs_BA/admin.lang +++ b/htdocs/langs/bs_BA/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=File name and path YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file. ErrorUnknownSyslogConstant=Constant %s is not a known Syslog constant OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donation module setup DonationsReceiptModel=Template of donation receipt diff --git a/htdocs/langs/ca_ES/admin.lang b/htdocs/langs/ca_ES/admin.lang index 190e14dca05..7cb8f45783a 100644 --- a/htdocs/langs/ca_ES/admin.lang +++ b/htdocs/langs/ca_ES/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Nom i ruta de l'arxiu YouCanUseDOL_DATA_ROOT=Utilitza DOL_DATA_ROOT/dolibarr.log per un fitxer de registre en la carpeta documents de Dolibarr. Tanmateix, es pot definir una carpeta diferent per guardar aquest fitxer. ErrorUnknownSyslogConstant=La constant %s no és una constant syslog coneguda OnlyWindowsLOG_USER=Windows només suporta LOG_USER -SyslogSentryDSN=DSN Sentry -SyslogSentryFromProject=DSN del teu projecte Sentry ##### Donations ##### DonationsSetup=Configuració del mòdul donacions DonationsReceiptModel=Plantilla de rebut de donació diff --git a/htdocs/langs/cs_CZ/admin.lang b/htdocs/langs/cs_CZ/admin.lang index 78fa7604ba5..aec2797976b 100644 --- a/htdocs/langs/cs_CZ/admin.lang +++ b/htdocs/langs/cs_CZ/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Název souboru a cesta YouCanUseDOL_DATA_ROOT=Můžete použít DOL_DATA_ROOT / dolibarr.log pro soubor protokolu Dolibarr "Dokumenty" adresáře. Můžete nastavit jinou cestu k uložení tohoto souboru. ErrorUnknownSyslogConstant=Konstantní %s není známo, Syslog konstantní OnlyWindowsLOG_USER=Windows podporuje pouze LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Darování modul nastavení DonationsReceiptModel=Vzor darovací přijetí diff --git a/htdocs/langs/da_DK/admin.lang b/htdocs/langs/da_DK/admin.lang index 225979662f6..5d66d64c891 100644 --- a/htdocs/langs/da_DK/admin.lang +++ b/htdocs/langs/da_DK/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Filnavn og sti YouCanUseDOL_DATA_ROOT=Du kan bruge DOL_DATA_ROOT / dolibarr.log for en logfil i Dolibarr "dokumenter" mappen. Du kan indstille en anden vej til at gemme denne fil. ErrorUnknownSyslogConstant=Konstant %s er ikke en kendt syslog konstant OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donation modul opsætning DonationsReceiptModel=Skabelon for donationen modtagelse diff --git a/htdocs/langs/de_DE/admin.lang b/htdocs/langs/de_DE/admin.lang index 974c8973461..4697482aa28 100644 --- a/htdocs/langs/de_DE/admin.lang +++ b/htdocs/langs/de_DE/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Dateiname und-pfad YouCanUseDOL_DATA_ROOT=Sie können DOL_DATA_ROOT/dolibarr.log als Protokolldatei in Ihrem Dokumentenverzeichnis verwenden. Bei Bedarf können Sie auch den Pfad der Datei anpassen. ErrorUnknownSyslogConstant=Konstante %s ist nicht als Protokoll-Konstante definiert OnlyWindowsLOG_USER=Windows unterstützt nur LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN Ihres Sentry Projekts ##### Donations ##### DonationsSetup=Spendenmoduleinstellungen DonationsReceiptModel=Vorlage für Spendenquittungen diff --git a/htdocs/langs/el_GR/admin.lang b/htdocs/langs/el_GR/admin.lang index a433818e4a6..5413158e27c 100644 --- a/htdocs/langs/el_GR/admin.lang +++ b/htdocs/langs/el_GR/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=File name and path YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file. ErrorUnknownSyslogConstant=Constant %s is not a known Syslog constant OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donation module setup DonationsReceiptModel=Template of donation receipt diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 1e2e3e68291..f186ff20419 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1319,8 +1319,6 @@ SyslogFilename=File name and path YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file. ErrorUnknownSyslogConstant=Constant %s is not a known Syslog constant OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donation module setup DonationsReceiptModel=Template of donation receipt diff --git a/htdocs/langs/es_ES/admin.lang b/htdocs/langs/es_ES/admin.lang index ec2ff713c14..51b0257dc74 100644 --- a/htdocs/langs/es_ES/admin.lang +++ b/htdocs/langs/es_ES/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Nombre y ruta del archivo YouCanUseDOL_DATA_ROOT=Puede utilizar DOL_DATA_ROOT/dolibarr.log para un registro en el directorio "documentos" de Dolibarr. Sin embargo, puede establecer un directorio diferente para guardar este archivo. ErrorUnknownSyslogConstant=La constante %s no es una constante syslog conocida OnlyWindowsLOG_USER=Windows sólo soporta LOG_USER -SyslogSentryDSN=DSN Sentry -SyslogSentryFromProject=DSN de su proyecto Sentry ##### Donations ##### DonationsSetup=Configuración del módulo donaciones DonationsReceiptModel=Modelo recepción de donaciones diff --git a/htdocs/langs/et_EE/admin.lang b/htdocs/langs/et_EE/admin.lang index 6f9fb7889f5..3a80b113e4f 100644 --- a/htdocs/langs/et_EE/admin.lang +++ b/htdocs/langs/et_EE/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Faili nimi ja rada YouCanUseDOL_DATA_ROOT=Võid kasutada DOL_DATA_ROOT/dolibarr.log Dolibarri "documents" kausta faili salvestamiseks, aga logifaili salvestamiseks võib ka mõnda muud rada kasutada. ErrorUnknownSyslogConstant=Konstant %s ei ole tuntud Syslogi konstant OnlyWindowsLOG_USER=Windows toetab vaid LOG_USER direktiivi -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Annetuste mooduli seadistamine DonationsReceiptModel=Annetuse kviitungi mall diff --git a/htdocs/langs/eu_ES/admin.lang b/htdocs/langs/eu_ES/admin.lang index 3b21ebfb0c2..5bc663a9acc 100644 --- a/htdocs/langs/eu_ES/admin.lang +++ b/htdocs/langs/eu_ES/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Fitxategiaren izena eta kokapena YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file. ErrorUnknownSyslogConstant=%s konstantea ez da Syslog-eko konstante ezaguna OnlyWindowsLOG_USER=Windows-ek LOG_USER soilik jasaten du -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donation module setup DonationsReceiptModel=Template of donation receipt diff --git a/htdocs/langs/fa_IR/admin.lang b/htdocs/langs/fa_IR/admin.lang index a17c57bf92e..b88f676ba69 100644 --- a/htdocs/langs/fa_IR/admin.lang +++ b/htdocs/langs/fa_IR/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=نام فایل و مسیر YouCanUseDOL_DATA_ROOT=شما می توانید DOL_DATA_ROOT / dolibarr.log برای یک فایل در "اسناد" Dolibarr دایرکتوری استفاده کنید. شما می توانید راه های مختلفی را برای ذخیره این فایل را. ErrorUnknownSyslogConstant=٪ ثابت است ثابت های Syslog شناخته نشده است OnlyWindowsLOG_USER=ویندوز تنها پشتیبانی از LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=راه اندازی ماژول کمک مالی DonationsReceiptModel=الگو از دریافت کمک مالی diff --git a/htdocs/langs/fi_FI/admin.lang b/htdocs/langs/fi_FI/admin.lang index 29baca03280..d9a48ec6121 100644 --- a/htdocs/langs/fi_FI/admin.lang +++ b/htdocs/langs/fi_FI/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Tiedoston nimi ja polku YouCanUseDOL_DATA_ROOT=Voit käyttää DOL_DATA_ROOT / dolibarr.log varten lokitiedoston Dolibarr "asiakirjoihin" hakemistoon. Voit valita eri reitin tallentaa tiedoston. ErrorUnknownSyslogConstant=Constant %s ei ole tunnettu syslog vakio OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Lahjoitus-moduulin asetukset DonationsReceiptModel=Malline lahjoituksen vastaanottamisesta diff --git a/htdocs/langs/fr_FR/admin.lang b/htdocs/langs/fr_FR/admin.lang index 0c73888ac90..5be0bbcd50c 100644 --- a/htdocs/langs/fr_FR/admin.lang +++ b/htdocs/langs/fr_FR/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Nom et chemin du fichier YouCanUseDOL_DATA_ROOT=Vous pouvez utiliser DOL_DATA_ROOT/dolibarr.log pour un journal dans le répertoire "documents" de Dolibarr. Vous pouvez néanmoins définir un chemin différent pour stocker ce fichier. ErrorUnknownSyslogConstant=La constante %s n'est pas une constante syslog connue OnlyWindowsLOG_USER=Windows ne prend en charge que LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN de votre projet Sentry ##### Donations ##### DonationsSetup=Configuration du module Dons DonationsReceiptModel=Modèles de reçu de dons diff --git a/htdocs/langs/he_IL/admin.lang b/htdocs/langs/he_IL/admin.lang index 0ae7e3087e7..b541eb5535c 100644 --- a/htdocs/langs/he_IL/admin.lang +++ b/htdocs/langs/he_IL/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=שם קובץ ונתיב YouCanUseDOL_DATA_ROOT=ניתן להשתמש DOL_DATA_ROOT / dolibarr.log עבור קובץ יומן בספרייה Dolibarr "מסמכים". ניתן להגדיר בדרך אחרת כדי לאחסן קובץ זה. ErrorUnknownSyslogConstant=%s קבועים אינו ידוע Syslog מתמיד OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=מודול תרומה ההתקנה DonationsReceiptModel=תבנית של קבלת תרומה diff --git a/htdocs/langs/hr_HR/admin.lang b/htdocs/langs/hr_HR/admin.lang index 370eba7890f..23bcba937c3 100644 --- a/htdocs/langs/hr_HR/admin.lang +++ b/htdocs/langs/hr_HR/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=File name and path YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file. ErrorUnknownSyslogConstant=Constant %s is not a known Syslog constant OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donation module setup DonationsReceiptModel=Template of donation receipt diff --git a/htdocs/langs/hu_HU/admin.lang b/htdocs/langs/hu_HU/admin.lang index a415e54b2db..68de4a4e997 100644 --- a/htdocs/langs/hu_HU/admin.lang +++ b/htdocs/langs/hu_HU/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=A fájl nevét és elérési útvonalát YouCanUseDOL_DATA_ROOT=Használhatja DOL_DATA_ROOT / dolibarr.log egy log fájlt Dolibarr "Dokumentumok" mappa. Beállíthatjuk, más utat kell tárolni ezt a fájlt. ErrorUnknownSyslogConstant=Constant %s nem ismert Syslog állandó OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Adomány modul beállítása DonationsReceiptModel=Sablon az adomány átvételét diff --git a/htdocs/langs/id_ID/admin.lang b/htdocs/langs/id_ID/admin.lang index 9eeb4336aee..76e5c7dd3cf 100644 --- a/htdocs/langs/id_ID/admin.lang +++ b/htdocs/langs/id_ID/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=File name and path YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file. ErrorUnknownSyslogConstant=Constant %s is not a known Syslog constant OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donation module setup DonationsReceiptModel=Template of donation receipt diff --git a/htdocs/langs/is_IS/admin.lang b/htdocs/langs/is_IS/admin.lang index 0e0003a5055..719f3db339c 100644 --- a/htdocs/langs/is_IS/admin.lang +++ b/htdocs/langs/is_IS/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Skráarnafn og slóði YouCanUseDOL_DATA_ROOT=Þú getur notað DOL_DATA_ROOT / dolibarr.log fyrir annálinn í Dolibarr "skjöl" skrá. Þú getur stillt mismunandi leið til að geyma þessa skrá. ErrorUnknownSyslogConstant=Constant %s er ekki þekktur skrifað fasti OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Safnast mát skipulag DonationsReceiptModel=Snið af málefnið berst diff --git a/htdocs/langs/it_IT/admin.lang b/htdocs/langs/it_IT/admin.lang index f6d4abf3002..db056af6da2 100644 --- a/htdocs/langs/it_IT/admin.lang +++ b/htdocs/langs/it_IT/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Nome file e percorso YouCanUseDOL_DATA_ROOT=È possibile utilizzare DOL_DATA_ROOT/dolibarr.log come file di log per la directory "documenti". È anche possibile impostare un percorso diverso per tale file. ErrorUnknownSyslogConstant=La costante %s è sconosciuta a syslog. OnlyWindowsLOG_USER=Solo utenti Windows supportano LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Impostazioni modulo donazioni DonationsReceiptModel=Modello di ricevuta per donazioni diff --git a/htdocs/langs/ja_JP/admin.lang b/htdocs/langs/ja_JP/admin.lang index 175e20bd67d..496ae5e2ad0 100644 --- a/htdocs/langs/ja_JP/admin.lang +++ b/htdocs/langs/ja_JP/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=ファイル名とパス YouCanUseDOL_DATA_ROOT=あなたがDolibarr "ドキュメント"ディレクトリ内のログ·ファイルのDOL_DATA_ROOT / dolibarr.logを使用することができます。このファイルを格納する別のパスを設定することができます。 ErrorUnknownSyslogConstant=定数%sは知られているSyslogの定数ではありません。 OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=寄付モジュールのセットアップ DonationsReceiptModel=寄付金の領収書のテンプレート diff --git a/htdocs/langs/ka_GE/admin.lang b/htdocs/langs/ka_GE/admin.lang index f6a9f3010da..af313850ba1 100644 --- a/htdocs/langs/ka_GE/admin.lang +++ b/htdocs/langs/ka_GE/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=File name and path YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file. ErrorUnknownSyslogConstant=Constant %s is not a known Syslog constant OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donation module setup DonationsReceiptModel=Template of donation receipt diff --git a/htdocs/langs/kn_IN/admin.lang b/htdocs/langs/kn_IN/admin.lang index f6a9f3010da..af313850ba1 100644 --- a/htdocs/langs/kn_IN/admin.lang +++ b/htdocs/langs/kn_IN/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=File name and path YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file. ErrorUnknownSyslogConstant=Constant %s is not a known Syslog constant OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donation module setup DonationsReceiptModel=Template of donation receipt diff --git a/htdocs/langs/ko_KR/admin.lang b/htdocs/langs/ko_KR/admin.lang index 59589ffdb76..51c3ca83ff9 100644 --- a/htdocs/langs/ko_KR/admin.lang +++ b/htdocs/langs/ko_KR/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=File name and path YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file. ErrorUnknownSyslogConstant=Constant %s is not a known Syslog constant OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donation module setup DonationsReceiptModel=Template of donation receipt diff --git a/htdocs/langs/lo_LA/admin.lang b/htdocs/langs/lo_LA/admin.lang index f58f571f022..3fe74658f4a 100644 --- a/htdocs/langs/lo_LA/admin.lang +++ b/htdocs/langs/lo_LA/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=File name and path YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file. ErrorUnknownSyslogConstant=Constant %s is not a known Syslog constant OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donation module setup DonationsReceiptModel=Template of donation receipt diff --git a/htdocs/langs/lt_LT/admin.lang b/htdocs/langs/lt_LT/admin.lang index 3f397d6d39c..4b49ffdbcbc 100644 --- a/htdocs/langs/lt_LT/admin.lang +++ b/htdocs/langs/lt_LT/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Failo pavadinimas ir kelias YouCanUseDOL_DATA_ROOT=Galite naudoti DOL_DATA_ROOT/dolibarr.log prisijungimo failui Dolibarr "dokuments" kataloge. Galite nustatyti kitokį kelią šio failo saugojimui. ErrorUnknownSyslogConstant=Konstanta %s yra nežinoma Syslog konstanta OnlyWindowsLOG_USER=Windows palaiko tik LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Aukų modulio nuostatos DonationsReceiptModel=Aukų įplaukų šablonas diff --git a/htdocs/langs/lv_LV/admin.lang b/htdocs/langs/lv_LV/admin.lang index ebc4a8edb17..b93c6b2b825 100644 --- a/htdocs/langs/lv_LV/admin.lang +++ b/htdocs/langs/lv_LV/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Faila nosaukums un ceļš YouCanUseDOL_DATA_ROOT=Jūs varat izmantot DOL_DATA_ROOT / dolibarr.log uz log failu Dolibarr "dokumenti" direktorijā. Jūs varat iestatīt citu ceļu, lai saglabātu šo failu. ErrorUnknownSyslogConstant=Constant %s nav zināms Syslog konstante OnlyWindowsLOG_USER=Windows atbalsta tikai LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Ziedojumu moduļa uzstādīšana DonationsReceiptModel=Veidne ziedojuma saņemšanu diff --git a/htdocs/langs/mk_MK/admin.lang b/htdocs/langs/mk_MK/admin.lang index f6a9f3010da..af313850ba1 100644 --- a/htdocs/langs/mk_MK/admin.lang +++ b/htdocs/langs/mk_MK/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=File name and path YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file. ErrorUnknownSyslogConstant=Constant %s is not a known Syslog constant OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donation module setup DonationsReceiptModel=Template of donation receipt diff --git a/htdocs/langs/nb_NO/admin.lang b/htdocs/langs/nb_NO/admin.lang index 7c027be7c10..a2dc14f9c2c 100644 --- a/htdocs/langs/nb_NO/admin.lang +++ b/htdocs/langs/nb_NO/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Filnavn og bane YouCanUseDOL_DATA_ROOT=Du kan bruke DOL_DATA_ROOT / dolibarr.log som loggfil i Dolibarr "dokumenter"-mappen. Du kan angi en annen bane for å lagre denne filen. ErrorUnknownSyslogConstant=Konstant %s er ikke en kjent syslog-konstant OnlyWindowsLOG_USER=Windows støtter bare LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN fra ditt Sentry-prosjekt ##### Donations ##### DonationsSetup=Oppsett av Donasjonsmodulen DonationsReceiptModel=Mal for donasjonskvittering diff --git a/htdocs/langs/nl_NL/admin.lang b/htdocs/langs/nl_NL/admin.lang index 2608b70280c..3e628eef6e1 100644 --- a/htdocs/langs/nl_NL/admin.lang +++ b/htdocs/langs/nl_NL/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Bestandsnaam en -pad YouCanUseDOL_DATA_ROOT=U kunt DOL_DATA_ROOT/dolibarr.log gebruiken voor een logbestand in de Dolibarr "documenten"-map. U kunt ook een ander pad gebruiken om dit bestand op te slaan. ErrorUnknownSyslogConstant=Constante %s is geen bekende 'syslog' constante OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donatiemoduleinstellingen DonationsReceiptModel=Sjabloon van donatie-ontvangst diff --git a/htdocs/langs/pl_PL/admin.lang b/htdocs/langs/pl_PL/admin.lang index 92efc057076..8b247add6c7 100644 --- a/htdocs/langs/pl_PL/admin.lang +++ b/htdocs/langs/pl_PL/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Nazwa pliku i ścieżka YouCanUseDOL_DATA_ROOT=Możesz użyć DOL_DATA_ROOT / dolibarr.log do pliku w Dolibarr "dokumenty" katalogu. Można ustawić inną ścieżkę do przechowywania tego pliku. ErrorUnknownSyslogConstant=Stała %s nie jest znany syslog stałej OnlyWindowsLOG_USER=System Windows obsługuje tylko LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Darowizna konfiguracji modułu DonationsReceiptModel=Szablon otrzymania wpłaty diff --git a/htdocs/langs/pt_BR/admin.lang b/htdocs/langs/pt_BR/admin.lang index f0cf4fd2bc1..2b58d946b27 100644 --- a/htdocs/langs/pt_BR/admin.lang +++ b/htdocs/langs/pt_BR/admin.lang @@ -1011,7 +1011,6 @@ SyslogFilename=Nome do arquivo e caminho YouCanUseDOL_DATA_ROOT=Você pode usar DOL_DATA_ROOT/dolibarr.log para um arquivo de log no diretório dos "documentos" do Dolibarr. ErrorUnknownSyslogConstant=A Constante %s não é conhecida pelas constantes do Syslog OnlyWindowsLOG_USER=Somente Windows suporta LOG_USER -SyslogSentryFromProject=DSN do seu projeto Sentry DonationsSetup=Configurações do módulo de doações DonationsReceiptModel=Templates de recibos de doação BarcodeSetup=Configurações de código de barras diff --git a/htdocs/langs/pt_PT/admin.lang b/htdocs/langs/pt_PT/admin.lang index 584e47a4f2a..affbb454602 100644 --- a/htdocs/langs/pt_PT/admin.lang +++ b/htdocs/langs/pt_PT/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Nome e caminho do Ficheiro YouCanUseDOL_DATA_ROOT=Pode utilizar DOL_DATA_ROOT/dolibarr.log para um log na pasta 'documentos' de Dolibarr. ErrorUnknownSyslogConstant=A constante %s não é uma constante syslog conhecida OnlyWindowsLOG_USER=O Windows suporta apenas LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Configuração do módulo Bolsas DonationsReceiptModel=Modelo de recibo de doação diff --git a/htdocs/langs/ro_RO/admin.lang b/htdocs/langs/ro_RO/admin.lang index d924f083038..d5e6a80bb97 100644 --- a/htdocs/langs/ro_RO/admin.lang +++ b/htdocs/langs/ro_RO/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Nume fişier şi calea YouCanUseDOL_DATA_ROOT=Puteţi folosi DOL_DATA_ROOT / dolibarr.log pentru un fişier de log în Dolibarr "Documente" director. Aveţi posibilitatea să setaţi o altă cale de a păstra acest fişier. ErrorUnknownSyslogConstant=Constant %s nu este un cunoscut syslog constant OnlyWindowsLOG_USER=Windows suportă numai LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donatii modul de configurare DonationsReceiptModel=Format de donatie la primirea diff --git a/htdocs/langs/ru_RU/admin.lang b/htdocs/langs/ru_RU/admin.lang index f0aa1c1c573..fa286e546d8 100644 --- a/htdocs/langs/ru_RU/admin.lang +++ b/htdocs/langs/ru_RU/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Имя файла и путь YouCanUseDOL_DATA_ROOT=Вы можете использовать DOL_DATA_ROOT / dolibarr.log в лог-файл в Dolibarr "документы" каталог. Вы можете установить различные пути для хранения этого файла. ErrorUnknownSyslogConstant=Постоянная %s не известны журнала постоянная OnlyWindowsLOG_USER=Windows© поддерживает только LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Пожертвования модуль настройки DonationsReceiptModel=Шаблон дарения получения diff --git a/htdocs/langs/sk_SK/admin.lang b/htdocs/langs/sk_SK/admin.lang index 1e5387da6a9..c7df3c85e6c 100644 --- a/htdocs/langs/sk_SK/admin.lang +++ b/htdocs/langs/sk_SK/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Názov súboru a cesta YouCanUseDOL_DATA_ROOT=Môžete použiť DOL_DATA_ROOT / dolibarr.log pre súbor denníka Dolibarr "Dokumenty" adresára. Môžete nastaviť inú cestu na uloženie tohto súboru. ErrorUnknownSyslogConstant=Konštantná %s nie je známe, Syslog konštantný OnlyWindowsLOG_USER=Windows podporuje iba LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Darovanie modul nastavenia DonationsReceiptModel=Vzor darovacej prijatie diff --git a/htdocs/langs/sl_SI/admin.lang b/htdocs/langs/sl_SI/admin.lang index a13d9171f52..93fa19d44be 100644 --- a/htdocs/langs/sl_SI/admin.lang +++ b/htdocs/langs/sl_SI/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Ime datoteke in pot YouCanUseDOL_DATA_ROOT=Za log datoteko v Dolibarr dokumentni mapi lahko uporabite DOL_DATA_ROOT/dolibarr.log. Za shranjevanje te datoteke lahko nastavite tudi drugačno pot. ErrorUnknownSyslogConstant=Konstanta %s ni znana syslog konstanta OnlyWindowsLOG_USER=Windowsi podpirajo samo LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Nastanitev modula za donacije DonationsReceiptModel=Predloga računa za donacijo diff --git a/htdocs/langs/sq_AL/admin.lang b/htdocs/langs/sq_AL/admin.lang index f6a9f3010da..af313850ba1 100644 --- a/htdocs/langs/sq_AL/admin.lang +++ b/htdocs/langs/sq_AL/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=File name and path YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file. ErrorUnknownSyslogConstant=Constant %s is not a known Syslog constant OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donation module setup DonationsReceiptModel=Template of donation receipt diff --git a/htdocs/langs/sr_RS/admin.lang b/htdocs/langs/sr_RS/admin.lang index 4734f844851..48d8543e48a 100644 --- a/htdocs/langs/sr_RS/admin.lang +++ b/htdocs/langs/sr_RS/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=File name and path YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file. ErrorUnknownSyslogConstant=Constant %s is not a known Syslog constant OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN iz Vašeg Sentry projekta ##### Donations ##### DonationsSetup=Donation module setup DonationsReceiptModel=Template of donation receipt diff --git a/htdocs/langs/sv_SE/admin.lang b/htdocs/langs/sv_SE/admin.lang index 74d9efbb531..c5952bf4c84 100644 --- a/htdocs/langs/sv_SE/admin.lang +++ b/htdocs/langs/sv_SE/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Filnamn och sökväg YouCanUseDOL_DATA_ROOT=Du kan använda DOL_DATA_ROOT / dolibarr.log för en loggfil i Dolibarr "dokument" katalogen. Du kan ställa in en annan väg för att lagra den här filen. ErrorUnknownSyslogConstant=Konstant %s är inte en känd syslog konstant OnlyWindowsLOG_USER=Endast Windows stöder LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donation modul setup DonationsReceiptModel=Mall för donation kvitto diff --git a/htdocs/langs/sw_SW/admin.lang b/htdocs/langs/sw_SW/admin.lang index f6a9f3010da..af313850ba1 100644 --- a/htdocs/langs/sw_SW/admin.lang +++ b/htdocs/langs/sw_SW/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=File name and path YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file. ErrorUnknownSyslogConstant=Constant %s is not a known Syslog constant OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donation module setup DonationsReceiptModel=Template of donation receipt diff --git a/htdocs/langs/th_TH/admin.lang b/htdocs/langs/th_TH/admin.lang index b4b77a62b42..7d084ae4a6f 100644 --- a/htdocs/langs/th_TH/admin.lang +++ b/htdocs/langs/th_TH/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=ชื่อแฟ้มและเส้นทาง YouCanUseDOL_DATA_ROOT=คุณสามารถใช้ DOL_DATA_ROOT / dolibarr.log สำหรับล็อกไฟล์ใน Dolibarr "เอกสาร" ไดเรกทอรี คุณสามารถตั้งค่าเส้นทางที่แตกต่างกันในการจัดเก็บไฟล์นี้ ErrorUnknownSyslogConstant=% s คงไม่ได้เป็นที่รู้จักกันอย่างต่อเนื่อง Syslog OnlyWindowsLOG_USER=Windows เท่านั้นสนับสนุน LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=บริจาคการติดตั้งโมดูล DonationsReceiptModel=แม่แบบที่ได้รับการบริจาค diff --git a/htdocs/langs/tr_TR/admin.lang b/htdocs/langs/tr_TR/admin.lang index 012d30e7f6c..13b648f434a 100644 --- a/htdocs/langs/tr_TR/admin.lang +++ b/htdocs/langs/tr_TR/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Dosya adı ve yolu YouCanUseDOL_DATA_ROOT=Dolibarr’daki “belgeler” dizinindeki bir log (günlük) dosyası için DOL_DATA_ROOT/dolibarr.log u kullanabilirsiniz. Bu dosyayı saklamak için farklı bir yol (path) kullanabilirsiniz. ErrorUnknownSyslogConstant=%s Değişmezi bilinen bir Syslog değişmezi değildir OnlyWindowsLOG_USER=Windows yalnızca LOG_USER'ı destekler -SyslogSentryDSN=Nöbetçi DSN -SyslogSentryFromProject=Nöbetçi projenizdeki DSN ##### Donations ##### DonationsSetup=Bağış modülü kurulumu DonationsReceiptModel=Bağış makbuzu şablonu diff --git a/htdocs/langs/uk_UA/admin.lang b/htdocs/langs/uk_UA/admin.lang index bd02e55c41e..7545c888763 100644 --- a/htdocs/langs/uk_UA/admin.lang +++ b/htdocs/langs/uk_UA/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=File name and path YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file. ErrorUnknownSyslogConstant=Constant %s is not a known Syslog constant OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donation module setup DonationsReceiptModel=Template of donation receipt diff --git a/htdocs/langs/uz_UZ/admin.lang b/htdocs/langs/uz_UZ/admin.lang index f6a9f3010da..af313850ba1 100644 --- a/htdocs/langs/uz_UZ/admin.lang +++ b/htdocs/langs/uz_UZ/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=File name and path YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file. ErrorUnknownSyslogConstant=Constant %s is not a known Syslog constant OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Donation module setup DonationsReceiptModel=Template of donation receipt diff --git a/htdocs/langs/vi_VN/admin.lang b/htdocs/langs/vi_VN/admin.lang index 8d861787181..3a399186d22 100644 --- a/htdocs/langs/vi_VN/admin.lang +++ b/htdocs/langs/vi_VN/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=Tên tập tin và đường dẫn YouCanUseDOL_DATA_ROOT=You can use DOL_DATA_ROOT/dolibarr.log for a log file in Dolibarr "documents" directory. You can set a different path to store this file. ErrorUnknownSyslogConstant=Constant %s is not a known Syslog constant OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=Cài đặt module Tài trợ DonationsReceiptModel=Mẫu biên nhận Tài trợ diff --git a/htdocs/langs/zh_CN/admin.lang b/htdocs/langs/zh_CN/admin.lang index 28a388d42d3..f235df47386 100644 --- a/htdocs/langs/zh_CN/admin.lang +++ b/htdocs/langs/zh_CN/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=文件名称和路径 YouCanUseDOL_DATA_ROOT=您可以使用 DOL_DATA_ROOT/dolibarr.log 来表示“documents”目录下的日志文件。您可以设置不同的路径来保存此文件。 ErrorUnknownSyslogConstant=常量 %s 不是已知的 Syslog 常数 OnlyWindowsLOG_USER=Windows 仅支持 LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=捐赠模块设置 DonationsReceiptModel=捐赠收据模板 diff --git a/htdocs/langs/zh_TW/admin.lang b/htdocs/langs/zh_TW/admin.lang index e1705410fdd..27eea2ef5c6 100644 --- a/htdocs/langs/zh_TW/admin.lang +++ b/htdocs/langs/zh_TW/admin.lang @@ -1311,8 +1311,6 @@ SyslogFilename=文件名稱和路徑 YouCanUseDOL_DATA_ROOT=你可以使用DOL_DATA_ROOT /可在Dolibarr日誌文件dolibarr.log“文件”目錄。你可以設置一個不同的路徑來存儲該文件。 ErrorUnknownSyslogConstant=恆%s不是一個已知的syslog常數 OnlyWindowsLOG_USER=Windows only supports LOG_USER -SyslogSentryDSN=Sentry DSN -SyslogSentryFromProject=DSN from your Sentry project ##### Donations ##### DonationsSetup=捐贈模組設置 DonationsReceiptModel=模板的捐贈收據 diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index d6d04c7b76b..7ce2e19ddde 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1292,16 +1292,6 @@ function top_htmlhead($head, $title='', $disablejs=0, $disablehead=0, $arrayofjs print ''."\n"; } - // Raven.js for client-side Sentry logging support - if (array_key_exists('mod_syslog_sentry', $conf->loghandlers)) { - print '' . "\n"; - print '' . "\n"; - print '' . "\n"; - if (! defined('DISABLE_JQUERY')) { - print '' . "\n"; - } - } - // Global js function print ''."\n"; print ''."\n"; @@ -1387,23 +1377,6 @@ function top_menu($head, $title='', $target='', $disablejs=0, $disablehead=0, $a print '' . "\n"; - if ($conf->use_javascript_ajax) - { - // Raven.js for client-side Sentry logging support - if (array_key_exists('mod_syslog_sentry', $conf->loghandlers) && ! empty($conf->global->SYSLOG_SENTRY_DSN)) - { - // Filter out secret key - $dsn = parse_url($conf->global->SYSLOG_SENTRY_DSN); - $public_dsn = $dsn['scheme'] . '://' . $dsn['user'] .'@' . $dsn['host'] . $dsn['path']; - - print '\n"; - } - } - /* * Top menu */ From a9e5668ea4b4444c8d86b1cfd49d226a1990f27d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 28 Aug 2016 15:58:52 +0200 Subject: [PATCH 03/41] Fix for jmobile --- htdocs/product/class/product.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 79c21cfcbdf..afff7d6f1c6 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -3690,11 +3690,11 @@ class Product extends CommonObject if (empty($maxHeight) || $photo_vignette && $imgarray['height'] > $maxHeight) { $return.= ''; - $return.= 'dol_use_jmobile?'max-height':'height').'="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart=product&entity='.$this->entity.'&file='.urlencode($pdirthumb.$photo_vignette).'" title="'.dol_escape_htmltag($alt).'">'; + $return.= ''; } else { $return.= ''; - $return.= 'dol_use_jmobile?'max-height':'height').'="'.$maxHeight.'" src="'.DOL_URL_ROOT.'/viewimage.php?modulepart=product&entity='.$this->entity.'&file='.urlencode($pdir.$photo).'" title="'.dol_escape_htmltag($alt).'">'; + $return.= ''; } if (empty($nolink)) $return.= ''; From b5f093436e9b79e5d0adbf9e6126afd189aae65a Mon Sep 17 00:00:00 2001 From: aspangaro Date: Tue, 30 Aug 2016 21:43:17 +0200 Subject: [PATCH 04/41] NEW: Move Expense report menu from module to menu files (Again) --- htdocs/core/menus/init_menu_auguria.sql | 9 +- htdocs/core/menus/standard/eldy.lib.php | 11 ++ .../core/modules/modExpenseReport.class.php | 106 ------------------ .../install/mysql/migration/4.0.0-5.0.0.sql | 1 + 4 files changed, 19 insertions(+), 108 deletions(-) diff --git a/htdocs/core/menus/init_menu_auguria.sql b/htdocs/core/menus/init_menu_auguria.sql index d78682a57db..8d442086d64 100644 --- a/htdocs/core/menus/init_menu_auguria.sql +++ b/htdocs/core/menus/init_menu_auguria.sql @@ -332,9 +332,14 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5003__+MAX_llx_menu__, 'hrm', '', 5002__+MAX_llx_menu__, '/holiday/list.php?select_statut=2&leftmenu=hrm', 'ListToApprove', 2, 'trips', '$user->rights->holiday->read', '', 0, 1, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5004__+MAX_llx_menu__, 'hrm', '', 5000__+MAX_llx_menu__, '/holiday/define_holiday.php?&action=request', 'MenuConfCP', 1, 'holiday', '$user->rights->holiday->define_holiday', '', 0, 2, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->holiday->enabled', __HANDLER__, 'left', 5005__+MAX_llx_menu__, 'hrm', '', 5000__+MAX_llx_menu__, '/holiday/view_log.php?&action=request', 'MenuLogCP', 1, 'holiday', '$user->rights->holiday->define_holiday', '', 0, 3, __ENTITY__); --- HRM - Expense reports +-- HRM - Trips and expenses (old module) insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->deplacement->enabled', __HANDLER__, 'left', 2100__+MAX_llx_menu__, 'accountancy', 'tripsandexpenses', 15__+MAX_llx_menu__, '/compta/deplacement/index.php?leftmenu=tripsandexpenses', 'TripsAndExpenses', 0, 'trips', '$user->rights->deplacement->lire', '', 0, 5, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->deplacement->enabled', __HANDLER__, 'left', 2101__+MAX_llx_menu__, 'accountancy', '', 2100__+MAX_llx_menu__, '/compta/deplacement/card.php?action=create&leftmenu=tripsandexpenses', 'New', 1, 'trips', '$user->rights->deplacement->creer', '', 0, 1, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->deplacement->enabled', __HANDLER__, 'left', 2102__+MAX_llx_menu__, 'accountancy', '', 2100__+MAX_llx_menu__, '/compta/deplacement/list.php?leftmenu=tripsandexpenses', 'List', 1, 'trips', '$user->rights->deplacement->lire', '', 0, 2, __ENTITY__); insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->deplacement->enabled', __HANDLER__, 'left', 2103__+MAX_llx_menu__, 'accountancy', '', 2100__+MAX_llx_menu__, '/compta/deplacement/stats/index.php?leftmenu=tripsandexpenses', 'Statistics', 1, 'trips', '$user->rights->deplacement->lire', '', 0, 2, __ENTITY__); - +-- HRM - Expense reports +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->expensereport->enabled', __HANDLER__, 'left', 5300__+MAX_llx_menu__, 'hrm', 'expensereport', 15__+MAX_llx_menu__, '/expensereport/index.php?leftmenu=expensereport', 'TripsAndExpenses', 0, 'trips', '$user->rights->expensereport->lire', '', 0, 5, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->expensereport->enabled', __HANDLER__, 'left', 5301__+MAX_llx_menu__, 'hrm', '', 5300__+MAX_llx_menu__, '/expensereport/card.php?action=create&leftmenu=expensereport', 'New', 1, 'trips', '$user->rights->expensereport->creer', '', 0, 1, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->expensereport->enabled', __HANDLER__, 'left', 5302__+MAX_llx_menu__, 'hrm', '', 5300__+MAX_llx_menu__, '/expensereport/list.php?leftmenu=expensereport', 'List', 1, 'trips', '$user->rights->expensereport->lire', '', 0, 2, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->expensereport->enabled', __HANDLER__, 'left', 5303__+MAX_llx_menu__, 'hrm', '', 5302__+MAX_llx_menu__, '/expensereport/list.php?search_status=2&leftmenu=expensereport', 'ListToApprove', 2, 'trips', '$user->rights->expensereport->approve', '', 0, 2, __ENTITY__); +insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, leftmenu, fk_menu, url, titre, level, langs, perms, target, usertype, position, entity) values ('', '$conf->expensereport->enabled', __HANDLER__, 'left', 5304__+MAX_llx_menu__, 'hrm', '', 5300__+MAX_llx_menu__, '/expensereport/stats/index.php?leftmenu=expensereport', 'Statistics', 1, 'trips', '$user->rights->expensereport->lire', '', 0, 2, __ENTITY__); diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index 386328c0929..f186a45b6dd 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -1262,6 +1262,17 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu $newmenu->add("/compta/deplacement/list.php?leftmenu=tripsandexpenses&mainmenu=hrm", $langs->trans("List"), 1, $user->rights->deplacement->lire); $newmenu->add("/compta/deplacement/stats/index.php?leftmenu=tripsandexpenses&mainmenu=hrm", $langs->trans("Statistics"), 1, $user->rights->deplacement->lire); } + + // Expense report + if (! empty($conf->expensereport->enabled)) + { + $langs->load("trips"); + $newmenu->add("/expensereport/index.php?leftmenu=expensereport&mainmenu=hrm", $langs->trans("TripsAndExpenses"), 0, $user->rights->expensereport->lire, '', $mainmenu, 'expensereport'); + $newmenu->add("/expensereport/card.php?action=create&leftmenu=expensereport&mainmenu=hrm", $langs->trans("New"), 1, $user->rights->expensereport->creer); + $newmenu->add("/expensereport/list.php?leftmenu=expensereport&mainmenu=hrm", $langs->trans("List"), 1, $user->rights->expensereport->lire); + $newmenu->add("/expensereport/list.php?search_status=2&leftmenu=expensereport&mainmenu=hrm", $langs->trans("ListToApprove"), 2, $user->rights->expensereport->approve); + $newmenu->add("/expensereport/stats/index.php?leftmenu=expensereport&mainmenu=hrm", $langs->trans("Statistics"), 1, $user->rights->expensereport->lire); + } } diff --git a/htdocs/core/modules/modExpenseReport.class.php b/htdocs/core/modules/modExpenseReport.class.php index 67dcc68b1e9..01110a66bf3 100644 --- a/htdocs/core/modules/modExpenseReport.class.php +++ b/htdocs/core/modules/modExpenseReport.class.php @@ -213,112 +213,6 @@ class modExpenseReport extends DolibarrModules $this->export_sql_end[$r] .=' WHERE ed.fk_expensereport = d.rowid AND d.fk_user_author = u.rowid'; $this->export_sql_end[$r] .=' AND d.entity IN ('.getEntity('expensereport',1).')'; - - - // Main menu entries - $this->menu = array(); // List of menus to add - $r=0; - - // Example to declare a Left Menu entry: fk_mainmenu=home,fk_leftmenu=admintools - $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=hrm', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) - 'type'=>'left', // This is a Left menu entry - 'titre'=>'TripsAndExpenses', - 'mainmenu'=>'hrm', - 'leftmenu'=>'expensereport', - 'url'=>'/expensereport/index.php', - 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. - 'position'=>100, - 'enabled'=>'$conf->expensereport->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'$user->rights->expensereport->lire', // 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++; - - $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=hrm,fk_leftmenu=expensereport', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) - 'type'=>'left', // This is a Left menu entry - 'titre'=>'New', - 'mainmenu'=>'hrm', - 'leftmenu'=>'expensereport_detailnew', - 'url'=>'/expensereport/card.php?action=create', - 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. - 'position'=>100, - 'enabled'=>'$conf->expensereport->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'$user->rights->expensereport->creer', // 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++; - - $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=hrm,fk_leftmenu=expensereport', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) - 'type'=>'left', // This is a Left menu entry - 'titre'=>'List', - 'mainmenu'=>'hrm', - 'leftmenu'=>'expensereport_detaillist', - 'url'=>'/expensereport/list.php', - 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. - 'position'=>100, - 'enabled'=>'$conf->expensereport->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'$user->rights->expensereport->lire', // 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++; - - $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=hrm,fk_leftmenu=expensereport_detaillist', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) - 'type'=>'left', // This is a Left menu entry - 'titre'=>'ListToApprove', - 'mainmenu'=>'hrm', - 'leftmenu'=>'expensereport_detaillist_approve', - 'url'=>'/expensereport/list.php?search_status=2', - 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. - 'position'=>100, - 'enabled'=>'$conf->expensereport->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'$user->rights->expensereport->approve', // 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++; - - $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=hrm,fk_leftmenu=expensereport', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) - 'type'=>'left', // This is a Left menu entry - 'titre'=>'Statistics', - 'mainmenu'=>'hrm', - 'leftmenu'=>'expensereport_detail', - 'url'=>'/expensereport/stats/index.php', - 'langs'=>'trips', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. - 'position'=>100, - 'enabled'=>'$conf->expensereport->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'$user->rights->expensereport->lire', // 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++; - - - // Disabled, not yet stable - $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=hrm,fk_leftmenu=expensereport', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) - 'type'=>'left', // This is a Left menu entry - 'titre'=>'ExportTripCSV', - 'mainmenu'=>'hrm', - 'leftmenu'=>'expensereport_detail', - 'url'=>'/expensereport/export_csv.php', - 'langs'=>'expensereport', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. - 'position'=>100, - 'enabled'=>'$conf->global->DEPLACEMENT_TO_CLEAN', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'$user->rights->expensereport->lire', // 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++; - - $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=hrm,fk_leftmenu=expensereport', // Use r=value where r is index key used for the parent menu entry (higher parent must be a top menu entry) - 'type'=>'left', // This is a Left menu entry - 'titre'=>'Synchro_Compta', - 'mainmenu'=>'hrm', - 'leftmenu'=>'expensereport_detail', - 'url'=>'/expensereport/synchro_compta.php', - 'langs'=>'expensereport', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. - 'position'=>100, - 'enabled'=>'$conf->global->DEPLACEMENT_TO_CLEAN', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. - 'perms'=>'$user->rights->expensereport->lire', // 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++; } /** 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 8aa67dedbce..2eefc224a7a 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 @@ -21,6 +21,7 @@ -- -- 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); +DELETE FROM llx_menu where module='expensereport'; ALTER TABLE llx_user DROP COLUMN phenix_login; ALTER TABLE llx_user DROP COLUMN phenix_pass; From 18cf2f8f8b04a50e2f8c7eb4f604b2eb01907020 Mon Sep 17 00:00:00 2001 From: gauthier Date: Wed, 31 Aug 2016 10:19:40 +0200 Subject: [PATCH 05/41] FIX : header title in commercial area --- htdocs/comm/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/index.php b/htdocs/comm/index.php index 7dc359b4568..2d473efc310 100644 --- a/htdocs/comm/index.php +++ b/htdocs/comm/index.php @@ -66,7 +66,7 @@ $companystatic=new Societe($db); if (! empty($conf->propal->enabled)) $propalstatic=new Propal($db); if (! empty($conf->commande->enabled)) $orderstatic=new Commande($db); -llxHeader(); +llxHeader("",$langs->trans("CommercialArea")); print_fiche_titre($langs->trans("CommercialArea"),'','title_commercial.png'); From 56d6510472c07ae5af598c77a60d3e3544243bd1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 31 Aug 2016 18:35:15 +0200 Subject: [PATCH 06/41] Fix Quick hack to solve legal problem in some countries. --- htdocs/compta/facture.php | 194 ++++++++++++++++++++------------------ 1 file changed, 102 insertions(+), 92 deletions(-) diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index 8586a5d77a5..63d87cfba31 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -2190,31 +2190,34 @@ if ($action == 'create') if ((empty($origin)) || ((($origin == 'propal') || ($origin == 'commande')) && (! empty($originid)))) { // Deposit - print '
'; - $tmp=' '; - print ''; - - $desc = $form->textwithpicto($tmp.$langs->trans("InvoiceDeposit"), $langs->transnoentities("InvoiceDepositDesc"), 1, 'help', '', 0, 3); - print ''; - if (($origin == 'propal') || ($origin == 'commande')) - { - print ''; - print '
'; - print $desc; - print ''; - $arraylist = array('amount' => 'FixAmount','variable' => 'VarAmount'); - print $form->selectarray('typedeposit', $arraylist, GETPOST('typedeposit'), 0, 0, 0, '', 1); - print '' . $langs->trans('Value') . ':'; - } - print '
'; - - print '
'; + if (empty($conf->global->INVOICE_DISABLE_DEPOSIT)) + { + print '
'; + $tmp=' '; + print ''; + + $desc = $form->textwithpicto($tmp.$langs->trans("InvoiceDeposit"), $langs->transnoentities("InvoiceDepositDesc"), 1, 'help', '', 0, 3); + print ''; + if (($origin == 'propal') || ($origin == 'commande')) + { + print ''; + print '
'; + print $desc; + print ''; + $arraylist = array('amount' => 'FixAmount','variable' => 'VarAmount'); + print $form->selectarray('typedeposit', $arraylist, GETPOST('typedeposit'), 0, 0, 0, '', 1); + print '' . $langs->trans('Value') . ':'; + } + print '
'; + + print '
'; + } } if ($socid > 0) @@ -2244,32 +2247,36 @@ if ($action == 'create') } // Replacement - print '
'; - $tmp=' - jQuery(document).ready(function() { - jQuery("#fac_replacement").change(function() { - jQuery("#radio_replacement").prop("checked", true); - }); - }); - '; - $text = $tmp.$langs->trans("InvoiceReplacementAsk") . ' '; - $text .= ' + jQuery(document).ready(function() { + jQuery("#fac_replacement").change(function() { + jQuery("#radio_replacement").prop("checked", true); + }); + }); + '; + $text = $tmp.$langs->trans("InvoiceReplacementAsk") . ' '; + $text .= ''; + $desc = $form->textwithpicto($text, $langs->transnoentities("InvoiceReplacementDesc"), 1, 'help', '', 0, 3); + print $desc; + print '
'; } - $text .= ''; - $desc = $form->textwithpicto($text, $langs->transnoentities("InvoiceReplacementDesc"), 1, 'help', '', 0, 3); - print $desc; - print ''; } else { @@ -2286,48 +2293,51 @@ if ($action == 'create') { if ($socid > 0) { - // Credit note - print '
'; - $tmp=' - jQuery(document).ready(function() { - if (! jQuery("#radio_creditnote").is(":checked")) - { - jQuery("#credit_note_options").hide(); - } - jQuery("#radio_creditnote").click(function() { - jQuery("#credit_note_options").show(); - }); - jQuery("#radio_standard, #radio_replacement, #radio_deposit").click(function() { - jQuery("#credit_note_options").hide(); - }); - }); - '; - $text = $tmp.$langs->transnoentities("InvoiceAvoirAsk") . ' '; - // $text.=''; - $text .= ''; - $desc = $form->textwithpicto($text, $langs->transnoentities("InvoiceAvoirDesc"), 1, 'help', '', 0, 3); - print $desc; - - print '
'; - print '    0 ? 'checked':'').' /> "; - print '
    0 ? 'checked':'').' /> "; - print '
'; - - print '
'; + // Credit note + if (empty($conf->global->INVOICE_DISABLE_CREDIT_NOTE)) + { + print '
'; + $tmp=' + jQuery(document).ready(function() { + if (! jQuery("#radio_creditnote").is(":checked")) + { + jQuery("#credit_note_options").hide(); + } + jQuery("#radio_creditnote").click(function() { + jQuery("#credit_note_options").show(); + }); + jQuery("#radio_standard, #radio_replacement, #radio_deposit").click(function() { + jQuery("#credit_note_options").hide(); + }); + }); + '; + $text = $tmp.$langs->transnoentities("InvoiceAvoirAsk") . ' '; + // $text.=''; + $text .= ''; + $desc = $form->textwithpicto($text, $langs->transnoentities("InvoiceAvoirDesc"), 1, 'help', '', 0, 3); + print $desc; + + print '
'; + print '    0 ? 'checked':'').' /> "; + print '
    0 ? 'checked':'').' /> "; + print '
'; + + print '
'; + } } else { From f04a3bf0c800f38213ae5613e613fff2df0ef8e5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 31 Aug 2016 18:46:47 +0200 Subject: [PATCH 07/41] Fix sql error --- htdocs/hrm/establishment/card.php | 7 ++++++- htdocs/install/mysql/migration/3.9.0-4.0.0.sql | 4 ++++ htdocs/install/mysql/tables/llx_establishment.sql | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/htdocs/hrm/establishment/card.php b/htdocs/hrm/establishment/card.php index 11179d218f8..9917113ff39 100644 --- a/htdocs/hrm/establishment/card.php +++ b/htdocs/hrm/establishment/card.php @@ -48,6 +48,10 @@ foreach ($tmpstatus2label as $key => $val) $status2label[$key]=$langs->trans($va $object = new Establishment($db); +// Load object +include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once + + /* * Actions */ @@ -128,7 +132,8 @@ else if ($action == 'update') $error ++; } - if (empty($error)) { + if (empty($error)) + { $object->name = GETPOST('name', 'alpha'); $object->address = GETPOST('address', 'alpha'); $object->zip = GETPOST('zipcode', 'alpha'); diff --git a/htdocs/install/mysql/migration/3.9.0-4.0.0.sql b/htdocs/install/mysql/migration/3.9.0-4.0.0.sql index 1309c1dc225..cbc0dd75a56 100644 --- a/htdocs/install/mysql/migration/3.9.0-4.0.0.sql +++ b/htdocs/install/mysql/migration/3.9.0-4.0.0.sql @@ -537,3 +537,7 @@ INSERT INTO llx_c_forme_juridique (fk_pays, code, libelle, active) VALUES (178, INSERT INTO llx_c_forme_juridique (fk_pays, code, libelle, active) VALUES (178, '17804', 'Sociedad Civil', 1); INSERT INTO llx_c_forme_juridique (fk_pays, code, libelle, active) VALUES (178, '17805', 'Sociedad Anónima', 1); + +-- VMYSQL4.1 ALTER TABLE llx_establishment CHANGE COLUMN fk_user_mod fk_user_mod integer NULL; +-- VPGSQL8.2 ALTER TABLE llx_establishment ALTER COLUMN fk_user_mod DROP NOT NULL; + diff --git a/htdocs/install/mysql/tables/llx_establishment.sql b/htdocs/install/mysql/tables/llx_establishment.sql index fcf57ac28b6..667d512762d 100644 --- a/htdocs/install/mysql/tables/llx_establishment.sql +++ b/htdocs/install/mysql/tables/llx_establishment.sql @@ -33,7 +33,7 @@ CREATE TABLE llx_establishment ( profid3 varchar(20), phone varchar(20), fk_user_author integer NOT NULL, - fk_user_mod integer NOT NULL, + fk_user_mod integer, datec datetime NOT NULL, tms timestamp NOT NULL, status tinyint DEFAULT 1 From 1360372a3cdd5b6aa4f62e743f33692e3d0e6194 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 31 Aug 2016 18:57:27 +0200 Subject: [PATCH 08/41] Fix hrm module --- htdocs/hrm/admin/admin_establishment.php | 5 +++-- htdocs/hrm/class/establishment.class.php | 22 +++++++++++----------- htdocs/hrm/establishment/card.php | 9 +++++---- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/htdocs/hrm/admin/admin_establishment.php b/htdocs/hrm/admin/admin_establishment.php index 5f004f15e09..25c2fbf24c7 100644 --- a/htdocs/hrm/admin/admin_establishment.php +++ b/htdocs/hrm/admin/admin_establishment.php @@ -110,7 +110,8 @@ if ($result) $establishmentstatic->id=$obj->rowid; $establishmentstatic->name=$obj->name; - + $establishmentstatic->status=$obj->status; + $var=!$var; print ''; print ''.$establishmentstatic->getNomUrl(1).''; @@ -119,7 +120,7 @@ if ($result) print ''.$obj->town.''; print ''; - print $establishmenttmp->getLibStatus(5); + print $establishmentstatic->getLibStatus(5); print ''; print "\n"; diff --git a/htdocs/hrm/class/establishment.class.php b/htdocs/hrm/class/establishment.class.php index 88b765740ef..9ff2e2065cc 100644 --- a/htdocs/hrm/class/establishment.class.php +++ b/htdocs/hrm/class/establishment.class.php @@ -58,8 +58,8 @@ class Establishment extends CommonObject { $this->db = $db; - $this->statuts_short = array(0 => 'Opened', 1 => 'Closed'); - $this->statuts = array(0 => 'Opened', 1 => 'Closed'); + $this->statuts_short = array(0 => 'Closed', 1 => 'Opened'); + $this->statuts = array(0 => 'Closed', 1 => 'Opened'); return 1; } @@ -157,7 +157,7 @@ class Establishment extends CommonObject $sql .= ", address = '".$this->address."'"; $sql .= ", zip = '".$this->zip."'"; $sql .= ", town = '".$this->town."'"; - + $sql .= ", fk_country = ".($this->country_id > 0 ? $this->country_id : 'null'); $sql .= ", status = '".$this->status."'"; $sql .= ", fk_user_mod = " . $user->id; $sql .= " WHERE rowid = ".$this->id; @@ -273,23 +273,23 @@ class Establishment extends CommonObject } if ($mode == 2) { - if ($status==0) return img_picto($langs->trans($this->statuts_short[$status]),'statut4').' '.$langs->trans($this->statuts_short[$status]); - if ($status==1) return img_picto($langs->trans($this->statuts_short[$status]),'statut8').' '.$langs->trans($this->statuts_short[$status]); + if ($status==0) return img_picto($langs->trans($this->statuts_short[$status]),'statut5').' '.$langs->trans($this->statuts_short[$status]); + if ($status==1) return img_picto($langs->trans($this->statuts_short[$status]),'statut4').' '.$langs->trans($this->statuts_short[$status]); } if ($mode == 3) { - if ($status==0 && ! empty($this->statuts_short[$status])) return img_picto($langs->trans($this->statuts_short[$status]),'statut4'); - if ($status==1 && ! empty($this->statuts_short[$status])) return img_picto($langs->trans($this->statuts_short[$status]),'statut8'); + if ($status==0 && ! empty($this->statuts_short[$status])) return img_picto($langs->trans($this->statuts_short[$status]),'statut5'); + if ($status==1 && ! empty($this->statuts_short[$status])) return img_picto($langs->trans($this->statuts_short[$status]),'statut4'); } if ($mode == 4) { - if ($status==0 && ! empty($this->statuts_short[$status])) return img_picto($langs->trans($this->statuts_short[$status]),'statut4').' '.$langs->trans($this->statuts[$status]); - if ($status==1 && ! empty($this->statuts_short[$status])) return img_picto($langs->trans($this->statuts_short[$status]),'statut8').' '.$langs->trans($this->statuts[$status]); + if ($status==0 && ! empty($this->statuts_short[$status])) return img_picto($langs->trans($this->statuts_short[$status]),'statut5').' '.$langs->trans($this->statuts[$status]); + if ($status==1 && ! empty($this->statuts_short[$status])) return img_picto($langs->trans($this->statuts_short[$status]),'statut4').' '.$langs->trans($this->statuts[$status]); } if ($mode == 5) { - if ($status==0 && ! empty($this->statuts_short[$status])) return $langs->trans($this->statuts_short[$status]).' '.img_picto($langs->trans($this->statuts_short[$status]),'statut4'); - if ($status==1 && ! empty($this->statuts_short[$status])) return $langs->trans($this->statuts_short[$status]).' '.img_picto($langs->trans($this->statuts_short[$status]),'statut8'); + if ($status==0 && ! empty($this->statuts_short[$status])) return $langs->trans($this->statuts_short[$status]).' '.img_picto($langs->trans($this->statuts_short[$status]),'statut5'); + if ($status==1 && ! empty($this->statuts_short[$status])) return $langs->trans($this->statuts_short[$status]).' '.img_picto($langs->trans($this->statuts_short[$status]),'statut4'); } } diff --git a/htdocs/hrm/establishment/card.php b/htdocs/hrm/establishment/card.php index 9917113ff39..eafa302886f 100644 --- a/htdocs/hrm/establishment/card.php +++ b/htdocs/hrm/establishment/card.php @@ -40,8 +40,8 @@ $id = GETPOST('id','int'); // List of status static $tmpstatus2label=array( - '0'=>'OpenEtablishment', - '1'=>'CloseEtablishment' + '0'=>'CloseEtablishment', + '1'=>'OpenEtablishment' ); $status2label=array(''); foreach ($tmpstatus2label as $key => $val) $status2label[$key]=$langs->trans($val); @@ -138,7 +138,7 @@ else if ($action == 'update') $object->address = GETPOST('address', 'alpha'); $object->zip = GETPOST('zipcode', 'alpha'); $object->town = GETPOST('town', 'alpha'); - $object->country_id = $_POST["country_id"]; + $object->country_id = GETPOST('country_id', 'int'); $object->fk_user_mod = $user->id; $result = $object->update($user); @@ -378,7 +378,8 @@ else if ($id) print ''; // Status - print ''.$langs->trans("Status").''.$object->getLibStatus(4).''; + print ''.$langs->trans("Status").''; + print $object->getLibStatus(4).''; print ""; From 545bc9d33d2f04738408a08c93367f7b2c42202e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 31 Aug 2016 19:36:21 +0200 Subject: [PATCH 09/41] Fix var conf not defined. --- htdocs/compta/prelevement/class/bonprelevement.class.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php index a49b5f5f7c6..924d8092485 100644 --- a/htdocs/compta/prelevement/class/bonprelevement.class.php +++ b/htdocs/compta/prelevement/class/bonprelevement.class.php @@ -1680,8 +1680,9 @@ class BonPrelevement extends CommonObject * @return string String with SEPA Sender */ function EnregEmetteurSEPA($configuration, $ladate, $nombre, $total, $CrLf='\n') - { // SEPA INITIALISATION - global $confs; + { + // SEPA INITIALISATION + global $conf; $dateTime_YMD = dol_print_date($ladate, '%Y%m%d'); $dateTime_ETAD = dol_print_date($ladate, '%Y-%m-%d'); From 292993c14f028b783b4c86d04bb5b274e8301802 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 31 Aug 2016 19:37:34 +0200 Subject: [PATCH 10/41] Fix var $conf not defined --- htdocs/compta/prelevement/class/bonprelevement.class.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php index a49b5f5f7c6..924d8092485 100644 --- a/htdocs/compta/prelevement/class/bonprelevement.class.php +++ b/htdocs/compta/prelevement/class/bonprelevement.class.php @@ -1680,8 +1680,9 @@ class BonPrelevement extends CommonObject * @return string String with SEPA Sender */ function EnregEmetteurSEPA($configuration, $ladate, $nombre, $total, $CrLf='\n') - { // SEPA INITIALISATION - global $confs; + { + // SEPA INITIALISATION + global $conf; $dateTime_YMD = dol_print_date($ladate, '%Y%m%d'); $dateTime_ETAD = dol_print_date($ladate, '%Y-%m-%d'); From 10ced563b30063f6faaa2cbf2689f907c6bdff97 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 31 Aug 2016 19:39:12 +0200 Subject: [PATCH 11/41] Fix var $conf not defined --- htdocs/compta/prelevement/class/bonprelevement.class.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php index 9a569a46f7c..bd2fd150d75 100644 --- a/htdocs/compta/prelevement/class/bonprelevement.class.php +++ b/htdocs/compta/prelevement/class/bonprelevement.class.php @@ -1673,8 +1673,9 @@ class BonPrelevement extends CommonObject * @return string String with SEPA Sender */ function EnregEmetteurSEPA($configuration, $ladate, $nombre, $total, $CrLf='\n') - { // SEPA INITIALISATION - global $confs; + { + // SEPA INITIALISATION + global $conf; $dateTime_YMD = dol_print_date($ladate, '%Y%m%d'); $dateTime_ETAD = dol_print_date($ladate, '%Y-%m-%d'); From aba83040862febdd5bf87b7dc0bb99ebf79a0668 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 31 Aug 2016 19:44:45 +0200 Subject: [PATCH 12/41] Fix code not reachable --- htdocs/contact/class/contact.class.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index 8566b4e5585..c10d2b508dc 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -554,8 +554,6 @@ class Contact extends CommonObject $this->db->rollback(); return -$error; } - - return $result; } From 07e6c156a31eaa4dfdd734a87ad361f80020b440 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 31 Aug 2016 19:48:15 +0200 Subject: [PATCH 13/41] Fix free to reachable --- htdocs/core/lib/company.lib.php | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php index 7a459c17cb9..0562edad6b5 100644 --- a/htdocs/core/lib/company.lib.php +++ b/htdocs/core/lib/company.lib.php @@ -309,6 +309,8 @@ function getCountry($searchkey,$withcode='',$dbtouse=0,$outputlangs='',$entconv= { global $db,$langs; + $result=''; + // Check parameters if (empty($searchkey) && empty($searchlabel)) { @@ -323,7 +325,6 @@ function getCountry($searchkey,$withcode='',$dbtouse=0,$outputlangs='',$entconv= elseif (! empty($searchkey)) $sql.= " WHERE code='".$db->escape($searchkey)."'"; else $sql.= " WHERE label='".$db->escape($searchlabel)."'"; - dol_syslog("Company.lib::getCountry", LOG_DEBUG); $resql=$dbtouse->query($sql); if ($resql) { @@ -337,17 +338,18 @@ function getCountry($searchkey,$withcode='',$dbtouse=0,$outputlangs='',$entconv= if ($entconv) $label=($obj->code && ($outputlangs->trans("Country".$obj->code)!="Country".$obj->code))?$outputlangs->trans("Country".$obj->code):$label; else $label=($obj->code && ($outputlangs->transnoentitiesnoconv("Country".$obj->code)!="Country".$obj->code))?$outputlangs->transnoentitiesnoconv("Country".$obj->code):$label; } - if ($withcode == 1) return $label?"$obj->code - $label":"$obj->code"; - else if ($withcode == 2) return $obj->code; - else if ($withcode == 3) return $obj->rowid; - else if ($withcode === 'all') return array('id'=>$obj->rowid,'code'=>$obj->code,'label'=>$label); - else return $label; + if ($withcode == 1) $result=$label?"$obj->code - $label":"$obj->code"; + else if ($withcode == 2) $result=$obj->code; + else if ($withcode == 3) $result=$obj->rowid; + else if ($withcode === 'all') $result=array('id'=>$obj->rowid,'code'=>$obj->code,'label'=>$label); + else $result=$label; } else { - return 'NotDefined'; + $result='NotDefined'; } $dbtouse->free($resql); + return $result; } else dol_print_error($dbtouse,''); return 'Error'; From 3e84d227b3c8cdfd84dad2b18aa74a3d77e00102 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 31 Aug 2016 19:56:44 +0200 Subject: [PATCH 14/41] Remove not used function calculate_byte. Use dol_print_size instead. --- ChangeLog | 2 +- htdocs/core/lib/files.lib.php | 322 ---------------------------------- 2 files changed, 1 insertion(+), 323 deletions(-) diff --git a/ChangeLog b/ChangeLog index c52a486523c..5b93245f378 100644 --- a/ChangeLog +++ b/ChangeLog @@ -24,7 +24,7 @@ Dolibarr better: - Function delete of class Facture (invoice) need the object $user as first parameter. Also you must check you make a fetch on object before calling the delete. - The old driver of "mysql" has been removed. Dolibarr use the new one (mysqli) by default. - +- Remove not used function calculate_byte(). Use dol_print_size() instead. ***** ChangeLog for 4.0.0 compared to 3.9.* ***** diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 186a17a9934..c1436e6d36e 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -204,328 +204,6 @@ function dol_dir_list($path, $types="all", $recursive=0, $filter="", $excludefil } } -/** - * Scan a directory and return a array of files/directories from a selection. - * Content for string is UTF8 and dir separator is "/". - * - * @param int $fk_soc select socid - for your selection in array - * @param string $module_get Starting path from which to search - * @param string $sortorder SORT_ASC or SORT_DESC - * @param array $excludefiles Array of Regex for exclude filter (example: array('(\.meta|_preview\.png)$','^\.')) - * @return array Array of array( filefolder=> array( filelabel=> array( file=> array('name'=>'xxx','date'=>'yyy','size'=>99,'type'=>'dir|file')))) - */ -function get_soc_file_array($fk_soc, $module_get = false, $sortorder = false, $excludefiles = false) -{ - global $user, $conf, $db; - - $sortfield = "date"; - - if(!$sortorder){ - $sorting = SORT_DESC; - }else{ - $sorting = $sortorder; - } - - $ar_modules_get = array(); - if (is_array($module_get)) $ar_modules_get = $module_get; - elseif (strlen($module_get) > 0) $ar_modules_get[$module_get] = $module_get; - else - { - $ar_modules_get['company'] = 'company'; - $ar_modules_get['dolimail'] = 'dolimail'; - $ar_modules_get['actions'] = 'actions'; - $ar_modules_get['invoice'] = 'invoice'; - $ar_modules_get['order'] = 'order'; - $ar_modules_get['propal'] = 'propal'; - $ar_modules_get['contract'] = 'contract'; - $ar_modules_get['project'] = 'project'; - $ar_modules_get['invoice_supplier'] = 'invoice_supplier'; - $ar_modules_get['order_supplier'] = 'order_supplier'; - } - - - // rights - if (count($ar_modules_get) > 0) - foreach($ar_modules_get as $curmodule) - { - switch($curmodule) - { - case 'company': - if (! empty($conf->societe->enabled)) // Recht Alle oder nur die Vertriebspartneradressen - $ar_modules_secure['company']['outputdir'] = $conf->societe->dir_output; - break; - case 'dolimail': - if (! empty($conf->dolimail->enabled) && ($user->rights->dolimail->read || $user->admin)) - $ar_modules_secure[$curmodule]['outputdir']=$conf->dolimail->dir_output.'/attachments'; - break; - case 'actions': - if (! empty($conf->agenda->enabled) || ($user->rights->agenda->allactions->read || $user->admin)) - $ar_modules_secure[$curmodule]['outputdir']=$conf->agenda->dir_output; - break; - case 'invoice': - if (! empty($conf->facture->enabled) && ($user->rights->facture->lire || $user->admin)) - $ar_modules_secure[$curmodule]['outputdir']=$conf->facture->dir_output; - break; - case 'order': - if (!empty($conf->commande->enabled) && ($user->rights->commande->lire || $user->admin)) - $ar_modules_secure[$curmodule]['outputdir']=$conf->commande->dir_output; - break; - case 'propal': - if (!empty($conf->propal->enabled) && ($user->rights->propale->lire || $user->admin)) - $ar_modules_secure[$curmodule]['outputdir']=$conf->propal->dir_output; - break; - case 'project': - if (! empty($conf->projet->enabled) && ($user->rights->projet->lire || $user->admin)) - $ar_modules_secure[$curmodule]['outputdir']=$conf->projet->dir_output; - break; - case 'invoice_supplier': - if (! empty($conf->fournisseur->enabled) && ($user->rights->fournisseur->facture->lire || $user->admin)) - $ar_modules_secure[$curmodule]['outputdir']=$conf->fournisseur->dir_output.'/facture'; - break; - case 'order_supplier': - if (! empty($conf->fournisseur->enabled) && ($user->rights->fournisseur->commande->lire || $user->admin)) - $ar_modules_secure[$curmodule]['outputdir']=$conf->fournisseur->dir_output.'/commande'; - break; - } - } - /* TODO make a outputdir*/ - //unset($ar_modules_secure['dolimail']); - unset($ar_modules_secure['project']); // project (list with project) is "ref" - unset($ar_modules_secure['actions']); - unset($ar_modules_secure['contract']); - /* TODO make a outputdir*/ - unset($curmodule); - - if($fk_soc > 0) - $ar_modules_get = $ar_modules_secure; - - $xy=0; - if (count($ar_modules_get)>0) - foreach($ar_modules_get as $curmodule => $myarray) - { - if($fk_soc > 0 && $curmodule != "company") - { - - // SQL to find documents (ref number) - - if($curmodule == "invoice") $sql = "SELECT facnumber as refstr FROM ".MAIN_DB_PREFIX."facture"; - elseif($curmodule == "order") $sql = "SELECT ref as refstr FROM ".MAIN_DB_PREFIX."commande"; - elseif($curmodule == "invoice_supplier") $sql = "SELECT rowid as refstr FROM ".MAIN_DB_PREFIX."facture_fourn"; - elseif($curmodule == "order_supplier") $sql = "SELECT ref as refstr FROM ".MAIN_DB_PREFIX."commande_fournisseur"; - elseif($curmodule == "propal") $sql = "SELECT ref as refstr FROM ".MAIN_DB_PREFIX."propal"; - elseif($curmodule == "contract") $sql = "SELECT ref as refstr FROM ".MAIN_DB_PREFIX."contrat"; - elseif($curmodule == "dolimail") $sql = "SELECT uid as refstr, subject FROM ".MAIN_DB_PREFIX."mails"; - - $sql.= ' WHERE entity IN ('.getEntity('societe', 1).')'; - $sql.= " AND fk_soc = '".$fk_soc."'"; - - - $res = $db->query($sql); - if ($res && $db->num_rows($res) > 0) - { - while($obj = $db->fetch_object($res)) - { - $ar_modules_secure[$curmodule]['socref'][] = $obj->refstr; - if($curmodule == "dolimail") $ar_modules_secure['dolimail']['subject'][$obj->refstr] = $obj->subject; - } - } - else - { - unset($ar_modules_secure[$curmodule]); - continue; - $errors[]="SQL Error: ".$sql; - $error++; - } - - - }else{ - if($curmodule == "dolimail") $sql = "SELECT uid as refstr, subject FROM ".MAIN_DB_PREFIX."mails"; - - $res = $db->query($sql); - if ($res && $db->num_rows($res) > 0) - { - while($obj = $db->fetch_object($res)) - { - if($curmodule == "dolimail") $ar_modules_secure['dolimail']['subject'][$obj->refstr] = $obj->subject; - } - } - } - - // Data in Array - // Get Array from ar_module - - $output[$curmodule]=dol_dir_list($myarray['outputdir'],"files",1,'', $excludefiles, $sortfield, $sorting,1); - if($fk_soc > 0) - { - if($curmodule == "company") - { - foreach($output["company"] as $label => $filedata) - { - if($filedata['level1name'] != $fk_soc) - { - unset($output['company'][$label]); - } - } - } - - elseif($curmodule == "invoice") - { - if (! is_array($ar_modules_secure[$curmodule]['socref'])) { unset($output[$curmodule]); continue; } // wenn no file exsit - foreach($output["invoice"] as $label => $filedata) - { - if (! in_array($filedata['level1name'], $ar_modules_secure[$curmodule]['socref'])) - { - unset($output[$curmodule][$label]); // throw all ref number who are not in ($fac_supp_N_arr) array - } - - } - } - elseif($curmodule == "invoice_supplier") - { - if (! is_array($ar_modules_secure[$curmodule]['socref'])) { unset($output[$curmodule]); } // throw all ref number who are not in ($fac_invoice_arr) array - foreach($output["invoice_supplier"] as $label => $filedata) - { - if (! in_array($filedata['level1name'], $ar_modules_secure[$curmodule]['socref'])) { - unset($output[$curmodule][$label]); // throw all ref number who are not in ($fac_supp_N_arr) array - } - } - } - elseif($curmodule == "order") - { - if (! is_array($ar_modules_secure[$curmodule]['socref'])) { unset($output[$curmodule]); continue; } // throw all ref number who are not in ($fac_invoice_arr) array - foreach($output["order"] as $label => $filedata) - { - if (! in_array($filedata['level1name'], $ar_modules_secure[$curmodule]['socref'])) { - unset($output[$curmodule][$label]); // throw all ref number who are not in ($ref_order_arr) array - } - } - } - elseif($curmodule == "order_supplier") - { - if (! is_array($ar_modules_secure[$curmodule]['socref'])) { unset($output[$curmodule]); continue; } // throw all ref number who are not in ($fac_invoice_arr) array - foreach($output["order_supplier"] as $label => $filedata) - { - if (! in_array($filedata['level1name'], $ar_modules_secure[$curmodule]['socref'])) { - unset($output[$curmodule][$label]); // throw all ref number who are not in ($ref_order_supp_arr) array - } - } - } - elseif($curmodule == "propal") - { - if (! is_array($ar_modules_secure[$curmodule]['socref'])) { unset($output[$curmodule]); continue; } // throw all ref number who are not in ($fac_invoice_arr) array - foreach($output["propal"] as $label => $filedata) - { - if (! in_array($filedata['level1name'], $ar_modules_secure[$curmodule]['socref'])) { - unset($output[$curmodule][$label]); // throw all ref number who are not in ($ref_propal_arr) array - } - } - } - elseif($curmodule == "contract") - { - if (! is_array($ar_modules_secure[$curmodule]['socref'])) { unset($output[$curmodule]); continue; } // throw all ref number who are not in ($fac_invoice_arr) array - foreach($output["contract"] as $label => $filedata) - { - if (! in_array($filedata['level1name'], $ar_modules_secure[$curmodule]['socref'])) { - unset($output[$curmodule][$label]); // throw all ref number who are not in ($ref_contract_arr) array - } - } - } - elseif($curmodule == "dolimail") - { - - if (! is_array($ar_modules_secure[$curmodule]['socref'])) { unset($output[$curmodule]); continue; } // throw all ref number who are not in ($fac_invoice_arr) array - foreach($output["dolimail"] as $label => $filedata) - { - if($filedata['name'] == "winmail.dat" || $filedata['name'] == "smime.p7s") unset($output[$curmodule][$label]); - else - if (! in_array($filedata['level1name'], $ar_modules_secure[$curmodule]['socref'])) { - unset($output[$curmodule][$label]); // throw all ref number who are not in ($ref_propal_arr) array - } - } - } - // Error if ther isn't any File - if(count($output[$curmodule]) == 0) - { - $error++; - $errors[]="Error [404]: No File found for User: ".$fk_soc." in module: ".$curmodule; - unset($output[$curmodule]); - } - } - - // Extra for Mail attachments - if($curmodule == "dolimail" && count($output["dolimail"])>0) - { - foreach($output["dolimail"] as $label => $filedata) - { - $output[$curmodule][$label]['subject'] = $ar_modules_secure['dolimail']['subject'][$filedata['level1name']]; - } - } - - // Extra for Mail attachments - if($curmodule == "invoice" && count($output["invoice"])>0) - { - foreach($output["invoice"] as $label => $filedata) - { - $output[$curmodule][$label]['subject'] = $filedata['level1name']; - } - } - - // Extra for Mail attachments - if($curmodule == "invoice_supplier" && count($output["invoice_supplier"])>0) - { - foreach($output["invoice_supplier"] as $label => $filedata) - { - $output[$curmodule][$label]['subject'] = $filedata['level1name']; - } - } - - // Extra for Mail attachments - if($curmodule == "contract" && count($output["contract"])>0) - { - foreach($output["contract"] as $label => $filedata) - { - $output[$curmodule][$label]['subject'] = $filedata['level1name']; - } - } - - $xy++; - } - - if(count($output) > 0) - { - return $output; - } - else - { - return -1; - } -} - -/** - * Calculate Bytes to kb, mb and translate it to current language - * - * @param int $byt Bytes - * @return string calculated string - */ -function calculate_byte($byt) -{ - global $langs; - - if ($byt < 1024) { - $unit = ' '.$langs->trans("b"); - $mailsize=$byt; - } else if ($byt / 1024 > 1024) { - $mailsize = $byt / 1024 / 1024; - $unit = ' '.$langs->trans("Mb"); - } else { - $mailsize = $byt / 1024; - $unit = ' '.$langs->trans("Kb"); - } - - $val = number_format($mailsize, 2).$unit; - - return $val; -} /** * Fast compare of 2 files identified by their properties ->name, ->date and ->size From 64ab02234b8fbb9d2c9085f840e791d9db04fa09 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 31 Aug 2016 20:03:54 +0200 Subject: [PATCH 15/41] Fix not return in a constructor --- htdocs/accountancy/class/accountancycategory.class.php | 2 -- htdocs/accountancy/class/bookkeeping.class.php | 1 - 2 files changed, 3 deletions(-) diff --git a/htdocs/accountancy/class/accountancycategory.class.php b/htdocs/accountancy/class/accountancycategory.class.php index 6211f5752b1..ff7f764ea31 100644 --- a/htdocs/accountancy/class/accountancycategory.class.php +++ b/htdocs/accountancy/class/accountancycategory.class.php @@ -47,8 +47,6 @@ class AccountancyCategory */ public function __construct($db) { $this->db = $db; - - return 1; } /** diff --git a/htdocs/accountancy/class/bookkeeping.class.php b/htdocs/accountancy/class/bookkeeping.class.php index 5832d44cd52..0d863e064d4 100644 --- a/htdocs/accountancy/class/bookkeeping.class.php +++ b/htdocs/accountancy/class/bookkeeping.class.php @@ -95,7 +95,6 @@ class BookKeeping extends CommonObject */ public function __construct(DoliDB $db) { $this->db = $db; - return 1; } /** From ec5bd2a8f80e3df5c6dd53be5c517289e4d1f552 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 1 Sep 2016 00:40:48 +0200 Subject: [PATCH 16/41] Fix button create contract from order not visible sometimes --- htdocs/commande/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index 8409eb47e9e..1fcab20500f 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -2513,7 +2513,7 @@ if ($action == 'create' && $user->rights->commande->creer) } // Create contract - if ($conf->contrat->enabled && ($object->statut == Commande::STATUS_VALIDATED || $object->statut == Commande::STATUS_ACCEPTED)) { + if ($conf->contrat->enabled && ($object->statut == Commande::STATUS_VALIDATED || $object->statut == Commande::STATUS_ACCEPTED || $object->statut == Commande::STATUS_CLOSED)) { $langs->load("contracts"); if ($user->rights->contrat->creer) { From bf7a6380c90dcb8e80e61552fe82c16da763ea47 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 1 Sep 2016 01:00:28 +0200 Subject: [PATCH 17/41] Fix sort on wrong field --- htdocs/core/boxes/box_contracts.php | 8 +++++--- htdocs/langs/en_US/boxes.lang | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/htdocs/core/boxes/box_contracts.php b/htdocs/core/boxes/box_contracts.php index 40cc8885f90..fe864e1df16 100644 --- a/htdocs/core/boxes/box_contracts.php +++ b/htdocs/core/boxes/box_contracts.php @@ -1,6 +1,7 @@ - * Copyright (C) 2015 Frederic France +/* Copyright (C) 2010 Regis Houssin + * Copyright (C) 2015 Frederic France + * 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 @@ -71,7 +72,8 @@ class box_contracts extends ModeleBoxes $sql.= " AND c.entity = ".$conf->entity; if (!$user->rights->societe->client->voir && !$user->societe_id) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; if($user->societe_id) $sql.= " AND s.rowid = ".$user->societe_id; - $sql.= " ORDER BY c.date_contrat DESC, c.ref DESC "; + if ($conf->global->MAIN_LASTBOX_ON_OBJECT_DATE) $sql.= " ORDER BY c.date_contrat DESC, c.ref DESC "; + else $sql.= " ORDER BY c.tms DESC, c.ref DESC "; $sql.= $db->plimit($max, 0); $resql = $db->query($sql); diff --git a/htdocs/langs/en_US/boxes.lang b/htdocs/langs/en_US/boxes.lang index 0cd7cac6a6b..98970318e85 100644 --- a/htdocs/langs/en_US/boxes.lang +++ b/htdocs/langs/en_US/boxes.lang @@ -38,7 +38,7 @@ BoxMyLastBookmarks=My latest %s bookmarks BoxOldestExpiredServices=Oldest active expired services BoxLastExpiredServices=Latest %s oldest contacts with active expired services BoxTitleLastActionsToDo=Latest %s actions to do -BoxTitleLastContracts=Latest %s contracts +BoxTitleLastContracts=Latest %s modified contracts BoxTitleLastModifiedDonations=Latest %s modified donations BoxTitleLastModifiedExpenses=Latest %s modified expense reports BoxGlobalActivity=Global activity (invoices, proposals, orders) From 0961ce2a2c9b38d6f2215b7281a84473e2c86498 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 1 Sep 2016 01:08:01 +0200 Subject: [PATCH 18/41] FIX Missing filter on environment --- htdocs/core/boxes/box_services_expired.php | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/core/boxes/box_services_expired.php b/htdocs/core/boxes/box_services_expired.php index 29db63054e5..f2bc86cdac5 100644 --- a/htdocs/core/boxes/box_services_expired.php +++ b/htdocs/core/boxes/box_services_expired.php @@ -68,6 +68,7 @@ class box_services_expired extends ModeleBoxes $sql.= " FROM ".MAIN_DB_PREFIX."contrat as c, ".MAIN_DB_PREFIX."societe s, ".MAIN_DB_PREFIX."contratdet as cd"; if (!$user->rights->societe->client->voir && !$user->societe_id) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; $sql.= " WHERE cd.statut = 4 AND cd.date_fin_validite <= '".$db->idate($now)."'"; + $sql.= " AND c.entity = ".$conf->entity; $sql.= " AND c.fk_soc=s.rowid AND cd.fk_contrat=c.rowid AND c.statut > 0"; if ($user->societe_id) $sql.=' AND c.fk_soc = '.$user->societe_id; if (!$user->rights->societe->client->voir && !$user->societe_id) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; From 7d056f6857061d05e01906bbbc3920985ff8b71d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 1 Sep 2016 11:29:30 +0200 Subject: [PATCH 19/41] NEW Use small photo of user on all user links --- htdocs/expensereport/card.php | 18 +++---- htdocs/expensereport/index.php | 7 ++- htdocs/expensereport/list.php | 49 +++++++++++-------- htdocs/holiday/card.php | 8 +-- htdocs/holiday/class/holiday.class.php | 46 ++++++++++++----- htdocs/holiday/document.php | 4 +- htdocs/holiday/list.php | 14 ++++-- htdocs/holiday/view_log.php | 4 +- htdocs/hrm/index.php | 21 +++++--- htdocs/societe/class/societe.class.php | 4 +- htdocs/societe/commerciaux.php | 12 +++-- .../tpl/linesalesrepresentative.tpl.php | 4 +- htdocs/user/group/card.php | 2 +- htdocs/user/home.php | 2 +- 14 files changed, 126 insertions(+), 69 deletions(-) diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php index d568776fca9..2d43faf016a 100644 --- a/htdocs/expensereport/card.php +++ b/htdocs/expensereport/card.php @@ -1262,7 +1262,7 @@ else print ''; $userfee=new User($db); $userfee->fetch($object->fk_user_valid); - print $userfee->getNomUrl(1); + print $userfee->getNomUrl(-1); print ''; } @@ -1271,7 +1271,7 @@ else print ''; $userfee=new User($db); $userfee->fetch($object->fk_user_author); - print $userfee->getNomUrl(1); + print $userfee->getNomUrl(-1); print ''; if ($object->fk_statut==6) { @@ -1280,7 +1280,7 @@ else print ''; $userfee=new User($db); $userfee->fetch($user->id); - print $userfee->getNomUrl(1); + print $userfee->getNomUrl(-1); print ''; } @@ -1504,7 +1504,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); + print $userauthor->getNomUrl(-1); } print ''; @@ -1527,7 +1527,7 @@ else { $userfee=new User($db); $userfee->fetch($object->fk_user_validator); - print $userfee->getNomUrl(1); + print $userfee->getNomUrl(-1); if (empty($userfee->email) || ! isValidEmail($userfee->email)) { $langs->load("errors"); @@ -1545,7 +1545,7 @@ else { $userfee=new User($db); $userfee->fetch($object->fk_user_cancel); - print $userfee->getNomUrl(1); + print $userfee->getNomUrl(-1); } print ''; print ''; @@ -1566,7 +1566,7 @@ else { $userapp=new User($db); $userapp->fetch($object->fk_user_approve); - print $userapp->getNomUrl(1); + print $userapp->getNomUrl(-1); } print ''; print ''; @@ -1582,7 +1582,7 @@ else print ''; $userfee=new User($db); $userfee->fetch($object->fk_user_refuse); - print $userfee->getNomUrl(1); + print $userfee->getNomUrl(-1); print ''; print ''; print ''.$langs->trans("DATE_REFUS").''; @@ -1600,7 +1600,7 @@ else print ''; $userfee=new User($db); $userfee->fetch($object->fk_user_paid); - print $userfee->getNomUrl(1); + print $userfee->getNomUrl(-1); print ''; print ''; print ''.$langs->trans("DATE_PAIEMENT").''; diff --git a/htdocs/expensereport/index.php b/htdocs/expensereport/index.php index 117ecc5e3c4..8d19a8e9f6d 100644 --- a/htdocs/expensereport/index.php +++ b/htdocs/expensereport/index.php @@ -142,7 +142,7 @@ $max=10; $langs->load("boxes"); -$sql = "SELECT u.rowid as uid, u.lastname, u.firstname, d.rowid, d.ref, d.date_debut as dated, d.date_fin as datef, d.date_create as dm, d.total_ht, d.total_ttc, d.fk_statut as fk_status"; +$sql = "SELECT u.rowid as uid, u.lastname, u.firstname, u.login, u.statut, u.photo, d.rowid, d.ref, d.date_debut as dated, d.date_fin as datef, d.date_create as dm, d.total_ht, d.total_ttc, d.fk_statut as fk_status"; $sql.= " FROM ".MAIN_DB_PREFIX."expensereport as d, ".MAIN_DB_PREFIX."user as u"; if (!$user->rights->societe->client->voir && !$user->societe_id) $sql.= ", ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."societe_commerciaux as sc"; $sql.= " WHERE u.rowid = d.fk_user_author"; @@ -183,9 +183,12 @@ if ($result) $userstatic->id=$obj->uid; $userstatic->lastname=$obj->lastname; $userstatic->firstname=$obj->firstname; + $userstatic->login=$obj->login; + $userstatic->statut=$obj->statut; + $userstatic->photo=$obj->photo; print ''; print ''.$expensereportstatic->getNomUrl(1).''; - print ''.$userstatic->getNomUrl(1).''; + print ''.$userstatic->getNomUrl(-1).''; print ''.price($obj->total_ht).''; print ''.price($obj->total_ttc).''; print ''.dol_print_date($db->jdate($obj->dm),'day').''; diff --git a/htdocs/expensereport/list.php b/htdocs/expensereport/list.php index e09a74e20f3..d3a5205eeda 100644 --- a/htdocs/expensereport/list.php +++ b/htdocs/expensereport/list.php @@ -20,7 +20,7 @@ */ /** - * \file htdocs/expensereport/index.php + * \file htdocs/expensereport/list.php * \ingroup expensereport * \brief list of expense reports */ @@ -130,7 +130,7 @@ $pagenext = $page + 1; $sql = "SELECT d.rowid, d.ref, d.fk_user_author, d.total_ht, d.total_tva, d.total_ttc, d.fk_statut as status,"; $sql.= " d.date_debut, d.date_fin, d.date_valid,"; -$sql.= " u.rowid as id_user, u.firstname, u.lastname"; +$sql.= " u.rowid as id_user, u.firstname, u.lastname, u.login, u.statut, u.photo"; $sql.= " FROM ".MAIN_DB_PREFIX."expensereport as d"; $sql.= " INNER JOIN ".MAIN_DB_PREFIX."user as u ON d.fk_user_author = u.rowid"; $sql.= " WHERE d.entity = ".$conf->entity; @@ -314,19 +314,20 @@ if ($resql) $total_total_tva = 0; $expensereportstatic=new ExpenseReport($db); - + $usertmp = new User($db); + if ($num > 0) { while ($i < min($num,$limit)) { - $objp = $db->fetch_object($resql); - - $expensereportstatic->id=$objp->rowid; - $expensereportstatic->ref=$objp->ref; - $expensereportstatic->status=$objp->status; - $expensereportstatic->valid=$objp->date_valid; - $expensereportstatic->date_debut=$objp->date_debut; - $expensereportstatic->date_fin=$objp->date_fin; + $obj = $db->fetch_object($resql); + + $expensereportstatic->id=$obj->rowid; + $expensereportstatic->ref=$obj->ref; + $expensereportstatic->status=$obj->status; + $expensereportstatic->valid=$obj->date_valid; + $expensereportstatic->date_debut=$obj->date_debut; + $expensereportstatic->date_fin=$obj->date_fin; $var=!$var; print ""; @@ -335,12 +336,20 @@ if ($resql) if ($expensereportstatic->status == 2 && $expensereportstatic->hasDelay('toappove')) print img_warning($langs->trans("Late")); if ($expensereportstatic->status == 5 && $expensereportstatic->hasDelay('topay')) print img_warning($langs->trans("Late")); print ''; - print ''.($objp->date_debut > 0 ? dol_print_date($objp->date_debut, 'day') : '').''; - print ''.($objp->date_fin > 0 ? dol_print_date($objp->date_fin, 'day') : '').''; - print ''.img_object($langs->trans("ShowUser"),"user").' '.dolGetFirstLastname($objp->firstname, $objp->lastname).''; - print ''.price($objp->total_ht).''; - print ''.price($objp->total_tva).''; - print ''.price($objp->total_ttc).''; + print ''.($obj->date_debut > 0 ? dol_print_date($obj->date_debut, 'day') : '').''; + print ''.($obj->date_fin > 0 ? dol_print_date($obj->date_fin, 'day') : '').''; + print ''; + $usertmp->id=$obj->id_user; + $usertmp->lastname=$obj->lastname; + $usertmp->firstname=$obj->firstname; + $usertmp->login=$obj->login; + $usertmp->statut=$obj->statut; + $usertmp->photo=$obj->photo; + print $usertmp->getNomUrl(-1); + print ''; + print ''.price($obj->total_ht).''; + print ''.price($obj->total_tva).''; + print ''.price($obj->total_ttc).''; print ''; print $expensereportstatic->getLibStatut(5); print ''; @@ -349,9 +358,9 @@ if ($resql) print "\n"; - $total_total_ht = $total_total_ht + $objp->total_ht; - $total_total_tva = $total_total_tva + $objp->total_tva; - $total_total_ttc = $total_total_ttc + $objp->total_ttc; + $total_total_ht = $total_total_ht + $obj->total_ht; + $total_total_tva = $total_total_tva + $obj->total_tva; + $total_total_ttc = $total_total_ttc + $obj->total_ttc; $i++; } diff --git a/htdocs/holiday/card.php b/htdocs/holiday/card.php index 4c6aeb99110..1103804b72c 100644 --- a/htdocs/holiday/card.php +++ b/htdocs/holiday/card.php @@ -1,6 +1,6 @@ - * Copyright (C) 2012-2015 Laurent Destailleur + * Copyright (C) 2012-2016 Laurent Destailleur * Copyright (C) 2012-2016 Regis Houssin * Copyright (C) 2013 Juanjo Menent * Copyright (C) 2014 Ferran Marcet @@ -1010,7 +1010,7 @@ else print ''.$langs->trans("User").''; print ''; - print $userRequest->getNomUrl(1, 'leave'); + print $userRequest->getNomUrl(-1, 'leave'); print ''; // Type @@ -1120,14 +1120,14 @@ else $userCreate->fetch($cp->fk_user_create); print ''; print ''.$langs->trans('RequestByCP').''; - print ''.$userCreate->getNomUrl(1).''; + print ''.$userCreate->getNomUrl(-1).''; print ''; } if (!$edit) { print ''; print ''.$langs->trans('ReviewedByCP').''; - print ''.$valideur->getNomUrl(1).''; + print ''.$valideur->getNomUrl(-1).''; print ''; } else { print ''; diff --git a/htdocs/holiday/class/holiday.class.php b/htdocs/holiday/class/holiday.class.php index b76c90cbf48..75fe446d64d 100644 --- a/htdocs/holiday/class/holiday.class.php +++ b/htdocs/holiday/class/holiday.class.php @@ -298,11 +298,17 @@ class Holiday extends CommonObject $sql.= " cp.detail_refuse,"; $sql.= " uu.lastname as user_lastname,"; - $sql.= " uu.firstname as user_firstname,"; - + $sql.= " uu.firstname as user_firstname,"; + $sql.= " uu.login as user_login,"; + $sql.= " uu.statut as user_statut,"; + $sql.= " uu.photo as user_photo,"; + $sql.= " ua.lastname as validator_lastname,"; - $sql.= " ua.firstname as validator_firstname"; - + $sql.= " ua.firstname as validator_firstname,"; + $sql.= " ua.login as validator_login,"; + $sql.= " ua.statut as validator_statut,"; + $sql.= " ua.photo as validator_photo"; + $sql.= " FROM ".MAIN_DB_PREFIX."holiday as cp, ".MAIN_DB_PREFIX."user as uu, ".MAIN_DB_PREFIX."user as ua"; $sql.= " WHERE cp.entity IN (".getEntity('holiday', 1).")"; $sql.= " AND cp.fk_user = uu.rowid AND cp.fk_validator = ua.rowid "; // Hack pour la recherche sur le tableau @@ -360,10 +366,16 @@ class Holiday extends CommonObject $tab_result[$i]['user_firstname'] = $obj->user_firstname; $tab_result[$i]['user_lastname'] = $obj->user_lastname; - + $tab_result[$i]['user_login'] = $obj->user_login; + $tab_result[$i]['user_statut'] = $obj->user_statut; + $tab_result[$i]['user_photo'] = $obj->user_photo; + $tab_result[$i]['validator_firstname'] = $obj->validator_firstname; $tab_result[$i]['validator_lastname'] = $obj->validator_lastname; - + $tab_result[$i]['validator_login'] = $obj->validator_login; + $tab_result[$i]['validator_statut'] = $obj->validator_statut; + $tab_result[$i]['validator_photo'] = $obj->validator_photo; + $i++; } @@ -412,10 +424,16 @@ class Holiday extends CommonObject $sql.= " uu.lastname as user_lastname,"; $sql.= " uu.firstname as user_firstname,"; - + $sql.= " uu.login as user_login,"; + $sql.= " uu.statut as user_statut,"; + $sql.= " uu.photo as user_photo,"; + $sql.= " ua.lastname as validator_lastname,"; - $sql.= " ua.firstname as validator_firstname"; - + $sql.= " ua.firstname as validator_firstname,"; + $sql.= " ua.login as validator_login,"; + $sql.= " ua.statut as validator_statut,"; + $sql.= " ua.photo as validator_photo"; + $sql.= " FROM ".MAIN_DB_PREFIX."holiday as cp, ".MAIN_DB_PREFIX."user as uu, ".MAIN_DB_PREFIX."user as ua"; $sql.= " WHERE cp.entity IN (".getEntity('holiday', 1).")"; $sql.= " AND cp.fk_user = uu.rowid AND cp.fk_validator = ua.rowid "; // Hack pour la recherche sur le tableau @@ -473,10 +491,16 @@ class Holiday extends CommonObject $tab_result[$i]['user_firstname'] = $obj->user_firstname; $tab_result[$i]['user_lastname'] = $obj->user_lastname; - + $tab_result[$i]['user_login'] = $obj->user_login; + $tab_result[$i]['user_statut'] = $obj->user_statut; + $tab_result[$i]['user_photo'] = $obj->user_photo; + $tab_result[$i]['validator_firstname'] = $obj->validator_firstname; $tab_result[$i]['validator_lastname'] = $obj->validator_lastname; - + $tab_result[$i]['validator_login'] = $obj->validator_login; + $tab_result[$i]['validator_statut'] = $obj->validator_statut; + $tab_result[$i]['validator_photo'] = $obj->validator_photo; + $i++; } // Retourne 1 et ajoute le tableau à la variable diff --git a/htdocs/holiday/document.php b/htdocs/holiday/document.php index e2554cffffb..4f45704a269 100644 --- a/htdocs/holiday/document.php +++ b/htdocs/holiday/document.php @@ -121,14 +121,14 @@ if ($object->id) print ''.$langs->trans("User").''; print ''; - print $userRequest->getNomUrl(1); + print $userRequest->getNomUrl(-1); print ''; // Type print ''; print ''.$langs->trans("Type").''; print ''; - $typeleaves=$object->getTypes(1,1); + $typeleaves=$object->getTypes(1,-1); print $typeleaves[$object->fk_type]['label']; print ''; print ''; diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index 013ee177726..a02d508cf1d 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -404,12 +404,18 @@ if (! empty($holiday->holiday)) $userstatic->id=$infos_CP['fk_user']; $userstatic->lastname=$infos_CP['user_lastname']; $userstatic->firstname=$infos_CP['user_firstname']; - + $userstatic->login=$infos_CP['user_login']; + $userstatic->statut=$infos_CP['user_statut']; + $userstatic->photo=$infos_CP['user_photo']; + // Valideur $approbatorstatic->id=$infos_CP['fk_validator']; $approbatorstatic->lastname=$infos_CP['validator_lastname']; $approbatorstatic->firstname=$infos_CP['validator_firstname']; - + $approbatorstatic->login=$infos_CP['validator_login']; + $approbatorstatic->statut=$infos_CP['validator_statut']; + $approbatorstatic->photo=$infos_CP['validator_photo']; + $date = $infos_CP['date_create']; print ''; @@ -419,8 +425,8 @@ if (! empty($holiday->holiday)) print $holidaystatic->getNomUrl(1); print ''; print ''.dol_print_date($date,'day').''; - print ''.$userstatic->getNomUrl('1', 'leave').''; - print ''.$approbatorstatic->getNomUrl('1').''; + print ''.$userstatic->getNomUrl(-1, 'leave').''; + print ''.$approbatorstatic->getNomUrl(-1).''; print ''; $label=$alltypeleaves[$infos_CP['fk_type']]['label']; print $label?$label:$infos_CP['fk_type']; diff --git a/htdocs/holiday/view_log.php b/htdocs/holiday/view_log.php index 1b0e779488a..8ee69dc54ad 100644 --- a/htdocs/holiday/view_log.php +++ b/htdocs/holiday/view_log.php @@ -100,8 +100,8 @@ foreach($cp->logs as $logs_CP) print ''; print ''.$logs_CP['rowid'].''; print ''.$logs_CP['date_action'].''; - print ''.$user_action->getNomUrl(1).''; - print ''.$user_update->getNomUrl(1).''; + print ''.$user_action->getNomUrl(-1).''; + print ''.$user_update->getNomUrl(-1).''; print ''.$logs_CP['type_action'].''; print ''; $label=$alltypeleaves[$logs_CP['fk_type']]['label']; diff --git a/htdocs/hrm/index.php b/htdocs/hrm/index.php index dc260fb4fa2..acc16eb0d3e 100644 --- a/htdocs/hrm/index.php +++ b/htdocs/hrm/index.php @@ -145,7 +145,7 @@ $langs->load("boxes"); // Last leave requests if (! empty($conf->holiday->enabled) && $user->rights->holiday->read) { - $sql = "SELECT u.rowid as uid, u.lastname, u.firstname, x.rowid, x.rowid as ref, x.fk_type, x.date_debut as date_start, x.date_fin as date_end, x.halfday, x.tms as dm, x.statut as status"; + $sql = "SELECT u.rowid as uid, u.lastname, u.firstname, u.login, u.photo, u.statut, x.rowid, x.rowid as ref, x.fk_type, x.date_debut as date_start, x.date_fin as date_end, x.halfday, x.tms as dm, x.statut as status"; $sql.= " FROM ".MAIN_DB_PREFIX."holiday as x, ".MAIN_DB_PREFIX."user as u"; $sql.= " WHERE u.rowid = x.fk_user"; $sql.= " AND x.entity = ".$conf->entity; @@ -187,9 +187,12 @@ if (! empty($conf->holiday->enabled) && $user->rights->holiday->read) $userstatic->id=$obj->uid; $userstatic->lastname=$obj->lastname; $userstatic->firstname=$obj->firstname; + $userstatic->login=$obj->login; + $userstatic->photo=$obj->photo; + $userstatic->statut=$obj->statut; print ''; print ''.$holidaystatic->getNomUrl(1).''; - print ''.$userstatic->getNomUrl(1, 'leave').''; + print ''.$userstatic->getNomUrl(-1, 'leave').''; print ''.$typeleaves[$obj->fk_type]['label'].''; $starthalfday=($obj->halfday == -1 || $obj->halfday == 2)?'afternoon':'morning'; @@ -218,7 +221,7 @@ if (! empty($conf->holiday->enabled) && $user->rights->holiday->read) // Last expense report (old module) if (! empty($conf->deplacement->enabled) && $user->rights->deplacement->lire) { - $sql = "SELECT u.rowid as uid, u.lastname, u.firstname, d.rowid, d.dated as date, d.tms as dm, d.km, d.fk_statut"; + $sql = "SELECT u.rowid as uid, u.lastname, u.firstname, u.login, u.statut, u.photo, d.rowid, d.dated as date, d.tms as dm, d.km, d.fk_statut"; $sql.= " FROM ".MAIN_DB_PREFIX."deplacement as d, ".MAIN_DB_PREFIX."user as u"; if (!$user->rights->societe->client->voir && !$user->societe_id) $sql.= ", ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."societe_commerciaux as sc"; $sql.= " WHERE u.rowid = d.fk_user"; @@ -258,9 +261,12 @@ if (! empty($conf->deplacement->enabled) && $user->rights->deplacement->lire) $userstatic->id=$obj->uid; $userstatic->lastname=$obj->lastname; $userstatic->firstname=$obj->firstname; + $userstatic->login=$obj->login; + $userstatic->statut=$obj->statut; + $userstatic->photo=$obj->photo; print ''; print ''.$deplacementstatic->getNomUrl(1).''; - print ''.$userstatic->getNomUrl(1).''; + print ''.$userstatic->getNomUrl(-1).''; print ''.$obj->km.''; print ''.dol_print_date($db->jdate($obj->dm),'day').''; print ''.$deplacementstatic->LibStatut($obj->fk_statut,3).''; @@ -282,7 +288,7 @@ if (! empty($conf->deplacement->enabled) && $user->rights->deplacement->lire) // Last expense report (new module) if (! empty($conf->expensereport->enabled) && $user->rights->expensereport->lire) { - $sql = "SELECT u.rowid as uid, u.lastname, u.firstname, x.rowid, x.ref, x.date_debut as date, x.tms as dm, x.total_ttc, x.fk_statut as status"; + $sql = "SELECT u.rowid as uid, u.lastname, u.firstname, u.login, u.statut, u.photo, x.rowid, x.ref, x.date_debut as date, x.tms as dm, x.total_ttc, x.fk_statut as status"; $sql.= " FROM ".MAIN_DB_PREFIX."expensereport as x, ".MAIN_DB_PREFIX."user as u"; if (!$user->rights->societe->client->voir && !$user->societe_id) $sql.= ", ".MAIN_DB_PREFIX."societe as s, ".MAIN_DB_PREFIX."societe_commerciaux as sc"; $sql.= " WHERE u.rowid = x.fk_user_author"; @@ -322,9 +328,12 @@ if (! empty($conf->expensereport->enabled) && $user->rights->expensereport->lire $userstatic->id=$obj->uid; $userstatic->lastname=$obj->lastname; $userstatic->firstname=$obj->firstname; + $userstatic->login=$obj->login; + $userstatic->statut=$obj->statut; + $userstatic->photo=$obj->photo; print ''; print ''.$expensereportstatic->getNomUrl(1).''; - print ''.$userstatic->getNomUrl(1).''; + print ''.$userstatic->getNomUrl(-1).''; print ''.price($obj->total_ttc).''; print ''.dol_print_date($db->jdate($obj->dm),'day').''; print ''.$expensereportstatic->LibStatut($obj->status,3).''; diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index d318e132f92..9be1124210f 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -1696,7 +1696,7 @@ class Societe extends CommonObject $reparray=array(); - $sql = "SELECT DISTINCT u.rowid, u.lastname, u.firstname, u.email, u.statut, u.entity"; + $sql = "SELECT DISTINCT u.rowid, u.login, u.lastname, u.firstname, u.email, u.statut, u.entity, u.photo"; $sql.= " FROM ".MAIN_DB_PREFIX."societe_commerciaux as sc, ".MAIN_DB_PREFIX."user as u"; if (! empty($conf->multicompany->enabled) && ! empty($conf->multicompany->transverse_mode)) { @@ -1724,6 +1724,8 @@ class Societe extends CommonObject $reparray[$i]['email']=$obj->email; $reparray[$i]['statut']=$obj->statut; $reparray[$i]['entity']=$obj->entity; + $reparray[$i]['login']=$obj->login; + $reparray[$i]['photo']=$obj->photo; $i++; } return $reparray; diff --git a/htdocs/societe/commerciaux.php b/htdocs/societe/commerciaux.php index 08d2bdd7a8b..e0f5ab7ec91 100644 --- a/htdocs/societe/commerciaux.php +++ b/htdocs/societe/commerciaux.php @@ -137,7 +137,7 @@ if (! empty($socid)) print ''.$langs->trans("SalesRepresentatives").''; print ''; - $sql = "SELECT DISTINCT u.rowid, u.login, u.fk_soc, u.lastname, u.firstname, u.statut, u.entity"; + $sql = "SELECT DISTINCT u.rowid, u.login, u.fk_soc, u.lastname, u.firstname, u.statut, u.entity, u.photo"; $sql .= " FROM ".MAIN_DB_PREFIX."user as u"; $sql .= " , ".MAIN_DB_PREFIX."societe_commerciaux as sc"; if (! empty($conf->multicompany->enabled) && ! empty($conf->multicompany->transverse_mode)) @@ -184,7 +184,8 @@ if (! empty($socid)) $tmpuser->login = $obj->login; $tmpuser->entity = $obj->entity; $tmpuser->societe_id = $obj->fk_soc; - print $tmpuser->getNomUrl(1); + $tmpuser->photo = $obj->photo; + print $tmpuser->getNomUrl(-1); /*print ''; print img_object($langs->trans("ShowUser"),"user").' '; @@ -227,7 +228,7 @@ if (! empty($socid)) $langs->load("users"); $title=$langs->trans("ListOfUsers"); - $sql = "SELECT DISTINCT u.rowid, u.lastname, u.firstname, u.login, u.email, u.statut, u.fk_soc"; + $sql = "SELECT DISTINCT u.rowid, u.lastname, u.firstname, u.login, u.email, u.statut, u.fk_soc, u.photo"; $sql.= " FROM ".MAIN_DB_PREFIX."user as u"; if (! empty($conf->multicompany->enabled) && ! empty($conf->multicompany->transverse_mode)) { @@ -273,10 +274,11 @@ if (! empty($socid)) $tmpuser->login=$obj->login; $tmpuser->email=$obj->email; $tmpuser->societe_id=$obj->fk_soc; - print $tmpuser->getNomUrl(1); + $tmpuser->photo=$obj->photo; + print $tmpuser->getNomUrl(-1); print ''; print ''.$obj->login.''; - print ''.User::LibStatut($obj->statut,0).''; + print ''.$tmpuser->getLibStatut(2).''; print ''.$langs->trans("Add").''; print ''."\n"; diff --git a/htdocs/societe/tpl/linesalesrepresentative.tpl.php b/htdocs/societe/tpl/linesalesrepresentative.tpl.php index 22d99d3e9c3..fe2add787c4 100644 --- a/htdocs/societe/tpl/linesalesrepresentative.tpl.php +++ b/htdocs/societe/tpl/linesalesrepresentative.tpl.php @@ -27,10 +27,12 @@ foreach($listsalesrepresentatives as $val) { $userstatic->id=$val['id']; + $userstatic->login=$val['login']; $userstatic->lastname=$val['lastname']; $userstatic->firstname=$val['firstname']; $userstatic->statut=$val['statut']; - print $userstatic->getNomUrl(1); + $userstatic->photo=$val['photo']; + print $userstatic->getNomUrl(-1); $i++; if ($i < $nbofsalesrepresentative) print ', '; } diff --git a/htdocs/user/group/card.php b/htdocs/user/group/card.php index 1da40878a62..541d847a45b 100644 --- a/htdocs/user/group/card.php +++ b/htdocs/user/group/card.php @@ -450,7 +450,7 @@ else print ""; print ''; - print ''.img_object($langs->trans("ShowUser"),"user").' '.$useringroup->login.''; + print $useringroup->getNomUrl(-1, '', 0, 0, 24, 0, 'login'); if ($useringroup->admin && ! $useringroup->entity) print img_picto($langs->trans("SuperAdministrator"),'redstar'); else if ($useringroup->admin) print img_picto($langs->trans("Administrator"),'star'); print ''; diff --git a/htdocs/user/home.php b/htdocs/user/home.php index 6bcd468f62e..a5e9db67867 100644 --- a/htdocs/user/home.php +++ b/htdocs/user/home.php @@ -139,7 +139,7 @@ if ($resql) $fuserstatic->email = $obj->email; $fuserstatic->skype = $obj->skype; $fuserstatic->societe_id = $obj->fk_soc; - print $fuserstatic->getNomUrl(1); + print $fuserstatic->getNomUrl(-1); if (! empty($conf->multicompany->enabled) && $obj->admin && ! $obj->entity) { print img_picto($langs->trans("SuperAdministrator"),'redstar'); From 959f4d0ba0d6bf374999dc03e1fdecfd800f3437 Mon Sep 17 00:00:00 2001 From: philippe grand Date: Thu, 1 Sep 2016 19:44:49 +0200 Subject: [PATCH 20/41] internationalized comments --- .../class/bonprelevement.class.php | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/htdocs/compta/prelevement/class/bonprelevement.class.php b/htdocs/compta/prelevement/class/bonprelevement.class.php index 924d8092485..12195e5e05e 100644 --- a/htdocs/compta/prelevement/class/bonprelevement.class.php +++ b/htdocs/compta/prelevement/class/bonprelevement.class.php @@ -22,7 +22,7 @@ /** * \file htdocs/compta/prelevement/class/bonprelevement.class.php * \ingroup prelevement - * \brief Fichier de la classe des bons de prelevements + * \brief File of withdrawal receipts class */ require_once DOL_DOCUMENT_ROOT.'/core/class/commonobject.class.php'; @@ -104,11 +104,11 @@ class BonPrelevement extends CommonObject } /** - * Add facture to withdrawal + * Add invoice to withdrawal * * @param int $facture_id id invoice to add * @param int $client_id id invoice customer - * @param string $client_nom name of cliente + * @param string $client_nom customer name * @param int $amount amount of invoice * @param string $code_banque code of bank withdrawal * @param string $code_guichet code of bank's office @@ -166,7 +166,7 @@ class BonPrelevement extends CommonObject * * @param int $line_id id line to add * @param int $client_id id invoice customer - * @param string $client_nom name of cliente + * @param string $client_nom customer name * @param int $amount amount of invoice * @param string $code_banque code of bank withdrawal * @param string $code_guichet code of bank's office @@ -182,7 +182,7 @@ class BonPrelevement extends CommonObject if ($concat == 1) { /* - * On aggrege les lignes + * We aggregate the lines */ $sql = "SELECT rowid"; $sql.= " FROM ".MAIN_DB_PREFIX."prelevement_lignes"; @@ -205,7 +205,7 @@ class BonPrelevement extends CommonObject else { /* - * Pas de d'agregation + * No aggregate */ $sql = "INSERT INTO ".MAIN_DB_PREFIX."prelevement_lignes ("; $sql.= "fk_prelevement_bons"; @@ -376,7 +376,7 @@ class BonPrelevement extends CommonObject } /* - * Fin de la procedure + * End of procedure */ if ($error == 0) { @@ -478,7 +478,7 @@ class BonPrelevement extends CommonObject $error++; } } - // Update prelevement line + // Update withdrawal line // TODO: Translate to ligneprelevement.class.php $sql = " UPDATE ".MAIN_DB_PREFIX."prelevement_lignes"; $sql.= " SET statut = 2"; @@ -605,8 +605,8 @@ class BonPrelevement extends CommonObject $arr = array(); /* - * Renvoie toutes les factures presente - * dans un bon de prelevement + * Returns all invoices presented + * within a withdrawal receipt */ $sql = "SELECT fk_facture"; if ($amounts) $sql .= ", SUM(pl.amount)"; From 50d46fa126d09ee53bad2b2af336f3799e85c928 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Thu, 1 Sep 2016 22:36:02 +0200 Subject: [PATCH 21/41] Fix: Product note & double header --- htdocs/product/info.php | 2 -- htdocs/product/note.php | 24 ++++++++++++++---------- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/htdocs/product/info.php b/htdocs/product/info.php index f725d0e17d9..e29d1a168cb 100644 --- a/htdocs/product/info.php +++ b/htdocs/product/info.php @@ -74,8 +74,6 @@ llxHeader('', $title, $helpurl); $form=new Form($b); -llxHeader('', $title, $help_url); - if ($id > 0 || $ref) { $result = $object->fetch($id,$ref); diff --git a/htdocs/product/note.php b/htdocs/product/note.php index ef53946460f..39f461a4a0e 100644 --- a/htdocs/product/note.php +++ b/htdocs/product/note.php @@ -30,17 +30,20 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/product.lib.php'; require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; -$action = GETPOST('action'); - $langs->load("companies"); +$id = GETPOST('id', 'int'); +$ref = GETPOST('ref', 'alpha'); +$action = GETPOST('action'); + // Security check -$id = GETPOST('id')?GETPOST('id','int'):GETPOST('socid','int'); -if ($user->societe_id) $id=$user->societe_id; -$result = restrictedArea($user, 'societe', $id, '&societe'); +$fieldvalue = (! empty($id) ? $id : (! empty($ref) ? $ref : '')); +$fieldtype = (! empty($ref) ? 'ref' : 'rowid'); +if ($user->societe_id) $socid=$user->societe_id; +$result=restrictedArea($user,'produit|service',$fieldvalue,'product&product','','',$fieldtype); $object = new Product($db); -if ($id > 0) $object->fetch($id); +if ($id > 0 || ! empty($ref)) $object->fetch($id, $ref); $permissionnote=$user->rights->produit->creer; // Used by the include of actions_setnotes.inc.php @@ -64,7 +67,7 @@ $form = new Form($db); llxHeader('', $langs->trans("ThirdParty").' - '.$langs->trans("Notes"), $help_url); -if ($id > 0) +if ($id > 0 || ! empty($ref)) { /* * Affichage onglets @@ -81,13 +84,14 @@ if ($id > 0) print '
'; print ''; - dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); + $linkback = ''.$langs->trans("BackToList").''; + + dol_banner_tab($object, 'ref', $linkback, ($user->societe_id?0:1), 'ref'); print '
'; print '
'; - //$colwidth='25'; - $cssclass='titlefield'; + $cssclass='titlefield'; include DOL_DOCUMENT_ROOT.'/core/tpl/notes.tpl.php'; From a54784588ba54c51fc7bb2855a63e56edbaf7faf Mon Sep 17 00:00:00 2001 From: aspangaro Date: Thu, 1 Sep 2016 22:39:01 +0200 Subject: [PATCH 22/41] Fix: Info tab on product card - Double header --- htdocs/product/info.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/htdocs/product/info.php b/htdocs/product/info.php index f725d0e17d9..e29d1a168cb 100644 --- a/htdocs/product/info.php +++ b/htdocs/product/info.php @@ -74,8 +74,6 @@ llxHeader('', $title, $helpurl); $form=new Form($b); -llxHeader('', $title, $help_url); - if ($id > 0 || $ref) { $result = $object->fetch($id,$ref); From 1c626c01eee96e1720e3aee0bd3fa3555c1d4645 Mon Sep 17 00:00:00 2001 From: fappels Date: Fri, 2 Sep 2016 11:29:28 +0200 Subject: [PATCH 23/41] Ignore time when checking lot dates --- .../stock/class/mouvementstock.class.php | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/htdocs/product/stock/class/mouvementstock.class.php b/htdocs/product/stock/class/mouvementstock.class.php index dde89bfb6e5..f9c844cd7c5 100644 --- a/htdocs/product/stock/class/mouvementstock.class.php +++ b/htdocs/product/stock/class/mouvementstock.class.php @@ -137,17 +137,26 @@ class MouvementStock extends CommonObject while ($i < $num) { $obj = $this->db->fetch_object($resql); - if ($this->db->jdate($obj->eatby) != $eatby) + // only check date values + $tmparray=dol_getdate($eatby, true); + $eatby=dol_mktime(0, 0, 0, $tmparray['mon'], $tmparray['mday'], $tmparray['year']); + $tmparray=dol_getdate($sellby, true); + $sellby=dol_mktime(0, 0, 0, $tmparray['mon'], $tmparray['mday'], $tmparray['year']); + $tmparray=dol_getdate($this->db->jdate($obj->eatby), true); + $dbEatby=dol_mktime(0, 0, 0, $tmparray['mon'], $tmparray['mday'], $tmparray['year']); + $tmparray=dol_getdate($this->db->jdate($obj->sellby), true); + $dbSellby=dol_mktime(0, 0, 0, $tmparray['mon'], $tmparray['mday'], $tmparray['year']); + if ($dbEatby != $eatby) { - $this->errors[]=$langs->trans("ThisSerialAlreadyExistWithDifferentDate", $batch, dol_print_date($this->db->jdate($obj->eatby)), dol_print_date($eatby)); - dol_syslog($langs->transnoentities("ThisSerialAlreadyExistWithDifferentDate", $batch, dol_print_date($this->db->jdate($obj->eatby)), dol_print_date($eatby)), LOG_ERR); + $this->errors[]=$langs->trans("ThisSerialAlreadyExistWithDifferentDate", $batch, dol_print_date($dbEatby), dol_print_date($eatby)); + dol_syslog($langs->transnoentities("ThisSerialAlreadyExistWithDifferentDate", $batch, dol_print_date($dbEatby), dol_print_date($eatby)), LOG_ERR); $this->db->rollback(); return -3; } - if ($this->db->jdate($obj->sellby) != $sellby) + if ($dbSellby != $sellby) { - $this->errors[]=$langs->trans("ThisSerialAlreadyExistWithDifferentDate", $batch, dol_print_date($this->db->jdate($obj->sellby)), dol_print_date($sellby)); - dol_syslog($langs->transnoentities("ThisSerialAlreadyExistWithDifferentDate", $batch, dol_print_date($this->db->jdate($obj->sellby)), dol_print_date($sellby)), LOG_ERR); + $this->errors[]=$langs->trans("ThisSerialAlreadyExistWithDifferentDate", $batch, dol_print_date($dbSellby), dol_print_date($sellby)); + dol_syslog($langs->transnoentities("ThisSerialAlreadyExistWithDifferentDate", $batch, dol_print_date($dbSellby), dol_print_date($sellby)), LOG_ERR); $this->db->rollback(); return -3; } From 416a0892d75438a4083c94176d803a5c723d8fa9 Mon Sep 17 00:00:00 2001 From: Ferran Marcet Date: Fri, 2 Sep 2016 12:32:14 +0200 Subject: [PATCH 24/41] Fix: An empty variable is used to update multiprice --- htdocs/product/price.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/htdocs/product/price.php b/htdocs/product/price.php index cfdcfd33db7..ef807d2f603 100644 --- a/htdocs/product/price.php +++ b/htdocs/product/price.php @@ -10,6 +10,7 @@ * Copyright (C) 2014 Ion agorria * Copyright (C) 2015 Alexandre Spangaro * Copyright (C) 2015 Marcos García + * 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 @@ -213,7 +214,7 @@ if (empty($reshook)) 'price' => $newprice[$i], 'price_min' => $newprice_min[$i], 'price_base_type' => $newpricebase[$i], - 'vat_tx' => $tva_tx, + 'vat_tx' => $tva_tx_txt, 'npr' => $npr, 'localtaxes_array' => array('0'=>$localtax1_type, '1'=>$localtax1, '2'=>$localtax2_type, '3'=>$localtax2) ); From b52e2f404cbba1963d33a20bbc83bb2bc0ac8f93 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 2 Sep 2016 14:47:59 +0200 Subject: [PATCH 25/41] NEW Can select fields/extrafields on contract list + Mass delete action. --- htdocs/commande/list.php | 6 +- htdocs/contrat/list.php | 573 +++++++++++++++++++++++++++++++-------- 2 files changed, 456 insertions(+), 123 deletions(-) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index cc4a156746f..5625b153ab1 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -95,11 +95,11 @@ $pagenext = $page + 1; if (! $sortfield) $sortfield='c.ref'; if (! $sortorder) $sortorder='DESC'; +$viewstatut=GETPOST('viewstatut'); + // Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array $contextpage='orderlist'; -$viewstatut=GETPOST('viewstatut'); - // Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array $hookmanager->initHooks(array('orderlist')); $extrafields = new ExtraFields($db); @@ -594,7 +594,7 @@ if ($resql) if (! empty($arrayfields['c.date_commande']['checked'])) print_liste_field_titre($arrayfields['c.date_commande']['label'],$_SERVER["PHP_SELF"],'c.date_commande','',$param, 'align="center"',$sortfield,$sortorder); if (! empty($arrayfields['c.date_delivery']['checked'])) print_liste_field_titre($arrayfields['c.date_delivery']['label'],$_SERVER["PHP_SELF"],'c.date_livraison','',$param, 'align="center"',$sortfield,$sortorder); if (! empty($arrayfields['c.total_ht']['checked'])) print_liste_field_titre($arrayfields['c.total_ht']['label'],$_SERVER["PHP_SELF"],'c.total_ht','',$param, 'align="right"',$sortfield,$sortorder); - if (! empty($arrayfields['c.total_vat']['checked'])) print_liste_field_titre($arrayfields['c.total_vat']['label'],$_SERVER["PHP_SELF"],'c.tva','',$param, 'align="right"',$sortfield,$sortorder); + if (! empty($arrayfields['c.total_vat']['checked'])) print_liste_field_titre($arrayfields['c.total_vat']['label'],$_SERVER["PHP_SELF"],'c.tva','',$param, 'align="right"',$sortfield,$sortorder); if (! empty($arrayfields['c.total_ttc']['checked'])) print_liste_field_titre($arrayfields['c.total_ttc']['label'],$_SERVER["PHP_SELF"],'c.total_ttc','',$param, 'align="right"',$sortfield,$sortorder); // Extra fields if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php index 9e0bf8a022d..72c852b10fc 100644 --- a/htdocs/contrat/list.php +++ b/htdocs/contrat/list.php @@ -31,13 +31,25 @@ require ("../main.inc.php"); require_once (DOL_DOCUMENT_ROOT."/contrat/class/contrat.class.php"); require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; $langs->load("contracts"); $langs->load("products"); $langs->load("companies"); $langs->load("compta"); +$action=GETPOST('action','alpha'); +$massaction=GETPOST('massaction','alpha'); +$show_files=GETPOST('show_files','int'); +$confirm=GETPOST('confirm','alpha'); +$toselect = GETPOST('toselect', 'array'); + $search_name=GETPOST('search_name'); +$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_contract=GETPOST('search_contract'); $search_ref_supplier=GETPOST('search_ref_supplier','alpha'); $sall=GETPOST('sall'); @@ -73,6 +85,7 @@ $staticcontratligne=new ContratLigne($db); if ($search_status == '') $search_status=1; +// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array $contextpage='contractlist'; // Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array @@ -80,9 +93,8 @@ $hookmanager->initHooks(array($contextpage)); $extrafields = new ExtraFields($db); // fetch optionals attributes and labels -$extralabels = $extrafields->fetch_name_optionals_label('contract'); +$extralabels = $extrafields->fetch_name_optionals_label('contrat'); $search_array_options=$extrafields->getOptionalsFromPost($extralabels,'','search_'); - // List of fields to search into when doing a "search in all" $fieldstosearchall = array( 'c.ref'=>'Ref', @@ -94,25 +106,56 @@ $fieldstosearchall = array( ); if (empty($user->socid)) $fieldstosearchall["c.note_private"]="NotePrivate"; +$arrayfields=array( + 'c.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1), + 'c.ref_customer'=>array('label'=>$langs->trans("RefCustomer"), 'checked'=>1), + 'c.ref_supplier'=>array('label'=>$langs->trans("RefSupplier"), 'checked'=>1), + 's.nom'=>array('label'=>$langs->trans("ThirdParty"), 'checked'=>1), + 's.town'=>array('label'=>$langs->trans("Town"), 'checked'=>0), + 's.zip'=>array('label'=>$langs->trans("Zip"), 'checked'=>0), + 'state.nom'=>array('label'=>$langs->trans("StateShort"), 'checked'=>0), + 'country.code_iso'=>array('label'=>$langs->trans("Country"), 'checked'=>0), + 'sale_representative'=>array('label'=>$langs->trans("SalesRepresentative"), 'checked'=>1), + 'c.date_contrat'=>array('label'=>$langs->trans("DateContract"), 'checked'=>1), + 'c.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), + 'c.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500), + 'status'=>array('label'=>$langs->trans("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]); + } +} + /* * Action */ -$parameters=array(); -$reshook=$hookmanager->executeHooks('doActions',$parameters, $object, $action); // Note that $action and $object may have been modified by some hooks +if (GETPOST('cancel')) { $action='list'; $massaction=''; } +if (! GETPOST('confirmmassaction') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction=''; } + +$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'); include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php'; -if (empty($reshook)) +// 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")) // Both test are required to be compatible with all browsers -{ - $search_name=""; + $day=''; + $month=''; + $year=''; + $search_name=""; + $search_town=''; + $search_zip=""; + $search_state=""; + $search_type=''; + $search_country=''; $search_contract=""; $search_ref_supplier=""; $search_user=''; @@ -120,10 +163,18 @@ if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETP $search_product_category=''; $sall=""; $search_status=""; + $toselect=''; $search_array_options=array(); - $day=''; - $month=''; - $year=''; +} + +if (empty($reshook)) +{ + $objectclass='Contrat'; + $objectlabel='Contracts'; + $permtoread = $user->rights->contrat->lire; + $permtodelete = $user->rights->contrat->supprimer; + $uploaddir = $conf->contrat->dir_output; + include DOL_DOCUMENT_ROOT.'/core/actions_massactions.inc.php'; } @@ -139,16 +190,28 @@ $socstatic = new Societe($db); llxHeader(); $sql = 'SELECT'; -$sql.= " c.rowid as cid, c.ref, c.datec, c.date_contrat, c.statut, c.ref_customer, c.ref_supplier,"; -$sql.= " s.nom as name, s.rowid as socid,"; +$sql.= " c.rowid, c.ref, c.datec as date_creation, c.tms as date_update, c.date_contrat, c.statut, c.ref_customer, c.ref_supplier,"; +$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.= ' SUM('.$db->ifsql("cd.statut=0",1,0).') as nb_initial,'; $sql.= ' SUM('.$db->ifsql("cd.statut=4 AND (cd.date_fin_validite IS NULL OR cd.date_fin_validite >= '".$db->idate($now)."')",1,0).') as nb_running,'; $sql.= ' SUM('.$db->ifsql("cd.statut=4 AND (cd.date_fin_validite IS NOT NULL AND cd.date_fin_validite < '".$db->idate($now)."')",1,0).') as nb_expired,'; $sql.= ' SUM('.$db->ifsql("cd.statut=4 AND (cd.date_fin_validite IS NOT NULL AND cd.date_fin_validite < '".$db->idate($now - $conf->contrat->services->expires->warning_delay)."')",1,0).') as nb_late,'; $sql.= ' SUM('.$db->ifsql("cd.statut=5",1,0).') as nb_closed'; +// 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."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)"; if ($search_sale > 0 || (! $user->rights->societe->client->voir && ! $socid)) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; $sql.= ", ".MAIN_DB_PREFIX."contrat as c"; +if (is_array($extrafields->attribute_label) && count($extrafields->attribute_label)) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."contrat_extrafields as ef on (c.rowid = ef.fk_object)"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."contratdet as cd ON c.rowid = cd.fk_contrat"; if ($search_product_category > 0) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX.'categorie_product as cp ON cp.fk_product=cd.fk_product'; if ($search_user > 0) @@ -183,14 +246,46 @@ if ($search_sale > 0) } if ($sall) $sql .= natural_search(array_keys($fieldstosearchall), $sall); if ($search_user > 0) $sql.= " AND ec.fk_c_type_contact = tc.rowid AND tc.element='contrat' AND tc.source='internal' AND ec.element_id = c.rowid AND ec.fk_socpeople = ".$search_user; -$sql.= " GROUP BY c.rowid, c.ref, c.datec, c.date_contrat, c.statut, c.ref_customer, c.ref_supplier, s.nom, s.rowid"; +// 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 c.rowid, c.ref, c.datec, c.tms, c.date_contrat, c.statut, c.ref_customer, c.ref_supplier,"; +$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"; +// Add where from extra fields +foreach ($extrafields->attribute_label as $key => $val) +{ + $sql .= ', ef.'.$val; +} +// Add where from hooks +$parameters=array(); +$reshook=$hookmanager->executeHooks('printFieldListGroupBy',$parameters); // Note that $action and $object may have been modified by hook +$sql.=$hookmanager->resPrint; + +$sql.= $db->order($sortfield,$sortorder); + $totalnboflines=0; $result=$db->query($sql); if ($result) { $totalnboflines = $db->num_rows($result); } -$sql.= $db->order($sortfield,$sortorder); $nbtotalofrecords = 0; if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) @@ -207,23 +302,46 @@ if ($resql) $num = $db->num_rows($resql); $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; - $param.='&search_contract='.$search_contract; - $param.='&search_name='.$search_name; - $param.='&search_ref_supplier='.$search_ref_supplier; - $param.='&search_sale=' .$search_sale; - if ($optioncss != '') $param.='&optioncss='.$optioncss; + if ($search_contract) $param.='&search_contract='.$search_contract; + if ($search_name) $param.='&search_name='.$search_name; + if ($search_ref_supplier) $param.='&search_ref_supplier='.$search_ref_supplier; + if ($search_sale) $param.='&search_sale=' .$search_sale; + if ($show_files) $param.='&show_files=' .$show_files; + 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); + } + + // List of mass actions available + $arrayofmassactions = array( + //'presend'=>$langs->trans("SendByMail"), + //'builddoc'=>$langs->trans("PDFMerge"), + ); + if ($user->rights->contrat->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_barre_liste($langs->trans("ListOfContracts"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder,'',$num,$totalnboflines,'title_commercial.png', 0, '', '', $limit); + print_barre_liste($langs->trans("ListOfContracts"), $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $totalnboflines, 'title_commercial.png', 0, '', '', $limit); if ($sall) { @@ -231,8 +349,9 @@ if ($resql) print $langs->trans("FilterOnInto", $sall) . join(', ',$fieldstosearchall); } - // If the user can view prospects other than his' $moreforfilter=''; + + // If the user can view prospects other than his' if ($user->rights->societe->client->voir || $socid) { $langs->load("commercial"); @@ -264,6 +383,7 @@ if ($resql) $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 '
'; @@ -271,52 +391,164 @@ if ($resql) print '
'; } - print ''; + $varpage=empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage; + $selectedfields=$form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields + + print '
'."\n"; print ''; - - print_liste_field_titre($langs->trans("Ref"), $_SERVER["PHP_SELF"], "c.ref","","$param",'',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("RefCustomer"), $_SERVER["PHP_SELF"], "c.ref_customer","","$param",'',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("RefSupplier"), $_SERVER["PHP_SELF"], "c.ref_supplier","","$param",'',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("ThirdParty"), $_SERVER["PHP_SELF"], "s.nom","","$param",'',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("SalesRepresentative"), $_SERVER["PHP_SELF"], "","","$param",'',$sortfield,$sortorder); - //print_liste_field_titre($langs->trans("DateCreation"), $_SERVER["PHP_SELF"], "c.datec","","$param",'align="center"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("DateContract"), $_SERVER["PHP_SELF"], "c.date_contrat","","$param",'align="center"',$sortfield,$sortorder); - //print_liste_field_titre($langs->trans("Status"), $_SERVER["PHP_SELF"], "c.statut","","$param",'align="center"',$sortfield,$sortorder); - print_liste_field_titre($staticcontratligne->LibStatut(0,3), '', '', '', '', 'width="16"'); - print_liste_field_titre($staticcontratligne->LibStatut(4,3,0), '', '', '', '', 'width="16"'); - print_liste_field_titre($staticcontratligne->LibStatut(4,3,1), '', '', '', '', 'width="16"'); - print_liste_field_titre($staticcontratligne->LibStatut(5,3), '', '', '', '', 'width="16"'); - print_liste_field_titre('',$_SERVER["PHP_SELF"],"",'','','',$sortfield,$sortorder,'maxwidthsearch '); + if (! empty($arrayfields['c.ref']['checked'])) print_liste_field_titre($arrayfields['c.ref']['label'], $_SERVER["PHP_SELF"], "c.ref","","$param",'',$sortfield,$sortorder); + if (! empty($arrayfields['c.ref_customer']['checked'])) print_liste_field_titre($arrayfields['c.ref_customer']['label'], $_SERVER["PHP_SELF"], "c.ref_customer","","$param",'',$sortfield,$sortorder); + if (! empty($arrayfields['c.ref_supplier']['checked'])) print_liste_field_titre($arrayfields['c.ref_supplier']['label'], $_SERVER["PHP_SELF"], "c.ref_supplier","","$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['sale_representative']['checked'])) print_liste_field_titre($arrayfields['sale_representative']['label'], $_SERVER["PHP_SELF"], "","","$param",'',$sortfield,$sortorder); + if (! empty($arrayfields['c.date_contrat']['checked'])) print_liste_field_titre($arrayfields['c.date_contrat']['label'], $_SERVER["PHP_SELF"], "c.date_contrat","","$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($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['c.datec']['checked'])) print_liste_field_titre($arrayfields['c.datec']['label'],$_SERVER["PHP_SELF"],"c.date_creation","",$param,'align="center" class="nowrap"',$sortfield,$sortorder); + if (! empty($arrayfields['c.tms']['checked'])) print_liste_field_titre($arrayfields['c.tms']['label'],$_SERVER["PHP_SELF"],"c.tms","",$param,'align="center" class="nowrap"',$sortfield,$sortorder); + if (! empty($arrayfields['status']['checked'])) + { + print_liste_field_titre($staticcontratligne->LibStatut(0,3), '', '', '', '', 'width="16"'); + print_liste_field_titre($staticcontratligne->LibStatut(4,3,0), '', '', '', '', 'width="16"'); + print_liste_field_titre($staticcontratligne->LibStatut(4,3,1), '', '', '', '', 'width="16"'); + print_liste_field_titre($staticcontratligne->LibStatut(5,3), '', '', '', '', 'width="16"'); + } + print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"],"",'','','align="right"',$sortfield,$sortorder,'maxwidthsearch '); print "\n"; print ''; print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - // Date contract - print ''; - print ''; - print ''; + } + if (! empty($arrayfields['c.ref_customer']['checked'])) + { + print ''; + } + if (! empty($arrayfields['c.ref_supplier']['checked'])) + { + print ''; + } + if (! empty($arrayfields['s.nom']['checked'])) + { + print ''; + } + // Town + if (! empty($arrayfields['s.town']['checked'])) print ''; + // Zip + 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 ''; + } + if (! empty($arrayfields['sale_representative']['checked'])) + { + print ''; + } + if (! empty($arrayfields['c.date_contrat']['checked'])) + { + // Date contract + 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['c.datec']['checked'])) + { + print ''; + } + // Date modification + if (! empty($arrayfields['c.tms']['checked'])) + { + print ''; + } + // Status + if (! empty($arrayfields['status']['checked'])) + { + print ''; + } + print ''; print "\n"; @@ -326,65 +558,166 @@ if ($resql) $obj = $db->fetch_object($resql); $var=!$var; print ''; - print ''; - print ''; - print ''; - print ''; - //print ''; - - // Sales Rapresentatives - print ''; } - else + if (! empty($arrayfields['c.ref_customer']['checked'])) { - print ' '; + print ''; + } + if (! empty($arrayfields['c.ref_supplier']['checked'])) + { + print ''; + } + if (! empty($arrayfields['s.nom']['checked'])) + { + print ''; + } + // 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']++; + } + if (! empty($arrayfields['sale_representative']['checked'])) + { + // Sales representatives + print ''; + } + // Date + if (! empty($arrayfields['c.date_contrat']['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'])) + { + 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['c.datec']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Date modification + if (! empty($arrayfields['c.tms']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Status + if (! empty($arrayfields['status']['checked'])) + { + print ''; + print ''; + print ''; + print ''; + } + // Action column + print ''; - - - print ''; - //print ''; - print ''; - print ''; - print ''; - print ''; - print ''; + if (! $i) $totalarray['nbfield']++; + print "\n"; $i++; } From fcd5e1fb2c529a5eb9c5e501c23094bab5e9a05e Mon Sep 17 00:00:00 2001 From: phf Date: Fri, 2 Sep 2016 15:30:42 +0200 Subject: [PATCH 26/41] Fix lost value if use double quote --- htdocs/societe/soc.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/societe/soc.php b/htdocs/societe/soc.php index 3a5ed38e2d5..d2fccc12f9b 100644 --- a/htdocs/societe/soc.php +++ b/htdocs/societe/soc.php @@ -252,7 +252,7 @@ if (empty($reshook)) $object->name_alias = GETPOST('name_alias'); } - $object->address = GETPOST('address', 'alpha'); + $object->address = GETPOST('address'); $object->zip = GETPOST('zipcode', 'alpha'); $object->town = GETPOST('town', 'alpha'); $object->country_id = GETPOST('country_id', 'int'); From aedd8132363cc4ae9760521cf37afcdc7cef831a Mon Sep 17 00:00:00 2001 From: fappels Date: Fri, 2 Sep 2016 18:13:25 +0200 Subject: [PATCH 27/41] Delete product_lot when product deleted --- htdocs/product/class/product.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 98cadbff7d9..1b94b00d1bf 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -926,7 +926,7 @@ class Product extends CommonObject // Delete all child tables if (! $error) { - $elements = array('product_fournisseur_price','product_price','product_lang','categorie_product','product_stock','product_customer_price'); + $elements = array('product_fournisseur_price','product_price','product_lang','categorie_product','product_stock','product_customer_price','product_lot'); foreach($elements as $table) { if (! $error) From 9c8145eb885059218815bd4efa92e252aa4c4e23 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 2 Sep 2016 19:19:13 +0200 Subject: [PATCH 28/41] Better fix for 416a0892d75438a4083c94176d803a5c723d8fa9 --- htdocs/product/price.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/htdocs/product/price.php b/htdocs/product/price.php index ef807d2f603..8c3ad45c90c 100644 --- a/htdocs/product/price.php +++ b/htdocs/product/price.php @@ -97,8 +97,6 @@ if (empty($reshook)) { $tva_tx_txt = GETPOST('tva_tx', 'alpha'); // tva_tx can be '8.5' or '8.5*' or '8.5 - $tva_tx_txt; - // We must define tva_tx, npr and local taxes $tva_tx = preg_replace('/[^0-9\.].*$/', '', $tva_tx_txt); // keep remove all after the numbers and dot $npr = preg_match('/\*/', $tva_tx_txt) ? 1 : 0; @@ -204,6 +202,7 @@ if (empty($reshook)) } $tva_tx_txt = $newvattx[$i]; + $tva_tx = preg_replace('/[^0-9\.].*$/', '', $tva_tx_txt); // keep remove all after the numbers and dot $npr = $newvatnpr[$i]; $localtax1 = $newlocaltax1_tx[$i]; $localtax1_type = $newlocaltax1_type[$i]; @@ -214,7 +213,7 @@ if (empty($reshook)) 'price' => $newprice[$i], 'price_min' => $newprice_min[$i], 'price_base_type' => $newpricebase[$i], - 'vat_tx' => $tva_tx_txt, + 'vat_tx' => $tva_tx, 'npr' => $npr, 'localtaxes_array' => array('0'=>$localtax1_type, '1'=>$localtax1, '2'=>$localtax2_type, '3'=>$localtax2) ); From dc9c2f0ed7190ddec07d19aa84ce2022330f5169 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 2 Sep 2016 21:10:46 +0200 Subject: [PATCH 29/41] FIX #5687 --- scripts/cron/cron_run_jobs.php | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/cron/cron_run_jobs.php b/scripts/cron/cron_run_jobs.php index 38054c48c69..a0f067b5d0c 100755 --- a/scripts/cron/cron_run_jobs.php +++ b/scripts/cron/cron_run_jobs.php @@ -27,7 +27,6 @@ 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('NOLOGIN')) define('NOLOGIN','1'); //if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); From 8c4324d9124e0551da38dff74ac602eb0afbf361 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 2 Sep 2016 21:15:48 +0200 Subject: [PATCH 30/41] FIX #5674 --- htdocs/product/stock/class/mouvementstock.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/product/stock/class/mouvementstock.class.php b/htdocs/product/stock/class/mouvementstock.class.php index 7d7dd66bd10..ef59971d95e 100644 --- a/htdocs/product/stock/class/mouvementstock.class.php +++ b/htdocs/product/stock/class/mouvementstock.class.php @@ -415,8 +415,8 @@ class MouvementStock extends CommonObject // $sql = "UPDATE ".MAIN_DB_PREFIX."product SET pmp = ".$newpmp.", stock = ".$this->db->ifsql("stock IS NULL", 0, "stock") . " + ".$qty; // $sql.= " WHERE rowid = ".$fk_product; // Update pmp + denormalized fields because we change content of produt_stock. Warning: Do not use "SET p.stock", does not works with pgsql - $sql = "UPDATE ".MAIN_DB_PREFIX."product as p SET p.pmp = ".$newpmp.", "; - $sql.= " stock=(SELECT SUM(ps.reel) FROM ".MAIN_DB_PREFIX."product_stock ps WHERE ps.fk_product = p.rowid)"; + $sql = "UPDATE ".MAIN_DB_PREFIX."product as p SET pmp = ".$newpmp.", "; + $sql.= " stock=(SELECT SUM(ps.reel) FROM ".MAIN_DB_PREFIX."product_stock as ps WHERE ps.fk_product = p.rowid)"; $sql.= " WHERE rowid = ".$fk_product; dol_syslog(get_class($this)."::_create", LOG_DEBUG); From 78b2e9e4bfc0838051e588345070bd15081d97b2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 2 Sep 2016 21:40:07 +0200 Subject: [PATCH 31/41] FIX #5651 --- htdocs/webservices/server_contact.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/webservices/server_contact.php b/htdocs/webservices/server_contact.php index f439e791cb4..8a12c288d55 100644 --- a/htdocs/webservices/server_contact.php +++ b/htdocs/webservices/server_contact.php @@ -660,7 +660,7 @@ function updateContact($authentication,$contact) $object->civility_id=$contact['civility_id']; $object->poste=$contact['poste']; - $object->statut=$contact['statut']; + $object->statut=$contact['status']; //Retreive all extrafield for contact From e19743519b85de9baf3b4d03a0bfd4c3a81ce212 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 2 Sep 2016 21:44:52 +0200 Subject: [PATCH 32/41] FIX #5660 --- htdocs/webservices/server_order.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/webservices/server_order.php b/htdocs/webservices/server_order.php index 28518d24763..de72af93b61 100644 --- a/htdocs/webservices/server_order.php +++ b/htdocs/webservices/server_order.php @@ -935,7 +935,7 @@ function updateOrder($authentication,$order) if (isset($order['billed'])) { if ($order['billed']) $result=$object->classifyBilled($fuser); - if (! $order['billed']) $result=$object->classifyBilled($fuser); + if (! $order['billed']) $result=$object->classifyUnBilled($fuser); } //Retreive all extrafield for object From dc1bc33343318acfaad86c0a1f1ce27e0459fb58 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 2 Sep 2016 21:48:02 +0200 Subject: [PATCH 33/41] sql syntax --- htdocs/supplier_proposal/class/supplier_proposal.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/supplier_proposal/class/supplier_proposal.class.php b/htdocs/supplier_proposal/class/supplier_proposal.class.php index 00efb287dcc..09fa2dc69e9 100644 --- a/htdocs/supplier_proposal/class/supplier_proposal.class.php +++ b/htdocs/supplier_proposal/class/supplier_proposal.class.php @@ -1192,8 +1192,8 @@ class SupplierProposal extends CommonObject $sql = "SELECT d.rowid, d.fk_supplier_proposal, d.fk_parent_line, d.label as custom_label, d.description, d.price, d.tva_tx, d.localtax1_tx, d.localtax2_tx, d.qty, d.fk_remise_except, d.remise_percent, d.subprice, d.fk_product,"; $sql.= " d.info_bits, d.total_ht, d.total_tva, d.total_localtax1, d.total_localtax2, d.total_ttc, d.fk_product_fournisseur_price as fk_fournprice, d.buy_price_ht as pa_ht, d.special_code, d.rang, d.product_type,"; $sql.= ' p.ref as product_ref, p.description as product_desc, p.fk_product_type, p.label as product_label,'; - $sql.= ' d.ref_fourn as ref_produit_fourn'; - $sql.= ' ,d.fk_multicurrency, d.multicurrency_code, d.multicurrency_subprice, d.multicurrency_total_ht, d.multicurrency_total_tva, d.multicurrency_total_ttc'; + $sql.= ' d.ref_fourn as ref_produit_fourn,'; + $sql.= ' d.fk_multicurrency, d.multicurrency_code, d.multicurrency_subprice, d.multicurrency_total_ht, d.multicurrency_total_tva, d.multicurrency_total_ttc'; $sql.= " FROM ".MAIN_DB_PREFIX."supplier_proposaldet as d"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON d.fk_product = p.rowid"; $sql.= " WHERE d.fk_supplier_proposal = ".$this->id; From eee53998adbdf7c8f51aeb1e634b07e55602baad Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 2 Sep 2016 22:13:47 +0200 Subject: [PATCH 34/41] Mark function as deprecated #5577 --- ChangeLog | 2 ++ htdocs/core/lib/pdf.lib.php | 1 + 2 files changed, 3 insertions(+) diff --git a/ChangeLog b/ChangeLog index 5b93245f378..ad4b18285a5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -25,6 +25,8 @@ Dolibarr better: check you make a fetch on object before calling the delete. - The old driver of "mysql" has been removed. Dolibarr use the new one (mysqli) by default. - Remove not used function calculate_byte(). Use dol_print_size() instead. +- Function pdf_getTotalQty is now deprecated. Not used by Dolibarr core. + ***** ChangeLog for 4.0.0 compared to 3.9.* ***** diff --git a/htdocs/core/lib/pdf.lib.php b/htdocs/core/lib/pdf.lib.php index 9a1ba356969..2319b52c2b1 100644 --- a/htdocs/core/lib/pdf.lib.php +++ b/htdocs/core/lib/pdf.lib.php @@ -1846,6 +1846,7 @@ function pdf_getlinetotalwithtax($object,$i,$outputlangs,$hidedetails=0) * @param string $type Type * @param Translate $outputlangs Object langs for output * @return integer + * @deprecated Not used by Dolibarr core, so will be removed. */ function pdf_getTotalQty($object,$type,$outputlangs) { From aab3b2837a6b652d954aa2cb4f3037f22b5760eb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 2 Sep 2016 22:34:37 +0200 Subject: [PATCH 35/41] FIX #5589 --- htdocs/core/lib/security2.lib.php | 1 + htdocs/langs/en_US/errors.lang | 1 + 2 files changed, 2 insertions(+) diff --git a/htdocs/core/lib/security2.lib.php b/htdocs/core/lib/security2.lib.php index a32805b6169..dc73c70b4ba 100644 --- a/htdocs/core/lib/security2.lib.php +++ b/htdocs/core/lib/security2.lib.php @@ -106,6 +106,7 @@ function checkLoginPassEntity($usertotest,$passwordtotest,$entitytotest,$authmod sleep(1); $langs->load('main'); $langs->load('other'); + $langs->load('errors'); $_SESSION["dol_loginmesg"]=$langs->trans("ErrorFailedToLoadLoginFileForMode",$mode); } } diff --git a/htdocs/langs/en_US/errors.lang b/htdocs/langs/en_US/errors.lang index acbb0e286b9..0462b4d1dc9 100644 --- a/htdocs/langs/en_US/errors.lang +++ b/htdocs/langs/en_US/errors.lang @@ -174,6 +174,7 @@ ErrorStockIsNotEnoughToAddProductOnOrder=Stock is not enougth for product %s to ErrorStockIsNotEnoughToAddProductOnInvoice=Stock is not enougth for product %s to add it into a new invoice. ErrorStockIsNotEnoughToAddProductOnShipment=Stock is not enougth for product %s to add it into a new shipment. ErrorStockIsNotEnoughToAddProductOnProposal=Stock is not enougth for product %s to add it into a new proposal. +ErrorFailedToLoadLoginFileForMode=Failed to get the login file for mode '%s'. # Warnings WarningPasswordSetWithNoAccount=A password was set for this member. However, no user account was created. So this password is stored but can't be used to login to Dolibarr. It may be used by an external module/interface but if you don't need to define any login nor password for a member, you can disable option "Manage a login for each member" from Member module setup. If you need to manage a login but don't need any password, you can keep this field empty to avoid this warning. Note: Email can also be used as a login if the member is linked to a user. From cb27b018121a0d2c4457f5f357b093253b2b114d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 3 Sep 2016 18:47:04 +0200 Subject: [PATCH 36/41] Work on feature to find a translation key --- doc/images/dolibarr_screenshot1_1280x800.jpg | Bin 0 -> 239056 bytes htdocs/admin/translation.php | 234 ++++++++++--------- htdocs/core/class/html.formadmin.class.php | 9 +- htdocs/core/lib/admin.lib.php | 31 +++ 4 files changed, 161 insertions(+), 113 deletions(-) create mode 100644 doc/images/dolibarr_screenshot1_1280x800.jpg diff --git a/doc/images/dolibarr_screenshot1_1280x800.jpg b/doc/images/dolibarr_screenshot1_1280x800.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c6d5776d1fc1a3aadda5ce1abfbd8d3be9f9e222 GIT binary patch literal 239056 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�?z)P4)=4$Xs+e+uSxe*7B*3xrP`#L6;>xJ^947UNja5c3seSC@@2yagY){qcO zqySUs!yujSRS)o9;-)-+E-G&#W?n`q}R|HYRs8M|_YHM#o z3S&aac(nSyJu_{gUXK}cGtC+m=gDNO`HrmKo=Qmm;ka^cv!+$8kbEgydQBX zGsbq=@gszL_cmwmo9g2z@>BIOrFYJL2a`AUN}t3Pz(8go+2GvVi%1&9xg#?y=6G24%uk8(1c_3=qNDd}z~4n1b06iZLH#o6GBzp8F>jIgP2lSPC= zr>R;H?@byViFcYS5h`UztxL$y zX|v|5E8G)P$UT{y<1{uQNK7qA8(I;G4TS(Y87P zl>`Drrw&x0=4(Z$vac@tWz#h;CWFvc_bEW4fL|y^lQeXsTluUR-t|O&>*D3g#iPO* zn$ZBegH7S`wnmPu_^N!3;TFI7*<)~l5$B??!$51WzC#SnTo%s*6DE^%jJa2ep8bxzFG3GVoo;9gwgy|K)a4#`-(KU+e#03o*RES8h@;sRQSvPHs6r&?ae^3M%+N zS^R#muY%ngAGZ0pa6-_|1Psh;;WE&LfQ_LInLZigvvcfhcGTI+E<`3F6dI=mIo`@M zh~@@Mx}X3a!-KN%N((rremoL{dc#X5!1=T4;Eusk`=~#5H9Wae5~0Lcw#QGn7VDhLl~

t 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

O2Uv9H)Ne1TUS@L02BC-*tIs!n`;C^%qY-gb;sl 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

L)9NXpha#L5_B{A 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 literal 0 HcmV?d00001 diff --git a/htdocs/admin/translation.php b/htdocs/admin/translation.php index bfd21deee33..8d959a9decb 100644 --- a/htdocs/admin/translation.php +++ b/htdocs/admin/translation.php @@ -40,6 +40,8 @@ $langcode=GETPOST('langcode','alpha'); $transkey=GETPOST('transkey','alpha'); $transvalue=GETPOST('transvalue','alpha'); +$mode = GETPOST('mode')?GETPOST('mode'):'overwrite'; + $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit; $sortfield = GETPOST("sortfield",'alpha'); $sortorder = GETPOST("sortorder",'alpha'); @@ -124,7 +126,7 @@ $formadmin = new FormAdmin($db); $wikihelp='EN:Setup|FR:Paramétrage|ES:Configuración'; llxHeader('',$langs->trans("Setup"),$wikihelp); -print load_fiche_titre($langs->trans("TranslationSetup"),'','title_setup'); +print load_fiche_titre($langs->trans("Translation"),'','title_setup'); print $langs->trans("TranslationDesc")."
\n"; print "
\n"; @@ -140,16 +142,24 @@ print $langs->trans("TranslationOverwriteDesc",$langs->transnoentitiesnoconv("La print '
'; -$param=''; -if ($conf->global->MAIN_FEATURES_LEVEL > 1) +$param='mode='.$mode; + + +print 'entity) && $debug)?'?debug=1':'').'" method="POST">'; + +$head=translation_prepare_head(); + +dol_fiche_head($head, $mode, '', 0, ''); + +if ($mode == 'searchkey') { - print '
'; - print load_fiche_titre($langs->trans("TranslationKeySearch"), '', '')."\n"; + //print '
'; + //print load_fiche_titre($langs->trans("TranslationKeySearch"), '', '')."\n"; - print 'entity) && $debug)?'?debug=1':'').'" method="POST">'; print ''; - print ''; + print ''; + print ''; print '

'; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - //print $langs->trans('Month').': '; - if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; - print ''; - //print ' '.$langs->trans('Year').': '; - $syear = $year; - $formother->select_year($syear,'year',1, 20, 5); - print ''; - $searchpitco=$form->showFilterAndCheckAddButtons(0); - print $searchpitco; + if (! empty($arrayfields['c.ref']['checked'])) + { + print ''; + print ''; + print ''; + print ''; + 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').': '; + if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; + print ''; + //print ' '.$langs->trans('Year').': '; + $syear = $year; + $formother->select_year($syear,'year',1, 20, 5); + 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 ''; + $searchpitco=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); + print $searchpitco; print '
'; - print img_object($langs->trans("ShowContract"),"contract").' '.(isset($obj->ref) ? $obj->ref : $obj->cid) .''; - if ($obj->nb_late) print img_warning($langs->trans("Late")); - print ''.$obj->ref_customer.''.$obj->ref_supplier.''.img_object($langs->trans("ShowCompany"),"company").' '.$obj->name.''.dol_print_date($obj->datec).''; - if($obj->socid) + if (! empty($arrayfields['c.ref']['checked'])) { - $result=$socstatic->fetch($obj->socid); - if ($result < 0) - { - dol_print_error($db); - exit; - } - $listsalesrepresentatives=$socstatic->getSalesRepresentatives($user); - if ($listsalesrepresentatives < 0) dol_print_error($db); - $nbofsalesrepresentative=count($listsalesrepresentatives); - if ($nbofsalesrepresentative > 3) // We print only number - { - print ''; - print $nbofsalesrepresentative; - print ''; - } - else if ($nbofsalesrepresentative > 0) - { - $userstatic=new User($db); - $j=0; - foreach($listsalesrepresentatives as $val) - { - $userstatic->id=$val['id']; - $userstatic->lastname=$val['lastname']; - $userstatic->firstname=$val['firstname']; - print '
'.$userstatic->getNomUrl(1); - $j++; - if ($j < $nbofsalesrepresentative) print ', '; - print '
'; - } - } - //else print $langs->trans("NoSalesRepresentativeAffected"); + print '
'; + print img_object($langs->trans("ShowContract"),"contract").' '.(isset($obj->ref) ? $obj->ref : $obj->rowid) .''; + if ($obj->nb_late) print img_warning($langs->trans("Late")); + print ''.$obj->ref_customer.''.$obj->ref_supplier.''.img_object($langs->trans("ShowCompany"),"company").' '.$obj->name.''; + 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 ''; + if ($obj->socid > 0) + { + $result=$socstatic->fetch($obj->socid); + $listsalesrepresentatives=$socstatic->getSalesRepresentatives($user); + if ($listsalesrepresentatives < 0) dol_print_error($db); + $nbofsalesrepresentative=count($listsalesrepresentatives); + if ($nbofsalesrepresentative > 3) // We print only number + { + print ''; + print $nbofsalesrepresentative; + print ''; + } + else if ($nbofsalesrepresentative > 0) + { + $userstatic=new User($db); + $j=0; + foreach($listsalesrepresentatives as $val) + { + $userstatic->id=$val['id']; + $userstatic->lastname=$val['lastname']; + $userstatic->firstname=$val['firstname']; + print '
'.$userstatic->getNomUrl(1); + $j++; + if ($j < $nbofsalesrepresentative) print ', '; + print '
'; + } + } + //else print $langs->trans("NoSalesRepresentativeAffected"); + } + else + { + print ' '; + } + print '
'.dol_print_date($db->jdate($obj->date_contrat), 'day').''; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour'); + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour'); + print ''.($obj->nb_initial>0?$obj->nb_initial:'').''.($obj->nb_running>0?$obj->nb_running:'').''.($obj->nb_expired>0?$obj->nb_expired:'').''.($obj->nb_closed>0 ?$obj->nb_closed:'').''; + 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 ''.dol_print_date($db->jdate($obj->date_contrat), 'day').''.$staticcontrat->LibStatut($obj->statut,3).''.($obj->nb_initial>0?$obj->nb_initial:'').''.($obj->nb_running>0?$obj->nb_running:'').''.($obj->nb_expired>0?$obj->nb_expired:'').''.($obj->nb_closed>0 ?$obj->nb_closed:'').'
'; print ''; @@ -165,7 +175,7 @@ if ($conf->global->MAIN_FEATURES_LEVEL > 1) print "\n"; print ''."\n"; print ''; - - print ''."\n"; - print ''."\n"; - - // Value - print ''; - - print ''; - - print "\n"; - print "\n"; - $i++; - } } - -print '
'; - print $formadmin->select_language(GETPOST('langcodesearch'),'langcodesearch',0,null,1,0,0,'',1); + print $formadmin->select_language(GETPOST('langcodesearch'),'langcodesearch',0,null,$langs->trans("All"),0,0,'',1); //print ''; print ''; @@ -194,112 +204,116 @@ if ($conf->global->MAIN_FEATURES_LEVEL > 1) print ''; } -print '
'; - -print load_fiche_titre($langs->trans("TranslationOverwriteKey"), '', '')."\n"; - -print '
entity) && $debug)?'?debug=1':'').'" method="POST">'; -print ''; -print ''; - -print ''; -print ''; -print_liste_field_titre($langs->trans("Language").' (en_US, es_MX, ...)',$_SERVER["PHP_SELF"],'lang,transkey','',$param,'',$sortfield,$sortorder); -print_liste_field_titre($langs->trans("Key"),$_SERVER["PHP_SELF"],'transkey','',$param,'',$sortfield,$sortorder); -print_liste_field_titre($langs->trans("NewTranslationStringToShow"),$_SERVER["PHP_SELF"],'transvalue','',$param,'',$sortfield,$sortorder); -if (! empty($conf->multicompany->enabled) && !$user->entity) print_liste_field_titre($langs->trans("Entity"),$_SERVER["PHP_SELF"],'entity,transkey','',$param,'',$sortfield,$sortorder); -print ''; -print "\n"; - - -// Line to add new record -$var=false; -print "\n"; - -print ''."\n"; -print ''; -// Limit to superadmin -if (! empty($conf->multicompany->enabled) && !$user->entity) +if ($mode == 'overwrite') { - print ''; - print '\n"; -print ''; + //print load_fiche_titre($langs->trans("TranslationOverwriteKey"), '', '')."\n"; + + print ''; + print ''; + print ''; + + print '
'; -print $formadmin->select_language(GETPOST('langcode'),'langcode',0,null,1,0,0,'',1); -//print ''; -print ''; -print ''; -print ''; -print ''; -print ''; - print ''; - print ''; -} -else -{ - print ''; - print ''; -} -print ''; -print "
'; + print ''; + print_liste_field_titre($langs->trans("Language").' (en_US, es_MX, ...)',$_SERVER["PHP_SELF"],'lang,transkey','',$param,'',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("Key"),$_SERVER["PHP_SELF"],'transkey','',$param,'',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("NewTranslationStringToShow"),$_SERVER["PHP_SELF"],'transvalue','',$param,'',$sortfield,$sortorder); + if (! empty($conf->multicompany->enabled) && !$user->entity) print_liste_field_titre($langs->trans("Entity"),$_SERVER["PHP_SELF"],'entity,transkey','',$param,'',$sortfield,$sortorder); + print ''; + print "\n"; + + + // Line to add new record + $var=false; + print "\n"; + + print ''."\n"; + print ''; + // Limit to superadmin + if (! empty($conf->multicompany->enabled) && !$user->entity) + { + print ''; + print '\n"; + print ''; + + + // Show constants + $sql = "SELECT"; + $sql.= " rowid"; + $sql.= ", lang"; + $sql.= ", transkey"; + $sql.= ", transvalue"; + $sql.= " FROM ".MAIN_DB_PREFIX."overwrite_trans"; + $sql.= " WHERE 1 = 1"; + //$sql.= " AND entity IN (".$user->entity.",".$conf->entity.")"; + //if ((empty($user->entity) || $user->admin) && $debug) {} // to force for superadmin to debug + //else if (! GETPOST('visible') || GETPOST('visible') != 'all') $sql.= " AND visible = 1"; // We must always have this. Otherwise, array is too large and submitting data fails due to apache POST or GET limits + //if (GETPOST('name')) $sql.=natural_search("name", GETPOST('name')); + //$sql.= " ORDER BY entity, name ASC"; + $sql.= $db->order($sortfield, $sortorder); + + dol_syslog("translation::select from table", LOG_DEBUG); + $result = $db->query($sql); + if ($result) + { + $num = $db->num_rows($result); + $i = 0; + $var=false; + + while ($i < $num) + { + $obj = $db->fetch_object($result); + $var=!$var; + + print "\n"; + + print ''; + + print ''."\n"; + print ''."\n"; + + // Value + print ''; + + print ''; + + print "\n"; + print "\n"; + $i++; + } + } + + + print '
'; + print $formadmin->select_language(GETPOST('langcode'),'langcode',0,null,1,0,0,'',1); + //print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + } + else + { + print ''; + print ''; + } + print ''; + print "
'.$obj->lang.''.$obj->transkey.''; + /*print ''; + print ''; + print ''; + print ''; + */ + print $obj->transvalue; + print ''; + print ''.img_delete().''; + print '
'; - -// Show constants -$sql = "SELECT"; -$sql.= " rowid"; -$sql.= ", lang"; -$sql.= ", transkey"; -$sql.= ", transvalue"; -$sql.= " FROM ".MAIN_DB_PREFIX."overwrite_trans"; -$sql.= " WHERE 1 = 1"; -//$sql.= " AND entity IN (".$user->entity.",".$conf->entity.")"; -//if ((empty($user->entity) || $user->admin) && $debug) {} // to force for superadmin to debug -//else if (! GETPOST('visible') || GETPOST('visible') != 'all') $sql.= " AND visible = 1"; // We must always have this. Otherwise, array is too large and submitting data fails due to apache POST or GET limits -//if (GETPOST('name')) $sql.=natural_search("name", GETPOST('name')); -//$sql.= " ORDER BY entity, name ASC"; -$sql.= $db->order($sortfield, $sortorder); - -dol_syslog("translation::select from table", LOG_DEBUG); -$result = $db->query($sql); -if ($result) -{ - $num = $db->num_rows($result); - $i = 0; - $var=false; - - while ($i < $num) - { - $obj = $db->fetch_object($result); - $var=!$var; - - print "\n"; - - print '
'.$obj->lang.''.$obj->transkey.''; - /*print ''; - print ''; - print ''; - print ''; - */ - print $obj->transvalue; - print ''; - print ''.img_delete().''; - print '
'; +dol_fiche_end(); print "\n"; diff --git a/htdocs/core/class/html.formadmin.class.php b/htdocs/core/class/html.formadmin.class.php index 33393f1ef46..af51b64fa8d 100644 --- a/htdocs/core/class/html.formadmin.class.php +++ b/htdocs/core/class/html.formadmin.class.php @@ -51,14 +51,14 @@ class FormAdmin * @param string $htmlname Name of HTML select * @param int $showauto Show 'auto' choice * @param array $filter Array of keys to exclude in list - * @param int $showempty Add empty value + * @param string $showempty 1=Add empty value or string to show * @param int $showwarning Show a warning if language is not complete * @param int $disabled Disable edit of select * @param string $morecss Add more css styles * @param int $showcode Add language code into label * @return string Return HTML select string with list of languages */ - function select_language($selected='',$htmlname='lang_id',$showauto=0,$filter=null,$showempty=0,$showwarning=0,$disabled=0,$morecss='',$showcode=0) + function select_language($selected='',$htmlname='lang_id',$showauto=0,$filter=null,$showempty='',$showwarning=0,$disabled=0,$morecss='',$showcode=0) { global $langs; @@ -71,7 +71,10 @@ class FormAdmin { $out.= 'dol_use_jmobile)?'':'data-role="button" ').'href="'.$file.'?page=0'.$options.'&sortfield='.$sortfield.'&sortorder='.$sortorder.'">1'; + $pagelist.= 'dol_use_jmobile)?' class="pagination"':'').'>dol_use_jmobile)?'':'data-role="button" ').'href="'.$file.'?page=0'.$options.'">1'; if ($cpt > 2) $pagelist.='dol_use_jmobile)?' class="pagination"':'').'>dol_use_jmobile)?'class="inactive"':'data-role="button"').'>...'; - else if ($cpt == 2) $pagelist.='dol_use_jmobile)?' class="pagination"':'').'>dol_use_jmobile)?'':'data-role="button" ').'href="'.$file.'?page=1'.$options.'&sortfield='.$sortfield.'&sortorder='.$sortorder.'">2'; + else if ($cpt == 2) $pagelist.='dol_use_jmobile)?' class="pagination"':'').'>dol_use_jmobile)?'':'data-role="button" ').'href="'.$file.'?page=1'.$options.'">2'; } do @@ -3119,7 +3119,7 @@ function print_barre_liste($titre, $page, $file, $options='', $sortfield='', $so } else { - $pagelist.= 'dol_use_jmobile)?' class="pagination"':'').'>dol_use_jmobile)?'':'data-role="button" ').'href="'.$file.'?page='.$cpt.$options.'&sortfield='.$sortfield.'&sortorder='.$sortorder.'">'.($cpt+1).''; + $pagelist.= 'dol_use_jmobile)?' class="pagination"':'').'>dol_use_jmobile)?'':'data-role="button" ').'href="'.$file.'?page='.$cpt.$options.'">'.($cpt+1).''; } $cpt++; } @@ -3128,8 +3128,8 @@ function print_barre_liste($titre, $page, $file, $options='', $sortfield='', $so if ($cpt<$nbpages) { if ($cpt<$nbpages-2) $pagelist.= 'dol_use_jmobile)?' class="pagination"':'').'>dol_use_jmobile)?'class="inactive"':'data-role="button"').'>...'; - else if ($cpt == $nbpages-2) $pagelist.= 'dol_use_jmobile)?' class="pagination"':'').'>dol_use_jmobile)?'':'data-role="button" ').'href="'.$file.'?page='.($nbpages-2).$options.'&sortfield='.$sortfield.'&sortorder='.$sortorder.'">'.($nbpages - 1).''; - $pagelist.= 'dol_use_jmobile)?' class="pagination"':'').'>dol_use_jmobile)?'':'data-role="button" ').'href="'.$file.'?page='.($nbpages-1).$options.'&sortfield='.$sortfield.'&sortorder='.$sortorder.'">'.$nbpages.''; + else if ($cpt == $nbpages-2) $pagelist.= 'dol_use_jmobile)?' class="pagination"':'').'>dol_use_jmobile)?'':'data-role="button" ').'href="'.$file.'?page='.($nbpages-2).$options.'">'.($nbpages - 1).''; + $pagelist.= 'dol_use_jmobile)?' class="pagination"':'').'>dol_use_jmobile)?'':'data-role="button" ').'href="'.$file.'?page='.($nbpages-1).$options.'">'.$nbpages.''; } } else @@ -3149,7 +3149,7 @@ function print_barre_liste($titre, $page, $file, $options='', $sortfield='', $so * * @param int $page Number of page * @param string $file Page URL (in most cases provided with $_SERVER["PHP_SELF"]) - * @param string $options Other url paramaters to propagate ("" by default) + * @param string $options Other url paramaters to propagate ("" by default, may include sortfield and sortorder) * @param integer $nextpage Do we show a next page button * @param string $betweenarrows HTML content to show between arrows. MUST contains '
  • ' tags or '
  • '. * @param string $afterarrows HTML content to show after arrows. Must NOT contains '
  • ' tags. From d24045d831aadaba9b37580316ca22ee991db0ab Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 4 Sep 2016 14:45:43 +0200 Subject: [PATCH 38/41] NEW Editing translation GUI become easier with search translation tool. --- htdocs/admin/translation.php | 214 +++++++++++++++------ htdocs/core/class/html.formadmin.class.php | 2 +- htdocs/core/class/translate.class.php | 28 +-- htdocs/core/lib/functions.lib.php | 2 +- htdocs/langs/en_US/admin.lang | 5 +- 5 files changed, 171 insertions(+), 80 deletions(-) diff --git a/htdocs/admin/translation.php b/htdocs/admin/translation.php index 8d959a9decb..5e6d242dffc 100644 --- a/htdocs/admin/translation.php +++ b/htdocs/admin/translation.php @@ -23,6 +23,7 @@ require '../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; $langs->load("companies"); @@ -36,10 +37,12 @@ if (!$user->admin) accessforbidden(); $id=GETPOST('rowid','int'); $action=GETPOST('action','alpha'); + $langcode=GETPOST('langcode','alpha'); $transkey=GETPOST('transkey','alpha'); $transvalue=GETPOST('transvalue','alpha'); + $mode = GETPOST('mode')?GETPOST('mode'):'overwrite'; $limit = GETPOST("limit")?GETPOST("limit","int"):$conf->liste_limit; @@ -131,82 +134,44 @@ print load_fiche_titre($langs->trans("Translation"),'','title_setup'); print $langs->trans("TranslationDesc")."
    \n"; print "
    \n"; -print $langs->trans("CurrentUserLanguage").': '.$langs->defaultlang.'
    '; +$current_language_code=$langs->defaultlang; +$s=picto_from_langcode($current_language_code); +print $langs->trans("CurrentUserLanguage").': '.$s.' '.$current_language_code.'
    '; print '
    '; -print img_info().' '.$langs->trans("SomeTranslationAreUncomplete"); -$urlwikitranslatordoc='https://wiki.dolibarr.org/index.php/Translator_documentation'; -print ' ('.$langs->trans("SeeAlso").': '.$urlwikitranslatordoc.')
    '; -print $langs->trans("TranslationOverwriteDesc",$langs->transnoentitiesnoconv("Language"),$langs->transnoentitiesnoconv("Key"),$langs->transnoentitiesnoconv("NewTranslationStringToShow"))."
    \n"; - -print '
    '; - - -$param='mode='.$mode; +$param='&mode='.$mode; +if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage; +if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit; +if ($optioncss != '') $param.='&optioncss='.$optioncss; +if ($langcode) $param.='&langcode='.urlencode($langcode); +if ($transkey) $param.='&transkey='.urlencode($transkey); +if ($transvalue) $param.='&transvalue='.urlencode($transvalue); print '
    entity) && $debug)?'?debug=1':'').'" method="POST">'; +if ($optioncss != '') print ''; +print ''; +print ''; +print ''; +print ''; +print ''; $head=translation_prepare_head(); dol_fiche_head($head, $mode, '', 0, ''); -if ($mode == 'searchkey') -{ - //print '
    '; - //print load_fiche_titre($langs->trans("TranslationKeySearch"), '', '')."\n"; - - print ''; - print ''; - print ''; - - print ''; - print ''; - print ''; - print ''; - print ''; - if (! empty($conf->multicompany->enabled) && !$user->entity) print ''; - print ''; - print "\n"; - - // Line to search new record - $var=false; - print "\n"; - - print ''."\n"; - print ''; - // Limit to superadmin - if (! empty($conf->multicompany->enabled) && !$user->entity) - { - print ''; - print '\n"; - print ''; - - print '
    '.$langs->trans("Language").' (en_US, es_MX, ...)'.$langs->trans("Key").''.$langs->trans("TranslationString").''.$langs->trans("Entity").'
    '; - print $formadmin->select_language(GETPOST('langcodesearch'),'langcodesearch',0,null,$langs->trans("All"),0,0,'',1); - //print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - } - else - { - print ''; - print ''; - } - print ''; - print "
    '; - print '
    '; -} - if ($mode == 'overwrite') { //print load_fiche_titre($langs->trans("TranslationOverwriteKey"), '', '')."\n"; + + print img_info().' '.$langs->trans("SomeTranslationAreUncomplete"); + $urlwikitranslatordoc='https://wiki.dolibarr.org/index.php/Translator_documentation'; + print ' ('.$langs->trans("SeeAlso").': '.$urlwikitranslatordoc.')
    '; + print $langs->trans("TranslationOverwriteDesc",$langs->transnoentitiesnoconv("Language"),$langs->transnoentitiesnoconv("Key"),$langs->transnoentitiesnoconv("NewTranslationStringToShow"))."\n"; + print ' ('.$langs->trans("TranslationOverwriteDesc2").').'."
    \n"; + print '
    '; + print ''; print ''; @@ -227,8 +192,7 @@ if ($mode == 'overwrite') print "\n"; print ''; - print $formadmin->select_language(GETPOST('langcode'),'langcode',0,null,1,0,0,'',1); - //print ''; + print $formadmin->select_language(GETPOST('langcode'), 'langcode', 0, null, 1, 0, 0, 'maxwidthonsmartphone', 1); print ''."\n"; print ''; print ''; @@ -313,6 +277,128 @@ if ($mode == 'overwrite') } +if ($mode == 'searchkey') +{ + $recordtoshow=array(); + + $nbempty=0; + /*var_dump($langcode); + var_dump($transkey); + var_dump($transvalue);*/ + if (empty($langcode) || $langcode == '-1') $nbempty++; + if (empty($transkey)) $nbempty++; + if (empty($transvalue)) $nbempty++; + if ($action == 'search' && ($nbempty > 1)) + { + setEventMessages($langs->trans("WarningAtLeastKeyOrTranslationRequired"), null, 'warnings'); + } + else + { + $newlang=new Translate('',$conf); + $newlang->setDefaultLang($langcode); + + // Load all translations keys + foreach($conf->file->dol_document_root as $keydir => $searchdir) + { + // Directory of translation files + $dir_lang = $searchdir."/langs/".$langcode; + $dir_lang_osencoded=dol_osencode($dir_lang); + + $filearray=dol_dir_list($dir_lang_osencoded,'files',0,'','',$sortfield,(strtolower($sortorder)=='asc'?SORT_ASC:SORT_DESC),1); + + foreach($filearray as $file) + { + $tmpfile=preg_replace('/.lang/i', '', basename($file['name'])); + $newlang->load($tmpfile, 0, 0, '', 0); + //print 'After loading lang '.$tmpfile.', newlang has '.count($newlang->tab_translate).' records
    '."\n"; + } + } + + // Now search into translation array + foreach($newlang->tab_translate as $key => $val) + { + if ($transkey && ! preg_match('/'.preg_quote($transkey).'/', $key)) continue; + if ($transvalue && ! preg_match('/'.preg_quote($transvalue).'/', $val)) continue; + $recordtoshow[$key]=$val; + } + } + + //print '
    '; + $nbtotalofrecordswithoutfilters = count($newlang->tab_translate); + $nbtotalofrecords = count($recordtoshow); + $num = $limit + 1; + if (($offset + $num) > $nbtotalofrecords) $num = $limit; + + //print 'param='.$param.' $_SERVER["PHP_SELF"]='.$_SERVER["PHP_SELF"].' num='.$num.' page='.$page.' nbtotalofrecords='.$nbtotalofrecords." sortfield=".$sortfield." sortorder=".$sortorder; + $title = $langs->trans("TranslationKeySearch"); + if ($nbtotalofrecords > 0) $title.=' ('.$nbtotalofrecords.' / '.$nbtotalofrecordswithoutfilters.')'; + print print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, -1 * $nbtotalofrecords, '', 0, '', '', $limit)."\n"; + + print ''; + print ''; + print ''; + + print ''; + print ''; + print_liste_field_titre($langs->trans("Language").' (en_US, es_MX, ...)',$_SERVER["PHP_SELF"],'lang,transkey','',$param,'',$sortfield,$sortorder).''; + print_liste_field_titre($langs->trans("Key"),$_SERVER["PHP_SELF"],'transkey','',$param,'',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("CurrentTranslationString"),$_SERVER["PHP_SELF"],'transvalue','',$param,'',$sortfield,$sortorder); + if (! empty($conf->multicompany->enabled) && !$user->entity) print_liste_field_titre($langs->trans("Entity"),$_SERVER["PHP_SELF"],'entity,transkey','',$param,'',$sortfield,$sortorder); + print ''; + print "\n"; + + // Line to search new record + $var=false; + print "\n"; + + print ''."\n"; + print ''; + // Limit to superadmin + if (! empty($conf->multicompany->enabled) && !$user->entity) + { + print ''; + print '\n"; + print ''; + + if ($sortfield == 'transkey' && strtolower($sortorder) == 'asc') ksort($recordtoshow); + if ($sortfield == 'transkey' && strtolower($sortorder) == 'desc') krsort($recordtoshow); + if ($sortfield == 'transvalue' && strtolower($sortorder) == 'asc') asort($recordtoshow); + if ($sortfield == 'transvalue' && strtolower($sortorder) == 'desc') arsort($recordtoshow); + + // Show result + $i=0; + foreach($recordtoshow as $key => $val) + { + $i++; + if ($i <= $offset) continue; + if ($i > ($offset + $limit)) break; + print ''."\n"; + } + + print '
    '; + $langcode=GETPOST('langcode')?GETPOST('langcode'):$langs->defaultlang; + //print $formadmin->select_language($langcode,'langcode',0,null,$langs->trans("All"),0,0,'',1); + print $formadmin->select_language($langcode,'langcode', 0, null, 0, 0, 0, 'maxwidthonsmartphone', 1); + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + } + else + { + print ''; + print ''; + } + print ''; + print "
    '.$langcode.''.$key.''; + print dol_escape_htmltag($val); + print '
    '; + print ''; +} + dol_fiche_end(); print "\n"; diff --git a/htdocs/core/class/html.formadmin.class.php b/htdocs/core/class/html.formadmin.class.php index af51b64fa8d..16a16719366 100644 --- a/htdocs/core/class/html.formadmin.class.php +++ b/htdocs/core/class/html.formadmin.class.php @@ -58,7 +58,7 @@ class FormAdmin * @param int $showcode Add language code into label * @return string Return HTML select string with list of languages */ - function select_language($selected='',$htmlname='lang_id',$showauto=0,$filter=null,$showempty='',$showwarning=0,$disabled=0,$morecss='',$showcode=0) + function select_language($selected='', $htmlname='lang_id', $showauto=0, $filter=null, $showempty='', $showwarning=0, $disabled=0, $morecss='', $showcode=0) { global $langs; diff --git a/htdocs/core/class/translate.class.php b/htdocs/core/class/translate.class.php index 9ca6196b018..6b596dc3aa5 100644 --- a/htdocs/core/class/translate.class.php +++ b/htdocs/core/class/translate.class.php @@ -155,14 +155,15 @@ class Translate * @param integer $alt 0 (try xx_ZZ then 1), 1 (try xx_XX then 2), 2 (try en_US) * @param int $stopafterdirection Stop when the DIRECTION tag is found (optimize speed) * @param int $forcelangdir To force a different lang directory + * @param int $loadfromfileonly 1=Do not load overwritten translation from file or old conf. * @return int <0 if KO, 0 if already loaded or loading not required, >0 if OK */ - function load($domain,$alt=0,$stopafterdirection=0,$forcelangdir='') + function load($domain,$alt=0,$stopafterdirection=0,$forcelangdir='',$loadfromfileonly=0) { global $conf,$db; // Load $this->tab_translate[] from database - if (count($this->tab_translate) == 0) $this->loadFromDatabase($db); // Nothing was loaded yet, so we load database. + if (empty($loadfromfileonly) && count($this->tab_translate) == 0) $this->loadFromDatabase($db); // Nothing was loaded yet, so we load database. // Check parameters if (empty($domain)) @@ -336,19 +337,20 @@ class Translate // This part is deprecated and replaced with table llx_overwrite_trans // Kept for backward compatibility. - $overwritekey='MAIN_OVERWRITE_TRANS_'.$this->defaultlang; - if (! empty($conf->global->$overwritekey)) // Overwrite translation with key1:newstring1,key2:newstring2 - { - // Overwrite translation with param MAIN_OVERWRITE_TRANS_xx_XX - $tmparray=explode(',', $conf->global->$overwritekey); - foreach($tmparray as $tmp) + if (empty($loadfromfileonly)) + { + $overwritekey='MAIN_OVERWRITE_TRANS_'.$this->defaultlang; + if (! empty($conf->global->$overwritekey)) // Overwrite translation with key1:newstring1,key2:newstring2 { - $tmparray2=explode(':',$tmp); - if (! empty($tmparray2[1])) $this->tab_translate[$tmparray2[0]]=$tmparray2[1]; + // Overwrite translation with param MAIN_OVERWRITE_TRANS_xx_XX + $tmparray=explode(',', $conf->global->$overwritekey); + foreach($tmparray as $tmp) + { + $tmparray2=explode(':',$tmp); + if (! empty($tmparray2[1])) $this->tab_translate[$tmparray2[0]]=$tmparray2[1]; + } } - } - - + } // Check to be sure that SeparatorDecimal differs from SeparatorThousand if (! empty($this->tab_translate["SeparatorDecimal"]) && ! empty($this->tab_translate["SeparatorThousand"]) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 5065abc69ed..4d6f05f4de8 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -3041,7 +3041,7 @@ function load_fiche_titre($titre, $mesg='', $picto='title_generic.png', $pictois * @param string $sortorder Order to sort ('' by default) * @param string $center Strin gin the middle ('' by default). We often find here string $massaction comming from $form->selectMassAction() * @param int $num Number of records found by select with limit+1 - * @param int $totalnboflines Total number of records/lines for all pages (if known). Use a negative value to no show number. + * @param int $totalnboflines Total number of records/lines for all pages (if known). Use a negative value to not show number. * @param string $picto Icon to use before title (should be a 32x32 transparent png file) * @param int $pictoisfullpath 1=Icon name is a full absolute url of image * @param string $morehtml More html to show diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index aebb4aaa81d..4549aa74181 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1041,8 +1041,11 @@ TranslationSetup=Setup of translation TranslationKeySearch=Search a translation key or string TranslationOverwriteKey=Overwrite a translation string TranslationDesc=How to set displayed application language :
    * Systemwide: menu Home - Setup - Display
    * Per user: User display setup tab of user card (click on username at the top of the screen). -TranslationOverwriteDesc=You can also override strings filling the following table. Choose your language from "%s" dropdown, insert the key string found in the lang file (langs/xx_XX/somefile.lang) into "%s" and your new translation into "%s". +TranslationOverwriteDesc=You can also override strings filling the following table. Choose your language from "%s" dropdown, insert the translation key string into "%s" and your new translation into "%s" +TranslationOverwriteDesc2=You can use the other tab to help you know translation key to use TranslationString=Translation string +CurrentTranslationString=Current translation string +WarningAtLeastKeyOrTranslationRequired=A search criteria is required at least for key or translation string NewTranslationStringToShow=New translation string to show TotalNumberOfActivatedModules=Total number of activated feature modules: %s / %s YouMustEnableOneModule=You must at least enable 1 module From 6da7410c18ef9b50aa8036f4fb4133f6948fc398 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 4 Sep 2016 14:58:58 +0200 Subject: [PATCH 39/41] Show warning for overwritten translation --- htdocs/admin/translation.php | 27 ++++++++++++++++++++------- htdocs/langs/en_US/admin.lang | 1 + 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/htdocs/admin/translation.php b/htdocs/admin/translation.php index 5e6d242dffc..86a605afa53 100644 --- a/htdocs/admin/translation.php +++ b/htdocs/admin/translation.php @@ -279,6 +279,14 @@ if ($mode == 'overwrite') if ($mode == 'searchkey') { + $langcode=GETPOST('langcode')?GETPOST('langcode'):$langs->defaultlang; + + $newlang=new Translate('',$conf); + $newlang->setDefaultLang($langcode); + + $newlangfileonly=new Translate('',$conf); + $newlangfileonly->setDefaultLang($langcode); + $recordtoshow=array(); $nbempty=0; @@ -294,9 +302,6 @@ if ($mode == 'searchkey') } else { - $newlang=new Translate('',$conf); - $newlang->setDefaultLang($langcode); - // Load all translations keys foreach($conf->file->dol_document_root as $keydir => $searchdir) { @@ -310,6 +315,7 @@ if ($mode == 'searchkey') { $tmpfile=preg_replace('/.lang/i', '', basename($file['name'])); $newlang->load($tmpfile, 0, 0, '', 0); + $newlangfileonly->load($tmpfile, 0, 0, '', 1); //print 'After loading lang '.$tmpfile.', newlang has '.count($newlang->tab_translate).' records
    '."\n"; } } @@ -352,7 +358,6 @@ if ($mode == 'searchkey') print "\n"; print ''; - $langcode=GETPOST('langcode')?GETPOST('langcode'):$langs->defaultlang; //print $formadmin->select_language($langcode,'langcode',0,null,$langs->trans("All"),0,0,'',1); print $formadmin->select_language($langcode,'langcode', 0, null, 0, 0, 0, 'maxwidthonsmartphone', 1); print ''."\n"; @@ -367,11 +372,11 @@ if ($mode == 'searchkey') print ''; print ''; print ''; - print ''; + print ''; } else { - print ''; + print ''; print ''; } print ''; @@ -385,13 +390,21 @@ if ($mode == 'searchkey') // Show result $i=0; + $var=false; foreach($recordtoshow as $key => $val) { $i++; if ($i <= $offset) continue; if ($i > ($offset + $limit)) break; - print ''.$langcode.''.$key.''; + $var=!$var; + print ''.$langcode.''.$key.''; print dol_escape_htmltag($val); + print ''; + if ($val != $newlangfileonly->tab_translate[$key]) + { + $htmltext = $langs->trans("OriginalValueWas", $newlangfileonly->tab_translate[$key]); + print $form->textwithpicto('', $htmltext, 1, 'warning'); + } print ''."\n"; } diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 4549aa74181..ebac37ce6d8 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1047,6 +1047,7 @@ TranslationString=Translation string CurrentTranslationString=Current translation string WarningAtLeastKeyOrTranslationRequired=A search criteria is required at least for key or translation string NewTranslationStringToShow=New translation string to show +OriginalValueWas=The original translation is overwritten. Original value was:

    %s TotalNumberOfActivatedModules=Total number of activated feature modules: %s / %s YouMustEnableOneModule=You must at least enable 1 module ClassNotFoundIntoPathWarning=Class %s not found into PHP path From 84ec5757a14ac7c4370e57148989a2785fb611de Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 4 Sep 2016 15:06:34 +0200 Subject: [PATCH 40/41] Uniformize look and feel --- htdocs/admin/translation.php | 38 ++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/htdocs/admin/translation.php b/htdocs/admin/translation.php index 86a605afa53..bf313be16c2 100644 --- a/htdocs/admin/translation.php +++ b/htdocs/admin/translation.php @@ -61,6 +61,28 @@ if (! $sortorder) $sortorder='ASC'; * Actions */ +/* + * Actions + */ + +if (GETPOST('cancel')) { $action='list'; $massaction=''; } +if (! GETPOST('confirmmassaction') && $massaction != 'presend' && $massaction != 'confirm_presend') { $massaction=''; } + +$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'); + +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 +{ + $transkey=''; + $transvalue=''; + $toselect=''; + $search_array_options=array(); +} + if ($action == 'add' || (GETPOST('add') && $action != 'update')) { @@ -296,7 +318,7 @@ if ($mode == 'searchkey') if (empty($langcode) || $langcode == '-1') $nbempty++; if (empty($transkey)) $nbempty++; if (empty($transvalue)) $nbempty++; - if ($action == 'search' && ($nbempty > 1)) + if ($action == 'search' && ($nbempty > 999)) // 999 to disable this { setEventMessages($langs->trans("WarningAtLeastKeyOrTranslationRequired"), null, 'warnings'); } @@ -365,22 +387,22 @@ if ($mode == 'searchkey') print ''; print ''; print ''; - print ''; // Limit to superadmin if (! empty($conf->multicompany->enabled) && !$user->entity) { - print ''; + print ''; print ''; - print ''; - print ''; } else { - print ''; print ''; } - print ''; - print "\n"; + print ''; + // Action column + print ''; + $searchpitco=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); + print $searchpitco; + print ''; print ''; if ($sortfield == 'transkey' && strtolower($sortorder) == 'asc') ksort($recordtoshow); From d1719bad5ac73722c80e1e13a0e440f276f078bc Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 5 Sep 2016 01:36:06 +0200 Subject: [PATCH 41/41] Fix ChangeLog --- ChangeLog | 91 +++++++++++++++++++++++++++---------------------------- 1 file changed, 44 insertions(+), 47 deletions(-) diff --git a/ChangeLog b/ChangeLog index ad4b18285a5..f4b13d1e3ed 100644 --- a/ChangeLog +++ b/ChangeLog @@ -31,64 +31,58 @@ check you make a fetch on object before calling the delete. ***** ChangeLog for 4.0.0 compared to 3.9.* ***** For users: -NEW: Add reccuring invoice feature and automatic generation of invoices. +NEW: Add recurring invoice feature and automatic generation of invoices. NEW: Add module "Loan" as stable. -NEW: Add module "Supplier commercial proposal" (price request) is set to stable status. -NEW: Experimental module Accountancy Expert -NEW: Experimental module Multicurency -NEW: Show into badge on tab head the number of dedicated contacts for all objects. +NEW: Add module "Supplier commercial proposal" (price request) with stable status. +NEW: Can select dynamicaly number of lines to show on page on product, shipment, contact, orders, thirdparties. +NEW: Can select fields to show on list also for list of customer orders, supplier orders, shipments, proposals and invoices. +NEW: Show into badge on tab head, the number of dedicated contacts for all objects. NEW: Add a checkbox to select/unselect all lines on page that support mass actions (like invoice list page) -NEW: Add a new method for margin calculation. Added margin on "cost price" to margin on WAP price and margin on "best supplier price". +NEW: Add a new method for margin calculation. Added margin on "cost price" in addition to margin on WAP price and margin on "best supplier price". NEW: Add an explanation message on shipment page to explain you can't make shipment if order is not validated NEW: Add date_rum into table of thirdparty bank account. NEW: The probability of lead/opportunity can be defined per lead. NEW: Added Malta VAT into migration script -NEW: #4972 Translated Charges sociales (type 0) and Charges sociales (type 1) in reports page NEW: Add Expense report into accountancy report NEW: Add Expense report to approve into workboard -NEW: Selection of boxes is move on top of home page -NEW: Add filter on a keyword, status and nature into list of modules +NEW: Selection of boxes is moved on top of home page +NEW: Add filter on a keyword, status and nature into list of modules. NEW: Add hidden option BANK_DISABLE_CHECK_DEPOSIT to disable check deposit feature. -NEW: Add option MAIN_PUBLIC_NOTE_IN_ADDRESS -NEW: add html id/class to locate value in the DOM html +NEW: Add hidden option MAIN_PUBLIC_NOTE_IN_ADDRESS NEW: Add index on invoice status -NEW: Add constant MAIN_LOGTOHTML to 0 into other setup by default to save time when we need to make debug on hosted instance. +NEW: Add constant MAIN_LOGTOHTML to 0 into setup by default to save time when we need to make debug on hosted instance. NEW: Add list of billed NEW: Add minimum stock and desired stock into import/export profiles. -NEW: Add state into thirdparty export fields +NEW: Add state into thirdparty export fields. NEW: Add more trackable events (create, submit and receive supplier order). -NEW: Add option MAIN_PROPAGATE_CONTACTS_FROM_ORIGIN +NEW: Add hidden option MAIN_PROPAGATE_CONTACTS_FROM_ORIGIN NEW: Add picto on module list to show warning and if module is an external module. -NEW: add product type filter on turnover report +NEW: Add product type filter on turnover report NEW: Add state into list of fields available for personalized fields of thirdparties NEW: Add statistics for interventions module NEW: Add statistics on number of projets on home page -NEW: Add stats and late records into dashboard for supplier proposals. +NEW: Add statistics and late records into dashboard for supplier proposals. NEW: Add the admin info on combo of type of contact -NEW: Add the event BILL_PAYED to list of supported events for module notification. -NEW: Add total weight and volume on PDF +NEW: Add the event BILL_PAYED to the list of supported events for module notification. +NEW: Add total weight and volume on PDF. NEW: Add hidden option to hide column qty ordered on shipments. -NEW: Add view of virtual stock into product list (when appropriate) -NEW: Add warning on tasks when they are late (add also the warning tolerance parameter) -NEW: Add weight/volume for one product into shipment export +NEW: Add view of virtual stock into product list (when appropriate). +NEW: Add warning on tasks when they are late (add also the warning tolerance parameter). +NEW: Add weight/volume for one product into shipment export. NEW: Add width and height on product card -NEW: allow a document to be linked to project from another customer on config -NEW: allow project to be shared across entities (for multicompany module) +NEW: allow a document to be linked to project of another customer by config setup. +NEW: allow project to be shared across entities (for multicompany module). NEW: All variant of ckeditor config can be tested into the setup page of module. NEW: Can change dynamically number of records visible into lists. -NEW: Can change type of extrafields for some combinations. -NEW: Can define number of first and last line into import wizard. +NEW: Can change type of extrafields (for some combinations only). +NEW: Can define number of first and last line to import into import wizard. NEW: Can edit next execution date of a cron job. NEW: Can edit value date of a vat payment after recording it. -NEW: Can filter modules on publisher -NEW: Can filter on employee status when building emailing from users -NEW: Can reopen an closed shipment -NEW: Can search on shipments into the quick search box -NEW: Can select dynamicaly number of lines to show on page on product, shipment, contact, orders, thirdparties -NEW: Can select fields to show on supplier orders list. -NEW: Can select fields to show on list also for list of customer orders, shipments and invoices. -NEW: Can select fields to show on proposal lists. -NEW: Can select language from combo list on page to overwrite a translation +NEW: Can filter modules on publisher. +NEW: Can filter on employee status when building emailing from users. +NEW: Can reopen an closed shipment. +NEW: Can search on shipments into the quick search box. +NEW: Can select language from a combo list on page to overwrite a translation. NEW: Can select number of lines on page list for projects and tasks. NEW: Can use ^ and $ (to say start with or end with like regex syntax) into search fields when search field is text. Bonus: ^$ can filter all lines with field not defined. NEW: Clean and enhance code for cron engine @@ -110,33 +104,35 @@ NEW: Into GED module, filename is truncated only if there is not enough space in NEW: Introduce a predefined job to run database backup NEW: Introduce option MAIN_WEIGHT_DEFAULT_UNIT and MAIN_VOLUME_DEFAULT_UNIT to force output unit for weight and volume. NEW: Introduce position of records into dictionnary of type of contacts -NEW: Link on user in leave context reach to leave tab. -NEW: List of user in agenda view per user show photo thumb +NEW: Link on a user in leave page reach to leave tab of user. +NEW: List of user in agenda view per user show photo thumb. NEW: Margins module - Check/update buying price on invoice lines NEW: Merge all admin tools (system and module admin tools) into same entry "Admin tools", so now things are clear: All features restricted to an admin user is inside "setup" (for setup) or "admin tools" (for action tools) instead of 3 different entries. NEW: Merge all boxes "related objects" into one. This save a lot of room on most card and avoid often horizontal scoll. NEW: Moved code that deals with bank categories to BankCateg. Created BankCateg::fetchAll function -NEW: Move Expense report menu from module to menu files -NEW: Move HRM dictionary from module to core dictionaries +NEW: Move HRM dictionary from module to core dictionaries. NEW: Mutualize code to manage email substitution variables. Show available variables into page to edit email templates. NEW: Mutualize code: Use one call of function "addThumbs", when possible, to generate thumbs files instead of several call of "vignette" function. NEW: On translation admin page, admin can overwrite a translation value. -NEW: Option MAIN_LIST_FILTER_ON_DAY is supported on proposal list -NEW: Add reputation field for price supplier -NEW: Rest API token is no more reset at each call. We can reset it with param reset=1 on login call. +NEW: Option MAIN_LIST_FILTER_ON_DAY is supported on proposal list. +NEW: Add reputation field for price supplier. NEW: Selection of fields is available on member list. NEW: Show a badge with number of withdraw requests done on the withdraw tab of invoice. -NEW: Add option to show detail per warehouse into reassort -NEW: Show total number of modules into the module list +NEW: Add option to show detail per warehouse into reassort. +NEW: Show total number of modules into the module list. NEW: Survey system has now a status like other objects. You can close or reopen a survey. -NEW: The note on time spent can be entered when using the view per day. -NEW: Use ellipsis truncation on too large left menu text +NEW: The note on time spent can be entered when using the "view per day". +NEW: Use ellipsis truncation on too large left menu text. NEW: When a new field to show into lists is selected, the form is automatically submited and field added. NEW: When creating a template invoice from a draft invoice, if there is link to contract on draft invoice, link is kept on template invoice. NEW: When emailing is not sent completely, show progression. -NEW: Add entity field in llx_societe_remise_except and llx_societe_remise +NEW: Experimental module Accountancy Expert. +NEW: Experimental module Multicurency For developers: +NEW: Add entity field in llx_societe_remise_except and llx_societe_remise. +NEW: Rest API token is no more reset at each call. We can reset it with param reset=1 on login call. +NEW: Add html id/class to locate value in the DOM html NEW: Add a css class style called 'reposition', so when clicking on a link with this class will move scrollbarr to be placed at same page location. NEW: TimeZone can be supplied to mktime NEW: hook in shipment card @@ -156,8 +152,9 @@ NEW: Removed deprecated CommonObject::client property. Please use CommonObject:: NEW: Removed unused FormOrder::selectSourcesCommande function NEW: Renamed ActionComm::add function to ActionComm::create NEW: Rename Form::select_date to Form::selectDate and Form::form_date to Form::formDate -NEW: Rename path for generiN +NEW: Rename path for generic media files NEW: More phpunit tests. Include some REST API into automatic tests. +NEW: Move Expense report menu from module to menu files. WARNING: