Messages system
...
reinstall();
die('OK');
}
public function reinstallFunctionsAction() {
$this->reinstallFunctions();
die('OK');
}
public function runAction() {
$msgId = V::get('_msgId', 0, $_REQUEST, 'int');
if ($msgId > 0) {
$this->runByMessageId($msgId);
}
$jsonData = new stdClass();
$jsonData->type = 'success';
$jsonData->msg = 'Gotowe';
echo json_encode($jsonData);
exit;
}
public function addTestMsgAction() {
$sql = "INSERT INTO `CRM_UI_MSGS` (`ID`, `app_className`, `msg`, `msgType`, `uiTargetType`, `uiTargetName`, `userTargetType`, `userTargetName`, `actionExecutedTime`, `actionNotes`, `A_RECORD_CREATE_DATE`, `A_RECORD_CREATE_AUTHOR`, `A_RECORD_UPDATE_DATE`, `A_RECORD_UPDATE_AUTHOR`)
VALUES (NULL, 'FixZasobPath', 'Update all paths', 'danger', 'default_db_table', 'CRM_LISTA_ZASOBOW', 'user', 'plabudda', NULL, '', NULL, 'plabudda', NULL, '')";
$db = DB::getDB();
$db->query($sql);
die('OK');
}
public function reinstallFunctions() {
$sqlList = array();
//$sqlList['RemoveTable_CRM_UI_MSGS__EXEC_LOG'] = "DROP TABLE IF EXISTS `CRM_UI_MSGS__EXEC_LOG`";
$sqlList['CreateTable_CRM_UI_MSGS__EXEC_LOG'] = "
CREATE TABLE IF NOT EXISTS `CRM_UI_MSGS__EXEC_LOG` (
`ID` int(11) NOT NULL AUTO_INCREMENT
, `_exec_time` datetime DEFAULT NULL
, `author` VARCHAR(40) DEFAULT ''
, `app_className` VARCHAR(255) DEFAULT ''
, `msg` VARCHAR(255) DEFAULT ''
, `uiTargetType` VARCHAR(255) DEFAULT ''
, `uiTargetName` VARCHAR(255) DEFAULT ''
, `userTargetType` VARCHAR(255) DEFAULT ''
, `userTargetName` VARCHAR(255) DEFAULT ''
, PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2
";
$sqlList['RemoveProcedureMarkAsExecuted'] = "DROP PROCEDURE IF EXISTS `CRM_UI_MSGS__markAsExecuted`";
$sqlList['InstallProcedureMarkAsExecuted'] = <<has_errors()) {
throw new Exception("DB Errors: " . implode("\n
", $db->get_errors()));
}
foreach ($sqlList as $sqlName => $sql) {
$res = $db->query($sql);
if ($db->has_errors()) {
throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n
", $db->get_errors()));
}
}
}
public function reinstall() {
$sqlList = array();
//$sqlList['RemoveTable'] = "DROP TABLE IF EXISTS `CRM_UI_MSGS`";// TODO: update struct (add cells, rm old keys) - not drop/create
$sqlList['InstallTable'] = "
CREATE TABLE IF NOT EXISTS `CRM_UI_MSGS` (
`ID` int(11) NOT NULL AUTO_INCREMENT
, `idReplyTo` int(11) NOT NULL DEFAULT 0
, `idThread` int(11) NOT NULL DEFAULT 0
-- app_className - for automatic msgs to search for msg text
, `app_className` varchar(255) DEFAULT NULL
-- msg - msg to show or to parse by app_className
, `msg` varchar(1000) NOT NULL
, `msgType` enum('info','danger','warning','success') NOT NULL DEFAULT 'info'
-- uiTargetType - where to show this msg eg. 'default_db_table', 'after_login', 'everywhere'
, `uiTargetType` enum('default_db_table','default_db_table_record','after_login','everywhere') NOT NULL
-- uiTargetName - eg. database table name (if from default_db)
, `uiTargetName` varchar(255) NOT NULL DEFAULT ''
-- userTargetType - type of users allowed to see this msg eg. 'everyone', 'admin' (ADMIN_LEVEL=0?), 'user', 'group'
, `userTargetType` enum('none','everyone','admin','user','group') NOT NULL DEFAULT 'none'
-- userTargetName - login, group name
, `userTargetName` varchar(255) NOT NULL DEFAULT ''
-- actionExecutedTime - execution time if msg require user to run specific action (send msg.id in request)
, `actionExecutedTime` datetime DEFAULT NULL
-- actionNotes - notes/msgs/dbg for user actions executed from this msg
, `actionNotes` varchar(255) NOT NULL DEFAULT ''
, `A_STATUS` enum('WAITING','NORMAL','OFF_HARD','DELETED') NOT NULL DEFAULT 'WAITING'
, `A_RECORD_CREATE_DATE` datetime DEFAULT NULL
, `A_RECORD_CREATE_AUTHOR` varchar(40) NOT NULL DEFAULT ''
, `A_RECORD_UPDATE_DATE` datetime DEFAULT NULL
, `A_RECORD_UPDATE_AUTHOR` varchar(40) NOT NULL DEFAULT ''
, `A_RECORD_DELETE_DATE` datetime DEFAULT NULL
, `A_RECORD_DELETE_AUTHOR` varchar(40) NOT NULL DEFAULT ''
, PRIMARY KEY (`ID`)
, KEY `app_className` (`app_className`)
) ENGINE=MyISAM DEFAULT CHARSET=latin2
";
$db = DB::getDB();
if ($db->has_errors()) {
throw new Exception("DB Errors: " . implode("\n
", $db->get_errors()));
}
foreach ($sqlList as $sqlName => $sql) {
$res = $db->query($sql);
if ($db->has_errors()) {
throw new Exception("DB Errors at sql '{$sqlName}': " . implode("\n
", $db->get_errors()));
}
}
$this->reinstallFunctions();
}
public function getActiveMessagesForTable($tblName) {
if (empty($tblName)) return;
$sqlTableName = DB::getPDO()->quote($tblName);
$usrLogin = User::getLogin();
$msgs = [];
$sql = "
select m.*
from `CRM_UI_MSGS` m
where m.`uiTargetType`='default_db_table'
and m.`A_STATUS`='WAITING'
and m.`uiTargetName`={$sqlTableName}
and (m.`userTargetType` in('everyone')
or (m.`userTargetType`='user' and m.`userTargetName`='{$usrLogin}')
-- TODO: use 'admin', 'group'
)
";
foreach (DB::getPDO()->fetchAll($sql) as $row) {
$r = (object)$row;
if ($msg = $this->parseMessage($r)) {
$msg['link'] = 'index.php?_route=Msgs&_task=run&_msgId=' . $r->ID;
$msg['linkType'] = 'ajax';
$msgs[$r->ID] = $msg;
}
}
return $msgs;
}
public function getActiveMessagesForTableRecord($tblName, $id) {
if (empty($tblName)) return;
$usrLogin = User::getLogin();
$msgs = [];
$rawMsgs = DB::getPDO()->fetchAll("
select m.*
from `CRM_UI_MSGS` m
where m.`uiTargetType` = 'default_db_table_record'
and m.`uiTargetName` = :feature_id
and (m.`userTargetType` in('everyone')
or (m.`userTargetType` = 'user' and m.`userTargetName` = '{$usrLogin}')
-- TODO: use group id
)
and m.`A_STATUS` = 'WAITING'
order by m.`ID` DESC
", [
':feature_id' => "{$tblName}.{$id}",
]);
foreach ($rawMsgs as $row) {
$r = (object)$row;
if ($msg = $this->parseMessage($r)) {
$msg['link'] = 'index.php?_route=Msgs&_task=run&_msgId=' . $r->ID;
$msg['linkType'] = 'ajax';
$msgs[$r->ID] = $msg;
}
}
return $msgs;
}
public function parseMessage($r) {
$msg = null;// ['type'=>'info', 'message'=>'...']
// $r->app_className - for automatic msgs to search for msg text
// $r->msg - for automatic msgs to search for msg text
// $r->msgType - 'info','danger','warning','success'
if (!empty($r->app_className)) {
$route = Router::getRoute($r->app_className);
$msg = array();
$msg['message'] = $route->parseMessageFromMsgsSystem($r->msg);
$msg['type'] = $r->msgType;
$msg['_raw'] = $r;
} else {
$msg = array();
$msg['message'] = $this->parseMessageFromMsgsSystem($r->msg);
$msg['type'] = $r->msgType;
$msg['_raw'] = $r;
}
return $msg;
}
public function parseMessageFromMsgsSystem($msg) {
return $msg;
}
public function runByMessageId($id) {
$msgRow = $this->getActiveMessage($id);
$execNotes = '';
if (!empty($msgRow->app_className)) {
$route = Router::getRoute($msgRow->app_className);
$route->runByMessageFromMsgsSystem($msgRow->msg, $execNotes);
}
$this->forceFinishMessage($id, $execNotes);
}
public function getMessage($id) {
if (empty($id)) return;
$id = intval($id);
if ($id <= 0) return;
$msg = null;
$sql = "select * from `CRM_UI_MSGS` where `ID`='{$id}' ";
$db = DB::getDB();
$res = $db->query($sql);
if ($r = $db->fetch($res)) {
$msg = $r;
}
return $msg;
}
public function getActiveMessage($id) {
if (empty($id)) return;
$id = intval($id);
if ($id <= 0) return;
$msg = null;
$sql = "select m.*
from `CRM_UI_MSGS` m
where m.`ID`='{$id}'
and m.`A_STATUS`='WAITING'
";
$db = DB::getDB();
$res = $db->query($sql);
if ($r = $db->fetch($res)) {
$msg = $r;
}
if (!$msg) {
throw new HttpException("Message not found", 404);
}
return $msg;
}
public function forceFinishMessage($id, $execNotes) {
if (empty($id)) return;
$id = intval($id);
if ($id <= 0) return;
$usrLogin = User::getLogin();
$db = DB::getDB();
$execNotes = $db->_($execNotes);
$sql = "update `CRM_UI_MSGS`
set `A_STATUS`='OFF_HARD'
, `actionExecutedTime`=NOW()
, `actionNotes`='{$execNotes}'
, `A_RECORD_UPDATE_DATE`=NOW()
, `A_RECORD_UPDATE_AUTHOR`='{$usrLogin}'
where `ID`='{$id}'
";
$db->query($sql);
return;
}
public function removeMessage($id) {
if (empty($id)) return;
$id = intval($id);
if ($id <= 0) return;
$sql = "update `CRM_UI_MSGS` set `A_STATUS`='DELETED' where `ID`='{$id}' ";
$db = DB::getDB();
$db->query($sql);
}
public function removeTableRecordMsg($idMsg) {
// IDEA: do kosza - add trigger to insert into `CRM_UI_MSGS__TRASH` after DELETE on `CRM_UI_MSGS`
$idMsg = intval($idMsg);
if ($idMsg <= 0) throw new Exception("Brak wiadomości!");
$usrLogin = User::getLogin();
$db = DB::getDB();
if (!$db) throw new Exception("Brak dazy danych!");
if ($db->has_errors()) throw new Exception("DB Errors: " . implode("\n
", $db->get_errors()));
$sqlTODO = "delete `CRM_UI_MSGS` where `ID`='{$idMsg}' ";
$sql = "update `CRM_UI_MSGS`
set `A_STATUS`=IF('{$usrLogin}'=`A_RECORD_CREATE_AUTHOR`, 'DELETED', 'OFF_SOFT')
, `A_RECORD_DELETE_AUTHOR`='{$usrLogin}'
, `A_RECORD_DELETE_DATE`=NOW()
where `ID`='{$idMsg}'
";
DBG::_('DBG_MSGS', '>1', "sql", $sql, __CLASS__, __FUNCTION__, __LINE__);
$res = $db->query($sql);
if (!$res || $db->has_errors()) throw new Exception("Wystąpiły błędy podczas próby zapisu wiadomości: " . implode("\n
", $db->get_errors()));
}
}