- 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.
365 lines
14 KiB
PHP
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("<", "<", $fieldvalue);
|
|
$fieldvalue = str_replace(">", ">", $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;
|
|
}
|
|
|
|
?>
|