public static function getCrmTableRelatedFields($reportModule, $bean, $fieldsToBeRemoved, $translateFieldLabels, &$relateField, $mainRelatedKey) { global $current_user, $app_list_strings; $primaryKey = "id"; $rsFields = self::getModuleResultSetFields($reportModule, $bean->table_name, $relateField, $fieldsToBeRemoved); $allowedModules = asol_ReportsUtils::getCurrentUserAvailableModules(false); $value = $rsFields[0]; $keys = array(); $fields_relationship = array(); $fields_relationship_labels = array(); $fields = array(); $fields_labels = array(); $fields_type = array(); $fields_enum_operators = array(); $fields_enum_references = array(); $has_index = array(); $has_related = array(); $explodedField = explode(".", $value['Field']); $currentField = count($explodedField) == 2 ? $explodedField[1] : $value['Field']; $fieldInfo = asol_Report::getFieldInfoFromVardefs($reportModule, $currentField); if ($currentField == $primaryKey) { // CRM RelationShips $k = $j = 0; $rshr = self::getModuleRelationShips($reportModule, $currentField); if (count($rshr) > 0) { while ($j < count($rshr)) { $relatedModule = $rshr[$j]['lhs_module']; if (isset($allowedModules[$relatedModule]) && $allowedModules[$relatedModule] || $current_user->is_admin) { $relatedObject = BeanFactory::newBean($relatedModule); $relatedTable = $rshr[$j]['lhs_table']; $rsrf = self::getModuleResultSetFields($relatedModule, $relatedTable, null, $fieldsToBeRemoved); foreach ($rsrf as $val) { $explodedRelatedField = explode(".", $val['Field']); $currentRelatedField = count($explodedRelatedField) == 2 ? $explodedRelatedField[1] : $val['Field']; $fieldInfo = asol_Report::getFieldInfoFromVardefs($rshr[$j]['lhs_module'], $currentRelatedField); $fields[$k] = count(explode(".", $val['Field'])) == 1 ? $relatedTable . "." . $val['Field'] : $val['Field']; $fields_labels[$k] = $translateFieldLabels ? self::getTranslatedRelatedField($relatedModule, $relatedTable, $currentRelatedField, $fieldInfo['fieldLabel']) : $fields[$k]; $fields_relationship[$k] = $rshr[$j]['relationship_name']; $fields_relationship_labels[$k] = $translateFieldLabels ? asol_Report::getRelationShipLabelFromVardefs($rshr[$j]['main_module'], $fields_relationship[$k]) : $fields_relationship[$k]; $fields_enum_operators[$k] = $fieldInfo['enumOperator']; $fields_enum_references[$k] = $fieldInfo['enumReference']; $fields_type[$k] = self::getFieldType($val['Type'], $fieldInfo['values'], $fieldInfo['fieldType']); $info = asol_Report::getReportsRelatedFields($relatedObject, $currentRelatedField); $infoIdName = !empty($info['id_name']) ? $info['id_name'] : ""; if ($currentRelatedField == $primaryKey) { $rsrhr = self::getModuleRelationShips($relatedModule, $val['Field']); $has_related[$k] = count($rsrhr) > 0 || $val['Type'] == "relate" ? "true" : "false"; } else { if ($infoIdName == $currentRelatedField) { $fields_type[$k] = "relate"; $has_related[$k] = isset($allowedModules[$info['module']]) && $allowedModules[$info['module']] || $current_user->is_admin ? "true" : "false"; } else { $has_related[$k] = "false"; } } $has_index[$k] = false; $keys[$k] = $primaryKey . " " . $fields_relationship[$k]; $keys[$k] = !empty($mainRelatedKey) ? $mainRelatedKey . ';' . $keys[$k] : $keys[$k]; $k++; } } $j++; } $relateField = $keys; } else { $relatedTable = BeanFactory::newBean(BeanFactory::getObjectName($value['RelateModule']))->table_name; $relatedTable = empty($relatedTable) ? strtolower($value['RelateModule']) : $relatedTable; $rsrf = self::getModuleResultSetFields($value['RelateModule'], $relatedTable, null, $fieldsToBeRemoved); foreach ($rsrf as $val) { $fields[$k] = $relatedTable . "." . $val['Field']; $fields_labels[$k] = $relatedTable . "." . $val['Field']; $fieldInfo = asol_Report::getFieldInfoFromVardefs($value['RelateModule'], $val['Field']); $fields_enum_operators[$k] = $fieldInfo['enumOperator']; $fields_enum_references[$k] = $fieldInfo['enumReference']; $fields_type[$k] = self::getFieldType($val['Type'], $fieldInfo['values'], $fieldInfo['fieldType']); $has_related[$k] = "false"; $has_index[$k] = false; $k++; } $j++; } } else { // CRM Relate Fields //***********************// //***AlineaSol Premium***// //***********************// $extraParams = array('database' => '-1', 'restricted' => true); $definedAvailableRelates = asol_ReportsUtils::managePremiumFeature("reportRelatesManagement", "reportFunctions.php", "getReportDefinedAvailableRelates", $extraParams); $isVirtualLink = $definedAvailableRelates !== false ? isset($definedAvailableRelates[$reportModule][$currentField]) ? true : false : false; //***********************// //***AlineaSol Premium***// //***********************// if ($isVirtualLink) { $relatedModule = $definedAvailableRelates[$reportModule][$currentField]['relationModule']; } else { $relatedInfo = asol_Report::getReportsRelatedFields($bean, $currentField); $relatedModule = $relatedInfo['module']; } if (isset($allowedModules[$relatedModule]) && $allowedModules[$relatedModule] || $current_user->is_admin) { $relatedObject = BeanFactory::newBean($relatedModule); $relatedTable = is_object($relatedObject) ? $relatedObject->table_name : strtolower($relatedModule); $relateField = !empty($mainRelatedKey) ? $mainRelatedKey . ';' . $relateField : $relateField; $rsrf = self::getModuleResultSetFields($relatedModule, $relatedTable, null, $fieldsToBeRemoved); $k = 0; foreach ($rsrf as $val) { $explodedRelatedField = explode(".", $val['Field']); $currentRelatedField = count($explodedRelatedField) == 2 ? $explodedRelatedField[1] : $val['Field']; $fieldInfo = asol_Report::getFieldInfoFromVardefs($relatedModule, $currentRelatedField); $fields[$k] = count(explode(".", $val['Field'])) == 1 ? $relatedTable . "." . $val['Field'] : $val['Field']; $fields_labels[$k] = $translateFieldLabels ? self::getTranslatedRelatedField($relatedModule, $relatedTable, $currentRelatedField, $fieldInfo['fieldLabel']) : $fields[$k]; $fields_relationship[$k] = $relatedModule; $fields_relationship_labels[$k] = !empty($app_list_strings['moduleList'][$relatedModule]) ? $app_list_strings['moduleList'][$relatedModule] : $relatedTable; $fields_enum_operators[$k] = $fieldInfo['enumOperator']; $fields_enum_references[$k] = $fieldInfo['enumReference']; $fields_type[$k] = self::getFieldType($val['Type'], $fieldInfo['values'], $fieldInfo['fieldType']); $info = asol_Report::getReportsRelatedFields($relatedObject, $currentRelatedField); $infoIdName = !empty($info['id_name']) ? $info['id_name'] : ""; if ($currentRelatedField == $primaryKey) { $rsrhr = self::getModuleRelationShips($relatedModule, $val['Field']); $has_related[$k] = count($rsrhr) > 0 || $val['Type'] == "relate" ? "true" : "false"; } else { //***********************// //***AlineaSol Premium***// //***********************// $isVirtualLink = $definedAvailableRelates !== false ? isset($definedAvailableRelates[$relatedModule][$currentRelatedField]) ? true : false : false; //***********************// //***AlineaSol Premium***// //***********************// if ($infoIdName == $currentRelatedField || $isVirtualLink) { $fields_type[$k] = "relate"; $has_related[$k] = isset($allowedModules[$info['module']]) && $allowedModules[$info['module']] || $current_user->is_admin ? "true" : "false"; } else { $has_related[$k] = "false"; } } $has_index[$k] = false; $k++; } } } return array('fields' => $fields, 'fields_labels' => $fields_labels, 'fields_relationship' => $fields_relationship, 'fields_relationship_labels' => $fields_relationship_labels, 'fields_type' => $fields_type, 'fields_enum_operators' => $fields_enum_operators, 'fields_enum_references' => $fields_enum_references, 'has_index' => $has_index, 'has_related' => $has_related); }
private static function getJoinsFromSqlVariables($textWithVars, $currentDoJoin, $currentDoCountJoin, $alternativeDb, $reportModule, $reportTable, &$joinVariables, &$reportTableCustomJoin, &$processedJoinsFromSqlKeys) { $sqlFormulaJoins = ""; $isNonCrmDatabase = $alternativeDb !== false ? true : false; $beanItems = asol_ReportsUtils::getItemVariables($textWithVars); foreach ($beanItems as $beanItem) { if ($beanItem['item'] == '${this}') { continue; } $beanField = null; $tmpBeanItem = substr(substr($beanItem['item'], 2), 0, -1); $beanValues = explode("->", $tmpBeanItem); $beanValues = count($beanValues) == 1 ? explode("->", $tmpBeanItem) : $beanValues; if (count($beanValues) == 2) { if ($beanValues[0] == "bean_cstm") { $reportTableCustomJoin = true; } } else { if (count($beanValues) == 3) { $usedModules = explode("::", $beanValues[0]); $usedKeys = explode("::", $beanValues[1]); $mainFieldKey = $usedKeys[0]; foreach ($usedModules as $usedIndex => $usedModule) { if ($isNonCrmDatabase) { if (isset($processedJoinsFromSqlKeys[$usedModule])) { $relatedLinkKey = $processedJoinsFromSqlKeys[$usedModule]; } else { $mainPK = asol_Report::getSelectionResults("SHOW KEYS FROM " . $usedModule . " WHERE Key_name = 'PRIMARY'", null, true, $alternativeDb); $relatedLinkKey = $processedJoinsFromSqlKeys[$usedModule] = $mainPK[0]['Column_name']; } $mainTable = $usedIndex >= 1 ? $usedModules[$usedIndex - 1] : $reportTable; $mainKey = $usedKeys[$usedIndex]; $relatedTable = $usedModule; $relatedKey = $relatedLinkKey; $parentKey = $usedIndex >= 1 ? $usedKeys[$usedIndex - 1] : null; $joinTable = null; $isMainCustom = false; $isRelatedCustom = false; } else { $bean = BeanFactory::newBean($usedModule); $relatedInfo = asol_Report::getReportsRelatedFields($bean, $usedKeys[$usedIndex]); if (isset($processedJoinsFromSqlKeys[$usedModules[$usedIndex - 1]])) { $previousTable = $processedJoinsFromSqlKeys[$usedModules[$usedIndex - 1]]; } else { $previousTable = $processedJoinsFromSqlKeys[$usedModules[$usedIndex - 1]] = BeanFactory::newBean(BeanFactory::getObjectName($usedModules[$usedIndex - 1]))->table_name; } if (isset($processedJoinsFromSqlKeys[$usedModule])) { $currentTable = $processedJoinsFromSqlKeys[$usedModule]; } else { $currentTable = $processedJoinsFromSqlKeys[$usedModule] = BeanFactory::newBean($usedModule)->table_name; } $mainTable = $usedIndex >= 1 ? $previousTable : $reportTable; $mainKey = $usedKeys[$usedIndex]; $relatedTable = $currentTable; $relatedKey = 'id'; $parentKey = $usedIndex >= 1 ? $usedKeys[$usedIndex - 1] : null; $joinTable = null; $isMainCustom = isset($relatedInfo['custom_module']); $isRelatedCustom = $isCustomTable; } $storedKey = $mainKey . '.' . $relatedTable; $hasRelatedCustom = $joinVariables[$mainFieldKey][$usedIndex][$storedKey]['isRelatedCustom']; if (!empty($mainKey) && $hasRelatedCustom !== true) { $currentDoJoin = $currentDoJoin || $joinVariables[$mainFieldKey][$usedIndex][$storedKey]['doJoin']; $currentDoCountJoin = $currentDoCountJoin || $joinVariables[$mainFieldKey][$usedIndex][$storedKey]['doCountJoin']; $joinVariables[$mainFieldKey][$usedIndex][$storedKey] = array('mainTable' => $mainTable, 'mainKey' => $mainKey, 'relatedTable' => $relatedTable, 'relatedKey' => $relatedKey, 'parentKey' => $parentKey, 'joinTable' => $joinTable, 'isMainCustom' => $isMainCustom, 'isRelatedCustom' => $isRelatedCustom, 'avoidAlias' => false, 'doJoin' => $currentDoJoin, 'doCountJoin' => $currentDoCountJoin); } } } } } }