dolibarr 23.0.3
agenda_reminder.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2017 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
4 * Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
26// Load Dolibarr environment
27require '../main.inc.php';
35require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
36require_once DOL_DOCUMENT_ROOT.'/core/lib/agenda.lib.php';
37require_once DOL_DOCUMENT_ROOT.'/core/class/html.form.class.php';
38require_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
39require_once DOL_DOCUMENT_ROOT.'/cron/class/cronjob.class.php';
40
41if (!$user->admin) {
43}
44
45// Load translation files required by the page
46$langs->loadLangs(array("admin", "other", "agenda"));
47
48$action = GETPOST('action', 'aZ09');
49$value = GETPOST('value', 'alpha');
50$label = GETPOST('label', 'alpha');
51$modulepart = GETPOST('modulepart', 'aZ09'); // Used by actions_setmoduleoptions.inc.php
52
53$param = GETPOST('param', 'alpha');
54$cancel = GETPOST('cancel', 'alpha');
55$scandir = GETPOST('scandir', 'alpha');
56$type = 'action';
57
58$form = new Form($db);
59
60/*
61 * Actions
62 */
63
64include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php';
65
66if (preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) {
67 $code = $reg[1];
68 $value = (GETPOST($code, 'alpha') ? GETPOST($code, 'alpha') : 1);
69 if (dolibarr_set_const($db, $code, $value, 'chaine', 0, '', $conf->entity) > 0) {
70 header("Location: ".$_SERVER["PHP_SELF"]);
71 exit;
72 } else {
73 dol_print_error($db);
74 }
75}
76
77if (preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) {
78 $code = $reg[1];
79 if (dolibarr_del_const($db, $code, $conf->entity) > 0) {
80 header("Location: ".$_SERVER["PHP_SELF"]);
81 exit;
82 } else {
83 dol_print_error($db);
84 }
85}
86if ($action == 'set') {
87 dolibarr_set_const($db, 'AGENDA_USE_EVENT_TYPE_DEFAULT', GETPOST('AGENDA_USE_EVENT_TYPE_DEFAULT'), 'chaine', 0, '', $conf->entity);
88 dolibarr_set_const($db, 'AGENDA_DEFAULT_FILTER_TYPE', GETPOST('AGENDA_DEFAULT_FILTER_TYPE'), 'chaine', 0, '', $conf->entity);
89 dolibarr_set_const($db, 'AGENDA_DEFAULT_FILTER_STATUS', GETPOST('AGENDA_DEFAULT_FILTER_STATUS'), 'chaine', 0, '', $conf->entity);
90 dolibarr_set_const($db, 'AGENDA_DEFAULT_VIEW', GETPOST('AGENDA_DEFAULT_VIEW'), 'chaine', 0, '', $conf->entity);
91 dolibarr_set_const($db, 'AGENDA_DEFAULT_REMINDER_OFFSET', GETPOSTINT('AGENDA_DEFAULT_REMINDER_OFFSET'), 'chaine', 0, '', $conf->entity);
92 dolibarr_set_const($db, 'AGENDA_DEFAULT_REMINDER_OFFSET_UNIT', GETPOST('AGENDA_DEFAULT_REMINDER_OFFSET_UNIT_type_duration'), 'chaine', 0, '', $conf->entity);
93 dolibarr_set_const($db, 'AGENDA_DEFAULT_REMINDER_EMAIL_MODEL', GETPOSTINT('AGENDA_DEFAULT_REMINDER_EMAIL_MODELmodel_mail'), 'chaine', 0, '', $conf->entity);
94 dolibarr_set_const($db, 'AGENDA_DEFAULT_REMINDER_EVENT_TYPES', json_encode(GETPOST('AGENDA_DEFAULT_REMINDER_EVENT_TYPES')), 'chaine', 0, '', $conf->entity);
95} elseif ($action == 'specimen') { // For orders
96 $modele = GETPOST('module', 'alpha');
97
98 $commande = new CommandeFournisseur($db);
99 $commande->initAsSpecimen();
100 $specimenthirdparty = new Societe($db);
101 $specimenthirdparty->initAsSpecimen();
102 $commande->thirdparty = $specimenthirdparty;
103
104 // Search template files
105 $file = '';
106 $classname = '';
107 $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
108 foreach ($dirmodels as $reldir) {
109 $file = dol_buildpath($reldir."core/modules/action/doc/pdf_".$modele.".modules.php", 0);
110 if (file_exists($file)) {
111 $classname = "pdf_".$modele;
112 break;
113 }
114 }
115
116 if ($classname !== '') {
117 require_once $file;
118
119 $module = new $classname($db, $commande);
120 '@phan-var-force pdf_standard_actions $module';
123 if ($module->write_file($commande, $langs) > 0) {
124 header("Location: ".DOL_URL_ROOT."/document.php?modulepart=action&file=SPECIMEN.pdf");
125 exit;
126 } else {
127 setEventMessages($module->error, $module->errors, 'errors');
128 dol_syslog($module->error, LOG_ERR);
129 }
130 } else {
131 setEventMessages($langs->trans("ErrorModuleNotFound"), null, 'errors');
132 dol_syslog($langs->trans("ErrorModuleNotFound"), LOG_ERR);
133 }
134} elseif ($action == 'setmodel') {
135 // Activate a model
136 //print "sssd".$value;
137 $ret = addDocumentModel($value, $type, $label, $scandir);
138} elseif ($action == 'del') {
139 $ret = delDocumentModel($value, $type);
140 if ($ret > 0) {
141 if (getDolGlobalString('ACTION_EVENT_ADDON_PDF') == "$value") {
142 dolibarr_del_const($db, 'ACTION_EVENT_ADDON_PDF', $conf->entity);
143 }
144 }
145} elseif ($action == 'setdoc') {
146 // Set default model
147 if (dolibarr_set_const($db, "ACTION_EVENT_ADDON_PDF", $value, 'chaine', 0, '', $conf->entity)) {
148 // The constant that has been read in front of the new set
149 // is therefore passed through a variable to have a coherent display
150 $conf->global->ACTION_EVENT_ADDON_PDF = $value;
151 }
152
153 // On active le modele
154 $ret = delDocumentModel($value, $type);
155 if ($ret > 0) {
156 $ret = addDocumentModel($value, $type, $label, $scandir);
157 }
158}
159
160
166$dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
167llxHeader('', '', '', '', 0, 0, '', '', '', 'mod-admin page-agenda_reminder');
168
169$linkback = '<a href="'.dolBuildUrl(DOL_URL_ROOT.'/admin/modules.php', ['restore_lastsearch_values' => 1]).'">'.img_picto($langs->trans("BackToModuleList"), 'back', 'class="pictofixedwidth"').'<span class="hideonsmartphone">'.$langs->trans("BackToModuleList").'</span></a>';
170
171print load_fiche_titre($langs->trans("AgendaSetup"), $linkback, 'title_setup');
172
173
174$head = agenda_prepare_head();
175
176print dol_get_fiche_head($head, 'reminders', $langs->trans("Agenda"), -1, 'action');
177
178print '<form action="'.$_SERVER["PHP_SELF"].'" name="agenda">';
179print '<input type="hidden" name="token" value="'.newToken().'">';
180print '<input type="hidden" name="action" value="set">';
181
182print '<table class="noborder allwidth">'."\n";
183print '<tr class="liste_titre">'."\n";
184print '<td>'.$langs->trans("Parameters").'</td>'."\n";
185print '<td class="center">&nbsp;</td>'."\n";
186print '<td class="right"></td>'."\n";
187print '</tr>'."\n";
188
189// AGENDA REMINDER BROWSER
190print '<tr class="oddeven">'."\n";
191print '<td>';
192print $form->textwithpicto($langs->trans('AGENDA_REMINDER_BROWSER'), $langs->trans('AGENDA_REMINDER_BROWSERHelp').'<br>'.$langs->trans('AGENDA_REMINDER_Remind')).'<br>';
193print '</td>'."\n";
194print '<td class="center">&nbsp;</td>'."\n";
195print '<td class="right nowraponall">'."\n";
196
197if (!getDolGlobalString('AGENDA_REMINDER_BROWSER')) {
198 print '<a class="valignmiddle" href="'.$_SERVER['PHP_SELF'].'?action=set_AGENDA_REMINDER_BROWSER&token='.newToken().'">'.img_picto($langs->trans('Disabled'), 'switch_off').'</a>';
199} else {
200 print '<a class="valignmiddle" href="'.$_SERVER['PHP_SELF'].'?action=del_AGENDA_REMINDER_BROWSER&token='.newToken().'">'.img_picto($langs->trans('Enabled'), 'switch_on').'</a>';
201}
202print '</td></tr>'."\n";
203
204
205$job = new Cronjob($db);
206$job->fetch(0, 'ActionComm', 'sendEmailsReminder');
207
208// AGENDA REMINDER EMAIL
209print '<tr class="oddeven">'."\n";
210print '<td>';
211print $form->textwithpicto($langs->trans('AGENDA_REMINDER_EMAIL', $langs->transnoentities("Module2300Name")), $langs->trans('AGENDA_REMINDER_Help', 'E-mail').'<br>'.$langs->trans('AGENDA_REMINDER_Remind'));
212if (isModEnabled('cron')) {
213 if (getDolGlobalString('AGENDA_REMINDER_EMAIL')) {
214 if ($job->id > 0) {
215 if ($job->status == $job::STATUS_ENABLED) {
216 print '<br><span class="opacitymedium">'.$langs->trans("AGENDA_REMINDER_EMAIL_NOTE", $langs->transnoentitiesnoconv("sendEmailsReminder")).'</span>';
217 }
218 }
219 }
220}
221print '</td>'."\n";
222print '<td class="center">&nbsp;</td>'."\n";
223print '<td class="right nowraponall">'."\n";
224if (!isModEnabled('cron')) {
225 print '<span class="opacitymedium">'.$langs->trans("WarningModuleNotActive", $langs->transnoentitiesnoconv("Module2300Name")).'</span>';
226} else {
227 if (!getDolGlobalString('AGENDA_REMINDER_EMAIL')) {
228 print '<a href="'.$_SERVER['PHP_SELF'].'?action=set_AGENDA_REMINDER_EMAIL&token='.newToken().'">'.img_picto($langs->trans('Disabled'), 'switch_off').'</a>';
229 } else {
230 // Get the max frequency of reminder
231 if ($job->id > 0) {
232 if ($job->status != $job::STATUS_ENABLED) {
233 $langs->load("cron");
234 print '<span class="opacitymedium warning">'.$langs->trans("JobXMustBeEnabled", $langs->transnoentitiesnoconv("sendEmailsReminder")).'</span>';
235 } else {
236 print '<a href="'.$_SERVER['PHP_SELF'].'?action=del_AGENDA_REMINDER_EMAIL&token='.newToken().'">'.img_picto($langs->trans('Enabled'), 'switch_on').'</a>';
237 }
238 } else {
239 $langs->load("cron");
240 print '<span class="opacitymedium warning">'.$langs->trans("JobNotFound", $langs->transnoentitiesnoconv("sendEmailsReminder")).'</span>';
241 }
242 }
243}
244print '</td></tr>'."\n";
245
246// AGENDA REMINDER SMS
247print '<tr class="oddeven">'."\n";
248print '<td>';
249print $form->textwithpicto($langs->trans('AGENDA_REMINDER_SMS'), $langs->trans('AGENDA_REMINDER_Help', 'SMS').'<br>'.$langs->trans('AGENDA_REMINDER_Remind'));
250if (isModEnabled('cron')) {
251 if (getDolGlobalString('AGENDA_REMINDER_SMS')) {
252 if ($job->id > 0) {
253 if ($job->status == $job::STATUS_ENABLED) {
254 print '<br><span class="opacitymedium">'.$langs->trans("AGENDA_REMINDER_EMAIL_NOTE", $langs->transnoentitiesnoconv("sendEmailsReminder")).'</span>';
255 }
256 }
257 }
258}
259print '</td>'."\n";
260print '<td class="center">&nbsp;</td>'."\n";
261print '<td class="right nowraponall">'."\n";
262if (!isModEnabled('cron')) {
263 print '<span class="opacitymedium">'.$langs->trans("WarningModuleNotActive", $langs->transnoentitiesnoconv("Module2300Name")).'</span>';
264} else {
265 if (!getDolGlobalString('AGENDA_REMINDER_SMS')) {
266 print '<a class="valignmiddle" href="'.$_SERVER['PHP_SELF'].'?action=set_AGENDA_REMINDER_SMS&token='.newToken().'">'.img_picto($langs->trans('Disabled'), 'switch_off').'</a>';
267 } else {
268 print '<a class="valignmiddle" href="'.$_SERVER['PHP_SELF'].'?action=del_AGENDA_REMINDER_SMS&token='.newToken().'">'.img_picto($langs->trans('Enabled'), 'switch_on').'</a>';
269 }
270}
271print '</td></tr>'."\n";
272
273
274// AGENDA DEFAULT REMINDER EVENT TYPE
275if (getDolGlobalString('AGENDA_REMINDER_BROWSER') || getDolGlobalString('AGENDA_REMINDER_EMAIL') || getDolGlobalString('AGENDA_REMINDER_SMS')) {
276 print '<tr class="oddeven">'."\n";
277 print '<td>';
278 print $langs->trans('AGENDA_DEFAULT_REMINDER_EVENT_TYPES', $langs->transnoentities("Module2300Name"));
279 print '<br><span class="opacitymedium">'.$langs->trans("AGENDA_DEFAULT_REMINDER_EVENT_TYPES_NOTE", $langs->transnoentitiesnoconv("sendEmailsReminder")).'</span>';
280 print '</td>'."\n";
281 print '<td class="center">&nbsp;</td>'."\n";
282 print '<td class="right nowraponall">'."\n";
283 if (!isModEnabled('cron')) {
284 print '<span class="opacitymedium">'.$langs->trans("WarningModuleNotActive", $langs->transnoentitiesnoconv("Module2300Name")).'</span>';
285 } else {
286 if (GETPOSTISSET('AGENDA_DEFAULT_REMINDER_EVENT_TYPES')) {
287 $selected = GETPOST('AGENDA_DEFAULT_REMINDER_EVENT_TYPES');
288 } else {
289 $selected = json_decode(getDolGlobalString('AGENDA_DEFAULT_REMINDER_EVENT_TYPES', ''));
290 }
291 // Assuming $selected is correct type: @phan-suppress-next-line PhanTypeMismatchArgumentNullable
292 print $formactions->select_type_actions($selected, "AGENDA_DEFAULT_REMINDER_EVENT_TYPES", "systemauto", 0, -1, 1, 1);
293 }
294 print '</td></tr>'."\n";
295}
296
297// AGENDA DEFAULT REMINDER OFFSET
298if (getDolGlobalString('AGENDA_REMINDER_BROWSER') || getDolGlobalString('AGENDA_REMINDER_EMAIL') || getDolGlobalString('AGENDA_REMINDER_SMS')) {
299 print '<tr class="oddeven">'."\n";
300 print '<td>';
301 print $langs->trans('AGENDA_DEFAULT_REMINDER_OFFSET', $langs->transnoentities("Module2300Name"));
302 print '</td>'."\n";
303 print '<td class="center">&nbsp;</td>'."\n";
304 print '<td class="right nowraponall minwidth75imp">'."\n";
305 if (!isModEnabled('cron')) {
306 print '<span class="opacitymedium">'.$langs->trans("WarningModuleNotActive", $langs->transnoentitiesnoconv("Module2300Name")).'</span>';
307 } else {
308 print '<input class="width50" type="number" name="AGENDA_DEFAULT_REMINDER_OFFSET" value="'.(GETPOSTISSET('AGENDA_DEFAULT_REMINDER_OFFSET') ? GETPOSTINT('AGENDA_DEFAULT_REMINDER_OFFSET') : getDolGlobalInt('AGENDA_DEFAULT_REMINDER_OFFSET', 30)).'"> ';
309 $selected = (GETPOSTISSET('AGENDA_DEFAULT_REMINDER_OFFSET_UNIT_type_duration') ? GETPOST('AGENDA_DEFAULT_REMINDER_OFFSET_UNIT_type_duration') : getDolGlobalString('AGENDA_DEFAULT_REMINDER_OFFSET_UNIT', 'i'));
310 print $form->selectTypeDuration('AGENDA_DEFAULT_REMINDER_OFFSET_UNIT_', $selected, array('y', 'm', 's'), 'width150 maxwidth150');
311 }
312 print '</td></tr>'."\n";
313}
314
315// AGENDA DEFAULT EMAIL MODEL
316if (getDolGlobalString('AGENDA_REMINDER_EMAIL')) {
317 print '<tr class="oddeven">'."\n";
318 print '<td>';
319 print $langs->trans('AGENDA_DEFAULT_REMINDER_EMAIL_MODEL', $langs->transnoentities("Module2300Name"));
320 print '</td>'."\n";
321 print '<td class="center">&nbsp;</td>'."\n";
322 print '<td class="right nowraponall">'."\n";
323 if (!isModEnabled('cron')) {
324 print '<span class="opacitymedium">'.$langs->trans("WarningModuleNotActive", $langs->transnoentitiesnoconv("Module2300Name")).'</span>';
325 } else {
326 $selected = (GETPOSTISSET('AGENDA_DEFAULT_REMINDER_EMAIL_MODELmodel_mail') ? GETPOST('AGENDA_DEFAULT_REMINDER_EMAIL_MODELmodel_mail') : getDolGlobalInt('AGENDA_DEFAULT_REMINDER_EMAIL_MODEL', 0));
327 print $form->selectModelMail('AGENDA_DEFAULT_REMINDER_EMAIL_MODEL', 'actioncomm_send', 1, 1, $selected, 'minwidth150 width300 flat onrightofpage');
328 }
329 print '</td></tr>'."\n";
330}
331
332print '</table>';
333
334print dol_get_fiche_end();
335
336print '<div class="center">';
337print '<input type="submit" id="save" name="save" class="button hideifnotset button-save" value="'.$langs->trans("Save").'">';
338print '</div>';
339
340print '</form>';
341
342print "<br>";
343
344// End of page
345llxFooter();
346$db->close();
addDocumentModel($name, $type, $label='', $description='')
Add document model used by doc generator.
dolibarr_set_const($db, $name, $value, $type='chaine', $visible=0, $note='', $entity=1)
Insert a parameter (key,value) into database (delete old key then insert it again).
dolibarr_del_const($db, $name, $entity=1)
Delete a constant.
delDocumentModel($name, $type)
Delete document model used by doc generator.
agenda_prepare_head()
Prepare array with list of tabs.
if(preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) if(preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) if($action=='set') elseif( $action=='specimen') elseif($action=='setmodel') elseif( $action=='del') elseif($action=='setdoc') $formactions
View.
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:73
Class to manage predefined suppliers products.
Cron Job class.
Class to manage building of HTML components.
Class to manage generation of HTML components Only common components must be here.
Class to manage third parties objects (customers, suppliers, prospects...)
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2, $allowothertags=array())
Show picto whatever it's its name (generic function)
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.