From 961d475a9d72655b780169f3183cce269128f226 Mon Sep 17 00:00:00 2001 From: Laurent Destailleur Date: Sat, 16 Sep 2017 03:13:44 +0200 Subject: [PATCH] More complete substitution system. Add __CONTRACT_NEXT_EXPIRATION_DATE__ and __CONTRACT_NEXT_EXPIRATION_DATETIME__ --- htdocs/contrat/card.php | 16 ++++-- htdocs/core/actions_massactions.inc.php | 38 +++++-------- htdocs/core/actions_sendmails.inc.php | 36 +++++++------ htdocs/core/class/html.formmail.class.php | 58 ++++++++++---------- htdocs/core/lib/functions.lib.php | 65 +++++++++++++++++------ htdocs/societe/card.php | 9 ++-- 6 files changed, 131 insertions(+), 91 deletions(-) diff --git a/htdocs/contrat/card.php b/htdocs/contrat/card.php index 7af70e10337..0e8722d20b8 100644 --- a/htdocs/contrat/card.php +++ b/htdocs/contrat/card.php @@ -2241,9 +2241,19 @@ else $formmail->withbody = 1; $formmail->withdeliveryreceipt = 1; $formmail->withcancel = 1; - // Tableau des substitutions + // Array of substitutions + $formmail->withsubstit='AvailableVariables'; $formmail->setSubstitFromObject($object); - $formmail->substit ['__CONTRACTREF__'] = $object->ref; + $datenextexpiration=''; + foreach($object->lines as $line) + { + if ($line->statut != 4) continue; + if ($line->date_fin_prevue > $datenextexpiration) $datenextexpiration = $line->date_fin_prevue; + } + $formmail->substit['__CONTRACT_NEXT_EXPIRATION_DATE__'] = dol_print_date($datenextexpiration, 'dayrfc'); + $formmail->substit['__CONTRACT_NEXT_EXPIRATION_DATETIME__'] = dol_print_date($datenextexpiration, 'standard'); + $formmail->substit['__PERSONALIZED__']=''; + $formmail->substit['__CONTACTCIVNAME__']=''; $custcontact = ''; $contactarr = array(); @@ -2255,7 +2265,7 @@ else { if ($contact['libelle'] == $langs->trans('TypeContact_contract_external_CUSTOMER')) { // TODO Use code and not label $contactstatic = new Contact($db); - $contactstatic->fetch($contact ['id']); + $contactstatic->fetch($contact['id']); $custcontact = $contactstatic->getFullName($langs, 1); } } diff --git a/htdocs/core/actions_massactions.inc.php b/htdocs/core/actions_massactions.inc.php index 6750aa5de38..26b5cbe3460 100644 --- a/htdocs/core/actions_massactions.inc.php +++ b/htdocs/core/actions_massactions.inc.php @@ -275,28 +275,18 @@ if (! $error && $massaction == 'confirm_presend') if ($objectclass == 'CommandeFournisseur') $sendtocc = (empty($conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_ORDER_TO)?'':$conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_ORDER_TO); if ($objectclass == 'FactureFournisseur') $sendtocc = (empty($conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_INVOICE_TO)?'':$conf->global->MAIN_MAIL_AUTOCOPY_SUPPLIER_INVOICE_TO); + $objecttmp=new $objectclass($db); + $objecttmp->thirdparty = $thirdparty; - $substitutionarray=array( - '__DOL_MAIN_URL_ROOT__'=>DOL_MAIN_URL_ROOT, - '__ID__' => join(', ',array_keys($listofqualifiedid)), - '__EMAIL__' => $thirdparty->email, - '__CHECK_READ__' => '', - '__FACREF__' => join(', ',$listofqualifiedref), // For backward compatibility - '__ORDERREF__' => join(', ',$listofqualifiedref), // For backward compatibility - '__PROPREF__' => join(', ',$listofqualifiedref), // For backward compatibility - '__REF__' => join(', ',$listofqualifiedref), - '__REFCLIENT__' => $thirdparty->name, - '__SIGNATURE__' => (($user->signature && empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN))?dol_string_nohtmltag($user->signature):'') - /* not available on all object - /'__FIRSTNAME__'=>(is_object($object)?$object->firstname:''), - '__LASTNAME__'=>(is_object($object)?$object->lastname:''), - '__FULLNAME__'=>(is_object($object)?$object->getFullName($langs):''), - '__ADDRESS__'=>(is_object($object)?$object->address:''), - '__ZIP__'=>(is_object($object)?$object->zip:''), - '__TOWN_'=>(is_object($object)?$object->town:''), - '__COUNTRY__'=>(is_object($object)?$object->country:''), - */ - ); + // Make substitution in email content + $substitutionarray=getCommonSubstitutionArray($langs, 0, null, $objecttmp); + $substitutionarray['__ID__'] = join(', ',array_keys($listofqualifiedid)); + $substitutionarray['__EMAIL__'] = $thirdparty->email; + $substitutionarray['__CHECK_READ__'] = ''; + $substitutionarray['__REF__'] = join(', ',$listofqualifiedref); + + $parameters=array('mode'=>'formemail'); + complete_substitutions_array($substitutionarray, $langs, $objecttmp, $parameters); $subject=make_substitutions($subject, $substitutionarray); $message=make_substitutions($message, $substitutionarray); @@ -458,15 +448,15 @@ if (! $error && $massaction == "builddoc" && $permtoread && ! GETPOST('button_se $outputlangs->setDefaultLang($newlang); } - if (!empty($conf->global->USE_PDFTK_FOR_PDF_CONCAT)) + if (!empty($conf->global->USE_PDFTK_FOR_PDF_CONCAT)) { // Create output dir if not exists dol_mkdir($diroutputmassaction); - + // Defined name of merged file $filename=strtolower(dol_sanitizeFileName($langs->transnoentities($objectlabel))); $filename=preg_replace('/\s/','_',$filename); - + // Save merged file if ($filter=='paye:0') { diff --git a/htdocs/core/actions_sendmails.inc.php b/htdocs/core/actions_sendmails.inc.php index a1cd0eb39ec..4986a093bac 100644 --- a/htdocs/core/actions_sendmails.inc.php +++ b/htdocs/core/actions_sendmails.inc.php @@ -344,23 +344,25 @@ if (($action == 'send' || $action == 'relance') && ! $_POST['addfile'] && ! $_PO } } - $substitutionarray=array( - '__DOL_MAIN_URL_ROOT__'=>DOL_MAIN_URL_ROOT, - '__ID__' => (is_object($object)?$object->id:''), - '__EMAIL__' => $sendto, - '__CHECK_READ__' => (is_object($object) && is_object($object->thirdparty))?'':'', - '__REF__' => (is_object($object)?$object->ref:''), - '__SIGNATURE__' => (($user->signature && empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN))?dol_string_nohtmltag($user->signature):'') - /* not available on all object - /'__FIRSTNAME__'=>(is_object($object)?$object->firstname:''), - '__LASTNAME__'=>(is_object($object)?$object->lastname:''), - '__FULLNAME__'=>(is_object($object)?$object->getFullName($langs):''), - '__ADDRESS__'=>(is_object($object)?$object->address:''), - '__ZIP__'=>(is_object($object)?$object->zip:''), - '__TOWN_'=>(is_object($object)?$object->town:''), - '__COUNTRY__'=>(is_object($object)?$object->country:''), - */ - ); + // Make substitution in email content + $substitutionarray=getCommonSubstitutionArray($langs, 0, null, $object); + $substitutionarray['__EMAIL__'] = $sendto; + $substitutionarray['__CHECK_READ__'] = (is_object($object) && is_object($object->thirdparty))?'':''; + // Add specific substitution for contracts + if (is_object($object) && $object->element == 'contrat' && is_array($object->lines)) + { + $datenextexpiration=''; + foreach($object->lines as $line) + { + if ($line->statut != 4) continue; + if ($line->date_fin_prevue > $datenextexpiration) $datenextexpiration = $line->date_fin_prevue; + } + $substitutionarray['__CONTRACT_NEXT_EXPIRATION_DATE__'] = dol_print_date($datenextexpiration, 'dayrfc'); + $substitutionarray['__CONTRACT_NEXT_EXPIRATION_DATETIME__'] = dol_print_date($datenextexpiration, 'standard'); + } + + $parameters=array('mode'=>'formemail'); + complete_substitutions_array($substitutionarray, $langs, $object, $parameters); $subject=make_substitutions($subject, $substitutionarray); $message=make_substitutions($message, $substitutionarray); diff --git a/htdocs/core/class/html.formmail.class.php b/htdocs/core/class/html.formmail.class.php index 9079f98ad3b..9bfe00e6575 100644 --- a/htdocs/core/class/html.formmail.class.php +++ b/htdocs/core/class/html.formmail.class.php @@ -359,13 +359,14 @@ class FormMail extends Form // Substitution array if (! empty($this->withsubstit)) { - $out.= ''; + $out.= ''; $help=""; foreach($this->substit as $key => $val) { - $help.=$key.' -> '.$langs->trans($val).'
'; + $help.=$key.' -> '.$langs->trans(dol_string_nohtmltag($val)).'
'; } - $out.= $form->textwithpicto($langs->trans("EMailTestSubstitutionReplacedByGenericValues"), $help); + if (is_numeric($this->withsubstit)) $out.= $form->textwithpicto($langs->trans("EMailTestSubstitutionReplacedByGenericValues"), $help, 1, 'help', '', 0, 2, 'substittooltip'); // Old usage + else $out.= $form->textwithpicto($langs->trans($this->withsubstit), $help, 1, 'help', '', 0, 2, 'substittooltip'); // New usage $out.= "\n"; } @@ -997,17 +998,19 @@ class FormMail extends Form /** - * Set substit array from object + * Set substit array from object. This is call when suggesting the email template into forms to send email. + * TODO Replace with getCommonSubstitutionArray with param onlykey = 2 * - * @param CommonObject $object Object to use - * @param Translate $outputlangs Object lang + * @param CommonObject $object Object to use + * @param Translate $outputlangs Object lang * @return void + * @see getCommonSubstitutionArray */ function setSubstitFromObject($object, $outputlangs=null) { global $conf, $user; $this->substit['__REF__'] = $object->ref; - $this->substit['__REFCLIENT__'] = isset($object->ref_client) ? $object->ref_client : ''; + $this->substit['__REFCLIENT__'] = isset($object->ref_client) ? $object->ref_client : (isset($object->ref_customer) ? $object->ref_customer : ''); $this->substit['__REFSUPPLIER__'] = isset($object->ref_supplier) ? $object->ref_supplier : ''; $this->substit['__DATE_YMD__'] = isset($object->date) ? dol_print_date($object->date, 'day', 0, $outputlangs) : ''; @@ -1027,7 +1030,7 @@ class FormMail extends Form $this->substit['__PERSONALIZED__'] = ''; $this->substit['__CONTACTCIVNAME__'] = ''; // Will be replace just before sending - // Create dinamic tags for __EXTRAFIELD_FIELD__ + // Create dynamic tags for __EXTRAFIELD_FIELD__ $extrafields = new ExtraFields($this->db); $extralabels = $extrafields->fetch_name_optionals_label($object->table_element, true); $object->fetch_optionals($object->id, $extralabels); @@ -1035,7 +1038,7 @@ class FormMail extends Form $this->substit['__EXTRAFIELD_' . strtoupper($key) . '__'] = $object->array_options['options_' . $key]; } - //Fill substit_lines with each object lines content + // Fill substit_lines with each object lines content if (is_array($object->lines)) { foreach ($object->lines as $line) @@ -1073,13 +1076,14 @@ class FormMail extends Form } /** - * Get list of substition keys available for emails. - * This include the complete_substitutions_array. TODO Include the getCommonSubstitutionArray(). + * Get list of substitution keys available for emails. + * This include the complete_substitutions_array. * * @param string $mode 'formemail', 'formemailwithlines', 'formemailforlines', 'emailing', ... + * @param Object $object Object if applicable * @return array Array of substitution values for emails. */ - static function getAvailableSubstitKey($mode='formemail') + static function getAvailableSubstitKey($mode='formemail', $object=null) { global $conf, $langs; @@ -1088,20 +1092,20 @@ class FormMail extends Form if ($mode == 'formemail' || $mode == 'formemailwithlines' || $mode == 'formemailforlines') { $vars=array( - '__REF__', - '__REFCLIENT__', - '__REFSUPPLIER__', - '__THIRDPARTY_ID__', - '__THIRDPARTY_NAME__', - '__PROJECT_ID__', - '__PROJECT_REF__', - '__PROJECT_NAME__', - '__CONTACTCIVNAME__', - '__AMOUNT__', - '__AMOUNT_WO_TAX__', - '__AMOUNT_VAT__', - '__PERSONALIZED__', // Paypal link will be added here in form mode - '__SIGNATURE__', + '__REF__'=>'__REF__', + '__REFCLIENT__'=>'__REFCLIENT__', + '__REFSUPPLIER__'=>'__REFSUPPLIER__', + '__THIRDPARTY_ID__'=>'__THIRDPARTY_ID__', + '__THIRDPARTY_NAME__'=>'__THIRDPARTY_NAME__', + '__PROJECT_ID__'=>'__PROJECT_ID__', + '__PROJECT_REF__'=>'__PROJECT_REF__', + '__PROJECT_NAME__'=>'__PROJECT_NAME__', + '__CONTACTCIVNAME__'=>'__CONTACTCIVNAME__', + '__AMOUNT__'=>'__AMOUNT__', + '__AMOUNT_WO_TAX__'=>'__AMOUNT_WO_TAX__', + '__AMOUNT_VAT__'=>'__AMOUNT_VAT__', + '__PERSONALIZED__'=>'__PERSONALIZED__', // Paypal link will be added here in form mode + '__SIGNATURE__'=>'__SIGNATURE__', ); if ($mode == 'formwithlines') { @@ -1179,7 +1183,7 @@ class FormMail extends Form } $parameters=array('mode'=>$mode); - $tmparray=getCommonSubstitutionArray($langs); + $tmparray=getCommonSubstitutionArray($langs, 0, null, $object); complete_substitutions_array($tmparray, $langs, null, $parameters); foreach($tmparray as $key => $val) { diff --git a/htdocs/core/lib/functions.lib.php b/htdocs/core/lib/functions.lib.php index b712e5059b3..79d982371b7 100644 --- a/htdocs/core/lib/functions.lib.php +++ b/htdocs/core/lib/functions.lib.php @@ -5186,25 +5186,32 @@ function dol_concatdesc($text1,$text2,$forxml=false) /** - * Return array of possible common substitutions. + * Return array of possible common substitutions. This includes several families like: 'system', 'mycompany', 'object', 'objectamount', 'date', 'user' * * @param Translate $outputlangs Output language - * @param int $onlykey Do not calculate heavy values of keys (performance enhancement when we need only the keys) - * @param array $exclude Array of family keys we want to exclude. For example array('mycompany', 'objectamount', 'date', 'user', ...) + * @param int $onlykey 1=Do not calculate some heavy values of keys (performance enhancement when we need only the keys), 2=Values are trunc and html sanitized (to use for help tooltip) + * @param array $exclude Array of family keys we want to exclude. For example array('system', 'mycompany', 'object', 'objectamount', 'date', 'user', ...) * @param Object $object Object for keys on object * @return array Array of substitutions + * @see setSubstitFromObject */ function getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $object=null) { - global $conf, $mysoc, $user; + global $db, $conf, $mysoc, $user; $substitutionarray=array(); + if (empty($exclude) || ! in_array('system', $exclude)) + { + $substitutionarray=array_merge($substitutionarray, array( + '__DOL_MAIN_URL_ROOT__'=>DOL_MAIN_URL_ROOT + )); + } if (empty($exclude) || ! in_array('mycompany', $exclude)) { $substitutionarray=array_merge($substitutionarray, array( - '__MYCOMPANY_NAME__' => $mysoc->name, - '__MYCOMPANY_EMAIL__' => $mysoc->email, + '__MYCOMPANY_NAME__' => $mysoc->name, + '__MYCOMPANY_EMAIL__' => $mysoc->email, '__MYCOMPANY_PROFID1__' => $mysoc->idprof1, '__MYCOMPANY_PROFID2__' => $mysoc->idprof2, '__MYCOMPANY_PROFID3__' => $mysoc->idprof3, @@ -5215,17 +5222,42 @@ function getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $ob '__MYCOMPANY_COUNTRY_ID__' => $mysoc->country_id )); } + if (is_object($object) && (empty($exclude) || ! in_array('object', $exclude))) + { + $substitutionarray['__ID__'] = $object->id; + $substitutionarray['__REF__'] = $object->ref; + $substitutionarray['__REFCLIENT__'] = (isset($object->ref_client) ? $object->ref_client : (isset($object->ref_customer) ? $object->ref_customer : '')); + $substitutionarray['__REFSUPPLIER__'] = (isset($object->ref_supplier) ? $object->ref_supplier : ''); + + $substitutionarray['__THIRDPARTY_ID__'] = (is_object($object->thirdparty)?$object->thirdparty->id:''); + $substitutionarray['__THIRDPARTY_NAME__'] = (is_object($object->thirdparty)?$object->thirdparty->name:''); + + $substitutionarray['__PROJECT_ID__'] = (is_object($object->projet)?$object->projet->id:''); + $substitutionarray['__PROJECT_REF__'] = (is_object($object->projet)?$object->projet->ref:''); + $substitutionarray['__PROJECT_NAME__'] = (is_object($object->projet)?$object->projet->title:''); + + // Create dynamic tags for __EXTRAFIELD_FIELD__ + if ($object->table_element && $object->id > 0) + { + $extrafieldstmp = new ExtraFields($db); + $extralabels = $extrafieldstmp->fetch_name_optionals_label($object->table_element, true); + $object->fetch_optionals($object->id, $extralabels); + foreach ($extrafieldstmp->attribute_label as $key => $label) { + $substitutionarray['__EXTRAFIELD_' . strtoupper($key) . '__'] = $object->array_options['options_' . $key]; + } + } + } if (empty($exclude) || ! in_array('objectamount', $exclude)) { - if (is_object($object)) // For backward compatibility - { - $substitutionarray['__TOTAL_TTC__'] =is_object($object)?$object->total_ttc:''; - $substitutionarray['__TOTAL_HT__'] =is_object($object)?$object->total_ht:''; - $substitutionarray['__TOTAL_VAT__'] =is_object($object)?($object->total_vat?$object->total_vat:$object->total_tva):''; - } - $substitutionarray['__AMOUNT__'] =is_object($object)?$object->total_ttc:''; - $substitutionarray['__AMOUNT_WO_TAX__']=is_object($object)?$object->total_ht:''; - $substitutionarray['__AMOUNT_VAT__'] =is_object($object)?($object->total_vat?$object->total_vat:$object->total_tva):''; + $substitutionarray['__DATE_YMD__'] = is_object($object)?(isset($object->date) ? dol_print_date($object->date, 'day', 0, $outputlangs) : '') : ''; + $substitutionarray['__DATE_DUE_YMD__'] = is_object($object)?(isset($object->date_lim_reglement)? dol_print_date($object->date_lim_reglement, 'day', 0, $outputlangs) : '') : ''; + $substitutionarray['__AMOUNT__'] = is_object($object)?$object->total_ttc:''; + $substitutionarray['__AMOUNT_WO_TAX__']= is_object($object)?$object->total_ht:''; + $substitutionarray['__AMOUNT_VAT__'] = is_object($object)?($object->total_vat?$object->total_vat:$object->total_tva):''; + // For backward compatibility + $substitutionarray['__TOTAL_TTC__'] = is_object($object)?$object->total_ttc:''; + $substitutionarray['__TOTAL_HT__'] = is_object($object)?$object->total_ht:''; + $substitutionarray['__TOTAL_VAT__'] = is_object($object)?($object->total_vat?$object->total_vat:$object->total_tva):''; } if (empty($exclude) || ! in_array('date', $exclude)) @@ -5265,7 +5297,8 @@ function getCommonSubstitutionArray($outputlangs, $onlykey=0, $exclude=null, $ob '__USER_LASTNAME__' => $user->lastname, '__USER_FIRSTNAME__' => $user->firstname, '__USER_FULLNAME__' => $user->getFullName($outputlangs), - '__USER_SUPERVISOR_ID__' => $user->fk_user + '__USER_SUPERVISOR_ID__' => $user->fk_user, + '__SIGNATURE__' => (($user->signature && empty($conf->global->MAIN_MAIL_DO_NOT_USE_SIGN)) ? ($onlykey == 2 ? dol_trunc(dol_string_nohtmltag($user->signature), 30) : $user->signature) : '') )); } if (! empty($conf->multicompany->enabled)) diff --git a/htdocs/societe/card.php b/htdocs/societe/card.php index 45101a79d45..7b4bae14a14 100644 --- a/htdocs/societe/card.php +++ b/htdocs/societe/card.php @@ -2484,10 +2484,11 @@ else $formmail->withbody=1; $formmail->withdeliveryreceipt=1; $formmail->withcancel=1; - // Tableau des substitutions - //$formmail->setSubstitFromObject($object); - $formmail->substit['__THIRDPARTY_NAME__']=$object->name; - $formmail->substit['__SIGNATURE__']=$user->signature; + // Array of substitutions + $formmail->withsubstit='AvailableVariables'; + $formmail->setSubstitFromObject($object); + $formmail->substit['__THIRDPARTY_ID__']=$object->id; // substit in setSubstitFromObject was wrong for this one + $formmail->substit['__THIRDPARTY_NAME__']=$object->name; // substit in setSubstitFromObject was wrong for this one $formmail->substit['__PERSONALIZED__']=''; $formmail->substit['__CONTACTCIVNAME__']='';