From b4a9a0cafb202def9797bdf44f3d938bb362a8cb Mon Sep 17 00:00:00 2001 From: BENKE Charlie Date: Tue, 8 Sep 2015 13:07:13 +0200 Subject: [PATCH 001/297] Allow contact definition on additionnal modules If additionnal module use contactelement feature, the module is referenced on element list on contact type --- htdocs/admin/dict.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index f9137a06acf51..6fb9454ce5803 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -464,6 +464,9 @@ 'fichinter' => $langs->trans('InterventionCard') ); if (! empty($conf->global->MAIN_SUPPORT_SHARED_CONTACT_BETWEEN_THIRDPARTIES)) $elementList["societe"] = $langs->trans('ThirdParty'); + + complete_elementList_with_modules($elementList); + asort($elementList); $sourceList = array( 'internal' => $langs->trans('Internal'), From e2a738bf5428f96cc074a1756720f2a928cd9611 Mon Sep 17 00:00:00 2001 From: BENKE Charlie Date: Tue, 8 Sep 2015 13:11:26 +0200 Subject: [PATCH 002/297] New fonction complete_elementList_with_modules if contactelement is defined on module definition, add module on definition type of contact --- htdocs/core/lib/admin.lib.php | 121 ++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/htdocs/core/lib/admin.lib.php b/htdocs/core/lib/admin.lib.php index 7469777fa89da..571e24bf38acc 100644 --- a/htdocs/core/lib/admin.lib.php +++ b/htdocs/core/lib/admin.lib.php @@ -1019,6 +1019,127 @@ function complete_dictionary_with_modules(&$taborder,&$tabname,&$tablib,&$tabsql return 1; } +/** + * Add external modules to list of contact element + * + * @param array $elementList elementList + * @return int 1 + */ +function complete_elementList_with_modules(&$elementList) +{ + global $db, $modules, $conf, $langs; + + // Search modules + $filename = array(); + $modules = array(); + $orders = array(); + $categ = array(); + $dirmod = array(); + $modulesdir = array(); + $i = 0; // is a sequencer of modules found + $j = 0; // j is module number. Automatically affected if module number not defined. + + foreach ($conf->file->dol_document_root as $type => $dirroot) + { + $modulesdir[$dirroot . '/core/modules/'] = $dirroot . '/core/modules/'; + + $handle=@opendir($dirroot); + if (is_resource($handle)) + { + while (($file = readdir($handle))!==false) + { + if (is_dir($dirroot.'/'.$file) && substr($file, 0, 1) <> '.' && substr($file, 0, 3) <> 'CVS' && $file != 'includes') + { + if (is_dir($dirroot . '/' . $file . '/core/modules/')) + { + $modulesdir[$dirroot . '/' . $file . '/core/modules/'] = $dirroot . '/' . $file . '/core/modules/'; + } + } + } + closedir($handle); + } + } + + foreach ($modulesdir as $dir) + { + // Load modules attributes in arrays (name, numero, orders) from dir directory + //print $dir."\n
"; + dol_syslog("Scan directory ".$dir." for modules"); + $handle=@opendir(dol_osencode($dir)); + if (is_resource($handle)) + { + while (($file = readdir($handle))!==false) + { + //print "$i ".$file."\n
"; + if (is_readable($dir.$file) && substr($file, 0, 3) == 'mod' && substr($file, dol_strlen($file) - 10) == '.class.php') + { + $modName = substr($file, 0, dol_strlen($file) - 10); + + if ($modName) + { + include_once $dir.$file; + $objMod = new $modName($db); + + if ($objMod->numero > 0) + { + $j = $objMod->numero; + } + else + { + $j = 1000 + $i; + } + + $modulequalified=1; + + // We discard modules according to features level (PS: if module is activated we always show it) + $const_name = 'MAIN_MODULE_'.strtoupper(preg_replace('/^mod/i','',get_class($objMod))); + if ($objMod->version == 'development' && $conf->global->MAIN_FEATURES_LEVEL < 2 && ! $conf->global->$const_name) $modulequalified=0; + if ($objMod->version == 'experimental' && $conf->global->MAIN_FEATURES_LEVEL < 1 && ! $conf->global->$const_name) $modulequalified=0; + //If module is not activated disqualified + if (empty($conf->global->$const_name)) $modulequalified=0; + + if ($modulequalified) + { + // Load languages files of module + if (isset($objMod->langfiles) && is_array($objMod->langfiles)) + { + foreach($objMod->langfiles as $langfile) + { + $langs->load($langfile); + } + } + + $modules[$i] = $objMod; + $filename[$i]= $modName; + $orders[$i] = $objMod->family."_".$j; // Tri par famille puis numero module + //print "x".$modName." ".$orders[$i]."\n
"; + if (isset($categ[$objMod->special])) $categ[$objMod->special]++; // Array of all different modules categories + else $categ[$objMod->special]=1; + $dirmod[$i] = $dirroot; + + if (! empty($objMod->contactelement)) + { + $elementList[$objMod->name] = $langs->trans($objMod->name); + //exit; + } + + $j++; + $i++; + } + else dol_syslog("Module ".get_class($objMod)." not qualified"); + } + } + } + closedir($handle); + } + else + { + dol_syslog("htdocs/admin/modules.php: Failed to open directory ".$dir.". See permission and open_basedir option.", LOG_WARNING); + } + } + + return 1; +} /** * Show array with constants to edit From e80f29c271f6e75f8771447c12e37526222092c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Wed, 16 Sep 2015 12:46:50 +0200 Subject: [PATCH 003/297] Fix: [ bug 1794 ] - Error when cloning Proposal gives error in a malformed page --- htdocs/comm/propal.php | 10 ++--- htdocs/comm/propal/class/propal.class.php | 54 +++++++++++------------ 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index 99119414971e6..aefef2af68ec1 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -112,20 +112,20 @@ // Action clone object if ($action == 'confirm_clone' && $confirm == 'yes') { - if (1 == 0 && ! GETPOST('clone_content') && ! GETPOST('clone_receivers')) { - setEventMessage($langs->trans("NoCloneOptionsSpecified"), 'errors'); - } else { +// if (1 == 0 && ! GETPOST('clone_content') && ! GETPOST('clone_receivers')) { +// setEventMessage($langs->trans("NoCloneOptionsSpecified"), 'errors'); +// } else { if ($object->id > 0) { $result = $object->createFromClone($socid); if ($result > 0) { header("Location: " . $_SERVER['PHP_SELF'] . '?id=' . $result); exit(); } else { - setEventMessage($object->error, 'errors'); + if (count($object->errors) > 0) setEventMessage($object->errors, 'errors'); $action = ''; } } - } +// } } // Delete proposal diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 483b6ec8258a7..ba361ea6aa5ea 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -956,35 +956,35 @@ function createFromClone($socid=0) foreach($this->lines as $line) $line->fetch_optionals($line->rowid); - // Load source object - $objFrom = dol_clone($this); + // Load dest object + $clonedObj = clone $this; $objsoc=new Societe($this->db); // Change socid if needed - if (! empty($socid) && $socid != $this->socid) + if (! empty($socid) && $socid != $clonedObj->socid) { if ($objsoc->fetch($socid) > 0) { - $this->socid = $objsoc->id; - $this->cond_reglement_id = (! empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0); - $this->mode_reglement_id = (! empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0); - $this->fk_project = ''; - $this->fk_delivery_address = ''; + $clonedObj->socid = $objsoc->id; + $clonedObj->cond_reglement_id = (! empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0); + $clonedObj->mode_reglement_id = (! empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0); + $clonedObj->fk_project = ''; + $clonedObj->fk_delivery_address = ''; } // reset ref_client - $this->ref_client = ''; + $clonedObj->ref_client = ''; // TODO Change product price if multi-prices } else { - $objsoc->fetch($this->socid); + $objsoc->fetch($clonedObj->socid); } - $this->id=0; - $this->statut=0; + $clonedObj->id=0; + $clonedObj->statut=0; if (empty($conf->global->PROPALE_ADDON) || ! is_readable(DOL_DOCUMENT_ROOT ."/core/modules/propale/".$conf->global->PROPALE_ADDON.".php")) { @@ -993,32 +993,32 @@ function createFromClone($socid=0) } // Clear fields - $this->user_author = $user->id; - $this->user_valid = ''; - $this->date = $now; - $this->datep = $now; // deprecated - $this->fin_validite = $this->date + ($this->duree_validite * 24 * 3600); - if (empty($conf->global->MAIN_KEEP_REF_CUSTOMER_ON_CLONING)) $this->ref_client = ''; + $clonedObj->user_author = $user->id; + $clonedObj->user_valid = ''; + $clonedObj->date = $now; + $clonedObj->datep = $now; // deprecated + $clonedObj->fin_validite = $clonedObj->date + ($clonedObj->duree_validite * 24 * 3600); + if (empty($conf->global->MAIN_KEEP_REF_CUSTOMER_ON_CLONING)) $clonedObj->ref_client = ''; // Set ref require_once DOL_DOCUMENT_ROOT ."/core/modules/propale/".$conf->global->PROPALE_ADDON.'.php'; $obj = $conf->global->PROPALE_ADDON; $modPropale = new $obj; - $this->ref = $modPropale->getNextValue($objsoc,$this); + $clonedObj->ref = $modPropale->getNextValue($objsoc,$clonedObj); // Create clone - $result=$this->create($user); + $result=$clonedObj->create($user); if ($result < 0) $error++; else { // copy internal contacts - if ($this->copy_linked_contact($objFrom, 'internal') < 0) + if ($clonedObj->copy_linked_contact($this, 'internal') < 0) $error++; // copy external contacts if same company - elseif ($objFrom->socid == $this->socid) + elseif ($this->socid == $clonedObj->socid) { - if ($this->copy_linked_contact($objFrom, 'external') < 0) + if ($clonedObj->copy_linked_contact($this, 'external') < 0) $error++; } } @@ -1028,16 +1028,16 @@ function createFromClone($socid=0) // Hook of thirdparty module if (is_object($hookmanager)) { - $parameters=array('objFrom'=>$objFrom); + $parameters=array('objFrom'=>$this); $action=''; - $reshook=$hookmanager->executeHooks('createFrom',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks + $reshook=$hookmanager->executeHooks('createFrom',$parameters,$clonedObj,$action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) $error++; } // Appel des triggers include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; $interface=new Interfaces($this->db); - $result=$interface->run_triggers('PROPAL_CLONE',$this,$user,$langs,$conf); + $result=$interface->run_triggers('PROPAL_CLONE',$clonedObj,$user,$langs,$conf); if ($result < 0) { $error++; $this->errors=$interface->errors; } @@ -1048,7 +1048,7 @@ function createFromClone($socid=0) if (! $error) { $this->db->commit(); - return $this->id; + return $clonedObj->id; } else { From 3818bff86af9a9d0b98114e5fc6a88b926844f2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Wed, 16 Sep 2015 12:49:05 +0200 Subject: [PATCH 004/297] Fix: [ bug 1776 ] Undefined $deliverycompany variable in pdf_build_address --- htdocs/core/lib/pdf.lib.php | 1 - 1 file changed, 1 deletion(-) diff --git a/htdocs/core/lib/pdf.lib.php b/htdocs/core/lib/pdf.lib.php index 8b0091a6f6db0..054cc633cf33e 100644 --- a/htdocs/core/lib/pdf.lib.php +++ b/htdocs/core/lib/pdf.lib.php @@ -301,7 +301,6 @@ function pdf_build_address($outputlangs,$sourcecompany,$targetcompany='',$target if ($mode == 'source' && ! is_object($sourcecompany)) return -1; if ($mode == 'target' && ! is_object($targetcompany)) return -1; - if ($mode == 'delivery' && ! is_object($deliverycompany)) return -1; if (! empty($sourcecompany->state_id) && empty($sourcecompany->departement)) $sourcecompany->departement=getState($sourcecompany->state_id); //TODO: Deprecated if (! empty($sourcecompany->state_id) && empty($sourcecompany->state)) $sourcecompany->state=getState($sourcecompany->state_id); From 2d35124c71b683ad8a2ebc015792564b28b7e7ef Mon Sep 17 00:00:00 2001 From: Alexis Algoud Date: Wed, 23 Sep 2015 11:11:19 +0200 Subject: [PATCH 005/297] FIX no need to remove file into mail form, the temp dir will be deleted after any sending --- htdocs/core/lib/files.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index bcc6c165472f5..a4e26f116efd8 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -1115,7 +1115,7 @@ function dol_add_file_process($upload_dir, $allowoverwrite=0, $donotupdatesessio * @param int $donotdeletefile 1=Do not delete physically file * @return void */ -function dol_remove_file_process($filenb,$donotupdatesession=0,$donotdeletefile=0) +function dol_remove_file_process($filenb,$donotupdatesession=0,$donotdeletefile=1) { global $db,$user,$conf,$langs,$_FILES; From e22fb3c538bd214cca9f97c1fb65796e9cc5d795 Mon Sep 17 00:00:00 2001 From: philippe grand Date: Fri, 2 Oct 2015 12:39:09 +0200 Subject: [PATCH 006/297] fix : Typo --- ChangeLog | 2 +- htdocs/comm/propal.php | 2 +- htdocs/commande/card.php | 2 +- htdocs/compta/facture.php | 2 +- htdocs/fourn/commande/card.php | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 43203e0f938bf..30084927aaad1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -126,7 +126,7 @@ For users: Use accesskey on form search. - New: Intervention documents are now available in ECM module. - New: Add attachments on user card + in ECM module. -- New: Can add __PROJECT_REF__ and __TIHRPARTY_NAME__ into email topic or content template. +- New: Can add __PROJECT_REF__ and __THIRDPARTY_NAME__ into email topic or content template. - New: [ task #1204 ] add Numering contrat module free (like leopard in product module). - New: [ task #712 ] Add warning when creating invoice from proposal or order, when there is already one invoice. - New: Enable supplier price log table. diff --git a/htdocs/comm/propal.php b/htdocs/comm/propal.php index 5fef6f8ae29af..865358c6438b1 100644 --- a/htdocs/comm/propal.php +++ b/htdocs/comm/propal.php @@ -2255,7 +2255,7 @@ $formmail->substit['__PROPREF__'] = $object->ref; $formmail->substit['__SIGNATURE__'] = $user->signature; $formmail->substit['__REFCLIENT__'] = $object->ref_client; - $formmail->substit['__THIRPARTY_NAME__'] = $object->thirdparty->name; + $formmail->substit['__THIRDPARTY_NAME__'] = $object->thirdparty->name; $formmail->substit['__PROJECT_REF__'] = (is_object($object->projet)?$object->projet->ref:''); $formmail->substit['__PERSONALIZED__'] = ''; $formmail->substit['__CONTACTCIVNAME__'] = ''; diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index c326959619a8a..336b39e43b107 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -2345,7 +2345,7 @@ $formmail->substit ['__ORDERREF__'] = $object->ref; $formmail->substit ['__SIGNATURE__'] = $user->signature; $formmail->substit ['__REFCLIENT__'] = $object->ref_client; - $formmail->substit ['__THIRPARTY_NAME__'] = $object->thirdparty->name; + $formmail->substit ['__THIRDPARTY_NAME__'] = $object->thirdparty->name; $formmail->substit ['__PROJECT_REF__'] = (is_object($object->projet)?$object->projet->ref:''); $formmail->substit ['__PERSONALIZED__'] = ''; $formmail->substit ['__CONTACTCIVNAME__'] = ''; diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index dc04004653f12..a69b35c955967 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -3627,7 +3627,7 @@ $formmail->substit['__FACREF__'] = $object->ref; $formmail->substit['__SIGNATURE__'] = $user->signature; $formmail->substit['__REFCLIENT__'] = $object->ref_client; - $formmail->substit['__THIRPARTY_NAME__'] = $object->thirdparty->name; + $formmail->substit['__THIRDPARTY_NAME__'] = $object->thirdparty->name; $formmail->substit['__PROJECT_REF__'] = (is_object($object->projet)?$object->projet->ref:''); $formmail->substit['__PERSONALIZED__'] = ''; $formmail->substit['__CONTACTCIVNAME__'] = ''; diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index 4daacc43f8a17..20abbdf837800 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -1981,7 +1981,7 @@ // Tableau des substitutions $formmail->substit['__ORDERREF__']=$object->ref; $formmail->substit['__ORDERSUPPLIERREF__']=$object->ref_supplier; - $formmail->substit['__THIRPARTY_NAME__'] = $object->thirdparty->name; + $formmail->substit['__THIRDPARTY_NAME__'] = $object->thirdparty->name; $formmail->substit['__PROJECT_REF__'] = (is_object($object->projet)?$object->projet->ref:''); $formmail->substit['__SIGNATURE__']=$user->signature; $formmail->substit['__PERSONALIZED__']=''; From 6969339159d178d8102861bc40fa87d2bbbc9da7 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Sat, 3 Oct 2015 08:18:03 +0200 Subject: [PATCH 007/297] Try for responsive design --- htdocs/theme/md_exp/style.css.php | 36 +++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/htdocs/theme/md_exp/style.css.php b/htdocs/theme/md_exp/style.css.php index e92ea9f2423ba..412f6dea8d094 100644 --- a/htdocs/theme/md_exp/style.css.php +++ b/htdocs/theme/md_exp/style.css.php @@ -3540,7 +3540,23 @@ #tooltip { position: absolute; width: px; - } + } + + div.fichethirdleft { + width: 100%; + } + + div.fichetwothirdright { + width: 100%; + } + + div.fichehalfleft { + width: 100%; + } + + div.fichehalfright { + width: 100%; + } } @media only screen and (max-width: 570px) { @@ -3554,7 +3570,23 @@ #tooltip { position: absolute; width: px; - } + } + + div.fichethirdleft { + width: 100%; + } + + div.fichetwothirdright { + width: 100%; + } + + div.fichehalfleft { + width: 100%; + } + + div.fichehalfright { + width: 100%; + } } From 7b2fbdd638d96f0c5e479914cd79247b484d102b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 5 Oct 2015 10:04:34 +0200 Subject: [PATCH 008/297] FIX Can't change the admin with default setup --- htdocs/langs/en_US/users.lang | 3 ++- htdocs/user/card.php | 14 ++++++++++---- htdocs/user/class/user.class.php | 16 +++++++++------- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/htdocs/langs/en_US/users.lang b/htdocs/langs/en_US/users.lang index e6764df49a299..81e1d48d46ce1 100644 --- a/htdocs/langs/en_US/users.lang +++ b/htdocs/langs/en_US/users.lang @@ -44,7 +44,8 @@ ListOfUsers=List of users Administrator=Administrator SuperAdministrator=Super Administrator SuperAdministratorDesc=Global administrator -AdministratorDesc=Administrator's entity +AdministratorDesc=Administrator +AdministratorDescEntity=Administrator (for its company) DefaultRights=Default permissions DefaultRightsDesc=Define here default permissions that are automatically granted to a new created user (Go on user card to change permission of an existing user). DolibarrUsers=Dolibarr users diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 4cfb2a965627b..5d63c75541744 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -1883,10 +1883,16 @@ else { print ''; - $nbSuperAdmin = $user->getNbOfUsers('superadmin'); - if ($user->admin - && ($user->id != $object->id) // Don't downgrade ourself - && ($object->entity > 0 || $nbSuperAdmin > 1) // Don't downgrade a superadmin if alone + $nbAdmin = $user->getNbOfUsers('active','',1); + $nbSuperAdmin = $user->getNbOfUsers('active','superadmin',1); + //var_dump($nbAdmin); + //var_dump($nbSuperAdmin); + if ($user->admin // Need to be admin to allow downgrade of an admin + && ($user->id != $object->id) // Don't downgrade ourself + && ( + (empty($conf->multicompany->enabled) && $nbAdmin > 1) + || (! empty($conf->multicompany->enabled) && ($object->entity > 0 || $nbSuperAdmin > 1)) // Don't downgrade a superadmin if alone + ) ) { print $form->selectyesno('admin',$object->admin,1); diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 5f5fd60bd9b87..b1b7819985c1d 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -2195,25 +2195,27 @@ function getNbOfEMailings() /** * Return number of existing users * - * @param string $limitTo Limit to 'active' or 'superadmin' users - * @param bool $all Return for all entities + * @param string $limitTo Limit to '' or 'active' + * @param string $option 'superadmin' = return for entity 0 only + * @param int $admin Filter on admin tag * @return int Number of users */ - function getNbOfUsers($limitTo='active', $all=false) + function getNbOfUsers($limitTo, $option='', $admin=-1) { global $conf; $sql = "SELECT count(rowid) as nb"; $sql.= " FROM ".MAIN_DB_PREFIX."user"; - if ($limitTo == 'superadmin') + if ($option == 'superadmin') { $sql.= " WHERE entity = 0"; + if ($admin >= 0) $sql.= " AND admin = ".$admin; } else { - if ($all) $sql.= " WHERE entity > 0"; // all users except superadmins - else $sql.= " WHERE entity = ".$conf->entity; + $sql.=" WHERE entity IN (".getEntity('user',0).")"; if ($limitTo == 'active') $sql.= " AND statut = 1"; + if ($admin >= 0) $sql.= " AND admin = ".$admin; } $resql=$this->db->query($sql); @@ -2227,7 +2229,7 @@ function getNbOfUsers($limitTo='active', $all=false) } else { - $this->error=$this->db->error(); + $this->error=$this->db->lasterror(); return -1; } } From 143c1e03f8f4ee5227c02742deeb09994d3dea68 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 5 Oct 2015 10:30:49 +0200 Subject: [PATCH 009/297] FIX Missing menu entry for list of thirdparties when using auguria menu manager --- htdocs/core/menus/init_menu_auguria.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/core/menus/init_menu_auguria.sql b/htdocs/core/menus/init_menu_auguria.sql index 091e94f91bc0c..8444a85565098 100644 --- a/htdocs/core/menus/init_menu_auguria.sql +++ b/htdocs/core/menus/init_menu_auguria.sql @@ -68,6 +68,7 @@ insert into llx_menu (module, enabled, menu_handler, type, rowid, mainmenu, left -- Third parties 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->societe->enabled', __HANDLER__, 'left', 500__+MAX_llx_menu__, 'companies', 'thirdparties', 2__+MAX_llx_menu__, '/societe/index.php?leftmenu=thirdparties', 'ThirdParty', 0, 'companies', '$user->rights->societe->lire', '', 2, 0, __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->societe->enabled', __HANDLER__, 'left', 501__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/societe/soc.php?action=create', 'MenuNewThirdParty', 1, 'companies', '$user->rights->societe->lire', '', 2, 0, __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->societe->enabled', __HANDLER__, 'left', 502__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/societe/list.php?action=create', 'List', 1, 'companies', '$user->rights->societe->lire', '', 2, 0, __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->societe->enabled && $conf->fournisseur->enabled', __HANDLER__, 'left', 503__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/fourn/list.php?leftmenu=suppliers', 'ListSuppliersShort', 1, 'suppliers', '$user->rights->societe->lire && $user->rights->fournisseur->lire', '', 2, 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->societe->enabled && $conf->fournisseur->enabled', __HANDLER__, 'left', 504__+MAX_llx_menu__, 'companies', '', 503__+MAX_llx_menu__, '/societe/soc.php?leftmenu=supplier&action=create&type=f', 'NewSupplier', 2, 'suppliers', '$user->rights->societe->creer', '', 2, 0, __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->societe->enabled', __HANDLER__, 'left', 506__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/comm/prospect/list.php?leftmenu=prospects', 'ListProspectsShort', 1, 'companies', '$user->rights->societe->lire', '', 2, 3, __ENTITY__); From c9d8e041d56a7bd5cc32681f2be8bdf0ec18fdde Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Mon, 5 Oct 2015 15:20:55 +0200 Subject: [PATCH 010/297] FIX : New adherent from, always redirect on entity --- htdocs/public/members/new.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/public/members/new.php b/htdocs/public/members/new.php index 255e7fe9134f8..e9c8264d54982 100644 --- a/htdocs/public/members/new.php +++ b/htdocs/public/members/new.php @@ -304,7 +304,6 @@ function llxFooterVierge() $urlback=DOL_MAIN_URL_ROOT.'/public/paybox/newpayment.php?from=membernewform&source=membersubscription&ref='.$adh->ref; if (price2num(GETPOST('amount'))) $urlback.='&amount='.price2num(GETPOST('amount')); if (GETPOST('email')) $urlback.='&email='.urlencode(GETPOST('email')); - if (! empty($entity)) $urlback.='&entity='.$entity; } else if ($conf->global->MEMBER_NEWFORM_PAYONLINE == 'paypal') { @@ -315,7 +314,7 @@ function llxFooterVierge() { $urlback.='&securekey='.dol_hash($conf->global->PAYPAL_SECURITY_TOKEN . 'membersubscription' . $adh->ref, 2); } - if (! empty($entity)) $urlback.='&entity='.$entity; + } else { @@ -324,6 +323,7 @@ function llxFooterVierge() } } + if (! empty($entity)) $urlback.='&entity='.$entity; dol_syslog("member ".$adh->ref." was created, we redirect to ".$urlback); Header("Location: ".$urlback); exit; From bf262c2cae6dd7369bb830bcab3aa393789b76fe Mon Sep 17 00:00:00 2001 From: Christophe Battarel Date: Mon, 5 Oct 2015 15:41:28 +0200 Subject: [PATCH 011/297] reenable search criteria in sql clause --- htdocs/core/class/extrafields.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index 8ce0a1b3b451a..b46540ad6d984 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -753,7 +753,7 @@ function showInputField($key,$value,$moreparam='',$keyprefix='') $sqlwhere.= ' WHERE 1'; } if (in_array($InfoFieldList[0],array('tablewithentity'))) $sqlwhere.= ' AND entity = '.$conf->entity; // Some tables may have field, some other not. For the moment we disable it. - //$sql.=preg_replace('/^ AND /','',$sqlwhere); + $sql.=preg_replace('/^ AND /','',$sqlwhere); //print $sql; dol_syslog(get_class($this).'::showInputField type=sellist sql='.$sql); From cb545332739894b48a23a1c6ba4be80a2031782e Mon Sep 17 00:00:00 2001 From: Drosis Nikos Date: Mon, 5 Oct 2015 17:38:26 +0300 Subject: [PATCH 012/297] Display names and numbers calls on --- htdocs/asterisk/wrapper.php | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/htdocs/asterisk/wrapper.php b/htdocs/asterisk/wrapper.php index e0f115e31c511..f168de78b6edc 100644 --- a/htdocs/asterisk/wrapper.php +++ b/htdocs/asterisk/wrapper.php @@ -112,6 +112,34 @@ function llxFooter() llxHeader(); +$sql = "SELECT s.nom as name FROM ".MAIN_DB_PREFIX."societe as s"; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople as sp ON sp.fk_soc = s.rowid"; +$sql.= " WHERE s.entity IN (".getEntity('societe', 1).")"; +$sql.= " AND (s.phone='".$db->escape($called)."'"; +$sql.= " OR sp.phone='".$db->escape($called)."'"; +$sql.= " OR sp.phone_perso='".$db->escape($called)."'"; +$sql.= " OR sp.phone_mobile='".$db->escape($called)."')"; +$sql.= $db->plimit(1); + +dol_syslog('click to dial search information with phone '.$called, LOG_DEBUG); +$resql = $db->query($sql); +if ($resql) +{ + $obj = $db->fetch_object($resql); + if ($obj) + { + $found = $obj->name; + } else { + $found = $notfound; + } + $db->free($resql); +} +else +{ + dol_print_error($db,'Error'); + $found = 'Error'; +} + $number=strtolower($called); $pos=strpos($number,"local"); if (! empty($number)) @@ -120,7 +148,7 @@ function llxFooter() { $errno=0; $errstr=0; - $strCallerId = "Dolibarr <".strtolower($caller).">"; + $strCallerId = "Dolibarr call $found <".strtolower($number).">"; $oSocket = @fsockopen($strHost, $port, $errno, $errstr, 10); if (!$oSocket) { From a1ae920b4acaa581b0eec5a04ff07118c27cb70c Mon Sep 17 00:00:00 2001 From: Drosis Nikos Date: Mon, 5 Oct 2015 17:46:02 +0300 Subject: [PATCH 013/297] For devices not supporting unicode characters --- htdocs/asterisk/cidlookup.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/htdocs/asterisk/cidlookup.php b/htdocs/asterisk/cidlookup.php index ef4eaefe9c2da..771b2e29979a9 100644 --- a/htdocs/asterisk/cidlookup.php +++ b/htdocs/asterisk/cidlookup.php @@ -30,7 +30,7 @@ include '../master.inc.php'; $phone = GETPOST('phone'); -$notfound = $langs->trans("Unknown"); +$notfound = $phone; // Security check if (empty($conf->clicktodial->enabled)) @@ -73,5 +73,9 @@ dol_print_error($db,'Error'); $found = 'Error'; } +//Greek to Latin +$greek = array('α','β','γ','δ','ε','ζ','η','θ','ι','κ','λ','μ','ν','ξ','ο','π','ρ','ς','σ','τ','υ','φ','χ','ψ','ω','Α','Β','Γ','Δ','Ε','Ζ','Η','Θ','Ι','Κ','Λ','Μ','Ν','Ξ','Ο','Π','Ρ','Σ','Τ','Υ','Φ','Χ','Ψ','Ω','ά','έ','ή','ί','ό','ύ','ώ','ϊ','ΐ','Ά','Έ','Ή','Ί','Ό','Ύ','Ώ','Ϊ'); -echo $found; +$latin = array('a','b','g','d','e','z','h','th','i','k','l','m','n','ks','o','p','r','s','s','t','u','f','ch','ps','w','A','B','G','D','E','Z','H','TH','I','K','L','M','N','KS','O','P','R','S','T','U','F','CH','PS','W','a','e','h','i','o','u','w','i','i','A','E','H','I','O','U','W','I'); + +print str_replace($greek, $latin, $found); From e3bdc8aaaa96bad54aafcc1e9dde27e84a91a28e Mon Sep 17 00:00:00 2001 From: "Andreas, OE8APR" Date: Mon, 5 Oct 2015 16:43:08 +0200 Subject: [PATCH 014/297] Get invoice customer contact Added functionality to get invoice customer contact as contact_xx tags --- .../facture/doc/doc_generic_invoice_odt.modules.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php b/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php index 12ea7aa7b082d..542f53c24b795 100644 --- a/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php +++ b/htdocs/core/modules/facture/doc/doc_generic_invoice_odt.modules.php @@ -270,7 +270,11 @@ function write_file($object,$outputlangs,$srctemplatepath,$hidedetails=0,$hidede { // On peut utiliser le nom de la societe du contact if (! empty($conf->global->MAIN_USE_COMPANY_NAME_OF_CONTACT)) $socobject = $object->contact; - else $socobject = $object->client; + else { + $socobject = $object->client; + // if we have a BILLING contact and we dont use it as recipient we store the contact object for later use + $contactobject = $object->contact; + } } else { @@ -344,8 +348,12 @@ function write_file($object,$outputlangs,$srctemplatepath,$hidedetails=0,$hidede $array_objet=$this->get_substitutionarray_object($object,$outputlangs); $array_propal=is_object($propal_object)?$this->get_substitutionarray_object($propal_object,$outputlangs,'propal'):array(); $array_other=$this->get_substitutionarray_other($outputlangs); + // retrieve contact information for use in invoice as contact_xxx tags + $array_thirdparty_contact = array(); + if ($usecontact) + $array_thirdparty_contact=$this->get_substitutionarray_contact($contactobject,$outputlangs,'contact'); - $tmparray = array_merge($array_user,$array_soc,$array_thirdparty,$array_objet,$array_propal,$array_other); + $tmparray = array_merge($array_user,$array_soc,$array_thirdparty,$array_objet,$array_propal,$array_other,$array_thirdparty_contact); complete_substitutions_array($tmparray, $outputlangs, $object); // Call the ODTSubstitution hook $parameters=array('file'=>$file,'object'=>$object,'outputlangs'=>$outputlangs,'substitutionarray'=>&$tmparray); From 3aeeab96542b75189df9aed09a7074f756e3e300 Mon Sep 17 00:00:00 2001 From: "Andreas, OE8APR" Date: Mon, 5 Oct 2015 16:44:51 +0200 Subject: [PATCH 015/297] Get proposal customer contact Added functionality to get proposal customer contact as contact_xx tags --- .../doc/doc_generic_proposal_odt.modules.php | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php index 80ec0ba6fe0a4..d6773eb2c80aa 100644 --- a/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php +++ b/htdocs/core/modules/propale/doc/doc_generic_proposal_odt.modules.php @@ -288,9 +288,9 @@ function write_file($object,$outputlangs,$srctemplatepath,$hidedetails=0,$hidede dol_mkdir($conf->propal->dir_temp); - // If BILLING contact defined on invoice, we use it + // If CUSTOMER contact defined on proposal, we use it $usecontact=false; - $arrayidcontact=$object->getIdContact('external','BILLING'); + $arrayidcontact=$object->getIdContact('external','CUSTOMER'); if (count($arrayidcontact) > 0) { $usecontact=true; @@ -302,13 +302,16 @@ function write_file($object,$outputlangs,$srctemplatepath,$hidedetails=0,$hidede { // On peut utiliser le nom de la societe du contact if (! empty($conf->global->MAIN_USE_COMPANY_NAME_OF_CONTACT)) $socobject = $object->contact; - else $socobject = $object->client; + else { + $socobject = $object->client; + // if we have a CUSTOMER contact and we dont use it as recipient we store the contact object for later use + $contactobject = $object->contact; + } } else { $socobject=$object->client; } - // Make substitution $substitutionarray=array( '__FROM_NAME__' => $this->emetteur->name, @@ -369,8 +372,12 @@ function write_file($object,$outputlangs,$srctemplatepath,$hidedetails=0,$hidede $array_thirdparty=$this->get_substitutionarray_thirdparty($socobject,$outputlangs); $array_objet=$this->get_substitutionarray_object($object,$outputlangs); $array_other=$this->get_substitutionarray_other($outputlangs); + // retrieve contact information for use in proposal as contact_xxx tags + $array_thirdparty_contact = array(); + if ($usecontact) + $array_thirdparty_contact=$this->get_substitutionarray_contact($contactobject,$outputlangs,'contact'); - $tmparray = array_merge($array_user,$array_soc,$array_thirdparty,$array_objet,$array_other); + $tmparray = array_merge($array_user,$array_soc,$array_thirdparty,$array_objet,$array_other,$array_thirdparty_contact); complete_substitutions_array($tmparray, $outputlangs, $object); // Call the ODTSubstitution hook $parameters=array('file'=>$file,'object'=>$object,'outputlangs'=>$outputlangs,'substitutionarray'=>&$tmparray); From e3f225e0389a5ada0927bc6204589b6df345c259 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 5 Oct 2015 17:40:17 +0200 Subject: [PATCH 016/297] FIX bad link into project box --- htdocs/compta/facture/admin/facture_cust_extrafields.php | 1 - htdocs/compta/facture/admin/facturedet_cust_extrafields.php | 1 - htdocs/core/boxes/box_project.php | 2 +- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/htdocs/compta/facture/admin/facture_cust_extrafields.php b/htdocs/compta/facture/admin/facture_cust_extrafields.php index 58d4e46f8dd6d..b9dce92e80f17 100644 --- a/htdocs/compta/facture/admin/facture_cust_extrafields.php +++ b/htdocs/compta/facture/admin/facture_cust_extrafields.php @@ -66,7 +66,6 @@ $linkback=''.$langs->trans("BackToModuleList").''; print_fiche_titre($langs->trans("BillsSetup"),$linkback,'title_setup'); -print '
'; $head = invoice_admin_prepare_head(); diff --git a/htdocs/compta/facture/admin/facturedet_cust_extrafields.php b/htdocs/compta/facture/admin/facturedet_cust_extrafields.php index e69060aa3cf51..addc23a837803 100644 --- a/htdocs/compta/facture/admin/facturedet_cust_extrafields.php +++ b/htdocs/compta/facture/admin/facturedet_cust_extrafields.php @@ -67,7 +67,6 @@ $linkback=''.$langs->trans("BackToModuleList").''; print_fiche_titre($langs->trans("BillsSetup"),$linkback,'title_setup'); -print '
'; $head = invoice_admin_prepare_head(); diff --git a/htdocs/core/boxes/box_project.php b/htdocs/core/boxes/box_project.php index 703d35b408be8..771547686ea97 100644 --- a/htdocs/core/boxes/box_project.php +++ b/htdocs/core/boxes/box_project.php @@ -104,7 +104,7 @@ function loadBox($max=5) 'td' => 'align="left"', 'text' => $objp->ref, 'tooltip' => $tooltip, - 'url' => DOL_URL_ROOT."/product/card.php?id=".$objp->rowid, + 'url' => DOL_URL_ROOT."/projet/card.php?id=".$objp->rowid, ); $this->info_box_contents[$i][2] = array( From d24f5538f9cf1c5e0ce8b0eb7a559111f9b50963 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 5 Oct 2015 20:25:55 +0200 Subject: [PATCH 017/297] Fix: wrong parameters order --- htdocs/core/class/extrafields.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/extrafields.class.php b/htdocs/core/class/extrafields.class.php index 99ec23c6a73be..40ba0e666ae61 100644 --- a/htdocs/core/class/extrafields.class.php +++ b/htdocs/core/class/extrafields.class.php @@ -1155,7 +1155,7 @@ function getOptionalsFromPost($extralabels,$keyprefix='') else if (in_array($key_type,array('checkbox'))) { $value_arr=GETPOST("options_".$key.$keyprefix); - $value_key=implode($value_arr,','); + $value_key=implode(',', $value_arr); } else if (in_array($key_type,array('price','double'))) { From 41354ca00d63888f46de15c3ae6c657b3824856d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 5 Oct 2015 20:30:55 +0200 Subject: [PATCH 018/297] Added type hinting to extrafields object --- htdocs/core/class/commonobject.class.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index f9eeffbb0184f..a812ccc7bf796 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -3564,16 +3564,16 @@ function insertExtraFields() else return 0; } - /** - * Function to show lines of extrafields with output datas - * - * @param object $extrafields Extrafield Object - * @param string $mode Show output (view) or input (edit) for extrafield - * @param array $params Optionnal parameters - * @param string $keyprefix Prefix string to add into name and id of field (can be used to avoid duplicate names) - * - * @return string - */ + /** + * Function to show lines of extrafields with output datas + * + * @param Extrafields $extrafields Extrafield Object + * @param string $mode Show output (view) or input (edit) for extrafield + * @param array $params Optional parameters + * @param string $keyprefix Prefix string to add into name and id of field (can be used to avoid duplicate names) + * + * @return string + */ function showOptionals($extrafields, $mode='view', $params=0, $keyprefix='') { global $_POST, $conf; From 3fdd59bf0a06798476566b6fc173ebb3540ef5cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 5 Oct 2015 20:39:14 +0200 Subject: [PATCH 019/297] Fix #3666 checkbox extrafields on edit --- htdocs/core/class/commonobject.class.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index a812ccc7bf796..99e497046e098 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -3601,7 +3601,16 @@ function showOptionals($extrafields, $mode='view', $params=0, $keyprefix='') $value=$this->array_options["options_".$key]; break; case "edit": - $value=(isset($_POST["options_".$key])?$_POST["options_".$key]:$this->array_options["options_".$key]); + if (isset($_POST["options_" . $key])) { + if (is_array($_POST["options_" . $key])) { + // $_POST["options"] is an array but following code expects a comma separated string + $value = implode(",", $_POST["options_" . $key]); + } else { + $value = $_POST["options_" . $key]; + } + } else { + $value = $this->array_options["options_" . $key]; + } break; } if ($extrafields->attribute_type[$key] == 'separate') From afbee44993e6c5c6ae80f7e46f5eba72bd523fab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 5 Oct 2015 20:51:17 +0200 Subject: [PATCH 020/297] Fix #3667 checkbox extrafields on edit For actions and members. --- htdocs/adherents/type.php | 11 ++++++++++- htdocs/comm/action/card.php | 11 ++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/htdocs/adherents/type.php b/htdocs/adherents/type.php index 14bbcb8e854e8..1819925e7234f 100644 --- a/htdocs/adherents/type.php +++ b/htdocs/adherents/type.php @@ -678,7 +678,16 @@ print '

'; foreach($extrafields->attribute_label as $key=>$label) { - $value=(isset($_POST["options_".$key])?$_POST["options_".$key]:(isset($adht->array_options['options_'.$key])?$adht->array_options['options_'.$key]:'')); + if (isset($_POST["options_" . $key])) { + if (is_array($_POST["options_" . $key])) { + // $_POST["options"] is an array but following code expects a comma separated string + $value = implode(",", $_POST["options_" . $key]); + } else { + $value = $_POST["options_" . $key]; + } + } else { + $value = $adht->array_options["options_" . $key]; + } print '\n"; diff --git a/htdocs/comm/action/card.php b/htdocs/comm/action/card.php index 2e35b8004f06f..c011717c0cc5c 100644 --- a/htdocs/comm/action/card.php +++ b/htdocs/comm/action/card.php @@ -1202,7 +1202,16 @@ function setdatefields() print '

'.$label.''; print $extrafields->showInputField($key,$value); print "
'; foreach($extrafields->attribute_label as $key=>$label) { - $value=(isset($_POST["options_".$key])?$_POST["options_".$key]:(isset($object->array_options['options_'.$key])?$object->array_options['options_'.$key]:'')); + if (isset($_POST["options_" . $key])) { + if (is_array($_POST["options_" . $key])) { + // $_POST["options"] is an array but following code expects a comma separated string + $value = implode(",", $_POST["options_" . $key]); + } else { + $value = $_POST["options_" . $key]; + } + } else { + $value = $object->array_options["options_" . $key]; + } print '\n"; From 11fb52d2e3cc296fa5a5633a35301398e542388d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 5 Oct 2015 21:22:58 +0200 Subject: [PATCH 021/297] Ask for version in contributing guidelines --- CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a603fd242ccfd..d4a333d9a21aa 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -12,7 +12,8 @@ Issues are now managed on [GitHub](https://github.com/Dolibarr/dolibarr/Issues). 1. Please [use the search engine](https://help.github.com/articles/searching-issues) to check if nobody's already reported your problem. 2. [Create an issue](https://help.github.com/articles/creating-an-issue). Choose an appropriate title. Prepend appropriately with Bug or Feature Request. -3. Report with as much detail as possible ([Use screenshots or even screencasts whenever possible](https://help.github.com/articles/issue-attachments)). +4. Tell us the version you are using! +3. Write a report with as much detail as possible (Use [screenshots](https://help.github.com/articles/issue-attachments) or even screencasts and provide logging and debugging informations whenever possible). We're still figuring out how to migrate old issues to GitHub. In the meantime, they are still available at [Doliforge](https://doliforge.org/projects/dolibarr). From a5ac5b6525743fb2d3ae42a1a359a1a1fda7a915 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 5 Oct 2015 21:23:54 +0200 Subject: [PATCH 022/297] Updated Transifex project link in contributing guidelines --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d4a333d9a21aa..1e5e61ff9926d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -68,7 +68,7 @@ Translations ------------ The source language (en_US) is maintained in the repository. See the [Code](#code) section above. -All other translations are managed online at [Transifex](https://www.transifex.com/projects/p/dolibarr). +All other translations are managed online at [Transifex](https://www.transifex.com/dolibarr-association/dolibarr/). Join an existing translation team or create your own and translate into the interface. From c7c3ba7ba09ab8380f2ffc5496768408d2a86eda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 5 Oct 2015 21:24:35 +0200 Subject: [PATCH 023/297] Fixed translator documentation link in contributing guidelines --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 1e5e61ff9926d..47f25b7a4d3c1 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -75,7 +75,7 @@ Join an existing translation team or create your own and translate into the inte Your translations will be available in the next major release. ### Resources -[Translator documentation](http://wiki.dolibarr.org/index.php/Developer_documentation) +[Translator documentation](http://wiki.dolibarr.org/index.php/Translator_documentation) Documentation ------------- From fa64761b67b7c27e1a0ee3326007b3d7b3da1fb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 5 Oct 2015 21:42:57 +0200 Subject: [PATCH 024/297] Enhanced contributing guidelines --- CONTRIBUTING.md | 50 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 43 insertions(+), 7 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 47f25b7a4d3c1..304924fe15031 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,11 +4,9 @@ How to contribute to Dolibarr Bug reports and feature requests -------------------------------- -*Note*: Issues are not a support forum. If you need help using the software, please use [the forums](http://www.dolibarr.org/forum). +*Note*: Issues are not a support forum. If you need help using the software, please use [the forums](http://www.dolibarr.org/forum). -**NEW** - -Issues are now managed on [GitHub](https://github.com/Dolibarr/dolibarr/Issues). +Issues are managed on [GitHub](https://github.com/Dolibarr/dolibarr/Issues). 1. Please [use the search engine](https://help.github.com/articles/searching-issues) to check if nobody's already reported your problem. 2. [Create an issue](https://help.github.com/articles/creating-an-issue). Choose an appropriate title. Prepend appropriately with Bug or Feature Request. @@ -42,9 +40,45 @@ Choose your base branch accordingly. ### General rules Please don't edit the ChangeLog file. A project manager will update it from your commit messages. -### Commits +### Commits Use clear commit messages with the following structure: +``` +[KEYWORD] [ISSUENUM] DESC + +LONGDESC +``` + +#### Keyword +In uppercase to appear in ChangeLog when generated. + +The keyword can be ommitted if your commit does not fit in any of the following categories: +- Fix: for a bug fix +- Close: for closing a referenced feature request +- New: for an unreferenced new feature (Opening a feature request and using close is prefered) + +#### Issuenum +If your commit fixes a referenced bug or feature request. + +In the form of a # followed by the GitHub issue number. + +#### Desc +A short description of the commit content. + +This should ideally be less than 50 characters. + +#### LongDesc +A long description of the commit content. + +You can really go to town here and explain in depth what you've been doing. + +Feel free to express technical details, use cases or anything relevant to the current commit. + +This section can span multiple lines. + +Try to keep lines under 72 characters. + +#### Samples
 FIX|Fix #456 Short description (where #456 is number of bug fix, if it exists. In upper case to appear into ChangeLog)
 or
@@ -58,8 +92,10 @@ Long description (Can span accross multiple lines).
 
### Pull Requests -When submitting a pull request, use same rule than Commits. With upper case keyword to appear into ChangeLog. +When submitting a pull request, use same rule as [Commits](#commits) for the message. +If your pull request only contains one commit, GitHub will be smart enough to fill it for you. +Otherwise, please be a bit verbose about what you're providing. ### Resources [Developer documentation](http://wiki.dolibarr.org/index.php/Developer_documentation) @@ -81,5 +117,5 @@ Documentation ------------- The project's documentation is maintained on the [Wiki](http://wiki.dolibarr.org/index.php). -*You need to create an account before being able to edit.* +*Note*: to help prevent spam, you need to create an account before being able to edit. From f1cf629b80f3e88dbcc3ff7fb94cb9a6ed5a6f51 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 5 Oct 2015 23:52:54 +0200 Subject: [PATCH 025/297] FIX List of project for user that are restrited as sale repreentative to some thirdparties. --- htdocs/projet/list.php | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index 0debcab2449b1..ab01f92279775 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -48,9 +48,9 @@ if (!$user->rights->projet->lire) accessforbidden(); -$sortfield = isset($_GET["sortfield"])?$_GET["sortfield"]:$_POST["sortfield"]; -$sortorder = isset($_GET["sortorder"])?$_GET["sortorder"]:$_POST["sortorder"]; -$page = isset($_GET["page"])? $_GET["page"]:$_POST["page"]; +$sortfield = GETPOST("sortfield","alpha"); +$sortorder = GETPOST("sortorder"); +$page = GETPOST("page"); $page = is_numeric($page) ? $page : 0; $page = $page == -1 ? 0 : $page; @@ -140,7 +140,7 @@ $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_lead_status as cls on p.fk_opp_status = cls.rowid"; // We'll need this table joined to the select in order to filter by sale -if ($search_sale > 0 || (! $user->rights->societe->client->voir && ! $socid)) $sql .= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; +if ($search_sale > 0 || (! $user->rights->societe->client->voir && ! $socid)) $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe_commerciaux as sc ON sc.fk_soc = s.rowid"; if ($search_user > 0) { $sql.=", ".MAIN_DB_PREFIX."element_contact as c"; @@ -190,7 +190,8 @@ if ($search_opp_status == 'none') $sql .= " AND p.fk_opp_status IS NULL"; } if ($search_public!='') $sql .= " AND p.public = ".$db->escape($search_public); -if ($search_sale > 0 || (! $user->rights->societe->client->voir && ! $socid)) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$search_sale; +if ($search_sale > 0) $sql.= " AND sc.fk_user = " .$search_sale; +if (! $user->rights->societe->client->voir && ! $socid) $sql.= " AND ((s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id.") OR (s.rowid IS NULL))"; if ($search_user > 0) $sql.= " AND c.fk_c_type_contact = tc.rowid AND tc.element='project' AND tc.source='internal' AND c.element_id = p.rowid AND c.fk_socpeople = ".$search_user; // Add where from hooks $parameters=array(); From 9f2bcf0e4f03960abb95ff96b4d017e3f236ec30 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Mon, 5 Oct 2015 23:53:49 +0200 Subject: [PATCH 026/297] FIX The admin flag is mising. --- htdocs/user/class/user.class.php | 3 ++- htdocs/user/hierarchy.php | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index b1b7819985c1d..e375a3c3d804c 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -2358,7 +2358,7 @@ function get_full_tree($deleteafterid=0, $filter='') $this->load_parentof(); // Init $this->users array - $sql = "SELECT DISTINCT u.rowid, u.firstname, u.lastname, u.fk_user, u.fk_soc, u.login, u.email, u.gender, u.statut, u.entity"; // Distinct reduce pb with old tables with duplicates + $sql = "SELECT DISTINCT u.rowid, u.firstname, u.lastname, u.fk_user, u.fk_soc, u.login, u.email, u.gender, u.admin, u.statut, u.entity"; // Distinct reduce pb with old tables with duplicates $sql.= " FROM ".MAIN_DB_PREFIX."user as u"; if(! empty($conf->multicompany->enabled) && $conf->entity == 1 && (! empty($conf->multicompany->transverse_mode) || (! empty($user->admin) && empty($user->entity)))) { @@ -2388,6 +2388,7 @@ function get_full_tree($deleteafterid=0, $filter='') $this->users[$obj->rowid]['entity'] = $obj->entity; $this->users[$obj->rowid]['email'] = $obj->email; $this->users[$obj->rowid]['gender'] = $obj->gender; + $this->users[$obj->rowid]['admin'] = $obj->admin; $i++; } } diff --git a/htdocs/user/hierarchy.php b/htdocs/user/hierarchy.php index ccaf6687da910..ca37b1ff2d3e1 100644 --- a/htdocs/user/hierarchy.php +++ b/htdocs/user/hierarchy.php @@ -88,7 +88,9 @@ $userstatic->email=$val['email']; $userstatic->gender=$val['gender']; $userstatic->societe_id=$val['fk_soc']; - + $userstatic->admin=$val['admin']; + $userstatic->entity=$val['entity']; + $entity=$val['entity']; $entitystring=''; @@ -109,7 +111,16 @@ } } - $li=$userstatic->getNomUrl(1,'').' ('.$val['login'].($entitystring?' - '.$entitystring:'').')'; + $li=$userstatic->getNomUrl(1,'',0,1); + if (! empty($conf->multicompany->enabled) && $userstatic->admin && ! $userstatic->entity) + { + $li.=img_picto($langs->trans("SuperAdministrator"),'redstar'); + } + else if ($userstatic->admin) + { + $li.=img_picto($langs->trans("Administrator"),'star'); + } + $li.=' ('.$val['login'].($entitystring?' - '.$entitystring:'').')'; $data[] = array( 'rowid'=>$val['rowid'], From d92604f6462a803825b93e01fc9fe72d6aff925d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 6 Oct 2015 00:46:26 +0200 Subject: [PATCH 027/297] FIX Link of project must be cickable if user has permission to read all projects FIX Missing information into the alt of project picto --- htdocs/core/lib/project.lib.php | 2 +- htdocs/projet/class/project.class.php | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index 89d658fa01a08..15c4627c4d738 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -348,7 +348,7 @@ function projectLinesa(&$inc, $parent, &$lines, &$level, $var, $showproject, &$t $projectstatic->id=$lines[$i]->fk_project; $projectstatic->ref=$lines[$i]->projectref; $projectstatic->public=$lines[$i]->public; - if ($lines[$i]->public || in_array($lines[$i]->fk_project,$projectsArrayId)) print $projectstatic->getNomUrl(1); + if ($lines[$i]->public || in_array($lines[$i]->fk_project,$projectsArrayId) || ! empty($user->rights->projet->all->lire)) print $projectstatic->getNomUrl(1); else print $projectstatic->getNomUrl(1,'nolink'); if ($showlineingray) print ''; print ""; diff --git a/htdocs/projet/class/project.class.php b/htdocs/projet/class/project.class.php index 094ae60c59e13..68aa963ca8c9a 100644 --- a/htdocs/projet/class/project.class.php +++ b/htdocs/projet/class/project.class.php @@ -882,15 +882,17 @@ function getNomUrl($withpicto=0, $option='', $addlabel=0, $moreinpopup='', $sep= $result = ''; $link = ''; $linkend = ''; - $label = '' . $langs->trans("ShowProject") . ''; + $label=''; + if ($option != 'nolink') $label = '' . $langs->trans("ShowProject") . ''; if (! empty($this->ref)) - $label .= '
' . $langs->trans('Ref') . ': ' . $this->ref; + $label .= ($label?'
':'').'' . $langs->trans('Ref') . ': ' . $this->ref; // The space must be after the : to not being explode when showing the title in img_picto if (! empty($this->title)) - $label .= '
' . $langs->trans('Label') . ': ' . $this->title; + $label .= ($label?'
':'').'' . $langs->trans('Label') . ': ' . $this->title; // The space must be after the : to not being explode when showing the title in img_picto if ($moreinpopup) $label.='
'.$moreinpopup; $linkclose = '" title="'.dol_escape_htmltag($label, 1).'" class="classfortooltip">'; - if ($option != 'nolink') { + if ($option != 'nolink') + { if (preg_match('/\.php$/',$option)) { $link = ''; + print '
'; print $moreforfilter; $parameters=array(); $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook @@ -290,7 +290,7 @@ function init_myfunc() print '
'; } - print '
'.$label.''; print $extrafields->showOutputField($key,$value); print "
'."\n"; + print '
'."\n"; // Fields title print ''; diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php index 4ffbbf33fb66a..2f495e60bf7de 100644 --- a/htdocs/adherents/list.php +++ b/htdocs/adherents/list.php @@ -201,7 +201,7 @@ } if (! empty($moreforfilter)) { - print '
'; + print '
'; print $moreforfilter; $parameters=array(); $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook @@ -209,7 +209,7 @@ print '
'; } - print "
"; + print '
'; print ''; print_liste_field_titre($langs->trans("Ref"),$_SERVER["PHP_SELF"],"d.rowid",$param,"","",$sortfield,$sortorder); print_liste_field_titre($langs->trans("Name")." / ".$langs->trans("Company"),$_SERVER["PHP_SELF"],"d.lastname",$param,"","",$sortfield,$sortorder); diff --git a/htdocs/comm/list.php b/htdocs/comm/list.php index 91f30d30887f5..3147240167ec4 100644 --- a/htdocs/comm/list.php +++ b/htdocs/comm/list.php @@ -205,7 +205,7 @@ } if ($moreforfilter) { - print '
'; + print '
'; print $moreforfilter; $parameters=array(); $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook @@ -213,7 +213,7 @@ print '
'; } - print '
'."\n"; + print '
'."\n"; print ''; print_liste_field_titre($langs->trans("Company"),$_SERVER["PHP_SELF"],"s.nom","",$param,"",$sortfield,$sortorder); diff --git a/htdocs/comm/prospect/list.php b/htdocs/comm/prospect/list.php index f629aafef2904..e4d10e3396c4e 100644 --- a/htdocs/comm/prospect/list.php +++ b/htdocs/comm/prospect/list.php @@ -371,7 +371,7 @@ } if ($moreforfilter) { - print '
'; + print '
'; print $moreforfilter; $parameters=array(); $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook @@ -379,7 +379,7 @@ print '
'; } - print '
'; + print '
'; print ''; print_liste_field_titre($langs->trans("Company"),$_SERVER["PHP_SELF"],"s.nom","",$param,'',$sortfield,$sortorder); diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index dfe5fab121795..c4ea9cbf83841 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -262,8 +262,6 @@ if ($optioncss != '') print ''; print ''; - print '
'; - $moreforfilter=''; // If the user can view prospects other than his' @@ -295,7 +293,7 @@ } if (! empty($moreforfilter)) { - print '
'; + print '
'; print $moreforfilter; $parameters=array(); $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook @@ -303,6 +301,7 @@ print '
'; } + print '
'; print ''; print_liste_field_titre($langs->trans('Ref'),$_SERVER["PHP_SELF"],'c.ref','',$param,'width="25%"',$sortfield,$sortorder); print_liste_field_titre($langs->trans('RefCustomerOrder'),$_SERVER["PHP_SELF"],'c.ref_client','',$param,'',$sortfield,$sortorder); diff --git a/htdocs/compta/bank/search.php b/htdocs/compta/bank/search.php index 80befe3d433e0..b585f48565f80 100644 --- a/htdocs/compta/bank/search.php +++ b/htdocs/compta/bank/search.php @@ -186,12 +186,12 @@ if ($moreforfilter) { - print '
'; + print '
'; print $moreforfilter; print '
'."\n"; } - print '
'."\n"; + print '
'."\n"; print ''; print_liste_field_titre($langs->trans('Ref'),$_SERVER['PHP_SELF'],'b.rowid','',$param,'',$sortfield,$sortorder); print_liste_field_titre($langs->trans('DateOperationShort'),$_SERVER['PHP_SELF'],'b.dateo','',$param,'align="center"',$sortfield,$sortorder); diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index 300a06acca6e9..649179c10826f 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -276,6 +276,15 @@ print ''; print ''; + if ($sall) + { + print $langs->trans("Filter")." (".$langs->trans("Lastname").", ".$langs->trans("Firstname").", ".$langs->trans("ThirdParty")." ".$langs->trans("or")." ".$langs->trans("EMail")."): ".$sall; + } + if ($search_firstlast_only) + { + print $langs->trans("Filter")." (".$langs->trans("Lastname").", ".$langs->trans("Firstname")."): ".$search_firstlast_only; + } + if (! empty($conf->categorie->enabled)) { require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php'; @@ -285,20 +294,12 @@ } if ($moreforfilter) { - print '
'; + print '
'; print $moreforfilter; print '
'; } - if ($sall) - { - print $langs->trans("Filter")." (".$langs->trans("Lastname").", ".$langs->trans("Firstname").", ".$langs->trans("ThirdParty")." ".$langs->trans("or")." ".$langs->trans("EMail")."): ".$sall; - } - if ($search_firstlast_only) - { - print $langs->trans("Filter")." (".$langs->trans("Lastname").", ".$langs->trans("Firstname")."): ".$search_firstlast_only; - } - print '
'; + print '
'; // Ligne des titres print ''; diff --git a/htdocs/fourn/list.php b/htdocs/fourn/list.php index 14bd6298ea80f..d3edf06f1cb7b 100644 --- a/htdocs/fourn/list.php +++ b/htdocs/fourn/list.php @@ -201,7 +201,7 @@ } if ($moreforfilter) { - print '
'; + print '
'; print $moreforfilter; $parameters=array(); $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook @@ -209,7 +209,7 @@ print '
'; } - print '
'; + print '
'; print ''; print_liste_field_titre($langs->trans("Company"),$_SERVER["PHP_SELF"],"s.nom","",$param,'valign="middle"',$sortfield,$sortorder); diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index f46c6562ae709..8e98bf9e93f32 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -281,7 +281,7 @@ print ''; } - print '
'; + print '
'; print ''; print_liste_field_titre($langs->trans("Ref"),$_SERVER["PHP_SELF"],"p.ref","",$param,"",$sortfield,$sortorder); diff --git a/htdocs/projet/tasks/index.php b/htdocs/projet/tasks/index.php index 22b53d9f61ce6..082fbdd8d7b26 100644 --- a/htdocs/projet/tasks/index.php +++ b/htdocs/projet/tasks/index.php @@ -115,7 +115,6 @@ print '
'; print ''; -print '
'; // If the user can view users if ($user->rights->user->user->lire) @@ -134,7 +133,7 @@ } if (! empty($moreforfilter)) { - print '
'; + print '
'; print $moreforfilter; $parameters=array(); $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook @@ -142,6 +141,7 @@ print '
'; } +print '
'; print ''; print ''; print ''; diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index 39b625547b9cf..45881d20d3670 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -341,7 +341,7 @@ */ if (! empty($moreforfilter)) { - print '
'; + print '
'; print $moreforfilter; $parameters=array(); $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook @@ -349,7 +349,7 @@ print '
'; } - print '
'.$langs->trans("Project").''.$langs->trans("ProjectStatus").'
'; + print '
'; // Lines of titles print ''; diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index c7bb3e0fb91ed..d00731dce94f3 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -2014,11 +2014,11 @@ width: 100%; border-collapse: collapse; - border-top-color: #FEFEFE; - +/* border-top-color: #FEFEFE; border-top-width: 1px; border-top-color: #CCC; border-top-style: solid; +*/ border-right-width: 1px; border-right-color: #CCC; From c208fccf35aaf44b83bdc3edc0c2e5d5623d4b87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Tue, 6 Oct 2015 14:52:06 +0200 Subject: [PATCH 029/297] [Qual] Prevent warning calcul_price_total() prefers to have the seller and localtaxes specified --- htdocs/comm/propal/class/propal.class.php | 2 +- htdocs/contrat/class/contrat.class.php | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index b7ca39db991f9..dbd0378829314 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -368,7 +368,7 @@ function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1=0.0, $txlocaltax2=0.0 $localtaxes_type=getLocalTaxesFromRate($txtva,0,$this->thirdparty,$mysoc); - $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, '', $localtaxes_type); + $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, $type, $mysoc, $localtaxes_type); $total_ht = $tabprice[0]; $total_tva = $tabprice[1]; $total_ttc = $tabprice[2]; diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index d2e066082d022..f5b8d51690012 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -1284,7 +1284,7 @@ function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1, $txlocaltax2, $fk_pr $localtaxes_type=getLocalTaxesFromRate($txtva, 0, $this->societe, $mysoc); - $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, 1,'', $localtaxes_type); + $tabprice=calcul_price_total($qty, $pu, $remise_percent, $txtva, $txlocaltax1, $txlocaltax2, 0, $price_base_type, $info_bits, 1,$mysoc, $localtaxes_type); $total_ht = $tabprice[0]; $total_tva = $tabprice[1]; $total_ttc = $tabprice[2]; @@ -1420,7 +1420,7 @@ function updateline($rowid, $desc, $pu, $qty, $remise_percent, $date_start, $dat $localtaxes_type=getLocalTaxesFromRate($tvatx, 0, $this->societe, $mysoc); - $tabprice=calcul_price_total($qty, $pu, $remise_percent, $tvatx, $localtax1tx, $localtax2tx, 0, $price_base_type, $info_bits, 1, '', $localtaxes_type); + $tabprice=calcul_price_total($qty, $pu, $remise_percent, $tvatx, $localtax1tx, $localtax2tx, 0, $price_base_type, $info_bits, 1, $mysoc, $localtaxes_type); $total_ht = $tabprice[0]; $total_tva = $tabprice[1]; $total_ttc = $tabprice[2]; @@ -2333,7 +2333,7 @@ function fetch($id, $ref='') */ function update($user, $notrigger=0) { - global $conf, $langs; + global $conf, $langs, $mysoc; $error=0; @@ -2370,7 +2370,9 @@ function update($user, $notrigger=0) // qty, pu, remise_percent et txtva // TRES IMPORTANT: C'est au moment de l'insertion ligne qu'on doit stocker // la part ht, tva et ttc, et ce au niveau de la ligne qui a son propre taux tva. - $tabprice=calcul_price_total($this->qty, $this->price_ht, $this->remise_percent, $this->tva_tx, $this->localtax1_tx, $this->localtax2_tx, 0, 'HT', 0, 1); + $localtaxes_type = getLocalTaxesFromRate($this->txtva, 0, $this->societe, $mysoc); + + $tabprice=calcul_price_total($this->qty, $this->price_ht, $this->remise_percent, $this->tva_tx, $this->localtax1_tx, $this->localtax2_tx, 0, 'HT', 0, 1, $mysoc, $localtaxes_type); $this->total_ht = $tabprice[0]; $this->total_tva = $tabprice[1]; $this->total_ttc = $tabprice[2]; From 6ea05aa311ac8c8f6ba1942535ff7dd6ec70374e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 6 Oct 2015 16:03:47 +0200 Subject: [PATCH 030/297] FIX Bad translation key for project "Overview" --- htdocs/core/lib/project.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index 15c4627c4d738..f12d70ece2929 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -53,7 +53,7 @@ function project_prepare_head($object) || ! empty($conf->ficheinter->enabled) || ! empty($conf->agenda->enabled) || ! empty($conf->deplacement->enabled)) { $head[$h][0] = DOL_URL_ROOT.'/projet/element.php?id='.$object->id; - $head[$h][1] = $langs->trans("Overview"); + $head[$h][1] = $langs->trans("ProjectOverview"); $head[$h][2] = 'element'; $h++; } From e776f685ba3c509fe64eb07534b1e8f77d33365d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 6 Oct 2015 16:09:24 +0200 Subject: [PATCH 031/297] FIX when editing time spent, date of line suggested was a rubbish value --- htdocs/projet/tasks/time.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index f5eab2587cfe3..7721633c4e82e 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -430,6 +430,8 @@ /* * List of time spent */ + $tasks = array(); + $sql = "SELECT t.rowid, t.task_date, t.task_datehour, t.task_date_withhour, t.task_duration, t.fk_user, t.note, t.thm"; $sql.= ", u.lastname, u.firstname"; $sql .= " FROM ".MAIN_DB_PREFIX."projet_task_time as t"; @@ -444,7 +446,6 @@ { $num = $db->num_rows($resql); $i = 0; - $tasks = array(); while ($i < $num) { $row = $db->fetch_object($resql); @@ -470,7 +471,7 @@ print ''; print ''; print ''; - if ($conf->salaries->enabled) + if (! empty($conf->salaries->enabled)) { print ''; } @@ -491,11 +492,11 @@ print ''; From d4a85d9fba6aa47e6643633d3612f0e900e4eae6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 6 Oct 2015 16:12:09 +0200 Subject: [PATCH 032/297] Fix missing css --- htdocs/product/admin/product.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/admin/product.php b/htdocs/product/admin/product.php index 949d180a5bab1..c188fb949735e 100644 --- a/htdocs/product/admin/product.php +++ b/htdocs/product/admin/product.php @@ -354,7 +354,7 @@ if (!empty($conf->global->PRODUIT_CUSTOMER_PRICES)) $current_rule='PRODUIT_CUSTOMER_PRICES'; if ((!empty($conf->global->PRODUIT_CUSTOMER_PRICES_BY_QTY)) && (!empty($conf->global->PRODUIT_MULTIPRICES))) $current_rule='PRODUIT_CUSTOMER_PRICES_BY_QTY&PRODUIT_MULTIPRICES'; print $form->selectarray("princingrule",$select_pricing_rules,$current_rule); -print ''; print ''; From 1f742c7464f9ea99ae8923b120c792da7372f3d3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 6 Oct 2015 16:38:27 +0200 Subject: [PATCH 033/297] FIX Add a test to save life when ref of object (invoice ref, order ref, ...) was empty. The was no way to go back to a clean situation, even after vaidating again the object. --- .../comm/askpricesupplier/class/askpricesupplier.class.php | 4 ++-- htdocs/comm/propal/class/propal.class.php | 4 ++-- htdocs/commande/card.php | 4 ++-- htdocs/commande/class/commande.class.php | 6 +++--- htdocs/compta/facture/class/facture.class.php | 2 +- htdocs/contrat/class/contrat.class.php | 2 +- htdocs/expedition/class/expedition.class.php | 2 +- htdocs/fichinter/class/fichinter.class.php | 2 +- htdocs/fourn/class/fournisseur.commande.class.php | 4 ++-- htdocs/fourn/class/fournisseur.facture.class.php | 2 +- htdocs/fourn/commande/card.php | 5 ++++- htdocs/livraison/class/livraison.class.php | 2 +- 12 files changed, 21 insertions(+), 18 deletions(-) diff --git a/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php b/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php index bee62cb384dd6..957ea33f60c12 100644 --- a/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php +++ b/htdocs/comm/askpricesupplier/class/askpricesupplier.class.php @@ -1289,12 +1289,12 @@ function valid($user, $notrigger=0) $soc->fetch($this->socid); // Define new ref - if (! $error && (preg_match('/^[\(]?PROV/i', $this->ref))) + if (! $error && (preg_match('/^[\(]?PROV/i', $this->ref) || empty($this->ref))) // empty should not happened, but when it occurs, the test save life { $num = $this->getNextNumRef($soc); } else - { + { $num = $this->ref; } $this->newref = $num; diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 421b2506e7388..bfbc45b613d72 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -1481,12 +1481,12 @@ function valid($user, $notrigger=0) $soc->fetch($this->socid); // Define new ref - if (! $error && (preg_match('/^[\(]?PROV/i', $this->ref))) + if (! $error && (preg_match('/^[\(]?PROV/i', $this->ref) || empty($this->ref))) // empty should not happened, but when it occurs, the test save life { $num = $this->getNextNumRef($soc); } else - { + { $num = $this->ref; } $this->newref = $num; diff --git a/htdocs/commande/card.php b/htdocs/commande/card.php index 94d5c91c94f71..db8b94d769a56 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2014 Laurent Destailleur + * Copyright (C) 2004-2015 Laurent Destailleur * Copyright (C) 2005 Marc Barilley / Ocebo * Copyright (C) 2005-2015 Regis Houssin * Copyright (C) 2006 Andre Cianfarani @@ -165,7 +165,7 @@ } } - // Suppression de la commande + // Remove order else if ($action == 'confirm_delete' && $confirm == 'yes' && $user->rights->commande->supprimer) { $result = $object->delete($user); diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 767bf294d6f34..e681bfc77264c 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -263,14 +263,14 @@ function valid($user, $idwarehouse=0, $notrigger=0) // Protection if ($this->statut == self::STATUS_VALIDATED) { - dol_syslog(get_class($this)."::valid no draft status", LOG_WARNING); + dol_syslog(get_class($this)."::valid action abandonned: no draft status", LOG_WARNING); return 0; } if (! ((empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->commande->creer)) || (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && ! empty($user->rights->commande->order_advance->validate)))) { - $this->error='Permission denied'; + $this->error='ErrorPermissionDenied'; dol_syslog(get_class($this)."::valid ".$this->error, LOG_ERR); return -1; } @@ -287,7 +287,7 @@ function valid($user, $idwarehouse=0, $notrigger=0) $result=$soc->set_as_client(); // Define new ref - if (! $error && (preg_match('/^[\(]?PROV/i', $this->ref))) + if (! $error && (preg_match('/^[\(]?PROV/i', $this->ref) || empty($this->ref))) // empty should not happened, but when it occurs, the test save life { $num = $this->getNextNumRef($soc); } diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index f0668bb0987f5..80ca5e1f13931 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -1827,7 +1827,7 @@ function validate($user, $force_number='', $idwarehouse=0, $notrigger=0) { $num = $force_number; } - else if (preg_match('/^[\(]?PROV/i', $this->ref)) + else if (preg_match('/^[\(]?PROV/i', $this->ref) || empty($this->ref)) // empty should not happened, but when it occurs, the test save life { if (! empty($conf->global->FAC_FORCE_DATE_VALIDATION)) // If option enabled, we force invoice date { diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index eea23be7ae8b2..e88f4c95d54e4 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -402,7 +402,7 @@ function validate($user, $force_number='', $notrigger=0) $result=$this->thirdparty->set_as_client(); // Define new ref - if (! $error && (preg_match('/^[\(]?PROV/i', $this->ref))) + if (! $error && (preg_match('/^[\(]?PROV/i', $this->ref) || empty($this->ref))) // empty should not happened, but when it occurs, the test save life { $num = $this->getNextNumRef($this->thirdparty); } diff --git a/htdocs/expedition/class/expedition.class.php b/htdocs/expedition/class/expedition.class.php index edd8aa0cd39b3..b43afdfc206ea 100644 --- a/htdocs/expedition/class/expedition.class.php +++ b/htdocs/expedition/class/expedition.class.php @@ -589,7 +589,7 @@ function valid($user, $notrigger=0) $result=$soc->set_as_client(); // Define new ref - if (! $error && (preg_match('/^[\(]?PROV/i', $this->ref))) + if (! $error && (preg_match('/^[\(]?PROV/i', $this->ref) || empty($this->ref))) // empty should not happened, but when it occurs, the test save life { $numref = $this->getNextNumRef($soc); } diff --git a/htdocs/fichinter/class/fichinter.class.php b/htdocs/fichinter/class/fichinter.class.php index d0bcee286d0a1..fe93bc4214304 100644 --- a/htdocs/fichinter/class/fichinter.class.php +++ b/htdocs/fichinter/class/fichinter.class.php @@ -400,7 +400,7 @@ function setValid($user, $notrigger=0) $now=dol_now(); // Define new ref - if (! $error && (preg_match('/^[\(]?PROV/i', $this->ref))) + if (! $error && (preg_match('/^[\(]?PROV/i', $this->ref) || empty($this->ref))) // empty should not happened, but when it occurs, the test save life { $num = $this->getNextNumRef($this->thirdparty); } diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index 9d77deff3eeee..54022429fb361 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -388,7 +388,7 @@ function valid($user,$idwarehouse=0,$notrigger=0) $soc->fetch($this->fourn_id); // Check if object has a temporary ref - if (preg_match('/^[\(]?PROV/i', $this->ref)) + if (preg_match('/^[\(]?PROV/i', $this->ref) || empty($this->ref)) // empty should not happened, but when it occurs, the test save life { $num = $this->getNextNumRef($soc); } @@ -684,7 +684,7 @@ function approve($user, $idwarehouse=0, $secondlevel=0) $soc->fetch($this->fourn_id); // Check if object has a temporary ref - if (preg_match('/^[\(]?PROV/i', $this->ref)) + if (preg_match('/^[\(]?PROV/i', $this->ref) || empty($this->ref)) // empty should not happened, but when it occurs, the test save life { $num = $this->getNextNumRef($soc); } diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index 6a209174d9f79..890772326eadc 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -925,7 +925,7 @@ function validate($user, $force_number='', $idwarehouse=0, $notrigger=0) { $num = $force_number; } - else if (preg_match('/^[\(]?PROV/i', $this->ref)) + else if (preg_match('/^[\(]?PROV/i', $this->ref) || empty($this->ref)) // empty should not happened, but when it occurs, the test save life { $num = $this->getNextNumRef($this->client); } diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index fccd2652ed367..50bcefc36b23a 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -1672,7 +1672,10 @@ $object->date_commande=dol_now(); // We check if number is temporary number - if (preg_match('/^[\(]?PROV/i',$object->ref)) $newref = $object->getNextNumRef($object->thirdparty); + if (preg_match('/^[\(]?PROV/i',$object->ref) || empty($object->ref)) // empty should not happened, but when it occurs, the test save life + { + $newref = $object->getNextNumRef($object->thirdparty); + } else $newref = $object->ref; if ($newref < 0) diff --git a/htdocs/livraison/class/livraison.class.php b/htdocs/livraison/class/livraison.class.php index 3a1704f8d8d58..175d20a395229 100644 --- a/htdocs/livraison/class/livraison.class.php +++ b/htdocs/livraison/class/livraison.class.php @@ -379,7 +379,7 @@ function valid($user) $soc = new Societe($this->db); $soc->fetch($this->socid); - if (preg_match('/^[\(]?PROV/i', $this->ref)) + if (preg_match('/^[\(]?PROV/i', $this->ref) || empty($this->ref)) // empty should not happened, but when it occurs, the test save life { $numref = $objMod->livraison_get_num($soc,$this); } From c460873c8517527082ab562106d1ed8350b67701 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 6 Oct 2015 17:13:35 +0200 Subject: [PATCH 034/297] FIX The filter on thirdparty prices should be visible if there is at least one thirdparty price. --- htdocs/product/price.php | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/htdocs/product/price.php b/htdocs/product/price.php index b3b884cbd7e42..49f4779d4e4f8 100644 --- a/htdocs/product/price.php +++ b/htdocs/product/price.php @@ -1286,18 +1286,18 @@ function on_change() { print ''; print ''; - print ''; - print ''; - print ''; - // Print the search button - print ''; - print ''; - if (count($prodcustprice->lines) > 0) { - $var = False; + print ''; + print ''; + print ''; + // Print the search button + print ''; + print ''; + + $var = False; foreach ($prodcustprice->lines as $line) { From 8426e2e50654f27d1eec24b29c6ef66b8a4f6352 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 6 Oct 2015 18:38:43 +0200 Subject: [PATCH 035/297] FIX Can't reopen a canceled invoice. --- 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 db8b94d769a56..8748b283abe5a 100644 --- a/htdocs/commande/card.php +++ b/htdocs/commande/card.php @@ -150,7 +150,7 @@ // Reopen a closed order else if ($action == 'reopen' && $user->rights->commande->creer) { - if ($object->statut == STATUS_CANCELED || $object->statut == Commande::STATUS_CLOSED) + if ($object->statut == Commande::STATUS_CANCELED || $object->statut == Commande::STATUS_CLOSED) { $result = $object->set_reopen($user); if ($result > 0) From 72cabe2fc3fb9fbec5962b190a7c572eeffae399 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 6 Oct 2015 19:27:48 +0200 Subject: [PATCH 036/297] More complete description of margin rules calculation --- htdocs/langs/en_US/margins.lang | 2 +- htdocs/langs/fr_FR/margins.lang | 2 +- htdocs/margin/admin/margin.php | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/htdocs/langs/en_US/margins.lang b/htdocs/langs/en_US/margins.lang index eeaace7352364..eb77ca9fe4c2b 100644 --- a/htdocs/langs/en_US/margins.lang +++ b/htdocs/langs/en_US/margins.lang @@ -36,7 +36,7 @@ MargeNette=Net margin MargeType1=Margin on Best supplier price MargeType2=Margin on Weighted Average Price (WAP) MARGIN_TYPE_DETAILS=Raw margin : Selling price - Buying price
Net margin : Selling price - Cost price -MarginTypeDesc=Margin on best buying price : Selling price - Best supplier price defined on product card
Margin on Weighted Average Price (WAP) : Selling price - Product Weighted Average Price +MarginTypeDesc=Margin on best buying price : Selling price - Best supplier price defined on product card
Margin on Weighted Average Price (WAP) : Selling price - Product Weighted Average Price (WAP) or best supplier price if WAP not yet defined CostPrice=Cost price BuyingCost=Cost price UnitCharges=Unit charges diff --git a/htdocs/langs/fr_FR/margins.lang b/htdocs/langs/fr_FR/margins.lang index ce14fb1e4edb1..dd74d684d682f 100644 --- a/htdocs/langs/fr_FR/margins.lang +++ b/htdocs/langs/fr_FR/margins.lang @@ -36,7 +36,7 @@ MargeNette=Marge nette MargeType1=Marge sur le meilleur prix fournisseur MargeType2=Marge sur le Prix Moyen Pondéré (PMP) MARGIN_TYPE_DETAILS=Marge brute : Prix de vente HT - Prix d'achat HT
Marge nette : Prix de vente HT - Weighted Average Price -MarginTypeDesc=Marge sur le meilleur prix d'achat fournisseur: Prix de vente - Meilleur prix d'achat défini sur la fiche produit
Marge sur le Prix Moyen Pondéré (PMP): Prix de vente - Prix Moyen Pondéré du produit +MarginTypeDesc=Marge sur le meilleur prix d'achat fournisseur: Prix de vente - Meilleur prix d'achat défini sur la fiche produit
Marge sur le Prix Moyen Pondéré (PMP): Prix de vente - Prix Moyen Pondéré du produit (PMP) ou meilleur prix d'achat si PMP non défini CostPrice=Prix de revient BuyingCost=Coût de revient UnitCharges=Charge unitaire diff --git a/htdocs/margin/admin/margin.php b/htdocs/margin/admin/margin.php index 2ad51c4fb28d5..b332deeb4a989 100644 --- a/htdocs/margin/admin/margin.php +++ b/htdocs/margin/admin/margin.php @@ -164,7 +164,6 @@ print ''; print ''; print '
'; print ''; print ''; From 8d47a307bb1b00a67c70b174f5e9e1e1fddb96b8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 6 Oct 2015 21:44:41 +0200 Subject: [PATCH 037/297] Better use of space --- htdocs/comm/list.php | 2 +- htdocs/comm/prospect/list.php | 6 +++--- htdocs/core/class/html.form.class.php | 5 +++-- htdocs/fourn/list.php | 4 ++-- htdocs/langs/en_US/admin.lang | 2 +- htdocs/langs/en_US/companies.lang | 1 + htdocs/societe/list.php | 8 ++++---- 7 files changed, 15 insertions(+), 13 deletions(-) diff --git a/htdocs/comm/list.php b/htdocs/comm/list.php index 3147240167ec4..fcc1783daf5fc 100644 --- a/htdocs/comm/list.php +++ b/htdocs/comm/list.php @@ -246,7 +246,7 @@ print ''; print ''; print ''; print ''; print ''; print ''; // Prospect level diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 8d69e58bad3d0..0d4bff05d422d 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -484,9 +484,10 @@ function textwithpicto($text, $htmltext, $direction = 1, $type = 'help', $extrac * @param string $htmlname Name of html select object * @param string $htmloption Options html on select object * @param integer $maxlength Max length for labels (0=no limit) + * @param string $morecss More css class * @return string HTML string with select */ - function select_country($selected='',$htmlname='country_id',$htmloption='',$maxlength=0) + function select_country($selected='',$htmlname='country_id',$htmloption='',$maxlength=0,$morecss='minwidth300') { global $conf,$langs; @@ -507,7 +508,7 @@ function select_country($selected='',$htmlname='country_id',$htmloption='',$maxl $resql=$this->db->query($sql); if ($resql) { - $out.= ''; $num = $this->db->num_rows($resql); $i = 0; if ($num) diff --git a/htdocs/fourn/list.php b/htdocs/fourn/list.php index d3edf06f1cb7b..5693031c630ce 100644 --- a/htdocs/fourn/list.php +++ b/htdocs/fourn/list.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2012 Laurent Destailleur + * Copyright (C) 2004-2015 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2011 Philippe Grand * Copyright (C) 2013 Cédric Salvador @@ -238,7 +238,7 @@ print ''; print ''; print ''; // Barcode if (! empty($conf->barcode->enabled)) @@ -387,11 +387,11 @@ } // Town print ''; //Country print ''; //Company type print '"; - //if ($oldfamily && $family!=$oldfamily && $atleastoneforfamily) { - if ($family!=$oldfamily) + //print ""; + //if ($oldfamily && $familykey!=$oldfamily && $atleastoneforfamily) { + if ($familykey!=$oldfamily) { print ''."\n"; print '\n"; print ''."\n"; print "\n"; $atleastoneforfamily=0; - //print ""; + //print ""; } $atleastoneforfamily++; - if ($family!=$oldfamily) + if ($familykey!=$oldfamily) { - $familytext=empty($familylib[$family])?$family:$familylib[$family]; - //print $familytext; - $oldfamily=$family; + $familytext=empty($familyinfo[$familykey]['label'])?$familykey:$familyinfo[$familykey]['label']; + $oldfamily=$familykey; } $var=!$var; diff --git a/htdocs/core/modules/DolibarrModules.class.php b/htdocs/core/modules/DolibarrModules.class.php index c059ff7c2cc3e..b8d4df05e922d 100644 --- a/htdocs/core/modules/DolibarrModules.class.php +++ b/htdocs/core/modules/DolibarrModules.class.php @@ -35,16 +35,19 @@ class DolibarrModules // Can not be abstract, because we need to instantiant it into unActivateModule to be able to disable a module whose files were removed. { /** - * @var DoliDb Database handler + * @var int Module unique ID */ - public $db; + public $numero; /** - * @var string Relative path to module style sheet - * @deprecated - * @see module_parts + * @var string Module name */ - public $style_sheet = ''; + public $name; + + /** + * @var DoliDb Database handler + */ + public $db; /** * @var array Paths to create when module is activated @@ -134,16 +137,6 @@ class DolibarrModules // Can not be abstract, because we need to insta */ public $error; - /** - * @var int Module unique ID - */ - public $numero; - - /** - * @var string Module name - */ - public $name; - /** * @var string Module version */ @@ -193,7 +186,15 @@ class DolibarrModules // Can not be abstract, because we need to insta * @var bool Module is enabled globally (Multicompany support) */ public $core_enabled; + + /** + * @var string Relative path to module style sheet + * @deprecated + * @see module_parts + */ + public $style_sheet = ''; + /** * Constructor. Define names, constants, directories, boxes, permissions @@ -470,6 +471,7 @@ function isCoreOrExternalModule() if ($this->version == 'dolibarr' || $this->version == 'dolibarr_deprecated') return 'core'; if (! empty($this->version) && ! in_array($this->version,array('experimental','development'))) return 'external'; if (! empty($this->editor_name) || ! empty($this->editor_web)) return 'external'; + if ($this->numero >= 100000) return 'external'; return 'unknown'; } diff --git a/htdocs/core/modules/modCashDesk.class.php b/htdocs/core/modules/modCashDesk.class.php index a76531cd719b3..430d62146f579 100644 --- a/htdocs/core/modules/modCashDesk.class.php +++ b/htdocs/core/modules/modCashDesk.class.php @@ -45,7 +45,7 @@ function __construct($db) // Key text used to identify module (for permission, menus, etc...) $this->rights_class = 'cashdesk'; - $this->family = "products"; + $this->family = "portal"; // Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module) $this->name = preg_replace('/^mod/i','',get_class($this)); $this->description = "CashDesk module"; diff --git a/htdocs/core/modules/modLabel.class.php b/htdocs/core/modules/modLabel.class.php index 54f65a8359186..0b282584261e5 100644 --- a/htdocs/core/modules/modLabel.class.php +++ b/htdocs/core/modules/modLabel.class.php @@ -43,7 +43,7 @@ function __construct($db) $this->db = $db; $this->numero = 60; - $this->family = "other"; + $this->family = "technic"; // Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module) $this->name = preg_replace('/^mod/i','',get_class($this)); $this->description = "Gestion des etiquettes"; diff --git a/htdocs/core/modules/modUser.class.php b/htdocs/core/modules/modUser.class.php index 8c510186f0641..d3be64d0560f7 100644 --- a/htdocs/core/modules/modUser.class.php +++ b/htdocs/core/modules/modUser.class.php @@ -45,7 +45,7 @@ function __construct($db) $this->db = $db; $this->numero = 0; - $this->family = "base"; // Family for module (or "base" if core module) + $this->family = "hr"; // Family for module (or "base" if core module) // Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module) $this->name = preg_replace('/^mod/i','',get_class($this)); $this->description = "Gestion des utilisateurs (requis)"; diff --git a/htdocs/core/modules/modSyncSupplierWebServices.class.php b/htdocs/core/modules/modWebServicesClient.class.php similarity index 94% rename from htdocs/core/modules/modSyncSupplierWebServices.class.php rename to htdocs/core/modules/modWebServicesClient.class.php index 96403f67ee4b8..dd13d8920dbc4 100644 --- a/htdocs/core/modules/modSyncSupplierWebServices.class.php +++ b/htdocs/core/modules/modWebServicesClient.class.php @@ -27,7 +27,7 @@ /** * Class to describe a sync supplier web services module */ -class modSyncSupplierWebServices extends DolibarrModules +class modWebServicesClient extends DolibarrModules { /** @@ -38,12 +38,12 @@ class modSyncSupplierWebServices extends DolibarrModules function __construct($db) { $this->db = $db; - $this->numero = 2650; + $this->numero = 2660; $this->family = "technic"; // Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module) $this->name = preg_replace('/^mod/i','',get_class($this)); - $this->description = "Enable the client for external supplier web services"; + $this->description = "Enable the web service client to call external supplier web services"; $this->version = 'experimental'; // 'experimental' or 'dolibarr' or version // Key used in llx_const table to save module status enabled/disabled (where MYMODULE is value of property name of module in uppercase) $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); diff --git a/htdocs/core/modules/modWebsite.class.php b/htdocs/core/modules/modWebsite.class.php new file mode 100644 index 0000000000000..0e75daa26bdbf --- /dev/null +++ b/htdocs/core/modules/modWebsite.class.php @@ -0,0 +1,124 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \defgroup website Module website + * \brief Website module descriptor. + * \file htdocs/core/modules/modWebsite.class.php + * \ingroup website + * \brief Description and activation file for module Website + */ +include_once DOL_DOCUMENT_ROOT .'/core/modules/DolibarrModules.class.php'; + + +/** + * Class to describe Website module + */ +class modWebsite extends DolibarrModules +{ + + /** + * Constructor. Define names, constants, directories, boxes, permissions + * + * @param DoliDB $db Database handler + */ + function __construct($db) + { + global $langs,$conf; + + $this->db = $db; + $this->numero = 10000; + + // Family can be 'crm','financial','hr','projects','products','ecm','technic','other' + // It is used to group modules in module setup page + $this->family = "portal"; + // Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module) + $this->name = preg_replace('/^mod/i','',get_class($this)); + $this->description = "Enable the public website with CMS features"; + $this->version = 'development'; // 'experimental' or 'dolibarr' or version + // Key used in llx_const table to save module status enabled/disabled (where MYMODULE is value of property name of module in uppercase) + $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); + // Where to store the module in setup page (0=common,1=interface,2=others,3=very specific) + $this->special = 0; + // Name of image file used for this module. + $this->picto='globe'; + + // Data directories to create when module is enabled + $this->dirs = array(); + + // Config pages + //------------- + $this->config_page_url = array("website.php"); + + // Dependancies + //------------- + $this->hidden = ! empty($conf->global->WEBSITE_MODULE_DISABLED); // A condition to disable module + $this->depends = array(); // List of modules id that must be enabled if this module is enabled + $this->requiredby = array(); // List of modules id to disable if this one is disabled + $this->conflictwith = array(); // List of modules id this module is in conflict with + $this->langfiles = array("website"); + + // Constants + //----------- + $this->const = array(); + + // New pages on tabs + // ----------------- + $this->tabs = array(); + + // Boxes + //------ + $this->boxes = array(); + + // Permissions + $this->rights = array(); // Permission array used by this module + $this->rights_class = 'website'; + $r=0; + + $this->rights[$r][0] = 10001; + $this->rights[$r][1] = 'Read website content'; + $this->rights[$r][3] = 1; + $this->rights[$r][4] = 'read'; + $r++; + + $this->rights[$r][0] = 10002; + $this->rights[$r][1] = 'Create/modify website content'; + $this->rights[$r][3] = 0; + $this->rights[$r][4] = 'create'; + $r++; + + $this->rights[$r][0] = 10003; + $this->rights[$r][1] = 'Delete website content'; + $this->rights[$r][3] = 0; + $this->rights[$r][4] = 'delete'; + $r++; + + // Main menu entries + $r=0; + $this->menu[$r]=array( 'fk_menu'=>'fk_mainmenu=home', // Use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode + 'type'=>'top', // This is a Left menu entry + 'titre'=>'Website', + 'url'=>'/website/index.php', + 'langs'=>'website', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. + 'position'=>100, + 'enabled'=>'$conf->website->enabled', // Define condition to show or hide menu entry. Use '$conf->mymodule->enabled' if entry must be visible if module is enabled. Use '$leftmenu==\'system\'' to show if leftmenu system is selected. + 'perms'=>'$user->rights->website->read', // 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/cron/list.php b/htdocs/cron/list.php index 1f4e5126ed04d..dd02db53bc89c 100644 --- a/htdocs/cron/list.php +++ b/htdocs/cron/list.php @@ -197,9 +197,7 @@ print ''; print ''; @@ -294,7 +292,7 @@ print yn($line->status); print ''; - print ''; + print_liste_field_titre(''); } print_liste_field_titre( $langs->trans("AmountTTC"), diff --git a/htdocs/compta/stats/casoc.php b/htdocs/compta/stats/casoc.php index 7b9cfdd791379..dade07fd0e387 100644 --- a/htdocs/compta/stats/casoc.php +++ b/htdocs/compta/stats/casoc.php @@ -350,7 +350,7 @@ $sortorder ); } else { - print ''; + print_liste_field_titre(''); } print_liste_field_titre( $langs->trans("AmountTTC"), From f8ade01f0efc5c179ba3bb3e0bb70fca5b66d15d Mon Sep 17 00:00:00 2001 From: aspangaro Date: Wed, 7 Oct 2015 21:48:46 +0200 Subject: [PATCH 043/297] New : Add payment donation in accountancy expert --- htdocs/accountancy/journal/bankjournal.php | 168 +++++++++++---------- 1 file changed, 88 insertions(+), 80 deletions(-) diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index 812acf5c92380..01957fcedf523 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -40,6 +40,7 @@ require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/sociales/class/chargesociales.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/paiement/class/paiement.class.php'; +require_once DOL_DOCUMENT_ROOT.'/don/class/paymentdonation.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/tva/class/tva.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/salaries/class/paymentsalary.class.php'; require_once DOL_DOCUMENT_ROOT.'/fourn/class/paiementfourn.class.php'; @@ -120,6 +121,7 @@ $societestatic = new Societe($db); $userstatic = new User($db); $chargestatic = new ChargeSociales($db); +$paymentdonstatic = new PaymentDonation($db); $paymentvatstatic = new TVA($db); $paymentsalstatic = new PaymentSalary($db); @@ -133,7 +135,8 @@ $cptcli = (! empty($conf->global->ACCOUNTING_ACCOUNT_CUSTOMER) ? $conf->global->ACCOUNTING_ACCOUNT_CUSTOMER : $langs->trans("CodeNotDef")); $accountancy_account_salary = (! empty($conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT) ? $conf->global->SALARIES_ACCOUNTING_ACCOUNT_PAYMENT : $langs->trans("CodeNotDef")); $accountancy_account_pay_vat = (! empty($conf->global->ACCOUNTING_VAT_PAY_ACCOUNT) ? $conf->global->ACCOUNTING_VAT_PAY_ACCOUNT : $langs->trans("CodeNotDef")); - + $accountancy_account_pay_donation = (! empty($conf->global->DONATION_ACCOUNTINGACCOUNT) ? $conf->global->DONATION_ACCOUNTINGACCOUNT : $langs->trans("CodeNotDef")); + $tabpay = array (); $tabbq = array (); $tabtp = array (); @@ -174,95 +177,100 @@ // get_url may return -1 which is not traversable if (is_array($links)) { - - foreach ( $links as $key => $val ) - { - $tabtype[$obj->rowid] = $links[$key]['type']; - - if ($links[$key]['type'] == 'payment') - { - $paymentstatic->id = $links[$key]['url_id']; - $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentstatic->getNomUrl(2); - } - else if ($links[$key]['type'] == 'payment_supplier') + foreach ( $links as $key => $val ) { - $paymentsupplierstatic->id = $links[$key]['url_id']; - $paymentsupplierstatic->ref = $links[$key]['url_id']; - $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentsupplierstatic->getNomUrl(2); - } - else if ($links[$key]['type'] == 'company') - { - $societestatic->id = $links[$key]['url_id']; - $societestatic->name = $links[$key]['label']; - $tabpay[$obj->rowid]["soclib"] = $societestatic->getNomUrl(1, '', 30); - $tabtp[$obj->rowid][$compta_soc] += $obj->amount; - } - else if ($links[$key]['type'] == 'user') - { - $userstatic->id = $links[$key]['url_id']; - $userstatic->name = $links[$key]['label']; - $tabpay[$obj->rowid]["soclib"] = $userstatic->getNomUrl(1, '', 30); - // $tabtp[$obj->rowid][$compta_user] += $obj->amount; - } - else if ($links[$key]['type'] == 'sc') - { - $chargestatic->id = $links[$key]['url_id']; - $chargestatic->ref = $links[$key]['url_id']; - - $tabpay[$obj->rowid]["lib"] .= ' ' . $chargestatic->getNomUrl(2); - if (preg_match('/^\((.*)\)$/i', $links[$key]['label'], $reg)) { - if ($reg[1] == 'socialcontribution') - $reg[1] = 'SocialContribution'; - $chargestatic->lib = $langs->trans($reg[1]); + $tabtype[$obj->rowid] = $links[$key]['type']; + + if ($links[$key]['type'] == 'payment') + { + $paymentstatic->id = $links[$key]['url_id']; + $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentstatic->getNomUrl(2); + } + else if ($links[$key]['type'] == 'payment_supplier') + { + $paymentsupplierstatic->id = $links[$key]['url_id']; + $paymentsupplierstatic->ref = $links[$key]['url_id']; + $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentsupplierstatic->getNomUrl(2); } - else + else if ($links[$key]['type'] == 'company') { - $chargestatic->lib = $links[$key]['label']; + $societestatic->id = $links[$key]['url_id']; + $societestatic->name = $links[$key]['label']; + $tabpay[$obj->rowid]["soclib"] = $societestatic->getNomUrl(1, '', 30); + $tabtp[$obj->rowid][$compta_soc] += $obj->amount; } - $chargestatic->ref = $chargestatic->lib; - $tabpay[$obj->rowid]["soclib"] = $chargestatic->getNomUrl(1, 30); + else if ($links[$key]['type'] == 'user') + { + $userstatic->id = $links[$key]['url_id']; + $userstatic->name = $links[$key]['label']; + $tabpay[$obj->rowid]["soclib"] = $userstatic->getNomUrl(1, '', 30); + // $tabtp[$obj->rowid][$compta_user] += $obj->amount; + } + else if ($links[$key]['type'] == 'sc') + { + $chargestatic->id = $links[$key]['url_id']; + $chargestatic->ref = $links[$key]['url_id']; + + $tabpay[$obj->rowid]["lib"] .= ' ' . $chargestatic->getNomUrl(2); + if (preg_match('/^\((.*)\)$/i', $links[$key]['label'], $reg)) { + if ($reg[1] == 'socialcontribution') + $reg[1] = 'SocialContribution'; + $chargestatic->lib = $langs->trans($reg[1]); + } + else + { + $chargestatic->lib = $links[$key]['label']; + } + $chargestatic->ref = $chargestatic->lib; + $tabpay[$obj->rowid]["soclib"] = $chargestatic->getNomUrl(1, 30); - $sqlmid = 'SELECT cchgsoc.accountancy_code'; - $sqlmid .= " FROM " . MAIN_DB_PREFIX . "c_chargesociales cchgsoc "; - $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "chargesociales as chgsoc ON chgsoc.fk_type=cchgsoc.id"; - $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementcharge as paycharg ON paycharg.fk_charge=chgsoc.rowid"; - $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "bank_url as bkurl ON bkurl.url_id=paycharg.rowid"; - $sqlmid .= " WHERE bkurl.fk_bank=" . $obj->rowid; + $sqlmid = 'SELECT cchgsoc.accountancy_code'; + $sqlmid .= " FROM " . MAIN_DB_PREFIX . "c_chargesociales cchgsoc "; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "chargesociales as chgsoc ON chgsoc.fk_type=cchgsoc.id"; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "paiementcharge as paycharg ON paycharg.fk_charge=chgsoc.rowid"; + $sqlmid .= " INNER JOIN " . MAIN_DB_PREFIX . "bank_url as bkurl ON bkurl.url_id=paycharg.rowid"; + $sqlmid .= " WHERE bkurl.fk_bank=" . $obj->rowid; - dol_syslog("accountancy/journal/bankjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); - $resultmid = $db->query($sqlmid); - if ($resultmid) + dol_syslog("accountancy/journal/bankjournal.php:: sqlmid=" . $sqlmid, LOG_DEBUG); + $resultmid = $db->query($sqlmid); + if ($resultmid) + { + $objmid = $db->fetch_object($resultmid); + $tabtp[$obj->rowid][$objmid->accountancy_code] += $obj->amount; + } + } + else if ($links[$key]['type'] == 'payment_donation') { - $objmid = $db->fetch_object($resultmid); - $tabtp[$obj->rowid][$objmid->accountancy_code] += $obj->amount; + $paymentdonstatic->id = $links[$key]['url_id']; + $paymentdonstatic->fk_donation = $links[$key]['url_id']; + $tabpay[$obj->rowid]["lib"] .= ' ' . $langs->trans("PaymentDonation"); + $tabtp[$obj->rowid][$accountancy_account_pay_donation] += $obj->amount; } + else if ($links[$key]['type'] == 'payment_vat') + { + $paymentvatstatic->id = $links[$key]['url_id']; + $paymentvatstatic->ref = $links[$key]['url_id']; + $tabpay[$obj->rowid]["lib"] .= ' ' . $langs->trans("PaymentVat"); + $tabtp[$obj->rowid][$accountancy_account_pay_vat] += $obj->amount; + } + else if ($links[$key]['type'] == 'payment_salary') + { + $paymentsalstatic->id = $links[$key]['url_id']; + $paymentsalstatic->ref = $links[$key]['url_id']; + $paymentsalstatic->label = $links[$key]['label']; + $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentsalstatic->getNomUrl(2); + $tabtp[$obj->rowid][$accountancy_account_salary] += $obj->amount; + } + else if ($links[$key]['type'] == 'banktransfert') + { + $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentvatstatic->getNomUrl(2); + $tabtp[$obj->rowid][$cpttva] += $obj->amount; + } + /*else { + $tabtp [$obj->rowid] [$accountancy_account_salary] += $obj->amount; + }*/ } - else if ($links[$key]['type'] == 'payment_vat') - { - $paymentvatstatic->id = $links[$key]['url_id']; - $paymentvatstatic->ref = $links[$key]['url_id']; - $tabpay[$obj->rowid]["lib"] .= ' ' . $langs->trans("PaymentVat"); - $tabtp[$obj->rowid][$accountancy_account_pay_vat] += $obj->amount; - } - else if ($links[$key]['type'] == 'payment_salary') - { - $paymentsalstatic->id = $links[$key]['url_id']; - $paymentsalstatic->ref = $links[$key]['url_id']; - $paymentsalstatic->label = $links[$key]['label']; - $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentsalstatic->getNomUrl(2); - $tabtp[$obj->rowid][$accountancy_account_salary] += $obj->amount; - } - else if ($links[$key]['type'] == 'banktransfert') - { - $tabpay[$obj->rowid]["lib"] .= ' ' . $paymentvatstatic->getNomUrl(2); - $tabtp[$obj->rowid][$cpttva] += $obj->amount; - } - /*else { - $tabtp [$obj->rowid] [$accountancy_account_salary] += $obj->amount; - }*/ - } - } $tabbq[$obj->rowid][$compta_bank] += $obj->amount; From deaf23870e3d2e980fd7c329abec94d493f35d87 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Wed, 7 Oct 2015 21:52:30 +0200 Subject: [PATCH 044/297] Cancel work on responsive design --- htdocs/theme/md/style.css.php | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index d9910f82dd78a..b917022cf84ea 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -3560,22 +3560,6 @@ position: absolute; width: px; } - - div.fichethirdleft { - width: 100%; - } - - div.fichetwothirdright { - width: 100%; - } - - div.fichehalfleft { - width: 100%; - } - - div.fichehalfright { - width: 100%; - } } @media only screen and (max-width: 570px) { @@ -3590,22 +3574,6 @@ position: absolute; width: px; } - - div.fichethirdleft { - width: 100%; - } - - div.fichetwothirdright { - width: 100%; - } - - div.fichehalfleft { - width: 100%; - } - - div.fichehalfright { - width: 100%; - } } From 425e7ce808009500ab04f0ef885723a629a68c22 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Wed, 7 Oct 2015 22:31:23 +0200 Subject: [PATCH 045/297] Fix : ER Show date in english format --- htdocs/expensereport/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/expensereport/card.php b/htdocs/expensereport/card.php index 7220e869350c5..fed76abed074c 100644 --- a/htdocs/expensereport/card.php +++ b/htdocs/expensereport/card.php @@ -1669,7 +1669,7 @@ print img_picto($langs->trans("Document"), "object_generic"); print ' '.$piece_comptable.''; } - print ''; + print ''; print '\n"; // Can edit @@ -197,7 +197,7 @@ function initfields() print '\n"; } diff --git a/htdocs/adherents/card.php b/htdocs/adherents/card.php index 94f12a61f8bf6..a2fe0763e9760 100644 --- a/htdocs/adherents/card.php +++ b/htdocs/adherents/card.php @@ -249,7 +249,7 @@ } $lastname=$_POST["lastname"]; $firstname=$_POST["firstname"]; - $morphy=$morphy=$_POST["morphy"];; + $morphy=$morphy=$_POST["morphy"]; if ($morphy != 'mor' && empty($lastname)) { $error++; $langs->load("errors"); diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index 580770e7ba2d0..ae8ce969f7054 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -913,7 +913,7 @@ print ""; $colspan=count($fieldlist)+2; - if ($id == 4) $colspan++;; + if ($id == 4) $colspan++; if (! empty($alabelisused)) // Si un des champs est un libelle { diff --git a/htdocs/cashdesk/admin/cashdesk.php b/htdocs/cashdesk/admin/cashdesk.php index 7571befb1214d..15f15cedc10e1 100644 --- a/htdocs/cashdesk/admin/cashdesk.php +++ b/htdocs/cashdesk/admin/cashdesk.php @@ -164,7 +164,7 @@ $var=! $var; print '\n"; } diff --git a/htdocs/categories/class/categorie.class.php b/htdocs/categories/class/categorie.class.php index b9876bb8382a4..7814b198a0203 100644 --- a/htdocs/categories/class/categorie.class.php +++ b/htdocs/categories/class/categorie.class.php @@ -1164,7 +1164,7 @@ function containing($id,$type,$mode='object') { $cats = array(); - $typeid=-1; $table='';; + $typeid=-1; $table=''; if ($type == '0' || $type == 'product') { $typeid=0; $table='product'; $type='product'; } else if ($type == '1' || $type == 'supplier') { $typeid=1; $table='societe'; $type='fournisseur'; } else if ($type == '2' || $type == 'customer') { $typeid=2; $table='societe'; $type='societe'; } diff --git a/htdocs/compta/bank/releve.php b/htdocs/compta/bank/releve.php index e4afe6f2b256f..c5ca2ef383554 100644 --- a/htdocs/compta/bank/releve.php +++ b/htdocs/compta/bank/releve.php @@ -343,7 +343,7 @@ elseif ($links[$key]['type']=='payment_supplier') { $paymentsupplierstatic->id=$links[$key]['url_id']; - $paymentsupplierstatic->ref=$langs->trans("Payment");; + $paymentsupplierstatic->ref=$langs->trans("Payment"); print ' '.$paymentsupplierstatic->getNomUrl(1); $newline=0; } diff --git a/htdocs/compta/stats/index.php b/htdocs/compta/stats/index.php index cfd816c29b6b1..8dfb0d76fc0cc 100644 --- a/htdocs/compta/stats/index.php +++ b/htdocs/compta/stats/index.php @@ -298,7 +298,7 @@ if ($annee_decalage != $year_end) print ''; } - $total_ht[$annee]+=!empty($cum_ht[$case]) ? $cum_ht[$case] : 0;; + $total_ht[$annee]+=!empty($cum_ht[$case]) ? $cum_ht[$case] : 0; $total[$annee]+=$cum[$case]; } diff --git a/htdocs/core/lib/memory.lib.php b/htdocs/core/lib/memory.lib.php index a6fae1c7b1f30..b68016c3a469d 100644 --- a/htdocs/core/lib/memory.lib.php +++ b/htdocs/core/lib/memory.lib.php @@ -231,7 +231,7 @@ function dol_getshmop($memoryid) global $shmkeys,$shmoffset; if (empty($shmkeys[$memoryid]) || ! function_exists("shmop_open")) return 0; - $shmkey=dol_getshmopaddress($memoryid);; + $shmkey=dol_getshmopaddress($memoryid); //print 'dol_getshmop memoryid='.$memoryid." shmkey=".$shmkey."
\n"; $handle=@shmop_open($shmkey,'a',0,0); if ($handle) diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index f3e77916c4bca..6b636e99462ee 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -121,17 +121,17 @@ function task_prepare_head($object) $h = 0; $head = array(); - $head[$h][0] = DOL_URL_ROOT.'/projet/tasks/task.php?id='.$object->id.(GETPOST('withproject')?'&withproject=1':'');; + $head[$h][0] = DOL_URL_ROOT.'/projet/tasks/task.php?id='.$object->id.(GETPOST('withproject')?'&withproject=1':''); $head[$h][1] = $langs->trans("Card"); $head[$h][2] = 'task_task'; $h++; - $head[$h][0] = DOL_URL_ROOT.'/projet/tasks/contact.php?id='.$object->id.(GETPOST('withproject')?'&withproject=1':'');; + $head[$h][0] = DOL_URL_ROOT.'/projet/tasks/contact.php?id='.$object->id.(GETPOST('withproject')?'&withproject=1':''); $head[$h][1] = $langs->trans("TaskRessourceLinks"); $head[$h][2] = 'task_contact'; $h++; - $head[$h][0] = DOL_URL_ROOT.'/projet/tasks/time.php?id='.$object->id.(GETPOST('withproject')?'&withproject=1':'');; + $head[$h][0] = DOL_URL_ROOT.'/projet/tasks/time.php?id='.$object->id.(GETPOST('withproject')?'&withproject=1':''); $head[$h][1] = $langs->trans("TimeSpent"); $head[$h][2] = 'task_time'; $h++; @@ -147,14 +147,14 @@ function task_prepare_head($object) $nbNote = 0; if(!empty($object->note_private)) $nbNote++; if(!empty($object->note_public)) $nbNote++; - $head[$h][0] = DOL_URL_ROOT.'/projet/tasks/note.php?id='.$object->id.(GETPOST('withproject')?'&withproject=1':'');; + $head[$h][0] = DOL_URL_ROOT.'/projet/tasks/note.php?id='.$object->id.(GETPOST('withproject')?'&withproject=1':''); $head[$h][1] = $langs->trans('Notes'); if ($nbNote > 0) $head[$h][1].= ' '.$nbNote.''; $head[$h][2] = 'task_notes'; $h++; } - $head[$h][0] = DOL_URL_ROOT.'/projet/tasks/document.php?id='.$object->id.(GETPOST('withproject')?'&withproject=1':'');; + $head[$h][0] = DOL_URL_ROOT.'/projet/tasks/document.php?id='.$object->id.(GETPOST('withproject')?'&withproject=1':''); $filesdir = $conf->projet->dir_output . "/" . dol_sanitizeFileName($object->project->ref) . '/' .dol_sanitizeFileName($object->ref); include_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; $listoffiles=dol_dir_list($filesdir,'files',1,'','thumbs'); diff --git a/htdocs/core/lib/tax.lib.php b/htdocs/core/lib/tax.lib.php index 011f3d26de088..de705111b9d47 100644 --- a/htdocs/core/lib/tax.lib.php +++ b/htdocs/core/lib/tax.lib.php @@ -494,7 +494,7 @@ function vat_by_date($db, $y, $q, $date_start, $date_end, $modetax, $direction, $sql.= " AND f.fk_statut in (1,2)"; // Paid (partially or completely) if (! empty($conf->global->FACTURE_DEPOSITS_ARE_JUST_PAYMENTS)) $sql.= " AND f.type IN (0,1,2)"; else $sql.= " AND f.type IN (0,1,2,3)"; - $sql.= " AND f.rowid = d.".$fk_facture;; + $sql.= " AND f.rowid = d.".$fk_facture; $sql.= " AND pf.".$fk_facture2." = f.rowid"; $sql.= " AND pa.rowid = pf.".$fk_payment; if ($y && $m) diff --git a/htdocs/core/modules/import/import_csv.modules.php b/htdocs/core/modules/import/import_csv.modules.php index cd3a35e406080..989418794bcd6 100644 --- a/htdocs/core/modules/import/import_csv.modules.php +++ b/htdocs/core/modules/import/import_csv.modules.php @@ -376,7 +376,7 @@ function import_insert($arrayrecord,$array_match_file_to_database,$objimport,$ma if ($obj) $tablewithentity_cache[$tablename]=1; // table contains entity field else $tablewithentity_cache[$tablename]=0; // table does not contains entity field } - else dol_print_error($this->db);; + else dol_print_error($this->db); } else { diff --git a/htdocs/core/modules/project/task/doc/doc_generic_task_odt.modules.php b/htdocs/core/modules/project/task/doc/doc_generic_task_odt.modules.php index c074cba31e585..18f0c2fed8862 100644 --- a/htdocs/core/modules/project/task/doc/doc_generic_task_odt.modules.php +++ b/htdocs/core/modules/project/task/doc/doc_generic_task_odt.modules.php @@ -416,7 +416,7 @@ function write_file($object,$outputlangs,$srctemplatepath) $project= new Project($this->db); $project->fetch($object->fk_project); - $dir = $conf->projet->dir_output. "/" . $project->ref. "/";; + $dir = $conf->projet->dir_output. "/" . $project->ref. "/"; $objectref = dol_sanitizeFileName($object->ref); if (! preg_match('/specimen/i',$objectref)) $dir.= "/" . $objectref; $file = $dir . "/" . $objectref . ".odt"; diff --git a/htdocs/livraison/card.php b/htdocs/livraison/card.php index 1a89a377fef29..cf30a7dfcac05 100644 --- a/htdocs/livraison/card.php +++ b/htdocs/livraison/card.php @@ -383,7 +383,7 @@ */ print '
'; $quantite_commandee = $line->qty; diff --git a/htdocs/opensurvey/card.php b/htdocs/opensurvey/card.php index 70e1b49ad484e..7096c3947b20c 100644 --- a/htdocs/opensurvey/card.php +++ b/htdocs/opensurvey/card.php @@ -367,7 +367,7 @@ } else { - print $langs->trans("NoCommentYet").'
';; + print $langs->trans("NoCommentYet").'
'; } print '
'; diff --git a/htdocs/product/composition/card.php b/htdocs/product/composition/card.php index ec616b2f22297..89760dc66bab0 100644 --- a/htdocs/product/composition/card.php +++ b/htdocs/product/composition/card.php @@ -252,7 +252,7 @@ $productstatic->type=$value["fk_product_type"]; $productstatic->ref=$value['label']; print '
'; - print '';; + print ''; print ''; } print '
'.$langs->trans("By").''.$langs->trans("Note").''.$langs->trans("TimeSpent").''.$langs->trans("Value").''; if ($_GET['action'] == 'editline' && $_GET['lineid'] == $task_time->rowid) { - print $form->select_date($db->jdate($date2?$date2:$date1),'timeline',1,1,2,"timespent_date",1,0,1); + print $form->select_date(($date2?$date2:$date1),'timeline',1,1,2,"timespent_date",1,0,1); } else { - print dol_print_date($date2?$date2:$date1,($task_time->task_date_withhour?'dayhour':'day')); + print dol_print_date(($date2?$date2:$date1),($task_time->task_date_withhour?'dayhour':'day')); } print ''; +print ''; print ''; print '
 
 '; - print ''; - print '
 '; + print ''; + print '
'.$langs->trans('MarginTypeDesc'); -print ' ('.$langs->trans("PMPValueShort").')'; print '
'; - print $form->select_country($search_country,'search_country'); + print $form->select_country($search_country,'search_country','',0,'maxwidth100'); print ''; diff --git a/htdocs/comm/prospect/list.php b/htdocs/comm/prospect/list.php index e4d10e3396c4e..670d170de9787 100644 --- a/htdocs/comm/prospect/list.php +++ b/htdocs/comm/prospect/list.php @@ -385,7 +385,7 @@ print_liste_field_titre($langs->trans("Company"),$_SERVER["PHP_SELF"],"s.nom","",$param,'',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Zip"),$_SERVER["PHP_SELF"],"s.zip","",$param,"",$sortfield,$sortorder); print_liste_field_titre($langs->trans("Town"),$_SERVER["PHP_SELF"],"s.town","",$param,"",$sortfield,$sortorder); - print_liste_field_titre($langs->trans("State"),$_SERVER["PHP_SELF"],"s.fk_departement","",$param,'align="center"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("StateShort"),$_SERVER["PHP_SELF"],"s.fk_departement","",$param,'align="center"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Country"),$_SERVER["PHP_SELF"],"country.code_iso","",$param,'align="center"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("ThirdPartyType"),$_SERVER["PHP_SELF"],"typent.code","",$param,'align="center"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("DateCreation"),$_SERVER["PHP_SELF"],"s.datec","",$param,'align="center"',$sortfield,$sortorder); @@ -427,13 +427,13 @@ print ''; print ''; - print $form->select_country($search_country,'search_country'); + 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 ''; + print ''; print ''; - print $form->select_country($search_country,'search_country'); + print $form->select_country($search_country,'search_country','',0,'maxwidth100'); print ''; diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index e06553afd890d..508a4dceee7ae 100755 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -802,7 +802,7 @@ Permission59003=Read every user margin DictionaryCompanyType=Thirdparties type DictionaryCompanyJuridicalType=Juridical kinds of thirdparties DictionaryProspectLevel=Prospect potential level -DictionaryCanton=State/Cantons +DictionaryCanton=State/Province DictionaryRegion=Regions DictionaryCountry=Countries DictionaryCurrency=Currencies diff --git a/htdocs/langs/en_US/companies.lang b/htdocs/langs/en_US/companies.lang index 3bd16069036d7..a73ed322cbaa8 100644 --- a/htdocs/langs/en_US/companies.lang +++ b/htdocs/langs/en_US/companies.lang @@ -64,6 +64,7 @@ UserTitle=Title Surname=Surname/Pseudo Address=Address State=State/Province +StateShort=State Region=Region Country=Country CountryCode=Country code diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index 45881d20d3670..a5792642a64f2 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -195,7 +195,7 @@ /* - * Mode Liste + * Mode List */ /* REM: Regle sur droits "Voir tous les clients" @@ -376,7 +376,7 @@ print ''; print ''; if (! empty($search_nom_only) && empty($search_nom)) $search_nom=$search_nom_only; - print ''; + print ''; print ''; - print ''; + print ''; print ''; - print $form->select_country($search_country,'search_country'); + print $form->select_country($search_country,'search_country','',0,'maxwidth100'); print ''; From 4b103ba8ce6c2da955ab8ecb17258b5ba0f52b40 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 7 Oct 2015 07:57:09 +0200 Subject: [PATCH 038/297] Work on a better way to manage modules. All one page. Introduce a way to choose order of modules family. We should also be able to introduce filters. --- htdocs/admin/modules.php | 91 +++++++------ htdocs/core/modules/DolibarrModules.class.php | 34 ++--- htdocs/core/modules/modCashDesk.class.php | 2 +- htdocs/core/modules/modLabel.class.php | 2 +- htdocs/core/modules/modUser.class.php | 2 +- ...ass.php => modWebServicesClient.class.php} | 6 +- htdocs/core/modules/modWebsite.class.php | 124 ++++++++++++++++++ htdocs/cron/list.php | 4 +- htdocs/install/mysql/data/llx_const.sql | 2 +- htdocs/langs/en_US/admin.lang | 15 ++- 10 files changed, 210 insertions(+), 72 deletions(-) rename htdocs/core/modules/{modSyncSupplierWebServices.class.php => modWebServicesClient.class.php} (94%) create mode 100644 htdocs/core/modules/modWebsite.class.php diff --git a/htdocs/admin/modules.php b/htdocs/admin/modules.php index cf974990f01db..6530e41c3c1df 100644 --- a/htdocs/admin/modules.php +++ b/htdocs/admin/modules.php @@ -43,6 +43,21 @@ $specialtostring=array(0=>'common', 1=>'interfaces', 2=>'other', 3=>'functional', 4=>'marketplace'); +$familyinfo=array( + 'hr'=>array('position'=>'001', 'label'=>$langs->trans("ModuleFamilyHr")), + 'crm'=>array('position'=>'006', 'label'=>$langs->trans("ModuleFamilyCrm")), + 'financial'=>array('position'=>'009', 'label'=>$langs->trans("ModuleFamilyFinancial")), + 'products'=>array('position'=>'012', 'label'=>$langs->trans("ModuleFamilyProducts")), + 'projects'=>array('position'=>'015', 'label'=>$langs->trans("ModuleFamilyProjects")), + 'ecm'=>array('position'=>'018', 'label'=>$langs->trans("ModuleFamilyECM")), + 'technic'=>array('position'=>'021', 'label'=>$langs->trans("ModuleFamilyTechnic")), + 'portal'=>array('position'=>'040', 'label'=>$langs->trans("ModuleFamilyPortal")), + 'interface'=>array('position'=>'050', 'label'=>$langs->trans("ModuleFamilyInterface")), + 'base'=>array('position'=>'060', 'label'=>$langs->trans("ModuleFamilyBase")), + 'other'=>array('position'=>'100', 'label'=>$langs->trans("ModuleFamilyOther")), +); + + /* * Actions @@ -124,22 +139,20 @@ $objMod = new $modName($db); $modNameLoaded[$modName]=$dir; - if ($objMod->numero > 0) - { - $j = $objMod->numero; - } - else + if (! $objMod->numero > 0) { - $j = 1000 + $i; + dol_syslog('a module descriptor must have a numero property', LOG_ERR); } - + $j = $objMod->numero; + $modulequalified=1; // We discard modules according to features level (PS: if module is activated we always show it) $const_name = 'MAIN_MODULE_'.strtoupper(preg_replace('/^mod/i','',get_class($objMod))); if ($objMod->version == 'development' && (empty($conf->global->$const_name) && ($conf->global->MAIN_FEATURES_LEVEL < 2))) $modulequalified=0; if ($objMod->version == 'experimental' && (empty($conf->global->$const_name) && ($conf->global->MAIN_FEATURES_LEVEL < 1))) $modulequalified=0; - // We discard modules according to property disabled + if (preg_match('/deprecated/', $objMod->version) && (empty($conf->global->$const_name) && ($conf->global->MAIN_FEATURES_LEVEL >= 0))) $modulequalified=0; + // We discard modules according to property disabled if (! empty($objMod->hidden)) $modulequalified=false; // Define array $categ with categ with at least one qualified module @@ -147,13 +160,19 @@ { $modules[$i] = $objMod; $filename[$i]= $modName; - $orders[$i] = $objMod->family."_".$j; // Sort by family, then by module number + + $special = $objMod->special; + $familykey = $objMod->family; + + if ($special == 1) $familykey='interface'; + + $orders[$i] = $familyinfo[$familykey]['position']."_".$familykey."_".$j; // Sort by family, then by module number $dirmod[$i] = $dir; // Set categ[$i] - $special = isset($specialtostring[$objMod->special])?$specialtostring[$objMod->special]:'unknown'; - if ($objMod->version == 'development' || $objMod->version == 'experimental') $special='expdev'; - if (isset($categ[$special])) $categ[$special]++; // Array of all different modules categories - else $categ[$special]=1; + $specialstring = isset($specialtostring[$special])?$specialtostring[$special]:'unknown'; + if ($objMod->version == 'development' || $objMod->version == 'experimental') $specialstring='expdev'; + if (isset($categ[$specialstring])) $categ[$specialstring]++; // Array of all different modules categories + else $categ[$specialstring]=1; $j++; $i++; } @@ -197,9 +216,9 @@ // Start to show page if (empty($mode)) $mode='common'; if ($mode==='common') print $langs->trans("ModulesDesc")."
\n"; -if ($mode==='other') print $langs->trans("ModulesSpecialDesc")."
\n"; -if ($mode==='interfaces') print $langs->trans("ModulesInterfaceDesc")."
\n"; -if ($mode==='functional') print $langs->trans("ModulesJobDesc")."
\n"; +//if ($mode==='other') print $langs->trans("ModulesSpecialDesc")."
\n"; +//if ($mode==='interfaces') print $langs->trans("ModulesInterfaceDesc")."
\n"; +//if ($mode==='functional') print $langs->trans("ModulesJobDesc")."
\n"; if ($mode==='marketplace') print $langs->trans("ModulesMarketPlaceDesc")."
\n"; if ($mode==='expdev') print $langs->trans("ModuleFamilyExperimental")."
\n"; @@ -213,11 +232,12 @@ if (! empty($categ[$categidx])) { $head[$h][0] = DOL_URL_ROOT."/admin/modules.php?mode=".$categidx; - $head[$h][1] = $langs->trans("ModulesCommon"); + $head[$h][1] = $langs->trans("AvailableModules"); $head[$h][2] = 'common'; $h++; } +/* $categidx='other'; // Other if (! empty($categ[$categidx])) { @@ -244,6 +264,7 @@ $head[$h][2] = 'functional'; $h++; } +*/ $categidx='expdev'; if (! empty($categ[$categidx])) @@ -287,28 +308,19 @@ $oldfamily=''; - $familylib=array( - 'base'=>$langs->trans("ModuleFamilyBase"), - 'crm'=>$langs->trans("ModuleFamilyCrm"), - 'products'=>$langs->trans("ModuleFamilyProducts"), - 'hr'=>$langs->trans("ModuleFamilyHr"), - 'projects'=>$langs->trans("ModuleFamilyProjects"), - 'financial'=>$langs->trans("ModuleFamilyFinancial"), - 'ecm'=>$langs->trans("ModuleFamilyECM"), - 'technic'=>$langs->trans("ModuleFamilyTechnic"), - 'other'=>$langs->trans("ModuleFamilyOther") - ); - foreach ($orders as $key => $value) { $tab=explode('_',$value); - $family=$tab[0]; $numero=$tab[1]; + $familypos=$tab[0]; $familykey=$tab[1]; $numero=$tab[2]; $modName = $filename[$key]; $objMod = $modules[$key]; + $special = $objMod->special; + //print $objMod->name." - ".$key." - ".$objMod->special.' - '.$objMod->version."
"; - if (($mode != (isset($specialtostring[$objMod->special])?$specialtostring[$objMod->special]:'unknown') && $mode != 'expdev') + //if (($mode != (isset($specialtostring[$special])?$specialtostring[$special]:'unknown') && $mode != 'expdev') + if (($special >= 4 && $mode != 'expdev') || ($mode == 'expdev' && $objMod->version != 'development' && $objMod->version != 'experimental')) continue; // Discard if not for current tab if (! $objMod->getName()) @@ -329,28 +341,27 @@ } // Print a separator if we change family - //print "
xx".$oldfamily."-".$family."-".$atleastoneforfamily."
xx".$oldfamily."-".$familykey."-".$atleastoneforfamily."
'; - $familytext=empty($familylib[$family])?$family:$familylib[$family]; + $familytext=empty($familyinfo[$familykey]['label'])?$familykey:$familyinfo[$familykey]['label']; print $familytext; print "'.$langs->trans("SetupShort").'
yy".$oldfamily."-".$family."-".$atleastoneforfamily."
yy".$oldfamily."-".$familykey."-".$atleastoneforfamily."
'; print $form->selectarray('status', array('0'=>$langs->trans("No"),'1'=>$langs->trans("Yes")), $status, 1); print ''; -print ' '; print ''; -print '  '; print ''; print '
'; + print ''; if ($user->rights->cron->delete) { print "id."&status=".$status."&action=delete\" title=\"".dol_escape_htmltag($langs->trans('CronDelete'))."\">".img_picto($langs->trans('CronDelete'),'delete')."  "; diff --git a/htdocs/install/mysql/data/llx_const.sql b/htdocs/install/mysql/data/llx_const.sql index 13604638f01b9..2c25765223e78 100644 --- a/htdocs/install/mysql/data/llx_const.sql +++ b/htdocs/install/mysql/data/llx_const.sql @@ -32,7 +32,7 @@ -- Visible in misc page insert into llx_const (name, value, type, note, visible, entity) values ('MAIN_NOT_INSTALLED','1','chaine','Setup is running',1,0); -insert into llx_const (name, value, type, note, visible, entity) values ('MAIN_FEATURES_LEVEL','0','chaine','Level of features to show (0=stable only, 1=stable+experimental, 2=stable+experimental+development',1,0); +insert into llx_const (name, value, type, note, visible, entity) values ('MAIN_FEATURES_LEVEL','0','chaine','Level of features to show: -1=stable+deprecated, 0=stable only (default), 1=stable+experimental, 2=stable+experimental+development',1,0); insert into llx_const (name, value, type, note, visible, entity) values ('MAILING_LIMIT_SENDBYWEB','25','chaine','Number of targets to defined packet size when sending mass email',1,0); -- Hidden and common to all entities diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 508a4dceee7ae..fec9f4876e119 100755 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -285,14 +285,16 @@ ModuleSetup=Module setup ModulesSetup=Modules setup ModuleFamilyBase=System ModuleFamilyCrm=Customer Relation Management (CRM) -ModuleFamilyProducts=Products Management -ModuleFamilyHr=Human Resource Management +ModuleFamilyProducts=Products Management (PM) +ModuleFamilyHr=Human Resource Management (HR) ModuleFamilyProjects=Projects/Collaborative work ModuleFamilyOther=Other ModuleFamilyTechnic=Multi-modules tools ModuleFamilyExperimental=Experimental modules ModuleFamilyFinancial=Financial Modules (Accounting/Treasury) ModuleFamilyECM=Electronic Content Management (ECM) +ModuleFamilyPortal=Web sites and other frontal application +ModuleFamilyInterface=Interfaces with external systems MenuHandlers=Menu handlers MenuAdmin=Menu editor DoNotUseInProduction=Do not use in production @@ -524,12 +526,12 @@ Module2400Name=Agenda Module2400Desc=Events/tasks and agenda management Module2500Name=Electronic Content Management Module2500Desc=Save and share documents -Module2600Name=API services (Web services SOAP) +Module2600Name=API/Web services (SOAP server) Module2600Desc=Enable the Dolibarr SOAP server providing API services -Module2610Name=API services (Web services REST) +Module2610Name=API/Web services (REST server) Module2610Desc=Enable the Dolibarr REST server providing API services -Module2650Name=WebServices (client) -Module2650Desc=Enable the Dolibarr web services client (Can be used to push data/requests to external servers. Supplier orders supported only for the moment) +Module2660Name=Call WebServices (SOAP client) +Module2660Desc=Enable the Dolibarr web services client (Can be used to push data/requests to external servers. Supplier orders supported only for the moment) Module2700Name=Gravatar Module2700Desc=Use online Gravatar service (www.gravatar.com) to show photo of users/members (found with their emails). Need an internet access Module2800Desc=FTP Client @@ -1001,6 +1003,7 @@ SystemAreaForAdminOnly=This area is available for administrator users only. None CompanyFundationDesc=Edit on this page all known information of the company or foundation you need to manage (For this, click on "Modify" button at bottom of page) DisplayDesc=You can choose each parameter related to the Dolibarr look and feel here AvailableModules=Available modules +DeprecatedModules=Deprecated modules ToActivateModule=To activate modules, go on setup Area (Home->Setup->Modules). SessionTimeOut=Time out for session SessionExplanation=This number guarantee that session will never expire before this delay, if the session cleaner is done by Internal PHP session cleaner (and nothing else). Internal PHP session cleaner does not guaranty that session will expire just after this delay. It will expire, after this delay, and when the session cleaner is ran, so every %s/%s access, but only during access made by other sessions.
Note: on some servers with an external session cleaning mechanism (cron under debian, ubuntu ...), the sessions can be destroyed after a period defined by the default session.gc_maxlifetime, no matter what the value entered here. From 9e12de7d833d229dfe9b3f86178be82cecb230a2 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 7 Oct 2015 08:34:09 +0200 Subject: [PATCH 039/297] FIX Missing exclude to avoid duplicate menu css declaration --- htdocs/theme/eldy/style.css.php | 2 +- htdocs/theme/md/style.css.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index d00731dce94f3..b6987ed42cc15 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -861,7 +861,7 @@ $mainmenuusedarray=array_unique(explode(',',$mainmenuused)); $generic=1; -$divalreadydefined=array('home','companies','products','commercial','accountancy','project','tools','members','agenda','holiday','bookmark','cashdesk','ecm','geoipmaxmind','gravatar','clicktodial','paypal','webservices'); +$divalreadydefined=array('home','companies','products','commercial','externalsite','accountancy','project','tools','members','agenda','holiday','bookmark','cashdesk','ecm','geoipmaxmind','gravatar','clicktodial','paypal','webservices'); foreach($mainmenuusedarray as $val) { if (empty($val) || in_array($val,$divalreadydefined)) continue; diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 37265b852f4f7..0db79b5470aab 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -898,7 +898,7 @@ $mainmenuusedarray=array_unique(explode(',',$mainmenuused)); $generic=1; -$divalreadydefined=array('home','companies','products','commercial','accountancy','project','tools','members','agenda','holiday','bookmark','cashdesk','ecm','geoipmaxmind','gravatar','clicktodial','paypal','webservices'); +$divalreadydefined=array('home','companies','products','commercial','externalsite','accountancy','project','tools','members','agenda','holiday','bookmark','cashdesk','ecm','geoipmaxmind','gravatar','clicktodial','paypal','webservices'); foreach($mainmenuusedarray as $val) { if (empty($val) || in_array($val,$divalreadydefined)) continue; From 8db83a51b234a539a8fe116590970db9d0101809 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 7 Oct 2015 14:30:54 +0200 Subject: [PATCH 040/297] Missing translation --- htdocs/langs/en_US/admin.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index fec9f4876e119..0f267bd0520e4 100755 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -1692,3 +1692,4 @@ MailToSendSupplierRequestForQuotation=To send quotation request to supplier MailToSendSupplierOrder=To send supplier order MailToSendSupplierInvoice=To send supplier invoice MailToThirdparty=To send email from thirdparty page +ByDefaultInList=Show by default on list view \ No newline at end of file From ea949437ab09bd29d0d4c9acb765cfaef3931beb Mon Sep 17 00:00:00 2001 From: tysauron Date: Wed, 7 Oct 2015 17:17:32 +0200 Subject: [PATCH 041/297] For not error Undefined property: stdClass::$id --- htdocs/comm/action/class/actioncomm.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index d9f2d7b6541ed..10fcc6c0173ff 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -218,7 +218,7 @@ function add($user,$notrigger=0) $this->userassigned[$tmpid]=array('id'=>$tmpid); } - if (is_object($this->contact) && $this->contact->id > 0 && ! ($this->contactid > 0)) $this->contactid = $this->contact->id; // For backward compatibility. Using this->contact->xx is deprecated + if (is_object($this->contact) && isset($this->contact->id) && $this->contact->id > 0 && ! ($this->contactid > 0)) $this->contactid = $this->contact->id; // For backward compatibility. Using this->contact->xx is deprecated $userownerid=$this->userownerid; From e1f946578b2dcb96a978991bdeacc91623638264 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Wed, 7 Oct 2015 21:06:55 +0200 Subject: [PATCH 042/297] Fix presentation --- htdocs/compta/stats/cabyuser.php | 2 +- htdocs/compta/stats/casoc.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/compta/stats/cabyuser.php b/htdocs/compta/stats/cabyuser.php index 385ac1f140c94..cb8151cf33c33 100644 --- a/htdocs/compta/stats/cabyuser.php +++ b/htdocs/compta/stats/cabyuser.php @@ -280,7 +280,7 @@ $sortorder ); } else { - print '
'.$objp->date.''.dol_print_date($db->jdate($objp->date), 'day').''; if ($objp->projet_id > 0) { From 0e343ae3b2920ccd01353f2216d4d81ac0d66470 Mon Sep 17 00:00:00 2001 From: philippe grand Date: Thu, 8 Oct 2015 09:34:02 +0200 Subject: [PATCH 046/297] syntax error --- htdocs/adherents/admin/public.php | 4 ++-- htdocs/adherents/card.php | 2 +- htdocs/admin/dict.php | 2 +- htdocs/cashdesk/admin/cashdesk.php | 2 +- htdocs/categories/class/categorie.class.php | 2 +- htdocs/compta/bank/releve.php | 2 +- htdocs/compta/stats/index.php | 2 +- htdocs/core/lib/memory.lib.php | 2 +- htdocs/core/lib/project.lib.php | 10 +++++----- htdocs/core/lib/tax.lib.php | 2 +- htdocs/core/modules/import/import_csv.modules.php | 2 +- .../project/task/doc/doc_generic_task_odt.modules.php | 2 +- htdocs/livraison/card.php | 2 +- htdocs/opensurvey/card.php | 2 +- htdocs/product/composition/card.php | 4 ++-- htdocs/product/stock/valo.php | 2 +- htdocs/projet/note.php | 2 +- htdocs/societe/canvas/company/tpl/card_view.tpl.php | 2 +- htdocs/societe/canvas/individual/tpl/card_view.tpl.php | 2 +- htdocs/webservices/demo_wsclient_actioncomm.php-NORUN | 4 ++-- htdocs/webservices/demo_wsclient_category.php-NORUN | 4 ++-- htdocs/webservices/demo_wsclient_invoice.php-NORUN | 4 ++-- htdocs/webservices/demo_wsclient_other.php-NORUN | 4 ++-- .../demo_wsclient_productorservice.php-NORUN | 4 ++-- htdocs/webservices/demo_wsclient_thirdparty.php-NORUN | 4 ++-- .../email_expire_services_to_representatives.php | 2 +- .../email_unpaid_invoices_to_representatives.php | 2 +- 27 files changed, 39 insertions(+), 39 deletions(-) diff --git a/htdocs/adherents/admin/public.php b/htdocs/adherents/admin/public.php index 088f96b00c1c2..e8381584355c7 100644 --- a/htdocs/adherents/admin/public.php +++ b/htdocs/adherents/admin/public.php @@ -164,7 +164,7 @@ function initfields() print '
'; print $langs->trans("DefaultAmount"); print ''; -print '';; +print ''; print "
'; print $langs->trans("MEMBER_PAYONLINE_SENDEMAIL"); print ''; - print '';; + print ''; print "
'; print $langs->trans("CashdeskShowServices"); - print '';; + print ''; print $form->selectyesno("CASHDESK_SERVICES",$conf->global->CASHDESK_SERVICES,1); print "
 '; $quantite_livree = $commande->livraisons[$line->id]; - print $quantite_livree;; + print $quantite_livree; print '
'.$productstatic->getNomUrl(1,'composition').''.$productstatic->getNomUrl(1,'composition').'
'; @@ -401,7 +401,7 @@ $productstatic->type=$value["fk_product_type"]; $productstatic->ref=$value['label']; print ''; - print ''.$productstatic->getNomUrl(1,'composition').'';; + print ''.$productstatic->getNomUrl(1,'composition').''; print ''; } print ''; diff --git a/htdocs/product/stock/valo.php b/htdocs/product/stock/valo.php index 7c73da3794c4b..59b4f895b7312 100644 --- a/htdocs/product/stock/valo.php +++ b/htdocs/product/stock/valo.php @@ -31,7 +31,7 @@ // Security check $result=restrictedArea($user,'stock'); -$sref=GETPOST("sref");; +$sref=GETPOST("sref"); $snom=GETPOST("snom"); $sall=GETPOST("sall"); diff --git a/htdocs/projet/note.php b/htdocs/projet/note.php index b581ca01be9d2..0091ffcc23b0f 100644 --- a/htdocs/projet/note.php +++ b/htdocs/projet/note.php @@ -131,7 +131,7 @@ $colwidth=30; include DOL_DOCUMENT_ROOT.'/core/tpl/notes.tpl.php'; - dol_fiche_end();; + dol_fiche_end(); } llxFooter(); diff --git a/htdocs/societe/canvas/company/tpl/card_view.tpl.php b/htdocs/societe/canvas/company/tpl/card_view.tpl.php index 4ea5afcbdcb0b..26c1e77742f97 100644 --- a/htdocs/societe/canvas/company/tpl/card_view.tpl.php +++ b/htdocs/societe/canvas/company/tpl/card_view.tpl.php @@ -107,7 +107,7 @@ trans('EMail'); ?> - control->tpl['email'];; ?> + control->tpl['email']; ?> trans('Web'); ?> control->tpl['url']; ?> diff --git a/htdocs/societe/canvas/individual/tpl/card_view.tpl.php b/htdocs/societe/canvas/individual/tpl/card_view.tpl.php index d2fc7e5551b69..bc83f2955da12 100644 --- a/htdocs/societe/canvas/individual/tpl/card_view.tpl.php +++ b/htdocs/societe/canvas/individual/tpl/card_view.tpl.php @@ -106,7 +106,7 @@ trans('EMail'); ?> - control->tpl['email'];; ?> + control->tpl['email']; ?> trans('Web'); ?> control->tpl['url']; ?> diff --git a/htdocs/webservices/demo_wsclient_actioncomm.php-NORUN b/htdocs/webservices/demo_wsclient_actioncomm.php-NORUN index 1e14c07a5bf98..d3044fc9bd837 100755 --- a/htdocs/webservices/demo_wsclient_actioncomm.php-NORUN +++ b/htdocs/webservices/demo_wsclient_actioncomm.php-NORUN @@ -160,6 +160,6 @@ echo ''; echo '

SOAP Message

'; echo '
' . htmlspecialchars($soapclient->response, ENT_QUOTES) . '
'; -echo ''."\n";; -echo ''."\n";; +echo ''."\n"; +echo ''."\n"; ?> diff --git a/htdocs/webservices/demo_wsclient_category.php-NORUN b/htdocs/webservices/demo_wsclient_category.php-NORUN index 0793fd1806cd7..e0d78681eac01 100755 --- a/htdocs/webservices/demo_wsclient_category.php-NORUN +++ b/htdocs/webservices/demo_wsclient_category.php-NORUN @@ -92,6 +92,6 @@ echo '

SOAP Message

'; echo '
' . htmlspecialchars($soapclient->response, ENT_QUOTES) . '
'; -echo ''."\n";; -echo ''."\n";; +echo ''."\n"; +echo ''."\n"; ?> diff --git a/htdocs/webservices/demo_wsclient_invoice.php-NORUN b/htdocs/webservices/demo_wsclient_invoice.php-NORUN index ad6612692fc6d..8708e89e13f39 100755 --- a/htdocs/webservices/demo_wsclient_invoice.php-NORUN +++ b/htdocs/webservices/demo_wsclient_invoice.php-NORUN @@ -136,6 +136,6 @@ echo ''; echo '

SOAP Message

'; echo '
' . htmlspecialchars($soapclient2->response, ENT_QUOTES) . '
'; -echo ''."\n";; -echo ''."\n";; +echo ''."\n"; +echo ''."\n"; ?> diff --git a/htdocs/webservices/demo_wsclient_other.php-NORUN b/htdocs/webservices/demo_wsclient_other.php-NORUN index 60c801e10fc32..0de1ac6b71a54 100755 --- a/htdocs/webservices/demo_wsclient_other.php-NORUN +++ b/htdocs/webservices/demo_wsclient_other.php-NORUN @@ -99,6 +99,6 @@ echo ''; echo '

SOAP Message

'; echo '
' . htmlspecialchars($soapclient->response, ENT_QUOTES) . '
'; -echo ''."\n";; -echo ''."\n";; +echo ''."\n"; +echo ''."\n"; ?> diff --git a/htdocs/webservices/demo_wsclient_productorservice.php-NORUN b/htdocs/webservices/demo_wsclient_productorservice.php-NORUN index e27db313bfc7e..e684a39b1e73b 100755 --- a/htdocs/webservices/demo_wsclient_productorservice.php-NORUN +++ b/htdocs/webservices/demo_wsclient_productorservice.php-NORUN @@ -177,6 +177,6 @@ echo ''; echo '

SOAP Message

'; echo '
' . htmlspecialchars($soapclient3->response, ENT_QUOTES) . '
'; -echo ''."\n";; -echo ''."\n";; +echo ''."\n"; +echo ''."\n"; ?> diff --git a/htdocs/webservices/demo_wsclient_thirdparty.php-NORUN b/htdocs/webservices/demo_wsclient_thirdparty.php-NORUN index 3260549b7123f..45f3d89939fdf 100755 --- a/htdocs/webservices/demo_wsclient_thirdparty.php-NORUN +++ b/htdocs/webservices/demo_wsclient_thirdparty.php-NORUN @@ -223,6 +223,6 @@ echo ''; echo '

SOAP Message

'; echo '
' . htmlspecialchars($soapclient->response, ENT_QUOTES) . '
'; -echo ''."\n";; -echo ''."\n";; +echo ''."\n"; +echo ''."\n"; ?> diff --git a/scripts/contracts/email_expire_services_to_representatives.php b/scripts/contracts/email_expire_services_to_representatives.php index ae51af3800948..44ccb4c7e97d0 100755 --- a/scripts/contracts/email_expire_services_to_representatives.php +++ b/scripts/contracts/email_expire_services_to_representatives.php @@ -116,7 +116,7 @@ $oldemail = $obj->email; $olduid = $obj->uid; $oldlang = $obj->lang; - $oldsalerepresentative=dolGetFirstLastname($obj->firstname, $obj->lastname);; + $oldsalerepresentative=dolGetFirstLastname($obj->firstname, $obj->lastname); $message = ''; $total = 0; $foundtoprocess = 0; diff --git a/scripts/invoices/email_unpaid_invoices_to_representatives.php b/scripts/invoices/email_unpaid_invoices_to_representatives.php index 2960e2eb68594..2870766ff211b 100755 --- a/scripts/invoices/email_unpaid_invoices_to_representatives.php +++ b/scripts/invoices/email_unpaid_invoices_to_representatives.php @@ -120,7 +120,7 @@ $oldemail = $obj->email; $olduid = $obj->uid; $oldlang = $obj->lang; - $oldsalerepresentative=dolGetFirstLastname($obj->firstname, $obj->lastname);; + $oldsalerepresentative=dolGetFirstLastname($obj->firstname, $obj->lastname); $message = ''; $total = 0; $foundtoprocess = 0; From 0841feda4709c8404070956d8a779795205bb520 Mon Sep 17 00:00:00 2001 From: philippe grand Date: Thu, 8 Oct 2015 09:40:00 +0200 Subject: [PATCH 047/297] syntax error --- htdocs/adherents/admin/public.php | 2 +- htdocs/contrat/card.php | 2 +- htdocs/public/api/explorer/lib/handlebars-1.0.rc.1.js | 4 ++-- .../api/explorer/lib/handlebars.runtime-1.0.0.beta.6.js | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/htdocs/adherents/admin/public.php b/htdocs/adherents/admin/public.php index 187f71e93a83b..299f315fc7ab1 100644 --- a/htdocs/adherents/admin/public.php +++ b/htdocs/adherents/admin/public.php @@ -200,7 +200,7 @@ function initfields() print ''; print $langs->trans("MEMBER_PAYONLINE_SENDEMAIL"); print ''; - print '';; + print ''; print "\n"; } diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index 1d2e3355b2466..ef7ff8e552260 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -793,7 +793,7 @@ setEventMessage($object->errors, 'errors'); } - $result = $object->setValueFrom('ref',GETPOST('ref','alpha'));; + $result = $object->setValueFrom('ref',GETPOST('ref','alpha')); if ($result < 0) { setEventMessage($object->errors, 'errors'); $action = 'editref'; diff --git a/htdocs/public/api/explorer/lib/handlebars-1.0.rc.1.js b/htdocs/public/api/explorer/lib/handlebars-1.0.rc.1.js index 05346370a2070..81524621ae508 100644 --- a/htdocs/public/api/explorer/lib/handlebars-1.0.rc.1.js +++ b/htdocs/public/api/explorer/lib/handlebars-1.0.rc.1.js @@ -726,7 +726,7 @@ Handlebars.log = function(level, str) { Handlebars.logger.log(level, str); }; this.comment = comment; }; -})();; +})(); // lib/handlebars/utils.js Handlebars.Exception = function(message) { var tmp = Error.prototype.constructor.apply(this, arguments); @@ -791,7 +791,7 @@ Handlebars.SafeString.prototype.toString = function() { } } }; -})();; +})(); // lib/handlebars/compiler/compiler.js /*jshint eqnull:true*/ diff --git a/htdocs/public/api/explorer/lib/handlebars.runtime-1.0.0.beta.6.js b/htdocs/public/api/explorer/lib/handlebars.runtime-1.0.0.beta.6.js index 987a5cd4d665e..d73e043af18ef 100644 --- a/htdocs/public/api/explorer/lib/handlebars.runtime-1.0.0.beta.6.js +++ b/htdocs/public/api/explorer/lib/handlebars.runtime-1.0.0.beta.6.js @@ -156,7 +156,7 @@ Handlebars.SafeString.prototype.toString = function() { } } }; -})();; +})(); // lib/handlebars/runtime.js Handlebars.VM = { template: function(templateSpec) { From 1f2a86078a22767782cc0fa41b3f09a2b21b1776 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Thu, 8 Oct 2015 11:03:08 +0200 Subject: [PATCH 048/297] FIX : Always use type send in parameters in showCategories method --- htdocs/core/class/html.form.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index a4716ba40cc51..87d177e5d7d79 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -4696,7 +4696,7 @@ function showCategories($id, $type, $rendermode=0) if ($rendermode == 0) { - $cate_arbo = $this->select_all_categories(Categorie::TYPE_PRODUCT, '', 'parent', 64, 0, 1); + $cate_arbo = $this->select_all_categories($type, '', 'parent', 64, 0, 1); foreach($categories as $c) { $arrayselected[] = $c->id; } From 0d799402d0b6b2becbcd997d05c9b670ffa20f01 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 8 Oct 2015 23:50:17 +0200 Subject: [PATCH 049/297] Work on image for "no photo" with better resolution --- dev/cliparts/commons.svg | 2049 ++++++++++++++++++++++++ htdocs/admin/company.php | 4 +- htdocs/core/class/html.form.class.php | 2 +- htdocs/core/lib/usergroups.lib.php | 2 +- htdocs/public/theme/common/nophoto.jpg | Bin 1307 -> 0 bytes htdocs/public/theme/common/nophoto.png | Bin 0 -> 75936 bytes htdocs/viewimage.php | 2 +- 7 files changed, 2054 insertions(+), 5 deletions(-) create mode 100644 dev/cliparts/commons.svg delete mode 100644 htdocs/public/theme/common/nophoto.jpg create mode 100644 htdocs/public/theme/common/nophoto.png diff --git a/dev/cliparts/commons.svg b/dev/cliparts/commons.svg new file mode 100644 index 0000000000000..4b8820d06f58c --- /dev/null +++ b/dev/cliparts/commons.svg @@ -0,0 +1,2049 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/htdocs/admin/company.php b/htdocs/admin/company.php index eb78ead387b8c..b9660c8a04d56 100644 --- a/htdocs/admin/company.php +++ b/htdocs/admin/company.php @@ -380,7 +380,7 @@ print ''; } } else { - print ''; + print ''; } print ''; print ''; @@ -769,7 +769,7 @@ } else { - print ''; + print ''; } print ''; diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 8d69e58bad3d0..5591847ddc170 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -5197,7 +5197,7 @@ static function showphoto($modulepart, $object, $width=100, $height=0, $caneditf } else { - $nophoto='/public/theme/common/nophoto.jpg'; + $nophoto='/public/theme/common/nophoto.png'; if (in_array($modulepart,array('userphoto','contact'))) // For module thar are "physical" users { $nophoto='/public/theme/common/user_anonymous.png'; diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php index cb62b63377ff8..10b97265a9311 100644 --- a/htdocs/core/lib/usergroups.lib.php +++ b/htdocs/core/lib/usergroups.lib.php @@ -355,7 +355,7 @@ function show_theme($fuser,$edit=0,$foruserprofile=false) print '
'; $file=$dirtheme."/".$subdir."/thumb.png"; $url=$urltheme."/".$subdir."/thumb.png"; - if (! file_exists($file)) $url=$urltheme."/common/nophoto.jpg"; + if (! file_exists($file)) $url=DOL_URL_ROOT.'/public/theme/common/nophoto.png'; print 'id:'').'" style="font-weight: normal;" alt="'.$langs->trans("Preview").'">'; if ($subdir == $conf->global->MAIN_THEME) $title=$langs->trans("ThemeCurrentlyActive"); else $title=$langs->trans("ShowPreview"); diff --git a/htdocs/public/theme/common/nophoto.jpg b/htdocs/public/theme/common/nophoto.jpg deleted file mode 100644 index 14eeb1cf01fcd037f612061d53c9bf18d61be901..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1307 zcmex=NKJ3#L0SE}i!Mf);VHl()9 z-81=jsr=>ARac_6w9K{mXs`IFZqd@kiQ0n7k5ZDO9NgyCoIMqgDPi3AbMyBIw*kM01Q5R#s#X6J%DHbwbM58=vEMs+ zPi2+;u)MmxerD3vM@_*?{J#mL@m`(2pfxjVOM*f0F^k~ldosdb7QOr?FSi}&B5-t;Ecnj;7Pn$ z^#s&{qE_I{(dC=smcxS)n0Dbt15H&lbOc6gqk=)eM1h3|5y2?%bKZ&7`WFqO+_hG& z-uLW3L)pxZxye#lpq&d5J`G(BU=@z+9XUthP$;SB}pG9TE zskMu;c+Z@*n9aRL|xP?#a*M^_Q+NKk!+%MSOMg zck$Jo`K}7f5A+xMNAEvg5GFZIbHT17QYu_&ysA?(N*yoMZ*&n0)ch(#Fd%C=bKIfyk*E_{^FaptI`M5w;fK5>sl-?~2S+q>ZTng0wf={2UCKKaNmuAKX9 b>SalN)wsjWw;VO~()awGu-Iu|_Wzpz#j2J= diff --git a/htdocs/public/theme/common/nophoto.png b/htdocs/public/theme/common/nophoto.png new file mode 100644 index 0000000000000000000000000000000000000000..c3989b59135510003b18afc6081242646afdbc74 GIT binary patch literal 75936 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

kIj(P1~WfHB(&<V4)a0>X*t}n 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 Date: Thu, 8 Oct 2015 23:53:57 +0200 Subject: [PATCH 050/297] Smaller image --- dev/cliparts/commons.svg | 15 ++++++++++++--- htdocs/public/theme/common/nophoto.png | Bin 75936 -> 10127 bytes 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/dev/cliparts/commons.svg b/dev/cliparts/commons.svg index 4b8820d06f58c..1abca065694d8 100644 --- a/dev/cliparts/commons.svg +++ b/dev/cliparts/commons.svg @@ -1773,7 +1773,10 @@ + transform="matrix(0.99771798,0,0,1.0176646,-1.1510876,-0.81544515)" + inkscape:export-filename="/home/ldestailleur/git/dolibarr/htdocs/public/theme/common/nophoto.png" + inkscape:export-xdpi="76.774879" + inkscape:export-ydpi="76.774879"> + sodipodi:type="arc" + inkscape:export-filename="/home/ldestailleur/git/dolibarr/htdocs/public/theme/common/nophoto.png" + inkscape:export-xdpi="76.774879" + inkscape:export-ydpi="76.774879" /> + style="fill:none;stroke:#dbdbdb;stroke-width:5.06745768;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" + inkscape:export-filename="/home/ldestailleur/git/dolibarr/htdocs/public/theme/common/nophoto.png" + inkscape:export-xdpi="76.774879" + inkscape:export-ydpi="76.774879" /> diff --git a/htdocs/public/theme/common/nophoto.png b/htdocs/public/theme/common/nophoto.png index c3989b59135510003b18afc6081242646afdbc74..bce088ef784902b7f05b0a8fdcc9c141ab5a2341 100644 GIT binary patch literal 10127 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 literal 75936 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

kIj(P1~WfHB(&<V4)a0>X*t}n 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 Date: Fri, 9 Oct 2015 00:30:02 +0200 Subject: [PATCH 051/297] When there is no contact, no need to show filters --- htdocs/core/lib/company.lib.php | 67 ++++++++++++++++----------------- 1 file changed, 33 insertions(+), 34 deletions(-) diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php index 9a67065fe649e..ce5345854f0ae 100644 --- a/htdocs/core/lib/company.lib.php +++ b/htdocs/core/lib/company.lib.php @@ -632,40 +632,6 @@ function show_contacts($conf,$langs,$db,$object,$backtopage='') print "\n"; - print ''; - // Name - Position - print ''; - print ''; - print ''; - - // Address / Phone - print ''; - //print ''; - print ''; - - // Email - print ' '; - - // Status - print ''; - print $form->selectarray('search_status', array('-1'=>'','0'=>$contactstatic->LibStatut(0,1),'1'=>$contactstatic->LibStatut(1,1)),$search_status); - print ''; - - // Add to agenda - if (! empty($conf->agenda->enabled) && $user->rights->agenda->myactions->create) - { - $colspan++; - print ' '; - } - - // Edit - print ''; - print ''; - print ''; - - print ""; - - $sql = "SELECT p.rowid, p.lastname, p.firstname, p.fk_pays as country_id, p.civility, p.poste, p.phone as phone_pro, p.phone_mobile, p.phone_perso, p.fax, p.email, p.skype, p.statut "; $sql .= ", p.civility as civility_id, p.address, p.zip, p.town"; $sql .= " FROM ".MAIN_DB_PREFIX."socpeople as p"; @@ -683,6 +649,39 @@ function show_contacts($conf,$langs,$db,$object,$backtopage='') $var=true; if ($num) { + print ''; + // Name - Position + print ''; + print ''; + print ''; + + // Address / Phone + print ''; + //print ''; + print ''; + + // Email + print ' '; + + // Status + print ''; + print $form->selectarray('search_status', array('-1'=>'','0'=>$contactstatic->LibStatut(0,1),'1'=>$contactstatic->LibStatut(1,1)),$search_status); + print ''; + + // Add to agenda + if (! empty($conf->agenda->enabled) && $user->rights->agenda->myactions->create) + { + $colspan++; + print ' '; + } + + // Edit + print ''; + print ''; + print ''; + + print ""; + $i=0; while ($i < $num) From d9693ba2f2d96e14ec184324a2466b0d8eae5f7d Mon Sep 17 00:00:00 2001 From: aspangaro Date: Fri, 9 Oct 2015 06:16:43 +0200 Subject: [PATCH 052/297] New : Module HRM --- htdocs/core/modules/modHRM.class.php | 250 +++++++++++++++++++++++++++ 1 file changed, 250 insertions(+) create mode 100644 htdocs/core/modules/modHRM.class.php diff --git a/htdocs/core/modules/modHRM.class.php b/htdocs/core/modules/modHRM.class.php new file mode 100644 index 0000000000000..cfc85acff1635 --- /dev/null +++ b/htdocs/core/modules/modHRM.class.php @@ -0,0 +1,250 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/core/modules/modHRM.class.php + * \ingroup HRM + * \brief Description and activation file for module HRM + */ +include_once (DOL_DOCUMENT_ROOT . "/core/modules/DolibarrModules.class.php"); + +/** + * \class modHRM + * \brief Class to describe and activate the HRM module + */ +class modiHRM extends DolibarrModules +{ + /** + * Constructor. + * Define names, constants, directories, boxes, permissions + * + * @param DoliDB $db + */ + public function __construct($db) + { + global $langs, $conf; + + $this->db = $db; + + $this->numero = 4000; + $this->rights_class = 'hrm'; + + $this->family = "hr"; + // Module label (no space allowed), used if translation string 'ModuleXXXName' not found (where XXX is value of numeric property 'numero' of module) + $this->name = preg_replace ( '/^mod/i', '', get_class ( $this ) ); + $this->description = "Gestion des ressources humaines"; + + // Possible values for version are: 'development', 'experimental', 'dolibarr' or version + $this->version = 'develop'; + + $this->const_name = 'MAIN_MODULE_' . strtoupper ( $this->name ); + $this->special = 0; + // $this->picto = ''; + + // define triggers + $this->module_parts = array ( + + // Data directories to create when module is enabled + $this->dirs = array (); + + // Config pages + $this->config_page_url = array('admin_hrm.php'); + + // Dependencies + $this->depends = array(); + $this->requiredby = array(" + modSalaries, + modExpenseReport, + modHoliday + "); + $this->conflictwith = array(); + $this->phpmin = array ( + 5, + 3 + ); // Minimum version of PHP required by module + $this->need_dolibarr_version = array ( + 3, + 8 + ); // Minimum version of Dolibarr required by module + $this->langfiles = array ( + "hrm" + ); + + // Dictionnaries + $this->dictionnaries=array( + 'langs'=>'hrm', + 'tabname'=>array( + MAIN_DB_PREFIX."c_ihrm_department", + MAIN_DB_PREFIX."c_ihrm_function" + ), + 'tablib'=>array( + "DepartmentDict", + "FunctionDict" + ), + 'tabsql'=>array( + 'SELECT rowid, pos, code, label, active FROM '.MAIN_DB_PREFIX.'c_hrm_department', + 'SELECT rowid, pos, code, label, c_level, active FROM '.MAIN_DB_PREFIX.'c_hrm_department' + ), + 'tabsqlsort'=>array( + 'rowid ASC', + 'rowid ASC' + ), + 'tabfield'=>array( + "code,label", + "code,label" + ), + 'tabfieldvalue'=>array( + "code,label", + "code,label" + ), + 'tabfieldinsert'=>array( + "code,label", + "code,label" + ), + 'tabrowid'=>array( + "rowid", + "rowid" + ), + 'tabcond'=>array( + '$conf->hrm->enabled', + '$conf->hrm->enabled' + ) + ); + + // Constantes + $this->const = array (); + $r = 0; + + // Boxes + $this->boxes = array (); + + // Permissions + $this->rights = array(); // Permission array used by this module + $r = 0; + + $this->rights[$r][0] = 4001; + $this->rights[$r][1] = 'See employees'; + $this->rights[$r][3] = 1; + $this->rights[$r][4] = 'employee'; + $this->rights[$r][5] = 'read'; + $r ++; + + $this->rights[$r][0] = 4002; + $this->rights[$r][1] = 'Create employees'; + $this->rights[$r][3] = 1; + $this->rights[$r][4] = 'employee'; + $this->rights[$r][5] = 'write'; + $r ++; + + $this->rights[$r][0] = 4003; + $this->rights[$r][1] = 'Delete employees'; + $this->rights[$r][3] = 1; + $this->rights[$r][4] = 'employee'; + $this->rights[$r][5] = 'delete'; + $r ++; + + $this->rights[$r][0] = 4004; + $this->rights[$r][1] = 'Export employees'; + $this->rights[$r][3] = 0; + $this->rights[$r][4] = 'employee'; + $this->rights[$r][5] = 'export'; + $r ++; + + // Main menu entries + $this->menus = array (); // List of menus to add + $r = 0; + + $this->menu[$r] = array ( + 'fk_menu' => 'fk_mainmenu=hrm', + 'type' => 'left', + 'titre' => 'Employees', + 'leftmenu' => 'employee', + 'mainmenu' => 'hrm', + 'url' => '/hrm/employee/index.php', + 'langs' => 'hrm', + 'position' => 100, + 'enabled' => '$user->rights->hrm->employee->read', + 'perms' => '$user->rights->hrm->employee->read', + 'target' => '', + 'user' => 0 + ); + $r ++; + + $this->menu[$r] = array( + 'fk_menu' => 'fk_mainmenu=hrm,fk_leftmenu=employee', + 'type' => 'left', + 'titre' => 'NewEmployee', + 'mainmenu' => 'hrm', + 'url' => '/hrm/employee/card.php?action=create', + 'langs' => 'hrm', + 'position' => 101, + 'enabled' => '$user->rights->hrm->employee->write', + 'perms' => '$user->rights->hrm->employee->write', + 'target' => '', + 'user' => 0 + ); + $r ++; + + $this->menu[$r] = array( + 'fk_menu' => 'fk_mainmenu=hrm,fk_leftmenu=employee', + 'type' => 'left', + 'titre' => 'List', + 'mainmenu' => 'hrm', + 'url' => '/hrm/employee/list.php', + 'langs' => 'hrm', + 'position' => 102, + 'enabled' => '$user->rights->hrm->employee->read', + 'perms' => '$user->rights->hrm->employee->read', + 'target' => '', + 'user' => 0 + ); + $r ++; + + $this->menu[$r] = array( + 'fk_menu' => 'fk_mainmenu=hrm,fk_leftmenu=employee', + 'type' => 'left', + 'titre' => 'Statistics', + 'mainmenu' => 'hrm', + 'url' => '/hrm/employee/stats.php', + 'langs' => 'hrm', + 'position' => 103, + 'enabled' => '$user->rights->hrm->employee->read', + 'perms' => '$user->rights->hrm->employee->read', + 'target' => '', + 'user' => 0 + ); + $r ++; + } + + /** + * Function called when module is enabled. + * The init function add constants, boxes, permissions and menus + * (defined in constructor) into Dolibarr database. + * It also creates data directories + * + * @param string $options Enabling module ('', 'noboxes') + * @return int if OK, 0 if KO + */ + public function init($options = '') + { + $sql = array(); + + $result = $this->loadTables(); + + return $this->_init($sql, $options); + } +} From 6a7892ca525f25500c72e1e73f66e4c5d203f698 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Fri, 9 Oct 2015 06:41:36 +0200 Subject: [PATCH 053/297] Add the first tables --- .../mysql/data/llx_c_hrm_department.sql | 43 +++++++++ .../install/mysql/data/llx_c_hrm_function.sql | 34 +++++++ .../install/mysql/migration/3.9.0-4.0.0.sql | 88 +++++++++++++++++++ .../mysql/tables/llx_c_hrm_department.sql | 26 ++++++ .../mysql/tables/llx_c_hrm_function.sql | 27 ++++++ .../mysql/tables/llx_establishment.sql | 41 +++++++++ 6 files changed, 259 insertions(+) create mode 100644 htdocs/install/mysql/data/llx_c_hrm_department.sql create mode 100644 htdocs/install/mysql/data/llx_c_hrm_function.sql create mode 100644 htdocs/install/mysql/migration/3.9.0-4.0.0.sql create mode 100644 htdocs/install/mysql/tables/llx_c_hrm_department.sql create mode 100644 htdocs/install/mysql/tables/llx_c_hrm_function.sql create mode 100644 htdocs/install/mysql/tables/llx_establishment.sql diff --git a/htdocs/install/mysql/data/llx_c_hrm_department.sql b/htdocs/install/mysql/data/llx_c_hrm_department.sql new file mode 100644 index 0000000000000..0129856be959b --- /dev/null +++ b/htdocs/install/mysql/data/llx_c_hrm_department.sql @@ -0,0 +1,43 @@ +-- ============================================================================ +-- Copyright (C) 2013 Jean-François Ferry +-- Copyright (C) 2015 Alexandre Spangaro +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- ============================================================================ +-- + +-- +-- Ne pas placer de commentaire en fin de ligne, ce fichier est parsé lors +-- de l'install et tous les sigles '--' sont supprimés. +-- + +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(1, 5,'MANAGEMENT', 'Management', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(2, 10,'GESTION', 'Gestion', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(3, 15,'TRAINING', 'Training', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(4, 20,'IT', 'Inform. Technology (IT)', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(5, 25,'MARKETING', 'Marketing', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(6, 30,'SALES', 'Sales', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(7, 35,'Legal', 'Legal', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(8, 40,'FINANCIAL', 'Financial accounting', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(9, 45,'HUMANRES', 'Human resources', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(10, 50,'PURCHASING', 'Purchasing', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(11, 55,'SERVICES', 'Services', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(12, 60,'CUSTOMSERV', 'Customer service', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(13, 65,'CONSULTING', 'Consulting', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(14, 70,'LOGISTIC', 'Logistics', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(15, 75,'CONSTRUCT', 'Engineering/design', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(16, 80,'PRODUCTION', 'Manufacturing', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(17, 85,'QUALITY', 'Quality assurance', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(18, 85,'MAINT', 'Plant assurance', 1); diff --git a/htdocs/install/mysql/data/llx_c_hrm_function.sql b/htdocs/install/mysql/data/llx_c_hrm_function.sql new file mode 100644 index 0000000000000..f8b56563689df --- /dev/null +++ b/htdocs/install/mysql/data/llx_c_hrm_function.sql @@ -0,0 +1,34 @@ +-- ============================================================================ +-- Copyright (C) 2013 Jean-François Ferry +-- Copyright (C) 2015 Alexandre Spangaro +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- ============================================================================ +-- + +-- +-- Ne pas placer de commentaire en fin de ligne, ce fichier est parsé lors +-- de l'install et tous les sigles '--' sont supprimés. +-- + +INSERT INTO llx_c_hrm_function (rowid, pos, code, label, c_level, active) VALUES(1, 5,'EXECBOARD', 'Executive board', 0, 1); +INSERT INTO llx_c_hrm_function (rowid, pos, code, label, c_level, active) VALUES(2, 10, 'MANAGDIR', 'Managing director', 1, 1); +INSERT INTO llx_c_hrm_function (rowid, pos, code, label, c_level, active) VALUES(3, 15, 'ACCOUNTMANAG', 'Account manager', 0, 1); +INSERT INTO llx_c_hrm_function (rowid, pos, code, label, c_level, active) VALUES(3, 20, 'ENGAGDIR', 'Engagement director', 1, 1); +INSERT INTO llx_c_hrm_function (rowid, pos, code, label, c_level, active) VALUES(4, 25, 'DIRECTOR', 'Director', 1, 1); +INSERT INTO llx_c_hrm_function (rowid, pos, code, label, c_level, active) VALUES(5, 30, 'PROJMANAG', 'Project manager', 0, 1); +INSERT INTO llx_c_hrm_function (rowid, pos, code, label, c_level, active) VALUES(6, 35, 'DEPHEAD', 'Department head', 0, 1); +INSERT INTO llx_c_hrm_function (rowid, pos, code, label, c_level, active) VALUES(7, 40, 'SECRETAR', 'Secretary', 0, 1); +INSERT INTO llx_c_hrm_function (rowid, pos, code, label, c_level, active) VALUES(8, 45, 'EMPLOYEE', 'Department employee', 0, 1); 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 new file mode 100644 index 0000000000000..bea4065fab808 --- /dev/null +++ b/htdocs/install/mysql/migration/3.9.0-4.0.0.sql @@ -0,0 +1,88 @@ +-- +-- Be carefull to requests order. +-- This file must be loaded by calling /install/index.php page +-- when current version is 3.9.0 or higher. +-- +-- To rename a table: ALTER TABLE llx_table RENAME TO llx_table_new; +-- To add a column: ALTER TABLE llx_table ADD COLUMN newcol varchar(60) NOT NULL DEFAULT '0' AFTER existingcol; +-- To rename a column: ALTER TABLE llx_table CHANGE COLUMN oldname newname varchar(60); +-- To drop a column: ALTER TABLE llx_table DROP COLUMN oldname; +-- To change type of field: ALTER TABLE llx_table MODIFY COLUMN name varchar(60); +-- To drop a foreign key: ALTER TABLE llx_table DROP FOREIGN KEY fk_name; +-- To restrict request to Mysql version x.y use -- VMYSQLx.y +-- To restrict request to Pgsql version x.y use -- VPGSQLx.y +-- To make pk to be auto increment (mysql): VMYSQL4.3 ALTER TABLE llx_c_shipment_mode CHANGE COLUMN rowid rowid INTEGER NOT NULL AUTO_INCREMENT; +-- To make pk to be auto increment (postgres): VPGSQL8.2 NOT POSSIBLE. MUST DELETE/CREATE TABLE +-- To set a field as NULL: VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN name DROP NOT NULL; +-- To set a field as default NULL: VPGSQL8.2 ALTER TABLE llx_table ALTER COLUMN name SET DEFAULT NULL; +-- -- VPGSQL8.2 DELETE FROM llx_usergroup_user WHERE fk_user NOT IN (SELECT rowid from llx_user); +-- -- VMYSQL4.1 DELETE FROM llx_usergroup_user WHERE fk_usergroup NOT IN (SELECT rowid from llx_usergroup); + +CREATE TABLE IF NOT EXISTS llx_c_hrm_function +( + rowid integer PRIMARY KEY, + pos tinyint DEFAULT 0 NOT NULL, + code varchar(16) NOT NULL, + label varchar(50), + c_level tinyint DEFAULT 0 NOT NULL, + active tinyint DEFAULT 1 NOT NULL +)ENGINE=innodb; + +INSERT INTO llx_c_hrm_function (rowid, pos, code, label, c_level, active) VALUES(1, 5,'EXECBOARD', 'Executive board', 0, 1); +INSERT INTO llx_c_hrm_function (rowid, pos, code, label, c_level, active) VALUES(2, 10, 'MANAGDIR', 'Managing director', 1, 1); +INSERT INTO llx_c_hrm_function (rowid, pos, code, label, c_level, active) VALUES(3, 15, 'ACCOUNTMANAG', 'Account manager', 0, 1); +INSERT INTO llx_c_hrm_function (rowid, pos, code, label, c_level, active) VALUES(3, 20, 'ENGAGDIR', 'Engagement director', 1, 1); +INSERT INTO llx_c_hrm_function (rowid, pos, code, label, c_level, active) VALUES(4, 25, 'DIRECTOR', 'Director', 1, 1); +INSERT INTO llx_c_hrm_function (rowid, pos, code, label, c_level, active) VALUES(5, 30, 'PROJMANAG', 'Project manager', 0, 1); +INSERT INTO llx_c_hrm_function (rowid, pos, code, label, c_level, active) VALUES(6, 35, 'DEPHEAD', 'Department head', 0, 1); +INSERT INTO llx_c_hrm_function (rowid, pos, code, label, c_level, active) VALUES(7, 40, 'SECRETAR', 'Secretary', 0, 1); +INSERT INTO llx_c_hrm_function (rowid, pos, code, label, c_level, active) VALUES(8, 45, 'EMPLOYEE', 'Department employee', 0, 1); + +CREATE TABLE IF NOT EXISTS llx_c_hrm_department +( + rowid integer PRIMARY KEY, + pos tinyint DEFAULT 0 NOT NULL, + code varchar(16) NOT NULL, + label varchar(50), + active tinyint DEFAULT 1 NOT NULL +)ENGINE=innodb; + +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(1, 5,'MANAGEMENT', 'Management', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(2, 10,'GESTION', 'Gestion', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(3, 15,'TRAINING', 'Training', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(4, 20,'IT', 'Inform. Technology (IT)', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(5, 25,'MARKETING', 'Marketing', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(6, 30,'SALES', 'Sales', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(7, 35,'Legal', 'Legal', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(8, 40,'FINANCIAL', 'Financial accounting', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(9, 45,'HUMANRES', 'Human resources', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(10, 50,'PURCHASING', 'Purchasing', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(11, 55,'SERVICES', 'Services', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(12, 60,'CUSTOMSERV', 'Customer service', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(13, 65,'CONSULTING', 'Consulting', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(14, 70,'LOGISTIC', 'Logistics', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(15, 75,'CONSTRUCT', 'Engineering/design', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(16, 80,'PRODUCTION', 'Manufacturing', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(17, 85,'QUALITY', 'Quality assurance', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(18, 85,'MAINT', 'Plant assurance', 1); + +CREATE TABLE IF NOT EXISTS llx_establishment ( + rowid integer NOT NULL auto_increment PRIMARY KEY, + entity integer NOT NULL DEFAULT 1, + name varchar(50), + address varchar(255), + zip varchar(25), + town varchar(50), + fk_state integer DEFAULT 0, + fk_country integer DEFAULT 0, + profid1 varchar(20), + profid2 varchar(20), + profid3 varchar(20), + phone varchar(20), + fk_user_author integer NOT NULL, + fk_user_mod integer NOT NULL, + datec datetime NOT NULL, + tms timestamp NOT NULL, + statut tinyint DEFAULT 1, +) ENGINE=InnoDB; + diff --git a/htdocs/install/mysql/tables/llx_c_hrm_department.sql b/htdocs/install/mysql/tables/llx_c_hrm_department.sql new file mode 100644 index 0000000000000..f9432d8b821d5 --- /dev/null +++ b/htdocs/install/mysql/tables/llx_c_hrm_department.sql @@ -0,0 +1,26 @@ +-- +-- Copyright (C) 2013 Jean-François Ferry +-- Copyright (C) 2015 Alexandre Spangaro +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +create table llx_c_hrm_department +( + rowid integer PRIMARY KEY, + pos tinyint DEFAULT 0 NOT NULL, + code varchar(16) NOT NULL, + label varchar(50), + active tinyint DEFAULT 1 NOT NULL +)ENGINE=innodb; + diff --git a/htdocs/install/mysql/tables/llx_c_hrm_function.sql b/htdocs/install/mysql/tables/llx_c_hrm_function.sql new file mode 100644 index 0000000000000..f3f87461866d9 --- /dev/null +++ b/htdocs/install/mysql/tables/llx_c_hrm_function.sql @@ -0,0 +1,27 @@ +-- +-- Copyright (C) 2013 Jean-François Ferry +-- Copyright (C) 2015 Alexandre Spangaro +-- +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . + +create table llx_c_hrm_function +( + rowid integer PRIMARY KEY, + pos tinyint DEFAULT 0 NOT NULL, + code varchar(16) NOT NULL, + label varchar(50), + c_level tinyint DEFAULT 0 NOT NULL, + active tinyint DEFAULT 1 NOT NULL +)ENGINE=innodb; + diff --git a/htdocs/install/mysql/tables/llx_establishment.sql b/htdocs/install/mysql/tables/llx_establishment.sql new file mode 100644 index 0000000000000..2f5c86510e08a --- /dev/null +++ b/htdocs/install/mysql/tables/llx_establishment.sql @@ -0,0 +1,41 @@ +-- ============================================================================ +-- Copyright (C) 2015 Alexandre Spangaro +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with this program. If not, see . +-- +-- ============================================================================ +-- +-- Structure de la table llx_establishment +-- + +CREATE TABLE IF NOT EXISTS llx_establishment ( + rowid integer NOT NULL auto_increment PRIMARY KEY, + entity integer NOT NULL DEFAULT 1, + name varchar(50), + address varchar(255), + zip varchar(25), + town varchar(50), + fk_state integer DEFAULT 0, + fk_country integer DEFAULT 0, + profid1 varchar(20), + profid2 varchar(20), + profid3 varchar(20), + phone varchar(20), + fk_user_author integer NOT NULL, + fk_user_mod integer NOT NULL, + datec datetime NOT NULL, + tms timestamp NOT NULL, + statut tinyint DEFAULT 1, +) ENGINE=InnoDB; + From b571cc86ff91511b8019fa21b831b481000f9afd Mon Sep 17 00:00:00 2001 From: aspangaro Date: Fri, 9 Oct 2015 07:30:48 +0200 Subject: [PATCH 054/297] Add a yn form in user card to know if the user is also an employee --- .../install/mysql/migration/3.9.0-4.0.0.sql | 2 ++ htdocs/install/mysql/tables/llx_user.sql | 2 ++ htdocs/user/card.php | 19 +++++++++++++++++++ htdocs/user/class/user.class.php | 9 +++++++-- 4 files changed, 30 insertions(+), 2 deletions(-) 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 bea4065fab808..6120a946ec3c3 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 @@ -86,3 +86,5 @@ CREATE TABLE IF NOT EXISTS llx_establishment ( statut tinyint DEFAULT 1, ) ENGINE=InnoDB; +ALTER TABLE llx_user ADD COLUMN employee tinyint DEFAULT 0 AFTER ref_int; + diff --git a/htdocs/install/mysql/tables/llx_user.sql b/htdocs/install/mysql/tables/llx_user.sql index a11b0ec6b5076..f95def7e50343 100644 --- a/htdocs/install/mysql/tables/llx_user.sql +++ b/htdocs/install/mysql/tables/llx_user.sql @@ -25,6 +25,8 @@ create table llx_user ref_ext varchar(50), -- reference into an external system (not used by dolibarr) ref_int varchar(50), -- reference into an internal system (deprecated) + + employee tinyint DEFAULT 0, -- employee 0/1 datec datetime, tms timestamp, diff --git a/htdocs/user/card.php b/htdocs/user/card.php index b74b921c735d1..9744aebfbbeeb 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -191,6 +191,7 @@ { $object->lastname = GETPOST("lastname",'alpha'); $object->firstname = GETPOST("firstname",'alpha'); + $object->employee = GETPOST("employee",'int'); $object->login = GETPOST("login",'alpha'); $object->api_key = GETPOST("api_key",'alpha'); $object->gender = GETPOST("gender",'alpha'); @@ -344,6 +345,7 @@ $object->lastname = GETPOST("lastname",'alpha'); $object->firstname = GETPOST("firstname",'alpha'); + $object->employee = GETPOST("employee",'int'); $object->login = GETPOST("login",'alpha'); $object->gender = GETPOST("gender",'alpha'); $object->pass = GETPOST("password"); @@ -762,6 +764,12 @@ { print ''; } + print ''; + + // Employee + print ''; + print ''.fieldLabel('Employee','employee',0).''; + print $form->selectyesno("employee",(isset($_POST['employee'])?GETPOST('employee'):0),1); print ''; // Position/Job @@ -1224,6 +1232,11 @@ print ''.$object->firstname.''; print ''."\n"; + // Employee + print ''.$langs->trans("Employee").''; + print yn($object->employee); + print ''."\n"; + // Position/Job print ''.$langs->trans("PostOrFunction").''; print ''.$object->job.''; @@ -1803,6 +1816,12 @@ } print ''; + // Employee + print ''; + print ''.fieldLabel('Employee','employee',0).''; + print $form->selectyesno("employee",$object->employee,1); + print ''; + // Position/Job print ''.$langs->trans("PostOrFunction").''; print ''; diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 6dc8de8db8e8a..d4317a0d919cf 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -8,7 +8,7 @@ * Copyright (C) 2005 Lionel Cousteix * Copyright (C) 2011 Herve Prot * Copyright (C) 2013-2014 Philippe Grand - * Copyright (C) 2013 Alexandre Spangaro + * Copyright (C) 2013-2015 Alexandre Spangaro * Copyright (C) 2015 Marcos García * * This program is free software; you can redistribute it and/or modify @@ -46,6 +46,7 @@ class User extends CommonObject var $id=0; var $ldap_sid; var $search_sid; + var $employee; var $gender; var $email; var $skype; @@ -156,7 +157,7 @@ function fetch($id='', $login='',$sid='',$loadpersonalconf=1) $login=trim($login); // Get user - $sql = "SELECT u.rowid, u.lastname, u.firstname, u.gender, u.email, u.job, u.skype, u.signature, u.office_phone, u.office_fax, u.user_mobile,"; + $sql = "SELECT u.rowid, u.lastname, u.firstname, u.employee, u.gender, u.email, u.job, u.skype, u.signature, u.office_phone, u.office_fax, u.user_mobile,"; $sql.= " u.admin, u.login, u.note,"; $sql.= " u.pass, u.pass_crypted, u.pass_temp, u.api_key,"; $sql.= " u.fk_soc, u.fk_socpeople, u.fk_member, u.fk_user, u.ldap_sid,"; @@ -215,6 +216,8 @@ function fetch($id='', $login='',$sid='',$loadpersonalconf=1) $this->ldap_sid = $obj->ldap_sid; $this->lastname = $obj->lastname; $this->firstname = $obj->firstname; + + $this->employee = $obj->employee; $this->login = $obj->login; $this->gender = $obj->gender; @@ -1145,6 +1148,7 @@ function update($user,$notrigger=0,$nosyncmember=0,$nosyncmemberpass=0) // Clean parameters $this->lastname = trim($this->lastname); $this->firstname = trim($this->firstname); + $this->employee = trim($this->employee); $this->login = trim($this->login); $this->gender = trim($this->gender); $this->pass = trim($this->pass); @@ -1185,6 +1189,7 @@ function update($user,$notrigger=0,$nosyncmember=0,$nosyncmemberpass=0) $sql = "UPDATE ".MAIN_DB_PREFIX."user SET"; $sql.= " lastname = '".$this->db->escape($this->lastname)."'"; $sql.= ", firstname = '".$this->db->escape($this->firstname)."'"; + $sql.= ", employee = ".$this->employee; $sql.= ", login = '".$this->db->escape($this->login)."'"; $sql.= ", api_key = ".($this->api_key ? "'".$this->db->escape($this->api_key)."'" : "null"); $sql.= ", gender = ".($this->gender != -1 ? "'".$this->db->escape($this->gender)."'" : "null"); // 'man' or 'woman' From 61d739635e862b462d16ed450bd614b2264692af Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 9 Oct 2015 12:30:16 +0200 Subject: [PATCH 055/297] Uniformize code and css for tables. Filters must be implemented following example in test_arrays.php. --- htdocs/adherents/list.php | 5 +- htdocs/adherents/type.php | 4 +- htdocs/comm/askpricesupplier/list.php | 28 +++--- htdocs/comm/list.php | 7 +- htdocs/comm/propal/list.php | 8 +- htdocs/comm/prospect/list.php | 7 +- htdocs/commande/list.php | 2 +- htdocs/compta/facture/list.php | 11 ++- htdocs/compta/facture/mergepdftool.php | 20 +++-- htdocs/compta/paiement/cheque/list.php | 86 +++++++++++-------- .../compta/paiement/class/paiement.class.php | 2 +- htdocs/compta/paiement/list.php | 3 +- htdocs/contact/list.php | 7 +- htdocs/contrat/list.php | 17 ++-- htdocs/fourn/list.php | 7 +- htdocs/product/list.php | 16 ++-- htdocs/product/reassort.php | 30 ++++--- htdocs/product/reassortlot.php | 25 +++--- htdocs/projet/list.php | 9 +- htdocs/projet/tasks/index.php | 2 +- htdocs/public/test/test_arrays.php | 18 ++-- htdocs/societe/list.php | 9 +- htdocs/theme/eldy/style.css.php | 72 ++++++---------- 23 files changed, 216 insertions(+), 179 deletions(-) diff --git a/htdocs/adherents/list.php b/htdocs/adherents/list.php index 2f495e60bf7de..d89360631db94 100644 --- a/htdocs/adherents/list.php +++ b/htdocs/adherents/list.php @@ -195,9 +195,10 @@ if (! empty($conf->categorie->enabled)) { require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php'; + $moreforfilter.='

'; $moreforfilter.=$langs->trans('Categories'). ': '; $moreforfilter.=$formother->select_categories(Categorie::TYPE_MEMBER,$search_categ,'search_categ',1); - $moreforfilter.='       '; + $moreforfilter.='
'; } if (! empty($moreforfilter)) { @@ -209,7 +210,7 @@ print '
'; } - print ''; + print '
'; print ''; print_liste_field_titre($langs->trans("Ref"),$_SERVER["PHP_SELF"],"d.rowid",$param,"","",$sortfield,$sortorder); print_liste_field_titre($langs->trans("Name")." / ".$langs->trans("Company"),$_SERVER["PHP_SELF"],"d.lastname",$param,"","",$sortfield,$sortorder); diff --git a/htdocs/adherents/type.php b/htdocs/adherents/type.php index 75102ed9f5019..b2fe0ac404be4 100644 --- a/htdocs/adherents/type.php +++ b/htdocs/adherents/type.php @@ -168,7 +168,7 @@ print load_fiche_titre($langs->trans("MembersTypes")); - dol_fiche_head(''); + //dol_fiche_head(''); $sql = "SELECT d.rowid, d.libelle, d.cotisation, d.vote"; $sql.= " FROM ".MAIN_DB_PREFIX."adherent_type as d"; @@ -211,7 +211,7 @@ dol_print_error($db); } - dol_fiche_end(); + //dol_fiche_end(); /* * Hotbar diff --git a/htdocs/comm/askpricesupplier/list.php b/htdocs/comm/askpricesupplier/list.php index 2e78045b3085c..ae7ed58b29c49 100644 --- a/htdocs/comm/askpricesupplier/list.php +++ b/htdocs/comm/askpricesupplier/list.php @@ -242,7 +242,6 @@ print ''; $i = 0; - print '
'; $moreforfilter=''; @@ -250,25 +249,32 @@ if ($user->rights->societe->client->voir || $socid) { $langs->load("commercial"); + $moreforfilter.='
'; $moreforfilter.=$langs->trans('ThirdPartiesOfSaleRepresentative'). ': '; $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user); - $moreforfilter.='       '; + $moreforfilter.='
'; } // If the user can view prospects other than his' if ($user->rights->societe->client->voir || $socid) { + $moreforfilter.='
'; $moreforfilter.=$langs->trans('LinkedToSpecificUsers'). ': '; $moreforfilter.=$form->select_dolusers($search_user,'search_user',1); + $moreforfilter.='
'; } - if (! empty($moreforfilter)) - { - print ''; - print ''; - } - - print ''; + if (! empty($moreforfilter)) + { + print '
'; + print $moreforfilter; + $parameters=array(); + $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + print '
'; + } + + + print '
'; - print $moreforfilter; - print '
'; + print ''; print_liste_field_titre($langs->trans('Ref'),$_SERVER["PHP_SELF"],'p.ref','',$param,'',$sortfield,$sortorder); print_liste_field_titre($langs->trans('Company'),$_SERVER["PHP_SELF"],'s.nom','',$param,'',$sortfield,$sortorder); print_liste_field_titre($langs->trans('AskPriceSupplierDate'),$_SERVER["PHP_SELF"],'p.date_livraison','',$param, 'align="center"',$sortfield,$sortorder); diff --git a/htdocs/comm/list.php b/htdocs/comm/list.php index fcc1783daf5fc..1cc0f2fa9682b 100644 --- a/htdocs/comm/list.php +++ b/htdocs/comm/list.php @@ -193,15 +193,18 @@ $moreforfilter=''; if (! empty($conf->categorie->enabled)) { + $moreforfilter.='
'; $moreforfilter.=$langs->trans('Categories'). ': '; $moreforfilter.=$formother->select_categories(2,$search_categ,'search_categ',1); - $moreforfilter.='       '; + $moreforfilter.='
'; } // If the user can view prospects other than his' if ($user->rights->societe->client->voir || $socid) { + $moreforfilter.='
'; $moreforfilter.=$langs->trans('SalesRepresentatives'). ': '; $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user); + $moreforfilter.='
'; } if ($moreforfilter) { @@ -213,7 +216,7 @@ print ''; } - print '
'."\n"; + print '
'; print ''; print_liste_field_titre($langs->trans("Company"),$_SERVER["PHP_SELF"],"s.nom","",$param,"",$sortfield,$sortorder); diff --git a/htdocs/comm/propal/list.php b/htdocs/comm/propal/list.php index f595ad8aec0d4..7d1539ff0f52d 100644 --- a/htdocs/comm/propal/list.php +++ b/htdocs/comm/propal/list.php @@ -265,7 +265,6 @@ if ($optioncss != '') print ''; $i = 0; - print '
'; $moreforfilter=''; @@ -298,12 +297,13 @@ } if (! empty($moreforfilter)) { - print ''; - print ''; + print ''; } + print '
'; + print '
'; print $moreforfilter; - print '
'; + print ''; print_liste_field_titre($langs->trans('Ref'),$_SERVER["PHP_SELF"],'p.ref','',$param,'',$sortfield,$sortorder); print_liste_field_titre($langs->trans('RefCustomer'),$_SERVER["PHP_SELF"],'p.ref_client','',$param,'',$sortfield,$sortorder); diff --git a/htdocs/comm/prospect/list.php b/htdocs/comm/prospect/list.php index 670d170de9787..2282b39420e21 100644 --- a/htdocs/comm/prospect/list.php +++ b/htdocs/comm/prospect/list.php @@ -359,15 +359,18 @@ if (! empty($conf->categorie->enabled)) { require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php'; + $moreforfilter.='
'; $moreforfilter.=$langs->trans('Categories'). ': '; $moreforfilter.=$formother->select_categories(Categorie::TYPE_CUSTOMER,$search_categ,'search_categ',1); - $moreforfilter.='       '; + $moreforfilter.='
'; } // If the user can view prospects other than his' if ($user->rights->societe->client->voir || $socid) { + $moreforfilter.='
'; $moreforfilter.=$langs->trans('SalesRepresentatives'). ': '; $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user); + $moreforfilter.='
'; } if ($moreforfilter) { @@ -379,7 +382,7 @@ print ''; } - print '
'; + print '
'; print ''; print_liste_field_titre($langs->trans("Company"),$_SERVER["PHP_SELF"],"s.nom","",$param,'',$sortfield,$sortorder); diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index c4ea9cbf83841..200f9e66362ab 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -301,7 +301,7 @@ print ''; } - print '
'; + print '
'; print ''; print_liste_field_titre($langs->trans('Ref'),$_SERVER["PHP_SELF"],'c.ref','',$param,'width="25%"',$sortfield,$sortorder); print_liste_field_titre($langs->trans('RefCustomerOrder'),$_SERVER["PHP_SELF"],'c.ref_client','',$param,'',$sortfield,$sortorder); diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index b507f5284dde7..e4993eacb888e 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -275,7 +275,6 @@ $i = 0; print ''."\n"; - print '
'; // If the user can view prospects other than his' $moreforfilter=''; @@ -308,12 +307,16 @@ if ($moreforfilter) { - print ''; - print ''; + $parameters=array(); + $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + print ''; } + print '
'; + print '
'; print $moreforfilter; - print '
'; + print ''; print_liste_field_titre($langs->trans('Ref'),$_SERVER['PHP_SELF'],'f.facnumber','',$param,'',$sortfield,$sortorder); print_liste_field_titre($langs->trans('RefCustomer'),$_SERVER["PHP_SELF"],'f.ref_client','',$param,'',$sortfield,$sortorder); diff --git a/htdocs/compta/facture/mergepdftool.php b/htdocs/compta/facture/mergepdftool.php index 72276b7706926..b78b31d1a02f6 100644 --- a/htdocs/compta/facture/mergepdftool.php +++ b/htdocs/compta/facture/mergepdftool.php @@ -616,32 +616,38 @@ } $i = 0; - print '
'; // If the user can view prospects other than his' $moreforfilter=''; if ($user->rights->societe->client->voir || $socid) { $langs->load("commercial"); + $moreforfilter.='
'; $moreforfilter.=$langs->trans('ThirdPartiesOfSaleRepresentative'). ': '; $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user); - $moreforfilter.='       '; + $moreforfilter.='
'; } // If the user can view prospects other than his' if ($user->rights->societe->client->voir || $socid) { + $moreforfilter.='
'; $moreforfilter.=$langs->trans('LinkedToSpecificUsers'). ': '; $moreforfilter.=$form->select_dolusers($search_user,'search_user',1); + $moreforfilter.='
'; } - if ($moreforfilter) + if (! empty($moreforfilter)) { - print ''; - print ''; + $parameters=array(); + $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + print ''; } - print ''; + print '
'; + print '
'; print $moreforfilter; - print '
'; + + print ''; print_liste_field_titre($langs->trans("Ref"),$_SERVER["PHP_SELF"],"f.facnumber","",$param,"",$sortfield,$sortorder); print_liste_field_titre($langs->trans('RefCustomer'),$_SERVER["PHP_SELF"],'f.ref_client','',$param,'',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Date"),$_SERVER["PHP_SELF"],"f.datef","",$param,'align="center"',$sortfield,$sortorder); diff --git a/htdocs/compta/paiement/cheque/list.php b/htdocs/compta/paiement/cheque/list.php index d44aef51dceda..c322863efc1ac 100644 --- a/htdocs/compta/paiement/cheque/list.php +++ b/htdocs/compta/paiement/cheque/list.php @@ -117,7 +117,7 @@ print_barre_liste($langs->trans("MenuChequeDeposits"), $page, $_SERVER["PHP_SELF"], $params, $sortfield, $sortorder, '', $num); print ''; - print '
'; + print '
'; print ''; print_liste_field_titre($langs->trans("Ref"),$_SERVER["PHP_SELF"],"bc.number","",$params,"",$sortfield,$sortorder); print_liste_field_titre($langs->trans("DateCreation"),$_SERVER["PHP_SELF"],"dp","",$params,'align="center"',$sortfield,$sortorder); @@ -148,42 +148,52 @@ print ''; print "\n"; - $var=true; - while ($i < min($num,$limit)) - { - $objp = $db->fetch_object($resql); - $var=!$var; - print ""; - - // Num ref cheque - print ''; - - // Date - print ''; // TODO Use date hour - - // Bank - print ''; - - // Number of cheques - print ''; - - // Amount - print ''; - - // Statut - print '\n"; - $i++; - } + if ($num > 0) + { + $var=true; + while ($i < min($num,$limit)) + { + $objp = $db->fetch_object($resql); + $var=!$var; + print ""; + + // Num ref cheque + print ''; + + // Date + print ''; // TODO Use date hour + + // Bank + print ''; + + // Number of cheques + print ''; + + // Amount + print ''; + + // Statut + print '\n"; + $i++; + } + } + else + { + $var=!$var; + print ""; + print '"; + print ''; + } print "
'; - $checkdepositstatic->id=$objp->rowid; - $checkdepositstatic->ref=($objp->ref?$objp->ref:$objp->rowid); - $checkdepositstatic->statut=$objp->statut; - print $checkdepositstatic->getNomUrl(1); - print ''.dol_print_date($db->jdate($objp->dp),'day').''; - if ($objp->bid) print ''.img_object($langs->trans("ShowAccount"),'account').' '.$objp->label.''; - else print ' '; - print ''.$objp->nbcheque.''.price($objp->amount).''; - print $checkdepositstatic->LibStatut($objp->statut,5); - print "
'; + $checkdepositstatic->id=$objp->rowid; + $checkdepositstatic->ref=($objp->ref?$objp->ref:$objp->rowid); + $checkdepositstatic->statut=$objp->statut; + print $checkdepositstatic->getNomUrl(1); + print ''.dol_print_date($db->jdate($objp->dp),'day').''; + if ($objp->bid) print ''.img_object($langs->trans("ShowAccount"),'account').' '.$objp->label.''; + else print ' '; + print ''.$objp->nbcheque.''.price($objp->amount).''; + print $checkdepositstatic->LibStatut($objp->statut,5); + print "
'.$langs->trans("None")."
"; print "\n"; } @@ -192,6 +202,6 @@ dol_print_error($db); } -$db->close(); llxFooter(); +$db->close(); diff --git a/htdocs/compta/paiement/class/paiement.class.php b/htdocs/compta/paiement/class/paiement.class.php index 45c9d0b526b3b..35d0f838ff957 100644 --- a/htdocs/compta/paiement/class/paiement.class.php +++ b/htdocs/compta/paiement/class/paiement.class.php @@ -906,7 +906,7 @@ function getNomUrl($withpicto=0,$option='') if ($withpicto) $result.=($link.img_object($langs->trans("ShowPayment"), 'payment', 'class="classfortooltip"').$linkend); if ($withpicto && $withpicto != 2) $result.=' '; - if ($withpicto != 2) $result.=$link.$this->ref.$linkend; + if ($withpicto != 2) $result.=$link.($this->ref?$this->ref:$this->id).$linkend; return $result; } diff --git a/htdocs/compta/paiement/list.php b/htdocs/compta/paiement/list.php index 8231f607ef7a7..6e3d31364ce92 100644 --- a/htdocs/compta/paiement/list.php +++ b/htdocs/compta/paiement/list.php @@ -305,6 +305,5 @@ dol_print_error($db); } -$db->close(); - llxFooter(); +$db->close(); diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index 649179c10826f..4082ebbae8086 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -288,9 +288,10 @@ if (! empty($conf->categorie->enabled)) { require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php'; - $moreforfilter.=$langs->trans('Categories'). ': '; + $moreforfilter.='
'; + $moreforfilter.=$langs->trans('Categories'). ': '; $moreforfilter.=$formother->select_categories(Categorie::TYPE_CONTACT,$search_categ,'search_categ',1); - $moreforfilter.='       '; + $moreforfilter.='
'; } if ($moreforfilter) { @@ -299,7 +300,7 @@ print ''; } - print ''; + print '
'; // Ligne des titres print ''; diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php index 97d20e2acb18a..a4f719cf7f58b 100644 --- a/htdocs/contrat/list.php +++ b/htdocs/contrat/list.php @@ -136,26 +136,29 @@ print ''; if ($optioncss != '') print ''; - print '
'; // If the user can view prospects other than his' $moreforfilter=''; if ($user->rights->societe->client->voir || $socid) { $langs->load("commercial"); + $moreforfilter.='
'; $moreforfilter.=$langs->trans('ThirdPartiesOfSaleRepresentative'). ': '; $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user); - $moreforfilter.='       '; + $moreforfilter.='
'; } - if ($moreforfilter) + if (! empty($moreforfilter)) { - print ''; - print ''; + print '
'; + print $moreforfilter; + $parameters=array(); + $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + print '
'; } + print '
'; - print $moreforfilter; - print '
'; print ''; $param='&search_contract='.$search_contract; diff --git a/htdocs/fourn/list.php b/htdocs/fourn/list.php index 5693031c630ce..8fb3385091955 100644 --- a/htdocs/fourn/list.php +++ b/htdocs/fourn/list.php @@ -195,9 +195,10 @@ if (! empty($conf->categorie->enabled)) { require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php'; + $moreforfilter.='
'; $moreforfilter.=$langs->trans('Categories'). ': '; $moreforfilter.=$htmlother->select_categories(Categorie::TYPE_SUPPLIER,$search_categ,'search_categ',1); - $moreforfilter.='       '; + $moreforfilter.='
'; } if ($moreforfilter) { @@ -209,8 +210,8 @@ print ''; } - print '
'; - + print '
'; + print ''; print_liste_field_titre($langs->trans("Company"),$_SERVER["PHP_SELF"],"s.nom","",$param,'valign="middle"',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Zip"),$_SERVER["PHP_SELF"],"s.zip","",$param,'valign="middle"',$sortfield,$sortorder); diff --git a/htdocs/product/list.php b/htdocs/product/list.php index 68e6143c48c6f..d973a3d41ef86 100644 --- a/htdocs/product/list.php +++ b/htdocs/product/list.php @@ -281,8 +281,6 @@ print ''; print ''; - print '
'; - // Filter on categories $moreforfilter=''; $colspan=6; @@ -294,19 +292,23 @@ if (! empty($conf->categorie->enabled)) { - $moreforfilter.=$langs->trans('Categories'). ': '; + $moreforfilter.='
'; + $moreforfilter.=$langs->trans('Categories'). ': '; $moreforfilter.=$htmlother->select_categories(Categorie::TYPE_PRODUCT,$search_categ,'search_categ',1); - $moreforfilter.='       '; + $moreforfilter.='
'; } if ($moreforfilter) { - print ''; - print ''; + $parameters=array(); + $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + print ''; } // Lignes des titres + print '
'; + print '
'; print $moreforfilter; - print '
'; print ''; print_liste_field_titre($langs->trans("Ref"), $_SERVER["PHP_SELF"], "p.ref",$param,"","",$sortfield,$sortorder); print_liste_field_titre($langs->trans("Label"), $_SERVER["PHP_SELF"], "p.label",$param,"","",$sortfield,$sortorder); diff --git a/htdocs/product/reassort.php b/htdocs/product/reassort.php index 8bd2096af69aa..cee05f6934045 100644 --- a/htdocs/product/reassort.php +++ b/htdocs/product/reassort.php @@ -215,27 +215,35 @@ print ''; print ''; - print '
'; - // Filter on categories $moreforfilter=''; if (! empty($conf->categorie->enabled)) { + $moreforfilter.='
'; $moreforfilter.=$langs->trans('Categories'). ': '; $moreforfilter.=$htmlother->select_categories(Categorie::TYPE_PRODUCT,$search_categ,'search_categ'); - $moreforfilter.='           '; + $moreforfilter.='
'; } + + $moreforfilter.='
'; $moreforfilter.=$langs->trans("StockTooLow").' '; - if ($moreforfilter) - { - print '
'; - print ''; - } + $moreforfilter.=''; + + if (! empty($moreforfilter)) + { + print '
'; + print $moreforfilter; + $parameters=array(); + $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + print '
'; + } + $param="&tosell=$tosell&tobuy=$tobuy".(isset($type)?"&type=$type":"")."&fourn_id=$fourn_id&snom=$snom&sref=$sref"; - + + print '
'; - print $moreforfilter; - print '
'; + // Lignes des titres print ""; print_liste_field_titre($langs->trans("Ref"), $_SERVER["PHP_SELF"], "p.ref",$param,"","",$sortfield,$sortorder); diff --git a/htdocs/product/reassortlot.php b/htdocs/product/reassortlot.php index 86410df8a00d5..d7f5905fbd310 100644 --- a/htdocs/product/reassortlot.php +++ b/htdocs/product/reassortlot.php @@ -227,27 +227,32 @@ print ''; print ''; - print '
'; - // Filter on categories $moreforfilter=''; if (! empty($conf->categorie->enabled)) { + $moreforfilter.='
'; $moreforfilter.=$langs->trans('Categories'). ': '; $moreforfilter.=$htmlother->select_categories(Categorie::TYPE_PRODUCT,$search_categ,'search_categ'); - $moreforfilter.='           '; + $moreforfilter.='
'; } //$moreforfilter.=$langs->trans("StockTooLow").' '; - if ($moreforfilter) - { - print ''; - print ''; - } + + if (! empty($moreforfilter)) + { + print '
'; + print $moreforfilter; + $parameters=array(); + $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + print '
'; + } + $param="&tosell=$tosell&tobuy=$tobuy".(isset($type)?"&type=$type":"")."&fourn_id=$fourn_id&snom=$snom&sref=$sref&batch=$batch&eatby=$eatby&sellby=$sellby"; + print '
'; - print $moreforfilter; - print '
'; + // Lignes des titres print ""; print_liste_field_titre($langs->trans("Ref"), $_SERVER["PHP_SELF"], "p.ref",$param,"","",$sortfield,$sortorder); diff --git a/htdocs/projet/list.php b/htdocs/projet/list.php index 8e98bf9e93f32..16fac9bb1bd7f 100644 --- a/htdocs/projet/list.php +++ b/htdocs/projet/list.php @@ -274,15 +274,18 @@ if (! empty($moreforfilter)) { print '
'; + //print '
'; + //print ''; + } - print '
'; print $moreforfilter; $parameters=array(); $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; print ''; - } + //print '
'; - + print '
'; + print ''; print_liste_field_titre($langs->trans("Ref"),$_SERVER["PHP_SELF"],"p.ref","",$param,"",$sortfield,$sortorder); print_liste_field_titre($langs->trans("Label"),$_SERVER["PHP_SELF"],"p.title","",$param,"",$sortfield,$sortorder); diff --git a/htdocs/projet/tasks/index.php b/htdocs/projet/tasks/index.php index 082fbdd8d7b26..39484f05014d2 100644 --- a/htdocs/projet/tasks/index.php +++ b/htdocs/projet/tasks/index.php @@ -141,7 +141,7 @@ print ''; } -print '
'; +print '
'; print ''; print ''; print ''; diff --git a/htdocs/public/test/test_arrays.php b/htdocs/public/test/test_arrays.php index d31b10ff5ef96..2801ebb8855df 100644 --- a/htdocs/public/test/test_arrays.php +++ b/htdocs/public/test/test_arrays.php @@ -146,9 +146,7 @@ print_barre_liste('Title of my list', 3, $_SERVER["PHP_SELF"], '', '', '', 'Text in middle', 20, 5000, '', 0, $nav); -?> -
'.$langs->trans("Project").''.$langs->trans("ProjectStatus").'
-'; $moreforfilter.=$langs->trans('This is a select list for a filter A'). ': '; $cate_arbo = array('field1'=>'value1a into the select list A','field2'=>'value2a'); @@ -175,11 +173,15 @@ if (! empty($moreforfilter)) { - print ''; - print ''; + $parameters=array(); + $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + print ''; } + +print '
'; + print '
'; print $moreforfilter; - print '
'; ?> trans('title1'),0,$_SERVER["PHP_SELF"],'aaa','','','align="left"',$sortfield,$sortorder); ?> @@ -188,7 +190,9 @@ -
getNomUrl(1); ?>b1c1
a2b2c2
+'; +?>
diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index a5792642a64f2..5e73552e231ee 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -321,15 +321,18 @@ $moreforfilter=''; if (! empty($conf->categorie->enabled)) { + $moreforfilter.='
'; $moreforfilter.=$langs->trans('Categories'). ': '; $moreforfilter.=$htmlother->select_categories(Categories::TYPE_CUSTOMER,$search_categ,'search_categ'); - $moreforfilter.='       '; + $moreforfilter.='
'; } // If the user can view prospects other than his' if ($user->rights->societe->client->voir || $socid) { + $moreforfilter.='
'; $moreforfilter.=$langs->trans('SalesRepresentatives'). ': '; $moreforfilter.=$htmlother->select_salesrepresentatives($search_sale,'search_sale',$user); + $moreforfilter.='
'; } if ($moreforfilter) { @@ -349,8 +352,8 @@ print ''; } - print ''; - + print '
'; + // Lines of titles print ''; print_liste_field_titre($langs->trans("Company"),$_SERVER["PHP_SELF"],"s.nom","",$param,"",$sortfield,$sortorder); diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index b6987ed42cc15..9f5376947da40 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -452,8 +452,10 @@ div.divsearchfield { float: ; margin-: 12px; - margin-top: 1px; - margin-bottom: 2px; + margin-: 2px; + margin-top: 3px; + margin-bottom: 3px; + padding-left: 2px; } div.confirmmessage { padding-top: 6px; @@ -1934,7 +1936,7 @@ /* Main boxes */ -table.noborder, table.formdoc, div.noborder { +table.liste, table.noborder, table.formdoc, div.noborder { width: 100%; border-collapse: separate !important; @@ -1962,25 +1964,28 @@ -webkit-box-shadow: 2px 2px 4px #CCC; box-shadow: 2px 2px 4px #CCC; - -moz-border-radius: 0.2em; +/* -moz-border-radius: 0.2em; -webkit-border-radius: 0.2em; - border-radius: 0.2em; + border-radius: 0.2em;*/ } -table.noborder tr, div.noborder form { +table.liste tr, table.noborder tr, div.noborder form { border-top-color: #FEFEFE; border-right-width: 1px; - border-right-color: #BBBBBB; + border-right-color: #BBB; border-right-style: solid; border-left-width: 1px; - border-left-color: #BBBBBB; + border-left-color: #BBB; border-left-style: solid; min-height: 20px; } -table.noborder th, table.noborder td, div.noborder form, div.noborder form div { +table.liste th, table.noborder th { + padding: 10px 2px 10px 3px; /* t r b l */ +} +table.liste td, table.noborder td, div.noborder form, div.noborder form div { padding: 5px 2px 5px 3px; /* t r b l */ } @@ -2008,42 +2013,12 @@ } -/* For lists */ - -table.liste { - width: 100%; - - border-collapse: collapse; -/* border-top-color: #FEFEFE; - border-top-width: 1px; - border-top-color: #CCC; - border-top-style: solid; -*/ - - border-right-width: 1px; - border-right-color: #CCC; - border-right-style: solid; - -/* - border-bottom-width: 1px; - border-bottom-color: #BBBBBB; - border-bottom-style: solid; -*/ - border-left-width: 1px; - border-left-color: #CCC; - border-left-style: solid; - - margin-bottom: 2px; - margin-top: 0px; - - -moz-box-shadow: 0px 3px 4px #CCC; - -webkit-box-shadow: 0px 3px 4px #CC; - box-shadow: 0px 3px 4px #CCC; -} -table.liste td { - padding-right: 2px; +/* For table with no filter before */ +table.listwithfilterbefore { + border-top: none !important; } + .tagtable, .table-border { display: table; } .tagtr, .table-border-row { display: table-row; } .tagtd, .table-border-col, .table-key-border-col, .table-val-border-col { display: table-cell; } @@ -2285,27 +2260,28 @@ div.liste_titre { min-height: 26px !important; /* We cant use height because it's a div and it should be higher if content is more. but min-height does not work either for div */ - padding-left: 3px; padding-top: 2px; padding-bottom: 2px; border-right-width: 1px; - border-right-color: #CCC; + border-right-color: #BBB; border-right-style: solid; border-left-width: 1px; - border-left-color: #CCC; + border-left-color: #BBB; border-left-style: solid; border-top-width: 1px; - border-top-color: #CCC; + border-top-color: #BBB; border-top-style: solid; } div.liste_titre_bydiv { box-shadow: none; border-collapse: collapse; display: table; - padding: 2px 2px 2px 0; + padding: 2px 0px 2px 0; + box-shadow: 2px 2px 4px #CCC; + width: calc(100% - 1px); /* 1px more, i don't know why */ } tr.liste_titre, tr.liste_titre_sel, form.liste_titre, form.liste_titre_sel, table.dataTable.tr { From bde7279aa1f8ea98612a7893b5d6952a2622878c Mon Sep 17 00:00:00 2001 From: aspangaro Date: Fri, 9 Oct 2015 13:00:51 +0200 Subject: [PATCH 056/297] Review by Rdoursenaud. Tkanks --- htdocs/install/mysql/migration/3.9.0-4.0.0.sql | 2 +- htdocs/install/mysql/tables/llx_establishment.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 6120a946ec3c3..5f75235885897 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 @@ -83,7 +83,7 @@ CREATE TABLE IF NOT EXISTS llx_establishment ( fk_user_mod integer NOT NULL, datec datetime NOT NULL, tms timestamp NOT NULL, - statut tinyint DEFAULT 1, + status tinyint DEFAULT 1, ) ENGINE=InnoDB; ALTER TABLE llx_user ADD COLUMN employee tinyint DEFAULT 0 AFTER ref_int; diff --git a/htdocs/install/mysql/tables/llx_establishment.sql b/htdocs/install/mysql/tables/llx_establishment.sql index 2f5c86510e08a..517464588a48a 100644 --- a/htdocs/install/mysql/tables/llx_establishment.sql +++ b/htdocs/install/mysql/tables/llx_establishment.sql @@ -36,6 +36,6 @@ CREATE TABLE IF NOT EXISTS llx_establishment ( fk_user_mod integer NOT NULL, datec datetime NOT NULL, tms timestamp NOT NULL, - statut tinyint DEFAULT 1, + status tinyint DEFAULT 1, ) ENGINE=InnoDB; From 82428fea689b7ad20d0700447b0ebdd15fbe6d21 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 9 Oct 2015 13:01:50 +0200 Subject: [PATCH 057/297] NEW: Only arrow of current sorted field is visible into table views. This save a lot of spaces. You can click on the column title to sort. This make clickable area larger and click to sort is easier. --- htdocs/core/lib/functions.lib.php | 43 +++++++++++++++++++++---------- htdocs/societe/list.php | 7 ----- 2 files changed, 29 insertions(+), 21 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 81f1468338385..faa7c5ee6c246 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -2669,7 +2669,8 @@ function getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $m $sortorder=strtoupper($sortorder); $out=''; - + $sortimg=''; + $tag='th'; if ($thead==2) $tag='div'; @@ -2678,25 +2679,33 @@ function getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $m if ($field && ($sortfield == $field || $sortfield == preg_replace("/^[^\.]+\./","",$field))) $out.= '<'.$tag.' class="'.$prefix.'liste_titre_sel" '. $moreattrib.'>'; else $out.= '<'.$tag.' class="'.$prefix.'liste_titre" '. $moreattrib.'>'; - if (! empty($conf->dol_optimize_smallscreen) && empty($thead) && $field) // If this is a sort field + if (empty($thead) && $field) // If this is a sort field { $options=preg_replace('/sortfield=([a-zA-Z0-9,\s\.]+)/i','',$moreparam); $options=preg_replace('/sortorder=([a-zA-Z0-9,\s\.]+)/i','',$options); $options=preg_replace('/&+/i','&',$options); if (! preg_match('/^&/',$options)) $options='&'.$options; - if ($sortorder == 'DESC' ) $out.= ''; - if ($sortorder == 'ASC' ) $out.= ''; + if ($field != $sortfield) + { + if ($sortorder == 'DESC') $out.= ''; + if ($sortorder == 'ASC' || ! $sortorder) $out.= ''; + } + else + { + if ($sortorder == 'DESC' || ! $sortorder) $out.= ''; + if ($sortorder == 'ASC') $out.= ''; + } } $out.=$name; - if (! empty($conf->dol_optimize_smallscreen) && empty($thead) && $field) // If this is a sort field + if (empty($thead) && $field) // If this is a sort field { $out.=''; } - if (empty($conf->dol_optimize_smallscreen) && empty($thead) && $field) // If this is a sort field + if (empty($thead) && $field) // If this is a sort field { $options=preg_replace('/sortfield=([a-zA-Z0-9,\s\.]+)/i','',$moreparam); $options=preg_replace('/sortorder=([a-zA-Z0-9,\s\.]+)/i','',$options); @@ -2704,27 +2713,33 @@ function getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $m if (! preg_match('/^&/',$options)) $options='&'.$options; //print " "; - $out.= ''; + $sortimg.= ''; + $sortimg.= ''; if (! $sortorder || $field != $sortfield) { - $out.= ''.img_down("A-Z",0).''; - $out.= ''.img_up("Z-A",0).''; + //$out.= ''.img_down("A-Z",0).''; + //$out.= ''.img_up("Z-A",0).''; } else { if ($sortorder == 'DESC' ) { - $out.= ''.img_down("A-Z",0).''; - $out.= ''.img_up("Z-A",1).''; + //$out.= ''.img_down("A-Z",0).''; + //$out.= ''.img_up("Z-A",1).''; + $sortimg.= img_up("Z-A",0); } if ($sortorder == 'ASC' ) { - $out.= ''.img_down("A-Z",1).''; - $out.= ''.img_up("Z-A",0).''; + //$out.= ''.img_down("A-Z",1).''; + //$out.= ''.img_up("Z-A",0).''; + $sortimg.= img_down("A-Z",0); } } - $out.= ''; + $sortimg.= ''; } + + $out.=$sortimg; + $out.=''; return $out; diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index 5e73552e231ee..80e4c553dc1ad 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -333,13 +333,6 @@ $moreforfilter.=$langs->trans('SalesRepresentatives'). ': '; $moreforfilter.=$htmlother->select_salesrepresentatives($search_sale,'search_sale',$user); $moreforfilter.=''; - } - if ($moreforfilter) - { - print ''; - print ''; } */ if (! empty($moreforfilter)) From 497c751fb9e8a740c70735d3e6671558a593963c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 9 Oct 2015 16:24:42 +0200 Subject: [PATCH 058/297] Fix: remove debugging leftover --- htdocs/societe/class/societe.class.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 11f29f7908946..af54c7b874245 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -3386,8 +3386,6 @@ public function setCategories($categories, $type) // Diff if (is_array($existing)) { - var_dump($existing); - var_dump($categories); $to_del = array_diff($existing, $categories); $to_add = array_diff($categories, $existing); } else { From f29c03c9223592bfb7b6869b54f919d12a36577e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 9 Oct 2015 16:35:14 +0200 Subject: [PATCH 059/297] Start to work on a multiselect component to select which fields to show into dolibarr lists. --- htdocs/core/class/html.form.class.php | 96 +++++++++++++++++++++++--- htdocs/societe/list.php | 48 +++++++++---- htdocs/theme/eldy/img/list.png | Bin 0 -> 83 bytes htdocs/theme/eldy/style.css.php | 55 +++++++++++++++ htdocs/theme/md/img/list.png | Bin 0 -> 83 bytes 5 files changed, 177 insertions(+), 22 deletions(-) create mode 100644 htdocs/theme/eldy/img/list.png create mode 100644 htdocs/theme/md/img/list.png diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 61afec22569e3..52b4290e83da5 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -4591,34 +4591,36 @@ static function multiselectarray($htmlname, $array, $selected=array(), $key_in_l { global $conf, $langs; + $out = ''; + // Add code for jquery to use multiselect if (! empty($conf->global->MAIN_USE_JQUERY_MULTISELECT) || defined('REQUIRE_JQUERY_MULTISELECT')) { $tmpplugin=empty($conf->global->MAIN_USE_JQUERY_MULTISELECT)?constant('REQUIRE_JQUERY_MULTISELECT'):$conf->global->MAIN_USE_JQUERY_MULTISELECT; - print ' + $out.=' + + '; + return $out; + } /** * Render list of categories linked to object with id $id and type $type diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index 80e4c553dc1ad..501e54cce11ca 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -208,9 +208,9 @@ $sql = "SELECT s.rowid, s.nom as name, s.barcode, s.town, s.datec, s.code_client, s.code_fournisseur, "; $sql.= " st.libelle as stcomm, s.prefix_comm, s.client, s.fournisseur, s.canvas, s.status as status,"; -$sql.= " s.siren as idprof1, s.siret as idprof2, ape as idprof3, idprof4 as idprof4"; -$sql.= ",s.fk_pays"; -$sql.= ",typent.code as typent_code"; +$sql.= " s.siren as idprof1, s.siret as idprof2, ape as idprof3, idprof4 as idprof4,"; +$sql.= " s.fk_pays, s.tms as date_update, s.datec as date_creation,"; +$sql.= " typent.code as typent_code"; // We'll need these fields in order to filter by sale (including the case where the user can only see his prospects) if ($search_sale) $sql .= ", sc.fk_soc, sc.fk_user"; // We'll need these fields in order to filter by categ @@ -345,10 +345,29 @@ print ''; } + // Define list of fields to show into list + $arrayfields=array( + 's.nom'=>array('label'=>$langs->trans("Company"), 'checked'=>1), + 's.barcode'=>array('label'=>$langs->trans("BarCode"), 'checked'=>1, 'cond'=>(! empty($conf->barcode->enabled))), + 's.town'=>array('label'=>$langs->trans("Town"), 'checked'=>1), + 'country.code_iso'=>array('label'=>$langs->trans("Country"), 'checked'=>1), + 'typent.code'=>array('label'=>$langs->trans("ThirdPartyType"), 'checked'=>1), + 's.siren'=>array('label'=>$langs->trans("ProfId1Short"), 'checked'=>1), + 's.siret'=>array('label'=>$langs->trans("ProfId2Short"), 'checked'=>1), + 's.ape'=>array('label'=>$langs->trans("ProfId3Short"), 'checked'=>1), + 's.idprof4'=>array('label'=>$langs->trans("ProfId4Short"), 'checked'=>1), + 's.status'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>200), + 's.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500), + 's.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), + ); + if ($conf->global->MAIN_FEATURES_LEVEL >= 2) + { + $selectotherfields=$form->multiSelectArrayWithCheckbox('selectotherfields', $arrayfields); + } + print '
'; - print $moreforfilter; - print '
'; - - // Lines of titles - print ''; + + print ''; print_liste_field_titre($langs->trans("Company"),$_SERVER["PHP_SELF"],"s.nom","",$param,"",$sortfield,$sortorder); if (! empty($conf->barcode->enabled)) print_liste_field_titre($langs->trans("BarCode"), $_SERVER["PHP_SELF"], "s.barcode",$param,'','',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Town"),$_SERVER["PHP_SELF"],"s.town","",$param,'',$sortfield,$sortorder); @@ -363,7 +382,7 @@ $reshook=$hookmanager->executeHooks('printFieldListTitle',$parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; print_liste_field_titre($langs->trans("Status"),$_SERVER["PHP_SELF"],"s.status","",$param,'align="right"',$sortfield,$sortorder); - print_liste_field_titre('',$_SERVER["PHP_SELF"],"",'','','',$sortfield,$sortorder,'maxwidthsearch '); + print_liste_field_titre($selectotherfields, $_SERVER["PHP_SELF"],"",'','','align="right"',$sortfield,$sortorder,'maxwidthsearch '); print "\n"; // Fields title search @@ -372,18 +391,19 @@ print ''; print ''; if (! empty($search_nom_only) && empty($search_nom)) $search_nom=$search_nom_only; - print ''; + + print ''; print ''; // Barcode if (! empty($conf->barcode->enabled)) { print ''; } // Town print ''; //Country print ''; // IdProf1 print ''; // IdProf2 print ''; // IdProf3 print ''; // IdProf4 print ''; // Type (customer/prospect/supplier) print ''; print ''; - // Statut - print ''; + // Status + print ''; print "
'; - print ''; + print ''; print ''; - print ''; + print ''; print ''; @@ -395,19 +415,19 @@ print ''; - print ''; + print ''; print ''; - print ''; + print ''; print ''; - print ''; + print ''; print ''; - print ''; + print ''; print ''; diff --git a/htdocs/theme/eldy/img/list.png b/htdocs/theme/eldy/img/list.png new file mode 100644 index 0000000000000000000000000000000000000000..f5df34a3bc9f8393c23f35e25fb7b18b4b51654b GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mq&!_5Ln;`PC2l1!2{fHxmMCBf f>~dQxy@i3{%~LbRV2?L>KvfK$u6{1-oD!M<+N2cH literal 0 HcmV?d00001 diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 9f5376947da40..2eddc0eba237a 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -3487,6 +3487,61 @@ } +/* ============================================================================== */ +/* Multiselect with checkbox */ +/* ============================================================================== */ + +dl.dropdown { + margin:0px; + padding:0px; +} +.dropdown dd, .dropdown dt { + margin:0px; + padding:0px; +} +.dropdown ul { + margin: -1px 0 0 0; + text-align: left; +} +.dropdown dd { + position:relative; +} +.dropdown dt a { + display:block; + overflow: hidden; + border:0; +} +.dropdown dt a span, .multiSel span { + cursor:pointer; + display:inline-block; + padding: 0 3px 2px 0; +} +.dropdown dd ul { + background-color: #FFF; + border: 1px solid #888; + display:none; + right:0px; /* pop is align on right */ + padding: 2px 15px 2px 5px; + position:absolute; + top:2px; + list-style:none; + max-height: 200px; + overflow: auto; +} +.dropdown span.value { + display:none; +} +.dropdown dd ul li { + white-space: nowrap; +} +.dropdown dd ul li a { + padding:5px; + display:block; +} +.dropdown dd ul li a:hover { + background-color:#fff; +} + /* ============================================================================== */ /* JMobile */ diff --git a/htdocs/theme/md/img/list.png b/htdocs/theme/md/img/list.png new file mode 100644 index 0000000000000000000000000000000000000000..f5df34a3bc9f8393c23f35e25fb7b18b4b51654b GIT binary patch literal 83 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+0wn(&ce?|mq&!_5Ln;`PC2l1!2{fHxmMCBf f>~dQxy@i3{%~LbRV2?L>KvfK$u6{1-oD!M<+N2cH literal 0 HcmV?d00001 From 53e4cb3af926bf52c06bf3a2faee75346ae270b7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 9 Oct 2015 17:21:38 +0200 Subject: [PATCH 060/297] Several fix in CSS --- htdocs/theme/eldy/img/sort_asc.png | Bin 256 -> 248 bytes htdocs/theme/eldy/img/sort_desc.png | Bin 264 -> 260 bytes htdocs/theme/eldy/style.css.php | 10 +- htdocs/theme/md/style.css.php | 150 ++++++++++++++++++++++------ 4 files changed, 123 insertions(+), 37 deletions(-) diff --git a/htdocs/theme/eldy/img/sort_asc.png b/htdocs/theme/eldy/img/sort_asc.png index aca0f6eb77aa8b601a073daa9a94bfa9bd5cc7e8..82b250c72bd73cedf7196138285647383a216300 100644 GIT binary patch delta 177 zcmV;i08ama0{8)tB#|*Le+mf>G6?Z8qBsBm0EJ0JK~y-)?b4wQ!cY{3(Q^@ykT3;~ z88D22M5EaQ24D{qiy-j`3@PSfsA(Er+SHKrPd@kVQ7+Inu)wte)m<>_CxY!z;nh-wZQEV^ f@24HH5gTA1#Wet2_%IXM00000NkvXXu0mjf_YO-w delta 183 zcmV;o07(D%0e}LKBnkm@Qb$4nuFf3kks&dE1p^K=E9l_^c>n+afJsC_R5;7+(lHJ} zK@fo9Sp|v2DRj=DaSWwe?H lro}RMm;UG8zJi({KO)0Fg;VK~y-)?bIO-gFq04;r}7pgoIPn z^$ayV2C}-Ed(Z>)9#vcfiAU5BFoRh|rwdI;ieQpwcHew*WM-^22`kQy?bzQiNx7t6 zQs<+=u3vW|n1IIwdjk3yGYjAer~}jh=V(9n r8NfR*0L5%~0d@dNAf4-Kv&V4+V3ZPE5OdhM00000NkvXXu0mjf9C=JO delta 191 zcmV;w06_nQ0*C^TBnkm@Qb$4nuFf3kks&dE1p^K>AJ9(5jQ{`uh)G02R5;7+)G-bL zQ5Xc^Sp|v2DRj=DaSWwe?H(M!Jyb5D)GIWynoqNpJeFh=ik;+dUS_`XRY+GEq{H-B zkNpx`CaII$3Rfpt6;~+T2nXdHF)8g{VZj{NC+LF3tIa#C!tM#%H}79#!4#(kI%D=K tuHS|QYuvGE>wba_vBkKpTm9|l_yFr5ciURC7Lxz~002ovPDHLkV1mzcQkDP! diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 2eddc0eba237a..62707beec64d3 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -537,7 +537,7 @@ float: none; vertical-align: top; } -#id-right { /* This must stay id-right ant not be replaced with echo $right */ +#id-right { /* This must stay id-right and not be replaced with echo $right */ width: 100%; } #id-left { @@ -1894,7 +1894,7 @@ table.border, table.dataTable, .table-border, .table-border-col, .table-key-border-col, .table-val-border-col, div.border { border: 1px solid #E0E0E0; - border-collapse: collapse; + border-collapse: collapse !important; padding: 1px 2px 1px 3px; /* t r b l */ } @@ -3362,7 +3362,7 @@ background-color: #FFF !important; border-radius: inherit !important; } -.paging_full_numbers a.paginate_button_disabled:hover { +.paging_full_numbers a.paginate_button_disabled:hover, .paging_full_numbers a.disabled:hover { background-color: #FFF !important; } .paginate_button, .paginate_active { @@ -3390,7 +3390,9 @@ div.dataTables_length select { background: #fff; } - +.dataTables_wrapper .dataTables_paginate { + padding-top: 0px !important; +} /* ============================================================================== */ /* Select2 */ diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 0db79b5470aab..336505215b5b4 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -456,6 +456,10 @@ div.divsearchfield { float: ; margin-: 12px; + margin-: 2px; + margin-top: 3px; + margin-bottom: 3px; + padding-left: 2px; } div.confirmmessage { padding-top: 6px; @@ -1788,7 +1792,7 @@ table.border, table.dataTable, .table-border, .table-border-col, .table-key-border-col, .table-val-border-col, div.border { border: 1px solid #f4f4f4; - border-collapse: collapse; + border-collapse: collapse !important; padding: 1px 2px 1px 3px; /* t r b l */ } @@ -1822,7 +1826,7 @@ /* Main boxes */ -table.noborder, table.formdoc, div.noborder { +table.liste, table.noborder, table.formdoc, div.noborder { width: 100%; border-collapse: separate !important; @@ -1856,6 +1860,9 @@ height: 26px; } +table.liste th, table.noborder th { + padding: 5px 2px 5px 3px; /* t r b l */ +} table.noborder th, table.noborder td, div.noborder form, div.noborder form div { padding: 1px 2px 1px 3px; /* t r b l */ } @@ -1883,35 +1890,9 @@ border-right-style: solid !important; } -/* For lists */ - -table.liste { - width: 100%; - border-collapse: collapse; - border-top-color: #FEFEFE; - - border-right-width: 1px; - border-right-color: #CCC; - border-right-style: solid; - -/* - border-bottom-width: 1px; - border-bottom-color: #BBBBBB; - border-bottom-style: solid; -*/ - border-left-width: 1px; - border-left-color: #CCC; - border-left-style: solid; - - margin-bottom: 2px; - margin-top: 0px; - - -moz-box-shadow: 0px 3px 4px #CCC; - -webkit-box-shadow: 0px 3px 4px #CC; - box-shadow: 0px 3px 4px #CCC; -} -table.liste td { - padding-right: 2px; +/* For table with no filter before */ +table.listwithfilterbefore { + border-top: none !important; } .tagtable, .table-border { display: table; } @@ -2050,6 +2031,9 @@ div.pagination li.paginationafterarrows { margin-left: 10px; } +.paginationatbottom { + margin-top: 9px; +} /* Prepare to remove class pair - impair .noborder > tbody > tr:nth-child(even) td { @@ -2139,6 +2123,29 @@ } div.liste_titre { min-height: 26px !important; /* We cant use height because it's a div and it should be higher if content is more. but min-height doe not work either for div */ + + padding-top: 2px; + padding-bottom: 2px; + + border-right-width: 1px; + border-right-color: #BBB; + border-right-style: solid; + + border-left-width: 1px; + border-left-color: #BBB; + border-left-style: solid; + + border-top-width: 1px; + border-top-color: #BBB; + border-top-style: solid; +} +div.liste_titre_bydiv { + box-shadow: none; + border-collapse: collapse; + display: table; + padding: 2px 0px 2px 0; + box-shadow: 2px 2px 4px #CCC; + width: calc(100% - 1px); /* 1px more, i don't know why */ } tr.liste_titre, tr.liste_titre_sel, form.liste_titre, form.liste_titre_sel, table.dataTable.tr { @@ -2425,7 +2432,12 @@ margin-bottom: 2px; margin-top: 2px; } -.photointooltip { +.photowithmargin { +/* -webkit-box-shadow: 0px 0px 3px #777; + -moz-box-shadow: 0px 0px 3px #777; + box-shadow: 0px 0px 3px #777;*/ +} +.photointoolitp { margin-top: 8px; float: left; /*text-align: center; */ @@ -3221,7 +3233,7 @@ background-color: #FFF !important; border-radius: inherit !important; } -.paging_full_numbers a.paginate_button_disabled:hover { +.paging_full_numbers a.paginate_button_disabled:hover, .paging_full_numbers a.disabled:hover { background-color: #FFF !important; } .paginate_button, .paginate_active { @@ -3242,10 +3254,26 @@ background-image: none; } +div.dataTables_length { + float: right !important; + padding-left: 8px; +} +div.dataTables_length select { + background: #fff; +} +.dataTables_wrapper .dataTables_paginate { + padding-top: 0px !important; +} + + /* ============================================================================== */ /* Select2 */ /* ============================================================================== */ +.selectoptiondisabledwhite { + background: #FFFFFF !important; +} + .select2-choice, .select2-drop.select2-drop-above.select2-drop-active, .select2-container-active .select2-choice, @@ -3333,6 +3361,62 @@ } +/* ============================================================================== */ +/* Multiselect with checkbox */ +/* ============================================================================== */ + +dl.dropdown { + margin:0px; + padding:0px; +} +.dropdown dd, .dropdown dt { + margin:0px; + padding:0px; +} +.dropdown ul { + margin: -1px 0 0 0; + text-align: left; +} +.dropdown dd { + position:relative; +} +.dropdown dt a { + display:block; + overflow: hidden; + border:0; +} +.dropdown dt a span, .multiSel span { + cursor:pointer; + display:inline-block; + padding: 0 3px 2px 0; +} +.dropdown dd ul { + background-color: #FFF; + border: 1px solid #888; + display:none; + right:0px; /* pop is align on right */ + padding: 2px 15px 2px 5px; + position:absolute; + top:2px; + list-style:none; + max-height: 200px; + overflow: auto; +} +.dropdown span.value { + display:none; +} +.dropdown dd ul li { + white-space: nowrap; +} +.dropdown dd ul li a { + padding:5px; + display:block; +} +.dropdown dd ul li a:hover { + background-color:#fff; +} + + /* ============================================================================== */ /* JMobile */ /* ============================================================================== */ From b785db86a8c5ed58fec47dcc24dedf0d34eb2a26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Fri, 9 Oct 2015 19:00:50 +0200 Subject: [PATCH 061/297] Fix unittests regression Introduced by incomplete renaming of modSyncSupplierWebServices to modWebServicesClient in 4b103ba8ce6c2da955ab8ecb17258b5ba0f52b40 --- htdocs/core/modules/modWebServicesClient.class.php | 2 +- htdocs/install/filelist.xml | 2 +- test/phpunit/ModulesTest.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/modules/modWebServicesClient.class.php b/htdocs/core/modules/modWebServicesClient.class.php index dd13d8920dbc4..307f3420640a3 100644 --- a/htdocs/core/modules/modWebServicesClient.class.php +++ b/htdocs/core/modules/modWebServicesClient.class.php @@ -18,7 +18,7 @@ /** * \defgroup webservices Module webservices * \brief Module to enable client for supplier WebServices - * \file htdocs/core/modules/modSyncSupplierWebServices.class.php + * \file htdocs/core/modules/modWebServicesClient.class.php * \ingroup webservices * \brief File to describe client for supplier webservices module */ diff --git a/htdocs/install/filelist.xml b/htdocs/install/filelist.xml index fb931f9fcdc5f..6e5416e24811b 100644 --- a/htdocs/install/filelist.xml +++ b/htdocs/install/filelist.xml @@ -6873,7 +6873,7 @@ 69982f8171837cd8669bfe9c2f08dc8f ddf6dfeb77c98411b4d5434f20c24483 c23010fa68c5996cb5977f84a6bb7ceb -90a300e9bd857966226c68dca8660456 +822961d86ae558588632b3b08c085b89 d41d8cd98f00b204e9800998ecf8427e b4e9f07aa5268af49d3bb9429719b201 8293bd60fe13ac64c22f8500b346821c diff --git a/test/phpunit/ModulesTest.php b/test/phpunit/ModulesTest.php index 3c8b96ffe2add..9210ae1a46a50 100755 --- a/test/phpunit/ModulesTest.php +++ b/test/phpunit/ModulesTest.php @@ -133,7 +133,7 @@ public function testModulesInit() 'Facture','Fckeditor','Ficheinter','Fournisseur','FTP','GeoIPMaxmind','Gravatar','Holiday','Import','Label','Ldap', 'Mailing','MailmanSpip','Margin', 'Notification','OpenSurvey','Paybox','Paypal','Prelevement','Product','ProductBatch','Projet','Propale', - 'Salaries','Service','Skype','Societe','Stock','SyncSupplierWebServices','Syslog','Tax','User','WebServices','Workflow'); + 'Salaries','Service','Skype','Societe','Stock','WebServicesClient','Syslog','Tax','User','WebServices','Workflow'); foreach($modulelist as $modlabel) { require_once(DOL_DOCUMENT_ROOT.'/core/modules/mod'.$modlabel.'.class.php'); From a1d37f92cbfd399045814af5bff71099c03fe26d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 9 Oct 2015 20:00:43 +0200 Subject: [PATCH 062/297] Several fix in CSS --- htdocs/adherents/stats/byproperties.php | 2 +- htdocs/adherents/stats/geo.php | 2 +- htdocs/adherents/stats/index.php | 12 +++-- htdocs/comm/propal/stats/index.php | 12 +++-- htdocs/commande/list.php | 6 +-- htdocs/commande/stats/index.php | 13 +++-- htdocs/compta/facture.php | 14 ++--- htdocs/compta/facture/stats/index.php | 13 +++-- htdocs/contrat/card.php | 13 ++--- htdocs/contrat/list.php | 52 +++++++++++++++---- htdocs/product/stats/commande.php | 6 ++- htdocs/product/stats/commande_fournisseur.php | 6 ++- htdocs/product/stats/contrat.php | 8 +-- htdocs/product/stats/facture.php | 11 ++-- htdocs/product/stats/facture_fournisseur.php | 6 ++- htdocs/product/stats/propal.php | 6 ++- htdocs/projet/stats/index.php | 14 +++-- htdocs/theme/eldy/style.css.php | 11 +++- htdocs/theme/md/style.css.php | 12 +++-- 19 files changed, 143 insertions(+), 76 deletions(-) diff --git a/htdocs/adherents/stats/byproperties.php b/htdocs/adherents/stats/byproperties.php index 6f5edf529d9f4..dcf77a2dbad45 100644 --- a/htdocs/adherents/stats/byproperties.php +++ b/htdocs/adherents/stats/byproperties.php @@ -116,7 +116,7 @@ } // Print array -print ''; +print '
'; print ''; print ''; print ''; diff --git a/htdocs/adherents/stats/geo.php b/htdocs/adherents/stats/geo.php index 3b2ca4c3ecd93..f8b6a54f7b72e 100644 --- a/htdocs/adherents/stats/geo.php +++ b/htdocs/adherents/stats/geo.php @@ -282,7 +282,7 @@ if ($mode) { // Print array / Affiche le tableau - print '
'.$langs->trans("Nature").''.$langs->trans("NbOfMembers").'
'; + print '
'; print ''; print ''; if ($label2) print ''; diff --git a/htdocs/adherents/stats/index.php b/htdocs/adherents/stats/index.php index a3c8fd69aad80..43b994adafeb6 100644 --- a/htdocs/adherents/stats/index.php +++ b/htdocs/adherents/stats/index.php @@ -167,8 +167,8 @@ $data = $stats->getAllByYear(); -print '
'.$label.''.$label2.'
'; -print ''; +print '
'; +print ''; print ''; print ''; print ''; @@ -176,14 +176,15 @@ print ''; $oldyear=0; +$var=false; foreach ($data as $val) { $year = $val['year']; - print $avg; while ($oldyear > $year+1) { // If we have empty year $oldyear--; - print ''; + $var=!$var; + print ''; print ''; print ''; } - print ''; + $var=!$var; + print ''; print ''; print ''; - // Statut - print ''; print '
'.$langs->trans("Year").''.$langs->trans("NbOfSubscriptions").''.$langs->trans("AmountTotal").'
'; print ''; print $oldyear; @@ -194,7 +195,8 @@ print '0
'; //print ''; print $year; diff --git a/htdocs/comm/propal/stats/index.php b/htdocs/comm/propal/stats/index.php index e99c7122a10dc..5b45020b7e1a4 100644 --- a/htdocs/comm/propal/stats/index.php +++ b/htdocs/comm/propal/stats/index.php @@ -234,7 +234,7 @@ // Show filter box print ''; print ''; - print ''; + print '
'; print ''; // Company print '"; // Name - print ''; + print ''; // URL - print ''; + print ''; // Offset TZ - print ''; + print ''; // Color (Possible colors are limited by Google) print ''; print ""; $i++; @@ -193,6 +199,7 @@ print '
'.$langs->trans("Filter").'
'.$langs->trans("ThirdParty").''; @@ -262,8 +262,8 @@ print '

'; //} -print ''; -print ''; +print '
'; +print ''; print ''; print ''; print ''; @@ -274,13 +274,15 @@ print ''; $oldyear=0; +$var=true; foreach ($data as $val) { $year = $val['year']; while (! empty($year) && $oldyear > $year+1) { // If we have empty year $oldyear--; - print ''; + $var=!$var; + print ''; print ''; print ''; print ''; @@ -290,7 +292,7 @@ print ''; print ''; } - print ''; + print ''; print ''; print ''; print ''; diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 200f9e66362ab..29d58eaf46759 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -273,15 +273,15 @@ $moreforfilter.=$formother->select_salesrepresentatives($search_sale, 'search_sale', $user, 0, 1, 'maxwidth300'); $moreforfilter.=''; } - // If the user can view prospects other than his' - if ($user->rights->societe->client->voir || $socid) + // If the user can view other users + if ($user->rights->user->user->lire) { $moreforfilter.='
'; $moreforfilter.=$langs->trans('LinkedToSpecificUsers'). ': '; $moreforfilter.=$form->select_dolusers($search_user, 'search_user', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); $moreforfilter.='
'; } - // If the user can view prospects other than his' + // If the user can view categories or products if ($conf->categorie->enabled && $user->rights->produit->lire) { include_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; diff --git a/htdocs/commande/stats/index.php b/htdocs/commande/stats/index.php index c4d48d8f72e05..04cfad1732df6 100644 --- a/htdocs/commande/stats/index.php +++ b/htdocs/commande/stats/index.php @@ -250,7 +250,7 @@ // Show filter box print ''; print ''; - print '
'.$langs->trans("Year").''.$langs->trans("NbOfProposals").'%
0?'&userid='.$userid:'').'">'.$oldyear.'0
0?'&userid='.$userid:'').'">'.$year.''.$val['nb'].''.round($val['nb_diff']).'
'; + print '
'; print ''; // Company print ''; } diff --git a/htdocs/core/tpl/objectline_create.tpl.php b/htdocs/core/tpl/objectline_create.tpl.php index 938a615ea77f0..64c49894de114 100644 --- a/htdocs/core/tpl/objectline_create.tpl.php +++ b/htdocs/core/tpl/objectline_create.tpl.php @@ -114,12 +114,12 @@ } // Free line - echo ''; + echo ''; // Show radio free line if ($forceall >= 0 && (! empty($conf->product->enabled) || ! empty($conf->service->enabled))) { echo '
'.$langs->trans("Filter").'
'.$langs->trans("ThirdParty").''; @@ -275,8 +275,8 @@ print '

'; //} -print ''; -print ''; +print '
'; +print ''; print ''; print ''; print ''; @@ -287,13 +287,15 @@ print ''; $oldyear=0; +$var=true; foreach ($data as $val) { $year = $val['year']; while (! empty($year) && $oldyear > $year+1) { // If we have empty year $oldyear--; - print ''; + $var=!$var; + print ''; print ''; print ''; @@ -305,7 +307,8 @@ print ''; } - print ''; + $var=!$var; + print ''; print ''; print ''; print ''; diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index 5c19e054fd092..c736d4cd0032e 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -2973,16 +2973,16 @@ print '"; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index a319b193662e9..627a9aaffca6d 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -858,27 +858,40 @@ function dol_get_fiche_end($notab=0) */ function dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlright='') { - global $conf, $form, $user; + global $conf, $form, $user, $langs; //$showlogo=$object->logo; $showlogo=1; $showbarcode=empty($conf->barcode->enabled)?0:1; if (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->barcode->lire_advance)) $showbarcode=0; - + $modulepart='societe'; + if ($object->element == 'contact') $modulepart='contact'; + if ($object->element == 'member') $modulepart='memberphoto'; + if ($object->element == 'user') $modulepart='userphoto'; + print '
'; //$morehtmlleft='
'.img_picto('', 'title_companies', '', '').'
'; - if ($showlogo) $morehtmlleft.='
'.$form->showphoto('societe',$object,0,0,0,'photoref').'
'; + if ($showlogo) $morehtmlleft.='
'.$form->showphoto($modulepart,$object,0,0,0,'photoref').'
'; //if ($showlogo) $morehtmlleft.='
'.$form->showphoto('societe',$object,0,0,0,'photoref').'
'; if ($showbarcode) $morehtmlleft.='
'.$form->showbarcode($object).'
'; - if (! empty($conf->use_javascript_ajax) && $user->rights->societe->creer && ! empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) { - $morehtmlright.=ajax_object_onoff($object, 'status', 'status', 'InActivity', 'ActivityCeased'); - } else { - $morehtmlright.=$object->getLibStatut(2); + if ($object->element == 'societe') + { + if (! empty($conf->use_javascript_ajax) && $user->rights->societe->creer && ! empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) { + $morehtmlright.=ajax_object_onoff($object, 'status', 'status', 'InActivity', 'ActivityCeased'); + } else { + $morehtmlright.=$object->getLibStatut(2); + } } if (! empty($object->name_nalias)) $morehtmlref.='
'.$object->name_alias.'
'; $morehtmlref.='
'; $morehtmlref.=$object->getBannerAddress('refaddress',$object); $morehtmlref.='
'; + if (! empty($conf->global->MAIN_SHOW_TECHNICAL_ID) && in_array($object->element, array('societe', 'contact', 'member'))) + { + $morehtmlref.='
'; + $morehtmlref.=$langs->trans("TechnicalID").': '.$object->id; + $morehtmlref.='
'; + } print $form->showrefnav($object, $paramid, $morehtml, $shownav, $fieldid, $fieldref, $morehtmlref, $moreparam, $nodbprefix, $morehtmlleft, $morehtmlright); print '
'; print '
'; @@ -1484,12 +1497,13 @@ function dol_print_skype($skype,$cid=0,$socid=0,$addlink=0,$max=64) * @param string $country Country code to use for formatting * @param int $cid Id of contact if known * @param int $socid Id of third party if known - * @param string $addlink ''=no link to create action, 'AC_TEL'=add link to clicktodial (if module enabled) and add link to create event (if conf->global->AGENDA_ADDACTIONFORPHONE set) + * @param string $addlink ''=no link to create action, 'AC_TEL'=add link to clicktodial (if module enabled) and add link to create event (if conf->global->AGENDA_ADDACTIONFORPHONE set) * @param string $separ Separation between numbers for a better visibility example : xx.xx.xx.xx.xx * @param string $withpicto Show picto + * @param string $titlealt Text to show on alt * @return string Formated phone number */ -function dol_print_phone($phone,$country='',$cid=0,$socid=0,$addlink='',$separ=" ",$withpicto='') +function dol_print_phone($phone,$country='',$cid=0,$socid=0,$addlink='',$separ=" ",$withpicto='',$titlealt='') { global $conf,$user,$langs,$mysoc; @@ -1569,7 +1583,11 @@ function dol_print_phone($phone,$country='',$cid=0,$socid=0,$addlink='',$separ=" } } - return '
'.($withpicto?img_picto(($withpicto=='fax'?$langs->trans("Fax"):$langs->trans("Phone")), 'object_'.($withpicto=='fax'?'phoning_fax':'phoning').'.png').' ':'').$newphone.'
'; + if (empty($titlealt)) + { + $titlealt=($withpicto=='fax'?$langs->trans("Fax"):$langs->trans("Phone")); + } + return '
'.($withpicto?img_picto($titlealt, 'object_'.($withpicto=='fax'?'phoning_fax':'phoning').'.png').' ':'').$newphone.'
'; } /** diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index 0bd4fa7431b5d..ce3f8edc0d8e6 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -97,6 +97,7 @@ DolibarrHasDetectedError=Dolibarr has detected a technical error InformationToHelpDiagnose=This is information that can help diagnostic MoreInformation=More information TechnicalInformation=Technical information +TechnicalID=Technical ID NotePublic=Note (public) NotePrivate=Note (private) PrecisionUnitIsLimitedToXDecimals=Dolibarr was setup to limit precision of unit prices to %s decimals. diff --git a/htdocs/societe/soc.php b/htdocs/societe/soc.php index 9c8f4c90aa5f2..a603f52e226c7 100644 --- a/htdocs/societe/soc.php +++ b/htdocs/societe/soc.php @@ -1447,6 +1447,14 @@ print '
'.$langs->trans("Year").''.$langs->trans("NbOfOrders").'%
0?'&userid='.$userid:'').'">'.$oldyear.'0
0?'&userid='.$userid:'').'">'.$year.''.$val['nb'].''.round($val['nb_diff']).''; - print ''; + print '
'; // List of payments already done print ''; - print ''; - print ''; + print ''; + print ''; if (! empty($conf->banque->enabled)) - print ''; - print ''; - print ''; + print ''; + print ''; + print ''; print ''; $var = true; @@ -3033,7 +3033,7 @@ $i ++; } } else { - print ''; + print ''; } // } $db->free($result); diff --git a/htdocs/compta/facture/stats/index.php b/htdocs/compta/facture/stats/index.php index f61e92687f681..2b7e17d936968 100644 --- a/htdocs/compta/facture/stats/index.php +++ b/htdocs/compta/facture/stats/index.php @@ -234,7 +234,7 @@ // Show filter box print ''; print ''; - print '
' . ($object->type == Facture::TYPE_CREDIT_NOTE ? $langs->trans("PaymentsBack") : $langs->trans('Payments')) . '' . $langs->trans('Type') . '' . ($object->type == Facture::TYPE_CREDIT_NOTE ? $langs->trans("PaymentsBack") : $langs->trans('Payments')) . '' . $langs->trans('Type') . '' . $langs->trans('BankAccount') . '' . $langs->trans('Amount') . ' ' . $langs->trans('BankAccount') . '' . $langs->trans('Amount') . ' 
' . $langs->trans("None") . '
' . $langs->trans("None") . '
'; + print '
'; print ''; // Company print '"; From 525f9841faf80f5ff915bbc23c3de24286511a26 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 10 Oct 2015 18:38:22 +0200 Subject: [PATCH 077/297] Fix doxygen --- htdocs/core/class/commonobject.class.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 76fd73a324dcb..a4bacf4d34c73 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -437,10 +437,11 @@ function getFullAddress($withcountry=0,$sep="\n") /** * Return full address of contact * - * @param Societe $object Object Societe or null + * @param string $htmlkey HTML id to make banner content unique + * @param Object $object Object (thirdparty, thirdparty of contact for contact, null for a member) * @return string Full address string */ - function getBannerAddress($htmlkey, $object=null) + function getBannerAddress($htmlkey, $object) { global $conf, $langs; @@ -465,7 +466,7 @@ function getBannerAddress($htmlkey, $object=null) $outdone++; } - if (! in_array($object->country_code,$countriesusingstate) && empty($conf->global->MAIN_FORCE_STATE_INTO_ADDRESS) + if (! in_array($this->country_code,$countriesusingstate) && empty($conf->global->MAIN_FORCE_STATE_INTO_ADDRESS) && ! empty($conf->global->SOCIETE_DISABLE_STATE) && $this->state) { $out.=($outdone?'
':'').$this->state; From 3f8e9bd1810450d05974d770fdf64d8707139273 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 10 Oct 2015 19:24:31 +0200 Subject: [PATCH 078/297] Remove warning --- htdocs/product/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/product/index.php b/htdocs/product/index.php index a8502498e4111..2803c2d06ad73 100644 --- a/htdocs/product/index.php +++ b/htdocs/product/index.php @@ -299,7 +299,7 @@ if (empty($conf->global->PRODUIT_MULTIPRICES)) { print '
'; } From 3fd626705f1ee1419e35a1518e9985d55ddd56c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Wed, 16 Sep 2015 09:37:49 +0200 Subject: [PATCH 079/297] NEW Added doActions hooks to user cards Close #3394 --- htdocs/user/agenda_extsites.php | 104 ++-- htdocs/user/card.php | 812 +++++++++++++++----------------- htdocs/user/clicktodial.php | 30 +- htdocs/user/document.php | 10 +- htdocs/user/ldap.php | 42 +- htdocs/user/note.php | 32 +- htdocs/user/param_ihm.php | 63 ++- htdocs/user/perms.php | 67 +-- 8 files changed, 574 insertions(+), 586 deletions(-) diff --git a/htdocs/user/agenda_extsites.php b/htdocs/user/agenda_extsites.php index cd38d7a2965d8..9325e00ed02e1 100644 --- a/htdocs/user/agenda_extsites.php +++ b/htdocs/user/agenda_extsites.php @@ -66,62 +66,70 @@ if (($fuser->id != $user->id) && (! $user->rights->user->user->lire)) accessforbidden(); - +// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array +$hookmanager->initHooks(array('usercard','globalcard')); /* * Actions */ -if ($actionsave) -{ - $db->begin(); - - $i=1; $errorsaved=0; - $error=0; - $tabparam=array(); - - // Save agendas - while ($i <= $MAXAGENDA) - { - $name=trim(GETPOST('AGENDA_EXT_NAME_'.$id.'_'.$i,'alpha')); - $src=trim(GETPOST('AGENDA_EXT_SRC_'.$id.'_'.$i,'alpha')); - $offsettz=trim(GETPOST('AGENDA_EXT_OFFSETTZ_'.$id.'_'.$i,'alpha')); - $color=trim(GETPOST('AGENDA_EXT_COLOR_'.$id.'_'.$i,'alpha')); - if ($color=='-1') $color=''; - $enabled=trim(GETPOST('AGENDA_EXT_ENABLED_'.$id.'_'.$i,'alpha')); - - if (! empty($src) && ! dol_is_url($src)) - { - setEventMessage($langs->trans("ErrorParamMustBeAnUrl"),'errors'); - $error++; - $errorsaved++; - break; - } - $tabparam['AGENDA_EXT_NAME_'.$id.'_'.$i]=$name; - $tabparam['AGENDA_EXT_SRC_'.$id.'_'.$i]=$src; - $tabparam['AGENDA_EXT_OFFSETTZ_'.$id.'_'.$i]=$offsettz; - $tabparam['AGENDA_EXT_COLOR_'.$id.'_'.$i]=$color; - $tabparam['AGENDA_EXT_ENABLED_'.$id.'_'.$i]=$enabled; +$parameters=array('id'=>$socid); +$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks +if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + +if (empty($reshook)) { + if ($actionsave) { + $db->begin(); + + $i = 1; + $errorsaved = 0; + $error = 0; + $tabparam = array(); + + // Save agendas + while ($i <= $MAXAGENDA) { + $name = trim(GETPOST('AGENDA_EXT_NAME_'.$id.'_'.$i, 'alpha')); + $src = trim(GETPOST('AGENDA_EXT_SRC_'.$id.'_'.$i, 'alpha')); + $offsettz = trim(GETPOST('AGENDA_EXT_OFFSETTZ_'.$id.'_'.$i, 'alpha')); + $color = trim(GETPOST('AGENDA_EXT_COLOR_'.$id.'_'.$i, 'alpha')); + if ($color == '-1') { + $color = ''; + } + $enabled = trim(GETPOST('AGENDA_EXT_ENABLED_'.$id.'_'.$i, 'alpha')); + + if (!empty($src) && !dol_is_url($src)) { + setEventMessage($langs->trans("ErrorParamMustBeAnUrl"), 'errors'); + $error ++; + $errorsaved ++; + break; + } + + $tabparam['AGENDA_EXT_NAME_'.$id.'_'.$i] = $name; + $tabparam['AGENDA_EXT_SRC_'.$id.'_'.$i] = $src; + $tabparam['AGENDA_EXT_OFFSETTZ_'.$id.'_'.$i] = $offsettz; + $tabparam['AGENDA_EXT_COLOR_'.$id.'_'.$i] = $color; + $tabparam['AGENDA_EXT_ENABLED_'.$id.'_'.$i] = $enabled; + + $i ++; + } - $i++; - } + if (!$error) { + $result = dol_set_user_param($db, $conf, $fuser, $tabparam); + if (!$result > 0) { + $error ++; + } + } - if (! $error) - { - $result=dol_set_user_param($db, $conf, $fuser, $tabparam); - if (! $result > 0) $error++; + if (!$error) { + $db->commit(); + setEventMessage($langs->trans("SetupSaved")); + } else { + $db->rollback(); + if (empty($errorsaved)) { + setEventMessage($langs->trans("Error"), 'errors'); + } + } } - - if (! $error) - { - $db->commit(); - setEventMessage($langs->trans("SetupSaved")); - } - else - { - $db->rollback(); - if (empty($errorsaved)) setEventMessage($langs->trans("Error"),'errors'); - } } /* diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 554fdc4b1906f..73f2136ccb11a 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -101,515 +101,457 @@ * Actions */ -if ($action == 'confirm_disable' && $confirm == "yes" && $candisableuser) -{ - if ($id <> $user->id) - { - $object->fetch($id); - $object->setstatus(0); - header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id); - exit; - } -} -if ($action == 'confirm_enable' && $confirm == "yes" && $candisableuser) -{ - $error = 0; +$parameters=array('id'=>$socid); +$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks +if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); - if ($id <> $user->id) - { - $object->fetch($id); +if (empty($reshook)) { - if (!empty($conf->file->main_limit_users)) - { - $nb = $object->getNbOfUsers("active"); - if ($nb >= $conf->file->main_limit_users) - { - $error++; - setEventMessage($langs->trans("YourQuotaOfUsersIsReached"), 'errors'); - } - } - - if (! $error) - { - $object->setstatus(1); + if ($action == 'confirm_disable' && $confirm == "yes" && $candisableuser) { + if ($id <> $user->id) { + $object->fetch($id); + $object->setstatus(0); header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id); exit; } } -} - -if ($action == 'confirm_delete' && $confirm == "yes" && $candisableuser) -{ - if ($id <> $user->id) - { - $object = new User($db); - $object->id=$id; - $result = $object->delete(); - if ($result < 0) - { - $langs->load("errors"); - setEventMessage($langs->trans("ErrorUserCannotBeDelete"), 'errors'); - } - else - { - header("Location: index.php"); - exit; - } - } -} + if ($action == 'confirm_enable' && $confirm == "yes" && $candisableuser) { + $error = 0; -// Action Add user -if ($action == 'add' && $canadduser) -{ - $error = 0; + if ($id <> $user->id) { + $object->fetch($id); - if (! $_POST["lastname"]) - { - $error++; - setEventMessage($langs->trans("NameNotDefined"), 'errors'); - $action="create"; // Go back to create page - } - if (! $_POST["login"]) - { - $error++; - setEventMessage($langs->trans("LoginNotDefined"), 'errors'); - $action="create"; // Go back to create page - } + if (!empty($conf->file->main_limit_users)) { + $nb = $object->getNbOfUsers("active"); + if ($nb >= $conf->file->main_limit_users) { + $error ++; + setEventMessage($langs->trans("YourQuotaOfUsersIsReached"), 'errors'); + } + } - if (! empty($conf->file->main_limit_users)) // If option to limit users is set - { - $nb = $object->getNbOfUsers("active"); - if ($nb >= $conf->file->main_limit_users) - { - $error++; - setEventMessage($langs->trans("YourQuotaOfUsersIsReached"), 'errors'); - $action="create"; // Go back to create page + if (!$error) { + $object->setstatus(1); + header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id); + exit; + } } } - if (!$error) - { - $object->lastname = GETPOST("lastname",'alpha'); - $object->firstname = GETPOST("firstname",'alpha'); - $object->login = GETPOST("login",'alpha'); - $object->api_key = GETPOST("api_key",'alpha'); - $object->gender = GETPOST("gender",'alpha'); - $object->admin = GETPOST("admin",'alpha'); - $object->office_phone = GETPOST("office_phone",'alpha'); - $object->office_fax = GETPOST("office_fax",'alpha'); - $object->user_mobile = GETPOST("user_mobile"); - $object->skype = GETPOST("skype"); - $object->email = GETPOST("email",'alpha'); - $object->job = GETPOST("job",'alpha'); - $object->signature = GETPOST("signature"); - $object->accountancy_code = GETPOST("accountancy_code"); - $object->note = GETPOST("note"); - $object->ldap_sid = GETPOST("ldap_sid"); - $object->fk_user = GETPOST("fk_user")>0?GETPOST("fk_user"):0; - - $object->thm = GETPOST("thm")!=''?GETPOST("thm"):''; - $object->tjm = GETPOST("tjm")!=''?GETPOST("tjm"):''; - $object->salary = GETPOST("salary")!=''?GETPOST("salary"):''; - $object->salaryextra = GETPOST("salaryextra")!=''?GETPOST("salaryextra"):''; - $object->weeklyhours = GETPOST("weeklyhours")!=''?GETPOST("weeklyhours"):''; - - $object->color = GETPOST("color")!=''?GETPOST("color"):''; - - // Fill array 'array_options' with data from add form - $ret = $extrafields->setOptionalsFromPost($extralabels,$object); - if ($ret < 0) $error++; - - // Set entity property - $entity=GETPOST('entity','int'); - if (! empty($conf->multicompany->enabled)) - { - if (! empty($_POST["superadmin"])) - { - $object->entity = 0; - } - else if ($conf->multicompany->transverse_mode) - { - $object->entity = 1; // all users are forced into master entity - } - else - { - $object->entity = ($entity == '' ? 1 : $entity); - } - } - else - { - $object->entity = ($entity == '' ? 1 : $entity); - /*if ($user->admin && $user->entity == 0 && GETPOST("admin",'alpha')) - { - }*/ - } - - $db->begin(); - - $id = $object->create($user); - if ($id > 0) - { - if (isset($_POST['password']) && trim($_POST['password'])) - { - $object->setPassword($user,trim($_POST['password'])); + if ($action == 'confirm_delete' && $confirm == "yes" && $candisableuser) { + if ($id <> $user->id) { + $object = new User($db); + $object->id = $id; + $result = $object->delete(); + if ($result < 0) { + $langs->load("errors"); + setEventMessage($langs->trans("ErrorUserCannotBeDelete"), 'errors'); + } else { + header("Location: index.php"); + exit; } - - $db->commit(); - - header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id); - exit; - } - else - { - $langs->load("errors"); - $db->rollback(); - if (is_array($object->errors) && count($object->errors)) setEventMessage($object->errors,'errors'); - else setEventMessage($object->error, 'errors'); - $action="create"; // Go back to create page } - } -} - -// Action add usergroup -if (($action == 'addgroup' || $action == 'removegroup') && $caneditfield) -{ - if ($group) - { - $editgroup = new UserGroup($db); - $editgroup->fetch($group); - $editgroup->oldcopy=dol_clone($editgroup); - $object->fetch($id); - if ($action == 'addgroup') $object->SetInGroup($group,($conf->multicompany->transverse_mode?GETPOST("entity"):$editgroup->entity)); - if ($action == 'removegroup') $object->RemoveFromGroup($group,($conf->multicompany->transverse_mode?GETPOST("entity"):$editgroup->entity)); +// Action Add user + if ($action == 'add' && $canadduser) { + $error = 0; - if ($result > 0) - { - header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id); - exit; + if (!$_POST["lastname"]) { + $error ++; + setEventMessage($langs->trans("NameNotDefined"), 'errors'); + $action = "create"; // Go back to create page } - else - { - setEventMessage($object->error, 'errors'); + if (!$_POST["login"]) { + $error ++; + setEventMessage($langs->trans("LoginNotDefined"), 'errors'); + $action = "create"; // Go back to create page } - } -} - -if ($action == 'update' && ! $_POST["cancel"]) -{ - require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; - - if ($caneditfield) // Case we can edit all field - { - $error=0; - if (! $_POST["lastname"]) - { - setEventMessage($langs->trans("NameNotDefined"), 'errors'); - $action="edit"; // Go back to create page - $error++; - } - if (! $_POST["login"]) + if (!empty($conf->file->main_limit_users)) // If option to limit users is set { - setEventMessage($langs->trans("LoginNotDefined"), 'errors'); - $action="edit"; // Go back to create page - $error++; + $nb = $object->getNbOfUsers("active"); + if ($nb >= $conf->file->main_limit_users) { + $error ++; + setEventMessage($langs->trans("YourQuotaOfUsersIsReached"), 'errors'); + $action = "create"; // Go back to create page + } } - if (! $error) - { - $object->fetch($id); + if (!$error) { + $object->lastname = GETPOST("lastname", 'alpha'); + $object->firstname = GETPOST("firstname", 'alpha'); + $object->login = GETPOST("login", 'alpha'); + $object->api_key = GETPOST("api_key", 'alpha'); + $object->gender = GETPOST("gender", 'alpha'); + $object->admin = GETPOST("admin", 'alpha'); + $object->office_phone = GETPOST("office_phone", 'alpha'); + $object->office_fax = GETPOST("office_fax", 'alpha'); + $object->user_mobile = GETPOST("user_mobile"); + $object->skype = GETPOST("skype"); + $object->email = GETPOST("email", 'alpha'); + $object->job = GETPOST("job", 'alpha'); + $object->signature = GETPOST("signature"); + $object->accountancy_code = GETPOST("accountancy_code"); + $object->note = GETPOST("note"); + $object->ldap_sid = GETPOST("ldap_sid"); + $object->fk_user = GETPOST("fk_user") > 0 ? GETPOST("fk_user") : 0; + + $object->thm = GETPOST("thm") != '' ? GETPOST("thm") : ''; + $object->tjm = GETPOST("tjm") != '' ? GETPOST("tjm") : ''; + $object->salary = GETPOST("salary") != '' ? GETPOST("salary") : ''; + $object->salaryextra = GETPOST("salaryextra") != '' ? GETPOST("salaryextra") : ''; + $object->weeklyhours = GETPOST("weeklyhours") != '' ? GETPOST("weeklyhours") : ''; + + $object->color = GETPOST("color") != '' ? GETPOST("color") : ''; - // Test if new login - if (GETPOST("login") && GETPOST("login") != $object->login) - { - dol_syslog("New login ".$object->login." is requested. We test it does not exists."); - $tmpuser=new User($db); - $result=$tmpuser->fetch(0, GETPOST("login")); - if ($result > 0) + // Fill array 'array_options' with data from add form + $ret = $extrafields->setOptionalsFromPost($extralabels, $object); + if ($ret < 0) { + $error ++; + } + + // Set entity property + $entity = GETPOST('entity', 'int'); + if (!empty($conf->multicompany->enabled)) { + if (!empty($_POST["superadmin"])) { + $object->entity = 0; + } else { + if ($conf->multicompany->transverse_mode) { + $object->entity = 1; // all users are forced into master entity + } else { + $object->entity = ($entity == '' ? 1 : $entity); + } + } + } else { + $object->entity = ($entity == '' ? 1 : $entity); + /*if ($user->admin && $user->entity == 0 && GETPOST("admin",'alpha')) { - setEventMessage($langs->trans("ErrorLoginAlreadyExists", GETPOST('login')), 'errors'); - $action="edit"; // Go back to create page - $error++; - } + }*/ } - } - if (! $error) - { $db->begin(); - $object->oldcopy=dol_clone($object); - - $object->lastname = GETPOST("lastname",'alpha'); - $object->firstname = GETPOST("firstname",'alpha'); - $object->login = GETPOST("login",'alpha'); - $object->gender = GETPOST("gender",'alpha'); - $object->pass = GETPOST("password"); - $object->api_key = (GETPOST("api_key", 'alpha'))?GETPOST("api_key", 'alpha'):$object->api_key; - $object->admin = empty($user->admin)?0:GETPOST("admin"); // A user can only be set admin by an admin - $object->office_phone=GETPOST("office_phone",'alpha'); - $object->office_fax = GETPOST("office_fax",'alpha'); - $object->user_mobile= GETPOST("user_mobile"); - $object->skype = GETPOST("skype"); - $object->email = GETPOST("email",'alpha'); - $object->job = GETPOST("job",'alpha'); - $object->signature = GETPOST("signature"); - $object->accountancy_code = GETPOST("accountancy_code"); - $object->openid = GETPOST("openid"); - $object->fk_user = GETPOST("fk_user")>0?GETPOST("fk_user"):0; - - $object->thm = GETPOST("thm")!=''?GETPOST("thm"):''; - $object->tjm = GETPOST("tjm")!=''?GETPOST("tjm"):''; - $object->salary = GETPOST("salary")!=''?GETPOST("salary"):''; - $object->salaryextra = GETPOST("salaryextra")!=''?GETPOST("salaryextra"):''; - $object->weeklyhours = GETPOST("weeklyhours")!=''?GETPOST("weeklyhours"):''; - - $object->color = GETPOST("color")!=''?GETPOST("color"):''; + $id = $object->create($user); + if ($id > 0) { + if (isset($_POST['password']) && trim($_POST['password'])) { + $object->setPassword($user, trim($_POST['password'])); + } - // Fill array 'array_options' with data from add form - $ret = $extrafields->setOptionalsFromPost($extralabels,$object); - if ($ret < 0) $error++; + $db->commit(); - if (! empty($conf->multicompany->enabled)) - { - if (! empty($_POST["superadmin"])) - { - $object->entity = 0; - } - else if ($conf->multicompany->transverse_mode) - { - $object->entity = 1; // all users in master entity - } - else - { - $object->entity = (empty($_POST["entity"]) ? 0 : $_POST["entity"]); - } - } - else - { - $object->entity = (empty($_POST["entity"]) ? 0 : $_POST["entity"]); + header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id); + exit; + } else { + $langs->load("errors"); + $db->rollback(); + if (is_array($object->errors) && count($object->errors)) { + setEventMessage($object->errors, 'errors'); + } else { + setEventMessage($object->error, 'errors'); + } + $action = "create"; // Go back to create page } - if (GETPOST('deletephoto')) $object->photo=''; - if (! empty($_FILES['photo']['name'])) $object->photo = dol_sanitizeFileName($_FILES['photo']['name']); + } + } - if (! $error) - { - $ret=$object->update($user); - if ($ret < 0) - { - $error++; - if ($db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') - { - $langs->load("errors"); - setEventMessage($langs->trans("ErrorLoginAlreadyExists",$object->login), 'errors'); - } - else - { - setEventMessages($object->error, $object->errors, 'errors'); - } - } +// Action add usergroup + if (($action == 'addgroup' || $action == 'removegroup') && $caneditfield) { + if ($group) { + $editgroup = new UserGroup($db); + $editgroup->fetch($group); + $editgroup->oldcopy = dol_clone($editgroup); + + $object->fetch($id); + if ($action == 'addgroup') { + $object->SetInGroup($group, ($conf->multicompany->transverse_mode ? GETPOST("entity") : $editgroup->entity)); + } + if ($action == 'removegroup') { + $object->RemoveFromGroup($group, ($conf->multicompany->transverse_mode ? GETPOST("entity") : $editgroup->entity)); } - if (! $error && isset($_POST['contactid'])) - { - $contactid=GETPOST('contactid'); + if ($result > 0) { + header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id); + exit; + } else { + setEventMessage($object->error, 'errors'); + } + } + } - if ($contactid > 0) - { - $contact=new Contact($db); - $contact->fetch($contactid); + if ($action == 'update' && !$_POST["cancel"]) { + require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; - $sql = "UPDATE ".MAIN_DB_PREFIX."user"; - $sql.= " SET fk_socpeople=".$db->escape($contactid); - if ($contact->socid) $sql.=", fk_soc=".$db->escape($contact->socid); - $sql.= " WHERE rowid=".$object->id; - } - else - { - $sql = "UPDATE ".MAIN_DB_PREFIX."user"; - $sql.= " SET fk_socpeople=NULL, fk_soc=NULL"; - $sql.= " WHERE rowid=".$object->id; - } - dol_syslog("fiche::update", LOG_DEBUG); - $resql=$db->query($sql); - if (! $resql) - { - $error++; - setEventMessage($db->lasterror(), 'errors'); - } + if ($caneditfield) // Case we can edit all field + { + $error = 0; + + if (!$_POST["lastname"]) { + setEventMessage($langs->trans("NameNotDefined"), 'errors'); + $action = "edit"; // Go back to create page + $error ++; + } + if (!$_POST["login"]) { + setEventMessage($langs->trans("LoginNotDefined"), 'errors'); + $action = "edit"; // Go back to create page + $error ++; + } + + if (!$error) { + $object->fetch($id); + + // Test if new login + if (GETPOST("login") && GETPOST("login") != $object->login) { + dol_syslog("New login ".$object->login." is requested. We test it does not exists."); + $tmpuser = new User($db); + $result = $tmpuser->fetch(0, GETPOST("login")); + if ($result > 0) { + setEventMessage($langs->trans("ErrorLoginAlreadyExists", GETPOST('login')), 'errors'); + $action = "edit"; // Go back to create page + $error ++; + } + } } - if (! $error && ! count($object->errors)) - { - if (GETPOST('deletephoto') && $object->photo) - { - $fileimg=$conf->user->dir_output.'/'.get_exdir($object->id,2,0,1,$object,'user').'/logos/'.$object->photo; - $dirthumbs=$conf->user->dir_output.'/'.get_exdir($object->id,2,0,1,$object,'user').'/logos/thumbs'; - dol_delete_file($fileimg); - dol_delete_dir_recursive($dirthumbs); + if (!$error) { + $db->begin(); + + $object->oldcopy = dol_clone($object); + + $object->lastname = GETPOST("lastname", 'alpha'); + $object->firstname = GETPOST("firstname", 'alpha'); + $object->login = GETPOST("login", 'alpha'); + $object->gender = GETPOST("gender", 'alpha'); + $object->pass = GETPOST("password"); + $object->api_key = (GETPOST("api_key", 'alpha')) ? GETPOST("api_key", 'alpha') : $object->api_key; + $object->admin = empty($user->admin) ? 0 : GETPOST("admin"); // A user can only be set admin by an admin + $object->office_phone = GETPOST("office_phone", 'alpha'); + $object->office_fax = GETPOST("office_fax", 'alpha'); + $object->user_mobile = GETPOST("user_mobile"); + $object->skype = GETPOST("skype"); + $object->email = GETPOST("email", 'alpha'); + $object->job = GETPOST("job", 'alpha'); + $object->signature = GETPOST("signature"); + $object->accountancy_code = GETPOST("accountancy_code"); + $object->openid = GETPOST("openid"); + $object->fk_user = GETPOST("fk_user") > 0 ? GETPOST("fk_user") : 0; + + $object->thm = GETPOST("thm") != '' ? GETPOST("thm") : ''; + $object->tjm = GETPOST("tjm") != '' ? GETPOST("tjm") : ''; + $object->salary = GETPOST("salary") != '' ? GETPOST("salary") : ''; + $object->salaryextra = GETPOST("salaryextra") != '' ? GETPOST("salaryextra") : ''; + $object->weeklyhours = GETPOST("weeklyhours") != '' ? GETPOST("weeklyhours") : ''; + + $object->color = GETPOST("color") != '' ? GETPOST("color") : ''; + + // Fill array 'array_options' with data from add form + $ret = $extrafields->setOptionalsFromPost($extralabels, $object); + if ($ret < 0) { + $error ++; } - if (isset($_FILES['photo']['tmp_name']) && trim($_FILES['photo']['tmp_name'])) - { - $dir= $conf->user->dir_output . '/' . get_exdir($object->id,2,0,1,$object,'user'); - - dol_mkdir($dir); + if (!empty($conf->multicompany->enabled)) { + if (!empty($_POST["superadmin"])) { + $object->entity = 0; + } else { + if ($conf->multicompany->transverse_mode) { + $object->entity = 1; // all users in master entity + } else { + $object->entity = (empty($_POST["entity"]) ? 0 : $_POST["entity"]); + } + } + } else { + $object->entity = (empty($_POST["entity"]) ? 0 : $_POST["entity"]); + } - if (@is_dir($dir)) - { - $newfile=$dir.'/'.dol_sanitizeFileName($_FILES['photo']['name']); - $result=dol_move_uploaded_file($_FILES['photo']['tmp_name'],$newfile,1,0,$_FILES['photo']['error']); + if (GETPOST('deletephoto')) { + $object->photo = ''; + } + if (!empty($_FILES['photo']['name'])) { + $object->photo = dol_sanitizeFileName($_FILES['photo']['name']); + } - if (! $result > 0) - { - setEventMessage($langs->trans("ErrorFailedToSaveFile"), 'errors'); + if (!$error) { + $ret = $object->update($user); + if ($ret < 0) { + $error ++; + if ($db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') { + $langs->load("errors"); + setEventMessage($langs->trans("ErrorLoginAlreadyExists", $object->login), 'errors'); + } else { + setEventMessages($object->error, $object->errors, 'errors'); } - else - { - // Create small thumbs for company (Ratio is near 16/9) - // Used on logon for example - $imgThumbSmall = vignette($newfile, $maxwidthsmall, $maxheightsmall, '_small', $quality); + } + } + + if (!$error && isset($_POST['contactid'])) { + $contactid = GETPOST('contactid'); + + if ($contactid > 0) { + $contact = new Contact($db); + $contact->fetch($contactid); - // Create mini thumbs for company (Ratio is near 16/9) - // Used on menu or for setup page for example - $imgThumbMini = vignette($newfile, $maxwidthmini, $maxheightmini, '_mini', $quality); + $sql = "UPDATE ".MAIN_DB_PREFIX."user"; + $sql .= " SET fk_socpeople=".$db->escape($contactid); + if ($contact->socid) { + $sql .= ", fk_soc=".$db->escape($contact->socid); } + $sql .= " WHERE rowid=".$object->id; + } else { + $sql = "UPDATE ".MAIN_DB_PREFIX."user"; + $sql .= " SET fk_socpeople=NULL, fk_soc=NULL"; + $sql .= " WHERE rowid=".$object->id; } - else - { - $error++; - $langs->load("errors"); - setEventMessages($langs->trans("ErrorFailedToCreateDir", $dir), $mesgs, 'errors'); + dol_syslog("fiche::update", LOG_DEBUG); + $resql = $db->query($sql); + if (!$resql) { + $error ++; + setEventMessage($db->lasterror(), 'errors'); } } - } - if (! $error && ! count($object->errors)) - { - setEventMessage($langs->trans("UserModified")); - $db->commit(); + if (!$error && !count($object->errors)) { + if (GETPOST('deletephoto') && $object->photo) { + $fileimg = $conf->user->dir_output.'/'.get_exdir($object->id, 2, 0, 1, $object, 'user').'/logos/'.$object->photo; + $dirthumbs = $conf->user->dir_output.'/'.get_exdir($object->id, 2, 0, 1, $object, 'user').'/logos/thumbs'; + dol_delete_file($fileimg); + dol_delete_dir_recursive($dirthumbs); + } - $login=$_SESSION["dol_login"]; - if ($login && $login == $object->oldcopy->login && $object->oldcopy->login != $object->login) // Current user has changed its login - { - $_SESSION["dol_login"]=$object->login; // Set new login to avoid disconnect at next page + if (isset($_FILES['photo']['tmp_name']) && trim($_FILES['photo']['tmp_name'])) { + $dir = $conf->user->dir_output.'/'.get_exdir($object->id, 2, 0, 1, $object, 'user'); + + dol_mkdir($dir); + + if (@is_dir($dir)) { + $newfile = $dir.'/'.dol_sanitizeFileName($_FILES['photo']['name']); + $result = dol_move_uploaded_file($_FILES['photo']['tmp_name'], $newfile, 1, 0, $_FILES['photo']['error']); + + if (!$result > 0) { + setEventMessage($langs->trans("ErrorFailedToSaveFile"), 'errors'); + } else { + // Create small thumbs for company (Ratio is near 16/9) + // Used on logon for example + $imgThumbSmall = vignette($newfile, $maxwidthsmall, $maxheightsmall, '_small', $quality); + + // Create mini thumbs for company (Ratio is near 16/9) + // Used on menu or for setup page for example + $imgThumbMini = vignette($newfile, $maxwidthmini, $maxheightmini, '_mini', $quality); + } + } else { + $error ++; + $langs->load("errors"); + setEventMessages($langs->trans("ErrorFailedToCreateDir", $dir), $mesgs, 'errors'); + } + } + } + + if (!$error && !count($object->errors)) { + setEventMessage($langs->trans("UserModified")); + $db->commit(); + + $login = $_SESSION["dol_login"]; + if ($login && $login == $object->oldcopy->login && $object->oldcopy->login != $object->login) // Current user has changed its login + { + $_SESSION["dol_login"] = $object->login; // Set new login to avoid disconnect at next page + } + } else { + $db->rollback(); } } - else + } else { + if ($caneditpassword) // Case we can edit only password { - $db->rollback(); - } - } - } - else if ($caneditpassword) // Case we can edit only password - { - $object->fetch($id); + $object->fetch($id); - $object->oldcopy=dol_clone($object); + $object->oldcopy = dol_clone($object); - $ret=$object->setPassword($user,$_POST["password"]); - if ($ret < 0) - { - setEventMessage($object->error, 'errors'); + $ret = $object->setPassword($user, $_POST["password"]); + if ($ret < 0) { + setEventMessage($object->error, 'errors'); + } + } } } -} // Change password with a new generated one -if ((($action == 'confirm_password' && $confirm == 'yes') -|| ($action == 'confirm_passwordsend' && $confirm == 'yes')) && $caneditpassword) -{ - $object->fetch($id); + if ((($action == 'confirm_password' && $confirm == 'yes') + || ($action == 'confirm_passwordsend' && $confirm == 'yes')) && $caneditpassword + ) { + $object->fetch($id); - $newpassword=$object->setPassword($user,''); - if ($newpassword < 0) - { - // Echec - setEventMessage($langs->trans("ErrorFailedToSetNewPassword"), 'errors'); - } - else - { - // Succes - if ($action == 'confirm_passwordsend' && $confirm == 'yes') - { - if ($object->send_password($user,$newpassword) > 0) - { - setEventMessage($langs->trans("PasswordChangedAndSentTo",$object->email)); - } - else - { - setEventMessage($object->error, 'errors'); + $newpassword = $object->setPassword($user, ''); + if ($newpassword < 0) { + // Echec + setEventMessage($langs->trans("ErrorFailedToSetNewPassword"), 'errors'); + } else { + // Succes + if ($action == 'confirm_passwordsend' && $confirm == 'yes') { + if ($object->send_password($user, $newpassword) > 0) { + setEventMessage($langs->trans("PasswordChangedAndSentTo", $object->email)); + } else { + setEventMessage($object->error, 'errors'); + } + } else { + setEventMessage($langs->trans("PasswordChangedTo", $newpassword), 'errors'); } } - else - { - setEventMessage($langs->trans("PasswordChangedTo",$newpassword), 'errors'); - } } -} // Action initialisation donnees depuis record LDAP -if ($action == 'adduserldap') -{ - $selecteduser = $_POST['users']; - - $required_fields = array( - $conf->global->LDAP_KEY_USERS, - $conf->global->LDAP_FIELD_NAME, - $conf->global->LDAP_FIELD_FIRSTNAME, - $conf->global->LDAP_FIELD_LOGIN, - $conf->global->LDAP_FIELD_LOGIN_SAMBA, - $conf->global->LDAP_FIELD_PASSWORD, - $conf->global->LDAP_FIELD_PASSWORD_CRYPTED, - $conf->global->LDAP_FIELD_PHONE, - $conf->global->LDAP_FIELD_FAX, - $conf->global->LDAP_FIELD_MOBILE, - $conf->global->LDAP_FIELD_SKYPE, - $conf->global->LDAP_FIELD_MAIL, - $conf->global->LDAP_FIELD_TITLE, - $conf->global->LDAP_FIELD_DESCRIPTION, - $conf->global->LDAP_FIELD_SID); - - $ldap = new Ldap(); - $result = $ldap->connect_bind(); - if ($result >= 0) - { - // Remove from required_fields all entries not configured in LDAP (empty) and duplicated - $required_fields=array_unique(array_values(array_filter($required_fields, "dol_validElement"))); - - $ldapusers = $ldap->getRecords($selecteduser, $conf->global->LDAP_USER_DN, $conf->global->LDAP_KEY_USERS, $required_fields); - //print_r($ldapusers); + if ($action == 'adduserldap') { + $selecteduser = $_POST['users']; + + $required_fields = array( + $conf->global->LDAP_KEY_USERS, + $conf->global->LDAP_FIELD_NAME, + $conf->global->LDAP_FIELD_FIRSTNAME, + $conf->global->LDAP_FIELD_LOGIN, + $conf->global->LDAP_FIELD_LOGIN_SAMBA, + $conf->global->LDAP_FIELD_PASSWORD, + $conf->global->LDAP_FIELD_PASSWORD_CRYPTED, + $conf->global->LDAP_FIELD_PHONE, + $conf->global->LDAP_FIELD_FAX, + $conf->global->LDAP_FIELD_MOBILE, + $conf->global->LDAP_FIELD_SKYPE, + $conf->global->LDAP_FIELD_MAIL, + $conf->global->LDAP_FIELD_TITLE, + $conf->global->LDAP_FIELD_DESCRIPTION, + $conf->global->LDAP_FIELD_SID + ); - if (is_array($ldapusers)) - { - foreach ($ldapusers as $key => $attribute) - { - $ldap_lastname = $attribute[$conf->global->LDAP_FIELD_NAME]; - $ldap_firstname = $attribute[$conf->global->LDAP_FIELD_FIRSTNAME]; - $ldap_login = $attribute[$conf->global->LDAP_FIELD_LOGIN]; - $ldap_loginsmb = $attribute[$conf->global->LDAP_FIELD_LOGIN_SAMBA]; - $ldap_pass = $attribute[$conf->global->LDAP_FIELD_PASSWORD]; - $ldap_pass_crypted = $attribute[$conf->global->LDAP_FIELD_PASSWORD_CRYPTED]; - $ldap_phone = $attribute[$conf->global->LDAP_FIELD_PHONE]; - $ldap_fax = $attribute[$conf->global->LDAP_FIELD_FAX]; - $ldap_mobile = $attribute[$conf->global->LDAP_FIELD_MOBILE]; - $ldap_skype = $attribute[$conf->global->LDAP_FIELD_SKYPE]; - $ldap_mail = $attribute[$conf->global->LDAP_FIELD_MAIL]; - $ldap_sid = $attribute[$conf->global->LDAP_FIELD_SID]; + $ldap = new Ldap(); + $result = $ldap->connect_bind(); + if ($result >= 0) { + // Remove from required_fields all entries not configured in LDAP (empty) and duplicated + $required_fields = array_unique(array_values(array_filter($required_fields, "dol_validElement"))); + + $ldapusers = $ldap->getRecords($selecteduser, $conf->global->LDAP_USER_DN, $conf->global->LDAP_KEY_USERS, $required_fields); + //print_r($ldapusers); + + if (is_array($ldapusers)) { + foreach ($ldapusers as $key => $attribute) { + $ldap_lastname = $attribute[$conf->global->LDAP_FIELD_NAME]; + $ldap_firstname = $attribute[$conf->global->LDAP_FIELD_FIRSTNAME]; + $ldap_login = $attribute[$conf->global->LDAP_FIELD_LOGIN]; + $ldap_loginsmb = $attribute[$conf->global->LDAP_FIELD_LOGIN_SAMBA]; + $ldap_pass = $attribute[$conf->global->LDAP_FIELD_PASSWORD]; + $ldap_pass_crypted = $attribute[$conf->global->LDAP_FIELD_PASSWORD_CRYPTED]; + $ldap_phone = $attribute[$conf->global->LDAP_FIELD_PHONE]; + $ldap_fax = $attribute[$conf->global->LDAP_FIELD_FAX]; + $ldap_mobile = $attribute[$conf->global->LDAP_FIELD_MOBILE]; + $ldap_skype = $attribute[$conf->global->LDAP_FIELD_SKYPE]; + $ldap_mail = $attribute[$conf->global->LDAP_FIELD_MAIL]; + $ldap_sid = $attribute[$conf->global->LDAP_FIELD_SID]; + } } + } else { + setEventMessage($ldap->error, 'errors'); } } - else - { - setEventMessage($ldap->error, 'errors'); - } } - /* * View */ diff --git a/htdocs/user/clicktodial.php b/htdocs/user/clicktodial.php index 7aaaebbac3eb7..44a3c90aeb788 100644 --- a/htdocs/user/clicktodial.php +++ b/htdocs/user/clicktodial.php @@ -41,25 +41,33 @@ } $result = restrictedArea($user, 'user', $id, 'user&user', $feature2); +// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array +$hookmanager->initHooks(array('usercard','globalcard')); /* * Actions */ -if ($action == 'update' && ! GETPOST('cancel')) -{ - $edituser = new User($db); - $edituser->fetch($id); +$parameters=array('id'=>$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'); - $edituser->clicktodial_url = GETPOST("url"); - $edituser->clicktodial_login = GETPOST("login"); - $edituser->clicktodial_password = GETPOST("password"); - $edituser->clicktodial_poste = GETPOST("poste"); +if (empty($reshook)) { + if ($action == 'update' && !GETPOST('cancel')) { + $edituser = new User($db); + $edituser->fetch($id); - $result=$edituser->update_clicktodial(); - if ($result < 0) setEventMessage($edituser->error,'errors'); -} + $edituser->clicktodial_url = GETPOST("url"); + $edituser->clicktodial_login = GETPOST("login"); + $edituser->clicktodial_password = GETPOST("password"); + $edituser->clicktodial_poste = GETPOST("poste"); + $result = $edituser->update_clicktodial(); + if ($result < 0) { + setEventMessage($edituser->error, 'errors'); + } + } +} /* diff --git a/htdocs/user/document.php b/htdocs/user/document.php index 25dea7eb3986f..e628e58624a18 100644 --- a/htdocs/user/document.php +++ b/htdocs/user/document.php @@ -93,12 +93,20 @@ $upload_dir = $conf->user->multidir_output[$entitytouseforuserdir] . "/" . $object->id ; } +// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array +$hookmanager->initHooks(array('usercard','globalcard')); + /* * Actions */ -include_once DOL_DOCUMENT_ROOT . '/core/tpl/document_actions_pre_headers.tpl.php'; +$parameters=array('id'=>$socid); +$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks +if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); +if (empty($reshook)) { + include_once DOL_DOCUMENT_ROOT.'/core/tpl/document_actions_pre_headers.tpl.php'; +} /* * View diff --git a/htdocs/user/ldap.php b/htdocs/user/ldap.php index 2d1ac2f7464c5..9351450dea7c9 100644 --- a/htdocs/user/ldap.php +++ b/htdocs/user/ldap.php @@ -45,37 +45,41 @@ $object->fetch($id); $object->getrights(); +// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array +$hookmanager->initHooks(array('usercard','globalcard')); /* * Actions */ -if ($_GET["action"] == 'dolibarr2ldap') -{ - $db->begin(); - $ldap=new Ldap(); - $result=$ldap->connect_bind(); +$parameters=array('id'=>$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'); - $info=$object->_load_ldap_info(); - $dn=$object->_load_ldap_dn($info); - $olddn=$dn; // We can say that old dn = dn as we force synchro +if (empty($reshook)) { + if ($_GET["action"] == 'dolibarr2ldap') { + $db->begin(); - $result=$ldap->update($dn,$info,$user,$olddn); + $ldap = new Ldap(); + $result = $ldap->connect_bind(); - if ($result >= 0) - { - setEventMessage($langs->trans("UserSynchronized")); - $db->commit(); - } - else - { - setEventMessage($ldap->error, 'errors'); - $db->rollback(); + $info = $object->_load_ldap_info(); + $dn = $object->_load_ldap_dn($info); + $olddn = $dn; // We can say that old dn = dn as we force synchro + + $result = $ldap->update($dn, $info, $user, $olddn); + + if ($result >= 0) { + setEventMessage($langs->trans("UserSynchronized")); + $db->commit(); + } else { + setEventMessage($ldap->error, 'errors'); + $db->rollback(); + } } } - /* * View */ diff --git a/htdocs/user/note.php b/htdocs/user/note.php index 7fe5766cd3a0d..795a41d41c560 100644 --- a/htdocs/user/note.php +++ b/htdocs/user/note.php @@ -48,30 +48,32 @@ if ($user->id == $id) $feature2=''; // A user can always read its own card $result = restrictedArea($user, 'user', $id, 'user&user', $feature2); - +// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array +$hookmanager->initHooks(array('usercard','globalcard')); /******************************************************************************/ /* Actions */ /******************************************************************************/ -if ($action == 'update' && $user->rights->user->user->creer && ! $_POST["cancel"]) -{ - $db->begin(); - - $res=$object->update_note(dol_html_entity_decode(GETPOST('note_private'), ENT_QUOTES)); - if ($res < 0) - { - $mesg='
'.$adh->error.'
'; - $db->rollback(); - } - else - { - $db->commit(); +$parameters=array('id'=>$socid); +$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks +if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + +if (empty($reshook)) { + if ($action == 'update' && $user->rights->user->user->creer && !$_POST["cancel"]) { + $db->begin(); + + $res = $object->update_note(dol_html_entity_decode(GETPOST('note_private'), ENT_QUOTES)); + if ($res < 0) { + $mesg = '
'.$adh->error.'
'; + $db->rollback(); + } else { + $db->commit(); + } } } - /******************************************************************************/ /* Affichage fiche */ /******************************************************************************/ diff --git a/htdocs/user/param_ihm.php b/htdocs/user/param_ihm.php index 5355a0f74fcfb..531ccd615ddc0 100644 --- a/htdocs/user/param_ihm.php +++ b/htdocs/user/param_ihm.php @@ -74,38 +74,51 @@ $form = new Form($db); $formadmin=new FormAdmin($db); +// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array +$hookmanager->initHooks(array('usercard','globalcard')); /* * Actions */ -if ($action == 'update' && ($caneditfield || ! empty($user->admin))) -{ - if (! $_POST["cancel"]) - { - $tabparam=array(); - - if ($_POST["check_MAIN_LANG_DEFAULT"]=="on") $tabparam["MAIN_LANG_DEFAULT"]=$_POST["main_lang_default"]; - else $tabparam["MAIN_LANG_DEFAULT"]=''; - - if ($_POST["check_SIZE_LISTE_LIMIT"]=="on") $tabparam["MAIN_SIZE_LISTE_LIMIT"]=$_POST["main_size_liste_limit"]; - else $tabparam["MAIN_SIZE_LISTE_LIMIT"]=''; - - if ($_POST["check_MAIN_THEME"]=="on") $tabparam["MAIN_THEME"]=$_POST["main_theme"]; - else $tabparam["MAIN_THEME"]=''; - - $tabparam["MAIN_SEARCHFORM_CONTACT"]=$_POST["main_searchform_contact"]; - $tabparam["MAIN_SEARCHFORM_SOCIETE"]=$_POST["main_searchform_societe"]; - $tabparam["MAIN_SEARCHFORM_PRODUITSERVICE"]=$_POST["main_searchform_produitservice"]; - - $result=dol_set_user_param($db, $conf, $object, $tabparam); - - header('Location: '.$_SERVER["PHP_SELF"].'?id='.$id); - exit; +$parameters=array('id'=>$socid); +$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks +if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + +if (empty($reshook)) { + if ($action == 'update' && ($caneditfield || !empty($user->admin))) { + if (!$_POST["cancel"]) { + $tabparam = array(); + + if ($_POST["check_MAIN_LANG_DEFAULT"] == "on") { + $tabparam["MAIN_LANG_DEFAULT"] = $_POST["main_lang_default"]; + } else { + $tabparam["MAIN_LANG_DEFAULT"] = ''; + } + + if ($_POST["check_SIZE_LISTE_LIMIT"] == "on") { + $tabparam["MAIN_SIZE_LISTE_LIMIT"] = $_POST["main_size_liste_limit"]; + } else { + $tabparam["MAIN_SIZE_LISTE_LIMIT"] = ''; + } + + if ($_POST["check_MAIN_THEME"] == "on") { + $tabparam["MAIN_THEME"] = $_POST["main_theme"]; + } else { + $tabparam["MAIN_THEME"] = ''; + } + + $tabparam["MAIN_SEARCHFORM_CONTACT"] = $_POST["main_searchform_contact"]; + $tabparam["MAIN_SEARCHFORM_SOCIETE"] = $_POST["main_searchform_societe"]; + $tabparam["MAIN_SEARCHFORM_PRODUITSERVICE"] = $_POST["main_searchform_produitservice"]; + + $result = dol_set_user_param($db, $conf, $object, $tabparam); + + header('Location: '.$_SERVER["PHP_SELF"].'?id='.$id); + exit; + } } } - - /* * View */ diff --git a/htdocs/user/perms.php b/htdocs/user/perms.php index d611e1f5c70dd..c31ba0a9b2988 100644 --- a/htdocs/user/perms.php +++ b/htdocs/user/perms.php @@ -67,45 +67,52 @@ $result = restrictedArea($user, 'user', $id, 'user&user', $feature2); if ($user->id <> $id && ! $canreaduser) accessforbidden(); +$object = new User($db); +$object->fetch($id); +$object->getrights(); + +// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array +$hookmanager->initHooks(array('usercard','globalcard')); /** * Actions */ -if ($action == 'addrights' && $caneditperms) -{ - $edituser = new User($db); - $edituser->fetch($id); - //$edituser->addrights($rights, $module, '', $entity); // TODO unused for the moment - $edituser->addrights($rights, $module); - - // Si on a touche a ses propres droits, on recharge - if ($id == $user->id) - { - $user->clearrights(); - $user->getrights(); - $menumanager->loadMenu(); +$parameters=array('id'=>$socid); +$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks +if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); + +if (empty($reshook)) { + if ($action == 'addrights' && $caneditperms) { + $edituser = new User($db); + $edituser->fetch($id); + //$edituser->addrights($rights, $module, '', $entity); // TODO unused for the moment + $edituser->addrights($rights, $module); + + // Si on a touche a ses propres droits, on recharge + if ($id == $user->id) { + $user->clearrights(); + $user->getrights(); + $menumanager->loadMenu(); + } } -} -if ($action == 'delrights' && $caneditperms) -{ - $edituser = new User($db); - $edituser->fetch($id); - //$edituser->delrights($rights, $module, '', $entity); // TODO unused for the moment - $edituser->delrights($rights, $module); - - // Si on a touche a ses propres droits, on recharge - if ($id == $user->id) - { - $user->clearrights(); - $user->getrights(); - $menumanager->loadMenu(); + if ($action == 'delrights' && $caneditperms) { + $edituser = new User($db); + $edituser->fetch($id); + //$edituser->delrights($rights, $module, '', $entity); // TODO unused for the moment + $edituser->delrights($rights, $module); + + // Si on a touche a ses propres droits, on recharge + if ($id == $user->id) { + $user->clearrights(); + $user->getrights(); + $menumanager->loadMenu(); + } } } - /** * View */ @@ -114,10 +121,6 @@ $form=new Form($db); -$object = new User($db); -$object->fetch($id); -$object->getrights(); - $head = user_prepare_head($object); $title = $langs->trans("User"); From 6ec77e2ca096bf9e540f338eab8ed18c62e99031 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 11 Oct 2015 12:27:04 +0200 Subject: [PATCH 080/297] New banner card on contact card. --- htdocs/contact/card.php | 108 ++++++++++++++--------- htdocs/core/class/commonobject.class.php | 37 +++++--- htdocs/core/class/html.form.class.php | 11 ++- htdocs/core/lib/company.lib.php | 2 +- htdocs/core/lib/functions.lib.php | 38 +++++--- htdocs/langs/en_US/main.lang | 1 + htdocs/societe/soc.php | 19 ++-- htdocs/theme/eldy/style.css.php | 8 +- htdocs/theme/md/style.css.php | 2 +- 9 files changed, 152 insertions(+), 74 deletions(-) diff --git a/htdocs/contact/card.php b/htdocs/contact/card.php index 2db5523c5bdb1..35ad3b8c3a1a8 100644 --- a/htdocs/contact/card.php +++ b/htdocs/contact/card.php @@ -4,10 +4,10 @@ * Copyright (C) 2004 Benoit Mortier * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2007 Franky Van Liedekerke - * Copyright (C) 2013 Florian Henry + * Copyright (C) 2013 Florian Henry * Copyright (C) 2013 Alexandre Spangaro * Copyright (C) 2014 Juanjo Menent - * Copyright (C) 2015 Jean-François Ferry + * Copyright (C) 2015 Jean-François Ferry * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -773,11 +773,14 @@ print '
'.$langs->trans("Filter").'
'.$langs->trans("ThirdParty").''; @@ -259,8 +259,8 @@ print '

'; //} -print ''; -print ''; +print '
'; +print ''; print ''; print ''; print ''; @@ -271,13 +271,15 @@ print ''; $oldyear=0; +$var=true; foreach ($data as $val) { $year = $val['year']; while ($year && $oldyear > $year+1) { // If we have empty year $oldyear--; - print ''; + $var=!$var; + print ''; print ''; print ''; print ''; @@ -287,7 +289,8 @@ print ''; print ''; } - print ''; + $var=!$var; + print ''; print ''; print ''; print ''; diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index 5615eaf76a4da..f7363984fb8f5 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -1407,26 +1407,19 @@ print ''; - print ''; - print ''; - print ''; + 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 '); print "\n"; print ''; @@ -193,7 +225,8 @@ print ''; print ''; //print ''; - print ''; + print '\n"; @@ -253,6 +286,7 @@ print ''; print ''; print ''; + print ''; print "\n"; $i++; } diff --git a/htdocs/product/stats/commande.php b/htdocs/product/stats/commande.php index 9491b18da1e15..f90235a143fad 100644 --- a/htdocs/product/stats/commande.php +++ b/htdocs/product/stats/commande.php @@ -188,7 +188,8 @@ } print_barre_liste($langs->trans("CustomersOrders"),$page,$_SERVER["PHP_SELF"],"&id=$product->id",$sortfield,$sortorder,'',$num,$totalrecords,''); - print '
'; + print '
'; + print '
'; print $langs->trans('Period').' ('.$langs->trans("OrderDate") .') - '; print $langs->trans('Month') . ': '; print $langs->trans('Year') . ':' . $formother->selectyear($search_year ? $search_year : - 1, 'search_year', 1, 20, 5); @@ -197,9 +198,10 @@ print ''; print '
'; print '
'; + print '
'; $i = 0; - print '
'.$langs->trans("Year").''.$langs->trans("NumberOfBills").'%
0?'&userid='.$userid:'').'">'.$oldyear.'0
0?'&userid='.$userid:'').'">'.$year.''.$val['nb'].''.round($val['nb_diff']).''; if ($user->rights->contrat->creer && count($arrayothercontracts) && ($object->statut >= 0)) { - print ''; + print ''; print img_picto($langs->trans("MoveToAnotherContract"),'uparrow'); print ''; } - else { - print ' '; - } if ($user->rights->contrat->creer && ($object->statut >= 0)) { - print ''; + print ''; print img_edit(); print ''; } - else { - print ' '; - } if ( $user->rights->contrat->creer && ($object->statut >= 0)) { - print ' '; - print ''; + print ''; print img_delete(); print ''; } diff --git a/htdocs/contrat/list.php b/htdocs/contrat/list.php index a4f719cf7f58b..9619713859ae8 100644 --- a/htdocs/contrat/list.php +++ b/htdocs/contrat/list.php @@ -49,8 +49,10 @@ $sall=GETPOST('sall'); $search_status=GETPOST('search_status'); $socid=GETPOST('socid'); +$search_user=GETPOST('search_user','int'); +$search_sale=GETPOST('search_sale','int'); +$search_product_category=GETPOST('search_product_category','int'); -$search_sale = GETPOST('search_sale','int'); $optioncss = GETPOST('optioncss','alpha'); if (! $sortfield) $sortfield="c.rowid"; @@ -69,7 +71,9 @@ $search_name=""; $search_contract=""; $search_ref_supplier=""; - $search_sale=""; + $search_user=''; + $search_sale=''; + $search_product_category=''; $sall=""; $search_status=""; } @@ -82,6 +86,7 @@ */ $now=dol_now(); +$form=new Form($db); $formother = new FormOther($db); $socstatic = new Societe($db); @@ -99,8 +104,15 @@ 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"; $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) +{ + $sql.=", ".MAIN_DB_PREFIX."element_contact as ec"; + $sql.=", ".MAIN_DB_PREFIX."c_type_contact as tc"; +} $sql.= " WHERE c.fk_soc = s.rowid "; -$sql.= " AND c.entity = ".$conf->entity; +$sql.= ' AND c.entity IN ('.getEntity('contract', 1).')'; +if ($search_product_category > 0) $sql.=" AND cp.fk_categorie = ".$search_product_category; if ($socid) $sql.= " AND s.rowid = ".$db->escape($socid); if (!$user->rights->societe->client->voir && !$socid) $sql.= " AND s.rowid = sc.fk_soc AND sc.fk_user = " .$user->id; @@ -122,6 +134,7 @@ if ($sall) { $sql .= natural_search(array('s.nom', 'cd.label', 'cd.description'), $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_supplier, s.nom, s.rowid"; $sql.= $db->order($sortfield,$sortorder); $sql.= $db->plimit($conf->liste_limit + 1, $offset); @@ -147,7 +160,25 @@ $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user); $moreforfilter.=''; } - + // If the user can view other users + if ($user->rights->user->user->lire) + { + $moreforfilter.='
'; + $moreforfilter.=$langs->trans('LinkedToSpecificUsers'). ': '; + $moreforfilter.=$form->select_dolusers($search_user, 'search_user', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); + $moreforfilter.='
'; + } + // If the user can view categories of products + if ($conf->categorie->enabled && $user->rights->produit->lire) + { + include_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php'; + $moreforfilter.='
'; + $moreforfilter.=$langs->trans('IncludingProductWithTag'). ': '; + $cate_arbo = $form->select_all_categories(Categorie::TYPE_PRODUCT, null, 'parent', null, null, 1); + $moreforfilter.=$form->selectarray('search_product_category', $cate_arbo, $search_product_category, 1, 0, 0, '', 0, 0, 0, 0, '', 1); + $moreforfilter.='
'; + } + if (! empty($moreforfilter)) { print '
'; @@ -174,10 +205,11 @@ //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 '
'.$staticcontratligne->LibStatut(0,3).''.$staticcontratligne->LibStatut(4,3,0).''.$staticcontratligne->LibStatut(4,3,1).''.$staticcontratligne->LibStatut(5,3).'
  '; + print ''; print ''; print "
'.($obj->nb_running>0?$obj->nb_running:'').''.($obj->nb_expired>0?$obj->nb_expired:'').''.($obj->nb_closed>0 ?$obj->nb_closed:'').'
'; + print '
'; print ''; print_liste_field_titre($langs->trans("Ref"),$_SERVER["PHP_SELF"],"c.rowid","",$option,'',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Company"),$_SERVER["PHP_SELF"],"s.nom","",$option,'',$sortfield,$sortorder); diff --git a/htdocs/product/stats/commande_fournisseur.php b/htdocs/product/stats/commande_fournisseur.php index e7a803c299c5e..3d117a7f40a8d 100644 --- a/htdocs/product/stats/commande_fournisseur.php +++ b/htdocs/product/stats/commande_fournisseur.php @@ -198,7 +198,8 @@ } print_barre_liste($langs->trans("SuppliersOrders"), $page, $_SERVER["PHP_SELF"], "&id=$product->id", $sortfield, $sortorder, '', $num, $totalrecords, ''); - print '
'; + print '
'; + print '
'; print $langs->trans('Period') . ' (' . $langs->trans("OrderDate") . ') - '; print $langs->trans('Month') . ': '; print $langs->trans('Year') . ':' . $formother->selectyear($search_year ? $search_year : - 1, 'search_year', 1, 20, 5); @@ -207,9 +208,10 @@ print ''; print '
'; print '
'; + print '
'; $i = 0; - print '
'; + print '
'; print ''; print_liste_field_titre($langs->trans("Ref"), $_SERVER["PHP_SELF"], "c.rowid", "", $option, '', $sortfield, $sortorder); print_liste_field_titre($langs->trans("Company"), $_SERVER["PHP_SELF"], "s.nom", "", $option, '', $sortfield, $sortorder); diff --git a/htdocs/product/stats/contrat.php b/htdocs/product/stats/contrat.php index 84417c013b72a..9d4d7d53abc9a 100644 --- a/htdocs/product/stats/contrat.php +++ b/htdocs/product/stats/contrat.php @@ -147,7 +147,7 @@ print_barre_liste($langs->trans("Contrats"),$page,$_SERVER["PHP_SELF"],"&id=$product->id",$sortfield,$sortorder,'',$num,0,''); $i = 0; - print "
"; + print '
'; print ''; print_liste_field_titre($langs->trans("Ref"),$_SERVER["PHP_SELF"],"c.rowid","","&id=".$product->id,'',$sortfield,$sortorder); @@ -155,9 +155,9 @@ print_liste_field_titre($langs->trans("CustomerCode"),$_SERVER["PHP_SELF"],"s.code_client","","&id=".$product->id,'',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Date"),$_SERVER["PHP_SELF"],"c.date_contrat","","&id=".$product->id,'align="center"',$sortfield,$sortorder); //print_liste_field_titre($langs->trans("AmountHT"),$_SERVER["PHP_SELF"],"c.amount","","&id=".$product->id,'align="right"',$sortfield,$sortorder); - print ''; - print ''; - print ''; + print_liste_field_titre($staticcontratligne->LibStatut(0,3),$_SERVER["PHP_SELF"],"",'','','width="16"',$sortfield,$sortorder,'maxwidthsearch '); + print_liste_field_titre($staticcontratligne->LibStatut(4,3),$_SERVER["PHP_SELF"],"",'','','width="16"',$sortfield,$sortorder,'maxwidthsearch '); + print_liste_field_titre($staticcontratligne->LibStatut(5,3),$_SERVER["PHP_SELF"],"",'','','width="16"',$sortfield,$sortorder,'maxwidthsearch '); print "\n"; $contratstatic=new Contrat($db); diff --git a/htdocs/product/stats/facture.php b/htdocs/product/stats/facture.php index 2a79b97e39986..6fb09bffa8b3e 100644 --- a/htdocs/product/stats/facture.php +++ b/htdocs/product/stats/facture.php @@ -22,7 +22,7 @@ /** * \file htdocs/product/stats/facture.php * \ingroup product service facture - * \brief Page des stats des factures clients pour un produit + * \brief Page of invoice statistics for a product */ require '../../main.inc.php'; @@ -128,7 +128,8 @@ print ''; - if ($user->rights->facture->lire) { + if ($user->rights->facture->lire) + { $sql = "SELECT distinct s.nom as name, s.rowid as socid, s.code_client,"; $sql.= " f.facnumber, d.total_ht as total_ht,"; $sql.= " f.datef, f.paye, f.fk_statut as statut, f.rowid as facid, d.qty"; @@ -189,7 +190,8 @@ } print_barre_liste($langs->trans("CustomersInvoices"),$page,$_SERVER["PHP_SELF"],"&id=".$product->id,$sortfield,$sortorder,'',$num,$totalrecords,''); - print '
'; + print '
'; + print '
'; print $langs->trans('Period').' ('.$langs->trans("DateInvoice") .') - '; print $langs->trans('Month') . ': '; print $langs->trans('Year') . ':' . $formother->selectyear($search_year ? $search_year : - 1, 'search_year', 1, 20, 5); @@ -198,9 +200,10 @@ print ''; print '
'; print '
'; + print '
'; $i = 0; - print '
'.$staticcontratligne->LibStatut(0,3).''.$staticcontratligne->LibStatut(4,3).''.$staticcontratligne->LibStatut(5,3).'
'; + print '
'; print ''; print_liste_field_titre($langs->trans("Ref"),$_SERVER["PHP_SELF"],"s.rowid","",$option,'',$sortfield,$sortorder); print_liste_field_titre($langs->trans("Company"),$_SERVER["PHP_SELF"],"s.nom","",$option,'',$sortfield,$sortorder); diff --git a/htdocs/product/stats/facture_fournisseur.php b/htdocs/product/stats/facture_fournisseur.php index 9b56cee75523b..677bff934a733 100644 --- a/htdocs/product/stats/facture_fournisseur.php +++ b/htdocs/product/stats/facture_fournisseur.php @@ -190,7 +190,8 @@ } print_barre_liste($langs->trans("SuppliersInvoices"), $page, $_SERVER["PHP_SELF"], "&id=$product->id", $sortfield, $sortorder, '', $num, $totalrecords, ''); - print '
'; + print '
'; + print '
'; print $langs->trans('Period') . ' (' . $langs->trans("DateInvoice") . ') - '; print $langs->trans('Month') . ': '; print $langs->trans('Year') . ':' . $formother->selectyear($search_year ? $search_year : - 1, 'search_year', 1, 20, 5); @@ -199,9 +200,10 @@ print ''; print '
'; print '
'; + print '
'; $i = 0; - print '
'; + print '
'; print ''; print_liste_field_titre($langs->trans("Ref"), $_SERVER["PHP_SELF"], "s.rowid", "", $option, '', $sortfield, $sortorder); print_liste_field_titre($langs->trans("Company"), $_SERVER["PHP_SELF"], "s.nom", "", $option, '', $sortfield, $sortorder); diff --git a/htdocs/product/stats/propal.php b/htdocs/product/stats/propal.php index 690f9c8c42148..295487344fdb6 100644 --- a/htdocs/product/stats/propal.php +++ b/htdocs/product/stats/propal.php @@ -191,7 +191,8 @@ } print_barre_liste($langs->trans("Proposals"), $page, $_SERVER["PHP_SELF"], "&id=$product->id", $sortfield, $sortorder, '', $num, $totalrecords, ''); - print '
'; + print '
'; + print '
'; print $langs->trans('Period') . ' (' . $langs->trans("DatePropal") . ') - '; print $langs->trans('Month') . ': '; print $langs->trans('Year') . ':' . $formother->selectyear($search_year ? $search_year : - 1, 'search_year', 1, 20, 5); @@ -200,9 +201,10 @@ print ''; print '
'; print '
'; + print '
'; $i = 0; - print '
'; + print '
'; print ''; print_liste_field_titre($langs->trans("Ref"), $_SERVER["PHP_SELF"], "p.rowid", "", $option, '', $sortfield, $sortorder); print_liste_field_titre($langs->trans("Company"), $_SERVER["PHP_SELF"], "s.nom", "", $option, '', $sortfield, $sortorder); diff --git a/htdocs/projet/stats/index.php b/htdocs/projet/stats/index.php index 42d367ce8331d..d28d7d6f14abb 100644 --- a/htdocs/projet/stats/index.php +++ b/htdocs/projet/stats/index.php @@ -269,7 +269,8 @@ print '
'; print ''; -print '
'; + +print '
'; print ''; // Company print '"; - - print '"; + + print ''; - $country_code = getCountry($obj->country_id, 'all'); - // Address and phone print ''; // Status diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 81f1468338385..443749dd271c2 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -1315,20 +1315,25 @@ function dol_print_size($size,$shortvalue=0,$shortunit=0) * @param string $url Url to show * @param string $target Target for link * @param int $max Max number of characters to show + * @param int $withpicto With picto * @return string HTML Link */ -function dol_print_url($url,$target='_blank',$max=32) +function dol_print_url($url,$target='_blank',$max=32,$withpicto=0) { + global $langs; + if (empty($url)) return ''; $link=''; + $link.='"'; + if ($target) $link.=' target="'.$target.'"'; + $link.='>'; if (! preg_match('/^http/i',$url)) $link.='http://'; $link.=dol_trunc($url,$max); $link.=''; - return $link; + return '
'.($withpicto?img_picto($langs->trans("Url"), 'object_globe.png').' ':'').$link.'
'; } /** @@ -1591,26 +1596,30 @@ function dol_user_country() /** * Format address string * - * @param string $address Address - * @param int $htmlid Html ID (for example 'gmap') - * @param int $mode thirdparty|contact|member|other - * @param int $id Id of object - * @return void + * @param string $address Address + * @param int $htmlid Html ID (for example 'gmap') + * @param int $mode thirdparty|contact|member|other + * @param int $id Id of object + * @param int $noprint No output. Result is the function return + * @return string|void Nothing if noprint is 0, formatted address if noprint is 1 * @see dol_format_address */ -function dol_print_address($address, $htmlid, $mode, $id) +function dol_print_address($address, $htmlid, $mode, $id, $noprint=0) { global $conf, $user, $langs, $hookmanager; + $out = ''; + if ($address) { if ($hookmanager) { $parameters = array('element' => $mode, 'id' => $id); $reshook = $hookmanager->executeHooks('printAddress', $parameters, $address); - print $hookmanager->resPrint; + $out.=$hookmanager->resPrint; } - if (empty($reshook)) { - print nl2br($address); + if (empty($reshook)) + { + $out.=nl2br($address); $showgmap=$showomap=0; if ($mode=='thirdparty' && ! empty($conf->google->enabled) && ! empty($conf->global->GOOGLE_ENABLE_GMAPS)) $showgmap=1; if ($mode=='contact' && ! empty($conf->google->enabled) && ! empty($conf->global->GOOGLE_ENABLE_GMAPS_CONTACTS)) $showgmap=1; @@ -1623,15 +1632,17 @@ function dol_print_address($address, $htmlid, $mode, $id) if ($showgmap) { $url=dol_buildpath('/google/gmaps.php?mode='.$mode.'&id='.$id,1); - print ' '; + $out.=' '; } if ($showomap) { $url=dol_buildpath('/openstreetmap/maps.php?mode='.$mode.'&id='.$id,1); - print ' '; + $out.=' '; } } } + if ($noprint) return $out; + else print $out; } diff --git a/htdocs/societe/soc.php b/htdocs/societe/soc.php index 0411e974f2d92..aad1a8aae4847 100644 --- a/htdocs/societe/soc.php +++ b/htdocs/societe/soc.php @@ -1727,7 +1727,7 @@ // Capital print ''; - print ''; + print ''; // Default language if (! empty($conf->global->MAIN_MULTILANGS)) @@ -1863,10 +1863,30 @@ dol_htmloutput_errors($error,$errors); - $showlogo=$object->logo; + //$showlogo=$object->logo; + $showlogo=1; $showbarcode=empty($conf->barcode->enabled)?0:1; if (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->barcode->lire_advance)) $showbarcode=0; + print '
'; + //$morehtmlleft='
'.img_picto('', 'title_companies', '', '').'
'; + if ($showlogo) $morehtmlleft.='
'.$form->showphoto('societe',$object,0,0,0,'photoref').'
'; + //if ($showlogo) $morehtmlleft.='
'.$form->showphoto('societe',$object,0,0,0,'photoref').'
'; + if ($showbarcode) $morehtmlleft.='
'.$form->showbarcode($object).'
'; + if (! empty($conf->use_javascript_ajax) && $user->rights->societe->creer && ! empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) { + $morehtmlright.=ajax_object_onoff($object, 'status', 'status', 'InActivity', 'ActivityCeased'); + } else { + $morehtmlright.=$object->getLibStatut(2); + } + $morehtml=''; + if (! empty($object->ame_nalias)) $morehtml.='
'.$object->name_alias.'
'; + $morehtml.='
'; + $morehtml.=$object->getBannerAddress('refaddress',$object); + $morehtml.='
'; + print $form->showrefnav($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom', $morehtml, '', 0, $morehtmlleft, $morehtmlright); + print '
'; + print '
'; + print '
'.$langs->trans("Filter").'
'.$langs->trans("ThirdParty").''; @@ -293,8 +294,8 @@ print ''; print '

'; -print ''; -print ''; +print '
'; +print ''; print ''; print ''; if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) @@ -305,13 +306,15 @@ print ''; $oldyear=0; +$var=true; foreach ($data_all_year as $val) { $year = $val['year']; while ($year && $oldyear > $year+1) { // If we have empty year $oldyear--; - print ''; + $var=!$var; + print ''; print ''; if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) { @@ -321,7 +324,8 @@ print ''; print ''; } - print ''; + $var=!$var; + print ''; print ''; print ''; if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 62707beec64d3..5a163d0bbd203 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -1562,9 +1562,11 @@ -webkit-box-shadow: 0 -1px 4px rgba(0,0,0,.1); box-shadow: 0 -1px 4px rgba(0,0,0,.1); margin-bottom: 0 0.2em 0 0.2em !important; + border-right: 1px solid #AAA !important; border-left: 1px solid #AAA !important; border-top: 1px solid #BBB !important; + -moz-border-radius:4px 4px 0 0; -webkit-border-radius: 4px 4px 0 0; border-radius: 4px 4px 0 0; @@ -1897,7 +1899,9 @@ border-collapse: collapse !important; padding: 1px 2px 1px 3px; /* t r b l */ } - +table.borderplus { + border: 1px solid #BBB; +} .border tbody tr, .border tbody tr td { height: 20px; } @@ -2374,6 +2378,10 @@ box-shadow: 0px 0px 0px #DDD !important; } +#tablelines tr.liste_titre td, .paymenttable tr.liste_titre td, .margintable tr.liste_titre td, .tableforservicepart1 tr.liste_titre td { + border-bottom: 1px solid #AAA !important; +} + /* * Boxes @@ -3535,6 +3543,7 @@ } .dropdown dd ul li { white-space: nowrap; + font-weight: normal; } .dropdown dd ul li a { padding:5px; diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 336505215b5b4..4210804ce7d98 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -251,6 +251,7 @@ border:solid 1px rgba(0,0,0,.3); border-top:solid 1px rgba(0,0,0,.3); border-bottom:solid 1px rgba(0,0,0,.2); + background-color: #FFF; /* box-shadow: 1px 1px 1px rgba(0,0,0,.2) inset;*/ padding:4px; margin-left:1px; @@ -1555,9 +1556,9 @@ -webkit-box-shadow: 0 -1px 4px rgba(0,0,0,.1); box-shadow: 0 -1px 4px rgba(0,0,0,.1); - border-right: 1px solid #CCCCCC; - border-left: 1px solid #f4f4f4; - border-top: 1px solid #D8D8D8; + border-right: 1px solid #AAA !important; + border-left: 1px solid #AAA !important; + border-top: 1px solid #BBB !important; -moz-border-radius:3px 3px 0px 0px; -webkit-border-radius:3px 3px 0px 0px; @@ -2243,6 +2244,10 @@ box-shadow: 0px 0px 0px #f4f4f4 !important; } +#tablelines tr.liste_titre td, .paymenttable tr.liste_titre td, .margintable tr.liste_titre td, .tableforservicepart1 tr.liste_titre td { + border-bottom: 1px solid #AAA !important; +} + /* * Boxes @@ -3407,6 +3412,7 @@ } .dropdown dd ul li { white-space: nowrap; + font-weight: normal; } .dropdown dd ul li a { padding:5px; From effba68511eb34dc8067c41f96366cc5865dcd12 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 10 Oct 2015 01:51:12 +0200 Subject: [PATCH 063/297] Start to work on a common banner for tabs (goal is to have a nicer and generic part for all element) --- htdocs/core/class/commonobject.class.php | 74 +++++++++++++++++++++ htdocs/core/class/html.form.class.php | 44 +++++++------ htdocs/core/lib/company.lib.php | 46 ++++--------- htdocs/core/lib/functions.lib.php | 39 +++++++---- htdocs/societe/soc.php | 84 +++++++++++++++++------- htdocs/theme/eldy/style.css.php | 44 ++++++++++++- 6 files changed, 235 insertions(+), 96 deletions(-) diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index bfa1595197e3b..76fd73a324dcb 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -434,6 +434,80 @@ function getFullAddress($withcountry=0,$sep="\n") } + /** + * Return full address of contact + * + * @param Societe $object Object Societe or null + * @return string Full address string + */ + function getBannerAddress($htmlkey, $object=null) + { + global $conf, $langs; + + $countriesusingstate=array('AU','US','IN','GB','ES','UK','TR'); + + $out=''; + + $out.=''; + + $outdone=0; + $coords = $this->getFullAddress(1,', '); + if (! empty($conf->use_javascript_ajax)) + { + $namecoords = $this->getFullName($langs,1).'
'.$coords; + // hideonsmatphone because copyToClipboard call jquery dialog that does not work with jmobile + $out.=''; + $out.=img_picto($langs->trans("Address"), 'object_address.png'); + $out.=' '; + } + if ($coords) { + $out.=dol_print_address($coords, 'address_'.$htmlkey.'_'.$this->id, $this->element, $this->id, 1); $outdone++; + $outdone++; + } + + if (! in_array($object->country_code,$countriesusingstate) && empty($conf->global->MAIN_FORCE_STATE_INTO_ADDRESS) + && ! empty($conf->global->SOCIETE_DISABLE_STATE) && $this->state) + { + $out.=($outdone?'
':'').$this->state; + $outdone++; + } + + if ($this->phone_pro || $this->phone_mobile || $this->phone_perso || $this->fax) $out.=($outdone?'
':''); + if ($this->phone_pro) { + $out.=dol_print_phone($this->phone_pro,$country_code['code'],$this->rowid,$object->id,'AC_TEL',' ','phone'); $outdone++; + } + if ($this->phone_mobile) { + $out.=dol_print_phone($this->phone_mobile,$country_code['code'],$this->rowid,$object->id,'AC_TEL',' ','phone'); $outdone++; + } + if ($this->phone_perso) { + $out.=dol_print_phone($this->phone_perso,$country_code['code'],$this->rowid,$object->id,'AC_TEL',' ','phone'); $outdone++; + } + if ($this->fax) { + $out.=dol_print_phone($this->fax,$country_code['code'],$this->rowid,$object->id,'AC_FAX',' ','fax'); $outdone++; + } + + $out.='
'; + $outdone=0; + if ($this->email) + { + $out.=dol_print_email($this->email,$this->id,$object->id,'AC_EMAIL',0,0,1); + $outdone++; + } + if ($this->url) + { + $out.=dol_print_url($this->url,'',0,1); + $outdone++; + } + if (! empty($conf->skype->enabled)) + { + if ($this->skype) $out.=($outdone?'
':'').dol_print_skype($this->skype,$this->id,$object->id,'AC_SKYPE'); + } + + $out.=''; + + return $out; + } + /** * Add a link between element $this->element and a contact * diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 0d4bff05d422d..8cc9eaa09a0b5 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -5042,16 +5042,18 @@ function select_export_model($selected='',$htmlname='exportmodelid',$type='',$us * @param int $shownav Show Condition (navigation is shown if value is 1) * @param string $fieldid Nom du champ en base a utiliser pour select next et previous (we make the select max and min on this field) * @param string $fieldref Nom du champ objet ref (object->ref) a utiliser pour select next et previous - * @param string $morehtmlref Code html supplementaire a afficher apres ref + * @param string $morehtmlref More html to show after ref * @param string $moreparam More param to add in nav link url. * @param int $nodbprefix Do not include DB prefix to forge table name + * @param string $morehtmlleft More html code to show before ref + * @param string $morehtmlright More html code to show before navigation arrows * @return string Portion HTML avec ref + boutons nav */ - function showrefnav($object,$paramid,$morehtml='',$shownav=1,$fieldid='rowid',$fieldref='ref',$morehtmlref='',$moreparam='',$nodbprefix=0) + function showrefnav($object,$paramid,$morehtml='',$shownav=1,$fieldid='rowid',$fieldref='ref',$morehtmlref='',$moreparam='',$nodbprefix=0,$morehtmlleft='',$morehtmlright='') { global $langs,$conf; - $ret=''; + $ret=''; if (empty($fieldid)) $fieldid='rowid'; if (empty($fieldref)) $fieldref='ref'; @@ -5064,14 +5066,18 @@ function showrefnav($object,$paramid,$morehtml='',$shownav=1,$fieldid='rowid',$f $next_ref = $object->ref_next?''.(empty($conf->dol_use_jmobile)?'>':' ').'':''; //print "xx".$previous_ref."x".$next_ref; - $ret.='
'; + $ret.='
'; + + $ret.='
'.$morehtmlleft.'
'; + + $ret.='
'; $ret.=dol_htmlentities($object->$fieldref); if ($morehtmlref) { $ret.=' '.$morehtmlref; } - $ret.='
'; + $ret.='
'; if ($previous_ref || $next_ref || $morehtml) { @@ -5079,23 +5085,20 @@ function showrefnav($object,$paramid,$morehtml='',$shownav=1,$fieldid='rowid',$f } if ($morehtml) { - //$ret.='
'; - //$ret.='
'.$langs->trans("Year").''.$langs->trans("NbOfProjects").'
0?'&userid='.$userid:'').'">'.$oldyear.'0
0?'&userid='.$userid:'').'">'.$year.''.$val['nb'].''.$morehtml; $ret.='
  • '.$morehtml.'
  • '; } if ($shownav && ($previous_ref || $next_ref)) { - //$ret.='
    '.$previous_ref.''.$next_ref; $ret.=''; $ret.=''; } if ($previous_ref || $next_ref || $morehtml) { - //$ret.='
    '; $ret.=''; } - $ret.=''; - + $ret.='
    '.$morehtmlright.'
    '; + $ret.=''; + return $ret; } @@ -5132,15 +5135,16 @@ function showbarcode(&$object,$width=100) /** * Return HTML code to output a photo * - * @param string $modulepart Key to define module concerned ('societe', 'userphoto', 'memberphoto') - * @param object $object Object containing data to retrieve file name - * @param int $width Width of photo - * @param int $height Height of photo (auto if 0) - * @param int $caneditfield Add edit fields - * @param string $cssclass CSS name to use on img for photo - * @return string HTML code to output photo + * @param string $modulepart Key to define module concerned ('societe', 'userphoto', 'memberphoto') + * @param object $object Object containing data to retrieve file name + * @param int $width Width of photo + * @param int $height Height of photo (auto if 0) + * @param int $caneditfield Add edit fields + * @param string $cssclass CSS name to use on img for photo + * @param int $genericifundef Use a generic image if no image avaiable + * @return string HTML code to output photo */ - static function showphoto($modulepart, $object, $width=100, $height=0, $caneditfield=0, $cssclass='photowithmargin') + static function showphoto($modulepart, $object, $width=100, $height=0, $caneditfield=0, $cssclass='photowithmargin', $genericifundef=0) { global $conf,$langs; @@ -5199,7 +5203,7 @@ static function showphoto($modulepart, $object, $width=100, $height=0, $caneditf else { $nophoto='/public/theme/common/nophoto.jpg'; - if (in_array($modulepart,array('userphoto','contact'))) // For module thar are "physical" users + if (in_array($modulepart,array('userphoto','contact'))) // For module that are "physical" users { $nophoto='/public/theme/common/user_anonymous.png'; if ($object->gender == 'man') $nophoto='/public/theme/common/user_man.png'; diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php index 9a67065fe649e..aba1876577750 100644 --- a/htdocs/core/lib/company.lib.php +++ b/htdocs/core/lib/company.lib.php @@ -689,10 +689,9 @@ function show_contacts($conf,$langs,$db,$object,$backtopage='') { $obj = $db->fetch_object($result); $var = !$var; - print "
    '; + $contactstatic->id = $obj->rowid; + $contactstatic->ref = $obj->ref; $contactstatic->statut = $obj->statut; $contactstatic->lastname = $obj->lastname; $contactstatic->firstname = $obj->firstname; @@ -705,44 +704,23 @@ function show_contacts($conf,$langs,$db,$object,$backtopage='') $contactstatic->phone_mobile = $obj->phone_mobile; $contactstatic->phone_perso = $obj->phone_perso; $contactstatic->email = $obj->email; + $contactstatic->web = $obj->web; + $contactstatic->skype = $obj->skype; + + $country_code = getCountry($obj->country_id, 'all'); + $contactstatic->country_code = $country_code; + + print "
    '; print $contactstatic->getNomUrl(1,'',0,'&backtopage='.urlencode($backtopage)); print ''; if ($obj->poste) print $obj->poste; print ''; - $outdone=0; - $contactstatic->address = $obj->address; - $contactstatic->zip = $obj->zip; - $contactstatic->town = $obj->town; - $contactstatic->country_id = $obj->country_id; - $coords = $contactstatic->getFullAddress(1,', '); - if (! empty($conf->use_javascript_ajax)) - { - $namecoords = $contactstatic->getFullName($langs,1).'
    '.$coords; - // hideonsmatphone because copyToClipboard call jquery dialog that does not work with jmobile - print ''; - print img_picto($langs->trans("Address"), 'object_address.png'); - print ' '; - } - if ($coords) { print dol_print_address($coords,'address_contact_'.$obj->rowid, 'contact', $obj->rowid); $outdone++; } - - if ($obj->phone_pro || $obj->phone_mobile || $obj->phone_perso || $obj->fax) print ($outdone?'
    ':''); - if ($obj->phone_pro) { print dol_print_phone($obj->phone_pro,$country_code['code'],$obj->rowid,$object->id,'AC_TEL',' ','phone'); $outdone++; } - if ($obj->phone_mobile) { print dol_print_phone($obj->phone_mobile,$country_code['code'],$obj->rowid,$object->id,'AC_TEL',' ','phone'); $outdone++; } - if ($obj->phone_perso) { print dol_print_phone($obj->phone_perso,$country_code['code'],$obj->rowid,$object->id,'AC_TEL',' ','phone'); $outdone++; } - if ($obj->fax) { print dol_print_phone($obj->fax,$country_code['code'],$obj->rowid,$object->id,'AC_FAX',' ','fax'); $outdone++; } - - print '
    '; - $outdone=0; - if ($obj->email) print dol_print_email($obj->email,$obj->rowid,$object->id,'AC_EMAIL',0,0,1); - if (! empty($conf->skype->enabled)) - { - if ($obj->skype) print ($outdone?'
    ':'').dol_print_skype($obj->skype,$obj->rowid,$object->id,'AC_SKYPE'); - } + print $contactstatic->getBannerAddress('contact', $object); print '
    '.fieldLabel('Capital','capital').''.$langs->trans("Currency".$conf->currency).'
    '.$langs->trans("Currency".$conf->currency).'
    '; // Ref @@ -1879,18 +1899,21 @@ */ // Name + /* print ''; print ''; print ''; - + */ + // Alias names (commercial, trademark or alias names) - print '"; // Logo+barcode + /* $rowspan=6; if (! empty($conf->global->SOCIETE_USEPREFIX)) $rowspan++; if (! empty($object->client)) $rowspan++; @@ -1905,12 +1928,12 @@ if ($showlogo && $showbarcode) $htmllogobar.='

    '; if ($showbarcode) $htmllogobar.=$form->showbarcode($object); $htmllogobar.=''; - } + }*/ // Prefix if (! empty($conf->global->SOCIETE_USEPREFIX)) // Old not used prefix field { - print ''; + print ''; print $htmllogobar; $htmllogobar=''; print ''; } @@ -1919,7 +1942,7 @@ if ($object->client) { print ''; @@ -1931,7 +1954,7 @@ if (! empty($conf->fournisseur->enabled) && $object->fournisseur && ! empty($user->rights->fournisseur->lire)) { print ''; @@ -1943,13 +1966,16 @@ if (! empty($conf->barcode->enabled)) { print ''; - print $htmllogobar; $htmllogobar=''; + if ($htmllogobar) $htmllogobar.=$form->showbarcode($object); + print $htmllogobar; + $htmllogobar=''; print ''; } // Status + /* print ''; print ''; print $htmllogobar; $htmllogobar=''; print ''; - + */ + // Address + /* print ''; @@ -2007,7 +2035,8 @@ // Phone / Fax print ''; print ''; - + */ + // Prof ids $i=1; $j=0; while ($i <= 6) @@ -2015,8 +2044,9 @@ $idprof=$langs->transcountry('ProfId'.$i,$object->country_code); if ($idprof!='-') { - if (($j % 2) == 0) print ''; - print ''; + print ''; + print ''; - if (($j % 2) == 1) print ''; + //if (($j % 2) == 1) print ''; + print ''; $j++; } $i++; } - if ($j % 2 == 1) print ''; + //if ($j % 2 == 1) print ''; // VAT payers print ''; - + print ''; + // VAT Code - print ''; + print ''; @@ -2177,13 +2210,14 @@ // Type + Staff $arr = $formcompany->typent_array(1); $object->typent= $arr[$object->typent_code]; - print ''; + print ''; + print ''; // Legal - print ''; + print ''; // Capital - print ''; @@ -2192,7 +2226,7 @@ if (! empty($conf->global->MAIN_MULTILANGS)) { require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; - print ''; - print '"; } @@ -2215,7 +2249,7 @@ // Supplier if ($object->fournisseur) { print ''; - print '"; } diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index b6987ed42cc15..d768f446a0d25 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -604,6 +604,38 @@ padding-bottom: 10px; } +div.arearef { + /*border-bottom: 1px solid #bbb;*/ + padding-top: 2px; + padding-bottom: 5px; + /*padding-right: 3px; + padding-left: 2px;*/ + margin-bottom: 10px; +} +div.heightref { + min-height: 74px; +} +div.divphotoref { + padding-right: 10px; +} +div.statusref { + float: right; + padding-right: 12px; + margin-top: 9px; + margin-bottom: 10px; +} +img.photoref { + height: 68px; + width: 68px; + border: 1px solid #CCC; + -moz-box-shadow: 3px 3px 4px #DDD; + -webkit-box-shadow: 3px 3px 4px #DDD; + box-shadow: 3px 3px 4px #DDD; +} +.underrefbanner { + border-bottom: 2px solid #888; +} + /* ============================================================================== */ /* Menu top et 1ere ligne tableau */ /* ============================================================================== */ @@ -2051,13 +2083,19 @@ /* Pagination */ div.refidpadding { - padding-top: dol_use_jmobile)?'8':'12'; ?>px; + /* padding-top: dol_use_jmobile)?'8':'12'; ?>px; */ } div.refid { - padding-top: dol_use_jmobile)?'5':'12'; ?>px; + /* padding-top: dol_use_jmobile)?'5':'12'; ?>px; */ font-weight: bold; color: #766; - font-size: 120%; + font-size: 160%; +} +div.refidno { + padding-top: 2px; + font-weight: normal; + color: #444; + font-size: px; } div.pagination { From d7dbc8adb144124aa5e229d66ab58f455581d5e7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 10 Oct 2015 02:16:49 +0200 Subject: [PATCH 064/297] Sync theme md --- htdocs/theme/md/style.css.php | 44 ++++++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 3 deletions(-) diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 65c65bdfd9884..9fb050b0ef7c5 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -656,6 +656,38 @@ padding-top: 10px; padding-bottom: 10px; } +div.arearef { + /*border-bottom: 1px solid #bbb;*/ + padding-top: 2px; + padding-bottom: 5px; + /*padding-right: 3px; + padding-left: 2px;*/ + margin-bottom: 10px; +} +div.heightref { + min-height: 74px; +} +div.divphotoref { + padding-right: 10px; +} +div.statusref { + float: right; + padding-right: 12px; + margin-top: 9px; + margin-bottom: 10px; +} +img.photoref { + height: 68px; + width: 68px; + border: 1px solid #CCC; + -moz-box-shadow: 3px 3px 4px #DDD; + -webkit-box-shadow: 3px 3px 4px #DDD; + box-shadow: 3px 3px 4px #DDD; +} +.underrefbanner { + border-bottom: 2px solid #888; +} + /* ============================================================================== */ @@ -1902,13 +1934,19 @@ /* Pagination */ div.refidpadding { - padding-top: dol_use_jmobile)?'8':'12'; ?>px; + /* padding-top: dol_use_jmobile)?'8':'12'; ?>px; */ } div.refid { - padding-top: dol_use_jmobile)?'5':'12'; ?>px; + /* padding-top: dol_use_jmobile)?'5':'12'; ?>px; */ font-weight: bold; color: #766; - font-size: 120%; + font-size: 160%; +} +div.refidno { + padding-top: 2px; + font-weight: normal; + color: #444; + font-size: px; } div.pagination { From 5d7e05e3137917ad81d98baa2f63f10b387a5c02 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Sat, 10 Oct 2015 06:00:55 +0200 Subject: [PATCH 065/297] Correct review --- htdocs/core/modules/modHRM.class.php | 6 +++--- htdocs/install/mysql/data/llx_c_hrm_department.sql | 2 +- htdocs/install/mysql/migration/3.9.0-4.0.0.sql | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/htdocs/core/modules/modHRM.class.php b/htdocs/core/modules/modHRM.class.php index cfc85acff1635..68549d2cd10bf 100644 --- a/htdocs/core/modules/modHRM.class.php +++ b/htdocs/core/modules/modHRM.class.php @@ -26,7 +26,7 @@ * \class modHRM * \brief Class to describe and activate the HRM module */ -class modiHRM extends DolibarrModules +class modHRM extends DolibarrModules { /** * Constructor. @@ -88,8 +88,8 @@ public function __construct($db) $this->dictionnaries=array( 'langs'=>'hrm', 'tabname'=>array( - MAIN_DB_PREFIX."c_ihrm_department", - MAIN_DB_PREFIX."c_ihrm_function" + MAIN_DB_PREFIX."c_hrm_department", + MAIN_DB_PREFIX."c_hrm_function" ), 'tablib'=>array( "DepartmentDict", diff --git a/htdocs/install/mysql/data/llx_c_hrm_department.sql b/htdocs/install/mysql/data/llx_c_hrm_department.sql index 0129856be959b..e6e4921f37273 100644 --- a/htdocs/install/mysql/data/llx_c_hrm_department.sql +++ b/htdocs/install/mysql/data/llx_c_hrm_department.sql @@ -29,7 +29,7 @@ INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(3, 15, INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(4, 20,'IT', 'Inform. Technology (IT)', 1); INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(5, 25,'MARKETING', 'Marketing', 1); INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(6, 30,'SALES', 'Sales', 1); -INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(7, 35,'Legal', 'Legal', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(7, 35,'LEGAL', 'Legal', 1); INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(8, 40,'FINANCIAL', 'Financial accounting', 1); INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(9, 45,'HUMANRES', 'Human resources', 1); INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(10, 50,'PURCHASING', 'Purchasing', 1); 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 5f75235885897..aaa1f28d41ba6 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 @@ -53,7 +53,7 @@ INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(3, 15, INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(4, 20,'IT', 'Inform. Technology (IT)', 1); INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(5, 25,'MARKETING', 'Marketing', 1); INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(6, 30,'SALES', 'Sales', 1); -INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(7, 35,'Legal', 'Legal', 1); +INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(7, 35,'LEGAL', 'Legal', 1); INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(8, 40,'FINANCIAL', 'Financial accounting', 1); INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(9, 45,'HUMANRES', 'Human resources', 1); INSERT INTO llx_c_hrm_department (rowid, pos, code, label, active) VALUES(10, 50,'PURCHASING', 'Purchasing', 1); From 11387a5d38052784331874d42c6886f938b0e26e Mon Sep 17 00:00:00 2001 From: aspangaro Date: Sat, 10 Oct 2015 06:37:43 +0200 Subject: [PATCH 066/297] Add language file --- .tx/config | 6 ++++++ htdocs/langs/en_US/hrm.lang | 13 +++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 htdocs/langs/en_US/hrm.lang diff --git a/.tx/config b/.tx/config index 03301ded37887..3c8c49e40e99d 100644 --- a/.tx/config +++ b/.tx/config @@ -146,6 +146,12 @@ source_file = htdocs/langs/en_US/holiday.lang source_lang = en_US type = MOZILLAPROPERTIES +[dolibarr.hrm] +file_filter = htdocs/langs//hrm.lang +source_file = htdocs/langs/en_US/hrm.lang +source_lang = en_US +type = MOZILLAPROPERTIES + [dolibarr.incoterm] file_filter = htdocs/langs//incoterm.lang source_file = htdocs/langs/en_US/incoterm.lang diff --git a/htdocs/langs/en_US/hrm.lang b/htdocs/langs/en_US/hrm.lang new file mode 100644 index 0000000000000..33c6c271261e0 --- /dev/null +++ b/htdocs/langs/en_US/hrm.lang @@ -0,0 +1,13 @@ +# Dolibarr language file - en_US - hrm +CHARSET=UTF-8 + +Establishments=Establishments +Establishment=Establishment +NewEstablishment=New establishment +DeleteEstablishment=Delete establishment +ConfirmDeleteEstablishment=Are-you sure to delete this establishment ? +OpenEtablishment=Open establishment +CloseEtablishment=Close establishment +Employees=Employees +Employee=Employee +NewEmployee=New employee From cd7c5645c790980298381b2509c24c71c6eaf29f Mon Sep 17 00:00:00 2001 From: aspangaro Date: Sat, 10 Oct 2015 06:38:42 +0200 Subject: [PATCH 067/297] Add library --- htdocs/core/lib/hrm.lib.php | 120 ++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 htdocs/core/lib/hrm.lib.php diff --git a/htdocs/core/lib/hrm.lib.php b/htdocs/core/lib/hrm.lib.php new file mode 100644 index 0000000000000..f7f3ed11bd834 --- /dev/null +++ b/htdocs/core/lib/hrm.lib.php @@ -0,0 +1,120 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/core/lib/hrm.lib.php + * \ingroup HRM + * \brief Library for hrm + */ +$langs->load('hrm'); + +/** + * Return head table for employee tabs screen + * + * @param object $object contact + * @return array head table of tabs + */ +function employee_prepare_head($object) { + global $langs, $conf, $user; + + $h = 0; + $head = array (); + + $head [$h] [0] = DOL_URL_ROOT.'/hrm/employee/card.php?id=' . $object->id; + $head [$h] [1] = $langs->trans("Card"); + $head [$h] [2] = 'card'; + $h ++; + + complete_head_from_modules($conf, $langs, $object, $head, $h, 'employee'); + + $head [$h] [0] = DOL_URL_ROOT.'/hrm/employee/info.php?id=' . $object->id; + $head [$h] [1] = $langs->trans("Info"); + $head [$h] [2] = 'info'; + $h ++; + + complete_head_from_modules($conf, $langs, $object, $head, $h, 'employee', 'remove'); + + return $head; +} + +/** + * Return head table for establishment tabs screen + * + * @param Establishment $object Object related to tabs + * @return array Array of tabs to show + */ +function establishment_prepare_head($object) +{ + global $langs, $conf; + + $h = 0; + $head = array(); + + $head[$h][0] = DOL_URL_ROOT.'/hrm/establishment/card.php?id=' . $object->id; + $head[$h][1] = $langs->trans("Card"); + $head[$h][2] = 'card'; + $h++; + + // Show more tabs from modules + // Entries must be declared in modules descriptor with line + // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab + // $this->tabs = array('entity:-tabname); to remove a tab + complete_head_from_modules($conf,$langs,$object,$head,$h,'establishment'); + + $head[$h][0] = DOL_URL_ROOT.'/hrm/establishment/info.php?id=' . $object->id; + $head[$h][1] = $langs->trans("Info"); + $head[$h][2] = 'info'; + $h++; + + complete_head_from_modules($conf,$langs,$object,$head,$h,'establishment','remove'); + + return $head; +} + +/** + * Return array head with list of tabs to view object informations + * + * @return array head + */ +function hrm_admin_prepare_head() +{ + global $langs, $conf, $user; + + $h = 0; + $head = array(); + + $head[$h][0] = DOL_URL_ROOT.'/hrm/admin/admin_hrm.php'; + $head[$h][1] = $langs->trans("Parameters"); + $head[$h][2] = 'parameters'; + $h++; + + $head[$h][0] = DOL_URL_ROOT.'/hrm/admin/admin_establishment.php'; + $head[$h][1] = $langs->trans("Establishments"); + $head[$h][2] = 'establishments'; + $h++; + + // Show more tabs from modules + // Entries must be declared in modules descriptor with line + // $this->tabs = array('entity:+tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to add new tab + // $this->tabs = array('entity:-tabname:Title:@mymodule:/mymodule/mypage.php?id=__ID__'); to remove a tab + complete_head_from_modules($conf,$langs,'',$head,$h,'hrm_admin'); + + complete_head_from_modules($conf,$langs,'',$head,$h,'hrm_admin','remove'); + + return $head; +} + From 8f8de587b8e8c2049ea721d8a6862aeaa1b3c116 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Sat, 10 Oct 2015 06:39:59 +0200 Subject: [PATCH 068/297] Add admin & first version to manage establishment --- htdocs/core/modules/modHRM.class.php | 2 +- htdocs/hrm/admin/admin_establishment.php | 126 +++++++ htdocs/hrm/admin/admin_hrm.php | 58 +++ htdocs/hrm/admin/index.html | 0 htdocs/hrm/class/establishment.class.php | 324 +++++++++++++++++ htdocs/hrm/class/index.html | 0 htdocs/hrm/establishment/card.php | 415 ++++++++++++++++++++++ htdocs/hrm/establishment/index.html | 0 htdocs/hrm/establishment/info.php | 59 +++ htdocs/hrm/index.html | 0 htdocs/theme/eldy/img/object_building.png | Bin 0 -> 563 bytes htdocs/theme/md/img/object_building.png | Bin 0 -> 563 bytes 12 files changed, 983 insertions(+), 1 deletion(-) create mode 100644 htdocs/hrm/admin/admin_establishment.php create mode 100644 htdocs/hrm/admin/admin_hrm.php create mode 100644 htdocs/hrm/admin/index.html create mode 100644 htdocs/hrm/class/establishment.class.php create mode 100644 htdocs/hrm/class/index.html create mode 100644 htdocs/hrm/establishment/card.php create mode 100644 htdocs/hrm/establishment/index.html create mode 100644 htdocs/hrm/establishment/info.php create mode 100644 htdocs/hrm/index.html create mode 100644 htdocs/theme/eldy/img/object_building.png create mode 100644 htdocs/theme/md/img/object_building.png diff --git a/htdocs/core/modules/modHRM.class.php b/htdocs/core/modules/modHRM.class.php index 68549d2cd10bf..c63fa04f65e44 100644 --- a/htdocs/core/modules/modHRM.class.php +++ b/htdocs/core/modules/modHRM.class.php @@ -62,7 +62,7 @@ public function __construct($db) $this->dirs = array (); // Config pages - $this->config_page_url = array('admin_hrm.php'); + $this->config_page_url = array('admin_hrm.php@hrm'); // Dependencies $this->depends = array(); diff --git a/htdocs/hrm/admin/admin_establishment.php b/htdocs/hrm/admin/admin_establishment.php new file mode 100644 index 0000000000000..2fb6507d0bab8 --- /dev/null +++ b/htdocs/hrm/admin/admin_establishment.php @@ -0,0 +1,126 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/hrm/admin/admin_establishment.php + * \ingroup HRM + * \brief HRM Establishment module setup page + */ +require('../../main.inc.php'); +require_once DOL_DOCUMENT_ROOT.'/core/lib/hrm.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/hrm/class/establishment.class.php'; + +$langs->load("admin"); +$langs->load('hrm'); + +if (! $user->admin) + accessforbidden(); + +$error=0; + +$action = GETPOST('action', 'alpha'); + +$object = new Establishment($db); + +/* + * Actions + */ + +/* + * View + */ +$page_name = "Establishments"; +llxHeader('', $langs->trans($page_name)); + +$form = new Form($db); + +dol_htmloutput_mesg($mesg); + +// Subheader +$linkback = '' . $langs->trans("BackToModuleList") . ''; +print load_fiche_titre($langs->trans($page_name), $linkback); + +// Configuration header +$head = hrm_admin_prepare_head(); +dol_fiche_head($head, 'establishments', $langs->trans("HRM"), 0, "user"); + +$sql = "SELECT e.rowid, e.name, e.address, e.zip, e.town, e.statut"; +$sql.= " FROM ".MAIN_DB_PREFIX."establishment as e"; +$sql.= " WHERE e.entity = ".$conf->entity; + +$result = $db->query($sql); +if ($result) +{ + $var=false; + $num = $db->num_rows($result); + + $i = 0; + + // Load attribute_label + print '
    '.$langs->trans('ThirdPartyName').''; print $form->showrefnav($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); print '
    '.$langs->trans('AliasNames').''; + print '
    '.$langs->trans('AliasNames').''; print $object->name_alias; print "
    '.$langs->trans('Prefix').''.$object->prefix_comm.'
    '.$langs->trans('Prefix').''.$object->prefix_comm.'
    '; - print $langs->trans('CustomerCode').''; + print $langs->trans('CustomerCode').''; print $object->code_client; if ($object->check_codeclient() <> 0) print ' ('.$langs->trans("WrongCustomerCode").')'; print '
    '; - print $langs->trans('SupplierCode').''; + print $langs->trans('SupplierCode').''; print $object->code_fournisseur; if ($object->check_codefournisseur() <> 0) print ' ('.$langs->trans("WrongSupplierCode").')'; print '
    '; - print $langs->trans('Gencod').''.$object->barcode; + print $langs->trans('Gencod').''.$object->barcode; print '
    '.$langs->trans("Status").''; if (! empty($conf->use_javascript_ajax) && $user->rights->societe->creer && ! empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) { @@ -1960,8 +1986,10 @@ print '
    '.$langs->trans('Address').''; dol_print_address($object->address,'gmap','thirdparty',$object->id); print '
    '.$langs->trans('Phone').''.dol_print_phone($object->phone,$object->country_code,0,$object->id,'AC_TEL').''.$langs->trans('Fax').''.dol_print_phone($object->fax,$object->country_code,0,$object->id,'AC_FAX').'
    '.$idprof.''; + //if (($j % 2) == 0) print '
    '.$idprof.''; $key='idprof'.$i; print $object->$key; if ($object->$key) @@ -2025,12 +2055,13 @@ else print ' ('.$langs->trans("ErrorWrongValue").')'; } print '
    '; @@ -2038,9 +2069,11 @@ print ''; print yn($object->tva_assuj); print '
    '.$langs->trans('VATIntra').''; + print '
    '.$langs->trans('VATIntra').''; if ($object->tva_intra) { $s=''; @@ -2083,7 +2116,7 @@ { print '
    '.$langs->transcountry("LocalTax1IsUsed",$mysoc->country_code).''; print yn($object->localtax1_assuj); - print ''.$langs->transcountry("LocalTax2IsUsed",$mysoc->country_code).''; + print '
    '.$langs->transcountry("LocalTax2IsUsed",$mysoc->country_code).''; print yn($object->localtax2_assuj); print '
    '.$langs->trans("ThirdPartyType").''.$object->typent.''.$langs->trans("Staff").''.$object->effectif.'
    '.$langs->trans("ThirdPartyType").''.$object->typent.'
    '.$langs->trans("Staff").''.$object->effectif.'
    '.$langs->trans('JuridicalStatus').''.$object->forme_juridique.'
    '.$langs->trans('JuridicalStatus').''.$object->forme_juridique.'
    '.$langs->trans('Capital').''; + print '
    '.$langs->trans('Capital').''; if ($object->capital) print price($object->capital,'',$langs,0,-1,-1, $conf->currency); else print ' '; print '
    '.$langs->trans("DefaultLang").''; + print '
    '.$langs->trans("DefaultLang").''; //$s=picto_from_langcode($object->default_lang); //print ($s?$s.' ':''); $langs->load("languages"); @@ -2207,7 +2241,7 @@ // Customer if ($object->prospect || $object->client) { print '
    ' . $langs->trans("CustomersCategoriesShort") . ''; + print ''; print $form->showCategories($object->id, 'customer', 1); print "
    ' . $langs->trans("SuppliersCategoriesShort") . ''; + print ''; print $form->showCategories($object->id, 'supplier', 1); print "
    '; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + if ($num) + { + $establishmentstatic=new Establishment($db); + + while ($i < $num && $i < $max) + { + $obj = $db->fetch_object($result); + $fiscalyearstatic->id=$obj->rowid; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + $var=!$var; + $i++; + } + + } + else + { + print ''; + } + + print '
    '.$langs->trans("Ref").''.$langs->trans("Name").''.$langs->trans("Address").''.$langs->trans("Zipcode").''.$langs->trans("Town").''.$langs->trans("Statut").'
    '.img_object($langs->trans("ShowEstablishment"),"building").' '.$obj->rowid.''.$obj->name.''.$obj->address.''.$obj->zip.''.$obj->town.''.$establishmentstatic->LibStatut($obj->statut,5).'
    '.$langs->trans("None").'
    '; +} +else +{ + dol_print_error($db); +} + +dol_fiche_end(); + +// Buttons +print ''; + +llxFooter(); +$db->close(); diff --git a/htdocs/hrm/admin/admin_hrm.php b/htdocs/hrm/admin/admin_hrm.php new file mode 100644 index 0000000000000..d66185315eb66 --- /dev/null +++ b/htdocs/hrm/admin/admin_hrm.php @@ -0,0 +1,58 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/hrm/admin/admin_ihrm.php + * \ingroup HRM + * \brief HRM module setup page + */ +require('../../main.inc.php'); +require_once DOL_DOCUMENT_ROOT.'/core/lib/hrm.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; + +$langs->load("admin"); +$langs->load('hrm'); + +if (! $user->admin) + accessforbidden(); + +$action = GETPOST('action', 'alpha'); + +/* + * Actions + */ + +/* + * View + */ +$page_name = "Parameters"; +llxHeader('', $langs->trans($page_name)); + +$form = new Form($db); + +dol_htmloutput_mesg($mesg); + +// Subheader +$linkback = '' . $langs->trans("BackToModuleList") . ''; +print load_fiche_titre($langs->trans($page_name), $linkback); + +// Configuration header +$head = hrm_admin_prepare_head(); +dol_fiche_head($head, 'parameters', $langs->trans("HRM"), 0, "user"); + +llxFooter(); +$db->close(); diff --git a/htdocs/hrm/admin/index.html b/htdocs/hrm/admin/index.html new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/htdocs/hrm/class/establishment.class.php b/htdocs/hrm/class/establishment.class.php new file mode 100644 index 0000000000000..208d38c1fd122 --- /dev/null +++ b/htdocs/hrm/class/establishment.class.php @@ -0,0 +1,324 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/custom/ihrm/class/establishment.class.php + * \ingroup iHRM + * \brief File of class to manage establishments + */ + +require_once DOL_DOCUMENT_ROOT .'/core/class/commonobject.class.php'; + +/** + * Class to manage establishments + */ +class Establishment extends CommonObject +{ + public $element='establishment'; + public $table_element='ihrm_establishment'; + public $table_element_line = ''; + public $fk_element = 'fk_establishment'; + protected $ismultientitymanaged = 1; // 0=No test on entity, 1=Test with field entity, 2=Test with link by societe + + var $rowid; + + var $name; + var $address; + var $zip; + var $town; + var $statut; // 0=open, 1=closed + var $entity; + + var $statuts=array(); + var $statuts_short=array(); + + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + function __construct($db) + { + $this->db = $db; + + $this->statuts_short = array(0 => 'Opened', 1 => 'Closed'); + $this->statuts = array(0 => 'Opened', 1 => 'Closed'); + + return 1; + } + + /** + * Create object in database + * + * @param User $user User making creation + * @return int <0 if KO, >0 if OK + */ + function create($user) + { + global $conf; + + $error = 0; + + $now=dol_now(); + + $this->db->begin(); + + $sql = "INSERT INTO ".MAIN_DB_PREFIX."ihrm_establishment ("; + $sql.= "name"; + $sql.= ", address"; + $sql.= ", zip"; + $sql.= ", town"; + $sql.= ", statut"; + $sql.= ", entity"; + $sql.= ", datec"; + $sql.= ", fk_user_author"; + $sql.= ") VALUES ("; + $sql.= " '".$this->name."'"; + $sql.= ", '".$this->address."'"; + $sql.= ", '".$this->zip."'"; + $sql.= ", '".$this->town."'"; + $sql.= ", ".$this->statut; + $sql.= ", ".$conf->entity; + $sql.= ", '".$this->db->idate($now)."'"; + $sql.= ", ". $user->id; + $sql.= ")"; + + $this->db->begin(); + + dol_syslog(get_class($this)."::create", LOG_DEBUG); + $resql = $this->db->query($sql); + if (! $resql) { + $error ++; + $this->errors[] = "Error " . $this->db->lasterror(); + } + + if (! $error) { + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . "ihrm_establishment"); + } + + // Commit or rollback + if ($error) { + foreach ( $this->errors as $errmsg ) { + dol_syslog(get_class($this) . "::create " . $errmsg, LOG_ERR); + $this->error .= ($this->error ? ', ' . $errmsg : $errmsg); + } + $this->db->rollback(); + return - 1 * $error; + } else { + $this->db->commit(); + return $this->id; + } + } + + /** + * Update record + * + * @param User $user User making update + * @return int <0 if KO, >0 if OK + */ + function update($user) + { + global $langs; + + // Check parameters + if (empty($this->name)) + { + $this->error='ErrorBadParameter'; + return -1; + } + + $this->db->begin(); + + $sql = "UPDATE ".MAIN_DB_PREFIX."ihrm_establishment"; + $sql .= " SET name = '".$this->name."'"; + $sql .= ", address = '".$this->address."'"; + $sql .= ", zip = '".$this->zip."'"; + $sql .= ", town = '".$this->town."'"; + $sql .= ", statut = '".$this->statut."'"; + $sql .= ", fk_user_mod = " . $user->id; + $sql .= " WHERE rowid = ".$this->id; + + dol_syslog(get_class($this) . "::update sql=" . $sql, LOG_DEBUG); + $result = $this->db->query($sql); + if ($result) { + $this->db->commit(); + return 1; + } else { + $this->error = $this->db->lasterror(); + $this->db->rollback(); + return - 1; + } + } + + /** + * Load an object from database + * + * @param int $id Id of record to load + * @return int <0 if KO, >0 if OK + */ + function fetch($id) + { + $sql = "SELECT rowid, name, address, zip, town, statut"; + $sql.= " FROM ".MAIN_DB_PREFIX."ihrm_establishment"; + $sql.= " WHERE rowid = ".$id; + + dol_syslog(get_class($this)."::fetch", LOG_DEBUG); + $result = $this->db->query($sql); + if ( $result ) + { + $obj = $this->db->fetch_object($result); + + $this->id = $obj->rowid; + $this->name = $obj->name; + $this->address = $obj->address; + $this->zip = $obj->zip; + $this->town = $obj->town; + $this->statut = $obj->statut; + + return 1; + } + else + { + $this->error=$this->db->lasterror(); + return -1; + } + } + + /** + * Delete record + * + * @param int $id Id of record to delete + * @return int <0 if KO, >0 if OK + */ + function delete($id) + { + $this->db->begin(); + + $sql = "DELETE FROM ".MAIN_DB_PREFIX."ihrm_establishment WHERE rowid = ".$id; + + dol_syslog(get_class($this)."::delete", LOG_DEBUG); + $result = $this->db->query($sql); + if ($result) + { + $this->db->commit(); + return 1; + } + else + { + $this->error=$this->db->lasterror(); + $this->db->rollback(); + return -1; + } + } + + /** + * Give a label from a status + * + * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto + * @return string Label + */ + function getLibStatut($mode=0) + { + return $this->LibStatut($this->statut,$mode); + } + + /** + * Give a label from a status + * + * @param int $statut Id status + * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto + * @return string Label + */ + function LibStatut($statut,$mode=0) + { + global $langs; + + if ($mode == 0) + { + return $langs->trans($this->statuts[$statut]); + } + if ($mode == 1) + { + return $langs->trans($this->statuts_short[$statut]); + } + if ($mode == 2) + { + if ($statut==0) return img_picto($langs->trans($this->statuts_short[$statut]),'statut4').' '.$langs->trans($this->statuts_short[$statut]); + if ($statut==1) return img_picto($langs->trans($this->statuts_short[$statut]),'statut8').' '.$langs->trans($this->statuts_short[$statut]); + } + if ($mode == 3) + { + if ($statut==0 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut4'); + if ($statut==1 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut8'); + } + if ($mode == 4) + { + if ($statut==0 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut4').' '.$langs->trans($this->statuts[$statut]); + if ($statut==1 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut8').' '.$langs->trans($this->statuts[$statut]); + } + if ($mode == 5) + { + if ($statut==0 && ! empty($this->statuts_short[$statut])) return $langs->trans($this->statuts_short[$statut]).' '.img_picto($langs->trans($this->statuts_short[$statut]),'statut4'); + if ($statut==1 && ! empty($this->statuts_short[$statut])) return $langs->trans($this->statuts_short[$statut]).' '.img_picto($langs->trans($this->statuts_short[$statut]),'statut8'); + } + } + + /** + * Information on record + * + * @param int $id Id of record + * @return void + */ + function info($id) + { + $sql = 'SELECT e.rowid, e.datec, e.fk_user_author, e.tms, e.fk_user_mod'; + $sql.= ' FROM '.MAIN_DB_PREFIX.'ihrm_establishment as e'; + $sql.= ' WHERE e.rowid = '.$id; + + dol_syslog(get_class($this)."::fetch info", LOG_DEBUG); + $result = $this->db->query($sql); + + if ($result) + { + if ($this->db->num_rows($result)) + { + $obj = $this->db->fetch_object($result); + $this->id = $obj->rowid; + if ($obj->fk_user_author) + { + $cuser = new User($this->db); + $cuser->fetch($obj->fk_user_author); + $this->user_creation = $cuser; + } + if ($obj->fk_user_modif) + { + $muser = new User($this->db); + $muser->fetch($obj->fk_user_mod); + $this->user_modification = $muser; + } + $this->date_creation = $this->db->jdate($obj->datec); + $this->date_modification = $this->db->jdate($obj->tms); + } + $this->db->free($result); + } + else + { + dol_print_error($this->db); + } + } + +} diff --git a/htdocs/hrm/class/index.html b/htdocs/hrm/class/index.html new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/htdocs/hrm/establishment/card.php b/htdocs/hrm/establishment/card.php new file mode 100644 index 0000000000000..dc3b29225c2aa --- /dev/null +++ b/htdocs/hrm/establishment/card.php @@ -0,0 +1,415 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/custom/ihrm/establishment/card.php + * \brief Page to show an establishment + */ +$res = @include ("../../main.inc.php"); // For root directory +if (! $res) + $res = @include ("../../../main.inc.php"); // For "custom" directory +if (! $res) + die("Include of main fails"); + +require_once ('../core/lib/ihrm.lib.php'); +require_once ('../class/establishment.class.php'); +require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; + +$langs->load("admin"); +$langs->load("compta"); + +// Security check +if (! $user->admin) accessforbidden(); + +$error=0; + +$action = GETPOST('action','alpha'); +$cancel = GETPOST('cancel', 'alpha'); +$confirm = GETPOST('confirm','alpha'); +$id = GETPOST('id','int'); + +// List of statut +static $tmpstatut2label=array( + '0'=>'OpenEtablishment', + '1'=>'CloseEtablishment' +); +$statut2label=array(''); +foreach ($tmpstatut2label as $key => $val) $statut2label[$key]=$langs->trans($val); + +$object = new Establishment($db); + +/* + * Actions + */ + +if ($action == 'confirm_delete' && $confirm == "yes") +{ + $result=$object->delete($id); + if ($result >= 0) + { + header("Location: ../admin/admin_establishment.php"); + exit; + } + else + { + setEventMessage($object->error, 'errors'); + } +} + +else if ($action == 'add') +{ + if (! $cancel) + { + $error=0; + + $object->name = GETPOST('name', 'alpha'); + if (empty($object->name)) + { + setEventMessage($langs->trans("ErrorFieldRequired",$langs->transnoentitiesnoconv("Name")), 'errors'); + $error++; + } + + if (empty($error)) + { + $tmparray=getCountry(GETPOST('country_id','int'),'all',$db,$langs,0); + if (! empty($tmparray['id'])) + { + $object->country_id =$tmparray['id']; + $object->country_code =$tmparray['code']; + $object->country_label=$tmparray['label']; + } + + $object->address = GETPOST('address', 'alpha'); + $object->zip = GETPOST('zipcode', 'alpha'); + $object->town = GETPOST('town', 'alpha'); + $object->fk_pays = $object->country_id; + $object->statut = GETPOST('statut','int'); + $object->fk_user_author = $user->id; + $object->datec = dol_now(); + + $id = $object->create($user); + + if ($id > 0) + { + header("Location: " . $_SERVER["PHP_SELF"] . "?id=" . $id); + exit; + } + else + { + setEventMessage($object->error, 'errors'); + $action='create'; + } + } + else + { + $action='create'; + } + } + else + { + header("Location: ../admin/admin_establishment.php"); + exit; + } +} + +// Update record +else if ($action == 'update') +{ + $error = 0; + + if (! $cancel) { + + $name = GETPOST('name', 'alpha'); + if (empty($name)) { + setEventMessage($langs->trans('ErrorFieldRequired', $langs->trans('NameProperty')), 'errors'); + $error ++; + } + $typeid = GETPOST('typeid', 'int'); + if (empty($typeid)) { + setEventMessage($langs->trans('ErrorFieldRequired', $langs->trans('TypeProperty')), 'errors'); + $error ++; + } + + if (empty($error)) { + $object->name = GETPOST('name', 'alpha'); + $object->address = GETPOST('address', 'alpha'); + $object->zip = GETPOST('zipcode', 'alpha'); + $object->town = GETPOST('town', 'alpha'); + $object->fk_pays = GETPOST('country_id', 'int'); + $object->rowid = GETPOST('id'); + $object->fk_user_mod = $user->id; + + $id = $object->update(); + + if ($id > 0) + { + header("Location: " . $_SERVER["PHP_SELF"] . "?id=" . $id); + exit; + } + else + { + setEventMessage($object->error, 'errors'); + $action='create'; + } + } + } else { + header("Location: card.php?id=" . $id); + exit; + } +} + +/* + * View + */ + +llxHeader(); + +$form = new Form($db); +$formcompany = new FormCompany($db); + +/* + * Action create + */ +if ($action == 'create') +{ + print load_fiche_titre($langs->trans("NewEstablishment")); + + print '
    '; + print ''; + print ''; + + dol_fiche_head(); + + print ''; + + // Name + print ''; + + // Address + print ''; + print ''; + print ''; + print ''; + + // Zipcode + print ''; + print ''; + print ''; + print ''; + + // Town + print ''; + print ''; + print ''; + print ''; + + // Country + print ''; + print ''; + print ''; + print ''; + + // Statut + print ''; + print ''; + print ''; + + print '
    '; + print ''; + print '
    '; + print $formcompany->select_ziptown(GETPOST('zipcode', 'alpha'), 'zipcode', array ( + 'town', + 'selectcountry_id' + ), 6); + print '
    '; + print $formcompany->select_ziptown(GETPOST('town', 'alpha'), 'town', array ( + 'zipcode', + 'selectcountry_id' + )); + print '
    '; + print $form->select_country($mysoc->country_id,'country_id'); + if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); + print '
    '; + print $form->selectarray('statut',$statut2label,GETPOST('statut')); + print '
    '; + + dol_fiche_end(); + + print '
    '; + print ''; + print '     '; + print ''; + print '
    '; + + print '
    '; +} +else if ($id) +{ + $result = $object->fetch($id); + if ($result > 0) + { + $head = establishment_prepare_head($object); + + if ($action == 'edit') + { + dol_fiche_head($head, 'card', $langs->trans("Establishment"), 0, 'building@ihrm'); + + print '
    ' . "\n"; + print ''; + print ''; + print ''; + + print ''; + + // Ref + print ""; + print ''; + + // Name + print ''; + + // Address + print ''; + print ''; + print ''; + print ''; + + // Zipcode / Town + print ''; + print ''; + + // Country + print ''; + print ''; + print ''; + print ''; + + // Statut + print ''; + + print '
    '.$langs->trans("Ref").''; + print $object->rowid; + print '
    '; + print ''; + print '
    '; + print ''; + print '
    '; + print $formcompany->select_ziptown($object->zip, 'zipcode', array ( + 'town', + 'selectcountry_id' + ), 6) . '
    '; + print $formcompany->select_ziptown($object->town, 'town', array ( + 'zipcode', + 'selectcountry_id' + )) . '
    '; + print $form->select_country($object->fk_pays,'country_id'); + if ($user->admin) print info_admin($langs->trans("YouCanChangeValuesForThisListFromDictionarySetup"),1); + print '
    '; + print $form->selectarray('statut',$statut2label,$object->statut); + print '
    '; + + dol_fiche_end(); + + print '
    '; + print ''; + print '     '; + print ''; + print '
    '; + + print '
    '; + } + else + { + /* + * Confirm delete + */ + if ($action == 'delete') + { + print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$id,$langs->trans("DeleteEstablishment"),$langs->trans("ConfirmDeleteEstablishment"),"confirm_delete"); + + } + + dol_fiche_head($head, 'card', $langs->trans("Establishment"), 0, 'building@ihrm'); + + print ''; + + $linkback = ''.$langs->trans("BackToList").''; + + // Ref + print ''; + + // Name + print ''; + print ''; + print ''; + print ''; + + // Address + print ''; + print ''; + print ''; + print ''; + + // Zipcode + print ''; + print ''; + print ''; + print ''; + + // Town + print ''; + print ''; + print ''; + print ''; + + // Country + print ''; + print ''; + print ''; + print ''; + + // Statut + print ''; + + print "
    '.$langs->trans("Ref").''; + print $object->rowid; + print ''; + print $linkback; + print '
    '.$langs->trans("Name").''.$object->name.'
    '.$langs->trans("Address").''.$object->address.'
    '.$langs->trans("Zipcode").''.$object->zip.'
    '.$langs->trans("Town").''.$object->town.'
    '.$langs->trans("Country").''.getCountry($object->fk_pays,1).'
    '.$langs->trans("Status").''.$object->getLibStatut(4).'
    "; + + dol_fiche_end(); + + /* + * Barre d'actions + */ + + print '
    '; + print ''.$langs->trans('Modify').''; + print ''.$langs->trans('Delete').''; + print '
    '; + } + } + else + { + dol_print_error($db); + } +} + +llxFooter(); + +$db->close(); diff --git a/htdocs/hrm/establishment/index.html b/htdocs/hrm/establishment/index.html new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/htdocs/hrm/establishment/info.php b/htdocs/hrm/establishment/info.php new file mode 100644 index 0000000000000..06ba9875e58d5 --- /dev/null +++ b/htdocs/hrm/establishment/info.php @@ -0,0 +1,59 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/custom/ihrm/establishment/info.php + * \brief Page to show info of an establishment + */ + +require '../../main.inc.php'; + +require_once ('../core/lib/ihrm.lib.php'); +require_once ('../class/establishment.class.php'); +require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; + +$langs->load("admin"); +$langs->load("compta"); + +// Security check +if (! $user->admin) accessforbidden(); + +$id = GETPOST('id','int'); + +// View +llxHeader(); + +if ($id) +{ + $object = new Establishment($db); + $object->fetch($id); + $object->info($id); + + $head = establishment_prepare_head($object); + + dol_fiche_head($head, 'info', $langs->trans("Establishment"), 0, 'building@ihrm'); + + print '
    '; + dol_print_object_info($object); + print '
    '; + + print ''; +} + +$db->close(); + +llxFooter(); diff --git a/htdocs/hrm/index.html b/htdocs/hrm/index.html new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/htdocs/theme/eldy/img/object_building.png b/htdocs/theme/eldy/img/object_building.png new file mode 100644 index 0000000000000000000000000000000000000000..c9d1539dddcdce4f285117d26cab14ee97ddb90b GIT binary patch literal 563 zcmV-30?hr1P)(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-xk*GpRCwCNlf91;Q541RJl^EZ5JN#8OeT|1NU;U6Fig~f!it1$rN9siV~oU@ zXktZeBVil=09&xJprYJD3wA3E1qDpd|| z^PZ}z+J3*MrfKE|gTb>(rJ^MQgb>hdHet8hK@>%xX&N|=1FcpI=JPq+!~yH~`-5CA zM<}IK2yxCiKN${(ecQH6H@ShRR;y>n<1r(pyh{jqsVItDuh&1XRx3ZTiHOL@(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ-xk*GpRCwCNlf91;Q541RJl^EZ5JN#8OeT|1NU;U6Fig~f!it1$rN9siV~oU@ zXktZeBVil=09&xJprYJD3wA3E1qDpd|| z^PZ}z+J3*MrfKE|gTb>(rJ^MQgb>hdHet8hK@>%xX&N|=1FcpI=JPq+!~yH~`-5CA zM<}IK2yxCiKN${(ecQH6H@ShRR;y>n<1r(pyh{jqsVItDuh&1XRx3ZTiHOL@ Date: Sat, 10 Oct 2015 06:58:18 +0200 Subject: [PATCH 069/297] Correct old code --- htdocs/hrm/admin/admin_hrm.php | 2 +- htdocs/hrm/class/establishment.class.php | 18 +++++++++--------- htdocs/hrm/establishment/card.php | 19 +++++++------------ htdocs/hrm/establishment/info.php | 14 ++++++-------- 4 files changed, 23 insertions(+), 30 deletions(-) diff --git a/htdocs/hrm/admin/admin_hrm.php b/htdocs/hrm/admin/admin_hrm.php index d66185315eb66..bc0487bad9427 100644 --- a/htdocs/hrm/admin/admin_hrm.php +++ b/htdocs/hrm/admin/admin_hrm.php @@ -16,7 +16,7 @@ */ /** - * \file htdocs/hrm/admin/admin_ihrm.php + * \file htdocs/hrm/admin/admin_hrm.php * \ingroup HRM * \brief HRM module setup page */ diff --git a/htdocs/hrm/class/establishment.class.php b/htdocs/hrm/class/establishment.class.php index 208d38c1fd122..dccb2d6d37efd 100644 --- a/htdocs/hrm/class/establishment.class.php +++ b/htdocs/hrm/class/establishment.class.php @@ -16,8 +16,8 @@ */ /** - * \file htdocs/custom/ihrm/class/establishment.class.php - * \ingroup iHRM + * \file htdocs/hrm/class/establishment.class.php + * \ingroup HRM * \brief File of class to manage establishments */ @@ -29,7 +29,7 @@ class Establishment extends CommonObject { public $element='establishment'; - public $table_element='ihrm_establishment'; + public $table_element='establishment'; public $table_element_line = ''; public $fk_element = 'fk_establishment'; protected $ismultientitymanaged = 1; // 0=No test on entity, 1=Test with field entity, 2=Test with link by societe @@ -77,7 +77,7 @@ function create($user) $this->db->begin(); - $sql = "INSERT INTO ".MAIN_DB_PREFIX."ihrm_establishment ("; + $sql = "INSERT INTO ".MAIN_DB_PREFIX."establishment ("; $sql.= "name"; $sql.= ", address"; $sql.= ", zip"; @@ -107,7 +107,7 @@ function create($user) } if (! $error) { - $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . "ihrm_establishment"); + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . "establishment"); } // Commit or rollback @@ -143,7 +143,7 @@ function update($user) $this->db->begin(); - $sql = "UPDATE ".MAIN_DB_PREFIX."ihrm_establishment"; + $sql = "UPDATE ".MAIN_DB_PREFIX."establishment"; $sql .= " SET name = '".$this->name."'"; $sql .= ", address = '".$this->address."'"; $sql .= ", zip = '".$this->zip."'"; @@ -173,7 +173,7 @@ function update($user) function fetch($id) { $sql = "SELECT rowid, name, address, zip, town, statut"; - $sql.= " FROM ".MAIN_DB_PREFIX."ihrm_establishment"; + $sql.= " FROM ".MAIN_DB_PREFIX."establishment"; $sql.= " WHERE rowid = ".$id; dol_syslog(get_class($this)."::fetch", LOG_DEBUG); @@ -208,7 +208,7 @@ function delete($id) { $this->db->begin(); - $sql = "DELETE FROM ".MAIN_DB_PREFIX."ihrm_establishment WHERE rowid = ".$id; + $sql = "DELETE FROM ".MAIN_DB_PREFIX."establishment WHERE rowid = ".$id; dol_syslog(get_class($this)."::delete", LOG_DEBUG); $result = $this->db->query($sql); @@ -286,7 +286,7 @@ function LibStatut($statut,$mode=0) function info($id) { $sql = 'SELECT e.rowid, e.datec, e.fk_user_author, e.tms, e.fk_user_mod'; - $sql.= ' FROM '.MAIN_DB_PREFIX.'ihrm_establishment as e'; + $sql.= ' FROM '.MAIN_DB_PREFIX.'establishment as e'; $sql.= ' WHERE e.rowid = '.$id; dol_syslog(get_class($this)."::fetch info", LOG_DEBUG); diff --git a/htdocs/hrm/establishment/card.php b/htdocs/hrm/establishment/card.php index dc3b29225c2aa..3df1e1cf3d60e 100644 --- a/htdocs/hrm/establishment/card.php +++ b/htdocs/hrm/establishment/card.php @@ -16,22 +16,17 @@ */ /** - * \file htdocs/custom/ihrm/establishment/card.php + * \file htdocs/hrm/establishment/card.php * \brief Page to show an establishment */ -$res = @include ("../../main.inc.php"); // For root directory -if (! $res) - $res = @include ("../../../main.inc.php"); // For "custom" directory -if (! $res) - die("Include of main fails"); - -require_once ('../core/lib/ihrm.lib.php'); -require_once ('../class/establishment.class.php'); +require('../../main.inc.php'); +require_once DOL_DOCUMENT_ROOT.'/core/lib/hrm.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/hrm/class/establishment.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; $langs->load("admin"); -$langs->load("compta"); +$langs->load("hrm"); // Security check if (! $user->admin) accessforbidden(); @@ -267,7 +262,7 @@ if ($action == 'edit') { - dol_fiche_head($head, 'card', $langs->trans("Establishment"), 0, 'building@ihrm'); + dol_fiche_head($head, 'card', $langs->trans("Establishment"), 0, 'building'); print '
    ' . "\n"; print ''; @@ -344,7 +339,7 @@ } - dol_fiche_head($head, 'card', $langs->trans("Establishment"), 0, 'building@ihrm'); + dol_fiche_head($head, 'card', $langs->trans("Establishment"), 0, 'building'); print ''; diff --git a/htdocs/hrm/establishment/info.php b/htdocs/hrm/establishment/info.php index 06ba9875e58d5..2bf014481ac05 100644 --- a/htdocs/hrm/establishment/info.php +++ b/htdocs/hrm/establishment/info.php @@ -16,18 +16,16 @@ */ /** - * \file htdocs/custom/ihrm/establishment/info.php + * \file htdocs/hrm/establishment/info.php * \brief Page to show info of an establishment */ -require '../../main.inc.php'; - -require_once ('../core/lib/ihrm.lib.php'); -require_once ('../class/establishment.class.php'); -require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; +require('../../main.inc.php'); +require_once DOL_DOCUMENT_ROOT.'/core/lib/hrm.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/hrm/class/establishment.class.php'; $langs->load("admin"); -$langs->load("compta"); +$langs->load("hrm"); // Security check if (! $user->admin) accessforbidden(); @@ -45,7 +43,7 @@ $head = establishment_prepare_head($object); - dol_fiche_head($head, 'info', $langs->trans("Establishment"), 0, 'building@ihrm'); + dol_fiche_head($head, 'info', $langs->trans("Establishment"), 0, 'building'); print '
    '; print ''; print ''; - print ''; + print ''; print ''; if ($num) @@ -96,7 +96,7 @@ print ''; print ''; print ''; - print ''; + print ''; print ''; $var=!$var; $i++; 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 aaa1f28d41ba6..231b89ee507dd 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 @@ -83,7 +83,7 @@ CREATE TABLE IF NOT EXISTS llx_establishment ( fk_user_mod integer NOT NULL, datec datetime NOT NULL, tms timestamp NOT NULL, - status tinyint DEFAULT 1, + status tinyint DEFAULT 1 ) ENGINE=InnoDB; ALTER TABLE llx_user ADD COLUMN employee tinyint DEFAULT 0 AFTER ref_int; diff --git a/htdocs/install/mysql/tables/llx_establishment.sql b/htdocs/install/mysql/tables/llx_establishment.sql index 517464588a48a..8ddc71e1fba9d 100644 --- a/htdocs/install/mysql/tables/llx_establishment.sql +++ b/htdocs/install/mysql/tables/llx_establishment.sql @@ -36,6 +36,6 @@ CREATE TABLE IF NOT EXISTS llx_establishment ( fk_user_mod integer NOT NULL, datec datetime NOT NULL, tms timestamp NOT NULL, - status tinyint DEFAULT 1, + status tinyint DEFAULT 1 ) ENGINE=InnoDB; From 0222867a9479450391c69fab9d1e652e4c02fe00 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 10 Oct 2015 12:01:09 +0200 Subject: [PATCH 072/297] The new banner for tab is moved into a shared functions --- htdocs/core/lib/functions.lib.php | 44 +++++++++++++++++++++++++++++++ htdocs/societe/soc.php | 26 +++--------------- htdocs/theme/eldy/style.css.php | 11 ++++---- htdocs/theme/md/style.css.php | 15 +++++------ 4 files changed, 59 insertions(+), 37 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 7f4a1b8d8559a..a319b193662e9 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -840,6 +840,50 @@ function dol_get_fiche_end($notab=0) else return ''; } +/** + * Show tab footer of a card + * + * @param object $object Object to show + * @param string $paramid Name of parameter to use to name the id into the URL link + * @param string $morehtml More html content to output just before the nav bar + * @param int $shownav Show Condition (navigation is shown if value is 1) + * @param string $fieldid Nom du champ en base a utiliser pour select next et previous (we make the select max and min on this field) + * @param string $fieldref Nom du champ objet ref (object->ref) a utiliser pour select next et previous + * @param string $morehtmlref More html to show after ref + * @param string $moreparam More param to add in nav link url. + * @param int $nodbprefix Do not include DB prefix to forge table name + * @param string $morehtmlleft More html code to show before ref + * @param string $morehtmlright More html code to show before navigation arrows + * @return void + */ +function dol_banner_tab($object, $paramid, $morehtml='', $shownav=1, $fieldid='rowid', $fieldref='ref', $morehtmlref='', $moreparam='', $nodbprefix=0, $morehtmlleft='', $morehtmlright='') +{ + global $conf, $form, $user; + + //$showlogo=$object->logo; + $showlogo=1; + $showbarcode=empty($conf->barcode->enabled)?0:1; + if (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->barcode->lire_advance)) $showbarcode=0; + + print '
    '; + //$morehtmlleft='
    '.img_picto('', 'title_companies', '', '').'
    '; + if ($showlogo) $morehtmlleft.='
    '.$form->showphoto('societe',$object,0,0,0,'photoref').'
    '; + //if ($showlogo) $morehtmlleft.='
    '.$form->showphoto('societe',$object,0,0,0,'photoref').'
    '; + if ($showbarcode) $morehtmlleft.='
    '.$form->showbarcode($object).'
    '; + if (! empty($conf->use_javascript_ajax) && $user->rights->societe->creer && ! empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) { + $morehtmlright.=ajax_object_onoff($object, 'status', 'status', 'InActivity', 'ActivityCeased'); + } else { + $morehtmlright.=$object->getLibStatut(2); + } + if (! empty($object->name_nalias)) $morehtmlref.='
    '.$object->name_alias.'
    '; + $morehtmlref.='
    '; + $morehtmlref.=$object->getBannerAddress('refaddress',$object); + $morehtmlref.='
    '; + print $form->showrefnav($object, $paramid, $morehtml, $shownav, $fieldid, $fieldref, $morehtmlref, $moreparam, $nodbprefix, $morehtmlleft, $morehtmlright); + print '
    '; + print '
    '; +} + /** * Show a string with the label tag dedicated to the HTML edit field. * diff --git a/htdocs/societe/soc.php b/htdocs/societe/soc.php index aad1a8aae4847..04fe5336d7e74 100644 --- a/htdocs/societe/soc.php +++ b/htdocs/societe/soc.php @@ -1863,29 +1863,9 @@ dol_htmloutput_errors($error,$errors); - //$showlogo=$object->logo; - $showlogo=1; - $showbarcode=empty($conf->barcode->enabled)?0:1; - if (! empty($conf->global->MAIN_USE_ADVANCED_PERMS) && empty($user->rights->barcode->lire_advance)) $showbarcode=0; - - print '
    '; - //$morehtmlleft='
    '.img_picto('', 'title_companies', '', '').'
    '; - if ($showlogo) $morehtmlleft.='
    '.$form->showphoto('societe',$object,0,0,0,'photoref').'
    '; - //if ($showlogo) $morehtmlleft.='
    '.$form->showphoto('societe',$object,0,0,0,'photoref').'
    '; - if ($showbarcode) $morehtmlleft.='
    '.$form->showbarcode($object).'
    '; - if (! empty($conf->use_javascript_ajax) && $user->rights->societe->creer && ! empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) { - $morehtmlright.=ajax_object_onoff($object, 'status', 'status', 'InActivity', 'ActivityCeased'); - } else { - $morehtmlright.=$object->getLibStatut(2); - } - $morehtml=''; - if (! empty($object->ame_nalias)) $morehtml.='
    '.$object->name_alias.'
    '; - $morehtml.='
    '; - $morehtml.=$object->getBannerAddress('refaddress',$object); - $morehtml.='
    '; - print $form->showrefnav($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom', $morehtml, '', 0, $morehtmlleft, $morehtmlright); - print '
    '; - print '
    '; + + dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); + print '
    '; dol_print_object_info($object); From 8e37da55c36999ba2f2a5c5867bebf90aa0c3fa3 Mon Sep 17 00:00:00 2001 From: aspangaro Date: Sat, 10 Oct 2015 08:34:15 +0200 Subject: [PATCH 070/297] Add searchform, language key and correct code --- htdocs/admin/ihm.php | 10 ++++++---- htdocs/core/modules/modHRM.class.php | 21 +++++++++++---------- htdocs/langs/en_US/admin.lang | 2 ++ htdocs/main.inc.php | 6 ++++++ 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/htdocs/admin/ihm.php b/htdocs/admin/ihm.php index 8d93dfc950cd1..1cff8cec1a72b 100644 --- a/htdocs/admin/ihm.php +++ b/htdocs/admin/ihm.php @@ -37,6 +37,7 @@ $langs->load("products"); $langs->load("members"); $langs->load("projects"); +$langs->load("hrm"); if (! $user->admin) accessforbidden(); @@ -46,10 +47,10 @@ if (! defined("MAIN_MOTD")) define("MAIN_MOTD",""); // List of supported permanent search area -$searchform=array("MAIN_SEARCHFORM_SOCIETE", "MAIN_SEARCHFORM_CONTACT", "MAIN_SEARCHFORM_PRODUITSERVICE", "MAIN_SEARCHFORM_PRODUITSERVICE_SUPPLIER", "MAIN_SEARCHFORM_ADHERENT", "MAIN_SEARCHFORM_PROJECT"); -$searchformconst=array($conf->global->MAIN_SEARCHFORM_SOCIETE,$conf->global->MAIN_SEARCHFORM_CONTACT,$conf->global->MAIN_SEARCHFORM_PRODUITSERVICE,$conf->global->MAIN_SEARCHFORM_PRODUITSERVICE_SUPPLIER,$conf->global->MAIN_SEARCHFORM_ADHERENT,$conf->global->MAIN_SEARCHFORM_PROJECT); -$searchformtitle=array($langs->trans("Companies"), $langs->trans("Contacts"), $langs->trans("ProductsAndServices"), $langs->trans("ProductsAndServices").' ('.$langs->trans("SupplierRef").')', $langs->trans("Members"), $langs->trans("Projects")); -$searchformmodule=array('Module1Name','Module1Name','Module50Name','Module50Name','Module310Name','Module400Name'); +$searchform=array("MAIN_SEARCHFORM_SOCIETE", "MAIN_SEARCHFORM_CONTACT", "MAIN_SEARCHFORM_PRODUITSERVICE", "MAIN_SEARCHFORM_PRODUITSERVICE_SUPPLIER", "MAIN_SEARCHFORM_ADHERENT", "MAIN_SEARCHFORM_PROJECT", "MAIN_SEARCHFORM_EMPLOYEE"); +$searchformconst=array($conf->global->MAIN_SEARCHFORM_SOCIETE,$conf->global->MAIN_SEARCHFORM_CONTACT,$conf->global->MAIN_SEARCHFORM_PRODUITSERVICE,$conf->global->MAIN_SEARCHFORM_PRODUITSERVICE_SUPPLIER,$conf->global->MAIN_SEARCHFORM_ADHERENT,$conf->global->MAIN_SEARCHFORM_PROJECT,$conf->global->MAIN_SEARCHFORM_EMPLOYEE); +$searchformtitle=array($langs->trans("Companies"), $langs->trans("Contacts"), $langs->trans("ProductsAndServices"), $langs->trans("ProductsAndServices").' ('.$langs->trans("SupplierRef").')', $langs->trans("Members"), $langs->trans("Projects"), $langs->trans("Employees")); +$searchformmodule=array('Module1Name','Module1Name','Module50Name','Module50Name','Module310Name','Module4000Name'); if ($action == 'update') @@ -82,6 +83,7 @@ dolibarr_set_const($db, "MAIN_SEARCHFORM_PRODUITSERVICE_SUPPLIER",$_POST["MAIN_SEARCHFORM_PRODUITSERVICE_SUPPLIER"],'chaine',0,'',$conf->entity); dolibarr_set_const($db, "MAIN_SEARCHFORM_ADHERENT", $_POST["MAIN_SEARCHFORM_ADHERENT"],'chaine',0,'',$conf->entity); dolibarr_set_const($db, "MAIN_SEARCHFORM_PROJECT", $_POST["MAIN_SEARCHFORM_PROJECT"],'chaine',0,'',$conf->entity); + dolibarr_set_const($db, "MAIN_SEARCHFORM_EMPLOYEE", $_POST["MAIN_SEARCHFORM_EMPLOYEE"],'chaine',0,'',$conf->entity); dolibarr_set_const($db, "MAIN_HELPCENTER_DISABLELINK", $_POST["MAIN_HELPCENTER_DISABLELINK"],'chaine',0,'',0); // Param for all entities dolibarr_set_const($db, "MAIN_MOTD", dol_htmlcleanlastbr($_POST["main_motd"]),'chaine',0,'',$conf->entity); diff --git a/htdocs/core/modules/modHRM.class.php b/htdocs/core/modules/modHRM.class.php index c63fa04f65e44..16a0edd0c0443 100644 --- a/htdocs/core/modules/modHRM.class.php +++ b/htdocs/core/modules/modHRM.class.php @@ -56,21 +56,21 @@ public function __construct($db) // $this->picto = ''; // define triggers - $this->module_parts = array ( + $this->module_parts = array(); // Data directories to create when module is enabled - $this->dirs = array (); + $this->dirs = array(); // Config pages $this->config_page_url = array('admin_hrm.php@hrm'); // Dependencies $this->depends = array(); - $this->requiredby = array(" + $this->requiredby = array(/*" modSalaries, modExpenseReport, modHoliday - "); + "*/); $this->conflictwith = array(); $this->phpmin = array ( 5, @@ -78,7 +78,7 @@ public function __construct($db) ); // Minimum version of PHP required by module $this->need_dolibarr_version = array ( 3, - 8 + 7 ); // Minimum version of Dolibarr required by module $this->langfiles = array ( "hrm" @@ -239,12 +239,13 @@ public function __construct($db) * @param string $options Enabling module ('', 'noboxes') * @return int if OK, 0 if KO */ - public function init($options = '') + function init($options='') { + // Permissions + $this->remove($options); + $sql = array(); - - $result = $this->loadTables(); - - return $this->_init($sql, $options); + + return $this->_init($sql,$options); } } diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index 0f267bd0520e4..f7d93819e0d9e 100755 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -539,6 +539,8 @@ Module2900Name=GeoIPMaxmind Module2900Desc=GeoIP Maxmind conversions capabilities Module3100Name=Skype Module3100Desc=Add a Skype button into card of adherents / third parties / contacts +Module4000Name=HRM +Module4000Desc=Human resources management Module5000Name=Multi-company Module5000Desc=Allows you to manage multiple companies Module6000Name=Workflow diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index fcef513130f06..d278afd968799 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1584,6 +1584,12 @@ function left_menu($menu_array_before, $helppagename='', $moresearchform='', $me $searchform.=printSearchForm(DOL_URL_ROOT.'/projet/list.php', DOL_URL_ROOT.'/projet/list.php', $langs->trans("Projects"), 'project', 'search_all', 'M', 'searchleftproj', img_object('','projectpub')); } + if (! empty($conf->hrm->enabled) && ! empty($conf->global->MAIN_SEARCHFORM_EMPLOYEE) && $user->rights->hrm->employee->read) + { + $langs->load("hrm"); + $searchform.=printSearchForm(DOL_URL_ROOT.'/hrm/employee/list.php', DOL_URL_ROOT.'/hrm/employee/list.php', $langs->trans("Employees"), 'employee', 'search_all', 'M', 'searchleftemployee', img_object('','user')); + } + // Execute hook printSearchForm $parameters=array(); $reshook=$hookmanager->executeHooks('printSearchForm',$parameters); // Note that $action and $object may have been modified by some hooks From 8b97196c2f0ae2dcc874f552c5cf2a998d0b24bb Mon Sep 17 00:00:00 2001 From: aspangaro Date: Sat, 10 Oct 2015 08:50:55 +0200 Subject: [PATCH 071/297] Correct term status & sql error --- htdocs/hrm/admin/admin_establishment.php | 6 +++--- htdocs/install/mysql/migration/3.9.0-4.0.0.sql | 2 +- htdocs/install/mysql/tables/llx_establishment.sql | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/htdocs/hrm/admin/admin_establishment.php b/htdocs/hrm/admin/admin_establishment.php index 2fb6507d0bab8..6a9cf9619603f 100644 --- a/htdocs/hrm/admin/admin_establishment.php +++ b/htdocs/hrm/admin/admin_establishment.php @@ -59,7 +59,7 @@ $head = hrm_admin_prepare_head(); dol_fiche_head($head, 'establishments', $langs->trans("HRM"), 0, "user"); -$sql = "SELECT e.rowid, e.name, e.address, e.zip, e.town, e.statut"; +$sql = "SELECT e.rowid, e.name, e.address, e.zip, e.town, e.status"; $sql.= " FROM ".MAIN_DB_PREFIX."establishment as e"; $sql.= " WHERE e.entity = ".$conf->entity; @@ -79,7 +79,7 @@ print ''.$langs->trans("Address").''.$langs->trans("Zipcode").''.$langs->trans("Town").''.$langs->trans("Statut").''.$langs->trans("Status").'
    '.$obj->address.''.$obj->zip.''.$obj->town.''.$establishmentstatic->LibStatut($obj->statut,5).''.$establishmentstatic->LibStatut($obj->status,5).'
    '; diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 98713d0a77a6a..b1906a344b101 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -1528,10 +1528,10 @@ div.tabBar { color: #; - padding-top: px; - padding-left: px; - padding-right: px; - padding-bottom: px; + padding-top: px; + padding-left: px; + padding-right: px; + padding-bottom: px; margin: 0px 0px 14px 0px; -moz-border-radius:4px; -webkit-border-radius: 4px; @@ -2064,10 +2064,9 @@ /* Pagination */ div.refidpadding { - /* padding-top: dol_use_jmobile)?'8':'12'; ?>px; */ + padding-top: dol_use_jmobile)?'3':'14'; ?>px; } div.refid { - /* padding-top: dol_use_jmobile)?'5':'12'; ?>px; */ font-weight: bold; color: #766; font-size: 160%; diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 9fb050b0ef7c5..f909915d79450 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -677,8 +677,8 @@ margin-bottom: 10px; } img.photoref { - height: 68px; - width: 68px; + height: 80px; + width: 80px; border: 1px solid #CCC; -moz-box-shadow: 3px 3px 4px #DDD; -webkit-box-shadow: 3px 3px 4px #DDD; @@ -1513,10 +1513,10 @@ div.tabBar { color: #; - padding-top: 9px; - padding-left: px; - padding-right: px; - padding-bottom: 8px; + padding-top: px; + padding-left: px; + padding-right: px; + padding-bottom: px; margin: 0px 0px 14px 0px; -moz-border-radius:3px; -webkit-border-radius: 3px; @@ -1934,10 +1934,9 @@ /* Pagination */ div.refidpadding { - /* padding-top: dol_use_jmobile)?'8':'12'; ?>px; */ + padding-top: dol_use_jmobile)?'3':'14'; ?>px; } div.refid { - /* padding-top: dol_use_jmobile)?'5':'12'; ?>px; */ font-weight: bold; color: #766; font-size: 160%; From 7065b2aa7deddb70211eda71e233b42dda62d249 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Sat, 10 Oct 2015 12:59:58 +0200 Subject: [PATCH 073/297] Update account.php --- htdocs/compta/bank/account.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/compta/bank/account.php b/htdocs/compta/bank/account.php index deed3b1b97ad5..9a04a431ac65b 100644 --- a/htdocs/compta/bank/account.php +++ b/htdocs/compta/bank/account.php @@ -952,7 +952,7 @@ if ($sep > 0) print ' '; // If we had at least one line in future else print $langs->trans("CurrentBalance"); print ' '.$object->currency_code.''; - print ''; + print ''; print ''; print ''; } else { From 0032ad695c8d7fb435f4f4f9bb9c632996798238 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 10 Oct 2015 13:12:14 +0200 Subject: [PATCH 074/297] New look for thirdparty tab using the new common banner. End. Let's do the same for other tabs and elements now... --- htdocs/societe/soc.php | 17 ++++++++++++++++- htdocs/theme/eldy/style.css.php | 3 +++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/htdocs/societe/soc.php b/htdocs/societe/soc.php index 04fe5336d7e74..9c8f4c90aa5f2 100644 --- a/htdocs/societe/soc.php +++ b/htdocs/societe/soc.php @@ -1867,7 +1867,11 @@ dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); - print '
    '.price($solde, 0, $langs, 0, 0, -1, $object->currency_code).''.price($total, 0, $langs, 0, 0, -1, $object->currency_code).' 
    '; + print '
    '; + print '
    '; + + print '
    '; + print '
    '; // Ref /* @@ -2202,6 +2206,14 @@ else print ' '; print ''; + print '
    '; + + print ''; + print '
    '; + + print '
    '; + print ''; + // Default language if (! empty($conf->global->MAIN_MULTILANGS)) { @@ -2338,6 +2350,9 @@ print '
    '; + print '
    '; + print '
    '; + dol_fiche_end(); diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index b1906a344b101..ed6c1291ef563 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -637,9 +637,12 @@ object-fit: contain } .underrefbanner { +} +.underbanner { border-bottom: 2px solid #888; } + /* ============================================================================== */ /* Menu top et 1ere ligne tableau */ /* ============================================================================== */ From b6b410a99c32082b95b1b0bda013a0698ef0a970 Mon Sep 17 00:00:00 2001 From: Drosis Nikos Date: Sat, 10 Oct 2015 16:01:39 +0300 Subject: [PATCH 075/297] Update cidlookup.php --- htdocs/asterisk/cidlookup.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/asterisk/cidlookup.php b/htdocs/asterisk/cidlookup.php index 771b2e29979a9..e50a1a74a1bc9 100644 --- a/htdocs/asterisk/cidlookup.php +++ b/htdocs/asterisk/cidlookup.php @@ -30,7 +30,7 @@ include '../master.inc.php'; $phone = GETPOST('phone'); -$notfound = $phone; +$notfound = $langs->trans("Unknown"); // Security check if (empty($conf->clicktodial->enabled)) From fb50daaa40962bebd96f289b91471ef6c4dc784d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 10 Oct 2015 16:09:01 +0200 Subject: [PATCH 076/297] Fix bad parameter --- htdocs/core/lib/company.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php index d7fbaedfebade..565078a9d3bc9 100644 --- a/htdocs/core/lib/company.lib.php +++ b/htdocs/core/lib/company.lib.php @@ -706,7 +706,7 @@ function show_contacts($conf,$langs,$db,$object,$backtopage='') $contactstatic->web = $obj->web; $contactstatic->skype = $obj->skype; - $country_code = getCountry($obj->country_id, 'all'); + $country_code = getCountry($obj->country_id, 2); $contactstatic->country_code = $country_code; print "
    '; - if ($objp->price_base_type == 'TTC') print price($objp->price_ttc).' '.$langs->trans("TTC"); + if (isset($objp->price_base_type) && $objp->price_base_type == 'TTC') print price($objp->price_ttc).' '.$langs->trans("TTC"); else print price($objp->price).' '.$langs->trans("HT"); print '
    '; - // Ref - print ''; - + // Ref/ID + if (! empty($conf->global->MAIN_SHOW_TECHNICAL_ID)) + { + print ''; + } + // Lastname print ''; print ''; @@ -1040,23 +1043,34 @@ } - print '
    '.$langs->trans("Ref").''; - print $object->ref; - print '
    '.$langs->trans("ID").''; + print $object->ref; + print '
    lastname).'" autofocus="autofocus">
    '; - $linkback = ''.$langs->trans("BackToList").''; + + $morehtmlref=$object->getFullName($langs); + + dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', ''); + + + print '
    '; + print '
    '; + + print '
    '; + print '
    '; + // Ref - print ''; // Name print ''; print ''; - + */ + // Company if (empty($conf->global->SOCIETE_DISABLE_CONTACTS)) { - print ''; } - + */ + print ''; // Civility - print ''; // Role - print ''; + print ''; // Address + /* print ''; @@ -1112,68 +1129,72 @@ // State if (empty($conf->global->SOCIETE_DISABLE_STATE)) { - print ''; - } + print ''; + }*/ // Phone + /* print ''; print ''; print ''; print ''; - + */ + // Email - print ''; + //print ''; if (! empty($conf->mailing->enabled)) { $langs->load("mails"); - print ''; - print ''; + print ''; + print ''; } - else - { - print ''; - } - print ''; // Instant message and no email - print ''; + print ''; if (!empty($conf->mailing->enabled)) { - print ''; + print ''; } - else - { - print ''; - } - print ''; // Skype if (! empty($conf->skype->enabled)) { - print ''; + print ''; } - print ''; // Note Public - print ''; // Note Private - print ''; + print ''; + */ + + print '
    '.$langs->trans("Ref").''; + /*print '
    '.$langs->trans("Ref").''; print $form->showrefnav($object, 'id', $linkback); print '
    '.$langs->trans("Lastname").' / '.$langs->trans("Label").''.$object->lastname.''.$langs->trans("Firstname").''.$object->firstname.'
    '.$langs->trans("ThirdParty").''; + print '
    '.$langs->trans("ThirdParty").''; if ($object->socid > 0) { $objsoc->fetch($object->socid); @@ -1070,6 +1084,7 @@ } // Photo + /* if ($object->photo) { print ''; @@ -1080,18 +1095,20 @@ print ' '; print '
    '.$langs->trans("UserTitle").''; + print '
    '.$langs->trans("UserTitle").''; print $object->getCivilityLabel(); print '
    '.$langs->trans("PostOrFunction").''.$object->poste.'
    '.$langs->trans("PostOrFunction").''.$object->poste.'
    '.$langs->trans("Address").''; dol_print_address($object->address,'gmap','contact',$object->id); print '
    '.$langs->trans('State').''.$object->state.'
    '.$langs->trans('State').''.$object->state.'
    '.$langs->trans("PhonePro").''.dol_print_phone($object->phone_pro,$object->country_code,$object->id,$object->socid,'AC_TEL').''.$langs->trans("PhonePerso").''.dol_print_phone($object->phone_perso,$object->country_code,$object->id,$object->socid,'AC_TEL').'
    '.$langs->trans("PhoneMobile").''.dol_print_phone($object->phone_mobile,$object->country_code,$object->id,$object->socid,'AC_TEL').''.$langs->trans("Fax").''.dol_print_phone($object->fax,$object->country_code,$object->id,$object->socid,'AC_FAX').'
    '.$langs->trans("EMail").''.dol_print_email($object->email,$object->id,$object->socid,'AC_EMAIL').'
    '.$langs->trans("EMail").''.dol_print_email($object->email,$object->id,$object->socid,'AC_EMAIL').'
    '.$langs->trans("NbOfEMailingsSend").''.$object->getNbOfEMailings().'
    '.$langs->trans("NbOfEMailingsSend").''.$object->getNbOfEMailings().'
     
    '.$langs->trans("IM").''.$object->jabberid.'
    '.$langs->trans("IM").''.$object->jabberid.'
    '.$langs->trans("No_Email").''.yn($object->no_email).'
    '.$langs->trans("No_Email").''.yn($object->no_email).'
     
    '.$langs->trans("Skype").''.dol_print_skype($object->skype,0,$object->fk_soc,1).'
    '.$langs->trans("Skype").''.dol_print_skype($object->skype,0,$object->fk_soc,1).'
    '.$langs->trans("ContactVisibility").''; + print '
    '.$langs->trans("ContactVisibility").''; print $object->LibPubPriv($object->priv); print '
    '.$langs->trans("NotePublic").''; + /* + print '
    '.$langs->trans("NotePublic").''; print nl2br($object->note_public); print '
    '.$langs->trans("NotePrivate").''; + print '
    '.$langs->trans("NotePrivate").''; print nl2br($object->note_private); - - // Statut - print '
    '.$langs->trans("Status").'
    '; + + print ''; + print '
    '; + + print '
    '; + print ''; + + // Statut + /*print ''; print ''; print ''."\n"; - + */ + // Categories if (! empty($conf->categorie->enabled) && ! empty($user->rights->categorie->lire)) { print ''; @@ -1240,7 +1261,10 @@ print ''; print "
    '.$langs->trans("Status").''; print $object->getLibStatut(4); print '
    ' . $langs->trans( "Categories" ) . '
    "; - + + print '
    '; + print '
    '; + print dol_fiche_end(); // Barre d'actions diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 76fd73a324dcb..7ca7627333dd5 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -446,9 +446,19 @@ function getBannerAddress($htmlkey, $object=null) $countriesusingstate=array('AU','US','IN','GB','ES','UK','TR'); - $out=''; + $contacti=0; + $thirdpartyid=0; + if ($this->elemet == 'societe') + { + $thirdpartyid=$this->id; + } + if ($this->elemet == 'contact') + { + $contactid=$this->id; + $thirdpartyid=$object->id; + } - $out.=''; + $out=''; $outdone=0; $coords = $this->getFullAddress(1,', '); @@ -471,19 +481,22 @@ function getBannerAddress($htmlkey, $object=null) $out.=($outdone?'
    ':'').$this->state; $outdone++; } - + if ($this->phone_pro || $this->phone_mobile || $this->phone_perso || $this->fax) $out.=($outdone?'
    ':''); - if ($this->phone_pro) { - $out.=dol_print_phone($this->phone_pro,$country_code['code'],$this->rowid,$object->id,'AC_TEL',' ','phone'); $outdone++; + if ($this->phone && empty($this->phone_pro)) { // For object storing pro phone into ->phone + $out.=dol_print_phone($this->phone,$country_code['code'],$contactid,$thirdpartyid,'AC_TEL',' ','phone',$langs->trans("PhonePro")); $outdone++; + } + if (! empty($this->phone_pro)) { + $out.=dol_print_phone($this->phone_pro,$country_code['code'],$contactid,$thirdpartyid,'AC_TEL',' ','phone',$langs->trans("PhonePro")); $outdone++; } - if ($this->phone_mobile) { - $out.=dol_print_phone($this->phone_mobile,$country_code['code'],$this->rowid,$object->id,'AC_TEL',' ','phone'); $outdone++; + if (! empty($this->phone_mobile)) { + $out.=dol_print_phone($this->phone_mobile,$country_code['code'],$contactid,$thirdpartyid,'AC_TEL',' ','phone',$langs->trans("PhoneMobile")); $outdone++; } - if ($this->phone_perso) { - $out.=dol_print_phone($this->phone_perso,$country_code['code'],$this->rowid,$object->id,'AC_TEL',' ','phone'); $outdone++; + if (! empty($this->phone_perso)) { + $out.=dol_print_phone($this->phone_perso,$country_code['code'],$contactid,$thirdpartyid,'AC_TEL',' ','phone',$langs->trans("PhonePerso")); $outdone++; } - if ($this->fax) { - $out.=dol_print_phone($this->fax,$country_code['code'],$this->rowid,$object->id,'AC_FAX',' ','fax'); $outdone++; + if (! empty($this->fax)) { + $out.=dol_print_phone($this->fax,$country_code['code'],$contactid,$thirdpartyid,'AC_FAX',' ','fax',$langs->trans("Fax")); $outdone++; } $out.='
    '; @@ -503,7 +516,7 @@ function getBannerAddress($htmlkey, $object=null) if ($this->skype) $out.=($outdone?'
    ':'').dol_print_skype($this->skype,$this->id,$object->id,'AC_SKYPE'); } - $out.=''; + $out.=''; return $out; } diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 4aea23291c2bf..8dd0725b1b8bb 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -5152,7 +5152,16 @@ function showrefnav($object,$paramid,$morehtml='',$shownav=1,$fieldid='rowid',$f $ret.='
    '; - $ret.=dol_htmlentities($object->$fieldref); + // For thirdparty and contact, the ref is he id, so we show something else + if ($object->element == 'societe') + { + $ret.=dol_htmlentities($object->name); + } + else if ($object->element == 'contact') + { + $ret.=dol_htmlentities($object->getFullName($langs)); + } + else $ret.=dol_htmlentities($object->$fieldref); if ($morehtmlref) { $ret.=' '.$morehtmlref; diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php index d7fbaedfebade..565078a9d3bc9 100644 --- a/htdocs/core/lib/company.lib.php +++ b/htdocs/core/lib/company.lib.php @@ -706,7 +706,7 @@ function show_contacts($conf,$langs,$db,$object,$backtopage='') $contactstatic->web = $obj->web; $contactstatic->skype = $obj->skype; - $country_code = getCountry($obj->country_id, 'all'); + $country_code = getCountry($obj->country_id, 2); $contactstatic->country_code = $country_code; print "
    '; + // Ref/ID + if (! empty($conf->global->MAIN_SHOW_TECHNICAL_ID)) + { + print ''; + } + // Name print ''; print ''; @@ -2140,7 +2148,7 @@ } elseif($mysoc->localtax1_assuj=="1" && $mysoc->localtax2_assuj!="1") { - print ''; if($object->localtax1_assuj=="1" && (! isOnlyOneLocalTax(1))) @@ -2162,7 +2170,7 @@ } elseif($mysoc->localtax2_assuj=="1" && $mysoc->localtax1_assuj!="1") { - print ''; if($object->localtax2_assuj=="1" && (! isOnlyOneLocalTax(2))) @@ -2325,7 +2333,7 @@ if (! empty($conf->adherent->enabled)) { $langs->load("members"); - print ''; + print ''; print '
    '.$langs->trans("ID").''; + print $object->ref; + print '
    '.fieldLabel('ThirdPartyName','name',1).'
    '.$langs->transcountry("LocalTax1IsUsed",$mysoc->country_code).''; + print '
    '.$langs->transcountry("LocalTax1IsUsed",$mysoc->country_code).''; print yn($object->localtax1_assuj); print '
    '.$langs->transcountry("LocalTax2IsUsed",$mysoc->country_code).''; + print '
    '.$langs->transcountry("LocalTax2IsUsed",$mysoc->country_code).''; print yn($object->localtax2_assuj); print '
    '.$langs->trans("LinkedToDolibarrMember").'
    '.$langs->trans("LinkedToDolibarrMember").''; $adh=new Adherent($db); $result=$adh->fetch('','',$object->id); @@ -2349,8 +2357,9 @@ } print '
    '; - - print ''; + print ''; + + print ''; print '
    '; dol_fiche_end(); diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index ed6c1291ef563..7aa68f6934019 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -623,7 +623,7 @@ div.statusref { float: right; padding-right: 12px; - margin-top: 9px; + margin-top: 7px; margin-bottom: 10px; } img.photoref { @@ -2132,11 +2132,15 @@ cursor: default; } div.pagination li.litext a { -border: none; + border: none; padding-right: 10px; padding-left: 4px; font-weight: bold; } +div.pagination li.litext a:hover { + background-color: transparent; + background-image: none; +} dol_use_jmobile)) { ?> div.pagination li.litext { padding-top: 13px; diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index f909915d79450..161ca0113eb8e 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -673,7 +673,7 @@ div.statusref { float: right; padding-right: 12px; - margin-top: 9px; + margin-top: 7px; margin-bottom: 10px; } img.photoref { From 9f1fa7e212be3a879e8604b7140469b6f973ed60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Sun, 11 Oct 2015 12:32:02 +0200 Subject: [PATCH 081/297] Missing changelog --- ChangeLog | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ChangeLog b/ChangeLog index f83979aa8e085..51ae09529f166 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,9 @@ English Dolibarr ChangeLog -------------------------------------------------------------- +***** ChangeLog for 3.6.5 compared to 3.6.4 ***** +- Fix: [ bug #1794 ] Error when cloning Proposal gives error in a malformed page + ***** ChangeLog for 3.6.4 compared to 3.6.3 ***** - Fix: [ bug #2893 ] Dolibarr error when viewing an invoice after changing invoice mask From fd9f51df88927d9a41c62d50fc6a04d2d6fa515a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Sun, 11 Oct 2015 12:39:42 +0200 Subject: [PATCH 082/297] Missing changelog --- ChangeLog | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ChangeLog b/ChangeLog index f83979aa8e085..3bc56c5de5bd9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,9 @@ English Dolibarr ChangeLog -------------------------------------------------------------- +***** ChangeLog for 3.6.5 compared to 3.6.4 ***** +- Fix: [ bug #1776 ] Undefined $deliverycompany variable in pdf_build_address + ***** ChangeLog for 3.6.4 compared to 3.6.3 ***** - Fix: [ bug #2893 ] Dolibarr error when viewing an invoice after changing invoice mask From 8cd17c01658feba4c2973a8bc89087261f905564 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcos=20Garci=CC=81a=20de=20La=20Fuente?= Date: Sun, 11 Oct 2015 13:01:28 +0200 Subject: [PATCH 083/297] =?UTF-8?q?FIX=20[=20bug=20#3197=20]=C2=A0Trigger?= =?UTF-8?q?=20LINECONTRACT=5FCREATE=20does=20not=20follow=20common=20denom?= =?UTF-8?q?ination?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Close #3197 --- htdocs/contrat/class/contrat.class.php | 4 ++-- htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index 6fa4e5c46a868..76a868a7888af 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -1332,7 +1332,7 @@ function addline($desc, $pu_ht, $qty, $txtva, $txlocaltax1, $txlocaltax2, $fk_pr if (empty($error)) { // Call trigger - $result=$this->call_trigger('LINECONTRACT_CREATE',$user); + $result=$this->call_trigger('LINECONTRACT_INSERT',$user); if ($result < 0) { $this->db->rollback(); @@ -2644,7 +2644,7 @@ public function insert($notrigger = 0) if (!$notrigger) { // Call trigger - $result = $this->call_trigger('LINECONTRACT_CREATE', $user); + $result = $this->call_trigger('LINECONTRACT_INSERT', $user); if ($result < 0) { $this->db->rollback(); return -1; diff --git a/htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN b/htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN index fd4d59538f388..84f67660c4134 100644 --- a/htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN +++ b/htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN @@ -167,7 +167,7 @@ class InterfaceDemo extends DolibarrTriggers case 'CONTRACT_CANCEL': case 'CONTRACT_CLOSE': case 'CONTRACT_DELETE': - case 'LINECONTRACT_CREATE': + case 'LINECONTRACT_INSERT': case 'LINECONTRACT_UPDATE': case 'LINECONTRACT_DELETE': From 0ba6bdb7c29cbdafa4caf2c7a11e7400878ab788 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 11 Oct 2015 13:26:22 +0200 Subject: [PATCH 084/297] CSS enhancement --- htdocs/core/lib/usergroups.lib.php | 2 +- htdocs/core/tpl/objectline_create.tpl.php | 8 ++++---- htdocs/theme/eldy/style.css.php | 5 ++++- htdocs/theme/md/style.css.php | 4 ++++ 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php index 10b97265a9311..23e122b89f690 100644 --- a/htdocs/core/lib/usergroups.lib.php +++ b/htdocs/core/lib/usergroups.lib.php @@ -462,7 +462,7 @@ function show_theme($fuser,$edit=0,$foruserprofile=false) if ($color) print ''; else print $langs->trans("Default"); } - print '   ('.$langs->trans("NotSupportedByAllThemes").', '.$langs->trans("PressF5AfterChangingThis").')'; + print '   ('.$langs->trans("Default").': 6e7896, '.$langs->trans("NotSupportedByAllThemes").', '.$langs->trans("PressF5AfterChangingThis").')'; print '
    '; + print '
    '; + dol_print_object_info($object); - print '
    '; + print ''; + dol_fiche_end(); } diff --git a/htdocs/user/card.php b/htdocs/user/card.php index b74b921c735d1..35f504c334f60 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -1192,15 +1192,16 @@ $rowspan=19; - print ''; - - // Ref - print ''; - print ''; - print ''."\n"; + dol_banner_tab($object,'id','',$user->rights->user->user->lire || $user->admin); + + + print '
    '; + print '
    '; + + print '
    '; + print '
    '.$langs->trans("Ref").''; - print $form->showrefnav($object,'id','',$user->rights->user->user->lire || $user->admin); - print '
    '; + if (isset($conf->file->main_authentication) && preg_match('/openid/',$conf->file->main_authentication) && ! empty($conf->global->MAIN_OPENIDURL_PERUSER)) $rowspan++; if (! empty($conf->societe->enabled)) $rowspan++; if (! empty($conf->adherent->enabled)) $rowspan++; @@ -1208,25 +1209,9 @@ if (! empty($conf->salaries->enabled) && ! empty($user->rights->salaries->read)) $rowspan = $rowspan+3; if (! empty($conf->agenda->enabled)) $rowspan++; - // Lastname - print ''; - print ''; - - // Photo - print ''; - - print ''."\n"; - - // Firstname - print ''; - print ''; - print ''."\n"; - // Position/Job print ''; - print ''; + print ''; print ''."\n"; // Gender @@ -1239,11 +1224,11 @@ print ''; if (! empty($object->ldap_sid) && $object->statut==0) { - print ''; + print ''; } else { - print ''; + print ''; } print ''."\n"; @@ -1253,24 +1238,24 @@ { if ($passDoNotExpire) { - print ''; + print ''; } else if($userChangePassNextLogon) { - print ''; + print ''; } else if($userDisabled) { - print ''; + print ''; } else { - print ''; + print ''; } } else { - print ''; - print ''."\n"; } - // Tel pro - print ''; - print ''; - print ''."\n"; - - // Tel mobile - print ''; - print ''; - print ''."\n"; - - // Fax - print ''; - print ''; - print ''."\n"; - // Skype if (! empty($conf->skype->enabled)) { print ''; - print ''; + print ''; print "\n"; } - // EMail - print ''; - print ''; - print "\n"; - // Signature print ''; - print ''; - print ''; print "\n"; @@ -1389,14 +1354,14 @@ $text=$langs->trans("TJM"); print $form->textwithpicto($text, $langs->trans("TJMDescription"), 1, 'help', 'classtjm'); print ''; - print ''; print "\n"; // Salary print ''; - print ''; print "\n"; @@ -1404,7 +1369,7 @@ // Weeklyhours print ''; - print ''; print "\n"; @@ -1413,38 +1378,39 @@ if ($conf->salaries->enabled) { print ''; - print ''; + print ''; } // Color user if (! empty($conf->agenda->enabled)) { print ''; - print ''; print "\n"; } - // Status - print ''; - print ''; - print ''."\n"; - - print ''; - print ''; + print '
    '.$langs->trans("Lastname").''.$object->lastname.''; - print $form->showphoto('userphoto',$object,100); - print '
    '.$langs->trans("Firstname").''.$object->firstname.'
    '.$langs->trans("PostOrFunction").''.$object->job.''.$object->job.'
    '.$langs->trans("Login").''.$langs->trans("LoginAccountDisableInDolibarr").''.$langs->trans("LoginAccountDisableInDolibarr").''.$object->login.''.$object->login.'
    '.$langs->trans("LdapUacf_".$statutUACF).''.$langs->trans("LdapUacf_".$statutUACF).''.$langs->trans("UserMustChangePassNextLogon",$ldap->domainFQDN).''.$langs->trans("UserMustChangePassNextLogon",$ldap->domainFQDN).''.$langs->trans("LdapUacf_".$statutUACF,$ldap->domainFQDN).''.$langs->trans("LdapUacf_".$statutUACF,$ldap->domainFQDN).''.$langs->trans("DomainPassword").''.$langs->trans("DomainPassword").''; + print ''; if ($object->pass) print preg_replace('/./i','*',$object->pass); else { @@ -1284,14 +1269,14 @@ // API key if(! empty($conf->api->enabled) && $user->admin) { print '
    '.$langs->trans("ApiKey").''; + print ''; if (! empty($object->api_key)) print $langs->trans("Hidden"); print ''; } // Administrator - print '
    '.$langs->trans("Administrator").''; + print '
    '.$langs->trans("Administrator").''; if (! empty($conf->multicompany->enabled) && $object->admin && ! $object->entity) { print $form->textwithpicto(yn($object->admin),$langs->trans("SuperAdministratorDesc"),1,"superadmin"); @@ -1310,7 +1295,7 @@ print '
    '; $text=$langs->trans("Type"); print $form->textwithpicto($text, $langs->trans("InternalExternalDesc")); - print ''; + print ''; $type=$langs->trans("Internal"); if ($object->societe_id > 0) $type=$langs->trans("External"); print $type; @@ -1320,39 +1305,19 @@ // Ldap sid if ($object->ldap_sid) { - print '
    '.$langs->trans("Type").''; + print '
    '.$langs->trans("Type").''; print $langs->trans("DomainUser",$ldap->domainFQDN); print '
    '.$langs->trans("PhonePro").''.dol_print_phone($object->office_phone,'',0,0,1).'
    '.$langs->trans("PhoneMobile").''.dol_print_phone($object->user_mobile,'',0,0,1).'
    '.$langs->trans("Fax").''.dol_print_phone($object->office_fax,'',0,0,1).'
    '.$langs->trans("Skype").''.dol_print_skype($object->skype,0,0,1).''.dol_print_skype($object->skype,0,0,1).'
    '.$langs->trans("EMail").''.dol_print_email($object->email,0,0,1).'
    '.$langs->trans('Signature').''; print dol_htmlentitiesbr($object->signature); @@ -1360,7 +1325,7 @@ // Hierarchy print '
    '.$langs->trans("HierarchicalResponsible").''; + print ''; if (empty($object->fk_user)) print $langs->trans("None"); else { $huser=new User($db); @@ -1379,7 +1344,7 @@ $text=$langs->trans("THM"); print $form->textwithpicto($text, $langs->trans("THMDescription"), 1, 'help', 'classthm'); print ''; + print ''; print ($object->thm!=''?price($object->thm,'',$langs,1,-1,-1,$conf->currency):''); print '
    '; + print ''; print ($object->tjm!=''?price($object->tjm,'',$langs,1,-1,-1,$conf->currency):''); print '
    '.$langs->trans("Salary").''; + print ''; print ($object->salary!=''?price($object->salary,'',$langs,1,-1,-1,$conf->currency):''); print '
    '.$langs->trans("WeeklyHours").''; + print ''; print price2num($object->weeklyhours); print '
    '.$langs->trans("AccountancyCode").''.$object->accountancy_code.''.$object->accountancy_code.'
    '.$langs->trans("ColorUser").''; + print ''; print $formother->showColor($object->color, ''); print '
    '.$langs->trans("Status").''; - print $object->getLibStatut(4); - print '
    '.$langs->trans("LastConnexion").''.dol_print_date($object->datelastlogin,"dayhour").'
    '; + + print ''; + print '
    '; + + print '
    '; + print ''; + + print ''; + print ''; print "\n"; print ''; - print ''; + print ''; print "\n"; if (isset($conf->file->main_authentication) && preg_match('/openid/',$conf->file->main_authentication) && ! empty($conf->global->MAIN_OPENIDURL_PERUSER)) { print ''; - print ''; + print ''; print "\n"; } @@ -1452,7 +1418,7 @@ if (! empty($conf->societe->enabled)) { print ''; - print ''; - print '
    '.$langs->trans("LastConnexion").''.dol_print_date($object->datelastlogin,"dayhour").'
    '.$langs->trans("PreviousConnexion").''.dol_print_date($object->datepreviouslogin,"dayhour").''.dol_print_date($object->datepreviouslogin,"dayhour").'
    '.$langs->trans("OpenIDURL").''.$object->openid.''.$object->openid.'
    '.$langs->trans("LinkToCompanyContact").''; + print ''; if (isset($object->societe_id) && $object->societe_id > 0) { $societe = new Societe($db); @@ -1480,7 +1446,7 @@ { $langs->load("members"); print '
    '.$langs->trans("LinkedToDolibarrMember").''; + print ''; if ($object->fk_member) { $adh=new Adherent($db); @@ -1502,7 +1468,7 @@ { if (! empty($conf->multicompany->enabled) && empty($conf->multicompany->transverse_mode) && $conf->entity == 1 && $user->admin && ! $user->entity) { - print '
    '.$langs->trans("Entity").''; + print '
    '.$langs->trans("Entity").''; if (empty($object->entity)) { print $langs->trans("AllEntities"); @@ -1517,7 +1483,7 @@ } // Other attributes - $parameters=array('colspan' => ' colspan="2"'); + $parameters=array(); $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$object,$action); // Note that $action and $object may have been modified by hook if (empty($reshook) && ! empty($extrafields->attribute_label)) { @@ -1525,6 +1491,11 @@ } print "
    \n"; + print '
    '; + + print '
    '; + print '
    '; + dol_fiche_end(); @@ -1761,12 +1732,16 @@ print ''; - print ''; - print ''; - print ''; - + // Ref/ID + if (! empty($conf->global->MAIN_SHOW_TECHNICAL_ID)) + { + print ''; + print ''; + print ''; + } + // Lastname print ""; print ''; diff --git a/htdocs/user/info.php b/htdocs/user/info.php index e2fdcc7b6ec4a..f069ac4782bdb 100644 --- a/htdocs/user/info.php +++ b/htdocs/user/info.php @@ -54,6 +54,8 @@ * View */ +$form = new Form($db); + llxHeader(); $object->info($id); @@ -64,12 +66,24 @@ dol_fiche_head($head, 'info', $title, 0, 'user'); -print '
    '.$langs->trans("Ref").''; - print $object->id; - print '
    '.$langs->trans("Ref").''; + print $object->id; + print '
    '.$langs->trans("Lastname").'
    '; +$linkback = ''.$langs->trans("BackToList").''; + +dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', ''); + + +print '
    '; + +print '
    '; + +print '
    '; + dol_print_object_info($object); -print '
    '; print ''; -$db->close(); + +dol_fiche_end(); + llxFooter(); +$db->close(); From b24d609ecceddca2bf942378698aef5ecda59ae1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 11 Oct 2015 16:12:12 +0200 Subject: [PATCH 086/297] New banner tab is available on all tab of user object --- htdocs/holiday/list.php | 27 +++++------------ htdocs/theme/eldy/style.css.php | 2 ++ htdocs/user/agenda_extsites.php | 25 ++++++++++------ htdocs/user/card.php | 36 +++++++++-------------- htdocs/user/document.php | 21 ++++---------- htdocs/user/note.php | 26 +++++------------ htdocs/user/param_ihm.php | 51 +++++++++++++++------------------ htdocs/user/perms.php | 22 +++----------- 8 files changed, 77 insertions(+), 133 deletions(-) diff --git a/htdocs/holiday/list.php b/htdocs/holiday/list.php index ee4465a4aeee6..419fabf90876c 100644 --- a/htdocs/holiday/list.php +++ b/htdocs/holiday/list.php @@ -218,26 +218,13 @@ $title = $langs->trans("User"); dol_fiche_head($head, 'paidholidays', $title, 0, 'user'); - print ''; - - // Ref - print ''; - print ''; - print ''; - - // LastName - print ''; - print ''; - print "\n"; - - // FirstName - print ''; - print ''; - print "\n"; - - print '
    '.$langs->trans("Ref").''; - print $form->showrefnav($fuser,'id','',$user->rights->user->user->lire || $user->admin); - print '
    '.$langs->trans("LastName").''.$fuser->lastname.'
    '.$langs->trans("FirstName").''.$fuser->firstname.'

    '; + dol_banner_tab($fuser,'id','',$user->rights->user->user->lire || $user->admin); + + + print '
    '; + + print '
    '; + } else { diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 5457a6690df4d..425cb84bdb956 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -489,6 +489,7 @@ .maxwidth100 { max-width: 100px; } .maxwidth200 { max-width: 200px; } .maxwidth300 { max-width: 300px; } +.titlefield { width: 25% } .hideonsmartphone { display: none; } .noenlargeonsmartphone { width : 50px !important; display: inline !important; } @@ -496,6 +497,7 @@ .maxwidth100onsmartphone { max-width: 100px; } .maxwidth200onsmartphone { max-width: 200px; } .maxwidth300onsmartphone { max-width: 300px; } +.titlefield { width: auto; } .linkobject { cursor: pointer; } diff --git a/htdocs/user/agenda_extsites.php b/htdocs/user/agenda_extsites.php index cd38d7a2965d8..ea8c197867722 100644 --- a/htdocs/user/agenda_extsites.php +++ b/htdocs/user/agenda_extsites.php @@ -49,8 +49,8 @@ // Security check $id = GETPOST('id','int'); -$fuser = new User($db); -$fuser->fetch($id); +$object = new User($db); +$object->fetch($id); // Security check $socid=0; @@ -63,7 +63,7 @@ $result = restrictedArea($user, 'user', $id, 'user&user', $feature2); // If user is not user that read and no permission to read other users, we stop -if (($fuser->id != $user->id) && (! $user->rights->user->user->lire)) +if (($object->id != $user->id) && (! $user->rights->user->user->lire)) accessforbidden(); @@ -108,7 +108,7 @@ if (! $error) { - $result=dol_set_user_param($db, $conf, $fuser, $tabparam); + $result=dol_set_user_param($db, $conf, $object, $tabparam); if (! $result > 0) $error++; } @@ -141,10 +141,16 @@ print ''; print ''; -$head=user_prepare_head($fuser); +$head=user_prepare_head($object); dol_fiche_head($head, 'extsites', $langs->trans("User"), 0, 'user'); +dol_banner_tab($object,'id','',$user->rights->user->user->lire || $user->admin); + +print '
    '; + +print '
    '; + print $langs->trans("AgendaExtSitesDesc")."
    \n"; print "
    \n"; @@ -177,15 +183,15 @@ // Nb print '
    '.$langs->trans("AgendaExtNb",$key)."'; //print $formadmin->selectColor($conf->global->$color, "google_agenda_color".$key, $colorlist); - print $formother->selectColor((GETPOST("AGENDA_EXT_COLOR_".$id.'_'.$key)?GETPOST("AGENDA_EXT_COLOR_".$id.'_'.$key):$fuser->conf->$color), "AGENDA_EXT_COLOR_".$id.'_'.$key, 'extsitesconfig', 1, '', 'hideifnotset'); + print $formother->selectColor((GETPOST("AGENDA_EXT_COLOR_".$id.'_'.$key)?GETPOST("AGENDA_EXT_COLOR_".$id.'_'.$key):$object->conf->$color), "AGENDA_EXT_COLOR_".$id.'_'.$key, 'extsitesconfig', 1, '', 'hideifnotset'); print '
    '; + dol_fiche_end(); print '
    '; diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 35f504c334f60..25167d1fd9487 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -1190,9 +1190,6 @@ { dol_fiche_head($head, 'user', $title, 0, 'user'); - $rowspan=19; - - dol_banner_tab($object,'id','',$user->rights->user->user->lire || $user->admin); @@ -1202,24 +1199,6 @@ print '
    '; print ''; - if (isset($conf->file->main_authentication) && preg_match('/openid/',$conf->file->main_authentication) && ! empty($conf->global->MAIN_OPENIDURL_PERUSER)) $rowspan++; - if (! empty($conf->societe->enabled)) $rowspan++; - if (! empty($conf->adherent->enabled)) $rowspan++; - if (! empty($conf->skype->enabled)) $rowspan++; - if (! empty($conf->salaries->enabled) && ! empty($user->rights->salaries->read)) $rowspan = $rowspan+3; - if (! empty($conf->agenda->enabled)) $rowspan++; - - // Position/Job - print ''; - print ''; - print ''."\n"; - - // Gender - print ''; - print ''; - // Login print ''; if (! empty($object->ldap_sid) && $object->statut==0) @@ -1266,13 +1245,24 @@ } print ''."\n"; + // Position/Job + print ''; + print ''; + print ''."\n"; + + // Gender + print ''; + print ''; + // API key if(! empty($conf->api->enabled) && $user->admin) { print ''; print ''; } // Administrator @@ -1319,7 +1309,7 @@ } // Signature - print '\n"; diff --git a/htdocs/user/document.php b/htdocs/user/document.php index 25dea7eb3986f..46ceb72330c66 100644 --- a/htdocs/user/document.php +++ b/htdocs/user/document.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2010 Laurent Destailleur + * Copyright (C) 2004-2015 Laurent Destailleur * Copyright (C) 2005-2015 Regis Houssin * Copyright (C) 2010 Juanjo Menent * Copyright (C) 2013 Cédric Salvador @@ -121,7 +121,10 @@ dol_fiche_head($head, 'document', $langs->trans("User"),0,'user'); - + dol_banner_tab($object,'id','',$user->rights->user->user->lire || $user->admin); + + print '
    '; + // Construit liste des fichiers $filearray=dol_dir_list($upload_dir,"files",0,'','(\.meta|_preview\.png)$',$sortfield,(strtolower($sortorder)=='desc'?SORT_DESC:SORT_ASC),1); $totalsize=0; @@ -133,20 +136,6 @@ print '
    '.$langs->trans("PostOrFunction").''.$object->job.'
    '.$langs->trans("Gender").''; - if ($object->gender) print $langs->trans("Gender".$object->gender); - print '
    '.$langs->trans("Login").'
    '.$langs->trans("PostOrFunction").''.$object->job.'
    '.$langs->trans("Gender").''; + if ($object->gender) print $langs->trans("Gender".$object->gender); + print '
    '.$langs->trans("ApiKey").''; if (! empty($object->api_key)) print $langs->trans("Hidden"); - print ''; + print '
    '.$langs->trans('Signature').''; + print '
    '.$langs->trans('Signature').''; print dol_htmlentitiesbr($object->signature); print "
    '; - // Reference - print ''; - print ''; - print ''; - - // Lastname - print ''; - print ''; - - // Firstname - print ''; - // Login print ''; diff --git a/htdocs/user/note.php b/htdocs/user/note.php index 7fe5766cd3a0d..3aec8502ac111 100644 --- a/htdocs/user/note.php +++ b/htdocs/user/note.php @@ -87,33 +87,21 @@ $title = $langs->trans("User"); dol_fiche_head($head, 'note', $title, 0, 'user'); - if ($msg) print '
    '.$msg.'
    '; - - print ""; + dol_banner_tab($object,'id','',$user->rights->user->user->lire || $user->admin); + + print '
    '; + + print ""; print ''; print '
    '.$langs->trans('Ref').''; - print $form->showrefnav($object,'id','',$user->rights->user->user->lire || $user->admin); - print '
    '.$langs->trans("Lastname").''.$object->lastname.' 
    '.$langs->trans("Firstname").''.$object->firstname.' 
    '.$langs->trans("Login").''.$object->login.' 
    '; - // Reference - print ''; - print ''; - print ''; - - // Lastname - print ''; - print ''; - - // Firstname - print ''; - // Login - print ''; + print ''; // Note print ''; - print ''; print ''; - // Statut + // Status print ''; - print ''; + print ''; print ''; print '
    '.$langs->trans('Ref').''; - print $form->showrefnav($object,'id','',$user->rights->user->user->lire || $user->admin); - print '
    '.$langs->trans("Lastname").''.$object->lastname.' 
    '.$langs->trans("Firstname").''.$object->firstname.' 
    '.$langs->trans("Login").''.$object->login.' 
    '.$langs->trans("Login").''.$object->login.' 
    '.$langs->trans("Note").''; + print ''; if ($action == 'edit' && $user->rights->user->user->creer) { print ""; diff --git a/htdocs/user/param_ihm.php b/htdocs/user/param_ihm.php index 9e67a1015c75a..ef803992d0006 100644 --- a/htdocs/user/param_ihm.php +++ b/htdocs/user/param_ihm.php @@ -136,33 +136,18 @@ } -dol_fiche_head($head, 'guisetup', $title, 0, 'user'); - - -print ''; - -// Ref -print ''; -print ''; -print ''; - -// LastName -print ''; -print ''; -print "\n"; - -// FirstName -print ''; -print ''; -print "\n"; - -print '
    '.$langs->trans("Ref").''; -print $form->showrefnav($object,'id','',$user->rights->user->user->lire || $user->admin); -print '
    '.$langs->trans("LastName").''.$object->lastname.'
    '.$langs->trans("FirstName").''.$object->firstname.'

    '; - - if ($action == 'edit') { + dol_fiche_head($head, 'guisetup', $title, 0, 'user'); + + dol_banner_tab($object,'id','',$user->rights->user->user->lire || $user->admin); + + + print '
    '; + + print '
    '; + + if (! empty($conf->use_javascript_ajax)) {/* print ''."\n"; else print ''."\n"; if ($jQueryUiCustomPath) print ''."\n"; - else print ''."\n"; + else print ''."\n"; print ''.$langs->trans("DolibarrSetup").''."\n"; print ''."\n"; From a8e52f9c541a17120df28d062897af4ea96813d8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 11 Oct 2015 19:45:53 +0200 Subject: [PATCH 090/297] Update filelist --- htdocs/install/filelist.xml | 2218 +++++++++++++++++------------------ 1 file changed, 1105 insertions(+), 1113 deletions(-) diff --git a/htdocs/install/filelist.xml b/htdocs/install/filelist.xml index fb931f9fcdc5f..0484184115b5f 100644 --- a/htdocs/install/filelist.xml +++ b/htdocs/install/filelist.xml @@ -1,5 +1,5 @@ - + d41d8cd98f00b204e9800998ecf8427e @@ -66,7 +66,7 @@ d41d8cd98f00b204e9800998ecf8427e -09889ea5df64284a0e7753cbdf134a53 +7aba69716e92939377bccee8b5c4ada2 d41d8cd98f00b204e9800998ecf8427e @@ -96,11 +96,11 @@ d0a6afda3d75393d3a09e43bb1135b87 -9f1898d4f913c53b7135cb00cccd872c +0f28a7630e864c959d4fb6d6f92304b0 a92b0b6374f698c980928a3bee17ff9a 92c1d275d0117efbece0312787a0736c f8ba5662241d9c908f1f791f72481eb7 -2f1931c293e0ab260b31e2d1b0134f73 +491d3762c5040d7f09f82be0b27ddbea 7367da82258c07fb35aaf3aafd3e1bb7 dd9cf0fdcd7a32f49882b31d894f9bcb eb6e5f08d24f10bdb9f17e6da6f1df6e @@ -111,7 +111,7 @@ b702c4be259106f2e031a8d7a57462a9 ab13e413223fede4e27cdd0d5a112cd4 876371cf283ebd2982d4cacc1640536c -7f5ed41c70e65cc91e731dbf88692d8d +c7db3ca4d5477082bd3251f7d02170ea e3fa076bfc94a80430f9a32aee318da8 c31f65e979da57d157bfb7ec4cdc65df 2a13bfa6db4c63aeab46d3aa2beb353c @@ -127,7 +127,7 @@ 408203a970401705d1735235ba7be850 -9f7444785dc0a2a5670401c4d029f80a +f931df27f98e7f817c266281013860cb b3d708e374e21a5b90cd9b4fc0be482a 52c51ac0c1e841314d48328b7c32b7d3 9d56c5024279a4f5f9b799c6950f18ef @@ -189,7 +189,7 @@ 8868b7d0779aa09e9b52c965e1e96b8a 5c06b9772a487667c388ae2b5714fa91 b2e983fe3f64bb7ec0bd09a8d7225acc -479c9172c6429e0b8a59745beaaff7e2 +f4852e3a84cb84e07ab5a08e082bdb69 bc667a42f1ade75c59cb5ad6103847b7 d63455783346f56c804c166f71bf72b0 31bbae8a1de3e1fb630ac4d83db62d71 @@ -208,7 +208,7 @@ d41d8cd98f00b204e9800998ecf8427e -a5cff5f7aba2c3c8537838168d619b3d +59cb9f641e231673bed98341a8208d40 667cd8a71a675fe06ea29427443e4642 @@ -6029,7 +6029,7 @@ c2187f1d78aecd78bf874e49a926eeb1 -113c537c0a66f07a58e9ba754a7ee2a7 +1c8f0e528720a9c9ded24e76518c9341 6d6695e08c63ce635ca3e2f6a1d6f402 1272ec0d12432850c50005d9c1bb9d92 @@ -6045,7 +6045,7 @@ e3620f73f3a1650f7fdb53e6c44a1c07 -c9851093aa835ac2ab1bdd30e6c9befb +b6255a08ce51ab32895aa41e6230a3f7 7724aa95e287dd12bfcd6a4a9c0e0e72 c2e932610f10f683fb0111a7b7722565 @@ -6060,7 +6060,7 @@ 93b60211370f85ea2df9ee8602e27ac4 -e53980bde7980a91e1a3928370d83559 +e697c15fe969eb5405e16bc49264fa01 0860d2328e5a333731cf95de440f4356 3a728460147fb9af7faf0e587b9fbf42 e80584be003f3f3d859e629c1e84f65f @@ -6068,7 +6068,7 @@ 7438b3ef10b182042dfa722f99ef2574 0899f764c85bbcc13206e3dd8318e678 9f8b43fd1df78dca0827c73e29890865 -ec44fc1fce201dba598024843be29c80 +69583ccb35ec8ad521dd0d9f6814b865 bfefe70e3951f1883a84e7bc4033fe97 @@ -6088,7 +6088,7 @@ ac2861b424e2b7e30a532f37b33d6889 4b9acab98ecbda7e226a1f6848ddfc41 913604462a67f54fd2b2e439373687f1 -b9f9aa3edd84818810e333354981c3ad +cc81befc15da5b8f83fcde8548f3b443 d727abe4a721179026bbf1092cec946c @@ -6151,7 +6151,7 @@ d41d8cd98f00b204e9800998ecf8427e -45b8385dda542a916314adeab20de308 +043214cfec88cbe08e22a93ca425eb13 7b22629626fc5f780cced1f6d817d57b 7dc0092414e8a0160f715413907ef350 @@ -6193,17 +6193,17 @@ 4d9613e1a21fa012ac864d96f1a62112 858d2732221359ba9e0a9965353848c3 -df81fe06744adbdbcf27a69f0b4ce55e +877f5ab5413561ff0dc4afaee336b4a0 d59f578b7eb5f374eda40295072f0fae -c24b93c08c98cf333d2e7652e60456c9 +b928537bcc970549c357bb80ef5ad16f d41d8cd98f00b204e9800998ecf8427e 5c09b3d75fcba736c3353468236e5338 563dbdf25cbfd4e4b50649530f7e1151 -655f7d2edc22d92a676b4f5ea041879e +261d1bb522fccdea41b2573ee4fbf277 0a81d81144952f49baecb31cfc610fee @@ -6224,17 +6224,17 @@ d4bf21d9624e8fef1f9d20465d2e5503 62fc08bff6c9c08fc68bd5ddab35e443 24ec97e48bfe034f3ee795ae9ceb282f -4ec443ce7e02d8c6dff96fc0cbd6c285 +f1039a951ab36cebafbbabd8a4117e73 -a297bb14700fc91ffe3a8ace3d2f7751 -cead2ff721855338e0d61128ffc2ecc5 +b0ddf2ae9be37ebe13ac48a6881616a1 +e4a04d30006545f88d06bd507e542506 25b3ce6e2f12f227c4a1ac8db9fab357 af321d136a1e674037ba2c163db3d2b2 0d79377d6dbbc92ac4ca0db3ede4c00f -9293af8f80fd01193d0379c1761bba8a +05087939aa7580314356261375ceff17 637c350b86faf4b9066532d41dc87fdb @@ -6248,12 +6248,12 @@ 9b2c6de73503cceb102e875a364f6626 -80a3e34168be19d0387e287da1d7f42e +71f0213600f7ced820366e2a29cd1830 65e54e9e6458c353a92eeaafdb0d0022 d41d8cd98f00b204e9800998ecf8427e -ea318b0397fe12ffd8f748d80e09a6ea +18cebf1db58bdd4c52b6b36a9fab1e14 aaeb594d255628a742d183b0c4fff3c6 @@ -6273,8 +6273,8 @@ d41d8cd98f00b204e9800998ecf8427e -e901d2a8027ea0d4a2fd0a2f0c4254c4 -967fa07d1b551bc6bbb1fa5634a783a1 +bc43add6b32c31d1b01ea56190143f5c +09546c41a854e762844c9fa4f2000aa0 abefa8f7d035ae87eb5b45b0c43843be @@ -6288,7 +6288,7 @@ ad62122318a931843599ec66c81cdf02 -0ebc16ded1e4b42a4f1c0d6b9f1dda5e +4ca6185ba6db6546cfeb895c29bbdd34 71d1ef869b5ab59897f399b0d15f6e5f @@ -6302,24 +6302,24 @@ d41d8cd98f00b204e9800998ecf8427e ee74a794201de6cf45f08cc56c789ad7 -214e0edb381e28e12ea19bcc941d71e4 +493e569e803559c55dd06ca35411e0b4 dd8891037d36d4a87969e74f93d88e49 -7513073720e3165c5b9b2a8080eecd18 +655a1635fdf3202e7d7c074a029bf277 b3fd9f9544438ef81401c880177d40fd 5c0c423540accb30a32265a7e909078f d41d8cd98f00b204e9800998ecf8427e -d8f4d806cc9823e961151c44826ffd77 -31ee8e43f5401dc71817b7260a86beab +86fe8e6f4ba1e0da06a5523b1747310e +ee9e658395eb5f6e4e4415ad4b952a1c 502547de717912a19aca06ddd223995c 08d09a43fb6c23ea07250e482e0116d2 311259a2b28384c64ff2443c7feb9d21 -b0446ea619a94e5fa2b3178e293ff30c +c1a2f4393f1fdbcffc80b181fd828d0a d41d8cd98f00b204e9800998ecf8427e @@ -6351,7 +6351,7 @@ d41d8cd98f00b204e9800998ecf8427e -3e83426161f9a2ba6044124f02f345a6 +f1aaa2ddccc69adf4fc2c6e9aad9fe61 7f74cf4fc62967e4f18a2b2d5f49a3f5 50bc7526a36a03c57dca47022c735425 d5093b1fa8a05ed2885905be1351aa57 @@ -6379,9 +6379,9 @@ 20c72a55796b1e64cff84f004b04e76b -e03eba31d58eafe6aad3ff94814bab8c +530655125f0ab31a2406b744e62ae2e0 f15bf7e5916adfd39a30d1d984c28b75 -5c1defd3f977bdde6c68ecca0a596b2f +aaca3ca32321aced0a33feaad8be2867 d41d8cd98f00b204e9800998ecf8427e @@ -6395,9 +6395,9 @@ 3e8b72640f3dd0117bde24b366b7a8f5 56ab66872574c4005a138883a610053c 5c07caec4119e65b0f413c36382fc1fd -45b121da7ae1043feb0990220f7af311 +a651cfc57d02e13f28a7888e42936c6f eb8aec3b6223e224d7e0a3d275119d2c -305f16b73e13c5fd024f6dfce15d6152 +7d586422806dee9c2b3b1bc2040c103a d8bb05e304774532c20b3bfd2640be79 @@ -6587,7 +6587,7 @@ d41d8cd98f00b204e9800998ecf8427e 7a257121b2c9d54226e1e51d67232505 6b6851714ab5e4f9491c2500a26c8ceb -85d3d8fc243475727700d322daf769c8 +8236206d490740be0c025f905d8fedc5 594c6fadbe917f7e36c7b72cfd6a6af2 @@ -6609,16 +6609,16 @@ 8cc4b11d20b0e01eb7e7b7401c2f12c8 10740fb22bfc2ac1b339e9d784cb9c23 e72a1897ed9a078b81e72d66eb3895fc -ed61f7e507113bbde00c18af5b6d8594 +ee2a09d80f4c4301c4c7a35dbac74255 29e218c7e580c35cf99d19f5876b1709 bd68e17f01cde910409d40075ec640bf -abf21aa57d70ffb9f31b5d6071ab8fb1 +19841d0071556ffdf8fbe94d0cddd464 b7c3b27785924f5b023754855bbe3177 2775e6e61e2ab0bdfd17b7ed63dea86e 83554ef1749b5f877cda2173c4fd71f2 3c5adedd71ef8c08b8dfd0213767a814 fa1602ccc625f1e35a7be5e0a2083020 -7621f387a352d44ede2cf4afe0662679 +c4c69d5940cb93e0c41bdb62ff59a2f5 a4a1f69d36f0c22e9eb2767ea3f0adbd @@ -6635,7 +6635,7 @@ 30834b09409d2e8bdf19a7c03ee3e0c0 -8b1537f1d750ea8d2d94e9f17b71ebe4 +c89ef8b181cebf914f489a4849014df4 7fbd04fb747c9df920e68d90c28f6853 @@ -6677,12 +6677,12 @@ 0db78f95e23062feab46593d28704532 d13a1b0fbbc6cafcecd93f460a494cbd 084f9694188a61f84e337a78ed05441d -904fa6ad71728ebc126514a863305f11 +40d4b7bcf8ab72c9640862b4450c1332 02c3c91fb006d3ae2e15455d1d559a91 -1dcbc5b11a925b933b59aa44ac588854 +0fdcd38ce537746580c763cc3bad3867 a5fa4f2f169cad1915a191fc151ad265 fc4eb48545c609f71eaaefb2e061d91b -bf8b3d955aa1deb2e041496544de5f04 +481ba4d57ac39c2afe7e74987c509503 c663d2cee4ea71d024f2defd840527bc 4d33c44d7e7704e5e67b2bc7b183d8ba f0bf2d1c291cff3b62bf2a656b32ea62 @@ -6693,7 +6693,7 @@ 7ab52342b3b370b5b6f6298dc5d4c182 4e6fa59e238b5d4855818e3197dc9931 6cbfa567b0f4153bbc7f74adfe6bb4d2 -6183a5dffea32afc6d961f7d35b80f6e +a50413b4e11d40568247b0f3aeb6edd1 bf50bfa23a12e840e06fdf7f53e157b1 ff02ed2bea96d88f500167a09413c7c0 59877377a38dd5dcee93798ea7923bee @@ -6713,7 +6713,7 @@ 5ab4686cbf0b0d798b37873a6c9bb3df 1889b6eeeef65ae427813873a606a06f 126d87de4a1d8e863a5ad85f840caf2c -56a4403ca54afb568def56c118ac1f3f +f96b3c7931490587edba909bc2a3d73c 4b09fb6f2102d0dc31cccb6a021a275c 56ca46312806229c2d361e9c46ab4533 0b631c9349d4997aca6fa2bcd6a60fc7 @@ -6743,10 +6743,10 @@ dc056bd161ceeab388b54c28790ad27f d41d8cd98f00b204e9800998ecf8427e e403f819edbccb676580a4bab5dc9b85 -9d9ad7310241ddf16640d3f800dbb7bf -327de623b6318783a31bf2402764855e +8ffa067fe180a67ba149c4ae7f319b09 +67ba0ce54c69bd89a57e925941319ae3 07374752b32e65ac21f86c1801ada777 -abbc5ea531df4a7c03949868ee141c38 +b6333dfcde8674d1f76a8fb5b8386627 84b8be2d20c1d6d6811f0298d2234ca8 223bb15e53ca059b66188e2c5d196195 62ecdcff5b99f8bd94f75e2ab7eacd71 @@ -6764,7 +6764,7 @@ 1258865536912e11c70ae0c343576d11 07e043e1c42a0fe90d2226eaacb013e2 f6d4c9c91e2608f8ae916ddf86816560 -c4aae5b40cc7eb4a71878111763cedc4 +1ac25140f51596243217b5ebcdad96fe 78f6029aabbd9f1e2568187f7d2f98c9 a969dd13ed2ab6f921564ecd22121515 ef0ba347561ad5fcd763fabb899bfad0 @@ -6772,7 +6772,7 @@ fb6dfe418a92f6803616c17def007cd2 48cf595e8d99291e756b6f0945c4a656 60c540c4dfb653ef65e67a628645f590 -8caa3b39351927e5159b5a42d5c0f29f +27e975f676e3cda57ed150f82a970644 cc545e426ed2e735bd00cbab8db381bd 98ca2d412c720690b46b8bf566cf4fb5 a9d45ffd6281800146fcfb2e3ab90ab6 @@ -6780,13 +6780,13 @@ 33293e2db3dedadfccccd5d6ac23eaf9 b416db3eacff1ad448692d14aadff327 6e53a89f128e41918ccf5b20b96976b0 -16159cdb43a8ad0715b528bb858a2420 +1c73eacab2a1a619dc70e2f24fba4d1e 0bbc469b628cbc940ebdd59f2e218b6c eff5fc174c1ec328e58b76a3d70a5f2f 116c4c10fccce8d73c9193e742834d3a -aae21d60ccd315a64cd407d301514a94 +f99ce992ef00dd16272190000ca9518d dc63bf62b746ea8d1b1e7833675475d5 -fe594e68a36f30b5fb0931ce4e7944a7 +e5782fe8434c4a711e0d8b3d9c198d75 35cc6ac5381635a8a49523616f0d5e18 595325924223d40b0ea97c9df4ebfde4 aa7ebaddf8d815b3dfd1b3281f26de84 @@ -6799,7 +6799,7 @@ 4eaa5c0e7ce4116e821af9c6ce8c53ed 540b65a840a2f9876551a7963a2aa1bf 48f9b2c134655de1b0f5f7d50f01b765 -e04716adac419184c905fbd611e66931 +be3c22b06cfbbc6e8771a5ba0f7447c3 70c6fc7d08f3c562322c9f53273f1393 @@ -6812,7 +6812,7 @@ 505eddd29e439ed2971f69ab8d38e289 f44ef38f3ae6b30def1d8f4d8b309ba5 68f1afb0ba44e0f93c89b4768001ddde -5bffeecac1842d72c52b88dfa38a0d45 +67e301d4222ce8df3e27dd2b6bacac0d 2616ba6e3e277acabedbe7b36114d851 637f30cfefd948ec5aea16cc25f00f91 4cb7f6d97d38884b63a5adb65dc85870 @@ -6877,7 +6877,7 @@ d41d8cd98f00b204e9800998ecf8427e b4e9f07aa5268af49d3bb9429719b201 8293bd60fe13ac64c22f8500b346821c -8c43c3a33ce5882354b25ea6eedd6b0f +dcf77950d1dae6b1e4eb4c8473318bac 413af6ca18377689660d2b2eeed2be98 d2df1ec90f2bebb3ebfb74eba81bcec7 c3b801c60645dff594d33cf0acc43fa5 @@ -6955,7 +6955,7 @@ 0bf2e38d4ce8df49eea23b091ea492f1 -7aeda3f29b8d3517e7134b36fb4f3800 +26eac71fe10cf9b45357d18da527bd63 d41d8cd98f00b204e9800998ecf8427e @@ -7006,14 +7006,14 @@ d41d8cd98f00b204e9800998ecf8427e 4d1fa853732216f28ce54fcf8e4e6207 1277e5c01232300f48a75b9b02bf6e4c -acf8cbedc321fc847761004a22c3557f +9b4de98bf9f90966db0305e9d8aa0de5 7f9e9451a7893997bbda81950b9bf3da -537deaee8ef58fe9387bd4da41e240a7 +934db34fc5470e87467d07401027b6ac 640847d555597c2573213b5dc5515cf1 e8b39a8d6ef02915ddf04bbc93b92d82 184c417ca2d9d734f73867da2c1287f3 -f173dea4e119b8a274e13d67c975e859 -86c7f6e4aaac3b2a30c86cb3d5d083f8 +ae0615307ed643d4c7b0e0bfe4b7e45b +011f89953f9ad322e178a8d183de886e 9836a974ec46db2376f688070eb5f577 4bbee56e9f7b9e39373a5afc8983bd22 @@ -7034,7 +7034,7 @@ d41d8cd98f00b204e9800998ecf8427e 6b8b8ce50599e40cb74603a883f5d49b -b694666f3fab63aa002cf57d9221184f +eb4430a638d6c94ba5e1d0114babe300 d41d8cd98f00b204e9800998ecf8427e @@ -7092,7 +7092,7 @@ 13e922bcc8c5b80bccd436037b6d1983 -00c95231958ea34cb8c2ab03d977fad7 +74bda525f0dda4ec97c808e29637ecb6 d41d8cd98f00b204e9800998ecf8427e @@ -7186,7 +7186,7 @@ d41d8cd98f00b204e9800998ecf8427e 0f7bbaf52bc8737d3a20ff0822895e6a -5ad19942c767e2b7b40bcf7a4557ef96 +2783cf290e6cbfdf4bc3fb56e2d40191 5cba7b9316b591829c756097ae0485cb @@ -7196,7 +7196,7 @@ 5a24a30915985f4921e9977ef5591d37 -1a81e2c1584303fcbd35ffa7959a9548 +38c48f781dec1c3d5af764d1a186e273 581bf4f5d80169d20b9ac13270b44e0c @@ -7210,7 +7210,7 @@ d41d8cd98f00b204e9800998ecf8427e 4dfcdf4d3cb3af826834c1fbb852f513 -9dee214cb227c61a780e61bdb328d8c9 +848dda602b15a270752ab3d14d83e2b6 469386ee98ede1646eb80de2443edb92 @@ -7302,7 +7302,7 @@ 6bcc750e4e3bcf3e3f130e84fa76c000 -c541a34207adc5350b2dc5c1f09b999c +a34e477e026937ded25b3db75628102f d41d8cd98f00b204e9800998ecf8427e @@ -7366,7 +7366,7 @@ d41d8cd98f00b204e9800998ecf8427e 1f21bb9a5810af59b93c076fd23f22f8 abdede0b95ba0317afc2b84d41c6d466 -24061f96041726ee8c39737cf7977c39 +5d52e0ea49c4d289ebcda2e1da293202 8132fb847569fa766adc0c4573f88d01 890b8461abd8f0b87b126e9e770b9909 1f02fab7a9f6f9c4f7e6f55b70d39ad7 @@ -7405,15 +7405,15 @@ 11b50c97effbc90d2bb3a8fdfdf10d82 aec2cbb607f3e669bf11d95c6a2c2a57 9fb34a6db51d3aee921928ca1d42a3db -420ca27e9e8703f76580acfe7dbd081b +b6afeec640440ad686b7ce7ae0cc2a04 98a5d4c239d3736d1f4d477225fa75f3 1921a40ef2e203a9c7e33e33d8481630 -3055a2f7266a60df732a08529a6ca5d1 -eac772a94850fe421d7cb668f16d8502 +20bd3b11f5fcbbcf18440a548e98db90 +74a3eff04b216cdb9d6ec3e20df82f9f d41d8cd98f00b204e9800998ecf8427e @@ -7424,17 +7424,17 @@ 7d040a1858a6f1e8b3d8e7fc68b1b008 -15aec3de90cf1c5a1a4edd5f46cb2bc6 +d2beb46931bb641bf0126092d91149fc a267dd6d9a787dbaa95ee81e9812a81a d41d8cd98f00b204e9800998ecf8427e 890365ca9e5d7857e3532d4c0366f94e b3586b44a75323dbf02f85aea44e25db -6473ee94ef64fe6935f95790230b7574 +5ec9b9433c17cd7e39efe73b6ca47fdf -1699071ff4bb09210ac267d430c05352 +98b2b5f2c5fbc11b2d101f74e6f53550 dfc38f61ccb28814db587e30de81dbc1 e608bfdc1dcb6e0083ef2f07d6abcc80 3c7eb3a309b7b07b8a64dd1c04b1e652 @@ -7461,7 +7461,7 @@ 884f200f728cff6292071327f3333432 -ba371d6791ddb47139e9273fc89e4348 +4c4a05e064908129d88383e08a9a6975 b78b788d5b3e07d4453369e56c1d659a f51c8778bc72faf4f5fd6f52f43b5238 626d8b5925475bd539d310df50ba813d @@ -7476,10 +7476,10 @@ 2f12577c1d455111bb528f3866b65893 -26a046368f569fab6879bf7b4149b5cb +5896d6563d302d330c365a3c64d8408b 280a1ab7fd33d892d6726f352e555c4d 68dc3ea2cd9c6508a925df50fa011221 -8748d27b61bab3f4fe7a2f5fbc4fbea0 +85919d63e768559c976903b253070b04 deac83a4c0eda829eedb0f9136a1fae5 @@ -7487,7 +7487,7 @@ d41d8cd98f00b204e9800998ecf8427e c89f71e71b16be64c27c7859023fd58a 690c8e0cee2b6698e3b48fd0ac4de529 -91acbb4ca5dbdf0dcd92975e15f19e1e +c120700122ee082bcd1bbfa5dd0398bc d41d8cd98f00b204e9800998ecf8427e @@ -7568,7 +7568,7 @@ d41d8cd98f00b204e9800998ecf8427e -e3346a9e88067fed71d467321021ac84 +23752bba338ea1a8b3a230ca8179e4c3 0d1749857d83ca714437ed891e35f046 @@ -7588,15 +7588,20 @@ 6bd38b6af505407d62c60a9eefdf208b -d10524316d94a05190315ed2a537e590 -9698e999326e603af9f0271bb3126e5b -c1ac4d0440f0210376068d50d51c11a5 +d69969e2a9166108538a95b086599544 +740bf2ea7c400568aae6e3ebbb7efac2 + + +e9e895d857f4fadb5d169d98cecc4cb4 + + +c9fa8f71196dbd4da6c319f00412a394 0529ddc77e8c681c33c47b9b7687e810 faa2eda13c5607ace72e34e9c0966a0c 72ddc5bafe07d7b1963a002ff2638ce9 -b8410b68abe62b98765d35b9d68775c0 +55292d144ee7e11471fbba2b249494ad 9e6bbdc99eed41d9480ff63f9c187e81 fc788306c40f210227d440befeb605d2 @@ -7604,14 +7609,14 @@ d41d8cd98f00b204e9800998ecf8427e 6b603e643ce203e1268c44f2560baece 495109ce3cd762f708dea35bff725ecf -d41a0862545eff600497a0bea3f1ab9d +a68a62a40bd64f627b6ee6a3f4aeef96 -c48bf12c8ab59a7e5288dec2171fc487 -766996c5832c22283f845d85c69050b6 +b554b95843ce324153cf63af81c4f467 +49211ad04c8d6486b554f5dfa2549211 b029262dc429f54b44eaac3bb3673fb2 -1f302e022d85d26a771d480ca57c3904 -5b62ce52c0ce74104923cb08c4a2c755 +25cfef0428da4c37fdb47852f49bc1b2 +199b29d1446f63ab1880745ec589933d e2ae08bd4f83213f865545056ac6dd35 43cc87a6b84afe612af178e9c0945279 @@ -7768,9 +7773,9 @@ 3a8904966a2f450f621c5267098f7360 -1c942203fda2bcad764d878ebc0c47a5 +5f6fcd5535f2233dc3dc9fe6312f1fc3 d41d8cd98f00b204e9800998ecf8427e -6d5ed19523464e46013936df91c6ed3c +9d7603b11033ad6fbcb3bbc46d5503d8 9568715bc1f4d7aa42744b4096afb922 @@ -7784,15 +7789,15 @@ be4909eb830f52517bb34572822210b6 d41d8cd98f00b204e9800998ecf8427e 2a2702bd2167fd28271eb4eabca6363c -8da3d77c235c7a7d054ea4ae7311e156 -bb29d8dd50b7570b5744da807dceab8a +fd2dd2fbd7f099628630db64aca7e94f +eac5c0f76e5ff1988532c66b922e800f 26e616b72a49ae4b326a093bd0713303 32e6a6b4b2bc4a78d07dfdcee485c09b 289aeb68be3c5ff2a4cdd57a64257b8e 31431bfb5d4f361b35887e63a0099655 -e03dcf6c18969e1baea2d9828a30f779 +d4e648a77c85398d52bf5915e981484e 3e8c8ff5959ed24ad35c169286978b20 @@ -7800,11 +7805,11 @@ 14182aeabccd7c3a761d93d1564a27f4 -b7fba61cf5866b9933b7ace9bc4f9146 -09d76b5c0967e0be88129f9da3c37531 +0ba364012068975254ac02cf15ccd1b2 +4045e0030818c05ec539a2bd6f3a6d17 -2bd1e1553a9cc566113d900b41bc0fa8 +3042db4b42f2e098badf2c40163287d5 d6d047f9389cde6f11b9175ffda432ac @@ -7817,7 +7822,7 @@ cb26417ed98d172fa1fd331e1985d799 -351fe37b4b23a7ed9d7f1300463e5b39 +9bdff8a4621202d256b03029cdb5bf29 946760ff06abcff5d8863b1e782893f5 d77afff33da4f512b0fb46d1be520cd0 @@ -7878,7 +7883,7 @@ fde1dac27ff95323136138883a8cb086 -2fab1fadb7f83179967aadf4b5d4ddee +bbe63bc9761891dd1f47f5639ac8fd44 d41d8cd98f00b204e9800998ecf8427e @@ -7892,9 +7897,9 @@ 33164d88351d201cc651f7142656c3ea 759762a86ea42322a44b7eadd4b76959 6c456bf952ac5c6889d0360ae3d327a1 -083a136f4b46fc248af19e10563c48cf +188746369ab37b18b1f84b20aced9f0d 80a28b7d54cfb242e531baebbb30e4fb -4d57992c87ecb429b912f6ff7a518656 +6efb95c81d5c8e640155ad63842987e0 fe62c00b682dd677dbca4764d5f0fe97 @@ -7910,7 +7915,7 @@ b6fd5cc801d681b05256bf8b413c9786 104960714a8b404303b3436ef291f2d1 -0ffcb06a700db2a4795b2a1cad18ebe8 +1d56c1cff5f6f94c0fac9cf48fe819ba 2b061d246bb5f2342b9867c346f3f1a7 d592551b67e9dd797f7a36a1b257684b 204000f10fb031ceb45970d4b4996fca @@ -7930,7 +7935,7 @@ ea1a3bd45013d291cafdce135ebbd13c -e8fc223a34a1c80800a0140f5ed6cb09 +f9a7c3d80ef15ebdb16b9f9a4289eaed 221d0b581479c434f039e58da4718a8d a6f5b10b14e766e788351b506b6f6024 cd10645e90733c7d081f7bedaa56b891 @@ -7943,11 +7948,11 @@ d41d8cd98f00b204e9800998ecf8427e -0be05b0ba5c70336ad3873274d006fa0 +191ad6a413e35342ca7cd3460dd9f31a d41d8cd98f00b204e9800998ecf8427e -13c5568a0f6073a044a0fa8c95432c7e +920415a8d70425c1c0476200edc745b3 616dcb2aa65aabb125304d44c6efe355 @@ -7982,20 +7987,20 @@ f47f735ec8627b7b3e9ce6a5e1643d4c 79e09419acc819e70f82f56d7fa81d20 605bb5fb9f548a1cfb766c12c98aa303 -27fe10718d47636d063f37ef9ac4be0b +d5b503dc10a91fc2867f11b806e43aee 0b0532af9e3f441fe8f2e530df0e8b60 61bcd0fc159ba4ac9b4ca405006a458e d41d8cd98f00b204e9800998ecf8427e bcfa3b276dd79437d1d60139fe51de01 -bc057e396358b8d68d513598117a4af9 +b38990d47a4975ee30ed0e3af4a378e3 f9cfd60be746eaea8b3e69fc3fe9fee5 2068f6bb040e517d593f0e5607b8724a e9075781de163cf107fb3202edb3e002 -0ef37e21d2e25895a090ad77e9605685 +5fbdf018aa95b4d6fba8a6520c1395cc 6a6c8a4f2f8305f324705e111f5ab746 9cac9f75f05ba54c2255f7c789a5ab0e @@ -8008,52 +8013,52 @@ a6eeebb304bbe571ffbab0db1d030569 -7e0c6b54f531098e4f352f83f4d34234 +f6145207c408075fd530e364b06a805d e531ddc71cd65c765c78bcadbf10f8d7 ca8137cb50689abf0c3bebe34978dcf7 -abb298e664b2fb11fd634e3d3dbed05a +f924847ab85674ba3200ca27277e0030 db7986081e563555bbb45d35b1dfc823 458d70e686a207a21618c43bb1b9779a -128445fe765c61f01a8f6822e07dfcfe +12fe6ef54baa77f95b323f66280726d9 59ddd81ed9bf99d543f6f3aecb613f99 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 23b68fe48b368fc328f5dadcd75fdfe1 6b1640bc51b7f7eb47b7502f0aaf0d2c 23f198c26ee64d43c1673947c8865329 -7a3a40afaa184399b3341c8d3752ec7f +d425b192e4e4f644e3233a2d63ab5f61 ef10d5d01e0c99da899694a920063a6b -87cd39aa024571ecab3ccadc961e264c +2aaee86d73909262c225b9360c1671c5 fb330418c81c08843a8ecc7b41911c3e -7fbffe58c311fdd7f2c94a75e32d3936 +ec0f990c4626353903979ab05aefc6a3 d9bd6150df07f9517e4ca5056dbe663f d3328f22bef875e75fcc41b404ce8460 -9ee4015d43e5e0d6912b836b06a13de9 +269be72b4c109b1d9407168cc255a548 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 95bb2af8fabef4d78ebdf2a5a9799ecb 8fa3145942e5d0df587b19b538a59e2b c3fb35dd0fefe93bbf0dfd8976709bb7 1ee548ff699369a2ef3328d8c3010048 -6c86fdb742038112276b77762d104b23 +8349c7c6bc6c2d51c9d617d196588c41 d51def48233e07c836e1c7a673186824 -459a9508eb6538bbf7fbdf224bcd4e3f -aa67d5c5a46ddfc225448043268e38e2 +5a7e53549b13ba69bb551e3d13785e3d +8a0ccbf9bbd36a4cc3aeb30517c48280 b7f38fe9df82f9bfdeb39d490bcf2273 c5d8a435b760308bd0c43e3494dea231 -bd5ee5b58b2511b8fe23e96db9451902 -3f6dfeee5347762fb5f9c2993d6fea12 -4a138c319788fb8de9b68cdf175461a4 +b154606cfec9ae71a3084379c3f52643 +2103918d3f7bbc6b25c9ebe75e5ba5bb +8383b83413ec5080325c0104121cc34c be603b1e11232e8e4df3956712576964 afab86bd75994dd422cde6c39712e684 3324c82b9c0e239b743efceb0b1ee4a1 6d984b6497a4521ab43b53f8ffa97239 af2c055b31358dcfbcaff19b8f32d741 0b811b8a0f1113a872111a69e771d294 -8b9a65f71f3a9ea000c870a2a094b5af +f0a5af4ef3fcf089d999c72424dd1534 e1514692701903c4fa8ab6f93685fe9a -183abda9ebd7462f00f4ee7095c84195 -0131eac3feaa89273e8e26c91c2cac37 +7c5ca268a2ea7a6376036f2c81f5b10f +b1e3e3f8550be02bc85065afb34f2465 aa3dd95196d0ec83718e74c22d0a0da3 e2e3cd92d8221808b6348ea0dce50716 2b89db2c940374d7c69527633eb17a27 @@ -8064,56 +8069,56 @@ 55f29464b755eabef4cf655705d4e4fc d7de9e65df06622427243a6b3ed53cd4 c093fba925641be12ad8f06bb542160a -d12217cdca71111f70be333c4eef99dc +5d05efac98c6fd3106f56295ce0b8673 ed3b811dbf2f5f0da999aac45470a2eb -4b3a795b74f619b597f1d2ebd5f0ed4d +d7d541404e019a6d8f45d1347bef2be7 36d8c10a2ce5713bc959bebc6b9bb3af 55323f24685f41d39d6a5d297e3654db -b9c19de6ebfce5bf046caa3bbd6738bb +e5247dca22fac3bb18e72e0171a09447 762641475619347539e2028a53f2ddf9 -9feb7142f076e8cb6562176417105676 -a338de2b2e184a6a79b27c41ef758527 +aadfd180c094b155f2c8ecedf9b7d377 +a3e9bc5dfe51c558cc8277d44fd5c4d4 c7e95ae701ec540f03a566203de781b3 -d9a551b3b77910142a904b5bff66b447 +d67ca33509c6f0eabbd6c661a27ab0e2 c19d107b0434906fbc0b459f61f85117 b273aa429a16fe1379be33876a4d49f7 8869a3a7b2a620a7621d4870c57aef75 -e1161971bb06488cabe9066c8e827741 -5477536cee0c749079f446676f85ba11 -886b27ac5b94fa8a293aeae7226314c5 +1222fe864b75c9d423009dbdad938cdf +9939c5fec9087bfdc82d8dccb2c2f64d +d4bed0644268bf6cd99128f64db17e9a 81ed7b9e30bf240d51d7e60c65e169d8 -8af9297add438b147e7144fc9f16429c +1a1e47204edfd7a39a48bc94a6d87039 94cd6326697d1468356fd7860c279f39 abdc5b264864f9054c2bd3582aa7f290 -5824fe01751d0af34d9a3075de49ca2b +d9c27d2d19632b11e7b5df247d1cb5ce d11b836dcf659c52b30c12fe751664c2 3b21f916c1cc442741493663d4d870f8 8d6ef3890b3855e9c9901f905906f84a e8df1b36eeaf2d3020a71b0e273a4d99 97af8c6ef82a0f244fc815e6e16ccf90 90ec5a83c874481c4db7a861ea540e62 -012cf35d940aed1700ac751a07331a41 +123e1ced012cf5ca86c9b7a4d713bed6 fbbf6dd97870502f3b527a7855cc22fd -171adcd57eecc43d8ebea5bd3cff21dc -a9b978311e891d61a5a0a001933d7a6d +673b7b9a03cff6437a53f372059947bd +b8636271987e671c88b7a23c312319dc 8ff03a197fb775293900b1652cbc2cae bbcc88993e093b880a682371243cc500 -28eb991ac8777246895a581c360a9daa -7b7811b0028140c1b0369fe9aa94304c -0c898de20d09cf4914877ebf2695dd53 +7b3c1047d31736f0b995520bf5c770ec +d74e66986a63465cfd73af9d5dd1a180 +c2855a7d06669f944c7aaca53532b7d8 10d1641217a535f93ec6a25fb693b58f 72edeb3570c0c46201f53a9ecafea7cf -47f5032648762db635d3ac9e03848d6d +39b1a98ee31c34a9a67fd7f2eccf931d f3b0f3b7f9597a5081dd6901be2eef39 c1da4b8a0934373f032daa2da245a23b 9bc9627697f6507eaac340ce462ea48f -d31e5e9b017c68c52f39451f6a4888ee +7d6fa21f3d0ab0a5b4b676a64fe44c6a fb0d8c3726d85a9e032c4aba68fe5ca7 -eb245be274ad480eb8d849529678aea9 -1f5d636a4df5141cf03332bf7192e96a -4c3b11586abcc5df7e395609ee7131be +312ed461e418e5e8b3e152dd2227bbae +3dfd632c14282d44c6d202e30378822c +a77857a410bf6a20d1bc65d57df426e3 45bc4e783f1c8f3b4cc8887ff320ac8a 02140c8aab60d378c25d218f29d4fd51 6a019476090e0d2e7e18ff0cb90d8244 @@ -8121,68 +8126,71 @@ 344d119920534915d078b0bcf8139e6c 537f4288b80ea71ac01cd85436796b2b 5a39128e50a6a619cab4a84ed21fb5b0 -6d59726d14209ced062616f6eabb9963 -65b5c3e29f240fad7628e628e4f4b988 -ef7b6fa3ddd58753aa2f9e99c606c61e +9bdc51515920cae4374eecfd6037275a +a2da3a94a599ef497665bb9273f94082 +a81beb34507c2da511e5cd5783f2d2b3 1fb6c4f678f781062defcb85377e1223 -c294d42b0c532a0d0ed0ecd75b2da20f -02b4f98405e26fe54399ae5cf3d8e884 -dc9564fc481ddd3101734b4e01c40027 +503179eef2a75e444e6ed540ab5816af +3a63b5ca883378d2e5b3ffc0bd8367ba 329a3456692fb25e9ddd96dba6698739 -5b5402436d2e5525c68fe96889c8628b -14b937be198fc9c37d706a131f110c68 +cf2e582534edc6a59ece7d22c939c00c +28f44c26afebd0f551578f04045c6496 +6230437ad4adfb173f89c5c9b1cd3301 +378e17fcf077672377ccbeef64dad311 da1eb7c39da28b862a798f37efa7ee43 -538ab10324a9a151d1944f94b590e3e2 +b2ee3e61485fdeb685fc7f73bf802b23 +7d6b8f45303f24ad769fb402b9416bb5 dd8e45a37c5ef0fc6089df59605c284e +db59948d8443a30f976ef562646c108e -001f89497d83b75fd374517b88d782ee +4e9739c5d4dd7d7150093400f77e392e c3e50ad0d4c93692a2810e136ada70d7 2cc2731ed536bf38737bfc2897163b4f -df410eccf21d001f9f5e65da30258122 +ff20e35d737a171fdebff3fffe219596 5d9b7ccd6766e9e943b206c4e288cea8 -244ce95591c641e140899ecf82e3a091 +6134c80e606fc3eeedd5bf6a39c3e77a 545b1414d82cdd476e8d6676161e3103 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 8cd10e297876e0c2d47a576dfcf61a2b 044e22c98deb3d6da5898931cee7224c 599619a98b0411989a763faf1c6ede75 -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec d255ea5b9df613deb7f8f85bc5c93241 -d195ddd5ec7ed1f150a7ee113edc1a6a +249a59e20ad0f29165045c375cf123ca fb330418c81c08843a8ecc7b41911c3e -2b2a2539bf08025ea2794371cb5d5edf +0a95085c8a3f3efcd5a63702b1bf537b 33f2afb3d4f651ff3a4856891f26faa3 d976f528676688719bb4ed9da722c798 -1ec6007e78b7fef3a0c46b285f5345f7 +f28c1d91837eecde379d863333ad3da7 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 5568084ceebffcae386fc1ec48e7ffa8 17da2830504929531702d918d538bece 681bb6760c742ae699ed900dca34241d d91a412e4582686aee55e22120f10420 -081ddaf3beab038b809eb6db2957285e +7b331d712e358d5793e19167ab42d4b9 05a11b19b5162789760c9838a936df75 -eead927af63207df007d30bbefa0bb40 -24076c897f856af4bf47d86d96078688 +74e5138e0485400d0958b5c137a8634e +ab80eb398c1cfa95b56a5b1dc2b7ce7d 5f93e31d32cd99d38e3d59c80b4137ff df979559da6c099664af3c61b83b9e14 -7ac550b131a480505f0160feb1984344 -22fe87d6626de9d7ef505f8997309e1a -4f231e473fa377b7f6cf6b3a778952ea +3b9488c55a6633217590c01acb9c0d8e +58ce4b88e87e271384435fc25c0f8144 +bb6a51f4eb6b3c8f00bfe1cdb89cd76a 5b4aa669a151dc30f4dba6f345177d91 92ac14a3dd5307e6bc4429f625ac3f5b 07692372f9f22331da5ca1cc604206c4 f5c74ffcbb82b66d295e84cb0c11b477 6448daf1b06217c7dc989bed6f3709a2 fb5913e34a812d5fdf9e25b8ca8c9fb2 -3868fe6746505c0449f7ab2550a54795 +5c421382d1ed9e5e1f86f3bea1f29cc9 c57c2471c7a6eddd29d27909cc422e41 -78faa2226aeb9f90e52c0f6239002838 -69cfd106af7ce7110c61b93f7f0a1968 +34c7fde492170f80fe8e0e6434f3eb0b +829a72b83190364f8f94374443eea9fa 8cc192424d2a8a3a8439cf6c9e9c866d 228b0316d26bdd36e56a9158eea64ef6 59b195fcff4d3877045fee21c364d524 @@ -8193,55 +8201,55 @@ 449de434949a3e2b8780a87e7b179d3c 3ecfa35141eae057f996daee3608c0c8 d7385726059a0035f5c91a2c1602f235 -98df0b16465e8526f1a34f0e24e1d25b +c04c20e9e0d8940e6a34a3de26975bfc f1f34d8c0f864daa5e8ab56801027430 -f8ae1145d1789cc4f49042e9c9b8c394 +d6c2e5a1d98c4af9f39c3e6f602f9f65 737685ba123e361bbd63da12001d1853 ead226130a7b08a13a2aeabf710b3b7b -7e44776be6e3c6d6cf1e14df5499c125 +2a441d2cb8444b1051bf199845319bfc 2e6a497a7e9cc16c543c8691b7505ce8 -3ff6460227ded412fd9384126ad371e8 +a39f58718f334dc2bae68db45ff92b87 19c4c6055000b1d4fe6f5735d4c344c2 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 840f7c27d3d7920e11ef771581c42ea1 255944687f37fefd684d3ec9d2fbb0d8 9e6b10b82ff6650b119aebde1eb1e0da -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec 045853f5d4a94bb75d809d8355dab2b6 -54d7a28c58f4312aec39202174880572 +0fcff1379b65914e20e00b24b81a5e6b fb330418c81c08843a8ecc7b41911c3e -bbfe995401a355c459f71be7d355d4af +e6737bc70917737b05e2b3cc3e87cee0 a8853724a7797b14ab7a125c5a64aa3d 30c6a2ac8f5dc2c78135a1d2d958c7d3 -0c8b5fa7e69e59bdf0a4dc3acffced55 +846d37ac463e033347b10ce9c69184e6 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 483de5a7392121b04ca4b28d9629bce0 9aa8f16badc4733edd5b5d1b099e7c21 a1314605a33f143e8730909f6688403c eb84b44b99e2dab255db18f924ed970b -9a2e494b0015d39ff38593c80af1b23f +f59114c9b51282592f8c26e304872d54 f1d4b49dc349f942ecce7845d2bb5562 -bbf6109af99a85f4492dd98a94a6f7b2 -5650c49c3370dd17bca99b655f184c76 +34e7dd73d29e8efc0d0a013026575768 +4d1cb0d2dde73ab7da101afb1eba3f55 d819c152ecb177c120f1e3c9eaabc2c6 cc6c17551a0b45c91fc5fc79f276258e -500aff15daa34730554493980806940b -1510fab77add6d9b505698b3d2f7abb4 -9cf350ea476110799c0f33a2281a19f4 +832cb306580ca6ce4e267ac8892c8732 +9ed685e1553ee8262bb9cf750db98968 +8a4585aaed5ab770db248832f2e1a7b5 802cd3b09bda10a75bbaf7f4597f9364 31e4db724dddc41b42b165ed8c66f3a5 e80b6464c4a540b59ab03e8b66369968 11851279ded53a68d299e1dd00c0b7dd c6aa5d300ad94789a9f2c4cabc6cd8de f5e9da89cf45e535117232b359317405 -19aa2f949963e51bfcbd51f21ad8838f +c07ed48d4b65bab104ce0c4dc1cde684 4b57bd5427c18abceb5c20abd89f5ba9 -5cb1e21306f9b67ae5817cf248ea2b80 -e39bff0a25907b8b65fc68ef96c7e160 +e70293904baa38c90c8be8ca5aa447b0 +06eebf61b89a60cd11340a036f47f3cd 1d7a55d13ebc889af056ef71120d26ec 119d9afb003f18c3adbfa0f2cad74211 b99f23c57218db693329dea5e53bdaca @@ -8252,55 +8260,55 @@ bd3718cc7fbf6dc1b46753b2a07892bf 9d370bdd2d27879fbffdf88d5b937e80 7d428fe710ba23ac644fbeae1e05174e -6201731125e1425b9680ece9fa2f53a7 +06ff7a812c4416c03336b3d0ff683da9 cdfa3838283c176556fd986e1d077a37 -eba82bd2e88b7d544b96c6d99e3a0fb0 +63dc3d49dac194089653e65425d6e5d5 c9310d0a5a4f7e1f6b85201c0dc2fc5e 6e04edde5694fc8e6bbb47aa579d974f -9d3c42abc625b3259d4e5371f06263dd +0ff8f5b9e25ca077b7d7d698b2e76e3e 97157f5de97d427dad060de635f0cbb2 -4d40e9d36ff84f7214a61043608504ce +b1dd4cd2ca514afb48faf71803fb072b 74a51ee9815a4e81828f00e102f2b977 0c1d539dd0e536ab43cab029104330a2 f4edcec9ef405af2798f27a4d7902e12 f70756497c931aadd89edbe485e88fb7 f5e8ae5dcbf8191e1830afe13c85f33d dc628590b54606da6a6d3510ea4c94d1 -86b10d96c3a969dbf3a625859ee245fe +1f81e0757051db526d536d732ef22e3a fb4f2e0c1a0a003c40b83cec58eb358d -2e93d30362c8d78a190c48a84ee14fcc +eba7f7e57d85ab19a005e825dd7779c0 236eb01d61d0a87dc150f17fdd070f65 -52bdee3176be9266973887c2b2862dba +df71b03d06e518df446ee6e9792dcf89 1402d10037a08d56070eee0ebf921e4d f8e9d0e2f7ca86f855a1fe6a39eab4d1 -09f6758e377ebd553ff2a713b1e14f90 +25d873287aec9a21451e9717306db54f 1461952a71c3b0dab73956e09db90725 7a75cd5ac5590263657b0fe81c2e9686 742a6fcd6d5322ea47f1f7c8ecf85bc3 1a7bfdc52688934752339f4d77e7e84e 4bfee5904f91bea7f89e69b65d84edef 41880d289bea521ebd8f24215e6d5f07 -10fe8c6fba8b8a39a3fe4015c16a2fc1 +577c8ffc2f6319016ce9d416e7929d50 aaaf43f06ec3b56fa2ce44165d8b2227 -ece08cb7ed6810cdb3f0c1c917ec986c -7942ec5d8cbd1ded094458fae7db8f64 +e775cffe814bc94a4328cd886366ffe2 +87c46b335353a6fc640ae4c902b7f278 7f1cf10b121b601826c8160b97d9201a 18c683d449cb983a0199f72f41bfa394 -eb93565549b324f373ccb8ae14a9e82c -f567192aeedd26a512a273c46a1b2e01 -4620d5383d98264739be856cdfad21fe +511bf9b42503b99cc5df0cb7b229a287 +610f3c4ba9b4ef8d830a46b8a1f93853 +1d62bb5c969457e698342f5f8c22d153 526eded1162a09941869ab46ef83ef71 bf1409395306f2b2924a67beac05dd56 7ec990a748195e943c1d78619a7be987 ecb08089d6cffff8cce5bc9928dbfda5 e0a2135bf8ba78d71c0162491021d9bb ae2a39ed84e9a8b31e97d34efd50bf79 -6e5d7e32d2d4c4c9bb5b54e9b974c2fa +46a53285a864300207f4759f5a35b928 95562f393025b7c7156e666cb8b45bc6 -7da38e511cb16a90594a443f9575c810 -67a5de359f633e9e24a8ef12bd1fc575 +f722bd816e9904cf0c1a20c807b43493 +81e4b3dc3d76e5272b16447d10ae43a8 2ba914ba1f287a51e96117c8734d0370 98035fec612b1dea0f11fa299377d2bd cc44d8f6611ef62af800332274ddf91d @@ -8311,59 +8319,59 @@ 1bb02f5007b998c89755a783129afce8 d7db058dfc7cd6d999d30e337b78fb5c df5f2db52f342e27dde87f01bcbd8e7e -cb066077c3f9a76a2d5bca265971d2dd +df44b34058c4cbb5c49a9493dd42014c 98e1082970a865bf1264472c0367b2ea 83d58d7245d7473a79ece8004d881b7c -11daeb226361692832cbfc06ea1f4c52 +617b7a71655bef18290227c4bf1bcf31 c4000c3a5f961950001bdbf0eada3ea1 7d36ebf391461a17289c2b5be7cf3e85 -3334f3288a65d910ed596c68a2043d00 +1d2b135a0149df6a6cb2e76713216b4b dc5d5cdb1ddb2cabc4a153dc8153de91 -f3146c00e2d0b6667d17c5eebc31360f +6202f865512c891966572c07fed1bb3b f42193f1b045aa8b255d4c544bbfbffb 577770bc1b047e531d1c8915b91c1b3a f2a97948d26385dbf048ef0cf2c525d7 b46d5511e9d6998ff9c889cb8c0da1e8 0206639eae0df85877c2e2bcf3a6f449 5e31f5e7cbecac3ea5023184356defd2 -a4f7de71fffb7fe66bbe1ead04e43890 +d71799a2249c450279ae7a1ac3d0f805 f8a9ee9349754eca7dd8fa4a3b30923c 208960ca78917b6337d736cd20344a7f -590a8bd1778eddcb5c069279b124e929 +132a5130a93dc5d9c2427643a6a77f9f e7c013349082da3d9d5648c430c5fa17 -703ed24e2722902f0bce8d3a3f7a59dd +378829f3a958e6a275729ee6bfe3884e 403bc95d966adfd004f72ad0b8d859ad 426904859bbfa17b03832bb45bb04199 -1625f57e5654ad47f05fd7eccd6fb90b +f366f1450962fc633c712a57bcffe300 c5c8e08bddcd4b099e4421c7b876d3ca 2bad6855dcaaf4b18c3c92f32d94893f 81bfbfd57357a74c3f3af6987afe6f12 6df89d2d8ac7b9a5f06251fa71023e8e d2eecb1e8e4fb988dda81bbeb97746c2 6986b606c49e4c713e68f9e22eea0545 -7d3d3e6035c01723f19d42755a382e96 +c92a97950deec22447c477d27006cb2f 0cd221c2bb64eec3f3b8ba5efd62ea57 -dba59ec36d373ca112d6392ad83b0006 -dd488606462dc194ebe947c4dcc2dade +bc2b11200433ed6ba13c2b7b6adae99d +95b9193442f1d15db4c8183833ca0b14 e9ad12e8ccc33746292e9e23f1b8f140 cba7b7e8e5181e09cfcc945401729cb6 -2ba0518b06449c1440e2b4e99f206b4a -4887a6d3247ae186478768439e194ef4 -bd2a0c503f02d6245394150b274f4d3e +d0c65ac03d5b84bf70da4651a599d923 +a89a9c412846d94b22ded4a4b1214e1a +84ce4e1c0ec963dde4e4763f0a1aac85 5b5244f55e8874f9677d30a8decd9347 2a5e5c20e225efad5f6b841ad0847617 260a28780209a054543aeee4e3431afd ca1db9bd5d22039d6b84051acb6a1d96 02117a18e23e6d3fa6af33209fb0e6b4 491fa67114d3c382ca11c8beda1d2481 -5ed950ce4cceab6d20489e7ac57531bf +b8c1b21a0a71c89c4ad86f0caad6bf5c fda71a80dc11279fb51ad436388c1256 -94faf36ca44e55f0562c06b20b801c9f -425ba45315eed3b973749855951b51d3 +b2e188e8065680615a750004643b9886 +d4f2c2105d4c3202307ff7271e0126c7 f0b4dcb4ff338aae365219b7c90568c9 0495a2ce04fae425dc6a1d880ceb1dbe f7261490003c49efcba34cb82f632fa8 @@ -8374,55 +8382,55 @@ b3b43d5b59898b53c3438acc767d5fb3 8fe26f5460eea59779e88aca24436dbc 6f17157fa2d3d23e0552c7ef33efd818 -214b4bf175d9a576e99aa32a33ab3ae8 +364c9b4bc0b3ffbbed25ffed1975bcad 381fda47b3c28be5e86909a54ecf6f72 -001f89497d83b75fd374517b88d782ee +4e9739c5d4dd7d7150093400f77e392e 9e04b2cd1b93f421705034d5206749d8 2cc2731ed536bf38737bfc2897163b4f -e6bf5a738bcaa7c7bcca6d4aa9dedb97 +e9d9615574990c4896b9dfe4feab490a 5d9b7ccd6766e9e943b206c4e288cea8 -03ef6810bffa7841d4a99f232564f8b1 +7402b6940e9c0b9451d1961728a1377d 545b1414d82cdd476e8d6676161e3103 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 8cd10e297876e0c2d47a576dfcf61a2b 044e22c98deb3d6da5898931cee7224c 599619a98b0411989a763faf1c6ede75 -544d1e567d9c598375d0b2d08cf632a1 +3aff154bc0917d13e720e626aef6d884 d255ea5b9df613deb7f8f85bc5c93241 -d195ddd5ec7ed1f150a7ee113edc1a6a +249a59e20ad0f29165045c375cf123ca fb330418c81c08843a8ecc7b41911c3e -2b2a2539bf08025ea2794371cb5d5edf +0a95085c8a3f3efcd5a63702b1bf537b a4689ed797b5bb6aa0712da0992c463e 87204bb4bc4b2de9530578fce343498a -1ec6007e78b7fef3a0c46b285f5345f7 +f28c1d91837eecde379d863333ad3da7 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 5568084ceebffcae386fc1ec48e7ffa8 17da2830504929531702d918d538bece a42be7db361dd5993f28868e4a3f358f d91a412e4582686aee55e22120f10420 -a63bd5dd26ac98782168488c85a94aa0 +4cb220fe081dc71e7a79155fb4baf1f9 05a11b19b5162789760c9838a936df75 -7b66369f2447bf5361d9460cd162a092 -24076c897f856af4bf47d86d96078688 +53f30292c85bf4e6ec62ba51a1411794 +ab80eb398c1cfa95b56a5b1dc2b7ce7d 5f93e31d32cd99d38e3d59c80b4137ff 453b10bf9feae2447a1e1a28d2d6ed05 -7ac550b131a480505f0160feb1984344 -22fe87d6626de9d7ef505f8997309e1a -4f231e473fa377b7f6cf6b3a778952ea +3b9488c55a6633217590c01acb9c0d8e +58ce4b88e87e271384435fc25c0f8144 +bb6a51f4eb6b3c8f00bfe1cdb89cd76a 5b4aa669a151dc30f4dba6f345177d91 1ca4e724a542dd90368a4612a878aa7a 07692372f9f22331da5ca1cc604206c4 f5c74ffcbb82b66d295e84cb0c11b477 68633b9a396403744b2f3e762bbf5a19 f326d01ea1f9cb89d96aafdbf65dfcf7 -3868fe6746505c0449f7ab2550a54795 +5c421382d1ed9e5e1f86f3bea1f29cc9 c57c2471c7a6eddd29d27909cc422e41 -439b41e3fa181ac18f501a9f331fca6a -de65eb4e97ed530f9a08d0322b8de7cc +3e338d94a6d5b803d52b5c431597e35a +bc244d4f47eb26a3a24f2e61ed6fe324 3e3baa2a47af2ba7525ad71522d6ed85 3122c8015a2583d254fbdead8e4fde52 464e3cd1b9ccd7bb22bfdffb69ecf33b @@ -8433,16 +8441,16 @@ 678a224c72ab87f381b25228890f9eb6 9cc0a9a23709b0640fdc94021a6b953b d7385726059a0035f5c91a2c1602f235 -98df0b16465e8526f1a34f0e24e1d25b +c04c20e9e0d8940e6a34a3de26975bfc f1f34d8c0f864daa5e8ab56801027430 -e422e39f79913300450eb2b1a534c0bf +3ef9403b403f368448802a108a9faa69 c3e50ad0d4c93692a2810e136ada70d7 62922eb1ad1501e02b86da4f0c8f1126 -54dd8fefcc17f9df92c5685090720478 +f9002a564c0dd7ff3ed4f7974a32c568 a395d5fa15b0fd8a40e70a9a71e1df04 -51de93aa4306f467a0089db4d2ffe5e6 +686db095e45737b7253cc56f3ae90a99 e272b24123a940834eb7384c732c3c51 e696620abb33dd46cbcc1d87e8f0abca 7db2f1cdec58e462f71191b33e61c71c @@ -8462,16 +8470,16 @@ 5568084ceebffcae386fc1ec48e7ffa8 01d7079eb9464d34ebc58d2987977733 681bb6760c742ae699ed900dca34241d -28ef3589fb3b052ea0c95358a09f5198 -081ddaf3beab038b809eb6db2957285e -4bef9d9f98b859f810c3c295e4494498 +e91158781f161b3767242ebd45da0518 +fb08e158e49baf04efa53b9e931b2710 +149cd6bc5dea21091638b42ec3340592 eead927af63207df007d30bbefa0bb40 d7ce2327d263736100f77cd6eb4cb24b 75fb4c310c4f0554d3ac9859d0c5b646 3314a3c5291bc6ae803c15e9bbf5198b -7ac550b131a480505f0160feb1984344 -dd92cd5ed8097a6e9c9695e90cc9f360 -22ef825d97a6b50b40818f5ec3d9bd38 +20e258227a894b386eede1b35678519f +fda688eba93b22d6968c70f168bf6726 +27b1a2f505b85bddf00c3be9a1f82edc e32ccf9a79a12abea200e2a94c2a95d3 6f3b6f771da549d8e22263e795ddecaf 824683c2bba8c209bd757096e7b7e21a @@ -8496,51 +8504,51 @@ 924c656e4301df08646901c0ff6971ed -001f89497d83b75fd374517b88d782ee +4e9739c5d4dd7d7150093400f77e392e c3e50ad0d4c93692a2810e136ada70d7 2cc2731ed536bf38737bfc2897163b4f -df410eccf21d001f9f5e65da30258122 +ff20e35d737a171fdebff3fffe219596 5d9b7ccd6766e9e943b206c4e288cea8 -244ce95591c641e140899ecf82e3a091 +6134c80e606fc3eeedd5bf6a39c3e77a 545b1414d82cdd476e8d6676161e3103 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 8cd10e297876e0c2d47a576dfcf61a2b 044e22c98deb3d6da5898931cee7224c 599619a98b0411989a763faf1c6ede75 -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec d255ea5b9df613deb7f8f85bc5c93241 -d195ddd5ec7ed1f150a7ee113edc1a6a +249a59e20ad0f29165045c375cf123ca fb330418c81c08843a8ecc7b41911c3e -2b2a2539bf08025ea2794371cb5d5edf +0a95085c8a3f3efcd5a63702b1bf537b 33f2afb3d4f651ff3a4856891f26faa3 d976f528676688719bb4ed9da722c798 -1ec6007e78b7fef3a0c46b285f5345f7 +f28c1d91837eecde379d863333ad3da7 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 5568084ceebffcae386fc1ec48e7ffa8 17da2830504929531702d918d538bece 681bb6760c742ae699ed900dca34241d d91a412e4582686aee55e22120f10420 -081ddaf3beab038b809eb6db2957285e +7b331d712e358d5793e19167ab42d4b9 05a11b19b5162789760c9838a936df75 -eead927af63207df007d30bbefa0bb40 -24076c897f856af4bf47d86d96078688 +74e5138e0485400d0958b5c137a8634e +ab80eb398c1cfa95b56a5b1dc2b7ce7d 5f93e31d32cd99d38e3d59c80b4137ff df979559da6c099664af3c61b83b9e14 -7ac550b131a480505f0160feb1984344 -22fe87d6626de9d7ef505f8997309e1a -4f231e473fa377b7f6cf6b3a778952ea +3b9488c55a6633217590c01acb9c0d8e +58ce4b88e87e271384435fc25c0f8144 +bb6a51f4eb6b3c8f00bfe1cdb89cd76a 5b4aa669a151dc30f4dba6f345177d91 92ac14a3dd5307e6bc4429f625ac3f5b 07692372f9f22331da5ca1cc604206c4 f5c74ffcbb82b66d295e84cb0c11b477 4e186ea8084c33de3fec3182f57150ec fb5913e34a812d5fdf9e25b8ca8c9fb2 -3868fe6746505c0449f7ab2550a54795 +5c421382d1ed9e5e1f86f3bea1f29cc9 c57c2471c7a6eddd29d27909cc422e41 -5539cd1403e4efd60edd5498b95e5144 -58c41f60235ea1a5fb3991bc4fa6a24b +a918453d2232f6042139a51f4be59995 +bdb86969718f38f7c3ec9d78b8708f02 8cc192424d2a8a3a8439cf6c9e9c866d 228b0316d26bdd36e56a9158eea64ef6 c95d9dd5cdb6d9a6824a6bdbefb48531 @@ -8551,56 +8559,56 @@ 449de434949a3e2b8780a87e7b179d3c 3ecfa35141eae057f996daee3608c0c8 d7385726059a0035f5c91a2c1602f235 -98df0b16465e8526f1a34f0e24e1d25b +c04c20e9e0d8940e6a34a3de26975bfc f1f34d8c0f864daa5e8ab56801027430 -75f7a995a409dd82cda1129e31244bea +3fc8f6eea78a72252d5beaa95980b119 a8c0d300734b6d141fea36463cafb665 ac0b80589a46c746d461c26c203976ed -035e6eb42c043ba5af6accc410b52b11 +46574f10a368b3bc5dd28bd954e438f0 301653ecefd6bf66f64c9d1295320592 -199a9c93ab681670df77a92e8a152891 +ea428c8c8795d443e495cc24c1d4564e bfefaecf0b2d4c3cbca546a629f13a3d 07bbf1314ee53209e4d8cf452881caca a844ce312e01fb23c7007783d7e8444e 06b09b671e4f3c2c4f6d6543f6d01e36 6860a3f3b0469b68220888089b64141b fd3a3c865fdf8572f4afcb889760a65d -39015974e9a1c6c4589591ae58a154d7 +4095b242985be141d15d3dee76e155b4 817e3122945ecefbc4ce8abe613858b3 e17c63b9d34d92e8079dd835dcfd50e4 -6c361dd356bd383d023ca8031b4ad2f8 -31898c1fe7ada24be26bd7142e373e49 -768b38f2f8ced6fe7878d67e8effb5f3 -27e34fde56947d8ccacb40d95d6d5c74 +a8d8861b0947a0c3b0e4b783a8c91878 +ba4e18112a68a41da78cd63499f03a27 +98ee8520e083cd3278a60b8210d5856c +85c2fec90c3e685ac938f0abedcd5af0 0d0f009398a7487d59b485e07c6fbc73 -e70aa14d470aef28733b11c4aba13fa1 +45c213d6037f4cafb6f20e00e41dde29 e5f10f65ec52fdd1433f2a477b70e5ad a5affc357e84c82d0cb507e7d977faad 6b6af95ceda28abd4dc15b6ca31163d8 856330df4d912ce65a7471b677c00e1b 86c9af02e6afad6b682cab386e7ea8c9 3edb04f22096528f3007755fdb835f19 -7ebb4c84508fc27b412111a824347556 +7bbc958481dc3893f3cf8773d423a431 64944593ac8346ad7b11d39a2271b7a4 -4c9a10303debb2b3c8bc16ac22e3eeb8 -fb9d20ab22467a99935a21ff18a27835 +e9d05511b26b0ef2129febfed311fd82 +28f76487cf245a01c1aef56ed36952b9 0fc0876df57f7f77cc4ea959f60cde11 87d2058dc22f63411ce8ac827f7448c1 -2b788321ab02b92fae511a41d908ee2a -11e3cb037686b2cd0b7df9c481590312 -9ac152e843481d327aec088d002a5cb3 +0a23c46c92cd5ce1e5d14d1024f23c23 +b55b4d1269910ed9d04300d6bd1177d5 +18de668a964f71520a4c13247f012fd6 694ca7bee57efa02867473a6d8a2facd 686ec6633c3b45fa9982eb392deabb4e 71355302efbca5596c245b4f75b1a24a -ea27c50d59f4b4a016cab14c783ebfe3 +40d150eef5fa77907360c362ed0f51a1 49bb3d81ae611eb1f8b7868143b2c6e0 32e21134466b972be3ac1268599f9b5a -a744bce00ed9a1dcb9d55eaff5434e7f +e95c5f8ecb76148b002032075db39a4d dbc7149f4d61e7d862146daa4f28d9c6 -7de1eea10fcca31f68d2925ca4c266c1 -c930ceecc0a71f664c0953bb03824138 +a2f38be9f4d829be2f19131667e6acef +c8b51b30dbf56b8f6db92072e172189c 9cd23f8d97fddad9f3408b5d5152cdcf 578c7ef90ce4f50122f14d6630079c47 db18fa6d13acfd83d28575f83a3f395c @@ -8609,57 +8617,57 @@ f4b0c998c31f5889f65deebd633f7fe4 33f56a87ec96204fe40ffbc69fc9aafe c6f42df909428c4ac4a2a5a0d1020d2a -4aa8fd6ec900cc3a9dea82f633273d67 -9b8daa5ee37a6c06c852d668290f1fcd -a9fd12754a461c731ccaf3bb49125bc7 +fda8fcbfef4dc90fd00742cc546048e5 +14fefc7629e7e8b1aa195c290306cbea +b88bcae402852cf0a1ade81c22d70ddb ccd8e25db8a9a768172fcd2e45b95162 -6cd8fb971c3d34ecb6cda3077c0ec82f +2a83de4de86c7c4cddd5490d96adbe0f 223494e86e72306be4f941b847db565a dfa97a9faf2ba1a451e553c77076d2a3 -aa2358d42179cadddd15d8352db5f65f +e7321cb16b9e21054e745a347a57efc0 5d9b7ccd6766e9e943b206c4e288cea8 -f1da541989d72a37bc503fa1ecde4e6b +a05de2beef80af2512e8f3c61f25dcc9 d4b33c76f50f3d94ad1af21601d68e7e 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 b23a1732f01a5c23da70dc85205c1bea 044e22c98deb3d6da5898931cee7224c c09f84e25a1c8970c5572077805ac0fc -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec e8510da20738abbfa73214de54c93984 -2d785842413a38762fc194334e3633a3 +e572268f81dfafbf40cc085b745e52e6 fb330418c81c08843a8ecc7b41911c3e -ba1e5153fcf6e96df24487f8e7a3ff83 +549b51a8af5c6eabe8b7fdb9f981da00 36fe95f9d0f092d61a637e11e3c32a27 c0c0cda5b564e56624844d49d7592502 -05f1523ccec48c3ce24b630b960b3a42 +a1c9e5d5a5cc8920f578a1817aa181b0 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 e652cc0024d38444e191c28a95943594 17da2830504929531702d918d538bece 3d8ba71a2cf2af3c2a9e9bda1cba64e4 b1d534a15eb4b0b99bda0de853ae40d6 -be2a6591d6bfee711de3d3df5e202388 +81ac81600fa899832975179408bd4ce2 05a11b19b5162789760c9838a936df75 -2fbda69e2a3f012225508714b51c0f89 -24076c897f856af4bf47d86d96078688 +bd3a753cb12c1a7c828fecc73e5b052b +ab80eb398c1cfa95b56a5b1dc2b7ce7d 5f93e31d32cd99d38e3d59c80b4137ff 5826378cfccf1f9dc0798b3357870fa9 -fe515bd6d1f29593b84f3d34109f039f -22fe87d6626de9d7ef505f8997309e1a -030dd07e74db277689a78529dc1186eb +e50f64efdbb21cc02ec473069dd5d5c3 +58ce4b88e87e271384435fc25c0f8144 +3450069da49e2b34436578915d3812eb 254a30763f15f9f555e82ccc4accdbac 1ca4e724a542dd90368a4612a878aa7a a5e8c5e7b6e275f6fc080d12bc66afb7 cbd8a157fa609eec0ae1d041083cbd38 262b3b0bc7533232290f81311955da86 f326d01ea1f9cb89d96aafdbf65dfcf7 -3868fe6746505c0449f7ab2550a54795 +5c421382d1ed9e5e1f86f3bea1f29cc9 49f5a91ffbc90b04607fbca87a866532 -de489808a43df892e70928d6c8c1af3b -587159bbf4f62528945f90269c3a7f53 +c149e810ccf8f48a95c04a544050cab8 +126ca4a6ad5a178e0a091196ba5b7a37 71976afc3ec5e0f9c2e3711d8261e0b4 5dc4c70ab6811882ea50d20e2c4ea6e5 f9f034777e38a444b4bde55bc7e37b1f @@ -8670,7 +8678,7 @@ 449de434949a3e2b8780a87e7b179d3c 3a1f51816608cc8b2c9ae16fb92b4ec1 16504bda24ef73dfed5a0ca25a2649e0 -57e911f6a4818352cbc9b14842fa6afc +6f3a1ed7c63d57511c1dde760e76e320 efb80873052a0acac270873400da3e43 @@ -8678,51 +8686,51 @@ cf387e494e1e47b7da074828e0994d78 -00d770ac36c1ad6b43a34d0f90f45a11 +79e35bad8654e5df8c4e9546da9fb559 ab07c46fbd99585cf69935bef969c5d5 0dd290bbca23f1341e63156248ae06a8 -5d79a6c5b00b1b46d1f52b4b43a829f6 +25485ee150a22e1a49407c26c037da7e 198b3a29bd95db8f58b32d7db4bff003 -0e42cb9139c1cecb18bf40882da184e2 +38b9cfeddef49251a216d410d7fa855a 58c19042214fce0286d38a8553680674 5f9bc55c61786609f6d57cc987d8f688 f2a97948d26385dbf048ef0cf2c525d7 ab89fbf62d7046c7327249be47ccefeb 4eb5ad81317fab87396acc720d75138d d01407b81e6e2b6828c77cc12e908df7 -e1161971bb06488cabe9066c8e827741 +11d893fe91006d73a3558095fea02ea2 20b3e0e6e75fd590b98bb3cb3773ea01 -e37b2888a049752461749305cba2261f +c10315e367f8b9a00c84683b55e7b18f 34ef2a5c01a6de0d058eb647a73cda4f -66d599a5d64fdd125525f0ba69459838 +9a9b37f72b28548b6785b6b1b9baf57d 7df456c127e3cb8ae8ae1a74f56c9c16 593a0056ee80a54a01c01c0c266034d4 -c0aa0c1b0a8218a9bec70fd09f811600 +b0b74e46aa192d770330430bbcfe1879 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 c055194f1ab2455af2250ede540f75b3 df87ce706058e3da66cfb2d15979958b 8ed0c3b65f002cc1c9ee534820e5f961 40e0c792b4859dc438412503a3cd5a5a -7d8d7ea2cd51941b244855a8c9dcc5fd +c954418bd592b9882830e1befcde1281 2b8391c74ac95a9c89c539f0e332ad49 -b62ebea33a09fdfd3cd7eee4ced9187a -db17b7dddbc7f8f6c0c0906c8b8bc62b +5df5b3e78e06355290ce7d76b900f925 +f4d054deaa28f3e99a6d0914aab68185 311ad06ab23f03ff3440597edf1da3fc 0edeb4fdfd326d018af56a8424a10428 -8fe0462446378e7cfbc4814a66437619 -48a90a6ecd1210a0f60e8efa08299fd7 -120c2c37e7d3db4cd41824139478567e +a2917a00203975ddeba877800e723ea1 +5a28672d7b6bd9aca2b7a79b616369bf +ef1f2c378f4f4b96dbd7a370d52d495c f074e9bd2d03d456bfb5c45d912515f9 15558c69fd903afd9e88439226123622 768f3e2b92cc551d7136bbf830e93951 1085ef3d0869bfe5d3d113ad6d651da1 6312dc067c98595bb72d77dfcc9344b4 95c15ca3dd5f1f6760ef60df52b6dac5 -1538105a599084c46759fc0103f3fc3c +81026f55013298b6e61a890c55ce2fa5 d360b1161b553a45255a5806f55382eb -8b75cf8f0252a48aa1c4d2af802b17f3 -575d2dc8514dac008055d79898b96b7f +4b01e02157fd54947a64cffdba8d2d18 +44648ef9b872cfcba9ce4649b09a274f 2c7e63fd6233af8fabc598cea968cd6b 16e0a85f28a66c9fe5ef46a42e9775cb 536398fa35f4c75fa3c3d65c98c37939 @@ -8733,55 +8741,55 @@ 312c298b22e1902df441bf41c0598c88 bf2fa0709a1afa93c391eef32d37f171 a9761ba2043c4b97757891489f325dd4 -344df4d83ea29eb8f3295b17040f6017 +faf406bb0e3127ee1e9f424a9db81d48 db1b7476ea8ce223faa772b7f66621b8 -a28caa2416a41f9b818505186c025c07 +e29675921ca8b0602917a823d5028e29 afaf8c79e4a90aa57382f99ed2d40f1c 67ea5ed5ea373574dce57608e11f429d -236896e291993cb701f29f4dfc562172 +63fb124d0f5976ec609fece7f3ad23ad cb363e312cfa50f3d9536bdaf33441bf -3ca9d098eb608fa5c3069b11f475d881 +018d30f9195ff56d94346d8d21780af2 e5e7ed101e5fbf690c1f58d77b666720 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 66dbdb37fcb836537092935a31655cdd b1d0a182408ca65a6bba2eccf83f05f0 16737b3e033c599ba1de2b1653ff5591 -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec 0ff5cad40b13007a6e4dd81f9bd72dbd -9e50d916c35aa824279f0ca09ad90973 +006597a6e9af4637e424f47a28a7b247 fb330418c81c08843a8ecc7b41911c3e -73e794ac80f6aecd1298a31d38d54de1 +ccc22346e54d37117a732ab094d41986 1116f9450413c4fe11aecad38e8ed25f 7e2ccffaf9bf9dffea7c800c687a3a6c -97338416f7ad4bbdc93a194b4a1ca013 +bf512a71c20efd497ab01bd83f07737f 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 2104a3716b6074c739b153108c99c597 9dde1229f064c66f6497f31dde78906a 6373b95c48af4f71972938535912fc8a 367f6bfe53285d7880def87ab63b790a -756ba0b32450071ed8336d6d31794f2e +31f32d0cb237acccded5584aaa05225a a05af8369cf1eca3ea4b3b0cafa3ffed -1a5e128366cf4e045d2679f34f956be9 -4481308c948517420735347eeb7cfdf6 +020f5f3eae4387d4dc019eccd30a2d1b +85d5865b208ca3ce1c68e597d6834f92 69a140a13b73949262053829615d06ef 02289e9b37a7aecba5c0fa022f167487 -6dc685615964d68b3ccb2f7d08058566 -05d052d88d6627ae08917327de247894 -ff2a1e1463a2e8f10288639a2f0e3175 +fda33aa5946bbd06f06d3889c81f135b +e32a6738b9127c8a9c976478fcda233e +ed2cdba45964552b59ebf9bdb1b566e8 121f5d278e77c82d476ddbcaab81a331 d35a21763c1765d888ce5e9f7192d161 b1ae2db4e6abd7b1b88a48e222cf37a5 a04d9cb8e3a3b5e923c349a2dfed9290 2af14f6c4b858b8816b24c596aaa0888 f326d01ea1f9cb89d96aafdbf65dfcf7 -df7d0a03fd8a798030dc7f885b36844d +0003fa5cfecb0311b7f260d15b8c55a0 f07e3aa557243cfef5ef06bdd8dba07d -062c661a13250ac4e5739505ebdb45b6 -5dc5b1df3c26f08416f27b894b89b548 +b9499528fcf9dc3b194032dabb39dfce +6a44563847fd7fd414a91594576d6ff3 d9f11c2cc6a7b5929a915d7a998e925a ef8d5f107a66b6aacb79a8a4f5d01757 9db68f434b6113836433bb3a671e71d0 @@ -8792,57 +8800,57 @@ 449de434949a3e2b8780a87e7b179d3c 5f0890bbb168309b359831a191a3e8cd ea7921a38541879d8044e9729c9e87d8 -98df0b16465e8526f1a34f0e24e1d25b +c04c20e9e0d8940e6a34a3de26975bfc f249c5416780b6370b92514232af8da7 -0a86e4d4cf2f78188088bbcd94636dc5 +27d3cdf8f704d01d0b46f8579d39b967 96d264ca8820d06e79142a24331876a2 236388ae2d5c562bd3b7123817527f73 -7e60ab0c29e2988abb2c38706a25d810 +2a7d1b0f704d29951c30ea866c85c530 0d26a4183a05beee36f73348e05ac1a9 -b72976e76e3b5b1e06e3bdfe32f21bbf +74f2da3d9db3fd92bcf151c99c38c332 7372240ddcfd567371833e17c55cf3bb 5fd0cdbdc0238bc2f9c0fde2e1cec05c 45ffe99a918a7bbc4a6042bd1f7ded89 edcd6f0e266ebd3f8889d44444b1f874 6ffdee3464337d9022910038309669df 2213ae80db2f9c6a475e1209d31ed2f7 -699b645ecaba7ee82e5a2b9c8e04d599 +0ae23305ea3cfd8406dc0c57deece00c 817ce0b47f0dba9656d1ad1583596161 -360250f28958a294923f493023127c1f +39cf133dcfab23f3646c1de536a6c44a 5ed5c5747e7602e1b128fc541e0a2ffb -13885e7bd616e8210d416328c572935c +6d3c96840e498d14d87f582c06075e37 507560124bb9af9903a36e155fba3c96 94bb9cad9889690d55670af89e832ee8 -1bbbd210a5b9232c6e58fee38086c5f8 +5c83c1f4cfc547129cf52ea69fe2a19a 4c7673b351fab33e0a33fa2910faf0d6 c36fa900ef2e082506bccd1fa51eed31 e93c689a6bd1cf8e7670e4aec826d763 d19ff90add77cc081a9daf23f5b604fe 3080ff9fdb247eaf98b234710abdc34b 87a5230bbfe882e0fbafacdd6fdcc67e -e55061d5b57b555a836c9943bf8a0ce7 +9adc818af1aae210b0d7d81c03a676ee 41f6a7ee8a9f798c0af92c1ca1dcf5bd -8b1f59559c969a8b8733993c72569c3f -df8be38ee0615e261ce232877c0a80a1 +1baebe20cdfdc3217fe9a2ca774cadde +57976b7ef9e27bc6d12064dafff2eea1 64d4f3497d67b4e8da246b865501955a b66283810f815e888bc6f5ae1b52a6ac -9ec513148be43126359a4b2929a63e43 -ca0d391cb42af1a44e3583eda0d35444 -b3236f8c827a0eb88cee1c906b5bedea +d35b6c40bdb2346fff2069c5616acd9a +f4f6df6dba47bcf07161c5eab2fda0e4 +c3777bb05106623a66ab54852c8dc6d2 77d571e5b03acdb7a2029a4f9218a323 a40157ef24e9a8c6ddfd3885dc186a96 056998dce70220b02ec8ed7855ac8b8f 50d7642780c847932b5928f5ddc419bd 3533fdfc61408e851bdb68653ea870f0 cf24f0f04a6026a4d06cdaa7617586ac -fa070151663aee0383a3c518d6a628d4 +78ac49e887ee1d6d5dd1840b6a81a3b0 2f46b0cf8ce598febf0c2f66eff0b230 -be743d008c1c7503dc8fe449ef70d31a -63bd42d2a260631f2b4eb7e32bff21bf +b7e633ee1c659326e118ecc31f6dc763 +4168e4479deb6e95d53ffbced50238f3 53794030a3a02da1d3ebd2b15b95af35 -8f8b08ea0127e8dd80c06c9e79896a61 +8c97316eb2f2f1cecc299b68969243fb 6f3ad06950f1c62f4bd86e51a7ddae95 96efcb427a067568896a54d9cba6a836 2d1ed344ed1f795dc8ca3acc51cfeaa8 @@ -8851,64 +8859,59 @@ 4c1471fc81697146f2072c4c55b16a9c 24ec07bccd0232ebebd94716dd6abaf9 7f96e18c0ac56314a33e35de090c5045 -cbc1e4a4d481e1d180266b8a84c3df6d +6eb12d57ce64ecf36d5a78932208d1bb cbfc8102d5d4b206ce17095f41a08013 -c294d42b0c532a0d0ed0ecd75b2da20f -322d2f0d1f63bdac9a7179e8f597321b -dc9564fc481ddd3101734b4e01c40027 -5b5402436d2e5525c68fe96889c8628b -2ec28d7d8a03797203f724f8e5cdd8d3 -14b937be198fc9c37d706a131f110c68 -538ab10324a9a151d1944f94b590e3e2 +a287d462bc71f579eea372c586ca1e65 +9f5ba8d00d619d312d40c07f38b35c6e -0b184c77fe31ae048a9527291610ab4c +e0758c864058df5f23cc35ab0df1d31d 055d1c1ecd19be7fe0fc879d5b9e3920 2cc2731ed536bf38737bfc2897163b4f -9bf96050ded29c68658a0bdaf7fdb3e5 +1dc894ddc8e2fa310a70a3bccf815df8 10bfcf3c45c4b93043b846371d2de319 -3d2a1d008de0e21b9505ce8b6342162d +2dbd45b0367937f1ef79d8cd02d8eb4d 4ed0fa2252887fdaad281c4fdd581138 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 5f236327d99c1d860357c98d6123b40c 8105015382c2477cc7e91f83ef6c4e61 5d687f7e28621e97af2a7b1290efc658 -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec dc396506b334ea8af343c8c8161be20a -103ccf0be8fe475c66984161813980d7 +0fd2a60ce0edd282a64cae89f30106cc fb330418c81c08843a8ecc7b41911c3e -13420baa6e004ffb9bb8851bdec6573b +7f5889f7023d1c96adf6c6917fa4c7c3 4362e150d6fd5db1d2ec3bf6033cf31a f6a494807c8bd81146bf7308b9e74507 -cdb4a3999101c8a97f346af5b2c871a3 +e8b8a56f3c8046b724afa033496599c6 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 5568084ceebffcae386fc1ec48e7ffa8 17da2830504929531702d918d538bece a42be7db361dd5993f28868e4a3f358f 4377ad93f7965f894e7d49f0972a144f -672666d2be832522a2d1da2808663ecc +b26249640072d8246a812bc6d7a4903e 05a11b19b5162789760c9838a936df75 -7bc61a1f1daf334bc893dd1f0b05ca37 -e4e2a6f4a944f694c2930314578cfc73 +74e5138e0485400d0958b5c137a8634e +c2b2f7000a5d742699adbc6be9b8011a 5f93e31d32cd99d38e3d59c80b4137ff 28e10eab33216fe841a693440d577e21 -b34ee3fcd8a6978cd33ce47539e8e5a1 -22fe87d6626de9d7ef505f8997309e1a -261f809c9e46da5c59f0e5c3d66da997 +3892d45ad15c38243a4c8c570f3db7e0 +58ce4b88e87e271384435fc25c0f8144 +d929cf33013487510df075f5cd5ed46c 8cfda215fb90242c0bee3c08f424d05e 1ca4e724a542dd90368a4612a878aa7a e92ab1ec80639a8bcba78163e7f632aa 125545332e86e9da0c16e857d488f35f 68633b9a396403744b2f3e762bbf5a19 f326d01ea1f9cb89d96aafdbf65dfcf7 -3ef47d126feed7366cb5ca7fcee9fca8 +16e708648f259125b73168462459fdf3 c57c2471c7a6eddd29d27909cc422e41 -19de93c653769b4abc72bec70750ddbf -b35268616dd215650f008578de78244a +1305dad2e2014d290bc66c328ff0a8e1 +2f35f2744e4e6626a2390abb5effedc2 2b7b7694e9c574c9017760d04b71d385 336e659b54ee694568f9e17c14ba4a44 6f225dc643f02ed2509b857ca08a1695 @@ -8919,55 +8922,55 @@ 449de434949a3e2b8780a87e7b179d3c b4a7bf2dc4b9d17e3bf96711789653f1 cd854c5b10b4fbfc95edef5d88b16bf2 -98df0b16465e8526f1a34f0e24e1d25b +c04c20e9e0d8940e6a34a3de26975bfc f1f34d8c0f864daa5e8ab56801027430 -001f89497d83b75fd374517b88d782ee +4e9739c5d4dd7d7150093400f77e392e c3e50ad0d4c93692a2810e136ada70d7 2cc2731ed536bf38737bfc2897163b4f -df410eccf21d001f9f5e65da30258122 +ff20e35d737a171fdebff3fffe219596 5d9b7ccd6766e9e943b206c4e288cea8 -244ce95591c641e140899ecf82e3a091 +6134c80e606fc3eeedd5bf6a39c3e77a 545b1414d82cdd476e8d6676161e3103 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 8cd10e297876e0c2d47a576dfcf61a2b 044e22c98deb3d6da5898931cee7224c 599619a98b0411989a763faf1c6ede75 -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec d255ea5b9df613deb7f8f85bc5c93241 -d195ddd5ec7ed1f150a7ee113edc1a6a +249a59e20ad0f29165045c375cf123ca fb330418c81c08843a8ecc7b41911c3e -bc44f9076de8f3941692c1139b6715e7 +6b36869fa70561852f0dd2237168b73b 33f2afb3d4f651ff3a4856891f26faa3 d976f528676688719bb4ed9da722c798 -1ec6007e78b7fef3a0c46b285f5345f7 +f28c1d91837eecde379d863333ad3da7 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 5568084ceebffcae386fc1ec48e7ffa8 17da2830504929531702d918d538bece 681bb6760c742ae699ed900dca34241d addb82a5473d88074f998158dcf6d184 -081ddaf3beab038b809eb6db2957285e +7b331d712e358d5793e19167ab42d4b9 05a11b19b5162789760c9838a936df75 -eead927af63207df007d30bbefa0bb40 -24076c897f856af4bf47d86d96078688 +74e5138e0485400d0958b5c137a8634e +ab80eb398c1cfa95b56a5b1dc2b7ce7d 5f93e31d32cd99d38e3d59c80b4137ff df979559da6c099664af3c61b83b9e14 -7ac550b131a480505f0160feb1984344 -22fe87d6626de9d7ef505f8997309e1a -4f231e473fa377b7f6cf6b3a778952ea +3b9488c55a6633217590c01acb9c0d8e +58ce4b88e87e271384435fc25c0f8144 +bb6a51f4eb6b3c8f00bfe1cdb89cd76a 5b4aa669a151dc30f4dba6f345177d91 92ac14a3dd5307e6bc4429f625ac3f5b 07692372f9f22331da5ca1cc604206c4 f5c74ffcbb82b66d295e84cb0c11b477 6448daf1b06217c7dc989bed6f3709a2 fb5913e34a812d5fdf9e25b8ca8c9fb2 -3868fe6746505c0449f7ab2550a54795 +5c421382d1ed9e5e1f86f3bea1f29cc9 c57c2471c7a6eddd29d27909cc422e41 -78faa2226aeb9f90e52c0f6239002838 -58c41f60235ea1a5fb3991bc4fa6a24b +34c7fde492170f80fe8e0e6434f3eb0b +bdb86969718f38f7c3ec9d78b8708f02 8cc192424d2a8a3a8439cf6c9e9c866d 228b0316d26bdd36e56a9158eea64ef6 59b195fcff4d3877045fee21c364d524 @@ -8978,7 +8981,7 @@ 449de434949a3e2b8780a87e7b179d3c 3ecfa35141eae057f996daee3608c0c8 d7385726059a0035f5c91a2c1602f235 -bec84422f0047d771c9af28213629bc4 +f4977effe39cac6245f3789b7dc2eff8 f1f34d8c0f864daa5e8ab56801027430 @@ -8988,13 +8991,8 @@ b72997707e75dd3fb9bb3344408f0fd8 -c294d42b0c532a0d0ed0ecd75b2da20f -322d2f0d1f63bdac9a7179e8f597321b -dc9564fc481ddd3101734b4e01c40027 -5b5402436d2e5525c68fe96889c8628b -2ec28d7d8a03797203f724f8e5cdd8d3 -14b937be198fc9c37d706a131f110c68 -538ab10324a9a151d1944f94b590e3e2 +a287d462bc71f579eea372c586ca1e65 +9f5ba8d00d619d312d40c07f38b35c6e fb46bbe6fd59edc488ae4cf9c9e59be7 @@ -9002,51 +9000,51 @@ 64bfc7f928c8265b954a94f6ba47a472 -686a81c818a0a224bca0aa9518e30f7a +24e25ba55b35cdcc2dc5a14d7d10570a cf956add0c79021627f8d296bd9c0bee 3639365574f377b3d9192eed3012b81b -c1bfeae3937b6f48c77771c5001cf6e9 +e6bdc0042aaecd4af937d23e028fe6d3 297d7b4aaed48a75f49c2a5d7856b4bb -bc9253b980d8b35dd5a701efea21fb9b +7e6f23680749d50953f078c6718e402c 3f97ab7226e1b96805f110c23a0a4e8c 91db205f032419631535b76600d49ef3 3ab8cb2ffce4a45ccc2bd36bf7188ba4 3999a6c16fbac8f142b6ba5c83843135 e66c5201b53aff421ab597e250adc59b a7f8b687d5627915cc22a52b0332af77 -2d07e3dc90596e3bf5815017b9fef1cd +4e8f553ac2056a7b9e7e66f9f8cc3b8f 2c978233c9c2113210abb8d6b7815be6 -9b76759382b2cb4c46403832fd11da8d +bb854c1ff453090ff74b5c40bffed07a 02b66c8cb37d08bd011ec596985e5b07 -d34df2be536aa5f1959c5d23536e72f6 +17b01c65b668f83ee0e343f558f1f717 b5cd71ce52f0ea483266db95c9dc08f0 0c3ea1ed6f3bef86e72457af9d477b22 -805bb38537bb72d4f9b1377e78212aea +c093d74471eff6a5f33e586d3fdf7843 6bd7bd915222c47f064d3cfee5fc59c0 f10cedbccc9475f55d46269a683f0cf4 0a8e6c7063772f6766b3265f9b54bc8a a951ffe3e490fa57e2d8b58326957f4d 8cd714c35a68b56c9190c03579baf70b e2073338990d8009a30b20f79c1e2658 -02f87fd5322e9ca3ab84f2baa2a26d66 +6a1722dc73e6612827ab1dcdd24d0ae0 50360defe4eda5645728358a612f8df7 -16ca8987db92c91d71d494e4b4721d5c -9373f76eb4da633bd14e44f1006dce26 +b959612b1474a1f2fb2aeb746072551f +e700debbe7f28659cd6ba34da1ec09cb 5a6bb3c42b5a0bec8c86824f1975083c 87ca04b6f32ec9c86ff4a9496a7e2e83 -61056a28a359783cd881f127512996af -8518f9148a890e14466038f254c2f701 -7bab9e644fdcca3dd68f097c80e8f263 +0563e414f40984e0f2ad2a584b88bef4 +443c0149b9f505cadf88de780d7c5462 +69a9ea27bd1ff96e536096fbba4d3033 1eebc6a132b4831df2374914d2398d06 abeec7cab968b8b816c16b0dea5dd6df 988b1fd1092a601c62d214658970a600 07bb126b5d3a17c508adf9c9201baedc d9f0c52c0880cd2a167ea745276e7d34 f89420ea2cea158b44d851d13331691b -e4a6501096ba4fc1f0f379f30594ac34 +71dcffbcc86f23f9cf452fba195be1d8 6699eb3eef6a6a05645ff11dd7646491 -a4feafb6c78b04c19f3425ded8f01ec6 -d141d44dd458f40ccb09a857d53e1111 +028f2dff098e653e92a92e51a4d56f99 +89bafed728ed1123e0a9884966bd38df 354a01f32d385c5166d852822ad9d471 02e5e0d91e8cc1b008004845a60230d7 b86122de22bca131f7b1e591d0ad05d9 @@ -9057,55 +9055,55 @@ 198738d85a77c59567f81577a6235b7a 476d5ab66502092cc71290f7b3a635a0 d87251d2fa6e1c8d95ef7c0a2e21f6ff -eae486731cb10ec858687482099b54f3 +07b06e9223c78d3d8156d51254b0fdd0 fb318dd514da9a7e91e4835a22a8b317 -001f89497d83b75fd374517b88d782ee +4e9739c5d4dd7d7150093400f77e392e c3e50ad0d4c93692a2810e136ada70d7 2cc2731ed536bf38737bfc2897163b4f -df410eccf21d001f9f5e65da30258122 +ff20e35d737a171fdebff3fffe219596 5d9b7ccd6766e9e943b206c4e288cea8 -244ce95591c641e140899ecf82e3a091 +6134c80e606fc3eeedd5bf6a39c3e77a 545b1414d82cdd476e8d6676161e3103 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 8cd10e297876e0c2d47a576dfcf61a2b 044e22c98deb3d6da5898931cee7224c 599619a98b0411989a763faf1c6ede75 -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec d255ea5b9df613deb7f8f85bc5c93241 -d195ddd5ec7ed1f150a7ee113edc1a6a +249a59e20ad0f29165045c375cf123ca fb330418c81c08843a8ecc7b41911c3e -2b2a2539bf08025ea2794371cb5d5edf +0a95085c8a3f3efcd5a63702b1bf537b 33f2afb3d4f651ff3a4856891f26faa3 d976f528676688719bb4ed9da722c798 -1ec6007e78b7fef3a0c46b285f5345f7 +f28c1d91837eecde379d863333ad3da7 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 5568084ceebffcae386fc1ec48e7ffa8 17da2830504929531702d918d538bece 681bb6760c742ae699ed900dca34241d d91a412e4582686aee55e22120f10420 -081ddaf3beab038b809eb6db2957285e +7b331d712e358d5793e19167ab42d4b9 05a11b19b5162789760c9838a936df75 -eead927af63207df007d30bbefa0bb40 -24076c897f856af4bf47d86d96078688 +74e5138e0485400d0958b5c137a8634e +ab80eb398c1cfa95b56a5b1dc2b7ce7d 5f93e31d32cd99d38e3d59c80b4137ff df979559da6c099664af3c61b83b9e14 -7ac550b131a480505f0160feb1984344 -22fe87d6626de9d7ef505f8997309e1a -4f231e473fa377b7f6cf6b3a778952ea +3b9488c55a6633217590c01acb9c0d8e +58ce4b88e87e271384435fc25c0f8144 +bb6a51f4eb6b3c8f00bfe1cdb89cd76a 5b4aa669a151dc30f4dba6f345177d91 92ac14a3dd5307e6bc4429f625ac3f5b 07692372f9f22331da5ca1cc604206c4 f5c74ffcbb82b66d295e84cb0c11b477 4e186ea8084c33de3fec3182f57150ec fb5913e34a812d5fdf9e25b8ca8c9fb2 -3868fe6746505c0449f7ab2550a54795 +5c421382d1ed9e5e1f86f3bea1f29cc9 c57c2471c7a6eddd29d27909cc422e41 -53bf12dc00002400cee9505c3c4a2738 -58c41f60235ea1a5fb3991bc4fa6a24b +74617c4c134f60f3087c0b1f0451b538 +bdb86969718f38f7c3ec9d78b8708f02 8cc192424d2a8a3a8439cf6c9e9c866d 228b0316d26bdd36e56a9158eea64ef6 c95d9dd5cdb6d9a6824a6bdbefb48531 @@ -9116,73 +9114,71 @@ 449de434949a3e2b8780a87e7b179d3c 3ecfa35141eae057f996daee3608c0c8 d7385726059a0035f5c91a2c1602f235 -98df0b16465e8526f1a34f0e24e1d25b +c04c20e9e0d8940e6a34a3de26975bfc f1f34d8c0f864daa5e8ab56801027430 -c294d42b0c532a0d0ed0ecd75b2da20f -02b4f98405e26fe54399ae5cf3d8e884 -dc9564fc481ddd3101734b4e01c40027 -5b5402436d2e5525c68fe96889c8628b -14b937be198fc9c37d706a131f110c68 -4dc7f339b479b935f54185ca937b5200 +503179eef2a75e444e6ed540ab5816af +3a63b5ca883378d2e5b3ffc0bd8367ba +cf2e582534edc6a59ece7d22c939c00c +28f44c26afebd0f551578f04045c6496 +6230437ad4adfb173f89c5c9b1cd3301 +378e17fcf077672377ccbeef64dad311 +b2a770a6440bfa70194e2bed28f4d39e +7d6b8f45303f24ad769fb402b9416bb5 +db59948d8443a30f976ef562646c108e -c294d42b0c532a0d0ed0ecd75b2da20f -322d2f0d1f63bdac9a7179e8f597321b -dc9564fc481ddd3101734b4e01c40027 -5b5402436d2e5525c68fe96889c8628b -2ec28d7d8a03797203f724f8e5cdd8d3 +a287d462bc71f579eea372c586ca1e65 86edd8b14802f697dde804a0b134a9f9 -14b937be198fc9c37d706a131f110c68 -392ef1b0569abd200f863d93d88ad77e +47e41f42a075152d70958fe89cbf8d37 -37ed2423117fa214345519409b790293 +8c5cd3077f35b4d9a54fa1e2eaf99029 37d8e465a4c969aeb37a190555547cd0 f42d1bee9041dfc962483f895dc51516 -37693934d0491da5e6e72a865fee2435 +e9df7e30e9fdbb6344a469b3ba149587 3a4b04e37555e1b591460bef9515a31d -6f3e35798a1962ec9a056cac680877c2 +6ce380aa4925459fd2018f1b969afac4 e75dd31e0976099cfc0d9e00f9381947 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 03979b34915083ba410a0007c328ad2f 7ef7a01bb8bfaa1bcf2a56e60d5dd02a 35d341887139a758d99d30648927ee09 -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec f15b010a942b145c786fa8acad689cb7 -aec6ae4bd3c5941c6e2c8a50f252e12e +25c26fad23173a7dbdec5924b8b1b004 fb330418c81c08843a8ecc7b41911c3e -4201d532b15c490bb6ea56b3d7d4032b +751c73c02279b8c3741aa37bec82ba2c c247f188b836bd51267c422c407ae500 9f8037a9a12a3775f77152459d1d56eb -99e612e491a6475aa946bd01df897e25 +05728779c925f68cf37badeb98b828a8 1898ba53941f49ece5a58b90fdac3ebd 0d9854420987f4e57f2b1f9d3c4aa726 109473a1938eb45b52bd3826fb672d9d f1a79c9a55705140a6d893b3690085d0 8533867c20217e5aeae7d0dac180cd11 580097c19dd53748b11f75fd6daa95d5 -6e5a54042600e4afb79f09f52f3d8bea +0f68c23818e6bc4499f54ac914e4282f 7a64d641a544fce0c38f713f0664d193 -edebaaf030b310580975751b4b7007e4 -1700083ef9212badec296d94e212cd0c +f511f6074269da3134eed7e12c84de03 +798688bb6771a235f9f222336ce5f4ba 2c27edeee3a6e7883ed719fe44d6d145 a47439737e5532545747c6f73d6b90cd -43db758beb5f856b7e9b6baea10c3a50 -39ae77d3255b573476dbf4bac144c91f -32cdae7ed3b21f35edbddf5810f28711 +b83baa83e617bf718a588fb2e026aa49 +40304c1f3cff2f503ecd99a6ac503613 +af7f6ae4b129a71eab154f67ec4f9d59 9d81ac794e19939a076c93c618837b30 791d08fbdcfe6f2029c0c400d4f3778f af08cb31c426c69cee3d5be5dc8702c9 5545078e333f5fa834e187b6d571738a 1364b5c7f6f46e8a9d5fe21a4aa0b8fe f326d01ea1f9cb89d96aafdbf65dfcf7 -acc68e425ce7d196d394a296bd193161 +a6798cd4ef3ea5a0028b7e33867373d0 095b99ae7775132e9700de77b2e6f898 -b67199996d1f95a5961244f2e9b1431b -4e8c1a65dd260044e60bd594dc9f165a +27f2d10ac233068065707bb949750e31 +f56bdc64d89a098500278cca09fa304d a2ae9917403521ede786d9e643a53439 abfff4dbeb6fb2a25396303105f5642a ecc8a0bde690b00e0836ea7764a2fb4c @@ -9193,55 +9189,55 @@ 7f54f89d0966306d4f60a669e23b402a 07edba7de542d83b61a622e33d5a25f6 57c2154f2836596753680dff1c63f6e7 -54c89c67f919574d509c1566c6dfafee +977750e7a21659d6215e7f843e69c058 7e2d917c34973b82cd21c55635057d46 -e11c5151b866a5ca2c5d6e81286f4bd4 +bc93932dfa364d57694b5107bd221965 15df5a3b4ebb165f9986273c4ebe8798 d91271f2eee42c07a5138547a0f6c091 -e0455d672a8e4a9c3bc177b39e54749e +534aad3e7ff4b4e2fd40ad24338e359e cc477bf80635d2022a70f38dcac5b6e1 -03673f79cf22ee1bee5a588a8a27bfcc +91a570ab57e4e0ac714cf48c40e8e323 e2f570e2e66df747bf8f6b3db227bdeb 642b1d3edd6abf2fdfaf30d3995d3f4d a313c383e151fb72d0eaad1757188000 7d8c8e9bc16ad8accad451a2a6c5a046 716fac49d69b624c15ac9c91f370187c 32ae8012fb080e21bffa6e556916d602 -a12cd5e8e20bf30fa844fbd106e7b0ca +c2211488a1337a74d003a9ddb3873a31 270b61424746a236c6ada6678eb0a344 -408470b9760ecb31693e3e124ba21abf +ddb2d71f37194b210d54203f580211e6 5460d3ff345466ce89636dbeae2a34fd -18f002c50ea1cbcf33facb7660991897 +dcda5413c3dc3ef55f5b843256bdaaa2 fdfc437c24ae7b6ca2b931569363aa35 ebf4f23c07bb09dca7337a86991819fe -1b632400c042bfe9be49ebb25d1fbc8e +d005f2b3d8abdd71761243ac5bce19cb 1856c76dda9f60666256d04b1f964000 fffe909199241a85bd97495f34b80378 e8af2be464edfcb655c37b7915b678ef b86448d50cb02dcfafee6f9723c1dcc3 3ab7d54a87b3c68cb046ebb54eefd70c a63ab8aee2fbc9a1107042a070b1716a -68c3c0c712e5c1d21d46285dca52d5f0 +5d9c6213e92a9c18858795ff00848db6 2a5b90cb833fa873670d7322eb4eabef -2d807ca607e492b30eafb3d8914b95cf -79326023ad040ebb246828a681033b2b +152fb2933996d8803475656021ee1adb +d1312f31922c4819a5582de37d0e05a9 817b0ca846a290585a5395b65a65d68f 24216c82e991c6828e21333d95b808cf -95e57c35a792c252a2e8b35861c61dd5 -d5d9a12fb58fd9eb1b81b9bb6933f8de -35d645f11e3ddd313256b498d69501dc +7b522a98d7a900c03121f5c35d905d84 +f5e34703342979377ef0c6e0d12d5299 +236e91cfdc41d006da0b3f67e78ac64b 2b48e1bf7846022de872d815250a7b05 79da3afa1b6e18f33269de3e58e20500 3199b9e77ad97d719d306bfd9fe1f5bc 94ba7022b5a214208b24339a91e8b417 75025c0ce9c0230f5b2a777164d34624 78baf615e8d1c00a89cc8eda5229f342 -e8a0e5d9c0b2cacd8163d4342ade690e +e1055159f7b283cb7468daf14a8684a1 c6fa5046b17fc49c8763a64a2190559e -18edf0bd49b184615ba8344dfa9f5666 -2d5be814bbfcd9268d903ddb7a98f289 +fc98a808ed9dd80c9d4c5091473b8a9d +d26a73cb7efe81080f769a3ef26e0f14 70a872670c64c2f1bfba189669cf2899 441e0f2ccdbec200a6056f9fdc0c3c97 73eee42ab2bef0da14d9c3fa7e1f1e3e @@ -9252,67 +9248,62 @@ e644544bcf0068e86a44d37c204ec963 4ab7bcf0d217d86468075ece0c83929d 850f81668e8529bc785988b981aeb25a -cb9edacac9feda06dc8441fd267fe15b +dca08dfec11f90b90a5ffe1e4344e5ca 86d18225c3ec4d2ab47d5b96594e1d74 -c294d42b0c532a0d0ed0ecd75b2da20f -322d2f0d1f63bdac9a7179e8f597321b -dc9564fc481ddd3101734b4e01c40027 -5b5402436d2e5525c68fe96889c8628b -2ec28d7d8a03797203f724f8e5cdd8d3 +a287d462bc71f579eea372c586ca1e65 4a73b1420652c433015ba38d07a82126 -14b937be198fc9c37d706a131f110c68 -09cd93b89ceaf280cdf4e3ed95113d5e +7e05aa55be140022b44bb77adef4c3d1 9d0003b476b04cb18293d40e8e5f9e4b efdb5a6169890e8d2250eac7fffe7942 -001f89497d83b75fd374517b88d782ee +4e9739c5d4dd7d7150093400f77e392e c3e50ad0d4c93692a2810e136ada70d7 2cc2731ed536bf38737bfc2897163b4f -df410eccf21d001f9f5e65da30258122 +ff20e35d737a171fdebff3fffe219596 5d9b7ccd6766e9e943b206c4e288cea8 -244ce95591c641e140899ecf82e3a091 +6134c80e606fc3eeedd5bf6a39c3e77a 545b1414d82cdd476e8d6676161e3103 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 8cd10e297876e0c2d47a576dfcf61a2b 044e22c98deb3d6da5898931cee7224c 599619a98b0411989a763faf1c6ede75 -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec d255ea5b9df613deb7f8f85bc5c93241 -d195ddd5ec7ed1f150a7ee113edc1a6a +249a59e20ad0f29165045c375cf123ca fb330418c81c08843a8ecc7b41911c3e -2b2a2539bf08025ea2794371cb5d5edf +0a95085c8a3f3efcd5a63702b1bf537b 33f2afb3d4f651ff3a4856891f26faa3 d976f528676688719bb4ed9da722c798 -1ec6007e78b7fef3a0c46b285f5345f7 +f28c1d91837eecde379d863333ad3da7 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 5568084ceebffcae386fc1ec48e7ffa8 17da2830504929531702d918d538bece 681bb6760c742ae699ed900dca34241d d91a412e4582686aee55e22120f10420 -2bea354421fe050e91df715efbbf39b6 +9cd49e7f744d8de62eba542e0195fdeb 05a11b19b5162789760c9838a936df75 -eead927af63207df007d30bbefa0bb40 -24076c897f856af4bf47d86d96078688 +74e5138e0485400d0958b5c137a8634e +ab80eb398c1cfa95b56a5b1dc2b7ce7d 5f93e31d32cd99d38e3d59c80b4137ff df979559da6c099664af3c61b83b9e14 -7ac550b131a480505f0160feb1984344 -22fe87d6626de9d7ef505f8997309e1a -4f231e473fa377b7f6cf6b3a778952ea +3b9488c55a6633217590c01acb9c0d8e +58ce4b88e87e271384435fc25c0f8144 +bb6a51f4eb6b3c8f00bfe1cdb89cd76a 5b4aa669a151dc30f4dba6f345177d91 92ac14a3dd5307e6bc4429f625ac3f5b 07692372f9f22331da5ca1cc604206c4 f5c74ffcbb82b66d295e84cb0c11b477 6448daf1b06217c7dc989bed6f3709a2 fb5913e34a812d5fdf9e25b8ca8c9fb2 -3868fe6746505c0449f7ab2550a54795 +5c421382d1ed9e5e1f86f3bea1f29cc9 c57c2471c7a6eddd29d27909cc422e41 -78faa2226aeb9f90e52c0f6239002838 -58c41f60235ea1a5fb3991bc4fa6a24b +34c7fde492170f80fe8e0e6434f3eb0b +bdb86969718f38f7c3ec9d78b8708f02 8cc192424d2a8a3a8439cf6c9e9c866d 228b0316d26bdd36e56a9158eea64ef6 59b195fcff4d3877045fee21c364d524 @@ -9323,14 +9314,14 @@ 449de434949a3e2b8780a87e7b179d3c 3ecfa35141eae057f996daee3608c0c8 d7385726059a0035f5c91a2c1602f235 -98df0b16465e8526f1a34f0e24e1d25b +c04c20e9e0d8940e6a34a3de26975bfc f1f34d8c0f864daa5e8ab56801027430 3c1901d15b11b7c8d9411305c2c10e47 -f0b73e105427c026e55c1eb06adccac1 +43f67ab455d8d7d37792adf1b07c5d9a 0f4cabd5c702824c0432a5b16dedf3ef -f22819b1a3eb265c2e589bcc71fc7562 +79d85b51749f47c08f869e8d88792b96 e5be41a111cad12948b3c30fcd5a41c3 f8c35e3878a1834751fd9ceaf8e6bb7d ed92d742de3415fde0de3efc2b84e990 @@ -9340,7 +9331,6 @@ 616c29b85368aae480120bb30455f2e8 d87b686508e12bb408c58888689211a2 5e5684f776f1a7354578715682f38651 -2ec28d7d8a03797203f724f8e5cdd8d3 fedf292cca2809a18d78f474c1334447 b1d9c0b57b93cd0b5584fab53a6c227d dcd4b0caa14caf886102e9aca04e8b7b @@ -9349,14 +9339,14 @@ 48774123b922c982e9db9735f78cb033 f47f15a53c307b7b6b14ce44989bc3e6 7e99379d64b67784419dbe4472109e8a -b5b11dfd8d85a817097aff93636326ec +f02aa204b8f08a2b24b5259e84d3ab65 5707af36b38fd6a63cc64e6852320ac9 d2a16e475bb3d3501ca097eccf16f3f5 4a208b83b250a5fa06add548e5f4675f 82a6941cc4dc14b88f1053af0b499e4e 59addea31dca998c1b712c1ed87d3f9d ba8ea3ba48fae1c8c7bf1e4a44d31dd1 -9747da73ccbc43226cc6b5a74ffc4fa6 +380507f4784c904ee80136f10dc4c93a 85086256e7de8ee29545bcd5c1063a55 5695f95ab75430e71ca7e91b1d4a7993 5df22313fdd1f6434b42a5a11f635460 @@ -9367,51 +9357,51 @@ e5dabc12813a485062ab5b77b5426679 -1a8ce93f9288fa37df53a35e1dfdde6f +8f2df396846f56c36b7f5981c55b09af 632d62425fd80b2ae185fb09da005b35 41a82da1a38fdb0731f1af8f23e1b884 -eeb5081b297e0efea247ed89213a05a3 +42bdbc393938fe75a1d853bf20f51164 e349f1a124686686a7e6e55d5e728e66 -7d7947925a62a4dc3de04918b3876448 +7c87dfe04f9013e7205e49361b771a8c 36526b8dab4e59d4f4ad236d6c90907e 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 a46e84e226776d1c036b5c45cf3bebc9 f760a8a4dbcb446b2b9d4a57519b97a3 8586f1e6313f1760b3c4b35d5446662e -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec 5b34db46dd8cb293738572404ed3b225 -971521a0a3a41ce840a88a0179d49f98 +bf649dc0dc28169978f52fadfd74c2ed fb330418c81c08843a8ecc7b41911c3e -f8462bfe02b86e870ea7183dcf53b2d7 +338c2613ad6cc390448329775b4d2468 f0777bfe665957f9c9cebb90f151c62b 49070aa4eba7e3e1b439d12caaee9952 -2559959902d060ca1ceb8d7a29871043 +d11f46d9d4869fd71bcb552f8d51522f 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 d1d57eea51657033e41f1634e96c2560 53ef803ac43a6382f578eb37280e612c 83fef6c66e36ad20cb4fe764f9f68e06 a4171eccf1d40752d26b29b5153b11b2 -a0ee6c43a52bc1229636b74109771bbc +0c962e7cdb40d7dad2a747913d2fa93c a80d982a5473732ba1961c022070788f -effb241913bf2477516477291789d0d7 -c40e12c3e7e5a1367f1c6217c38f1cf4 +87397eaf064ce70b2c5ee2f26a101eb9 +054e37b9444d3500de55fb2873fd01ef a0057248da365d8652f6b193da290302 c12cf1d469986ba2dc003196939d366d -efb32b89df497db2be8b2b094f5184b3 -9529ef58f9d820b6b140fb0f6367a299 -83c894aea542188b6d72b6907849f786 +a0b716a86724f2cde471e7dc5a99bc5b +55ec9a397c40c4bc20ab7a911bb56d65 +decda49a23434f20a901c6c9582898e5 af5b7c3ff0f794fcf79548c1ec0cad94 cd19eae6497fdab036c304d1de48166f 6a99d337f18961deee4388eb086941c2 09294bbf65aa3b16330b0b16119474d5 306523293000765d47944a1d49176227 f326d01ea1f9cb89d96aafdbf65dfcf7 -1dbcc3e832e6dae45827b9b01e372d51 +aecc83c5c5055247d60a4ad36fe5d27b 0266e81927355c5ace41047baab6f273 -f35cbdfdf620bc6e752ff70881a0744b -3c9dac5d6e08ee323eb0713413aa7d23 +00a227b4e7ea9b1ea5ebae93307cadf2 +92fb47ee68846daa048091fde37e7fce dd0c0d28fc4a2ed9db92b4ba84a9a561 62412b0b947b92addce88be9b0d465c1 e3a663c28cda435414f95b1683b36d3e @@ -9422,55 +9412,55 @@ 449de434949a3e2b8780a87e7b179d3c a0c8b26b80f18f02804d0e01e64c031a 436361c24dbbb8a017932053886910ed -98df0b16465e8526f1a34f0e24e1d25b +c04c20e9e0d8940e6a34a3de26975bfc 96c57fcb231c8ac82ea65c0892a50555 -0d577e482960cb5459adb57b4aa803af +41d78d8a65914f0ef18af000e6a63052 150ef0a3188079477ca03d406201c48b 046d11412aa0f261834b9ae1e91bac48 -b15b7bf3ac07e453058851977d51e213 +a4fc1d9078c00df5c8ca169878cb4dbd 868f7d6e16df1caad6ea1baff31016cb -bc3e3b3476143094419b5db2e88c175d +28cced83490f2d718f9c1e2c61606266 3cb79c768f575725f294e75ef620f846 a4c048ac4494e32101da4774e4d56102 f2a97948d26385dbf048ef0cf2c525d7 4fabc8a6936621fc03a2dd32a9ba7531 5f8b1d14fad5cda81df0c2d95fb0b9a6 302723b8a8150728e2868ef843784434 -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec ae976b8b3ceff8461a54f6440a533b23 -696d5223809ae9ef74d5340d97712366 +f62445c9c54f7bc3a3790331bc282c32 fb330418c81c08843a8ecc7b41911c3e -90ba34f01cf900c232a804be94755cbf +d2fdef24cece2f67b802f0ff0a9246d0 a1e2fe9ace3039db5aedeb81476f34fd 54ee3269dc7dc1a5ad6b8e105b6d1c4a -8b23297081ff7cd9dfc4aa728c9baf0e +2b456e7e028515f07a6887c35bf6ff11 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 0377bbaabc9f554edfd5252b8280b6ef fd4e96a1dfb6310eaf9ca8e3d5d1c03b d4a4ee924ffb170772d19d8fb868d8b5 6189a60e665e8910cf6e08c7b8cb34e4 -7d4c9b0fdc8ca72ffdd4ac204add47fc +521554f32c542b54887e7b042fdce454 9b01fee9c9212da2f9f5d7388424cc9d -369a11697afc5fc08c9d9a119312befc -5cb30f4a7b7794b22249cc63086ce1b8 +6689a5cb779685d445bbedb7079f68f4 +e3b584458fa916fc13d478c9d06d66b0 5f249fd236d741add5cd1989e73a179e ba76df4a1a0806f87e68830f08b4c334 -4486ffd5730ec74acb7f165d032a354d -2cd212404efd4df30ef931e3c7eb334f -3342d6e329506071cce933f693a7c26b +74d91a7555f00214e4fc66025c26e7c6 +c99f08ea02baca67b2f7d3b53d831686 +025679c597154f7ba721c6a2bdc0a376 3db9a24b9c05a584f57e76bf796775e8 30af1f1daa6808bc69afab5eef6d8777 05295a96fc118adfbe34fed9ab5695cb 0eb4171c9641b54f4b0e99d38ed774d1 e2590b64c46acd99b18bf01068bda97f f326d01ea1f9cb89d96aafdbf65dfcf7 -89b689d8bfdef01c695a75602168e86c +be1e2d4df3f16e6e724b6e8322e2e34e b62965af8cd454ed73aa42db77882ce8 -e34f203f621a58e6a025f8d5776c747c -b79ef3622f679533a44325aebaf50f74 +6d806208ab89956ede6d771dd22caf33 +18f85545aab45cfaaf39f9beb9170e19 f11caf85f97048d91c71324fa554e8cf d7076d1ba0b16124aa157994fdb7ec3e c16ead4fa40f9b157f7c4f0ec8afefd5 @@ -9481,64 +9471,75 @@ 449de434949a3e2b8780a87e7b179d3c 8bd26ffb64c2d28d90aefe0d30932b98 c91758455ce161836aafe2a059dd9009 -7bfa336838a135bab143a6b5b0758af1 +32b016e33ecde84463dde239f1b9edb8 ef990f1dec41193b1367ff9ff985ca67 -c294d42b0c532a0d0ed0ecd75b2da20f -1db1d7ff0f6ef232f1aaac2c2cb56b43 -dc9564fc481ddd3101734b4e01c40027 -5b5402436d2e5525c68fe96889c8628b -2ec28d7d8a03797203f724f8e5cdd8d3 -14b937be198fc9c37d706a131f110c68 -65d76d4a51649d67a90d5c49c8ca7430 +0b12f786acead1817589d807f26db930 +a287d462bc71f579eea372c586ca1e65 +93fc25faef2e4a631602c033427fd12b + + +02f561f8057e8cadb399c18635e6d799 +d635affc1ece9aea78418df8eeaa6315 +a74186274ce78332973e48f79e3c21a2 +22a4f8ef288cc8029481984e6ea2ac8b +090e9b99362f9653758ae819aff75512 +5410dd2cdb6ca3af79ee9d2dfbe90ead +418697d8893dc092be6f18415df3efbd +a1d25b7f08b331845b86c40c2ce5074f +9eb5f6e1266870f5c28554b6722a995e +7b57014d652d44232899ffaf1894e8ac +dad6705b5a32e68b107566565d958801 +772d360cc224f9125941df93cb5c39c5 +1a11cd258abcd332148d1c2c08dcac6d -001f89497d83b75fd374517b88d782ee +4e9739c5d4dd7d7150093400f77e392e 9e04b2cd1b93f421705034d5206749d8 2cc2731ed536bf38737bfc2897163b4f -27534eb72e590038e0fa11d8df5a15d6 +05639cd1f431af20d67cbb44362109f5 5d9b7ccd6766e9e943b206c4e288cea8 -4c2cde2a7b3cabf2a3056b98f5e0ab9d +6c2a478ad90eccc4dc58825b3955f8ea 545b1414d82cdd476e8d6676161e3103 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 8cd10e297876e0c2d47a576dfcf61a2b 044e22c98deb3d6da5898931cee7224c 599619a98b0411989a763faf1c6ede75 -3d553783df165b8fbf3ebee134c980dd +3205d55a96cffd3b1b029104458ccbfe d255ea5b9df613deb7f8f85bc5c93241 -d195ddd5ec7ed1f150a7ee113edc1a6a +249a59e20ad0f29165045c375cf123ca fb330418c81c08843a8ecc7b41911c3e -2b2a2539bf08025ea2794371cb5d5edf +0a95085c8a3f3efcd5a63702b1bf537b e108d4f278f102da00319763761567e8 87204bb4bc4b2de9530578fce343498a -1ec6007e78b7fef3a0c46b285f5345f7 +f28c1d91837eecde379d863333ad3da7 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 5568084ceebffcae386fc1ec48e7ffa8 17da2830504929531702d918d538bece a42be7db361dd5993f28868e4a3f358f d91a412e4582686aee55e22120f10420 -282e62eaceade858ea0158c0f8bca19e +78851b6f8f660d86b00238d80980f375 05a11b19b5162789760c9838a936df75 -7bc61a1f1daf334bc893dd1f0b05ca37 -11f3242d58ace647e398a9844855545b +74e5138e0485400d0958b5c137a8634e +17c25bcc2889cff3d487e3053feabbc9 5f93e31d32cd99d38e3d59c80b4137ff df979559da6c099664af3c61b83b9e14 -7ac550b131a480505f0160feb1984344 -22fe87d6626de9d7ef505f8997309e1a -4f231e473fa377b7f6cf6b3a778952ea +3b9488c55a6633217590c01acb9c0d8e +58ce4b88e87e271384435fc25c0f8144 +bb6a51f4eb6b3c8f00bfe1cdb89cd76a 485f95503bd19520f6ca020ae9f337db 1ca4e724a542dd90368a4612a878aa7a 07692372f9f22331da5ca1cc604206c4 f5c74ffcbb82b66d295e84cb0c11b477 68633b9a396403744b2f3e762bbf5a19 f326d01ea1f9cb89d96aafdbf65dfcf7 -e5358509c768563b7eb5ed56913086dc +161157a60b6d31aa2eb6787c8e5b6001 c57c2471c7a6eddd29d27909cc422e41 -5ba7ac8405f49bca38bb086f6cffa95c -056cb81138164d85bb0d50ab0d312e86 +4364c1e5068618c97951cfab09ca12cc +cfd54dec6e531d2713c649687eb771cf 8cc192424d2a8a3a8439cf6c9e9c866d 3122c8015a2583d254fbdead8e4fde52 6f225dc643f02ed2509b857ca08a1695 @@ -9549,67 +9550,67 @@ fb4a6f0b8120de5bf4484b514147bf27 3ecfa35141eae057f996daee3608c0c8 d7385726059a0035f5c91a2c1602f235 -52caff2f9a03cfbc8f6104bf2403ec25 +06712412e2918006f5ffb08e351cf4bc f1f34d8c0f864daa5e8ab56801027430 -c294d42b0c532a0d0ed0ecd75b2da20f -523ab8741e3df41c6147df2003e726a8 -21f130550e39e481ce9cb357516e6ab1 +11548ca929c3b33650644377a193fafa +d78f2f3c7cea8650f256384b115de5bd 3332e7e07f91da6313b26cb61dbca6ee -5b5402436d2e5525c68fe96889c8628b 2cd37a211a31a13ce61875112cd9b50b -14b937be198fc9c37d706a131f110c68 -34e9924a5543f5c9f8d42f68852aa1ce +28f44c26afebd0f551578f04045c6496 +6230437ad4adfb173f89c5c9b1cd3301 +6f99a2ec953cb62fbd44e00f8d7f1573 +7d6b8f45303f24ad769fb402b9416bb5 68459fc84ea935a6d7c3c01688685585 -73e9edb0163694ae2e0a80744ec41138 +78ac41701d68b2929c5083654857ae83 -0ffa472d5ef751a84b9c10bd5e7b5700 +b96ab3897fa257c512682880b7b78918 8a54b70546ddfb4c37311eed7fe97f37 5d4bc708b7463a1439b6e450ecfe14a4 -50cb15cb36ba9f2ed19f40adf6a47429 +8dc2592780c57ff8e1844b9685952aad 10f30659042ecce2c07c210ac2194652 -6824d83658f42d96b9069b6fc83a0798 +1e3c22aa2adfc5c06708acf0e4b7d3f0 14a61298c64c7c9be5640d0c4e4fb421 110e015c9a8e5ca0f74c16973fcfd6e6 fdec511a494d5027c2acfc28a9699401 b724824ea94f4d3ab2ef94500dcfb952 d2f5adfad0a886c9fd4f01bcd8e2b407 4e5fa484c5e828a1850cdcc41c2e21ad -299d941a9f02e17c8b02434fa9e8030f +e780b269169220334ce8a881ed8df86e 8645e85dff01d97ec7a5592842fe8e9a -43676fefb1fdfc39d88827b4ba9392f6 +785ac550d923a2372210f8ec6fdde91a be34fcb006606de6d45c9017d0e6c0d0 -46d424d421b1da5570db5547a77ad14e +6009271825117e12a5a0c602659cf797 94d8e090abeb11d9024dcc7e3eb86871 e131a7ffecf41104dee00ebbce281fab -13e6a2ce352dccc6172c60efe0bd80f3 +b52b425ac660948cac6079e24ad6fdab d5878227c86ff4802e669af1c7596a5f a1b4f1a132ee1c2910d45a3ddf0b116d 46696aca52e1960099b43cd82dbbc95d 3004b16ebee23d327f659b2a7473435a 184f8b89087e7c5bf304a8fb05056c81 907459d92ccbbbeb7cedf07b093bab8d -900d9aa8de0eeab5acfd4db34d3ce735 +283d11015b1e9abf93cf98db0ac9973a 88b274f352239ce9434388ff31bcf56e -ecc6587f01a3e2b2fbb938a01ed61ff6 -f9e5e501d5824bdb2edd34487ef753e4 +abee0268a8e107361ff47312a5e87a6d +ce77e314a51b996a81e15c9446978458 953b6481373f49567196fa44c135b46e c628021e320e7a63491f3bface328003 -67709582399a59b174d58d7de1362fb7 -8023455375808279a7d309c595cf9aeb -48a16119e02b8de2108e34c83b18b326 +5c2e760538e1597f18d4c7743b92dd27 +fe1811d2f86bbbc548324f42cc4ed4aa +7558a825e0490735e28cab2de8014817 3678347d4536b92af9d398a603ec0aa9 ac2e49c27102ae56b3deed5e8d7c4175 44f79429dad38940b566f2f1537df733 47ec124cb943c866b2782fc3b47ef4a6 3a4777f67a135a1cfdf7a47069d350f0 1b7f4ed47e2733ed7daf1f068dc5a43a -833cb774486fc673341c35eece6a9327 +a15804da968df59a893dc273d4ab4c7e dc01728427612699c305b8f285cd1262 -4f85a3bc141a740f1d3931a7581d5048 -79cb9d37e25d660b3dc8c5de296332c7 +811b43fb9701e272813f4ce0f8dcdec2 +19fc6c7a0821552c6a710175261e8d91 87286fa247ed09647335fabb2a9ea2c8 0b44cc53b25de22d65ec652eb81f2709 f941b0dd2760b7fbc53b3ad0e10e50d7 @@ -9620,55 +9621,55 @@ b75222a8f89443a5fdd5270fd5cb15bf 8ccf673ff2d8d21f4d4b27fe023b422a 1560ee8237facda4df210cb12b9153e7 -e7f8a431579831db43cf42cb3ecc7ba5 +e7f841597d7e6fc358643b5bab47094c 6ad1e01b6d442e0d1300992628e095fa -37a644fdadbc320cd7badcb3f2160581 +8204668d38a45472f4e6d12de692f2c0 40da036c3ed6060360c70640de106608 e79dbc779c33fba7f5c1a7a2f7b57bf8 -af1916d0892dc13be2174e6d2a6acb59 +9d450f24216624c693008f7e5f16e7b8 9c9c90168c862a478d6fea10cadbf68f -f03e1ce24e60569fd52286622d5e9898 +a471db266232d971a875494230cc7c48 52427798b2a5dcb70d70d56d3e192716 1d053fd20fee7157bb530d6ed8656535 0b5a5f0f19db04cf9782504c32fde043 bbd2e9eb5a38d949037f38c2b160f5e3 ecfd8bb10368f489e38e4a6d70cf19f4 14486d10d969cfb5063318a4d1fdf997 -60777f0319f1b3dae65db8ae22ac8b83 +bfdf26f7b6a89a2378f0c86830195f57 be16e99465614871bf39a938b331739b -33c88a07438fee635a31e31f1b82b1ca +48f087a382b785b2b48900bf02fda7de 3833a731abeca153bdb91e6ae155a90a -03be67f2459dacb52f4419c05d9cf9c7 +98d75e356fd2b8346ddce25d95e0ae71 e9fc552212d3dcde62ce079b3ae7da14 690c87d366aca89d2768a17c445cb045 -da307033d9af4e73d15dfff967f301cd +791e669d26928837be4fe2ef749411f3 0cd2d97cc04d767f61df46295f3689bf b5685b4431db742c4d8e5eda463ac680 36ca80ebf0280ebf1d58db67f6491dda 4cbbdb44f239d315bc124680b44e79a3 f286f5bb77bf7a5d6a3133d47ca2def2 4e48782ba5e3db06fe07b7a077ec5639 -7039961c9bac00c7d741ba4411aa01be +62e3883c35027c39bf1e314e7c24a570 09e9a424a7a3756529a6a9802317131b -b536e6b3720ab1a0bd19d0cff38bc56c -38c5e9d111751c319c3b15390e924b17 +130c00d386078dace2cf9ff36b9f5c02 +34b0430074749f12cff0ff3c6ffeb334 819885d528aca06ddc71e73fc4f53c60 d95092bbd49344e2a07606621b38780f -019c8545f027aa2de1002d8f97911304 -107c60ff2789cb0af7faad68c7cfc5e3 -4c0c45c1fda83bbdc69cfa4ae7365f72 +a24cf2d2bdde87993488aa5ac2311bde +058fd071b124431edbe806c875a55025 +b1383da3b366596a1c0417fc06168e06 0a4b3147837c4b2697386b70940cd60d 6c350cab97cc78a5355817fefdde8d1f 0102a1534d2964a0ff588ae23e2effb2 3954cfb000ac4f676ed6fc06af23dacd 984ac2a148088665cbda36e3c2d1e226 84d22376b36901d38526d6ebe0e10281 -b904ea77e96218942b531e429d73ca9e +05be9a7471ce388b5e2e5fe2954b1424 65e9e1b5f51015b08fd5e36ee6766fe6 -18cd624bbffb0755b7d6debd18339380 -0eebc1b879f218ff0bc49f20bebe7d62 +ef25f47ee67eac94eeeb0dd9b5d569fb +9f783348297844ee23cb6f1cd01a212f 89da70a234eae57c52a2c2c94993f02a fc98abd696e8be5f5f266fc5a88e952c ab4ecb5d3233c1e528042934ce93a740 @@ -9679,55 +9680,55 @@ 76fd170989412fcfb3cc9f0019c0f184 ea995e584eea2e034db3f28d8fd9bb6a 1b0c0949ff8e57770f7e88e433b4deb3 -f4fac5306d75577287c3e93685617f2e +75ef924e15af16ffa6eb2ccdf9d8ddf4 7457fe1789a9f0f07205824fb97aee9d -c32c79d19fba449a6293b9779c854a57 +a025ed1d0dcf70880fb1c0c9afc6ac1d 8c05bca341db9c1e806bf122cd6129b0 f8f7a172a28516637112bfb05e9b0bbc -cc8bb28a1c987461257eb130d150c152 +44ba92975e6660ad82e875ca2bf70c9b 443bd303b15816349244d32e532803f1 -24587a4f7f28aee1e9ec50831ebe0471 +772113b2cf9a9a23788e28aaa3616e44 4a9dd02753c248d33d39dea3efa7acd2 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 425da8d00f099c5e145c34080a297f90 a4122ffd8f45e924d0008ac3b433753a be6f11bef46d99c22eb5966366c90559 -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec c6596953a71008b40a07dbccc4246f00 -989b7a105e98561e21f4e9e07902bcfe +73a17ac88ca0270e05f2159971ea7d85 fb330418c81c08843a8ecc7b41911c3e -613ef77327120476191a189d589ff35d +42caf35eadf47ce63212b7293613c26a 901903fc1de65fc69091fd2329c420ce f5b0214673d66b795a0b2384d50a0f6e -16469179573686b8a93127543b96179c +93f882d6f3b53b2356fcb729ac5a66b8 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 71069986b806fc1ff7a81389411f3758 812a612df294643f768e53dedf53d8a8 912352c3ea040bb64208b06524d3e69f 59e6bc72bc79cb2058f3a3142ddbf65a -8f2146768829eca23aaabece6b2de026 +259c1b20b9f05320ec796e70839fc4f5 bec38e846ba9a13225c6530b1a282c4b -cb9aeac6d97c3f64441c933400ac7c5e -da6e81368af413212a22d190a7e87f05 +c5df93c6c0e803924ce6e3768655ed6e +a8f1aa8e916a8bdc0840628322b2109d 29274ab30398ff24199850dd8f263b78 91d7a4a1383f1b0fc2d3e378d46415fb -a58164e67d27a30b24604c0a0b1bb162 -432b10c20f8a08bb5c9e226c82ef3ff9 -f639fc0842e405e701daeab5a78ee0fb +b1cc8152608356ba4ba7f1391d54fbaf +ca7c24aefa1e07793edac9f3ddbe80d9 +a5f494a9067158c4b81af693e44ca2f4 12ab9dfa0dd2b8b003da7ae04c38bb2c 4c37f0937bc0bdf3829712cb5d05255c 096f70f880dc63e09b098ab89df0e483 6178270f145f619a39ba9638617557b3 fa985871fb4d0f74795b3c61bf129d8d f326d01ea1f9cb89d96aafdbf65dfcf7 -2cd6906712928cfa690ee48663264147 +b7b25caac3ac1481adcc45577b1fdb59 0df5c94ca0fefe23e45d64cfb4e3a943 -261aae0db831ce67279d2ffca7015545 -47da69f211c95f6cba5dc0eff1fbd761 +b25fa99e7044413d193297bd3909410f +8354a1df4b6e9dcfa5e89a6c44d82e2f c734b464a1378316c70ab63dd8a36e34 46f4fd2960c180e57bf42a4003b95789 d855926b2e6609fa7bce6078ee3fc9bf @@ -9738,55 +9739,55 @@ 449de434949a3e2b8780a87e7b179d3c e7c1d3a1b5e1cf7d3216cefaf1f2685d 0d4ee93669987ff793623dda488a0cc9 -98df0b16465e8526f1a34f0e24e1d25b +c04c20e9e0d8940e6a34a3de26975bfc e4fc2e43ec963c474b2f6f9ecccf3ea1 -001f89497d83b75fd374517b88d782ee +4e9739c5d4dd7d7150093400f77e392e c3e50ad0d4c93692a2810e136ada70d7 2cc2731ed536bf38737bfc2897163b4f -df410eccf21d001f9f5e65da30258122 +ff20e35d737a171fdebff3fffe219596 5d9b7ccd6766e9e943b206c4e288cea8 -244ce95591c641e140899ecf82e3a091 +6134c80e606fc3eeedd5bf6a39c3e77a 545b1414d82cdd476e8d6676161e3103 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 8cd10e297876e0c2d47a576dfcf61a2b 044e22c98deb3d6da5898931cee7224c 599619a98b0411989a763faf1c6ede75 -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec d255ea5b9df613deb7f8f85bc5c93241 -d195ddd5ec7ed1f150a7ee113edc1a6a +249a59e20ad0f29165045c375cf123ca fb330418c81c08843a8ecc7b41911c3e -2b2a2539bf08025ea2794371cb5d5edf +0a95085c8a3f3efcd5a63702b1bf537b 33f2afb3d4f651ff3a4856891f26faa3 d976f528676688719bb4ed9da722c798 -1ec6007e78b7fef3a0c46b285f5345f7 +f28c1d91837eecde379d863333ad3da7 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 5568084ceebffcae386fc1ec48e7ffa8 17da2830504929531702d918d538bece 681bb6760c742ae699ed900dca34241d d91a412e4582686aee55e22120f10420 -081ddaf3beab038b809eb6db2957285e +7b331d712e358d5793e19167ab42d4b9 05a11b19b5162789760c9838a936df75 -eead927af63207df007d30bbefa0bb40 -24076c897f856af4bf47d86d96078688 +74e5138e0485400d0958b5c137a8634e +ab80eb398c1cfa95b56a5b1dc2b7ce7d 5f93e31d32cd99d38e3d59c80b4137ff df979559da6c099664af3c61b83b9e14 -7ac550b131a480505f0160feb1984344 -22fe87d6626de9d7ef505f8997309e1a -4f231e473fa377b7f6cf6b3a778952ea +3b9488c55a6633217590c01acb9c0d8e +58ce4b88e87e271384435fc25c0f8144 +bb6a51f4eb6b3c8f00bfe1cdb89cd76a 5b4aa669a151dc30f4dba6f345177d91 92ac14a3dd5307e6bc4429f625ac3f5b 07692372f9f22331da5ca1cc604206c4 f5c74ffcbb82b66d295e84cb0c11b477 6448daf1b06217c7dc989bed6f3709a2 fb5913e34a812d5fdf9e25b8ca8c9fb2 -3868fe6746505c0449f7ab2550a54795 +5c421382d1ed9e5e1f86f3bea1f29cc9 c57c2471c7a6eddd29d27909cc422e41 -78faa2226aeb9f90e52c0f6239002838 -58c41f60235ea1a5fb3991bc4fa6a24b +34c7fde492170f80fe8e0e6434f3eb0b +bdb86969718f38f7c3ec9d78b8708f02 8cc192424d2a8a3a8439cf6c9e9c866d 228b0316d26bdd36e56a9158eea64ef6 59b195fcff4d3877045fee21c364d524 @@ -9797,113 +9798,113 @@ 449de434949a3e2b8780a87e7b179d3c 3ecfa35141eae057f996daee3608c0c8 d7385726059a0035f5c91a2c1602f235 -98df0b16465e8526f1a34f0e24e1d25b +c04c20e9e0d8940e6a34a3de26975bfc f1f34d8c0f864daa5e8ab56801027430 -001f89497d83b75fd374517b88d782ee +f8a9693752fbd4548c1ac8da7c8107be c3e50ad0d4c93692a2810e136ada70d7 -2cc2731ed536bf38737bfc2897163b4f -cd00474a5d3f6c553107276daaebe05c -5d9b7ccd6766e9e943b206c4e288cea8 -244ce95591c641e140899ecf82e3a091 -545b1414d82cdd476e8d6676161e3103 +445a46a82a229836e2a48281bfaab919 +1d9a45779fc4c9ddca70d2112c570cd9 +005ba3bd0008292e2a85386ddd1fa04f +6134c80e606fc3eeedd5bf6a39c3e77a +e53cc4766956ee5ea80f16d007d510f6 83d51da6ce128a36cd2e5d2dbab76ce0 -f2a97948d26385dbf048ef0cf2c525d7 +4ac3174e1e2b105f8a57d7cb28a3d399 8cd10e297876e0c2d47a576dfcf61a2b -044e22c98deb3d6da5898931cee7224c -599619a98b0411989a763faf1c6ede75 -e1161971bb06488cabe9066c8e827741 -d255ea5b9df613deb7f8f85bc5c93241 -d195ddd5ec7ed1f150a7ee113edc1a6a -fb330418c81c08843a8ecc7b41911c3e -2b2a2539bf08025ea2794371cb5d5edf +0f546518edb041564ac25ba94055b263 +8814f2d26ff511d967f395d57acd5685 +50168662e94e4db72ff2ed9dffcc4115 +3a925c7039a115c8e6ef0d90f31dff5f +a1da5aff187e7e5b5f81bb9c2d661d5b +7c00b3d8a22adb8465d426fe5761fa35 +0a95085c8a3f3efcd5a63702b1bf537b 33f2afb3d4f651ff3a4856891f26faa3 d976f528676688719bb4ed9da722c798 -1ec6007e78b7fef3a0c46b285f5345f7 +d78ac4ef6dde0ad5fe7658f9d1ce627d 1898ba53941f49ece5a58b90fdac3ebd -7353c73dcba6a3beb03620ccb68802b3 +4a8c0a31962422325855a971a1c7710c 5568084ceebffcae386fc1ec48e7ffa8 -17da2830504929531702d918d538bece -681bb6760c742ae699ed900dca34241d +13f83052a3d8a7d4436fb7aaeb7913cf +8b01757f2b296289c0f7db30ec11d96f 59862f5cdca62471f71fcab151781df3 -ee05f7fb91d29da2977b7374f9cff85f -05a11b19b5162789760c9838a936df75 -eead927af63207df007d30bbefa0bb40 -24076c897f856af4bf47d86d96078688 -5f93e31d32cd99d38e3d59c80b4137ff -df979559da6c099664af3c61b83b9e14 -7ac550b131a480505f0160feb1984344 -22fe87d6626de9d7ef505f8997309e1a -4f231e473fa377b7f6cf6b3a778952ea -5b4aa669a151dc30f4dba6f345177d91 -92ac14a3dd5307e6bc4429f625ac3f5b -07692372f9f22331da5ca1cc604206c4 -f5c74ffcbb82b66d295e84cb0c11b477 -6448daf1b06217c7dc989bed6f3709a2 -fb5913e34a812d5fdf9e25b8ca8c9fb2 -3868fe6746505c0449f7ab2550a54795 -c57c2471c7a6eddd29d27909cc422e41 -976677f9986a37f46dd8cb078afdce50 -4dc8101030bd3c2080accb4bcb04f9cd +1e741510c30fa2894a498d766b788feb +9c64532d564956b7d3d3a257d242b3db +b23badd5a8357651688c3f6df1316769 +8b1c537db8ab0fe4c3f8927b2fb0cb9e +54d6d201342c97b3711f80827d656538 +9fbe301bd2b07340be501d7484824647 +a6c44b297a558b313b308619d0156073 +119f3dc07f5def810e5ef2db590bc1b3 +02f8d83c5adfb6d65ebf8b68fca9b672 +218c313a6e7da245be69de66b962f49e +cd47d93ba321bc08b38a92a265f6b3b0 +2ed2a2b1bf98711b45ff827f312a4e7c +60612a3459c02626f55f8d6d0d3402a2 +2cd7d3f7497c93d075b5ccb792446c39 +7757d7cb0a69e68eb61016da1eb117e5 +5c421382d1ed9e5e1f86f3bea1f29cc9 +dcbe961b1ff65aa4f20d45fedf7f134e +f533529636168b23109deace45243288 +5a95f66a1bae23db97588196ad92077a 8cc192424d2a8a3a8439cf6c9e9c866d -228b0316d26bdd36e56a9158eea64ef6 -59b195fcff4d3877045fee21c364d524 -f6118b412225605b9bfe2d33480f8f4b -bdb2338095a4ea340c6d023c861169c6 +e86011217ac83cd8b8952eba36da554f +291adbc7d79c325be982f0c0d155a12d +037be0b259ed6f2c8c88156f1287a353 +03cb1e67010459bfa029a017a1772908 b59c994938b335efe318af6e6cd7d977 -449de434949a3e2b8780a87e7b179d3c -3ecfa35141eae057f996daee3608c0c8 -d7385726059a0035f5c91a2c1602f235 -a95fc4e5f314aab5e20f6265a8f35682 -f1f34d8c0f864daa5e8ab56801027430 +b898ceb0904d8567be7de10c55a0729f +66e0502fccb30a28be66dd050968f0b2 +ac055953468913e48cf4428070d1db18 +1483402c0b4004bb0547e572f2c6837d +6d68e6d9d94c46be0cc3db9e41e2f99d -001f89497d83b75fd374517b88d782ee +4e9739c5d4dd7d7150093400f77e392e 9e04b2cd1b93f421705034d5206749d8 2cc2731ed536bf38737bfc2897163b4f -df410eccf21d001f9f5e65da30258122 +ff20e35d737a171fdebff3fffe219596 5d9b7ccd6766e9e943b206c4e288cea8 -244ce95591c641e140899ecf82e3a091 +6134c80e606fc3eeedd5bf6a39c3e77a 545b1414d82cdd476e8d6676161e3103 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 8cd10e297876e0c2d47a576dfcf61a2b 044e22c98deb3d6da5898931cee7224c 599619a98b0411989a763faf1c6ede75 -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec d255ea5b9df613deb7f8f85bc5c93241 -d195ddd5ec7ed1f150a7ee113edc1a6a +249a59e20ad0f29165045c375cf123ca fb330418c81c08843a8ecc7b41911c3e -2b2a2539bf08025ea2794371cb5d5edf +0a95085c8a3f3efcd5a63702b1bf537b 33f2afb3d4f651ff3a4856891f26faa3 87204bb4bc4b2de9530578fce343498a -1ec6007e78b7fef3a0c46b285f5345f7 +f28c1d91837eecde379d863333ad3da7 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 5568084ceebffcae386fc1ec48e7ffa8 17da2830504929531702d918d538bece a42be7db361dd5993f28868e4a3f358f d91a412e4582686aee55e22120f10420 -081ddaf3beab038b809eb6db2957285e +7b331d712e358d5793e19167ab42d4b9 05a11b19b5162789760c9838a936df75 -7bc61a1f1daf334bc893dd1f0b05ca37 -24076c897f856af4bf47d86d96078688 +74e5138e0485400d0958b5c137a8634e +ab80eb398c1cfa95b56a5b1dc2b7ce7d 5f93e31d32cd99d38e3d59c80b4137ff df979559da6c099664af3c61b83b9e14 -7ac550b131a480505f0160feb1984344 -22fe87d6626de9d7ef505f8997309e1a -4f231e473fa377b7f6cf6b3a778952ea +3b9488c55a6633217590c01acb9c0d8e +58ce4b88e87e271384435fc25c0f8144 +bb6a51f4eb6b3c8f00bfe1cdb89cd76a 5b4aa669a151dc30f4dba6f345177d91 1ca4e724a542dd90368a4612a878aa7a 07692372f9f22331da5ca1cc604206c4 f5c74ffcbb82b66d295e84cb0c11b477 68633b9a396403744b2f3e762bbf5a19 f326d01ea1f9cb89d96aafdbf65dfcf7 -3868fe6746505c0449f7ab2550a54795 +5c421382d1ed9e5e1f86f3bea1f29cc9 c57c2471c7a6eddd29d27909cc422e41 -5ba7ac8405f49bca38bb086f6cffa95c -4ffa9d84aaad0e85fa501f82879cc18e +4364c1e5068618c97951cfab09ca12cc +3bb50d344204ac6115c3799e8e7d51ca 0ad67108567f99662f7dabc9585331da 3122c8015a2583d254fbdead8e4fde52 6f225dc643f02ed2509b857ca08a1695 @@ -9914,55 +9915,55 @@ 449de434949a3e2b8780a87e7b179d3c 3ecfa35141eae057f996daee3608c0c8 d7385726059a0035f5c91a2c1602f235 -98df0b16465e8526f1a34f0e24e1d25b +c04c20e9e0d8940e6a34a3de26975bfc f1f34d8c0f864daa5e8ab56801027430 -044bf44c5d7d18859115ee1c381a6128 +f58703fa42071506f754084771533803 4f3dd930710082c606d630d8399cb483 fe0cac1dcd26398b7af88d0463c11bf0 -5ce211155fc5ed69d2c580fb0ca5f1c9 +fca2cbd48c60d97608b0bd8dc7f72ffe ef412501addaf9bc480e7de2bfb2d445 -cf91e13332c13625c1cf2ea4636ef527 +85241cbe975bbd8c97ddcdd93d5649c2 24a463840569e7c31797c226dbca70d8 83d51da6ce128a36cd2e5d2dbab76ce0 25e1ba7efdf7ca4514b81e86f1b0434e 6830bc73f64c593602b0621587983a53 f45ee6f7e075dc07091427a65d80bc3d de802721fcfbac64dba34c4e57db1d77 -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec f224691cb7bcc2759a3892662c9db80e -22594888bfb7449667e2bc9e473123f3 +7993356c4b4d0e06e33e6aae2d86d338 fb330418c81c08843a8ecc7b41911c3e -b541caea5c767a4f5592528667133bf4 +5d07d2a675f1aee608bafb069211de4d 004a58ead0e46cc37a0012f34830d7e9 63a1a0c3dc2beff496d15938130fbc1e -2385f20e749585b5d5662263217ea2ff +974a5c0861d9dbc8812376eb626d1252 2364fb2d06a0eb002e0053bbd30989b9 1b07213c7405612a72c82628826d7d5b be187e899e7a47ffd467e9ce35b8f4cc 17da2830504929531702d918d538bece 6b2bd775e06aa7cbd2f7a8848f5aba67 992fdd617035a1127aba5caa02e9bf7b -c350f2eeae2f5d929365041bb54c9a13 +42e733a579888b558a3e2469456ccbc2 6421a8b039e088359548c024a50070b9 -10da288c55fecaa85ef7af08f041e3f6 -dbee74bc9545487c0b6806e498cd2aea +e54187fd82fe00c9c2271ba19d36c01c +1900a6121679c88999a0b9d2fdfcfd8a 5f93e31d32cd99d38e3d59c80b4137ff ecbbb1603ab59fbe960202b3470413c5 -893511fb018dffe28b1f0c479ba7bdcd -c102737cc01f004013986c097d8c13fa -70e1da0a51b6247be17eaecbd9417225 +767dd7ba08cd361151b6d8390298a342 +59d9c7c8cf2b1a6d3429e1ca7ff1a031 +65c7492b9042f2489146986293c84674 e2bea3db3349c137767eab56bb706958 aa04bdeb89f5b4ddbd80395ebe09c29a 7560df62010de03bd1597143b8909d9c 501787b615deed8af323325510e4479c 2bb94b0f66048dd210f0b149544f69a3 999992f3bf87ecc74a951085c24ab54c -fde64a2155b288f66c1ae7aeedefc3bb +70dc7c7ae05155db57ef2978e8c065c2 967f6c4724c7c5a3807ac81fd7d42d57 -cef93c9c42f305fcedf9bf3ae8d9f7eb -e89af39677088e95fd2c457d10487b12 +c5e22bb5166a4b69d304414f519b359a +1eea27d8dc099de59fbd653e5bac258f 3bdff0ea3ff709e917be270c3e96a1e9 c0ce2218241f69e739b177fd5c140033 9768913e4af639ec2118c264a5ca3583 @@ -9973,43 +9974,43 @@ 1130ef43c1a7437b844db1579e3c434f 9544b3406665c8454ca7ab39e2a6393a ccd751e3f9c583aae56b1eefc3bafbbb -fec167baa346c43989cd7357a091ee68 +0545a8fe6b0d4712665045332c5a73fd e77cfae1b2c9124ddd567cc6f0bcd7a9 -9eb7de069f59815934e071aa4bc8a400 +d04237165096c4ab4aae777ac08a63c1 d644237a73e898a62393491905b4ed87 -4160f02f654932bedd29edd671b51d46 +857cfdee8d1a70d9357f829ff7465ec3 b39c038e6e8b0628c90d5114271dc50e -72b5eccc9277874ce99e16752aba159c +8b1af0ee9bd757f406a9085e52cb3e1a 18381fbfd3da6eb62195dd3d7c2025b5 fab0071a1a02bdff2c962825b43c2dfd f254234f7743f533f091e707ae5c6e5a 93d2324320ddf2609d33828f0070e552 -5b5402436d2e5525c68fe96889c8628b 07dba3c5fa878727518a110582690996 -2ec28d7d8a03797203f724f8e5cdd8d3 169e53e9bb18aead3d080bed0fb9a311 -14b937be198fc9c37d706a131f110c68 721f864f34ed9957a1da79a505146c16 f03b0dcf6c6febaec231650b079d2f69 0dcf4ac06cd149d2c5828b8563cbe01b -1a6ce5cdb1c6c8e0101031ed7aa4cffb +436545df3d1465a5a48adb9868ac07a4 d0e4982b7bc6a1cd62b339dd4edef863 a946d614786a829d9964c0e27d143e0c -c294d42b0c532a0d0ed0ecd75b2da20f 08acb8a8ca3a1dd92759d583424913af -5db0fae663b6387d4176b8cd656f89b9 -1f9c4608541c8e95cd6189b122aaec7b +525957b57a0fc667d697fe991b9430d1 +20bc5f32b32f8e0916ce1a5457227126 86a67dc27f4eab8f63ed174e5c3b5d6b 7c997211d0f9484e255a5c00ee139c30 +ccce0cde4bf1a228f603f64e14dfd505 741a1338d8cd1eedcaa67bb2a3988c56 f698b9faa688684b6932c41c48845c65 -14b937be198fc9c37d706a131f110c68 -3d09d84e3192b9ff3f2086ba9cc60080 -d1fe9d7d18e6a94eece41486639cd0ff +28f44c26afebd0f551578f04045c6496 +6230437ad4adfb173f89c5c9b1cd3301 +73bfa19aad8a9d2f4456d5c6e05bc7aa +c586c55023f5ff1cd37e7bf4795ac916 +7d6b8f45303f24ad769fb402b9416bb5 +9ed2bf9282af9c376568885348569e87 b9f82ae7cb411ea9546ce513e57af1f2 @@ -10029,51 +10030,51 @@ c2d7742f87130bde6c3b91332f04c837 -a3e9281777bf6379e3e532d4f86f9918 +a2319b6bafdc046d8782498e721068df 76391c0def140fedc6931ffbf18ab295 4c6700b866e64fb8761e87c807f31801 -7620117a87ac76a0abdf1e3f2a0dd2a8 +2f5b0a47cdfe19b77022593d65a9ccb8 a75be484704fc95dcd1bd88579cdc6ac -83541ff8d9a8403b1c4d65fec49f1def +85ba8085df5fa8598b2b64e97db1f12c 93f3338fc21f2da47f79c1446f3f5da0 9a61b8f01d920877ac43574d7a89d139 0a27701667ce4d505e2ddbd6a16b8cc5 8361914c0ee551857cc25cc0fdf97fe9 d0aab202d384152857a67a5910d74da1 7dd6c7b2a261d29947a77e876c528bb7 -978c57249da23e3f3d93de87b2c135fb +b99ad87df98f3a06424fbd9ebd338e80 5e43b0e94632b0f67f274968d54e1066 -bea204cbd818b1018e5ba6a410128f11 +79176c1d8bb3143c78f0830dd414f606 cc5a2dc3e5de619ff865e9d7c81e128a -c09c45f624a9bb96d696b4e736810495 +fe7ed9ea8c32d40babb3bb89739b8880 cf47d01f997d687b8a1bc38e0cb6485b 31f372c93f03315c680f0ccf7d1df897 -5b6e8355297f48719eaa508a1dd0242b +b9731741850079b9e831f8a6890ec89b 254cc450c35f98ddf34271255f4eb6d9 22ec38a9e1c8d0a8ade2b378df4dfd5e c679cf1cb4b8e13fa28a98eefa89e436 caaf489a26511afefc97a0624f47f2e0 e296aa7dae0e0d5d91a2a7cab148a042 1c9f2e419e96a7abf36d46c2cde71e7a -88aff64c2a387f2558e14f5dcdff75cc +e0e6e54c2cb89b008ee551ee9bd97804 24359d62453ef0883ebce7a118371c6a -68bdddeadf40d3061dd009fe77eec5d2 -487ac2c661ac6747c4931ffd4e094d6d +7512bb4a63889927a99524df2da76f7d +9cf7b617ca05a4066e7e0d5d02db6512 bfdffc1cf6e42979f52384d3125b72ad 5136e39159be1875f8f6ba4489500d09 -8028b9965a200c62fd4a16eee39c0e19 -6dea95444fa084d9f9f33be87ab60a07 -2edcb98d384fa73b9452c76b88602e06 +05cf692312e366e5f262d956d0c11eca +70cd971784454b3e119e1d0e90d1de8a +24717a755baaf426eed7c691330616a4 45dbd2119c3d6fc009c327ef5510af98 c7e70b20d22458e1c7625cde28fd7c3a 8847fd5eb933c577a1a58d65274df4fc 26d9830c8d765010486530413e4827e6 ce9447e5187596bbbc50d0906cac35fb c35de5bd5cec0c5e363104a2e2e4bef7 -198b5c8e1cd19cb1a5338b8cfd7e11fb +7c452999b4237bc2856f5c3119ffed49 9af1f73d600a2a75987f983e3cfa6d1d -dfbe3c60c4f1647c6956c3960f848fee -506490e627de09b3c0121d57b10a76da +afecc22449ba878a459caa37bef63609 +21a333e51f000e1ff0aaeefc9312caf5 17835e9b0f75e2f6dcc0345f888cdf4b 5d8da5928c310fe821026ff6eb52477f 50aa8753f776052cdf34c558afff98e3 @@ -10085,55 +10086,55 @@ 737511d96be3c80851cdd4018b27fd21 138735e3488e4289f0efaca31ebd99fb 9860471a626d8cb68c4f882a84bc7bf3 -d9a68560ac879c04862d375e8163dcd8 +275b46de50035e1d052d6f2798871d0f 3afb85eee792fc054a42df621767b520 -5f817922fde15eb48895573dfaa51975 +cad8ddff1d4ce01b74a4c89b39950974 7cec430ac1104bd3b19e5890319c7fa9 fdafaf7353ac65d8c09de8af2a8f3d02 -02de4123dc8fcd35b12d2de81258b94a +c1381bf5be0a69e660a8520b87db5f21 f29476a4ccd176b6dcb06054bd905662 -bf7415a185821421221aacb0adc59af7 +70ce0f35d14c6abfeaa210d3d1be0036 38e0e2f17c3b5559b77b0f2406a3be1d 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 6b0bd777843664a8aa07dc3ff7c4e056 af10bf1c20c1f623bbc427dffcf8d85d 5d81b77669a8e33aedfb22e0a89257f3 -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec 6c946d22da24cf980129bca6e8dd85ed -0f859bffb657420f91289f3404c3ac5f +0c36ee899709c26ef7a38003fa609e23 fb330418c81c08843a8ecc7b41911c3e -70bab55d7cb9bda9286475b0e83d5667 +743e2013f8b645af5a9affaaba23e2e7 c89a0952620429ffc07402cf29cb6343 db6c98d5d67b4033e5b2c0669a0defcb -440254be3afebcb1e39048e3d150f20d +f7c72dc1b9159c90e8985a0b5023367f 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 98e462f88ab14c1a545de484f1b66166 72ccc97c1267b7432a5a34838c729dbd 8568e4d03cdcc1874f6f39e21f994007 70b002fd1a16e5e9f19e1ca9c51797ba -0ad29ff756130d52f6263650570736a3 +a23db72fe18e54fba427eb4e66257e76 cc12ebdf72077be80525d64e6a7ed5ec -418be20b4d4d50ff450dfb18734e4722 -11972a00c6080c23c92f9dfb07d15d6c +7b3826dc0f092040df5f5356d8ff8e09 +9193f8cbd4f4442768a02e8c54ca1fd2 c101b90fd10577eafb85a1e9adb6c0a5 8c3a12722573cf513d5435feb7f71adf -54e9748ff0d518f522fb93e68804396c -6937cd0dab5849cc6e6090ebfa6d4ff6 -54f0ec2e4bd20af4a2c9ac8d15c5d3b1 +237f3ad73e2160a8b54aaf96262ab5c0 +d9933cfcb7f8c7ccbc4bd7f0042f1e46 +0fc0ed7a2924a23996079448796c537e 5940b1e0d9e4ef0693e6f862f1fca63c 976e6f39654ffd979a1633da2107011e 7e73be5f5ef1f54d09eae743625e6e72 23688a6549a080e528796537be16b9fc 2b39e01ef2d55c7b3a24671fcd570e59 0b5290b5856769452f96d8557ae4af4f -b5468bbd78484c8d55f8cb41dba6bc7a +135327918b1b40a9d85e0e11c22191a6 4de88dd01e059e9f95fa2110ae7f8009 -1024af8ab77e45327b7d2346f5f7986d -d79ce4f27f06d0289029d762e1c6ab01 +c5cefe593185d53e4916a9ebb1db00e4 +d108704ee03b60d892f36b81181c0ff9 eed8a78914dc69097046ef05aaefbc39 1f1976a8a42bad235f1ed009fbc606ff 4404ecf29a07974f4cf843216d86641c @@ -10144,7 +10145,7 @@ d0739d358ed00196d99144e88cdd7f7a 3e1b068f6c8c349c1deff0e88c8ca80a 0e72f1e88211f93ee64eebbfe1564d1d -b13be9ebaee90884f0445788681ac8fe +9d02a0c2396beed8f487a5dba939317d 1e261eaa004ceeffa908ff6569fc2119 @@ -10153,51 +10154,51 @@ cf97318c23bd26d18d237b60384ddc66 -1460f43ddf5814a3663461d0beb1ef5c +e605ad7b957a19d8fe36c93fc33dccee 5d320d584645765ff1a2708f271845f8 2660b72b66426a56722e0907c756ae68 -79bba0d100143d3830684fbe1a9a7fc0 +cdc6878c246cbc6b8f17ab2411979043 e83f4473fff2b4082532ad331f1b1f7b -9389e860be256922eb37d0e88199a8a0 +a8b512f6071708646d9a300e34959efb bbd623fc654d0934ff37ed00c28de1a8 e25797bc9974d0b299076b48287420c6 771dd023b76d580a4e7da4a064ba3d0f fc033883d6d13c24d580e557ef1717ec ca07f1bf74a5f4a2b92039d15a99c224 d08b34780ab4980ce0bb45d9130b6a7b -6a62458b8fea7eb058c3a932d6ce7a0d +151bf9e4c6174b12870e484fd6118b4e bf6cb3413093d75713ac70cf41034423 -ab594236bf2e2a55fda6cffe5735ce5c +60c087c4745633837a1cf463913f9a56 413e0555429b0e7292bedd1e52f4600c -e124372c58861b189c5ec1d4cb40b06b +233aed69397182ef49de87742d88bedf 4d29fd256a903cb9fb12b7795385a7be ef3b8f2d379827209d56fbacb1dd0292 -b27f43f0542902f3cb417db5f3cd5b98 +59467fe98c12db57d65e60d1621c95cc ba1cf48d1f6d031d8adf51752f179275 3646fd310e96bcd7ad15253c92d3d083 30d2ebfac928b67212840b7560e43f0c 5a71ae000c909a6928a183bb4a2d941e db53803710393c0486f2e99c7029bfca 390875fe099502f31e29c8772af30ef1 -97a45b0930edaac8165252d084ba0832 +4dc2ed86e4551a07e4ff21e17d1a29aa 65a69690e67238c7a65cdae57faaf825 -5ffb6a54b7cb00a3b3094b84c0d76053 -7d41815aedfbd86c8d0ac1aebd7fd21a +415260e3759dc4f23f9926b7ba5b64b2 +ba37223ce257f3662e2be96311962fce 0eff879e0e50e8ce01972f38551cf1ea 6a52787b07ef94e8737e8d822bb0ecf1 -acc831f5d2aa1117c678b0a8f74b32a4 -d18ba6977fe772f40a242719ecc449e9 -e457cadff463da8d5ce8617c6f99fb1e +f27618bda8ad19e01c07c6f3db26d92b +7e3428d77f981288b2a3174809ec7ea4 +d09bc0973279364ed47cdefa6a79c155 8f8a364b8d31313a165b00cba801409b 4663e58b350137c5a7d311f08ab90d09 794c2d9924dbe3f2fe7679c7069eb5c8 11af8e473e963199d9566b7b376b3050 622fe99e2e633f0d3e1b6184ff06b958 3f924c148e0c0f512570e1a1c65d81bf -f6a3a43c74a436c4303dc9a6f079342c +bfb6d02a7e828b4654cfc5cc18aa866d 2d2a97a666b366adedfcae6b76159247 -0e4ab4daa9a9227ce179d13e344d2d8a -6f04c7df289a8477a4179a8b931d6da9 +6802765991e1038ff058fe43a58ac024 +e829de6a10c74866f41c0fd415c1edae 4d96011de54501b073ca0dc8543778ff 0e1a650c3666abf86528bfd3562aa763 14497fd6edd5c6ff712f50e79dfc66d5 @@ -10208,73 +10209,71 @@ 062c2a7a4996394f673ca9d98ef3bf7f 05360e7849dce6f236187fadbeaae20f 42432835fda1f793609eaca22b834d19 -d465a5533ec53c1b957840c88f7422a2 +ad6aac2b4e1f77a3b57113392fe5c869 69e863de65c7c11b4d4359dd33933737 -c294d42b0c532a0d0ed0ecd75b2da20f -322d2f0d1f63bdac9a7179e8f597321b -dc9564fc481ddd3101734b4e01c40027 -5b5402436d2e5525c68fe96889c8628b -2ec28d7d8a03797203f724f8e5cdd8d3 -14b937be198fc9c37d706a131f110c68 -538ab10324a9a151d1944f94b590e3e2 +a287d462bc71f579eea372c586ca1e65 +9f5ba8d00d619d312d40c07f38b35c6e -c294d42b0c532a0d0ed0ecd75b2da20f -02b4f98405e26fe54399ae5cf3d8e884 -dc9564fc481ddd3101734b4e01c40027 +503179eef2a75e444e6ed540ab5816af +3a63b5ca883378d2e5b3ffc0bd8367ba ab59d61bbffe26c3fdf53d3c6b5b05d9 -5b5402436d2e5525c68fe96889c8628b -14b937be198fc9c37d706a131f110c68 -538ab10324a9a151d1944f94b590e3e2 +cf2e582534edc6a59ece7d22c939c00c +28f44c26afebd0f551578f04045c6496 +6230437ad4adfb173f89c5c9b1cd3301 +378e17fcf077672377ccbeef64dad311 +b2ee3e61485fdeb685fc7f73bf802b23 +7d6b8f45303f24ad769fb402b9416bb5 +db59948d8443a30f976ef562646c108e -fb147cbb17dbe7162bdfe77907095f58 +d9f9fec3917d6b53367053b70488dde9 ac16b396be4bae4e72ddb087f590c2e2 7634fa5841088e340e78dd026a207001 -47d151d6c9f7edc4b8abd57c104c7850 +57092700792f07b4546c0943ebe8a1c4 53f1a80837a5b81364f828a9e284f4e2 -1dcf4436524efb1a8a13230391447a27 +93da2c233743613b21beb6dd691197ce f0bdb95e6126f2d5e550583f455f55d9 83d51da6ce128a36cd2e5d2dbab76ce0 31a8687a8d2cbf8992c607e1f21e0a7d eef423b5c9410bec537cf0b8eaf84d33 bf78ef45d31ebca84115e960baf244e7 adf891c20d96e4184023d04552078088 -b4dc1d5d3383cd97553fd3ba3df420b5 +99d11807fc3d60ef8532b0dcb0e7566b ede3fa28a1d3a5680ef13c9e227b42ba -e5d9dd14cc3d69083f2c281ed9a48c3f +18783aee3a3acd1e542de7cec9e576eb c20563eb5ab144e4caac3d422a3f7a4c -6fc249c7cb724140382a596a1b373c1c +9ed840b9544e41d2db4391c20dccd674 eebc91d4fab1259c05415ed82cd19879 007da2b3bc701f7be0efb50a99d72e98 -7597120b5a11d00a52eb601534845ec1 +4086f5653c691655e505bc0fc5cc6481 97cf9622d28bae2a510eda4aecbe0319 d3988891f5f080e84de28bbfde083477 508ba851c0f230bfaa3c32b813d1fcd8 979ec7bc5aa8684ffd8ff718bdeca9b0 9f887891e44e6ccd4160a5863c49cc26 9ef6d1074b9e0752a3622a84e8905b34 -6d2b54979cb5388a8dd1815643da9e06 +04c89392f04467d77eb2a2517bf57322 620efc55eb30835ab25b36b1f23c7290 -bcb7d212efff9d2f016db69793c8fa33 -742b0e2ef45c74154110cf689a6a0f29 +fbeea858e27c8b3de5a1c75afcc9c9bc +771c64d563aefc79aa6989565a94920f 1099de7c892403a38bcb3f388002b114 a9bd45c8e4c6e67f48f99a56ef46b676 -35bf75e1e9a05b941031c4f40d49a9e8 -8a0018034fdca48eb496dce3958b16e4 -91441652fe9dbc65fc40d5dc679ab051 +1bbced61a157b36189a79c706f547db8 +60dcaaf4d25545cc93de4a34c5958b25 +be156233bfbb3efe91d096016210b107 bf0ffdd73c0e91aad6aa4e4b86f2f4a0 0bd9d42b67a73a9b4df222e4245a5fcc 6ecb7391c7998ccbeca8f1209166c7e7 090ad581e9e8c566eb52aaa42dc8fb72 3caeaa1071c0c238662aa44dd4e6ba7b df6baaf86ed9f3d0e4b94c391d77f33f -343ded92c22f650d69a9fcfb35378364 +ca74ee128540b79d6796998342fc7312 a33b50027d330ad44adcd5e9e827bd42 -81bb0c6d4650c32d2fbc032040c48b4e -7568f35163d68aadbb84ea44330a13f0 +309cca9ee7dd88c3fd4f5442e19dea63 +4bb861c191c93953e11e510fc40536c8 677f664243cf071749383041adec0414 a14311660639a521042796c468a23b1d 17645bfcf4473c061cffa6613cc4626f @@ -10285,16 +10284,16 @@ 182eb0be249cd128f6aa5be40849afc0 defbcdd0247cab8d6f14fa0ae50220de 936cad9093a2d6bced1c9bdd5a8c8f9a -75bba8fb899d23990e498f170e323e78 +762207d326766599a5862e6f616ee67b 2a02d65f7ee53f1a006212dd415343c4 -17826ac0abf776f5bc6d8c68e09c17d5 +5dd7d20f01960b03734721e766ba8100 dc2cd95b6531d5b5cc7d52251523506a 57282ab3ba26185cd568d1838e0ab8f3 -b12fb144c4254826c2d04579be5b5f45 +d5f0a740213ba25091cf3f1cc4905229 826aba4abd3429ff665409aebda73e5e -f2ba671f9d17aef7228fc204ed1b7398 +ba85b46a82d3f8c4955e4043245e961a a094115816a8df0c006766c4000861c6 3e5ce3b248f7dda5c1eb88b75a642f5f 25088723418dcc167b4665c455714951 @@ -10303,12 +10302,12 @@ b05c8370bfbe8bc89c37c083624b5dff 910620b9e594d851f1f8a1f286890aec 601f004f8adb4995ee968e7a3c01b5df -d9c71112e2d9ed882f346e18ef246004 +006f9f9a3aee411c145e072f21dea29d 6b93db41124ee6e53e738d483b6f87ad -24c57b650c2e20498aa850503992564d +7f8510d9f8d1ddce0364899ac4508960 fe4355e5361957737c127212b9ab7777 3509f62c9752bbac4f9bde2df2c7c8f0 -99414bbf1bf1e685f4f730c760b96fd4 +62e75f5e1fb98278a1126f706f0738be 20422b3e39bd1f7a977afcc1b14f3103 0a0f23a2b23ab6686de48bbba96bc1ce 27883e43e8af16b177867e0b22809805 @@ -10318,12 +10317,12 @@ 07fa6f601297cb41a1a6668d8a4137c1 90c202b94dcd09173f067e8bf5164b77 4b3416e5ad27f1623f5c9222cf93f491 -4f30c615b5054649acfe658b41c64664 +8b2e7f4dd5a2e5d494f167f6d0b38cc6 6f11fdfa4b04669635edc07ca6efeca4 48a83412d06860f170a73a68d6d1d607 5c3ad5663f3d6527148247ff7312b385 -2e611ed7fc633ec32354afd2809d8312 -3b991a186f3742555e60e6f61785e885 +acca800c8cdc980d7fdccc5e9faf3e56 +4f54e2cff46f1c74c68cf63780efb881 ea89357f6a833ce27bdaa3c633b73559 838ea08d95f65f9a06957a7d066f0891 925e7c28144a75b7e0fbc57715f523f8 @@ -10333,7 +10332,7 @@ f804018f508887af815f81d054905620 6e9ac5f9954ea167f40c686de9be6b7b 562889c108c03eb1b52e7c4819b3b125 -d1a2602d42b8e7df617ca9c2ad3fb71f +0573bdbe1c4fa3214e77435e3bc64f9e 285145b8adf6d1d7e53a1c102b25c177 673f3e0c4062e13cdef27b581fb66461 d74248250355b90443c5340490731dcf @@ -10344,64 +10343,59 @@ e0f4c93906c140661ee859581b1a168f feb14dfc2c998cee54ba6247bb784862 48ec52231c3493ab0344cba74e220a61 -813838a5f1d8832941b8ea61ed2c7271 +d8c806886f45ef4647f2dbd94e81a84a e17ab7d7f81ddef4dc5e5ff071a5152c -c294d42b0c532a0d0ed0ecd75b2da20f -322d2f0d1f63bdac9a7179e8f597321b -01ecdb579e7aaa2f7a35a9d9f9e706a0 -5b5402436d2e5525c68fe96889c8628b -2ec28d7d8a03797203f724f8e5cdd8d3 -14b937be198fc9c37d706a131f110c68 -538ab10324a9a151d1944f94b590e3e2 +8e7647cbe7536c0a885439de89bf2d16 +9f5ba8d00d619d312d40c07f38b35c6e -6656b3e6dc07ae24df1501e0932f5ce5 +b2af4183c35c8368957a7e64377cc57f 2da9b931d17ade2a435827c23455e872 54f046768f3455e3fb35867c5b0f1ed7 -9be923895e488ec1757cf0a45a39a5fb +579b992f766daae40b1605aeaadf619e 08e9fc5f52a0c53994887f92e1fcc44a -4f1b28f5fabec7c2e7cba7b1baedec07 +8bcd04bae3ad9c4f6d9643f29e9b498e c7888707a258ca1950680b39e80cd6eb 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 cd8e0a63a6201e157c9382e9ed179a09 0c2770f61da58d89d7a3e470abcbde21 56f667c49490cffec8ff2af43be01505 -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec 23b458105b635bbae85e8543b714f466 -2a429e1a02d9f3305cf6db2eea26714f +ba86eb94b183aef4f2799ca2634ef9db fb330418c81c08843a8ecc7b41911c3e -ed56660e07d6d83851450fae4059f07c +c27d3f95f804e12715a63ad998966bfe 00031f18fd4104d1b3e39b63c3d6dc2e 79089255158765aeec5fcef88335c136 -58c57248c7881f25664f38bdf8a9cd64 +04b23547bf3a6201101e44f05cddb03b 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 2cd9e20c479aa18f908135af201a395d c949765e7e8fc39653e1d97d91d47b01 7b38146af31c9a2d81c95b41efd3855a 8eb7f101d38e1a354b316641fe4ad6e7 -377e3fe36becd2edafe1a82c880b5e6f +a8be8c5ca25dd947988ca9303c489275 5168ede7bbba74044a5a8745af74676e -a7fa3d4ce82fda303db4c0e92a25ff8f -050543336f887a276a9c6e130f1a118c +eddd90e362600b18430210de2678e89f +d8c0da3df4be8cf922d5ef2432d44c44 19e47714f4bbb927bde7107edc730d9f 09fcf901f0bc76651c15015c36971ba6 -22ed1ea1d7eee7eb18438d47888a926a -a8b28dd3467b6f9462fcf4f8b4fd2619 -62e9ea41e1c061dac2602181fe68acd0 +54796b8197ef6dfca9f7d998219c18a3 +20be3b587e448c9e895c857eab0e43b0 +af01e7f97733e4cc9f43563044dfa05d ee8a076945ed7cb442619baa9be2442f 15587334eaa9a54668859526ef2a173d ae0b2989e0a8a56c8b4a3b9a77429586 87fc4e5a3fa058627fed5ec8543bd51b 5c3fca1a0fe9b4eb6ffe3c9d9f8f7062 f326d01ea1f9cb89d96aafdbf65dfcf7 -e0a1d61c2106bcc5f3b9725a1eb5afd1 +9fe1ac554c7c1de5066b3d7b81f22639 06d2f80c85c95fe57a57f846f411bae6 -305f3329e4c7cae712862c6869f738c5 -c0fb37d9b7860c7cabe50b6ee00ddd7e +6ca627368273e87b0d8e15e7545a160b +593da56badfaf10ce8795be74ed1ff79 2be4d4a4c067b0e7d6abb9364ac01a7f 64d8c175fbdf22de3a58f0fe7a5d568d 64cbf57e30411b123cad22aecdec8857 @@ -10412,55 +10406,55 @@ 449de434949a3e2b8780a87e7b179d3c e0ba63b632488657acea03751b852a64 c8ab1ce70a23df70ca4f14487cf22f69 -e381c02e0afe8e2e8f09da697882807c +28e1b5322211ded0107896817fe3011f aae9d37af7193f531dd6b5ad8adadd3f -9cd84209473651f97c3104ba68683faa +389aace5ef7e4ff0b68a58638c29bd20 b62f02efdf9ac0a86c18a81908c92501 eab69fb2035665be0d1a792c15829bec -c4e28aa0e00eabde40d653f4f45e8edd +831d40cba1c92e8bd28c98c34ce247b9 804ed0670b3482332fc7410c05f2f835 -a26fe15779d39140f8b3e9d391368e42 +942ccaf3d1c8683ed112385b9b7cc2f6 4692462d58a2fd80d42a987c7ea8aee2 d90e588833456a9940a42f86e8542454 d52c7d2657535ea3b294a12cabdf39f5 9a0d9dd121a0bccb33e4928ea6f5c04b 5adb21f679d4fcb748ca9c7ca58893ab f2aff6a51a5f3b1e5070d8296c0461bf -266192aec98a0387a8023d984029ff76 +9582f4b3d033986832619b97359d8201 3da38f4ea86ed7257ddd3008e847ca93 -14b56945bcce39241bafdf5900176d1d +133dc348a86a495c2938ed78de122070 123a86fb0a51a6eb103794ccb2067ccd -047dbbd17226b58dc08692395ac3fd39 +410f30b698885f34c74e908963581a3f c632a366dcaa89159c561a5339552432 2eda9af82d13ef3affd1c4942fd3472f -56bfb296ce3e472c9ed60c59cac8f0bd +f5bdf1242284d362828647ebd96dfba2 765bb7cd6ac5f4a20b68e8027c9b3885 f8f96ff7d44cbfc3936eb112c11a2462 df070d5cf97903c24e69d1b203cd6131 c8d0d57fd5a8a90d3dfff59f1ff9c8ee 3e3f45be57bcb65cafc6165966deafcf 5fc61c1ea6a87f56d1e825e990ac0c3d -591d5fb87ce8f828eff137f82f6b070a +1c59494edcce7fa08fd90722764d58b8 fca9396ebf7b2d75dba9615adf461163 -f071d8490f9dcfb84809ae212b48ba8e -95c672d950e58c2f823cb29d16a17933 +b079e3a29f77815a5b9173c2feabb557 +7ab6aba718d40a2d6a60c8afcff7b082 02d605d8edf28de0d16ea863656a65db 371a05c7fd519e92e711b412705409ae -74d1fa4fde5edbf44b0c31187d32780a -333b68fdfa93dd089339149f79ee30df -91f3346e73ea2f142701a879907da30b +0ca244d08e809687c9f7e79e279a84fc +c417682e9f6d01290365f42b78edc704 +334a5d89c989883df00d10b86b384f9e 9b1fb82ce3b0aca36928900f127917af e7a5b910b574a29bc09a1396d1567d38 a6cb6f452563d756b01b256916a59348 d91fc3113104d8ba67c51b2476661514 de4fc74e022f46aaf85ea0ffbb360a25 540b636ced7493d4b7ead20e7c43962e -21b3b4c2539ab8e634694c48bfa437bb +8ae01631961eb7a276be73a9051fd502 0d9a2bb9d65f21b755512afff479d8bc -4facaf16a4afd6222fab22a6dbc4f93f -bf1d49b310154027adf1145539cc9d07 +9a06edef2a49690033289089d6cd9b07 +7960432eec8021e35327245eefc4fcb6 13c5ddf75492c68962c91afab763ab5d ab399d53ef38c91f15f5b8401f1919b2 ced9fbcf9c28efff2dd84d3b0de4f469 @@ -10471,55 +10465,55 @@ 9b0594e3a334ebd57337950e1374b48e 3260650c0ae93ef2b410b2c4d71511c2 ea971260dafded2f5fe7aeb3f5ef5d26 -ce7f65478ac60238d60f16e432c5de9a +30efed0e9ff5b5555b46115180371c5c 61d7d9b8502d45fb6dae1a0889effd14 -b53cd6293e534fa9a1647621110670fe +40451a6173526794176acb864c2fc4a0 3262db34410c13ae4d777e263d779217 31d65a4ce3cf788da72de88f7a6b2d06 -3b8e62e491e04f7a0cb9a405355e7d89 +05ae9f00f719f3aaef5bec5bd86853be 4dc3511b315c7d298a44c38ce7af2126 -e156cc73788016169fb0b981aa35c926 +28d327e71731c909c076b309ec901332 256de69b0185b8ac1e1164f52be30df4 7083dd601a0dd21afa5d5ffc09440d4a 5a302a8547e9d98cab90f51dc839a878 151c5afe182c4e64644b1489449515a9 78d057e8e8be68913e0cf967773afc71 f5c8597db76285b1ade05d7d6bef6955 -186dbbf4b11a9684557157006bf2a232 +94fecf363679c8ee6595eb087106921f d4adc458cbbf4ae1ae05b81bc08dc2d4 -4aa381d9960a082fe174a717f922caaf +cd56da9abe9272e55a18e1ff59dd4b25 7a6572951716b3e4ebee8fe54ffc4023 -8b88abc6a7cf70ce1acfbc1f92663f7a +fc70bbf4fa6b1fa0bbb0335f779570b9 a7181cacaf1235aefbc2b3aebf8047dd f5f165bb15c6391fc12ebac3e0a0f3e6 -8119a59c27aac8df56ce4b2c4d5613e5 +8ee2efd2f7aa53ba65adea0a1946030a 40f20ba0e389d91edb8b29b71da6c2b2 7508982db7d5e9e5c7fec3f096de32b0 08209ad0a5c53c953fa64bcb29dacf90 a083abb5e95590fe1cd60565bbadbfce 769fa149d74c5645c53a89575a1cea0b dc02836368ba0678cfc7289e18edc4f3 -7f005dc1c4048f02914f491339a5669b +ee618e253aedfa719a95d72dc404842d 0c4ca601c83dcfc8d0f4f45dc773e2f7 -2da0a1995db50d0752d2e509a3bca37f -215c2affe164ae37a7089481fb874de3 +012b10e345bcdc9dc702a284684fb2b7 +e89ff63b9c6b27b12455800068bee19c 10c2dcc555137e38039193ccedfc0cd3 bb194e9b127b46bb2271d19ed84603d3 -15be1fe8f10c081149a3003de6ec6921 -a1c2c9bfc0b6f28497c1869f91b54afa -d816d6622fcaf3c5f4e8f0a516128d20 +f54ac1724115231e8ade619a8782e374 +b1432edb772d35f2950db364b6154bc8 +95eb96950c687de257c61cc86bffd485 548bc532286b35f7a6ffee2a2801502a 199dcc4ae427c0d0e5fbde6c0d2d2f99 1be19aee93ff0725138722e0b534e207 df05fb48ea5f4eaf82df101331b39e84 8c8991fdd1f8a737640549006175fdce db71e7656127c95fb902fc19efa94945 -0db4c61ae8b84b7812fba61a45ea3826 +28eabc15dba99547f5f302a46df90cc9 b19954c856288b7fba6053c64471aebe -2e8be846099c5d7baeb4118704b5c7a8 -32fd9960b92f92505a61f1032c2bb842 +d1581462a134051a2b06e3a3e33f0f32 +c76b5db17f8f117cfa0a3b045375090c a475fb087b707ca8fa0d87a0a7e38dbd 7c8a83bee9be22e875c81d9fd80097f5 5146388b914ad2a67ff419d124e12748 @@ -10530,55 +10524,55 @@ 739dcbdb1af7be20fde77fdb159f53a3 9a001cf479a5f9de7ecc25311cc65302 056b4d4acab5eaf8f5b5cf2c568b1bcf -0117a2510602eb75bcd4a2dbc035a0fb +cb67a68604047b11312538d9a75423a1 87eae3bfbea127d8e90970cf3fe8a9a1 -6a3f53e106a9855477acf063ac72a81c +4cc9580e715a23e03ebd5d0d02f98ba1 2495aaa5b99df2676b6409c322d2d2ef dc3e7510d95a4e41c33aaea7347f7cf2 -a6e0277e377b1e3d616e6ee2dd878b1f +32ac2d68b9657dd18e2b73929e5b9821 c4ee7398d07dbb57e9caddca4813a666 -adee349ef6622b70a76756e80e2467c5 +600e610c0502f431e628d73363f10970 0221d29ac695e320aa365ec04ae2985c 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 0184a33f9c3389b35fcde8600ff95417 8ff0acf9aba961d05e0715ccbbf04736 dcae4e329492e2d99f0578f6e6c9397f -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec ee2fbf76bab8bb7fa64c3fb5c1f8da89 -333be837bd37efd00269ae5bcaf73d6e +5f7d5eb287f87b84a3b12b680a5b92be fb330418c81c08843a8ecc7b41911c3e -9bd2f1b9f94f34b489b4f604f75c9034 +28f31bee732a0bf5e12c489c08f70d28 f27d3b01a2b69930de1169490ac21d39 606ec4e8caaa77b3b8428f6d048ebdd8 -ad31feff80027308a7ae4f17a1b14aae +2185e7d1d2e0257c466077e8c32a91f9 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 84aa8a05ba6f4023339aa1fbb9a3eabc dd079ae8cedc46e35d279c27543a81be 7709eb325cb2fc85c78639890ebd925c c668be265797094334ea182a0824494b -a92ebb74af2774ebdfdcfe7e56109808 +d7618ef878fcc5fb51bd88137dd4373e cad19d84a46e0e9153e4a0fe0e6059a2 -4ce126e3a1d64bf191bcc3a693a4d1e8 -07b4c6a0da6bdda6961e9362edff649e +78d542183f7dc43cf0ad4febaba14e80 +76eb5e38af6ed0393868555475cf3a5f 9af8cb14d88c4c8e0c58571545917dc1 a3be14202734967e6859f61f03850e47 -7d479610d62b7c06e474a7cae6565d60 -e159504fce68ecac57037ae2393e5de0 -2a838e25d2bb6bdc96edc985f0a150c7 +1270f8bc9bdb3cbd36ae2768d919fb3d +ee59ec630478e670eab50fbd61477bff +c4315f3f31f39fd6f395deddfc2e7f65 b0061480473128d4e3faacce851d5b5b ee23c6c8670ec36d43be842613bf1516 986d6c4908854449bc9ac2b008e75a7f 83c16bd1d6727db3aaf2d25e72d37977 62f9203650557bc104780fcc7d9af944 f326d01ea1f9cb89d96aafdbf65dfcf7 -93ac5288276460d632069b043ee9b2f4 +a5bae1dd788536412dabc9981d316438 65cd279199c6ec5e320dedd7544c7a08 -a65b43dafa8181d31d7444209d4e76b6 -b31a45fe5b315405019d9abad5544128 +fd7c096315d8e230f821458516443589 +074c1fb786f0a605640392863724462a dee392760d4c24a3c7f6a9a218422148 4f3b5893f55d2462354b05f22afeeecc 74ca1c6583f0481aeafc21696c6df0b2 @@ -10589,67 +10583,63 @@ 449de434949a3e2b8780a87e7b179d3c 4e561adb5b30f6f32722022523612456 066cbbeeb72e13ce72244a35760d8e4f -98df0b16465e8526f1a34f0e24e1d25b +c04c20e9e0d8940e6a34a3de26975bfc 8670dccfd7a31fa4c44bc8fffd978739 -c294d42b0c532a0d0ed0ecd75b2da20f -725c0db804f21f04b78982da61ff2d7e -e9ab65cca74d0d1069c0bb6b50074d1a -5b5402436d2e5525c68fe96889c8628b -2ec28d7d8a03797203f724f8e5cdd8d3 +36d54cc80744708ba9ec226b550c8daf +b445026a015b310e55204739eab1d577 921ab7227ed3abcda2db9bf141411751 -14b937be198fc9c37d706a131f110c68 2172e11a30b062324fc2a90d1f6de9b2 34ea25003f05ded5624df898f2c1ac4b -3007373ed2951f690530327240c5f115 +7210212c531b08cb22055f395769fec4 -1f16414a30aa0a40379d1cf47ac9a6f4 +3dcd7f6ebcb8c13721d94494608c85cb dd301d88f6d45a5b41cc61fd0398013d 707db11ae318f0427fb4de517d7e73ec -42b67a1a0346b608e443e12f29b69e8d +37eecd1179765425b3c0ba7df71152db bbc2657930596c2b154f00988ddcaedb -b439730a1adbbf881e2fddf1e0c83748 +700cf29f7e2bf55c009cba529e1311d8 e88891dab9672d1abf2a93d6083e18b6 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 f979dd15c52b991d1b7f7bebaf1904a9 136b84df355623b8cde74d6e8f46a98d 2b9513da76017124bddcbe355cde8b1b -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec f207e426d375d1a5fd4be856861f2a1a -86348ea789ef1314a6e53a41b454f065 +6adea116192ac7731c26d0c24346db9d fb330418c81c08843a8ecc7b41911c3e -87ff59e320e9a3038f5a4a82bf3cd622 +42c308614d57e7929e8831e861aaeb46 a2efa498bb6ec2e917bc885ebe972a2d a53138e64ad08cc1eeccebf36b7ee960 -57556165ee5bc8d1536476cddaeda687 +8678b550fc3e1b54584cb1fb8526c765 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 17d68c416413db1e496ad110d8a68bd8 f2200cc41cb26e664754ccdad356e8b9 c3fb35dd0fefe93bbf0dfd8976709bb7 0f24e3f9b662529afcd2611dc32f47f7 -4a6daa4bad5d06c18e1375e326e5426d +28fcf85f29b6d66e69be37342b1ef2b9 97cdffb50afd0bd901cc9b4260e41f6c -3e2cfc1dbeef169bb2bec99537ba3acf -1c7dc815c1409f1801dda799e0c4b93e +c320e189357c0a45b74d8a25de90857a +5352cf064fa3607504409fe7cc84472a 3d9f9e874cfd7dc5eb4cb48ce2767545 ec324a67cb8145820e9ea896a36b29f9 -bd0bfc8b701484438eb51ca355c9e2b4 -cc7f2006caac14a1e4e2ae4cc0875814 -f1583dac9a5e2b71250de9a8b2e34377 +f721863a4725d02319ed4879dcf92263 +c614918642df8a8819e1dd7edd49ddce +f757a92ab1bb8a7d9212b9164923cd01 8536e6609b02d26a3181678fa36d9761 ba65eb70925e2e80ec40306484253483 eb7629f4b3e417ac96b46ea2457ff477 90d13efe717f8457b7851bba57dd5a44 4b0317bacbf44db749d81e899c0d0540 1bc2c11dc61564329b6e8db3603fe42d -9e6347a68f6318ed12e65da37c98183d +ec37bf3f902eb3662495668553f89272 0aa68b2277a2af4acfa5e470260c4e0d -351174de3584d284c0a2f111b1c096a8 -298b684f1124cb649afa6081ee5b31da +527222ce739124433f5aca935f030d18 +986e206bcc02718c3cd04e0095e62206 aa3dd95196d0ec83718e74c22d0a0da3 7b3cd67f5f1c421536def5926d137a9d ed7a4a7839b90c6a2abc4bda4006def1 @@ -10660,55 +10650,55 @@ 449de434949a3e2b8780a87e7b179d3c 14f0f8c0c9ce76174baabd31994fda59 a9b8e7319dc463d1e2bc9d41dd80f1d5 -98df0b16465e8526f1a34f0e24e1d25b +c04c20e9e0d8940e6a34a3de26975bfc 9e65675700f44cd62f5ce4c4f3aa8226 -704c314279365af2f7c32e3c634ec423 +90dd88c8b1fafe1a2b93f36e8219ae9e 09e6a05a8cfe5f1533fe8144beb1d05b f423a14d136e03186e7f43e2df7c3744 -ca81d1f11cc2b18f78819d3856c0117a +4e5f5fa0ca8ec3a93d2061399c61e4e7 2a2912ece2fdf7a2e3c0c9ba78d3007d -50047740e8970baa3cfc5d3431f0f9ed +272250f7b5f5f117598b5ad29775034a 30f79908815a64fd943b8085d018e472 56abeea9ab436058834bac282558fd24 8fa599046396625428fddf3cccdc1bba fe22473d89990b28abe768719a9309d5 16fb90752c058fa355caed219a1db6f4 92f2d8f8299919cd0d2fe2ee8ddf6594 -3096e6efc0f60e8072255213788ecab9 +52c74036b772b36f3da5b0f30cfd4feb 7416a64dd5ed04c73228284cff4b6e0a -f41d6cc473a9edf9689bba196dffeaf3 +185a78a293a14d6ffc849d6f91b63fe8 df0c9e9884678ca5fd289648f5d4af47 -4d09328a05ef25857faec9b18cfe925f +36027a7c1df765c78f8e9c2018881bb7 d8880eb89d2c17dfd2040914d4b41bfe d99b7ed121c50b6b1cb0d9ccbc65bbc8 -1b70c21c20d31a6dfcbb39ab299afcfd +4ebdd338fd8d79e60c7dc7a455854647 f5f46d2641ac2af573c70801a388a5b3 c5ffae12b8dbf993f93b82f81e07b7dc 5cd42f6767cdb4b451fc4f8e297dda01 a593b69458210cb28c54e1d4b39ee75c 0314cfeae04a5fe2c53b979688e15fe2 dfb1bc2fafa4eef62911dae18a41f28c -212d48ba08bf3758cd311791838056bb +9d9a893113bfa52b0e1e4434ea304f71 ba79d520b3293c9582b0646a29cf18d1 -56e80512ad1d9bf5e1ea6baa776aa748 -b2a363d7ed5df1e955d8f5703db1ee9a +ee204960e7c9e9f251a6f9c14af0bcaa +54e94d0a2c6da3464fc52793dd31a74b a3ec4dfec292f3fd441f5e5d3010c20f c26a8142ff296d988cfe13332fb14bfc -ab305cce806b6aede7aacb7b0804fecb -d704c39224c814f121dbd4768d18660f -645fac5cb8fe7cb33064128459eafe54 +8181b7cc8039893c7db69f6e35adda51 +e7baf0389ce6728637443d9962e57b83 +99a72eb49507e17b6e1ac9a0239e9690 f7cc76455b53c9fb37c27554ed0967d0 55d24007a85eb0d6649e589f8b7c2a69 351d775a3d652783a5d015060c47a446 a5aff1132e18ab1546a154bcc75b3691 7ddff73aac78b8badf4bdba11cd541d2 7cbeff2cf852ffd059a2371bf23ec176 -d9c8363725cb3312dd3bcd8455939ece +695a5ee4a8341fd08dd10e8ee0c01237 b6600bbd673dc1a967e3d613935b691b -c867458a5c775c30db28c085c83c1af0 -cc7759c6e5d64dd12aa85dfd9d0ff480 +0569afd539a3d7f7b99511cd179cc185 +39bb4828de43b5f2a8155ce7395ffef7 116c07ff8a67e2cdc94c62376e4290aa da0fb653b20f60acb1b32e763c94ee84 8079141a1827f5d200d3df625684982d @@ -10719,55 +10709,55 @@ fab7ad4774c8821b32f59a87368821de ce461eba9060cfd90008040553ae19d8 c19f8ce8e5075509c5203a5344f42c37 -2f730e10e6ff1e342e722e985b54d863 +8e77915c4597f8f884195e93997644d3 338d9c56e6653c910dac441e3a519d25 -001f89497d83b75fd374517b88d782ee +4e9739c5d4dd7d7150093400f77e392e c3e50ad0d4c93692a2810e136ada70d7 2cc2731ed536bf38737bfc2897163b4f -df410eccf21d001f9f5e65da30258122 +ff20e35d737a171fdebff3fffe219596 5d9b7ccd6766e9e943b206c4e288cea8 -244ce95591c641e140899ecf82e3a091 +6134c80e606fc3eeedd5bf6a39c3e77a 545b1414d82cdd476e8d6676161e3103 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 8cd10e297876e0c2d47a576dfcf61a2b 044e22c98deb3d6da5898931cee7224c 599619a98b0411989a763faf1c6ede75 -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec d255ea5b9df613deb7f8f85bc5c93241 -d195ddd5ec7ed1f150a7ee113edc1a6a +249a59e20ad0f29165045c375cf123ca fb330418c81c08843a8ecc7b41911c3e -2b2a2539bf08025ea2794371cb5d5edf +0a95085c8a3f3efcd5a63702b1bf537b 33f2afb3d4f651ff3a4856891f26faa3 d976f528676688719bb4ed9da722c798 -1ec6007e78b7fef3a0c46b285f5345f7 +f28c1d91837eecde379d863333ad3da7 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 5568084ceebffcae386fc1ec48e7ffa8 17da2830504929531702d918d538bece 681bb6760c742ae699ed900dca34241d d91a412e4582686aee55e22120f10420 -081ddaf3beab038b809eb6db2957285e +7b331d712e358d5793e19167ab42d4b9 05a11b19b5162789760c9838a936df75 -eead927af63207df007d30bbefa0bb40 -24076c897f856af4bf47d86d96078688 +74e5138e0485400d0958b5c137a8634e +ab80eb398c1cfa95b56a5b1dc2b7ce7d 5f93e31d32cd99d38e3d59c80b4137ff df979559da6c099664af3c61b83b9e14 -de30767cf0a5d454269ab9986fce13c0 -22fe87d6626de9d7ef505f8997309e1a -4f231e473fa377b7f6cf6b3a778952ea +3b9488c55a6633217590c01acb9c0d8e +58ce4b88e87e271384435fc25c0f8144 +bb6a51f4eb6b3c8f00bfe1cdb89cd76a 5b4aa669a151dc30f4dba6f345177d91 92ac14a3dd5307e6bc4429f625ac3f5b 74f49c52ba746096316a8fabfdd197cb f5c74ffcbb82b66d295e84cb0c11b477 6448daf1b06217c7dc989bed6f3709a2 fb5913e34a812d5fdf9e25b8ca8c9fb2 -3868fe6746505c0449f7ab2550a54795 +5c421382d1ed9e5e1f86f3bea1f29cc9 c57c2471c7a6eddd29d27909cc422e41 -78faa2226aeb9f90e52c0f6239002838 -58c41f60235ea1a5fb3991bc4fa6a24b +34c7fde492170f80fe8e0e6434f3eb0b +bdb86969718f38f7c3ec9d78b8708f02 8cc192424d2a8a3a8439cf6c9e9c866d 228b0316d26bdd36e56a9158eea64ef6 59b195fcff4d3877045fee21c364d524 @@ -10777,55 +10767,55 @@ 449de434949a3e2b8780a87e7b179d3c 3ecfa35141eae057f996daee3608c0c8 d7385726059a0035f5c91a2c1602f235 -98df0b16465e8526f1a34f0e24e1d25b +c04c20e9e0d8940e6a34a3de26975bfc f1f34d8c0f864daa5e8ab56801027430 -4a55e4d7f22e7d44ef5aec63acdadfc6 +5311f11bfb6f48d45b579989963be072 cec5dc207fc9e4399548607def63b953 481d05b63d8ecea12b14c26156a6f286 -a89ac2972c17bd2c21b6e71f900bbefb +2c21e0cc9f70124dd60382c5849d9801 0117e9eb4ec62ae70cdc2cdb032ea4a3 -9c4a32938bb8475020d126dd27add3ea +b81b467bd411968fa82c2154930af428 41cb1b4912e7e63055cc42cd34501683 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 7ad74748bcdbfa3f6d5fade21ad3abaf c97628c3391c9fa7f0628260d579799b 32469a0fb52c4ff01ae369e67964bd6d -e1161971bb06488cabe9066c8e827741 +32d4ac2fc85cd81163d3e5a3877c2c8b e0ec416c7a5ab7c6ec37f1451273a21a -6df07d84b58a137e49213c42629dc6ca -fb330418c81c08843a8ecc7b41911c3e -23fa1196e7e0bf14078a6439fab7debb +d5a61aae8249911d500db5a7b88576fe +081fb0fd1b55ff714d4779e63e4bea77 +ff0350c1a83eb0d283c498b1b915b536 d9b279a5b8b4444c22234eff94697dcb 9a09d0e39657eaa250296b8b7e11a986 -64437501af41e6600d6817c47cc9bf59 +1fcfd5d89b406c6248a629712866e053 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 1a2f787c54fbe6b561fbd776a25872fc 3c474980a7bb1fd8a758009a01992640 b5ac41b2d7993ff82acb9a8358a17202 6177e3c17c2beae1066e42d26b0a921b -587567f577fe01bd0a203203b11e082a +c47b778b31bbc39ddc2c933ad2788575 312e64c5493d745c91c4bf83e3eb0b01 -c3666f4bf323f11ef7117f2952a0d6dd -260f5ff084bfd5c323b9d0cb01a37c18 +b4fa02045bdf797ca90cb154d0ec63fa +5f477631417f724965c004f9434cb18d 57160d6901b4fe33370e429c4cb06aac 04b5877b7648ce36557698aa48eab05e -053842730e380dfddffb45bf4684d34f -37b60d2d094535b36fbb865ba1b4d779 -8bee2c0a737282254675a9452c0d445e +ed7b0a314c45978c41f6c88b54c33268 +70d3b934c48d4fc82f2fe8487b88399e +430c59370c4a7ef39ccaa467e99629b8 27eaeadcf2739876f33c94d429c8a19c 1f2dfe32a45c0cc407b1e41483875c6d 889750973024b5b9ee80157128fdade9 48a054998227d1b323709fd33f76506b 0b2ff41b32ddac3abfdd5615b520392d 4a64102233f5cc6a326d74c738ed1333 -2a0e599244a9d226987f6316bd4470ed -b0056be7d136075c92352bb09ba6db76 -4f46917d26218717d682a103465dd0d4 -fcc762cbe281878d82d7fd73350d5d97 +1ff74927c61de2226faf161f47feaade +4f4e8ced4b1c098a97ac133e3cf16aba +8d499dee22c1b0aa3bcf3aab7b562264 +92d4b14e5af7fc2cd850f1fc26819501 a2176e70d49f029e4ef345e258cabcd2 1ec82f780ad10ccf1017f53ad0a982fb 9a2353991fa9c9eb24f8a542ac8bd396 @@ -10834,57 +10824,57 @@ 29b63a9f892720cd883ad2e1936fcc87 fcf9a22383bc602b4753feb9f2e09129 4468f3a8b5d7713027614c35c4edb4ba -c88f0b05f3446517570cd23270b79c9b -8dcd2c6de97e085c2f3129bbab2ad105 -dcda25012e278d3a5725e260f37fbeeb +ea657fdc5456475fabe2196f5599c26a +627f0cb9b40a5cad12eb3fc54055e34a +d4847efca6fc5676a965a94360258c7a ad72b32fa88b149015f6e9e0f8fd9411 -8fe8a1661fce90674ba71e87e478fb97 +fefdec042c8287c924f7d412433f0b12 59c457c3403be06b525dd7b8c427701b d68cfe7e1c70fc21a50eab0606fb7ea5 -51cb1664bd3521843659cb05fae8a51b +97dc3ecc0046aed1ad5edd25b6b54373 826484beb032b1d93a3741e5607c7070 -e404ca3a2e8446294b1e470e47d53004 +170a3447dec13b5255279d8f9cda7312 2ac1903fa962c3d3b928b911581cf300 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 644d4340e8a233b2490f8f399a60bb16 cbe4722c302b0de603f0a6786b191b85 36b265e2c6ae9a266426658b4646578d -3418d50e2adfabf40c3272735e88bb53 +8e5d65934184f09c60bab131b3eda509 11321835cdb2fefd6e81e49b46e3a283 -494d686e5feeb9726ed87d6d96dbe693 +8bb42b9d4a1756c1109ec7326c82c266 fb330418c81c08843a8ecc7b41911c3e -48d5fbbfba60dc8cf1d182fd728c9283 +4c1b10958aeb625192a7a6c28536e16d 75c36a756bdd4b4625cd7a68a6c9d496 17eae49005c9eb8ec8aacd15dcf38b6b -7bcfc21fdbb79da96f7374f381bae4f9 +8db87c99c9359f086f6bf5bd9eac9827 8fd7ce4aeaf2b3be11f39bf9b2be332b 28de826c00f8408c18c1060cacc44808 015eef4f2ab821df5c61bc738def628f 431b1b78a4a4fafd05d4e0bbc2c47263 5bb64010fefff4ea7f80e1ab6a6e0122 e6d541551ff358ea366fa5705aa03f33 -d6580ceeb4576c2ccb4f78a1a2ec77b8 +c1d953128756a7da01bd104b2d8cb906 553f742a0252568f24b9cc15e948f336 -7952397f4d6f94f800d8c6d06b4067e7 -25750dea41c887e9ea61faa23b1516cd +dca34b43d04a94d319bfa034c531af0f +4b48d7be1eea3640653b4b0dc5efe085 fc591b6dcf00663001336aeb2459e123 539a0357c179e6ed2094b7ca1ebbc344 -ad0d58fc24b771522ca045e1ac65f943 -93a0e71d518587e3bf856496319c775a -521b394ce8ec2f87ae79770ccf5dd58b +340bd8239ef9566f005c8085593e2279 +c0f772041db7e81650e2068587476450 +789184f4b4eac3dd80414fd933797b37 ec4d6fe04de1980f496e9caf6fabe534 0f18fd5af1f9ce788f5053e652842feb bb7be4d52dba41ff906024591864300e 4f3542ab71b20d7d28ae60817b2eb1d5 1d998745c1680fa335fed152b242cca5 a72a089766a7cf669f6b68270ce8f5ab -14aaefd3cb1b4bbfeafd6bef7c185285 +7f8461bf7298a4f3b95a478054c892f3 4146dd4f46253b59caf76dc6970cfb61 -879db84b3a960660b5c1dfb7338234c8 -cf9e4c942d0a11ae766c0fed96b23144 +cdab51cc365677bff479257c690307ef +97b2d586afd72ce6439462b10716bee2 4900f43900b2677888e3f7ec9a376c99 9c8629c3110dac7a00b21c554e869282 607e87ee590ab6b6e3c1f2017f310bb9 @@ -10895,55 +10885,55 @@ b6786821a9641b2e90eb60d1cf955593 29567ae731d5a20740dadb635820c0d7 83da48fa37c40e4f8c5ca323d585e7d9 -233e3c0da4808e32e5bff1b70a00caf7 +d310d10dc4d402c846a3dda26c1fda13 1be24d68eebff59f8a3d55d1d248cdfb -001f89497d83b75fd374517b88d782ee +4e9739c5d4dd7d7150093400f77e392e 9e04b2cd1b93f421705034d5206749d8 2cc2731ed536bf38737bfc2897163b4f -df410eccf21d001f9f5e65da30258122 +ff20e35d737a171fdebff3fffe219596 5d9b7ccd6766e9e943b206c4e288cea8 -3265e4dbbf3e0c99bce19777eb25094b +824ee00230cd20dd50324f22ad2344e8 545b1414d82cdd476e8d6676161e3103 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 8cd10e297876e0c2d47a576dfcf61a2b 044e22c98deb3d6da5898931cee7224c 599619a98b0411989a763faf1c6ede75 -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec d4a0ea69d0b59441b8f0697456cc3140 -d195ddd5ec7ed1f150a7ee113edc1a6a +249a59e20ad0f29165045c375cf123ca fb330418c81c08843a8ecc7b41911c3e -2b2a2539bf08025ea2794371cb5d5edf +0a95085c8a3f3efcd5a63702b1bf537b a9abc615abd8dcb10635fb127bfd511b baf38b4ec10a43d12a333a1c2a28224f -1ec6007e78b7fef3a0c46b285f5345f7 +f28c1d91837eecde379d863333ad3da7 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 5568084ceebffcae386fc1ec48e7ffa8 17da2830504929531702d918d538bece a42be7db361dd5993f28868e4a3f358f d91a412e4582686aee55e22120f10420 -081ddaf3beab038b809eb6db2957285e +7b331d712e358d5793e19167ab42d4b9 05a11b19b5162789760c9838a936df75 -7bc61a1f1daf334bc893dd1f0b05ca37 -844b39f8467ece7a7932e4bfee4bee76 +74e5138e0485400d0958b5c137a8634e +2b8eee0e36e32de0279eb6f59fd579c7 5f93e31d32cd99d38e3d59c80b4137ff df979559da6c099664af3c61b83b9e14 -7ac550b131a480505f0160feb1984344 -8986c14f9db4b7871a5f96050aff82ef -4f231e473fa377b7f6cf6b3a778952ea +3b9488c55a6633217590c01acb9c0d8e +8dbb1e2f5a1ef86eff3672cc4c3cb786 +bb6a51f4eb6b3c8f00bfe1cdb89cd76a 5b4aa669a151dc30f4dba6f345177d91 1ca4e724a542dd90368a4612a878aa7a 07692372f9f22331da5ca1cc604206c4 f5c74ffcbb82b66d295e84cb0c11b477 68633b9a396403744b2f3e762bbf5a19 f326d01ea1f9cb89d96aafdbf65dfcf7 -21bad97ed84232f24a79e21f9f438961 +8df081e6094878f0535027338dfafa8d c57c2471c7a6eddd29d27909cc422e41 -3777bff94a23590b1939610196e43a32 -0015287d927b33b71d654076c2b0773b +d4f924be5a1d7312869b4fc769fbe907 +c621ae31c1038848045b5a54cdef80d1 8cc192424d2a8a3a8439cf6c9e9c866d d32aa2e1c7b5bd07001c90bc13dc7b50 6f225dc643f02ed2509b857ca08a1695 @@ -10954,28 +10944,28 @@ 449de434949a3e2b8780a87e7b179d3c 3ecfa35141eae057f996daee3608c0c8 d7385726059a0035f5c91a2c1602f235 -98df0b16465e8526f1a34f0e24e1d25b +c04c20e9e0d8940e6a34a3de26975bfc f1f34d8c0f864daa5e8ab56801027430 -6cc0c652a67b7a726760dcdc608db98b +a72601b36102fe74a5da294296ed25d6 a7a17bad11811e39b0164573964f3c18 3814711841ff79bfb1bffb653cfde0fb -ce04cd21ab1a71817562e3bfa4207f49 +a3b4d63e077d255c6cf6f57319b42cfa 40da93d7868af1bcee8c47d560dad545 -f7b95693315b045c22b7868e83fa419a +484822ce4f486e645146a1be6dfa1c5f d7a12190e2704590b4523ba5b60dd6b6 d85c3718dd925b2f2749a6293f5cb8a6 6173cfe37fe100bca15d634b617e43ba 3da2d86b46b9f04a99b688e4341d9750 3394594b3b0fd3566c00254fbb89dc74 407ba5abeaf3f08069464027cb52bbba -8c6845892177aee173dbaa73e8cd8ddd +7252bd36ac08f9518f548aa69d88fc86 c314672849f4fb6754bc916bceaa7103 -de693f4543cb9af1e5999b8486f4da41 +af10d52e58cccf9ef9ec405040b3bc9e baa8fc8768d82c06e62f9309cdcdd518 -34b072a62869a2440744c844b1883efe -861dd1133b381989d899332f484cc543 +c7097dc5f0c9eadc72216ef7ab8dfea9 +870fc47eaef3c3972adde5908d4b582a b80c70a4104afbcdddb55fea9a09f703 b2b79aa2d9b051ea649c131c5d7fc69c 1f454c455358e56662f3ddf5e1832a39 @@ -10984,25 +10974,25 @@ fc4ad53fd61f746fe581f447bf76d79e 70e166ce8c734b2c4b6215bef0875c3d 93350f7c0359f3cff6c242f2e5924e3c -21f823c2cd67de9d315e5db41c85aee0 -d62dc162efce8a950de403e522b4657b -e7e60217406bf671e98ae7124f69e8f4 -8fb6625d18bc2283bc2b745f7cfb47f4 +d33bcb7fbfa69a65c95e76933385907f +01f607491907d35587191c4fb9169462 +7c91aa49753eb42b22afa9cc2f91d373 +48e94c383945bbd1041cf1374ab56358 bcaf0ee7ee4ede4c0b11d33262e06913 4508eefc4cbf06183f780a47550b51fd -624f8ffd5c36af2b87a06aee63b17bb0 -88f572d21982792d5393ee999d2c443b -c283b0ba64ed9301e67a9d18923aed60 +421d8650975e65a657de36a0e89bd987 +c9976744983ca5b3a00062185293abaf +d30e629b77caad35ab1bad4a4930bc94 307d48fb06eea97b2818146fbb8929cf bee0636e455ad5d9a8dcc288ac2abb4c 9875bc160f395b95a197ffbb4ac22190 af0368dd00b10198d8770cabebd9e6ed 77def64e09174fe0ebc597e0e0f643da 7b075b656401153b43a2fe09321bcdf1 -d2e91c6a29e54a76ca5b983547d8850c +f8c7c74a5a1f14cb6bfe57e7703379f2 fe7b10789faa1e33034ed5bea8a9520d -73c05b103c926a9cd6f6d4adb14bc0e8 -a0ee07d48296bba0fbe1154d8bf4f292 +791a1575c6fe5bbc51995bd299771d5e +fec9ffcbf2d43061cc0f2cd71d41260a 2bac51be88c59c5ee21511836859e221 0889424a15f7ae4d5147e680d379e3c0 1da322fd765395f75d1bbd0857995779 @@ -11014,55 +11004,55 @@ becd3ff12eb9f1b6de5082ea51c5bf9b ba79a127979def278922a780ad5b1c5b 322469f3805d514f7b1d9c762d6cd232 -a519d93c30b602096b8eb9025f0a0441 +36627e0497fd8aaf39664403ae6daa96 af1f4c3b96562f5bf2f6a74c89f86c30 -301730ddc5a7a3b114fc6ad7ed7bbb4b +452a9821ef1ce8558bbd614701dae135 9e04b2cd1b93f421705034d5206749d8 6d53c83d0c2f41f894615f0efd6c8cc9 -dc118354cf69a5a9d83213658f3dcd93 +da34918d0b1a456b0f5804c7604bc6bc 7abcf80b038ed1d22f9a8025a6576eb7 -c2f264e2d0ffde1e9ffd64015d6882ee +d00f7b831a3a4ee6886a57307c445a55 7519e01ebfaf184e31451303d0fc5faa 83d51da6ce128a36cd2e5d2dbab76ce0 70ba2538054b4121e9e5869a5a611933 5091bcab97706bf0b5ad791622590c58 25ad1618cb45d3588c3e0f8e6944c4da 5048c5e51454ca4696b60c9602346380 -54e556dc87e7e004fc79a780d8a15b5f +c20ab41f5aa4a840ba470dfd3c1721e6 a87a5823097f9b179e9ca41f4df15ff5 -d198da62a38f45957224d91d0bb33871 +39bc7a0d47d973990f7cceaf54eebe9a 5220ad42964fc5e17e0737370f1b02cd -8994f5de93743791446f9e43ce29d16e +bd58aa4fd49df12490b2939804dc014d be9aaca861b2c4ec30707d2afc503f25 87204bb4bc4b2de9530578fce343498a -3e6bd2e8c70356bb4529f497588c3d95 +57a194e6fe07e08d93593ad2afd6222a 1898ba53941f49ece5a58b90fdac3ebd 74acfae0cf773d1140832af7e5667186 b8d00cecdd692f0b6cdbe4957f4ffcf3 95edb6168835f5a622cd7fb18fa665d3 a42be7db361dd5993f28868e4a3f358f 2e649b660a18eb203a07078ca6f0ddb0 -c63461bcd3764df8a686a5a17087c1b7 +f7a45f1637139cc5d99a4ae6e7d505e8 c590c3f7bd0bc1c8991c0b7f173d46cd -7bc61a1f1daf334bc893dd1f0b05ca37 -edce79cf3df5bc7d0df0017ec94811ed +bc42bdb14826011d606a142a4e116bc3 +fa802c1dfdd44a7ecb89c77d60838a9a 5b4959ed0c32ed6a409144c78c8b9fb4 54ce90907c5b76dfccd2b3ce0eb7bcbc -deb9e5e980af806b4cdb486e1f6dc295 -2789e50ea7509c174142c258d1165c88 -2a07790ed7e677fcc256d2460e5590f4 +8560f8e577caef690e5546fec123b76c +bf1988713292dc8e6133795d8fde1b0f +0c909a51481d661330ed83a8f0d6a5fa be52ecc505ea2cd13064e83f28eead68 1ca4e724a542dd90368a4612a878aa7a a114ac6eecd4701929fe3fd8f172dee5 e17132c2639ccf18dab581736d16ab19 a7af99484311ff510f4378fe059ed4b5 f326d01ea1f9cb89d96aafdbf65dfcf7 -b1a1a60d95cd68deeb4cb45550dc804c +55feaae249a847ccaa0432b7c84bb41b 45045a9eec7c672c032ec3f2697cf63c -c2e1993c06302b75188c19cbcc1f2f15 -1b352ca85acfb0a6ca7ec47574221626 +10c76b7bdf44361e8c5a37855d450a9c +387ae164057bda4a65b16b3d4da03026 0ad67108567f99662f7dabc9585331da 9e73e48da807bd19ea533c4e65a2e6c7 31b983b50ce8d8e45c4d311797756dce @@ -11073,16 +11063,17 @@ 1c69f14e9f4dfa446476883fe9faf925 369ab954165562248ee42ab33e6b12a0 2772e4b190f0ac3a3de994f9edf10074 -2db7fe18b1200b7eb75af0c44f79edbf +7538088f7af45b9a359a090b9bd18121 56d8a0b2df579f5cead684b83fdef191 -c294d42b0c532a0d0ed0ecd75b2da20f -02b4f98405e26fe54399ae5cf3d8e884 -dc9564fc481ddd3101734b4e01c40027 -5b5402436d2e5525c68fe96889c8628b -14b937be198fc9c37d706a131f110c68 -538ab10324a9a151d1944f94b590e3e2 +503179eef2a75e444e6ed540ab5816af +875e0a4fbf2f9e739dd18dd9787966a9 +28f44c26afebd0f551578f04045c6496 +6230437ad4adfb173f89c5c9b1cd3301 +b2ee3e61485fdeb685fc7f73bf802b23 +7d6b8f45303f24ad769fb402b9416bb5 +9ed2bf9282af9c376568885348569e87 eb0d31b8fe30bfb4b4a2cac24e104c61 @@ -11093,54 +11084,55 @@ e70e0c0be5993759f867484624b7270f -9f5ba8d00d619d312d40c07f38b35c6e +9f8505322412399b5acbf5ee73337eab +3fd084ee76aa52b4e20b601babbb11cb -001f89497d83b75fd374517b88d782ee +4e9739c5d4dd7d7150093400f77e392e c3e50ad0d4c93692a2810e136ada70d7 2cc2731ed536bf38737bfc2897163b4f -fd49f158c63c1e262131727166661df4 +d2920c2ffdac4cb2905142099ba74fe8 5d9b7ccd6766e9e943b206c4e288cea8 -e7cbb3f5347a6186501681bdbda58f9e +1f17d66cf1563e4c46196516bcc73b42 545b1414d82cdd476e8d6676161e3103 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 55b226d18eb7824edad5050c3090b348 044e22c98deb3d6da5898931cee7224c 599619a98b0411989a763faf1c6ede75 -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec d255ea5b9df613deb7f8f85bc5c93241 -d195ddd5ec7ed1f150a7ee113edc1a6a +249a59e20ad0f29165045c375cf123ca fb330418c81c08843a8ecc7b41911c3e -2b2a2539bf08025ea2794371cb5d5edf +0a95085c8a3f3efcd5a63702b1bf537b 89d74d9cd7885c8ceaba6f9a15ec3589 d976f528676688719bb4ed9da722c798 -1ec6007e78b7fef3a0c46b285f5345f7 +f28c1d91837eecde379d863333ad3da7 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 5568084ceebffcae386fc1ec48e7ffa8 17da2830504929531702d918d538bece 681bb6760c742ae699ed900dca34241d d91a412e4582686aee55e22120f10420 -081ddaf3beab038b809eb6db2957285e +7b331d712e358d5793e19167ab42d4b9 05a11b19b5162789760c9838a936df75 -eead927af63207df007d30bbefa0bb40 -24076c897f856af4bf47d86d96078688 +74e5138e0485400d0958b5c137a8634e +ab80eb398c1cfa95b56a5b1dc2b7ce7d 5f93e31d32cd99d38e3d59c80b4137ff df979559da6c099664af3c61b83b9e14 -7ac550b131a480505f0160feb1984344 -22fe87d6626de9d7ef505f8997309e1a -4f231e473fa377b7f6cf6b3a778952ea +3b9488c55a6633217590c01acb9c0d8e +58ce4b88e87e271384435fc25c0f8144 +bb6a51f4eb6b3c8f00bfe1cdb89cd76a 5b4aa669a151dc30f4dba6f345177d91 92ac14a3dd5307e6bc4429f625ac3f5b 07692372f9f22331da5ca1cc604206c4 f5c74ffcbb82b66d295e84cb0c11b477 4e186ea8084c33de3fec3182f57150ec fb5913e34a812d5fdf9e25b8ca8c9fb2 -3868fe6746505c0449f7ab2550a54795 +5c421382d1ed9e5e1f86f3bea1f29cc9 c57c2471c7a6eddd29d27909cc422e41 -87aea5e86e2ac2e10e0f98c23a552640 -ab667e6064cd5ecf206e86210ef81994 +33ac9fc2bc7ea230d394ac0b811677c7 +19e964a00e47d79e98eac8e4e3cfe3dd 8cc192424d2a8a3a8439cf6c9e9c866d 3122c8015a2583d254fbdead8e4fde52 c95d9dd5cdb6d9a6824a6bdbefb48531 @@ -11151,55 +11143,55 @@ 449de434949a3e2b8780a87e7b179d3c 3ecfa35141eae057f996daee3608c0c8 d7385726059a0035f5c91a2c1602f235 -98df0b16465e8526f1a34f0e24e1d25b +c04c20e9e0d8940e6a34a3de26975bfc f1f34d8c0f864daa5e8ab56801027430 -f67efb48f1c66c4a32a71e6f70f49b7d +df295d90be1a982bfcf7cf01c641aa75 9e04b2cd1b93f421705034d5206749d8 2cc2731ed536bf38737bfc2897163b4f -ed09fddf882d9beadb8043fa20872c5b +4b408813ba07c4aaf7494a0dce45db2b 58d8a88c479e8ef6bfe376130f2d7fd7 -46100ab9de7bbd18588c7d8bff0b7eb2 +bf0bfe2c95f6532f0440971af8572697 545b1414d82cdd476e8d6676161e3103 83d51da6ce128a36cd2e5d2dbab76ce0 f2a97948d26385dbf048ef0cf2c525d7 d1a443d8f9c8f096368d1d3871ad69e2 044e22c98deb3d6da5898931cee7224c 599619a98b0411989a763faf1c6ede75 -e1161971bb06488cabe9066c8e827741 +9074eff322d7513a6589a181dfc089ec d255ea5b9df613deb7f8f85bc5c93241 -73cdaf1b551687a5a117792c1f128fcc +8b4845bccbb06c9c8d6870a50486ac45 fb330418c81c08843a8ecc7b41911c3e -4e48bd3662bd4f3d43cac92e7796d89c +8f385289997f3f192b47d00582f52c24 06b696eb0e3787682befe68fb70ea395 87204bb4bc4b2de9530578fce343498a -1ec6007e78b7fef3a0c46b285f5345f7 +f28c1d91837eecde379d863333ad3da7 1898ba53941f49ece5a58b90fdac3ebd 7353c73dcba6a3beb03620ccb68802b3 5568084ceebffcae386fc1ec48e7ffa8 17da2830504929531702d918d538bece a42be7db361dd5993f28868e4a3f358f 6debf0d0e4964cc8c9e574386a87e036 -6f5383381ed0ddbf7be82d2bd8e158d6 +3ccfaadb5ee1a1c4fe90a33682336ba6 05a11b19b5162789760c9838a936df75 -7bc61a1f1daf334bc893dd1f0b05ca37 -24076c897f856af4bf47d86d96078688 +74e5138e0485400d0958b5c137a8634e +ab80eb398c1cfa95b56a5b1dc2b7ce7d 5f93e31d32cd99d38e3d59c80b4137ff df979559da6c099664af3c61b83b9e14 -7ac550b131a480505f0160feb1984344 -22fe87d6626de9d7ef505f8997309e1a -4f231e473fa377b7f6cf6b3a778952ea +3b9488c55a6633217590c01acb9c0d8e +58ce4b88e87e271384435fc25c0f8144 +bb6a51f4eb6b3c8f00bfe1cdb89cd76a 5b4aa669a151dc30f4dba6f345177d91 1ca4e724a542dd90368a4612a878aa7a 07692372f9f22331da5ca1cc604206c4 589333633b6d1adbabfd86f078697ed1 309215b54637ec841c73ad9cb60c92c2 f326d01ea1f9cb89d96aafdbf65dfcf7 -3868fe6746505c0449f7ab2550a54795 +5c421382d1ed9e5e1f86f3bea1f29cc9 e0ba51b98a7560425f1296e931803c92 -fd5f5dbca99d9cd162b36d466d05397d -22a55c993f07ee610d137edab7539923 +8f91213f34f0244a5160d7e826d145c2 +c88e3c2e66b2d80b141a1e0bbc1e002b 3c262e53abae368513df941815512cac 3122c8015a2583d254fbdead8e4fde52 5b30fbe3329f2544372a731e50272392 @@ -11210,7 +11202,7 @@ 449de434949a3e2b8780a87e7b179d3c 3ecfa35141eae057f996daee3608c0c8 392d29d07b9eecdc15f88bbade3f4553 -98df0b16465e8526f1a34f0e24e1d25b +c04c20e9e0d8940e6a34a3de26975bfc 5e857db1c2b2f3c5b49fd68ef1fbad23 @@ -11229,7 +11221,7 @@ adf4d0f538de7decd6b3e4c5140c159a -5b06c4c900114c4ce894c39022aad38f +c8c27baf9e354f8b070f18500c4b9896 d41d8cd98f00b204e9800998ecf8427e @@ -11250,7 +11242,7 @@ d41d8cd98f00b204e9800998ecf8427e -5fbf322b32b161612161d4fdfcca5749 +6a9c570caec888fedf9faa0032a902a8 f30fdf4ab338c390c86e1617a5426e0f @@ -11260,7 +11252,7 @@ d41d8cd98f00b204e9800998ecf8427e -170e38a1cefb8b8ddb43d563dcf06f9f +aef2c07fde9b49868ac5cfeb890e3c3d d41d8cd98f00b204e9800998ecf8427e @@ -11889,7 +11881,7 @@ d41d8cd98f00b204e9800998ecf8427e -05f5994a4740a525f681f2da3778400e +4e96b9d5e319317867034cb5d44d7edf d41d8cd98f00b204e9800998ecf8427e @@ -12156,7 +12148,7 @@ d41d8cd98f00b204e9800998ecf8427e -6079976684703359a26c4544f46ea8c4 +1fbe45ac17223930f63f72b33108f3be d41d8cd98f00b204e9800998ecf8427e @@ -12430,7 +12422,7 @@ d41d8cd98f00b204e9800998ecf8427e -068fcbee3df8f8886aadbd76bdf937af +01232047a4537a7eca790bf2e64eac10 d41d8cd98f00b204e9800998ecf8427e @@ -12660,7 +12652,7 @@ d41d8cd98f00b204e9800998ecf8427e -0903d36e5451be75a51d379ad4d4fb9b +f2668d60b62d550468381be65ed1630d d41d8cd98f00b204e9800998ecf8427e @@ -12904,7 +12896,7 @@ d41d8cd98f00b204e9800998ecf8427e -0f5f369eab5868128d08085572f6a912 +454717ceabbc959f7902beb3903f011e d41d8cd98f00b204e9800998ecf8427e @@ -13231,13 +13223,13 @@ 11689e5722e4204b9d01e5e4483b92ef -7529966db8d111e5c265262581e19e1e +08938fc6d6d375cf72fb4a9e14b1f3c2 a20a84fb09238e216ab80d91674426b1 d41d8cd98f00b204e9800998ecf8427e -4b94e9ad89c520b4cc4ab986a1cfb5f8 -86af0ee60c4aae4f6efeef2a521a0039 +bc3aa842090496571e579929dbb67946 +20d05f87e3dcc4cc34783e807d53af33 70c0bcc71422c17305e134929089ed0a @@ -13245,7 +13237,7 @@ 353d0788a1b27e81a7c62446ca190de1 24ec433a2020143f3a634ff9bf695024 5e1aea18f899b4a763a0291dcf1f2b90 -b2c7012ed8f4226c6fda016a3ea1aff3 +3d9e24b7399dffbfbd97e4e63efb30b6 9dd4c109f77db954d5afcb20d5af9e4c @@ -13259,12 +13251,12 @@ 24b8f65ab4a24ff8241b8af469928f75 -e876e30d4e723313b9e22fc158a80117 +faee7623b7d24024c8f024cf8d523736 7770e9e8e3fb4b98bc149059c5bc9633 d41d8cd98f00b204e9800998ecf8427e -094b73de61eaad218343e1183fe4a67a +88b846ea65a9fba4dc31bbf408820f24 7b7cde9c324feeed6e94f50e1655ba40 @@ -13282,7 +13274,7 @@ 0b959ec99ed9ee63f065c7d40454b9ec -178dc806a0546aacf323c2bd61b0b6fd +f406b3b391eb6648f00807bbfd3ecaec d41d8cd98f00b204e9800998ecf8427e @@ -13325,7 +13317,7 @@ c8794336eba88e9ce0af56f8b5cded4d - + 7c7d00777d21ed95c127af574c6ec4dc 391071254a71e5fe29f6a22cbfc27543 From a9a3c3b97f37fe83fd0f77c3e3c9b7f0c381d139 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 11 Oct 2015 19:47:47 +0200 Subject: [PATCH 091/297] Exclude file from sources. It is generated when building package. --- htdocs/install/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 htdocs/install/.gitignore diff --git a/htdocs/install/.gitignore b/htdocs/install/.gitignore new file mode 100644 index 0000000000000..7e55df64ce765 --- /dev/null +++ b/htdocs/install/.gitignore @@ -0,0 +1 @@ +/filelist.xml From df39a1054e0a4a74f4ae89fa69ad0b3d5b5c346c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 11 Oct 2015 20:19:52 +0200 Subject: [PATCH 092/297] Fix 3.8.1 --- ChangeLog | 68 ++++++++++++++++++++++++++++++++++++++++ build/makepack-howto.txt | 8 +++-- 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index adf616485b8cb..119db9f9c9185 100644 --- a/ChangeLog +++ b/ChangeLog @@ -9,6 +9,74 @@ Upgrading to any other version or any other database system is abolutely require make a Dolibarr upgrade. +***** ChangeLog for 3.8.1 compared to 3.8.0 ***** +FIX: #3521 postgresql migration error +FIX: #3524 +FIX: #3529 +FIX: #3530 +FIX: #3533 +FIX: #3533 Load categories language +FIX: #3534 +FIX: #3572 Impossible to attach project in order +FIX: #3599 Not saving legal form +FIX: #3606 +FIX: #3607 Better categories setting and unsetting +FIX: #3628 +FIX: #3630 - Wrong balance report when module salaries and donation disabled +FIX: Add a test to save life when ref of object (invoice ref, order ref, ...) was empty. The was no way to go back to a clean situation, even after vaidating again the object. +FIX: Admin fiche inter page do not take good action +FIX: Always use type send in parameters in showCategories method +FIX: avoid SQL error in getValueFrom common object when all params are not send +FIX: avoid SQL error when no sortfield send to method +FIX: bad link into project box +FIX: Bad title line in project view when using jmobile +FIX: Bad translation key for project "Overview" +FIX: Can create Proposal on close thridparty #3526 +FIX: Can't change state on a contact +FIX: Can't change the admin with default setup +FIX: Can't delete thirdparty if there is some discounts +FIX: Can't reopen a canceled invoice. +FIX: Creation of tables or keys must not be done with a random order. +FIX: debian install when module mysqli is not installed. +FIX: Description of tags was mandatory in edit mode but not in create mode. Should not be mandatory. +FIX: display error on extrafields on ficheinter +FIX: Email selector contact must not include inactive contact +FIX: error in SQL due to a previous fix +FIX: Error retrieving customer prices +FIX: Event from ical stream should not be movable into calendar view +FIX: facturestat bad sql when customer view is limited +FIX: Filter on status of thirdparty list and bad encoding of url +FIX: icon into export profile may be not correctly output +FIX: Init into bad var +FIX: Link of project must be cickable if user has permission to read all projects FIX: Missing information into the alt of project picto +FIX: List of project for user that are restrited as sale repreentative to some thirdparties. +FIX: Mass Mailing activity don't display all status +FIX: Missing contracts into list in page of Refering objects of a thirdparty. +FIX: Missing menu entry for list of thirdparties when using auguria menu manager +FIX: Missing validate button if permission are not valid. +FIX: New adherent from, always redirect on entity +FIX: not closing CSS. +FIX: not responsive part for project page +FIX: Only are showing one object linked +FIX: order ref must not be translated +FIX: Payment form for paypal and paybox was not centered. +FIX: Pb into pagination scroll widget FIX: Style of previous-next card when using dolidroid +FIX: Regression on bad use of fk_account showing the bad bank account on PDF. +FIX: Removed warnings +FIX: remove twice same test +FIX: select of project using ajax autocomplete option +FIX: sortder field was missing so manually added values were moved to begin. +FIX: Syntax error in Debian Apache configuration +FIX: The admin flag is mising. +FIX: The filter on thirdparty prices should be visible if there is at least one thirdparty price. +FIX: Thirdparty is missing on card +FIX: update2.php test res befre assign it +FIX: When delete actioncomm also delete actioncomm_resources +FIX: when editing time spent, date of line suggested was a rubbish value +FIX: When filter with empty status, by default get canceled status (-1) +FIX: When update a member login for a member linked to a user, the login of user was not sync (not updated). +FIX: Wizard for restore does not show import command + ***** ChangeLog for 3.8 compared to 3.7.* ***** For users: FIX: #2519 diff --git a/build/makepack-howto.txt b/build/makepack-howto.txt index 813db9bb4b8ca..953e207d28dc3 100644 --- a/build/makepack-howto.txt +++ b/build/makepack-howto.txt @@ -8,7 +8,9 @@ This files describe steps made by Dolibarr packaging team to make a beta version of Dolibarr, step by step. - Check all files are commited. -- Update version/info in ChangeLog. To generate a changelog, you can do "git log `git merge-base 3.7.0 origin/develop`.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa" +- Update version/info in ChangeLog. +To generate a changelog of a major new version x.y.0, you can do "cd ~/git/dolibarr_x.y; git log `git merge-base x-1.y-1.0 origin/develop`.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa" +To generate a changelog of a maintenance version x.y.z, you can do "cd ~/git/dolibarr_x.y; git log `git merge-base x.y.z-1 origin/develop`.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa" - Update version number with x.y.z-w in htdocs/filefunc.inc.php - Commit all changes. @@ -28,7 +30,9 @@ This files describe steps made by Dolibarr packaging team to make a complete release of Dolibarr, step by step. - Check all files are commited. -- Update version/info in ChangeLog. To generate a changelog, you can do "git log `git merge-base 3.7.0 origin/develop`.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa" +- Update version/info in ChangeLog. +To generate a changelog of a major new version x.y.0, you can do "cd ~/git/dolibarr_x.y; git log `git merge-base x-1.y-1.0 origin/develop`.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa" +To generate a changelog of a maintenance version x.y.z, you can do "cd ~/git/dolibarr_x.y; git log `git merge-base x.y.z-1 origin/develop`.. --no-merges --pretty=short --oneline | sed -e "s/^[0-9a-z]* //" | grep -e '^FIX\|NEW' | sort -u | sed 's/FIXED:/FIX:/g' | sed 's/FIXED :/FIX:/g' | sed 's/FIX :/FIX:/g' | sed 's/FIX /FIX: /g' | sed 's/NEW :/NEW:/g' | sed 's/NEW /NEW: /g' > /tmp/aaa" - Update version number with x.y.z in htdocs/filefunc.inc.php - Commit all changes. From e6e4f0500d330b921fa7b1b1c0efc9bdea838a96 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 11 Oct 2015 20:32:24 +0200 Subject: [PATCH 093/297] Update changelog --- ChangeLog | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0b6a4a5b87133..fb67d07ec43ed 100644 --- a/ChangeLog +++ b/ChangeLog @@ -13,8 +13,9 @@ make a Dolibarr upgrade. WARNING: Following changes may create regression for some external modules, but were necessary to make Dolibarr better: -- Deprecated hidden option MAIN_USE_CUSTOM_TRANSLATION has been removed. Use MAIN_OVERWRITE_TRANS_xx_YY instead. - +- Deprecated hidden option MAIN_USE_CUSTOM_TRANSLATION has been removed. Use table llx_overwrite_trans instead. +- Trigger LINECONTRACT_INSERT has been renamed into LINECONTRACT_CREATE to match common denomination. + ***** ChangeLog for 3.8 compared to 3.7.* ***** For users: From 80bd563fdee8ed6ac2c3dbf3380cbf33465b76bf Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 11 Oct 2015 20:41:06 +0200 Subject: [PATCH 094/297] Use GETPOST --- htdocs/core/actions_sendmails.inc.php | 2 +- htdocs/fourn/commande/card.php | 2 +- htdocs/fourn/facture/card.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/actions_sendmails.inc.php b/htdocs/core/actions_sendmails.inc.php index 67458fd401d7a..a4e83a0fd59cb 100644 --- a/htdocs/core/actions_sendmails.inc.php +++ b/htdocs/core/actions_sendmails.inc.php @@ -56,7 +56,7 @@ $upload_dir_tmp = $vardir.'/temp'; // TODO Delete only files that was uploaded from email form - dol_remove_file_process($_POST['removedfile'],0); + dol_remove_file_process(GETPOST('removedfile','alpha'),0); $action='presend'; } diff --git a/htdocs/fourn/commande/card.php b/htdocs/fourn/commande/card.php index d69c86eb1eac3..ef2eb339bfda9 100644 --- a/htdocs/fourn/commande/card.php +++ b/htdocs/fourn/commande/card.php @@ -1083,7 +1083,7 @@ $upload_dir_tmp = $vardir.'/temp'; // TODO Delete only files that was uploaded from email form - dol_remove_file_process($_POST['removedfile'],0); + dol_remove_file_process(GETPOST('removedfile','alpha'),0); $action='presend'; } diff --git a/htdocs/fourn/facture/card.php b/htdocs/fourn/facture/card.php index 5a54cc84068fd..fc4dea2115623 100644 --- a/htdocs/fourn/facture/card.php +++ b/htdocs/fourn/facture/card.php @@ -917,7 +917,7 @@ $upload_dir_tmp = $vardir.'/temp'; // TODO Delete only files that was uploaded from email form - dol_remove_file_process($_POST['removedfile'],0); + dol_remove_file_process(GETPOST('removedfile','alpha'),0); $action='presend'; } From 87fad70f4a7c6989983d6a519517b95a2f0c5725 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 11 Oct 2015 20:42:49 +0200 Subject: [PATCH 095/297] Revert "FIX no need to remove file into mail form" --- htdocs/core/lib/files.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index a4e26f116efd8..bcc6c165472f5 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -1115,7 +1115,7 @@ function dol_add_file_process($upload_dir, $allowoverwrite=0, $donotupdatesessio * @param int $donotdeletefile 1=Do not delete physically file * @return void */ -function dol_remove_file_process($filenb,$donotupdatesession=0,$donotdeletefile=1) +function dol_remove_file_process($filenb,$donotupdatesession=0,$donotdeletefile=0) { global $db,$user,$conf,$langs,$_FILES; From 618e5f04193592a1189cd47c03b44bac014c730e Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sun, 11 Oct 2015 20:47:31 +0200 Subject: [PATCH 096/297] FIX no need to remove file into mail form #3573 --- htdocs/core/lib/files.lib.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index 2f49b37f71611..aa804cf125572 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -1516,7 +1516,7 @@ function dol_add_file_process($upload_dir, $allowoverwrite=0, $donotupdatesessio * @param int $donotdeletefile 1=Do not delete physically file * @return void */ -function dol_remove_file_process($filenb,$donotupdatesession=0,$donotdeletefile=0) +function dol_remove_file_process($filenb,$donotupdatesession=0,$donotdeletefile=1) { global $db,$user,$conf,$langs,$_FILES; From 2857d7cfdaedd0e0d77ff1211c13e314d283aa3e Mon Sep 17 00:00:00 2001 From: aspangaro Date: Sun, 11 Oct 2015 21:00:41 +0200 Subject: [PATCH 097/297] Correct --- htdocs/hrm/class/establishment.class.php | 40 ++++++++++++------------ htdocs/hrm/establishment/card.php | 26 +++++++-------- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/htdocs/hrm/class/establishment.class.php b/htdocs/hrm/class/establishment.class.php index dccb2d6d37efd..c5ba77fd54716 100644 --- a/htdocs/hrm/class/establishment.class.php +++ b/htdocs/hrm/class/establishment.class.php @@ -40,7 +40,7 @@ class Establishment extends CommonObject var $address; var $zip; var $town; - var $statut; // 0=open, 1=closed + var $status; // 0=open, 1=closed var $entity; var $statuts=array(); @@ -82,7 +82,7 @@ function create($user) $sql.= ", address"; $sql.= ", zip"; $sql.= ", town"; - $sql.= ", statut"; + $sql.= ", status"; $sql.= ", entity"; $sql.= ", datec"; $sql.= ", fk_user_author"; @@ -91,7 +91,7 @@ function create($user) $sql.= ", '".$this->address."'"; $sql.= ", '".$this->zip."'"; $sql.= ", '".$this->town."'"; - $sql.= ", ".$this->statut; + $sql.= ", ".$this->status; $sql.= ", ".$conf->entity; $sql.= ", '".$this->db->idate($now)."'"; $sql.= ", ". $user->id; @@ -148,7 +148,7 @@ function update($user) $sql .= ", address = '".$this->address."'"; $sql .= ", zip = '".$this->zip."'"; $sql .= ", town = '".$this->town."'"; - $sql .= ", statut = '".$this->statut."'"; + $sql .= ", status = '".$this->status."'"; $sql .= ", fk_user_mod = " . $user->id; $sql .= " WHERE rowid = ".$this->id; @@ -172,7 +172,7 @@ function update($user) */ function fetch($id) { - $sql = "SELECT rowid, name, address, zip, town, statut"; + $sql = "SELECT rowid, name, address, zip, town, status"; $sql.= " FROM ".MAIN_DB_PREFIX."establishment"; $sql.= " WHERE rowid = ".$id; @@ -187,7 +187,7 @@ function fetch($id) $this->address = $obj->address; $this->zip = $obj->zip; $this->town = $obj->town; - $this->statut = $obj->statut; + $this->status = $obj->status; return 1; } @@ -231,49 +231,49 @@ function delete($id) * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto * @return string Label */ - function getLibStatut($mode=0) + function getLibStatus($mode=0) { - return $this->LibStatut($this->statut,$mode); + return $this->LibStatus($this->status,$mode); } /** * Give a label from a status * - * @param int $statut Id status + * @param int $status Id status * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto * @return string Label */ - function LibStatut($statut,$mode=0) + function LibStatus($status,$mode=0) { global $langs; if ($mode == 0) { - return $langs->trans($this->statuts[$statut]); + return $langs->trans($this->statuts[$status]); } if ($mode == 1) { - return $langs->trans($this->statuts_short[$statut]); + return $langs->trans($this->statuts_short[$status]); } if ($mode == 2) { - if ($statut==0) return img_picto($langs->trans($this->statuts_short[$statut]),'statut4').' '.$langs->trans($this->statuts_short[$statut]); - if ($statut==1) return img_picto($langs->trans($this->statuts_short[$statut]),'statut8').' '.$langs->trans($this->statuts_short[$statut]); + if ($status==0) return img_picto($langs->trans($this->statuts_short[$status]),'status4').' '.$langs->trans($this->statuts_short[$status]); + if ($status==1) return img_picto($langs->trans($this->statuts_short[$status]),'status8').' '.$langs->trans($this->statuts_short[$status]); } if ($mode == 3) { - if ($statut==0 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut4'); - if ($statut==1 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut8'); + if ($status==0 && ! empty($this->statuts_short[$status])) return img_picto($langs->trans($this->statuts_short[$status]),'status4'); + if ($status==1 && ! empty($this->statuts_short[$status])) return img_picto($langs->trans($this->statuts_short[$status]),'status8'); } if ($mode == 4) { - if ($statut==0 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut4').' '.$langs->trans($this->statuts[$statut]); - if ($statut==1 && ! empty($this->statuts_short[$statut])) return img_picto($langs->trans($this->statuts_short[$statut]),'statut8').' '.$langs->trans($this->statuts[$statut]); + if ($status==0 && ! empty($this->statuts_short[$status])) return img_picto($langs->trans($this->statuts_short[$status]),'status4').' '.$langs->trans($this->statuts[$status]); + if ($status==1 && ! empty($this->statuts_short[$status])) return img_picto($langs->trans($this->statuts_short[$status]),'status8').' '.$langs->trans($this->statuts[$status]); } if ($mode == 5) { - if ($statut==0 && ! empty($this->statuts_short[$statut])) return $langs->trans($this->statuts_short[$statut]).' '.img_picto($langs->trans($this->statuts_short[$statut]),'statut4'); - if ($statut==1 && ! empty($this->statuts_short[$statut])) return $langs->trans($this->statuts_short[$statut]).' '.img_picto($langs->trans($this->statuts_short[$statut]),'statut8'); + if ($status==0 && ! empty($this->statuts_short[$status])) return $langs->trans($this->statuts_short[$status]).' '.img_picto($langs->trans($this->statuts_short[$status]),'status4'); + if ($status==1 && ! empty($this->statuts_short[$status])) return $langs->trans($this->statuts_short[$status]).' '.img_picto($langs->trans($this->statuts_short[$status]),'status8'); } } diff --git a/htdocs/hrm/establishment/card.php b/htdocs/hrm/establishment/card.php index 3df1e1cf3d60e..533ad5117ffc9 100644 --- a/htdocs/hrm/establishment/card.php +++ b/htdocs/hrm/establishment/card.php @@ -38,13 +38,13 @@ $confirm = GETPOST('confirm','alpha'); $id = GETPOST('id','int'); -// List of statut -static $tmpstatut2label=array( +// List of status +static $tmpstatus2label=array( '0'=>'OpenEtablishment', '1'=>'CloseEtablishment' ); -$statut2label=array(''); -foreach ($tmpstatut2label as $key => $val) $statut2label[$key]=$langs->trans($val); +$status2label=array(''); +foreach ($tmpstatus2label as $key => $val) $status2label[$key]=$langs->trans($val); $object = new Establishment($db); @@ -93,7 +93,7 @@ $object->zip = GETPOST('zipcode', 'alpha'); $object->town = GETPOST('town', 'alpha'); $object->fk_pays = $object->country_id; - $object->statut = GETPOST('statut','int'); + $object->status = GETPOST('status','int'); $object->fk_user_author = $user->id; $object->datec = dol_now(); @@ -234,11 +234,11 @@ print '
    '; - print $form->selectarray('statut',$statut2label,GETPOST('statut')); + print $form->selectarray('status',$status2label,GETPOST('status')); print '
    '; @@ -311,9 +311,9 @@ print '
    '; - print $form->selectarray('statut',$statut2label,$object->statut); + // Status + print '
    '; + print $form->selectarray('status',$status2label,$object->status); print '
    '; @@ -382,8 +382,8 @@ print '
    '.getCountry($object->fk_pays,1).'
    '.$langs->trans("Status").''.$object->getLibStatut(4).'
    '.$langs->trans("Status").''.$object->getLibStatus(4).'
    "; From ddb23eaf3bbfca0b67683f40f640b1c0738cafa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Mon, 12 Oct 2015 15:25:36 +0200 Subject: [PATCH 098/297] [Qual] Use default data root path if no conf Installation can be protected by an install.lock file in the data root path. This protection was ineffective if no configuration file was available. Whith this change, it still searches the default path. --- htdocs/install/inc.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/install/inc.php b/htdocs/install/inc.php index e5ad6f019a14e..82e9a3dfeaa26 100644 --- a/htdocs/install/inc.php +++ b/htdocs/install/inc.php @@ -86,7 +86,7 @@ if (empty($dolibarr_main_db_port) && ($dolibarr_main_db_type=='mysqli' || $dolibarr_main_db_type=='mysql')) $dolibarr_main_db_port='3306'; // For backward compatibility // Clean parameters - $dolibarr_main_data_root =isset($dolibarr_main_data_root)?trim($dolibarr_main_data_root):''; + $dolibarr_main_data_root =isset($dolibarr_main_data_root)?trim($dolibarr_main_data_root):DOL_DOCUMENT_ROOT . '/../documents'; $dolibarr_main_url_root =isset($dolibarr_main_url_root)?trim($dolibarr_main_url_root):''; $dolibarr_main_url_root_alt =isset($dolibarr_main_url_root_alt)?trim($dolibarr_main_url_root_alt):''; $dolibarr_main_document_root =isset($dolibarr_main_document_root)?trim($dolibarr_main_document_root):''; @@ -133,7 +133,7 @@ define('MAIN_DB_PREFIX',(isset($dolibarr_main_db_prefix)?$dolibarr_main_db_prefix:'')); define('DOL_CLASS_PATH', 'class/'); // Filsystem path to class dir -define('DOL_DATA_ROOT',(isset($dolibarr_main_data_root)?$dolibarr_main_data_root:'')); +define('DOL_DATA_ROOT',(isset($dolibarr_main_data_root)?$dolibarr_main_data_root:DOL_DOCUMENT_ROOT . '/../documents')); define('DOL_MAIN_URL_ROOT', (isset($dolibarr_main_url_root)?$dolibarr_main_url_root:'')); // URL relative root $uri=preg_replace('/^http(s?):\/\//i','',constant('DOL_MAIN_URL_ROOT')); // $uri contains url without http* $suburi = strstr($uri, '/'); // $suburi contains url without domain From 0251728e286a99f5f013f878c9872dde0fbcabf7 Mon Sep 17 00:00:00 2001 From: Alexis Algoud Date: Mon, 12 Oct 2015 17:36:24 +0200 Subject: [PATCH 099/297] FIX double db escape add too quote --- htdocs/product/stock/class/entrepot.class.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/htdocs/product/stock/class/entrepot.class.php b/htdocs/product/stock/class/entrepot.class.php index b65c01f684093..2b1b368ef8cd6 100644 --- a/htdocs/product/stock/class/entrepot.class.php +++ b/htdocs/product/stock/class/entrepot.class.php @@ -135,14 +135,14 @@ function create($user) */ function update($id, $user) { - $this->libelle=$this->db->escape(trim($this->libelle)); - $this->description=$this->db->escape(trim($this->description)); + $this->libelle=trim($this->libelle); + $this->description=trim($this->description); - $this->lieu=$this->db->escape(trim($this->lieu)); + $this->lieu=trim($this->lieu); - $this->address=$this->db->escape(trim($this->address)); - $this->zip=$this->zip?trim($this->zip):trim($this->zip); - $this->town=$this->town?trim($this->town):trim($this->town); + $this->address=trim($this->address); + $this->zip=trim($this->zip); + $this->town=trim($this->town); $this->country_id=($this->country_id > 0 ? $this->country_id : $this->country_id); $sql = "UPDATE ".MAIN_DB_PREFIX."entrepot "; From 8aaa1993c6b1107db00a180d6c36dbc6aa14fa2a Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Tue, 13 Oct 2015 09:37:33 +0200 Subject: [PATCH 100/297] FIX : #3724 Bug: Blank page after cloning proposal with changed client --- htdocs/comm/propal/class/propal.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index b818de76a0e26..69f36c8313621 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -1063,7 +1063,7 @@ function createFromClone($socid=0) { global $db, $user,$langs,$conf,$hookmanager; - dol_include_once('/projet/class.project.class.php'); + dol_include_once('/projet/class/project.class.php'); $this->context['createfromclone']='createfromclone'; From 918d9b7c181584bf266a54160530fa44d3b401df Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 13 Oct 2015 12:05:24 +0200 Subject: [PATCH 101/297] Fix filter was lost if nothing found --- htdocs/commande/list.php | 14 +++++++++----- htdocs/compta/facture/mergepdftool.php | 2 +- htdocs/core/lib/company.lib.php | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/htdocs/commande/list.php b/htdocs/commande/list.php index 29d58eaf46759..19fd113138a92 100644 --- a/htdocs/commande/list.php +++ b/htdocs/commande/list.php @@ -307,7 +307,7 @@ print_liste_field_titre($langs->trans('RefCustomerOrder'),$_SERVER["PHP_SELF"],'c.ref_client','',$param,'',$sortfield,$sortorder); print_liste_field_titre($langs->trans('Company'),$_SERVER["PHP_SELF"],'s.nom','',$param,'',$sortfield,$sortorder); print_liste_field_titre($langs->trans('OrderDate'),$_SERVER["PHP_SELF"],'c.date_commande','',$param, 'align="center"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans('DeliveryDate'),$_SERVER["PHP_SELF"],'c.date_livraison','',$param, 'align="center"',$sortfield,$sortorder); + if (empty($conf->global->ORDER_DISABLE_DELIVERY_DATE)) print_liste_field_titre($langs->trans('DeliveryDate'),$_SERVER["PHP_SELF"],'c.date_livraison','',$param, 'align="center"',$sortfield,$sortorder); print_liste_field_titre($langs->trans('AmountHT'),$_SERVER["PHP_SELF"],'c.total_ht','',$param, 'align="right"',$sortfield,$sortorder); $parameters=array(); $reshook=$hookmanager->executeHooks('printFieldListTitle',$parameters); // Note that $action and $object may have been modified by hook @@ -330,11 +330,15 @@ if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; print ''; $formother->select_year($orderyear?$orderyear:-1,'orderyear',1, 20, 5); - print ''; - if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; - print ''; - $formother->select_year($deliveryyear?$deliveryyear:-1,'deliveryyear',1, 20, 5); print ''; + if (empty($conf->global->ORDER_DISABLE_DELIVERY_DATE)) + { + print ''; + if (! empty($conf->global->MAIN_LIST_FILTER_ON_DAY)) print ''; + print ''; + $formother->select_year($deliveryyear?$deliveryyear:-1,'deliveryyear',1, 20, 5); + print ''; + } print ''; print ''; print ''; diff --git a/htdocs/compta/facture/mergepdftool.php b/htdocs/compta/facture/mergepdftool.php index b78b31d1a02f6..9745f4b1b0105 100644 --- a/htdocs/compta/facture/mergepdftool.php +++ b/htdocs/compta/facture/mergepdftool.php @@ -49,7 +49,7 @@ $month = GETPOST("month","int"); $year = GETPOST("year","int"); $filter = GETPOST("filtre"); -if (GETPOST('button_search')) +if (GETPOST('button_search') || GETPOST('button_search.x') || GETPOST('button_search_x')) { $filter=GETPOST('filtre',2); //if ($filter != 'payed:0') $option=''; diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php index 565078a9d3bc9..19f32cbfa88c9 100644 --- a/htdocs/core/lib/company.lib.php +++ b/htdocs/core/lib/company.lib.php @@ -647,7 +647,7 @@ function show_contacts($conf,$langs,$db,$object,$backtopage='') $num = $db->num_rows($result); $var=true; - if ($num) + if ($num || (GETPOST('button_search') || GETPOST('button_search.x') || GETPOST('button_search_x'))) { print ''; // Name - Position From a84ec64ece7c1eb2bbb45fc1bfc980cd1fec362b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 13 Oct 2015 13:06:32 +0200 Subject: [PATCH 102/297] The new banner tab is available on all tabs of thirdparty. --- htdocs/comm/card.php | 43 ++----------- htdocs/comm/remise.php | 49 +++++++-------- htdocs/comm/remx.php | 46 +++++++------- htdocs/core/lib/company.lib.php | 20 +++--- htdocs/core/tpl/notes.tpl.php | 6 +- htdocs/fourn/card.php | 38 ++--------- htdocs/langs/en_US/products.lang | 1 + htdocs/societe/agenda.php | 51 +++------------ htdocs/societe/commerciaux.php | 81 ++++++++++-------------- htdocs/societe/consumption.php | 13 ++-- htdocs/societe/document.php | 18 +++--- htdocs/societe/note.php | 19 +++--- htdocs/societe/notify/card.php | 17 ++--- htdocs/societe/price.php | 94 ++++++++++----------------- htdocs/societe/rib.php | 82 ++++++++++++++---------- htdocs/societe/soc.php | 101 +----------------------------- htdocs/societe/societecontact.php | 20 +++--- htdocs/theme/eldy/style.css.php | 9 ++- 18 files changed, 249 insertions(+), 459 deletions(-) diff --git a/htdocs/comm/card.php b/htdocs/comm/card.php index a916467671620..a44a79da1f061 100644 --- a/htdocs/comm/card.php +++ b/htdocs/comm/card.php @@ -218,17 +218,15 @@ dol_fiche_head($head, 'customer', $langs->trans("ThirdParty"),0,'company'); + dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); + print '
    '; - + print '
    '; print ''; - print ''; - // Alias name (commercial, trademark or alias name) - print '"; @@ -264,39 +262,6 @@ print ''; } - // Address - print '"; - - // Zip / Town - print ''; - print '"; - print ''; - - // Country - print ''; - - // EMail - print ''; - - // Web - print ''; - - // Phone - print ''; - - // Fax - print ''; - // Skype if (! empty($conf->skype->enabled)) { diff --git a/htdocs/comm/remise.php b/htdocs/comm/remise.php index ea9e1382d4065..0edcdcd0c1d05 100644 --- a/htdocs/comm/remise.php +++ b/htdocs/comm/remise.php @@ -52,9 +52,9 @@ if (GETPOST("action") == 'setremise') { - $soc = New Societe($db); - $soc->fetch($_GET["id"]); - $result=$soc->set_remise_client($_POST["remise"],$_POST["note"],$user); + $object = new Societe($db); + $object->fetch($_GET["id"]); + $result=$object->set_remise_client($_POST["remise"],$_POST["note"],$user); if ($result > 0) { @@ -71,7 +71,7 @@ } else { - setEventMessage($soc->error, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } @@ -93,51 +93,50 @@ if ($socid > 0) { // On recupere les donnees societes par l'objet - $objsoc = new Societe($db); - $objsoc->id=$socid; - $objsoc->fetch($socid); + $object = new Societe($db); + $object->fetch($socid); - $head = societe_prepare_head($objsoc); + $head = societe_prepare_head($object); - print ''; + print ''; print ''; print ''; print ''; dol_fiche_head($head, 'relativediscount', $langs->trans("ThirdParty"),0,'company'); - - print '
    '.$langs->trans("ThirdPartyName").''; - print $form->showrefnav($object,'socid','',($user->societe_id?0:1),'rowid','nom','',''); - print '
    '.$langs->trans('AliasNameShort').''; + print '
    '.$langs->trans('AliasNameShort').''; print $object->name_alias; print "
    '.$langs->trans('Address').''; - dol_print_address($object->address,'gmap','thirdparty',$object->id); - print "
    '.$langs->trans('Zip').' / '.$langs->trans('Town').''.$object->zip.(($object->zip && $object->town)?' / ':'').$object->town."
    '.$langs->trans("Country").''; - if (! empty($object->country_code)) - { - //$img=picto_from_langcode($object->country_code); - $img=''; - if ($object->isInEEC()) print $form->textwithpicto(($img?$img.' ':'').$object->country,$langs->trans("CountryIsInEEC"),1,0); - else print ($img?$img.' ':'').$object->country; - } - print '
    '.$langs->trans('EMail').''.dol_print_email($object->email,0,$object->id,'AC_EMAIL').'
    '.$langs->trans("Web").''.dol_print_url($object->url,'_blank').'
    '.$langs->trans('Phone').''.dol_print_phone($object->phone,$object->country_code,0,$object->id,'AC_TEL').''.$langs->trans('Fax').''.dol_print_phone($object->fax,$object->country_code,0,$object->id,'AC_FAX').'
    '; - - // Name - print ''; - print ''; + dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); + + print '
    '; + + print '
    '; + print '
    '.$langs->trans('Name').''; - print $form->showrefnav($objsoc,'id','',1,'rowid','nom'); - print '
    '; // Remise - print '"; + print '"; print '
    '; - print $langs->trans("CustomerRelativeDiscount").''.price2num($objsoc->remise_percent)."%
    '; + print $langs->trans("CustomerRelativeDiscount").''.price2num($object->remise_percent)."%
    '; print '
    '; print load_fiche_titre($langs->trans("NewRelativeDiscount"),'',''); - print ''; + print '
    '; // Nouvelle valeur - print ''; + print ''; // Motif/Note - print ''; + print ''; print "
    '; - print $langs->trans("NewValue").'%
    '; + print $langs->trans("NewValue").'%
    '; - print $langs->trans("NoteReason").'
    '; + print $langs->trans("NoteReason").'
    "; + print '
    '; + dol_fiche_end(); print '
    '; @@ -160,7 +159,7 @@ $sql = "SELECT rc.rowid, rc.remise_client as remise_percent, rc.note, rc.datec as dc,"; $sql.= " u.login, u.rowid as user_id"; $sql.= " FROM ".MAIN_DB_PREFIX."societe_remise as rc, ".MAIN_DB_PREFIX."user as u"; - $sql.= " WHERE rc.fk_soc =". $objsoc->id; + $sql.= " WHERE rc.fk_soc =". $object->id; $sql.= " AND u.rowid = rc.fk_user_author"; $sql.= " ORDER BY rc.datec DESC"; diff --git a/htdocs/comm/remx.php b/htdocs/comm/remx.php index 957f109268abf..9b764ad1c8f57 100644 --- a/htdocs/comm/remx.php +++ b/htdocs/comm/remx.php @@ -36,7 +36,7 @@ $backtopage=GETPOST('backtopage','alpha'); // Security check -$socid = GETPOST('id','int'); +$socid = GETPOST('id','int')?GETPOST('id','int'):GETPOST('socid','int'); if ($user->societe_id > 0) { $socid = $user->societe_id; @@ -212,36 +212,34 @@ if ($socid > 0) { // On recupere les donnees societes par l'objet - $objsoc = new Societe($db); - $objsoc->id=$socid; - $objsoc->fetch($socid); + $object = new Societe($db); + $object->fetch($socid); /* * Affichage onglets */ - $head = societe_prepare_head($objsoc); + $head = societe_prepare_head($object); - print ''; + print ''; print ''; print ''; print ''; dol_fiche_head($head, 'absolutediscount', $langs->trans("ThirdParty"),0,'company'); - print ''; - - // Name - print ''; - print ''; + dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); + + print '
    '; + + print '
    '; + print '
    '.$langs->trans('Name').''; - print $form->showrefnav($objsoc,'id','',1,'rowid','nom'); - print '
    '; // Calcul avoirs en cours $remise_all=$remise_user=0; $sql = "SELECT SUM(rc.amount_ht) as amount, rc.fk_user"; $sql.= " FROM ".MAIN_DB_PREFIX."societe_remise_except as rc"; - $sql.= " WHERE rc.fk_soc =". $objsoc->id; + $sql.= " WHERE rc.fk_soc =". $object->id; $sql.= " AND (fk_facture_line IS NULL AND fk_facture IS NULL)"; $sql.= " GROUP BY rc.fk_user"; $resql=$db->query($sql); @@ -256,7 +254,7 @@ dol_print_error($db); } - print ''; + print ''; print ''; print ''; @@ -271,13 +269,15 @@ print ' '.$langs->trans("Currency".$conf->currency).''; print ''; print ''; print ''; print ''; print "
    '.$langs->trans("CustomerAbsoluteDiscountAllUsers").'
    '.$langs->trans("CustomerAbsoluteDiscountAllUsers").''.$remise_all.' '.$langs->trans("Currency".$conf->currency).' '.$langs->trans("HT").'
    '.$langs->trans("CustomerAbsoluteDiscountMy").'
    '.$langs->trans("VAT").''; - print $form->load_tva('tva_tx',GETPOST('tva_tx'),$mysoc,$objsoc); + print $form->load_tva('tva_tx',GETPOST('tva_tx'),$mysoc,$object); print '
    '.$langs->trans("NoteReason").'
    "; + print '
    '; + dol_fiche_end(); print '
    '; @@ -296,7 +296,7 @@ if ($_GET['action'] == 'remove') { - print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$objsoc->id.'&remid='.$_GET["remid"], $langs->trans('RemoveDiscount'), $langs->trans('ConfirmRemoveDiscount'), 'confirm_remove', '', 0, 1); + print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&remid='.$_GET["remid"], $langs->trans('RemoveDiscount'), $langs->trans('ConfirmRemoveDiscount'), 'confirm_remove', '', 0, 1); } /* @@ -309,7 +309,7 @@ $sql.= " fa.facnumber as ref, fa.type as type"; $sql.= " FROM ".MAIN_DB_PREFIX."user as u, ".MAIN_DB_PREFIX."societe_remise_except as rc"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."facture as fa ON rc.fk_facture_source = fa.rowid"; - $sql.= " WHERE rc.fk_soc =". $objsoc->id; + $sql.= " WHERE rc.fk_soc =". $object->id; $sql.= " AND u.rowid = rc.fk_user"; $sql.= " AND (rc.fk_facture_line IS NULL AND rc.fk_facture IS NULL)"; $sql.= " ORDER BY rc.datec DESC"; @@ -375,9 +375,9 @@ if ($user->rights->societe->creer || $user->rights->facture->creer) { print ''; - print 'rowid.'">'.img_picto($langs->trans("SplitDiscount"),'split').''; + print 'rowid.'">'.img_picto($langs->trans("SplitDiscount"),'split').''; print '   '; - print 'rowid.'">'.img_delete($langs->trans("RemoveDiscount")).''; + print 'rowid.'">'.img_delete($langs->trans("RemoveDiscount")).''; print ''; } else print ' '; @@ -403,7 +403,7 @@ array('type' => 'text', 'name' => 'amount_ttc_2', 'label' => $langs->trans("AmountTTC").' 2', 'value' => $amount2, 'size' => '5') ); $langs->load("dict"); - print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$objsoc->id.'&remid='.$showconfirminfo['rowid'], $langs->trans('SplitDiscount'), $langs->trans('ConfirmSplitDiscount',price($showconfirminfo['amount_ttc']),$langs->transnoentities("Currency".$conf->currency)), 'confirm_split', $formquestion, 0, 0); + print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id.'&remid='.$showconfirminfo['rowid'], $langs->trans('SplitDiscount'), $langs->trans('ConfirmSplitDiscount',price($showconfirminfo['amount_ttc']),$langs->transnoentities("Currency".$conf->currency)), 'confirm_split', $formquestion, 0, 0); } } else @@ -429,7 +429,7 @@ $sql.= " , ".MAIN_DB_PREFIX."facturedet as fc"; $sql.= " , ".MAIN_DB_PREFIX."societe_remise_except as rc"; $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."facture as fa ON rc.fk_facture_source = fa.rowid"; - $sql.= " WHERE rc.fk_soc =". $objsoc->id; + $sql.= " WHERE rc.fk_soc =". $object->id; $sql.= " AND rc.fk_facture_line = fc.rowid"; $sql.= " AND fc.fk_facture = f.rowid"; $sql.= " AND rc.fk_user = u.rowid"; @@ -446,7 +446,7 @@ $sql2.= " , ".MAIN_DB_PREFIX."user as u"; $sql2.= " , ".MAIN_DB_PREFIX."societe_remise_except as rc"; $sql2.= " LEFT JOIN ".MAIN_DB_PREFIX."facture as fa ON rc.fk_facture_source = fa.rowid"; - $sql2.= " WHERE rc.fk_soc =". $objsoc->id; + $sql2.= " WHERE rc.fk_soc =". $object->id; $sql2.= " AND rc.fk_facture = f.rowid"; $sql2.= " AND rc.fk_user = u.rowid"; diff --git a/htdocs/core/lib/company.lib.php b/htdocs/core/lib/company.lib.php index 19f32cbfa88c9..86c5f717f4b67 100644 --- a/htdocs/core/lib/company.lib.php +++ b/htdocs/core/lib/company.lib.php @@ -58,6 +58,16 @@ function societe_prepare_head(Societe $object) $head[$h][2] = 'customer'; $h++; } + if (($object->client==1 || $object->client==2 || $object->client==3) && (! empty($conf->global->PRODUIT_CUSTOMER_PRICES))) + { + $langs->load("products"); + // price + $head[$h][0] = DOL_URL_ROOT.'/societe/price.php?socid='.$object->id; + $head[$h][1] = $langs->trans("CustomerPrices"); + $head[$h][2] = 'price'; + $h++; + } + if (! empty($conf->fournisseur->enabled) && $object->fournisseur && ! empty($user->rights->fournisseur->lire)) { $head[$h][0] = DOL_URL_ROOT.'/fourn/card.php?socid='.$object->id; @@ -169,16 +179,6 @@ function societe_prepare_head(Societe $object) $h++; } - if (($object->client==1 || $object->client==2 || $object->client==3) && (! empty ( $conf->global->PRODUIT_CUSTOMER_PRICES ))) - { - $langs->load("products"); - // price - $head[$h][0] = DOL_URL_ROOT.'/societe/price.php?socid='.$object->id; - $head[$h][1] = $langs->trans("CustomerPrices"); - $head[$h][2] = 'price'; - $h++; - } - // Log $head[$h][0] = DOL_URL_ROOT.'/societe/info.php?socid='.$object->id; $head[$h][1] = $langs->trans("Info"); diff --git a/htdocs/core/tpl/notes.tpl.php b/htdocs/core/tpl/notes.tpl.php index 5773d7ce9d872..8400e0210d404 100644 --- a/htdocs/core/tpl/notes.tpl.php +++ b/htdocs/core/tpl/notes.tpl.php @@ -21,7 +21,7 @@ $note_public = 'note_public'; $note_private = 'note_private'; -$colwidth=(isset($colwidth)?$colwidth:25); +$colwidth=(isset($colwidth)?$colwidth:(empty($cssclass)?'25':'')); $permission=(isset($permission)?$permission:(isset($user->rights->$module->creer)?$user->rights->$module->creer:0)); // If already defined by caller page $moreparam=(isset($moreparam)?$moreparam:''); @@ -69,12 +69,12 @@
    -
    >editfieldkey("NotePublic", $note_public, $value_public, $object, $permission, $typeofdata, $moreparam); ?>
    +
    >editfieldkey("NotePublic", $note_public, $value_public, $object, $permission, $typeofdata, $moreparam); ?>
    editfieldval("NotePublic", $note_public, $value_public, $object, $permission, $typeofdata, '', null, null, $moreparam); ?>
    societe_id)) { ?>
    -
    >editfieldkey("NotePrivate", $note_private, $value_private, $object, $permission, $typeofdata, $moreparam); ?>
    +
    >editfieldkey("NotePrivate", $note_private, $value_private, $object, $permission, $typeofdata, $moreparam); ?>
    editfieldval("NotePrivate", $note_private, $value_private, $object, $permission, $typeofdata, '', null, null, $moreparam); ?>
    diff --git a/htdocs/fourn/card.php b/htdocs/fourn/card.php index 55993221d41d8..805fe3071156d 100644 --- a/htdocs/fourn/card.php +++ b/htdocs/fourn/card.php @@ -131,16 +131,15 @@ dol_fiche_head($head, 'supplier', $langs->trans("ThirdParty"),0,'company'); - + dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); + print '
    '; + print '
    '; print ''; - print ''; // Alias names (commercial, trademark or alias names) - print '"; @@ -168,35 +167,6 @@ print ''; } - // Address - print ''; - - // Zip / Town - print ''; - print ''; - - // Country - print ''; - - // EMail - print ''; - - // Web - print ''; - - // Phone - print ''; - - // Fax - print ''; - // Assujetti a TVA ou pas print ''; print '
    '.$langs->trans("ThirdPartyName").''; - print $form->showrefnav($object,'socid','',($user->societe_id?0:1),'rowid','nom','',''); - print '
    '.$langs->trans('AliasNameShort').''; + print '
    '.$langs->trans('AliasNameShort').''; print $object->name_alias; print "
    '.$langs->trans("Address").''; - dol_print_address($object->address,'gmap','thirdparty',$object->id); - print '
    '.$langs->trans("Zip").' / '.$langs->trans("Town").''.$object->zip.(($object->zip && $object->town)?' / ':'').$object->town.'
    '.$langs->trans("Country").''; - //$img=picto_from_langcode($object->country_code); - $img=''; - if ($object->isInEEC()) print $form->textwithpicto(($img?$img.' ':'').$object->country,$langs->trans("CountryIsInEEC"),1,0); - else print ($img?$img.' ':'').$object->country; - print '
    '.$langs->trans('EMail').''.dol_print_email($object->email,0,$object->id,'AC_EMAIL').'
    '.$langs->trans("Web").''.dol_print_url($object->url).'
    '.$langs->trans("Phone").''.dol_print_phone($object->phone,$object->country_code,0,$object->id,'AC_TEL').''.$langs->trans("Fax").''.dol_print_phone($object->fax,$object->country_code,0,$object->id,'AC_FAX').'
    '.$langs->trans('VATIsUsed').''; diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang index ee1b32084ff5d..ac04c689df457 100644 --- a/htdocs/langs/en_US/products.lang +++ b/htdocs/langs/en_US/products.lang @@ -101,6 +101,7 @@ CorrectStock=Correct stock AddPhoto=Add photo ListOfStockMovements=List of stock movements BuyingPrice=Buying price +PriceForEachProduct=Products with specific prices SupplierCard=Supplier card CommercialCard=Commercial card AllWays=Path to find your product in stock diff --git a/htdocs/societe/agenda.php b/htdocs/societe/agenda.php index 847c23c671913..b35715ce1ab43 100644 --- a/htdocs/societe/agenda.php +++ b/htdocs/societe/agenda.php @@ -80,14 +80,15 @@ dol_fiche_head($head, 'agenda', $langs->trans("ThirdParty"),0,'company'); - print ''; - - print ''; + dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); + + print '
    '; + + print '
    '; + print '
    '.$langs->trans("ThirdPartyName").''; - print $form->showrefnav($object,'socid','',($user->societe_id?0:1),'rowid','nom'); - print '
    '; // Alias names (commercial, trademark or alias names) - print '"; @@ -114,47 +115,11 @@ print ''; } - if (! empty($conf->barcode->enabled)) - { - print ''; - } - - print ""; - - // Zip / Town - print '"; - print '"; - - // Country - if ($object->country) { - print ''; - } - - // EMail - print ''; - - // Web - print ''; - - // Phone / Fax - print ''; - print ''; - print '
    '.$langs->trans('AliasNames').''; + print '
    '.$langs->trans('AliasNames').''; print $object->name_alias; print "
    '.$langs->trans('Gencod').''.$object->barcode.'
    ".$langs->trans('Address').""; - dol_print_address($object->address, 'gmap', 'thirdparty', $object->id); - print "
    '.$langs->trans('Zip').''.$object->zip."'.$langs->trans('Town').''.$object->town."
    '.$langs->trans('Country').''; - //$img=picto_from_langcode($object->country_code); - $img=''; - print ($img?$img.' ':''); - print $object->country; - print '
    '.$langs->trans('EMail').''; - print dol_print_email($object->email,0,$object->id,'AC_EMAIL'); - print '
    '.$langs->trans('Web').''; - print dol_print_url($object->url); - print '
    '.$langs->trans('Phone').''.dol_print_phone($object->phone,$object->country_code,0,$object->id,'AC_TEL').''.$langs->trans('Fax').''.dol_print_phone($object->fax,$object->country_code,0,$object->id,'AC_FAX').'
    '; print ''; + dol_fiche_end(); /* * Barre d'action diff --git a/htdocs/societe/commerciaux.php b/htdocs/societe/commerciaux.php index 05679cef5bb22..12a1612ab1df7 100644 --- a/htdocs/societe/commerciaux.php +++ b/htdocs/societe/commerciaux.php @@ -33,7 +33,7 @@ $langs->load("banks"); // Security check -$socid = isset($_GET["socid"])?$_GET["socid"]:''; +$socid = GETPOST("socid"); if ($user->societe_id) $socid=$user->societe_id; $result = restrictedArea($user, 'societe','',''); @@ -50,18 +50,18 @@ if ($user->rights->societe->creer) { - $soc = new Societe($db); - $soc->id = $_GET["socid"]; - $soc->fetch($_GET["socid"]); + $object = new Societe($db); + $object->id = $_GET["socid"]; + $object->fetch($_GET["socid"]); $parameters=array('id'=>$_GET["commid"]); - $reshook=$hookmanager->executeHooks('doActions',$parameters,$soc,$action); // Note that $action and $object may have been modified by some hooks + $reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); - if (empty($reshook)) $soc->add_commercial($user, $_GET["commid"]); + if (empty($reshook)) $object->add_commercial($user, $_GET["commid"]); - header("Location: commerciaux.php?socid=".$soc->id); + header("Location: commerciaux.php?socid=".$object->id); exit; } else @@ -71,23 +71,23 @@ } } -if($_GET["socid"] && $_GET["delcommid"]) +if ($socid && $_GET["delcommid"]) { $action = 'delete'; if ($user->rights->societe->creer) { - $soc = new Societe($db); - $soc->id = $_GET["socid"]; - $soc->fetch($_GET["socid"]); + $object = new Societe($db); + $object->id = $_GET["socid"]; + $object->fetch($_GET["socid"]); $parameters=array('id'=>$_GET["delcommid"]); - $reshook=$hookmanager->executeHooks('doActions',$parameters,$soc,$action); // Note that $action and $object may have been modified by some hooks + $reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); - if (empty($reshook)) $soc->del_commercial($user, $_GET["delcommid"]); + if (empty($reshook)) $object->del_commercial($user, $_GET["delcommid"]); - header("Location: commerciaux.php?socid=".$soc->id); + header("Location: commerciaux.php?socid=".$object->id); exit; } else @@ -107,63 +107,44 @@ $form = new Form($db); -if ($_GET["socid"]) +if ($socid) { - $soc = new Societe($db); - $soc->id = $_GET["socid"]; - $result=$soc->fetch($_GET["socid"]); + $object = new Societe($db); + $result=$object->fetch($socid); $action='view'; - $head=societe_prepare_head2($soc); + $head=societe_prepare_head2($object); dol_fiche_head($head, 'salesrepresentative', $langs->trans("ThirdParty"),0,'company'); - /* - * Fiche societe en mode visu - */ + dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); + + print '
    '; - print ''; - - print ''; - print ''; + print '
    '; + print '
    '.$langs->trans('ThirdPartyName').''; - print $form->showrefnav($soc,'socid','',($user->societe_id?0:1),'rowid','nom'); - print '
    '; print ''; - print 'global->SOCIETE_USEPREFIX)?' colspan="3"':'').'>'; - print $soc->code_client; - if ($soc->check_codeclient() <> 0) print ' '.$langs->trans("WrongCustomerCode"); + print 'global->SOCIETE_USEPREFIX)?' colspan="3"':'').'>'; + print $object->code_client; + if ($object->check_codeclient() <> 0) print ' '.$langs->trans("WrongCustomerCode"); print ''; if (! empty($conf->global->SOCIETE_USEPREFIX)) // Old not used prefix field { - print ''; + print ''; } print ''; print ''; - print ""; - - print '"; - print '"; - - print ''; - - print ''; - print ''; - - print ''; - // Liste les commerciaux - print ''; + print ''; print '
    '.$langs->trans('CustomerCode').''.$langs->trans('CustomerCode').''.$langs->trans('Prefix').''.$soc->prefix_comm.''.$langs->trans('Prefix').''.$object->prefix_comm.'
    ".$langs->trans('Address')."".nl2br($soc->address)."
    '.$langs->trans('Zip').''.$soc->zip."'.$langs->trans('Town').''.$soc->town."
    '.$langs->trans('Country').''.$soc->country.'
    '.$langs->trans('Phone').''.dol_print_phone($soc->phone,$soc->country_code,0,$soc->id,'AC_TEL').''.$langs->trans('Fax').''.dol_print_phone($soc->fax,$soc->country_code,0,$soc->id,'AC_FAX').'
    '.$langs->trans('Web').''; - if ($soc->url) { print 'http://'.$soc->url.''; } - print '
    '.$langs->trans("SalesRepresentatives").'
    '.$langs->trans("SalesRepresentatives").''; $sql = "SELECT u.rowid, u.lastname, u.firstname"; $sql .= " FROM ".MAIN_DB_PREFIX."user as u"; $sql .= " , ".MAIN_DB_PREFIX."societe_commerciaux as sc"; - $sql .= " WHERE sc.fk_soc =".$soc->id; + $sql .= " WHERE sc.fk_soc =".$object->id; $sql .= " AND sc.fk_user = u.rowid"; $sql .= " ORDER BY u.lastname ASC "; dol_syslog('societe/commerciaux.php::list salesman sql = '.$sql,LOG_DEBUG); @@ -177,7 +158,7 @@ { $obj = $db->fetch_object($resql); - $parameters=array('socid'=>$soc->id); + $parameters=array('socid'=>$object->id); $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$obj,$action); // Note that $action and $object may have been modified by hook if (empty($reshook)) { @@ -210,6 +191,8 @@ print '
    '; print "
    \n"; + + dol_fiche_end(); if ($user->rights->societe->creer && $user->rights->societe->client->voir) diff --git a/htdocs/societe/consumption.php b/htdocs/societe/consumption.php index e075f67cdafcc..e6207782e9c98 100644 --- a/htdocs/societe/consumption.php +++ b/htdocs/societe/consumption.php @@ -116,14 +116,15 @@ $head = societe_prepare_head($object); dol_fiche_head($head, 'consumption', $langs->trans("ThirdParty"),0,'company'); +dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); + +print '
    '; + +print '
    '; print ''; -print ''; -print ''; // Alias names (commercial, trademark or alias names) -print ''; +print ''; print ''; if (! empty($conf->global->SOCIETE_USEPREFIX)) // Old not used prefix field @@ -173,6 +174,8 @@ } print '
    '.$langs->trans('ThirdPartyName').''; -print $form->showrefnav($object,'socid','',($user->societe_id?0:1),'rowid','nom'); -print '
    '.$object->name_alias.'
    '; +print '
    '; + dol_fiche_end(); print '
    '; diff --git a/htdocs/societe/document.php b/htdocs/societe/document.php index f1961e02b2d29..2c951ed86709c 100644 --- a/htdocs/societe/document.php +++ b/htdocs/societe/document.php @@ -109,17 +109,15 @@ $totalsize+=$file['size']; } - - print ''; - - // Ref - print ''; - print ''; + dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); + + print '
    '; + + print '
    '; + print '
    '.$langs->trans("ThirdPartyName").''; - print $form->showrefnav($object,'socid','',($user->societe_id?0:1),'rowid','nom'); - print '
    '; // Alias names (commercial, trademark or alias names) - print '"; @@ -155,6 +153,8 @@ print '
    '.$langs->trans('AliasNames').''; + print '
    '.$langs->trans('AliasNames').''; print $object->name_alias; print "
    '; + print ''; + dol_fiche_end(); $modulepart = 'societe'; diff --git a/htdocs/societe/note.php b/htdocs/societe/note.php index c7db3b6664567..ceb5fa6eac51f 100644 --- a/htdocs/societe/note.php +++ b/htdocs/societe/note.php @@ -75,15 +75,15 @@ print ''; print ''; - print ''; - - print ''; - print ''; + dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); + + print '
    '; + + print '
    '; + print '
    '.$langs->trans('ThirdPartyName').''; - print $form->showrefnav($object,'socid','',($user->societe_id?0:1),'rowid','nom'); - print '
    '; // Alias names (commercial, trademark or alias names) - print '"; @@ -112,9 +112,12 @@ print "
    '.$langs->trans('AliasNames').''; + print '
    '.$langs->trans('AliasNames').''; print $object->name_alias; print "
    "; + print ''; + print '
    '; - $colwidth='25'; + //$colwidth='25'; + $cssclass='titlefield'; include DOL_DOCUMENT_ROOT.'/core/tpl/notes.tpl.php'; diff --git a/htdocs/societe/notify/card.php b/htdocs/societe/notify/card.php index 483c156907a06..1b85cf36ab7a4 100644 --- a/htdocs/societe/notify/card.php +++ b/htdocs/societe/notify/card.php @@ -142,15 +142,15 @@ dol_fiche_head($head, 'notify', $langs->trans("ThirdParty"),0,'company'); - - print ''; - - print ''; + dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); + + print '
    '; + + print '
    '; + print '
    '.$langs->trans("ThirdPartyName").''; - print $form->showrefnav($object,'socid','',($user->societe_id?0:1),'rowid','nom'); - print '
    '; // Alias names (commercial, trademark or alias names) - print '"; @@ -186,6 +186,8 @@ print ''; print '
    '.$langs->trans('AliasNames').''; + print '
    '.$langs->trans('AliasNames').''; print $object->name_alias; print "
    '; + print ''; + dol_fiche_end(); // Help @@ -248,6 +250,7 @@ print '
    '; + print ''; print '
    '; diff --git a/htdocs/societe/price.php b/htdocs/societe/price.php index 20805502c1144..fd41c276bf2f6 100644 --- a/htdocs/societe/price.php +++ b/htdocs/societe/price.php @@ -120,90 +120,58 @@ $form = new Form($db); -$soc = new Societe($db); +$object = new Societe($db); -$result = $soc->fetch($socid); +$result = $object->fetch($socid); llxHeader("", $langs->trans("ThirdParty") . '-' . $langs->trans('PriceByCustomer')); if (! empty($conf->notification->enabled)) $langs->load("mails"); -$head = societe_prepare_head($soc); +$head = societe_prepare_head($object); dol_fiche_head($head, 'price', $langs->trans("ThirdParty"), 0, 'company'); -print ''; +dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); + +print '
    '; -print '
    '; +print '
    '; +print '
    ' . $langs->trans("ThirdPartyName") . ''; -print $form->showrefnav($soc, 'socid', '', ($user->societe_id ? 0 : 1), 'rowid', 'nom'); -print '
    '; // Alias names (commercial, trademark or alias names) -print '"; if (! empty($conf->global->SOCIETE_USEPREFIX)) // Old not used prefix field { - print ''; + print ''; } -if ($soc->client) { +if ($object->client) { print ''; } -if ($soc->fournisseur) { +if ($object->fournisseur) { print ''; } -if (! empty($conf->barcode->enabled)) { - print ''; -} - -print ""; - -// Zip / Town -print '"; -print '"; - -// Country -if ($soc->country) { - print ''; -} - -// EMail -print ''; - -// Web -print ''; - -// Phone / Fax -print ''; -print ''; - print '
    '.$langs->trans('AliasNames').''; -print $soc->name_alias; +print '
    '.$langs->trans('AliasNames').''; +print $object->name_alias; print "
    ' . $langs->trans('Prefix') . '' . $soc->prefix_comm . '
    ' . $langs->trans('Prefix') . '' . $object->prefix_comm . '
    '; print $langs->trans('CustomerCode') . ''; - print $soc->code_client; - if ($soc->check_codeclient() != 0) + print $object->code_client; + if ($object->check_codeclient() != 0) print ' (' . $langs->trans("WrongCustomerCode") . ')'; print '
    '; print $langs->trans('SupplierCode') . ''; - print $soc->code_fournisseur; - if ($soc->check_codefournisseur() != 0) + print $object->code_fournisseur; + if ($object->check_codefournisseur() != 0) print ' (' . $langs->trans("WrongSupplierCode") . ')'; print '
    ' . $langs->trans('Gencod') . '' . $soc->barcode . '
    " . $langs->trans('Address') . ""; -dol_print_address($soc->address, 'gmap', 'thirdparty', $soc->id); -print "
    ' . $langs->trans('Zip') . '' . $soc->zip . "' . $langs->trans('Town') . '' . $soc->town . "
    ' . $langs->trans('Country') . ''; - $img = picto_from_langcode($soc->country_code); - print($img ? $img . ' ' : ''); - print $soc->country; - print '
    ' . $langs->trans('EMail') . ''; -print dol_print_email($soc->email, 0, $soc->id, 'AC_EMAIL'); -print '
    ' . $langs->trans('Web') . ''; -print dol_print_url($soc->url); -print '
    ' . $langs->trans('Phone') . '' . dol_print_phone($soc->tel, $soc->country_code, 0, $soc->id, 'AC_TEL') . '' . $langs->trans('Fax') . '' . dol_print_phone($soc->fax, $soc->country_code, 0, $soc->id, 'AC_FAX') . '
    '; print '
    '; +dol_fiche_end(); + if (! empty($conf->global->PRODUIT_CUSTOMER_PRICES)) { $prodcustprice = new Productcustomerprice($db); @@ -224,7 +192,7 @@ // Build filter to diplay only concerned lines $filter = array ( - 't.fk_soc' => $soc->id + 't.fk_soc' => $object->id ); $search_soc = GETPOST('search_soc'); @@ -238,10 +206,10 @@ print load_fiche_titre($langs->trans('PriceByCustomer')); - print '
    '; + print ''; print ''; print ''; - print ''; + print ''; print ''; print ''; print ''; @@ -316,7 +284,7 @@ setEventMessage($prodcustprice->error, 'errors'); } - print ''; + print ''; print ''; print ''; print ''; @@ -456,9 +424,11 @@ } print "\n" . '
    ' . "\n"; - print ''; + print ''; print "\n

    \n"; - } else { + } + else + { // View mode @@ -475,7 +445,7 @@ $option = '&search_soc=' . $search_soc . '&id=' . $object->id; - print_barre_liste($langs->trans('PriceByCustomer'), $page, $_SERVEUR ['PHP_SELF'], $option, $sortfield, $sortorder, '', count($prodcustprice->lines), $nbtotalofrecords); + print_barre_liste($langs->trans('PriceForEachProduct'), $page, $_SERVEUR ['PHP_SELF'], $option, $sortfield, $sortorder, '', count($prodcustprice->lines), $nbtotalofrecords); if (count($prodcustprice->lines) > 0) { @@ -536,15 +506,15 @@ // Action if ($user->rights->produit->creer || $user->rights->service->creer) { print ''; @@ -568,7 +538,7 @@ print "\n" . '
    ' . "\n"; if ($user->rights->produit->creer || $user->rights->service->creer) { - print ''; + print ''; } print "\n

    \n"; } diff --git a/htdocs/societe/rib.php b/htdocs/societe/rib.php index ee4259f2e8179..fd9f6b34217d1 100644 --- a/htdocs/societe/rib.php +++ b/htdocs/societe/rib.php @@ -42,9 +42,8 @@ if ($user->societe_id) $socid=$user->societe_id; $result = restrictedArea($user, 'societe','',''); -$soc = new Societe($db); -$soc->id = $_GET["socid"]; -$soc->fetch($_GET["socid"]); +$object = new Societe($db); +$object->fetch($socid); $id=GETPOST("id","int"); $ribid=GETPOST("ribid","int"); @@ -62,7 +61,7 @@ $account->fetch($id); - $account->socid = $soc->id; + $account->socid = $object->id; $account->bank = $_POST["bank"]; $account->label = $_POST["label"]; @@ -93,7 +92,7 @@ $account->setAsDefault($id); // This will make sure there is only one default rib } - $url=DOL_URL_ROOT.'/societe/rib.php?socid='.$soc->id; + $url=DOL_URL_ROOT.'/societe/rib.php?socid='.$object->id; header('Location: '.$url); exit; } @@ -121,7 +120,7 @@ // Ajout $account = new CompanyBankAccount($db); - $account->socid = $soc->id; + $account->socid = $object->id; $account->bank = $_POST["bank"]; $account->label = $_POST["label"]; @@ -146,7 +145,7 @@ } else { - $url=DOL_URL_ROOT.'/societe/rib.php?socid='.$soc->id; + $url=DOL_URL_ROOT.'/societe/rib.php?socid='.$object->id; header('Location: '.$url); exit; } @@ -159,7 +158,7 @@ $res = $account->setAsDefault(GETPOST('ribid','int')); if ($res) { - $url=DOL_URL_ROOT.'/societe/rib.php?socid='.$soc->id; + $url=DOL_URL_ROOT.'/societe/rib.php?socid='.$object->id; header('Location: '.$url); exit; } else { @@ -175,7 +174,7 @@ $result = $account->delete($user); if ($result > 0) { - $url = $_SERVER['PHP_SELF']."?socid=".$soc->id; + $url = $_SERVER['PHP_SELF']."?socid=".$object->id; header('Location: '.$url); exit; } @@ -200,27 +199,27 @@ llxHeader(); -$head=societe_prepare_head2($soc); +$head=societe_prepare_head2($object); $account = new CompanyBankAccount($db); if (! $id) - $account->fetch(0,$soc->id); + $account->fetch(0,$object->id); else $account->fetch($id); -if (empty($account->socid)) $account->socid=$soc->id; +if (empty($account->socid)) $account->socid=$object->id; if ($socid && $action == 'edit' && $user->rights->societe->creer) { - print ''; + print ''; print ''; print ''; print ''; } if ($socid && $action == 'create' && $user->rights->societe->creer) { - print ''; + print ''; print ''; print ''; } @@ -234,17 +233,22 @@ // Confirm delete third party if ($action == 'delete') { - print $form->formconfirm($_SERVER["PHP_SELF"]."?socid=".$soc->id."&ribid=".($ribid?$ribid:$id), $langs->trans("DeleteARib"), $langs->trans("ConfirmDeleteRib", $account->getRibLabel()), "confirm_delete", '', 0, 1); + print $form->formconfirm($_SERVER["PHP_SELF"]."?socid=".$object->id."&ribid=".($ribid?$ribid:$id), $langs->trans("DeleteARib"), $langs->trans("ConfirmDeleteRib", $account->getRibLabel()), "confirm_delete", '', 0, 1); } - print load_fiche_titre($langs->trans("DefaultRIB")); + dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); + + print '
    '; + + print load_fiche_titre($langs->trans("DefaultRIB"), '', ''); - print '
    ' . $langs->trans('Product') . ''; - print 'id . '&prodid=' . $line->fk_product . '">'; + print 'id . '&prodid=' . $line->fk_product . '">'; print img_info(); print ''; print ' '; - print 'id . '&lineid=' . $line->id . '">'; + print 'id . '&lineid=' . $line->id . '">'; print img_edit('default', 0, 'style="vertical-align: middle;"'); print ''; print ' '; - print 'id . '&lineid=' . $line->id . '">'; + print 'id . '&lineid=' . $line->id . '">'; print img_delete('default', 'style="vertical-align: middle;"'); print ''; print '
    '; + print '
    '; + print '
    '; - print ''; + print ''; print ''; - print ''; + print ''; print ''; // Show fields of bank account @@ -350,7 +354,9 @@ print '
    '.$langs->trans("RIBControlError").'
    '; } - print "
    "; + print ""; + + dol_fiche_end(); /* @@ -359,7 +365,7 @@ print load_fiche_titre($langs->trans("AllRIB")); - $rib_list = $soc->get_all_rib(); + $rib_list = $object->get_all_rib(); $var = false; if (is_array($rib_list)) { @@ -397,7 +403,7 @@ if (! empty($conf->prelevement->enabled)) { // RUM - print ''; + print ''; // FRSTRECUR print ''; @@ -406,7 +412,7 @@ // Default print '
    '.$langs->trans("LabelRIB").'
    '.$langs->trans("LabelRIB").''.$account->label.'
    '.$langs->trans("BankName").'
    '.$langs->trans("BankName").''.$account->bank.'
    '.$prelevement->buildRumNumber($soc->code_client, $rib->datec, $rib->id).''.$prelevement->buildRumNumber($object->code_client, $rib->datec, $rib->id).''.$rib->frstrecur.''; if (!$rib->default_rib) { - print ''; + print ''; print img_picto($langs->trans("Disabled"),'off'); print ''; } else { @@ -418,13 +424,13 @@ print ''; if ($user->rights->societe->creer) { - print ''; + print ''; print img_picto($langs->trans("Modify"),'edit'); print ''; print ' '; - print ''; + print ''; print img_picto($langs->trans("Delete"),'delete'); print ''; } @@ -444,7 +450,6 @@ dol_print_error($db); } - dol_fiche_end(); } // Edit @@ -452,7 +457,12 @@ { dol_fiche_head($head, 'rib', $langs->trans("ThirdParty"),0,'company'); - print ''; + dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); + + print '
    '; + + print '
    '; + print '
    '; print ''; print ''; @@ -551,7 +561,7 @@ print '
    '.$langs->trans("LabelRIB").'
    '; - if (empty($account->rum)) $account->rum = $prelevement->buildRumNumber($soc->code_client, $account->datec, $account->id); + if (empty($account->rum)) $account->rum = $prelevement->buildRumNumber($object->code_client, $account->datec, $account->id); // RUM print ''; @@ -564,7 +574,9 @@ print '
    '.$langs->trans("RUM").'
    '; } - dol_fiche_end(); + print ''; + + dol_fiche_end(); print '
    '; print ''; @@ -579,8 +591,12 @@ { dol_fiche_head($head, 'rib', $langs->trans("ThirdParty"),0,'company'); - print ''; - + dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); + + print '
    '; + + print '
    '; + print '
    '; print ''; print ''; @@ -657,6 +673,8 @@ print '
    '.$langs->trans("LabelRIB").'
    '; } + print '
    '; + dol_fiche_end(); print '
    '; @@ -686,7 +704,7 @@ if ($user->rights->societe->creer) { - print ''.$langs->trans("Add").''; + print ''.$langs->trans("Add").''; } print '
    '; diff --git a/htdocs/societe/soc.php b/htdocs/societe/soc.php index a603f52e226c7..6570a7379670f 100644 --- a/htdocs/societe/soc.php +++ b/htdocs/societe/soc.php @@ -1881,47 +1881,11 @@ print '
    '; print ''; - // Ref - /* - print ''; - print ''; - print ''; - */ - - // Name - /* - print ''; - print ''; - print ''; - */ - // Alias names (commercial, trademark or alias names) - print '"; - // Logo+barcode - /* - $rowspan=6; - if (! empty($conf->global->SOCIETE_USEPREFIX)) $rowspan++; - if (! empty($object->client)) $rowspan++; - if (! empty($conf->fournisseur->enabled) && $object->fournisseur && ! empty($user->rights->fournisseur->lire)) $rowspan++; - if (! empty($conf->barcode->enabled)) $rowspan++; - if (empty($conf->global->SOCIETE_DISABLE_STATE)) $rowspan++; - $htmllogobar=''; - if ($showlogo || $showbarcode) - { - $htmllogobar.=''; - }*/ - // Prefix if (! empty($conf->global->SOCIETE_USEPREFIX)) // Old not used prefix field { @@ -1966,69 +1930,6 @@ print ''; } - // Status - /* - print ''; - print ''; - print $htmllogobar; $htmllogobar=''; - print ''; - */ - - // Address - /* - print ''; - - // Zip / Town - print ''; - print ''; - - // Country - print ''; - - // State - if (empty($conf->global->SOCIETE_DISABLE_STATE)) print ''; - - // EMail - print ''; - - // Web - print ''; - - // Skype - if (! empty($conf->skype->enabled)) - { - print ''; - } - - // Phone / Fax - print ''; - print ''; - */ - // Prof ids $i=1; $j=0; while ($i <= 6) diff --git a/htdocs/societe/societecontact.php b/htdocs/societe/societecontact.php index 4d2382e6eee17..691f930b7671b 100644 --- a/htdocs/societe/societecontact.php +++ b/htdocs/societe/societecontact.php @@ -148,14 +148,16 @@ print ''; print ''; - print '
    '.$langs->trans("Ref").''; - print $fuser->id; - print '
    '.$langs->trans('ThirdPartyName').''; - print $form->showrefnav($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); - print '
    '.$langs->trans('AliasNames').''; + print '
    '.$langs->trans('AliasNames').''; print $object->name_alias; print "
    '; - if ($showlogo) $htmllogobar.=$form->showphoto('societe',$object); - if ($showlogo && $showbarcode) $htmllogobar.='

    '; - if ($showbarcode) $htmllogobar.=$form->showbarcode($object); - $htmllogobar.='
    '.$langs->trans("Status").''; - if (! empty($conf->use_javascript_ajax) && $user->rights->societe->creer && ! empty($conf->global->MAIN_DIRECT_STATUS_UPDATE)) { - print ajax_object_onoff($object, 'status', 'status', 'InActivity', 'ActivityCeased'); - } else { - print $object->getLibStatut(2); - } - print '
    '.$langs->trans('Address').''; - dol_print_address($object->address,'gmap','thirdparty',$object->id); - print '
    '.$langs->trans('Zip').' / '.$langs->trans("Town").''; - print $object->zip.($object->zip && $object->town?" / ":"").$object->town; - print '
    '.$langs->trans("Country").''; - if (! empty($object->country_code)) - { - //$img=picto_from_langcode($object->country_code); - $img=''; - if ($object->isInEEC()) print $form->textwithpicto(($img?$img.' ':'').$object->country,$langs->trans("CountryIsInEEC"),1,0); - else print ($img?$img.' ':'').$object->country; - } - print '
    '.$langs->trans('State').''.$object->state.'
    '.$langs->trans('EMail').''; - print dol_print_email($object->email,0,$object->id,'AC_EMAIL'); - print '
    '.$langs->trans('Web').''; - print dol_print_url($object->url); - print '
    '.$langs->trans('Skype').''; - print dol_print_skype($object->skype,0,$object->id,'AC_SKYPE'); - print '
    '.$langs->trans('Phone').''.dol_print_phone($object->phone,$object->country_code,0,$object->id,'AC_TEL').''.$langs->trans('Fax').''.dol_print_phone($object->fax,$object->country_code,0,$object->id,'AC_FAX').'
    '; - print ''; - print ''; + + dol_banner_tab($object, 'socid', '', ($user->societe_id?0:1), 'rowid', 'nom'); + + print '
    '; + + print '
    '; + print '
    '.$langs->trans('ThirdPartyName').''; - print $form->showrefnav($object,'id','',($user->societe_id?0:1),'rowid','nom'); - print '
    '; // Alias names (commercial, trademark or alias names) - print '"; @@ -181,7 +183,11 @@ if ($object->check_codefournisseur() <> 0) print ' ('.$langs->trans("WrongSupplierCode").')'; print ''; } - print '
    '.$langs->trans('AliasNames').''; + print '
    '.$langs->trans('AliasNames').''; print $object->name_alias; print "
    '; + print '
    '; + + print '
    '; + + print ''; print '
    '; // Contacts lines (modules that overwrite templates must declare this into descriptor) diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 638c758ddc2a9..5f9d0e4bb155e 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -489,7 +489,7 @@ .maxwidth100 { max-width: 100px; } .maxwidth200 { max-width: 200px; } .maxwidth300 { max-width: 300px; } -.titlefield { width: 25%; } +.titlefield { width: 30%; } .hideonsmartphone { display: none; } .noenlargeonsmartphone { width : 50px !important; display: inline !important; } @@ -625,7 +625,7 @@ div.statusref { float: right; padding-right: 12px; - margin-top: 7px; + margin-top: 6px; margin-bottom: 10px; } img.photoref { @@ -1970,7 +1970,7 @@ } .table-key-border-col { - width: 25%; + /* width: 25%; */ vertical-align:top; } .table-val-border-col { @@ -2133,6 +2133,9 @@ div.pagination li.pagination span.inactive { cursor: default; } +/*div.pagination li.litext { + padding-top: 8px; +}*/ div.pagination li.litext a { border: none; padding-right: 10px; From 9f0c0bfc927ac3bbf465f1061514336f7714ebb3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 13 Oct 2015 13:27:44 +0200 Subject: [PATCH 103/297] NEW Introduce hidden option MAIN_REPLACE_TRANS_xx_XX to allow simple replacement of translated string on the fly. --- htdocs/core/class/translate.class.php | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/translate.class.php b/htdocs/core/class/translate.class.php index 27bcb64da3c26..8235f99d1298b 100644 --- a/htdocs/core/class/translate.class.php +++ b/htdocs/core/class/translate.class.php @@ -1,6 +1,6 @@ - * Copyright (C) 2004-2012 Destailleur Laurent + * Copyright (C) 2004-2015 Destailleur Laurent * Copyright (C) 2005-2010 Regis Houssin * * This program is free software; you can redistribute it and/or modify @@ -579,6 +579,19 @@ function trans($key, $param1='', $param2='', $param3='', $param4='', $maxsize=0) { $str=$this->tab_translate[$key]; + // Make some string replacement after translation + $replacekey='MAIN_REPLACE_TRANS_'.$this->defaultlang; + if (! empty($conf->global->$replacekey)) // Replacement translation variable with string1:newstring1,string2:newstring2 + { + // Overwrite translation with param MAIN_OVERWRITE_TRANS_xx_XX + $tmparray=explode(';', $conf->global->$replacekey); + foreach($tmparray as $tmp) + { + $tmparray2=explode(':',$tmp); + $str=preg_replace('/'.preg_quote($tmparray2[0]).'/',$tmparray2[1],$str); + } + } + if (! preg_match('/^Format/',$key)) { //print $str; From 6520ed7a089f9574341650211e9884a96dbce362 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 13 Oct 2015 14:09:14 +0200 Subject: [PATCH 104/297] Use css not bold title. Add missing badge (count of draft records) on draft list. --- htdocs/comm/index.php | 14 ++++++++------ htdocs/core/lib/project.lib.php | 21 +++++++++++---------- htdocs/theme/eldy/style.css.php | 10 +++++----- htdocs/theme/md/style.css.php | 4 ++-- 4 files changed, 26 insertions(+), 23 deletions(-) diff --git a/htdocs/comm/index.php b/htdocs/comm/index.php index 37e4ee61cedc9..9e9c023586173 100644 --- a/htdocs/comm/index.php +++ b/htdocs/comm/index.php @@ -172,12 +172,13 @@ $resql=$db->query($sql); if ($resql) { + $total = 0; + $num = $db->num_rows($resql); + print ''; print ''; - print ''; + print ''; - $total = 0; - $num = $db->num_rows($resql); if ($num > 0) { $i = 0; @@ -246,12 +247,13 @@ $resql = $db->query($sql); if ($resql) { + $total = 0; + $num = $db->num_rows($resql); + print '
    '.$langs->trans("ProposalsDraft").'
    '.$langs->trans("ProposalsDraft").' '.$num.'
    '; print ''; - print ''; + print ''; - $total = 0; - $num = $db->num_rows($resql); if ($num) { $i = 0; diff --git a/htdocs/core/lib/project.lib.php b/htdocs/core/lib/project.lib.php index 89d658fa01a08..3fb5a87e433bd 100644 --- a/htdocs/core/lib/project.lib.php +++ b/htdocs/core/lib/project.lib.php @@ -896,16 +896,6 @@ function print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks= if (strcmp($statut, '') && $statut >= 0) $title=$langs->trans("Projects").' '.$langs->trans($projectstatic->statuts_long[$statut]); print '
    '.$langs->trans("DraftOrders").'
    '.$langs->trans("DraftOrders").' '.$num.'
    '; - print ''; - print_liste_field_titre($title,"index.php","","","","",$sortfield,$sortorder); - if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) - { - print_liste_field_titre($langs->trans("OpportunityAmount"),"","","","",'align="right"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("OpportunityStatus"),"","","","",'align="right"',$sortfield,$sortorder); - } - if (empty($conf->global->PROJECT_HIDE_TASKS)) print_liste_field_titre($langs->trans("Tasks"),"","","","",'align="right"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Status"),"","","","",'align="right"',$sortfield,$sortorder); - print "\n"; $sql = "SELECT p.rowid as projectid, p.ref, p.title, p.fk_user_creat, p.public, p.fk_statut as status, p.fk_opp_status as opp_status, p.opp_amount, COUNT(DISTINCT t.rowid) as nb"; // We use DISTINCT here because line can be doubled if task has 2 links to same user $sql.= " FROM ".MAIN_DB_PREFIX."projet as p"; @@ -962,6 +952,17 @@ function print_projecttasks_array($db, $form, $socid, $projectsListId, $mytasks= $num = $db->num_rows($resql); $i = 0; + print ''; + print_liste_field_titre($title.' '.$num.'',$_SERVER["PHP_SELF"],"","","","",$sortfield,$sortorder); + if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES)) + { + print_liste_field_titre($langs->trans("OpportunityAmount"),"","","","",'align="right"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("OpportunityStatus"),"","","","",'align="right"',$sortfield,$sortorder); + } + if (empty($conf->global->PROJECT_HIDE_TASKS)) print_liste_field_titre($langs->trans("Tasks"),"","","","",'align="right"',$sortfield,$sortorder); + print_liste_field_titre($langs->trans("Status"),"","","","",'align="right"',$sortfield,$sortorder); + print "\n"; + while ($i < $num) { $objp = $db->fetch_object($resql); diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 5f9d0e4bb155e..6243abebc9c55 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -453,8 +453,8 @@ float: ; margin-: 12px; margin-: 2px; - margin-top: 3px; - margin-bottom: 3px; + margin-top: 4px; + margin-bottom: 4px; padding-left: 2px; } div.confirmmessage { @@ -2357,7 +2357,7 @@ background-image: -ms-linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(250,250,250,0.3) 100%); background-image: linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(250,250,250,0.3) 100%); - font-weight: bold; + font-weight: normal; color: #; font-family: ; @@ -2371,7 +2371,7 @@ tr.liste_titre th, th.liste_titre, tr.liste_titre td, td.liste_titre, form.liste_titre div, div.liste_titre { font-family: ; - font-weight: bold; + font-weight: normal; vertical-align: middle; } tr.liste_titre th a, th.liste_titre a, tr.liste_titre td a, td.liste_titre a, form.liste_titre div a, div.liste_titre a { @@ -2487,7 +2487,7 @@ color: #; font-family: , sans-serif; - font-weight: bold; + /*font-weight: normal;*/ border-bottom: 1px solid #FDFFFF; white-space: nowrap; } diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 81b15ae7ec581..ee745437234b9 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -458,8 +458,8 @@ float: ; margin-: 12px; margin-: 2px; - margin-top: 3px; - margin-bottom: 3px; + margin-top: 4px; + margin-bottom: 4px; padding-left: 2px; } div.confirmmessage { From 70f3da80df333960fa02b34e10da049a0bbe364c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 13 Oct 2015 14:21:00 +0200 Subject: [PATCH 105/297] FIX Option SOCIETE_DISABLE_PROSPECTS not supported into title of box --- htdocs/comm/index.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/htdocs/comm/index.php b/htdocs/comm/index.php index 9e9c023586173..79dfafa7a76a3 100644 --- a/htdocs/comm/index.php +++ b/htdocs/comm/index.php @@ -331,7 +331,11 @@ print '
    '; print ''; - print ''; + print ''; print ''; print ''; if ($num) From 57ea4fc23d3ddda712b012d694467aa8def1fa5a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Tue, 13 Oct 2015 14:40:02 +0200 Subject: [PATCH 106/297] FIX sql syntax error when sort order not defined. --- htdocs/core/db/DoliDB.class.php | 4 ++-- htdocs/projet/index.php | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/htdocs/core/db/DoliDB.class.php b/htdocs/core/db/DoliDB.class.php index fa9db9ea4b42a..f1909a91ea0be 100644 --- a/htdocs/core/db/DoliDB.class.php +++ b/htdocs/core/db/DoliDB.class.php @@ -226,7 +226,7 @@ function lastquery() */ function order($sortfield=null,$sortorder=null) { - if (isset($sortfield)) + if (! empty($sortfield)) { $return=''; $fields=explode(',',$sortfield); @@ -236,7 +236,7 @@ function order($sortfield=null,$sortorder=null) else $return.=','; $return.=preg_replace('/[^0-9a-z_\.]/i','',$val); - if (isset($sortorder)) + if (! empty($sortorder)) { $return.=' '.preg_replace('/[^0-9a-z]/i','',$sortorder); } diff --git a/htdocs/projet/index.php b/htdocs/projet/index.php index 95e4ce98a5e87..e316603c2b75e 100644 --- a/htdocs/projet/index.php +++ b/htdocs/projet/index.php @@ -229,6 +229,7 @@ if ($mine || empty($user->rights->projet->all->lire)) $sql.= " AND p.rowid IN (".$projectsListId.")"; if ($socid) $sql.= " AND (p.fk_soc IS NULL OR p.fk_soc = 0 OR p.fk_soc = ".$socid.")"; $sql.= " GROUP BY s.nom, s.rowid"; +$sql.= $db->order($sortfield, $sortorder); $var=true; $resql = $db->query($sql); From 00b610d87fec9815bb73626d52b27335512d1d23 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Wed, 14 Oct 2015 08:23:52 +0200 Subject: [PATCH 107/297] FIX : fix HTML into formconfirm box --- htdocs/core/class/html.form.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 87d177e5d7d79..b75bd01d2aa0c 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -3233,7 +3233,7 @@ function formconfirm($page, $title, $question, $action, $formquestion='', $selec if (! empty($more)) { $formconfirm.= '
    '.$more.'
    '; } - $formconfirm.= ($question ? '
    ': ''); + $formconfirm.= ($question ? '
    '.img_help('','').' '.$question . '
    ': ''); $formconfirm.= '
    '."\n"; $formconfirm.= "\n\n"; From 727db565765037705c50905c400d45ef17f77e3f Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Wed, 14 Oct 2015 08:27:56 +0200 Subject: [PATCH 108/297] FIX : #3724 Bug: Blank page after cloning proposal with changed client --- htdocs/comm/propal/class/propal.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index dbd0378829314..c5c432610ee47 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -961,7 +961,7 @@ function createFromClone($socid=0) { global $db, $user,$langs,$conf,$hookmanager; - dol_include_once('/projet/class.project.class.php'); + dol_include_once('/projet/class/project.class.php'); $this->context['createfromclone']='createfromclone'; From 6b8707516e9ef2ea56827e2e724508034f0008b3 Mon Sep 17 00:00:00 2001 From: Florian HENRY Date: Wed, 14 Oct 2015 10:05:42 +0200 Subject: [PATCH 109/297] FIX : skeleton class must use db->order rather than ORDER BY into fetchAll --- dev/skeletons/skeleton_class.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dev/skeletons/skeleton_class.class.php b/dev/skeletons/skeleton_class.class.php index 2f8c78556e191..1eeae9a9fd224 100644 --- a/dev/skeletons/skeleton_class.class.php +++ b/dev/skeletons/skeleton_class.class.php @@ -244,7 +244,7 @@ public function fetchAll($sortorder='', $sortfield='', $limit=0, $offset=0, arra } if (!empty($sortfield)) { - $sql .= ' ORDER BY ' . $sortfield . ' ' . $sortorder; + $sql .= $this->db->order($sortfield,$sortorder); } if (!empty($limit)) { $sql .= ' ' . $this->db->plimit($limit + 1, $offset); From e9facbf1086fb9ee3674729cc6ab695848e70e5b Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 14 Oct 2015 10:53:38 +0200 Subject: [PATCH 110/297] FIX bad property so after creating an event from calendar, filter were lost. --- htdocs/comm/action/card.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/comm/action/card.php b/htdocs/comm/action/card.php index 94905919022eb..32d5a34aa5284 100644 --- a/htdocs/comm/action/card.php +++ b/htdocs/comm/action/card.php @@ -323,7 +323,7 @@ unset($_SESSION['assignedtouser']); $moreparam=''; - if ($user->id != $object->ownerid) $moreparam="usertodo=-1"; // We force to remove filter so created record is visible when going back to per user view. + if ($user->id != $object->userownerid) $moreparam="usertodo=-1"; // We force to remove filter so created record is visible when going back to per user view. $db->commit(); if (! empty($backtopage)) From 542ed40c9c64d34b4c056364fd5c7b1ec7a6cea0 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Wed, 14 Oct 2015 12:09:51 +0200 Subject: [PATCH 111/297] Fix: compatibility with dolibarr versions before and after 3.7.1 --- build/perl/virtualmin/dolibarr.pl | 36 +++++++++++++++++-------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/build/perl/virtualmin/dolibarr.pl b/build/perl/virtualmin/dolibarr.pl index aaaa1fdb33a48..32324d28e4223 100644 --- a/build/perl/virtualmin/dolibarr.pl +++ b/build/perl/virtualmin/dolibarr.pl @@ -30,7 +30,7 @@ sub script_dolibarr_author # script_dolibarr_versions() sub script_dolibarr_versions { -return ( "3.7.2", "3.6.3", "3.5.6" ); +return ( "3.8.1", "3.7.1", "3.6.4", "3.5.7" ); } sub script_dolibarr_category @@ -163,7 +163,7 @@ sub script_dolibarr_commands } # script_dolibarr_install(&domain, version, &opts, &files, &upgrade-info) -# Actually installs joomla, and returns either 1 and an informational +# Actually installs dolibarr, and returns either 1 and an informational # message, or 0 and an error sub script_dolibarr_install { @@ -206,6 +206,9 @@ sub script_dolibarr_install $charset = $dbtype eq "mysql" ? $mycharset : $pgcharset; $collate = $dbtype eq "mysql" ? $mycollate : "C"; +# Install filename +local $step = $version >= 3.8 ? "step" : "etape"; + $path = &script_path_url($d, $opts); if ($path =~ /^https:/ || $d->{'ssl'}) { $url = "https://$d->{'dom'}"; @@ -224,6 +227,10 @@ sub script_dolibarr_install &set_permissions_as_domain_user($d, 0666, $cfile); &run_as_domain_user($d, "mkdir ".quotemeta($docdir)); &set_permissions_as_domain_user($d, 0777, $docdir); + if (!$version >= 3.7.2) { + &run_as_domain_user($d, "mkdir ".quotemeta($altdir)); + &set_permissions_as_domain_user($d, 0777, $altdir); + } } else { # Preserve old config file, documents and custom directory @@ -259,7 +266,7 @@ sub script_dolibarr_install [ "versionfrom", $upgrade->{'version'} ], [ "versionto", $ver ], ); - local $err = &call_dolibarr_wizard_page(\@params, "step5", $d, $opts); + local $err = &call_dolibarr_wizard_page(\@params, $step."5", $d, $opts); return (-1, "Dolibarr wizard failed : $err") if ($err); # Remove the installation directory. @@ -282,15 +289,15 @@ sub script_dolibarr_install [ "main_force_https", $opts->{'forcehttps'} ], [ "dolibarr_main_db_character_set", $charset ], [ "dolibarr_main_db_collation", $collate ], - [ "usealternaterootdir", "1" ], + [ "main_use_alt_dir", "1" ], [ "main_alt_dir_name", "custom" ], ); - local $err = &call_dolibarr_wizard_page(\@params, "step1", $d, $opts); + local $err = &call_dolibarr_wizard_page(\@params, $step."1", $d, $opts); return (-1, "Dolibarr wizard failed : $err") if ($err); # Second page (Populate database) local @params = ( [ "action", "set" ] ); - local $err = &call_dolibarr_wizard_page(\@params, "step2", $d, $opts); + local $err = &call_dolibarr_wizard_page(\@params, $step."2", $d, $opts); return (-1, "Dolibarr wizard failed : $err") if ($err); # Third page (Add administrator account) @@ -299,7 +306,7 @@ sub script_dolibarr_install [ "pass", $dompass ], [ "pass_verif", $dompass ], ); - local $err = &call_dolibarr_wizard_page(\@params, "step5", $d, $opts); + local $err = &call_dolibarr_wizard_page(\@params, $step."5", $d, $opts); return (-1, "Dolibarr wizard failed : $err") if ($err); # Remove the installation directory and protect config file. @@ -324,14 +331,10 @@ sub call_dolibarr_wizard_page local $params = join("&", map { $_->[0]."=".&urlize($_->[1]) } @$params ); local $ipage = $opts->{'path'}."/install/".$page.".php"; local ($iout, $ierror); - &post_http_connection($d, $ipage, $params, \$iout, \$ierror); -print STDERR $iout; - if ($ierror) { return $ierror; } - return undef; } @@ -347,8 +350,8 @@ sub script_dolibarr_uninstall return (0, $derr) if ($derr); # Remove all llx_ tables from the database -# 4 times because of constraints -for(my $i=0; $i<4; $i++) { +# 10 times because of constraints +for(my $i=0; $i<10; $i++) { &cleanup_script_database($d, $opts->{'db'}, "llx_"); } @@ -381,9 +384,10 @@ sub script_dolibarr_check_latest { local ($ver) = @_; local @vers = &osdn_package_versions("dolibarr", - $ver >= 3.2 ? "dolibarr\\-(3\\.[0-9\\.]+)\\.tgz" : - $ver >= 3.1 ? "dolibarr\\-(3\\.1\\.[0-9\\.]+)\\.tgz" : - $ver >= 3 ? "dolibarr\\-(3\\.0\\.[0-9\\.]+)\\.tgz" : + $ver >= 3.8 ? "dolibarr\\-(3\\.[0-9\\.]+)\\.tgz" : + $ver >= 3.7 ? "dolibarr\\-(3\\.7\\.[0-9\\.]+)\\.tgz" : + $ver >= 3.6 ? "dolibarr\\-(3\\.6\\.[0-9\\.]+)\\.tgz" : + $ver >= 3.5 ? "dolibarr\\-(3\\.5\\.[0-9\\.]+)\\.tgz" : $ver >= 2.9 ? "dolibarr\\-(2\\.9\\.[0-9\\.]+)\\.tgz" : "dolibarr\\-(2\\.8\\.[0-9\\.]+)\\.tgz"); return "Failed to find versions" if (!@vers); From 68aac4476c7c2f5266a483dae30f48088614b3e0 Mon Sep 17 00:00:00 2001 From: fappels Date: Wed, 14 Oct 2015 12:16:54 +0200 Subject: [PATCH 112/297] FIX: #3605 deleting a shipping Get lots to move back to stock. Move lots back to stock. Do not log object because it will be deleted Improve error reporting --- htdocs/expedition/class/expedition.class.php | 97 ++++++++++++------- .../class/expeditionbatch.class.php | 9 +- 2 files changed, 69 insertions(+), 37 deletions(-) diff --git a/htdocs/expedition/class/expedition.class.php b/htdocs/expedition/class/expedition.class.php index b43afdfc206ea..6c2214c7e8264 100644 --- a/htdocs/expedition/class/expedition.class.php +++ b/htdocs/expedition/class/expedition.class.php @@ -7,7 +7,7 @@ * Copyright (C) 2013 Florian Henry * Copyright (C) 2014 Cedric GROSS * Copyright (C) 2014-2015 Marcos García - * Copyright (C) 2014 Francis Appels + * Copyright (C) 2014-2015 Francis Appels * * 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 @@ -1002,7 +1002,7 @@ function update($user=null, $notrigger=0) } } - /** + /** * Delete shipment. * Warning, do not delete a shipment if a delivery is linked to (with table llx_element_element) * @@ -1011,9 +1011,13 @@ function update($user=null, $notrigger=0) function delete() { global $conf, $langs, $user; - require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; - + require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + if ($conf->productbatch->enabled) + { + require_once DOL_DOCUMENT_ROOT.'/expedition/class/expeditionbatch.class.php'; + } $error=0; + $this->error=''; // Add a protection to refuse deleting if shipment has at least one delivery $this->fetchObjectLinked($this->id, 'shipping', 0, 'delivery'); // Get deliveries linked to this shipment @@ -1024,15 +1028,6 @@ function delete() } $this->db->begin(); - - if ($conf->productbatch->enabled) - { - require_once DOL_DOCUMENT_ROOT.'/expedition/class/expeditionbatch.class.php'; - if (ExpeditionLineBatch::deletefromexp($this->db,$this->id) < 0) - { - $error++;$this->errors[]="Error ".$this->db->lasterror(); - } - } // Stock control if ($conf->stock->enabled && $conf->global->STOCK_CALCULATE_ON_SHIPMENT && $this->statut > 0) { @@ -1041,7 +1036,7 @@ function delete() $langs->load("agenda"); // Loop on each product line to add a stock movement - $sql = "SELECT cd.fk_product, cd.subprice, ed.qty, ed.fk_entrepot"; + $sql = "SELECT cd.fk_product, cd.subprice, ed.qty, ed.fk_entrepot, ed.rowid as expeditiondet_id"; $sql.= " FROM ".MAIN_DB_PREFIX."commandedet as cd,"; $sql.= " ".MAIN_DB_PREFIX."expeditiondet as ed"; $sql.= " WHERE ed.fk_expedition = ".$this->id; @@ -1056,26 +1051,62 @@ function delete() { dol_syslog(get_class($this)."::delete movement index ".$i); $obj = $this->db->fetch_object($resql); - - //var_dump($this->lines[$i]); + $mouvS = new MouvementStock($this->db); - $mouvS->origin = &$this; - // We decrement stock of product (and sub-products) - // We use warehouse selected for each line - $result=$mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $obj->qty, $obj->subprice, $langs->trans("ShipmentDeletedInDolibarr",$this->ref)); - if ($result < 0) + // we do not log origin because it will be deleted + $mouvS->origin = null; + // get lot/serial + $lotArray = null; + if ($conf->productbatch->enabled) { - $error++; - break; + $lotArray = ExpeditionLineBatch::fetchAll($this->db,$obj->expeditiondet_id); + if (! is_array($lotArray)) + { + $error++;$this->errors[]="Error ".$this->db->lasterror(); + } } + if (empty($lotArray)) { + // no lot/serial + // We increment stock of product (and sub-products) + // We use warehouse selected for each line + $result=$mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $obj->qty, $obj->subprice, $langs->trans("ShipmentDeletedInDolibarr", $this->ref)); + if ($result < 0) + { + $error++;$this->errors=$this->errors + $mouvS->errors; + break; + } + } + else + { + // We increment stock of batches + // We use warehouse selected for each line + foreach($lotArray as $lot) + { + $result=$mouvS->reception($user, $obj->fk_product, $obj->fk_entrepot, $lot->dluo_qty, $obj->subprice, $langs->trans("ShipmentDeletedInDolibarr", $this->ref), $lot->eatby, $lot->sellby, $lot->batch); + if ($result < 0) + { + $error++;$this->errors=$this->errors + $mouvS->errors; + break; + } + } + } } } else { - $error++; + $error++;$this->errors[]="Error ".$this->db->lasterror(); } } - + + // delete batch expedition line + if (! $error && $conf->productbatch->enabled) + { + if (ExpeditionLineBatch::deletefromexp($this->db,$this->id) < 0) + { + $error++;$this->errors[]="Error ".$this->db->lasterror(); + } + } + if (! $error) { $sql = "DELETE FROM ".MAIN_DB_PREFIX."expeditiondet"; @@ -1094,13 +1125,13 @@ function delete() if ($this->db->query($sql)) { - // Call trigger - $result=$this->call_trigger('SHIPPING_DELETE',$user); - if ($result < 0) { $error++; } - // End call triggers + // Call trigger + $result=$this->call_trigger('SHIPPING_DELETE',$user); + if ($result < 0) { $error++; } + // End call triggers - if (! $error) - { + if (! $error) + { $this->db->commit(); // We delete PDFs @@ -1127,8 +1158,8 @@ function delete() } return 1; - } - else + } + else { $this->db->rollback(); return -1; diff --git a/htdocs/expedition/class/expeditionbatch.class.php b/htdocs/expedition/class/expeditionbatch.class.php index fd424fc4990e1..49a59b726e196 100644 --- a/htdocs/expedition/class/expeditionbatch.class.php +++ b/htdocs/expedition/class/expeditionbatch.class.php @@ -189,11 +189,12 @@ static function fetchAll($db,$id_line_expdet) $sql.= " WHERE fk_expeditiondet=".(int) $id_line_expdet; dol_syslog(__METHOD__ ."", LOG_DEBUG); - $resql=$db->query($sql); - if ($resql) - { + $resql=$db->query($sql); + if ($resql) + { $num=$db->num_rows($resql); - $i=0; + $i=0; + $ret = array(); while ($i<$num) { $tmp=new self($db); From 545f0433538f0a63014fd8f2927562e6b07ee491 Mon Sep 17 00:00:00 2001 From: All-3kcis Date: Wed, 14 Oct 2015 16:24:09 +0200 Subject: [PATCH 113/297] Move db->commit after trigger --- htdocs/categories/class/categorie.class.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/htdocs/categories/class/categorie.class.php b/htdocs/categories/class/categorie.class.php index 933791db41d0a..46a48b31bf868 100644 --- a/htdocs/categories/class/categorie.class.php +++ b/htdocs/categories/class/categorie.class.php @@ -399,14 +399,13 @@ function update($user='') } else if ($reshook < 0) $error++; - $this->db->commit(); - - // Call trigger $result=$this->call_trigger('CATEGORY_MODIFY',$user); if ($result < 0) { $error++; $this->db->rollback(); return -1; } // End call triggers + $this->db->commit(); + return 1; } else From ca991da312d858f345acda96b74c3b75ec760c4f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 14 Oct 2015 16:51:20 +0200 Subject: [PATCH 114/297] Introduce usebold variable to allow more option on style in future. --- htdocs/theme/eldy/style.css.php | 44 ++++++++++++++++----------------- htdocs/theme/md/style.css.php | 9 ++++--- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 6243abebc9c55..48b6c0c0a2429 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -94,7 +94,7 @@ $fontsize='12'; $fontsizesmaller='11'; $usegradient=1; - +$useboldtitle=1; // Case of option always editable if (! isset($conf->global->THEME_ELDY_TOPMENU_BACK1)) $conf->global->THEME_ELDY_TOPMENU_BACK1='140,150,180'; // topmenu (140,160,185) @@ -664,12 +664,12 @@ background: rgb(); - background-image: linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%); - background-image: -o-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%); - background-image: -moz-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%); - background-image: -webkit-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%); - background-image: -ms-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%); - background-image: -webkit-gradient( linear, left top, left bottom, color-stop(0, rgba(255,255,255,.3)), color-stop(1, rgba(0,0,0,.3)) ); + background-image: linear-gradient(top, rgba(255,255,255,.1) 0%, rgba(0,0,0,.4) 100%); + background-image: -o-linear-gradient(top, rgba(255,255,255,.1) 0%, rgba(0,0,0,.4) 100%); + background-image: -moz-linear-gradient(top, rgba(255,255,255,.1) 0%, rgba(0,0,0,.4) 100%); + background-image: -webkit-linear-gradient(top, rgba(255,255,255,.1) 0%, rgba(0,0,0,.4) 100%); + background-image: -ms-linear-gradient(top, rgba(255,255,255,.1) 0%, rgba(0,0,0,.4) 100%); + background-image: -webkit-gradient( linear, left top, left bottom, color-stop(0, rgba(255,255,255,.1)), color-stop(1, rgba(0,0,0,.4)) ); height: 28px; @@ -743,12 +743,12 @@ ul.tmenu li { /* We need this to have background color when menu entry wraps on new lines */ background: rgb(); - background-image: linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%); - background-image: -o-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%); - background-image: -moz-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%); - background-image: -webkit-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%); - background-image: -ms-linear-gradient(top, rgba(255,255,255,.3) 0%, rgba(0,0,0,.3) 100%); - background-image: -webkit-gradient( linear, left top, left bottom, color-stop(0, rgba(255,255,255,.3)), color-stop(1, rgba(0,0,0,.3)) ); + background-image: linear-gradient(top, rgba(255,255,255,.1) 0%, rgba(0,0,0,.4) 100%); + background-image: -o-linear-gradient(top, rgba(255,255,255,.1) 0%, rgba(0,0,0,.4) 100%); + background-image: -moz-linear-gradient(top, rgba(255,255,255,.1) 0%, rgba(0,0,0,.4) 100%); + background-image: -webkit-linear-gradient(top, rgba(255,255,255,.1) 0%, rgba(0,0,0,.4) 100%); + background-image: -ms-linear-gradient(top, rgba(255,255,255,.1) 0%, rgba(0,0,0,.4) 100%); + background-image: -webkit-gradient( linear, left top, left bottom, color-stop(0, rgba(255,255,255,.1)), color-stop(1, rgba(0,0,0,.4)) ); } li.tmenu, li.tmenusel { @@ -766,11 +766,11 @@ font-weight: normal; } li.tmenusel, li.tmenu:hover { - background-image: -o-linear-gradient(bottom, rgba(250,250,250,0.3) 0%, rgba(0,0,0,0.3) 100%) !important; - background-image: -moz-linear-gradient(bottom, rgba(250,250,250,0.3) 0%, rgba(0,0,0,0.3) 100%) !important; - background-image: -webkit-linear-gradient(bottom, rgba(0,0,0,0.3) 0%, rgba(250,250,250,0) 100%) !important; - background-image: -ms-linear-gradient(bottom, rgba(250,250,250,0.3) 0%, rgba(0,0,0,0.3) 100%) !important; - background-image: linear-gradient(bottom, rgba(250,250,250,0.3) 0%, rgba(0,0,0,0.3) 100%) !important; + background-image: -o-linear-gradient(bottom, rgba(250,250,250,0.3) 0%, rgba(0,0,0,0.5) 100%) !important; + background-image: -moz-linear-gradient(bottom, rgba(0,0,0,0.5) 0%, rgba(250,250,250,0) 100%) !important; + background-image: -webkit-linear-gradient(bottom, rgba(0,0,0,0.5) 0%, rgba(250,250,250,0) 100%) !important; + background-image: -ms-linear-gradient(bottom, rgba(250,250,250,0.3) 0%, rgba(0,0,0,0.5) 100%) !important; + background-image: linear-gradient(bottom, rgba(250,250,250,0.3) 0%, rgba(0,0,0,0.5) 100%) !important; background: rgb(); } .tmenuend .tmenuleft { width: 0px; } @@ -1073,7 +1073,7 @@ height: 16px; } .alogin, .alogin:hover { - color: # !important; + color: # !important; font-weight: normal !important; font-size: px !important; padding-top: 2px; @@ -2357,7 +2357,7 @@ background-image: -ms-linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(250,250,250,0.3) 100%); background-image: linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(250,250,250,0.3) 100%); - font-weight: normal; + font-weight: ; color: #; font-family: ; @@ -2371,7 +2371,7 @@ tr.liste_titre th, th.liste_titre, tr.liste_titre td, td.liste_titre, form.liste_titre div, div.liste_titre { font-family: ; - font-weight: normal; + font-weight: ; vertical-align: middle; } tr.liste_titre th a, th.liste_titre a, tr.liste_titre td a, td.liste_titre a, form.liste_titre div a, div.liste_titre a { @@ -2487,7 +2487,7 @@ color: #; font-family: , sans-serif; - /*font-weight: normal;*/ + font-weight: ; border-bottom: 1px solid #FDFFFF; white-space: nowrap; } diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index ee745437234b9..1fdcda4874224 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -95,6 +95,7 @@ $fontsize='13'; $fontsizesmaller='11'; $usegradient=1; +$useboldtitle=1; // Case of option always editable if (! isset($conf->global->THEME_ELDY_TOPMENU_BACK1)) $conf->global->THEME_ELDY_TOPMENU_BACK1=join(',',colorStringToArray('#37474F')); // topmenu (140,160,185) @@ -809,7 +810,7 @@ } li.tmenusel, li.tmenu:hover { background-image: -o-linear-gradient(bottom, rgba(250,250,250,0.3) 0%, rgba(0,0,0,0.3) 100%) !important; - background-image: -moz-linear-gradient(bottom, rgba(250,250,250,0.3) 0%, rgba(0,0,0,0.3) 100%) !important; + background-image: -moz-linear-gradient(bottom, rgba(0,0,0,0.5) 0%, rgba(250,250,250,0) 100%) !important; background-image: -webkit-linear-gradient(bottom, rgba(0,0,0,0.3) 0%, rgba(250,250,250,0) 100%) !important; background-image: -ms-linear-gradient(bottom, rgba(250,250,250,0.3) 0%, rgba(0,0,0,0.3) 100%) !important; background-image: linear-gradient(bottom, rgba(250,250,250,0.3) 0%, rgba(0,0,0,0.3) 100%) !important; @@ -2207,7 +2208,7 @@ background-image: -ms-linear-gradient(bottom, rgba(0,0,0,0.3) 0%, rgba(250,250,250,0.3) 100%); background-image: linear-gradient(bottom, rgba(0,0,0,0.3) 0%, rgba(250,250,250,0.3) 100%); - font-weight: bold; + font-weight: ; */ color: #; @@ -2222,7 +2223,7 @@ tr.liste_titre th, th.liste_titre, tr.liste_titre td, td.liste_titre, form.liste_titre div, div.liste_titre { font-family: ; - font-weight: bold; + font-weight: ; vertical-align: middle; } tr.liste_titre th a, th.liste_titre a, tr.liste_titre td a, td.liste_titre a, form.liste_titre div a, div.liste_titre a { @@ -2344,7 +2345,7 @@ background-repeat: repeat-x; color: #; font-family: , sans-serif; - font-weight: bold; + font-weight: ; border-bottom: 1px solid #FDFFFF; white-space: nowrap; } From 225313d8ac9579e28c8eca85011471e11accf6fb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 14 Oct 2015 17:18:26 +0200 Subject: [PATCH 115/297] NEW Introduce hidden option MAIN_LANDING_PAGE to decide the home page visible just after login. --- htdocs/main.inc.php | 48 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index fcef513130f06..638ddbc91a491 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -406,10 +406,11 @@ function analyseVarsForSqlAndScriptsInjection(&$var, $type) $langs->load('main'); $langs->load('errors'); - $user->trigger_mesg='ErrorBadValueForCode - login='.GETPOST("username","alpha",2); $_SESSION["dol_loginmesg"]=$langs->trans("ErrorBadValueForCode"); $test=false; + // TODO @deprecated Remove this. Hook must be used, not this trigger. + $user->trigger_mesg='ErrorBadValueForCode - login='.GETPOST("username","alpha",2); // Call of triggers include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; $interface=new Interfaces($db); @@ -480,11 +481,11 @@ function analyseVarsForSqlAndScriptsInjection(&$var, $type) $langs->load('errors'); // Bad password. No authmode has found a good password. - $user->trigger_mesg=$langs->trans("ErrorBadLoginPassword").' - login='.GETPOST("username","alpha",2); // We set a generic message if not defined inside function checkLoginPassEntity or subfunctions if (empty($_SESSION["dol_loginmesg"])) $_SESSION["dol_loginmesg"]=$langs->trans("ErrorBadLoginPassword"); - // TODO We should use a hook afterLoginFailed here, not a trigger. + // TODO @deprecated Remove this. Hook must be used, not this trigger. + $user->trigger_mesg=$langs->trans("ErrorBadLoginPassword").' - login='.GETPOST("username","alpha",2); // Call of triggers include_once DOL_DOCUMENT_ROOT.'/core/class/interfaces.class.php'; $interface=new Interfaces($db); @@ -527,16 +528,19 @@ function analyseVarsForSqlAndScriptsInjection(&$var, $type) $langs->load('main'); $langs->load('errors'); - $user->trigger_mesg='ErrorCantLoadUserFromDolibarrDatabase - login='.$login; $_SESSION["dol_loginmesg"]=$langs->trans("ErrorCantLoadUserFromDolibarrDatabase",$login); + + // TODO @deprecated Remove this. Hook must be used, not this trigger. + $user->trigger_mesg='ErrorCantLoadUserFromDolibarrDatabase - login='.$login; } if ($resultFetchUser < 0) { - $user->trigger_mesg=$user->error; $_SESSION["dol_loginmesg"]=$user->error; + + // TODO @deprecated Remove this. Hook must be used, not this trigger. + $user->trigger_mesg=$user->error; } - // TODO We should use a hook afterLoginFailed here, not a trigger. // Call triggers include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; $interface=new Interfaces($db); @@ -577,16 +581,20 @@ function analyseVarsForSqlAndScriptsInjection(&$var, $type) $langs->load('main'); $langs->load('errors'); - $user->trigger_mesg='ErrorCantLoadUserFromDolibarrDatabase - login='.$login; $_SESSION["dol_loginmesg"]=$langs->trans("ErrorCantLoadUserFromDolibarrDatabase",$login); + + // TODO @deprecated Remove this. Hook must be used, not this trigger. + $user->trigger_mesg='ErrorCantLoadUserFromDolibarrDatabase - login='.$login; } if ($resultFetchUser < 0) { - $user->trigger_mesg=$user->error; $_SESSION["dol_loginmesg"]=$user->error; + + // TODO @deprecated Remove this. Hook must be used, not this trigger. + $user->trigger_mesg=$user->error; } - // TODO We should use a hook here, not a trigger. + // TODO @deprecated Remove this. Hook must be used, not this trigger. // Call triggers include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; $interface=new Interfaces($db); @@ -654,9 +662,8 @@ function analyseVarsForSqlAndScriptsInjection(&$var, $type) $loginfo = 'TZ='.$_SESSION["dol_tz"].';TZString='.$_SESSION["dol_tz_string"].';Screen='.$_SESSION["dol_screenwidth"].'x'.$_SESSION["dol_screenheight"]; + // TODO @deprecated Remove this. Hook must be used, not this trigger. $user->trigger_mesg = $loginfo; - - // TODO We should use hook afterLogin here, not a trigger // Call triggers include_once DOL_DOCUMENT_ROOT . '/core/class/interfaces.class.php'; $interface=new Interfaces($db); @@ -684,6 +691,25 @@ function analyseVarsForSqlAndScriptsInjection(&$var, $type) { $db->commit(); } + + if (! empty($user->conf->MAIN_LANDING_PAGE)) // Example: /index.php + { + $newpath=dol_buildpath($user->conf->MAIN_LANDING_PAGE, 1); + if ($_SERVER["PHP_SELF"] != $newpath) // not already on landing page (avoid infinite loop) + { + header('Location: '.$newpath); + exit; + } + } + if (! empty($conf->global->MAIN_LANDING_PAGE)) // Example: /index.php + { + $newpath=dol_buildpath($conf->global->MAIN_LANDING_PAGE, 1); + if ($_SERVER["PHP_SELF"] != $newpath) // not already on landing page (avoid infinite loop) + { + header('Location: '.$newpath); + exit; + } + } } From e9aed15bedd4f95a6b18d0949425f325d227a2e5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 14 Oct 2015 18:48:03 +0200 Subject: [PATCH 116/297] Work on the feature to select which field to show --- .../core/actions_changeselectedfields.inc.php | 48 +++++++++++++++ htdocs/core/class/html.form.class.php | 38 ++++++++---- .../install/mysql/migration/3.8.0-3.9.0.sql | 2 + .../install/mysql/tables/llx_user_param.sql | 2 +- htdocs/product/list.php | 2 +- htdocs/societe/list.php | 59 +++++++++++-------- 6 files changed, 111 insertions(+), 40 deletions(-) create mode 100644 htdocs/core/actions_changeselectedfields.inc.php diff --git a/htdocs/core/actions_changeselectedfields.inc.php b/htdocs/core/actions_changeselectedfields.inc.php new file mode 100644 index 0000000000000..11884f812249c --- /dev/null +++ b/htdocs/core/actions_changeselectedfields.inc.php @@ -0,0 +1,48 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * or see http://www.gnu.org/ + */ + +/** + * \file htdocs/core/actions_changeselectedfields.inc.php + * \brief Code for actions when we change list of fields on a list page + */ + + +// $action must be defined +// $db must be defined +// $conf must be defined +// $object must be defined (object is loaded in this file with fetch) + +// Save selection +if (GETPOST('formfilteraction') == 'listafterchangingselectedfields') +{ + $tabparam=array(); + + $varpage=empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage; + + if (GETPOST("selectedfields")) $tabparam["MAIN_SELECTEDFIELDS_".$varpage]=GETPOST("selectedfields"); + else $tabparam["MAIN_SELECTEDFIELDS_".$varpage]=''; + + include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; + + $result=dol_set_user_param($db, $conf, $user, $tabparam); + + //$action='list'; + //var_dump($tabparam);exit; +} + + diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index 17771a56782a1..b7ea040fc1715 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -4671,37 +4671,51 @@ function formatSelection(record) {'."\n"; * Show a multiselect form from an array. * * @param string $htmlname Name of select - * @param array $array Array with array to show + * @param array $array Array with array of fields we could show + * @param string $varpage Id of context for page. Can be set with $varpage=empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage; * @return string HTML multiselect string * @see selectarray */ - static function multiSelectArrayWithCheckbox($htmlname, $array) + static function multiSelectArrayWithCheckbox($htmlname, $array, $varpage) { + global $user; + + $tmpvar="MAIN_SELECTEDFIELDS_".$varpage; + if (! empty($user->conf->$tmpvar)) + { + $tmparray=explode(',', $user->conf->$tmpvar); + foreach($array as $key => $val) + { + //var_dump($key); + //var_dump($tmparray); + if (in_array($key, $tmparray)) $array[$key]['checked']=1; + else $array[$key]['checked']=0; + } + } + //var_dump($array); + $lis=''; - $liststring=''; + $listcheckedstring=''; foreach($array as $key => $val) { if (isset($val['cond']) && ! $val['cond']) continue; - if ($val['label']) + if ($val['label']) { - $lis.='
  • '.dol_escape_htmltag($val['label']).'
  • '; - $liststring.=$key.','; + $lis.='
  • '.dol_escape_htmltag($val['label']).'
  • '; + $listcheckedstring.=(empty($val['checked'])?'':$key.','); } } - $out ='
    '.$langs->trans("BoxTitleLastCustomersOrProspects",$max).''; + if (empty($conf->global->SOCIETE_DISABLE_PROSPECTS) && empty($conf->global->SOCIETE_DISABLE_CUSTOMERS)) print $langs->trans("BoxTitleLastCustomersOrProspects",$max); + else if (! empty($conf->global->SOCIETE_DISABLE_CUSTOMERS)) print $langs->trans("BoxTitleLastModifiedProspects",$max); + else print $langs->trans("BoxTitleLastModifiedCustomers",$max); + print ''.$langs->trans("DateModificationShort").'
    '; @@ -382,7 +389,7 @@ $reshook=$hookmanager->executeHooks('printFieldListTitle',$parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; print_liste_field_titre($langs->trans("Status"),$_SERVER["PHP_SELF"],"s.status","",$param,'align="right"',$sortfield,$sortorder); - print_liste_field_titre($selectotherfields, $_SERVER["PHP_SELF"],"",'','','align="right"',$sortfield,$sortorder,'maxwidthsearch '); + print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"],"",'','','align="right"',$sortfield,$sortorder,'maxwidthsearch '); print "\n"; // Fields title search From f4cbc81c97adb6833f116f4a77fc205b0994c7c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 14 Oct 2015 20:13:14 +0200 Subject: [PATCH 117/297] Bad chmod for directory when changing ref When changing product ref, the old document directory is renamed and chmod 0664 in place of 0775 --- 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 41bc2520d8f97..d90b87719e4bc 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -766,7 +766,7 @@ function update($id, $user, $notrigger=false, $action='update') if (file_exists($olddir)) { include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; - $res=dol_move($olddir, $newdir); + $res = dol_move($olddir, $newdir, '0775'); if (! $res) { $this->error='ErrorFailToMoveDir'; From 00c8b27baf46188a8bb054004898fd902729de1a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 14 Oct 2015 22:04:54 +0200 Subject: [PATCH 118/297] Add code comment --- htdocs/core/lib/files.lib.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index aa804cf125572..d65f85bd59d3c 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -949,8 +949,12 @@ function dol_move($srcfile, $destfile, $newmask=0, $overwriteifexists=1) } else dol_syslog("files.lib.php::dol_move failed", LOG_WARNING); } - if (empty($newmask) && ! empty($conf->global->MAIN_UMASK)) $newmask=$conf->global->MAIN_UMASK; - @chmod($newpathofdestfile, octdec($newmask)); + if (empty($newmask)) $newmask=empty($conf->global->MAIN_UMASK)?'0755':$conf->global->MAIN_UMASK; + $newmaskdec=octdec($newmask); + // Currently method is restricted to files (dol_delete_files previously used is for files, and mask usage if for files too) + // to allow mask usage for dir, we shoul introduce a new param "isdir" to 1 to complete newmask like this + // if ($isdir) $newmaskdec |= octdec('0111'); // Set x bit required for directories + @chmod($newpathofdestfile, $newmaskdesc); } return $result; From 3638f17d75eabf6a56a8ad0edca8b127534dd3cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Wed, 14 Oct 2015 22:28:03 +0200 Subject: [PATCH 119/297] Update product.class.php --- htdocs/product/class/product.class.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index d90b87719e4bc..aaf4126d76a26 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -765,8 +765,10 @@ function update($id, $user, $notrigger=false, $action='update') $newdir = $conf->product->dir_output . "/" . dol_sanitizeFileName($this->ref); if (file_exists($olddir)) { - include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; - $res = dol_move($olddir, $newdir, '0775'); + //include_once DOL_DOCUMENT_ROOT . '/core/lib/files.lib.php'; + //$res = dol_move($olddir, $newdir); + // do not use dol_move with directory + $res = @rename($olddir, $newdir); if (! $res) { $this->error='ErrorFailToMoveDir'; From e22b0b9a5706981cb5fd11b2d7e9feec4f440ec7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 14 Oct 2015 22:36:32 +0200 Subject: [PATCH 120/297] More complete PHPunit test --- test/phpunit/FilesLibTest.php | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/test/phpunit/FilesLibTest.php b/test/phpunit/FilesLibTest.php index e9fb713b857c8..b9f334315e6e6 100644 --- a/test/phpunit/FilesLibTest.php +++ b/test/phpunit/FilesLibTest.php @@ -330,22 +330,28 @@ public function testDolCopyMoveDelete() print __METHOD__." result=".$result."\n"; $this->assertGreaterThanOrEqual(1,$result,'copy destination already exists, overwrite'); // Should be 1 - // Again to test with overwriting=1 + // To test a move that should work $result=dol_move($conf->admin->dir_temp.'/file.csv',$conf->admin->dir_temp.'/file2.csv',0,1); print __METHOD__." result=".$result."\n"; - $this->assertTrue($result,'copy destination does not exists'); + $this->assertTrue($result,'move with default mask'); + + // To test a move that should work with forced mask + $result=dol_move($conf->admin->dir_temp.'/file2.csv',$conf->admin->dir_temp.'/file3.csv','0754',1); // file shoutld be rwxr-wr-- + print __METHOD__." result=".$result."\n"; + $this->assertTrue($result,'move with forced mask'); - $result=dol_delete_file($conf->admin->dir_temp.'/file2.csv'); + // To test a delete that should success + $result=dol_delete_file($conf->admin->dir_temp.'/file3.csv'); print __METHOD__." result=".$result."\n"; $this->assertTrue($result,'delete file'); // Again to test there is error when deleting a non existing file with option disableglob - $result=dol_delete_file($conf->admin->dir_temp.'/file2.csv',1,1); + $result=dol_delete_file($conf->admin->dir_temp.'/file3.csv',1,1); print __METHOD__." result=".$result."\n"; $this->assertFalse($result,'delete file that does not exists with disableglo must return ko'); // Again to test there is no error when deleting a non existing file without option disableglob - $result=dol_delete_file($conf->admin->dir_temp.'/file2.csv',0,1); + $result=dol_delete_file($conf->admin->dir_temp.'/file3csv',0,1); print __METHOD__." result=".$result."\n"; $this->assertTrue($result,'delete file that does not exists without disabling glob must return ok'); From 7f75a3da9d981535600c52bf0b68822e61cc1008 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Wed, 14 Oct 2015 23:50:36 +0200 Subject: [PATCH 121/297] NEW On list of thirdparties, user can select fields to show. Make phpunit test working again localy. Add missing columns into llx_expedition. --- htdocs/admin/askpricesupplier.php | 8 +- htdocs/admin/barcode.php | 6 +- htdocs/admin/commande.php | 8 +- htdocs/admin/contract.php | 6 +- htdocs/admin/expensereport.php | 2 +- htdocs/admin/facture.php | 12 +- htdocs/admin/fichinter.php | 6 +- htdocs/admin/livraison.php | 6 +- htdocs/admin/propal.php | 10 +- htdocs/admin/salaries.php | 11 +- htdocs/admin/supplier_invoice.php | 8 +- htdocs/admin/supplier_order.php | 8 +- htdocs/comm/prospect/list.php | 14 +- htdocs/core/class/html.form.class.php | 10 +- htdocs/core/lib/files.lib.php | 4 +- htdocs/core/lib/usergroups.lib.php | 2 +- .../install/mysql/migration/3.8.0-3.9.0.sql | 4 + .../install/mysql/tables/llx_expedition.sql | 4 +- htdocs/langs/en_US/main.lang | 1 + htdocs/product/class/product.class.php | 2 +- htdocs/societe/admin/societe.php | 13 +- htdocs/societe/class/societe.class.php | 6 +- htdocs/societe/list.php | 358 ++++++++++++------ htdocs/societe/soc.php | 4 +- htdocs/theme/eldy/style.css.php | 72 ++-- htdocs/theme/md/style.css.php | 65 ++-- test/phpunit/AllTests.php | 7 +- test/phpunit/CMailFileTest.php | 2 + test/phpunit/PricesTest.php | 15 +- test/phpunit/WebservicesProductsTest.php | 5 + 30 files changed, 433 insertions(+), 246 deletions(-) diff --git a/htdocs/admin/askpricesupplier.php b/htdocs/admin/askpricesupplier.php index 5644605e625f2..9bde4673ace7d 100644 --- a/htdocs/admin/askpricesupplier.php +++ b/htdocs/admin/askpricesupplier.php @@ -249,7 +249,7 @@ /* * Module numerotation */ -print load_fiche_titre($langs->trans("AskPriceSupplierNumberingModules")); +print load_fiche_titre($langs->trans("AskPriceSupplierNumberingModules"),'',''); print '
    '; print ''; @@ -351,7 +351,7 @@ * Document templates generators */ -print load_fiche_titre($langs->trans("AskPriceSupplierPDFModules")); +print load_fiche_titre($langs->trans("AskPriceSupplierPDFModules"),'',''); // Load array def with activated templates $def = array(); @@ -513,7 +513,7 @@ * Other options * */ -print load_fiche_titre($langs->trans("OtherOptions")); +print load_fiche_titre($langs->trans("OtherOptions"),'',''); $var=true; print "
    "; @@ -594,7 +594,7 @@ * Directory */ print '
    '; -print load_fiche_titre($langs->trans("PathToDocuments")); +print load_fiche_titre($langs->trans("PathToDocuments"),'',''); print "
    \n"; print "\n"; diff --git a/htdocs/admin/barcode.php b/htdocs/admin/barcode.php index 1d51e55228090..b36a222c16590 100644 --- a/htdocs/admin/barcode.php +++ b/htdocs/admin/barcode.php @@ -188,7 +188,7 @@ $var=true; print '
    '; -print load_fiche_titre($langs->trans("BarcodeEncodeModule")); +print load_fiche_titre($langs->trans("BarcodeEncodeModule"),'',''); print '
    '; print ''; @@ -288,7 +288,7 @@ * Autres options * */ -print load_fiche_titre($langs->trans("OtherOptions")); +print load_fiche_titre($langs->trans("OtherOptions"),'',''); print ""; print ''; @@ -358,7 +358,7 @@ // Select barcode numbering module if ($conf->produit->enabled) { - print load_fiche_titre($langs->trans("BarCodeNumberManager")." (".$langs->trans("Product").")"); + print load_fiche_titre($langs->trans("BarCodeNumberManager")." (".$langs->trans("Product").")",'',''); print '
    '; print ''; diff --git a/htdocs/admin/commande.php b/htdocs/admin/commande.php index b2d44047d7795..860e1a217724e 100644 --- a/htdocs/admin/commande.php +++ b/htdocs/admin/commande.php @@ -273,7 +273,7 @@ * Orders Numbering model */ -print load_fiche_titre($langs->trans("OrdersNumberingModules")); +print load_fiche_titre($langs->trans("OrdersNumberingModules"),'',''); print '
    '; print ''; @@ -377,7 +377,7 @@ * Document templates generators */ -print load_fiche_titre($langs->trans("OrdersModelModule")); +print load_fiche_titre($langs->trans("OrdersModelModule"),'',''); // Load array def with activated templates $def = array(); @@ -540,7 +540,7 @@ * */ -print load_fiche_titre($langs->trans("OtherOptions")); +print load_fiche_titre($langs->trans("OtherOptions"),'',''); print '
    '; print ''; print ''; @@ -638,7 +638,7 @@ * Notifications */ -print load_fiche_titre($langs->trans("Notifications")); +print load_fiche_titre($langs->trans("Notifications"),'',''); print '
    '.$langs->trans("Parameter").'
    '; print ''; print ''; diff --git a/htdocs/admin/contract.php b/htdocs/admin/contract.php index cf93977fc8b43..a45045a5381ef 100644 --- a/htdocs/admin/contract.php +++ b/htdocs/admin/contract.php @@ -226,7 +226,7 @@ * Contracts Numbering model */ -print load_fiche_titre($langs->trans("ContractsNumberingModules")); +print load_fiche_titre($langs->trans("ContractsNumberingModules"),'',''); print '
    '.$langs->trans("Parameter").'
    '; print ''; @@ -329,7 +329,7 @@ * Documents models for Contracts */ -print load_fiche_titre($langs->trans("TemplatePDFContracts")); +print load_fiche_titre($langs->trans("TemplatePDFContracts"),'',''); // Defini tableau def des modeles $def = array(); @@ -494,7 +494,7 @@ print ''; print ''; -print load_fiche_titre($langs->trans("OtherOptions")); +print load_fiche_titre($langs->trans("OtherOptions"),'',''); print '
    '; print ''; print ''; diff --git a/htdocs/admin/expensereport.php b/htdocs/admin/expensereport.php index f1b5eeb142788..ab5f7fb013f5c 100644 --- a/htdocs/admin/expensereport.php +++ b/htdocs/admin/expensereport.php @@ -244,7 +244,7 @@ // Interventions numbering model /* -print load_fiche_titre($langs->trans("FicheinterNumberingModules")); +print load_fiche_titre($langs->trans("FicheinterNumberingModules"),'',''); print '
    '.$langs->trans("Parameter").'
    '; print ''; diff --git a/htdocs/admin/facture.php b/htdocs/admin/facture.php index 07b00e5133ff3..568cd5dca2191 100644 --- a/htdocs/admin/facture.php +++ b/htdocs/admin/facture.php @@ -302,7 +302,7 @@ * Numbering module */ -print load_fiche_titre($langs->trans("BillsNumberingModule")); +print load_fiche_titre($langs->trans("BillsNumberingModule"),'',''); print '
    '; print ''; @@ -471,7 +471,7 @@ * Document templates generators */ print '
    '; -print load_fiche_titre($langs->trans("BillsPDFModules")); +print load_fiche_titre($langs->trans("BillsPDFModules"),'',''); // Load array def with activated templates $type='invoice'; @@ -631,7 +631,7 @@ * Modes de reglement */ print '
    '; -print load_fiche_titre($langs->trans("SuggestedPaymentModesIfNotDefinedInInvoice")); +print load_fiche_titre($langs->trans("SuggestedPaymentModesIfNotDefinedInInvoice"),'',''); print ''; print ''; @@ -726,7 +726,7 @@ print "
    "; -print load_fiche_titre($langs->trans("OtherOptions")); +print load_fiche_titre($langs->trans("OtherOptions"),'',''); print '
    '; print ''; @@ -805,7 +805,7 @@ * Repertoire */ print '
    '; -print load_fiche_titre($langs->trans("PathToDocuments")); +print load_fiche_titre($langs->trans("PathToDocuments"),'',''); print '
    '."\n"; print ''."\n"; @@ -823,7 +823,7 @@ * Notifications */ print '
    '; -print load_fiche_titre($langs->trans("Notifications")); +print load_fiche_titre($langs->trans("Notifications"),'',''); print '
    '; print ''; print ''; diff --git a/htdocs/admin/fichinter.php b/htdocs/admin/fichinter.php index 865945e2e5b9c..d29420316a989 100644 --- a/htdocs/admin/fichinter.php +++ b/htdocs/admin/fichinter.php @@ -255,7 +255,7 @@ // Interventions numbering model -print load_fiche_titre($langs->trans("FicheinterNumberingModules")); +print load_fiche_titre($langs->trans("FicheinterNumberingModules"),'',''); print '
    '.$langs->trans("Parameter").'
    '; print ''; @@ -357,7 +357,7 @@ * Documents models for Interventions */ -print load_fiche_titre($langs->trans("TemplatePDFInterventions")); +print load_fiche_titre($langs->trans("TemplatePDFInterventions"),'',''); // Defini tableau def des modeles $type='ficheinter'; @@ -511,7 +511,7 @@ * */ -print load_fiche_titre($langs->trans("OtherOptions")); +print load_fiche_titre($langs->trans("OtherOptions"),'',''); print '
    '; print ''; print ''; diff --git a/htdocs/admin/livraison.php b/htdocs/admin/livraison.php index 9257aada0292c..38345adac9a23 100644 --- a/htdocs/admin/livraison.php +++ b/htdocs/admin/livraison.php @@ -237,7 +237,7 @@ * Livraison numbering model */ -print load_fiche_titre($langs->trans("DeliveryOrderNumberingModules")); +print load_fiche_titre($langs->trans("DeliveryOrderNumberingModules"),'',''); print '
    '.$langs->trans("Parameter").'
    '; print ''; @@ -340,7 +340,7 @@ * Documents Models for delivery */ print '
    '; -print load_fiche_titre($langs->trans("DeliveryOrderModel")); +print load_fiche_titre($langs->trans("DeliveryOrderModel"),'',''); // Defini tableau def de modele $type="delivery"; @@ -487,7 +487,7 @@ * Autres Options */ print "
    "; -print load_fiche_titre($langs->trans("OtherOptions")); +print load_fiche_titre($langs->trans("OtherOptions"),'',''); print '
    '; print ''; diff --git a/htdocs/admin/propal.php b/htdocs/admin/propal.php index b9242bd0c4eec..41362fd5664ad 100644 --- a/htdocs/admin/propal.php +++ b/htdocs/admin/propal.php @@ -270,7 +270,7 @@ /* * Module numerotation */ -print load_fiche_titre($langs->trans("ProposalsNumberingModules")); +print load_fiche_titre($langs->trans("ProposalsNumberingModules"),'',''); print '
    '; print ''; @@ -374,7 +374,7 @@ * Document templates generators */ -print load_fiche_titre($langs->trans("ProposalsPDFModules")); +print load_fiche_titre($langs->trans("ProposalsPDFModules"),'',''); // Load array def with activated templates $def = array(); @@ -536,7 +536,7 @@ * Other options * */ -print load_fiche_titre($langs->trans("OtherOptions")); +print load_fiche_titre($langs->trans("OtherOptions"),'',''); $var=true; print "
    "; @@ -643,7 +643,7 @@ * Directory */ print '
    '; -print load_fiche_titre($langs->trans("PathToDocuments")); +print load_fiche_titre($langs->trans("PathToDocuments"),'',''); print "
    \n"; print "\n"; @@ -658,7 +658,7 @@ * Notifications */ -print load_fiche_titre($langs->trans("Notifications")); +print load_fiche_titre($langs->trans("Notifications"),'',''); print '
    '; print ''; print ''; diff --git a/htdocs/admin/salaries.php b/htdocs/admin/salaries.php index bb37e73fc88d6..53deb9610ca2b 100644 --- a/htdocs/admin/salaries.php +++ b/htdocs/admin/salaries.php @@ -83,6 +83,8 @@ print ''; print ''; +dol_fiche_head(); + /* * Params */ @@ -109,10 +111,13 @@ print ''; -print ''; print "
    '.$langs->trans("Parameter").'
    \n"; -print '
    '; +print ''; + +dol_fiche_end(); + +print '
    '; llxFooter(); -$db->close(); \ No newline at end of file +$db->close(); diff --git a/htdocs/admin/supplier_invoice.php b/htdocs/admin/supplier_invoice.php index 694247e7b81ef..7e075f25c8f92 100644 --- a/htdocs/admin/supplier_invoice.php +++ b/htdocs/admin/supplier_invoice.php @@ -205,7 +205,7 @@ // Supplier invoice numbering module -print load_fiche_titre($langs->trans("SuppliersInvoiceNumberingModel")); +print load_fiche_titre($langs->trans("SuppliersInvoiceNumberingModel"),'',''); print ''; print ''; @@ -311,7 +311,7 @@ * Modeles documents for supplier invoices */ -print load_fiche_titre($langs->trans("BillsPDFModules")); +print load_fiche_titre($langs->trans("BillsPDFModules"),'',''); // Defini tableau def de modele $def = array(); @@ -453,7 +453,7 @@ print ''; print ''; -print load_fiche_titre($langs->trans("OtherOptions")); +print load_fiche_titre($langs->trans("OtherOptions"),'',''); print '
    '; print ''; print ''; @@ -487,7 +487,7 @@ * Notifications */ -print load_fiche_titre($langs->trans("Notifications")); +print load_fiche_titre($langs->trans("Notifications"),'',''); print '
    '.$langs->trans("Parameter").'
    '; print ''; print ''; diff --git a/htdocs/admin/supplier_order.php b/htdocs/admin/supplier_order.php index 861e94c881bdf..69d518d9a6195 100644 --- a/htdocs/admin/supplier_order.php +++ b/htdocs/admin/supplier_order.php @@ -221,7 +221,7 @@ // Supplier order numbering module -print load_fiche_titre($langs->trans("OrdersNumberingModules")); +print load_fiche_titre($langs->trans("OrdersNumberingModules"),'',''); print '
    '.$langs->trans("Parameter").'
    '; print ''; @@ -325,7 +325,7 @@ * Documents models for supplier orders */ -print load_fiche_titre($langs->trans("OrdersModelModule")); +print load_fiche_titre($langs->trans("OrdersModelModule"),'',''); // Defini tableau def de modele $def = array(); @@ -464,7 +464,7 @@ print ''; print ''; -print load_fiche_titre($langs->trans("OtherOptions")); +print load_fiche_titre($langs->trans("OtherOptions"),'',''); print '
    '; print ''; print ''; @@ -512,7 +512,7 @@ * Notifications */ -print load_fiche_titre($langs->trans("Notifications")); +print load_fiche_titre($langs->trans("Notifications"),'',''); print '
    '.$langs->trans("Parameter").'
    '; print ''; print ''; diff --git a/htdocs/comm/prospect/list.php b/htdocs/comm/prospect/list.php index 2282b39420e21..8ec43d955a462 100644 --- a/htdocs/comm/prospect/list.php +++ b/htdocs/comm/prospect/list.php @@ -159,7 +159,8 @@ // Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array -$hookmanager->initHooks(array('prospectlist')); +$contextpage='prospectlist'; +$hookmanager->initHooks(array($contextpage)); $extrafields = new ExtraFields($db); // fetch optionals attributes and labels @@ -167,7 +168,7 @@ $search_array_options=$extrafields->getOptionalsFromPost($extralabels,'','search_'); // Do we click on purge search criteria ? -if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers +if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers { $socname=""; $stcomm=""; @@ -271,7 +272,7 @@ $sortfield = "s.nom"; $sortorder = "ASC"; } -// Extra fields +// Add where from extra fields foreach ($search_array_options as $key => $val) { $crit=$val; @@ -339,15 +340,14 @@ if ($search_status != '') $param.='&search_status='.$search_status; if ($search_country != '') $param.='&search_country='.$search_country; if ($search_type_thirdparty != '') $param.='&search_type_thirdparty='.$search_type_thirdparty; - foreach ($search_array_options as $key => $val) + // Add $param from extra fields + foreach ($search_array_options as $key => $val) { $crit=$val; $tmpkey=preg_replace('/search_options_/','',$key); $param.='&search_options_'.$tmpkey.'='.urlencode($val); } - // $param and $urladd should have the same value - $urladd = $param; - + print_barre_liste($langs->trans("ListOfProspects"), $page, $_SERVER["PHP_SELF"], $param, $sortfield,$sortorder,'',$num,$nbtotalofrecords,'title_companies.png'); diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index b7ea040fc1715..a0a0e6497554e 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -4671,12 +4671,12 @@ function formatSelection(record) {'."\n"; * Show a multiselect form from an array. * * @param string $htmlname Name of select - * @param array $array Array with array of fields we could show + * @param array $array Array with array of fields we could show. This array may be modified according to setup of user. * @param string $varpage Id of context for page. Can be set with $varpage=empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage; * @return string HTML multiselect string * @see selectarray */ - static function multiSelectArrayWithCheckbox($htmlname, $array, $varpage) + static function multiSelectArrayWithCheckbox($htmlname, &$array, $varpage) { global $user; @@ -4699,7 +4699,11 @@ static function multiSelectArrayWithCheckbox($htmlname, $array, $varpage) foreach($array as $key => $val) { - if (isset($val['cond']) && ! $val['cond']) continue; + if (isset($val['enabled']) && ! $val['enabled']) + { + unset($array[$key]); // We don't want this field + continue; + } if ($val['label']) { $lis.='
  • '.dol_escape_htmltag($val['label']).'
  • '; diff --git a/htdocs/core/lib/files.lib.php b/htdocs/core/lib/files.lib.php index d65f85bd59d3c..e8c63f2b96ca9 100644 --- a/htdocs/core/lib/files.lib.php +++ b/htdocs/core/lib/files.lib.php @@ -921,7 +921,7 @@ function dolCopyDir($srcfile, $destfile, $newmask, $overwriteifexists) * * @param string $srcfile Source file (can't be a directory. use native php @rename() to move a directory) * @param string $destfile Destination file (can't be a directory. use native php @rename() to move a directory) - * @param integer $newmask Mask for new file (0 by default means $conf->global->MAIN_UMASK) + * @param integer $newmask Mask in octal string for new file (0 by default means $conf->global->MAIN_UMASK) * @param int $overwriteifexists Overwrite file if exists (1 by default) * @return boolean True if OK, false if KO */ @@ -954,7 +954,7 @@ function dol_move($srcfile, $destfile, $newmask=0, $overwriteifexists=1) // Currently method is restricted to files (dol_delete_files previously used is for files, and mask usage if for files too) // to allow mask usage for dir, we shoul introduce a new param "isdir" to 1 to complete newmask like this // if ($isdir) $newmaskdec |= octdec('0111'); // Set x bit required for directories - @chmod($newpathofdestfile, $newmaskdesc); + @chmod($newpathofdestfile, $newmaskdec); } return $result; diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php index 23e122b89f690..243438b0aa659 100644 --- a/htdocs/core/lib/usergroups.lib.php +++ b/htdocs/core/lib/usergroups.lib.php @@ -486,7 +486,7 @@ function show_theme($fuser,$edit=0,$foruserprofile=false) { print $formother->showColor($conf->global->THEME_ELDY_BACKTITLE1, $langs->trans("Default")); } - print '   ('.$langs->trans("NotSupportedByAllThemes").', '.$langs->trans("PressF5AfterChangingThis").')'; + print '   ('.$langs->trans("Default").': e6e6e6, '.$langs->trans("NotSupportedByAllThemes").', '.$langs->trans("PressF5AfterChangingThis").')'; print ''; print ''; diff --git a/htdocs/install/mysql/migration/3.8.0-3.9.0.sql b/htdocs/install/mysql/migration/3.8.0-3.9.0.sql index 02f716633f5ec..5442c1c1862d2 100755 --- a/htdocs/install/mysql/migration/3.8.0-3.9.0.sql +++ b/htdocs/install/mysql/migration/3.8.0-3.9.0.sql @@ -57,3 +57,7 @@ ALTER TABLE llx_paiement ADD COLUMN ref varchar(30) NOT NULL AFTER rowid; ALTER TABLE llx_socpeople ADD COLUMN photo varchar(255) AFTER skype; ALTER TABLE llx_user_param MODIFY COLUMN value text NOT NULL; + +ALTER TABLE llx_expedition ADD COLUMN import_key varchar(14); +ALTER TABLE llx_expedition ADD COLUMN extraparams varchar(255); + diff --git a/htdocs/install/mysql/tables/llx_expedition.sql b/htdocs/install/mysql/tables/llx_expedition.sql index d142a5cc628cf..8421bb1649cf0 100644 --- a/htdocs/install/mysql/tables/llx_expedition.sql +++ b/htdocs/install/mysql/tables/llx_expedition.sql @@ -52,6 +52,8 @@ create table llx_expedition note_public text, model_pdf varchar(255), fk_incoterms integer, -- for incoterms - location_incoterms varchar(255) -- for incoterms + location_incoterms varchar(255), -- for incoterms + import_key varchar(14), + extraparams varchar(255) -- for other parameters with json format )ENGINE=innodb; diff --git a/htdocs/langs/en_US/main.lang b/htdocs/langs/en_US/main.lang index ce3f8edc0d8e6..2761ba85c4546 100644 --- a/htdocs/langs/en_US/main.lang +++ b/htdocs/langs/en_US/main.lang @@ -229,6 +229,7 @@ DateAndHour=Date and hour DateStart=Date start DateEnd=Date end DateCreation=Creation date +DateCreationShort=Creat. date DateModification=Modification date DateModificationShort=Modif. date DateLastModification=Last modification date diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index 41bc2520d8f97..d499652a0437e 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -821,7 +821,7 @@ function update($id, $user, $notrigger=false, $action='update') function delete($id=0) { // Deprecation warning - if (0 == $id) { + if ($id > 0) { dol_syslog(__METHOD__ . " with parameter is deprecated", LOG_WARNING); } diff --git a/htdocs/societe/admin/societe.php b/htdocs/societe/admin/societe.php index 10f5ab290450c..0318caa665b81 100644 --- a/htdocs/societe/admin/societe.php +++ b/htdocs/societe/admin/societe.php @@ -299,7 +299,7 @@ // Module to manage customer/supplier code -print load_fiche_titre($langs->trans("CompanyCodeChecker")); +print load_fiche_titre($langs->trans("CompanyCodeChecker"),'',''); print '
    '.$langs->trans("Parameter").'
    '."\n"; print ''."\n"; @@ -381,7 +381,7 @@ // Select accountancy code numbering module -print load_fiche_titre($langs->trans("AccountCodeManager")); +print load_fiche_titre($langs->trans("AccountCodeManager"),'',''); print '
    '; print ''; @@ -452,7 +452,7 @@ * Document templates generators */ print '
    '; -print load_fiche_titre($langs->trans("ModelModules")); +print load_fiche_titre($langs->trans("ModelModules"),'',''); // Load array def with activated templates $def = array(); @@ -598,7 +598,7 @@ print '
    '; //IDProf -print load_fiche_titre($langs->trans("CompanyIdProfChecker")); +print load_fiche_titre($langs->trans("CompanyIdProfChecker"),'',''); print '
    '; print ''; @@ -691,7 +691,7 @@ print "

    \n"; -print load_fiche_titre($langs->trans("Other")); +print load_fiche_titre($langs->trans("Other"),'',''); // Autres options $form=new Form($db); @@ -804,6 +804,7 @@ dol_fiche_end(); -$db->close(); llxFooter(); + +$db->close(); diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 8170c9219279c..a0989f3b8c336 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -677,8 +677,8 @@ function update($id, $user='', $call_trigger=1, $allowmodcodeclient=0, $allowmod $this->localtax1_value=trim($this->localtax1_value); $this->localtax2_value=trim($this->localtax2_value); - $this->capital=price2num(trim($this->capital),'MT'); - if (empty($this->capital) || ! is_numeric($this->capital)) $this->capital = 0; + if ($this->capital != '') $this->capital=price2num(trim($this->capital)); + if (! is_numeric($this->capital)) $this->capital = ''; // '' = undef $this->effectif_id=trim($this->effectif_id); $this->forme_juridique_code=trim($this->forme_juridique_code); @@ -806,7 +806,7 @@ function update($id, $user='', $call_trigger=1, $allowmodcodeclient=0, $allowmod } else $sql .=",localtax2_value =0.000"; - $sql .= ",capital = ".$this->capital; + $sql .= ",capital = ".($this->capital == '' ? "null" : $this->capital); $sql .= ",prefix_comm = ".(! empty($this->prefix_comm)?"'".$this->db->escape($this->prefix_comm)."'":"null"); diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index 097bbcc28abf3..95b9747ca0b7b 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -46,6 +46,7 @@ $search_all=trim(GETPOST("search_all")); $sbarcode=trim(GETPOST("sbarcode")); $search_town=trim(GETPOST("search_town")); +$search_zip=trim(GETPOST("search_zip")); $socname=trim(GETPOST("socname")); $search_idprof1=trim(GETPOST('search_idprof1')); $search_idprof2=trim(GETPOST('search_idprof2')); @@ -79,6 +80,10 @@ $hookmanager->initHooks(array($contextpage)); $extrafields = new ExtraFields($db); +// fetch optionals attributes and labels +$extralabels = $extrafields->fetch_name_optionals_label('thirdparty'); +$search_array_options=$extrafields->getOptionalsFromPost($extralabels,'','search_'); + /* * Actions @@ -179,6 +184,7 @@ $search_nom=""; $sbarcode=""; $search_town=""; + $search_zip=""; $search_idprof1=''; $search_idprof2=''; $search_idprof3=''; @@ -187,6 +193,7 @@ $search_country=''; $search_type_thirdparty=''; $search_status=''; + $search_array_options=array(); } if ($search_status=='') $search_status=1; // always display active thirdparty first @@ -211,7 +218,7 @@ */ $title=$langs->trans("ListOfThirdParties"); -$sql = "SELECT s.rowid, s.nom as name, s.barcode, s.town, s.datec, s.code_client, s.code_fournisseur, "; +$sql = "SELECT s.rowid, s.nom as name, s.barcode, s.town, s.zip, s.datec, s.code_client, s.code_fournisseur, "; $sql.= " st.libelle as stcomm, s.prefix_comm, s.client, s.fournisseur, s.canvas, s.status as status,"; $sql.= " s.siren as idprof1, s.siret as idprof2, ape as idprof3, idprof4 as idprof4,"; $sql.= " s.fk_pays, s.tms as date_update, s.datec as date_creation,"; @@ -220,13 +227,14 @@ if ($search_sale) $sql .= ", sc.fk_soc, sc.fk_user"; // We'll need these fields in order to filter by categ if ($search_categ) $sql .= ", cs.fk_categorie, cs.fk_soc"; -// Add fields for extrafields +// Add fields from extrafields foreach ($extrafields->attribute_list as $key => $val) $sql.=",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"; +if (is_array($extrafields->attribute_list) && count($extrafields->attribute_list)) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_extrafields as ef on (s.rowid = ef.fk_object)"; $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.= " ,".MAIN_DB_PREFIX."c_stcomm as st"; @@ -241,18 +249,19 @@ if ($search_sale) $sql.= " AND s.rowid = sc.fk_soc"; // Join for the needed table to filter by sale if ($search_categ) $sql.= " AND s.rowid = cs.fk_soc"; // Join for the needed table to filter by categ if (! $user->rights->fournisseur->lire) $sql.=" AND (s.fournisseur <> 1 OR s.client <> 0)"; // client=0, fournisseur=0 must be visible -if ($search_sale) $sql .= " AND sc.fk_user = ".$db->escape($search_sale); -if ($search_categ) $sql .= " AND cs.fk_categorie = ".$db->escape($search_categ); +if ($search_sale) $sql.= " AND sc.fk_user = ".$db->escape($search_sale); +if ($search_categ) $sql.= " AND cs.fk_categorie = ".$db->escape($search_categ); if ($search_nom_only) $sql.= natural_search("s.nom",$search_nom_only); if ($search_all) $sql.= natural_search(array("s.nom", "s.name_alias", "s.code_client", "s.code_fournisseur", "s.email", "s.url","s.siren","s.siret","s.ape","s.idprof4","s.idprof5","s.idprof6"), $search_all); if ($search_nom) $sql.= natural_search(array("s.nom", "s.name_alias", "s.code_client", "s.code_fournisseur", "s.email", "s.url","s.siren","s.siret","s.ape","s.idprof4","s.idprof5","s.idprof6"), $search_nom); -if ($search_town) $sql .= " AND s.town LIKE '%".$db->escape($search_town)."%'"; -if ($search_idprof1) $sql .= " AND s.siren LIKE '%".$db->escape($search_idprof1)."%'"; -if ($search_idprof2) $sql .= " AND s.siret LIKE '%".$db->escape($search_idprof2)."%'"; -if ($search_idprof3) $sql .= " AND s.ape LIKE '%".$db->escape($search_idprof3)."%'"; -if ($search_idprof4) $sql .= " AND s.idprof4 LIKE '%".$db->escape($search_idprof4)."%'"; -if ($search_idprof5) $sql .= " AND s.idprof5 LIKE '%".$db->escape($search_idprof5)."%'"; -if ($search_idprof6) $sql .= " AND s.idprof6 LIKE '%".$db->escape($search_idprof6)."%'"; +if ($search_town) $sql.= natural_search("s.town",$search_town); +if ($search_zip) $sql.= natural_search("s.zip",$search_zip); +if ($search_idprof1) $sql.= natural_search("s.siren",$search_idprof1); +if ($search_idprof2) $sql.= natural_search("s.siret",$search_idprof2); +if ($search_idprof3) $sql.= natural_search("s.ape",$search_idprof3); +if ($search_idprof4) $sql.= natural_search("s.idprof4",$search_idprof4); +if ($search_idprof5) $sql.= natural_search("s.idprof5",$search_idprof5); +if ($search_idprof6) $sql.= natural_search("s.idprof6",$search_idprof6); // Filter on type of thirdparty if ($search_type > 0 && in_array($search_type,array('1,3','2,3'))) $sql .= " AND s.client IN (".$db->escape($search_type).")"; if ($search_type > 0 && in_array($search_type,array('4'))) $sql .= " AND s.fournisseur = 1"; @@ -261,6 +270,19 @@ if (!empty($conf->barcode->enabled) && $sbarcode) $sql.= " AND s.barcode LIKE '%".$db->escape($sbarcode)."%'"; if ($search_country) $sql .= " AND s.fk_pays IN (".$search_country.')'; if ($search_type_thirdparty) $sql .= " AND s.fk_typent IN (".$search_type_thirdparty.')'; +// 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'))) $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 @@ -286,6 +308,7 @@ $param = "&socname=".urlencode($socname); $param.= "&search_nom=".urlencode($search_nom); $param.= "&search_town=".urlencode($search_town); + $param.= "&search_zip=".urlencode($search_zip); $param.= ($sbarcode?"&sbarcode=".urlencode($sbarcode):""); $param.= '&search_idprof1='.urlencode($search_idprof1); $param.= '&search_idprof2='.urlencode($search_idprof2); @@ -295,8 +318,15 @@ if ($search_type_thirdparty != '') $param.='&search_type_thirdparty='.urlencode($search_type_thirdparty); if ($optioncss != '') $param.='&optioncss='.urlencode($optioncss); if ($search_status != '') $params.='&search_status='.urlencode($search_status); - - print_barre_liste($title, $page, $_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num,$nbtotalofrecords,'title_companies'); + // Add $param from extra fields + foreach ($search_array_options as $key => $val) + { + $crit=$val; + $tmpkey=preg_replace('/search_options_/','',$key); + $param.='&search_options_'.$tmpkey.'='.urlencode($val); + } + + print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'title_companies'); // Show delete result message if (GETPOST('delsoc')) @@ -321,6 +351,8 @@ if ($optioncss != '') print ''; print ''; print ''; + print ''; + print ''; // Filter on categories /* Not possible in this page because list is for ALL third parties type @@ -354,8 +386,9 @@ // Define list of fields to show into list $arrayfields=array( 's.nom'=>array('label'=>$langs->trans("Company"), 'checked'=>1), - 's.barcode'=>array('label'=>$langs->trans("BarCode"), 'checked'=>1, 'cond'=>(! empty($conf->barcode->enabled))), + 's.barcode'=>array('label'=>$langs->trans("BarCode"), 'checked'=>1, 'enabled'=>(! empty($conf->barcode->enabled))), 's.town'=>array('label'=>$langs->trans("Town"), 'checked'=>1), + 's.zip'=>array('label'=>$langs->trans("Zip"), 'checked'=>1), 'country.code_iso'=>array('label'=>$langs->trans("Country"), 'checked'=>1), 'typent.code'=>array('label'=>$langs->trans("ThirdPartyType"), 'checked'=>1), 's.siren'=>array('label'=>$langs->trans("ProfId1Short"), 'checked'=>1), @@ -363,81 +396,120 @@ 's.ape'=>array('label'=>$langs->trans("ProfId3Short"), 'checked'=>1), 's.idprof4'=>array('label'=>$langs->trans("ProfId4Short"), 'checked'=>1), 's.status'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>200), - 's.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500), 's.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), + 's.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500), ); - if ($conf->global->MAIN_FEATURES_LEVEL >= 2) - { - $varpage=empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage; - $selectedfields=$form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); - } - + $varpage=empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage; + $selectedfields=$form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); print ''; print ''; - print_liste_field_titre($langs->trans("Company"),$_SERVER["PHP_SELF"],"s.nom","",$param,"",$sortfield,$sortorder); - if (! empty($conf->barcode->enabled)) print_liste_field_titre($langs->trans("BarCode"), $_SERVER["PHP_SELF"], "s.barcode",$param,'','',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Town"),$_SERVER["PHP_SELF"],"s.town","",$param,'',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Country"),$_SERVER["PHP_SELF"],"country.code_iso","",$param,'align="center"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("ThirdPartyType"),$_SERVER["PHP_SELF"],"typent.code","",$param,'align="center"',$sortfield,$sortorder); - print_liste_field_titre($form->textwithpicto($langs->trans("ProfId1Short"),$textprofid[1],1,0),$_SERVER["PHP_SELF"],"s.siren","",$param,'class="nowrap"',$sortfield,$sortorder); - print_liste_field_titre($form->textwithpicto($langs->trans("ProfId2Short"),$textprofid[2],1,0),$_SERVER["PHP_SELF"],"s.siret","",$param,'class="nowrap"',$sortfield,$sortorder); - print_liste_field_titre($form->textwithpicto($langs->trans("ProfId3Short"),$textprofid[3],1,0),$_SERVER["PHP_SELF"],"s.ape","",$param,'class="nowrap"',$sortfield,$sortorder); - print_liste_field_titre($form->textwithpicto($langs->trans("ProfId4Short"),$textprofid[4],1,0),$_SERVER["PHP_SELF"],"s.idprof4","",$param,'class="nowrap"',$sortfield,$sortorder); - print_liste_field_titre(''); - $parameters=array(); + if (! empty($arrayfields['s.nom']['checked'])) print_liste_field_titre($langs->trans("Company"),$_SERVER["PHP_SELF"],"s.nom","",$param,"",$sortfield,$sortorder); + if (! empty($arrayfields['s.barcode']['checked'])) print_liste_field_titre($langs->trans("BarCode"), $_SERVER["PHP_SELF"], "s.barcode",$param,'','',$sortfield,$sortorder); + if (! empty($arrayfields['s.town']['checked'])) print_liste_field_titre($langs->trans("Town"),$_SERVER["PHP_SELF"],"s.town","",$param,'',$sortfield,$sortorder); + if (! empty($arrayfields['s.zip']['checked'])) print_liste_field_titre($langs->trans("Zip"),$_SERVER["PHP_SELF"],"s.zip","",$param,'',$sortfield,$sortorder); + if (! empty($arrayfields['country.code_iso']['checked'])) print_liste_field_titre($langs->trans("Country"),$_SERVER["PHP_SELF"],"country.code_iso","",$param,'align="center"',$sortfield,$sortorder); + if (! empty($arrayfields['typent.code']['checked'])) print_liste_field_titre($langs->trans("ThirdPartyType"),$_SERVER["PHP_SELF"],"typent.code","",$param,'align="center"',$sortfield,$sortorder); + if (! empty($arrayfields['s.siren']['checked'])) print_liste_field_titre($form->textwithpicto($langs->trans("ProfId1Short"),$textprofid[1],1,0),$_SERVER["PHP_SELF"],"s.siren","",$param,'class="nowrap"',$sortfield,$sortorder); + if (! empty($arrayfields['s.siret']['checked'])) print_liste_field_titre($form->textwithpicto($langs->trans("ProfId2Short"),$textprofid[2],1,0),$_SERVER["PHP_SELF"],"s.siret","",$param,'class="nowrap"',$sortfield,$sortorder); + if (! empty($arrayfields['s.ape']['checked'])) print_liste_field_titre($form->textwithpicto($langs->trans("ProfId3Short"),$textprofid[3],1,0),$_SERVER["PHP_SELF"],"s.ape","",$param,'class="nowrap"',$sortfield,$sortorder); + if (! empty($arrayfields['s.idprof4']['checked'])) print_liste_field_titre($form->textwithpicto($langs->trans("ProfId4Short"),$textprofid[4],1,0),$_SERVER["PHP_SELF"],"s.idprof4","",$param,'class="nowrap"',$sortfield,$sortorder); + print_liste_field_titre(''); // type of customer + // Extra fields + if (is_array($extrafields->attribute_list) && count($extrafields->attribute_list)) + { + foreach($extrafields->attribute_list as $key => $val) + { + if ($val) + { + if (! empty($arrayfields["ef.".$key]['checked'])) print_liste_field_titre($extralabels[$key],$_SERVER["PHP_SELF"],"ef.".$key,"",$param,"",$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; - print_liste_field_titre($langs->trans("Status"),$_SERVER["PHP_SELF"],"s.status","",$param,'align="right"',$sortfield,$sortorder); + if (! empty($arrayfields['s.status']['checked'])) print_liste_field_titre($langs->trans("Status"),$_SERVER["PHP_SELF"],"s.status","",$param,'align="right"',$sortfield,$sortorder); + if (! empty($arrayfields['s.datec']['checked'])) print_liste_field_titre($langs->trans("DateCreationShort"),$_SERVER["PHP_SELF"],"s.datec","",$param,'align="center" class="nowrap"',$sortfield,$sortorder); + if (! empty($arrayfields['s.tms']['checked'])) print_liste_field_titre($langs->trans("DateModificationShort"),$_SERVER["PHP_SELF"],"s.tms","",$param,'align="center" class="nowrap"',$sortfield,$sortorder); print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"],"",'','','align="right"',$sortfield,$sortorder,'maxwidthsearch '); print "\n"; // Fields title search print ''; - print ''; + if (! empty($arrayfields['s.nom']['checked'])) + { + print ''; + } // Barcode - if (! empty($conf->barcode->enabled)) - { + if (! empty($arrayfields['s.barcode']['checked'])) + { print ''; } // Town - print ''; - //Country - print ''; - //Company type - print ''; - // IdProf1 - print ''; - // IdProf2 - print ''; - // IdProf3 - print ''; - // IdProf4 - print ''; + if (! empty($arrayfields['s.town']['checked'])) + { + print ''; + } + // Zip + if (! empty($arrayfields['s.zip']['checked'])) + { + print ''; + } + // Country + if (! empty($arrayfields['country.code_iso']['checked'])) + { + print ''; + } + // Company type + if (! empty($arrayfields['typent.code']['checked'])) + { + print ''; + } + if (! empty($arrayfields['s.siren']['checked'])) + { + // IdProf1 + print ''; + } + if (! empty($arrayfields['s.siret']['checked'])) + { + // IdProf2 + print ''; + } + if (! empty($arrayfields['s.ape']['checked'])) + { + // IdProf3 + print ''; + } + if (! empty($arrayfields['s.idprof4']['checked'])) + { + // IdProf4 + print ''; + } // Type (customer/prospect/supplier) - print ''; - - $parameters=array(); + // 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; - - // Status - print ''; - + if (! empty($arrayfields['s.status']['checked'])) + { + // Status + print ''; + } + if (! empty($arrayfields['s.datec']['checked'])) + { + // Date creation + print ''; + } + if (! empty($arrayfields['s.tms']['checked'])) + { + // Date modification + print ''; + } + // Action column print '"; - print "\n"; + if (! empty($arrayfields['s.nom']['checked'])) + { + print "\n"; + } // Barcode - if (! empty($conf->barcode->enabled)) + if (! empty($arrayfields['s.barcode']['checked'])) { print ''; } - print "\n"; - //Country - print ''; - //Type ent - print ''; - print "\n"; - print "\n"; - print "\n"; - print "\n"; - print '\n"; + } + // Zip + if (! empty($arrayfields['s.zip']['checked'])) + { + print "\n"; + } + // Country + if (! empty($arrayfields['country.code_iso']['checked'])) + { + print ''; + } + // Type ent + if (! empty($arrayfields['typent.code']['checked'])) + { + print ''; + } + if (! empty($arrayfields['s.siren']['checked'])) + { + print "\n"; + } + if (! empty($arrayfields['s.siret']['checked'])) + { + print "\n"; + } + if (! empty($arrayfields['s.ape']['checked'])) + { + print "\n"; + } + if (! empty($arrayfields['s.idprof4']['checked'])) + { + print "\n"; + } + print ''; - - $parameters=array('obj' => $obj); - $reshook=$hookmanager->executeHooks('printFieldListValue',$parameters); // Note that $action and $object may have been modified by hook + // 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; - // Status - print ''; - + if (! empty($arrayfields['s.status']['checked'])) + { + print ''; + } + if (! empty($arrayfields['s.datec']['checked'])) + { + // Date creation + print ''; + } + if (! empty($arrayfields['s.tms']['checked'])) + { + // Date modification + print ''; + } + // Action column print ''; print ''."\n"; @@ -538,7 +670,7 @@ $db->free($resql); - $parameters=array('sql' => $sql); + $parameters=array('arrayfields'=>$arrayfields, 'sql'=>$sql); $reshook=$hookmanager->executeHooks('printFieldListFooter',$parameters); // Note that $action and $object may have been modified by hook print $hookmanager->resPrint; diff --git a/htdocs/societe/soc.php b/htdocs/societe/soc.php index 6570a7379670f..24d8d146e964b 100644 --- a/htdocs/societe/soc.php +++ b/htdocs/societe/soc.php @@ -781,7 +781,7 @@ $object->fax = GETPOST('fax', 'alpha'); $object->email = GETPOST('email', 'custom', 0, FILTER_SANITIZE_EMAIL); $object->url = GETPOST('url', 'custom', 0, FILTER_SANITIZE_URL); - $object->capital = GETPOST('capital', 'int'); + $object->capital = GETPOST('capital', 'alpha'); $object->barcode = GETPOST('barcode', 'alpha'); $object->idprof1 = GETPOST('idprof1', 'alpha'); $object->idprof2 = GETPOST('idprof2', 'alpha'); @@ -1330,7 +1330,7 @@ $object->fax = GETPOST('fax', 'alpha'); $object->email = GETPOST('email', 'custom', 0, FILTER_SANITIZE_EMAIL); $object->url = GETPOST('url', 'custom', 0, FILTER_SANITIZE_URL); - $object->capital = GETPOST('capital', 'int'); + $object->capital = GETPOST('capital', 'alpha'); $object->idprof1 = GETPOST('idprof1', 'alpha'); $object->idprof2 = GETPOST('idprof2', 'alpha'); $object->idprof3 = GETPOST('idprof3', 'alpha'); diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 48b6c0c0a2429..6067b9b4aa883 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -90,7 +90,10 @@ $colorbacklinepair2='248,248,248'; // line pair $colorbacklinepairhover='238,246,252'; // line pair $colorbackbody='255,255,255'; -$colortext='40,40,40'; +//$colortexttitlenotab='40,0,70'; +$colortexttitlenotab='80,80,0'; +$colortexttitle=''; +$colortext=''; $fontsize='12'; $fontsizesmaller='11'; $usegradient=1; @@ -116,6 +119,8 @@ $conf->global->THEME_ELDY_LINEPAIRHOVER='238,246,252'; $conf->global->THEME_ELDY_USE_HOVER=='238,246,252'; $conf->global->THEME_ELDY_BACKBODY='255,255,255'; + //$conf->global->THEME_ELDY_TEXTTITLE='0,0,0'; + $conf->global->THEME_ELDY_TEXT='0,0,0'; $conf->global->THEME_ELDY_FONT_SIZE1='12'; $conf->global->THEME_ELDY_FONT_SIZE2='11'; @@ -135,6 +140,7 @@ $colorbacklinepair2 =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_LINEPAIR2) ?$colorbacklinepair2:$conf->global->THEME_ELDY_LINEPAIR2) :(empty($user->conf->THEME_ELDY_LINEPAIR2)?$colorbacklinepair2:$user->conf->THEME_ELDY_LINEPAIR2); $colorbacklinepairhover=empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_LINEPAIRHOVER) ?$colorbacklinepairhover:$conf->global->THEME_ELDY_LINEPAIRHOVER) :(empty($user->conf->THEME_ELDY_LINEPAIRHOVER)?$colorbacklinepairhover:$user->conf->THEME_ELDY_LINEPAIRHOVER); $colorbackbody =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_BACKBODY) ?$colorbackbody:$conf->global->THEME_ELDY_BACKBODY) :(empty($user->conf->THEME_ELDY_BACKBODY)?$colorbackbody:$user->conf->THEME_ELDY_BACKBODY); +$colortexttitle =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_TEXTTITLE) ?$colortext:$conf->global->THEME_ELDY_TEXTTITLE) :(empty($user->conf->THEME_ELDY_TEXTTITLE)?$colortexttitle:$user->conf->THEME_ELDY_TEXTTITLE); $colortext =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_TEXT) ?$colortext:$conf->global->THEME_ELDY_TEXT) :(empty($user->conf->THEME_ELDY_TEXT)?$colortext:$user->conf->THEME_ELDY_TEXT); $fontsize =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_FONT_SIZE1) ?$fontsize:$conf->global->THEME_ELDY_FONT_SIZE1) :(empty($user->conf->THEME_ELDY_FONT_SIZE1)?$fontsize:$user->conf->THEME_ELDY_FONT_SIZE1); $fontsizesmaller =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_FONT_SIZE2) ?$fontsize:$conf->global->THEME_ELDY_FONT_SIZE2) :(empty($user->conf->THEME_ELDY_FONT_SIZE2)?$fontsize:$user->conf->THEME_ELDY_FONT_SIZE2); @@ -146,6 +152,31 @@ $colorbacklinepairhover=((! isset($user->conf->THEME_ELDY_USE_HOVER) || $user->conf->THEME_ELDY_USE_HOVER === '0')?'':($user->conf->THEME_ELDY_USE_HOVER === '1'?'edf4fb':$user->conf->THEME_ELDY_USE_HOVER)); } +// Set text color to black or white +$tmppart=explode(',',$colorbackhmenu1); +$tmpval=(! empty($tmppart[1]) ? $tmppart[1] : '')+(! empty($tmppart[2]) ? $tmppart[2] : '')+(! empty($tmppart[3]) ? $tmppart[3] : ''); +if ($tmpval <= 360) $colortextbackhmenu='FFFFFF'; +else $colortextbackhmenu='000000'; + +$tmppart=explode(',',$colorbackvmenu1); +$tmpval=(! empty($tmppart[1]) ? $tmppart[1] : '')+(! empty($tmppart[2]) ? $tmppart[2] : '')+(! empty($tmppart[3]) ? $tmppart[3] : ''); +if ($tmpval <= 360) { $colortextbackvmenu='FFFFFF'; } +else { $colortextbackvmenu='000000'; } + +$tmppart=explode(',',$colorbacktitle1); +if ($colortexttitle == '') +{ + $tmpval=(! empty($tmppart[1]) ? $tmppart[1] : '')+(! empty($tmppart[2]) ? $tmppart[2] : '')+(! empty($tmppart[3]) ? $tmppart[3] : ''); + if ($tmpval <= 360) { $colortexttitle='FFFFFF'; $colorshadowtitle='888888'; } + else { $colortexttitle='000000'; $colorshadowtitle='FFFFFF'; } +} + +$tmppart=explode(',',$colorbacktabcard1); +$tmpval=(! empty($tmppart[1]) ? $tmppart[1] : '')+(! empty($tmppart[2]) ? $tmppart[2] : '')+(! empty($tmppart[3]) ? $tmppart[3] : ''); +if ($tmpval <= 340) { $colortextbacktab='FFFFFF'; } +else { $colortextbacktab='111111'; } + + // Format color value to match expected format (may be 'FFFFFF' or '255,255,255') $colorbackhmenu1=join(',',colorStringToArray($colorbackhmenu1)); $colorbackvmenu1=join(',',colorStringToArray($colorbackvmenu1)); @@ -158,26 +189,9 @@ $colorbacklinepair2=join(',',colorStringToArray($colorbacklinepair2)); if ($colorbacklinepairhover != '') $colorbacklinepairhover=join(',',colorStringToArray($colorbacklinepairhover)); $colorbackbody=join(',',colorStringToArray($colorbackbody)); +$colortexttitle=join(',',colorStringToArray($colortexttitle)); $colortext=join(',',colorStringToArray($colortext)); -// Set text color to black or white -$tmppart=explode(',',$colorbackhmenu1); -$tmpval=(! empty($tmppart[1]) ? $tmppart[1] : '')+(! empty($tmppart[2]) ? $tmppart[2] : '')+(! empty($tmppart[3]) ? $tmppart[3] : ''); -if ($tmpval <= 360) $colortextbackhmenu='FFF'; -else $colortextbackhmenu='222'; -$tmppart=explode(',',$colorbackvmenu1); -$tmpval=(! empty($tmppart[1]) ? $tmppart[1] : '')+(! empty($tmppart[2]) ? $tmppart[2] : '')+(! empty($tmppart[3]) ? $tmppart[3] : ''); -if ($tmpval <= 360) { $colortextbackvmenu='FFF'; } -else { $colortextbackvmenu='222'; } -$tmppart=explode(',',$colorbacktitle1); -$tmpval=(! empty($tmppart[1]) ? $tmppart[1] : '')+(! empty($tmppart[2]) ? $tmppart[2] : '')+(! empty($tmppart[3]) ? $tmppart[3] : ''); -if ($tmpval <= 360) { $colortexttitle='FFF'; $colorshadowtitle='888'; } -else { $colortexttitle='222'; $colorshadowtitle='FFF'; } -$tmppart=explode(',',$colorbacktabcard1); -$tmpval=(! empty($tmppart[1]) ? $tmppart[1] : '')+(! empty($tmppart[2]) ? $tmppart[2] : '')+(! empty($tmppart[3]) ? $tmppart[3] : ''); -if ($tmpval <= 340) { $colortextbacktab='FFF'; } -else { $colortextbacktab='111'; } - print '/*'."\n"; print 'colorbackbody='.$colorbackbody."\n"; print 'colorbackvmenu1='.$colorbackvmenu1."\n"; @@ -188,6 +202,8 @@ print 'colorbacklinepair1='.$colorbacklinepair1."\n"; print 'colorbacklinepair2='.$colorbacklinepair2."\n"; print 'colorbacklinepairhover='.$colorbacklinepairhover."\n"; +print '$colortexttitle='.$colortexttitle."\n"; +print '$colortext='.$colortext."\n"; print 'dol_hide_topmenu='.$dol_hide_topmenu."\n"; print 'dol_hide_leftmenu='.$dol_hide_leftmenu."\n"; print 'dol_optimize_smallscreen='.$dol_optimize_smallscreen."\n"; @@ -2359,7 +2375,7 @@ font-weight: ; - color: #; + color: rgb(); font-family: ; border-bottom: 1px solid #FDFFFF; text-align: ; @@ -2379,7 +2395,7 @@ } .liste_titre td a { text-shadow: none !important; - color: #; + color: rgb(); } tr.liste_titre_sel th, th.liste_titre_sel, tr.liste_titre_sel td, td.liste_titre_sel, form.liste_titre_sel div { @@ -2485,7 +2501,7 @@ background-image: linear-gradient(bottom, rgba(0,0,0,0.1) 0%, rgba(250,250,250,0.3) 100%); - color: #; + color: rgb(); font-family: , sans-serif; font-weight: ; border-bottom: 1px solid #FDFFFF; @@ -2647,9 +2663,9 @@ div.titre { font-family: ; font-weight: bold; - color: rgb(); + color: rgb(); text-decoration: none; - text-shadow: 1px 1px 2px #FFFFFF; + /* text-shadow: 1px 1px 2px #FFFFFF; */ } #dolpaymenttable { width: 600px; font-size: 13px; } @@ -3675,7 +3691,7 @@ color: rgb(); } .liste_titre .ui-link { - color: # !important; + color: rgb() !important; } a.ui-link { @@ -3739,10 +3755,10 @@ background-image: linear-gradient(bottom, rgba(0,0,0,0.3) 0%, rgba(250,250,250,0.3) 100%); font-weight: bold; - color: # !important; + color: rgb() !important; } .alilevel0 { - color: # !important; + color: rgb() !important; text-shadow: 1px 0px 1px #; } .ui-btn-icon-right { @@ -3780,7 +3796,7 @@ border-top-right-radius: 6px; }*/ .alilevel1 { - color: # !important; + color: rgb() !important; text-shadow: 1px 0px 1px #; } .lilevel1 { diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 1fdcda4874224..a34397c8bfe0c 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -91,7 +91,10 @@ $colorbacklinepair2='248,248,248'; // line pair $colorbacklinepairhover='238,246,252'; // line pair $colorbackbody='255,255,255'; -$colortext='50,50,130'; +//$colortexttitlenotab='40,0,70'; +$colortexttitlenotab='80,80,0'; +$colortexttitle=''; +$colortext=''; $fontsize='13'; $fontsizesmaller='11'; $usegradient=1; @@ -118,8 +121,9 @@ $conf->global->THEME_ELDY_LINEPAIRHOVER='238,246,252'; $conf->global->THEME_ELDY_USE_HOVER=='238,246,252'; $conf->global->THEME_ELDY_BACKBODY='255,255,255'; - + //$conf->global->THEME_ELDY_TEXTTITLE='0,0,0'; $conf->global->THEME_ELDY_TEXT='50,50,130'; + $conf->global->THEME_ELDY_FONT_SIZE1='13'; $conf->global->THEME_ELDY_FONT_SIZE2='11'; } @@ -138,6 +142,7 @@ $colorbacklinepair2 =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_LINEPAIR2) ?$colorbacklinepair2:$conf->global->THEME_ELDY_LINEPAIR2) :(empty($user->conf->THEME_ELDY_LINEPAIR2)?$colorbacklinepair2:$user->conf->THEME_ELDY_LINEPAIR2); $colorbacklinepairhover =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_LINEPAIRHOVER) ?$colorbacklinepairhover:$conf->global->THEME_ELDY_LINEPAIRHOVER) :(empty($user->conf->THEME_ELDY_LINEPAIRHOVER)?$colorbacklinepairhover:$user->conf->THEME_ELDY_LINEPAIRHOVER); $colorbackbody =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_BACKBODY) ?$colorbackbody:$conf->global->THEME_ELDY_BACKBODY) :(empty($user->conf->THEME_ELDY_BACKBODY)?$colorbackbody:$user->conf->THEME_ELDY_BACKBODY); +$colortexttitle =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_TEXTTITLE) ?$colortext:$conf->global->THEME_ELDY_TEXTTITLE) :(empty($user->conf->THEME_ELDY_TEXTTITLE)?$colortexttitle:$user->conf->THEME_ELDY_TEXTTITLE); $colortext =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_TEXT) ?$colortext:$conf->global->THEME_ELDY_TEXT) :(empty($user->conf->THEME_ELDY_TEXT)?$colortext:$user->conf->THEME_ELDY_TEXT); $fontsize =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_FONT_SIZE1) ?$fontsize:$conf->global->THEME_ELDY_FONT_SIZE1) :(empty($user->conf->THEME_ELDY_FONT_SIZE1)?$fontsize:$user->conf->THEME_ELDY_FONT_SIZE1); $fontsizesmaller =empty($user->conf->THEME_ELDY_ENABLE_PERSONALIZED)?(empty($conf->global->THEME_ELDY_FONT_SIZE2) ?$fontsize:$conf->global->THEME_ELDY_FONT_SIZE2) :(empty($user->conf->THEME_ELDY_FONT_SIZE2)?$fontsize:$user->conf->THEME_ELDY_FONT_SIZE2); @@ -149,6 +154,24 @@ $colorbacklinepairhover=((! isset($user->conf->THEME_ELDY_USE_HOVER) || $user->conf->THEME_ELDY_USE_HOVER === '0')?'':($user->conf->THEME_ELDY_USE_HOVER === '1'?'edf4fb':$user->conf->THEME_ELDY_USE_HOVER)); } +// Set text color to black or white +$tmppart=explode(',',$colorbackhmenu1); +$tmpval=(! empty($tmppart[1]) ? $tmppart[1] : '')+(! empty($tmppart[2]) ? $tmppart[2] : '')+(! empty($tmppart[3]) ? $tmppart[3] : ''); +if ($tmpval <= 360) $colortextbackhmenu='FFFFFF'; +else $colortextbackhmenu='111111'; +$tmppart=explode(',',$colorbackvmenu1); +$tmpval=(! empty($tmppart[1]) ? $tmppart[1] : '')+(! empty($tmppart[2]) ? $tmppart[2] : '')+(! empty($tmppart[3]) ? $tmppart[3] : ''); +if ($tmpval <= 360) { $colortextbackvmenu='FFFFFF'; } +else { $colortextbackvmenu='111111'; } +$tmppart=explode(',',$colorbacktitle1); +$tmpval=(! empty($tmppart[1]) ? $tmppart[1] : '')+(! empty($tmppart[2]) ? $tmppart[2] : '')+(! empty($tmppart[3]) ? $tmppart[3] : ''); +if ($tmpval <= 360) { $colortexttitle='FFFFFF'; $colorshadowtitle='888888'; } +else { $colortexttitle='111111'; $colorshadowtitle='FFFFFF'; } +$tmppart=explode(',',$colorbacktabcard1); +$tmpval=(! empty($tmppart[1]) ? $tmppart[1] : '')+(! empty($tmppart[2]) ? $tmppart[2] : '')+(! empty($tmppart[3]) ? $tmppart[3] : ''); +if ($tmpval <= 340) { $colortextbacktab='FFFFFF'; } +else { $colortextbacktab='111111'; } + // Format color value to match expected format (may be 'FFFFFF' or '255,255,255') $colorbackhmenu1=join(',',colorStringToArray($colorbackhmenu1)); $colorbackvmenu1=join(',',colorStringToArray($colorbackvmenu1)); @@ -161,27 +184,9 @@ $colorbacklinepair2=join(',',colorStringToArray($colorbacklinepair2)); if ($colorbacklinepairhover != '') $colorbacklinepairhover=join(',',colorStringToArray($colorbacklinepairhover)); $colorbackbody=join(',',colorStringToArray($colorbackbody)); +$colortexttitle=join(',',colorStringToArray($colortexttitle)); $colortext=join(',',colorStringToArray($colorbackvmenu1)); -// Set text color to black or white -$tmppart=explode(',',$colorbackhmenu1); -$tmpval=(! empty($tmppart[1]) ? $tmppart[1] : '')+(! empty($tmppart[2]) ? $tmppart[2] : '')+(! empty($tmppart[3]) ? $tmppart[3] : ''); -if ($tmpval <= 360) $colortextbackhmenu='FFF'; -else $colortextbackhmenu='111'; -$tmppart=explode(',',$colorbackvmenu1); -$tmpval=(! empty($tmppart[1]) ? $tmppart[1] : '')+(! empty($tmppart[2]) ? $tmppart[2] : '')+(! empty($tmppart[3]) ? $tmppart[3] : ''); -if ($tmpval <= 360) { $colortextbackvmenu='FFF'; } -else { $colortextbackvmenu='111'; } -$tmppart=explode(',',$colorbacktitle1); -$tmpval=(! empty($tmppart[1]) ? $tmppart[1] : '')+(! empty($tmppart[2]) ? $tmppart[2] : '')+(! empty($tmppart[3]) ? $tmppart[3] : ''); -if ($tmpval <= 360) { $colortexttitle='FFF'; $colorshadowtitle='888'; } -else { $colortexttitle='111'; $colorshadowtitle='FFF'; } -$tmppart=explode(',',$colorbacktabcard1); -$tmpval=(! empty($tmppart[1]) ? $tmppart[1] : '')+(! empty($tmppart[2]) ? $tmppart[2] : '')+(! empty($tmppart[3]) ? $tmppart[3] : ''); -if ($tmpval <= 340) { $colortextbacktab='FFF'; } -else { $colortextbacktab='111'; } - - print '/*'."\n"; print 'colorbackbody='.$colorbackbody."\n"; print 'colorbackvmenu1='.$colorbackvmenu1."\n"; @@ -2211,7 +2216,7 @@ font-weight: ; */ - color: #; + color: rgb(); font-family: ; border-bottom: 1px solid #FDFFFF; text-align: ; @@ -2231,7 +2236,7 @@ } .liste_titre td a { text-shadow: none !important; - color: #; + color: rgb(); } div.liste_titre { padding-left: 3px; @@ -2343,7 +2348,7 @@ */ background-repeat: repeat-x; - color: #; + color: rgb(); font-family: , sans-serif; font-weight: ; border-bottom: 1px solid #FDFFFF; @@ -2504,9 +2509,9 @@ div.titre { font-family: ; font-weight: bold; - color: rgb(); + color: rgb(); text-decoration: none; - text-shadow: 1px 1px 2px #FFFFFF; + /* text-shadow: 1px 1px 2px #FFFFFF; */ dol_optimize_smallscreen)?'':'margin-top: 4px;'); ?> } @@ -3534,7 +3539,7 @@ color: rgb(); } .liste_titre .ui-link { - color: # !important; + color: rgb() !important; } a.ui-link { @@ -3598,10 +3603,10 @@ background-image: linear-gradient(bottom, rgba(0,0,0,0.3) 0%, rgba(250,250,250,0.3) 100%); font-weight: bold; - color: # !important; + color: rgb() !important; } .alilevel0 { - color: # !important; + color: rgb() !important; text-shadow: 1px 0px 1px #; } .ui-btn-icon-right { @@ -3631,7 +3636,7 @@ border-top-right-radius: 6px; } .alilevel1 { - color: # !important; + color: rgb() !important; text-shadow: 1px 0px 1px #; } .lilevel1 { diff --git a/test/phpunit/AllTests.php b/test/phpunit/AllTests.php index 94e8ba1478efb..d7bd828527f8f 100644 --- a/test/phpunit/AllTests.php +++ b/test/phpunit/AllTests.php @@ -38,11 +38,16 @@ print "Error: Default language for company to run tests must be set to en_US or auto. Current is ".$langs->defaultlang."\n"; exit; } -if (! empty($conf->adherents->enabled)) +if (empty($conf->adherent->enabled)) { print "Error: Module member must be enabled to have significatn results.\n"; exit; } +if (! empty($conf->ldap->enabled)) +{ + print "Error: LDAP module should not be enabled.\n"; + exit; +} if (! empty($conf->google->enabled)) { print "Warning: Google module should not be enabled.\n"; diff --git a/test/phpunit/CMailFileTest.php b/test/phpunit/CMailFileTest.php index 52a65a8949ed4..092d2e1f41c8e 100755 --- a/test/phpunit/CMailFileTest.php +++ b/test/phpunit/CMailFileTest.php @@ -102,6 +102,8 @@ protected function setUp() $langs=$this->savlangs; $db=$this->savdb; + $conf->global->MAIN_DISABLE_ALL_MAILS=1; // If I comment/remove this lien, unit test still works alone but failed when ran from AllTest. Don't know why. + print __METHOD__."\n"; } /** diff --git a/test/phpunit/PricesTest.php b/test/phpunit/PricesTest.php index b8a942d5899fd..bb8c90d5f1c63 100755 --- a/test/phpunit/PricesTest.php +++ b/test/phpunit/PricesTest.php @@ -39,6 +39,11 @@ } $conf->global->MAIN_DISABLE_ALL_MAILS=1; +if (! empty($conf->global->MAIN_ROUNDING_RULE_TOT)) +{ + print "Parameter MAIN_ROUNDING_RULE_TOT must be set to 0 or not set.\n"; + exit; +} /** * Class for PHPUnit tests @@ -279,11 +284,11 @@ public function testCalculPriceTotal() /** - * Test function addline and update_price - * - * @return boolean - * @see http://wiki.dolibarr.org/index.php/Draft:VAT_calculation_and_rounding#Standard_usage - */ + * Test function addline and update_price + * + * @return boolean + * @see http://wiki.dolibarr.org/index.php/Draft:VAT_calculation_and_rounding#Standard_usage + */ public function testUpdatePrice() { //$this->sharedFixture diff --git a/test/phpunit/WebservicesProductsTest.php b/test/phpunit/WebservicesProductsTest.php index 77fd81c78f640..a751faddb4bf3 100755 --- a/test/phpunit/WebservicesProductsTest.php +++ b/test/phpunit/WebservicesProductsTest.php @@ -40,6 +40,11 @@ } $conf->global->MAIN_DISABLE_ALL_MAILS=1; +if (empty($conf->service->enabled)) +{ + print "Error: Module service must be enabled.\n"; + exit; +} /** * Class for PHPUnit tests From d27330e0125008fa863afc0f3b9169a4ab4f77a5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 15 Oct 2015 03:38:21 +0200 Subject: [PATCH 122/297] Removed useless info --- htdocs/admin/notification.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/htdocs/admin/notification.php b/htdocs/admin/notification.php index fca545e83cd14..dd97e44eb96e3 100644 --- a/htdocs/admin/notification.php +++ b/htdocs/admin/notification.php @@ -1,6 +1,6 @@ - * Copyright (C) 2005-2011 Laurent Destailleur + * Copyright (C) 2005-2015 Laurent Destailleur * Copyright (C) 2013 Juanjo Menent * * This program is free software; you can redistribute it and/or modify @@ -132,10 +132,12 @@ print "\n"; $var=!$var; print ''; +print ''; +print ''; +print ''; print '
    '; - print ''; - print ''; - if (! empty($search_nom_only) && empty($search_nom)) $search_nom=$search_nom_only; - - print ''; - print ''; + if (! empty($search_nom_only) && empty($search_nom)) $search_nom=$search_nom_only; + 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 ''; - 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 ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; print ''; - print $form->selectarray('search_status', array('0'=>$langs->trans('ActivityCeased'),'1'=>$langs->trans('InActivity')),$search_status); - print ''; + print $form->selectarray('search_status', array('0'=>$langs->trans('ActivityCeased'),'1'=>$langs->trans('InActivity')),$search_status); + print ''; + print ''; + print ''; print ''; print ''; @@ -470,38 +556,68 @@ $obj = $db->fetch_object($resql); $var=!$var; print "
    "; - $companystatic->id=$obj->rowid; - $companystatic->name=$obj->name; - $companystatic->canvas=$obj->canvas; - $companystatic->client=$obj->client; - $companystatic->status=$obj->status; - $companystatic->fournisseur=$obj->fournisseur; - $companystatic->code_client=$obj->code_client; - $companystatic->code_fournisseur=$obj->code_fournisseur; - print $companystatic->getNomUrl(1,'',100); - print ""; + $companystatic->id=$obj->rowid; + $companystatic->name=$obj->name; + $companystatic->canvas=$obj->canvas; + $companystatic->client=$obj->client; + $companystatic->status=$obj->status; + $companystatic->fournisseur=$obj->fournisseur; + $companystatic->code_client=$obj->code_client; + $companystatic->code_fournisseur=$obj->code_fournisseur; + print $companystatic->getNomUrl(1,'',100); + print "'.$objp->barcode.'".$obj->town."'; - $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 '".$obj->idprof1."".$obj->idprof2."".$obj->idprof3."".$obj->idprof4."'; + // Town + if (! empty($arrayfields['s.town']['checked'])) + { + print "".$obj->town."".$obj->zip."'; + $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 '".$obj->idprof1."".$obj->idprof2."".$obj->idprof3."".$obj->idprof4."'; $s=''; if (($obj->client==1 || $obj->client==3) && empty($conf->global->SOCIETE_DISABLE_CUSTOMERS)) { @@ -522,14 +638,30 @@ } print $s; print ''.$companystatic->getLibStatut(5).''.$companystatic->getLibStatut(5).''; + print dol_print_date($obj->date_creation, 'dayhour'); + print ''; + print dol_print_date($obj->date_update, 'dayhour'); + print '
    '; -print $langs->trans("NotificationEMailFrom").''; +print $langs->trans("NotificationEMailFrom").''; print ''; if (! empty($conf->global->NOTIFICATION_EMAIL_FROM) && ! isValidEmail($conf->global->NOTIFICATION_EMAIL_FROM)) print ' '.img_warning($langs->trans("ErrorBadEMail")); -print '
    '; print '
    '; @@ -150,8 +152,7 @@ print ''.$langs->trans("Module").''; print ''.$langs->trans("Code").''; print ''.$langs->trans("Label").''; - print ''.$langs->trans("NbOfTargetedContacts").''; - print ''.''; + //print ''.$langs->trans("NbOfTargetedContacts").''; print "\n"; // Load array of available notifications @@ -173,10 +174,10 @@ print ''.$elementLabel.''; print ''.$notifiedevent['code'].''; print ''.$label.''; - print ''; + /*print ''; $tmparray = $notify->getNotificationsArray($notifiedevent['code'], 0); print count($tmparray); - print ''; + print '';*/ print ''; } From 6c2b46f9398645ea290ddef63680a52dc5446bdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rapha=C3=ABl=20Doursenaud?= Date: Thu, 15 Oct 2015 10:13:52 +0200 Subject: [PATCH 123/297] Fix #3728 Properly remove last category --- htdocs/adherents/class/adherent.class.php | 10 ++++++---- htdocs/contact/class/contact.class.php | 10 ++++++---- htdocs/product/class/product.class.php | 10 ++++++---- htdocs/societe/class/societe.class.php | 10 ++++++---- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/htdocs/adherents/class/adherent.class.php b/htdocs/adherents/class/adherent.class.php index 29cc0aac2493a..de3b937094a4e 100644 --- a/htdocs/adherents/class/adherent.class.php +++ b/htdocs/adherents/class/adherent.class.php @@ -1991,12 +1991,14 @@ public function setCategories($categories) // Process foreach ($to_del as $del) { - $c->fetch($del); - $c->del_type($this, 'member'); + if ($c->fetch($del) > 0) { + $c->del_type($this, 'member'); + } } foreach ($to_add as $add) { - $c->fetch($add); - $c->add_type($this, 'member'); + if ($c->fetch($add) > 0) { + $c->add_type($this, 'member'); + } } return; diff --git a/htdocs/contact/class/contact.class.php b/htdocs/contact/class/contact.class.php index c48408ab28159..7af2a763ad1e1 100644 --- a/htdocs/contact/class/contact.class.php +++ b/htdocs/contact/class/contact.class.php @@ -1155,12 +1155,14 @@ public function setCategories($categories) // Process foreach ($to_del as $del) { - $c->fetch($del); - $c->del_type($this, 'contact'); + if ($c->fetch($del) > 0) { + $c->del_type($this, 'contact'); + } } foreach ($to_add as $add) { - $c->fetch($add); - $c->add_type($this, 'contact'); + if ($c->fetch($add) > 0) { + $c->add_type($this, 'contact'); + } } return; diff --git a/htdocs/product/class/product.class.php b/htdocs/product/class/product.class.php index a51a1a77c7b91..6f4e37c8ab2f8 100644 --- a/htdocs/product/class/product.class.php +++ b/htdocs/product/class/product.class.php @@ -3976,12 +3976,14 @@ public function setCategories($categories) { // Process foreach($to_del as $del) { - $c->fetch($del); - $c->del_type($this, 'product'); + if ($c->fetch($del) > 0) { + $c->del_type($this, 'product'); + } } foreach ($to_add as $add) { - $c->fetch($add); - $c->add_type($this, 'product'); + if ($c->fetch($add) > 0) { + $c->add_type($this, 'product'); + } } return; diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index af54c7b874245..7bf8d6c45cf3a 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -3395,12 +3395,14 @@ public function setCategories($categories, $type) // Process foreach ($to_del as $del) { - $c->fetch($del); - $c->del_type($this, $type_text); + if ($c->fetch($del) > 0) { + $c->del_type($this, $type_text); + } } foreach ($to_add as $add) { - $c->fetch($add); - $c->add_type($this, $type_text); + if ($c->fetch($add) > 0) { + $c->add_type($this, $type_text); + } } return; From 4cdf17d8b5f405d6329a3bfda40139dbddd4d358 Mon Sep 17 00:00:00 2001 From: fmarcet Date: Thu, 15 Oct 2015 12:17:57 +0200 Subject: [PATCH 124/297] FIX #3689 Bug on workflow module --- htdocs/commande/class/commande.class.php | 188 +++++++++++------------ 1 file changed, 92 insertions(+), 96 deletions(-) diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index e681bfc77264c..16c889c6e616c 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -1045,116 +1045,112 @@ function createFromProposal($object) $error=0; - // Signed proposal - if ($object->statut == 2) - { - $this->date_commande = dol_now(); - $this->source = 0; - - $num=count($object->lines); - for ($i = 0; $i < $num; $i++) - { - $line = new OrderLine($this->db); + + $this->date_commande = dol_now(); + $this->source = 0; - $line->libelle = $object->lines[$i]->libelle; - $line->label = $object->lines[$i]->label; - $line->desc = $object->lines[$i]->desc; - $line->price = $object->lines[$i]->price; - $line->subprice = $object->lines[$i]->subprice; - $line->tva_tx = $object->lines[$i]->tva_tx; - $line->localtax1_tx = $object->lines[$i]->localtax1_tx; - $line->localtax2_tx = $object->lines[$i]->localtax2_tx; - $line->qty = $object->lines[$i]->qty; - $line->fk_remise_except = $object->lines[$i]->fk_remise_except; - $line->remise_percent = $object->lines[$i]->remise_percent; - $line->fk_product = $object->lines[$i]->fk_product; - $line->info_bits = $object->lines[$i]->info_bits; - $line->product_type = $object->lines[$i]->product_type; - $line->rang = $object->lines[$i]->rang; - $line->special_code = $object->lines[$i]->special_code; - $line->fk_parent_line = $object->lines[$i]->fk_parent_line; - $line->fk_unit = $object->lines[$i]->fk_unit; - - $line->date_start = $object->lines[$i]->date_start; - $line->date_end = $object->lines[$i]->date_end; - - $line->fk_fournprice = $object->lines[$i]->fk_fournprice; - $marginInfos = getMarginInfos($object->lines[$i]->subprice, $object->lines[$i]->remise_percent, $object->lines[$i]->tva_tx, $object->lines[$i]->localtax1_tx, $object->lines[$i]->localtax2_tx, $object->lines[$i]->fk_fournprice, $object->lines[$i]->pa_ht); - $line->pa_ht = $marginInfos[0]; - $line->marge_tx = $marginInfos[1]; - $line->marque_tx = $marginInfos[2]; - - // get extrafields from original line - $object->lines[$i]->fetch_optionals($object->lines[$i]->rowid); - foreach($object->lines[$i]->array_options as $options_key => $value) - $line->array_options[$options_key] = $value; - - $this->lines[$i] = $line; - } + $num=count($object->lines); + for ($i = 0; $i < $num; $i++) + { + $line = new OrderLine($this->db); - $this->socid = $object->socid; - $this->fk_project = $object->fk_project; - $this->cond_reglement_id = $object->cond_reglement_id; - $this->mode_reglement_id = $object->mode_reglement_id; - $this->fk_account = $object->fk_account; - $this->availability_id = $object->availability_id; - $this->demand_reason_id = $object->demand_reason_id; - $this->date_livraison = $object->date_livraison; - $this->shipping_method_id = $object->shipping_method_id; - $this->fk_delivery_address = $object->fk_delivery_address; - $this->contact_id = $object->contactid; - $this->ref_client = $object->ref_client; - $this->note_private = $object->note_private; - $this->note_public = $object->note_public; - - $this->origin = $object->element; - $this->origin_id = $object->id; + $line->libelle = $object->lines[$i]->libelle; + $line->label = $object->lines[$i]->label; + $line->desc = $object->lines[$i]->desc; + $line->price = $object->lines[$i]->price; + $line->subprice = $object->lines[$i]->subprice; + $line->tva_tx = $object->lines[$i]->tva_tx; + $line->localtax1_tx = $object->lines[$i]->localtax1_tx; + $line->localtax2_tx = $object->lines[$i]->localtax2_tx; + $line->qty = $object->lines[$i]->qty; + $line->fk_remise_except = $object->lines[$i]->fk_remise_except; + $line->remise_percent = $object->lines[$i]->remise_percent; + $line->fk_product = $object->lines[$i]->fk_product; + $line->info_bits = $object->lines[$i]->info_bits; + $line->product_type = $object->lines[$i]->product_type; + $line->rang = $object->lines[$i]->rang; + $line->special_code = $object->lines[$i]->special_code; + $line->fk_parent_line = $object->lines[$i]->fk_parent_line; + $line->fk_unit = $object->lines[$i]->fk_unit; + + $line->date_start = $object->lines[$i]->date_start; + $line->date_end = $object->lines[$i]->date_end; + + $line->fk_fournprice = $object->lines[$i]->fk_fournprice; + $marginInfos = getMarginInfos($object->lines[$i]->subprice, $object->lines[$i]->remise_percent, $object->lines[$i]->tva_tx, $object->lines[$i]->localtax1_tx, $object->lines[$i]->localtax2_tx, $object->lines[$i]->fk_fournprice, $object->lines[$i]->pa_ht); + $line->pa_ht = $marginInfos[0]; + $line->marge_tx = $marginInfos[1]; + $line->marque_tx = $marginInfos[2]; // get extrafields from original line - $object->fetch_optionals($object->id); - - $e = new ExtraFields($db); - $element_extrafields = $e->fetch_name_optionals_label($this->element); - - foreach($object->array_options as $options_key => $value) { - if(array_key_exists(str_replace('options_', '', $options_key), $element_extrafields)){ - $this->array_options[$options_key] = $value; - } + $object->lines[$i]->fetch_optionals($object->lines[$i]->rowid); + foreach($object->lines[$i]->array_options as $options_key => $value) + $line->array_options[$options_key] = $value; + + $this->lines[$i] = $line; + } + + $this->socid = $object->socid; + $this->fk_project = $object->fk_project; + $this->cond_reglement_id = $object->cond_reglement_id; + $this->mode_reglement_id = $object->mode_reglement_id; + $this->fk_account = $object->fk_account; + $this->availability_id = $object->availability_id; + $this->demand_reason_id = $object->demand_reason_id; + $this->date_livraison = $object->date_livraison; + $this->shipping_method_id = $object->shipping_method_id; + $this->fk_delivery_address = $object->fk_delivery_address; + $this->contact_id = $object->contactid; + $this->ref_client = $object->ref_client; + $this->note_private = $object->note_private; + $this->note_public = $object->note_public; + + $this->origin = $object->element; + $this->origin_id = $object->id; + + // get extrafields from original line + $object->fetch_optionals($object->id); + + $e = new ExtraFields($db); + $element_extrafields = $e->fetch_name_optionals_label($this->element); + + foreach($object->array_options as $options_key => $value) { + if(array_key_exists(str_replace('options_', '', $options_key), $element_extrafields)){ + $this->array_options[$options_key] = $value; } - // Possibility to add external linked objects with hooks - $this->linked_objects[$this->origin] = $this->origin_id; - if (is_array($object->other_linked_objects) && ! empty($object->other_linked_objects)) - { - $this->linked_objects = array_merge($this->linked_objects, $object->other_linked_objects); - } + } + // Possibility to add external linked objects with hooks + $this->linked_objects[$this->origin] = $this->origin_id; + if (is_array($object->other_linked_objects) && ! empty($object->other_linked_objects)) + { + $this->linked_objects = array_merge($this->linked_objects, $object->other_linked_objects); + } - $ret = $this->create($user); + $ret = $this->create($user); - if ($ret > 0) - { - // Actions hooked (by external module) - $hookmanager->initHooks(array('orderdao')); + if ($ret > 0) + { + // Actions hooked (by external module) + $hookmanager->initHooks(array('orderdao')); - $parameters=array('objFrom'=>$object); - $action=''; - $reshook=$hookmanager->executeHooks('createFrom',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks - if ($reshook < 0) $error++; + $parameters=array('objFrom'=>$object); + $action=''; + $reshook=$hookmanager->executeHooks('createFrom',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks + if ($reshook < 0) $error++; - if (! $error) + if (! $error) + { + // Ne pas passer par la commande provisoire + if ($conf->global->COMMANDE_VALID_AFTER_CLOSE_PROPAL == 1) { - // Ne pas passer par la commande provisoire - if ($conf->global->COMMANDE_VALID_AFTER_CLOSE_PROPAL == 1) - { - $this->fetch($ret); - $this->valid($user); - } - return $ret; + $this->fetch($ret); + $this->valid($user); } - else return -1; + return $ret; } else return -1; } - else return 0; + else return -1; } From e2478eea07c701b3071dfd586a007e77d64873f0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 15 Oct 2015 12:18:17 +0200 Subject: [PATCH 125/297] NEW Increase length of bank code to 128 char #3704 --- htdocs/install/mysql/migration/3.8.0-3.9.0.sql | 6 ++++++ htdocs/install/mysql/tables/llx_bank_account.sql | 2 +- .../mysql/tables/llx_prelevement_facture_demande.sql | 2 +- htdocs/install/mysql/tables/llx_prelevement_lignes.sql | 2 +- htdocs/install/mysql/tables/llx_societe_rib.sql | 2 +- 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/htdocs/install/mysql/migration/3.8.0-3.9.0.sql b/htdocs/install/mysql/migration/3.8.0-3.9.0.sql index 5442c1c1862d2..d54cd22849a8d 100755 --- a/htdocs/install/mysql/migration/3.8.0-3.9.0.sql +++ b/htdocs/install/mysql/migration/3.8.0-3.9.0.sql @@ -61,3 +61,9 @@ ALTER TABLE llx_user_param MODIFY COLUMN value text NOT NULL; ALTER TABLE llx_expedition ADD COLUMN import_key varchar(14); ALTER TABLE llx_expedition ADD COLUMN extraparams varchar(255); +ALTER TABLE llx_bank_account MODIFY COLUMN code_banque varchar(128); +ALTER TABLE llx_prelevement_facture_demande MODIFY COLUMN code_banque varchar(128); +ALTER TABLE llx_prelevement_lignes MODIFY COLUMN code_banque varchar(128); +ALTER TABLE llx_societe_rib MODIFY COLUMN code_banque varchar(128); + + diff --git a/htdocs/install/mysql/tables/llx_bank_account.sql b/htdocs/install/mysql/tables/llx_bank_account.sql index 934949e7a667d..6bbae80a784a9 100644 --- a/htdocs/install/mysql/tables/llx_bank_account.sql +++ b/htdocs/install/mysql/tables/llx_bank_account.sql @@ -33,7 +33,7 @@ create table llx_bank_account fk_user_author integer, fk_user_modif integer, bank varchar(60), - code_banque varchar(8), + code_banque varchar(128), code_guichet varchar(6), number varchar(255), cle_rib varchar(5), diff --git a/htdocs/install/mysql/tables/llx_prelevement_facture_demande.sql b/htdocs/install/mysql/tables/llx_prelevement_facture_demande.sql index 2a0c9b84ea594..3bdc0e2ed81e5 100644 --- a/htdocs/install/mysql/tables/llx_prelevement_facture_demande.sql +++ b/htdocs/install/mysql/tables/llx_prelevement_facture_demande.sql @@ -28,7 +28,7 @@ create table llx_prelevement_facture_demande fk_prelevement_bons integer, fk_user_demande integer NOT NULL, - code_banque varchar(7), + code_banque varchar(128), code_guichet varchar(6), number varchar(255), cle_rib varchar(5) diff --git a/htdocs/install/mysql/tables/llx_prelevement_lignes.sql b/htdocs/install/mysql/tables/llx_prelevement_lignes.sql index a95499a321f33..04b6e1ebf5eb1 100644 --- a/htdocs/install/mysql/tables/llx_prelevement_lignes.sql +++ b/htdocs/install/mysql/tables/llx_prelevement_lignes.sql @@ -25,7 +25,7 @@ create table llx_prelevement_lignes client_nom varchar(255), amount real DEFAULT 0, - code_banque varchar(7), + code_banque varchar(128), code_guichet varchar(6), number varchar(255), cle_rib varchar(5), diff --git a/htdocs/install/mysql/tables/llx_societe_rib.sql b/htdocs/install/mysql/tables/llx_societe_rib.sql index 3331da246967a..e8f995130d4cb 100644 --- a/htdocs/install/mysql/tables/llx_societe_rib.sql +++ b/htdocs/install/mysql/tables/llx_societe_rib.sql @@ -27,7 +27,7 @@ create table llx_societe_rib tms timestamp, label varchar(30), bank varchar(255), -- bank name - code_banque varchar(7), -- bank code + code_banque varchar(128), -- bank code code_guichet varchar(6), -- desk code number varchar(255), -- account number cle_rib varchar(5), -- key of bank account From 8a32041f168068a914db998d5733c13ee15b01d7 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 15 Oct 2015 13:31:44 +0200 Subject: [PATCH 126/297] Clean CSS when option MAIN_MAXTABS_IN_CARD is set --- htdocs/core/lib/functions.lib.php | 16 ++++++++++++---- htdocs/theme/eldy/style.css.php | 11 ++++++++++- htdocs/theme/md/style.css.php | 11 ++++++++++- 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 4a39269c23e79..9b8b6fcbcc379 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -745,7 +745,7 @@ function dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $pi else $isactive=false; - if ($i <= $limittoshow || $isactive ) + if ($i <= $limittoshow || $isactive) { $out.='
    '; if (isset($links[$i][2]) && $links[$i][2] == 'image') @@ -775,7 +775,13 @@ function dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $pi } else { - $outmore.='
    '; + // The popup with the other tabs + if (! $popuptab) + { + $popuptab=1; + $outmore.='
    '; + } + $outmore.='
    '; if (isset($links[$i][2]) && $links[$i][2] == 'image') { if (!empty($links[$i][0])) @@ -788,16 +794,18 @@ function dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $pi $outmore.=''.$links[$i][1].''."\n"; $outmore.='
    '; + $nbintab++; } $displaytab=$i; } - + if ($popuptab) $outmore.='
    '; + if ($displaytab > $limittoshow) { $tabsname=str_replace("@", "", $picto); $out.='
    '; - $out.=''.$langs->trans("More").' '.$nbintab.''; + $out.=''.$langs->trans("More").'... ('.$nbintab.')'; $out.='
    '.$outmore.'
    '; $out.="
    \n"; diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 6067b9b4aa883..6b3f5c662a377 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -1571,7 +1571,16 @@ box-shadow: 3px 3px 4px #DDD; } - +div.popuptabset { + padding: 6px; + border: 1px solid #888; +} +div.popuptab { + padding-top: 3px; + padding-bottom: 3px; + padding-left: 5px; + padding-right: 5px; +} div.tabsAction { margin: 20px 0em 10px 0em; padding: 0em 0em; diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index a34397c8bfe0c..c01d0198e0bb4 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -1549,7 +1549,16 @@ padding: 0em 0em; text-align: right; } - +div.popuptabset { + padding: 6px; + border: 1px solid #888; +} +div.popuptab { + padding-top: 3px; + padding-bottom: 3px; + padding-left: 5px; + padding-right: 5px; +} a.tabTitle { /* background: #657090; From b43047bc2ffc6d92633d46a1c3b3a2faa056bb91 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 15 Oct 2015 14:13:31 +0200 Subject: [PATCH 127/297] Use the new banner on all tabs of contacts --- htdocs/contact/card.php | 4 ++- htdocs/contact/document.php | 27 ++++++++++-------- htdocs/contact/ldap.php | 49 ++++++++++++++++----------------- htdocs/contact/note.php | 30 ++++++++++---------- htdocs/contact/perso.php | 32 ++++++++++----------- htdocs/core/tpl/notes.tpl.php | 2 +- htdocs/theme/eldy/style.css.php | 2 +- 7 files changed, 75 insertions(+), 71 deletions(-) diff --git a/htdocs/contact/card.php b/htdocs/contact/card.php index 63bc0f2b04d9a..22220db68329d 100644 --- a/htdocs/contact/card.php +++ b/htdocs/contact/card.php @@ -411,8 +411,10 @@ */ +$title = (! empty($conf->global->SOCIETE_ADDRESSES_MANAGEMENT) ? $langs->trans("Contacts") : $langs->trans("ContactsAddresses")); +if (! empty($conf->global->MAIN_HTML_TITLE) && preg_match('/contactnameonly/',$conf->global->MAIN_HTML_TITLE) && $object->lastname) $title=$object->lastname; $help_url='EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas'; -llxHeader('',$langs->trans("ContactsAddresses"),$help_url); +llxHeader('', $title, $help_url); $form = new Form($db); $formcompany = new FormCompany($db); diff --git a/htdocs/contact/document.php b/htdocs/contact/document.php index 81f9b2a29be48..62822a976904f 100644 --- a/htdocs/contact/document.php +++ b/htdocs/contact/document.php @@ -74,8 +74,10 @@ $form = new Form($db); +$title = (! empty($conf->global->SOCIETE_ADDRESSES_MANAGEMENT) ? $langs->trans("Contacts") : $langs->trans("ContactsAddresses")); +if (! empty($conf->global->MAIN_HTML_TITLE) && preg_match('/contactnameonly/',$conf->global->MAIN_HTML_TITLE) && $object->lastname) $title=$object->lastname; $help_url='EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas'; -llxHeader("",$langs->trans("Contact"), $helpurl); +llxHeader('', $title, $helpurl); if ($object->id) { @@ -93,16 +95,12 @@ $totalsize+=$file['size']; } - print ''; - - // Ref - print ''; - - // Name - print ''; - print ''; + dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', ''); + + print '
    '; + + print '
    '; + print '
    '.$langs->trans("Ref").''; - print $form->showrefnav($object, 'id', $linkback); - print '
    '.$langs->trans("Lastname").' / '.$langs->trans("Label").''.$object->lastname.''.$langs->trans("Firstname").''.$object->firstname.'
    '; // Company if (empty($conf->global->SOCIETE_DISABLE_CONTACTS)) @@ -123,12 +121,19 @@ } } + // Civility + print ''; + print ''; print ''; print '
    '.$langs->trans("UserTitle").''; + print $object->getCivilityLabel(); + print '
    '.$langs->trans("NbOfAttachedFiles").''.count($filearray).'
    '.$langs->trans("TotalSizeOfAttachedFiles").''.$totalsize.' '.$langs->trans("bytes").'
    '; print '
    '; + dol_fiche_end(); + $modulepart = 'contact'; $permission = $user->rights->societe->contact->creer; $param = '&id=' . $object->id; diff --git a/htdocs/contact/ldap.php b/htdocs/contact/ldap.php index 9a8fde8e14f21..2ec187eafc6e3 100644 --- a/htdocs/contact/ldap.php +++ b/htdocs/contact/ldap.php @@ -39,10 +39,10 @@ if ($user->societe_id) $socid=$user->societe_id; $result = restrictedArea($user, 'contact', $id, 'socpeople&societe'); -$contact = new Contact($db); +$object = new Contact($db); if ($id > 0) { - $contact->fetch($id, $user); + $object->fetch($id, $user); } @@ -57,8 +57,8 @@ $ldap=new Ldap(); $result=$ldap->connect_bind(); - $info=$contact->_load_ldap_info(); - $dn=$contact->_load_ldap_dn($info); + $info=$object->_load_ldap_info(); + $dn=$object->_load_ldap_dn($info); $olddn=$dn; // We can say that old dn = dn as we force synchro $result=$ldap->update($dn,$info,$user,$olddn); @@ -86,40 +86,35 @@ $form = new Form($db); -$head = contact_prepare_head($contact); +$head = contact_prepare_head($object); dol_fiche_head($head, 'ldap', $title, 0, 'contact'); +dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', ''); + +print '
    '; -print ''; - -// Ref -print ''; - -// Name -print ''; -print ''; +print '
    '; +print '
    '.$langs->trans("Ref").''; -print $form->showrefnav($contact,'id'); -print '
    '.$langs->trans("Lastname").' / '.$langs->trans("Label").''.$contact->lastname.''.$langs->trans("Firstname").''.$contact->firstname.'
    '; // Company -if ($contact->socid > 0) +if ($object->socid > 0) { - $objsoc = new Societe($db); - $objsoc->fetch($contact->socid); + $thirdparty = new Societe($db); + $thirdparty->fetch($object->socid); - print ''; + print ''; } else { - print ''; } // Civility -print ''; // LDAP DN @@ -135,6 +130,8 @@ print '
    '.$langs->trans("ThirdParty").''.$objsoc->getNomUrl(1).'
    '.$langs->trans("ThirdParty").''.$thirdparty->getNomUrl(1).'
    '.$langs->trans("ThirdParty").''; + print '
    '.$langs->trans("ThirdParty").''; print $langs->trans("ContactNotLinkedToCompany"); print '
    '.$langs->trans("UserTitle").''; -print $contact->getCivilityLabel(); +print '
    '.$langs->trans("UserTitle").''; +print $object->getCivilityLabel(); print '
    '; +print '
    '; + dol_fiche_end(); @@ -146,7 +143,7 @@ if (! empty($conf->global->LDAP_CONTACT_ACTIVE) && $conf->global->LDAP_CONTACT_ACTIVE != 'ldap2dolibarr') { - print ''.$langs->trans("ForceSynchronize").''; + print ''.$langs->trans("ForceSynchronize").''; } print "
    \n"; @@ -170,9 +167,9 @@ $result=$ldap->connect_bind(); if ($result > 0) { - $info=$contact->_load_ldap_info(); - $dn=$contact->_load_ldap_dn($info,1); - $search = "(".$contact->_load_ldap_dn($info,2).")"; + $info=$object->_load_ldap_info(); + $dn=$object->_load_ldap_dn($info,1); + $search = "(".$object->_load_ldap_dn($info,2).")"; $records=$ldap->getAttribute($dn,$search); //var_dump($records); diff --git a/htdocs/contact/note.php b/htdocs/contact/note.php index 457f794438ec8..761efcfa84061 100644 --- a/htdocs/contact/note.php +++ b/htdocs/contact/note.php @@ -55,12 +55,14 @@ * View */ +$now=dol_now(); + $title = (! empty($conf->global->SOCIETE_ADDRESSES_MANAGEMENT) ? $langs->trans("Contacts") : $langs->trans("ContactsAddresses")); $form = new Form($db); $help_url='EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas'; -llxHeader('',$title,$help_url); +llxHeader('', $title, $help_url); if ($id > 0) { @@ -77,18 +79,16 @@ print '
    '; print ''; - print ''; - + $linkback = ''.$langs->trans("BackToList").''; + dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', ''); + + print '
    '; + + print '
    '; + print '
    '; - // Ref - print ''; - - // Name - print ''; - print ''; + $linkback = ''.$langs->trans("BackToList").''; // Company if (empty($conf->global->SOCIETE_DISABLE_CONTACTS)) @@ -110,7 +110,7 @@ } // Civility - print ''; @@ -120,7 +120,7 @@ { include_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; - print '
    '.$langs->trans("Ref").''; - print $form->showrefnav($object, 'id', $linkback); - print '
    '.$langs->trans("Lastname").' / '.$langs->trans("Label").''.$object->lastname.''.$langs->trans("Firstname").''.$object->firstname.'
    '.$langs->trans("UserTitle").''; + print '
    '.$langs->trans("UserTitle").''; print $object->getCivilityLabel(); print '
    '.$langs->trans("DateToBirth").''.dol_print_date($object->birthday,"day"); + print ''.$langs->trans("DateToBirth").''.dol_print_date($object->birthday,"day"); print '   '; //var_dump($birthdatearray); @@ -144,9 +144,11 @@ print "
    "; + print '
    '; + print '
    '; - $colwidth='20'; + $cssclass='titlefield'; include DOL_DOCUMENT_ROOT.'/core/tpl/notes.tpl.php'; diff --git a/htdocs/contact/perso.php b/htdocs/contact/perso.php index 8f4e97e690de4..8bebb6f0cfb13 100644 --- a/htdocs/contact/perso.php +++ b/htdocs/contact/perso.php @@ -70,8 +70,9 @@ $now=dol_now(); $title = (! empty($conf->global->SOCIETE_ADDRESSES_MANAGEMENT) ? $langs->trans("Contacts") : $langs->trans("ContactsAddresses")); - -llxHeader('',$title,'EN:Module_Third_Parties|FR:Module_Tiers|ES:Módulo_Empresas'); +if (! empty($conf->global->MAIN_HTML_TITLE) && preg_match('/contactnameonly/',$conf->global->MAIN_HTML_TITLE) && $object->lastname) $title=$object->lastname; +$help_url='EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas'; +llxHeader('', $title, $helpurl); $form = new Form($db); @@ -155,21 +156,17 @@ } else { - /* - * Fiche en mode visu - */ - print ''; - + // View mode + $linkback = ''.$langs->trans("BackToList").''; - - // Ref - print ''; - - // Name - print ''; - print ''; + + dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', ''); + + + print '
    '; + + print '
    '; + print '
    '.$langs->trans("Ref").''; - print $form->showrefnav($object, 'id', $linkback); - print '
    '.$langs->trans("Lastname").' / '.$langs->trans("Label").''.$object->lastname.''.$langs->trans("Firstname").''.$object->firstname.'
    '; // Company if (empty($conf->global->SOCIETE_DISABLE_CONTACTS)) @@ -191,7 +188,7 @@ } // Civility - print ''; @@ -225,6 +222,7 @@ print "
    '.$langs->trans("UserTitle").''; + print '
    '.$langs->trans("UserTitle").''; print $object->getCivilityLabel(); print '
    "; + print '
    '; } dol_fiche_end(); diff --git a/htdocs/core/tpl/notes.tpl.php b/htdocs/core/tpl/notes.tpl.php index 8400e0210d404..46e7d154533c5 100644 --- a/htdocs/core/tpl/notes.tpl.php +++ b/htdocs/core/tpl/notes.tpl.php @@ -50,7 +50,7 @@ // Special cases if ($module == 'propal') { $permission=$user->rights->propale->creer;} -elseif ($module == 'askpricesupplier') { $permission=$user->rights->askpricesupplier->creer;} +elseif ($module == 'askpricesupplier') { $permission=$user->rights->askpricesupplier->creer;} elseif ($module == 'fichinter') { $permission=$user->rights->ficheinter->creer;} elseif ($module == 'project') { $permission=$user->rights->projet->creer;} elseif ($module == 'project_task') { $permission=$user->rights->projet->creer;} diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 6b3f5c662a377..e552ca7555311 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -2026,7 +2026,7 @@ border-bottom-color: #BBB; border-bottom-style: solid; - margin: 0px 0px 2px 0px; + margin: 0px 0px 5px 0px; -moz-box-shadow: 2px 2px 4px #CCC; -webkit-box-shadow: 2px 2px 4px #CCC; From 39d89ef9aa7d67b2b66173b45973841f7f9dc066 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Thu, 15 Oct 2015 16:11:03 +0200 Subject: [PATCH 128/297] Fix: Parse error: syntax error, unexpected '}' --- htdocs/user/card.php | 51 ++++++++++++++++++++++---------------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/htdocs/user/card.php b/htdocs/user/card.php index aa27914e1d562..05ef3908b1b3a 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -264,22 +264,21 @@ $editgroup->fetch($group); $editgroup->oldcopy=clone $editgroup; - $object->fetch($id); - if ($action == 'addgroup') { - $object->SetInGroup($group, ($conf->multicompany->transverse_mode ? GETPOST("entity") : $editgroup->entity)); - } - if ($action == 'removegroup') { - $object->RemoveFromGroup($group, ($conf->multicompany->transverse_mode ? GETPOST("entity") : $editgroup->entity)); - } - - if ($result > 0) { - header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id); - exit; - } else { - setEventMessage($object->error, 'errors'); - } - } - } + $object->fetch($id); + if ($action == 'addgroup') { + $object->SetInGroup($group, ($conf->multicompany->transverse_mode ? GETPOST("entity") : $editgroup->entity)); + } + if ($action == 'removegroup') { + $object->RemoveFromGroup($group, ($conf->multicompany->transverse_mode ? GETPOST("entity") : $editgroup->entity)); + } + + if ($result > 0) { + header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id); + exit; + } else { + setEventMessage($object->error, 'errors'); + } + } if ($action == 'update' && !$_POST["cancel"]) { require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; @@ -1154,14 +1153,14 @@ dol_fiche_head($head, 'user', $title, 0, 'user'); dol_banner_tab($object,'id','',$user->rights->user->user->lire || $user->admin); - - + + print '
    '; print '
    '; - + print '
    '; print ''; - + // Login print ''; if (! empty($object->ldap_sid) && $object->statut==0) @@ -1345,13 +1344,13 @@ } print '
    '.$langs->trans("Login").'
    '; - + print '
    '; print '
    '; - + print '
    '; print ''; - + print ''; print ''; print "\n"; @@ -1445,10 +1444,10 @@ print "
    '.$langs->trans("LastConnexion").''.dol_print_date($object->datelastlogin,"dayhour").'
    \n"; print '
    '; - + print '
    '; print '
    '; - + dol_fiche_end(); @@ -1694,7 +1693,7 @@ print ''; print ''; } - + // Lastname print ""; print ''.$langs->trans("Lastname").''; From d44e961014aa917c0d272369a0ddd46ac132123d Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Thu, 15 Oct 2015 16:16:50 +0200 Subject: [PATCH 129/297] Fix: Parse error: syntax error, unexpected '}' Fix: bad indentation !!! use tabulation instead spaces please !!! --- htdocs/user/card.php | 320 +++++++++++++++++++++---------------------- 1 file changed, 159 insertions(+), 161 deletions(-) diff --git a/htdocs/user/card.php b/htdocs/user/card.php index 05ef3908b1b3a..10772405db119 100644 --- a/htdocs/user/card.php +++ b/htdocs/user/card.php @@ -107,185 +107,184 @@ if (empty($reshook)) { - if ($action == 'confirm_disable' && $confirm == "yes" && $candisableuser) { - if ($id <> $user->id) { - $object->fetch($id); - $object->setstatus(0); - header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id); - exit; - } - } - if ($action == 'confirm_enable' && $confirm == "yes" && $candisableuser) { - $error = 0; + if ($action == 'confirm_disable' && $confirm == "yes" && $candisableuser) { + if ($id <> $user->id) { + $object->fetch($id); + $object->setstatus(0); + header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id); + exit; + } + } + if ($action == 'confirm_enable' && $confirm == "yes" && $candisableuser) { + $error = 0; - if ($id <> $user->id) { - $object->fetch($id); + if ($id <> $user->id) { + $object->fetch($id); - if (!empty($conf->file->main_limit_users)) { - $nb = $object->getNbOfUsers("active"); - if ($nb >= $conf->file->main_limit_users) { - $error ++; - setEventMessage($langs->trans("YourQuotaOfUsersIsReached"), 'errors'); - } - } + if (!empty($conf->file->main_limit_users)) { + $nb = $object->getNbOfUsers("active"); + if ($nb >= $conf->file->main_limit_users) { + $error ++; + setEventMessage($langs->trans("YourQuotaOfUsersIsReached"), 'errors'); + } + } - if (!$error) { - $object->setstatus(1); - header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id); - exit; - } - } - } + if (!$error) { + $object->setstatus(1); + header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id); + exit; + } + } + } - if ($action == 'confirm_delete' && $confirm == "yes" && $candisableuser) { - if ($id <> $user->id) { - $object = new User($db); - $object->id = $id; - $result = $object->delete(); - if ($result < 0) { - $langs->load("errors"); - setEventMessage($langs->trans("ErrorUserCannotBeDelete"), 'errors'); - } else { - header("Location: index.php"); - exit; - } - } - } + if ($action == 'confirm_delete' && $confirm == "yes" && $candisableuser) { + if ($id <> $user->id) { + $object = new User($db); + $object->id = $id; + $result = $object->delete(); + if ($result < 0) { + $langs->load("errors"); + setEventMessage($langs->trans("ErrorUserCannotBeDelete"), 'errors'); + } else { + header("Location: index.php"); + exit; + } + } + } -// Action Add user - if ($action == 'add' && $canadduser) { - $error = 0; + // Action Add user + if ($action == 'add' && $canadduser) { + $error = 0; - if (!$_POST["lastname"]) { - $error ++; - setEventMessage($langs->trans("NameNotDefined"), 'errors'); - $action = "create"; // Go back to create page - } - if (!$_POST["login"]) { - $error ++; - setEventMessage($langs->trans("LoginNotDefined"), 'errors'); - $action = "create"; // Go back to create page - } + if (!$_POST["lastname"]) { + $error ++; + setEventMessage($langs->trans("NameNotDefined"), 'errors'); + $action = "create"; // Go back to create page + } + if (!$_POST["login"]) { + $error ++; + setEventMessage($langs->trans("LoginNotDefined"), 'errors'); + $action = "create"; // Go back to create page + } - if (!empty($conf->file->main_limit_users)) // If option to limit users is set - { - $nb = $object->getNbOfUsers("active"); - if ($nb >= $conf->file->main_limit_users) { - $error ++; - setEventMessage($langs->trans("YourQuotaOfUsersIsReached"), 'errors'); - $action = "create"; // Go back to create page - } - } + if (!empty($conf->file->main_limit_users)) { // If option to limit users is set + $nb = $object->getNbOfUsers("active"); + if ($nb >= $conf->file->main_limit_users) { + $error ++; + setEventMessage($langs->trans("YourQuotaOfUsersIsReached"), 'errors'); + $action = "create"; // Go back to create page + } + } - if (!$error) { - $object->lastname = GETPOST("lastname", 'alpha'); - $object->firstname = GETPOST("firstname", 'alpha'); - $object->login = GETPOST("login", 'alpha'); - $object->api_key = GETPOST("api_key", 'alpha'); - $object->gender = GETPOST("gender", 'alpha'); - $object->admin = GETPOST("admin", 'alpha'); - $object->office_phone = GETPOST("office_phone", 'alpha'); - $object->office_fax = GETPOST("office_fax", 'alpha'); - $object->user_mobile = GETPOST("user_mobile"); - $object->skype = GETPOST("skype"); - $object->email = GETPOST("email", 'alpha'); - $object->job = GETPOST("job", 'alpha'); - $object->signature = GETPOST("signature"); - $object->accountancy_code = GETPOST("accountancy_code"); - $object->note = GETPOST("note"); - $object->ldap_sid = GETPOST("ldap_sid"); - $object->fk_user = GETPOST("fk_user") > 0 ? GETPOST("fk_user") : 0; - - $object->thm = GETPOST("thm") != '' ? GETPOST("thm") : ''; - $object->tjm = GETPOST("tjm") != '' ? GETPOST("tjm") : ''; - $object->salary = GETPOST("salary") != '' ? GETPOST("salary") : ''; - $object->salaryextra = GETPOST("salaryextra") != '' ? GETPOST("salaryextra") : ''; - $object->weeklyhours = GETPOST("weeklyhours") != '' ? GETPOST("weeklyhours") : ''; - - $object->color = GETPOST("color") != '' ? GETPOST("color") : ''; - - // Fill array 'array_options' with data from add form - $ret = $extrafields->setOptionalsFromPost($extralabels, $object); - if ($ret < 0) { - $error ++; - } + if (!$error) { + $object->lastname = GETPOST("lastname", 'alpha'); + $object->firstname = GETPOST("firstname", 'alpha'); + $object->login = GETPOST("login", 'alpha'); + $object->api_key = GETPOST("api_key", 'alpha'); + $object->gender = GETPOST("gender", 'alpha'); + $object->admin = GETPOST("admin", 'alpha'); + $object->office_phone = GETPOST("office_phone", 'alpha'); + $object->office_fax = GETPOST("office_fax", 'alpha'); + $object->user_mobile = GETPOST("user_mobile"); + $object->skype = GETPOST("skype"); + $object->email = GETPOST("email", 'alpha'); + $object->job = GETPOST("job", 'alpha'); + $object->signature = GETPOST("signature"); + $object->accountancy_code = GETPOST("accountancy_code"); + $object->note = GETPOST("note"); + $object->ldap_sid = GETPOST("ldap_sid"); + $object->fk_user = GETPOST("fk_user") > 0 ? GETPOST("fk_user") : 0; + + $object->thm = GETPOST("thm") != '' ? GETPOST("thm") : ''; + $object->tjm = GETPOST("tjm") != '' ? GETPOST("tjm") : ''; + $object->salary = GETPOST("salary") != '' ? GETPOST("salary") : ''; + $object->salaryextra = GETPOST("salaryextra") != '' ? GETPOST("salaryextra") : ''; + $object->weeklyhours = GETPOST("weeklyhours") != '' ? GETPOST("weeklyhours") : ''; + + $object->color = GETPOST("color") != '' ? GETPOST("color") : ''; + + // Fill array 'array_options' with data from add form + $ret = $extrafields->setOptionalsFromPost($extralabels, $object); + if ($ret < 0) { + $error ++; + } - // Set entity property - $entity = GETPOST('entity', 'int'); - if (!empty($conf->multicompany->enabled)) { - if (!empty($_POST["superadmin"])) { - $object->entity = 0; - } else { - if ($conf->multicompany->transverse_mode) { - $object->entity = 1; // all users are forced into master entity - } else { - $object->entity = ($entity == '' ? 1 : $entity); - } - } - } else { - $object->entity = ($entity == '' ? 1 : $entity); + // Set entity property + $entity = GETPOST('entity', 'int'); + if (!empty($conf->multicompany->enabled)) { + if (!empty($_POST["superadmin"])) { + $object->entity = 0; + } else { + if ($conf->multicompany->transverse_mode) { + $object->entity = 1; // all users are forced into master entity + } else { + $object->entity = ($entity == '' ? 1 : $entity); + } + } + } else { + $object->entity = ($entity == '' ? 1 : $entity); /*if ($user->admin && $user->entity == 0 && GETPOST("admin",'alpha')) { }*/ - } - - $db->begin(); - - $id = $object->create($user); - if ($id > 0) { - if (isset($_POST['password']) && trim($_POST['password'])) { - $object->setPassword($user, trim($_POST['password'])); - } + } - $db->commit(); + $db->begin(); - header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id); - exit; - } else { - $langs->load("errors"); - $db->rollback(); - if (is_array($object->errors) && count($object->errors)) { - setEventMessage($object->errors, 'errors'); - } else { - setEventMessage($object->error, 'errors'); - } - $action = "create"; // Go back to create page - } - - } - } - -// Action add usergroup -if (($action == 'addgroup' || $action == 'removegroup') && $caneditfield) -{ - if ($group) - { - $editgroup = new UserGroup($db); - $editgroup->fetch($group); - $editgroup->oldcopy=clone $editgroup; + $id = $object->create($user); + if ($id > 0) { + if (isset($_POST['password']) && trim($_POST['password'])) { + $object->setPassword($user, trim($_POST['password'])); + } - $object->fetch($id); - if ($action == 'addgroup') { - $object->SetInGroup($group, ($conf->multicompany->transverse_mode ? GETPOST("entity") : $editgroup->entity)); - } - if ($action == 'removegroup') { - $object->RemoveFromGroup($group, ($conf->multicompany->transverse_mode ? GETPOST("entity") : $editgroup->entity)); + $db->commit(); + + header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id); + exit; + } else { + $langs->load("errors"); + $db->rollback(); + if (is_array($object->errors) && count($object->errors)) { + setEventMessage($object->errors, 'errors'); + } else { + setEventMessage($object->error, 'errors'); + } + $action = "create"; // Go back to create page + } } + } - if ($result > 0) { - header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id); - exit; - } else { - setEventMessage($object->error, 'errors'); + // Action add usergroup + if (($action == 'addgroup' || $action == 'removegroup') && $caneditfield) + { + if ($group) + { + $editgroup = new UserGroup($db); + $editgroup->fetch($group); + $editgroup->oldcopy=clone $editgroup; + + $object->fetch($id); + if ($action == 'addgroup') { + $object->SetInGroup($group, ($conf->multicompany->transverse_mode ? GETPOST("entity") : $editgroup->entity)); + } + if ($action == 'removegroup') { + $object->RemoveFromGroup($group, ($conf->multicompany->transverse_mode ? GETPOST("entity") : $editgroup->entity)); + } + + if ($result > 0) { + header("Location: ".$_SERVER['PHP_SELF'].'?id='.$id); + exit; + } else { + setEventMessage($object->error, 'errors'); + } } } - if ($action == 'update' && !$_POST["cancel"]) { - require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + if ($action == 'update' && !$_POST["cancel"]) { + require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; - if ($caneditfield) // Case we can edit all field - { - $error = 0; + if ($caneditfield) // Case we can edit all field + { + $error = 0; if (!$_POST["lastname"]) { setEventMessage($langs->trans("NameNotDefined"), 'errors'); @@ -492,9 +491,8 @@ setEventMessage($object->error, 'errors'); } } -} -// Change password with a new generated one + // Change password with a new generated one if ((($action == 'confirm_password' && $confirm == 'yes') || ($action == 'confirm_passwordsend' && $confirm == 'yes')) && $caneditpassword ) { @@ -518,7 +516,7 @@ } } -// Action initialisation donnees depuis record LDAP + // Action initialisation donnees depuis record LDAP if ($action == 'adduserldap') { $selecteduser = $_POST['users']; From 2c6aeac64f53b8eb88aaf8797975500c01692897 Mon Sep 17 00:00:00 2001 From: Gauthier Date: Thu, 15 Oct 2015 16:48:52 +0200 Subject: [PATCH 130/297] FIX : Societe::set_parent() function needs societe object to be fetched to update parent --- htdocs/societe/class/societe.class.php | 1 + htdocs/societe/soc.php | 1 + 2 files changed, 2 insertions(+) diff --git a/htdocs/societe/class/societe.class.php b/htdocs/societe/class/societe.class.php index 7bf8d6c45cf3a..cd68317c709be 100644 --- a/htdocs/societe/class/societe.class.php +++ b/htdocs/societe/class/societe.class.php @@ -2468,6 +2468,7 @@ function set_parent($id) $resql=$this->db->query($sql); if ($resql) { + $this->parent = $id; return 1; } else diff --git a/htdocs/societe/soc.php b/htdocs/societe/soc.php index be879efecf50b..b376a8c27652a 100644 --- a/htdocs/societe/soc.php +++ b/htdocs/societe/soc.php @@ -649,6 +649,7 @@ // Set parent company if ($action == 'set_thirdparty' && $user->rights->societe->creer) { + $object->fetch($socid); $result = $object->set_parent(GETPOST('editparentcompany','int')); } From 6bd13b8071b87a8251b0b0c6aaa941b853011740 Mon Sep 17 00:00:00 2001 From: arnaud Date: Thu, 15 Oct 2015 16:53:28 +0200 Subject: [PATCH 131/297] FIX bug invoice classified in propale next update commonobject class in 3.8 --- htdocs/comm/propal/class/propal.class.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 69f36c8313621..71295e94f700c 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -2124,26 +2124,26 @@ function InvoiceArrayList($id) $this->fetchObjectLinked($id,$this->element); foreach($this->linkedObjectsIds as $objecttype => $objectid) { - $numi=count($objectid); - for ($i=0;$i<$numi;$i++) + // Nouveau système du comon object renvoi des rowid et non un id linéaire de 1 à n + // On parcourt donc une liste d'objets en tant qu'objet unique + foreach($objectid as $key => $object) { // Cas des factures liees directement if ($objecttype == 'facture') { - $linkedInvoices[] = $objectid[$i]; + $linkedInvoices[] = $object; } // Cas des factures liees par un autre objet (ex: commande) else { - $this->fetchObjectLinked($objectid[$i],$objecttype); + $this->fetchObjectLinked($object,$objecttype); foreach($this->linkedObjectsIds as $subobjecttype => $subobjectid) { - $numj=count($subobjectid); - for ($j=0;$j<$numj;$j++) + foreach($subobjectid as $subkey => $subobject) { if ($subobjecttype == 'facture') { - $linkedInvoices[] = $subobjectid[$j]; + $linkedInvoices[] = $subobject; } } } From b3e3cc14a7ebcc0c01fbbf31081414c62b83b656 Mon Sep 17 00:00:00 2001 From: Gauthier Date: Thu, 15 Oct 2015 17:26:16 +0200 Subject: [PATCH 132/297] FIX : 1/ update_extra() function musn't be in "if(!empty(MAIN_DISABLE_CONTACTS_TAB)" test. 2/ Reindented code --- htdocs/compta/facture.php | 78 +++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/htdocs/compta/facture.php b/htdocs/compta/facture.php index b96edc31b2ce6..de0a591cf9823 100644 --- a/htdocs/compta/facture.php +++ b/htdocs/compta/facture.php @@ -1737,40 +1737,41 @@ $result = $object->add_contact($contactid, $_POST["type"], $_POST["source"]); } - if ($result >= 0) { - header("Location: " . $_SERVER['PHP_SELF'] . "?id=" . $object->id); - exit(); - } else { - if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') { - $langs->load("errors"); - setEventMessage($langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType"), 'errors'); + if ($result >= 0) { + header("Location: " . $_SERVER['PHP_SELF'] . "?id=" . $object->id); + exit(); } else { - setEventMessage($object->error, 'errors'); + if ($object->error == 'DB_ERROR_RECORD_ALREADY_EXISTS') { + $langs->load("errors"); + setEventMessage($langs->trans("ErrorThisContactIsAlreadyDefinedAsThisType"), 'errors'); + } else { + setEventMessage($object->error, 'errors'); + } } } - } - - // bascule du statut d'un contact - else if ($action == 'swapstatut') - { - if ($object->fetch($id)) { - $result = $object->swapContactStatus(GETPOST('ligne')); - } else { - dol_print_error($db); + + // bascule du statut d'un contact + else if ($action == 'swapstatut') + { + if ($object->fetch($id)) { + $result = $object->swapContactStatus(GETPOST('ligne')); + } else { + dol_print_error($db); + } + } + + // Efface un contact + else if ($action == 'deletecontact') + { + $object->fetch($id); + $result = $object->delete_contact($lineid); + + if ($result >= 0) { + header("Location: " . $_SERVER['PHP_SELF'] . "?id=" . $object->id); + exit(); + } else { + dol_print_error($db); } - } - - // Efface un contact - else if ($action == 'deletecontact') - { - $object->fetch($id); - $result = $object->delete_contact($lineid); - - if ($result >= 0) { - header("Location: " . $_SERVER['PHP_SELF'] . "?id=" . $object->id); - exit(); - } else { - dol_print_error($db); } } @@ -1790,17 +1791,16 @@ $reshook = $hookmanager->executeHooks('insertExtraFields', $parameters, $object, $action); // Note that $action and $object may have been modified by // some hooks if (empty($reshook)) { - $result = $object->insertExtraFields(); - if ($result < 0) { - $error ++; - } - } else if ($reshook < 0) + $result = $object->insertExtraFields(); + if ($result < 0) { $error ++; - } - - if ($error) - $action = 'edit_extras'; + } + } else if ($reshook < 0) + $error ++; } + + if ($error) + $action = 'edit_extras'; } } From 74c373a3af7a1f6bc30b8d507e806d4211ce139e Mon Sep 17 00:00:00 2001 From: fappels Date: Thu, 15 Oct 2015 22:54:42 +0200 Subject: [PATCH 133/297] Qual getSupplierPrices use productfourn method list_product_fournisseur_price because query has same purpose. --- htdocs/fourn/ajax/getSupplierPrices.php | 102 +++++++----------------- 1 file changed, 31 insertions(+), 71 deletions(-) diff --git a/htdocs/fourn/ajax/getSupplierPrices.php b/htdocs/fourn/ajax/getSupplierPrices.php index c39acd9dd2988..0255764a5d992 100644 --- a/htdocs/fourn/ajax/getSupplierPrices.php +++ b/htdocs/fourn/ajax/getSupplierPrices.php @@ -1,5 +1,6 @@ + * Copyright (C) 2015 Francis Appels * * 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 @@ -48,83 +49,42 @@ { $producttmp=new ProductFournisseur($db); $producttmp->fetch($idprod); - - $sql = "SELECT p.rowid, p.label, p.ref, p.price, p.duration,"; - $sql.= " pfp.ref_fourn,"; - $sql.= " pfp.rowid as idprodfournprice, pfp.price as fprice, pfp.remise_percent, pfp.quantity, pfp.unitprice, pfp.charges, pfp.unitcharges,"; - $sql.= " pfp.fk_supplier_price_expression, pfp.tva_tx, s.nom as name"; - $sql.= " FROM ".MAIN_DB_PREFIX."product_fournisseur_price as pfp"; - $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."product as p ON p.rowid = pfp.fk_product"; - $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = pfp.fk_soc"; - $sql.= " WHERE pfp.fk_product = ".$idprod; - $sql.= " AND p.tobuy = 1"; - $sql.= " AND s.fournisseur = 1"; - $sql.= " ORDER BY s.nom, pfp.ref_fourn DESC"; - - dol_syslog("Ajax::getSupplierPrices", LOG_DEBUG); - $result=$db->query($sql); - - if ($result) + $productSupplierArray = $producttmp->list_product_fournisseur_price($idprod); + if ( is_array($productSupplierArray)) { - $num = $db->num_rows($result); - - if ($num) + foreach ($productSupplierArray as $productSupplier) { - require_once DOL_DOCUMENT_ROOT.'/product/dynamic_price/class/price_parser.class.php'; - $i = 0; - while ($i < $num) + $price = $productSupplier->fourn_price * (1 - $productSupplier->fourn_remise_percent / 100); + $unitprice = $productSupplier->fourn_unitprice * (1 - $productSupplier->fourn_remise_percent / 100); + + $title = $productSupplier->fourn_name.' - '.$productSupplier->fourn_ref.' - '; + + if ($productSupplier->fourn_qty == 1) { - $objp = $db->fetch_object($result); - - if (!empty($objp->fk_supplier_price_expression)) { - $priceparser = new PriceParser($db); - $price_result = $priceparser->parseProductSupplier($idprod, $objp->fk_supplier_price_expression, $objp->quantity, $objp->tva_tx); - if ($price_result >= 0) { - $objp->fprice = $price_result; - if ($objp->quantity >= 1) - { - $objp->unitprice = $objp->fprice / $objp->quantity; - } - } - } - - $price = $objp->fprice * (1 - $objp->remise_percent / 100); - $unitprice = $objp->unitprice * (1 - $objp->remise_percent / 100); - - $title = $objp->name.' - '.$objp->ref_fourn.' - '; - - if ($objp->quantity == 1) - { - $title.= price($price,0,$langs,0,0,-1,$conf->currency)."/"; - } - $title.= $objp->quantity.' '.($objp->quantity == 1 ? $langs->trans("Unit") : $langs->trans("Units")); - - if ($objp->quantity > 1) - { - $title.=" - "; - $title.= price($unitprice,0,$langs,0,0,-1,$conf->currency)."/".$langs->trans("Unit"); - - $price = $unitprice; - } - if ($objp->unitcharges > 0 && ($conf->global->MARGIN_TYPE == "2")) - { - $title.=" + "; - $title.= price($objp->unitcharges,0,$langs,0,0,-1,$conf->currency); - $price += $objp->unitcharges; - } - if ($objp->duration) $label .= " - ".$objp->duration; - - $label = price($price,0,$langs,0,0,-1,$conf->currency)."/".$langs->trans("Unit"); - if ($objp->ref_fourn) $label.=' ('.$objp->ref_fourn.')'; - - $prices[] = array("id" => $objp->idprodfournprice, "price" => price($price,0,'',0), "label" => $label, "title" => $title); - $i++; + $title.= price($price,0,$langs,0,0,-1,$conf->currency)."/"; } - - $db->free($result); + $title.= $productSupplier->fourn_qty.' '.($productSupplier->fourn_qty == 1 ? $langs->trans("Unit") : $langs->trans("Units")); + + if ($productSupplier->fourn_qty > 1) + { + $title.=" - "; + $title.= price($unitprice,0,$langs,0,0,-1,$conf->currency)."/".$langs->trans("Unit"); + $price = $unitprice; + } + if ($productSupplier->fourn_unitcharges > 0 && ($conf->global->MARGIN_TYPE == "2")) + { + $title.=" + "; + $title.= price($productSupplier->fourn_unitcharges,0,$langs,0,0,-1,$conf->currency); + $price += $productSupplier->fourn_unitcharges; + } + + $label = price($price,0,$langs,0,0,-1,$conf->currency)."/".$langs->trans("Unit"); + if ($productSupplier->fourn_ref) $label.=' ('.$productSupplier->fourn_ref.')'; + + $prices[] = array("id" => $productSupplier->product_fourn_price_id, "price" => price($price,0,'',0), "label" => $label, "title" => $title); } } - + // Add price for pmp $price=$producttmp->pmp; $prices[] = array("id" => 'pmpprice', "price" => $price, "label" => $langs->trans("PMPValueShort").': '.price($price,0,$langs,0,0,-1,$conf->currency), "title" => $langs->trans("PMPValueShort").': '.price($price,0,$langs,0,0,-1,$conf->currency)); From dc5cc523952b032b601e24f88de668dffb12cee1 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 16 Oct 2015 10:52:49 +0200 Subject: [PATCH 134/297] NEW Merge all search fields of an area page into one search box --- htdocs/comm/index.php | 87 +++++++++++++----------------------------- htdocs/core/search.php | 78 +++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+), 60 deletions(-) create mode 100644 htdocs/core/search.php diff --git a/htdocs/comm/index.php b/htdocs/comm/index.php index 79dfafa7a76a3..534b7af4572da 100644 --- a/htdocs/comm/index.php +++ b/htdocs/comm/index.php @@ -75,84 +75,51 @@ // Search proposal if (! empty($conf->propal->enabled) && $user->rights->propal->lire) { - $var=false; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print "
    '.$langs->trans("SearchAProposal").'
    :
    :
    \n"; - print "
    \n"; + $listofsearchfields['search_proposal']=array('text'=>'Proposal'); } - // Search customer order if (! empty($conf->commande->enabled) && $user->rights->commande->lire) { - $var=false; - print '
    '; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print "
    '.$langs->trans("SearchACustomerOrder").'
    '; - print ':
    :

    \n"; + $listofsearchfields['search_customer_order']=array('text'=>'CustomerOrder'); } - // Search supplier order if (! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->commande->lire) { - $var=false; - print '
    '; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print "
    '.$langs->trans("SearchASupplierOrder").'
    '; - print ':
    :

    \n"; + $listofsearchfields['search_supplier_order']=array('text'=>'SupplierOrder'); +} +// Search intervention +if (! empty($conf->ficheinter->enabled) && $user->rights->ficheinter->lire) +{ + $listofsearchfields['search_intervention']=array('text'=>'Intervention'); } - // Search contract if (! empty($conf->contrat->enabled) && $user->rights->contrat->lire) { - $var=false; - print '
    '; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print "
    '.$langs->trans("SearchAContract").'
    :
    :
    \n"; - print "
    "; + $listofsearchfields['search_contract']=array('text'=>'Contrat'); } -// Search contract -if (! empty($conf->ficheinter->enabled) && $user->rights->ficheinter->lire) +if (count($listofsearchfields)) { - $var=false; - print '
    '; + print ''; print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print "
    '.$langs->trans("SearchAnIntervention").'
    :
    :
    \n"; - print "
    "; + print ''; + $i=0; + foreach($listofsearchfields as $key => $value) + { + if ($i == 0) print ''; + print ''; + print ''; + if ($i == 0) print ''; + print ''; + $i++; + } + print '
    '.$langs->trans("Search").'
    :
    '; + print ''; + print '
    '; } + + /* * Draft proposals */ diff --git a/htdocs/core/search.php b/htdocs/core/search.php new file mode 100644 index 0000000000000..6dd5d46c72f8c --- /dev/null +++ b/htdocs/core/search.php @@ -0,0 +1,78 @@ + + * + * This file is a modified version of datepicker.php from phpBSM to fix some + * bugs, to add new features and to dramatically increase speed. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/core/search.php + * \brief Wrapper that receive any search. Depending on input field, make a redirect to correct URL. + */ + +if (! defined('NOREQUIREUSER')) define('NOREQUIREUSER','1'); // Not disabled cause need to load personalized language +if (! defined('NOREQUIREDB')) define('NOREQUIREDB','1'); // Not disabled cause need to load personalized language +if (! defined('NOREQUIRESOC')) define('NOREQUIRESOC','1'); +if (! defined('NOREQUIRETRAN')) define('NOREQUIRETRAN','1'); // Not disabled cause need to do translations +if (! defined('NOCSRFCHECK')) define('NOCSRFCHECK',1); +if (! defined('NOTOKENRENEWAL')) define('NOTOKENRENEWAL',1); +if (! defined('NOLOGIN')) define('NOLOGIN',1); // Not disabled cause need to load personalized language +if (! defined('NOREQUIREMENU')) define('NOREQUIREMENU',1); +//if (! defined('NOREQUIREHTML')) define('NOREQUIREHTML',1); + +require_once '../main.inc.php'; + +/* + * Actions + */ + +if (GETPOST('search_proposal') != '') +{ + header("Location: ".DOL_URL_ROOT.'/comm/propal/list.php?sall='.urlencode(GETPOST('search_proposal'))); + exit; +} +if (GETPOST('search_customer_order') != '') +{ + header("Location: ".DOL_URL_ROOT.'/commande/list.php?sall='.urlencode(GETPOST('search_customer_order'))); + exit; +} +if (GETPOST('search_supplier_order') != '') +{ + header("Location: ".DOL_URL_ROOT.'/fourn/commande/list.php?search_all='.urlencode(GETPOST('search_supplier_order'))); + exit; +} +if (GETPOST('search_intervention') != '') +{ + header("Location: ".DOL_URL_ROOT.'/fichinter/list.php?sall='.urlencode(GETPOST('search_intervention'))); + exit; +} +if (GETPOST('search_contract') != '') +{ + header("Location: ".DOL_URL_ROOT.'/contrat/list.php?sall='.urlencode(GETPOST('search_contract'))); + exit; +} + +// If we are here, search was called with no supported criteria +if (! empty($_SERVER['HTTP_REFERER'])) +{ + header("Location: ".$_SERVER['HTTP_REFERER']); + exit; +} +else +{ + print 'The wrapper search.php was called without any search criteria'; +} + From 0663932589af7b122cab273eca83e85e9d17577f Mon Sep 17 00:00:00 2001 From: fappels Date: Fri, 16 Oct 2015 12:51:49 +0200 Subject: [PATCH 135/297] Add currently used sortfields and sortorder --- htdocs/fourn/ajax/getSupplierPrices.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/htdocs/fourn/ajax/getSupplierPrices.php b/htdocs/fourn/ajax/getSupplierPrices.php index 0255764a5d992..4bdfb6ca238f3 100644 --- a/htdocs/fourn/ajax/getSupplierPrices.php +++ b/htdocs/fourn/ajax/getSupplierPrices.php @@ -49,7 +49,9 @@ { $producttmp=new ProductFournisseur($db); $producttmp->fetch($idprod); - $productSupplierArray = $producttmp->list_product_fournisseur_price($idprod); + // get supplier prices sorted descending on supplier name and supplier ref + // TODO create configuration to define best price, current is not optimal + $productSupplierArray = $producttmp->list_product_fournisseur_price($idprod, 's.nom, pfp.ref_fourn', 'DESC'); if ( is_array($productSupplierArray)) { foreach ($productSupplierArray as $productSupplier) From ebdc4028329a26a029dc9b26be968e516965f848 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 16 Oct 2015 15:05:05 +0200 Subject: [PATCH 136/297] No value set when using the generic new thirdparty feature --- htdocs/societe/soc.php | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/htdocs/societe/soc.php b/htdocs/societe/soc.php index 24d8d146e964b..af18134793212 100644 --- a/htdocs/societe/soc.php +++ b/htdocs/societe/soc.php @@ -240,6 +240,26 @@ { require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; + if (! GETPOST('name')) + { + setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ThirdPartyName")), 'errors'); + $error++; + $action='create'; + } + if (GETPOST('client') < 0) + { + setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ProspectCustomer")), 'errors'); + $error++; + $action='create'; + } + if (GETPOST('fournisseur') < 0) + { + setEventMessage($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Supplier")), 'errors'); + $error++; + $action='create'; + } + + if ($action == 'update') { $ret=$object->fetch($socid); @@ -962,10 +982,11 @@ print ''.fieldLabel('ProspectCustomer','customerprospect',1).''; print ''; print ''.fieldLabel('CustomerCode','customer_code').''; @@ -984,7 +1005,7 @@ // Supplier print ''; print ''.fieldLabel('Supplier','fournisseur',1).''; - print $form->selectyesno("fournisseur",(isset($_POST['fournisseur'])?GETPOST('fournisseur'):$object->fournisseur),1); + print $form->selectyesno("fournisseur", (isset($_POST['fournisseur'])?GETPOST('fournisseur'):(GETPOST("type") == '' ? -1 : $object->fournisseur)), 1, 0, (GETPOST("type") == '' ? 1 : 0)); print ''; print ''.fieldLabel('SupplierCode','supplier_code').''; print '
    '; From df0c6aa5cf0a24fbaa35fa33f8697d706ac8399a Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 16 Oct 2015 16:14:33 +0200 Subject: [PATCH 137/297] Use the new card banner for members --- htdocs/adherents/agenda.php | 24 +++--- htdocs/adherents/card.php | 97 ++++++++--------------- htdocs/adherents/card_subscriptions.php | 30 +++---- htdocs/core/class/commonobject.class.php | 32 ++++---- htdocs/core/lib/functions.lib.php | 27 ++++--- htdocs/societe/notify/card.php | 14 ++-- htdocs/theme/common/gmap.png | Bin 345 -> 675 bytes 7 files changed, 96 insertions(+), 128 deletions(-) diff --git a/htdocs/adherents/agenda.php b/htdocs/adherents/agenda.php index 71106dddee6b4..74036ec8e8dd6 100644 --- a/htdocs/adherents/agenda.php +++ b/htdocs/adherents/agenda.php @@ -84,16 +84,14 @@ dol_fiche_head($head, 'agenda', $langs->trans("Member"),0,'user'); - print ''; - $linkback = ''.$langs->trans("BackToList").''; - - // Reference - print ''; - print ''; - print ''; + + dol_banner_tab($object, 'rowid', $linkback); + + print '
    '; + + print '
    '; + print '
    '.$langs->trans('Ref').''; - print $form->showrefnav($object, 'id', $linkback); - print '
    '; // Login if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) @@ -101,6 +99,9 @@ print ''; } + // Type + print '\n"; + // Morphy print ''; /*print '';*/ print ''; - // Type - print '\n"; - // Company print ''; @@ -132,6 +130,8 @@ print ''; + dol_fiche_end(); + /* * Barre d'action diff --git a/htdocs/adherents/card.php b/htdocs/adherents/card.php index bc2dcec7f6a2f..2123b59ab8df2 100644 --- a/htdocs/adherents/card.php +++ b/htdocs/adherents/card.php @@ -802,13 +802,6 @@ function initfieldrequired() print ''; } - // Moral-Physique - $morphys["phy"] = $langs->trans("Physical"); - $morphys["mor"] = $langs->trans("Moral"); - print '\n"; - // Type print '\n"; + // Morphy + $morphys["phy"] = $langs->trans("Physical"); + $morphys["mor"] = $langs->trans("Moral"); + print '\n"; + // Company print ''; @@ -1050,7 +1050,7 @@ function initfieldrequired() print ''; } - // Physique-Moral + // Morphy $morphys["phy"] = $langs->trans("Physical"); $morphys["mor"] = $langs->trans("Morale"); print ''; print '
    '.$langs->trans("Login").' / '.$langs->trans("Id").''.$object->login.' 
    '.$langs->trans("Type").''.$adht->getNomUrl(1)."
    '.$langs->trans("Nature").''.$object->getmorphylib().''; @@ -108,9 +109,6 @@ print '
    '.$langs->trans("Type").''.$adht->getNomUrl(1)."
    '.$langs->trans("Company").''.$object->societe.'
    '.$langs->trans("Login").' / '.$langs->trans("Id").'login).'">
    '.$langs->trans("Nature")."\n"; - print $form->selectarray("morphy", $morphys, GETPOST('morphy','alpha')?GETPOST('morphy','alpha'):$object->morphy, 1); - print "
    '.$langs->trans("MemberType").''; $listetype=$adht->liste_array(); @@ -820,6 +813,13 @@ function initfieldrequired() } print "
    '.$langs->trans("Nature")."\n"; + print $form->selectarray("morphy", $morphys, GETPOST('morphy','alpha')?GETPOST('morphy','alpha'):$object->morphy, 1); + print "
    '.$langs->trans("Company").'
    '.$langs->trans("Login").' / '.$langs->trans("Id").'login).'">
    '.$langs->trans("Nature").''; @@ -1402,37 +1402,29 @@ function initfieldrequired() if (! empty($conf->societe->enabled)) $rowspan++; if (! empty($conf->skype->enabled)) $rowspan++; - print ''; - $linkback = ''.$langs->trans("BackToList").''; - - // Ref - print ''; - print ''; - - $showphoto=''; + + dol_banner_tab($object, 'rowid', $linkback); + + print '
    '; + print '
    '; + + print '
    '; + print '
    '.$langs->trans("Ref").''; - print $form->showrefnav($object, 'rowid', $linkback); - print '
    '; - $showphoto.=$form->showphoto('memberphoto',$object); - $showphoto.='
    '; // Login if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) { - print ''; - // Photo - print $showphoto; $showphoto=''; - print ''; + print ''; } + // Type + print '\n"; + // Morphy print ''; - print $showphoto; $showphoto=''; print ''; - // Type - print '\n"; - // Company print ''; @@ -1447,9 +1439,6 @@ function initfieldrequired() // Firstname print ''; - // EMail - print ''; - // Password if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) { @@ -1463,48 +1452,26 @@ function initfieldrequired() print ''; } - // Address - print ''; - - // Zip / Town - print ''; - - // Country - print ''; - - // State - print ''; - - // Tel pro. - print ''; - - // Tel perso - print ''; - - // Tel mobile - print ''; - // Skype if (! empty($conf->skype->enabled)) { print ''; } + print '
    '.$langs->trans("Login").' / '.$langs->trans("Id").''.$object->login.' 
    '.$langs->trans("Login").' / '.$langs->trans("Id").''.$object->login.' 
    '.$langs->trans("Type").''.$adht->getNomUrl(1)."
    '.$langs->trans("Nature").''.$object->getmorphylib().'
    '.$langs->trans("Type").''.$adht->getNomUrl(1)."
    '.$langs->trans("Company").''.$object->societe.'
    '.$langs->trans("Firstname").''.$object->firstname.' 
    '.$langs->trans("EMail").''.dol_print_email($object->email,0,$object->fk_soc,1).'
    '.$langs->trans("Address").''; - dol_print_address($object->address,'gmap','member',$object->id); - print '
    '.$langs->trans("Zip").' / '.$langs->trans("Town").''.$object->zip.(($object->zip && $object->town)?' / ':'').$object->town.'
    '.$langs->trans("Country").''; - $img=picto_from_langcode($object->country_code); - if ($img) print $img.' '; - print getCountry($object->country_code); - print '
    '.$langs->trans('State').''.$object->state.'
    '.$langs->trans("PhonePro").''.dol_print_phone($object->phone,$object->country_code,0,$object->fk_soc,1).'
    '.$langs->trans("PhonePerso").''.dol_print_phone($object->phone_perso,$object->country_code,0,$object->fk_soc,1).'
    '.$langs->trans("PhoneMobile").''.dol_print_phone($object->phone_mobile,$object->country_code,0,$object->fk_soc,1).'
    '.$langs->trans("Skype").''.dol_print_skype($object->skype,0,$object->fk_soc,1).'
    '; + + print ''; + print '
    '; + + print '
    '; + print ''; + // Birthday print ''; // Public print ''; - // Status - print ''; - // Categories if (! empty($conf->categorie->enabled) && ! empty($user->rights->categorie->lire)) { @@ -1594,12 +1561,16 @@ function initfieldrequired() print "
    '.$langs->trans("Birthday").''.dol_print_date($object->birth,'day').'
    '.$langs->trans("Public").''.yn($object->public).'
    '.$langs->trans("Status").''.$object->getLibStatut(4).'
    \n"; - print "
    \n"; - + print "
    \n"; + print '
    '; + dol_fiche_end(); + + /* * Hotbar */ + print '
    '; $parameters = array(); $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been diff --git a/htdocs/adherents/card_subscriptions.php b/htdocs/adherents/card_subscriptions.php index 92af9c5981e00..fb3807fcc5c97 100644 --- a/htdocs/adherents/card_subscriptions.php +++ b/htdocs/adherents/card_subscriptions.php @@ -567,34 +567,31 @@ dol_fiche_head($head, 'subscription', $langs->trans("Member"), 0, 'user'); - print ''; - $linkback = ''.$langs->trans("BackToList").''; - - // Ref - print ''; - print ''; - - $showphoto=''; + + dol_banner_tab($object, 'rowid', $linkback); + + print '
    '; + + print '
    '; + print '
    '.$langs->trans("Ref").''; - print $form->showrefnav($object, 'rowid', $linkback); - print '
    '.$form->showphoto('memberphoto',$object).'
    '; // Login if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) { - print ''; + print ''; print $showphoto; $showphoto=''; print ''; } + // Type + print '\n"; + // Morphy print ''; print $showphoto; $showphoto=''; print ''; - // Type - print '\n"; - // Company print ''; @@ -701,14 +698,13 @@ print "
    '.$langs->trans("Login").' / '.$langs->trans("Id").''.$object->login.' 
    '.$langs->trans("Login").' / '.$langs->trans("Id").''.$object->login.' 
    '.$langs->trans("Type").''.$adht->getNomUrl(1)."
    '.$langs->trans("Nature").''.$object->getmorphylib().'
    '.$langs->trans("Type").''.$adht->getNomUrl(1)."
    '.$langs->trans("Company").''.$object->societe.'
    \n"; + print '
    '; + dol_fiche_end(); print ''; - dol_htmloutput_errors($errmsg,$errmsgs); - - /* * Hotbar */ diff --git a/htdocs/core/class/commonobject.class.php b/htdocs/core/class/commonobject.class.php index 7cb29b66544bc..d20d5d82bde25 100644 --- a/htdocs/core/class/commonobject.class.php +++ b/htdocs/core/class/commonobject.class.php @@ -447,18 +447,18 @@ function getBannerAddress($htmlkey, $object) $countriesusingstate=array('AU','US','IN','GB','ES','UK','TR'); - $contacti=0; + $contactid=0; $thirdpartyid=0; - if ($this->elemet == 'societe') + if ($this->element == 'societe') { $thirdpartyid=$this->id; } - if ($this->elemet == 'contact') + if ($this->element == 'contact') { $contactid=$this->id; $thirdpartyid=$object->fk_soc; } - if ($this->elemet == 'user') + if ($this->element == 'user') { $contactid=$this->contact_id; $thirdpartyid=$object->fk_soc; @@ -489,40 +489,40 @@ function getBannerAddress($htmlkey, $object) $outdone++; } - if ($this->phone_pro || $this->phone_mobile || $this->phone_perso || $this->fax || $this->office_phone || $this->user_mobile || $this->office_fax) $out.=($outdone?'
    ':''); - if ($this->phone && empty($this->phone_pro)) { // For objects that store pro phone into ->phone - $out.=dol_print_phone($this->phone,$country_code['code'],$contactid,$thirdpartyid,'AC_TEL',' ','phone',$langs->trans("PhonePro")); $outdone++; + if (! empty($this->phone_pro) || ! empty($this->phone_mobile) || ! empty($this->phone_perso) || ! empty($this->fax) || ! empty($this->office_phone) || ! empty($this->user_mobile) || ! empty($this->office_fax)) $out.=($outdone?'
    ':''); + if (! empty($this->phone) && empty($this->phone_pro)) { // For objects that store pro phone into ->phone + $out.=dol_print_phone($this->phone,$this->country_code,$contactid,$thirdpartyid,'AC_TEL',' ','phone',$langs->trans("PhonePro")); $outdone++; } if (! empty($this->phone_pro)) { - $out.=dol_print_phone($this->phone_pro,$country_code['code'],$contactid,$thirdpartyid,'AC_TEL',' ','phone',$langs->trans("PhonePro")); $outdone++; + $out.=dol_print_phone($this->phone_pro,$this->country_code,$contactid,$thirdpartyid,'AC_TEL',' ','phone',$langs->trans("PhonePro")); $outdone++; } if (! empty($this->phone_mobile)) { - $out.=dol_print_phone($this->phone_mobile,$country_code['code'],$contactid,$thirdpartyid,'AC_TEL',' ','phone',$langs->trans("PhoneMobile")); $outdone++; + $out.=dol_print_phone($this->phone_mobile,$this->country_code,$contactid,$thirdpartyid,'AC_TEL',' ','phone',$langs->trans("PhoneMobile")); $outdone++; } if (! empty($this->phone_perso)) { - $out.=dol_print_phone($this->phone_perso,$country_code['code'],$contactid,$thirdpartyid,'AC_TEL',' ','phone',$langs->trans("PhonePerso")); $outdone++; + $out.=dol_print_phone($this->phone_perso,$this->country_code,$contactid,$thirdpartyid,'AC_TEL',' ','phone',$langs->trans("PhonePerso")); $outdone++; } if (! empty($this->fax)) { - $out.=dol_print_phone($this->fax,$country_code['code'],$contactid,$thirdpartyid,'AC_FAX',' ','fax',$langs->trans("Fax")); $outdone++; + $out.=dol_print_phone($this->fax,$this->country_code,$contactid,$thirdpartyid,'AC_FAX',' ','fax',$langs->trans("Fax")); $outdone++; } if (! empty($this->office_phone)) { - $out.=dol_print_phone($this->office_phone,$country_code['code'],$contactid,$thirdpartyid,'AC_TEL',' ','phone',$langs->trans("PhonePro")); $outdone++; + $out.=dol_print_phone($this->office_phone,$this->country_code,$contactid,$thirdpartyid,'AC_TEL',' ','phone',$langs->trans("PhonePro")); $outdone++; } if (! empty($this->user_mobile)) { - $out.=dol_print_phone($this->user_mobile,$country_code['code'],$contactid,$thirdpartyid,'AC_TEL',' ','phone',$langs->trans("PhoneMobile")); $outdone++; + $out.=dol_print_phone($this->user_mobile,$this->country_code,$contactid,$thirdpartyid,'AC_TEL',' ','phone',$langs->trans("PhoneMobile")); $outdone++; } if (! empty($this->office_fax)) { - $out.=dol_print_phone($this->fax,$country_code['code'],$contactid,$thirdpartyid,'AC_FAX',' ','fax',$langs->trans("Fax")); $outdone++; + $out.=dol_print_phone($this->fax,$this->country_code,$contactid,$thirdpartyid,'AC_FAX',' ','fax',$langs->trans("Fax")); $outdone++; } $out.='
    '; $outdone=0; - if ($this->email) + if (! empty($this->email)) { $out.=dol_print_email($this->email,$this->id,$object->id,'AC_EMAIL',0,0,1); $outdone++; } - if ($this->url) + if (! empty($this->url)) { $out.=dol_print_url($this->url,'',0,1); $outdone++; diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index 9b8b6fcbcc379..ec3705c825ce1 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -732,7 +732,8 @@ function dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $pi $limittoshow=(empty($conf->global->MAIN_MAXTABS_IN_CARD)?99:$conf->global->MAIN_MAXTABS_IN_CARD); $displaytab=0; $nbintab=0; - + $popuptab=0; + for ($i = 0 ; $i <= $maxkey ; $i++) { if ((is_numeric($active) && $i == $active) || (! empty($links[$i][2]) && ! is_numeric($active) && $active == $links[$i][2])) @@ -1496,30 +1497,30 @@ function dol_print_skype($skype,$cid=0,$socid=0,$addlink=0,$max=64) /** * Format phone numbers according to country * - * @param string $phone Phone number to format - * @param string $country Country code to use for formatting - * @param int $cid Id of contact if known - * @param int $socid Id of third party if known - * @param string $addlink ''=no link to create action, 'AC_TEL'=add link to clicktodial (if module enabled) and add link to create event (if conf->global->AGENDA_ADDACTIONFORPHONE set) - * @param string $separ Separation between numbers for a better visibility example : xx.xx.xx.xx.xx - * @param string $withpicto Show picto - * @param string $titlealt Text to show on alt - * @return string Formated phone number + * @param string $phone Phone number to format + * @param string $countrycode Country code to use for formatting + * @param int $cid Id of contact if known + * @param int $socid Id of third party if known + * @param string $addlink ''=no link to create action, 'AC_TEL'=add link to clicktodial (if module enabled) and add link to create event (if conf->global->AGENDA_ADDACTIONFORPHONE set) + * @param string $separ Separation between numbers for a better visibility example : xx.xx.xx.xx.xx + * @param string $withpicto Show picto + * @param string $titlealt Text to show on alt + * @return string Formated phone number */ -function dol_print_phone($phone,$country='',$cid=0,$socid=0,$addlink='',$separ=" ",$withpicto='',$titlealt='') +function dol_print_phone($phone,$countrycode='',$cid=0,$socid=0,$addlink='',$separ=" ",$withpicto='',$titlealt='') { global $conf,$user,$langs,$mysoc; // Clean phone parameter $phone = preg_replace("/[\s.-]/","",trim($phone)); if (empty($phone)) { return ''; } - if (empty($country)) $country=$mysoc->country_code; + if (empty($countrycode)) $countrycode=$mysoc->country_code; // Short format for small screens if ($conf->dol_optimize_smallscreen) $separ=''; $newphone=$phone; - if (strtoupper($country) == "FR") + if (strtoupper($countrycode) == "FR") { // France if (dol_strlen($phone) == 10) { diff --git a/htdocs/societe/notify/card.php b/htdocs/societe/notify/card.php index 1b85cf36ab7a4..44bafd0840619 100644 --- a/htdocs/societe/notify/card.php +++ b/htdocs/societe/notify/card.php @@ -186,13 +186,13 @@ print '
    '; + // Help + print '
    '.$langs->trans("NotificationsDesc"); + print ''; dol_fiche_end(); - // Help - print $langs->trans("NotificationsDesc").'

    '; - print "\n"; // Add notification form @@ -221,12 +221,12 @@ // Load array of available notifications $notificationtrigger=new InterfaceNotification($db); - $listofnotifiedevents=$notificationtrigger->getListOfManagedEvents(); + $listofmanagedeventfornotification=$notificationtrigger->getListOfManagedEvents(); - foreach($listofnotifiedevents as $notifiedevent) + foreach($listofmanagedeventfornotification as $managedeventfornotification) { - $label=($langs->trans("Notify_".$notifiedevent['code'])!="Notify_".$notifiedevent['code']?$langs->trans("Notify_".$notifiedevent['code']):$notifiedevent['label']); - $actions[$notifiedevent['rowid']]=$label; + $label=($langs->trans("Notify_".$managedeventfornotification['code'])!="Notify_".$managedeventfornotification['code']?$langs->trans("Notify_".$managedeventfornotification['code']):$managedeventfornotification['label']); + $actions[$managedeventfornotification['rowid']]=$label; } print '
    '; print $form->selectarray("contactid",$listofemails); diff --git a/htdocs/theme/common/gmap.png b/htdocs/theme/common/gmap.png index 4636e2c848f003cd5bc4269f3359432b66791dcf..0423a91295654c414c56ff401e1b03257fb2c45e 100644 GIT binary patch literal 675 zcmV;U0$lxxP)eSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00H|+ zL_t(2&xOiQNEA^3fbs9mo7q;ql-5f_CHL1FZVvLGY88No`h5kww>tV=?);UPLC zwS*!>*rh|a=oTz==u)9kL6IV&lBqT6+MnIr)o9+#o7bs}Q2ve|p8)9Y?q+Cch_1_5 zcDF`IRYvUOs<9^C$;yZKuJz7lG8wYjETW^MgIq4h_4DWMo`^*+Y^jK1YzHYNu7;;8 zK~Hbr&B0VEg#fsiKG}1%F*e{!2jSS*PJ~d}2q}?La%Z7*;8y>@YYU*o@&`Omfv=b< zmKmJp^?K>g@<10$PJ^IGym@JmbPRv6PV6kw2 zm$mW~VZ_0a2BkbaOW;_7Fz^w8rvm0&H?%2zpLw?M)jQRk*kB8Iu&a@`s~!ip#=!S6 zz~kxp#hKyfWeecZ$HlISP-A?B2z>TcMG2Kp=qntp8Fd#91ISn`#^Z3qf0#W2kk99l{N<}+ zUK6GgwMVrv7y)Nryib2|-BH$x$KwFe{zENhBHeCowCz^_O-)Vw)1HQHnX%3`W7pJn z@;`}00-_u1a_xIHKr)$RUDZ{az5x`A#r5a<`ugMLa#^hHe*lG3+UN9y-);Z^002ov JPDHLkV1l%FFtz{y delta 336 zcmZ3?dXvesGr-TCmrII^fq{Y7)59eQNb`U&2Q!dNT)pNhkYX?K^mS#w&B`OBr}X`v zCrAxvfk$L90|U1Z2s2)~TlZ(8qHuj_fKQ0)|NsA!laswHEuU}QTWsm{|J=1>#o6!Y z%vrm%=Uz+k(&V5iJ=x#q^jyo1I#*qNEj#&tPxbTSsOK#$-&?AIMnA94{$5>uuekbu zPsX!FYru?5X=UjF1*6ieC)x|=$!rn2| zF)%Qe1o;IsI6S+N26SYUr;B4q#Vy}6;d~7SJj?-`4`rQR_J;Sny;8@thy5q~r!mDW zoXgk5b@ucw-Ka&c+Y5!bHm#byZ4y`JvCoUHbay;b>AT0@vw8VpWqS_!hCAg9I=6o^ fe7>G|=R3<%1?H=Jx~DY&ZDH_q^>bP0l+XkK=Dd(6 From ccf144dbae9e26a933ceae64dbd40562108e7687 Mon Sep 17 00:00:00 2001 From: All-3kcis Date: Fri, 16 Oct 2015 16:15:51 +0200 Subject: [PATCH 138/297] Correct hook param name $object => $product --- htdocs/product/fournisseurs.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/product/fournisseurs.php b/htdocs/product/fournisseurs.php index 4d20f1f7302c5..b739ccc4d9ea2 100644 --- a/htdocs/product/fournisseurs.php +++ b/htdocs/product/fournisseurs.php @@ -345,7 +345,7 @@ print $form->select_company(GETPOST("id_fourn"),'id_fourn','fournisseur=1',1,0,0,$events); $parameters=array('filtre'=>"fournisseur=1",'html_name'=>'id_fourn','selected'=>GETPOST("id_fourn"),'showempty'=>1,'prod_id'=>$product->id); - $reshook=$hookmanager->executeHooks('formCreateThirdpartyOptions',$parameters,$object,$action); + $reshook=$hookmanager->executeHooks('formCreateThirdpartyOptions',$parameters,$product,$action); if (empty($reshook)) { if (empty($form->result)) @@ -485,7 +485,7 @@ function on_change() { if (is_object($hookmanager)) { $parameters=array('id_fourn'=>$id_fourn,'prod_id'=>$product->id); - $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$object,$action); + $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$product,$action); } print '
    '; @@ -508,7 +508,7 @@ function on_change() { if ($action != 'add_price' && $action != 'updateprice') { $parameters=array(); - $reshook=$hookmanager->executeHooks('addMoreActionsButtons',$parameters,$object,$action); // Note that $action and $object may have been modified by hook + $reshook=$hookmanager->executeHooks('addMoreActionsButtons',$parameters,$product,$action); // Note that $action and $object may have been modified by hook if (empty($reshook)) { if ($user->rights->produit->creer || $user->rights->service->creer) @@ -632,7 +632,7 @@ function on_change() { if (is_object($hookmanager)) { $parameters=array('id_pfp'=>$productfourn->product_fourn_price_id,'id_fourn'=>$id_fourn,'prod_id'=>$product->id); - $reshook=$hookmanager->executeHooks('printObjectLine',$parameters,$object,$action); + $reshook=$hookmanager->executeHooks('printObjectLine',$parameters,$product,$action); } // Modify-Remove From 87c12717a742d313b408f27cf3bd4613040b9ba0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 16 Oct 2015 20:16:28 +0200 Subject: [PATCH 139/297] NEW The thirdparties tabs, the contacts tabs and the members tabs are now presented using a new top banner, saving space and using a same way to show address, status and navigation arrows. --- htdocs/adherents/agenda.php | 14 +- htdocs/adherents/card.php | 23 ++- htdocs/adherents/card_subscriptions.php | 230 ++++++++++++++---------- htdocs/adherents/document.php | 59 +++--- htdocs/adherents/fiche_subscription.php | 37 ++-- htdocs/adherents/info.php | 25 ++- htdocs/adherents/ldap.php | 49 +++-- htdocs/adherents/note.php | 42 ++--- htdocs/contact/document.php | 2 + htdocs/core/class/html.form.class.php | 10 +- 10 files changed, 258 insertions(+), 233 deletions(-) diff --git a/htdocs/adherents/agenda.php b/htdocs/adherents/agenda.php index 74036ec8e8dd6..77fa802296844 100644 --- a/htdocs/adherents/agenda.php +++ b/htdocs/adherents/agenda.php @@ -96,11 +96,11 @@ // Login if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) { - print ''.$langs->trans("Login").' / '.$langs->trans("Id").''.$object->login.' '; + print ''.$langs->trans("Login").' / '.$langs->trans("Id").''.$object->login.' '; } // Type - print ''.$langs->trans("Type").''.$adht->getNomUrl(1)."\n"; + print ''.$langs->trans("Type").''.$adht->getNomUrl(1)."\n"; // Morphy print ''.$langs->trans("Nature").''.$object->getmorphylib().''; @@ -116,16 +116,6 @@ print ''.$langs->trans("UserTitle").''.$object->getCivilityLabel().' '; print ''; - // Lastname - print ''.$langs->trans("Lastname").''.$object->lastname.' '; - print ''; - - // Firstname - print ''.$langs->trans("Firstname").''.$object->firstname.' '; - - // Status - print ''.$langs->trans("Status").''.$object->getLibStatut(4).''; - print ''; print '
    '; diff --git a/htdocs/adherents/card.php b/htdocs/adherents/card.php index 2123b59ab8df2..b9224253bacbf 100644 --- a/htdocs/adherents/card.php +++ b/htdocs/adherents/card.php @@ -1432,13 +1432,6 @@ function initfieldrequired() print ''.$langs->trans("UserTitle").''.$object->getCivilityLabel().' '; print ''; - // Lastname - print ''.$langs->trans("Lastname").''.$object->lastname.' '; - print ''; - - // Firstname - print ''.$langs->trans("Firstname").''.$object->firstname.' '; - // Password if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) { @@ -1559,6 +1552,22 @@ function initfieldrequired() } print ''; + // Date end subscription + print ''.$langs->trans("SubscriptionEndDate").''; + if ($object->datefin) + { + print dol_print_date($object->datefin,'day'); + if ($object->hasDelay()) { + print " ".img_warning($langs->trans("Late")); + } + } + else + { + print $langs->trans("SubscriptionNotReceived"); + if ($object->statut > 0) print " ".img_warning($langs->trans("Late")); // Affiche picto retard uniquement si non brouillon et non resilie + } + print ''; + print "\n"; print "
    \n"; diff --git a/htdocs/adherents/card_subscriptions.php b/htdocs/adherents/card_subscriptions.php index fb3807fcc5c97..fa440c3bac423 100644 --- a/htdocs/adherents/card_subscriptions.php +++ b/htdocs/adherents/card_subscriptions.php @@ -572,46 +572,150 @@ dol_banner_tab($object, 'rowid', $linkback); print '
    '; + print '
    '; print '
    '; print ''; - // Login - if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) - { - print ''; - print $showphoto; $showphoto=''; - print ''; - } + // Login + if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) + { + print ''; + } + + // Type + print '\n"; - // Type - print '\n"; + // Morphy + print ''; + print ''; - // Morphy - print ''; - print $showphoto; $showphoto=''; - print ''; + // Company + print ''; - // Company - print ''; + // Civility + print ''; + print ''; - // Civility - print ''; - print ''; + // Password + if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) + { + print ''; + } - // Lastname - print ''; - print ''; + // Skype + if (! empty($conf->skype->enabled)) + { + print ''; + } - // Firstname - print ''; - print ''; + print '
    '.$langs->trans("Login").' / '.$langs->trans("Id").''.$object->login.' 
    '.$langs->trans("Login").' / '.$langs->trans("Id").''.$object->login.' 
    '.$langs->trans("Type").''.$adht->getNomUrl(1)."
    '.$langs->trans("Type").''.$adht->getNomUrl(1)."
    '.$langs->trans("Nature").''.$object->getmorphylib().'
    '.$langs->trans("Nature").''.$object->getmorphylib().'
    '.$langs->trans("Company").''.$object->societe.'
    '.$langs->trans("Company").''.$object->societe.'
    '.$langs->trans("UserTitle").''.$object->getCivilityLabel().' 
    '.$langs->trans("UserTitle").''.$object->getCivilityLabel().' 
    '.$langs->trans("Password").''.preg_replace('/./i','*',$object->pass); + if ((! empty($object->pass) || ! empty($object->pass_crypted)) && empty($object->user_id)) + { + $langs->load("errors"); + $htmltext=$langs->trans("WarningPasswordSetWithNoAccount"); + print ' '.$form->textwithpicto('', $htmltext,1,'warning'); + } + print '
    '.$langs->trans("Lastname").''.$object->lastname.' 
    '.$langs->trans("Skype").''.dol_print_skype($object->skype,0,$object->fk_soc,1).'
    '.$langs->trans("Firstname").''.$object->firstname.' 
    '; + + print '
    '; + print '
    '; + + print '
    '; + print ''; + + // Birthday + print ''; - // EMail - print ''; + // Public + print ''; - // Status - print ''; + // Categories + if (! empty($conf->categorie->enabled) && ! empty($user->rights->categorie->lire)) + { + print ''; + print ''; + } + + // Other attributes + $parameters=array('colspan'=>2); + $reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$object,$action); // Note that $action and $object may have been modified by hook + if (empty($reshook) && ! empty($extrafields->attribute_label)) + { + print $object->showOptionals($extrafields, 'view', $parameters); + } + + // Third party Dolibarr + if (! empty($conf->societe->enabled)) + { + print ''; + } + + // Login Dolibarr + print ''; // Date end subscription print ''; - // Third party Dolibarr - if (! empty($conf->societe->enabled)) - { - print ''; - } - - // Login Dolibarr - print ''; - print "
    '.$langs->trans("Birthday").''.dol_print_date($object->birth,'day').'
    '.$langs->trans("EMail").''.dol_print_email($object->email,0,$object->fk_soc,1).'
    '.$langs->trans("Public").''.yn($object->public).'
    '.$langs->trans("Status").''.$object->getLibStatut(4).'
    ' . $langs->trans("Categories") . ''; + print $form->showCategories($object->id, 'member', 1); + print '
    '; + print ''; + if ($action != 'editthirdparty' && $user->rights->adherent->creer) print ''; + print '
    '; + print $langs->trans("LinkedToDolibarrThirdParty"); + print 'id.'">'.img_edit($langs->trans('SetLinkToThirdParty'),1).'
    '; + print '
    '; + if ($action == 'editthirdparty') + { + $htmlname='socid'; + print '
    '; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
    '; + print $form->select_company($object->fk_soc,'socid','',1); + print '
    '; + } + else + { + if ($object->fk_soc) + { + $company=new Societe($db); + $result=$company->fetch($object->fk_soc); + print $company->getNomUrl(1); + } + else + { + print $langs->trans("NoThirdPartyAssociatedToMember"); + } + } + print '
    '; + print ''; + if ($action != 'editlogin' && $user->rights->adherent->creer) + { + print ''; + } + print '
    '; + print $langs->trans("LinkedToDolibarrUser"); + print ''; + if ($user->rights->user->user->creer) + { + print 'id.'">'.img_edit($langs->trans('SetLinkToUser'),1).''; + } + print '
    '; + print '
    '; + if ($action == 'editlogin') + { + $form->form_users($_SERVER['PHP_SELF'].'?rowid='.$object->id,$object->user_id,'userid',''); + } + else + { + if ($object->user_id) + { + $form->form_users($_SERVER['PHP_SELF'].'?rowid='.$object->id,$object->user_id,'none'); + } + else print $langs->trans("NoDolibarrAccess"); + } + print '
    '.$langs->trans("SubscriptionEndDate").''; @@ -629,76 +733,10 @@ } print '
    '; - print ''; - if ($action != 'editthirdparty' && $user->rights->adherent->creer) print ''; - print '
    '; - print $langs->trans("LinkedToDolibarrThirdParty"); - print 'id.'">'.img_edit($langs->trans('SetLinkToThirdParty'),1).'
    '; - print '
    '; - if ($action == 'editthirdparty') - { - $htmlname='socid'; - print '
    '; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print '
    '; - print $form->select_company($object->fk_soc,'socid','',1); - print '
    '; - } - else - { - if ($object->fk_soc) - { - $company=new Societe($db); - $result=$company->fetch($object->fk_soc); - print $company->getNomUrl(1); - } - else - { - print $langs->trans("NoThirdPartyAssociatedToMember"); - } - } - print '
    '; - print ''; - if ($action != 'editlogin' && $user->rights->adherent->creer) print ''; - print '
    '; - print $langs->trans("LinkedToDolibarrUser"); - print 'id.'">'.img_edit($langs->trans('SetLinkToUser'),1).'
    '; - print '
    '; - if ($action == 'editlogin') - { - /*$include=array(); - if (empty($user->rights->user->user->creer)) // If can edit only itself user, we can link to itself only - { - $include=array($object->user_id,$user->id); - }*/ - $form->form_users($_SERVER['PHP_SELF'].'?rowid='.$object->id,$object->user_id,'userid',''); - } - else - { - if ($object->user_id) - { - $form->form_users($_SERVER['PHP_SELF'].'?rowid='.$object->id,$object->user_id,'none'); - } - else print $langs->trans("NoDolibarrAccess"); - } - print '
    \n"; - print '
    '; + print "
    \n"; + print '
    '; dol_fiche_end(); diff --git a/htdocs/adherents/document.php b/htdocs/adherents/document.php index 71f1df229379b..4dd5fd9bf649d 100644 --- a/htdocs/adherents/document.php +++ b/htdocs/adherents/document.php @@ -83,6 +83,7 @@ * View */ +$form = new Form($db); llxHeader(); @@ -91,19 +92,7 @@ $result=$membert->fetch($object->typeid); if ($result > 0) { - /* - * Affichage onglets - */ - if (! empty($conf->notification->enabled)) - $langs->load("mails"); - - $head = member_prepare_head($object); - - $form=new Form($db); - - dol_fiche_head($head, 'document', $langs->trans("Member"),0,'user'); - - + // Construit liste des fichiers $filearray=dol_dir_list($upload_dir,"files",0,'','(\.meta|_preview\.png)$',$sortfield,(strtolower($sortorder)=='desc'?SORT_DESC:SORT_ASC),1); $totalsize=0; @@ -111,34 +100,41 @@ { $totalsize+=$file['size']; } + + if (! empty($conf->notification->enabled)) + $langs->load("mails"); + $head = member_prepare_head($object); - print ''; + dol_fiche_head($head, 'document', $langs->trans("Member"),0,'user'); - $linkback = ''.$langs->trans("BackToList").''; + $linkback = ''.$langs->trans("BackToList").''; + + dol_banner_tab($object, 'rowid', $linkback); + + print '
    '; + + print '
    '; + print '
    '; - // Ref - print ''; - print ''; + $linkback = ''.$langs->trans("BackToList").''; // Login if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) { - print ''; + print ''; } + // Type + print '\n"; + // Morphy - print ''; + print ''; /*print '';*/ print ''; - // Type - print '\n"; - // Company print ''; @@ -146,17 +142,6 @@ print ''; print ''; - // Lastname - print ''; - print ''; - - // Firstname - print ''; - print ''; - - // Status - print ''; - // Nbre fichiers print ''; @@ -166,6 +151,8 @@ print '
    '.$langs->trans("Ref").''; - print $form->showrefnav($object, 'rowid', $linkback); - print '
    '.$langs->trans("Login").' / '.$langs->trans("Id").''.$object->login.' 
    '.$langs->trans("Login").' / '.$langs->trans("Id").''.$object->login.' 
    '.$langs->trans("Type").''.$membert->getNomUrl(1)."
    '.$langs->trans("Nature").''.$object->getmorphylib().'
    '.$langs->trans("Nature").''.$object->getmorphylib().''; print $form->showphoto('memberphoto',$object); print '
    '.$langs->trans("Type").''.$membert->getNomUrl(1)."
    '.$langs->trans("Company").''.$object->societe.'
    '.$langs->trans("UserTitle").''.$object->getCivilityLabel().' 
    '.$langs->trans("Lastname").''.$object->lastname.' 
    '.$langs->trans("Firstname").''.$object->firstname.' 
    '.$langs->trans("Status").''.$object->getLibStatut(4).'
    '.$langs->trans("NbOfAttachedFiles").''.count($filearray).'
    '; print ''; + + dol_fiche_end(); $modulepart = 'member'; $permission = $user->rights->adherent->creer; diff --git a/htdocs/adherents/fiche_subscription.php b/htdocs/adherents/fiche_subscription.php index 6f0177d4b6f03..6b980a4df1cec 100644 --- a/htdocs/adherents/fiche_subscription.php +++ b/htdocs/adherents/fiche_subscription.php @@ -180,18 +180,24 @@ $head[$h][2] = 'info'; $h++; - dol_fiche_head($head, 'general', $langs->trans("Subscription"), 0, 'payment'); - - print "\n"; print '
    '; print ''; print ""; print ""; print "fk_bank."\">"; + + dol_fiche_head($head, 'general', $langs->trans("Subscription"), 0, 'payment'); + + print "\n"; print ''; + $linkback = ''.$langs->trans("BackToList").''; + // Ref - print ''; + print ''; + print ''; // Member $adh->ref=$adh->getFullName($langs); @@ -239,18 +245,18 @@ } } - print '
    '.$langs->trans("Ref").''.$subscription->ref.' 
    '.$langs->trans("Ref").''; + print $form->showrefnav($subscription, 'rowid', $linkback, 1); + print '
    '; - print ''; + print '
    '; + + dol_fiche_end(); + + print '
    '; + print ''; print '       '; print ''; - print ''; - - print ''; + print '
    '; + print '
    '; print "\n"; - - print ''; - print "\n"; } if ($rowid && $action != 'edit') @@ -355,8 +361,7 @@ print "\n"; print ''; - print "\n"; - + dol_fiche_end(); /* * Barre d'actions @@ -388,6 +393,6 @@ } -$db->close(); - llxFooter(); + +$db->close(); diff --git a/htdocs/adherents/info.php b/htdocs/adherents/info.php index 27f36e9a8430d..36ed504dd73fc 100644 --- a/htdocs/adherents/info.php +++ b/htdocs/adherents/info.php @@ -42,23 +42,34 @@ * View */ +$form = new Form($db); + llxHeader('',$langs->trans("Member"),'EN:Module_Foundations|FR:Module_Adhérents|ES:Módulo_Miembros'); -$adh = new Adherent($db); -$adh->fetch($id); -$adh->info($id); +$object = new Adherent($db); +$object->fetch($id); +$object->info($id); -$head = member_prepare_head($adh); +$head = member_prepare_head($object); dol_fiche_head($head, 'info', $langs->trans("Member"), 0, 'user'); -print '
    '; -dol_print_object_info($adh); -print '
    '; +$linkback = ''.$langs->trans("BackToList").''; + +dol_banner_tab($object, 'rowid', $linkback); + +print '
    '; + +print '
    '; + +print '
    '; +dol_print_object_info($object); print '
    '; +dol_fiche_end(); + llxFooter(); $db->close(); diff --git a/htdocs/adherents/ldap.php b/htdocs/adherents/ldap.php index 89572525c32d9..a2848b655b383 100644 --- a/htdocs/adherents/ldap.php +++ b/htdocs/adherents/ldap.php @@ -44,12 +44,11 @@ $socid = $user->societe_id; } -$adh = new Adherent($db); -$adh->id = $rowid; -$result=$adh->fetch($rowid); +$object = new Adherent($db); +$result=$object->fetch($rowid); if (! $result) { - dol_print_error($db,"Failed to get adherent: ".$adh->error); + dol_print_error($db,"Failed to get adherent: ".$object->error); exit; } @@ -65,8 +64,8 @@ $ldap=new Ldap(); $result=$ldap->connect_bind(); - $info=$adh->_load_ldap_info(); - $dn=$adh->_load_ldap_dn($info); + $info=$object->_load_ldap_info(); + $dn=$object->_load_ldap_dn($info); $olddn=$dn; // We can say that old dn = dn as we force synchro $result=$ldap->update($dn,$info,$user,$olddn); @@ -93,35 +92,27 @@ $form = new Form($db); -$head = member_prepare_head($adh); +$head = member_prepare_head($object); dol_fiche_head($head, 'ldap', $langs->trans("Member"), 0, 'user'); +$linkback = ''.$langs->trans("BackToList").''; -print ''; +dol_banner_tab($object, 'rowid', $linkback); -// Ref -print ''; -print ''; +print '
    '; -// Lastname -print '
    '; -print ''; - -// Firstname -print ''; -print ''; +print '
    '; +print '
    '.$langs->trans("Ref").''; -print $form->showrefnav($adh,'id'); -print '
    '.$langs->trans("Lastname").''.$adh->lastname.' 
    '.$langs->trans("Firstname").''.$adh->firstname.' 
    '; // Login -print ''; +print ''; // Password not crypted if (! empty($conf->global->LDAP_MEMBER_FIELD_PASSWORD)) { print ''; - print ''; + print ''; print "\n"; } @@ -129,12 +120,12 @@ if (! empty($conf->global->LDAP_MEMBER_FIELD_PASSWORD_CRYPTED)) { print ''; - print ''; + print ''; print "\n"; } // Type -print '\n"; +print '\n"; $langs->load("admin"); @@ -155,6 +146,8 @@ print ''; +dol_fiche_end(); + /* * Barre d'actions */ @@ -163,7 +156,7 @@ if (! empty($conf->global->LDAP_MEMBER_ACTIVE) && $conf->global->LDAP_MEMBER_ACTIVE != 'ldap2dolibarr') { - print ''; + print ''; } print "\n"; @@ -187,9 +180,9 @@ $result=$ldap->connect_bind(); if ($result > 0) { - $info=$adh->_load_ldap_info(); - $dn=$adh->_load_ldap_dn($info,1); - $search = "(".$adh->_load_ldap_dn($info,2).")"; + $info=$object->_load_ldap_info(); + $dn=$object->_load_ldap_dn($info,1); + $search = "(".$object->_load_ldap_dn($info,2).")"; if (empty($dn)) { diff --git a/htdocs/adherents/note.php b/htdocs/adherents/note.php index 79b7db086e6d0..a895d6cfef839 100644 --- a/htdocs/adherents/note.php +++ b/htdocs/adherents/note.php @@ -73,33 +73,31 @@ print ""; print ''; - print '
    '.$langs->trans("Login").''.$adh->login.' 
    '.$langs->trans("Login").''.$object->login.' 
    '.$langs->trans("LDAPFieldPasswordNotCrypted").''.$adh->pass.''.$object->pass.'
    '.$langs->trans("LDAPFieldPasswordCrypted").''.$adh->pass_crypted.''.$object->pass_crypted.'
    '.$langs->trans("Type").''.$adh->type."
    '.$langs->trans("Type").''.$object->type."
    '; - - $linkback = ''.$langs->trans("BackToList").''; - - // Reference - print ''; - print ''; - print ''; + $linkback = ''.$langs->trans("BackToList").''; + + dol_banner_tab($object, 'rowid', $linkback); + + print '
    '; + + print '
    '; + print '
    '.$langs->trans('Ref').''; - print $form->showrefnav($object, 'id', $linkback); - print '
    '; // Login if (empty($conf->global->ADHERENT_LOGIN_NOT_REQUIRED)) { - print ''; + print ''; } + // Type + print '\n"; + // Morphy - print ''; + print ''; /*print '';*/ print ''; - // Type - print '\n"; - // Company print ''; @@ -107,21 +105,13 @@ print ''; print ''; - // Lastname - print ''; - print ''; - - // Firstname - print ''; - - // Status - print ''; - print "
    '.$langs->trans("Login").' / '.$langs->trans("Id").''.$object->login.' 
    '.$langs->trans("Login").' / '.$langs->trans("Id").''.$object->login.' 
    '.$langs->trans("Type").''.$adht->getNomUrl(1)."
    '.$langs->trans("Nature").''.$object->getmorphylib().'
    '.$langs->trans("Nature").''.$object->getmorphylib().''; print $form->showphoto('memberphoto',$member); print '
    '.$langs->trans("Type").''.$adht->getNomUrl(1)."
    '.$langs->trans("Company").''.$object->societe.'
    '.$langs->trans("UserTitle").''.$object->getCivilityLabel().' 
    '.$langs->trans("Lastname").''.$object->lastname.' 
    '.$langs->trans("Firstname").''.$object->firstname.' 
    '.$langs->trans("Status").''.$object->getLibStatut(4).'
    "; + + print ''; print '
    '; - $colwidth='20'; + $cssclass='titlefield'; $permission = $user->rights->adherent->creer; // Used by the include of notes.tpl.php include DOL_DOCUMENT_ROOT.'/core/tpl/notes.tpl.php'; diff --git a/htdocs/contact/document.php b/htdocs/contact/document.php index 62822a976904f..6cf3daf5caddb 100644 --- a/htdocs/contact/document.php +++ b/htdocs/contact/document.php @@ -95,6 +95,8 @@ $totalsize+=$file['size']; } + $linkback = ''.$langs->trans("BackToList").''; + dol_banner_tab($object, 'id', $linkback, 1, 'rowid', 'ref', ''); print '
    '; diff --git a/htdocs/core/class/html.form.class.php b/htdocs/core/class/html.form.class.php index bc1bdf7e790e9..6b541760a55af 100644 --- a/htdocs/core/class/html.form.class.php +++ b/htdocs/core/class/html.form.class.php @@ -5265,9 +5265,9 @@ static function showphoto($modulepart, $object, $width=100, $height=0, $caneditf $dir=$conf->societe->multidir_output[$entity]; $smallfile=$object->logo; $smallfile=preg_replace('/(\.png|\.gif|\.jpg|\.jpeg|\.bmp)/i','_small\\1',$smallfile); - if ($object->logo) $file=$id.'/logos/thumbs/'.$smallfile; + if (! empty($object->logo)) $file=$id.'/logos/thumbs/'.$smallfile; } - if ($modulepart=='contact') + else if ($modulepart=='contact') { $dir=$conf->societe->multidir_output[$entity].'/contact'; $file=$id.'/photos/'.$object->photo; @@ -5275,19 +5275,19 @@ static function showphoto($modulepart, $object, $width=100, $height=0, $caneditf else if ($modulepart=='userphoto') { $dir=$conf->user->dir_output; - if ($object->photo) $file=get_exdir($id, 2, 0, 0, $object, 'user').$object->photo; + if (! empty($object->photo)) $file=get_exdir($id, 2, 0, 0, $object, 'user').$object->photo; if (! empty($conf->global->MAIN_OLD_IMAGE_LINKS)) $altfile=$object->id.".jpg"; // For backward compatibility $email=$object->email; } else if ($modulepart=='memberphoto') { $dir=$conf->adherent->dir_output; - if ($object->photo) $file=get_exdir($id, 2, 0, 0, $object, 'invoice_supplier').'photos/'.$object->photo; + if (! empty($object->photo)) $file=get_exdir($id, 2, 0, 0, $object, 'invoice_supplier').'photos/'.$object->photo; if (! empty($conf->global->MAIN_OLD_IMAGE_LINKS)) $altfile=$object->id.".jpg"; // For backward compatibility $email=$object->email; } else { $dir=$conf->$modulepart->dir_output; - if ($object->photo) $file=get_exdir($id, 2, 0, 0, $adherent, 'member').'photos/'.$object->photo; + if (! empty($object->photo)) $file=get_exdir($id, 2, 0, 0, $object, 'member').'photos/'.$object->photo; if (! empty($conf->global->MAIN_OLD_IMAGE_LINKS)) $altfile=$object->id.".jpg"; // For backward compatibility $email=$object->email; } From d1d6c72d7d6fc96356cec4c33f765e0f3f69dec3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 16 Oct 2015 22:21:26 +0200 Subject: [PATCH 140/297] NEW Uniformize way of working for search filters. One filter per object. --- htdocs/compta/index.php | 66 +++++++++++++--------------------- htdocs/contact/list.php | 7 ++-- htdocs/core/search.php | 33 +++++++++++++++++ htdocs/core/search_page.php | 8 ++--- htdocs/don/list.php | 10 ++++-- htdocs/main.inc.php | 14 ++++---- htdocs/product/index.php | 43 +++++++++++----------- htdocs/product/list.php | 1 + htdocs/societe/index.php | 71 ++++++++++++++++--------------------- htdocs/societe/list.php | 62 +++++++++++++------------------- 10 files changed, 159 insertions(+), 156 deletions(-) diff --git a/htdocs/compta/index.php b/htdocs/compta/index.php index 59ed9afc50426..076b6a9b209b4 100644 --- a/htdocs/compta/index.php +++ b/htdocs/compta/index.php @@ -90,56 +90,40 @@ $max=3; -/* - * Search invoices - */ +// Search customer invoices if (! empty($conf->facture->enabled) && $user->rights->facture->lire) { - print ''; - print ''; - print ''; - print ""; - print ''; - print "'; - print ''; - print "'; - print ''; - print "
    '.$langs->trans("SearchACustomerInvoice").'
    :
    :

    "; + $listofsearchfields['search_invoice']=array('text'=>'CustomerInvoice'); } - -/* - * Search supplier invoices - */ +// Search supplier invoices if (! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->lire) { - print '
    '; - print ''; - print ''; - print ''; - print ""; - print "'; - print ''; - print "'; - print ''; - print "
    '.$langs->trans("SearchASupplierInvoice").'
    :
    :

    "; + $listofsearchfields['search_supplier_invoice']=array('text'=>'SupplierInvoice'); } - -/* - * Search donations - */ if (! empty($conf->don->enabled) && $user->rights->don->lire) { $langs->load("donations"); - print '
    '; - print ''; - print ''; - print ''; - print ""; - print "'; - print ''; - //print "'; - print ''; - print "
    '.$langs->trans("SearchADonation").'
    :
    :

    "; + $listofsearchfields['search_donation']=array('text'=>'Donation'); +} + +if (count($listofsearchfields)) +{ + print '
    '; + print ''; + print ''; + $i=0; + foreach($listofsearchfields as $key => $value) + { + if ($i == 0) print ''; + print ''; + print ''; + if ($i == 0) print ''; + print ''; + $i++; + } + print '
    '.$langs->trans("Search").'
    :
    '; + print '
    '; + print '
    '; } /** diff --git a/htdocs/contact/list.php b/htdocs/contact/list.php index 4082ebbae8086..51c834522c8b2 100644 --- a/htdocs/contact/list.php +++ b/htdocs/contact/list.php @@ -40,6 +40,7 @@ if ($user->societe_id) $socid=$user->societe_id; $result = restrictedArea($user, 'contact', $contactid,''); +$sall=GETPOST("sall"); $search_firstlast_only=GETPOST("search_firstlast_only"); $search_lastname=GETPOST("search_lastname"); $search_firstname=GETPOST("search_firstname"); @@ -56,13 +57,13 @@ $search_categ=GETPOST("search_categ",'int'); $search_status=GETPOST("search_status",'int'); if ($search_status=='') $search_status=1; // always display activ customer first + $optioncss = GETPOST('optioncss','alpha'); $type=GETPOST("type"); $view=GETPOST("view"); -$sall=GETPOST("contactname"); $sortfield = GETPOST('sortfield', 'alpha'); $sortorder = GETPOST('sortorder', 'alpha'); $page = GETPOST('page', 'int'); @@ -98,8 +99,9 @@ $urlfiche=""; } -if (GETPOST('button_removefilter_x') || GETPOST('button_removefilter')) // Both tests are required to be compatible with all browsers +if (GETPOST('button_removefilter_x') || GETPOST('button_removefilter.x') || GETPOST('button_removefilter')) // All tests are required to be compatible with all browsers { + $sall=""; $search_firstlast_only=""; $search_lastname=""; $search_firstname=""; @@ -113,7 +115,6 @@ $search_email=""; $search_skype=""; $search_priv=""; - $sall=""; $seach_status=1; } if ($search_priv < 0) $search_priv=''; diff --git a/htdocs/core/search.php b/htdocs/core/search.php index 6dd5d46c72f8c..5413ae0d16250 100644 --- a/htdocs/core/search.php +++ b/htdocs/core/search.php @@ -64,7 +64,40 @@ header("Location: ".DOL_URL_ROOT.'/contrat/list.php?sall='.urlencode(GETPOST('search_contract'))); exit; } +if (GETPOST('search_invoice') != '') +{ + header("Location: ".DOL_URL_ROOT.'/compta/facture/list.php?sall='.urlencode(GETPOST('search_invoice'))); + exit; +} +if (GETPOST('search_supplier_invoice') != '') +{ + header("Location: ".DOL_URL_ROOT.'/fourn/facture/list.php?sall='.urlencode(GETPOST('search_supplier_invoice'))); + exit; +} +if (GETPOST('search_donation') != '') +{ + header("Location: ".DOL_URL_ROOT.'/don/list.php?sall='.urlencode(GETPOST('search_donation'))); + exit; +} +if (GETPOST('search_product') != '') +{ + header("Location: ".DOL_URL_ROOT.'/product/list.php?sall='.urlencode(GETPOST('search_product'))); + exit; +} +if (GETPOST('search_thirdparty') != '') +{ + header("Location: ".DOL_URL_ROOT.'/societe/list.php?mode=search&sall='.urlencode(GETPOST('search_thirdparty'))); + exit; +} +if (GETPOST('search_contact') != '') +{ + header("Location: ".DOL_URL_ROOT.'/contact/list.php?mode=search&sall='.urlencode(GETPOST('search_contact'))); + exit; +} + + + // If we are here, search was called with no supported criteria if (! empty($_SERVER['HTTP_REFERER'])) { diff --git a/htdocs/core/search_page.php b/htdocs/core/search_page.php index dc90a7c38531e..fa63a9e9c0652 100644 --- a/htdocs/core/search_page.php +++ b/htdocs/core/search_page.php @@ -70,14 +70,14 @@ if ((( ! empty($conf->societe->enabled) && (empty($conf->global->SOCIETE_DISABLE_PROSPECTS) || empty($conf->global->SOCIETE_DISABLE_CUSTOMERS))) || ! empty($conf->fournisseur->enabled)) && ! empty($conf->global->MAIN_SEARCHFORM_SOCIETE) && $user->rights->societe->lire) { $langs->load("companies"); - $searchform.=printSearchForm(DOL_URL_ROOT.'/societe/list.php', DOL_URL_ROOT.'/societe/list.php', img_object('','company').' '.$langs->trans("ThirdParties"), 'soc', 'socname'); + $searchform.=printSearchForm(DOL_URL_ROOT.'/societe/list.php', DOL_URL_ROOT.'/societe/list.php', img_object('','company').' '.$langs->trans("ThirdParties"), 'soc', 'sall', '', 'company'); $nbofsearch++; } if (! empty($conf->societe->enabled) && ! empty($conf->global->MAIN_SEARCHFORM_CONTACT) && $user->rights->societe->lire) { $langs->load("companies"); - $searchform.=printSearchForm(DOL_URL_ROOT.'/contact/list.php', DOL_URL_ROOT.'/contact/list.php', img_object('','contact').' '.$langs->trans("Contacts"), 'contact', 'contactname'); + $searchform.=printSearchForm(DOL_URL_ROOT.'/contact/list.php', DOL_URL_ROOT.'/contact/list.php', img_object('','contact').' '.$langs->trans("Contacts"), 'contact', 'sall', '', 'contact'); $nbofsearch++; } @@ -85,7 +85,7 @@ && ! empty($conf->global->MAIN_SEARCHFORM_PRODUITSERVICE)) { $langs->load("products"); - $searchform.=printSearchForm(DOL_URL_ROOT.'/product/list.php', DOL_URL_ROOT.'/product/list.php', img_object('','product').' '.$langs->trans("Products")."/".$langs->trans("Services"), 'products', 'sall', '', 'sall'.rand(0,10)); + $searchform.=printSearchForm(DOL_URL_ROOT.'/product/list.php', DOL_URL_ROOT.'/product/list.php', img_object('','product').' '.$langs->trans("Products")."/".$langs->trans("Services"), 'products', 'sall', '', 'product'); $nbofsearch++; } @@ -100,7 +100,7 @@ if (! empty($conf->adherent->enabled) && ! empty($conf->global->MAIN_SEARCHFORM_ADHERENT) && $user->rights->adherent->lire) { $langs->load("members"); - $searchform.=printSearchForm(DOL_URL_ROOT.'/adherents/list.php', DOL_URL_ROOT.'/adherents/list.php', img_object('','user').' '.$langs->trans("Members"), 'member', 'sall', 'sall'.rand(0,10)); + $searchform.=printSearchForm(DOL_URL_ROOT.'/adherents/list.php', DOL_URL_ROOT.'/adherents/list.php', img_object('','user').' '.$langs->trans("Members"), 'member', 'sall', '', 'member'); $nbofsearch++; } diff --git a/htdocs/don/list.php b/htdocs/don/list.php index 55b7d9377a30f..9227b1a26eb51 100644 --- a/htdocs/don/list.php +++ b/htdocs/don/list.php @@ -43,6 +43,7 @@ $limit = $conf->liste_limit; $statut=isset($_GET["statut"])?$_GET["statut"]:"-1"; +$search_all=GETPOST('sall','alpha'); $search_ref=GETPOST('search_ref','alpha'); $search_company=GETPOST('search_company','alpha'); $search_name=GETPOST('search_name','alpha'); @@ -51,9 +52,10 @@ if (!$user->rights->don->lire) accessforbidden(); -if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers +if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers { - $search_ref=""; + $search_all=""; + $search_ref=""; $search_company=""; $search_name=""; $search_amount=""; @@ -83,6 +85,10 @@ { $sql.= ' AND d.rowid LIKE \'%'.$db->escape(trim($search_ref)) . '%\''; } +if (trim($search_all) != '') +{ + $sql .= natural_search(array('d.rowid', 'd.ref', 'd.lastname', 'd.firstname', 'd.societe'), $search_all); +} if (trim($search_company) != '') { $sql .= natural_search('d.societe', $search_company); diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index 638ddbc91a491..9e6869f730246 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1575,13 +1575,13 @@ function left_menu($menu_array_before, $helppagename='', $moresearchform='', $me if ((( ! empty($conf->societe->enabled) && (empty($conf->global->SOCIETE_DISABLE_PROSPECTS) || empty($conf->global->SOCIETE_DISABLE_CUSTOMERS))) || ! empty($conf->fournisseur->enabled)) && ! empty($conf->global->MAIN_SEARCHFORM_SOCIETE) && $user->rights->societe->lire) { $langs->load("companies"); - $searchform.=printSearchForm(DOL_URL_ROOT.'/societe/list.php', DOL_URL_ROOT.'/societe/list.php', $langs->trans("ThirdParties"), 'soc', 'socname', 'T', 'searchleftt', img_object('','company')); + $searchform.=printSearchForm(DOL_URL_ROOT.'/societe/list.php', DOL_URL_ROOT.'/societe/list.php', $langs->trans("ThirdParties"), 'soc', 'sall', 'T', 'searchleftt', img_object('','company')); } if (! empty($conf->societe->enabled) && ! empty($conf->global->MAIN_SEARCHFORM_CONTACT) && $user->rights->societe->lire) { $langs->load("companies"); - $searchform.=printSearchForm(DOL_URL_ROOT.'/contact/list.php', DOL_URL_ROOT.'/contact/list.php', $langs->trans("Contacts"), 'contact', 'contactname', '', 'searchleftc', img_object('','contact')); + $searchform.=printSearchForm(DOL_URL_ROOT.'/contact/list.php', DOL_URL_ROOT.'/contact/list.php', $langs->trans("Contacts"), 'contact', 'sall', 'A', 'searchleftc', img_object('','contact')); } if (((! empty($conf->product->enabled) && $user->rights->produit->lire) || (! empty($conf->service->enabled) && $user->rights->service->lire)) @@ -1607,7 +1607,7 @@ function left_menu($menu_array_before, $helppagename='', $moresearchform='', $me if (! empty($conf->projet->enabled) && ! empty($conf->global->MAIN_SEARCHFORM_PROJECT) && $user->rights->projet->lire) { $langs->load("members"); - $searchform.=printSearchForm(DOL_URL_ROOT.'/projet/list.php', DOL_URL_ROOT.'/projet/list.php', $langs->trans("Projects"), 'project', 'search_all', 'M', 'searchleftproj', img_object('','projectpub')); + $searchform.=printSearchForm(DOL_URL_ROOT.'/projet/list.php', DOL_URL_ROOT.'/projet/list.php', $langs->trans("Projects"), 'project', 'search_all', 'Q', 'searchleftproj', img_object('','projectpub')); } // Execute hook printSearchForm @@ -1851,11 +1851,11 @@ function getHelpParamFor($helppagename,$langs) * @param string $htmlmodesearch Value to set into parameter "mode_search" ('soc','contact','products','member',...) * @param string $htmlinputname Field Name input form * @param string $accesskey Accesskey - * @param string $idname Complement for id to avoid multiple same id in the page + * @param string $prefhtmlinputname Complement for id to avoid multiple same id in the page * @param string $img Image to use * @return string */ -function printSearchForm($urlaction,$urlobject,$title,$htmlmodesearch,$htmlinputname,$accesskey='', $idname='',$img='') +function printSearchForm($urlaction,$urlobject,$title,$htmlmodesearch,$htmlinputname,$accesskey='', $prefhtmlinputname='',$img='') { global $conf,$langs; @@ -1868,7 +1868,7 @@ function printSearchForm($urlaction,$urlobject,$title,$htmlmodesearch,$htmlinput $ret.=''; + $out .= '
    '; $out .= '
    '; $parameters = array('socid'=>(isset($GLOBALS['socid'])?$GLOBALS['socid']:''),'id'=>(isset($GLOBALS['id'])?$GLOBALS['id']:''), 'url'=>$url, 'perm'=>$perm); $res = $hookmanager->executeHooks('formattachOptions',$parameters,$object); @@ -492,7 +494,7 @@ function showdocuments($modulepart,$modulesubdir,$filedir,$urlsource,$genallowed $out.= ''; $out.= ''; - $out.= '
    '.$titletoshow.'
    '; + $out.= load_fiche_titre($titletoshow, '', ''); $out.= ''; $out.= ''; diff --git a/htdocs/expedition/card.php b/htdocs/expedition/card.php index 91c570a39a721..3ca2c18bf6c3d 100644 --- a/htdocs/expedition/card.php +++ b/htdocs/expedition/card.php @@ -520,7 +520,7 @@ dol_fiche_head(''); - print '
    '; + print '
    '; // Ref print ''; } diff --git a/htdocs/societe/price.php b/htdocs/societe/price.php index fd41c276bf2f6..e5f89779225cb 100644 --- a/htdocs/societe/price.php +++ b/htdocs/societe/price.php @@ -447,8 +447,6 @@ print_barre_liste($langs->trans('PriceForEachProduct'), $page, $_SERVEUR ['PHP_SELF'], $option, $sortfield, $sortorder, '', count($prodcustprice->lines), $nbtotalofrecords); - if (count($prodcustprice->lines) > 0) { - print ''; print ''; @@ -467,6 +465,8 @@ print ''; print ''; + if (count($prodcustprice->lines) > 0) { + print ''; print ''; print ''; @@ -522,13 +522,14 @@ print "\n"; } - print "
    '; @@ -662,6 +662,8 @@ print '
    '; + + print ''; @@ -1533,9 +1535,9 @@ */ if ($action != 'presend') { - print '
    '; - - $objectref = dol_sanitizeFileName($object->ref); + print '
    '; + + $objectref = dol_sanitizeFileName($object->ref); $filedir = $conf->expedition->dir_output . "/sending/" .$objectref; $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id; @@ -1552,14 +1554,14 @@ //$linktoelem = $form->showLinkToObjectBlock($object); //if ($linktoelem) print '
    '.$linktoelem; - print '
    '; + print '
    '; // List of actions on element include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php'; $formactions=new FormActions($db); $somethingshown=$formactions->showactions($object,'shipping',$socid); - print '
    '; + print ''; } /* diff --git a/htdocs/langs/en_US/products.lang b/htdocs/langs/en_US/products.lang index 6dcf4ce60f9b6..e108dfff52b86 100644 --- a/htdocs/langs/en_US/products.lang +++ b/htdocs/langs/en_US/products.lang @@ -105,6 +105,7 @@ AddPhoto=Add photo ListOfStockMovements=List of stock movements BuyingPrice=Buying price PriceForEachProduct=Products with specific prices +NoPriceSpecificToCustomer=This customer has no specific prices. All standard prices for products/services will be used. SupplierCard=Supplier card CommercialCard=Commercial card AllWays=Path to find your product in stock @@ -298,6 +299,6 @@ LastUpdated=Last updated CorrectlyUpdated=Correctly updated PropalMergePdfProductActualFile=Files use to add into PDF Azur are/is PropalMergePdfProductChooseFile=Select PDF files -IncludingProductWithTag=Including product with tag +IncludingProductWithTag=Including product/service with tag DefaultPriceRealPriceMayDependOnCustomer=Default price, real price may depend on customer WarningSelectOneDocument=Please select at least one document diff --git a/htdocs/product/document.php b/htdocs/product/document.php index cb174e5847eee..df1afe1db930a 100644 --- a/htdocs/product/document.php +++ b/htdocs/product/document.php @@ -216,7 +216,7 @@ include_once DOL_DOCUMENT_ROOT . '/core/tpl/document_actions_post_headers.tpl.php'; - // Merge propal PDF docuemnt PDF files + // Merge propal PDF document PDF files if (!empty($conf->global->PRODUIT_PDF_MERGE_PROPAL)) { $filetomerge = new Propalmergepdfproduct($db); @@ -233,7 +233,8 @@ $filearray = dol_dir_list($upload_dir, "files", 0, '', '\.meta$', 'name', SORT_ASC, 1); // For each file build select list with PDF extention - if (count($filearray) > 0) { + if (count($filearray) > 0) + { print '
    '; // Actual file to merge is : if (count($filetomerge->lines) > 0) { @@ -315,19 +316,23 @@ $checked = ''; $filename = $filetoadd['name']; - if ($conf->global->MAIN_MULTILANGS) { - if (array_key_exists($filetoadd['name'] . '_' . $delauft_lang, $filetomerge->lines)) { + if ($conf->global->MAIN_MULTILANGS) + { + if (array_key_exists($filetoadd['name'] . '_' . $delauft_lang, $filetomerge->lines)) + { $filename = $filetoadd['name'] . ' - ' . $langs->trans('Language_' . $delauft_lang); $checked = ' checked '; } - } else { - if (array_key_exists($filetoadd['name'], $filetomerge->lines)) { + } + else + { + if (array_key_exists($filetoadd['name'], $filetomerge->lines)) + { $checked = ' checked '; } } print '
    '; - print '' . $filename . ''; print '
     
     
    "; - - print ""; } else { - print $langs->trans('None'); + print ''.$langs->trans('NoPriceSpecificToCustomer').''; } + print ""; + + print ""; + /* ************************************************************************** */ /* */ /* Barre d'action */ From 1000fd1b2150bd5a74fb63042debc94bbc423ba3 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Oct 2015 19:43:50 +0200 Subject: [PATCH 240/297] Add field employee for hr module --- htdocs/install/mysql/migration/3.8.0-3.9.0.sql | 4 ++++ htdocs/install/mysql/tables/llx_user.sql | 1 + 2 files changed, 5 insertions(+) diff --git a/htdocs/install/mysql/migration/3.8.0-3.9.0.sql b/htdocs/install/mysql/migration/3.8.0-3.9.0.sql index 670177d1e553d..775a67b27fa2c 100755 --- a/htdocs/install/mysql/migration/3.8.0-3.9.0.sql +++ b/htdocs/install/mysql/migration/3.8.0-3.9.0.sql @@ -100,3 +100,7 @@ ALTER TABLE llx_ecm_files ADD UNIQUE INDEX uk_ecm_files (label, entity); ALTER TABLE llx_product ADD COLUMN onportal tinyint DEFAULT 0 after tobuy; + + +ALTER TABLE llx_user ADD COLUMN employee tinyint DEFAULT 1; + diff --git a/htdocs/install/mysql/tables/llx_user.sql b/htdocs/install/mysql/tables/llx_user.sql index a11b0ec6b5076..47bbedb1fef2c 100644 --- a/htdocs/install/mysql/tables/llx_user.sql +++ b/htdocs/install/mysql/tables/llx_user.sql @@ -74,6 +74,7 @@ create table llx_user nb_holiday integer DEFAULT 0, thm double(24,8), tjm double(24,8), + employee tinyint DEFAULT 1, -- 1 if user is an employee salary double(24,8), salaryextra double(24,8), weeklyhours double(16,8) From 90a221ef6de9d0f1dcd374f1df5f281f322a20d6 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 22 Oct 2015 19:46:30 +0200 Subject: [PATCH 241/297] Fix version of module --- htdocs/core/modules/modHRM.class.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/htdocs/core/modules/modHRM.class.php b/htdocs/core/modules/modHRM.class.php index 16a0edd0c0443..1e82db5dfc4d8 100644 --- a/htdocs/core/modules/modHRM.class.php +++ b/htdocs/core/modules/modHRM.class.php @@ -23,8 +23,7 @@ include_once (DOL_DOCUMENT_ROOT . "/core/modules/DolibarrModules.class.php"); /** - * \class modHRM - * \brief Class to describe and activate the HRM module + * Class to describe and activate the HRM module */ class modHRM extends DolibarrModules { @@ -49,7 +48,7 @@ public function __construct($db) $this->description = "Gestion des ressources humaines"; // Possible values for version are: 'development', 'experimental', 'dolibarr' or version - $this->version = 'develop'; + $this->version = 'development'; $this->const_name = 'MAIN_MODULE_' . strtoupper ( $this->name ); $this->special = 0; From 3767ab437e6ba5cc126977ac5419ef818c4b5819 Mon Sep 17 00:00:00 2001 From: philippe grand Date: Fri, 23 Oct 2015 12:58:30 +0200 Subject: [PATCH 242/297] [Qual] Uniformize code --- htdocs/accountancy/bookkeeping/card.php | 26 +++++----- htdocs/accountancy/bookkeeping/list.php | 4 +- htdocs/accountancy/customer/card.php | 2 +- htdocs/accountancy/customer/index.php | 4 +- htdocs/accountancy/customer/lines.php | 6 +-- htdocs/accountancy/journal/bankjournal.php | 6 +-- .../accountancy/journal/purchasesjournal.php | 8 +-- htdocs/accountancy/journal/sellsjournal.php | 8 +-- htdocs/accountancy/supplier/card.php | 2 +- htdocs/accountancy/supplier/index.php | 4 +- htdocs/accountancy/supplier/lines.php | 6 +-- htdocs/adherents/admin/adherent.php | 6 +-- htdocs/adherents/admin/public.php | 4 +- htdocs/adherents/card.php | 50 +++++++++---------- htdocs/adherents/card_subscriptions.php | 6 +-- htdocs/adherents/ldap.php | 4 +- htdocs/admin/agenda.php | 4 +- htdocs/admin/agenda_extsites.php | 6 +-- htdocs/admin/agenda_xcal.php | 4 +- htdocs/admin/askpricesupplier.php | 28 +++++------ htdocs/admin/bank.php | 4 +- htdocs/admin/barcode.php | 8 +-- htdocs/admin/boxes.php | 4 +- htdocs/admin/clicktodial.php | 4 +- htdocs/admin/commande.php | 34 ++++++------- htdocs/admin/company.php | 12 ++--- htdocs/admin/compta.php | 6 +-- htdocs/admin/const.php | 8 +-- htdocs/admin/contract.php | 18 +++---- htdocs/admin/dict.php | 18 +++---- htdocs/admin/menus/edit.php | 14 +++--- htdocs/admin/menus/index.php | 4 +- htdocs/admin/tools/dolibarr_export.php | 4 +- htdocs/admin/tools/export.php | 10 ++-- htdocs/admin/tools/update.php | 14 +++--- 35 files changed, 175 insertions(+), 175 deletions(-) diff --git a/htdocs/accountancy/bookkeeping/card.php b/htdocs/accountancy/bookkeeping/card.php index d4c256dfbf236..0500ac4a0a756 100644 --- a/htdocs/accountancy/bookkeeping/card.php +++ b/htdocs/accountancy/bookkeeping/card.php @@ -52,7 +52,7 @@ $error = 0; if ((floatval($debit)!=0.0) && (floatval($credit)!=0.0)) { - setEventMessage($langs->trans('ErrorDebitCredit'), 'errors'); + setEventMessages($langs->trans('ErrorDebitCredit'), null, 'errors'); $error ++; } @@ -61,7 +61,7 @@ $result = $book->fetch($id); if ($result < 0) { - setEventMessage($book->errors, 'errors'); + setEventMessages($book->error, $book->errors, 'errors'); } else { $book->numero_compte = $numero_compte; $book->code_tiers = $code_tiers; @@ -80,9 +80,9 @@ $result = $book->update(); if ($result < 0) { - setEventMessage($book->errors, 'errors'); + setEventMessages($book->error, $book->errors, 'errors'); } else { - setEventMessage($langs->trans('Saved'), 'mesgs'); + setEventMessages($langs->trans('Saved'), null, 'mesgs'); $action = ''; } } @@ -93,7 +93,7 @@ $error = 0; if ((intval($debit) != 0) && (intval($credit) != 0)) { - setEventMessage($langs->trans('ErrorDebitCredit'), 'errors'); + setEventMessages($langs->trans('ErrorDebitCredit'), null, 'errors'); $error ++; } @@ -124,9 +124,9 @@ $result = $book->create_std($user); if ($result < 0) { - setEventMessage($book->errors, 'errors'); + setEventMessages($book->error, $book->errors, 'errors'); } else { - setEventMessage($langs->trans('Saved'), 'mesgs'); + setEventMessages($langs->trans('Saved'), null, 'mesgs'); $action = ''; } } @@ -140,11 +140,11 @@ $piece_num = $book->piece_num; if ($result < 0) { - setEventMessage($book->errors, 'errors'); + setEventMessages($book->error, $book->errors, 'errors'); } else { $result = $book->delete($user); if ($result < 0) { - setEventMessage($book->errors, 'errors'); + setEventMessages($book->error, $book->errors, 'errors'); } } $action = ''; @@ -168,9 +168,9 @@ $result = $book->create_std($user); if ($result < 0) { - setEventMessage($book->errors, 'errors'); + setEventMessages($book->error, $book->errors, 'errors'); } else { - setEventMessage($langs->trans('Saved'), 'mesgs'); + setEventMessages($langs->trans('Saved'), null, 'mesgs'); $action = ''; $piece_num = $book->piece_num; } @@ -246,7 +246,7 @@ $book = new BookKeeping($db); $result = $book->fetch_per_mvt($piece_num); if ($result < 0) { - setEventMessage($book->errors, 'errors'); + setEventMessages($book->error, $book->errors, 'errors'); } if (! empty($book->piece_num)) { @@ -277,7 +277,7 @@ $result = $book->fetch_all_per_mvt($piece_num); if ($result < 0) { - setEventMessage($book->errors, 'errors'); + setEventMessages($book->error, $book->errors, 'errors'); } else { print load_fiche_titre($langs->trans("ListeMvts")); diff --git a/htdocs/accountancy/bookkeeping/list.php b/htdocs/accountancy/bookkeeping/list.php index d9b6d66b503c2..b916432903108 100644 --- a/htdocs/accountancy/bookkeeping/list.php +++ b/htdocs/accountancy/bookkeeping/list.php @@ -74,7 +74,7 @@ $result = $object->delete_by_importkey($import_key); Header("Location: list.php"); if ($result < 0) { - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } } // Export @@ -86,7 +86,7 @@ $object = new BookKeeping($db); $result = $object->export_bookkeping('ebp'); if ($result < 0) { - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } foreach ( $object->linesexport as $line ) { diff --git a/htdocs/accountancy/customer/card.php b/htdocs/accountancy/customer/card.php index 09e8b24a8ea57..a3e179c1701f5 100644 --- a/htdocs/accountancy/customer/card.php +++ b/htdocs/accountancy/customer/card.php @@ -54,7 +54,7 @@ dol_syslog("/accounting/customer/card.php sql=" . $sql, LOG_DEBUG); $resql = $db->query($sql); if (! $resql) { - setEventMessage($db->lasterror(), 'errors'); + setEventMessages($db->lasterror(), null, 'errors'); } } else { header("Location: ./lines.php"); diff --git a/htdocs/accountancy/customer/index.php b/htdocs/accountancy/customer/index.php index ea37f23745565..5a6de05691a5d 100644 --- a/htdocs/accountancy/customer/index.php +++ b/htdocs/accountancy/customer/index.php @@ -83,10 +83,10 @@ if (! $resql1) { $error ++; $db->rollback(); - setEventMessage($db->lasterror(), 'errors'); + setEventMessages($db->lasterror(), null, 'errors'); } else { $db->commit(); - setEventMessage($langs->trans('Dispatched'), 'mesgs'); + setEventMessages($langs->trans('Dispatched'), null, 'mesgs'); } } diff --git a/htdocs/accountancy/customer/lines.php b/htdocs/accountancy/customer/lines.php index 01f34e700cc33..a505c91c1c78a 100644 --- a/htdocs/accountancy/customer/lines.php +++ b/htdocs/accountancy/customer/lines.php @@ -109,14 +109,14 @@ $resql1 = $db->query($sql1); if (! $resql1) { $error ++; - setEventMessage($db->lasterror(), 'errors'); + setEventMessages($db->lasterror(), null, 'errors'); } if (! $error) { $db->commit(); - setEventMessage($langs->trans('Save'), 'mesgs'); + setEventMessages($langs->trans('Save'), null, 'mesgs'); } else { $db->rollback(); - setEventMessage($db->lasterror(), 'errors'); + setEventMessages($db->lasterror(), null, 'errors'); } } diff --git a/htdocs/accountancy/journal/bankjournal.php b/htdocs/accountancy/journal/bankjournal.php index 01957fcedf523..cd0c5d06ce50a 100644 --- a/htdocs/accountancy/journal/bankjournal.php +++ b/htdocs/accountancy/journal/bankjournal.php @@ -343,7 +343,7 @@ $result = $bookkeeping->create(); if ($result < 0) { $error ++; - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } // Third party @@ -420,13 +420,13 @@ $result = $bookkeeping->create(); if ($result < 0) { $error ++; - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } } if (empty($error)) { - setEventMessage($langs->trans("GeneralLedgerIsWritten"),'mesgs'); + setEventMessages($langs->trans("GeneralLedgerIsWritten"), null, 'mesgs'); } } // Export diff --git a/htdocs/accountancy/journal/purchasesjournal.php b/htdocs/accountancy/journal/purchasesjournal.php index 28b2dc736b6f4..538edaa471ddf 100644 --- a/htdocs/accountancy/journal/purchasesjournal.php +++ b/htdocs/accountancy/journal/purchasesjournal.php @@ -185,7 +185,7 @@ $result = $bookkeeping->create(); if ($result < 0) { $error ++; - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } @@ -215,7 +215,7 @@ $result = $bookkeeping->create(); if ($result < 0) { $error ++; - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } } @@ -246,14 +246,14 @@ $result = $bookkeeping->create(); if ($result < 0) { $error ++; - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } } } if (empty($error)) { - setEventMessage($langs->trans("GeneralLedgerIsWritten"),'mesgs'); + setEventMessages($langs->trans("GeneralLedgerIsWritten"), null, 'mesgs'); } } diff --git a/htdocs/accountancy/journal/sellsjournal.php b/htdocs/accountancy/journal/sellsjournal.php index 4437535738aac..aaf3beea8a1ee 100644 --- a/htdocs/accountancy/journal/sellsjournal.php +++ b/htdocs/accountancy/journal/sellsjournal.php @@ -220,7 +220,7 @@ $result = $bookkeeping->create(); if ($result < 0) { $error ++; - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } @@ -250,7 +250,7 @@ $result = $bookkeeping->create(); if ($result < 0) { $error ++; - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } } @@ -282,14 +282,14 @@ $result = $bookkeeping->create(); if ($result < 0) { $error ++; - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } } } if (empty($error)) { - setEventMessage($langs->trans("GeneralLedgerIsWritten"),'mesgs'); + setEventMessages($langs->trans("GeneralLedgerIsWritten"), null, 'mesgs'); } } diff --git a/htdocs/accountancy/supplier/card.php b/htdocs/accountancy/supplier/card.php index f0747c8d29cef..61b225fbc1632 100644 --- a/htdocs/accountancy/supplier/card.php +++ b/htdocs/accountancy/supplier/card.php @@ -55,7 +55,7 @@ dol_syslog('accountancy/supplier/card.php:: $sql=' . $sql); $resql = $db->query($sql); if (! $resql) { - setEventMessage($db->lasterror(), 'errors'); + setEventMessages($db->lasterror(), null, 'errors'); } } else { header("Location: ./lines.php"); diff --git a/htdocs/accountancy/supplier/index.php b/htdocs/accountancy/supplier/index.php index 954eb60300cbb..ec18d8b1e23c1 100644 --- a/htdocs/accountancy/supplier/index.php +++ b/htdocs/accountancy/supplier/index.php @@ -79,10 +79,10 @@ if (! $resql1) { $error ++; $db->rollback(); - setEventMessage($db->lasterror(), 'errors'); + setEventMessages($db->lasterror(), null, 'errors'); } else { $db->commit(); - setEventMessage($langs->trans('Dispatched'), 'mesgs'); + setEventMessages($langs->trans('Dispatched'), null, 'mesgs'); } } diff --git a/htdocs/accountancy/supplier/lines.php b/htdocs/accountancy/supplier/lines.php index f475e7046ad79..e703bca6f2df3 100644 --- a/htdocs/accountancy/supplier/lines.php +++ b/htdocs/accountancy/supplier/lines.php @@ -115,14 +115,14 @@ $resql1 = $db->query($sql1); if (! $resql1) { $error ++; - setEventMessage($db->lasterror(), 'errors'); + setEventMessages($db->lasterror(), null, 'errors'); } if (! $error) { $db->commit(); - setEventMessage($langs->trans('Save'), 'mesgs'); + setEventMessages($langs->trans('Save'), null, 'mesgs'); } else { $db->rollback(); - setEventMessage($db->lasterror(), 'errors'); + setEventMessages($db->lasterror(), null, 'errors'); } } diff --git a/htdocs/adherents/admin/adherent.php b/htdocs/adherents/admin/adherent.php index 5827e1d22d7bd..8e265eb70f7ba 100644 --- a/htdocs/adherents/admin/adherent.php +++ b/htdocs/adherents/admin/adherent.php @@ -7,7 +7,7 @@ * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2011-2012 Juanjo Menent * Copyright (C) 2012 J. Fernando Lagrange - * Copyright (C) 2015 Jean-François Ferry + * Copyright (C) 2015 Jean-François Ferry * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -69,11 +69,11 @@ if (! $error) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { - setEventMessage($langs->trans("Error"), 'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } diff --git a/htdocs/adherents/admin/public.php b/htdocs/adherents/admin/public.php index 58cb7bb2f4191..6f5d1de5c8710 100644 --- a/htdocs/adherents/admin/public.php +++ b/htdocs/adherents/admin/public.php @@ -60,11 +60,11 @@ if (! $error) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { - setEventMessage($langs->trans("Error"), 'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } diff --git a/htdocs/adherents/card.php b/htdocs/adherents/card.php index 355aedb3e6825..f998c2f08a3fd 100644 --- a/htdocs/adherents/card.php +++ b/htdocs/adherents/card.php @@ -4,7 +4,7 @@ * Copyright (C) 2004-2012 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2012 Marcos García - * Copyright (C) 2012-2013 Philippe Grand + * Copyright (C) 2012-2015 Philippe Grand * Copyright (C) 2015 Alexandre Spangaro * * This program is free software; you can redistribute it and/or modify @@ -133,7 +133,7 @@ if ($userid != $user->id && $userid != $object->user_id) { $error++; - setEventMessage($langs->trans("ErrorUserPermissionAllowsToLinksToItselfOnly"), 'errors'); + setEventMessages($langs->trans("ErrorUserPermissionAllowsToLinksToItselfOnly"), null, 'errors'); } } @@ -169,7 +169,7 @@ $thirdparty=new Societe($db); $thirdparty->fetch($socid); $error++; - setEventMessage($langs->trans("ErrorMemberIsAlreadyLinkedToThisThirdParty",$othermember->getFullName($langs),$othermember->login,$thirdparty->name), 'errors'); + setEventMessages($langs->trans("ErrorMemberIsAlreadyLinkedToThisThirdParty",$othermember->getFullName($langs),$othermember->login,$thirdparty->name), null, 'errors'); } } @@ -195,12 +195,12 @@ if ($result < 0) { $langs->load("errors"); - setEventMessage($langs->trans($nuser->error), 'errors'); + setEventMessages($langs->trans($nuser->error), null, 'errors'); } } else { - setEventMessage($object->error, 'errors'); + setEventMessages($object->errors, $object->error, 'errors'); } } @@ -216,13 +216,13 @@ if ($result < 0) { $langs->load("errors"); - setEventMessage($langs->trans($company->error), 'errors'); - setEventMessage($company->errors, 'errors'); + setEventMessages($langs->trans($company->error), null, 'errors'); + setEventMessages($company->error, $company->errors, 'errors'); } } else { - setEventMessage($object->error, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } @@ -236,7 +236,7 @@ $result=$object->send_an_email($langs->transnoentitiesnoconv("ThisIsContentOfYourCard")."\n\n%INFOS%\n\n",$langs->transnoentitiesnoconv("CardContent")); $langs->load("mails"); - setEventMessage($langs->trans("MailSuccessfulySent", $from, $object->email)); + setEventMessages($langs->trans("MailSuccessfulySent", $from, $object->email), null, 'mesgs'); } } @@ -352,7 +352,7 @@ $newfile=$dir.'/'.dol_sanitizeFileName($_FILES['photo']['name']); if (! dol_move_uploaded_file($_FILES['photo']['tmp_name'],$newfile,1,0,$_FILES['photo']['error']) > 0) { - setEventMessage($langs->trans("ErrorFailedToSaveFile"), 'errors'); + setEventMessages($langs->trans("ErrorFailedToSaveFile"), null, 'errors'); } else { @@ -368,7 +368,7 @@ } else { - setEventMessage("ErrorBadImageFormat", 'errors'); + setEventMessages("ErrorBadImageFormat", null, 'errors'); } } else @@ -397,9 +397,9 @@ else { if ($object->error) { - setEventMessage($object->error, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } else { - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } $action=''; } @@ -503,7 +503,7 @@ if ($num) { $error++; $langs->load("errors"); - setEventMessage($langs->trans("ErrorLoginAlreadyExists",$login), 'errors'); + setEventMessages($langs->trans("ErrorLoginAlreadyExists",$login), null, 'errors'); } } if (empty($pass)) { @@ -528,7 +528,7 @@ if ($conf->global->ADHERENT_MAIL_REQUIRED && ! isValidEMail($email)) { $error++; $langs->load("errors"); - setEventMessage($langs->trans("ErrorBadEMail",$email), 'errors'); + setEventMessages($langs->trans("ErrorBadEMail",$email), null, 'errors'); } $public=0; if (isset($public)) $public=1; @@ -554,9 +554,9 @@ $db->rollback(); if ($object->error) { - setEventMessage($object->error, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } else { - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } $action = 'create'; @@ -609,7 +609,7 @@ if ($result < 0) { $error++; - setEventMessage($object->error, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } } @@ -617,9 +617,9 @@ { $error++; if ($object->error) { - setEventMessage($object->error, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } else { - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } @@ -654,7 +654,7 @@ if ($result < 0) { $error++; - setEventMessage($object->error, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } } else @@ -662,9 +662,9 @@ $error++; if ($object->error) { - setEventMessage($object->error, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } else { - setEventMessage($object->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } $action=''; } @@ -683,7 +683,7 @@ { if (!$mailmanspip->del_to_spip($object)) { - setEventMessage($langs->trans('DeleteIntoSpipError').': '.$mailmanspip->error, 'errors'); + setEventMessages($langs->trans('DeleteIntoSpipError').': '.$mailmanspip->error, null, 'errors'); } } } @@ -694,7 +694,7 @@ { if (!$mailmanspip->add_to_spip($object)) { - setEventMessage($langs->trans('AddIntoSpipError').': '.$mailmanspip->error, 'errors'); + setEventMessages($langs->trans('AddIntoSpipError').': '.$mailmanspip->error, null, 'errors'); } } } diff --git a/htdocs/adherents/card_subscriptions.php b/htdocs/adherents/card_subscriptions.php index fa440c3bac423..9d86f618618da 100644 --- a/htdocs/adherents/card_subscriptions.php +++ b/htdocs/adherents/card_subscriptions.php @@ -110,7 +110,7 @@ { $langs->load("errors"); $errmsg=$langs->trans($company->error); - setEventMessage($company->errors, 'errors'); + setEventMessages($company->error, $company->errors, 'errors'); } else { @@ -131,7 +131,7 @@ if ($_POST["userid"] != $user->id && $_POST["userid"] != $object->user_id) { $error++; - setEventMessage($langs->trans("ErrorUserPermissionAllowsToLinksToItselfOnly"), 'errors'); + setEventMessages($langs->trans("ErrorUserPermissionAllowsToLinksToItselfOnly"), null, 'errors'); } } @@ -167,7 +167,7 @@ $thirdparty=new Societe($db); $thirdparty->fetch(GETPOST('socid','int')); $error++; - setEventMessage($langs->trans("ErrorMemberIsAlreadyLinkedToThisThirdParty",$othermember->getFullName($langs),$othermember->login,$thirdparty->name), 'errors'); + setEventMessages($langs->trans("ErrorMemberIsAlreadyLinkedToThisThirdParty",$othermember->getFullName($langs),$othermember->login,$thirdparty->name), null, 'errors'); } } diff --git a/htdocs/adherents/ldap.php b/htdocs/adherents/ldap.php index a2848b655b383..4d9a779d57907 100644 --- a/htdocs/adherents/ldap.php +++ b/htdocs/adherents/ldap.php @@ -72,12 +72,12 @@ if ($result >= 0) { - setEventMessage($langs->trans("MemberSynchronized")); + setEventMessages($langs->trans("MemberSynchronized"), null, 'mesgs'); $db->commit(); } else { - setEventMessage($ldap->error, 'errors'); + setEventMessages($ldap->errors, $ldap->error, 'errors'); $db->rollback(); } } diff --git a/htdocs/admin/agenda.php b/htdocs/admin/agenda.php index 287f2a897ebad..c11cbeff3a4cf 100644 --- a/htdocs/admin/agenda.php +++ b/htdocs/admin/agenda.php @@ -86,12 +86,12 @@ if (! $error) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); $db->commit(); } else { - setEventMessage($langs->trans("Error"),'errors'); + setEventMessages($langs->trans("Error"),null, 'errors'); $db->rollback(); } } diff --git a/htdocs/admin/agenda_extsites.php b/htdocs/admin/agenda_extsites.php index 9356674921e02..755d1eb23f995 100644 --- a/htdocs/admin/agenda_extsites.php +++ b/htdocs/admin/agenda_extsites.php @@ -72,7 +72,7 @@ if (! empty($src) && ! dol_is_url($src)) { - setEventMessage($langs->trans("ErrorParamMustBeAnUrl"),'errors'); + setEventMessages($langs->trans("ErrorParamMustBeAnUrl"), null, 'errors'); $error++; $errorsaved++; break; @@ -104,12 +104,12 @@ if (! $error) { $db->commit(); - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { $db->rollback(); - if (empty($errorsaved)) setEventMessage($langs->trans("Error"),'errors'); + if (empty($errorsaved)) setEventMessages($langs->trans("Error"), null, 'errors'); } } diff --git a/htdocs/admin/agenda_xcal.php b/htdocs/admin/agenda_xcal.php index dfdac2a8f0f5d..cd2406e6fdc2e 100644 --- a/htdocs/admin/agenda_xcal.php +++ b/htdocs/admin/agenda_xcal.php @@ -54,12 +54,12 @@ if ($i >= 4) { $db->commit(); - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { $db->rollback(); - setEventMessage($langs->trans("SaveFailed"), 'errors'); + setEventMessages($langs->trans("SaveFailed"), null, 'errors'); } } diff --git a/htdocs/admin/askpricesupplier.php b/htdocs/admin/askpricesupplier.php index 9bde4673ace7d..9afcd1a8f62bb 100644 --- a/htdocs/admin/askpricesupplier.php +++ b/htdocs/admin/askpricesupplier.php @@ -6,8 +6,8 @@ * Copyright (C) 2004 Eric Seigne * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2008 Raphael Bertrand (Resultic) - * Copyright (C) 2011-2013 Juanjo Menent - * Copyright (C) 2015 Jean-François Ferry + * Copyright (C) 2011-2013 Juanjo Menent + * Copyright (C) 2015 Jean-François Ferry * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -54,11 +54,11 @@ if (! $error) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { - setEventMessage($langs->trans("Error"),'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } @@ -96,13 +96,13 @@ } else { - setEventMessage($module->error,'errors'); + setEventMessages($module->error, null, 'errors'); dol_syslog($module->error, LOG_ERR); } } else { - setEventMessage($langs->trans("ErrorModuleNotFound"),'errors'); + setEventMessages($langs->trans("ErrorModuleNotFound"), null, 'errors'); dol_syslog($langs->trans("ErrorModuleNotFound"), LOG_ERR); } } @@ -116,11 +116,11 @@ if (! $error) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { - setEventMessage($langs->trans("Error"),'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } @@ -134,11 +134,11 @@ if (! $error) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { - setEventMessage($langs->trans("Error"),'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } @@ -150,11 +150,11 @@ if (! $error) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { - setEventMessage($langs->trans("Error"),'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } @@ -178,12 +178,12 @@ if (! $error) { $db->commit(); - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { $db->rollback(); - setEventMessage($langs->trans("Error"),'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } diff --git a/htdocs/admin/bank.php b/htdocs/admin/bank.php index 8214755fd2b24..048e351044de0 100644 --- a/htdocs/admin/bank.php +++ b/htdocs/admin/bank.php @@ -56,11 +56,11 @@ if (! $error) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { - setEventMessage($langs->trans("Error"),'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } diff --git a/htdocs/admin/barcode.php b/htdocs/admin/barcode.php index b36a222c16590..0a57508c271c5 100644 --- a/htdocs/admin/barcode.php +++ b/htdocs/admin/barcode.php @@ -97,11 +97,11 @@ if (! $error) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'msgs'); } else { - setEventMessage($langs->trans("Error"),'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } @@ -111,11 +111,11 @@ if (! $error) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { - setEventMessage($langs->trans("Error"),'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } diff --git a/htdocs/admin/boxes.php b/htdocs/admin/boxes.php index 6b1eb71fafe70..5b6d64801b5f4 100644 --- a/htdocs/admin/boxes.php +++ b/htdocs/admin/boxes.php @@ -85,7 +85,7 @@ } else { - setEventMessage($db->lasterror(), 'errors'); + setEventMessages($db->lasterror(), null, 'errors'); $error++; } } @@ -121,7 +121,7 @@ $resql = $db->query($sql); if (! $resql) { - setEventMessage($db->lasterror(), 'errors'); + setEventMessages($db->lasterror(), null, 'errors'); $error++; } } diff --git a/htdocs/admin/clicktodial.php b/htdocs/admin/clicktodial.php index 1550c0ebef72a..260a9514375d8 100644 --- a/htdocs/admin/clicktodial.php +++ b/htdocs/admin/clicktodial.php @@ -41,11 +41,11 @@ $result=dolibarr_set_const($db, "CLICKTODIAL_URL", GETPOST("url"), 'chaine', 0, '', $conf->entity); if ($result >= 0) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { - setEventMessage($langs->trans("Error"),'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } diff --git a/htdocs/admin/commande.php b/htdocs/admin/commande.php index f7e3812d74fb0..9e55369dac91a 100644 --- a/htdocs/admin/commande.php +++ b/htdocs/admin/commande.php @@ -7,7 +7,7 @@ * Copyright (C) 2005-2014 Regis Houssin * Copyright (C) 2008 Raphael Bertrand (Resultic) * Copyright (C) 2011-2013 Juanjo Menent - * Copyright (C) 2011-2013 Philippe Grand + * Copyright (C) 2011-2015 Philippe Grand * Copyright (C) 2013 Florian Henry * * This program is free software; you can redistribute it and/or modify @@ -64,11 +64,11 @@ if (! $error) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { - setEventMessage($langs->trans("Error"),'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } @@ -106,13 +106,13 @@ } else { - setEventMessage($module->error,'errors'); + setEventMessages($module->error, null, 'errors'); dol_syslog($module->error, LOG_ERR); } } else { - setEventMessage($langs->trans("ErrorModuleNotFound"),'errors'); + setEventMessages($langs->trans("ErrorModuleNotFound"), null, 'errors'); dol_syslog($langs->trans("ErrorModuleNotFound"), LOG_ERR); } } @@ -137,12 +137,12 @@ if (! $error) { $db->commit(); - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { $db->rollback(); - setEventMessage($langs->trans("Error"),'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } @@ -196,11 +196,11 @@ if (! $error) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { - setEventMessage($langs->trans("Error"),'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } @@ -214,11 +214,11 @@ if (! $error) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { - setEventMessage($langs->trans("Error"),'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } @@ -228,9 +228,9 @@ $res = dolibarr_set_const($db, "SHIPPABLE_ORDER_ICON_IN_LIST", $setshippableiconinlist,'yesno',0,'',$conf->entity); if (! $res > 0) $error++; if (! $error) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { - setEventMessage($langs->trans("Error"), 'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } @@ -243,11 +243,11 @@ if (! $error) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { - setEventMessage($langs->trans("Error"),'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } @@ -260,11 +260,11 @@ if (! $error) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { - setEventMessage($langs->trans("Error"),'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } diff --git a/htdocs/admin/company.php b/htdocs/admin/company.php index b9660c8a04d56..e84bdf2a3fa52 100644 --- a/htdocs/admin/company.php +++ b/htdocs/admin/company.php @@ -3,7 +3,7 @@ * Copyright (C) 2004-2013 Laurent Destailleur * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2010-2014 Juanjo Menent - * Copyright (C) 2011 Philippe Grand + * Copyright (C) 2011-2015 Philippe Grand * Copyright (C) 2015 Alexandre Spangaro * * This program is free software; you can redistribute it and/or modify @@ -125,19 +125,19 @@ $error++; $langs->load("errors"); $tmparray=explode(':',$result); - setEventMessage($langs->trans('ErrorFileIsInfectedWithAVirus',$tmparray[1]),'errors'); + setEventMessages($langs->trans('ErrorFileIsInfectedWithAVirus',$tmparray[1]), null, 'errors'); } else { $error++; - setEventMessage($langs->trans("ErrorFailedToSaveFile"),'errors'); + setEventMessages($langs->trans("ErrorFailedToSaveFile"), null, 'errors'); } } else { $error++; $langs->load("errors"); - setEventMessage($langs->trans("ErrorBadImageFormat"),'errors'); + setEventMessages($langs->trans("ErrorBadImageFormat"), null, 'errors'); } } } @@ -230,7 +230,7 @@ { $error++; $langs->load("errors"); - setEventMessage($langs->trans("ErrorBadImageFormat"),'errors'); + setEventMessages($langs->trans("ErrorBadImageFormat"), null, 'errors'); dol_syslog($langs->transnoentities("ErrorBadImageFormat"),LOG_WARNING); } } @@ -238,7 +238,7 @@ { $error++; $langs->load("errors"); - setEventMessage($langs->trans("ErrorFileDoesNotExists",$_GET["file"]),'errors'); + setEventMessages($langs->trans("ErrorFileDoesNotExists",$_GET["file"]), null, 'errors'); dol_syslog($langs->transnoentities("ErrorFileDoesNotExists",$_GET["file"]),LOG_WARNING); } } diff --git a/htdocs/admin/compta.php b/htdocs/admin/compta.php index 633f88b9cfb6a..38ba28e9fa401 100644 --- a/htdocs/admin/compta.php +++ b/htdocs/admin/compta.php @@ -3,7 +3,7 @@ * Copyright (C) 2004-2008 Laurent Destailleur * Copyright (C) 2005-2009 Regis Houssin * Copyright (C) 2011-2013 Juanjo Menent - * Copyright (C) 2013 Philippe Grand + * Copyright (C) 2013-2015 Philippe Grand * Copyright (C) 2014 Marcos García * * This program is free software; you can redistribute it and/or modify @@ -87,11 +87,11 @@ if (! $error) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { - setEventMessage($langs->trans("Error"),'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } diff --git a/htdocs/admin/const.php b/htdocs/admin/const.php index 62f6bbaaf2c04..06e3279fa543c 100644 --- a/htdocs/admin/const.php +++ b/htdocs/admin/const.php @@ -68,7 +68,7 @@ { if (dolibarr_set_const($db, $constname, $constvalue, 'chaine', 1, $constnote, $entity) >= 0) { - setEventMessage($langs->trans("RecordSaved")); + setEventMessages($langs->trans("RecordSaved"), null, 'mesgs'); $action=""; $constname=""; $constvalue=""; @@ -99,7 +99,7 @@ } } } - if ($nbmodified > 0) setEventMessage($langs->trans("RecordSaved")); + if ($nbmodified > 0) setEventMessages($langs->trans("RecordSaved"), null, 'mesgs'); $action=''; } @@ -122,7 +122,7 @@ } } } - if ($nbdeleted > 0) setEventMessage($langs->trans("RecordDeleted")); + if ($nbdeleted > 0) setEventMessages($langs->trans("RecordDeleted"), null, 'mesgs'); $action=''; } @@ -131,7 +131,7 @@ { if (dolibarr_del_const($db, $rowid, $entity) >= 0) { - setEventMessage($langs->trans("RecordDeleted")); + setEventMessages($langs->trans("RecordDeleted"), null, 'mesgs'); } else { diff --git a/htdocs/admin/contract.php b/htdocs/admin/contract.php index a45045a5381ef..3198ad5144836 100644 --- a/htdocs/admin/contract.php +++ b/htdocs/admin/contract.php @@ -1,6 +1,6 @@ - * Copyright (C) 2011-2014 Philippe Grand + * Copyright (C) 2011-2015 Philippe Grand * * 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 @@ -59,11 +59,11 @@ if (! $error) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { - setEventMessage($langs->trans("Error"),'errors'); + setEventMessage($langs->trans("Error"), null, 'errors'); } } @@ -101,13 +101,13 @@ } else { - setEventMessage($obj->error,'errors'); + setEventMessages($obj->error, $obj->errors, 'errors'); dol_syslog($obj->error, LOG_ERR); } } else { - setEventMessage($langs->trans("ErrorModuleNotFound"),'errors'); + setEventMessages($langs->trans("ErrorModuleNotFound"), null, 'errors'); dol_syslog($langs->trans("ErrorModuleNotFound"), LOG_ERR); } } @@ -132,12 +132,12 @@ if (! $error) { $db->commit(); - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { $db->rollback(); - setEventMessage($langs->trans("Error"),'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } @@ -194,11 +194,11 @@ if (! $error) { - setEventMessage($langs->trans("SetupSaved")); + setEventMessages($langs->trans("SetupSaved"), null, 'mesgs'); } else { - setEventMessage($langs->trans("Error"),'errors'); + setEventMessages($langs->trans("Error"), null, 'errors'); } } diff --git a/htdocs/admin/dict.php b/htdocs/admin/dict.php index 40b4676ba2582..817019cc24bfc 100644 --- a/htdocs/admin/dict.php +++ b/htdocs/admin/dict.php @@ -4,7 +4,7 @@ * Copyright (C) 2004 Benoit Mortier * Copyright (C) 2005-2012 Regis Houssin * Copyright (C) 2010-2013 Juanjo Menent - * Copyright (C) 2011 Philippe Grand + * Copyright (C) 2011-2015 Philippe Grand * Copyright (C) 2011 Remy Younes * Copyright (C) 2012-2015 Marcos García * Copyright (C) 2012 Christophe Battarel @@ -548,20 +548,20 @@ if ($fieldnamekey == 'deductible') $fieldnamekey = 'Deductible'; if ($fieldnamekey == 'sortorder') $fieldnamekey = 'SortOrder'; - setEventMessage($langs->transnoentities("ErrorFieldRequired", $langs->transnoentities($fieldnamekey)),'errors'); + setEventMessages($langs->transnoentities("ErrorFieldRequired", $langs->transnoentities($fieldnamekey)), null, 'errors'); } } // Other checks if ($tabname[$id] == MAIN_DB_PREFIX."c_actioncomm" && isset($_POST["type"]) && in_array($_POST["type"],array('system','systemauto'))) { $ok=0; - setEventMessage($langs->transnoentities('ErrorReservedTypeSystemSystemAuto'),'errors'); + setEventMessages($langs->transnoentities('ErrorReservedTypeSystemSystemAuto'), null, 'errors'); } if (isset($_POST["code"])) { if ($_POST["code"]=='0') { $ok=0; - setEventMessage($langs->transnoentities('ErrorCodeCantContainZero'),'errors'); + setEventMessages($langs->transnoentities('ErrorCodeCantContainZero'), null, 'errors'); } /*if (!is_numeric($_POST['code'])) // disabled, code may not be in numeric base { @@ -578,7 +578,7 @@ else { $ok=0; - setEventMessage($langs->transnoentities("ErrorFieldRequired",$langs->transnoentities("Country")),'errors'); + setEventMessages($langs->transnoentities("ErrorFieldRequired",$langs->transnoentities("Country")), null, 'errors'); } } @@ -637,13 +637,13 @@ $result = $db->query($sql); if ($result) // Add is ok { - setEventMessage($langs->transnoentities("RecordSaved")); + setEventMessages($langs->transnoentities("RecordSaved"), null, 'mesgs'); $_POST=array('id'=>$id); // Clean $_POST array, we keep only } else { if ($db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') { - setEventMessage($langs->transnoentities("ErrorRecordAlreadyExists"),'errors'); + setEventMessages($langs->transnoentities("ErrorRecordAlreadyExists"), null, 'errors'); } else { dol_print_error($db); @@ -687,7 +687,7 @@ $resql = $db->query($sql); if (! $resql) { - setEventMessage($db->error(),'errors'); + setEventMessage($db->error(), 'errors'); } } //$_GET["id"]=GETPOST('id', 'int'); // Force affichage dictionnaire en cours d'edition @@ -711,7 +711,7 @@ { if ($db->errno() == 'DB_ERROR_CHILD_EXISTS') { - setEventMessage($langs->transnoentities("ErrorRecordIsUsedByChild"),'errors'); + setEventMessages($langs->transnoentities("ErrorRecordIsUsedByChild"), null, 'errors'); } else { diff --git a/htdocs/admin/menus/edit.php b/htdocs/admin/menus/edit.php index 7c60a2ee055b5..b7f4b8d5b73c8 100644 --- a/htdocs/admin/menus/edit.php +++ b/htdocs/admin/menus/edit.php @@ -78,16 +78,16 @@ $result=$menu->update($user); if ($result > 0) { - setEventMessage($langs->trans("RecordModifiedSuccessfully")); + setEventMessages($langs->trans("RecordModifiedSuccessfully"), null, 'mesgs'); } else { - setEventMessage($menu->error, 'errors'); + setEventMessages($menu->error, $menu->errors, 'errors'); } } else { - setEventMessage($menu->error, 'errors'); + setEventMessages($menu->error, $menu->errors, 'errors'); } $_GET["menuId"] = $_POST['menuId']; $action = "edit"; @@ -159,13 +159,13 @@ } if (! $error && $_POST['menuId'] && $_POST['type'] == 'top') { - setEventMessage($langs->trans("ErrorTopMenuMustHaveAParentWithId0"), 'errors'); + setEventMessages($langs->trans("ErrorTopMenuMustHaveAParentWithId0"), null, 'errors'); $action = 'create'; $error++; } if (! $error && empty($_POST['menuId']) && $_POST['type'] == 'left') { - setEventMessage($langs->trans("ErrorLeftMenuMustHaveAParentId"), 'errors'); + setEventMessages($langs->trans("ErrorLeftMenuMustHaveAParentId"), null, 'errors'); $action = 'create'; $error++; } @@ -204,7 +204,7 @@ else { $action = 'create'; - setEventMessage($menu->error, 'errors'); + setEventMessages($menu->error, $menu->errors, 'errors'); } } } @@ -222,7 +222,7 @@ $this->db->commit(); llxHeader(); - setEventMessage($langs->trans("MenuDeleted")); + setEventMessages($langs->trans("MenuDeleted"), null, 'mesgs'); llxFooter(); exit ; } diff --git a/htdocs/admin/menus/index.php b/htdocs/admin/menus/index.php index c8699209268ab..7da0673b196f1 100644 --- a/htdocs/admin/menus/index.php +++ b/htdocs/admin/menus/index.php @@ -186,7 +186,7 @@ { $db->commit(); - setEventMessage($langs->trans("MenuDeleted")); + setEventMessages($langs->trans("MenuDeleted"), null, 'mesgs'); header("Location: ".DOL_URL_ROOT.'/admin/menus/index.php?menu_handler='.$menu_handler); exit ; @@ -359,7 +359,7 @@ else { $langs->load("errors"); - setEventMessage($langs->trans("ErrorFeatureNeedJavascript"), 'errors'); + setEventMessages($langs->trans("ErrorFeatureNeedJavascript"), null, 'errors'); } print '
    '; diff --git a/htdocs/admin/tools/dolibarr_export.php b/htdocs/admin/tools/dolibarr_export.php index a460f667e2a19..49d229898b8b6 100644 --- a/htdocs/admin/tools/dolibarr_export.php +++ b/htdocs/admin/tools/dolibarr_export.php @@ -52,8 +52,8 @@ { $file=$conf->admin->dir_output.'/'.GETPOST('urlfile'); $ret=dol_delete_file($file, 1); - if ($ret) setEventMessage($langs->trans("FileWasRemoved", GETPOST('urlfile'))); - else setEventMessage($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), 'errors'); + if ($ret) setEventMessages($langs->trans("FileWasRemoved", GETPOST('urlfile')), null, 'mesgs'); + else setEventMessages($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), null, 'errors'); $action=''; } diff --git a/htdocs/admin/tools/export.php b/htdocs/admin/tools/export.php index 500c766ed770a..cddd42a862354 100644 --- a/htdocs/admin/tools/export.php +++ b/htdocs/admin/tools/export.php @@ -60,8 +60,8 @@ { $file=$conf->admin->dir_output.'/'.GETPOST('urlfile'); $ret=dol_delete_file($file, 1); - if ($ret) setEventMessage($langs->trans("FileWasRemoved", GETPOST('urlfile'))); - else setEventMessage($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), 'errors'); + if ($ret) setEventMessages($langs->trans("FileWasRemoved", GETPOST('urlfile')), null, 'mesgs'); + else setEventMessages($langs->trans("ErrorFailToDeleteFile", GETPOST('urlfile')), null, 'errors'); $action=''; } @@ -357,7 +357,7 @@ //{ if ($errormsg) { - setEventMessage($langs->trans("Error")." : ".$errormsg, 'errors'); + setEventMessages($langs->trans("Error")." : ".$errormsg, null, 'errors'); $resultstring=''; $resultstring.='
    '.$langs->trans("Error")." : ".$errormsg.'
    '; @@ -368,7 +368,7 @@ { if ($what) { - setEventMessage($langs->trans("BackupFileSuccessfullyCreated").'.
    '.$langs->trans("YouCanDownloadBackupFile")); + setEventMessages($langs->trans("BackupFileSuccessfullyCreated").'.
    '.$langs->trans("YouCanDownloadBackupFile"), null, 'mesgs'); $resultstring='
    '; $resultstring.=$langs->trans("BackupFileSuccessfullyCreated").'.
    '; @@ -379,7 +379,7 @@ } else { - setEventMessage($langs->trans("YouMustRunCommandFromCommandLineAfterLoginToUser",$dolibarr_main_db_user,$dolibarr_main_db_user)); + setEventMessages($langs->trans("YouMustRunCommandFromCommandLineAfterLoginToUser",$dolibarr_main_db_user,$dolibarr_main_db_user), null, 'mesgs'); } } //} diff --git a/htdocs/admin/tools/update.php b/htdocs/admin/tools/update.php index 54a6cab9cbd6b..e1166e96c3de4 100644 --- a/htdocs/admin/tools/update.php +++ b/htdocs/admin/tools/update.php @@ -34,7 +34,7 @@ if (! $user->admin) accessforbidden(); if (GETPOST('msg','alpha')) { - setEventMessage(GETPOST('msg','alpha'), 'errors'); + setEventMessages(GETPOST('msg','alpha'), null, 'errors'); } @@ -63,7 +63,7 @@ if (! $original_file) { $langs->load("Error"); - setEventMessage($langs->trans("ErrorFileRequired"), 'warnings'); + setEventMessages($langs->trans("ErrorFileRequired"), null, 'warnings'); $error++; } else @@ -71,7 +71,7 @@ if (! preg_match('/\.zip/i',$original_file)) { $langs->load("errors"); - setEventMessage($langs->trans("ErrorFileMustBeADolibarrPackage",$original_file), 'errors'); + setEventMessages($langs->trans("ErrorFileMustBeADolibarrPackage",$original_file), null, 'errors'); $error++; } } @@ -99,7 +99,7 @@ if (! empty($result['error'])) { $langs->load("errors"); - setEventMessage($langs->trans($result['error'],$original_file), 'errors'); + setEventMessages($langs->trans($result['error'],$original_file), null, 'errors'); $error++; } else @@ -116,7 +116,7 @@ //var_dump($modulenamedir); if (! dol_is_dir($modulenamedir)) { - setEventMessage($langs->trans("ErrorModuleFileSeemsToHaveAWrongFormat"), 'errors'); + setEventMessages($langs->trans("ErrorModuleFileSeemsToHaveAWrongFormat"), null, 'errors'); $error++; } } @@ -128,7 +128,7 @@ $result=dolCopyDir($modulenamedir, $dirins.'/'.$modulename, '0444', 1); if ($result <= 0) { - setEventMessage($langs->trans("ErrorFailedToCopy"), 'errors'); + setEventMessages($langs->trans("ErrorFailedToCopy"), null, 'errors'); $error++; } } @@ -142,7 +142,7 @@ if (! $error) { - setEventMessage($langs->trans("SetupIsReadyForUse")); + setEventMessages($langs->trans("SetupIsReadyForUse"), null, 'mesgs'); } } From 2a412af00b3ea57ed2e2d3e72a77044275d9a44f Mon Sep 17 00:00:00 2001 From: Sergio Sanchis Climent Date: Fri, 23 Oct 2015 13:04:33 +0200 Subject: [PATCH 243/297] Fix: Bug: if $this->employe no exist Fix: if this->employee no exist default 0 --- htdocs/install/mysql/tables/llx_user.sql | 3 +-- htdocs/user/class/user.class.php | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/htdocs/install/mysql/tables/llx_user.sql b/htdocs/install/mysql/tables/llx_user.sql index 796566fb638f2..c9673ceb360e1 100644 --- a/htdocs/install/mysql/tables/llx_user.sql +++ b/htdocs/install/mysql/tables/llx_user.sql @@ -26,7 +26,7 @@ create table llx_user ref_ext varchar(50), -- reference into an external system (not used by dolibarr) ref_int varchar(50), -- reference into an internal system (deprecated) - employee tinyint DEFAULT 0, -- employee 0/1 + employee tinyint DEFAULT 0, -- 1 if user is an employee datec datetime, tms timestamp, @@ -76,7 +76,6 @@ create table llx_user nb_holiday integer DEFAULT 0, thm double(24,8), tjm double(24,8), - employee tinyint DEFAULT 1, -- 1 if user is an employee salary double(24,8), salaryextra double(24,8), weeklyhours double(16,8) diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 85a96ebe41582..066da9c18da5b 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -1156,7 +1156,7 @@ function update($user,$notrigger=0,$nosyncmember=0,$nosyncmemberpass=0) // Clean parameters $this->lastname = trim($this->lastname); $this->firstname = trim($this->firstname); - $this->employee = trim($this->employee); + $this->employee = $this->employee?$this->employee:0; $this->login = trim($this->login); $this->gender = trim($this->gender); $this->pass = trim($this->pass); From 8d24adc97ee54640a716258be36c9c5379246dc8 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 23 Oct 2015 13:52:51 +0200 Subject: [PATCH 244/297] Remove 2 other duplicated pages. There is only one page now for all list of thirdarties (with a parameter type to have it specialized per customer, prospect or supplier profile). --- htdocs/comm/list.php | 348 ------------ htdocs/comm/prospect/list.php | 613 --------------------- htdocs/core/class/html.formother.class.php | 2 +- htdocs/core/menus/init_menu_auguria.sql | 4 +- htdocs/core/menus/standard/eldy.lib.php | 14 +- htdocs/index.php | 5 +- htdocs/societe/index.php | 4 +- htdocs/societe/list.php | 251 +++++++-- 8 files changed, 233 insertions(+), 1008 deletions(-) delete mode 100644 htdocs/comm/list.php delete mode 100644 htdocs/comm/prospect/list.php diff --git a/htdocs/comm/list.php b/htdocs/comm/list.php deleted file mode 100644 index 1cc0f2fa9682b..0000000000000 --- a/htdocs/comm/list.php +++ /dev/null @@ -1,348 +0,0 @@ - - * Copyright (C) 2004-2011 Laurent Destailleur - * Copyright (C) 2005-2012 Regis Houssin - * Copyright (C) 2013 Cédric Salvador - * Copyright (C) 2013-2015 Florian Henry - * Copyright (C) 2015 Jean-François Ferry - * Copyright (C) 2015 Marcos García - * - * This program is freei software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/** - * \file htdocs/comm/list.php - * \ingroup commercial societe - * \brief List of customers - */ - -require '../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; - -$langs->load("companies"); -$langs->load("customers"); -$langs->load("suppliers"); -$langs->load("commercial"); - -// Security check -$socid = GETPOST('socid','int'); -if ($user->societe_id) $socid=$user->societe_id; -$result = restrictedArea($user,'societe',$socid,''); - -$sortfield = GETPOST('sortfield','alpha'); -$sortorder = GETPOST('sortorder','alpha'); -$page=GETPOST('page','int'); -if ($page == -1) { $page = 0 ; } -$offset = $conf->liste_limit * $page; -$pageprev = $page - 1; -$pagenext = $page + 1; -if (! $sortorder) $sortorder="ASC"; -if (! $sortfield) $sortfield="s.nom"; - -$search_company = GETPOST("search_company"); -$search_zipcode = GETPOST("search_zipcode"); -$search_town = GETPOST("search_town"); -$search_code = GETPOST("search_code"); -$search_compta = GETPOST("search_compta"); -$search_status = GETPOST("search_status",'int'); -$search_country = GETPOST("search_country",'int'); -$search_type_thirdparty = GETPOST("search_type_thirdparty",'int'); -$optioncss = GETPOST('optioncss','alpha'); - -// Load sale and categ filters -$search_sale = GETPOST("search_sale",'int'); -$search_categ = GETPOST("search_categ",'int'); -$catid = GETPOST("catid",'int'); -// If the internal user must only see his customers, force searching by him -if (!$user->rights->societe->client->voir && !$socid) $search_sale = $user->id; - -// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array -$hookmanager->initHooks(array('customerlist')); -$extrafields = new ExtraFields($db); - - -/* - * Actions - */ - -$parameters=array(); -$reshook=$hookmanager->executeHooks('doActions',$parameters); // Note that $action and $object may have been modified by some hooks -if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); - -// Do we click on purge search criteria ? -if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers -{ - $search_sale=""; - $search_categ=""; - $catid=""; - $search_company=""; - $search_zipcode=""; - $search_town=""; - $search_code=''; - $search_compta=''; - $search_status=''; - $search_country=""; - $search_type_thirdparty=''; -} - -if ($search_status=='') $search_status=1; // always display activ customer first - - -/* - * view - */ - -$formother=new FormOther($db); -$form = new Form($db); -$thirdpartystatic=new Societe($db); -$formcompany=new FormCompany($db); - -$help_url='EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas'; -llxHeader('',$langs->trans("ThirdParty"),$help_url); - -$sql = "SELECT s.rowid, s.nom as name, s.name_alias, s.client, s.zip, s.town, st.libelle as stcomm, s.prefix_comm, s.code_client, s.code_compta, s.status as status,"; -$sql.= " s.datec, s.canvas"; -$sql.= ",s.fk_pays"; -$sql.= ",typent.code as typent_code"; -if ((!$user->rights->societe->client->voir && !$socid) || $search_sale > 0) $sql .= ", sc.fk_soc, sc.fk_user"; // We need these fields in order to filter by sale (including the case where the user can only see his prospects) -// Add fields for extrafields -foreach ($extrafields->attribute_list as $key => $val) $sql.=",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"; -if (! empty($search_categ) || ! empty($catid)) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_societe as cs ON s.rowid = cs.fk_soc"; // We need this table joined to the select in order to filter by categ -$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) "; -if ((!$user->rights->societe->client->voir && !$socid) || $search_sale) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; // We need this table joined to the select in order to filter by sale -$sql.= ", ".MAIN_DB_PREFIX."c_stcomm as st"; -$sql.= " WHERE s.fk_stcomm = st.id"; -$sql.= " AND s.client IN (1, 3)"; -$sql.= ' AND s.entity IN ('.getEntity('societe', 1).')'; -if ((!$user->rights->societe->client->voir && !$socid) || $search_sale) $sql.= " AND s.rowid = sc.fk_soc"; -if ($socid) $sql.= " AND s.rowid = ".$socid; -if ($search_sale > 0) $sql.= " AND s.rowid = sc.fk_soc"; // Join for the needed table to filter by sale -if ($catid > 0) $sql.= " AND cs.fk_categorie = ".$catid; -if ($catid == -2) $sql.= " AND cs.fk_categorie IS NULL"; -if ($search_categ > 0) $sql.= " AND cs.fk_categorie = ".$search_categ; -if ($search_categ == -2) $sql.= " AND cs.fk_categorie IS NULL"; -if ($search_company) $sql.= natural_search(array('s.nom', 's.name_alias'), $search_company); -if ($search_zipcode) $sql.= natural_search("s.zip", $search_zipcode); -if ($search_town) $sql.= natural_search('s.town', $search_town); -if ($search_code) $sql.= natural_search("s.code_client", $search_code); -if ($search_compta) $sql.= natural_search("s.code_compta", $search_compta); -if ($search_status!='') $sql.= " AND s.status = ".$db->escape($search_status); -if ($search_country) $sql .= " AND s.fk_pays IN (".$search_country.')'; -if ($search_type_thirdparty) $sql .= " AND s.fk_typent IN (".$search_type_thirdparty.')'; -if ($search_sale > 0) $sql.= " AND sc.fk_user = ".$search_sale; -// 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; - -// Count total nb of records -$nbtotalofrecords = 0; -if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) -{ - $result = $db->query($sql); - $nbtotalofrecords = $db->num_rows($result); -} - -$sql.= $db->order($sortfield,$sortorder); -$sql.= $db->plimit($conf->liste_limit +1, $offset); - -dol_syslog('comm/list.php:', LOG_DEBUG); -$result = $db->query($sql); -if ($result) -{ - $num = $db->num_rows($result); - - $param = "&search_company=".htmlspecialchars($search_company); - $param.="&search_code=".htmlspecialchars($search_code); - $param.="&search_zipcode=".htmlspecialchars($search_zipcode); - $param.="&search_town=".htmlspecialchars($search_town); - if ($search_categ != '') $param.='&search_categ='.htmlspecialchars($search_categ); - if ($search_sale > 0) $param.='&search_sale='.htmlspecialchars($search_sale); - if ($search_status != '') $param.='&search_status='.htmlspecialchars($search_status); - if ($search_country != '') $param.='&search_country='.htmlspecialchars($search_country); - if ($search_type_thirdparty != '') $param.='&search_type_thirdparty='.htmlspecialchars($search_type_thirdparty); - if ($optioncss != '') $param.='&optioncss='.$optioncss; - - print_barre_liste($langs->trans("ListOfCustomers"), $page, $_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num,$nbtotalofrecords,'title_companies.png'); - - $i = 0; - - print '
    '."\n"; - if ($optioncss != '') print ''; - - // Filter on categories - $moreforfilter=''; - if (! empty($conf->categorie->enabled)) - { - $moreforfilter.='
    '; - $moreforfilter.=$langs->trans('Categories'). ': '; - $moreforfilter.=$formother->select_categories(2,$search_categ,'search_categ',1); - $moreforfilter.='
    '; - } - // If the user can view prospects other than his' - if ($user->rights->societe->client->voir || $socid) - { - $moreforfilter.='
    '; - $moreforfilter.=$langs->trans('SalesRepresentatives'). ': '; - $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user); - $moreforfilter.='
    '; - } - if ($moreforfilter) - { - print '
    '; - print $moreforfilter; - $parameters=array(); - $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - print '
    '; - } - - print ''; - - print ''; - print_liste_field_titre($langs->trans("Company"),$_SERVER["PHP_SELF"],"s.nom","",$param,"",$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Zip"),$_SERVER["PHP_SELF"],"s.zip","",$param,"",$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Town"),$_SERVER["PHP_SELF"],"s.town","",$param,"",$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Country"),$_SERVER["PHP_SELF"],"country.code_iso","",$param,'align="center"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("ThirdPartyType"),$_SERVER["PHP_SELF"],"typent.code","",$param,'align="center"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("CustomerCode"),$_SERVER["PHP_SELF"],"s.code_client","",$param,"",$sortfield,$sortorder); - print_liste_field_titre($langs->trans("AccountancyCode"),$_SERVER["PHP_SELF"],"s.code_compta","",$param,'align="left"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("DateCreation"),$_SERVER["PHP_SELF"],"datec","",$param,'align="right"',$sortfield,$sortorder); - $parameters=array(); - $reshook=$hookmanager->executeHooks('printFieldListTitle',$parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - print_liste_field_titre($langs->trans("Status"),$_SERVER["PHP_SELF"],"s.status","",$param,'align="center"',$sortfield,$sortorder); - print_liste_field_titre('',$_SERVER["PHP_SELF"],"",'','','',$sortfield,$sortorder,'maxwidthsearch '); - print "\n"; - - print ''; - - print ''; - - print ''; - - print ''; - - print ''; - - print ''; - - print ''; - - print ''; - - print ''; - - $parameters=array(); - $reshook=$hookmanager->executeHooks('printFieldListOption',$parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - - print ''; - - print ''; - - print ''."\n"; - - - $var=True; - - while ($i < min($num,$conf->liste_limit)) - { - $obj = $db->fetch_object($result); - - $var=!$var; - - print ""; - print ''; - print ''; - print ''; - //Country - print ''; - //Type ent - print ''; - print ''; - print ''; - print ''; - - $parameters=array('obj' => $obj); - $reshook=$hookmanager->executeHooks('printFieldListValue',$parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - - print ''; - - print ''; - - print "\n"; - $i++; - } - $db->free($result); - - $parameters=array('sql' => $sql); - $reshook=$hookmanager->executeHooks('printFieldListFooter',$parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - - 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 ''; - print ''; - print ''; - print ''; - print ' '; - print ''; - print $form->selectarray('search_status', array('0'=>$langs->trans('ActivityCeased'),'1'=>$langs->trans('InActivity')),$search_status); - print ''; - print ''; - print '
    '; - $thirdpartystatic->id=$obj->rowid; - $thirdpartystatic->name=$obj->name; - $thirdpartystatic->client=$obj->client; - $thirdpartystatic->code_client=$obj->code_client; - $thirdpartystatic->canvas=$obj->canvas; - $thirdpartystatic->status=$obj->status; - $thirdpartystatic->name_alias=$obj->name_alias; - print $thirdpartystatic->getNomUrl(1); - print ''.$obj->zip.''.$obj->town.''; - $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 ''.$obj->code_client.''.$obj->code_compta.''.dol_print_date($db->jdate($obj->datec),'day').''.$thirdpartystatic->getLibStatut(3); - print '
    \n"; - print "
    \n"; -} -else -{ - dol_print_error($db); -} - -llxFooter(); -$db->close(); diff --git a/htdocs/comm/prospect/list.php b/htdocs/comm/prospect/list.php deleted file mode 100644 index 8ec43d955a462..0000000000000 --- a/htdocs/comm/prospect/list.php +++ /dev/null @@ -1,613 +0,0 @@ - - * Copyright (C) 2004-2015 Laurent Destailleur - * Copyright (C) 2005-2012 Regis Houssin - * Copyright (C) 2011 Philippe Grand - * Copyright (C) 2013-2015 Florian Henry - * Copyright (C) 2013 Cédric Salvador - * Copyright (C) 2015 Jean-François Ferry - * Copyright (C) 2015 Raphaël Doursenaud - * Copyright (C) 2015 Marcos García - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/** - * \file htdocs/comm/prospect/list.php - * \ingroup prospect - * \brief Page to list prospects - */ - -require '../../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/societe/class/client.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; - -$langs->load("propal"); -$langs->load("companies"); - -// Security check -$socid = GETPOST("socid",'int'); -if ($user->societe_id) $socid=$user->societe_id; -$result = restrictedArea($user, 'societe',$socid,''); - -$action = GETPOST('action','alpha'); -$socname = GETPOST("socname",'alpha'); -$stcomm = GETPOST("stcomm",'alpha'); // code -$search_stcomm = GETPOST("search_stcomm",'int'); -$search_nom = GETPOST("search_nom"); -$search_zipcode = GETPOST("search_zipcode"); -$search_town = GETPOST("search_town"); -$search_state = GETPOST("search_state"); -$search_datec = GETPOST("search_datec"); -$search_categ = GETPOST("search_categ",'int'); -$search_status = GETPOST("search_status",'int'); -$catid = GETPOST("catid",'int'); -$search_country = GETPOST("search_country",'int'); -$search_type_thirdparty = GETPOST("search_type_thirdparty",'int'); - -$sortfield = GETPOST("sortfield",'alpha'); -$sortorder = GETPOST("sortorder",'alpha'); -$page = GETPOST("page",'int'); -if ($page == -1) { $page = 0; } -$offset = $conf->liste_limit * $page; -$pageprev = $page - 1; -$pagenext = $page + 1; -if (! $sortorder) $sortorder="ASC"; -if (! $sortfield) $sortfield="s.nom"; - -$search_level_from = GETPOST("search_level_from","alpha"); -$search_level_to = GETPOST("search_level_to","alpha"); - -// If both parameters are set, search for everything BETWEEN them -if ($search_level_from != '' && $search_level_to != '') -{ - // Ensure that these parameters are numbers - $search_level_from = (int) $search_level_from; - $search_level_to = (int) $search_level_to; - - // If from is greater than to, reverse orders - if ($search_level_from > $search_level_to) - { - $tmp = $search_level_to; - $search_level_to = $search_level_from; - $search_level_from = $tmp; - } - - // Generate the SQL request - $sortwhere = '(sortorder BETWEEN '.$search_level_from.' AND '.$search_level_to.') AS is_in_range'; -} -// If only "from" parameter is set, search for everything GREATER THAN it -else if ($search_level_from != '') -{ - // Ensure that this parameter is a number - $search_level_from = (int) $search_level_from; - - // Generate the SQL request - $sortwhere = '(sortorder >= '.$search_level_from.') AS is_in_range'; -} -// If only "to" parameter is set, search for everything LOWER THAN it -else if ($search_level_to != '') -{ - // Ensure that this parameter is a number - $search_level_to = (int) $search_level_to; - - // Generate the SQL request - $sortwhere = '(sortorder <= '.$search_level_to.') AS is_in_range'; -} -// If no parameters are set, dont search for anything -else -{ - $sortwhere = '0 as is_in_range'; -} - -// Select every potentiels, and note each potentiels which fit in search parameters -dol_syslog('prospects::prospects_prospect_level',LOG_DEBUG); -$sql = "SELECT code, label, sortorder, ".$sortwhere; -$sql.= " FROM ".MAIN_DB_PREFIX."c_prospectlevel"; -$sql.= " WHERE active > 0"; -$sql.= " ORDER BY sortorder"; - -$resql = $db->query($sql); -if ($resql) -{ - $tab_level = array(); - $search_levels = array(); - - while ($obj = $db->fetch_object($resql)) - { - // Compute level text - $level=$langs->trans($obj->code); - if ($level == $obj->code) $level=$langs->trans($obj->label); - - // Put it in the array sorted by sortorder - $tab_level[$obj->sortorder] = $level; - - // If this potentiel fit in parameters, add its code to the $search_levels array - if ($obj->is_in_range == 1) - { - $search_levels[] = '"'.preg_replace('[^A-Za-z0-9_-]', '', $obj->code).'"'; - } - } - - // Implode the $search_levels array so that it can be use in a "IN (...)" where clause. - // If no paramters was set, $search_levels will be empty - $search_levels = implode(',', $search_levels); -} -else dol_print_error($db); - -// Load sale and categ filters -$search_sale = GETPOST('search_sale','int'); -$search_categ = GETPOST('search_categ','int'); -// If the internal user must only see his prospect, force searching by him -if (!$user->rights->societe->client->voir && !$socid) $search_sale = $user->id; - -// List of available states; we'll need that for each lines (quick changing prospect states) and for search bar (filter by prospect state) -$sts = array(-1,0,1,2,3); - - -// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array -$contextpage='prospectlist'; -$hookmanager->initHooks(array($contextpage)); -$extrafields = new ExtraFields($db); - -// fetch optionals attributes and labels -$extralabels = $extrafields->fetch_name_optionals_label('thirdparty'); -$search_array_options=$extrafields->getOptionalsFromPost($extralabels,'','search_'); - -// Do we click on purge search criteria ? -if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers -{ - $socname=""; - $stcomm=""; - $search_stcomm=""; - $search_nom=""; - $search_zipcode=""; - $search_town=""; - $search_state=""; - $search_datec=""; - $search_categ=""; - $search_status=""; - $search_country=""; - $search_type_thirdparty=""; - $search_array_options=array(); -} - -if ($search_status=='') $search_status=1; // always display active customer first - - - -/* - * Actions - */ - -$parameters=array(); -$reshook=$hookmanager->executeHooks('doActions',$parameters); // Note that $action and $object may have been modified by some hooks -if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); - -if (empty($reshook)) -{ - if ($action == 'setstcomm') - { - $object = new Client($db); - $result=$object->fetch($socid); - $object->stcomm_id=dol_getIdFromCode($db, GETPOST('stcomm','alpha'), 'c_stcomm'); - $result=$object->set_commnucation_level($user); - if ($result < 0) setEventMessages($object->error,$object->errors,'errors'); - - $action=''; $socid=0; - } -} - - -/* - * View - */ - -$formother=new FormOther($db); -$form=new Form($db); -$formcompany=new FormCompany($db); -$prospectstatic=new Client($db); -$prospectstatic->client=2; -$prospectstatic->loadCacheOfProspStatus(); - -$sql = "SELECT s.rowid as socid, s.nom as name, s.name_alias, s.zip, s.town, s.datec, s.status as status, s.code_client, s.client,"; -$sql.= " s.prefix_comm, s.fk_prospectlevel, s.fk_stcomm as stcomm_id,"; -$sql.= " st.libelle as stcomm_label,"; -$sql.= " d.nom as departement"; -$sql.= " ,s.fk_pays"; -$sql.= " ,typent.code as typent_code"; -if ((!$user->rights->societe->client->voir && !$socid) || $search_sale > 0) $sql .= ", sc.fk_soc, sc.fk_user"; // We need these fields in order to filter by sale (including the case where the user can only see his prospects) -// Add fields for extrafields -if (is_array($extrafields->attribute_list) && count($extrafields->attribute_list)) foreach ($extrafields->attribute_list as $key => $val) $sql.=",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."c_stcomm as st"; -$sql.= ", ".MAIN_DB_PREFIX."societe as s"; -if (is_array($extrafields->attribute_list) && count($extrafields->attribute_list)) $sql.= " LEFT JOIN ".MAIN_DB_PREFIX."societe_extrafields as ef on (s.rowid = ef.fk_object)"; -$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."c_departements as d on (d.rowid = s.fk_departement)"; -$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) "; -if (! empty($search_categ) || ! empty($catid)) $sql.= ' LEFT JOIN '.MAIN_DB_PREFIX."categorie_societe as cs ON s.rowid = cs.fk_soc"; // We need this table joined to the select in order to filter by categ -if ((!$user->rights->societe->client->voir && !$socid) || $search_sale > 0) $sql.= ", ".MAIN_DB_PREFIX."societe_commerciaux as sc"; // We need this table joined to the select in order to filter by sale -$sql.= " WHERE s.fk_stcomm = st.id"; -$sql.= " AND s.client IN (2, 3)"; -$sql.= ' AND s.entity IN ('.getEntity('societe', 1).')'; -if ((!$user->rights->societe->client->voir && !$socid) || $search_sale > 0) $sql.= " AND s.rowid = sc.fk_soc"; -if ($socid) $sql.= " AND s.rowid = " .$socid; -if ($search_stcomm != '' && $search_stcomm != -2) $sql.= natural_search("s.fk_stcomm",$search_stcomm,2); -if ($catid > 0) $sql.= " AND cs.fk_categorie = ".$catid; -if ($catid == -2) $sql.= " AND cs.fk_categorie IS NULL"; -if ($search_categ > 0) $sql.= " AND cs.fk_categorie = ".$search_categ; -if ($search_categ == -2) $sql.= " AND cs.fk_categorie IS NULL"; -if ($search_nom) $sql .= natural_search(array('s.nom','s.name_alias'), $search_nom); -if ($search_zipcode) $sql .= " AND s.zip LIKE '".$db->escape(strtolower($search_zipcode))."%'"; -if ($search_town) $sql .= natural_search('s.town', $search_town); -if ($search_state) $sql .= natural_search('d.nom', $search_state); -if ($search_datec) $sql .= " AND s.datec LIKE '%".$db->escape($search_datec)."%'"; -if ($search_status!='') $sql .= " AND s.status = ".$db->escape($search_status); -// Insert levels filters -if ($search_levels) $sql .= " AND s.fk_prospectlevel IN (".$search_levels.')'; -if ($search_country) $sql .= " AND s.fk_pays IN (".$search_country.')'; -if ($search_type_thirdparty) $sql .= " AND s.fk_typent IN (".$search_type_thirdparty.')'; -// Insert sale filter -if ($search_sale > 0) $sql .= " AND sc.fk_user = ".$db->escape($search_sale); -if ($socname) -{ - $sql .= natural_search('s.nom', $search_nom); - $sortfield = "s.nom"; - $sortorder = "ASC"; -} -// 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'))) $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; -// Count total nb of records -$nbtotalofrecords = 0; -if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) -{ - $result = $db->query($sql); - $nbtotalofrecords = $db->num_rows($result); -} -$sql.= " ORDER BY $sortfield $sortorder, s.nom ASC"; -$sql.= $db->plimit($conf->liste_limit+1, $offset); -//print $sql; - -dol_syslog('comm/prospect/list.php', LOG_DEBUG); -$resql = $db->query($sql); -if ($resql) -{ - $num = $db->num_rows($resql); - - if ($num == 1 && $socname) - { - $obj = $db->fetch_object($resql); - header("Location: card.php?socid=".$obj->socid); - exit; - } - else - { - $help_url='EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas'; - llxHeader('',$langs->trans("ThirdParty"),$help_url); - } - - $param='&search_stcomm='.$search_stcomm; - $param.='&search_nom='.urlencode($search_nom); - $param.='&search_zipcode='.urlencode($search_zipcode); - $param.='&search_town='.urlencode($search_town); - // Store the status filter in the URL - if (isSet($search_setstcomm)) - { - foreach ($search_setstcomm as $key => $value) - { - if ($value == 'true') - $param.='&search_setstcomm['.((int) $key).']=true'; - else - $param.='&search_setstcomm['.((int) $key).']=false'; - } - } - if ($search_level_from != '') $param.='&search_level_from='.$search_level_from; - if ($search_level_to != '') $param.='&search_level_to='.$search_level_to; - if ($search_categ != '') $param.='&search_categ='.urlencode($search_categ); - if ($search_sale > 0) $param.='&search_sale='.$search_sale; - if ($search_status != '') $param.='&search_status='.$search_status; - if ($search_country != '') $param.='&search_country='.$search_country; - if ($search_type_thirdparty != '') $param.='&search_type_thirdparty='.$search_type_thirdparty; - // Add $param from extra fields - foreach ($search_array_options as $key => $val) - { - $crit=$val; - $tmpkey=preg_replace('/search_options_/','',$key); - $param.='&search_options_'.$tmpkey.'='.urlencode($val); - } - - print_barre_liste($langs->trans("ListOfProspects"), $page, $_SERVER["PHP_SELF"], $param, $sortfield,$sortorder,'',$num,$nbtotalofrecords,'title_companies.png'); - - - // Print the search-by-sale and search-by-categ filters - print '
    '; - - // Filter on categories - $moreforfilter=''; - if (! empty($conf->categorie->enabled)) - { - require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php'; - $moreforfilter.='
    '; - $moreforfilter.=$langs->trans('Categories'). ': '; - $moreforfilter.=$formother->select_categories(Categorie::TYPE_CUSTOMER,$search_categ,'search_categ',1); - $moreforfilter.='
    '; - } - // If the user can view prospects other than his' - if ($user->rights->societe->client->voir || $socid) - { - $moreforfilter.='
    '; - $moreforfilter.=$langs->trans('SalesRepresentatives'). ': '; - $moreforfilter.=$formother->select_salesrepresentatives($search_sale,'search_sale',$user); - $moreforfilter.='
    '; - } - if ($moreforfilter) - { - print '
    '; - print $moreforfilter; - $parameters=array(); - $reshook=$hookmanager->executeHooks('printFieldPreListTitle',$parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - print '
    '; - } - - print ''; - - print ''; - print_liste_field_titre($langs->trans("Company"),$_SERVER["PHP_SELF"],"s.nom","",$param,'',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Zip"),$_SERVER["PHP_SELF"],"s.zip","",$param,"",$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Town"),$_SERVER["PHP_SELF"],"s.town","",$param,"",$sortfield,$sortorder); - print_liste_field_titre($langs->trans("StateShort"),$_SERVER["PHP_SELF"],"s.fk_departement","",$param,'align="center"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("Country"),$_SERVER["PHP_SELF"],"country.code_iso","",$param,'align="center"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("ThirdPartyType"),$_SERVER["PHP_SELF"],"typent.code","",$param,'align="center"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("DateCreation"),$_SERVER["PHP_SELF"],"s.datec","",$param,'align="center"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("ProspectLevelShort"),$_SERVER["PHP_SELF"],"s.fk_prospectlevel","",$param,'align="center"',$sortfield,$sortorder); - print_liste_field_titre($langs->trans("StatusProsp"),$_SERVER["PHP_SELF"],"s.fk_stcomm","",$param,'align="center"',$sortfield,$sortorder); - print_liste_field_titre(''); - - // Extrafields - if (is_array($extrafields->attribute_list) && count($extrafields->attribute_list)) - { - foreach($extrafields->attribute_list as $key => $val) - { - if ($val) - { - print_liste_field_titre($extralabels[$key],$_SERVER["PHP_SELF"],"ef.".$key,"",$param,"",$sortfield,$sortorder); - } - } - } - // Hook fields - $parameters=array(); - $reshook=$hookmanager->executeHooks('printFieldListTitle',$parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - - print_liste_field_titre($langs->trans("Status"),$_SERVER["PHP_SELF"],"s.status","",$param,'align="right"',$sortfield,$sortorder); - print_liste_field_titre('',$_SERVER["PHP_SELF"],"",'','','',$sortfield,$sortorder,'maxwidthsearch '); - print "\n"; - - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - print ''; - - // Prospect level - print ''; - - // Prospect status - print ''; - - print ''; - - // Extrafields - if (is_array($extrafields->attribute_list) && count($extrafields->attribute_list)) - { - foreach($extrafields->attribute_list as $key => $val) - { - if ($val) - { - $crit=$search_array_options['search_options_'.$key]; - print ''; - } - } - } - // Hook fields - $parameters=array(); - $reshook=$hookmanager->executeHooks('printFieldListSearch',$parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - - // Status - print ''; - - // Print the search button - print '\n"; - - print "\n"; - - $i = 0; - $var=true; - - while ($i < min($num,$conf->liste_limit)) - { - $obj = $db->fetch_object($resql); - - $var=!$var; - - print ''; - print ''; - print ""; - print ""; - print ''; - //Country - print ''; - //Type ent - print ''; - // Creation date - print ''; - // Level - print '"; - // Statut - print '"; - - print ''; - - // Extrafields - if (is_array($extrafields->attribute_list) && count($extrafields->attribute_list)) - { - foreach($extrafields->attribute_list as $key => $val) - { - if ($val) - { - print ''; - } - } - } - // Hook fields - $parameters=array('obj' => $obj); - $reshook=$hookmanager->executeHooks('printFieldListValue',$parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - - print ''; - - print ''; - - print "\n"; - $i++; - } - - if ($num > $conf->liste_limit || $page > 0) print_barre_liste('', $page, $_SERVER["PHP_SELF"],$param,$sortfield,$sortorder,'',$num,$nbtotalofrecords); - - 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 ''; - print ''; - $options_from = ''; // Generate in $options_from the list of each option sorted - foreach ($tab_level as $tab_level_sortorder => $tab_level_label) - { - $options_from .= ''; - } - array_reverse($tab_level, true); // Reverse the list - $options_to = ''; // Generate in $options_to the list of each option sorted in the reversed order - foreach ($tab_level as $tab_level_sortorder => $tab_level_label) - { - $options_to .= ''; - } - - // Print these two select - print $langs->trans("From").' '; - print ' '; - print $langs->trans("to").' '; - - print ''; - $arraystcomm=array(); - foreach($prospectstatic->cacheprospectstatus as $key => $val) - { - $arraystcomm[$val['id']]=$val['label']; - } - print $form->selectarray('search_stcomm', $arraystcomm, $search_stcomm, -2); - print ''; - print ' '; - print ''; - print $extrafields->showInputField($key, $crit, '', '', 'search_', 4); - print ''; - print $form->selectarray('search_status', array('0'=>$langs->trans('ActivityCeased'),'1'=>$langs->trans('InActivity')),$search_status); - print ''; - print ''; - print "
    '; - $prospectstatic->id=$obj->socid; - $prospectstatic->name=$obj->name; - $prospectstatic->status=$obj->status; - $prospectstatic->code_client=$obj->code_client; - $prospectstatic->client=$obj->client; - $prospectstatic->fk_prospectlevel=$obj->fk_prospectlevel; - $prospectstatic->name_alias=$obj->name_alias; - print $prospectstatic->getNomUrl(1,'prospect'); - print '".$obj->zip."".$obj->town."'.$obj->departement.''; - $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 ''.dol_print_date($db->jdate($obj->datec)).''; - print $prospectstatic->getLibProspLevel(); - print "'; - print $prospectstatic->LibProspCommStatut($obj->stcomm_id,2,$prospectstatic->cacheprospectstatus[$obj->stcomm_id]['label']); - print "'; - foreach($prospectstatic->cacheprospectstatus as $key => $val) - { - $titlealt='default'; - if (! empty($val['code']) && ! in_array($val['code'], array('ST_NO', 'ST_NEVER', 'ST_TODO', 'ST_PEND', 'ST_DONE'))) $titlealt=$val['label']; - if ($obj->stcomm_id != $val['id']) print ''.img_action($titlealt,$val['code']).''; - } - print ''; - $paramkey='options_'.$key; - print $extrafields->showOutputField($key, $obj->$paramkey); - print ''; - print $prospectstatic->LibStatut($prospectstatic->status,5); - print '
    "; - - print "
    "; - - $db->free($resql); - - $parameters=array('sql' => $sql); - $reshook=$hookmanager->executeHooks('printFieldListFooter',$parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; -} -else -{ - dol_print_error($db); -} - - -llxFooter(); -$db->close(); diff --git a/htdocs/core/class/html.formother.class.php b/htdocs/core/class/html.formother.class.php index 7adabcf819b71..51cf8a9c7a72e 100644 --- a/htdocs/core/class/html.formother.class.php +++ b/htdocs/core/class/html.formother.class.php @@ -302,7 +302,7 @@ function select_percent($selected=0,$htmlname='percent',$disabled=0,$increment=5 /** * Return select list for categories (to use in form search selectors) * - * @param int $type Type of categories (0=product, 1=suppliers, 2=customers, 3=members) + * @param int $type Type of categories (0=product, 1=supplier, 2=customer, 3=member, 4=contact) * @param integer $selected Preselected value * @param string $htmlname Name of combo list * @param int $nocateg Show also an entry "Not categorized" diff --git a/htdocs/core/menus/init_menu_auguria.sql b/htdocs/core/menus/init_menu_auguria.sql index ffcb21e6535d7..df0b9e4648827 100644 --- a/htdocs/core/menus/init_menu_auguria.sql +++ b/htdocs/core/menus/init_menu_auguria.sql @@ -71,9 +71,9 @@ 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->societe->enabled', __HANDLER__, 'left', 502__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/societe/list.php?action=create', 'List', 1, 'companies', '$user->rights->societe->lire', '', 2, 0, __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->societe->enabled && $conf->fournisseur->enabled', __HANDLER__, 'left', 503__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/societe/list.php?type=f&leftmenu=suppliers', 'ListSuppliersShort', 1, 'suppliers', '$user->rights->societe->lire && $user->rights->fournisseur->lire', '', 2, 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->societe->enabled && $conf->fournisseur->enabled', __HANDLER__, 'left', 504__+MAX_llx_menu__, 'companies', '', 503__+MAX_llx_menu__, '/societe/soc.php?leftmenu=supplier&action=create&type=f', 'NewSupplier', 2, 'suppliers', '$user->rights->societe->creer', '', 2, 0, __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->societe->enabled', __HANDLER__, 'left', 506__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/comm/prospect/list.php?leftmenu=prospects', 'ListProspectsShort', 1, 'companies', '$user->rights->societe->lire', '', 2, 3, __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->societe->enabled', __HANDLER__, 'left', 506__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/societe/list.php?type=p&leftmenu=prospects', 'ListProspectsShort', 1, 'companies', '$user->rights->societe->lire', '', 2, 3, __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->societe->enabled', __HANDLER__, 'left', 507__+MAX_llx_menu__, 'companies', '', 506__+MAX_llx_menu__, '/societe/soc.php?leftmenu=prospects&action=create&type=p', 'MenuNewProspect', 2, 'companies', '$user->rights->societe->creer', '', 2, 0, __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->societe->enabled', __HANDLER__, 'left', 509__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/comm/list.php?leftmenu=customers', 'ListCustomersShort', 1, 'companies', '$user->rights->societe->lire', '', 2, 4, __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->societe->enabled', __HANDLER__, 'left', 509__+MAX_llx_menu__, 'companies', '', 500__+MAX_llx_menu__, '/societe/list.php?type=c&leftmenu=customers', 'ListCustomersShort', 1, 'companies', '$user->rights->societe->lire', '', 2, 4, __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->societe->enabled', __HANDLER__, 'left', 510__+MAX_llx_menu__, 'companies', '', 509__+MAX_llx_menu__, '/societe/soc.php?leftmenu=customers&action=create&type=c', 'MenuNewCustomer', 2, 'companies', '$user->rights->societe->creer', '', 2, 0, __ENTITY__); -- Third parties - Contacts 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->societe->enabled', __HANDLER__, 'left', 600__+MAX_llx_menu__, 'companies', 'contacts', 2__+MAX_llx_menu__, '/contact/list.php?leftmenu=contacts', 'ContactsAddresses', 0, 'companies', '$user->rights->societe->lire', '', 2, 1, __ENTITY__); diff --git a/htdocs/core/menus/standard/eldy.lib.php b/htdocs/core/menus/standard/eldy.lib.php index 42701456c6e8b..49c076de4c8b1 100644 --- a/htdocs/core/menus/standard/eldy.lib.php +++ b/htdocs/core/menus/standard/eldy.lib.php @@ -590,13 +590,13 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu if (! empty($conf->societe->enabled) && empty($conf->global->SOCIETE_DISABLE_PROSPECTS)) { $langs->load("commercial"); - $newmenu->add("/comm/prospect/list.php?leftmenu=prospects", $langs->trans("ListProspectsShort"), 1, $user->rights->societe->lire, '', $mainmenu, 'prospects'); + $newmenu->add("/societe/list.php?type=p&leftmenu=prospects", $langs->trans("ListProspectsShort"), 1, $user->rights->societe->lire, '', $mainmenu, 'prospects'); /* no more required, there is a filter that can do more - if (empty($leftmenu) || $leftmenu=="prospects") $newmenu->add("/comm/prospect/list.php?sortfield=s.datec&sortorder=desc&begin=&search_stcomm=-1", $langs->trans("LastProspectDoNotContact"), 2, $user->rights->societe->lire); - if (empty($leftmenu) || $leftmenu=="prospects") $newmenu->add("/comm/prospect/list.php?sortfield=s.datec&sortorder=desc&begin=&search_stcomm=0", $langs->trans("LastProspectNeverContacted"), 2, $user->rights->societe->lire); - if (empty($leftmenu) || $leftmenu=="prospects") $newmenu->add("/comm/prospect/list.php?sortfield=s.datec&sortorder=desc&begin=&search_stcomm=1", $langs->trans("LastProspectToContact"), 2, $user->rights->societe->lire); - if (empty($leftmenu) || $leftmenu=="prospects") $newmenu->add("/comm/prospect/list.php?sortfield=s.datec&sortorder=desc&begin=&search_stcomm=2", $langs->trans("LastProspectContactInProcess"), 2, $user->rights->societe->lire); - if (empty($leftmenu) || $leftmenu=="prospects") $newmenu->add("/comm/prospect/list.php?sortfield=s.datec&sortorder=desc&begin=&search_stcomm=3", $langs->trans("LastProspectContactDone"), 2, $user->rights->societe->lire); + if (empty($leftmenu) || $leftmenu=="prospects") $newmenu->add("/societe/list.php?type=p&sortfield=s.datec&sortorder=desc&begin=&search_stcomm=-1", $langs->trans("LastProspectDoNotContact"), 2, $user->rights->societe->lire); + if (empty($leftmenu) || $leftmenu=="prospects") $newmenu->add("/societe/list.php?type=p&sortfield=s.datec&sortorder=desc&begin=&search_stcomm=0", $langs->trans("LastProspectNeverContacted"), 2, $user->rights->societe->lire); + if (empty($leftmenu) || $leftmenu=="prospects") $newmenu->add("/societe/list.php?type=p&sortfield=s.datec&sortorder=desc&begin=&search_stcomm=1", $langs->trans("LastProspectToContact"), 2, $user->rights->societe->lire); + if (empty($leftmenu) || $leftmenu=="prospects") $newmenu->add("/societe/list.php?type=p&sortfield=s.datec&sortorder=desc&begin=&search_stcomm=2", $langs->trans("LastProspectContactInProcess"), 2, $user->rights->societe->lire); + if (empty($leftmenu) || $leftmenu=="prospects") $newmenu->add("/societe/list.php?type=p&sortfield=s.datec&sortorder=desc&begin=&search_stcomm=3", $langs->trans("LastProspectContactDone"), 2, $user->rights->societe->lire); */ $newmenu->add("/societe/soc.php?leftmenu=prospects&action=create&type=p", $langs->trans("MenuNewProspect"), 2, $user->rights->societe->creer); //$newmenu->add("/contact/list.php?leftmenu=customers&type=p", $langs->trans("Contacts"), 2, $user->rights->societe->contact->lire); @@ -606,7 +606,7 @@ function print_left_eldy_menu($db,$menu_array_before,$menu_array_after,&$tabMenu if (! empty($conf->societe->enabled) && empty($conf->global->SOCIETE_DISABLE_CUSTOMERS)) { $langs->load("commercial"); - $newmenu->add("/comm/list.php?leftmenu=customers", $langs->trans("ListCustomersShort"), 1, $user->rights->societe->lire, '', $mainmenu, 'customers'); + $newmenu->add("/societe/list.php?type=c&leftmenu=customers", $langs->trans("ListCustomersShort"), 1, $user->rights->societe->lire, '', $mainmenu, 'customers'); $newmenu->add("/societe/soc.php?leftmenu=customers&action=create&type=c", $langs->trans("MenuNewCustomer"), 2, $user->rights->societe->creer); //$newmenu->add("/contact/list.php?leftmenu=customers&type=c", $langs->trans("Contacts"), 2, $user->rights->societe->contact->lire); diff --git a/htdocs/index.php b/htdocs/index.php index 2e1d019d2e705..5db358aa34bc8 100644 --- a/htdocs/index.php +++ b/htdocs/index.php @@ -231,8 +231,9 @@ "SuppliersInvoices", "ExpenseReports"); // Dashboard Link lines - $links=array(DOL_URL_ROOT.'/comm/list.php', - DOL_URL_ROOT.'/comm/prospect/list.php', + $links=array( + DOL_URL_ROOT.'/societe/list.php?type=c', + DOL_URL_ROOT.'/societe/list.php?type=p', DOL_URL_ROOT.'/societe/list.php?type=f', DOL_URL_ROOT.'/adherents/list.php?statut=1&mainmenu=members', DOL_URL_ROOT.'/product/list.php?type=0&mainmenu=products', diff --git a/htdocs/societe/index.php b/htdocs/societe/index.php index 86de804c6a118..ebe4b4c034277 100644 --- a/htdocs/societe/index.php +++ b/htdocs/societe/index.php @@ -143,13 +143,13 @@ if (! empty($conf->societe->enabled) && empty($conf->global->SOCIETE_DISABLE_PROSPECTS_STATS)) { $statstring = ""; - $statstring.= ''.$langs->trans("Prospects").''.round($third['prospect']).''; + $statstring.= ''.$langs->trans("Prospects").''.round($third['prospect']).''; $statstring.= ""; } if (! empty($conf->societe->enabled) && empty($conf->global->SOCIETE_DISABLE_CUSTOMERS_STATS)) { $statstring.= ""; - $statstring.= ''.$langs->trans("Customers").''.round($third['customer']).''; + $statstring.= ''.$langs->trans("Customers").''.round($third['customer']).''; $statstring.= ""; } if (! empty($conf->fournisseur->enabled) && empty($conf->global->SOCIETE_DISABLE_SUPPLIERS_STATS)) diff --git a/htdocs/societe/list.php b/htdocs/societe/list.php index 19301efd6e098..98795e276671f 100644 --- a/htdocs/societe/list.php +++ b/htdocs/societe/list.php @@ -31,10 +31,12 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; require_once DOL_DOCUMENT_ROOT.'/core/lib/company.lib.php'; require_once DOL_DOCUMENT_ROOT.'/core/class/html.formcompany.class.php'; +require_once DOL_DOCUMENT_ROOT.'/societe/class/client.class.php'; $langs->load("companies"); $langs->load("customers"); $langs->load("suppliers"); +$langs->load("bills"); // Security check $socid = GETPOST('socid','int'); @@ -64,10 +66,14 @@ $search_type_thirdparty=GETPOST("search_type_thirdparty",'int'); $search_type=GETPOST('search_type','alpha'); $search_status=GETPOST("search_status",'int'); +$search_level_from = GETPOST("search_level_from","alpha"); +$search_level_to = GETPOST("search_level_to","alpha"); +$search_stcomm=GETPOST('search_stcomm','int'); $type=GETPOST('type'); $optioncss=GETPOST('optioncss','alpha'); $mode=GETPOST("mode"); +$action=GETPOST('action'); $sortfield=GETPOST("sortfield",'alpha'); $sortorder=GETPOST("sortorder",'alpha'); @@ -116,6 +122,7 @@ if (!empty($conf->barcode->enabled)) $fieldstosearchall['s.barcode']='Gencod'; + /* * Actions */ @@ -126,6 +133,20 @@ include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php'; +if (empty($reshook)) +{ + if ($action == 'setstcomm') + { + $object = new Client($db); + $result=$object->fetch(GETPOST('stcommsocid')); + $object->stcomm_id=dol_getIdFromCode($db, GETPOST('stcomm','alpha'), 'c_stcomm'); + $result=$object->set_commnucation_level($user); + if ($result < 0) setEventMessages($object->error,$object->errors,'errors'); + + $action=''; + } +} + // special search /*if ($mode == 'search') { @@ -176,20 +197,6 @@ } */ - -/* - * View - */ - -$form=new Form($db); -$formother=new FormOther($db); -$companystatic=new Societe($db); -$formcompany=new FormCompany($db); - -$help_url='EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas'; -llxHeader('',$langs->trans("ThirdParty"),$help_url); - - // Do we click on purge search criteria ? if (GETPOST("button_removefilter_x") || GETPOST("button_removefilter.x") || GETPOST("button_removefilter")) // Both test are required to be compatible with all browsers { @@ -212,14 +219,18 @@ $search_country=''; $search_type_thirdparty=''; $search_status=''; + $search_stcomm=''; + $search_level_from=''; + $search_level_to=''; $search_array_options=array(); } if ($search_status=='') $search_status=1; // always display active thirdparty first + /* - * Mode List + * View */ /* @@ -230,13 +241,103 @@ External user socid=x + Permission to see ALL customers => Can see only himself External user socid=x + No permission to see ALL customers => Can see only himself */ + +$form=new Form($db); +$formother=new FormOther($db); +$companystatic=new Societe($db); +$formcompany=new FormCompany($db); +$prospectstatic=new Client($db); +$prospectstatic->client=2; +$prospectstatic->loadCacheOfProspStatus(); + +$help_url='EN:Module_Third_Parties|FR:Module_Tiers|ES:Empresas'; +llxHeader('',$langs->trans("ThirdParty"),$help_url); + + $title=$langs->trans("ListOfThirdParties"); if ($type == 'c' && (empty($search_type) || ($search_type == '1,3'))) $title=$langs->trans("ListOfCustomers"); if ($type == 'p' && (empty($search_type) || ($search_type == '2,3'))) $title=$langs->trans("ListOfProspects"); if ($type == 'f' && (empty($search_type) || ($search_type == '4'))) $title=$langs->trans("ListOfSuppliers"); -$sql = "SELECT s.rowid, s.nom as name, s.barcode, s.town, s.zip, s.datec, s.code_client, s.code_fournisseur, "; -$sql.= " st.libelle as stcomm, s.prefix_comm, s.client, s.fournisseur, s.canvas, s.status as status,"; +// If both parameters are set, search for everything BETWEEN them +if ($search_level_from != '' && $search_level_to != '') +{ + // Ensure that these parameters are numbers + $search_level_from = (int) $search_level_from; + $search_level_to = (int) $search_level_to; + + // If from is greater than to, reverse orders + if ($search_level_from > $search_level_to) + { + $tmp = $search_level_to; + $search_level_to = $search_level_from; + $search_level_from = $tmp; + } + + // Generate the SQL request + $sortwhere = '(sortorder BETWEEN '.$search_level_from.' AND '.$search_level_to.') AS is_in_range'; +} +// If only "from" parameter is set, search for everything GREATER THAN it +else if ($search_level_from != '') +{ + // Ensure that this parameter is a number + $search_level_from = (int) $search_level_from; + + // Generate the SQL request + $sortwhere = '(sortorder >= '.$search_level_from.') AS is_in_range'; +} +// If only "to" parameter is set, search for everything LOWER THAN it +else if ($search_level_to != '') +{ + // Ensure that this parameter is a number + $search_level_to = (int) $search_level_to; + + // Generate the SQL request + $sortwhere = '(sortorder <= '.$search_level_to.') AS is_in_range'; +} +// If no parameters are set, dont search for anything +else +{ + $sortwhere = '0 as is_in_range'; +} + +// Select every potentiels, and note each potentiels which fit in search parameters +dol_syslog('societe/list.php',LOG_DEBUG); +$sql = "SELECT code, label, sortorder, ".$sortwhere; +$sql.= " FROM ".MAIN_DB_PREFIX."c_prospectlevel"; +$sql.= " WHERE active > 0"; +$sql.= " ORDER BY sortorder"; + +$resql = $db->query($sql); +if ($resql) +{ + $tab_level = array(); + $search_levels = array(); + + while ($obj = $db->fetch_object($resql)) + { + // Compute level text + $level=$langs->trans($obj->code); + if ($level == $obj->code) $level=$langs->trans($obj->label); + + // Put it in the array sorted by sortorder + $tab_level[$obj->sortorder] = $level; + + // If this potentiel fit in parameters, add its code to the $search_levels array + if ($obj->is_in_range == 1) + { + $search_levels[] = '"'.preg_replace('[^A-Za-z0-9_-]', '', $obj->code).'"'; + } + } + + // Implode the $search_levels array so that it can be use in a "IN (...)" where clause. + // If no paramters was set, $search_levels will be empty + $search_levels = implode(',', $search_levels); +} +else dol_print_error($db); + +$sql = "SELECT s.rowid, s.nom as name, s.name_alias, s.barcode, s.town, s.zip, s.datec, s.code_client, s.code_fournisseur, "; +$sql.= " st.libelle as stcomm, s.fk_stcomm as stcomm_id, s.fk_prospectlevel, s.prefix_comm, s.client, s.fournisseur, s.canvas, s.status as status,"; $sql.= " s.siren as idprof1, s.siret as idprof2, ape as idprof3, idprof4 as idprof4,"; $sql.= " s.fk_pays, s.tms as date_update, s.datec as date_creation,"; $sql.= " typent.code as typent_code"; @@ -291,6 +392,8 @@ if (!empty($conf->barcode->enabled) && $search_barcode) $sql.= " AND s.barcode LIKE '%".$db->escape($search_barcode)."%'"; if ($search_country) $sql .= " AND s.fk_pays IN (".$search_country.')'; if ($search_type_thirdparty) $sql .= " AND s.fk_typent IN (".$search_type_thirdparty.')'; +if ($search_levels) $sql .= " AND s.fk_prospectlevel IN (".$search_levels.')'; +if ($search_stcomm != '' && $search_stcomm != -2) $sql.= natural_search("s.fk_stcomm",$search_stcomm,2); // Add where from extra fields foreach ($search_array_options as $key => $val) { @@ -348,6 +451,9 @@ if ($search_type_thirdparty != '') $param.='&search_type_thirdparty='.urlencode($search_type_thirdparty); if ($optioncss != '') $param.='&optioncss='.urlencode($optioncss); if ($search_status != '') $param.='&search_status='.urlencode($search_status); + if ($search_stcomm != '') $param.='&search_stcomm='.$search_stcomm; + if ($search_level_from != '') $param.='&search_level_from='.$search_level_from; + if ($search_level_to != '') $param.='&search_level_to='.$search_level_to; if ($type != '') $param.='&type='.urlencode($type); // Add $param from extra fields foreach ($search_array_options as $key => $val) @@ -400,7 +506,7 @@ require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php'; $moreforfilter.='
    '; $moreforfilter.=$langs->trans('Categories'). ': '; - $moreforfilter.=$formother->select_categories(Categorie::TYPE_CUSTOMER,$search_categ,'search_categ',1); + $moreforfilter.=$formother->select_categories('customer',$search_categ,'search_categ',1); $moreforfilter.='
    '; } // If the user can view prospects other than his' @@ -419,7 +525,7 @@ require_once DOL_DOCUMENT_ROOT . '/categories/class/categorie.class.php'; $moreforfilter.='
    '; $moreforfilter.=$langs->trans('Categories'). ': '; - $moreforfilter.=$formother->select_categories(Categorie::TYPE_SUPPLIER,$search_categ,'search_categ',1); + $moreforfilter.=$formother->select_categories('supplier',$search_categ,'search_categ',1); $moreforfilter.='
    '; } } @@ -436,16 +542,21 @@ // Define list of fields to show into list $checkedcustomercode=(in_array($contextpage, array('thirdpartylist', 'customerlist', 'prospectlist')) ? 1 : 0); $checkedsuppliercode=(in_array($contextpage, array('supplierlist')) ? 1 : 0); - $checkedcustomeraccountcode=(in_array($contextpage, array('thirdpartylist', 'customerlist', 'prospectlist')) ? 1 : 0); + $checkedcustomeraccountcode=(in_array($contextpage, array('customerlist')) ? 1 : 0); $checkedsupplieraccountcode=(in_array($contextpage, array('supplierlist')) ? 1 : 0); $checkedtypetiers=1; + $checkedprofid1=0; + $checkedprofid2=0; + $checkedprofid3=0; $checkedprofid4=0; $checkedprofid5=0; $checkedprofid6=0; //$checkedprofid4=((($tmp = $langs->transnoentities("ProfId4".$mysoc->country_code)) && $tmp != "ProfId4".$mysoc->country_code && $tmp != '-') ? 1 : 0); //$checkedprofid5=((($tmp = $langs->transnoentities("ProfId5".$mysoc->country_code)) && $tmp != "ProfId5".$mysoc->country_code && $tmp != '-') ? 1 : 0); //$checkedprofid6=((($tmp = $langs->transnoentities("ProfId6".$mysoc->country_code)) && $tmp != "ProfId6".$mysoc->country_code && $tmp != '-') ? 1 : 0); - $arrayfields=array( + $checkprospectlevel=(in_array($contextpage, array('prospectlist')) ? 1 : 0); + $checkstcomm=(in_array($contextpage, array('prospectlist')) ? 1 : 0); + $arrayfields=array( 's.nom'=>array('label'=>$langs->trans("Company"), 'checked'=>1), 's.barcode'=>array('label'=>$langs->trans("Gencod"), 'checked'=>1, 'enabled'=>(! empty($conf->barcode->enabled))), 's.code_client'=>array('label'=>$langs->trans("CustomerCodeShort"), 'checked'=>$checkedcustomercode), @@ -456,12 +567,14 @@ 's.zip'=>array('label'=>$langs->trans("Zip"), 'checked'=>1), 'country.code_iso'=>array('label'=>$langs->trans("Country"), 'checked'=>0), 'typent.code'=>array('label'=>$langs->trans("ThirdPartyType"), 'checked'=>$checkedtypetiers), - 's.siren'=>array('label'=>$langs->trans("ProfId1Short"), 'checked'=>1), - 's.siret'=>array('label'=>$langs->trans("ProfId2Short"), 'checked'=>1), - 's.ape'=>array('label'=>$langs->trans("ProfId3Short"), 'checked'=>1), + 's.siren'=>array('label'=>$langs->trans("ProfId1Short"), 'checked'=>$checkedprofid1), + 's.siret'=>array('label'=>$langs->trans("ProfId2Short"), 'checked'=>$checkedprofid2), + 's.ape'=>array('label'=>$langs->trans("ProfId3Short"), 'checked'=>$checkedprofid3), 's.idprof4'=>array('label'=>$langs->trans("ProfId4Short"), 'checked'=>$checkedprofid4), 's.idprof5'=>array('label'=>$langs->trans("ProfId5Short"), 'checked'=>$checkedprofid5), 's.idprof6'=>array('label'=>$langs->trans("ProfId6Short"), 'checked'=>$checkedprofid6), + 's.fk_prospectlevel'=>array('label'=>$langs->trans("ProspectLevelShort"), 'checked'=>$checkprospectlevel), + 's.fk_stcomm'=>array('label'=>$langs->trans("StatusProsp"), 'checked'=>$checkstcomm), 's.status'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>200), 's.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), 's.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500), @@ -488,7 +601,9 @@ if (! empty($arrayfields['s.idprof5']['checked'])) print_liste_field_titre($form->textwithpicto($langs->trans("ProfId5Short"),$textprofid[4],1,0),$_SERVER["PHP_SELF"],"s.idprof5","",$param,'class="nowrap"',$sortfield,$sortorder); if (! empty($arrayfields['s.idprof6']['checked'])) print_liste_field_titre($form->textwithpicto($langs->trans("ProfId6Short"),$textprofid[4],1,0),$_SERVER["PHP_SELF"],"s.idprof6","",$param,'class="nowrap"',$sortfield,$sortorder); print_liste_field_titre(''); // type of customer - // Extra fields + if (! empty($arrayfields['s.fk_prospectlevel']['checked'])) print_liste_field_titre($arrayfields['s.fk_prospectlevel']['label'],$_SERVER["PHP_SELF"],"s.fk_prospectlevel","",$param,'align="center"',$sortfield,$sortorder); + if (! empty($arrayfields['s.fk_stcomm']['checked'])) print_liste_field_titre($arrayfields['s.fk_stcomm']['label'],$_SERVER["PHP_SELF"],"s.fk_stcomm","",$param,'align="center"',$sortfield,$sortorder); + // Extra fields if (is_array($extrafields->attribute_list) && count($extrafields->attribute_list)) { foreach($extrafields->attribute_list as $key => $val) @@ -623,6 +738,7 @@ print ''; print ''; } + // Type (customer/prospect/supplier) print ''; print ''; + + if (! empty($arrayfields['s.fk_prospectlevel']['checked'])) + { + // Prospect level + print ''; + $options_from = ''; // Generate in $options_from the list of each option sorted + foreach ($tab_level as $tab_level_sortorder => $tab_level_label) + { + $options_from .= ''; + } + array_reverse($tab_level, true); // Reverse the list + $options_to = ''; // Generate in $options_to the list of each option sorted in the reversed order + foreach ($tab_level as $tab_level_sortorder => $tab_level_label) + { + $options_to .= ''; + } + + // Print these two select + print $langs->trans("From").' '; + print ' '; + print $langs->trans("to").' '; + + print ''; + } + + if (! empty($arrayfields['s.fk_stcomm']['checked'])) + { + // Prospect status + print ''; + $arraystcomm=array(); + foreach($prospectstatic->cacheprospectstatus as $key => $val) + { + $arraystcomm[$val['id']]=$val['label']; + } + print $form->selectarray('search_stcomm', $arraystcomm, $search_stcomm, -2); + print ''; + } + // Fields from hook $parameters=array('arrayfields'=>$arrayfields); $reshook=$hookmanager->executeHooks('printFieldListOption',$parameters); // Note that $action and $object may have been modified by hook @@ -671,18 +829,22 @@ { $obj = $db->fetch_object($resql); $var=!$var; + + $companystatic->id=$obj->rowid; + $companystatic->name=$obj->name; + $companystatic->canvas=$obj->canvas; + $companystatic->client=$obj->client; + $companystatic->status=$obj->status; + $companystatic->fournisseur=$obj->fournisseur; + $companystatic->code_client=$obj->code_client; + $companystatic->code_fournisseur=$obj->code_fournisseur; + $companystatic->fk_prospectlevel=$obj->fk_prospectlevel; + $companystatic->name_alias=$obj->name_alias; + print ""; if (! empty($arrayfields['s.nom']['checked'])) { print ""; - $companystatic->id=$obj->rowid; - $companystatic->name=$obj->name; - $companystatic->canvas=$obj->canvas; - $companystatic->client=$obj->client; - $companystatic->status=$obj->status; - $companystatic->fournisseur=$obj->fournisseur; - $companystatic->code_client=$obj->code_client; - $companystatic->code_fournisseur=$obj->code_fournisseur; print $companystatic->getNomUrl(1,'',100); print "\n"; } @@ -761,6 +923,7 @@ { print "".$obj->idprof6."\n"; } + // Type print ''; $s=''; if (($obj->client==1 || $obj->client==3) && empty($conf->global->SOCIETE_DISABLE_CUSTOMERS)) @@ -782,6 +945,28 @@ } print $s; print ''; + if (! empty($arrayfields['s.fk_prospectlevel']['checked'])) + { + // Prospect level + print ''; + print $companystatic->getLibProspLevel(); + print ""; + } + if (! empty($arrayfields['s.fk_stcomm']['checked'])) + { + // Prospect status + print '
    '; + print '
    '.$companystatic->LibProspCommStatut($obj->stcomm_id,2,$prospectstatic->cacheprospectstatus[$obj->stcomm_id]['label']); + print '
    -
    '; + foreach($prospectstatic->cacheprospectstatus as $key => $val) + { + $titlealt='default'; + if (! empty($val['code']) && ! in_array($val['code'], array('ST_NO', 'ST_NEVER', 'ST_TODO', 'ST_PEND', 'ST_DONE'))) $titlealt=$val['label']; + if ($obj->stcomm_id != $val['id']) print ''.img_action($titlealt,$val['code']).''; + } + print '
    '; + } + // 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 From f6d30d8b9e908c7d44ff9862ff7dbe19c990582c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 23 Oct 2015 14:40:45 +0200 Subject: [PATCH 245/297] Fix: W3C no form into table --- htdocs/admin/mailman.php | 30 +++++++++++----- htdocs/admin/spip.php | 68 ++++++++++++++++++++--------------- htdocs/core/lib/admin.lib.php | 6 ++-- 3 files changed, 64 insertions(+), 40 deletions(-) diff --git a/htdocs/admin/mailman.php b/htdocs/admin/mailman.php index 686da7fc68c39..e3aab979a4179 100644 --- a/htdocs/admin/mailman.php +++ b/htdocs/admin/mailman.php @@ -99,7 +99,7 @@ if (! isValidEmail($email)) { $langs->load("errors"); - setEventMessage($langs->trans("ErrorBadEMail",$email),'errors'); + setEventMessages($langs->trans("ErrorBadEMail",$email), null, 'errors'); } else { @@ -118,11 +118,11 @@ if ($result < 0) { $error++; - setEventMessage($mailmanspip->error,'errors'); + setEventMessages($mailmanspip->error,$mailmanspip->errors,'errors'); } else { - setEventMessage($langs->trans("MailmanCreationSuccess")); + setEventMessages($langs->trans("MailmanCreationSuccess"), null); } } if ($action == 'testunsubscribe') @@ -131,11 +131,11 @@ if ($result < 0) { $error++; - setEventMessage($mailmanspip->error,'errors'); + setEventMessages($mailmanspip->error,$mailmanspip->errors,'errors'); } else { - setEventMessage($langs->trans("MailmanDeletionSuccess")); + setEventMessages($langs->trans("MailmanDeletionSuccess"), null); } } } @@ -156,12 +156,15 @@ $head = mailmanspip_admin_prepare_head(); -dol_fiche_head($head, 'mailman', $langs->trans("Setup"), 0, 'user'); $var=true; if (! empty($conf->global->ADHERENT_USE_MAILMAN)) { + print '
    '; + + dol_fiche_head($head, 'mailman', $langs->trans("Setup"), 0, 'user'); + //$link=img_picto($langs->trans("Active"),'tick').' '; $link=''; //$link.=$langs->trans("Disable"); @@ -200,21 +203,30 @@ }); '; - form_constantes($constantes,1); - + form_constantes($constantes,2); + print '*'.$langs->trans("FollowingConstantsWillBeSubstituted").'
    '; print '%LISTE%, %MAILMAN_ADMINPW%, %EMAIL%
    '; + + dol_fiche_end(); + + print '
    '; + + print ''; } else { + dol_fiche_head($head, 'mailman', $langs->trans("Setup"), 0, 'user'); + $link='
    '; //$link.=img_$langs->trans("Activate") $link.=img_picto($langs->trans("Disabled"),'switch_off'); $link.=''; print load_fiche_titre($langs->trans('MailmanTitle'), $link,''); + + dol_fiche_end(); } -dol_fiche_end(); if (! empty($conf->global->ADHERENT_USE_MAILMAN)) { diff --git a/htdocs/admin/spip.php b/htdocs/admin/spip.php index e46d9b8f5b7db..13d959eb38ce1 100644 --- a/htdocs/admin/spip.php +++ b/htdocs/admin/spip.php @@ -54,28 +54,30 @@ $constname=GETPOST("constname"); $constvalue=GETPOST("constvalue"); - if (($constname=='ADHERENT_CARD_TYPE' || $constname=='ADHERENT_ETIQUETTE_TYPE') && $constvalue == -1) $constvalue=''; - if ($constname=='ADHERENT_LOGIN_NOT_REQUIRED') // Invert choice - { - if ($constvalue) $constvalue=0; - else $constvalue=1; - } - - if (in_array($constname,array('ADHERENT_MAIL_VALID','ADHERENT_MAIL_COTIS','ADHERENT_MAIL_RESIL'))) $constvalue=$_POST["constvalue".$constname]; - $consttype=$_POST["consttype"]; - $constnote=GETPOST("constnote"); - $res=dolibarr_set_const($db,$constname,$constvalue,$type[$consttype],0,$constnote,$conf->entity); - - if (! $res > 0) $error++; - - if (! $error) - { - setEventMessage($langs->trans("SetupSaved")); - } - else - { - setEventMessage($langs->trans("Error"),'errors'); - } + // Action mise a jour ou ajout d'une constante + if ($action == 'update' || $action == 'add') + { + foreach($_POST['constname'] as $key => $val) + { + $constname=$_POST["constname"][$key]; + $constvalue=$_POST["constvalue"][$key]; + $consttype=$_POST["consttype"][$key]; + $constnote=$_POST["constnote"][$key]; + + $res=dolibarr_set_const($db,$constname,$constvalue,$type[$consttype],0,$constnote,$conf->entity); + + if (! $res > 0) $error++; + } + + if (! $error) + { + setEventMessage($langs->trans("SetupSaved")); + } + else + { + setEventMessage($langs->trans("Error"),'errors'); + } + } } // Action activation d'un sous module du module adherent @@ -115,7 +117,6 @@ $head = mailmanspip_admin_prepare_head(); -dol_fiche_head($head, 'spip', $langs->trans("Setup"), 0, 'user'); $var=true; @@ -124,6 +125,10 @@ */ if (! empty($conf->global->ADHERENT_USE_SPIP)) { + print '
    '; + + dol_fiche_head($head, 'spip', $langs->trans("Setup"), 0, 'user'); + //$link=img_picto($langs->trans("Active"),'tick').' '; $link=''; //$link.=$langs->trans("Disable"); @@ -139,21 +144,28 @@ print load_fiche_titre($langs->trans('SPIPTitle'), $link, ''); print '
    '; - form_constantes($constantes); - print '
    '; + + form_constantes($constantes,2); + + dol_fiche_end(); + + print '
    '; + + print ''; } else { + dol_fiche_head($head, 'spip', $langs->trans("Setup"), 0, 'user'); + $link='
    '; //$link.=$langs->trans("Activate"); $link.=img_picto($langs->trans("Disabled"),'switch_off'); $link.=''; print load_fiche_titre($langs->trans('SPIPTitle'), $link, ''); + + dol_fiche_end(); } - -dol_fiche_end(); - llxFooter(); $db->close(); diff --git a/htdocs/core/lib/admin.lib.php b/htdocs/core/lib/admin.lib.php index 3d887f1bd18a7..7b22a2e8dbe2d 100644 --- a/htdocs/core/lib/admin.lib.php +++ b/htdocs/core/lib/admin.lib.php @@ -1053,7 +1053,7 @@ function complete_elementList_with_modules(&$elementList) * Show array with constants to edit * * @param array $tableau Array of constants - * @param int $strictw3c Respect W3C (no form into table) + * @param int $strictw3c 0=Include form into table (deprecated), 1=Form is outside table to respect W3C (no form into table), 2=No form nor button at all * @return void */ function form_constantes($tableau,$strictw3c=0) @@ -1062,7 +1062,7 @@ function form_constantes($tableau,$strictw3c=0) $form = new Form($db); - if (! empty($strictw3c)) print "\n".'
    '; + if (! empty($strictw3c) && $strictw3c == 1) print "\n".''; print ''; print ''; @@ -1199,7 +1199,7 @@ function form_constantes($tableau,$strictw3c=0) } print '
    '; - if (! empty($strictw3c)) + if (! empty($strictw3c) && $strictw3c == 1) { print '
    '; print "
    \n"; From a01a85c3f6eb7afc589f7c666a2533647d8e9d32 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 23 Oct 2015 15:13:02 +0200 Subject: [PATCH 246/297] FIX tag object_total_vat_x need x to be a string with unknown decimal lenght. Now use for x the real vat real with no more decimal (x = 20 or x = 8.5 or x = 5.99, ...) --- htdocs/core/class/commondocgenerator.class.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/htdocs/core/class/commondocgenerator.class.php b/htdocs/core/class/commondocgenerator.class.php index 41ae45ef638d4..24c2fe34a93f9 100644 --- a/htdocs/core/class/commondocgenerator.class.php +++ b/htdocs/core/class/commondocgenerator.class.php @@ -388,11 +388,16 @@ function get_substitutionarray_object($object,$outputlangs,$array_key='object') // Add vat by rates foreach ($object->lines as $line) { + // $line->tva_tx format depends on database field accuraty, no reliable. This is kept for backward comaptibility if (empty($resarray[$array_key.'_total_vat_'.$line->tva_tx])) $resarray[$array_key.'_total_vat_'.$line->tva_tx]=0; $resarray[$array_key.'_total_vat_'.$line->tva_tx]+=$line->total_tva; $resarray[$array_key.'_total_vat_locale_'.$line->tva_tx]=price($resarray[$array_key.'_total_vat_'.$line->tva_tx]); + // $vatformated is vat without not expected chars (so 20, or 8.5 or 5.99 for example) + $vatformated=vatrate($line->tva_tx); + if (empty($resarray[$array_key.'_total_vat_'.$vatformated])) $resarray[$array_key.'_total_vat_'.$vatformated]=0; + $resarray[$array_key.'_total_vat_'.$vatformated]+=$line->total_tva; + $resarray[$array_key.'_total_vat_locale_'.$vatformated]=price($resarray[$array_key.'_total_vat_'.$vatformated]); } - // Retrieve extrafields if (is_array($object->array_options) && count($object->array_options)) { From 016dbd39ee6535bb8099a9b2a2d3ed31305e951f Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 23 Oct 2015 15:24:47 +0200 Subject: [PATCH 247/297] Fix sql phpunit regression --- htdocs/install/mysql/migration/3.9.0-4.0.0.sql | 2 -- htdocs/install/mysql/tables/llx_user.sql | 2 +- htdocs/user/class/user.class.php | 10 +++++++--- 3 files changed, 8 insertions(+), 6 deletions(-) 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 231b89ee507dd..accf65266c1b9 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 @@ -86,5 +86,3 @@ CREATE TABLE IF NOT EXISTS llx_establishment ( status tinyint DEFAULT 1 ) ENGINE=InnoDB; -ALTER TABLE llx_user ADD COLUMN employee tinyint DEFAULT 0 AFTER ref_int; - diff --git a/htdocs/install/mysql/tables/llx_user.sql b/htdocs/install/mysql/tables/llx_user.sql index c9673ceb360e1..e1fc421c91179 100644 --- a/htdocs/install/mysql/tables/llx_user.sql +++ b/htdocs/install/mysql/tables/llx_user.sql @@ -26,7 +26,7 @@ create table llx_user ref_ext varchar(50), -- reference into an external system (not used by dolibarr) ref_int varchar(50), -- reference into an internal system (deprecated) - employee tinyint DEFAULT 0, -- 1 if user is an employee + employee tinyint DEFAULT 1, -- 1 if user is an employee datec datetime, tms timestamp, diff --git a/htdocs/user/class/user.class.php b/htdocs/user/class/user.class.php index 066da9c18da5b..ae56be28aec3f 100644 --- a/htdocs/user/class/user.class.php +++ b/htdocs/user/class/user.class.php @@ -126,13 +126,17 @@ function __construct($db) { $this->db = $db; - // Preference utilisateur + // User preference $this->liste_limit = 0; $this->clicktodial_loaded = 0; + // For cache usage $this->all_permissions_are_loaded = 0; - $this->admin=0; - + + // Force some default values + $this->admin = 0; + $this->employee = 1; + $this->conf = new stdClass(); $this->rights = new stdClass(); $this->rights->user = new stdClass(); From 2cbfb69f9b70c851cd2e13a25010d91ab472f843 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 23 Oct 2015 15:28:14 +0200 Subject: [PATCH 248/297] Update template --- .../invoices/template_invoice.odt | Bin 25534 -> 37996 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/htdocs/install/doctemplates/invoices/template_invoice.odt b/htdocs/install/doctemplates/invoices/template_invoice.odt index e9cd7c836fb0363394d73d3579ca7f84cb33cb01..dad29a292efcae907c1af651f8caae0fba453ec1 100644 GIT binary patch delta 36631 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 Q8tJGz?h?nUG7eGy0kU*u5&!@I literal 25534 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 Date: Fri, 23 Oct 2015 19:01:50 +0200 Subject: [PATCH 249/297] Update index.php --- htdocs/accountancy/customer/index.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/accountancy/customer/index.php b/htdocs/accountancy/customer/index.php index ea37f23745565..5cf4dac19b1f0 100644 --- a/htdocs/accountancy/customer/index.php +++ b/htdocs/accountancy/customer/index.php @@ -86,7 +86,7 @@ setEventMessage($db->lasterror(), 'errors'); } else { $db->commit(); - setEventMessage($langs->trans('Dispatched'), 'mesgs'); + setEventMessages($langs->trans('Dispatched'), null, 'mesgs'); } } @@ -346,4 +346,4 @@ print ''; llxFooter(); -$db->close(); \ No newline at end of file +$db->close(); From c007ae9361777c261ac107a3014b6451b39d476c Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 24 Oct 2015 13:16:59 +0200 Subject: [PATCH 250/297] Fix php code not executed with some php version --- htdocs/theme/eldy/style.css.php | 2 +- htdocs/theme/md/style.css.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/htdocs/theme/eldy/style.css.php b/htdocs/theme/eldy/style.css.php index 45ca3a5b72800..1307304d1d607 100644 --- a/htdocs/theme/eldy/style.css.php +++ b/htdocs/theme/eldy/style.css.php @@ -699,7 +699,7 @@ display:none; - padding-: px; + padding-: px; } diff --git a/htdocs/theme/md/style.css.php b/htdocs/theme/md/style.css.php index 0fa988c16e8e1..4749d52f89c83 100644 --- a/htdocs/theme/md/style.css.php +++ b/htdocs/theme/md/style.css.php @@ -731,7 +731,7 @@ display:none; - /* padding-: px; */ + /* padding-: px; */ } From 43c80bec7d81a61c4f38759e3232562a6826f9fb Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 24 Oct 2015 13:52:35 +0200 Subject: [PATCH 251/297] A better responsive menu for very small screen --- htdocs/main.inc.php | 12 ++++-------- htdocs/theme/eldy/style.css.php | 21 +++++++++++++++++---- htdocs/theme/md/style.css.php | 20 +++++++++++++++++--- htdocs/user/class/user.class.php | 31 +++++++++++++++++++++---------- 4 files changed, 59 insertions(+), 25 deletions(-) diff --git a/htdocs/main.inc.php b/htdocs/main.inc.php index ffc7d7c477786..4ece8af95c2a7 100644 --- a/htdocs/main.inc.php +++ b/htdocs/main.inc.php @@ -1485,14 +1485,10 @@ function top_menu($head, $title='', $target='', $disablejs=0, $disablehead=0, $a // Add login user link $toprightmenu.='