/** * * @author Ignacio Vazquez - elpepe.uy@gmail.com * @param ProjectTask $object */ function addObject($object) { if ($this->hasObject($object)) { return; } if (!$object->isTemplate() && $object->canBeTemplate()) { // the object isn't a template but can be, create a template copy $copy = $object->copy(); $copy->setColumnValue('is_template', true); if ($copy instanceof ProjectTask) { // don't copy milestone and parent task $copy->setMilestoneId(0); $copy->setParentId(0); } $copy->save(); //Also copy members.. // $memberIds = json_decode(array_var($_POST, 'members')); // $controller = new ObjectController() ; // $controller->add_to_members($copy, $memberIds); // copy subtasks if ($copy instanceof ProjectTask) { ProjectTasks::copySubTasks($object, $copy, true); } else { if ($copy instanceof ProjectMilestone) { ProjectMilestones::copyTasks($object, $copy, true); } } // copy custom properties $copy->copyCustomPropertiesFrom($object); // copy linked objects $linked_objects = $object->getAllLinkedObjects(); if (is_array($linked_objects)) { foreach ($linked_objects as $lo) { $copy->linkObject($lo); } } // copy reminders $reminders = ObjectReminders::getByObject($object); foreach ($reminders as $reminder) { $copy_reminder = new ObjectReminder(); $copy_reminder->setContext($reminder->getContext()); $copy_reminder->setDate(EMPTY_DATETIME); $copy_reminder->setMinutesBefore($reminder->getMinutesBefore()); $copy_reminder->setObject($copy); $copy_reminder->setType($reminder->getType()); // $copy_reminder->setContactId($reminder->getContactId()); //TODO Feng 2 - No anda $copy_reminder->save(); } $template = $copy; } else { // the object is already a template or can't be one, use it as it is $template = $object; } $to = new TemplateObject(); $to->setObject($template); $to->setTemplate($this); $to->save(); return $template->getObjectId(); }
function instantiate() { $selected_members = array(); $id = get_id(); $template = COTemplates::findById($id); if (!$template instanceof COTemplate) { flash_error(lang("template dnx")); ajx_current("empty"); return; } $parameters = TemplateParameters::getParametersByTemplate($id); $parameterValues = array_var($_POST, 'parameterValues'); if (count($parameters) > 0 && !isset($parameterValues)) { ajx_current("back"); return; } if (array_var($_POST, 'members')) { $selected_members = json_decode(array_var($_POST, 'members')); } else { $context = active_context(); foreach ($context as $selection) { if ($selection instanceof Member) { $selected_members[] = $selection->getId(); } } } $objects = $template->getObjects(); $controller = new ObjectController(); if (count($selected_members > 0)) { $selected_members_instances = Members::findAll(array('conditions' => 'id IN (' . implode($selected_members) . ')')); } else { $selected_members_instances = array(); } DB::beginWork(); $active_context = active_context(); foreach ($objects as $object) { if (!$object instanceof ContentDataObject) { continue; } // copy object $copy = $object->copy(); if ($copy->columnExists('is_template')) { $copy->setColumnValue('is_template', false); } if ($copy instanceof ProjectTask) { // don't copy parent task and milestone $copy->setMilestoneId(0); $copy->setParentId(0); } $copy->save(); /* if (!can_write(logged_user(), $selected_members_instances, $copy->getObjectTypeId()) ) { flash_error(lang('no context permissions to add', $copy instanceof ProjectTask ? lang("tasks") : ($copy instanceof ProjectMilestone ? lang('milestones') : ''))); DB::rollback(); ajx_current("empty"); return; }*/ // Copy members from origial object, if it doesn't have then use active context members /* $template_object_members = $object->getMemberIds(); if (count($template_object_members) == 0) { $object_member_ids = active_context_members(false); if (count($object_member_ids) > 0) { $template_object_members = Members::findAll(array("id" => true, "conditions" => "id IN (".implode(",", $object_member_ids).")")); } }*/ /* Set instantiated object members: * foreach dimension: * if no member is active then the instantiated object is put in the same members as the original for current dimension * if a member is selected in current dimension then the instantiated object will be put in that member */ $template_object_members = $object->getMembers(); $object_members = array(); foreach ($active_context as $selection) { if ($selection instanceof Member) { // member selected $object_members[] = $selection->getId(); } else { if ($selection instanceof Dimension) { // no member selected foreach ($template_object_members as $tom) { if ($tom->getDimensionId() == $selection->getId()) { $object_members[] = $tom->getId(); } } } } } $controller->add_to_members($copy, $object_members); // copy linked objects $copy->copyLinkedObjectsFrom($object); // copy subtasks if applicable if ($copy instanceof ProjectTask) { ProjectTasks::copySubTasks($object, $copy, false); foreach ($copy->getOpenSubTasks(false) as $m_task) { $controller->add_to_members($m_task, $object_members); } $manager = $copy->manager(); } else { if ($copy instanceof ProjectMilestone) { ProjectMilestones::copyTasks($object, $copy, false); foreach ($copy->getTasks(false) as $m_task) { $controller->add_to_members($m_task, $object_members); } $manager = $copy->manager(); } } // copy custom properties $copy->copyCustomPropertiesFrom($object); // set property values as defined in template $objProp = TemplateObjectProperties::getPropertiesByTemplateObject($id, $object->getId()); foreach ($objProp as $property) { $propName = $property->getProperty(); $value = $property->getValue(); if ($manager->getColumnType($propName) == DATA_TYPE_STRING || $manager->getColumnType($propName) == DATA_TYPE_INTEGER) { if (is_array($parameterValues)) { foreach ($parameterValues as $param => $val) { if (strpos($value, '{' . $param . '}') !== FALSE) { $value = str_replace('{' . $param . '}', $val, $value); } } } } else { if ($manager->getColumnType($propName) == DATA_TYPE_DATE || $manager->getColumnType($propName) == DATA_TYPE_DATETIME) { $operator = '+'; if (strpos($value, '+') === false) { $operator = '-'; } $opPos = strpos($value, $operator); if ($opPos !== false) { // Is parametric $dateParam = substr($value, 1, strpos($value, '}') - 1); $date = $parameterValues[$dateParam]; $dateUnit = substr($value, strlen($value) - 1); // d, w or m (for days, weeks or months) if ($dateUnit == 'm') { $dateUnit = 'M'; // make month unit uppercase to call DateTimeValue::add with correct parameter } $dateNum = (int) substr($value, strpos($value, $operator), strlen($value) - 2); $date = DateTimeValueLib::dateFromFormatAndString(user_config_option('date_format'), $date); $date = new DateTimeValue($date->getTimestamp() - logged_user()->getTimezone() * 3600); // set date to GMT 0 $value = $date->add($dateUnit, $dateNum); } else { $value = DateTimeValueLib::dateFromFormatAndString(user_config_option('date_format'), $value); } } } if ($value != '') { if (!$copy->setColumnValue($propName, $value)) { $copy->object->setColumnValue($propName, $value); } $copy->save(); } } // subscribe assigned to if ($copy instanceof ProjectTask) { foreach ($copy->getOpenSubTasks(false) as $m_task) { if ($m_task->getAssignedTo() instanceof Contact) { $m_task->subscribeUser($copy->getAssignedTo()); } } if ($copy->getAssignedTo() instanceof Contact) { $copy->subscribeUser($copy->getAssignedTo()); } } else { if ($copy instanceof ProjectMilestone) { foreach ($copy->getTasks(false) as $m_task) { if ($m_task->getAssignedTo() instanceof Contact) { $m_task->subscribeUser($copy->getAssignedTo()); } } } } // copy reminders $reminders = ObjectReminders::getByObject($object); foreach ($reminders as $reminder) { $copy_reminder = new ObjectReminder(); $copy_reminder->setContext($reminder->getContext()); $reminder_date = $copy->getColumnValue($reminder->getContext()); if ($reminder_date instanceof DateTimeValue) { $reminder_date = new DateTimeValue($reminder_date->getTimestamp()); $reminder_date->add('m', -$reminder->getMinutesBefore()); } $copy_reminder->setDate($reminder_date); $copy_reminder->setMinutesBefore($reminder->getMinutesBefore()); $copy_reminder->setObject($copy); $copy_reminder->setType($reminder->getType()); $copy_reminder->setUserId($reminder->getUserId()); $copy_reminder->save(); } } DB::commit(); if (is_array($parameters) && count($parameters) > 0) { ajx_current("back"); } else { if (!$choose_ctx) { ajx_current("back"); } else { ajx_current("reload"); } } }
/** * Show and process add milestone form * * @access public * @param void * @return null */ function add() { if (logged_user()->isGuest()) { flash_error(lang('no access permissions')); ajx_current("empty"); return; } $this->setTemplate('add_milestone'); if (!ProjectMilestone::canAdd(logged_user(), active_or_personal_project())) { flash_error(lang('no access permissions')); ajx_current("empty"); return; } // if $milestone_data = array_var($_POST, 'milestone'); $now = DateTimeValueLib::now(); $due_date = DateTimeValueLib::make(0, 0, 0, array_var($_GET, 'due_month', $now->getMonth()), array_var($_GET, 'due_day', $now->getDay()), array_var($_GET, 'due_year', $now->getYear())); if (!is_array($milestone_data)) { $milestone_data = array('due_date' => $due_date, 'name' => array_var($_GET, 'name', ''), 'assigned_to' => array_var($_GET, 'assigned_to', '0:0'), 'is_template' => array_var($_GET, "is_template", false)); // array } // if $milestone = new ProjectMilestone(); tpl_assign('milestone_data', $milestone_data); tpl_assign('milestone', $milestone); if (is_array(array_var($_POST, 'milestone'))) { $milestone_data['due_date'] = getDateValue(array_var($milestone_data, 'due_date_value'), DateTimeValueLib::now()->beginningOfDay()); $assigned_to = explode(':', array_var($milestone_data, 'assigned_to', '')); $milestone->setIsPrivate(false); //Mandatory to set $milestone->setFromAttributes($milestone_data); $urgent = array_var($milestone_data, 'is_urgent') == 'checked'; $milestone->setIsUrgent($urgent); if (!logged_user()->isMemberOfOwnerCompany()) { $milestone->setIsPrivate(false); } $project = Projects::findById(array_var($_POST, 'ws_ids', 0)); if (!$project instanceof Project && !ProjectMilestone::canAdd(logged_user(), $project)) { flash_error(lang('no access permissions')); ajx_current("empty"); return; } // if $milestone->setAssignedToCompanyId(array_var($assigned_to, 0, 0)); $milestone->setAssignedToUserId(array_var($assigned_to, 1, 0)); try { DB::beginWork(); $milestone->save(); $milestone->setTagsFromCSV(array_var($milestone_data, 'tags')); $object_controller = new ObjectController(); $object_controller->add_to_workspaces($milestone); $object_controller->link_to_new_object($milestone); $object_controller->add_subscribers($milestone); $object_controller->add_custom_properties($milestone); $object_controller->add_reminders($milestone); if (array_var($_GET, 'copyId', 0) > 0) { // copy remaining stuff from the milestone with id copyId $toCopy = ProjectMilestones::findById(array_var($_GET, 'copyId')); if ($toCopy instanceof ProjectMilestone) { ProjectMilestones::copyTasks($toCopy, $milestone, array_var($milestone_data, 'is_template', false)); } } ApplicationLogs::createLog($milestone, $milestone->getWorkspaces(), ApplicationLogs::ACTION_ADD); DB::commit(); // Send notification try { if (!$milestone->getIsTemplate() && array_var($milestone_data, 'send_notification') == 'checked') { Notifier::milestoneAssigned($milestone); // send notification } // if } catch (Exception $e) { } // try if ($milestone->getIsTemplate()) { flash_success(lang('success add template', $milestone->getName())); } else { flash_success(lang('success add milestone', $milestone->getName())); } ajx_current("back"); } catch (Exception $e) { DB::rollback(); flash_error($e->getMessage()); ajx_current("empty"); } // try } // if }
/** * Show and process add milestone form * * @access public * @param void * @return null */ function add() { if (logged_user()->isGuest()) { flash_error(lang('no access permissions')); ajx_current("empty"); return; } $this->setTemplate('add_milestone'); $notAllowedMember = '' ; if(!ProjectMilestone::canAdd(logged_user(), active_context(), $notAllowedMember)) { if (str_starts_with($notAllowedMember, '-- req dim --')) flash_error(lang('must choose at least one member of', str_replace_first('-- req dim --', '', $notAllowedMember, $in))); else flash_error(lang('no context permissions to add',lang("milestones"),$notAllowedMember)); ajx_current("empty"); return; } $milestone_data = array_var($_POST, 'milestone'); $now = DateTimeValueLib::now(); $due_date = DateTimeValueLib::make(0, 0, 0, array_var($_GET, 'due_month', $now->getMonth()), array_var($_GET, 'due_day', $now->getDay()), array_var($_GET, 'due_year', $now->getYear())); if(!is_array($milestone_data)) { $milestone_data = array( 'due_date' => $due_date, 'name' => array_var($_GET, 'name', ''), 'assigned_to' => array_var($_GET, 'assigned_to', '0'), 'is_template' => array_var($_GET, "is_template", false) ); // array } // if $milestone = new ProjectMilestone(); tpl_assign('milestone_data', $milestone_data); tpl_assign('milestone', $milestone); if (is_array(array_var($_POST, 'milestone'))) { $milestone_data['due_date'] = getDateValue(array_var($milestone_data, 'due_date_value'),DateTimeValueLib::now()->beginningOfDay()); $milestone_data['object_type_id'] = $milestone->getObjectTypeId(); $milestone->setFromAttributes($milestone_data); $urgent = array_var($milestone_data, 'is_urgent') == 'checked'; $milestone->setIsUrgent($urgent); try { $member_ids = json_decode(array_var($_POST, 'members')); DB::beginWork(); $milestone->save(); $object_controller = new ObjectController(); $object_controller->add_to_members($milestone, $member_ids); $object_controller->add_subscribers($milestone); $object_controller->link_to_new_object($milestone); $object_controller->add_custom_properties($milestone); $object_controller->add_reminders($milestone); if (array_var($_GET, 'copyId', 0) > 0) { // copy remaining stuff from the milestone with id copyId $toCopy = ProjectMilestones::findById(array_var($_GET, 'copyId')); if ($toCopy instanceof ProjectMilestone) { ProjectMilestones::copyTasks($toCopy, $milestone, array_var($milestone_data, 'is_template', false)); } } ApplicationLogs::createLog($milestone, ApplicationLogs::ACTION_ADD); DB::commit(); // Send notification try { if(!$milestone->getIsTemplate() && array_var($milestone_data, 'send_notification') == 'checked') { Notifier::milestoneAssigned($milestone); // send notification } // if } catch(Exception $e) { } // try if ($milestone->getIsTemplate()) { flash_success(lang('success add template', $milestone->getObjectName())); } else { flash_success(lang('success add milestone', $milestone->getObjectName())); } ajx_current("back"); } catch(Exception $e) { DB::rollback(); flash_error($e->getMessage()); ajx_current("empty"); } // try } // if } // add
function instantiate() { $id = get_id(); $template = COTemplates::findById($id); if (!$template instanceof COTemplate) { flash_error(lang("template dnx")); ajx_current("empty"); return; } $parameters = TemplateParameters::getParametersByTemplate($id); $parameterValues = array_var($_POST, 'parameterValues'); if (count($parameters) > 0 && !isset($parameterValues)) { ajx_current("back"); return; } $objects = $template->getObjects(); foreach ($objects as $object) { if (!$object instanceof ProjectDataObject) { continue; } // copy object $copy = $object->copy(); if ($copy->columnExists('is_template')) { $copy->setColumnValue('is_template', false); } if ($copy instanceof ProjectTask) { // don't copy parent task and milestone $copy->setMilestoneId(0); $copy->setParentId(0); } $copy->save(); $wsId = array_var($_POST, 'project_id', active_or_personal_project()->getId()); // if specified, set workspace $workspace = Projects::findById($wsId); if (!$workspace instanceof Project) { $workspace = active_or_personal_project(); } $copy->addToWorkspace($workspace); // add object tags and specified tags $tags = implode(',', $object->getTagNames()); $copy->setTagsFromCSV($tags . "," . array_var($_POST, 'tags')); // copy linked objects $copy->copyLinkedObjectsFrom($object); // copy subtasks if applicable if ($copy instanceof ProjectTask) { ProjectTasks::copySubTasks($object, $copy, false); $manager = new ProjectTask(); } else { if ($copy instanceof ProjectMilestone) { ProjectMilestones::copyTasks($object, $copy, false); $manager = new ProjectMilestone(); } } // copy custom properties $copy->copyCustomPropertiesFrom($object); // set property values as defined in template $objProp = TemplateObjectProperties::getPropertiesByTemplateObject($id, $object->getId()); foreach ($objProp as $property) { $propName = $property->getProperty(); $value = $property->getValue(); if ($manager->getColumnType($propName) == DATA_TYPE_STRING) { if (is_array($parameterValues)) { foreach ($parameterValues as $param => $val) { $value = str_replace('{' . $param . '}', $val, $value); } } } else { if ($manager->getColumnType($propName) == DATA_TYPE_DATE || $manager->getColumnType($propName) == DATA_TYPE_DATETIME) { $operator = '+'; if (strpos($value, '+') === false) { $operator = '-'; } $opPos = strpos($value, $operator); if ($opPos !== false) { $dateParam = substr($value, 1, strpos($value, '}') - 1); $dateUnit = substr($value, strlen($value) - 1); // d, w or m (for days, weeks or months) if ($dateUnit == 'm') { $dateUnit = 'M'; // make month unit uppercase to call DateTimeValue::add with correct parameter } $dateNum = (int) substr($value, strpos($value, $operator), strlen($value) - 2); $date = $parameterValues[$dateParam]; $date = DateTimeValueLib::dateFromFormatAndString(user_config_option('date_format'), $date); $value = $date->add($dateUnit, $dateNum); } } else { if ($manager->getColumnType($propName) == DATA_TYPE_INTEGER) { if (is_array($parameterValues)) { foreach ($parameterValues as $param => $val) { $value = str_replace('{' . $param . '}', $val, $value); } } } } } if ($value != '') { $copy->setColumnValue($propName, $value); $copy->save(); } } //copy assigned to company if applicable if ($copy->getAssignedToUserId() != 0) { $copy->setAssignedToCompanyId($copy->getAssignedTo()->getCompanyId()); $copy->save(); } // copy reminders $reminders = ObjectReminders::getByObject($object); foreach ($reminders as $reminder) { $copy_reminder = new ObjectReminder(); $copy_reminder->setContext($reminder->getContext()); $reminder_date = $copy->getColumnValue($reminder->getContext()); if ($reminder_date instanceof DateTimeValue) { $reminder_date = new DateTimeValue($reminder_date->getTimestamp()); $reminder_date->add('m', -$reminder->getMinutesBefore()); } $copy_reminder->setDate($reminder_date); $copy_reminder->setMinutesBefore($reminder->getMinutesBefore()); $copy_reminder->setObject($copy); $copy_reminder->setType($reminder->getType()); $copy_reminder->setUserId($reminder->getUserId()); $copy_reminder->save(); } } if (is_array($parameters) && count($parameters) > 0) { ajx_current("back"); } else { ajx_current("reload"); } }
/** * Show and process add milestone form * * @access public * @param void * @return null */ function add() { if (logged_user()->isGuest()) { flash_error(lang('no access permissions')); ajx_current("empty"); return; } $this->setTemplate('add_milestone'); $notAllowedMember = ''; if (!ProjectMilestone::canAdd(logged_user(), active_context(), $notAllowedMember)) { if (str_starts_with($notAllowedMember, '-- req dim --')) { flash_error(lang('must choose at least one member of', str_replace_first('-- req dim --', '', $notAllowedMember, $in))); } else { trim($notAllowedMember) == "" ? flash_error(lang('you must select where to keep', lang('the milestone'))) : flash_error(lang('no context permissions to add', lang("milestones"), $notAllowedMember)); } ajx_current("empty"); return; } $milestone_data = array_var($_POST, 'milestone'); if (!is_array($milestone_data)) { // set layout for modal form if (array_var($_REQUEST, 'modal')) { $this->setLayout("json"); tpl_assign('modal', true); } $milestone_data = array('due_date' => '', 'name' => array_var($_GET, 'name', ''), 'assigned_to' => array_var($_GET, 'assigned_to', '0'), 'is_template' => array_var($_GET, "is_template", false)); // array } // if //is template milestone? if (array_var($_REQUEST, 'template_milestone') == true) { $milestone = new TemplateMilestone(); $this->setTemplate(get_template_path('add_template_milestone', 'template_milestone')); } else { $milestone = new ProjectMilestone(); } tpl_assign('milestone_data', $milestone_data); tpl_assign('milestone', $milestone); if (is_array(array_var($_POST, 'milestone'))) { $milestone_data['due_date'] = getDateValue(array_var($milestone_data, 'due_date_value'), DateTimeValueLib::now()->beginningOfDay()); $milestone_data['object_type_id'] = $milestone->getObjectTypeId(); $milestone->setFromAttributes($milestone_data); $urgent = array_var($milestone_data, 'is_urgent'); $milestone->setIsUrgent($urgent); try { $member_ids = json_decode(array_var($_POST, 'members')); if ($milestone instanceof TemplateMilestone) { $milestone->setSessionId(logged_user()->getId()); } DB::beginWork(); $milestone->save(); $object_controller = new ObjectController(); $object_controller->add_to_members($milestone, $member_ids); $object_controller->add_subscribers($milestone); $object_controller->link_to_new_object($milestone); $object_controller->add_custom_properties($milestone); $object_controller->add_reminders($milestone); if (array_var($_GET, 'copyId', 0) > 0) { // copy remaining stuff from the milestone with id copyId $toCopy = ProjectMilestones::findById(array_var($_GET, 'copyId')); if ($toCopy instanceof ProjectMilestone) { ProjectMilestones::copyTasks($toCopy, $milestone, array_var($milestone_data, 'is_template', false)); } } DB::commit(); ApplicationLogs::createLog($milestone, ApplicationLogs::ACTION_ADD); //Send Template milestone to view if ($milestone instanceof TemplateMilestone) { $object = array("action" => "add", "object_id" => $milestone->getObjectId(), "type" => $milestone->getObjectTypeName(), "id" => $milestone->getId(), "name" => $milestone->getObjectName(), "ico" => "ico-milestone", "manager" => get_class($milestone->manager())); evt_add("template object added", array('object' => $object)); } // Send notification try { if (!$milestone instanceof TemplateMilestone && array_var($milestone_data, 'send_notification')) { Notifier::milestoneAssigned($milestone); // send notification } // if } catch (Exception $e) { } // try $is_template = $milestone instanceof TemplateMilestone; if (array_var($_REQUEST, 'modal')) { ajx_current("empty"); $this->setLayout("json"); $this->setTemplate(get_template_path("empty")); // reload milestone info because plugins may have updated some task info (for example: name prefix) if ($is_template) { $milestone = TemplateMilestones::findById($milestone->getId()); $params = array('msg' => lang('success add milestone', $milestone->getObjectName()), 'milestone' => $milestone->getArrayInfo(), 'reload' => array_var($_REQUEST, 'reload')); if ($milestone instanceof TemplateMilestone) { $params = $object; } print_modal_json_response($params, true, array_var($_REQUEST, 'use_ajx')); } else { $milestone = ProjectMilestones::findById($milestone->getId()); flash_success(lang('success add milestone', $milestone->getObjectName())); evt_add("reload current panel"); } } else { if ($milestone instanceof TemplateMilestone) { flash_success(lang('success add template', $milestone->getObjectName())); } else { flash_success(lang('success add milestone', $milestone->getObjectName())); } if (array_var($task_data, 'inputtype') != 'taskview') { ajx_current("back"); } else { ajx_current("reload"); } } } catch (Exception $e) { DB::rollback(); if (array_var($_REQUEST, 'modal')) { $this->setLayout("json"); $this->setTemplate(get_template_path("empty")); print_modal_json_response(array('errorCode' => 1, 'errorMessage' => $e->getMessage())); } else { flash_error($e->getMessage()); } ajx_current("empty"); } // try } // if }