ProjektyKosztyWstepnychRobot.php 72 KB

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