mirror of
https://github.com/Dolibarr/dolibarr.git
synced 2025-12-06 09:38:23 +01:00
missing import_key field, ref generator parameter must be task not project, import must use css, serious database integrity problem accepting duplicate tasks.
534 lines
18 KiB
PHP
534 lines
18 KiB
PHP
<?php
|
|
/* Copyright (C) 2005 Rodolphe Quiedeville <rodolphe@quiedeville.org>
|
|
* Copyright (C) 2004-2015 Laurent Destailleur <eldy@users.sourceforge.net>
|
|
* Copyright (C) 2005-2012 Regis Houssin <regis.houssin@capnetworks.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/**
|
|
* \file htdocs/projet/tasks.php
|
|
* \ingroup projet
|
|
* \brief List all tasks of a project
|
|
*/
|
|
|
|
require ("../main.inc.php");
|
|
require_once DOL_DOCUMENT_ROOT.'/projet/class/project.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/projet/class/task.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/project.lib.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php';
|
|
require_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php';
|
|
|
|
$langs->load("users");
|
|
$langs->load("projects");
|
|
|
|
$action = GETPOST('action', 'alpha');
|
|
$id = GETPOST('id', 'int');
|
|
$ref = GETPOST('ref', 'alpha');
|
|
$taskref = GETPOST('taskref', 'alpha');
|
|
$backtopage=GETPOST('backtopage','alpha');
|
|
$cancel=GETPOST('cancel');
|
|
|
|
$mode = GETPOST('mode', 'alpha');
|
|
$mine = ($mode == 'mine' ? 1 : 0);
|
|
//if (! $user->rights->projet->all->lire) $mine=1; // Special for projects
|
|
|
|
$object = new Project($db);
|
|
$taskstatic = new Task($db);
|
|
$extrafields_project = new ExtraFields($db);
|
|
$extrafields_task = new ExtraFields($db);
|
|
|
|
include DOL_DOCUMENT_ROOT.'/core/actions_fetchobject.inc.php'; // Must be include, not include_once
|
|
|
|
if ($id > 0 || ! empty($ref))
|
|
{
|
|
// fetch optionals attributes and labels
|
|
$extralabels_projet=$extrafields_project->fetch_name_optionals_label($object->table_element);
|
|
}
|
|
$extralabels_task=$extrafields_task->fetch_name_optionals_label($taskstatic->table_element);
|
|
|
|
// Security check
|
|
$socid=0;
|
|
if ($user->societe_id > 0) $socid = $user->societe_id;
|
|
$result = restrictedArea($user, 'projet', $id,'projet&project');
|
|
|
|
// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
|
|
$hookmanager->initHooks(array('projecttaskcard','globalcard'));
|
|
|
|
$progress=GETPOST('progress', 'int');
|
|
$label=GETPOST('label', 'alpha');
|
|
$description=GETPOST('description');
|
|
$planned_workload=GETPOST('planned_workloadhour')*3600+GETPOST('planned_workloadmin')*60;
|
|
|
|
$userAccess=0;
|
|
|
|
|
|
|
|
/*
|
|
* Actions
|
|
*/
|
|
|
|
if ($action == 'createtask' && $user->rights->projet->creer)
|
|
{
|
|
$error=0;
|
|
|
|
$date_start = dol_mktime($_POST['dateohour'],$_POST['dateomin'],0,$_POST['dateomonth'],$_POST['dateoday'],$_POST['dateoyear'],'user');
|
|
$date_end = dol_mktime($_POST['dateehour'],$_POST['dateemin'],0,$_POST['dateemonth'],$_POST['dateeday'],$_POST['dateeyear'],'user');
|
|
|
|
if (! $cancel)
|
|
{
|
|
if (empty($taskref))
|
|
{
|
|
setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Ref")), null, 'errors');
|
|
$action='create';
|
|
$error++;
|
|
}
|
|
if (empty($label))
|
|
{
|
|
setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("Label")), null, 'errors');
|
|
$action='create';
|
|
$error++;
|
|
}
|
|
else if (empty($_POST['task_parent']))
|
|
{
|
|
setEventMessages($langs->trans("ErrorFieldRequired", $langs->transnoentities("ChildOfTask")), null, 'errors');
|
|
$action='create';
|
|
$error++;
|
|
}
|
|
|
|
if (! $error)
|
|
{
|
|
$tmparray=explode('_',$_POST['task_parent']);
|
|
$projectid=$tmparray[0];
|
|
if (empty($projectid)) $projectid = $id; // If projectid is ''
|
|
$task_parent=$tmparray[1];
|
|
if (empty($task_parent)) $task_parent = 0; // If task_parent is ''
|
|
|
|
$task = new Task($db);
|
|
|
|
$task->fk_project = $projectid;
|
|
$task->ref = $taskref;
|
|
$task->label = $label;
|
|
$task->description = $description;
|
|
$task->planned_workload = $planned_workload;
|
|
$task->fk_task_parent = $task_parent;
|
|
$task->date_c = dol_now();
|
|
$task->date_start = $date_start;
|
|
$task->date_end = $date_end;
|
|
$task->progress = $progress;
|
|
|
|
// Fill array 'array_options' with data from add form
|
|
$ret = $extrafields_task->setOptionalsFromPost($extralabels_task,$task);
|
|
|
|
$taskid = $task->create($user);
|
|
|
|
if ($taskid > 0)
|
|
{
|
|
$result = $task->add_contact($_POST["userid"], 'TASKEXECUTIVE', 'internal');
|
|
}
|
|
else
|
|
{
|
|
setEventMessages($task->error,$task->errors,'errors');
|
|
}
|
|
}
|
|
|
|
if (! $error)
|
|
{
|
|
if (! empty($backtopage))
|
|
{
|
|
header("Location: ".$backtopage);
|
|
exit;
|
|
}
|
|
else if (empty($projectid))
|
|
{
|
|
header("Location: ".DOL_URL_ROOT.'/projet/tasks/list.php'.(empty($mode)?'':'?mode='.$mode));
|
|
exit;
|
|
}
|
|
$id = $projectid;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (! empty($backtopage))
|
|
{
|
|
header("Location: ".$backtopage);
|
|
exit;
|
|
}
|
|
else if (empty($id))
|
|
{
|
|
// We go back on task list
|
|
header("Location: ".DOL_URL_ROOT.'/projet/tasks/list.php'.(empty($mode)?'':'?mode='.$mode));
|
|
exit;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
* View
|
|
*/
|
|
|
|
$form=new Form($db);
|
|
$formother=new FormOther($db);
|
|
$taskstatic = new Task($db);
|
|
$userstatic=new User($db);
|
|
|
|
$title=$langs->trans("Project").' - '.$langs->trans("Tasks").' - '.$object->ref.' '.$object->name;
|
|
if (! empty($conf->global->MAIN_HTML_TITLE) && preg_match('/projectnameonly/',$conf->global->MAIN_HTML_TITLE) && $object->name) $title=$object->ref.' '.$object->name.' - '.$langs->trans("Tasks");
|
|
$help_url="EN:Module_Projects|FR:Module_Projets|ES:Módulo_Proyectos";
|
|
llxHeader("",$title,$help_url);
|
|
|
|
if ($id > 0 || ! empty($ref))
|
|
{
|
|
$object->fetch($id, $ref);
|
|
$object->fetch_thirdparty();
|
|
$res=$object->fetch_optionals($object->id,$extralabels_projet);
|
|
|
|
|
|
// To verify role of users
|
|
//$userAccess = $object->restrictedProjectArea($user,'read');
|
|
$userWrite = $object->restrictedProjectArea($user,'write');
|
|
//$userDelete = $object->restrictedProjectArea($user,'delete');
|
|
//print "userAccess=".$userAccess." userWrite=".$userWrite." userDelete=".$userDelete;
|
|
|
|
|
|
$tab=GETPOST('tab')?GETPOST('tab'):'tasks';
|
|
|
|
$head=project_prepare_head($object);
|
|
dol_fiche_head($head, $tab, $langs->trans("Project"),0,($object->public?'projectpub':'project'));
|
|
|
|
$param=($mode=='mine'?'&mode=mine':'');
|
|
|
|
|
|
// Project card
|
|
|
|
$linkback = '<a href="'.DOL_URL_ROOT.'/projet/list.php">'.$langs->trans("BackToList").'</a>';
|
|
|
|
$morehtmlref='<div class="refidno">';
|
|
// Title
|
|
$morehtmlref.=$object->title;
|
|
// Thirdparty
|
|
if ($object->thirdparty->id > 0)
|
|
{
|
|
$morehtmlref.='<br>'.$langs->trans('ThirdParty') . ' : ' . $object->thirdparty->getNomUrl(1, 'project');
|
|
}
|
|
$morehtmlref.='</div>';
|
|
|
|
// Define a complementary filter for search of next/prev ref.
|
|
if (! $user->rights->projet->all->lire)
|
|
{
|
|
$objectsListId = $object->getProjectsAuthorizedForUser($user,0,0);
|
|
$object->next_prev_filter=" rowid in (".(count($objectsListId)?join(',',array_keys($objectsListId)):'0').")";
|
|
}
|
|
|
|
dol_banner_tab($object, 'ref', $linkback, 1, 'ref', 'ref', $morehtmlref);
|
|
|
|
print '<div class="fichecenter">';
|
|
print '<div class="fichehalfleft">';
|
|
print '<div class="underbanner clearboth"></div>';
|
|
|
|
print '<table class="border" width="100%">';
|
|
|
|
// Visibility
|
|
print '<tr><td class="titlefield">'.$langs->trans("Visibility").'</td><td>';
|
|
if ($object->public) print $langs->trans('SharedProject');
|
|
else print $langs->trans('PrivateProject');
|
|
print '</td></tr>';
|
|
|
|
/*if (! empty($conf->global->PROJECT_USE_OPPORTUNITIES))
|
|
{
|
|
// Opportunity status
|
|
print '<tr><td>'.$langs->trans("OpportunityStatus").'</td><td>';
|
|
$code = dol_getIdFromCode($db, $object->opp_status, 'c_lead_status', 'rowid', 'code');
|
|
if ($code) print $langs->trans("OppStatus".$code);
|
|
print '</td></tr>';
|
|
|
|
// Opportunity percent
|
|
print '<tr><td>'.$langs->trans("OpportunityProbability").'</td><td>';
|
|
if (strcmp($object->opp_percent,'')) print price($object->opp_percent,'',$langs,1,0).' %';
|
|
print '</td></tr>';
|
|
|
|
// Opportunity Amount
|
|
print '<tr><td>'.$langs->trans("OpportunityAmount").'</td><td>';
|
|
if (strcmp($object->opp_amount,'')) print price($object->opp_amount,'',$langs,1,0,0,$conf->currency);
|
|
print '</td></tr>';
|
|
}*/
|
|
|
|
// Date start - end
|
|
print '<tr><td>'.$langs->trans("DateStart").' - '.$langs->trans("DateEnd").'</td><td>';
|
|
print dol_print_date($object->date_start,'day');
|
|
$end=dol_print_date($object->date_end,'day');
|
|
if ($end) print ' - '.$end;
|
|
print '</td></tr>';
|
|
|
|
// Budget
|
|
print '<tr><td>'.$langs->trans("Budget").'</td><td>';
|
|
if (strcmp($object->budget_amount, '')) print price($object->budget_amount,'',$langs,1,0,0,$conf->currency);
|
|
print '</td></tr>';
|
|
|
|
// Other attributes
|
|
$cols = 2;
|
|
include DOL_DOCUMENT_ROOT . '/core/tpl/extrafields_view.tpl.php';
|
|
|
|
print '</table>';
|
|
|
|
print '</div>';
|
|
print '<div class="fichehalfright">';
|
|
print '<div class="ficheaddleft">';
|
|
print '<div class="underbanner clearboth"></div>';
|
|
|
|
print '<table class="border" width="100%">';
|
|
|
|
// Description
|
|
print '<td class="titlefield tdtop">'.$langs->trans("Description").'</td><td>';
|
|
print nl2br($object->description);
|
|
print '</td></tr>';
|
|
|
|
// Categories
|
|
if($conf->categorie->enabled) {
|
|
print '<tr><td valign="middle">'.$langs->trans("Categories").'</td><td>';
|
|
print $form->showCategories($object->id,'project',1);
|
|
print "</td></tr>";
|
|
}
|
|
|
|
print '</table>';
|
|
|
|
print '</div>';
|
|
print '</div>';
|
|
print '</div>';
|
|
|
|
print '<div class="clearboth"></div>';
|
|
|
|
|
|
dol_fiche_end();
|
|
}
|
|
|
|
|
|
if ($action == 'create' && $user->rights->projet->creer && (empty($object->thirdparty->id) || $userWrite > 0))
|
|
{
|
|
if ($id > 0 || ! empty($ref)) print '<br>';
|
|
|
|
print load_fiche_titre($langs->trans("NewTask"), '', 'title_project');
|
|
|
|
print '<form action="'.$_SERVER['PHP_SELF'].'" method="POST">';
|
|
print '<input type="hidden" name="token" value="'.$_SESSION['newtoken'].'">';
|
|
print '<input type="hidden" name="action" value="createtask">';
|
|
print '<input type="hidden" name="backtopage" value="'.$backtopage.'">';
|
|
if (! empty($object->id)) print '<input type="hidden" name="id" value="'.$object->id.'">';
|
|
if (! empty($mode)) print '<input type="hidden" name="mode" value="'.$mode.'">';
|
|
|
|
dol_fiche_head('');
|
|
|
|
print '<table class="border" width="100%">';
|
|
|
|
$defaultref='';
|
|
$obj = empty($conf->global->PROJECT_TASK_ADDON)?'mod_task_simple':$conf->global->PROJECT_TASK_ADDON;
|
|
if (! empty($conf->global->PROJECT_TASK_ADDON) && is_readable(DOL_DOCUMENT_ROOT ."/core/modules/project/task/".$conf->global->PROJECT_TASK_ADDON.".php"))
|
|
{
|
|
require_once DOL_DOCUMENT_ROOT ."/core/modules/project/task/".$conf->global->PROJECT_TASK_ADDON.'.php';
|
|
$modTask = new $obj;
|
|
$defaultref = $modTask->getNextValue($object->thirdparty,null);
|
|
}
|
|
|
|
if (is_numeric($defaultref) && $defaultref <= 0) $defaultref='';
|
|
|
|
// Ref
|
|
print '<tr><td class="titlefieldcreate"><span class="fieldrequired">'.$langs->trans("Ref").'</span></td><td>';
|
|
print ($_POST["ref"]?$_POST["ref"]:$defaultref);
|
|
print '<input type="hidden" name="taskref" value="'.($_POST["ref"]?$_POST["ref"]:$defaultref).'">';
|
|
print '</td></tr>';
|
|
|
|
print '<tr><td class="fieldrequired">'.$langs->trans("Label").'</td><td>';
|
|
print '<input type="text" name="label" class="flat minwidth300" value="'.$label.'">';
|
|
print '</td></tr>';
|
|
|
|
// List of projects
|
|
print '<tr><td class="fieldrequired">'.$langs->trans("ChildOfTask").'</td><td>';
|
|
print $formother->selectProjectTasks(GETPOST('task_parent'),$projectid?$projectid:$object->id, 'task_parent', 0, 0, 1, 1);
|
|
print '</td></tr>';
|
|
|
|
print '<tr><td>'.$langs->trans("AffectedTo").'</td><td>';
|
|
$contactsofproject=(! empty($object->id)?$object->getListContactId('internal'):'');
|
|
if (count($contactsofproject))
|
|
{
|
|
print $form->select_dolusers($user->id, 'userid', 0, '', 0, '', $contactsofproject, 0, 0, 0, '', 0, '', 'maxwidth300');
|
|
}
|
|
else
|
|
{
|
|
print $langs->trans("NoUserAssignedToTheProject");
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Date start
|
|
print '<tr><td>'.$langs->trans("DateStart").'</td><td>';
|
|
print $form->select_date(($date_start?$date_start:''),'dateo',1,1,0,'',1,1,1);
|
|
print '</td></tr>';
|
|
|
|
// Date end
|
|
print '<tr><td>'.$langs->trans("DateEnd").'</td><td>';
|
|
print $form->select_date(($date_end?$date_end:-1),'datee',1,1,0,'',1,1,1);
|
|
print '</td></tr>';
|
|
|
|
// planned workload
|
|
print '<tr><td>'.$langs->trans("PlannedWorkload").'</td><td>';
|
|
print $form->select_duration('planned_workload', $planned_workload?$planned_workload : $object->planned_workload,0,'text');
|
|
print '</td></tr>';
|
|
|
|
// Progress
|
|
print '<tr><td>'.$langs->trans("ProgressDeclared").'</td><td colspan="3">';
|
|
print $formother->select_percent($progress,'progress');
|
|
print '</td></tr>';
|
|
|
|
// Description
|
|
print '<tr><td valign="top">'.$langs->trans("Description").'</td>';
|
|
print '<td>';
|
|
print '<textarea name="description" wrap="soft" cols="80" rows="'.ROWS_3.'">'.$description.'</textarea>';
|
|
print '</td></tr>';
|
|
|
|
// Other options
|
|
$parameters=array();
|
|
$reshook=$hookmanager->executeHooks('formObjectOptions',$parameters,$object,$action); // Note that $action and $object may have been modified by hook
|
|
if (empty($reshook) && ! empty($extrafields_task->attribute_label))
|
|
{
|
|
print $object->showOptionals($extrafields_task,'edit');
|
|
}
|
|
|
|
print '</table>';
|
|
|
|
dol_fiche_end();
|
|
|
|
print '<div align="center">';
|
|
print '<input type="submit" class="button" name="add" value="'.$langs->trans("Add").'">';
|
|
print ' ';
|
|
print '<input type="submit" class="button" name="cancel" value="'.$langs->trans("Cancel").'">';
|
|
print '</div>';
|
|
|
|
print '</form>';
|
|
|
|
}
|
|
else if ($id > 0 || ! empty($ref))
|
|
{
|
|
/*
|
|
* Fiche projet en mode visu
|
|
*/
|
|
|
|
/*
|
|
* Actions
|
|
*/
|
|
print '<div class="tabsAction">';
|
|
|
|
if ($user->rights->projet->all->creer || $user->rights->projet->creer)
|
|
{
|
|
if ($object->public || $userWrite > 0)
|
|
{
|
|
print '<a class="butAction" href="'.$_SERVER['PHP_SELF'].'?id='.$object->id.'&action=create'.$param.'&backtopage='.urlencode($_SERVER['PHP_SELF'].'?id='.$object->id).'">'.$langs->trans('AddTask').'</a>';
|
|
}
|
|
else
|
|
{
|
|
print '<a class="butActionRefused" href="#" title="'.$langs->trans("NotOwnerOfProject").'">'.$langs->trans('AddTask').'</a>';
|
|
}
|
|
}
|
|
else
|
|
{
|
|
print '<a class="butActionRefused" href="#" title="'.$langs->trans("NotEnoughPermissions").'">'.$langs->trans('AddTask').'</a>';
|
|
}
|
|
|
|
print '</div>';
|
|
|
|
|
|
$title=$langs->trans("ListOfTasks");
|
|
$linktotasks='<a href="'.DOL_URL_ROOT.'/projet/tasks/time.php?projectid='.$object->id.'&withproject=1">'.$langs->trans("GoToListOfTimeConsumed").'</a>';
|
|
//print_barre_liste($title, 0, $_SERVER["PHP_SELF"], '', $sortfield, $sortorder, $linktotasks, $num, $totalnboflines, 'title_generic.png', 0, '', '', 0, 1);
|
|
print load_fiche_titre($title,$linktotasks,'title_generic.png');
|
|
|
|
// Get list of tasks in tasksarray and taskarrayfiltered
|
|
// We need all tasks (even not limited to a user because a task to user can have a parent that is not affected to him).
|
|
$tasksarray=$taskstatic->getTasksArray(0, 0, $object->id, $socid, 0);
|
|
// We load also tasks limited to a particular user
|
|
$tasksrole=($mode=='mine' ? $taskstatic->getUserRolesForProjectsOrTasks(0,$user,$object->id,0) : '');
|
|
//var_dump($tasksarray);
|
|
//var_dump($tasksrole);
|
|
|
|
if (! empty($conf->use_javascript_ajax))
|
|
{
|
|
include DOL_DOCUMENT_ROOT.'/core/tpl/ajaxrow.tpl.php';
|
|
}
|
|
|
|
print '<table id="tablelines" class="noborder" width="100%">';
|
|
print '<tr class="liste_titre nodrag nodrop">';
|
|
// print '<td>'.$langs->trans("Project").'</td>';
|
|
print '<td width="100">'.$langs->trans("RefTask").'</td>';
|
|
print '<td>'.$langs->trans("LabelTask").'</td>';
|
|
print '<td align="center">'.$langs->trans("DateStart").'</td>';
|
|
print '<td align="center">'.$langs->trans("DateEnd").'</td>';
|
|
print '<td align="right">'.$langs->trans("PlannedWorkload").'</td>';
|
|
print '<td align="right">'.$langs->trans("TimeSpent").'</td>';
|
|
print '<td align="right">'.$langs->trans("ProgressCalculated").'</td>';
|
|
print '<td align="right">'.$langs->trans("ProgressDeclared").'</td>';
|
|
print '<td> </td>';
|
|
print "</tr>\n";
|
|
|
|
if (count($tasksarray) > 0)
|
|
{
|
|
// Link to switch in "my task" / "all task"
|
|
print '<tr class="liste_titre nodrag nodrop"><td colspan="9">';
|
|
if ($mode == 'mine')
|
|
{
|
|
print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'">'.$langs->trans("DoNotShowMyTasksOnly").'</a>';
|
|
}
|
|
else
|
|
{
|
|
print '<a href="'.$_SERVER["PHP_SELF"].'?id='.$object->id.'&mode=mine">'.$langs->trans("ShowMyTasksOnly").'</a>';
|
|
}
|
|
print '</td></tr>';
|
|
|
|
// Show all lines in taskarray (recursive function to go down on tree)
|
|
$j=0; $level=0;
|
|
$nboftaskshown=projectLinesa($j, 0, $tasksarray, $level, true, 0, $tasksrole, $object->id, 1, $object->id);
|
|
}
|
|
else
|
|
{
|
|
print '<tr '.$bc[false].'><td colspan="9" class="opacitymedium">'.$langs->trans("NoTasks").'</td></tr>';
|
|
}
|
|
print "</table>";
|
|
|
|
|
|
// Test if database is clean. If not we clean it.
|
|
//print 'mode='.$_REQUEST["mode"].' $nboftaskshown='.$nboftaskshown.' count($tasksarray)='.count($tasksarray).' count($tasksrole)='.count($tasksrole).'<br>';
|
|
if (! empty($user->rights->projet->all->lire)) // We make test to clean only if user has permission to see all (test may report false positive otherwise)
|
|
{
|
|
if ($mode=='mine')
|
|
{
|
|
if ($nboftaskshown < count($tasksrole))
|
|
{
|
|
include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
|
|
cleanCorruptedTree($db, 'projet_task', 'fk_task_parent');
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ($nboftaskshown < count($tasksarray))
|
|
{
|
|
include_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
|
|
cleanCorruptedTree($db, 'projet_task', 'fk_task_parent');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
llxFooter();
|
|
|
|
$db->close();
|