ZaliczkaStorageAcl.php 12 KB

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