menu($args['year']); } SE_Layout::dol(); } public function yearBudgetAction() { $args = array(); $args['year'] = V::get('year', '', $_REQUEST, 'int'); $args['groups'] = V::get('fltrGroups', array(), $_REQUEST, 'array', array('V', 'filterPositiveInteger')); $args['_print'] = V::get('_print', '', $_REQUEST, 'int'); $hasData = false; $groups = null; if ($args['year'] > 0) { $hasData = $this->fetchDataByYear($args['year'], $args['groups']); $groups = $this->getUsedUserGroups(); } SE_Layout::gora(); SE_Layout::menu(); if (!$args['_print']) { $this->menu($args['year'], $groups, $args['groups']); } if (empty($args['year'])) { ?>
' . json_encode(array_keys($this->_projectPathsOrder)) . ''; //echo'
' . json_encode($this->_projectPathsOrder) . ''; //echo'
' . json_encode($this->_projectInfo) . ''; //echo'
' . json_encode($this->_costs) . ''; //echo'
' . json_encode($this->_plan) . ''; $projectPathsOrder = array_keys($this->_projectPathsOrder); foreach ($projectPathsOrder as $key => $value) { $projectPathsOrder[$key] = "" . $value; } ?> _costs)) { return null; } if (!array_key_exists($month, $this->_costs[$idProject]->costsByMonth)) { return null; } return $this->_costs[$idProject]->costsByMonth[$month]; } public function getPlan($idProject, $month) { if (!array_key_exists($idProject, $this->_plan)) { return 0; } if (!array_key_exists($month, $this->_plan[$idProject])) { return 0; } return $this->_plan[$idProject][$month]; } public function fetchDataByYear($year, $groups) { $this->_fetchCostsByYear($year); $this->_fetchPlanByYear($year); $this->_fetchProjectInfo(); $this->_buildProjectTree(); $this->_reacountCostsFromKoresp(); $this->_filterProjectsByGroups($groups); return count($this->_projectInfo) > 1;// $this->_projectInfo[0] - Wszystkie projekty } public function _filterProjectsByGroups($groups) { if (!empty($groups)) { foreach ($this->_projectInfo as $idProject => $projInfo) { if (!$this->hasGroupsAccessToProjects($idProject, $groups)) { $this->_projectInfo[$idProject]->filteredByGroups = true; } } } } public function _fetchPlanByYear($year) { $db = DB::getDB(); $this->_plan = array(); $sql = " select plan.`ID` , plan.`ID_PROJECT` AS `ID_PROJECT` , plan.`MONTH_1_VALUE` , plan.`MONTH_2_VALUE` , plan.`MONTH_3_VALUE` , plan.`MONTH_4_VALUE` , plan.`MONTH_5_VALUE` , plan.`MONTH_6_VALUE` , plan.`MONTH_7_VALUE` , plan.`MONTH_8_VALUE` , plan.`MONTH_9_VALUE` , plan.`MONTH_10_VALUE` , plan.`MONTH_11_VALUE` , plan.`MONTH_12_VALUE` from `projects_budget_year_month` plan where plan.`year`='{$year}' -- TODO: acl "; //echo'
';print_r($sql);echo''; $res = $db->query($sql); while ($r = $db->fetch($res)) { $plan = array(); for ($i = 1; $i <= 12; $i++) { $plan[$i] = V::get("MONTH_{$i}_VALUE", 0, $r); } $this->_plan[$r->ID_PROJECT] = $plan; } return $this->_plan; } public function _fetchCostsByYear($year) { $db = DB::getDB(); $this->_costs = array(); $sql = " select k.`ID` , k.`ID_PROJECT` AS `ID_PROJECT` , date_format(k.`K_DATA_OTRZYMANEJ_KORESP`,'%Y-%m') AS `MONTH` , k.`COST_VALUE` AS `COST` , k.`INCOME_VALUE` AS `INCOME` , k.`TRANSFER_OPPOSITE_ID_PROJECT` , k.`path` , IF(k.`TRANSFER_OPPOSITE_ID_PROJECT`>0 , (select p.`path` from `IN7_MK_BAZA_DYSTRYBUCJI` p where p.`ID`=k.`TRANSFER_OPPOSITE_ID_PROJECT` limit 1 ) , '') as TRANSFER_OPPOSITE_PROJECT_PATH , k.`K_ZAWARTOS` , k.`K_DATA_OTRZYMANEJ_KORESP` , k.`K_NR_OTRZYM_KORESP` , k.`K_OD_KOGO` from `IN7_DZIENNIK_KORESP` k where ((k.`COST_VALUE` != 0) or (k.`INCOME_VALUE` != 0)) and k.`K_DATA_OTRZYMANEJ_KORESP` like '{$year}-%' -- TODO: acl "; //echo'
';print_r($sql);echo''; $res = $db->query($sql); while ($r = $db->fetch($res)) { $vProjId = ($r->ID_PROJECT > 0)? $r->ID_PROJECT : 0; $vProjPaths = array(); $vProjIds = array(0 => true); if ($r->ID_PROJECT > 0) { $vProjPaths[] = $r->ID_PROJECT; if (!empty($r->path)) { $vProjPaths[] = $r->path; } } if ($r->TRANSFER_OPPOSITE_ID_PROJECT > 0) { $vProjPaths[] = $r->TRANSFER_OPPOSITE_ID_PROJECT; if (!empty($r->TRANSFER_OPPOSITE_PROJECT_PATH)) { $vProjPaths[] = $r->TRANSFER_OPPOSITE_PROJECT_PATH; } } if (!empty($vProjPaths)) { //echo'
DBG:$r->ID_PROJECT['.$r->ID_PROJECT.']: $vProjPaths = ' . json_encode($vProjPaths) . '
'; $vProjPaths = implode('-', $vProjPaths); $projIds = explode('-', $vProjPaths); //echo'DBG:$r->ID_PROJECT['.$r->ID_PROJECT.']: $projIds = ' . json_encode($projIds) . '
'; foreach ($projIds as $vProjId) { if ($vProjId > 0) $vProjIds[$vProjId] = true; } } { $projectZeroInfo = new stdClass(); $projectZeroInfo->ID_PROJECT = 0; $projectZeroInfo->costsByMonth = array(); $projectZeroInfo->korespByMonth = array(); $this->_costs[0] = $projectZeroInfo; } foreach ($vProjIds as $vProjId => $vBool) { if (!array_key_exists($vProjId, $this->_costs)) { $projectInfo = new stdClass(); $projectInfo->ID_PROJECT = $vProjId; $projectInfo->costsByMonth = array(); $projectInfo->korespByMonth = array(); $this->_costs[$vProjId] = $projectInfo; } } $korespInfo = new stdClass(); $korespInfo->ID = $r->ID; $korespInfo->MONTH = $r->MONTH; $korespInfo->K_ZAWARTOS = $r->K_ZAWARTOS; $korespInfo->K_DATA_OTRZYMANEJ_KORESP = $r->K_DATA_OTRZYMANEJ_KORESP; $korespInfo->K_NR_OTRZYM_KORESP = $r->K_NR_OTRZYM_KORESP; $korespInfo->K_OD_KOGO = $r->K_OD_KOGO; $monthNum = intval(substr($r->MONTH, 5, 2)); if ($r->ID_PROJECT > 0) { if ($r->TRANSFER_OPPOSITE_ID_PROJECT > 0) { $korespOppositeInfo = clone $korespInfo; $korespInfo->COST = $r->COST; $korespInfo->INCOME = $r->INCOME; $korespInfo->TRANSFER_OPPOSITE_ID_PROJECT_TO = $r->TRANSFER_OPPOSITE_ID_PROJECT; $this->_costs[$r->ID_PROJECT]->korespByMonth[$monthNum][] = $korespInfo; $korespOppositeInfo->COST = -1 * $r->COST; $korespOppositeInfo->INCOME = -1 * $r->INCOME; $korespOppositeInfo->TRANSFER_OPPOSITE_ID_PROJECT_FROM = $r->ID_PROJECT; $this->_costs[$r->TRANSFER_OPPOSITE_ID_PROJECT]->korespByMonth[$monthNum][] = $korespOppositeInfo; } else { $korespInfo->COST = $r->COST; $korespInfo->INCOME = $r->INCOME; $this->_costs[$r->ID_PROJECT]->korespByMonth[$monthNum][] = $korespInfo; } } else { $korespInfo->COST = $r->COST; $korespInfo->INCOME = $r->INCOME; $this->_costs[0]->korespByMonth[$monthNum][] = $korespInfo; } } return $this->_costs; } public function _fetchProjectInfo() { $db = DB::getDB(); $hasAccessForAllProjects = true; $projectIds = array(); $projectsFromCostIds = array_keys($this->_costs); foreach ($projectsFromCostIds as $idProject) $projectIds[$idProject] = true; $projectsFromPlanIds = array_keys($this->_plan); foreach ($projectsFromPlanIds as $idProject) $projectIds[$idProject] = true; foreach ($projectIds as $idProject => $vBool) $this->_projectInfo[$idProject] = new stdClass(); $projectIds = array_keys($projectIds); $sqlProjIds = "'" . implode("','", $projectIds) . "'"; $sql = " select p.`ID` , p.`P_ID` , p.`path` , p.`M_DIST_DESC` , p.`A_ADM_COMPANY` as aclGroupWrite , p.`A_CLASSIFIED` as aclGroupRead , p.`L_APPOITMENT_USER` as aclOwner from `IN7_MK_BAZA_DYSTRYBUCJI` p where p.`ID` in({$sqlProjIds}) "; $res = $db->query($sql); while ($r = $db->fetch($res)) { $this->_projectInfo[$r->ID]->path = $r->path; $this->_projectInfo[$r->ID]->M_DIST_DESC = $r->M_DIST_DESC; $this->_projectInfo[$r->ID]->aclGroupRead = $r->aclGroupRead; $this->_projectInfo[$r->ID]->hasAccess = $this->_userHasAccessToProject($r); if (!$this->_projectInfo[$r->ID]->hasAccess) $hasAccessForAllProjects = false; } $this->_projectInfo[0]->path = "0"; $this->_projectInfo[0]->M_DIST_DESC = "Wszystkie projekty"; $this->_projectInfo[0]->hasAccess = $hasAccessForAllProjects; } public function hasAccessToProject($idProject) { if ($idProject >= 0) { if (array_key_exists($idProject, $this->_projectInfo)) { return V::get('hasAccess', false, $this->_projectInfo[$idProject]); } } return false; } public function hasGroupsAccessToProjects($idProject, $groups) { $selectedUserGroupNames = array(); $userGroups = $this->_getLdapGroupsNames(); DBG::_('DBG', '>1', "hasGroupsAccessToProjects({$idProject}). userGroups", $userGroups, __CLASS__, __FUNCTION__, __LINE__); foreach ($groups as $idGroup) { $selectedUserGroupNames[$idGroup] = $userGroups[$idGroup]; } DBG::_('DBG', '>1', "hasGroupsAccessToProjects({$idProject}). selectedUserGroupNames", $selectedUserGroupNames, __CLASS__, __FUNCTION__, __LINE__); if ($idProject >= 0) { if (array_key_exists($idProject, $this->_projectInfo)) { DBG::_('DBG', '>1', "hasGroupsAccessToProjects({$idProject}). _projectInfo[$idProject]", $this->_projectInfo[$idProject], __CLASS__, __FUNCTION__, __LINE__); $alcGroupRead = V::get('aclGroupRead', null, $this->_projectInfo[$idProject]); if (!$alcGroupRead) { return false; } if (in_array($alcGroupRead, $selectedUserGroupNames)) { return true; } } } return false; } public function _userHasAccessToProject($project) { $groups = $this->_getLdapGroupsNames(); $userLogin = User::getLogin(); if ($project->aclOwner == $userLogin) { return true; } else if (in_array($project->aclGroupRead, $groups)) { return true; } return false; } public function getUsedUserGroups() { $groups = array(); $userGroups = $this->_getLdapGroupsNames(); DBG::_('DBG', '>2', "getUsedUserGroups(). userGroups:", $userGroups, __CLASS__, __FUNCTION__, __LINE__); foreach ($this->_projectInfo as $projectInfo) { if (!empty($projectInfo->aclGroupRead)) { $groupKey = array_search($projectInfo->aclGroupRead, $userGroups); if ($groupKey !== false) { $groups[$groupKey] = $projectInfo->aclGroupRead; } } } DBG::_('DBG', '>2', "getUsedUserGroups(). groups:", $groups, __CLASS__, __FUNCTION__, __LINE__); return $groups; } public function _getLdapGroupsNames() { $usrStorageMacOSX = UserStorageFactory::getStorage('MacOSX'); if (!$usrStorageMacOSX) throw new Exception("Error storage 'MacOSX' not exists!"); $userGroupsByZasobId = array(); $userGroups = User::getLdapGroupsNames(); DBG::_('DBG', '>3', "_getLdapGroupsNames(). userGroups:", $userGroups, __CLASS__, __FUNCTION__, __LINE__); foreach ($userGroups as $uidGroup) { $idZasob = $usrStorageMacOSX->getGroupIdFromUid($uidGroup); if ($idZasob) { $userGroupsByZasobId[$idZasob] = $uidGroup; } else { //$userGroupsByZasobId[$uidGroup] = $uidGroup; } } DBG::_('DBG', '>3', "_getLdapGroupsNames(). userGroupsByZasobId:", $userGroupsByZasobId, __CLASS__, __FUNCTION__, __LINE__); return $userGroupsByZasobId; } public function _reacountCostsFromKoresp() { $projHasCostSelfIds = array(); foreach ($this->_costs as $kProjId => $vProjInfo) { $projectPath = $this->_projectInfo[$kProjId]->path; foreach ($vProjInfo->korespByMonth as $kMonthNum => $vKorespList) { $this->_createCostIfNotDefined($kProjId, $kMonthNum); foreach ($vKorespList as $vKoresp) { $this->_costs[$kProjId]->costsByMonth[$kMonthNum]->COST_SELF += $vKoresp->COST; $this->_costs[$kProjId]->costsByMonth[$kMonthNum]->INCOME_SELF += $vKoresp->INCOME; } $projHasCostSelfIds[$kProjId][$kMonthNum] = $projectPath; } } //echo'$projHasCostSelfIds: ';print_r($projHasCostSelfIds);echo''; foreach ($projHasCostSelfIds as $kProjId => $vProjMonthsList) { if ($kProjId <= 0) continue; foreach ($vProjMonthsList as $kMonthNum => $vProjPath) { $vProjPathIds = explode('-', $vProjPath); $vProjPathIds = array_reverse($vProjPathIds); $vProjMonthCostSelf = $this->_costs[$kProjId]->costsByMonth[$kMonthNum]->COST_SELF; $vProjMonthIncomeSelf = $this->_costs[$kProjId]->costsByMonth[$kMonthNum]->INCOME_SELF; foreach ($vProjPathIds as $vProjId) { if ($vProjId == $kProjId) continue; $this->_createCostIfNotDefined($vProjId, $kMonthNum); $this->_costs[$vProjId]->costsByMonth[$kMonthNum]->COST_CHILD += $vProjMonthCostSelf; $this->_costs[$vProjId]->costsByMonth[$kMonthNum]->INCOME_CHILD += $vProjMonthIncomeSelf; } } } // recount total foreach ($this->_costs as $vProjId => $vProjInfo) { foreach ($vProjInfo->costsByMonth as $kMonthNum => $vCost) { $this->_createCostIfNotDefined($vProjId, $kMonthNum); $this->_costs[$vProjId]->costsByMonth[$kMonthNum]->COST_TOTAL = $vCost->COST_SELF + $vCost->COST_CHILD; $this->_costs[$vProjId]->costsByMonth[$kMonthNum]->INCOME_TOTAL = $vCost->INCOME_SELF + $vCost->INCOME_CHILD; } } } public function _createCostIfNotDefined($projId, $monthNum) { if (empty($this->_costs[$projId]->costsByMonth[$monthNum])) { $vEmptyCost = new stdClass(); $vEmptyCost->COST_SELF = 0; $vEmptyCost->INCOME_SELF = 0; $vEmptyCost->COST_CHILD = 0; $vEmptyCost->INCOME_CHILD = 0; $vEmptyCost->COST_TOTAL = 0; $vEmptyCost->INCOME_TOTAL = 0; $this->_costs[$projId]->costsByMonth[$monthNum] = $vEmptyCost; } } public function _buildProjectTree() { $this->_projectPathsOrder = array(); foreach ($this->_projectInfo as $idProject => $projectInfo) { $this->_projectPathsOrder[$projectInfo->path] = $idProject; } //echo'
projPaths: ';print_r($this->_projectPathsOrder);echo''; uksort($this->_projectPathsOrder, array($this, 'sortPathsCallback')); //echo'
projPaths sorted: ';print_r($this->_projectPathsOrder);echo''; return $this->_projectPathsOrder; } public function sortPathsCallback($a, $b) { $ea = explode('-', $a); $eb = explode('-', $b); $la = count($ea); $lb = count($eb); $lmin = min($la, $lb); for ($i = 0; $i < $lmin; $i++) { if ($ea[$i] < $eb[$i]) { return -1; } else if ($ea[$i] > $eb[$i]) { return 1; } } return $la - $lb; } public function updatePaths() { $sqlList = array(); $sqlList['updateAllPaths'] = <<