Merge branch 'develop' of github.com:Dolibarr/dolibarr into NEW_Availibility_dictionary_field
This commit is contained in:
commit
771fa0b6ed
@ -22,10 +22,11 @@ For developers:
|
|||||||
|
|
||||||
NEW:
|
NEW:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Following changes may create regressions for some external modules, but were necessary to make Dolibarr better:
|
Following changes may create regressions for some external modules, but were necessary to make Dolibarr better:
|
||||||
* verifCond('stringtoevaluate') now return false when string contains a bad syntax content instead of true.
|
* verifCond('stringtoevaluate') now return false when string contains a bad syntax content instead of true.
|
||||||
|
* The deprecated mdethod thirdparty_doc_create() has been removed. You can use the generateDocument() instead.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -332,8 +332,8 @@ foreach ($TCurrency as &$currency) {
|
|||||||
print '<input type="hidden" name="fk_multicurrency" value="'.$currency->id.'">';
|
print '<input type="hidden" name="fk_multicurrency" value="'.$currency->id.'">';
|
||||||
print '1 '.$conf->currency.' = ';
|
print '1 '.$conf->currency.' = ';
|
||||||
print '<input type="text" name="rate" class="width75 right" value="'.($currency->rate->rate ? $currency->rate->rate : '').'" size="13"> '.$currency->code.' ';
|
print '<input type="text" name="rate" class="width75 right" value="'.($currency->rate->rate ? $currency->rate->rate : '').'" size="13"> '.$currency->code.' ';
|
||||||
print '<input type="submit" name="updatecurrency" class="button button-edit" value="'.$langs->trans("Modify").'"> ';
|
print '<input type="submit" name="updatecurrency" class="button button-edit smallpaddingimp" value="'.$langs->trans("Modify").'"> ';
|
||||||
print '<input type="submit" name="deletecurrency" class="button" value="'.$langs->trans("Delete").'">';
|
print '<input type="submit" name="deletecurrency" class="button smallpaddingimp" value="'.$langs->trans("Delete").'">';
|
||||||
print '</form>';
|
print '</form>';
|
||||||
print '</td></tr>';
|
print '</td></tr>';
|
||||||
}
|
}
|
||||||
|
|||||||
@ -203,6 +203,12 @@ if ($action == 'setvarother') {
|
|||||||
if (!($res > 0)) {
|
if (!($res > 0)) {
|
||||||
$error++;
|
$error++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$param_auto_notify_close = GETPOST('TICKET_NOTIFY_AT_CLOSING', 'alpha');
|
||||||
|
$res = dolibarr_set_const($db, 'TICKET_NOTIFY_AT_CLOSING', $param_auto_notify_close, 'chaine', 0, '', $conf->entity);
|
||||||
|
if (!($res > 0)) {
|
||||||
|
$error++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -530,6 +536,21 @@ print $form->textwithpicto('', $langs->trans("TicketsAutoAssignTicketHelp"), 1,
|
|||||||
print '</td>';
|
print '</td>';
|
||||||
print '</tr>';
|
print '</tr>';
|
||||||
|
|
||||||
|
// Auto notify contacts when closing the ticket
|
||||||
|
print '<tr class="oddeven"><td>'.$langs->trans("TicketsAutoNotifyClose").'</td>';
|
||||||
|
print '<td class="left">';
|
||||||
|
if ($conf->use_javascript_ajax) {
|
||||||
|
print ajax_constantonoff('TICKET_NOTIFY_AT_CLOSING');
|
||||||
|
} else {
|
||||||
|
$arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
|
||||||
|
print $form->selectarray("TICKET_NOTIFY_AT_CLOSING", $arrval, $conf->global->TICKET_NOTIFY_AT_CLOSING);
|
||||||
|
}
|
||||||
|
print '</td>';
|
||||||
|
print '<td class="center">';
|
||||||
|
print $form->textwithpicto('', $langs->trans("TicketsAutoNotifyCloseHelp"), 1, 'help');
|
||||||
|
print '</td>';
|
||||||
|
print '</tr>';
|
||||||
|
|
||||||
if (!$conf->use_javascript_ajax) {
|
if (!$conf->use_javascript_ajax) {
|
||||||
print '</form>';
|
print '</form>';
|
||||||
}
|
}
|
||||||
|
|||||||
@ -327,33 +327,6 @@ if (!empty($conf->global->TICKET_ENABLE_PUBLIC_INTERFACE)) {
|
|||||||
print $form->textwithpicto('', $langs->trans("TicketPublicInterfaceTextHelpMessageHelpAdmin"), 1, 'help');
|
print $form->textwithpicto('', $langs->trans("TicketPublicInterfaceTextHelpMessageHelpAdmin"), 1, 'help');
|
||||||
print '</td></tr>';
|
print '</td></tr>';
|
||||||
|
|
||||||
// Activate email creation to user
|
|
||||||
print '<tr class="pair"><td>'.$langs->trans("TicketsDisableCustomerEmail").'</td>';
|
|
||||||
print '<td class="left">';
|
|
||||||
if ($conf->use_javascript_ajax) {
|
|
||||||
print ajax_constantonoff('TICKET_DISABLE_CUSTOMER_MAILS');
|
|
||||||
} else {
|
|
||||||
$arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
|
|
||||||
print $form->selectarray("TICKET_DISABLE_CUSTOMER_MAILS", $arrval, $conf->global->TICKET_DISABLE_CUSTOMER_MAILS);
|
|
||||||
}
|
|
||||||
print '</td>';
|
|
||||||
print '<td class="center">';
|
|
||||||
print $form->textwithpicto('', $langs->trans("TicketsDisableEmailHelp"), 1, 'help');
|
|
||||||
print '</td>';
|
|
||||||
print '</tr>';
|
|
||||||
|
|
||||||
// Texte de création d'un ticket
|
|
||||||
$mail_mesg_new = $conf->global->TICKET_MESSAGE_MAIL_NEW ? $conf->global->TICKET_MESSAGE_MAIL_NEW : $langs->trans('TicketNewEmailBody');
|
|
||||||
print '<tr><td>'.$langs->trans("TicketNewEmailBodyLabel").'</label>';
|
|
||||||
print '</td><td>';
|
|
||||||
require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
|
|
||||||
$doleditor = new DolEditor('TICKET_MESSAGE_MAIL_NEW', $mail_mesg_new, '100%', 120, 'dolibarr_mailings', '', false, true, $conf->global->FCKEDITOR_ENABLE_MAIL, ROWS_2, 70);
|
|
||||||
$doleditor->Create();
|
|
||||||
print '</td>';
|
|
||||||
print '<td class="center">';
|
|
||||||
print $form->textwithpicto('', $langs->trans("TicketNewEmailBodyHelp"), 1, 'help');
|
|
||||||
print '</td></tr>';
|
|
||||||
|
|
||||||
// Url public interface
|
// Url public interface
|
||||||
$url_interface = $conf->global->TICKET_URL_PUBLIC_INTERFACE;
|
$url_interface = $conf->global->TICKET_URL_PUBLIC_INTERFACE;
|
||||||
print '<tr><td>'.$langs->trans("TicketUrlPublicInterfaceLabelAdmin").'</label>';
|
print '<tr><td>'.$langs->trans("TicketUrlPublicInterfaceLabelAdmin").'</label>';
|
||||||
@ -364,8 +337,45 @@ if (!empty($conf->global->TICKET_ENABLE_PUBLIC_INTERFACE)) {
|
|||||||
print $form->textwithpicto('', $langs->trans("TicketUrlPublicInterfaceHelpAdmin"), 1, 'help');
|
print $form->textwithpicto('', $langs->trans("TicketUrlPublicInterfaceHelpAdmin"), 1, 'help');
|
||||||
print '</td></tr>';
|
print '</td></tr>';
|
||||||
|
|
||||||
|
print '</table>';
|
||||||
|
|
||||||
|
print '<br><br>';
|
||||||
|
|
||||||
|
print_fiche_titre($langs->trans("Emails"));
|
||||||
|
|
||||||
|
print '<div class="div-table-responsive-no-min">';
|
||||||
|
print '<table class="noborder centpercent">';
|
||||||
|
|
||||||
|
// Activate email creation to user
|
||||||
|
print '<tr class="pair"><td>';
|
||||||
|
print $form->textwithpicto($langs->trans("TicketsDisableCustomerEmail"), $langs->trans("TicketsDisableEmailHelp"), 1, 'help');
|
||||||
|
print '</td>';
|
||||||
|
print '<td class="left">';
|
||||||
|
if ($conf->use_javascript_ajax) {
|
||||||
|
print ajax_constantonoff('TICKET_DISABLE_CUSTOMER_MAILS');
|
||||||
|
} else {
|
||||||
|
$arrval = array('0' => $langs->trans("No"), '1' => $langs->trans("Yes"));
|
||||||
|
print $form->selectarray("TICKET_DISABLE_CUSTOMER_MAILS", $arrval, $conf->global->TICKET_DISABLE_CUSTOMER_MAILS);
|
||||||
|
}
|
||||||
|
print '</td>';
|
||||||
|
print '</tr>';
|
||||||
|
|
||||||
|
// Text of email after creatio of a ticket
|
||||||
|
$mail_mesg_new = $conf->global->TICKET_MESSAGE_MAIL_NEW ? $conf->global->TICKET_MESSAGE_MAIL_NEW : $langs->trans('TicketNewEmailBody');
|
||||||
|
print '<tr><td>';
|
||||||
|
print $form->textwithpicto($langs->trans("TicketNewEmailBodyLabel"), $langs->trans("TicketNewEmailBodyHelp"), 1, 'help');
|
||||||
|
print '</label>';
|
||||||
|
print '</td><td>';
|
||||||
|
require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
|
||||||
|
$doleditor = new DolEditor('TICKET_MESSAGE_MAIL_NEW', $mail_mesg_new, '100%', 120, 'dolibarr_mailings', '', false, true, $conf->global->FCKEDITOR_ENABLE_MAIL, ROWS_2, 70);
|
||||||
|
$doleditor->Create();
|
||||||
|
print '</td>';
|
||||||
|
print '</tr>';
|
||||||
|
|
||||||
// Activate email notification when a new message is added
|
// Activate email notification when a new message is added
|
||||||
print '<tr class="pair"><td>'.$langs->trans("TicketsPublicNotificationNewMessage").'</td>';
|
print '<tr class="pair"><td>';
|
||||||
|
print $form->textwithpicto($langs->trans("TicketsPublicNotificationNewMessage"), $langs->trans("TicketsPublicNotificationNewMessageHelp"), 1, 'help');
|
||||||
|
print '</td>';
|
||||||
print '<td class="left">';
|
print '<td class="left">';
|
||||||
if ($conf->use_javascript_ajax) {
|
if ($conf->use_javascript_ajax) {
|
||||||
print ajax_constantonoff('TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_ENABLED');
|
print ajax_constantonoff('TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_ENABLED');
|
||||||
@ -374,19 +384,15 @@ if (!empty($conf->global->TICKET_ENABLE_PUBLIC_INTERFACE)) {
|
|||||||
print $form->selectarray("TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_ENABLED", $arrval, $conf->global->TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_ENABLED);
|
print $form->selectarray("TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_ENABLED", $arrval, $conf->global->TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_ENABLED);
|
||||||
}
|
}
|
||||||
print '</td>';
|
print '</td>';
|
||||||
print '<td align="center">';
|
|
||||||
print $form->textwithpicto('', $langs->trans("TicketsPublicNotificationNewMessageHelp"), 1, 'help');
|
|
||||||
print '</td>';
|
|
||||||
print '</tr>';
|
print '</tr>';
|
||||||
|
|
||||||
// Send notification when a new message is added to a email if a user is not assigned to the ticket
|
// Send notification when a new message is added to a email if a user is not assigned to the ticket
|
||||||
print '<tr><td>'.$langs->trans("TicketPublicNotificationNewMessageDefaultEmail").'</label>';
|
print '<tr><td>';
|
||||||
|
print $form->textwithpicto($langs->trans("TicketPublicNotificationNewMessageDefaultEmail"), $langs->trans("TicketPublicNotificationNewMessageDefaultEmailHelp"), 1, 'help');
|
||||||
print '</td><td>';
|
print '</td><td>';
|
||||||
print '<input type="text" name="TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_DEFAULT_EMAIL" value="'.$conf->global->TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_DEFAULT_EMAIL.'" size="40" ></td>';
|
print '<input type="text" name="TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_DEFAULT_EMAIL" value="'.$conf->global->TICKET_PUBLIC_NOTIFICATION_NEW_MESSAGE_DEFAULT_EMAIL.'" size="40" ></td>';
|
||||||
print '</td>';
|
print '</td>';
|
||||||
print '<td align="center">';
|
print '</tr>';
|
||||||
print $form->textwithpicto('', $langs->trans("TicketPublicNotificationNewMessageDefaultEmailHelp"), 1, 'help');
|
|
||||||
print '</td></tr>';
|
|
||||||
|
|
||||||
print '</table>';
|
print '</table>';
|
||||||
print '</div>';
|
print '</div>';
|
||||||
|
|||||||
@ -1369,7 +1369,7 @@ if (empty($reshook)) {
|
|||||||
include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php';
|
include DOL_DOCUMENT_ROOT.'/core/actions_printing.inc.php';
|
||||||
|
|
||||||
// Actions to build doc
|
// Actions to build doc
|
||||||
$upload_dir = !empty($conf->propal->multidir_output[$object->entity])?$conf->propal->multidir_output[$object->entity]:$conf->propal->dir_output;
|
$upload_dir = !empty($conf->commande->multidir_output[$object->entity])?$conf->commande->multidir_output[$object->entity]:$conf->commande->dir_output;
|
||||||
$permissiontoadd = $usercancreate;
|
$permissiontoadd = $usercancreate;
|
||||||
include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
|
include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
|
||||||
|
|
||||||
|
|||||||
@ -3666,9 +3666,10 @@ class Commande extends CommonOrder
|
|||||||
* @param int $notooltip 1=Disable tooltip
|
* @param int $notooltip 1=Disable tooltip
|
||||||
* @param int $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking
|
* @param int $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking
|
||||||
* @param int $addlinktonotes Add link to notes
|
* @param int $addlinktonotes Add link to notes
|
||||||
|
* @param string $target attribute target for link
|
||||||
* @return string String with URL
|
* @return string String with URL
|
||||||
*/
|
*/
|
||||||
public function getNomUrl($withpicto = 0, $option = '', $max = 0, $short = 0, $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0)
|
public function getNomUrl($withpicto = 0, $option = '', $max = 0, $short = 0, $notooltip = 0, $save_lastsearch_value = -1, $addlinktonotes = 0, $target = '')
|
||||||
{
|
{
|
||||||
global $conf, $langs, $user, $hookmanager;
|
global $conf, $langs, $user, $hookmanager;
|
||||||
|
|
||||||
@ -3737,6 +3738,11 @@ class Commande extends CommonOrder
|
|||||||
}
|
}
|
||||||
$linkclose .= ' title="'.dol_escape_htmltag($label, 1).'"';
|
$linkclose .= ' title="'.dol_escape_htmltag($label, 1).'"';
|
||||||
$linkclose .= ' class="classfortooltip"';
|
$linkclose .= ' class="classfortooltip"';
|
||||||
|
|
||||||
|
$target_value=array('_self', '_blank', '_parent', '_top');
|
||||||
|
if (in_array($target, $target_value)) {
|
||||||
|
$linkclose .= ' target="'.dol_escape_htmltag($target).'"';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$linkstart = '<a href="'.$url.'"';
|
$linkstart = '<a href="'.$url.'"';
|
||||||
|
|||||||
@ -83,7 +83,7 @@ if ($action == 'add_payment' || ($action == 'confirm_paiement' && $confirm == 'y
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($amounts[key($amounts)] <= 0) {
|
if (empty($amounts[key($amounts)])) {
|
||||||
$error++;
|
$error++;
|
||||||
setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Amount")), null, 'errors');
|
setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Amount")), null, 'errors');
|
||||||
$action = 'create';
|
$action = 'create';
|
||||||
|
|||||||
@ -165,7 +165,7 @@ class Conf
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Load setup values into conf object (read llx_const) for a specified entity
|
* Load setup values into conf object (read llx_const) for a specified entity
|
||||||
* Note that this->db->xxx, this->file->xxx and this->multicompany have been already loaded when setValues is called.
|
* Note that this->db->xxx, this->file->xxx and this->multicompany have been already loaded when setEntityValues is called.
|
||||||
*
|
*
|
||||||
* @param DoliDB $db Database handler
|
* @param DoliDB $db Database handler
|
||||||
* @param int $entity Entity to get
|
* @param int $entity Entity to get
|
||||||
|
|||||||
@ -791,7 +791,7 @@ class Form
|
|||||||
|
|
||||||
// Warning: if you set submit button to disabled, post using 'Enter' will no more work if there is no another input submit. So we add a hidden button
|
// Warning: if you set submit button to disabled, post using 'Enter' will no more work if there is no another input submit. So we add a hidden button
|
||||||
$ret .= '<input type="submit" name="confirmmassactioninvisible" style="display: none" tabindex="-1">'; // Hidden button BEFORE so it is the one used when we submit with ENTER.
|
$ret .= '<input type="submit" name="confirmmassactioninvisible" style="display: none" tabindex="-1">'; // Hidden button BEFORE so it is the one used when we submit with ENTER.
|
||||||
$ret .= '<input type="submit" disabled name="confirmmassaction"'.(empty($conf->use_javascript_ajax) ? '' : ' style="display: none"').' class="button small'.(empty($conf->use_javascript_ajax) ? '' : ' hideobject').' '.$name.' '.$name.'confirmed" value="'.dol_escape_htmltag($langs->trans("Confirm")).'">';
|
$ret .= '<input type="submit" disabled name="confirmmassaction"'.(empty($conf->use_javascript_ajax) ? '' : ' style="display: none"').' class="button smallpaddingimp'.(empty($conf->use_javascript_ajax) ? '' : ' hideobject').' '.$name.' '.$name.'confirmed" value="'.dol_escape_htmltag($langs->trans("Confirm")).'">';
|
||||||
$ret .= '</div>';
|
$ret .= '</div>';
|
||||||
|
|
||||||
if (!empty($conf->use_javascript_ajax)) {
|
if (!empty($conf->use_javascript_ajax)) {
|
||||||
@ -5202,6 +5202,7 @@ class Form
|
|||||||
$out .= '<input type="submit" class="button smallpaddingimp" value="'.$langs->trans("Modify").'">';
|
$out .= '<input type="submit" class="button smallpaddingimp" value="'.$langs->trans("Modify").'">';
|
||||||
$out .= '</form>';
|
$out .= '</form>';
|
||||||
} else {
|
} else {
|
||||||
|
$out .= '<span class="project_head_block">';
|
||||||
if ($selected) {
|
if ($selected) {
|
||||||
$projet = new Project($this->db);
|
$projet = new Project($this->db);
|
||||||
$projet->fetch($selected);
|
$projet->fetch($selected);
|
||||||
@ -5209,6 +5210,7 @@ class Form
|
|||||||
} else {
|
} else {
|
||||||
$out .= " ";
|
$out .= " ";
|
||||||
}
|
}
|
||||||
|
$out .= '</span>';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (empty($nooutput)) {
|
if (empty($nooutput)) {
|
||||||
|
|||||||
@ -1250,7 +1250,7 @@ class FormMail extends Form
|
|||||||
* Return templates of email with type = $type_template or type = 'all'.
|
* Return templates of email with type = $type_template or type = 'all'.
|
||||||
* This search into table c_email_templates. Used by the get_form function.
|
* This search into table c_email_templates. Used by the get_form function.
|
||||||
*
|
*
|
||||||
* @param DoliDB $db Database handler
|
* @param DoliDB $dbs Database handler
|
||||||
* @param string $type_template Get message for model/type=$type_template, type='all' also included.
|
* @param string $type_template Get message for model/type=$type_template, type='all' also included.
|
||||||
* @param User $user Get template public or limited to this user
|
* @param User $user Get template public or limited to this user
|
||||||
* @param Translate $outputlangs Output lang object
|
* @param Translate $outputlangs Output lang object
|
||||||
@ -1259,7 +1259,7 @@ class FormMail extends Form
|
|||||||
* @param string $label Label of template
|
* @param string $label Label of template
|
||||||
* @return ModelMail|integer One instance of ModelMail or -1 if error
|
* @return ModelMail|integer One instance of ModelMail or -1 if error
|
||||||
*/
|
*/
|
||||||
public function getEMailTemplate($db, $type_template, $user, $outputlangs, $id = 0, $active = 1, $label = '')
|
public function getEMailTemplate($dbs, $type_template, $user, $outputlangs, $id = 0, $active = 1, $label = '')
|
||||||
{
|
{
|
||||||
global $conf, $langs;
|
global $conf, $langs;
|
||||||
|
|
||||||
@ -1279,18 +1279,18 @@ class FormMail extends Form
|
|||||||
}
|
}
|
||||||
|
|
||||||
$sql = "SELECT rowid, module, label, type_template, topic, joinfiles, content, content_lines, lang";
|
$sql = "SELECT rowid, module, label, type_template, topic, joinfiles, content, content_lines, lang";
|
||||||
$sql .= " FROM ".$db->prefix().'c_email_templates';
|
$sql .= " FROM ".$dbs->prefix().'c_email_templates';
|
||||||
$sql .= " WHERE (type_template='".$db->escape($type_template)."' OR type_template='all')";
|
$sql .= " WHERE (type_template='".$dbs->escape($type_template)."' OR type_template='all')";
|
||||||
$sql .= " AND entity IN (".getEntity('c_email_templates').")";
|
$sql .= " AND entity IN (".getEntity('c_email_templates').")";
|
||||||
$sql .= " AND (private = 0 OR fk_user = ".((int) $user->id).")"; // Get all public or private owned
|
$sql .= " AND (private = 0 OR fk_user = ".((int) $user->id).")"; // Get all public or private owned
|
||||||
if ($active >= 0) {
|
if ($active >= 0) {
|
||||||
$sql .= " AND active = ".((int) $active);
|
$sql .= " AND active = ".((int) $active);
|
||||||
}
|
}
|
||||||
if ($label) {
|
if ($label) {
|
||||||
$sql .= " AND label = '".$db->escape($label)."'";
|
$sql .= " AND label = '".$dbs->escape($label)."'";
|
||||||
}
|
}
|
||||||
if (!($id > 0) && $languagetosearch) {
|
if (!($id > 0) && $languagetosearch) {
|
||||||
$sql .= " AND (lang = '".$db->escape($languagetosearch)."'".($languagetosearchmain ? " OR lang = '".$db->escape($languagetosearchmain)."'" : "")." OR lang IS NULL OR lang = '')";
|
$sql .= " AND (lang = '".$dbs->escape($languagetosearch)."'".($languagetosearchmain ? " OR lang = '".$dbs->escape($languagetosearchmain)."'" : "")." OR lang IS NULL OR lang = '')";
|
||||||
}
|
}
|
||||||
if ($id > 0) {
|
if ($id > 0) {
|
||||||
$sql .= " AND rowid=".(int) $id;
|
$sql .= " AND rowid=".(int) $id;
|
||||||
@ -1299,22 +1299,22 @@ class FormMail extends Form
|
|||||||
$sql .= " AND position=0";
|
$sql .= " AND position=0";
|
||||||
}
|
}
|
||||||
if ($languagetosearch) {
|
if ($languagetosearch) {
|
||||||
$sql .= $db->order("position,lang,label", "ASC,DESC,ASC"); // We want line with lang set first, then with lang null or ''
|
$sql .= $dbs->order("position,lang,label", "ASC,DESC,ASC"); // We want line with lang set first, then with lang null or ''
|
||||||
} else {
|
} else {
|
||||||
$sql .= $db->order("position,lang,label", "ASC,ASC,ASC"); // If no language provided, we give priority to lang not defined
|
$sql .= $dbs->order("position,lang,label", "ASC,ASC,ASC"); // If no language provided, we give priority to lang not defined
|
||||||
}
|
}
|
||||||
//$sql .= $db->plimit(1);
|
//$sql .= $dbs->plimit(1);
|
||||||
//print $sql;
|
//print $sql;
|
||||||
|
|
||||||
$resql = $db->query($sql);
|
$resql = $dbs->query($sql);
|
||||||
if (!$resql) {
|
if (!$resql) {
|
||||||
dol_print_error($db);
|
dol_print_error($dbs);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get first found
|
// Get first found
|
||||||
while (1) {
|
while (1) {
|
||||||
$obj = $db->fetch_object($resql);
|
$obj = $dbs->fetch_object($resql);
|
||||||
|
|
||||||
if ($obj) {
|
if ($obj) {
|
||||||
// If template is for a module, check module is enabled; if not, take next template
|
// If template is for a module, check module is enabled; if not, take next template
|
||||||
@ -1386,7 +1386,8 @@ class FormMail extends Form
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$db->free($resql);
|
$dbs->free($resql);
|
||||||
|
|
||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
/* Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net>
|
/* Copyright (C) 2016 Laurent Destailleur <eldy@users.sourceforge.net>
|
||||||
* Copyright (C) 2021 Regis Houssin <regis.houssin@inodbox.com>
|
* Copyright (C) 2021 Regis Houssin <regis.houssin@inodbox.com>
|
||||||
|
* Copyright (C) 2022 Anthony Berton <anthony.berton@bb2a.fr>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -1176,4 +1177,112 @@ class Utils
|
|||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make a send last backup of database or fil in param
|
||||||
|
* CAN BE A CRON TASK
|
||||||
|
*
|
||||||
|
* @param string $sendto Recipients emails
|
||||||
|
* @param string $from Sender email
|
||||||
|
* @param string $subject Topic/Subject of mail
|
||||||
|
* @param string $message Message
|
||||||
|
* @param string $filename List of files to attach (full path of filename on file system)
|
||||||
|
* @param string $filter Filter file send
|
||||||
|
* @return int 0 if OK, < 0 if KO (this function is used also by cron so only 0 is OK)
|
||||||
|
*/
|
||||||
|
public function sendBackup($sendto = '', $from = '', $subject = '', $message = '', $filename = '', $filter = '')
|
||||||
|
{
|
||||||
|
global $conf, $langs;
|
||||||
|
|
||||||
|
$filepath = '';
|
||||||
|
$output = '';
|
||||||
|
$error = 0;
|
||||||
|
|
||||||
|
if (!empty($from)) {
|
||||||
|
$from = dol_escape_htmltag($from);
|
||||||
|
} elseif (!empty($conf->global->MAIN_INFO_SOCIETE_MAIL)) {
|
||||||
|
$from = dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_MAIL);
|
||||||
|
} else {
|
||||||
|
$error++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($sendto)) {
|
||||||
|
$sendto = dol_escape_htmltag($sendto);
|
||||||
|
} elseif (!empty($conf->global->MAIN_INFO_SOCIETE_MAIL)) {
|
||||||
|
$from = dol_escape_htmltag($conf->global->MAIN_INFO_SOCIETE_MAIL);
|
||||||
|
} else {
|
||||||
|
$error++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty($subject)) {
|
||||||
|
$subject = dol_escape_htmltag($subject);
|
||||||
|
} else {
|
||||||
|
$subject = dol_escape_htmltag($langs->trans('MakeSendLocalDatabaseDumpShort'));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($message)) {
|
||||||
|
$message = dol_escape_htmltag($langs->trans('MakeSendLocalDatabaseDumpShort'));
|
||||||
|
}
|
||||||
|
|
||||||
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
|
||||||
|
if ($filename) {
|
||||||
|
if (dol_is_file($conf->admin->dir_output.'/backup/'.$filename)) {
|
||||||
|
$tmpfiles = dol_most_recent_file($conf->admin->dir_output.'/backup', $filename);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$tmpfiles = dol_most_recent_file($conf->admin->dir_output.'/backup', $filter);
|
||||||
|
}
|
||||||
|
if ($tmpfiles) {
|
||||||
|
foreach ($tmpfiles as $key => $val) {
|
||||||
|
if ($key == 'fullname') {
|
||||||
|
$filepath = array($val);
|
||||||
|
$filesize = dol_filesize($val);
|
||||||
|
}
|
||||||
|
if ($key == 'type') {
|
||||||
|
$mimetype = array($val);
|
||||||
|
}
|
||||||
|
if ($key == 'relativename') {
|
||||||
|
$filename = array($val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($filepath) {
|
||||||
|
if ($filesize > 100000000) {
|
||||||
|
$output = 'Sorry, last backup file is too large to be send by email';
|
||||||
|
$error++;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$output = 'No backup file found';
|
||||||
|
$error++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
include_once DOL_DOCUMENT_ROOT . '/core/class/CMailFile.class.php';
|
||||||
|
$mailfile = new CMailFile($subject, $sendto, $from, $message, $filepath, $mimetype, $filename, '', '', 0, -1);
|
||||||
|
if ($mailfile->error) {
|
||||||
|
$error++;
|
||||||
|
$output = $mailfile->error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$error) {
|
||||||
|
$result = $mailfile->sendfile();
|
||||||
|
if ($result <= 0) {
|
||||||
|
$error++;
|
||||||
|
$output = $mailfile->error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dol_syslog(__METHOD__, LOG_DEBUG);
|
||||||
|
|
||||||
|
$this->error = $error;
|
||||||
|
$this->output = $output;
|
||||||
|
|
||||||
|
if ($result == true) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -10142,7 +10142,7 @@ function dolGetButtonAction($label, $html = '', $actionType = 'default', $url =
|
|||||||
$class = 'butAction';
|
$class = 'butAction';
|
||||||
if ($actionType == 'danger' || $actionType == 'delete') {
|
if ($actionType == 'danger' || $actionType == 'delete') {
|
||||||
$class = 'butActionDelete';
|
$class = 'butActionDelete';
|
||||||
if (strpos($url, 'token=') === false) $url .= '&token='.newToken();
|
if (!empty($url) && strpos($url, 'token=') === false) $url .= '&token='.newToken();
|
||||||
}
|
}
|
||||||
|
|
||||||
$attr = array(
|
$attr = array(
|
||||||
@ -10153,6 +10153,7 @@ function dolGetButtonAction($label, $html = '', $actionType = 'default', $url =
|
|||||||
|
|
||||||
if (empty($html)) {
|
if (empty($html)) {
|
||||||
$html = $label;
|
$html = $label;
|
||||||
|
$attr['title'] = ''; // if html not set, leave label on title is redundant
|
||||||
} else {
|
} else {
|
||||||
$attr['aria-label'] = $label;
|
$attr['aria-label'] = $label;
|
||||||
}
|
}
|
||||||
@ -10166,6 +10167,7 @@ function dolGetButtonAction($label, $html = '', $actionType = 'default', $url =
|
|||||||
$attr['id'] = $id;
|
$attr['id'] = $id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Override attr
|
// Override attr
|
||||||
if (!empty($params['attr']) && is_array($params['attr'])) {
|
if (!empty($params['attr']) && is_array($params['attr'])) {
|
||||||
foreach ($params['attr'] as $key => $value) {
|
foreach ($params['attr'] as $key => $value) {
|
||||||
@ -10179,6 +10181,11 @@ function dolGetButtonAction($label, $html = '', $actionType = 'default', $url =
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// automatic add tooltip when title is detected
|
||||||
|
if (!empty($attr['title']) && !empty($attr['class']) && strpos($attr['class'], 'classfortooltip') === false) {
|
||||||
|
$attr['class'].= ' classfortooltip';
|
||||||
|
}
|
||||||
|
|
||||||
// Js Confirm button
|
// Js Confirm button
|
||||||
if ($userRight && !empty($params['confirm'])) {
|
if ($userRight && !empty($params['confirm'])) {
|
||||||
if (!is_array($params['confirm'])) {
|
if (!is_array($params['confirm'])) {
|
||||||
|
|||||||
@ -1,6 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
/* Copyright (C) 2012 Nicolas Villa aka Boyquotes http://informetic.fr
|
/* Copyright (C) 2012 Nicolas Villa aka Boyquotes http://informetic.fr
|
||||||
* Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
|
* Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
|
||||||
|
* Copyright (C) 2022 Anthony Berton <anthony.berton@bb2a.fr>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -98,7 +99,8 @@ class modCron extends DolibarrModules
|
|||||||
// Cronjobs
|
// Cronjobs
|
||||||
$this->cronjobs = array(
|
$this->cronjobs = array(
|
||||||
0=>array('entity'=>0, 'label'=>'PurgeDeleteTemporaryFilesShort', 'jobtype'=>'method', 'class'=>'core/class/utils.class.php', 'objectname'=>'Utils', 'method'=>'purgeFiles', 'parameters'=>'tempfilesold+logfiles', 'comment'=>'PurgeDeleteTemporaryFiles', 'frequency'=>2, 'unitfrequency'=>3600 * 24 * 7, 'priority'=>50, 'status'=>1, 'test'=>true),
|
0=>array('entity'=>0, 'label'=>'PurgeDeleteTemporaryFilesShort', 'jobtype'=>'method', 'class'=>'core/class/utils.class.php', 'objectname'=>'Utils', 'method'=>'purgeFiles', 'parameters'=>'tempfilesold+logfiles', 'comment'=>'PurgeDeleteTemporaryFiles', 'frequency'=>2, 'unitfrequency'=>3600 * 24 * 7, 'priority'=>50, 'status'=>1, 'test'=>true),
|
||||||
1=>array('entity'=>0, 'label'=>'MakeLocalDatabaseDumpShort', 'jobtype'=>'method', 'class'=>'core/class/utils.class.php', 'objectname'=>'Utils', 'method'=>'dumpDatabase', 'parameters'=>'none,auto,1,auto,10', 'comment'=>'MakeLocalDatabaseDump', 'frequency'=>1, 'unitfrequency'=>3600 * 24 * 7, 'priority'=>90, 'status'=>0, 'test'=>in_array($this->db->type, array('mysql', 'mysqli'))),
|
1=>array('entity'=>0, 'label'=>'MakeLocalDatabaseDumpShort', 'jobtype'=>'method', 'class'=>'core/class/utils.class.php', 'objectname'=>'Utils', 'method'=>'dumpDatabase', 'parameters'=>'none,auto,1,auto,10', 'comment'=>'MakeLocalDatabaseDump', 'frequency'=>1, 'unitfrequency'=>3600 * 24 * 7, 'priority'=>90, 'status'=>0, 'test'=>'in_array($conf->db->type, array(\'mysql\', \'mysqli\'))'),
|
||||||
|
2=>array('entity'=>0, 'label'=>'MakeSendLocalDatabaseDumpShort', 'jobtype'=>'method', 'class'=>'core/class/utils.class.php', 'objectname'=>'Utils', 'method'=>'sendDumpDatabase', 'parameters'=>',,,,,sql', 'comment'=>'MakeSendLocalDatabaseDump', 'frequency'=>1, 'unitfrequency'=>604800, 'priority'=>91, 'status'=>0, 'test'=>'!empty($conf->global->MAIN_ALLOW_BACKUP_BY_EMAIL) && in_array($conf->db->type, array(\'mysql\', \'mysqli\'))'),
|
||||||
// 1=>array('entity'=>0, 'label'=>'My label', 'jobtype'=>'command', 'command'=>'', 'parameters'=>'', 'comment'=>'Comment', 'frequency'=>1, 'unitfrequency'=>3600*24)
|
// 1=>array('entity'=>0, 'label'=>'My label', 'jobtype'=>'command', 'command'=>'', 'parameters'=>'', 'comment'=>'Comment', 'frequency'=>1, 'unitfrequency'=>3600*24)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
* Copyright (C) 2004 Benoit Mortier <benoit.mortier@opensides.be>
|
* Copyright (C) 2004 Benoit Mortier <benoit.mortier@opensides.be>
|
||||||
* Copyright (C) 2005-2013 Regis Houssin <regis.houssin@inodbox.com>
|
* Copyright (C) 2005-2013 Regis Houssin <regis.houssin@inodbox.com>
|
||||||
* Copyright (C) 2012-2014 Juanjo Menent <jmenent@2byte.es>
|
* Copyright (C) 2012-2014 Juanjo Menent <jmenent@2byte.es>
|
||||||
|
* Copyright (C) 2022 Ferran Marcet <fmarcet@2byte.es>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -480,7 +481,6 @@ class modSociete extends DolibarrModules
|
|||||||
's.fax' => "Fax",
|
's.fax' => "Fax",
|
||||||
's.url' => "Url",
|
's.url' => "Url",
|
||||||
's.email' => "Email",
|
's.email' => "Email",
|
||||||
's.skype' => "Skype",
|
|
||||||
's.fk_effectif' => "Staff",
|
's.fk_effectif' => "Staff",
|
||||||
's.fk_typent' => "ThirdPartyType",
|
's.fk_typent' => "ThirdPartyType",
|
||||||
"s.fk_forme_juridique" => "JuridicalStatus",
|
"s.fk_forme_juridique" => "JuridicalStatus",
|
||||||
@ -621,7 +621,6 @@ class modSociete extends DolibarrModules
|
|||||||
's.fax' => "eg. +34987654321",
|
's.fax' => "eg. +34987654321",
|
||||||
's.url' => "e.g. https://www.mybigcompany.com",
|
's.url' => "e.g. https://www.mybigcompany.com",
|
||||||
's.email' => "e.g. test@mybigcompany.com",
|
's.email' => "e.g. test@mybigcompany.com",
|
||||||
's.skype' => "Skype name",
|
|
||||||
's.fk_effectif' => "1/2/3/5: represents one of the five ranges of employees",
|
's.fk_effectif' => "1/2/3/5: represents one of the five ranges of employees",
|
||||||
's.fk_typent' => 'matches field "id" (1-9 etc.) OR "code" (TE_SMALL etc.) in table "'.MAIN_DB_PREFIX.'c_typent"',
|
's.fk_typent' => 'matches field "id" (1-9 etc.) OR "code" (TE_SMALL etc.) in table "'.MAIN_DB_PREFIX.'c_typent"',
|
||||||
's.fk_forme_juridique' => '1/2/3 etc...matches field "code" in table "'.MAIN_DB_PREFIX.'c_forme_juridique"',
|
's.fk_forme_juridique' => '1/2/3 etc...matches field "code" in table "'.MAIN_DB_PREFIX.'c_forme_juridique"',
|
||||||
@ -693,7 +692,6 @@ class modSociete extends DolibarrModules
|
|||||||
's.phone_mobile' => "PhoneMobile",
|
's.phone_mobile' => "PhoneMobile",
|
||||||
's.fax' => "Fax",
|
's.fax' => "Fax",
|
||||||
's.email' => "Email",
|
's.email' => "Email",
|
||||||
's.skype' => "Skype",
|
|
||||||
's.note_private' => "NotePrivate",
|
's.note_private' => "NotePrivate",
|
||||||
's.note_public' => "NotePublic"
|
's.note_public' => "NotePublic"
|
||||||
);
|
);
|
||||||
@ -759,7 +757,6 @@ class modSociete extends DolibarrModules
|
|||||||
's.phone_mobile' => "5551144",
|
's.phone_mobile' => "5551144",
|
||||||
's.fax' => "5551155",
|
's.fax' => "5551155",
|
||||||
's.email' => "johnsmith@email.com",
|
's.email' => "johnsmith@email.com",
|
||||||
's.skype' => "skype username",
|
|
||||||
's.note_private' => "My private note",
|
's.note_private' => "My private note",
|
||||||
's.note_public' => "My public note"
|
's.note_public' => "My public note"
|
||||||
);
|
);
|
||||||
|
|||||||
@ -109,7 +109,8 @@ class modTicket extends DolibarrModules
|
|||||||
3 => array('TICKET_ADDON_PDF_ODT_PATH', 'chaine', 'DOL_DATA_ROOT/doctemplates/tickets', 'Ticket templates ODT/ODS directory for templates', 0),
|
3 => array('TICKET_ADDON_PDF_ODT_PATH', 'chaine', 'DOL_DATA_ROOT/doctemplates/tickets', 'Ticket templates ODT/ODS directory for templates', 0),
|
||||||
4 => array('TICKET_AUTO_READ_WHEN_CREATED_FROM_BACKEND', 'chaine', 0, 'Automatically mark ticket as read when created from backend', 0),
|
4 => array('TICKET_AUTO_READ_WHEN_CREATED_FROM_BACKEND', 'chaine', 0, 'Automatically mark ticket as read when created from backend', 0),
|
||||||
5 => array('TICKET_DELAY_BEFORE_FIRST_RESPONSE', 'chaine', '0', 'Maximum wanted elapsed time before a first answer to a ticket (in hours). Display a warning in tickets list if not respected.', 0),
|
5 => array('TICKET_DELAY_BEFORE_FIRST_RESPONSE', 'chaine', '0', 'Maximum wanted elapsed time before a first answer to a ticket (in hours). Display a warning in tickets list if not respected.', 0),
|
||||||
6 => array('TICKET_DELAY_SINCE_LAST_RESPONSE', 'chaine', '0', 'Maximum wanted elapsed time between two answers on the same ticket (in hours). Display a warning in tickets list if not respected.', 0)
|
6 => array('TICKET_DELAY_SINCE_LAST_RESPONSE', 'chaine', '0', 'Maximum wanted elapsed time between two answers on the same ticket (in hours). Display a warning in tickets list if not respected.', 0),
|
||||||
|
7 => array('TICKET_NOTIFY_AT_CLOSING', 'chaine', '0', 'Default notify contacts when closing a module', 0),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -43,20 +43,18 @@ abstract class ModelePDFProduct extends CommonDocGenerator
|
|||||||
/**
|
/**
|
||||||
* Return list of active generation modules
|
* Return list of active generation modules
|
||||||
*
|
*
|
||||||
* @param DoliDB $db Database handler
|
* @param DoliDB $dbs Database handler
|
||||||
* @param integer $maxfilenamelength Max length of value to show
|
* @param integer $maxfilenamelength Max length of value to show
|
||||||
* @return array List of templates
|
* @return array List of templates
|
||||||
*/
|
*/
|
||||||
public static function liste_modeles($db, $maxfilenamelength = 0)
|
public static function liste_modeles($dbs, $maxfilenamelength = 0)
|
||||||
{
|
{
|
||||||
// phpcs:enable
|
// phpcs:enable
|
||||||
global $conf;
|
|
||||||
|
|
||||||
$type = 'product';
|
$type = 'product';
|
||||||
$list = array();
|
$list = array();
|
||||||
|
|
||||||
include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
|
include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
|
||||||
$list = getListOfModels($db, $type, $maxfilenamelength);
|
$list = getListOfModels($dbs, $type, $maxfilenamelength);
|
||||||
return $list;
|
return $list;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -156,22 +154,22 @@ abstract class ModeleProductCode
|
|||||||
/**
|
/**
|
||||||
* Renvoi la liste des modeles de numérotation
|
* Renvoi la liste des modeles de numérotation
|
||||||
*
|
*
|
||||||
* @param DoliDB $db Database handler
|
* @param DoliDB $dbs Database handler
|
||||||
* @param integer $maxfilenamelength Max length of value to show
|
* @param integer $maxfilenamelength Max length of value to show
|
||||||
* @return array List of numbers
|
* @return array List of numbers
|
||||||
*/
|
*/
|
||||||
public static function liste_modeles($db, $maxfilenamelength = 0)
|
public static function liste_modeles($dbs, $maxfilenamelength = 0)
|
||||||
{
|
{
|
||||||
// phpcs:enable
|
// phpcs:enable
|
||||||
$list = array();
|
$list = array();
|
||||||
$sql = "";
|
$sql = "";
|
||||||
|
|
||||||
$resql = $db->query($sql);
|
$resql = $dbs->query($sql);
|
||||||
if ($resql) {
|
if ($resql) {
|
||||||
$num = $db->num_rows($resql);
|
$num = $dbs->num_rows($resql);
|
||||||
$i = 0;
|
$i = 0;
|
||||||
while ($i < $num) {
|
while ($i < $num) {
|
||||||
$row = $db->fetch_row($resql);
|
$row = $dbs->fetch_row($resql);
|
||||||
$list[$row[0]] = $row[1];
|
$list[$row[0]] = $row[1];
|
||||||
$i++;
|
$i++;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -41,20 +41,19 @@ abstract class ModeleThirdPartyDoc extends CommonDocGenerator
|
|||||||
/**
|
/**
|
||||||
* Return list of active generation modules
|
* Return list of active generation modules
|
||||||
*
|
*
|
||||||
* @param DoliDB $db Database handler
|
* @param DoliDB $dbs Database handler
|
||||||
* @param integer $maxfilenamelength Max length of value to show
|
* @param integer $maxfilenamelength Max length of value to show
|
||||||
* @return array List of templates
|
* @return array List of templates
|
||||||
*/
|
*/
|
||||||
public static function liste_modeles($db, $maxfilenamelength = 0)
|
public static function liste_modeles($dbs, $maxfilenamelength = 0)
|
||||||
{
|
{
|
||||||
// phpcs:enable
|
// phpcs:enable
|
||||||
global $conf;
|
|
||||||
|
|
||||||
$type = 'company';
|
$type = 'company';
|
||||||
$list = array();
|
$list = array();
|
||||||
|
|
||||||
include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
|
include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
|
||||||
$list = getListOfModels($db, $type, $maxfilenamelength);
|
$list = getListOfModels($dbs, $type, $maxfilenamelength);
|
||||||
|
|
||||||
return $list;
|
return $list;
|
||||||
}
|
}
|
||||||
@ -161,22 +160,22 @@ abstract class ModeleThirdPartyCode
|
|||||||
/**
|
/**
|
||||||
* Renvoie la liste des modeles de numérotation
|
* Renvoie la liste des modeles de numérotation
|
||||||
*
|
*
|
||||||
* @param DoliDB $db Database handler
|
* @param DoliDB $dbs Database handler
|
||||||
* @param integer $maxfilenamelength Max length of value to show
|
* @param integer $maxfilenamelength Max length of value to show
|
||||||
* @return array|int List of numbers
|
* @return array|int List of numbers
|
||||||
*/
|
*/
|
||||||
public static function liste_modeles($db, $maxfilenamelength = 0)
|
public static function liste_modeles($dbs, $maxfilenamelength = 0)
|
||||||
{
|
{
|
||||||
// phpcs:enable
|
// phpcs:enable
|
||||||
$list = array();
|
$list = array();
|
||||||
$sql = "";
|
$sql = "";
|
||||||
|
|
||||||
$resql = $db->query($sql);
|
$resql = $dbs->query($sql);
|
||||||
if ($resql) {
|
if ($resql) {
|
||||||
$num = $db->num_rows($resql);
|
$num = $dbs->num_rows($resql);
|
||||||
$i = 0;
|
$i = 0;
|
||||||
while ($i < $num) {
|
while ($i < $num) {
|
||||||
$row = $db->fetch_row($resql);
|
$row = $dbs->fetch_row($resql);
|
||||||
$list[$row[0]] = $row[1];
|
$list[$row[0]] = $row[1];
|
||||||
$i++;
|
$i++;
|
||||||
}
|
}
|
||||||
@ -401,26 +400,3 @@ abstract class ModeleAccountancyCode
|
|||||||
return $langs->trans("NotAvailable");
|
return $langs->trans("NotAvailable");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a document onto disk according to template module.
|
|
||||||
*
|
|
||||||
* @param DoliDB $db Database handler
|
|
||||||
* @param Facture $object Object invoice
|
|
||||||
* @param string $message Message (not used, deprecated)
|
|
||||||
* @param string $modele Force template to use ('' to not force)
|
|
||||||
* @param Translate $outputlangs objet lang a utiliser pour traduction
|
|
||||||
* @param int $hidedetails Hide details of lines
|
|
||||||
* @param int $hidedesc Hide description
|
|
||||||
* @param int $hideref Hide ref
|
|
||||||
* @return int <0 if KO, >0 if OK
|
|
||||||
* @deprecated Use the new function generateDocument of Objects class
|
|
||||||
* @see Societe::generateDocument()
|
|
||||||
*/
|
|
||||||
function thirdparty_doc_create(DoliDB $db, Societe $object, $message, $modele, $outputlangs, $hidedetails = 0, $hidedesc = 0, $hideref = 0)
|
|
||||||
{
|
|
||||||
dol_syslog(__METHOD__." is deprecated", LOG_WARNING);
|
|
||||||
|
|
||||||
return $object->generateDocument($modele, $outputlangs, $hidedetails, $hidedesc, $hideref);
|
|
||||||
}
|
|
||||||
|
|||||||
@ -133,19 +133,145 @@ class InterfaceTicketEmail extends DolibarrTriggers
|
|||||||
|
|
||||||
$langs->load('ticket');
|
$langs->load('ticket');
|
||||||
|
|
||||||
|
$subject_admin = 'TicketNewEmailSubjectAdmin';
|
||||||
|
$body_admin = 'TicketNewEmailBodyAdmin';
|
||||||
|
$subject_customer = 'TicketNewEmailSubjectCustomer';
|
||||||
|
$body_customer = 'TicketNewEmailBodyCustomer';
|
||||||
|
$see_ticket_customer = 'TicketNewEmailBodyInfosTrackUrlCustomer';
|
||||||
|
|
||||||
// Send email to notification email
|
// Send email to notification email
|
||||||
if (!empty($conf->global->TICKET_NOTIFICATION_EMAIL_TO) && empty($object->context['disableticketemail'])) {
|
if (!empty($conf->global->TICKET_NOTIFICATION_EMAIL_TO) && empty($object->context['disableticketemail'])) {
|
||||||
$sendto = empty($conf->global->TICKET_NOTIFICATION_EMAIL_TO) ? '' : $conf->global->TICKET_NOTIFICATION_EMAIL_TO;
|
$sendto = empty($conf->global->TICKET_NOTIFICATION_EMAIL_TO) ? '' : $conf->global->TICKET_NOTIFICATION_EMAIL_TO;
|
||||||
|
if ($sendto) {
|
||||||
|
$this->composeAndSendAdminMessage($sendto, $subject_admin, $body_admin, $object, $langs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send email to customer
|
||||||
|
if (empty($conf->global->TICKET_DISABLE_CUSTOMER_MAILS) && empty($object->context['disableticketemail']) && $object->notify_tiers_at_create) {
|
||||||
|
$sendto = '';
|
||||||
|
|
||||||
|
//if contact selected send to email's contact else send to email's thirdparty
|
||||||
|
|
||||||
|
$contactid = GETPOST('contactid', 'alpha');
|
||||||
|
$res = 0;
|
||||||
|
|
||||||
|
if (!empty($contactid)) {
|
||||||
|
$contact = new Contact($this->db);
|
||||||
|
$res = $contact->fetch($contactid);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($res > 0 && !empty($contact->email) && !empty($contact->statut)) {
|
||||||
|
$sendto = $contact->email;
|
||||||
|
} elseif (!empty($object->fk_soc)) {
|
||||||
|
$object->fetch_thirdparty();
|
||||||
|
$sendto = $object->thirdparty->email;
|
||||||
|
}
|
||||||
|
|
||||||
if ($sendto) {
|
if ($sendto) {
|
||||||
|
$this->composeAndSendCustomerMessage($sendto, $subject_customer, $body_customer, $see_ticket_customer, $object, $langs, $conf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$ok = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'TICKET_DELETE':
|
||||||
|
dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'TICKET_MODIFY':
|
||||||
|
dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'TICKET_CLOSE':
|
||||||
|
dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
|
||||||
|
$langs->load('ticket');
|
||||||
|
|
||||||
|
$subject_admin = 'TicketCloseEmailSubjectAdmin';
|
||||||
|
$body_admin = 'TicketCloseEmailBodyAdmin';
|
||||||
|
$subject_customer = 'TicketCloseEmailSubjectCustomer';
|
||||||
|
$body_customer = 'TicketCloseEmailBodyCustomer';
|
||||||
|
$see_ticket_customer = 'TicketCloseEmailBodyInfosTrackUrlCustomer';
|
||||||
|
|
||||||
|
// Send email to notification email
|
||||||
|
if (!empty($conf->global->TICKET_NOTIFICATION_EMAIL_TO) && empty($object->context['disableticketemail'])) {
|
||||||
|
$sendto = empty($conf->global->TICKET_NOTIFICATION_EMAIL_TO) ? '' : $conf->global->TICKET_NOTIFICATION_EMAIL_TO;
|
||||||
|
if ($sendto) {
|
||||||
|
$this->composeAndSendAdminMessage($sendto, $subject_admin, $body_admin, $object, $langs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Send email to customer.
|
||||||
|
if (empty($conf->global->TICKET_DISABLE_CUSTOMER_MAILS) && empty($object->context['disableticketemail'])) {
|
||||||
|
$linked_contacts = $object->listeContact(-1, 'thirdparty');
|
||||||
|
$linked_contacts = array_merge($linked_contacts, $object->listeContact(-1, 'internal'));
|
||||||
|
if (empty($linked_contacts) && !empty($conf->global->TICKET_NOTIFY_AT_CLOSING) && !empty($object->fk_soc)) {
|
||||||
|
$object->fetch_thirdparty();
|
||||||
|
$linked_contacts[] = $object->thirdparty->email;
|
||||||
|
}
|
||||||
|
|
||||||
|
$contactid = GETPOST('contactid', 'int');
|
||||||
|
$res = 0;
|
||||||
|
|
||||||
|
if ($contactid > 0) {
|
||||||
|
$contact = new Contact($this->db);
|
||||||
|
$res = $contact->fetch($contactid);
|
||||||
|
if (! in_array($contact, $linked_contacts)) {
|
||||||
|
$error_msg = $langs->trans('Error'). ': ';
|
||||||
|
$error_msg .= $langs->transnoentities('TicketWrongContact');
|
||||||
|
setEventMessages($error_msg, [], 'errors');
|
||||||
|
$ok = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$sendto = '';
|
||||||
|
if ($res > 0 && !empty($contact->email) && !empty($contact->statut)) {
|
||||||
|
$sendto = $contact->email;
|
||||||
|
} elseif ( !empty($linked_contacts) && ($contactid == -2 || (GETPOST('massaction', 'alpha') == 'close' && GETPOST('confirm', 'alpha') == 'yes'))) {
|
||||||
|
// if sending to all contacts or sending to contacts while mass closing
|
||||||
|
$temp_emails = [];
|
||||||
|
foreach ($linked_contacts as $contact) {
|
||||||
|
$temp_emails[] = $contact['email'];
|
||||||
|
}
|
||||||
|
$sendto = implode(", ", $temp_emails);
|
||||||
|
unset($temp_emails);
|
||||||
|
unset($linked_contacts);
|
||||||
|
}
|
||||||
|
if ($sendto) {
|
||||||
|
$this->composeAndSendCustomerMessage($sendto, $subject_customer, $body_customer, $see_ticket_customer, $object, $langs, $conf);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$ok = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Composes and sends a message concerning a ticket, to be sent to admin address.
|
||||||
|
*
|
||||||
|
* @param string $sendto Addresses to send the mail, format "first@address.net, second@address.net," etc.
|
||||||
|
* @param string $base_subject email subject. Non-translated string.
|
||||||
|
* @param string $body email body (first line). Non-translated string.
|
||||||
|
* @param Ticket $object the ticket thet the email refers to
|
||||||
|
* @param Translate $langs the translation object
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private function composeAndSendAdminMessage($sendto, $base_subject, $body, Ticket $object, Translate $langs)
|
||||||
|
{
|
||||||
|
global $conf;
|
||||||
|
|
||||||
// Init to avoid errors
|
// Init to avoid errors
|
||||||
$filepath = array();
|
$filepath = array();
|
||||||
$filename = array();
|
$filename = array();
|
||||||
$mimetype = array();
|
$mimetype = array();
|
||||||
|
|
||||||
/* Send email to admin */
|
/* Send email to admin */
|
||||||
$subject = '['.$conf->global->MAIN_INFO_SOCIETE_NOM.'] '.$langs->transnoentities('TicketNewEmailSubjectAdmin');
|
$subject = '['.$conf->global->MAIN_INFO_SOCIETE_NOM.'] '.$langs->transnoentities($base_subject, $object->ref, $object->track_id);
|
||||||
$message_admin = $langs->transnoentities('TicketNewEmailBodyAdmin', $object->track_id).'<br><br>';
|
$message_admin = $langs->transnoentities($body, $object->track_id).'<br>';
|
||||||
$message_admin .= '<ul><li>'.$langs->trans('Title').' : '.$object->subject.'</li>';
|
$message_admin .= '<ul><li>'.$langs->trans('Title').' : '.$object->subject.'</li>';
|
||||||
$message_admin .= '<li>'.$langs->trans('Type').' : '.$langs->getLabelFromKey($this->db, 'TicketTypeShort'.$object->type_code, 'c_ticket_type', 'code', 'label', $object->type_code).'</li>';
|
$message_admin .= '<li>'.$langs->trans('Type').' : '.$langs->getLabelFromKey($this->db, 'TicketTypeShort'.$object->type_code, 'c_ticket_type', 'code', 'label', $object->type_code).'</li>';
|
||||||
$message_admin .= '<li>'.$langs->trans('Category').' : '.$langs->getLabelFromKey($this->db, 'TicketCategoryShort'.$object->category_code, 'c_ticket_category', 'code', 'label', $object->category_code).'</li>';
|
$message_admin .= '<li>'.$langs->trans('Category').' : '.$langs->getLabelFromKey($this->db, 'TicketCategoryShort'.$object->category_code, 'c_ticket_category', 'code', 'label', $object->category_code).'</li>';
|
||||||
@ -160,22 +286,20 @@ class InterfaceTicketEmail extends DolibarrTriggers
|
|||||||
$message_admin .= '<li>'.$langs->trans($extraFields->attributes[$object->element]['label'][$key]).' : '.$extraFields->showOutputField($key, $value, '', $object->table_element).'</li>';
|
$message_admin .= '<li>'.$langs->trans($extraFields->attributes[$object->element]['label'][$key]).' : '.$extraFields->showOutputField($key, $value, '', $object->table_element).'</li>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$message_admin .= '</ul>';
|
|
||||||
|
|
||||||
if ($object->fk_soc > 0) {
|
if ($object->fk_soc > 0) {
|
||||||
$object->fetch_thirdparty();
|
$object->fetch_thirdparty();
|
||||||
$message_admin .= '<p>'.$langs->trans('Company').' : '.$object->thirdparty->name.'</p>';
|
$message_admin .= '<li>'.$langs->trans('Company').' : '.$object->thirdparty->name.'</li>';
|
||||||
}
|
}
|
||||||
|
$message_admin .= '</ul>';
|
||||||
|
|
||||||
$message = $object->message;
|
$message = $object->message;
|
||||||
if (!dol_textishtml($message)) {
|
if (!dol_textishtml($message)) {
|
||||||
$message = dol_nl2br($message);
|
$message = dol_nl2br($message);
|
||||||
}
|
}
|
||||||
$message_admin .= '<p>'.$langs->trans('Message').' : <br>'.$message.'</p>';
|
$message_admin .= '<p>'.$langs->trans('Message').' : <br><br>'.$message.'</p><br>';
|
||||||
$message_admin .= '<p><a href="'.dol_buildpath('/ticket/card.php', 2).'?track_id='.$object->track_id.'">'.$langs->trans('SeeThisTicketIntomanagementInterface').'</a></p>';
|
$message_admin .= '<p><a href="'.dol_buildpath('/ticket/card.php', 2).'?track_id='.$object->track_id.'">'.$langs->trans('SeeThisTicketIntomanagementInterface').'</a></p>';
|
||||||
|
|
||||||
$from = $conf->global->MAIN_INFO_SOCIETE_NOM.'<'.$conf->global->TICKET_NOTIFICATION_EMAIL_FROM.'>';
|
$from = $conf->global->MAIN_INFO_SOCIETE_NOM.'<'.$conf->global->TICKET_NOTIFICATION_EMAIL_FROM.'>';
|
||||||
$replyto = $from;
|
|
||||||
|
|
||||||
$trackid = 'tic'.$object->id;
|
$trackid = 'tic'.$object->id;
|
||||||
|
|
||||||
@ -194,43 +318,36 @@ class InterfaceTicketEmail extends DolibarrTriggers
|
|||||||
$conf->global->MAIN_MAIL_AUTOCOPY_TO = $old_MAIN_MAIL_AUTOCOPY_TO;
|
$conf->global->MAIN_MAIL_AUTOCOPY_TO = $old_MAIN_MAIL_AUTOCOPY_TO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Send email to customer
|
/**
|
||||||
|
* Composes and sends a message concerning a ticket, to be sent to customer addresses.
|
||||||
|
*
|
||||||
|
* @param string $sendto Addresses to send the mail, format "first@address.net, second@address.net, " etc.
|
||||||
|
* @param string $base_subject email subject. Non-translated string.
|
||||||
|
* @param string $body email body (first line). Non-translated string.
|
||||||
|
* @param string $see_ticket string indicating the ticket public address
|
||||||
|
* @param Ticket $object the ticket thet the email refers to
|
||||||
|
* @param Translate $langs the translation object
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
private function composeAndSendCustomerMessage($sendto, $base_subject, $body, $see_ticket, Ticket $object, Translate $langs)
|
||||||
|
{
|
||||||
|
global $conf, $user;
|
||||||
|
|
||||||
if (empty($conf->global->TICKET_DISABLE_CUSTOMER_MAILS) && empty($object->context['disableticketemail']) && $object->notify_tiers_at_create) {
|
|
||||||
$sendto = '';
|
|
||||||
|
|
||||||
//if contact selected send to email's contact else send to email's thirdparty
|
|
||||||
|
|
||||||
$contactid = GETPOST('contactid', 'alpha');
|
|
||||||
|
|
||||||
if (!empty($contactid)) {
|
|
||||||
$contact = new Contact($this->db);
|
|
||||||
$res = $contact->fetch($contactid);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($res > 0 && !empty($contact->email) && !empty($contact->statut)) {
|
|
||||||
$sendto = $contact->email;
|
|
||||||
} elseif (!empty($object->fk_soc)) {
|
|
||||||
$object->fetch_thirdparty();
|
|
||||||
$sendto = $object->thirdparty->email;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($sendto) {
|
|
||||||
// Init to avoid errors
|
// Init to avoid errors
|
||||||
$filepath = array();
|
$filepath = array();
|
||||||
$filename = array();
|
$filename = array();
|
||||||
$mimetype = array();
|
$mimetype = array();
|
||||||
|
|
||||||
$subject = '['.$conf->global->MAIN_INFO_SOCIETE_NOM.'] '.$langs->transnoentities('TicketNewEmailSubjectCustomer');
|
$subject = '['.$conf->global->MAIN_INFO_SOCIETE_NOM.'] '.$langs->transnoentities($base_subject);
|
||||||
$message_customer = $langs->transnoentities('TicketNewEmailBodyCustomer', $object->track_id).'<br><br>';
|
$message_customer = $langs->transnoentities($body, $object->track_id).'<br>';
|
||||||
$message_customer .= '<ul><li>'.$langs->trans('Title').' : '.$object->subject.'</li>';
|
$message_customer .= '<ul><li>'.$langs->trans('Title').' : '.$object->subject.'</li>';
|
||||||
$message_customer .= '<li>'.$langs->trans('Type').' : '.$langs->getLabelFromKey($this->db, 'TicketTypeShort'.$object->type_code, 'c_ticket_type', 'code', 'label', $object->type_code).'</li>';
|
$message_customer .= '<li>'.$langs->trans('Type').' : '.$langs->getLabelFromKey($this->db, 'TicketTypeShort'.$object->type_code, 'c_ticket_type', 'code', 'label', $object->type_code).'</li>';
|
||||||
$message_customer .= '<li>'.$langs->trans('Category').' : '.$langs->getLabelFromKey($this->db, 'TicketCategoryShort'.$object->category_code, 'c_ticket_category', 'code', 'label', $object->category_code).'</li>';
|
$message_customer .= '<li>'.$langs->trans('Category').' : '.$langs->getLabelFromKey($this->db, 'TicketCategoryShort'.$object->category_code, 'c_ticket_category', 'code', 'label', $object->category_code).'</li>';
|
||||||
$message_customer .= '<li>'.$langs->trans('Severity').' : '.$langs->getLabelFromKey($this->db, 'TicketSeverityShort'.$object->severity_code, 'c_ticket_severity', 'code', 'label', $object->severity_code).'</li>';
|
$message_customer .= '<li>'.$langs->trans('Severity').' : '.$langs->getLabelFromKey($this->db, 'TicketSeverityShort'.$object->severity_code, 'c_ticket_severity', 'code', 'label', $object->severity_code).'</li>';
|
||||||
|
|
||||||
// Extrafields
|
// Extrafields
|
||||||
|
if (is_array($this->attributes[$object->table_element]['label'])) {
|
||||||
foreach ($this->attributes[$object->table_element]['label'] as $key => $value) {
|
foreach ($this->attributes[$object->table_element]['label'] as $key => $value) {
|
||||||
$enabled = 1;
|
$enabled = 1;
|
||||||
if ($enabled && isset($this->attributes[$object->table_element]['list'][$key])) {
|
if ($enabled && isset($this->attributes[$object->table_element]['list'][$key])) {
|
||||||
@ -253,6 +370,7 @@ class InterfaceTicketEmail extends DolibarrTriggers
|
|||||||
$message_customer .= '<li>' . $langs->trans($key) . ' : ' . $value . '</li>';
|
$message_customer .= '<li>' . $langs->trans($key) . ' : ' . $value . '</li>';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$message_customer .= '</ul>';
|
$message_customer .= '</ul>';
|
||||||
|
|
||||||
@ -260,13 +378,12 @@ class InterfaceTicketEmail extends DolibarrTriggers
|
|||||||
if (!dol_textishtml($message)) {
|
if (!dol_textishtml($message)) {
|
||||||
$message = dol_nl2br($message);
|
$message = dol_nl2br($message);
|
||||||
}
|
}
|
||||||
$message_customer .= '<p>'.$langs->trans('Message').' : <br>'.$message.'</p>';
|
$message_customer .= '<p>'.$langs->trans('Message').' : <br><br>'.$message.'</p><br>';
|
||||||
$url_public_ticket = ($conf->global->TICKET_URL_PUBLIC_INTERFACE ? $conf->global->TICKET_URL_PUBLIC_INTERFACE.'/' : dol_buildpath('/public/ticket/view.php', 2)).'?track_id='.$object->track_id;
|
$url_public_ticket = ($conf->global->TICKET_URL_PUBLIC_INTERFACE ? $conf->global->TICKET_URL_PUBLIC_INTERFACE.'/' : dol_buildpath('/public/ticket/view.php', 2)).'?track_id='.$object->track_id;
|
||||||
$message_customer .= '<p>'.$langs->trans('TicketNewEmailBodyInfosTrackUrlCustomer').' : <a href="'.$url_public_ticket.'">'.$url_public_ticket.'</a></p>';
|
$message_customer .= '<p>'.$langs->trans($see_ticket).' : <a href="'.$url_public_ticket.'">'.$url_public_ticket.'</a></p>';
|
||||||
$message_customer .= '<p>'.$langs->trans('TicketEmailPleaseDoNotReplyToThisEmail').'</p>';
|
$message_customer .= '<p>'.$langs->trans('TicketEmailPleaseDoNotReplyToThisEmail').'</p>';
|
||||||
|
|
||||||
$from = (empty($conf->global->MAIN_INFO_SOCIETE_NOM) ? '' : $conf->global->MAIN_INFO_SOCIETE_NOM.' ').'<'.$conf->global->TICKET_NOTIFICATION_EMAIL_FROM.'>';
|
$from = (empty($conf->global->MAIN_INFO_SOCIETE_NOM) ? '' : $conf->global->MAIN_INFO_SOCIETE_NOM.' ').'<'.$conf->global->TICKET_NOTIFICATION_EMAIL_FROM.'>';
|
||||||
$replyto = $from;
|
|
||||||
|
|
||||||
$trackid = 'tic'.$object->id;
|
$trackid = 'tic'.$object->id;
|
||||||
|
|
||||||
@ -282,6 +399,7 @@ class InterfaceTicketEmail extends DolibarrTriggers
|
|||||||
$result = $mailfile->sendfile();
|
$result = $mailfile->sendfile();
|
||||||
if ($result) {
|
if ($result) {
|
||||||
// update last_msg_sent date
|
// update last_msg_sent date
|
||||||
|
$object->fetch($object->id);
|
||||||
$object->date_last_msg_sent = dol_now();
|
$object->date_last_msg_sent = dol_now();
|
||||||
$object->update($user);
|
$object->update($user);
|
||||||
}
|
}
|
||||||
@ -291,24 +409,3 @@ class InterfaceTicketEmail extends DolibarrTriggers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$ok = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'TICKET_DELETE':
|
|
||||||
dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'TICKET_MODIFY':
|
|
||||||
dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'TICKET_CLOSE':
|
|
||||||
dol_syslog("Trigger '".$this->name."' for action '$action' launched by ".__FILE__.". id=".$object->id);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return $ok;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@ -478,9 +478,13 @@ if ($num > 0) {
|
|||||||
if (empty($obj)) {
|
if (empty($obj)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (isset($obj->test) && !verifCond($obj->test)) {
|
|
||||||
|
if (isset($obj->test)) {
|
||||||
|
$veriftest = verifCond($obj->test);
|
||||||
|
if (!$veriftest) {
|
||||||
continue; // Discard line with test = false
|
continue; // Discard line with test = false
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$object->id = $obj->rowid;
|
$object->id = $obj->rowid;
|
||||||
$object->ref = $obj->rowid;
|
$object->ref = $obj->rowid;
|
||||||
|
|||||||
@ -25,10 +25,9 @@
|
|||||||
-- Availability type
|
-- Availability type
|
||||||
--
|
--
|
||||||
|
|
||||||
delete from llx_c_availability;
|
INSERT INTO llx_c_availability (code,label,type_duration,number,active,position) VALUES ('AV_NOW', 'Immediate', null, 0, 1, 10);
|
||||||
INSERT INTO llx_c_availability (rowid,code,label,type_duration,number,active,position) VALUES (1, 'AV_NOW', 'Immediate', null, 0, 1, 10);
|
INSERT INTO llx_c_availability (code,label,type_duration,number,active,position) VALUES ('AV_1W', '1 week', 'w', 1, 1, 20);
|
||||||
INSERT INTO llx_c_availability (rowid,code,label,type_duration,number,active,position) VALUES (2, 'AV_1W', '1 week', 'w', 1, 1, 20);
|
INSERT INTO llx_c_availability (code,label,type_duration,number,active,position) VALUES ('AV_2W', '2 weeks', 'w', 2, 1, 30);
|
||||||
INSERT INTO llx_c_availability (rowid,code,label,type_duration,number,active,position) VALUES (3, 'AV_2W', '2 weeks', 'w', 2, 1, 30);
|
INSERT INTO llx_c_availability (code,label,type_duration,number,active,position) VALUES ('AV_3W', '3 weeks', 'w', 3, 1, 40);
|
||||||
INSERT INTO llx_c_availability (rowid,code,label,type_duration,number,active,position) VALUES (4, 'AV_3W', '3 weeks', 'w', 3, 1, 40);
|
INSERT INTO llx_c_availability (code,label,type_duration,number,active,position) VALUES ('AV_4W', '4 weeks', 'w', 4, 1, 50);
|
||||||
INSERT INTO llx_c_availability (rowid,code,label,type_duration,number,active,position) VALUES (5, 'AV_4W', '4 weeks', 'w', 4, 1, 50);
|
|
||||||
|
|
||||||
|
|||||||
@ -30,9 +30,8 @@
|
|||||||
-- Civilities
|
-- Civilities
|
||||||
--
|
--
|
||||||
|
|
||||||
delete from llx_c_civility;
|
insert into llx_c_civility (code, label, active) values ('MME', 'Madame', 1);
|
||||||
insert into llx_c_civility (rowid, code, label, active) values (1 , 'MME', 'Madame', 1);
|
insert into llx_c_civility (code, label, active) values ('MR', 'Monsieur', 1);
|
||||||
insert into llx_c_civility (rowid, code, label, active) values (3 , 'MR', 'Monsieur', 1);
|
insert into llx_c_civility (code, label, active) values ('MLE', 'Mademoiselle', 1);
|
||||||
insert into llx_c_civility (rowid, code, label, active) values (5 , 'MLE', 'Mademoiselle', 1);
|
insert into llx_c_civility (code, label, active) values ('MTRE', 'Maître', 1);
|
||||||
insert into llx_c_civility (rowid, code, label, active) values (7 , 'MTRE', 'Maître', 1);
|
insert into llx_c_civility (code, label, active) values ('DR', 'Docteur', 1);
|
||||||
insert into llx_c_civility (rowid, code, label, active) values (8 , 'DR', 'Docteur', 1);
|
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
-- Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
|
-- Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
|
||||||
-- Copyright (C) 2007 Patrick Raguin <patrick.raguin@gmail.com>
|
-- Copyright (C) 2007 Patrick Raguin <patrick.raguin@gmail.com>
|
||||||
-- Copyright (C) 2019 Markus Welters <markus@welters.de>
|
-- Copyright (C) 2019 Markus Welters <markus@welters.de>
|
||||||
|
-- Copyright (C) 2022 Joachim Kueter <jkueter@gmx.de>
|
||||||
--
|
--
|
||||||
-- This program is free software; you can redistribute it and/or modify
|
-- This program is free software; you can redistribute it and/or modify
|
||||||
-- it under the terms of the GNU General Public License as published by
|
-- it under the terms of the GNU General Public License as published by
|
||||||
@ -62,6 +63,24 @@ INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, m
|
|||||||
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('ES-CONSTITUIZION', 0, 4, '', 0, 12, 6, 1);
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('ES-CONSTITUIZION', 0, 4, '', 0, 12, 6, 1);
|
||||||
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('ES-IMMACULE', 0, 4, '', 0, 12, 8, 1);
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('ES-IMMACULE', 0, 4, '', 0, 12, 8, 1);
|
||||||
|
|
||||||
|
-- Germany (5)
|
||||||
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('DE-NEUJAHR', 0, 5, '', 0, 1, 1, 1);
|
||||||
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('DE-HL3KOEN--TLW', 0, 5, '', 0, 1, 6, 0);
|
||||||
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('DE-INTFRAUENTAG--TLW', 0, 5, '', 0, 3, 8, 0);
|
||||||
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('DE-KARFREITAG', 0, 5, 'goodfriday', 0, 0, 0, 1);
|
||||||
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('DE-OSTERMONTAG', 0, 5, 'eastermonday', 0, 0, 0, 1);
|
||||||
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('DE-TAGDERARBEIT', 0, 5, '', 0, 5, 1, 1);
|
||||||
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('DE-HIMMELFAHRT', 0, 5, 'ascension', 0, 0, 0, 1);
|
||||||
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('DE-PFINGSTEN', 0, 5, 'pentecotemonday', 0, 0, 0, 1);
|
||||||
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('DE-FRONLEICHNAM--TLW', 0, 5, 'fronleichnam', 0, 0, 0, 0);
|
||||||
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('DE-MARIAEHIMMEL--TLW', 0, 5, '', 0, 8, 15, 0);
|
||||||
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('DE-WELTKINDERTAG--TLW', 0, 5, '', 0, 9, 20, 0);
|
||||||
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('DE-TAGDERDEUTEINHEIT', 0, 5, '', 0, 10, 3, 1);
|
||||||
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('DE-REFORMATIONSTAG--TLW', 0, 5, '', 0, 10, 31, 0);
|
||||||
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('DE-ALLERHEILIGEN--TLW', 0, 5, '', 0, 11, 1, 0);
|
||||||
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('DE-WEIHNACHTSTAG1', 0, 5, '', 0, 12, 25, 1);
|
||||||
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('DE-WEIHNACHTSTAG2', 0, 5, '', 0, 12, 26, 1);
|
||||||
|
|
||||||
-- Austria (41)
|
-- Austria (41)
|
||||||
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('AT-EASTER', 0, 41, 'eastermonday', 0, 0, 0, 1);
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('AT-EASTER', 0, 41, 'eastermonday', 0, 0, 0, 1);
|
||||||
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('AT-ASCENSION', 0, 41, 'ascension', 0, 0, 0, 1);
|
INSERT INTO llx_c_hrm_public_holiday (code, entity, fk_country, dayrule, year, month, day, active) VALUES('AT-ASCENSION', 0, 41, 'ascension', 0, 0, 0, 1);
|
||||||
|
|||||||
@ -43,6 +43,8 @@ create table llx_commande_fournisseur_dispatch_extrafields
|
|||||||
|
|
||||||
ALTER TABLE llx_commande_fournisseur_dispatch_extrafields ADD INDEX idx_commande_fournisseur_dispatch_extrafields (fk_object);
|
ALTER TABLE llx_commande_fournisseur_dispatch_extrafields ADD INDEX idx_commande_fournisseur_dispatch_extrafields (fk_object);
|
||||||
|
|
||||||
|
ALTER TABLE llx_product_fournisseur_price ADD COLUMN packaging double(24,8) DEFAULT 1;
|
||||||
|
|
||||||
UPDATE llx_accounting_system SET fk_country = NULL, active = 0 WHERE pcg_version = 'SYSCOHADA';
|
UPDATE llx_accounting_system SET fk_country = NULL, active = 0 WHERE pcg_version = 'SYSCOHADA';
|
||||||
|
|
||||||
create table llx_c_shipment_package_type
|
create table llx_c_shipment_package_type
|
||||||
|
|||||||
@ -566,7 +566,8 @@ INSERT INTO llx_c_socialnetworks (entity, code, label, url, icon, active) VALUES
|
|||||||
-- VMYSQL4.1 INSERT INTO llx_boxes_def (file, entity) SELECT 'box_customers_outstanding_bill_reached.php', 1 FROM DUAL WHERE NOT EXISTS (SELECT * FROM llx_boxes_def WHERE file = 'box_customers_outstanding_bill_reached.php' AND entity = 1);
|
-- VMYSQL4.1 INSERT INTO llx_boxes_def (file, entity) SELECT 'box_customers_outstanding_bill_reached.php', 1 FROM DUAL WHERE NOT EXISTS (SELECT * FROM llx_boxes_def WHERE file = 'box_customers_outstanding_bill_reached.php' AND entity = 1);
|
||||||
-- VMYSQL4.1 INSERT INTO llx_boxes_def (file, entity) SELECT 'box_scheduled_jobs.php', 1 FROM DUAL WHERE NOT EXISTS (SELECT * FROM llx_boxes_def WHERE file = 'box_scheduled_jobs.php' AND entity = 1);
|
-- VMYSQL4.1 INSERT INTO llx_boxes_def (file, entity) SELECT 'box_scheduled_jobs.php', 1 FROM DUAL WHERE NOT EXISTS (SELECT * FROM llx_boxes_def WHERE file = 'box_scheduled_jobs.php' AND entity = 1);
|
||||||
|
|
||||||
ALTER TABLE llx_product_fournisseur_price ADD COLUMN packaging varchar(64);
|
ALTER TABLE llx_product_fournisseur_price ADD COLUMN packaging varchar(64) DEFAULT NULL;
|
||||||
|
ALTER TABLE llx_product_fournisseur_price MODIFY COLUMN packaging varchar(64) DEFAULT NULL;
|
||||||
|
|
||||||
ALTER TABLE llx_projet ADD COLUMN fk_opp_status_end integer DEFAULT NULL;
|
ALTER TABLE llx_projet ADD COLUMN fk_opp_status_end integer DEFAULT NULL;
|
||||||
|
|
||||||
|
|||||||
@ -84,6 +84,9 @@ UPDATE llx_const set value = __ENCRYPT('eldy')__ WHERE __DECRYPT('value')__ = 'a
|
|||||||
UPDATE llx_const set value = __ENCRYPT('eldy')__ WHERE __DECRYPT('value')__ = 'cameleo';
|
UPDATE llx_const set value = __ENCRYPT('eldy')__ WHERE __DECRYPT('value')__ = 'cameleo';
|
||||||
DELETE FROM llx_user_param where param = 'MAIN_THEME' and value in ('auguria', 'amarok', 'cameleo');
|
DELETE FROM llx_user_param where param = 'MAIN_THEME' and value in ('auguria', 'amarok', 'cameleo');
|
||||||
|
|
||||||
|
ALTER TABLE llx_product_fournisseur_price ADD COLUMN packaging varchar(64) DEFAULT NULL;
|
||||||
|
ALTER TABLE llx_product_fournisseur_price MODIFY COLUMN packaging varchar(64) DEFAULT NULL;
|
||||||
|
|
||||||
|
|
||||||
-- For v14
|
-- For v14
|
||||||
|
|
||||||
|
|||||||
@ -35,6 +35,9 @@
|
|||||||
-- VMYSQL4.3 ALTER TABLE llx_partnership MODIFY COLUMN date_partnership_end date NULL;
|
-- VMYSQL4.3 ALTER TABLE llx_partnership MODIFY COLUMN date_partnership_end date NULL;
|
||||||
-- VPGSQL8.2 ALTER TABLE llx_partnership ALTER COLUMN date_partnership_end DROP NOT NULL;
|
-- VPGSQL8.2 ALTER TABLE llx_partnership ALTER COLUMN date_partnership_end DROP NOT NULL;
|
||||||
|
|
||||||
|
ALTER TABLE llx_product_fournisseur_price ADD COLUMN packaging varchar(64) DEFAULT NULL;
|
||||||
|
ALTER TABLE llx_product_fournisseur_price MODIFY COLUMN packaging varchar(64) DEFAULT NULL;
|
||||||
|
|
||||||
ALTER TABLE llx_accounting_bookkeeping ADD COLUMN date_export datetime DEFAULT NULL;
|
ALTER TABLE llx_accounting_bookkeeping ADD COLUMN date_export datetime DEFAULT NULL;
|
||||||
|
|
||||||
ALTER TABLE llx_eventorganization_conferenceorboothattendee ADD COLUMN fk_project integer NOT NULL;
|
ALTER TABLE llx_eventorganization_conferenceorboothattendee ADD COLUMN fk_project integer NOT NULL;
|
||||||
|
|||||||
@ -274,15 +274,21 @@ ALTER TABLE llx_bank_account ADD COLUMN pti_in_ctti smallint DEFAULT 0 AFTER dom
|
|||||||
-- Set default ticket type to OTHER if no default exists
|
-- Set default ticket type to OTHER if no default exists
|
||||||
UPDATE llx_c_ticket_type SET use_default=1 WHERE code='OTHER' AND NOT EXISTS(SELECT * FROM (SELECT * FROM llx_c_ticket_type) AS t WHERE use_default=1);
|
UPDATE llx_c_ticket_type SET use_default=1 WHERE code='OTHER' AND NOT EXISTS(SELECT * FROM (SELECT * FROM llx_c_ticket_type) AS t WHERE use_default=1);
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TABLE llx_propal ADD last_main_doc VARCHAR(255) NULL AFTER model_pdf;
|
||||||
|
|
||||||
UPDATE llx_c_country SET eec=0 WHERE eec IS NULL;
|
UPDATE llx_c_country SET eec=0 WHERE eec IS NULL;
|
||||||
ALTER TABLE llx_c_country MODIFY COLUMN eec tinyint DEFAULT 0 NOT NULL;
|
ALTER TABLE llx_c_country MODIFY COLUMN eec tinyint DEFAULT 0 NOT NULL;
|
||||||
|
|
||||||
ALTER TABLE llx_c_availability ADD COLUMN type_duration char(1);
|
ALTER TABLE llx_c_availability ADD COLUMN type_duration char(1);
|
||||||
ALTER TABLE llx_c_availability ADD COLUMN number real DEFAULT 0;
|
ALTER TABLE llx_c_availability ADD COLUMN number real DEFAULT 0;
|
||||||
|
|
||||||
delete from llx_c_availability WHERE rowid IN (1,2,3,4,5);
|
|
||||||
INSERT INTO llx_c_availability (rowid,code,label,type_duration,number,active,position) VALUES (1, 'AV_NOW', 'Immediate', null, 0, 1, 10);
|
INSERT INTO llx_c_availability (rowid,code,label,type_duration,number,active,position) VALUES (1, 'AV_NOW', 'Immediate', null, 0, 1, 10);
|
||||||
INSERT INTO llx_c_availability (rowid,code,label,type_duration,number,active,position) VALUES (2, 'AV_1W', '1 week', 'w', 1, 1, 20);
|
INSERT INTO llx_c_availability (rowid,code,label,type_duration,number,active,position) VALUES (2, 'AV_1W', '1 week', 'w', 1, 1, 20);
|
||||||
INSERT INTO llx_c_availability (rowid,code,label,type_duration,number,active,position) VALUES (3, 'AV_2W', '2 weeks', 'w', 2, 1, 30);
|
INSERT INTO llx_c_availability (rowid,code,label,type_duration,number,active,position) VALUES (3, 'AV_2W', '2 weeks', 'w', 2, 1, 30);
|
||||||
INSERT INTO llx_c_availability (rowid,code,label,type_duration,number,active,position) VALUES (4, 'AV_3W', '3 weeks', 'w', 3, 1, 40);
|
INSERT INTO llx_c_availability (rowid,code,label,type_duration,number,active,position) VALUES (4, 'AV_3W', '3 weeks', 'w', 3, 1, 40);
|
||||||
INSERT INTO llx_c_availability (rowid,code,label,type_duration,number,active,position) VALUES (5, 'AV_4W', '4 weeks', 'w', 4, 1, 50);
|
INSERT INTO llx_c_availability (rowid,code,label,type_duration,number,active,position) VALUES (5, 'AV_4W', '4 weeks', 'w', 4, 1, 50);
|
||||||
|
UPDATE llx_c_availability SET type_duration = null, number = 0 WHERE code = 'AV_NOW';
|
||||||
|
UPDATE llx_c_availability SET type_duration = 'w', number = 1 WHERE code = 'AV_1W';
|
||||||
|
UPDATE llx_c_availability SET type_duration = 'w', number = 2 WHERE code = 'AV_2W';
|
||||||
|
UPDATE llx_c_availability SET type_duration = 'w', number = 3 WHERE code = 'AV_3W';
|
||||||
|
UPDATE llx_c_availability SET type_duration = 'w', number = 4 WHERE code = 'AV_4W';
|
||||||
|
|||||||
@ -50,8 +50,7 @@ create table llx_product_fournisseur_price
|
|||||||
import_key varchar(14), -- Import key
|
import_key varchar(14), -- Import key
|
||||||
delivery_time_days integer,
|
delivery_time_days integer,
|
||||||
supplier_reputation varchar(10),
|
supplier_reputation varchar(10),
|
||||||
packaging varchar(64),
|
packaging varchar(64) DEFAULT NULL,
|
||||||
|
|
||||||
fk_multicurrency integer,
|
fk_multicurrency integer,
|
||||||
multicurrency_code varchar(3),
|
multicurrency_code varchar(3),
|
||||||
multicurrency_tx double(24,8) DEFAULT 1,
|
multicurrency_tx double(24,8) DEFAULT 1,
|
||||||
|
|||||||
@ -78,6 +78,7 @@ create table llx_societe
|
|||||||
note_private text, --
|
note_private text, --
|
||||||
note_public text, --
|
note_public text, --
|
||||||
model_pdf varchar(255),
|
model_pdf varchar(255),
|
||||||
|
last_main_doc varchar(255), -- relative filepath+filename of last main generated document
|
||||||
prefix_comm varchar(5), -- prefix commercial (deprecated)
|
prefix_comm varchar(5), -- prefix commercial (deprecated)
|
||||||
client tinyint DEFAULT 0, -- client 0/1/2
|
client tinyint DEFAULT 0, -- client 0/1/2
|
||||||
fournisseur tinyint DEFAULT 0, -- fournisseur 0/1
|
fournisseur tinyint DEFAULT 0, -- fournisseur 0/1
|
||||||
|
|||||||
@ -82,6 +82,8 @@ UseMenuModuleToolsToAddCronJobs=Go into menu "<a href="%s">Home - Admin tools -
|
|||||||
JobDisabled=Job disabled
|
JobDisabled=Job disabled
|
||||||
MakeLocalDatabaseDumpShort=Local database backup
|
MakeLocalDatabaseDumpShort=Local database backup
|
||||||
MakeLocalDatabaseDump=Create a local database dump. Parameters are: compression ('gz' or 'bz' or 'none'), backup type ('mysql', 'pgsql', 'auto'), 1, 'auto' or filename to build, number of backup files to keep
|
MakeLocalDatabaseDump=Create a local database dump. Parameters are: compression ('gz' or 'bz' or 'none'), backup type ('mysql', 'pgsql', 'auto'), 1, 'auto' or filename to build, number of backup files to keep
|
||||||
|
MakeSendLocalDatabaseDumpShort=Send local database backup
|
||||||
|
MakeSendLocalDatabaseDump=Send local database backup by email. Parameters are: to, from, subject, message, filename (Name of file sent), filter ('sql' for backup of database only)
|
||||||
WarningCronDelayed=Attention, for performance purpose, whatever is next date of execution of enabled jobs, your jobs may be delayed to a maximum of %s hours, before being run.
|
WarningCronDelayed=Attention, for performance purpose, whatever is next date of execution of enabled jobs, your jobs may be delayed to a maximum of %s hours, before being run.
|
||||||
DATAPOLICYJob=Data cleaner and anonymizer
|
DATAPOLICYJob=Data cleaner and anonymizer
|
||||||
JobXMustBeEnabled=Job %s must be enabled
|
JobXMustBeEnabled=Job %s must be enabled
|
||||||
|
|||||||
@ -142,6 +142,9 @@ TicketsDelayBeforeFirstAnswer=A new ticket should receive a first answer before
|
|||||||
TicketsDelayBeforeFirstAnswerHelp=If a new ticket has not received an answer after this time period (in hours), an important warning icon will be displayed in the list view.
|
TicketsDelayBeforeFirstAnswerHelp=If a new ticket has not received an answer after this time period (in hours), an important warning icon will be displayed in the list view.
|
||||||
TicketsDelayBetweenAnswers=An unresolved ticket should not be unactive during (hours):
|
TicketsDelayBetweenAnswers=An unresolved ticket should not be unactive during (hours):
|
||||||
TicketsDelayBetweenAnswersHelp=If an unresolved ticket that has already received an answer has not had further interaction after this time period (in hours), a warning icon will be displayed in the list view.
|
TicketsDelayBetweenAnswersHelp=If an unresolved ticket that has already received an answer has not had further interaction after this time period (in hours), a warning icon will be displayed in the list view.
|
||||||
|
TicketsAutoNotifyClose=Automatically notify thirdparty when closing a ticket
|
||||||
|
TicketsAutoNotifyCloseHelp=When closing a ticket, you will be proposed to send a message to one of thirdparty's contacts. On mass closing, a message will be sent to one contact of the thirdparty linked to the ticket.
|
||||||
|
TicketWrongContact=Provided contact is not part of current ticket contacts. Email not sent.
|
||||||
|
|
||||||
#
|
#
|
||||||
# Index & list page
|
# Index & list page
|
||||||
@ -158,6 +161,8 @@ OrderByDateAsc=Sort by ascending date
|
|||||||
OrderByDateDesc=Sort by descending date
|
OrderByDateDesc=Sort by descending date
|
||||||
ShowAsConversation=Show as conversation list
|
ShowAsConversation=Show as conversation list
|
||||||
MessageListViewType=Show as table list
|
MessageListViewType=Show as table list
|
||||||
|
ConfirmMassTicketClosingSendEmail=Automatically send emails when closing tickets
|
||||||
|
ConfirmMassTicketClosingSendEmailQuestion=Do you want to notify thirdparties when closing these tickets ?
|
||||||
|
|
||||||
#
|
#
|
||||||
# Ticket card
|
# Ticket card
|
||||||
@ -245,6 +250,9 @@ TicketChangeStatus=Change status
|
|||||||
TicketConfirmChangeStatus=Confirm the status change: %s ?
|
TicketConfirmChangeStatus=Confirm the status change: %s ?
|
||||||
TicketLogStatusChanged=Status changed: %s to %s
|
TicketLogStatusChanged=Status changed: %s to %s
|
||||||
TicketNotNotifyTiersAtCreate=Not notify company at create
|
TicketNotNotifyTiersAtCreate=Not notify company at create
|
||||||
|
NotifyThirdpartyOnTicketClosing=Contacts to notify while closing the ticket
|
||||||
|
TicketNotifyAllTiersAtClose=All related contacts
|
||||||
|
TicketNotNotifyTiersAtClose=No related contact
|
||||||
Unread=Unread
|
Unread=Unread
|
||||||
TicketNotCreatedFromPublicInterface=Not available. Ticket was not created from public interface.
|
TicketNotCreatedFromPublicInterface=Not available. Ticket was not created from public interface.
|
||||||
ErrorTicketRefRequired=Ticket reference name is required
|
ErrorTicketRefRequired=Ticket reference name is required
|
||||||
@ -279,6 +287,7 @@ TicketNewEmailBodyInfosTicket=Information for monitoring the ticket
|
|||||||
TicketNewEmailBodyInfosTrackId=Ticket tracking number: %s
|
TicketNewEmailBodyInfosTrackId=Ticket tracking number: %s
|
||||||
TicketNewEmailBodyInfosTrackUrl=You can view the progress of the ticket by clicking the link above.
|
TicketNewEmailBodyInfosTrackUrl=You can view the progress of the ticket by clicking the link above.
|
||||||
TicketNewEmailBodyInfosTrackUrlCustomer=You can view the progress of the ticket in the specific interface by clicking the following link
|
TicketNewEmailBodyInfosTrackUrlCustomer=You can view the progress of the ticket in the specific interface by clicking the following link
|
||||||
|
TicketCloseEmailBodyInfosTrackUrlCustomer=You can consult the history of this ticket by clicking the following link
|
||||||
TicketEmailPleaseDoNotReplyToThisEmail=Please do not reply directly to this email! Use the link to reply into the interface.
|
TicketEmailPleaseDoNotReplyToThisEmail=Please do not reply directly to this email! Use the link to reply into the interface.
|
||||||
TicketPublicInfoCreateTicket=This form allows you to record a support ticket in our management system.
|
TicketPublicInfoCreateTicket=This form allows you to record a support ticket in our management system.
|
||||||
TicketPublicPleaseBeAccuratelyDescribe=Please accurately describe the problem. Provide the most information possible to allow us to correctly identify your request.
|
TicketPublicPleaseBeAccuratelyDescribe=Please accurately describe the problem. Provide the most information possible to allow us to correctly identify your request.
|
||||||
@ -300,6 +309,10 @@ NewUser=New user
|
|||||||
NumberOfTicketsByMonth=Number of tickets per month
|
NumberOfTicketsByMonth=Number of tickets per month
|
||||||
NbOfTickets=Number of tickets
|
NbOfTickets=Number of tickets
|
||||||
# notifications
|
# notifications
|
||||||
|
TicketCloseEmailSubjectCustomer=Ticket closed
|
||||||
|
TicketCloseEmailBodyCustomer=This is an automatic message to notify you that ticket %s has just been closed.
|
||||||
|
TicketCloseEmailSubjectAdmin=Ticket closed - Réf %s (public ticket ID %s)
|
||||||
|
TicketCloseEmailBodyAdmin=A ticket with ID #%s has just been closed, see information:
|
||||||
TicketNotificationEmailSubject=Ticket %s updated
|
TicketNotificationEmailSubject=Ticket %s updated
|
||||||
TicketNotificationEmailBody=This is an automatic message to notify you that ticket %s has just been updated
|
TicketNotificationEmailBody=This is an automatic message to notify you that ticket %s has just been updated
|
||||||
TicketNotificationRecipient=Notification recipient
|
TicketNotificationRecipient=Notification recipient
|
||||||
|
|||||||
@ -113,8 +113,8 @@ class Mo extends CommonObject
|
|||||||
'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-2, 'position'=>500, 'notnull'=>1,),
|
'date_creation' => array('type'=>'datetime', 'label'=>'DateCreation', 'enabled'=>1, 'visible'=>-2, 'position'=>500, 'notnull'=>1,),
|
||||||
'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>1, 'visible'=>-2, 'position'=>501, 'notnull'=>1,),
|
'tms' => array('type'=>'timestamp', 'label'=>'DateModification', 'enabled'=>1, 'visible'=>-2, 'position'=>501, 'notnull'=>1,),
|
||||||
'date_valid' => array('type'=>'datetime', 'label'=>'DateValidation', 'enabled'=>1, 'visible'=>-2, 'position'=>502,),
|
'date_valid' => array('type'=>'datetime', 'label'=>'DateValidation', 'enabled'=>1, 'visible'=>-2, 'position'=>502,),
|
||||||
'fk_user_creat' => array('type'=>'integer', 'label'=>'UserAuthor', 'enabled'=>1, 'visible'=>-2, 'position'=>510, 'notnull'=>1, 'foreignkey'=>'user.rowid', 'csslist'=>'tdoverflowmax100'),
|
'fk_user_creat' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserAuthor', 'enabled'=>1, 'visible'=>-2, 'position'=>510, 'notnull'=>1, 'foreignkey'=>'user.rowid', 'csslist'=>'tdoverflowmax100'),
|
||||||
'fk_user_modif' => array('type'=>'integer', 'label'=>'UserModif', 'enabled'=>1, 'visible'=>-2, 'position'=>511, 'notnull'=>-1, 'csslist'=>'tdoverflowmax100'),
|
'fk_user_modif' => array('type'=>'integer:User:user/class/user.class.php', 'label'=>'UserModif', 'enabled'=>1, 'visible'=>-2, 'position'=>511, 'notnull'=>-1, 'csslist'=>'tdoverflowmax100'),
|
||||||
'date_start_planned' => array('type'=>'datetime', 'label'=>'DateStartPlannedMo', 'enabled'=>1, 'visible'=>1, 'position'=>55, 'notnull'=>-1, 'index'=>1, 'help'=>'KeepEmptyForAsap'),
|
'date_start_planned' => array('type'=>'datetime', 'label'=>'DateStartPlannedMo', 'enabled'=>1, 'visible'=>1, 'position'=>55, 'notnull'=>-1, 'index'=>1, 'help'=>'KeepEmptyForAsap'),
|
||||||
'date_end_planned' => array('type'=>'datetime', 'label'=>'DateEndPlannedMo', 'enabled'=>1, 'visible'=>1, 'position'=>56, 'notnull'=>-1, 'index'=>1,),
|
'date_end_planned' => array('type'=>'datetime', 'label'=>'DateEndPlannedMo', 'enabled'=>1, 'visible'=>1, 'position'=>56, 'notnull'=>-1, 'index'=>1,),
|
||||||
'import_key' => array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>-2, 'position'=>1000, 'notnull'=>-1,),
|
'import_key' => array('type'=>'varchar(14)', 'label'=>'ImportId', 'enabled'=>1, 'visible'=>-2, 'position'=>1000, 'notnull'=>-1,),
|
||||||
|
|||||||
@ -493,20 +493,20 @@ class MultiCurrency extends CommonObject
|
|||||||
/**
|
/**
|
||||||
* Get id of currency from code
|
* Get id of currency from code
|
||||||
*
|
*
|
||||||
* @param DoliDB $db object db
|
* @param DoliDB $dbs object db
|
||||||
* @param string $code code value search
|
* @param string $code code value search
|
||||||
*
|
*
|
||||||
* @return int 0 if not found, >0 if OK
|
* @return int 0 if not found, >0 if OK
|
||||||
*/
|
*/
|
||||||
public static function getIdFromCode($db, $code)
|
public static function getIdFromCode($dbs, $code)
|
||||||
{
|
{
|
||||||
global $conf;
|
global $conf;
|
||||||
|
|
||||||
$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."multicurrency WHERE code = '".$db->escape($code)."' AND entity = ".$conf->entity;
|
$sql = "SELECT rowid FROM ".MAIN_DB_PREFIX."multicurrency WHERE code = '".$dbs->escape($code)."' AND entity = ".((int) $conf->entity);
|
||||||
|
|
||||||
dol_syslog(__METHOD__, LOG_DEBUG);
|
dol_syslog(__METHOD__, LOG_DEBUG);
|
||||||
$resql = $db->query($sql);
|
$resql = $dbs->query($sql);
|
||||||
if ($resql && $obj = $db->fetch_object($resql)) {
|
if ($resql && $obj = $dbs->fetch_object($resql)) {
|
||||||
return $obj->rowid;
|
return $obj->rowid;
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
@ -516,38 +516,38 @@ class MultiCurrency extends CommonObject
|
|||||||
/**
|
/**
|
||||||
* Get id and rate of currency from code
|
* Get id and rate of currency from code
|
||||||
*
|
*
|
||||||
* @param DoliDB $db Object db
|
* @param DoliDB $dbs Object db
|
||||||
* @param string $code Code value search
|
* @param string $code Code value search
|
||||||
* @param integer $date_document Date from document (propal, order, invoice, ...)
|
* @param integer $date_document Date from document (propal, order, invoice, ...)
|
||||||
*
|
*
|
||||||
* @return array [0] => id currency
|
* @return array [0] => id currency
|
||||||
* [1] => rate
|
* [1] => rate
|
||||||
*/
|
*/
|
||||||
public static function getIdAndTxFromCode($db, $code, $date_document = '')
|
public static function getIdAndTxFromCode($dbs, $code, $date_document = '')
|
||||||
{
|
{
|
||||||
global $conf;
|
global $conf;
|
||||||
|
|
||||||
$sql1 = "SELECT m.rowid, mc.rate FROM ".MAIN_DB_PREFIX."multicurrency m";
|
$sql1 = "SELECT m.rowid, mc.rate FROM ".MAIN_DB_PREFIX."multicurrency m";
|
||||||
|
|
||||||
$sql1 .= ' LEFT JOIN '.MAIN_DB_PREFIX.'multicurrency_rate mc ON (m.rowid = mc.fk_multicurrency)';
|
$sql1 .= ' LEFT JOIN '.MAIN_DB_PREFIX.'multicurrency_rate mc ON (m.rowid = mc.fk_multicurrency)';
|
||||||
$sql1 .= " WHERE m.code = '".$db->escape($code)."'";
|
$sql1 .= " WHERE m.code = '".$dbs->escape($code)."'";
|
||||||
$sql1 .= " AND m.entity IN (".getEntity('multicurrency').")";
|
$sql1 .= " AND m.entity IN (".getEntity('multicurrency').")";
|
||||||
$sql2 = '';
|
$sql2 = '';
|
||||||
if (!empty($conf->global->MULTICURRENCY_USE_RATE_ON_DOCUMENT_DATE) && !empty($date_document)) { // Use last known rate compared to document date
|
if (!empty($conf->global->MULTICURRENCY_USE_RATE_ON_DOCUMENT_DATE) && !empty($date_document)) { // Use last known rate compared to document date
|
||||||
$tmparray = dol_getdate($date_document);
|
$tmparray = dol_getdate($date_document);
|
||||||
$sql2 .= " AND mc.date_sync <= '".$db->idate(dol_mktime(23, 59, 59, $tmparray['mon'], $tmparray['mday'], $tmparray['year'], true))."'";
|
$sql2 .= " AND mc.date_sync <= '".$dbs->idate(dol_mktime(23, 59, 59, $tmparray['mon'], $tmparray['mday'], $tmparray['year'], true))."'";
|
||||||
}
|
}
|
||||||
$sql3 = " ORDER BY mc.date_sync DESC LIMIT 1";
|
$sql3 = " ORDER BY mc.date_sync DESC LIMIT 1";
|
||||||
|
|
||||||
dol_syslog(__METHOD__, LOG_DEBUG);
|
dol_syslog(__METHOD__, LOG_DEBUG);
|
||||||
$resql = $db->query($sql1.$sql2.$sql3);
|
$resql = $dbs->query($sql1.$sql2.$sql3);
|
||||||
|
|
||||||
if ($resql && $obj = $db->fetch_object($resql)) {
|
if ($resql && $obj = $dbs->fetch_object($resql)) {
|
||||||
return array($obj->rowid, $obj->rate);
|
return array($obj->rowid, $obj->rate);
|
||||||
} else {
|
} else {
|
||||||
if (!empty($conf->global->MULTICURRENCY_USE_RATE_ON_DOCUMENT_DATE)) {
|
if (!empty($conf->global->MULTICURRENCY_USE_RATE_ON_DOCUMENT_DATE)) {
|
||||||
$resql = $db->query($sql1.$sql3);
|
$resql = $dbs->query($sql1.$sql3);
|
||||||
if ($resql && $obj = $db->fetch_object($resql)) {
|
if ($resql && $obj = $dbs->fetch_object($resql)) {
|
||||||
return array($obj->rowid, $obj->rate);
|
return array($obj->rowid, $obj->rate);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -746,7 +746,7 @@ class CurrencyRate extends CommonObjectLine
|
|||||||
*/
|
*/
|
||||||
public function __construct(DoliDB $db)
|
public function __construct(DoliDB $db)
|
||||||
{
|
{
|
||||||
$this->db = &$db;
|
$this->db = $db;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -250,6 +250,7 @@ if (!in_array($action, array("updateRate", "deleteRate"))) {
|
|||||||
print '<form action="'.$_SERVER["PHP_SELF"].'" method="post" name="formulaire">';
|
print '<form action="'.$_SERVER["PHP_SELF"].'" method="post" name="formulaire">';
|
||||||
print '<input type="hidden" name="token" value="'.newToken().'">';
|
print '<input type="hidden" name="token" value="'.newToken().'">';
|
||||||
|
|
||||||
|
print '<div class="div-table-responsive-no-min">';
|
||||||
print '<table class="noborder centpercent"><tr>';
|
print '<table class="noborder centpercent"><tr>';
|
||||||
|
|
||||||
print ' <td>'.$langs->trans('Date').'</td>';
|
print ' <td>'.$langs->trans('Date').'</td>';
|
||||||
@ -265,10 +266,12 @@ if (!in_array($action, array("updateRate", "deleteRate"))) {
|
|||||||
|
|
||||||
print '<td>';
|
print '<td>';
|
||||||
print '<input type="hidden" name="action" value="create">';
|
print '<input type="hidden" name="action" value="create">';
|
||||||
print '<input type="submit" class="butAction" name="btnCreateCurrencyRate" value="'.$langs->trans('CreateRate').'">';
|
print '<input type="submit" class="button button-add small" name="btnCreateCurrencyRate" value="'.$langs->trans('CreateRate').'">';
|
||||||
print '</td>';
|
print '</td>';
|
||||||
|
|
||||||
print '</tr></table>';
|
print '</tr></table>';
|
||||||
|
print '</div>';
|
||||||
|
|
||||||
print '</form>';
|
print '</form>';
|
||||||
|
|
||||||
print '<br>';
|
print '<br>';
|
||||||
@ -404,7 +407,7 @@ if ($resql) {
|
|||||||
$selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
|
$selectedfields .= $form->showCheckAddButtons('checkforselect', 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
print '<div class="div-table-responsive-no-min">';
|
print '<div class="div-table-responsive">';
|
||||||
print '<table class="tagtable centpercent nomarginbottom liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
|
print '<table class="tagtable centpercent nomarginbottom liste'.($moreforfilter ? " listwithfilterbefore" : "").'">'."\n";
|
||||||
|
|
||||||
// Lines with input filters
|
// Lines with input filters
|
||||||
@ -426,7 +429,7 @@ if ($resql) {
|
|||||||
// rate
|
// rate
|
||||||
if (!empty($arrayfields['cr.rate']['checked'])) {
|
if (!empty($arrayfields['cr.rate']['checked'])) {
|
||||||
print '<td class="liste_titre" align="left">';
|
print '<td class="liste_titre" align="left">';
|
||||||
print '<input class="flat" type="text" name="search_rate" size="8" value="'.dol_escape_htmltag($search_rate).'">';
|
print '<input class="flat maxwidth75" type="text" name="search_rate" value="'.dol_escape_htmltag($search_rate).'">';
|
||||||
print '</td>';
|
print '</td>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -150,25 +150,8 @@ if ($action == 'other') {
|
|||||||
$value = GETPOST('activate_FillProductDescAuto', 'alpha');
|
$value = GETPOST('activate_FillProductDescAuto', 'alpha');
|
||||||
$res = dolibarr_set_const($db, "PRODUIT_AUTOFILL_DESC", $value, 'chaine', 0, '', $conf->entity);
|
$res = dolibarr_set_const($db, "PRODUIT_AUTOFILL_DESC", $value, 'chaine', 0, '', $conf->entity);
|
||||||
|
|
||||||
if ($value) {
|
|
||||||
$sql_test = "SELECT count(desc_fourn) as cpt FROM ".MAIN_DB_PREFIX."product_fournisseur_price WHERE 1";
|
|
||||||
$resql = $db->query($sql_test);
|
|
||||||
if (!$resql && $db->lasterrno == 'DB_ERROR_NOSUCHFIELD') { // if the field does not exist, we create it
|
|
||||||
$sql_new = "ALTER TABLE ".MAIN_DB_PREFIX."product_fournisseur_price ADD COLUMN desc_fourn text";
|
|
||||||
$resql_new = $db->query($sql_new);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$value = GETPOST('activate_useProdSupplierPackaging', 'alpha');
|
$value = GETPOST('activate_useProdSupplierPackaging', 'alpha');
|
||||||
$res = dolibarr_set_const($db, "PRODUCT_USE_SUPPLIER_PACKAGING", $value, 'chaine', 0, '', $conf->entity);
|
$res = dolibarr_set_const($db, "PRODUCT_USE_SUPPLIER_PACKAGING", $value, 'chaine', 0, '', $conf->entity);
|
||||||
if ($value) {
|
|
||||||
$sql_test = "SELECT count(packaging) as cpt FROM ".MAIN_DB_PREFIX."product_fournisseur_price WHERE 1";
|
|
||||||
$resql = $db->query($sql_test);
|
|
||||||
if (!$resql && $db->lasterrno == 'DB_ERROR_NOSUCHFIELD') { // if the field does not exist, we create it
|
|
||||||
$sql_new = "ALTER TABLE ".MAIN_DB_PREFIX."product_fournisseur_price ADD COLUMN packaging double(24,8) DEFAULT 1";
|
|
||||||
$resql_new = $db->query($sql_new);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($action == 'specimen') { // For products
|
if ($action == 'specimen') { // For products
|
||||||
|
|||||||
@ -1979,7 +1979,10 @@ class Product extends CommonObject
|
|||||||
$sql .= " pfp.multicurrency_price, pfp.multicurrency_unitprice, pfp.multicurrency_tx, pfp.fk_multicurrency, pfp.multicurrency_code,";
|
$sql .= " pfp.multicurrency_price, pfp.multicurrency_unitprice, pfp.multicurrency_tx, pfp.fk_multicurrency, pfp.multicurrency_code,";
|
||||||
$sql .= " pfp.packaging";
|
$sql .= " pfp.packaging";
|
||||||
$sql .= " FROM ".$this->db->prefix()."product_fournisseur_price as pfp";
|
$sql .= " FROM ".$this->db->prefix()."product_fournisseur_price as pfp";
|
||||||
$sql .= " WHERE pfp.fk_product = ".((int) $product_id);
|
$sql .= " WHERE 1 = 1";
|
||||||
|
if ($product_id > 0) {
|
||||||
|
$sql .= " AND pfp.fk_product = ".((int) $product_id);
|
||||||
|
}
|
||||||
if ($fourn_ref != 'none') {
|
if ($fourn_ref != 'none') {
|
||||||
$sql .= " AND pfp.ref_fourn = '".$this->db->escape($fourn_ref)."'";
|
$sql .= " AND pfp.ref_fourn = '".$this->db->escape($fourn_ref)."'";
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2530,9 +2530,10 @@ class Societe extends CommonObject
|
|||||||
* @param int $notooltip 1=Disable tooltip
|
* @param int $notooltip 1=Disable tooltip
|
||||||
* @param int $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking
|
* @param int $save_lastsearch_value -1=Auto, 0=No save of lastsearch_values when clicking, 1=Save lastsearch_values whenclicking
|
||||||
* @param int $noaliasinname 1=Do not add alias into the link ref
|
* @param int $noaliasinname 1=Do not add alias into the link ref
|
||||||
|
* @param string $target add attribute target
|
||||||
* @return string String with URL
|
* @return string String with URL
|
||||||
*/
|
*/
|
||||||
public function getNomUrl($withpicto = 0, $option = '', $maxlen = 0, $notooltip = 0, $save_lastsearch_value = -1, $noaliasinname = 0)
|
public function getNomUrl($withpicto = 0, $option = '', $maxlen = 0, $notooltip = 0, $save_lastsearch_value = -1, $noaliasinname = 0, $target = '')
|
||||||
{
|
{
|
||||||
global $conf, $langs, $hookmanager;
|
global $conf, $langs, $hookmanager;
|
||||||
|
|
||||||
@ -2705,6 +2706,10 @@ class Societe extends CommonObject
|
|||||||
}
|
}
|
||||||
$linkclose .= ' title="'.dol_escape_htmltag($label, 1).'"';
|
$linkclose .= ' title="'.dol_escape_htmltag($label, 1).'"';
|
||||||
$linkclose .= ' class="classfortooltip refurl"';
|
$linkclose .= ' class="classfortooltip refurl"';
|
||||||
|
$target_value = array('_self', '_blank', '_parent', '_top');
|
||||||
|
if (in_array($target, $target_value)) {
|
||||||
|
$linkclose .= ' target="'.dol_escape_htmltag($target).'"';
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
$hookmanager->initHooks(array('thirdpartydao'));
|
$hookmanager->initHooks(array('thirdpartydao'));
|
||||||
|
|||||||
@ -820,10 +820,28 @@ if ($action == 'create' || $action == 'presend') {
|
|||||||
|
|
||||||
// Confirmation close
|
// Confirmation close
|
||||||
if ($action == 'close') {
|
if ($action == 'close') {
|
||||||
print $form->formconfirm($url_page_current."?track_id=".$object->track_id, $langs->trans("CloseATicket"), $langs->trans("ConfirmCloseAticket"), "confirm_close", '', '', 1);
|
$thirdparty_contacts = $object->getInfosTicketExternalContact();
|
||||||
if ($ret == 'html') {
|
$contacts_select = array(
|
||||||
print '<br>';
|
'-2' => $langs->trans('TicketNotifyAllTiersAtClose'),
|
||||||
|
'-3' => $langs->trans('TicketNotNotifyTiersAtClose')
|
||||||
|
);
|
||||||
|
foreach ($thirdparty_contacts as $thirdparty_contact) {
|
||||||
|
$contacts_select[$thirdparty_contact['id']] = $thirdparty_contact['civility'] . ' ' . $thirdparty_contact['lastname'] . ' ' . $thirdparty_contact['firstname'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Default select all or no contact
|
||||||
|
$default = (!empty($conf->global->TICKET_NOTIFY_AT_CLOSING)) ? -2 : -3;
|
||||||
|
$formquestion = array(
|
||||||
|
array(
|
||||||
|
'name' => 'contactid',
|
||||||
|
'type' => 'select',
|
||||||
|
'label' => $langs->trans('NotifyThirdpartyOnTicketClosing'),
|
||||||
|
'values' => $contacts_select,
|
||||||
|
'default' => $default
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
print $form->formconfirm($url_page_current."?track_id=".$object->track_id, $langs->trans("CloseATicket"), $langs->trans("ConfirmCloseAticket"), "confirm_close", $formquestion, '', 1);
|
||||||
}
|
}
|
||||||
// Confirmation abandon
|
// Confirmation abandon
|
||||||
if ($action == 'abandon') {
|
if ($action == 'abandon') {
|
||||||
|
|||||||
@ -185,7 +185,7 @@ if (GETPOST('cancel', 'alpha')) {
|
|||||||
$action = 'list';
|
$action = 'list';
|
||||||
$massaction = '';
|
$massaction = '';
|
||||||
}
|
}
|
||||||
if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend') {
|
if (!GETPOST('confirmmassaction', 'alpha') && $massaction != 'presend' && $massaction != 'confirm_presend' && $massaction != 'presendonclose' && $massaction != 'close') {
|
||||||
$massaction = '';
|
$massaction = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -690,7 +690,7 @@ $arrayofmassactions = array(
|
|||||||
//'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
|
//'builddoc'=>img_picto('', 'pdf', 'class="pictofixedwidth"').$langs->trans("PDFMerge"),
|
||||||
);
|
);
|
||||||
if ($permissiontoadd) {
|
if ($permissiontoadd) {
|
||||||
$arrayofmassactions['close'] = img_picto('', 'close_title', 'class="pictofixedwidth"').$langs->trans("Close");
|
$arrayofmassactions['presendonclose'] = img_picto('', 'close_title', 'class="pictofixedwidth"').$langs->trans("Close");
|
||||||
$arrayofmassactions['reopen'] = img_picto('', 'folder-open', 'class="pictofixedwidth"').$langs->trans("ReOpen");
|
$arrayofmassactions['reopen'] = img_picto('', 'folder-open', 'class="pictofixedwidth"').$langs->trans("ReOpen");
|
||||||
}
|
}
|
||||||
if ($permissiontodelete) {
|
if ($permissiontodelete) {
|
||||||
@ -743,6 +743,17 @@ $objecttmp = new Ticket($db);
|
|||||||
$trackid = 'tic'.$object->id;
|
$trackid = 'tic'.$object->id;
|
||||||
include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
|
include DOL_DOCUMENT_ROOT.'/core/tpl/massactions_pre.tpl.php';
|
||||||
|
|
||||||
|
// confirm auto send on close
|
||||||
|
if ($massaction == 'presendonclose') {
|
||||||
|
$hidden_form = array([
|
||||||
|
"type" => "hidden",
|
||||||
|
"name" => "massaction",
|
||||||
|
"value" => "close"
|
||||||
|
]);
|
||||||
|
$selectedchoice = (!empty($conf->global->TICKET_NOTIFY_AT_CLOSING)) ? "yes" : "no";
|
||||||
|
print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassTicketClosingSendEmail"), $langs->trans("ConfirmMassTicketClosingSendEmailQuestion"), 'confirm_send_close', $hidden_form, $selectedchoice, 0, 200, 500, 1);
|
||||||
|
}
|
||||||
|
|
||||||
if ($search_all) {
|
if ($search_all) {
|
||||||
foreach ($fieldstosearchall as $key => $val) {
|
foreach ($fieldstosearchall as $key => $val) {
|
||||||
$fieldstosearchall[$key] = $langs->trans($val);
|
$fieldstosearchall[$key] = $langs->trans($val);
|
||||||
|
|||||||
@ -204,14 +204,10 @@ class CodingPhpTest extends PHPUnit\Framework\TestCase
|
|||||||
'commonobject.class.php',
|
'commonobject.class.php',
|
||||||
'conf.class.php',
|
'conf.class.php',
|
||||||
'html.form.class.php',
|
'html.form.class.php',
|
||||||
'html.formmail.class.php',
|
|
||||||
'translate.class.php',
|
'translate.class.php',
|
||||||
'utils.class.php',
|
'utils.class.php',
|
||||||
'modules_product.class.php',
|
|
||||||
'modules_societe.class.php',
|
|
||||||
'TraceableDB.php',
|
'TraceableDB.php',
|
||||||
'multicurrency.class.php',
|
'multicurrency.class.php',
|
||||||
'reception.class.php',
|
|
||||||
'infobox.class.php'
|
'infobox.class.php'
|
||||||
))) {
|
))) {
|
||||||
// Must not find $db->
|
// Must not find $db->
|
||||||
@ -365,7 +361,7 @@ class CodingPhpTest extends PHPUnit\Framework\TestCase
|
|||||||
$matches=array();
|
$matches=array();
|
||||||
preg_match_all('/(sql|SET|WHERE|INSERT|VALUES|LIKE).+\s*\'"\s*\.\s*\$(.......)/', $filecontent, $matches, PREG_SET_ORDER);
|
preg_match_all('/(sql|SET|WHERE|INSERT|VALUES|LIKE).+\s*\'"\s*\.\s*\$(.......)/', $filecontent, $matches, PREG_SET_ORDER);
|
||||||
foreach ($matches as $key => $val) {
|
foreach ($matches as $key => $val) {
|
||||||
if (! in_array($val[2], array('this->d', 'this->e', 'db->esc', 'dbs->es', 'mydb->e', 'dbsessi', 'db->ida', 'escaped', 'exclude', 'include'))) {
|
if (! in_array($val[2], array('this->d', 'this->e', 'db->esc', 'dbs->es', 'dbs->id', 'mydb->e', 'dbsessi', 'db->ida', 'escaped', 'exclude', 'include'))) {
|
||||||
$ok=false; // This will generate error
|
$ok=false; // This will generate error
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user