- 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.
210 lines
8.7 KiB
PHP
210 lines
8.7 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.
|
|
*
|
|
********************************************************************************/
|
|
|
|
|
|
require_once('include/utils/UserInfoUtil.php');
|
|
require_once("include/utils/utils.php");
|
|
require_once("include/ListView/ListViewSession.php");
|
|
require_once("include/ListView/RelatedListViewSession.php");
|
|
|
|
if(!function_exists('GetRelatedList')) {
|
|
function GetRelatedList($module,$relatedmodule,$focus,$query,$button,$returnset,$id='',
|
|
$edit_val='',$del_val='',$skipActions=false) {
|
|
return GetRelatedListBase($module, $relatedmodule, $focus, $query, $button, $returnset, $id, $edit_val, $del_val, $skipActions);
|
|
}
|
|
}
|
|
|
|
if(!function_exists('GetHistory')) {
|
|
function GetHistory($parentmodule,$query,$id) {
|
|
return GetHistoryBase($parentmodule,$query,$id);
|
|
}
|
|
}
|
|
|
|
/** Function to get related list entries in detailed array format
|
|
* @param $module -- modulename:: Type string
|
|
* @param $relatedmodule -- relatedmodule:: Type string
|
|
* @param $focus -- focus:: Type object
|
|
* @param $query -- query:: Type string
|
|
* @param $button -- buttons:: Type string
|
|
* @param $returnset -- returnset:: Type string
|
|
* @param $id -- id:: Type string
|
|
* @param $edit_val -- edit value:: Type string
|
|
* @param $del_val -- delete value:: Type string
|
|
* @returns $related_entries -- related entires:: Type string array
|
|
*
|
|
*/
|
|
|
|
function GetRelatedListBase($module,$relatedmodule,$focus,$query,$button,$returnset,$id='',$edit_val='',$del_val='',$skipActions=false)
|
|
{
|
|
return array('query' => $query);
|
|
}
|
|
|
|
/** Function to get related list entries in detailed array format
|
|
* @param $parentmodule -- parentmodulename:: Type string
|
|
* @param $query -- query:: Type string
|
|
* @param $id -- id:: Type string
|
|
* @returns $return_data -- return data:: Type string array
|
|
*
|
|
*/
|
|
|
|
function GetHistoryBase($parentmodule,$query,$id)
|
|
{
|
|
|
|
|
|
}
|
|
|
|
/** Function to display the Products which are related to the PriceBook
|
|
* @param string $query - query to get the list of products which are related to the current PriceBook
|
|
* @param object $focus - PriceBook object which contains all the information of the current PriceBook
|
|
* @param string $returnset - return_module, return_action and return_id which are sequenced with & to pass to the URL which is optional
|
|
* return array $return_data which will be formed like array('header'=>$header,'entries'=>$entries_list) where as $header contains all the header columns and $entries_list will contain all the Product entries
|
|
*/
|
|
function getPriceBookRelatedProducts($query,$focus,$returnset='')
|
|
{
|
|
global $log;
|
|
$log->debug("Entering getPriceBookRelatedProducts(".$query.",".get_class($focus).",".$returnset.") method ...");
|
|
|
|
global $adb;
|
|
global $app_strings;
|
|
global $mod_strings;
|
|
global $current_language,$current_user;
|
|
$current_module_strings = return_module_language($current_language, 'PriceBook');
|
|
$no_of_decimal_places = getCurrencyDecimalPlaces();
|
|
global $list_max_entries_per_page;
|
|
global $urlPrefix;
|
|
|
|
global $theme;
|
|
$pricebook_id = vtlib_purify($_REQUEST['record']);
|
|
$theme_path="themes/".$theme."/";
|
|
$image_path=$theme_path."images/";
|
|
|
|
$computeCount = $_REQUEST['withCount'];
|
|
if(PerformancePrefs::getBoolean('LISTVIEW_COMPUTE_PAGE_COUNT', false) === true ||
|
|
((boolean) $computeCount) == true){
|
|
$noofrows = $adb->query_result($adb->query(Vtiger_Functions::mkCountQuery($query)),0,'count');
|
|
}else{
|
|
$noofrows = null;
|
|
}
|
|
|
|
$module = 'PriceBooks';
|
|
$relatedmodule = 'Products';
|
|
if(!$_SESSION['rlvs'][$module][$relatedmodule])
|
|
{
|
|
$modObj = new ListViewSession();
|
|
$modObj->sortby = $focus->default_order_by;
|
|
$modObj->sorder = $focus->default_sort_order;
|
|
$_SESSION['rlvs'][$module][$relatedmodule] = get_object_vars($modObj);
|
|
}
|
|
|
|
|
|
if(isset($_REQUEST['relmodule']) && $_REQUEST['relmodule']!='' && $_REQUEST['relmodule'] == $relatedmodule) {
|
|
$relmodule = vtlib_purify($_REQUEST['relmodule']);
|
|
if($_SESSION['rlvs'][$module][$relmodule]) {
|
|
setSessionVar($_SESSION['rlvs'][$module][$relmodule],$noofrows,$list_max_entries_per_page,$module,$relmodule);
|
|
}
|
|
}
|
|
global $relationId;
|
|
$start = RelatedListViewSession::getRequestCurrentPage($relationId, $query);
|
|
$navigation_array = VT_getSimpleNavigationValues($start, $list_max_entries_per_page,
|
|
$noofrows);
|
|
|
|
$limit_start_rec = ($start-1) * $list_max_entries_per_page;
|
|
|
|
if( $adb->dbType == "pgsql")
|
|
$list_result = $adb->pquery($query.
|
|
" OFFSET $limit_start_rec LIMIT $list_max_entries_per_page", array());
|
|
else
|
|
$list_result = $adb->pquery($query.
|
|
" LIMIT $limit_start_rec, $list_max_entries_per_page", array());
|
|
|
|
$header=array();
|
|
$header[]=$mod_strings['LBL_LIST_PRODUCT_NAME'];
|
|
if(getFieldVisibilityPermission('Products', $current_user->id, 'productcode') == '0')
|
|
$header[]=$mod_strings['LBL_PRODUCT_CODE'];
|
|
if(getFieldVisibilityPermission('Products', $current_user->id, 'unit_price') == '0')
|
|
$header[]=$mod_strings['LBL_PRODUCT_UNIT_PRICE'];
|
|
$header[]=$mod_strings['LBL_PB_LIST_PRICE'];
|
|
if(isPermitted("PriceBooks","EditView","") == 'yes' || isPermitted("PriceBooks","Delete","") == 'yes')
|
|
$header[]=$mod_strings['LBL_ACTION'];
|
|
|
|
$currency_id = $focus->column_fields['currency_id'];
|
|
$numRows = $adb->num_rows($list_result);
|
|
for($i=0; $i<$numRows; $i++) {
|
|
$entity_id = $adb->query_result($list_result,$i,"crmid");
|
|
$unit_price = $adb->query_result($list_result,$i,"unit_price");
|
|
if($currency_id != null) {
|
|
$prod_prices = getPricesForProducts($currency_id, array($entity_id));
|
|
$unit_price = $prod_prices[$entity_id];
|
|
}
|
|
$listprice = $adb->query_result($list_result,$i,"listprice");
|
|
$field_name=$entity_id."_listprice";
|
|
|
|
$entries = Array();
|
|
$entries[] = textlength_check($adb->query_result($list_result,$i,"productname"));
|
|
if(getFieldVisibilityPermission('Products', $current_user->id, 'productcode') == '0')
|
|
$entries[] = $adb->query_result($list_result,$i,"productcode");
|
|
if(getFieldVisibilityPermission('Products', $current_user->id, 'unit_price') == '0')
|
|
$entries[] = CurrencyField::convertToUserFormat($unit_price, null, true);
|
|
|
|
$entries[] = CurrencyField::convertToUserFormat($listprice, null, true);
|
|
$action = "";
|
|
if(isPermitted("PriceBooks","EditView","") == 'yes' && isPermitted('Products', 'EditView', $entity_id) == 'yes') {
|
|
$action .= '<img style="cursor:pointer;" src="'. vtiger_imageurl('editfield.gif', $theme).'" border="0" onClick="fnvshobj(this,\'editlistprice\'),editProductListPrice(\''.$entity_id.'\',\''.$pricebook_id.'\',\''.number_format($listprice, $no_of_decimal_places,'.','').'\')" alt="'.$app_strings["LBL_EDIT_BUTTON"].'" title="'.$app_strings["LBL_EDIT_BUTTON"].'"/>';
|
|
} else {
|
|
$action .= '<img src="'. vtiger_imageurl('blank.gif', $theme).'" border="0" />';
|
|
}
|
|
if(isPermitted("PriceBooks","Delete","") == 'yes' && isPermitted('Products', 'Delete', $entity_id) == 'yes') {
|
|
if($action != "")
|
|
$action .= ' | ';
|
|
$action .= '<img src="'. vtiger_imageurl('delete.gif', $theme).'" onclick="if(confirm(\''.$app_strings['ARE_YOU_SURE'].'\')) deletePriceBookProductRel('.$entity_id.','.$pricebook_id.');" alt="'.$app_strings["LBL_DELETE"].'" title="'.$app_strings["LBL_DELETE"].'" style="cursor:pointer;" border="0">';
|
|
}
|
|
if($action != "")
|
|
$entries[] = $action;
|
|
$entries_list[] = $entries;
|
|
}
|
|
$navigationOutput[] = getRecordRangeMessage($list_result, $limit_start_rec,$noofrows);
|
|
$navigationOutput[] = getRelatedTableHeaderNavigation($navigation_array, '',$module,
|
|
$relatedmodule,$focus->id);
|
|
$return_data = array('header'=>$header,'entries'=>$entries_list,'navigation'=>$navigationOutput);
|
|
|
|
$log->debug("Exiting getPriceBookRelatedProducts method ...");
|
|
return $return_data;
|
|
}
|
|
|
|
function CheckFieldPermission($fieldname,$module) {
|
|
global $current_user,$adb;
|
|
require('user_privileges/user_privileges_'.$current_user->id.'.php');
|
|
if($fieldname == '' || $module == '') {
|
|
return "false";
|
|
}
|
|
|
|
if(getFieldVisibilityPermission($module, $current_user->id, $fieldname) == '0') {
|
|
return "true";
|
|
}
|
|
return "false";
|
|
}
|
|
|
|
function CheckColumnPermission($tablename, $columnname, $module)
|
|
{
|
|
global $adb;
|
|
|
|
static $cache = array();
|
|
|
|
$cachekey = $module . ":" . $tablename . ":" . $columnname;
|
|
if (!array_key_exists($cachekey, $cache)) {
|
|
$res = $adb->pquery("select fieldname from vtiger_field where tablename=? and columnname=? and vtiger_field.presence in (0,2)", array($tablename, $columnname));
|
|
$fieldname = $adb->query_result($res, 0, 'fieldname');
|
|
$cache[$cachekey] = CheckFieldPermission($fieldname, $module);
|
|
}
|
|
|
|
return $cache[$cachekey];
|
|
}
|
|
?>
|