From cf55b54cf561aadc3b2422b5dce9fb83f76a4fe5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20FRANCE?= Date: Mon, 14 Jan 2019 10:02:48 +0100 Subject: [PATCH 01/40] correct list of links --- htdocs/core/class/html.formfile.class.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/core/class/html.formfile.class.php b/htdocs/core/class/html.formfile.class.php index a1e1049b045..acaf6c2e61e 100644 --- a/htdocs/core/class/html.formfile.class.php +++ b/htdocs/core/class/html.formfile.class.php @@ -776,16 +776,16 @@ class FormFile { $colspan=2; - foreach($link_list as $file) + foreach($link_list as $link) { $out.=''; $out.=''; $out.=''; - $out.=$file->label; + $out.=$link->label; $out.=''; $out.=''; $out.=''; - $out.=dol_print_date($file->datea,'dayhour'); + $out.=dol_print_date($link->datea,'dayhour'); $out.=''; if ($delallowed || $printer || $morepicto) $out.=''; $out.=''."\n"; From d997309bcb278f2aeebdfacaf6fffb00ae7154bb Mon Sep 17 00:00:00 2001 From: gauthier Date: Thu, 17 Jan 2019 14:49:04 +0100 Subject: [PATCH 02/40] FIX : if(!method_exists(dol_loginfunction)) --- htdocs/core/lib/security2.lib.php | 324 +++++++++++++++--------------- 1 file changed, 163 insertions(+), 161 deletions(-) diff --git a/htdocs/core/lib/security2.lib.php b/htdocs/core/lib/security2.lib.php index d0def9d5627..ea05adf79f7 100644 --- a/htdocs/core/lib/security2.lib.php +++ b/htdocs/core/lib/security2.lib.php @@ -126,179 +126,181 @@ function checkLoginPassEntity($usertotest,$passwordtotest,$entitytotest,$authmod * @param Societe $mysoc Company object * @return void */ -function dol_loginfunction($langs,$conf,$mysoc) -{ - global $dolibarr_main_demo,$db; - global $smartphone,$hookmanager; - - // Instantiate hooks of thirdparty module only if not already define - $hookmanager->initHooks(array('mainloginpage')); - - $langs->load("main"); - $langs->load("other"); - $langs->load("help"); - $langs->load("admin"); - - $main_authentication=$conf->file->main_authentication; - $session_name=session_name(); - - $dol_url_root = DOL_URL_ROOT; - - // Title - $appli=constant('DOL_APPLICATION_TITLE'); - $title=$appli.' '.constant('DOL_VERSION'); - if (! empty($conf->global->MAIN_APPLICATION_TITLE)) $title=$conf->global->MAIN_APPLICATION_TITLE; - $titletruedolibarrversion=constant('DOL_VERSION'); // $title used by login template after the @ to inform of true Dolibarr version - - // Note: $conf->css looks like '/theme/eldy/style.css.php' - $conf->css = "/theme/".(GETPOST('theme','alpha')?GETPOST('theme','alpha'):$conf->theme)."/style.css.php"; - $themepath=dol_buildpath($conf->css,1); - if (! empty($conf->modules_parts['theme'])) // Using this feature slow down application +if (! function_exists('dol_loginfunction')) { + function dol_loginfunction($langs,$conf,$mysoc) { - foreach($conf->modules_parts['theme'] as $reldir) + global $dolibarr_main_demo,$db; + global $smartphone,$hookmanager; + + // Instantiate hooks of thirdparty module only if not already define + $hookmanager->initHooks(array('mainloginpage')); + + $langs->load("main"); + $langs->load("other"); + $langs->load("help"); + $langs->load("admin"); + + $main_authentication=$conf->file->main_authentication; + $session_name=session_name(); + + $dol_url_root = DOL_URL_ROOT; + + // Title + $appli=constant('DOL_APPLICATION_TITLE'); + $title=$appli.' '.constant('DOL_VERSION'); + if (! empty($conf->global->MAIN_APPLICATION_TITLE)) $title=$conf->global->MAIN_APPLICATION_TITLE; + $titletruedolibarrversion=constant('DOL_VERSION'); // $title used by login template after the @ to inform of true Dolibarr version + + // Note: $conf->css looks like '/theme/eldy/style.css.php' + $conf->css = "/theme/".(GETPOST('theme','alpha')?GETPOST('theme','alpha'):$conf->theme)."/style.css.php"; + $themepath=dol_buildpath($conf->css,1); + if (! empty($conf->modules_parts['theme'])) // Using this feature slow down application { - if (file_exists(dol_buildpath($reldir.$conf->css, 0))) + foreach($conf->modules_parts['theme'] as $reldir) { - $themepath=dol_buildpath($reldir.$conf->css, 1); - break; + if (file_exists(dol_buildpath($reldir.$conf->css, 0))) + { + $themepath=dol_buildpath($reldir.$conf->css, 1); + break; + } } } - } - $conf_css = $themepath."?lang=".$langs->defaultlang; - - // Select templates dir - if (! empty($conf->modules_parts['tpl'])) // Using this feature slow down application - { - $dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl/')); - foreach($dirtpls as $reldir) + $conf_css = $themepath."?lang=".$langs->defaultlang; + + // Select templates dir + if (! empty($conf->modules_parts['tpl'])) // Using this feature slow down application { - $tmp=dol_buildpath($reldir.'login.tpl.php'); - if (file_exists($tmp)) { $template_dir=preg_replace('/login\.tpl\.php$/','',$tmp); break; } + $dirtpls=array_merge($conf->modules_parts['tpl'],array('/core/tpl/')); + foreach($dirtpls as $reldir) + { + $tmp=dol_buildpath($reldir.'login.tpl.php'); + if (file_exists($tmp)) { $template_dir=preg_replace('/login\.tpl\.php$/','',$tmp); break; } + } } - } - else - { - $template_dir = DOL_DOCUMENT_ROOT."/core/tpl/"; - } - - // Set cookie for timeout management - $prefix=dol_getprefix(); - $sessiontimeout='DOLSESSTIMEOUT_'.$prefix; - if (! empty($conf->global->MAIN_SESSION_TIMEOUT)) setcookie($sessiontimeout, $conf->global->MAIN_SESSION_TIMEOUT, 0, "/", '', 0); - - if (GETPOST('urlfrom','alpha')) $_SESSION["urlfrom"]=GETPOST('urlfrom','alpha'); - else unset($_SESSION["urlfrom"]); - - if (! GETPOST("username")) $focus_element='username'; - else $focus_element='password'; - - $demologin=''; - $demopassword=''; - if (! empty($dolibarr_main_demo)) - { - $tab=explode(',',$dolibarr_main_demo); - $demologin=$tab[0]; - $demopassword=$tab[1]; - } - - // Execute hook getLoginPageOptions (for table) - $parameters=array('entity' => GETPOST('entity','int')); - $reshook = $hookmanager->executeHooks('getLoginPageOptions',$parameters); // Note that $action and $object may have been modified by some hooks. - if (is_array($hookmanager->resArray) && ! empty($hookmanager->resArray)) { - $morelogincontent = $hookmanager->resArray; // (deprecated) For compatibility - } else { - $morelogincontent = $hookmanager->resPrint; - } - - // Execute hook getLoginPageExtraOptions (eg for js) - $parameters=array('entity' => GETPOST('entity','int')); - $reshook = $hookmanager->executeHooks('getLoginPageExtraOptions',$parameters); // Note that $action and $object may have been modified by some hooks. - $moreloginextracontent = $hookmanager->resPrint; - - // Login - $login = (! empty($hookmanager->resArray['username']) ? $hookmanager->resArray['username'] : (GETPOST("username","alpha") ? GETPOST("username","alpha") : $demologin)); - $password = $demopassword; - - // Show logo (search in order: small company logo, large company logo, theme logo, common logo) - $width=0; - $urllogo=DOL_URL_ROOT.'/theme/login_logo.png'; - - if (! empty($mysoc->logo_small) && is_readable($conf->mycompany->dir_output.'/logos/thumbs/'.$mysoc->logo_small)) - { - $urllogo=DOL_URL_ROOT.'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode('thumbs/'.$mysoc->logo_small); - } - elseif (! empty($mysoc->logo) && is_readable($conf->mycompany->dir_output.'/logos/'.$mysoc->logo)) - { - $urllogo=DOL_URL_ROOT.'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode($mysoc->logo); - $width=128; - } - elseif (is_readable(DOL_DOCUMENT_ROOT.'/theme/'.$conf->theme.'/img/dolibarr_logo.png')) - { - $urllogo=DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/dolibarr_logo.png'; - } - elseif (is_readable(DOL_DOCUMENT_ROOT.'/theme/dolibarr_logo.png')) - { - $urllogo=DOL_URL_ROOT.'/theme/dolibarr_logo.png'; - } - - // Security graphical code - $captcha=0; - $captcha_refresh=''; - if (function_exists("imagecreatefrompng") && ! empty($conf->global->MAIN_SECURITY_ENABLECAPTCHA)) - { - $captcha=1; - $captcha_refresh=img_picto($langs->trans("Refresh"),'refresh','id="captcha_refresh_img"'); - } - - // Extra link - $forgetpasslink=0; - $helpcenterlink=0; - if (empty($conf->global->MAIN_SECURITY_DISABLEFORGETPASSLINK) || empty($conf->global->MAIN_HELPCENTER_DISABLELINK)) - { - if (empty($conf->global->MAIN_SECURITY_DISABLEFORGETPASSLINK)) + else { - $forgetpasslink=1; + $template_dir = DOL_DOCUMENT_ROOT."/core/tpl/"; } - - if (empty($conf->global->MAIN_HELPCENTER_DISABLELINK)) + + // Set cookie for timeout management + $prefix=dol_getprefix(); + $sessiontimeout='DOLSESSTIMEOUT_'.$prefix; + if (! empty($conf->global->MAIN_SESSION_TIMEOUT)) setcookie($sessiontimeout, $conf->global->MAIN_SESSION_TIMEOUT, 0, "/", '', 0); + + if (GETPOST('urlfrom','alpha')) $_SESSION["urlfrom"]=GETPOST('urlfrom','alpha'); + else unset($_SESSION["urlfrom"]); + + if (! GETPOST("username")) $focus_element='username'; + else $focus_element='password'; + + $demologin=''; + $demopassword=''; + if (! empty($dolibarr_main_demo)) { - $helpcenterlink=1; + $tab=explode(',',$dolibarr_main_demo); + $demologin=$tab[0]; + $demopassword=$tab[1]; } + + // Execute hook getLoginPageOptions (for table) + $parameters=array('entity' => GETPOST('entity','int')); + $reshook = $hookmanager->executeHooks('getLoginPageOptions',$parameters); // Note that $action and $object may have been modified by some hooks. + if (is_array($hookmanager->resArray) && ! empty($hookmanager->resArray)) { + $morelogincontent = $hookmanager->resArray; // (deprecated) For compatibility + } else { + $morelogincontent = $hookmanager->resPrint; + } + + // Execute hook getLoginPageExtraOptions (eg for js) + $parameters=array('entity' => GETPOST('entity','int')); + $reshook = $hookmanager->executeHooks('getLoginPageExtraOptions',$parameters); // Note that $action and $object may have been modified by some hooks. + $moreloginextracontent = $hookmanager->resPrint; + + // Login + $login = (! empty($hookmanager->resArray['username']) ? $hookmanager->resArray['username'] : (GETPOST("username","alpha") ? GETPOST("username","alpha") : $demologin)); + $password = $demopassword; + + // Show logo (search in order: small company logo, large company logo, theme logo, common logo) + $width=0; + $urllogo=DOL_URL_ROOT.'/theme/login_logo.png'; + + if (! empty($mysoc->logo_small) && is_readable($conf->mycompany->dir_output.'/logos/thumbs/'.$mysoc->logo_small)) + { + $urllogo=DOL_URL_ROOT.'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode('thumbs/'.$mysoc->logo_small); + } + elseif (! empty($mysoc->logo) && is_readable($conf->mycompany->dir_output.'/logos/'.$mysoc->logo)) + { + $urllogo=DOL_URL_ROOT.'/viewimage.php?cache=1&modulepart=mycompany&file='.urlencode($mysoc->logo); + $width=128; + } + elseif (is_readable(DOL_DOCUMENT_ROOT.'/theme/'.$conf->theme.'/img/dolibarr_logo.png')) + { + $urllogo=DOL_URL_ROOT.'/theme/'.$conf->theme.'/img/dolibarr_logo.png'; + } + elseif (is_readable(DOL_DOCUMENT_ROOT.'/theme/dolibarr_logo.png')) + { + $urllogo=DOL_URL_ROOT.'/theme/dolibarr_logo.png'; + } + + // Security graphical code + $captcha=0; + $captcha_refresh=''; + if (function_exists("imagecreatefrompng") && ! empty($conf->global->MAIN_SECURITY_ENABLECAPTCHA)) + { + $captcha=1; + $captcha_refresh=img_picto($langs->trans("Refresh"),'refresh','id="captcha_refresh_img"'); + } + + // Extra link + $forgetpasslink=0; + $helpcenterlink=0; + if (empty($conf->global->MAIN_SECURITY_DISABLEFORGETPASSLINK) || empty($conf->global->MAIN_HELPCENTER_DISABLELINK)) + { + if (empty($conf->global->MAIN_SECURITY_DISABLEFORGETPASSLINK)) + { + $forgetpasslink=1; + } + + if (empty($conf->global->MAIN_HELPCENTER_DISABLELINK)) + { + $helpcenterlink=1; + } + } + + // Home message + $main_home=''; + if (! empty($conf->global->MAIN_HOME)) + { + $substitutionarray=getCommonSubstitutionArray($langs); + complete_substitutions_array($substitutionarray, $langs); + $texttoshow = make_substitutions($conf->global->MAIN_HOME, $substitutionarray, $langs); + + $main_home=dol_htmlcleanlastbr($texttoshow); + } + + // Google AD + $main_google_ad_client = ((! empty($conf->global->MAIN_GOOGLE_AD_CLIENT) && ! empty($conf->global->MAIN_GOOGLE_AD_SLOT))?1:0); + + // Set jquery theme + $dol_loginmesg = (! empty($_SESSION["dol_loginmesg"])?$_SESSION["dol_loginmesg"]:''); + $favicon=dol_buildpath('/theme/'.$conf->theme.'/img/favicon.ico',1); + if (! empty($conf->global->MAIN_FAVICON_URL)) $favicon=$conf->global->MAIN_FAVICON_URL; + $jquerytheme = 'smoothness'; + if (! empty($conf->global->MAIN_USE_JQUERY_THEME)) $jquerytheme = $conf->global->MAIN_USE_JQUERY_THEME; + + // Set dol_hide_topmenu, dol_hide_leftmenu, dol_optimize_smallscreen, dol_no_mouse_hover + $dol_hide_topmenu=GETPOST('dol_hide_topmenu','int'); + $dol_hide_leftmenu=GETPOST('dol_hide_leftmenu','int'); + $dol_optimize_smallscreen=GETPOST('dol_optimize_smallscreen','int'); + $dol_no_mouse_hover=GETPOST('dol_no_mouse_hover','int'); + $dol_use_jmobile=GETPOST('dol_use_jmobile','int'); + + // Include login page template + include $template_dir.'login.tpl.php'; + + + $_SESSION["dol_loginmesg"] = ''; } - - // Home message - $main_home=''; - if (! empty($conf->global->MAIN_HOME)) - { - $substitutionarray=getCommonSubstitutionArray($langs); - complete_substitutions_array($substitutionarray, $langs); - $texttoshow = make_substitutions($conf->global->MAIN_HOME, $substitutionarray, $langs); - - $main_home=dol_htmlcleanlastbr($texttoshow); - } - - // Google AD - $main_google_ad_client = ((! empty($conf->global->MAIN_GOOGLE_AD_CLIENT) && ! empty($conf->global->MAIN_GOOGLE_AD_SLOT))?1:0); - - // Set jquery theme - $dol_loginmesg = (! empty($_SESSION["dol_loginmesg"])?$_SESSION["dol_loginmesg"]:''); - $favicon=dol_buildpath('/theme/'.$conf->theme.'/img/favicon.ico',1); - if (! empty($conf->global->MAIN_FAVICON_URL)) $favicon=$conf->global->MAIN_FAVICON_URL; - $jquerytheme = 'smoothness'; - if (! empty($conf->global->MAIN_USE_JQUERY_THEME)) $jquerytheme = $conf->global->MAIN_USE_JQUERY_THEME; - - // Set dol_hide_topmenu, dol_hide_leftmenu, dol_optimize_smallscreen, dol_no_mouse_hover - $dol_hide_topmenu=GETPOST('dol_hide_topmenu','int'); - $dol_hide_leftmenu=GETPOST('dol_hide_leftmenu','int'); - $dol_optimize_smallscreen=GETPOST('dol_optimize_smallscreen','int'); - $dol_no_mouse_hover=GETPOST('dol_no_mouse_hover','int'); - $dol_use_jmobile=GETPOST('dol_use_jmobile','int'); - - // Include login page template - include $template_dir.'login.tpl.php'; - - - $_SESSION["dol_loginmesg"] = ''; } /** From 1d33b6ccbb64f3fbeb3ef1270b1ceeb6e239b915 Mon Sep 17 00:00:00 2001 From: Regis Houssin Date: Thu, 17 Jan 2019 16:01:32 +0100 Subject: [PATCH 03/40] FIX broken external authentication module feature and avoid warning --- htdocs/cashdesk/class/Facturation.class.php | 3 +-- htdocs/cashdesk/index.php | 29 +++++++++++++++++++++ htdocs/cashdesk/tpl/liste_articles.tpl.php | 3 +-- 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/htdocs/cashdesk/class/Facturation.class.php b/htdocs/cashdesk/class/Facturation.class.php index a0e992e9da9..e76f6c3a142 100644 --- a/htdocs/cashdesk/class/Facturation.class.php +++ b/htdocs/cashdesk/class/Facturation.class.php @@ -211,8 +211,7 @@ class Facturation $total_localtax1 = 0; $total_localtax2 = 0; - $tab=array(); - $tab = $_SESSION['poscart']; + $tab = (! empty($_SESSION['poscart'])?$_SESSION['poscart']:array()); $tab_size=count($tab); for($i=0;$i < $tab_size;$i++) diff --git a/htdocs/cashdesk/index.php b/htdocs/cashdesk/index.php index 24b94562915..c09521585e6 100644 --- a/htdocs/cashdesk/index.php +++ b/htdocs/cashdesk/index.php @@ -41,6 +41,8 @@ if ( $_SESSION['uid'] > 0 ) $usertxt=GETPOST('user','',1); $err=GETPOST("err"); +// Instantiate hooks of thirdparty module only if not already define +$hookmanager->initHooks(array('cashdeskloginpage')); /* * View @@ -51,6 +53,15 @@ $formproduct=new FormProduct($db); $arrayofcss=array('/cashdesk/css/style.css'); top_htmlhead('','',0,0,'',$arrayofcss); + +// Execute hook getLoginPageOptions (for table) +$parameters=array('entity' => GETPOST('entity','int')); +$reshook = $hookmanager->executeHooks('getLoginPageOptions',$parameters); // Note that $action and $object may have been modified by some hooks. +if (is_array($hookmanager->resArray) && ! empty($hookmanager->resArray)) { + $morelogincontent = $hookmanager->resArray; // (deprecated) For compatibility +} else { + $morelogincontent = $hookmanager->resPrint; +} ?> @@ -92,6 +103,24 @@ else + $option) + { + if ($format == 'table') { + echo ''; + echo $option; + } + } + } + else { + echo ''; + echo $morelogincontent; + } +} +?> +   diff --git a/htdocs/cashdesk/tpl/liste_articles.tpl.php b/htdocs/cashdesk/tpl/liste_articles.tpl.php index 65f48b0603c..082a1f901cd 100644 --- a/htdocs/cashdesk/tpl/liste_articles.tpl.php +++ b/htdocs/cashdesk/tpl/liste_articles.tpl.php @@ -46,8 +46,7 @@ $societe = new Societe($db); $societe->fetch($thirdpartyid); /** end add Ditto */ -$tab=array(); -$tab = $_SESSION['poscart']; +$tab = (! empty($_SESSION['poscart'])?$_SESSION['poscart']:array()); $tab_size=count($tab); if ($tab_size <= 0) print '
'.$langs->trans("NoArticle").'

'; From 5e47f17cd710b8159dfe7d8d3752ca6e3634001f Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 17 Jan 2019 17:36:14 +0100 Subject: [PATCH 04/40] Display fk_type in subscription --- htdocs/adherents/subscription/list.php | 52 ++++++++++++++++++++------ 1 file changed, 40 insertions(+), 12 deletions(-) diff --git a/htdocs/adherents/subscription/list.php b/htdocs/adherents/subscription/list.php index 730ff4e9854..7ef9b36487c 100644 --- a/htdocs/adherents/subscription/list.php +++ b/htdocs/adherents/subscription/list.php @@ -25,10 +25,11 @@ require '../../main.inc.php'; require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; +require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php'; require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; -$langs->load(array("members","companies")); +$langs->loadLangs(array("members","companies")); $action=GETPOST('action','aZ09'); $massaction=GETPOST('massaction','alpha'); @@ -38,6 +39,7 @@ $toselect = GETPOST('toselect', 'array'); $filter=GETPOST("filter","alpha"); $statut=(GETPOSTISSET("statut")?GETPOST("statut","alpha"):1); $search_ref=GETPOST('search_ref','alpha'); +$search_type=GETPOST('search_type','alpha'); $search_lastname=GETPOST('search_lastname','alpha'); $search_firstname=GETPOST('search_firstname','alpha'); $search_login=GETPOST('search_login','alpha'); @@ -74,10 +76,11 @@ $fieldstosearchall = array( ); $arrayfields=array( 'd.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1), + 'd.fk_type'=>array('label'=>$langs->trans("Type"), 'checked'=>1), 'd.lastname'=>array('label'=>$langs->trans("Lastname"), 'checked'=>1), 'd.firstname'=>array('label'=>$langs->trans("Firstname"), 'checked'=>1), 'd.login'=>array('label'=>$langs->trans("Login"), 'checked'=>1), - 't.libelle'=>array('label'=>$langs->trans("Type"), 'checked'=>1), + 't.libelle'=>array('label'=>$langs->trans("Label"), 'checked'=>1), 'd.bank'=>array('label'=>$langs->trans("BankAccount"), 'checked'=>1, 'enabled'=>(! empty($conf->banque->enabled))), /*'d.note_public'=>array('label'=>$langs->trans("NotePublic"), 'checked'=>0), 'd.note_private'=>array('label'=>$langs->trans("NotePrivate"), 'checked'=>0),*/ @@ -112,16 +115,17 @@ if (empty($reshook)) // Purge search criteria if (GETPOST('button_removefilter_x','alpha') || GETPOST('button_removefilter.x','alpha') || GETPOST('button_removefilter','alpha')) // All tests are required to be compatible with all browsers { - $search=""; - $search_ref=""; - $search_lastname=""; + $search=""; + $search_type=""; + $search_ref=""; + $search_lastname=""; $search_firstname=""; $search_login=""; - $search_note=""; + $search_note=""; $search_amount=""; $search_account=""; - $toselect=''; - $search_array_options=array(); + $toselect=''; + $search_array_options=array(); } } @@ -139,7 +143,7 @@ $now=dol_now(); // List of subscriptions $sql = "SELECT d.rowid, d.login, d.firstname, d.lastname, d.societe, d.photo,"; -$sql.= " c.rowid as crowid, c.subscription,"; +$sql.= " c.rowid as crowid, c.fk_type, c.subscription,"; $sql.= " c.dateadh, c.datef, c.datec as date_creation, c.tms as date_update,"; $sql.= " c.fk_bank as bank, c.note,"; $sql.= " b.fk_account"; @@ -157,6 +161,7 @@ if ($search_ref) if (is_numeric($search_ref)) $sql.= " AND (c.rowid = ".$db->escape($search_ref).")"; else $sql.=" AND 1 = 2"; // Always wrong } +if ($search_type) $sql.= natural_search(array('c.fk_type'), $search_type); if ($search_lastname) $sql.= natural_search(array('d.lastname','d.societe'), $search_lastname); if ($search_firstname) $sql.= natural_search(array('d.firstname'), $search_firstname); if ($search_login) $sql.= natural_search('d.login', $search_login); @@ -220,6 +225,7 @@ $param=''; if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.urlencode($contextpage); if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.urlencode($limit); if ($statut != '') $param.="&statut=".urlencode($statut); +if ($search_type) $param.="&search_type=".urlencode($search_type); if ($date_select) $param.="&date_select=".urlencode($date_select); if ($search_lastname) $param.="&search_lastname=".urlencode($search_lastname); if ($search_login) $param.="&search_login=".urlencode($search_login); @@ -297,6 +303,14 @@ if (! empty($arrayfields['d.ref']['checked'])) print ''; } +// Type +if (! empty($arrayfields['d.fk_type']['checked'])) +{ + print ''; + print ''; + print''; +} + if (! empty($arrayfields['d.lastname']['checked'])) { print ''; @@ -379,6 +393,10 @@ if (! empty($arrayfields['d.ref']['checked'])) { print_liste_field_titre("Ref",$_SERVER["PHP_SELF"],"c.rowid",$param,"","",$sortfield,$sortorder); } +if (! empty($arrayfields['d.fk_type']['checked'])) +{ + print_liste_field_titre("Type",$_SERVER["PHP_SELF"],"c.fk_type",$param,"","",$sortfield,$sortorder); +} if (! empty($arrayfields['d.lastname']['checked'])) { print_liste_field_titre("LastName",$_SERVER["PHP_SELF"],"d.lastname",$param,"","",$sortfield,$sortorder); @@ -441,7 +459,9 @@ while ($i < min($num, $limit)) $adherent->statut=$obj->statut; $adherent->login=$obj->login; $adherent->photo=$obj->photo; - + + $adht = new AdherentType($db); + $adht->fetch($obj->fk_type); print ''; @@ -451,6 +471,14 @@ while ($i < min($num, $limit)) print ''.$subscription->getNomUrl(1).''; if (! $i) $totalarray['nbfield']++; } + // Type + if (! empty($arrayfields['d.fk_type']['checked'])) + { + print ''; + if ( ! empty($obj->fk_type) ) print $adht->getNomUrl(1); + print ''; + if (! $i) $totalarray['nbfield']++; + } // Lastname if (! empty($arrayfields['d.lastname']['checked'])) @@ -568,8 +596,8 @@ if (isset($totalarray['pos'])) { if ($i == 1) { - if ($num < $limit) print ''.$langs->trans("Total").''; - else print ''.$langs->trans("Totalforthispage").''; + if ($num < $limit) print ''.$langs->trans("Total").''; + else print ''.$langs->trans("Totalforthispage").''; } else print ''; } From 65189aa4f01e43944b34405962982682310acc44 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 17 Jan 2019 17:37:39 +0100 Subject: [PATCH 05/40] display / update adherent type --- htdocs/adherents/subscription/card.php | 872 +++++++++++++++---------- 1 file changed, 540 insertions(+), 332 deletions(-) diff --git a/htdocs/adherents/subscription/card.php b/htdocs/adherents/subscription/card.php index c951f36db6e..7ef9b36487c 100644 --- a/htdocs/adherents/subscription/card.php +++ b/htdocs/adherents/subscription/card.php @@ -1,6 +1,7 @@ - * Copyright (C) 2018 Frédéric France +/* Copyright (C) 2001-2002 Rodolphe Quiedeville + * Copyright (C) 2003 Jean-Louis Bergamo + * Copyright (C) 2004-2016 Laurent Destailleur * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -17,405 +18,612 @@ */ /** - * \file htdocs/adherents/subscription/card.php - * \ingroup member - * \brief Page to add/edit/remove a member subscription + * \file htdocs/adherents/subscription/list.php + * \ingroup member + * \brief list of subscription */ require '../../main.inc.php'; -require_once DOL_DOCUMENT_ROOT.'/core/lib/member.lib.php'; require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; +require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php'; require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php'; -if (! empty($conf->banque->enabled)) { - require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; -} +require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; -// Load translation files required by the page -$langs->loadLangs(array("companies","members","bills","users")); +$langs->loadLangs(array("members","companies")); + +$action=GETPOST('action','aZ09'); +$massaction=GETPOST('massaction','alpha'); +$confirm=GETPOST('confirm','alpha'); +$toselect = GETPOST('toselect', 'array'); + +$filter=GETPOST("filter","alpha"); +$statut=(GETPOSTISSET("statut")?GETPOST("statut","alpha"):1); +$search_ref=GETPOST('search_ref','alpha'); +$search_type=GETPOST('search_type','alpha'); +$search_lastname=GETPOST('search_lastname','alpha'); +$search_firstname=GETPOST('search_firstname','alpha'); +$search_login=GETPOST('search_login','alpha'); +$search_note=GETPOST('search_note','alpha'); +$search_account=GETPOST('search_account','int'); +$search_amount=GETPOST('search_amount','alpha'); +$optioncss = GETPOST('optioncss','alpha'); + +$date_select=GETPOST("date_select",'alpha'); + +$limit = GETPOST('limit','int')?GETPOST('limit','int'):$conf->liste_limit; +$sortfield = GETPOST("sortfield",'alpha'); +$sortorder = GETPOST("sortorder",'alpha'); +$page = GETPOST("page",'int'); +if (empty($page) || $page == -1) { $page = 0; } // If $page is not defined, or '' or -1 +$offset = $limit * $page ; +$pageprev = $page - 1; +$pagenext = $page + 1; +if (! $sortorder) { $sortorder="DESC"; } +if (! $sortfield) { $sortfield="c.dateadh"; } -$adh = new Adherent($db); $object = new Subscription($db); -$errmsg=''; -$action=GETPOST("action",'alpha'); -$rowid=GETPOST("rowid","int")?GETPOST("rowid","int"):GETPOST("id","int"); -$typeid=GETPOST("typeid","int"); -$cancel=GETPOST('cancel','alpha'); -$confirm=GETPOST('confirm'); +// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context +$hookmanager->initHooks(array('subscriptionlist')); +$extrafields = new ExtraFields($db); -if (! $user->rights->adherent->cotisation->lire) - accessforbidden(); +// fetch optionals attributes and labels +$extralabels = $extrafields->fetch_name_optionals_label('subscription'); +$search_array_options=$extrafields->getOptionalsFromPost($object->table_element,'','search_'); -$permissionnote = $user->rights->adherent->cotisation->creer; // Used by the include of actions_setnotes.inc.php -$permissiondellink=$user->rights->adherent->cotisation->creer; // Used by the include of actions_dellink.inc.php -$permissiontoedit = $user->rights->adherent->cotisation->creer; // Used by the include of actions_lineupdonw.inc.php +// List of fields to search into when doing a "search in all" +$fieldstosearchall = array( +); +$arrayfields=array( + 'd.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1), + 'd.fk_type'=>array('label'=>$langs->trans("Type"), 'checked'=>1), + 'd.lastname'=>array('label'=>$langs->trans("Lastname"), 'checked'=>1), + 'd.firstname'=>array('label'=>$langs->trans("Firstname"), 'checked'=>1), + 'd.login'=>array('label'=>$langs->trans("Login"), 'checked'=>1), + 't.libelle'=>array('label'=>$langs->trans("Label"), 'checked'=>1), + 'd.bank'=>array('label'=>$langs->trans("BankAccount"), 'checked'=>1, 'enabled'=>(! empty($conf->banque->enabled))), + /*'d.note_public'=>array('label'=>$langs->trans("NotePublic"), 'checked'=>0), + 'd.note_private'=>array('label'=>$langs->trans("NotePrivate"), 'checked'=>0),*/ + 'd.datedebut'=>array('label'=>$langs->trans("DateSubscription"), 'checked'=>1, 'position'=>100), + 'd.datefin'=>array('label'=>$langs->trans("EndSubscription"), 'checked'=>1, 'position'=>101), + 'd.amount'=>array('label'=>$langs->trans("Amount"), 'checked'=>1, 'position'=>102), + 'd.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), + 'd.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500), +// 'd.statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000) +); + +// Security check +$result=restrictedArea($user,'adherent','','','cotisation'); /* - * Actions + * Actions */ -if ($cancel) $action=''; +if (GETPOST('cancel','alpha')) { $action='list'; $massaction=''; } +if (! GETPOST('confirmmassaction','alpha') && $massaction != 'presend' && $massaction != 'confirm_presend' && $massaction != 'confirm_createbills') { $massaction=''; } -//include DOL_DOCUMENT_ROOT.'/core/actions_setnotes.inc.php'; // Must be include, not include_once +$parameters=array('socid'=>$socid); +$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks +if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); -include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php'; // Must be include, not include_once - -//include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php'; // Must be include, not include_once - - -if ($user->rights->adherent->cotisation->creer && $action == 'update' && ! $cancel) +if (empty($reshook)) { - // Charge objet actuel - $result=$object->fetch($rowid); - if ($result > 0) - { - $db->begin(); + // Selection of new fields + include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php'; - $errmsg=''; - - if ($object->fk_bank) - { - $accountline=new AccountLine($db); - $result=$accountline->fetch($object->fk_bank); - - // If transaction consolidated - if ($accountline->rappro) - { - $errmsg=$langs->trans("SubscriptionLinkedToConciliatedTransaction"); - } - else - { - $accountline->datev=dol_mktime($_POST['datesubhour'], $_POST['datesubmin'], 0, $_POST['datesubmonth'], $_POST['datesubday'], $_POST['datesubyear']); - $accountline->dateo=dol_mktime($_POST['datesubhour'], $_POST['datesubmin'], 0, $_POST['datesubmonth'], $_POST['datesubday'], $_POST['datesubyear']); - $accountline->amount=$_POST["amount"]; - $result=$accountline->update($user); - if ($result < 0) - { - $errmsg=$accountline->error; - } - } - } - - if (! $errmsg) - { - // Modifie valeures - $object->dateh=dol_mktime($_POST['datesubhour'], $_POST['datesubmin'], 0, $_POST['datesubmonth'], $_POST['datesubday'], $_POST['datesubyear']); - $object->datef=dol_mktime($_POST['datesubendhour'], $_POST['datesubendmin'], 0, $_POST['datesubendmonth'], $_POST['datesubendday'], $_POST['datesubendyear']); - $object->note=$_POST["note"]; - $object->amount=$_POST["amount"]; - //print 'datef='.$object->datef.' '.$_POST['datesubendday']; - - $result=$object->update($user); - if ($result >= 0 && ! count($object->errors)) - { - $db->commit(); - - header("Location: card.php?rowid=".$object->id); - exit; - } - else - { - $db->rollback(); - - if ($object->error) - { - $errmsg=$object->error; - } - else - { - foreach($object->errors as $error) - { - if ($errmsg) $errmsg.='
'; - $errmsg.=$error; - } - } - $action=''; - } - } - else - { - $db->rollback(); - } - } -} - -if ($action == 'confirm_delete' && $confirm == 'yes' && $user->rights->adherent->cotisation->creer) -{ - $result=$object->fetch($rowid); - $result=$object->delete($user); - if ($result > 0) + // Purge search criteria + if (GETPOST('button_removefilter_x','alpha') || GETPOST('button_removefilter.x','alpha') || GETPOST('button_removefilter','alpha')) // All tests are required to be compatible with all browsers { - header("Location: ".DOL_URL_ROOT."/adherents/card.php?rowid=".$object->fk_adherent); - exit; - } - else - { - $mesg=$adh->error; + $search=""; + $search_type=""; + $search_ref=""; + $search_lastname=""; + $search_firstname=""; + $search_login=""; + $search_note=""; + $search_amount=""; + $search_account=""; + $toselect=''; + $search_array_options=array(); } } - /* * View */ -$form = new Form($db); +$form=new Form($db); +$subscription=new Subscription($db); +$adherent=new Adherent($db); +$accountstatic=new Account($db); +$now=dol_now(); -llxHeader('',$langs->trans("SubscriptionCard"),'EN:Module_Foundations|FR:Module_Adhérents|ES:Módulo_Miembros'); - - -dol_htmloutput_errors($errmsg); - - -if ($user->rights->adherent->cotisation->creer && $action == 'edit') +// List of subscriptions +$sql = "SELECT d.rowid, d.login, d.firstname, d.lastname, d.societe, d.photo,"; +$sql.= " c.rowid as crowid, c.fk_type, c.subscription,"; +$sql.= " c.dateadh, c.datef, c.datec as date_creation, c.tms as date_update,"; +$sql.= " c.fk_bank as bank, c.note,"; +$sql.= " b.fk_account"; +$sql.= " FROM ".MAIN_DB_PREFIX."adherent as d, ".MAIN_DB_PREFIX."subscription as c"; +$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."bank as b ON c.fk_bank=b.rowid"; +$sql.= " WHERE d.rowid = c.fk_adherent"; +$sql.= " AND d.entity IN (".getEntity('adherent').")"; +if (isset($date_select) && $date_select != '') { - /******************************************** - * - * Subscription card in edit mode - * - ********************************************/ + $sql.= " AND c.dateadh >= '".$date_select."-01-01 00:00:00'"; + $sql.= " AND c.dateadh < '".($date_select+1)."-01-01 00:00:00'"; +} +if ($search_ref) +{ + if (is_numeric($search_ref)) $sql.= " AND (c.rowid = ".$db->escape($search_ref).")"; + else $sql.=" AND 1 = 2"; // Always wrong +} +if ($search_type) $sql.= natural_search(array('c.fk_type'), $search_type); +if ($search_lastname) $sql.= natural_search(array('d.lastname','d.societe'), $search_lastname); +if ($search_firstname) $sql.= natural_search(array('d.firstname'), $search_firstname); +if ($search_login) $sql.= natural_search('d.login', $search_login); +if ($search_note) $sql.= natural_search('c.note', $search_note); +if ($search_account > 0) $sql.= " AND b.fk_account = ".urldecode($search_account); +if ($search_amount) $sql.= natural_search('c.subscription', $search_amount, 1); - $object->fetch($rowid); - $result=$adh->fetch($object->fk_adherent); +// Add where from extra fields +include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php'; - $head = subscription_prepare_head($object); +// 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; - print '
'; - print ''; - print ""; - print ""; - print "fk_bank."\">"; +$sql.= $db->order($sortfield,$sortorder); - dol_fiche_head($head, 'general', $langs->trans("Subscription"), 0, 'payment'); +// Count total nb of records with no order and no limits +$nbtotalofrecords = ''; +if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) +{ + $resql = $db->query($sql); + if ($resql) $nbtotalofrecords = $db->num_rows($resql); + else dol_print_error($db); + if (($page * $limit) > $nbtotalofrecords) // if total resultset is smaller then paging size (filtering), goto and load page 0 + { + $page = 0; + $offset = 0; + } +} +// Add limit +$sql.= $db->plimit($limit+1, $offset); - $linkback = ''.$langs->trans("BackToList").''; - - print "\n"; - print ''; - - // Ref - print ''; - print ''; - - // Member - $adh->ref=$adh->getFullName($langs); - print ''; - print ''; - print ''; - - // Date start subscription - print ''; - print ''; - - // Date end subscription - print ''; - print ''; - - // Amount - print ''; - - // Label - print ''; - - // Bank line - if (! empty($conf->banque->enabled)) - { - if ($conf->global->ADHERENT_BANK_USE || $object->fk_bank) - { - print ''; - } - } - - print '
'.$langs->trans("Ref").''; - print $form->showrefnav($object, 'rowid', $linkback, 1); - print '
'.$langs->trans("Member").''.$adh->getNomUrl(1,0,'subscription').'
'.$langs->trans("DateSubscription").''; - print $form->selectDate($object->dateh, 'datesub', 1, 1, 0, 'update', 1); - print '
'.$langs->trans("DateEndSubscription").''; - print $form->selectDate($object->datef, 'datesubend', 0, 0, 0, 'update', 1); - print '
'.$langs->trans("Amount").''; - print '
'.$langs->trans("Label").''; - print '
'.$langs->trans("BankTransactionLine").''; - if ($object->fk_bank) - { - $bankline=new AccountLine($db); - $result=$bankline->fetch($object->fk_bank); - print $bankline->getNomUrl(1,0,'showall'); - } - else - { - print $langs->trans("NoneF"); - } - print '
'; - - dol_fiche_end(); - - print '
'; - print ''; - print '       '; - print ''; - print '
'; - - print '
'; - print "\n"; +$result = $db->query($sql); +if (! $result) +{ + dol_print_error($db); + exit; } -if ($rowid && $action != 'edit') +$num = $db->num_rows($result); + +$arrayofselected=is_array($toselect)?$toselect:array(); + +if ($num == 1 && ! empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $sall) { - /******************************************** - * - * Subscription card in view mode - * - ********************************************/ + $obj = $db->fetch_object($resql); + $id = $obj->rowid; + header("Location: ".DOL_URL_ROOT.'/adherents/subscription/card.php?id='.$id); + exit; +} - $result=$object->fetch($rowid); - $result=$adh->fetch($object->fk_adherent); +llxHeader('',$langs->trans("ListOfSubscriptions"),'EN:Module_Foundations|FR:Module_Adhérents|ES:Módulo_Miembros'); - $head = subscription_prepare_head($object); +$i = 0; - dol_fiche_head($head, 'general', $langs->trans("Subscription"), -1, 'payment'); +$title=$langs->trans("ListOfSubscriptions"); +if (! empty($date_select)) $title.=' ('.$langs->trans("Year").' '.$date_select.')'; - // Confirmation to delete subscription - if ($action == 'delete') - { - //$formquestion=array(); - //$formquestion['text']=''.$langs->trans("ThisWillAlsoDeleteBankRecord").''; - $text=$langs->trans("ConfirmDeleteSubscription"); - if (! empty($conf->banque->enabled) && ! empty($conf->global->ADHERENT_BANK_USE)) $text.='
'.img_warning().' '.$langs->trans("ThisWillAlsoDeleteBankRecord"); - print $form->formconfirm($_SERVER["PHP_SELF"]."?rowid=".$object->id,$langs->trans("DeleteSubscription"),$text,"confirm_delete",$formquestion,0,1); - } +$param=''; +if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.urlencode($contextpage); +if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.urlencode($limit); +if ($statut != '') $param.="&statut=".urlencode($statut); +if ($search_type) $param.="&search_type=".urlencode($search_type); +if ($date_select) $param.="&date_select=".urlencode($date_select); +if ($search_lastname) $param.="&search_lastname=".urlencode($search_lastname); +if ($search_login) $param.="&search_login=".urlencode($search_login); +if ($search_acount) $param.="&search_account=".urlencode($search_account); +if ($search_amount) $param.="&search_amount=".urlencode($search_amount); +if ($optioncss != '') $param.='&optioncss='.urlencode($optioncss); +// Add $param from extra fields +include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; - print '
'; - print ''; +// List of mass actions available +$arrayofmassactions = array( + //'presend'=>$langs->trans("SendByMail"), + //'builddoc'=>$langs->trans("PDFMerge"), +); +//if ($user->rights->adherent->supprimer) $arrayofmassactions['predelete']=$langs->trans("Delete"); +if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array(); +$massactionbutton=$form->selectMassAction('', $arrayofmassactions); - $linkback = ''.$langs->trans("BackToList").''; +$newcardbutton=''; +if ($user->rights->adherent->cotisation->creer) +{ + $newcardbutton=''.$langs->trans('NewSubscription').''; + $newcardbutton.= ''; + $newcardbutton.= ''; +} - dol_banner_tab($object, 'rowid', $linkback, 1); +print ''; +if ($optioncss != '') print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; - print '
'; +print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_generic.png', 0, $newcardbutton, '', $limit); - print '
'; +$topicmail="Information"; +$modelmail="subscription"; +$objecttmp=new Subscription($db); +$trackid='sub'.$object->id; +include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php'; - print ''; +if ($sall) +{ + foreach($fieldstosearchall as $key => $val) $fieldstosearchall[$key]=$langs->trans($val); + print '
'.$langs->trans("FilterOnInto", $sall) . join(', ',$fieldstosearchall).'
'; +} - // Member - $adh->ref=$adh->getFullName($langs); - print ''; - print ''; - print ''; +$moreforfilter = ''; - // Date record - /*print ''; - print ''; - print '';*/ +$varpage=empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage; +$selectedfields=$form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields +if ($massactionbutton) $selectedfields.=$form->showCheckAddButtons('checkforselect', 1); - // Date subscription - print ''; - print ''; - print ''; +print '
'; +print '
'.$langs->trans("Member").''.$adh->getNomUrl(1,0,'subscription').'
'.$langs->trans("DateSubscription").''.dol_print_date($object->datec,'dayhour').'
'.$langs->trans("DateSubscription").''.dol_print_date($object->dateh,'day').'
'."\n"; - // Date end subscription - print ''; - print ''; - print ''; - // Amount - print ''; +// Line for filters fields +print ''; - // Amount - print ''; +// Line numbering +if (! empty($conf->global->MAIN_SHOW_TECHNICAL_ID)) +{ + print ''; +} - // Bank line - if (! empty($conf->banque->enabled)) +// Ref +if (! empty($arrayfields['d.ref']['checked'])) +{ + print ''; +} + +// Type +if (! empty($arrayfields['d.fk_type']['checked'])) +{ + print ''; +} + +if (! empty($arrayfields['d.lastname']['checked'])) +{ + print ''; +} + +if (! empty($arrayfields['d.firstname']['checked'])) +{ + print ''; +} + +if (! empty($arrayfields['d.login']['checked'])) +{ + print ''; +} + +if (! empty($arrayfields['t.libelle']['checked'])) +{ + print ''; +} + +if (! empty($arrayfields['d.bank']['checked'])) +{ + print ''; +} + +if (! empty($arrayfields['d.date_debut']['checked'])) +{ + print ''; +} + +if (! empty($arrayfields['d.date_fin']['checked'])) +{ + print ''; +} + +if (! empty($arrayfields['d.amount']['checked'])) +{ + print ''; +} +// Extra fields +include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php'; + +// Fields from hook +$parameters=array('arrayfields'=>$arrayfields); +$reshook=$hookmanager->executeHooks('printFieldListOption',$parameters); // Note that $action and $object may have been modified by hook +print $hookmanager->resPrint; +// Date creation +if (! empty($arrayfields['d.datec']['checked'])) +{ + print ''; +} +// Date modification +if (! empty($arrayfields['d.tms']['checked'])) +{ + print ''; +} + +// Action column +print ''; + +print "\n"; + + +print ''; +if (! empty($arrayfields['d.ref']['checked'])) +{ + print_liste_field_titre("Ref",$_SERVER["PHP_SELF"],"c.rowid",$param,"","",$sortfield,$sortorder); +} +if (! empty($arrayfields['d.fk_type']['checked'])) +{ + print_liste_field_titre("Type",$_SERVER["PHP_SELF"],"c.fk_type",$param,"","",$sortfield,$sortorder); +} +if (! empty($arrayfields['d.lastname']['checked'])) +{ + print_liste_field_titre("LastName",$_SERVER["PHP_SELF"],"d.lastname",$param,"","",$sortfield,$sortorder); +} +if (! empty($arrayfields['d.firstname']['checked'])) +{ + print_liste_field_titre("FirstName",$_SERVER["PHP_SELF"],"d.firstname",$param,"","",$sortfield,$sortorder); +} +if (! empty($arrayfields['d.login']['checked'])) +{ + print_liste_field_titre("Login",$_SERVER["PHP_SELF"],"d.login",$param,"","",$sortfield,$sortorder); +} +if (! empty($arrayfields['t.libelle']['checked'])) +{ + print_liste_field_titre("Label",$_SERVER["PHP_SELF"],"c.note",$param,"",'align="left"',$sortfield,$sortorder); +} +if (! empty($arrayfields['d.bank']['checked'])) +{ + print_liste_field_titre("Account",$_SERVER["PHP_SELF"],"b.fk_account",$pram,"","",$sortfield,$sortorder); +} +if (! empty($arrayfields['d.date_debut']['checked'])) +{ + print_liste_field_titre("Date",$_SERVER["PHP_SELF"],"c.dateadh",$param,"",'align="center"',$sortfield,$sortorder); +} +if (! empty($arrayfields['d.date_fin']['checked'])) +{ + print_liste_field_titre("DateEnd",$_SERVER["PHP_SELF"],"c.datef",$param,"",'align="center"',$sortfield,$sortorder); +} +if (! empty($arrayfields['d.amount']['checked'])) +{ + print_liste_field_titre("Amount",$_SERVER["PHP_SELF"],"c.subscription",$param,"",'align="right"',$sortfield,$sortorder); +} +// Extra fields +include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php'; + +// Hook fields +$parameters=array('arrayfields'=>$arrayfields,'param'=>$param,'sortfield'=>$sortfield,'sortorder'=>$sortorder); +$reshook=$hookmanager->executeHooks('printFieldListTitle',$parameters); // Note that $action and $object may have been modified by hook +print $hookmanager->resPrint; +if (! empty($arrayfields['d.datec']['checked'])) print_liste_field_titre($arrayfields['d.datec']['label'],$_SERVER["PHP_SELF"],"d.datec","",$param,'align="center" class="nowrap"',$sortfield,$sortorder); +if (! empty($arrayfields['d.tms']['checked'])) print_liste_field_titre($arrayfields['d.tms']['label'],$_SERVER["PHP_SELF"],"d.tms","",$param,'align="center" class="nowrap"',$sortfield,$sortorder); +print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"],"",'','','align="center"',$sortfield,$sortorder,'maxwidthsearch '); +print "\n"; + + +$total=0; +$totalarray=array(); +while ($i < min($num, $limit)) +{ + $obj = $db->fetch_object($result); + $total+=$obj->subscription; + + $subscription->ref=$obj->crowid; + $subscription->id=$obj->crowid; + + $adherent->lastname=$obj->lastname; + $adherent->firstname=$obj->firstname; + $adherent->ref=$obj->rowid; + $adherent->id=$obj->rowid; + $adherent->statut=$obj->statut; + $adherent->login=$obj->login; + $adherent->photo=$obj->photo; + + $adht = new AdherentType($db); + $adht->fetch($obj->fk_type); + + print ''; + + // Ref + if (! empty($arrayfields['d.ref']['checked'])) { - if ($conf->global->ADHERENT_BANK_USE || $object->fk_bank) - { - print ''; - } + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Type + if (! empty($arrayfields['d.fk_type']['checked'])) + { + print ''; + if (! $i) $totalarray['nbfield']++; } - print "
'.$langs->trans("DateEndSubscription").''.dol_print_date($object->datef,'day').'
'.$langs->trans("Amount").''.price($object->amount).'
'.$langs->trans("Label").''.$object->note.'
 '; + print ''; + print ''; + print''; + print ''; + print ''; + print ''; + print ''; + print ''; + print $form->select_comptes($search_account, 'search_account', 0, '', 1); + print '  '; + print ''; + print ''; + print ''; + print ''; +$searchpicto=$form->showFilterButtons(); +print $searchpicto; +print '
'.$langs->trans("BankTransactionLine").''; - if ($object->fk_bank) - { - $bankline=new AccountLine($db); - $result=$bankline->fetch($object->fk_bank); - print $bankline->getNomUrl(1,0,'showall'); - } - else - { - print $langs->trans("NoneF"); - } - print '
'.$subscription->getNomUrl(1).''; + if ( ! empty($obj->fk_type) ) print $adht->getNomUrl(1); + print '
\n"; - print '
'; - - print '
'; - - dol_fiche_end(); - - /* - * Barre d'actions - * - */ - print '
'; - - if ($user->rights->adherent->cotisation->creer) + // Lastname + if (! empty($arrayfields['d.lastname']['checked'])) { - if (! $bankline->rappro) + $adherent->firstname = ''; + print ''.$adherent->getNomUrl(-1).''; + $adherent->firstname = $obj->firstname; + if (! $i) $totalarray['nbfield']++; + } + // Firstname + if (! empty($arrayfields['d.firstname']['checked'])) + { + print ''.$adherent->firstname.''; + if (! $i) $totalarray['nbfield']++; + } + + // Login + if (! empty($arrayfields['d.login']['checked'])) + { + print ''.$adherent->login.''; + if (! $i) $totalarray['nbfield']++; + } + + // Label + if (! empty($arrayfields['t.libelle']['checked'])) + { + print ''; + print dol_trunc($obj->note,128); + print ''; + if (! $i) $totalarray['nbfield']++; + } + + // Banque + if (! empty($arrayfields['d.bank']['checked'])) + { + print ""; + if ($obj->fk_account > 0) { - print '"; + $accountstatic->id=$obj->fk_account; + $accountstatic->fetch($obj->fk_account); + //$accountstatic->label=$obj->label; + print $accountstatic->getNomUrl(1); } + print "\n"; + if (! $i) $totalarray['nbfield']++; + } + + // Date start + if (! empty($arrayfields['d.date_start']['checked'])) + { + print ''.dol_print_date($db->jdate($obj->dateadh),'day')."\n"; + if (! $i) $totalarray['nbfield']++; + } + // Date end + if (! empty($arrayfields['d.date_end']['checked'])) + { + print ''.dol_print_date($db->jdate($obj->datef),'day')."\n"; + if (! $i) $totalarray['nbfield']++; + } + // Price + if (! empty($arrayfields['d.amount']['checked'])) + { + print ''.price($obj->subscription).''; + if (! $i) $totalarray['nbfield']++; + if (! $i) $totalarray['pos'][$totalarray['nbfield']]='d.amount'; + $totalarray['val']['d.amount'] += $obj->subscription; + } + // Extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; + // Fields from hook + $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj); + $reshook=$hookmanager->executeHooks('printFieldListValue',$parameters); // Note that $action and $object may have been modified by hook + print $hookmanager->resPrint; + // Date creation + if (! empty($arrayfields['d.datec']['checked'])) + { + print ''; + print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Date modification + if (! empty($arrayfields['d.tms']['checked'])) + { + print ''; + print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); + print ''; + if (! $i) $totalarray['nbfield']++; + } + // Action column + print ''; + if ($massactionbutton || $massaction) // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + { + $selected=0; + if (in_array($obj->rowid, $arrayofselected)) $selected=1; + print ''; + } + print ''; + if (! $i) $totalarray['nbfield']++; + + print "\n"; + $i++; +} + +// Show total line +if (isset($totalarray['pos'])) +{ + print ''; + $i=0; + while ($i < $totalarray['nbfield']) + { + $i++; + if (! empty($totalarray['pos'][$i])) print ''.price($totalarray['val'][$totalarray['pos'][$i]]).''; else { - print '"; + if ($i == 1) + { + if ($num < $limit) print ''.$langs->trans("Total").''; + else print ''.$langs->trans("Totalforthispage").''; + } + else print ''; } } - - // Supprimer - if ($user->rights->adherent->cotisation->creer) - { - print '\n"; - } - - print '
'; - - - print '
'; - print ''; // ancre - - // Documents generes - /* - $filename = dol_sanitizeFileName($object->ref); - $filedir = $conf->facture->dir_output . '/' . dol_sanitizeFileName($object->ref); - $urlsource = $_SERVER['PHP_SELF'] . '?facid=' . $object->id; - $genallowed = $user->rights->facture->lire; - $delallowed = $user->rights->facture->creer; - - print $formfile->showdocuments('facture', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', '', '', $soc->default_lang); - $somethingshown = $formfile->numoffiles; - */ - // Show links to link elements - //$linktoelem = $form->showLinkToObjectBlock($object, null, array('subscription')); - $somethingshown = $form->showLinkedObjectBlock($object, ''); - - // Show links to link elements - /*$linktoelem = $form->showLinkToObjectBlock($object,array('order')); - if ($linktoelem) print ($somethingshown?'':'
').$linktoelem; - */ - - 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, 'invoice', $socid, 1); - */ - - print '
'; + print ''; } +// If no record found +if ($num == 0) +{ + $colspan=1; + foreach($arrayfields as $key => $val) { if (! empty($val['checked'])) $colspan++; } + print ''.$langs->trans("NoRecordFound").''; +} + +$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; + +print ""; +print ''; +print ''; + + // End of page llxFooter(); $db->close(); From 829807b467e41a1b17c37996aff0fc3e3b98ae46 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 17 Jan 2019 17:38:46 +0100 Subject: [PATCH 06/40] modify class to display save adherent type in subscription --- htdocs/adherents/class/subscription.class.php | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/htdocs/adherents/class/subscription.class.php b/htdocs/adherents/class/subscription.class.php index 29f1f94e683..65e8b3b33ec 100644 --- a/htdocs/adherents/class/subscription.class.php +++ b/htdocs/adherents/class/subscription.class.php @@ -55,6 +55,7 @@ class Subscription extends CommonObject /** * @var int ID */ + public $fk_type; public $fk_adherent; public $amount; @@ -102,8 +103,16 @@ class Subscription extends CommonObject $this->db->begin(); - $sql = "INSERT INTO ".MAIN_DB_PREFIX."subscription (fk_adherent, datec, dateadh, datef, subscription, note)"; - $sql.= " VALUES (".$this->fk_adherent.", '".$this->db->idate($this->datec)."',"; + $sql = "INSERT INTO ".MAIN_DB_PREFIX."subscription (fk_adherent, fk_type, datec, dateadh, datef, subscription, note)"; + if ($this->fk_type == NULL) { +require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php'; + $member=new Adherent($this->db); + $result=$member->fetch($this->fk_adherent); + $type=$member->typeid; + } else { + $type=$this->fk_type; + } + $sql.= " VALUES (".$this->fk_adherent.", '".$type."', '".$this->db->idate($now)."',"; $sql.= " '".$this->db->idate($this->dateh)."',"; $sql.= " '".$this->db->idate($this->datef)."',"; $sql.= " ".$this->amount.","; @@ -147,7 +156,7 @@ class Subscription extends CommonObject */ function fetch($rowid) { - $sql ="SELECT rowid, fk_adherent, datec,"; + $sql ="SELECT rowid, fk_type, fk_adherent, datec,"; $sql.=" tms,"; $sql.=" dateadh as dateh,"; $sql.=" datef,"; @@ -166,7 +175,8 @@ class Subscription extends CommonObject $this->id = $obj->rowid; $this->ref = $obj->rowid; - $this->fk_adherent = $obj->fk_adherent; + $this->fk_type = $obj->fk_type; + $this->fk_adherent = $obj->fk_adherent; $this->datec = $this->db->jdate($obj->datec); $this->datem = $this->db->jdate($obj->tms); $this->dateh = $this->db->jdate($obj->dateh); @@ -203,6 +213,7 @@ class Subscription extends CommonObject $this->db->begin(); $sql = "UPDATE ".MAIN_DB_PREFIX."subscription SET "; + $sql .= " fk_type = ".$this->fk_type.","; $sql .= " fk_adherent = ".$this->fk_adherent.","; $sql .= " note=".($this->note ? "'".$this->db->escape($this->note)."'" : 'null').","; $sql .= " subscription = '".price2num($this->amount)."',"; From ee595ca9b5a7ca30232c6a964592ff49412b1e0a Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 17 Jan 2019 17:40:47 +0100 Subject: [PATCH 07/40] Update 9.0.0-10.0.0.sql --- htdocs/install/mysql/migration/9.0.0-10.0.0.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql index 0079e90f2ae..264f0cdfc6c 100644 --- a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -80,6 +80,7 @@ create table llx_mailing_unsubscribe ALTER TABLE llx_mailing_unsubscribe ADD UNIQUE uk_mailing_unsubscribe(email, entity, unsubscribegroup); ALTER TABLE llx_adherent ADD gender VARCHAR(10); +ALTER TABLE llx_subscription ADD fk_type int(11); -- Add url_id into unique index of bank_url ALTER TABLE llx_bank_url DROP INDEX uk_bank_url; From 389b44faa3c2f3cb48a781eb742be484cc1535a8 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 17 Jan 2019 17:41:45 +0100 Subject: [PATCH 08/40] Update llx_subscription.sql --- htdocs/install/mysql/tables/llx_subscription.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/install/mysql/tables/llx_subscription.sql b/htdocs/install/mysql/tables/llx_subscription.sql index 8d220ed9059..cb53d9405e9 100644 --- a/htdocs/install/mysql/tables/llx_subscription.sql +++ b/htdocs/install/mysql/tables/llx_subscription.sql @@ -22,6 +22,7 @@ create table llx_subscription tms timestamp, datec datetime, fk_adherent integer, + fk_type integer, dateadh datetime, datef date, subscription double(24,8), From 7ebf3967cb786a3ee42013e63908ec9f7ab98c44 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 17 Jan 2019 17:45:52 +0100 Subject: [PATCH 09/40] Update subscription.class.php --- htdocs/adherents/class/subscription.class.php | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/htdocs/adherents/class/subscription.class.php b/htdocs/adherents/class/subscription.class.php index 65e8b3b33ec..11dd80b90ee 100644 --- a/htdocs/adherents/class/subscription.class.php +++ b/htdocs/adherents/class/subscription.class.php @@ -104,15 +104,16 @@ class Subscription extends CommonObject $this->db->begin(); $sql = "INSERT INTO ".MAIN_DB_PREFIX."subscription (fk_adherent, fk_type, datec, dateadh, datef, subscription, note)"; - if ($this->fk_type == NULL) { + + if ($this->fk_type == NULL) { require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php'; - $member=new Adherent($this->db); - $result=$member->fetch($this->fk_adherent); - $type=$member->typeid; - } else { - $type=$this->fk_type; - } - $sql.= " VALUES (".$this->fk_adherent.", '".$type."', '".$this->db->idate($now)."',"; +$member=new Adherent($this->db); +$result=$member->fetch($this->fk_adherent); +$type=$member->typeid; +} else { +$type=$this->fk_type; +} + $sql.= " VALUES (".$this->fk_adherent.", '".$type."', '".$this->db->idate($now)."',"; $sql.= " '".$this->db->idate($this->dateh)."',"; $sql.= " '".$this->db->idate($this->datef)."',"; $sql.= " ".$this->amount.","; @@ -176,7 +177,7 @@ require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php'; $this->ref = $obj->rowid; $this->fk_type = $obj->fk_type; - $this->fk_adherent = $obj->fk_adherent; + $this->fk_adherent = $obj->fk_adherent; $this->datec = $this->db->jdate($obj->datec); $this->datem = $this->db->jdate($obj->tms); $this->dateh = $this->db->jdate($obj->dateh); @@ -213,7 +214,7 @@ require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php'; $this->db->begin(); $sql = "UPDATE ".MAIN_DB_PREFIX."subscription SET "; - $sql .= " fk_type = ".$this->fk_type.","; + $sql .= " fk_type = ".$this->fk_type.","; $sql .= " fk_adherent = ".$this->fk_adherent.","; $sql .= " note=".($this->note ? "'".$this->db->escape($this->note)."'" : 'null').","; $sql .= " subscription = '".price2num($this->amount)."',"; From f6eebf0ed5be4bc2ac3407f503255bf4087e4e31 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 17 Jan 2019 17:48:13 +0100 Subject: [PATCH 10/40] Update card.php --- htdocs/adherents/subscription/card.php | 37 +++++++++++++------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/htdocs/adherents/subscription/card.php b/htdocs/adherents/subscription/card.php index 7ef9b36487c..a8d7708dfd5 100644 --- a/htdocs/adherents/subscription/card.php +++ b/htdocs/adherents/subscription/card.php @@ -76,7 +76,7 @@ $fieldstosearchall = array( ); $arrayfields=array( 'd.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1), - 'd.fk_type'=>array('label'=>$langs->trans("Type"), 'checked'=>1), + 'd.fk_type'=>array('label'=>$langs->trans("Type"), 'checked'=>1), 'd.lastname'=>array('label'=>$langs->trans("Lastname"), 'checked'=>1), 'd.firstname'=>array('label'=>$langs->trans("Firstname"), 'checked'=>1), 'd.login'=>array('label'=>$langs->trans("Login"), 'checked'=>1), @@ -115,17 +115,17 @@ if (empty($reshook)) // Purge search criteria if (GETPOST('button_removefilter_x','alpha') || GETPOST('button_removefilter.x','alpha') || GETPOST('button_removefilter','alpha')) // All tests are required to be compatible with all browsers { - $search=""; - $search_type=""; - $search_ref=""; - $search_lastname=""; - $search_firstname=""; - $search_login=""; - $search_note=""; - $search_amount=""; - $search_account=""; - $toselect=''; - $search_array_options=array(); + $search=""; + $search_type=""; + $search_ref=""; + $search_lastname=""; + $search_firstname=""; + $search_login=""; + $search_note=""; + $search_amount=""; + $search_account=""; + $toselect=''; + $search_array_options=array(); } } @@ -471,13 +471,14 @@ while ($i < min($num, $limit)) print ''.$subscription->getNomUrl(1).''; if (! $i) $totalarray['nbfield']++; } - // Type - if (! empty($arrayfields['d.fk_type']['checked'])) + + // Type + if (! empty($arrayfields['d.fk_type']['checked'])) { - print ''; - if ( ! empty($obj->fk_type) ) print $adht->getNomUrl(1); - print ''; - if (! $i) $totalarray['nbfield']++; + print ''; + if ( ! empty($obj->fk_type) ) print $adht->getNomUrl(1); + print ''; + if (! $i) $totalarray['nbfield']++; } // Lastname From 65144235617e50371abcb3ec7df0b2dcd84cc8ce Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 17 Jan 2019 18:08:14 +0100 Subject: [PATCH 11/40] Update card.php --- htdocs/adherents/subscription/card.php | 902 ++++++++++--------------- 1 file changed, 357 insertions(+), 545 deletions(-) diff --git a/htdocs/adherents/subscription/card.php b/htdocs/adherents/subscription/card.php index a8d7708dfd5..3faa6974c8f 100644 --- a/htdocs/adherents/subscription/card.php +++ b/htdocs/adherents/subscription/card.php @@ -1,7 +1,6 @@ - * Copyright (C) 2003 Jean-Louis Bergamo - * Copyright (C) 2004-2016 Laurent Destailleur +/* Copyright (C) 2007-2012 Laurent Destailleur + * Copyright (C) 2018 Frédéric France * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -18,613 +17,426 @@ */ /** - * \file htdocs/adherents/subscription/list.php - * \ingroup member - * \brief list of subscription + * \file htdocs/adherents/subscription/card.php + * \ingroup member + * \brief Page to add/edit/remove a member subscription */ require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/member.lib.php'; require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php'; require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php'; -require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; +if (! empty($conf->banque->enabled)) { + require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; +} -$langs->loadLangs(array("members","companies")); - -$action=GETPOST('action','aZ09'); -$massaction=GETPOST('massaction','alpha'); -$confirm=GETPOST('confirm','alpha'); -$toselect = GETPOST('toselect', 'array'); - -$filter=GETPOST("filter","alpha"); -$statut=(GETPOSTISSET("statut")?GETPOST("statut","alpha"):1); -$search_ref=GETPOST('search_ref','alpha'); -$search_type=GETPOST('search_type','alpha'); -$search_lastname=GETPOST('search_lastname','alpha'); -$search_firstname=GETPOST('search_firstname','alpha'); -$search_login=GETPOST('search_login','alpha'); -$search_note=GETPOST('search_note','alpha'); -$search_account=GETPOST('search_account','int'); -$search_amount=GETPOST('search_amount','alpha'); -$optioncss = GETPOST('optioncss','alpha'); - -$date_select=GETPOST("date_select",'alpha'); - -$limit = GETPOST('limit','int')?GETPOST('limit','int'):$conf->liste_limit; -$sortfield = GETPOST("sortfield",'alpha'); -$sortorder = GETPOST("sortorder",'alpha'); -$page = GETPOST("page",'int'); -if (empty($page) || $page == -1) { $page = 0; } // If $page is not defined, or '' or -1 -$offset = $limit * $page ; -$pageprev = $page - 1; -$pagenext = $page + 1; -if (! $sortorder) { $sortorder="DESC"; } -if (! $sortfield) { $sortfield="c.dateadh"; } +// Load translation files required by the page +$langs->loadLangs(array("companies","members","bills","users")); +$adh = new Adherent($db); +$adht = new AdherentType($db); $object = new Subscription($db); +$errmsg=''; -// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context -$hookmanager->initHooks(array('subscriptionlist')); -$extrafields = new ExtraFields($db); +$action=GETPOST("action",'alpha'); +$rowid=GETPOST("rowid","int")?GETPOST("rowid","int"):GETPOST("id","int"); +$typeid=GETPOST("typeid","int"); +$cancel=GETPOST('cancel','alpha'); +$confirm=GETPOST('confirm'); -// fetch optionals attributes and labels -$extralabels = $extrafields->fetch_name_optionals_label('subscription'); -$search_array_options=$extrafields->getOptionalsFromPost($object->table_element,'','search_'); +if (! $user->rights->adherent->cotisation->lire) + accessforbidden(); -// List of fields to search into when doing a "search in all" -$fieldstosearchall = array( -); -$arrayfields=array( - 'd.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1), - 'd.fk_type'=>array('label'=>$langs->trans("Type"), 'checked'=>1), - 'd.lastname'=>array('label'=>$langs->trans("Lastname"), 'checked'=>1), - 'd.firstname'=>array('label'=>$langs->trans("Firstname"), 'checked'=>1), - 'd.login'=>array('label'=>$langs->trans("Login"), 'checked'=>1), - 't.libelle'=>array('label'=>$langs->trans("Label"), 'checked'=>1), - 'd.bank'=>array('label'=>$langs->trans("BankAccount"), 'checked'=>1, 'enabled'=>(! empty($conf->banque->enabled))), - /*'d.note_public'=>array('label'=>$langs->trans("NotePublic"), 'checked'=>0), - 'd.note_private'=>array('label'=>$langs->trans("NotePrivate"), 'checked'=>0),*/ - 'd.datedebut'=>array('label'=>$langs->trans("DateSubscription"), 'checked'=>1, 'position'=>100), - 'd.datefin'=>array('label'=>$langs->trans("EndSubscription"), 'checked'=>1, 'position'=>101), - 'd.amount'=>array('label'=>$langs->trans("Amount"), 'checked'=>1, 'position'=>102), - 'd.datec'=>array('label'=>$langs->trans("DateCreation"), 'checked'=>0, 'position'=>500), - 'd.tms'=>array('label'=>$langs->trans("DateModificationShort"), 'checked'=>0, 'position'=>500), -// 'd.statut'=>array('label'=>$langs->trans("Status"), 'checked'=>1, 'position'=>1000) -); - -// Security check -$result=restrictedArea($user,'adherent','','','cotisation'); +$permissionnote = $user->rights->adherent->cotisation->creer; // Used by the include of actions_setnotes.inc.php +$permissiondellink=$user->rights->adherent->cotisation->creer; // Used by the include of actions_dellink.inc.php +$permissiontoedit = $user->rights->adherent->cotisation->creer; // Used by the include of actions_lineupdonw.inc.php /* - * Actions + * Actions */ -if (GETPOST('cancel','alpha')) { $action='list'; $massaction=''; } -if (! GETPOST('confirmmassaction','alpha') && $massaction != 'presend' && $massaction != 'confirm_presend' && $massaction != 'confirm_createbills') { $massaction=''; } +if ($cancel) $action=''; -$parameters=array('socid'=>$socid); -$reshook=$hookmanager->executeHooks('doActions',$parameters,$object,$action); // Note that $action and $object may have been modified by some hooks -if ($reshook < 0) setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); +//include DOL_DOCUMENT_ROOT.'/core/actions_setnotes.inc.php'; // Must be include, not include_once -if (empty($reshook)) +include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php'; // Must be include, not include_once + +//include DOL_DOCUMENT_ROOT.'/core/actions_lineupdown.inc.php'; // Must be include, not include_once + + +if ($user->rights->adherent->cotisation->creer && $action == 'update' && ! $cancel) { - // Selection of new fields - include DOL_DOCUMENT_ROOT.'/core/actions_changeselectedfields.inc.php'; + // Charge objet actuel + $result=$object->fetch($rowid); + if ($result > 0) + { + $db->begin(); - // Purge search criteria - if (GETPOST('button_removefilter_x','alpha') || GETPOST('button_removefilter.x','alpha') || GETPOST('button_removefilter','alpha')) // All tests are required to be compatible with all browsers + $errmsg=''; + + if ($object->fk_bank) + { + $accountline=new AccountLine($db); + $result=$accountline->fetch($object->fk_bank); + + // If transaction consolidated + if ($accountline->rappro) + { + $errmsg=$langs->trans("SubscriptionLinkedToConciliatedTransaction"); + } + else + { + $accountline->datev=dol_mktime($_POST['datesubhour'], $_POST['datesubmin'], 0, $_POST['datesubmonth'], $_POST['datesubday'], $_POST['datesubyear']); + $accountline->dateo=dol_mktime($_POST['datesubhour'], $_POST['datesubmin'], 0, $_POST['datesubmonth'], $_POST['datesubday'], $_POST['datesubyear']); + $accountline->amount=$_POST["amount"]; + $result=$accountline->update($user); + if ($result < 0) + { + $errmsg=$accountline->error; + } + } + } + + if (! $errmsg) + { + // Modifie valeures + $object->dateh=dol_mktime($_POST['datesubhour'], $_POST['datesubmin'], 0, $_POST['datesubmonth'], $_POST['datesubday'], $_POST['datesubyear']); + $object->datef=dol_mktime($_POST['datesubendhour'], $_POST['datesubendmin'], 0, $_POST['datesubendmonth'], $_POST['datesubendday'], $_POST['datesubendyear']); + $object->fk_type=$_POST["typeid"]; + $object->note=$_POST["note"]; + $object->amount=$_POST["amount"]; + //print 'datef='.$object->datef.' '.$_POST['datesubendday']; + + $result=$object->update($user); + if ($result >= 0 && ! count($object->errors)) + { + $db->commit(); + + header("Location: card.php?rowid=".$object->id); + exit; + } + else + { + $db->rollback(); + + if ($object->error) + { + $errmsg=$object->error; + } + else + { + foreach($object->errors as $error) + { + if ($errmsg) $errmsg.='
'; + $errmsg.=$error; + } + } + $action=''; + } + } + else + { + $db->rollback(); + } + } +} + +if ($action == 'confirm_delete' && $confirm == 'yes' && $user->rights->adherent->cotisation->creer) +{ + $result=$object->fetch($rowid); + $result=$object->delete($user); + if ($result > 0) { - $search=""; - $search_type=""; - $search_ref=""; - $search_lastname=""; - $search_firstname=""; - $search_login=""; - $search_note=""; - $search_amount=""; - $search_account=""; - $toselect=''; - $search_array_options=array(); + header("Location: ".DOL_URL_ROOT."/adherents/card.php?rowid=".$object->fk_adherent); + exit; + } + else + { + $mesg=$adh->error; } } + /* * View */ -$form=new Form($db); -$subscription=new Subscription($db); -$adherent=new Adherent($db); -$accountstatic=new Account($db); +$form = new Form($db); -$now=dol_now(); -// List of subscriptions -$sql = "SELECT d.rowid, d.login, d.firstname, d.lastname, d.societe, d.photo,"; -$sql.= " c.rowid as crowid, c.fk_type, c.subscription,"; -$sql.= " c.dateadh, c.datef, c.datec as date_creation, c.tms as date_update,"; -$sql.= " c.fk_bank as bank, c.note,"; -$sql.= " b.fk_account"; -$sql.= " FROM ".MAIN_DB_PREFIX."adherent as d, ".MAIN_DB_PREFIX."subscription as c"; -$sql.= " LEFT JOIN ".MAIN_DB_PREFIX."bank as b ON c.fk_bank=b.rowid"; -$sql.= " WHERE d.rowid = c.fk_adherent"; -$sql.= " AND d.entity IN (".getEntity('adherent').")"; -if (isset($date_select) && $date_select != '') +llxHeader('',$langs->trans("SubscriptionCard"),'EN:Module_Foundations|FR:Module_Adhérents|ES:Módulo_Miembros'); + + +dol_htmloutput_errors($errmsg); + + +if ($user->rights->adherent->cotisation->creer && $action == 'edit') { - $sql.= " AND c.dateadh >= '".$date_select."-01-01 00:00:00'"; - $sql.= " AND c.dateadh < '".($date_select+1)."-01-01 00:00:00'"; -} -if ($search_ref) -{ - if (is_numeric($search_ref)) $sql.= " AND (c.rowid = ".$db->escape($search_ref).")"; - else $sql.=" AND 1 = 2"; // Always wrong -} -if ($search_type) $sql.= natural_search(array('c.fk_type'), $search_type); -if ($search_lastname) $sql.= natural_search(array('d.lastname','d.societe'), $search_lastname); -if ($search_firstname) $sql.= natural_search(array('d.firstname'), $search_firstname); -if ($search_login) $sql.= natural_search('d.login', $search_login); -if ($search_note) $sql.= natural_search('c.note', $search_note); -if ($search_account > 0) $sql.= " AND b.fk_account = ".urldecode($search_account); -if ($search_amount) $sql.= natural_search('c.subscription', $search_amount, 1); + /******************************************** + * + * Subscription card in edit mode + * + ********************************************/ -// Add where from extra fields -include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_sql.tpl.php'; + $object->fetch($rowid); + $result=$adh->fetch($object->fk_adherent); -// 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; + $head = subscription_prepare_head($object); -$sql.= $db->order($sortfield,$sortorder); + print '
'; + print ''; + print ""; + print ""; + print "fk_bank."\">"; -// Count total nb of records with no order and no limits -$nbtotalofrecords = ''; -if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) -{ - $resql = $db->query($sql); - if ($resql) $nbtotalofrecords = $db->num_rows($resql); - else dol_print_error($db); - if (($page * $limit) > $nbtotalofrecords) // if total resultset is smaller then paging size (filtering), goto and load page 0 - { - $page = 0; - $offset = 0; - } -} -// Add limit -$sql.= $db->plimit($limit+1, $offset); + dol_fiche_head($head, 'general', $langs->trans("Subscription"), 0, 'payment'); -$result = $db->query($sql); -if (! $result) -{ - dol_print_error($db); - exit; -} + $linkback = ''.$langs->trans("BackToList").''; -$num = $db->num_rows($result); + print "\n"; + print ''; -$arrayofselected=is_array($toselect)?$toselect:array(); + // Ref + print ''; + print ''; -if ($num == 1 && ! empty($conf->global->MAIN_SEARCH_DIRECT_OPEN_IF_ONLY_ONE) && $sall) -{ - $obj = $db->fetch_object($resql); - $id = $obj->rowid; - header("Location: ".DOL_URL_ROOT.'/adherents/subscription/card.php?id='.$id); - exit; -} + // Type + print ''; + print ''; -llxHeader('',$langs->trans("ListOfSubscriptions"),'EN:Module_Foundations|FR:Module_Adhérents|ES:Módulo_Miembros'); + // Member + $adh->ref=$adh->getFullName($langs); + print ''; + print ''; + print ''; -$i = 0; - -$title=$langs->trans("ListOfSubscriptions"); -if (! empty($date_select)) $title.=' ('.$langs->trans("Year").' '.$date_select.')'; - -$param=''; -if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.urlencode($contextpage); -if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.urlencode($limit); -if ($statut != '') $param.="&statut=".urlencode($statut); -if ($search_type) $param.="&search_type=".urlencode($search_type); -if ($date_select) $param.="&date_select=".urlencode($date_select); -if ($search_lastname) $param.="&search_lastname=".urlencode($search_lastname); -if ($search_login) $param.="&search_login=".urlencode($search_login); -if ($search_acount) $param.="&search_account=".urlencode($search_account); -if ($search_amount) $param.="&search_amount=".urlencode($search_amount); -if ($optioncss != '') $param.='&optioncss='.urlencode($optioncss); -// Add $param from extra fields -include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; - -// List of mass actions available -$arrayofmassactions = array( - //'presend'=>$langs->trans("SendByMail"), - //'builddoc'=>$langs->trans("PDFMerge"), -); -//if ($user->rights->adherent->supprimer) $arrayofmassactions['predelete']=$langs->trans("Delete"); -if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array(); -$massactionbutton=$form->selectMassAction('', $arrayofmassactions); - -$newcardbutton=''; -if ($user->rights->adherent->cotisation->creer) -{ - $newcardbutton=''.$langs->trans('NewSubscription').''; - $newcardbutton.= ''; - $newcardbutton.= ''; -} - -print ''; -if ($optioncss != '') print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; -print ''; - -print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_generic.png', 0, $newcardbutton, '', $limit); - -$topicmail="Information"; -$modelmail="subscription"; -$objecttmp=new Subscription($db); -$trackid='sub'.$object->id; -include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php'; - -if ($sall) -{ - foreach($fieldstosearchall as $key => $val) $fieldstosearchall[$key]=$langs->trans($val); - print '
'.$langs->trans("FilterOnInto", $sall) . join(', ',$fieldstosearchall).'
'; -} - -$moreforfilter = ''; - -$varpage=empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage; -$selectedfields=$form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields -if ($massactionbutton) $selectedfields.=$form->showCheckAddButtons('checkforselect', 1); - -print '
'; -print '
'.$langs->trans("Ref").''; + print $form->showrefnav($object, 'rowid', $linkback, 1); + print '
'.$langs->trans("Type").''; + print $form->selectarray("typeid", $adht->liste_array(), (isset($_POST["typeid"])?$_POST["typeid"]:$object->fk_type)); + print'
'.$langs->trans("Member").''.$adh->getNomUrl(1,0,'subscription').'
'."\n"; - - -// Line for filters fields -print ''; - -// Line numbering -if (! empty($conf->global->MAIN_SHOW_TECHNICAL_ID)) -{ - print ''; -} - -// Ref -if (! empty($arrayfields['d.ref']['checked'])) -{ - print ''; -} - -// Type -if (! empty($arrayfields['d.fk_type']['checked'])) -{ - print ''; -} - -if (! empty($arrayfields['d.lastname']['checked'])) -{ - print ''; -} - -if (! empty($arrayfields['d.firstname']['checked'])) -{ - print ''; -} - -if (! empty($arrayfields['d.login']['checked'])) -{ - print ''; -} - -if (! empty($arrayfields['t.libelle']['checked'])) -{ - print ''; -} + print ''; -if (! empty($arrayfields['d.bank']['checked'])) -{ - print ''; -} + print ''; -if (! empty($arrayfields['d.date_debut']['checked'])) -{ - print ''; -} + // Amount + print ''; -if (! empty($arrayfields['d.date_fin']['checked'])) -{ - print ''; -} + // Label + print ''; -if (! empty($arrayfields['d.amount']['checked'])) -{ - print ''; -} -// Extra fields -include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php'; - -// Fields from hook -$parameters=array('arrayfields'=>$arrayfields); -$reshook=$hookmanager->executeHooks('printFieldListOption',$parameters); // Note that $action and $object may have been modified by hook -print $hookmanager->resPrint; -// Date creation -if (! empty($arrayfields['d.datec']['checked'])) -{ - print ''; -} -// Date modification -if (! empty($arrayfields['d.tms']['checked'])) -{ - print ''; -} - -// Action column -print ''; - -print "\n"; - - -print ''; -if (! empty($arrayfields['d.ref']['checked'])) -{ - print_liste_field_titre("Ref",$_SERVER["PHP_SELF"],"c.rowid",$param,"","",$sortfield,$sortorder); -} -if (! empty($arrayfields['d.fk_type']['checked'])) -{ - print_liste_field_titre("Type",$_SERVER["PHP_SELF"],"c.fk_type",$param,"","",$sortfield,$sortorder); -} -if (! empty($arrayfields['d.lastname']['checked'])) -{ - print_liste_field_titre("LastName",$_SERVER["PHP_SELF"],"d.lastname",$param,"","",$sortfield,$sortorder); -} -if (! empty($arrayfields['d.firstname']['checked'])) -{ - print_liste_field_titre("FirstName",$_SERVER["PHP_SELF"],"d.firstname",$param,"","",$sortfield,$sortorder); -} -if (! empty($arrayfields['d.login']['checked'])) -{ - print_liste_field_titre("Login",$_SERVER["PHP_SELF"],"d.login",$param,"","",$sortfield,$sortorder); -} -if (! empty($arrayfields['t.libelle']['checked'])) -{ - print_liste_field_titre("Label",$_SERVER["PHP_SELF"],"c.note",$param,"",'align="left"',$sortfield,$sortorder); -} -if (! empty($arrayfields['d.bank']['checked'])) -{ - print_liste_field_titre("Account",$_SERVER["PHP_SELF"],"b.fk_account",$pram,"","",$sortfield,$sortorder); -} -if (! empty($arrayfields['d.date_debut']['checked'])) -{ - print_liste_field_titre("Date",$_SERVER["PHP_SELF"],"c.dateadh",$param,"",'align="center"',$sortfield,$sortorder); -} -if (! empty($arrayfields['d.date_fin']['checked'])) -{ - print_liste_field_titre("DateEnd",$_SERVER["PHP_SELF"],"c.datef",$param,"",'align="center"',$sortfield,$sortorder); -} -if (! empty($arrayfields['d.amount']['checked'])) -{ - print_liste_field_titre("Amount",$_SERVER["PHP_SELF"],"c.subscription",$param,"",'align="right"',$sortfield,$sortorder); -} -// Extra fields -include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php'; - -// Hook fields -$parameters=array('arrayfields'=>$arrayfields,'param'=>$param,'sortfield'=>$sortfield,'sortorder'=>$sortorder); -$reshook=$hookmanager->executeHooks('printFieldListTitle',$parameters); // Note that $action and $object may have been modified by hook -print $hookmanager->resPrint; -if (! empty($arrayfields['d.datec']['checked'])) print_liste_field_titre($arrayfields['d.datec']['label'],$_SERVER["PHP_SELF"],"d.datec","",$param,'align="center" class="nowrap"',$sortfield,$sortorder); -if (! empty($arrayfields['d.tms']['checked'])) print_liste_field_titre($arrayfields['d.tms']['label'],$_SERVER["PHP_SELF"],"d.tms","",$param,'align="center" class="nowrap"',$sortfield,$sortorder); -print_liste_field_titre($selectedfields, $_SERVER["PHP_SELF"],"",'','','align="center"',$sortfield,$sortorder,'maxwidthsearch '); -print "\n"; - - -$total=0; -$totalarray=array(); -while ($i < min($num, $limit)) -{ - $obj = $db->fetch_object($result); - $total+=$obj->subscription; - - $subscription->ref=$obj->crowid; - $subscription->id=$obj->crowid; - - $adherent->lastname=$obj->lastname; - $adherent->firstname=$obj->firstname; - $adherent->ref=$obj->rowid; - $adherent->id=$obj->rowid; - $adherent->statut=$obj->statut; - $adherent->login=$obj->login; - $adherent->photo=$obj->photo; - - $adht = new AdherentType($db); - $adht->fetch($obj->fk_type); - - print ''; - - // Ref - if (! empty($arrayfields['d.ref']['checked'])) + // Bank line + if (! empty($conf->banque->enabled)) { - print ''; - if (! $i) $totalarray['nbfield']++; - } - - // Type - if (! empty($arrayfields['d.fk_type']['checked'])) - { - print ''; - if (! $i) $totalarray['nbfield']++; - } - - // Lastname - if (! empty($arrayfields['d.lastname']['checked'])) - { - $adherent->firstname = ''; - print ''; - $adherent->firstname = $obj->firstname; - if (! $i) $totalarray['nbfield']++; - } - // Firstname - if (! empty($arrayfields['d.firstname']['checked'])) - { - print ''; - if (! $i) $totalarray['nbfield']++; - } - - // Login - if (! empty($arrayfields['d.login']['checked'])) - { - print ''; - if (! $i) $totalarray['nbfield']++; - } - - // Label - if (! empty($arrayfields['t.libelle']['checked'])) - { - print ''; - if (! $i) $totalarray['nbfield']++; - } - - // Banque - if (! empty($arrayfields['d.bank']['checked'])) - { - print "'; } - print "\n"; - if (! $i) $totalarray['nbfield']++; } - // Date start - if (! empty($arrayfields['d.date_start']['checked'])) - { - print '\n"; - if (! $i) $totalarray['nbfield']++; - } - // Date end - if (! empty($arrayfields['d.date_end']['checked'])) - { - print '\n"; - if (! $i) $totalarray['nbfield']++; - } - // Price - if (! empty($arrayfields['d.amount']['checked'])) - { - print ''; - if (! $i) $totalarray['nbfield']++; - if (! $i) $totalarray['pos'][$totalarray['nbfield']]='d.amount'; - $totalarray['val']['d.amount'] += $obj->subscription; - } - // Extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_print_fields.tpl.php'; - // Fields from hook - $parameters=array('arrayfields'=>$arrayfields, 'obj'=>$obj); - $reshook=$hookmanager->executeHooks('printFieldListValue',$parameters); // Note that $action and $object may have been modified by hook - print $hookmanager->resPrint; - // Date creation - if (! empty($arrayfields['d.datec']['checked'])) - { - print ''; - if (! $i) $totalarray['nbfield']++; - } - // Date modification - if (! empty($arrayfields['d.tms']['checked'])) - { - print ''; - if (! $i) $totalarray['nbfield']++; - } - // Action column - print ''; - if (! $i) $totalarray['nbfield']++; + print '
 '; - print ''; - print ''; - print''; - print ''; - print ''; - print ''; - print ''; + // Date start subscription + print '
'.$langs->trans("DateSubscription").''; + print $form->selectDate($object->dateh, 'datesub', 1, 1, 0, 'update', 1); print '
'; - print $form->select_comptes($search_account, 'search_account', 0, '', 1); + // Date end subscription + print '
'.$langs->trans("DateEndSubscription").''; + print $form->selectDate($object->datef, 'datesubend', 0, 0, 0, 'update', 1); print '
 
'.$langs->trans("Amount").''; + print '
 
'.$langs->trans("Label").''; + print '
'; - print ''; - print ''; - print ''; - print ''; -$searchpicto=$form->showFilterButtons(); -print $searchpicto; -print '
'.$subscription->getNomUrl(1).''; - if ( ! empty($obj->fk_type) ) print $adht->getNomUrl(1); - print ''.$adherent->getNomUrl(-1).''.$adherent->firstname.''.$adherent->login.''; - print dol_trunc($obj->note,128); - print '"; - if ($obj->fk_account > 0) + if ($conf->global->ADHERENT_BANK_USE || $object->fk_bank) { - $accountstatic->id=$obj->fk_account; - $accountstatic->fetch($obj->fk_account); - //$accountstatic->label=$obj->label; - print $accountstatic->getNomUrl(1); + print '
'.$langs->trans("BankTransactionLine").''; + if ($object->fk_bank) + { + $bankline=new AccountLine($db); + $result=$bankline->fetch($object->fk_bank); + print $bankline->getNomUrl(1,0,'showall'); + } + else + { + print $langs->trans("NoneF"); + } + print '
'.dol_print_date($db->jdate($obj->dateadh),'day')."'.dol_print_date($db->jdate($obj->datef),'day')."'.price($obj->subscription).''; - print dol_print_date($db->jdate($obj->date_creation), 'dayhour', 'tzuser'); - print ''; - print dol_print_date($db->jdate($obj->date_update), 'dayhour', 'tzuser'); - print ''; - if ($massactionbutton || $massaction) // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined - { - $selected=0; - if (in_array($obj->rowid, $arrayofselected)) $selected=1; - print ''; - } - print '
'; - print "\n"; - $i++; + dol_fiche_end(); + + print '
'; + print ''; + print '       '; + print ''; + print '
'; + + print '
'; + print "\n"; } -// Show total line -if (isset($totalarray['pos'])) +if ($rowid && $action != 'edit') { - print ''; - $i=0; - while ($i < $totalarray['nbfield']) + /******************************************** + * + * Subscription card in view mode + * + ********************************************/ + + $result=$object->fetch($rowid); + $result=$adh->fetch($object->fk_adherent); + + $head = subscription_prepare_head($object); + + dol_fiche_head($head, 'general', $langs->trans("Subscription"), -1, 'payment'); + + // Confirmation to delete subscription + if ($action == 'delete') + { + //$formquestion=array(); + //$formquestion['text']=''.$langs->trans("ThisWillAlsoDeleteBankRecord").''; + $text=$langs->trans("ConfirmDeleteSubscription"); + if (! empty($conf->banque->enabled) && ! empty($conf->global->ADHERENT_BANK_USE)) $text.='
'.img_warning().' '.$langs->trans("ThisWillAlsoDeleteBankRecord"); + print $form->formconfirm($_SERVER["PHP_SELF"]."?rowid=".$object->id,$langs->trans("DeleteSubscription"),$text,"confirm_delete",$formquestion,0,1); + } + + print '
'; + print ''; + + $linkback = ''.$langs->trans("BackToList").''; + + dol_banner_tab($object, 'rowid', $linkback, 1); + + print '
'; + + print '
'; + + print ''; + + // Type + print ''; + print ''; + print ''; + + // Member + $adh->ref=$adh->getFullName($langs); + print ''; + print ''; + print ''; + + // Date record + /*print ''; + print ''; + print '';*/ + + // Date subscription + print ''; + print ''; + print ''; + + // Date end subscription + print ''; + print ''; + print ''; + + // Amount + print ''; + + // Amount + print ''; + + // Bank line + if (! empty($conf->banque->enabled)) { - $i++; - if (! empty($totalarray['pos'][$i])) print ''; + if ($conf->global->ADHERENT_BANK_USE || $object->fk_bank) + { + print ''; + } + } + + print "
'.$langs->trans("Type").''; + if ( ! empty($object->fk_type) ) { + $adht->fetch($object->fk_type); + print $adht->getNomUrl(1); + } else { + print $langs->trans("NoType"); + } + print '
'.$langs->trans("Member").''.$adh->getNomUrl(1,0,'subscription').'
'.$langs->trans("DateSubscription").''.dol_print_date($object->datec,'dayhour').'
'.$langs->trans("DateSubscription").''.dol_print_date($object->dateh,'day').'
'.$langs->trans("DateEndSubscription").''.dol_print_date($object->datef,'day').'
'.$langs->trans("Amount").''.price($object->amount).'
'.$langs->trans("Label").''.$object->note.'
'.price($totalarray['val'][$totalarray['pos'][$i]]).'
'.$langs->trans("BankTransactionLine").''; + if ($object->fk_bank) + { + $bankline=new AccountLine($db); + $result=$bankline->fetch($object->fk_bank); + print $bankline->getNomUrl(1,0,'showall'); + } + else + { + print $langs->trans("NoneF"); + } + print '
\n"; + print '
'; + + print '
'; + + dol_fiche_end(); + + /* + * Barre d'actions + * + */ + print '
'; + + if ($user->rights->adherent->cotisation->creer) + { + if (! $bankline->rappro) + { + print '"; + } else { - if ($i == 1) - { - if ($num < $limit) print ''.$langs->trans("Total").''; - else print ''.$langs->trans("Totalforthispage").''; - } - else print ''; + print '"; } } - print ''; + + // Supprimer + if ($user->rights->adherent->cotisation->creer) + { + print '\n"; + } + + print '
'; + + + print '
'; + print ''; // ancre + + // Documents generes + /* + $filename = dol_sanitizeFileName($object->ref); + $filedir = $conf->facture->dir_output . '/' . dol_sanitizeFileName($object->ref); + $urlsource = $_SERVER['PHP_SELF'] . '?facid=' . $object->id; + $genallowed = $user->rights->facture->lire; + $delallowed = $user->rights->facture->creer; + + print $formfile->showdocuments('facture', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->modelpdf, 1, 0, 0, 28, 0, '', '', '', $soc->default_lang); + $somethingshown = $formfile->numoffiles; + */ + // Show links to link elements + //$linktoelem = $form->showLinkToObjectBlock($object, null, array('subscription')); + $somethingshown = $form->showLinkedObjectBlock($object, ''); + + // Show links to link elements + /*$linktoelem = $form->showLinkToObjectBlock($object,array('order')); + if ($linktoelem) print ($somethingshown?'':'
').$linktoelem; + */ + + 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, 'invoice', $socid, 1); + */ + + print '
'; } -// If no record found -if ($num == 0) -{ - $colspan=1; - foreach($arrayfields as $key => $val) { if (! empty($val['checked'])) $colspan++; } - print ''.$langs->trans("NoRecordFound").''; -} - -$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; - -print ""; -print ''; -print ''; - - // End of page llxFooter(); $db->close(); From 2f36354c8d88c4363d2915136bd534e0ed800416 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 17 Jan 2019 18:09:25 +0100 Subject: [PATCH 12/40] Update list.php --- htdocs/adherents/subscription/list.php | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/htdocs/adherents/subscription/list.php b/htdocs/adherents/subscription/list.php index 7ef9b36487c..85c92196a73 100644 --- a/htdocs/adherents/subscription/list.php +++ b/htdocs/adherents/subscription/list.php @@ -76,7 +76,7 @@ $fieldstosearchall = array( ); $arrayfields=array( 'd.ref'=>array('label'=>$langs->trans("Ref"), 'checked'=>1), - 'd.fk_type'=>array('label'=>$langs->trans("Type"), 'checked'=>1), + 'd.fk_type'=>array('label'=>$langs->trans("Type"), 'checked'=>1), 'd.lastname'=>array('label'=>$langs->trans("Lastname"), 'checked'=>1), 'd.firstname'=>array('label'=>$langs->trans("Firstname"), 'checked'=>1), 'd.login'=>array('label'=>$langs->trans("Login"), 'checked'=>1), @@ -115,17 +115,17 @@ if (empty($reshook)) // Purge search criteria if (GETPOST('button_removefilter_x','alpha') || GETPOST('button_removefilter.x','alpha') || GETPOST('button_removefilter','alpha')) // All tests are required to be compatible with all browsers { - $search=""; - $search_type=""; - $search_ref=""; - $search_lastname=""; - $search_firstname=""; - $search_login=""; - $search_note=""; - $search_amount=""; - $search_account=""; - $toselect=''; - $search_array_options=array(); + $search=""; + $search_type=""; + $search_ref=""; + $search_lastname=""; + $search_firstname=""; + $search_login=""; + $search_note=""; + $search_amount=""; + $search_account=""; + $toselect=''; + $search_array_options=array(); } } From 3deec2c8c8a8cb9fae65bf8a975b003928629b1c Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 17 Jan 2019 18:58:08 +0100 Subject: [PATCH 13/40] Update card.php --- htdocs/adherents/subscription/card.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/adherents/subscription/card.php b/htdocs/adherents/subscription/card.php index 3faa6974c8f..014806a2a2f 100644 --- a/htdocs/adherents/subscription/card.php +++ b/htdocs/adherents/subscription/card.php @@ -313,13 +313,13 @@ if ($rowid && $action != 'edit') print ''; print ''.$langs->trans("Type").''; print ''; - if ( ! empty($object->fk_type) ) { - $adht->fetch($object->fk_type); + if ( ! empty($object->fk_type) ) { + $adht->fetch($object->fk_type); print $adht->getNomUrl(1); } else { - print $langs->trans("NoType"); + print $langs->trans("NoType"); } - print ''; + print ''; // Member $adh->ref=$adh->getFullName($langs); From 1a10d8f702152a8d6c878e830d09b87aa663027b Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 17 Jan 2019 16:25:35 +0100 Subject: [PATCH 14/40] FIX loadLangs in subscription list.php for v9 et develop --- htdocs/adherents/subscription/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/adherents/subscription/list.php b/htdocs/adherents/subscription/list.php index 9eed2238f80..fabc188cfb5 100644 --- a/htdocs/adherents/subscription/list.php +++ b/htdocs/adherents/subscription/list.php @@ -28,7 +28,7 @@ require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent.class.php'; require_once DOL_DOCUMENT_ROOT.'/adherents/class/subscription.class.php'; require_once DOL_DOCUMENT_ROOT.'/compta/bank/class/account.class.php'; -$langs->load(array("members","companies")); +$langs->loadLangs(array("members","companies")); $action=GETPOST('action','aZ09'); $massaction=GETPOST('massaction','alpha'); From b05f6d82fa3f6e15fbf9fd952bf6de6af3ec4174 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 17 Jan 2019 19:38:19 +0100 Subject: [PATCH 15/40] Update subscription.class.php --- htdocs/adherents/class/subscription.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/adherents/class/subscription.class.php b/htdocs/adherents/class/subscription.class.php index 11dd80b90ee..96876eb82b6 100644 --- a/htdocs/adherents/class/subscription.class.php +++ b/htdocs/adherents/class/subscription.class.php @@ -105,7 +105,7 @@ class Subscription extends CommonObject $sql = "INSERT INTO ".MAIN_DB_PREFIX."subscription (fk_adherent, fk_type, datec, dateadh, datef, subscription, note)"; - if ($this->fk_type == NULL) { + if ($this->fk_type == null) { require_once DOL_DOCUMENT_ROOT.'/adherents/class/adherent_type.class.php'; $member=new Adherent($this->db); $result=$member->fetch($this->fk_adherent); From 4be8d8a945e5f827a10dca6c7d1c1d097d60678f Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 17 Jan 2019 20:01:28 +0100 Subject: [PATCH 16/40] FIX lang libelle in list.php --- htdocs/adherents/subscription/list.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/adherents/subscription/list.php b/htdocs/adherents/subscription/list.php index 89d2fc00555..f293ca51184 100644 --- a/htdocs/adherents/subscription/list.php +++ b/htdocs/adherents/subscription/list.php @@ -77,7 +77,7 @@ $arrayfields=array( 'd.lastname'=>array('label'=>$langs->trans("Lastname"), 'checked'=>1), 'd.firstname'=>array('label'=>$langs->trans("Firstname"), 'checked'=>1), 'd.login'=>array('label'=>$langs->trans("Login"), 'checked'=>1), - 't.libelle'=>array('label'=>$langs->trans("Type"), 'checked'=>1), + 't.libelle'=>array('label'=>$langs->trans("Label"), 'checked'=>1), 'd.bank'=>array('label'=>$langs->trans("BankAccount"), 'checked'=>1, 'enabled'=>(! empty($conf->banque->enabled))), /*'d.note_public'=>array('label'=>$langs->trans("NotePublic"), 'checked'=>0), 'd.note_private'=>array('label'=>$langs->trans("NotePrivate"), 'checked'=>0),*/ From 5b037d87cb96b26f80aae62764de1378be1bfdea Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Thu, 17 Jan 2019 20:04:44 +0100 Subject: [PATCH 17/40] Update doc --- build/README | 6 ++---- build/exe/doliwamp/doliwamp.iss | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/build/README b/build/README index 4816be8bc3a..f8c774a711c 100644 --- a/build/README +++ b/build/README @@ -19,11 +19,9 @@ Note: Prerequisites to build autoexe DoliWamp package: > Install InnoSetup For example by running isetup-5.3.9.exe (http://www.jrsoftware.org) > Install WampServer into "C:\Program Files\Wamp" - For example by running wampserver2.2e-php5.4.3-httpd-2.4.2-mysql5.5.24-x64.exe (http://www.wampserver.com) -> Install WampServer addon to have versions: Apache2.2.11, Mysql5.0.45, Php5.3.0 - For example by running WampServer2-APACHE2211.exe (http://www.wampserver.com) + For example by running wampserver2.5-Apache-2.4.9-Mysql-5.6.17-php5.5.12-32b.exe (http://www.wampserver.com) +> Install WampServer addon to have versions: Mysql5.0.45 For example by running WampServer2-MYSQL5045.exe (http://www.wampserver.com) - For example by running WampServer2-PHP530.exe (http://www.wampserver.com) > To build from Windows (running from makepack-dolibarr.pl script is however recommanded), open file build/exe/doliwamp.iss and click on button "Compile". The .exe file will be build into directory build. diff --git a/build/exe/doliwamp/doliwamp.iss b/build/exe/doliwamp/doliwamp.iss index cc6a39a62a4..587f2584dbe 100644 --- a/build/exe/doliwamp/doliwamp.iss +++ b/build/exe/doliwamp/doliwamp.iss @@ -32,7 +32,7 @@ AppPublisherURL=https://www.nltechno.com AppSupportURL=https://www.dolibarr.org AppUpdatesURL=https://www.dolibarr.org AppComments=DoliWamp includes Dolibarr, Apache, PHP and Mysql softwares. -AppCopyright=Copyright (C) 2008-2018 Laurent Destailleur (NLTechno), Fabian Rodriguez (Le Goût du Libre) +AppCopyright=Copyright (C) 2008-2019 Laurent Destailleur (NLTechno), Fabian Rodriguez (Le Goût du Libre) DefaultDirName=c:\dolibarr DefaultGroupName=Dolibarr ;LicenseFile=COPYING From a36cf5f2c7b83082d4351c979522a08449e243f5 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 17 Jan 2019 20:34:45 +0100 Subject: [PATCH 18/40] Update 9.0.0-10.0.0.sql --- htdocs/install/mysql/migration/9.0.0-10.0.0.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql index 264f0cdfc6c..385e13b1905 100644 --- a/htdocs/install/mysql/migration/9.0.0-10.0.0.sql +++ b/htdocs/install/mysql/migration/9.0.0-10.0.0.sql @@ -80,7 +80,7 @@ create table llx_mailing_unsubscribe ALTER TABLE llx_mailing_unsubscribe ADD UNIQUE uk_mailing_unsubscribe(email, entity, unsubscribegroup); ALTER TABLE llx_adherent ADD gender VARCHAR(10); -ALTER TABLE llx_subscription ADD fk_type int(11); +ALTER TABLE llx_subscription ADD fk_type integer(11); -- Add url_id into unique index of bank_url ALTER TABLE llx_bank_url DROP INDEX uk_bank_url; From 9ae08d789737644840b212ab467dbd0d24cc5983 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 17 Jan 2019 22:22:31 +0100 Subject: [PATCH 19/40] FIX constant DONATION_USE_THIRDPARTIES in admin --- htdocs/don/admin/donation.php | 51 ++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/htdocs/don/admin/donation.php b/htdocs/don/admin/donation.php index 97dc4b68d99..69736fdaca9 100644 --- a/htdocs/don/admin/donation.php +++ b/htdocs/don/admin/donation.php @@ -4,6 +4,7 @@ * Copyright (C) 2013-2017 Philippe Grand * Copyright (C) 2015-2017 Alexandre Spangaro * Copyright (C) 2015 Benoit Bruchard + * Copyright (C) 2019 Thibault FOUCART * * 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 @@ -153,6 +154,37 @@ if ($action == 'set_DONATION_MESSAGE') } } +/* + * Action + */ +if (preg_match('/set_([a-z0-9_\-]+)/i',$action,$reg)) +{ + $code=$reg[1]; + if (dolibarr_set_const($db, $code, 1, 'chaine', 0, '', $conf->entity) > 0) + { + header("Location: ".$_SERVER["PHP_SELF"]); + exit; + } + else + { + dol_print_error($db); + } +} + +if (preg_match('/del_([a-z0-9_\-]+)/i',$action,$reg)) +{ + $code=$reg[1]; + if (dolibarr_del_const($db, $code, $conf->entity) > 0) + { + header("Location: ".$_SERVER["PHP_SELF"]); + exit; + } + else + { + dol_print_error($db); + } +} + /* * View */ @@ -317,11 +349,24 @@ print ''; print ''; print ''; +print ''; +print $form->textwithpicto($langs->trans("DonationUserThirdparties"), $langs->trans("DonationUserThirdpartiesDesc")); +print ''; +print ''; +if ($conf->use_javascript_ajax) { + print ajax_constantonoff('DONATION_USE_THIRDPARTIES'); +} else { + $arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes")); + print $form->selectarray("DONATION_USE_THIRDPARTIES", $arrval, $conf->global->DONATION_USE_THIRDPARTIES); +} +print "\n"; +print "\n"; +print ''; print ''; $label = $langs->trans("AccountAccounting"); print ''; -print ''; +print ''; if (! empty($conf->accounting->enabled)) { print $formaccounting->select_account($conf->global->DONATION_ACCOUNTINGACCOUNT, 'DONATION_ACCOUNTINGACCOUNT', 1, '', 1, 1); @@ -330,7 +375,7 @@ else { print ''; } -print ''; +print ''; print ''; print "\n"; print ''; @@ -342,7 +387,7 @@ print ''; print ''; print $langs->trans("FreeTextOnDonations").' '.img_info($langs->trans("AddCRIfTooLong")).'
'; print ''; -print ''; +print ''; print ''; print "\n"; From 796b19bc1bb4e339699ece3e8c32240aa65003a3 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Thu, 17 Jan 2019 22:40:34 +0100 Subject: [PATCH 20/40] Update members.lang --- htdocs/langs/fr_FR/members.lang | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/htdocs/langs/fr_FR/members.lang b/htdocs/langs/fr_FR/members.lang index a27cd5c5747..300b1f55ac8 100644 --- a/htdocs/langs/fr_FR/members.lang +++ b/htdocs/langs/fr_FR/members.lang @@ -121,11 +121,11 @@ SubscriptionReminderEmail=Rappel de cotisation YourMembershipWasCanceled=Votre adhésion a été annulée CardContent=Contenu de votre fiche adhérent # Text of email templates -ThisIsContentOfYourMembershipRequestWasReceived=Nous vous informons que votre demande d'adhésion a bien été reçue.

+ThisIsContentOfYourMembershipRequestWasReceived=Nous vous informons que votre demande d'adhésion a bien été reçue.

ThisIsContentOfYourMembershipWasValidated=Nous vous informons que votre adhésion a été validé avec les informations suivantes:

ThisIsContentOfYourSubscriptionWasRecorded=Nous vous informons que votre nouvelle cotisation a été enregistrée.

-ThisIsContentOfSubscriptionReminderEmail=Nous voulons vous informer que votre adhésion est sur le point d'expirer. Nous espérons que vous pourrez la renouveler, votre soutien nous ait précieux

-ThisIsContentOfYourCard=Ceci est un rappel des informations que nous avons vos concernant. N'hésitez pas à nous contacter en cas d'erreur.

+ThisIsContentOfSubscriptionReminderEmail=Nous voulons vous informer que votre adhésion est sur le point d'expirer. Nous espérons que vous pourrez la renouveler, votre soutien nous ait précieux

+ThisIsContentOfYourCard=Ceci est un rappel des informations que nous avons vous concernant. N'hésitez pas à nous contacter en cas d'erreur.

DescADHERENT_AUTOREGISTER_NOTIF_MAIL_SUBJECT=Sujet de l'email reçu en cas d'auto-inscription d'un invité DescADHERENT_AUTOREGISTER_NOTIF_MAIL=Email reçu en cas d'auto-inscription d'un invité DescADHERENT_EMAIL_TEMPLATE_AUTOREGISTER=Modèle Email à utiliser pour envoyer un email à un adhérent sur auto-adhésion de l'adhérent From 68c6ccae22b4c2c3ac15f654041782c82f06a21b Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Fri, 18 Jan 2019 10:06:45 +0100 Subject: [PATCH 21/40] update with html5 compliant code --- htdocs/compta/bank/bankentries_list.php | 4 ++-- htdocs/compta/bank/list.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/compta/bank/bankentries_list.php b/htdocs/compta/bank/bankentries_list.php index 0540327c40f..a8d86c1a5f9 100644 --- a/htdocs/compta/bank/bankentries_list.php +++ b/htdocs/compta/bank/bankentries_list.php @@ -1520,8 +1520,8 @@ if ($resql) $i++; if ($i == 1) { - if ($num < $limit && empty($offset)) print ''.$langs->trans("Total").''; - else print ''.$langs->trans("Totalforthispage").''; + if ($num < $limit && empty($offset)) print ''.$langs->trans("Total").''; + else print ''.$langs->trans("Totalforthispage").''; } elseif ($totalarray['totaldebfield'] == $i) print ''.price(-1 * $totalarray['totaldeb']).''; elseif ($totalarray['totalcredfield'] == $i) print ''.price($totalarray['totalcred']).''; diff --git a/htdocs/compta/bank/list.php b/htdocs/compta/bank/list.php index e83347e876a..cc93cfd61a1 100644 --- a/htdocs/compta/bank/list.php +++ b/htdocs/compta/bank/list.php @@ -588,8 +588,8 @@ if (isset($totalarray['totalbalancefield']) && $lastcurrencycode != 'various') / $i++; if ($i == 1) { - if ($num < $limit && empty($offset)) print ''.$langs->trans("Total").''; - else print ''.$langs->trans("Totalforthispage").''; + if ($num < $limit && empty($offset)) print ''.$langs->trans("Total").''; + else print ''.$langs->trans("Totalforthispage").''; } elseif ($totalarray['totalbalancefield'] == $i) print ''.price($totalarray['totalbalance'], 0, $langs, 0, 0, -1, $lastcurrencycode).''; else print ''; From 80968440622d25fa9dabe983252c92103b974746 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Fri, 18 Jan 2019 10:10:39 +0100 Subject: [PATCH 22/40] update with html5 compliant code --- htdocs/compta/cashcontrol/cashcontrol_list.php | 4 ++-- htdocs/compta/cashcontrol/report.php | 4 ++-- htdocs/compta/charges/index.php | 12 ++++++------ htdocs/compta/facture/fiche-rec.php | 2 +- htdocs/compta/facture/invoicetemplate_list.php | 4 ++-- htdocs/compta/facture/list.php | 4 ++-- htdocs/compta/facture/prelevement.php | 6 +++--- htdocs/compta/facture/stats/index.php | 2 +- 8 files changed, 19 insertions(+), 19 deletions(-) diff --git a/htdocs/compta/cashcontrol/cashcontrol_list.php b/htdocs/compta/cashcontrol/cashcontrol_list.php index 11c14218440..e6358fcb5eb 100644 --- a/htdocs/compta/cashcontrol/cashcontrol_list.php +++ b/htdocs/compta/cashcontrol/cashcontrol_list.php @@ -521,8 +521,8 @@ if (isset($totalarray['pos'])) { if ($i == 1) { - if ($num < $limit) print ''.$langs->trans("Total").''; - else print ''.$langs->trans("Totalforthispage").''; + if ($num < $limit) print ''.$langs->trans("Total").''; + else print ''.$langs->trans("Totalforthispage").''; } else print ''; } diff --git a/htdocs/compta/cashcontrol/report.php b/htdocs/compta/cashcontrol/report.php index 749d112f711..51f3c096f56 100644 --- a/htdocs/compta/cashcontrol/report.php +++ b/htdocs/compta/cashcontrol/report.php @@ -240,8 +240,8 @@ if ($resql) $i++; if ($i == 1) { - if ($num < $limit && empty($offset)) print ''.$langs->trans("Total").''; - else print ''.$langs->trans("Totalforthispage").''; + if ($num < $limit && empty($offset)) print ''.$langs->trans("Total").''; + else print ''.$langs->trans("Totalforthispage").''; } elseif ($totalarray['totaldebfield'] == $i) print ''.price(-1 * $totalarray['totaldeb']).''; elseif ($totalarray['totalcredfield'] == $i) print ''.price($totalarray['totalcred']).''; diff --git a/htdocs/compta/charges/index.php b/htdocs/compta/charges/index.php index 86e963e50df..c77805a4a73 100644 --- a/htdocs/compta/charges/index.php +++ b/htdocs/compta/charges/index.php @@ -294,7 +294,7 @@ if (! empty($conf->tax->enabled) && $user->rights->tax->charges->lire) print ''; - print ''.dol_print_date($db->jdate($obj->dm),'day').''."\n"; + print ''.dol_print_date($db->jdate($obj->dm),'day').''."\n"; print "".$obj->label."\n"; @@ -303,7 +303,7 @@ if (! empty($conf->tax->enabled) && $user->rights->tax->charges->lire) // Ref payment $tva_static->id=$obj->rowid; $tva_static->ref=$obj->rowid; - print ''.$tva_static->getNomUrl(1)."\n"; + print ''.$tva_static->getNomUrl(1)."\n"; // Date print ''.dol_print_date($db->jdate($obj->dm),'day')."\n"; @@ -423,14 +423,14 @@ while($j<$numlt) $total = $total + $obj->amount; print ''; - print ''.dol_print_date($db->jdate($obj->dm),'day').''."\n"; + print ''.dol_print_date($db->jdate($obj->dm),'day').''."\n"; print "".$obj->label."\n"; // Ref payment $tva_static->id=$obj->rowid; $tva_static->ref=$obj->rowid; - print ''.$tva_static->getNomUrl(1)."\n"; + print ''.$tva_static->getNomUrl(1)."\n"; print ''.dol_print_date($db->jdate($obj->dp),'day')."\n"; print ''.price($obj->amount).""; @@ -508,14 +508,14 @@ if (! empty($conf->salaries->enabled) && ! empty($user->rights->salaries->read)) print ''; - print ''.dol_print_date($db->jdate($obj->dateep),'day').''."\n"; + print ''.dol_print_date($db->jdate($obj->dateep),'day').''."\n"; print "".$obj->label."\n"; // Ref payment $sal_static->id=$obj->rowid; $sal_static->ref=$obj->rowid; - print ''.$sal_static->getNomUrl(1)."\n"; + print ''.$sal_static->getNomUrl(1)."\n"; // Date print ''.dol_print_date($db->jdate($obj->datep),'day')."\n"; diff --git a/htdocs/compta/facture/fiche-rec.php b/htdocs/compta/facture/fiche-rec.php index 3733247f9e5..c048737b156 100644 --- a/htdocs/compta/facture/fiche-rec.php +++ b/htdocs/compta/facture/fiche-rec.php @@ -1476,7 +1476,7 @@ else print ''; print " ".$form->selectarray('unit_frequency', array('d'=>$langs->trans('Day'), 'm'=>$langs->trans('Month'), 'y'=>$langs->trans('Year')), ($object->unit_frequency?$object->unit_frequency:'m')); print ''; - print ''; + print ''; print ''; } else diff --git a/htdocs/compta/facture/invoicetemplate_list.php b/htdocs/compta/facture/invoicetemplate_list.php index c28b0917e1e..be372e8a570 100644 --- a/htdocs/compta/facture/invoicetemplate_list.php +++ b/htdocs/compta/facture/invoicetemplate_list.php @@ -688,8 +688,8 @@ if ($resql) { if ($i == 1) { - if ($num < $limit) print ''.$langs->trans("Total").''; - else print ''.$langs->trans("Totalforthispage").''; + if ($num < $limit) print ''.$langs->trans("Total").''; + else print ''.$langs->trans("Totalforthispage").''; } else print ''; } diff --git a/htdocs/compta/facture/list.php b/htdocs/compta/facture/list.php index b730ce98625..7a06e6f66df 100644 --- a/htdocs/compta/facture/list.php +++ b/htdocs/compta/facture/list.php @@ -1202,8 +1202,8 @@ if ($resql) $i++; if ($i == 1) { - if ($num < $limit && empty($offset)) print ''.$langs->trans("Total").''; - else print ''.$langs->trans("Totalforthispage").''; + if ($num < $limit && empty($offset)) print ''.$langs->trans("Total").''; + else print ''.$langs->trans("Totalforthispage").''; } elseif ($totalarray['totalhtfield'] == $i) print ''.price($totalarray['totalht']).''; elseif ($totalarray['totalvatfield'] == $i) print ''.price($totalarray['totalvat']).''; diff --git a/htdocs/compta/facture/prelevement.php b/htdocs/compta/facture/prelevement.php index 907d2357950..07e8678e447 100644 --- a/htdocs/compta/facture/prelevement.php +++ b/htdocs/compta/facture/prelevement.php @@ -575,7 +575,7 @@ if ($object->id > 0) print ''; print ''; - print ''; + print ''; print ''; print ''; print ''; @@ -607,7 +607,7 @@ if ($object->id > 0) $obj = $db->fetch_object($result_sql); print ''; - print '\n"; + print '\n"; print ''; print ''; print ''; @@ -657,7 +657,7 @@ if ($object->id > 0) print ''; - print '\n"; + print '\n"; print ''; diff --git a/htdocs/compta/facture/stats/index.php b/htdocs/compta/facture/stats/index.php index cbf147a8dff..0b0520b4737 100644 --- a/htdocs/compta/facture/stats/index.php +++ b/htdocs/compta/facture/stats/index.php @@ -255,7 +255,7 @@ print '
'; print $form->select_dolusers($userid, 'userid', 1, '', 0, '', '', 0, 0, 0, '', 0, '', 'maxwidth300'); print '
'; // Status - print ''; - print ''; print ''; diff --git a/htdocs/compta/paiement_charge.php b/htdocs/compta/paiement_charge.php index 38cee6b8434..0b497510bf6 100644 --- a/htdocs/compta/paiement_charge.php +++ b/htdocs/compta/paiement_charge.php @@ -264,7 +264,7 @@ if ($action == 'create') print '
'.$langs->trans("DateRequest").''.$langs->trans("DateRequest").''.$langs->trans("User").''.$langs->trans("Amount").''.$langs->trans("WithdrawalReceipt").'
'.dol_print_date($db->jdate($obj->date_demande),'day')."'.dol_print_date($db->jdate($obj->date_demande),'day')."'.img_object($langs->trans("ShowUser"),'user').' '.$obj->login.''.price($obj->amount).'-
'.dol_print_date($db->jdate($obj->date_demande),'day')."'.dol_print_date($db->jdate($obj->date_demande),'day')."'.img_object($langs->trans("ShowUser"),'user').' '.$obj->login.'
'.$langs->trans("Status").''; + print '
'.$langs->trans("Status").''; if ($mode == 'customer') { $liststatus=array('0'=>$langs->trans("BillStatusDraft"), '1'=>$langs->trans("BillStatusNotPaid"), '2'=>$langs->trans("BillStatusPaid"), '3'=>$langs->trans("BillStatusCanceled")); From 539660a45d3852f3a0939df0d57dc7c0e729fe08 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Fri, 18 Jan 2019 10:13:05 +0100 Subject: [PATCH 23/40] update with html5 compliant code --- htdocs/compta/localtax/clients.php | 8 ++++---- htdocs/compta/localtax/list.php | 4 ++-- htdocs/compta/localtax/quadri_detail.php | 12 ++++++------ htdocs/compta/sociales/list.php | 4 ++-- htdocs/compta/sociales/payments.php | 12 ++++++------ 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/htdocs/compta/localtax/clients.php b/htdocs/compta/localtax/clients.php index ff89a95414e..574c7103c61 100644 --- a/htdocs/compta/localtax/clients.php +++ b/htdocs/compta/localtax/clients.php @@ -159,8 +159,8 @@ if($calc ==0 || $calc == 2) { print ""; print ""; - print '"; - print '"; + print '"; + print '"; print ""; print ""; print ""; @@ -240,8 +240,8 @@ if($calc ==0 || $calc == 2) if($calc ==0 || $calc == 1){ print "
'.$langs->trans("Num")."'.$langs->trans("Customer")."'.$langs->trans("Num")."'.$langs->trans("Customer")."".$langs->transcountry("ProfId1",$mysoc->country_code)."".$langs->trans("TotalHT")."".$vatcust."
"; print ""; - print '"; - print '"; + print '"; + print '"; print ""; print ""; print ""; diff --git a/htdocs/compta/localtax/list.php b/htdocs/compta/localtax/list.php index 37ead35433c..881420cc89e 100644 --- a/htdocs/compta/localtax/list.php +++ b/htdocs/compta/localtax/list.php @@ -83,8 +83,8 @@ if ($result) $localtax_static->ref=$obj->rowid; print "\n"; print "\n"; - print '\n"; - print '\n"; + print '\n"; + print '\n"; $total = $total + $obj->amount; print ""; diff --git a/htdocs/compta/localtax/quadri_detail.php b/htdocs/compta/localtax/quadri_detail.php index 9f5d13f98a3..73a9f77341a 100644 --- a/htdocs/compta/localtax/quadri_detail.php +++ b/htdocs/compta/localtax/quadri_detail.php @@ -318,8 +318,8 @@ else //{ // Customers invoices print ''; - print ''; - print ''; + print ''; + print ''; if ($modetax != 2) print ''; if ($modetax != 1) print ''; print ''; @@ -360,7 +360,7 @@ else print ''; // Description - print ''; - print ''; if (! empty($conf->global->MAIN_SHOW_HT_ON_SUMMARY)) print ''; @@ -774,7 +774,7 @@ if (! empty($conf->facture->enabled) && ! empty($conf->commande->enabled) && $us print ''; - print ''; if (! empty($conf->global->MAIN_SHOW_HT_ON_SUMMARY)) print ''; @@ -898,7 +898,7 @@ if (! empty($conf->facture->enabled) && $user->rights->facture->lire) print '
'.$langs->trans("Num")."'.$langs->trans("Supplier")."'.$langs->trans("Num")."'.$langs->trans("Supplier")."".$langs->transcountry("ProfId1",$mysoc->country_code)."".$langs->trans("TotalHT")."".$vatsup."".$localtax_static->getNomUrl(1)."".dol_trunc($obj->label,40)."'.dol_print_date($db->jdate($obj->datev),'day')."'.dol_print_date($db->jdate($obj->datep),'day')."'.dol_print_date($db->jdate($obj->datev),'day')."'.dol_print_date($db->jdate($obj->datep),'day')."".price($obj->amount)."
'.$elementcust.''.$productcust.''.$elementcust.''.$productcust.''.$amountcust.''.$langs->trans("Payment").' ('.$langs->trans("PercentOfInvoice").')'.$langs->trans("BI").''.$fields['link'].''; + print ''; if ($fields['pid']) { $product_static->id=$fields['pid']; @@ -481,8 +481,8 @@ else echo ''; //print table headers for this quadri - expenses now print ''; - print ''; - print ''; + print ''; + print ''; if ($modetax != 1) { print ''; @@ -522,7 +522,7 @@ else print ''; // Description - print ''; - if ($num < $limit && empty($offset)) print ''; - else print ''; + if ($num < $limit && empty($offset)) print ''; + else print ''; print ''; print ''; print ''; diff --git a/htdocs/compta/sociales/payments.php b/htdocs/compta/sociales/payments.php index 8dc443aee6b..efdd39d2205 100644 --- a/htdocs/compta/sociales/payments.php +++ b/htdocs/compta/sociales/payments.php @@ -259,7 +259,7 @@ if (! empty($conf->tax->enabled) && $user->rights->tax->charges->lire) $total = $total + $obj->amount; print ''; - print ''."\n"; + print ''."\n"; print "\n"; @@ -268,7 +268,7 @@ if (! empty($conf->tax->enabled) && $user->rights->tax->charges->lire) // Ref payment $tva_static->id=$obj->rowid; $tva_static->ref=$obj->rowid; - print '\n"; + print '\n"; print '\n"; print '"; @@ -360,7 +360,7 @@ while($j<$numlt) $total = $total + $obj->amount; print ''; - print ''."\n"; + print ''."\n"; print "\n"; @@ -369,7 +369,7 @@ while($j<$numlt) // Ref payment $tva_static->id=$obj->rowid; $tva_static->ref=$obj->rowid; - print '\n"; + print '\n"; print '\n"; print '"; @@ -442,7 +442,7 @@ if (! empty($conf->salaries->enabled) && ! empty($user->rights->salaries->read)) print ''; - print ''."\n"; + print ''."\n"; print "\n"; @@ -451,7 +451,7 @@ if (! empty($conf->salaries->enabled) && ! empty($user->rights->salaries->read)) // Ref payment $sal_static->id=$obj->rowid; $sal_static->ref=$obj->rowid; - print '\n"; + print '\n"; print '\n"; print '"; From 44708ce7d53453f4e1b2e16d7c0235c75caabb6c Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Fri, 18 Jan 2019 10:16:51 +0100 Subject: [PATCH 24/40] update with html5 compliant code --- htdocs/compta/stats/byratecountry.php | 20 +++++++-------- htdocs/compta/tva/clients.php | 32 ++++++++++++------------ htdocs/compta/tva/quadri_detail.php | 36 +++++++++++++-------------- 3 files changed, 44 insertions(+), 44 deletions(-) diff --git a/htdocs/compta/stats/byratecountry.php b/htdocs/compta/stats/byratecountry.php index e4fecab5060..df199d2e23e 100644 --- a/htdocs/compta/stats/byratecountry.php +++ b/htdocs/compta/stats/byratecountry.php @@ -250,8 +250,8 @@ if ($modecompta == 'CREANCES-DETTES') print '
'.$elementsup.''.$productsup.''.$elementsup.''.$productsup.''.$amountsup.''.$fields['link'].''; + print ''; if ($fields['pid']) { $product_static->id=$fields['pid']; diff --git a/htdocs/compta/sociales/list.php b/htdocs/compta/sociales/list.php index be3e7ea5791..261ca57cb94 100644 --- a/htdocs/compta/sociales/list.php +++ b/htdocs/compta/sociales/list.php @@ -287,8 +287,8 @@ if ($resql) if (isset($totalarray['totalttcfield'])) { print '
'.$langs->trans("Total").''.$langs->trans("Totalforthispage").''.$langs->trans("Total").''.$langs->trans("Totalforthispage").'
'.dol_print_date($db->jdate($obj->dm),'day').''.dol_print_date($db->jdate($obj->dm),'day').'".$obj->label."'.$tva_static->getNomUrl(1)."'.$tva_static->getNomUrl(1)."'.dol_print_date($db->jdate($obj->dm),'day')."'.price($obj->amount)."
'.dol_print_date($db->jdate($obj->dm),'day').''.dol_print_date($db->jdate($obj->dm),'day').'".$obj->label."'.$tva_static->getNomUrl(1)."'.$tva_static->getNomUrl(1)."'.dol_print_date($db->jdate($obj->dp),'day')."'.price($obj->amount)."
'.dol_print_date($db->jdate($obj->dateep),'day').''.dol_print_date($db->jdate($obj->dateep),'day').'".$obj->label."'.$sal_static->getNomUrl(1)."'.$sal_static->getNomUrl(1)."'.dol_print_date($db->jdate($obj->datep),'day')."'.price($obj->amount)."
'; print ''; -print ''; -print ''; +print ''; +print ''; $i=0; while($i < 12) { @@ -292,9 +292,9 @@ if ($resql) { while ( $obj = $db->fetch_object($resql)) { print ''; if ($obj->product_type == 0) { - print ''; + print ''; } else { - print ''; + print ''; } print ''; for($i = 0; $i < 12; $i++) { @@ -312,7 +312,7 @@ if ($resql) { // Total print ''; - print ''; + print ''; print ''; for($i = 0; $i < 12; $i++) { $j = $i + (empty($conf->global->SOCIETE_FISCAL_MONTH_START)?1:$conf->global->SOCIETE_FISCAL_MONTH_START); @@ -328,8 +328,8 @@ if ($resql) { print ''; -print ''; -print ''; +print ''; +print ''; $i=0; while($i < 12) { @@ -371,9 +371,9 @@ if ($resql2) { while ( $obj = $db->fetch_object($resql2)) { print ''; if ($obj->product_type == 0) { - print ''; + print ''; } else { - print ''; + print ''; } print ''; for($i = 0; $i < 12; $i++) { @@ -391,7 +391,7 @@ if ($resql2) { // Total print ''; - print ''; + print ''; print ''; for($i = 0; $i < 12; $i++) { $j = $i + (empty($conf->global->SOCIETE_FISCAL_MONTH_START)?1:$conf->global->SOCIETE_FISCAL_MONTH_START); diff --git a/htdocs/compta/tva/clients.php b/htdocs/compta/tva/clients.php index 74a08d0d142..45b93692e3a 100644 --- a/htdocs/compta/tva/clients.php +++ b/htdocs/compta/tva/clients.php @@ -347,12 +347,12 @@ if (! is_array($x_coll) || ! is_array($x_paye)) // Customers invoices print ''; - print ''; - print ''; - if ($conf->global->TAX_MODE_SELL_PRODUCT == 'payment' || $conf->global->TAX_MODE_SELL_SERVICE == 'payment') print ''; + print ''; + print ''; + if ($conf->global->TAX_MODE_SELL_PRODUCT == 'payment' || $conf->global->TAX_MODE_SELL_SERVICE == 'payment') print ''; else print ''; print ''; - print ''; + print ''; if ($modetax != 1) { print ''; @@ -417,17 +417,17 @@ if (! is_array($x_coll) || ! is_array($x_paye)) print ''; // Invoice date - print ''; + print ''; // Payment date - if ($conf->global->TAX_MODE_SELL_PRODUCT == 'payment' || $conf->global->TAX_MODE_SELL_SERVICE == 'payment') print ''; + if ($conf->global->TAX_MODE_SELL_PRODUCT == 'payment' || $conf->global->TAX_MODE_SELL_SERVICE == 'payment') print ''; else print ''; // Rate print ''; // Description - print ''; - print ''; - print ''; - if ($conf->global->TAX_MODE_BUY_PRODUCT == 'payment' || $conf->global->TAX_MODE_BUY_SERVICE == 'payment') print ''; + print ''; + print ''; + if ($conf->global->TAX_MODE_BUY_PRODUCT == 'payment' || $conf->global->TAX_MODE_BUY_SERVICE == 'payment') print ''; else print ''; - print ''; - print ''; + print ''; + print ''; if ($modetax != 1) { print ''; print ''; @@ -610,17 +610,17 @@ if (! is_array($x_coll) || ! is_array($x_paye)) print ''; // Invoice date - print ''; + print ''; // Payment date - if ($conf->global->TAX_MODE_BUY_PRODUCT == 'payment' || $conf->global->TAX_MODE_BUY_SERVICE == 'payment') print ''; + if ($conf->global->TAX_MODE_BUY_PRODUCT == 'payment' || $conf->global->TAX_MODE_BUY_SERVICE == 'payment') print ''; else print ''; // Company name - print ''; + print ''; // Description - print ''; - print ''; - print ''; - if ($conf->global->TAX_MODE_SELL_PRODUCT == 'payment' || $conf->global->TAX_MODE_SELL_SERVICE == 'payment') print ''; + print ''; + print ''; + if ($conf->global->TAX_MODE_SELL_PRODUCT == 'payment' || $conf->global->TAX_MODE_SELL_SERVICE == 'payment') print ''; else print ''; - print ''; - print ''; + print ''; + print ''; if ($modetax != 1) { print ''; @@ -393,17 +393,17 @@ if (! is_array($x_coll) || ! is_array($x_paye)) print ''; // Invoice date - print ''; + print ''; // Payment date - if ($conf->global->TAX_MODE_SELL_PRODUCT == 'payment' || $conf->global->TAX_MODE_SELL_SERVICE == 'payment') print ''; + if ($conf->global->TAX_MODE_SELL_PRODUCT == 'payment' || $conf->global->TAX_MODE_SELL_SERVICE == 'payment') print ''; else print ''; // Company name - print ''; + print ''; // Description - print ''; - print ''; - print ''; - if ($conf->global->TAX_MODE_BUY_PRODUCT == 'payment' || $conf->global->TAX_MODE_BUY_SERVICE == 'payment') print ''; + print ''; + print ''; + if ($conf->global->TAX_MODE_BUY_PRODUCT == 'payment' || $conf->global->TAX_MODE_BUY_SERVICE == 'payment') print ''; else print ''; - print ''; - print ''; + print ''; + print ''; if ($modetax != 1) { print ''; print ''; @@ -574,17 +574,17 @@ if (! is_array($x_coll) || ! is_array($x_paye)) print ''; // Invoice date - print ''; + print ''; // Payment date - if ($conf->global->TAX_MODE_BUY_PRODUCT == 'payment' || $conf->global->TAX_MODE_BUY_SERVICE == 'payment') print ''; + if ($conf->global->TAX_MODE_BUY_PRODUCT == 'payment' || $conf->global->TAX_MODE_BUY_SERVICE == 'payment') print ''; else print ''; // Company name - print ''; + print ''; // Description - print ''; print ''; - print ''; - print ''; + print ''; + print ''; print ''; print "\n"; $i++; diff --git a/htdocs/compta/index.php b/htdocs/compta/index.php index c6df1479202..e05095b2ea4 100644 --- a/htdocs/compta/index.php +++ b/htdocs/compta/index.php @@ -206,7 +206,7 @@ if (! empty($conf->facture->enabled) && $user->rights->facture->lire) $i++; } - print ''; + print ''; print ''; print ''; } @@ -293,7 +293,7 @@ if (! empty($conf->fournisseur->enabled) && $user->rights->fournisseur->facture- $i++; } - print ''; + print ''; print ''; print ''; } @@ -406,7 +406,7 @@ if (! empty($conf->facture->enabled) && $user->rights->facture->lire) print '
' . $langs->trans("TurnoverbyVatrate") . '' . $langs->trans("ProductOrService") . '' . $langs->trans("Country") . '' . $langs->trans("ProductOrService") . '' . $langs->trans("Country") . '
' . vatrate($obj->vatrate) . ''. $langs->trans("Product") . ''. $langs->trans("Product") . ''. $langs->trans("Service") . ''. $langs->trans("Service") . '' .$obj->country . '
' . $langs->trans("PurchasebyVatrate") . '' . $langs->trans("ProductOrService") . '' . $langs->trans("Country") . '' . $langs->trans("ProductOrService") . '' . $langs->trans("Country") . '
' . vatrate($obj->vatrate) . ''. $langs->trans("Product") . ''. $langs->trans("Product") . ''. $langs->trans("Service") . ''. $langs->trans("Service") . '' . $obj->country . '
'.$elementcust.''.$langs->trans("DateInvoice").''.$langs->trans("DatePayment").''.$elementcust.''.$langs->trans("DateInvoice").''.$langs->trans("DatePayment").''.$namerate.''.$productcust.''.$productcust.''.$amountcust.''.$fields['link'].'' . dol_print_date($fields['datef'], 'day') . '' . dol_print_date($fields['datef'], 'day') . '' . dol_print_date($fields['datep'], 'day') . '' . dol_print_date($fields['datep'], 'day') . '' . $fields['drate'] . ''; + print ''; if ($fields['pid']) { $product_static->id=$fields['pid']; @@ -553,12 +553,12 @@ if (! is_array($x_coll) || ! is_array($x_paye)) // Print table headers for this quadri - expenses now print '
'.$elementsup.''.$langs->trans("DateInvoice").''.$langs->trans("DatePayment").''.$elementsup.''.$langs->trans("DateInvoice").''.$langs->trans("DatePayment").''.$namesup.''.$productsup.''.$namesup.''.$productsup.''.$amountsup.''.$langs->trans("Payment").' ('.$langs->trans("PercentOfInvoice").')'.$fields['link'].'' . dol_print_date($fields['datef'], 'day') . '' . dol_print_date($fields['datef'], 'day') . '' . dol_print_date($fields['datep'], 'day') . '' . dol_print_date($fields['datep'], 'day') . '' . $fields['company_link'] . '' . $fields['company_link'] . ''; + print ''; if ($fields['pid']) { $product_static->id=$fields['pid']; diff --git a/htdocs/compta/tva/quadri_detail.php b/htdocs/compta/tva/quadri_detail.php index ff3e3ce127d..a8e22815ea4 100644 --- a/htdocs/compta/tva/quadri_detail.php +++ b/htdocs/compta/tva/quadri_detail.php @@ -336,12 +336,12 @@ if (! is_array($x_coll) || ! is_array($x_paye)) // Customers invoices print '
'.$elementcust.''.$langs->trans("DateInvoice").''.$langs->trans("DatePayment").''.$elementcust.''.$langs->trans("DateInvoice").''.$langs->trans("DatePayment").''.$namecust.''.$productcust.''.$namecust.''.$productcust.''.$amountcust.''.$fields['link'].'' . dol_print_date($fields['datef'], 'day') . '' . dol_print_date($fields['datef'], 'day') . '' . dol_print_date($fields['datep'], 'day') . '' . dol_print_date($fields['datep'], 'day') . '' . $fields['company_link'] . '' . $fields['company_link'] . ''; + print ''; if ($fields['pid']) { $product_static->id=$fields['pid']; @@ -529,12 +529,12 @@ if (! is_array($x_coll) || ! is_array($x_paye)) // Print table headers for this quadri - expenses now print '
'.$elementsup.''.$langs->trans("DateInvoice").''.$langs->trans("DatePayment").''.$elementsup.''.$langs->trans("DateInvoice").''.$langs->trans("DatePayment").''.$namesup.''.$productsup.''.$namesup.''.$productsup.''.$amountsup.''.$langs->trans("Payment").' ('.$langs->trans("PercentOfInvoice").')'.$fields['link'].'' . dol_print_date($fields['datef'], 'day') . '' . dol_print_date($fields['datef'], 'day') . '' . dol_print_date($fields['datep'], 'day') . '' . dol_print_date($fields['datep'], 'day') . '' . $fields['company_link'] . '' . $fields['company_link'] . ''; + print ''; if ($fields['pid']) { $product_static->id=$fields['pid']; From 0290b744956fb8127109d8be716caf5915e68859 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Fri, 18 Jan 2019 10:18:18 +0100 Subject: [PATCH 25/40] update with html5 compliant code --- htdocs/compta/clients.php | 4 ++-- htdocs/compta/index.php | 10 +++++----- htdocs/compta/paiement_charge.php | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/htdocs/compta/clients.php b/htdocs/compta/clients.php index 2fa9eecec73..c82219cb7be 100644 --- a/htdocs/compta/clients.php +++ b/htdocs/compta/clients.php @@ -184,8 +184,8 @@ if ($resql) print $thirdpartystatic->getNomUrl(1,'compta'); print ''.$obj->town.' '.$obj->code_client.' '.$obj->code_compta.' '.$obj->code_client.' '.$obj->code_compta.' '.dol_print_date($db->jdate($obj->datec)).'
'.$langs->trans("Total").'
'.$langs->trans("Total").''.price($tot_ttc).'
'.$langs->trans("Total").'
'.$langs->trans("Total").''.price($tot_ttc).'
'; print '
'; + print ''; print $thirdpartystatic->getNomUrl(1,'customer',44); print ''.price($obj->total_ht).''; + print ''; print $societestatic->getNomUrl(1,'customer',44); print ''.price($obj->total_ht).'
'; print '
' ; + print '' ; print $societestatic->getNomUrl(1,'customer',44); print ''.dol_print_date($db->jdate($obj->datelimite),'day').'
'; print ''; //print ''; - print ''; + print ''; print ''; print ''; print ''; From 92eeff7a26a3a54b646ad75a436a1491dbc3f674 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 18 Jan 2019 13:12:09 +0100 Subject: [PATCH 26/40] Fix packager and doc --- build/README | 9 +++++---- build/exe/doliwamp/README | 2 +- build/makepack-dolibarr.pl | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/build/README b/build/README index f8c774a711c..27ddf4178fd 100644 --- a/build/README +++ b/build/README @@ -16,6 +16,8 @@ Note: Prerequisites to build tgz, debian, rpm package > apt-get install tar dpkg dpatch p7zip-full rpm zip Note: Prerequisites to build autoexe DoliWamp package: +> apt-get install wine q4wine +> Launch "wine cmd" to check a drive Z: pointing to / exists. > Install InnoSetup For example by running isetup-5.3.9.exe (http://www.jrsoftware.org) > Install WampServer into "C:\Program Files\Wamp" @@ -25,7 +27,9 @@ Note: Prerequisites to build autoexe DoliWamp package: > To build from Windows (running from makepack-dolibarr.pl script is however recommanded), open file build/exe/doliwamp.iss and click on button "Compile". The .exe file will be build into directory build. - +> Add path to ISCC into PATH windows var: + Launch wine cmd, then regedit and add entry int HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment\PATH + - To build a theme package, launch the script > perl makepack-dolibarrtheme.pl @@ -44,9 +48,6 @@ generated packages will not contains this "build" directory. We can find in "build", following sub-directories: -* aps: -To build APS package. - * debian: To build Debian package. diff --git a/build/exe/doliwamp/README b/build/exe/doliwamp/README index 3cbd8986700..9d4c68daf3d 100644 --- a/build/exe/doliwamp/README +++ b/build/exe/doliwamp/README @@ -5,4 +5,4 @@ DOLIWAMP Package tools This directory contains files used by makepack-dolibarr.pl script to build the all-in-on .EXE package DoliWamp, ready -to be distributedt (for Windows). \ No newline at end of file +to be distributed (for Windows). \ No newline at end of file diff --git a/build/makepack-dolibarr.pl b/build/makepack-dolibarr.pl index eca19e576fd..14f28a71edc 100755 --- a/build/makepack-dolibarr.pl +++ b/build/makepack-dolibarr.pl @@ -1058,7 +1058,7 @@ if ($nboftargetok) { $ret=`cat "$SOURCE/build/exe/doliwamp/doliwamp.iss" | sed -e 's/__FILENAMEEXEDOLIWAMP__/$FILENAMEEXEDOLIWAMP/g' > "$SOURCE/build/exe/doliwamp/doliwamp.tmp.iss"`; print "Compil exe $FILENAMEEXEDOLIWAMP.exe file from iss file \"$SOURCEBACK\\build\\exe\\doliwamp\\doliwamp.tmp.iss\"\n"; - $cmd= "ISCC.exe \"Z:$SOURCEBACK\\build\\exe\\doliwamp\\doliwamp.tmp.iss\""; + $cmd= "wine ISCC.exe \"Z:$SOURCEBACK\\build\\exe\\doliwamp\\doliwamp.tmp.iss\""; print "$cmd\n"; $ret= `$cmd`; #print "$ret\n"; From 971670da8ddc92647622763dfd3d893e788c9063 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 18 Jan 2019 14:24:49 +0100 Subject: [PATCH 27/40] Clean language file --- htdocs/langs/en_US/admin.lang | 2 -- 1 file changed, 2 deletions(-) diff --git a/htdocs/langs/en_US/admin.lang b/htdocs/langs/en_US/admin.lang index ebc0d89468b..ce912b72266 100644 --- a/htdocs/langs/en_US/admin.lang +++ b/htdocs/langs/en_US/admin.lang @@ -602,8 +602,6 @@ Module2700Desc=Use online Gravatar service (www.gravatar.com) to show photo of u Module2800Desc=FTP Client Module2900Name=GeoIPMaxmind Module2900Desc=GeoIP Maxmind conversions capabilities -Module3100Name=Skype -Module3100Desc=Add a Skype button into users / third parties / contacts / members cards Module3200Name=Unalterable Archives Module3200Desc=Enable an unalterable log of business events. Events are archived in real-time. The log is a read-only table of chained events that can be exported. This module may be mandatory for some countries. Module4000Name=HRM From 59cfa02bdbb79e987bc52984c18f2d4ba1c96895 Mon Sep 17 00:00:00 2001 From: Philippe GRAND Date: Fri, 18 Jan 2019 16:21:06 +0100 Subject: [PATCH 28/40] missing translation --- htdocs/langs/en_US/companies.lang | 1 + 1 file changed, 1 insertion(+) diff --git a/htdocs/langs/en_US/companies.lang b/htdocs/langs/en_US/companies.lang index 15edbc80e2a..99c1c12f781 100644 --- a/htdocs/langs/en_US/companies.lang +++ b/htdocs/langs/en_US/companies.lang @@ -28,6 +28,7 @@ AliasNames=Alias name (commercial, trademark, ...) AliasNameShort=Alias Name Companies=Companies CountryIsInEEC=Country is inside the European Economic Community +PriceFormatInCurrentLanguage=Price format in current language ThirdPartyName=Third-Party Name ThirdPartyEmail=Third-party Email ThirdParty=Third Party From d6cfd151022e1470df56a00e7d99f0b8ed0815d5 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Fri, 18 Jan 2019 17:56:56 +0100 Subject: [PATCH 29/40] NEW add API REST for donations --- htdocs/don/class/api_donations.class.php | 383 +++++++++++++++++++++++ 1 file changed, 383 insertions(+) create mode 100644 htdocs/don/class/api_donations.class.php diff --git a/htdocs/don/class/api_donations.class.php b/htdocs/don/class/api_donations.class.php new file mode 100644 index 00000000000..8d13dd2d68b --- /dev/null +++ b/htdocs/don/class/api_donations.class.php @@ -0,0 +1,383 @@ + + * Copyright (C) 2016 Laurent Destailleur + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + use Luracast\Restler\RestException; + + require_once DOL_DOCUMENT_ROOT.'/don/class/don.class.php'; + +/** + * API class for donations + * + * @access protected + * @class DolibarrApiAccess {@requires user,external} + */ +class Donations extends DolibarrApi +{ + + /** + * @var array $FIELDS Mandatory fields, checked when create and update object + */ + static $FIELDS = array( + 'socid' + ); + + /** + * @var Don $don {@type Don} + */ + public $don; + + /** + * Constructor + */ + function __construct() + { + global $db, $conf; + $this->db = $db; + $this->don = new Don($this->db); + } + + /** + * Get properties of an donation object + * + * Return an array with donation informations + * + * @param int $id ID of order + * @return array|mixed data without useless information + * + * @throws RestException + */ + function get($id) + { + if(! DolibarrApiAccess::$user->rights->don->lire) { + throw new RestException(401); + } + + $result = $this->don->fetch($id); + if( ! $result ) { + throw new RestException(404, 'Donation not found'); + } + + if( ! DolibarrApi::_checkAccessToResource('commande',$this->don->id)) { + throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); + } + + // Add external contacts ids + //$this->commande->contacts_ids = $this->don->liste_contact(-1,'external',1); + //$this->commande->fetchObjectLinked(); + return $this->_cleanObjectDatas($this->don); + } + + + + /** + * List donations + * + * Get a list of orders + * + * @param string $sortfield Sort field + * @param string $sortorder Sort order + * @param int $limit Limit for list + * @param int $page Page number + * @param string $thirdparty_ids Thirdparty ids to filter orders of. {@example '1' or '1,2,3'} {@pattern /^[0-9,]*$/i} + * @param string $sqlfilters Other criteria to filter answers separated by a comma. Syntax example "(t.ref:like:'SO-%') and (t.date_creation:<:'20160101')" + * @return array Array of order objects + * + * @throws RestException + */ + function index($sortfield = "t.rowid", $sortorder = 'ASC', $limit = 100, $page = 0, $thirdparty_ids = '', $sqlfilters = '') + { + global $db, $conf; + + $obj_ret = array(); + + // case of external user, $thirdparty_ids param is ignored and replaced by user's socid + $socids = DolibarrApiAccess::$user->societe_id ? DolibarrApiAccess::$user->societe_id : $thirdparty_ids; + + // If the internal user must only see his customers, force searching by him + $search_sale = 0; + if (! DolibarrApiAccess::$user->rights->societe->client->voir && !$socids) $search_sale = DolibarrApiAccess::$user->id; + + $sql = "SELECT t.rowid"; + if ((!DolibarrApiAccess::$user->rights->societe->client->voir && !$socids) || $search_sale > 0) $sql .= ", sc.fk_soc, sc.fk_user"; // We need these fields in order to filter by sale (including the case where the user can only see his prospects) + $sql.= " FROM ".MAIN_DB_PREFIX."don as t"; + + if ((!DolibarrApiAccess::$user->rights->societe->client->voir && !$socids) || $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 t.entity IN ('.getEntity('don').')'; + if ((!DolibarrApiAccess::$user->rights->societe->client->voir && !$socids) || $search_sale > 0) $sql.= " AND t.fk_soc = sc.fk_soc"; + if ($socids) $sql.= " AND t.fk_soc IN (".$socids.")"; + if ($search_sale > 0) $sql.= " AND t.rowid = sc.fk_soc"; // Join for the needed table to filter by sale + // Insert sale filter + if ($search_sale > 0) + { + $sql .= " AND sc.fk_user = ".$search_sale; + } + // Add sql filters + if ($sqlfilters) + { + if (! DolibarrApi::_checkFilters($sqlfilters)) + { + throw new RestException(503, 'Error when validating parameter sqlfilters '.$sqlfilters); + } + $regexstring='\(([^:\'\(\)]+:[^:\'\(\)]+:[^:\(\)]+)\)'; + $sql.=" AND (".preg_replace_callback('/'.$regexstring.'/', 'DolibarrApi::_forge_criteria_callback', $sqlfilters).")"; + } + + $sql.= $db->order($sortfield, $sortorder); + if ($limit) { + if ($page < 0) + { + $page = 0; + } + $offset = $limit * $page; + + $sql.= $db->plimit($limit + 1, $offset); + } + + dol_syslog("API Rest request"); + $result = $db->query($sql); + + if ($result) + { + $num = $db->num_rows($result); + $min = min($num, ($limit <= 0 ? $num : $limit)); + $i=0; + while ($i < $min) + { + $obj = $db->fetch_object($result); + $commande_static = new Commande($db); + if($commande_static->fetch($obj->rowid)) { + // Add external contacts ids + $commande_static->contacts_ids = $commande_static->liste_contact(-1,'external',1); + $obj_ret[] = $this->_cleanObjectDatas($commande_static); + } + $i++; + } + } + else { + throw new RestException(503, 'Error when retrieve commande list : '.$db->lasterror()); + } + if( ! count($obj_ret)) { + throw new RestException(404, 'No order found'); + } + return $obj_ret; + } + + /** + * Create donation object + * + * @param array $request_data Request data + * @return int ID of order + */ + function post($request_data = null) + { + if(! DolibarrApiAccess::$user->rights->commande->creer) { + throw new RestException(401, "Insuffisant rights"); + } + // Check mandatory fields + $result = $this->_validate($request_data); + + foreach($request_data as $field => $value) { + $this->commande->$field = $value; + } + /*if (isset($request_data["lines"])) { + $lines = array(); + foreach ($request_data["lines"] as $line) { + array_push($lines, (object) $line); + } + $this->commande->lines = $lines; + }*/ + + if ($this->commande->create(DolibarrApiAccess::$user) < 0) { + throw new RestException(500, "Error creating order", array_merge(array($this->commande->error), $this->commande->errors)); + } + + return $this->commande->id; + } + + /** + * Update order general fields (won't touch lines of order) + * + * @param int $id Id of order to update + * @param array $request_data Datas + * + * @return int + */ + function put($id, $request_data = null) + { + if (! DolibarrApiAccess::$user->rights->commande->creer) { + throw new RestException(401); + } + + $result = $this->commande->fetch($id); + if (! $result) { + throw new RestException(404, 'Order not found'); + } + + if (! DolibarrApi::_checkAccessToResource('commande',$this->commande->id)) { + throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); + } + foreach($request_data as $field => $value) { + if ($field == 'id') continue; + $this->commande->$field = $value; + } + + // Update availability + if (!empty($this->commande->availability_id)) { + if ($this->commande->availability($this->commande->availability_id) < 0) + throw new RestException(400, 'Error while updating availability'); + } + + if ($this->commande->update(DolibarrApiAccess::$user) > 0) + { + return $this->get($id); + } + else + { + throw new RestException(500, $this->commande->error); + } + } + + /** + * Delete donation + * + * @param int $id Order ID + * @return array + */ + function delete($id) + { + if(! DolibarrApiAccess::$user->rights->don->supprimer) { + throw new RestException(401); + } + $result = $this->don->fetch($id); + if( ! $result ) { + throw new RestException(404, 'Donation not found'); + } + + if( ! DolibarrApi::_checkAccessToResource('don',$this->don->id)) { + throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); + } + + if( ! $this->don->delete(DolibarrApiAccess::$user)) { + throw new RestException(500, 'Error when delete donation : '.$this->don->error); + } + + return array( + 'success' => array( + 'code' => 200, + 'message' => 'Donation deleted' + ) + ); + } + + /** + * Validate an donation + * + * If you get a bad value for param notrigger check, provide this in body + * { + * "idwarehouse": 0, + * "notrigger": 0 + * } + * + * @param int $id Order ID + * @param int $idwarehouse Warehouse ID + * @param int $notrigger 1=Does not execute triggers, 0= execute triggers + * + * @url POST {id}/validate + * + * @throws 304 + * @throws 401 + * @throws 404 + * @throws 500 + * + * @return array + */ + function validate($id, $idwarehouse=0, $notrigger=0) + { + if(! DolibarrApiAccess::$user->rights->commande->creer) { + throw new RestException(401); + } + $result = $this->commande->fetch($id); + if( ! $result ) { + throw new RestException(404, 'Donation not found'); + } + + if( ! DolibarrApi::_checkAccessToResource('don',$this->don->id)) { + throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); + } + + $result = $this->commande->valid(DolibarrApiAccess::$user, $idwarehouse, $notrigger); + if ($result == 0) { + throw new RestException(304, 'Error nothing done. May be object is already validated'); + } + if ($result < 0) { + throw new RestException(500, 'Error when validating Order: '.$this->commande->error); + } + $result = $this->commande->fetch($id); + if( ! $result ) { + throw new RestException(404, 'Order not found'); + } + + if( ! DolibarrApi::_checkAccessToResource('commande',$this->commande->id)) { + throw new RestException(401, 'Access not allowed for login '.DolibarrApiAccess::$user->login); + } + + $this->commande->fetchObjectLinked(); + + return $this->_cleanObjectDatas($this->commande); + } + + /** + * Clean sensible object datas + * + * @param object $object Object to clean + * @return array Array of cleaned object properties + */ + function _cleanObjectDatas($object) + { + + $object = parent::_cleanObjectDatas($object); + + unset($object->note); + unset($object->address); + unset($object->barcode_type); + unset($object->barcode_type_code); + unset($object->barcode_type_label); + unset($object->barcode_type_coder); + + return $object; + } + + /** + * Validate fields before create or update object + * + * @param array $data Array with data to verify + * @return array + * @throws RestException + */ + function _validate($data) + { + $commande = array(); + foreach (Orders::$FIELDS as $field) { + if (!isset($data[$field])) + throw new RestException(400, $field ." field missing"); + $commande[$field] = $data[$field]; + } + return $commande; + } +} From e3d53867f44b2527db4fb6a8aa654e294aab7920 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 18 Jan 2019 18:11:10 +0100 Subject: [PATCH 30/40] WIP Billing task time --- .../modulebuilder/template/myobject_list.php | 2 +- htdocs/projet/tasks/time.php | 77 ++++++++++++------- 2 files changed, 50 insertions(+), 29 deletions(-) diff --git a/htdocs/modulebuilder/template/myobject_list.php b/htdocs/modulebuilder/template/myobject_list.php index e91e43a7739..a1738474459 100644 --- a/htdocs/modulebuilder/template/myobject_list.php +++ b/htdocs/modulebuilder/template/myobject_list.php @@ -39,7 +39,7 @@ //if (! defined("MAIN_LANG_DEFAULT")) define('MAIN_LANG_DEFAULT','auto'); // Force lang to a particular value //if (! defined("MAIN_AUTHENTICATION_MODE")) define('MAIN_AUTHENTICATION_MODE','aloginmodule'); // Force authentication handler //if (! defined("NOREDIRECTBYMAINTOLOGIN")) define('NOREDIRECTBYMAINTOLOGIN',1); // The main.inc.php does not make a redirect if not logged, instead show simple error message -//if (! defined("XFRAMEOPTIONS_ALLOWALL")) define('XFRAMEOPTIONS_ALLOWALL',1); // Do not add the HTTP header X-Frame-Options: SAMEORIGIN but ALLOWALL +//if (! defined("XFRAMEOPTIONS_ALLOWALL")) define('XFRAMEOPTIONS_ALLOWALL',1); // Do not add the HTTP header 'X-Frame-Options: SAMEORIGIN' but 'X-Frame-Options: ALLOWALL' // Load Dolibarr environment $res=0; diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index 05ac4f25490..4319a11eb03 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -37,14 +37,19 @@ require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php'; // Load translation files required by the page $langs->load('projects'); -$id=GETPOST('id','int'); -$projectid=GETPOST('projectid','int'); -$ref=GETPOST('ref','alpha'); -$action=GETPOST('action','alpha'); -$confirm=GETPOST('confirm','alpha'); -$cancel=GETPOST('cancel','alpha'); -$withproject=GETPOST('withproject','int'); -$project_ref=GETPOST('project_ref','alpha'); +$action = GETPOST('action','alpha'); +$massaction = GETPOST('massaction','alpha'); // The bulk action (combo box choice into lists) +$confirm = GETPOST('confirm','alpha'); +$cancel = GETPOST('cancel','alpha'); +$toselect = GETPOST('toselect', 'array'); // Array of ids of elements selected into a list +$contextpage= GETPOST('contextpage','aZ')?GETPOST('contextpage','aZ'):'myobjectlist'; // To manage different context of search +$backtopage = GETPOST('backtopage','alpha'); // Go back to a dedicated page + +$id = GETPOST('id','int'); +$projectid = GETPOST('projectid','int'); +$ref = GETPOST('ref','alpha'); +$withproject= GETPOST('withproject','int'); +$project_ref= GETPOST('project_ref','alpha'); $search_day=GETPOST('search_day','int'); $search_month=GETPOST('search_month','int'); @@ -57,6 +62,7 @@ $search_value=GETPOST('search_value','int'); $search_task_ref=GETPOST('search_task_ref','alpha'); $search_task_label=GETPOST('search_task_label','alpha'); $search_user=GETPOST('search_user','int'); +$search_valuebilled=GETPOST('search_valuebilled', 'int'); // Security check $socid=0; @@ -116,6 +122,7 @@ if (GETPOST('button_removefilter_x','alpha') || GETPOST('button_removefilter.x', $search_task_ref=''; $search_task_label=''; $search_user=0; + $search_valuebilled=''; $toselect=''; $search_array_options=array(); $action=''; @@ -294,6 +301,8 @@ elseif (GETPOST('project_ref','alpha')) * View */ +$arrayofselected=is_array($toselect)?$toselect:array(); + llxHeader("",$langs->trans("Task")); $form = new Form($db); @@ -683,6 +692,17 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) } } + if (! empty($withproject) && $projectstatic->bill_time) + { + $arrayofmassactions = array( + 'generateinvoice'=>$langs->trans("GenerateInvoice"), + //'builddoc'=>$langs->trans("PDFMerge"), + ); + //if ($user->rights->projet->creer) $arrayofmassactions['predelete']=$langs->trans("Delete"); + if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array(); + $massactionbutton=$form->selectMassAction('', $arrayofmassactions); + } + /* * List of time spent */ @@ -703,6 +723,8 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) if ($search_task_ref) $sql .= natural_search('pt.ref', $search_task_ref); if ($search_task_label) $sql .= natural_search('pt.label', $search_task_label); if ($search_user > 0) $sql .= natural_search('t.fk_user', $search_user); + if ($search_valuebilled == '1') $sql .= ' AND t.invoice_id > 0'; + if ($search_valuebilled == '0') $sql .= ' AND (t.invoice_id = 0 OR t.invoice_id IS NULL)'; if ($search_month > 0) { if ($search_year > 0 && empty($search_day)) @@ -732,7 +754,7 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) $title=$langs->trans("ListTaskTimeUserProject"); //$linktotasks=''.$langs->trans("GoToListOfTasks").''; //print_barre_liste($title, 0, $_SERVER["PHP_SELF"], '', $sortfield, $sortorder, $linktotasks, $num, $totalnboflines, 'title_generic.png', 0, '', '', 0, 1); - print load_fiche_titre($title, $linktocreatetime, 'title_generic.png'); + print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_generic', 0, $linktocreatetime, '', $limit); } $i = 0; @@ -827,7 +849,8 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) // Invoiced if (empty($conf->global->PROJECT_HIDE_TASKS) && ! empty($conf->global->PROJECT_BILL_TIME_SPENT)) { - print ''; + print ''; } print ''; // Value billed - if (! empty($arrayfields['valuebilled']['checked'])) print ''; + if (! empty($arrayfields['valuebilled']['checked'])) print ''; + /* // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_input.tpl.php'; @@ -960,7 +973,7 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) if (! empty($arrayfields['t.note']['checked'])) print_liste_field_titre($arrayfields['t.note']['label'],$_SERVER['PHP_SELF'],'t.note','',$param,'',$sortfield,$sortorder); if (! empty($arrayfields['t.task_duration']['checked'])) print_liste_field_titre($arrayfields['t.task_duration']['label'],$_SERVER['PHP_SELF'],'t.task_duration','',$param,'align="right"',$sortfield,$sortorder); if (! empty($arrayfields['value']['checked'])) print_liste_field_titre($arrayfields['value']['label'],$_SERVER['PHP_SELF'],'','',$param,'align="right"',$sortfield,$sortorder); - if (! empty($arrayfields['valuebilled']['checked'])) print_liste_field_titre($arrayfields['valuebilled']['label'],$_SERVER['PHP_SELF'],'il.total_ht','',$param,'align="right"',$sortfield,$sortorder); + if (! empty($arrayfields['valuebilled']['checked'])) print_liste_field_titre($arrayfields['valuebilled']['label'],$_SERVER['PHP_SELF'],'il.total_ht','',$param,'align="center"',$sortfield,$sortorder); /* // Extra fields include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_title.tpl.php'; @@ -1117,10 +1130,10 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) $totalarray['totalvalue'] += $value; } - // Value billed + // Invoiced - Value billed if (! empty($arrayfields['valuebilled']['checked'])) { - print ''; @@ -1509,7 +1530,7 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) } elseif ($totalarray['totaldurationfield'] == $i) print ''; elseif ($totalarray['totalvaluefield'] == $i) print ''; - elseif ($totalarray['totalvaluebilledfield'] == $i) print ''; + //elseif ($totalarray['totalvaluebilledfield'] == $i) print ''; else print ''; } print ''; From f82c917f13d7da36b0361359c4c651a59ce104d0 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 18 Jan 2019 19:39:51 +0100 Subject: [PATCH 31/40] Better use of email content to init project --- .../class/emailcollector.class.php | 2794 ++++++++--------- 1 file changed, 1397 insertions(+), 1397 deletions(-) diff --git a/htdocs/emailcollector/class/emailcollector.class.php b/htdocs/emailcollector/class/emailcollector.class.php index fc0b8673332..c86b575855a 100644 --- a/htdocs/emailcollector/class/emailcollector.class.php +++ b/htdocs/emailcollector/class/emailcollector.class.php @@ -34,304 +34,304 @@ require_once DOL_DOCUMENT_ROOT . '/compta/facture/class/facture.class.php'; */ class EmailCollector extends CommonObject { - /** - * @var string ID to identify managed object - */ - public $element = 'emailcollector'; - /** - * @var string Name of table without prefix where object is stored - */ - public $table_element = 'emailcollector_emailcollector'; - /** - * @var int Does emailcollector support multicompany module ? 0=No test on entity, 1=Test with field entity, 2=Test with link by societe - */ - public $ismultientitymanaged = 1; - /** - * @var int Does emailcollector support extrafields ? 0=No, 1=Yes - */ - public $isextrafieldmanaged = 0; - /** - * @var string String with name of icon for emailcollector. Must be the part after the 'object_' into object_emailcollector.png - */ - public $picto = 'generic'; + /** + * @var string ID to identify managed object + */ + public $element = 'emailcollector'; + /** + * @var string Name of table without prefix where object is stored + */ + public $table_element = 'emailcollector_emailcollector'; + /** + * @var int Does emailcollector support multicompany module ? 0=No test on entity, 1=Test with field entity, 2=Test with link by societe + */ + public $ismultientitymanaged = 1; + /** + * @var int Does emailcollector support extrafields ? 0=No, 1=Yes + */ + public $isextrafieldmanaged = 0; + /** + * @var string String with name of icon for emailcollector. Must be the part after the 'object_' into object_emailcollector.png + */ + public $picto = 'generic'; - /** - * @var int Field with ID of parent key if this field has a parent - */ - public $fk_element = 'fk_emailcollector'; + /** + * @var int Field with ID of parent key if this field has a parent + */ + public $fk_element = 'fk_emailcollector'; - /** - * @var array Array of child tables (child tables to delete before deleting a record) - */ - protected $childtables=array('emailcollector_emailcollectorfilter', 'emailcollector_emailcollectoraction'); + /** + * @var array Array of child tables (child tables to delete before deleting a record) + */ + protected $childtables=array('emailcollector_emailcollectorfilter', 'emailcollector_emailcollectoraction'); - /** - * 'type' if the field format. - * 'label' the translation key. - * 'enabled' is a condition when the field must be managed. - * 'visible' says if field is visible in list (Examples: 0=Not visible, 1=Visible on list and create/update/view forms, 2=Visible on list only. Using a negative value means field is not shown by default on list but can be selected for viewing) - * 'notnull' is set to 1 if not null in database. Set to -1 if we must set data to null if empty ('' or 0). - * 'default' is a default value for creation (can still be replaced by the global setup of default values) - * 'index' if we want an index in database. - * 'foreignkey'=>'tablename.field' if the field is a foreign key (it is recommanded to name the field fk_...). - * 'position' is the sort order of field. - * 'searchall' is 1 if we want to search in this field when making a search from the quick search button. - * 'isameasure' must be set to 1 if you want to have a total on list for this field. Field type must be summable like integer or double(24,8). - * 'css' is the CSS style to use on field. For example: 'maxwidth200' - * 'help' is a string visible as a tooltip on field - * 'comment' is not used. You can store here any text of your choice. It is not used by application. - * 'showoncombobox' if value of the field must be visible into the label of the combobox that list record - * 'arraykeyval' to set list of value if type is a list of predefined values. For example: array("0"=>"Draft","1"=>"Active","-1"=>"Cancel") - */ + /** + * 'type' if the field format. + * 'label' the translation key. + * 'enabled' is a condition when the field must be managed. + * 'visible' says if field is visible in list (Examples: 0=Not visible, 1=Visible on list and create/update/view forms, 2=Visible on list only. Using a negative value means field is not shown by default on list but can be selected for viewing) + * 'notnull' is set to 1 if not null in database. Set to -1 if we must set data to null if empty ('' or 0). + * 'default' is a default value for creation (can still be replaced by the global setup of default values) + * 'index' if we want an index in database. + * 'foreignkey'=>'tablename.field' if the field is a foreign key (it is recommanded to name the field fk_...). + * 'position' is the sort order of field. + * 'searchall' is 1 if we want to search in this field when making a search from the quick search button. + * 'isameasure' must be set to 1 if you want to have a total on list for this field. Field type must be summable like integer or double(24,8). + * 'css' is the CSS style to use on field. For example: 'maxwidth200' + * 'help' is a string visible as a tooltip on field + * 'comment' is not used. You can store here any text of your choice. It is not used by application. + * 'showoncombobox' if value of the field must be visible into the label of the combobox that list record + * 'arraykeyval' to set list of value if type is a list of predefined values. For example: array("0"=>"Draft","1"=>"Active","-1"=>"Cancel") + */ - // BEGIN MODULEBUILDER PROPERTIES - /** - * @var array Array with all fields and their property. Do not use it as a static var. It may be modified by constructor. - */ - public $fields=array( - 'rowid' => array('type'=>'integer', 'label'=>'TechnicalID','visible'=>2, 'enabled'=>1, 'position'=>1, 'notnull'=>1, 'index'=>1), - 'entity' =>array('type'=>'integer', 'label'=>'Entity', 'enabled'=>1, 'visible'=>0, 'default'=>1, 'notnull'=>1, 'index'=>1, 'position'=>20), - 'ref' =>array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>1, 'index'=>1, 'position'=>10, 'searchall'=>1, 'help'=>'Example: MyCollector1'), - 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'visible'=>1, 'enabled'=>1, 'position'=>30, 'notnull'=>-1, 'searchall'=>1, 'help'=>'Example: My Email collector'), - 'description' => array('type'=>'text', 'label'=>'Description', 'visible'=>-1, 'enabled'=>1, 'position'=>60, 'notnull'=>-1), - 'host' => array('type'=>'varchar(255)', 'label'=>'EMailHost', 'visible'=>1, 'enabled'=>1, 'position'=>100, 'notnull'=>1, 'searchall'=>1, 'comment'=>"IMAP server", 'help'=>'Example: imap.gmail.com'), - 'login' => array('type'=>'varchar(128)', 'label'=>'Login', 'visible'=>1, 'enabled'=>1, 'position'=>101, 'notnull'=>-1, 'index'=>1, 'comment'=>"IMAP login", 'help'=>'Example: myaccount@gmail.com'), - 'password' => array('type'=>'password', 'label'=>'Password', 'visible'=>-1, 'enabled'=>1, 'position'=>102, 'notnull'=>-1, 'comment'=>"IMAP password"), - 'source_directory' => array('type'=>'varchar(255)', 'label'=>'MailboxSourceDirectory', 'visible'=>-1, 'enabled'=>1, 'position'=>103, 'notnull'=>1, 'default' => 'Inbox', 'help'=>'Example: INBOX'), - //'filter' => array('type'=>'text', 'label'=>'Filter', 'visible'=>1, 'enabled'=>1, 'position'=>105), - //'actiontodo' => array('type'=>'varchar(255)', 'label'=>'ActionToDo', 'visible'=>1, 'enabled'=>1, 'position'=>106), - 'target_directory' => array('type'=>'varchar(255)', 'label'=>'MailboxTargetDirectory', 'visible'=>1, 'enabled'=>1, 'position'=>110, 'notnull'=>0, 'comment'=>"Where to store messages once processed"), - 'datelastresult' => array('type'=>'datetime', 'label'=>'DateLastResult', 'visible'=>1, 'enabled'=>'$action != "create" && $action != "edit"', 'position'=>121, 'notnull'=>-1,), - 'codelastresult' => array('type'=>'varchar(16)', 'label'=>'CodeLastResult', 'visible'=>1, 'enabled'=>'$action != "create" && $action != "edit"', 'position'=>122, 'notnull'=>-1,), - 'lastresult' => array('type'=>'varchar(255)', 'label'=>'LastResult', 'visible'=>1, 'enabled'=>'$action != "create" && $action != "edit"', 'position'=>123, 'notnull'=>-1,), - 'note_public' => array('type'=>'html', 'label'=>'NotePublic', 'visible'=>0, 'enabled'=>1, 'position'=>61, 'notnull'=>-1,), - 'note_private' => array('type'=>'html', 'label'=>'NotePrivate', 'visible'=>0, 'enabled'=>1, 'position'=>62, 'notnull'=>-1,), - 'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'visible'=>-2, 'enabled'=>1, 'position'=>500, 'notnull'=>1,), - 'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'visible'=>-2, 'enabled'=>1, 'position'=>501, 'notnull'=>1,), - //'date_validation' =>array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-2, 'position'=>502), - 'fk_user_creat' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserAuthor', 'visible'=>-2, 'enabled'=>1, 'position'=>510, 'notnull'=>1,), - 'fk_user_modif' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'visible'=>-2, 'enabled'=>1, 'position'=>511, 'notnull'=>-1,), - //'fk_user_valid' =>array('type'=>'integer', 'label'=>'UserValidation', 'enabled'=>1, 'visible'=>-1, 'position'=>512), - 'import_key' => array('type'=>'varchar(14)', 'label'=>'ImportId', 'visible'=>-2, 'enabled'=>1, 'position'=>1000, 'notnull'=>-1,), - 'status' => array('type'=>'integer', 'label'=>'Status', 'visible'=>1, 'enabled'=>1, 'position'=>1000, 'notnull'=>1, 'index'=>1, 'arrayofkeyval'=>array('0'=>'Inactive', '1'=>'Active')) - ); + // BEGIN MODULEBUILDER PROPERTIES + /** + * @var array Array with all fields and their property. Do not use it as a static var. It may be modified by constructor. + */ + public $fields=array( + 'rowid' => array('type'=>'integer', 'label'=>'TechnicalID','visible'=>2, 'enabled'=>1, 'position'=>1, 'notnull'=>1, 'index'=>1), + 'entity' =>array('type'=>'integer', 'label'=>'Entity', 'enabled'=>1, 'visible'=>0, 'default'=>1, 'notnull'=>1, 'index'=>1, 'position'=>20), + 'ref' =>array('type'=>'varchar(128)', 'label'=>'Ref', 'enabled'=>1, 'visible'=>1, 'notnull'=>1, 'showoncombobox'=>1, 'index'=>1, 'position'=>10, 'searchall'=>1, 'help'=>'Example: MyCollector1'), + 'label' => array('type'=>'varchar(255)', 'label'=>'Label', 'visible'=>1, 'enabled'=>1, 'position'=>30, 'notnull'=>-1, 'searchall'=>1, 'help'=>'Example: My Email collector'), + 'description' => array('type'=>'text', 'label'=>'Description', 'visible'=>-1, 'enabled'=>1, 'position'=>60, 'notnull'=>-1), + 'host' => array('type'=>'varchar(255)', 'label'=>'EMailHost', 'visible'=>1, 'enabled'=>1, 'position'=>100, 'notnull'=>1, 'searchall'=>1, 'comment'=>"IMAP server", 'help'=>'Example: imap.gmail.com'), + 'login' => array('type'=>'varchar(128)', 'label'=>'Login', 'visible'=>1, 'enabled'=>1, 'position'=>101, 'notnull'=>-1, 'index'=>1, 'comment'=>"IMAP login", 'help'=>'Example: myaccount@gmail.com'), + 'password' => array('type'=>'password', 'label'=>'Password', 'visible'=>-1, 'enabled'=>1, 'position'=>102, 'notnull'=>-1, 'comment'=>"IMAP password"), + 'source_directory' => array('type'=>'varchar(255)', 'label'=>'MailboxSourceDirectory', 'visible'=>-1, 'enabled'=>1, 'position'=>103, 'notnull'=>1, 'default' => 'Inbox', 'help'=>'Example: INBOX'), + //'filter' => array('type'=>'text', 'label'=>'Filter', 'visible'=>1, 'enabled'=>1, 'position'=>105), + //'actiontodo' => array('type'=>'varchar(255)', 'label'=>'ActionToDo', 'visible'=>1, 'enabled'=>1, 'position'=>106), + 'target_directory' => array('type'=>'varchar(255)', 'label'=>'MailboxTargetDirectory', 'visible'=>1, 'enabled'=>1, 'position'=>110, 'notnull'=>0, 'comment'=>"Where to store messages once processed"), + 'datelastresult' => array('type'=>'datetime', 'label'=>'DateLastResult', 'visible'=>1, 'enabled'=>'$action != "create" && $action != "edit"', 'position'=>121, 'notnull'=>-1,), + 'codelastresult' => array('type'=>'varchar(16)', 'label'=>'CodeLastResult', 'visible'=>1, 'enabled'=>'$action != "create" && $action != "edit"', 'position'=>122, 'notnull'=>-1,), + 'lastresult' => array('type'=>'varchar(255)', 'label'=>'LastResult', 'visible'=>1, 'enabled'=>'$action != "create" && $action != "edit"', 'position'=>123, 'notnull'=>-1,), + 'note_public' => array('type'=>'html', 'label'=>'NotePublic', 'visible'=>0, 'enabled'=>1, 'position'=>61, 'notnull'=>-1,), + 'note_private' => array('type'=>'html', 'label'=>'NotePrivate', 'visible'=>0, 'enabled'=>1, 'position'=>62, 'notnull'=>-1,), + 'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'visible'=>-2, 'enabled'=>1, 'position'=>500, 'notnull'=>1,), + 'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'visible'=>-2, 'enabled'=>1, 'position'=>501, 'notnull'=>1,), + //'date_validation' =>array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-2, 'position'=>502), + 'fk_user_creat' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserAuthor', 'visible'=>-2, 'enabled'=>1, 'position'=>510, 'notnull'=>1,), + 'fk_user_modif' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'visible'=>-2, 'enabled'=>1, 'position'=>511, 'notnull'=>-1,), + //'fk_user_valid' =>array('type'=>'integer', 'label'=>'UserValidation', 'enabled'=>1, 'visible'=>-1, 'position'=>512), + 'import_key' => array('type'=>'varchar(14)', 'label'=>'ImportId', 'visible'=>-2, 'enabled'=>1, 'position'=>1000, 'notnull'=>-1,), + 'status' => array('type'=>'integer', 'label'=>'Status', 'visible'=>1, 'enabled'=>1, 'position'=>1000, 'notnull'=>1, 'index'=>1, 'arrayofkeyval'=>array('0'=>'Inactive', '1'=>'Active')) + ); - /** - * @var int ID - */ - public $rowid; + /** + * @var int ID + */ + public $rowid; - /** - * @var string Ref - */ - public $ref; + /** + * @var string Ref + */ + public $ref; - /** - * @var int Entity - */ - public $entity; + /** + * @var int Entity + */ + public $entity; - /** - * @var string label - */ - public $label; + /** + * @var string label + */ + public $label; - /** - * @var int Status - */ - public $status; + /** + * @var int Status + */ + public $status; - public $date_creation; - public $tms; + public $date_creation; + public $tms; - /** - * @var int ID - */ - public $fk_user_creat; + /** + * @var int ID + */ + public $fk_user_creat; - /** - * @var int ID - */ - public $fk_user_modif; + /** + * @var int ID + */ + public $fk_user_modif; - public $import_key; + public $import_key; - public $host; - public $login; - public $password; - public $source_directory; + public $host; + public $login; + public $password; + public $source_directory; public $target_directory; public $datelastresult; - public $lastresult; - // END MODULEBUILDER PROPERTIES + public $lastresult; + // END MODULEBUILDER PROPERTIES - public $filters; - public $actions; + public $filters; + public $actions; - /** - * Constructor - * - * @param DoliDb $db Database handler - */ - public function __construct(DoliDB $db) - { - global $conf, $langs, $user; - - $this->db = $db; - - if (empty($conf->global->MAIN_SHOW_TECHNICAL_ID) && isset($this->fields['rowid'])) $this->fields['rowid']['visible']=0; - if (empty($conf->multicompany->enabled) && isset($this->fields['entity'])) $this->fields['entity']['enabled']=0; - - // Unset fields that are disabled - foreach($this->fields as $key => $val) - { - if (isset($val['enabled']) && empty($val['enabled'])) - { - unset($this->fields[$key]); - } - } - - // Translate some data of arrayofkeyval - foreach($this->fields as $key => $val) - { - if (is_array($this->fields['status']['arrayofkeyval'])) - { - foreach($this->fields['status']['arrayofkeyval'] as $key2 => $val2) - { - $this->fields['status']['arrayofkeyval'][$key2]=$langs->trans($val2); - } - } - } - } - - /** - * Create object into database - * - * @param User $user User that creates - * @param bool $notrigger false=launch triggers after, true=disable triggers - * @return int <0 if KO, Id of created object if OK - */ - public function create(User $user, $notrigger = false) - { - return $this->createCommon($user, $notrigger); - } - - /** - * Clone and object into another one - * - * @param User $user User that creates - * @param int $fromid Id of object to clone - * @return mixed New object created, <0 if KO - */ - public function createFromClone(User $user, $fromid) - { - global $langs, $hookmanager, $extrafields; - $error = 0; - - dol_syslog(__METHOD__, LOG_DEBUG); - - $object = new self($this->db); - - $this->db->begin(); - - // Load source object - $object->fetchCommon($fromid); - // Reset some properties - unset($object->id); - unset($object->fk_user_creat); - unset($object->import_key); - - // Clear fields - $object->ref = "copy_of_".$object->ref; - $object->title = $langs->trans("CopyOf")." ".$object->title; - // ... - // Clear extrafields that are unique - if (is_array($object->array_options) && count($object->array_options) > 0) - { - $extrafields->fetch_name_optionals_label($this->element); - foreach($object->array_options as $key => $option) - { - $shortkey = preg_replace('/options_/', '', $key); - if (! empty($extrafields->attributes[$this->element]['unique'][$shortkey])) - { - //var_dump($key); var_dump($clonedObj->array_options[$key]); exit; - unset($object->array_options[$key]); - } - } - } - - // Create clone - $object->context['createfromclone'] = 'createfromclone'; - $result = $object->createCommon($user); - if ($result < 0) { - $error++; - $this->error = $object->error; - $this->errors = $object->errors; - } - - // End - if (!$error) { - $this->db->commit(); - return $object; - } else { - $this->db->rollback(); - return -1; - } - } - - /** - * Load object in memory from the database - * - * @param int $id Id object - * @param string $ref Ref - * @return int <0 if KO, 0 if not found, >0 if OK - */ - public function fetch($id, $ref = null) - { - $result = $this->fetchCommon($id, $ref); - //if ($result > 0 && ! empty($this->table_element_line)) $this->fetchLines(); - return $result; - } - - /** - * Load object lines in memory from the database - * - * @return int <0 if KO, 0 if not found, >0 if OK - */ - /*public function fetchLines() - { - $this->lines=array(); - - // Load lines with object EmailCollectorLine - - return count($this->lines)?1:0; - }*/ - - /** - * Fetch all account and load objects into an array - * - * @param User $user User - * @param int $activeOnly filter if active - * @param string $sortfield field for sorting - * @param string $sortorder sorting order - * @param int $limit sort limit - * @param int $page page to start on - * @return array Array with key => EmailCollector object - */ - public function fetchAll(User $user, $activeOnly = 0, $sortfield = 's.rowid', $sortorder = 'ASC', $limit = 100, $page = 0) + /** + * Constructor + * + * @param DoliDb $db Database handler + */ + public function __construct(DoliDB $db) { - global $langs; + global $conf, $langs, $user; - $obj_ret = array(); + $this->db = $db; + + if (empty($conf->global->MAIN_SHOW_TECHNICAL_ID) && isset($this->fields['rowid'])) $this->fields['rowid']['visible']=0; + if (empty($conf->multicompany->enabled) && isset($this->fields['entity'])) $this->fields['entity']['enabled']=0; + + // Unset fields that are disabled + foreach($this->fields as $key => $val) + { + if (isset($val['enabled']) && empty($val['enabled'])) + { + unset($this->fields[$key]); + } + } + + // Translate some data of arrayofkeyval + foreach($this->fields as $key => $val) + { + if (is_array($this->fields['status']['arrayofkeyval'])) + { + foreach($this->fields['status']['arrayofkeyval'] as $key2 => $val2) + { + $this->fields['status']['arrayofkeyval'][$key2]=$langs->trans($val2); + } + } + } + } + + /** + * Create object into database + * + * @param User $user User that creates + * @param bool $notrigger false=launch triggers after, true=disable triggers + * @return int <0 if KO, Id of created object if OK + */ + public function create(User $user, $notrigger = false) + { + return $this->createCommon($user, $notrigger); + } + + /** + * Clone and object into another one + * + * @param User $user User that creates + * @param int $fromid Id of object to clone + * @return mixed New object created, <0 if KO + */ + public function createFromClone(User $user, $fromid) + { + global $langs, $hookmanager, $extrafields; + $error = 0; + + dol_syslog(__METHOD__, LOG_DEBUG); + + $object = new self($this->db); + + $this->db->begin(); + + // Load source object + $object->fetchCommon($fromid); + // Reset some properties + unset($object->id); + unset($object->fk_user_creat); + unset($object->import_key); + + // Clear fields + $object->ref = "copy_of_".$object->ref; + $object->title = $langs->trans("CopyOf")." ".$object->title; + // ... + // Clear extrafields that are unique + if (is_array($object->array_options) && count($object->array_options) > 0) + { + $extrafields->fetch_name_optionals_label($this->element); + foreach($object->array_options as $key => $option) + { + $shortkey = preg_replace('/options_/', '', $key); + if (! empty($extrafields->attributes[$this->element]['unique'][$shortkey])) + { + //var_dump($key); var_dump($clonedObj->array_options[$key]); exit; + unset($object->array_options[$key]); + } + } + } + + // Create clone + $object->context['createfromclone'] = 'createfromclone'; + $result = $object->createCommon($user); + if ($result < 0) { + $error++; + $this->error = $object->error; + $this->errors = $object->errors; + } + + // End + if (!$error) { + $this->db->commit(); + return $object; + } else { + $this->db->rollback(); + return -1; + } + } + + /** + * Load object in memory from the database + * + * @param int $id Id object + * @param string $ref Ref + * @return int <0 if KO, 0 if not found, >0 if OK + */ + public function fetch($id, $ref = null) + { + $result = $this->fetchCommon($id, $ref); + //if ($result > 0 && ! empty($this->table_element_line)) $this->fetchLines(); + return $result; + } + + /** + * Load object lines in memory from the database + * + * @return int <0 if KO, 0 if not found, >0 if OK + */ + /*public function fetchLines() + { + $this->lines=array(); + + // Load lines with object EmailCollectorLine + + return count($this->lines)?1:0; + }*/ + + /** + * Fetch all account and load objects into an array + * + * @param User $user User + * @param int $activeOnly filter if active + * @param string $sortfield field for sorting + * @param string $sortorder sorting order + * @param int $limit sort limit + * @param int $page page to start on + * @return array Array with key => EmailCollector object + */ + public function fetchAll(User $user, $activeOnly = 0, $sortfield = 's.rowid', $sortorder = 'ASC', $limit = 100, $page = 0) + { + global $langs; + + $obj_ret = array(); $socid = $user->societe_id ? $user->societe_id : ''; - $sql = "SELECT s.rowid"; + $sql = "SELECT s.rowid"; $sql.= " FROM ".MAIN_DB_PREFIX."emailcollector_emailcollector as s"; $sql.= ' WHERE s.entity IN ('.getEntity('emailcollector').')'; if ($activeOnly) { @@ -360,54 +360,54 @@ class EmailCollector extends CommonObject $i++; } } else { - $this->errors[] = 'EmailCollector::fetchAll Error when retrieve emailcollector list'; + $this->errors[] = 'EmailCollector::fetchAll Error when retrieve emailcollector list'; dol_syslog('EmailCollector::fetchAll Error when retrieve emailcollector list', LOG_ERR); $ret = -1; } if (! count($obj_ret)) { - dol_syslog('EmailCollector::fetchAll No emailcollector found', LOG_DEBUG); + dol_syslog('EmailCollector::fetchAll No emailcollector found', LOG_DEBUG); } return $obj_ret; - } + } - /** - * Update object into database - * - * @param User $user User that modifies - * @param bool $notrigger false=launch triggers after, true=disable triggers - * @return int <0 if KO, >0 if OK - */ - public function update(User $user, $notrigger = false) - { - return $this->updateCommon($user, $notrigger); - } + /** + * Update object into database + * + * @param User $user User that modifies + * @param bool $notrigger false=launch triggers after, true=disable triggers + * @return int <0 if KO, >0 if OK + */ + public function update(User $user, $notrigger = false) + { + return $this->updateCommon($user, $notrigger); + } - /** - * Delete object in database - * - * @param User $user User that deletes - * @param bool $notrigger false=launch triggers after, true=disable triggers - * @return int <0 if KO, >0 if OK - */ - public function delete(User $user, $notrigger = false) - { - return $this->deleteCommon($user, $notrigger, 1); - } + /** + * Delete object in database + * + * @param User $user User that deletes + * @param bool $notrigger false=launch triggers after, true=disable triggers + * @return int <0 if KO, >0 if OK + */ + public function delete(User $user, $notrigger = false) + { + return $this->deleteCommon($user, $notrigger, 1); + } - /** - * Return a link to the object card (with optionaly the picto) - * - * @param int $withpicto Include picto in link (0=No picto, 1=Include picto into link, 2=Only picto) - * @param string $option On what the link point to ('nolink', ...) + /** + * Return a link to the object card (with optionaly the picto) + * + * @param int $withpicto Include picto in link (0=No picto, 1=Include picto into link, 2=Only picto) + * @param string $option On what the link point to ('nolink', ...) * @param int $notooltip 1=Disable tooltip * @param string $morecss Add more css on link * @param int $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking - * @return string String with URL - */ - function getNomUrl($withpicto=0, $option='', $notooltip=0, $morecss='', $save_lastsearch_value=-1) - { - global $db, $conf, $langs, $hookmanager; + * @return string String with URL + */ + function getNomUrl($withpicto=0, $option='', $notooltip=0, $morecss='', $save_lastsearch_value=-1) + { + global $db, $conf, $langs, $hookmanager; global $dolibarr_main_authentication, $dolibarr_main_demo; global $menumanager; @@ -424,12 +424,12 @@ class EmailCollector extends CommonObject if ($option != 'nolink') { - // Add param to save lastsearch_values or not - $add_save_lastsearch_values=($save_lastsearch_value == 1 ? 1 : 0); - if ($save_lastsearch_value == -1 && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) { + // Add param to save lastsearch_values or not + $add_save_lastsearch_values=($save_lastsearch_value == 1 ? 1 : 0); + if ($save_lastsearch_value == -1 && preg_match('/list\.php/', $_SERVER["PHP_SELF"])) { $add_save_lastsearch_values=1; } - if ($add_save_lastsearch_values) { + if ($add_save_lastsearch_values) { $url.='&save_lastsearch_values=1'; } } @@ -454,1092 +454,1092 @@ class EmailCollector extends CommonObject } else $linkclose = ($morecss?' class="'.$morecss.'"':''); - $linkstart = ''; - $linkend=''; - - $result .= $linkstart; - if ($withpicto) $result.=img_object(($notooltip?'':$label), ($this->picto?$this->picto:'generic'), ($notooltip?(($withpicto != 2) ? 'class="paddingright"' : ''):'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip?0:1); - if ($withpicto != 2) $result.= $this->ref; - $result .= $linkend; - //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : ''); - - global $action,$hookmanager; - $hookmanager->initHooks(array('emailcollectordao')); - $parameters=array('id'=>$this->id, 'getnomurl'=>$result); - $reshook=$hookmanager->executeHooks('getNomUrl',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks - if ($reshook > 0) $result = $hookmanager->resPrint; - else $result .= $hookmanager->resPrint; - - return $result; - } - - /** - * Return label of the status - * - * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto - * @return string Label of status - */ - public function getLibStatut($mode=0) - { - return $this->LibStatut($this->status, $mode); - } - - // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps - /** - * Return the status - * - * @param int $status Id status - * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto - * @return string Label of status - */ - public function LibStatut($status, $mode=0) - { - // phpcs:enable - if (empty($this->labelstatus)) - { - global $langs; - //$langs->load("mymodule"); - $this->labelstatus[1] = $langs->trans('Enabled'); - $this->labelstatus[0] = $langs->trans('Disabled'); - } - - if ($mode == 0) - { - return $this->labelstatus[$status]; - } - elseif ($mode == 1) - { - return $this->labelstatus[$status]; - } - elseif ($mode == 2) - { - if ($status == 1) return img_picto($this->labelstatus[$status],'statut4', '', false, 0, 0, '', 'valignmiddle').' '.$this->labelstatus[$status]; - elseif ($status == 0) return img_picto($this->labelstatus[$status],'statut5', '', false, 0, 0, '', 'valignmiddle').' '.$this->labelstatus[$status]; - } - elseif ($mode == 3) - { - if ($status == 1) return img_picto($this->labelstatus[$status],'statut4', '', false, 0, 0, '', 'valignmiddle'); - elseif ($status == 0) return img_picto($this->labelstatus[$status],'statut5', '', false, 0, 0, '', 'valignmiddle'); - } - elseif ($mode == 4) - { - if ($status == 1) return img_picto($this->labelstatus[$status],'statut4', '', false, 0, 0, '', 'valignmiddle').' '.$this->labelstatus[$status]; - elseif ($status == 0) return img_picto($this->labelstatus[$status],'statut5', '', false, 0, 0, '', 'valignmiddle').' '.$this->labelstatus[$status]; - } - elseif ($mode == 5) - { - if ($status == 1) return $this->labelstatus[$status].' '.img_picto($this->labelstatus[$status],'statut4', '', false, 0, 0, '', 'valignmiddle'); - elseif ($status == 0) return $this->labelstatus[$status].' '.img_picto($this->labelstatus[$status],'statut5', '', false, 0, 0, '', 'valignmiddle'); - } - elseif ($mode == 6) - { - if ($status == 1) return $this->labelstatus[$status].' '.img_picto($this->labelstatus[$status],'statut4', '', false, 0, 0, '', 'valignmiddle'); - elseif ($status == 0) return $this->labelstatus[$status].' '.img_picto($this->labelstatus[$status],'statut5', '', false, 0, 0, '', 'valignmiddle'); - } - } - - /** - * Charge les informations d'ordre info dans l'objet commande - * - * @param int $id Id of order - * @return void - */ - public function info($id) - { - $sql = 'SELECT rowid, date_creation as datec, tms as datem,'; - $sql.= ' fk_user_creat, fk_user_modif'; - $sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; - $sql.= ' WHERE t.rowid = '.$id; - $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_valid) - { - $vuser = new User($this->db); - $vuser->fetch($obj->fk_user_valid); - $this->user_validation = $vuser; - } - - if ($obj->fk_user_cloture) - { - $cluser = new User($this->db); - $cluser->fetch($obj->fk_user_cloture); - $this->user_cloture = $cluser; - } - - $this->date_creation = $this->db->jdate($obj->datec); - $this->date_modification = $this->db->jdate($obj->datem); - $this->date_validation = $this->db->jdate($obj->datev); - } - - $this->db->free($result); - } - else - { - dol_print_error($this->db); - } - } - - /** - * Initialise object with example values - * Id must be 0 if object instance is a specimen - * - * @return void - */ - public function initAsSpecimen() - { - $this->initAsSpecimenCommon(); - } - - /** - * Fetch filters - * - * @return int <0 if KO, >0 if OK - */ - public function fetchFilters() - { - $this->filters = array(); - - $sql = 'SELECT rowid, type, rulevalue, status'; - $sql.= ' FROM '.MAIN_DB_PREFIX.'emailcollector_emailcollectorfilter'; - $sql.= ' WHERE fk_emailcollector = '.$this->id; - //$sql.= ' ORDER BY position'; - - $resql = $this->db->query($sql); - if ($resql) - { - $num=$this->db->num_rows($resql); - $i = 0; - while($i < $num) - { - $obj=$this->db->fetch_object($resql); - $this->filters[$obj->rowid]=array('id'=>$obj->rowid, 'type'=>$obj->type, 'rulevalue'=>$obj->rulevalue, 'status'=>$obj->status); - $i++; - } - $this->db->free($resql); - } - else dol_print_error($this->db); - - return 1; - } - - /** - * Fetch actions - * - * @return int <0 if KO, >0 if OK - */ - public function fetchActions() - { - $this->actions = array(); - - $sql = 'SELECT rowid, type, actionparam, status'; - $sql.= ' FROM '.MAIN_DB_PREFIX.'emailcollector_emailcollectoraction'; - $sql.= ' WHERE fk_emailcollector = '.$this->id; - $sql.= ' ORDER BY position'; - - $resql = $this->db->query($sql); - if ($resql) - { - $num=$this->db->num_rows($resql); - $i = 0; - while($i < $num) - { - $obj=$this->db->fetch_object($resql); - $this->actions[$obj->rowid]=array('id'=>$obj->rowid, 'type'=>$obj->type, 'actionparam'=>$obj->actionparam, 'status'=>$obj->status); - $i++; - } - $this->db->free($resql); - } - else dol_print_error($this->db); - } - - - /** - * Return the connectstring to use with IMAP connection function - * - * @return string - */ - function getConnectStringIMAP() - { - // Connect to IMAP - $flags ='/service=imap'; // IMAP - $flags.='/ssl'; // '/tls' - $flags.='/novalidate-cert'; - //$flags.='/readonly'; - //$flags.='/debug'; - - $connectstringserver = '{'.$this->host.':993'.$flags.'}'; - - return $connectstringserver; - } - - /** - * Action executed by scheduler - * CAN BE A CRON TASK. In such a case, paramerts come from the schedule job setup field 'Parameters' - * - * @return int 0 if OK, <>0 if KO (this function is used also by cron so only 0 is OK) - */ - public function doCollect() - { - global $user; - - $nberror = 0; - - $arrayofcollectors = $this->fetchAll($user, 1); - - // Loop on each collector - foreach($arrayofcollectors as $emailcollector) - { - $result = $emailcollector->doCollectOneCollector(); - dol_syslog("doCollect result = ".$result." for emailcollector->id = ".$emailcollector->id); - - $this->error.='EmailCollector ID '.$emailcollector->id.':'.$emailcollector->error.'
'; - if (! empty($emailcollector->errors)) $this->error.=join('
', $emailcollector->errors); - $this->output.='EmailCollector ID '.$emailcollector->id.': '.$emailcollector->lastresult.'
'; - } - - return $nberror; - } - - /** - * overwitePropertiesOfObject - * - * @return int 0=OK, Nb of error if error - */ - - /** - * overwitePropertiesOfObject - * - * @param object $object Current object - * @param string $actionparam Action parameters - * @param string $messagetext Body - * @param string $subject Subject - * @return int 0=OK, Nb of error if error - */ - private function overwritePropertiesOfObject(&$object, $actionparam, $messagetext, $subject) - { - $errorforthisaction = 0; - - // Overwrite values with values extracted from source email - // $this->actionparam = 'opportunity_status=123;abc=REGEX:BODY:....' - $arrayvaluetouse = dolExplodeIntoArray($actionparam, ';', '='); - foreach($arrayvaluetouse as $propertytooverwrite => $valueforproperty) - { - $tmpclass=''; $tmpproperty=''; - $tmparray=explode('.', $propertytooverwrite); - if (count($tmparray) == 2) - { - $tmpclass=$tmparray[0]; - $tmpproperty=$tmparray[1]; - } - else - { - $tmpproperty=$tmparray[0]; - } - if ($tmpclass && ($tmpclass != $object->element)) continue; // Property is for another type of object - - if (property_exists($object, $tmpproperty)) - { - $sourcestring=''; - $sourcefield=''; - $regexstring=''; - //$transformationstring=''; - $regforregex=array(); - if (preg_match('/^REGEX:([a-zA-Z0-9]+):(.*):([^:])$/', $valueforproperty, $regforregex)) - { - $sourcefield=$regforregex[1]; - $regexstring=$regforregex[2]; - //$transofrmationstring=$regforregex[3]; - } - elseif (preg_match('/^REGEX:([a-zA-Z0-9]+):(.*)$/', $valueforproperty, $regforregex)) - { - $sourcefield=$regforregex[1]; - $regexstring=$regforregex[2]; - } - - if (! empty($sourcefield) && ! empty($regexstring)) - { - if (strtolower($sourcefield) == 'body') $sourcestring=$messagetext; - elseif (strtolower($sourcefield) == 'subject') $sourcestring=$subject; - - $regforval=array(); - if (preg_match('/'.preg_quote($regexstring, '/').'/', $sourcestring, $regforval)) - { - // Overwrite param $tmpproperty - $object->$tmpproperty = $regforval[1]; - } - else - { - // Nothing can be done for this param - } - } - elseif (preg_match('/^VALUE:(.*)$/', $valueforproperty, $reg)) - { - $object->$tmpproperty = $reg[1]; - } - else - { - $errorforthisaction++; - $this->error = 'Bad syntax for description of action parameters: '.$actionparam; - $this->errors[] = $this->error; - } - } - } - - return $errorforthisaction; - } - - /** - * Execute collect for current collector loaded previously with fetch. - * - * @return int <0 if KO, >0 if OK - */ - public function doCollectOneCollector() - { - global $conf, $langs, $user; - - //$conf->global->SYSLOG_FILE = 'DOL_DATA_ROOT/dolibarr_mydedicatedlofile.log'; - - require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php'; - - dol_syslog("EmailCollector::doCollectOneCollector start", LOG_DEBUG); - - $langs->loadLangs(array("project", "companies", "mails", "errors")); - - $error = 0; - $this->output = ''; - $this->error=''; - - $now = dol_now(); - - if (empty($this->host)) - { - $this->error=$langs->trans('ErrorFieldRequired', 'EMailHost'); - return -1; - } - if (empty($this->login)) - { - $this->error=$langs->trans('ErrorFieldRequired', 'Login'); - return -1; - } - if (empty($this->source_directory)) - { - $this->error=$langs->trans('ErrorFieldRequired', 'MailboxSourceDirectory'); - return -1; - } - if (! function_exists('imap_open')) - { - $this->error='IMAP function not enabled on your PHP'; - return -2; - } - - $this->fetchFilters(); - $this->fetchActions(); - - $sourcedir = $this->source_directory; - $targetdir = ($this->target_directory ? $this->target_directory : ''); // Can be '[Gmail]/Trash' or 'mytag' - - $connectstringserver = $this->getConnectStringIMAP(); - $connectstringsource = $connectstringserver.imap_utf7_encode($sourcedir); - $connectstringtarget = $connectstringserver.imap_utf7_encode($targetdir); - - $connection = imap_open($connectstringsource, $this->login, $this->password); - if (! $connection) - { - $this->error = 'Failed to open IMAP connection '.$connectstringsource; - return -3; - } - - //$search='ALL'; - $search='UNDELETED'; - $searchfilterdoltrackid=0; - $searchfilternodoltrackid=0; - foreach($this->filters as $rule) - { - if (empty($rule['status'])) continue; - - if ($rule['type'] == 'to') $search.=($search?' ':'').'TO "'.str_replace('"', '', $rule['rulevalue']).'"'; - if ($rule['type'] == 'bcc') $search.=($search?' ':'').'BCC'; - if ($rule['type'] == 'cc') $search.=($search?' ':'').'CC'; - if ($rule['type'] == 'from') $search.=($search?' ':'').'FROM "'.str_replace('"', '', $rule['rulevalue']).'"'; - if ($rule['type'] == 'subject') $search.=($search?' ':'').'SUBJECT "'.str_replace('"', '', $rule['rulevalue']).'"'; - if ($rule['type'] == 'body') $search.=($search?' ':'').'BODY "'.str_replace('"', '', $rule['rulevalue']).'"'; - if ($rule['type'] == 'seen') $search.=($search?' ':'').'SEEN'; - if ($rule['type'] == 'unseen') $search.=($search?' ':'').'UNSEEN'; - if ($rule['type'] == 'withtrackingid') $searchfilterdoltrackid++; - if ($rule['type'] == 'withouttrackingid') $searchfilternodoltrackid++; - } - - if (empty($targetdir)) // Use last date as filter if there is no targetdir defined. - { - $fromdate=0; - if ($this->datelastresult && $this->codelastresult == 'OK') $fromdate = $this->datelastresult; - if ($fromdate > 0) $search.=($search?' ':'').'SINCE '.dol_print_date($fromdate - 1,'dayhourrfc'); - } - dol_syslog("IMAP search string = ".$search); - //var_dump($search); - - $nbemailprocessed=0; - $nbemailok=0; - $nbactiondone=0; - - // Scan IMAP inbox - $arrayofemail= imap_search($connection, $search); - //var_dump($arrayofemail);exit; - - // Loop on each email found - if (! empty($arrayofemail) && count($arrayofemail) > 0) - { - foreach($arrayofemail as $imapemail) - { - if ($nbemailprocessed > 100) break; // Do not process more than 100 email per launch - - $header = imap_fetchheader($connection, $imapemail, 0); - $matches=array(); - preg_match_all('/([^: ]+): (.+?(?:\r\n\s(?:.+?))*)\r\n/m', $header, $matches); - $headers = array_combine($matches[1], $matches[2]); - //var_dump($headers); - - // $conf->global->MAIL_PREFIX_FOR_EMAIL_ID must be defined - $host=dol_getprefix('email'); - - // If there is a filter on trackid - //var_dump($host);exit; - if ($searchfilterdoltrackid > 0) - { - //if (empty($headers['X-Dolibarr-TRACKID'])) continue; - if (empty($headers['References']) || ! preg_match('/@'.preg_quote($host,'/').'/', $headers['References'])) - { - $nbemailprocessed++; - continue; - } - } - if ($searchfilternodoltrackid > 0) - { - if (! empty($headers['References']) && preg_match('/@'.preg_quote($host,'/').'/', $headers['References'])) - { - $nbemailprocessed++; - continue; - } - //if (! empty($headers['X-Dolibarr-TRACKID']) continue; - } - - $thirdpartystatic=new Societe($this->db); - $contactstatic=new Contact($this->db); - $projectstatic=new Project($this->db); - - $nbactiondoneforemail = 0; - $errorforemail = 0; - $errorforactions = 0; - $thirdpartyfoundby = ''; - $contactfoundby = ''; - $projectfoundby = ''; - - $this->db->begin(); - - //$message = imap_body($connection, $imapemail, 0); - $overview = imap_fetch_overview($connection, $imapemail, 0); - $structure = imap_fetchstructure($connection, $imapemail, 0); - - $partplain = $parthtml = -1; - // Loop to get part html and plain - /* - 0 multipart/mixed - 1 multipart/alternative - 1.1 text/plain - 1.2 text/html - 2 message/rfc822 - 2 multipart/mixed - 2.1 multipart/alternative - 2.1.1 text/plain - 2.1.2 text/html - 2.2 message/rfc822 - 2.2 multipart/alternative - 2.2.1 text/plain - 2.2.2 text/html - */ - /** - * create_part_array - * - * @param Object $structure Structure - * @param string $prefix prefix - * @return array Array with number and object - */ - function createPartArray($structure, $prefix="") - { - //print_r($structure); - if (count($structure->parts) > 0) { // There some sub parts - foreach ($structure->parts as $count => $part) { - add_part_to_array($part, $prefix.($count+1), $part_array); - } - }else{ // Email does not have a seperate mime attachment for text - $part_array[] = array('part_number' => $prefix.'1', 'part_object' => $obj); - } - return $part_array; - } - - /** - * Sub function for createPartArray(). Only called by createPartArray() and itself. - * - * @param Object $obj Structure - * @param string $partno Part no - * @param array $part_array array - * @return void - */ - function addPartToArray($obj, $partno, &$part_array) - { - $part_array[] = array('part_number' => $partno, 'part_object' => $obj); - if ($obj->type == 2) { // Check to see if the part is an attached email message, as in the RFC-822 type - //print_r($obj); - if (array_key_exists('parts',$obj)) { // Check to see if the email has parts - foreach ($obj->parts as $count => $part) { - // Iterate here again to compensate for the broken way that imap_fetchbody() handles attachments - if (count($part->parts) > 0) { - foreach ($part->parts as $count2 => $part2) { - addPartToArray($part2, $partno.".".($count2+1), $part_array); - } - }else{ // Attached email does not have a seperate mime attachment for text - $part_array[] = array('part_number' => $partno.'.'.($count+1), 'part_object' => $obj); - } - } - }else{ // Not sure if this is possible - $part_array[] = array('part_number' => $partno.'.1', 'part_object' => $obj); - } - }else{ // If there are more sub-parts, expand them out. - if (array_key_exists('parts',$obj)) { - foreach ($obj->parts as $count => $p) { - addPartToArray($p, $partno.".".($count+1), $part_array); - } - } - } - } - - $result = createPartArray($structure, ''); - //var_dump($result);exit; - foreach($result as $part) - { - if ($part['part_object']->subtype == 'HTML') $parthtml=$part['part_number']; - if ($part['part_object']->subtype == 'PLAIN') $partplain=$part['part_number']; - } - - /* OLD CODE to get parthtml and partplain - if (count($structure->parts) > 0) { // There some sub parts - foreach($structure->parts as $key => $part) - { - if ($part->subtype == 'HTML') $parthtml=($key+1); // For example: $parthtml = 1 or 2 - if ($part->subtype == 'PLAIN') $partplain=($key+1); - if ($part->subtype == 'ALTERNATIVE') - { - if (count($part->parts) > 0) - { - foreach($part->parts as $key2 => $part2) - { - if ($part2->subtype == 'HTML') $parthtml=($key+1).'.'.($key2+1); // For example: $parthtml = 1.1 or 1.2 - if ($part2->subtype == 'PLAIN') $partplain=($key+1).'.'.($key2+1); - } - } - else - { - $partplain=($key+1).'.1'; - } - } - } - } - else - { - $partplain=1; - }*/ - - //var_dump($structure); - //var_dump($parthtml);var_dump($partplain); - - $messagetext = imap_fetchbody($connection, $imapemail, ($parthtml != '-1' ? $parthtml : ($partplain != '-1' ? $partplain : 0)), FT_PEEK); - - //var_dump($overview); - //var_dump($header); - //var_dump($message); - //var_dump($structure->parts[0]->parts); - //var_dump($messagetext);exit; - $fromstring=$overview[0]->from; - $sender=$overview[0]->sender; - $to=$overview[0]->to; - $sendtocc=$overview[0]->cc; - $sendtobcc=$overview[0]->bcc; - $date=$overview[0]->udate; - $msgid=str_replace(array('<','>'), '', $overview[0]->message_id); - $subject=$overview[0]->subject; - //var_dump($msgid);exit; - - $reg=array(); - if (preg_match('/^(.*)<(.*)>$/', $fromstring, $reg)) - { - $from=$reg[2]; - $fromtext=$reg[1]; - } - else - { - $from = $fromstring; - $fromtext=''; - } - $fk_element_id = 0; $fk_element_type = ''; - - $contactid = 0; $thirdpartyid = 0; $projectid = 0; - - // Analyze TrackId in field References - // For example: References: <1542377954.SMTPs-dolibarr-thi649@8f6014fde11ec6cdec9a822234fc557e> - $trackid = ''; - $reg=array(); - if (! empty($headers['References']) && preg_match('/dolibarr-([a-z]+)([0-9]+)@'.preg_quote($host,'/').'/', $headers['References'], $reg)) - { - $trackid = $reg[1].$reg[2]; - - $objectid = 0; - $objectemail = null; - if ($reg[0] == 'inv') - { - $objectid = $reg[1]; - $objectemail = new Facture($this->db); - } - if ($reg[0] == 'proj') - { - $objectid = $reg[1]; - $objectemail = new Project($this->db); - } - if ($reg[0] == 'con') - { - $objectid = $reg[1]; - $objectemail = new Contact($this->db); - } - if ($reg[0] == 'thi') - { - $objectid = $reg[1]; - $objectemail = new Societe($this->db); - } - if ($reg[0] == 'use') - { - $objectid = $reg[1]; - $objectemail = new User($this->db); - } - - if (is_object($objectemail)) - { - $result = $objectemail->fetch($objectid); - if ($result > 0) - { - $fk_element_id = $objectemail->id; - $fk_element_type = $objectemail->element; - // Fix fk_element_type - if ($fk_element_type == 'facture') $fk_element_type = 'invoice'; - - $thirdpartyid = $objectemail->fk_soc; - $contactid = $objectemail->fk_socpeople; - $projectid = isset($objectemail->fk_project)?$objectemail->fk_project:$objectemail->fk_projet; - } - } - - // Project - if ($projectid > 0) - { - $result = $projectstatic->fetch($projectid); - if ($result <= 0) $projectstatic->id = 0; - else - { - $projectid = $projectstatic->id; - $projectfoundby = 'trackid ('.$trackid.')'; - if (empty($contactid)) $contactid = $projectstatic->fk_contact; - if (empty($thirdpartyid)) $thirdpartyid = $projectstatic->fk_soc; - } - } - // Contact - if ($contactid > 0) - { - $result = $contactstatic->fetch($contactid); - if ($result <= 0) $contactstatic->id = 0; - else - { - $contactid = $contactstatic->id; - $contactfoundby = 'trackid ('.$trackid.')'; - if (empty($thirdpartyid)) $thirdpartyid = $contactstatic->fk_soc; - } - } - // Thirdparty - if ($thirdpartyid > 0) - { - $result = $thirdpartystatic->fetch($thirdpartyid); - if ($result <= 0) $thirdpartystatic->id = 0; - else - { - $thirdpartyid = $thirdpartystatic->id; - $thirdpartyfoundby = 'trackid ('.$trackid.')'; - } - } - } - - if (empty($contactid)) // Try to find contact using email - { - $result = $contactstatic->fetch(0, null, '', $from); - if ($result > 0) - { - $contactid = $contactstatic->id; - $contactfoundby = 'email of contact ('.$from.')'; - if ($contactstatic->fk_soc > 0) - { - $result = $thirdpartystatic->fetch($contactstatic->fk_soc); - if ($result > 0) - { - $thirdpartyid = $thirdpartystatic->id; - $thirdpartyfoundby = 'email of contact ('.$from.')'; - } - } - } - } - - if (empty($thirdpartyid)) // Try to find thirdparty using email - { - $result = $thirdpartystatic->fetch(0, '', '', '', '', '', '', '', '', '', $from); - if ($result > 0) $thirdpartyfoundby = 'email ('.$from.')'; - } - - - - // Do operations - foreach($this->actions as $operation) - { - if ($errorforactions) break; - if (empty($operation['status'])) continue; - - // Make Operation - dol_syslog("Execute action ".$operation['type']." actionparam=".$operation['actionparam'].' thirdpartystatic->id='.$thirdpartystatic->id.' contactstatic->id='.$contactstatic->id.' projectstatic->id='.$projectstatic->id); - - // Search and create thirdparty - if ($operation['type'] == 'loadthirdparty' || $operation['type'] == 'loadandcreatethirdparty') - { - if (empty($operation['actionparam'])) - { - $errorforactions++; - $this->error = "Action loadthirdparty or loadandcreatethirdparty has empty parameter. Must be 'VALUE:xxx' or 'REGEX:(body|subject):regex' to define how to extract data"; - $this->errors[] = $this->error; - } - else - { - $actionparam = $operation['actionparam']; - $nametouseforthirdparty=''; - - // $this->actionparam = 'VALUE:aaa' or 'REGEX:BODY:....' - $arrayvaluetouse = dolExplodeIntoArray($actionparam, ';', '='); - foreach($arrayvaluetouse as $propertytooverwrite => $valueforproperty) - { - $sourcestring=''; - $sourcefield=''; - $regexstring=''; - $regforregex=array(); - - if (preg_match('/^REGEX:([a-zA-Z0-9]+):(.*)$/', $valueforproperty, $regforregex)) - { - $sourcefield=$regforregex[1]; - $regexstring=$regforregex[2]; - } - - if (! empty($sourcefield) && ! empty($regexstring)) - { - if (strtolower($sourcefield) == 'body') $sourcestring=$messagetext; - elseif (strtolower($sourcefield) == 'subject') $sourcestring=$subject; - - $regforval=array(); - if (preg_match('/'.$regexstring.'/', $sourcestring, $regforval)) // Do not use preg_quote here, string is already a regex syntax, for example string is 'Name:\s([^\s]*)' - { - // Overwrite param $tmpproperty - $nametouseforthirdparty = $regforval[1]; - } - else - { - // Nothing can be done for this param - } - //var_dump($sourcestring); var_dump($regexstring);var_dump($nametouseforthirdparty);exit; - } - elseif (preg_match('/^VALUE:(.*)$/', $valueforproperty, $reg)) - { - $nametouseforthirdparty = $reg[1]; - } - else - { - $errorforactions++; - $this->error = 'Bad syntax for description of action parameters: '.$actionparam; - $this->errors[] = $this->error; - break; - } - } - - if (! $errorforactions && $nametouseforthirdparty) - { - $result = $thirdpartystatic->fetch(0, $nametouseforthirdparty); - if ($result < 0) - { - $errorforactions++; - $this->error = 'Error when getting thirdparty with name '.$nametouseforthirdparty.' (may be 2 record exists with same name ?)'; - $this->errors[] = $this->error; - break; - } - elseif ($result == 0) - { - if ($operation['type'] == 'loadandcreatethirdparty') - { - dol_syslog("Third party with name ".$nametouseforthirdparty." was not found. We try to create it."); - - // Create thirdparty - $thirdpartystatic->name = $nametouseforthirdparty; - if ($fromtext != $nametouseforthirdparty) $thirdpartystatic->name_alias = $fromtext; - $thirdpartystatic->email = $from; - - // Overwrite values with values extracted from source email - $errorforthisaction = $this->overwritePropertiesOfObject($thirdpartystatic, $operation['actionparam'], $messagetext, $subject); - - if ($errorforthisaction) - { - $errorforactions++; - } - else - { - $result = $thirdpartystatic->create($user); - if ($result <= 0) - { - $errorforactions++; - $this->error = $thirdpartystatic->error; - $this->errors = $thirdpartystatic->errors; - } - } - } - else - { - dol_syslog("Third party with name ".$nametouseforthirdparty." was not found"); - } - } - } - } - } - // Create event - elseif ($operation['type'] == 'recordevent') - { - $actioncode = 'EMAIL_IN'; - - // Insert record of emails sent - $actioncomm = new ActionComm($this->db); - - $actioncomm->type_code = 'AC_OTH_AUTO'; // Type of event ('AC_OTH', 'AC_OTH_AUTO', 'AC_XXX'...) - $actioncomm->code = 'AC_'.$actioncode; - $actioncomm->label = $langs->trans("ActionAC_EMAIL_IN").' - '.$langs->trans("MailFrom").' '.$from; - $actioncomm->note = $messagetext; - $actioncomm->fk_project = $projectstatic->id; - $actioncomm->datep = $date; - $actioncomm->datef = $date; - $actioncomm->percentage = -1; // Not applicable - $actioncomm->socid = $thirdpartystatic->id; - $actioncomm->contactid = $contactstatic->id; - $actioncomm->authorid = $user->id; // User saving action - $actioncomm->userownerid = $user->id; // Owner of action - // Fields when action is an email (content should be added into note) - $actioncomm->email_msgid = $msgid; - $actioncomm->email_from = $fromstring; - $actioncomm->email_sender= $sender; - $actioncomm->email_to = $to; - $actioncomm->email_tocc = $sendtocc; - $actioncomm->email_tobcc = $sendtobcc; - $actioncomm->email_subject = $subject; - $actioncomm->errors_to = ''; - - if (! in_array($fk_element_type, array('societe','contact','project','user'))) - { - $actioncomm->fk_element = $fk_element_id; - $actioncomm->elementtype = $fk_element_type; - } - - //$actioncomm->extraparams = $extraparams; - - // Overwrite values with values extracted from source email - $errorforthisaction = $this->overwritePropertiesOfObject($actioncommn, $operation['actionparam'], $messagetext, $subject); - - if ($errorforthisaction) - { - $errorforactions++; - } - else - { - $result = $actioncomm->create($user); - if ($result <= 0) - { - $errorforactions++; - $this->errors = $actioncomm->errors; - } - } - } - // Create event - elseif ($operation['type'] == 'project') - { - $note_private = $langs->trans("ProjectCreatedByEmailCollector", $msgid); - $projecttocreate = new Project($this->db); - if ($thirdpartystatic->id > 0) - { - $projecttocreate->socid = $thirdpartystatic->id; - if ($thirdpartyfoundby) $note_private .= ' - Third party found from '.$thirdpartyfoundby; - } - if ($contactstatic->id > 0) - { - $projecttocreate->contact_id = $contactstatic->id; - if ($contactfoundby) $note_private .= ' - Contact/address found from '.$contactfoundby; - } - - $id_opp_status = dol_getIdFromCode($this->db, 'PROSP', 'c_lead_status', 'code', 'rowid'); - $percent_opp_status = dol_getIdFromCode($this->db, 'PROSP', 'c_lead_status', 'code', 'percent'); - - $projecttocreate->title = $subject; - $projecttocreate->date_start = $now; - $projecttocreate->date_end = ''; - $projecttocreate->opp_status = $id_opp_status; - $projecttocreate->opp_percent = $percent_opp_status; - $projecttocreate->description = ($note_private?$note_private."\n":'').dol_string_nohtmltag($messagetext, 2); - $projecttocreate->note_private = $note_private; - $projecttocreate->entity = $conf->entity; - - // Get next project Ref - $defaultref=''; - $modele = empty($conf->global->PROJECT_ADDON)?'mod_project_simple':$conf->global->PROJECT_ADDON; - - // Search template files - $file=''; $classname=''; $filefound=0; $reldir=''; - $dirmodels=array_merge(array('/'),(array) $conf->modules_parts['models']); - foreach($dirmodels as $reldir) - { - $file=dol_buildpath($reldir."core/modules/project/".$modele.'.php',0); - if (file_exists($file)) - { - $filefound=1; - $classname = $modele; - break; - } - } - - if ($filefound) - { - $result=dol_include_once($reldir."core/modules/project/".$modele.'.php'); - $modProject = new $classname; - - $defaultref = $modProject->getNextValue(($thirdpartystatic->id > 0 ? $thirdpartystatic : null), $projecttocreate); - } - - $projecttocreate->ref = $defaultref; - - // Overwrite values with values extracted from source email - $errorforthisaction = $this->overwritePropertiesOfObject($projecttocreate, $operation['actionparam'], $messagetext, $subject); - - if ($errorforthisaction) - { - $errorforactions++; - } - else - { - if (is_numeric($projecttocreate->ref) && $projecttocreate->ref <= 0) - { - $errorforactions++; - $this->error = 'Failed to create project: Can\'t get a valid value for project Ref'; - } - else - { - // Create project - $result = $projecttocreate->create($user); - if ($result <= 0) - { - $errorforactions++; - $this->error = 'Failed to create project: '.$langs->trans($projecttocreate->error); - $this->errors = $projecttocreate->errors; - } - } - } - } - - if (! $errorforactions) - { - $nbactiondoneforemail++; - } - } - - // Error for email or not ? - if (! $errorforactions) - { - if ($targetdir) - { - dol_syslog("EmailCollector::doCollectOneCollector move message ".$imapemail." to ".$connectstringtarget, LOG_DEBUG); - $res = imap_mail_move($connection, $imapemail, $targetdir, 0); - if ($res == false) { - $errorforemail++; - $this->error = imap_last_error(); - $this->errors[] = $this->error; - dol_syslog(imap_last_error()); - } - } - else - { - dol_syslog("EmailCollector::doCollectOneCollector message ".$imapemail." to ".$connectstringtarget." was set to read", LOG_DEBUG); - } - } - else - { - $errorforemail++; - } - - if (! $errorforemail) - { - $nbactiondone += $nbactiondoneforemail; - $nbemailok++; - - $this->db->commit(); - } - else - { - $error++; - - $this->db->rollback(); - } - - $nbemailprocessed++; - - unset($objectemail); - unset($projectstatic); - unset($thirdpartystatic); - unset($contactstatic); - } - - $output=$langs->trans('XEmailsDoneYActionsDone', $nbemailprocessed, $nbemailok, $nbactiondone); - } - else - { - $output=$langs->trans('NoNewEmailToProcess'); - } - - imap_expunge($connection); // To validate any move - - imap_close($connection); - - $this->datelastresult = $now; - $this->lastresult = $output; - - if (! empty($this->errors)) $this->lastresult.= " - ".join(" - ", $this->errors); - $this->codelastresult = ($error ? 'KO' : 'OK'); - $this->update($user); - - dol_syslog("EmailCollector::doCollectOneCollector end", LOG_DEBUG); - - return $error?-1:1; - } + $linkstart = ''; + $linkend=''; + + $result .= $linkstart; + if ($withpicto) $result.=img_object(($notooltip?'':$label), ($this->picto?$this->picto:'generic'), ($notooltip?(($withpicto != 2) ? 'class="paddingright"' : ''):'class="'.(($withpicto != 2) ? 'paddingright ' : '').'classfortooltip"'), 0, 0, $notooltip?0:1); + if ($withpicto != 2) $result.= $this->ref; + $result .= $linkend; + //if ($withpicto != 2) $result.=(($addlabel && $this->label) ? $sep . dol_trunc($this->label, ($addlabel > 1 ? $addlabel : 0)) : ''); + + global $action,$hookmanager; + $hookmanager->initHooks(array('emailcollectordao')); + $parameters=array('id'=>$this->id, 'getnomurl'=>$result); + $reshook=$hookmanager->executeHooks('getNomUrl',$parameters,$this,$action); // Note that $action and $object may have been modified by some hooks + if ($reshook > 0) $result = $hookmanager->resPrint; + else $result .= $hookmanager->resPrint; + + return $result; + } + + /** + * Return label of the status + * + * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto + * @return string Label of status + */ + public function getLibStatut($mode=0) + { + return $this->LibStatut($this->status, $mode); + } + + // phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps + /** + * Return the status + * + * @param int $status Id status + * @param int $mode 0=long label, 1=short label, 2=Picto + short label, 3=Picto, 4=Picto + long label, 5=Short label + Picto, 6=Long label + Picto + * @return string Label of status + */ + public function LibStatut($status, $mode=0) + { + // phpcs:enable + if (empty($this->labelstatus)) + { + global $langs; + //$langs->load("mymodule"); + $this->labelstatus[1] = $langs->trans('Enabled'); + $this->labelstatus[0] = $langs->trans('Disabled'); + } + + if ($mode == 0) + { + return $this->labelstatus[$status]; + } + elseif ($mode == 1) + { + return $this->labelstatus[$status]; + } + elseif ($mode == 2) + { + if ($status == 1) return img_picto($this->labelstatus[$status],'statut4', '', false, 0, 0, '', 'valignmiddle').' '.$this->labelstatus[$status]; + elseif ($status == 0) return img_picto($this->labelstatus[$status],'statut5', '', false, 0, 0, '', 'valignmiddle').' '.$this->labelstatus[$status]; + } + elseif ($mode == 3) + { + if ($status == 1) return img_picto($this->labelstatus[$status],'statut4', '', false, 0, 0, '', 'valignmiddle'); + elseif ($status == 0) return img_picto($this->labelstatus[$status],'statut5', '', false, 0, 0, '', 'valignmiddle'); + } + elseif ($mode == 4) + { + if ($status == 1) return img_picto($this->labelstatus[$status],'statut4', '', false, 0, 0, '', 'valignmiddle').' '.$this->labelstatus[$status]; + elseif ($status == 0) return img_picto($this->labelstatus[$status],'statut5', '', false, 0, 0, '', 'valignmiddle').' '.$this->labelstatus[$status]; + } + elseif ($mode == 5) + { + if ($status == 1) return $this->labelstatus[$status].' '.img_picto($this->labelstatus[$status],'statut4', '', false, 0, 0, '', 'valignmiddle'); + elseif ($status == 0) return $this->labelstatus[$status].' '.img_picto($this->labelstatus[$status],'statut5', '', false, 0, 0, '', 'valignmiddle'); + } + elseif ($mode == 6) + { + if ($status == 1) return $this->labelstatus[$status].' '.img_picto($this->labelstatus[$status],'statut4', '', false, 0, 0, '', 'valignmiddle'); + elseif ($status == 0) return $this->labelstatus[$status].' '.img_picto($this->labelstatus[$status],'statut5', '', false, 0, 0, '', 'valignmiddle'); + } + } + + /** + * Charge les informations d'ordre info dans l'objet commande + * + * @param int $id Id of order + * @return void + */ + public function info($id) + { + $sql = 'SELECT rowid, date_creation as datec, tms as datem,'; + $sql.= ' fk_user_creat, fk_user_modif'; + $sql.= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t'; + $sql.= ' WHERE t.rowid = '.$id; + $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_valid) + { + $vuser = new User($this->db); + $vuser->fetch($obj->fk_user_valid); + $this->user_validation = $vuser; + } + + if ($obj->fk_user_cloture) + { + $cluser = new User($this->db); + $cluser->fetch($obj->fk_user_cloture); + $this->user_cloture = $cluser; + } + + $this->date_creation = $this->db->jdate($obj->datec); + $this->date_modification = $this->db->jdate($obj->datem); + $this->date_validation = $this->db->jdate($obj->datev); + } + + $this->db->free($result); + } + else + { + dol_print_error($this->db); + } + } + + /** + * Initialise object with example values + * Id must be 0 if object instance is a specimen + * + * @return void + */ + public function initAsSpecimen() + { + $this->initAsSpecimenCommon(); + } + + /** + * Fetch filters + * + * @return int <0 if KO, >0 if OK + */ + public function fetchFilters() + { + $this->filters = array(); + + $sql = 'SELECT rowid, type, rulevalue, status'; + $sql.= ' FROM '.MAIN_DB_PREFIX.'emailcollector_emailcollectorfilter'; + $sql.= ' WHERE fk_emailcollector = '.$this->id; + //$sql.= ' ORDER BY position'; + + $resql = $this->db->query($sql); + if ($resql) + { + $num=$this->db->num_rows($resql); + $i = 0; + while($i < $num) + { + $obj=$this->db->fetch_object($resql); + $this->filters[$obj->rowid]=array('id'=>$obj->rowid, 'type'=>$obj->type, 'rulevalue'=>$obj->rulevalue, 'status'=>$obj->status); + $i++; + } + $this->db->free($resql); + } + else dol_print_error($this->db); + + return 1; + } + + /** + * Fetch actions + * + * @return int <0 if KO, >0 if OK + */ + public function fetchActions() + { + $this->actions = array(); + + $sql = 'SELECT rowid, type, actionparam, status'; + $sql.= ' FROM '.MAIN_DB_PREFIX.'emailcollector_emailcollectoraction'; + $sql.= ' WHERE fk_emailcollector = '.$this->id; + $sql.= ' ORDER BY position'; + + $resql = $this->db->query($sql); + if ($resql) + { + $num=$this->db->num_rows($resql); + $i = 0; + while($i < $num) + { + $obj=$this->db->fetch_object($resql); + $this->actions[$obj->rowid]=array('id'=>$obj->rowid, 'type'=>$obj->type, 'actionparam'=>$obj->actionparam, 'status'=>$obj->status); + $i++; + } + $this->db->free($resql); + } + else dol_print_error($this->db); + } + + + /** + * Return the connectstring to use with IMAP connection function + * + * @return string + */ + function getConnectStringIMAP() + { + // Connect to IMAP + $flags ='/service=imap'; // IMAP + $flags.='/ssl'; // '/tls' + $flags.='/novalidate-cert'; + //$flags.='/readonly'; + //$flags.='/debug'; + + $connectstringserver = '{'.$this->host.':993'.$flags.'}'; + + return $connectstringserver; + } + + /** + * Action executed by scheduler + * CAN BE A CRON TASK. In such a case, paramerts come from the schedule job setup field 'Parameters' + * + * @return int 0 if OK, <>0 if KO (this function is used also by cron so only 0 is OK) + */ + public function doCollect() + { + global $user; + + $nberror = 0; + + $arrayofcollectors = $this->fetchAll($user, 1); + + // Loop on each collector + foreach($arrayofcollectors as $emailcollector) + { + $result = $emailcollector->doCollectOneCollector(); + dol_syslog("doCollect result = ".$result." for emailcollector->id = ".$emailcollector->id); + + $this->error.='EmailCollector ID '.$emailcollector->id.':'.$emailcollector->error.'
'; + if (! empty($emailcollector->errors)) $this->error.=join('
', $emailcollector->errors); + $this->output.='EmailCollector ID '.$emailcollector->id.': '.$emailcollector->lastresult.'
'; + } + + return $nberror; + } + + /** + * overwitePropertiesOfObject + * + * @return int 0=OK, Nb of error if error + */ + + /** + * overwitePropertiesOfObject + * + * @param object $object Current object + * @param string $actionparam Action parameters + * @param string $messagetext Body + * @param string $subject Subject + * @return int 0=OK, Nb of error if error + */ + private function overwritePropertiesOfObject(&$object, $actionparam, $messagetext, $subject) + { + $errorforthisaction = 0; + + // Overwrite values with values extracted from source email + // $this->actionparam = 'opportunity_status=123;abc=REGEX:BODY:....' + $arrayvaluetouse = dolExplodeIntoArray($actionparam, ';', '='); + foreach($arrayvaluetouse as $propertytooverwrite => $valueforproperty) + { + $tmpclass=''; $tmpproperty=''; + $tmparray=explode('.', $propertytooverwrite); + if (count($tmparray) == 2) + { + $tmpclass=$tmparray[0]; + $tmpproperty=$tmparray[1]; + } + else + { + $tmpproperty=$tmparray[0]; + } + if ($tmpclass && ($tmpclass != $object->element)) continue; // Property is for another type of object + + if (property_exists($object, $tmpproperty)) + { + $sourcestring=''; + $sourcefield=''; + $regexstring=''; + //$transformationstring=''; + $regforregex=array(); + if (preg_match('/^REGEX:([a-zA-Z0-9]+):(.*):([^:])$/', $valueforproperty, $regforregex)) + { + $sourcefield=$regforregex[1]; + $regexstring=$regforregex[2]; + //$transofrmationstring=$regforregex[3]; + } + elseif (preg_match('/^REGEX:([a-zA-Z0-9]+):(.*)$/', $valueforproperty, $regforregex)) + { + $sourcefield=$regforregex[1]; + $regexstring=$regforregex[2]; + } + + if (! empty($sourcefield) && ! empty($regexstring)) + { + if (strtolower($sourcefield) == 'body') $sourcestring=$messagetext; + elseif (strtolower($sourcefield) == 'subject') $sourcestring=$subject; + + $regforval=array(); + if (preg_match('/'.preg_quote($regexstring, '/').'/', $sourcestring, $regforval)) + { + // Overwrite param $tmpproperty + $object->$tmpproperty = $regforval[1]; + } + else + { + // Nothing can be done for this param + } + } + elseif (preg_match('/^VALUE:(.*)$/', $valueforproperty, $reg)) + { + $object->$tmpproperty = $reg[1]; + } + else + { + $errorforthisaction++; + $this->error = 'Bad syntax for description of action parameters: '.$actionparam; + $this->errors[] = $this->error; + } + } + } + + return $errorforthisaction; + } + + /** + * Execute collect for current collector loaded previously with fetch. + * + * @return int <0 if KO, >0 if OK + */ + public function doCollectOneCollector() + { + global $conf, $langs, $user; + + //$conf->global->SYSLOG_FILE = 'DOL_DATA_ROOT/dolibarr_mydedicatedlofile.log'; + + require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php'; + + dol_syslog("EmailCollector::doCollectOneCollector start", LOG_DEBUG); + + $langs->loadLangs(array("project", "companies", "mails", "errors")); + + $error = 0; + $this->output = ''; + $this->error=''; + + $now = dol_now(); + + if (empty($this->host)) + { + $this->error=$langs->trans('ErrorFieldRequired', 'EMailHost'); + return -1; + } + if (empty($this->login)) + { + $this->error=$langs->trans('ErrorFieldRequired', 'Login'); + return -1; + } + if (empty($this->source_directory)) + { + $this->error=$langs->trans('ErrorFieldRequired', 'MailboxSourceDirectory'); + return -1; + } + if (! function_exists('imap_open')) + { + $this->error='IMAP function not enabled on your PHP'; + return -2; + } + + $this->fetchFilters(); + $this->fetchActions(); + + $sourcedir = $this->source_directory; + $targetdir = ($this->target_directory ? $this->target_directory : ''); // Can be '[Gmail]/Trash' or 'mytag' + + $connectstringserver = $this->getConnectStringIMAP(); + $connectstringsource = $connectstringserver.imap_utf7_encode($sourcedir); + $connectstringtarget = $connectstringserver.imap_utf7_encode($targetdir); + + $connection = imap_open($connectstringsource, $this->login, $this->password); + if (! $connection) + { + $this->error = 'Failed to open IMAP connection '.$connectstringsource; + return -3; + } + + //$search='ALL'; + $search='UNDELETED'; + $searchfilterdoltrackid=0; + $searchfilternodoltrackid=0; + foreach($this->filters as $rule) + { + if (empty($rule['status'])) continue; + + if ($rule['type'] == 'to') $search.=($search?' ':'').'TO "'.str_replace('"', '', $rule['rulevalue']).'"'; + if ($rule['type'] == 'bcc') $search.=($search?' ':'').'BCC'; + if ($rule['type'] == 'cc') $search.=($search?' ':'').'CC'; + if ($rule['type'] == 'from') $search.=($search?' ':'').'FROM "'.str_replace('"', '', $rule['rulevalue']).'"'; + if ($rule['type'] == 'subject') $search.=($search?' ':'').'SUBJECT "'.str_replace('"', '', $rule['rulevalue']).'"'; + if ($rule['type'] == 'body') $search.=($search?' ':'').'BODY "'.str_replace('"', '', $rule['rulevalue']).'"'; + if ($rule['type'] == 'seen') $search.=($search?' ':'').'SEEN'; + if ($rule['type'] == 'unseen') $search.=($search?' ':'').'UNSEEN'; + if ($rule['type'] == 'withtrackingid') $searchfilterdoltrackid++; + if ($rule['type'] == 'withouttrackingid') $searchfilternodoltrackid++; + } + + if (empty($targetdir)) // Use last date as filter if there is no targetdir defined. + { + $fromdate=0; + if ($this->datelastresult && $this->codelastresult == 'OK') $fromdate = $this->datelastresult; + if ($fromdate > 0) $search.=($search?' ':'').'SINCE '.dol_print_date($fromdate - 1,'dayhourrfc'); + } + dol_syslog("IMAP search string = ".$search); + //var_dump($search); + + $nbemailprocessed=0; + $nbemailok=0; + $nbactiondone=0; + + // Scan IMAP inbox + $arrayofemail= imap_search($connection, $search); + //var_dump($arrayofemail);exit; + + // Loop on each email found + if (! empty($arrayofemail) && count($arrayofemail) > 0) + { + foreach($arrayofemail as $imapemail) + { + if ($nbemailprocessed > 100) break; // Do not process more than 100 email per launch + + $header = imap_fetchheader($connection, $imapemail, 0); + $matches=array(); + preg_match_all('/([^: ]+): (.+?(?:\r\n\s(?:.+?))*)\r\n/m', $header, $matches); + $headers = array_combine($matches[1], $matches[2]); + //var_dump($headers); + + // $conf->global->MAIL_PREFIX_FOR_EMAIL_ID must be defined + $host=dol_getprefix('email'); + + // If there is a filter on trackid + //var_dump($host);exit; + if ($searchfilterdoltrackid > 0) + { + //if (empty($headers['X-Dolibarr-TRACKID'])) continue; + if (empty($headers['References']) || ! preg_match('/@'.preg_quote($host,'/').'/', $headers['References'])) + { + $nbemailprocessed++; + continue; + } + } + if ($searchfilternodoltrackid > 0) + { + if (! empty($headers['References']) && preg_match('/@'.preg_quote($host,'/').'/', $headers['References'])) + { + $nbemailprocessed++; + continue; + } + //if (! empty($headers['X-Dolibarr-TRACKID']) continue; + } + + $thirdpartystatic=new Societe($this->db); + $contactstatic=new Contact($this->db); + $projectstatic=new Project($this->db); + + $nbactiondoneforemail = 0; + $errorforemail = 0; + $errorforactions = 0; + $thirdpartyfoundby = ''; + $contactfoundby = ''; + $projectfoundby = ''; + + $this->db->begin(); + + //$message = imap_body($connection, $imapemail, 0); + $overview = imap_fetch_overview($connection, $imapemail, 0); + $structure = imap_fetchstructure($connection, $imapemail, 0); + + $partplain = $parthtml = -1; + // Loop to get part html and plain + /* + 0 multipart/mixed + 1 multipart/alternative + 1.1 text/plain + 1.2 text/html + 2 message/rfc822 + 2 multipart/mixed + 2.1 multipart/alternative + 2.1.1 text/plain + 2.1.2 text/html + 2.2 message/rfc822 + 2.2 multipart/alternative + 2.2.1 text/plain + 2.2.2 text/html + */ + /** + * create_part_array + * + * @param Object $structure Structure + * @param string $prefix prefix + * @return array Array with number and object + */ + function createPartArray($structure, $prefix="") + { + //print_r($structure); + if (count($structure->parts) > 0) { // There some sub parts + foreach ($structure->parts as $count => $part) { + add_part_to_array($part, $prefix.($count+1), $part_array); + } + }else{ // Email does not have a seperate mime attachment for text + $part_array[] = array('part_number' => $prefix.'1', 'part_object' => $obj); + } + return $part_array; + } + + /** + * Sub function for createPartArray(). Only called by createPartArray() and itself. + * + * @param Object $obj Structure + * @param string $partno Part no + * @param array $part_array array + * @return void + */ + function addPartToArray($obj, $partno, &$part_array) + { + $part_array[] = array('part_number' => $partno, 'part_object' => $obj); + if ($obj->type == 2) { // Check to see if the part is an attached email message, as in the RFC-822 type + //print_r($obj); + if (array_key_exists('parts',$obj)) { // Check to see if the email has parts + foreach ($obj->parts as $count => $part) { + // Iterate here again to compensate for the broken way that imap_fetchbody() handles attachments + if (count($part->parts) > 0) { + foreach ($part->parts as $count2 => $part2) { + addPartToArray($part2, $partno.".".($count2+1), $part_array); + } + }else{ // Attached email does not have a seperate mime attachment for text + $part_array[] = array('part_number' => $partno.'.'.($count+1), 'part_object' => $obj); + } + } + }else{ // Not sure if this is possible + $part_array[] = array('part_number' => $partno.'.1', 'part_object' => $obj); + } + }else{ // If there are more sub-parts, expand them out. + if (array_key_exists('parts',$obj)) { + foreach ($obj->parts as $count => $p) { + addPartToArray($p, $partno.".".($count+1), $part_array); + } + } + } + } + + $result = createPartArray($structure, ''); + //var_dump($result);exit; + foreach($result as $part) + { + if ($part['part_object']->subtype == 'HTML') $parthtml=$part['part_number']; + if ($part['part_object']->subtype == 'PLAIN') $partplain=$part['part_number']; + } + + /* OLD CODE to get parthtml and partplain + if (count($structure->parts) > 0) { // There some sub parts + foreach($structure->parts as $key => $part) + { + if ($part->subtype == 'HTML') $parthtml=($key+1); // For example: $parthtml = 1 or 2 + if ($part->subtype == 'PLAIN') $partplain=($key+1); + if ($part->subtype == 'ALTERNATIVE') + { + if (count($part->parts) > 0) + { + foreach($part->parts as $key2 => $part2) + { + if ($part2->subtype == 'HTML') $parthtml=($key+1).'.'.($key2+1); // For example: $parthtml = 1.1 or 1.2 + if ($part2->subtype == 'PLAIN') $partplain=($key+1).'.'.($key2+1); + } + } + else + { + $partplain=($key+1).'.1'; + } + } + } + } + else + { + $partplain=1; + }*/ + + //var_dump($structure); + //var_dump($parthtml);var_dump($partplain); + + $messagetext = imap_fetchbody($connection, $imapemail, ($parthtml != '-1' ? $parthtml : ($partplain != '-1' ? $partplain : 0)), FT_PEEK); + + //var_dump($overview); + //var_dump($header); + //var_dump($message); + //var_dump($structure->parts[0]->parts); + //var_dump($messagetext);exit; + $fromstring=$overview[0]->from; + $sender=$overview[0]->sender; + $to=$overview[0]->to; + $sendtocc=$overview[0]->cc; + $sendtobcc=$overview[0]->bcc; + $date=$overview[0]->udate; + $msgid=str_replace(array('<','>'), '', $overview[0]->message_id); + $subject=$overview[0]->subject; + //var_dump($msgid);exit; + + $reg=array(); + if (preg_match('/^(.*)<(.*)>$/', $fromstring, $reg)) + { + $from=$reg[2]; + $fromtext=$reg[1]; + } + else + { + $from = $fromstring; + $fromtext=''; + } + $fk_element_id = 0; $fk_element_type = ''; + + $contactid = 0; $thirdpartyid = 0; $projectid = 0; + + // Analyze TrackId in field References + // For example: References: <1542377954.SMTPs-dolibarr-thi649@8f6014fde11ec6cdec9a822234fc557e> + $trackid = ''; + $reg=array(); + if (! empty($headers['References']) && preg_match('/dolibarr-([a-z]+)([0-9]+)@'.preg_quote($host,'/').'/', $headers['References'], $reg)) + { + $trackid = $reg[1].$reg[2]; + + $objectid = 0; + $objectemail = null; + if ($reg[0] == 'inv') + { + $objectid = $reg[1]; + $objectemail = new Facture($this->db); + } + if ($reg[0] == 'proj') + { + $objectid = $reg[1]; + $objectemail = new Project($this->db); + } + if ($reg[0] == 'con') + { + $objectid = $reg[1]; + $objectemail = new Contact($this->db); + } + if ($reg[0] == 'thi') + { + $objectid = $reg[1]; + $objectemail = new Societe($this->db); + } + if ($reg[0] == 'use') + { + $objectid = $reg[1]; + $objectemail = new User($this->db); + } + + if (is_object($objectemail)) + { + $result = $objectemail->fetch($objectid); + if ($result > 0) + { + $fk_element_id = $objectemail->id; + $fk_element_type = $objectemail->element; + // Fix fk_element_type + if ($fk_element_type == 'facture') $fk_element_type = 'invoice'; + + $thirdpartyid = $objectemail->fk_soc; + $contactid = $objectemail->fk_socpeople; + $projectid = isset($objectemail->fk_project)?$objectemail->fk_project:$objectemail->fk_projet; + } + } + + // Project + if ($projectid > 0) + { + $result = $projectstatic->fetch($projectid); + if ($result <= 0) $projectstatic->id = 0; + else + { + $projectid = $projectstatic->id; + $projectfoundby = 'trackid ('.$trackid.')'; + if (empty($contactid)) $contactid = $projectstatic->fk_contact; + if (empty($thirdpartyid)) $thirdpartyid = $projectstatic->fk_soc; + } + } + // Contact + if ($contactid > 0) + { + $result = $contactstatic->fetch($contactid); + if ($result <= 0) $contactstatic->id = 0; + else + { + $contactid = $contactstatic->id; + $contactfoundby = 'trackid ('.$trackid.')'; + if (empty($thirdpartyid)) $thirdpartyid = $contactstatic->fk_soc; + } + } + // Thirdparty + if ($thirdpartyid > 0) + { + $result = $thirdpartystatic->fetch($thirdpartyid); + if ($result <= 0) $thirdpartystatic->id = 0; + else + { + $thirdpartyid = $thirdpartystatic->id; + $thirdpartyfoundby = 'trackid ('.$trackid.')'; + } + } + } + + if (empty($contactid)) // Try to find contact using email + { + $result = $contactstatic->fetch(0, null, '', $from); + if ($result > 0) + { + $contactid = $contactstatic->id; + $contactfoundby = 'email of contact ('.$from.')'; + if ($contactstatic->fk_soc > 0) + { + $result = $thirdpartystatic->fetch($contactstatic->fk_soc); + if ($result > 0) + { + $thirdpartyid = $thirdpartystatic->id; + $thirdpartyfoundby = 'email of contact ('.$from.')'; + } + } + } + } + + if (empty($thirdpartyid)) // Try to find thirdparty using email + { + $result = $thirdpartystatic->fetch(0, '', '', '', '', '', '', '', '', '', $from); + if ($result > 0) $thirdpartyfoundby = 'email ('.$from.')'; + } + + + + // Do operations + foreach($this->actions as $operation) + { + if ($errorforactions) break; + if (empty($operation['status'])) continue; + + // Make Operation + dol_syslog("Execute action ".$operation['type']." actionparam=".$operation['actionparam'].' thirdpartystatic->id='.$thirdpartystatic->id.' contactstatic->id='.$contactstatic->id.' projectstatic->id='.$projectstatic->id); + + // Search and create thirdparty + if ($operation['type'] == 'loadthirdparty' || $operation['type'] == 'loadandcreatethirdparty') + { + if (empty($operation['actionparam'])) + { + $errorforactions++; + $this->error = "Action loadthirdparty or loadandcreatethirdparty has empty parameter. Must be 'VALUE:xxx' or 'REGEX:(body|subject):regex' to define how to extract data"; + $this->errors[] = $this->error; + } + else + { + $actionparam = $operation['actionparam']; + $nametouseforthirdparty=''; + + // $this->actionparam = 'VALUE:aaa' or 'REGEX:BODY:....' + $arrayvaluetouse = dolExplodeIntoArray($actionparam, ';', '='); + foreach($arrayvaluetouse as $propertytooverwrite => $valueforproperty) + { + $sourcestring=''; + $sourcefield=''; + $regexstring=''; + $regforregex=array(); + + if (preg_match('/^REGEX:([a-zA-Z0-9]+):(.*)$/', $valueforproperty, $regforregex)) + { + $sourcefield=$regforregex[1]; + $regexstring=$regforregex[2]; + } + + if (! empty($sourcefield) && ! empty($regexstring)) + { + if (strtolower($sourcefield) == 'body') $sourcestring=$messagetext; + elseif (strtolower($sourcefield) == 'subject') $sourcestring=$subject; + + $regforval=array(); + if (preg_match('/'.$regexstring.'/', $sourcestring, $regforval)) // Do not use preg_quote here, string is already a regex syntax, for example string is 'Name:\s([^\s]*)' + { + // Overwrite param $tmpproperty + $nametouseforthirdparty = $regforval[1]; + } + else + { + // Nothing can be done for this param + } + //var_dump($sourcestring); var_dump($regexstring);var_dump($nametouseforthirdparty);exit; + } + elseif (preg_match('/^VALUE:(.*)$/', $valueforproperty, $reg)) + { + $nametouseforthirdparty = $reg[1]; + } + else + { + $errorforactions++; + $this->error = 'Bad syntax for description of action parameters: '.$actionparam; + $this->errors[] = $this->error; + break; + } + } + + if (! $errorforactions && $nametouseforthirdparty) + { + $result = $thirdpartystatic->fetch(0, $nametouseforthirdparty); + if ($result < 0) + { + $errorforactions++; + $this->error = 'Error when getting thirdparty with name '.$nametouseforthirdparty.' (may be 2 record exists with same name ?)'; + $this->errors[] = $this->error; + break; + } + elseif ($result == 0) + { + if ($operation['type'] == 'loadandcreatethirdparty') + { + dol_syslog("Third party with name ".$nametouseforthirdparty." was not found. We try to create it."); + + // Create thirdparty + $thirdpartystatic->name = $nametouseforthirdparty; + if ($fromtext != $nametouseforthirdparty) $thirdpartystatic->name_alias = $fromtext; + $thirdpartystatic->email = $from; + + // Overwrite values with values extracted from source email + $errorforthisaction = $this->overwritePropertiesOfObject($thirdpartystatic, $operation['actionparam'], $messagetext, $subject); + + if ($errorforthisaction) + { + $errorforactions++; + } + else + { + $result = $thirdpartystatic->create($user); + if ($result <= 0) + { + $errorforactions++; + $this->error = $thirdpartystatic->error; + $this->errors = $thirdpartystatic->errors; + } + } + } + else + { + dol_syslog("Third party with name ".$nametouseforthirdparty." was not found"); + } + } + } + } + } + // Create event + elseif ($operation['type'] == 'recordevent') + { + $actioncode = 'EMAIL_IN'; + + // Insert record of emails sent + $actioncomm = new ActionComm($this->db); + + $actioncomm->type_code = 'AC_OTH_AUTO'; // Type of event ('AC_OTH', 'AC_OTH_AUTO', 'AC_XXX'...) + $actioncomm->code = 'AC_'.$actioncode; + $actioncomm->label = $langs->trans("ActionAC_EMAIL_IN").' - '.$langs->trans("MailFrom").' '.$from; + $actioncomm->note = $messagetext; + $actioncomm->fk_project = $projectstatic->id; + $actioncomm->datep = $date; + $actioncomm->datef = $date; + $actioncomm->percentage = -1; // Not applicable + $actioncomm->socid = $thirdpartystatic->id; + $actioncomm->contactid = $contactstatic->id; + $actioncomm->authorid = $user->id; // User saving action + $actioncomm->userownerid = $user->id; // Owner of action + // Fields when action is an email (content should be added into note) + $actioncomm->email_msgid = $msgid; + $actioncomm->email_from = $fromstring; + $actioncomm->email_sender= $sender; + $actioncomm->email_to = $to; + $actioncomm->email_tocc = $sendtocc; + $actioncomm->email_tobcc = $sendtobcc; + $actioncomm->email_subject = $subject; + $actioncomm->errors_to = ''; + + if (! in_array($fk_element_type, array('societe','contact','project','user'))) + { + $actioncomm->fk_element = $fk_element_id; + $actioncomm->elementtype = $fk_element_type; + } + + //$actioncomm->extraparams = $extraparams; + + // Overwrite values with values extracted from source email + $errorforthisaction = $this->overwritePropertiesOfObject($actioncommn, $operation['actionparam'], $messagetext, $subject); + + if ($errorforthisaction) + { + $errorforactions++; + } + else + { + $result = $actioncomm->create($user); + if ($result <= 0) + { + $errorforactions++; + $this->errors = $actioncomm->errors; + } + } + } + // Create event + elseif ($operation['type'] == 'project') + { + $note_private = $langs->trans("ProjectCreatedByEmailCollector", $msgid); + $projecttocreate = new Project($this->db); + if ($thirdpartystatic->id > 0) + { + $projecttocreate->socid = $thirdpartystatic->id; + if ($thirdpartyfoundby) $note_private .= ' - Third party found from '.$thirdpartyfoundby; + } + if ($contactstatic->id > 0) + { + $projecttocreate->contact_id = $contactstatic->id; + if ($contactfoundby) $note_private .= ' - Contact/address found from '.$contactfoundby; + } + + $id_opp_status = dol_getIdFromCode($this->db, 'PROSP', 'c_lead_status', 'code', 'rowid'); + $percent_opp_status = dol_getIdFromCode($this->db, 'PROSP', 'c_lead_status', 'code', 'percent'); + + $projecttocreate->title = $subject; + $projecttocreate->date_start = $now; + $projecttocreate->date_end = ''; + $projecttocreate->opp_status = $id_opp_status; + $projecttocreate->opp_percent = $percent_opp_status; + $projecttocreate->description = dol_concatdesc(dol_concatdesc($note_private, dolGetFirstLineOfText(dol_string_nohtmltag($messagetext, 2), 3)), '...'.$langs->transnoentities("SeePrivateNote").'...'); + $projecttocreate->note_private = dol_concatdesc($note_private, dol_string_nohtmltag($messagetext, 2)); + $projecttocreate->entity = $conf->entity; + + // Get next project Ref + $defaultref=''; + $modele = empty($conf->global->PROJECT_ADDON)?'mod_project_simple':$conf->global->PROJECT_ADDON; + + // Search template files + $file=''; $classname=''; $filefound=0; $reldir=''; + $dirmodels=array_merge(array('/'),(array) $conf->modules_parts['models']); + foreach($dirmodels as $reldir) + { + $file=dol_buildpath($reldir."core/modules/project/".$modele.'.php',0); + if (file_exists($file)) + { + $filefound=1; + $classname = $modele; + break; + } + } + + if ($filefound) + { + $result=dol_include_once($reldir."core/modules/project/".$modele.'.php'); + $modProject = new $classname; + + $defaultref = $modProject->getNextValue(($thirdpartystatic->id > 0 ? $thirdpartystatic : null), $projecttocreate); + } + + $projecttocreate->ref = $defaultref; + + // Overwrite values with values extracted from source email + $errorforthisaction = $this->overwritePropertiesOfObject($projecttocreate, $operation['actionparam'], $messagetext, $subject); + + if ($errorforthisaction) + { + $errorforactions++; + } + else + { + if (is_numeric($projecttocreate->ref) && $projecttocreate->ref <= 0) + { + $errorforactions++; + $this->error = 'Failed to create project: Can\'t get a valid value for project Ref'; + } + else + { + // Create project + $result = $projecttocreate->create($user); + if ($result <= 0) + { + $errorforactions++; + $this->error = 'Failed to create project: '.$langs->trans($projecttocreate->error); + $this->errors = $projecttocreate->errors; + } + } + } + } + + if (! $errorforactions) + { + $nbactiondoneforemail++; + } + } + + // Error for email or not ? + if (! $errorforactions) + { + if ($targetdir) + { + dol_syslog("EmailCollector::doCollectOneCollector move message ".$imapemail." to ".$connectstringtarget, LOG_DEBUG); + $res = imap_mail_move($connection, $imapemail, $targetdir, 0); + if ($res == false) { + $errorforemail++; + $this->error = imap_last_error(); + $this->errors[] = $this->error; + dol_syslog(imap_last_error()); + } + } + else + { + dol_syslog("EmailCollector::doCollectOneCollector message ".$imapemail." to ".$connectstringtarget." was set to read", LOG_DEBUG); + } + } + else + { + $errorforemail++; + } + + if (! $errorforemail) + { + $nbactiondone += $nbactiondoneforemail; + $nbemailok++; + + $this->db->commit(); + } + else + { + $error++; + + $this->db->rollback(); + } + + $nbemailprocessed++; + + unset($objectemail); + unset($projectstatic); + unset($thirdpartystatic); + unset($contactstatic); + } + + $output=$langs->trans('XEmailsDoneYActionsDone', $nbemailprocessed, $nbemailok, $nbactiondone); + } + else + { + $output=$langs->trans('NoNewEmailToProcess'); + } + + imap_expunge($connection); // To validate any move + + imap_close($connection); + + $this->datelastresult = $now; + $this->lastresult = $output; + + if (! empty($this->errors)) $this->lastresult.= " - ".join(" - ", $this->errors); + $this->codelastresult = ($error ? 'KO' : 'OK'); + $this->update($user); + + dol_syslog("EmailCollector::doCollectOneCollector end", LOG_DEBUG); + + return $error?-1:1; + } } From 2db0f84f29847afecc6ea2448602aacd425268b5 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Fri, 18 Jan 2019 20:06:33 +0100 Subject: [PATCH 32/40] NEW Pagination into list of time spent --- htdocs/projet/tasks/time.php | 135 ++++++++++++++++++++--------------- 1 file changed, 79 insertions(+), 56 deletions(-) diff --git a/htdocs/projet/tasks/time.php b/htdocs/projet/tasks/time.php index 4319a11eb03..e2b00923eef 100644 --- a/htdocs/projet/tasks/time.php +++ b/htdocs/projet/tasks/time.php @@ -576,7 +576,7 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) print ''."\n"; $title=$langs->trans("ListTaskTimeForTask"); - //print_barre_liste($title, 0, $_SERVER["PHP_SELF"], '', $sortfield, $sortorder, $linktotasks, $num, $totalnboflines, 'title_generic.png', 0, '', '', 0, 1); + //print_barre_liste($title, 0, $_SERVER["PHP_SELF"], '', $sortfield, $sortorder, $linktotasks, $num, $nbtotalofrecords, 'title_generic.png', 0, '', '', 0, 1); print load_fiche_titre($title, $linktocreatetime, 'title_generic.png'); /* @@ -703,6 +703,41 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) $massactionbutton=$form->selectMassAction('', $arrayofmassactions); } + $param=''; + if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.urlencode($contextpage); + if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.urlencode($limit); + if ($search_month > 0) $param.= '&search_month='.urlencode($search_month); + if ($search_year > 0) $param.= '&search_year='.urlencode($search_year); + if ($search_user > 0) $param.= '&search_user='.urlencode($search_user); + if ($search_task_ref != '') $param.= '&search_task_ref='.urlencode($search_task_ref); + if ($search_task_label != '') $param.= '&search_task_label='.urlencode($search_task_label); + if ($search_note != '') $param.= '&search_note='.urlencode($search_note); + if ($search_duration != '') $param.= '&search_field2='.urlencode($search_duration); + if ($optioncss != '') $param.='&optioncss='.urlencode($optioncss); + /* + // Add $param from extra fields + include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; + */ + if ($id) $param.='&id='.urlencode($id); + if ($projectid) $param.='&projectid='.urlencode($projectid); + if ($withproject) $param.='&withproject='.urlencode($withproject); + + print ''; + if ($optioncss != '') print ''; + print ''; + print ''; + if ($action == 'editline') print ''; + elseif ($action == 'splitline') print ''; + elseif ($action == 'createtime' && empty($id) && $user->rights->projet->lire) print ''; + else print ''; + print ''; + print ''; + print ''; + + print ''; + print ''; + print ''; + /* * List of time spent */ @@ -711,10 +746,11 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) $sql = "SELECT t.rowid, t.fk_task, t.task_date, t.task_datehour, t.task_date_withhour, t.task_duration, t.fk_user, t.note, t.thm,"; $sql .= " pt.ref, pt.label,"; $sql .= " u.lastname, u.firstname, u.login, u.photo, u.statut as user_status,"; - $sql .= " il.fk_facture as invoice_id, il.total_ht"; + $sql .= " il.fk_facture as invoice_id, inv.fk_statut"; $sql .= " FROM ".MAIN_DB_PREFIX."projet_task_time as t"; $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."facturedet as il ON il.rowid = t.invoice_line_id"; - $sql .= ", ".MAIN_DB_PREFIX."projet_task as pt, ".MAIN_DB_PREFIX."user as u"; + $sql .= " LEFT JOIN ".MAIN_DB_PREFIX."facture as inv ON inv.rowid = il.fk_facture,"; + $sql .= " ".MAIN_DB_PREFIX."projet_task as pt, ".MAIN_DB_PREFIX."user as u"; $sql .= " WHERE t.fk_user = u.rowid AND t.fk_task = pt.rowid"; if (empty($projectidforalltimes)) $sql .= " AND t.fk_task =".$object->id; else $sql.= " AND pt.fk_projet IN (".$projectidforalltimes.")"; @@ -738,23 +774,49 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) { $sql.= " AND t.task_datehour BETWEEN '".$db->idate(dol_get_first_day($search_year,1,false))."' AND '".$db->idate(dol_get_last_day($search_year,12,false))."'"; } - + //$sql .= ' GROUP BY t.rowid, t.fk_task, t.task_date, t.task_datehour, t.task_date_withhour, t.task_duration, t.fk_user, t.note, t.thm, pt.ref, pt.label, u.lastname, u.firstname, u.login, u.photo, u.statut, il.fk_facture'; $sql .= $db->order($sortfield, $sortorder); - $resql = $db->query($sql); - if ($resql) + // Count total nb of records + $nbtotalofrecords = ''; + if (empty($conf->global->MAIN_DISABLE_FULL_SCANLIST)) { - $num = $db->num_rows($resql); - $totalnboflines=$num; + $resql = $db->query($sql); + $nbtotalofrecords = $db->num_rows($resql); + if (($page * $limit) > $nbtotalofrecords) // if total of record found is smaller than page * limit, goto and load page 0 + { + $page = 0; + $offset = 0; + } + } + // if total of record found is smaller than limit, no need to do paging and to restart another select with limits set. + if (is_numeric($nbtotalofrecords) && $limit > $nbtotalofrecords) + { + $num = $nbtotalofrecords; + } + else + { + $sql.= $db->plimit($limit+1, $offset); + $resql=$db->query($sql); + if (! $resql) + { + dol_print_error($db); + exit; + } + + $num = $db->num_rows($resql); + } + + if ($num >= 0) + { if (! empty($projectidforalltimes)) { print ''."\n"; $title=$langs->trans("ListTaskTimeUserProject"); - //$linktotasks=''.$langs->trans("GoToListOfTasks").''; - //print_barre_liste($title, 0, $_SERVER["PHP_SELF"], '', $sortfield, $sortorder, $linktotasks, $num, $totalnboflines, 'title_generic.png', 0, '', '', 0, 1); - print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_generic', 0, $linktocreatetime, '', $limit); + + print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, $massactionbutton, $num, $nbtotalofrecords, 'title_generic', 0, $linktocreatetime, '', $limit); } $i = 0; @@ -771,18 +833,12 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) dol_print_error($db); } - /* * Form to add time spent */ if ($action == 'createtime' && empty($id) && $user->rights->projet->lire) { - print ''."\n"; - print ''; - print ''; - print ''; - print ''; - print ''; + print ''."\n"; print '
'.$langs->trans("SocialContribution").''.$langs->trans("DateDue").''.$langs->trans("DateDue").''.$langs->trans("Amount").''.$langs->trans("AlreadyPaid").''.$langs->trans("RemainderToPay").''; + print ''; @@ -842,11 +865,9 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) } - $arrayofselected=is_array($toselect)?$toselect:array(); - $param=''; - if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.$contextpage; - if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.$limit; + if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.urlencode($contextpage); + if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.urlencode($limit); if ($search_month > 0) $param.= '&search_month='.urlencode($search_month); if ($search_year > 0) $param.= '&search_year='.urlencode($search_year); if ($search_user > 0) $param.= '&search_user='.urlencode($search_user); @@ -864,15 +885,6 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) if ($withproject) $param.='&withproject='.urlencode($withproject); - $arrayofmassactions = array( - //'presend'=>$langs->trans("SendByMail"), - //'builddoc'=>$langs->trans("PDFMerge"), - ); - //if ($user->rights->projet->creer) $arrayofmassactions['predelete']=$langs->trans("Delete"); - if (in_array($massaction, array('presend','predelete'))) $arrayofmassactions=array(); - $massactionbutton=$form->selectMassAction('', $arrayofmassactions); - - print '
'; if ($optioncss != '') print ''; print ''; @@ -933,7 +945,8 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) // Value in main currency if (! empty($arrayfields['value']['checked'])) print '
'.$form->selectyesno('search_valuebilled', $search_valuebilled, 1, false, 1).''; // invoice_id and invoice_line_id + print ''; // invoice_id and invoice_line_id if (empty($conf->global->PROJECT_HIDE_TASKS) && ! empty($conf->global->PROJECT_BILL_TIME_SPENT)) { if ($projectstatic->bill_time) @@ -1186,6 +1199,14 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) print 'rowid.$param.'">'; print img_delete(); print ''; + + if ($massactionbutton || $massaction) // If we are in select mode (massactionbutton defined) or if we have already selected and sent an action ($massaction) defined + { + $selected=0; + if (in_array($task_time->rowid, $arrayofselected)) $selected=1; + print ' '; + print ''; + } } } print ''.convertSecondToTime($totalarray['totalduration'],'allhourmin').''.price($totalarray['totalvalue']).''.price($totalarray['totalvaluebilled']).''.price($totalarray['totalvaluebilled']).'
'; @@ -859,47 +915,11 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) print ''; print ''; - print '
'; + print ''; print '
'; } - - $param=''; - if (! empty($contextpage) && $contextpage != $_SERVER["PHP_SELF"]) $param.='&contextpage='.urlencode($contextpage); - if ($limit > 0 && $limit != $conf->liste_limit) $param.='&limit='.urlencode($limit); - if ($search_month > 0) $param.= '&search_month='.urlencode($search_month); - if ($search_year > 0) $param.= '&search_year='.urlencode($search_year); - if ($search_user > 0) $param.= '&search_user='.urlencode($search_user); - if ($search_task_ref != '') $param.= '&search_task_ref='.urlencode($search_task_ref); - if ($search_task_label != '') $param.= '&search_task_label='.urlencode($search_task_label); - if ($search_note != '') $param.= '&search_note='.urlencode($search_note); - if ($search_duration != '') $param.= '&search_field2='.urlencode($search_duration); - if ($optioncss != '') $param.='&optioncss='.urlencode($optioncss); - /* - // Add $param from extra fields - include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php'; - */ - if ($id) $param.='&id='.urlencode($id); - if ($projectid) $param.='&projectid='.urlencode($projectid); - if ($withproject) $param.='&withproject='.urlencode($withproject); - - - print '
'; - if ($optioncss != '') print ''; - print ''; - print ''; - if ($action == 'editline') print ''; - elseif ($action == 'splitline') print ''; - else print ''; - print ''; - print ''; - print ''; - - print ''; - print ''; - print ''; - $moreforfilter = ''; $parameters=array(); @@ -916,6 +936,7 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) $varpage=empty($contextpage)?$_SERVER["PHP_SELF"]:$contextpage; $selectedfields=$form->multiSelectArrayWithCheckbox('selectedfields', $arrayfields, $varpage); // This also change content of $arrayfields + $selectedfields.=(count($arrayofmassactions) ? $form->showCheckAddButtons('checkforselect', 1) : ''); print '
'; print ''."\n"; @@ -957,7 +978,7 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) print $hookmanager->resPrint; // Action column print ''; print ''."\n"; @@ -996,6 +1017,8 @@ if (($id > 0 || ! empty($ref)) || $projectidforalltimes > 0) $totalarray=array(); foreach ($tasks as $task_time) { + if ($i >= $limit) break; + print ''; $date1=$db->jdate($task_time->task_date); From 9f60c208ca1f7fc19da9ca4d03cdf748ee492107 Mon Sep 17 00:00:00 2001 From: wdammak <26695620+wdammak@users.noreply.github.com> Date: Fri, 18 Jan 2019 22:25:51 +0100 Subject: [PATCH 33/40] Update stats.class.php Fix div/0 warnings --- htdocs/core/class/stats.class.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/core/class/stats.class.php b/htdocs/core/class/stats.class.php index 1a58e14796a..90986e7b6da 100644 --- a/htdocs/core/class/stats.class.php +++ b/htdocs/core/class/stats.class.php @@ -384,16 +384,16 @@ abstract class Stats $row = $this->db->fetch_object($resql); $result[$i]['year'] = $row->year; $result[$i]['nb'] = $row->nb; - if($i>0 && $row->nb) $result[$i-1]['nb_diff'] = ($result[$i-1]['nb'] - $row->nb) / $row->nb * 100; + if($i>0 && $row->nb>0) $result[$i-1]['nb_diff'] = ($result[$i-1]['nb'] - $row->nb) / $row->nb * 100; $result[$i]['total'] = $row->total; - if($i>0 && $row->total) $result[$i-1]['total_diff'] = ($result[$i-1]['total'] - $row->total) / $row->total * 100; + if($i>0 && $row->total>0) $result[$i-1]['total_diff'] = ($result[$i-1]['total'] - $row->total) / $row->total * 100; $result[$i]['avg'] = $row->avg; - if($i>0 && $row->avg) $result[$i-1]['avg_diff'] = ($result[$i-1]['avg'] - $row->avg) / $row->avg * 100; + if($i>0 && $row->avg>0) $result[$i-1]['avg_diff'] = ($result[$i-1]['avg'] - $row->avg) / $row->avg * 100; // For some $sql only if (isset($row->weighted)) { $result[$i]['weighted'] = $row->weighted; - if($i>0 && $row->weighted) $result[$i-1]['avg_weighted'] = ($result[$i-1]['weighted'] - $row->weighted) / $row->weighted * 100; + if($i>0 && $row->weighted>0) $result[$i-1]['avg_weighted'] = ($result[$i-1]['weighted'] - $row->weighted) / $row->weighted * 100; } $i++; } From ff99927f658bc89b9d4605b1e6d43813c8c4a464 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Sat, 19 Jan 2019 11:18:07 +0100 Subject: [PATCH 34/40] FIX lang for dolistore in module.php --- htdocs/admin/dolistore/class/dolistore.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/dolistore/class/dolistore.class.php b/htdocs/admin/dolistore/class/dolistore.class.php index 859b9140f86..553ce2e54e0 100644 --- a/htdocs/admin/dolistore/class/dolistore.class.php +++ b/htdocs/admin/dolistore/class/dolistore.class.php @@ -65,7 +65,7 @@ class Dolistore $langtmp = explode('_', $langs->defaultlang); $lang = $langtmp[0]; - $lang_array = array('en'=>1, 'fr'=>2, 'es'=>3, 'it'=>4, 'de'=>5); // Into table ps_lang of Prestashop - 1 + $lang_array = array('en'=>0, 'fr'=>1, 'es'=>2, 'it'=>3, 'de'=>4); // Into table ps_lang of Prestashop - 1 if (! in_array($lang, array_keys($lang_array))) $lang = 'en'; $this->lang = $lang_array[$lang]; } From 13e7d18291a5723eebb56f2704f06215e0f6b784 Mon Sep 17 00:00:00 2001 From: wdammak <26695620+wdammak@users.noreply.github.com> Date: Fri, 18 Jan 2019 22:25:51 +0100 Subject: [PATCH 35/40] Update stats.class.php Fix div/0 warnings --- htdocs/core/class/stats.class.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/core/class/stats.class.php b/htdocs/core/class/stats.class.php index 1a58e14796a..90986e7b6da 100644 --- a/htdocs/core/class/stats.class.php +++ b/htdocs/core/class/stats.class.php @@ -384,16 +384,16 @@ abstract class Stats $row = $this->db->fetch_object($resql); $result[$i]['year'] = $row->year; $result[$i]['nb'] = $row->nb; - if($i>0 && $row->nb) $result[$i-1]['nb_diff'] = ($result[$i-1]['nb'] - $row->nb) / $row->nb * 100; + if($i>0 && $row->nb>0) $result[$i-1]['nb_diff'] = ($result[$i-1]['nb'] - $row->nb) / $row->nb * 100; $result[$i]['total'] = $row->total; - if($i>0 && $row->total) $result[$i-1]['total_diff'] = ($result[$i-1]['total'] - $row->total) / $row->total * 100; + if($i>0 && $row->total>0) $result[$i-1]['total_diff'] = ($result[$i-1]['total'] - $row->total) / $row->total * 100; $result[$i]['avg'] = $row->avg; - if($i>0 && $row->avg) $result[$i-1]['avg_diff'] = ($result[$i-1]['avg'] - $row->avg) / $row->avg * 100; + if($i>0 && $row->avg>0) $result[$i-1]['avg_diff'] = ($result[$i-1]['avg'] - $row->avg) / $row->avg * 100; // For some $sql only if (isset($row->weighted)) { $result[$i]['weighted'] = $row->weighted; - if($i>0 && $row->weighted) $result[$i-1]['avg_weighted'] = ($result[$i-1]['weighted'] - $row->weighted) / $row->weighted * 100; + if($i>0 && $row->weighted>0) $result[$i-1]['avg_weighted'] = ($result[$i-1]['weighted'] - $row->weighted) / $row->weighted * 100; } $i++; } From 191900d258997a15b52fe6dcb55dfe3f5b47b128 Mon Sep 17 00:00:00 2001 From: wdammak <26695620+wdammak@users.noreply.github.com> Date: Fri, 18 Jan 2019 22:25:51 +0100 Subject: [PATCH 36/40] Update stats.class.php Fix div/0 warnings --- htdocs/core/class/stats.class.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/core/class/stats.class.php b/htdocs/core/class/stats.class.php index dfb070aa5b9..1433085a36a 100644 --- a/htdocs/core/class/stats.class.php +++ b/htdocs/core/class/stats.class.php @@ -384,16 +384,16 @@ abstract class Stats $row = $this->db->fetch_object($resql); $result[$i]['year'] = $row->year; $result[$i]['nb'] = $row->nb; - if($i>0 && $row->nb) $result[$i-1]['nb_diff'] = ($result[$i-1]['nb'] - $row->nb) / $row->nb * 100; + if($i>0 && $row->nb>0) $result[$i-1]['nb_diff'] = ($result[$i-1]['nb'] - $row->nb) / $row->nb * 100; $result[$i]['total'] = $row->total; - if($i>0 && $row->total) $result[$i-1]['total_diff'] = ($result[$i-1]['total'] - $row->total) / $row->total * 100; + if($i>0 && $row->total>0) $result[$i-1]['total_diff'] = ($result[$i-1]['total'] - $row->total) / $row->total * 100; $result[$i]['avg'] = $row->avg; - if($i>0 && $row->avg) $result[$i-1]['avg_diff'] = ($result[$i-1]['avg'] - $row->avg) / $row->avg * 100; + if($i>0 && $row->avg>0) $result[$i-1]['avg_diff'] = ($result[$i-1]['avg'] - $row->avg) / $row->avg * 100; // For some $sql only if (isset($row->weighted)) { $result[$i]['weighted'] = $row->weighted; - if($i>0 && $row->weighted) $result[$i-1]['avg_weighted'] = ($result[$i-1]['weighted'] - $row->weighted) / $row->weighted * 100; + if($i>0 && $row->weighted>0) $result[$i-1]['avg_weighted'] = ($result[$i-1]['weighted'] - $row->weighted) / $row->weighted * 100; } $i++; } From aaa61254accee51bd28b6ed4aa2cc9a83e6585c3 Mon Sep 17 00:00:00 2001 From: wdammak <26695620+wdammak@users.noreply.github.com> Date: Fri, 18 Jan 2019 22:25:51 +0100 Subject: [PATCH 37/40] Update stats.class.php Fix div/0 warnings --- htdocs/core/class/stats.class.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htdocs/core/class/stats.class.php b/htdocs/core/class/stats.class.php index dfb070aa5b9..1433085a36a 100644 --- a/htdocs/core/class/stats.class.php +++ b/htdocs/core/class/stats.class.php @@ -384,16 +384,16 @@ abstract class Stats $row = $this->db->fetch_object($resql); $result[$i]['year'] = $row->year; $result[$i]['nb'] = $row->nb; - if($i>0 && $row->nb) $result[$i-1]['nb_diff'] = ($result[$i-1]['nb'] - $row->nb) / $row->nb * 100; + if($i>0 && $row->nb>0) $result[$i-1]['nb_diff'] = ($result[$i-1]['nb'] - $row->nb) / $row->nb * 100; $result[$i]['total'] = $row->total; - if($i>0 && $row->total) $result[$i-1]['total_diff'] = ($result[$i-1]['total'] - $row->total) / $row->total * 100; + if($i>0 && $row->total>0) $result[$i-1]['total_diff'] = ($result[$i-1]['total'] - $row->total) / $row->total * 100; $result[$i]['avg'] = $row->avg; - if($i>0 && $row->avg) $result[$i-1]['avg_diff'] = ($result[$i-1]['avg'] - $row->avg) / $row->avg * 100; + if($i>0 && $row->avg>0) $result[$i-1]['avg_diff'] = ($result[$i-1]['avg'] - $row->avg) / $row->avg * 100; // For some $sql only if (isset($row->weighted)) { $result[$i]['weighted'] = $row->weighted; - if($i>0 && $row->weighted) $result[$i-1]['avg_weighted'] = ($result[$i-1]['weighted'] - $row->weighted) / $row->weighted * 100; + if($i>0 && $row->weighted>0) $result[$i-1]['avg_weighted'] = ($result[$i-1]['weighted'] - $row->weighted) / $row->weighted * 100; } $i++; } From b3cbbc1b11e61d59469e08404ca5758f48db1d46 Mon Sep 17 00:00:00 2001 From: ptibogxiv Date: Sat, 19 Jan 2019 11:18:07 +0100 Subject: [PATCH 38/40] FIX lang for dolistore in module.php --- htdocs/admin/dolistore/class/dolistore.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htdocs/admin/dolistore/class/dolistore.class.php b/htdocs/admin/dolistore/class/dolistore.class.php index 859b9140f86..553ce2e54e0 100644 --- a/htdocs/admin/dolistore/class/dolistore.class.php +++ b/htdocs/admin/dolistore/class/dolistore.class.php @@ -65,7 +65,7 @@ class Dolistore $langtmp = explode('_', $langs->defaultlang); $lang = $langtmp[0]; - $lang_array = array('en'=>1, 'fr'=>2, 'es'=>3, 'it'=>4, 'de'=>5); // Into table ps_lang of Prestashop - 1 + $lang_array = array('en'=>0, 'fr'=>1, 'es'=>2, 'it'=>3, 'de'=>4); // Into table ps_lang of Prestashop - 1 if (! in_array($lang, array_keys($lang_array))) $lang = 'en'; $this->lang = $lang_array[$lang]; } From 2bbaae88d6d7e2635984ab6eb2a84c1d61984a3d Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 19 Jan 2019 12:46:38 +0100 Subject: [PATCH 39/40] Fix standardize 'createfromclone' param when cloning --- htdocs/accountancy/class/bookkeeping.class.php | 6 +++++- htdocs/asset/class/asset.class.php | 2 ++ htdocs/comm/action/class/actioncomm.class.php | 5 ++--- htdocs/comm/mailing/class/mailing.class.php | 4 +--- htdocs/comm/propal/class/propal.class.php | 3 +-- htdocs/commande/class/commande.class.php | 3 +-- htdocs/compta/bank/class/bankcateg.class.php | 3 +-- htdocs/compta/facture/class/facture.class.php | 5 +---- htdocs/compta/facture/class/paymentterm.class.php | 5 ++--- htdocs/compta/sociales/class/cchargesociales.class.php | 5 ++++- .../sociales/class/paymentsocialcontribution.class.php | 5 ++--- htdocs/contrat/class/contrat.class.php | 5 ++--- htdocs/core/actions_addupdatedelete.inc.php | 2 +- htdocs/core/class/ctyperesource.class.php | 5 ++++- htdocs/core/class/emailsenderprofile.class.php | 2 ++ htdocs/cron/class/cronjob.class.php | 6 ++---- htdocs/don/class/paymentdonation.class.php | 7 ++----- htdocs/ecm/class/ecmfiles.class.php | 3 +++ htdocs/emailcollector/class/emailcollector.class.php | 2 ++ htdocs/emailcollector/class/emailcollectoraction.class.php | 2 ++ htdocs/emailcollector/class/emailcollectorfilter.class.php | 2 ++ htdocs/expensereport/class/expensereport.class.php | 3 +-- htdocs/expensereport/class/paymentexpensereport.class.php | 7 ++----- htdocs/fichinter/class/fichinter.class.php | 3 +-- htdocs/fourn/class/fournisseur.commande.class.php | 3 +-- htdocs/fourn/class/fournisseur.commande.dispatch.class.php | 4 +++- htdocs/fourn/class/fournisseur.facture.class.php | 5 +---- htdocs/modulebuilder/template/class/myobject.class.php | 2 ++ htdocs/product/class/productbatch.class.php | 4 +--- htdocs/product/class/productcustomerprice.class.php | 4 ++-- htdocs/product/class/propalmergepdfproduct.class.php | 4 +++- htdocs/product/inventory/class/inventory.class.php | 2 ++ htdocs/product/stock/class/productlot.class.php | 3 +++ htdocs/product/stock/class/productstockentrepot.class.php | 3 +++ htdocs/societe/class/companypaymentmode.class.php | 2 ++ htdocs/societe/class/societeaccount.class.php | 2 ++ htdocs/supplier_proposal/class/supplier_proposal.class.php | 3 +++ htdocs/ticket/class/ticket.class.php | 3 +++ htdocs/website/class/website.class.php | 3 +++ htdocs/website/class/websitepage.class.php | 2 ++ 40 files changed, 84 insertions(+), 60 deletions(-) diff --git a/htdocs/accountancy/class/bookkeeping.class.php b/htdocs/accountancy/class/bookkeeping.class.php index 70934e01ed6..9db16a1ee75 100644 --- a/htdocs/accountancy/class/bookkeeping.class.php +++ b/htdocs/accountancy/class/bookkeeping.class.php @@ -1418,6 +1418,7 @@ class BookKeeping extends CommonObject dol_syslog(__METHOD__, LOG_DEBUG); global $user; + $error = 0; $object = new BookKeeping($this->db); @@ -1432,6 +1433,7 @@ class BookKeeping extends CommonObject // ... // Create clone + $object->context['createfromclone'] = 'createfromclone'; $result = $object->create($user); // Other options @@ -1441,6 +1443,8 @@ class BookKeeping extends CommonObject dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR); } + unset($object->context['createfromclone']); + // End if (! $error) { $this->db->commit(); @@ -1449,7 +1453,7 @@ class BookKeeping extends CommonObject } else { $this->db->rollback(); - return - 1; + return -1; } } diff --git a/htdocs/asset/class/asset.class.php b/htdocs/asset/class/asset.class.php index 22e24703bc3..335a9f6e9d1 100644 --- a/htdocs/asset/class/asset.class.php +++ b/htdocs/asset/class/asset.class.php @@ -238,6 +238,8 @@ class Asset extends CommonObject $this->errors = $object->errors; } + unset($object->context['createfromclone']); + // End if (!$error) { $this->db->commit(); diff --git a/htdocs/comm/action/class/actioncomm.class.php b/htdocs/comm/action/class/actioncomm.class.php index aef77513e7b..2d0ba61fff9 100644 --- a/htdocs/comm/action/class/actioncomm.class.php +++ b/htdocs/comm/action/class/actioncomm.class.php @@ -490,8 +490,6 @@ class ActionComm extends CommonObject { global $db, $user, $langs, $conf, $hookmanager; - $this->context['createfromclone']='createfromclone'; - $error=0; $now=dol_now(); @@ -524,7 +522,8 @@ class ActionComm extends CommonObject } // Create clone - $result=$this->create($fuser); + $this->context['createfromclone']='createfromclone'; + $result=$this->create($fuser); if ($result < 0) $error++; if (! $error) diff --git a/htdocs/comm/mailing/class/mailing.class.php b/htdocs/comm/mailing/class/mailing.class.php index 11708c3b4ca..b807ea23334 100644 --- a/htdocs/comm/mailing/class/mailing.class.php +++ b/htdocs/comm/mailing/class/mailing.class.php @@ -279,8 +279,6 @@ class Mailing extends CommonObject $object=new Mailing($this->db); - $object->context['createfromclone']='createfromclone'; - $this->db->begin(); // Load source object @@ -314,6 +312,7 @@ class Mailing extends CommonObject } // Create clone + $object->context['createfromclone']='createfromclone'; $result=$object->create($user); // Other options @@ -345,7 +344,6 @@ class Mailing extends CommonObject $sql.= " FROM ".MAIN_DB_PREFIX."mailing_cibles "; $sql.= " WHERE fk_mailing = ".$fromid; - dol_syslog(get_class($this)."::createFromClone", LOG_DEBUG); $result=$this->db->query($sql); if ($result) { diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 196d6f50451..2c5c2cfd5ce 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -1222,8 +1222,6 @@ class Propal extends CommonObject dol_include_once('/projet/class/project.class.php'); - $this->context['createfromclone']='createfromclone'; - $error=0; $now=dol_now(); @@ -1284,6 +1282,7 @@ class Propal extends CommonObject if (empty($conf->global->MAIN_KEEP_REF_CUSTOMER_ON_CLONING)) $clonedObj->ref_client = ''; // Create clone + $this->context['createfromclone']='createfromclone'; $result=$clonedObj->create($user); if ($result < 0) $error++; else diff --git a/htdocs/commande/class/commande.class.php b/htdocs/commande/class/commande.class.php index 5b3f8006345..d8aed383905 100644 --- a/htdocs/commande/class/commande.class.php +++ b/htdocs/commande/class/commande.class.php @@ -1066,8 +1066,6 @@ class Commande extends CommonOrder $error=0; - $this->context['createfromclone'] = 'createfromclone'; - $this->db->begin(); // get lines so they will be clone @@ -1108,6 +1106,7 @@ class Commande extends CommonOrder $this->ref_client = ''; // Create clone + $this->context['createfromclone'] = 'createfromclone'; $result=$this->create($user); if ($result < 0) $error++; diff --git a/htdocs/compta/bank/class/bankcateg.class.php b/htdocs/compta/bank/class/bankcateg.class.php index 9efdf3932ff..dc9c1d242e8 100644 --- a/htdocs/compta/bank/class/bankcateg.class.php +++ b/htdocs/compta/bank/class/bankcateg.class.php @@ -280,8 +280,6 @@ class BankCateg // extends CommonObject $object = new BankCateg($this->db); - $object->context['createfromclone'] = 'createfromclone'; - $this->db->begin(); // Load source object @@ -290,6 +288,7 @@ class BankCateg // extends CommonObject $object->statut = 0; // Create clone + $object->context['createfromclone'] = 'createfromclone'; $result = $object->create($user); // Other options diff --git a/htdocs/compta/facture/class/facture.class.php b/htdocs/compta/facture/class/facture.class.php index f980266226c..2fb31440e56 100644 --- a/htdocs/compta/facture/class/facture.class.php +++ b/htdocs/compta/facture/class/facture.class.php @@ -951,8 +951,6 @@ class Facture extends CommonInvoice $error=0; - $this->context['createfromclone'] = 'createfromclone'; - $this->db->begin(); // get extrafields so they will be clone @@ -962,8 +960,6 @@ class Facture extends CommonInvoice // Load source object $objFrom = clone $this; - - // Change socid if needed if (! empty($socid) && $socid != $this->socid) { @@ -1008,6 +1004,7 @@ class Facture extends CommonInvoice } // Create clone + $this->context['createfromclone'] = 'createfromclone'; $result=$this->create($user); if ($result < 0) $error++; else { diff --git a/htdocs/compta/facture/class/paymentterm.class.php b/htdocs/compta/facture/class/paymentterm.class.php index e7ea4779d10..55a3e40b55f 100644 --- a/htdocs/compta/facture/class/paymentterm.class.php +++ b/htdocs/compta/facture/class/paymentterm.class.php @@ -404,8 +404,6 @@ class PaymentTerm // extends CommonObject $object=new PaymentTerm($this->db); - $object->context['createfromclone'] = 'createfromclone'; - $this->db->begin(); // Load source object @@ -417,6 +415,7 @@ class PaymentTerm // extends CommonObject // ... // Create clone + $object->context['createfromclone'] = 'createfromclone'; $result=$object->create($user); // Other options @@ -430,7 +429,7 @@ class PaymentTerm // extends CommonObject //{ //} - unset($this->context['createfromclone']); + unset($object->context['createfromclone']); // End if (! $error) diff --git a/htdocs/compta/sociales/class/cchargesociales.class.php b/htdocs/compta/sociales/class/cchargesociales.class.php index 710bea7def2..9e13ffcd8a5 100644 --- a/htdocs/compta/sociales/class/cchargesociales.class.php +++ b/htdocs/compta/sociales/class/cchargesociales.class.php @@ -369,6 +369,7 @@ class Cchargesociales // ... // Create clone + $this->context['createfromclone'] = 'createfromclone'; $result = $object->create($user); // Other options @@ -378,6 +379,8 @@ class Cchargesociales dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR); } + unset($this->context['createfromclone']); + // End if (!$error) { $this->db->commit(); @@ -386,7 +389,7 @@ class Cchargesociales } else { $this->db->rollback(); - return - 1; + return -1; } } diff --git a/htdocs/compta/sociales/class/paymentsocialcontribution.class.php b/htdocs/compta/sociales/class/paymentsocialcontribution.class.php index d3c265150d4..74ddce68230 100644 --- a/htdocs/compta/sociales/class/paymentsocialcontribution.class.php +++ b/htdocs/compta/sociales/class/paymentsocialcontribution.class.php @@ -459,8 +459,6 @@ class PaymentSocialContribution extends CommonObject $object=new PaymentSocialContribution($this->db); - $object->context['createfromclone'] = 'createfromclone'; - $this->db->begin(); // Load source object @@ -472,6 +470,7 @@ class PaymentSocialContribution extends CommonObject // ... // Create clone + $object->context['createfromclone'] = 'createfromclone'; $result=$object->create($user); // Other options @@ -488,7 +487,7 @@ class PaymentSocialContribution extends CommonObject } - unset($this->context['createfromclone']); + unset($object->context['createfromclone']); // End if (! $error) diff --git a/htdocs/contrat/class/contrat.class.php b/htdocs/contrat/class/contrat.class.php index c543e8a0720..5929ec034d1 100644 --- a/htdocs/contrat/class/contrat.class.php +++ b/htdocs/contrat/class/contrat.class.php @@ -2388,8 +2388,6 @@ class Contrat extends CommonObject dol_include_once('/projet/class/project.class.php'); - $this->context['createfromclone'] = 'createfromclone'; - $error = 0; $this->fetch($this->id); @@ -2440,6 +2438,7 @@ class Contrat extends CommonObject } // Create clone + $clonedObj->context['createfromclone'] = 'createfromclone'; $result = $clonedObj->create($user); if ($result < 0) { $error ++; @@ -2479,7 +2478,7 @@ class Contrat extends CommonObject } } - unset($this->context['createfromclone']); + unset($clonedObj->context['createfromclone']); // End if (! $error) { diff --git a/htdocs/core/actions_addupdatedelete.inc.php b/htdocs/core/actions_addupdatedelete.inc.php index b8b4237cc93..63fc671d797 100644 --- a/htdocs/core/actions_addupdatedelete.inc.php +++ b/htdocs/core/actions_addupdatedelete.inc.php @@ -202,7 +202,7 @@ if ($action == 'confirm_clone' && $confirm == 'yes' && ! empty($permissiontoadd) { if ($object->id > 0) { - // Because createFromClone modifies the object, we must clone it so that we can restore it later + // Because createFromClone modifies the object, we must clone it so that we can restore it later if error $orig = clone $object; $result=$object->createFromClone($user, $object->id); diff --git a/htdocs/core/class/ctyperesource.class.php b/htdocs/core/class/ctyperesource.class.php index f4e74128747..95c642772e2 100644 --- a/htdocs/core/class/ctyperesource.class.php +++ b/htdocs/core/class/ctyperesource.class.php @@ -427,6 +427,7 @@ class Ctyperesource // ... // Create clone + $object->context['createfromclone'] = 'createfromclone'; $result = $object->create($user); // Other options @@ -436,6 +437,8 @@ class Ctyperesource dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR); } + unset($object->context['createfromclone']); + // End if (!$error) { $this->db->commit(); @@ -444,7 +447,7 @@ class Ctyperesource } else { $this->db->rollback(); - return - 1; + return -1; } } diff --git a/htdocs/core/class/emailsenderprofile.class.php b/htdocs/core/class/emailsenderprofile.class.php index b30f79f0bba..3a1fba460c4 100644 --- a/htdocs/core/class/emailsenderprofile.class.php +++ b/htdocs/core/class/emailsenderprofile.class.php @@ -207,6 +207,8 @@ class EmailSenderProfile extends CommonObject $this->errors = $object->errors; } + unset($object->context['createfromclone']); + // End if (!$error) { $this->db->commit(); diff --git a/htdocs/cron/class/cronjob.class.php b/htdocs/cron/class/cronjob.class.php index 6873bff157e..f619befab0d 100644 --- a/htdocs/cron/class/cronjob.class.php +++ b/htdocs/cron/class/cronjob.class.php @@ -757,8 +757,6 @@ class Cronjob extends CommonObject $object=new Cronjob($this->db); - $object->context['createfromclone'] = 'createfromclone'; - $this->db->begin(); // Load source object @@ -770,6 +768,7 @@ class Cronjob extends CommonObject // ... // Create clone + $object->context['createfromclone'] = 'createfromclone'; $result=$object->create($user); // Other options @@ -782,10 +781,9 @@ class Cronjob extends CommonObject //if (! $error) //{ - //} - unset($this->context['createfromclone']); + unset($object->context['createfromclone']); // End if (! $error) diff --git a/htdocs/don/class/paymentdonation.class.php b/htdocs/don/class/paymentdonation.class.php index b0e3a80b082..662b165ddf4 100644 --- a/htdocs/don/class/paymentdonation.class.php +++ b/htdocs/don/class/paymentdonation.class.php @@ -419,8 +419,6 @@ class PaymentDonation extends CommonObject $object=new PaymentDonation($this->db); - $object->context['createfromclone'] = 'createfromclone'; - $this->db->begin(); // Load source object @@ -432,6 +430,7 @@ class PaymentDonation extends CommonObject // ... // Create clone + $object->context['createfromclone'] = 'createfromclone'; $result=$object->create($user); // Other options @@ -444,11 +443,9 @@ class PaymentDonation extends CommonObject if (! $error) { - - } - unset($this->context['createfromclone']); + unset($object->context['createfromclone']); // End if (! $error) diff --git a/htdocs/ecm/class/ecmfiles.class.php b/htdocs/ecm/class/ecmfiles.class.php index 781833169dd..efc5af1310c 100644 --- a/htdocs/ecm/class/ecmfiles.class.php +++ b/htdocs/ecm/class/ecmfiles.class.php @@ -732,6 +732,7 @@ class EcmFiles extends CommonObject // ... // Create clone + $object->context['createfromclone'] = 'createfromclone'; $result = $object->create($user); // Other options @@ -741,6 +742,8 @@ class EcmFiles extends CommonObject dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR); } + unset($object->context['createfromclone']); + // End if (!$error) { $this->db->commit(); diff --git a/htdocs/emailcollector/class/emailcollector.class.php b/htdocs/emailcollector/class/emailcollector.class.php index c86b575855a..e00adfad724 100644 --- a/htdocs/emailcollector/class/emailcollector.class.php +++ b/htdocs/emailcollector/class/emailcollector.class.php @@ -274,6 +274,8 @@ class EmailCollector extends CommonObject $this->errors = $object->errors; } + unset($object->context['createfromclone']); + // End if (!$error) { $this->db->commit(); diff --git a/htdocs/emailcollector/class/emailcollectoraction.class.php b/htdocs/emailcollector/class/emailcollectoraction.class.php index 620795870a0..ccf811f7607 100644 --- a/htdocs/emailcollector/class/emailcollectoraction.class.php +++ b/htdocs/emailcollector/class/emailcollectoraction.class.php @@ -247,6 +247,8 @@ class EmailCollectorAction extends CommonObject $this->errors = $object->errors; } + unset($object->context['createfromclone']); + // End if (!$error) { $this->db->commit(); diff --git a/htdocs/emailcollector/class/emailcollectorfilter.class.php b/htdocs/emailcollector/class/emailcollectorfilter.class.php index ddf68ce9512..cafde3a820c 100644 --- a/htdocs/emailcollector/class/emailcollectorfilter.class.php +++ b/htdocs/emailcollector/class/emailcollectorfilter.class.php @@ -222,6 +222,8 @@ class EmailCollectorFilter extends CommonObject $this->errors = $object->errors; } + unset($object->context['createfromclone']); + // End if (!$error) { $this->db->commit(); diff --git a/htdocs/expensereport/class/expensereport.class.php b/htdocs/expensereport/class/expensereport.class.php index dc2516822e7..a8e5f80244c 100644 --- a/htdocs/expensereport/class/expensereport.class.php +++ b/htdocs/expensereport/class/expensereport.class.php @@ -315,8 +315,6 @@ class ExpenseReport extends CommonObject if (empty($fk_user_author)) $fk_user_author = $user->id; - $this->context['createfromclone'] = 'createfromclone'; - $this->db->begin(); // get extrafields so they will be clone @@ -339,6 +337,7 @@ class ExpenseReport extends CommonObject $this->date_validation = ''; // Create clone + $this->context['createfromclone'] = 'createfromclone'; $result=$this->create($user); if ($result < 0) $error++; diff --git a/htdocs/expensereport/class/paymentexpensereport.class.php b/htdocs/expensereport/class/paymentexpensereport.class.php index 605affed253..3055984e6c7 100644 --- a/htdocs/expensereport/class/paymentexpensereport.class.php +++ b/htdocs/expensereport/class/paymentexpensereport.class.php @@ -421,8 +421,6 @@ class PaymentExpenseReport extends CommonObject $object=new PaymentExpenseReport($this->db); - $object->context['createfromclone'] = 'createfromclone'; - $this->db->begin(); // Load source object @@ -434,6 +432,7 @@ class PaymentExpenseReport extends CommonObject // ... // Create clone + $object->context['createfromclone'] = 'createfromclone'; $result=$object->create($user); // Other options @@ -446,11 +445,9 @@ class PaymentExpenseReport extends CommonObject if (! $error) { - - } - unset($this->context['createfromclone']); + unset($object->context['createfromclone']); // End if (! $error) diff --git a/htdocs/fichinter/class/fichinter.class.php b/htdocs/fichinter/class/fichinter.class.php index 32643b77811..e20d8e1da1a 100644 --- a/htdocs/fichinter/class/fichinter.class.php +++ b/htdocs/fichinter/class/fichinter.class.php @@ -1118,8 +1118,6 @@ class Fichinter extends CommonObject $error=0; - $this->context['createfromclone'] = 'createfromclone'; - $this->db->begin(); // get extrafields so they will be clone @@ -1158,6 +1156,7 @@ class Fichinter extends CommonObject $this->ref_client = ''; // Create clone + $this->context['createfromclone'] = 'createfromclone'; $result=$this->create($user); if ($result < 0) $error++; diff --git a/htdocs/fourn/class/fournisseur.commande.class.php b/htdocs/fourn/class/fournisseur.commande.class.php index 9f17e9afdf2..38fa5b53699 100644 --- a/htdocs/fourn/class/fournisseur.commande.class.php +++ b/htdocs/fourn/class/fournisseur.commande.class.php @@ -1417,8 +1417,6 @@ class CommandeFournisseur extends CommonOrder $error=0; - $this->context['createfromclone'] = 'createfromclone'; - $this->db->begin(); // Load source object @@ -1439,6 +1437,7 @@ class CommandeFournisseur extends CommonOrder $this->date_approve2 = ''; // Create clone + $this->context['createfromclone'] = 'createfromclone'; $result=$this->create($user); if ($result < 0) $error++; diff --git a/htdocs/fourn/class/fournisseur.commande.dispatch.class.php b/htdocs/fourn/class/fournisseur.commande.dispatch.class.php index c7b5d00c797..c73c6d86d42 100644 --- a/htdocs/fourn/class/fournisseur.commande.dispatch.class.php +++ b/htdocs/fourn/class/fournisseur.commande.dispatch.class.php @@ -463,6 +463,7 @@ class CommandeFournisseurDispatch extends CommonObject // ... // Create clone + $object->context['createfromclone'] = 'createfromclone'; $result=$object->create($user); // Other options @@ -475,9 +476,10 @@ class CommandeFournisseurDispatch extends CommonObject if (! $error) { - } + unset($object->context['createfromclone']); + // End if (! $error) { diff --git a/htdocs/fourn/class/fournisseur.facture.class.php b/htdocs/fourn/class/fournisseur.facture.class.php index 28c20af9371..7fc0bba0bdf 100644 --- a/htdocs/fourn/class/fournisseur.facture.class.php +++ b/htdocs/fourn/class/fournisseur.facture.class.php @@ -2489,8 +2489,6 @@ class FactureFournisseur extends CommonInvoice $object=new FactureFournisseur($this->db); - $object->context['createfromclone'] = 'createfromclone'; - $this->db->begin(); // Load source object @@ -2521,6 +2519,7 @@ class FactureFournisseur extends CommonInvoice } // Create clone + $object->context['createfromclone'] = 'createfromclone'; $result=$object->create($user); // Other options @@ -2533,8 +2532,6 @@ class FactureFournisseur extends CommonInvoice if (! $error) { - - } unset($object->context['createfromclone']); diff --git a/htdocs/modulebuilder/template/class/myobject.class.php b/htdocs/modulebuilder/template/class/myobject.class.php index 6029fc7d3f9..e2f31319ca2 100644 --- a/htdocs/modulebuilder/template/class/myobject.class.php +++ b/htdocs/modulebuilder/template/class/myobject.class.php @@ -276,6 +276,8 @@ class MyObject extends CommonObject $this->errors = $object->errors; } + unset($object->context['createfromclone']); + // End if (!$error) { $this->db->commit(); diff --git a/htdocs/product/class/productbatch.class.php b/htdocs/product/class/productbatch.class.php index eb4fc32baed..d16c6ccc6ec 100644 --- a/htdocs/product/class/productbatch.class.php +++ b/htdocs/product/class/productbatch.class.php @@ -338,8 +338,6 @@ class Productbatch extends CommonObject $object=new Productbatch($this->db); - $object->context['createfromclone']='createfromclone'; - $this->db->begin(); // Load source object @@ -351,6 +349,7 @@ class Productbatch extends CommonObject // ... // Create clone + $object->context['createfromclone']='createfromclone'; $result=$object->create($user); // Other options @@ -363,7 +362,6 @@ class Productbatch extends CommonObject if (! $error) { - } unset($object->context['createfromclone']); diff --git a/htdocs/product/class/productcustomerprice.class.php b/htdocs/product/class/productcustomerprice.class.php index 3079fef5412..d39849780c1 100644 --- a/htdocs/product/class/productcustomerprice.class.php +++ b/htdocs/product/class/productcustomerprice.class.php @@ -907,8 +907,6 @@ class Productcustomerprice extends CommonObject $object = new Productcustomerprice($this->db); - $object->context['createfromclone']='createfromclone'; - $this->db->begin(); // Load source object @@ -920,6 +918,7 @@ class Productcustomerprice extends CommonObject // ... // Create clone + $object->context['createfromclone']='createfromclone'; $result = $object->create($user); // Other options @@ -929,6 +928,7 @@ class Productcustomerprice extends CommonObject } if (! $error) { + } unset($object->context['createfromclone']); diff --git a/htdocs/product/class/propalmergepdfproduct.class.php b/htdocs/product/class/propalmergepdfproduct.class.php index b5d2d639ae4..3aeae37249c 100644 --- a/htdocs/product/class/propalmergepdfproduct.class.php +++ b/htdocs/product/class/propalmergepdfproduct.class.php @@ -582,6 +582,7 @@ class Propalmergepdfproduct extends CommonObject // ... // Create clone + $object->context['createfromclone']='createfromclone'; $result=$object->create($user); // Other options @@ -594,9 +595,10 @@ class Propalmergepdfproduct extends CommonObject if (! $error) { - } + unset($object->context['createfromclone']); + // End if (! $error) { diff --git a/htdocs/product/inventory/class/inventory.class.php b/htdocs/product/inventory/class/inventory.class.php index 1bc98d32d93..076e3392bc0 100644 --- a/htdocs/product/inventory/class/inventory.class.php +++ b/htdocs/product/inventory/class/inventory.class.php @@ -247,6 +247,8 @@ class Inventory extends CommonObject $this->errors = $object->errors; } + unset($object->context['createfromclone']); + // End if (!$error) { $this->db->commit(); diff --git a/htdocs/product/stock/class/productlot.class.php b/htdocs/product/stock/class/productlot.class.php index d61630eb88e..60ce7bc02d2 100644 --- a/htdocs/product/stock/class/productlot.class.php +++ b/htdocs/product/stock/class/productlot.class.php @@ -454,6 +454,7 @@ class Productlot extends CommonObject // ... // Create clone + $object->context['createfromclone'] = 'createfromclone'; $result = $object->create($user); // Other options @@ -463,6 +464,8 @@ class Productlot extends CommonObject dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR); } + unset($object->context['createfromclone']); + // End if (!$error) { $this->db->commit(); diff --git a/htdocs/product/stock/class/productstockentrepot.class.php b/htdocs/product/stock/class/productstockentrepot.class.php index f76f5eeec9c..c5c66ad8d50 100644 --- a/htdocs/product/stock/class/productstockentrepot.class.php +++ b/htdocs/product/stock/class/productstockentrepot.class.php @@ -443,6 +443,7 @@ class ProductStockEntrepot extends CommonObject // ... // Create clone + $object->context['createfromclone'] = 'createfromclone'; $result = $object->create($user); // Other options @@ -452,6 +453,8 @@ class ProductStockEntrepot extends CommonObject dol_syslog(__METHOD__ . ' ' . implode(',', $this->errors), LOG_ERR); } + unset($object->context['createfromclone']); + // End if (!$error) { $this->db->commit(); diff --git a/htdocs/societe/class/companypaymentmode.class.php b/htdocs/societe/class/companypaymentmode.class.php index 73242c9aa32..3594773e7f8 100644 --- a/htdocs/societe/class/companypaymentmode.class.php +++ b/htdocs/societe/class/companypaymentmode.class.php @@ -269,6 +269,8 @@ class CompanyPaymentMode extends CommonObject $this->errors = $object->errors; } + unset($object->context['createfromclone']); + // End if (!$error) { $this->db->commit(); diff --git a/htdocs/societe/class/societeaccount.class.php b/htdocs/societe/class/societeaccount.class.php index 78f934ecf2f..153959938e5 100644 --- a/htdocs/societe/class/societeaccount.class.php +++ b/htdocs/societe/class/societeaccount.class.php @@ -240,6 +240,8 @@ class SocieteAccount extends CommonObject $this->errors = $object->errors; } + unset($object->context['createfromclone']); + // End if (!$error) { $this->db->commit(); diff --git a/htdocs/supplier_proposal/class/supplier_proposal.class.php b/htdocs/supplier_proposal/class/supplier_proposal.class.php index 82b8b09220d..5d4fbed5e72 100644 --- a/htdocs/supplier_proposal/class/supplier_proposal.class.php +++ b/htdocs/supplier_proposal/class/supplier_proposal.class.php @@ -1176,6 +1176,7 @@ class SupplierProposal extends CommonObject $this->ref = $modSupplierProposal->getNextValue($objsoc,$this); // Create clone + $this->context['createfromclone'] = 'createfromclone'; $result=$this->create($user); if ($result < 0) $error++; @@ -1191,6 +1192,8 @@ class SupplierProposal extends CommonObject } } + unset($this->context['createfromclone']); + // End if (! $error) { diff --git a/htdocs/ticket/class/ticket.class.php b/htdocs/ticket/class/ticket.class.php index d26206e2b5c..43002f30f99 100644 --- a/htdocs/ticket/class/ticket.class.php +++ b/htdocs/ticket/class/ticket.class.php @@ -966,6 +966,7 @@ class Ticket extends CommonObject // Clear fields // ... // Create clone + $object->context['createfromclone'] = 'createfromclone'; $result = $object->create($user); // Other options @@ -977,6 +978,8 @@ class Ticket extends CommonObject if (!$error) { } + unset($object->context['createfromclone']); + // End if (!$error) { $this->db->commit(); diff --git a/htdocs/website/class/website.class.php b/htdocs/website/class/website.class.php index 7fd906044f6..fd2aaad8621 100644 --- a/htdocs/website/class/website.class.php +++ b/htdocs/website/class/website.class.php @@ -598,6 +598,7 @@ class Website extends CommonObject // Create new file $objectpagenew = $objectpageold->createFromClone($user, $pageid, $objectpageold->pageurl, '', 0, $object->id, 1); + //print $pageid.' = '.$objectpageold->pageurl.' -> '.$objectpagenew->id.' = '.$objectpagenew->pageurl.'
'; if (is_object($objectpagenew) && $objectpagenew->pageurl) { @@ -646,6 +647,8 @@ class Website extends CommonObject } } + unset($object->context['createfromclone']); + // End if (!$error) { $this->db->commit(); diff --git a/htdocs/website/class/websitepage.class.php b/htdocs/website/class/websitepage.class.php index 3c166c1d1f8..ffa2176f142 100644 --- a/htdocs/website/class/websitepage.class.php +++ b/htdocs/website/class/websitepage.class.php @@ -447,6 +447,8 @@ class WebsitePage extends CommonObject dol_syslog(__METHOD__ . ' ' . join(',', $this->errors), LOG_ERR); } + unset($object->context['createfromclone']); + // End if (!$error) { $this->db->commit(); From 55c90b05783b3d4add4c811345c996c23a67ca01 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 19 Jan 2019 13:17:07 +0100 Subject: [PATCH 40/40] Fix #10359 cloning of proposal --- htdocs/comm/propal/class/propal.class.php | 69 +++++++++++++---------- htdocs/website/class/website.class.php | 3 +- 2 files changed, 39 insertions(+), 33 deletions(-) diff --git a/htdocs/comm/propal/class/propal.class.php b/htdocs/comm/propal/class/propal.class.php index 2c5c2cfd5ce..511fb2087ec 100644 --- a/htdocs/comm/propal/class/propal.class.php +++ b/htdocs/comm/propal/class/propal.class.php @@ -1225,26 +1225,27 @@ class Propal extends CommonObject $error=0; $now=dol_now(); + dol_syslog(__METHOD__, LOG_DEBUG); + + $object = new self($this->db); + $this->db->begin(); - // get extrafields so they will be clone - foreach($this->lines as $line) - $line->fetch_optionals(); - - // Load dest object - $clonedObj = clone $this; + // Load source object + $object->fetch($this->id); + $object->fetch_lines(); $objsoc=new Societe($this->db); // Change socid if needed - if (! empty($socid) && $socid != $clonedObj->socid) + if (! empty($socid) && $socid != $object->socid) { if ($objsoc->fetch($socid) > 0) { - $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_delivery_address = ''; + $object->socid = $objsoc->id; + $object->cond_reglement_id = (! empty($objsoc->cond_reglement_id) ? $objsoc->cond_reglement_id : 0); + $object->mode_reglement_id = (! empty($objsoc->mode_reglement_id) ? $objsoc->mode_reglement_id : 0); + $object->fk_delivery_address = ''; /*if (!empty($conf->projet->enabled)) { @@ -1256,45 +1257,51 @@ class Propal extends CommonObject $clonedObj->fk_project = ''; } }*/ - $clonedObj->fk_project = ''; // A cloned proposal is set by default to no project. + $object->fk_project = ''; // A cloned proposal is set by default to no project. } // reset ref_client - $clonedObj->ref_client = ''; + $object->ref_client = ''; // TODO Change product price if multi-prices } else { - $objsoc->fetch($clonedObj->socid); + $objsoc->fetch($object->socid); } - $clonedObj->id=0; - $clonedObj->ref=''; - $clonedObj->statut=self::STATUS_DRAFT; + $object->id=0; + $object->ref=''; + $object->statut=self::STATUS_DRAFT; // Clear fields - $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 = ''; + $object->user_author = $user->id; + $object->user_valid = ''; + $object->date = $now; + $object->datep = $now; // deprecated + $object->fin_validite = $object->date + ($object->duree_validite * 24 * 3600); + if (empty($conf->global->MAIN_KEEP_REF_CUSTOMER_ON_CLONING)) $object->ref_client = ''; // Create clone - $this->context['createfromclone']='createfromclone'; - $result=$clonedObj->create($user); + $object->context['createfromclone']='createfromclone'; + $result=$object->create($user); if ($result < 0) $error++; - else + + if (! $error) { // copy internal contacts - if ($clonedObj->copy_linked_contact($this, 'internal') < 0) + if ($object->copy_linked_contact($this, 'internal') < 0) + { $error++; + } + } + if (! $error) + { // copy external contacts if same company - elseif ($this->socid == $clonedObj->socid) + if ($this->socid == $object->socid) { - if ($clonedObj->copy_linked_contact($this, 'external') < 0) + if ($object->copy_linked_contact($this, 'external') < 0) $error++; } } @@ -1311,13 +1318,13 @@ class Propal extends CommonObject } } - unset($this->context['createfromclone']); + unset($object->context['createfromclone']); // End if (! $error) { $this->db->commit(); - return $clonedObj->id; + return $object->id; } else { diff --git a/htdocs/website/class/website.class.php b/htdocs/website/class/website.class.php index fd2aaad8621..aa22971c7ff 100644 --- a/htdocs/website/class/website.class.php +++ b/htdocs/website/class/website.class.php @@ -593,7 +593,6 @@ class Website extends CommonObject { // Delete old file $filetplold=$pathofwebsitenew.'/page'.$pageid.'.tpl.php'; - dol_syslog("We regenerate alias page new name=".$filealias.", old name=".$fileoldalias); dol_delete_file($filetplold); // Create new file @@ -633,7 +632,7 @@ class Website extends CommonObject if (! $res > 0) { $error++; - setEventMessages($objectpage->error, $objectpage->errors, 'errors'); + setEventMessages($object->error, $object->errors, 'errors'); } if (! $error)
'; - $searchpicto=$form->showFilterAndCheckAddButtons($massactionbutton?1:0, 'checkforselect', 1); + $searchpicto=$form->showFilterButtons(); print $searchpicto; print '