UserProNetMediaZaliczka.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673
  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::getStorageByNamespace("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::getStorageByNamespace($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::getStorageByNamespace($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::getStorageByNamespace("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::getStorageByNamespace("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. ]),
  181. UI::h('li', ['role' => "presentation", 'class' => ('zaliczki' == $tab) ? "active" : ''], [
  182. UI::h('a', ['href'=>Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&idUser={$idUser}&tab=zaliczki"], "Zaliczki")
  183. ]),
  184. ]);
  185. if ('wnioski' == $tab) {
  186. $this->viewWidgetUserWnioski($idUser);
  187. } else if ('zaliczki' == $tab) {
  188. $this->viewWidgetUserZaliczki($idUser);
  189. }
  190. UI::endContainer();
  191. }
  192. public function viewWidgetUserWnioski($idUser) {
  193. if (!$idUser) throw new Exception("Błędny numer pracownika");
  194. // $workerLogin = DB::getPDO()->fetchValue("select u.ADM_ACCOUNT from ADMIN_USERS u where u.ID={$idUser} limit 1");
  195. // if (!$workerLogin) throw new Exception("Pracownik nie został odnaleziony - nr '{$idUser}'");
  196. // $acl = ACL::getStorageByNamespace("default_db/ZALICZKA_WNIOSEK/ZaliczkaWniosek");
  197. $acl = ACL::getStorageByNamespace("default_db/zaliczka_wniosek_info_view");
  198. $syncUrl = Request::getPathUri() . 'index.php?_route=ViewTableAjax&namespace=' . $acl->getNamespace();
  199. $tbl = new TableAjax($acl);
  200. $tblLabel = $acl->getNamespace();
  201. if ('default_db' == $acl->getSourceName()) {
  202. $tblLabel = array();
  203. $zasobObj = ProcesHelper::getZasobTableInfo($acl->getID());
  204. if (!$zasobObj) throw new Exception("Zasob TABELA ID=" . $acl->getID() . " nie istnieje");
  205. if (!empty($zasobObj->DESC_PL)) $tblLabel[] = $zasobObj->DESC_PL;
  206. if (!empty($zasobObj->OPIS)) $tblLabel[] = $zasobObj->OPIS;
  207. $tblLabel = implode(" - ", $tblLabel);
  208. }
  209. $tbl->setSyncUrl($syncUrl);
  210. $tbl->setLabel($tblLabel);
  211. $tbl->setRowFunctions([]);
  212. $tbl->setFilterInit([
  213. 'currSortCol' => "created",
  214. 'currSortFlip' => "desc"
  215. ]);
  216. $tbl->setForceFilterInit([
  217. 'ID_USER' => $idUser
  218. // 'workerLogin' => $workerLogin
  219. ]);
  220. echo $tbl->render();
  221. }
  222. public function viewWidgetUserZaliczki($idUser) {
  223. if (!$idUser) throw new Exception("Błędny numer pracownika");
  224. $workerLogin = DB::getPDO()->fetchValue("select u.ADM_ACCOUNT from ADMIN_USERS u where u.ID={$idUser} limit 1");
  225. if (!$workerLogin) throw new Exception("Pracownik nie został odnaleziony - nr '{$idUser}'");
  226. $acl = ACL::getStorageByNamespace("default_db/ZALICZKA_INFO_VIEW");// 'default_db/ZALICZKA/Zaliczka'
  227. $syncUrl = Request::getPathUri() . 'index.php?_route=ViewTableAjax&namespace=' . $acl->getNamespace();
  228. $tbl = new TableAjax($acl);
  229. $tblLabel = $acl->getNamespace();
  230. if ('default_db' == $acl->getSourceName()) {
  231. $tblLabel = array();
  232. $zasobObj = ProcesHelper::getZasobTableInfo($acl->getID());
  233. if (!$zasobObj) throw new Exception("Zasob TABELA ID=" . $acl->getID() . " nie istnieje");
  234. if (!empty($zasobObj->DESC_PL)) $tblLabel[] = $zasobObj->DESC_PL;
  235. if (!empty($zasobObj->OPIS)) $tblLabel[] = $zasobObj->OPIS;
  236. $tblLabel = implode(" - ", $tblLabel);
  237. }
  238. $tbl->setSyncUrl($syncUrl);
  239. $tbl->setLabel($tblLabel);
  240. $tbl->setRowFunctions([]);
  241. $tbl->setFilterInit([
  242. 'currSortCol' => "ID",
  243. 'currSortFlip' => "desc"
  244. ]);
  245. $tbl->setForceFilterInit([
  246. 'ID_USER' => $idUser
  247. ]);
  248. echo $tbl->render();
  249. // $acl = ACL::getStorageByNamespace("default_db/ZALICZKA/Zaliczka");
  250. // UI::table([
  251. // 'caption' => "Zaliczki",
  252. // 'rows' => array_map(
  253. // function ($row) use ($idUser) {
  254. // $instance = DB::getPDO()->fetchValue("select INSTANCE_NAME from `ZALICZKA__#INSTANCE` where PRIMARY_KEY = {$row['id']}");
  255. // $editLink = Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&idUser={$idUser}&idZaliczka={$row['id']}";
  256. // $editLabel = ('ZaliczkaAktywna' == $instance) ? "Rozlicz / Podgląd" : "Podgląd";
  257. // $histLink = Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&_task=hist&idUser={$idUser}&idZaliczka={$row['id']}";
  258. // return [
  259. // 'Nr' => $row['id'],
  260. // 'Typ' => $instance,
  261. // 'Pracownik' => $row['L_APPOITMENT_USER'],
  262. // 'Kwota' => $row['kwota'],
  263. // 'Nierozliczona kwota' => $row['nierozliczona_kwota'],
  264. // '#' => '<a href="' . $editLink . '">' . $editLabel . '</a>' . (V::get('DBG', '', $_GET)
  265. // ? '<a href="' . $histLink . '">' . "DBG HIST" . '</a>'
  266. // : ''
  267. // ),
  268. // ];
  269. // },
  270. // $acl->getItems([
  271. // '#refFrom' => [
  272. // 'namespace' => 'default_db__x3A__ADMIN_USERS/Worker',
  273. // 'primaryKey' => $idUser
  274. // ]
  275. // ])
  276. // ),
  277. // 'empty_msg' => "Brak",
  278. // 'disable_lp' => true,
  279. // ]);
  280. }
  281. public function addAction() {
  282. $idUser = V::get('idUser', User::getID(), $_REQUEST, 'int');
  283. $kwota = V::get('kwota', 0, $_REQUEST, 'price');
  284. $uwagi = V::get('uwagi', '', $_REQUEST);
  285. try {
  286. if (!$idUser) throw new Exception("Błędny numer pracownika");
  287. $workerLogin = DB::getPDO()->fetchValue("select u.ADM_ACCOUNT from ADMIN_USERS u where u.ID={$idUser} limit 1");
  288. if (!$workerLogin) throw new Exception("Pracownik nie został odnaleziony - nr '{$idUser}'");
  289. $acl = ACL::getStorageByNamespace("default_db/ZALICZKA_WNIOSEK/ZaliczkaWniosek");
  290. $id = $acl->addItem([
  291. 'kwota' => $kwota,
  292. 'uwagi' => $uwagi,
  293. 'workerLogin' => $workerLogin
  294. ]);
  295. if (!$id) throw new Exception("Nie udało się utworzyć wniosku o zaliczkę");
  296. } catch (Exception $e) {
  297. UI::gora();
  298. UI::startContainer();
  299. UI::alert('danger', $e->getMessage() . UI::h('p', [], [
  300. UI::h('a', [ 'href' => "index.php?_route=UrlAction_UserProNetMediaZaliczka&idUser={$idUser}" ], [
  301. '<i class="glyphicon glyphicon-arrow-left"></i>',
  302. " wróć",
  303. ])
  304. ]));
  305. UI::endContainer();
  306. UI::dol();
  307. DBG::log($e);
  308. exit;
  309. }
  310. $redirectUrl = Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&idUser={$idUser}";// TODO:? &idWniosek={$id}
  311. if (!headers_sent()) {
  312. header("Location: {$redirectUrl}");
  313. } else {
  314. echo'<script type="text/javascript">'."
  315. window.location.href='{$redirectUrl}';
  316. ".'</script>';
  317. echo "\n".'<noscript>';
  318. echo "\n".'<meta http-equiv="refresh" content="0;url='.$redirectUrl.'" />';
  319. echo "\n".'</noscript>';
  320. echo'<p>'.'<a href="'.$redirectUrl.'">'."dalej".'</a>'.'</p>';
  321. }
  322. }
  323. public function reinstallAction() {
  324. UI::gora();
  325. try {
  326. ACL::getStorageByNamespace("default_db/ZALICZKA/Zaliczka")->reinstall();
  327. ACL::getStorageByNamespace("default_db/ZALICZKA_WNIOSEK/ZaliczkaWniosek")->reinstall();
  328. UI::startContainer();
  329. UI::alert('success', "Structure for 'default_db/ZALICZKA/Zaliczka' created in a database");
  330. $backUrl = Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka";
  331. UI::tag('a', ['href'=>$backUrl, 'class'=>"btn btn-primary"], "wróć");
  332. $databaseName = DB::getPDO()->getDatabaseName();
  333. UI::table([
  334. 'caption' => "Zaliczka Wniosek",
  335. 'rows' => DB::getPDO()->fetchAll("
  336. select t.TABLE_NAME, t.COLUMN_NAME, t.DATA_TYPE, t.COLUMN_TYPE
  337. from `information_schema`.`COLUMNS` t
  338. where t.TABLE_SCHEMA = '{$databaseName}'
  339. and (t.TABLE_NAME like 'ZALICZKA_WNIOSEK'
  340. or t.TABLE_NAME like 'ZALICZKA_WNIOSEK_HIST'
  341. )
  342. order by t.TABLE_NAME asc, t.COLUMN_NAME asc
  343. ")
  344. ]);
  345. UI::table([
  346. 'caption' => "Zaliczka",
  347. 'rows' => DB::getPDO()->fetchAll("
  348. select t.TABLE_NAME, t.COLUMN_NAME, t.DATA_TYPE, t.COLUMN_TYPE
  349. from `information_schema`.`COLUMNS` t
  350. where t.TABLE_SCHEMA = '{$databaseName}'
  351. and (t.TABLE_NAME like 'ZALICZKA'
  352. or t.TABLE_NAME like 'ZALICZKA\_\_%'
  353. or t.TABLE_NAME like 'ZALICZKA_HIST'
  354. or t.TABLE_NAME like 'Zaliczka\_\_%'
  355. )
  356. order by t.TABLE_NAME asc, t.COLUMN_NAME asc
  357. ")
  358. ]);
  359. UI::table([
  360. 'caption' => "Zaliczka Pozycja",
  361. 'rows' => DB::getPDO()->fetchAll("
  362. select t.TABLE_NAME, t.COLUMN_NAME, t.DATA_TYPE, t.COLUMN_TYPE
  363. from `information_schema`.`COLUMNS` t
  364. where t.TABLE_SCHEMA = '{$databaseName}'
  365. and (t.TABLE_NAME like 'ZALICZKA_POZYCJA'
  366. or t.TABLE_NAME like 'ZALICZKA_POZYCJA\_\_%'
  367. or t.TABLE_NAME like 'ZALICZKA_POZYCJA_HIST'
  368. or t.TABLE_NAME like 'ZaliczkaPozycja\_\_%'
  369. )
  370. order by t.TABLE_NAME asc, t.COLUMN_NAME asc
  371. ")
  372. ]);
  373. $tableList = array_map(
  374. function($item) {
  375. return $item['TABLE_NAME'];
  376. }
  377. , DB::getPDO()->fetchAll("
  378. select t.TABLE_NAME
  379. from `information_schema`.`COLUMNS` t
  380. where t.TABLE_SCHEMA = '{$databaseName}'
  381. and (t.TABLE_NAME like 'ZALICZKA'
  382. or t.TABLE_NAME like 'ZALICZKA\_\_%'
  383. or t.TABLE_NAME like 'ZALICZKA_HIST'
  384. or t.TABLE_NAME like 'Zaliczka\_\_%'
  385. or t.TABLE_NAME like 'ZALICZKA_POZYCJA'
  386. or t.TABLE_NAME like 'ZALICZKA_POZYCJA\_\_%'
  387. or t.TABLE_NAME like 'ZALICZKA_POZYCJA_HIST'
  388. or t.TABLE_NAME like 'ZaliczkaPozycja\_\_%'
  389. or t.TABLE_NAME like 'ZALICZKA_WNIOSEK'
  390. or t.TABLE_NAME like 'ZALICZKA_WNIOSEK_HIST'
  391. )
  392. group by t.TABLE_NAME
  393. ")
  394. );
  395. foreach ($tableList as $tableName) {
  396. UI::startTag('div', ['style'=>"margin:10px 0; max-width:100%; overflow:scroll; border:1px solid #ccc"]);
  397. UI::table([
  398. 'caption' => "Tabela '{$tableName}'",
  399. 'rows' => DB::getPDO()->fetchAll("
  400. select t.*
  401. from `{$tableName}` t
  402. ")
  403. ]);
  404. UI::endTag('div');
  405. }
  406. if ('1' == V::get('_clear', '', $_GET)) {
  407. foreach ($tableList as $tableName) {
  408. DB::getPDO()->exec("TRUNCATE `{$tableName}`");
  409. }
  410. UI::tag('a', ['class'=>"btn btn-primary", 'href'=>"index.php?_route=UrlAction_UserProNetMediaZaliczka&_task=reinstall"], "Dane usunięte - odśwież stronę");
  411. } else {
  412. UI::tag('a', ['class'=>"btn btn-danger", 'href'=>"index.php?_route=UrlAction_UserProNetMediaZaliczka&_task=reinstall&_clear=1"], "Wyczyść tabele");
  413. }
  414. UI::startTag('pre');
  415. foreach ($tableList as $tableName) {
  416. echo "DROP TABLE `{$tableName}`;\n";
  417. }
  418. UI::endTag('pre');
  419. ACL::getRefTable('default_db/ZALICZKA/Zaliczka', 'worker');
  420. ACL::getRefTable('default_db/ZALICZKA/Zaliczka', 'pozycja');
  421. ACL::getRefTable('default_db/ZALICZKA/Zaliczka', 'korespondencja');
  422. $refZaliczkaTables = DB::getPDO()->fetchAll("
  423. select t.*
  424. from `CRM_REF_CONFIG` t
  425. where t.ROOT_OBJECT_NS like 'default_db/ZALICZKA%'
  426. ");
  427. UI::startTag('div', ['style'=>"margin:10px 0; max-width:100%; overflow:scroll; border:1px solid #ccc"]);
  428. UI::table([
  429. 'caption' => "Tabela 'CRM_REF_CONFIG'",
  430. 'rows' => $refZaliczkaTables
  431. ]);
  432. UI::endTag('div');
  433. foreach ($refZaliczkaTables as $refInfo) {
  434. $tableName = "CRM__#REF_TABLE__" . $refInfo['ID'];
  435. UI::startTag('div', ['style'=>"margin:10px 0; max-width:100%; overflow:scroll; border:1px solid #ccc"]);
  436. UI::table([
  437. 'caption' => "Tabela REF '{$tableName}' - <small><i>{$refInfo['ROOT_OBJECT_NS']} REF {$refInfo['CHILD_NAME']} ({$refInfo['CHILD_NS']})</i></small>",
  438. 'rows' => DB::getPDO()->fetchAll("
  439. select t.*
  440. from `{$tableName}` t
  441. ")
  442. ]);
  443. UI::endTag('div');
  444. }
  445. if ('1' == V::get('_clear', '', $_GET)) {
  446. foreach ($refZaliczkaTables as $refInfo) {
  447. $tableName = "CRM__#REF_TABLE__" . $refInfo['ID'];
  448. DB::getPDO()->exec("TRUNCATE `{$tableName}`");
  449. }
  450. UI::tag('a', ['class'=>"btn btn-primary", 'href'=>"index.php?_route=UrlAction_UserProNetMediaZaliczka&_task=reinstall"], "Dane usunięte - odśwież stronę");
  451. }
  452. {// view grouped info
  453. $refTableWorker = ACL::getRefTable('default_db/ZALICZKA/Zaliczka', 'worker');
  454. $refTablePozycja = ACL::getRefTable('default_db/ZALICZKA/Zaliczka', 'pozycja');
  455. DB::getPDO()->execSql("
  456. CREATE OR REPLACE VIEW `ZALICZKA_INFO_VIEW` AS
  457. select t.ID
  458. , u.ID as ID_USER
  459. , t.L_APPOITMENT_USER
  460. , t.A_STATUS
  461. , t.KWOTA
  462. , t.UWAGI
  463. , t.NIEROZLICZONA_KWOTA
  464. , t.APPROVED_BY
  465. , t.PAYMENT_METHOD
  466. , t.DOKUMENTY
  467. , sum(COALESCE(p.kwota, 0)) as rozliczona_kwota
  468. from ZALICZKA t
  469. join ADMIN_USERS u on(u.ADM_ACCOUNT = t.L_APPOITMENT_USER)
  470. left join `{$refTablePozycja}` refPoz on(refPoz.PRIMARY_KEY = t.ID and refPoz.A_STATUS != 'DELETED')
  471. left join ZALICZKA_POZYCJA p on(p.ID = refPoz.REMOTE_PRIMARY_KEY and (p.A_STATUS not in ('DELETED')))
  472. where t.A_STATUS not in ('DELETED')
  473. group by t.ID
  474. ");
  475. DB::getPDO()->execSql("
  476. CREATE OR REPLACE VIEW `ZALICZKA_USER_SALDO_VIEW` AS
  477. select u.ID, u.ADM_ACCOUNT, u.ADM_NAME
  478. , (
  479. select (v.KWOTA + v.NIEROZLICZONA_KWOTA - v.rozliczona_kwota) as saldo
  480. from ZALICZKA_INFO_VIEW v
  481. where v.L_APPOITMENT_USER = u.ADM_ACCOUNT
  482. order by v.ID desc
  483. limit 1
  484. ) as saldo
  485. , sum(t.KWOTA) as suma_zaliczek
  486. from ZALICZKA t
  487. join ADMIN_USERS u on(u.ADM_ACCOUNT = t.L_APPOITMENT_USER)
  488. where t.A_STATUS not in ('DELETED')
  489. group by u.ADM_ACCOUNT
  490. ");
  491. DB::getPDO()->execSql("
  492. CREATE OR REPLACE VIEW `ZALICZKA_WNIOSEK_INFO_VIEW` AS
  493. select t.ID
  494. , t.A_RECORD_CREATE_DATE as created
  495. , t.A_RECORD_CREATE_DATE
  496. , t.A_RECORD_CREATE_AUTHOR
  497. , t.A_RECORD_UPDATE_DATE
  498. , t.A_RECORD_UPDATE_AUTHOR
  499. , u.ID as ID_USER
  500. , t.L_APPOITMENT_USER
  501. , t.A_STATUS
  502. , t.KWOTA
  503. , t.UWAGI
  504. , t.APPROVED_BY
  505. , IF('WAITING' = t.A_STATUS, 'Oczekuje zatwierdzenia',
  506. IF ('NORMAL' = t.A_STATUS, 'Zatwierdzony',
  507. IF ('OFF_HARD' = t.A_STATUS, 'Odrzucony',
  508. IF ('DELETED' = t.A_STATUS, 'Anulowany',
  509. 'nieznany'
  510. )
  511. )
  512. )
  513. ) as status
  514. , (select v.saldo from ZALICZKA_USER_SALDO_VIEW v where v.ID = u.ID) as SALDO
  515. , (select count(1) as cnt from ZALICZKA as zal where zal.L_APPOITMENT_USER = u.ADM_ACCOUNT and zal.DOKUMENTY = 'TAK') as DOKUMENTY_TAK
  516. , (select count(1) as cnt from ZALICZKA as zal where zal.L_APPOITMENT_USER = u.ADM_ACCOUNT and zal.DOKUMENTY = 'NIE') as DOKUMENTY_NIE
  517. from ZALICZKA_WNIOSEK t
  518. join ADMIN_USERS u on(u.ADM_ACCOUNT = t.L_APPOITMENT_USER)
  519. -- where t.A_STATUS not in ('DELETED')
  520. group by t.ID
  521. ");
  522. UI::table([
  523. 'caption' => "Table `ZALICZKA_USER_SALDO_VIEW`",
  524. 'rows' => DB::getPDO()->fetchAll(" select * from `ZALICZKA_USER_SALDO_VIEW` ")
  525. ]);
  526. UI::table([
  527. 'caption' => "Table `ZALICZKA_INFO_VIEW`",
  528. 'rows' => DB::getPDO()->fetchAll(" select * from `ZALICZKA_INFO_VIEW` ")
  529. ]);
  530. UI::table([
  531. 'caption' => "Table `ZALICZKA_INFO_VIEW` - debug (with deleted)",
  532. 'rows' => DB::getPDO()->fetchAll("
  533. select t.ID
  534. , t.A_STATUS
  535. , t.L_APPOITMENT_USER
  536. , t.KWOTA
  537. , t.NIEROZLICZONA_KWOTA
  538. , IF(p.ID is null, 'NULL', p.ID) as p__ID
  539. , p.A_STATUS as p__A_STATUS
  540. , p.L_APPOITMENT_USER as p__L_APPOITMENT_USER
  541. , p.nr_faktury as p__nr_faktury
  542. , p.kwota as p__kwota
  543. , p.kwota_netto as p__kwota_netto
  544. , p.vat as p__vat
  545. , p.kategoria_kosztu as p__kategoria_kosztu
  546. from ZALICZKA t
  547. left join `{$refTablePozycja}` refPoz on(refPoz.PRIMARY_KEY = t.ID)
  548. left join ZALICZKA_POZYCJA p on(p.ID = refPoz.REMOTE_PRIMARY_KEY)
  549. ")
  550. ]);
  551. UI::table([
  552. 'caption' => "Table `ZALICZKA_WNIOSEK_INFO_VIEW`",
  553. 'rows' => DB::getPDO()->fetchAll(" select * from `ZALICZKA_WNIOSEK_INFO_VIEW` ")
  554. ]);
  555. }
  556. Router::getRoute('UrlAction_UserProNetMediaZaliczkaWniosekConfirm')->reinstall();
  557. Router::getRoute('UrlAction_UserProNetMediaZaliczkaWniosekRemove')->reinstall();
  558. UI::endContainer();
  559. } catch (Exception $e) {
  560. UI::alert('danger', $e->getMessage());
  561. DBG::log($e);
  562. }
  563. UI::dol();
  564. }
  565. public function zaliczkaFormView($data) {
  566. $idUser = V::get('idUser', User::getID(), $data);
  567. $idZaliczka = V::get('idZaliczka', 0, $data);
  568. UI::tag('div', ['id'=>"zaliczka-app", 'data-dbg'=>V::get('DBG', '', $_GET), 'data-sync-js-function'=>"syncZaliczkaState", 'data-fetch-data-js-function'=>"zaliczkaFetchData"]);
  569. UI::emptyTag('br');
  570. $acl = ACL::getStorageByNamespace("default_db/ZALICZKA/Zaliczka");
  571. $schema = $acl->getSimpleSchemaTree();
  572. // DBG::nicePrint($schema, '$schema');
  573. UI::inlineJS(__FILE__ . '.fetchData.js', [
  574. 'SYNC_URL' => Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&_task=fetchDataAjax&idUser={$idUser}&idZaliczka={$idZaliczka}",
  575. 'DBG' => (DBG::isActive())
  576. ]);
  577. UI::inlineJS(__FILE__ . '.syncState.js', [
  578. 'SYNC_URL' => Request::getPathUri() . "index.php?_route=UrlAction_UserProNetMediaZaliczka&_task=syncStateAjax&idUser={$idUser}&idZaliczka={$idZaliczka}",
  579. 'DBG' => (DBG::isActive())
  580. ]);
  581. UI::inlineJS(APP_PATH_WWW . '/static/vendor.js');
  582. UI::inlineJS(APP_PATH_WWW . '/static/zaliczka/main.js');
  583. }
  584. public function histAction() {
  585. UI::gora();
  586. // UI::menu();
  587. try {
  588. $idZaliczka = V::get('idZaliczka', 0, $_GET, 'int');
  589. if ($idZaliczka <= 0) throw new Exception("Missing idZaliczka");
  590. $acl = ACL::getStorageByNamespace("default_db/ZALICZKA/Zaliczka");
  591. $zaliczka = $acl->getItem($idZaliczka);
  592. if (!$zaliczka) throw new Exception("Zaliczka not found!");
  593. DBG::nicePrint($zaliczka, '$zaliczka');
  594. } catch (Exception $e) {
  595. UI::alert('danger', $e->getMessage());
  596. }
  597. UI::dol();
  598. }
  599. }
  600. /* Akcje
  601. # dodanie pierwszej zaliczki - 500 zł
  602. $data = [ worker => [ login => 'Kowalski' ], kwota => 500.00 ]
  603. insert into `ZALICZKA` (`L_APPOITMENT_USER`, `KWOTA`) values('{$data['worker']['login']}', '{$data['kwota']}');
  604. -- return id = 123
  605. # rozliczenie częściowe pierwszej zaliczki np. 500 zł
  606. $data = [ id => 123, pozycja => [ [ kwota => 200.00, korespondencja => [ ... ], projekt => [ ... ] ] ] ]
  607. update `ZALICZKA__#REF__POZYCJA` set `A_STATUS` = 'DELETED' where `PRIMARY_KEY` = 123;
  608. # 2017-04-11 - pozycje view do exportu
  609. create or replace view `ZaliczkiPozycjeVIEW` as
  610. SELECT z.ID as NR_ZALICZKI
  611. , z.L_APPOITMENT_USER as ZALICZKA__L_APPOITMENT_USER -- Wnioskujacy
  612. , z.APPROVED_BY as ZALICZKA__APPROVED_BY -- Zatwierdzil
  613. , p.*
  614. FROM `ZALICZKA` z
  615. join `Zaliczka__#REF__pozycja` r on(r.PRIMARY_KEY = z.ID and r.A_STATUS not in ('DELETED'))
  616. join `ZALICZKA_POZYCJA` p on(p.ID = r.REMOTE_PRIMARY_KEY)
  617. # 2017-05-15 - added typ_dokumentu
  618. alter table `ZALICZKA_POZYCJA` add `typ_dokumentu` enum('faktura', 'inne') not null default 'inne';
  619. alter table `ZALICZKA_POZYCJA_HIST` add `typ_dokumentu` varchar(16) not null default 'N/S;';
  620. */