* SPDX-License-Identifier: AGPL-3.0-only
************************************/
/* crmv@57183 crmv@112297 crmv@114144 crmv@150751 */
require_once('modules/Settings/ProcessMaker/ProcessMakerUtils.php');
require_once('modules/Conditionals/ConditionalsVersioning.php');
class Conditionals extends CRMEntity{
var $permissions = array();
// crmv@124729
public $skipFields = array(
'Calendar' => array(
'date_start', 'time_start', 'due_date', 'time_end', 'recurringtype',
'duration_hours', 'duration_minutes', 'parent_id', 'notime', 'is_all_day_event',
'reminder_time', 'contact_id', 'ical_uuid', 'recurr_idx', 'exp_duration'
),
'Events' => array(
'date_start', 'time_start', 'due_date', 'time_end', 'recurringtype',
'duration_hours', 'duration_minutes', 'parent_id', 'notime', 'is_all_day_event',
'reminder_time', 'contact_id', 'ical_uuid', 'recurr_idx',
),
);
// crmv@124729e
function __construct() {
global $current_language;
$this->log = LoggerManager::getLogger('Conditionals');
}
// crmv@134058
function existsConditionalPermissions($module, $focus, &$fields = null) {
global $adb;
// get conditionals fields from sdk view
$sdk_fields = array();
$cache = RCache::getInstance();
$sdk_conditional_fields = $cache->get('sdk_conditional_fields');
if (!empty($sdk_conditional_fields)) {
foreach ($sdk_conditional_fields as $conditional_field) {
$sdk_fields[] = $conditional_field;
}
$sdk_fields = array_values(array_unique($sdk_fields));
}
// check Process Conditionals
$PMUtils = ProcessMakerUtils::getInstance();
$processConditionals = $PMUtils->getAllConditionals($focus->id);
if (!empty($processConditionals)) {
$fields = array();
if (is_array($processConditionals)) {
foreach ($processConditionals as $conditional) {
if ($conditional['conditions']) {
foreach ($conditional['conditions'] as $group) {
if ($group['conditions']) {
foreach ($group['conditions'] as $cond) {
if (stripos($cond['fieldname'],'ml') === 0) {
// skip table fields (ex. ml26)
} else {
$fields[] = $cond['fieldname'];
}
}
}
}
}
}
}
$fields = array_merge($fields,$sdk_fields); // add sdk view fields
$fields = array_values(array_unique($fields));
return true;
}
//crmv@118335
// check standard rules
$flds = $this->getConditionalFields($module, $focus);
if (is_array($flds) && count($flds) > 0) {
// extract fields
foreach ($flds as $fld) {
$fields[] = $fld['fieldname'];
}
$fields = array_merge($fields,$sdk_fields); // add sdk view fields
$fields = array_values(array_unique($fields));
return true;
}
//crmv@118335e
// check sdk view fields
if (!empty($sdk_fields)) {
$fields = $sdk_fields;
return true;
}
return false;
}
// crmv@134058e
//crmv@164165
function getCurrentUserGroups($userid) {
require('user_privileges/requireUserPrivileges.php'); // crmv@39110
if (empty($current_user_groups)) {
$userGroupFocus = new GetUserGroups();
$userGroupFocus->getAllUserGroups($current_user->id);
$current_user_groups = $userGroupFocus->user_groups;
}
return $current_user_groups;
}
//crmv@164165e
// crmv@172864
/**
* Return a list of roles used to search for the passed user
*/
protected function getMatchingRoles($userid) {
$UIU = UserInfoUtils::getInstance();
$roleid = $UIU->fetchUserRole($userid);
//costruisco le condizioni in base a ruolo, ruolo e subordinati,gruppi.
$conditions = array();
//ruolo:
$conditions[] = "roles::".$roleid;
//ruoli e subordinati:
$subordinates=getRoleAndSubordinatesInformation($roleid);
$parent_role=$subordinates[$roleid][1];
if (!is_array($parent_role)){
$parent_role = explode('::',$parent_role);
foreach ($parent_role as $parent_role_value){
$conditions[] = "rs::".$parent_role_value;
}
}
//gruppi:
$current_user_groups = $this->getCurrentUserGroups($userid); //crmv@164165
if (is_array($current_user_groups)){
foreach ($current_user_groups as $current_user_groups_value){
$conditions[] = "groups::".$current_user_groups_value;
}
}
//tutti:
$conditions[] = 'ALL';
return $conditions;
}
// crmv@172864e
function getAllRules($module, $tabid, $column_fields) {
global $adb, $table_prefix, $current_user;
// crmv@172565
static $resCache = array();
$key = $module.'_'.$current_user->roleid;
$res = $resCache[$key];
// crmv@172565e
if (!$res) {
$conditions = $this->getMatchingRoles($current_user->id); // crmv@173271
$vh_info = array(
'tbl_s_conditionals' => array('tbl_s_conditionals',''),
'tbl_s_conditionals_rules' => array('tbl_s_conditionals_rules', 'tbl_s_conditionals.ruleid = tbl_s_conditionals_rules.ruleid'),
'field' => array($table_prefix.'_field', $table_prefix.'_field.fieldid = tbl_s_conditionals.fieldid'),
);
if (!empty($column_fields['record_id'])) {
$PMUtils = ProcessMakerUtils::getInstance();
$cvh_id = $PMUtils->getSystemVersion4Record($column_fields['record_id'],array('conditionals','id'));
if (!empty($cvh_id)) {
$vh_info['tbl_s_conditionals'] = array('tbl_s_conditionals_vh','tbl_s_conditionals_vh.versionid = \''.$cvh_id.'\' and ');
$vh_info['tbl_s_conditionals_rules'] = array('tbl_s_conditionals_rules_vh', 'tbl_s_conditionals_vh.versionid = tbl_s_conditionals_rules_vh.versionid and tbl_s_conditionals_vh.ruleid = tbl_s_conditionals_rules_vh.ruleid');
$vh_info['field'] = array($table_prefix.'_field', $table_prefix.'_field.fieldid = tbl_s_conditionals_vh.fieldid');
}
$tvh_id = $PMUtils->getSystemVersion4Record($column_fields['record_id'],array('tabs',$module,'id'));
if (!empty($tvh_id)) {
$vh_info['field'] = array($table_prefix.'_field_vh', $table_prefix.'_field_vh.versionid = \''.$tvh_id.'\' and '.$table_prefix.'_field_vh.fieldid = '.$vh_info['tbl_s_conditionals'][0].'.fieldid');
}
}
$sql = "SELECT {$vh_info['tbl_s_conditionals_rules'][0]}.ruleid, {$vh_info['tbl_s_conditionals_rules'][0]}.chk_fieldname, {$vh_info['tbl_s_conditionals_rules'][0]}.chk_criteria_id, {$vh_info['tbl_s_conditionals_rules'][0]}.chk_field_value
FROM {$vh_info['tbl_s_conditionals'][0]}
LEFT JOIN {$vh_info['tbl_s_conditionals_rules'][0]} ON {$vh_info['tbl_s_conditionals_rules'][1]}
LEFT JOIN {$vh_info['field'][0]} ON {$vh_info['field'][1]}
WHERE {$vh_info['tbl_s_conditionals'][1]} {$vh_info['tbl_s_conditionals'][0]}.active = 1
and {$vh_info['field'][0]}.tabid = ?
and {$vh_info['field'][0]}.fieldname in (".generateQuestionMarks($column_fields).")
and {$vh_info['tbl_s_conditionals'][0]}.role_grp_check in (".generateQuestionMarks($conditions).")
group by {$vh_info['tbl_s_conditionals_rules'][0]}.ruleid, {$vh_info['tbl_s_conditionals_rules'][0]}.chk_fieldname, {$vh_info['tbl_s_conditionals_rules'][0]}.chk_criteria_id, {$vh_info['tbl_s_conditionals_rules'][0]}.chk_field_value
order by {$vh_info['tbl_s_conditionals_rules'][0]}.ruleid";
$params[] = $tabid;
$params[] = array_keys($column_fields);
$params[] = $conditions;
$res = $adb->pquery($sql,$params);
$resCache[$key] = $res; // crmv@172565
}
$res->MoveFirst();
return $res;
}
function Initialize($module='',$tabid='',&$column_fields=''){ //crmv@112297
global $adb, $table_prefix;
if ($module == '' && $tabid == '' && $column_fields == '') return;
// crmv@124729
// shitty calendar, die!!!
if ($module == 'Events') {
$module = 'Calendar';
$tabid = 9;
}
// crmv@124729e
$rule_check = false;
$rule_success = true;
$rules = array();
// priority to Process Conditionals
$PMUtils = ProcessMakerUtils::getInstance();
$processConditionals = $PMUtils->getAllConditionals($column_fields['record_id']);
if (!empty($processConditionals)) {
$this->permissions = $PMUtils->getConditionalPermissions($processConditionals,$column_fields);
} else {
// get standard rules
$conditional_permissions = array();
$res = $this->getAllRules($module, $tabid, $column_fields);
if ($res && $adb->num_rows($res)>0){
//per ogni regola controllo se le condizioni sono TUTTE soddisfatte
while ($row = $adb->fetchByAssoc($res,-1,false)){
if ($rule_check && $rule_check != $row['ruleid']){
if ($rule_success){
$rules[] = $rule_check;
}
$rule_success = true;
}
$rule_check = $row['ruleid'];
// crmv@129301
$fvalues = $this->getDisplayValue($module, $row['chk_fieldname'], $column_fields[$row['chk_fieldname']], $row['chk_field_value'], $column_fields['record_id']);
if (!$this->check_rule($row['chk_criteria_id'],$fvalues[0],$fvalues[1])){
$rule_success = false;
}
// crmv@129301e
}
if ($rule_success){
$rules[] = $rule_check;
}
}
if (!empty($rules)){
// crmv@124729
// extract the fields for that stupid calendar!
if ($module == 'Calendar') {
$tvh_id = $PMUtils->getSystemVersion4Record($record,array('tabs',$module,'id'));
if (!empty($tvh_id)) {
$query = "SELECT fieldid, fieldname FROM {$table_prefix}_field_vh WHERE versionid = ? and presence IN (0,2) AND tabid = ?";
$params = array($tvh_id, getTabid2('Events'));
} else {
$query = "SELECT fieldid, fieldname FROM {$table_prefix}_field WHERE presence IN (0,2) AND tabid = ?";
$params = array(getTabid2('Events'));
}
$res = $adb->pquery($query, $params);
$calFields = array();
while ($row = $adb->fetchByAssoc($res, -1, false)) {
$calFields[$row['fieldname']] = $row['fieldid'];
}
}
// crmv@124729e
$vh_info = array(
'tbl_s_conditionals' => array('tbl_s_conditionals',''),
'field' => array($table_prefix.'_field', 'tbl_s_conditionals.fieldid = '.$table_prefix.'_field.fieldid'),
);
if (!empty($column_fields['record_id'])) {
$PMUtils = ProcessMakerUtils::getInstance();
$cvh_id = $PMUtils->getSystemVersion4Record($column_fields['record_id'],array('conditionals','id'));
if (!empty($cvh_id)) {
$vh_info['tbl_s_conditionals'] = array('tbl_s_conditionals_vh','tbl_s_conditionals_vh.versionid = \''.$cvh_id.'\' and ');
$vh_info['field'] = array($table_prefix.'_field', $table_prefix.'_field.fieldid = tbl_s_conditionals_vh.fieldid');
}
$tvh_id = $PMUtils->getSystemVersion4Record($column_fields['record_id'],array('tabs',$module,'id'));
if (!empty($tvh_id)) {
$vh_info['field'] = array($table_prefix.'_field_vh', $table_prefix.'_field_vh.versionid = \''.$tvh_id.'\' and '.$table_prefix.'_field_vh.fieldid = '.$vh_info['tbl_s_conditionals'][0].'.fieldid');
}
}
$sql_permissions = "select {$vh_info['tbl_s_conditionals'][0]}.fieldid, {$vh_info['field'][0]}.fieldname, min(read_perm) as read_perm, min(write_perm) as write_perm, min(mandatory) as mandatory
from {$vh_info['tbl_s_conditionals'][0]}
inner join {$vh_info['field'][0]} on {$vh_info['field'][1]}
where {$vh_info['tbl_s_conditionals'][1]} ruleid in (".generateQuestionMarks($rules).") ";
// crmv@195054
if ($adb->isMssql()) {
$sql_permissions .= "group by {$vh_info['tbl_s_conditionals'][0]}.fieldid, {$vh_info['field'][0]}.fieldname";
} else {
$sql_permissions .= "group by fieldid";
}
// crmv@195054e
$res_permissions = $adb->pquery($sql_permissions,$rules);
if ($res_permissions && $adb->num_rows($res_permissions)>0){
$i = 0;
while ($row_permissions = $adb->fetchByAssoc($res_permissions,-1,false)){
$this->setFieldConditionalPermissions($row_permissions, $i, $row_permissions['fieldname'], $conditional_permissions);
$this->permissions[$row_permissions['fieldid']] = Array(
'f2fp_visible'=>$row_permissions['read_perm'],
'f2fp_editable'=>$row_permissions['write_perm'],
'f2fp_mandatory'=>$row_permissions['mandatory'],
);
// crmv@124729
if ($module == 'Calendar' && array_key_exists($row_permissions['fieldname'], $calFields)) {
$evId = $calFields[$row_permissions['fieldname']];
$this->permissions[$evId] = $this->permissions[$row_permissions['fieldid']];
}
// crmv@124729e
}
}
}
// set in request cache
$cache = RCache::getInstance();
$cache->set('conditional_permissions', $conditional_permissions);
}
}
// crmv@129301
// initial uitype support
// TODO: don't duplicate code, use all the code from edit/detail/list utils...
function getDisplayValue($module, $fieldname, $value, $checkValue, $record) {
static $uitypeCache = array();
if (!isset($uitypeCache[$module][$fieldname])) {
global $adb, $table_prefix;
$PMUtils = ProcessMakerUtils::getInstance();
$tvh_id = $PMUtils->getSystemVersion4Record($record,array('tabs',$module,'id'));
if (!empty($tvh_id)) {
$query = "select uitype from {$table_prefix}_field_vh where versionid = ? and tabid = ? and fieldname = ?";
$params = array($tvh_id, getTabid2($module), $fieldname);
} else {
$query = "select uitype from {$table_prefix}_field where tabid = ? and fieldname = ?";
$params = array(getTabid2($module), $fieldname);
}
$result = $adb->pquery($query, $params);
if ($result && $adb->num_rows($result) > 0) {
$uitypeCache[$module][$fieldname] = $adb->query_result($result,0,'uitype');
}
}
$uitype = $uitypeCache[$module][$fieldname];
if ($uitype == 10) {
if(!empty($value)) {
$parent_module = getSalesEntityType($value);
$displayValueArray = getEntityName($parent_module, $value);
if(!empty($displayValueArray)){
foreach($displayValueArray as $key=>$value){
$displayValue = $value;
}
}
}
$moduleFieldValue = $displayValue;
$chk_field_value = $checkValue;
} else {
// original conditional code... terrible, really!
$moduleFieldValue = getTranslatedString($value,$module);
$chk_field_value = getTranslatedString($checkValue,$module);
}
return array($moduleFieldValue, $chk_field_value);
}
// crmv@129301e
function setFieldConditionalPermissions($perm, $i, $fieldname, &$permissions) {
//if ($perm['FpovManaged'] == 1) {
if ($i == 0) {
$permissions[$fieldname]['readonly'] = 1;
$permissions[$fieldname]['mandatory'] = false;
}
if ($perm['read_perm'] == 1) {
if ($perm['write_perm'] == 1) {
$readonly = 1;
if ($perm['mandatory'] == 1) {
$permissions[$fieldname]['mandatory'] = true;
}
} else {
$readonly = 99;
}
} else {
$readonly = 100;
}
//crmv@103826
// the first conditional overwrite the standard permissions
// or if there are more conditionals verified set the most restrictive rule
if ($i == 0 || $readonly > $permissions[$fieldname]['readonly']) {
$permissions[$fieldname]['readonly'] = $readonly;
}
// TODO if ($perm['FpovValueActive'] == 1) $permissions[$fieldname]['value'] = $perm['FpovValueStr'];
//crmv@103826e
//}
}
function check_rule($criteriaID,$moduleFieldValue,$criteriaFieldValue){
$criteriaPassed = false;
switch ($criteriaID){
case 0:
// <=
$criteriaPassed = ($moduleFieldValue <= $criteriaFieldValue);
break;
case 1:
// <
$criteriaPassed = ($moduleFieldValue < $criteriaFieldValue);
break;
case 2:
// >=
$criteriaPassed = ($moduleFieldValue >= $criteriaFieldValue);
break;
case 3:
// >
$criteriaPassed = ($moduleFieldValue > $criteriaFieldValue);
break;
case 4:
// ==
$criteriaPassed = ($moduleFieldValue == $criteriaFieldValue);
break;
case 5:
// !=
$criteriaPassed = ($moduleFieldValue != $criteriaFieldValue);
break;
case 6:
// includes
$criteriaPassed = (stristr($moduleFieldValue, $criteriaFieldValue) !== false);
break;
}
return $criteriaPassed;
}
/**
* Invoked when special actions are performed on the module.
* @param String Module name
* @param String Event Type
*/
function vtlib_handler($moduleName, $eventType) {
require_once('include/utils/utils.php');
global $adb,$mod_strings,$table_prefix;
if($eventType == 'module.postinstall') {
// Mark the module as Standard module
$adb->pquery('UPDATE '.$table_prefix.'_tab SET customized=0 WHERE name=?', array($moduleName));
$blockid = getSettingsBlockId('LBL_STUDIO');
$fieldid = $adb->getUniqueID($table_prefix.'_settings_field');
// changed, to put it after the workflows
$sequence = 20;
$seq_res = $adb->pquery("SELECT sequence FROM {$table_prefix}_settings_field WHERE blockid = ? AND name = ?", array($blockid, 'LBL_LIST_WORKFLOWS'));
if ($adb->num_rows($seq_res) > 0) {
$cur_seq = intval($adb->query_result_no_html($seq_res, 0, 'sequence'));
// shift all the following ones
$adb->pquery("UPDATE {$table_prefix}_settings_field SET sequence = sequence + 1 WHERE blockid = ? AND sequence > ?", array($blockid, $cur_seq));
$sequence = $cur_seq+1;
}
$adb->pquery('INSERT INTO '.$table_prefix.'_settings_field(fieldid, blockid, name, iconpath, description, linkto, sequence)
VALUES (?,?,?,?,?,?,?)', array($fieldid, $blockid, 'LBL_COND_MANAGER', 'workflow.gif', 'LBL_COND_MANAGER_DESCRIPTION', 'index.php?module=Conditionals&action=index&parenttab=Settings', $sequence));
} else if($eventType == 'module.disabled') {
// TODO Handle actions when this module is disabled.
} else if($eventType == 'module.enabled') {
// TODO Handle actions when this module is enabled.
} else if($eventType == 'module.preuninstall') {
// TODO Handle actions when this module is about to be deleted.
} else if($eventType == 'module.preupdate') {
// TODO Handle actions before this module is updated.
} else if($eventType == 'module.postupdate') {
// TODO Handle actions after this module is updated.
}
}
function getTransitionConditionalWorkflowModulesList() {
global $adb;
foreach (com_vtGetModules($adb) as $key=>$value){
$modules_list[] = Array($key,$key);
}
return $modules_list;
}
function we_checkUserRoleGrp($userobj,$roleGrpCheck) {
if($roleGrpCheck == 'ALL') return true;
$conditions = explode("::",$roleGrpCheck);
switch($conditions[0]) {
case 'roles':
return ($userobj->roleid == $conditions[1]);
break;
case 'rs':
//crmv@18354
$subordinates=getRoleAndSubordinatesInformation($userobj->roleid);
$parent_role=$subordinates[$userobj->roleid][1];
$parent_rol_arr=explode('::',$parent_role);
if(in_array($conditions[1],$parent_rol_arr)) return true;
//crmv@18354e
break;
case 'groups':
$current_user_groups = $this->getCurrentUserGroups($userobj->id); //crmv@164165
if(sizeof($current_user_groups) > 0)
{
foreach ($current_user_groups as $grpid)
{
if($grpid == $conditions[1]) return true;
}
}
return false;
break;
default:
//@todo - gestione errori
return true;
}
return true;
}
function we_checkCriteria($criteriaID,$moduleFieldValue,$criteriaFieldValue,$roleGrpCheck="ALL") {
global $current_user;
$criteriaPassed = false;
switch ($criteriaID)
{
case 0:
// <=
$criteriaPassed = ($moduleFieldValue <= $criteriaFieldValue) && $this->we_checkUserRoleGrp($current_user,$roleGrpCheck);
break;
case 1:
// <
$criteriaPassed = ($moduleFieldValue < $criteriaFieldValue) && $this->we_checkUserRoleGrp($current_user,$roleGrpCheck);
break;
case 2:
// >=
$criteriaPassed = ($moduleFieldValue >= $criteriaFieldValue) && $this->we_checkUserRoleGrp($current_user,$roleGrpCheck);
break;
case 3:
// >
$criteriaPassed = ($moduleFieldValue > $criteriaFieldValue) && $this->we_checkUserRoleGrp($current_user,$roleGrpCheck);
break;
case 4:
// ==
$criteriaPassed = ($moduleFieldValue == $criteriaFieldValue) && $this->we_checkUserRoleGrp($current_user,$roleGrpCheck);
break;
case 5:
// !=
$criteriaPassed = ($moduleFieldValue != $criteriaFieldValue) && $this->we_checkUserRoleGrp($current_user,$roleGrpCheck);
break;
case 6:
// includes
$criteriaPassed = (stristr($moduleFieldValue, $criteriaFieldValue) !== false) && $this->we_checkUserRoleGrp($current_user,$roleGrpCheck);
break;
}
return $criteriaPassed;
}
function _wui_check_rules($result,$fieldid,$module,$column_fields) {
global $adb;
if($result && $adb->num_rows($result)>0) {
$num_rows = $adb->num_rows($result);
for ($k = 0; $k < $num_rows; $k++) {
$chk_fieldname = $adb->query_result($result, $k, 'chk_fieldname');
$chk_criteria_id = $adb->query_result($result, $k, 'chk_criteria_id');
$chk_field_value = $adb->query_result($result, $k, 'chk_field_value');
$chk_role_grp = $adb->query_result($result, $k, 'role_grp_check');
if(array_key_exists($chk_fieldname,$column_fields)) {
$moduleFieldValue = $column_fields["$chk_fieldname"];
//crmv@9960
$moduleFieldValue = getTranslatedString($moduleFieldValue);
$chk_field_value = getTranslatedString($chk_field_value);
//crmv@9960e
if($this->we_checkCriteria($chk_criteria_id,$moduleFieldValue,$chk_field_value,$chk_role_grp)) {
// if ($fieldid == '804')
// echo "CONTINUO IL CICLO: $chk_fieldname $chk_criteria_id $chk_field_value
";
continue;
}
else {
// if ($fieldid == '804')
// echo "ESCO: $chk_fieldname $chk_criteria_id $chk_field_value
";
return null;
}
}
}
$read_perm = $adb->query_result($result, 0, 'read_perm');
$write_perm = $adb->query_result($result, 0, 'write_perm');
$mandatory_perm = $adb->query_result($result, 0, 'mandatory');
if($write_perm == 1) $read_perm = 1;
// if ($fieldid == '825')
// print_r(Array('f2fp_visible'=>$read_perm,'f2fp_editable'=>$write_perm,'f2fp_mandatory'=>$mandatory_perm));
return Array('f2fp_visible'=>$read_perm,'f2fp_editable'=>$write_perm,'f2fp_mandatory'=>$mandatory_perm);
}
return null; // no rules defined - calles need to check null value
}
function wui_get_FieldPermissionsOnFieldValue($fieldid,$module,$column_fields) {
global $adb,$current_user,$table_prefix;
require('user_privileges/requireUserPrivileges.php'); // crmv@39110
require('user_privileges/sharing_privileges_'.$current_user->id.'.php');
$vh_info = array(
'tbl_s_conditionals' => array('tbl_s_conditionals',''),
'tbl_s_conditionals_rules' => array('tbl_s_conditionals_rules','tbl_s_conditionals.ruleid = tbl_s_conditionals_rules.ruleid'),
'field' => array($table_prefix.'_field', $table_prefix.'_field.fieldid = tbl_s_conditionals.fieldid'),
);
if (!empty($column_fields['record_id'])) {
$PMUtils = ProcessMakerUtils::getInstance();
$cvh_id = $PMUtils->getSystemVersion4Record($column_fields['record_id'],array('conditionals','id'));
if (!empty($cvh_id)) {
$vh_info['tbl_s_conditionals'] = array('tbl_s_conditionals_vh','tbl_s_conditionals_vh.versionid = \''.$cvh_id.'\' and ');
$vh_info['tbl_s_conditionals_rules'] = array('tbl_s_conditionals_rules_vh','tbl_s_conditionals_vh.versionid = tbl_s_conditionals_rules_vh.versionid and tbl_s_conditionals_vh.ruleid = tbl_s_conditionals_rules_vh.ruleid');
$vh_info['field'] = array($table_prefix.'_field', $table_prefix.'_field.fieldid = tbl_s_conditionals_vh.fieldid');
}
$tvh_id = $PMUtils->getSystemVersion4Record($column_fields['record_id'],array('tabs',$module,'id'));
if (!empty($tvh_id)) {
$vh_info['field'] = array($table_prefix.'_field_vh', $table_prefix.'_field_vh.versionid = \''.$tvh_id.'\' and '.$table_prefix.'_field_vh.fieldid = '.$vh_info['tbl_s_conditionals'][0].'.fieldid');
}
}
$q = "SELECT DISTINCT ruleid
FROM {$vh_info['tbl_s_conditionals'][0]}
INNER JOIN {$vh_info['field'][0]} ON {$vh_info['field'][1]}
INNER JOIN ".$table_prefix."_tab ON ".$table_prefix."_field.tabid = ".$table_prefix."_tab.tabid
WHERE {$vh_info['tbl_s_conditionals'][1]} ".$table_prefix."_tab.name = '$module'";
$res = $adb->query($q);
$rules_returned = array();
if ($res && $adb->num_rows($res) > 0)
while($row=$adb->fetchByAssoc($res,-1,false)){
$fix_query = "SELECT chk_fieldname,chk_criteria_id,chk_field_value,read_perm,write_perm,mandatory,role_grp_check
FROM {$vh_info['tbl_s_conditionals'][0]}
LEFT JOIN {$vh_info['tbl_s_conditionals_rules'][0]} ON {$vh_info['tbl_s_conditionals_rules'][1]}
WHERE {$vh_info['tbl_s_conditionals'][1]} {$vh_info['tbl_s_conditionals'][0]}.ruleid = ".$row['ruleid'];
// check rules fro roleandsubordinates
$parnet_role_array = explode("::",$current_user_parent_role_seq);
for($r=0;$rquery($query);
$rules = $this->_wui_check_rules($result,$fieldid,$module,$column_fields);
if($rules != null) break;
}
if($rules != null) {
if ($rules['f2fp_visible'] == 1)
$rules_returned['f2fp_visible'] = 1;
elseif ($rules_returned['f2fp_visible'] != 1)
$rules_returned['f2fp_visible'] = 0;
if ($rules['f2fp_editable'] == 1)
$rules_returned['f2fp_editable'] = 1;
elseif ($rules_returned['f2fp_editable'] != 1)
$rules_returned['f2fp_editable'] = 0;
if ($rules['f2fp_mandatory'] == 1)
$rules_returned['f2fp_mandatory'] = 1;
elseif ($rules_returned['f2fp_mandatory'] != 1)
$rules_returned['f2fp_mandatory'] = 0;
}
// no rules then check for role
$query = $fix_query." and active = 1 and fieldid = $fieldid and role_grp_check = 'roles::".$current_user->roleid."' order by sequence asc";
$result = $adb->query($query);
$rules = $this->_wui_check_rules($result,$fieldid,$module,$column_fields);
if($rules != null) {
if ($rules['f2fp_visible'] == 1)
$rules_returned['f2fp_visible'] = 1;
elseif ($rules_returned['f2fp_visible'] != 1)
$rules_returned['f2fp_visible'] = 0;
if ($rules['f2fp_editable'] == 1)
$rules_returned['f2fp_editable'] = 1;
elseif ($rules_returned['f2fp_editable'] != 1)
$rules_returned['f2fp_editable'] = 0;
if ($rules['f2fp_mandatory'] == 1)
$rules_returned['f2fp_mandatory'] = 1;
elseif ($rules_returned['f2fp_mandatory'] != 1)
$rules_returned['f2fp_mandatory'] = 0;
}
// no rules then check for groups
$user_groups = new GetUserGroups();
$user_groups->getAllUserGroups($current_user->id);
for($g=0;$guser_groups);$g++) {
$query = $fix_query." and active = 1 and fieldid = $fieldid and role_grp_check = 'groups::". $user_groups->user_groups[$g]."' order by sequence asc";
$result = $adb->query($query);
$rules = $this->_wui_check_rules($result,$fieldid,$module,$column_fields);
if($rules != null) break;
}
if($rules != null) {
if ($rules['f2fp_visible'] == 1)
$rules_returned['f2fp_visible'] = 1;
elseif ($rules_returned['f2fp_visible'] != 1)
$rules_returned['f2fp_visible'] = 0;
if ($rules['f2fp_editable'] == 1)
$rules_returned['f2fp_editable'] = 1;
elseif ($rules_returned['f2fp_editable'] != 1)
$rules_returned['f2fp_editable'] = 0;
if ($rules['f2fp_mandatory'] == 1)
$rules_returned['f2fp_mandatory'] = 1;
elseif ($rules_returned['f2fp_mandatory'] != 1)
$rules_returned['f2fp_mandatory'] = 0;
}
// no rules -> check rules for all ------------------------------------------------------------------------------------------
if($rules == null) {
$query = $fix_query." and active = 1 and fieldid = $fieldid and role_grp_check = 'ALL' order by sequence asc";
$result = $adb->query($query);
$rules = $this->_wui_check_rules($result,$fieldid,$module,$column_fields);
}
if($rules != null) {
if ($rules['f2fp_visible'] == 1)
$rules_returned['f2fp_visible'] = 1;
elseif ($rules_returned['f2fp_visible'] != 1)
$rules_returned['f2fp_visible'] = 0;
if ($rules['f2fp_editable'] == 1)
$rules_returned['f2fp_editable'] = 1;
elseif ($rules_returned['f2fp_editable'] != 1)
$rules_returned['f2fp_editable'] = 0;
if ($rules['f2fp_mandatory'] == 1)
$rules_returned['f2fp_mandatory'] = 1;
elseif ($rules_returned['f2fp_mandatory'] != 1)
$rules_returned['f2fp_mandatory'] = 0;
}
}
return $rules_returned;
}
//------------------------------------------------------------------
function wui_getFpofvListViewHeader() {
global $currentModule;
$header = Array("","LBL_FPOFV_RULE_NAME","LBL_MODULE","","","","","","","","FpofvChkRoleGroup","LBL_ACTION");
for($i=0;$iquery($query);
$ret_val = Array();
if($result && $adb->num_rows($result)>0) {
$num_rows = $adb->num_rows($result);
for ($k = 0; $k < $num_rows; $k++) {
$ret_val[$k][1] = $adb->query_result($result, $k, 'description');
// crmv@126317
$module = $adb->query_result($result, $k, 'name');
$ret_val[$k][2] = getTranslatedString($module, $module);
// crmv@126317e
$role_grp_check = $adb->query_result($result, $k, 'role_grp_check');
if($role_grp_check == "ALL")
$role_grp_string = $mod_strings['NO_CONDITIONS'];
$rolefound = false;
foreach($roleDetails as $roleid=>$rolename)
{
if('roles::'.$roleid == $role_grp_check) {
$role_grp_string = $mod_strings['LBL_ROLES']."::".$rolename[0];
$rolefound = true;
break;
}
}
if(!$rolefound)
foreach($roleDetails as $roleid=>$rolename)
{
if('rs::'.$roleid == $role_grp_check) {
$role_grp_string = $mod_strings['LBL_ROLES_SUBORDINATES']."::".$rolename[0];
$rolefound = true;
break;
}
}
if(!$rolefound)
foreach($grpDetails as $groupid=>$groupname)
{
if('groups::'.$groupid == $role_grp_check) {
$role_grp_string = $mod_strings['LBL_GROUP']."::".$groupname;
$rolefound = true;
break;
}
}
$ret_val[$k][12] = $role_grp_string;
$ruleid = $adb->query_result($result, $k, 'ruleid');
// crmv@77249
if ($_REQUEST['included'] == true) {
$params = array(
'included' => 'true',
'skip_vte_header' => 'true',
'skip_footer' => 'true',
'formodule' => $_REQUEST['formodule']
);
$otherParams = "&".http_build_query($params);
}
// crmv@77249e
$edit_lnk = "".$app_strings['LNK_EDIT']."";
$del_lnk = "".$app_strings['LNK_DELETE']."";
$ret_val[$k][13] = $edit_lnk." | ".$del_lnk;
}
}
return $ret_val;
}
function getRulesInfo($ruleid) {
global $adb,$table_prefix;
$info = array();
$res = $adb->query("SELECT
tbl_s_conditionals.*,
name as tablabel
FROM tbl_s_conditionals
INNER JOIN ".$table_prefix."_field ON ".$table_prefix."_field.fieldid = tbl_s_conditionals.fieldid
INNER JOIN ".$table_prefix."_tab ON ".$table_prefix."_field.tabid = ".$table_prefix."_tab.tabid
where ruleid = $ruleid");
$info = $adb->fetchByAssoc($res,-1,false);
$res = $adb->query("select chk_fieldname,chk_criteria_id,chk_field_value
from tbl_s_conditionals_rules
where ruleid = $ruleid");
while($row=$adb->fetchByAssoc($res,-1,false)) {
$info['rules'][] = $row;
}
return $info;
}
function wui_getFpofvData($ruleid='',$module) {
global $adb,$mod_strings,$table_prefix;
if ($ruleid == '') $ruleid = 0;
$tabid = getTabid($module);
// crmv@124729
$params = array();
$excludeSql = '';
if (!empty($this->skipFields[$module])) {
$params = array_merge($params, $this->skipFields[$module]);
$excludeSql = " AND {$table_prefix}_field.fieldname NOT IN (".generateQuestionMarks($this->skipFields[$module]).")";
}
$query = "select
tbl2.fieldid,
tbl2.fieldname,
tbl2.name as module,
tbl2.fieldlabel,
tbl2.uitype,
".$adb->database->IfNull('read_perm',0)." as read_perm,
".$adb->database->IfNull('write_perm',0)." as write_perm,
".$adb->database->IfNull('mandatory',0)." as mandatory,
tbl2.sequence,
1 as active,
".$adb->database->IfNull('managed',0)." as managed,
".$table_prefix."_blocks.blocklabel as blocklabel
from (
select
tbl_s_conditionals.* ,
".$table_prefix."_tab.name,
".$table_prefix."_field.fieldlabel,
".$table_prefix."_field.fieldname,
1 as managed
from tbl_s_conditionals
inner join ".$table_prefix."_field on tbl_s_conditionals.fieldid = ".$table_prefix."_field.fieldid
inner join ".$table_prefix."_tab on ".$table_prefix."_field .tabid = ".$table_prefix."_tab.tabid
where
ruleid = $ruleid
) tbl1
right outer join (
select ".$table_prefix."_field.*, ".$table_prefix."_tab.name
from ".$table_prefix."_field
inner join ".$table_prefix."_tab on ".$table_prefix."_field .tabid = ".$table_prefix."_tab.tabid
where ".$table_prefix."_field.tabid = $tabid $excludeSql
) tbl2 on tbl1.fieldid = tbl2.fieldid
inner join ".$table_prefix."_blocks on tbl2.block = ".$table_prefix."_blocks.blockid
order by ".$table_prefix."_blocks.sequence, tbl2.sequence";
$result = $adb->pquery($query, $params);
// crmv@124729e
$ret_val = Array();
if($result) {
for($i=0;$i<$adb->num_rows($result);$i++) {
//crmv@115268
$uitype = $adb->query_result($result,$i,'uitype');
$HideFpovValue = false;
$HideFpovManaged = false;
$HideFpovReadPermission = false;
$HideFpovWritePermission = false;
$HideFpovMandatoryPermission = false;
if ($uitype == 220) {
$HideFpovValue = true;
// crmv@190916 removed code
}
$ret_val[] = array(
'FpofvFieldid' => $adb->query_result($result, $i, 'fieldid'),
'ModuleField' => $adb->query_result($result, $i, 'chk_fieldname'),
'Module' => $adb->query_result($result, $i, 'module'),
'FpovReadPermission' => $adb->query_result($result, $i, 'read_perm'),
'FpovWritePermission' => $adb->query_result($result, $i, 'write_perm'),
'FpovManaged' => $adb->query_result($result, $i, 'managed'),
'FpovMandatoryPermission' => $adb->query_result($result, $i, 'mandatory'),
'FpofvSequence' => $adb->query_result($result, $i, 'sequence'),
'FpofvActive' => $adb->query_result($result, $i, 'active'),
'FpofvBlockLabel' => $adb->query_result($result, $i, 'blocklabel'),
'FpofvChkFieldLabel' => $adb->query_result($result, $i, 'fieldlabel'),
'FpofvChkFieldName' => $adb->query_result($result, $i, 'fieldname'),
'uitype' => $uitype, //crmv@112297 in future add here the columns of the table here
'HideFpovValue'=>$HideFpovValue,
'HideFpovManaged'=>$HideFpovManaged,
'HideFpovReadPermission'=>$HideFpovReadPermission,
'HideFpovWritePermission'=>$HideFpovWritePermission,
'HideFpovMandatoryPermission'=>$HideFpovMandatoryPermission,
);
//crmv@115268e
}
return $ret_val;
}
return null;
}
function wui_getCriteriaLabel($criteriaID) {
global $mod_strings;
switch ($criteriaID)
{
case 0:
return $mod_strings['LBL_CRITERIA_VALUE_LESS_EQUAL'];
// <=
break;
case 1:
// <
return $mod_strings['LBL_CRITERIA_VALUE_LESS_THAN'];
break;
case 2:
// >=
return $mod_strings['LBL_CRITERIA_VALUE_MORE_EQUAL'];
break;
case 3:
// >
return $mod_strings['LBL_CRITERIA_VALUE_MORE_THAN'];
break;
case 4:
// ==
return $mod_strings['LBL_CRITERIA_VALUE_EQUAL'];
break;
case 5:
// !=
return $mod_strings['LBL_CRITERIA_VALUE_NOT_EQUAL'];
break;
case 6:
// includes
return $mod_strings['LBL_CRITERIA_VALUE_INCLUDES'];
break;
}
return $criteriaID;
}
//------------------------------------------------------------------------------------------------
//crmv@101719
// TODO add versioning support
function getStatusBlockRules($module='',$column_fields=''){
global $current_language, $adb, $current_user, $table_prefix;
if ($module == '' && $column_fields == '' ) return;
$rules=array();
$tabid=getTabid($module);
$conditions = $this->getMatchingRoles($current_user->id); // crmv@173271
$sql = "SELECT tbl_s_conditionals_rules.ruleid,
tbl_s_conditionals_rules.chk_fieldname,
tbl_s_conditionals_rules.chk_criteria_id,
tbl_s_conditionals_rules.chk_field_value
FROM tbl_s_conditionals
LEFT JOIN tbl_s_conditionals_rules ON tbl_s_conditionals.ruleid = tbl_s_conditionals_rules.ruleid
left join ".$table_prefix."_field ON (".$table_prefix."_field.fieldid = tbl_s_conditionals.fieldid OR tbl_s_conditionals_rules.chk_fieldname = ".$table_prefix."_field.fieldname)
WHERE tbl_s_conditionals.active = 1
and ".$table_prefix."_field.tabid = ?
and ".$table_prefix."_field.fieldname in (".generateQuestionMarks($column_fields).")
and tbl_s_conditionals.role_grp_check in (".generateQuestionMarks($conditions).")
group by tbl_s_conditionals_rules.ruleid,
tbl_s_conditionals_rules.chk_fieldname,
tbl_s_conditionals_rules.chk_criteria_id,
tbl_s_conditionals_rules.chk_field_value order by tbl_s_conditionals_rules.ruleid";
$params[] = $tabid;
$params[] = array_keys($column_fields);
$params[] = $conditions;
$res = $adb->pquery($sql,$params);
$rule_check = false;
$rule_success = true;
if ($res && $adb->num_rows($res)>0){
//per ogni regola controllo se le condizioni sono TUTTE soddisfatte
while ($row = $adb->fetchByAssoc($res,-1,false)){
if ($rule_check && $rule_check != $row['ruleid']){
if ($rule_success){
$rules[] = $rule_check;
}
$rule_success = true;
}
$rule_check = $row['ruleid'];
$moduleFieldValue = getTranslatedString($column_fields[$row['chk_fieldname']],$module);
$chk_field_value = getTranslatedString($row['chk_field_value'],$module);
if (!$this->check_rule($row['chk_criteria_id'],$moduleFieldValue,$chk_field_value)){
$rule_success = false;
}
}
if ($rule_success){
$rules[] = $rule_check;
}
}
return $rules;
}
//crmv@101719e
// TODO add versioning support
function wui_sql_restric_status_on_mandatory_fields($vteobj,$module,$fieldname,$status,$rule2check=array()) { //crmv@101719
global $adb,$table_prefix;
$ret_val[0] = false;
$tabid = getTabid($module);
$status = getTranslatedString($status,$module); //crmv@9960 //crmv@17935
$params = array();
$query = "SELECT ".$table_prefix."_field.fieldname AS module_fieldname,
".$table_prefix."_field.fieldlabel AS module_fieldlabel,
".$table_prefix."_field.uitype AS field_uitype,
".$table_prefix."_field.typeofdata AS field_typeofdata,
tbl_s_conditionals_rules.*
FROM tbl_s_conditionals
INNER JOIN ".$table_prefix."_field ON ".$table_prefix."_field.fieldid = tbl_s_conditionals.fieldid
INNER JOIN tbl_s_conditionals_rules on tbl_s_conditionals_rules.ruleid = tbl_s_conditionals.ruleid
WHERE chk_fieldname = '".$fieldname."' and chk_field_value = '".$status."' and mandatory = 1";
//crmv@101719
if(!empty($rule2check)){
$query .= " and tbl_s_conditionals.ruleid in (".generateQuestionMarks($rule2check).")";
array_push($params,$rule2check);
}
//crmv@101719e
//@todo - vincolare la query al profilo
$index = 1;
$result = $adb->pquery($query,$params); //crmv@101719
if($result && $adb->num_rows($result)>0) {
$num_rows = $adb->num_rows($result);
for ($k = 0; $k < $num_rows; $k++) {
$module_fieldname = $adb->query_result($result, $k, 'module_fieldname');
$module_fieldlabel = $adb->query_result($result, $k, 'module_fieldlabel');
$chk_fieldname = $adb->query_result($result, $k, 'chk_fieldname');
$chk_criteria_id = $adb->query_result($result, $k, 'chk_criteria_id');
$chk_field_value = $adb->query_result($result, $k, 'chk_field_value');
$chk_role_grp = $adb->query_result($result, $k, 'role_grp_check');
$field_uitype = $adb->query_result($result, $k, 'field_uitype');
$field_typeofdata = $adb->query_result($result, $k, 'field_typeofdata');
if(array_key_exists($chk_fieldname,$vteobj->column_fields)) {
$moduleFieldValue = $vteobj->column_fields["$chk_fieldname"];
//crmv@9960 //crmv@17935
$moduleFieldValue = getTranslatedString($moduleFieldValue,$module);
$chk_field_value = getTranslatedString($chk_field_value,$module);
//crmv@9960e //crmv@17935e
if($this->we_checkCriteria($chk_criteria_id,$moduleFieldValue,$chk_field_value,$chk_role_grp)) {
if ($this->check_value_field($vteobj->column_fields[$module_fieldname],$field_typeofdata,$field_uitype)) {} //crmv@17935
else {
$ret_val[0] = true;
$ret_val[$index] = Array($module_fieldname,$module_fieldlabel);
$index++;
}
}
}
}
}
return $ret_val;
}
function check_value_field($value,$typeofdata,$uitype){
$type_arr = explode("~",$typeofdata);
$typeofdata = $type_arr[0];
if (in_array($uitype,Array(10,53))){
if ($value == '0'){
$value = '';
}
}
//crmv@17935
if (in_array($typeofdata,Array('N','I')))
if (ceil($value) == 0) return false;
if (in_array($uitype,Array(15,16,111)))
if (in_array(trim($value),array('--Nessuno--','--None--','--nd--'))) return false;
if ($value == '')
return false;
//crmv@17935e
return true;
}
//performance_conditiona_listview - i
function wui_get_FieldPermissionsOnFieldValueFields($module,$column_fields,$conditional_fieldid) {
$rules = Array();
foreach($conditional_fieldid as $fieldid) {
$rules[$fieldid] = $this->wui_get_FieldPermissionsOnFieldValue($fieldid,$module,$column_fields);
}
return $rules;
}
/**
* Get the fields used as conditions for the passed module
*/
//crmv@18039 crmv@118335
function getConditionalFields($module, $focus='') {
global $adb,$table_prefix;
static $cache = array();
if (!empty($focus->id) && isset($cache[$focus->id])) {
return $cache[$focus->id];
} else {
$vh_info = array(
'field' => array($table_prefix.'_field'),
'tab' => array($table_prefix.'_tab', $table_prefix.'_field.tabid = '.$table_prefix.'_tab.tabid', $table_prefix.'_tab.name = ?', array($module)),
'tbl_s_conditionals_rules' => array('tbl_s_conditionals_rules', $table_prefix.'_field.fieldname = tbl_s_conditionals_rules.chk_fieldname',$table_prefix.'_tab.name = tbl_s_conditionals_rules.module'), // crmv@167285
);
if (!empty($focus->id)) {
$PMUtils = ProcessMakerUtils::getInstance();
$tvh_id = $PMUtils->getSystemVersion4Record($focus->id,array('tabs',$module,'id'));
if (!empty($tvh_id)) {
$vh_info['field'] = array($table_prefix.'_field_vh');
$vh_info['tab'] = array($table_prefix.'_tab_vh', $table_prefix.'_field_vh.versionid = '.$table_prefix.'_tab_vh.versionid and '.$table_prefix.'_field_vh.tabid = '.$table_prefix.'_tab_vh.tabid', $table_prefix.'_tab_vh.versionid = ? and '.$table_prefix.'_tab_vh.name = ?', array($tvh_id,$module));
$vh_info['tbl_s_conditionals_rules'] = array('tbl_s_conditionals_rules', $table_prefix.'_field_vh.fieldname = tbl_s_conditionals_rules.chk_fieldname',$table_prefix.'_tab_vh.name = tbl_s_conditionals_rules.module'); // crmv@167285
}
$cvh_id = $PMUtils->getSystemVersion4Record($focus->id,array('conditionals','id'));
if (!empty($cvh_id)) {
$vh_info['tbl_s_conditionals_rules'] = array('tbl_s_conditionals_rules_vh', 'tbl_s_conditionals_rules_vh.versionid = \''.$cvh_id.'\' and '.$vh_info['field'][0].'.fieldname = tbl_s_conditionals_rules_vh.chk_fieldname');
}
}
$query = "SELECT DISTINCT {$vh_info['field'][0]}.tablename, {$vh_info['field'][0]}.columnname, {$vh_info['field'][0]}.fieldname, {$vh_info['field'][0]}.fieldlabel
FROM {$vh_info['field'][0]}
INNER JOIN {$vh_info['tbl_s_conditionals_rules'][0]} ON {$vh_info['tbl_s_conditionals_rules'][1]}
INNER JOIN {$vh_info['tab'][0]} ON {$vh_info['tab'][1]}
WHERE {$vh_info['tab'][2]} "; // crmv@167285 crmv@180777
// crmv@180777
if (isset($vh_info['tbl_s_conditionals_rules'][2]) && !empty($vh_info['tbl_s_conditionals_rules'][2])) {
$query .= " AND {$vh_info['tbl_s_conditionals_rules'][2]} ";
}
// crmv@180777e
$result = $adb->pquery($query, $vh_info['tab'][3]);
$ret_arr = false;
while($row=$adb->fetchByAssoc($result,-1,false)){
$ret_arr[] = $row;
}
if (!empty($focus->id)) $cache[$focus->id] = $ret_arr;
return $ret_arr;
}
}
//crmv@18039e crmv@118335e
//performance_conditiona_listview - e
// crmv@173271
/**
* Get the id of the conditional given its name
*/
public function getIdByName($name) {
global $adb, $table_prefix;
$res = $adb->limitpQuery("SELECT ruleid FROM tbl_s_conditionals WHERE description = ?", 0, 1, array($name));
if ($res && $adb->num_rows($res) > 0) {
return $adb->query_result_no_html($res, 0, 'ruleid');
}
return null;
}
/**
* Get id of conditionals for the given module
*/
public function getIdsForModule($module) {
global $adb, $table_prefix;
$list = array();
$res = $adb->pquery(
"SELECT DISTINCT cr.ruleid
FROM tbl_s_conditionals_rules cr
INNER JOIN tbl_s_conditionals c ON c.ruleid = cr.ruleid
WHERE cr.module = ?",
array($module)
);
if ($res && $adb->num_rows($res) > 0) {
while ($row = $adb->fetchByAssoc($res, -1, false)) {
$list[] = $row['ruleid'];
}
}
return $list;
}
/**
* Get id of conditionals for the given module
*/
public function getIdsForModuleAndUser($module, $userid) {
global $adb, $table_prefix;
$list = array();
$roles = $this->getMatchingRoles($userid);
$res = $adb->pquery(
"SELECT DISTINCT cr.ruleid
FROM tbl_s_conditionals_rules cr
INNER JOIN tbl_s_conditionals c ON c.ruleid = cr.ruleid
WHERE cr.module = ? AND c.role_grp_check IN (".generateQuestionMarks($roles).")",
array($module, $roles)
);
if ($res && $adb->num_rows($res) > 0) {
while ($row = $adb->fetchByAssoc($res, -1, false)) {
$list[] = $row['ruleid'];
}
}
return $list;
}
/**
* Return a conditional rule in the format:
* array(
'name' => 'Name of conditional',
'module' => 'Contacts',
'roles' => 'roles::H1',
'conditions' => array(
array('fieldname' => 'FIELDNAME', 'criteria' => 4, 'value' => 'VALUE'),
...
),
'fields' => array(
'FIELDNAME' => array('read' => false, 'write' => false, 'mandatory' => false),
...
),
*/
public function getConditional($ruleid) {
global $adb, $table_prefix;
$conditional = array();
$first = true;
$res = $adb->pquery("SELECT * FROM tbl_s_conditionals_rules WHERE ruleid = ? ORDER BY id ASC", array($ruleid));
if ($res && $adb->num_rows($res) > 0) {
while ($row = $adb->fetchByAssoc($res, -1, false)) {
if ($first) {
$conditional['module'] = $row['module'];
$first = false;
}
if (!is_array($conditional['conditions'])) $conditional['conditions'] = array();
$conditional['conditions'][] = array(
'fieldname' => $row['chk_fieldname'],
'criteria' => $row['chk_criteria_id'],
'value' => $row['chk_field_value'],
);
}
} else {
return false;
}
$first = true;
$res = $adb->pquery(
"SELECT c.*, f.fieldname FROM tbl_s_conditionals c
INNER JOIN {$table_prefix}_field f ON f.fieldid = c.fieldid
WHERE ruleid = ? ORDER BY c.sequence ASC",
array($ruleid)
);
if ($res && $adb->num_rows($res) > 0) {
while ($row = $adb->fetchByAssoc($res, -1, false)) {
if ($first) {
$conditional['name'] = $row['description'];
$conditional['roles'] = $row['role_grp_check'];
$first = false;
}
if (!is_array($conditional['fields'])) $conditional['fields'] = array();
$conditional['fields'][$row['fieldname']] = array(
'read' => (bool)$row['read_perm'],
'write' => (bool)$row['write_perm'],
'mandatory' => (bool)$row['mandatory'],
);
}
}
return $conditional;
}
/**
* Delete a conditional rule by id
*/
public function deleteConditional($ruleid) {
global $adb, $table_prefix;
$adb->pquery("DELETE FROM tbl_s_conditionals WHERE ruleid = ?", array($ruleid));
$adb->pquery("DELETE FROM tbl_s_conditionals_rules WHERE ruleid = ?", array($ruleid));
}
/**
* Create or update a conditional rule
* The structure is the same as the one returned by getConditional
*/
public function saveConditional($ruleid, $conditional) {
global $adb, $table_prefix;
if ($ruleid > 0) {
$mode = '';
// update is implemented as delete + create
$this->deleteConditional($ruleid);
} else {
$mode = 'edit';
$ruleid = $adb->getUniqueID('tbl_s_conditionals');
// get the original name before updating, needed for the logs
$result = $adb->pquery("SELECT description FROM tbl_s_conditionals WHERE ruleid = ?", array($ruleid));
if ($result && $adb->num_rows($result) > 0) $savedRuleName = $adb->query_result_no_html($result,0,'description');
}
$inserts = array();
$insertRules = array();
// get field ids
$fieldids = array();
$tabid = getTabid($conditional['module']);
$fieldnames = array_keys($conditional['fields']);
$res = $adb->pquery("SELECT fieldname, fieldid FROM {$table_prefix}_field WHERE tabid = ? AND fieldname IN (".generateQuestionMarks($fieldnames).")", array($tabid, $fieldnames));
while ($row = $adb->FetchByAssoc($res, -1, false)) {
$fieldids[$row['fieldname']] = $row['fieldid'];
}
foreach ($conditional['fields'] as $fieldname => $fieldinfo) {
$fieldid = $fieldids[$fieldname];
// WTF is this for?
$max_result = $adb->pquery("SELECT MAX(sequence) + 1 AS sequence FROM tbl_s_conditionals WHERE fieldid = ?", array($fieldid));
$seq = (int)$adb->query_result_no_html($max_result,0,'sequence');
$inserts[] = array(
$ruleid,
$fieldid,
$seq,
1,
$conditional['name'],
intval($fieldinfo['read']),
intval($fieldinfo['write']),
intval($fieldinfo['mandatory']),
$conditional['roles'],
);
}
foreach ($conditional['conditions'] as $cond) {
$ruleid_rule = $adb->getUniqueID('tbl_s_conditionals_rules');
$insertRules[] = array(
$ruleid_rule,
$ruleid,
$cond['fieldname'],
$cond['criteria'],
$cond['value'],
$conditional['module']
);
}
// do bulk inserts
$adb->startTransaction();
$cols = array('ruleid','fieldid','sequence','active','description','read_perm','write_perm','mandatory','role_grp_check');
$adb->bulkInsert('tbl_s_conditionals', $cols, $inserts);
$cols = array('id','ruleid','chk_fieldname','chk_criteria_id','chk_field_value','module');
$adb->bulkInsert('tbl_s_conditionals_rules', $cols, $insertRules);
$adb->completeTransaction();
// and save the log
$this->saveLogs($mode, $ruleid, $conditional, $savedRuleName);
return $ruleid;
}
protected function saveLogs($mode, $ruleid, $conditional, $savedRuleName = '') {
global $metaLogs;
$versioning = ConditionalsVersioning::getInstance();
$condName = $conditional['name'];
if ($mode == '') {
if (count($conditional['fields']) > 0) {
if ($metaLogs) $metaLogId = $metaLogs->log($metaLogs::OPERATION_ADDCONDITIONAL, $ruleid, array('rulename'=>$condName));
if (!empty($metaLogId)) $versioning->versionOperation($metaLogId);
}
} else {
if ($condName != $savedRuleName) {
if ($metaLogs) $metaLogId = $metaLogs->log($metaLogs::OPERATION_RENAMECONDITIONAL, $ruleid, array('rulename'=>$savedRuleName,'new_rulename'=>$condName));
if (!empty($metaLogId)) $versioning->versionOperation($metaLogId);
}
if ($metaLogs) $metaLogId = $metaLogs->log($metaLogs::OPERATION_EDITCONDITIONAL, $ruleid, array('rulename'=>$condName));
if (!empty($metaLogId)) $versioning->versionOperation($metaLogId);
}
}
// crmv@173271e
}