/** * Used by the dependency manager to pre-load all the related fields required * to load an entire view. */ public function action_getRelatedValues() { /** @var LoggerManager */ global $log; $ret = array(); if (empty($_REQUEST['tmodule']) || empty($_REQUEST['fields'])) { return; } $fields = json_decode(html_entity_decode($_REQUEST['fields']), true); if (!is_array($fields)) { $log->fatal('"fields" is not a valid JSON string'); $this->display($ret); return; } $module = $_REQUEST['tmodule']; $id = empty($_REQUEST['record_id']) ? null : $_REQUEST['record_id']; $focus = BeanFactory::retrieveBean($module, $id); if (!$focus) { $log->fatal('Unable to load bean'); $this->display($ret); return; } foreach ($fields as $rfDef) { if (!isset($rfDef['link'], $rfDef['type'])) { $log->fatal('At least one of "link" and "type" attributes is not specified'); continue; } $link = $rfDef['link']; $type = $rfDef['type']; if (!isset($ret[$link])) { $ret[$link] = array(); } if (empty($ret[$link][$type])) { $ret[$link][$type] = array(); } switch ($type) { //The Related function is used for pulling a sing field from a related record case "related": if (!isset($rfDef['relate'])) { $log->fatal('"relate" attribute of related expression is not specified'); break; } //Default it to a blank value $ret[$link]['related'][$rfDef['relate']] = ""; //If we have neither a focus id nor a related record id, we can't retrieve anything if (!empty($id) || !empty($rfDef['relId'])) { $relBean = null; if (empty($rfDef['relId']) || empty($rfDef['relModule'])) { //If the relationship is invalid, just move onto another field if (!$focus->load_relationship($link)) { break; } $beans = $focus->{$link}->getBeans(array("enforce_teams" => true)); //No related beans means no value if (empty($beans)) { break; } //Grab the first bean on the list reset($beans); $relBean = current($beans); } else { $relBean = BeanFactory::getBean($rfDef['relModule'], $rfDef['relId']); } //If we found a bean and the current user has access to the related field, grab a value from it if (!empty($relBean) && ACLField::hasAccess($rfDef['relate'], $relBean->module_dir, $GLOBALS['current_user']->id, true)) { $validFields = FormulaHelper::cleanFields($relBean->field_defs, false, true, true); if (isset($validFields[$rfDef['relate']])) { $ret[$link]['relId'] = $relBean->id; $ret[$link]['related'][$rfDef['relate']] = FormulaHelper::getFieldValue($relBean, $rfDef['relate']); } } } break; case "count": if (!empty($id) && $focus->load_relationship($link)) { $ret[$link][$type] = count($focus->{$link}->get()); } else { $ret[$link][$type] = 0; } break; case "rollupSum": case "rollupAve": case "rollupMin": case "rollupMax": //If we are going to calculate one rollup, calculate all the rollups since there is so little cost if (!isset($rfDef['relate'])) { $log->fatal('"relate" attribute of rollup expression is not specified'); break; } $rField = $rfDef['relate']; if (!empty($id) && $focus->load_relationship($link)) { $relBeans = $focus->{$link}->getBeans(array("enforce_teams" => true)); $sum = 0; $count = 0; $min = false; $max = false; if (!empty($relBeans)) { //Check if the related record vardef has banned this field from formulas $relBean = reset($relBeans); $validFields = FormulaHelper::cleanFields($relBean->field_defs, false, true, true); if (!isset($validFields[$rField])) { break; } } foreach ($relBeans as $bean) { if (isset($bean->{$rField}) && is_numeric($bean->{$rField}) && ACLField::hasAccess($rField, $bean->module_dir, $GLOBALS['current_user']->id, true)) { $count++; $sum += floatval($bean->{$rField}); if ($min === false || $bean->{$rField} < $min) { $min = floatval($bean->{$rField}); } if ($max === false || $bean->{$rField} > $max) { $max = floatval($bean->{$rField}); } } } if ($type == "rollupSum") { $ret[$link][$type][$rField] = $sum; } if ($type == "rollupAve") { $ret[$link][$type][$rField] = $count == 0 ? 0 : $sum / $count; } if ($type == "rollupMin") { $ret[$link][$type][$rField] = $min; } if ($type == "rollupMax") { $ret[$link][$type][$rField] = $max; } } else { $ret[$link][$type][$rField] = 0; } break; } } $this->display($ret); }
/** * Used by the dependency manager to pre-load all the related fields required * to load an entire view. */ public function getRelatedValues($api, $args) { if (empty($args['module']) || empty($args['fields'])) { return; } $fields = json_decode(html_entity_decode($args['fields']), true); $focus = $this->loadBean($api, $args); $ret = array(); foreach ($fields as $rfDef) { if (!isset($rfDef['link']) || !isset($rfDef['type'])) { continue; } $link = $rfDef['link']; $type = $rfDef['type']; $rField = ''; if (!isset($ret[$link])) { $ret[$link] = array(); } if (empty($ret[$link][$type])) { $ret[$link][$type] = array(); } // count formulas don't have a relate attribute if (isset($rfDef['relate'])) { $rField = $rfDef['relate']; } switch ($type) { //The Related function is used for pulling a sing field from a related record case "related": //Default it to a blank value $ret[$link]['related'][$rfDef['relate']] = ""; //If we have neither a focus id nor a related record id, we can't retrieve anything $relBean = null; if (empty($rfDef['relId']) || empty($rfDef['relModule'])) { //If the relationship is invalid, just move onto another field if (!$focus->load_relationship($link)) { break; } $beans = $focus->{$link}->getBeans(array("enforce_teams" => true)); //No related beans means no value if (empty($beans)) { break; } //Grab the first bean on the list reset($beans); $relBean = current($beans); } else { $relBean = BeanFactory::getBean($rfDef['relModule'], $rfDef['relId']); } //If we found a bean and the current user has access to the related field, grab a value from it if (!empty($relBean) && ACLField::hasAccess($rfDef['relate'], $relBean->module_dir, $GLOBALS['current_user']->id, true)) { $validFields = FormulaHelper::cleanFields($relBean->field_defs, false, true, true); if (isset($validFields[$rfDef['relate']])) { $ret[$link]['relId'] = $relBean->id; $ret[$link]['related'][$rfDef['relate']] = FormulaHelper::getFieldValue($relBean, $rfDef['relate']); } } break; case "count": if ($focus->load_relationship($link)) { $ret[$link][$type] = count($focus->{$link}->get()); } else { $ret[$link][$type] = 0; } break; case "rollupSum": case "rollupAve": case "rollupMin": case "rollupMax": //If we are going to calculate one rollup, calculate all the rollups since there is so little cost if ($focus->load_relationship($link)) { $relBeans = $focus->{$link}->getBeans(array("enforce_teams" => true)); $sum = 0; $count = 0; $min = false; $max = false; if (!empty($relBeans)) { //Check if the related record vardef has banned this field from formulas $relBean = reset($relBeans); $validFields = FormulaHelper::cleanFields($relBean->field_defs, false, true, true); if (!isset($validFields[$rField])) { $ret[$link][$type][$rField] = 0; break; } } foreach ($relBeans as $bean) { if (isset($bean->{$rField}) && is_numeric($bean->{$rField}) && ACLField::hasAccess($rField, $bean->module_dir, $GLOBALS['current_user']->id, true)) { $count++; $sum += floatval($bean->{$rField}); if ($min === false || $bean->{$rField} < $min) { $min = floatval($bean->{$rField}); } if ($max === false || $bean->{$rField} > $max) { $max = floatval($bean->{$rField}); } } } if ($type == "rollupSum") { $ret[$link][$type][$rField] = $sum; } if ($type == "rollupAve") { $ret[$link][$type][$rField] = $count == 0 ? 0 : $sum / $count; } if ($type == "rollupMin") { $ret[$link][$type][$rField] = $min; } if ($type == "rollupMax") { $ret[$link][$type][$rField] = $max; } } else { $ret[$link][$type][$rField] = 0; } break; case "rollupCurrencySum": $ret[$link][$type][$rField] = 0; if ($focus->load_relationship($link)) { $toRate = isset($focus->base_rate) ? $focus->base_rate : null; $relBeans = $focus->{$link}->getBeans(array("enforce_teams" => true)); $sum = 0; foreach ($relBeans as $bean) { if (!empty($bean->{$rField}) && is_numeric($bean->{$rField}) && ACLField::hasAccess($rField, $bean->module_dir, $GLOBALS['current_user']->id, true)) { $sum = SugarMath::init($sum)->add(SugarCurrency::convertWithRate($bean->{$rField}, $bean->base_rate, $toRate))->result(); } } $ret[$link][$type][$rField] = $sum; } break; } } return $ret; }