ProjektyKosztyWstepnychRobot.php 29 KB

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