Просмотр исходного кода

Budget fix project tree, recount costs

Piotr Labudda 11 лет назад
Родитель
Сommit
1bbd11b6dd
1 измененных файлов с 193 добавлено и 58 удалено
  1. 193 58
      SE/se-lib/Route/Budget.php

+ 193 - 58
SE/se-lib/Route/Budget.php

@@ -53,10 +53,9 @@ class Route_Budget extends RouteBase {
 			<?php
 			return;
 		}
-		echo'<pre style="border:1px solid red;overflow:auto;max-height:400px">';print_r($costs);echo'</pre>';
+		//echo'<pre style="border:1px solid red;overflow:auto;max-height:400px">$costs: ';print_r($costs);echo'</pre>';
 
-		$projTree = $this->buildProjectTree($costs);
-		$this->printCostsForYear($projTree, $costs, $args['year']);
+		$this->printCostsForYear($args['year']);
 
 		SE_Layout::dol();
 	}
@@ -114,10 +113,10 @@ jQuery(document).ready(function () {
 		.showOnlySelected tr { display:none; }
 		.showOnlySelected tr.row-selected { display:table-row; }
 
-		.cost { padding:0 2px; min-width:30px; text-align:right; }
-		.cost-only_child { color:#777; }
-		.cost-only_self { color:red; }
-		.cost-self_and_child { color:orange; }
+		.cell-cost { padding:0 2px; min-width:30px; text-align:right; }
+		.cell-cost-only_child { color:#777; }
+		.cell-cost-only_self { color:red; }
+		.cell-cost-self_and_child { color:orange; }
 
 		/* print table background colors */
 		table td, table th { -webkit-print-color-adjust:exact; }
@@ -130,13 +129,14 @@ jQuery(document).ready(function () {
 		<?php
 	}
 
-	function printCostsForYear($projOrder, $costs, $year) {
+	function printCostsForYear($year) {
+		$this->_costs = $this->_costs;
 		$months = array();
 		for ($i = 0; $i < 12; $i++) {
 			$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($costs);echo'</pre>';}
+		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>
@@ -148,19 +148,23 @@ jQuery(document).ready(function () {
 				<span class="pull-left">
 					<input type="checkbox" onclick="return showHideAll(this);"/> pokaż tylko zaznaczone
 				</span>
-				<span class="pull-right">miesiąc</span>
+				<span class="pull-right"><b>miesiąc</b></span>
 			</td>
 			<?php foreach ($months as $month) { ?>
-				<th class="c"><?php echo $month; ?></th>
+				<th class="c"><?php echo sprintf("%02d", $month); ?></th>
 			<?php } ?>
 		</tr>
 	</thead>
 	<tbody>
 	<?php $t = 1; ?>
-	<?php foreach ($projOrder as $projPath => $projId) : ?>
-		<?php $projectInfo = $costs[$projId]; ?>
+	<?php foreach ($this->_projectPathsOrder as $projPath => $projId) : ?>
+		<?php $projectInfo = $this->_costs[$projId]; ?>
+		<?php if (empty($projectInfo)) {
+			//echo'<tr><td colspan="10"><pre>ERROR:EMPTY: Path('.$projPath.') id('.$projId.')</pre></td></tr>';
+			continue;
+		} ?>
 		<tr class="row-<?php echo ($t = 1 - $t); ?>"
-				data-projId="<?php echo $projectInfo->ID_PROJECT; ?>"
+				data-proj_id="<?php echo $projectInfo->ID_PROJECT; ?>"
 				data-path="<?php echo $projectInfo->path; ?>">
 			<td class="p2 r nr">
 				<input type="checkbox" name="selectedProject" onclick="return selectProject(this);" value="<?php echo $projectInfo->ID_PROJECT; ?>" />
@@ -176,12 +180,27 @@ jQuery(document).ready(function () {
 					<?php if ($vCost->COST_CHILD > 0) : ?>
 						<?php  $title = "Koszt projektu {$vCostSelfOut} / koszt podprojektów $vCostChildOut"; ?>
 						<?php if ($vCost->COST_SELF > 0) : ?>
-			<td class="cost cost-self_and_child"><span class="ttip" title="<?php echo $title; ?>"><?php echo $vCostTotalOut; ?></span></td>
+			<td class="cell-cost cell-cost-self_and_child"
+					data-month_num="<?php echo $month; ?>"
+					data-proj_path="<?php echo $projectInfo->path; ?>"
+					data-proj_id="<?php echo $projectInfo->ID_PROJECT; ?>">
+				<span class="ttip" title="<?php echo $title; ?>"><?php echo $vCostTotalOut; ?></span>
+			</td>
 						<?php else : ?>
-			<td class="cost cost-only_child"><span class="ttip" title="<?php echo $title; ?>"><?php echo $vCostTotalOut; ?></span></td>
+			<td class="cell-cost cell-cost-only_child"
+					data-month_num="<?php echo $month; ?>"
+					data-proj_path="<?php echo $projectInfo->path; ?>"
+					data-proj_id="<?php echo $projectInfo->ID_PROJECT; ?>">
+				<span class="ttip" title="<?php echo $title; ?>"><?php echo $vCostTotalOut; ?></span>
+			</td>
 						<?php endif; ?>
 					<?php else : ?>
-			<td class="cost cost-only_self"><?php echo $vCostTotalOut; ?></td>
+			<td class="cell-cost cell-cost-only_self"
+					data-month_num="<?php echo $month; ?>"
+					data-proj_path="<?php echo $projectInfo->path; ?>"
+					data-proj_id="<?php echo $projectInfo->ID_PROJECT; ?>">
+				<?php echo $vCostTotalOut; ?>
+			</td>
 					<?php endif; ?>
 				<?php else : ?>
 					<td style="min-width:30px">&nbsp;</td>
@@ -191,6 +210,47 @@ jQuery(document).ready(function () {
 	<?php endforeach; ?>
 	</tbody>
 	</table>
+	<script>
+jQuery(document).ready(function() {
+	jQuery('#zestawienie-kosztow-projektow')
+		.find('.cell-cost')
+		.on('click', function(e) {
+			var $n = jQuery(this);
+			console.log('node', $n, 'data', $n.data());
+		})
+})
+	</script>
+	<table id="proj-koresp-info" style="display:none">
+		<?php foreach ($this->_costs as $projId => $projectInfo) : ?>
+			<?php if (!empty($projectInfo->korespByMonth)) : ?>
+				<?php foreach ($projectInfo->korespByMonth as $kMonth => $vKorespMonthList) : ?>
+					<tbody id="row-proj-<?php echo $projectInfo->ID_PROJECT; ?>-koresp-by-month-<?php echo $kMonth; ?>">
+						<tr>
+							<td colspan="10">
+								Projekt nr <?php echo $projectInfo->ID_PROJECT; ?>
+								- miesiąc <?php echo $year; ?>-<?php echo sprintf("%02d", $kMonth); ?>
+							</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
+							*/ ?>
+							<tr>
+								<td class="p2 l nr"><?php echo $vKorespInfo->ID; ?></td>
+								<td class="p2" style="max-width:400px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;" title="<?php echo $projectInfo->M_DIST_DESC; ?>"><?php echo $vKorespInfo->K_ZAWARTOS; ?></td>
+								<?php $vKorespCostOut = number_format($vKorespInfo->COST, 2); ?>
+								<td class="cell-cost cell-cost-only_self"><?php echo $vKorespCostOut; ?></td>
+							</tr>
+						<?php endforeach; ?>
+					</tbody>
+				<?php endforeach; ?>
+			<?php endif; ?>
+		<?php endforeach; ?>
+	</table>
 </div>
 <script>
 	jQuery(document).ready(function(){
@@ -282,13 +342,22 @@ jQuery(document).ready(function () {
 
 	public function getCostsByYear($year) {
 		$db = DB::getDB();
-		$costs = array();
+		$this->_costs = array();
 		$sql = "
-			select k.`ID_PROJECT` AS `ID_PROJECT`
+			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`
 			from `IN7_DZIENNIK_KORESP` k
 			where ((k.`COST_VALUE` > 0) or (k.`INCOME_VALUE` > 0))
@@ -297,21 +366,52 @@ jQuery(document).ready(function () {
 		//echo'<pre style="border:1px solid red;overflow:auto;max-height:400px">';print_r($sql);echo'</pre>';
 		$res = $db->query($sql);
 		while ($r = $db->fetch($res)) {
-			$vProjIds = array();
-			if ($r->ID_PROJECT > 0) $vProjIds[] = $r->ID_PROJECT;
-			if ($r->TRANSFER_OPPOSITE_ID_PROJECT > 0) $vProjIds[] = $r->TRANSFER_OPPOSITE_ID_PROJECT;
-			foreach ($vProjIds as $vProjId) {
-				if (!array_key_exists($vProjId, $costs)) {
+			$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'<p>DBG:$r->ID_PROJECT['.$r->ID_PROJECT.']: $vProjPaths = ' . json_encode($vProjPaths) . '</p>';
+				$vProjPaths = implode('-', $vProjPaths);
+				$projIds = explode('-', $vProjPaths);
+				//echo'<p>DBG:$r->ID_PROJECT['.$r->ID_PROJECT.']: $projIds = ' . json_encode($projIds) . '</p>';
+				foreach ($projIds as $vProjId) {
+					if ($vProjId > 0) $vProjIds[$vProjId] = true;
+				}
+			}
+			{
+				$projectZeroInfo = new stdClass();
+				$projectZeroInfo->ID_PROJECT = 0;
+				$projectZeroInfo->M_DIST_DESC = 'Wszystkie projekty';
+				$projectZeroInfo->path = '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->M_DIST_DESC = '';
 					$projectInfo->path = '';
 					$projectInfo->costsByMonth = array();
 					$projectInfo->korespByMonth = array();
-					$costs[$vProjId] = $projectInfo;
+					$this->_costs[$vProjId] = $projectInfo;
 				}
 			}
 			$korespInfo = new stdClass();
+			$korespInfo->ID = $r->ID;
 			$korespInfo->MONTH = $r->MONTH;
 			$korespInfo->K_ZAWARTOS = $r->K_ZAWARTOS;
 			$monthNum = intval(substr($r->MONTH, 5, 2));
@@ -319,63 +419,98 @@ jQuery(document).ready(function () {
 				$korespInfo->COST = $r->INCOME;
 				$korespInfo->INCOME = $r->COST;
 				$korespInfo->TRANSFER_OPPOSITE_ID_PROJECT = $r->TRANSFER_OPPOSITE_ID_PROJECT;
-				$costs[$r->TRANSFER_OPPOSITE_ID_PROJECT]->korespByMonth[$monthNum][] = $korespInfo;
+				$this->_costs[$r->TRANSFER_OPPOSITE_ID_PROJECT]->korespByMonth[$monthNum][] = $korespInfo;
+			} else if ($r->ID_PROJECT) {
+				$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;
-				$costs[$r->ID_PROJECT]->korespByMonth[$monthNum][] = $korespInfo;
+				$this->_costs[0]->korespByMonth[$monthNum][] = $korespInfo;
 			}
 		}
-		$this->_fetchProjectInfo($costs);
-		$this->_reacountCostsFromKoresp($costs);
-		return $costs;
+		$this->_fetchProjectInfo();
+		$this->_buildProjectTree();
+		$this->_reacountCostsFromKoresp();
+		return $this->_costs;
 	}
 
-	private function _fetchProjectInfo(&$costs) {
+	private function _fetchProjectInfo() {
 		$db = DB::getDB();
-		$projectIds = array_keys($costs);
+		$projectIds = array_keys($this->_costs);
 		$sqlProjIds = "'" . implode("','", $projectIds) . "'";
-		$sql = "select p.`ID`, p.`path`, p.`M_DIST_DESC`
+		$sql = "select p.`ID`, p.`P_ID`, p.`path`, p.`M_DIST_DESC`
 			from `IN7_MK_BAZA_DYSTRYBUCJI` p
 			where p.`ID` in({$sqlProjIds})
 		";
 		$res = $db->query($sql);
 		while ($r = $db->fetch($res)) {
-			$costs[$r->ID]->path = $r->path;
-			$costs[$r->ID]->M_DIST_DESC = $r->M_DIST_DESC;
+			$this->_costs[$r->ID]->path = $r->path;
+			$this->_costs[$r->ID]->M_DIST_DESC = $r->M_DIST_DESC;
 		}
 	}
 
-	private function _reacountCostsFromKoresp(&$costs) {
-		foreach ($costs as $vProjId => $vProjInfo) {
-			foreach ($vProjInfo->korespByMonth as $monthNum => $vKorespList) {
-				$vCostInfo = new stdClass();
-				$vCostInfo->COST_SELF = 0;
-				$vCostInfo->COST_CHILD = 0;
-				$vCostInfo->COST_TOTAL = 0;
-				$vCostInfo->INCOME_SELF = 0;
-				$vCostInfo->INCOME_CHILD = 0;
-				$vCostInfo->INCOME_TOTAL = 0;
-				$costs[$vProjId]->costsByMonth[$monthNum] = $vCostInfo;
+	private function _reacountCostsFromKoresp() {
+		$projMonthHasCostSelfIds = array();
+		foreach ($this->_costs as $kProjId => $vProjInfo) {
+			foreach ($vProjInfo->korespByMonth as $kMonthNum => $vKorespList) {
+				$this->_createCostIfNotDefined($kProjId, $kMonthNum);
 				foreach ($vKorespList as $vKoresp) {
-					$costs[$vProjId]->costsByMonth[$monthNum]->COST_SELF += $vKoresp->COST;
-					$costs[$vProjId]->costsByMonth[$monthNum]->INCOME_SELF += $vKoresp->INCOME;
+					$this->_costs[$kProjId]->costsByMonth[$kMonthNum]->COST_SELF += $vKoresp->COST;
+					$this->_costs[$kProjId]->costsByMonth[$kMonthNum]->INCOME_SELF += $vKoresp->INCOME;
+				}
+				$projHasCostSelfIds[$kProjId][$kMonthNum] = $vProjInfo->path;
+			}
+		}
+		//echo'<pre style="width:600px;border:1px solid red;max-height:300px;overflow:auto;">$projHasCostSelfIds: ';print_r($projHasCostSelfIds);echo'</pre>';
+		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;
 				}
-				$costs[$vProjId]->costsByMonth[$monthNum]->COST_TOTAL += $costs[$vProjId]->costsByMonth[$monthNum]->COST_SELF;
-				$costs[$vProjId]->costsByMonth[$monthNum]->INCOME_TOTAL += $costs[$vProjId]->costsByMonth[$monthNum]->INCOME_SELF;
 			}
 		}
+		// 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;
+			}
+		}
+	}
+
+	private 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($costs) {
-		$projPaths = array();
-		foreach ($costs as $idProject => $projectInfo) {
-			$projPaths[$projectInfo->path] = $projectInfo->ID_PROJECT;
+	public function _buildProjectTree() {
+		$this->_projectPathsOrder = array();
+		foreach ($this->_costs as $idProject => $projectInfo) {
+			$this->_projectPathsOrder[$projectInfo->path] = $projectInfo->ID_PROJECT;
 		}
-		//echo'<pre style="width:600px;border:1px solid red;max-height:300px;overflow:auto;">projPaths: ';print_r($projPaths);echo'</pre>';
-		uksort($projPaths, array($this, 'sortPathsCallback'));
-		//echo'<pre style="width:600px;border:1px solid red;max-height:300px;overflow:auto;">projPaths sorted: ';print_r($projPaths);echo'</pre>';
-		return $projPaths;
+		//echo'<pre style="width:600px;border:1px solid red;max-height:300px;overflow:auto;">projPaths: ';print_r($this->_projectPathsOrder);echo'</pre>';
+		uksort($this->_projectPathsOrder, array($this, 'sortPathsCallback'));
+		//echo'<pre style="width:600px;border:1px solid red;max-height:300px;overflow:auto;">projPaths sorted: ';print_r($this->_projectPathsOrder);echo'</pre>';
+		return $this->_projectPathsOrder;
 	}
 
 	public function sortPathsCallback($a, $b) {