Files
crm.clientright.ru/modules/Reports/ReportUtils.php
Fedor ac7467f0b4 Major CRM updates: AI Assistant, Court Status API, S3 integration improvements, and extensive file storage system
- Added comprehensive AI Assistant system (aiassist/ directory):
  * Vector search and embedding capabilities
  * Typebot proxy integration
  * Elastic search functionality
  * Message classification and chat history
  * MCP proxy for external integrations

- Implemented Court Status API (GetCourtStatus.php):
  * Real-time court document status checking
  * Integration with external court systems
  * Comprehensive error handling and logging

- Enhanced S3 integration:
  * Improved file backup system with metadata
  * Batch processing capabilities
  * Enhanced error logging and recovery
  * Copy operations with URL fixing

- Added Telegram contact creation API
- Improved error logging across all modules
- Enhanced callback system for AI responses
- Extensive backup file storage with timestamps
- Updated documentation and README files

- File storage improvements:
  * Thousands of backup files with proper metadata
  * Fix operations for broken file references
  * Project-specific backup and recovery systems
  * Comprehensive file integrity checking

Total: 26,461+ files added/modified including AWS SDK, vendor dependencies, and extensive backup system.
2025-10-16 11:17:21 +03:00

365 lines
14 KiB
PHP

<?php
/*+*******************************************************************************
* The contents of this file are subject to the vtiger CRM Public License Version 1.0
* ("License"); You may not use this file except in compliance with the License
* The Original Code is: vtiger CRM Open Source
* The Initial Developer of the Original Code is vtiger.
* Portions created by vtiger are Copyright (C) vtiger.
* All Rights Reserved.
******************************************************************************** */
/**
* Function to get the field information from module name and field label
*/
function getFieldByReportLabel($module, $label, $mode = 'label') {
$cacheLabel = VTCacheUtils::getReportFieldByLabel($module, $label);
if($cacheLabel) return $cacheLabel;
// this is required so the internal cache is populated or reused.
getColumnFields($module);
//lookup all the accessible fields
$cachedModuleFields = VTCacheUtils::lookupFieldInfo_Module($module);
$label = decode_html($label);
if($module == 'Calendar') {
$cachedEventsFields = VTCacheUtils::lookupFieldInfo_Module('Events');
if ($cachedEventsFields) {
if(empty($cachedModuleFields)) $cachedModuleFields = $cachedEventsFields;
else $cachedModuleFields = array_merge($cachedModuleFields, $cachedEventsFields);
}
if($label == 'Start_Date_and_Time') {
$label = 'Start_Date_&_Time';
}
}
if(empty($cachedModuleFields)) {
return null;
}
foreach ($cachedModuleFields as $fieldInfo) {
if($mode == 'name') {
$fieldLabel = $fieldInfo['fieldname'];
} else {
$fieldLabel = str_replace(' ', '_', $fieldInfo['fieldlabel']);
}
$fieldLabel = decode_html($fieldLabel);
//SalesPlatform.ru begin fix get field info by label
if($label == $fieldLabel || $label == getTranslatedString($fieldLabel, $module)) {
//if($label == $fieldLabel) {
//SalesPlatform.ru end
VTCacheUtils::setReportFieldByLabel($module, $label, $fieldInfo);
return $fieldInfo;
}
}
return null;
}
function isReferenceUIType($uitype) {
static $options = array('101', '116', '117', '26', '357',
'50', '51', '52', '53', '57', '58', '59', '66', '68',
'73', '75', '76', '77', '78', '80', '81'
);
if(in_array($uitype, $options)) {
return true;
}
return false;
}
function IsDateField($reportColDetails) {
//SalesPlatform.ru begin
//list($tablename, $colname, $module_field, $fieldname, $typeOfData) = split(":", $reportColDetails);
list($tablename, $colname, $module_field, $fieldname, $typeOfData) = explode(":", $reportColDetails);
//SalesPlatform.ru end
if ($typeOfData == "D") {
return true;
} else {
return false;
}
}
/**
*
* @global Users $current_user
* @param ReportRun $report
* @param Array $picklistArray
* @param ADOFieldObject $dbField
* @param Array $valueArray
* @param String $fieldName
* @return String
*/
function getReportFieldValue ($report, $picklistArray, $dbField, $valueArray, $fieldName, $operation = false) {
global $current_user, $default_charset;
$db = PearDatabase::getInstance();
$value = $valueArray[$fieldName];
$fld_type = $dbField->type;
list($module, $fieldLabel) = explode('_', $dbField->name, 2);
$fieldInfo = getFieldByReportLabel($module, $fieldLabel);
$fieldType = null;
$fieldvalue = $value;
if(!empty($fieldInfo)) {
$field = WebserviceField::fromArray($db, $fieldInfo);
$fieldType = $field->getFieldDataType();
}
// Added to support pricebook List Price in reports
if ($report->primarymodule == 'PriceBooks' && $fieldLabel == 'List_Price') {
$fieldInfo = array(
'tabid' => getTabid($module),
'fieldid' => '',
'fieldname' => 'listprice',
'fieldlabel'=> 'List Price',
'columnname'=> 'listprice',
'tablename' => 'vtiger_pricebookproductrel',
'uitype' => 72,
'typeofdata'=> 'Currency',
'presence' => 0,
);
$field = WebserviceField::fromArray($db, $fieldInfo);
$fieldType = $field->getFieldDataType();
}
if(is_object($field) && $field->getUIType() == 401){
if ($value) {
$value = explode('_', $value);
$module = 'RecurringInvoice';
$frequency = ucfirst($value[0]);
if($frequency == 'Monthly'){
$fieldvalue = vtranslate('LBL_MONTHLY', $module, $value[1], vtranslate($value[2], $module));
}elseif($frequency == 'Yearly'){
$fieldvalue = vtranslate('LBL_YEARLY', $module, vtranslate(ucfirst($value[1]), $module), vtranslate($value[2], $module));
}elseif($frequency == 'Weekly'){
$fieldvalue = vtranslate('LBL_WEEKLY', $module, vtranslate(ucfirst($value[1])));
}elseif($frequency == 'Daily'){
$fieldvalue = vtranslate($frequency, $module);
}
}
}else if ($fieldType == 'currency' && $value != '') {
// Some of the currency fields like Unit Price, Total, Sub-total etc of Inventory modules, do not need currency conversion
if ($field->getUIType() == '72') {
$curid_value = explode("::", $value);
$currency_id = $curid_value[0];
$currency_value = $curid_value[1];
$cur_sym_rate = getCurrencySymbolandCRate($currency_id);
if ($value != '') {
if (($dbField->name == 'Products_Unit_Price')) { // need to do this only for Products Unit Price
if ($currency_id != 1) {
$currency_value = (float) $cur_sym_rate['rate'] * (float) $currency_value;
}
}
if ($operation == 'ExcelExport') {
$fieldvalue = $currency_value;
} else {
$formattedCurrencyValue = CurrencyField::convertToUserFormat($currency_value, null, true);
$fieldvalue = CurrencyField::appendCurrencySymbol($formattedCurrencyValue, $cur_sym_rate['symbol']);
}
}
} else {
if ($operation == 'ExcelExport') {
$currencyField = new CurrencyField($value);
$fieldvalue = $currencyField->getDisplayValue(null, false, true);
} else {
$currencyField = new CurrencyField($value);
$userCurrencyInfo = getCurrencySymbolandCRate($current_user->currency_id);
$fieldvalue = CurrencyField::appendCurrencySymbol($currencyField->getDisplayValue(), $userCurrencyInfo['symbol']);
}
}
} elseif ($dbField->name == "PurchaseOrder_Currency" || $dbField->name == "SalesOrder_Currency"
|| $dbField->name == "Invoice_Currency" || $dbField->name == "Quotes_Currency" || $dbField->name == "PriceBooks_Currency") {
if($value!='') {
$fieldvalue = getTranslatedCurrencyString($value);
}
} elseif (in_array($dbField->name,$report->ui101_fields) && !empty($value)) {
$entityNames = getEntityName('Users', $value);
$fieldvalue = $entityNames[$value];
} elseif( $fieldType == 'date' && !empty($value)) {
if($module == 'Calendar' && ($field->getFieldName() == 'due_date' || $field->getFieldName() == 'date_start')) {
if($field->getFieldName() == 'due_date'){
$endTime = $valueArray['calendar_end_time'];
if(empty($endTime)) {
$recordId = $valueArray['calendar_id'];
$endTime = getSingleFieldValue('vtiger_activity', 'time_end', 'activityid', $recordId);
}
$date = new DateTimeField($value.' '.$endTime);
$fieldvalue = $date->getDisplayDate();
}
else{
$date = new DateTimeField($fieldvalue);
$fieldvalue = $date->getDisplayDateTimeValue();
}
} else {
$date = new DateTimeField($fieldvalue);
$fieldvalue = $date->getDisplayDate();
}
} elseif( $fieldType == "datetime" && !empty($value)) {
$date = new DateTimeField($value);
$fieldvalue = $date->getDisplayDateTimeValue();
} elseif( $fieldType == 'time' && !empty($value) && $field->getFieldName()
!= 'duration_hours') {
if($field->getFieldName() == "time_start" || $field->getFieldName() == "time_end") {
$date = new DateTimeField($value);
$fieldvalue = $date->getDisplayTime();
} else {
$userModel = Users_Privileges_Model::getCurrentUserModel();
if($userModel->get('hour_format') == '12'){
$value = Vtiger_Time_UIType::getTimeValueInAMorPM($value);
}
$fieldvalue = $value;
}
} elseif( $fieldType == "picklist" && !empty($value) ) {
$fieldvalue = getTranslatedString($value, $module);
} elseif( $fieldType == "multipicklist" && !empty($value) ) {
if(is_array($picklistArray[1])) {
$valueList = explode(' |##| ', $value);
$translatedValueList = array();
foreach ( $valueList as $value) {
$translatedValueList[] = getTranslatedString($value, $module);
}
}
if (!is_array($picklistArray[1]) || !is_array($picklistArray[1][$dbField->name])) {
$fieldvalue = str_replace(' |##| ', ', ', $value);
} else {
implode(', ', $translatedValueList);
}
} elseif ($fieldType == 'double' && $operation != 'ExcelExport') {
if($current_user->truncate_trailing_zeros == true)
$fieldvalue = decimalFormat($fieldvalue);
}
if($fieldType == 'currency' && $value == "" && $operation != 'ExcelExport'){
$currencyField = new CurrencyField($value);
$fieldvalue = $currencyField->getDisplayValue();
return $fieldvalue;
} else if($fieldvalue == "" && $operation != 'ExcelExport') {
return "";
}
$fieldvalue = str_replace("<", "&lt;", $fieldvalue);
$fieldvalue = str_replace(">", "&gt;", $fieldvalue);
$fieldvalue = decode_html($fieldvalue);
if (stristr($fieldvalue, "|##|") && empty($fieldType)) {
$fieldvalue = str_ireplace(' |##| ', ', ', $fieldvalue);
} elseif ($fld_type == "date" && empty($fieldType)) {
$fieldvalue = DateTimeField::convertToUserFormat($fieldvalue);
} elseif ($fld_type == "datetime" && empty($fieldType)) {
$date = new DateTimeField($fieldvalue);
$fieldvalue = $date->getDisplayDateTimeValue();
}
// Added to render html tag for description fields
if($fieldInfo['uitype'] == '19' && ($module == 'Documents' || $module == 'Emails')) {
return $fieldvalue;
}
if($operation == 'ExcelExport') {
return array('value' => htmlentities($fieldvalue, ENT_QUOTES, $default_charset), 'type' => $fieldType);
}
return htmlentities($fieldvalue, ENT_QUOTES, $default_charset);
}
function transformAdvFilterListToDBFormat($advFilterList) {
$db = PearDatabase::getInstance();
foreach($advFilterList as $k => $columnConditions) {
foreach($columnConditions['columns'] as $j => $columnCondition) {
if(empty($columnCondition)) continue;
$advFilterColumn = $columnCondition["columnname"];
$advFilterComparator = $columnCondition["comparator"];
$advFilterValue = $columnCondition["value"];
$columnInfo = explode(":",$advFilterColumn);
$moduleFieldLabel = $columnInfo[2];
list($module, $fieldLabel) = explode('_', $moduleFieldLabel, 2);
$fieldInfo = getFieldByReportLabel($module, $fieldLabel);
$fieldType = null;
if(!empty($fieldInfo)) {
$field = WebserviceField::fromArray($db, $fieldInfo);
$fieldType = $field->getFieldDataType();
}
if($fieldType == 'currency') {
if($field->getUIType() == '72') {
$advFilterValue = Vtiger_Currency_UIType::convertToDBFormat($advFilterValue, null, true);
} else {
$advFilterValue = Vtiger_Currency_UIType::convertToDBFormat($advFilterValue);
}
}
$specialDateConditions = Vtiger_Functions::getSpecialDateTimeCondtions();
$tempVal = explode(",",$advFilterValue);
if(($columnInfo[4] == 'D' || ($columnInfo[4] == 'T' && $columnInfo[1] != 'time_start' && $columnInfo[1] != 'time_end') ||
($columnInfo[4] == 'DT')) && ($columnInfo[4] != '' && $advFilterValue != '' ) && !in_array($advFilterComparator, $specialDateConditions)) {
$val = Array();
for($i=0; $i<count($tempVal); $i++) {
if(trim($tempVal[$i]) != '') {
$date = new DateTimeField(trim($tempVal[$i]));
if($columnInfo[4] == 'D') {
$val[$i] = DateTimeField::convertToDBFormat(trim($tempVal[$i]));
} elseif($columnInfo[4] == 'DT') {
$values = explode(' ', $tempVal[$i]);
$date = new DateTimeField($values[0]);
$val[$i] = $date->getDBInsertDateValue();
} elseif($fieldType == 'time') {
$val[$i] = Vtiger_Time_UIType::getTimeValueWithSeconds($tempVal[$i]);
} else {
$val[$i] = $date->getDBInsertTimeValue();
}
}
}
$advFilterValue = implode(",", $val);
}
$advFilterList[$k]['columns'][$j]['value'] = $advFilterValue;
}
}
return $advFilterList;
}
function getReportSearchCondition($searchParams, $filterId) {
if (!empty($searchParams)) {
$db = PearDatabase::getInstance();
$params = array();
$conditionQuery = '';
if ($filterId === 'All') {
$conditionQuery .= ' WHERE ';
} else {
$conditionQuery .= " AND ";
}
$conditionQuery .= " (( ";
foreach ($searchParams as $i => $condition) {
$fieldName = $condition[0];
$searchValue = $condition[2];
if ($fieldName == 'reportname' || $fieldName == 'description') {
$conditionQuery .= " vtiger_report.$fieldName LIKE ? ";
array_push($params, "%$searchValue%");
} else if ($fieldName == 'reporttype' || $fieldName == 'foldername' || $fieldName == 'owner') {
$searchValue = explode(',', $searchValue);
if ($fieldName == 'foldername') {
$fieldName = 'folderid';
}
if ($fieldName == 'reporttype' && in_array('tabular', $searchValue)) {
array_push($searchValue, 'summary');
}
$conditionQuery .= " vtiger_report.$fieldName IN (".generateQuestionMarks($searchValue).") ";
foreach ($searchValue as $value) {
array_push($params, $value);
}
} else if ($fieldName == 'primarymodule') {
$searchValue = explode(',', $searchValue);
$conditionQuery .= " vtiger_reportmodules.$fieldName IN (".generateQuestionMarks($searchValue).") ";
foreach ($searchValue as $value) {
array_push($params, $value);
}
}
if ($i < (count($searchParams) - 1)) {
$conditionQuery .= ' AND ';
}
}
$conditionQuery .= " ) ";
$conditionQuery .= ") ";
return $db->convert2Sql($conditionQuery, $params);
}
return false;
}
?>