ProjektyKosztyWstepnychRobot.php 70 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. Lib::loadClass('ProjectKosztorysSchema');
  4. Lib::loadClass('ProjectKosztorysModel');
  5. Lib::loadClass('ProjectKosztorysCennik');
  6. Lib::loadClass('UI');
  7. class Route_UrlAction_ProjektyKosztyWstepnychRobot extends RouteBase {// TODO: UrlActionBase @see Route_UrlAction
  8. public $_model = array();
  9. public function handleAuth() {
  10. if (!User::logged()) {
  11. User::authByRequest();
  12. }
  13. }
  14. public function defaultAction() {
  15. // TODO: check if user is allowed to run this action
  16. UI::gora();
  17. if (1 != V::get('_print', '', $_GET)) UI::menu();
  18. try {
  19. $idProject = V::get('ID_PROJECT', 0, $_REQUEST, 'int');
  20. $idCompany = V::get('ID_COMPANY', 0, $_REQUEST, 'int');
  21. if (!$idProject) throw new Exception("Wrong param in 'ID_PROJECT' - expected integer!");
  22. $this->panel($idProject, $idCompany);
  23. $this->kosztorys($idProject, $idCompany);
  24. } catch (Exception $e) {
  25. UI::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage());
  26. }
  27. UI::dol();
  28. }
  29. public function zestawienieSwMikRurAction() {
  30. UI::gora();
  31. if (1 != V::get('_print', '', $_GET)) UI::menu();
  32. try {
  33. $idProject = V::get('ID_PROJECT', 0, $_REQUEST, 'int');
  34. $idCompany = V::get('ID_COMPANY', 0, $_REQUEST, 'int');
  35. if (!$idProject) throw new Exception("Wrong param in 'ID_PROJECT' - expected integer!");
  36. $this->panel($idProject, $idCompany);
  37. $this->zestawienieSwMikRur($idProject, $idCompany);
  38. } catch (Exception $e) {
  39. UI::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage());
  40. }
  41. UI::dol();
  42. }
  43. public function ofertaAdminAction() {
  44. // TODO: check if user is allowed to run this action
  45. UI::gora();
  46. UI::menu();
  47. try {
  48. $idProject = V::get('ID_PROJECT', 0, $_REQUEST, 'int');
  49. $idCompany = V::get('ID_COMPANY', 0, $_REQUEST, 'int');
  50. $admin = true;
  51. $ofertaArgs = compact('idProject', 'idCompany', 'admin');
  52. $this->panel($idProject, $idCompany);
  53. if ($idProject > 0) {
  54. $this->oferta($ofertaArgs);
  55. } else {
  56. $this->defaultOferta();
  57. }
  58. } catch (Exception $e) {
  59. UI::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage());
  60. }
  61. UI::dol();
  62. }
  63. public function ofertaCompanyAction() {
  64. // TODO: check if user is allowed to run this action
  65. UI::gora();
  66. UI::menu();
  67. try {
  68. $idProject = V::get('ID_PROJECT', 0, $_REQUEST, 'int');
  69. $idCompany = V::get('ID_COMPANY', 0, $_REQUEST, 'int');// TODO: $idCompany from ADMIN_USERS
  70. $admin = false;
  71. $companyAdmin = true;
  72. $ofertaArgs = compact('idProject', 'idCompany', 'admin', 'companyAdmin');
  73. $this->panel($idProject, $idCompany);
  74. if ($idProject > 0) {
  75. $this->oferta($ofertaArgs);
  76. } else {
  77. $this->defaultOferta();
  78. }
  79. } catch (Exception $e) {
  80. UI::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage());
  81. }
  82. UI::dol();
  83. }
  84. public function ofertaDefaultAdminAction() {
  85. // TODO: check if user is allowed to run this action
  86. UI::gora();
  87. UI::menu();
  88. try {
  89. $idProject = 0;
  90. $idCompany = V::get('ID_COMPANY', 0, $_REQUEST, 'int');
  91. $this->panel($idProject, $idCompany);
  92. $this->defaultOferta();
  93. } catch (Exception $e) {
  94. UI::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage());
  95. }
  96. UI::dol();
  97. }
  98. public function ofertaAction() {
  99. // TODO: check if user is allowed to run this action
  100. UI::gora();
  101. UI::menu();
  102. try {
  103. $idProject = V::get('ID_PROJECT', 0, $_REQUEST, 'int');
  104. $idCompany = V::get('ID_COMPANY', 0, $_REQUEST, 'int');
  105. $admin = false;
  106. if (!$idProject) throw new Exception("Wrong param in 'ID_PROJECT' - expected integer!");// TODO: show select box if not defined
  107. $ofertaArgs = compact('idProject', 'idCompany', 'admin');
  108. $this->panel($idProject, $idCompany);
  109. $this->oferta($ofertaArgs);
  110. } catch (Exception $e) {
  111. UI::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage());
  112. }
  113. UI::dol();
  114. }
  115. public function getArgsList() {// TODO: override UrlActionBase::getArgsList action
  116. $args = array();
  117. $args[] = 'ID_PROJECT';
  118. return $args;
  119. }
  120. public function reinstallAction() {// TODO: mv to UrlActionBase
  121. $jsonData = new stdClass();
  122. $jsonData->type = 'success';
  123. $jsonData->msg = 'Gotowe';
  124. try {
  125. $this->reinstall();
  126. } catch (Exception $e) {
  127. $jsonData->type = 'danger';
  128. $jsonData->msg = $e->getMessage();
  129. }
  130. echo json_encode($jsonData);
  131. }
  132. public function reinstall() {// TODO: mv struct check to UrlActionBase
  133. $pdo = DB::getPDO();
  134. {
  135. $dropGDistanceFuncion = "DROP FUNCTION IF EXISTS `GDistance`";
  136. $pdo->exec($dropGDistanceFuncion);
  137. // Test for GDistance:
  138. // select '' as test, GDistance('') as GDistance, IF(GDistance('') = 0, 1, 0) as test_ok;
  139. // select 'NULL' as test, GDistance(NULL) as GDistance, IF(GDistance(NULL) = 0, 1, 0) as test_ok;
  140. // 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;
  141. // 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;
  142. // 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;
  143. $gDistanceFuncion = <<<SQL_FUN
  144. CREATE DEFINER=`root`@`localhost` FUNCTION `GDistance`(`LS` LINESTRING) RETURNS double NO SQL
  145. BEGIN
  146. DECLARE LON_A, LAT_A, LON_B, LAT_B, R, RESULT DOUBLE;
  147. DECLARE A, B POINT;
  148. DECLARE I, N INT;
  149. -- if LS is not geometry type then return 0
  150. -- if GeometryType is not 'LINESTRING' then return 1
  151. -- if GeometryType is 'LINESTRING' then return length
  152. IF LS is null or GeometryType(LS) is null THEN
  153. RETURN 0;
  154. END IF;
  155. IF 'LINESTRING' != GeometryType(LS) THEN
  156. RETURN 1;
  157. END IF;
  158. SET R = 6372795.477598;
  159. SET N = NUMPOINTS(LS);
  160. IF N is null or N = 1 THEN
  161. RETURN 1;
  162. END IF;
  163. SET RESULT = 0;
  164. SET I = 1;
  165. WHILE I < N DO
  166. SET A = POINTN(LS, I);
  167. SET B = POINTN(LS, I + 1);
  168. SET LON_A = RADIANS(X(A));
  169. SET LAT_A = RADIANS(Y(A));
  170. SET LON_B = RADIANS(X(B));
  171. SET LAT_B = RADIANS(Y(B));
  172. SET RESULT = RESULT + ACOS(SIN(LAT_A) * SIN(LAT_B) + COS(LAT_A) * COS(LAT_B) * COS(LON_A - LON_B));
  173. SET I = I + 1;
  174. END WHILE;
  175. SET RESULT = RESULT * R;
  176. RETURN RESULT;
  177. END
  178. SQL_FUN;
  179. $pdo->exec($gDistanceFuncion);
  180. }
  181. /* required Zasoby tree structure - XML (parent rel in PARENT_ID field):
  182. <zasob:tree>
  183. <zasob:TYPESPECIALS>
  184. <zasob:URL_ACTION zasob:key=":action_id" zasob:desc=":url_action_name">
  185. <zasob:PARAM_IN zasob:key=":action_param_1_id" zasob:desc=":url_action_param_1_name"/>
  186. </zasob:URL_ACTION>
  187. </zasob:TYPESPECIALS>
  188. <zasob:BAZA_DANYCH zasob:key=":main_db_id" altername_types="DATABASE_MYSQL,DATABASE_POSTGRESQL">
  189. <zasob:TABELA zasob:key=":tbl_id" zasob:desc="IN7_MK_BAZA_DYSTRYBUCJI">
  190. <zasob:KOMORKA zasob:key=":cell_id" zasob:desc="ID"/>
  191. <zasob:URL_ACTION zasob:key=":link_action_id" zasob:desc=":url_action_name" zasob:alias_id=":action_id">
  192. <zasob:PARAM_IN zasob:key=":cell_id" zasob:desc="ID_PROJECT" zasob:alias_id=":cell_id"/>
  193. </zasob:URL_ACTION>
  194. </zasob:TABELA>
  195. </zasob:BAZA_DANYCH>
  196. </zasob:tree>
  197. */
  198. /* required Zasoby tree structure:
  199. - required base structure
  200. [:ts_main_id] TYPESPECIALS
  201. [:action_id] URL_ACTION :url_action_name
  202. [:action_param_1_id] PARAM_IN :url_action_param_1_name
  203. - current function from schema
  204. [:main_db_id] (DATABASE_MYSQL, BAZA_DANYCH, DATABASE_POSTGRESQL)
  205. [:tbl_id] TABELA 'IN7_MK_BAZA_DYSTRYBUCJI'
  206. [:cell_id] KOMORKA 'ID'
  207. [:link_action_id] (ALIAS DO :action_id) URL_ACTION :url_action_name
  208. [:link_param_id] (ALIAS DO :cell_id) PARAM_IN :url_action_param_1_name
  209. :url_action_name = 'ProjektyKosztyWstepnychRobot'
  210. :url_action_param_1_name = 'ID_PROJECT'
  211. */
  212. $flatConfig_main = array();
  213. {
  214. $flatConfig_main[] = (object)array(// Zasob::assert(TYPESPECIALS)
  215. 'query' => "
  216. select z.ID from CRM_LISTA_ZASOBOW z
  217. where z.TYPE='TYPESPECIALS'
  218. and z.A_STATUS not in('DELETED')
  219. ",
  220. 'createTable' => 'CRM_LISTA_ZASOBOW',
  221. 'createArgs' => array('TYPE' => 'TYPESPECIALS', 'DESC' => 'Typespecials'),
  222. 'out' => array(':ts_main_id' => 'ID')
  223. );
  224. $flatConfig_main[] = (object)array(// Zasob::assert(TYPESPECIALS/:url_action_name)
  225. 'query' => "
  226. select z.ID from CRM_LISTA_ZASOBOW z
  227. where z.PARENT_ID = :ts_main_id
  228. and z.TYPE = 'URL_ACTION'
  229. and z.DESC = :url_action_name
  230. and z.A_STATUS not in('DELETED')
  231. ",
  232. 'createTable' => 'CRM_LISTA_ZASOBOW',
  233. 'createArgs' => array('TYPE' => 'URL_ACTION', 'PARENT_ID' => ':ts_main_id', 'DESC' => ':url_action_name'),
  234. 'in' => array(':ts_main_id', ':url_action_name'),
  235. 'out' => array(':action_id' => 'ID')
  236. );
  237. $flatConfig_main[] = (object)array(// Zasob::assert(TYPESPECIALS/:url_action_name/:url_action_param_1_name)
  238. 'query' => "
  239. select z.ID from CRM_LISTA_ZASOBOW z
  240. where z.PARENT_ID = :action_id
  241. and z.TYPE = 'PARAM_IN'
  242. and z.DESC = :url_action_param_1_name
  243. and z.A_STATUS not in('DELETED')
  244. ",
  245. 'createTable' => 'CRM_LISTA_ZASOBOW',
  246. 'createArgs' => array('TYPE' => 'PARAM_IN', 'PARENT_ID' => ':action_id', 'DESC' => ':url_action_param_1_name'),
  247. 'in' => array(':action_id', ':url_action_param_1_name'),
  248. 'out' => array(':action_param_1_id' => 'ID')
  249. );
  250. }
  251. //DBG::_('DBG', '>1', "flatConfig_main", $flatConfig_main, __CLASS__, __FUNCTION__, __LINE__);
  252. $flatConfig_link_in_projekt = array();
  253. {
  254. $flatConfig_link_in_projekt[] = (object)array(// Zasob::assert(default_db)
  255. 'query' => "
  256. select z.ID from CRM_LISTA_ZASOBOW z
  257. where z.ID = :main_db_id
  258. and z.TYPE in('DATABASE_MYSQL', 'BAZA_DANYCH', 'DATABASE_POSTGRESQL')
  259. and z.A_STATUS not in('DELETED')
  260. ",
  261. 'createTable' => 'CRM_LISTA_ZASOBOW',
  262. 'createArgs' => array('TYPE' => 'BAZA_DANYCH', 'DESC' => 'Baza danych'),
  263. 'in' => array(':main_db_id'),
  264. 'out' => array(':main_db_id' => 'ID')
  265. );
  266. $flatConfig_link_in_projekt[] = (object)array(// Zasob::assert(default_db/IN7_MK_BAZA_DYSTRYBUCJI)
  267. 'query' => "
  268. select z.ID from CRM_LISTA_ZASOBOW z
  269. where z.PARENT_ID = :main_db_id
  270. and z.TYPE = 'TABELA'
  271. and z.DESC = 'IN7_MK_BAZA_DYSTRYBUCJI'
  272. and z.A_STATUS not in('DELETED')
  273. ",
  274. 'createTable' => 'CRM_LISTA_ZASOBOW',
  275. 'createArgs' => array('TYPE' => 'TABELA', 'PARENT_ID' => ':main_db_id', 'DESC' => 'IN7_MK_BAZA_DYSTRYBUCJI'),
  276. 'in' => array(':main_db_id'),
  277. 'out' => array(':tbl_id' => 'ID')
  278. );
  279. $flatConfig_link_in_projekt[] = (object)array(// Zasob::assert(default_db/IN7_MK_BAZA_DYSTRYBUCJI/ID)
  280. 'query' => "
  281. select z.ID from CRM_LISTA_ZASOBOW z
  282. where z.PARENT_ID = :tbl_id
  283. and z.TYPE = 'KOMORKA'
  284. and z.DESC = 'ID'
  285. and z.A_STATUS not in('DELETED')
  286. ",
  287. 'createTable' => 'CRM_LISTA_ZASOBOW',
  288. 'createArgs' => array('TYPE' => 'KOMORKA', 'PARENT_ID' => ':tbl_id', 'DESC' => 'ID'),
  289. 'in' => array(':tbl_id'),
  290. 'out' => array(':cell_id' => 'ID')
  291. );
  292. $flatConfig_link_in_projekt[] = (object)array(// Zasob::assert(default_db/IN7_MK_BAZA_DYSTRYBUCJI/:url_action_name)
  293. 'query' => "
  294. select z.ID from CRM_LISTA_ZASOBOW z
  295. where z.PARENT_ID = :tbl_id
  296. and z.ALIAS_ID = ':action_id'
  297. and z.TYPE = 'URL_ACTION'
  298. and z.DESC = ':url_action_name'
  299. and z.A_STATUS not in('DELETED')
  300. ",
  301. 'createTable' => 'CRM_LISTA_ZASOBOW',
  302. 'createArgs' => array('TYPE' => 'URL_ACTION', 'PARENT_ID' => ':tbl_id', 'ALIAS_ID' => ':action_id', 'DESC' => ':url_action_name'),
  303. 'in' => array(':tbl_id', ':action_id', ':url_action_name'),
  304. 'out' => array(':link_action_id' => 'ID')
  305. );
  306. // [:link_param_id] (ALIAS DO :cell_id) PARAM_IN :url_action_param_1_name
  307. $flatConfig_link_in_projekt[] = (object)array(// Zasob::assert(default_db/IN7_MK_BAZA_DYSTRYBUCJI/:url_action_name/:url_action_param_1_name)
  308. 'query' => "
  309. select z.ID from CRM_LISTA_ZASOBOW z
  310. where z.PARENT_ID = :link_action_id
  311. and z.ALIAS_ID = ':cell_id'
  312. and z.TYPE = 'PARAM_IN'
  313. and z.DESC = ':url_action_param_1_name'
  314. and z.A_STATUS not in('DELETED')
  315. ",
  316. 'createTable' => 'CRM_LISTA_ZASOBOW',
  317. 'createArgs' => array('TYPE' => 'PARAM_IN', 'PARENT_ID' => ':link_action_id', 'ALIAS_ID' => ':cell_id', 'DESC' => ':url_action_param_1_name'),
  318. 'in' => array(':cell_id', ':link_action_id', ':url_action_param_1_name'),
  319. 'out' => array(':link_action_id' => 'ID')
  320. );
  321. }
  322. //DBG::_('DBG', '>1', "flatConfig_link_in_projekt", $flatConfig_link_in_projekt, __CLASS__, __FUNCTION__, __LINE__);
  323. $flatConf = array_merge($flatConfig_main, $flatConfig_link_in_projekt);
  324. $knownArgs = array();
  325. $knownArgs[':url_action_name'] = 'Test';
  326. $knownArgs[':url_action_param_1_name'] = 'ID_PROJECT';
  327. $knownArgs[':main_db_id'] = '36';// from DB::getDB()->getZasobId(); or DB::getPDO()->getZasobId();
  328. $this->_debugFlatConfig($flatConf, $knownArgs);
  329. $args = $this->getArgsList();
  330. $clsName = __CLASS__;
  331. $urlActionName = str_replace('Route_UrlAction_', '', $clsName);
  332. DBG::_('DBG', '>1', "reinstall class", __CLASS__, __CLASS__, __FUNCTION__, __LINE__);
  333. DBG::_('DBG', '>1', "reinstall funName", $urlActionName, __CLASS__, __FUNCTION__, __LINE__);
  334. DBG::_('DBG', '>1', "reinstall test", $args, __CLASS__, __FUNCTION__, __LINE__);
  335. $dbFunction = $this->fetchZasobInfo();
  336. $usrLogin = User::getLogin();
  337. {// check if URL_ACTION already exists
  338. if (!$dbFunction) throw new Exception("Brak id zasobu typu TYPESPECIALS - TODO: CREATE");// $this->createZasobTypespecials();
  339. DBG::_('DBG', '>1', "dbFunction", $dbFunction, __CLASS__, __FUNCTION__, __LINE__);
  340. if ($dbFunction['action_id_is_null']) {
  341. $sth = $pdo->prepare("
  342. insert into CRM_LISTA_ZASOBOW (
  343. TYPE,
  344. PARENT_ID,
  345. `DESC`,
  346. A_RECORD_CREATE_AUTHOR,
  347. A_RECORD_CREATE_DATE
  348. )
  349. values (
  350. 'URL_ACTION',
  351. :ts_id,
  352. :url_action_name,
  353. 'system-by-{$usrLogin}',
  354. NOW()
  355. )
  356. ");
  357. //$sth->bindValue('ts_id', $dbFunction['ts_id'], PDO::PARAM_INT);
  358. //$sth->bindValue('url_action_name', $urlActionName, PDO::PARAM_STR);
  359. $bindValues = array();
  360. $bindValues['ts_id'] = array($dbFunction['ts_id'], PDO::PARAM_INT);
  361. $bindValues['url_action_name'] = $urlActionName;
  362. $pdo->bindValues($sth, $bindValues);
  363. DBG::_('DBG', '>1', "sql", $pdo->getRawSql($sth), __CLASS__, __FUNCTION__, __LINE__);
  364. $sth->execute();
  365. $dbFunction = $this->fetchZasobInfo();
  366. if (!$dbFunction || $dbFunction['action_id_is_null']) throw new Exception("Brak zasobu typu URL_ACTION, nie udało się go utworzyć!");
  367. }
  368. }
  369. {// check params
  370. if (!empty($args)) {
  371. $todoArgs = array();
  372. foreach ($args as $argName) {
  373. if (empty($dbFunction['url_params'])) {
  374. $todoArgs[$argName] = true;
  375. } else if (!array_key_exists($argName, $dbFunction['url_params'])) {
  376. $todoArgs[$argName] = true;
  377. }
  378. // OK PARAM_IN exists
  379. }
  380. $todoArgs = array_keys($todoArgs);
  381. DBG::_('DBG', '>1', "todoArgs", $todoArgs, __CLASS__, __FUNCTION__, __LINE__);
  382. if (!empty($todoArgs)) {
  383. $sqlValues = array();
  384. foreach ($todoArgs as $argName) {
  385. $sqlValues[] = "(
  386. 'PARAM_IN',
  387. {$dbFunction['action_id']},
  388. '{$argName}',
  389. 'system-by-{$usrLogin}',
  390. NOW()
  391. )
  392. ";
  393. }
  394. $sqlValues = implode(", ", $sqlValues);
  395. $sth = $pdo->prepare("
  396. insert into CRM_LISTA_ZASOBOW (
  397. TYPE,
  398. PARENT_ID,
  399. `DESC`,
  400. A_RECORD_CREATE_AUTHOR,
  401. A_RECORD_CREATE_DATE
  402. )
  403. values {$sqlValues}
  404. ");
  405. DBG::_('DBG', '>1', "sql", $pdo->getRawSql($sth), __CLASS__, __FUNCTION__, __LINE__);
  406. //$sth->execute();
  407. $dbFunction = $this->fetchZasobInfo();
  408. }
  409. if (empty($dbFunction['url_params'])) {
  410. throw new Exception("Brak zdefiniowanych parametrów, nie udało się ich utworzyć!");
  411. }
  412. }
  413. }
  414. {// check links in tables
  415. // $info['links']['IN7_MK_BAZA_DYSTRYBUCJI'] = $linkInfo;
  416. if (empty($dbFunction['links']['IN7_MK_BAZA_DYSTRYBUCJI'])) throw new Exception("Brak poprawne wprowadzonej tabeli 'IN7_MK_BAZA_DYSTRYBUCJI' w drzewie zasobów!");
  417. $projInfo = $dbFunction['links']['IN7_MK_BAZA_DYSTRYBUCJI'];
  418. /*
  419. [link_action_id] =>
  420. [db_id] => 36
  421. [tbl_id] => 636
  422. [cell_id] => 763
  423. [param1_id] =>
  424. */
  425. if (!$projInfo['link_action_id']) {
  426. $sth = $pdo->prepare("
  427. insert into CRM_LISTA_ZASOBOW (
  428. TYPE,
  429. PARENT_ID,
  430. ALIAS_ID,
  431. `DESC`,
  432. A_RECORD_CREATE_AUTHOR,
  433. A_RECORD_CREATE_DATE
  434. )
  435. values (
  436. 'URL_ACTION',
  437. {$projInfo['tbl_id']},
  438. {$dbFunction['action_id']},
  439. '{$urlActionName}',
  440. 'system-by-{$usrLogin}',
  441. NOW()
  442. )
  443. ");
  444. //DBG::_('DBG', '>1', "sql", $pdo->getRawSql($sth), __CLASS__, __FUNCTION__, __LINE__);
  445. $sth->execute();
  446. $dbFunction = $this->fetchZasobInfo();
  447. $projInfo = $dbFunction['links']['IN7_MK_BAZA_DYSTRYBUCJI'];
  448. if (!$projInfo['link_action_id']) throw new Exception("Brak zainstalowanej akcji dla tabeli 'IN7_MK_BAZA_DYSTRYBUCJI' - nie udało się zainstalować");
  449. }
  450. if (!$projInfo['param1_id']) {// TODO: get from params
  451. $sth = $pdo->prepare("
  452. insert into CRM_LISTA_ZASOBOW (
  453. TYPE,
  454. PARENT_ID,
  455. ALIAS_ID,
  456. `DESC`,
  457. A_RECORD_CREATE_AUTHOR,
  458. A_RECORD_CREATE_DATE
  459. )
  460. values (
  461. 'PARAM_IN',
  462. {$projInfo['link_action_id']},
  463. {$projInfo['cell_id']},
  464. 'ID_PROJECT',
  465. 'system-by-{$usrLogin}',
  466. NOW()
  467. )
  468. ");
  469. $sth->execute();
  470. $dbFunction = $this->fetchZasobInfo();
  471. $projInfo = $dbFunction['links']['IN7_MK_BAZA_DYSTRYBUCJI'];
  472. if (!$projInfo['param1_id']) throw new Exception("Brak zainstalowanego parametru 1 w akcji dla tabeli 'IN7_MK_BAZA_DYSTRYBUCJI' - nie udało się zainstalować");
  473. }
  474. }
  475. }
  476. public function _debugFlatConfig($flatConfig, $args = array()) {
  477. //DBG::_('DBG', '>1', "flatConfig", $flatConfig, __CLASS__, __FUNCTION__, __LINE__);
  478. echo '<pre style="border:1px solid green">';
  479. foreach ($flatConfig as $conf) {
  480. /*
  481. [query] => string
  482. [createTable] => srting - eg. CRM_LISTA_ZASOBOW
  483. [createArgs] => array - eg. [ TYPE: 'TYPESPECIALS', DESC: 'Typespecials' ]
  484. [in] => array - eg. [ ':ts_main_id', ':url_action_name' ]
  485. [out] => array - eg. [ ':ts_main_id': 'ID' ]
  486. */
  487. echo "Zasob::assert({$conf->createTable}): " . json_encode($conf->createArgs) . " returns: " . json_encode($conf->out) . "\n";
  488. }
  489. echo '</pre>';
  490. echo '<pre style="border:1px solid green">';
  491. echo "DBG: Simulate iter loop:\n";
  492. $simulateGeneratedId = 1000;
  493. $i = 0; $limit = 10; $todoIdx = array(); $knownArgsMap = array();
  494. foreach ($flatConfig as $idx => $conf) $todoIdx[] = $idx;
  495. foreach ($args as $arg => $val) $knownArgsMap[$arg] = $val;
  496. for ($i = 0; $i < $limit; $i++) {
  497. echo ">> DBG loop({$i}):\n";
  498. $isExecuted = false;
  499. foreach ($todoIdx as $idx) {
  500. $conf = $flatConfig[$idx];
  501. /*
  502. [query] => string
  503. [createTable] => srting - eg. CRM_LISTA_ZASOBOW
  504. [createArgs] => array - eg. [ TYPE: 'TYPESPECIALS', DESC: 'Typespecials' ]
  505. [in] => array - eg. [ ':ts_main_id', ':url_action_name' ]
  506. [out] => array - eg. [ ':ts_main_id': 'ID' ]
  507. */
  508. echo ">>>> Loop({$i}): idx({$idx}) Zasob::assert({$conf->createTable}): " . json_encode($conf->createArgs) . " returns: " . json_encode($conf->out) . "\n";
  509. $canExecute = true;
  510. if (!empty($conf->in)) foreach ($conf->in as $argName) {
  511. if (!array_key_exists($argName, $knownArgsMap)) {
  512. $canExecute = false;
  513. }
  514. }
  515. if ($canExecute) {
  516. // TODO: execute - $r = $this->_assertZasobConf($conf, $knownArgsMap);
  517. // fetch params out to $knownArgsMap
  518. foreach ($conf->out as $argName => $outFieldName) {
  519. $knownArgsMap[$argName] = $simulateGeneratedId++;// TODO: fetch from returned object ($r->{$outFieldName})
  520. }
  521. $todoIdx = array_diff($todoIdx, array($idx));// remove $idx from $todoIdx
  522. echo ">>>> Loop({$i}): knownArgsMap: " . json_encode($knownArgsMap) . " \n";
  523. $isExecuted = true;
  524. } else {
  525. echo ">>>> Loop({$i}): cannot execute conf [{$idx}] missing args: " . json_encode($conf->in) . " \n";
  526. }
  527. }
  528. if (!$isExecuted) {
  529. echo "DBG: Stop";
  530. if (empty($todoIdx)) {
  531. echo " - OK";
  532. } else {
  533. echo " - Error - TODO:\n";
  534. foreach ($todoIdx as $idx) {
  535. $conf = $flatConfig[$idx];
  536. echo "Zasob::assert({$conf->createTable}): " . json_encode($conf->createArgs) . " returns: " . json_encode($conf->out) . "\n";
  537. }
  538. }
  539. break;
  540. }
  541. }
  542. echo '</pre>';
  543. }
  544. public function fetchZasobInfo() {
  545. $pdo = DB::getPDO();
  546. $args = $this->getArgsList();
  547. $clsName = __CLASS__;
  548. $urlActionName = str_replace('Route_UrlAction_', '', $clsName);
  549. $sth = $pdo->prepare("
  550. select zp.ID as ts_id
  551. , IF(z.ID is null, 1, 0) as action_id_is_null
  552. , z.ID as action_id
  553. , z.DESC as action_desc
  554. from CRM_LISTA_ZASOBOW zp
  555. left join CRM_LISTA_ZASOBOW z on(z.PARENT_ID = zp.ID
  556. and z.TYPE = 'URL_ACTION'
  557. and z.DESC = :url_action_name
  558. and z.A_STATUS not in('DELETED')
  559. )
  560. where zp.TYPE = 'TYPESPECIALS'
  561. and zp.A_STATUS not in('DELETED')
  562. ");
  563. $sth->bindValue('url_action_name', $urlActionName);
  564. $sth->execute();
  565. $info = $sth->fetch();
  566. if (!$info) return $info;
  567. $info['url_params'] = array();
  568. $info['links'] = array();// where action is installed - expected `IN7_MK_BAZA_DYSTRYBUCJI`
  569. if ($info['action_id'] > 0) {
  570. $sthParams = $pdo->prepare("
  571. select z.ID as param_id
  572. , z.DESC as param_desc
  573. from CRM_LISTA_ZASOBOW z
  574. where z.TYPE = 'PARAM_IN'
  575. and z.A_STATUS not in('DELETED')
  576. and z.PARENT_ID = :url_action_id
  577. ");
  578. $sthParams->bindValue('url_action_id', $info['action_id']);
  579. $sthParams->execute();
  580. $urlParams = array();
  581. $rawUrlParams = $sthParams->fetchAll();
  582. foreach ($rawUrlParams as $urlParam) {
  583. $urlParams[$urlParam['param_desc']] = $urlParam;
  584. }
  585. $info['url_params'] = $urlParams;
  586. }
  587. {
  588. $main_db_id = $pdo->getZasobId();
  589. $sth_dbInfo = $pdo->prepare("
  590. select za.id as link_action_id
  591. , zd.id as db_id
  592. , zt.id as tbl_id
  593. , zi.id as cell_id
  594. , zp1.id as param1_id -- for every param
  595. from CRM_LISTA_ZASOBOW zt
  596. join CRM_LISTA_ZASOBOW zd on(zd.ID = zt.PARENT_ID
  597. and zd.TYPE in('DATABASE_MYSQL', 'BAZA_DANYCH', 'DATABASE_POSTGRESQL')
  598. and zd.ID = {$main_db_id}
  599. )
  600. join CRM_LISTA_ZASOBOW zi on(zi.PARENT_ID = zt.ID
  601. and zi.TYPE = 'KOMORKA'
  602. and zi.DESC = 'ID'
  603. )
  604. left join CRM_LISTA_ZASOBOW za on(za.PARENT_ID = zt.ID
  605. and za.TYPE = 'URL_ACTION'
  606. and za.ALIAS_ID = {$info['action_id']}
  607. )
  608. -- TODO: for every param:
  609. left join CRM_LISTA_ZASOBOW zp1 on(zp1.PARENT_ID = za.ID
  610. and zp1.TYPE = 'PARAM_IN'
  611. and zp1.ALIAS_ID = zi.id
  612. and zp1.DESC = 'ID_PROJECT'
  613. )
  614. where zt.TYPE = 'TABELA'
  615. and zt.A_STATUS not in('DELETED')
  616. and zt.DESC = 'IN7_MK_BAZA_DYSTRYBUCJI'
  617. ");
  618. DBG::_('DBG', '>1', "dbInfo query", $pdo->getRawSql($sth_dbInfo), __CLASS__, __FUNCTION__, __LINE__);
  619. $sth_dbInfo->execute();
  620. $linkInfo = $sth_dbInfo->fetch();
  621. if ($linkInfo) {
  622. $info['links']['IN7_MK_BAZA_DYSTRYBUCJI'] = $linkInfo;
  623. }
  624. }
  625. return $info;
  626. }
  627. public function kosztorysXmlAction() {// TODO: using old schema fields Agr_*
  628. /*
  629. $idProject = 1921;
  630. $schema = ProjectKosztorysSchema::getSchema();
  631. $data = $this->_fetchKosztorysData($idProject);
  632. //DBG::_('DBG', '>1', "XMLWriter", class_exists('XMLWriter'), __CLASS__, __FUNCTION__, __LINE__);
  633. //header('Content-type: application/xml; charset=utf-8');
  634. header('Content-type: text/plain; charset=utf-8');
  635. $xmlWriter = new XMLWriter();
  636. $xmlWriter->openUri('php://output');
  637. $xmlWriter->setIndent(true);
  638. if ($xmlWriter) {
  639. $xmlWriter->startDocument('1.0','UTF-8');
  640. //$xmlWriter->startElementNS(null, 'kosztorysy', 'https://biuro.biall-net.pl/wfs');// adds @xmlns=...
  641. $xmlWriter->startElement('kosztorysy');
  642. $xmlWriter->writeAttribute('targetNamespace', 'https://biuro.biall-net.pl/wfs');
  643. $xmlWriter->writeAttributeNS('xmlns', 'p5', 'http://www.w3.org/2000/xmlns/', 'https://biuro.biall-net.pl/wfs');
  644. for ($i = 1; $i <= 10; $i++) {
  645. $idProject += 1;
  646. $schema = ProjectKosztorysSchema::getSchema();
  647. $data = $this->_fetchKosztorysData($idProject);
  648. $xmlWriter->startElement('kosztorys');
  649. $xmlWriter->startElement('projekt');
  650. $xmlWriter->writeAttribute('id', $idProject);
  651. $xmlWriter->startElement('projekt');
  652. $xmlWriter->text("TODO L." . __LINE__);
  653. $xmlWriter->endElement();
  654. $xmlWriter->endElement();
  655. $xmlWriter->endElement();
  656. }
  657. // $memXmlWriter = new XMLWriter();
  658. // $memXmlWriter->openMemory();
  659. // $memXmlWriter->setIndent(true);
  660. //
  661. // for ($i = 1; $i <= 10; $i++) {
  662. // $idProject += 1;
  663. // $schema = ProjectKosztorysSchema::getSchema();
  664. // $data = $this->_fetchKosztorysData($idProject);
  665. //
  666. // $memXmlWriter->startElement('kosztorys');
  667. // $memXmlWriter->writeAttribute('id', $idProject);
  668. // $memXmlWriter->writeAttributeNS('p5', 'typeName', 'https://biuro.biall-net.pl/wfs', 'Kosztorys');
  669. // $memXmlWriter->text('book_'.$i);
  670. // $memXmlWriter->endElement();
  671. //
  672. // if ($i % 5 == 0) {
  673. // $batchXmlString = $memXmlWriter->outputMemory(true);
  674. // $xmlWriter->writeRaw($batchXmlString);
  675. // }
  676. // }
  677. // $memXmlWriter->flush();
  678. // unset($memXmlWriter);
  679. $xmlWriter->endElement();
  680. $xmlWriter->endDocument();
  681. }
  682. */
  683. }
  684. public function panel($idProject, $idCompany = 0) {
  685. if (User::get('ADM_ADMIN_LEVEL') > 6 || 'Pracownik' != User::getType()) return;// Only for workers with admin level < 6
  686. if (1 == V::get('_print', '', $_GET)) return;// print mode
  687. $task = V::get('_task', '', $_GET);
  688. ?>
  689. <div class="jumbotron">
  690. <div class="container">
  691. <div class="row">
  692. <div class="col-md-12">
  693. <?php if ($idProject > 0) : ?>
  694. <a class="btn btn-default" href="index.php?_route=UrlAction_ProjektyKosztyWstepnychRobot&ID_PROJECT=<?php echo $idProject; ?>">Kosztorys</a>
  695. <a class="btn btn-default" href="index.php?_route=UrlAction_ProjektyKosztyWstepnychRobot&ID_PROJECT=<?php echo $idProject; ?>&_task=zestawienieSwMikRur&_print=1" target="_blank">zestawienie (światłowód i mikrorurki)</a>
  696. <a class="btn btn-default" href="index.php?_route=UrlAction_ProjektyKosztyWstepnychRobot&ID_PROJECT=<?php echo $idProject; ?>&_task=oferta">oferta</a>
  697. <a class="btn btn-default" href="index.php?_route=UrlAction_ProjektyKosztyWstepnychRobot&ID_PROJECT=<?php echo $idProject; ?>&_task=ofertaAdmin">oferta (Admin)</a>
  698. <a class="btn btn-default" href="index.php?_route=UrlAction_ProjektyKosztyWstepnychRobot&ID_PROJECT=<?php echo $idProject; ?>&_task=ofertaCompany">oferta company</a>
  699. <?php endif; ?>
  700. <a class="btn btn-default" href="index.php?_route=UrlAction_ProjektyKosztyWstepnychRobot&_task=ofertaDefaultAdmin" target="_blank">oferta domyślna (Admin)</a>
  701. </div>
  702. </div>
  703. <div class="row">
  704. <div class="col-md-12">
  705. <?php
  706. switch ($task) {
  707. case 'oferta': break;
  708. case '': ?><a class="btn btn-link" href="index.php?_route=UrlAction_ProjektyKosztyWstepnychRobot&ID_PROJECT=<?php echo $idProject; ?>&_print=1" target="_blank"><i class="glyphicon glyphicon-print"></i> Wydruk Kosztorysu</a><?php break;
  709. }
  710. ?>
  711. </div>
  712. </div>
  713. <br>
  714. <?php if ('ofertaAdmin' == $task) : ?>
  715. <form action="" method="get" class="form-inline">
  716. <input type="hidden" name="_route" value="UrlAction_ProjektyKosztyWstepnychRobot">
  717. <input type="hidden" name="_task" value="ofertaAdmin">
  718. <label for="ID_PROJECT">Nr projektu:</label>
  719. <input type="text" name="ID_PROJECT" value="<?php echo $idProject; ?>" class="form-control">
  720. <label for="ID_COMPANY">Nr kontrahenta (0 = oferta wewnętrzna/kosztorys)</label>
  721. <input type="text" name="ID_COMPANY" value="<?php echo $idCompany; ?>" class="form-control">
  722. <input type="submit" value="Wybierz" class="btn btn-primary">
  723. </form>
  724. <?php elseif ('oferta' == $task || 'ofertaDefaultAdmin' == $task) : ?>
  725. <form action="" method="get" class="form-inline">
  726. <input type="hidden" name="_route" value="UrlAction_ProjektyKosztyWstepnychRobot">
  727. <input type="hidden" name="_task" value="oferta">
  728. <input type="hidden" name="ID_PROJECT" value="<?php echo $idProject; ?>">
  729. <label for="ID_COMPANY">Nr kontrahenta</label>
  730. <input type="text" name="ID_COMPANY" value="<?php echo $idCompany; ?>" class="form-control">
  731. <input type="submit" value="Wybierz" class="btn btn-primary">
  732. </form>
  733. <?php endif; ?>
  734. </div>
  735. </div>
  736. <?php
  737. }
  738. public function saveOffer($idProject, $idCompany, $args, $admin = false) {
  739. DBG::_('DBG', '>1', "args", $args, __CLASS__, __FUNCTION__, __LINE__);
  740. if (!$admin) return;
  741. $cennik = ProjectKosztorysCennik::getCennik($idProject, $idCompany);
  742. DBG::_('DBG', '>1', "cennik", $cennik, __CLASS__, __FUNCTION__, __LINE__);
  743. $pdo = DB::getPDO();
  744. {
  745. $add_id_zasob = 0;
  746. $add_unit = '';
  747. $add_price = 0;
  748. $add_quantity = 0;
  749. $add__sth = $pdo->prepare("
  750. insert into CRM_LISTA_ZASOBOW_OFFERS (
  751. CRM_LISTA_ZASOBOW_ID
  752. , COMPANIES_ID
  753. , ID_PROJECT
  754. , OFFER_PRICE_PER_RESOURCE_UNIT
  755. , RESOURCE_UNIT_TYPE
  756. , OFFER_UNIT_TYPE
  757. , REQUIRED_RESOURCE_UNITS
  758. , A_RECORD_CREATE_AUTHOR
  759. , A_RECORD_CREATE_DATE
  760. ) values (
  761. :id_zasob
  762. , :id_company
  763. , :id_project
  764. , :price
  765. , :unit
  766. , :unit
  767. , :quantity
  768. , :author
  769. , NOW()
  770. )
  771. ");
  772. $add__sth->bindValue(':author', User::getLogin(), PDO::PARAM_STR);
  773. $add__sth->bindValue(':id_project', $idProject, PDO::PARAM_INT);
  774. $add__sth->bindValue(':id_company', $idCompany, PDO::PARAM_INT);
  775. $add__sth->bindValue(':quantity', $add_quantity, PDO::PARAM_STR);
  776. $add__sth->bindParam(':id_zasob', $add_id_zasob, PDO::PARAM_INT);
  777. $add__sth->bindParam(':price', $add_price, PDO::PARAM_STR);
  778. $add__sth->bindParam(':unit', $add_unit, PDO::PARAM_STR);
  779. }
  780. {
  781. $edit_id_company = $idCompany;
  782. $edit_id_zasob = 0;
  783. $edit_unit = '';
  784. $edit_price = 0;
  785. $edit_author = 0;
  786. $edit_quantity = 0;
  787. $edit__sth = $pdo->prepare("
  788. update CRM_LISTA_ZASOBOW_OFFERS
  789. set CRM_LISTA_ZASOBOW_ID = :id_zasob
  790. , COMPANIES_ID = :id_company
  791. , ID_PROJECT = :id_project
  792. , OFFER_PRICE_PER_RESOURCE_UNIT = :price
  793. , RESOURCE_UNIT_TYPE = :unit
  794. , OFFER_UNIT_TYPE = :unit
  795. , REQUIRED_RESOURCE_UNITS = :quantity
  796. , A_RECORD_UPDATE_AUTHOR = :author
  797. , A_RECORD_UPDATE_DATE = NOW()
  798. where ID = :id
  799. ");
  800. $edit__sth->bindParam(':id', $edit_id, PDO::PARAM_INT);
  801. $edit__sth->bindValue(':author', User::getLogin(), PDO::PARAM_STR);
  802. $edit__sth->bindValue(':id_project', $idProject, PDO::PARAM_INT);
  803. $edit__sth->bindValue(':id_company', $idCompany, PDO::PARAM_INT);
  804. $edit__sth->bindValue(':quantity', $edit_quantity, PDO::PARAM_STR);
  805. $edit__sth->bindParam(':id_zasob', $edit_id_zasob, PDO::PARAM_INT);
  806. $edit__sth->bindParam(':price', $edit_price, PDO::PARAM_STR);
  807. $edit__sth->bindParam(':unit', $edit_unit, PDO::PARAM_STR);
  808. }
  809. $schema = ProjectKosztorysSchema::getSchema();
  810. foreach ($schema['config']['layer'] as $idLayer => $layData) {
  811. DBG::_('DBG', '>1', "layData", $layData, __CLASS__, __FUNCTION__, __LINE__);
  812. foreach ($layData['type'] as $idType => $typeLabel) {
  813. $edit_id = V::get("edit_price_id_{$idType}", '', $args);
  814. $add_price = V::get("price_{$idType}", '', $args);
  815. DBG::_('DBG', '>1', "typeLabel (edit={$edit_id}, price={$add_price})", $typeLabel, __CLASS__, __FUNCTION__, __LINE__);
  816. if ($edit_id > 0) {
  817. $edit_price = V::get("price_{$idType}", '', $args);
  818. $edit_price = str_replace(',', '.', $edit_price);
  819. if ($edit_id > 0 && $edit_price > 0) {
  820. $edit_id_zasob = $idType;
  821. $edit_unit = $layData['jednostka'];
  822. // TODO: check if anything change
  823. DBG::_('DBG', '>1', "EDIT price for idZasob({$idType}) {price:{$edit_price}, id_offer:{$edit_id}}", $typeLabel, __CLASS__, __FUNCTION__, __LINE__);
  824. $edit__sth->execute();
  825. // TODO: add to hist
  826. }
  827. } else {
  828. $add_price = V::get("price_{$idType}", '', $args);
  829. $add_price = str_replace(',', '.', $add_price);
  830. if ($add_price > 0) {
  831. $add_id_zasob = $idType;
  832. $add_unit = $layData['jednostka'];
  833. DBG::_('DBG', '>1', "ADD price for idZasob({$idType}) {price:{$add_price}}", $typeLabel, __CLASS__, __FUNCTION__, __LINE__);
  834. $add__sth->execute();
  835. }
  836. }
  837. }
  838. }
  839. }
  840. public function saveDefaultOffer($args) {
  841. DBG::_('DBG', '>1', "args", $args, __CLASS__, __FUNCTION__, __LINE__);
  842. $cennik = ProjectKosztorysCennik::getDefaultCennik();
  843. DBG::_('DBG', '>1', "cennik", $cennik, __CLASS__, __FUNCTION__, __LINE__);
  844. $idCompany = 0;
  845. $idProject = 0;
  846. $pdo = DB::getPDO();
  847. {
  848. $add_id_zasob = 0;
  849. $add_unit = '';
  850. $add_price = 0;
  851. $add_quantity = 0;
  852. $add__sth = $pdo->prepare("
  853. insert into CRM_LISTA_ZASOBOW_OFFERS (
  854. CRM_LISTA_ZASOBOW_ID
  855. , COMPANIES_ID
  856. , ID_PROJECT
  857. , OFFER_PRICE_PER_RESOURCE_UNIT
  858. , RESOURCE_UNIT_TYPE
  859. , OFFER_UNIT_TYPE
  860. , REQUIRED_RESOURCE_UNITS
  861. , A_RECORD_CREATE_AUTHOR
  862. , A_RECORD_CREATE_DATE
  863. ) values (
  864. :id_zasob
  865. , :id_company
  866. , :id_project
  867. , :price
  868. , :unit
  869. , :unit
  870. , :quantity
  871. , :author
  872. , NOW()
  873. )
  874. ");
  875. $add__sth->bindValue(':author', User::getLogin(), PDO::PARAM_STR);
  876. $add__sth->bindValue(':id_project', $idProject, PDO::PARAM_INT);
  877. $add__sth->bindValue(':id_company', $idCompany, PDO::PARAM_INT);
  878. $add__sth->bindValue(':quantity', $add_quantity, PDO::PARAM_STR);
  879. $add__sth->bindParam(':id_zasob', $add_id_zasob, PDO::PARAM_INT);
  880. $add__sth->bindParam(':price', $add_price, PDO::PARAM_STR);
  881. $add__sth->bindParam(':unit', $add_unit, PDO::PARAM_STR);
  882. }
  883. {
  884. $edit_id_zasob = 0;
  885. $edit_unit = '';
  886. $edit_price = 0;
  887. $edit_author = 0;
  888. $edit_quantity = 0;
  889. $edit__sth = $pdo->prepare("
  890. update CRM_LISTA_ZASOBOW_OFFERS
  891. set CRM_LISTA_ZASOBOW_ID = :id_zasob
  892. , COMPANIES_ID = :id_company
  893. , ID_PROJECT = :id_project
  894. , OFFER_PRICE_PER_RESOURCE_UNIT = :price
  895. , RESOURCE_UNIT_TYPE = :unit
  896. , OFFER_UNIT_TYPE = :unit
  897. , REQUIRED_RESOURCE_UNITS = :quantity
  898. , A_RECORD_UPDATE_AUTHOR = :author
  899. , A_RECORD_UPDATE_DATE = NOW()
  900. where ID = :id
  901. ");
  902. $edit__sth->bindParam(':id', $edit_id, PDO::PARAM_INT);
  903. $edit__sth->bindValue(':author', User::getLogin(), PDO::PARAM_STR);
  904. $edit__sth->bindValue(':id_project', $idProject, PDO::PARAM_INT);
  905. $edit__sth->bindValue(':id_company', $idCompany, PDO::PARAM_INT);
  906. $edit__sth->bindValue(':quantity', $edit_quantity, PDO::PARAM_STR);
  907. $edit__sth->bindParam(':id_zasob', $edit_id_zasob, PDO::PARAM_INT);
  908. $edit__sth->bindParam(':price', $edit_price, PDO::PARAM_STR);
  909. $edit__sth->bindParam(':unit', $edit_unit, PDO::PARAM_STR);
  910. }
  911. $schema = ProjectKosztorysSchema::getSchema();
  912. foreach ($schema['config']['layer'] as $idLayer => $layData) {
  913. DBG::_('DBG', '>1', "layData", $layData, __CLASS__, __FUNCTION__, __LINE__);
  914. foreach ($layData['type'] as $idType => $typeLabel) {
  915. DBG::_('DBG', '>1', "typeLabel", $typeLabel, __CLASS__, __FUNCTION__, __LINE__);
  916. $edit_id = V::get("edit_price_id_{$idType}", '', $args);
  917. if ($edit_id > 0) {
  918. $edit_price = V::get("price_{$idType}", '', $args);
  919. $edit_price = str_replace(',', '.', $edit_price);
  920. if ($edit_id > 0 && $edit_price > 0) {
  921. $edit_id_zasob = $idType;
  922. $edit_unit = $layData['jednostka'];
  923. // TODO: check if anything change
  924. $edit__sth->execute();
  925. // TODO: add to hist
  926. }
  927. } else {
  928. $add_price = V::get("price_{$idType}", '', $args);
  929. $add_price = str_replace(',', '.', $add_price);
  930. if ($add_price > 0) {
  931. $add_id_zasob = $idType;
  932. $add_unit = $layData['jednostka'];
  933. $add__sth->execute();
  934. }
  935. }
  936. }
  937. }
  938. }
  939. public function defaultOferta($idCompany = 0) {
  940. if ('1' == V::get('save_offer', '', $_POST)) {
  941. $this->saveDefaultOffer($_POST);
  942. }
  943. $schema = ProjectKosztorysSchema::getSchema();
  944. if (empty($schema['config']['type'])) throw new Exception("Schema error - brak zdefiniowanych typów");
  945. $cennik = ProjectKosztorysCennik::getDefaultCennik($idCompany);
  946. //DBG::_(true, true, "cennik", $cennik, __CLASS__, __FUNCTION__, __LINE__);
  947. UI::setTitleJsTag("Cennik domyślny dla Kosztorysów");
  948. ?>
  949. <div class="container">
  950. <form action="" method="post">
  951. <?php foreach ($schema['config']['layer'] as $idLayer => $layData) : ?>
  952. <h4 style="padding:0 6px"><?php echo $layData['label']; ?></h4>
  953. <table class="tabel table-bordered" style="width:100%">
  954. <tbody>
  955. <tr>
  956. <th style="padding:0 6px">id zasobu</th>
  957. <th style="padding:0 6px">typ</th>
  958. <th style="padding:0 6px">jednostka miary</th>
  959. <th style="padding:0 6px">cena jednostkowa</th>
  960. </tr>
  961. <?php foreach ($layData['type'] as $idType => $typeLabel) : ?>
  962. <tr>
  963. <td style="width:100px; padding:0 6px"><?php echo $idType; ?></td>
  964. <td style="padding:0 6px" title="[<?php echo $idType; ?>] <?php echo $typeLabel; ?>"><?php echo $typeLabel; ?></td>
  965. <td style="padding:0 6px"><?php echo $layData['jednostka']; ?></td>
  966. <td style="padding:3px 6px"><input type="text" class="form-control input-sm" name="price_<?php echo $idType; ?>" value="<?php echo $cennik[$idType]['price']; ?>"/></td>
  967. </tr>
  968. <?php endforeach; ?>
  969. </tbody>
  970. </table>
  971. <?php endforeach; ?>
  972. <br>
  973. <?php foreach ($cennik as $item) : ?>
  974. <input type="hidden" name="edit_price_id_<?php echo $item['id_zasob']; ?>" value="<?php echo $item['ID']; ?>">
  975. <?php endforeach; ?>
  976. <input type="hidden" name="save_offer" value="1">
  977. <input type="submit" value="Zapisz" class="btn btn-primary">
  978. </form>
  979. </div>
  980. <?php
  981. // Fix Zasoby [22444] INNE Kosztorys - zasoby
  982. // SELECT * FROM `CRM_LISTA_ZASOBOW_OFFERS`
  983. // WHERE `CRM_LISTA_ZASOBOW_ID` IN (22801,22445,22446,22447,22448,22449,22450,22451,22452,22453,22454,22455,22456,22457,22458,22459,22552,22517,22514,22481,22484,22515,22516,22518,22519,22520,22521,22550,22551,22617,22618,22638,22639,22640,22641,22642,22643,22644,22645,22646,22724,22725,22797,22798)
  984. // ORDER BY `CRM_LISTA_ZASOBOW_OFFERS`.`CRM_LISTA_ZASOBOW_ID` ASC
  985. // limit 100
  986. // <edittype widgetv2type="ValueMap" name="Typ_kosztu">
  987. // <widgetv2config fieldEditable="1" labelOnTop="0">
  988. // <value zasobID="22643" key="Montaż zapasu w studni" value="Montaż zapasu w studni"/>
  989. // <value zasobID="22638" key="Montaż złączek mikrokanalizacji" value="Montaż złączek mikrokanalizacji"/>
  990. // <value zasobID="22645" key="Mufa z montażem" value="Mufa z montażem"/>
  991. // <value zasobID="22642" key="Pigtail od puszki do terminala" value="Pigtail od puszki do terminala"/>
  992. // <value zasobID="22640" key="Przewiert w budynku z uszczelnieniem" value="Przewiert w budynku z uszczelnieniem"/>
  993. // <value zasobID="22639" key="Puszka abonencka z montażem" value="Puszka abonencka z montażem"/>
  994. // <value zasobID="22641" key="Spaw poza mufą" value="Spaw poza mufą"/>
  995. // <value zasobID="22724" key="Spaw w mufie" value="Spaw w mufie"/>
  996. // <value zasobID="22617" key="Spliter 1/16" value="Spliter 1/16"/>
  997. // <value zasobID="22618" key="Spliter 1/4" value="Spliter 1/4"/>
  998. // <value zasobID="22725" key="Spliter 1/8" value="Spliter 1/8"/>
  999. // <value zasobID="22644" key="Wprowadzenie kabli do mufy" value="Wprowadzenie kabli do mufy"/>
  1000. // <value zasobID="22646" key="Zamek PIOCH do studni" value="Zamek PIOCH do studni"/>
  1001. // <value zasobID="22515" key="Zapas kabla" value="Zapas kabla"/>
  1002. // <value zasobID="22514" key="Złącze" value="Złącze "/>
  1003. // </widgetv2config>
  1004. // </edittype>
  1005. // 22574 ->22515 INNE TYPE Zapas kabla
  1006. // 22620 ->22618 INNE TYPE Spliter 1/4
  1007. // 22621 ->22617 INNE TYPE Spliter 1/16
  1008. // 22647 ->22638 INNE TYPE Montaż złączek mikrokanalizacji
  1009. // 22648 ->22639 INNE TYPE Puszka abonencka z montażem
  1010. // 22649 ->22640 INNE TYPE Przewiert w budynku z uszczelnieniem
  1011. // 22650 ->22641 INNE TYPE Spaw poza mufą
  1012. // 22651 ->22642 INNE TYPE Pigtail od puszki do terminala
  1013. // 22652 ->22643 INNE TYPE Montaż zapasu w studni
  1014. // 22653 ->22644 INNE TYPE Wprowadzenie kabli do mufy
  1015. // 22654 ->22645 INNE TYPE Mufa z montażem
  1016. // 22655 ->22646 INNE TYPE Zamek PIOCH do studni
  1017. // 22881 ->22514 INNE TYPE Złącze
  1018. // TODO: ? 22484
  1019. }
  1020. /**
  1021. * @returns [ 'cost_total' => :numeric, 'sub_costs' => [ $id_zasob => 'price' ] ]
  1022. */
  1023. public function getProjectCostByCennik($idProject, $idCompany = 0) {
  1024. $projCost = array();
  1025. $projCost['cost_total'] = 0;
  1026. $projCost['sub_costs'] = array();
  1027. $defCennik = ProjectKosztorysCennik::getDefaultCennik($idCompany);
  1028. // $defCennik = [ $id_zasob => [ 'price' => $price, 'ID', 'id_zasob', 'id_company', 'id_project', 'unit', 'quantity' ] ]
  1029. $cennik = ProjectKosztorysCennik::getCennik($idProject, $idCompany);
  1030. $data = $this->getData($idProject, $admin = false);
  1031. foreach ($data['summary'] as $idLayer => $layData) {
  1032. foreach ($layData['data'] as $typeData) {
  1033. if (!$typeData['idType']) continue;
  1034. $price = (!empty($cennik[$typeData['idType']]['price']))? $cennik[$typeData['idType']]['price'] : 0;
  1035. $defPrice = (!empty($defCennik[$typeData['idType']]['price']))? $defCennik[$typeData['idType']]['price'] : 0;
  1036. $cost = ($price > 0)? $price : $defPrice;
  1037. $cost = $typeData['ilosc'] * $cost;
  1038. $projCost['sub_costs'][$typeData['idType']] = $cost;
  1039. $projCost['cost_total'] += $cost;
  1040. }
  1041. }
  1042. // fetch sub costs for sub projects
  1043. // $data['by_project'] = array_reduce($data['rawDataByType'], function($result, $row) {
  1044. // $idProj = $row['ID_PROJECT'];
  1045. // $idLayer = $row['idLayer'];
  1046. // $idType = $row['idType'];
  1047. // if (!array_key_exists($idProj, $result)) $result[$idProj] = array();
  1048. // if (!array_key_exists($idLayer, $result)) $result[$idProj][$idLayer] = array();
  1049. // if (!array_key_exists($idType, $result[$idProj][$idLayer])) {
  1050. // $result[$idProj][$idLayer][$idType] = $row;
  1051. // } else {
  1052. // $result[$idProj][$idLayer][$idType]['ilosc'] += $row['ilosc'];
  1053. $projCost['sub_proj'] = array();
  1054. foreach ($data['by_project'] as $idSubProj => $subProjData) {
  1055. foreach ($subProjData as $idLayer => $layData) {
  1056. foreach ($layData as $idType => $typeData) {
  1057. $price = (!empty($cennik[$typeData['idType']]['price']))? $cennik[$typeData['idType']]['price'] : 0;
  1058. $defPrice = (!empty($defCennik[$typeData['idType']]['price']))? $defCennik[$typeData['idType']]['price'] : 0;
  1059. $cost = ($price > 0)? $price : $defPrice;
  1060. $cost = $typeData['ilosc'] * $cost;
  1061. $projCost['sub_proj'][$idSubProj][$idType] = $cost;
  1062. }
  1063. }
  1064. }
  1065. return $projCost;
  1066. }
  1067. public function getModel($idProject) {
  1068. if (array_key_exists($idProject, $this->_model)) return $this->_model[$idProject];
  1069. $this->_model[$idProject] = new ProjectKosztorysModel($idProject);
  1070. return $this->_model[$idProject];
  1071. }
  1072. public function fetchBudynki($idProject) {
  1073. return DB::getPDO()->fetchAll("
  1074. select b.*
  1075. from BUILDINGS b
  1076. where b.ID_PROJECT = '{$idProject}'
  1077. ");
  1078. }
  1079. public function fetchProject($idProject) {
  1080. $rows = DB::getPDO()->fetchAll("
  1081. select p.*
  1082. from IN7_MK_BAZA_DYSTRYBUCJI p
  1083. where p.ID = '{$idProject}'
  1084. ");
  1085. return reset($rows);
  1086. }
  1087. public function zestawienieSwMikRur($idProject) {
  1088. $idCompany = 0;
  1089. $admin = false;
  1090. $companyAdmin = false;
  1091. $model = $this->getModel($idProject);
  1092. //DBG::table("subProjectList", $model->subProjectList, __CLASS__, __FUNCTION__, __LINE__);
  1093. $schema = ProjectKosztorysSchema::getSchema();
  1094. $projCost = $this->getProjectCostByCennik($idProject, $idCompany);
  1095. //DBG::_(true, true, "projCost", $projCost, __CLASS__, __FUNCTION__, __LINE__);
  1096. $viewLayerDataArgs = compact('idProject', 'idCompany', 'admin', 'companyAdmin', 'projCost');
  1097. ?>
  1098. <div class="container">
  1099. <h1></h1>
  1100. <table class="table">
  1101. <tr>
  1102. <th><?php echo $schema['nr']; ?></th>
  1103. <th><?php echo $schema['title']; ?></th>
  1104. <th><?php echo $schema['ownerName']; ?></th>
  1105. <th style="text-align:right"><?php echo $schema['cost_total']; ?></th>
  1106. </tr>
  1107. <tr>
  1108. <td><?php echo $model->idProject; ?></td>
  1109. <td><?php echo $model->title; ?></td>
  1110. <td><?php echo $model->ownerName; ?></td>
  1111. <td style="text-align:right"><?php echo number_format($projCost['cost_total'], 2, ',', ' '); ?></td>
  1112. </tr>
  1113. </table>
  1114. <?php $args = $viewLayerDataArgs;
  1115. $idProject = $args['idProject'];
  1116. $idCompany = V::get('idCompany', 0, $args);
  1117. $admin = V::get('admin', false, $args);
  1118. $companyAdmin = V::get('companyAdmin', false, $args);
  1119. $projCosts = V::get('projCosts', array(), $args);
  1120. $schema = ProjectKosztorysSchema::getSchema();
  1121. $conf = $schema['config'];
  1122. DBG::_('DBG', '>1', "conf", $conf, __CLASS__, __FUNCTION__, __LINE__);
  1123. $summaryTypeCost = V::get('sub_costs', array(), $projCosts);
  1124. $subProjCost = V::get('sub_proj', array(), $projCosts);
  1125. $data = $this->getData($idProject, $admin);
  1126. $dataSummary = $data['summary'];
  1127. $dataSubProj = $data['by_project'];
  1128. // $dataSubProj = array();
  1129. // foreach ($data['by_project'] as $idSubProj => $subProjData) {
  1130. // if ($idProject != $idSubProj) $dataSubProj[$idSubProj] = $subProjData;
  1131. // }
  1132. DBG::_('DBG', '>1', "data", $data, __CLASS__, __FUNCTION__, __LINE__);
  1133. $defCennik = ProjectKosztorysCennik::getDefaultCennik($idCompany);
  1134. $cennik = ProjectKosztorysCennik::getCennik($idProject, $idCompany);
  1135. $workCennik = ProjectKosztorysCennik::getWorkCennik($idProject, $idCompany);
  1136. $additionalCosts = array();
  1137. $additionalCosts[] = array();
  1138. $additionalCosts[] = array();
  1139. $additionalCosts[] = array();
  1140. $additionalSummaryTypeCost = array();
  1141. ?>
  1142. <style type="text/css">
  1143. /* Print Styles */
  1144. @media print {
  1145. body { font-size:10px; }
  1146. th, td { font-size:10px; }
  1147. h1 { font-size:2em; }
  1148. h2 { font-size:1.6em; }
  1149. h3 { font-size:1.4em; }
  1150. h4 { font-size:1.2em; }
  1151. }
  1152. </style>
  1153. <?php if (!empty($dataSubProj)) : ?>
  1154. <table class="table table-bordered">
  1155. <thead>
  1156. <tr>
  1157. <th>ID PROJ.</th>
  1158. <th>ID BUDYNKU</th>
  1159. <th>WŁAŚCICIEL</th>
  1160. <th>ADRES</th>
  1161. <th>KONTAKT</th>
  1162. <th>NR DZIAŁKI</th>
  1163. <th>DŁ. ŚWIATŁOWODU</th>
  1164. <th>DŁ. MIKRORURKI DO KLIENTA</th>
  1165. </tr>
  1166. </thead>
  1167. <tbody>
  1168. <?php foreach ($dataSubProj as $idSubProj => $subProjData) : ?>
  1169. <?php
  1170. // 22460 Światłowód
  1171. // 22467 Mikrokanalizacja do klienta
  1172. $sumSwiatlo = 0;
  1173. if (!empty($subProjData[22460])) foreach ($subProjData[22460] as $swiatlo) {
  1174. $sumSwiatlo += $swiatlo['ilosc'];
  1175. }
  1176. $sumMikroRur = 0;
  1177. if (!empty($subProjData[22467])) foreach ($subProjData[22467] as $mikroRur) {
  1178. $sumMikroRur += $mikroRur['ilosc'];
  1179. }
  1180. ?>
  1181. <?php $budynki = $this->fetchBudynki($idSubProj); ?>
  1182. <?php $proj = $this->fetchProject($idSubProj); ?>
  1183. <?php if (empty($budynki)) : ?>
  1184. <tr>
  1185. <td><?php echo $idSubProj; ?></td>
  1186. <td>brak</td>
  1187. <td><?php echo $proj['IN_NAME']; ?></td>
  1188. <td><?php echo $proj['M_DISTRIBUTOR_ADDRESS']; ?></td>
  1189. <td><?php echo $proj['M_DISTRIBUTOR_CONTACT']; ?></td>
  1190. <td><?php echo $proj['INWDZ__obreby_i_nr_dzialek']; ?></td>
  1191. <td><?php echo $sumSwiatlo; ?></td>
  1192. <td><?php echo $sumMikroRur; ?></td>
  1193. </tr>
  1194. <?php else : ?>
  1195. <?php foreach ($budynki as $bud) : ?>
  1196. <tr>
  1197. <td><?php echo $idSubProj; ?></td>
  1198. <td><?php echo $bud['ID']; ?></td>
  1199. <td><?php echo $proj['IN_NAME']; ?></td>
  1200. <td><?php echo $proj['M_DISTRIBUTOR_ADDRESS']; ?></td>
  1201. <td><?php echo $proj['M_DISTRIBUTOR_CONTACT']; ?></td>
  1202. <td><?php echo $proj['INWDZ__obreby_i_nr_dzialek']; ?></td>
  1203. <td><?php echo $sumSwiatlo; ?></td>
  1204. <td><?php echo $sumMikroRur; ?></td>
  1205. </tr>
  1206. <?php endforeach; ?>
  1207. <?php endif; ?>
  1208. <?php endforeach; ?>
  1209. </tbody>
  1210. </table>
  1211. <?php endif; ?>
  1212. <?php
  1213. DBG::_('DBG', '>0', "schema", $schema, __CLASS__, __FUNCTION__, __LINE__);
  1214. DBG::_('DBG', '>0', "projCost", $projCost, __CLASS__, __FUNCTION__, __LINE__);
  1215. }
  1216. public function kosztorys($idProject) {
  1217. $idCompany = 0;
  1218. $admin = false;
  1219. $companyAdmin = false;
  1220. $model = $this->getModel($idProject);
  1221. //DBG::table("subProjectList", $model->subProjectList, __CLASS__, __FUNCTION__, __LINE__);
  1222. $schema = ProjectKosztorysSchema::getSchema();
  1223. $projCosts = $this->getProjectCostByCennik($idProject, $idCompany);
  1224. //DBG::_(true, true, "projCosts", $projCosts, __CLASS__, __FUNCTION__, __LINE__);
  1225. $viewLayerDataArgs = compact('idProject', 'idCompany', 'admin', 'companyAdmin', 'projCosts');
  1226. UI::setTitleJsTag("Kosztorys wstępny robót telekomunikacyjnych [{$idProject}]");
  1227. ?>
  1228. <div class="container">
  1229. <h1>Kosztorys wstępny robót telekomunikacyjnych</h1>
  1230. <table class="table">
  1231. <tr>
  1232. <th><?php echo $schema['nr']; ?></th>
  1233. <th><?php echo $schema['title']; ?></th>
  1234. <th><?php echo $schema['ownerName']; ?></th>
  1235. <th style="text-align:right"><?php echo $schema['cost_total']; ?></th>
  1236. </tr>
  1237. <tr>
  1238. <td><?php echo $model->idProject; ?></td>
  1239. <td><?php echo $model->title; ?></td>
  1240. <td><?php echo $model->ownerName; ?></td>
  1241. <td style="text-align:right"><?php echo number_format($projCost['cost_total'], 2, ',', ' '); ?></td>
  1242. </tr>
  1243. </table>
  1244. <?php $this->viewLayersData($viewLayerDataArgs); ?>
  1245. </div>
  1246. <?php
  1247. DBG::_('DBG', '>0', "schema", $schema, __CLASS__, __FUNCTION__, __LINE__);
  1248. DBG::_('DBG', '>0', "projCost", $projCost, __CLASS__, __FUNCTION__, __LINE__);
  1249. }
  1250. public function oferta($args) {
  1251. $idProject = $args['idProject'];
  1252. $idCompany = V::get('idCompany', 0, $args);
  1253. $admin = V::get('admin', false, $args);
  1254. $companyAdmin = V::get('companyAdmin', false, $args);
  1255. if ($admin && '1' == V::get('save_offer', '', $_POST)) {
  1256. $this->saveOffer($idProject, $idCompany, $_POST, $admin);
  1257. }
  1258. $defCennik = ProjectKosztorysCennik::getDefaultCennik($idCompany);
  1259. $cennik = ProjectKosztorysCennik::getCennik($idProject, $idCompany);
  1260. $viewLayerDataArgs = compact('idProject', 'idCompany', 'admin', 'companyAdmin');
  1261. UI::setTitleJsTag("Oferta " . (($idProject)? " [{$idProject}] " : '') . (($idCompany)? " Kontrahent({$idCompany})" : '') . " - Kosztorysy");
  1262. ?>
  1263. <div class="container">
  1264. <?php if ($admin) : ?>
  1265. <form action="" method="post">
  1266. <?php endif; ?>
  1267. <?php $this->viewLayersData($viewLayerDataArgs); ?>
  1268. <?php if ($admin || $companyAdmin) : ?>
  1269. <?php foreach ($cennik as $item) : ?>
  1270. <input type="hidden" name="edit_price_id_<?php echo $item['id_zasob']; ?>" value="<?php echo $item['ID']; ?>">
  1271. <?php endforeach; ?>
  1272. <input type="hidden" name="save_offer" value="1">
  1273. <hr><input class="btn btn-primary" type="submit" value="Zapisz ofertę">
  1274. </form>
  1275. <?php endif; ?>
  1276. </div>
  1277. <?php
  1278. }
  1279. public function viewLayersData($args) {
  1280. $idProject = $args['idProject'];
  1281. $idCompany = V::get('idCompany', 0, $args);
  1282. $admin = V::get('admin', false, $args);
  1283. $companyAdmin = V::get('companyAdmin', false, $args);
  1284. $projCosts = V::get('projCosts', array(), $args);
  1285. $schema = ProjectKosztorysSchema::getSchema();
  1286. $conf = $schema['config'];
  1287. DBG::_('DBG', '>1', "conf", $conf, __CLASS__, __FUNCTION__, __LINE__);
  1288. $summaryTypeCost = V::get('sub_costs', array(), $projCosts);
  1289. $subProjCost = V::get('sub_proj', array(), $projCosts);
  1290. $data = $this->getData($idProject, $admin);
  1291. $dataSummary = $data['summary'];
  1292. $dataSubProj = $data['by_project'];
  1293. // $dataSubProj = array();
  1294. // foreach ($data['by_project'] as $idSubProj => $subProjData) {
  1295. // if ($idProject != $idSubProj) $dataSubProj[$idSubProj] = $subProjData;
  1296. // }
  1297. DBG::_('DBG', '>1', "data", $data, __CLASS__, __FUNCTION__, __LINE__);
  1298. $defCennik = ProjectKosztorysCennik::getDefaultCennik($idCompany);
  1299. $cennik = ProjectKosztorysCennik::getCennik($idProject, $idCompany);
  1300. $workCennik = ProjectKosztorysCennik::getWorkCennik($idProject, $idCompany);
  1301. if (!empty($summaryTypeCost)) {
  1302. $additionalCosts = array();
  1303. $additionalCosts[] = array();
  1304. $additionalCosts[] = array();
  1305. $additionalCosts[] = array();
  1306. $additionalSummaryTypeCost = array();
  1307. $additionalSummaryTypeCost[] = 0;
  1308. $additionalSummaryTypeCost[] = 0;
  1309. $additionalSummaryTypeCost[] = 0;
  1310. }
  1311. ?>
  1312. <style type="text/css">
  1313. /* Print Styles */
  1314. @media print {
  1315. body { font-size:10px; }
  1316. th, td { font-size:10px; }
  1317. h1 { font-size:2em; }
  1318. h2 { font-size:1.6em; }
  1319. h3 { font-size:1.4em; }
  1320. h4 { font-size:1.2em; }
  1321. }
  1322. </style>
  1323. <?php $tblCols = 6 + ($admin ? 1 : 0) + ((!empty($summaryTypeCost))? 1 : 0); ?>
  1324. <table class="tabel table-bordered" style="width:100%; margin-bottom:6px; page-break-inside:avoid">
  1325. <tbody>
  1326. <?php foreach ($dataSummary as $idLayer => $layData) : ?>
  1327. <tr>
  1328. <td colspan="<?php echo $tblCols; ?>" style="padding:0 6px; font-size:1.2em; line-height:2em; font-style:italic"><?php echo $layData['label']; ?></td>
  1329. </tr>
  1330. <tr>
  1331. <td style="padding:0 6px">typ</td>
  1332. <td style="width:60px; padding:0 6px; text-align:right">ilość</td>
  1333. <td style="width:80px; padding:0 6px; text-align:right">jednostka</td>
  1334. <td style="padding:0 6px; text-align:right">cena jednostkowa</td>
  1335. <td style="padding:0 6px; text-align:right">cena jedn. (robocizna)</td>
  1336. <?php if ($admin) : ?>
  1337. <td style="padding:0 6px; text-align:right">cena jedn. (domyślna)</td>
  1338. <?php endif; ?>
  1339. <?php if (!empty($summaryTypeCost)) : ?>
  1340. <td style="padding:0 6px; text-align:right">szacowany koszt [zł]</td>
  1341. <?php endif; ?>
  1342. <td style="padding:0 6px; text-align:right">uwagi</td>
  1343. </tr>
  1344. <?php foreach ($layData['data'] as $typeData) : ?>
  1345. <?php if (!$typeData['idType']) : ?>
  1346. <tr>
  1347. <td colspan="4">
  1348. <?php if ($admin) {
  1349. $fixLink = 'index.php?MENU_INIT=VIEWTABLE_AJAX&ZASOB_ID=' . $conf['layer'][$idLayer]['tabela_id'];
  1350. $fixLink .= '&f_' . $conf['layer'][$idLayer]['zasob_field'] . '=%3D' . $typeData['type'];
  1351. $fixLink .= '&_hash=' . uniqid();
  1352. $fixProjectLink = '<a target="_blank" href="' . $fixLink . "&f_ID_PROJECT={$idProject}" . '">' . "Popraw" . '</a>' . " (dane dla projektu [{$idProject}])";
  1353. $fixAllLink = '<a target="_blank" href="' . $fixLink . '">' . "Popraw wszystkie" . '</a>';
  1354. UI::alert('danger', "Niezdefiniowany typ: <code>{$typeData['type']}</code> - {$fixProjectLink}, {$fixAllLink}");
  1355. } ?>
  1356. <?php DBG::_('DBG', '>1', "Error conf", $conf, __CLASS__, __FUNCTION__, __LINE__); ?>
  1357. <?php DBG::_('DBG', '>1', "Error", $typeData, __CLASS__, __FUNCTION__, __LINE__); ?>
  1358. </td>
  1359. </tr>
  1360. <?php else : ?>
  1361. <?php $idType = $typeData['idType']; ?>
  1362. <?php $defPrice = (!empty($defCennik[$idType]['price']))? $defCennik[$idType]['price'] : 0; ?>
  1363. <?php $price = (!empty($cennik[$idType]['price']))? $cennik[$idType]['price'] : $defPrice; ?>
  1364. <?php $workPrice = (!empty($workCennik[$idType]['price']))? $workCennik[$idType]['price'] : 0; ?>
  1365. <?php $uwagi = (!empty($cennik[$idType]['notes']))? $cennik[$idType]['notes'] : '';// TODO: uwagi ?>
  1366. <tr>
  1367. <td style="padding:0 6px" title="[<?php echo $idType; ?>] <?php echo $typeData['type']; ?>"> - <?php echo $typeData['type']; ?></td>
  1368. <td style="padding:0 6px; text-align:right"><?php echo $typeData['ilosc']; ?></td>
  1369. <td style="padding:0 6px; text-align:right"><?php echo ProjectKosztorysSchema::getLayerJednostka($idLayer); ?></td>
  1370. <td style="padding:3px 6px; text-align:right">
  1371. <?php if ($admin || $companyAdmin) : ?>
  1372. <input type="text" style="text-align:right" class="form-control input-sm" name="price_<?php echo $idType; ?>" value="<?php echo $price; ?>"/>
  1373. <?php else : ?>
  1374. <?php echo number_format($price, 2, ',', ' '); ?>
  1375. <?php endif; ?>
  1376. </td>
  1377. <td style="padding:3px 6px; text-align:right">
  1378. <?php if ($admin || $companyAdmin) : ?>
  1379. <input type="text" style="text-align:right" class="form-control input-sm" name="work_price_<?php echo $idType; ?>" value="<?php echo $workPrice; ?>"/>
  1380. <?php else : ?>
  1381. <?php echo number_format($workPrice, 2, ',', ' '); ?>
  1382. <?php endif; ?>
  1383. </td>
  1384. <?php if ($admin) : ?>
  1385. <td style="padding:3px 6px; text-align:right"><?php echo $defPrice; ?></td>
  1386. <?php endif; ?>
  1387. <?php if (!empty($summaryTypeCost)) : ?>
  1388. <td style="padding:3px 6px; text-align:right"><?php echo number_format(V::get($idType, 0, $summaryTypeCost), 2, ',', ' '); ?></td>
  1389. <?php endif; ?>
  1390. <td style="padding:3px 6px; text-align:right">
  1391. <?php if ($admin || $companyAdmin) : ?>
  1392. <input type="text" style="text-align:left" class="form-control input-sm" name="uwagi_<?php echo $idType; ?>" value="<?php echo $uwagi; ?>"/>
  1393. <?php else : ?>
  1394. <?php echo $uwagi; ?>
  1395. <?php endif; ?>
  1396. </td>
  1397. </tr>
  1398. <?php endif; ?>
  1399. <?php endforeach; ?>
  1400. <?php endforeach; ?>
  1401. <?php if (!empty($additionalCosts)) : ?>
  1402. <tr>
  1403. <td colspan="<?php echo $tblCols; ?>" style="padding:0 6px; font-size:1.2em; line-height:2em; font-style:italic">Koszty dodatkowe</td>
  1404. </tr>
  1405. <tr>
  1406. <td style="padding:0 6px">typ</td>
  1407. <td style="width:60px; padding:0 6px; text-align:right">ilość</td>
  1408. <td style="width:80px; padding:0 6px; text-align:right">jednostka</td>
  1409. <td style="padding:0 6px; text-align:right">cena jednostkowa</td>
  1410. <td style="padding:0 6px; text-align:right">cena jedn. (robocizna)</td>
  1411. <?php if ($admin) : ?>
  1412. <td style="padding:0 6px; text-align:right">cena jedn. (domyślna)</td>
  1413. <?php endif; ?>
  1414. <?php if (!empty($summaryTypeCost)) : ?>
  1415. <td style="padding:0 6px; text-align:right">szacowany koszt [zł]</td>
  1416. <?php endif; ?>
  1417. <td style="padding:0 6px; text-align:right">uwagi</td>
  1418. </tr>
  1419. <?php foreach ($additionalCosts as $idType => $additionalCost) : ?>
  1420. <?php $additionalPrice = 0;//TODO: get from $additionalCennik or $additionalCost ?>
  1421. <?php $additionalWorkPrice = 0;//TODO: get from $additionalWorkCennik or $additionalCost ?>
  1422. <?php $additionalCount = 0;//TODO: fetch ?>
  1423. <?php $additionalUnit = '';//TODO: fetch ?>
  1424. <?php $jednostka = '';//TODO: fetch ?>
  1425. <?php $ilosc = '';//TODO: fetch ?>
  1426. <?php $typeLabel = '';//TODO: fetch ?>
  1427. <?php $price = 0;//TODO: fetch ?>
  1428. <?php $defPrice = 0;//TODO: fetch ?>
  1429. <?php $workPrice = 0;//TODO: fetch ?>
  1430. <?php $uwagi = '';//TODO: fetch ?>
  1431. <tr>
  1432. <td style="padding:0 6px" >
  1433. <?php if ($admin || $companyAdmin) : ?>
  1434. <input type="text" style="text-align:right" class="form-control input-sm" name="additional_label_<?php echo $idType; ?>" value="<?php echo $typeLabel; ?>"/>
  1435. <?php else : ?>
  1436. - <?php echo $typeLabel; ?>
  1437. <?php endif; ?>
  1438. </td>
  1439. <td style="padding:0 6px; text-align:right">
  1440. <?php if ($admin || $companyAdmin) : ?>
  1441. <input type="text" style="text-align:right" class="form-control input-sm" name="additional_count_<?php echo $idType; ?>" value="<?php echo $additionalCount; ?>"/>
  1442. <?php else : ?>
  1443. <?php echo $ilosc; ?>
  1444. <?php endif; ?>
  1445. </td>
  1446. <td style="padding:0 6px; text-align:right">
  1447. <?php if ($admin || $companyAdmin) : ?>
  1448. <input type="text" style="text-align:right" class="form-control input-sm" name="additional_unit_<?php echo $idType; ?>" value="<?php echo $additionalUnit; ?>"/>
  1449. <?php else : ?>
  1450. <?php echo $jednostka; ?>
  1451. <?php endif; ?>
  1452. </td>
  1453. <td style="padding:3px 6px; text-align:right">
  1454. <?php if ($admin || $companyAdmin) : ?>
  1455. <input type="text" style="text-align:right" class="form-control input-sm" name="additional_price_<?php echo $idType; ?>" value="<?php echo $additionalPrice; ?>"/>
  1456. <?php else : ?>
  1457. <?php echo number_format($price, 2, ',', ' '); ?>
  1458. <?php endif; ?>
  1459. </td>
  1460. <td style="padding:3px 6px; text-align:right">
  1461. <?php if ($admin || $companyAdmin) : ?>
  1462. <input type="text" style="text-align:right" class="form-control input-sm" name="additional_work_price_<?php echo $idType; ?>" value="<?php echo $additionalWorkPrice; ?>"/>
  1463. <?php else : ?>
  1464. <?php echo number_format($workPrice, 2, ',', ' '); ?>
  1465. <?php endif; ?>
  1466. </td>
  1467. <?php if ($admin) : ?>
  1468. <td style="padding:3px 6px; text-align:right"></td>
  1469. <?php endif; ?>
  1470. <?php if (!empty($additionalSummaryTypeCost)) : ?>
  1471. <td style="padding:3px 6px; text-align:right"><?php echo number_format(V::get($idType, 0, $additionalSummaryTypeCost), 2, ',', ' '); ?></td>
  1472. <?php endif; ?>
  1473. <td style="padding:3px 6px; text-align:right">
  1474. <?php if ($admin || $companyAdmin) : ?>
  1475. <input type="text" style="text-align:left" class="form-control input-sm" name="additional_uwagi_<?php echo $idType; ?>" value="<?php echo $uwagi; ?>"/>
  1476. <?php else : ?>
  1477. <?php echo $uwagi; ?>
  1478. <?php endif; ?>
  1479. </td>
  1480. </tr>
  1481. <?php endforeach; ?>
  1482. <?php endif; ?>
  1483. </tbody>
  1484. </table>
  1485. <?php $tblCols = 4 + ($admin ? 1 : 0) + ((!empty($summaryTypeCost))? 1 : 0); ?>
  1486. <?php if (!empty($dataSubProj)) : ?>
  1487. <p style="page-break-before:always; margin-top:60px"></p>
  1488. <h3>Składowe wg projektów podrzędnych:</h3>
  1489. <?php foreach ($dataSubProj as $idSubProj => $subProjData) : ?>
  1490. <table class="tabel table-bordered" style="width:100%; margin-bottom:6px; page-break-inside:avoid">
  1491. <tbody>
  1492. <tr>
  1493. <th colspan="<?php echo $tblCols; ?>"
  1494. style="padding:0 6px">
  1495. <h4>Projekt <?php echo $idSubProj; ?>: <i><?php echo $this->getModel($idProject)->getProjectName($idSubProj); ?></i>:</h4>
  1496. </th>
  1497. </tr>
  1498. <?php foreach ($subProjData as $idLayer => $layData) : ?>
  1499. <tr>
  1500. <td colspan="<?php echo $tblCols; ?>"
  1501. style="padding:0 6px; font-size:1.2em; line-height:2em; font-style:italic"><?php echo $conf['layer'][$idLayer]['label']; ?></td>
  1502. </tr>
  1503. <tr>
  1504. <td style="padding:0 6px">typ</td>
  1505. <td style="padding:0 6px; text-align:right">ilość</td>
  1506. <td style="padding:0 6px; text-align:right">jednostka</td>
  1507. <?php if ($admin) : ?>
  1508. <td style="padding:0 6px; text-align:right">cena jednostkowa</td>
  1509. <td style="padding:0 6px; text-align:right">cena jedn. (domyślna)</td>
  1510. <?php endif; ?>
  1511. <?php if (!empty($subProjCost)) : ?>
  1512. <td style="padding:0 6px; text-align:right">szacowany koszt [zł]</td>
  1513. <?php endif; ?>
  1514. </tr>
  1515. <?php foreach ($layData as $idType => $typeData) : ?>
  1516. <?php if (!$typeData['idType']) : ?>
  1517. <tr>
  1518. <td colspan="4">
  1519. <?php if ($admin) {
  1520. $fixLink = 'index.php?MENU_INIT=VIEWTABLE_AJAX&ZASOB_ID=' . $conf['layer'][$idLayer]['tabela_id'];
  1521. $fixLink .= '&f_' . $conf['layer'][$idLayer]['zasob_field'] . '=%3D' . $typeData['type'];
  1522. $fixLink .= '&_hash=' . uniqid();
  1523. $fixProjectLink = '<a target="_blank" href="' . $fixLink . "&f_ID_PROJECT={$idProject}" . '">' . "Popraw" . '</a>' . " (dane dla projektu [{$idProject}])";
  1524. $fixAllLink = '<a target="_blank" href="' . $fixLink . '">' . "Popraw wszystkie" . '</a>';
  1525. UI::alert('danger', "Niezdefiniowany typ: <code>{$typeData['type']}</code> - {$fixProjectLink}, {$fixAllLink}");
  1526. } ?>
  1527. <?php DBG::_('DBG', '>1', "Error conf", $conf, __CLASS__, __FUNCTION__, __LINE__); ?>
  1528. <?php DBG::_('DBG', '>1', "Error", $typeData, __CLASS__, __FUNCTION__, __LINE__); ?>
  1529. </td>
  1530. </tr>
  1531. <?php else : ?>
  1532. <?php $defPrice = (!empty($defCennik[$typeData['idType']]['price']))? $defCennik[$typeData['idType']]['price'] : 0; ?>
  1533. <?php $price = (!empty($cennik[$typeData['idType']]['price']))? $cennik[$typeData['idType']]['price'] : $defPrice; ?>
  1534. <tr>
  1535. <td style="padding:0 6px" title="[<?php echo $typeData['idType']; ?>] <?php echo $typeData['type']; ?>"><?php echo $typeData['type']; ?></td>
  1536. <td style="padding:0 6px; text-align:right"><?php echo $typeData['ilosc']; ?></td>
  1537. <td style="padding:0 6px; text-align:right"><?php echo ProjectKosztorysSchema::getLayerJednostka($idLayer); ?></td>
  1538. <?php if ($admin) : ?>
  1539. <td style="padding:3px 6px; text-align:right">
  1540. <input type="text" style="text-align:right" class="form-control input-sm" name="price_<?php echo $typeData['idType']; ?>" value="<?php echo $price; ?>"/>
  1541. </td>
  1542. <?php endif; ?>
  1543. <?php if ($admin) : ?>
  1544. <td style="padding:3px 6px; text-align:right"><?php echo $defPrice; ?></td>
  1545. <?php endif; ?>
  1546. <?php if (!empty($subProjCost)) : ?>
  1547. <td style="padding:3px 6px; text-align:right"><?php echo number_format(V::get($typeData['idType'], 0, $subProjCost[$idSubProj]), 2, ',', ' '); ?></td>
  1548. <?php endif; ?>
  1549. </tr>
  1550. <?php endif; ?>
  1551. <?php endforeach; ?>
  1552. <?php endforeach; ?>
  1553. <?php endforeach; ?>
  1554. </tbody>
  1555. </table>
  1556. <?php endif; ?>
  1557. <?php
  1558. }
  1559. public function checkGeomDuplicate() {
  1560. // TODO: for every schema.layer
  1561. $sqlTblName = 'Rozdzielcza_Kabel_Swiatlowodowy_wsg84';
  1562. $sql = "select a.ID, b.ID, aswkt(a.the_geom)
  1563. from `{$sqlTblName}` a
  1564. join `$sqlTblName` b on(b.the_geom = a.the_geom and a.ID != b.ID)
  1565. ";
  1566. }
  1567. public function getData($idProject, $admin = 0) {
  1568. static $_data = null;
  1569. if (null === $_data) {
  1570. $idSubProject = $this->getModel($idProject)->getSubProjectIds();
  1571. $idSubProject[] = $idProject;
  1572. $_data = $this->fetchData($idSubProject, $admin);
  1573. }
  1574. //if (!array_key_exists($idProject, $_data)) $_data[$idProject] = $this->fetchData($idProject, $admin);
  1575. //return $_data[$idProject];
  1576. return $_data;
  1577. }
  1578. public function fetchData($idProject, $admin = 0) {
  1579. $data = array();
  1580. $data['summary'] = array();// [ $idType ] = ['type', 'jednostka', 'ilosc']
  1581. $data['rawDataByType'] = array();
  1582. if (empty($idProject)) return $data;
  1583. $schema = ProjectKosztorysSchema::getSchema();// OK only 'config'
  1584. $conf = $schema['config'];
  1585. $pdo = DB::getPDO();
  1586. foreach ($conf['layer'] as $idLayer => $layer) {
  1587. if (!$layer['tabela_name']) continue;// TODO: throw error in validate
  1588. if ('ZASOB' == $layer['zasob_type']) {
  1589. } else if ('ZASOB_ID' == $layer['zasob_type']) {
  1590. } else {
  1591. continue;// TODO: validate config error
  1592. }
  1593. $tblName = $layer['tabela_name'];
  1594. $sqlIloscField = (!empty($layer['ilosc_field']))? $layer['ilosc_field'] : 'ID';
  1595. $sqlIlosc = ('SZTUKA' == $layer['jednostka'])? "count(1)" : "sum(t.{$sqlIloscField})";
  1596. $sqlZasobField = (!empty($layer['zasob_field']))? $layer['zasob_field'] : 'ID';
  1597. $sqlGroupBy = "group by t.ID_PROJECT" . ((!empty($layer['zasob_field']))? ", t.{$sqlZasobField}" : '');
  1598. $sqlIdProject = (is_array($idProject))? implode(",", $idProject) : (int)$idProject;
  1599. $sql = "
  1600. select t.{$sqlZasobField}
  1601. , t.ID_PROJECT
  1602. , {$sqlIlosc} as ilosc
  1603. from {$tblName} t
  1604. where t.ID_PROJECT in({$sqlIdProject})
  1605. and t.the_geom is not null
  1606. {$sqlGroupBy}
  1607. ";
  1608. $data['_DBG_sql'][$idLayer] = $sql;
  1609. $rawLayData = $pdo->fetchAll($sql);
  1610. $rawLayData = array_filter($rawLayData, function($row) {
  1611. return ($row['ilosc'] > 0);
  1612. });
  1613. foreach ($rawLayData as $idx => &$row) {
  1614. if ('ZASOB' == $layer['zasob_type']) {
  1615. $row['type'] = trim($row[$sqlZasobField]);
  1616. $row['idType'] = array_search($row['type'], $conf['type']);
  1617. } else if ('ZASOB_ID' == $layer['zasob_type']) {
  1618. $row['type'] = $layer['zasob_label'];
  1619. $row['idType'] = (array_key_exists($layer['zasob_id'], $conf['type']))? $layer['zasob_id'] : null;
  1620. }
  1621. $row['idLayer'] = $idLayer;
  1622. unset($row[$sqlZasobField]);
  1623. $data['rawDataByType'][] = $row;
  1624. }
  1625. }
  1626. //DBG::_(true, true, "data", $data, __CLASS__, __FUNCTION__, __LINE__);
  1627. //DBG::table("data['rawDataByType']", $data['rawDataByType'], __CLASS__, __FUNCTION__, __LINE__);
  1628. if ($admin) {
  1629. foreach ($data['rawDataByType'] as $row) {
  1630. $layer = $conf['layer'][$row['idLayer']];
  1631. if ($row['idType'] <= 0) {
  1632. UI::alert('warning', "Pomijanie nieznanego oznaczenia '{$row['type']}' w ilości {$row['ilosc']} - warstwa '{$layer['label']}' ({$layer['tabela_name']}), projekt nr {$row['ID_PROJECT']}");
  1633. }
  1634. }
  1635. }
  1636. $data['rawDataByType'] = array_filter($data['rawDataByType'], function($row) {
  1637. return ($row['idType'] > 0);
  1638. });
  1639. //DBG::table("data['rawDataByType'] - clean", $data['rawDataByType'], __CLASS__, __FUNCTION__, __LINE__);
  1640. $data['by_layer'] = array_reduce($data['rawDataByType'], function($result, $row) {
  1641. $idLayer = $row['idLayer'];
  1642. $idType = $row['idType'];
  1643. if (!array_key_exists($idLayer, $result)) $result[$idLayer] = array();
  1644. if (!array_key_exists($idType, $result[$idLayer])) {
  1645. $result[$idLayer][$idType] = $row;
  1646. } else {
  1647. $result[$idLayer][$idType]['ilosc'] += $row['ilosc'];
  1648. }
  1649. return $result;
  1650. }, array());
  1651. //DBG::_(true, true, "data['by_layer']", $data['by_layer'], __CLASS__, __FUNCTION__, __LINE__);
  1652. $data['summary'] = array();
  1653. foreach ($data['by_layer'] as $idLayer => $iloscByType) {
  1654. $layData = array();
  1655. $layData['label'] = $conf['layer'][$idLayer]['label'];
  1656. $layData['data'] = $iloscByType;
  1657. foreach ($layData['data'] as &$iloscData) {
  1658. $iloscData['jednostka'] = $conf['layer'][$idLayer]['jednostka'];
  1659. }
  1660. $data['summary'][$idLayer] = $layData;
  1661. }
  1662. //DBG::_(true, true, "data['summary']", $data['summary'], __CLASS__, __FUNCTION__, __LINE__);
  1663. $data['by_project'] = array_reduce($data['rawDataByType'], function($result, $row) {
  1664. $idProj = $row['ID_PROJECT'];
  1665. $idLayer = $row['idLayer'];
  1666. $idType = $row['idType'];
  1667. if (!array_key_exists($idProj, $result)) $result[$idProj] = array();
  1668. if (!array_key_exists($idLayer, $result[$idProj])) $result[$idProj][$idLayer] = array();
  1669. if (!array_key_exists($idType, $result[$idProj][$idLayer])) {
  1670. $result[$idProj][$idLayer][$idType] = $row;
  1671. } else {
  1672. $result[$idProj][$idLayer][$idType]['ilosc'] += $row['ilosc'];
  1673. }
  1674. return $result;
  1675. }, array());
  1676. //DBG::_(true, true, "data['by_project']", $data['by_project'], __CLASS__, __FUNCTION__, __LINE__);
  1677. return $data;
  1678. }
  1679. }