Esempio n. 1
0
 	static function getDimensionById($id) {
 		$dim = array_var(self::$dimensions_by_id, $id);
 		if (!$dim instanceof Dimension) {
 			$dim = Dimensions::findById($id);
 			if ($dim instanceof Dimension) self::$dimensions_by_id[$id] = $dim;
 		}
 		return $dim;
 	}
 function list_members()
 {
     if (!logged_user()->isAdminGroup()) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     ajx_set_no_toolbar();
     $dim_id = array_var($_REQUEST, 'dim', 0);
     $dimension = Dimensions::findById($dim_id);
     if (!$dimension instanceof Dimension) {
         flash_error(lang('dimension snx'));
         ajx_current("empty");
         return;
     }
     if (isset($_REQUEST['page'])) {
         ajx_replace(true);
     }
     // parameters
     $page = array_var($_REQUEST, 'page');
     $order_by = array_var($_REQUEST, 'order');
     $order_by_dir = array_var($_REQUEST, 'order_dir');
     // pagination params
     $items_x_page = array_var($_REQUEST, 'items_x_page', 20);
     if (!$page) {
         $page = 1;
     }
     $offset = $items_x_page * ($page - 1);
     // order defaults
     if (!$order_by) {
         $order_by = 'name';
     }
     if (!in_array($order_by_dir, array('ASC', 'DESC'))) {
         $order_by_dir = 'ASC';
     }
     // this function already checks dimension options
     $dim_name = $dimension->getName();
     // permissions sql
     $perm_sql = "";
     if ($dimension->getDefinesPermissions() && !logged_user()->isAdministrator()) {
         $pg_ids = logged_user()->getPermissionGroupIds();
         $perm_sql = " AND EXISTS (SELECT cmp.member_id FROM " . TABLE_PREFIX . "contact_member_permissions cmp WHERE cmp.member_id=m.id AND cmp.permission_group_id IN (" . implode(',', $pg_ids) . "))";
     }
     $main_sql = "SELECT m.id, l.created_on, l.created_by_id, l.member_id FROM " . TABLE_PREFIX . "members m LEFT JOIN " . TABLE_PREFIX . "application_logs l ON l.member_id=m.id AND l.action='add' WHERE m.dimension_id='{$dim_id}' {$perm_sql}";
     $sql = "{$main_sql}\r\n\t\t\t\tORDER BY {$order_by} {$order_by_dir} \r\n\t\t\t\tLIMIT {$offset}, {$items_x_page}";
     $rows = DB::executeAll($sql);
     $count_sql = str_replace("SELECT m.id, l.created_on, l.created_by_id, l.member_id FROM", "SELECT count(*) as total FROM", $main_sql);
     $count_row = DB::executeAll($count_sql);
     $members = array();
     $ids = array();
     $log_data = array();
     foreach ($rows as $row) {
         $members[] = Members::findById($row['id']);
         $log_data[$row['id']] = array('created_on' => $row['created_on'], 'created_by_id' => $row['created_by_id']);
     }
     $member_type_ids = array_flat(DB::executeAll("SELECT object_type_id FROM " . TABLE_PREFIX . "dimension_object_types WHERE dimension_id={$dim_id} AND is_root=1"));
     $member_types = ObjectTypes::findAll(array('conditions' => 'id IN (' . implode(',', $member_type_ids) . ')'));
     tpl_assign('members', $members);
     tpl_assign('log_data', $log_data);
     tpl_assign('dimension', $dimension);
     tpl_assign('dimension_name', $dim_name);
     tpl_assign('member_types', $member_types);
     tpl_assign('page', $page);
     tpl_assign('total_items', $count_row[0]['total']);
     tpl_assign('items_x_page', $items_x_page);
     tpl_assign('order_by', $order_by);
     tpl_assign('order_by_dir', $order_by_dir);
 }
 function list_all($parameters = null)
 {
     $return_the_list = true;
     // if parameters not specified => use the request
     if (is_null($parameters)) {
         ajx_current("empty");
         $parameters = $_REQUEST;
         $return_the_list = false;
     }
     // Get all variables from request
     $start = array_var($parameters, 'start', '0');
     $limit = array_var($parameters, 'limit', config_option('files_per_page'));
     $order = array_var($parameters, 'sort');
     $order_dir = array_var($parameters, 'dir');
     $dimension_id = array_var($parameters, 'dim_id');
     $member_type_id = array_var($parameters, 'type_id');
     $parent_id = array_var($parameters, 'parent_id');
     $dimension = Dimensions::findById($dimension_id);
     $join_sql = "";
     switch ($order) {
         /*case 'task_completion_p':
         			$order = "d.task_completion_p";
         			break;
         		case 'time_worked_p':
         			$order = "d.time_worked_p";
         			break;
         		case 'total_tasks':
         			$order = "d.total_tasks";
         			break;
         		case 'completed_tasks':
         			$order = "d.completed_tasks";
         			break;
         		case 'total_estimated_time':
         			$order = "d.total_estimated_time";
         			break;
         		case 'total_worked_time':
         			$order = "d.total_worked_time";
         			break;*/
         case 'name':
         case 'description':
             $order = "mem." . $order;
             break;
         default:
             if (str_starts_with($order, "cp_")) {
                 $cp_id = str_replace("cp_", "", $order);
                 $join_sql = "LEFT JOIN " . TABLE_PREFIX . "member_custom_property_values cpv ON cpv.member_id=mem.id AND cpv.custom_property_id={$cp_id}";
                 $order = "LPAD(cpv.`value`, 25, ' ')";
             } else {
                 $order = 'mem.`name`';
             }
             break;
     }
     if (!$order_dir) {
         $order_dir = 'ASC';
     }
     $associated_dimension_ids = array();
     $dimension_associations = DimensionMemberAssociations::findAll(array("conditions" => array("(`dimension_id` = ? AND `object_type_id` = ?) OR (`associated_dimension_id` = ? AND `associated_object_type_id` = ?)", $dimension->getId(), $member_type_id, $dimension->getId(), $member_type_id)));
     foreach ($dimension_associations as $da) {
         /* @var $da DimensionMemberAssociation */
         if ($da->getDimensionId() == $dimension->getId()) {
             $associated_dimension_ids[] = $da->getAssociatedDimensionMemberAssociationId();
         } else {
             $associated_dimension_ids[] = $da->getDimensionId();
         }
     }
     $parent = null;
     if ($parent_id > 0) {
         $parent = Members::findById($parent_id);
     }
     $associated_member_ids = array();
     $extra_conds = "";
     $context = active_context();
     if (is_array($context)) {
         foreach ($context as $sel) {
             if ($sel instanceof Member) {
                 if ($sel->getDimensionId() == $dimension->getId()) {
                     $parent = $sel;
                 } else {
                     if (in_array($sel->getDimensionId(), $associated_dimension_ids)) {
                         $associated_member_ids[] = $sel->getId();
                     }
                 }
             }
         }
     }
     $member_association_cond = "";
     // associated member conditions
     foreach ($associated_member_ids as $amid) {
         if (is_numeric($amid) && $amid > 0) {
             $member_association_cond .= " AND EXISTS (SELECT mpm.id FROM " . TABLE_PREFIX . "member_property_members mpm \r\n\t\t\t\t\tWHERE mpm.member_id=" . TABLE_PREFIX . "members.id AND mpm.property_member_id={$amid} ) ";
         }
     }
     $ids = array();
     $pg_array = logged_user()->getPermissionGroupIds();
     $current_member_cond = $parent instanceof Member ? "AND parent_member_id=" . $parent->getId() : "";
     if ($parent instanceof Member) {
         $extra_conds = " AND archived_by_id=0 AND EXISTS (\r\n\t\t\t\tSELECT cmp.member_id FROM " . TABLE_PREFIX . "contact_member_permissions cmp \r\n\t\t\t\tWHERE cmp.member_id=" . TABLE_PREFIX . "members.id AND cmp.permission_group_id IN (" . implode(',', $pg_array) . "))";
         $members = $parent->getAllChildren(true, 'name', $extra_conds);
         $member_ids = array();
         foreach ($members as $member) {
             if ($member->getObjectTypeId() == $member_type_id) {
                 $member_ids[] = $member->getId();
             }
         }
         if (count($associated_member_ids) > 0 && count($member_ids) > 0) {
             $mpm_sql = "SELECT m.object_id FROM " . TABLE_PREFIX . "members m  \r\n\t\t\t\t\t\tINNER JOIN " . TABLE_PREFIX . "member_property_members mpm ON mpm.member_id=m.id \r\n\t\t\t\t\t\tWHERE m.id IN (" . implode(',', $member_ids) . ") \r\n\t\t\t\t\t\tAND mpm.property_member_id IN (" . implode(',', $associated_member_ids) . ")";
             $ids = array_flat(DB::executeAll($mpm_sql));
         }
         $ids = $member_ids;
     } else {
         $dim_controller = new DimensionController();
         $members = $dim_controller->initial_list_dimension_members($dimension->getId(), null, array($member_type_id), false, $extra_conds . $member_association_cond);
         foreach ($members as $m) {
             $ids[] = $m['id'];
         }
     }
     if (count($ids) == 0) {
         $ids[] = 0;
     }
     $sql = "SELECT *, mem.id as member_id FROM " . TABLE_PREFIX . "members mem\r\n\t\t--\tLEFT JOIN " . TABLE_PREFIX . "member_additional_data d ON c.object_id=d.customer_id\r\n\t\t\t{$join_sql}\r\n\t\t\tWHERE mem.id IN (" . implode(',', $ids) . ") AND mem.dimension_id=" . $dimension->getId() . "\r\n\t\t\tORDER BY {$order} {$order_dir}\r\n\t\t\tLIMIT {$start}, {$limit}";
     $rows = DB::executeAll($sql);
     if (!is_array($rows)) {
         $rows = array();
     }
     $object = $this->prepareObject($rows, $start, $limit, $dimension, $member_type_id, count($ids));
     if ($return_the_list) {
         return $object;
     } else {
         ajx_extra_data($object);
         tpl_assign("listing", $object);
     }
 }
 function enable_disable_dimensions()
 {
     ajx_current("empty");
     if (!can_manage_configuration(logged_user())) {
         flash_error(lang('no access permissions'));
         ajx_current("empty");
         return;
     }
     $dims = json_decode(array_var($_REQUEST, 'dims'), true);
     //check active dims
     $at_least_one_dim_enabled = false;
     foreach ($dims as $dim_id => $enabled) {
         if ($enabled == true) {
             $at_least_one_dim_enabled = true;
             break;
         }
     }
     if (!$at_least_one_dim_enabled) {
         flash_error(lang('at least one dimension must be selected'));
         ajx_current("empty");
         return;
     }
     $root_dids = explode(",", user_config_option('root_dimensions', null, logged_user()->getId()));
     $update_root_dimensions = false;
     $enabled_dim_vals = array();
     foreach ($dims as $dim_id => $enabled) {
         if ($enabled) {
             $enabled_dim_vals[] = $dim_id;
             if (!in_array($dim_id, $root_dids)) {
                 $root_dids[] = $dim_id;
                 $update_root_dimensions = true;
             }
             $dim = Dimensions::findById($dim_id);
             if (($dim->getCode() == 'workspaces' || $dim->getCode() == 'tags') && !Plugins::instance()->isActivePlugin('workspaces')) {
                 $plugin = Plugins::instance()->findOne(array('conditions' => "name='workspaces'"));
                 if ($plugin instanceof Plugin) {
                     $plugin->activate();
                 }
             } else {
                 if ($dim->getCode() == 'customer_project' && !Plugins::instance()->isActivePlugin('crpm')) {
                     $plugin = Plugins::instance()->findOne(array('conditions' => "name='crpm'"));
                     if ($plugin instanceof Plugin) {
                         $plugin->activate();
                     }
                 }
             }
         }
     }
     set_config_option('enabled_dimensions', implode(',', $enabled_dim_vals));
     if ($update_root_dimensions) {
         set_user_config_option('root_dimensions', implode(',', $root_dids), logged_user()->getId());
     }
     ajx_extra_data(array('ok' => '1'));
 }