dolibarr 21.0.0-beta
comment.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3 * Copyright (C) 2006-2017 Laurent Destailleur <eldy@users.sourceforge.net>
4 * Copyright (C) 2010-2012 Regis Houssin <regis.houssin@inodbox.com>
5 * Copyright (C) 2024 Frédéric France <frederic.france@free.fr>
6 * Copyright (C) 2024 MDW <mdeweerd@users.noreply.github.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 3 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
28require "../../main.inc.php";
29require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
30require_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php';
31require_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php';
32require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
33require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
34require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
35require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
36require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php';
37require_once DOL_DOCUMENT_ROOT.'/core/modules/project/task/modules_task.php';
38
47// Load translation files required by the page
48$langs->loadLangs(array('projects', 'companies'));
49
50$id = GETPOSTINT('id');
51$idcomment = GETPOSTINT('idcomment');
52$ref = GETPOST("ref", 'alpha', 1); // task ref
53$objectref = GETPOST("taskref", 'alpha'); // task ref
54$action = GETPOST('action', 'aZ09');
55$confirm = GETPOST('confirm', 'alpha');
56$withproject = GETPOSTINT('withproject');
57$project_ref = GETPOST('project_ref', 'alpha');
58$planned_workload = ((GETPOSTINT('planned_workloadhour') != '' || GETPOSTINT('planned_workloadmin') != '') ? (GETPOSTINT('planned_workloadhour') > 0 ? GETPOSTINT('planned_workloadhour') * 3600 : 0) + (GETPOSTINT('planned_workloadmin') > 0 ? GETPOSTINT('planned_workloadmin') * 60 : 0) : '');
59$mode = GETPOST('mode', 'alpha');
60
61// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context
62$hookmanager->initHooks(array('projecttaskcommentcard', 'globalcard'));
63
64$object = new Task($db);
65$extrafields = new ExtraFields($db);
66$projectstatic = new Project($db);
67
68// fetch optionals attributes and labels
69$extrafields->fetch_name_optionals_label($object->table_element);
70
71// include comment actions
72include DOL_DOCUMENT_ROOT.'/core/actions_comments.inc.php';
73
74// Security check
75$socid = 0;
76// Retrieve First Task ID of Project if withprojet is on to allow project prev next to work
77if (!empty($project_ref) && !empty($withproject)) {
78 if ($projectstatic->fetch(0, $project_ref) > 0) {
79 $objectsarray = $object->getTasksArray(0, 0, $projectstatic->id, $socid, 0);
80 if (count($objectsarray) > 0) {
81 $id = $objectsarray[0]->id;
82 } else {
83 header("Location: ".DOL_URL_ROOT.'/projet/tasks.php?id='.$projectstatic->id.(empty($mode) ? '' : '&mode='.$mode));
84 }
85 }
86}
87
88
89if ($id > 0 || $ref) {
90 $object->fetch($id, $ref);
91}
92
93restrictedArea($user, 'projet', $object->fk_project, 'projet&project');
94
95
96/*
97 * Actions
98 */
99
100// None
101
102
103/*
104 * View
105 */
106
107llxHeader('', $langs->trans("CommentPage"), '', '', 0, 0, '', '', '', 'mod-project project-tasks page-task_comment');
108
109$form = new Form($db);
110$formother = new FormOther($db);
111$formfile = new FormFile($db);
112
113if ($id > 0 || !empty($ref)) {
114 if ($object->fetch($id, $ref) > 0) {
115 $result = $object->fetch_optionals();
116
117 $result = $object->fetchComments();
118 if ($result < 0) {
119 setEventMessages($object->error, $object->errors, 'errors');
120 }
121
122 $result = $projectstatic->fetch($object->fk_project);
123 if (!empty($projectstatic->socid)) {
124 $projectstatic->fetch_thirdparty();
125 }
126 if (getDolGlobalString('PROJECT_ALLOW_COMMENT_ON_PROJECT') && method_exists($projectstatic, 'fetchComments') && empty($projectstatic->comments)) {
127 $projectstatic->fetchComments();
128 }
129
130 $object->project = clone $projectstatic;
131
132 $userWrite = $projectstatic->restrictedProjectArea($user, 'write');
133
134 if (!empty($withproject)) {
135 // Tabs for project
136 $tab = 'tasks';
137 $head = project_prepare_head($projectstatic);
138 print dol_get_fiche_head($head, $tab, $langs->trans("Project"), -1, ($projectstatic->public ? 'projectpub' : 'project'));
139
140 $param = ($mode == 'mine' ? '&mode=mine' : '');
141
142 // Project card
143
144 $linkback = '<a href="'.DOL_URL_ROOT.'/projet/list.php?restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>';
145
146 $morehtmlref = '<div class="refidno">';
147 // Title
148 $morehtmlref .= $projectstatic->title;
149 // Thirdparty
150 if ($projectstatic->thirdparty->id > 0) {
151 $morehtmlref .= '<br>'.$projectstatic->thirdparty->getNomUrl(1, 'project');
152 }
153 $morehtmlref .= '</div>';
154
155 // Define a complementary filter for search of next/prev ref.
156 if (!$user->hasRight('projet', 'all', 'lire')) {
157 $objectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 0);
158 $projectstatic->next_prev_filter = "rowid:IN:(".$db->sanitize(count($objectsListId) ? implode(',', array_keys($objectsListId)) : '0').")";
159 }
160
161 dol_banner_tab($projectstatic, 'project_ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
162
163 print '<div class="fichecenter">';
164 print '<div class="fichehalfleft">';
165 print '<div class="underbanner clearboth"></div>';
166
167 print '<table class="border centpercent">';
168
169 // Usage
170 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES') || !getDolGlobalString('PROJECT_HIDE_TASKS') || isModEnabled('eventorganization')) {
171 print '<tr><td class="tdtop">';
172 print $langs->trans("Usage");
173 print '</td>';
174 print '<td>';
175 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES')) {
176 print '<input type="checkbox" disabled name="usage_opportunity"'.(GETPOSTISSET('usage_opportunity') ? (GETPOST('usage_opportunity', 'alpha') != '' ? ' checked="checked"' : '') : ($projectstatic->usage_opportunity ? ' checked="checked"' : '')).'"> ';
177 $htmltext = $langs->trans("ProjectFollowOpportunity");
178 print $form->textwithpicto($langs->trans("ProjectFollowOpportunity"), $htmltext);
179 print '<br>';
180 }
181 if (!getDolGlobalString('PROJECT_HIDE_TASKS')) {
182 print '<input type="checkbox" disabled name="usage_task"'.(GETPOSTISSET('usage_task') ? (GETPOST('usage_task', 'alpha') != '' ? ' checked="checked"' : '') : ($projectstatic->usage_task ? ' checked="checked"' : '')).'"> ';
183 $htmltext = $langs->trans("ProjectFollowTasks");
184 print $form->textwithpicto($langs->trans("ProjectFollowTasks"), $htmltext);
185 print '<br>';
186 }
187 if (!getDolGlobalString('PROJECT_HIDE_TASKS') && getDolGlobalString('PROJECT_BILL_TIME_SPENT')) {
188 print '<input type="checkbox" disabled name="usage_bill_time"'.(GETPOSTISSET('usage_bill_time') ? (GETPOST('usage_bill_time', 'alpha') != '' ? ' checked="checked"' : '') : ($projectstatic->usage_bill_time ? ' checked="checked"' : '')).'"> ';
189 $htmltext = $langs->trans("ProjectBillTimeDescription");
190 print $form->textwithpicto($langs->trans("BillTime"), $htmltext);
191 print '<br>';
192 }
193 if (isModEnabled('eventorganization')) {
194 print '<input type="checkbox" disabled name="usage_organize_event"'.(GETPOSTISSET('usage_organize_event') ? (GETPOST('usage_organize_event', 'alpha') != '' ? ' checked="checked"' : '') : ($projectstatic->usage_organize_event ? ' checked="checked"' : '')).'"> ';
195 $htmltext = $langs->trans("EventOrganizationDescriptionLong");
196 print $form->textwithpicto($langs->trans("ManageOrganizeEvent"), $htmltext);
197 }
198 print '</td></tr>';
199 }
200
201 // Visibility
202 print '<tr><td class="titlefield">'.$langs->trans("Visibility").'</td><td>';
203 if ($projectstatic->public) {
204 print img_picto($langs->trans('SharedProject'), 'world', 'class="paddingrightonly"');
205 print $langs->trans('SharedProject');
206 } else {
207 print img_picto($langs->trans('PrivateProject'), 'private', 'class="paddingrightonly"');
208 print $langs->trans('PrivateProject');
209 }
210 print '</td></tr>';
211
212 // Opportunities
213 if (getDolGlobalString('PROJECT_USE_OPPORTUNITIES') && !empty($object->usage_opportunity)) {
214 // Opportunity status
215 print '<tr><td>'.$langs->trans("OpportunityStatus").'</td><td>';
216 $code = dol_getIdFromCode($db, $projectstatic->opp_status, 'c_lead_status', 'rowid', 'code');
217 if ($code) {
218 print $langs->trans("OppStatus".$code);
219 }
220 print '</td></tr>';
221
222 // Opportunity percent
223 print '<tr><td>'.$langs->trans("OpportunityProbability").'</td><td>';
224 if (strcmp($projectstatic->opp_percent, '')) {
225 print price($projectstatic->opp_percent, 0, $langs, 1, 0).' %';
226 }
227 print '</td></tr>';
228
229 // Opportunity Amount
230 print '<tr><td>'.$langs->trans("OpportunityAmount").'</td><td>';
231 if (strcmp($projectstatic->opp_amount, '')) {
232 print price($projectstatic->opp_amount, 0, $langs, 1, 0, -1, $conf->currency);
233 if (strcmp($projectstatic->opp_percent, '')) {
234 print ' &nbsp; &nbsp; &nbsp; <span title="'.dol_escape_htmltag($langs->trans('OpportunityWeightedAmount')).'"><span class="opacitymedium">'.$langs->trans("OpportunityWeightedAmountShort").'</span>: <span class="amount">'.price($projectstatic->opp_amount * $projectstatic->opp_percent / 100, 0, $langs, 1, 0, -1, $conf->currency).'</span></span>';
235 }
236 }
237 print '</td></tr>';
238 }
239
240 // Budget
241 print '<tr><td>'.$langs->trans("Budget").'</td><td>';
242 if (strcmp($projectstatic->budget_amount, '')) {
243 print price($projectstatic->budget_amount, 0, $langs, 1, 0, 0, $conf->currency);
244 }
245 print '</td></tr>';
246
247 // Date start - end project
248 print '<tr><td>'.$langs->trans("Dates").'</td><td>';
249 $start = dol_print_date($projectstatic->date_start, 'day');
250 print($start ? $start : '?');
251 $end = dol_print_date($projectstatic->date_end, 'day');
252 print ' - ';
253 print($end ? $end : '?');
254 if ($projectstatic->hasDelay()) {
255 print img_warning("Late");
256 }
257 print '</td></tr>';
258
259 // Other attributes
260 $cols = 2;
261 //include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php';
262
263 print '</table>';
264
265 print '</div>';
266 print '<div class="fichehalfright">';
267 print '<div class="underbanner clearboth"></div>';
268
269 print '<table class="border centpercent">';
270
271 // Description
272 print '<td class="titlefield tdtop">'.$langs->trans("Description").'</td><td>';
273 print nl2br($projectstatic->description);
274 print '</td></tr>';
275
276 // Categories
277 if (isModEnabled('category')) {
278 print '<tr><td class="valignmiddle">'.$langs->trans("Categories").'</td><td>';
279 print $form->showCategories($projectstatic->id, 'project', 1);
280 print "</td></tr>";
281 }
282
283 print '</table>';
284
285 print '</div>';
286 print '</div>';
287
288 print '<div class="clearboth"></div>';
289
290 print dol_get_fiche_end();
291
292 print '<br>';
293 }
294
295 $head = task_prepare_head($object);
296
297 /*
298 * Fiche tache en mode visu
299 */
300 $param = ($withproject ? '&withproject=1' : '');
301 $linkback = $withproject ? '<a href="'.DOL_URL_ROOT.'/projet/tasks.php?id='.$projectstatic->id.'&restore_lastsearch_values=1">'.$langs->trans("BackToList").'</a>' : '';
302
303 print dol_get_fiche_head($head, 'task_comment', $langs->trans("Task"), -1, 'projecttask');
304
305 if ($action == 'delete') {
306 print $form->formconfirm($_SERVER["PHP_SELF"]."?id=".GETPOSTINT("id").'&withproject='.$withproject, $langs->trans("DeleteATask"), $langs->trans("ConfirmDeleteATask"), "confirm_delete");
307 }
308
309 if (!GETPOST('withproject') || empty($projectstatic->id)) {
310 $projectsListId = $projectstatic->getProjectsAuthorizedForUser($user, 0, 1);
311 $object->next_prev_filter = "fk_projet:IN:(".$db->sanitize($projectsListId).")";
312 } else {
313 $object->next_prev_filter = "fk_projet:=:".((int) $projectstatic->id);
314 }
315
316 $morehtmlref = '';
317
318 // Project
319 if (empty($withproject)) {
320 $morehtmlref .= '<div class="refidno">';
321 $morehtmlref .= $langs->trans("Project").': ';
322 $morehtmlref .= $projectstatic->getNomUrl(1);
323 $morehtmlref .= '<br>';
324
325 // Third party
326 $morehtmlref .= $langs->trans("ThirdParty").': ';
327 if (!empty($projectstatic->thirdparty)) {
328 $morehtmlref .= $projectstatic->thirdparty->getNomUrl(1);
329 }
330 $morehtmlref .= '</div>';
331 }
332
333 dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref, $param);
334
335 print '<div class="fichecenter">';
336
337 print '<div class="underbanner clearboth"></div>';
338 print '<table class="border centpercent">';
339
340 // Nb comments
341 print '<td class="titlefield">'.$langs->trans("NbComments").'</td><td>';
342 print $object->getNbComments();
343 print '</td></tr>';
344
345 // Other attributes
346 $cols = 3;
347 $parameters = array('socid' => $socid);
348 include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_view.tpl.php';
349
350 print '</table>';
351
352 print '</div>';
353
354 print dol_get_fiche_end();
355
356
357 // Include comment tpl view
358 include DOL_DOCUMENT_ROOT.'/core/tpl/bloc_comment.tpl.php';
359 }
360}
361
362// End of page
363llxFooter();
364$db->close();
$id
Definition account.php:48
if( $user->socid > 0) if(! $user->hasRight('accounting', 'chartofaccount')) $object
Definition card.php:66
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:71
Class to manage standard extra fields.
Class to offer components to list and upload files.
Class to manage generation of HTML components Only common components must be here.
Class permettant la generation de composants html autre Only common components are here.
Class to manage projects.
Class to manage tasks.
llxFooter()
Footer empty.
Definition document.php:107
setEventMessages($mesg, $mesgs, $style='mesgs', $messagekey='', $noduplicate=0, $attop=0)
Set event messages in dol_events session object.
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.
dol_get_fiche_end($notab=0)
Return tab footer of a card.
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_getIdFromCode($db, $key, $tablename, $fieldkey='code', $fieldid='id', $entityfilter=0, $filters='')
Return an id or code from a code or id.
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).
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
global $conf
The following vars must be defined: $type2label $form $conf, $lang, The following vars may also be de...
Definition member.php:79
task_prepare_head($object)
Prepare array with list of tabs.
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.