dolibarr 21.0.0-alpha
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-2016 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2005-2012 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2023 Charlene Benke <charlene@patas_monkey.com>
6 * Copyright (C) 2023 Christian Foellmann <christian@foellmann.de>
7 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
8 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
9 * Copyright (C) 2024 Alexandre Spangaro <alexandre@inovea-conseil.com>
10 *
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 3 of the License, or
14 * (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program. If not, see <https://www.gnu.org/licenses/>.
23 */
24
31// Load Dolibarr environment
32require '../main.inc.php';
33require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
34require_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php';
35require_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php';
36require_once DOL_DOCUMENT_ROOT.'/core/class/doleditor.class.php';
37require_once DOL_DOCUMENT_ROOT.'/core/class/html.formprojet.class.php';
38require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
39require_once DOL_DOCUMENT_ROOT.'/core/modules/project/modules_project.php';
40require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
41require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
42
43// Load translation files required by the page
44$langsLoad = array('projects', 'companies');
45if (isModEnabled('eventorganization')) {
46 $langsLoad[] = 'eventorganization';
47}
48
49$langs->loadLangs($langsLoad);
50
51$id = GETPOSTINT('id');
52$ref = GETPOST('ref', 'alpha');
53$action = GETPOST('action', 'aZ09');
54$backtopage = GETPOST('backtopage', 'alpha');
55$backtopageforcancel = GETPOST('backtopageforcancel', 'alpha');
56$backtopagejsfields = GETPOST('backtopagejsfields', 'alpha');
57$cancel = GETPOST('cancel', 'alpha');
58$confirm = GETPOST('confirm', 'aZ09');
59
60$dol_openinpopup = '';
61if (!empty($backtopagejsfields)) {
62 $tmpbacktopagejsfields = explode(':', $backtopagejsfields);
63 $dol_openinpopup = preg_replace('/[^a-z0-9_]/i', '', $tmpbacktopagejsfields[0]);
64}
65
66$status = GETPOSTINT('status');
67$opp_status = GETPOSTINT('opp_status');
68$opp_percent = price2num(GETPOST('opp_percent', 'alphanohtml'));
69$objcanvas = GETPOST("objcanvas", "alphanohtml");
70$comefromclone = GETPOST("comefromclone", "alphanohtml");
71$date_start = dol_mktime(0, 0, 0, GETPOSTINT('projectstartmonth'), GETPOSTINT('projectstartday'), GETPOSTINT('projectstartyear'));
72$date_end = dol_mktime(0, 0, 0, GETPOSTINT('projectendmonth'), GETPOSTINT('projectendday'), GETPOSTINT('projectendyear'));
73$date_start_event = dol_mktime(GETPOSTINT('date_start_eventhour'), GETPOSTINT('date_start_eventmin'), GETPOSTINT('date_start_eventsec'), GETPOSTINT('date_start_eventmonth'), GETPOSTINT('date_start_eventday'), GETPOSTINT('date_start_eventyear'), 'tzuserrel');
74$date_end_event = dol_mktime(GETPOSTINT('date_end_eventhour'), GETPOSTINT('date_end_eventmin'), GETPOSTINT('date_end_eventsec'), GETPOSTINT('date_end_eventmonth'), GETPOSTINT('date_end_eventday'), GETPOSTINT('date_end_eventyear'), 'tzuserrel');
75$location = GETPOST('location', 'alphanohtml');
76$fk_project = GETPOSTINT('fk_project');
77
78
79$mine = GETPOST('mode') == 'mine' ? 1 : 0;
80//if (! $user->rights->projet->all->lire) $mine=1; // Special for projects
81
82// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
83$hookmanager->initHooks(array('projectcard', 'globalcard'));
84
85$object = new Project($db);
86$extrafields = new ExtraFields($db);
87
88// Load object
89//include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Can't use generic include because when creating a project, ref is defined and we don't want error if fetch fails from ref.
90if ($id > 0 || !empty($ref)) {
91 $ret = $object->fetch($id, $ref); // If we create project, ref may be defined into POST but record does not yet exists into database
92 if ($ret > 0) {
93 $object->fetch_thirdparty();
94 if (getDolGlobalString('PROJECT_ALLOW_COMMENT_ON_PROJECT') && method_exists($object, 'fetchComments') && empty($object->comments)) {
95 $object->fetchComments();
96 }
97 $id = $object->id;
98 }
99}
100
101// fetch optionals attributes and labels
102$extrafields->fetch_name_optionals_label($object->table_element);
103
104// Security check
105$socid = GETPOSTINT('socid');
106//if ($user->socid > 0) $socid = $user->socid; // For external user, no check is done on company because readability is managed by public status of project and assignment.
107restrictedArea($user, 'projet', $object->id, 'projet&project');
108
109if ($id == '' && $ref == '' && ($action != "create" && $action != "add" && $action != "update" && !GETPOST("cancel"))) {
111}
112
113$permissiontoadd = $user->hasRight('projet', 'creer');
114$permissiontodelete = $user->hasRight('projet', 'supprimer');
115$permissiondellink = $user->hasRight('projet', 'creer'); // Used by the include of actions_dellink.inc.php
116
117
118/*
119 * Actions
120 */
121
122$parameters = array('id' => $socid, 'objcanvas' => $objcanvas);
123$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks
124if ($reshook < 0) {
125 setEventMessages($hookmanager->error, $hookmanager->errors, 'errors');
126}
127
128if (empty($reshook)) {
129 $backurlforlist = DOL_URL_ROOT.'/projet/list.php';
130
131 // Cancel
132 if ($cancel) {
133 if (GETPOST("comefromclone") == 1) {
134 $result = $object->delete($user);
135 if ($result > 0) {
136 header("Location: index.php");
137 exit;
138 } else {
139 dol_syslog($object->error, LOG_DEBUG);
140 setEventMessages($langs->trans("CantRemoveProject", $langs->transnoentitiesnoconv("ProjectOverview")), null, 'errors');
141 }
142 }
143 }
144
145 if (empty($backtopage) || ($cancel && empty($id))) {
146 if (empty($backtopage) || ($cancel && strpos($backtopage, '__ID__'))) {
147 if (empty($id) && (($action != 'add' && $action != 'create') || $cancel)) {
148 $backtopage = $backurlforlist;
149 } else {
150 $backtopage = DOL_URL_ROOT.'/projet/card.php?id='.((!empty($id) && $id > 0) ? $id : '__ID__');
151 }
152 }
153 }
154
155 if ($cancel) {
156 if (!empty($backtopageforcancel)) {
157 header("Location: ".$backtopageforcancel);
158 exit;
159 } elseif (!empty($backtopage)) {
160 header("Location: ".$backtopage);
161 exit;
162 }
163 $action = '';
164 }
165
166 include DOL_DOCUMENT_ROOT.'/core/actions_dellink.inc.php'; // Must be 'include', not 'include_once'
167
168 // Action setdraft object
169 if ($action == 'confirm_setdraft' && $confirm == 'yes' && $permissiontoadd) {
170 $result = $object->setStatut($object::STATUS_DRAFT, null, '', 'PROJECT_MODIFY');
171 if ($result >= 0) {
172 // Nothing else done
173 } else {
174 $error++;
175 setEventMessages($object->error, $object->errors, 'errors');
176 }
177 $action = '';
178
179 // For backward compatibility
180 $object->statut = $object::STATUS_DRAFT; // this already set for $object->status by $object->setStatut()
181 }
182
183 // Action add
184 if ($action == 'add' && $permissiontoadd) {
185 $error = 0;
186 if (!GETPOST('ref')) {
187 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Ref")), null, 'errors');
188 $error++;
189 }
190 if (!GETPOST('title')) {
191 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("ProjectLabel")), null, 'errors');
192 $error++;
193 }
194
195 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
196 if (GETPOST('usage_opportunity') != '' && !(GETPOST('opp_status') > 0)) {
197 $error++;
198 setEventMessages($langs->trans("ErrorOppStatusRequiredIfUsage"), null, 'errors');
199 }
200 if (GETPOST('opp_amount') != '' && !(GETPOST('opp_status') > 0)) {
201 $error++;
202 setEventMessages($langs->trans("ErrorOppStatusRequiredIfAmount"), null, 'errors');
203 }
204 }
205
206 // Create with status validated immediately
207 if (getDolGlobalString('PROJECT_CREATE_NO_DRAFT') && !$error) {
209 }
210
211 if (!$error) {
212 $error = 0;
213
214 $db->begin();
215
216 $object->ref = GETPOST('ref', 'alphanohtml');
217 $object->fk_project = GETPOSTINT('fk_project');
218 $object->title = GETPOST('title', 'alphanohtml');
219 $object->socid = GETPOSTINT('socid');
220 $object->description = GETPOST('description', 'restricthtml'); // Do not use 'alpha' here, we want field as it is
221 $object->public = GETPOSTINT('public') ? 1 : 0;
222 $object->opp_amount = GETPOSTFLOAT('opp_amount');
223 $object->budget_amount = GETPOSTFLOAT('budget_amount');
224 $object->date_c = dol_now();
225 $object->date_start = $date_start;
226 $object->date_end = $date_end;
227 $object->date_start_event = $date_start_event;
228 $object->date_end_event = $date_end_event;
229 $object->location = $location;
230 $object->status = $status;
231 $object->opp_status = $opp_status;
232 $object->opp_percent = $opp_percent;
233 $object->usage_opportunity = (GETPOST('usage_opportunity', 'alpha') == 'on' ? 1 : 0);
234 $object->usage_task = (GETPOST('usage_task', 'alpha') == 'on' ? 1 : 0);
235 $object->usage_bill_time = (GETPOST('usage_bill_time', 'alpha') == 'on' ? 1 : 0);
236 $object->usage_organize_event = (GETPOST('usage_organize_event', 'alpha') == 'on' ? 1 : 0);
237
238 // Fill array 'array_options' with data from add form
239 $ret = $extrafields->setOptionalsFromPost(null, $object);
240 if ($ret < 0) {
241 $error++;
242 }
243
244 $result = $object->create($user);
245 if (!$error && $result > 0) {
246 // Add myself as Owner Contact Selected in the form
247 $typeofcontact = GETPOST('typeofcontact');
248 $result = $object->add_contact($user->id, $typeofcontact, 'internal');
249
250 // -3 means type not found (renamed, de-activated or deleted), so don't prevent creation if it has been the case
251 if ($result == -3) {
252 setEventMessage('ErrorPROJECTLEADERRoleMissingRestoreIt', 'errors');
253 $error++;
254 } elseif ($result < 0) {
255 $langs->load("errors");
256 setEventMessages($object->error, $object->errors, 'errors');
257 $error++;
258 }
259 } else {
260 $langs->load("errors");
261 setEventMessages($object->error, $object->errors, 'errors');
262 $error++;
263 }
264 if (!$error && !empty($object->id) > 0) {
265 // Category association
266 $categories = GETPOST('categories', 'array');
267 $result = $object->setCategories($categories);
268 if ($result < 0) {
269 $langs->load("errors");
270 setEventMessages($object->error, $object->errors, 'errors');
271 $error++;
272 }
273 }
274
275 if (!$error) {
276 $db->commit();
277
278 if (!empty($backtopage)) {
279 $backtopage = preg_replace('/--IDFORBACKTOPAGE--|__ID__/', (string) $object->id, $backtopage); // New method to autoselect project after a New on another form object creation
280 $backtopage = $backtopage.'&projectid='.$object->id; // Old method
281 header("Location: ".$backtopage);
282 exit;
283 } else {
284 header("Location:card.php?id=".$object->id);
285 exit;
286 }
287 } else {
288 $db->rollback();
289 unset($_POST["ref"]);
290 $action = 'create';
291 }
292 } else {
293 $action = 'create';
294 }
295 }
296
297 if ($action == 'update' && empty(GETPOST('cancel')) && $permissiontoadd) {
298 $error = 0;
299
300 if (empty($ref)) {
301 $error++;
302 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Ref")), null, 'errors');
303 }
304 if (!GETPOST("title")) {
305 $error++;
306 setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("ProjectLabel")), null, 'errors');
307 }
308
309 $db->begin();
310
311 if (!$error) {
312 $object->oldcopy = clone $object;
313
314 $old_start_date = $object->date_start;
315
316 $object->ref = GETPOST('ref', 'alpha');
317 $object->fk_project = GETPOSTINT('fk_project');
318 $object->title = GETPOST('title', 'alphanohtml'); // Do not use 'alpha' here, we want field as it is
319 $object->status = GETPOSTINT('status');
320 $object->socid = GETPOSTINT('socid');
321 $object->description = GETPOST('description', 'restricthtml'); // Do not use 'alpha' here, we want field as it is
322 $object->public = GETPOSTINT('public') ? 1 : 0;
323 $object->date_start = (!GETPOST('projectstart')) ? '' : $date_start;
324 $object->date_end = (!GETPOST('projectend')) ? '' : $date_end;
325 $object->date_start_event = (!GETPOST('date_start_event')) ? '' : $date_start_event;
326 $object->date_end_event = (!GETPOST('date_end_event')) ? '' : $date_end_event;
327 $object->location = $location;
328 if (GETPOSTISSET('opp_amount')) {
329 $object->opp_amount = price2num(GETPOST('opp_amount', 'alpha'));
330 }
331 if (GETPOSTISSET('budget_amount')) {
332 $object->budget_amount = price2num(GETPOST('budget_amount', 'alpha'));
333 }
334 if (GETPOSTISSET('opp_status')) {
335 $object->opp_status = $opp_status;
336 }
337 if (GETPOSTISSET('opp_percent')) {
338 $object->opp_percent = $opp_percent;
339 }
340 $object->usage_opportunity = (GETPOST('usage_opportunity', 'alpha') == 'on' ? 1 : 0);
341 $object->usage_task = (GETPOST('usage_task', 'alpha') == 'on' ? 1 : 0);
342 $object->usage_bill_time = (GETPOST('usage_bill_time', 'alpha') == 'on' ? 1 : 0);
343 $object->usage_organize_event = (GETPOST('usage_organize_event', 'alpha') == 'on' ? 1 : 0);
344
345 // Fill array 'array_options' with data from add form
346 $ret = $extrafields->setOptionalsFromPost(null, $object, '@GETPOSTISSET');
347 if ($ret < 0) {
348 $error++;
349 }
350 }
351
352 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
353 if ($object->opp_amount && ($object->opp_status <= 0)) {
354 $error++;
355 setEventMessages($langs->trans("ErrorOppStatusRequiredIfAmount"), null, 'errors');
356 }
357 }
358
359 if (!$error) {
360 $result = $object->update($user);
361 if ($result < 0) {
362 $error++;
363 if ($result == -4) {
364 setEventMessages($langs->trans("ErrorRefAlreadyExists"), null, 'errors');
365 } else {
366 setEventMessages($object->error, $object->errors, 'errors');
367 }
368 } else {
369 // Category association
370 $categories = GETPOST('categories', 'array');
371 $result = $object->setCategories($categories);
372 if ($result < 0) {
373 $error++;
374 setEventMessages($object->error, $object->errors, 'errors');
375 }
376 }
377 }
378
379 if (!$error) {
380 if (GETPOST("reportdate") && ($object->date_start != $old_start_date)) {
381 $result = $object->shiftTaskDate($old_start_date);
382 if ($result < 0) {
383 $error++;
384 setEventMessages($langs->trans("ErrorShiftTaskDate").':'.$object->error, $object->errors, 'errors');
385 }
386 }
387 }
388
389 // Check if we must change status
390 if (GETPOST('closeproject')) {
391 $resclose = $object->setClose($user);
392 if ($resclose < 0) {
393 $error++;
394 setEventMessages($langs->trans("FailedToCloseProject").':'.$object->error, $object->errors, 'errors');
395 }
396 }
397
398
399 if ($error) {
400 $db->rollback();
401 $action = 'edit';
402 } else {
403 $db->commit();
404
405 if (GETPOSTINT('socid') > 0) {
406 $object->fetch_thirdparty(GETPOSTINT('socid'));
407 } else {
408 unset($object->thirdparty);
409 }
410 }
411 }
412
413 if ($action == 'set_opp_status' && $user->hasRight('projet', 'creer')) {
414 $error = 0;
415 if (GETPOSTISSET('opp_status')) {
416 $object->opp_status = $opp_status;
417 }
418 if (GETPOSTISSET('opp_percent')) {
419 $object->opp_percent = $opp_percent;
420 }
421
422 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
423 if ($object->opp_amount && ($object->opp_status <= 0)) {
424 $error++;
425 setEventMessages($langs->trans("ErrorOppStatusRequiredIfAmount"), null, 'errors');
426 }
427 }
428
429 if (!$error) {
430 $result = $object->update($user);
431 if ($result < 0) {
432 $error++;
433 if ($result == -4) {
434 setEventMessages($langs->trans("ErrorRefAlreadyExists"), null, 'errors');
435 } else {
436 setEventMessages($object->error, $object->errors, 'errors');
437 }
438 }
439 }
440
441 if ($error) {
442 $db->rollback();
443 $action = 'edit';
444 } else {
445 $db->commit();
446 }
447 }
448
449 // Build doc
450 if ($action == 'builddoc' && $permissiontoadd) {
451 // Save last template used to generate document
452 if (GETPOST('model')) {
453 $object->setDocModel($user, GETPOST('model', 'alpha'));
454 }
455
456 $outputlangs = $langs;
457 if (GETPOST('lang_id', 'aZ09')) {
458 $outputlangs = new Translate("", $conf);
459 $outputlangs->setDefaultLang(GETPOST('lang_id', 'aZ09'));
460 }
461 $result = $object->generateDocument($object->model_pdf, $outputlangs);
462 if ($result <= 0) {
463 setEventMessages($object->error, $object->errors, 'errors');
464 $action = '';
465 }
466 }
467
468 // Delete file in doc form
469 if ($action == 'remove_file' && $permissiontoadd) {
470 if ($object->id > 0) {
471 require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
472
473 $langs->load("other");
474 $upload_dir = $conf->project->multidir_output[$object->entity];
475 $file = $upload_dir.'/'.GETPOST('file');
476 $ret = dol_delete_file($file, 0, 0, 0, $object);
477 if ($ret) {
478 setEventMessages($langs->trans("FileWasRemoved", GETPOST('file')), null, 'mesgs');
479 } else {
480 setEventMessages($langs->trans("ErrorFailToDeleteFile", GETPOST('file')), null, 'errors');
481 }
482 $action = '';
483 }
484 }
485
486
487 if ($action == 'confirm_validate' && $confirm == 'yes' && $permissiontoadd) {
488 $result = $object->setValid($user);
489 if ($result <= 0) {
490 setEventMessages($object->error, $object->errors, 'errors');
491 }
492 }
493
494 if ($action == 'confirm_close' && $confirm == 'yes' && $permissiontoadd) {
495 $result = $object->setClose($user);
496 if ($result <= 0) {
497 setEventMessages($object->error, $object->errors, 'errors');
498 }
499 }
500
501 if ($action == 'confirm_reopen' && $confirm == 'yes' && $permissiontoadd) {
502 $result = $object->setValid($user);
503 if ($result <= 0) {
504 setEventMessages($object->error, $object->errors, 'errors');
505 }
506 }
507
508 if ($action == 'confirm_delete' && $confirm == 'yes' && $permissiontodelete) {
509 $object->fetch($id);
510 $result = $object->delete($user);
511 if ($result > 0) {
512 setEventMessages($langs->trans("RecordDeleted"), null, 'mesgs');
513
514 if (!empty($_SESSION['pageforbacktolist']) && !empty($_SESSION['pageforbacktolist']['project'])) {
515 $tmpurl = $_SESSION['pageforbacktolist']['project'];
516 $tmpurl = preg_replace('/__SOCID__/', (string) $object->socid, $tmpurl);
517 $urlback = $tmpurl.(preg_match('/\?/', $tmpurl) ? '&' : '?'). 'restore_lastsearch_values=1';
518 } else {
519 $urlback = DOL_URL_ROOT.'/projet/list.php?restore_lastsearch_values=1';
520 }
521
522 header("Location: ".$urlback);
523 exit;
524 } else {
525 dol_syslog($object->error, LOG_DEBUG);
526 setEventMessages($object->error, $object->errors, 'errors');
527 }
528 }
529
530 if ($action == 'confirm_clone' && $permissiontoadd && $confirm == 'yes') {
531 $clone_contacts = GETPOST('clone_contacts') ? 1 : 0;
532 $clone_tasks = GETPOST('clone_tasks') ? 1 : 0;
533 $clone_project_files = GETPOST('clone_project_files') ? 1 : 0;
534 $clone_task_files = GETPOST('clone_task_files') ? 1 : 0;
535 $clone_notes = GETPOST('clone_notes') ? 1 : 0;
536 $move_date = GETPOST('move_date') ? 1 : 0;
537 $clone_thirdparty = GETPOSTINT('socid') ? GETPOSTINT('socid') : 0;
538
539 $result = $object->createFromClone($user, $object->id, $clone_contacts, $clone_tasks, $clone_project_files, $clone_task_files, $clone_notes, $move_date, 0, $clone_thirdparty);
540 if ($result <= 0) {
541 setEventMessages($object->error, $object->errors, 'errors');
542 } else {
543 // Load new object
544 $newobject = new Project($db);
545 $newobject->fetch($result);
546 $newobject->fetch_optionals();
547 $newobject->fetch_thirdparty(); // Load new object
548 $object = $newobject;
549 $action = 'view';
550 $comefromclone = true;
551
552 setEventMessages($langs->trans("ProjectCreatedInDolibarr", $newobject->ref), null, 'mesgs');
553 //var_dump($newobject); exit;
554 }
555 }
556
557 // Actions to send emails
558 $triggersendname = 'PROJECT_SENTBYMAIL';
559 $paramname = 'id';
560 $autocopy = 'MAIN_MAIL_AUTOCOPY_PROJECT_TO'; // used to know the automatic BCC to add
561 $trackid = 'proj'.$object->id;
562 include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
563}
564
565
566/*
567 * View
568 */
569
570$form = new Form($db);
571$formfile = new FormFile($db);
572$formproject = new FormProjets($db);
573$userstatic = new User($db);
574
575$title = $langs->trans("Project").' - '.$object->ref.(!empty($object->thirdparty->name) ? ' - '.$object->thirdparty->name : '').(!empty($object->title) ? ' - '.$object->title : '');
576if (getDolGlobalString('MAIN_HTML_TITLE') && preg_match('/projectnameonly/', getDolGlobalString('MAIN_HTML_TITLE'))) {
577 $title = $object->ref.(!empty($object->thirdparty->name) ? ' - '.$object->thirdparty->name : '').(!empty($object->title) ? ' - '.$object->title : '');
578}
579
580$help_url = "EN:Module_Projects|FR:Module_Projets|ES:M&oacute;dulo_Proyectos|DE:Modul_Projekte";
581
582llxHeader("", $title, $help_url, '', 0, 0, '', '', '', 'mod-project page-card');
583
584$titleboth = $langs->trans("LeadsOrProjects");
585$titlenew = $langs->trans("NewLeadOrProject"); // Leads and opportunities by default
586if (!getDolGlobalInt('PROJECT_USE_OPPORTUNITIES')) {
587 $titleboth = $langs->trans("Projects");
588 $titlenew = $langs->trans("NewProject");
589}
590if (getDolGlobalInt('PROJECT_USE_OPPORTUNITIES') == 2) { // 2 = leads only
591 $titleboth = $langs->trans("Leads");
592 $titlenew = $langs->trans("NewLead");
593}
594
595if ($action == 'create' && $user->hasRight('projet', 'creer')) {
596 /*
597 * Create
598 */
599
600 $thirdparty = new Societe($db);
601 if ($socid > 0) {
602 $thirdparty->fetch($socid);
603 }
604
605 print load_fiche_titre($titlenew, '', 'project');
606
607 print '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">';
608 print '<input type="hidden" name="action" value="add">';
609 print '<input type="hidden" name="token" value="'.newToken().'">';
610 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
611 print '<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.'">';
612 print '<input type="hidden" name="backtopagejsfields" value="'.$backtopagejsfields.'">';
613 print '<input type="hidden" name="dol_openinpopup" value="'.$dol_openinpopup.'">';
614
615 print dol_get_fiche_head();
616
617 print '<table class="border centpercent tableforfieldcreate">';
618
619 $defaultref = '';
620 $modele = getDolGlobalString('PROJECT_ADDON', 'mod_project_simple');
621
622 // Search template files
623 $file = '';
624 $classname = '';
625 $filefound = 0;
626 $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
627 foreach ($dirmodels as $reldir) {
628 $file = dol_buildpath($reldir."core/modules/project/".$modele.'.php', 0);
629 if (file_exists($file)) {
630 $filefound = 1;
631 $classname = $modele;
632 break;
633 }
634 }
635
636 if ($filefound && !empty($classname)) {
637 $result = dol_include_once($reldir."core/modules/project/".$modele.'.php');
638 if (class_exists($classname)) {
639 $modProject = new $classname();
640
641 $defaultref = $modProject->getNextValue($thirdparty, $object);
642 }
643 }
644
645 if (is_numeric($defaultref) && $defaultref <= 0) {
646 $defaultref = '';
647 }
648
649 // Ref
650 $suggestedref = (GETPOST("ref") ? GETPOST("ref") : $defaultref);
651 print '<tr><td class="titlefieldcreate"><span class="fieldrequired">'.$langs->trans("Ref").'</span></td><td class><input class="maxwidth150onsmartphone" type="text" name="ref" value="'.dol_escape_htmltag($suggestedref).'">';
652 if ($suggestedref) {
653 print ' '.$form->textwithpicto('', $langs->trans("YouCanCompleteRef", $suggestedref));
654 }
655 print '</td></tr>';
656
657 // Label
658 print '<tr><td><span class="fieldrequired">'.$langs->trans("Label").'</span></td><td><input class="width500 maxwidth150onsmartphone" type="text" name="title" value="'.dol_escape_htmltag(GETPOST("title", 'alphanohtml')).'" autofocus></td></tr>';
659
660 // Parent
661 if (getDolGlobalInt('PROJECT_ENABLE_SUB_PROJECT')) {
662 print '<tr><td>'.$langs->trans("Parent").'</td><td class="maxwidthonsmartphone">';
663 print img_picto('', 'project', 'class="pictofixedwidth"');
664 $formproject->select_projects(-1, '', 'fk_project', 64, 0, 1, 1, 0, 0, 0, '', 0, 0, '', '', '');
665 print '</td></tr>';
666 }
667
668 // Usage (opp, task, bill time, ...)
669 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES') || !getDolGlobalString('PROJECT_HIDE_TASKS') || isModEnabled('eventorganization')) {
670 print '<tr><td class="tdtop">';
671 print $langs->trans("Usage");
672 print '</td>';
673 print '<td>';
674 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
675 print '<input type="checkbox" id="usage_opportunity" name="usage_opportunity"'.(GETPOSTISSET('usage_opportunity') ? (GETPOST('usage_opportunity', 'alpha') ? ' checked="checked"' : '') : ' checked="checked"').'"> ';
676 $htmltext = $langs->trans("ProjectFollowOpportunity");
677 print '<label for="usage_opportunity">'.$form->textwithpicto($langs->trans("ProjectFollowOpportunity"), $htmltext).'</label>';
678 print '<script>';
679 print '$( document ).ready(function() {
680 jQuery("#usage_opportunity").change(function() {
681 if (jQuery("#usage_opportunity").prop("checked")) {
682 console.log("Show opportunities fields");
683 jQuery(".classuseopportunity").show();
684 } else {
685 console.log("Hide opportunities fields "+jQuery("#usage_opportunity").prop("checked"));
686 jQuery(".classuseopportunity").hide();
687 }
688 });
689 ';
690 if (GETPOSTISSET('usage_opportunity') && !GETPOST('usage_opportunity')) {
691 print 'jQuery(".classuseopportunity").hide();';
692 }
693 print '});';
694 print '</script>';
695 print '<br>';
696 }
697 if (!getDolGlobalString('PROJECT_HIDE_TASKS')) {
698 print '<input type="checkbox" id="usage_task" name="usage_task"'.(GETPOSTISSET('usage_task') ? (GETPOST('usage_task', 'alpha') ? ' checked="checked"' : '') : ' checked="checked"').'"> ';
699 $htmltext = $langs->trans("ProjectFollowTasks");
700 print '<label for="usage_task">'.$form->textwithpicto($langs->trans("ProjectFollowTasks"), $htmltext).'</label>';
701 print '<script>';
702 print '$( document ).ready(function() {
703 jQuery("#usage_task").change(function() {
704 if (jQuery("#usage_task").prop("checked")) {
705 console.log("Show task fields");
706 jQuery(".classusetask").show();
707 } else {
708 console.log("Hide tasks fields "+jQuery("#usage_task").prop("checked"));
709 jQuery(".classusetask").hide();
710 }
711 });
712 ';
713 if (GETPOSTISSET('usage_task') && !GETPOST('usage_task')) {
714 print 'jQuery(".classusetask").hide();';
715 }
716 print '});';
717 print '</script>';
718 print '<br>';
719 }
720 if (!getDolGlobalString('PROJECT_HIDE_TASKS') && getDolGlobalString('PROJECT_BILL_TIME_SPENT')) {
721 print '<input type="checkbox" id="usage_bill_time" name="usage_bill_time"'.(GETPOSTISSET('usage_bill_time') ? (GETPOST('usage_bill_time', 'alpha') ? ' checked="checked"' : '') : '').'"> ';
722 $htmltext = $langs->trans("ProjectBillTimeDescription");
723 print '<label for="usage_bill_time">'.$form->textwithpicto($langs->trans("BillTime"), $htmltext).'</label>';
724 print '<script>';
725 print '$( document ).ready(function() {
726 jQuery("#usage_bill_time").change(function() {
727 if (jQuery("#usage_bill_time").prop("checked")) {
728 console.log("Show bill time fields");
729 jQuery(".classusebilltime").show();
730 } else {
731 console.log("Hide bill time fields "+jQuery("#usage_bill_time").prop("checked"));
732 jQuery(".classusebilltime").hide();
733 }
734 });
735 ';
736 if (GETPOSTISSET('usage_bill_time') && !GETPOST('usage_bill_time')) {
737 print 'jQuery(".classusebilltime").hide();';
738 }
739 print '});';
740 print '</script>';
741 print '<br>';
742 }
743 if (isModEnabled('eventorganization')) {
744 print '<input type="checkbox" id="usage_organize_event" name="usage_organize_event"'.(GETPOSTISSET('usage_organize_event') ? (GETPOST('usage_organize_event', 'alpha') ? ' checked="checked"' : '') : '').'"> ';
745 $htmltext = $langs->trans("EventOrganizationDescriptionLong");
746 print '<label for="usage_organize_event">'.$form->textwithpicto($langs->trans("ManageOrganizeEvent"), $htmltext).'</label>';
747 print '<script>';
748 print '$( document ).ready(function() {
749 jQuery("#usage_organize_event").change(function() {
750 if (jQuery("#usage_organize_event").prop("checked")) {
751 console.log("Show organize event fields");
752 jQuery(".classuseorganizeevent").show();
753 } else {
754 console.log("Hide organize event fields "+jQuery("#usage_organize_event").prop("checked"));
755 jQuery(".classuseorganizeevent").hide();
756 }
757 });
758 ';
759 if (!GETPOST('usage_organize_event')) {
760 print 'jQuery(".classuseorganizeevent").hide();';
761 }
762 print '});';
763 print '</script>';
764 }
765 print '</td>';
766 print '</tr>';
767 }
768
769 // Thirdparty
770 if (isModEnabled('societe')) {
771 print '<tr><td>';
772 print(!getDolGlobalString('PROJECT_THIRDPARTY_REQUIRED') ? '' : '<span class="fieldrequired">');
773 print $langs->trans("ThirdParty");
774 print(!getDolGlobalString('PROJECT_THIRDPARTY_REQUIRED') ? '' : '</span>');
775 print '</td><td class="maxwidthonsmartphone">';
776 $filter = '';
777 if (getDolGlobalString('PROJECT_FILTER_FOR_THIRDPARTY_LIST')) {
778 $filter = getDolGlobalString('PROJECT_FILTER_FOR_THIRDPARTY_LIST');
779 }
780 $text = img_picto('', 'company', 'class="pictofixedwidth"').$form->select_company(GETPOSTINT('socid'), 'socid', $filter, 'SelectThirdParty', 1, 0, array(), 0, 'minwidth300 widthcentpercentminusxx maxwidth500');
781 if (!getDolGlobalString('PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS') && empty($conf->dol_use_jmobile)) {
782 $texthelp = $langs->trans("IfNeedToUseOtherObjectKeepEmpty");
783 print $form->textwithtooltip($text.' '.img_help(), $texthelp, 1);
784 } else {
785 print $text;
786 }
787 if (!GETPOSTISSET('backtopage')) {
788 $url = '/societe/card.php?action=create&client=3&fournisseur=0&backtopage='.urlencode($_SERVER["PHP_SELF"].'?action=create');
789 $newbutton = '<span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans("AddThirdParty").'"></span>';
790 // TODO @LDR Implement this
791 if (getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 2) {
792 $tmpbacktopagejsfields = 'addthirdparty:socid,search_socid';
793 print dolButtonToOpenUrlInDialogPopup('addthirdparty', $langs->transnoentitiesnoconv('AddThirdParty'), $newbutton, $url, '', '', '', $tmpbacktopagejsfields);
794 } else {
795 print ' <a href="'.DOL_URL_ROOT.$url.'">'.$newbutton.'</a>';
796 }
797 }
798 print '</td></tr>';
799 }
800
801 // Status
802 if ($status != '') {
803 print '<tr><td>'.$langs->trans("Status").'</td><td>';
804 print '<input type="hidden" name="status" value="'.$status.'">';
805 print $object->LibStatut($status, 4);
806 print '</td></tr>';
807 }
808
809 // Visibility
810 print '<tr><td>'.$langs->trans("Visibility").'</td><td class="maxwidthonsmartphone">';
811 $array = array();
812 if (!getDolGlobalString('PROJECT_DISABLE_PRIVATE_PROJECT')) {
813 $array[0] = $langs->trans("PrivateProject");
814 }
815 if (!getDolGlobalString('PROJECT_DISABLE_PUBLIC_PROJECT')) {
816 $array[1] = $langs->trans("SharedProject");
817 }
818
819 if (count($array) > 0) {
820 print $form->selectarray('public', $array, GETPOSTINT('public') ? 1 : 0, 0, 0, 0, '', 0, 0, 0, '', '', 1);
821 } else {
822 print '<input type="hidden" name="public" id="public" value="'.(GETPOSTINT('public') ? 1 : 0).'">';
823
824 if (GETPOSTINT('public') == 0) {
825 print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"');
826 print $langs->trans("PrivateProject");
827 } else {
828 print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"');
829 print $langs->trans("SharedProject");
830 }
831 }
832 print '</td></tr>';
833
834 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
835 // Opportunity status
836 print '<tr class="classuseopportunity"><td><span class="fieldrequired">'.$langs->trans("OpportunityStatus").'</span></td>';
837 print '<td class="maxwidthonsmartphone">';
838 print $formproject->selectOpportunityStatus('opp_status', GETPOSTISSET('opp_status') ? GETPOST('opp_status') : $object->opp_status, 1, 0, 0, 0, '', 0, 1);
839
840 // Opportunity probability
841 print ' <input class="width50 right" type="text" id="opp_percent" name="opp_percent" title="'.dol_escape_htmltag($langs->trans("OpportunityProbability")).'" value="'.dol_escape_htmltag(GETPOSTISSET('opp_percent') ? GETPOST('opp_percent') : '').'"><span class="hideonsmartphone"> %</span>';
842 print '<input type="hidden" name="opp_percent_not_set" id="opp_percent_not_set" value="'.dol_escape_htmltag(GETPOSTISSET('opp_percent') ? '0' : '1').'">';
843 print '</td>';
844 print '</tr>';
845
846 // Opportunity amount
847 print '<tr class="classuseopportunity"><td>'.$langs->trans("OpportunityAmount").'</td>';
848 print '<td><input class="width75 right" type="text" name="opp_amount" value="'.dol_escape_htmltag(GETPOSTISSET('opp_amount') ? GETPOST('opp_amount') : '').'">';
849 print ' '.$langs->getCurrencySymbol($conf->currency);
850 print '</td>';
851 print '</tr>';
852 }
853
854 // Budget
855 print '<tr><td>'.$langs->trans("Budget").'</td>';
856 print '<td><input class="width75 right" type="text" name="budget_amount" value="'.dol_escape_htmltag(GETPOSTISSET('budget_amount') ? GETPOST('budget_amount') : '').'">';
857 print ' '.$langs->getCurrencySymbol($conf->currency);
858 print '</td>';
859 print '</tr>';
860
861 // Date project
862 print '<tr><td>'.$langs->trans("Date").(isModEnabled('eventorganization') ? ' <span class="classuseorganizeevent">('.$langs->trans("Project").')</span>' : '').'</td><td>';
863 print $form->selectDate(($date_start ? $date_start : ''), 'projectstart', 0, 0, 0, '', 1, 0);
864 print ' <span class="opacitymedium"> '.$langs->trans("to").' </span> ';
865 print $form->selectDate(($date_end ? $date_end : -1), 'projectend', 0, 0, 0, '', 1, 0);
866 print '</td></tr>';
867
868 if (isModEnabled('eventorganization')) {
869 // Date event
870 print '<tr class="classuseorganizeevent"><td>'.$langs->trans("Date").' ('.$langs->trans("Event").')</td><td>';
871 print $form->selectDate(($date_start_event ? $date_start_event : -1), 'date_start_event', 1, 1, 1, '', 1, 0);
872 print ' <span class="opacitymedium"> '.$langs->trans("to").' </span> ';
873 print $form->selectDate(($date_end_event ? $date_end_event : -1), 'date_end_event', 1, 1, 1, '', 1, 0);
874 print '</td></tr>';
875
876 // Location
877 print '<tr class="classuseorganizeevent"><td>'.$langs->trans("Location").'</td>';
878 print '<td><input class="minwidth300 maxwidth500" type="text" name="location" value="'.dol_escape_htmltag($location).'"></td>';
879 print '</tr>';
880 }
881
882 // Description
883 print '<tr><td class="tdtop">'.$langs->trans("Description").'</td>';
884 print '<td>';
885 $doleditor = new DolEditor('description', GETPOST("description", 'restricthtml'), '', 90, 'dolibarr_notes', '', false, true, isModEnabled('fckeditor') && getDolGlobalString('FCKEDITOR_ENABLE_SOCIETE'), ROWS_3, '90%');
886 $doleditor->Create();
887 print '</td></tr>';
888
889 if (isModEnabled('category')) {
890 // Categories
891 print '<tr><td>'.$langs->trans("Categories").'</td><td colspan="3">';
892 $cate_arbo = $form->select_all_categories(Categorie::TYPE_PROJECT, '', 'parent', 64, 0, 3);
893 $arrayselected = GETPOST('categories', 'array');
894 print img_picto('', 'category', 'class="pictofixedwidth"').$form->multiselectarray('categories', $cate_arbo, $arrayselected, '', 0, 'quatrevingtpercent widthcentpercentminusx', 0, 0);
895 print "</td></tr>";
896 }
897
898 // Selection of Owner contact type
899 print '<tr><td class="tdtop">'.$langs->trans("ProjectContactTypeManager").'</td>';
900 print '<td>';
901 $contactList = $object->liste_type_contact('internal', 'position', 1);
902 $typeofcontact = GETPOST('typeofcontact') ? GETPOST('typeofcontact') : 'PROJECTLEADER';
903 print $form->selectarray('typeofcontact', $contactList, $typeofcontact, 0, 0, 0, '', 0, 0, 0, '', '', 1);
904 print '</td></tr>';
905
906 // Other options
907 $parameters = array();
908 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
909 print $hookmanager->resPrint;
910 if (empty($reshook)) {
911 print $object->showOptionals($extrafields, 'create');
912 }
913
914 print '</table>';
915
916 print dol_get_fiche_end();
917
918 print $form->buttonsSaveCancel('CreateDraft');
919
920 print '</form>';
921
922 // Change probability from status or role of project
923 // Set also dependencies between use task and bill time
924 print '<script type="text/javascript">
925 jQuery(document).ready(function() {
926 function change_percent()
927 {
928 var element = jQuery("#opp_status option:selected");
929 var defaultpercent = element.attr("defaultpercent");
930 /*if (jQuery("#opp_percent_not_set").val() == "") */
931 jQuery("#opp_percent").val(defaultpercent);
932 }
933
934 /*init_myfunc();*/
935 jQuery("#opp_status").change(function() {
936 change_percent();
937 });
938
939 jQuery("#usage_task").change(function() {
940 console.log("We click on usage task "+jQuery("#usage_task").is(":checked"));
941 if (! jQuery("#usage_task").is(":checked")) {
942 jQuery("#usage_bill_time").prop("checked", false);
943 }
944 });
945
946 jQuery("#usage_bill_time").change(function() {
947 console.log("We click on usage to bill time");
948 if (jQuery("#usage_bill_time").is(":checked")) {
949 jQuery("#usage_task").prop("checked", true);
950 }
951 });
952 });
953 </script>';
954} elseif ($object->id > 0) {
955 /*
956 * Show or edit
957 */
958
959 $res = $object->fetch_optionals();
960
961 // To verify role of users
962 $userAccess = $object->restrictedProjectArea($user, 'read');
963 $userWrite = $object->restrictedProjectArea($user, 'write');
964 $userDelete = $object->restrictedProjectArea($user, 'delete');
965 //print "userAccess=".$userAccess." userWrite=".$userWrite." userDelete=".$userDelete;
966
967
968 // Confirmation validation
969 if ($action == 'validate') {
970 print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ValidateProject'), $langs->trans('ConfirmValidateProject'), 'confirm_validate', '', 0, 1);
971 }
972 // Confirmation close
973 if ($action == 'close') {
974 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("CloseAProject"), $langs->trans("ConfirmCloseAProject"), "confirm_close", '', '', 1);
975 }
976 // Confirmation reopen
977 if ($action == 'reopen') {
978 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("ReOpenAProject"), $langs->trans("ConfirmReOpenAProject"), "confirm_reopen", '', '', 1);
979 }
980 // Confirmation delete
981 if ($action == 'delete') {
982 $text = $langs->trans("ConfirmDeleteAProject");
983 $task = new Task($db);
984 $taskarray = $task->getTasksArray(0, 0, $object->id, 0, 0);
985 $nboftask = count($taskarray);
986 if ($nboftask) {
987 $text .= '<br>'.img_warning().' '.$langs->trans("ThisWillAlsoRemoveTasks", $nboftask);
988 }
989 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("DeleteAProject"), $text, "confirm_delete", '', '', 1);
990 }
991
992 // Clone confirmation
993 if ($action == 'clone') {
994 $formquestion = array(
995 'text' => $langs->trans("ConfirmClone"),
996 0 => array('type' => 'other', 'name' => 'socid', 'label' => $langs->trans("SelectThirdParty"), 'value' => $form->select_company(GETPOSTINT('socid') > 0 ? GETPOSTINT('socid') : $object->socid, 'socid', '', "None", 0, 0, null, 0, 'minwidth200 maxwidth250')),
997 1 => array('type' => 'checkbox', 'name' => 'clone_contacts', 'label' => $langs->trans("CloneContacts"), 'value' => true),
998 2 => array('type' => 'checkbox', 'name' => 'clone_tasks', 'label' => $langs->trans("CloneTasks"), 'value' => true),
999 3 => array('type' => 'checkbox', 'name' => 'move_date', 'label' => $langs->trans("CloneMoveDate"), 'value' => true),
1000 4 => array('type' => 'checkbox', 'name' => 'clone_notes', 'label' => $langs->trans("CloneNotes"), 'value' => true),
1001 5 => array('type' => 'checkbox', 'name' => 'clone_project_files', 'label' => $langs->trans("CloneProjectFiles"), 'value' => false),
1002 6 => array('type' => 'checkbox', 'name' => 'clone_task_files', 'label' => $langs->trans("CloneTaskFiles"), 'value' => false)
1003 );
1004
1005 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("ToClone"), $langs->trans("ConfirmCloneProject"), "confirm_clone", $formquestion, '', 1, 400, 590);
1006 }
1007
1008
1009 print '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">';
1010 print '<input type="hidden" name="token" value="'.newToken().'">';
1011 print '<input type="hidden" name="action" value="update">';
1012 print '<input type="hidden" name="id" value="'.$object->id.'">';
1013 print '<input type="hidden" name="comefromclone" value="'.$comefromclone.'">';
1014
1016
1017 if ($action == 'edit' && $userWrite > 0) {
1018 print dol_get_fiche_head($head, 'project', $langs->trans("Project"), 0, ($object->public ? 'projectpub' : 'project'));
1019
1020 print '<table class="border centpercent">';
1021
1022 // Ref
1023 $suggestedref = $object->ref;
1024 print '<tr><td class="titlefield fieldrequired">'.$langs->trans("Ref").'</td>';
1025 print '<td><input class="width200" name="ref" value="'.$suggestedref.'">';
1026 print ' '.$form->textwithpicto('', $langs->trans("YouCanCompleteRef", $suggestedref));
1027 print '</td></tr>';
1028
1029 // Label
1030 print '<tr><td class="fieldrequired">'.$langs->trans("Label").'</td>';
1031 print '<td><input class="quatrevingtpercent" name="title" value="'.dol_escape_htmltag($object->title).'"></td></tr>';
1032
1033 // Status
1034 print '<tr><td class="fieldrequired">'.$langs->trans("Status").'</td><td>';
1035 print '<select class="flat" name="status" id="status">';
1036 $statuses = $object->labelStatusShort;
1037 if (getDolGlobalString('MAIN_DISABLEDRAFTSTATUS') || getDolGlobalString('MAIN_DISABLEDRAFTSTATUS_PROJECT')) {
1038 unset($statuses[$object::STATUS_DRAFT]);
1039 }
1040 foreach ($statuses as $key => $val) {
1041 print '<option value="'.$key.'"'.((GETPOSTISSET('status') ? GETPOST('status') : $object->status) == $key ? ' selected="selected"' : '').'>'.$langs->trans($val).'</option>';
1042 }
1043 print '</select>';
1044 print ajax_combobox('status');
1045 print '</td></tr>';
1046
1047 // Parent
1048 if (getDolGlobalInt('PROJECT_ENABLE_SUB_PROJECT')) {
1049 print '<tr><td>'.$langs->trans("Parent").'</td><td class="maxwidthonsmartphone">';
1050 print img_picto('', 'project', 'class="pictofixedwidth"');
1051 $formproject->select_projects(-1, $object->fk_project, 'fk_project', 64, 0, 1, 1, 0, 0, 0, '', 0, 0, '', '', '');
1052 print '</td></tr>';
1053 }
1054
1055 // Usage
1056 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES') || !getDolGlobalString('PROJECT_HIDE_TASKS') || isModEnabled('eventorganization')) {
1057 print '<tr><td class="tdtop">';
1058 print $langs->trans("Usage");
1059 print '</td>';
1060 print '<td>';
1061 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
1062 print '<input type="checkbox" id="usage_opportunity" name="usage_opportunity"'.(GETPOSTISSET('usage_opportunity') ? (GETPOST('usage_opportunity', 'alpha') != '' ? ' checked="checked"' : '') : ($object->usage_opportunity ? ' checked="checked"' : '')).'> ';
1063 $htmltext = $langs->trans("ProjectFollowOpportunity");
1064 print '<label for="usage_opportunity">'.$form->textwithpicto($langs->trans("ProjectFollowOpportunity"), $htmltext).'</label>';
1065 print '<script>';
1066 print '$( document ).ready(function() {
1067 jQuery("#usage_opportunity").change(function() {
1068 set_usage_opportunity();
1069 });
1070
1071 set_usage_opportunity();
1072
1073 function set_usage_opportunity() {
1074 console.log("set_usage_opportunity");
1075 if (jQuery("#usage_opportunity").prop("checked")) {
1076 console.log("Show opportunities fields");
1077 jQuery(".classuseopportunity").show();
1078 } else {
1079 console.log("Hide opportunities fields "+jQuery("#usage_opportunity").prop("checked"));
1080 jQuery(".classuseopportunity").hide();
1081 }
1082 }
1083 });';
1084 print '</script>';
1085 print '<br>';
1086 }
1087 if (!getDolGlobalString('PROJECT_HIDE_TASKS')) {
1088 print '<input type="checkbox" id="usage_task" name="usage_task"' . (GETPOSTISSET('usage_task') ? (GETPOST('usage_task', 'alpha') != '' ? ' checked="checked"' : '') : ($object->usage_task ? ' checked="checked"' : '')) . '> ';
1089 $htmltext = $langs->trans("ProjectFollowTasks");
1090 print '<label for="usage_task">'.$form->textwithpicto($langs->trans("ProjectFollowTasks"), $htmltext).'</label>';
1091 print '<script>';
1092 print '$( document ).ready(function() {
1093 jQuery("#usage_task").change(function() {
1094 set_usage_task();
1095 });
1096
1097 set_usage_task();
1098
1099 function set_usage_task() {
1100 console.log("set_usage_task");
1101 if (jQuery("#usage_task").prop("checked")) {
1102 console.log("Show task fields");
1103 jQuery(".classusetask").show();
1104 } else {
1105 console.log("Hide task fields "+jQuery("#usage_task").prop("checked"));
1106 jQuery(".classusetask").hide();
1107 }
1108 }
1109 });';
1110 print '</script>';
1111 print '<br>';
1112 }
1113 if (!getDolGlobalString('PROJECT_HIDE_TASKS') && getDolGlobalString('PROJECT_BILL_TIME_SPENT')) {
1114 print '<input type="checkbox" id="usage_bill_time" name="usage_bill_time"' . (GETPOSTISSET('usage_bill_time') ? (GETPOST('usage_bill_time', 'alpha') != '' ? ' checked="checked"' : '') : ($object->usage_bill_time ? ' checked="checked"' : '')) . '> ';
1115 $htmltext = $langs->trans("ProjectBillTimeDescription");
1116 print '<label for="usage_bill_time">'.$form->textwithpicto($langs->trans("BillTime"), $htmltext).'</label>';
1117 print '<script>';
1118 print '$( document ).ready(function() {
1119 jQuery("#usage_bill_time").change(function() {
1120 set_usage_bill_time();
1121 });
1122
1123 set_usage_bill_time();
1124
1125 function set_usage_bill_time() {
1126 console.log("set_usage_bill_time");
1127 if (jQuery("#usage_bill_time").prop("checked")) {
1128 console.log("Show bill time fields");
1129 jQuery(".classusebilltime").show();
1130 } else {
1131 console.log("Hide bill time fields "+jQuery("#usage_bill_time").prop("checked"));
1132 jQuery(".classusebilltime").hide();
1133 }
1134 }
1135 });';
1136 print '</script>';
1137 print '<br>';
1138 }
1139 if (isModEnabled('eventorganization')) {
1140 print '<input type="checkbox" id="usage_organize_event" name="usage_organize_event"'. (GETPOSTISSET('usage_organize_event') ? (GETPOST('usage_organize_event', 'alpha') != '' ? ' checked="checked"' : '') : ($object->usage_organize_event ? ' checked="checked"' : '')) . '> ';
1141 $htmltext = $langs->trans("EventOrganizationDescriptionLong");
1142 print '<label for="usage_organize_event">'.$form->textwithpicto($langs->trans("ManageOrganizeEvent"), $htmltext).'</label>';
1143 print '<script>';
1144 print '$( document ).ready(function() {
1145 jQuery("#usage_organize_event").change(function() {
1146 set_usage_event();
1147 });
1148
1149 set_usage_event();
1150
1151 function set_usage_event() {
1152 console.log("set_usage_event");
1153 if (jQuery("#usage_organize_event").prop("checked")) {
1154 console.log("Show organize event fields");
1155 jQuery(".classuseorganizeevent").show();
1156 } else {
1157 console.log("Hide organize event fields "+jQuery("#usage_organize_event").prop("checked"));
1158 jQuery(".classuseorganizeevent").hide();
1159 }
1160 }
1161 });';
1162 print '</script>';
1163 }
1164 print '</td></tr>';
1165 }
1166 print '</td></tr>';
1167
1168 // Thirdparty
1169 if (isModEnabled('societe')) {
1170 print '<tr><td>';
1171 print(!getDolGlobalString('PROJECT_THIRDPARTY_REQUIRED') ? '' : '<span class="fieldrequired">');
1172 print $langs->trans("ThirdParty");
1173 print(!getDolGlobalString('PROJECT_THIRDPARTY_REQUIRED') ? '' : '</span>');
1174 print '</td><td>';
1175 $filter = '';
1176 if (getDolGlobalString('PROJECT_FILTER_FOR_THIRDPARTY_LIST')) {
1177 $filter = getDolGlobalString('PROJECT_FILTER_FOR_THIRDPARTY_LIST');
1178 }
1179 $text = img_picto('', 'company', 'class="pictofixedwidth"');
1180 $text .= $form->select_company(!empty($object->thirdparty->id) ? $object->thirdparty->id : "", 'socid', $filter, 'None', 1, 0, array(), 0, 'minwidth300');
1181 if (!getDolGlobalString('PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS') && empty($conf->dol_use_jmobile)) {
1182 $texthelp = $langs->trans("IfNeedToUseOtherObjectKeepEmpty");
1183 print $form->textwithtooltip($text.' '.img_help(), $texthelp, 1, 0, '', '', 2);
1184 } else {
1185 print $text;
1186 }
1187 print '</td></tr>';
1188 }
1189
1190 // Visibility
1191 print '<tr><td>'.$langs->trans("Visibility").'</td><td>';
1192 $array = array();
1193 if (!getDolGlobalString('PROJECT_DISABLE_PRIVATE_PROJECT')) {
1194 $array[0] = $langs->trans("PrivateProject");
1195 }
1196 if (!getDolGlobalString('PROJECT_DISABLE_PUBLIC_PROJECT')) {
1197 $array[1] = $langs->trans("SharedProject");
1198 }
1199
1200 if (count($array) > 0) {
1201 print $form->selectarray('public', $array, $object->public, 0, 0, 0, '', 0, 0, 0, '', '', 1);
1202 } else {
1203 print '<input type="hidden" id="public" name="public" value="'.$object->public.'">';
1204
1205 if ($object->public == 0) {
1206 print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"');
1207 print $langs->trans("PrivateProject");
1208 } else {
1209 print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"');
1210 print $langs->trans("SharedProject");
1211 }
1212 }
1213 print '</td></tr>';
1214
1215 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
1216 $classfortr = ($object->usage_opportunity ? '' : ' hideobject');
1217 // Opportunity status
1218 print '<tr class="classuseopportunity'.$classfortr.'"><td>'.$langs->trans("OpportunityStatus").'</td>';
1219 print '<td>';
1220 print '<div>';
1221 print $formproject->selectOpportunityStatus('opp_status', $object->opp_status, 1, 0, 0, 0, 'minwidth150 inline-block valignmiddle', 1, 1);
1222
1223 // Opportunity probability
1224 print ' <input class="width50 right" type="text" id="opp_percent" name="opp_percent" title="'.dol_escape_htmltag($langs->trans("OpportunityProbability")).'" value="'.(GETPOSTISSET('opp_percent') ? GETPOST('opp_percent') : (strcmp($object->opp_percent, '') ? vatrate($object->opp_percent) : '')).'"> %';
1225 print '<span id="oldopppercent" class="opacitymedium"></span>';
1226 print '</div>';
1227
1228 print '<div id="divtocloseproject" class="inline-block valign clearboth paddingtop" style="display: none;">';
1229 print '<input type="checkbox" id="inputcloseproject" name="closeproject" />';
1230 print '<label for="inputcloseproject">';
1231 print $form->textwithpicto($langs->trans("AlsoCloseAProject"), $langs->trans("AlsoCloseAProjectTooltip")).'</label>';
1232 print ' </div>';
1233
1234 print '</td>';
1235 print '</tr>';
1236
1237 // Opportunity amount
1238 print '<tr class="classuseopportunity'.$classfortr.'"><td>'.$langs->trans("OpportunityAmount").'</td>';
1239 print '<td><input class="width75 right" type="text" name="opp_amount" value="'.(GETPOSTISSET('opp_amount') ? GETPOST('opp_amount') : (strcmp($object->opp_amount, '') ? price2num($object->opp_amount) : '')).'">';
1240 print $langs->getCurrencySymbol($conf->currency);
1241 print '</td>';
1242 print '</tr>';
1243 }
1244
1245 // Budget
1246 print '<tr><td>'.$langs->trans("Budget").'</td>';
1247 print '<td><input class="width75 right" type="text" name="budget_amount" value="'.(GETPOSTISSET('budget_amount') ? GETPOST('budget_amount') : (strcmp($object->budget_amount, '') ? price2num($object->budget_amount) : '')).'">';
1248 print $langs->getCurrencySymbol($conf->currency);
1249 print '</td>';
1250 print '</tr>';
1251
1252 // Date project
1253 print '<tr><td>'.$langs->trans("Date").(isModEnabled('eventorganization') ? ' <span class="classuseorganizeevent">('.$langs->trans("Project").')</span>' : '').'</td><td>';
1254 print $form->selectDate($object->date_start ? $object->date_start : -1, 'projectstart', 0, 0, 0, '', 1, 0);
1255 print ' <span class="opacitymedium"> '.$langs->trans("to").' </span> ';
1256 print $form->selectDate($object->date_end ? $object->date_end : -1, 'projectend', 0, 0, 0, '', 1, 0);
1257 $object->getLinesArray(null, 0);
1258 if (!empty($object->usage_task) && !empty($object->lines)) {
1259 print ' <span id="divreportdate" class="hidden">&nbsp; &nbsp; <input type="checkbox" class="valignmiddle" id="reportdate" name="reportdate" value="yes" ';
1260 if ($comefromclone) {
1261 print 'checked ';
1262 }
1263 print '/><label for="reportdate" class="valignmiddle opacitymedium">'.$langs->trans("ProjectReportDate").'</label></span>';
1264 }
1265 print '</td></tr>';
1266
1267 if (isModEnabled('eventorganization')) {
1268 // Date event
1269 print '<tr class="classuseorganizeevent"><td>'.$langs->trans("Date").' ('.$langs->trans("Event").')</td><td>';
1270 print $form->selectDate(($date_start_event ? $date_start_event : ($object->date_start_event ? $object->date_start_event : -1)), 'date_start_event', 1, 1, 1, '', 1, 0);
1271 print ' <span class="opacitymedium"> '.$langs->trans("to").' </span> ';
1272 print $form->selectDate(($date_end_event ? $date_end_event : ($object->date_end_event ? $object->date_end_event : -1)), 'date_end_event', 1, 1, 1, '', 1, 0);
1273 print '</td></tr>';
1274
1275 // Location
1276 print '<tr class="classuseorganizeevent"><td>'.$langs->trans("Location").'</td>';
1277 print '<td><input class="minwidth300 maxwidth500" type="text" name="location" value="'.dol_escape_htmltag(GETPOSTISSET('location') ? GETPOST('location') : $object->location).'"></td>';
1278 print '</tr>';
1279 }
1280
1281 // Description
1282 print '<tr><td class="tdtop">'.$langs->trans("Description").'</td>';
1283 print '<td>';
1284 $doleditor = new DolEditor('description', $object->description, '', 90, 'dolibarr_notes', '', false, true, isModEnabled('fckeditor') && getDolGlobalInt('FCKEDITOR_ENABLE_SOCIETE'), ROWS_3, '90%');
1285 $doleditor->Create();
1286 print '</td></tr>';
1287
1288 // Tags-Categories
1289 if (isModEnabled('category')) {
1290 $arrayselected = array();
1291 print '<tr><td>'.$langs->trans("Categories").'</td><td>';
1292 $cate_arbo = $form->select_all_categories(Categorie::TYPE_PROJECT, '', 'parent', 64, 0, 3);
1293 $c = new Categorie($db);
1294 $cats = $c->containing($object->id, Categorie::TYPE_PROJECT);
1295 foreach ($cats as $cat) {
1296 $arrayselected[] = $cat->id;
1297 }
1298 print img_picto('', 'category', 'class="pictofixedwidth"').$form->multiselectarray('categories', $cate_arbo, $arrayselected, 0, 0, 'quatrevingtpercent widthcentpercentminusx', 0, '0');
1299 print "</td></tr>";
1300 }
1301
1302 // Other options
1303 $parameters = array();
1304 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1305 print $hookmanager->resPrint;
1306 if (empty($reshook)) {
1307 print $object->showOptionals($extrafields, 'edit');
1308 }
1309
1310 print '</table>';
1311 } else {
1312 print dol_get_fiche_head($head, 'project', $langs->trans("Project"), -1, ($object->public ? 'projectpub' : 'project'), 0, '', '', 0, '', 1);
1313
1314 // Project card
1315
1316 if (!empty($_SESSION['pageforbacktolist']) && !empty($_SESSION['pageforbacktolist']['project'])) {
1317 $tmpurl = $_SESSION['pageforbacktolist']['project'];
1318 $tmpurl = preg_replace('/__SOCID__/', (string) $object->socid, $tmpurl);
1319 $linkback = '<a href="'.$tmpurl.(preg_match('/\?/', $tmpurl) ? '&' : '?'). 'restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
1320 } else {
1321 $linkback = '<a href="'.DOL_URL_ROOT.'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
1322 }
1323
1324 $morehtmlref = '<div class="refidno">';
1325 // Title
1326 $morehtmlref .= dol_escape_htmltag($object->title);
1327 $morehtmlref .= '<br>';
1328 // Thirdparty
1329 if (!empty($object->thirdparty->id) && $object->thirdparty->id > 0) {
1330 $morehtmlref .= $object->thirdparty->getNomUrl(1, 'project');
1331 }
1332 // Parent
1333 if (getDolGlobalInt('PROJECT_ENABLE_SUB_PROJECT')) {
1334 if (!empty($object->fk_project) && $object->fk_project) {
1335 $parent = new Project($db);
1336 $parent->fetch($object->fk_project);
1337 $morehtmlref .= $langs->trans("Child of").' '.$parent->getNomUrl(1, 'project').' '.$parent->title;
1338 }
1339 }
1340 $morehtmlref .= '</div>';
1341
1342 // Define a complementary filter for search of next/prev ref.
1343 if (!$user->hasRight('projet', 'all', 'lire')) {
1344 $objectsListId = $object->getProjectsAuthorizedForUser($user, 0, 0);
1345 $object->next_prev_filter = "rowid IN (".$db->sanitize(count($objectsListId) ? implode(',', array_keys($objectsListId)) : '0').")";
1346 }
1347
1348 dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
1349
1350 print '<div class="fichecenter">';
1351 print '<div class="fichehalfleft">';
1352 print '<div class="underbanner clearboth"></div>';
1353
1354 print '<table class="border tableforfield centpercent">';
1355
1356 // Usage
1357 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES') || !getDolGlobalString('PROJECT_HIDE_TASKS') || isModEnabled('eventorganization')) {
1358 print '<tr><td class="tdtop">';
1359 print $langs->trans("Usage");
1360 print '</td>';
1361 print '<td>';
1362 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
1363 print '<input type="checkbox" disabled name="usage_opportunity"'.(GETPOSTISSET('usage_opportunity') ? (GETPOST('usage_opportunity', 'alpha') != '' ? ' checked="checked"' : '') : ($object->usage_opportunity ? ' checked="checked"' : '')).'> ';
1364 $htmltext = $langs->trans("ProjectFollowOpportunity");
1365 print $form->textwithpicto($langs->trans("ProjectFollowOpportunity"), $htmltext);
1366 print '<br>';
1367 }
1368 if (!getDolGlobalString('PROJECT_HIDE_TASKS')) {
1369 print '<input type="checkbox" disabled name="usage_task"'.(GETPOSTISSET('usage_task') ? (GETPOST('usage_task', 'alpha') != '' ? ' checked="checked"' : '') : ($object->usage_task ? ' checked="checked"' : '')).'> ';
1370 $htmltext = $langs->trans("ProjectFollowTasks");
1371 print $form->textwithpicto($langs->trans("ProjectFollowTasks"), $htmltext);
1372 print '<br>';
1373 }
1374 if (!getDolGlobalString('PROJECT_HIDE_TASKS') && getDolGlobalString('PROJECT_BILL_TIME_SPENT')) {
1375 print '<input type="checkbox" disabled name="usage_bill_time"'.(GETPOSTISSET('usage_bill_time') ? (GETPOST('usage_bill_time', 'alpha') != '' ? ' checked="checked"' : '') : ($object->usage_bill_time ? ' checked="checked"' : '')).'> ';
1376 $htmltext = $langs->trans("ProjectBillTimeDescription");
1377 print $form->textwithpicto($langs->trans("BillTime"), $htmltext);
1378 print '<br>';
1379 }
1380
1381 if (isModEnabled('eventorganization')) {
1382 print '<input type="checkbox" disabled name="usage_organize_event"'.(GETPOSTISSET('usage_organize_event') ? (GETPOST('usage_organize_event', 'alpha') != '' ? ' checked="checked"' : '') : ($object->usage_organize_event ? ' checked="checked"' : '')).'> ';
1383 $htmltext = $langs->trans("EventOrganizationDescriptionLong");
1384 print $form->textwithpicto($langs->trans("ManageOrganizeEvent"), $htmltext);
1385 }
1386 print '</td></tr>';
1387 }
1388
1389 // Visibility
1390 print '<tr><td class="titlefield">'.$langs->trans("Visibility").'</td><td>';
1391 if ($object->public) {
1392 print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"');
1393 print $langs->trans('SharedProject');
1394 } else {
1395 print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"');
1396 print $langs->trans('PrivateProject');
1397 }
1398 print '</td></tr>';
1399
1400 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES') && !empty($object->usage_opportunity)) {
1401 // Opportunity status
1402 print '<tr><td>'.$langs->trans("OpportunityStatus");
1403 if ($action != 'edit_opp_status' && $user->hasRight('projet', 'creer')) {
1404 print '<a class="editfielda paddingtop" href="'.$_SERVER["PHP_SELF"].'?action=edit_opp_status&token='.newToken().'&id='.$object->id.'">'.img_edit($langs->transnoentitiesnoconv('Edit'), 1).'</a>';
1405 }
1406 print '</td><td>';
1407 $html_name_status = ($action == 'edit_opp_status') ? 'opp_status' : 'none';
1408 $html_name_percent = ($action == 'edit_opp_status') ? 'opp_percent' : 'none';
1409 $percent_value = (GETPOSTISSET('opp_percent') ? GETPOST('opp_percent') : (strcmp($object->opp_percent, '') ? vatrate($object->opp_percent) : ''));
1410 $formproject->formOpportunityStatus($_SERVER['PHP_SELF'].'?socid='.$object->id, $object->opp_status, $percent_value, $html_name_status, $html_name_percent);
1411 print '</td></tr>';
1412
1413 // Opportunity Amount
1414 print '<tr><td>'.$langs->trans("OpportunityAmount").'</td><td>';
1415 if (strcmp($object->opp_amount, '')) {
1416 print '<span class="amount">'.price($object->opp_amount, 0, $langs, 1, 0, -1, $conf->currency).'</span>';
1417 if (strcmp($object->opp_percent, '')) {
1418 print ' &nbsp; &nbsp; &nbsp; <span title="'.dol_escape_htmltag($langs->trans('OpportunityWeightedAmount')).'"><span class="opacitymedium">'.$langs->trans("OpportunityWeightedAmountShort").'</span>: <span class="amount">'.price($object->opp_amount * $object->opp_percent / 100, 0, $langs, 1, 0, -1, $conf->currency).'</span></span>';
1419 }
1420 }
1421 print '</td></tr>';
1422 }
1423
1424 // Budget
1425 print '<tr><td>'.$langs->trans("Budget").'</td><td>';
1426 if (!is_null($object->budget_amount) && strcmp($object->budget_amount, '')) {
1427 print '<span class="amount">'.price($object->budget_amount, 0, $langs, 1, 0, 0, $conf->currency).'</span>';
1428 }
1429 print '</td></tr>';
1430
1431 // Date start - end project
1432 print '<tr><td>'.$langs->trans("Dates").'</td><td>';
1433 $start = dol_print_date($object->date_start, 'day');
1434 print($start ? $start : '?');
1435 $end = dol_print_date($object->date_end, 'day');
1436 print ' <span class="opacitymedium">-</span> ';
1437 print($end ? $end : '?');
1438 if ($object->hasDelay()) {
1439 print img_warning("Late");
1440 }
1441 print '</td></tr>';
1442
1443 // Other attributes
1444 $cols = 2;
1445 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
1446
1447 print '</table>';
1448
1449 print '</div>';
1450 print '<div class="fichehalfright">';
1451 print '<div class="underbanner clearboth"></div>';
1452
1453 print '<table class="border tableforfield centpercent">';
1454
1455 // Description
1456 print '<td class="titlefield tdtop">'.$langs->trans("Description").'</td><td>';
1457 print '<div class="longmessagecut">';
1458 print dolPrintHTML($object->description);
1459 print '</div>';
1460 print '</td></tr>';
1461
1462 // Categories
1463 if (isModEnabled('category')) {
1464 print '<tr><td class="valignmiddle">'.$langs->trans("Categories").'</td><td>';
1465 print $form->showCategories($object->id, Categorie::TYPE_PROJECT, 1);
1466 print "</td></tr>";
1467 }
1468
1469 print '</table>';
1470
1471 print '</div>';
1472 print '</div>';
1473
1474 print '<div class="clearboth"></div>';
1475 }
1476
1477 print dol_get_fiche_end();
1478
1479 if ($action == 'edit' && $userWrite > 0) {
1480 print $form->buttonsSaveCancel();
1481 }
1482
1483 print '</form>';
1484
1485 // Set also dependencies between use task and bill time
1486 print '<script type="text/javascript">
1487 jQuery(document).ready(function() {
1488 jQuery("#usage_task").change(function() {
1489 console.log("We click on usage task "+jQuery("#usage_task").is(":checked"));
1490 if (! jQuery("#usage_task").is(":checked")) {
1491 jQuery("#usage_bill_time").prop("checked", false);
1492 }
1493 });
1494
1495 jQuery("#usage_bill_time").change(function() {
1496 console.log("We click on usage to bill time");
1497 if (jQuery("#usage_bill_time").is(":checked")) {
1498 jQuery("#usage_task").prop("checked", true);
1499 }
1500 });
1501
1502 jQuery("#projectstart").change(function() {
1503 console.log("We modify the start date");
1504 jQuery("#divreportdate").show();
1505 });
1506 });
1507 </script>';
1508
1509 // Change probability from status
1510 if (!empty($conf->use_javascript_ajax) && getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
1511 // Default value to close or not when we set opp to 'WON'.
1512 $defaultcheckedwhenoppclose = 1;
1513 if (!getDolGlobalString('PROJECT_HIDE_TASKS')) {
1514 $defaultcheckedwhenoppclose = 0;
1515 }
1516
1517 print '<!-- Javascript to manage opportunity status change -->';
1518 print '<script type="text/javascript">
1519 jQuery(document).ready(function() {
1520 function change_percent()
1521 {
1522 var element = jQuery("#opp_status option:selected");
1523 var defaultpercent = element.attr("defaultpercent");
1524 var defaultcloseproject = '.((int) $defaultcheckedwhenoppclose).';
1525 var elemcode = element.attr("elemcode");
1526 var oldpercent = \''.dol_escape_js($object->opp_percent).'\';
1527
1528 console.log("We select "+elemcode);
1529
1530 /* Define if checkbox to close is checked or not */
1531 var closeproject = 0;
1532 if (elemcode == \'LOST\') closeproject = 1;
1533 if (elemcode == \'WON\') closeproject = defaultcloseproject;
1534 if (closeproject) jQuery("#inputcloseproject").prop("checked", true);
1535 else jQuery("#inputcloseproject").prop("checked", false);
1536
1537 /* Make the close project checkbox visible or not */
1538 console.log("closeproject="+closeproject);
1539 if (elemcode == \'WON\' || elemcode == \'LOST\')
1540 {
1541 jQuery("#divtocloseproject").show();
1542 }
1543 else
1544 {
1545 jQuery("#divtocloseproject").hide();
1546 }
1547
1548 /* Change percent with default percent (defaultpercent) if new status (defaultpercent) is higher than current (jQuery("#opp_percent").val()) */
1549 if (oldpercent != \'\' && (parseFloat(defaultpercent) < parseFloat(oldpercent)))
1550 {
1551 console.log("oldpercent="+oldpercent+" defaultpercent="+defaultpercent+" def < old");
1552 if (jQuery("#opp_percent").val() != \'\' && oldpercent != \'\') {
1553 jQuery("#oldopppercent").text(\' - '.dol_escape_js($langs->transnoentities("PreviousValue")).': \'+price2numjs(oldpercent)+\' %\');
1554 }
1555
1556 if (parseFloat(oldpercent) != 100 && elemcode != \'LOST\') { jQuery("#opp_percent").val(oldpercent); }
1557 else { jQuery("#opp_percent").val(price2numjs(defaultpercent)); }
1558 } else {
1559 console.log("oldpercent="+oldpercent+" defaultpercent="+defaultpercent);
1560 if (jQuery("#opp_percent").val() == \'\' || (parseFloat(jQuery("#opp_percent").val()) < parseFloat(defaultpercent))) {
1561 if (jQuery("#opp_percent").val() != \'\' && oldpercent != \'\') {
1562 jQuery("#oldopppercent").text(\' - '.dol_escape_js($langs->transnoentities("PreviousValue")).': \'+price2numjs(oldpercent)+\' %\');
1563 }
1564 jQuery("#opp_percent").val(price2numjs(defaultpercent));
1565 }
1566 }
1567 }
1568
1569 jQuery("#opp_status").change(function() {
1570 change_percent();
1571 });
1572 });
1573 </script>';
1574 }
1575
1576
1577 /*
1578 * Actions Buttons
1579 */
1580
1581 print '<div class="tabsAction">';
1582 $parameters = array();
1583 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
1584 // modified by hook
1585 if (empty($reshook)) {
1586 if ($action != "edit" && $action != 'presend') {
1587 // Create event
1588 /*if (isModEnabled('agenda') && !empty($conf->global->MAIN_ADD_EVENT_ON_ELEMENT_CARD)) // Add hidden condition because this is not a
1589 // "workflow" action so should appears somewhere else on
1590 // page.
1591 {
1592 print '<a class="butAction" href="'.DOL_URL_ROOT.'/comm/action/card.php?action=create&amp;origin=' . $object->element . '&amp;originid=' . $object->id . '&amp;socid=' . $object->socid . '&amp;projectid=' . $object->id . '">' . $langs->trans("AddAction") . '</a>';
1593 }*/
1594
1595 // Send
1596 if (empty($user->socid)) {
1597 if ($object->status != Project::STATUS_CLOSED) {
1598 print dolGetButtonAction('', $langs->trans('SendMail'), 'default', $_SERVER["PHP_SELF"].'?action=presend&token='.newToken().'&id='.$object->id.'&mode=init#formmailbeforetitle', '');
1599 }
1600 }
1601
1602 // Accounting Report
1603 /*
1604 $accouting_module_activated = isModEnabled('comptabilite') || isModEnabled('accounting');
1605 if ($accouting_module_activated && $object->status != Project::STATUS_DRAFT) {
1606 $start = dol_getdate((int) $object->date_start);
1607 $end = dol_getdate((int) $object->date_end);
1608 $url = DOL_URL_ROOT.'/compta/accounting-files.php?projectid='.$object->id;
1609 if (!empty($object->date_start)) $url .= '&amp;date_startday='.$start['mday'].'&amp;date_startmonth='.$start['mon'].'&amp;date_startyear='.$start['year'];
1610 if (!empty($object->date_end)) $url .= '&amp;date_stopday='.$end['mday'].'&amp;date_stopmonth='.$end['mon'].'&amp;date_stopyear='.$end['year'];
1611 print dolGetButtonAction('', $langs->trans('ExportAccountingReportButtonLabel'), 'default', $url, '');
1612 }
1613 */
1614
1615 // Back to draft
1616 if (!getDolGlobalString('MAIN_DISABLEDRAFTSTATUS') && !getDolGlobalString('MAIN_DISABLEDRAFTSTATUS_PROJECT')) {
1617 if ($object->status != Project::STATUS_DRAFT && $user->hasRight('projet', 'creer')) {
1618 if ($userWrite > 0) {
1619 print dolGetButtonAction('', $langs->trans('SetToDraft'), 'default', $_SERVER["PHP_SELF"].'?action=confirm_setdraft&amp;confirm=yes&amp;token='.newToken().'&amp;id='.$object->id, '');
1620 } else {
1621 print dolGetButtonAction($langs->trans('NotOwnerOfProject'), $langs->trans('SetToDraft'), 'default', $_SERVER['PHP_SELF']. '#', '', false);
1622 }
1623 }
1624 }
1625
1626 // Modify
1627 if ($object->status != Project::STATUS_CLOSED && $user->hasRight('projet', 'creer')) {
1628 if ($userWrite > 0) {
1629 print dolGetButtonAction('', $langs->trans('Modify'), 'default', $_SERVER["PHP_SELF"].'?action=edit&token='.newToken().'&id='.$object->id, '');
1630 } else {
1631 print dolGetButtonAction($langs->trans('NotOwnerOfProject'), $langs->trans('Modify'), 'default', $_SERVER['PHP_SELF']. '#', '', false);
1632 }
1633 }
1634
1635 // Validate
1636 if ($object->status == Project::STATUS_DRAFT && $user->hasRight('projet', 'creer')) {
1637 if ($userWrite > 0) {
1638 print dolGetButtonAction('', $langs->trans('Validate'), 'default', $_SERVER["PHP_SELF"].'?action=validate&amp;token='.newToken().'&amp;id='.$object->id, '');
1639 } else {
1640 print dolGetButtonAction($langs->trans('NotOwnerOfProject'), $langs->trans('Validate'), 'default', $_SERVER['PHP_SELF']. '#', '', false);
1641 }
1642 }
1643
1644 // Close
1645 if ($object->status == Project::STATUS_VALIDATED && $user->hasRight('projet', 'creer')) {
1646 if ($userWrite > 0) {
1647 print dolGetButtonAction('', $langs->trans('Close'), 'default', $_SERVER["PHP_SELF"].'?action=close&amp;token='.newToken().'&amp;id='.$object->id, '');
1648 } else {
1649 print dolGetButtonAction($langs->trans('NotOwnerOfProject'), $langs->trans('Close'), 'default', $_SERVER['PHP_SELF']. '#', '', false);
1650 }
1651 }
1652
1653 // Reopen
1654 if ($object->status == Project::STATUS_CLOSED && $user->hasRight('projet', 'creer')) {
1655 if ($userWrite > 0) {
1656 print dolGetButtonAction('', $langs->trans('ReOpen'), 'default', $_SERVER["PHP_SELF"].'?action=reopen&amp;token='.newToken().'&amp;id='.$object->id, '');
1657 } else {
1658 print dolGetButtonAction($langs->trans('NotOwnerOfProject'), $langs->trans('ReOpen'), 'default', $_SERVER['PHP_SELF']. '#', '', false);
1659 }
1660 }
1661
1662 // Buttons Create
1663 if (!getDolGlobalString('PROJECT_HIDE_CREATE_OBJECT_BUTTON')) {
1664 $arrayforbutaction = array(
1665 10 => array('lang' => 'propal', 'enabled' => isModEnabled("propal"), 'perm' => $user->hasRight('propal', 'creer'), 'label' => 'AddProp', 'url' => '/comm/propal/card.php?action=create&amp;projectid='.$object->id.'&amp;socid='.$object->socid),
1666 20 => array('lang' => 'orders', 'enabled' => isModEnabled("order"), 'perm' => $user->hasRight('commande', 'creer'), 'label' => 'CreateOrder', 'url' => '/commande/card.php?action=create&amp;projectid='.$object->id.'&amp;socid='.$object->socid),
1667 30 => array('lang' => 'bills', 'enabled' => isModEnabled("invoice"), 'perm' => $user->hasRight('facture', 'creer'), 'label' => 'CreateBill', 'url' => '/compta/facture/card.php?action=create&amp;projectid='.$object->id.'&amp;socid='.$object->socid),
1668 40 => array('lang' => 'supplier_proposal', 'enabled' => isModEnabled("supplier_proposal"), 'perm' => $user->hasRight('supplier_proposal', 'creer'), 'label' => 'AddSupplierProposal', 'url' => '/supplier_proposal/card.php?action=create&amp;projectid='.$object->id.'&amp;socid='.$object->socid),
1669 50 => array('lang' => 'suppliers', 'enabled' => isModEnabled("supplier_order"), 'perm' => $user->hasRight('fournisseur', 'commande', 'creer'), 'label' => 'AddSupplierOrder', 'url' => '/fourn/commande/card.php?action=create&amp;projectid='.$object->id.'&amp;socid='.$object->socid),
1670 60 => array('lang' => 'suppliers', 'enabled' => isModEnabled("supplier_invoice"), 'perm' => $user->hasRight('fournisseur', 'facture', 'creer'), 'label' => 'AddSupplierInvoice', 'url' => '/fourn/facture/card.php?action=create&amp;projectid='.$object->id.'&amp;socid='.$object->socid),
1671 70 => array('lang' => 'interventions', 'enabled' => isModEnabled("intervention"), 'perm' => $user->hasRight('fichinter', 'creer'), 'label' => 'AddIntervention', 'url' => '/fichinter/card.php?action=create&amp;projectid='.$object->id.'&amp;socid='.$object->socid),
1672 80 => array('lang' => 'contracts', 'enabled' => isModEnabled("contract"), 'perm' => $user->hasRight('contrat', 'creer'), 'label' => 'AddContract', 'url' => '/contrat/card.php?action=create&amp;projectid='.$object->id.'&amp;socid='.$object->socid),
1673 90 => array('lang' => 'trips', 'enabled' => isModEnabled("expensereport"), 'perm' => $user->hasRight('expensereport', 'creer'), 'label' => 'AddTrip', 'url' => '/expensereport/card.php?action=create&amp;projectid='.$object->id.'&amp;socid='.$object->socid),
1674 100 => array('lang' => 'donations', 'enabled' => isModEnabled("don"), 'perm' => $user->hasRight('don', 'creer'), 'label' => 'AddDonation', 'url' => '/don/card.php?action=create&amp;projectid='.$object->id.'&amp;socid='.$object->socid),
1675 );
1676
1677 $params = array('backtopage' => $_SERVER["PHP_SELF"].'?id='.$object->id);
1678
1679 print dolGetButtonAction('', $langs->trans("Create"), 'default', $arrayforbutaction, '', 1, $params);
1680 }
1681
1682 // Clone
1683 if ($user->hasRight('projet', 'creer')) {
1684 if ($userWrite > 0) {
1685 print dolGetButtonAction('', $langs->trans('ToClone'), 'default', $_SERVER["PHP_SELF"].'?action=clone&token='.newToken().'&id='.((int) $object->id), '');
1686 } else {
1687 print dolGetButtonAction($langs->trans('NotOwnerOfProject'), $langs->trans('ToClone'), 'default', $_SERVER['PHP_SELF']. '#', '', false);
1688 }
1689 }
1690
1691 // Delete
1692 if ($user->hasRight('projet', 'supprimer') || ($object->status == Project::STATUS_DRAFT && $user->hasRight('projet', 'creer'))) {
1693 if ($userDelete > 0 || ($object->status == Project::STATUS_DRAFT && $user->hasRight('projet', 'creer'))) {
1694 print dolGetButtonAction('', $langs->trans('Delete'), 'delete', $_SERVER["PHP_SELF"].'?action=delete&token='.newToken().'&id='.$object->id, '');
1695 } else {
1696 print dolGetButtonAction($langs->trans('NotOwnerOfProject'), $langs->trans('Delete'), 'default', $_SERVER['PHP_SELF']. '#', '', false);
1697 }
1698 }
1699 }
1700 }
1701
1702 print "</div>";
1703
1704 if (GETPOST('modelselected')) {
1705 $action = 'presend';
1706 }
1707
1708 if ($action != 'presend') {
1709 print '<div class="fichecenter"><div class="fichehalfleft">';
1710 print '<a name="builddoc"></a>'; // ancre
1711
1712 if (getDolGlobalInt('PROJECT_ENABLE_SUB_PROJECT')) {
1713 /*
1714 * Sub-projects (children)
1715 */
1716 $children = $object->getChildren();
1717 if ($children) {
1718 print '<table class="centpercent notopnoleftnoright table-fiche-title">';
1719 print '<tr class="titre"><td class="nobordernopadding valignmiddle col-title">';
1720 print '<div class="titre inline-block">'.$langs->trans('Sub-projects').'</div>';
1721 print '</td></tr></table>';
1722
1723 print '<div class="div-table-responsive-no-min">';
1724 print '<table class="centpercent noborder'.($morecss ? ' '.$morecss : '').'">';
1725 print '<tr class="liste_titre">';
1726 print getTitleFieldOfList('Ref', 0, $_SERVER["PHP_SELF"], '', '', '', '', '', '', '', 1);
1727 print getTitleFieldOfList('Title', 0, $_SERVER["PHP_SELF"], '', '', '', '', '', '', '', 1);
1728 print getTitleFieldOfList('Status', 0, $_SERVER["PHP_SELF"], '', '', '', '', '', '', '', 1);
1729 print '</tr>';
1730 print "\n";
1731
1732 $subproject = new Project($db);
1733 foreach ($children as $child) {
1734 $subproject->fetch($child->rowid);
1735 print '<tr class="oddeven">';
1736 print '<td class="nowraponall">'.$subproject->getNomUrl(1, 'project').'</td>';
1737 print '<td class="nowraponall tdoverflowmax125">'.$child->title.'</td>';
1738 print '<td class="nowraponall">'.$subproject->getLibStatut(5).'</td>';
1739 print '</tr>';
1740 }
1741
1742 print '</table>';
1743 print '</div>';
1744 }
1745 }
1746
1747 /*
1748 * Generated documents
1749 */
1750 $filename = dol_sanitizeFileName($object->ref);
1751 $filedir = $conf->project->multidir_output[$object->entity]."/".dol_sanitizeFileName($object->ref);
1752 $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
1753 $genallowed = ($user->hasRight('projet', 'lire') && $userAccess > 0);
1754 $delallowed = ($user->hasRight('projet', 'creer') && $userWrite > 0);
1755
1756 print $formfile->showdocuments('project', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 0, 0, '', '', '', '', '', $object);
1757
1758 print '</div><div class="fichehalfright">';
1759
1760 $MAXEVENT = 10;
1761
1762 $morehtmlcenter = '<div class="nowraponall">';
1763 $morehtmlcenter .= dolGetButtonTitle($langs->trans('FullConversation'), '', 'fa fa-comments imgforviewmode', DOL_URL_ROOT.'/projet/messaging.php?id='.$object->id);
1764 $morehtmlcenter .= dolGetButtonTitle($langs->trans('FullList'), '', 'fa fa-bars imgforviewmode', DOL_URL_ROOT.'/projet/agenda.php?id='.$object->id);
1765 $morehtmlcenter .= '</div>';
1766
1767 // List of actions on element
1768 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
1769 $formactions = new FormActions($db);
1770 $somethingshown = $formactions->showactions($object, 'project', 0, 1, '', $MAXEVENT, '', $morehtmlcenter);
1771
1772 print '</div></div>';
1773 }
1774
1775 // Presend form
1776 $modelmail = 'project';
1777 $defaulttopic = 'SendProjectRef';
1778 $defaulttopiclang = 'projects';
1779 $diroutput = $conf->project->multidir_output[$object->entity];
1780 $autocopy = 'MAIN_MAIL_AUTOCOPY_PROJECT_TO'; // used to know the automatic BCC to add
1781 $trackid = 'proj'.$object->id;
1782
1783 include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
1784
1785 // Hook to add more things on page
1786 $parameters = array();
1787 $reshook = $hookmanager->executeHooks('mainCardTabAddMore', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1788} else {
1789 print $langs->trans("RecordNotFound");
1790}
1791
1792// End of page
1793llxFooter();
1794$db->close();
$id
Definition account.php:39
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
print $langs trans("AuditedSecurityEvents").'</strong >< span class="opacitymedium"></span >< br > status
Or an array listing all the potential status of the object: array: int of the status => translated la...
Definition security.php:640
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='')
Convert a html select field into an ajax combobox.
Definition ajax.lib.php:457
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:70
Class to manage categories.
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.
const STATUS_VALIDATED
Open/Validated status.
const STATUS_CLOSED
Closed status.
const STATUS_DRAFT
Draft status.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage tasks.
Class to manage translations.
Class to manage Dolibarr users.
llxFooter()
Footer empty.
Definition document.php:107
dol_delete_file($file, $disableglob=0, $nophperrors=0, $nohook=0, $object=null, $allowdotdot=false, $indexdatabase=1, $nolog=0)
Remove a file or several files with a mask.
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.
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
vatrate($rate, $addpercent=false, $info_bits=0, $usestarfornpr=0, $html=0)
Return a string with VAT rate label formatted for view output Used into pdf and HTML pages.
img_help($usehelpcursor=1, $usealttitle=1)
Show help logo with cursor "?".
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.
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.
dolPrintHTML($s, $allowiframe=0)
Return a string (that can be on several lines) ready to be output on a HTML page.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dolGetButtonTitle($label, $helpText='', $iconClass='fa fa-file', $url='', $id='', $status=1, $params=array())
Function dolGetButtonTitle : this kind of buttons are used in title in list.
dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled='', $morecss='classlink button bordertransp', $jsonopen='', $backtopagejsfields='', $accesskey='')
Return HTML code to output a button to open a dialog popup box.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
setEventMessage($mesgs, $style='mesgs', $noduplicate=0, $attop=0)
Set event message in dol_events session object.
price($amount, $form=0, $outlangs='', $trunc=1, $rounding=-1, $forcerounding=-1, $currency_code='')
Function to format a value into an amount for visual output Function used into PDF and HTML pages.
dol_now($mode='auto')
Return date for now.
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
dol_escape_js($stringtoescape, $mode=0, $noescapebackslashn=0)
Returns text escaped for inclusion into javascript code.
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).
if(!function_exists( 'dol_getprefix')) dol_include_once($relpath, $classname='')
Make an include_once using default root and alternate root if it fails.
newToken()
Return the value of token currently saved into session with name 'newtoken'.
dolGetButtonAction($label, $text='', $actionType='default', $url='', $id='', $userRight=1, $params=array())
Function dolGetButtonAction.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='')
Return the value of a $_GET or $_POST supervariable, converted into float.
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.
getDolGlobalString($key, $default='')
Return a 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...
project_prepare_head(Project $project, $moreparam='')
Prepare array with list of tabs.
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.