Add mass action to clone selected tasks to another project
This commit is contained in:
parent
ccf40855d8
commit
6b6cfb1339
@ -1707,6 +1707,66 @@ if (!$error && ($massaction == 'increaseholiday' || ($action == 'increaseholiday
|
||||
}
|
||||
}
|
||||
|
||||
//if (!$error && $massaction == 'clonetasks' && $user->rights->projet->creer) {
|
||||
if (!$error && ($massaction == 'clonetasks' || ($action == 'clonetasks' && $confirm == 'yes'))) {
|
||||
$num = 0;
|
||||
|
||||
dol_include_once('/projet/class/task.class.php');
|
||||
|
||||
$origin_task = new Task($db);
|
||||
$clone_task = new Task($db);
|
||||
|
||||
foreach (GETPOST('selected') as $task) {
|
||||
$origin_task->fetch($task, $ref = '', $loadparentdata = 0);
|
||||
|
||||
$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(0, $clone_task);
|
||||
}
|
||||
|
||||
if (!$error) {
|
||||
$clone_task->fk_project = GETPOST('projectid', 'int');
|
||||
$clone_task->ref = $defaultref;
|
||||
$clone_task->label = $origin_task->label;
|
||||
$clone_task->description = $origin_task->description;
|
||||
$clone_task->planned_workload = $origin_task->planned_workload;
|
||||
$clone_task->fk_task_parent = $origin_task->fk_task_parent;
|
||||
$clone_task->date_c = dol_now();
|
||||
$clone_task->date_start = $origin_task->date_start;
|
||||
$clone_task->date_end = $origin_task->date_end;
|
||||
$clone_task->progress = $origin_task->progress;
|
||||
|
||||
// Fill array 'array_options' with data from add form
|
||||
$ret = $extrafields->setOptionalsFromPost(null, $clone_task);
|
||||
|
||||
$taskid = $clone_task->create($user);
|
||||
|
||||
if ($taskid > 0) {
|
||||
$result = $clone_task->add_contact(GETPOST("userid", 'int'), 'TASKEXECUTIVE', 'internal');
|
||||
$num++;
|
||||
} else {
|
||||
if ($db->lasterrno() == 'DB_ERROR_RECORD_ALREADY_EXISTS') {
|
||||
$langs->load("projects");
|
||||
setEventMessages($langs->trans('NewTaskRefSuggested'), '', 'warnings');
|
||||
$duplicate_code_error = true;
|
||||
} else {
|
||||
setEventMessages($clone_task->error, $clone_task->errors, 'errors');
|
||||
}
|
||||
$action = 'list';
|
||||
$error++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$error) {
|
||||
setEventMessage($langs->trans('NumberOfTasksCloned', $num));
|
||||
header("Refresh: 1;URL=".DOL_URL_ROOT.'/projet/tasks.php?id=' . GETPOST('projectid', 'int'));
|
||||
}
|
||||
}
|
||||
|
||||
$parameters['toselect'] = (empty($toselect) ? array() : $toselect);
|
||||
$parameters['uploaddir'] = $uploaddir;
|
||||
$parameters['massaction'] = $massaction;
|
||||
|
||||
@ -7286,7 +7286,7 @@ class Form
|
||||
$out .= $this->selectProjectsList($selected, $htmlname, $filtertype, $limit, $status, 0, $socid, $showempty, $forcecombo, $morecss);
|
||||
}
|
||||
|
||||
if (empty($nooutput)) print $out;
|
||||
if (!empty($nooutput)) print $out;
|
||||
else return $out;
|
||||
}
|
||||
|
||||
|
||||
@ -40,6 +40,18 @@ if ($massaction == 'predelete') {
|
||||
print $form->formconfirm($_SERVER["PHP_SELF"], $langs->trans("ConfirmMassDeletion"), $langs->trans("ConfirmMassDeletionQuestion", count($toselect)), "delete", null, '', 0, 200, 500, 1);
|
||||
}
|
||||
|
||||
if ($massaction == 'preclonetasks') {
|
||||
$selected = '';
|
||||
foreach (GETPOST('toselect') as $tmpselected) {
|
||||
$selected .= '&selected[]=' . $tmpselected;
|
||||
}
|
||||
|
||||
$formquestion = array(
|
||||
array('type' => 'other', 'name' => 'projectid', 'label' => $langs->trans('Project') .': ', 'value' => $form->selectProjects('', 'projectid', '', '', '', '', '', '', '', 1, 1)),
|
||||
);
|
||||
print $form->formconfirm($_SERVER['PHP_SELF'] . '?id=' . $object->id . $selected . '', $langs->trans('ConfirmMassClone'), '', 'clonetasks', $formquestion, '', 1, 300, 590);
|
||||
}
|
||||
|
||||
if ($massaction == 'preaffecttag' && isModEnabled('category')) {
|
||||
require_once DOL_DOCUMENT_ROOT.'/categories/class/categorie.class.php';
|
||||
$categ = new Categorie($db);
|
||||
|
||||
@ -897,6 +897,9 @@ MassFilesArea=Area for files built by mass actions
|
||||
ShowTempMassFilesArea=Show area of files built by mass actions
|
||||
ConfirmMassDeletion=Bulk Delete confirmation
|
||||
ConfirmMassDeletionQuestion=Are you sure you want to delete the %s selected record(s)?
|
||||
ConfirmMassClone=Bulk clone confirmation
|
||||
ConfirmMassCloneQuestion=Select project to clone to
|
||||
ConfirmMassCloneToOneProject=Clone to project %s
|
||||
RelatedObjects=Related Objects
|
||||
ClassifyBilled=Classify billed
|
||||
ClassifyUnbilled=Classify unbilled
|
||||
|
||||
@ -258,6 +258,7 @@ RecordsClosed=%s project(s) closed
|
||||
SendProjectRef=Information project %s
|
||||
ModuleSalaryToDefineHourlyRateMustBeEnabled=Module 'Salaries' must be enabled to define employee hourly rate to have time spent valorized
|
||||
NewTaskRefSuggested=Task ref already used, a new task ref is required
|
||||
NumberOfTasksCloned=%s task(s) cloned
|
||||
TimeSpentInvoiced=Time spent billed
|
||||
TimeSpentForIntervention=Time spent
|
||||
TimeSpentForInvoice=Time spent
|
||||
@ -297,4 +298,4 @@ EnablePublicLeadForm=Enable the public form for contact
|
||||
NewLeadbyWeb=Your message or request has been recorded. We will answer or contact your soon.
|
||||
NewLeadForm=New contact form
|
||||
LeadFromPublicForm=Online lead from public form
|
||||
ExportAccountingReportButtonLabel=Get report
|
||||
ExportAccountingReportButtonLabel=Get report
|
||||
|
||||
@ -747,6 +747,86 @@ class Project extends CommonObject
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Load list of objects in memory from the database.
|
||||
*
|
||||
* @param string $sortorder Sort Order
|
||||
* @param string $sortfield Sort field
|
||||
* @param int $limit limit
|
||||
* @param int $offset Offset
|
||||
* @param array $filter Filter array. Example array('field'=>'valueforlike', 'customurl'=>...)
|
||||
* @param string $filtermode Filter mode (AND or OR)
|
||||
* @return array|int int <0 if KO, array of pages if OK
|
||||
*/
|
||||
public function fetchAll($sortorder = '', $sortfield = '', $limit = 0, $offset = 0, array $filter = array(), $filtermode = 'AND')
|
||||
{
|
||||
global $conf;
|
||||
|
||||
dol_syslog(__METHOD__, LOG_DEBUG);
|
||||
|
||||
$records = array();
|
||||
|
||||
$sql = 'SELECT ';
|
||||
$sql .= $this->getFieldList('t');
|
||||
$sql .= ' FROM '.MAIN_DB_PREFIX.$this->table_element.' as t';
|
||||
if (isset($this->ismultientitymanaged) && $this->ismultientitymanaged == 1) {
|
||||
$sql .= ' WHERE t.entity IN ('.getEntity($this->table_element).')';
|
||||
} else {
|
||||
$sql .= ' WHERE 1 = 1';
|
||||
}
|
||||
// Manage filter
|
||||
$sqlwhere = array();
|
||||
if (count($filter) > 0) {
|
||||
foreach ($filter as $key => $value) {
|
||||
if ($key == 't.rowid') {
|
||||
$sqlwhere[] = $key.'='.$value;
|
||||
} elseif (in_array($this->fields[$key]['type'], array('date', 'datetime', 'timestamp'))) {
|
||||
$sqlwhere[] = $key.' = \''.$this->db->idate($value).'\'';
|
||||
} elseif ($key == 'customsql') {
|
||||
$sqlwhere[] = $value;
|
||||
} elseif (strpos($value, '%') === false) {
|
||||
$sqlwhere[] = $key.' IN ('.$this->db->sanitize($this->db->escape($value)).')';
|
||||
} else {
|
||||
$sqlwhere[] = $key.' LIKE \'%'.$this->db->escape($value).'%\'';
|
||||
}
|
||||
}
|
||||
}
|
||||
if (count($sqlwhere) > 0) {
|
||||
$sql .= ' AND ('.implode(' '.$filtermode.' ', $sqlwhere).')';
|
||||
}
|
||||
|
||||
if (!empty($sortfield)) {
|
||||
$sql .= $this->db->order($sortfield, $sortorder);
|
||||
}
|
||||
if (!empty($limit)) {
|
||||
$sql .= ' '.$this->db->plimit($limit, $offset);
|
||||
}
|
||||
|
||||
$resql = $this->db->query($sql);
|
||||
if ($resql) {
|
||||
$num = $this->db->num_rows($resql);
|
||||
$i = 0;
|
||||
while ($i < ($limit ? min($limit, $num) : $num)) {
|
||||
$obj = $this->db->fetch_object($resql);
|
||||
|
||||
$record = new self($this->db);
|
||||
$record->setVarsFromFetchObj($obj);
|
||||
|
||||
$records[$record->id] = $record;
|
||||
|
||||
$i++;
|
||||
}
|
||||
$this->db->free($resql);
|
||||
|
||||
return $records;
|
||||
} else {
|
||||
$this->errors[] = 'Error '.$this->db->lasterror();
|
||||
dol_syslog(__METHOD__.' '.join(',', $this->errors), LOG_ERR);
|
||||
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
// phpcs:disable PEAR.NamingConventions.ValidFunctionName.ScopeNotCamelCaps
|
||||
/**
|
||||
* Return list of elements for type, linked to a project
|
||||
|
||||
@ -553,9 +553,10 @@ if ($id > 0 || !empty($ref)) {
|
||||
// Add $param from extra fields
|
||||
include DOL_DOCUMENT_ROOT.'/core/tpl/extrafields_list_search_param.tpl.php';
|
||||
|
||||
$arrayofmassactions = array(
|
||||
//'clone'=>img_picto('', 'rightarrow', 'class="pictofixedwidth"').$langs->trans("Clone"),
|
||||
);
|
||||
$arrayofmassactions = array();
|
||||
if ($user->rights->projet->creer) {
|
||||
$arrayofmassactions['preclonetasks'] = img_picto('', 'rightarrow', 'class="pictofixedwidth"').$langs->trans("Clone");
|
||||
}
|
||||
if ($permissiontodelete) {
|
||||
$arrayofmassactions['predelete'] = img_picto('', 'delete', 'class="pictofixedwidth"').$langs->trans("Delete");
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user