UserProNetMediaZaliczka.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703
  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('ProcesHelper');
  8. Lib::loadClass('Route_UrlAction');
  9. Lib::loadClass('UI');
  10. Lib::loadClass('ACL');
  11. Lib::loadClass('TableAjax');
  12. // - [ ] zaliczkaListaView:
  13. // - [ ] btn "Dodaj Zaliczkę" $acl->addItem($item); // @require only 'worker' => [ 'id', 'login', 'name' ]
  14. // - [ ] lista wszystkich zaliczek danego usera + btn "load more ..."
  15. // - [x] Rozlicz / Podgląd - tylko najnowsza Zaliczka
  16. // - [ ] Rozlicz / Podgląd - edytowć może tylko właściciel / grupa / user connected by REF ?
  17. class Route_UrlAction_UserProNetMediaZaliczka extends RouteBase {// TODO: UrlActionBase @see Route_UrlAction
  18. public function handleAuth() {
  19. if (!User::logged()) {
  20. User::authByRequest();
  21. }
  22. }
  23. public function defaultAction() {
  24. UI::gora();
  25. // UI::emptyTag('link', ['href'=>'static/zaliczka/main.css', 'rel'=>'stylesheet']);
  26. if (1 != V::get('_print', '', $_GET)) UI::menu();
  27. try {
  28. $data = array();
  29. $data['idUser'] = V::get('idUser', User::getID(), $_REQUEST, 'int');
  30. $data['idZaliczka'] = V::get('idZaliczka', 0, $_REQUEST, 'int');// TODO: idZaliczka is always MAX(z.ID);
  31. $data['tab'] = V::get('tab', 'wnoiski', $_REQUEST, 'word');
  32. if (!$data['idZaliczka']) {
  33. $this->zaliczkaListaView($data);
  34. } else {
  35. echo UI::h('div', ['class' => "container", 'style' => 'margin-top:12px; margin-bottom:6px; padding-bottom:6px; border-bottom:1px solid #ddd'], [
  36. UI::h('a', [
  37. 'href' => "index.php?_route=UrlAction_UserProNetMediaZaliczka&idUser={$data['idUser']}",
  38. 'class' => "btn btn-link pull-left"
  39. ], "<i class=\"glyphicon glyphicon-arrow-left\"></i> wróć"),
  40. UI::h('a', [
  41. 'href' => "index.php?_route=ViewTableAjax&typeName=p5_default_db:IN7_DZIENNIK_KORESP#CREATE",
  42. 'class' => "btn btn-sm btn-default pull-right"
  43. ], "<span class=\"glyphicon glyphicon-plus\"></span> Dodaj dokument <i>(Korespondencję)</i>")
  44. ]);
  45. $this->zaliczkaFormView($data);
  46. }
  47. } catch (Exception $e) {
  48. UI::alert('danger', "Error #" . $e->getCode() . "|" . $e->getLine() . ": " . $e->getMessage());
  49. DBG::log($e);
  50. }
  51. if (!empty($_POST)) echo UI::h('script', [], "history.replaceState(null, 'Zaliczka', window.location.href);");
  52. if (1 != V::get('_print', '', $_GET)) UI::dol();
  53. }
  54. public function syncStateAjaxAction() {
  55. Response::sendTryCatchJson(array($this, 'syncStateAjaxReponseCallback'), $args = 'JSON_FROM_REQUEST_BODY');// try to read json from request body
  56. }
  57. public function syncStateAjaxReponseCallback($args) {
  58. if (empty($args) || !array_key_exists('updates', $args)) throw new HttpException("Error Parsing Request - missing args", 400);
  59. $args['idUser'] = V::get('idUser', 0, $_REQUEST, 'int');// (int)$args['idUser'];
  60. if ($args['idUser'] <= 0) throw new HttpException("Error Parsing Request - missing idUser", 400);
  61. $args['idZaliczka'] = V::get('idZaliczka', 0, $_REQUEST, 'int');// (int)$args['idZaliczka'];
  62. if ($args['idZaliczka'] <= 0) throw new HttpException("Error Parsing Request - missing idZaliczka", 400);
  63. $acl = ACL::getAclByNamespace("default_db/ZALICZKA/Zaliczka");
  64. $schema = $acl->getSimpleSchemaTree();
  65. if (!empty($args['updates'])) {
  66. $acl->updateItem($args['updates']);
  67. }
  68. $zaliczkaData = $acl->getItem($args['idZaliczka'], [
  69. 'cols' => [
  70. '@instance',
  71. 'id',
  72. 'created',
  73. 'kwota',
  74. 'nierozliczona_kwota',
  75. 'pozycja',
  76. 'worker',
  77. 'korespondencja',
  78. ]
  79. ]);// $this->fetchDataBySchema($schema, $args['idUser']);
  80. return [
  81. 'type' => 'success',
  82. 'nierozliczonaKwota' => V::get('nierozliczona_kwota', 0, $zaliczkaData),
  83. 'schema' => [
  84. 'zaliczka' => $schema,
  85. ],
  86. 'zaliczka' => $zaliczkaData,
  87. ];
  88. }
  89. public function fetchDataAjaxAction() {
  90. Response::sendTryCatchJson(array($this, 'fetchDataAjaxReponseCallback'), $args = 'JSON_FROM_REQUEST_BODY');// try to read json from request body
  91. }
  92. public function fetchDataAjaxReponseCallback($args) {
  93. DBG::log(['msg' => 'args', 'args' => $args]);
  94. if (empty($args)) throw new HttpException("Error Parsing Request - missing args", 400);
  95. if (empty($args['schema']['@namespace']) && empty($args['objectNamespace'])) throw new HttpException("Error Parsing Request - missing @namespace", 400);
  96. if (!empty($args['schema']['@namespace'])) {
  97. if ('default_db/IN7_DZIENNIK_KORESP/ZaliczkaKoresp' == $args['schema']['@namespace']) {
  98. return [
  99. 'type' => 'success',
  100. 'options' => array_values(ACL::getAclByNamespace($args['schema']['@namespace'])->getItems([
  101. 'f_title' => V::get('query', '', $args)
  102. ]))
  103. ];
  104. } else {
  105. return [ 'type' => "error", 'msg' => "Unsupported @namespace" ];
  106. }
  107. } else if (!empty($args['objectNamespace'])) {
  108. // childName : "kategoria_kosztu"
  109. // objectNamespace : "default_db/ZALICZKA_POZYCJA/ZaliczkaPozycja"
  110. if (empty($args['childName'])) throw new Exception("Missing childName");
  111. $acl = ACL::getAclByNamespace($args['objectNamespace']);
  112. return [
  113. 'type' => 'success',
  114. 'options' => $acl->getEnumValues($args['childName'])
  115. ];
  116. }
  117. return [ 'type' => "error", 'msg' => "Unsupported @namespace or xsdType" ];
  118. }
  119. public function fetchDataBySchema($schema, $idUser, $primaryKey = null) {// if $primaryKey is null then search for last row
  120. return [// TODO: fetch data from DB
  121. 'id' => 123,
  122. 'created' => '2016-11-22', // data wydania zaliczki - data utworzenia rekordu
  123. 'worker' => [
  124. 'id' => 666,
  125. 'name' => 'Kowalski', // 'TODO' => get name from admin_users - imię i nazwisko pracownika pobierającego zaliczkę
  126. 'login' => 'kowalski'
  127. ],
  128. 'kwota' => 555.55, // kwota wypłaconej zaliczki
  129. 'nierozliczona_kwota' => 123.56,
  130. 'pozycja' => [
  131. [ 'id' => 1,
  132. 'kwota' => 100.22,
  133. 'korespondencja' => [ 'id' => 65432, 'title' => 'testowa koresp 1', 'kategoriaKosztu' => 'KOSZT1' ],
  134. 'projekt' => [ 'nrBudowy' => 'Budowa/1' ]
  135. ],
  136. [ 'id' => 2,
  137. 'kwota' => 200.55,
  138. 'korespondencja' => [ 'id' => 76543, 'title' => 'testowa koresp 2', 'kategoriaKosztu' => 'KOSZT2' ],
  139. 'projekt' => [ 'id' => 123, 'nrBudowy' => 'Budowa/2' ]
  140. ]
  141. ]
  142. ];
  143. }
  144. public function zaliczkaListaView($data) {
  145. $idUser = V::get('idUser', User::getID(), $data);
  146. $tab = V::get('tab', 'wnioski', $data);
  147. if (!in_array($tab, ['wnioski', 'zaliczki'])) $tab = 'wnioski';
  148. $ownerAcl = ACL::getAclByNamespace("default_objects/AccessOwner");
  149. $user = $ownerAcl->getItem($idUser);// [id, login, name]
  150. if (!$user) throw new Exception("Nie znaleziono pracownika o nr '{$idUser}'");
  151. $acl = ACL::getAclByNamespace("default_db/ZALICZKA/Zaliczka");
  152. UI::startContainer(['style' => "padding-top:20px"]);
  153. UI::setTitle("Zaliczka");
  154. echo UI::h('h2', [], "Zaliczki pracownika {$user['name']} ");
  155. echo UI::hButtonPost("Dodaj wniosek o zaliczkę", [
  156. 'data' => [
  157. '_route' => "UrlAction_UserProNetMediaZaliczka",
  158. '_task' => 'add',
  159. 'idUser' => $idUser,
  160. ],
  161. 'class' => "btn-sm btn-primary",
  162. 'form.style' => "display:block; margin-top:4px; padding:20px; background:#eee"
  163. ], [
  164. UI::h('input', [ 'name' => "kwota", 'type' => 'text', 'class' => 'form-control input-sm', 'style' => "width:200px;margin-right:4px", 'placeholder' => "kwota" ]),
  165. UI::h('div', ['class'=>"input-group", 'style'=>"margin-right:4px"], [
  166. UI::h('input', [ 'name' => "uwagi", 'type' => 'text', 'class' => 'form-control input-sm', 'style' => "width:400px", 'placeholder' => "uwagi" ]),
  167. UI::h('span', ['class'=>"input-group-btn"], [
  168. UI::h('button', ['class'=>"btn btn-sm btn-default", 'onClick' => "return false"], [
  169. UI::h('i', [
  170. 'class' => "glyphicon glyphicon-question-sign",
  171. 'title' => "Czego dotyczy zaliczka?"
  172. ])
  173. ])
  174. ]),
  175. ]),
  176. ]);
  177. echo UI::h('ul', ['class' => "nav nav-tabs", 'style' => "margin-top:24px"], [
  178. UI::h('li', ['role' => "presentation", 'class' => ('wnioski' == $tab) ? "active" : ''], [
  179. UI::h('a', ['href'=>Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&idUser={$idUser}&tab=wnioski"], "Wnioski")
  180. // UI::h('a', ['href'=>"#tab-wnioski", 'onClick' => "return p5__Zaliczka__showTab(this, 'tab-wnioski')"], "Wnioski")
  181. ]),
  182. UI::h('li', ['role' => "presentation", 'class' => ('zaliczki' == $tab) ? "active" : ''], [
  183. UI::h('a', ['href'=>Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&idUser={$idUser}&tab=zaliczki"], "Zaliczki")
  184. // UI::h('a', ['href'=>"#tab-zaliczki", 'onClick' => "return p5__Zaliczka__showTab(this, 'tab-zaliczki')"], "Zaliczki")
  185. ]),
  186. ]);
  187. if ('wnioski' == $tab) {
  188. $this->viewWidgetUserWnioski($idUser);
  189. } else if ('zaliczki' == $tab) {
  190. $this->viewWidgetUserZaliczki($idUser);
  191. }
  192. // UI::startTag('div', ['id'=>'tab-wnioski']);
  193. // $this->viewWidgetUserWnioski();
  194. // UI::endTag('div');// #tab-wnioski
  195. // UI::startTag('div', ['id'=>'tab-zaliczki']);
  196. // $this->viewWidgetUserZaliczki();
  197. // UI::endTag('div');// #tab-zaliczki
  198. UI::endContainer();
  199. // echo UI::h('script', [], "
  200. // (function (window) {
  201. // var idxSelected = 0
  202. // var tabs = [
  203. // 'tab-wnioski',
  204. // 'tab-zaliczki'
  205. // ]
  206. // var tabNodes = [
  207. // window.document.getElementById('tab-wnioski'),
  208. // window.document.getElementById('tab-zaliczki'),
  209. // ]
  210. //
  211. // function p5__Zaliczka__showTab(n, tab) {
  212. // var idxTab = tabs.indexOf(tab)
  213. // if (-1 === idxTab) return
  214. // n.parentNode.parentNode.childNodes.forEach(function (liNode) {
  215. // if (liNode.nodeType !== 1) return // Node.ELEMENT_NODE == 1
  216. // if (liNode.tagName !== 'LI') return
  217. // liNode.classList.remove('active')
  218. // })
  219. // n.parentNode.classList.add('active')
  220. // p5__Zaliczka__renderTabs(idxTab)
  221. // return false
  222. // }
  223. //
  224. // function p5__Zaliczka__renderTabs(idxTab) {
  225. // tabNodes.forEach(function (tabNode) {
  226. // tabNode.style.display = 'none'
  227. // })
  228. // tabNodes[idxTab].style.display = 'block'
  229. // }
  230. //
  231. // p5__Zaliczka__renderTabs(idxSelected)
  232. //
  233. // window.p5__Zaliczka__showTab = p5__Zaliczka__showTab
  234. // })(window)
  235. // ");
  236. }
  237. public function viewWidgetUserWnioski($data = []) {
  238. $idUser = V::get('idUser', User::getID(), $data);
  239. if (!$idUser) throw new Exception("Błędny numer pracownika");
  240. // $workerLogin = DB::getPDO()->fetchValue("select u.ADM_ACCOUNT from ADMIN_USERS u where u.ID={$idUser} limit 1");
  241. // if (!$workerLogin) throw new Exception("Pracownik nie został odnaleziony - nr '{$idUser}'");
  242. // $acl = ACL::getAclByNamespace("default_db/ZALICZKA_WNIOSEK/ZaliczkaWniosek");
  243. $acl = ACL::getAclByNamespace("default_db/zaliczka_wniosek_info_view");
  244. $syncUrl = Request::getPathUri() . 'index.php?_route=ViewTableAjax&namespace=' . $acl->getNamespace();
  245. $tbl = new TableAjax($acl);
  246. $tblLabel = $acl->getNamespace();
  247. if ('default_db' == $acl->getSourceName()) {
  248. $tblLabel = array();
  249. $zasobObj = ProcesHelper::getZasobTableInfo($acl->getID());
  250. if (!$zasobObj) throw new Exception("Zasob TABELA ID=" . $acl->getID() . " nie istnieje");
  251. if (!empty($zasobObj->DESC_PL)) $tblLabel[] = $zasobObj->DESC_PL;
  252. if (!empty($zasobObj->OPIS)) $tblLabel[] = $zasobObj->OPIS;
  253. $tblLabel = implode(" - ", $tblLabel);
  254. }
  255. $tbl->setSyncUrl($syncUrl);
  256. $tbl->setLabel($tblLabel);
  257. $tbl->setRowFunctions([]);
  258. $tbl->setFilterInit([
  259. 'currSortCol' => "created",
  260. 'currSortFlip' => "desc"
  261. ]);
  262. $tbl->setForceFilterInit([
  263. 'ID_USER' => $idUser
  264. // 'workerLogin' => $workerLogin
  265. ]);
  266. echo $tbl->render();
  267. }
  268. public function viewWidgetUserZaliczki($data = []) {
  269. $idUser = V::get('idUser', User::getID(), $data);
  270. if (!$idUser) throw new Exception("Błędny numer pracownika");
  271. $workerLogin = DB::getPDO()->fetchValue("select u.ADM_ACCOUNT from ADMIN_USERS u where u.ID={$idUser} limit 1");
  272. if (!$workerLogin) throw new Exception("Pracownik nie został odnaleziony - nr '{$idUser}'");
  273. $acl = ACL::getAclByNamespace("default_db/ZALICZKA_INFO_VIEW");// 'default_db/ZALICZKA/Zaliczka'
  274. $syncUrl = Request::getPathUri() . 'index.php?_route=ViewTableAjax&namespace=' . $acl->getNamespace();
  275. $tbl = new TableAjax($acl);
  276. $tblLabel = $acl->getNamespace();
  277. if ('default_db' == $acl->getSourceName()) {
  278. $tblLabel = array();
  279. $zasobObj = ProcesHelper::getZasobTableInfo($acl->getID());
  280. if (!$zasobObj) throw new Exception("Zasob TABELA ID=" . $acl->getID() . " nie istnieje");
  281. if (!empty($zasobObj->DESC_PL)) $tblLabel[] = $zasobObj->DESC_PL;
  282. if (!empty($zasobObj->OPIS)) $tblLabel[] = $zasobObj->OPIS;
  283. $tblLabel = implode(" - ", $tblLabel);
  284. }
  285. $tbl->setSyncUrl($syncUrl);
  286. $tbl->setLabel($tblLabel);
  287. $tbl->setRowFunctions([]);
  288. $tbl->setFilterInit([
  289. 'currSortCol' => "ID",
  290. 'currSortFlip' => "desc"
  291. ]);
  292. $tbl->setForceFilterInit([
  293. 'L_APPOITMENT_USER' => $workerLogin
  294. ]);
  295. echo $tbl->render();
  296. // $acl = ACL::getAclByNamespace("default_db/ZALICZKA/Zaliczka");
  297. // UI::table([
  298. // 'caption' => "Zaliczki",
  299. // 'rows' => array_map(
  300. // function ($row) use ($idUser) {
  301. // $instance = DB::getPDO()->fetchValue("select INSTANCE_NAME from `ZALICZKA__#INSTANCE` where PRIMARY_KEY = {$row['id']}");
  302. // $editLink = Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&idUser={$idUser}&idZaliczka={$row['id']}";
  303. // $editLabel = ('ZaliczkaAktywna' == $instance) ? "Rozlicz / Podgląd" : "Podgląd";
  304. // $histLink = Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&_task=hist&idUser={$idUser}&idZaliczka={$row['id']}";
  305. // return [
  306. // 'Nr' => $row['id'],
  307. // 'Typ' => $instance,
  308. // 'Pracownik' => $row['L_APPOITMENT_USER'],
  309. // 'Kwota' => $row['kwota'],
  310. // 'Nierozliczona kwota' => $row['nierozliczona_kwota'],
  311. // '#' => '<a href="' . $editLink . '">' . $editLabel . '</a>' . (V::get('DBG', '', $_GET)
  312. // ? '<a href="' . $histLink . '">' . "DBG HIST" . '</a>'
  313. // : ''
  314. // ),
  315. // ];
  316. // },
  317. // $acl->getItems([
  318. // '#refFrom' => [
  319. // 'namespace' => 'default_db__x3A__ADMIN_USERS/Worker',
  320. // 'primaryKey' => $idUser
  321. // ]
  322. // ])
  323. // ),
  324. // 'empty_msg' => "Brak",
  325. // 'disable_lp' => true,
  326. // ]);
  327. }
  328. public function addAction() {
  329. $idUser = V::get('idUser', User::getID(), $_REQUEST, 'int');
  330. $kwota = V::get('kwota', 0, $_REQUEST, 'price');
  331. $uwagi = V::get('uwagi', '', $_REQUEST);
  332. try {
  333. if (!$idUser) throw new Exception("Błędny numer pracownika");
  334. $workerLogin = DB::getPDO()->fetchValue("select u.ADM_ACCOUNT from ADMIN_USERS u where u.ID={$idUser} limit 1");
  335. if (!$workerLogin) throw new Exception("Pracownik nie został odnaleziony - nr '{$idUser}'");
  336. $acl = ACL::getAclByNamespace("default_db/ZALICZKA_WNIOSEK/ZaliczkaWniosek");
  337. $id = $acl->addItem([
  338. 'kwota' => $kwota,
  339. 'uwagi' => $uwagi,
  340. 'workerLogin' => $workerLogin
  341. ]);
  342. if (!$id) throw new Exception("Nie udało się utworzyć wniosku o zaliczkę");
  343. } catch (Exception $e) {
  344. UI::gora();
  345. UI::startContainer();
  346. UI::alert('danger', $e->getMessage() . UI::h('p', [], [
  347. UI::h('a', [ 'href' => "index.php?_route=UrlAction_UserProNetMediaZaliczka&idUser={$idUser}" ], [
  348. '<i class="glyphicon glyphicon-arrow-left"></i>',
  349. " wróć",
  350. ])
  351. ]));
  352. UI::endContainer();
  353. UI::dol();
  354. DBG::log($e);
  355. exit;
  356. }
  357. $redirectUrl = Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&idUser={$idUser}";// TODO:? &idWniosek={$id}
  358. if (!headers_sent()) {
  359. header("Location: {$redirectUrl}");
  360. } else {
  361. echo'<script type="text/javascript">'."
  362. window.location.href='{$redirectUrl}';
  363. ".'</script>';
  364. echo "\n".'<noscript>';
  365. echo "\n".'<meta http-equiv="refresh" content="0;url='.$redirectUrl.'" />';
  366. echo "\n".'</noscript>';
  367. echo'<p>'.'<a href="'.$redirectUrl.'">'."dalej".'</a>'.'</p>';
  368. }
  369. }
  370. public function reinstallAction() {
  371. UI::gora();
  372. try {
  373. ACL::getAclByNamespace("default_db/ZALICZKA/Zaliczka")->reinstall();
  374. ACL::getAclByNamespace("default_db/ZALICZKA_WNIOSEK/ZaliczkaWniosek")->reinstall();
  375. UI::startContainer();
  376. UI::alert('success', "Structure for 'default_db/ZALICZKA/Zaliczka' created in a database");
  377. $backUrl = Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka";
  378. UI::tag('a', ['href'=>$backUrl, 'class'=>"btn btn-primary"], "wróć");
  379. $databaseName = DB::getPDO()->getDatabaseName();
  380. UI::table([
  381. 'caption' => "Zaliczka Wniosek",
  382. 'rows' => DB::getPDO()->fetchAll("
  383. select t.TABLE_NAME, t.COLUMN_NAME, t.DATA_TYPE, t.COLUMN_TYPE
  384. from `information_schema`.`COLUMNS` t
  385. where t.TABLE_SCHEMA = '{$databaseName}'
  386. and (t.TABLE_NAME like 'ZALICZKA_WNIOSEK'
  387. or t.TABLE_NAME like 'ZALICZKA_WNIOSEK_HIST'
  388. )
  389. order by t.TABLE_NAME asc, t.COLUMN_NAME asc
  390. ")
  391. ]);
  392. UI::table([
  393. 'caption' => "Zaliczka",
  394. 'rows' => DB::getPDO()->fetchAll("
  395. select t.TABLE_NAME, t.COLUMN_NAME, t.DATA_TYPE, t.COLUMN_TYPE
  396. from `information_schema`.`COLUMNS` t
  397. where t.TABLE_SCHEMA = '{$databaseName}'
  398. and (t.TABLE_NAME like 'ZALICZKA'
  399. or t.TABLE_NAME like 'ZALICZKA\_\_%'
  400. or t.TABLE_NAME like 'ZALICZKA_HIST'
  401. or t.TABLE_NAME like 'Zaliczka\_\_%'
  402. )
  403. order by t.TABLE_NAME asc, t.COLUMN_NAME asc
  404. ")
  405. ]);
  406. UI::table([
  407. 'caption' => "Zaliczka Pozycja",
  408. 'rows' => DB::getPDO()->fetchAll("
  409. select t.TABLE_NAME, t.COLUMN_NAME, t.DATA_TYPE, t.COLUMN_TYPE
  410. from `information_schema`.`COLUMNS` t
  411. where t.TABLE_SCHEMA = '{$databaseName}'
  412. and (t.TABLE_NAME like 'ZALICZKA_POZYCJA'
  413. or t.TABLE_NAME like 'ZALICZKA_POZYCJA\_\_%'
  414. or t.TABLE_NAME like 'ZALICZKA_POZYCJA_HIST'
  415. or t.TABLE_NAME like 'ZaliczkaPozycja\_\_%'
  416. )
  417. order by t.TABLE_NAME asc, t.COLUMN_NAME asc
  418. ")
  419. ]);
  420. $tableList = array_map(
  421. function($item) {
  422. return $item['TABLE_NAME'];
  423. }
  424. , DB::getPDO()->fetchAll("
  425. select t.TABLE_NAME
  426. from `information_schema`.`COLUMNS` t
  427. where t.TABLE_SCHEMA = '{$databaseName}'
  428. and (t.TABLE_NAME like 'ZALICZKA'
  429. or t.TABLE_NAME like 'ZALICZKA\_\_%'
  430. or t.TABLE_NAME like 'ZALICZKA_HIST'
  431. or t.TABLE_NAME like 'Zaliczka\_\_%'
  432. or t.TABLE_NAME like 'ZALICZKA_POZYCJA'
  433. or t.TABLE_NAME like 'ZALICZKA_POZYCJA\_\_%'
  434. or t.TABLE_NAME like 'ZALICZKA_POZYCJA_HIST'
  435. or t.TABLE_NAME like 'ZaliczkaPozycja\_\_%'
  436. or t.TABLE_NAME like 'ZALICZKA_WNIOSEK'
  437. or t.TABLE_NAME like 'ZALICZKA_WNIOSEK_HIST'
  438. )
  439. group by t.TABLE_NAME
  440. ")
  441. );
  442. foreach ($tableList as $tableName) {
  443. UI::startTag('div', ['style'=>"margin:10px 0; max-width:100%; overflow:scroll; border:1px solid #ccc"]);
  444. UI::table([
  445. 'caption' => "Tabela '{$tableName}'",
  446. 'rows' => DB::getPDO()->fetchAll("
  447. select t.*
  448. from `{$tableName}` t
  449. ")
  450. ]);
  451. UI::endTag('div');
  452. }
  453. if ('1' == V::get('_clear', '', $_GET)) {
  454. foreach ($tableList as $tableName) {
  455. DB::getPDO()->exec("TRUNCATE `{$tableName}`");
  456. }
  457. UI::tag('a', ['class'=>"btn btn-primary", 'href'=>"index.php?_route=UrlAction_UserProNetMediaZaliczka&_task=reinstall"], "Dane usunięte - odśwież stronę");
  458. } else {
  459. UI::tag('a', ['class'=>"btn btn-danger", 'href'=>"index.php?_route=UrlAction_UserProNetMediaZaliczka&_task=reinstall&_clear=1"], "Wyczyść tabele");
  460. }
  461. UI::startTag('pre');
  462. foreach ($tableList as $tableName) {
  463. echo "DROP TABLE `{$tableName}`;\n";
  464. }
  465. UI::endTag('pre');
  466. ACL::getRefTable('default_db/ZALICZKA/Zaliczka', 'worker');
  467. ACL::getRefTable('default_db/ZALICZKA/Zaliczka', 'pozycja');
  468. ACL::getRefTable('default_db/ZALICZKA/Zaliczka', 'korespondencja');
  469. $refZaliczkaTables = DB::getPDO()->fetchAll("
  470. select t.*
  471. from `CRM_REF_CONFIG` t
  472. where t.ROOT_OBJECT_NS like 'default_db/ZALICZKA%'
  473. ");
  474. UI::startTag('div', ['style'=>"margin:10px 0; max-width:100%; overflow:scroll; border:1px solid #ccc"]);
  475. UI::table([
  476. 'caption' => "Tabela 'CRM_REF_CONFIG'",
  477. 'rows' => $refZaliczkaTables
  478. ]);
  479. UI::endTag('div');
  480. foreach ($refZaliczkaTables as $refInfo) {
  481. $tableName = "CRM__#REF_TABLE__" . $refInfo['ID'];
  482. UI::startTag('div', ['style'=>"margin:10px 0; max-width:100%; overflow:scroll; border:1px solid #ccc"]);
  483. UI::table([
  484. 'caption' => "Tabela REF '{$tableName}' - <small><i>{$refInfo['ROOT_OBJECT_NS']} REF {$refInfo['CHILD_NAME']} ({$refInfo['CHILD_NS']})</i></small>",
  485. 'rows' => DB::getPDO()->fetchAll("
  486. select t.*
  487. from `{$tableName}` t
  488. ")
  489. ]);
  490. UI::endTag('div');
  491. }
  492. if ('1' == V::get('_clear', '', $_GET)) {
  493. foreach ($refZaliczkaTables as $refInfo) {
  494. $tableName = "CRM__#REF_TABLE__" . $refInfo['ID'];
  495. DB::getPDO()->exec("TRUNCATE `{$tableName}`");
  496. }
  497. UI::tag('a', ['class'=>"btn btn-primary", 'href'=>"index.php?_route=UrlAction_UserProNetMediaZaliczka&_task=reinstall"], "Dane usunięte - odśwież stronę");
  498. }
  499. {// view grouped info
  500. $refTableWorker = ACL::getRefTable('default_db/ZALICZKA/Zaliczka', 'worker');
  501. $refTablePozycja = ACL::getRefTable('default_db/ZALICZKA/Zaliczka', 'pozycja');
  502. DB::getPDO()->execSql("
  503. CREATE OR REPLACE VIEW `ZALICZKA_INFO_VIEW` AS
  504. select t.ID
  505. , u.ID as ID_USER
  506. , t.L_APPOITMENT_USER
  507. , t.A_STATUS
  508. , t.KWOTA
  509. , t.UWAGI
  510. , t.NIEROZLICZONA_KWOTA
  511. , t.APPROVED_BY
  512. , t.PAYMENT_METHOD
  513. , sum(COALESCE(p.kwota, 0)) as rozliczona_kwota
  514. from ZALICZKA t
  515. join ADMIN_USERS u on(u.ADM_ACCOUNT = t.L_APPOITMENT_USER)
  516. left join `{$refTablePozycja}` refPoz on(refPoz.PRIMARY_KEY = t.ID and refPoz.A_STATUS != 'DELETED')
  517. left join ZALICZKA_POZYCJA p on(p.ID = refPoz.REMOTE_PRIMARY_KEY and (p.A_STATUS not in ('DELETED')))
  518. where t.A_STATUS not in ('DELETED')
  519. group by t.ID
  520. ");
  521. DB::getPDO()->execSql("
  522. CREATE OR REPLACE VIEW `ZALICZKA_USER_SALDO_VIEW` AS
  523. select u.ID, u.ADM_ACCOUNT, u.ADM_NAME
  524. , (
  525. select (v.KWOTA + v.NIEROZLICZONA_KWOTA - v.rozliczona_kwota) as saldo
  526. from ZALICZKA_INFO_VIEW v
  527. where v.L_APPOITMENT_USER = u.ADM_ACCOUNT
  528. order by v.ID desc
  529. limit 1
  530. ) as saldo
  531. , sum(t.KWOTA) as suma_zaliczek
  532. from ZALICZKA t
  533. join ADMIN_USERS u on(u.ADM_ACCOUNT = t.L_APPOITMENT_USER)
  534. where t.A_STATUS not in ('DELETED')
  535. group by u.ADM_ACCOUNT
  536. ");
  537. DB::getPDO()->execSql("
  538. CREATE OR REPLACE VIEW `ZALICZKA_WNIOSEK_INFO_VIEW` AS
  539. select t.ID
  540. , t.A_RECORD_CREATE_DATE as created
  541. , t.A_RECORD_CREATE_DATE
  542. , t.A_RECORD_CREATE_AUTHOR
  543. , t.A_RECORD_UPDATE_DATE
  544. , t.A_RECORD_UPDATE_AUTHOR
  545. , u.ID as ID_USER
  546. , t.L_APPOITMENT_USER
  547. , t.A_STATUS
  548. , t.KWOTA
  549. , t.UWAGI
  550. , t.APPROVED_BY
  551. , IF('WAITING' = t.A_STATUS, 'Oczekuje zatwierdzenia',
  552. IF ('NORMAL' = t.A_STATUS, 'Zatwierdzony',
  553. IF ('OFF_HARD' = t.A_STATUS, 'Odrzucony',
  554. IF ('DELETED' = t.A_STATUS, 'Anulowany',
  555. 'nieznany'
  556. )
  557. )
  558. )
  559. ) as status
  560. from ZALICZKA_WNIOSEK t
  561. join ADMIN_USERS u on(u.ADM_ACCOUNT = t.L_APPOITMENT_USER)
  562. -- where t.A_STATUS not in ('DELETED')
  563. group by t.ID
  564. ");
  565. UI::table([
  566. 'caption' => "Table `ZALICZKA_USER_SALDO_VIEW`",
  567. 'rows' => DB::getPDO()->fetchAll(" select * from `ZALICZKA_USER_SALDO_VIEW` ")
  568. ]);
  569. UI::table([
  570. 'caption' => "Table `ZALICZKA_INFO_VIEW`",
  571. 'rows' => DB::getPDO()->fetchAll(" select * from `ZALICZKA_INFO_VIEW` ")
  572. ]);
  573. UI::table([
  574. 'caption' => "Table `ZALICZKA_INFO_VIEW` - debug (with deleted)",
  575. 'rows' => DB::getPDO()->fetchAll("
  576. select t.ID
  577. , t.A_STATUS
  578. , t.L_APPOITMENT_USER
  579. , t.KWOTA
  580. , t.NIEROZLICZONA_KWOTA
  581. , IF(p.ID is null, 'NULL', p.ID) as p__ID
  582. , p.A_STATUS as p__A_STATUS
  583. , p.L_APPOITMENT_USER as p__L_APPOITMENT_USER
  584. , p.nr_faktury as p__nr_faktury
  585. , p.kwota as p__kwota
  586. , p.kwota_netto as p__kwota_netto
  587. , p.vat as p__vat
  588. , p.kategoria_kosztu as p__kategoria_kosztu
  589. from ZALICZKA t
  590. left join `{$refTablePozycja}` refPoz on(refPoz.PRIMARY_KEY = t.ID)
  591. left join ZALICZKA_POZYCJA p on(p.ID = refPoz.REMOTE_PRIMARY_KEY)
  592. ")
  593. ]);
  594. UI::table([
  595. 'caption' => "Table `ZALICZKA_WNIOSEK_INFO_VIEW`",
  596. 'rows' => DB::getPDO()->fetchAll(" select * from `ZALICZKA_WNIOSEK_INFO_VIEW` ")
  597. ]);
  598. }
  599. Router::getRoute('UrlAction_UserProNetMediaZaliczkaWniosekConfirm')->reinstall();
  600. Router::getRoute('UrlAction_UserProNetMediaZaliczkaWniosekRemove')->reinstall();
  601. UI::endContainer();
  602. } catch (Exception $e) {
  603. UI::alert('danger', $e->getMessage());
  604. DBG::log($e);
  605. }
  606. UI::dol();
  607. }
  608. public function zaliczkaFormView($data) {
  609. $idUser = V::get('idUser', User::getID(), $data);
  610. $idZaliczka = V::get('idZaliczka', 0, $data);
  611. UI::tag('div', ['id'=>"zaliczka-app", 'data-dbg'=>V::get('DBG', '', $_GET), 'data-sync-js-function'=>"syncZaliczkaState", 'data-fetch-data-js-function'=>"zaliczkaFetchData"]);
  612. UI::emptyTag('br');
  613. $acl = ACL::getAclByNamespace("default_db/ZALICZKA/Zaliczka");
  614. $schema = $acl->getSimpleSchemaTree();
  615. // DBG::nicePrint($schema, '$schema');
  616. UI::inlineJS(__FILE__ . '.fetchData.js', [
  617. 'SYNC_URL' => Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&_task=fetchDataAjax&idUser={$idUser}&idZaliczka={$idZaliczka}",
  618. 'DBG' => (DBG::isActive())
  619. ]);
  620. UI::inlineJS(__FILE__ . '.syncState.js', [
  621. 'SYNC_URL' => Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&_task=syncStateAjax&idUser={$idUser}&idZaliczka={$idZaliczka}",
  622. 'DBG' => (DBG::isActive())
  623. ]);
  624. UI::tag('script', ['src'=>'static/vendor.js' . (V::get('DBG', '', $_GET) ? '?_ts=' . time() : ''), 'type'=>'text/javascript']);
  625. UI::tag('script', ['src'=>'static/zaliczka/main.js' . (V::get('DBG', '', $_GET) ? '?_ts=' . time() : ''), 'type'=>'text/javascript']);
  626. }
  627. public function histAction() {
  628. UI::gora();
  629. // UI::menu();
  630. try {
  631. $idZaliczka = V::get('idZaliczka', 0, $_GET, 'int');
  632. if ($idZaliczka <= 0) throw new Exception("Missing idZaliczka");
  633. $acl = ACL::getAclByNamespace("default_db/ZALICZKA/Zaliczka");
  634. $zaliczka = $acl->getItem($idZaliczka);
  635. if (!$zaliczka) throw new Exception("Zaliczka not found!");
  636. DBG::nicePrint($zaliczka, '$zaliczka');
  637. } catch (Exception $e) {
  638. UI::alert('danger', $e->getMessage());
  639. }
  640. UI::dol();
  641. }
  642. }
  643. /* Akcje
  644. # dodanie pierwszej zaliczki - 500 zł
  645. $data = [ worker => [ login => 'Kowalski' ], kwota => 500.00 ]
  646. insert into `ZALICZKA` (`L_APPOITMENT_USER`, `KWOTA`) values('{$data['worker']['login']}', '{$data['kwota']}');
  647. -- return id = 123
  648. # rozliczenie częściowe pierwszej zaliczki np. 500 zł
  649. $data = [ id => 123, pozycja => [ [ kwota => 200.00, korespondencja => [ ... ], projekt => [ ... ] ] ] ]
  650. update `ZALICZKA__#REF__POZYCJA` set `A_STATUS` = 'DELETED' where `PRIMARY_KEY` = 123;
  651. */