dolibarr 20.0.0
card.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2001-2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2004-2018 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005 Simon TOSSER <simon@kornog-computing.com>
5 * Copyright (C) 2005-2017 Regis Houssin <regis.houssin@inodbox.com>
6 * Copyright (C) 2010-2013 Juanjo Menent <jmenent@2byte.es>
7 * Copyright (C) 2013 Florian Henry <florian.henry@open-concept.pro>
8 * Copyright (C) 2014 Cedric GROSS <c.gross@kreiz-it.fr>
9 * Copyright (C) 2015 Alexandre Spangaro <aspangaro@open-dsi.fr>
10 * Copyright (C) 2018-2023 Frédéric France <frederic.france@netlogic.fr>
11 * Copyright (C) 2019 Ferran Marcet <fmarcet@2byte.es>
12 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
13 *
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 3 of the License, or
17 * (at your option) any later version.
18 *
19 * This program is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
23 *
24 * You should have received a copy of the GNU General Public License
25 * along with this program. If not, see <https://www.gnu.org/licenses/>.
26 */
27
34// Load Dolibarr environment
35require '../../main.inc.php';
36require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.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.'/core/class/html.formfile.class.php';
40require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
41require_once DOL_DOCUMENT_ROOT.'/core/lib/agenda.lib.php';
42require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
43require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
44require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncomm.class.php';
45require_once DOL_DOCUMENT_ROOT.'/comm/action/class/actioncommreminder.class.php';
46require_once DOL_DOCUMENT_ROOT.'/comm/action/class/cactioncomm.class.php';
47require_once DOL_DOCUMENT_ROOT.'/contact/class/contact.class.php';
48require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
49require_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php';
50require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php';
51
52
53// Load translation files required by the page
54$langs->loadLangs(array("companies", "other", "commercial", "bills", "orders", "agenda", "mails"));
55
56// Get Parameters
57$action = GETPOST('action', 'aZ09');
58$cancel = GETPOST('cancel', 'alpha');
59$backtopage = GETPOST('backtopage', 'alpha');
60$socpeopleassigned = GETPOST('socpeopleassigned', 'array');
61$origin = GETPOST('origin', 'alpha');
62$originid = GETPOSTINT('originid');
63$confirm = GETPOST('confirm', 'alpha');
64
65$fulldayevent = GETPOST('fullday', 'alpha');
66
67$aphour = GETPOSTINT('aphour');
68$apmin = GETPOSTINT('apmin');
69$p2hour = GETPOSTINT('p2hour');
70$p2min = GETPOSTINT('p2min');
71
72$addreminder = GETPOST('addreminder', 'alpha');
73$offsetvalue = GETPOSTINT('offsetvalue');
74$offsetunit = GETPOST('offsetunittype_duration', 'aZ09');
75$remindertype = GETPOST('selectremindertype', 'aZ09');
76$modelmail = GETPOSTINT('actioncommsendmodel_mail');
77$complete = GETPOST('complete', 'alpha'); // 'na' must be allowed
78$private = GETPOST('private', 'alphanohtml');
79if ($complete == 'na' || $complete == -2) {
80 $complete = -1;
81}
82
83if ($fulldayevent) {
84 $tzforfullday = getDolGlobalString('MAIN_STORE_FULL_EVENT_IN_GMT');
85 // For "full day" events, we must store date in GMT (It must be viewed as same moment everywhere)
86 $datep = dol_mktime('00', '00', 0, GETPOSTINT("apmonth"), GETPOSTINT("apday"), GETPOSTINT("apyear"), $tzforfullday ? $tzforfullday : 'tzuserrel');
87 $datef = dol_mktime('23', '59', '59', GETPOSTINT("p2month"), GETPOSTINT("p2day"), GETPOSTINT("p2year"), $tzforfullday ? $tzforfullday : 'tzuserrel');
88 //print $db->idate($datep); exit;
89} else {
90 $datep = dol_mktime($aphour, $apmin, 0, GETPOSTINT("apmonth"), GETPOSTINT("apday"), GETPOSTINT("apyear"), 'tzuserrel');
91 $datef = dol_mktime($p2hour, $p2min, '59', GETPOSTINT("p2month"), GETPOSTINT("p2day"), GETPOSTINT("p2year"), 'tzuserrel');
92}
93$reg = array();
94if (GETPOST('datep')) {
95 if (GETPOST('datep') == 'now') {
96 $datep = dol_now();
97 } elseif (preg_match('/^([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])$/', GETPOST("datep"), $reg)) { // Try to not use this. Use instead '&datep=now'
98 $datep = dol_mktime(0, 0, 0, $reg[2], $reg[3], $reg[1], 'tzuserrel');
99 }
100}
101
102// Security check
103$socid = GETPOSTINT('socid');
104$id = GETPOSTINT('id');
105if ($user->socid && ($socid != $user->socid)) {
107}
108
109$error = GETPOST("error");
110$donotclearsession = GETPOST('donotclearsession') ? GETPOST('donotclearsession') : 0;
111
112// Initialize Objects
113$object = new ActionComm($db);
114$cactioncomm = new CActionComm($db);
115$contact = new Contact($db);
116$extrafields = new ExtraFields($db);
117$formfile = new FormFile($db);
118
119$form = new Form($db);
120$formfile = new FormFile($db);
121$formactions = new FormActions($db);
122
123// Load object
124if ($id > 0 && $action != 'add') {
125 $ret = $object->fetch($id);
126 if ($ret > 0) {
127 $ret = $object->fetch_optionals();
128 $ret1 = $object->fetch_userassigned();
129 }
130 if ($ret < 0 || $ret1 < 0) {
131 dol_print_error(null, $object->error);
132 }
133}
134
135// fetch optionals attributes and labels
136$extrafields->fetch_name_optionals_label($object->table_element);
137
138// Initialize technical object to manage hooks of page. Note that conf->hooks_modules contains array of hook context
139$hookmanager->initHooks(array('actioncard', 'globalcard'));
140
141$parameters = array('socid' => $socid);
142$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
143if ($reshook < 0) {
144 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
145}
146
147$TRemindTypes = array();
148if (getDolGlobalString('AGENDA_REMINDER_BROWSER')) {
149 $TRemindTypes['browser'] = array('label' => $langs->trans('BrowserPush'), 'disabled' => (!getDolGlobalString('AGENDA_REMINDER_BROWSER') ? 1 : 0));
150}
151if (getDolGlobalString('AGENDA_REMINDER_EMAIL')) {
152 $TRemindTypes['email'] = array('label' => $langs->trans('EMail'), 'disabled' => (!getDolGlobalString('AGENDA_REMINDER_EMAIL') ? 1 : 0));
153}
154
155$TDurationTypes = array('y' => $langs->trans('Years'), 'm' => $langs->trans('Month'), 'w' => $langs->trans('Weeks'), 'd' => $langs->trans('Days'), 'h' => $langs->trans('Hours'), 'i' => $langs->trans('Minutes'));
156
157$result = restrictedArea($user, 'agenda', $object, 'actioncomm&societe', 'myactions|allactions', 'fk_soc', 'id');
158
159$usercancreate = $user->hasRight('agenda', 'allactions', 'create') || (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->hasRight('agenda', 'myactions', 'create'));
160
161
162/*
163 * Actions
164 */
165
166$listUserAssignedUpdated = false;
167$listResourceAssignedUpdated = false;
168$assignedtouser = array();
169
170// Remove user to assigned list
171if (empty($reshook) && (GETPOST('removedassigned') || GETPOST('removedassigned') == '0')) {
172 $idtoremove = GETPOST('removedassigned');
173
174 if (!empty($_SESSION['assignedtouser'])) {
175 $tmpassigneduserids = json_decode($_SESSION['assignedtouser'], true);
176 } else {
177 $tmpassigneduserids = array();
178 }
179
180 foreach ($tmpassigneduserids as $key => $val) {
181 if ($val['id'] == $idtoremove || $val['id'] == -1) {
182 unset($tmpassigneduserids[$key]);
183 }
184 }
185
186 $_SESSION['assignedtouser'] = json_encode($tmpassigneduserids);
187 $donotclearsession = 1;
188 if ($action == 'add' && $usercancreate) {
189 $action = 'create';
190 }
191 if ($action == 'update' && $usercancreate) {
192 $action = 'edit';
193 }
194
195 $listUserAssignedUpdated = true;
196}
197// Remove resource to assigned list
198if (empty($reshook) && (GETPOST('removedassignedresource') || GETPOST('removedassignedresource') == '0')) {
199 $idtoremove = GETPOST('removedassignedresource');
200
201 if (!empty($_SESSION['assignedtoresource'])) {
202 $tmpassignedresourceids = json_decode($_SESSION['assignedtoresource'], true);
203 } else {
204 $tmpassignedresourceids = array();
205 }
206
207 foreach ($tmpassignedresourceids as $key => $val) {
208 if ($val['id'] == $idtoremove || $val['id'] == -1) {
209 unset($tmpassignedresourceids[$key]);
210 }
211 }
212
213 $_SESSION['assignedtoresource'] = json_encode($tmpassignedresourceids);
214 $donotclearsessionresource = 1;
215 if ($action == 'add' && $usercancreate) {
216 $action = 'create';
217 }
218 if ($action == 'update' && $usercancreate) {
219 $action = 'edit';
220 }
221
222 $listResourceAssignedUpdated = true;
223}
224
225// Add user to assigned list
226if (empty($reshook) && (GETPOST('addassignedtouser') || GETPOST('updateassignedtouser'))) {
227 // Add a new user
228 if (GETPOST('assignedtouser') > 0) {
229 $assignedtouser = array();
230 if (!empty($_SESSION['assignedtouser'])) {
231 $assignedtouser = json_decode($_SESSION['assignedtouser'], true);
232 }
233 $assignedtouser[GETPOST('assignedtouser')] = array('id' => GETPOSTINT('assignedtouser'), 'transparency' => GETPOST('transparency'), 'mandatory' => 1);
234 $_SESSION['assignedtouser'] = json_encode($assignedtouser);
235 }
236 $donotclearsession = 1;
237 if ($action == 'add' && $usercancreate) {
238 $action = 'create';
239 }
240 if ($action == 'update' && $usercancreate) {
241 $action = 'edit';
242 }
243
244 $listUserAssignedUpdated = true;
245}
246
247// Add resource to assigned list
248if (empty($reshook) && (GETPOST('addassignedtoresource') || GETPOST('updateassignedtoresource'))) {
249 // Add a new user
250 if (GETPOST('assignedtoresource') > 0) {
251 $assignedtoresource = array();
252 if (!empty($_SESSION['assignedtoresource'])) {
253 $assignedtoresource = json_decode($_SESSION['assignedtoresource'], true);
254 }
255 $assignedtoresource[GETPOST('assignedtoresource')] = array('id' => GETPOSTINT('assignedtoresource'), 'transparency' => GETPOST('transparency'), 'mandatory' => 1);
256 $_SESSION['assignedtoresource'] = json_encode($assignedtoresource);
257 }
258 $donotclearsession = 1;
259 if ($action == 'add' && $usercancreate) {
260 $action = 'create';
261 }
262 if ($action == 'update' && $usercancreate) {
263 $action = 'edit';
264 }
265
266 $listResourceAssignedUpdated = true;
267}
268
269// Link to a project
270if (empty($reshook) && $action == 'classin' && ($user->hasRight('agenda', 'allactions', 'create') ||
271 (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->hasRight('agenda', 'myactions', 'create')))) {
272 //$object->fetch($id);
273 $object->setProject(GETPOSTINT('projectid'));
274}
275
276// Action clone object
277if (empty($reshook) && $action == 'confirm_clone' && $confirm == 'yes' && $usercancreate) {
278 if (1 == 0 && !GETPOST('clone_content') && !GETPOST('clone_receivers')) {
279 setEventMessages($langs->trans("NoCloneOptionsSpecified"), null, 'errors');
280 } else {
281 if ($id > 0) {
282 //$object->fetch($id);
283 if (!empty($object->socpeopleassigned)) {
284 reset($object->socpeopleassigned);
285 $object->contact_id = key($object->socpeopleassigned);
286 }
287 $result = $object->createFromClone($user, GETPOSTINT('socid'));
288 if ($result > 0) {
289 header("Location: ".$_SERVER['PHP_SELF'].'?id='.$result);
290 exit();
291 } else {
292 setEventMessages($object->error, $object->errors, 'errors');
293 $action = '';
294 }
295 }
296 }
297}
298
299// Add event
300if (empty($reshook) && $action == 'add' && $usercancreate) {
301 $error = 0;
302
303 if (empty($backtopage)) {
304 if ($socid > 0) {
305 $backtopage = DOL_URL_ROOT.'/societe/agenda.php?socid='.$socid;
306 } else {
307 $backtopage = DOL_URL_ROOT.'/comm/action/index.php';
308 }
309 }
310
311 if (!empty($socpeopleassigned[0])) {
312 $result = $contact->fetch($socpeopleassigned[0]);
313 }
314
315 if ($cancel) {
316 header("Location: ".$backtopage);
317 exit;
318 }
319
320 $percentage = in_array(GETPOST('status'), array(-1, 100)) ? GETPOST('status') : (in_array($complete, array(-1, 100)) ? $complete : GETPOSTINT("percentage")); // If status is -1 or 100, percentage is not defined and we must use status
321
322 // Clean parameters
323 if ($fulldayevent) {
324 $tzforfullday = getDolGlobalString('MAIN_STORE_FULL_EVENT_IN_GMT');
325 // For "full day" events, we must store date in GMT (It must be viewed as same moment everywhere)
326 $datep = dol_mktime('00', '00', '00', GETPOSTINT("apmonth"), GETPOSTINT("apday"), GETPOSTINT("apyear"), $tzforfullday ? $tzforfullday : 'tzuserrel');
327 $datef = dol_mktime('23', '59', '59', GETPOSTINT("p2month"), GETPOSTINT("p2day"), GETPOSTINT("p2year"), $tzforfullday ? $tzforfullday : 'tzuserrel');
328 } else {
329 $datep = dol_mktime(GETPOSTINT("aphour"), GETPOSTINT("apmin"), GETPOSTINT("apsec"), GETPOSTINT("apmonth"), GETPOSTINT("apday"), GETPOSTINT("apyear"), 'tzuserrel');
330 $datef = dol_mktime(GETPOSTINT("p2hour"), GETPOSTINT("p2min"), GETPOSTINT("apsec"), GETPOSTINT("p2month"), GETPOSTINT("p2day"), GETPOSTINT("p2year"), 'tzuserrel');
331 }
332
333 // Check parameters
334 if (!$datef && $percentage == 100) {
335 $error++;
336 $donotclearsession = 1;
337 $action = 'create';
338 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DateEnd")), null, 'errors');
339 }
340
341 if (!getDolGlobalString('AGENDA_USE_EVENT_TYPE') && !GETPOST('label')) {
342 $error++;
343 $donotclearsession = 1;
344 $action = 'create';
345 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Title")), null, 'errors');
346 }
347
348 // Initialisation object cactioncomm
349 if (GETPOSTISSET('actioncode') && !GETPOST('actioncode', 'aZ09')) { // actioncode is '0'
350 $error++;
351 $donotclearsession = 1;
352 $action = 'create';
353 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Type")), null, 'errors');
354 } else {
355 $object->type_code = GETPOST('actioncode', 'aZ09');
356 }
357
358 if (!$error) {
359 // Initialisation object actioncomm
360 $object->priority = GETPOSTISSET("priority") ? GETPOSTINT("priority") : 0;
361 $object->fulldayevent = ($fulldayevent ? 1 : 0);
362 $object->location = GETPOST("location", 'alphanohtml');
363 $object->label = GETPOST('label', 'alphanohtml');
364
365 if (GETPOST("elementtype", 'alpha')) {
366 $elProp = getElementProperties(GETPOST("elementtype", 'alpha'));
367 $modulecodetouseforpermissioncheck = $elProp['module'];
368
369 $hasPermissionOnLinkedObject = 0;
370 if ($user->hasRight($modulecodetouseforpermissioncheck, 'read')) {
371 $hasPermissionOnLinkedObject = 1;
372 }
373 if ($hasPermissionOnLinkedObject) {
374 $object->fk_element = GETPOSTINT("fk_element");
375 $object->elementtype = GETPOST("elementtype", 'alpha');
376 }
377 }
378
379 if (!GETPOST('label')) {
380 if (GETPOST('actioncode', 'aZ09') == 'AC_RDV' && $contact->getFullName($langs)) {
381 $object->label = $langs->transnoentitiesnoconv("TaskRDVWith", $contact->getFullName($langs));
382 } else {
383 if ($langs->trans("Action".$object->type_code) != "Action".$object->type_code) {
384 $object->label = $langs->transnoentitiesnoconv("Action".$object->type_code)."\n";
385 } else {
386 $cactioncomm->fetch($object->type_code);
387 $object->label = $cactioncomm->label;
388 }
389 }
390 }
391 $object->fk_project = GETPOSTISSET("projectid") ? GETPOSTINT("projectid") : 0;
392
393 $taskid = GETPOSTINT('taskid');
394 if (!empty($taskid)) {
395 $taskProject = new Task($db);
396 if ($taskProject->fetch($taskid) > 0) {
397 $object->fk_project = $taskProject->fk_project;
398 }
399
400 $object->fk_element = $taskid;
401 $object->elementtype = 'task';
402 }
403
404 $object->datep = $datep;
405 $object->datef = $datef;
406 $object->percentage = $percentage;
407 $object->duree = (((int) GETPOST('dureehour') * 60) + (int) GETPOST('dureemin')) * 60;
408
409 $transparency = (GETPOST("transparency") == 'on' ? 1 : 0);
410
411 $listofuserid = array();
412 if (!empty($_SESSION['assignedtouser'])) {
413 $listofuserid = json_decode($_SESSION['assignedtouser'], true);
414 }
415 $i = 0;
416 foreach ($listofuserid as $key => $value) {
417 if ($i == 0) { // First entry
418 if ($value['id'] > 0) {
419 $object->userownerid = $value['id'];
420 }
421 $object->transparency = $transparency;
422 }
423
424 $object->userassigned[$value['id']] = array('id' => $value['id'], 'transparency' => $transparency);
425
426 $i++;
427 }
428 }
429
430 $object->note_private = trim(GETPOST("note", "restricthtml"));
431
432 if (GETPOSTISSET("contactid")) {
433 $object->contact = $contact;
434 }
435
436 if (GETPOSTINT('socid') > 0) {
437 $object->socid = GETPOSTINT('socid');
438 $object->fetch_thirdparty();
439
440 $object->societe = $object->thirdparty; // For backward compatibility
441 }
442
443 // Check parameters
444 if (empty($object->userownerid) && empty($_SESSION['assignedtouser'])) {
445 $error++;
446 $donotclearsession = 1;
447 $action = 'create';
448 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ActionsOwnedBy")), null, 'errors');
449 }
450 if ($object->type_code == 'AC_RDV' && ($datep == '' || ($datef == '' && empty($fulldayevent)))) {
451 $error++;
452 $donotclearsession = 1;
453 $action = 'create';
454 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("DateEnd")), null, 'errors');
455 }
456
457 if (!GETPOST('apyear') && !GETPOST('adyear')) {
458 $error++;
459 $donotclearsession = 1;
460 $action = 'create';
461 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Date")), null, 'errors');
462 }
463
464 foreach ($socpeopleassigned as $cid) {
465 $object->socpeopleassigned[$cid] = array('id' => $cid);
466 }
467 if (!empty($object->socpeopleassigned)) {
468 reset($object->socpeopleassigned);
469 $object->contact_id = key($object->socpeopleassigned);
470 }
471
472 // Fill array 'array_options' with data from add form
473 $ret = $extrafields->setOptionalsFromPost(null, $object);
474 if ($ret < 0) {
475 $error++;
476 $donotclearsession = 1;
477 $action = 'create';
478 }
479
480
481
482 if (!$error) {
483 $db->begin();
484
485 $selectedrecurrulefreq = 'no';
486 $selectedrecurrulebymonthday = '';
487 $selectedrecurrulebyday = '';
488 $object->recurrule = GETPOSTISSET('recurrulefreq') ? "FREQ=".GETPOST('recurrulefreq', 'alpha') : "";
489 $object->recurrule .= (GETPOST('recurrulefreq', 'alpha') == 'MONTHLY' && GETPOSTISSET('BYMONTHDAY')) ? "_BYMONTHDAY".GETPOST('BYMONTHDAY', 'alpha') : "";
490 $object->recurrule .= (GETPOST('recurrulefreq', 'alpha') == 'WEEKLY' && GETPOSTISSET('BYDAY')) ? "_BYDAY".GETPOST('BYDAY', 'alpha') : "";
491
492 $reg1 = array();
493 $reg2 = array();
494 $reg3 = array();
495 if ($object->recurrule && preg_match('/FREQ=([A-Z]+)/i', $object->recurrule, $reg1)) {
496 $selectedrecurrulefreq = $reg1[1];
497 }
498 if ($object->recurrule && preg_match('/FREQ=MONTHLY.*BYMONTHDAY(\d+)/i', $object->recurrule, $reg2)) {
499 $selectedrecurrulebymonthday = (int) $reg2[1];
500 }
501 if ($object->recurrule && preg_match('/FREQ=WEEKLY.*BYDAY(\d+)/i', $object->recurrule, $reg3)) {
502 $selectedrecurrulebyday = (int) $reg3[1];
503 }
504
505 // Is event recurrent ?
506 $eventisrecurring = 0;
507 $userepeatevent = (getDolGlobalInt('MAIN_FEATURES_LEVEL') == 2 ? 1 : 0);
508 if ($userepeatevent && !empty($selectedrecurrulefreq) && $selectedrecurrulefreq != 'no') {
509 $eventisrecurring = 1;
510 $object->recurid = dol_print_date(dol_now('gmt'), 'dayhourlog', 'gmt');
511 $object->recurdateend = dol_mktime(0, 0, 0, GETPOSTINT('limitmonth'), GETPOSTINT('limitday'), GETPOSTINT('limityear'));
512 } else {
513 unset($object->recurid);
514 unset($object->recurrule);
515 unset($object->recurdateend);
516 }
517
518 // Creation of action/event
519 $idaction = $object->create($user);
520
521 if ($idaction > 0) {
522 if (!$object->error) {
523 // Category association
524 $categories = GETPOST('categories', 'array');
525 $object->setCategories($categories);
526
527 unset($_SESSION['assignedtouser']);
528
529 $moreparam = '';
530 if ($user->id != $object->userownerid) {
531 $moreparam = "filtert=-1"; // We force to remove filter so created record is visible when going back to per user view.
532 }
533
534 // Create reminders
535 if ($addreminder == 'on') {
536 $actionCommReminder = new ActionCommReminder($db);
537
538 $dateremind = dol_time_plus_duree($datep, -1 * $offsetvalue, $offsetunit);
539
540 $actionCommReminder->dateremind = $dateremind;
541 $actionCommReminder->typeremind = $remindertype;
542 $actionCommReminder->offsetunit = $offsetunit;
543 $actionCommReminder->offsetvalue = $offsetvalue;
544 $actionCommReminder->status = $actionCommReminder::STATUS_TODO;
545 $actionCommReminder->fk_actioncomm = $object->id;
546 if ($remindertype == 'email') {
547 $actionCommReminder->fk_email_template = $modelmail;
548 }
549
550 // the notification must be created for every user assigned to the event
551 foreach ($object->userassigned as $userassigned) {
552 $actionCommReminder->fk_user = $userassigned['id'];
553 $res = $actionCommReminder->create($user);
554
555 if ($res <= 0) {
556 // If error
557 $db->rollback();
558 $langs->load("errors");
559 $error = $langs->trans('ErrorReminderActionCommCreation');
560 setEventMessages($error, null, 'errors');
561 $action = 'create';
562 $donotclearsession = 1;
563 break;
564 }
565 }
566 }
567
568 // Modify $moreparam so we are sure to see the event we have just created, whatever are the default value of filter on next page.
569 /*$moreparam .= ($moreparam ? '&' : '').'search_actioncode=0';
570 $moreparam .= ($moreparam ? '&' : '').'search_status=-1';
571 $moreparam .= ($moreparam ? '&' : '').'search_filtert='.$object->userownerid;
572 */
573 $moreparam .= ($moreparam ? '&' : '').'disabledefaultvalues=1';
574
575 if ($error) {
576 $db->rollback();
577 } else {
578 $db->commit();
579 }
580
581 // if (!empty($backtopage)) {
582 // dol_syslog("Back to ".$backtopage.($moreparam ? (preg_match('/\?/', $backtopage) ? '&'.$moreparam : '?'.$moreparam) : ''));
583 // header("Location: ".$backtopage.($moreparam ? (preg_match('/\?/', $backtopage) ? '&'.$moreparam : '?'.$moreparam) : ''));
584 // } elseif ($idaction) {
585 // header("Location: ".DOL_URL_ROOT.'/comm/action/card.php?id='.$idaction.($moreparam ? '&'.$moreparam : ''));
586 // } else {
587 // header("Location: ".DOL_URL_ROOT.'/comm/action/index.php'.($moreparam ? '?'.$moreparam : ''));
588 // }
589 // exit;
590 } else {
591 // If error
592 $db->rollback();
593 $langs->load("errors");
594 $error = $langs->trans($object->error);
595 setEventMessages($error, null, 'errors');
596 $action = 'create';
597 $donotclearsession = 1;
598 }
599 } else {
600 $db->rollback();
601 setEventMessages($object->error, $object->errors, 'errors');
602 $action = 'create';
603 $donotclearsession = 1;
604 }
605
606 if ($eventisrecurring) {
607 // We set first date of recurrence and offsets
608 if ($selectedrecurrulefreq == 'WEEKLY' && !empty($selectedrecurrulebyday)) {
609 $firstdatearray = dol_get_first_day_week(GETPOSTINT("apday"), GETPOSTINT("apmonth"), GETPOSTINT("apyear"));
610 $datep = dol_mktime($fulldayevent ? '00' : GETPOSTINT("aphour"), $fulldayevent ? '00' : GETPOSTINT("apmin"), $fulldayevent ? '00' : GETPOSTINT("apsec"), $firstdatearray['month'], $firstdatearray['first_day'], $firstdatearray['year'], $tzforfullday ? $tzforfullday : 'tzuserrel');
611 $datep = dol_time_plus_duree($datep, $selectedrecurrulebyday + 6, 'd');//We begin the week after
612 $dayoffset = 7;
613 $monthoffset = 0;
614 } elseif ($selectedrecurrulefreq == 'MONTHLY' && !empty($selectedrecurrulebymonthday)) {
615 $firstday = $selectedrecurrulebymonthday;
616 $firstmonth = GETPOST("apday") > $selectedrecurrulebymonthday ? GETPOSTINT("apmonth") + 1 : GETPOSTINT("apmonth");//We begin the week after
617 $datep = dol_mktime($fulldayevent ? '00' : GETPOSTINT("aphour"), $fulldayevent ? '00' : GETPOSTINT("apmin"), $fulldayevent ? '00' : GETPOSTINT("apsec"), $firstmonth, $firstday, GETPOSTINT("apyear"), $tzforfullday ? $tzforfullday : 'tzuserrel');
618 $dayoffset = 0;
619 $monthoffset = 1;
620 } else {
621 $error++;
622 }
623 // End date
624 $repeateventlimitdate = dol_mktime(23, 59, 59, GETPOSTISSET("limitmonth") ? GETPOSTINT("limitmonth") : 1, GETPOSTISSET("limitday") ? GETPOSTINT("limitday") : 1, GETPOSTISSET("limityear") && GETPOSTINT("limityear") < 2100 ? GETPOSTINT("limityear") : 2100, $tzforfullday ? $tzforfullday : 'tzuserrel');
625 // Set date of end of event
626 $deltatime = num_between_day($object->datep, $datep);
627 // @phan-suppress-next-line PhanPluginSuspiciousParamOrder
628 $datef = dol_time_plus_duree($datef, $deltatime, 'd');
629
630 while ($datep <= $repeateventlimitdate && !$error) {
631 $finalobject = clone $object;
632
633
634 $finalobject->datep = $datep;
635 $finalobject->datef = $datef;
636 // Creation of action/event
637 $idaction = $finalobject->create($user);
638
639 if ($idaction > 0) {
640 if (!$finalobject->error) {
641 // Category association
642 $categories = GETPOST('categories', 'array');
643 $finalobject->setCategories($categories);
644
645 unset($_SESSION['assignedtouser']);
646
647 $moreparam = '';
648 if ($user->id != $finalobject->userownerid) {
649 $moreparam = "filtert=-1"; // We force to remove filter so created record is visible when going back to per user view.
650 }
651
652 // Create reminders
653 if ($addreminder == 'on') {
654 $actionCommReminder = new ActionCommReminder($db);
655
656 $dateremind = dol_time_plus_duree($datep, -1 * $offsetvalue, $offsetunit);
657
658 $actionCommReminder->dateremind = $dateremind;
659 $actionCommReminder->typeremind = $remindertype;
660 $actionCommReminder->offsetunit = $offsetunit;
661 $actionCommReminder->offsetvalue = $offsetvalue;
662 $actionCommReminder->status = $actionCommReminder::STATUS_TODO;
663 $actionCommReminder->fk_actioncomm = $finalobject->id;
664 if ($remindertype == 'email') {
665 $actionCommReminder->fk_email_template = $modelmail;
666 }
667
668 // the notification must be created for every user assigned to the event
669 foreach ($finalobject->userassigned as $userassigned) {
670 $actionCommReminder->fk_user = $userassigned['id'];
671 $res = $actionCommReminder->create($user);
672
673 if ($res <= 0) {
674 // If error
675 $db->rollback();
676 $langs->load("errors");
677 $error = $langs->trans('ErrorReminderActionCommCreation');
678 setEventMessages($error, null, 'errors');
679 $action = 'create';
680 $donotclearsession = 1;
681 break;
682 }
683 }
684 }
685
686 // Modify $moreparam so we are sure to see the event we have just created, whatever are the default value of filter on next page.
687 /*$moreparam .= ($moreparam ? '&' : '').'search_actioncode=0';
688 $moreparam .= ($moreparam ? '&' : '').'search_status=-1';
689 $moreparam .= ($moreparam ? '&' : '').'search_filtert='.$object->userownerid;
690 */
691 $moreparam .= ($moreparam ? '&' : '').'disabledefaultvalues=1';
692
693 if ($error) {
694 $db->rollback();
695 } else {
696 $db->commit();
697 }
698 } else {
699 // If error
700 $db->rollback();
701 $langs->load("errors");
702 $error = $langs->trans($finalobject->error);
703 setEventMessages($error, null, 'errors');
704 $action = 'create';
705 $donotclearsession = 1;
706 }
707 } else {
708 $db->rollback();
709 setEventMessages($finalobject->error, $finalobject->errors, 'errors');
710 $action = 'create';
711 $donotclearsession = 1;
712 }
713
714 // If event is not recurrent, we stop here
715 if (!($userepeatevent && GETPOSTISSET('recurrulefreq') && GETPOST('recurrulefreq') != 'no' && GETPOSTISSET("limityear") && GETPOSTISSET("limitmonth") && GETPOSTISSET("limitday"))) {
716 break;
717 }
718
719 // increment date for recurrent events
720 $datep = dol_time_plus_duree($datep, $dayoffset, 'd');
721 $datep = dol_time_plus_duree($datep, $monthoffset, 'm');
722 $datef = dol_time_plus_duree($datef, $dayoffset, 'd');
723 $datef = dol_time_plus_duree($datef, $monthoffset, 'm');
724 }
725 }
726 if (!empty($backtopage) && !$error) {
727 dol_syslog("Back to ".$backtopage.($moreparam ? (preg_match('/\?/', $backtopage) ? '&'.$moreparam : '?'.$moreparam) : ''));
728 header("Location: ".$backtopage.($moreparam ? (preg_match('/\?/', $backtopage) ? '&'.$moreparam : '?'.$moreparam) : ''));
729 } elseif ($idaction) {
730 header("Location: ".DOL_URL_ROOT.'/comm/action/card.php?id='.$idaction.($moreparam ? '&'.$moreparam : ''));
731 } else {
732 header("Location: ".DOL_URL_ROOT.'/comm/action/index.php'.($moreparam ? '?'.$moreparam : ''));
733 }
734 exit;
735 }
736}
737
738// Action update event
739if (empty($reshook) && $action == 'update' && $usercancreate) {
740 if (empty($cancel)) {
741 $fulldayevent = GETPOST('fullday');
742 $aphour = GETPOSTINT('aphour');
743 $apmin = GETPOSTINT('apmin');
744 $p2hour = GETPOSTINT('p2hour');
745 $p2min = GETPOSTINT('p2min');
746 $percentage = in_array(GETPOST('status'), array(-1, 100)) ? GETPOST('status') : (in_array($complete, array(-1, 100)) ? $complete : GETPOSTINT("percentage")); // If status is -1 or 100, percentage is not defined and we must use status
747
748 // Clean parameters
749 if ($aphour == -1) {
750 $aphour = '0';
751 }
752 if ($apmin == -1) {
753 $apmin = '0';
754 }
755 if ($p2hour == -1) {
756 $p2hour = '0';
757 }
758 if ($p2min == -1) {
759 $p2min = '0';
760 }
761
762 $object->fetch($id);
763 $object->fetch_optionals();
764 $object->fetch_userassigned();
765 $object->oldcopy = dol_clone($object, 2);
766
767 // Clean parameters
768 if ($fulldayevent) {
769 $tzforfullday = getDolGlobalString('MAIN_STORE_FULL_EVENT_IN_GMT');
770 // For "full day" events, we must store date in GMT (It must be viewed as same moment everywhere)
771 $datep = dol_mktime('00', '00', '00', GETPOST("apmonth", 'int'), GETPOST("apday", 'int'), GETPOST("apyear", 'int'), $tzforfullday ? $tzforfullday : 'tzuserrel');
772 $datef = dol_mktime('23', '59', '59', GETPOST("p2month", 'int'), GETPOST("p2day", 'int'), GETPOST("p2year", 'int'), $tzforfullday ? $tzforfullday : 'tzuserrel');
773 } else {
774 $datep = dol_mktime(GETPOST("aphour", 'int'), GETPOST("apmin", 'int'), GETPOST("apsec", 'int'), GETPOST("apmonth", 'int'), GETPOST("apday", 'int'), GETPOST("apyear", 'int'), 'tzuserrel');
775 $datef = dol_mktime(GETPOST("p2hour", 'int'), GETPOST("p2min", 'int'), GETPOST("apsec", 'int'), GETPOST("p2month", 'int'), GETPOST("p2day", 'int'), GETPOST("p2year", 'int'), 'tzuserrel');
776 }
777
778 if ($object->elementtype == 'ticket') { // code should be TICKET_MSG, TICKET_MSG_PRIVATE, TICKET_MSG_SENTBYMAIL, TICKET_MSG_PRIVATE_SENTBYMAIL
779 if ($private) {
780 if ($object->code == 'TICKET_MSG') {
781 $object->code = 'TICKET_MSG_PRIVATE';
782 }
783 if ($object->code == 'TICKET_MSG_SENTBYMAIL') {
784 $object->code = 'TICKET_MSG_PRIVATE_SENTBYMAIL';
785 }
786 } else {
787 if ($object->code == 'TICKET_MSG_PRIVATE') {
788 $object->code = 'TICKET_MSG';
789 }
790 if ($object->code == 'TICKET_MSG_PRIVATE_SENTBYMAIL') {
791 $object->code = 'TICKET_MSG_SENTBYMAIL';
792 }
793 }
794 // type_id and type_code is not modified
795 } else {
796 $object->type_id = dol_getIdFromCode($db, GETPOST("actioncode", 'aZ09'), 'c_actioncomm');
797 $object->type_code = GETPOST("actioncode", 'aZ09');
798 }
799
800 $object->label = GETPOST("label", "alphanohtml");
801 $object->datep = $datep;
802 $object->datef = $datef;
803 $object->percentage = $percentage;
804 $object->priority = GETPOSTINT("priority");
805 $object->fulldayevent = GETPOST("fullday") ? 1 : 0;
806 $object->location = GETPOST('location', "alphanohtml");
807 $object->socid = GETPOSTINT("socid");
808 $socpeopleassigned = GETPOST("socpeopleassigned", 'array');
809 $object->socpeopleassigned = array();
810 foreach ($socpeopleassigned as $cid) {
811 $object->socpeopleassigned[$cid] = array('id' => $cid);
812 }
813 $object->contact_id = GETPOSTINT("contactid");
814 if (empty($object->contact_id) && !empty($object->socpeopleassigned)) {
815 reset($object->socpeopleassigned);
816 $object->contact_id = key($object->socpeopleassigned);
817 }
818 $object->fk_project = GETPOSTINT("projectid");
819 $object->note_private = trim(GETPOST("note", "restricthtml"));
820
821 if (GETPOST("elementtype", 'alpha')) {
822 $elProp = getElementProperties(GETPOST("elementtype", 'alpha'));
823 $modulecodetouseforpermissioncheck = $elProp['module'];
824
825 $hasPermissionOnLinkedObject = 0;
826 if ($user->hasRight($modulecodetouseforpermissioncheck, 'read')) {
827 $hasPermissionOnLinkedObject = 1;
828 }
829 if ($hasPermissionOnLinkedObject) {
830 $object->fk_element = GETPOSTINT("fk_element");
831 $object->elementtype = GETPOST("elementtype", 'alpha');
832 }
833 }
834
835 if (!$datef && $percentage == 100) {
836 $error++;
837 $donotclearsession = 1;
838 setEventMessages($langs->transnoentitiesnoconv("ErrorFieldRequired", $langs->transnoentitiesnoconv("DateEnd")), $object->errors, 'errors');
839 $action = 'edit';
840 }
841
842 $transparency = (GETPOST("transparency") == 'on' ? 1 : 0);
843
844 // Users
845 $listofuserid = array();
846 if (!empty($_SESSION['assignedtouser'])) { // Now concat assigned users
847 // Restore array with key with same value than param 'id'
848 $tmplist1 = json_decode($_SESSION['assignedtouser'], true);
849 foreach ($tmplist1 as $key => $val) {
850 if ($val['id'] > 0 && $val['id'] != $assignedtouser) {
851 $listofuserid[$val['id']] = $val;
852 }
853 }
854 } else {
855 $assignedtouser = (!empty($object->userownerid) && $object->userownerid > 0 ? $object->userownerid : 0);
856 if ($assignedtouser) {
857 $listofuserid[$assignedtouser] = array('id' => $assignedtouser, 'mandatory' => 0, 'transparency' => ($user->id == $assignedtouser ? $transparency : '')); // Owner first
858 }
859 }
860 $object->userassigned = array();
861 $object->userownerid = 0; // Clear old content
862 $i = 0;
863 foreach ($listofuserid as $key => $val) {
864 if ($i == 0) {
865 $object->userownerid = $val['id'];
866 }
867 $object->userassigned[$val['id']] = array('id' => $val['id'], 'mandatory' => 0, 'transparency' => ($user->id == $val['id'] ? $transparency : ''));
868 $i++;
869 }
870
871 $object->transparency = $transparency; // We set transparency on event (even if we can also store it on each user, standard says this property is for event)
872 // TODO store also transparency on owner user
873
874 // Check parameters
875 if (GETPOSTISSET('actioncode') && !GETPOST('actioncode', 'aZ09')) { // actioncode is '0'
876 $error++;
877 $donotclearsession = 1;
878 $action = 'edit';
879 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("Type")), null, 'errors');
880 } else {
881 $result = $cactioncomm->fetch(GETPOST('actioncode', 'aZ09'));
882 }
883 if (empty($object->userownerid)) {
884 $error++;
885 $donotclearsession = 1;
886 $action = 'edit';
887 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentitiesnoconv("ActionsOwnedBy")), null, 'errors');
888 }
889
890 // Fill array 'array_options' with data from add form
891 $ret = $extrafields->setOptionalsFromPost(null, $object, '@GETPOSTISSET');
892 if ($ret < 0) {
893 $error++;
894 }
895
896 if (!$error) {
897 // check if an event resource is already in use
898 if (getDolGlobalString('RESOURCE_USED_IN_EVENT_CHECK') && $object->element == 'action') {
899 $eventDateStart = $object->datep;
900 $eventDateEnd = $object->datef;
901
902 $sql = "SELECT er.rowid, r.ref as r_ref, ac.id as ac_id, ac.label as ac_label";
903 $sql .= " FROM ".MAIN_DB_PREFIX."element_resources as er";
904 $sql .= " INNER JOIN ".MAIN_DB_PREFIX."resource as r ON r.rowid = er.resource_id AND er.resource_type = 'dolresource'";
905 $sql .= " INNER JOIN ".MAIN_DB_PREFIX."actioncomm as ac ON ac.id = er.element_id AND er.element_type = '".$db->escape($object->element)."'";
906 $sql .= " WHERE ac.id <> ".((int) $object->id);
907 $sql .= " AND er.resource_id IN (";
908 $sql .= " SELECT resource_id FROM ".MAIN_DB_PREFIX."element_resources";
909 $sql .= " WHERE element_id = ".((int) $object->id);
910 $sql .= " AND element_type = '".$db->escape($object->element)."'";
911 $sql .= " AND busy = 1";
912 $sql .= ")";
913 $sql .= " AND er.busy = 1";
914 $sql .= " AND (";
915
916 // event date start between ac.datep and ac.datep2 (if datep2 is null we consider there is no end)
917 $sql .= " (ac.datep <= '".$db->idate($eventDateStart)."' AND (ac.datep2 IS NULL OR ac.datep2 >= '".$db->idate($eventDateStart)."'))";
918 // event date end between ac.datep and ac.datep2
919 if (!empty($eventDateEnd)) {
920 $sql .= " OR (ac.datep <= '".$db->idate($eventDateEnd)."' AND (ac.datep2 >= '".$db->idate($eventDateEnd)."'))";
921 }
922 // event date start before ac.datep and event date end after ac.datep2
923 $sql .= " OR (";
924 $sql .= "ac.datep >= '".$db->idate($eventDateStart)."'";
925 if (!empty($eventDateEnd)) {
926 $sql .= " AND (ac.datep2 IS NOT NULL AND ac.datep2 <= '".$db->idate($eventDateEnd)."')";
927 }
928 $sql .= ")";
929
930 $sql .= ")";
931 $resql = $db->query($sql);
932 if (!$resql) {
933 $error++;
934 $object->error = $db->lasterror();
935 $object->errors[] = $object->error;
936 } else {
937 if ($db->num_rows($resql) > 0) {
938 // Resource already in use
939 $error++;
940 $object->error = $langs->trans('ErrorResourcesAlreadyInUse').' : ';
941 while ($obj = $db->fetch_object($resql)) {
942 $object->error .= '<br> - '.$langs->trans('ErrorResourceUseInEvent', $obj->r_ref, $obj->ac_label.' ['.$obj->ac_id.']');
943 }
944 $object->errors[] = $object->error;
945 }
946 $db->free($resql);
947 }
948
949 if ($error) {
950 setEventMessages($object->error, $object->errors, 'errors');
951 }
952 }
953 }
954
955 if (!$error) {
956 $db->begin();
957
958 $result = $object->update($user);
959
960 if ($result > 0) {
961 // Category association
962 $categories = GETPOST('categories', 'array');
963 $object->setCategories($categories);
964
965 $object->loadReminders($remindertype, 0, false);
966
967 // If there is reminders, we remove them
968 if (!empty($object->reminders)) {
969 foreach ($object->reminders as $reminder) {
970 if ($reminder->status < 1) { // If already sent, we never remove it
971 $reminder->delete($user);
972 }
973 }
974 $object->reminders = array();
975 }
976
977 // Create reminders for every assigned user if reminder is on
978 if ($addreminder == 'on') {
979 $actionCommReminder = new ActionCommReminder($db);
980
981 $dateremind = dol_time_plus_duree($datep, -1 * $offsetvalue, $offsetunit);
982
983 $actionCommReminder->dateremind = $dateremind;
984 $actionCommReminder->typeremind = $remindertype;
985 $actionCommReminder->offsetunit = $offsetunit;
986 $actionCommReminder->offsetvalue = $offsetvalue;
987 $actionCommReminder->status = $actionCommReminder::STATUS_TODO;
988 $actionCommReminder->fk_actioncomm = $object->id;
989 if ($remindertype == 'email') {
990 $actionCommReminder->fk_email_template = $modelmail;
991 }
992
993 // the notification must be created for every user assigned to the event
994 foreach ($object->userassigned as $userassigned) {
995 $actionCommReminder->fk_user = $userassigned['id'];
996 $res = $actionCommReminder->create($user);
997
998 if ($res <= 0) {
999 // If error
1000 $langs->load("errors");
1001 $error = $langs->trans('ErrorReminderActionCommCreation');
1002 setEventMessages($error, null, 'errors');
1003 $action = 'create';
1004 $donotclearsession = 1;
1005 break;
1006 }
1007 }
1008 }
1009
1010 unset($_SESSION['assignedtouser']);
1011 unset($_SESSION['assignedtoresource']);
1012
1013 if (!$error) {
1014 $db->commit();
1015 } else {
1016 $db->rollback();
1017 }
1018 } else {
1019 setEventMessages($object->error, $object->errors, 'errors');
1020 $db->rollback();
1021 }
1022 }
1023 }
1024
1025 if (!$error) {
1026 if (!empty($backtopage)) {
1027 unset($_SESSION['assignedtouser']);
1028 header("Location: ".$backtopage);
1029 exit;
1030 }
1031 }
1032}
1033
1034// Delete event
1035if (empty($reshook) && $action == 'confirm_delete' && GETPOST("confirm") == 'yes') {
1036 $object->fetch($id);
1037 $object->fetch_optionals();
1038 $object->fetch_userassigned();
1039 $object->oldcopy = dol_clone($object, 2);
1040
1041 if ($user->hasRight('agenda', 'myactions', 'delete')
1042 || $user->hasRight('agenda', 'allactions', 'delete')) {
1043 $result = $object->delete($user);
1044
1045 if ($result >= 0) {
1046 header("Location: index.php");
1047 exit;
1048 } else {
1049 setEventMessages($object->error, $object->errors, 'errors');
1050 }
1051 }
1052}
1053
1054/*
1055 * Action move update, used when user move an event in calendar by drag'n drop
1056 * TODO Move this into page comm/action/index that trigger this call by the drag and drop of event.
1057 */
1058if (empty($reshook) && GETPOST('actionmove', 'alpha') == 'mupdate') {
1059 $error = 0;
1060
1061 $shour = dol_print_date($object->datep, "%H", 'tzuserrel'); // We take the date visible by user $newdate is also date visible by user.
1062 $smin = dol_print_date($object->datep, "%M", 'tzuserrel');
1063
1064 $newdate = GETPOST('newdate', 'alpha');
1065 if (empty($newdate) || strpos($newdate, 'dayevent_') != 0) {
1066 header("Location: ".$backtopage, true, 307);
1067 exit;
1068 }
1069
1070 $datep = dol_mktime($shour, $smin, 0, substr($newdate, 13, 2), substr($newdate, 15, 2), substr($newdate, 9, 4), 'tzuserrel');
1071 //print dol_print_date($datep, 'dayhour');exit;
1072
1073 if ($datep != $object->datep) {
1074 if (!empty($object->datef)) {
1075 $object->datef += $datep - $object->datep;
1076 }
1077 $object->datep = $datep;
1078
1079 if (!$error) {
1080 // check if an event resource is already in use
1081 if (getDolGlobalString('RESOURCE_USED_IN_EVENT_CHECK') && $object->element == 'action') {
1082 $eventDateStart = $object->datep;
1083 $eventDateEnd = $object->datef;
1084
1085 $sql = "SELECT er.rowid, r.ref as r_ref, ac.id as ac_id, ac.label as ac_label";
1086 $sql .= " FROM ".MAIN_DB_PREFIX."element_resources as er";
1087 $sql .= " INNER JOIN ".MAIN_DB_PREFIX."resource as r ON r.rowid = er.resource_id AND er.resource_type = 'dolresource'";
1088 $sql .= " INNER JOIN ".MAIN_DB_PREFIX."actioncomm as ac ON ac.id = er.element_id AND er.element_type = '".$db->escape($object->element)."'";
1089 $sql .= " WHERE ac.id <> ".((int) $object->id);
1090 $sql .= " AND er.resource_id IN (";
1091 $sql .= " SELECT resource_id FROM ".MAIN_DB_PREFIX."element_resources";
1092 $sql .= " WHERE element_id = ".((int) $object->id);
1093 $sql .= " AND element_type = '".$db->escape($object->element)."'";
1094 $sql .= " AND busy = 1";
1095 $sql .= ")";
1096 $sql .= " AND er.busy = 1";
1097 $sql .= " AND (";
1098
1099 // event date start between ac.datep and ac.datep2 (if datep2 is null we consider there is no end)
1100 $sql .= " (ac.datep <= '".$db->idate($eventDateStart)."' AND (ac.datep2 IS NULL OR ac.datep2 >= '".$db->idate($eventDateStart)."'))";
1101 // event date end between ac.datep and ac.datep2
1102 if (!empty($eventDateEnd)) {
1103 $sql .= " OR (ac.datep <= '".$db->idate($eventDateEnd)."' AND (ac.datep2 >= '".$db->idate($eventDateEnd)."'))";
1104 }
1105 // event date start before ac.datep and event date end after ac.datep2
1106 $sql .= " OR (";
1107 $sql .= "ac.datep >= '".$db->idate($eventDateStart)."'";
1108 if (!empty($eventDateEnd)) {
1109 $sql .= " AND (ac.datep2 IS NOT NULL AND ac.datep2 <= '".$db->idate($eventDateEnd)."')";
1110 }
1111 $sql .= ")";
1112
1113 $sql .= ")";
1114 $resql = $db->query($sql);
1115 if (!$resql) {
1116 $error++;
1117 $object->error = $db->lasterror();
1118 $object->errors[] = $object->error;
1119 } else {
1120 if ($db->num_rows($resql) > 0) {
1121 // Resource already in use
1122 $error++;
1123 $object->error = $langs->trans('ErrorResourcesAlreadyInUse').' : ';
1124 while ($obj = $db->fetch_object($resql)) {
1125 $object->error .= '<br> - '.$langs->trans('ErrorResourceUseInEvent', $obj->r_ref, $obj->ac_label.' ['.$obj->ac_id.']');
1126 }
1127 $object->errors[] = $object->error;
1128 }
1129 $db->free($resql);
1130 }
1131
1132 if ($error) {
1133 setEventMessages($object->error, $object->errors, 'errors');
1134 }
1135 }
1136 }
1137
1138 if (!$error) {
1139 $db->begin();
1140 $result = $object->update($user);
1141 if ($result < 0) {
1142 $error++;
1143 setEventMessages($object->error, $object->errors, 'errors');
1144 $db->rollback();
1145 } else {
1146 $db->commit();
1147 }
1148 }
1149 }
1150 if (!empty($backtopage)) {
1151 header("Location: ".$backtopage, true, 307);
1152 exit;
1153 } else {
1154 $action = '';
1155 }
1156}
1157
1158// Actions to delete doc
1159$upload_dir = $conf->agenda->dir_output.'/'.dol_sanitizeFileName($object->ref);
1160$permissiontoadd = ($user->hasRight('agenda', 'allactions', 'create') || (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->hasRight('agenda', 'myactions', 'read')));
1161if (empty($reshook)) {
1162 include DOL_DOCUMENT_ROOT.'/core/actions_builddoc.inc.php';
1163}
1164
1165
1166/*
1167 * View
1168 */
1169
1170$form = new Form($db);
1171$formproject = new FormProjets($db);
1172
1173$arrayrecurrulefreq = array(
1174 'no' => $langs->trans("OnceOnly"),
1175 'MONTHLY' => $langs->trans("EveryMonth"),
1176 'WEEKLY' => $langs->trans("EveryWeek")
1177 // 'DAILY'=>$langs->trans("EveryDay")
1178);
1179
1180
1181$help_url = 'EN:Module_Agenda_En|FR:Module_Agenda|ES:M&omodulodulo_Agenda|DE:Modul_Terminplanung';
1182llxHeader('', $langs->trans("Agenda"), $help_url);
1183
1184if ($action == 'create') {
1185 $contact = new Contact($db);
1186
1187 $socpeopleassigned = GETPOST("socpeopleassigned", 'array');
1188 if (!empty($socpeopleassigned[0])) {
1189 $result = $contact->fetch($socpeopleassigned[0]);
1190 if ($result < 0) {
1191 dol_print_error($db, $contact->error);
1192 }
1193 }
1194
1195 dol_set_focus("#label");
1196
1197 if (!empty($conf->use_javascript_ajax)) {
1198 print "\n".'<script type="text/javascript">';
1199 print '$(document).ready(function () {
1200 function setdatefields()
1201 {
1202 if ($("#fullday:checked").val() == null) {
1203 $(".fulldaystarthour").removeAttr("disabled");
1204 $(".fulldaystartmin").removeAttr("disabled");
1205 $(".fulldayendhour").removeAttr("disabled");
1206 $(".fulldayendmin").removeAttr("disabled");
1207 $("#p2").removeAttr("disabled");
1208 } else {
1209 $(".fulldaystarthour").prop("disabled", true).val("00");
1210 $(".fulldaystartmin").prop("disabled", true).val("00");
1211 $(".fulldayendhour").prop("disabled", true).val("23");
1212 $(".fulldayendmin").prop("disabled", true).val("59");
1213 $("#p2").removeAttr("disabled");
1214 }
1215 }
1216 $("#fullday").change(function() {
1217 console.log("setdatefields");
1218 setdatefields();
1219 });
1220
1221 $("#actioncode").change(function() {
1222 if ($("#actioncode").val() == \'AC_RDV\') $("#dateend").addClass("fieldrequired");
1223 else $("#dateend").removeClass("fieldrequired");
1224 });
1225 $("#aphour,#apmin").change(function() {
1226 if ($("#actioncode").val() == \'AC_RDV\') {
1227 console.log("Start date was changed, we modify end date "+(parseInt($("#aphour").val()))+" "+$("#apmin").val()+" -> "+("00" + (parseInt($("#aphour").val()) + 1)).substr(-2,2));
1228 $("#p2hour").val(("00" + (parseInt($("#aphour").val()) + 1)).substr(-2,2));
1229 $("#p2min").val($("#apmin").val());
1230 $("#p2day").val($("#apday").val());
1231 $("#p2month").val($("#apmonth").val());
1232 $("#p2year").val($("#apyear").val());
1233 $("#p2").val($("#ap").val());
1234 }
1235 });
1236 if ($("#actioncode").val() == \'AC_RDV\') $("#dateend").addClass("fieldrequired");
1237 else $("#dateend").removeClass("fieldrequired");
1238 setdatefields();
1239 })';
1240 print '</script>'."\n";
1241 }
1242
1243 print '<form name="formaction" action="'.$_SERVER['PHP_SELF'].'" method="POST">';
1244 print '<input type="hidden" name="token" value="'.newToken().'">';
1245 print '<input type="hidden" name="action" value="add">';
1246 print '<input type="hidden" name="donotclearsession" value="1">';
1247 print '<input type="hidden" name="page_y" value="">';
1248 if ($backtopage) {
1249 print '<input type="hidden" name="backtopage" value="'.($backtopage != '1' ? $backtopage : '').'">';
1250 }
1251 if (!getDolGlobalString('AGENDA_USE_EVENT_TYPE')) {
1252 print '<input type="hidden" name="actioncode" value="'.dol_getIdFromCode($db, 'AC_OTH', 'c_actioncomm').'">';
1253 }
1254
1255 if (GETPOST("actioncode", 'aZ09') == 'AC_RDV') {
1256 print load_fiche_titre($langs->trans("AddActionRendezVous"), '', 'title_agenda');
1257 } else {
1258 print load_fiche_titre($langs->trans("AddAnAction"), '', 'title_agenda');
1259 }
1260
1261 print dol_get_fiche_head();
1262
1263 print '<table class="border centpercent">';
1264
1265 // Type of event
1266 if (getDolGlobalString('AGENDA_USE_EVENT_TYPE')) {
1267 print '<tr><td class="titlefieldcreate"><span class="fieldrequired">'.$langs->trans("Type").'</span></b></td><td>';
1268 $default = getDolGlobalString('AGENDA_USE_EVENT_TYPE_DEFAULT', 'AC_RDV');
1269 print img_picto($langs->trans("ActionType"), 'square', 'class="fawidth30 inline-block" style="color: #ddd;"');
1270 $selectedvalue = GETPOSTISSET("actioncode") ? GETPOST("actioncode", 'aZ09') : ($object->type_code ? $object->type_code : $default);
1271 print $formactions->select_type_actions($selectedvalue, "actioncode", "systemauto", 0, -1, 0, 1); // TODO Replace 0 with -2 in onlyautoornot
1272 print '</td></tr>';
1273 }
1274
1275 // Title
1276 print '<tr><td'.(!getDolGlobalString('AGENDA_USE_EVENT_TYPE') ? ' class="fieldrequired titlefieldcreate"' : '').'>'.$langs->trans("Label").'</td><td><input type="text" id="label" name="label" class="soixantepercent" value="'.GETPOST('label').'"></td></tr>';
1277
1278 // Full day
1279 print '<tr><td><span class="fieldrequired">'.$langs->trans("Date").'</span></td>';
1280 print '<td class="valignmiddle height30"><input class="valignmiddle" type="checkbox" id="fullday" name="fullday" '.(GETPOST('fullday') ? ' checked' : '').'><label for="fullday" class="valignmiddle small">'.$langs->trans("EventOnFullDay").'</label>';
1281
1282 // Recurring event
1283 $userepeatevent = (getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 1 ? 1 : 0);
1284 if ($userepeatevent) {
1285 // Repeat
1286 print ' &nbsp; &nbsp; &nbsp; &nbsp; <div class="opacitymedium inline-block small">';
1287 print img_picto($langs->trans("Recurrence"), 'recurring', 'style="margin-left: 6px" class="paddingright2"');
1288 print '<input type="hidden" name="recurid" value="'.(empty($object->recurid) ? '' : $object->recurid).'">';
1289
1290 $selectedrecurrulefreq = 'no';
1291 $selectedrecurrulebymonthday = '';
1292 $selectedrecurrulebyday = '';
1293 $object->recurrule = GETPOSTISSET('recurrulefreq') ? "FREQ=".GETPOST('recurrulefreq', 'alpha') : "";
1294 $object->recurrule .= GETPOSTISSET('BYMONTHDAY') ? "_BYMONTHDAY".GETPOST('BYMONTHDAY', 'alpha') : "";
1295 $object->recurrule .= GETPOSTISSET('BYDAY') ? "_BYDAY".GETPOST('BYDAY', 'alpha') : "";
1296
1297
1298 $reg = array();
1299 if ($object->recurrule && preg_match('/FREQ=([A-Z]+)/i', $object->recurrule, $reg)) {
1300 $selectedrecurrulefreq = $reg[1];
1301 }
1302 if ($object->recurrule && preg_match('/FREQ=MONTHLY.*BYMONTHDAY(\d+)/i', $object->recurrule, $reg)) {
1303 $selectedrecurrulebymonthday = (int) $reg[1];
1304 }
1305 if ($object->recurrule && preg_match('/FREQ=WEEKLY.*BYDAY(\d+)/i', $object->recurrule, $reg)) {
1306 $selectedrecurrulebyday = (int) $reg[1];
1307 }
1308
1309 print $form->selectarray('recurrulefreq', $arrayrecurrulefreq, $selectedrecurrulefreq, 0, 0, 0, '', 0, 0, 0, '', 'marginrightonly');
1310 // print '<script>console.log("recurrule: " +'.$object->recurrule.')</script>';
1311 // For recursive event
1312
1313
1314 // If recurrulefreq is MONTHLY
1315 print '<div class="hidden marginrightonly inline-block repeateventBYMONTHDAY">';
1316 print $langs->trans("DayOfMonth").': <input type="input" size="2" name="BYMONTHDAY" value="'.$selectedrecurrulebymonthday.'">';
1317 print '</div>';
1318 // If recurrulefreq is WEEKLY
1319 print '<div class="hidden marginrightonly inline-block repeateventBYDAY">';
1320 print $langs->trans("DayOfWeek").': <input type="input" size="4" name="BYDAY" value="'.$selectedrecurrulebyday.'">';
1321 print '</div>';
1322 // limit date
1323 $repeateventlimitdate = !empty($repeateventlimitdate) ? $repeateventlimitdate : '';
1324 print '<div class="hidden marginrightonly inline-block repeateventlimitdate">';
1325 print $langs->trans("Until")." ";
1326 print $form->selectDate($repeateventlimitdate, 'limit', 0, 0, 0, "action", 1, 0, 0, '', '', '', '', 1, '', '', 'tzuserrel');
1327 print '</div>';
1328
1329 print '<script type="text/javascript">
1330 jQuery(document).ready(function() {
1331 function init_repeat()
1332 {
1333 console.log("recurrule: " + "'.$object->recurrule.'");
1334 console.log("reg1: " + "'.$selectedrecurrulefreq.'");
1335 console.log("reg2: " + "'.$selectedrecurrulebymonthday.'");
1336 console.log("reg3: " + "'.$selectedrecurrulebyday.'");
1337 console.log("selectedrulefreq: " + "'.$selectedrecurrulefreq.'");
1338 if (jQuery("#recurrulefreq").val() == \'MONTHLY\')
1339 {
1340 jQuery(".repeateventBYMONTHDAY").css("display", "inline-block"); /* use this instead of show because we want inline-block and not block */
1341 jQuery(".repeateventlimitdate").css("display", "inline-block");
1342 jQuery(".repeateventBYDAY").hide();
1343 }
1344 else if (jQuery("#recurrulefreq").val() == \'WEEKLY\')
1345 {
1346 jQuery(".repeateventBYMONTHDAY").hide();
1347 jQuery(".repeateventBYDAY").css("display", "inline-block"); /* use this instead of show because we want inline-block and not block */
1348 jQuery(".repeateventlimitdate").css("display", "inline-block");
1349 }
1350 else
1351 {
1352 jQuery(".repeateventBYMONTHDAY").hide();
1353 jQuery(".repeateventBYDAY").hide();
1354 jQuery(".repeateventlimitdate").hide();
1355 }
1356 }
1357 init_repeat();
1358 jQuery("#recurrulefreq").change(function() {
1359 init_repeat();
1360 });
1361 });
1362 </script>';
1363 print '</div>';
1364 //print '</td></tr>';
1365 }
1366
1367 print '</td></tr>';
1368
1369 $datep = ($datep ? $datep : (is_null($object->datep) ? '' : $object->datep));
1370 if (GETPOSTINT('datep', 1)) {
1371 $datep = dol_stringtotime(GETPOSTINT('datep', 1), 'tzuserrel');
1372 }
1373 $datef = ($datef ? $datef : $object->datef);
1374 if (GETPOSTINT('datef', 1)) {
1375 $datef = dol_stringtotime(GETPOSTINT('datef', 1), 'tzuserrel');
1376 }
1377 if (empty($datef) && !empty($datep)) {
1378 if (GETPOST("actioncode", 'aZ09') == 'AC_RDV' || !getDolGlobalString('AGENDA_USE_EVENT_TYPE_DEFAULT')) {
1379 $datef = dol_time_plus_duree($datep, getDolGlobalInt('AGENDA_AUTOSET_END_DATE_WITH_DELTA_HOURS', 1), 'h');
1380 }
1381 }
1382
1383 // Date start
1384 print '<tr><td class="nowrap">';
1385 print '</td><td>';
1386 if (GETPOST("afaire") == 1) {
1387 print $form->selectDate($datep, 'ap', 1, 1, 0, "action", 1, 2, 0, 'fulldaystart', '', '', '', 1, '', '', 'tzuserrel'); // Empty value not allowed for start date and hours if "todo"
1388 } else {
1389 print $form->selectDate($datep, 'ap', 1, 1, 1, "action", 1, 2, 0, 'fulldaystart', '', '', '', 1, '', '', 'tzuserrel');
1390 }
1391 print ' <span class="hideonsmartphone">&nbsp; &nbsp; - &nbsp; &nbsp;</span><br class="showonsmartphone"> ';
1392 print $form->selectDate($datef, 'p2', 1, 1, 1, "action", 1, 2, 0, 'fulldayend', '', '', '', 1, '', '', 'tzuserrel');
1393 print '</td></tr>';
1394
1395 print '<tr><td class="">&nbsp;</td><td></td></tr>';
1396
1397 // Assigned to user
1398 print '<tr><td class="tdtop nowrap"><span class="fieldrequired">'.$langs->trans("ActionAffectedTo").'</span></td><td>';
1399 $listofuserid = array();
1400 $listofcontactid = array();
1401 $listofotherid = array();
1402
1403 if (empty($donotclearsession)) {
1404 $assignedtouser = GETPOST("assignedtouser") ? GETPOST("assignedtouser") : (!empty($object->userownerid) && $object->userownerid > 0 ? $object->userownerid : $user->id);
1405 if ($assignedtouser) {
1406 $listofuserid[$assignedtouser] = array('id' => $assignedtouser, 'mandatory' => 0); // Owner first
1407 }
1408 //$listofuserid[$user->id] = array('id'=>$user->id, 'mandatory'=>0, 'transparency'=>(GETPOSTISSET('transparency') ? GETPOST('transparency', 'alpha') : 1)); // 1 by default at first init
1409 $listofuserid[$assignedtouser]['transparency'] = (GETPOSTISSET('transparency') ? GETPOST('transparency', 'alpha') : 1); // 1 by default at first init
1410 $_SESSION['assignedtouser'] = json_encode($listofuserid);
1411 } else {
1412 if (!empty($_SESSION['assignedtouser'])) {
1413 $listofuserid = json_decode($_SESSION['assignedtouser'], true);
1414 }
1415 $firstelem = reset($listofuserid);
1416 if (isset($listofuserid[$firstelem['id']])) {
1417 $listofuserid[$firstelem['id']]['transparency'] = (GETPOSTISSET('transparency') ? GETPOST('transparency', 'alpha') : 0); // 0 by default when refreshing
1418 }
1419 }
1420 print '<div class="assignedtouser">';
1421 print $form->select_dolusers_forevent(($action == 'create' ? 'add' : 'update'), 'assignedtouser', 1, '', 0, '', '', 0, 0, 0, 'AND u.statut != 0', 1, $listofuserid, $listofcontactid, $listofotherid);
1422 print '</div>';
1423 print '</td></tr>';
1424
1425 // Location
1426 if (!getDolGlobalString('AGENDA_DISABLE_LOCATION')) {
1427 print '<tr><td>'.$langs->trans("Location").'</td><td><input type="text" name="location" class="minwidth300 maxwidth150onsmartphone" value="'.(GETPOST('location') ? GETPOST('location') : $object->location).'"></td></tr>';
1428 }
1429
1430 if (isModEnabled('category')) {
1431 // Categories
1432 print '<tr><td>'.$langs->trans("Categories").'</td><td>';
1433 $cate_arbo = $form->select_all_categories(Categorie::TYPE_ACTIONCOMM, '', 'parent', 64, 0, 3);
1434 print img_picto('', 'category').$form->multiselectarray('categories', $cate_arbo, GETPOST('categories', 'array'), '', 0, 'minwidth300 quatrevingtpercent widthcentpercentminusx', 0, 0);
1435 print "</td></tr>";
1436 }
1437
1438 if (isModEnabled('resource')) {
1439 // Categories
1440 print '<tr><td class="tdtop nowrap">'.$langs->trans("Resource").'</td><td>';
1441
1442 $listofresourceid = array();
1443 if (empty($donotclearsession)) {
1444 $assignedtoresource = GETPOST("assignedtoresource");
1445 if ($assignedtoresource) {
1446 $listofresourceid[$assignedtoresource] = array('id' => $assignedtoresource, 'mandatory' => 0); // Owner first
1447 }
1448 $_SESSION['assignedtoresource'] = json_encode($listofresourceid);
1449 } else {
1450 if (!empty($_SESSION['assignedtoresource'])) {
1451 $listofresourceid = json_decode($_SESSION['assignedtoresource'], true);
1452 }
1453 $firstelem = reset($listofresourceid);
1454 if (isset($listofresourceid[$firstelem['id']])) {
1455 $listofresourceid[$firstelem['id']]['transparency'] = (GETPOSTISSET('transparency') ? GETPOST('transparency', 'alpha') : 0); // 0 by default when refreshing
1456 }
1457 }
1458 print '<div class="assignedtoresource">';
1459 print $form->select_dolresources_forevent(($action == 'create' ? 'add' : 'update'), 'assignedtoresource', 1, '', 0, '', '', 0, 0, 0, 'AND u.statut != 0', 1, $listofresourceid);
1460 print '</div>';
1461 print '</td></tr>';
1462 }
1463
1464 // Status
1465 print '<tr><td>'.$langs->trans("Status").' / '.$langs->trans("Percentage").'</td>';
1466 print '<td>';
1467 $percent = $complete !== '' ? $complete : -1;
1468 if (GETPOSTISSET('status')) {
1469 $percent = GETPOST('status');
1470 } elseif (GETPOSTISSET('percentage')) {
1471 $percent = GETPOSTINT('percentage');
1472 } else {
1473 if ($complete == '0' || GETPOST("afaire") == 1) {
1474 $percent = '0';
1475 } elseif ($complete == 100 || GETPOST("afaire") == 2) {
1476 $percent = 100;
1477 }
1478 }
1479 $formactions->form_select_status_action('formaction', $percent, 1, 'complete', 0, 0, 'maxwidth200');
1480 print '</td></tr>';
1481
1482 print '</table>';
1483
1484
1485 print '<br><hr><br>';
1486
1487
1488 print '<table class="border centpercent">';
1489
1490 if (isModEnabled("societe")) {
1491 // Related company
1492 print '<tr><td class="titlefieldcreate nowrap">'.$langs->trans("ActionOnCompany").'</td><td>';
1493 if (GETPOSTINT('socid') > 0) {
1494 $societe = new Societe($db);
1495 $societe->fetch(GETPOSTINT('socid'));
1496 print $societe->getNomUrl(1);
1497 print '<input type="hidden" id="socid" name="socid" value="'.GETPOSTINT('socid').'">';
1498 } else {
1499 $events = array();
1500 $events[] = array('method' => 'getContacts', 'url' => dol_buildpath('/core/ajax/contacts.php?showempty=1', 1), 'htmlname' => 'contactid', 'params' => array('add-customer-contact' => 'disabled'));
1501 //For external user force the company to user company
1502 if (!empty($user->socid)) {
1503 print img_picto('', 'company', 'class="paddingrightonly"').$form->select_company($user->socid, 'socid', '', 1, 1, 0, $events, 0, 'minwidth300 widthcentpercentminusxx maxwidth500');
1504 } else {
1505 print img_picto('', 'company', 'class="paddingrightonly"').$form->select_company('', 'socid', '', 'SelectThirdParty', 1, 0, $events, 0, 'minwidth300 widthcentpercentminusxx maxwidth500');
1506 }
1507 }
1508 print '</td></tr>';
1509
1510 // Related contact
1511 print '<tr><td class="nowrap">'.$langs->trans("ActionOnContact").'</td><td>';
1512 $preselectedids = GETPOST('socpeopleassigned', 'array:int');
1513 if (GETPOSTINT('contactid')) {
1514 $preselectedids[GETPOSTINT('contactid')] = GETPOSTINT('contactid');
1515 }
1516 if ($origin == 'contact') {
1517 $preselectedids[GETPOSTINT('originid')] = GETPOSTINT('originid');
1518 }
1519 // select "all" or "none" contact by default
1520 if (getDolGlobalInt('MAIN_ACTIONCOM_CAN_ADD_ANY_CONTACT')) {
1521 // Warning: MAIN_ACTIONCOM_CAN_ADD_ANY_CONTACT will hangs on large databases
1522 $select_contact_default = 0; // select "all" contacts by default : avoid to use it if there is a lot of contacts
1523 } else {
1524 $select_contact_default = -1; // select "none" by default
1525 }
1526 print img_picto('', 'contact', 'class="paddingrightonly"');
1527
1528 if (getDolGlobalString('CONTACT_USE_SEARCH_TO_SELECT') && $conf->use_javascript_ajax) {
1529 // FIXME Use a select without the "multiple" (not supported when CONTACT_USE_SEARCH_TO_SELECT is on) or allow use only when $object->socid is set...
1530 /*
1531 $selected = array_keys($object->socpeopleassigned);
1532 print $form->select_contact(getDolGlobalString('MAIN_ACTIONCOM_CAN_ADD_ANY_CONTACT') ? 0 : $object->socid, $selected, 'socpeopleassigned', 1, '', '', 1, 'minwidth300 widthcentpercentminusx', false, 0, 0, array());
1533 */
1534 $sav = getDolGlobalString('CONTACT_USE_SEARCH_TO_SELECT');
1535 $conf->global->CONTACT_USE_SEARCH_TO_SELECT = 0;
1536 print $form->selectcontacts(GETPOSTISSET('socid') ? GETPOSTINT('socid') : $select_contact_default, $preselectedids, 'socpeopleassigned[]', 1, '', '', 0, 'minwidth300 widthcentpercentminusxx maxwidth500', 0, 0, array(), false, 'multiple', 'contactid');
1537 $conf->global->CONTACT_USE_SEARCH_TO_SELECT = $sav;
1538 } else {
1539 print $form->selectcontacts(GETPOSTISSET('socid') ? GETPOSTINT('socid') : $select_contact_default, $preselectedids, 'socpeopleassigned[]', 1, '', '', 0, 'minwidth300 widthcentpercentminusxx maxwidth500', 0, 0, array(), false, 'multiple', 'contactid');
1540 }
1541
1542 print '</td></tr>';
1543 }
1544
1545 // Project
1546 if (isModEnabled('project')) {
1547 $langs->load("projects");
1548
1549 $projectid = GETPOSTINT('projectid');
1550
1551 print '<tr><td class="titlefieldcreate">'.$langs->trans("Project").'</td><td id="project-input-container">';
1552 print img_picto('', 'project', 'class="pictofixedwidth"');
1553 print $formproject->select_projects(($object->socid > 0 ? $object->socid : -1), $projectid, 'projectid', 0, 0, 1, 1, 0, 0, 0, '', 1, 0, 'maxwidth500 widthcentpercentminusxx maxwidth500');
1554
1555 print '&nbsp;<a href="'.DOL_URL_ROOT.'/projet/card.php?socid='.(empty($societe->id) ? '' : $societe->id).'&action=create&backtopage='.urlencode($_SERVER["PHP_SELF"].'?action=create').'">';
1556 print '<span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans("AddProject").'"></span></a>';
1557 $urloption = '?action=create&donotclearsession=1';
1558 $url = dol_buildpath('comm/action/card.php', 2).$urloption;
1559
1560 // update task list
1561 print "\n".'<script type="text/javascript">';
1562 print '$(document).ready(function () {
1563 $("#projectid").change(function () {
1564 var url = "'.DOL_URL_ROOT.'/projet/ajax/projects.php?mode=gettasks&socid="+$("#search_socid").val()+"&projectid="+$("#projectid").val();
1565 console.log("Call url to get new list of tasks: "+url);
1566 $.get(url, function(data) {
1567 console.log(data);
1568 if (data) $("#taskid").html(data).select2();
1569 })
1570 });
1571 })';
1572 print '</script>'."\n";
1573
1574 print '</td></tr>';
1575
1576 // Task
1577 print '<tr><td class="titlefieldcreate">'.$langs->trans("Task").'</td><td id="project-task-input-container" >';
1578 print img_picto('', 'projecttask', 'class="paddingrightonly"');
1579 $projectsListId = false;
1580 if (!empty($projectid)) {
1581 $projectsListId = $projectid;
1582 }
1583
1584 $tid = GETPOSTISSET("projecttaskid") ? GETPOSTINT("projecttaskid") : (GETPOSTISSET("taskid") ? GETPOSTINT("taskid") : '');
1585
1586 $formproject->selectTasks((!empty($societe->id) ? $societe->id : -1), $tid, 'taskid', 24, 0, '1', 1, 0, 0, 'maxwidth500 widthcentpercentminusxx', $projectsListId);
1587 print '</td></tr>';
1588 }
1589
1590 // Object linked
1591 if (!empty($origin) && !empty($originid)) {
1592 include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
1593
1594 $hasPermissionOnLinkedObject = 0;
1595
1596 $elProp = getElementProperties($origin);
1597 if ($user->hasRight($elProp['module'], 'read') || $user->hasRight($elProp['module'], $elProp['element'], 'read')) {
1598 $hasPermissionOnLinkedObject = 1;
1599 }
1600 //var_dump('origin='.$origin.' originid='.$originid.' hasPermissionOnLinkedObject='.$hasPermissionOnLinkedObject);
1601
1602 if (! in_array($origin, array('societe', 'project', 'task', 'user'))) {
1603 // We do not use link for object that already contains a hard coded field to make links with agenda events
1604 print '<tr><td class="titlefieldcreate">'.$langs->trans("LinkedObject").'</td>';
1605 print '<td colspan="3">';
1606 if ($hasPermissionOnLinkedObject) {
1607 print dolGetElementUrl($originid, $origin, 1);
1608 print '<input type="hidden" name="fk_element" value="'.$originid.'">';
1609 print '<input type="hidden" name="elementtype" value="'.$origin.'">';
1610 print '<input type="hidden" name="originid" value="'.$originid.'">';
1611 print '<input type="hidden" name="origin" value="'.$origin.'">';
1612 } else {
1613 print '<!-- no permission on object to link '.$origin.' id '.$originid.' -->';
1614 }
1615 print '</td></tr>';
1616 }
1617 }
1618
1619 // Priority
1620 if (getDolGlobalString('AGENDA_SUPPORT_PRIORITY_IN_EVENTS')) {
1621 print '<tr><td class="titlefieldcreate nowrap">'.$langs->trans("Priority").'</td><td colspan="3">';
1622 print '<input type="text" name="priority" value="'.(GETPOSTISSET('priority') ? GETPOSTINT('priority') : ($object->priority ? $object->priority : '')).'" size="5">';
1623 print '</td></tr>';
1624 }
1625
1626 // Description
1627 print '<tr><td class="tdtop">'.$langs->trans("Description").'</td><td>';
1628 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
1629 $doleditor = new DolEditor('note', (GETPOSTISSET('note') ? GETPOST('note', 'restricthtml') : $object->note_private), '', 120, 'dolibarr_notes', 'In', true, true, isModEnabled('fckeditor'), ROWS_4, '90%');
1630 $doleditor->Create();
1631 print '</td></tr>';
1632
1633 // Other attributes
1634 $parameters = array();
1635 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1636 print $hookmanager->resPrint;
1637 if (empty($reshook)) {
1638 print $object->showOptionals($extrafields, 'create', $parameters);
1639 }
1640
1641 print '</table>';
1642
1643
1644 if (getDolGlobalString('AGENDA_REMINDER_EMAIL') || getDolGlobalString('AGENDA_REMINDER_BROWSER')) {
1645 //checkbox create reminder
1646 print '<hr>';
1647 print '<br>';
1648 print '<label for="addreminder">'.img_picto('', 'bell', 'class="pictofixedwidth"').$langs->trans("AddReminder").'</label> <input type="checkbox" id="addreminder" name="addreminder"><br><br>';
1649
1650 print '<div class="reminderparameters" style="display: none;">';
1651
1652 print '<table class="border centpercent">';
1653
1654 //Reminder
1655 print '<tr><td class="titlefieldcreate nowrap">'.$langs->trans("ReminderTime").'</td><td colspan="3">';
1656 print '<input class="width50" type="number" name="offsetvalue" value="'.(GETPOSTISSET('offsetvalue') ? GETPOSTINT('offsetvalue') : getDolGlobalInt('AGENDA_REMINDER_DEFAULT_OFFSET', 30)).'"> ';
1657 print $form->selectTypeDuration('offsetunit', 'i', array('y', 'm'));
1658 print '</td></tr>';
1659
1660 //Reminder Type
1661 print '<tr><td class="titlefieldcreate nowrap">'.$langs->trans("ReminderType").'</td><td colspan="3">';
1662 print $form->selectarray('selectremindertype', $TRemindTypes, '', 0, 0, 0, '', 0, 0, 0, '', 'minwidth200 maxwidth500', 1);
1663 print '</td></tr>';
1664
1665 //Mail Model
1666 if (getDolGlobalString('AGENDA_REMINDER_EMAIL')) {
1667 print '<tr><td class="titlefieldcreate nowrap">'.$langs->trans("EMailTemplates").'</td><td colspan="3">';
1668 print $form->selectModelMail('actioncommsend', 'actioncomm_send', 1, 1);
1669 print '</td></tr>';
1670 }
1671
1672 print '</table>';
1673 print '</div>';
1674
1675 print "\n".'<script type="text/javascript">';
1676 print '$(document).ready(function () {
1677 $("#addreminder").click(function(){
1678 console.log("Click on addreminder");
1679 if (this.checked) {
1680 $(".reminderparameters").show();
1681 } else {
1682 $(".reminderparameters").hide();
1683 }
1684 $("#selectremindertype").select2("destroy");
1685 $("#selectremindertype").select2();
1686 $("#select_offsetunittype_duration").select2("destroy");
1687 $("#select_offsetunittype_duration").select2();
1688 selectremindertype();
1689 });
1690
1691 $("#selectremindertype").change(function(){
1692 selectremindertype();
1693 });
1694
1695 function selectremindertype() {
1696 console.log("Call selectremindertype");
1697 var selected_option = $("#selectremindertype option:selected").val();
1698 if(selected_option == "email") {
1699 $("#select_actioncommsendmodel_mail").closest("tr").show();
1700 } else {
1701 $("#select_actioncommsendmodel_mail").closest("tr").hide();
1702 }
1703 }
1704
1705 })';
1706 print '</script>'."\n";
1707 }
1708
1709 print dol_get_fiche_end();
1710
1711 print $form->buttonsSaveCancel("Add");
1712
1713 print "</form>";
1714}
1715
1716// View or edit
1717if ($id > 0) {
1718 $result1 = $object->fetch($id);
1719 if ($result1 <= 0) {
1720 $langs->load("errors");
1721 print $langs->trans("ErrorRecordNotFound");
1722
1723 llxFooter();
1724 exit;
1725 }
1726
1727 $result2 = $object->fetch_thirdparty();
1728 $result2 = $object->fetch_projet();
1729 $result3 = $object->fetch_contact();
1730 $result4 = $object->fetch_userassigned();
1731 $result5 = $object->fetch_optionals();
1732
1733 if ($listUserAssignedUpdated || $donotclearsession) {
1734 $percentage = in_array(GETPOST('status'), array(-1, 100)) ? GETPOST('status') : (in_array($complete, array(-1, 100)) ? $complete : GETPOSTINT("percentage")); // If status is -1 or 100, percentage is not defined and we must use status
1735
1736 $datep = dol_mktime($fulldayevent ? '00' : $aphour, $fulldayevent ? '00' : $apmin, 0, GETPOSTINT("apmonth"), GETPOSTINT("apday"), GETPOSTINT("apyear"), 'tzuserrel');
1737 $datef = dol_mktime($fulldayevent ? '23' : $p2hour, $fulldayevent ? '59' : $p2min, $fulldayevent ? '59' : '0', GETPOSTINT("p2month"), GETPOSTINT("p2day"), GETPOSTINT("p2year"), 'tzuserrel');
1738
1739 $object->type_id = dol_getIdFromCode($db, GETPOST("actioncode", 'aZ09'), 'c_actioncomm');
1740 $object->label = GETPOST("label", "alphanohtml");
1741 $object->datep = $datep;
1742 $object->datef = $datef;
1743 $object->percentage = $percentage;
1744 $object->priority = GETPOST("priority", "alphanohtml");
1745 $object->fulldayevent = GETPOST("fullday") ? 1 : 0;
1746 $object->location = GETPOST('location', "alphanohtml");
1747 $object->socid = GETPOSTINT("socid");
1748 $socpeopleassigned = GETPOST("socpeopleassigned", 'array');
1749 foreach ($socpeopleassigned as $tmpid) {
1750 $object->socpeopleassigned[$id] = array('id' => $tmpid);
1751 }
1752 $object->contact_id = GETPOSTINT("contactid");
1753 $object->fk_project = GETPOSTINT("projectid");
1754
1755 $object->note_private = GETPOST("note", 'restricthtml');
1756 }
1757
1758 if ($result2 < 0 || $result3 < 0 || $result4 < 0 || $result5 < 0) {
1759 dol_print_error($db, $object->error);
1760 exit;
1761 }
1762
1763 if ($object->authorid > 0) {
1764 $tmpuser = new User($db);
1765 $res = $tmpuser->fetch($object->authorid);
1766 $object->author = $tmpuser;
1767 }
1768 if ($object->usermodid > 0) {
1769 $tmpuser = new User($db);
1770 $res = $tmpuser->fetch($object->usermodid);
1771 $object->usermod = $tmpuser;
1772 }
1773
1774
1775 /*
1776 * Show tabs
1777 */
1778
1780
1781 $now = dol_now();
1782 $delay_warning = getDolGlobalInt('MAIN_DELAY_ACTIONS_TODO') * 24 * 60 * 60;
1783
1784
1785 // Confirmation suppression action
1786 if ($action == 'delete') {
1787 print $form->formconfirm("card.php?id=".urlencode((string) ($id)), $langs->trans("DeleteAction"), $langs->trans("ConfirmDeleteAction"), "confirm_delete", '', '', 1);
1788 }
1789
1790 if ($action == 'edit') {
1791 if (!empty($conf->use_javascript_ajax)) {
1792 print "\n".'<script type="text/javascript">';
1793 print '$(document).ready(function () {
1794 function setdatefields()
1795 {
1796 if ($("#fullday:checked").val() == null) {
1797 $(".fulldaystarthour").removeAttr("disabled");
1798 $(".fulldaystartmin").removeAttr("disabled");
1799 $(".fulldayendhour").removeAttr("disabled");
1800 $(".fulldayendmin").removeAttr("disabled");
1801 } else {
1802 $(".fulldaystarthour").prop("disabled", true).val("00");
1803 $(".fulldaystartmin").prop("disabled", true).val("00");
1804 $(".fulldayendhour").prop("disabled", true).val("23");
1805 $(".fulldayendmin").prop("disabled", true).val("59");
1806 }
1807 }
1808 setdatefields();
1809 $("#fullday").change(function() {
1810 setdatefields();
1811 });
1812 $("#actioncode").change(function() {
1813 if ($("#actioncode").val() == \'AC_RDV\') $("#dateend").addClass("fieldrequired");
1814 else $("#dateend").removeClass("fieldrequired");
1815 });
1816 })';
1817 print '</script>'."\n";
1818 }
1819
1820 print '<form name="formaction" action="'.$_SERVER['PHP_SELF'].'" method="POST">';
1821 print '<input type="hidden" name="token" value="'.newToken().'">';
1822 print '<input type="hidden" name="action" value="update">';
1823 print '<input type="hidden" name="id" value="'.$id.'">';
1824 print '<input type="hidden" name="ref_ext" value="'.$object->ref_ext.'">';
1825 print '<input type="hidden" name="page_y" value="">';
1826 if ($backtopage) {
1827 print '<input type="hidden" name="backtopage" value="'.($backtopage != '1' ? $backtopage : '').'">';
1828 }
1829 if (!getDolGlobalString('AGENDA_USE_EVENT_TYPE') && ! preg_match('/^TICKET_MSG_PRIVATE/', $object->code)) {
1830 print '<input type="hidden" name="actioncode" value="'.$object->type_code.'">';
1831 }
1832
1833 print dol_get_fiche_head($head, 'card', $langs->trans("Action"), 0, 'action');
1834
1835 print '<table class="border tableforfield" width="100%">';
1836
1837 // Ref
1838 print '<tr><td class="titlefieldcreate">'.$langs->trans("Ref").'</td><td colspan="3">'.$object->id.'</td></tr>';
1839
1840 // Type of event
1841 if (getDolGlobalString('AGENDA_USE_EVENT_TYPE') && $object->elementtype != "ticket") {
1842 print '<tr><td class="fieldrequired">'.$langs->trans("Type").'</td><td colspan="3">';
1843 if ($object->type_code != 'AC_OTH_AUTO') {
1844 print img_picto($langs->trans("ActionType"), 'square', 'class="fawidth30 inline-block" style="color: #ddd;"');
1845 print $formactions->select_type_actions(GETPOST("actioncode", 'aZ09') ? GETPOST("actioncode", 'aZ09') : $object->type_code, "actioncode", "systemauto", 0, 0, 0, 1);
1846 } else {
1847 print '<input type="hidden" name="actioncode" value="'.$object->type_code.'">';
1848 print $object->getTypePicto();
1849 print $langs->trans("Action".$object->type_code);
1850 }
1851 print '</td></tr>';
1852 }
1853
1854 // Private
1855 if ($object->elementtype == 'ticket') {
1856 print '<tr><td>'.$langs->trans("MarkMessageAsPrivate");
1857 print ' '.$form->textwithpicto('', $langs->trans("TicketMessagePrivateHelp"), 1, 'help');
1858 print '</td><td colspan="3"><input type="checkbox" id="private" name="private" '.(preg_match('/^TICKET_MSG_PRIVATE/', $object->code) ? ' checked' : '').'></td></tr>';
1859 }
1860
1861 // Title
1862 print '<tr><td'.(!getDolGlobalString('AGENDA_USE_EVENT_TYPE') ? ' class="fieldrequired titlefieldcreate"' : '').'>'.$langs->trans("Title").'</td><td colspan="3"><input type="text" name="label" class="soixantepercent" value="'.$object->label.'"></td></tr>';
1863
1864 // Full day event
1865 print '<tr><td><span class="fieldrequired">'.$langs->trans("Date").'</span></td><td colspan="3" class="valignmiddle height30 small"><input type="checkbox" id="fullday" name="fullday" '.($object->fulldayevent ? ' checked' : '').'>';
1866 print '<label for="fullday">'.$langs->trans("EventOnFullDay").'</label>';
1867
1868 // // Recurring event
1869 // $userepeatevent = (getDolGlobalInt('MAIN_FEATURES_LEVEL') == 2 ? 1 : 0);
1870 // if ($userepeatevent) {
1871 // // Repeat
1872 // //print '<tr><td></td><td colspan="3">';
1873 // print ' &nbsp; &nbsp; &nbsp; &nbsp; <div class="opacitymedium inline-block">';
1874 // print img_picto($langs->trans("Recurrence"), 'recurring', 'class="paddingright2"');
1875 // print '<input type="hidden" name="recurid" value="'.$object->recurid.'">';
1876 // $selectedrecurrulefreq = 'no';
1877 // $selectedrecurrulebymonthday = '';
1878 // $selectedrecurrulebyday = '';
1879 // if ($object->recurrule && preg_match('/FREQ=([A-Z]+)/i', $object->recurrule, $reg)) {
1880 // $selectedrecurrulefreq = $reg[1];
1881 // }
1882 // if ($object->recurrule && preg_match('/FREQ=MONTHLY.*BYMONTHDAY=(\d+)/i', $object->recurrule, $reg)) {
1883 // $selectedrecurrulebymonthday = $reg[1];
1884 // }
1885 // if ($object->recurrule && preg_match('/FREQ=WEEKLY.*BYDAY(\d+)/i', $object->recurrule, $reg)) {
1886 // $selectedrecurrulebyday = $reg[1];
1887 // }
1888 // print $form->selectarray('recurrulefreq', $arrayrecurrulefreq, $selectedrecurrulefreq, 0, 0, 0, '', 0, 0, 0, '', 'marginrightonly');
1889 // // If recurrulefreq is MONTHLY
1890 // print '<div class="hidden marginrightonly inline-block repeateventBYMONTHDAY">';
1891 // print $langs->trans("DayOfMonth").': <input type="input" size="2" name="BYMONTHDAY" value="'.$selectedrecurrulebymonthday.'">';
1892 // print '</div>';
1893 // // If recurrulefreq is WEEKLY
1894 // print '<div class="hidden marginrightonly inline-block repeateventBYDAY">';
1895 // print $langs->trans("DayOfWeek").': <input type="input" size="4" name="BYDAY" value="'.$selectedrecurrulebyday.'">';
1896 // print '</div>';
1897 // print '<script type="text/javascript">
1898 // jQuery(document).ready(function() {
1899 // function init_repeat()
1900 // {
1901 // if (jQuery("#recurrulefreq").val() == \'MONTHLY\')
1902 // {
1903 // jQuery(".repeateventBYMONTHDAY").css("display", "inline-block"); /* use this instead of show because we want inline-block and not block */
1904 // jQuery(".repeateventBYDAY").hide();
1905 // }
1906 // else if (jQuery("#recurrulefreq").val() == \'WEEKLY\')
1907 // {
1908 // jQuery(".repeateventBYMONTHDAY").hide();
1909 // jQuery(".repeateventBYDAY").css("display", "inline-block"); /* use this instead of show because we want inline-block and not block */
1910 // }
1911 // else
1912 // {
1913 // jQuery(".repeateventBYMONTHDAY").hide();
1914 // jQuery(".repeateventBYDAY").hide();
1915 // }
1916 // }
1917 // init_repeat();
1918 // jQuery("#recurrulefreq").change(function() {
1919 // init_repeat();
1920 // });
1921 // });
1922 // </script>';
1923 // print '</div>';
1924 // //print '</td></tr>';
1925 // }
1926 print '</td></tr>';
1927
1928 // Date start - end
1929 print '<tr><td class="nowrap">';
1930 /*print '<span class="fieldrequired">'.$langs->trans("DateActionStart").'</span>';
1931 print ' - ';
1932 print '<span id="dateend"'.($object->type_code == 'AC_RDV' ? ' class="fieldrequired"' : '').'>'.$langs->trans("DateActionEnd").'</span>';
1933 */
1934 print '</td><td td colspan="3">';
1935 $tzforfullday = getDolGlobalString('MAIN_STORE_FULL_EVENT_IN_GMT');
1936 print $form->selectDate($datep ? $datep : $object->datep, 'ap', 1, 1, 0, "action", 1, 2, 0, 'fulldaystart', '', '', '', 1, '', '', $object->fulldayevent ? ($tzforfullday ? $tzforfullday : 'tzuserrel') : 'tzuserrel');
1937 print ' <span class="hideonsmartphone">&nbsp; &nbsp; - &nbsp; &nbsp;</span> ';
1938 print $form->selectDate($datef ? $datef : $object->datef, 'p2', 1, 1, 1, "action", 1, 2, 0, 'fulldayend', '', '', '', 1, '', '', $object->fulldayevent ? ($tzforfullday ? $tzforfullday : 'tzuserrel') : 'tzuserrel');
1939 print '</td></tr>';
1940
1941 print '<tr><td class="">&nbsp;</td><td></td></tr>';
1942
1943 // Assigned to
1944 $listofuserid = array(); // User assigned
1945 if (empty($donotclearsession)) {
1946 if ($object->userownerid > 0) {
1947 $listofuserid[$object->userownerid] = array(
1948 'id' => $object->userownerid,
1949 'type' => 'user',
1950 //'transparency'=>$object->userassigned[$user->id]['transparency'],
1951 'transparency' => $object->transparency, // Force transparency on ownerfrom event
1952 'answer_status' => $object->userassigned[$object->userownerid]['answer_status'],
1953 'mandatory' => $object->userassigned[$object->userownerid]['mandatory']
1954 );
1955 }
1956 if (!empty($object->userassigned)) { // Now concat assigned users
1957 // Restore array with key with same value than param 'id'
1958 $tmplist1 = $object->userassigned;
1959 foreach ($tmplist1 as $key => $val) {
1960 if ($val['id'] && $val['id'] != $object->userownerid) {
1961 $listofuserid[$val['id']] = $val;
1962 }
1963 }
1964 }
1965 $_SESSION['assignedtouser'] = json_encode($listofuserid);
1966 } else {
1967 if (!empty($_SESSION['assignedtouser'])) {
1968 $listofuserid = json_decode($_SESSION['assignedtouser'], true);
1969 }
1970 }
1971 $listofcontactid = $object->socpeopleassigned; // Contact assigned
1972 $listofotherid = $object->otherassigned; // Other undefined email (not used yet)
1973
1974 print '<tr><td class="tdtop nowrap fieldrequired">'.$langs->trans("ActionAssignedTo").'</td><td colspan="3">';
1975 print '<div class="assignedtouser">';
1976 print $form->select_dolusers_forevent(($action == 'create' ? 'add' : 'update'), 'assignedtouser', 1, '', 0, '', '', 0, 0, 0, 'AND u.statut != 0', 1, $listofuserid, $listofcontactid, $listofotherid);
1977 print '</div>';
1978 /*if (in_array($user->id,array_keys($listofuserid)))
1979 {
1980 print '<div class="myavailability">';
1981 print $langs->trans("MyAvailability").': <input id="transparency" type="checkbox" name="transparency"'.($listofuserid[$user->id]['transparency']?' checked':'').'>'.$langs->trans("Busy");
1982 print '</div>';
1983 }*/
1984 print '</td></tr>';
1985
1986 // Location
1987 if (!getDolGlobalString('AGENDA_DISABLE_LOCATION')) {
1988 print '<tr><td>'.$langs->trans("Location").'</td><td colspan="3"><input type="text" name="location" class="minwidth300 maxwidth150onsmartphone" value="'.$object->location.'"></td></tr>';
1989 }
1990
1991 // Status
1992 print '<tr><td class="nowrap">'.$langs->trans("Status").' / '.$langs->trans("Percentage").'</td><td colspan="3">';
1993 $percent = GETPOSTISSET("percentage") ? GETPOSTINT("percentage") : $object->percentage;
1994 $formactions->form_select_status_action('formaction', $percent, 1, 'complete', 0, 0, 'maxwidth200');
1995 print '</td></tr>';
1996
1997 // Tags-Categories
1998 if (isModEnabled('category')) {
1999 print '<tr><td>'.$langs->trans("Categories").'</td><td colspan="3">';
2000 $cate_arbo = $form->select_all_categories(Categorie::TYPE_ACTIONCOMM, '', 'parent', 64, 0, 3);
2001 $c = new Categorie($db);
2002 $cats = $c->containing($object->id, Categorie::TYPE_ACTIONCOMM);
2003 $arrayselected = array();
2004 foreach ($cats as $cat) {
2005 $arrayselected[] = $cat->id;
2006 }
2007 print img_picto('', 'category').$form->multiselectarray('categories', $cate_arbo, $arrayselected, '', 0, 'quatrevingtpercent widthcentpercentminusx', 0, 0);
2008 print "</td></tr>";
2009 }
2010
2011 print '</table>';
2012
2013
2014 print '<br><hr><br>';
2015
2016
2017 print '<table class="border tableforfield centpercent">';
2018
2019 if (isModEnabled("societe")) {
2020 // Related company
2021 print '<tr><td class="titlefieldcreate">'.$langs->trans("ActionOnCompany").'</td>';
2022 print '<td>';
2023 print '<div>';
2024 $events = array(); // 'method'=parameter action of url, 'url'=url to call that return new list of contacts
2025 $events[] = array('method' => 'getContacts', 'url' => dol_buildpath('/core/ajax/contacts.php?showempty=1', 1), 'htmlname' => 'contactid', 'params' => array('add-customer-contact' => 'disabled'));
2026 // TODO Refresh also list of project if conf PROJECT_ALLOW_TO_LINK_FROM_OTHER_COMPANY not defined with list linked to socid ?
2027 // FIXME If we change company, we may get a project that does not match
2028 print img_picto('', 'company', 'class="pictofixedwidth"').$form->select_company($object->socid, 'socid', '', 'SelectThirdParty', 1, 0, $events, 0, 'minwidth300');
2029 print '</div>';
2030 print '</td></tr>';
2031
2032 // Related contact
2033 print '<tr><td>'.$langs->trans("ActionOnContact").'</td><td>';
2034 print '<div class="maxwidth200onsmartphone">';
2035 print img_picto('', 'contact', 'class="paddingrightonly"');
2036 if (getDolGlobalString('CONTACT_USE_SEARCH_TO_SELECT') && $conf->use_javascript_ajax) {
2037 // FIXME Use the select_contact supporting the "multiple"
2038 /*
2039 $selected = array_keys($object->socpeopleassigned);
2040 print $form->select_contact(getDolGlobalString('MAIN_ACTIONCOM_CAN_ADD_ANY_CONTACT') ? 0 : $object->socid, $selected, 'socpeopleassigned', 1, '', '', 1, 'minwidth300 widthcentpercentminusx', false, 0, 0, array());
2041 */
2042 $sav = getDolGlobalString('CONTACT_USE_SEARCH_TO_SELECT');
2043 $conf->global->CONTACT_USE_SEARCH_TO_SELECT = 0;
2044 print $form->selectcontacts(getDolGlobalString('MAIN_ACTIONCOM_CAN_ADD_ANY_CONTACT') ? 0 : ($object->socid > 0 ? $object->socid : -1), array_keys($object->socpeopleassigned), 'socpeopleassigned[]', 1, '', '', 1, 'minwidth300 widthcentpercentminusx', 0, 0, 0, array(), 'multiple', 'contactid');
2045 $conf->global->CONTACT_USE_SEARCH_TO_SELECT = $sav;
2046 } else {
2047 // Warning: MAIN_ACTIONCOM_CAN_ADD_ANY_CONTACT will hangs on large databases
2048 print $form->selectcontacts(getDolGlobalString('MAIN_ACTIONCOM_CAN_ADD_ANY_CONTACT') ? 0 : $object->socid, array_keys($object->socpeopleassigned), 'socpeopleassigned[]', 1, '', '', 1, 'minwidth300 widthcentpercentminusx', 0, 0, 0, array(), 'multiple', 'contactid');
2049 }
2050 print '</div>';
2051 print '</td>';
2052 print '</tr>';
2053 }
2054
2055 // Project
2056 if (isModEnabled('project')) {
2057 $langs->load("projects");
2058
2059 print '<tr><td class="titlefieldcreate">'.$langs->trans("Project").'</td><td>';
2060 print img_picto('', 'project', 'class="pictofixedwidth"');
2061 $numprojet = $formproject->select_projects(($object->socid > 0 ? $object->socid : -1), $object->fk_project, 'projectid', 0, 0, 1, 0, 0, 0, 0, '', 0, 0, 'maxwidth500 widthcentpercentminusxx');
2062 if ($numprojet == 0) {
2063 print ' &nbsp; <a href="'.DOL_URL_ROOT.'/projet/card.php?socid='.$object->socid.'&action=create&token='.newToken().'&backtopage='.urlencode($_SERVER["PHP_SELF"].'?id='.$object->id.'&action=edit').'"><span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans("AddProject").'"></span></a>';
2064 }
2065 print '</td></tr>';
2066 }
2067
2068 // Priority
2069 if (getDolGlobalString('AGENDA_SUPPORT_PRIORITY_IN_EVENTS')) {
2070 print '<tr><td class="titlefieldcreate nowrap">'.$langs->trans("Priority").'</td><td>';
2071 print '<input type="text" name="priority" value="'.($object->priority ? $object->priority : '').'" size="5">';
2072 print '</td></tr>';
2073 }
2074
2075 // Object linked
2076 if (!empty($object->fk_element) && !empty($object->elementtype)) {
2077 include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
2078 print '<tr>';
2079 print '<td>'.$langs->trans("LinkedObject").'</td>';
2080
2081 if ($object->elementtype == 'task' && isModEnabled('project')) {
2082 print '<td id="project-task-input-container" >';
2083
2084 $urloption = '?action=create&donotclearsession=1'; // we use create not edit for more flexibility
2085 $url = DOL_URL_ROOT.'/comm/action/card.php'.$urloption;
2086
2087 // update task list
2088 print "\n".'<script type="text/javascript" >';
2089 print '$(document).ready(function () {
2090 $("#projectid").change(function () {
2091 var url = "'.$url.'&projectid="+$("#projectid").val();
2092 $.get(url, function(data) {
2093 console.log($( data ).find("#fk_element").html());
2094 if (data) $("#fk_element").html( $( data ).find("#taskid").html() ).select2();
2095 })
2096 });
2097 })';
2098 print '</script>'."\n";
2099
2100 $formproject->selectTasks((!empty($societe->id) ? $societe->id : -1), $object->fk_element, 'fk_element', 24, 0, 0, 1, 0, 0, 'maxwidth500', $object->fk_project);
2101 print '<input type="hidden" name="elementtype" value="'.$object->elementtype.'">';
2102
2103 print '</td>';
2104 } else {
2105 print '<td>';
2106 print dolGetElementUrl($object->fk_element, $object->elementtype, 1);
2107 print '<input type="hidden" name="fk_element" value="'.$object->fk_element.'">';
2108 print '<input type="hidden" name="elementtype" value="'.$object->elementtype.'">';
2109 print '</td>';
2110 }
2111
2112 print '</tr>';
2113 }
2114
2115 // Description
2116 print '<tr><td class="tdtop">'.$langs->trans("Description").'</td><td>';
2117 // Editeur wysiwyg
2118 require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
2119 $doleditor = new DolEditor('note', $object->note_private, '', 120, 'dolibarr_notes', 'In', true, true, isModEnabled('fckeditor'), ROWS_4, '90%');
2120 $doleditor->Create();
2121 print '</td></tr>';
2122
2123 // Other attributes
2124 $parameters = array();
2125 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2126 print $hookmanager->resPrint;
2127 if (empty($reshook)) {
2128 print $object->showOptionals($extrafields, 'edit', $parameters);
2129 }
2130
2131 print '</table>';
2132
2133 // Reminders
2134 if (getDolGlobalString('AGENDA_REMINDER_EMAIL') || getDolGlobalString('AGENDA_REMINDER_BROWSER')) {
2135 $filteruserid = $user->id;
2136 if ($user->hasRight('agenda', 'allactions', 'read')) {
2137 $filteruserid = 0;
2138 }
2139 $object->loadReminders('', $filteruserid, false);
2140
2141 print '<hr>';
2142
2143 if (count($object->reminders) > 0) {
2144 $checked = 'checked';
2145 $keys = array_keys($object->reminders);
2146 $firstreminderId = array_shift($keys);
2147
2148 $actionCommReminder = $object->reminders[$firstreminderId];
2149 } else {
2150 $checked = '';
2151 $actionCommReminder = new ActionCommReminder($db);
2152 $actionCommReminder->offsetvalue = getDolGlobalInt('AGENDA_REMINDER_DEFAULT_OFFSET', 30);
2153 $actionCommReminder->offsetunit = 'i';
2154 $actionCommReminder->typeremind = 'email';
2155 }
2156 $disabled = '';
2157 if ($object->datep < dol_now()) {
2158 //$disabled = 'disabled title="'.dol_escape_htmltag($langs->trans("EventExpired")).'"';
2159 }
2160
2161 print '<label for="addreminder">'.img_picto('', 'bell', 'class="pictofixedwidth"').$langs->trans("AddReminder").'</label> <input type="checkbox" id="addreminder" name="addreminder"'.($checked ? ' '.$checked : '').($disabled ? ' '.$disabled : '').'><br>';
2162
2163 print '<div class="reminderparameters" '.(empty($checked) ? 'style="display: none;"' : '').'>';
2164
2165 print '<br>';
2166
2167 print '<table class="border centpercent">';
2168
2169 // Reminder
2170 print '<tr><td class="titlefieldcreate nowrap">'.$langs->trans("ReminderTime").'</td><td colspan="3">';
2171 print '<input type="number" name="offsetvalue" class="width50" value="'.$actionCommReminder->offsetvalue.'"> ';
2172 print $form->selectTypeDuration('offsetunit', $actionCommReminder->offsetunit, array('y', 'm'));
2173 print '</td></tr>';
2174
2175 // Reminder Type
2176 print '<tr><td class="titlefieldcreate nowrap">'.$langs->trans("ReminderType").'</td><td colspan="3">';
2177 print $form->selectarray('selectremindertype', $TRemindTypes, $actionCommReminder->typeremind, 0, 0, 0, '', 0, 0, 0, '', 'minwidth200', 1);
2178 print '</td></tr>';
2179
2180 $hide = '';
2181 if ($actionCommReminder->typeremind == 'browser') {
2182 $hide = 'style="display:none;"';
2183 }
2184
2185 // Mail Model
2186 if (getDolGlobalString('AGENDA_REMINDER_EMAIL')) {
2187 print '<tr '.$hide.'><td class="titlefieldcreate nowrap">'.$langs->trans("EMailTemplates").'</td><td colspan="3">';
2188 print $form->selectModelMail('actioncommsend', 'actioncomm_send', 1, 1);
2189 print '</td></tr>';
2190 }
2191
2192 print '</table>';
2193
2194 print "\n".'<script type="text/javascript">';
2195 print '$(document).ready(function () {
2196 $("#addreminder").click(function(){
2197 if (this.checked) {
2198 $(".reminderparameters").show();
2199 } else {
2200 $(".reminderparameters").hide();
2201 }
2202 });
2203
2204 $("#selectremindertype").change(function(){
2205 var selected_option = $("#selectremindertype option:selected").val();
2206 if(selected_option == "email") {
2207 $("#select_actioncommsendmodel_mail").closest("tr").show();
2208 } else {
2209 $("#select_actioncommsendmodel_mail").closest("tr").hide();
2210 }
2211 });
2212
2213 })';
2214 print '</script>'."\n";
2215
2216 print '</div>'; // End of div for reminderparameters
2217 }
2218
2219 print dol_get_fiche_end();
2220
2221 print $form->buttonsSaveCancel();
2222
2223 print '</form>';
2224 } else {
2225 print dol_get_fiche_head($head, 'card', $langs->trans("Action"), -1, 'action');
2226
2227 $formconfirm = '';
2228
2229 // Clone event
2230 if ($action == 'clone') {
2231 $formconfirm = $form->formconfirm($_SERVER["PHP_SELF"].'?id='.GETPOST('id'), $langs->trans('ToClone'), $langs->trans('ConfirmCloneEvent', $object->label), 'confirm_clone', array(), 'yes', 1);
2232 }
2233
2234 // Call Hook formConfirm
2235 $parameters = array();
2236 $reshook = $hookmanager->executeHooks('formConfirm', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2237 if (empty($reshook)) {
2238 $formconfirm .= $hookmanager->resPrint;
2239 } elseif ($reshook > 0) {
2240 $formconfirm = $hookmanager->resPrint;
2241 }
2242
2243 // Print form confirm
2244 print $formconfirm;
2245
2246 $linkback = '';
2247 // Link to other agenda views
2248 $linkback .= '<a href="'.DOL_URL_ROOT.'/comm/action/list.php?mode=show_list&restore_lastsearch_values=1">';
2249 $linkback .= img_picto($langs->trans("BackToList"), 'object_calendarlist', 'class="pictoactionview pictofixedwidth"');
2250 $linkback .= '<span class="hideonsmartphone">'.$langs->trans("BackToList").'</span>';
2251 $linkback .= '</a>';
2252 $linkback .= '</li>';
2253 $linkback .= '<li class="noborder litext">';
2254 $linkback .= '<a href="'.DOL_URL_ROOT.'/comm/action/index.php?mode=show_month&year='.dol_print_date($object->datep, '%Y').'&month='.dol_print_date($object->datep, '%m').'&day='.dol_print_date($object->datep, '%d').'">';
2255 $linkback .= img_picto($langs->trans("ViewCal"), 'object_calendar', 'class="pictoactionview pictofixedwidth"');
2256 $linkback .= '<span class="hideonsmartphone">'.$langs->trans("ViewCal").'</span>';
2257 $linkback .= '</a>';
2258 $linkback .= '</li>';
2259 $linkback .= '<li class="noborder litext">';
2260 $linkback .= '<a href="'.DOL_URL_ROOT.'/comm/action/index.php?mode=show_week&year='.dol_print_date($object->datep, '%Y').'&month='.dol_print_date($object->datep, '%m').'&day='.dol_print_date($object->datep, '%d').'">';
2261 $linkback .= img_picto($langs->trans("ViewWeek"), 'object_calendarweek', 'class="pictoactionview pictofixedwidth"');
2262 $linkback .= '<span class="hideonsmartphone">'.$langs->trans("ViewWeek").'</span>';
2263 $linkback .= '</a>';
2264 $linkback .= '</li>';
2265 $linkback .= '<li class="noborder litext">';
2266 $linkback .= '<a href="'.DOL_URL_ROOT.'/comm/action/index.php?mode=show_day&year='.dol_print_date($object->datep, '%Y').'&month='.dol_print_date($object->datep, '%m').'&day='.dol_print_date($object->datep, '%d').'">';
2267 $linkback .= img_picto($langs->trans("ViewDay"), 'object_calendarday', 'class="pictoactionview pictofixedwidth"');
2268 $linkback .= '<span class="hideonsmartphone">'.$langs->trans("ViewDay").'</span>';
2269 $linkback .= '</a>';
2270 $linkback .= '</li>';
2271 $linkback .= '<li class="noborder litext">';
2272 $linkback .= '<a href="'.DOL_URL_ROOT.'/comm/action/peruser.php?mode=show_peruser&year='.dol_print_date($object->datep, '%Y').'&month='.dol_print_date($object->datep, '%m').'&day='.dol_print_date($object->datep, '%d').'">';
2273 $linkback .= img_picto($langs->trans("ViewPerUser"), 'object_calendarperuser', 'class="pictoactionview pictofixedwidth"');
2274 $linkback .= '<span class="hideonsmartphone">'.$langs->trans("ViewPerUser").'</span>';
2275 $linkback .= '</a>';
2276
2277 // Add more views from hooks
2278 $parameters = array();
2279 $reshook = $hookmanager->executeHooks('addCalendarView', $parameters, $object, $action);
2280 if (empty($reshook)) {
2281 $linkback .= $hookmanager->resPrint;
2282 } elseif ($reshook > 1) {
2283 $linkback = $hookmanager->resPrint;
2284 }
2285
2286 //$linkback.=$out;
2287
2288 $morehtmlref = '<div class="refidno">';
2289 // Thirdparty
2290 //$morehtmlref.='<br>'.$langs->trans('ThirdParty') . ' : ' . $object->thirdparty->getNomUrl(1);
2291 // Project
2292 if (isModEnabled('project')) {
2293 $langs->load("projects");
2294 //$morehtmlref .= '<br>';
2295 if ($usercancreate) {
2296 $morehtmlref .= img_picto($langs->trans("Project"), 'project', 'class="pictofixedwidth"');
2297 if ($action != 'classify') {
2298 $morehtmlref .= '<a class="editfielda" href="'.$_SERVER['PHP_SELF'].'?action=classify&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('SetProject')).'</a> ';
2299 }
2300 $morehtmlref .= $form->form_project($_SERVER['PHP_SELF'].'?id='.$object->id, $object->socid, $object->fk_project, ($action == 'classify' ? 'projectid' : 'none'), 0, 0, 0, 1, '', 'maxwidth300');
2301 } else {
2302 if (!empty($object->fk_project)) {
2303 $proj = new Project($db);
2304 $proj->fetch($object->fk_project);
2305 $morehtmlref .= $proj->getNomUrl(1);
2306 if ($proj->title) {
2307 $morehtmlref .= '<span class="opacitymedium"> - '.dol_escape_htmltag($proj->title).'</span>';
2308 }
2309 }
2310 }
2311 }
2312 $morehtmlref .= '</div>';
2313
2314
2315 dol_banner_tab($object, 'id', $linkback, ($user->socid ? 0 : 1), 'id', 'ref', $morehtmlref);
2316
2317 print '<div class="fichecenter">';
2318 print '<div class="fichehalfleft">';
2319
2320 print '<div class="underbanner clearboth"></div>';
2321
2322 // Show event in view mode
2323 print '<table class="border tableforfield centpercent">';
2324
2325 // Type
2326 if (getDolGlobalString('AGENDA_USE_EVENT_TYPE')) {
2327 print '<tr><td class="titlefield">'.$langs->trans("Type").'</td><td>';
2328 $labeltoshow = $langs->trans("Action".$object->type_code);
2329 if ($object->code) {
2330 $labeltoshow .= ' ('.$object->code.')';
2331 }
2332 print $object->getTypePicto('pictofixedwidth paddingright', $labeltoshow);
2333 print $langs->trans("Action".$object->type_code);
2334 print '</td></tr>';
2335 }
2336
2337 // Full day event
2338 print '<tr><td class="titlefield">'.$langs->trans("EventOnFullDay").'</td><td>'.yn($object->fulldayevent ? 1 : 0, 3).'</td></tr>';
2339
2340 // Event into a series
2341 if ($object->recurid) {
2342 print '<tr><td class="titlefield">'.$langs->trans("EventIntoASerie").'</td><td>'.dol_escape_htmltag($object->recurid).'</td></tr>';
2343 }
2344
2345 $rowspan = 4;
2346 if (!getDolGlobalString('AGENDA_DISABLE_LOCATION')) {
2347 $rowspan++;
2348 }
2349
2350 // Date start
2351 print '<tr><td>'.$langs->trans("DateActionStart").'</td><td>';
2352 // Test a date before the 27 march and one after
2353 //print dol_print_date($object->datep, 'dayhour', 'gmt');
2354 //print dol_print_date($object->datep, 'dayhour', 'tzuser');
2355 //print dol_print_date($object->datep, 'dayhour', 'tzuserrel');
2356 if (empty($object->fulldayevent)) {
2357 print dol_print_date($object->datep, 'dayhour', 'tzuserrel');
2358 } else {
2359 $tzforfullday = getDolGlobalString('MAIN_STORE_FULL_EVENT_IN_GMT');
2360 print dol_print_date($object->datep, 'day', ($tzforfullday ? $tzforfullday : 'tzuserrel'));
2361 }
2362 if ($object->percentage == 0 && $object->datep && $object->datep < ($now - $delay_warning)) {
2363 print img_warning($langs->trans("Late"));
2364 }
2365 print '</td>';
2366 print '</tr>';
2367
2368 // Date end
2369 print '<tr><td>'.$langs->trans("DateActionEnd").'</td><td>';
2370 if (empty($object->fulldayevent)) {
2371 print dol_print_date($object->datef, 'dayhour', 'tzuserrel');
2372 } else {
2373 $tzforfullday = getDolGlobalString('MAIN_STORE_FULL_EVENT_IN_GMT');
2374 print dol_print_date($object->datef, 'day', ($tzforfullday ? $tzforfullday : 'tzuserrel'));
2375 }
2376 if ($object->percentage > 0 && $object->percentage < 100 && $object->datef && $object->datef < ($now - $delay_warning)) {
2377 print img_warning($langs->trans("Late"));
2378 }
2379 print '</td></tr>';
2380
2381 // Location
2382 if (!getDolGlobalString('AGENDA_DISABLE_LOCATION')) {
2383 print '<tr><td>'.$langs->trans("Location").'</td><td>'.$object->location.'</td></tr>';
2384 }
2385
2386 // Assigned to user
2387 print '<tr><td class="nowrap">'.$langs->trans("ActionAssignedTo").'</td><td>';
2388 $listofuserid = array();
2389 if (empty($donotclearsession)) {
2390 if ($object->userownerid > 0) {
2391 $listofuserid[$object->userownerid] = array(
2392 'id' => $object->userownerid,
2393 'transparency' => $object->transparency, // Force transparency on owner from property of event
2394 'answer_status' => $object->userassigned[$object->userownerid]['answer_status'],
2395 'mandatory' => $object->userassigned[$object->userownerid]['mandatory']
2396 );
2397 }
2398 if (!empty($object->userassigned)) { // Now concat assigned users
2399 // Restore array with key with same value than param 'id'
2400 $tmplist1 = $object->userassigned;
2401 foreach ($tmplist1 as $key => $val) {
2402 if ($val['id'] && $val['id'] != $object->userownerid) {
2403 $listofuserid[$val['id']] = $val;
2404 }
2405 }
2406 }
2407 $_SESSION['assignedtouser'] = json_encode($listofuserid);
2408 } else {
2409 if (!empty($_SESSION['assignedtouser'])) {
2410 $listofuserid = json_decode($_SESSION['assignedtouser'], true);
2411 }
2412 }
2413
2414 $listofcontactid = array(); // not used yet
2415 $listofotherid = array(); // not used yet
2416 print '<div class="assignedtouser">';
2417 print $form->select_dolusers_forevent('view', 'assignedtouser', 1, '', 0, '', '', 0, 0, 0, '', ($object->datep != $object->datef) ? 1 : 0, $listofuserid, $listofcontactid, $listofotherid);
2418 print '</div>';
2419 /*
2420 if ($object->datep != $object->datef && in_array($user->id,array_keys($listofuserid)))
2421 {
2422 print '<div class="myavailability">';
2423 print $langs->trans("MyAvailability").': '.(($object->userassigned[$user->id]['transparency'] > 0)?$langs->trans("Busy"):$langs->trans("Available")); // We show nothing if event is assigned to nobody
2424 print '</div>';
2425 }
2426 */
2427 print ' </td></tr>';
2428
2429 // Categories
2430 if (isModEnabled('category')) {
2431 print '<tr><td class="valignmiddle">'.$langs->trans("Categories").'</td><td>';
2432 print $form->showCategories($object->id, Categorie::TYPE_ACTIONCOMM, 1);
2433 print "</td></tr>";
2434 }
2435
2436 print '</table>';
2437
2438 print '</div>';
2439
2440 print '<div class="fichehalfright">';
2441
2442 print '<div class="underbanner clearboth"></div>';
2443 print '<table class="border tableforfield centpercent">';
2444
2445 if (isModEnabled("societe")) {
2446 // Related company
2447 print '<tr><td class="titlefield">'.$langs->trans("ActionOnCompany").'</td>';
2448 print '<td>'.(is_object($object->thirdparty) && $object->thirdparty->id ? $object->thirdparty->getNomUrl(1) : ('<span class="opacitymedium">'.$langs->trans("None").'</span>'));
2449 if (is_object($object->thirdparty) && $object->thirdparty->id > 0 && $object->type_code == 'AC_TEL') {
2450 if ($object->thirdparty->fetch($object->thirdparty->id)) {
2451 print "<br>".dol_print_phone($object->thirdparty->phone);
2452 }
2453 }
2454 print '</td></tr>';
2455
2456 // Related contact
2457 print '<tr><td>'.$langs->trans("ActionOnContact").'</td>';
2458 print '<td>';
2459
2460 if (!empty($object->socpeopleassigned)) {
2461 foreach ($object->socpeopleassigned as $cid => $Tab) {
2462 $contact = new Contact($db);
2463 $result = $contact->fetch($cid);
2464
2465 if ($result < 0) {
2466 dol_print_error($db, $contact->error);
2467 }
2468
2469 if ($result > 0) {
2470 print $contact->getNomUrl(1);
2471 if ($object->type_code == 'AC_TEL') {
2472 if (!empty($contact->phone_pro)) {
2473 print '('.dol_print_phone($contact->phone_pro).')';
2474 }
2475 }
2476 print '<div class="paddingright"></div>';
2477 }
2478 }
2479 } else {
2480 print '<span class="opacitymedium">'.$langs->trans("None").'</span>';
2481 }
2482 print '</td></tr>';
2483 }
2484
2485 // Priority
2486 print '<tr><td class="nowrap" class="titlefield">'.$langs->trans("Priority").'</td><td>';
2487 print($object->priority ? $object->priority : '');
2488 print '</td></tr>';
2489
2490 // Object linked (if link is for thirdparty, contact, project it is a recording error. We should not have links in link table
2491 // for such objects because there is already a dedicated field into table llx_actioncomm.
2492 if (!empty($object->fk_element) && !empty($object->elementtype) && !in_array($object->elementtype, array('societe', 'contact', 'project'))) {
2493 include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
2494 print '<tr><td>'.$langs->trans("LinkedObject").'</td>';
2495 $link = dolGetElementUrl($object->fk_element, $object->elementtype, 1);
2496 print '<td>';
2497 if (empty($link)) {
2498 print '<span class="opacitymedium">'.$langs->trans("ObjectDeleted").'</span>';
2499 } else {
2500 print $link;
2501 }
2502 print '</td></tr>';
2503 }
2504
2505 //mail information
2506 if (!empty($object->email_msgid)) {
2507 print '<tr><td>'.$langs->trans('MailTopic').'</td>';
2508 print '<td>'.dol_escape_htmltag($object->email_subject).'</td></tr>';
2509 print '<tr><td>'.$langs->trans('MailFrom').'</td>';
2510 print '<td>'.dol_escape_htmltag($object->email_from).'</td></tr>';
2511 print '<tr><td>'.$langs->trans('MailTo').'</td>';
2512 print '<td>'.dol_escape_htmltag($object->email_to).'</td></tr>';
2513 if (!empty($object->email_tocc)) {
2514 print '<tr><td>'.$langs->trans('MailCC').'</td>';
2515 print '<td>'.dol_escape_htmltag($object->email_tocc).'</td></tr>';
2516 }
2517 }
2518
2519 // Description
2520 print '<tr><td class="tdtop">'.$langs->trans("Description").'</td><td class="wordbreak sensiblehtmlcontent">';
2522 print '</td></tr>';
2523
2524 // Other attributes
2525 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
2526
2527 // Reminders
2528 if (getDolGlobalString('AGENDA_REMINDER_EMAIL') || getDolGlobalString('AGENDA_REMINDER_BROWSER')) {
2529 $filteruserid = $user->id;
2530 if ($user->hasRight('agenda', 'allactions', 'read')) {
2531 $filteruserid = 0;
2532 }
2533 $object->loadReminders('', $filteruserid, false);
2534
2535 print '<tr><td class="titlefieldcreate nowrap">'.$langs->trans("Reminders").'</td><td>';
2536
2537 if (count($object->reminders) > 0) {
2538 $tmpuserstatic = new User($db);
2539
2540 foreach ($object->reminders as $actioncommreminderid => $actioncommreminder) {
2541 print $TRemindTypes[$actioncommreminder->typeremind]['label'];
2542 if ($actioncommreminder->fk_user > 0) {
2543 $tmpuserstatic->fetch($actioncommreminder->fk_user);
2544 print ' ('.$tmpuserstatic->getNomUrl(0, '', 0, 0, 16).')';
2545 }
2546 print ' - '.$actioncommreminder->offsetvalue.' '.$TDurationTypes[$actioncommreminder->offsetunit];
2547
2548 if ($actioncommreminder->status == $actioncommreminder::STATUS_TODO) {
2549 print ' - <span class="opacitymedium">';
2550 print $langs->trans("NotSent");
2551 print ' </span>';
2552 } elseif ($actioncommreminder->status == $actioncommreminder::STATUS_DONE) {
2553 print ' - <span class="opacitymedium">';
2554 print $langs->trans("Done");
2555 print ' </span>';
2556 } elseif ($actioncommreminder->status == $actioncommreminder::STATUS_ERROR) {
2557 print ' - <span class="opacitymedium">';
2558 print $form->textwithpicto($langs->trans("Error"), $actioncommreminder->lasterror);
2559 print ' </span>';
2560 }
2561 print '<br>';
2562 }
2563 }
2564
2565 print '</td></tr>';
2566 }
2567
2568 print '</table>';
2569
2570 print '</div>';
2571 print '</div>';
2572 print '<div class="clearboth"></div>';
2573
2574 print dol_get_fiche_end();
2575 }
2576
2577
2578 /*
2579 * Action bar
2580 */
2581 print '<div class="tabsAction">';
2582
2583 $parameters = array();
2584 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
2585 if (empty($reshook)) {
2586 if ($action != 'edit') {
2587 if ($user->hasRight('agenda', 'allactions', 'create') ||
2588 (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->hasRight('agenda', 'myactions', 'create'))) {
2589 print '<div class="inline-block divButAction"><a class="butAction" href="card.php?action=edit&token='.newToken().'&id='.$object->id.'">'.$langs->trans("Modify").'</a></div>';
2590 } else {
2591 print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("NotAllowed").'">'.$langs->trans("Modify").'</a></div>';
2592 }
2593
2594 if ($user->hasRight('agenda', 'allactions', 'create') ||
2595 (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->hasRight('agenda', 'myactions', 'create'))) {
2596 print '<div class="inline-block divButAction"><a class="butAction" href="card.php?action=clone&object='.$object->element.'&id='.$object->id.'">'.$langs->trans("ToClone").'</a></div>';
2597 } else {
2598 print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("NotAllowed").'">'.$langs->trans("ToClone").'</a></div>';
2599 }
2600
2601 if ($user->hasRight('agenda', 'allactions', 'delete') ||
2602 (($object->authorid == $user->id || $object->userownerid == $user->id) && $user->hasRight('agenda', 'myactions', 'delete'))) {
2603 print '<div class="inline-block divButAction"><a class="butActionDelete" href="card.php?action=delete&token='.newToken().'&id='.$object->id.'">'.$langs->trans("Delete").'</a></div>';
2604 } else {
2605 print '<div class="inline-block divButAction"><a class="butActionRefused classfortooltip" href="#" title="'.$langs->trans("NotAllowed").'">'.$langs->trans("Delete").'</a></div>';
2606 }
2607 }
2608 }
2609
2610 print '</div>';
2611
2612 if ($action != 'edit') {
2613 if (!getDolGlobalString('AGENDA_DISABLE_BUILDDOC')) {
2614 print '<div class="clearboth"></div><div class="fichecenter"><div class="fichehalfleft">';
2615 print '<a name="builddoc"></a>'; // ancre
2616
2617 /*
2618 * Generated documents
2619 */
2620
2621 $filedir = $conf->agenda->multidir_output[$conf->entity].'/'.$object->id;
2622 $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
2623
2624 $genallowed = $user->hasRight('agenda', 'myactions', 'read');
2625 $delallowed = $user->hasRight('agenda', 'myactions', 'create');
2626
2627
2628 print $formfile->showdocuments('actions', $object->id, $filedir, $urlsource, $genallowed, $delallowed, '', 0, 0, 0, 0, 0, '', '', '', $langs->getDefaultLang());
2629
2630 print '</div><div class="fichehalfright">';
2631
2632
2633 print '</div></div>';
2634 }
2635 }
2636}
2637
2638// End of page
2639llxFooter();
2640$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
actions_prepare_head($object)
Prepare array with list of tabs.
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 for ActionCommReminder.
Class to manage different types of events.
Class to manage categories.
Class to manage contact/addresses.
Class to manage a WYSIWYG editor.
Class to manage standard extra fields.
Class to manage building of HTML components.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class to manage building of HTML components.
Class to manage projects.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage tasks.
Class to manage Dolibarr users.
dol_get_first_day_week($day, $month, $year, $gm=false)
Return first day of week for a date.
Definition date.lib.php:669
num_between_day($timestampStart, $timestampEnd, $lastday=0)
Function to return number of days between two dates (date must be UTC date !) Example: 2012-01-01 201...
dol_time_plus_duree($time, $duration_value, $duration_unit, $ruleforendofmonth=0)
Add a delay to a date.
Definition date.lib.php:124
dol_stringtotime($string, $gm=1)
Convert a string date into a GM Timestamps date Warning: YYYY-MM-DDTHH:MM:SS+02:00 (RFC3339) is not s...
Definition date.lib.php:426
dolGetElementUrl($objectid, $objecttype, $withpicto=0, $option='')
Return link url to an object.
dol_mktime($hour, $minute, $second, $month, $day, $year, $gm='auto', $check=1)
Return a timestamp date built from detailed information (by default a local PHP server timestamp) Rep...
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='')
Load a title with picto.
img_warning($titlealt='default', $moreatt='', $morecss='pictowarning')
Show warning logo.
img_picto($titlealt, $picto, $moreatt='', $pictoisfullpath=0, $srconly=0, $notitle=0, $alt='', $morecss='', $marginleftonlyshort=2)
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.
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_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
getElementProperties($elementType)
Get an array with properties of an element.
dol_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='')
Return an id or code from a code or id.
dol_string_onlythesehtmltags($stringtoclean, $cleanalsosomestyles=1, $removeclassattribute=1, $cleanalsojavascript=0, $allowiframe=0, $allowed_tags=array(), $allowlink=0)
Clean a string to keep only desirable HTML tags.
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false)
Output date in a string format according to outputlangs (or langs if not defined).
dol_set_focus($selector)
Set focus onto field with selector (similar behaviour of 'autofocus' HTML5 tag)
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
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_sanitizeFileName($str, $newstr='_', $unaccent=1)
Clean a string to use it as a file name.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
dol_htmlentitiesbr($stringtoencode, $nl2brmode=0, $pagecodefrom='UTF-8', $removelasteolbr=1)
This function is called to encode a string into a HTML string but differs from htmlentities because a...
getDolGlobalString($key, $default='')
Return dolibarr global constant string value.
img_edit($titlealt='default', $float=0, $other='')
Show logo edit/modify fiche.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
Returns text escaped for inclusion in HTML alt or title or value tags, or into values of HTML input f...
restrictedArea(User $user, $features, $object=0, $tableandshare='', $feature2='', $dbt_keyfield='fk_soc', $dbt_select='rowid', $isdraft=0, $mode=0)
Check permissions of a user to show a page and an object.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.