ProjektyKosztyWstepnychRobot.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. class Route_UrlAction_ProjektyKosztyWstepnychRobot extends RouteBase {// TODO: UrlActionBase @see Route_UrlAction
  4. public function handleAuth() {
  5. if (!User::logged()) {
  6. throw new HttpException('Unauthorized', 401);
  7. }
  8. }
  9. public function defaultAction() {
  10. // TODO: check if user is allowed to run this action
  11. SE_Layout::gora();
  12. try {
  13. $idProject = V::get('ID_PROJECT', '', $_REQUEST, 'int');
  14. if (!$idProject) throw new Exception("Wrong param in 'ID_PROJECT' - expected integer!");
  15. $this->kosztorys($idProject);
  16. } catch (Exception $e) {
  17. SE_Layout::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage());
  18. }
  19. SE_Layout::dol();
  20. }
  21. public function getArgsList() {// TODO: override UrlActionBase::getArgsList action
  22. $args = array();
  23. $args[] = 'ID_PROJECT';
  24. return $args;
  25. }
  26. public function reinstallAction() {// TODO: mv to UrlActionBase
  27. $jsonData = new stdClass();
  28. $jsonData->type = 'success';
  29. $jsonData->msg = 'Gotowe';
  30. try {
  31. $this->reinstall();
  32. } catch (Exception $e) {
  33. $jsonData->type = 'danger';
  34. $jsonData->msg = $e->getMessage();
  35. }
  36. echo json_encode($jsonData);
  37. }
  38. public function reinstall() {// TODO: mv to UrlActionBase
  39. /* required Zasoby tree structure:
  40. - required base structure
  41. [:ts_main_id] TYPESPECIALS
  42. [:action_id] URL_ACTION :url_action_name
  43. [:action_param_1_id] PARAM_IN :url_action_param_1_name
  44. - current function from schema
  45. [:main_db_id] (DATABASE_MYSQL, BAZA_DANYCH, DATABASE_POSTGRESQL)
  46. [:tbl_id] TABELA 'IN7_MK_BAZA_DYSTRYBUCJI'
  47. [:cell_id] KOMORKA 'ID'
  48. [:link_action_id] (ALIAS DO :action_id) URL_ACTION :url_action_name
  49. [:link_param_id] (ALIAS DO :cell_id) PARAM_IN :url_action_param_1_name
  50. :url_action_name = 'ProjektyKosztyWstepnychRobot'
  51. :url_action_param_1_name = 'ID_PROJECT'
  52. */
  53. $flatConfig_main = array();
  54. {
  55. $flatConfig_main[] = (object)array(// Zasob::assert(TYPESPECIALS)
  56. 'query' => "
  57. select z.ID from CRM_LISTA_ZASOBOW z
  58. where z.TYPE='TYPESPECIALS'
  59. and z.A_STATUS not in('DELETED')
  60. ",
  61. 'createTable' => 'CRM_LISTA_ZASOBOW',
  62. 'createArgs' => array('TYPE' => 'TYPESPECIALS', 'DESC' => 'Typespecials'),
  63. 'out' => array(':ts_main_id' => 'ID')
  64. );
  65. $flatConfig_main[] = (object)array(// Zasob::assert(TYPESPECIALS/:url_action_name)
  66. 'query' => "
  67. select z.ID from CRM_LISTA_ZASOBOW z
  68. where z.PARENT_ID = :ts_main_id
  69. and z.TYPE = 'URL_ACTION'
  70. and z.DESC = :url_action_name
  71. and z.A_STATUS not in('DELETED')
  72. ",
  73. 'createTable' => 'CRM_LISTA_ZASOBOW',
  74. 'createArgs' => array('TYPE' => 'URL_ACTION', 'PARENT_ID' => ':ts_main_id', 'DESC' => ':url_action_name'),
  75. 'in' => array(':ts_main_id', ':url_action_name'),
  76. 'out' => array(':action_id' => 'ID')
  77. );
  78. $flatConfig_main[] = (object)array(// Zasob::assert(TYPESPECIALS/:url_action_name/:url_action_param_1_name)
  79. 'query' => "
  80. select z.ID from CRM_LISTA_ZASOBOW z
  81. where z.PARENT_ID = :action_id
  82. and z.TYPE = 'PARAM_IN'
  83. and z.DESC = :url_action_param_1_name
  84. and z.A_STATUS not in('DELETED')
  85. ",
  86. 'createTable' => 'CRM_LISTA_ZASOBOW',
  87. 'createArgs' => array('TYPE' => 'PARAM_IN', 'PARENT_ID' => ':action_id', 'DESC' => ':url_action_param_1_name'),
  88. 'in' => array(':action_id', ':url_action_param_1_name'),
  89. 'out' => array(':action_param_1_id' => 'ID')
  90. );
  91. }
  92. DBG::_(true, true, "flatConfig_main", $flatConfig_main, __CLASS__, __FUNCTION__, __LINE__);
  93. $flatConfig_link_in_projekt = array();
  94. {
  95. $flatConfig_link_in_projekt[] = (object)array(// Zasob::assert(default_db)
  96. 'query' => "
  97. select z.ID from CRM_LISTA_ZASOBOW z
  98. where z.ID = :main_db_id
  99. and z.TYPE in('DATABASE_MYSQL', 'BAZA_DANYCH', 'DATABASE_POSTGRESQL')
  100. and z.A_STATUS not in('DELETED')
  101. ",
  102. 'createTable' => 'CRM_LISTA_ZASOBOW',
  103. 'createArgs' => array('TYPE' => 'BAZA_DANYCH', 'DESC' => 'Baza danych'),
  104. 'in' => array(':main_db_id'),
  105. 'out' => array(':main_db_id' => 'ID')
  106. );
  107. $flatConfig_link_in_projekt[] = (object)array(// Zasob::assert(default_db/IN7_MK_BAZA_DYSTRYBUCJI)
  108. 'query' => "
  109. select z.ID from CRM_LISTA_ZASOBOW z
  110. where z.PARENT_ID = :main_db_id
  111. and z.TYPE = 'TABELA'
  112. and z.DESC = 'IN7_MK_BAZA_DYSTRYBUCJI'
  113. and z.A_STATUS not in('DELETED')
  114. ",
  115. 'createTable' => 'CRM_LISTA_ZASOBOW',
  116. 'createArgs' => array('TYPE' => 'TABELA', 'PARENT_ID' => ':main_db_id', 'DESC' => 'IN7_MK_BAZA_DYSTRYBUCJI'),
  117. 'in' => array(':main_db_id'),
  118. 'out' => array(':tbl_id' => 'ID')
  119. );
  120. $flatConfig_link_in_projekt[] = (object)array(// Zasob::assert(default_db/IN7_MK_BAZA_DYSTRYBUCJI/ID)
  121. 'query' => "
  122. select z.ID from CRM_LISTA_ZASOBOW z
  123. where z.PARENT_ID = :tbl_id
  124. and z.TYPE = 'KOMORKA'
  125. and z.DESC = 'ID'
  126. and z.A_STATUS not in('DELETED')
  127. ",
  128. 'createTable' => 'CRM_LISTA_ZASOBOW',
  129. 'createArgs' => array('TYPE' => 'KOMORKA', 'PARENT_ID' => ':tbl_id', 'DESC' => 'ID'),
  130. 'in' => array(':tbl_id'),
  131. 'out' => array(':cell_id' => 'ID')
  132. );
  133. $flatConfig_link_in_projekt[] = (object)array(// Zasob::assert(default_db/IN7_MK_BAZA_DYSTRYBUCJI/:url_action_name)
  134. 'query' => "
  135. select z.ID from CRM_LISTA_ZASOBOW z
  136. where z.PARENT_ID = :tbl_id
  137. and z.ALIAS_ID = ':action_id'
  138. and z.TYPE = 'URL_ACTION'
  139. and z.DESC = ':url_action_name'
  140. and z.A_STATUS not in('DELETED')
  141. ",
  142. 'createTable' => 'CRM_LISTA_ZASOBOW',
  143. 'createArgs' => array('TYPE' => 'URL_ACTION', 'PARENT_ID' => ':tbl_id', 'ALIAS_ID' => ':action_id', 'DESC' => ':url_action_name'),
  144. 'in' => array(':tbl_id', ':action_id', ':url_action_name'),
  145. 'out' => array(':link_action_id' => 'ID')
  146. );
  147. // [:link_param_id] (ALIAS DO :cell_id) PARAM_IN :url_action_param_1_name
  148. $flatConfig_link_in_projekt[] = (object)array(// Zasob::assert(default_db/IN7_MK_BAZA_DYSTRYBUCJI/:url_action_name/:url_action_param_1_name)
  149. 'query' => "
  150. select z.ID from CRM_LISTA_ZASOBOW z
  151. where z.PARENT_ID = :link_action_id
  152. and z.ALIAS_ID = ':cell_id'
  153. and z.TYPE = 'PARAM_IN'
  154. and z.DESC = ':url_action_param_1_name'
  155. and z.A_STATUS not in('DELETED')
  156. ",
  157. 'createTable' => 'CRM_LISTA_ZASOBOW',
  158. 'createArgs' => array('TYPE' => 'PARAM_IN', 'PARENT_ID' => ':link_action_id', 'ALIAS_ID' => ':cell_id', 'DESC' => ':url_action_param_1_name'),
  159. 'in' => array(':cell_id', ':link_action_id', ':url_action_param_1_name'),
  160. 'out' => array(':link_action_id' => 'ID')
  161. );
  162. }
  163. DBG::_(true, true, "flatConfig_link_in_projekt", $flatConfig_link_in_projekt, __CLASS__, __FUNCTION__, __LINE__);
  164. /* flat config - table Projekty (default_db:IN7_MK_BAZA_DYSTRYBUCJI):
  165. [
  166. { // Zasob::assert(default_db/IN7_MK_BAZA_DYSTRYBUCJI/:url_action_name/ID)
  167. query: "select z.ID from CRM_LISTA_ZASOBOW z
  168. where z.PARENT_ID = :link_action_id
  169. and z.ALIAS_ID = ':cell_id'
  170. and z.TYPE = 'PARAM_IN'
  171. and z.DESC = 'ID'
  172. and z.A_STATUS not in('DELETED')
  173. ",
  174. create: {CRM_LISTA_ZASOBOW: [TYPE: 'KOMORKA', PARENT_ID: ':tbl_id', DESC: 'ID']},
  175. in: [':tbl_id', ':cell_id', ':link_action_id'],
  176. out: { ID: ':link_param_id' }
  177. }
  178. ]
  179. */
  180. $pdo = DB::getPDO();
  181. $args = $this->getArgsList();
  182. $clsName = __CLASS__;
  183. $urlActionName = str_replace('Route_UrlAction_', '', $clsName);
  184. DBG::_(true, true, "reinstall class", __CLASS__, __CLASS__, __FUNCTION__, __LINE__);
  185. DBG::_(true, true, "reinstall funName", $urlActionName, __CLASS__, __FUNCTION__, __LINE__);
  186. DBG::_(true, true, "reinstall test", $args, __CLASS__, __FUNCTION__, __LINE__);
  187. $dbFunction = $this->fetchZasobInfo();
  188. $usrLogin = User::getLogin();
  189. {// check if URL_ACTION already exists
  190. if (!$dbFunction) throw new Exception("Brak id zasobu typu TYPESPECIALS - TODO: CREATE");// $this->createZasobTypespecials();
  191. DBG::_(true, true, "dbFunction", $dbFunction, __CLASS__, __FUNCTION__, __LINE__);
  192. if ($dbFunction['action_id_is_null']) {
  193. $sth = $pdo->prepare("
  194. insert into CRM_LISTA_ZASOBOW (
  195. TYPE,
  196. PARENT_ID,
  197. `DESC`,
  198. A_RECORD_CREATE_AUTHOR,
  199. A_RECORD_CREATE_DATE
  200. )
  201. values (
  202. 'URL_ACTION',
  203. :ts_id,
  204. :url_action_name,
  205. 'system-by-{$usrLogin}',
  206. NOW()
  207. )
  208. ");
  209. //$sth->bindValue('ts_id', $dbFunction['ts_id'], PDO::PARAM_INT);
  210. //$sth->bindValue('url_action_name', $urlActionName, PDO::PARAM_STR);
  211. $bindValues = array();
  212. $bindValues['ts_id'] = array($dbFunction['ts_id'], PDO::PARAM_INT);
  213. $bindValues['url_action_name'] = $urlActionName;
  214. $pdo->bindValues($sth, $bindValues);
  215. DBG::_(true, true, "sql", $pdo->getRawSql($sth), __CLASS__, __FUNCTION__, __LINE__);
  216. $sth->execute();
  217. $dbFunction = $this->fetchZasobInfo();
  218. if (!$dbFunction || $dbFunction['action_id_is_null']) throw new Exception("Brak zasobu typu URL_ACTION, nie udało się go utworzyć!");
  219. }
  220. }
  221. {// check params
  222. if (!empty($args)) {
  223. $todoArgs = array();
  224. foreach ($args as $argName) {
  225. if (empty($dbFunction['url_params'])) {
  226. $todoArgs[$argName] = true;
  227. } else if (!array_key_exists($argName, $dbFunction['url_params'])) {
  228. $todoArgs[$argName] = true;
  229. }
  230. // OK PARAM_IN exists
  231. }
  232. $todoArgs = array_keys($todoArgs);
  233. DBG::_(true, true, "todoArgs", $todoArgs, __CLASS__, __FUNCTION__, __LINE__);
  234. if (!empty($todoArgs)) {
  235. $sqlValues = array();
  236. foreach ($todoArgs as $argName) {
  237. $sqlValues[] = "(
  238. 'PARAM_IN',
  239. {$dbFunction['action_id']},
  240. '{$argName}',
  241. 'system-by-{$usrLogin}',
  242. NOW()
  243. )
  244. ";
  245. }
  246. $sqlValues = implode(", ", $sqlValues);
  247. $sth = $pdo->prepare("
  248. insert into CRM_LISTA_ZASOBOW (
  249. TYPE,
  250. PARENT_ID,
  251. `DESC`,
  252. A_RECORD_CREATE_AUTHOR,
  253. A_RECORD_CREATE_DATE
  254. )
  255. values {$sqlValues}
  256. ");
  257. DBG::_(true, true, "sql", $pdo->getRawSql($sth), __CLASS__, __FUNCTION__, __LINE__);
  258. //$sth->execute();
  259. $dbFunction = $this->fetchZasobInfo();
  260. }
  261. if (empty($dbFunction['url_params'])) {
  262. throw new Exception("Brak zdefiniowanych parametrów, nie udało się ich utworzyć!");
  263. }
  264. }
  265. }
  266. {// check links in tables
  267. // $info['links']['IN7_MK_BAZA_DYSTRYBUCJI'] = $linkInfo;
  268. if (empty($dbFunction['links']['IN7_MK_BAZA_DYSTRYBUCJI'])) throw new Exception("Brak poprawne wprowadzonej tabeli 'IN7_MK_BAZA_DYSTRYBUCJI' w drzewie zasobów!");
  269. $projInfo = $dbFunction['links']['IN7_MK_BAZA_DYSTRYBUCJI'];
  270. /*
  271. [link_action_id] =>
  272. [db_id] => 36
  273. [tbl_id] => 636
  274. [cell_id] => 763
  275. [param1_id] =>
  276. */
  277. if (!$projInfo['link_action_id']) {
  278. $sth = $pdo->prepare("
  279. insert into CRM_LISTA_ZASOBOW (
  280. TYPE,
  281. PARENT_ID,
  282. ALIAS_ID,
  283. `DESC`,
  284. A_RECORD_CREATE_AUTHOR,
  285. A_RECORD_CREATE_DATE
  286. )
  287. values (
  288. 'URL_ACTION',
  289. {$projInfo['tbl_id']},
  290. {$dbFunction['action_id']},
  291. '{$urlActionName}',
  292. 'system-by-{$usrLogin}',
  293. NOW()
  294. )
  295. ");
  296. //DBG::_(true, true, "sql", $pdo->getRawSql($sth), __CLASS__, __FUNCTION__, __LINE__);
  297. $sth->execute();
  298. $dbFunction = $this->fetchZasobInfo();
  299. $projInfo = $dbFunction['links']['IN7_MK_BAZA_DYSTRYBUCJI'];
  300. if (!$projInfo['link_action_id']) throw new Exception("Brak zainstalowanej akcji dla tabeli 'IN7_MK_BAZA_DYSTRYBUCJI' - nie udało się zainstalować");
  301. }
  302. if (!$projInfo['param1_id']) {// TODO: get from params
  303. $sth = $pdo->prepare("
  304. insert into CRM_LISTA_ZASOBOW (
  305. TYPE,
  306. PARENT_ID,
  307. ALIAS_ID,
  308. `DESC`,
  309. A_RECORD_CREATE_AUTHOR,
  310. A_RECORD_CREATE_DATE
  311. )
  312. values (
  313. 'PARAM_IN',
  314. {$projInfo['link_action_id']},
  315. {$projInfo['cell_id']},
  316. 'ID_PROJECT',
  317. 'system-by-{$usrLogin}',
  318. NOW()
  319. )
  320. ");
  321. $sth->execute();
  322. $dbFunction = $this->fetchZasobInfo();
  323. $projInfo = $dbFunction['links']['IN7_MK_BAZA_DYSTRYBUCJI'];
  324. if (!$projInfo['param1_id']) throw new Exception("Brak zainstalowanego parametru 1 w akcji dla tabeli 'IN7_MK_BAZA_DYSTRYBUCJI' - nie udało się zainstalować");
  325. }
  326. }
  327. }
  328. public function fetchZasobInfo() {
  329. $pdo = DB::getPDO();
  330. $args = $this->getArgsList();
  331. $clsName = __CLASS__;
  332. $urlActionName = str_replace('Route_UrlAction_', '', $clsName);
  333. $sth = $pdo->prepare("
  334. select zp.ID as ts_id
  335. , IF(z.ID is null, 1, 0) as action_id_is_null
  336. , z.ID as action_id
  337. , z.DESC as action_desc
  338. from CRM_LISTA_ZASOBOW zp
  339. left join CRM_LISTA_ZASOBOW z on(z.PARENT_ID = zp.ID
  340. and z.TYPE = 'URL_ACTION'
  341. and z.DESC = :url_action_name
  342. and z.A_STATUS not in('DELETED')
  343. )
  344. where zp.TYPE = 'TYPESPECIALS'
  345. and zp.A_STATUS not in('DELETED')
  346. ");
  347. $sth->bindValue('url_action_name', $urlActionName);
  348. $sth->execute();
  349. $info = $sth->fetch();
  350. if (!$info) return $info;
  351. $info['url_params'] = array();
  352. $info['links'] = array();// where action is installed - expected `IN7_MK_BAZA_DYSTRYBUCJI`
  353. if ($info['action_id'] > 0) {
  354. $sthParams = $pdo->prepare("
  355. select z.ID as param_id
  356. , z.DESC as param_desc
  357. from CRM_LISTA_ZASOBOW z
  358. where z.TYPE = 'PARAM_IN'
  359. and z.A_STATUS not in('DELETED')
  360. and z.PARENT_ID = :url_action_id
  361. ");
  362. $sthParams->bindValue('url_action_id', $info['action_id']);
  363. $sthParams->execute();
  364. $urlParams = array();
  365. $rawUrlParams = $sthParams->fetchAll();
  366. foreach ($rawUrlParams as $urlParam) {
  367. $urlParams[$urlParam['param_desc']] = $urlParam;
  368. }
  369. $info['url_params'] = $urlParams;
  370. }
  371. {
  372. $main_db_id = $pdo->getZasobId();
  373. $sth_dbInfo = $pdo->prepare("
  374. select za.id as link_action_id
  375. , zd.id as db_id
  376. , zt.id as tbl_id
  377. , zi.id as cell_id
  378. , zp1.id as param1_id -- for every param
  379. from CRM_LISTA_ZASOBOW zt
  380. join CRM_LISTA_ZASOBOW zd on(zd.ID = zt.PARENT_ID
  381. and zd.TYPE in('DATABASE_MYSQL', 'BAZA_DANYCH', 'DATABASE_POSTGRESQL')
  382. and zd.ID = {$main_db_id}
  383. )
  384. join CRM_LISTA_ZASOBOW zi on(zi.PARENT_ID = zt.ID
  385. and zi.TYPE = 'KOMORKA'
  386. and zi.DESC = 'ID'
  387. )
  388. left join CRM_LISTA_ZASOBOW za on(za.PARENT_ID = zt.ID
  389. and za.TYPE = 'URL_ACTION'
  390. and za.ALIAS_ID = {$info['action_id']}
  391. )
  392. -- TODO: for every param:
  393. left join CRM_LISTA_ZASOBOW zp1 on(zp1.PARENT_ID = za.ID
  394. and zp1.TYPE = 'PARAM_IN'
  395. and zp1.ALIAS_ID = zi.id
  396. and zp1.DESC = 'ID_PROJECT'
  397. )
  398. where zt.TYPE = 'TABELA'
  399. and zt.A_STATUS not in('DELETED')
  400. and zt.DESC = 'IN7_MK_BAZA_DYSTRYBUCJI'
  401. ");
  402. DBG::_(true, true, "dbInfo query", $pdo->getRawSql($sth_dbInfo), __CLASS__, __FUNCTION__, __LINE__);
  403. $sth_dbInfo->execute();
  404. $linkInfo = $sth_dbInfo->fetch();
  405. if ($linkInfo) {
  406. $info['links']['IN7_MK_BAZA_DYSTRYBUCJI'] = $linkInfo;
  407. }
  408. }
  409. return $info;
  410. }
  411. public function kosztorysXmlAction() {
  412. $idProject = 1921;
  413. $schema = $this->_getKosztorysSchema();
  414. $data = $this->_fetchKosztorysData($idProject);
  415. //DBG::_(true, true, "XMLWriter", class_exists('XMLWriter'), __CLASS__, __FUNCTION__, __LINE__);
  416. //header('Content-type: application/xml; charset=utf-8');
  417. header('Content-type: text/plain; charset=utf-8');
  418. $xmlWriter = new XMLWriter();
  419. $xmlWriter->openUri('php://output');
  420. $xmlWriter->setIndent(true);
  421. if ($xmlWriter) {
  422. $xmlWriter->startDocument('1.0','UTF-8');
  423. //$xmlWriter->startElementNS(null, 'kosztorysy', 'https://biuro.biall-net.pl/wfs');// adds @xmlns=...
  424. $xmlWriter->startElement('kosztorysy');
  425. $xmlWriter->writeAttribute('targetNamespace', 'https://biuro.biall-net.pl/wfs');
  426. $xmlWriter->writeAttributeNS('xmlns', 'p5', 'http://www.w3.org/2000/xmlns/', 'https://biuro.biall-net.pl/wfs');
  427. for ($i = 1; $i <= 10; $i++) {
  428. $idProject += 1;
  429. $schema = $this->_getKosztorysSchema();
  430. $data = $this->_fetchKosztorysData($idProject);
  431. $xmlWriter->startElement('kosztorys');
  432. $xmlWriter->startElement('projekt');
  433. $xmlWriter->writeAttribute('id', $idProject);
  434. $xmlWriter->startElement('projekt');
  435. $xmlWriter->text("TODO L." . __LINE__);
  436. $xmlWriter->endElement();
  437. $xmlWriter->endElement();
  438. $xmlWriter->endElement();
  439. }
  440. /*
  441. $memXmlWriter = new XMLWriter();
  442. $memXmlWriter->openMemory();
  443. $memXmlWriter->setIndent(true);
  444. for ($i = 1; $i <= 10; $i++) {
  445. $idProject += 1;
  446. $schema = $this->_getKosztorysSchema();
  447. $data = $this->_fetchKosztorysData($idProject);
  448. $memXmlWriter->startElement('kosztorys');
  449. $memXmlWriter->writeAttribute('id', $idProject);
  450. $memXmlWriter->writeAttributeNS('p5', 'typeName', 'https://biuro.biall-net.pl/wfs', 'Kosztorys');
  451. $memXmlWriter->text('book_'.$i);
  452. $memXmlWriter->endElement();
  453. if ($i % 5 == 0) {
  454. $batchXmlString = $memXmlWriter->outputMemory(true);
  455. $xmlWriter->writeRaw($batchXmlString);
  456. }
  457. }
  458. $memXmlWriter->flush();
  459. unset($memXmlWriter);
  460. */
  461. $xmlWriter->endElement();
  462. $xmlWriter->endDocument();
  463. }
  464. }
  465. public function kosztorys($idProject) {
  466. $schema = $this->_getKosztorysSchema();
  467. $data = $this->_fetchKosztorysData($idProject);
  468. ?>
  469. <div class="container">
  470. <h1>Kosztorys wstępnych robót telekomunikacyjnych</h1>
  471. <table class="table">
  472. <tr>
  473. <th><?php echo $schema['nr']; ?></th>
  474. <th><?php echo $schema['title']; ?></th>
  475. <th><?php echo $schema['owner_name']; ?></th>
  476. <th><?php echo $schema['cost_total']; ?></th>
  477. </tr>
  478. <tr>
  479. <td><?php echo $data['nr']; ?></td>
  480. <td><?php echo $data['title']; ?></td>
  481. <td><?php echo $data['owner_name']; ?></td>
  482. <td><?php echo $data['cost_total']; ?></td>
  483. </tr>
  484. </table>
  485. <?php foreach ($schema['sub_costs'] as $layerName => $layerConf) : ?>
  486. <h4><?php echo $layerConf['label']; ?>:</h4>
  487. <table class="table" style="width:auto">
  488. <tr>
  489. <?php foreach ($layerConf['_agr_fields_to_cols'] as $fldName => $label) : ?>
  490. <th><?php echo $label; ?></th>
  491. <?php endforeach; ?>
  492. </tr>
  493. <tr>
  494. <?php foreach ($layerConf['_agr_fields_to_cols'] as $fldName => $label) : ?>
  495. <td><?php echo V::get($fldName, '', $data['sub_costs'][$layerName]); ?></td>
  496. <?php endforeach; ?>
  497. </tr>
  498. </table>
  499. <?php if (!empty($layerConf['sub_costs'])) : ?>
  500. <table class="table" style="width:auto">
  501. <tr>
  502. <?php foreach ($layerConf['sub_costs']['labels'] as $fldName => $label) : ?>
  503. <th><?php echo $label; ?></th>
  504. <?php endforeach; ?>
  505. </tr>
  506. <?php foreach ($data['sub_costs'][$layerName]['sub_costs'] as $subCost) : ?>
  507. <tr>
  508. <?php foreach ($layerConf['sub_costs']['labels'] as $fldName => $label) : ?>
  509. <td><?php echo V::get($fldName, '', $subCost); ?></td>
  510. <?php endforeach; ?>
  511. </tr>
  512. <?php endforeach; ?>
  513. </table>
  514. <?php endif; ?>
  515. <?php endforeach; ?>
  516. </div>
  517. <?php
  518. DBG::_('DBG', '>0', "data", $data, __CLASS__, __FUNCTION__, __LINE__);
  519. DBG::_('DBG', '>0', "schema", $schema, __CLASS__, __FUNCTION__, __LINE__);
  520. }
  521. public function _getKosztorysSchema() {
  522. $schema['nr'] = "Nr projektu";
  523. $schema['title'] = "Tytuł projektu";
  524. $schema['owner_name'] = "Osoba prowadząca";
  525. $schema['cost_total'] = "Szacowany koszt projektu [zł]";
  526. $schema['sub_costs'] = array();
  527. {
  528. $layerConf = array();
  529. $layerConf['label'] = "Wykop";
  530. $layerConf['_agr_fields_to_cols'] = array();
  531. $layerConf['_agr_fields_to_cols']['ilosc'] = "ilość [m]";
  532. $layerConf['_agr_fields_to_cols']['cena'] = "podstawowa cena [zł/m]";
  533. $layerConf['_agr_fields_to_cols']['koszt'] = "koszt [zł]";
  534. $schema['sub_costs']['Rozdzielcza_Wykop_przedmiar_na_mikrorurki'] = $layerConf;
  535. }
  536. {
  537. $layerConf = array();
  538. $layerConf['label'] = "Mikrokanalizacja do klienta";
  539. $layerConf['_agr_fields_to_cols'] = array();
  540. $layerConf['_agr_fields_to_cols']['ilosc'] = "ilość [m]";
  541. $layerConf['_agr_fields_to_cols']['cena'] = "podstawowa cena [zł/m]";
  542. $layerConf['_agr_fields_to_cols']['koszt'] = "koszt [zł]";
  543. $schema['sub_costs']['Rozdzielcza_Mikrokanalizacja_do_klienta'] = $layerConf;
  544. }
  545. {
  546. $layerConf = array();
  547. $layerConf['label'] = "Przeciski";
  548. $layerConf['_agr_fields_to_cols'] = array();
  549. $layerConf['_agr_fields_to_cols']['ilosc'] = "ilość [m]";
  550. $layerConf['_agr_fields_to_cols']['cena'] = "podstawowa cena [zł/m]";
  551. $layerConf['_agr_fields_to_cols']['koszt'] = "koszt [zł]";
  552. $schema['sub_costs']['Rozdzielcza_Przeciski_110mm'] = $layerConf;
  553. }
  554. {
  555. $layerConf = array();
  556. $layerConf['label'] = "Zabruki";
  557. $layerConf['_agr_fields_to_cols'] = array();
  558. $layerConf['_agr_fields_to_cols']['ilosc'] = "ilość [m]";
  559. $layerConf['_agr_fields_to_cols']['cena'] = "podstawowa cena [zł/m]";
  560. $layerConf['_agr_fields_to_cols']['koszt'] = "koszt [zł]";
  561. $schema['sub_costs']['Rozdzielcza_Zabruki'] = $layerConf;
  562. }
  563. {
  564. $layerConf = array();
  565. $layerConf['label'] = "Światłowód";
  566. $layerConf['_agr_fields_to_cols'] = array();
  567. $layerConf['_agr_fields_to_cols']['ilosc'] = "ilość [m]";
  568. $layerConf['_agr_fields_to_cols']['cena'] = "podstawowa cena [zł/m]";
  569. $layerConf['_agr_fields_to_cols']['koszt'] = "koszt [zł]";
  570. {
  571. $layerSubCostsConf = array();
  572. $layerSubCostsConf['group_by_field'] = 'wlokien_j';
  573. $layerSubCostsConf['sql_agr_func'] = array();
  574. $layerSubCostsConf['sql_agr_func']['sum_dlugosc'] = array();//sum(Dlugosc) as sum_dlugosc
  575. $layerSubCostsConf['sql_agr_func']['sum_dlugosc']['func'] = 'sum';
  576. $layerSubCostsConf['sql_agr_func']['sum_dlugosc']['field'] = 'Dlugosc';
  577. $layerSubCostsConf['labels'] = array();
  578. $layerSubCostsConf['labels']['cost_type'] = "rodzaj kosztu";
  579. $layerSubCostsConf['labels']['sum_dlugosc'] = "suma długości";
  580. $layerConf['sub_costs'] = $layerSubCostsConf;
  581. }
  582. $schema['sub_costs']['Rozdzielcza_Kabel_Swiatlowodowy_wsg84'] = $layerConf;
  583. }
  584. {
  585. $layerConf = array();
  586. $layerConf['label'] = "Studnie - TODO (Lokalizacje)";
  587. $layerConf['_agr_fields_to_cols'] = array();
  588. $schema['sub_costs']['__STUDNIE__'] = $layerConf;
  589. }
  590. {
  591. $layerConf = array();
  592. $layerConf['label'] = "Rury osłonowe - TODO";
  593. $layerConf['_agr_fields_to_cols'] = array();
  594. $schema['sub_costs']['Rura_oslonowa_rozdzielcza_magistralna'] = $layerConf;
  595. }
  596. {
  597. $layerConf = array();
  598. $layerConf['label'] = "Pakiet mikrorurek - TODO";
  599. $layerConf['_agr_fields_to_cols'] = array();
  600. $schema['sub_costs']['__PAKIET_MIKRORUREK__'] = $layerConf;
  601. }
  602. {
  603. $layerConf = array();
  604. $layerConf['label'] = "Koszty dodatkowe - TODO";
  605. $layerConf['_agr_fields_to_cols'] = array();
  606. $schema['sub_costs']['__KOSZTY_DODATKOWE__'] = $layerConf;
  607. }
  608. return $schema;
  609. }
  610. public function _fetchKosztorysData($idProject) {
  611. $project = array();
  612. $schema = $this->_getKosztorysSchema();
  613. if(0){// TEST join by ogc
  614. $exampleOgcJoin = <<<OGC_JOIN
  615. <wfs:Query typeNames="p5_default_db:IN7_MK_BAZA_DYSTRYBUCJI p5_default_db:ADMIN_USERS" aliases="p u">
  616. <fes:Filter>
  617. <fes:And>
  618. <fes:PropertyIsEqualTo>
  619. <fes:ValueReference>p/ID</fes:ValueReference>
  620. <fes:Literal>{$idProject}</fes:Literal>
  621. </fes:PropertyIsEqualTo>
  622. <fes:PropertyIsEqualTo>
  623. <fes:ValueReference>u/ADM_ACCOUNT<fes:ValueReference>
  624. <fes:ValueReference>p/L_APPOITMENT_USER</fes:ValueReference>
  625. </fes:PropertyIsEqualTo>
  626. </fes:And>
  627. </fes:Filter>
  628. </wfs:Query>
  629. OGC_JOIN;
  630. }
  631. $pdo = DB::getPDO();
  632. {
  633. $sth = $pdo->prepare("
  634. select p.ID, p.M_DIST_DESC, p.L_APPOITMENT_USER
  635. , p.koszt_wspolny
  636. , p.koszt_na_budynek
  637. , p.koszt_na_mieszkanie
  638. , p.Agr_Rozdzielcza_Wykop_przedmiar_na_mikrorurki_ilosc
  639. , p.Agr_Rozdzielcza_Wykop_przedmiar_na_mikrorurki_cena
  640. , p.Agr_Rozdzielcza_Wykop_przedmiar_na_mikrorurki_koszt
  641. , p.Agr_Rozdzielcza_Mikrokanalizacja_do_klienta_ilosc
  642. , p.Agr_Rozdzielcza_Mikrokanalizacja_do_klienta_cena
  643. , p.Agr_Rozdzielcza_Mikrokanalizacja_do_klienta_koszt
  644. , p.Agr_metrow_mikrorurek_5szt
  645. , p.Agr_metrow_mikrorurek_5szt_cena
  646. , p.Agr_Rozdzielcza_Przeciski_110mm_ilosc
  647. , p.Agr_Rozdzielcza_Przeciski_110mm_cena
  648. , p.Agr_Rozdzielcza_Przeciski_110mm_koszt
  649. , p.Agr_Rozdzielcza_Zabruki_ilosc
  650. , p.Agr_Rozdzielcza_Zabruki_cena
  651. , p.Agr_Rozdzielcza_Zabruki_koszt
  652. , p.Agr_Rozdzielcza_wezly_ilosc
  653. , p.Agr_Rozdzielcza_wezly_cena
  654. , p.Agr_Rozdzielcza_wezly_koszt
  655. , p.Agr_Rozdzielcza_koszty_dodatkowe_wsg84
  656. , p.Agr_Rozdzielcza_rurociag_wsg84_ilosc
  657. , p.Agr_Rozdzielcza_rurociag_wsg84_cena
  658. , p.Agr_Rozdzielcza_rurociag_wsg84_koszt
  659. , p.Agr_Rozdzielcza_Kabel_Swiatlowodowy_wsg84_ilosc
  660. , p.Agr_Rozdzielcza_Kabel_Swiatlowodowy_wsg84_cena
  661. , p.Agr_Rozdzielcza_Kabel_Swiatlowodowy_wsg84_koszt
  662. , p.Agr_USERS2_MARKETING_ilosc
  663. , p.Agr_USERS2_MARKETING_cena
  664. , p.Agr_USERS2_MARKETING_koszt
  665. , p.Agr_BUILDINGS_ilosc
  666. from IN7_MK_BAZA_DYSTRYBUCJI p
  667. where p.ID = :ID_PROJECT
  668. -- TODO: check perms!
  669. ");
  670. $sth->bindValue('ID_PROJECT', $idProject, PDO::PARAM_INT);
  671. $sth->execute();
  672. $projectList = $sth->fetchAll();
  673. if (empty($projectList)) throw new Exception("404 - Project Not Found");
  674. $projectRaw = reset($projectList);
  675. }
  676. {
  677. $project['nr'] = $projectRaw['ID'];
  678. $project['title'] = $projectRaw['M_DIST_DESC'];
  679. $project['owner_name'] = $this->fetchUserName($projectRaw['L_APPOITMENT_USER']);
  680. $project['cost_total'] = $projectRaw['koszt_wspolny'];
  681. foreach ($schema['sub_costs'] as $layerName => $layerConf) {
  682. $values = array();
  683. foreach ($layerConf['_agr_fields_to_cols'] as $fldName => $label) {
  684. $values[$fldName] = V::get("Agr_{$layerName}_{$fldName}", '', $projectRaw);
  685. }
  686. $project['sub_costs'][$layerName] = $values;
  687. if (!empty($layerConf['sub_costs'])) {
  688. $sub_costs = array();
  689. {
  690. $groupByField = $layerConf['sub_costs']['group_by_field'];
  691. $sqlFields = array();
  692. foreach ($layerConf['sub_costs']['sql_agr_func'] as $fldName => $funcConf) {
  693. $sqlFuncName = $funcConf['func'];
  694. $sqlFuncField = $funcConf['field'];
  695. $sqlFields[] = "{$sqlFuncName}(l.{$sqlFuncField}) as {$fldName}";
  696. }
  697. $sqlFields = implode(", ", $sqlFields);
  698. $sth = $pdo->prepare("
  699. select l.{$groupByField} as cost_type
  700. , $sqlFields
  701. from Rozdzielcza_Kabel_Swiatlowodowy_wsg84 l
  702. where l.ID_PROJECT = :ID_PROJECT
  703. group by l.{$groupByField}
  704. ");
  705. $sth->bindValue('ID_PROJECT', $idProject, PDO::PARAM_INT);
  706. $sth->execute();
  707. $sub_costs = $sth->fetchAll();
  708. }
  709. $project['sub_costs'][$layerName]['sub_costs'] = $sub_costs;
  710. }
  711. }
  712. }
  713. $project['_raw'] = $projectRaw;
  714. return $project;
  715. }
  716. public function fetchUserName($userLogin) {
  717. $userName = $userLogin;
  718. // TODO: sql from ADMIN_USERS
  719. return $userName;
  720. }
  721. }