panel($idProject, $idCompany); if ($idProject > 0) { $this->oferta($ofertaArgs); } else { $this->defaultOferta(); } } catch (Exception $e) { UI::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage()); } UI::dol(); } public function ofertaCompanyAction() { // TODO: check if user is allowed to run this action UI::gora(); UI::menu(); try { $idProject = V::get('ID_PROJECT', 0, $_REQUEST, 'int'); $idCompany = V::get('ID_COMPANY', 0, $_REQUEST, 'int');// TODO: $idCompany from ADMIN_USERS $admin = false; $companyAdmin = true; $ofertaArgs = compact('idProject', 'idCompany', 'admin', 'companyAdmin'); $this->panel($idProject, $idCompany); if ($idProject > 0) { $this->oferta($ofertaArgs); } else { $this->defaultOferta(); } } catch (Exception $e) { UI::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage()); } UI::dol(); } public function ofertaDefaultAdminAction() { // TODO: check if user is allowed to run this action UI::gora(); UI::menu(); try { $idProject = 0; $idCompany = V::get('ID_COMPANY', 0, $_REQUEST, 'int'); $this->panel($idProject, $idCompany); $this->defaultOferta(); } catch (Exception $e) { UI::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage()); } UI::dol(); } public function ofertaAction() { // TODO: check if user is allowed to run this action UI::gora(); UI::menu(); try { $idProject = V::get('ID_PROJECT', 0, $_REQUEST, 'int'); $idCompany = V::get('ID_COMPANY', 0, $_REQUEST, 'int'); $admin = false; if (!$idProject) throw new Exception("Wrong param in 'ID_PROJECT' - expected integer!");// TODO: show select box if not defined $ofertaArgs = compact('idProject', 'idCompany', 'admin'); $this->panel($idProject, $idCompany); $this->oferta($ofertaArgs); } catch (Exception $e) { UI::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage()); } UI::dol(); } public function getArgsList() {// TODO: override UrlActionBase::getArgsList action $args = array(); $args[] = 'ID_PROJECT'; return $args; } public function reinstallAction() {// TODO: mv to UrlActionBase $jsonData = new stdClass(); $jsonData->type = 'success'; $jsonData->msg = 'Gotowe'; try { $this->reinstall(); } catch (Exception $e) { $jsonData->type = 'danger'; $jsonData->msg = $e->getMessage(); } echo json_encode($jsonData); } public function reinstall() {// TODO: mv struct check to UrlActionBase $pdo = DB::getPDO(); { $dropGDistanceFuncion = "DROP FUNCTION IF EXISTS `GDistance`"; $pdo->exec($dropGDistanceFuncion); // Test for GDistance: // select '' as test, GDistance('') as GDistance, IF(GDistance('') = 0, 1, 0) as test_ok; // select 'NULL' as test, GDistance(NULL) as GDistance, IF(GDistance(NULL) = 0, 1, 0) as test_ok; // select 'GeomFromText(POLYGON((18.5573431614953 54.3472831082951,18.5612466579916 54.3460308284799,18.5617610722586 54.346524689865,18.5619728898979 54.3488528136092,18.5609743210268 54.3496376437764,18.5600057772984 54.3494578097971,18.559603951991 54.350742572617,18.5590637025025 54.3507194967965,18.5578575757622 54.349434823939,18.5573431614953 54.3472831082951)))' as test, GDistance(GeomFromText('POLYGON((18.5573431614953 54.3472831082951,18.5612466579916 54.3460308284799,18.5617610722586 54.346524689865,18.5619728898979 54.3488528136092,18.5609743210268 54.3496376437764,18.5600057772984 54.3494578097971,18.559603951991 54.350742572617,18.5590637025025 54.3507194967965,18.5578575757622 54.349434823939,18.5573431614953 54.3472831082951))')) as GDistance, IF(1 = GDistance(GeomFromText('POLYGON((18.5573431614953 54.3472831082951,18.5612466579916 54.3460308284799,18.5617610722586 54.346524689865,18.5619728898979 54.3488528136092,18.5609743210268 54.3496376437764,18.5600057772984 54.3494578097971,18.559603951991 54.350742572617,18.5590637025025 54.3507194967965,18.5578575757622 54.349434823939,18.5573431614953 54.3472831082951))')), 1, 0) as test_ok; // select 'GeomFromText(LINESTRING(18.5573431614953 54.3472831082951,18.5612466579916 54.3460308284799))' as test, GDistance(GeomFromText('LINESTRING(18.5573431614953 54.3472831082951,18.5612466579916 54.3460308284799)')) as GDistance, IF(GDistance(GeomFromText('LINESTRING(18.5573431614953 54.3472831082951,18.5612466579916 54.3460308284799)')) is not null, 1, 0) as test_ok; // select 'GeomFromText(POINT(18.5573431614953 54.3472831082951))' as test, GDistance(GeomFromText('POINT(18.5573431614953 54.3472831082951)')) as GDistance, IF(GDistance(GeomFromText('POINT(18.5573431614953 54.3472831082951)')) is not null, 1, 0) as test_ok; $gDistanceFuncion = <<exec($gDistanceFuncion); } /* required Zasoby tree structure - XML (parent rel in PARENT_ID field): */ /* required Zasoby tree structure: - required base structure [:ts_main_id] TYPESPECIALS [:action_id] URL_ACTION :url_action_name [:action_param_1_id] PARAM_IN :url_action_param_1_name - current function from schema [:main_db_id] (DATABASE_MYSQL, BAZA_DANYCH, DATABASE_POSTGRESQL) [:tbl_id] TABELA 'IN7_MK_BAZA_DYSTRYBUCJI' [:cell_id] KOMORKA 'ID' [:link_action_id] (ALIAS DO :action_id) URL_ACTION :url_action_name [:link_param_id] (ALIAS DO :cell_id) PARAM_IN :url_action_param_1_name :url_action_name = 'ProjektyKosztyWstepnychRobot' :url_action_param_1_name = 'ID_PROJECT' */ $flatConfig_main = array(); { $flatConfig_main[] = (object)array(// Zasob::assert(TYPESPECIALS) 'query' => " select z.ID from CRM_LISTA_ZASOBOW z where z.TYPE='TYPESPECIALS' and z.A_STATUS not in('DELETED') ", 'createTable' => 'CRM_LISTA_ZASOBOW', 'createArgs' => array('TYPE' => 'TYPESPECIALS', 'DESC' => 'Typespecials'), 'out' => array(':ts_main_id' => 'ID') ); $flatConfig_main[] = (object)array(// Zasob::assert(TYPESPECIALS/:url_action_name) 'query' => " select z.ID from CRM_LISTA_ZASOBOW z where z.PARENT_ID = :ts_main_id and z.TYPE = 'URL_ACTION' and z.DESC = :url_action_name and z.A_STATUS not in('DELETED') ", 'createTable' => 'CRM_LISTA_ZASOBOW', 'createArgs' => array('TYPE' => 'URL_ACTION', 'PARENT_ID' => ':ts_main_id', 'DESC' => ':url_action_name'), 'in' => array(':ts_main_id', ':url_action_name'), 'out' => array(':action_id' => 'ID') ); $flatConfig_main[] = (object)array(// Zasob::assert(TYPESPECIALS/:url_action_name/:url_action_param_1_name) 'query' => " select z.ID from CRM_LISTA_ZASOBOW z where z.PARENT_ID = :action_id and z.TYPE = 'PARAM_IN' and z.DESC = :url_action_param_1_name and z.A_STATUS not in('DELETED') ", 'createTable' => 'CRM_LISTA_ZASOBOW', 'createArgs' => array('TYPE' => 'PARAM_IN', 'PARENT_ID' => ':action_id', 'DESC' => ':url_action_param_1_name'), 'in' => array(':action_id', ':url_action_param_1_name'), 'out' => array(':action_param_1_id' => 'ID') ); } //DBG::_('DBG', '>1', "flatConfig_main", $flatConfig_main, __CLASS__, __FUNCTION__, __LINE__); $flatConfig_link_in_projekt = array(); { $flatConfig_link_in_projekt[] = (object)array(// Zasob::assert(default_db) 'query' => " select z.ID from CRM_LISTA_ZASOBOW z where z.ID = :main_db_id and z.TYPE in('DATABASE_MYSQL', 'BAZA_DANYCH', 'DATABASE_POSTGRESQL') and z.A_STATUS not in('DELETED') ", 'createTable' => 'CRM_LISTA_ZASOBOW', 'createArgs' => array('TYPE' => 'BAZA_DANYCH', 'DESC' => 'Baza danych'), 'in' => array(':main_db_id'), 'out' => array(':main_db_id' => 'ID') ); $flatConfig_link_in_projekt[] = (object)array(// Zasob::assert(default_db/IN7_MK_BAZA_DYSTRYBUCJI) 'query' => " select z.ID from CRM_LISTA_ZASOBOW z where z.PARENT_ID = :main_db_id and z.TYPE = 'TABELA' and z.DESC = 'IN7_MK_BAZA_DYSTRYBUCJI' and z.A_STATUS not in('DELETED') ", 'createTable' => 'CRM_LISTA_ZASOBOW', 'createArgs' => array('TYPE' => 'TABELA', 'PARENT_ID' => ':main_db_id', 'DESC' => 'IN7_MK_BAZA_DYSTRYBUCJI'), 'in' => array(':main_db_id'), 'out' => array(':tbl_id' => 'ID') ); $flatConfig_link_in_projekt[] = (object)array(// Zasob::assert(default_db/IN7_MK_BAZA_DYSTRYBUCJI/ID) 'query' => " select z.ID from CRM_LISTA_ZASOBOW z where z.PARENT_ID = :tbl_id and z.TYPE = 'KOMORKA' and z.DESC = 'ID' and z.A_STATUS not in('DELETED') ", 'createTable' => 'CRM_LISTA_ZASOBOW', 'createArgs' => array('TYPE' => 'KOMORKA', 'PARENT_ID' => ':tbl_id', 'DESC' => 'ID'), 'in' => array(':tbl_id'), 'out' => array(':cell_id' => 'ID') ); $flatConfig_link_in_projekt[] = (object)array(// Zasob::assert(default_db/IN7_MK_BAZA_DYSTRYBUCJI/:url_action_name) 'query' => " select z.ID from CRM_LISTA_ZASOBOW z where z.PARENT_ID = :tbl_id and z.ALIAS_ID = ':action_id' and z.TYPE = 'URL_ACTION' and z.DESC = ':url_action_name' and z.A_STATUS not in('DELETED') ", 'createTable' => 'CRM_LISTA_ZASOBOW', 'createArgs' => array('TYPE' => 'URL_ACTION', 'PARENT_ID' => ':tbl_id', 'ALIAS_ID' => ':action_id', 'DESC' => ':url_action_name'), 'in' => array(':tbl_id', ':action_id', ':url_action_name'), 'out' => array(':link_action_id' => 'ID') ); // [:link_param_id] (ALIAS DO :cell_id) PARAM_IN :url_action_param_1_name $flatConfig_link_in_projekt[] = (object)array(// Zasob::assert(default_db/IN7_MK_BAZA_DYSTRYBUCJI/:url_action_name/:url_action_param_1_name) 'query' => " select z.ID from CRM_LISTA_ZASOBOW z where z.PARENT_ID = :link_action_id and z.ALIAS_ID = ':cell_id' and z.TYPE = 'PARAM_IN' and z.DESC = ':url_action_param_1_name' and z.A_STATUS not in('DELETED') ", 'createTable' => 'CRM_LISTA_ZASOBOW', 'createArgs' => array('TYPE' => 'PARAM_IN', 'PARENT_ID' => ':link_action_id', 'ALIAS_ID' => ':cell_id', 'DESC' => ':url_action_param_1_name'), 'in' => array(':cell_id', ':link_action_id', ':url_action_param_1_name'), 'out' => array(':link_action_id' => 'ID') ); } //DBG::_('DBG', '>1', "flatConfig_link_in_projekt", $flatConfig_link_in_projekt, __CLASS__, __FUNCTION__, __LINE__); $flatConf = array_merge($flatConfig_main, $flatConfig_link_in_projekt); $knownArgs = array(); $knownArgs[':url_action_name'] = 'Test'; $knownArgs[':url_action_param_1_name'] = 'ID_PROJECT'; $knownArgs[':main_db_id'] = '36';// from DB::getDB()->getZasobId(); or DB::getPDO()->getZasobId(); $this->_debugFlatConfig($flatConf, $knownArgs); $args = $this->getArgsList(); $clsName = __CLASS__; $urlActionName = str_replace('Route_UrlAction_', '', $clsName); DBG::_('DBG', '>1', "reinstall class", __CLASS__, __CLASS__, __FUNCTION__, __LINE__); DBG::_('DBG', '>1', "reinstall funName", $urlActionName, __CLASS__, __FUNCTION__, __LINE__); DBG::_('DBG', '>1', "reinstall test", $args, __CLASS__, __FUNCTION__, __LINE__); $dbFunction = $this->fetchZasobInfo(); $usrLogin = User::getLogin(); {// check if URL_ACTION already exists if (!$dbFunction) throw new Exception("Brak id zasobu typu TYPESPECIALS - TODO: CREATE");// $this->createZasobTypespecials(); DBG::_('DBG', '>1', "dbFunction", $dbFunction, __CLASS__, __FUNCTION__, __LINE__); if ($dbFunction['action_id_is_null']) { $sth = $pdo->prepare(" insert into CRM_LISTA_ZASOBOW ( TYPE, PARENT_ID, `DESC`, A_RECORD_CREATE_AUTHOR, A_RECORD_CREATE_DATE ) values ( 'URL_ACTION', :ts_id, :url_action_name, 'system-by-{$usrLogin}', NOW() ) "); //$sth->bindValue('ts_id', $dbFunction['ts_id'], PDO::PARAM_INT); //$sth->bindValue('url_action_name', $urlActionName, PDO::PARAM_STR); $bindValues = array(); $bindValues['ts_id'] = array($dbFunction['ts_id'], PDO::PARAM_INT); $bindValues['url_action_name'] = $urlActionName; $pdo->bindValues($sth, $bindValues); DBG::_('DBG', '>1', "sql", $pdo->getRawSql($sth), __CLASS__, __FUNCTION__, __LINE__); $sth->execute(); $dbFunction = $this->fetchZasobInfo(); if (!$dbFunction || $dbFunction['action_id_is_null']) throw new Exception("Brak zasobu typu URL_ACTION, nie udało się go utworzyć!"); } } {// check params if (!empty($args)) { $todoArgs = array(); foreach ($args as $argName) { if (empty($dbFunction['url_params'])) { $todoArgs[$argName] = true; } else if (!array_key_exists($argName, $dbFunction['url_params'])) { $todoArgs[$argName] = true; } // OK PARAM_IN exists } $todoArgs = array_keys($todoArgs); DBG::_('DBG', '>1', "todoArgs", $todoArgs, __CLASS__, __FUNCTION__, __LINE__); if (!empty($todoArgs)) { $sqlValues = array(); foreach ($todoArgs as $argName) { $sqlValues[] = "( 'PARAM_IN', {$dbFunction['action_id']}, '{$argName}', 'system-by-{$usrLogin}', NOW() ) "; } $sqlValues = implode(", ", $sqlValues); $sth = $pdo->prepare(" insert into CRM_LISTA_ZASOBOW ( TYPE, PARENT_ID, `DESC`, A_RECORD_CREATE_AUTHOR, A_RECORD_CREATE_DATE ) values {$sqlValues} "); DBG::_('DBG', '>1', "sql", $pdo->getRawSql($sth), __CLASS__, __FUNCTION__, __LINE__); //$sth->execute(); $dbFunction = $this->fetchZasobInfo(); } if (empty($dbFunction['url_params'])) { throw new Exception("Brak zdefiniowanych parametrów, nie udało się ich utworzyć!"); } } } {// check links in tables // $info['links']['IN7_MK_BAZA_DYSTRYBUCJI'] = $linkInfo; if (empty($dbFunction['links']['IN7_MK_BAZA_DYSTRYBUCJI'])) throw new Exception("Brak poprawne wprowadzonej tabeli 'IN7_MK_BAZA_DYSTRYBUCJI' w drzewie zasobów!"); $projInfo = $dbFunction['links']['IN7_MK_BAZA_DYSTRYBUCJI']; /* [link_action_id] => [db_id] => 36 [tbl_id] => 636 [cell_id] => 763 [param1_id] => */ if (!$projInfo['link_action_id']) { $sth = $pdo->prepare(" insert into CRM_LISTA_ZASOBOW ( TYPE, PARENT_ID, ALIAS_ID, `DESC`, A_RECORD_CREATE_AUTHOR, A_RECORD_CREATE_DATE ) values ( 'URL_ACTION', {$projInfo['tbl_id']}, {$dbFunction['action_id']}, '{$urlActionName}', 'system-by-{$usrLogin}', NOW() ) "); //DBG::_('DBG', '>1', "sql", $pdo->getRawSql($sth), __CLASS__, __FUNCTION__, __LINE__); $sth->execute(); $dbFunction = $this->fetchZasobInfo(); $projInfo = $dbFunction['links']['IN7_MK_BAZA_DYSTRYBUCJI']; if (!$projInfo['link_action_id']) throw new Exception("Brak zainstalowanej akcji dla tabeli 'IN7_MK_BAZA_DYSTRYBUCJI' - nie udało się zainstalować"); } if (!$projInfo['param1_id']) {// TODO: get from params $sth = $pdo->prepare(" insert into CRM_LISTA_ZASOBOW ( TYPE, PARENT_ID, ALIAS_ID, `DESC`, A_RECORD_CREATE_AUTHOR, A_RECORD_CREATE_DATE ) values ( 'PARAM_IN', {$projInfo['link_action_id']}, {$projInfo['cell_id']}, 'ID_PROJECT', 'system-by-{$usrLogin}', NOW() ) "); $sth->execute(); $dbFunction = $this->fetchZasobInfo(); $projInfo = $dbFunction['links']['IN7_MK_BAZA_DYSTRYBUCJI']; if (!$projInfo['param1_id']) throw new Exception("Brak zainstalowanego parametru 1 w akcji dla tabeli 'IN7_MK_BAZA_DYSTRYBUCJI' - nie udało się zainstalować"); } } } public function _debugFlatConfig($flatConfig, $args = array()) { //DBG::_('DBG', '>1', "flatConfig", $flatConfig, __CLASS__, __FUNCTION__, __LINE__); echo '
';
		foreach ($flatConfig as $conf) {
			/*
				[query] => string
				[createTable] => srting - eg. CRM_LISTA_ZASOBOW
				[createArgs] => array - eg. [ TYPE: 'TYPESPECIALS', DESC: 'Typespecials' ]
				[in] => array - eg. [ ':ts_main_id', ':url_action_name' ]
				[out] => array - eg. [ ':ts_main_id': 'ID' ]
			*/
			echo "Zasob::assert({$conf->createTable}): " . json_encode($conf->createArgs) . " returns: " . json_encode($conf->out) . "\n";
		}
		echo '
'; echo '
';
		echo "DBG: Simulate iter loop:\n";
		$simulateGeneratedId = 1000;
		$i = 0; $limit = 10; $todoIdx = array(); $knownArgsMap = array();
		foreach ($flatConfig as $idx => $conf) $todoIdx[] = $idx;
		foreach ($args as $arg => $val) $knownArgsMap[$arg] = $val;
		for ($i = 0; $i < $limit; $i++) {
			echo ">> DBG loop({$i}):\n";
			$isExecuted = false;
			foreach ($todoIdx as $idx) {
				$conf = $flatConfig[$idx];
				/*
					[query] => string
					[createTable] => srting - eg. CRM_LISTA_ZASOBOW
					[createArgs] => array - eg. [ TYPE: 'TYPESPECIALS', DESC: 'Typespecials' ]
					[in] => array - eg. [ ':ts_main_id', ':url_action_name' ]
					[out] => array - eg. [ ':ts_main_id': 'ID' ]
				*/
				echo ">>>> Loop({$i}): idx({$idx}) Zasob::assert({$conf->createTable}): " . json_encode($conf->createArgs) . " returns: " . json_encode($conf->out) . "\n";
				$canExecute = true;
				if (!empty($conf->in)) foreach ($conf->in as $argName) {
					if (!array_key_exists($argName, $knownArgsMap)) {
						$canExecute = false;
					}
				}
				if ($canExecute) {
					// TODO: execute - $r = $this->_assertZasobConf($conf, $knownArgsMap);
					// fetch params out to $knownArgsMap
					foreach ($conf->out as $argName => $outFieldName) {
						$knownArgsMap[$argName] = $simulateGeneratedId++;// TODO: fetch from returned object ($r->{$outFieldName})
					}
					$todoIdx = array_diff($todoIdx, array($idx));// remove $idx from $todoIdx
					echo ">>>> Loop({$i}): knownArgsMap: " . json_encode($knownArgsMap) . " \n";
					$isExecuted = true;
				} else {
					echo ">>>> Loop({$i}): cannot execute conf [{$idx}] missing args: " . json_encode($conf->in) . " \n";
				}
			}
			if (!$isExecuted) {
				echo "DBG: Stop";
				if (empty($todoIdx)) {
					echo " - OK";
				} else {
					echo " - Error - TODO:\n";
					foreach ($todoIdx as $idx) {
						$conf = $flatConfig[$idx];
						echo "Zasob::assert({$conf->createTable}): " . json_encode($conf->createArgs) . " returns: " . json_encode($conf->out) . "\n";
					}
				}
				break;
			}
		}
		echo '
'; } public function fetchZasobInfo() { $pdo = DB::getPDO(); $args = $this->getArgsList(); $clsName = __CLASS__; $urlActionName = str_replace('Route_UrlAction_', '', $clsName); $sth = $pdo->prepare(" select zp.ID as ts_id , IF(z.ID is null, 1, 0) as action_id_is_null , z.ID as action_id , z.DESC as action_desc from CRM_LISTA_ZASOBOW zp left join CRM_LISTA_ZASOBOW z on(z.PARENT_ID = zp.ID and z.TYPE = 'URL_ACTION' and z.DESC = :url_action_name and z.A_STATUS not in('DELETED') ) where zp.TYPE = 'TYPESPECIALS' and zp.A_STATUS not in('DELETED') "); $sth->bindValue('url_action_name', $urlActionName); $sth->execute(); $info = $sth->fetch(); if (!$info) return $info; $info['url_params'] = array(); $info['links'] = array();// where action is installed - expected `IN7_MK_BAZA_DYSTRYBUCJI` if ($info['action_id'] > 0) { $sthParams = $pdo->prepare(" select z.ID as param_id , z.DESC as param_desc from CRM_LISTA_ZASOBOW z where z.TYPE = 'PARAM_IN' and z.A_STATUS not in('DELETED') and z.PARENT_ID = :url_action_id "); $sthParams->bindValue('url_action_id', $info['action_id']); $sthParams->execute(); $urlParams = array(); $rawUrlParams = $sthParams->fetchAll(); foreach ($rawUrlParams as $urlParam) { $urlParams[$urlParam['param_desc']] = $urlParam; } $info['url_params'] = $urlParams; } { $main_db_id = $pdo->getZasobId(); $sth_dbInfo = $pdo->prepare(" select za.id as link_action_id , zd.id as db_id , zt.id as tbl_id , zi.id as cell_id , zp1.id as param1_id -- for every param from CRM_LISTA_ZASOBOW zt join CRM_LISTA_ZASOBOW zd on(zd.ID = zt.PARENT_ID and zd.TYPE in('DATABASE_MYSQL', 'BAZA_DANYCH', 'DATABASE_POSTGRESQL') and zd.ID = {$main_db_id} ) join CRM_LISTA_ZASOBOW zi on(zi.PARENT_ID = zt.ID and zi.TYPE = 'KOMORKA' and zi.DESC = 'ID' ) left join CRM_LISTA_ZASOBOW za on(za.PARENT_ID = zt.ID and za.TYPE = 'URL_ACTION' and za.ALIAS_ID = {$info['action_id']} ) -- TODO: for every param: left join CRM_LISTA_ZASOBOW zp1 on(zp1.PARENT_ID = za.ID and zp1.TYPE = 'PARAM_IN' and zp1.ALIAS_ID = zi.id and zp1.DESC = 'ID_PROJECT' ) where zt.TYPE = 'TABELA' and zt.A_STATUS not in('DELETED') and zt.DESC = 'IN7_MK_BAZA_DYSTRYBUCJI' "); DBG::_('DBG', '>1', "dbInfo query", $pdo->getRawSql($sth_dbInfo), __CLASS__, __FUNCTION__, __LINE__); $sth_dbInfo->execute(); $linkInfo = $sth_dbInfo->fetch(); if ($linkInfo) { $info['links']['IN7_MK_BAZA_DYSTRYBUCJI'] = $linkInfo; } } return $info; } public function kosztorysXmlAction() {// TODO: using old schema fields Agr_* /* $idProject = 1921; $schema = ProjectKosztorysSchema::getSchema(); $data = $this->_fetchKosztorysData($idProject); //DBG::_('DBG', '>1', "XMLWriter", class_exists('XMLWriter'), __CLASS__, __FUNCTION__, __LINE__); //header('Content-type: application/xml; charset=utf-8'); header('Content-type: text/plain; charset=utf-8'); $xmlWriter = new XMLWriter(); $xmlWriter->openUri('php://output'); $xmlWriter->setIndent(true); if ($xmlWriter) { $xmlWriter->startDocument('1.0','UTF-8'); //$xmlWriter->startElementNS(null, 'kosztorysy', 'https://biuro.biall-net.pl/wfs');// adds @xmlns=... $xmlWriter->startElement('kosztorysy'); $xmlWriter->writeAttribute('targetNamespace', 'https://biuro.biall-net.pl/wfs'); $xmlWriter->writeAttributeNS('xmlns', 'p5', 'http://www.w3.org/2000/xmlns/', 'https://biuro.biall-net.pl/wfs'); for ($i = 1; $i <= 10; $i++) { $idProject += 1; $schema = ProjectKosztorysSchema::getSchema(); $data = $this->_fetchKosztorysData($idProject); $xmlWriter->startElement('kosztorys'); $xmlWriter->startElement('projekt'); $xmlWriter->writeAttribute('id', $idProject); $xmlWriter->startElement('projekt'); $xmlWriter->text("TODO L." . __LINE__); $xmlWriter->endElement(); $xmlWriter->endElement(); $xmlWriter->endElement(); } // $memXmlWriter = new XMLWriter(); // $memXmlWriter->openMemory(); // $memXmlWriter->setIndent(true); // // for ($i = 1; $i <= 10; $i++) { // $idProject += 1; // $schema = ProjectKosztorysSchema::getSchema(); // $data = $this->_fetchKosztorysData($idProject); // // $memXmlWriter->startElement('kosztorys'); // $memXmlWriter->writeAttribute('id', $idProject); // $memXmlWriter->writeAttributeNS('p5', 'typeName', 'https://biuro.biall-net.pl/wfs', 'Kosztorys'); // $memXmlWriter->text('book_'.$i); // $memXmlWriter->endElement(); // // if ($i % 5 == 0) { // $batchXmlString = $memXmlWriter->outputMemory(true); // $xmlWriter->writeRaw($batchXmlString); // } // } // $memXmlWriter->flush(); // unset($memXmlWriter); $xmlWriter->endElement(); $xmlWriter->endDocument(); } */ } public function panel($idProject, $idCompany = 0) { if (User::get('ADM_ADMIN_LEVEL') > 6 || 'Pracownik' != User::getType()) return;// Only for workers with admin level < 6 if (1 == V::get('_print', '', $_GET)) return;// print mode $task = V::get('_task', '', $_GET); UI::startTag('div', ['class'=>'jumbotron']); UI::startTag('div', ['class'=>'container']); UI::startTag('div'); UI::startTag('div', ['class'=>'btn-group']); if ($idProject > 0) { $activeRoute = V::get('_route', '', $_GET); $route = 'UrlAction_ProjektyKosztorys'; UI::link('default', "Kosztorys", "index.php?_route={$route}&ID_PROJECT={$idProject}", ['className'=>['active'=>($route == $activeRoute)]]); $route = 'UrlAction_ProjektyPrzedmiarKosztorys'; UI::link('default', "Przedmiar", "index.php?_route={$route}&ID_PROJECT={$idProject}&_print=1", ['className'=>['active'=>($route == $activeRoute)]]); $route = 'UrlAction_ProjektyZestawienieSwMikRurKosztorys'; UI::link('default', "zestawienie (światłowód i mikrorurki)", "index.php?_route={$route}&ID_PROJECT={$idProject}&_print=1", ['className'=>['active'=>($route == $activeRoute)]]); // UI::link('warning', "oferta", "index.php?_route=UrlAction_ProjektyKosztyWstepnychRobot&ID_PROJECT={$idProject}&_task=oferta", ['target'=>'_blank']); // UI::link('warning', "oferta (Admin)", "index.php?_route=UrlAction_ProjektyKosztyWstepnychRobot&ID_PROJECT={$idProject}&_task=ofertaAdmin", ['target'=>'_blank']); // UI::link('warning', "oferta company", "index.php?_route=UrlAction_ProjektyKosztyWstepnychRobot&ID_PROJECT={$idProject}&_task=ofertaCompany", ['target'=>'_blank']); $route = 'UrlAction_ProjektyZamowieniaKosztorys'; UI::link('default', "Zamówienia", "index.php?_route={$route}&ID_PROJECT={$idProject}", ['className'=>['active'=>($route == $activeRoute)]]); } UI::link('default', "oferta domyślna (Admin)", "index.php?_route=UrlAction_ProjektyKosztyWstepnychRobot&_task=ofertaDefaultAdmin", ['target'=>'_blank']); UI::endTag('div');// .btn-group UI::endTag('div'); UI::endTag('div');// .container UI::endTag('div');// .jumbotron ?>
1', "args", $args, __CLASS__, __FUNCTION__, __LINE__); if (!$admin) return; $cennik = ProjectKosztorysCennik::getCennik($idProject, $idCompany); DBG::_('DBG', '>1', "cennik", $cennik, __CLASS__, __FUNCTION__, __LINE__); $pdo = DB::getPDO(); { $add_id_zasob = 0; $add_unit = ''; $add_price = 0; $add_quantity = 0; $add__sth = $pdo->prepare(" insert into CRM_LISTA_ZASOBOW_OFFERS ( CRM_LISTA_ZASOBOW_ID , COMPANIES_ID , ID_PROJECT , OFFER_PRICE_PER_RESOURCE_UNIT , RESOURCE_UNIT_TYPE , OFFER_UNIT_TYPE , REQUIRED_RESOURCE_UNITS , A_RECORD_CREATE_AUTHOR , A_RECORD_CREATE_DATE ) values ( :id_zasob , :id_company , :id_project , :price , :unit , :unit , :quantity , :author , NOW() ) "); $add__sth->bindValue(':author', User::getLogin(), PDO::PARAM_STR); $add__sth->bindValue(':id_project', $idProject, PDO::PARAM_INT); $add__sth->bindValue(':id_company', $idCompany, PDO::PARAM_INT); $add__sth->bindValue(':quantity', $add_quantity, PDO::PARAM_STR); $add__sth->bindParam(':id_zasob', $add_id_zasob, PDO::PARAM_INT); $add__sth->bindParam(':price', $add_price, PDO::PARAM_STR); $add__sth->bindParam(':unit', $add_unit, PDO::PARAM_STR); } { $edit_id_company = $idCompany; $edit_id_zasob = 0; $edit_unit = ''; $edit_price = 0; $edit_author = 0; $edit_quantity = 0; $edit__sth = $pdo->prepare(" update CRM_LISTA_ZASOBOW_OFFERS set CRM_LISTA_ZASOBOW_ID = :id_zasob , COMPANIES_ID = :id_company , ID_PROJECT = :id_project , OFFER_PRICE_PER_RESOURCE_UNIT = :price , RESOURCE_UNIT_TYPE = :unit , OFFER_UNIT_TYPE = :unit , REQUIRED_RESOURCE_UNITS = :quantity , A_RECORD_UPDATE_AUTHOR = :author , A_RECORD_UPDATE_DATE = NOW() where ID = :id "); $edit__sth->bindParam(':id', $edit_id, PDO::PARAM_INT); $edit__sth->bindValue(':author', User::getLogin(), PDO::PARAM_STR); $edit__sth->bindValue(':id_project', $idProject, PDO::PARAM_INT); $edit__sth->bindValue(':id_company', $idCompany, PDO::PARAM_INT); $edit__sth->bindValue(':quantity', $edit_quantity, PDO::PARAM_STR); $edit__sth->bindParam(':id_zasob', $edit_id_zasob, PDO::PARAM_INT); $edit__sth->bindParam(':price', $edit_price, PDO::PARAM_STR); $edit__sth->bindParam(':unit', $edit_unit, PDO::PARAM_STR); } $schema = ProjectKosztorysSchema::getSchema(); foreach ($schema['config']['layer'] as $idLayer => $layData) { DBG::_('DBG', '>1', "layData", $layData, __CLASS__, __FUNCTION__, __LINE__); foreach ($layData['type'] as $idType => $typeLabel) { $edit_id = V::get("edit_price_id_{$idType}", '', $args); $add_price = V::get("price_{$idType}", '', $args); DBG::_('DBG', '>1', "typeLabel (edit={$edit_id}, price={$add_price})", $typeLabel, __CLASS__, __FUNCTION__, __LINE__); if ($edit_id > 0) { $edit_price = V::get("price_{$idType}", '', $args); $edit_price = str_replace(',', '.', $edit_price); if ($edit_id > 0 && $edit_price > 0) { $edit_id_zasob = $idType; $edit_unit = $layData['jednostka']; // TODO: check if anything change DBG::_('DBG', '>1', "EDIT price for idZasob({$idType}) {price:{$edit_price}, id_offer:{$edit_id}}", $typeLabel, __CLASS__, __FUNCTION__, __LINE__); $edit__sth->execute(); // TODO: add to hist } } else { $add_price = V::get("price_{$idType}", '', $args); $add_price = str_replace(',', '.', $add_price); if ($add_price > 0) { $add_id_zasob = $idType; $add_unit = $layData['jednostka']; DBG::_('DBG', '>1', "ADD price for idZasob({$idType}) {price:{$add_price}}", $typeLabel, __CLASS__, __FUNCTION__, __LINE__); $add__sth->execute(); } } } } } public function saveDefaultOffer($args) { DBG::_('DBG', '>1', "args", $args, __CLASS__, __FUNCTION__, __LINE__); $cennik = ProjectKosztorysCennik::getDefaultCennik(); DBG::_('DBG', '>1', "cennik", $cennik, __CLASS__, __FUNCTION__, __LINE__); $idCompany = 0; $idProject = 0; $pdo = DB::getPDO(); { $add_id_zasob = 0; $add_unit = ''; $add_price = 0; $add_quantity = 0; $add__sth = $pdo->prepare(" insert into CRM_LISTA_ZASOBOW_OFFERS ( CRM_LISTA_ZASOBOW_ID , COMPANIES_ID , ID_PROJECT , OFFER_PRICE_PER_RESOURCE_UNIT , RESOURCE_UNIT_TYPE , OFFER_UNIT_TYPE , REQUIRED_RESOURCE_UNITS , A_RECORD_CREATE_AUTHOR , A_RECORD_CREATE_DATE ) values ( :id_zasob , :id_company , :id_project , :price , :unit , :unit , :quantity , :author , NOW() ) "); $add__sth->bindValue(':author', User::getLogin(), PDO::PARAM_STR); $add__sth->bindValue(':id_project', $idProject, PDO::PARAM_INT); $add__sth->bindValue(':id_company', $idCompany, PDO::PARAM_INT); $add__sth->bindValue(':quantity', $add_quantity, PDO::PARAM_STR); $add__sth->bindParam(':id_zasob', $add_id_zasob, PDO::PARAM_INT); $add__sth->bindParam(':price', $add_price, PDO::PARAM_STR); $add__sth->bindParam(':unit', $add_unit, PDO::PARAM_STR); } { $edit_id_zasob = 0; $edit_unit = ''; $edit_price = 0; $edit_author = 0; $edit_quantity = 0; $edit__sth = $pdo->prepare(" update CRM_LISTA_ZASOBOW_OFFERS set CRM_LISTA_ZASOBOW_ID = :id_zasob , COMPANIES_ID = :id_company , ID_PROJECT = :id_project , OFFER_PRICE_PER_RESOURCE_UNIT = :price , RESOURCE_UNIT_TYPE = :unit , OFFER_UNIT_TYPE = :unit , REQUIRED_RESOURCE_UNITS = :quantity , A_RECORD_UPDATE_AUTHOR = :author , A_RECORD_UPDATE_DATE = NOW() where ID = :id "); $edit__sth->bindParam(':id', $edit_id, PDO::PARAM_INT); $edit__sth->bindValue(':author', User::getLogin(), PDO::PARAM_STR); $edit__sth->bindValue(':id_project', $idProject, PDO::PARAM_INT); $edit__sth->bindValue(':id_company', $idCompany, PDO::PARAM_INT); $edit__sth->bindValue(':quantity', $edit_quantity, PDO::PARAM_STR); $edit__sth->bindParam(':id_zasob', $edit_id_zasob, PDO::PARAM_INT); $edit__sth->bindParam(':price', $edit_price, PDO::PARAM_STR); $edit__sth->bindParam(':unit', $edit_unit, PDO::PARAM_STR); } $schema = ProjectKosztorysSchema::getSchema(); foreach ($schema['config']['layer'] as $idLayer => $layData) { DBG::_('DBG', '>1', "layData", $layData, __CLASS__, __FUNCTION__, __LINE__); foreach ($layData['type'] as $idType => $typeLabel) { DBG::_('DBG', '>1', "typeLabel", $typeLabel, __CLASS__, __FUNCTION__, __LINE__); $edit_id = V::get("edit_price_id_{$idType}", '', $args); if ($edit_id > 0) { $edit_price = V::get("price_{$idType}", '', $args); $edit_price = str_replace(',', '.', $edit_price); if ($edit_id > 0 && $edit_price > 0) { $edit_id_zasob = $idType; $edit_unit = $layData['jednostka']; // TODO: check if anything change $edit__sth->execute(); // TODO: add to hist } } else { $add_price = V::get("price_{$idType}", '', $args); $add_price = str_replace(',', '.', $add_price); if ($add_price > 0) { $add_id_zasob = $idType; $add_unit = $layData['jednostka']; $add__sth->execute(); } } } } } public function defaultOferta($idCompany = 0) { if ('1' == V::get('save_offer', '', $_POST)) { $this->saveDefaultOffer($_POST); } $schema = ProjectKosztorysSchema::getSchema(); if (empty($schema['config']['type'])) throw new Exception("Schema error - brak zdefiniowanych typów"); $cennik = ProjectKosztorysCennik::getDefaultCennik($idCompany); //DBG::_(true, true, "cennik", $cennik, __CLASS__, __FUNCTION__, __LINE__); UI::setTitleJsTag("Cennik domyślny dla Kosztorysów"); ?>
$layData) : ?>

$typeLabel) : ?>
id zasobu typ jednostka miary cena jednostkowa

// // // // // // // // // // // // // // // // // // // 22574 ->22515 INNE TYPE Zapas kabla // 22620 ->22618 INNE TYPE Spliter 1/4 // 22621 ->22617 INNE TYPE Spliter 1/16 // 22647 ->22638 INNE TYPE Montaż złączek mikrokanalizacji // 22648 ->22639 INNE TYPE Puszka abonencka z montażem // 22649 ->22640 INNE TYPE Przewiert w budynku z uszczelnieniem // 22650 ->22641 INNE TYPE Spaw poza mufą // 22651 ->22642 INNE TYPE Pigtail od puszki do terminala // 22652 ->22643 INNE TYPE Montaż zapasu w studni // 22653 ->22644 INNE TYPE Wprowadzenie kabli do mufy // 22654 ->22645 INNE TYPE Mufa z montażem // 22655 ->22646 INNE TYPE Zamek PIOCH do studni // 22881 ->22514 INNE TYPE Złącze // TODO: ? 22484 } /** * @returns [ 'cost_total' => :numeric, 'sub_costs' => [ $id_zasob => 'price' ] ] */ public function getProjectCostByCennik($idProject, $idCompany = 0) { $projCost = array(); $projCost['cost_total'] = 0; $projCost['sub_costs'] = array(); $defCennik = ProjectKosztorysCennik::getDefaultCennik($idCompany); // $defCennik = [ $id_zasob => [ 'price' => $price, 'ID', 'id_zasob', 'id_company', 'id_project', 'unit', 'quantity' ] ] $cennik = ProjectKosztorysCennik::getCennik($idProject, $idCompany); $workCennik = ProjectKosztorysCennik::getWorkCennik($idProject, $idCompany); $data = $this->getKosztorysData($idProject, $idOrder = 0, $admin = false); foreach ($data['summary'] as $idLayer => $layData) { foreach ($layData['data'] as $typeData) { if (!$typeData['idType']) continue; $price = (!empty($cennik[$typeData['idType']]['price']))? $cennik[$typeData['idType']]['price'] : 0; $defPrice = (!empty($defCennik[$typeData['idType']]['price']))? $defCennik[$typeData['idType']]['price'] : 0; $workPrice = (!empty($workCennik[$typeData['idType']]['price']))? $workCennik[$typeData['idType']]['price'] : 0; $cost = ($price > 0)? $price : $defPrice; if ($workPrice > 0) $cost += $workPrice; $cost = $typeData['ilosc'] * $cost; $projCost['sub_costs'][$typeData['idType']] = $cost; $projCost['cost_total'] += $cost; } } // fetch sub costs for sub projects // $data['by_project'] = array_reduce($data['rawDataByType'], function($result, $row) { // $idProj = $row['ID_PROJECT']; // $idLayer = $row['idLayer']; // $idType = $row['idType']; // if (!array_key_exists($idProj, $result)) $result[$idProj] = array(); // if (!array_key_exists($idLayer, $result)) $result[$idProj][$idLayer] = array(); // if (!array_key_exists($idType, $result[$idProj][$idLayer])) { // $result[$idProj][$idLayer][$idType] = $row; // } else { // $result[$idProj][$idLayer][$idType]['ilosc'] += $row['ilosc']; $projCost['sub_proj'] = array(); foreach ($data['by_project'] as $idSubProj => $subProjData) { foreach ($subProjData as $idLayer => $layData) { foreach ($layData as $idType => $typeData) { $price = (!empty($cennik[$typeData['idType']]['price']))? $cennik[$typeData['idType']]['price'] : 0; $defPrice = (!empty($defCennik[$typeData['idType']]['price']))? $defCennik[$typeData['idType']]['price'] : 0; $cost = ($price > 0)? $price : $defPrice; $cost = $typeData['ilosc'] * $cost; $projCost['sub_proj'][$idSubProj][$idType] = $cost; } } } return $projCost; } public function getModel($idProject) { if (array_key_exists($idProject, $this->_model)) return $this->_model[$idProject]; $this->_model[$idProject] = new ProjectKosztorysModel($idProject); return $this->_model[$idProject]; } public function oferta($args) { $idProject = $args['idProject']; $idCompany = V::get('idCompany', 0, $args); $admin = V::get('admin', false, $args); $companyAdmin = V::get('companyAdmin', false, $args); if ($admin && '1' == V::get('save_offer', '', $_POST)) { $this->saveOffer($idProject, $idCompany, $_POST, $admin); } $defCennik = ProjectKosztorysCennik::getDefaultCennik($idCompany); $cennik = ProjectKosztorysCennik::getCennik($idProject, $idCompany); $viewLayerDataArgs = compact('idProject', 'idCompany', 'admin', 'companyAdmin'); UI::setTitleJsTag("Oferta " . (($idProject)? " [{$idProject}] " : '') . (($idCompany)? " Kontrahent({$idCompany})" : '') . " - Kosztorysy"); ?>
viewLayersData($viewLayerDataArgs); ?>
1', "conf", $conf, __CLASS__, __FUNCTION__, __LINE__); $summaryTypeCost = V::get('sub_costs', array(), $projCosts); $subProjCost = V::get('sub_proj', array(), $projCosts); $data = $this->getKosztorysData($idProject, $idOrder = 0, $admin); $dataSummary = $data['summary']; $dataSubProj = $data['by_project']; // $dataSubProj = array(); // foreach ($data['by_project'] as $idSubProj => $subProjData) { // if ($idProject != $idSubProj) $dataSubProj[$idSubProj] = $subProjData; // } DBG::_('DBG', '>1', "data", $data, __CLASS__, __FUNCTION__, __LINE__); $defCennik = ProjectKosztorysCennik::getDefaultCennik($idCompany); $cennik = ProjectKosztorysCennik::getCennik($idProject, $idCompany); DBG::_('DBG', '>1', "cennik", $cennik, __CLASS__, __FUNCTION__, __LINE__); DBG::_('DBG', '>1', "defCennik", $defCennik, __CLASS__, __FUNCTION__, __LINE__); $workCennik = ProjectKosztorysCennik::getWorkCennik($idProject, $idCompany); if (!empty($summaryTypeCost)) { $additionalCosts = array(); $additionalCosts[] = array(); $additionalCosts[] = array(); $additionalCosts[] = array(); $additionalSummaryTypeCost = array(); $additionalSummaryTypeCost[] = 0; $additionalSummaryTypeCost[] = 0; $additionalSummaryTypeCost[] = 0; } ?> $layData) : ?> $additionalCost) : ?>
typ ilość jednostka cena jednostkowa cena jedn. (robocizna) cena jedn. (domyślna) szacowany koszt [zł] uwagi
' . "Popraw" . '' . " (dane dla projektu [{$idProject}])"; $fixAllLink = '' . "Popraw wszystkie" . ''; UI::alert('danger', "Niezdefiniowany typ: {$typeData['type']} - {$fixProjectLink}, {$fixAllLink}"); } ?> 1', "Error conf", $conf, __CLASS__, __FUNCTION__, __LINE__); ?> 1', "Error", $typeData, __CLASS__, __FUNCTION__, __LINE__); ?>
onClick="return p5UI__ButtonAjax(this, 'p5UIBtnAjax:Kosztorys:updateProjektyOferta', { href: '' })" class="type_price-" style="cursor:pointer; padding:3px 6px; text-align:right"> onClick="return p5UI__ButtonAjax(this, 'p5UIBtnAjax:Kosztorys:updateProjektyOferta', { href: '' })" style="padding:3px 6px; text-align:right">
Koszty dodatkowe
typ ilość jednostka cena jednostkowa cena jedn. (robocizna) cena jedn. (domyślna) szacowany koszt [zł] uwagi
-

Składowe wg projektów podrzędnych:

$subProjData) : ?> $layData) : ?> $typeData) : ?>

Projekt : getModel($idProject)->getProjectName($idSubProj); ?>:

typ ilość jednostka cena jednostkowa cena jedn. (domyślna) szacowany koszt [zł]
' . "Popraw" . '' . " (dane dla projektu [{$idProject}])"; $fixAllLink = '' . "Popraw wszystkie" . ''; UI::alert('danger', "Niezdefiniowany typ: {$typeData['type']} - {$fixProjectLink}, {$fixAllLink}"); } ?> 1', "Error conf", $conf, __CLASS__, __FUNCTION__, __LINE__); ?> 1', "Error", $typeData, __CLASS__, __FUNCTION__, __LINE__); ?>
getModel($idProject)->getSubProjectIds(); $idSubProject[] = $idProject; $_data = $this->fetchData($idSubProject, $admin); } return $_data; } public function fetchData($idProject, $idOrder = 0, $admin = 0) {// TODO: before was: ($idProject, $admin = 0) $data = array(); $data['summary'] = array();// [ $idType ] = ['type', 'jednostka', 'ilosc'] $data['rawDataByType'] = array(); if (empty($idProject)) return $data; $schema = ProjectKosztorysSchema::getSchema();// OK only 'config' $conf = $schema['config']; $pdo = DB::getPDO(); foreach ($conf['layer'] as $idLayer => $layer) { if (!$layer['tabela_name']) continue;// TODO: throw error in validate if ('ZASOB' == $layer['zasob_type']) { } else if ('ZASOB_ID' == $layer['zasob_type']) { } else { continue;// TODO: validate config error } $tblName = $layer['tabela_name']; $sqlIloscField = (!empty($layer['ilosc_field']))? $layer['ilosc_field'] : 'ID'; $sqlIlosc = ('SZTUKA' == $layer['jednostka'])? "count(1)" : "sum(t.{$sqlIloscField})"; $sqlZasobField = (!empty($layer['zasob_field']))? $layer['zasob_field'] : 'ID'; $sqlGroupBy = "group by t.ID_PROJECT" . ((!empty($layer['zasob_field']))? ", t.{$sqlZasobField}" : ''); $sqlIdProject = (is_array($idProject))? implode(",", $idProject) : (int)$idProject; $sql = " select t.{$sqlZasobField} , t.ID_PROJECT , {$sqlIlosc} as ilosc , count(1) as ilosc_sztuk from {$tblName} t where t.ID_PROJECT in({$sqlIdProject}) and t.the_geom is not null {$sqlGroupBy} "; $data['_DBG_sql'][$idLayer] = $sql; $rawLayData = $pdo->fetchAll($sql); $rawLayData = array_filter($rawLayData, function($row) { return ($row['ilosc'] > 0); }); foreach ($rawLayData as $idx => &$row) { if ('ZASOB' == $layer['zasob_type']) { $row['type'] = trim($row[$sqlZasobField]); $row['idType'] = array_search($row['type'], $conf['type']); } else if ('ZASOB_ID' == $layer['zasob_type']) { $row['type'] = $layer['zasob_label']; $row['idType'] = (array_key_exists($layer['zasob_id'], $conf['type']))? $layer['zasob_id'] : null; } $idType = $row['idType']; $row['idLayer'] = $idLayer; $row['jednostka'] = $conf['layer'][$idLayer]['jednostka']; if (!empty($conf['layer'][$idLayer]['jednostka_zasob_id'][$idType])) { $row['jednostka'] = $conf['layer'][$idLayer]['jednostka_zasob_id'][$idType]; if ('SZTUKA' == $row['jednostka']) { $row['ilosc'] = $row['ilosc_sztuk']; } } unset($row['ilosc_sztuk']); unset($row[$sqlZasobField]); $data['rawDataByType'][] = $row; } } //DBG::_(true, true, "data", $data, __CLASS__, __FUNCTION__, __LINE__); //DBG::table("data['rawDataByType']", $data['rawDataByType'], __CLASS__, __FUNCTION__, __LINE__); if ($admin) { foreach ($data['rawDataByType'] as $row) { $layer = $conf['layer'][$row['idLayer']]; if ($row['idType'] <= 0) { UI::alert('warning', "Pomijanie nieznanego oznaczenia '{$row['type']}' w ilości {$row['ilosc']} - warstwa '{$layer['label']}' ({$layer['tabela_name']}), projekt nr {$row['ID_PROJECT']}"); } } } $data['rawDataByType'] = array_filter($data['rawDataByType'], function($row) { return ($row['idType'] > 0); }); //DBG::table("data['rawDataByType'] - clean", $data['rawDataByType'], __CLASS__, __FUNCTION__, __LINE__); $data['by_layer'] = array_reduce($data['rawDataByType'], function($result, $row) { $idLayer = $row['idLayer']; $idType = $row['idType']; if (!array_key_exists($idLayer, $result)) $result[$idLayer] = array(); if (!array_key_exists($idType, $result[$idLayer])) { $result[$idLayer][$idType] = $row; } else { $result[$idLayer][$idType]['ilosc'] += $row['ilosc']; } return $result; }, array()); //DBG::_(true, true, "data['by_layer']", $data['by_layer'], __CLASS__, __FUNCTION__, __LINE__); $data['summary'] = array(); foreach ($data['by_layer'] as $idLayer => $iloscByType) { $layData = array(); $layData['label'] = $conf['layer'][$idLayer]['label']; $layData['data'] = $iloscByType; $data['summary'][$idLayer] = $layData; } //DBG::_(true, true, "data['summary']", $data['summary'], __CLASS__, __FUNCTION__, __LINE__); $data['by_project'] = array_reduce($data['rawDataByType'], function($result, $row) { $idProj = $row['ID_PROJECT']; $idLayer = $row['idLayer']; $idType = $row['idType']; if (!array_key_exists($idProj, $result)) $result[$idProj] = array(); if (!array_key_exists($idLayer, $result[$idProj])) $result[$idProj][$idLayer] = array(); if (!array_key_exists($idType, $result[$idProj][$idLayer])) { $result[$idProj][$idLayer][$idType] = $row; } else { $result[$idProj][$idLayer][$idType]['ilosc'] += $row['ilosc']; } return $result; }, array()); //DBG::_(true, true, "data['by_project']", $data['by_project'], __CLASS__, __FUNCTION__, __LINE__); return $data; } }