PrzypomnijStorageAcl.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669
  1. <?php
  2. Lib::loadClass('Core_AclSimpleSchemaBase');
  3. Lib::loadClass('ParseOgcFilter');
  4. Lib::loadClass('Router');
  5. Lib::loadClass('SchemaVersionUpgrade');
  6. class Schema_PrzypomnijStorageAcl extends Core_AclSimpleSchemaBase {
  7. public $_simpleSchema = [
  8. 'root' => [
  9. '@namespace' => 'default_objects/Przypomnij',
  10. '@primaryKey' => 'feature_id',
  11. // col: Typ rekordu / ID
  12. 'feature_id' => [ '@type' => 'xsd:string' ], // eg.: "PROBLEMS.123"
  13. 'namespace' => [ '@type' => 'xsd:string' ], // eg.: "default_db/PROBLEMS"
  14. 'primaryKey' => [ '@type' => 'xsd:integer' ], // eg.: 123
  15. 'A_STATUS' => [ '@type' => 'xsd:string' ],
  16. 'featureType' => [ '@type' => 'xsd:string' ], // eg.: Zasob.TYPE, Projekt.M_DIST_TYPE, etc.
  17. 'featureDesc' => [ '@type' => 'xsd:string' ], // eg.: Zasob.DESC, Projekt.M_DIST_DESC, etc.
  18. 'L_APPOITMENT_USER' => [ '@type' => 'xsd:string' ], // Osoba odpowiedzialna
  19. 'A_ADM_COMPANY' => [ '@type' => 'xsd:string' ],
  20. 'A_CLASSIFIED' => [ '@type' => 'xsd:string' ],
  21. // col: Termin wykonania / Opis działań do wykonania
  22. 'L_APPOITMENT_DATE' => [ '@type' => 'xsd:dateTime' ], // Termin wykonania
  23. 'L_APPOITMENT_INFO' => [ '@type' => 'xsd:string' ], // Opis działań do wykonania
  24. // Firma powiąz. / adres / opis-temat
  25. // Lokalizacja
  26. 'PROJECT__ID' => [ '@type' => "xsd:int" ],
  27. 'PROJECT__L_APPOITMENT_USER' => [ '@type' => "xsd:string" ],
  28. 'USER__IS_ACTIVE' => [ '@type' => "xsd:int" ],
  29. // 'idZasob' => [ '@type' => 'xsd:integer' ],
  30. // 'idDatabase' => [ '@type' => 'xsd:integer' ],
  31. // '_rootTableName' => [ '@type' => 'xsd:string' ],
  32. // '_type' => [ '@type' => 'xsd:string' ],
  33. // 'hasStruct' => [ '@type' => 'xsd:integer' ], // 0 - removed, old, 1 - has config, structure
  34. // 'isStructInstalled' => [ '@type' => 'xsd:integer' ], // installed
  35. // 'isObjectActive' => [ '@type' => 'xsd:integer' ], // (0,1) - admin settings with restrictions: (hasStruct, isStructInstalled, all fields installed and with idZasob)
  36. // 'description' => [ '@type' => 'xsd:string' ],
  37. // 'name' => [ '@type' => 'p5:string' ],
  38. // 'typeName' => [ '@type' => 'p5:string' ],
  39. // 'nsPrefix' => [ '@type' => 'p5:string' ],
  40. // 'reinstallLink' => [ '@type' => 'p5:www_link' ],
  41. // 'instanceTableSource' => [ '@type' => 'xsd:string' ], // enum('table', 'view') default 'view'
  42. // 'A_RECORD_CREATE_AUTHOR' => [ '@type' => 'xsd:string' , '@label' => 'autor' ],
  43. // 'A_RECORD_CREATE_DATE' => [ '@type' => 'xsd:date' , '@label' => 'utworzono' ],
  44. // 'A_RECORD_UPDATE_AUTHOR' => [ '@type' => 'xsd:string' , '@label' => 'zaktualizował' ],
  45. // 'A_RECORD_UPDATE_DATE' => [ '@type' => 'xsd:date', '@label' => 'zaktualizowano' ],
  46. ]
  47. ];
  48. // public $_rootTableName = 'CRM_LISTA_ZASOBOW';
  49. public $_rootTableName = '_PRZYPOMNIJ_ITEMS';
  50. static function _createItemsTable() {
  51. DB::getPDO()->execSql("
  52. CREATE TABLE IF NOT EXISTS `_PRZYPOMNIJ_ITEMS` (
  53. `L_APPOITMENT_USER` varchar(255) NOT NULL default '',
  54. `A_ADM_COMPANY` varchar(255) NOT NULL default '',
  55. `A_CLASSIFIED` varchar(255) NOT NULL default '',
  56. `feature_id` varchar(255) NOT NULL,
  57. `namespace` varchar(255) NOT NULL default '',
  58. `primaryKey` varchar(255) NOT NULL default '',
  59. `A_STATUS` varchar(16) NOT NULL default '',
  60. `featureType` varchar(32) NOT NULL default '',
  61. `featureDesc` varchar(255) NOT NULL default '',
  62. `L_APPOITMENT_DATE` dateTime DEFAULT NULL,
  63. `L_APPOITMENT_INFO` varchar(255) NOT NULL default '',
  64. `PROJECT__ID` int(11) NOT NULL DEFAULT 0,
  65. `PROJECT__L_APPOITMENT_USER` varchar(255) NOT NULL default '',
  66. `USER__IS_ACTIVE` tinyint(1) NOT NULL DEFAULT 0,
  67. PRIMARY KEY (`feature_id`),
  68. KEY `namespace` (`namespace`),
  69. KEY `L_APPOITMENT_USER` (`L_APPOITMENT_USER`),
  70. KEY `A_ADM_COMPANY` (`A_ADM_COMPANY`),
  71. KEY `A_CLASSIFIED` (`A_CLASSIFIED`)
  72. -- `ID_PROJECT` int(11) NOT NULL,
  73. -- `_l_app_user` varchar(40) NOT NULL DEFAULT '',
  74. -- `P_ID` varchar(20) NOT NULL DEFAULT '0',
  75. -- `A_RECORD_CREATE_DATE` datetime NOT NULL,
  76. -- `A_RECORD_CREATE_AUTHOR` varchar(40) NOT NULL DEFAULT '',
  77. -- `A_RECORD_UPDATE_DATE` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  78. -- `A_RECORD_UPDATE_AUTHOR` varchar(40) NOT NULL DEFAULT '',
  79. -- `L_APPOITMENT_DATE` varchar(30) NOT NULL DEFAULT '',
  80. -- `L_APPOITMENT_USER` varchar(40) NOT NULL DEFAULT '',
  81. -- `L_APPOITMENT_INFO` varchar(200) NOT NULL DEFAULT '',
  82. -- `L_CALENDAR` enum('NO','YES') NOT NULL DEFAULT 'NO',
  83. -- `A_STATUS` enum('WAITING','NORMAL','MONITOR','WARNING','OFF_SOFT','OFF_HARD','DELETED') NOT NULL DEFAULT 'WAITING',
  84. -- `M_DIST_DATE` date NOT NULL DEFAULT '0000-00-00',
  85. -- `M_DIST_TYPE` varchar(64) NOT NULL DEFAULT 'INNE',
  86. -- `M_DIST_DESC` varchar(255) NOT NULL DEFAULT '',
  87. -- `M_DISTRIBUTOR` varchar(200) NOT NULL DEFAULT '',
  88. -- KEY `ID_PROJECT` (`ID_PROJECT`)
  89. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  90. ");
  91. }
  92. function __construct() {
  93. parent::__construct($this->_simpleSchema);
  94. $this->idUser = User::getID(); // default - current user
  95. }
  96. function onBeforeFetchData() {
  97. self::updateCacheIfNeeded();
  98. }
  99. static function updateCacheIfNeeded() {
  100. static $_checked = false;
  101. if ($_checked) return;
  102. $confKeyLastUpdateDate = 'Schema_PrzypomnijStorageAcl::lastUpdateDate';
  103. $lastUpdateDate = DB::getPDO()->fetchValue(" select CONF_VAL from CRM_CONFIG where CONF_KEY = :conf_key ", [ ':conf_key' => $confKeyLastUpdateDate ]);
  104. $tablesList = [];
  105. $tablesList[] = '_PRZYPOMNIJ_ITEMS'; // to check if tables exists
  106. $tablesList[] = '_PRZYPOMNIJ_PROJECT_TREE'; // to check if tables exists
  107. $tablesList[] = '_PRZYPOMNIJ_ACTIVE_USERS'; // to check if tables exists
  108. $tablesList[] = 'IN7_MK_BAZA_DYSTRYBUCJI';
  109. $tablesList[] = 'IN7_DZIENNIK_KORESP';
  110. $tablesList[] = 'CRM_PROCES';
  111. $tablesList[] = 'PROBLEMS';
  112. $tablesList[] = 'CRM_LISTA_ZASOBOW';
  113. $tablesList[] = 'MK_Rewiry';
  114. // $tablesList[] = 'BUILDINGS';
  115. // $tablesList[] = 'QUALITY_NOTICES';
  116. // $tablesList[] = 'BADANIA_W_TERENIE';
  117. $sqlTableList = implode(", ", array_map(function ($table) { return "'{$table}'"; }, $tablesList));
  118. $tablesUpdateDates = DB::getPDO()->fetchValuesListByKey("
  119. select IF( UPDATE_TIME > :last_update_date, 1, 0 ) as TO_UPDATE
  120. , TABLE_NAME
  121. , UPDATE_TIME
  122. from information_schema.tables
  123. where TABLE_SCHEMA = :db_name
  124. and TABLE_NAME in({$sqlTableList})
  125. ", $key = 'TABLE_NAME', [
  126. ':db_name' => DB::getPDO()->getDatabaseName(),
  127. ':last_update_date' => $lastUpdateDate,
  128. ]);
  129. DBG::log($tablesUpdateDates, 'array', "DBG::Przypomnij: \$tablesUpdateDates 1");
  130. if (!array_key_exists('_PRZYPOMNIJ_ITEMS', $tablesUpdateDates)) {
  131. self::_createItemsTable();
  132. $tablesUpdateDates = array_map(function ($value) { return 1; }, $tablesUpdateDates);
  133. }
  134. if (!array_key_exists('_PRZYPOMNIJ_PROJECT_TREE', $tablesUpdateDates)
  135. || $tablesUpdateDates['IN7_MK_BAZA_DYSTRYBUCJI']
  136. ) {
  137. if (!array_key_exists('_PRZYPOMNIJ_PROJECT_TREE', $tablesUpdateDates)) {
  138. self::_createProjectsTreeTable();
  139. }
  140. if (self::_isProjectsOwnerChanged()) {
  141. self::_updateProjectsTreeTable();
  142. }
  143. // $tablesUpdateDates = array_map(function ($value) { return 1; }, $tablesUpdateDates); // moved to mass update
  144. }
  145. if (!array_key_exists('_PRZYPOMNIJ_ACTIVE_USERS', $tablesUpdateDates)
  146. || $tablesUpdateDates['ADMIN_USERS']
  147. ) {
  148. if (!array_key_exists('_PRZYPOMNIJ_ACTIVE_USERS', $tablesUpdateDates)) {
  149. self::_createUsersTable();
  150. }
  151. if (self::_isUsersChanged()) {
  152. self::_updateUsersStatusTable();
  153. }
  154. // $tablesUpdateDates = array_map(function ($value) { return 1; }, $tablesUpdateDates); // moved to mass update
  155. }
  156. DBG::log($tablesUpdateDates, 'array', "DBG::Przypomnij: \$tablesUpdateDates 2");
  157. $tablesToUpdate = array_keys(
  158. array_filter($tablesUpdateDates, function ($value) { return $value; })
  159. );
  160. $tablesToUpdate = array_filter($tablesToUpdate, function ($tableName) { return ( '_PRZYPOMNIJ_' !== substr($tableName, 0, strlen('_PRZYPOMNIJ_')) ); });
  161. DBG::log($tablesToUpdate, 'array', "DBG::Przypomnij: \$tablesToUpdate");
  162. foreach ($tablesToUpdate as $tableName) self::_updateForTable($tableName);
  163. if (!array_key_exists('_PRZYPOMNIJ_PROJECT_TREE', $tablesUpdateDates)
  164. || $tablesUpdateDates['IN7_MK_BAZA_DYSTRYBUCJI']
  165. ) {
  166. self::_updateLAppUserByProjectsTree();
  167. }
  168. if (!array_key_exists('_PRZYPOMNIJ_ACTIVE_USERS', $tablesUpdateDates)
  169. || $tablesUpdateDates['ADMIN_USERS']
  170. || !empty($tablesToUpdate) // update if anything updates
  171. ) {
  172. self::_updateUserStatus();
  173. }
  174. DB::getPDO()->insertOrUpdate('CRM_CONFIG', [
  175. 'CONF_KEY' => $confKeyLastUpdateDate,
  176. '@insert' => [
  177. 'CONF_VAL' => "NOW()",
  178. ],
  179. '@update' => [
  180. 'CONF_VAL' => "NOW()",
  181. ]
  182. ]);
  183. $_checked = true;
  184. }
  185. static function _updateForTable($tableName) {
  186. $namespace = "default_db/{$tableName}";
  187. if ('CRM_LISTA_ZASOBOW' === $tableName) { // TODO: getUpdateConfigForTable($tableName);
  188. DB::getPDO()->execSql(" DELETE from `_PRZYPOMNIJ_ITEMS` where `namespace` = :namespace ", [ ':namespace' => $namespace ]);
  189. DB::getPDO()->execSql("
  190. insert into `_PRZYPOMNIJ_ITEMS` (
  191. `feature_id`, `namespace`, `primaryKey`
  192. , `A_STATUS`, `featureType`, `featureDesc`
  193. , `L_APPOITMENT_USER`, `A_ADM_COMPANY`, `A_CLASSIFIED`
  194. , `L_APPOITMENT_DATE`, `L_APPOITMENT_INFO`
  195. )
  196. select concat( :table_name , '.', t.ID) as `feature_id`, :namespace as `namespace`, t.ID as `primaryKey`
  197. , t.`A_STATUS`
  198. , t.`TYPE` as `featureType`
  199. , t.`DESC` as `featureDesc`
  200. , t.`L_APPOITMENT_USER`, t.`A_ADM_COMPANY`, t.`A_CLASSIFIED`
  201. , t.`L_APPOITMENT_DATE`, t.`L_APPOITMENT_INFO`
  202. from `CRM_LISTA_ZASOBOW` as t
  203. where t.`A_STATUS` in ('NORMAL', 'WAITING')
  204. and t.`L_APPOITMENT_DATE` != ''
  205. and t.`L_APPOITMENT_USER` != ''
  206. ", [
  207. ':namespace' => $namespace,
  208. ':table_name' => $tableName,
  209. ]);
  210. }
  211. else if ('CRM_PROCES' === $tableName) { // TODO: getUpdateConfigForTable($tableName);
  212. DB::getPDO()->execSql(" DELETE from `_PRZYPOMNIJ_ITEMS` where `namespace` = :namespace ", [ ':namespace' => $namespace ]);
  213. DB::getPDO()->execSql("
  214. insert into `_PRZYPOMNIJ_ITEMS` (
  215. `feature_id`, `namespace`, `primaryKey`
  216. , `A_STATUS`, `featureType`, `featureDesc`
  217. , `L_APPOITMENT_USER`, `A_ADM_COMPANY`, `A_CLASSIFIED`
  218. , `L_APPOITMENT_DATE`, `L_APPOITMENT_INFO`
  219. )
  220. select concat( :table_name , '.', t.ID) as `feature_id`, :namespace as `namespace`, t.ID as `primaryKey`
  221. , t.`A_STATUS`
  222. , t.`TYPE` as `featureType`
  223. , t.`DESC` as `featureDesc`
  224. , t.`L_APPOITMENT_USER`, t.`A_ADM_COMPANY`, t.`A_CLASSIFIED`
  225. , t.`L_APPOITMENT_DATE`, t.`L_APPOITMENT_INFO`
  226. from `CRM_PROCES` as t
  227. where t.`A_STATUS` in ('NORMAL', 'WAITING')
  228. and t.`TYPE` = 'PROCES_INIT'
  229. and t.`L_APPOITMENT_DATE` != ''
  230. and t.`L_APPOITMENT_USER` != ''
  231. ", [
  232. ':namespace' => $namespace,
  233. ':table_name' => $tableName,
  234. ]);
  235. }
  236. else if ('IN7_DZIENNIK_KORESP' === $tableName) { // TODO: getUpdateConfigForTable($tableName);
  237. DB::getPDO()->execSql(" DELETE from `_PRZYPOMNIJ_ITEMS` where `namespace` = :namespace ", [ ':namespace' => $namespace ]);
  238. DB::getPDO()->execSql("
  239. insert into `_PRZYPOMNIJ_ITEMS` (
  240. `feature_id`, `namespace`, `primaryKey`
  241. , `A_STATUS`, `featureType`, `featureDesc`
  242. , `L_APPOITMENT_USER`, `A_ADM_COMPANY`, `A_CLASSIFIED`
  243. , `L_APPOITMENT_DATE`, `L_APPOITMENT_INFO`
  244. , `PROJECT__ID`
  245. )
  246. select concat( :table_name , '.', t.ID) as `feature_id`, :namespace as `namespace`, t.ID as `primaryKey`
  247. , t.`A_STATUS`
  248. , concat(t.`K_TYP_KORESP`, '-', t.`K_TYP_RODZAJ`) as `featureType`
  249. , concat('<strong>', t.`K_OD_KOGO`, '</strong><br><em>', t.`OD_KOGO_ADRES`, '</em><br>', t.`K_ZAWARTOS`) as `featureDesc`
  250. , t.`L_APPOITMENT_USER`, t.`A_ADM_COMPANY`, t.`A_CLASSIFIED`
  251. , t.`L_APPOITMENT_DATE`, t.`L_APPOITMENT_INFO`
  252. , t.`ID_PROJECT` as PROJECT__ID
  253. from `IN7_DZIENNIK_KORESP` as t
  254. where t.`A_STATUS` not in ('OFF_HARD', 'DELETED')
  255. ", [
  256. ':namespace' => $namespace,
  257. ':table_name' => $tableName,
  258. ]);
  259. }
  260. else if ('IN7_MK_BAZA_DYSTRYBUCJI' === $tableName) { // TODO: getUpdateConfigForTable($tableName);
  261. // TODO: 'M_DIST_DESC' => htmlspecialchars($row['M_DIST_DESC']), // TODO: fix bug in html a href inside M_DIST_DES
  262. DB::getPDO()->execSql(" DELETE from `_PRZYPOMNIJ_ITEMS` where `namespace` = :namespace ", [ ':namespace' => $namespace ]);
  263. DB::getPDO()->execSql("
  264. insert into `_PRZYPOMNIJ_ITEMS` (
  265. `feature_id`, `namespace`, `primaryKey`
  266. , `A_STATUS`, `featureType`, `featureDesc`
  267. , `L_APPOITMENT_USER`, `A_ADM_COMPANY`, `A_CLASSIFIED`
  268. , `L_APPOITMENT_DATE`, `L_APPOITMENT_INFO`
  269. , `PROJECT__ID`
  270. )
  271. select concat( :table_name , '.', t.ID) as `feature_id`, :namespace as `namespace`, t.ID as `primaryKey`
  272. , t.`A_STATUS`
  273. , t.`M_DIST_TYPE` as `featureType`
  274. , t.`M_DIST_DESC` as `featureDesc`
  275. , t.`L_APPOITMENT_USER`, t.`A_ADM_COMPANY`, t.`A_CLASSIFIED`
  276. , t.`L_APPOITMENT_DATE`, t.`L_APPOITMENT_INFO`
  277. , t.`P_ID` as PROJECT__ID
  278. from `IN7_MK_BAZA_DYSTRYBUCJI` as t
  279. where t.`A_STATUS` not in ('OFF_HARD', 'DELETED')
  280. ", [
  281. ':namespace' => $namespace,
  282. ':table_name' => $tableName,
  283. ]);
  284. }
  285. else if ('PROBLEMS' === $tableName) { // TODO: getUpdateConfigForTable($tableName);
  286. // TODO: 'A_PROBLEM_DESC' => htmlspecialchars($row['A_PROBLEM_DESC']),
  287. DB::getPDO()->execSql(" DELETE from `_PRZYPOMNIJ_ITEMS` where `namespace` = :namespace ", [ ':namespace' => $namespace ]);
  288. DB::getPDO()->execSql("
  289. insert into `_PRZYPOMNIJ_ITEMS` (
  290. `feature_id`, `namespace`, `primaryKey`
  291. , `A_STATUS`, `featureType`, `featureDesc`
  292. , `L_APPOITMENT_USER`, `A_ADM_COMPANY`, `A_CLASSIFIED`
  293. , `L_APPOITMENT_DATE`, `L_APPOITMENT_INFO`
  294. , `PROJECT__ID`
  295. )
  296. select concat( :table_name , '.', t.ID) as `feature_id`, :namespace as `namespace`, t.ID as `primaryKey`
  297. , t.`A_STATUS`
  298. , '' as `featureType`
  299. , t.`A_PROBLEM_DESC` as `featureDesc`
  300. , t.`L_APPOITMENT_USER`, t.`A_ADM_COMPANY`, t.`A_CLASSIFIED`
  301. , t.`L_APPOITMENT_DATE`, t.`L_APPOITMENT_INFO`
  302. , t.`ID_PROJECT` as PROJECT__ID
  303. from `PROBLEMS` as t
  304. where t.`A_STATUS` not in ('OFF_HARD', 'DELETED')
  305. and t.`L_APPOITMENT_DATE` != ''
  306. and t.`L_APPOITMENT_USER` != ''
  307. ", [
  308. ':namespace' => $namespace,
  309. ':table_name' => $tableName,
  310. ]);
  311. }
  312. else if ('MK_Rewiry' === $tableName) { // TODO: getUpdateConfigForTable($tableName);
  313. // TODO: 'A_PROBLEM_DESC' => htmlspecialchars($row['A_PROBLEM_DESC']),
  314. DB::getPDO()->execSql(" DELETE from `_PRZYPOMNIJ_ITEMS` where `namespace` = :namespace ", [ ':namespace' => $namespace ]);
  315. DB::getPDO()->execSql("
  316. insert into `_PRZYPOMNIJ_ITEMS` (
  317. `feature_id`, `namespace`, `primaryKey`
  318. , `A_STATUS`, `featureType`, `featureDesc`
  319. , `L_APPOITMENT_USER`, `A_ADM_COMPANY`, `A_CLASSIFIED`
  320. , `L_APPOITMENT_DATE`, `L_APPOITMENT_INFO`
  321. , `PROJECT__ID`
  322. )
  323. select concat( :table_name , '.', t.ID) as `feature_id`, :namespace as `namespace`, t.ID as `primaryKey`
  324. , t.`A_STATUS`
  325. , '' as `featureType`
  326. , t.`L_APPOITMENT_INFO` as `featureDesc`
  327. , t.`L_APPOITMENT_USER`, t.`A_ADM_COMPANY`, t.`A_CLASSIFIED`
  328. , t.`L_APPOITMENT_DATE`, t.`L_APPOITMENT_INFO`
  329. , t.`ID_PROJECT` as PROJECT__ID
  330. from `MK_Rewiry` as t
  331. where t.`A_STATUS` not in ('OFF_HARD', 'DELETED')
  332. and t.`L_APPOITMENT_DATE` != ''
  333. and t.`L_APPOITMENT_USER` != ''
  334. ", [
  335. ':namespace' => $namespace,
  336. ':table_name' => $tableName,
  337. ]);
  338. }
  339. else if ('_PRZYPOMNIJ_ITEMS' === $tableName) {}
  340. else if ('_PRZYPOMNIJ_PROJECT_TREE' === $tableName) {}
  341. else {
  342. throw new Exception("TODO: (default_objects/Przypomnij)::_updateForTable({$tableName})");
  343. }
  344. }
  345. static function _createUsersTable() {
  346. DB::getPDO()->execSql("
  347. CREATE TABLE IF NOT EXISTS `_PRZYPOMNIJ_ACTIVE_USERS` (
  348. `ADM_ACCOUNT` varchar(20) NOT NULL,
  349. UNIQUE KEY `ADM_ACCOUNT` (`ADM_ACCOUNT`)
  350. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  351. ");
  352. }
  353. static function _isUsersChanged() {
  354. return ( DB::getPDO()->fetchValue("
  355. select count(1) as total
  356. -- u.ID as u__ID, u.ADM_ACCOUNT as u__ADM_ACCOUNT, t.*
  357. from ADMIN_USERS u
  358. left join _PRZYPOMNIJ_ACTIVE_USERS t on ( t.ADM_ACCOUNT = u.ADM_ACCOUNT )
  359. where t.ADM_ACCOUNT is null
  360. ") > 0);
  361. }
  362. static function _updateUsersStatusTable() {
  363. DB::getPDO()->execSql(" truncate table `_PRZYPOMNIJ_ACTIVE_USERS` ");
  364. DB::getPDO()->execSql("
  365. insert into `_PRZYPOMNIJ_ACTIVE_USERS` (`ADM_ACCOUNT`)
  366. select `ADM_ACCOUNT`
  367. from `ADMIN_USERS`
  368. where A_STATUS = 'NORMAL'
  369. ");
  370. }
  371. static function _updateUserStatus() {
  372. DB::getPDO()->execSql("
  373. update `_PRZYPOMNIJ_ITEMS` as i
  374. left join `_PRZYPOMNIJ_ACTIVE_USERS` as u on ( u.ADM_ACCOUNT = i.L_APPOITMENT_USER )
  375. set i.USER__IS_ACTIVE = IF(u.ADM_ACCOUNT is null, 0, 1)
  376. where i.L_APPOITMENT_USER != ''
  377. ");
  378. }
  379. static function _createProjectsTreeTable() {
  380. DB::getPDO()->execSql("
  381. CREATE TABLE IF NOT EXISTS `_PRZYPOMNIJ_PROJECT_TREE` (
  382. `ID_PROJECT` int(11) NOT NULL,
  383. `P_ID` int(11) NOT NULL DEFAULT 0,
  384. `L_APPOITMENT_USER` varchar(40) NOT NULL DEFAULT '',
  385. `_l_app_user` varchar(40) NOT NULL DEFAULT '',
  386. UNIQUE KEY `ID_PROJECT` (`ID_PROJECT`),
  387. KEY `P_ID` (`P_ID`)
  388. ) ENGINE=MyISAM DEFAULT CHARSET=latin2;
  389. ");
  390. }
  391. static function _isProjectsOwnerChanged() {
  392. return ( DB::getPDO()->fetchValue("
  393. select count(1) as total
  394. -- p.ID as p__ID, p.L_APPOITMENT_USER as p__L_APPOITMENT_USER, t.*
  395. from IN7_MK_BAZA_DYSTRYBUCJI p
  396. left join _PRZYPOMNIJ_PROJECT_TREE t on ( t.ID_PROJECT = p.ID )
  397. where (
  398. t.L_APPOITMENT_USER is null
  399. or p.L_APPOITMENT_USER != t.L_APPOITMENT_USER
  400. )
  401. ") > 0);
  402. }
  403. static function _updateProjectsTreeTable() {
  404. DB::getPDO()->execSql(" truncate table `_PRZYPOMNIJ_PROJECT_TREE` ");
  405. DB::getPDO()->execSql("
  406. insert into `_PRZYPOMNIJ_PROJECT_TREE` (`ID_PROJECT`,`P_ID`,`_l_app_user`,`L_APPOITMENT_USER`)
  407. select `ID`,`P_ID`,`L_APPOITMENT_USER`,`L_APPOITMENT_USER`
  408. from `IN7_MK_BAZA_DYSTRYBUCJI`
  409. where 1=1
  410. ");
  411. // test recurse update l_app
  412. $sql = "
  413. select c._l_app_user
  414. , p.L_APPOITMENT_USER
  415. , p1.L_APPOITMENT_USER
  416. , p2.L_APPOITMENT_USER
  417. , p3.L_APPOITMENT_USER
  418. , p4.L_APPOITMENT_USER
  419. , p5.L_APPOITMENT_USER
  420. , p.ID
  421. , p1.ID
  422. , p2.ID
  423. , p3.ID
  424. , p4.ID
  425. , p5.ID
  426. from `_PRZYPOMNIJ_PROJECT_TREE` as c
  427. left join `IN7_MK_BAZA_DYSTRYBUCJI` as p on (p.ID=c.ID_PROJECT)
  428. left join `IN7_MK_BAZA_DYSTRYBUCJI` as p1 on (p1.ID=p.P_ID)
  429. left join `IN7_MK_BAZA_DYSTRYBUCJI` as p2 on (p2.ID=p1.P_ID)
  430. left join `IN7_MK_BAZA_DYSTRYBUCJI` as p3 on (p3.ID=p2.P_ID)
  431. left join `IN7_MK_BAZA_DYSTRYBUCJI` as p4 on (p4.ID=p3.P_ID)
  432. left join `IN7_MK_BAZA_DYSTRYBUCJI` as p5 on (p5.ID=p4.P_ID)
  433. where c.`_l_app_user`=''
  434. ";
  435. // for i to recurse limit
  436. $sql = "
  437. update `_PRZYPOMNIJ_PROJECT_TREE` as c
  438. left join `IN7_MK_BAZA_DYSTRYBUCJI` as p on (p.ID=c.ID_PROJECT)
  439. left join `IN7_MK_BAZA_DYSTRYBUCJI` as p1 on (p1.ID=p.P_ID)
  440. left join `IN7_MK_BAZA_DYSTRYBUCJI` as p2 on (p2.ID=p1.P_ID)
  441. left join `IN7_MK_BAZA_DYSTRYBUCJI` as p3 on (p3.ID=p2.P_ID)
  442. -- left join `IN7_MK_BAZA_DYSTRYBUCJI` as p4 on (p4.ID=p3.P_ID)
  443. -- left join `IN7_MK_BAZA_DYSTRYBUCJI` as p5 on (p5.ID=p4.P_ID)
  444. set
  445. c.`_l_app_user`=IF(p.`L_APPOITMENT_USER`!='', p.`L_APPOITMENT_USER`
  446. , IF(p1.`L_APPOITMENT_USER`!='', p1.`L_APPOITMENT_USER`
  447. , IF(p2.`L_APPOITMENT_USER`!='', p2.`L_APPOITMENT_USER`
  448. , IF(p3.`L_APPOITMENT_USER`!='', p3.`L_APPOITMENT_USER`
  449. -- , IF(p4.`L_APPOITMENT_USER`!='', p4.`L_APPOITMENT_USER`
  450. -- , IF(p5.`L_APPOITMENT_USER`!='', p5.`L_APPOITMENT_USER`
  451. , ''
  452. -- )
  453. -- )
  454. )
  455. )
  456. )
  457. )
  458. where c.`_l_app_user`=''
  459. ";
  460. DB::getPDO()->execSql($sql);
  461. }
  462. static function _updateLAppUserByProjectsTree() {
  463. DB::getPDO()->execSql("
  464. update `_PRZYPOMNIJ_ITEMS` as i
  465. join `_PRZYPOMNIJ_PROJECT_TREE` as t on ( t.ID_PROJECT = i.PROJECT__ID )
  466. set i.PROJECT__L_APPOITMENT_USER = t._l_app_user
  467. where i.PROJECT__ID > 0
  468. ");
  469. }
  470. // function getTotal($params = []) {
  471. // self::updateCacheIfNeeded();
  472. // $sqlWhere = $this->_parseWhere($params);
  473. // return DB::getPDO()->fetchValue("
  474. // select count(1) as cnt
  475. // from `{$this->_rootTableName}` t
  476. // {$sqlWhere}
  477. // ");
  478. // }
  479. // function getItem($pk, $params = []) {
  480. // self::updateCacheIfNeeded();
  481. // if (!$pk) throw new Exception("Missing primary key '{$this->_namespace}'");
  482. // $pkField = $this->getSqlPrimaryKeyField();
  483. // if (!$pkField) throw new Exception("Missing primary key field defined in '{$this->_namespace}'");
  484. // $item = DB::getPDO()->fetchFirst("
  485. // select t.*
  486. // from `{$this->_rootTableName}` t
  487. // where t.`{$pkField}` = :pk
  488. // ", [ ':pk' => $pk ]);
  489. // if (!$item) throw new Exception("Item '{$pk}' not exists - type '{$this->_namespace}'");
  490. // return $this->buildFeatureFromSqlRow($item, $params);
  491. // }
  492. //
  493. // function getItems($params = []) {
  494. // self::updateCacheIfNeeded();
  495. // $sqlWhere = $this->_parseWhere($params);
  496. //
  497. // $currSortCol = V::get('order_by', 'feature_id', $params);
  498. // $currSortFlip = strtolower(V::get('order_dir', 'desc', $params));
  499. // // TODO: validate $currSortCol is in field list
  500. // // TODO: validate $currSortFlip ('asc' or 'desc')
  501. // $xsdFields = $this->getXsdTypes();
  502. // if (!array_key_exists($currSortCol, $xsdFields)) throw new Exception("Field '{$currSortCol}' not found in '{$this->_namespace}'");
  503. // if (!in_array($currSortFlip, ['asc', 'desc'])) throw new Exception("Sort dir not allowed");
  504. // $sqlOrderBy = "order by t.`{$currSortCol}` {$currSortFlip}";
  505. //
  506. // $limit = V::get('limit', 0, $params, 'int');
  507. // $limit = ($limit < 0) ? 0 : $limit;
  508. // $offset = V::get('limitstart', 0, $params, 'int');
  509. // $offset = ($offset < 0) ? 0 : $offset;
  510. // $sqlLimit = ($limit > 0)
  511. // ? "limit {$limit} offset {$offset}"
  512. // : '';
  513. //
  514. // Lib::loadClass('AclQueryItems');
  515. // $query = new AclQueryItems($this);
  516. // $query->setParams($params);
  517. // $query->setSource('default_db');
  518. // $query->setRawSql("
  519. // select t.*
  520. // from `{$this->_rootTableName}` t
  521. // {$sqlWhere}
  522. // {$sqlOrderBy}
  523. // {$sqlLimit}
  524. // ");
  525. // return array_map(function ($item) use ($params) {
  526. // return $this->buildFeatureFromSqlRow($item, $params);
  527. // }, $query->fetchAll());
  528. // }
  529. function buildQuery($params = array()) {
  530. Lib::loadClass('AclQueryFeatures');
  531. return new AclQueryFeatures($this, $params, $legacyMode = false);
  532. }
  533. function _parseWhere($params = []) {
  534. $sqlWhere = [];
  535. DBG::log($params, 'array', "SystemObject::_parseWhere");
  536. // if (!empty($params['#refFrom'])) {
  537. // // '#refFrom' => [
  538. // // 'namespace' => 'default_objects/SystemSource',
  539. // // 'primaryKey' => $sourceItem['idZasob']
  540. // // ]
  541. // if (empty($params['#refFrom']['namespace'])) throw new Exception("Missing refFrom/namespace");
  542. // if (empty($params['#refFrom']['primaryKey'])) throw new Exception("Missing refFrom/primaryKey");
  543. //
  544. // if ('default_objects/SystemSource' != $params['#refFrom']['namespace']) throw new Exception("Unsupported refFrom/namespace '{$params['#refFrom']['namespace']}'");
  545. // $sqlWhere[] = "t.idDatabase = " . DB::getPDO()->quote($params['#refFrom']['primaryKey'], PDO::PARAM_INT);
  546. // }
  547. {
  548. $filterParams = [];
  549. $xsdFields = $this->getXsdTypes();
  550. foreach ($params as $k => $v) {
  551. if ('f_' != substr($k, 0, 2)) continue;
  552. $fieldName = substr($k, 2);
  553. if (!array_key_exists($fieldName, $xsdFields)) {
  554. // TODO: check query by xpath or use different param prefix
  555. throw new Exception("Field '{$fieldName}' not found in '{$this->_namespace}'");
  556. }
  557. if ('p5:www_link' == $xsdFields[$fieldName]) {
  558. continue;
  559. }
  560. $filterParams[$fieldName] = $v;
  561. }
  562. }
  563. if (!empty($filterParams)) {
  564. DBG::log($filterParams, 'array', "SystemObject::_parseWhere TODO \$filterParams");
  565. foreach ($filterParams as $fieldName => $value) {
  566. if (is_array($value)) {
  567. DBG::log($value, 'array', "TODO SystemObject::_parseWhere array value for \$filterParams[{$fieldName}]");
  568. } else if (is_scalar($value)) {
  569. if ('=' == substr($value, 0, 1)) {
  570. $sqlWhere[] = "t.{$fieldName} = " . DB::getPDO()->quote(substr($value, 1), PDO::PARAM_STR);
  571. } else {
  572. $sqlWhere[] = "t.{$fieldName} like " . DB::getPDO()->quote("%{$value}%", PDO::PARAM_STR);
  573. }
  574. } else {
  575. DBG::log($value, 'array', "BUG SystemObject::_parseWhere unknown type for \$filterParams[{$fieldName}]");
  576. }
  577. }
  578. }
  579. { // acl fields
  580. $sqlWhere[] = "t.{$fieldName} like " . DB::getPDO()->quote("%{$value}%", PDO::PARAM_STR);
  581. }
  582. return (!empty($sqlWhere)) ? "where " . implode(" and ", $sqlWhere) : '';
  583. }
  584. function buildFeatureFromSqlRow($item, $params = []) {
  585. // DBG::log($params, 'array', "buildFeatureFromSqlRow... '{$item['namespace']}'");
  586. // $exNs = explode('/', $item['namespace']);
  587. // $item['name'] = array_pop($exNs);
  588. // $item['nsPrefix'] = implode('__x3A__', $exNs);
  589. // $item['typeName'] = implode('__x3A__', $exNs) . ':' . $item['name'];
  590. // $item['reinstallLink'] = Router::getRoute('Storage_AclReinstall')->getLink('', [ 'namespace' => $item['namespace'] ]);
  591. // if (!empty($params['propertyName'])) {
  592. // if (is_string($params['propertyName'])) $params['propertyName'] = explode(',', $params['propertyName']);
  593. // if (!is_array($params['propertyName'])) throw new Exception("Wrong param propertyName - expected array or string");
  594. // foreach ($params['propertyName'] as $fetchField) {
  595. // if ('*' == $fetchField) continue;
  596. // if ('field' == $fetchField) {
  597. // $item['field'] = SchemaFactory::loadDefaultObject('SystemObjectField')->getItems([
  598. // '__backRef' => [
  599. // 'namespace' => 'default_objects/SystemObject',
  600. // 'primaryKey' => $item['namespace']
  601. // ],
  602. // 'order_by' => 'sortPrio',
  603. // 'order_dir' => 'asc',
  604. // ]);
  605. // }
  606. // }
  607. // }
  608. return $item;
  609. }
  610. // function updateItem($itemPatch) { // @required [ 'namespace' => ... ] (primaryKey)
  611. // $pkField = $this->getPrimaryKeyField();
  612. // $pk = V::get($pkField, null, $itemPatch);
  613. // if (null === $pk) throw new Exception("BUG missing primary key field for '{$this->_namespace}' updateItem");
  614. // $this->clearGetItemCache($pk);
  615. // DBG::log(['updateItem $itemPatch', $itemPatch]);
  616. // unset($itemPatch[$pkField]);
  617. // if (empty($itemPatch)) return 0;
  618. // foreach ($itemPatch as $fieldName => $value) {
  619. // if ('isStructInstalled' == $fieldName) continue;
  620. // if ('isObjectActive' == $fieldName) continue;
  621. // if ('primaryKey' == $fieldName) continue;
  622. // if ('appInfo' == $fieldName) continue;
  623. // throw new Exception("Update field '{$fieldName}' not allowed for '{$this->_namespace}'");
  624. // }
  625. // return DB::getPDO()->update($this->_rootTableName, $pkField, $pk, $itemPatch);
  626. // }
  627. // TODO: to use in AclQueryFeatures
  628. function getDB() { return DB::getPDO()->getZasobId(); }
  629. function getLocalFieldList() {
  630. return array_filter(array_keys($this->_simpleSchema['root']), function ($fieldName) {
  631. if ( '@' == substr($fieldName, 0, 1)) return false;
  632. return true;
  633. });
  634. }
  635. function hasWriteGroupField() { return $this->_hasWriteGroupField; }
  636. function hasReadGroupField() { return $this->_hasReadGroupField; }
  637. function hasOwnerField() { return $this->_hasOwnerField; }
  638. function isLocalField($fieldName) {
  639. return in_array($fieldName, array_keys($this->_simpleSchema['root']));
  640. }
  641. }