dolibarr 20.0.0
agenda_other.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2008-2016 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2011 Regis Houssin <regis.houssin@inodbox.com>
4 * Copyright (C) 2011-2017 Juanjo Menent <jmenent@2byte.es>
5 * Copyright (C) 2015 Jean-François Ferry <jfefe@aternatik.fr>
6 * Copyright (C) 2016 Charlie Benke <charlie@patas-monkey.com>
7 * Copyright (C) 2017 Open-DSI <support@open-dsi.fr>
8 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
9 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program. If not, see <https://www.gnu.org/licenses/>.
23 */
24
31// Load Dolibarr environment
32require '../main.inc.php';
33require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php';
34require_once DOL_DOCUMENT_ROOT.'/core/lib/agenda.lib.php';
35require_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
36require_once DOL_DOCUMENT_ROOT.'/core/class/defaultvalues.class.php';
37
38if (!$user->admin) {
40}
41
42// Load translation files required by the page
43$langs->loadLangs(array('admin', 'other', 'agenda', 'users'));
44
45$action = GETPOST('action', 'aZ09');
46$value = GETPOST('value', 'alpha');
47$modulepart = GETPOST('modulepart', 'aZ09'); // Used by actions_setmoduleoptions.inc.php
48
49$param = GETPOST('param', 'alpha');
50$cancel = GETPOST('cancel', 'alpha');
51$scandir = GETPOST('scan_dir', 'alpha');
52$type = 'action';
53
54
55/*
56 * Actions
57 */
58
59$error = 0;
60$errors = array();
61
62include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php';
63
64$reg = array();
65if (preg_match('/set_([a-z0-9_\-]+)/i', $action, $reg)) {
66 $code = $reg[1];
67 $value = (GETPOST($code, 'alpha') ? GETPOST($code, 'alpha') : 1);
68 if (dolibarr_set_const($db, $code, $value, 'chaine', 0, '', $conf->entity) > 0) {
69 header("Location: ".$_SERVER["PHP_SELF"]);
70 exit;
71 } else {
72 dol_print_error($db);
73 }
74}
75
76if (preg_match('/del_([a-z0-9_\-]+)/i', $action, $reg)) {
77 $code = $reg[1];
78 if (dolibarr_del_const($db, $code, $conf->entity) > 0) {
79 header("Location: ".$_SERVER["PHP_SELF"]);
80 exit;
81 } else {
82 dol_print_error($db);
83 }
84}
85if ($action == 'set') {
86 $getDefaultFilter = GETPOST('AGENDA_DEFAULT_FILTER_TYPE');
87 $defaultfilter = (is_array($getDefaultFilter)) ? implode(',', $getDefaultFilter) : $getDefaultFilter;
88 dolibarr_set_const($db, 'AGENDA_USE_EVENT_TYPE_DEFAULT', GETPOST('AGENDA_USE_EVENT_TYPE_DEFAULT'), 'chaine', 0, '', $conf->entity);
89 dolibarr_set_const($db, 'AGENDA_DEFAULT_FILTER_TYPE', $defaultfilter, 'chaine', 0, '', $conf->entity);
90 dolibarr_set_const($db, 'AGENDA_DEFAULT_FILTER_STATUS', GETPOST('AGENDA_DEFAULT_FILTER_STATUS'), 'chaine', 0, '', $conf->entity);
91 dolibarr_set_const($db, 'AGENDA_DEFAULT_VIEW', GETPOST('AGENDA_DEFAULT_VIEW'), 'chaine', 0, '', $conf->entity);
92
93 $defaultValues = new DefaultValues($db);
94 $result = $defaultValues->fetchAll('', '', 0, 0, array('t.page' => 'comm/action/card.php', 't.param' => 'complete', 't.user_id' => '0', 't.type' => 'createform', 't.entity' => $conf->entity));
95 if (!is_array($result) && $result < 0) {
96 setEventMessages($defaultValues->error, $defaultValues->errors, 'errors');
97 } elseif (count($result) > 0) {
98 foreach ($result as $defval) {
99 $defaultValues->id = $defval->id;
100 $resultDel = $defaultValues->delete($user);
101 if ($resultDel < 0) {
102 setEventMessages($defaultValues->error, $defaultValues->errors, 'errors');
103 }
104 }
105 }
106 $defaultValues->type = 'createform';
107 $defaultValues->entity = $conf->entity;
108 $defaultValues->user_id = 0;
109 $defaultValues->page = 'comm/action/card.php';
110 $defaultValues->param = 'complete';
111 $defaultValues->value = GETPOST('AGENDA_EVENT_DEFAULT_STATUS');
112 $resultCreat = $defaultValues->create($user);
113 if ($resultCreat < 0) {
114 setEventMessages($defaultValues->error, $defaultValues->errors, 'errors');
115 } else {
116 setEventMessages($langs->trans("RecordSaved"), null, 'mesgs');
117 }
118} elseif ($action == 'specimen') { // For orders
119 $modele = GETPOST('module', 'alpha');
120
121 $commande = new CommandeFournisseur($db);
122 $commande->initAsSpecimen();
123 $commande->thirdparty = $specimenthirdparty;
124
125 // Search template files
126 $file = '';
127 $classname = '';
128 $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
129 foreach ($dirmodels as $reldir) {
130 $file = dol_buildpath($reldir."core/modules/action/doc/pdf_".$modele.".modules.php", 0);
131 if (file_exists($file)) {
132 $classname = "pdf_".$modele;
133 break;
134 }
135 }
136
137 if ($classname !== '') {
138 require_once $file;
139
140 $module = new $classname($db, $commande);
141 '@phan-var-force pdf_standard_actions $module';
142
143 if ($module->write_file($commande, $langs) > 0) {
144 header("Location: ".DOL_URL_ROOT."/document.php?modulepart=action&file=SPECIMEN.pdf");
145 return;
146 } else {
147 setEventMessages($module->error, $module->errors, 'errors');
148 dol_syslog($module->error, LOG_ERR);
149 }
150 } else {
151 setEventMessages($langs->trans("ErrorModuleNotFound"), null, 'errors');
152 dol_syslog($langs->trans("ErrorModuleNotFound"), LOG_ERR);
153 }
154} elseif ($action == 'setmodel') {
155 // Activate a model
156 //print "sssd".$value;
157 $ret = addDocumentModel($value, $type, $label, $scandir);
158} elseif ($action == 'del') {
159 $ret = delDocumentModel($value, $type);
160 if ($ret > 0) {
161 if ($conf->global->ACTION_EVENT_ADDON_PDF == "$value") {
162 dolibarr_del_const($db, 'ACTION_EVENT_ADDON_PDF', $conf->entity);
163 }
164 }
165} elseif ($action == 'setdoc') {
166 // Set default model
167 if (dolibarr_set_const($db, "ACTION_EVENT_ADDON_PDF", $value, 'chaine', 0, '', $conf->entity)) {
168 // La constante qui a ete lue en avant du nouveau set
169 // on passe donc par une variable pour avoir un affichage coherent
170 $conf->global->ACTION_EVENT_ADDON_PDF = $value;
171 }
172
173 // On active le modele
174 $ret = delDocumentModel($value, $type);
175 if ($ret > 0) {
176 $ret = addDocumentModel($value, $type, $label, $scandir);
177 }
178}
179
180
185$form = new Form($db);
186$formactions = new FormActions($db);
187
188$dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
189
190$wikihelp = 'EN:Module_Agenda_En|FR:Module_Agenda|ES:Módulo_Agenda|DE:Modul_Terminplanung';
191llxHeader('', $langs->trans("AgendaSetup"), $wikihelp, '', 0, 0, '', '', '', 'mod-admin page-agenda_other');
192
193$linkback = '<a href="'.DOL_URL_ROOT.'/admin/modules.php?restore_lastsearch_values=1">'.$langs->trans("BackToModuleList").'</a>';
194print load_fiche_titre($langs->trans("AgendaSetup"), $linkback, 'title_setup');
195
196
197
198$head = agenda_prepare_head();
199
200print dol_get_fiche_head($head, 'other', $langs->trans("Agenda"), -1, 'action');
201
202
203/*
204 * Miscellaneous
205 */
206
207// Define array def of models
208$def = array();
209
210$sql = "SELECT nom";
211$sql .= " FROM ".MAIN_DB_PREFIX."document_model";
212$sql .= " WHERE type = 'action'";
213$sql .= " AND entity = ".$conf->entity;
214
215$resql = $db->query($sql);
216if ($resql) {
217 $i = 0;
218 $num_rows = $db->num_rows($resql);
219 while ($i < $num_rows) {
220 $array = $db->fetch_array($resql);
221 if (is_array($array)) {
222 array_push($def, $array[0]);
223 }
224 $i++;
225 }
226} else {
227 dol_print_error($db);
228}
229
230if (getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 2) {
231 print load_fiche_titre($langs->trans("AgendaModelModule"), '', '');
232
233 print '<table class="noborder centpercent">'."\n";
234 print '<tr class="liste_titre">'."\n";
235 print '<td width="100">'.$langs->trans("Name").'</td>'."\n";
236 print '<td>'.$langs->trans("Description").'</td>'."\n";
237 print '<td class="center" width="60">'.$langs->trans("Status").'</td>'."\n";
238 print '<td class="center" width="60">'.$langs->trans("Default").'</td>'."\n";
239 print '<td class="center" width="40">'.$langs->trans("ShortInfo").'</td>';
240 print '<td class="center" width="40">'.$langs->trans("Preview").'</td>';
241 print '</tr>'."\n";
242
243 clearstatcache();
244
245 foreach ($dirmodels as $reldir) {
246 $dir = dol_buildpath($reldir."core/modules/action/doc");
247
248 if (is_dir($dir)) {
249 $handle = opendir($dir);
250 if (is_resource($handle)) {
251 while (($file = readdir($handle)) !== false) {
252 if (preg_match('/\.modules\.php$/i', $file) && preg_match('/^(pdf_|doc_)/', $file)) {
253 $name = substr($file, 4, dol_strlen($file) - 16);
254 $classname = substr($file, 0, dol_strlen($file) - 12);
255
256 require_once $dir.'/'.$file;
257 $module = new $classname($db, new ActionComm($db));
258
259 print '<tr class="oddeven">'."\n";
260 print "<td>";
261 print(empty($module->name) ? $name : $module->name);
262 print "</td>\n";
263 print "<td>\n";
264 require_once $dir.'/'.$file;
265 $module = new $classname($db, $specimenthirdparty);
266 if (method_exists($module, 'info')) {
267 print $module->info($langs);
268 } else {
269 print $module->description;
270 }
271 print "</td>\n";
272
273 // Active
274 if (in_array($name, $def)) {
275 print '<td class="center">'."\n";
276 if ($conf->global->ACTION_EVENT_ADDON_PDF != "$name") {
277 print '<a href="'.$_SERVER["PHP_SELF"].'?action=del&token='.newToken().'&value='.$name.'&scan_dir='.$module->scandir.'&label='.urlencode($module->name).'&type=action">';
278 print img_picto($langs->trans("Enabled"), 'switch_on');
279 print '</a>';
280 } else {
281 print img_picto($langs->trans("Enabled"), 'switch_on');
282 }
283 print "</td>";
284 } else {
285 print '<td class="center">'."\n";
286 print '<a href="'.$_SERVER["PHP_SELF"].'?action=setmodel&token='.newToken().'&value='.$name.'&scan_dir='.$module->scandir.'&label='.urlencode($module->name).'&type=action">'.img_picto($langs->trans("Disabled"), 'switch_off').'</a>';
287 print "</td>";
288 }
289
290 // Default
291 print '<td class="center">';
292 if ($conf->global->ACTION_EVENT_ADDON_PDF == "$name") {
293 print img_picto($langs->trans("Default"), 'on');
294 } else {
295 print '<a href="'.$_SERVER["PHP_SELF"].'?action=setdoc&token='.newToken().'&value='.urlencode($name).'&amp;scan_dir='.urlencode($module->scandir).'&label='.urlencode($module->name).'&amp;type=action"" alt="'.$langs->trans("Default").'">'.img_picto($langs->trans("Disabled"), 'off').'</a>';
296 }
297 print '</td>';
298
299 // Info
300 $htmltooltip = ''.$langs->trans("Name").': '.$module->name;
301 $htmltooltip .= '<br>'.$langs->trans("Type").': '.($module->type ? $module->type : $langs->trans("Unknown"));
302 $htmltooltip .= '<br>'.$langs->trans("Width").'/'.$langs->trans("Height").': '.$module->page_largeur.'/'.$module->page_hauteur;
303 $htmltooltip .= '<br><br><u>'.$langs->trans("FeaturesSupported").':</u>';
304 $htmltooltip .= '<br>'.$langs->trans("Logo").': '.yn($module->option_logo, 1, 1);
305 print '<td class="center">';
306 print $form->textwithpicto('', $htmltooltip, 1, 0);
307 print '</td>';
308 print '<td class="center">';
309 print '<a href="'.$_SERVER["PHP_SELF"].'?action=specimen&amp;module='.$name.'">'.img_object($langs->trans("Preview"), 'pdf').'</a>';
310 print '</td>';
311
312 print "</tr>\n";
313 }
314 }
315 closedir($handle);
316 }
317 }
318 }
319 print '</table><br>';
320
321 print load_fiche_titre($langs->trans('MiscellaneousOptions'), '', '');
322}
323
324
325print '<form action="'.$_SERVER["PHP_SELF"].'" name="agenda">';
326print '<input type="hidden" name="token" value="'.newToken().'">';
327print '<input type="hidden" name="action" value="set">';
328
329print '<table class="noborder allwidth">'."\n";
330print '<tr class="liste_titre">'."\n";
331print '<td>'.$langs->trans("Parameters").'</td>'."\n";
332print '<td class="center">&nbsp;</td>'."\n";
333print '<td class="right">'.$langs->trans("Value").'</td>'."\n";
334print '</tr>'."\n";
335
336// AGENDA_DEFAULT_VIEW
337print '<tr class="oddeven">'."\n";
338$htmltext = $langs->trans("ThisValueCanOverwrittenOnUserLevel", $langs->transnoentitiesnoconv("UserGUISetup"));
339print '<td>'.$form->textwithpicto($langs->trans("AGENDA_DEFAULT_VIEW"), $htmltext).'</td>'."\n";
340print '<td class="center">&nbsp;</td>'."\n";
341print '<td class="right">'."\n";
342$tmplist = array('' => '&nbsp;', 'show_list' => $langs->trans("ViewList"), 'show_month' => $langs->trans("ViewCal"), 'show_week' => $langs->trans("ViewWeek"), 'show_day' => $langs->trans("ViewDay"), 'show_peruser' => $langs->trans("ViewPerUser"));
343print $form->selectarray('AGENDA_DEFAULT_VIEW', $tmplist, getDolGlobalString('AGENDA_DEFAULT_VIEW'));
344print '</td></tr>'."\n";
345
346// Manual or automatic
347
348print '<tr class="oddeven">'."\n";
349print '<td>'.$langs->trans("AGENDA_USE_EVENT_TYPE").'</td>'."\n";
350print '<td class="center">&nbsp;</td>'."\n";
351print '<td class="right">'."\n";
352//print ajax_constantonoff('AGENDA_USE_EVENT_TYPE'); Do not use ajax here, we need to reload page to change other combo list
353if (!getDolGlobalString('AGENDA_USE_EVENT_TYPE')) {
354 print '<a href="'.$_SERVER['PHP_SELF'].'?action=set_AGENDA_USE_EVENT_TYPE&token='.newToken().'">'.img_picto($langs->trans("Disabled"), 'switch_off').'</a>';
355} else {
356 print '<a href="'.$_SERVER['PHP_SELF'].'?action=del_AGENDA_USE_EVENT_TYPE&token='.newToken().'">'.img_picto($langs->trans("Enabled"), 'switch_on').'</a>';
357}
358print '</td></tr>'."\n";
359
360if (getDolGlobalString('AGENDA_USE_EVENT_TYPE')) {
361 print '<!-- AGENDA_USE_EVENT_TYPE_DEFAULT -->';
362 print '<tr class="oddeven">'."\n";
363 print '<td>'.$langs->trans("AGENDA_USE_EVENT_TYPE_DEFAULT").'</td>'."\n";
364 print '<td class="center">&nbsp;</td>'."\n";
365 print '<td class="right nowrap">'."\n";
366 $formactions->select_type_actions(getDolGlobalString('AGENDA_USE_EVENT_TYPE_DEFAULT'), "AGENDA_USE_EVENT_TYPE_DEFAULT", 'systemauto', 0, 1);
367 print '</td></tr>'."\n";
368}
369
370// AGENDA_EVENT_DEFAULT_STATUS
371print '<tr class="oddeven">'."\n";
372print '<td>'.$langs->trans("AGENDA_EVENT_DEFAULT_STATUS").'</td>'."\n";
373print '<td class="center">&nbsp;</td>'."\n";
374print '<td class="right nowrap">'."\n";
375$defval = 'na';
376$defaultValues = new DefaultValues($db);
377$result = $defaultValues->fetchAll('', '', 0, 0, array('t.page' => 'comm/action/card.php', 't.param' => 'complete', 't.user_id' => '0', 't.type' => 'createform', 't.entity' => $conf->entity));
378if (!is_array($result) && $result < 0) {
379 setEventMessages($defaultValues->error, $defaultValues->errors, 'errors');
380} elseif (count($result) > 0) {
381 $defval = reset($result)->value;
382}
383$formactions->form_select_status_action('agenda', $defval, 1, "AGENDA_EVENT_DEFAULT_STATUS", 0, 1, 'maxwidth200 onrightofpage');
384print '</td></tr>'."\n";
385
386// AGENDA_DEFAULT_FILTER_TYPE
387print '<tr class="oddeven">'."\n";
388print '<td>'.$langs->trans("AGENDA_DEFAULT_FILTER_TYPE").'</td>'."\n";
389print '<td class="center">&nbsp;</td>'."\n";
390print '<td class="right nowrap">'."\n";
391$multiselect = 0;
392if (getDolGlobalString('MAIN_ENABLE_MULTISELECT_TYPE')) {
393 // We use an option here because it adds bugs when used on agenda page "peruser" and "list"
394 $multiselect = (getDolGlobalString('AGENDA_USE_EVENT_TYPE'));
395}
396$formactions->select_type_actions(getDolGlobalString('AGENDA_DEFAULT_FILTER_TYPE'), "AGENDA_DEFAULT_FILTER_TYPE", '', (getDolGlobalString('AGENDA_USE_EVENT_TYPE') ? -1 : 1), 1, $multiselect);
397print '</td></tr>'."\n";
398
399// AGENDA_DEFAULT_FILTER_STATUS
400// TODO Remove to use the default generic feature
401print '<tr class="oddeven">'."\n";
402print '<td>'.$langs->trans("AGENDA_DEFAULT_FILTER_STATUS").'</td>'."\n";
403print '<td class="center">&nbsp;</td>'."\n";
404print '<td class="right">'."\n";
405$formactions->form_select_status_action('agenda', getDolGlobalString('AGENDA_DEFAULT_FILTER_STATUS'), 1, 'AGENDA_DEFAULT_FILTER_STATUS', 1, 2, 'minwidth100');
406print '</td></tr>'."\n";
407
408print '</table>';
409
410print $form->buttonsSaveCancel("Save", '');
411
412print '</form>';
413
414
415print dol_get_fiche_end();
416
417// End of page
418llxFooter();
419$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') $form
View.
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader()
Empty header.
Definition wrapper.php:55
llxFooter()
Empty footer.
Definition wrapper.php:69
Class to manage agenda events (actions)
Class to manage predefined suppliers products.
Class for MyObject.
Class to manage building of HTML components.
Class to manage generation of HTML components Only common components must be here.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_object($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0)
Show a picto called object_picto (generic function)
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
Show picto whatever it's its name (generic function)
yn($yesno, $case=1, $color=0)
Return yes or no in current language.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0)
Show tabs of a record.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
dol_strlen($string, $stringencoding='UTF-8')
Make a strlen call.
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.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0)
Set event messages in dol_events session object.
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...
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
$conf db name
Only used if Module[ID]Name translation string is not found.
Definition repair.php:142
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.