ZaliczkaStorageAcl.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. <?php
  2. Lib::loadClass('Core_AclSimpleSchemaBase');// extends Core_AclBase
  3. Lib::loadClass('Core_AclHelper');
  4. Lib::loadClass('FileStorage');
  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. '@implements' => 'default_types/Infrastructure',
  10. 'id' => 'xsd:integer',
  11. 'created' => [ '@type' => 'xsd:date', '@alias' => 'A_RECORD_CREATE_DATE' ],
  12. 'worker' => [ '@ref' => 'default_objects/AccessOwner' ],// 'alias_ref:default_objects:AccessOwner'
  13. // 'worker' => [ '@ref' => 'Worker' ],
  14. 'kwota' => [ '@type' => 'xsd:decimal', '@totalDigits' => 16, '@fractionDigits' => 2 ],
  15. 'nierozliczona_kwota' => [ '@type' => 'xsd:decimal', '@totalDigits' => 16, '@fractionDigits' => 2 ],
  16. 'pozycja' => [ '@ref' => 'ZaliczkaPozycja', '@maxOccurs' => 'unbounded' ]
  17. ],
  18. 'ZaliczkaPozycja' => [
  19. '@namespace' => 'default_db/ZALICZKA_POZYCJA/ZaliczkaPozycja',// Api_WfsNs::getBaseWfsUri() . '/default_db/Zaliczka'
  20. 'id' => 'xsd:integer',
  21. 'kwota' => [ '@type' => 'xsd:decimal', '@totalDigits' => 16, '@fractionDigits' => 2 ],
  22. 'korespondencja' => [ '@ref' => 'Korespondencja' ],
  23. 'projekt' => [ '@ref' => 'Projekt' ]
  24. ],
  25. 'Korespondencja' => [
  26. '@namespace' => 'default_db/IN7_DZIENNIK_KORESP',
  27. 'id' => [ '@type' => 'xsd:integer', '@alias' => 'ID' ],
  28. 'title' => [ '@type' => 'xsd:string', '@alias' => 'K_ZAWARTOS' ],
  29. 'kategoriaKosztu' => [ '@type' => 'xsd:string', '@alias' => 'KATEGORIA_KOSZTU' ]
  30. ],
  31. 'Projekt' => [
  32. '@namespace' => 'default_db/IN7_MK_BAZA_DYSTRYBUCJI',
  33. 'id' => [ '@type' => 'xsd:integer', '@alias' => 'ID' ],
  34. 'nrBudowy' => [ '@type' => 'xsd:string', '@alias' => 'M_DIST_DEALNUM' ],// TODO: ? M_DIST_DESC (szerszy opis)
  35. ],
  36. // 'worker' => [
  37. // '@namespace' => 'default_objects/AccessOwner',
  38. // 'login' => 'xsd:string',
  39. // 'name' => 'xsd:string'
  40. // ]
  41. ];
  42. // [
  43. // '@typeName' => 'default_db__x3A__ZALICZKA:Zaliczka',
  44. // '@baseTypeName' => 'default_db:ZALICZKA',
  45. // '@namespace' => 'default_db/ZALICZKA/Zaliczka',// Api_WfsNs::getBaseWfsUri() . '/default_db/Zaliczka'
  46. // 'id' => 'xsd:integer',
  47. // 'created' => 'xsd:date',
  48. // 'worker' => [
  49. // '@namespace' => 'default_objects/AccessOwner',// alias_ref:default_objects:AccessOwner
  50. // ],
  51. // 'kwota' => 'xsd:decimal',
  52. // 'pozycja' => [
  53. // '@namespace' => 'default_db/ZALICZKA_POZYCJA/ZaliczkaPozycja',// alias_ref:default_db__x3A__ZALICZKA_POZYCJA:ZaliczkaPozycja
  54. // '@maxOccurs' => 'unbounded',
  55. // // 'id' => 'xsd:integer',
  56. // // 'kwota' => 'xsd:decimal',
  57. // // 'korespondencja' => [// 'ref:korespondencja'
  58. // // '@namespace' => 'default_db/IN7_DZIENNIK_KORESP',
  59. // // 'id' => 'xsd:integer',
  60. // // 'title' => 'xsd:string',
  61. // // 'kategoriaKosztu' => 'xsd:string'
  62. // // ],
  63. // // 'projekt' => [// 'ref:projekt'
  64. // // '@namespace' => 'default_db/IN7_MK_BAZA_DYSTRYBUCJI',
  65. // // 'id' => 'xsd:integer',
  66. // // 'nrBudowy' => 'xsd:string'
  67. // // ]
  68. // ]
  69. // ];
  70. public function addItem($itemTodo) {
  71. // TODO: btn "Dodaj Zaliczkę" $acl->addItem($item); // @require only 'worker' => [ 'id', 'login', 'name' ]
  72. DBG::nicePrint($itemTodo, '$itemTodo');// TODO: DBG
  73. if (!is_array($itemTodo) || empty($itemTodo['worker'])) throw new Exception("Missing worker");
  74. if (empty($itemTodo['worker']['id'])) throw new Exception("Missing worker id");
  75. $idUser = intval($itemTodo['worker']['id']);
  76. if ($idUser <= 0) throw new Exception("Wrong worker id");
  77. $userLogin = DB::getPDO()->fetchValue("
  78. select u.ADM_ACCOUNT
  79. from `ADMIN_USERS` u
  80. where u.ID = {$idUser}
  81. ");
  82. if (empty($userLogin)) throw new Exception("User not exists ID={$idUser}");
  83. DBG::nicePrint($userLogin, '$userLogin');// TODO: DBG
  84. $idTransaction = Core_AclHelper::startTransaction('ZALICZKA', $idUser, $userLogin);
  85. $zaliczkaRefWorker = Core_AclHelper::getRefTable('Zaliczka', 'worker');// `Zaliczka__#REF__worker`
  86. $idActiveZaliczka = DB::getPDO()->fetchValue("
  87. select MAX(t.ID)
  88. from `ZALICZKA` t
  89. -- join `ADMIN_USERS` u on(t.L_APPOITMENT_USER = u.ADM_ACCOUNT)
  90. left join `{$zaliczkaRefWorker}` ref on(ref.PRIMARY_KEY = t.ID and ref.A_STATUS != 'DELETED')
  91. left join `ADMIN_USERS` r on(r.ID = ref.REMOTE_PRIMARY_KEY)
  92. where r.ID = {$idUser}
  93. and t.A_STATUS in('WAITING', 'NORMAL') -- TODO cache use #INSTANCE table
  94. ");
  95. $zaliczkaRefWorker = Core_AclHelper::getRefTable('Zaliczka', 'worker');// `Zaliczka__#REF__worker`
  96. DBG::nicePrint("
  97. select MAX(t.ID)
  98. from `ZALICZKA` t
  99. -- join `ADMIN_USERS` u on(t.L_APPOITMENT_USER = u.ADM_ACCOUNT)
  100. left join `{$zaliczkaRefWorker}` ref on(ref.PRIMARY_KEY = t.ID and ref.A_STATUS != 'DELETED')
  101. left join `ADMIN_USERS` r on(r.ID = ref.REMOTE_PRIMARY_KEY)
  102. where r.ID = {$idUser}
  103. and t.A_STATUS in('WAITING', 'NORMAL') -- TODO cache use #INSTANCE table
  104. ", 'sql');// TODO: DBG
  105. DBG::nicePrint($idActiveZaliczka, '$idActiveZaliczka');// TODO: DBG
  106. $userSaldo = 0;
  107. if ($idActiveZaliczka > 0) {
  108. $zaliczkaRefPozycja = Core_AclHelper::getRefTable('Zaliczka', 'pozycja');// `Zaliczka__#REF__pozycja`
  109. $userSaldo = DB::getPDO()->fetchValue("
  110. select t.KWOTA + t.NIEROZLICZONA_KWOTA - sum(r.KWOTA)
  111. from `ZALICZKA` t
  112. left join `{$zaliczkaRefPozycja}` ref on(ref.PRIMARY_KEY = t.ID and ref.A_STATUS != 'DELETED')
  113. left join `ZALICZKA_POZYCJA` r on(r.ID = ref.REMOTE_PRIMARY_KEY)
  114. where t.ID = {$idActiveZaliczka}
  115. ");
  116. DBG::nicePrint($userSaldo, '$userSaldo');// TODO: DBG
  117. }
  118. $usrLogin = User::getLogin();
  119. $execRet = DB::getPDO()->exec("
  120. insert into `ZALICZKA` (A_RECORD_CREATE_AUTHOR, A_RECORD_CREATE_DATE
  121. , L_APPOITMENT_USER, NIEROZLICZONA_KWOTA)
  122. select '{$usrLogin}' as A_RECORD_CREATE_AUTHOR, NOW() as A_RECORD_CREATE_DATE
  123. , u.ADM_ACCOUNT, '{$userSaldo}'
  124. from ADMIN_USERS u
  125. where u.ID = {$idUser}
  126. ");
  127. DBG::nicePrint($execRet, '$execRet');// TODO: DBG
  128. $id = DB::getPDO()->lastInsertId();
  129. DBG::nicePrint($id, '$id');// TODO: DBG
  130. if (!$id) throw new Exception("Wystąpiły błędy podczas dodawania Zaliczki do bazy danych");
  131. DB::getPDO()->exec("
  132. insert into `ZALICZKA__#INSTANCE` (PRIMARY_KEY, INSTANCE_NAME)
  133. values({$id}, 'ZaliczkaAktywna')
  134. ON DUPLICATE KEY UPDATE INSTANCE_NAME = 'ZaliczkaAktywna'
  135. ");
  136. foreach (DB::getPDO()->fetchAll("
  137. select z.ID as ID_ZALICZKA, i.*
  138. from `ZALICZKA` z
  139. left join `ZALICZKA__#INSTANCE` i on(i.PRIMARY_KEY = z.ID)
  140. where z.ID != {$id}
  141. and z.L_APPOITMENT_USER = '{$userLogin}'
  142. ") as $instance) {
  143. DBG::nicePrint($instance, '$instance');// TODO: DBG
  144. // FIX Instance name
  145. foreach (DB::getPDO()->fetchAll("
  146. select z.ID as ID_ZALICZKA
  147. , IF(i.PRIMARY_KEY IS NOT NULL, 1, 0) as has_instance
  148. , i.*
  149. from `ZALICZKA` z
  150. left join `ZALICZKA__#INSTANCE` i on(i.PRIMARY_KEY = z.ID)
  151. where z.ID != {$id}
  152. and z.L_APPOITMENT_USER = '{$userLogin}'
  153. ") as $instance) {
  154. DBG::nicePrint($instance, '$instance');// TODO: DBG
  155. if (!$instance['has_instance']) {
  156. DB::getPDO()->exec("
  157. insert into `ZALICZKA__#INSTANCE_HIST` (PRIMARY_KEY, INSTANCE_NAME)
  158. values ({$instance['ID_ZALICZKA']}, 'ZaliczkaArchiwalna')
  159. ");
  160. DB::getPDO()->exec("
  161. insert into `ZALICZKA__#INSTANCE` (PRIMARY_KEY, INSTANCE_NAME)
  162. values ({$instance['ID_ZALICZKA']}, 'ZaliczkaArchiwalna')
  163. ");
  164. } else if ('ZaliczkaAktywna' == $instance['INSTANCE_NAME']) {
  165. DB::getPDO()->exec("
  166. insert into `ZALICZKA__#INSTANCE_HIST` (PRIMARY_KEY, INSTANCE_NAME)
  167. values ({$instance['ID_ZALICZKA']}, 'ZaliczkaArchiwalna')
  168. ");
  169. DB::getPDO()->exec("
  170. update `ZALICZKA__#INSTANCE`
  171. set INSTANCE_NAME = 'ZaliczkaArchiwalna'
  172. , A_RECORD_UPDATE_DATE = NOW()
  173. where PRIMARY_KEY = {$instance['ID_ZALICZKA']}
  174. ");
  175. }
  176. }
  177. }
  178. $this->insertRef('worker', $id, $idUser);
  179. DB::getPDO()->exec("
  180. update ZALICZKA
  181. set A_STATUS = 'OFF_HARD'
  182. where L_APPOITMENT_USER = '{$userLogin}'
  183. and ID < {$id}
  184. ");
  185. // TODO: legacy fill table ZALICZKA_HIST
  186. DB::getPDO()->exec("
  187. insert into `ZALICZKA_HIST` (ID_USERS2, L_APPOITMENT_USER, NIEROZLICZONA_KWOTA)
  188. select z.ID as ID_USERS2, z.L_APPOITMENT_USER, z.NIEROZLICZONA_KWOTA
  189. from ZALICZKA z
  190. where z.ID = {$id}
  191. ");
  192. return $id;
  193. }
  194. public function reinstall() {
  195. // TODO: mv to Core_AclSimpleSchemaBase and reainstall by _simpleSchema - read current data from `information_schema`
  196. DB::getPDO()->exec("
  197. CREATE TABLE IF NOT EXISTS `ZALICZKA` (
  198. `ID` int(11) NOT NULL AUTO_INCREMENT,
  199. `A_RECORD_CREATE_DATE` datetime DEFAULT NULL,
  200. `A_RECORD_CREATE_AUTHOR` varchar(20) DEFAULT NULL,
  201. `A_RECORD_UPDATE_DATE` datetime DEFAULT NULL,
  202. `A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
  203. `A_STATUS` enum('WAITING','NORMAL','MONITOR','WARNING','OFF_SOFT','OFF_HARD','DELETED') DEFAULT 'WAITING',
  204. `A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT '',
  205. `A_CLASSIFIED` varchar(100) NOT NULL DEFAULT '',
  206. `L_APPOITMENT_USER` varchar(100) NOT NULL DEFAULT '',
  207. `KWOTA` decimal(16,2) NOT NULL DEFAULT 0,
  208. `NIEROZLICZONA_KWOTA` decimal(16,2) NOT NULL DEFAULT 0,
  209. PRIMARY KEY (`ID`)
  210. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  211. ");
  212. DB::getPDO()->exec("
  213. CREATE TABLE IF NOT EXISTS `ZALICZKA_HIST` (
  214. `ID` int(11) NOT NULL AUTO_INCREMENT,
  215. `ID_USERS2` int(11) NOT NULL,
  216. `A_RECORD_CREATE_DATE` varchar(20) NOT NULL DEFAULT 'N/S;',
  217. `A_RECORD_CREATE_AUTHOR` varchar(20) NOT NULL DEFAULT 'N/S;',
  218. `A_RECORD_UPDATE_DATE` varchar(20) NOT NULL DEFAULT 'N/S;',
  219. `A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT 'N/S;',
  220. `A_STATUS` varchar(20) NOT NULL DEFAULT 'N/S;',
  221. `A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT 'N/S;',
  222. `A_CLASSIFIED` varchar(100) NOT NULL DEFAULT 'N/S;',
  223. `L_APPOITMENT_USER` varchar(100) NOT NULL DEFAULT 'N/S;',
  224. `KWOTA` varchar(16) NOT NULL DEFAULT 'N/S;',
  225. `NIEROZLICZONA_KWOTA` varchar(16) NOT NULL DEFAULT 'N/S;',
  226. PRIMARY KEY (`ID`),
  227. KEY `ID_USERS2` (`ID_USERS2`)
  228. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  229. ");
  230. DB::getPDO()->exec("
  231. CREATE TABLE IF NOT EXISTS `ZALICZKA_POZYCJA` (
  232. `ID` int(11) NOT NULL AUTO_INCREMENT,
  233. `A_RECORD_CREATE_DATE` datetime DEFAULT NULL,
  234. `A_RECORD_CREATE_AUTHOR` varchar(20) DEFAULT NULL,
  235. `A_RECORD_UPDATE_DATE` datetime DEFAULT NULL,
  236. `A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT '',
  237. `A_STATUS` enum('WAITING','NORMAL','MONITOR','WARNING','OFF_SOFT','OFF_HARD','DELETED') DEFAULT NULL,
  238. `A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT '',
  239. `A_CLASSIFIED` varchar(100) NOT NULL DEFAULT '',
  240. `L_APPOITMENT_USER` varchar(100) NOT NULL DEFAULT '',
  241. `KWOTA` decimal(16,2) NOT NULL DEFAULT 0,
  242. PRIMARY KEY (`ID`)
  243. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  244. ");
  245. DB::getPDO()->exec("
  246. CREATE TABLE IF NOT EXISTS `ZALICZKA_POZYCJA_HIST` (
  247. `ID` int(11) NOT NULL AUTO_INCREMENT,
  248. `ID_USERS2` int(11) NOT NULL,
  249. `A_RECORD_CREATE_DATE` varchar(20) NOT NULL DEFAULT 'N/S;',
  250. `A_RECORD_CREATE_AUTHOR` varchar(20) NOT NULL DEFAULT 'N/S;',
  251. `A_RECORD_UPDATE_DATE` varchar(20) NOT NULL DEFAULT 'N/S;',
  252. `A_RECORD_UPDATE_AUTHOR` varchar(20) NOT NULL DEFAULT 'N/S;',
  253. `A_STATUS` varchar(20) NOT NULL DEFAULT 'N/S;',
  254. `A_ADM_COMPANY` varchar(100) NOT NULL DEFAULT 'N/S;',
  255. `A_CLASSIFIED` varchar(100) NOT NULL DEFAULT 'N/S;',
  256. `L_APPOITMENT_USER` varchar(100) NOT NULL DEFAULT 'N/S;',
  257. `KWOTA` varchar(16) NOT NULL DEFAULT 'N/S;',
  258. PRIMARY KEY (`ID`),
  259. KEY `ID_USERS2` (`ID_USERS2`)
  260. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  261. ");
  262. Core_AclHelper::getRefTable('Zaliczka', 'worker');// `ZaliczkaPozycja__#REF__worker`
  263. Core_AclHelper::getRefTable('Zaliczka', 'pozycja');// `Zaliczka__#REF__pozycja`
  264. Core_AclHelper::getRefTable('ZaliczkaPozycja', 'korespondencja');// `ZaliczkaPozycja__#REF__Kkorespondencja`
  265. Core_AclHelper::getRefTable('ZaliczkaPozycja', 'projekt');// `ZaliczkaPozycja__#REF__projekt`
  266. Core_AclHelper::getInstanceTable('ZALICZKA');// `ZALICZKA__#INSTANCE`
  267. // TODO: ZaliczkaOczekujaca A_STATUS = WAITING -- dodane przez pracownika
  268. // TODO: ZaliczkaAktywna A_STATUS = NORMAL -- zakceptowane / wyplacone przez ...
  269. // TODO: pole na dane wypłacającego zaliczkę
  270. // TODO: dopiero teraz wyliczyć saldo / nierozliczona_kwota? Saldo pokazywać zawsze, aktualizować po akceptacji (Oczekujaca --> Aktywna)
  271. // TODO: ZaliczkaArchiwalna A_STATUS = OFF_HARD -- poprzednie zaliczki
  272. // TODO: ZaliczkaUsunieta A_STATUS = DELETED -- usunieta przez workera lub anulowana przez osobę uprawnioną
  273. Core_AclHelper::getTransactionTable('ZALICZKA');// `ZALICZKA__#TRANSACTION`
  274. Core_AclHelper::getTransactionTable('ZALICZKA_POZYCJA');// `ZALICZKA_POZYCJA__#TRANSACTION`
  275. foreach ($this->_simpleSchema['root'] as $childName => $schema) {
  276. if ('@' == substr($childName, 0, 1)) continue;
  277. Core_AclHelper::getChildHistTable('ZALICZKA', $childName, $schema);
  278. DBG::nicePrint($schema, '$childName('.$childName.')');// TODO: DBG
  279. }
  280. }
  281. }