ProjektyProNetMediaBudget.php 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. <?php
  2. Lib::loadClass('RouteBase');
  3. Lib::loadClass('TypespecialVariable');
  4. Lib::loadClass('Request');
  5. Lib::loadClass('Response');
  6. Lib::loadClass('UI');
  7. // TODO: Typepsecial do Koresp.ORDER_NR
  8. // TODO: widoki zamówień wg statusu - ustalić dostępy za pomocą procesów
  9. /*
  10. DBG:
  11. &DBG_M_DIST_COST_PROJECT=10000
  12. &DBG_KONIEC_BUDOWY=2016-08-01
  13. */
  14. class Route_UrlAction_ProjektyProNetMediaBudget extends RouteBase {// TODO: UrlActionBase @see Route_UrlAction
  15. public function handleAuth() {
  16. if (!User::logged()) {
  17. User::authByRequest();
  18. }
  19. }
  20. /*
  21. Kwota planowana: `M_DIST_COST_PROJECT` Budżet projektu
  22. Zamówienie: sumy z CRM_LISTA_ZASOBOW_ORDERS (CRM_LISTA_ZASOBOW_OFFERS)
  23. zaliczki
  24. ilość pracowników / koszty pracownicze: powiązanie z raportami X współczynnik
  25. koszty sprzętu/ wynajmowany na budowie: rozdział na różne rodzaj sprzętu: koparka itp.
  26. koszty własne: naprawy sprzętu
  27. koszty materiałów
  28. osprzet
  29. dodatkowe koszty związane z nadwyżkami - rozbieżności odnośnie ustaleń
  30. dostęp dla zarządu i os. odp. kwota końcowa
  31. */
  32. public function defaultAction() {
  33. SE_Layout::gora();
  34. try {
  35. $viewParams = array();
  36. $viewParams['print_mode'] = (1 == V::get('_print', '', $_GET));
  37. if (!$viewParams['print_mode']) SE_Layout::menu();
  38. $data = array();
  39. $data['id_project'] = V::get('ID_PROJECT', 0, $_REQUEST, 'int');
  40. if (!$data['id_project']) throw new Exception("Error: Brak nr projektu!");
  41. $data = $this->setProps($data);
  42. $this->budgetView($data, $viewParams);
  43. } catch (Exception $e) {
  44. SE_Layout::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage());
  45. }
  46. SE_Layout::dol();
  47. }
  48. public function setProps($data) {
  49. $idProj = V::get('id_project', 0, $data, 'int');
  50. if (!$idProj) return $data;// throw errro?
  51. $data['budget'] = 0;
  52. $data['projectInfo'] = null;
  53. $data['projectLabel'] = '';
  54. $data['costs'] = array();
  55. $rows = DB::getPDO()->fetchAll("
  56. select p.ID
  57. , p.M_DIST_DESC
  58. , p.M_DIST_DEALNUM
  59. , p.M_DIST_COST_PROJECT
  60. , p.POCZATEK_UMOWY
  61. , p.KONIEC_BUDOWY
  62. , p.COST_OSPRZET
  63. , p.COST_MATERIALY
  64. from IN7_MK_BAZA_DYSTRYBUCJI p
  65. where p.A_STATUS not in('DELETED')
  66. and p.ID = {$idProj}
  67. ");
  68. if (empty($rows)) return $data;// throw errro?
  69. $data['projectInfo'] = $rows[0];
  70. $data['budget'] = V::get('M_DIST_COST_PROJECT', 0, $data['projectInfo']);
  71. $data['projectLabel'] = $data['projectInfo']['M_DIST_DESC'];
  72. $data['POCZATEK_UMOWY'] = V::get('POCZATEK_UMOWY', 0, $data['projectInfo']);
  73. $data['KONIEC_BUDOWY'] = V::get('KONIEC_BUDOWY', 0, $data['projectInfo']);
  74. $data['days_to_finish'] = 0; // pozostało dni - // ilość dni wyliczana z różnicy dat [13513] KONIEC_BUDOWY - [13512] POCZATEK_UMOWY (raczej today)
  75. $data['budget'] = V::get('DBG_M_DIST_COST_PROJECT', $data['budget'], $_GET);// TODO: TEST
  76. $data['KONIEC_BUDOWY'] = V::get('DBG_KONIEC_BUDOWY', $data['KONIEC_BUDOWY'], $_GET);// TODO: TEST
  77. if ($data['KONIEC_BUDOWY']) {
  78. $dStart = new DateTime(date('Y-m-d'));
  79. $dEnd = new DateTime($data['KONIEC_BUDOWY']);
  80. $dDiff = $dStart->diff($dEnd);
  81. $data['days_to_finish'] = ('-' == $dDiff->format('%R')) ? -1 * $dDiff->days : $dDiff->days;
  82. }
  83. $data['COST_OSPRZET'] = V::get('COST_OSPRZET', 0, $data['projectInfo']);
  84. $data['COST_MATERIALY'] = V::get('COST_MATERIALY', 0, $data['projectInfo']);
  85. $data['ordersRaw'] = DB::getPDO()->fetchAll("
  86. select r.ID
  87. , r.ORDER_LABEL
  88. , sum(o.OFFER_PRICE_PER_UNIT * o.OFFER_QUANTITY) as SUM_NETTO
  89. from CRM_LISTA_ZASOBOW_ORDERS r
  90. left join CRM_LISTA_ZASOBOW_OFFERS o on(
  91. o.ID_ORDER = r.ID
  92. and (o.A_STATUS is null or o.A_STATUS not in('DELETED'))
  93. )
  94. where (r.A_STATUS is null or r.A_STATUS not in('DELETED'))
  95. and r.ID_PROJECT = {$idProj}
  96. group by r.ID
  97. ");
  98. $toFindKoresp = array();// Order.ID => Order.label
  99. {
  100. $idx = 0;
  101. foreach ($data['ordersRaw'] as $idxOrders => $order) {
  102. $idOrder = $order['ID'];
  103. $labelOrder = $order['ORDER_LABEL'];
  104. $toFindKoresp[$idOrder] = $labelOrder;
  105. if (count($data['costs']) < $idxOrders + 1) {
  106. $data['costs'][] = array(
  107. 'cost_zamowienia'=>$order['SUM_NETTO'],
  108. 'nr_zamowienia'=>$labelOrder,
  109. 'nr_fv_do_zamowienia'=>array(),
  110. 'cost_zaliczki'=>0,
  111. 'cost_pracownicy'=>0,
  112. 'cost_wynajem'=>0,
  113. 'cost_serwis'=>0,
  114. 'cost_materialy'=>0,
  115. 'cost_osprzet'=>0,
  116. 'cost_dodatkowe'=>0,
  117. 'sum'=>0,
  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. from IN7_DZIENNIK_KORESP k
  135. where k.ORDER_NR in({$sqlOrderLabels})
  136. ");
  137. foreach ($data['fvToOrdersRaw'] as $fv) {
  138. $labelOrder = $fv['ORDER_NR'];
  139. foreach ($data['costs'] as $cost) {
  140. if ($isOrder && $labelOrder == $cost['nr_zamowienia']) {
  141. $idKoresp = $fv['ID'];
  142. $cost['nr_fv_do_zamowienia'][$idKoresp] = $fv['obcy_nr_koresp'];
  143. }
  144. }
  145. }
  146. }
  147. $budget = $data['budget'];
  148. foreach ($data['costs'] as $idx => $cost) {
  149. // TODO: fix - `cost_wynajem` pewnie będzie częścią z zamówienia - minus od project COST_OSPRZET
  150. // TODO: fix - `cost_materialy` pewnie będzie częścią z zamówienia - minus od project COST_MATERIALY
  151. $sum = $cost['cost_zamowienia']
  152. + $cost['cost_zaliczki']
  153. + $cost['cost_pracownicy']
  154. + $cost['cost_wynajem']
  155. + $cost['cost_serwis']
  156. + $cost['cost_materialy']
  157. + $cost['cost_osprzet']
  158. + $cost['cost_dodatkowe']
  159. ;
  160. $budget -= $sum;
  161. $data['costs'][$idx]['budget_minus_sum'] = $budget;
  162. $data['costs'][$idx]['sum'] = $sum;
  163. }
  164. }
  165. return $data;
  166. }
  167. public function budgetView($data, $viewParams) {
  168. ?>
  169. <div class="container">
  170. <div class="row">
  171. <div class="col-md-6">
  172. <?php if (!$viewParams['print_mode']) : ?>
  173. <a class="btn btn-primary"
  174. href="index.php?_route=UrlAction_ProjektyProNetMediaBudget&ID_PROJECT=<?php echo $data['id_project']; ?>&_print=1"
  175. target="_blank">drukuj</a>
  176. <?php endif; ?>
  177. </div>
  178. <div class="col-md-6" style="text-align:right">
  179. <?php echo date("Y-m-d"); ?>
  180. </div>
  181. </div>
  182. <h3>Projekt: <?php echo $data['projectLabel']; ?></h3>
  183. <blockquote style="font-size:1em">
  184. Data rozpoczęcia umowy: <?php echo $data['POCZATEK_UMOWY']; ?>
  185. <br>Data zakończenia umowy: <?php echo $data['KONIEC_BUDOWY']; ?>
  186. <!-- <br>Kwota Umowy (netto): <?php echo $data['M_DIST_COST_PROJECT']; ?> ? == $data['budget'] -->
  187. <br>Pozostało dni: <?php echo $data['days_to_finish']; ?>
  188. </blockquote>
  189. <table class="table table-bordered">
  190. <thead>
  191. <tr>
  192. <th title="Kwota Umowy (netto)">Kwota planowana<br><?php echo UI::price($data['budget']); ?></th>
  193. <th>Zamówienie</th>
  194. <th>zaliczki</th>
  195. <th>ilość pracowników / koszty pracownicze: powiązanie z raportami X współczynnik</th>
  196. <th>koszty sprzętu / wynajmowany na budowie: rozdział na różne rodzaj sprzętu: koparka itp.
  197. <br><?php echo UI::price($data['COST_OSPRZET']); ?>
  198. </th>
  199. <th>koszty własne: naprawy sprzętu</th>
  200. <th>koszty materiałów
  201. <br><?php echo UI::price($data['COST_MATERIALY']); ?>
  202. </th>
  203. <th>osprzet</th>
  204. <th>dodatkowe koszty związane z nadwyżkami - rozbieżności odnośnie ustaleń</th>
  205. </tr>
  206. </thead>
  207. <tbody>
  208. <?php foreach ($data['costs'] as $cost) : ?>
  209. <tr>
  210. <td><?php echo UI::price($cost['budget_minus_sum']); ?></td>
  211. <td style="color:<?php echo ($cost['cost_zamowienia']) ? 'black' : 'silver'; ?>">
  212. <?php echo UI::price($cost['cost_zamowienia']); ?>
  213. <div style="white-space:nowrap; color:silver">nr: <?php echo $cost['nr_zamowienia']; ?></div>
  214. <?php if (!empty($cost['nr_fv_do_zamowienia'])) : ?>
  215. <?php foreach ($cost['nr_fv_do_zamowienia'] as $idKoresp => $obcyNrFV) : ?>
  216. <?php // TODO: link do edycji koresp by $idKoresp ?>
  217. <div style="white-space:nowrap; color:silver">fv: <?php echo ($obcyNrFV) ? $obcyNrFV : " nr {$idKoresp}"; ?></div>
  218. <?php endforeach; ?>
  219. <?php endif; ?>
  220. </td>
  221. <td style="color:<?php echo ($cost['cost_zaliczki']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['cost_zaliczki']); ?></td>
  222. <td style="color:<?php echo ($cost['cost_pracownicy']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['cost_pracownicy']); ?></td>
  223. <td style="color:<?php echo ($cost['cost_wynajem']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['cost_wynajem']); ?></td>
  224. <td style="color:<?php echo ($cost['cost_serwis']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['cost_serwis']); ?></td>
  225. <td style="color:<?php echo ($cost['cost_materialy']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['cost_materialy']); ?></td>
  226. <td style="color:<?php echo ($cost['cost_osprzet']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['cost_osprzet']); ?></td>
  227. <td style="color:<?php echo ($cost['cost_dodatkowe']) ? 'black' : 'silver'; ?>"><?php echo UI::price($cost['cost_dodatkowe']); ?></td>
  228. </tr>
  229. <?php endforeach; ?>
  230. </tbody>
  231. </table>
  232. </div>
  233. <?php if ($viewParams['print_mode']) : ?>
  234. <script>window.print();</script>
  235. <?php endif; ?>
  236. <?php
  237. DBG::_('DBG', '>2', 'data', $data, __CLASS__, __FUNCTION__, __LINE__);
  238. }
  239. }