ProjektyProNetMediaBudget.php 56 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. Lib::loadClass('Typespecial');
  4. Lib::loadClass('TypespecialVariable');
  5. Lib::loadClass('Request');
  6. Lib::loadClass('Response');
  7. Lib::loadClass('UI');
  8. // - [ ] TODO: widoki zamówień wg statusu - ustalić dostępy za pomocą procesów
  9. // - [x] Typepsecial do Koresp.ORDER_NR
  10. /*
  11. DBG:
  12. &DBG_M_DIST_COST_PROJECT=10000
  13. &DBG_KONIEC_BUDOWY=2016-08-01
  14. */
  15. class Route_UrlAction_ProjektyProNetMediaBudget extends RouteBase {// TODO: UrlActionBase @see Route_UrlAction
  16. public function handleAuth() {
  17. if (!User::logged()) {
  18. User::authByRequest();
  19. }
  20. }
  21. /*
  22. Kwota planowana: `M_DIST_COST_PROJECT` Budżet projektu
  23. Zamówienie: sumy z CRM_LISTA_ZASOBOW_ORDERS (CRM_LISTA_ZASOBOW_OFFERS)
  24. zaliczki
  25. ilość pracowników / koszty pracownicze: powiązanie z raportami X współczynnik
  26. koszty sprzętu/ wynajmowany na budowie: rozdział na różne rodzaj sprzętu: koparka itp.
  27. koszty własne: naprawy sprzętu
  28. koszty materiałów
  29. osprzet
  30. dodatkowe koszty związane z nadwyżkami - rozbieżności odnośnie ustaleń
  31. dostęp dla zarządu i os. odp. kwota końcowa
  32. */
  33. public function defaultAction() {
  34. SE_Layout::gora();
  35. try {
  36. $viewParams = array();
  37. $viewParams['print_mode'] = (1 == V::get('_print', '', $_GET));
  38. if (!$viewParams['print_mode']) SE_Layout::menu();
  39. $data = array();
  40. $data['id_project'] = V::get('ID_PROJECT', 0, $_REQUEST, 'int');
  41. if (!$data['id_project']) throw new Exception("Error: Brak nr projektu!");
  42. $data = $this->setProps($data);
  43. $this->budgetView($data, $viewParams);
  44. } catch (Exception $e) {
  45. SE_Layout::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage());
  46. }
  47. SE_Layout::dol();
  48. }
  49. public function setProps($data) {
  50. $idProj = V::get('id_project', 0, $data, 'int');
  51. if (!$idProj) return $data;// throw errro?
  52. $data['budget'] = 0;
  53. $data['projectInfo'] = null;
  54. $data['projectLabel'] = '';
  55. $data['costs'] = array();
  56. $rows = DB::getPDO()->fetchAll("
  57. select p.ID
  58. , p.M_DIST_DESC
  59. , p.M_DIST_DEALNUM
  60. , p.M_DIST_COST_PROJECT
  61. , p.POCZATEK_UMOWY
  62. , p.KONIEC_BUDOWY
  63. , p.COST_OSPRZET
  64. , p.COST_MATERIALY
  65. from IN7_MK_BAZA_DYSTRYBUCJI p
  66. where p.A_STATUS not in('DELETED')
  67. and p.ID = {$idProj}
  68. ");
  69. if (empty($rows)) return $data;// throw errro?
  70. $data['projectInfo'] = $rows[0];
  71. $data['budget'] = V::get('M_DIST_COST_PROJECT', 0, $data['projectInfo']);
  72. $data['projectLabel'] = $data['projectInfo']['M_DIST_DESC'];
  73. $data['POCZATEK_UMOWY'] = V::get('POCZATEK_UMOWY', '', $data['projectInfo']);
  74. $data['KONIEC_BUDOWY'] = V::get('KONIEC_BUDOWY', '', $data['projectInfo']);
  75. $data['days_to_finish'] = null; // pozostało dni - // ilość dni wyliczana z różnicy dat [13513] KONIEC_BUDOWY - [13512] POCZATEK_UMOWY (raczej today)
  76. $data['budget'] = V::get('DBG_M_DIST_COST_PROJECT', $data['budget'], $_GET);// TODO: TEST
  77. $data['KONIEC_BUDOWY'] = V::get('DBG_KONIEC_BUDOWY', $data['KONIEC_BUDOWY'], $_GET);// TODO: TEST
  78. if ($data['KONIEC_BUDOWY']) {
  79. $dStart = new DateTime(date('Y-m-d'));
  80. $dEnd = new DateTime($data['KONIEC_BUDOWY']);
  81. $dDiff = $dStart->diff($dEnd);
  82. $data['days_to_finish'] = ('-' == $dDiff->format('%R')) ? -1 * $dDiff->days : $dDiff->days;
  83. }
  84. $data['COST_OSPRZET'] = V::get('COST_OSPRZET', 0, $data['projectInfo']);
  85. $data['COST_MATERIALY'] = V::get('COST_MATERIALY', 0, $data['projectInfo']);
  86. $data['ordersRaw'] = DB::getPDO()->fetchAll("
  87. select r.ID
  88. , r.ORDER_LABEL
  89. , r.ORDER_DATE
  90. , r.APPROVE_STATUS
  91. , sum(o.OFFER_PRICE_PER_UNIT * o.OFFER_QUANTITY) as SUM_NETTO
  92. from CRM_LISTA_ZASOBOW_ORDERS r
  93. left join CRM_LISTA_ZASOBOW_OFFERS o on(
  94. o.ID_ORDER = r.ID
  95. and (o.A_STATUS is null or o.A_STATUS not in('DELETED'))
  96. )
  97. where (r.A_STATUS is null or r.A_STATUS not in('DELETED'))
  98. and r.ID_PROJECT = {$idProj}
  99. and r.APPROVE_STATUS in('ZATWIERDZONE', 'OCZEKUJE_ZATWIERDZENIA', 'OCZEKUJE_OSTATECZNEGO_ZATWIERDZENIA')
  100. group by r.ID
  101. ");
  102. $toFindKoresp = array();// Order.ID => Order.label
  103. {
  104. $idx = 0;
  105. foreach ($data['ordersRaw'] as $idxOrders => $order) {
  106. $idOrder = $order['ID'];
  107. $labelOrder = $order['ORDER_LABEL'];
  108. $toFindKoresp[$idOrder] = $labelOrder;
  109. if (count($data['costs']) < $idxOrders + 1) {
  110. $data['costs'][] = array(
  111. '_type'=>'order',
  112. 'data'=>$order['ORDER_DATE'],
  113. 'order_approve_status'=>$order['APPROVE_STATUS'],
  114. 'order_cost'=>$order['SUM_NETTO'],
  115. 'order_nr'=>$labelOrder,
  116. 'nr_fv_do_zamowienia'=>array(),
  117. 'sum'=>$order['SUM_NETTO'],
  118. 'orderRaw'=>$order
  119. );
  120. }
  121. }
  122. if (!empty($toFindKoresp)) {// TODO: find fv nr - from Koresp. (nr_fv_do_zamowienia) - Koresp.ORDER_NR
  123. $sqlOrderLabels = array();
  124. foreach ($toFindKoresp as $idOrder => $labelOrder) {
  125. $sqlOrderLabels[] = "'{$labelOrder}'";
  126. }
  127. $sqlOrderLabels = implode(",", $sqlOrderLabels);
  128. // TODO: tylko określone typy z Koresp?
  129. // TODO: co jeśli brakuje obcy_nr_koresp(`K_NR_OTRZYM_KORESP`) - ID?
  130. $data['fvToOrdersRaw'] = DB::getPDO()->fetchAll("
  131. select k.ID
  132. , k.ORDER_NR
  133. , k.K_NR_OTRZYM_KORESP as obcy_nr_koresp
  134. , k.COST_VALUE as cost
  135. from IN7_DZIENNIK_KORESP k
  136. where k.A_STATUS != 'DELETED'
  137. and k.ORDER_NR in({$sqlOrderLabels})
  138. ");
  139. foreach ($data['fvToOrdersRaw'] as $fv) {
  140. $labelOrder = $fv['ORDER_NR'];
  141. foreach ($data['costs'] as $idx => $cost) {
  142. // if ('order' == $cost['_type'] && 'ZATWIERDZONE' == $cost['order_approve_status']) // TEST
  143. // OCZEKUJE_ZATWIERDZENIA, OCZEKUJE_OSTATECZNEGO_ZATWIERDZENIA
  144. if ('order' == $cost['_type'] && $labelOrder == $cost['order_nr']) {
  145. $idKoresp = $fv['ID'];
  146. // $cost['nr_fv_do_zamowienia'][$idKoresp] = $fv['obcy_nr_koresp'];
  147. $data['costs'][$idx]['nr_fv_do_zamowienia'][] = array('id'=>$idKoresp, 'nr'=>$fv['obcy_nr_koresp'], 'cost'=>$fv['cost']);
  148. }
  149. }
  150. }
  151. }
  152. {// PROJECT_COSTS
  153. $data['projectCostsRaw'] = DB::getPDO()->fetchAll("
  154. select c.ID
  155. , c.ID_PROJECT
  156. , c.COST_DATE
  157. , c.COST_VALUE
  158. , c.COST_TYPE
  159. from PROJECT_COSTS c
  160. where (c.A_STATUS is null or c.A_STATUS not in('DELETED'))
  161. and c.ID_PROJECT = {$idProj}
  162. order by c.COST_DATE ASC, c.ID ASC
  163. ");
  164. foreach ($data['projectCostsRaw'] as $projCost) {
  165. $item = array(
  166. '_type'=>'project_cost',
  167. 'data'=>$projCost['COST_DATE'],
  168. 'sum'=>$projCost['COST_VALUE'],
  169. 'costRaw'=>$projCost
  170. );
  171. switch ($projCost['COST_TYPE']) {
  172. case 'ANEKS': $item['budget_aneks'] = (float)$projCost['COST_VALUE']; break;
  173. case 'KARY': $item['budget_kary'] = (float)$projCost['COST_VALUE']; break;
  174. case 'OSPRZET': $item['budget_osprzet'] = (float)$projCost['COST_VALUE']; break;
  175. case 'MATERIALY': $item['budget_materialy'] = (float)$projCost['COST_VALUE']; break;
  176. case 'PRACOWNICY': $item['budget_koszt_pracownikow'] = (float)$projCost['COST_VALUE']; break;
  177. case 'PODWYKONAWCY': $item['budget_koszt_podwykonawcow'] = (float)$projCost['COST_VALUE']; break;
  178. case 'REPREZENTACYJNE': $item['budget_koszt_reprezentacyjny'] = (float)$projCost['COST_VALUE']; break;
  179. case 'ZALICZKA_KWOTA': $item['budget_zaliczki'] = (float)$projCost['COST_VALUE']; break;
  180. case 'ZALICZKA_KOSZTY_DZIENNE': $item['budget_rozliczone_zaliczki'] = (float)$projCost['COST_VALUE']; break;
  181. case 'ZGODY_SLUZEBNOSCI': $item['budget_zgoda_sluzebnosci'] = (float)$projCost['COST_VALUE']; break;
  182. case 'ZGODY_ODSZKODOWANIA': $item['budget_zgoda_odszkodowania'] = (float)$projCost['COST_VALUE']; break;
  183. case 'SPRZET_WLASNY': $item['budget_sprzet_wlasny'] = (float)$projCost['COST_VALUE']; break;
  184. case 'SPRZET_WYNAJETY': $item['budget_sprzet_wynajety'] = (float)$projCost['COST_VALUE']; break;
  185. case 'ORGANIZACJA_RUCHU': $item['budget_organizacja_ruchu'] = (float)$projCost['COST_VALUE']; break;
  186. case 'ZAJETOSC_PASA': $item['budget_zajetosc_pasa'] = (float)$projCost['COST_VALUE']; break;
  187. }
  188. $data['costs'][] = $item;
  189. }
  190. }
  191. $data['profitFvRaw'] = DB::getPDO()->fetchAll("
  192. select k.ID
  193. , k.K_DATA_OTRZYMANEJ_KORESP as data
  194. , k.K_NR_OTRZYM_KORESP as obcy_nr_koresp
  195. , k.INCOME_VALUE as profit
  196. from IN7_DZIENNIK_KORESP k
  197. where k.A_STATUS != 'DELETED'
  198. and k.INCOME_VALUE != 0
  199. and k.K_TYP_KORESP = 'OUT'
  200. and k.ID_PROJECT = '{$idProj}'
  201. ");
  202. foreach ($data['profitFvRaw'] as $fv) {
  203. $item = array(
  204. '_type' => 'profit_fv',
  205. 'data' => $fv['data'],
  206. 'sum' => 0,
  207. 'profit_fv_value' => $fv['profit'],
  208. 'label' => (!empty($fv['obcy_nr_koresp'])) ? $fv['obcy_nr_koresp'] : $fv['ID'],
  209. 'costRaw' => $fv
  210. );
  211. $data['costs'][] = $item;
  212. }
  213. if (V::get('DBG_PROFIT_FV', '', $_GET)>0) {// DBG
  214. $data['costs'][] = array('_type'=>'profit_fv', 'data'=>date("Y-m-d"), 'profit_fv_value'=>100000, 'sum'=>-100000, 'label'=>"TEST/FV/1", 'costRaw'=>array());// TODO: DBG
  215. $data['costs'][] = array('_type'=>'profit_fv', 'data'=>date("Y-m-d"), 'profit_fv_value'=>150000, 'sum'=>-150000, 'label'=>"TEST/FV/2", 'costRaw'=>array());// TODO: DBG
  216. $data['costs'][] = array('_type'=>'profit_fv', 'data'=>'2016-09-01', 'profit_fv_value'=>10000, 'sum'=>-10000, 'label'=>"TEST/FV/3", 'costRaw'=>array());// TODO: DBG
  217. }
  218. // order $data['costs'] by `data`, then by `ID` for the same `_type` else: order, project_cost, koresp
  219. usort($data['costs'], function($a, $b) {
  220. if ($a['data'] == $b['data']) {
  221. if ($a['_type'] == $b['_type']) {
  222. if ('project_cost' == $a['_type']) {
  223. return ($a['costRaw']['ID'] < $b['costRaw']['ID']) ? -1 : 1;
  224. }
  225. if ('order' == $a['_type']) {
  226. return ($a['orderRaw']['ID'] < $b['orderRaw']['ID']) ? -1 : 1;
  227. }
  228. return 0;
  229. }
  230. $oa = 999; $ob = 999;
  231. if ('order' == $a['_type']) $oa = 1;
  232. else if ('project_cost' == $a['_type']) $oa = 2;
  233. if ('order' == $b['_type']) $ob = 1;
  234. else if ('project_cost' == $b['_type']) $ob = 2;
  235. return ($oa < $ob) ? -1 : 1;
  236. }
  237. return ($a['data'] < $b['data']) ? -1 : 1;
  238. });
  239. $budget = $data['budget'];
  240. foreach ($data['costs'] as $idx => $cost) {
  241. // TODO: fix - `cost_wynajem` pewnie będzie częścią z zamówienia - minus od project COST_OSPRZET
  242. // TODO: fix - `cost_materialy` pewnie będzie częścią z zamówienia - minus od project COST_MATERIALY
  243. // TODO: cost_wynajem i cost_materialy - edit in this table - cost may be verified by fv, etc.
  244. $sum = $cost['sum'];
  245. $budget -= $sum;
  246. $data['costs'][$idx]['budget_minus_sum'] = $budget;
  247. }
  248. }
  249. return $data;
  250. }
  251. public function getWidgetProject() {// mv to Route_UrlAction_ProjektyProNetMediaZamZlec, use Router::getRoute('UrlAction_ProjektyProNetMediaZamZlec')->getWidgetProject()
  252. $widgetProject = array();
  253. $widgetProject['idTabela'] = 1656;// TODO: idZasob for TABELA Projekty
  254. $widgetProject['idKomorka'] = 1658;// TODO: idZasob for KOMORKA Projekty.P_ID
  255. $widgetProject['fieldName'] = 'ID_PROJECT';
  256. $widgetProject['dataUrl'] = "index.php?_route=UrlAction_ProjektyProNetMediaZamZlec&_task=typespecial&fld={$widgetProject['fieldName']}";
  257. $widgetProject['typeSpecial'] = null;
  258. try {
  259. $acl = User::getAcl()->getObjectAcl('default_db', 'IN7_MK_BAZA_DYSTRYBUCJI');
  260. $acl->init($force = false);
  261. $widgetProject['typeSpecial'] = Typespecial::getInstance($widgetProject['idKomorka'], $colName = $widgetProject['fieldName']);
  262. } catch (Exception $e) {
  263. }
  264. return $widgetProject;
  265. }
  266. public function budgetView($data, $viewParams) {
  267. $styleZyskStrata = 'color: black';
  268. if ($data['TODO__sum_zysk_strata'] > 0) $styleZyskStrata = 'color:green';
  269. if ($data['TODO__sum_zysk_strata'] < 0) $styleZyskStrata = 'color:red';
  270. $costs = $data['costs'];
  271. DBG::_('DBG', '>2', 'costs', $costs, __CLASS__, __FUNCTION__, __LINE__);
  272. $widgetProject = $this->getWidgetProject();
  273. ?>
  274. <div class="container">
  275. <div class="row">
  276. <div class="col-md-3" style="padding-top:6px">
  277. <?php if (!$viewParams['print_mode']) : ?>
  278. <a class="btn btn-primary"
  279. href="index.php?_route=UrlAction_ProjektyProNetMediaBudget&ID_PROJECT=<?php echo $data['id_project']; ?>&_print=1"
  280. target="_blank">drukuj</a>
  281. <?php endif; ?>
  282. </div>
  283. <div class="col-md-7">
  284. <?php if (!$viewParams['print_mode']) : ?>
  285. <form method="get" class="form-inline">
  286. <input type="hidden" name="_route" value="UrlAction_ProjektyProNetMediaBudget">
  287. <div class="form-group" style="padding-top:6px">
  288. <label>Inny projekt:</label>
  289. </div>
  290. <div class="form-group" style="padding-top:6px">
  291. <?php if ($widgetProject['typeSpecial']) : ?>
  292. <?php
  293. $fName = $widgetProject['fieldName'];
  294. $fldParams = array();
  295. $fldParams['allowCreate'] = false;
  296. $fldParams['ajaxDataUrlBase'] = $widgetProject['dataUrl'];
  297. if ($data['id_project'] > 0) {
  298. $tsValues = $widgetProject['typeSpecial']->getValuesWithExports($q = $data['id_project']);
  299. if (!empty($tsValues[ $data['id_project'] ])) {
  300. $fldParams['typespecialValue'] = $tsValues[ $data['id_project'] ]->param_out;
  301. }
  302. }
  303. //$fldParams['ajaxDataUrlBase'] .= "&DBG_TS=3";
  304. echo $widgetProject['typeSpecial']->showFormItem($idTbl = $widgetProject['idTabela'], $fName, $selValue = $data['id_project'], $fldParams);
  305. ?>
  306. <?php else : ?>
  307. <input type="number" name="<?= $widgetProject['fieldName']; ?>" value="<?= $data['id_project']; ?>" class="form-control">
  308. <?php endif; ?>
  309. </div>
  310. <input type="submit" value="Wybierz" class="btn btn-primary">
  311. </form>
  312. <?php endif; ?>
  313. </div>
  314. <div class="col-md-2" style="text-align:right">
  315. <?php echo date("Y-m-d"); ?>
  316. </div>
  317. </div>
  318. <h3>Projekt: <?php echo $data['projectLabel']; ?></h3>
  319. <table class="table table-bordered">
  320. <thead>
  321. <tr>
  322. <td rowspan="5" colspan="1" style="width:80px; text-align:center; vertical-align:middle">data</td>
  323. <td rowspan="1" colspan="6" style="padding:0">
  324. <table class="table table-bordered" style="width:100%; margin:0; border:0">
  325. <tr>
  326. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle; border-top:0; border-left:0">data rozpoczęcia umowy</td>
  327. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle; border-top:0">data zakończenia umowy</td>
  328. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle; border-top:0">pozostało dni:</td>
  329. <td rowspan="2" colspan="1" style="text-align:center; vertical-align:middle; border-top:0; border-right:0; border-bottom:0">Wartość kosztorysu</td>
  330. </tr>
  331. <tr>
  332. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle; border-bottom:0; border-left:0"><?php echo $data['POCZATEK_UMOWY']; ?></td>
  333. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle; border-bottom:0"><?php echo $data['KONIEC_BUDOWY']; ?></td>
  334. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle; border-bottom:0"><?php echo $data['days_to_finish']; ?></td>
  335. </tr>
  336. </table>
  337. </td>
  338. <td rowspan="2" colspan="2" style="text-align:center; vertical-align:middle">ROBOCIZNA</td>
  339. <td rowspan="4" colspan="1" style="text-align:center; vertical-align:middle; border-bottom:none">Koszty dodatkowe (reprezentacyjne)</td>
  340. <td rowspan="3" colspan="2" style="text-align:center; vertical-align:middle">Zamówienia</td>
  341. <td rowspan="3" colspan="2" style="text-align:center; vertical-align:middle">Zaliczki</td>
  342. <td rowspan="3" colspan="2" style="text-align:center; vertical-align:middle">Zgody wejścia w teren</td>
  343. <td rowspan="3" colspan="2" style="text-align:center; vertical-align:middle">Wynajem sprzętu</td>
  344. <td rowspan="3" colspan="2" style="text-align:center; vertical-align:middle">Koszty projektu</td>
  345. </tr>
  346. <tr>
  347. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle">Sprzedaż</td>
  348. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle">Kwota Umowy (netto)</td>
  349. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle">Aneks (netto)</td>
  350. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle">kary, potrącenia (netto)</td>
  351. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle">Osprzęt</td>
  352. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle">Materiały</td>
  353. </tr>
  354. <tr>
  355. <th rowspan="2" colspan="1" style="text-align:center; vertical-align:middle; white-space:nowrap; border-bottom:none">
  356. <span id="p5Budget__profit_fv" style="font-size:11px; font-weight:normal; white-space:nowrap"></span>
  357. <span id="p5Budget__profit_fv_percent" style="display:block; white-space:nowrap; font-size:11px; font-weight:normal; color:#666"></span>
  358. </th>
  359. <th rowspan="2" colspan="1" style="text-align:center; vertical-align:middle; white-space:nowrap; border-bottom:none"><?php echo UI::price($data['budget']); ?><br><span id="p5Budget__zysk_strata" style="font-size:11px; font-weight:normal; white-space:nowrap"></span></th>
  360. <th rowspan="2" colspan="1" style="text-align:center; vertical-align:middle; white-space:nowrap; border-bottom:none" id="p5Budget__aneks"></th>
  361. <th rowspan="2" colspan="1" style="text-align:center; vertical-align:middle; white-space:nowrap; border-bottom:none" id="p5Budget__kary"></th>
  362. <th rowspan="2" colspan="1" style="text-align:center; vertical-align:middle; white-space:nowrap; border-bottom:none"><?php echo UI::price($data['COST_OSPRZET']); ?><br><span id="p5Budget__osprzet_zysk_strata" style="font-size:11px; font-weight:normal; white-space:nowrap"></span></th>
  363. <th rowspan="2" colspan="1" style="text-align:center; vertical-align:middle; white-space:nowrap; border-bottom:none"><?php echo UI::price($data['COST_MATERIALY']); ?><br><span id="p5Budget__materialy_zysk_strata" style="font-size:11px; font-weight:normal; white-space:nowrap"></span></th>
  364. <td rowspan="2" colspan="1" style="text-align:center; vertical-align:middle; border-bottom:none">koszty pracowników</td>
  365. <td rowspan="2" colspan="1" style="text-align:center; vertical-align:middle; border-bottom:none">koszt firmy podwykonawczej</td>
  366. </tr>
  367. <tr>
  368. <!-- <td rowspan="2" colspan="1" style="text-align:center; vertical-align:middle; white-space:nowrap; <?php echo $styleZyskStrata; ?>"><?php echo UI::price($data['TODO__sum_zysk_strata']); ?></td> -->
  369. <td rowspan="2" colspan="1" style="text-align:center; vertical-align:middle">numer zamówienia (kwota netto)</td>
  370. <td rowspan="2" colspan="1" style="text-align:center; vertical-align:middle">numer faktury kwota po weryfikacji</td>
  371. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle; border-bottom:none">zaliczka kwota</td>
  372. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle; border-bottom:none">rozliczanie zaliczki koszty dzienne</td>
  373. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle; border-bottom:none">służebności</td>
  374. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle; border-bottom:none">odszkodowania</td>
  375. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle; border-bottom:none">Sprzęt własny</td>
  376. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle; border-bottom:none">Sprzęt wynajęty</td>
  377. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle; border-bottom:none">organizacja ruchu</td>
  378. <td rowspan="1" colspan="1" style="text-align:center; vertical-align:middle; border-bottom:none">zajętość pasa drogowego</td>
  379. </tr>
  380. <tr>
  381. <td rowspan="1" colspan="1" style="padding:0; text-align:center; vertical-align:middle; border-top:none"></td>
  382. <td rowspan="1" colspan="1" style="padding:0; text-align:center; vertical-align:middle; border-top:none"></td>
  383. <td rowspan="1" colspan="1" style="padding:0; text-align:center; vertical-align:middle; border-top:none"><button onClick="return p5UI__Clickable(this, 'p5:Budget:addCost', {type: 'ANEKS'})" class="btn btn-link" style="padding:0"><i class="glyphicon glyphicon-plus-sign"></i></button></td>
  384. <td rowspan="1" colspan="1" style="padding:0; text-align:center; vertical-align:middle; border-top:none"><button onClick="return p5UI__Clickable(this, 'p5:Budget:addCost', {type: 'KARY'})" class="btn btn-link" style="padding:0"><i class="glyphicon glyphicon-plus-sign"></i></button></td>
  385. <td rowspan="1" colspan="1" style="padding:0; text-align:center; vertical-align:middle; border-top:none"><button onClick="return p5UI__Clickable(this, 'p5:Budget:addCost', {type: 'OSPRZET'})" class="btn btn-link" style="padding:0"><i class="glyphicon glyphicon-plus-sign"></i></button></td>
  386. <td rowspan="1" colspan="1" style="padding:0; text-align:center; vertical-align:middle; border-top:none"><button onClick="return p5UI__Clickable(this, 'p5:Budget:addCost', {type: 'MATERIALY'})" class="btn btn-link" style="padding:0"><i class="glyphicon glyphicon-plus-sign"></i></button></td>
  387. <td rowspan="1" colspan="1" style="padding:0; text-align:center; vertical-align:middle; border-top:none"><button onClick="return p5UI__Clickable(this, 'p5:Budget:addCost', {type: 'PRACOWNICY'})" class="btn btn-link" style="padding:0"><i class="glyphicon glyphicon-plus-sign"></i></button></td>
  388. <td rowspan="1" colspan="1" style="padding:0; text-align:center; vertical-align:middle; border-top:none"><button onClick="return p5UI__Clickable(this, 'p5:Budget:addCost', {type: 'PODWYKONAWCY'})" class="btn btn-link" style="padding:0"><i class="glyphicon glyphicon-plus-sign"></i></button></td>
  389. <td rowspan="1" colspan="1" style="padding:0; text-align:center; vertical-align:middle; border-top:none"><button onClick="return p5UI__Clickable(this, 'p5:Budget:addCost', {type: 'REPREZENTACYJNE'})" class="btn btn-link" style="padding:0"><i class="glyphicon glyphicon-plus-sign"></i></button></td>
  390. <td rowspan="1" colspan="1" style="padding:0; text-align:center; vertical-align:middle; border-top:none"><button onClick="return p5UI__Clickable(this, 'p5:Budget:addCost', {type: 'ZALICZKA_KWOTA'})" class="btn btn-link" style="padding:0"><i class="glyphicon glyphicon-plus-sign"></i></button></td>
  391. <td rowspan="1" colspan="1" style="padding:0; text-align:center; vertical-align:middle; border-top:none"><button onClick="return p5UI__Clickable(this, 'p5:Budget:addCost', {type: 'ZALICZKA_KOSZTY_DZIENNE'})" class="btn btn-link" style="padding:0"><i class="glyphicon glyphicon-plus-sign"></i></button></td>
  392. <td rowspan="1" colspan="1" style="padding:0; text-align:center; vertical-align:middle; border-top:none"><button onClick="return p5UI__Clickable(this, 'p5:Budget:addCost', {type: 'ZGODY_SLUZEBNOSCI'})" class="btn btn-link" style="padding:0"><i class="glyphicon glyphicon-plus-sign"></i></button></td>
  393. <td rowspan="1" colspan="1" style="padding:0; text-align:center; vertical-align:middle; border-top:none"><button onClick="return p5UI__Clickable(this, 'p5:Budget:addCost', {type: 'ZGODY_ODSZKODOWANIA'})" class="btn btn-link" style="padding:0"><i class="glyphicon glyphicon-plus-sign"></i></button></td>
  394. <td rowspan="1" colspan="1" style="padding:0; text-align:center; vertical-align:middle; border-top:none"><button onClick="return p5UI__Clickable(this, 'p5:Budget:addCost', {type: 'SPRZET_WLASNY'})" class="btn btn-link" style="padding:0"><i class="glyphicon glyphicon-plus-sign"></i></button></td>
  395. <td rowspan="1" colspan="1" style="padding:0; text-align:center; vertical-align:middle; border-top:none"><button onClick="return p5UI__Clickable(this, 'p5:Budget:addCost', {type: 'SPRZET_WYNAJETY'})" class="btn btn-link" style="padding:0"><i class="glyphicon glyphicon-plus-sign"></i></button></td>
  396. <td rowspan="1" colspan="1" style="padding:0; text-align:center; vertical-align:middle; border-top:none"><button onClick="return p5UI__Clickable(this, 'p5:Budget:addCost', {type: 'ORGANIZACJA_RUCHU'})" class="btn btn-link" style="padding:0"><i class="glyphicon glyphicon-plus-sign"></i></button></td>
  397. <td rowspan="1" colspan="1" style="padding:0; text-align:center; vertical-align:middle; border-top:none"><button onClick="return p5UI__Clickable(this, 'p5:Budget:addCost', {type: 'ZAJETOSC_PASA'})" class="btn btn-link" style="padding:0"><i class="glyphicon glyphicon-plus-sign"></i></button></td>
  398. </tr>
  399. </thead>
  400. <tbody id="p5Budget__costs"></tbody>
  401. </table>
  402. </div>
  403. <link rel="stylesheet" href="static/sweetalert2.min.css" type="text/css">
  404. <script src="static/sweetalert2.min.js"></script>
  405. <script>
  406. (function(){
  407. var _saveAddCostLink = '<?php echo Request::getPathUri(); ?>index.php?_route=UrlAction_ProjektyProNetMediaBudget&_task=addCostAjax&ID_PROJECT=<?php echo $data['id_project']; ?>';
  408. var _saveEditCostLink = '<?php echo Request::getPathUri(); ?>index.php?_route=UrlAction_ProjektyProNetMediaBudget&_task=editCostAjax&ID_PROJECT=<?php echo $data['id_project']; ?>';
  409. var _dbg = <?php echo V::get('DBG', 0, $_REQUEST, 'int'); ?>;
  410. var _initCosts = <?php echo json_encode($costs); ?>;
  411. var _initBudgetValue = <?php echo ($data['budget']) ? $data['budget'] : 0; ?>;
  412. var _initOsprzetValue = <?php echo ($data['COST_OSPRZET']) ? $data['COST_OSPRZET'] : 0; ?>;
  413. var _initMaterialyValue = <?php echo ($data['COST_MATERIALY']) ? $data['COST_MATERIALY'] : 0; ?>;
  414. if (_initCosts) {
  415. budget__renderCosts(_initCosts);
  416. }
  417. function budget__renderCosts(costs) {
  418. var _tbody = document.getElementById('p5Budget__costs');
  419. if (!_tbody) throw "Missing node #p5Budget__costs";
  420. if(_dbg)console.log('render costs: ', costs);
  421. function budget__renderNodePrice(idNode, value) {
  422. budget__renderNodeText(idNode, p5Utils__pricePrintPL(value), '0,00')
  423. }
  424. function budget__renderNodeText(idNode, value, defaultValue) {
  425. if (!idNode) return;
  426. var node = document.getElementById(idNode);
  427. if (!node) return;
  428. var defaultValue = defaultValue || ''
  429. p5Utils__clearNode(node);
  430. if (value != 0) node.appendChild(document.createTextNode(value));
  431. else node.appendChild(document.createTextNode(defaultValue));
  432. }
  433. function budget__renderZyskStrataPrice(idNode, value) {
  434. var node = document.getElementById(idNode);
  435. if(_dbg)console.log('budget__renderZyskStrataPrice('+idNode+') value: ', value, 'node', node);
  436. var sign = '';
  437. if (value > 0) {
  438. sign = '+';
  439. node.style.color = '#009600';
  440. } else {
  441. sign = '';
  442. node.style.color = '#f00';
  443. }
  444. p5Utils__clearNode(node);
  445. node.appendChild(document.createTextNode(sign + '' + p5Utils__pricePrintPL(value)));
  446. }
  447. {
  448. var budgetZyskStrata = costs.reduce(function (prevValue, currCost) {
  449. return currCost['budget_minus_sum'];// get last value - calculated in php
  450. }, _initBudgetValue);
  451. budget__renderZyskStrataPrice('p5Budget__zysk_strata', budgetZyskStrata);
  452. }
  453. {
  454. var osprzetZyskStrata = _initOsprzetValue - costs.reduce(function (prevValue, currCost) {
  455. if (!currCost['budget_osprzet']) return prevValue;
  456. return prevValue + currCost['budget_osprzet'];
  457. }, 0);
  458. if(_dbg)console.log('osprzetZyskStrata: _initOsprzetValue', _initOsprzetValue, 'osprzetZyskStrata', osprzetZyskStrata);
  459. budget__renderZyskStrataPrice('p5Budget__osprzet_zysk_strata', osprzetZyskStrata);
  460. }
  461. {
  462. var materialyZyskStrata = _initMaterialyValue - costs.reduce(function (prevValue, currCost) {
  463. if (!currCost['budget_materialy']) return prevValue;
  464. return prevValue + currCost['budget_materialy'];
  465. }, 0);
  466. if(_dbg)console.log('materialyZyskStrata: _initMaterialyValue', _initMaterialyValue, 'materialyZyskStrata', materialyZyskStrata);
  467. budget__renderZyskStrataPrice('p5Budget__materialy_zysk_strata', materialyZyskStrata);
  468. }
  469. {
  470. var aneksValue = costs.reduce(function (prevValue, currCost) {
  471. if (!currCost['budget_aneks']) return prevValue;
  472. return prevValue + currCost['budget_aneks'];
  473. }, 0);
  474. if(_dbg)console.log('aneksValue', aneksValue);
  475. // budget__renderNodePrice('p5Budget__aneks', aneksValue);
  476. budget__renderZyskStrataPrice('p5Budget__aneks', -1 * aneksValue);
  477. }
  478. {
  479. var karyValue = costs.reduce(function (prevValue, currCost) {
  480. if (!currCost['budget_kary']) return prevValue;
  481. return prevValue + currCost['budget_kary'];
  482. }, 0);
  483. if(_dbg)console.log('karyValue', karyValue);
  484. budget__renderNodePrice('p5Budget__kary', karyValue);
  485. }
  486. {
  487. var profitFvValue = costs.reduce(function (prevValue, currCost) {
  488. if ('profit_fv' != currCost['_type']) return prevValue;
  489. return p5Utils__parseFloatOrZero(prevValue) + p5Utils__parseFloatOrZero(currCost['profit_fv_value']);
  490. }, 0);
  491. if(_dbg)console.log('profitFvValue', profitFvValue);
  492. budget__renderNodePrice('p5Budget__profit_fv', profitFvValue)
  493. var budgetPercent = p5Utils__parseFloatOrZero(_initBudgetValue) + (-1 * aneksValue)
  494. if (profitFvValue > 0 && budgetPercent > 0) {
  495. var profitFvPercent = Math.round((profitFvValue * 100) / budgetPercent)
  496. budget__renderNodeText('p5Budget__profit_fv_percent', '' + profitFvPercent + '%')
  497. }
  498. }
  499. p5Utils__clearNode(_tbody);
  500. var costNodes = costs.map(function(cost) {
  501. var costNode = document.createElement('tr')
  502. var tdNode = null
  503. // <td style="white-space:nowrap"><?php echo $cost['data']; ?></td>
  504. tdNode = document.createElement('td')
  505. p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap'})
  506. tdNode.appendChild(document.createTextNode(cost['data']))
  507. costNode.appendChild(tdNode)
  508. // <td><?php echo UI::price($cost['budget_profit_fv']); ?></td>
  509. tdNode = document.createElement('td')
  510. p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: '#999'})
  511. tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['profit_fv_value'], '0,00')))
  512. if ('profit_fv' == cost['_type']) {
  513. // <div style="white-space: nowrap; color: rgb(153, 153, 153);">nr: 131/MKL/8/2016/9/VIII/2016</div>
  514. var cellProfitFvNode = document.createElement('a')
  515. p5Utils__nodeStyle(cellProfitFvNode, {display: 'block', color: '#999', fontSize: 'x-small', textDecoration: 'underline', whiteSpace: 'nowrap'})
  516. cellProfitFvNode.appendChild(document.createTextNode('FV: ' + cost['label']))
  517. cellProfitFvNode.setAttribute('href', '<?= Request::getPathUri(); ?>index.php?_route=ViewTableAjax&typeName=p5_default_db:IN7_DZIENNIK_KORESP#FILES/' + cost['costRaw']['ID'])
  518. tdNode.appendChild(cellProfitFvNode)
  519. }
  520. costNode.appendChild(tdNode)
  521. // <td><?php echo UI::price($cost['budget_minus_sum']); ?></td>
  522. tdNode = document.createElement('td')
  523. tdNode.setAttribute('style', 'white-space:nowrap')
  524. tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_minus_sum'], '0,00')))
  525. costNode.appendChild(tdNode)
  526. // <td style="color:<?php echo ($cost['budget_aneks']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_aneks']); ?></td>
  527. tdNode = document.createElement('td')
  528. if (cost['budget_aneks']) {
  529. tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'ANEKS', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_aneks'] + "})");
  530. }
  531. p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_aneks']) ? 'black' : 'silver')})
  532. tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_aneks'], '0,00')))
  533. costNode.appendChild(tdNode)
  534. // <td style="color:<?php echo ($cost['budget_kary']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_kary']); ?></td>
  535. tdNode = document.createElement('td')
  536. if (cost['budget_kary']) {
  537. tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'KARY', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_kary'] + "})");
  538. }
  539. p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_kary']) ? 'black' : 'silver')})
  540. tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_kary'], '0,00')))
  541. costNode.appendChild(tdNode)
  542. // <td style="color:<?php echo ($cost['budget_osprzet']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_osprzet']); ?></td>
  543. tdNode = document.createElement('td')
  544. if (cost['budget_osprzet']) {
  545. tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'OSPRZET', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_osprzet'] + "})");
  546. }
  547. p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_osprzet']) ? 'black' : 'silver')})
  548. tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_osprzet'], '0,00')))
  549. costNode.appendChild(tdNode)
  550. // <td style="color:<?php echo ($cost['budget_materialy']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_materialy']); ?></td>
  551. tdNode = document.createElement('td')
  552. if (cost['budget_materialy']) {
  553. tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'MATERIALY', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_materialy'] + "})");
  554. }
  555. p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_materialy']) ? 'black' : 'silver')})
  556. tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_materialy'], '0,00')))
  557. costNode.appendChild(tdNode)
  558. // <td style="color:<?php echo ($cost['budget_koszt_pracownikow']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_koszt_pracownikow']); ?></td>
  559. tdNode = document.createElement('td')
  560. if (cost['budget_koszt_pracownikow']) {
  561. tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'PRACOWNICY', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_koszt_pracownikow'] + "})");
  562. }
  563. p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_koszt_pracownikow']) ? 'black' : 'silver')})
  564. tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_koszt_pracownikow'], '0,00')))
  565. costNode.appendChild(tdNode)
  566. // <td style="color:<?php echo ($cost['budget_koszt_podwykonawcow']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_koszt_podwykonawcow']); ?></td>
  567. tdNode = document.createElement('td')
  568. if (cost['budget_koszt_podwykonawcow']) {
  569. tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'PODWYKONAWCY', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_koszt_podwykonawcow'] + "})");
  570. }
  571. p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_koszt_podwykonawcow']) ? 'black' : 'silver')})
  572. tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_koszt_podwykonawcow'], '0,00')))
  573. costNode.appendChild(tdNode)
  574. // <td style="color:<?php echo ($cost['budget_koszt_reprezentacyjny']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_koszt_reprezentacyjny']); ?></td>
  575. tdNode = document.createElement('td')
  576. if (cost['budget_koszt_reprezentacyjny']) {
  577. tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'REPREZENTACYJNE', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_koszt_reprezentacyjny'] + "})");
  578. }
  579. p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_koszt_reprezentacyjny']) ? 'black' : 'silver')})
  580. tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_koszt_reprezentacyjny'], '0,00')))
  581. costNode.appendChild(tdNode)
  582. var orderFvBilled = null
  583. var fvSum = 0
  584. if (cost['order_nr'] && cost['nr_fv_do_zamowienia']) {
  585. // var budgetZyskStrata = costs.reduce(function (prevValue, currCost) {
  586. // return currCost['budget_minus_sum'];// get last value - calculated in php
  587. // }, _initBudgetValue);
  588. fvSum = cost['nr_fv_do_zamowienia'].reduce(function(prevVal, fv) {
  589. return prevVal + p5Utils__parseFloatOrZero(fv['cost'])
  590. }, 0)
  591. orderFvBilled = (fvSum > 0 && fvSum - p5Utils__parseFloatOrZero(cost['order_cost']) >= 0) ? true : false
  592. }
  593. tdNode = document.createElement('td')
  594. p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: 'silver'})
  595. if (cost['order_nr']) {
  596. var cellOrderColor = '#aaa';
  597. var cellOrderTitle = '';
  598. var cellOrderNrNode = document.createElement('div')
  599. switch (cost['order_approve_status']) {
  600. case 'ZATWIERDZONE': cellOrderColor = 'black'; break;
  601. case 'OCZEKUJE_OSTATECZNEGO_ZATWIERDZENIA': cellOrderColor = '#777'; break;
  602. case 'OCZEKUJE_ZATWIERDZENIA': cellOrderColor = '#777'; break;
  603. case 'WERSJA_ROBOCZA': cellOrderColor = '#aaa'; break;
  604. }
  605. switch (cost['order_approve_status']) {
  606. case 'ZATWIERDZONE': cellOrderTitle = "Zamówienie zatwierdzone"; break;
  607. case 'OCZEKUJE_OSTATECZNEGO_ZATWIERDZENIA': cellOrderTitle = "Zamówienie oczekuje ostatecznego zatwierdzenia"; break;
  608. case 'OCZEKUJE_ZATWIERDZENIA': cellOrderTitle = "Zamówienie oczekuje zatwierdzenia"; break;
  609. case 'ODRZUCONE': cellOrderTitle = "Zamówienie odrzucone"; break;
  610. case 'WERSJA_ROBOCZA': cellOrderTitle = "Wersja robocza"; break;
  611. }
  612. p5Utils__nodeStyle(cellOrderNrNode, {whiteSpace: 'nowrap', color: '#999'})
  613. cellOrderNrNode.appendChild(document.createTextNode('nr: '))
  614. var linkNode = document.createElement('a')
  615. p5Utils__nodeStyle(linkNode, {color: '#999', textDecoration: 'underline'})
  616. linkNode.appendChild(document.createTextNode(cost['order_nr']))
  617. linkNode.setAttribute('href', '<?= Request::getPathUri(); ?>index.php?_route=UrlAction_ProjektyProNetMediaZamZlec&_task=zamowienie&id=' + cost['orderRaw']['ID'])
  618. cellOrderNrNode.appendChild(linkNode)
  619. tdNode.setAttribute('title', cellOrderTitle)
  620. tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['order_cost'], '0,00')))
  621. tdNode.appendChild(cellOrderNrNode)
  622. p5Utils__nodeStyle(tdNode, {color: cellOrderColor, backgroundColor: (orderFvBilled) ? '#d9edf7' : '#fff'})
  623. } else {
  624. tdNode.appendChild(document.createTextNode('0,00'))
  625. }
  626. costNode.appendChild(tdNode)
  627. // FV for Order
  628. tdNode = document.createElement('td')
  629. if (cost['nr_fv_do_zamowienia']) {
  630. // $cost['nr_fv_do_zamowienia'][] = array('id'=>$idKoresp, 'nr'=>$fv['obcy_nr_koresp'], 'cost'=>$fv['cost']);
  631. cost['nr_fv_do_zamowienia'].map(function(fv) {
  632. // TODO: link do edycji koresp by $idKoresp
  633. var fvNode = document.createElement('div')
  634. fvNode.style.whiteSpace = 'nowrap'
  635. fvNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(fv['cost'], '0,00') + ' '))
  636. var linkNode = document.createElement('a')
  637. p5Utils__nodeStyle(linkNode, {color: '#999', textDecoration: 'underline'})
  638. linkNode.appendChild(document.createTextNode(((fv['nr']) ? '('+fv['nr']+')' : '['+fv['id']+']')))
  639. linkNode.setAttribute('href', '<?= Request::getPathUri(); ?>index.php?_route=ViewTableAjax&typeName=p5_default_db:IN7_DZIENNIK_KORESP#FILES/' + fv['id'])
  640. fvNode.appendChild(linkNode)
  641. tdNode.appendChild(fvNode)
  642. })
  643. }
  644. tdNode.style.color = cost['nr_fv_do_zamowienia'] ? 'black' : 'silver'
  645. costNode.appendChild(tdNode)
  646. // <td style="color:<?php echo ($cost['budget_zaliczki']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_zaliczki']); ?></td>
  647. tdNode = document.createElement('td')
  648. if (cost['budget_zaliczki']) {
  649. tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'ZALICZKA_KWOTA', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_zaliczki'] + "})");
  650. }
  651. p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_zaliczki']) ? 'black' : 'silver')})
  652. tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_zaliczki'], '0,00')))
  653. costNode.appendChild(tdNode)
  654. // <td style="color:<?php echo ($cost['budget_rozliczone_zaliczki']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_rozliczone_zaliczki']); ?></td>
  655. tdNode = document.createElement('td')
  656. if (cost['budget_rozliczone_zaliczki']) {
  657. tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'ZALICZKA_KOSZTY_DZIENNE', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_rozliczone_zaliczki'] + "})");
  658. }
  659. p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_rozliczone_zaliczki']) ? 'black' : 'silver')})
  660. tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_rozliczone_zaliczki'], '0,00')))
  661. costNode.appendChild(tdNode)
  662. // <td style="color:<?php echo ($cost['budget_zgoda_sluzebnosci']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_zgoda_sluzebnosci']); ?></td>
  663. tdNode = document.createElement('td')
  664. if (cost['budget_zgoda_sluzebnosci']) {
  665. tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'ZGODY_SLUZEBNOSCI', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_zgoda_sluzebnosci'] + "})");
  666. }
  667. p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_zgoda_sluzebnosci']) ? 'black' : 'silver')})
  668. tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_zgoda_sluzebnosci'], '0,00')))
  669. costNode.appendChild(tdNode)
  670. // <td style="color:<?php echo ($cost['budget_zgoda_odszkodowania']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_zgoda_odszkodowania']); ?></td>
  671. tdNode = document.createElement('td')
  672. if (cost['budget_zgoda_odszkodowania']) {
  673. tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'ZGODY_ODSZKODOWANIA', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_zgoda_odszkodowania'] + "})");
  674. }
  675. p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_zgoda_odszkodowania']) ? 'black' : 'silver')})
  676. tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_zgoda_odszkodowania'], '0,00')))
  677. costNode.appendChild(tdNode)
  678. // <td style="color:<?php echo ($cost['budget_sprzet_wlasny']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_sprzet_wlasny']); ?></td>
  679. tdNode = document.createElement('td')
  680. if (cost['budget_sprzet_wlasny']) {
  681. tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'SPRZET_WLASNY', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_sprzet_wlasny'] + "})");
  682. }
  683. p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_sprzet_wlasny']) ? 'black' : 'silver')})
  684. tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_sprzet_wlasny'], '0,00')))
  685. costNode.appendChild(tdNode)
  686. // <td style="color:<?php echo ($cost['budget_sprzet_wynajety']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_sprzet_wynajety']); ?></td>
  687. tdNode = document.createElement('td')
  688. if (cost['budget_sprzet_wynajety']) {
  689. tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'SPRZET_WYNAJETY', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_sprzet_wynajety'] + "})");
  690. }
  691. p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_sprzet_wynajety']) ? 'black' : 'silver')})
  692. tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_sprzet_wynajety'], '0,00')))
  693. costNode.appendChild(tdNode)
  694. // <td style="color:<?php echo ($cost['budget_organizacja_ruchu']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_organizacja_ruchu']); ?></td>
  695. tdNode = document.createElement('td')
  696. if (cost['budget_organizacja_ruchu']) {
  697. tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'ORGANIZACJA_RUCHU', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_organizacja_ruchu'] + "})");
  698. }
  699. p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_organizacja_ruchu']) ? 'black' : 'silver')})
  700. tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_organizacja_ruchu'], '0,00')))
  701. costNode.appendChild(tdNode)
  702. // <td style="color:<?php echo ($cost['budget_zajetosc_pasa']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['budget_zajetosc_pasa']); ?></td>
  703. tdNode = document.createElement('td')
  704. if (cost['budget_zajetosc_pasa']) {
  705. tdNode.setAttribute('onClick', "return p5UI__Clickable(this, 'p5:Budget:editCost', {type: 'ZAJETOSC_PASA', 'id': " + cost['costRaw']['ID'] + ", 'price': " + cost['budget_zajetosc_pasa'] + "})");
  706. }
  707. p5Utils__nodeStyle(tdNode, {whiteSpace: 'nowrap', color: ((cost['budget_zajetosc_pasa']) ? 'black' : 'silver')})
  708. tdNode.appendChild(document.createTextNode(p5Utils__pricePrintPL(cost['budget_zajetosc_pasa'], '0,00')))
  709. costNode.appendChild(tdNode)
  710. return costNode;
  711. })
  712. costNodes.map(function(costNode) {
  713. _tbody.appendChild(costNode);
  714. });
  715. }
  716. jQuery(document).on('p5:Budget:addCost:click', function(e, n, payload) {
  717. if (!payload || !payload.props || !payload.props.type) return false;
  718. budget_addCost(n, payload.props.type);
  719. });
  720. jQuery(document).on('p5:Budget:editCost:click', function(e, n, payload) {
  721. if (!payload || !payload.props || !payload.props.type || !payload.props.id) return false;
  722. budget_editCost(n, payload.props.id, payload.props.type, payload.props.price);
  723. });
  724. function budget_editCost(n, id, type, costPrice) {
  725. var labels = {}
  726. labels['ANEKS'] = "Aneks"
  727. labels['KARY'] = "Kary, potrącenia"
  728. labels['OSPRZET'] = "Osprzęt"
  729. labels['MATERIALY'] = "Materiały"
  730. labels['PRACOWNICY'] = "Koszty pracowników"
  731. labels['PODWYKONAWCY'] = "Koszt firmy podwykonawczej"
  732. labels['REPREZENTACYJNE'] = "Koszty reprezentacyjne"
  733. labels['ZALICZKA_KWOTA'] = "Zaliczka kwota"
  734. labels['ZALICZKA_KOSZTY_DZIENNE'] = "Rozliczanie zaliczki koszty dzienne"
  735. labels['ZGODY_SLUZEBNOSCI'] = "Służebności"
  736. labels['ZGODY_ODSZKODOWANIA'] = "Odszkodowania"
  737. labels['SPRZET_WLASNY'] = "Sprzęt własny"
  738. labels['SPRZET_WYNAJETY'] = "Sprzęt wynajęty"
  739. labels['ORGANIZACJA_RUCHU'] = "Organizacja ruchu"
  740. labels['ZAJETOSC_PASA'] = "Zajętość pasa drogowego"
  741. var labelText = (type in labels) ? labels[type] : type
  742. var desc = {}
  743. desc['ANEKS'] = "<br>Proszę wprowadzić róznicę pomiędzy aktualnym <abbr title=\"kwotą na umowie lub poprzednim aneksie\">budżetem</abbr>, a kwotą na aneksie"
  744. desc['ANEKS'] += ", np.:"
  745. desc['ANEKS'] += "<br><small>- kwota na umowie: 100,000"
  746. desc['ANEKS'] += "<br>- kwota na aneksie: 150,000"
  747. desc['ANEKS'] += "<br>wprowadzamy: <code>-50,000</code></small>"
  748. var descText = (type in desc) ? desc[type] : ''
  749. swal({
  750. title: 'Kwota netto dla kosztu:',
  751. html: '"' + labelText + '"' + descText,
  752. animation: false,
  753. input: 'text',
  754. inputValue: costPrice,
  755. inputPlaceholder: '0,00',
  756. // inputAttributes: {'step': '0.01'},
  757. showCancelButton: true,
  758. confirmButtonText: 'Edytuj koszt',
  759. showLoaderOnConfirm: true,
  760. preConfirm: function(price) {
  761. return new Promise(function(resolve, reject) {
  762. price = p5Utils__parseFloatOrZero(price)
  763. if ('ANEKS' != type && price <= 0) {
  764. reject('Kwota musi być większa od zera.')
  765. } else if ('ANEKS' == type && price == 0) {
  766. reject('Kwota musi być inna niż zero.')
  767. } else {
  768. superagent
  769. .post(_saveEditCostLink)
  770. .type('json') // header ĺapplication/x-www-form-urlencoded' requires type('form');
  771. .send({
  772. id: id,
  773. type: type,
  774. price: price
  775. })
  776. .set('Accept', 'application/json')
  777. .end(function(err, res) {
  778. if(_dbg)console.log('#widget-budget/editCost: res:', res, 'res.body:', res.body)
  779. if (err || !res.ok) {
  780. // jQuery(document).trigger('DBG:notify', {type: 'warning', msg: 'Req error', err: err});
  781. reject("Request error")
  782. } else {
  783. if ('application/json' !== res.type) {
  784. reject("Wrong response type - required json")
  785. return
  786. }
  787. if (!res.body.id || res.body.id <= 0) reject(res.body.msg || "Wystąpiły błędy podczas aktualizacji kosztu")
  788. resolve(res.body)
  789. }
  790. })
  791. }
  792. })
  793. },
  794. allowOutsideClick: false
  795. }).then(function(responseBody) {
  796. swal({
  797. type: 'success',
  798. animation: false,
  799. title: responseBody.msg || 'Koszt zaktualizowano',
  800. html: 'Rodzaj kosztu: ' + (labelText || responseBody.type) + '<br>Kwota: ' + p5Utils__pricePrintPL(responseBody.price, '0') + '.'
  801. })
  802. if (responseBody.update_data) {
  803. // TODO: budget__renderData(responseBody.update_data)
  804. budget__renderCosts(responseBody.update_data['costs']);
  805. }
  806. }).catch(function(e) {
  807. // eg. hit Cancel
  808. })
  809. }
  810. function budget_addCost(n, type) {
  811. var labels = {}
  812. labels['ANEKS'] = "Aneks"
  813. labels['KARY'] = "Kary, potrącenia"
  814. labels['OSPRZET'] = "Osprzęt"
  815. labels['MATERIALY'] = "Materiały"
  816. labels['PRACOWNICY'] = "Koszty pracowników"
  817. labels['PODWYKONAWCY'] = "Koszt firmy podwykonawczej"
  818. labels['REPREZENTACYJNE'] = "Koszty reprezentacyjne"
  819. labels['ZALICZKA_KWOTA'] = "Zaliczka kwota"
  820. labels['ZALICZKA_KOSZTY_DZIENNE'] = "Rozliczanie zaliczki koszty dzienne"
  821. labels['ZGODY_SLUZEBNOSCI'] = "Służebności"
  822. labels['ZGODY_ODSZKODOWANIA'] = "Odszkodowania"
  823. labels['SPRZET_WLASNY'] = "Sprzęt własny"
  824. labels['SPRZET_WYNAJETY'] = "Sprzęt wynajęty"
  825. labels['ORGANIZACJA_RUCHU'] = "Organizacja ruchu"
  826. labels['ZAJETOSC_PASA'] = "Zajętość pasa drogowego"
  827. var labelText = (type in labels) ? labels[type] : type
  828. var desc = {}
  829. desc['ANEKS'] = "<br>Proszę wprowadzić róznicę pomiędzy aktualnym <abbr title=\"kwotą na umowie lub poprzednim aneksie\">budżetem</abbr>, a kwotą na aneksie"
  830. desc['ANEKS'] += ", np.:"
  831. desc['ANEKS'] += "<br><small>- kwota na umowie: 100,000"
  832. desc['ANEKS'] += "<br>- kwota na aneksie: 150,000"
  833. desc['ANEKS'] += "<br>wprowadzamy: <code>-50,000</code></small>"
  834. var descText = (type in desc) ? desc[type] : ''
  835. swal({
  836. title: 'Kwota netto dla kosztu:',
  837. html: '"' + labelText + '"' + descText,
  838. animation: false,
  839. input: 'text',
  840. inputPlaceholder: '0,00',
  841. // inputAttributes: {'step': '0.01'},
  842. showCancelButton: true,
  843. confirmButtonText: 'Dodaj koszt',
  844. showLoaderOnConfirm: true,
  845. preConfirm: function(price) {
  846. return new Promise(function(resolve, reject) {
  847. price = p5Utils__parseFloatOrZero(price)
  848. if ('ANEKS' != type && price <= 0) {
  849. reject('Kwota musi być większa od zera.')
  850. } else if ('ANEKS' == type && price == 0) {
  851. reject('Kwota musi być inna niż zero.')
  852. } else {
  853. superagent
  854. .post(_saveAddCostLink)
  855. .type('json') // header ĺapplication/x-www-form-urlencoded' requires type('form');
  856. .send({
  857. type: type,
  858. price: price
  859. })
  860. .set('Accept', 'application/json')
  861. .end(function(err, res) {
  862. if(_dbg)console.log('#widget-budget/addCost: res:', res, 'res.body:', res.body)
  863. if (err || !res.ok) {
  864. // jQuery(document).trigger('DBG:notify', {type: 'warning', msg: 'Req error', err: err});
  865. reject("Request error")
  866. } else {
  867. if ('application/json' !== res.type) {
  868. reject("Wrong response type - required json")
  869. return
  870. }
  871. if (!res.body.id || res.body.id <= 0) reject(res.body.msg || "Wystąpiły błędy podczas dodawaniu kosztu")
  872. resolve(res.body)
  873. }
  874. })
  875. }
  876. })
  877. },
  878. allowOutsideClick: false
  879. }).then(function(responseBody) {
  880. swal({
  881. type: 'success',
  882. animation: false,
  883. title: responseBody.msg || 'Koszt dodano',
  884. html: 'Rodzaj kosztu: ' + (labelText || responseBody.type) + '<br>Kwota: ' + p5Utils__pricePrintPL(responseBody.price, '0') + '.'
  885. })
  886. if (responseBody.update_data) {
  887. // TODO: budget__renderData(responseBody.update_data)
  888. budget__renderCosts(responseBody.update_data['costs']);
  889. }
  890. }).catch(function(e) {
  891. // eg. hit Cancel
  892. })
  893. }
  894. })();
  895. </script>
  896. <?php if ($viewParams['print_mode']) : ?>
  897. <script>window.print();</script>
  898. <?php endif; ?>
  899. <?php
  900. DBG::_('DBG', '>2', 'data', $data, __CLASS__, __FUNCTION__, __LINE__);
  901. }
  902. public function addCostAjaxAction() {
  903. $response = array();
  904. $response['type'] = 'danger';
  905. $response['msg'] = 'Unknown error';
  906. try {
  907. $idProject = V::get('ID_PROJECT', 0, $_REQUEST, 'int');
  908. if (!$idProject) throw new Exception("Missing id project");
  909. $json = Request::getRequestBody();
  910. if (empty($json)) throw new Exception("Error Processing Request - json expected");
  911. $json = @json_decode($json, $assoc = true);
  912. if (null == $json && 0 !== json_last_error()) throw new Exception("Error Processing Request - Parse json error: " . json_last_error());
  913. $price = V::get('price', '', $json, 'price');
  914. $type = V::get('type', '', $json);
  915. if (empty($price)) throw new Exception("Missing price");
  916. if (empty($type)) throw new Exception("Missing type");
  917. $response['price'] = $price;
  918. $response['type'] = $type;
  919. $cost = array();
  920. $cost['ID_PROJECT'] = $idProject;
  921. $cost['COST_VALUE'] = $price;
  922. $cost['COST_TYPE'] = $type;
  923. $cost['COST_DATE'] = date("Y-m-d");
  924. // $cost['NOTES'] = $notes;// TODO: add notes to form?
  925. $idItem = DB::getDB()->ADD_NEW_OBJ('PROJECT_COSTS', (object)$cost);
  926. if ($idItem <= 0) throw new Exception("Wystąpiły błędy podczas tworzenia nowego rekordu w bazie danych");
  927. $response['type'] = 'success';
  928. $response['id'] = $idItem;
  929. $response['msg'] = "Koszt został dodany";
  930. {// update costs
  931. $data = array();
  932. $data['id_project'] = $idProject;
  933. $data = $this->setProps($data);
  934. $response['update_data'] = $data;
  935. }
  936. } catch (Exception $e) {
  937. $response['type'] = 'danger';
  938. $response['msg'] = $e->getMessage();
  939. }
  940. Response::sendJsonExit($response);
  941. }
  942. public function editCostAjaxAction() {
  943. $response = array();
  944. $response['type'] = 'danger';
  945. $response['msg'] = 'Unknown error';
  946. try {
  947. $idProject = V::get('ID_PROJECT', 0, $_REQUEST, 'int');
  948. if (!$idProject) throw new Exception("Missing id project");
  949. $json = Request::getRequestBody();
  950. if (empty($json)) throw new Exception("Error Processing Request - json expected");
  951. $json = @json_decode($json, $assoc = true);
  952. if (null == $json && 0 !== json_last_error()) throw new Exception("Error Processing Request - Parse json error: " . json_last_error());
  953. $id = V::get('id', '', $json);
  954. $price = V::get('price', '', $json, 'price');
  955. $type = V::get('type', '', $json);
  956. if (empty($price)) throw new Exception("Missing price");
  957. if (empty($type)) throw new Exception("Missing type");
  958. $response['price'] = $price;
  959. $response['type'] = $type;
  960. $cost = array();
  961. $cost['ID'] = $id;
  962. $cost['ID_PROJECT'] = $idProject;
  963. $cost['COST_VALUE'] = $price;
  964. $cost['COST_TYPE'] = $type;
  965. // $cost['NOTES'] = $notes;// TODO: add notes to form?
  966. $affected = DB::getDB()->UPDATE_OBJ('PROJECT_COSTS', (object)$cost);
  967. if ($affected <= 0) throw new Exception("Wystąpiły błędy podczas aktualizacji rekordu w bazie danych");
  968. $response['id'] = $id;
  969. $response['type'] = 'success';
  970. $response['msg'] = "Koszt został zaktualizowany";
  971. {// update costs
  972. $data = array();
  973. $data['id_project'] = $idProject;
  974. $data = $this->setProps($data);
  975. $response['update_data'] = $data;
  976. }
  977. } catch (Exception $e) {
  978. $response['type'] = 'danger';
  979. $response['msg'] = $e->getMessage();
  980. }
  981. Response::sendJsonExit($response);
  982. }
  983. }
  984. /*
  985. -- `PROJECT_COSTS`.`COST_VALUE` max 1000000123456,78
  986. CREATE TABLE IF NOT EXISTS `PROJECT_COSTS` (
  987. `ID` int(11) NOT NULL AUTO_INCREMENT,
  988. `ID_PROJECT` int(11) NOT NULL DEFAULT 0,
  989. `A_RECORD_CREATE_DATE` datetime DEFAULT NULL,
  990. `A_RECORD_CREATE_AUTHOR` varchar(20) DEFAULT NULL,
  991. `SYNC_SQIX_STATUS` varchar(100) NOT NULL DEFAULT '',
  992. `A_RECORD_UPDATE_DATE` datetime DEFAULT NULL,
  993. `A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
  994. `A_STATUS` enum('WAITING','NORMAL','MONITOR','WARNING','OFF_SOFT','OFF_HARD','DELETED') DEFAULT NULL,
  995. `A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT '',
  996. `A_CLASSIFIED` varchar(100) NOT NULL DEFAULT '',
  997. `COST_VALUE` decimal(16,2) NOT NULL DEFAULT '',
  998. `COST_TYPE` varchar(32) NOT NULL DEFAULT '',
  999. `COST_DATE` date DEFAULT NULL,
  1000. `NOTES` varchar(255) NOT NULL DEFAULT '',
  1001. PRIMARY KEY (`ID`)
  1002. KEY `ID_PROJECT` (`ID_PROJECT`)
  1003. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  1004. CREATE TABLE IF NOT EXISTS `PROJECT_COSTS_HIST` (
  1005. `ID` int(11) NOT NULL AUTO_INCREMENT,
  1006. `ID_USERS2` int(11) NOT NULL,
  1007. `ID_PROJECT` varchar(255) NOT NULL DEFAULT 'N/S;',
  1008. `A_RECORD_CREATE_DATE` varchar(255) NOT NULL DEFAULT 'N/S;',
  1009. `A_RECORD_CREATE_AUTHOR` varchar(20) NOT NULL DEFAULT 'N/S;',
  1010. `SYNC_SQIX_STATUS` varchar(255) NOT NULL DEFAULT 'N/S;',
  1011. `A_RECORD_UPDATE_DATE` varchar(255) NOT NULL DEFAULT 'N/S;',
  1012. `A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT 'N/S;',
  1013. `A_STATUS` varchar(255) NOT NULL DEFAULT 'N/S;',
  1014. `A_STATUS_INFO` varchar(255) NOT NULL DEFAULT 'N/S;',
  1015. `A_ADM_COMPANY` varchar(255) NOT NULL DEFAULT 'N/S;',
  1016. `A_CLASSIFIED` varchar(255) NOT NULL DEFAULT 'N/S;',
  1017. `COST_VALUE` varchar(16) NOT NULL DEFAULT 'N/S;',
  1018. `COST_TYPE` varchar(32) NOT NULL DEFAULT 'N/S;',
  1019. `COST_DATE` varchar(10) NOT NULL DEFAULT 'N/S;',
  1020. `NOTES` varchar(255) NOT NULL DEFAULT 'N/S;',
  1021. PRIMARY KEY (`ID`),
  1022. KEY `ID_USERS2` (`ID_USERS2`)
  1023. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  1024. */