ProjektyZamowieniaKosztorys.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. Lib::loadClass('ProjectKosztorysSchema');
  4. Lib::loadClass('ProjectKosztorysModel');
  5. Lib::loadClass('ProjectKosztorysCennik');
  6. Lib::loadClass('UI');
  7. Lib::loadClass('Response');
  8. Lib::loadClass('Route_ProjektyKosztorysBase');
  9. class Route_UrlAction_ProjektyZamowieniaKosztorys extends Route_ProjektyKosztorysBase {
  10. public $_model = array();
  11. public $_ID_ZASOB_ZAMOWIENIE = 24121;
  12. public function defaultAction() {
  13. // TODO: check if user is allowed to run this action
  14. UI::gora();
  15. if (1 != V::get('_print', '', $_GET)) UI::menu();
  16. try {
  17. $idProject = V::get('ID_PROJECT', 0, $_REQUEST, 'int');
  18. if (!$idProject) throw new Exception("Wrong param in 'ID_PROJECT' - expected integer!");
  19. $this->panel($idProject);
  20. $this->execPostTasks();
  21. $this->zamowienia($idProject);
  22. } catch (Exception $e) {
  23. UI::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage());
  24. }
  25. UI::dol();
  26. }
  27. public function zamowienia($idProject) {
  28. $idProject = (int)$idProject;
  29. if ($idProject <= 0) throw new Exception("Error Processing Request - wrong param id project");
  30. $idOrder = V::get('ID_ORDER', 0, $_REQUEST, 'int');
  31. $sqlTableZlecenia = "IN7_DZIENNIK_KORESP";
  32. // $sqlTableZlecenia = (DBG::isActive()) ? "IN7_DZIENNIK_KORESP__TEST_ZLECENIA" : "IN7_DZIENNIK_KORESP";
  33. // if (DBG::isActive()) {
  34. // UI::startContainer();
  35. // UI::alert('warning', "<b>Uwaga:</b> Zlecenie z testowej tabeli Koresp (IN7_DZIENNIK_KORESP__TEST_ZLECENIA)");
  36. // UI::endContainer();
  37. /*
  38. DROP TABLE IF EXISTS IN7_DZIENNIK_KORESP__TEST_ZLECENIA;
  39. CREATE TABLE IN7_DZIENNIK_KORESP__TEST_ZLECENIA
  40. select k.ID
  41. , k.ID_PROJECT
  42. , k.A_STATUS
  43. , k.K_DATA_OTRZYM_KORESP
  44. , k.K_DATA_OTRZYMANEJ_KORESP
  45. , k.K_OD_KOGO
  46. , k.OD_KOGO_ADRES
  47. , k.K_ZAWARTOS
  48. , k.CRM_LISTA_ZASOBOW_ID
  49. , k.K_TYP_KORESP
  50. from IN7_DZIENNIK_KORESP k
  51. where k.CRM_LISTA_ZASOBOW_ID = 24121
  52. and k.K_TYP_KORESP in('OUT','WEW') ;
  53. ALTER TABLE `IN7_DZIENNIK_KORESP__TEST_ZLECENIA` ADD PRIMARY KEY ( `ID` ) ;
  54. */
  55. // }
  56. $ordersRaw = DB::getPDO()->fetchAllByKey("
  57. select k.ID
  58. , k.ID_PROJECT
  59. , k.A_STATUS
  60. , k.K_DATA_OTRZYM_KORESP
  61. , k.K_DATA_OTRZYMANEJ_KORESP
  62. , k.K_OD_KOGO
  63. , k.OD_KOGO_ADRES
  64. , k.K_ZAWARTOS
  65. from {$sqlTableZlecenia} k
  66. where k.CRM_LISTA_ZASOBOW_ID = {$this->_ID_ZASOB_ZAMOWIENIE}
  67. and k.ID_PROJECT = {$idProject}
  68. and k.K_TYP_KORESP in('OUT','WEW')
  69. ", $key = 'ID');
  70. $orders = array();
  71. foreach ($ordersRaw as $r) {
  72. $item = array();
  73. $chkd = ($r['ID'] == $idOrder) ? ' checked="checked"' : '';
  74. $item['ID'] = '<label style="white-space:nowrap"><input style="margin:0" type="radio" onClick="this.form.submit()" name="ID_ORDER" value="'.$r['ID'].'" '.$chkd.'> '.$r['ID'].'</label>';
  75. $item['Projekt'] = $r['ID_PROJECT'];
  76. $item['Status'] = $r['A_STATUS'];
  77. $item['K_DATA_OTRZYM_KORESP'] = $r['K_DATA_OTRZYM_KORESP'];
  78. $item['K_DATA_OTRZYMANEJ_KORESP'] = $r['K_DATA_OTRZYMANEJ_KORESP'];
  79. $item['K_OD_KOGO'] = $r['K_OD_KOGO'];
  80. $item['OD_KOGO_ADRES'] = $r['OD_KOGO_ADRES'];
  81. $item['K_ZAWARTOS'] = $r['K_ZAWARTOS'];
  82. $orders[] = $item;
  83. }
  84. $order = ($idOrder > 0 && array_key_exists($idOrder, $ordersRaw)) ? $ordersRaw[$idOrder] : null;
  85. UI::startContainer();
  86. if (1 != V::get('_print', '', $_GET)) {
  87. UI::startTag('form', ['action'=>'', 'method'=>'get']);
  88. UI::tag('input', ['type'=>'hidden', 'name'=>'_route', 'value'=>'UrlAction_ProjektyZamowieniaKosztorys']);
  89. UI::tag('input', ['type'=>'hidden', 'name'=>'ID_PROJECT', 'value'=>$idProject]);
  90. if (empty($orders)) UI::alert('info', "Brak zamówień w korespondencji dotyczących projektu {$idProject}");
  91. else UI::table(['caption'=>"Wybierz zamówienie/zlecenie", 'rows'=>$orders]);
  92. UI::endTag('form');
  93. UI::tag('hr');
  94. if (null != $order) {
  95. $printLink = Request::getPathUri() . "index.php?_route=UrlAction_ProjektyZamowieniaKosztorys";
  96. $printLink .= "&ID_PROJECT={$idProject}";
  97. $printLink .= "&ID_ORDER={$order['ID']}";
  98. $printLink .= "&_print=1";
  99. UI::startTag('div', ['style'=>'text-align:right']);
  100. UI::tag('a', ['_target'=>'blank', 'href'=>$printLink], '<i class="glyphicon glyphicon-print"></i>'. "Drukuj");
  101. UI::endTag('div');
  102. }
  103. }
  104. DBG::log($order, 'array', '$order');
  105. if (null !== $order) {
  106. $schema = ProjectKosztorysSchema::getSchema();// OK only 'config'
  107. $model = $this->getModel($idProject);
  108. $data = $this->getKosztorysData($idProject, $korespType = 'ZLECENIE', $idKoresp = $order['ID'], $admin = 0, $fetchAllRows = true);
  109. {
  110. $model = $this->getModel($idProject);
  111. //DBG::table("subProjectList", $model->subProjectList, __CLASS__, __FUNCTION__, __LINE__);
  112. $schema = ProjectKosztorysSchema::getSchema();
  113. // $projCosts = $this->getProjectCostByCennik($idProject, $idCompany);
  114. //DBG::_(true, true, "projCosts", $projCosts, __CLASS__, __FUNCTION__, __LINE__);
  115. UI::startTag('h1', ['style'=>'margin-bottom:1em']);
  116. echo "Zamówienie nr {$order['ID']}";
  117. UI::tag('small', ['style'=>"display:block"], $order['K_ZAWARTOS']);
  118. UI::endTag('h1');
  119. UI::setTitleJsTag("Zamówienie nr {$order['ID']} (Kosztorys projektu [{$idProject}])");
  120. echo UI::h('table', [ 'style' => "width:100%; margin-bottom: 12px" ], [
  121. UI::h('tr', [], [
  122. UI::h('th', [ 'style' => "padding-bottom: 8px; text-align:center" ], "ZLECENIE WEWNĘTRZNE PRAC BUDOWLANYCH BIALL-NET"),
  123. UI::h('th', [], ""),
  124. UI::h('th', [ 'style' => "padding-bottom: 8px; text-align:center" ], "PROTOKÓŁ ODBIORU PRAC BUDOWLANYCH BIALL-NET"),
  125. ]),
  126. UI::h('tr', [], [
  127. UI::h('td', [ 'style' => "width:44%; padding: 3px 6px; border: 1px solid #ddd; vertical-align:top" ], [
  128. UI::h('div', [], "NR KRESPONDENCJI: {$order['ID']}"),
  129. UI::h('div', [], "ADRES ZLECENIA: "),
  130. UI::h('div', [], "DATA ZLECENIA: "),
  131. UI::h('div', [], "WYKONAWCA/Y ZLECENIA: {$order['K_OD_KOGO']}"),
  132. UI::h('div', [], "ROZPOCZĘCIE PRAC: "),
  133. UI::h('div', [], "ZAKOŃCZENIE PRAC: "),
  134. UI::h('div', [], "PRACE ZLECA: {$order['ID']}"),
  135. UI::h('div', [], "PRACE PRZYJMUJE: "),
  136. ]),
  137. UI::h('td', [ 'style' => "width:10%" ], [
  138. ]),
  139. UI::h('td', [ 'style' => "width:44%; padding: 3px 6px; border: 1px solid #ddd; vertical-align:top" ], [
  140. UI::h('div', [], "NR KRESPONDENCJI: "),
  141. UI::h('div', [], "DATA ODBIORU: "),
  142. UI::h('div', [], "WYKONAWCA/Y ZLECENIA: "),
  143. UI::h('div', [], "ROZPOCZĘCIE PRAC: "),
  144. UI::h('div', [], "ZAKOŃCZENIE PRAC: "),
  145. UI::h('div', [], "PRACE PRZEKAZUJE: "),
  146. UI::h('div', [], "PRACE ODBIERA: "),
  147. UI::h('div', [], "UWAGI: <br><br>"),
  148. ]),
  149. ]),
  150. ]);
  151. $conf = $schema['config'];
  152. // [summary] => array(1) {
  153. // [22478] => array(2) {
  154. // [label] => string(14) "Rury osłonowe"
  155. // [data] => array(1) {
  156. // [48415] => array(6) {
  157. // [ID_PROJECT] => string(4) "6906"
  158. // [ilosc] => string(2) "10"
  159. // [type] => string(13) "1xHDPE 40/3,7"
  160. // [idType] => int(48415)
  161. // [idLayer] => int(22478)
  162. // [jednostka] => string(4) "METR"
  163. echo UI::h('div', [], array_map(function ($summary, $idLayer) use ($conf, $data, $order) {
  164. $rows = $data['summary'][$idLayer]['data'];
  165. $layer = $conf['layer'][$idLayer];
  166. $cols = [
  167. // 'primaryKey' => "Nr",// string(4) "6906" // grouped data by ID_ZASOB, so primaryKey is not correct
  168. 'ID_PROJECT' => "Nr projektu",// string(4) "6906"
  169. 'ilosc' => "ilosc",// string(2) "10"
  170. 'type' => "typ",// string(13) "1xHDPE 40/3,7"
  171. // 'idType' => "idType",// int(48415)
  172. // 'idLayer' => "idLayer",// int(22478)
  173. 'jednostka' => "jednostka",// string(4) "METR"
  174. ];
  175. $addCols = [];
  176. if ('Rozdzielcza_Kabel_Swiatlowodowy_wsg84' === $layer['tabela_name']) { // TODO: to config - additional columns
  177. $addCols['Suma_ZapasA'] = "Suma_ZapasA";
  178. $addCols['Suma_ZapasB'] = "Suma_ZapasB";
  179. }
  180. // $tableName = $layer['tabela_name'];
  181. // $cols = [];
  182. // if ('Rozdzielcza_rura_oslonowa_magistralna' === $tableName) {
  183. // $cols = [
  184. // 'ID' => "Nr",
  185. // 'ID_PROJECT' => "Nr projektu",
  186. // 'Dlugosc' => "Długość",
  187. // 'PROJECT_INFO_FULL' => "Nazwa",
  188. // ];
  189. // }
  190. // if ('Rozdzielcza_koszty_dodatkowe_wsg84' === $tableName) {
  191. // $cols = [
  192. // 'ID' => "Nr",
  193. // 'ID_PROJECT' => "Nr projektu",
  194. // 'Przeznaczenie' => "Przeznaczenie",
  195. // 'ilosc' => "Ilość",
  196. // 'ilosc' => "Ilość",
  197. // ];
  198. // }
  199. $allCols = array_merge($cols, $addCols);
  200. return UI::h('div', [], [
  201. UI::h('table', [ 'class' => "table table-bordered table-condensed", 'style' => "width:auto" ], [
  202. UI::h('thead', [], [
  203. UI::h('tr', [], [
  204. UI::h('td', [ 'colspan' => count($allCols), 'style' => "padding:0 6px; font-size:1.2em; line-height:2em" ], " &mdash; {$summary['label']}"),
  205. ]),
  206. UI::h('tr', [], array_map(function ($label, $fieldName) {
  207. return UI::h('th', [ 'style' => "padding:1px 3px" ], $label);
  208. }, $allCols, array_keys($allCols)))
  209. ]),
  210. UI::h('tbody', [], array_map(function ($row) use ($allCols) {
  211. return UI::h('tr', [], array_map(function ($label, $fieldName) use ($row) {
  212. return UI::h('td', [ 'style' => "padding:1px 3px" ], $row[$fieldName]);
  213. }, $allCols, array_keys($allCols)));
  214. }, $rows)),
  215. ])
  216. ]);
  217. }, $data['summary'], array_keys($data['summary'])));
  218. echo UI::h('div', [ 'style' => "border: 1px solid #ddd; padding: 3px 6px 120px 6px" ], "UWAGI - PRACE DODATKOWE:");
  219. }
  220. // if (DBG::isActive()) DBG::nicePrint($data, '$data');
  221. // if (DBG::isActive()) DBG::nicePrint($schema, '$schema');
  222. // if (DBG::isActive()) DBG::nicePrint($model, '$model');
  223. }
  224. // if (DBG::isActive()) UI::tag('hr');
  225. // if (DBG::isActive()) $this->checkDBData();
  226. UI::endContainer();
  227. }
  228. public function checkDBData() {
  229. $schema = ProjectKosztorysSchema::getSchema();// OK only 'config'
  230. foreach ($schema['config']['layer'] as $idLayer => $layer) {
  231. // <div class="panel panel-default">
  232. // <div class="panel-heading">Panel heading without title</div>
  233. // <div class="panel-body">
  234. // Panel content
  235. // </div>
  236. // </div>
  237. UI::startTag('div', ['class'=>'panel panel-default']);
  238. UI::startTag('div', ['class'=>'panel-heading']);
  239. echo "Warstwa: {$layer['label']}";
  240. UI::endTag('div');// .panel-heading
  241. UI::startTag('div', ['class'=>'panel-body']);
  242. try {
  243. $rowsByIdOrder = DB::getPDO()->fetchAllByKey("
  244. select g.ID_KORESP_ZLECENIE, g.cnt
  245. -- , k.ID
  246. , k.A_STATUS
  247. , k.K_DATA_OTRZYM_KORESP
  248. , k.K_DATA_OTRZYMANEJ_KORESP
  249. , k.K_OD_KOGO
  250. , k.OD_KOGO_ADRES
  251. , k.K_ZAWARTOS
  252. , k.CRM_LISTA_ZASOBOW_ID
  253. , k.ID_PROJECT
  254. , k.K_TYP_KORESP
  255. from (
  256. select t.ID_KORESP_ZLECENIE, count(1) as cnt
  257. from {$layer['tabela_name']} t
  258. where t.ID_KORESP_ZLECENIE is not null and t.ID_KORESP_ZLECENIE > 0
  259. group by t.ID_KORESP_ZLECENIE
  260. ) g
  261. left join IN7_DZIENNIK_KORESP k on(k.ID = g.ID_KORESP_ZLECENIE)
  262. ", $key = 'ID_KORESP_ZLECENIE');
  263. } catch (Exception $e) {
  264. DBG::log($e);
  265. if ("SQLSTATE[42S22]: Column not found: 1054 Unknown column 't.ID_KORESP_ZLECENIE' in 'field list'" == $e->getMessage()) {
  266. UI::alert('danger', "Brak komórki `ID_KORESP_ZLECENIE` w tabeli `{$layer['tabela_name']}`");
  267. } else UI::alert('danger', $e->getMessage());
  268. }
  269. if (empty($rowsByIdOrder)) UI::tag('span', ['class'=>'text-warning'], "Brak wypełnionego pola ID_KORESP_ZLECENIE w tej warstwie");
  270. else {
  271. $rowsByIdOrder = array_map(function($r) {
  272. $item = [];
  273. $item['id'] = $r['ID_KORESP_ZLECENIE'];
  274. $item['ile'] = $r['cnt'];
  275. $item['K_OD_KOGO'] = $r['K_OD_KOGO'];
  276. $item['OD_KOGO_ADRES'] = $r['OD_KOGO_ADRES'];
  277. $item['K_ZAWARTOS'] = $r['K_ZAWARTOS'];
  278. $item['Zasób?'] = (int)$r['CRM_LISTA_ZASOBOW_ID'];
  279. $item['id Proj.'] = (int)$r['ID_PROJECT'];
  280. $item['typ'] = $r['K_TYP_KORESP'];
  281. $item['daty'] = "{$r['K_DATA_OTRZYM_KORESP']}<br>{$r['K_DATA_OTRZYMANEJ_KORESP']}";
  282. if ($item['Zasób?'] <= 0) $item['Zasób?'] .= '<br><span class="label label-danger" title="Brak numeru zasobu - powinien być 24121">Brak</span>';
  283. else if (24121 != $item['Zasób?']) $item['Zasób?'] .= '<br><span class="label label-danger" title="Błędny numer zasobu - powinien być 24121">Błąd</span>';
  284. if ($item['id Proj.'] <= 0) $item['id Proj.'] .= '<br><span class="label label-danger" title="Brak id projektu">Brak</span>';
  285. if ('OUT' != $item['typ']) $item['typ'] .= '<br><span class="label label-danger" title="Błędny typ korespondencji - powinien być OUT">Błąd</span>';
  286. return $item;
  287. }, $rowsByIdOrder);
  288. UI::table(['caption'=>"Pole ID_KORESP_ZLECENIE", 'rows'=>$rowsByIdOrder]);
  289. }
  290. UI::endTag('div');// .panel-body
  291. UI::endTag('div');
  292. }
  293. }
  294. }