|
|
@@ -3,6 +3,7 @@
|
|
|
Lib::loadClass('RouteBase');
|
|
|
Lib::loadClass('ProcesHelper');
|
|
|
Lib::loadClass('TableAjax');
|
|
|
+Lib::loadClass('UserStorageFactory');
|
|
|
|
|
|
class Route_Budget extends RouteBase {
|
|
|
|
|
|
@@ -195,524 +196,40 @@ jQuery(document).ready(function () {
|
|
|
$months[] = $i + 1;
|
|
|
}
|
|
|
$this->css();
|
|
|
- if(V::get('DBG','',$_GET)){echo'<pre style="width:600px;border:1px solid red;max-height:300px;overflow:auto;display:none">';print_r($this->_costs);echo'</pre>';}
|
|
|
-?>
|
|
|
-<div class="container">
|
|
|
- <div style="float:right;color:#aaa;"><?php echo date("Y-m-d"); ?></div>
|
|
|
- <h1>Zestawienie kosztów projektów na rok <?php echo $year; ?></h1>
|
|
|
-</div>
|
|
|
- <table cellspacing="0" cellpadding="0" border="0" id="zestawienie-kosztow-projektow" class="zestawienie-kosztow-tbl">
|
|
|
- <thead>
|
|
|
- <tr>
|
|
|
- <td colspan="3" class="p2">
|
|
|
- <span class="pull-right"><b>miesiąc</b> <span class="month_cols_picker"></span></span>
|
|
|
- </td>
|
|
|
- <?php foreach ($months as $month) { ?>
|
|
|
- <th class="c col_month_<?php echo $month; ?> thead_col_month" colspan="3"><?php echo sprintf("%02d", $month); ?></th>
|
|
|
- <?php } ?>
|
|
|
- </tr>
|
|
|
- <tr>
|
|
|
- <td colspan="3" class="p2">
|
|
|
- <span class="pull-left">
|
|
|
- <input type="checkbox" onclick="return showHideAll(this);"/> pokaż tylko zaznaczone
|
|
|
- </span>
|
|
|
- </td>
|
|
|
- <?php foreach ($months as $month) { ?>
|
|
|
- <th class="c col_month_<?php echo $month; ?>" title="Koszty wprowadzone do korespondencji">Koszty</th>
|
|
|
- <th class="c col_month_<?php echo $month; ?>" title="Plan budżetu">Plan</th>
|
|
|
- <th class="c col_month_<?php echo $month; ?>" title="Procent przekroczenia planu">%</th>
|
|
|
- <?php } ?>
|
|
|
- </tr>
|
|
|
- </thead>
|
|
|
- <tbody>
|
|
|
- <?php $t = 1; ?>
|
|
|
- <?php foreach ($this->_projectPathsOrder as $projPath => $projId) : ?>
|
|
|
- <?php
|
|
|
- $projectID = $projId;
|
|
|
- $projectDesc = $this->_projectInfo[$projId]->M_DIST_DESC;
|
|
|
- $projectPath = $this->_projectInfo[$projId]->path;
|
|
|
- $projectAccess = $this->hasAccessToProject($projectID);
|
|
|
- if (!empty($groups)) {
|
|
|
- if (!$projectAccess) {
|
|
|
- //echo '<pre>TODO: filtered by acl for project';print_r($this->_projectInfo[$projId]);echo'</pre>';
|
|
|
- continue;
|
|
|
- }
|
|
|
- if (!$this->hasGroupsAccessToProjects($projectID, $groups)) {
|
|
|
- //echo '<pre>TODO: filtered by acl and groups';print_r($this->_projectInfo[$projId]);echo'</pre>';
|
|
|
- continue;
|
|
|
- }
|
|
|
- }
|
|
|
- ?>
|
|
|
- <tr class="row-<?php echo ($t = 1 - $t); ?>"
|
|
|
- data-proj_id="<?php echo $projectID; ?>"
|
|
|
- data-path="<?php echo $projectPath; ?>">
|
|
|
- <td class="p2 r nr">
|
|
|
- <input type="checkbox" name="selectedProject" onclick="return selectProject(this);" value="<?php echo $projectID; ?>" />
|
|
|
- </td>
|
|
|
- <td class="p2 l nr"><nobr><?php echo $projectPath; ?></nobr></td>
|
|
|
- <?php if (!$projectAccess) : ?>
|
|
|
- <td class="p2">***</td>
|
|
|
- <?php else : ?>
|
|
|
- <td class="p2" style="max-width:300px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;" title="<?php echo $projectDesc; ?>"><?php echo $projectDesc; ?></td>
|
|
|
- <?php endif; ?>
|
|
|
- <?php foreach ($months as $month) : ?>
|
|
|
- <?php $vMonthCost = $this->getCost($projectID, $month); ?>
|
|
|
- <?php $monthCostTotal = ($vMonthCost)? $vMonthCost->COST_TOTAL : 0; ?>
|
|
|
- <?php if (!$projectAccess) : ?>
|
|
|
- <td class="col_month_<?php echo $month; ?>" style="min-width:30px;text-align:right;">***</td>
|
|
|
- <?php elseif (!$vMonthCost) : ?>
|
|
|
- <td class="col_month_<?php echo $month; ?>" style="min-width:30px"> </td>
|
|
|
- <?php else : ?>
|
|
|
- <?php
|
|
|
- $vCostChildOut = number_format($vMonthCost->COST_CHILD, 2);
|
|
|
- $vCostSelfOut = number_format($vMonthCost->COST_SELF, 2);
|
|
|
- $vCostTotalOut = number_format($vMonthCost->COST_TOTAL, 2);
|
|
|
- $vCostTotalOutJs = number_format($vMonthCost->COST_TOTAL, 2, '.', '');
|
|
|
- $title = "Koszt projektu {$vCostSelfOut} / koszt podprojektów $vCostChildOut";
|
|
|
- $cellCostCls = '';
|
|
|
- if ($vMonthCost->COST_CHILD > 0) {
|
|
|
- if ($vMonthCost->COST_SELF > 0) {
|
|
|
- $cellCostCls = 'cell-cost-self_and_child';
|
|
|
- } else {
|
|
|
- $cellCostCls = 'cell-cost-only_child';
|
|
|
- }
|
|
|
- } else {
|
|
|
- $cellCostCls = 'cell-cost-only_self';
|
|
|
- }
|
|
|
- ?>
|
|
|
- <td class="cell-cost <?php echo $cellCostCls; ?> col_month_<?php echo $month; ?>"
|
|
|
- data-month_num="<?php echo $month; ?>"
|
|
|
- data-cost="<?php echo $vCostTotalOutJs; ?>"
|
|
|
- data-proj_path="<?php echo $projectPath; ?>"
|
|
|
- data-proj_id="<?php echo $projectID; ?>">
|
|
|
- <span class="ttip" title="<?php echo $title; ?>"><?php echo $vCostTotalOut; ?></span>
|
|
|
- </td>
|
|
|
- <?php endif; ?>
|
|
|
- <?php $monthPlan = $this->getPlan($projectID, $month); ?>
|
|
|
- <?php $monthPlanOut = number_format($monthPlan, 2); ?>
|
|
|
- <?php $monthPlanOutJs = number_format($monthPlan, 2, '.', ''); ?>
|
|
|
- <td class="cell-plan col_month_<?php echo $month; ?>"
|
|
|
- data-month_num="<?php echo $month; ?>"
|
|
|
- data-plan="<?php echo $monthPlanOutJs; ?>">
|
|
|
- <?php if (!$projectAccess) : ?>
|
|
|
- ***
|
|
|
- <?php elseif ($monthPlan > 0) : ?>
|
|
|
- <?php echo $monthPlan; ?>
|
|
|
- <?php else : ?>
|
|
|
-
|
|
|
- <?php endif; ?>
|
|
|
- </td>
|
|
|
- <?php
|
|
|
- $cellProcentCls = '';
|
|
|
- $procentOut = ' ';
|
|
|
- $monthPlan = $this->getPlan($projectID, $month);
|
|
|
- if ($monthPlan > 0) {
|
|
|
- $procentOut = round(($monthCostTotal * 100) / $monthPlan);
|
|
|
- if ($procentOut > 150) {
|
|
|
- $cellProcentCls = 'cell-procent-over150';
|
|
|
- } else if ($procentOut > 100) {
|
|
|
- $cellProcentCls = 'cell-procent-over100';
|
|
|
- } else if ($procentOut == 100) {
|
|
|
- $cellProcentCls = 'cell-procent-100';
|
|
|
- } else {
|
|
|
- $cellProcentCls = 'cell-procent-below100';
|
|
|
- }
|
|
|
- }
|
|
|
- ?>
|
|
|
- <?php if (!$projectAccess) : ?>
|
|
|
- <td class="col_month_<?php echo $month; ?>" style="min-width:30px;text-align:right;">***</td>
|
|
|
- <?php else : ?>
|
|
|
- <td class="cell-procent <?php echo $cellProcentCls; ?> col_month_<?php echo $month; ?>"><?php echo $procentOut; ?></td>
|
|
|
- <?php endif; ?>
|
|
|
- <?php endforeach; ?>
|
|
|
- </tr>
|
|
|
- <?php endforeach; ?>
|
|
|
- </tbody>
|
|
|
- </table>
|
|
|
- <script>
|
|
|
-jQuery(document).ready(function() {
|
|
|
- jQuery('#zestawienie-kosztow-projektow')
|
|
|
- .find('.cell-cost')
|
|
|
- .on('click', function(e) {
|
|
|
- var $n = jQuery(this),
|
|
|
- $modal = jQuery('#projectMonthCostDetails'),
|
|
|
- projId = $n.data('proj_id'),
|
|
|
- monthNum = $n.data('month_num'),
|
|
|
- projPath = '' + $n.data('proj_path'),
|
|
|
- projPathLength = projPath.length,
|
|
|
- modalBody = document.createElement('table'),
|
|
|
- totalDescrCell = document.createElement('td'),
|
|
|
- totalCostCell = document.createElement('td'),
|
|
|
- totalEmptyCell = document.createElement('td'),
|
|
|
- totalRow = document.createElement('tr');
|
|
|
- modalBody.className = 'zestawienie-kosztow-tbl';
|
|
|
- modalBody.style.width = '100%';
|
|
|
- // $n.data() = {proj_id: 3943, proj_path: "0-4132-3943", month_num: 2}
|
|
|
- // table#proj-koresp-info > tbody#row-proj-2055-koresp-by-month-2
|
|
|
- jQuery('#proj-koresp-info').find('tbody').each(function(i, tbody) {
|
|
|
- var vPath = jQuery(tbody).data('proj_path'),
|
|
|
- vMonthNum = jQuery(tbody).data('month_num');
|
|
|
- if (monthNum != vMonthNum) return;
|
|
|
- if (projPathLength > vPath.length) return;
|
|
|
- if (projPath == vPath
|
|
|
- || (projPathLength < vPath.length && projPath + '-' == vPath.substr(0, projPathLength + 1))
|
|
|
- ) {
|
|
|
- modalBody.appendChild(tbody.cloneNode(true));
|
|
|
- }
|
|
|
- });
|
|
|
- {
|
|
|
- totalDescrCell.className = 'p2';
|
|
|
- totalDescrCell.style.textAlign = 'right';
|
|
|
- totalDescrCell.setAttribute('colspan', '2');
|
|
|
- totalDescrCell.appendChild(document.createTextNode('Suma:'));
|
|
|
- totalCostCell.className = 'cell-cost';
|
|
|
- totalCostCell.style.textAlign = 'right';
|
|
|
- totalCostCell.appendChild(document.createTextNode($n.data('cost')));
|
|
|
- totalRow.appendChild(totalDescrCell);
|
|
|
- totalRow.appendChild(totalCostCell);
|
|
|
- modalBody.appendChild(totalRow);
|
|
|
- }
|
|
|
- $modal.find('.modal-title').text('Koszty projektu nr ' + projId + ' w miesiącu <?php echo $year; ?>-' + ((monthNum > 9)? monthNum : '0' + monthNum));
|
|
|
- $modal.find('.modal-body').html(modalBody);
|
|
|
- $modal.modal({});
|
|
|
- })
|
|
|
-
|
|
|
- jQuery('#zestawienie-kosztow-projektow').data('visible_months', <?php echo json_encode($months); ?>);
|
|
|
-
|
|
|
- jQuery('#zestawienie-kosztow-projektow').on('show_month', function(e, argMonthNum) {
|
|
|
- var this$Node = $(this),
|
|
|
- monthNum = parseInt(argMonthNum),
|
|
|
- visibleMonths = this$Node.data('visible_months'),
|
|
|
- dbgLvl = parseInt(this$Node.data('dbg_lvl'))
|
|
|
- ;
|
|
|
- if(dbgLvl){console.log('event:show_month argMonthNum', argMonthNum);}
|
|
|
- monthNum = parseInt(monthNum);
|
|
|
- if (monthNum < 1 || monthNum > 12) return;
|
|
|
- if (-1 === visibleMonths.indexOf(monthNum)) {
|
|
|
- visibleMonths.push(monthNum);
|
|
|
- this$Node.data('visible_months', visibleMonths);
|
|
|
- if(dbgLvl>1){console.log('event:show_month removed monthNum', monthNum, 'visibleMonths', visibleMonths);}
|
|
|
- this$Node.trigger('visible_months_changed');
|
|
|
- // TODO: trigger render_sum
|
|
|
- } else {
|
|
|
- if(dbgLvl>1){console.log('event:hide_month monthNum('+monthNum+') already in visibleMonths', visibleMonths);}
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- jQuery('#zestawienie-kosztow-projektow').on('hide_month', function(e, argMonthNum) {
|
|
|
- var this$Node = $(this),
|
|
|
- monthNum = parseInt(argMonthNum),
|
|
|
- monthInd,
|
|
|
- visibleMonths = this$Node.data('visible_months'),
|
|
|
- dbgLvl = parseInt(this$Node.data('dbg_lvl'))
|
|
|
- ;
|
|
|
- if(dbgLvl){console.log('event:hide_month argMonthNum', argMonthNum);}
|
|
|
- if (monthNum < 1 || monthNum > 12) return;
|
|
|
- monthInd = visibleMonths.indexOf(monthNum);
|
|
|
- if (-1 === monthInd) {
|
|
|
- if(dbgLvl>1){console.log('event:hide_month monthNum('+monthNum+') not in visibleMonths', visibleMonths);}
|
|
|
- } else {
|
|
|
- visibleMonths.splice(monthInd, 1);
|
|
|
- this$Node.data('visible_months', visibleMonths);
|
|
|
- if(dbgLvl>1){console.log('event:hide_month removed monthNum', monthNum, 'visibleMonths', visibleMonths);}
|
|
|
- this$Node.trigger('visible_months_changed');
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- jQuery('#zestawienie-kosztow-projektow').on('visible_months_changed', function(e) {
|
|
|
- var this$Node = $(this);
|
|
|
- this$Node.trigger('render_cols_select');
|
|
|
- this$Node.trigger('render_cols');
|
|
|
- this$Node.trigger('render_sum');
|
|
|
- });
|
|
|
-
|
|
|
- jQuery('#zestawienie-kosztow-projektow').on('initial_render', function(e) {
|
|
|
- var this$Node = $(this);
|
|
|
- this$Node.trigger('render_cols_select');
|
|
|
- this$Node.trigger('render_cols');
|
|
|
- this$Node.trigger('render_sum');
|
|
|
-
|
|
|
- var theadFirstRow$Node = $('#zestawienie-kosztow-projektow').find('thead').find('tr:first'),
|
|
|
- close$Node;
|
|
|
- for (var i = 1; i <= 12; i++) {
|
|
|
- close$Node = $('<i class="pull-right glyphicon glyphicon-remove col_month_remove"></i>').appendTo(theadFirstRow$Node.find('.col_month_' + i));
|
|
|
- close$Node.css({padding:'2px', cursor: 'pointer', color:'red'});
|
|
|
- close$Node.data('month_num', i);
|
|
|
- close$Node.on('click', function(e) {
|
|
|
- var this$Node = $(this),
|
|
|
- monthNum = this$Node.data('month_num'),
|
|
|
- root$Node = $('#zestawienie-kosztow-projektow'),
|
|
|
- dbgLvl = parseInt(root$Node.data('dbg_lvl'))
|
|
|
- ;
|
|
|
- if(dbgLvl){console.log('click month col remove btn:', monthNum);}
|
|
|
- root$Node.trigger('hide_month', monthNum);
|
|
|
- });
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- jQuery('#zestawienie-kosztow-projektow').on('render_cols_select', function(e) {
|
|
|
- var this$Node = $(this),
|
|
|
- dbgLvl = parseInt(this$Node.data('dbg_lvl'))
|
|
|
- ;
|
|
|
- if(dbgLvl){console.log('event:render_cols_select');}
|
|
|
- var this$Node = $(this),
|
|
|
- visibleMonths = this$Node.data('visible_months'),
|
|
|
- nodeClass = 'month_cols_picker',
|
|
|
- currentNode,
|
|
|
- node
|
|
|
- ;
|
|
|
- currentNode = this$Node.find('thead').find('.' + nodeClass);
|
|
|
- node = $('<div class="btn-group pull-right dropdown columnpicker ' + nodeClass + '"></div>');
|
|
|
- var btn = $('<button class="btn btn-sm btn-link dropdown-toggle" data-toggle="dropdown" href="#">wybierz </button>').appendTo(node);
|
|
|
- btn.css({padding: '0 10px'});
|
|
|
- var span = $('<span class="caret"></span>').appendTo(btn);
|
|
|
- var ul$Node = $('<ul class="dropdown-menu">').appendTo(node);
|
|
|
-
|
|
|
- for (var i = 1; i <= 12; i++) {
|
|
|
- var li$Node = $('<li class="checkbox" style="margin:0 10px;"></li>').appendTo(ul$Node),
|
|
|
- label$Node = $('<label></label>').appendTo(li$Node),
|
|
|
- input$Node;
|
|
|
- input$Node = $('<input type="checkbox" title="' + i + '" value="' + i + '" >').appendTo(label$Node);
|
|
|
- label$Node.append(' ' + i);
|
|
|
- input$Node.prop('checked', (-1 !== visibleMonths.indexOf(i)));
|
|
|
- }
|
|
|
- {// show months all
|
|
|
- if (visibleMonths.length < 12) {
|
|
|
- var li$Node = $('<li class="checkbox" style="margin:0 10px;"></li>').appendTo(ul$Node),
|
|
|
- btnViewAll$Node = $('<button class="btn btn-link">Pokaż wszystkie</button>').appendTo(li$Node)
|
|
|
- ;
|
|
|
- btnViewAll$Node.on('click', function(e) {
|
|
|
- var root$Node = $('#zestawienie-kosztow-projektow'),
|
|
|
- visibleMonths = root$Node.data('visible_months')
|
|
|
- ;
|
|
|
- if (visibleMonths.length < 12) {
|
|
|
- visibleMonths = [];
|
|
|
- for (var i = 1; i <= 12; i++) visibleMonths.push(i);
|
|
|
- root$Node.data('visible_months', visibleMonths);
|
|
|
- root$Node.trigger('visible_months_changed');
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- }
|
|
|
- node.on('change', 'input', function(e) {
|
|
|
- var this$Node = $(this),
|
|
|
- monthNum = this$Node.val(),
|
|
|
- dbgLvl = parseInt($('#zestawienie-kosztow-projektow').data('dbg_lvl'))
|
|
|
- ;
|
|
|
- e.preventDefault();
|
|
|
- e.stopPropagation();
|
|
|
- if(dbgLvl>1){console.log('change checkbox val:', this$Node.val(), 'checked:', this$Node.prop('checked'));}
|
|
|
- if (this$Node.prop('checked')) {
|
|
|
- jQuery('#zestawienie-kosztow-projektow').trigger('show_month', monthNum);
|
|
|
- } else {
|
|
|
- jQuery('#zestawienie-kosztow-projektow').trigger('hide_month', monthNum);
|
|
|
- }
|
|
|
- });
|
|
|
- currentNode.replaceWith(node);
|
|
|
- });
|
|
|
-
|
|
|
- // @require css: #zestawienie-kosztow-projektow.hidden_month_1 .col_month_1 {display:none}
|
|
|
- jQuery('#zestawienie-kosztow-projektow').on('render_cols', function(e) {
|
|
|
- var this$Node = $(this),
|
|
|
- thead$Node = this$Node.find('thead'),
|
|
|
- tbody$Node = this$Node.find('tbody'),
|
|
|
- visibleMonths = this$Node.data('visible_months'),
|
|
|
- dbgLvl = parseInt($('#zestawienie-kosztow-projektow').data('dbg_lvl'))
|
|
|
- ;
|
|
|
- if(dbgLvl){console.log('event:render_cols visibleMonths', visibleMonths);}
|
|
|
- for (var i = 1; i <= 12; i++) {
|
|
|
- if (-1 === visibleMonths.indexOf(i)) {
|
|
|
- this$Node.addClass('hidden_month_' + i);
|
|
|
- } else {
|
|
|
- this$Node.removeClass('hidden_month_' + i);
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
+ //DBG::_('DBG', '>1', "costs", $this->_costs, __CLASS__, __FUNCTION__, __LINE__);
|
|
|
|
|
|
- jQuery('#zestawienie-kosztow-projektow').on('render_sum', function(e) {
|
|
|
- var this$Node = $(this),
|
|
|
- thead$Node = this$Node.find('thead'),
|
|
|
- tbody$Node = this$Node.find('tbody'),
|
|
|
- visibleMonths = this$Node.data('visible_months'),
|
|
|
- dbgLvl = parseInt($('#zestawienie-kosztow-projektow').data('dbg_lvl'))
|
|
|
- ;
|
|
|
- if(dbgLvl){console.log('event:render_sum visibleMonths', visibleMonths);}
|
|
|
- if (!thead$Node.find('.thead__cols_summary').length) {
|
|
|
- $('<th colspan="2" class="thead__cols_summary c">Suma</th>').appendTo(thead$Node.children('tr:first'));
|
|
|
- $('<th class="thead__cols_summary c">Koszty</th>').appendTo(thead$Node.children('tr:last'));
|
|
|
- $('<th class="thead__cols_summary c">Plan</th>').appendTo(thead$Node.children('tr:last'));
|
|
|
- tbody$Node.find('tr').each(function(ind, n) {
|
|
|
- var this$Node = $(this);
|
|
|
- $('<td class="row__summary__cost r"></td>').appendTo(this$Node);
|
|
|
- $('<td class="row__summary__plan r"></td>').appendTo(this$Node);
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- tbody$Node.find('tr').each(function(ind, n) {
|
|
|
- var this$Node = $(this),
|
|
|
- rowSumCost = 0,
|
|
|
- rowSumPlan = 0
|
|
|
- ;
|
|
|
- this$Node.find('.cell-cost').each(function(ind, n) {
|
|
|
- var monthNum = $(this).data('month_num'),
|
|
|
- costValueOut = $(this).data('cost'),
|
|
|
- costValue = 0
|
|
|
- ;
|
|
|
- monthNum = parseInt(monthNum);
|
|
|
- if (monthNum < 1 || monthNum > 12) return;
|
|
|
- if (-1 === visibleMonths.indexOf(monthNum)) {
|
|
|
- if(dbgLvl>2){console.log('HIDE: .cell-cost monthNum', monthNum, 'costValueOut', costValueOut, 'visibleMonths', visibleMonths);}
|
|
|
- return;
|
|
|
- } else {
|
|
|
- costValue = parseFloat(costValueOut);
|
|
|
- if (isNaN(costValue) || !costValue) costValue = 0;
|
|
|
- if (costValue) rowSumCost += costValue;
|
|
|
- }
|
|
|
- if(dbgLvl>2){console.log('.cell-cost monthNum', monthNum, 'costValueOut', costValueOut, 'visibleMonths', visibleMonths);}
|
|
|
- });
|
|
|
- this$Node.find('.cell-plan').each(function(ind, n) {
|
|
|
- var monthNum = $(this).data('month_num'),
|
|
|
- planValueOut = $(this).data('plan'),
|
|
|
- planValue = 0
|
|
|
- ;
|
|
|
- monthNum = parseInt(monthNum);
|
|
|
- if (monthNum < 1 || monthNum > 12) return;
|
|
|
- if (-1 === visibleMonths.indexOf(monthNum)) {
|
|
|
- if(dbgLvl>2){console.log('HIDE: .cell-cost monthNum', monthNum, 'planValueOut', planValueOut, 'visibleMonths', visibleMonths);}
|
|
|
- return;
|
|
|
- } else {
|
|
|
- planValue = parseFloat(planValueOut);
|
|
|
- if (isNaN(planValue) || !planValue) planValue = 0;
|
|
|
- if (planValue) rowSumPlan += planValue;
|
|
|
- }
|
|
|
- if(dbgLvl>2){console.log('.cell-cost monthNum', monthNum, 'planValueOut', planValueOut, 'visibleMonths', visibleMonths);}
|
|
|
- });
|
|
|
- this$Node.find('.row__summary__cost').html((rowSumCost)? rowSumCost.toFixed(2) : '');
|
|
|
- this$Node.find('.row__summary__plan').html((rowSumPlan)? rowSumPlan.toFixed(2) : '');
|
|
|
- });
|
|
|
- });
|
|
|
-
|
|
|
- jQuery('#zestawienie-kosztow-projektow').trigger('initial_render');
|
|
|
-});
|
|
|
- </script>
|
|
|
-
|
|
|
- <!-- Modal -->
|
|
|
- <div class="modal fade" id="projectMonthCostDetails" tabindex="-1" role="dialog" aria-labelledby="projectCostDMonthetailsLabel">
|
|
|
- <div class="modal-dialog" role="document" style="min-width:800px;">
|
|
|
- <div class="modal-content">
|
|
|
- <div class="modal-header">
|
|
|
- <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
|
|
- <h4 class="modal-title" id="projectCostDMonthetailsLabel">Modal title</h4>
|
|
|
- </div>
|
|
|
- <div class="modal-body">
|
|
|
- TODO: projectMonthCostDetails...
|
|
|
- </div>
|
|
|
- <div class="modal-footer">
|
|
|
- <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <table id="proj-koresp-info" style="display:none">
|
|
|
- <?php foreach ($this->_projectPathsOrder as $projPath => $projId) : ?>
|
|
|
- <?php
|
|
|
- $projectInfo = $this->_costs[$projId];
|
|
|
- if (!$projectInfo) {
|
|
|
- continue;
|
|
|
+ if (!empty($groups)) {
|
|
|
+ foreach ($this->_projectInfo as $idProject => $projInfo) {
|
|
|
+ if (!$this->hasGroupsAccessToProjects($idProject, $groups)) {
|
|
|
+ $this->_projectInfo[$idProject]->filteredByGroups = true;
|
|
|
}
|
|
|
- $projectID = $projId;
|
|
|
- $projectDesc = $this->_projectInfo[$projId]->M_DIST_DESC;
|
|
|
- $projectPath = $this->_projectInfo[$projId]->path;
|
|
|
- ?>
|
|
|
- <?php if (!empty($projectInfo->korespByMonth)) : ?>
|
|
|
- <?php foreach ($projectInfo->korespByMonth as $kMonth => $vKorespMonthList) : ?>
|
|
|
- <tbody id="row-proj-<?php echo $projectID; ?>-koresp-by-month-<?php echo $kMonth; ?>"
|
|
|
- data-month_num="<?php echo $kMonth; ?>"
|
|
|
- data-proj_path="<?php echo $projectPath; ?>"
|
|
|
- data-proj_id="<?php echo $projectID; ?>">
|
|
|
- <tr>
|
|
|
- <td style="padding:3px;font-size:1em;background:#eee;"><nobr><?php echo $projectPath; ?></nobr></td>
|
|
|
- <td colspan="3" style="padding:3px;font-size:1.1em;background:#eee;max-width:500px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;" title="<?php echo $projectDesc; ?>">
|
|
|
- <!-- Koszty projektu nr <?php echo $projectID; ?> -->
|
|
|
- <!-- - miesiąc <?php echo $year; ?>-<?php echo sprintf("%02d", $kMonth); ?> -->
|
|
|
- <?php echo $projectDesc; ?>
|
|
|
- </td>
|
|
|
- </tr>
|
|
|
- <?php foreach ($vKorespMonthList as $kKorespIdx => $vKorespInfo) : ?>
|
|
|
- <?php /*
|
|
|
- * [ID] => 41235
|
|
|
- * [MONTH] => 2015-02
|
|
|
- * [K_ZAWARTOS] => Faktura za pomiar powykonawczy sieci telekomunikacyjnej
|
|
|
- * [COST] => 1000.00
|
|
|
- * [INCOME] => 0.00
|
|
|
- ? [TRANSFER_OPPOSITE_ID_PROJECT] => int
|
|
|
- */
|
|
|
- $transferToId = V::get('TRANSFER_OPPOSITE_ID_PROJECT_TO', 0, $vKorespInfo);
|
|
|
- $transferFromId = V::get('TRANSFER_OPPOSITE_ID_PROJECT_FROM', 0, $vKorespInfo);
|
|
|
- $rowStyle = ($transferToId > 0)? 'font-style:italic;color:#bbb;' : '';
|
|
|
- ?>
|
|
|
- <tr>
|
|
|
- <td class="p2 r nr"><?php echo $vKorespInfo->ID; ?></td>
|
|
|
- <td class="p2"
|
|
|
- style="max-width:400px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;<?php echo $rowStyle; ?>"
|
|
|
- title="<?php echo $vKorespInfo->K_ZAWARTOS; ?>"><?php echo $vKorespInfo->K_ZAWARTOS; ?></td>
|
|
|
- <?php $vKorespCostOut = number_format($vKorespInfo->COST, 2); ?>
|
|
|
- <td class="cell-cost cell-cost-only_child"><?php echo $vKorespCostOut; ?></td>
|
|
|
- <td class="p2 cell-transfer_opposite_id_project">
|
|
|
- <?php if ($transferFromId > 0) : ?>
|
|
|
- Transfer z projektu nr <?php echo $transferFromId; ?>
|
|
|
- <?php endif; ?>
|
|
|
- <?php if ($transferToId > 0) : ?>
|
|
|
- Transfer do projektu nr <?php echo $transferToId; ?>
|
|
|
- <?php endif; ?>
|
|
|
- </td>
|
|
|
- </tr>
|
|
|
- <?php endforeach; ?>
|
|
|
- </tbody>
|
|
|
- <?php endforeach; ?>
|
|
|
- <?php endif; ?>
|
|
|
- <?php endforeach; ?>
|
|
|
- </table>
|
|
|
-<script>
|
|
|
- jQuery(document).ready(function(){
|
|
|
- jQuery('.ttip').tooltip();
|
|
|
- });
|
|
|
-
|
|
|
- function selectProject(n) {
|
|
|
- var $n = jQuery(n);
|
|
|
- var $p = $n.parent().parent();
|
|
|
- if (n.checked) {
|
|
|
- $p.addClass('row-selected');
|
|
|
- } else {
|
|
|
- $p.removeClass('row-selected');
|
|
|
- }
|
|
|
- markSubProjects($p, $p.data('path'), n.checked);
|
|
|
-
|
|
|
- function markSubProjects($p, path, checked) {
|
|
|
- var $nextRow = $p.next('tr'),
|
|
|
- nextPath = $nextRow.data('path'),
|
|
|
- nextCheckbox = $nextRow.find('input[type="checkbox"]').get(0);
|
|
|
- if (0 !== nextPath.indexOf(path)) {
|
|
|
- return;
|
|
|
- }
|
|
|
- if (checked) {
|
|
|
- $nextRow.addClass('row-selected');
|
|
|
- } else {
|
|
|
- $nextRow.removeClass('row-selected');
|
|
|
}
|
|
|
- nextCheckbox.checked = checked;
|
|
|
- markSubProjects($nextRow, path, checked);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- function showHideAll(n) {
|
|
|
- if (n.checked) {
|
|
|
- jQuery('#zestawienie-kosztow-projektow').find('tbody').addClass('showOnlySelected');
|
|
|
- } else {
|
|
|
- jQuery('#zestawienie-kosztow-projektow').find('tbody').removeClass('showOnlySelected');
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
+//echo'<pre>' . json_encode(array_keys($this->_projectPathsOrder)) . '</pre>';
|
|
|
+//echo'<pre>' . json_encode($this->_projectPathsOrder) . '</pre>';
|
|
|
+//echo'<pre>' . json_encode($this->_projectInfo) . '</pre>';
|
|
|
+//echo'<pre>' . json_encode($this->_costs) . '</pre>';
|
|
|
+//echo'<pre>' . json_encode($this->_plan) . '</pre>';
|
|
|
+$projectPathsOrder = array_keys($this->_projectPathsOrder);
|
|
|
+foreach ($projectPathsOrder as $key => $value) {
|
|
|
+ $projectPathsOrder[$key] = "" . $value;
|
|
|
+}
|
|
|
+?>
|
|
|
+<div id="widget-budget"></div>
|
|
|
+<script src="stuff/vendors.js"></script>
|
|
|
+<script src="stuff/bundle.se_route_budget.js"></script>
|
|
|
+<script>
|
|
|
+jQuery("#widget-budget").Budget({
|
|
|
+ year: '<?php echo $year; ?>',
|
|
|
+ today: '<?php echo date('Y-m-d'); ?>',
|
|
|
+ projectPathsOrder: <?php echo json_encode($projectPathsOrder); ?>,
|
|
|
+ projectPathsMap: <?php echo json_encode($this->_projectPathsOrder); ?>,
|
|
|
+ projectInfo: <?php echo json_encode($this->_projectInfo); ?>,
|
|
|
+ costs: <?php echo json_encode($this->_costs); ?>,
|
|
|
+ plan: <?php echo json_encode($this->_plan); ?>,
|
|
|
+ dbg: false
|
|
|
+});
|
|
|
</script>
|
|
|
<?php
|
|
|
}
|
|
|
@@ -909,7 +426,7 @@ jQuery(document).ready(function() {
|
|
|
$this->_projectInfo[$r->ID]->hasAccess = $this->_userHasAccessToProject($r);
|
|
|
if (!$this->_projectInfo[$r->ID]->hasAccess) $hasAccessForAllProjects = false;
|
|
|
}
|
|
|
- $this->_projectInfo[0]->path = '0';
|
|
|
+ $this->_projectInfo[0]->path = "0";
|
|
|
$this->_projectInfo[0]->M_DIST_DESC = "Wszystkie projekty";
|
|
|
$this->_projectInfo[0]->hasAccess = $hasAccessForAllProjects;
|
|
|
}
|
|
|
@@ -925,12 +442,15 @@ jQuery(document).ready(function() {
|
|
|
|
|
|
public function hasGroupsAccessToProjects($idProject, $groups) {
|
|
|
$selectedUserGroupNames = array();
|
|
|
- $userGroups = User::getLdapGroupsNames();
|
|
|
+ $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;
|
|
|
@@ -944,7 +464,7 @@ jQuery(document).ready(function() {
|
|
|
}
|
|
|
|
|
|
private function _userHasAccessToProject($project) {
|
|
|
- $groups = User::getLdapGroupsNames();
|
|
|
+ $groups = $this->_getLdapGroupsNames();
|
|
|
$userLogin = User::getLogin();
|
|
|
if ($project->aclOwner == $userLogin) {
|
|
|
return true;
|
|
|
@@ -957,7 +477,8 @@ jQuery(document).ready(function() {
|
|
|
|
|
|
public function getUsedUserGroups() {
|
|
|
$groups = array();
|
|
|
- $userGroups = User::getLdapGroupsNames();
|
|
|
+ $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);
|
|
|
@@ -966,9 +487,28 @@ jQuery(document).ready(function() {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+
|
|
|
private function _reacountCostsFromKoresp() {
|
|
|
$projMonthHasCostSelfIds = array();
|
|
|
foreach ($this->_costs as $kProjId => $vProjInfo) {
|