|
@@ -8,6 +8,9 @@ Lib::loadClass('SqlQueryWhereBuilder');
|
|
|
// (view): $total = $queryFeatures->getTotal();
|
|
// (view): $total = $queryFeatures->getTotal();
|
|
|
// (view): $items = $queryFeatures->getItems();
|
|
// (view): $items = $queryFeatures->getItems();
|
|
|
// example: @see TableAcl, TableAjax
|
|
// example: @see TableAcl, TableAjax
|
|
|
|
|
+
|
|
|
|
|
+// Special Filter Access - btns visible only if user don't have super access perms. If has, then will always see all rows.
|
|
|
|
|
+
|
|
|
class AclQueryFeatures {
|
|
class AclQueryFeatures {
|
|
|
|
|
|
|
|
public $_params;
|
|
public $_params;
|
|
@@ -16,12 +19,12 @@ class AclQueryFeatures {
|
|
|
public $_total;
|
|
public $_total;
|
|
|
public $_legacyMode;
|
|
public $_legacyMode;
|
|
|
|
|
|
|
|
- public function __construct($acl, $params) {
|
|
|
|
|
|
|
+ public function __construct($acl, $params, $legacyMode = false) {
|
|
|
$this->_acl = $acl;
|
|
$this->_acl = $acl;
|
|
|
$this->_params = $params;
|
|
$this->_params = $params;
|
|
|
$this->_query = null;
|
|
$this->_query = null;
|
|
|
$this->_total = null;
|
|
$this->_total = null;
|
|
|
- $this->_legacyMode = false;
|
|
|
|
|
|
|
+ $this->_legacyMode = $legacyMode;
|
|
|
// TODO: _legacyMode = ($from instanceof simple schema or another programmed objects)
|
|
// TODO: _legacyMode = ($from instanceof simple schema or another programmed objects)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -64,7 +67,10 @@ class AclQueryFeatures {
|
|
|
default: {
|
|
default: {
|
|
|
switch ($fieldType) {
|
|
switch ($fieldType) {
|
|
|
case 'xsd:number':
|
|
case 'xsd:number':
|
|
|
- case 'xsd:integer': return ['=', $searchQuery];
|
|
|
|
|
|
|
+ case 'xsd:integer': {
|
|
|
|
|
+ if (false !== strpos($searchQuery, '%')) return ['like', $searchQuery];
|
|
|
|
|
+ return ['=', $searchQuery];
|
|
|
|
|
+ }
|
|
|
default: {
|
|
default: {
|
|
|
if (false !== strpos($searchQuery, '%')) return ['like', $searchQuery];
|
|
if (false !== strpos($searchQuery, '%')) return ['like', $searchQuery];
|
|
|
$queryWhereBuilder = new SqlQueryWhereBuilder();
|
|
$queryWhereBuilder = new SqlQueryWhereBuilder();
|
|
@@ -129,6 +135,112 @@ class AclQueryFeatures {
|
|
|
return $sqlFilter;
|
|
return $sqlFilter;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ public function parseSpecialFilterMsgs($type) {
|
|
|
|
|
+ $rootTableName = $this->_acl->getRootTableName();
|
|
|
|
|
+ DBG::log($rootTableName, 'string', "parse SpecialFilter Msgs({$type}), \$rootTableName");
|
|
|
|
|
+ $sqlHasFltrMsgs = "
|
|
|
|
|
+ select 1
|
|
|
|
|
+ from `CRM_UI_MSGS` m
|
|
|
|
|
+ where m.`uiTargetName`=CONCAT('{$rootTableName}.', t.`ID`)
|
|
|
|
|
+ and m.`uiTargetType`='default_db_table_record'
|
|
|
|
|
+ and m.`A_STATUS` not in('DELETED')
|
|
|
|
|
+ limit 1
|
|
|
|
|
+ ";
|
|
|
|
|
+ switch ($type) {
|
|
|
|
|
+ case 'HAS_MSGS': return " ({$sqlHasFltrMsgs})=1 ";
|
|
|
|
|
+ case 'NO_MSGS': return " ({$sqlHasFltrMsgs}) is null ";
|
|
|
|
|
+ case 'NEW_MSGS': {
|
|
|
|
|
+ $sqlNewFltrMsgs = "
|
|
|
|
|
+ select 1
|
|
|
|
|
+ from `CRM_UI_MSGS` m
|
|
|
|
|
+ where m.`uiTargetName`=CONCAT('{$rootTableName}.', t.`ID`)
|
|
|
|
|
+ and m.`uiTargetType`='default_db_table_record'
|
|
|
|
|
+ and m.`A_STATUS` in('WAITING')
|
|
|
|
|
+ limit 1
|
|
|
|
|
+ ";
|
|
|
|
|
+ return " ({$sqlNewFltrMsgs})=1 ";
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public function parseSpecialFilterProblemy($type) {
|
|
|
|
|
+ DBG::log($type, 'string', "parse SpecialFilter Problemy");
|
|
|
|
|
+ switch ($type) {
|
|
|
|
|
+ case 'PROBLEM': return ['A_PROBLEM', '!=', ''];
|
|
|
|
|
+ case 'WARNING': return ['A_PROBLEM', '=', 'WARNING'];
|
|
|
|
|
+ case 'NORMAL': return ['A_PROBLEM', '=', 'NORMAL'];
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public function parseSpecialFilterStatus($type) {
|
|
|
|
|
+ DBG::log($type, 'string', "parse SpecialFilter Status");
|
|
|
|
|
+ switch ($type) {
|
|
|
|
|
+ case 'WAITING': return ['A_STATUS', '=', 'WAITING'];
|
|
|
|
|
+ case 'AKTYWNI': return ['A_STATUS', 'or', [ // `A_STATUS` in('NORMAL', 'WARNING') ";
|
|
|
|
|
+ ['A_STATUS', '=', 'NORMAL'],
|
|
|
|
|
+ ['A_STATUS', '=', 'WARNING'],
|
|
|
|
|
+ ] ];
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public function parseSpecialFilterSpotkania($type) {
|
|
|
|
|
+ DBG::log($type, 'string', "parse SpecialFilter Spotkania");
|
|
|
|
|
+ switch ($type) {
|
|
|
|
|
+ case 'OLD': return ['L_APPOITMENT_DATE', 'UNIX_TIMESTAMP_LESS_THAN_NOW'];
|
|
|
|
|
+ // COALESCE(UNIX_TIMESTAMP(t.`L_APPOITMENT_DATE`), 0) < UNIX_TIMESTAMP()
|
|
|
|
|
+ // and t.`L_APPOITMENT_DATE` != ''
|
|
|
|
|
+ // and t.`L_APPOITMENT_DATE` != '0000-00-00 00:00:00'
|
|
|
|
|
+ case 'NOW': return ['L_APPOITMENT_DATE', 'UNIX_TIMESTAMP_NOW_3600'];
|
|
|
|
|
+ // COALESCE(UNIX_TIMESTAMP(t.`L_APPOITMENT_DATE`), 0) < UNIX_TIMESTAMP()+3600
|
|
|
|
|
+ // and COALESCE(UNIX_TIMESTAMP(t.`L_APPOITMENT_DATE`), 0) > UNIX_TIMESTAMP()-3600
|
|
|
|
|
+ case 'TODAY': return ['L_APPOITMENT_DATE', 'and', [
|
|
|
|
|
+ ['L_APPOITMENT_DATE', 'UNIX_TIMESTAMP_GREATER_THAN', mktime(0,0,0, date("m"), date("d"), date("Y"))],
|
|
|
|
|
+ ['L_APPOITMENT_DATE', 'UNIX_TIMESTAMP_LESS_THAN', mktime(0,0,0, date("m"), date("d") + 1, date("Y"))],
|
|
|
|
|
+ ] ];
|
|
|
|
|
+ // $start = mktime(0,0,0, date("m"), date("d"), date("Y"));
|
|
|
|
|
+ // $end = mktime(0,0,0, date("m"), date("d") + 1, date("Y"));
|
|
|
|
|
+ // $sqlFltr = "
|
|
|
|
|
+ // COALESCE(UNIX_TIMESTAMP(t.`L_APPOITMENT_DATE`), 0) > '{$start}'
|
|
|
|
|
+ // and COALESCE(UNIX_TIMESTAMP(t.`L_APPOITMENT_DATE`), 0) < '{$end}'
|
|
|
|
|
+ // ";
|
|
|
|
|
+ case 'TOMORROW': return ['L_APPOITMENT_DATE', 'and', [
|
|
|
|
|
+ ['L_APPOITMENT_DATE', 'UNIX_TIMESTAMP_GREATER_THAN', mktime(0,0,0, date("m"), date("d") + 1, date("Y"))],
|
|
|
|
|
+ ['L_APPOITMENT_DATE', 'UNIX_TIMESTAMP_LESS_THAN', mktime(0,0,0, date("m"), date("d") + 2, date("Y"))],
|
|
|
|
|
+ ] ];
|
|
|
|
|
+ case 'YESTERDAY': return ['L_APPOITMENT_DATE', 'and', [
|
|
|
|
|
+ ['L_APPOITMENT_DATE', 'UNIX_TIMESTAMP_GREATER_THAN', mktime(0,0,0, date("m"), date("d") - 2, date("Y"))],
|
|
|
|
|
+ ['L_APPOITMENT_DATE', 'UNIX_TIMESTAMP_LESS_THAN', mktime(0,0,0, date("m"), date("d") - 1, date("Y"))],
|
|
|
|
|
+ ] ];
|
|
|
|
|
+ case 'BRAK': return ['L_APPOITMENT_DATE', 'or', [
|
|
|
|
|
+ ['L_APPOITMENT_DATE', '=', ''],
|
|
|
|
|
+ ['L_APPOITMENT_DATE', '=', '0000-00-00 00:00:00'],
|
|
|
|
|
+ ] ];
|
|
|
|
|
+ }
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ public function parseSpecialFilterAccess() {
|
|
|
|
|
+ $userLogin = User::getLogin();
|
|
|
|
|
+ $usrAclGroups = User::getLdapGroupsNames();
|
|
|
|
|
+ DBG::log(['login'=>$userLogin, 'groups'=>$usrAclGroups, 'acl'=>$this->_acl], 'array', "parse SpecialFilter Access");
|
|
|
|
|
+ $orWhere = [];
|
|
|
|
|
+ if ($this->_acl->hasField('A_ADM_COMPANY')) {
|
|
|
|
|
+ $orWhere[] = ['A_ADM_COMPANY', '=', ''];// TODO: allow empty for everyone?
|
|
|
|
|
+ foreach ($usrAclGroups as $group) $orWhere[] = ['A_ADM_COMPANY', '=', $group];
|
|
|
|
|
+ }
|
|
|
|
|
+ if ($this->_acl->hasField('A_CLASSIFIED')) {
|
|
|
|
|
+ $orWhere[] = ['A_CLASSIFIED', '=', ''];// TODO: allow empty for everyone?
|
|
|
|
|
+ foreach ($usrAclGroups as $group) $orWhere[] = ['A_CLASSIFIED', '=', $group];
|
|
|
|
|
+ }
|
|
|
|
|
+ if ($this->_acl->hasField('L_APPOITMENT_USER')) {
|
|
|
|
|
+ $orWhere[] = ['L_APPOITMENT_USER', '=', $userLogin];
|
|
|
|
|
+ }
|
|
|
|
|
+ return (!empty($orWhere)) ? [null, 'or', $orWhere] : null;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
public function getQuery() {
|
|
public function getQuery() {
|
|
|
if ($this->_query) return $this->_query;
|
|
if ($this->_query) return $this->_query;
|
|
|
// $ds = $this->_acl->getDataSource(); // TODO: only for TableAcl // TODO: move _parseSqlWhere to this class
|
|
// $ds = $this->_acl->getDataSource(); // TODO: only for TableAcl // TODO: move _parseSqlWhere to this class
|
|
@@ -138,21 +250,38 @@ class AclQueryFeatures {
|
|
|
->isInstance($filtrIsInstance)
|
|
->isInstance($filtrIsInstance)
|
|
|
->isNotInstance($filtrIsNotInstance);
|
|
->isNotInstance($filtrIsNotInstance);
|
|
|
// ->join($instanceTable, 'i', [ 'rawJoin' => "i.pk = t.{$sqlPrimaryKey} and i.idInstance = {$idInstance}" ])
|
|
// ->join($instanceTable, 'i', [ 'rawJoin' => "i.pk = t.{$sqlPrimaryKey} and i.idInstance = {$idInstance}" ])
|
|
|
- // $this->_query->where([
|
|
|
|
|
- // 'rawWhere' => $ds->_parseSqlWhere($params)
|
|
|
|
|
- // ]);
|
|
|
|
|
|
|
+ // $this->_query->where($ds->_parseSqlWhere($params))
|
|
|
|
|
+ DBG::log($this->_params, 'array', "\$this->_params");
|
|
|
foreach ($this->_params as $k => $v) {
|
|
foreach ($this->_params as $k => $v) {
|
|
|
if ('f_' === substr($k, 0, 2) && strlen($k) > 3) {
|
|
if ('f_' === substr($k, 0, 2) && strlen($k) > 3) {
|
|
|
$fieldName = substr($k, 2);
|
|
$fieldName = substr($k, 2);
|
|
|
$fieldType = $this->_acl->getXsdFieldType($fieldName);
|
|
$fieldType = $this->_acl->getXsdFieldType($fieldName);
|
|
|
list($comparisonSign, $value) = $this->parseQueryValue($fieldName, $v, $fieldType);
|
|
list($comparisonSign, $value) = $this->parseQueryValue($fieldName, $v, $fieldType);
|
|
|
- DBG::log([ $fieldName, $fieldType, $comparisonSign, $value ], 'array', "parseQueryValue");
|
|
|
|
|
- $this->_query->where($fieldName, $comparisonSign, $value);
|
|
|
|
|
|
|
+ DBG::log([ $fieldName, $comparisonSign, $value, $fieldType ], 'array', "parseQueryValue");
|
|
|
|
|
+ $this->_query->where([$fieldName, $comparisonSign, $value]);
|
|
|
} else if ('sf_' === substr($k, 0, 3) && strlen($k) > 4) {
|
|
} else if ('sf_' === substr($k, 0, 3) && strlen($k) > 4) {
|
|
|
|
|
+ switch (substr($k, 3)) {
|
|
|
|
|
+ case 'Msgs': $this->_query->where($this->parseSpecialFilterMsgs($v)); break;
|
|
|
|
|
+ case 'Problemy': $this->_query->where($this->parseSpecialFilterProblemy($v)); break;
|
|
|
|
|
+ case 'Status': $this->_query->where($this->parseSpecialFilterStatus($v)); break;
|
|
|
|
|
+ case 'Spotkania': $this->_query->where($this->parseSpecialFilterSpotkania($v)); break;
|
|
|
|
|
+ case 'Access': break; // SKIP - used below
|
|
|
|
|
+ default: throw new Exception("Not Implemented special filter '".substr($k, 3)."'");
|
|
|
|
|
+ }
|
|
|
} else if ('ogc:Filter' == $k) {
|
|
} else if ('ogc:Filter' == $k) {
|
|
|
|
|
+ throw new Exception("Not Implemented ogc:Filter");
|
|
|
} else if ('primaryKey' == $k) {
|
|
} else if ('primaryKey' == $k) {
|
|
|
|
|
+ $fieldName = $this->_acl->getPrimaryKeyField();
|
|
|
|
|
+ $fieldType = $this->_acl->getXsdFieldType($fieldName);
|
|
|
|
|
+ list($comparisonSign, $value) = $this->parseQueryValue($fieldName, $v, $fieldType);
|
|
|
|
|
+ DBG::log([ $fieldName, $comparisonSign, $value, $fieldType ], 'array', "parseQueryValue");
|
|
|
|
|
+ $this->_query->where([$fieldName, $comparisonSign, $value]);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ // sf_Access: if 'SHOW' then show all rows, but data with ***
|
|
|
|
|
+ if ('SHOW' !== V::get('sf_Access', '', $this->_params)) $this->_query->where($this->parseSpecialFilterAccess());
|
|
|
|
|
+
|
|
|
return $this->_query;
|
|
return $this->_query;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -169,7 +298,7 @@ class AclQueryFeatures {
|
|
|
public function getParam($key) { return V::get($key, '', $this->_params); }
|
|
public function getParam($key) { return V::get($key, '', $this->_params); }
|
|
|
|
|
|
|
|
public function getItems() {
|
|
public function getItems() {
|
|
|
- if ($this->_legacyMode) return $this->_acl->getTotal($this->_params);
|
|
|
|
|
|
|
+ if ($this->_legacyMode) return $this->_acl->getItems($this->_params);
|
|
|
// 'limit' => 10,
|
|
// 'limit' => 10,
|
|
|
// 'limitstart' => 0,
|
|
// 'limitstart' => 0,
|
|
|
// 'order_by' => 'ID',
|
|
// 'order_by' => 'ID',
|
|
@@ -188,7 +317,7 @@ class AclQueryFeatures {
|
|
|
DBG::log(['params' => $this->_params, 'sortBy' => $sortBy, 'limit' => $limit, 'offset' => $offset], 'array', '$this->_params');
|
|
DBG::log(['params' => $this->_params, 'sortBy' => $sortBy, 'limit' => $limit, 'offset' => $offset], 'array', '$this->_params');
|
|
|
return $this->getQuery()
|
|
return $this->getQuery()
|
|
|
->select([
|
|
->select([
|
|
|
- 'rawSelect' => $ds->_getSqlCols()
|
|
|
|
|
|
|
+ 'rawSelect' => $ds->_getSqlCols()
|
|
|
]) // TODO: fields
|
|
]) // TODO: fields
|
|
|
->select(!empty($this->_params['@instances']) ? '@instances' : null)
|
|
->select(!empty($this->_params['@instances']) ? '@instances' : null)
|
|
|
->limit($limit)
|
|
->limit($limit)
|