dolibarr 20.0.5
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) 2025 Benjamin Falière <benjamin@faliere.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 technical object to manage hooks of page. Note that conf->hooks_modules contains 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 = GETPOST('public', 'alphanohtml');
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->statut = $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 project leader
247 $typeofcontact = 'PROJECTLEADER';
248 $result = $object->add_contact($user->id, $typeofcontact, 'internal');
249
250 // -3 means type not found (PROJECTLEADER 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->statut = 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 = GETPOST('public', 'alpha');
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
547 setEventMessages($langs->trans("ProjectCreatedInDolibarr", $newobject->ref), "", 'mesgs');
548
549 header('Location: '.$_SERVER['PHP_SELF'].'?id='.$result.'&action=edit&comefromclone=1');
550 exit;
551 }
552 }
553
554 // Quick edit for extrafields
555 if ($action == 'update_extras' && $permissiontoadd) {
556 $object->oldcopy = dol_clone($object, 2);
557
558 // Fill array 'array_options' with data from update form
559 $ret = $extrafields->setOptionalsFromPost(null, $object, GETPOST('attribute', 'restricthtml'));
560 if ($ret < 0) {
561 $error++;
562 }
563
564 if (!$error) {
565 // Actions on extra fields
566 $result = $object->insertExtraFields('PROJECT_MODIFY');
567 if ($result < 0) {
568 setEventMessages($object->error, $object->errors, 'errors');
569 $error++;
570 }
571 }
572
573 if ($error) {
574 $action = 'edit_extras';
575 }
576 }
577
578 // Actions to send emails
579 $triggersendname = 'PROJECT_SENTBYMAIL';
580 $paramname = 'id';
581 $autocopy = 'MAIN_MAIL_AUTOCOPY_PROJECT_TO'; // used to know the automatic BCC to add
582 $trackid = 'proj'.$object->id;
583 include DOL_DOCUMENT_ROOT.'/core/actions_sendmails.inc.php';
584}
585
586
587/*
588 * View
589 */
590
591$form = new Form($db);
592$formfile = new FormFile($db);
593$formproject = new FormProjets($db);
594$userstatic = new User($db);
595
596$title = $langs->trans("Project").' - '.$object->ref.(!empty($object->thirdparty->name) ? ' - '.$object->thirdparty->name : '').(!empty($object->title) ? ' - '.$object->title : '');
597if (getDolGlobalString('MAIN_HTML_TITLE') && preg_match('/projectnameonly/', getDolGlobalString('MAIN_HTML_TITLE'))) {
598 $title = $object->ref.(!empty($object->thirdparty->name) ? ' - '.$object->thirdparty->name : '').(!empty($object->title) ? ' - '.$object->title : '');
599}
600
601$help_url = "EN:Module_Projects|FR:Module_Projets|ES:M&oacute;dulo_Proyectos|DE:Modul_Projekte";
602
603llxHeader("", $title, $help_url);
604
605$titleboth = $langs->trans("LeadsOrProjects");
606$titlenew = $langs->trans("NewLeadOrProject"); // Leads and opportunities by default
607if (!getDolGlobalInt('PROJECT_USE_OPPORTUNITIES')) {
608 $titleboth = $langs->trans("Projects");
609 $titlenew = $langs->trans("NewProject");
610}
611if (getDolGlobalInt('PROJECT_USE_OPPORTUNITIES') == 2) { // 2 = leads only
612 $titleboth = $langs->trans("Leads");
613 $titlenew = $langs->trans("NewLead");
614}
615
616if ($action == 'create' && $user->hasRight('projet', 'creer')) {
617 /*
618 * Create
619 */
620
621 $thirdparty = new Societe($db);
622 if ($socid > 0) {
623 $thirdparty->fetch($socid);
624 }
625
626 print load_fiche_titre($titlenew, '', 'project');
627
628 print '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">';
629 print '<input type="hidden" name="action" value="add">';
630 print '<input type="hidden" name="token" value="'.newToken().'">';
631 print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
632 print '<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.'">';
633 print '<input type="hidden" name="backtopagejsfields" value="'.$backtopagejsfields.'">';
634 print '<input type="hidden" name="dol_openinpopup" value="'.$dol_openinpopup.'">';
635
636 print dol_get_fiche_head();
637
638 print '<table class="border centpercent tableforfieldcreate">';
639
640 $defaultref = '';
641 $modele = !getDolGlobalString('PROJECT_ADDON') ? 'mod_project_simple' : $conf->global->PROJECT_ADDON;
642
643 // Search template files
644 $file = '';
645 $classname = '';
646 $filefound = 0;
647 $dirmodels = array_merge(array('/'), (array) $conf->modules_parts['models']);
648 foreach ($dirmodels as $reldir) {
649 $file = dol_buildpath($reldir."core/modules/project/".$modele.'.php', 0);
650 if (file_exists($file)) {
651 $filefound = 1;
652 $classname = $modele;
653 break;
654 }
655 }
656
657 if ($filefound) {
658 $result = dol_include_once($reldir."core/modules/project/".$modele.'.php');
659 $modProject = new $classname();
660
661 $defaultref = $modProject->getNextValue($thirdparty, $object);
662 }
663
664 if (is_numeric($defaultref) && $defaultref <= 0) {
665 $defaultref = '';
666 }
667
668 // Ref
669 $suggestedref = (GETPOST("ref") ? GETPOST("ref") : $defaultref);
670 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).'">';
671 if ($suggestedref) {
672 print ' '.$form->textwithpicto('', $langs->trans("YouCanCompleteRef", $suggestedref));
673 }
674 print '</td></tr>';
675
676 // Label
677 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>';
678
679 // Parent
680 if (getDolGlobalInt('PROJECT_ENABLE_SUB_PROJECT')) {
681 print '<tr><td>'.$langs->trans("Parent").'</td><td class="maxwidthonsmartphone">';
682 print img_picto('', 'project', 'class="pictofixedwidth"');
683 $formproject->select_projects(-1, '', 'fk_project', 64, 0, 1, 1, 0, 0, 0, '', 0, 0, '', '', '');
684 print '</td></tr>';
685 }
686
687 // Usage (opp, task, bill time, ...)
688 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES') || !getDolGlobalString('PROJECT_HIDE_TASKS') || isModEnabled('eventorganization')) {
689 print '<tr><td class="tdtop">';
690 print $langs->trans("Usage");
691 print '</td>';
692 print '<td>';
693 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
694 print '<input type="checkbox" id="usage_opportunity" name="usage_opportunity"'.(GETPOSTISSET('usage_opportunity') ? (GETPOST('usage_opportunity', 'alpha') ? ' checked="checked"' : '') : ' checked="checked"').'"> ';
695 $htmltext = $langs->trans("ProjectFollowOpportunity");
696 print '<label for="usage_opportunity">'.$form->textwithpicto($langs->trans("ProjectFollowOpportunity"), $htmltext).'</label>';
697 print '<script>';
698 print '$( document ).ready(function() {
699 jQuery("#usage_opportunity").change(function() {
700 if (jQuery("#usage_opportunity").prop("checked")) {
701 console.log("Show opportunities fields");
702 jQuery(".classuseopportunity").show();
703 } else {
704 console.log("Hide opportunities fields "+jQuery("#usage_opportunity").prop("checked"));
705 jQuery(".classuseopportunity").hide();
706 }
707 });
708 ';
709 if (GETPOSTISSET('usage_opportunity') && !GETPOST('usage_opportunity')) {
710 print 'jQuery(".classuseopportunity").hide();';
711 }
712 print '});';
713 print '</script>';
714 print '<br>';
715 }
716 if (!getDolGlobalString('PROJECT_HIDE_TASKS')) {
717 print '<input type="checkbox" id="usage_task" name="usage_task"'.(GETPOSTISSET('usage_task') ? (GETPOST('usage_task', 'alpha') ? ' checked="checked"' : '') : ' checked="checked"').'"> ';
718 $htmltext = $langs->trans("ProjectFollowTasks");
719 print '<label for="usage_task">'.$form->textwithpicto($langs->trans("ProjectFollowTasks"), $htmltext).'</label>';
720 print '<script>';
721 print '$( document ).ready(function() {
722 jQuery("#usage_task").change(function() {
723 if (jQuery("#usage_task").prop("checked")) {
724 console.log("Show task fields");
725 jQuery(".classusetask").show();
726 } else {
727 console.log("Hide tasks fields "+jQuery("#usage_task").prop("checked"));
728 jQuery(".classusetask").hide();
729 }
730 });
731 ';
732 if (GETPOSTISSET('usage_task') && !GETPOST('usage_task')) {
733 print 'jQuery(".classusetask").hide();';
734 }
735 print '});';
736 print '</script>';
737 print '<br>';
738 }
739 if (!getDolGlobalString('PROJECT_HIDE_TASKS') && getDolGlobalString('PROJECT_BILL_TIME_SPENT')) {
740 print '<input type="checkbox" id="usage_bill_time" name="usage_bill_time"'.(GETPOSTISSET('usage_bill_time') ? (GETPOST('usage_bill_time', 'alpha') ? ' checked="checked"' : '') : '').'"> ';
741 $htmltext = $langs->trans("ProjectBillTimeDescription");
742 print '<label for="usage_bill_time">'.$form->textwithpicto($langs->trans("BillTime"), $htmltext).'</label>';
743 print '<script>';
744 print '$( document ).ready(function() {
745 jQuery("#usage_bill_time").change(function() {
746 if (jQuery("#usage_bill_time").prop("checked")) {
747 console.log("Show bill time fields");
748 jQuery(".classusebilltime").show();
749 } else {
750 console.log("Hide bill time fields "+jQuery("#usage_bill_time").prop("checked"));
751 jQuery(".classusebilltime").hide();
752 }
753 });
754 ';
755 if (GETPOSTISSET('usage_bill_time') && !GETPOST('usage_bill_time')) {
756 print 'jQuery(".classusebilltime").hide();';
757 }
758 print '});';
759 print '</script>';
760 print '<br>';
761 }
762 if (isModEnabled('eventorganization')) {
763 print '<input type="checkbox" id="usage_organize_event" name="usage_organize_event"'.(GETPOSTISSET('usage_organize_event') ? (GETPOST('usage_organize_event', 'alpha') ? ' checked="checked"' : '') : '').'"> ';
764 $htmltext = $langs->trans("EventOrganizationDescriptionLong");
765 print '<label for="usage_organize_event">'.$form->textwithpicto($langs->trans("ManageOrganizeEvent"), $htmltext).'</label>';
766 print '<script>';
767 print '$( document ).ready(function() {
768 jQuery("#usage_organize_event").change(function() {
769 if (jQuery("#usage_organize_event").prop("checked")) {
770 console.log("Show organize event fields");
771 jQuery(".classuseorganizeevent").show();
772 } else {
773 console.log("Hide organize event fields "+jQuery("#usage_organize_event").prop("checked"));
774 jQuery(".classuseorganizeevent").hide();
775 }
776 });
777 ';
778 if (!GETPOST('usage_organize_event')) {
779 print 'jQuery(".classuseorganizeevent").hide();';
780 }
781 print '});';
782 print '</script>';
783 }
784 print '</td>';
785 print '</tr>';
786 }
787
788 // Thirdparty
789 if (isModEnabled('societe')) {
790 print '<tr><td>';
791 print(!getDolGlobalString('PROJECT_THIRDPARTY_REQUIRED') ? '' : '<span class="fieldrequired">');
792 print $langs->trans("ThirdParty");
793 print(!getDolGlobalString('PROJECT_THIRDPARTY_REQUIRED') ? '' : '</span>');
794 print '</td><td class="maxwidthonsmartphone">';
795 $filter = '';
796 if (getDolGlobalString('PROJECT_FILTER_FOR_THIRDPARTY_LIST')) {
797 $filter = getDolGlobalString('PROJECT_FILTER_FOR_THIRDPARTY_LIST');
798 }
799 $text = img_picto('', 'company', 'class="pictofixedwidth"').$form->select_company(GETPOSTINT('socid'), 'socid', $filter, 'SelectThirdParty', 1, 0, array(), 0, 'minwidth300 widthcentpercentminusxx maxwidth500');
800 if (!getDolGlobalString('PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS') && empty($conf->dol_use_jmobile)) {
801 $texthelp = $langs->trans("IfNeedToUseOtherObjectKeepEmpty");
802 print $form->textwithtooltip($text.' '.img_help(), $texthelp, 1);
803 } else {
804 print $text;
805 }
806 if (!GETPOSTISSET('backtopage')) {
807 $url = '/societe/card.php?action=create&client=3&fournisseur=0&backtopage='.urlencode($_SERVER["PHP_SELF"].'?action=create');
808 $newbutton = '<span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans("AddThirdParty").'"></span>';
809 // TODO @LDR Implement this
810 if (getDolGlobalInt('MAIN_FEATURES_LEVEL') >= 2) {
811 $tmpbacktopagejsfields = 'addthirdparty:socid,search_socid';
812 print dolButtonToOpenUrlInDialogPopup('addthirdparty', $langs->transnoentitiesnoconv('AddThirdParty'), $newbutton, $url, '', '', '', $tmpbacktopagejsfields);
813 } else {
814 print ' <a href="'.DOL_URL_ROOT.$url.'">'.$newbutton.'</a>';
815 }
816 }
817 print '</td></tr>';
818 }
819
820 // Status
821 if ($status != '') {
822 print '<tr><td>'.$langs->trans("Status").'</td><td>';
823 print '<input type="hidden" name="status" value="'.$status.'">';
824 print $object->LibStatut($status, 4);
825 print '</td></tr>';
826 }
827
828 // Visibility
829 print '<tr><td>'.$langs->trans("Visibility").'</td><td class="maxwidthonsmartphone">';
830 $array = array();
831 if (!getDolGlobalString('PROJECT_DISABLE_PRIVATE_PROJECT')) {
832 $array[0] = $langs->trans("PrivateProject");
833 }
834 if (!getDolGlobalString('PROJECT_DISABLE_PUBLIC_PROJECT')) {
835 $array[1] = $langs->trans("SharedProject");
836 }
837
838 if (count($array) > 0) {
839 print $form->selectarray('public', $array, GETPOST('public'), 0, 0, 0, '', 0, 0, 0, '', '', 1);
840 } else {
841 print '<input type="hidden" name="public" id="public" value="'.GETPOST('public').'">';
842
843 if (GETPOST('public') == 0) {
844 print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"');
845 print $langs->trans("PrivateProject");
846 } else {
847 print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"');
848 print $langs->trans("SharedProject");
849 }
850 }
851 print '</td></tr>';
852
853 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
854 // Opportunity status
855 print '<tr class="classuseopportunity"><td><span class="fieldrequired">'.$langs->trans("OpportunityStatus").'</span></td>';
856 print '<td class="maxwidthonsmartphone">';
857 print $formproject->selectOpportunityStatus('opp_status', GETPOSTISSET('opp_status') ? GETPOST('opp_status') : $object->opp_status, 1, 0, 0, 0, '', 0, 1);
858
859 // Opportunity probability
860 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>';
861 print '<input type="hidden" name="opp_percent_not_set" id="opp_percent_not_set" value="'.dol_escape_htmltag(GETPOSTISSET('opp_percent') ? '0' : '1').'">';
862 print '</td>';
863 print '</tr>';
864
865 // Opportunity amount
866 print '<tr class="classuseopportunity"><td>'.$langs->trans("OpportunityAmount").'</td>';
867 print '<td><input class="width75 right" type="text" name="opp_amount" value="'.dol_escape_htmltag(GETPOSTISSET('opp_amount') ? GETPOST('opp_amount') : '').'">';
868 print ' '.$langs->getCurrencySymbol($conf->currency);
869 print '</td>';
870 print '</tr>';
871 }
872
873 // Budget
874 print '<tr><td>'.$langs->trans("Budget").'</td>';
875 print '<td><input class="width75 right" type="text" name="budget_amount" value="'.dol_escape_htmltag(GETPOSTISSET('budget_amount') ? GETPOST('budget_amount') : '').'">';
876 print ' '.$langs->getCurrencySymbol($conf->currency);
877 print '</td>';
878 print '</tr>';
879
880 // Date project
881 print '<tr><td>'.$langs->trans("Date").(isModEnabled('eventorganization') ? ' <span class="classuseorganizeevent">('.$langs->trans("Project").')</span>' : '').'</td><td>';
882 print $form->selectDate(($date_start ? $date_start : ''), 'projectstart', 0, 0, 0, '', 1, 0);
883 print ' <span class="opacitymedium"> '.$langs->trans("to").' </span> ';
884 print $form->selectDate(($date_end ? $date_end : -1), 'projectend', 0, 0, 0, '', 1, 0);
885 print '</td></tr>';
886
887 if (isModEnabled('eventorganization')) {
888 // Date event
889 print '<tr class="classuseorganizeevent"><td>'.$langs->trans("Date").' ('.$langs->trans("Event").')</td><td>';
890 print $form->selectDate(($date_start_event ? $date_start_event : -1), 'date_start_event', 1, 1, 1, '', 1, 0);
891 print ' <span class="opacitymedium"> '.$langs->trans("to").' </span> ';
892 print $form->selectDate(($date_end_event ? $date_end_event : -1), 'date_end_event', 1, 1, 1, '', 1, 0);
893 print '</td></tr>';
894
895 // Location
896 print '<tr class="classuseorganizeevent"><td>'.$langs->trans("Location").'</td>';
897 print '<td><input class="minwidth300 maxwidth500" type="text" name="location" value="'.dol_escape_htmltag($location).'"></td>';
898 print '</tr>';
899 }
900
901 // Description
902 print '<tr><td class="tdtop">'.$langs->trans("Description").'</td>';
903 print '<td>';
904 $doleditor = new DolEditor('description', GETPOST("description", 'restricthtml'), '', 90, 'dolibarr_notes', '', false, true, isModEnabled('fckeditor') && getDolGlobalString('FCKEDITOR_ENABLE_SOCIETE'), ROWS_3, '90%');
905 $doleditor->Create();
906 print '</td></tr>';
907
908 if (isModEnabled('category')) {
909 // Categories
910 print '<tr><td>'.$langs->trans("Categories").'</td><td colspan="3">';
911 $cate_arbo = $form->select_all_categories(Categorie::TYPE_PROJECT, '', 'parent', 64, 0, 3);
912 $arrayselected = GETPOST('categories', 'array');
913 print img_picto('', 'category', 'class="pictofixedwidth"').$form->multiselectarray('categories', $cate_arbo, $arrayselected, '', 0, 'quatrevingtpercent widthcentpercentminusx', 0, 0);
914 print "</td></tr>";
915 }
916
917 // Other options
918 $parameters = array();
919 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
920 print $hookmanager->resPrint;
921 if (empty($reshook)) {
922 print $object->showOptionals($extrafields, 'create');
923 }
924
925 print '</table>';
926
927 print dol_get_fiche_end();
928
929 print $form->buttonsSaveCancel('CreateDraft');
930
931 print '</form>';
932
933 // Change probability from status or role of project
934 // Set also dependencies between use task and bill time
935 print '<script type="text/javascript">
936 jQuery(document).ready(function() {
937 function change_percent()
938 {
939 var element = jQuery("#opp_status option:selected");
940 var defaultpercent = element.attr("defaultpercent");
941 /*if (jQuery("#opp_percent_not_set").val() == "") */
942 jQuery("#opp_percent").val(defaultpercent);
943 }
944
945 /*init_myfunc();*/
946 jQuery("#opp_status").change(function() {
947 change_percent();
948 });
949
950 jQuery("#usage_task").change(function() {
951 console.log("We click on usage task "+jQuery("#usage_task").is(":checked"));
952 if (! jQuery("#usage_task").is(":checked")) {
953 jQuery("#usage_bill_time").prop("checked", false);
954 }
955 });
956
957 jQuery("#usage_bill_time").change(function() {
958 console.log("We click on usage to bill time");
959 if (jQuery("#usage_bill_time").is(":checked")) {
960 jQuery("#usage_task").prop("checked", true);
961 }
962 });
963 });
964 </script>';
965} elseif ($object->id > 0) {
966 /*
967 * Show or edit
968 */
969
970 $res = $object->fetch_optionals();
971
972 // To verify role of users
973 $userAccess = $object->restrictedProjectArea($user, 'read');
974 $userWrite = $object->restrictedProjectArea($user, 'write');
975 $userDelete = $object->restrictedProjectArea($user, 'delete');
976 //print "userAccess=".$userAccess." userWrite=".$userWrite." userDelete=".$userDelete;
977
978
979 // Confirmation validation
980 if ($action == 'validate') {
981 print $form->formconfirm($_SERVER["PHP_SELF"].'?id='.$object->id, $langs->trans('ValidateProject'), $langs->trans('ConfirmValidateProject'), 'confirm_validate', '', 0, 1);
982 }
983 // Confirmation close
984 if ($action == 'close') {
985 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("CloseAProject"), $langs->trans("ConfirmCloseAProject"), "confirm_close", '', '', 1);
986 }
987 // Confirmation reopen
988 if ($action == 'reopen') {
989 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("ReOpenAProject"), $langs->trans("ConfirmReOpenAProject"), "confirm_reopen", '', '', 1);
990 }
991 // Confirmation delete
992 if ($action == 'delete') {
993 $text = $langs->trans("ConfirmDeleteAProject");
994 $task = new Task($db);
995 $taskarray = $task->getTasksArray(0, 0, $object->id, 0, 0);
996 $nboftask = count($taskarray);
997 if ($nboftask) {
998 $text .= '<br>'.img_warning().' '.$langs->trans("ThisWillAlsoRemoveTasks", $nboftask);
999 }
1000 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("DeleteAProject"), $text, "confirm_delete", '', '', 1);
1001 }
1002
1003 // Clone confirmation
1004 if ($action == 'clone') {
1005 $formquestion = array(
1006 'text' => $langs->trans("ConfirmClone"),
1007 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')),
1008 1 => array('type' => 'checkbox', 'name' => 'clone_contacts', 'label' => $langs->trans("CloneContacts"), 'value' => true),
1009 2 => array('type' => 'checkbox', 'name' => 'clone_tasks', 'label' => $langs->trans("CloneTasks"), 'value' => true),
1010 3 => array('type' => 'checkbox', 'name' => 'move_date', 'label' => $langs->trans("CloneMoveDate"), 'value' => true),
1011 4 => array('type' => 'checkbox', 'name' => 'clone_notes', 'label' => $langs->trans("CloneNotes"), 'value' => true),
1012 5 => array('type' => 'checkbox', 'name' => 'clone_project_files', 'label' => $langs->trans("CloneProjectFiles"), 'value' => false),
1013 6 => array('type' => 'checkbox', 'name' => 'clone_task_files', 'label' => $langs->trans("CloneTaskFiles"), 'value' => false)
1014 );
1015
1016 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".$object->id, $langs->trans("ToClone"), $langs->trans("ConfirmCloneProject"), "confirm_clone", $formquestion, '', 1, 400, 590);
1017 }
1018
1019
1020 print '<form action="'.$_SERVER["PHP_SELF"].'" method="POST">';
1021 print '<input type="hidden" name="token" value="'.newToken().'">';
1022 print '<input type="hidden" name="action" value="update">';
1023 print '<input type="hidden" name="id" value="'.$object->id.'">';
1024 print '<input type="hidden" name="comefromclone" value="'.$comefromclone.'">';
1025
1027
1028 if ($action == 'edit' && $userWrite > 0) {
1029 print dol_get_fiche_head($head, 'project', $langs->trans("Project"), 0, ($object->public ? 'projectpub' : 'project'));
1030
1031 print '<table class="border centpercent">';
1032
1033 // Ref
1034 $suggestedref = $object->ref;
1035 print '<tr><td class="titlefield fieldrequired">'.$langs->trans("Ref").'</td>';
1036 print '<td><input class="width200" name="ref" value="'.$suggestedref.'">';
1037 print ' '.$form->textwithpicto('', $langs->trans("YouCanCompleteRef", $suggestedref));
1038 print '</td></tr>';
1039
1040 // Label
1041 print '<tr><td class="fieldrequired">'.$langs->trans("Label").'</td>';
1042 print '<td><input class="quatrevingtpercent" name="title" value="'.dol_escape_htmltag($object->title).'"></td></tr>';
1043
1044 // Status
1045 print '<tr><td class="fieldrequired">'.$langs->trans("Status").'</td><td>';
1046 print '<select class="flat" name="status" id="status">';
1047 $statuses = $object->labelStatusShort;
1048 if (getDolGlobalString('MAIN_DISABLEDRAFTSTATUS') || getDolGlobalString('MAIN_DISABLEDRAFTSTATUS_PROJECT')) {
1049 unset($statuses[$object::STATUS_DRAFT]);
1050 }
1051 foreach ($statuses as $key => $val) {
1052 print '<option value="'.$key.'"'.((GETPOSTISSET('status') ? GETPOST('status') : $object->statut) == $key ? ' selected="selected"' : '').'>'.$langs->trans($val).'</option>';
1053 }
1054 print '</select>';
1055 print ajax_combobox('status');
1056 print '</td></tr>';
1057
1058 // Parent
1059 if (getDolGlobalInt('PROJECT_ENABLE_SUB_PROJECT')) {
1060 print '<tr><td>'.$langs->trans("Parent").'</td><td class="maxwidthonsmartphone">';
1061 print img_picto('', 'project', 'class="pictofixedwidth"');
1062 $formproject->select_projects(-1, $object->fk_project, 'fk_project', 64, 0, 1, 1, 0, 0, 0, '', 0, 0, '', '', '');
1063 print '</td></tr>';
1064 }
1065
1066 // Usage
1067 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES') || !getDolGlobalString('PROJECT_HIDE_TASKS') || isModEnabled('eventorganization')) {
1068 print '<tr><td class="tdtop">';
1069 print $langs->trans("Usage");
1070 print '</td>';
1071 print '<td>';
1072 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
1073 print '<input type="checkbox" id="usage_opportunity" name="usage_opportunity"'.(GETPOSTISSET('usage_opportunity') ? (GETPOST('usage_opportunity', 'alpha') != '' ? ' checked="checked"' : '') : ($object->usage_opportunity ? ' checked="checked"' : '')).'> ';
1074 $htmltext = $langs->trans("ProjectFollowOpportunity");
1075 print '<label for="usage_opportunity">'.$form->textwithpicto($langs->trans("ProjectFollowOpportunity"), $htmltext).'</label>';
1076 print '<script>';
1077 print '$( document ).ready(function() {
1078 jQuery("#usage_opportunity").change(function() {
1079 set_usage_opportunity();
1080 });
1081
1082 set_usage_opportunity();
1083
1084 function set_usage_opportunity() {
1085 console.log("set_usage_opportunity");
1086 if (jQuery("#usage_opportunity").prop("checked")) {
1087 console.log("Show opportunities fields");
1088 jQuery(".classuseopportunity").show();
1089 } else {
1090 console.log("Hide opportunities fields "+jQuery("#usage_opportunity").prop("checked"));
1091 jQuery(".classuseopportunity").hide();
1092 }
1093 }
1094 });';
1095 print '</script>';
1096 print '<br>';
1097 }
1098 if (!getDolGlobalString('PROJECT_HIDE_TASKS')) {
1099 print '<input type="checkbox" id="usage_task" name="usage_task"' . (GETPOSTISSET('usage_task') ? (GETPOST('usage_task', 'alpha') != '' ? ' checked="checked"' : '') : ($object->usage_task ? ' checked="checked"' : '')) . '> ';
1100 $htmltext = $langs->trans("ProjectFollowTasks");
1101 print '<label for="usage_task">'.$form->textwithpicto($langs->trans("ProjectFollowTasks"), $htmltext).'</label>';
1102 print '<script>';
1103 print '$( document ).ready(function() {
1104 jQuery("#usage_task").change(function() {
1105 set_usage_task();
1106 });
1107
1108 set_usage_task();
1109
1110 function set_usage_task() {
1111 console.log("set_usage_task");
1112 if (jQuery("#usage_task").prop("checked")) {
1113 console.log("Show task fields");
1114 jQuery(".classusetask").show();
1115 } else {
1116 console.log("Hide task fields "+jQuery("#usage_task").prop("checked"));
1117 jQuery(".classusetask").hide();
1118 }
1119 }
1120 });';
1121 print '</script>';
1122 print '<br>';
1123 }
1124 if (!getDolGlobalString('PROJECT_HIDE_TASKS') && getDolGlobalString('PROJECT_BILL_TIME_SPENT')) {
1125 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"' : '')) . '> ';
1126 $htmltext = $langs->trans("ProjectBillTimeDescription");
1127 print '<label for="usage_bill_time">'.$form->textwithpicto($langs->trans("BillTime"), $htmltext).'</label>';
1128 print '<script>';
1129 print '$( document ).ready(function() {
1130 jQuery("#usage_bill_time").change(function() {
1131 set_usage_bill_time();
1132 });
1133
1134 set_usage_bill_time();
1135
1136 function set_usage_bill_time() {
1137 console.log("set_usage_bill_time");
1138 if (jQuery("#usage_bill_time").prop("checked")) {
1139 console.log("Show bill time fields");
1140 jQuery(".classusebilltime").show();
1141 } else {
1142 console.log("Hide bill time fields "+jQuery("#usage_bill_time").prop("checked"));
1143 jQuery(".classusebilltime").hide();
1144 }
1145 }
1146 });';
1147 print '</script>';
1148 print '<br>';
1149 }
1150 if (isModEnabled('eventorganization')) {
1151 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"' : '')) . '> ';
1152 $htmltext = $langs->trans("EventOrganizationDescriptionLong");
1153 print '<label for="usage_organize_event">'.$form->textwithpicto($langs->trans("ManageOrganizeEvent"), $htmltext).'</label>';
1154 print '<script>';
1155 print '$( document ).ready(function() {
1156 jQuery("#usage_organize_event").change(function() {
1157 set_usage_event();
1158 });
1159
1160 set_usage_event();
1161
1162 function set_usage_event() {
1163 console.log("set_usage_event");
1164 if (jQuery("#usage_organize_event").prop("checked")) {
1165 console.log("Show organize event fields");
1166 jQuery(".classuseorganizeevent").show();
1167 } else {
1168 console.log("Hide organize event fields "+jQuery("#usage_organize_event").prop("checked"));
1169 jQuery(".classuseorganizeevent").hide();
1170 }
1171 }
1172 });';
1173 print '</script>';
1174 }
1175 print '</td></tr>';
1176 }
1177 print '</td></tr>';
1178
1179 // Thirdparty
1180 if (isModEnabled('societe')) {
1181 print '<tr><td>';
1182 print(!getDolGlobalString('PROJECT_THIRDPARTY_REQUIRED') ? '' : '<span class="fieldrequired">');
1183 print $langs->trans("ThirdParty");
1184 print(!getDolGlobalString('PROJECT_THIRDPARTY_REQUIRED') ? '' : '</span>');
1185 print '</td><td>';
1186 $filter = '';
1187 if (getDolGlobalString('PROJECT_FILTER_FOR_THIRDPARTY_LIST')) {
1188 $filter = getDolGlobalString('PROJECT_FILTER_FOR_THIRDPARTY_LIST');
1189 }
1190 $text = img_picto('', 'company', 'class="pictofixedwidth"');
1191 $text .= $form->select_company(!empty($object->thirdparty->id) ? $object->thirdparty->id : "", 'socid', $filter, 'None', 1, 0, array(), 0, 'minwidth300');
1192 if (!getDolGlobalString('PROJECT_CAN_ALWAYS_LINK_TO_ALL_SUPPLIERS') && empty($conf->dol_use_jmobile)) {
1193 $texthelp = $langs->trans("IfNeedToUseOtherObjectKeepEmpty");
1194 print $form->textwithtooltip($text.' '.img_help(), $texthelp, 1, 0, '', '', 2);
1195 } else {
1196 print $text;
1197 }
1198 print '</td></tr>';
1199 }
1200
1201 // Visibility
1202 print '<tr><td>'.$langs->trans("Visibility").'</td><td>';
1203 $array = array();
1204 if (!getDolGlobalString('PROJECT_DISABLE_PRIVATE_PROJECT')) {
1205 $array[0] = $langs->trans("PrivateProject");
1206 }
1207 if (!getDolGlobalString('PROJECT_DISABLE_PUBLIC_PROJECT')) {
1208 $array[1] = $langs->trans("SharedProject");
1209 }
1210
1211 if (count($array) > 0) {
1212 print $form->selectarray('public', $array, $object->public, 0, 0, 0, '', 0, 0, 0, '', '', 1);
1213 } else {
1214 print '<input type="hidden" id="public" name="public" value="'.$object->public.'">';
1215
1216 if ($object->public == 0) {
1217 print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"');
1218 print $langs->trans("PrivateProject");
1219 } else {
1220 print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"');
1221 print $langs->trans("SharedProject");
1222 }
1223 }
1224 print '</td></tr>';
1225
1226 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
1227 $classfortr = ($object->usage_opportunity ? '' : ' hideobject');
1228 // Opportunity status
1229 print '<tr class="classuseopportunity'.$classfortr.'"><td>'.$langs->trans("OpportunityStatus").'</td>';
1230 print '<td>';
1231 print '<div>';
1232 print $formproject->selectOpportunityStatus('opp_status', $object->opp_status, 1, 0, 0, 0, 'minwidth150 inline-block valignmiddle', 1, 1);
1233
1234 // Opportunity probability
1235 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) : '')).'"> %';
1236 print '<span id="oldopppercent" class="opacitymedium"></span>';
1237 print '</div>';
1238
1239 print '<div id="divtocloseproject" class="inline-block valign clearboth paddingtop" style="display: none;">';
1240 print '<input type="checkbox" id="inputcloseproject" name="closeproject" />';
1241 print '<label for="inputcloseproject">';
1242 print $form->textwithpicto($langs->trans("AlsoCloseAProject"), $langs->trans("AlsoCloseAProjectTooltip")).'</label>';
1243 print ' </div>';
1244
1245 print '</td>';
1246 print '</tr>';
1247
1248 // Opportunity amount
1249 print '<tr class="classuseopportunity'.$classfortr.'"><td>'.$langs->trans("OpportunityAmount").'</td>';
1250 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) : '')).'">';
1251 print $langs->getCurrencySymbol($conf->currency);
1252 print '</td>';
1253 print '</tr>';
1254 }
1255
1256 // Budget
1257 print '<tr><td>'.$langs->trans("Budget").'</td>';
1258 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) : '')).'">';
1259 print $langs->getCurrencySymbol($conf->currency);
1260 print '</td>';
1261 print '</tr>';
1262
1263 // Date project
1264 print '<tr><td>'.$langs->trans("Date").(isModEnabled('eventorganization') ? ' <span class="classuseorganizeevent">('.$langs->trans("Project").')</span>' : '').'</td><td>';
1265 print $form->selectDate($object->date_start ? $object->date_start : -1, 'projectstart', 0, 0, 0, '', 1, 0);
1266 print ' <span class="opacitymedium"> '.$langs->trans("to").' </span> ';
1267 print $form->selectDate($object->date_end ? $object->date_end : -1, 'projectend', 0, 0, 0, '', 1, 0);
1268 $object->getLinesArray(null, 0);
1269 if (!empty($object->usage_task) && !empty($object->lines)) {
1270 print ' <span id="divreportdate" class="hidden">&nbsp; &nbsp; <input type="checkbox" class="valignmiddle" id="reportdate" name="reportdate" value="yes" ';
1271 if ($comefromclone) {
1272 print 'checked ';
1273 }
1274 print '/><label for="reportdate" class="valignmiddle opacitymedium">'.$langs->trans("ProjectReportDate").'</label></span>';
1275 }
1276 print '</td></tr>';
1277
1278 if (isModEnabled('eventorganization')) {
1279 // Date event
1280 print '<tr class="classuseorganizeevent"><td>'.$langs->trans("Date").' ('.$langs->trans("Event").')</td><td>';
1281 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);
1282 print ' <span class="opacitymedium"> '.$langs->trans("to").' </span> ';
1283 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);
1284 print '</td></tr>';
1285
1286 // Location
1287 print '<tr class="classuseorganizeevent"><td>'.$langs->trans("Location").'</td>';
1288 print '<td><input class="minwidth300 maxwidth500" type="text" name="location" value="'.dol_escape_htmltag(GETPOSTISSET('location') ? GETPOST('location') : $object->location).'"></td>';
1289 print '</tr>';
1290 }
1291
1292 // Description
1293 print '<tr><td class="tdtop">'.$langs->trans("Description").'</td>';
1294 print '<td>';
1295 $doleditor = new DolEditor('description', $object->description, '', 90, 'dolibarr_notes', '', false, true, isModEnabled('fckeditor') && getDolGlobalInt('FCKEDITOR_ENABLE_SOCIETE'), ROWS_3, '90%');
1296 $doleditor->Create();
1297 print '</td></tr>';
1298
1299 // Tags-Categories
1300 if (isModEnabled('category')) {
1301 $arrayselected = array();
1302 print '<tr><td>'.$langs->trans("Categories").'</td><td>';
1303 $cate_arbo = $form->select_all_categories(Categorie::TYPE_PROJECT, '', 'parent', 64, 0, 3);
1304 $c = new Categorie($db);
1305 $cats = $c->containing($object->id, Categorie::TYPE_PROJECT);
1306 foreach ($cats as $cat) {
1307 $arrayselected[] = $cat->id;
1308 }
1309 print img_picto('', 'category', 'class="pictofixedwidth"').$form->multiselectarray('categories', $cate_arbo, $arrayselected, 0, 0, 'quatrevingtpercent widthcentpercentminusx', 0, '0');
1310 print "</td></tr>";
1311 }
1312
1313 // Other options
1314 $parameters = array();
1315 $reshook = $hookmanager->executeHooks('formObjectOptions', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1316 print $hookmanager->resPrint;
1317 if (empty($reshook)) {
1318 print $object->showOptionals($extrafields, 'edit');
1319 }
1320
1321 print '</table>';
1322 } else {
1323 print dol_get_fiche_head($head, 'project', $langs->trans("Project"), -1, ($object->public ? 'projectpub' : 'project'));
1324
1325 // Project card
1326
1327 if (!empty($_SESSION['pageforbacktolist']) && !empty($_SESSION['pageforbacktolist']['project'])) {
1328 $tmpurl = $_SESSION['pageforbacktolist']['project'];
1329 $tmpurl = preg_replace('/__SOCID__/', (string) $object->socid, $tmpurl);
1330 $linkback = '<a href="'.$tmpurl.(preg_match('/\?/', $tmpurl) ? '&' : '?'). 'restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
1331 } else {
1332 $linkback = '<a href="'.DOL_URL_ROOT.'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
1333 }
1334
1335 $morehtmlref = '<div class="refidno">';
1336 // Title
1337 $morehtmlref .= dol_escape_htmltag($object->title);
1338 $morehtmlref .= '<br>';
1339 // Thirdparty
1340 if (!empty($object->thirdparty->id) && $object->thirdparty->id > 0) {
1341 $morehtmlref .= $object->thirdparty->getNomUrl(1, 'project');
1342 }
1343 // Parent
1344 if (getDolGlobalInt('PROJECT_ENABLE_SUB_PROJECT')) {
1345 if (!empty($object->fk_project) && $object->fk_project) {
1346 $parent = new Project($db);
1347 $parent->fetch($object->fk_project);
1348 $morehtmlref .= $langs->trans("Child of").' '.$parent->getNomUrl(1, 'project').' '.$parent->title;
1349 }
1350 }
1351 $morehtmlref .= '</div>';
1352
1353 // Define a complementary filter for search of next/prev ref.
1354 if (!$user->hasRight('projet', 'all', 'lire')) {
1355 $objectsListId = $object->getProjectsAuthorizedForUser($user, 0, 0);
1356 $object->next_prev_filter = "rowid IN (".$db->sanitize(count($objectsListId) ? implode(',', array_keys($objectsListId)) : '0').")";
1357 }
1358
1359 dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
1360
1361 print '<div class="fichecenter">';
1362 print '<div class="fichehalfleft">';
1363 print '<div class="underbanner clearboth"></div>';
1364
1365 print '<table class="border tableforfield centpercent">';
1366
1367 // Usage
1368 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES') || !getDolGlobalString('PROJECT_HIDE_TASKS') || isModEnabled('eventorganization')) {
1369 print '<tr><td class="tdtop">';
1370 print $langs->trans("Usage");
1371 print '</td>';
1372 print '<td>';
1373 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
1374 print '<input type="checkbox" disabled name="usage_opportunity"'.(GETPOSTISSET('usage_opportunity') ? (GETPOST('usage_opportunity', 'alpha') != '' ? ' checked="checked"' : '') : ($object->usage_opportunity ? ' checked="checked"' : '')).'> ';
1375 $htmltext = $langs->trans("ProjectFollowOpportunity");
1376 print $form->textwithpicto($langs->trans("ProjectFollowOpportunity"), $htmltext);
1377 print '<br>';
1378 }
1379 if (!getDolGlobalString('PROJECT_HIDE_TASKS')) {
1380 print '<input type="checkbox" disabled name="usage_task"'.(GETPOSTISSET('usage_task') ? (GETPOST('usage_task', 'alpha') != '' ? ' checked="checked"' : '') : ($object->usage_task ? ' checked="checked"' : '')).'> ';
1381 $htmltext = $langs->trans("ProjectFollowTasks");
1382 print $form->textwithpicto($langs->trans("ProjectFollowTasks"), $htmltext);
1383 print '<br>';
1384 }
1385 if (!getDolGlobalString('PROJECT_HIDE_TASKS') && getDolGlobalString('PROJECT_BILL_TIME_SPENT')) {
1386 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"' : '')).'> ';
1387 $htmltext = $langs->trans("ProjectBillTimeDescription");
1388 print $form->textwithpicto($langs->trans("BillTime"), $htmltext);
1389 print '<br>';
1390 }
1391
1392 if (isModEnabled('eventorganization')) {
1393 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"' : '')).'> ';
1394 $htmltext = $langs->trans("EventOrganizationDescriptionLong");
1395 print $form->textwithpicto($langs->trans("ManageOrganizeEvent"), $htmltext);
1396 }
1397 print '</td></tr>';
1398 }
1399
1400 // Visibility
1401 print '<tr><td class="titlefield">'.$langs->trans("Visibility").'</td><td>';
1402 if ($object->public) {
1403 print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"');
1404 print $langs->trans('SharedProject');
1405 } else {
1406 print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"');
1407 print $langs->trans('PrivateProject');
1408 }
1409 print '</td></tr>';
1410
1411 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES') && !empty($object->usage_opportunity)) {
1412 // Opportunity status
1413 print '<tr><td>'.$langs->trans("OpportunityStatus");
1414 if ($action != 'edit_opp_status' && $user->hasRight('projet', 'creer')) {
1415 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>';
1416 }
1417 print '</td><td>';
1418 $html_name_status = ($action == 'edit_opp_status') ? 'opp_status' : 'none';
1419 $html_name_percent = ($action == 'edit_opp_status') ? 'opp_percent' : 'none';
1420 $percent_value = (GETPOSTISSET('opp_percent') ? GETPOST('opp_percent') : (strcmp($object->opp_percent, '') ? vatrate($object->opp_percent) : ''));
1421 $formproject->formOpportunityStatus($_SERVER['PHP_SELF'].'?socid='.$object->id, $object->opp_status, $percent_value, $html_name_status, $html_name_percent);
1422 print '</td></tr>';
1423
1424 // Opportunity Amount
1425 print '<tr><td>'.$langs->trans("OpportunityAmount").'</td><td>';
1426 if (strcmp($object->opp_amount, '')) {
1427 print '<span class="amount">'.price($object->opp_amount, 0, $langs, 1, 0, -1, $conf->currency).'</span>';
1428 if (strcmp($object->opp_percent, '')) {
1429 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>';
1430 }
1431 }
1432 print '</td></tr>';
1433 }
1434
1435 // Budget
1436 print '<tr><td>'.$langs->trans("Budget").'</td><td>';
1437 if (!is_null($object->budget_amount) && strcmp($object->budget_amount, '')) {
1438 print '<span class="amount">'.price($object->budget_amount, 0, $langs, 1, 0, 0, $conf->currency).'</span>';
1439 }
1440 print '</td></tr>';
1441
1442 // Date start - end project
1443 print '<tr><td>'.$langs->trans("Dates").'</td><td>';
1444 $start = dol_print_date($object->date_start, 'day');
1445 print($start ? $start : '?');
1446 $end = dol_print_date($object->date_end, 'day');
1447 print ' <span class="opacitymedium">-</span> ';
1448 print($end ? $end : '?');
1449 if ($object->hasDelay()) {
1450 print img_warning("Late");
1451 }
1452 print '</td></tr>';
1453
1454 // Other attributes
1455 $cols = 2;
1456 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
1457
1458 print '</table>';
1459
1460 print '</div>';
1461 print '<div class="fichehalfright">';
1462 print '<div class="underbanner clearboth"></div>';
1463
1464 print '<table class="border tableforfield centpercent">';
1465
1466 // Description
1467 print '<td class="titlefield tdtop">'.$langs->trans("Description").'</td><td>';
1468 print '<div class="longmessagecut">';
1469 print dolPrintHTML($object->description);
1470 print '</div>';
1471 print '</td></tr>';
1472
1473 // Categories
1474 if (isModEnabled('category')) {
1475 print '<tr><td class="valignmiddle">'.$langs->trans("Categories").'</td><td>';
1476 print $form->showCategories($object->id, Categorie::TYPE_PROJECT, 1);
1477 print "</td></tr>";
1478 }
1479
1480 print '</table>';
1481
1482 print '</div>';
1483 print '</div>';
1484
1485 print '<div class="clearboth"></div>';
1486 }
1487
1488 print dol_get_fiche_end();
1489
1490 if ($action == 'edit' && $userWrite > 0) {
1491 print $form->buttonsSaveCancel();
1492 }
1493
1494 print '</form>';
1495
1496 // Set also dependencies between use task and bill time
1497 print '<script type="text/javascript">
1498 jQuery(document).ready(function() {
1499 jQuery("#usage_task").change(function() {
1500 console.log("We click on usage task "+jQuery("#usage_task").is(":checked"));
1501 if (! jQuery("#usage_task").is(":checked")) {
1502 jQuery("#usage_bill_time").prop("checked", false);
1503 }
1504 });
1505
1506 jQuery("#usage_bill_time").change(function() {
1507 console.log("We click on usage to bill time");
1508 if (jQuery("#usage_bill_time").is(":checked")) {
1509 jQuery("#usage_task").prop("checked", true);
1510 }
1511 });
1512
1513 jQuery("#projectstart").change(function() {
1514 console.log("We modify the start date");
1515 jQuery("#divreportdate").show();
1516 });
1517 });
1518 </script>';
1519
1520 // Change probability from status
1521 if (!empty($conf->use_javascript_ajax) && getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
1522 // Default value to close or not when we set opp to 'WON'.
1523 $defaultcheckedwhenoppclose = 1;
1524 if (!getDolGlobalString('PROJECT_HIDE_TASKS')) {
1525 $defaultcheckedwhenoppclose = 0;
1526 }
1527
1528 print '<!-- Javascript to manage opportunity status change -->';
1529 print '<script type="text/javascript">
1530 jQuery(document).ready(function() {
1531 function change_percent()
1532 {
1533 var element = jQuery("#opp_status option:selected");
1534 var defaultpercent = element.attr("defaultpercent");
1535 var defaultcloseproject = '.((int) $defaultcheckedwhenoppclose).';
1536 var elemcode = element.attr("elemcode");
1537 var oldpercent = \''.dol_escape_js($object->opp_percent).'\';
1538
1539 console.log("We select "+elemcode);
1540
1541 /* Define if checkbox to close is checked or not */
1542 var closeproject = 0;
1543 if (elemcode == \'LOST\') closeproject = 1;
1544 if (elemcode == \'WON\') closeproject = defaultcloseproject;
1545 if (closeproject) jQuery("#inputcloseproject").prop("checked", true);
1546 else jQuery("#inputcloseproject").prop("checked", false);
1547
1548 /* Make the close project checkbox visible or not */
1549 console.log("closeproject="+closeproject);
1550 if (elemcode == \'WON\' || elemcode == \'LOST\')
1551 {
1552 jQuery("#divtocloseproject").show();
1553 }
1554 else
1555 {
1556 jQuery("#divtocloseproject").hide();
1557 }
1558
1559 /* Change percent with default percent (defaultpercent) if new status (defaultpercent) is higher than current (jQuery("#opp_percent").val()) */
1560 if (oldpercent != \'\' && (parseFloat(defaultpercent) < parseFloat(oldpercent)))
1561 {
1562 console.log("oldpercent="+oldpercent+" defaultpercent="+defaultpercent+" def < old");
1563 if (jQuery("#opp_percent").val() != \'\' && oldpercent != \'\') {
1564 jQuery("#oldopppercent").text(\' - '.dol_escape_js($langs->transnoentities("PreviousValue")).': \'+price2numjs(oldpercent)+\' %\');
1565 }
1566
1567 if (parseFloat(oldpercent) != 100 && elemcode != \'LOST\') { jQuery("#opp_percent").val(oldpercent); }
1568 else { jQuery("#opp_percent").val(price2numjs(defaultpercent)); }
1569 } else {
1570 console.log("oldpercent="+oldpercent+" defaultpercent="+defaultpercent);
1571 if (jQuery("#opp_percent").val() == \'\' || (parseFloat(jQuery("#opp_percent").val()) < parseFloat(defaultpercent))) {
1572 if (jQuery("#opp_percent").val() != \'\' && oldpercent != \'\') {
1573 jQuery("#oldopppercent").text(\' - '.dol_escape_js($langs->transnoentities("PreviousValue")).': \'+price2numjs(oldpercent)+\' %\');
1574 }
1575 jQuery("#opp_percent").val(price2numjs(defaultpercent));
1576 }
1577 }
1578 }
1579
1580 jQuery("#opp_status").change(function() {
1581 change_percent();
1582 });
1583 });
1584 </script>';
1585 }
1586
1587
1588 /*
1589 * Actions Buttons
1590 */
1591
1592 print '<div class="tabsAction">';
1593 $parameters = array();
1594 $reshook = $hookmanager->executeHooks('addMoreActionsButtons', $parameters, $object, $action); // Note that $action and $object may have been
1595 // modified by hook
1596 if (empty($reshook)) {
1597 if ($action != "edit" && $action != 'presend') {
1598 // Create event
1599 /*if (isModEnabled('agenda') && !empty($conf->global->MAIN_ADD_EVENT_ON_ELEMENT_CARD)) // Add hidden condition because this is not a
1600 // "workflow" action so should appears somewhere else on
1601 // page.
1602 {
1603 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>';
1604 }*/
1605
1606 // Send
1607 if (empty($user->socid)) {
1608 if ($object->statut != Project::STATUS_CLOSED) {
1609 print dolGetButtonAction('', $langs->trans('SendMail'), 'default', $_SERVER["PHP_SELF"].'?action=presend&token='.newToken().'&id='.$object->id.'&mode=init#formmailbeforetitle', '');
1610 }
1611 }
1612
1613 // Accounting Report
1614 /*
1615 $accouting_module_activated = isModEnabled('comptabilite') || isModEnabled('accounting');
1616 if ($accouting_module_activated && $object->statut != Project::STATUS_DRAFT) {
1617 $start = dol_getdate((int) $object->date_start);
1618 $end = dol_getdate((int) $object->date_end);
1619 $url = DOL_URL_ROOT.'/compta/accounting-files.php?projectid='.$object->id;
1620 if (!empty($object->date_start)) $url .= '&amp;date_startday='.$start['mday'].'&amp;date_startmonth='.$start['mon'].'&amp;date_startyear='.$start['year'];
1621 if (!empty($object->date_end)) $url .= '&amp;date_stopday='.$end['mday'].'&amp;date_stopmonth='.$end['mon'].'&amp;date_stopyear='.$end['year'];
1622 print dolGetButtonAction('', $langs->trans('ExportAccountingReportButtonLabel'), 'default', $url, '');
1623 }
1624 */
1625
1626 // Back to draft
1627 if (!getDolGlobalString('MAIN_DISABLEDRAFTSTATUS') && !getDolGlobalString('MAIN_DISABLEDRAFTSTATUS_PROJECT')) {
1628 if ($object->statut != Project::STATUS_DRAFT && $user->hasRight('projet', 'creer')) {
1629 if ($userWrite > 0) {
1630 print dolGetButtonAction('', $langs->trans('SetToDraft'), 'default', $_SERVER["PHP_SELF"].'?action=confirm_setdraft&amp;confirm=yes&amp;token='.newToken().'&amp;id='.$object->id, '');
1631 } else {
1632 print dolGetButtonAction($langs->trans('NotOwnerOfProject'), $langs->trans('SetToDraft'), 'default', $_SERVER['PHP_SELF']. '#', '', false);
1633 }
1634 }
1635 }
1636
1637 // Modify
1638 if ($object->statut != Project::STATUS_CLOSED && $user->hasRight('projet', 'creer')) {
1639 if ($userWrite > 0) {
1640 print dolGetButtonAction('', $langs->trans('Modify'), 'default', $_SERVER["PHP_SELF"].'?action=edit&token='.newToken().'&id='.$object->id, '');
1641 } else {
1642 print dolGetButtonAction($langs->trans('NotOwnerOfProject'), $langs->trans('Modify'), 'default', $_SERVER['PHP_SELF']. '#', '', false);
1643 }
1644 }
1645
1646 // Validate
1647 if ($object->statut == Project::STATUS_DRAFT && $user->hasRight('projet', 'creer')) {
1648 if ($userWrite > 0) {
1649 print dolGetButtonAction('', $langs->trans('Validate'), 'default', $_SERVER["PHP_SELF"].'?action=validate&amp;token='.newToken().'&amp;id='.$object->id, '');
1650 } else {
1651 print dolGetButtonAction($langs->trans('NotOwnerOfProject'), $langs->trans('Validate'), 'default', $_SERVER['PHP_SELF']. '#', '', false);
1652 }
1653 }
1654
1655 // Close
1656 if ($object->statut == Project::STATUS_VALIDATED && $user->hasRight('projet', 'creer')) {
1657 if ($userWrite > 0) {
1658 print dolGetButtonAction('', $langs->trans('Close'), 'default', $_SERVER["PHP_SELF"].'?action=close&amp;token='.newToken().'&amp;id='.$object->id, '');
1659 } else {
1660 print dolGetButtonAction($langs->trans('NotOwnerOfProject'), $langs->trans('Close'), 'default', $_SERVER['PHP_SELF']. '#', '', false);
1661 }
1662 }
1663
1664 // Reopen
1665 if ($object->statut == Project::STATUS_CLOSED && $user->hasRight('projet', 'creer')) {
1666 if ($userWrite > 0) {
1667 print dolGetButtonAction('', $langs->trans('ReOpen'), 'default', $_SERVER["PHP_SELF"].'?action=reopen&amp;token='.newToken().'&amp;id='.$object->id, '');
1668 } else {
1669 print dolGetButtonAction($langs->trans('NotOwnerOfProject'), $langs->trans('ReOpen'), 'default', $_SERVER['PHP_SELF']. '#', '', false);
1670 }
1671 }
1672
1673
1674 // Buttons Create
1675 if (!getDolGlobalString('PROJECT_HIDE_CREATE_OBJECT_BUTTON')) {
1676 // We check the type of thirdparty
1677 $is_customer_or_prospect = (!empty($object->thirdparty->prospect) || !empty($object->thirdparty->client));
1678 $is_supplier_only= (!empty($object->thirdparty->fournisseur) && $is_customer_or_prospect == false);
1679
1680 $arrayforbutaction = array(
1681 10 => array('lang'=>'propal', 'enabled'=>(isModEnabled("propal") && $is_customer_or_prospect == true), 'perm'=>$user->hasRight('propal', 'creer'), 'label' => 'AddProp', 'url'=>'/comm/propal/card.php?action=create&amp;projectid='.$object->id.'&amp;socid='.$object->socid),
1682 20 => array('lang'=>'orders', 'enabled'=>(isModEnabled("order") && $is_customer_or_prospect == true), 'perm'=>$user->hasRight('commande', 'creer'), 'label' => 'CreateOrder', 'url'=>'/commande/card.php?action=create&amp;projectid='.$object->id.'&amp;socid='.$object->socid),
1683 30 => array('lang'=>'bills', 'enabled'=>(isModEnabled("invoice") && $is_customer_or_prospect == true), 'perm'=>$user->hasRight('facture', 'creer'), 'label' => 'CreateBill', 'url'=>'/compta/facture/card.php?action=create&amp;projectid='.$object->id.'&amp;socid='.$object->socid),
1684 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.($is_supplier_only == true ? '&amp;socid='.$object->socid : '')),
1685 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.($is_supplier_only == true ? '&amp;socid='.$object->socid : '')),
1686 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.($is_supplier_only == true ? '&amp;socid='.$object->socid : '')),
1687 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),
1688 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),
1689 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),
1690 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),
1691 );
1692
1693 $params = array('backtopage' => $_SERVER["PHP_SELF"].'?id='.$object->id);
1694 //$params = array('backtopage' => $_SERVER["PHP_SELF"].'?id='.$object->id, 'isDropDown' => true);
1695
1696 print dolGetButtonAction('', $langs->trans("Create"), 'default', $arrayforbutaction, '', 1, $params);
1697 }
1698
1699 // Clone
1700 if ($user->hasRight('projet', 'creer')) {
1701 if ($userWrite > 0) {
1702 print dolGetButtonAction('', $langs->trans('ToClone'), 'default', $_SERVER["PHP_SELF"].'?action=clone&token='.newToken().'&id='.((int) $object->id), '');
1703 } else {
1704 print dolGetButtonAction($langs->trans('NotOwnerOfProject'), $langs->trans('ToClone'), 'default', $_SERVER['PHP_SELF']. '#', '', false);
1705 }
1706 }
1707
1708 // Delete
1709 if ($user->hasRight('projet', 'supprimer') || ($object->statut == Project::STATUS_DRAFT && $user->hasRight('projet', 'creer'))) {
1710 if ($userDelete > 0 || ($object->statut == Project::STATUS_DRAFT && $user->hasRight('projet', 'creer'))) {
1711 print dolGetButtonAction('', $langs->trans('Delete'), 'delete', $_SERVER["PHP_SELF"].'?action=delete&token='.newToken().'&id='.$object->id, '');
1712 } else {
1713 print dolGetButtonAction($langs->trans('NotOwnerOfProject'), $langs->trans('Delete'), 'default', $_SERVER['PHP_SELF']. '#', '', false);
1714 }
1715 }
1716 }
1717 }
1718
1719 print "</div>";
1720
1721 if (GETPOST('modelselected')) {
1722 $action = 'presend';
1723 }
1724
1725 if ($action != 'presend') {
1726 print '<div class="fichecenter"><div class="fichehalfleft">';
1727 print '<a name="builddoc"></a>'; // ancre
1728
1729 if (getDolGlobalInt('PROJECT_ENABLE_SUB_PROJECT')) {
1730 /*
1731 * Sub-projects (children)
1732 */
1733 $children = $object->getChildren();
1734 if ($children) {
1735 print '<table class="centpercent notopnoleftnoright table-fiche-title">';
1736 print '<tr class="titre"><td class="nobordernopadding valignmiddle col-title">';
1737 print '<div class="titre inline-block">'.$langs->trans('Sub-projects').'</div>';
1738 print '</td></tr></table>';
1739
1740 print '<div class="div-table-responsive-no-min">';
1741 print '<table class="centpercent noborder'.($morecss ? ' '.$morecss : '').'">';
1742 print '<tr class="liste_titre">';
1743 print getTitleFieldOfList('Ref', 0, $_SERVER["PHP_SELF"], '', '', '', '', '', '', '', 1);
1744 print getTitleFieldOfList('Title', 0, $_SERVER["PHP_SELF"], '', '', '', '', '', '', '', 1);
1745 print getTitleFieldOfList('Status', 0, $_SERVER["PHP_SELF"], '', '', '', '', '', '', '', 1);
1746 print '</tr>';
1747 print "\n";
1748
1749 $subproject = new Project($db);
1750 foreach ($children as $child) {
1751 $subproject->fetch($child->rowid);
1752 print '<tr class="oddeven">';
1753 print '<td class="nowraponall">'.$subproject->getNomUrl(1, 'project').'</td>';
1754 print '<td class="nowraponall tdoverflowmax125">'.$child->title.'</td>';
1755 print '<td class="nowraponall">'.$subproject->getLibStatut(5).'</td>';
1756 print '</tr>';
1757 }
1758
1759 print '</table>';
1760 print '</div>';
1761 }
1762 }
1763
1764 /*
1765 * Generated documents
1766 */
1767 $filename = dol_sanitizeFileName($object->ref);
1768 $filedir = $conf->project->multidir_output[$object->entity]."/".dol_sanitizeFileName($object->ref);
1769 $urlsource = $_SERVER["PHP_SELF"]."?id=".$object->id;
1770 $genallowed = ($user->hasRight('projet', 'lire') && $userAccess > 0);
1771 $delallowed = ($user->hasRight('projet', 'creer') && $userWrite > 0);
1772
1773 print $formfile->showdocuments('project', $filename, $filedir, $urlsource, $genallowed, $delallowed, $object->model_pdf, 1, 0, 0, 0, 0, '', '', '', '', '', $object);
1774
1775 print '</div><div class="fichehalfright">';
1776
1777 $MAXEVENT = 10;
1778
1779 $morehtmlcenter = '<div class="nowraponall">';
1780 $morehtmlcenter .= dolGetButtonTitle($langs->trans('FullConversation'), '', 'fa fa-comments imgforviewmode', DOL_URL_ROOT.'/projet/messaging.php?id='.$object->id);
1781 $morehtmlcenter .= dolGetButtonTitle($langs->trans('FullList'), '', 'fa fa-bars imgforviewmode', DOL_URL_ROOT.'/projet/agenda.php?id='.$object->id);
1782 $morehtmlcenter .= '</div>';
1783
1784 // List of actions on element
1785 include_once DOL_DOCUMENT_ROOT.'/core/class/html.formactions.class.php';
1786 $formactions = new FormActions($db);
1787 $somethingshown = $formactions->showactions($object, 'project', 0, 1, '', $MAXEVENT, '', $morehtmlcenter);
1788
1789 print '</div></div>';
1790 }
1791
1792 // Presend form
1793 $modelmail = 'project';
1794 $defaulttopic = 'SendProjectRef';
1795 $defaulttopiclang = 'projects';
1796 $diroutput = $conf->project->multidir_output[$object->entity];
1797 $autocopy = 'MAIN_MAIL_AUTOCOPY_PROJECT_TO'; // used to know the automatic BCC to add
1798 $trackid = 'proj'.$object->id;
1799
1800 include DOL_DOCUMENT_ROOT.'/core/tpl/card_presend.tpl.php';
1801
1802 // Hook to add more things on page
1803 $parameters = array();
1804 $reshook = $hookmanager->executeHooks('mainCardTabAddMore', $parameters, $object, $action); // Note that $action and $object may have been modified by hook
1805} else {
1806 print $langs->trans("RecordNotFound");
1807}
1808
1809// End of page
1810llxFooter();
1811$db->close();
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:58
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:456
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 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.
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.
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)
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'.
dol_clone($object, $native=0)
Create a clone of instance of object (new instance with same value for each properties) With native =...
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.
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.
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...
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.
publicphonebutton2 phonegreen basiclayout basiclayout TotalHT VATCode TotalVAT TotalLT1 TotalLT2 TotalTTC TotalHT clearboth nowraponall TAKEPOS_SHOW_SUBPRICE right right right takeposterminal SELECT e e e e e statut
Definition invoice.php:2015