ZaliczkaStorageAcl.php 23 KB

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