33require
'../main.inc.php';
42require_once DOL_DOCUMENT_ROOT.
'/projet/class/project.class.php';
43require_once DOL_DOCUMENT_ROOT.
'/projet/class/task.class.php';
44require_once DOL_DOCUMENT_ROOT.
'/core/lib/project.lib.php';
45require_once DOL_DOCUMENT_ROOT.
'/core/class/doleditor.class.php';
46require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formprojet.class.php';
47require_once DOL_DOCUMENT_ROOT.
'/core/class/html.formfile.class.php';
48require_once DOL_DOCUMENT_ROOT.
'/core/modules/project/modules_project.php';
49require_once DOL_DOCUMENT_ROOT.
'/categories/class/categorie.class.php';
52$langsLoad = array(
'projects',
'companies');
54 $langsLoad[] =
'eventorganization';
57$langs->loadLangs($langsLoad);
61$action =
GETPOST(
'action',
'aZ09');
62$backtopage =
GETPOST(
'backtopage',
'alpha');
63$backtopageforcancel =
GETPOST(
'backtopageforcancel',
'alpha');
64$cancel =
GETPOST(
'cancel',
'alpha');
65$confirm =
GETPOST(
'confirm',
'aZ09');
72$objcanvas =
GETPOST(
"objcanvas",
"alphanohtml");
73$comefromclone =
GETPOST(
"comefromclone",
"alphanohtml");
78$location =
GETPOST(
'location',
'alphanohtml');
81$mine =
GETPOST(
'mode') ==
'mine' ? 1 : 0;
84$hookmanager->initHooks(array(
'projectcard',
'globalcard'));
90if ($id > 0 || !empty($ref)) {
91 $ret =
$object->fetch($id, $ref);
94 if (
getDolGlobalString(
'PROJECT_ALLOW_COMMENT_ON_PROJECT') && method_exists($object,
'fetchComments') && empty(
$object->comments)) {
102$extrafields->fetch_name_optionals_label(
$object->table_element);
109if ($id ==
'' && $ref ==
'' && ($action !=
"create" && $action !=
"add" && $action !=
"update" && !
GETPOST(
"cancel"))) {
113$permissiontoadd = $user->hasRight(
'projet',
'creer');
114$permissiontodelete = $user->hasRight(
'projet',
'supprimer');
115$permissiondellink = $user->hasRight(
'projet',
'creer');
116$permissiontoeditextra = $permissiontoadd;
118if (
GETPOST(
'attribute',
'aZ09') && isset($extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')])) {
120 $permissiontoeditextra =
dol_eval((
string) $extrafields->attributes[
$object->table_element][
'perms'][
GETPOST(
'attribute',
'aZ09')]);
130$parameters = array(
'id' => $socid,
'objcanvas' => $objcanvas);
131$reshook = $hookmanager->executeHooks(
'doActions', $parameters, $object, $action);
133 setEventMessages($hookmanager->error, $hookmanager->errors,
'errors');
136if (empty($reshook)) {
137 $backurlforlist = DOL_URL_ROOT.
'/projet/list.php';
141 if (
GETPOST(
"comefromclone") == 1) {
143 $result =
$object->delete($user);
145 header(
"Location: index.php");
149 setEventMessages($langs->trans(
"CantRemoveProject", $langs->transnoentitiesnoconv(
"ProjectOverview")),
null,
'errors');
154 if (empty($backtopage) || ($cancel && empty($id))) {
155 if (empty($backtopage) || ($cancel && strpos($backtopage,
'__ID__'))) {
156 if (empty($id) && (($action !=
'add' && $action !=
'create') || $cancel)) {
157 $backtopage = $backurlforlist;
159 $backtopage = DOL_URL_ROOT.
'/projet/card.php?id='.((!empty($id) &&
$id > 0) ? $id :
'__ID__');
165 if (!empty($backtopageforcancel)) {
166 header(
"Location: ".$backtopageforcancel);
168 } elseif (!empty($backtopage)) {
169 header(
"Location: ".$backtopage);
175 include DOL_DOCUMENT_ROOT.
'/core/actions_dellink.inc.php';
178 if ($action ==
'confirm_setdraft' && $confirm ==
'yes' && $permissiontoadd) {
179 $result =
$object->setStatut($object::STATUS_DRAFT,
null,
'',
'PROJECT_MODIFY');
189 $object->statut = $object::STATUS_DRAFT;
193 if ($action ==
'add' && $permissiontoadd) {
196 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"Ref")),
null,
'errors');
200 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"ProjectLabel")),
null,
'errors');
205 if (
GETPOST(
'usage_opportunity') !=
'' && !(
GETPOST(
'opp_status') > 0)) {
207 setEventMessages($langs->trans(
"ErrorOppStatusRequiredIfUsage"),
null,
'errors');
209 if (
GETPOST(
'opp_amount') !=
'' && !(
GETPOST(
'opp_status') > 0)) {
211 setEventMessages($langs->trans(
"ErrorOppStatusRequiredIfAmount"),
null,
'errors');
236 $object->date_start_event = $date_start_event;
237 $object->date_end_event = $date_end_event;
240 $object->opp_status = $opp_status;
241 $object->opp_percent = $opp_percent;
242 $object->usage_opportunity = (
GETPOST(
'usage_opportunity',
'alpha') ==
'on' ? 1 : 0);
243 $object->usage_task = (
GETPOST(
'usage_task',
'alpha') ==
'on' ? 1 : 0);
244 $object->usage_bill_time = (
GETPOST(
'usage_bill_time',
'alpha') ==
'on' ? 1 : 0);
245 $object->usage_organize_event = (
GETPOST(
'usage_organize_event',
'alpha') ==
'on' ? 1 : 0);
248 $ret = $extrafields->setOptionalsFromPost(
null, $object);
254 $result =
$object->create($user);
257 $typeofcontact =
GETPOST(
'typeofcontact');
258 $result =
$object->add_contact($user->id, $typeofcontact,
'internal');
262 setEventMessage(
'ErrorPROJECTLEADERRoleMissingRestoreIt',
'errors');
264 } elseif ($result < 0) {
265 $langs->load(
"errors");
270 $langs->load(
"errors");
275 if (!$error && !empty(
$object->id) > 0) {
277 $categories =
GETPOST(
'categories',
'array:int');
278 $result =
$object->setCategories($categories);
280 $langs->load(
"errors");
289 if (!empty($backtopage)) {
290 $backtopage = preg_replace(
'/--IDFORBACKTOPAGE--|__ID__/', (
string)
$object->id, $backtopage);
291 $backtopage = $backtopage.
'&projectid='.
$object->id;
292 header(
"Location: ".$backtopage);
295 header(
"Location:card.php?id=".
$object->id);
300 unset($_POST[
"ref"]);
308 if ($action ==
'update' && empty(
GETPOST(
'cancel')) && $permissiontoadd) {
311 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"Ref")),
null,
'errors');
315 setEventMessages($langs->trans(
"ErrorFieldRequired", $langs->transnoentities(
"ProjectLabel")),
null,
'errors');
323 $old_start_date =
$object->date_start;
334 $object->date_start_event = (!
GETPOST(
'date_start_event')) ?
'' : $date_start_event;
335 $object->date_end_event = (!
GETPOST(
'date_end_event')) ?
'' : $date_end_event;
344 $object->opp_status = $opp_status;
347 $object->opp_percent = $opp_percent;
349 $object->usage_opportunity = (
GETPOST(
'usage_opportunity',
'alpha') ==
'on' ? 1 : 0);
350 $object->usage_task = (
GETPOST(
'usage_task',
'alpha') ==
'on' ? 1 : 0);
351 $object->usage_bill_time = (
GETPOST(
'usage_bill_time',
'alpha') ==
'on' ? 1 : 0);
352 $object->usage_organize_event = (
GETPOST(
'usage_organize_event',
'alpha') ==
'on' ? 1 : 0);
355 $ret = $extrafields->setOptionalsFromPost(
null, $object,
'@GETPOSTISSET');
365 setEventMessages($langs->trans(
"ErrorOppStatusRequiredIfAmount"),
null,
'errors');
368 if (!$error && !is_null(
$object->thirdparty) && ((
int)
$object->thirdparty->client == 0 || (
int)
$object->thirdparty->client == 2)) {
370 $idoppstatuswon = (int)
dol_getIdFromCode($db,
'WON',
'c_lead_status',
'code',
'rowid');
372 if (
$object->opp_status == $idoppstatuswon) {
374 if (!empty(
$object->thirdparty) && !empty(
$object->thirdparty->id)) {
375 $object->thirdparty->setAsCustomer();
382 $result =
$object->update($user);
386 setEventMessages($langs->trans(
"ErrorRefAlreadyExists"),
null,
'errors');
392 $categories =
GETPOST(
'categories',
'array:int');
393 $result =
$object->setCategories($categories);
402 if (
GETPOST(
"reportdate") && (
$object->date_start != $old_start_date)) {
403 $result =
$object->shiftTaskDate((
int) $old_start_date);
406 setEventMessages($langs->trans(
"ErrorShiftTaskDate").
':'.
$object->error,
$object->errors,
'errors');
413 $resclose =
$object->setClose($user);
416 setEventMessages($langs->trans(
"FailedToCloseProject").
':'.
$object->error,
$object->errors,
'errors');
436 if ($action ==
'set_opp_status' && $user->hasRight(
'projet',
'creer')) {
438 $object->opp_status = $opp_status;
441 $object->opp_percent = $opp_percent;
447 setEventMessages($langs->trans(
"ErrorOppStatusRequiredIfAmount"),
null,
'errors');
454 $result =
$object->update($user);
458 setEventMessages($langs->trans(
"ErrorRefAlreadyExists"),
null,
'errors');
466 if ((
int)
$object->thirdparty->client == 0 || (
int)
$object->thirdparty->client == 2) {
468 $idoppstatuswon = (int)
dol_getIdFromCode($db,
'WON',
'c_lead_status',
'code',
'rowid');
470 if (!$error &&
$object->opp_status == $idoppstatuswon) {
472 if (!empty(
$object->thirdparty) && !empty(
$object->thirdparty->id)) {
473 $object->thirdparty->setAsCustomer();
491 if ($action ==
'builddoc' && $permissiontoadd) {
497 $outputlangs = $langs;
498 if (
GETPOST(
'lang_id',
'aZ09')) {
500 $outputlangs->setDefaultLang(
GETPOST(
'lang_id',
'aZ09'));
502 $result =
$object->generateDocument(
$object->model_pdf, $outputlangs);
507 setEventMessages($langs->trans(
"FileGenerated"),
null,
'mesgs');
512 if ($action ==
'remove_file' && $permissiontoadd) {
514 require_once DOL_DOCUMENT_ROOT.
'/core/lib/files.lib.php';
516 $langs->load(
"other");
518 $file = $upload_dir.
'/'.
GETPOST(
'file');
521 setEventMessages($langs->trans(
"FileWasRemoved",
GETPOST(
'file')),
null,
'mesgs');
523 setEventMessages($langs->trans(
"ErrorFailToDeleteFile",
GETPOST(
'file')),
null,
'errors');
530 if ($action ==
'confirm_validate' && $confirm ==
'yes' && $permissiontoadd) {
531 $result =
$object->setValid($user);
537 if ($action ==
'confirm_close' && $confirm ==
'yes' && $permissiontoadd) {
538 $result =
$object->setClose($user);
544 if ($action ==
'confirm_reopen' && $confirm ==
'yes' && $permissiontoadd) {
545 $result =
$object->setValid($user);
551 if ($action ==
'confirm_delete' && $confirm ==
'yes' && $permissiontodelete) {
554 $result =
$object->delete($user);
556 setEventMessages($langs->trans(
"RecordDeleted"),
null,
'mesgs');
558 if (!empty($_SESSION[
'pageforbacktolist']) && !empty($_SESSION[
'pageforbacktolist'][
'project'])) {
559 $tmpurl = $_SESSION[
'pageforbacktolist'][
'project'];
560 $tmpurl = preg_replace(
'/__SOCID__/', (
string)
$object->socid, $tmpurl);
561 $urlback = $tmpurl.(preg_match(
'/\?/', $tmpurl) ?
'&' :
'?').
'restore_lastsearch_values=1';
563 $urlback = DOL_URL_ROOT.
'/projet/list.php?restore_lastsearch_values=1';
566 header(
"Location: ".$urlback);
574 if ($action ==
'confirm_clone' && $permissiontoadd && $confirm ==
'yes') {
575 $clone_contacts =
GETPOST(
'clone_contacts') ? 1 : 0;
576 $clone_tasks =
GETPOST(
'clone_tasks') ? 1 : 0;
577 $clone_project_files =
GETPOST(
'clone_project_files') ? 1 : 0;
578 $clone_task_files =
GETPOST(
'clone_task_files') ? 1 : 0;
579 $clone_notes =
GETPOST(
'clone_notes') ? 1 : 0;
580 $move_date =
GETPOST(
'move_date') ? 1 : 0;
583 $result =
$object->createFromClone($user,
$object->id, $clone_contacts, $clone_tasks, $clone_project_files, $clone_task_files, $clone_notes, $move_date, 0, $clone_thirdparty);
589 $newobject->fetch($result);
591 setEventMessages($langs->trans(
"ProjectCreatedInDolibarr", $newobject->ref),
null,
'mesgs');
593 header(
'Location: '.$_SERVER[
'PHP_SELF'].
'?id='.$result.
'&action=edit&comefromclone=1');
599 if ($action ==
'update_extras' && $permissiontoeditextra) {
602 $attribute_name =
GETPOST(
'attribute',
'aZ09');
605 $ret = $extrafields->setOptionalsFromPost(
null, $object, $attribute_name);
611 $result =
$object->updateExtraField($attribute_name,
'PROJECT_MODIFY');
619 $action =
'edit_extras';
624 include DOL_DOCUMENT_ROOT.
'/core/actions_printing.inc.php';
627 $triggersendname =
'PROJECT_SENTBYMAIL';
629 $autocopy =
'MAIN_MAIL_AUTOCOPY_PROJECT_TO';
630 $trackid =
'proj'.$object->id;
631 include DOL_DOCUMENT_ROOT.
'/core/actions_sendmails.inc.php';
639$form =
new Form($db);
642$userstatic =
new User($db);
644$title = $langs->trans(
"Project").
' - '.
$object->ref.(!empty(
$object->thirdparty->name) ?
' - '.$object->thirdparty->name :
'').(!empty(
$object->title) ?
' - '.$object->title :
'');
646 $title =
$object->ref.(!empty(
$object->thirdparty->name) ?
' - '.$object->thirdparty->name :
'').(!empty(
$object->title) ?
' - '.$object->title :
'');
649$help_url =
"EN:Module_Projects|FR:Module_Projets|ES:Módulo_Proyectos|DE:Modul_Projekte";
651llxHeader(
"", $title, $help_url,
'', 0, 0,
'',
'',
'',
'mod-project page-card');
653$titleboth = $langs->trans(
"LeadsOrProjects");
654$titlenew = $langs->trans(
"NewLeadOrProject");
656 $titleboth = $langs->trans(
"Projects");
657 $titlenew = $langs->trans(
"NewProject");
660 $titleboth = $langs->trans(
"Leads");
661 $titlenew = $langs->trans(
"NewLead");
664if ($action ==
'create' && $user->hasRight(
'projet',
'creer')) {
669 $thirdparty =
new Societe($db);
671 $thirdparty->fetch($socid);
676 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
677 print
'<input type="hidden" name="action" value="add">';
678 print
'<input type="hidden" name="token" value="'.newToken().
'">';
679 print
'<input type="hidden" name="backtopage" value="'.$backtopage.
'">';
680 print
'<input type="hidden" name="backtopageforcancel" value="'.$backtopageforcancel.
'">';
681 print
'<input type="hidden" name="dol_openinpopup" value="'.$dol_openinpopup.
'">';
685 print
'<table class="border centpercent tableforfieldcreate">';
695 $dirmodels = array_merge(array(
'/'), (array)
$conf->modules_parts[
'models']);
696 foreach ($dirmodels as $reldir) {
697 $file =
dol_buildpath($reldir.
"core/modules/project/".$modele.
'.php', 0);
698 if (file_exists($file)) {
700 $classname = $modele;
705 if ($filefound && !empty($classname)) {
707 if (class_exists($classname)) {
708 $modProject =
new $classname();
709 '@phan-var-force ModeleNumRefProjects $modProject';
710 $defaultref = $modProject->getNextValue($thirdparty, $object);
714 if (is_numeric($defaultref) && $defaultref <= 0) {
720 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).
'">';
722 print
' '.$form->textwithpicto(
'', $langs->trans(
"YouCanCompleteRef", $suggestedref));
727 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>';
731 print
'<tr><td>'.$langs->trans(
"Parent").
'</td><td class="maxwidthonsmartphone">';
732 print img_picto(
'',
'project',
'class="pictofixedwidth"');
733 $formproject->select_projects(-1,
'',
'fk_project', 64, 0, 1, 1, 0, 0, 0,
'', 0, 0,
'',
'',
'');
739 print
'<tr><td class="tdtop">';
740 print $langs->trans(
"Usage");
744 print
'<input type="checkbox" id="usage_opportunity" name="usage_opportunity"'.(GETPOSTISSET(
'usage_opportunity') ? (
GETPOST(
'usage_opportunity',
'alpha') ?
' checked="checked"' :
'') :
' checked="checked"').
'> ';
745 $htmltext = $langs->trans(
"ProjectFollowOpportunity");
746 print
'<label for="usage_opportunity">'.$form->textwithpicto($langs->trans(
"ProjectFollowOpportunity"), $htmltext).
'</label>';
748 print
'$( document ).ready(function() {
749 jQuery("#usage_opportunity").change(function() {
750 if (jQuery("#usage_opportunity").prop("checked")) {
751 console.log("Show opportunities fields");
752 jQuery(".classuseopportunity").show();
754 console.log("Hide opportunities fields "+jQuery("#usage_opportunity").prop("checked"));
755 jQuery(".classuseopportunity").hide();
760 print
'jQuery(".classuseopportunity").hide();';
767 print
'<input type="checkbox" id="usage_task" name="usage_task"'.(GETPOSTISSET(
'usage_task') ? (
GETPOST(
'usage_task',
'alpha') ?
' checked="checked"' :
'') :
' checked="checked"').
'> ';
768 $htmltext = $langs->trans(
"ProjectFollowTasks");
769 print
'<label for="usage_task">'.$form->textwithpicto($langs->trans(
"ProjectFollowTasks"), $htmltext).
'</label>';
771 print
'$( document ).ready(function() {
772 jQuery("#usage_task").change(function() {
773 if (jQuery("#usage_task").prop("checked")) {
774 console.log("Show task fields");
775 jQuery(".classusetask").show();
777 console.log("Hide tasks fields "+jQuery("#usage_task").prop("checked"));
778 jQuery(".classusetask").hide();
783 print
'jQuery(".classusetask").hide();';
790 print
'<input type="checkbox" id="usage_bill_time" name="usage_bill_time"'.(GETPOSTISSET(
'usage_bill_time') ? (
GETPOST(
'usage_bill_time',
'alpha') ?
' checked="checked"' :
'') :
'').
'> ';
791 $htmltext = $langs->trans(
"ProjectBillTimeDescription");
792 print
'<label for="usage_bill_time">'.$form->textwithpicto($langs->trans(
"BillTime"), $htmltext).
'</label>';
794 print
'$( document ).ready(function() {
795 jQuery("#usage_bill_time").change(function() {
796 if (jQuery("#usage_bill_time").prop("checked")) {
797 console.log("Show bill time fields");
798 jQuery(".classusebilltime").show();
800 console.log("Hide bill time fields "+jQuery("#usage_bill_time").prop("checked"));
801 jQuery(".classusebilltime").hide();
806 print
'jQuery(".classusebilltime").hide();';
813 print
'<input type="checkbox" id="usage_organize_event" name="usage_organize_event"'.(GETPOSTISSET(
'usage_organize_event') ? (
GETPOST(
'usage_organize_event',
'alpha') ?
' checked="checked"' :
'') :
'').
'"> ';
814 $htmltext = $langs->trans(
"EventOrganizationDescriptionLong");
815 print
'<label for="usage_organize_event">'.$form->textwithpicto($langs->trans(
"ManageOrganizeEvent"), $htmltext).
'</label>';
817 print
'$( document ).ready(function() {
818 jQuery("#usage_organize_event").change(function() {
819 if (jQuery("#usage_organize_event").prop("checked")) {
820 console.log("Show organize event fields");
821 jQuery(".classuseorganizeevent").show();
823 console.log("Hide organize event fields "+jQuery("#usage_organize_event").prop("checked"));
824 jQuery(".classuseorganizeevent").hide();
828 if (!
GETPOST(
'usage_organize_event')) {
829 print
'jQuery(".classuseorganizeevent").hide();';
841 print(!
getDolGlobalString(
'PROJECT_THIRDPARTY_REQUIRED') ?
'' :
'<span class="fieldrequired">');
842 print $langs->trans(
"ThirdParty");
844 print
'</td><td class="maxwidthonsmartphone">';
849 $text = img_picto(
'',
'company',
'class="pictofixedwidth"').$form->select_company(
GETPOSTINT(
'socid'),
'socid', $filter,
'SelectThirdParty', 1, 0, array(), 0,
'minwidth300 widthcentpercentminusxx maxwidth500');
851 $texthelp = $langs->trans(
"IfNeedToUseOtherObjectKeepEmpty");
852 print $form->textwithtooltip($text.
' '.img_help(), $texthelp, 1);
857 $url =
'/societe/card.php?action=create&customer=3&fournisseur=0&backtopage='.urlencode($_SERVER[
"PHP_SELF"].
'?action=create');
858 $newbutton =
'<span class="fa fa-plus-circle valignmiddle paddingleft" title="'.$langs->trans(
"AddThirdParty").
'"></span>';
861 $jsonclose =
'TODO Not yet implemented';
864 print
' <a href="'.DOL_URL_ROOT.$url.
'">'.$newbutton.
'</a>';
872 print
'<tr><td>'.$langs->trans(
"Status").
'</td><td>';
873 print
'<input type="hidden" name="status" value="'.$status.
'">';
874 print
$object->LibStatut($status, 4);
880 print
'<tr class="classuseopportunity"><td><span class="fieldrequired">'.$langs->trans(
"OpportunityStatus").
'</span></td>';
881 print
'<td class="maxwidthonsmartphone">';
882 print $formproject->selectOpportunityStatus(
'opp_status',
GETPOSTISSET(
'opp_status') ?
GETPOST(
'opp_status') :
$object->opp_status, 1, 0, 0, 0,
'', 0, 1);
885 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>';
886 print
'<input type="hidden" name="opp_percent_not_set" id="opp_percent_not_set" value="'.dol_escape_htmltag(
GETPOSTISSET(
'opp_percent') ?
'0' :
'1').
'">';
891 print
'<tr class="classuseopportunity"><td>'.$langs->trans(
"OpportunityAmount").
'</td>';
892 print
'<td><input class="width75 right" type="text" name="opp_amount" value="'.dol_escape_htmltag(
GETPOSTISSET(
'opp_amount') ?
GETPOST(
'opp_amount') :
'').
'">';
893 print
' '.$langs->getCurrencySymbol(
$conf->currency);
899 print
'<tr><td>'.$langs->trans(
"Budget").
'</td>';
900 print
'<td><input class="width75 right" type="text" name="budget_amount" value="'.dol_escape_htmltag(
GETPOSTISSET(
'budget_amount') ?
GETPOST(
'budget_amount') :
'').
'">';
901 print
' '.$langs->getCurrencySymbol(
$conf->currency);
906 print
'<tr><td>'.$langs->trans(
"Date").(isModEnabled(
'eventorganization') ?
' <span class="classuseorganizeevent">('.$langs->trans(
"Project").
')</span>' :
'').
'</td><td>';
908 print
' <span class="opacitymedium"> '.$langs->trans(
"to").
' </span> ';
909 print $form->selectDate(($date_end ? $date_end : -1),
'projectend', 0, 0, 0,
'', 1, 0);
914 print
'<tr class="classuseorganizeevent"><td>'.$langs->trans(
"Date").
' ('.$langs->trans(
"Event").
')</td><td>';
915 print $form->selectDate(($date_start_event ? $date_start_event : -1),
'date_start_event', 1, 1, 1,
'', 1, 0);
916 print
' <span class="opacitymedium"> '.$langs->trans(
"to").
' </span> ';
917 print $form->selectDate(($date_end_event ? $date_end_event : -1),
'date_end_event', 1, 1, 1,
'', 1, 0);
921 print
'<tr class="classuseorganizeevent"><td>'.$langs->trans(
"Location").
'</td>';
922 print
'<td><input class="minwidth300 maxwidth500" type="text" name="location" value="'.dol_escape_htmltag($location).
'"></td>';
927 print
'<tr><td class="tdtop">'.$langs->trans(
"Description").
'</td>';
929 $doleditor =
new DolEditor(
'description',
GETPOST(
"description",
'restricthtml'),
'', 90,
'dolibarr_notes',
'',
false,
true,
isModEnabled(
'fckeditor') &&
getDolGlobalString(
'FCKEDITOR_ENABLE_SOCIETE'), ROWS_3,
'90%');
930 $doleditor->Create();
935 print
'<tr><td>'.$langs->trans(
"Categories").
'</td><td colspan="3">';
936 print $form->selectCategories(Categorie::TYPE_PROJECT,
'categories', $object);
941 print
'<tr><td>'.$langs->trans(
"Visibility").
'</td><td class="maxwidthonsmartphone">';
944 $array[0] = $langs->trans(
"PrivateProject");
947 $array[1] = $langs->trans(
"SharedProject");
950 if (count($array) > 0) {
951 print $form->selectarray(
'public', $array,
GETPOSTINT(
'public') ? 1 : 0, 0, 0, 0,
'', 0, 0, 0,
'',
'minwidth200', 1);
953 print
'<input type="hidden" name="public" id="public" value="'.(GETPOSTINT(
'public') ? 1 : 0).
'">';
956 print img_picto($langs->trans(
'PrivateProject'),
'private',
'class="paddingrightonly"');
957 print $langs->trans(
"PrivateProject");
959 print img_picto($langs->trans(
'SharedProject'),
'world',
'class="paddingrightonly"');
960 print $langs->trans(
"SharedProject");
966 print
'<tr><td class="tdtop">'.$langs->trans(
"ProjectContactTypeManager").
'</td>';
968 $contactList =
$object->liste_type_contact(
'internal',
'position', 1);
969 $typeofcontact =
GETPOST(
'typeofcontact') ?
GETPOST(
'typeofcontact') :
'PROJECTLEADER';
970 print $form->selectarray(
'typeofcontact', $contactList, $typeofcontact, 0, 0, 0,
'', 0, 0, 0,
'',
'minwidth200', 1);
974 $parameters = array();
975 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
976 print $hookmanager->resPrint;
977 if (empty($reshook)) {
978 print
$object->showOptionals($extrafields,
'create');
985 print $form->buttonsSaveCancel(
'CreateDraft');
991 print
'<script type="text/javascript">
992 jQuery(document).ready(function() {
993 function change_percent()
995 var element = jQuery("#opp_status option:selected");
996 var defaultpercent = element.attr("defaultpercent");
997 /*if (jQuery("#opp_percent_not_set").val() == "") */
998 /* defaultpercent is the raw DB value (double(5,2), ie "100.00"), so normalize it */
999 jQuery("#opp_percent").val(parseFloat(defaultpercent));
1003 jQuery("#opp_status").change(function() {
1007 jQuery("#usage_task").change(function() {
1008 console.log("We click on usage task "+jQuery("#usage_task").is(":checked"));
1009 if (! jQuery("#usage_task").is(":checked")) {
1010 jQuery("#usage_bill_time").prop("checked", false);
1014 jQuery("#usage_bill_time").change(function() {
1015 console.log("We click on usage to bill time");
1016 if (jQuery("#usage_bill_time").is(":checked")) {
1017 jQuery("#usage_task").prop("checked", true);
1027 $res =
$object->fetch_optionals();
1030 $userAccess =
$object->restrictedProjectArea($user,
'read');
1031 $userWrite =
$object->restrictedProjectArea($user,
'write');
1032 $userDelete =
$object->restrictedProjectArea($user,
'delete');
1038 if ($action ==
'validate') {
1039 $text = $langs->trans(
'ConfirmValidateProject');
1040 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
'?id='.
$object->id, $langs->trans(
'ValidateProject'), $text,
'confirm_validate',
'', 0, 1);
1043 if ($action ==
'close') {
1044 $text = $langs->trans(
"ConfirmCloseAProject");
1045 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".
$object->id, $langs->trans(
"CloseAProject"), $text,
"confirm_close",
'',
'', 1);
1048 if ($action ==
'reopen') {
1049 $text = $langs->trans(
"ConfirmReOpenAProject");
1050 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".
$object->id, $langs->trans(
"ReOpenAProject"), $text,
"confirm_reopen",
'',
'', 1);
1053 if ($action ==
'delete') {
1054 $text = $langs->trans(
"ConfirmDeleteAProject");
1055 $task =
new Task($db);
1056 $taskarray = $task->getTasksArray(
null,
null,
$object->id, 0, 0);
1057 $nboftask = count($taskarray);
1059 $text .=
'<br>'.img_warning().
' '.$langs->trans(
"ThisWillAlsoRemoveTasks", $nboftask);
1061 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".
$object->id, $langs->trans(
"DeleteAProject"), $text,
"confirm_delete",
'',
'', 1);
1065 if ($action ==
'clone') {
1066 $text = $langs->trans(
"ConfirmCloneProject");
1067 $formquestion = array(
1068 'text' => $langs->trans(
"ConfirmClone"),
1069 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, array(), 0,
'minwidth200 maxwidth250')),
1070 1 => array(
'type' =>
'checkbox',
'name' =>
'clone_contacts',
'label' => $langs->trans(
"CloneContacts"),
'value' => true),
1071 2 => array(
'type' =>
'checkbox',
'name' =>
'clone_tasks',
'label' => $langs->trans(
"CloneTasks"),
'value' => true),
1072 3 => array(
'type' =>
'checkbox',
'name' =>
'move_date',
'label' => $langs->trans(
"CloneMoveDate"),
'value' => true),
1073 4 => array(
'type' =>
'checkbox',
'name' =>
'clone_notes',
'label' => $langs->trans(
"CloneNotes"),
'value' => true),
1074 5 => array(
'type' =>
'checkbox',
'name' =>
'clone_project_files',
'label' => $langs->trans(
"CloneProjectFiles"),
'value' => false),
1075 6 => array(
'type' =>
'checkbox',
'name' =>
'clone_task_files',
'label' => $langs->trans(
"CloneTaskFiles"),
'value' => false)
1078 $formconfirm = $form->formconfirm($_SERVER[
"PHP_SELF"].
"?id=".
$object->id, $langs->trans(
"ToClone"), $text,
"confirm_clone", $formquestion,
'', 1, 0, 600);
1082 $parameters = array(
'formConfirm' => $formconfirm);
1083 $reshook = $hookmanager->executeHooks(
'formConfirm', $parameters, $object, $action);
1084 if (empty($reshook)) {
1085 $formconfirm .= $hookmanager->resPrint;
1086 } elseif ($reshook > 0) {
1087 $formconfirm = $hookmanager->resPrint;
1094 print
'<form action="'.$_SERVER[
"PHP_SELF"].
'" method="POST">';
1095 print
'<input type="hidden" name="token" value="'.newToken().
'">';
1096 print
'<input type="hidden" name="action" value="update">';
1097 print
'<input type="hidden" name="id" value="'.$object->id.
'">';
1098 print
'<input type="hidden" name="comefromclone" value="'.$comefromclone.
'">';
1102 if ($action ==
'edit' && $userWrite > 0) {
1105 print
'<table class="border centpercent">';
1109 print
'<tr><td class="titlefield fieldrequired">'.$langs->trans(
"Ref").
'</td>';
1110 print
'<td><input class="width200" name="ref" value="'.$suggestedref.
'">';
1111 print
' '.$form->textwithpicto(
'', $langs->trans(
"YouCanCompleteRef", $suggestedref));
1115 print
'<tr><td class="fieldrequired">'.$langs->trans(
"Label").
'</td>';
1116 print
'<td><input class="quatrevingtpercent" name="title" value="'.dol_escape_htmltag(
$object->title).
'"></td></tr>';
1119 print
'<tr><td class="fieldrequired">'.$langs->trans(
"Status").
'</td><td>';
1120 print
'<select class="flat" name="status" id="status">';
1121 $statuses =
$object->labelStatusShort;
1123 unset($statuses[$object::STATUS_DRAFT]);
1125 foreach ($statuses as $key => $val) {
1126 print
'<option value="'.$key.
'"'.((
GETPOSTISSET(
'status') ?
GETPOST(
'status') :
$object->
status) == $key ?
' selected="selected"' :
'').
'>'.$langs->trans($val).
'</option>';
1134 print
'<tr><td>'.$langs->trans(
"Parent").
'</td><td class="maxwidthonsmartphone">';
1135 print img_picto(
'',
'project',
'class="pictofixedwidth"');
1136 $formproject->select_projects(-1, (
string)
$object->fk_project,
'fk_project', 64, 0, 1, 1, 0, 0, 0,
'', 0, 0,
'',
'',
'');
1142 print
'<tr><td class="tdtop">';
1143 print $langs->trans(
"Usage");
1147 print
'<input type="checkbox" id="usage_opportunity" name="usage_opportunity"'.(GETPOSTISSET(
'usage_opportunity') ? (
GETPOST(
'usage_opportunity',
'alpha') !=
'' ?
' checked="checked"' :
'') : (
$object->usage_opportunity ?
' checked="checked"' :
'')).
'> ';
1148 $htmltext = $langs->trans(
"ProjectFollowOpportunity");
1149 print
'<label for="usage_opportunity">'.$form->textwithpicto($langs->trans(
"ProjectFollowOpportunity"), $htmltext).
'</label>';
1151 print
'$( document ).ready(function() {
1152 jQuery("#usage_opportunity").change(function() {
1153 set_usage_opportunity();
1156 set_usage_opportunity();
1158 function set_usage_opportunity() {
1159 console.log("set_usage_opportunity");
1160 if (jQuery("#usage_opportunity").prop("checked")) {
1161 console.log("Show opportunities fields");
1162 jQuery(".classuseopportunity").show();
1164 console.log("Hide opportunities fields "+jQuery("#usage_opportunity").prop("checked"));
1165 jQuery(".classuseopportunity").hide();
1173 print
'<input type="checkbox" id="usage_task" name="usage_task"' . (
GETPOSTISSET(
'usage_task') ? (
GETPOST(
'usage_task',
'alpha') !=
'' ?
' checked="checked"' :
'') : (
$object->usage_task ?
' checked="checked"' :
'')) .
'> ';
1174 $htmltext = $langs->trans(
"ProjectFollowTasks");
1175 print
'<label for="usage_task">'.$form->textwithpicto($langs->trans(
"ProjectFollowTasks"), $htmltext).
'</label>';
1177 print
'$( document ).ready(function() {
1178 jQuery("#usage_task").change(function() {
1184 function set_usage_task() {
1185 console.log("set_usage_task");
1186 if (jQuery("#usage_task").prop("checked")) {
1187 console.log("Show task fields");
1188 jQuery(".classusetask").show();
1190 console.log("Hide task fields "+jQuery("#usage_task").prop("checked"));
1191 jQuery(".classusetask").hide();
1199 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"' :
'')) .
'> ';
1200 $htmltext = $langs->trans(
"ProjectBillTimeDescription");
1201 print
'<label for="usage_bill_time">'.$form->textwithpicto($langs->trans(
"BillTime"), $htmltext).
'</label>';
1203 print
'$( document ).ready(function() {
1204 jQuery("#usage_bill_time").change(function() {
1205 set_usage_bill_time();
1208 set_usage_bill_time();
1210 function set_usage_bill_time() {
1211 console.log("set_usage_bill_time");
1212 if (jQuery("#usage_bill_time").prop("checked")) {
1213 console.log("Show bill time fields");
1214 jQuery(".classusebilltime").show();
1216 console.log("Hide bill time fields "+jQuery("#usage_bill_time").prop("checked"));
1217 jQuery(".classusebilltime").hide();
1225 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"' :
'')) .
'> ';
1226 $htmltext = $langs->trans(
"EventOrganizationDescriptionLong");
1227 print
'<label for="usage_organize_event">'.$form->textwithpicto($langs->trans(
"ManageOrganizeEvent"), $htmltext).
'</label>';
1229 print
'$( document ).ready(function() {
1230 jQuery("#usage_organize_event").change(function() {
1236 function set_usage_event() {
1237 console.log("set_usage_event");
1238 if (jQuery("#usage_organize_event").prop("checked")) {
1239 console.log("Show organize event fields");
1240 jQuery(".classuseorganizeevent").show();
1242 console.log("Hide organize event fields "+jQuery("#usage_organize_event").prop("checked"));
1243 jQuery(".classuseorganizeevent").hide();
1256 print(!
getDolGlobalString(
'PROJECT_THIRDPARTY_REQUIRED') ?
'' :
'<span class="fieldrequired">');
1257 print $langs->trans(
"ThirdParty");
1264 $text = img_picto(
'',
'company',
'class="pictofixedwidth"');
1265 $text .= $form->select_company(!empty(
$object->thirdparty->id) ?
$object->thirdparty->id :
"",
'socid', $filter,
'None', 1, 0, array(), 0,
'minwidth300');
1267 $texthelp = $langs->trans(
"IfNeedToUseOtherObjectKeepEmpty");
1268 print $form->textwithtooltip($text.
' '.img_help(), $texthelp, 1, 0,
'',
'', 2);
1276 $classfortr = (
$object->usage_opportunity ?
'' :
' hideobject');
1278 print
'<tr class="classuseopportunity'.$classfortr.
'"><td>'.$langs->trans(
"OpportunityStatus").
'</td>';
1281 print $formproject->selectOpportunityStatus(
'opp_status', (
string)
$object->opp_status, 1, 0, 0, 0,
'minwidth150 inline-block valignmiddle', 1, 1);
1284 print
' <input class="width50 right valignmiddle" 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) :
'')).
'"> %';
1285 print
'<span id="oldopppercent" class="opacitymedium"></span>';
1288 print
'<div id="divtocloseproject" class="inline-block valign clearboth paddingtop" style="display: none;">';
1289 print
'<input type="checkbox" id="inputcloseproject" name="closeproject" class="valignmiddle" />';
1290 print
'<label for="inputcloseproject" class="opacitymedium valignmiddle">';
1291 print $form->textwithpicto($langs->trans(
"AlsoCloseAProject"), $langs->trans(
"AlsoCloseAProjectTooltip"));
1299 print
'<tr class="classuseopportunity'.$classfortr.
' "><td>'.$langs->trans(
"OpportunityAmount").
'</td>';
1300 print
'<td><input class="width75 right marginright2" type="text" name="opp_amount" value="'.(GETPOSTISSET(
'opp_amount') ?
GETPOST(
'opp_amount') : (strcmp(
$object->opp_amount,
'') ?
price2num(
$object->opp_amount) :
'')).
'">';
1301 print
'<span class="opacitymedium">'.$langs->getCurrencySymbol(
$conf->currency).
'</span>';
1307 print
'<tr><td>'.$langs->trans(
"Budget").
'</td>';
1308 print
'<td><input class="width75 right marginright2" type="text" name="budget_amount" value="'.(GETPOSTISSET(
'budget_amount') ?
GETPOST(
'budget_amount') : (strcmp(
$object->budget_amount,
'') ?
price2num(
$object->budget_amount) :
'')).
'">';
1309 print
'<span class="opacitymedium">'.$langs->getCurrencySymbol(
$conf->currency).
'</span>';
1314 print
'<tr><td>'.$langs->trans(
"Date").(isModEnabled(
'eventorganization') ?
' <span class="classuseorganizeevent">('.$langs->trans(
"Project").
')</span>' :
'').
'</td><td>';
1315 print $form->selectDate(
$object->date_start ?
$object->date_start : -1,
'projectstart', 0, 0, 0,
'', 1, 0);
1316 print
' <span class="opacitymedium"> '.$langs->trans(
"to").
' </span> ';
1317 print $form->selectDate(
$object->date_end ?
$object->date_end : -1,
'projectend', 0, 0, 0,
'', 1, 0);
1318 $object->getLinesArray(
null, 0);
1320 print
' <span id="divreportdate" class="hidden"> <input type="checkbox" class="valignmiddle" id="reportdate" name="reportdate" value="yes" ';
1321 if ($comefromclone) {
1324 print
'/><label for="reportdate" class="valignmiddle opacitymedium">'.$langs->trans(
"ProjectReportDate").
'</label></span>';
1330 print
'<tr class="classuseorganizeevent"><td>'.$langs->trans(
"Date").
' ('.$langs->trans(
"Event").
')</td><td>';
1331 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);
1332 print
' <span class="opacitymedium"> '.$langs->trans(
"to").
' </span> ';
1333 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);
1337 print
'<tr class="classuseorganizeevent"><td>'.$langs->trans(
"Location").
'</td>';
1338 print
'<td><input class="minwidth300 maxwidth500" type="text" name="location" value="'.dol_escape_htmltag(
GETPOSTISSET(
'location') ?
GETPOST(
'location') :
$object->location).
'"></td>';
1343 print
'<tr><td class="tdtop">'.$langs->trans(
"Description").
'</td>';
1345 $doleditor =
new DolEditor(
'description',
$object->description,
'', 90,
'dolibarr_notes',
'',
false,
true,
isModEnabled(
'fckeditor') &&
getDolGlobalInt(
'FCKEDITOR_ENABLE_SOCIETE'), ROWS_3,
'90%');
1346 $doleditor->Create();
1351 print
'<tr><td>'.$langs->trans(
"Categories").
'</td><td>';
1352 print $form->selectCategories(Categorie::TYPE_PROJECT,
'categories', $object);
1357 print
'<tr><td>'.$langs->trans(
"Visibility").
'</td><td>';
1360 $array[0] = $langs->trans(
"PrivateProject");
1363 $array[1] = $langs->trans(
"SharedProject");
1366 if (count($array) > 0) {
1367 print $form->selectarray(
'public', $array,
$object->public, 0, 0, 0,
'', 0, 0, 0,
'',
'', 1);
1369 print
'<input type="hidden" id="public" name="public" value="'.$object->public.
'">';
1372 print img_picto($langs->trans(
'PrivateProject'),
'private',
'class="paddingrightonly"');
1373 print $langs->trans(
"PrivateProject");
1375 print img_picto($langs->trans(
'SharedProject'),
'world',
'class="paddingrightonly"');
1376 print $langs->trans(
"SharedProject");
1382 $parameters = array();
1383 $reshook = $hookmanager->executeHooks(
'formObjectOptions', $parameters, $object, $action);
1384 print $hookmanager->resPrint;
1385 if (empty($reshook)) {
1386 print
$object->showOptionals($extrafields,
'edit');
1391 print
dol_get_fiche_head($head,
'project', $langs->trans(
"Project"), -1, (
$object->public ?
'projectpub' :
'project'), 0,
'',
'', 0,
'', 1);
1395 if (!empty($_SESSION[
'pageforbacktolist']) && !empty($_SESSION[
'pageforbacktolist'][
'project'])) {
1396 $tmpurl = $_SESSION[
'pageforbacktolist'][
'project'];
1397 $tmpurl = preg_replace(
'/__SOCID__/', (
string)
$object->socid, $tmpurl);
1398 $linkback =
'<a href="'.$tmpurl.(preg_match(
'/\?/', $tmpurl) ?
'&' :
'?').
'restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
1400 $linkback =
'<a href="'.DOL_URL_ROOT.
'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans(
"BackToList").
'</a>';
1403 $morehtmlref =
'<div class="refidno">';
1406 $morehtmlref .=
'<br>';
1408 if (!empty(
$object->thirdparty->id) &&
$object->thirdparty->id > 0) {
1409 $morehtmlref .=
$object->thirdparty->getNomUrl(1,
'project');
1415 $parent->fetch(
$object->fk_project);
1416 $morehtmlref .= $langs->trans(
"Child of").
' '.$parent->getNomUrl(1,
'project').
' '.$parent->title;
1419 $morehtmlref .=
'</div>';
1422 if (!$user->hasRight(
'projet',
'all',
'lire')) {
1423 $objectsListId =
$object->getProjectsAuthorizedForUser($user, 0, 0);
1424 $object->next_prev_filter =
"rowid:IN:".$db->sanitize(count($objectsListId) ? implode(
',', array_keys($objectsListId)) :
'0');
1427 dol_banner_tab($object,
'ref', $linkback, 1,
'ref',
'ref', $morehtmlref);
1429 print
'<div class="fichecenter">';
1430 print
'<div class="fichehalfleft">';
1431 print
'<div class="underbanner clearboth"></div>';
1433 print
'<table class="border tableforfield centpercent">';
1437 print
'<tr><td class="tdtop">';
1438 print $langs->trans(
"Usage");
1442 print
'<input type="checkbox" disabled name="usage_opportunity"'.(GETPOSTISSET(
'usage_opportunity') ? (
GETPOST(
'usage_opportunity',
'alpha') !=
'' ?
' checked="checked"' :
'') : (
$object->usage_opportunity ?
' checked="checked"' :
'')).
'> ';
1443 $htmltext = $langs->trans(
"ProjectFollowOpportunity");
1444 print $form->textwithpicto($langs->trans(
"ProjectFollowOpportunity"), $htmltext);
1448 print
'<input type="checkbox" disabled name="usage_task"'.(GETPOSTISSET(
'usage_task') ? (
GETPOST(
'usage_task',
'alpha') !=
'' ?
' checked="checked"' :
'') : (
$object->usage_task ?
' checked="checked"' :
'')).
'> ';
1449 $htmltext = $langs->trans(
"ProjectFollowTasks");
1450 print $form->textwithpicto($langs->trans(
"ProjectFollowTasks"), $htmltext);
1454 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"' :
'')).
'> ';
1455 $htmltext = $langs->trans(
"ProjectBillTimeDescription");
1456 print $form->textwithpicto($langs->trans(
"BillTime"), $htmltext);
1461 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"' :
'')).
'> ';
1462 $htmltext = $langs->trans(
"EventOrganizationDescriptionLong");
1463 print $form->textwithpicto($langs->trans(
"ManageOrganizeEvent"), $htmltext);
1471 print $form->editfieldkey(
"OpportunityStatus",
'_opp_status', (
string)
$object->opp_status, $object, (
int) $user->hasRight(
'projet',
'creer'),
'string');
1473 $html_name_status = ($action ==
'edit_opp_status') ?
'opp_status' :
'none';
1474 $html_name_percent = ($action ==
'edit_opp_status') ?
'opp_percent' :
'none';
1476 print $formproject->formOpportunityStatus($_SERVER[
'PHP_SELF'].
'?socid='.
$object->id, (
string)
$object->opp_status, $percent_value, $html_name_status, $html_name_percent,
'', 1);
1480 print
'<tr><td>'.$langs->trans(
"OpportunityAmount").
'</td><td>';
1481 if (strcmp(
$object->opp_amount,
'')) {
1482 print
'<span class="amount">'.price(
$object->opp_amount, 0, $langs, 1, 0, -1,
$conf->currency).
'</span>';
1483 if (strcmp(
$object->opp_percent,
'')) {
1484 print
' <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>';
1491 print
'<tr><td>'.$langs->trans(
"Budget").
'</td><td>';
1492 if (!is_null(
$object->budget_amount) && strcmp(
$object->budget_amount,
'')) {
1493 print
'<span class="amount">'.price(
$object->budget_amount, 0, $langs, 1, 0, 0,
$conf->currency).
'</span>';
1498 print
'<tr><td>'.$langs->trans(
"Dates").
'</td><td>';
1500 print($start ? $start :
'?');
1502 print
' <span class="opacitymedium">-</span> ';
1503 print($end ? $end :
'?');
1505 print img_warning(
"Late");
1510 print
'<tr><td class="titlefield">'.$langs->trans(
"Visibility").
'</td><td>';
1512 print img_picto($langs->trans(
'SharedProject'),
'world',
'class="paddingrightonly"');
1513 print $langs->trans(
'SharedProject');
1515 print img_picto($langs->trans(
'PrivateProject'),
'private',
'class="paddingrightonly"');
1516 print $langs->trans(
'PrivateProject');
1522 include DOL_DOCUMENT_ROOT.
'/core/tpl/extrafields_view.tpl.php';
1527 print
'<div class="fichehalfright">';
1528 print
'<div class="underbanner clearboth"></div>';
1530 print
'<table class="border tableforfield centpercent">';
1534 print
'<tr><td class="valignmiddle">'.$langs->trans(
"Categories").
'</td><td>';
1535 print $form->showCategories(
$object->id, Categorie::TYPE_PROJECT, 1);
1540 print
'<tr><td class="titlefield'.($object->description ?
' noborderbottom' :
'').
'" colspan="2">'.$langs->trans(
"Description").
'</td></tr>';
1542 print
'<tr><td class="nottitleforfield" colspan="2">';
1543 print
'<div class="longmessagecut">';
1544 print dolPrintHTML(
$object->description);
1554 print
'<div class="clearboth"></div>';
1559 if ($action ==
'edit' && $userWrite > 0) {
1560 print $form->buttonsSaveCancel();
1566 print
'<script type="text/javascript">
1567 jQuery(document).ready(function() {
1568 jQuery("#usage_task").change(function() {
1569 console.log("We click on usage task "+jQuery("#usage_task").is(":checked"));
1570 if (! jQuery("#usage_task").is(":checked")) {
1571 jQuery("#usage_bill_time").prop("checked", false);
1575 jQuery("#usage_bill_time").change(function() {
1576 console.log("We click on usage to bill time");
1577 if (jQuery("#usage_bill_time").is(":checked")) {
1578 jQuery("#usage_task").prop("checked", true);
1582 jQuery("#projectstart").change(function() {
1583 console.log("We modify the start date");
1584 jQuery("#divreportdate").show();
1592 $defaultcheckedwhenoppclose = 1;
1594 $defaultcheckedwhenoppclose = 0;
1597 print
'<!-- Javascript to manage opportunity status change -->';
1598 print
'<script type="text/javascript">
1599 jQuery(document).ready(function() {
1600 function change_percent()
1602 var element = jQuery("#opp_status option:selected");
1603 var defaultpercent = element.attr("defaultpercent");
1604 var defaultcloseproject = '.((int) $defaultcheckedwhenoppclose).
';
1605 var elemcode = element.attr("elemcode");
1608 console.log(
"We select "+elemcode);
1611 var closeproject = 0;
1612 if (elemcode == \
'LOST\') closeproject = 1;
1613 if (elemcode == \'WON\') closeproject = defaultcloseproject;
1614 if (closeproject) jQuery("#inputcloseproject").prop("checked", true);
1615 else jQuery("#inputcloseproject").prop("checked", false);
1617 /* Make the close project checkbox visible or not */
1618 console.log("closeproject="+closeproject);
1619 if (elemcode == \'WON\' || elemcode == \'LOST\')
1621 jQuery("#divtocloseproject").show();
1625 jQuery("#divtocloseproject").hide();
1628 /* Note: defaultpercent and oldpercent hold raw DB values (double(5,2), ie "100.00"),
1629 so they are already in universal numeric format and must not go through price2numjs(),
1630 which would strip the "." as a thousand separator in languages like de_DE. */
1631 /* Change percent with default percent (defaultpercent) if new status (defaultpercent) is higher than current (jQuery("#opp_percent").val()) */
1632 if (oldpercent != \'\' && (parseFloat(defaultpercent) < parseFloat(oldpercent)))
1634 console.log("oldpercent="+oldpercent+" defaultpercent="+defaultpercent+" def < old");
1635 if (jQuery("#opp_percent").val() != \'\' && oldpercent != \'\') {
1636 jQuery("#oldopppercent").text(\' - '.
dol_escape_js($langs->transnoentities(
"PreviousValue")).
': \'+parseFloat(oldpercent)+\' %\');
1639 if (parseFloat(oldpercent) != 100 && elemcode != \'LOST\') { jQuery("#opp_percent").val(parseFloat(oldpercent)); }
1640 else { jQuery("#opp_percent").val(parseFloat(defaultpercent)); }
1642 console.log("oldpercent="+oldpercent+" defaultpercent="+defaultpercent);
1643 if (jQuery("#opp_percent").val() == \'\' || (parseFloat(jQuery("#opp_percent").val()) < parseFloat(defaultpercent))) {
1644 if (jQuery("#opp_percent").val() != \'\' && oldpercent != \'\') {
1645 jQuery("#oldopppercent").text(\' - '.
dol_escape_js($langs->transnoentities(
"PreviousValue")).
': \'+parseFloat(oldpercent)+\' %\');
1647 jQuery("#opp_percent").val(parseFloat(defaultpercent));
1652 jQuery("#opp_status").change(function() {
1664 print
'<div class="tabsAction">';
1665 $parameters = array();
1666 $reshook = $hookmanager->executeHooks(
'addMoreActionsButtons', $parameters, $object, $action);
1668 if (empty($reshook)) {
1669 if ($action !=
"edit" && $action !=
'presend') {
1679 if (empty($user->socid)) {
1681 print dolGetButtonAction(
'', $langs->trans(
'SendMail'),
'email', $_SERVER[
"PHP_SELF"].
'?action=presend&token='.
newToken().
'&id='.
$object->id.
'&mode=init#formmailbeforetitle',
'');
1701 if ($userWrite > 0) {
1702 print dolGetButtonAction(
'', $langs->trans(
'SetToDraft'),
'default', $_SERVER[
"PHP_SELF"].
'?action=confirm_setdraft&confirm=yes&token='.
newToken().
'&id='.
$object->id,
'');
1704 print dolGetButtonAction($langs->trans(
'NotOwnerOfProject'), $langs->trans(
'SetToDraft'),
'default', $_SERVER[
'PHP_SELF'].
'#',
'',
false);
1711 if ($userWrite > 0) {
1712 print dolGetButtonAction(
'', $langs->trans(
'Modify'),
'default', $_SERVER[
"PHP_SELF"].
'?action=edit&token='.
newToken().
'&id='.
$object->id,
'');
1714 print dolGetButtonAction($langs->trans(
'NotOwnerOfProject'), $langs->trans(
'Modify'),
'default', $_SERVER[
'PHP_SELF'].
'#',
'',
false);
1720 if ($userWrite > 0) {
1722 print dolGetButtonAction(
'', $langs->trans(
'Validate'),
'default', $_SERVER[
"PHP_SELF"].
'?action=confirm_validate&confirm=yes&token='.
newToken().
'&id='.
$object->id,
'');
1724 print dolGetButtonAction($langs->trans(
'NotOwnerOfProject'), $langs->trans(
'Validate'),
'default', $_SERVER[
'PHP_SELF'].
'#',
'',
false);
1730 if ($userWrite > 0) {
1732 print dolGetButtonAction(
'', $langs->trans(
'Close'),
'default', $_SERVER[
"PHP_SELF"].
'?action=confirm_close&confirm=yes&token='.
newToken().
'&id='.
$object->id,
'');
1734 print dolGetButtonAction($langs->trans(
'NotOwnerOfProject'), $langs->trans(
'Close'),
'default', $_SERVER[
'PHP_SELF'].
'#',
'',
false);
1740 if ($userWrite > 0) {
1741 print dolGetButtonAction(
'', $langs->trans(
'ReOpen'),
'default', $_SERVER[
"PHP_SELF"].
'?action=reopen&token='.
newToken().
'&id='.
$object->id,
'');
1743 print dolGetButtonAction($langs->trans(
'NotOwnerOfProject'), $langs->trans(
'ReOpen'),
'default', $_SERVER[
'PHP_SELF'].
'#',
'',
false);
1751 $is_customer_or_prospect = (!empty(
$object->thirdparty->prospect) || !empty(
$object->thirdparty->client));
1752 $is_supplier_only= (!empty(
$object->thirdparty->fournisseur) && !$is_customer_or_prospect);
1754 $arrayforbutaction = array(
1755 10 => array(
'lang'=>
'propal',
'enabled' => (
isModEnabled(
"propal") && $is_customer_or_prospect),
'perm' => $user->hasRight(
'propal',
'creer') ?
true : false,
'label' =>
'AddProp',
'url'=>
'/comm/propal/card.php?action=create&projectid='.
$object->id.
'&socid='.
$object->socid),
1756 20 => array(
'lang'=>
'orders',
'enabled' => (
isModEnabled(
"order") && $is_customer_or_prospect),
'perm' => $user->hasRight(
'commande',
'creer') ? true : false,
'label' =>
'CreateOrder',
'url'=>
'/commande/card.php?action=create&projectid='.
$object->id.
'&socid='.
$object->socid),
1757 30 => array(
'lang'=>
'bills',
'enabled' => (
isModEnabled(
"invoice") && $is_customer_or_prospect),
'perm' => $user->hasRight(
'facture',
'creer') ? true : false,
'label' =>
'CreateBill',
'url'=>
'/compta/facture/card.php?action=create&projectid='.
$object->id.
'&socid='.
$object->socid),
1758 40 => array(
'lang'=>
'supplier_proposal',
'enabled' =>
isModEnabled(
"supplier_proposal"),
'perm' => $user->hasRight(
'supplier_proposal',
'creer') ? true : false,
'label' =>
'AddSupplierProposal',
'url'=>
'/supplier_proposal/card.php?action=create&projectid='.
$object->id.($is_supplier_only ?
'&socid='.
$object->socid :
'')),
1759 50 => array(
'lang'=>
'suppliers',
'enabled' =>
isModEnabled(
"supplier_order"),
'perm' => $user->hasRight(
'fournisseur',
'commande',
'creer') ? true : false,
'label' =>
'AddSupplierOrder',
'url'=>
'/fourn/commande/card.php?action=create&projectid='.
$object->id.($is_supplier_only ?
'&socid='.
$object->socid :
'')),
1760 60 => array(
'lang'=>
'suppliers',
'enabled' =>
isModEnabled(
"supplier_invoice"),
'perm' => $user->hasRight(
'fournisseur',
'facture',
'creer') ? true : false,
'label' =>
'AddSupplierInvoice',
'url'=>
'/fourn/facture/card.php?action=create&projectid='.
$object->id.($is_supplier_only ?
'&socid='.
$object->socid :
'')),
1761 70 => array(
'lang'=>
'interventions',
'enabled' =>
isModEnabled(
"intervention"),
'perm' => $user->hasRight(
'fichinter',
'creer') ? true : false,
'label' =>
'AddIntervention',
'url'=>
'/fichinter/card.php?action=create&projectid='.
$object->id.
'&socid='.
$object->socid),
1762 80 => array(
'lang'=>
'contracts',
'enabled' =>
isModEnabled(
"contract"),
'perm' => $user->hasRight(
'contrat',
'creer') ? true : false,
'label' =>
'AddContract',
'url'=>
'/contrat/card.php?action=create&projectid='.
$object->id.
'&socid='.
$object->socid),
1763 90 => array(
'lang'=>
'trips',
'enabled' =>
isModEnabled(
"expensereport"),
'perm' => $user->hasRight(
'expensereport',
'creer') ? true : false,
'label' =>
'AddTrip',
'url'=>
'/expensereport/card.php?action=create&projectid='.
$object->id.
'&socid='.
$object->socid),
1764 100 => array(
'lang'=>
'donations',
'enabled' =>
isModEnabled(
"don"),
'perm' => $user->hasRight(
'don',
'creer') ? true : false,
'label' =>
'AddDonation',
'url'=>
'/don/card.php?action=create&projectid='.
$object->id.
'&socid='.
$object->socid),
1767 $params = array(
'backtopage' => $_SERVER[
"PHP_SELF"].
'?id='.
$object->id);
1770 print dolGetButtonAction(
'', $langs->trans(
"Create"),
'default', $arrayforbutaction,
'', 1, $params);
1774 if ($user->hasRight(
'projet',
'creer')) {
1775 if ($userWrite > 0) {
1776 print dolGetButtonAction($langs->trans(
'ToClone'), $langs->trans(
'ToClone'),
'clone', $_SERVER[
"PHP_SELF"].
'?action=clone&token='.
newToken().
'&id='.((
int)
$object->id),
'',
true, array(
'attr' => array(
'class' =>
'reposition')));
1778 print dolGetButtonAction($langs->trans(
'NotOwnerOfProject'), $langs->trans(
'ToClone'),
'clone', $_SERVER[
'PHP_SELF'].
'#',
'',
false, array(
'attr' => array(
'class' =>
'reposition')));
1785 print dolGetButtonAction($langs->trans(
'Delete'), $langs->trans(
'Delete'),
'delete', $_SERVER[
"PHP_SELF"].
'?action=delete&token='.
newToken().
'&id='.
$object->id,
'',
true, array(
'attr' => array(
'class' =>
'reposition'))).
"\n";
1787 print dolGetButtonAction($langs->trans(
'NotOwnerOfProject'), $langs->trans(
'Delete'),
'delete', $_SERVER[
'PHP_SELF'].
'#',
'',
false);
1795 if (
GETPOST(
'modelselected')) {
1796 $action =
'presend';
1799 if ($action !=
'presend') {
1800 print
'<div class="fichecenter"><div class="fichehalfleft">';
1801 print
'<a name="builddoc"></a>';
1807 $children =
$object->getChildren();
1809 print
'<table class="centpercent notopnoleftnoright table-fiche-title">';
1810 print
'<tr class="titre"><td class="nobordernopadding valignmiddle col-title">';
1811 print
'<div class="titre inline-block">'.$langs->trans(
'Sub-projects').
'</div>';
1812 print
'</td></tr></table>';
1814 print
'<div class="div-table-responsive-no-min">';
1815 print
'<table class="centpercent noborder'.(!empty($morecss) ?
' '.$morecss :
'').
'">';
1816 print
'<tr class="liste_titre">';
1817 print
getTitleFieldOfList(
'Ref', 0, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'',
'',
'',
'', 1);
1818 print
getTitleFieldOfList(
'Title', 0, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'',
'',
'',
'', 1);
1819 print
getTitleFieldOfList(
'Status', 0, $_SERVER[
"PHP_SELF"],
'',
'',
'',
'',
'',
'',
'', 1);
1823 $subproject =
new Project($db);
1824 foreach ($children as $child) {
1825 $subproject->fetch($child->rowid);
1826 print
'<tr class="oddeven">';
1827 print
'<td class="nowraponall">'.$subproject->getNomUrl(1,
'project').
'</td>';
1828 print
'<td class="nowraponall tdoverflowmax125">'.$child->title.
'</td>';
1829 print
'<td class="nowraponall">'.$subproject->getLibStatut(5).
'</td>';
1843 $urlsource = $_SERVER[
"PHP_SELF"].
"?id=".
$object->id;
1844 $genallowed = ($user->hasRight(
'projet',
'lire') && $userAccess > 0);
1845 $delallowed = ($user->hasRight(
'projet',
'creer') && $userWrite > 0);
1847 print $formfile->showdocuments(
'project', $filename, $filedir, $urlsource, (
int) $genallowed, (int) $delallowed,
$object->model_pdf, 1, 0, 0, 0, 0,
'',
'',
'',
'',
'', $object);
1849 print
'</div><div class="fichehalfright">';
1853 $morehtmlcenter =
'<div class="nowraponall">';
1854 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'FullConversation'),
'',
'fa fa-comments imgforviewmode', DOL_URL_ROOT.
'/projet/messaging.php?id='.
$object->id);
1855 $morehtmlcenter .=
dolGetButtonTitle($langs->trans(
'FullList'),
'',
'fa fa-bars imgforviewmode', DOL_URL_ROOT.
'/projet/agenda.php?id='.
$object->id);
1856 $morehtmlcenter .=
'</div>';
1859 include_once DOL_DOCUMENT_ROOT.
'/core/class/html.formactions.class.php';
1861 $somethingshown = $formactions->showactions($object,
'project', 0, 1,
'', $MAXEVENT,
'', $morehtmlcenter);
1863 print
'</div></div>';
1867 $modelmail =
'project';
1868 $defaulttopic =
'SendProjectRef';
1869 $defaulttopiclang =
'projects';
1871 $autocopy =
'MAIN_MAIL_AUTOCOPY_PROJECT_TO';
1872 $trackid =
'proj'.$object->id;
1874 include DOL_DOCUMENT_ROOT.
'/core/tpl/card_presend.tpl.php';
1877 $parameters = array();
1878 $reshook = $hookmanager->executeHooks(
'mainCardTabAddMore', $parameters, $object, $action);
$id
Support class for third parties, contacts, members, users or resources.
if(! $sortfield) if(! $sortorder) $object
ajax_combobox($htmlname, $events=array(), $minLengthToAutocomplete=0, $forcefocus=0, $widthTypeOfAutocomplete='resolve', $idforemptyvalue='-1', $morecss='', $placeholder='')
Convert a html select field into an ajax combobox.
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
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.
Class to manage a WYSIWYG editor.
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 translations.
Class to manage Dolibarr users.
print $langs trans("Ref").' m titre as m m statut as status
Or an array listing all the potential status of the object: array: int of the status => translated la...
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.
$date_start
Variables from include:
dol_now($mode='gmt')
Return date for now.
recordNotFound($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Displays an error page when a record is not found.
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...
dol_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='', $useCache=true)
Return an id or code from a code or id.
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.
price2num($amount, $rounding='', $option=0)
Function that return a number with universal decimal format (decimal separator is '.
dol_eval($s, $returnvalue=1, $hideerrors=1, $onlysimplestring='1')
Replace eval function to add more security.
dol_sanitizeFileName($str, $newstr='_', $unaccent=1, $includequotes=0, $allowdash=0)
Clean a string to use it as a file name.
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.
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.
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'.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0, $nodefault=0)
Return value of a param into GET or POST supervariable.
GETPOSTFLOAT($paramname, $rounding='', $option=2)
Return the value of a $_GET or $_POST supervariable, converted into float.
GETPOSTINT($paramname, $method=0, $nodefault=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
dol_buildpath($path, $type=0, $returnemptyifnotfound=0)
Return path of url or filesystem.
dol_clone($srcobject, $native=2)
Create a clone of instance of object (new instance with same value for each properties) With native =...
dol_print_date($time, $format='', $tzoutput='auto', $outputlangs=null, $encodetooutput=false, $decorate=0)
Output date in a string format according to outputlangs (or langs if not defined).
GETPOSTISSET($paramname)
Return true if we are in a context of submitting the parameter $paramname from a POST of a form.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_get_fiche_head($links=array(), $active='', $title='', $notab=0, $picto='', $pictoisfullpath=0, $morehtmlright='', $morecss='', $limittoshow=0, $moretabssuffix='', $dragdropfile=0, $morecssdiv='')
Show tabs of a record.
dolButtonToOpenUrlInDialogPopup($name, $label, $buttonstring, $url, $disabled='', $morecss='classlink button bordertransp', $jsonopen='', $jsonclose='', $accesskey='')
Return HTML code to output a button to open a dialog popup box.
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.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
getTitleFieldOfList($name, $thead=0, $file="", $field="", $begin="", $moreparam="", $moreattrib="", $sortfield="", $sortorder="", $prefix="", $disablesortlink=0, $tooltip='', $forcenowrapcolumntitle=0)
Get title line of an array.
load_fiche_titre($title, $morehtmlright='', $picto='generic', $pictoisfullpath=0, $id='', $morecssontable='', $morehtmlcenter='', $morecssonpicto='widthpictotitle')
Load a title with picto.
dol_escape_htmltag($stringtoescape, $keepb=0, $keepn=0, $noescapetags='', $escapeonlyhtmltags=0, $cleanalsojavascript=0)
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, $nodie=0, $mode='')
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.