ZaliczkaStorageAcl.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. <?php
  2. Lib::loadClass('Core_AclSimpleSchemaBase');// extends Core_AclBase
  3. Lib::loadClass('Core_AclHelper');
  4. Lib::loadClass('DBG');
  5. class Schema_DefaultDb_zaliczka_ZaliczkaStorageAcl extends Core_AclSimpleSchemaBase {
  6. public $_simpleSchema = [
  7. 'root' => [
  8. '@namespace' => 'default_db/ZALICZKA/Zaliczka',// Api_WfsNs::getBaseWfsUri() . '/default_db/Zaliczka'
  9. '@primaryKey' => 'id',
  10. 'id' => [ '@type' => 'xsd:integer', '@alias' => 'ID' ],
  11. 'created' => [ '@type' => 'xsd:date', '@alias' => 'A_RECORD_CREATE_DATE' ],
  12. 'worker' => [ '@ref' => 'default_objects/AccessOwner' ],// 'alias_ref:default_objects:AccessOwner'
  13. 'kwota' => [ '@type' => 'xsd:decimal', '@totalDigits' => 16, '@fractionDigits' => 2, '@alias' => 'KWOTA' ],
  14. 'nierozliczona_kwota' => [ '@type' => 'xsd:decimal', '@totalDigits' => 16, '@fractionDigits' => 2, '@alias' => 'NIEROZLICZONA_KWOTA' ],
  15. 'korespondencja' => [ '@ref' => 'default_db/IN7_DZIENNIK_KORESP/ZaliczkaKoresp' ],
  16. 'pozycja' => [ '@ref' => 'default_db/ZALICZKA_POZYCJA/ZaliczkaPozycja', '@maxOccurs' => 'unbounded' ],
  17. 'A_STATUS' => [ '@type' => 'xsd:string' ],
  18. 'L_APPOITMENT_USER' => [ '@type' => 'xsd:string' ],
  19. ],
  20. ];
  21. public function getTotal($params = array()) {
  22. if (!isset($params['#refFrom'])) {
  23. throw new Exception("Missing param #refFrom/primaryKey (id user)");
  24. }
  25. $idUser = V::get('primaryKey', 0, $params['#refFrom'], 'int');
  26. return DB::getPDO()->fetchValue("
  27. select count(*) as cnt
  28. from ZALICZKA z
  29. join ADMIN_USERS u on(z.L_APPOITMENT_USER = u.ADM_ACCOUNT and u.ID = {$idUser})
  30. ");
  31. }
  32. public function getItems($params = array()) {
  33. // '#refFrom' => [
  34. // 'namespace' => 'default_db__x3A__ADMIN_USERS/Worker',
  35. // 'primaryKey' => $idUser
  36. // ]
  37. if (!isset($params['#refFrom'])) {
  38. throw new Exception("Missing param #refFrom/primaryKey (id user)");
  39. }
  40. $idUser = V::get('primaryKey', 0, $params['#refFrom'], 'int');
  41. return array_map(
  42. function ($row) use ($params) {
  43. return $this->buildFromSqlRow($row, $params);
  44. },
  45. DB::getPDO()->fetchAll("
  46. select z.*
  47. from ZALICZKA z
  48. join ADMIN_USERS u on(z.L_APPOITMENT_USER = u.ADM_ACCOUNT and u.ID = {$idUser})
  49. order by z.ID DESC
  50. ")
  51. );
  52. }
  53. public function addItem($itemTodo) {
  54. DBG::log(['msg' => '$itemTodo', 'log' => $itemTodo]);
  55. if (!is_array($itemTodo) || empty($itemTodo['worker'])) throw new Exception("Missing worker");
  56. if (empty($itemTodo['worker']['id'])) throw new Exception("Missing worker id");
  57. if (empty($itemTodo['kwota'])) throw new Exception("Nie podano kwoty");
  58. $itemTodo['kwota'] = floatval($itemTodo['kwota']);
  59. if ($itemTodo['kwota'] <= 0) throw new Exception("Podano błędną kwotę");
  60. $idUser = intval($itemTodo['worker']['id']);
  61. if ($idUser <= 0) throw new Exception("Wrong worker id");
  62. // TODO: use default_objects/AccessOwner -> getItem($idUser)
  63. $userLogin = DB::getPDO()->fetchValue("
  64. select u.ADM_ACCOUNT
  65. from `ADMIN_USERS` u
  66. where u.ID = {$idUser}
  67. ");
  68. if (empty($userLogin)) throw new Exception("User not exists ID={$idUser}");
  69. DBG::log(['msg' => '$userLogin', 'log' => $userLogin]);
  70. $idTransaction = Core_AclHelper::startTransaction('ZALICZKA', $idUser, $userLogin);
  71. $zaliczkaRefWorker = ACL::getRefTable('default_db/ZALICZKA/Zaliczka', 'worker');
  72. $idActiveZaliczka = DB::getPDO()->fetchValue("
  73. select MAX(t.ID)
  74. from `ZALICZKA` t
  75. -- join `ADMIN_USERS` u on(t.L_APPOITMENT_USER = u.ADM_ACCOUNT)
  76. left join `{$zaliczkaRefWorker}` ref on(ref.PRIMARY_KEY = t.ID and ref.A_STATUS != 'DELETED')
  77. left join `ADMIN_USERS` r on(r.ID = ref.REMOTE_PRIMARY_KEY)
  78. where r.ID = {$idUser}
  79. and t.A_STATUS in('WAITING', 'NORMAL') -- TODO cache use #INSTANCE table
  80. ");
  81. DBG::log(['msg' => '$idActiveZaliczka', 'log' => $idActiveZaliczka]);
  82. $userSaldo = 0;
  83. if ($idActiveZaliczka > 0) {
  84. $zaliczkaRefPozycja = ACL::getRefTable('default_db/ZALICZKA/Zaliczka', 'pozycja');
  85. $userSaldo = DB::getPDO()->fetchValue("
  86. select t.KWOTA + t.NIEROZLICZONA_KWOTA - sum(COALESCE(r.KWOTA, 0))
  87. from `ZALICZKA` t
  88. left join `{$zaliczkaRefPozycja}` ref on(ref.PRIMARY_KEY = t.ID and ref.A_STATUS != 'DELETED')
  89. left join `ZALICZKA_POZYCJA` r on(r.ID = ref.REMOTE_PRIMARY_KEY)
  90. where t.ID = {$idActiveZaliczka}
  91. ");
  92. }
  93. DBG::log(['msg' => '$userSaldo', 'log' => $userSaldo]);
  94. $usrLogin = User::getLogin();
  95. $execRet = DB::getPDO()->execSql("
  96. insert into `ZALICZKA` (A_RECORD_CREATE_AUTHOR, A_RECORD_CREATE_DATE
  97. , L_APPOITMENT_USER, NIEROZLICZONA_KWOTA, KWOTA)
  98. select '{$usrLogin}' as A_RECORD_CREATE_AUTHOR, NOW() as A_RECORD_CREATE_DATE
  99. , u.ADM_ACCOUNT, '{$userSaldo}', '{$itemTodo['kwota']}'
  100. from ADMIN_USERS u
  101. where u.ID = {$idUser}
  102. ");
  103. DBG::log(['msg' => '$execRet', 'log' => $execRet]);
  104. $id = DB::getPDO()->lastInsertId();
  105. DBG::log(['msg' => '$id', 'log' => $id]);
  106. if (!$id) throw new Exception("Wystąpiły błędy podczas dodawania Zaliczki do bazy danych");
  107. DB::getPDO()->execSql("
  108. insert into `ZALICZKA__#INSTANCE` (PRIMARY_KEY, INSTANCE_NAME)
  109. values({$id}, 'ZaliczkaAktywna')
  110. ON DUPLICATE KEY UPDATE INSTANCE_NAME = 'ZaliczkaAktywna'
  111. ");
  112. foreach (DB::getPDO()->fetchAll("
  113. select z.ID as ID_ZALICZKA, i.*
  114. from `ZALICZKA` z
  115. left join `ZALICZKA__#INSTANCE` i on(i.PRIMARY_KEY = z.ID)
  116. where z.ID != {$id}
  117. and z.L_APPOITMENT_USER = '{$userLogin}'
  118. ") as $instance) {
  119. DBG::log(['msg' => 'old $instance', 'log' => $instance]);
  120. // FIX Instance name
  121. foreach (DB::getPDO()->fetchAll("
  122. select z.ID as ID_ZALICZKA
  123. , IF(i.PRIMARY_KEY IS NOT NULL, 1, 0) as has_instance
  124. , i.*
  125. from `ZALICZKA` z
  126. left join `ZALICZKA__#INSTANCE` i on(i.PRIMARY_KEY = z.ID)
  127. where z.ID != {$id}
  128. and z.L_APPOITMENT_USER = '{$userLogin}'
  129. ") as $instance) {
  130. DBG::log(['msg' => 'fix instance name $instance', 'log' => $instance]);
  131. if (!$instance['has_instance']) {
  132. DB::getPDO()->insert('ZALICZKA__#INSTANCE_HIST', [
  133. 'PRIMARY_KEY' => $instance['ID_ZALICZKA'],
  134. 'INSTANCE_NAME' => 'ZaliczkaArchiwalna'
  135. ]);
  136. DB::getPDO()->insert('ZALICZKA__#INSTANCE', [
  137. 'PRIMARY_KEY' => $instance['ID_ZALICZKA'],
  138. 'INSTANCE_NAME' => 'ZaliczkaArchiwalna'
  139. ]);
  140. } else if ('ZaliczkaAktywna' == $instance['INSTANCE_NAME']) {
  141. DB::getPDO()->insert('ZALICZKA__#INSTANCE_HIST', [
  142. 'PRIMARY_KEY' => $instance['ID_ZALICZKA'],
  143. 'INSTANCE_NAME' => 'ZaliczkaArchiwalna'
  144. ]);
  145. DB::getPDO()->execSql("
  146. update `ZALICZKA__#INSTANCE`
  147. set INSTANCE_NAME = 'ZaliczkaArchiwalna'
  148. , A_RECORD_UPDATE_DATE = NOW()
  149. where PRIMARY_KEY = {$instance['ID_ZALICZKA']}
  150. ");
  151. }
  152. }
  153. }
  154. $this->insertRef('worker', $id, $idUser);// TODO: add to hist table
  155. $childTableKwota = $this->getChildHistTable('kwota');
  156. DB::getPDO()->insert($childTableKwota, [
  157. 'VALUE' => $itemTodo['kwota'],
  158. 'A_TRANSACTION_ID' => $idTransaction
  159. ]);
  160. DB::getPDO()->execSql("
  161. update ZALICZKA
  162. set A_STATUS = 'OFF_HARD'
  163. where L_APPOITMENT_USER = '{$userLogin}'
  164. and ID < {$id}
  165. ");
  166. // TODO: legacy fill table ZALICZKA_HIST
  167. DB::getPDO()->execSql("
  168. insert into `ZALICZKA_HIST` (ID_USERS2, L_APPOITMENT_USER, NIEROZLICZONA_KWOTA, KWOTA)
  169. select z.ID as ID_USERS2, z.L_APPOITMENT_USER, z.NIEROZLICZONA_KWOTA, z.KWOTA
  170. from ZALICZKA z
  171. where z.ID = {$id}
  172. ");
  173. return $id;
  174. }
  175. public function updateItem($itemPatch) {
  176. DBG::log(['msg' => '$itemPatch', $itemPatch]);
  177. $pkField = $this->getPrimaryKeyField();
  178. if (!array_key_exists($pkField, $itemPatch)) throw new Exception("Missing primary key");
  179. $pk = (int)$itemPatch[$pkField];
  180. if ($pk <= 0) throw new Exception("Wrong primary key format");
  181. $oldItem = $this->getItem($pk, [
  182. 'cols' => [
  183. 'id',
  184. 'kwota',
  185. // 'nierozliczona_kwota',
  186. 'korespondencja',
  187. 'pozycja',
  188. // 'worker',
  189. ]
  190. ]);
  191. DBG::log(['msg' => '$oldItem', $oldItem]);
  192. // pozycja
  193. $pozAcl = ACL::getAclByNamespace('default_db/ZALICZKA_POZYCJA/ZaliczkaPozycja');
  194. $pozPkField = $pozAcl->getPrimaryKeyField();
  195. if (empty($oldItem['pozycja'])) {
  196. DBG::log("empty \$oldItem['pozycja']");
  197. if (!empty($itemPatch['pozycja'])) {
  198. foreach ($itemPatch['pozycja'] as $pozTodo) {
  199. if ($pozTodo[ $pozPkField ] !== -1) throw new Exception("BUG ZaliczkaPozycja id not equal -1");
  200. unset($pozTodo[ $pozPkField ]);
  201. $pkPoz = $pozAcl->addItem($pozTodo);
  202. DBG::log(['msg'=> '$pkPoz', $pkPoz]);
  203. $this->insertRef('pozycja', $pk, $pkPoz);
  204. }
  205. }
  206. } else {
  207. DBG::log("not empty \$oldItem['pozycja'] " . ((!empty($itemPatch['pozycja'])) ? "not empty" : "empty") . " patch pozycja");
  208. $pozToAdd = array();
  209. $pozToUpdate = array();
  210. $pozToRemove = array();
  211. if (!empty($itemPatch['pozycja'])) {
  212. foreach ($itemPatch['pozycja'] as $pozTodo) {
  213. if ($pozTodo[ $pozPkField ] == -1) {
  214. unset($pozTodo[ $pozPkField ]);
  215. $pozToAdd[] = $pozTodo;
  216. } else {
  217. $pozToUpdate[ $pozTodo[ $pozPkField ] ] = $pozTodo;
  218. }
  219. }
  220. }
  221. foreach ($oldItem['pozycja'] as $pozOld) {
  222. if ($pozOld[ $pozPkField ] > 0 && !array_key_exists($pozOld[ $pozPkField ], $pozToUpdate)) {
  223. $pozToRemove[] = $pozOld[ $pozPkField ];
  224. }
  225. }
  226. DBG::log(['msg'=> '$pozToAdd', $pozToAdd]);
  227. DBG::log(['msg'=> '$pozToUpdate', $pozToUpdate]);
  228. DBG::log(['msg'=> '$pozToRemove', $pozToRemove]);
  229. foreach ($pozToAdd as $pozTodo) {
  230. $pkPoz = $pozAcl->addItem($pozTodo);
  231. DBG::log(['msg'=> '$pkPoz', $pkPoz]);
  232. $this->insertRef('pozycja', $pk, $pkPoz);
  233. }
  234. foreach ($pozToRemove as $idPoz) {
  235. // $rmPozItem = [];
  236. // $rmPozItem[$pozPkField] = $idPoz;
  237. // $rmPozItem['A_STATUS'] = 'DELETED';
  238. // $pozAcl->updateItem($rmPozItem);// TODO: update instance and A_STATUS (cache)
  239. $this->removeRef('pozycja', $pk, $idPoz);
  240. }
  241. foreach ($pozToUpdate as $pozTodo) {
  242. $pozAcl->updateItem($pozTodo);
  243. }
  244. }
  245. // korespondencja
  246. if (empty($oldItem['korespondencja'])) {
  247. DBG::log("empty \$oldItem['korespondencja']");
  248. if (!empty($itemPatch['korespondencja'])) {
  249. if (empty($itemPatch['korespondencja'][0]['id'])) throw new Exception("BUG: Missing Koresp id");
  250. $pkKoresp = $itemPatch['korespondencja'][0]['id'];
  251. $this->insertRef('korespondencja', $pk, $pkKoresp);
  252. }
  253. } else {
  254. DBG::log("not empty \$oldItem['korespondencja'] " . ((!empty($itemPatch['korespondencja'])) ? "not empty" : "empty") . " patch koresp");
  255. // if (id != id) => update : clearRefs, insertRef
  256. if (empty($oldItem['korespondencja'][0]['id'])) throw new Exception("BUG: Missing Koresp id in current object");
  257. if (!empty($itemPatch['korespondencja'])) {
  258. if (empty($itemPatch['korespondencja'][0]['id'])) throw new Exception("BUG: Missing Koresp id");
  259. $pkOldKoresp = $oldItem['korespondencja'][0]['id'];
  260. $pkKoresp = $itemPatch['korespondencja'][0]['id'];
  261. DBG::log("\$pkOldKoresp({$pkOldKoresp}), \$pkKoresp({$pkKoresp})");
  262. if ($pkOldKoresp != $pkKoresp) {
  263. $this->cleanRefs('korespondencja', $pk);
  264. $this->insertRef('korespondencja', $pk, $pkKoresp);
  265. }
  266. } else {
  267. DBG::log("cleanRefs \$pk({$pk})");
  268. $this->cleanRefs('korespondencja', $pk);
  269. }
  270. }
  271. /* { "updates": {
  272. "@instance": "ZaliczkaAktywna",
  273. "id": "8",
  274. "created": "2017-01-27 11:10:59",
  275. "worker": [{ "id": "1", "login": "magdalena.cichosz", "name": "Magdalena Cichosz" }],
  276. "kwota": "0.01",
  277. "nierozliczona_kwota": "300.02",
  278. "pozycja": [{
  279. "id": -1,
  280. "nr_faktury": "fv 2017/1/1",
  281. "kwota": 100,
  282. "vat": 23,
  283. "kwota_netto": 0,
  284. "kategoria_kosztu": "BUDOWA: Usługi obce"
  285. }],
  286. "korespondencja": {
  287. "id": "6013",
  288. "title": "faktura Vat (MULTI-TAB) [6013]",
  289. "kategoriaKosztu": "do uzgodnienia",
  290. "projekt": { "id": "64", "nrBudowy": "20/2016" }
  291. }
  292. }
  293. } */
  294. $patch = [];
  295. // $itemPatch['kwota'] = str_replace(',', '.', $itemPatch['kwota']);
  296. // if ($itemPatch['kwota'] != $oldItem['kwota']) $patch['kwota'] = $itemPatch['kwota'];
  297. // TODO: diff $itemPatch['pozycja'] != $oldItem['pozycja']
  298. if (!empty($patch)) {
  299. // if (array_key_exists('kwota', $patch)) {
  300. // DB::getPDO()->update('ZALICZKA', 'ID', $pk, [ 'kwota' => $patch['kwota'] ]);
  301. // }
  302. }
  303. }
  304. public function getItem($primaryKey, $params = []) {
  305. $zaliczkaRaw = DB::getPDO()->fetchAll("
  306. select t.*
  307. from `ZALICZKA` t
  308. where t.ID = {$primaryKey}
  309. ");
  310. $zaliczkaRaw = (!empty($zaliczkaRaw)) ? reset($zaliczkaRaw) : null;
  311. // DBG::nicePrint($zaliczkaRaw, '$zaliczkaRaw');
  312. if (!$zaliczkaRaw) return null;
  313. return $this->buildFromSqlRow($zaliczkaRaw, $params);
  314. }
  315. public function reinstall() {
  316. // TODO: mv to Core_AclSimpleSchemaBase and reainstall by _simpleSchema - read current data from `information_schema`
  317. DB::getPDO()->execSql("
  318. CREATE TABLE IF NOT EXISTS `ZALICZKA` (
  319. `ID` int(11) NOT NULL AUTO_INCREMENT,
  320. `A_RECORD_CREATE_DATE` datetime DEFAULT NULL,
  321. `A_RECORD_CREATE_AUTHOR` varchar(20) DEFAULT NULL,
  322. `A_RECORD_UPDATE_DATE` datetime DEFAULT NULL,
  323. `A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
  324. `A_STATUS` enum('WAITING','NORMAL','MONITOR','WARNING','OFF_SOFT','OFF_HARD','DELETED') DEFAULT 'WAITING',
  325. `A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT '',
  326. `A_CLASSIFIED` varchar(100) NOT NULL DEFAULT '',
  327. `L_APPOITMENT_USER` varchar(100) NOT NULL DEFAULT '',
  328. `KWOTA` decimal(16,2) NOT NULL DEFAULT 0,
  329. `NIEROZLICZONA_KWOTA` decimal(16,2) NOT NULL DEFAULT 0,
  330. PRIMARY KEY (`ID`)
  331. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  332. ");
  333. DB::getPDO()->execSql("
  334. CREATE TABLE IF NOT EXISTS `ZALICZKA_HIST` (
  335. `ID` int(11) NOT NULL AUTO_INCREMENT,
  336. `ID_USERS2` int(11) NOT NULL,
  337. `A_RECORD_CREATE_DATE` varchar(20) NOT NULL DEFAULT 'N/S;',
  338. `A_RECORD_CREATE_AUTHOR` varchar(20) NOT NULL DEFAULT 'N/S;',
  339. `A_RECORD_UPDATE_DATE` varchar(20) NOT NULL DEFAULT 'N/S;',
  340. `A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT 'N/S;',
  341. `A_STATUS` varchar(20) NOT NULL DEFAULT 'N/S;',
  342. `A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT 'N/S;',
  343. `A_CLASSIFIED` varchar(100) NOT NULL DEFAULT 'N/S;',
  344. `L_APPOITMENT_USER` varchar(100) NOT NULL DEFAULT 'N/S;',
  345. `KWOTA` varchar(16) NOT NULL DEFAULT 'N/S;',
  346. `NIEROZLICZONA_KWOTA` varchar(16) NOT NULL DEFAULT 'N/S;',
  347. PRIMARY KEY (`ID`),
  348. KEY `ID_USERS2` (`ID_USERS2`)
  349. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  350. ");
  351. DB::getPDO()->execSql("
  352. CREATE TABLE IF NOT EXISTS `ZALICZKA_POZYCJA` (
  353. `ID` int(11) NOT NULL AUTO_INCREMENT,
  354. `A_RECORD_CREATE_DATE` datetime DEFAULT NULL,
  355. `A_RECORD_CREATE_AUTHOR` varchar(20) DEFAULT NULL,
  356. `A_RECORD_UPDATE_DATE` datetime DEFAULT NULL,
  357. `A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
  358. `A_STATUS` enum('WAITING','NORMAL','MONITOR','WARNING','OFF_SOFT','OFF_HARD','DELETED') DEFAULT NULL,
  359. `A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT '',
  360. `A_CLASSIFIED` varchar(100) NOT NULL DEFAULT '',
  361. `L_APPOITMENT_USER` varchar(100) NOT NULL DEFAULT '',
  362. `nr_faktury` varchar(255) NOT NULL DEFAULT '',
  363. `kwota` decimal(16,2) NOT NULL DEFAULT 0,
  364. `vat` int(11) NOT NULL DEFAULT 23,
  365. `kwota_netto` decimal(16,2) NOT NULL DEFAULT 0,
  366. `kategoria_kosztu` varchar(255) NOT NULL DEFAULT '',
  367. PRIMARY KEY (`ID`)
  368. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  369. ");
  370. DB::getPDO()->execSql("
  371. CREATE TABLE IF NOT EXISTS `ZALICZKA_POZYCJA_HIST` (
  372. `ID` int(11) NOT NULL AUTO_INCREMENT,
  373. `ID_USERS2` int(11) NOT NULL,
  374. `A_RECORD_CREATE_DATE` varchar(20) NOT NULL DEFAULT 'N/S;',
  375. `A_RECORD_CREATE_AUTHOR` varchar(20) NOT NULL DEFAULT 'N/S;',
  376. `A_RECORD_UPDATE_DATE` varchar(20) NOT NULL DEFAULT 'N/S;',
  377. `A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT 'N/S;',
  378. `A_STATUS` varchar(20) NOT NULL DEFAULT 'N/S;',
  379. `A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT 'N/S;',
  380. `A_CLASSIFIED` varchar(100) NOT NULL DEFAULT 'N/S;',
  381. `L_APPOITMENT_USER` varchar(100) NOT NULL DEFAULT 'N/S;',
  382. `nr_faktury` varchar(255) NOT NULL DEFAULT 'N/S;',
  383. `kwota` varchar(16) NOT NULL DEFAULT 'N/S;',
  384. `vat` varchar(5) NOT NULL DEFAULT 'N/S;',
  385. `kwota_netto` varchar(16) NOT NULL DEFAULT 'N/S;',
  386. `kategoria_kosztu` varchar(255) NOT NULL DEFAULT 'N/S;',
  387. PRIMARY KEY (`ID`),
  388. KEY `ID_USERS2` (`ID_USERS2`)
  389. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  390. ");
  391. echo UI::h('div', [ 'class' => "container", 'style' => "background:#ffe5b6; margin-top:6px" ], "<p style=\"margin:0; padding:6px\">Upgrade schema</p>");
  392. UI::startContainer([ 'style' => "max-height:200px; overflow-y:scroll; border:1px solid #ffe5b6" ]);
  393. try {
  394. DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA` ADD `nr_faktury` varchar(255) NOT NULL DEFAULT '' ");
  395. } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
  396. try {
  397. DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA` ADD `vat` int(11) NOT NULL DEFAULT 23 ");
  398. } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
  399. try {
  400. DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA` ADD `kwota_netto` decimal(16,2) NOT NULL DEFAULT 0 ");
  401. } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
  402. try {
  403. DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA` ADD `kategoria_kosztu` varchar(255) NOT NULL DEFAULT '' ");
  404. } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
  405. try {
  406. DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA_HIST` ADD `nr_faktury` varchar(255) NOT NULL DEFAULT 'N/S;' ");
  407. } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
  408. try {
  409. DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA_HIST` ADD `vat` varchar(5) NOT NULL DEFAULT 'N/S;' ");
  410. } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
  411. try {
  412. DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA_HIST` ADD `kwota_netto` varchar(16) NOT NULL DEFAULT 'N/S;' ");
  413. } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
  414. try {
  415. DB::getPDO()->execSql(" ALTER TABLE `ZALICZKA_POZYCJA_HIST` ADD `kategoria_kosztu` varchar(255) NOT NULL DEFAULT 'N/S;' ");
  416. } catch (Exception $e) { UI::alert('warning', $e->getMessage()); }
  417. UI::endContainer();
  418. ACL::getRefTable('default_db/ZALICZKA/Zaliczka', 'worker');
  419. ACL::getRefTable('default_db/ZALICZKA/Zaliczka', 'pozycja');
  420. ACL::getRefTable('default_db/ZALICZKA/Zaliczka', 'korespondencja');
  421. // ACL::getRefTable('default_db/ZALICZKA_POZYCJA/ZaliczkaPozycja', 'projekt');
  422. // ACL::getRefTable('default_db/ZALICZKA_POZYCJA/ZaliczkaPozycja', 'korespondencja');
  423. Core_AclHelper::getInstanceTable('ZALICZKA');// `ZALICZKA__#INSTANCE`
  424. // TODO: ZaliczkaOczekujaca A_STATUS = WAITING -- dodane przez pracownika
  425. // TODO: ZaliczkaAktywna A_STATUS = NORMAL -- zakceptowane / wyplacone przez ...
  426. // TODO: pole na dane wypłacającego zaliczkę
  427. // TODO: dopiero teraz wyliczyć saldo / nierozliczona_kwota? Saldo pokazywać zawsze, aktualizować po akceptacji (Oczekujaca --> Aktywna)
  428. // TODO: ZaliczkaArchiwalna A_STATUS = OFF_HARD -- poprzednie zaliczki
  429. // TODO: ZaliczkaUsunieta A_STATUS = DELETED -- usunieta przez workera lub anulowana przez osobę uprawnioną
  430. Core_AclHelper::getTransactionTable('ZALICZKA');// `ZALICZKA__#TRANSACTION`
  431. Core_AclHelper::getTransactionTable('ZALICZKA_POZYCJA');// `ZALICZKA_POZYCJA__#TRANSACTION`
  432. echo UI::h('div', [ 'class' => "container", 'style' => "background:#ffe5b6; margin-top:6px" ], "<p style=\"margin:0; padding:6px\">create ChildHistTable</p>");
  433. UI::startContainer([ 'style' => "max-height:200px; overflow-y:scroll; border:1px solid #ffe5b6" ]);
  434. foreach ($this->_simpleSchema['root'] as $childName => $schema) {
  435. if ('@' == substr($childName, 0, 1)) continue;
  436. $this->getChildHistTable($childName);
  437. DBG::nicePrint($schema, '$childName('.$childName.')');// TODO: DBG
  438. }
  439. UI::endContainer();
  440. }
  441. }