[ Index ] |
PHP Cross Reference of vtigercrm-6.1.0 |
[Summary view] [Print] [Text view]
1 <?php 2 /*+********************************************************************************** 3 * The contents of this file are subject to the vtiger CRM Public License Version 1.0 4 * ("License"); You may not use this file except in compliance with the License 5 * The Original Code is: vtiger CRM Open Source 6 * The Initial Developer of the Original Code is vtiger. 7 * Portions created by vtiger are Copyright (C) vtiger. 8 * All Rights Reserved. 9 ************************************************************************************/ 10 class Services extends CRMEntity { 11 var $db, $log; // Used in class functions of CRMEntity 12 13 var $table_name = 'vtiger_service'; 14 var $table_index= 'serviceid'; 15 var $column_fields = Array(); 16 17 /** Indicator if this is a custom module or standard module */ 18 var $IsCustomModule = true; 19 20 /** 21 * Mandatory table for supporting custom fields. 22 */ 23 var $customFieldTable = Array('vtiger_servicecf', 'serviceid'); 24 25 /** 26 * Mandatory for Saving, Include tables related to this module. 27 */ 28 var $tab_name = Array('vtiger_crmentity','vtiger_service','vtiger_servicecf'); 29 30 /** 31 * Mandatory for Saving, Include tablename and tablekey columnname here. 32 */ 33 var $tab_name_index = Array( 34 'vtiger_crmentity'=>'crmid', 35 'vtiger_service'=>'serviceid', 36 'vtiger_servicecf'=>'serviceid', 37 'vtiger_producttaxrel'=>'productid'); 38 39 /** 40 * Mandatory for Listing (Related listview) 41 */ 42 var $list_fields = Array( 43 /* Format: Field Label => Array(tablename, columnname) */ 44 // tablename should not have prefix 'vtiger_' 45 'Service No'=>Array('service'=>'service_no'), 46 'Service Name'=>Array('service'=>'servicename'), 47 'Commission Rate'=>Array('service'=>'commissionrate'), 48 'No of Units'=>Array('service'=>'qty_per_unit'), 49 'Price'=>Array('service'=>'unit_price') 50 ); 51 var $list_fields_name = Array( 52 /* Format: Field Label => fieldname */ 53 'Service No'=>'service_no', 54 'Service Name'=>'servicename', 55 'Commission Rate'=>'commissionrate', 56 'No of Units'=>'qty_per_unit', 57 'Price'=>'unit_price' 58 ); 59 60 // Make the field link to detail view 61 var $list_link_field= 'servicename'; 62 63 // For Popup listview and UI type support 64 var $search_fields = Array( 65 /* Format: Field Label => Array(tablename, columnname) */ 66 // tablename should not have prefix 'vtiger_' 67 'Service No'=>Array('service'=>'service_no'), 68 'Service Name'=>Array('service'=>'servicename'), 69 'Price'=>Array('service'=>'unit_price') 70 ); 71 var $search_fields_name = Array( 72 /* Format: Field Label => fieldname */ 73 'Service No'=>'service_no', 74 'Service Name'=>'servicename', 75 'Price'=>'unit_price' 76 ); 77 78 // For Popup window record selection 79 var $popup_fields = Array ('servicename','service_usageunit','unit_price'); 80 81 // Placeholder for sort fields - All the fields will be initialized for Sorting through initSortFields 82 var $sortby_fields = Array(); 83 84 // For Alphabetical search 85 var $def_basicsearch_col = 'servicename'; 86 87 // Column value to use on detail view record text display 88 var $def_detailview_recname = 'servicename'; 89 90 // Required Information for enabling Import feature 91 var $required_fields = Array('servicename'=>1); 92 93 // Used when enabling/disabling the mandatory fields for the module. 94 // Refers to vtiger_field.fieldname values. 95 var $mandatory_fields = Array('servicename', 'assigned_user_id'); 96 97 var $default_order_by = 'servicename'; 98 var $default_sort_order='ASC'; 99 100 var $unit_price; 101 102 /** Constructor which will set the column_fields in this object 103 */ 104 function __construct() { 105 global $log; 106 $this->column_fields = getColumnFields(get_class($this)); 107 $this->db = PearDatabase::getInstance(); 108 $this->log = $log; 109 } 110 111 function save_module($module) 112 { 113 //Inserting into service_taxrel table 114 if($_REQUEST['ajxaction'] != 'DETAILVIEW'&& $_REQUEST['action'] != 'MassEditSave' && $_REQUEST['action'] != 'ProcessDuplicates') 115 { 116 $this->insertTaxInformation('vtiger_producttaxrel', 'Services'); 117 $this->insertPriceInformation('vtiger_productcurrencyrel', 'Services'); 118 } 119 // Update unit price value in vtiger_productcurrencyrel 120 $this->updateUnitPrice(); 121 } 122 123 /** function to save the service tax information in vtiger_servicetaxrel table 124 * @param string $tablename - vtiger_tablename to save the service tax relationship (servicetaxrel) 125 * @param string $module - current module name 126 * $return void 127 */ 128 function insertTaxInformation($tablename, $module) 129 { 130 global $adb, $log; 131 $log->debug("Entering into insertTaxInformation($tablename, $module) method ..."); 132 $tax_details = getAllTaxes(); 133 134 $tax_per = ''; 135 //Save the Product - tax relationship if corresponding tax check box is enabled 136 //Delete the existing tax if any 137 if($this->mode == 'edit') 138 { 139 for($i=0;$i<count($tax_details);$i++) 140 { 141 $taxid = getTaxId($tax_details[$i]['taxname']); 142 $sql = "delete from vtiger_producttaxrel where productid=? and taxid=?"; 143 $adb->pquery($sql, array($this->id,$taxid)); 144 } 145 } 146 for($i=0;$i<count($tax_details);$i++) 147 { 148 $tax_name = $tax_details[$i]['taxname']; 149 $tax_checkname = $tax_details[$i]['taxname']."_check"; 150 if($_REQUEST[$tax_checkname] == 'on' || $_REQUEST[$tax_checkname] == 1) 151 { 152 $taxid = getTaxId($tax_name); 153 $tax_per = $_REQUEST[$tax_name]; 154 if($tax_per == '') 155 { 156 $log->debug("Tax selected but value not given so default value will be saved."); 157 $tax_per = getTaxPercentage($tax_name); 158 } 159 160 $log->debug("Going to save the Product - $tax_name tax relationship"); 161 162 $query = "insert into vtiger_producttaxrel values(?,?,?)"; 163 $adb->pquery($query, array($this->id,$taxid,$tax_per)); 164 } 165 } 166 167 $log->debug("Exiting from insertTaxInformation($tablename, $module) method ..."); 168 } 169 170 /** function to save the service price information in vtiger_servicecurrencyrel table 171 * @param string $tablename - vtiger_tablename to save the service currency relationship (servicecurrencyrel) 172 * @param string $module - current module name 173 * $return void 174 */ 175 function insertPriceInformation($tablename, $module) 176 { 177 global $adb, $log, $current_user; 178 $log->debug("Entering into insertPriceInformation($tablename, $module) method ..."); 179 //removed the update of currency_id based on the logged in user's preference : fix 6490 180 181 182 $currency_details = getAllCurrencies('all'); 183 184 //Delete the existing currency relationship if any 185 if($this->mode == 'edit' && $_REQUEST['action'] != 'MassEditSave' && $_REQUEST['action'] != 'ProcessDuplicates') 186 { 187 for($i=0;$i<count($currency_details);$i++) 188 { 189 $curid = $currency_details[$i]['curid']; 190 $sql = "delete from vtiger_productcurrencyrel where productid=? and currencyid=?"; 191 $adb->pquery($sql, array($this->id,$curid)); 192 } 193 } 194 195 $service_base_conv_rate = getBaseConversionRateForProduct($this->id, $this->mode,$module); 196 197 //Save the Product - Currency relationship if corresponding currency check box is enabled 198 for($i=0;$i<count($currency_details);$i++) 199 { 200 $curid = $currency_details[$i]['curid']; 201 $curname = $currency_details[$i]['currencylabel']; 202 $cur_checkname = 'cur_' . $curid . '_check'; 203 $cur_valuename = 'curname' . $curid; 204 $base_currency_check = 'base_currency' . $curid; 205 $requestPrice = CurrencyField::convertToDBFormat($_REQUEST['unit_price'], null, true); 206 $actualPrice = CurrencyField::convertToDBFormat($_REQUEST[$cur_valuename], null, true); 207 if($_REQUEST[$cur_checkname] == 'on' || $_REQUEST[$cur_checkname] == 1) 208 { 209 $conversion_rate = $currency_details[$i]['conversionrate']; 210 $actual_conversion_rate = $service_base_conv_rate * $conversion_rate; 211 $converted_price = $actual_conversion_rate * $requestPrice; 212 213 $log->debug("Going to save the Product - $curname currency relationship"); 214 215 $query = "insert into vtiger_productcurrencyrel values(?,?,?,?)"; 216 $adb->pquery($query, array($this->id,$curid,$converted_price,$actualPrice)); 217 218 // Update the Product information with Base Currency choosen by the User. 219 if ($_REQUEST['base_currency'] == $cur_valuename) { 220 $adb->pquery("update vtiger_service set currency_id=?, unit_price=? where serviceid=?", array($curid, $actualPrice, $this->id)); 221 } 222 }else{ 223 $curid = fetchCurrency($current_user->id); 224 $adb->pquery("update vtiger_service set currency_id=? where serviceid=?", array($curid, $this->id)); 225 } 226 } 227 228 $log->debug("Exiting from insertPriceInformation($tablename, $module) method ..."); 229 } 230 231 function updateUnitPrice() { 232 $prod_res = $this->db->pquery("select unit_price, currency_id from vtiger_service where serviceid=?", array($this->id)); 233 $prod_unit_price = $this->db->query_result($prod_res, 0, 'unit_price'); 234 $prod_base_currency = $this->db->query_result($prod_res, 0, 'currency_id'); 235 236 $query = "update vtiger_productcurrencyrel set actual_price=? where productid=? and currencyid=?"; 237 $params = array($prod_unit_price, $this->id, $prod_base_currency); 238 $this->db->pquery($query, $params); 239 } 240 241 /** 242 * Return query to use based on given modulename, fieldname 243 * Useful to handle specific case handling for Popup 244 */ 245 function getQueryByModuleField($module, $fieldname, $srcrecord) { 246 // $srcrecord could be empty 247 } 248 249 /** 250 * Get list view query. 251 */ 252 function getListQuery($module, $where='') { 253 $query = "SELECT vtiger_crmentity.*, $this->table_name.*"; 254 255 // Select Custom Field Table Columns if present 256 if(!empty($this->customFieldTable)) $query .= ", " . $this->customFieldTable[0] . ".* "; 257 258 $query .= " FROM $this->table_name"; 259 260 $query .= " INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = $this->table_name.$this->table_index"; 261 262 // Consider custom table join as well. 263 if(!empty($this->customFieldTable)) { 264 $query .= " INNER JOIN ".$this->customFieldTable[0]." ON ".$this->customFieldTable[0].'.'.$this->customFieldTable[1] . 265 " = $this->table_name.$this->table_index"; 266 } 267 $query .= " LEFT JOIN vtiger_groups 268 ON vtiger_groups.groupid = vtiger_crmentity.smownerid 269 LEFT JOIN vtiger_users 270 ON vtiger_users.id = vtiger_crmentity.smownerid "; 271 global $current_user; 272 $query .= $this->getNonAdminAccessControlQuery($module,$current_user); 273 $query .= "WHERE vtiger_crmentity.deleted = 0 ".$where; 274 return $query; 275 } 276 277 /** 278 * Apply security restriction (sharing privilege) query part for List view. 279 */ 280 function getListViewSecurityParameter($module) { 281 global $current_user; 282 require('user_privileges/user_privileges_'.$current_user->id.'.php'); 283 require('user_privileges/sharing_privileges_'.$current_user->id.'.php'); 284 285 $sec_query = ''; 286 $tabid = getTabid($module); 287 288 if($is_admin==false && $profileGlobalPermission[1] == 1 && $profileGlobalPermission[2] == 1 289 && $defaultOrgSharingPermission[$tabid] == 3) { 290 291 $sec_query .= " AND (vtiger_crmentity.smownerid in($current_user->id) OR vtiger_crmentity.smownerid IN 292 ( 293 SELECT vtiger_user2role.userid FROM vtiger_user2role 294 INNER JOIN vtiger_users ON vtiger_users.id=vtiger_user2role.userid 295 INNER JOIN vtiger_role ON vtiger_role.roleid=vtiger_user2role.roleid 296 WHERE vtiger_role.parentrole LIKE '".$current_user_parent_role_seq."::%' 297 ) 298 OR vtiger_crmentity.smownerid IN 299 ( 300 SELECT shareduserid FROM vtiger_tmp_read_user_sharing_per 301 WHERE userid=".$current_user->id." AND tabid=".$tabid." 302 ) 303 OR 304 ("; 305 306 // Build the query based on the group association of current user. 307 if(sizeof($current_user_groups) > 0) { 308 $sec_query .= " vtiger_groups.groupid IN (". implode(",", $current_user_groups) .") OR "; 309 } 310 $sec_query .= " vtiger_groups.groupid IN 311 ( 312 SELECT vtiger_tmp_read_group_sharing_per.sharedgroupid 313 FROM vtiger_tmp_read_group_sharing_per 314 WHERE userid=".$current_user->id." and tabid=".$tabid." 315 )"; 316 $sec_query .= ") 317 )"; 318 } 319 return $sec_query; 320 } 321 322 /** 323 * Create query to export the records. 324 */ 325 function create_export_query($where) 326 { 327 global $current_user; 328 329 include ("include/utils/ExportUtils.php"); 330 331 //To get the Permitted fields query and the permitted fields list 332 $sql = getPermittedFieldsQuery('Services', "detail_view"); 333 334 $fields_list = getFieldsListFromQuery($sql); 335 336 $query = "SELECT $fields_list 337 FROM vtiger_crmentity INNER JOIN $this->table_name ON vtiger_crmentity.crmid=$this->table_name.$this->table_index"; 338 339 if(!empty($this->customFieldTable)) { 340 $query .= " INNER JOIN ".$this->customFieldTable[0]." ON ".$this->customFieldTable[0].'.'.$this->customFieldTable[1] . 341 " = $this->table_name.$this->table_index"; 342 } 343 344 $query .= " LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid"; 345 $query .= " LEFT JOIN vtiger_users ON vtiger_crmentity.smownerid = vtiger_users.id AND vtiger_users.status='Active'"; 346 $query .= $this->getNonAdminAccessControlQuery('Services',$current_user); 347 $where_auto = " vtiger_crmentity.deleted=0"; 348 349 if($where != '') $query .= " WHERE ($where) AND $where_auto"; 350 else $query .= " WHERE $where_auto"; 351 352 return $query; 353 } 354 355 /** 356 * Transform the value while exporting 357 */ 358 function transform_export_value($key, $value) { 359 return parent::transform_export_value($key, $value); 360 } 361 362 /** 363 * Function which will give the basic query to find duplicates 364 */ 365 function getDuplicatesQuery($module,$table_cols,$field_values,$ui_type_arr,$select_cols='') { 366 $select_clause = "SELECT ". $this->table_name .".".$this->table_index ." AS recordid, vtiger_users_last_import.deleted,".$table_cols; 367 368 // Select Custom Field Table Columns if present 369 if(isset($this->customFieldTable)) $query .= ", " . $this->customFieldTable[0] . ".* "; 370 371 $from_clause = " FROM $this->table_name"; 372 373 $from_clause .= " INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = $this->table_name.$this->table_index"; 374 375 // Consider custom table join as well. 376 if(isset($this->customFieldTable)) { 377 $from_clause .= " INNER JOIN ".$this->customFieldTable[0]." ON ".$this->customFieldTable[0].'.'.$this->customFieldTable[1] . 378 " = $this->table_name.$this->table_index"; 379 } 380 $from_clause .= " LEFT JOIN vtiger_groups ON vtiger_groups.groupid = vtiger_crmentity.smownerid 381 LEFT JOIN vtiger_users ON vtiger_users.id = vtiger_crmentity.smownerid"; 382 $where_clause = " WHERE vtiger_crmentity.deleted = 0"; 383 $where_clause .= $this->getListViewSecurityParameter($module); 384 385 if (isset($select_cols) && trim($select_cols) != '') { 386 $sub_query = "SELECT $select_cols FROM $this->table_name AS t " . 387 " INNER JOIN vtiger_crmentity AS crm ON crm.crmid = t.".$this->table_index; 388 // Consider custom table join as well. 389 if(isset($this->customFieldTable)) { 390 $sub_query .= " INNER JOIN ".$this->customFieldTable[0]." tcf ON tcf.".$this->customFieldTable[1]." = t.$this->table_index"; 391 } 392 $sub_query .= " WHERE crm.deleted=0 GROUP BY $select_cols HAVING COUNT(*)>1"; 393 } else { 394 $sub_query = "SELECT $table_cols $from_clause $where_clause GROUP BY $table_cols HAVING COUNT(*)>1"; 395 } 396 397 398 $query = $select_clause . $from_clause . 399 " LEFT JOIN vtiger_users_last_import ON vtiger_users_last_import.bean_id=" . $this->table_name .".".$this->table_index . 400 " INNER JOIN (" . $sub_query . ") AS temp ON ".get_on_clause($field_values,$ui_type_arr,$module) . 401 $where_clause . 402 " ORDER BY $table_cols,". $this->table_name .".".$this->table_index ." ASC"; 403 404 return $query; 405 } 406 /** 407 * Handle saving related module information. 408 * NOTE: This function has been added to CRMEntity (base class). 409 * You can override the behavior by re-defining it here. 410 */ 411 // function save_related_module($module, $crmid, $with_module, $with_crmid) { } 412 413 /** 414 * Handle deleting related module information. 415 * NOTE: This function has been added to CRMEntity (base class). 416 * You can override the behavior by re-defining it here. 417 */ 418 //function delete_related_module($module, $crmid, $with_module, $with_crmid) { } 419 420 /** 421 * Handle getting related list information. 422 * NOTE: This function has been added to CRMEntity (base class). 423 * You can override the behavior by re-defining it here. 424 */ 425 //function get_related_list($id, $cur_tab_id, $rel_tab_id, $actions=false) { } 426 427 /** function used to get the list of quotes which are related to the service 428 * @param int $id - service id 429 * @return array - array which will be returned from the function GetRelatedList 430 */ 431 function get_quotes($id, $cur_tab_id, $rel_tab_id, $actions=false) { 432 global $log, $singlepane_view,$currentModule,$current_user; 433 $log->debug("Entering get_quotes(".$id.") method ..."); 434 $this_module = $currentModule; 435 436 $related_module = vtlib_getModuleNameById($rel_tab_id); 437 require_once("modules/$related_module/$related_module.php"); 438 $other = new $related_module(); 439 vtlib_setup_modulevars($related_module, $other); 440 $singular_modname = vtlib_toSingular($related_module); 441 442 $parenttab = getParentTab(); 443 444 if($singlepane_view == 'true') 445 $returnset = '&return_module='.$this_module.'&return_action=DetailView&return_id='.$id; 446 else 447 $returnset = '&return_module='.$this_module.'&return_action=CallRelatedList&return_id='.$id; 448 449 $button = ''; 450 451 if($actions) { 452 if(is_string($actions)) $actions = explode(',', strtoupper($actions)); 453 if(in_array('SELECT', $actions) && isPermitted($related_module,4, '') == 'yes') { 454 $button .= "<input title='".getTranslatedString('LBL_SELECT')." ". getTranslatedString($related_module). "' class='crmbutton small edit' type='button' onclick=\"return window.open('index.php?module=$related_module&return_module=$currentModule&action=Popup&popuptype=detailview&select=enable&form=EditView&form_submit=false&recordid=$id&parenttab=$parenttab','test','width=640,height=602,resizable=0,scrollbars=0');\" value='". getTranslatedString('LBL_SELECT'). " " . getTranslatedString($related_module) ."'> "; 455 } 456 if(in_array('ADD', $actions) && isPermitted($related_module,1, '') == 'yes') { 457 $button .= "<input title='".getTranslatedString('LBL_ADD_NEW'). " ". getTranslatedString($singular_modname) ."' class='crmbutton small create'" . 458 " onclick='this.form.action.value=\"EditView\";this.form.module.value=\"$related_module\"' type='submit' name='button'" . 459 " value='". getTranslatedString('LBL_ADD_NEW'). " " . getTranslatedString($singular_modname) ."'> "; 460 } 461 } 462 463 $userNameSql = getSqlForNameInDisplayFormat(array('first_name'=> 464 'vtiger_users.first_name', 'last_name' => 'vtiger_users.last_name'), 'Users'); 465 $query = "SELECT vtiger_crmentity.*, 466 vtiger_quotes.*, 467 vtiger_potential.potentialname, 468 vtiger_account.accountname, 469 vtiger_inventoryproductrel.productid, 470 case when (vtiger_users.user_name not like '') then $userNameSql 471 else vtiger_groups.groupname end as user_name 472 FROM vtiger_quotes 473 INNER JOIN vtiger_crmentity 474 ON vtiger_crmentity.crmid = vtiger_quotes.quoteid 475 INNER JOIN vtiger_inventoryproductrel 476 ON vtiger_inventoryproductrel.id = vtiger_quotes.quoteid 477 LEFT OUTER JOIN vtiger_account 478 ON vtiger_account.accountid = vtiger_quotes.accountid 479 LEFT OUTER JOIN vtiger_potential 480 ON vtiger_potential.potentialid = vtiger_quotes.potentialid 481 LEFT JOIN vtiger_groups 482 ON vtiger_groups.groupid = vtiger_crmentity.smownerid 483 LEFT JOIN vtiger_quotescf 484 ON vtiger_quotescf.quoteid = vtiger_quotes.quoteid 485 LEFT JOIN vtiger_quotesbillads 486 ON vtiger_quotesbillads.quotebilladdressid = vtiger_quotes.quoteid 487 LEFT JOIN vtiger_quotesshipads 488 ON vtiger_quotesshipads.quoteshipaddressid = vtiger_quotes.quoteid 489 LEFT JOIN vtiger_users 490 ON vtiger_users.id = vtiger_crmentity.smownerid 491 WHERE vtiger_crmentity.deleted = 0 492 AND vtiger_inventoryproductrel.productid = ".$id; 493 494 $return_value = GetRelatedList($this_module, $related_module, $other, $query, $button, $returnset); 495 496 if($return_value == null) $return_value = Array(); 497 $return_value['CUSTOM_BUTTON'] = $button; 498 499 $log->debug("Exiting get_quotes method ..."); 500 return $return_value; 501 } 502 503 /** function used to get the list of purchase orders which are related to the service 504 * @param int $id - service id 505 * @return array - array which will be returned from the function GetRelatedList 506 */ 507 function get_purchase_orders($id, $cur_tab_id, $rel_tab_id, $actions=false) { 508 global $log, $singlepane_view,$currentModule,$current_user; 509 $log->debug("Entering get_purchase_orders(".$id.") method ..."); 510 $this_module = $currentModule; 511 512 $related_module = vtlib_getModuleNameById($rel_tab_id); 513 require_once("modules/$related_module/$related_module.php"); 514 $other = new $related_module(); 515 vtlib_setup_modulevars($related_module, $other); 516 $singular_modname = vtlib_toSingular($related_module); 517 518 $parenttab = getParentTab(); 519 520 if($singlepane_view == 'true') 521 $returnset = '&return_module='.$this_module.'&return_action=DetailView&return_id='.$id; 522 else 523 $returnset = '&return_module='.$this_module.'&return_action=CallRelatedList&return_id='.$id; 524 525 $button = ''; 526 527 if($actions) { 528 if(is_string($actions)) $actions = explode(',', strtoupper($actions)); 529 if(in_array('SELECT', $actions) && isPermitted($related_module,4, '') == 'yes') { 530 $button .= "<input title='".getTranslatedString('LBL_SELECT')." ". getTranslatedString($related_module). "' class='crmbutton small edit' type='button' onclick=\"return window.open('index.php?module=$related_module&return_module=$currentModule&action=Popup&popuptype=detailview&select=enable&form=EditView&form_submit=false&recordid=$id&parenttab=$parenttab','test','width=640,height=602,resizable=0,scrollbars=0');\" value='". getTranslatedString('LBL_SELECT'). " " . getTranslatedString($related_module) ."'> "; 531 } 532 if(in_array('ADD', $actions) && isPermitted($related_module,1, '') == 'yes') { 533 $button .= "<input title='".getTranslatedString('LBL_ADD_NEW'). " ". getTranslatedString($singular_modname) ."' class='crmbutton small create'" . 534 " onclick='this.form.action.value=\"EditView\";this.form.module.value=\"$related_module\"' type='submit' name='button'" . 535 " value='". getTranslatedString('LBL_ADD_NEW'). " " . getTranslatedString($singular_modname) ."'> "; 536 } 537 } 538 539 $userNameSql = getSqlForNameInDisplayFormat(array('first_name'=> 540 'vtiger_users.first_name', 'last_name' => 'vtiger_users.last_name'), 'Users'); 541 $query = "SELECT vtiger_crmentity.*, 542 vtiger_purchaseorder.*, 543 vtiger_service.servicename, 544 vtiger_inventoryproductrel.productid, 545 case when (vtiger_users.user_name not like '') then $userNameSql 546 else vtiger_groups.groupname end as user_name 547 FROM vtiger_purchaseorder 548 INNER JOIN vtiger_crmentity 549 ON vtiger_crmentity.crmid = vtiger_purchaseorder.purchaseorderid 550 INNER JOIN vtiger_inventoryproductrel 551 ON vtiger_inventoryproductrel.id = vtiger_purchaseorder.purchaseorderid 552 INNER JOIN vtiger_service 553 ON vtiger_service.serviceid = vtiger_inventoryproductrel.productid 554 LEFT JOIN vtiger_groups 555 ON vtiger_groups.groupid = vtiger_crmentity.smownerid 556 LEFT JOIN vtiger_purchaseordercf 557 ON vtiger_purchaseordercf.purchaseorderid = vtiger_purchaseorder.purchaseorderid 558 LEFT JOIN vtiger_pobillads 559 ON vtiger_pobillads.pobilladdressid = vtiger_purchaseorder.purchaseorderid 560 LEFT JOIN vtiger_poshipads 561 ON vtiger_poshipads.poshipaddressid = vtiger_purchaseorder.purchaseorderid 562 LEFT JOIN vtiger_users 563 ON vtiger_users.id = vtiger_crmentity.smownerid 564 WHERE vtiger_crmentity.deleted = 0 565 AND vtiger_service.serviceid = ".$id; 566 567 $return_value = GetRelatedList($this_module, $related_module, $other, $query, $button, $returnset); 568 569 if($return_value == null) $return_value = Array(); 570 $return_value['CUSTOM_BUTTON'] = $button; 571 572 $log->debug("Exiting get_purchase_orders method ..."); 573 return $return_value; 574 } 575 576 /** function used to get the list of sales orders which are related to the service 577 * @param int $id - service id 578 * @return array - array which will be returned from the function GetRelatedList 579 */ 580 function get_salesorder($id, $cur_tab_id, $rel_tab_id, $actions=false) { 581 global $log, $singlepane_view,$currentModule,$current_user; 582 $log->debug("Entering get_salesorder(".$id.") method ..."); 583 $this_module = $currentModule; 584 585 $related_module = vtlib_getModuleNameById($rel_tab_id); 586 require_once("modules/$related_module/$related_module.php"); 587 $other = new $related_module(); 588 vtlib_setup_modulevars($related_module, $other); 589 $singular_modname = vtlib_toSingular($related_module); 590 591 $parenttab = getParentTab(); 592 593 if($singlepane_view == 'true') 594 $returnset = '&return_module='.$this_module.'&return_action=DetailView&return_id='.$id; 595 else 596 $returnset = '&return_module='.$this_module.'&return_action=CallRelatedList&return_id='.$id; 597 598 $button = ''; 599 600 if($actions) { 601 if(is_string($actions)) $actions = explode(',', strtoupper($actions)); 602 if(in_array('SELECT', $actions) && isPermitted($related_module,4, '') == 'yes') { 603 $button .= "<input title='".getTranslatedString('LBL_SELECT')." ". getTranslatedString($related_module). "' class='crmbutton small edit' type='button' onclick=\"return window.open('index.php?module=$related_module&return_module=$currentModule&action=Popup&popuptype=detailview&select=enable&form=EditView&form_submit=false&recordid=$id&parenttab=$parenttab','test','width=640,height=602,resizable=0,scrollbars=0');\" value='". getTranslatedString('LBL_SELECT'). " " . getTranslatedString($related_module) ."'> "; 604 } 605 if(in_array('ADD', $actions) && isPermitted($related_module,1, '') == 'yes') { 606 $button .= "<input title='".getTranslatedString('LBL_ADD_NEW'). " ". getTranslatedString($singular_modname) ."' class='crmbutton small create'" . 607 " onclick='this.form.action.value=\"EditView\";this.form.module.value=\"$related_module\"' type='submit' name='button'" . 608 " value='". getTranslatedString('LBL_ADD_NEW'). " " . getTranslatedString($singular_modname) ."'> "; 609 } 610 } 611 612 $userNameSql = getSqlForNameInDisplayFormat(array('first_name'=>'vtiger_users.first_name', 'last_name' => 613 'vtiger_users.last_name'), 'Users'); 614 $query = "SELECT vtiger_crmentity.*, 615 vtiger_salesorder.*, 616 vtiger_service.servicename AS servicename, 617 vtiger_account.accountname, 618 case when (vtiger_users.user_name not like '') then $userNameSql 619 else vtiger_groups.groupname end as user_name 620 FROM vtiger_salesorder 621 INNER JOIN vtiger_crmentity 622 ON vtiger_crmentity.crmid = vtiger_salesorder.salesorderid 623 INNER JOIN vtiger_inventoryproductrel 624 ON vtiger_inventoryproductrel.id = vtiger_salesorder.salesorderid 625 INNER JOIN vtiger_service 626 ON vtiger_service.serviceid = vtiger_inventoryproductrel.productid 627 LEFT OUTER JOIN vtiger_account 628 ON vtiger_account.accountid = vtiger_salesorder.accountid 629 LEFT JOIN vtiger_invoice_recurring_info 630 ON vtiger_invoice_recurring_info.start_period = vtiger_salesorder.salesorderid 631 LEFT JOIN vtiger_groups 632 ON vtiger_groups.groupid = vtiger_crmentity.smownerid 633 LEFT JOIN vtiger_salesordercf 634 ON vtiger_salesordercf.salesorderid = vtiger_salesorder.salesorderid 635 LEFT JOIN vtiger_sobillads 636 ON vtiger_sobillads.sobilladdressid = vtiger_salesorder.salesorderid 637 LEFT JOIN vtiger_soshipads 638 ON vtiger_soshipads.soshipaddressid = vtiger_salesorder.salesorderid 639 LEFT JOIN vtiger_users 640 ON vtiger_users.id = vtiger_crmentity.smownerid 641 WHERE vtiger_crmentity.deleted = 0 642 AND vtiger_service.serviceid = ".$id; 643 644 $return_value = GetRelatedList($this_module, $related_module, $other, $query, $button, $returnset); 645 646 if($return_value == null) $return_value = Array(); 647 $return_value['CUSTOM_BUTTON'] = $button; 648 649 $log->debug("Exiting get_salesorder method ..."); 650 return $return_value; 651 } 652 653 /** function used to get the list of invoices which are related to the service 654 * @param int $id - service id 655 * @return array - array which will be returned from the function GetRelatedList 656 */ 657 function get_invoices($id, $cur_tab_id, $rel_tab_id, $actions=false) { 658 global $log, $singlepane_view,$currentModule,$current_user; 659 $log->debug("Entering get_invoices(".$id.") method ..."); 660 $this_module = $currentModule; 661 662 $related_module = vtlib_getModuleNameById($rel_tab_id); 663 require_once("modules/$related_module/$related_module.php"); 664 $other = new $related_module(); 665 vtlib_setup_modulevars($related_module, $other); 666 $singular_modname = vtlib_toSingular($related_module); 667 668 $parenttab = getParentTab(); 669 670 if($singlepane_view == 'true') 671 $returnset = '&return_module='.$this_module.'&return_action=DetailView&return_id='.$id; 672 else 673 $returnset = '&return_module='.$this_module.'&return_action=CallRelatedList&return_id='.$id; 674 675 $button = ''; 676 677 if($actions) { 678 if(is_string($actions)) $actions = explode(',', strtoupper($actions)); 679 if(in_array('SELECT', $actions) && isPermitted($related_module,4, '') == 'yes') { 680 $button .= "<input title='".getTranslatedString('LBL_SELECT')." ". getTranslatedString($related_module). "' class='crmbutton small edit' type='button' onclick=\"return window.open('index.php?module=$related_module&return_module=$currentModule&action=Popup&popuptype=detailview&select=enable&form=EditView&form_submit=false&recordid=$id&parenttab=$parenttab','test','width=640,height=602,resizable=0,scrollbars=0');\" value='". getTranslatedString('LBL_SELECT'). " " . getTranslatedString($related_module) ."'> "; 681 } 682 if(in_array('ADD', $actions) && isPermitted($related_module,1, '') == 'yes') { 683 $button .= "<input title='".getTranslatedString('LBL_ADD_NEW'). " ". getTranslatedString($singular_modname) ."' class='crmbutton small create'" . 684 " onclick='this.form.action.value=\"EditView\";this.form.module.value=\"$related_module\"' type='submit' name='button'" . 685 " value='". getTranslatedString('LBL_ADD_NEW'). " " . getTranslatedString($singular_modname) ."'> "; 686 } 687 } 688 689 $userNameSql = getSqlForNameInDisplayFormat(array('first_name'=> 690 'vtiger_users.first_name', 'last_name' => 'vtiger_users.last_name'), 'Users'); 691 $query = "SELECT vtiger_crmentity.*, 692 vtiger_invoice.*, 693 vtiger_inventoryproductrel.quantity, 694 vtiger_account.accountname, 695 case when (vtiger_users.user_name not like '') then $userNameSql 696 else vtiger_groups.groupname end as user_name 697 FROM vtiger_invoice 698 INNER JOIN vtiger_crmentity 699 ON vtiger_crmentity.crmid = vtiger_invoice.invoiceid 700 LEFT OUTER JOIN vtiger_account 701 ON vtiger_account.accountid = vtiger_invoice.accountid 702 INNER JOIN vtiger_inventoryproductrel 703 ON vtiger_inventoryproductrel.id = vtiger_invoice.invoiceid 704 LEFT JOIN vtiger_groups 705 ON vtiger_groups.groupid = vtiger_crmentity.smownerid 706 LEFT JOIN vtiger_invoicecf 707 ON vtiger_invoicecf.invoiceid = vtiger_invoice.invoiceid 708 LEFT JOIN vtiger_invoicebillads 709 ON vtiger_invoicebillads.invoicebilladdressid = vtiger_invoice.invoiceid 710 LEFT JOIN vtiger_invoiceshipads 711 ON vtiger_invoiceshipads.invoiceshipaddressid = vtiger_invoice.invoiceid 712 LEFT JOIN vtiger_users 713 ON vtiger_users.id = vtiger_crmentity.smownerid 714 WHERE vtiger_crmentity.deleted = 0 715 AND vtiger_inventoryproductrel.productid = ".$id; 716 717 $return_value = GetRelatedList($this_module, $related_module, $other, $query, $button, $returnset); 718 719 if($return_value == null) $return_value = Array(); 720 $return_value['CUSTOM_BUTTON'] = $button; 721 722 $log->debug("Exiting get_invoices method ..."); 723 return $return_value; 724 } 725 726 /** function used to get the list of pricebooks which are related to the service 727 * @param int $id - service id 728 * @return array - array which will be returned from the function GetRelatedList 729 */ 730 function get_service_pricebooks($id, $cur_tab_id, $rel_tab_id, $actions=false) { 731 global $currentModule,$log,$singlepane_view,$mod_strings; 732 $log->debug("Entering get_service_pricebooks(".$id.") method ..."); 733 734 $related_module = vtlib_getModuleNameById($rel_tab_id); 735 checkFileAccessForInclusion("modules/$related_module/$related_module.php"); 736 require_once("modules/$related_module/$related_module.php"); 737 $focus = new $related_module(); 738 $singular_modname = vtlib_toSingular($related_module); 739 740 if($singlepane_view == 'true') 741 $returnset = "&return_module=$currentModule&return_action=DetailView&return_id=$id"; 742 else 743 $returnset = "&return_module=$currentModule&return_action=CallRelatedList&return_id=$id"; 744 745 $button = ''; 746 if($actions) { 747 if(is_string($actions)) $actions = explode(',', strtoupper($actions)); 748 if(in_array('SELECT', $actions) && isPermitted($related_module,1, '') == 'yes' && isPermitted($currentModule,'EditView',$id) == 'yes') { 749 $button .= "<input title='".getTranslatedString('LBL_ADD_TO'). " ". getTranslatedString($related_module) ."' class='crmbutton small create'" . 750 " onclick='this.form.action.value=\"AddServiceToPriceBooks\";this.form.module.value=\"$currentModule\"' type='submit' name='button'" . 751 " value='". getTranslatedString('LBL_ADD_TO'). " " . getTranslatedString($singular_modname) ."'> "; 752 } 753 } 754 755 $query = "SELECT vtiger_crmentity.crmid, 756 vtiger_pricebook.*, 757 vtiger_pricebookproductrel.productid as prodid 758 FROM vtiger_pricebook 759 INNER JOIN vtiger_crmentity 760 ON vtiger_crmentity.crmid = vtiger_pricebook.pricebookid 761 INNER JOIN vtiger_pricebookproductrel 762 ON vtiger_pricebookproductrel.pricebookid = vtiger_pricebook.pricebookid 763 INNER JOIN vtiger_pricebookcf 764 ON vtiger_pricebookcf.pricebookid = vtiger_pricebook.pricebookid 765 WHERE vtiger_crmentity.deleted = 0 766 AND vtiger_pricebookproductrel.productid = ".$id; 767 $log->debug("Exiting get_product_pricebooks method ..."); 768 769 $return_value = GetRelatedList($currentModule, $related_module, $focus, $query, $button, $returnset); 770 771 if($return_value == null) $return_value = Array(); 772 $return_value['CUSTOM_BUTTON'] = $button; 773 774 $log->debug("Exiting get_service_pricebooks method ..."); 775 return $return_value; 776 } 777 778 779 /** Function to display the Services which are related to the PriceBook 780 * @param string $query - query to get the list of products which are related to the current PriceBook 781 * @param object $focus - PriceBook object which contains all the information of the current PriceBook 782 * @param string $returnset - return_module, return_action and return_id which are sequenced with & to pass to the URL which is optional 783 * 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 Service entries 784 */ 785 function getPriceBookRelatedServices($query,$focus,$returnset='') 786 { 787 global $log; 788 $log->debug("Entering getPriceBookRelatedServices(".$query.",".get_class($focus).",".$returnset.") method ..."); 789 790 global $adb; 791 global $app_strings; 792 global $current_language,$current_user; 793 $current_module_strings = return_module_language($current_language, 'Services'); 794 $no_of_decimal_places = getCurrencyDecimalPlaces(); 795 global $list_max_entries_per_page; 796 global $urlPrefix; 797 798 global $theme; 799 $pricebook_id = $_REQUEST['record']; 800 $theme_path="themes/".$theme."/"; 801 $image_path=$theme_path."images/"; 802 803 $computeCount = $_REQUEST['withCount']; 804 if(PerformancePrefs::getBoolean('LISTVIEW_COMPUTE_PAGE_COUNT', false) === true || 805 ((boolean) $computeCount) == true){ 806 $noofrows = $adb->query_result($adb->query(Vtiger_Functions::mkCountQuery($query)),0,'count'); 807 }else{ 808 $noofrows = null; 809 } 810 $module = 'PriceBooks'; 811 $relatedmodule = 'Services'; 812 if(!$_SESSION['rlvs'][$module][$relatedmodule]) 813 { 814 $modObj = new ListViewSession(); 815 $modObj->sortby = $focus->default_order_by; 816 $modObj->sorder = $focus->default_sort_order; 817 $_SESSION['rlvs'][$module][$relatedmodule] = get_object_vars($modObj); 818 } 819 if(isset($_REQUEST['relmodule']) && $_REQUEST['relmodule']!='' && $_REQUEST['relmodule'] == $relatedmodule) { 820 $relmodule = vtlib_purify($_REQUEST['relmodule']); 821 if($_SESSION['rlvs'][$module][$relmodule]) { 822 setSessionVar($_SESSION['rlvs'][$module][$relmodule],$noofrows,$list_max_entries_per_page,$module,$relmodule); 823 } 824 } 825 global $relationId; 826 $start = RelatedListViewSession::getRequestCurrentPage($relationId, $query); 827 $navigation_array = VT_getSimpleNavigationValues($start, $list_max_entries_per_page, 828 $noofrows); 829 830 $limit_start_rec = ($start-1) * $list_max_entries_per_page; 831 832 if( $adb->dbType == "pgsql") 833 $list_result = $adb->pquery($query. 834 " OFFSET $limit_start_rec LIMIT $list_max_entries_per_page", array()); 835 else 836 $list_result = $adb->pquery($query. 837 " LIMIT $limit_start_rec, $list_max_entries_per_page", array()); 838 839 $header=array(); 840 $header[]=$current_module_strings['LBL_LIST_SERVICE_NAME']; 841 if(getFieldVisibilityPermission('Services', $current_user->id, 'unit_price') == '0') 842 $header[]=$current_module_strings['LBL_SERVICE_UNIT_PRICE']; 843 $header[]=$current_module_strings['LBL_PB_LIST_PRICE']; 844 if(isPermitted("PriceBooks","EditView","") == 'yes' || isPermitted("PriceBooks","Delete","") == 'yes') 845 $header[]=$app_strings['LBL_ACTION']; 846 847 $currency_id = $focus->column_fields['currency_id']; 848 $numRows = $adb->num_rows($list_result); 849 for($i=0; $i<$numRows; $i++) { 850 $entity_id = $adb->query_result($list_result,$i,"crmid"); 851 $unit_price = $adb->query_result($list_result,$i,"unit_price"); 852 if($currency_id != null) { 853 $prod_prices = getPricesForProducts($currency_id, array($entity_id),'Services'); 854 $unit_price = $prod_prices[$entity_id]; 855 } 856 $listprice = $adb->query_result($list_result,$i,"listprice"); 857 $field_name=$entity_id."_listprice"; 858 859 $entries = Array(); 860 $entries[] = textlength_check($adb->query_result($list_result,$i,"servicename")); 861 if(getFieldVisibilityPermission('Services', $current_user->id, 'unit_price') == '0') 862 $entries[] = CurrencyField::convertToUserFormat($unit_price, null, true); 863 864 $entries[] = CurrencyField::convertToUserFormat($listprice, null, true); 865 $action = ""; 866 if(isPermitted("PriceBooks","EditView","") == 'yes' && isPermitted('Services', 'EditView', $entity_id) == 'yes') { 867 $action .= '<img style="cursor:pointer;" src="themes/images/editfield.gif" 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"].'"/>'; 868 } else { 869 $action .= '<img src="'. vtiger_imageurl('blank.gif', $theme).'" border="0" />'; 870 } 871 if(isPermitted("PriceBooks","Delete","") == 'yes' && isPermitted('Services', 'Delete', $entity_id) == 'yes') 872 { 873 if($action != "") 874 $action .= ' | '; 875 $action .= '<img src="themes/images/delete.gif" 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">'; 876 } 877 if($action != "") 878 $entries[] = $action; 879 $entries_list[] = $entries; 880 } 881 $navigationOutput[] = getRecordRangeMessage($list_result, $limit_start_rec,$noofrows); 882 $navigationOutput[] = getRelatedTableHeaderNavigation($navigation_array, '',$module,$relatedmodule,$focus->id); 883 $return_data = array('header'=>$header,'entries'=>$entries_list,'navigation'=>$navigationOutput); 884 885 $log->debug("Exiting getPriceBookRelatedServices method ..."); 886 return $return_data; 887 } 888 889 /** 890 * Move the related records of the specified list of id's to the given record. 891 * @param String This module name 892 * @param Array List of Entity Id's from which related records need to be transfered 893 * @param Integer Id of the the Record to which the related records are to be moved 894 */ 895 function transferRelatedRecords($module, $transferEntityIds, $entityId) { 896 global $adb,$log; 897 $log->debug("Entering function transferRelatedRecords ($module, $transferEntityIds, $entityId)"); 898 899 $rel_table_arr = Array("Quotes"=>"vtiger_inventoryproductrel","PurchaseOrder"=>"vtiger_inventoryproductrel","SalesOrder"=>"vtiger_inventoryproductrel", 900 "Invoice"=>"vtiger_inventoryproductrel","PriceBooks"=>"vtiger_pricebookproductrel","Documents"=>"vtiger_senotesrel"); 901 902 $tbl_field_arr = Array("vtiger_inventoryproductrel"=>"id","vtiger_pricebookproductrel"=>"pricebookid","vtiger_senotesrel"=>"notesid"); 903 904 $entity_tbl_field_arr = Array("vtiger_inventoryproductrel"=>"productid","vtiger_pricebookproductrel"=>"productid","vtiger_senotesrel"=>"crmid"); 905 906 foreach($transferEntityIds as $transferId) { 907 foreach($rel_table_arr as $rel_module=>$rel_table) { 908 $id_field = $tbl_field_arr[$rel_table]; 909 $entity_id_field = $entity_tbl_field_arr[$rel_table]; 910 // IN clause to avoid duplicate entries 911 $sel_result = $adb->pquery("select $id_field from $rel_table where $entity_id_field=? " . 912 " and $id_field not in (select $id_field from $rel_table where $entity_id_field=?)", 913 array($transferId,$entityId)); 914 $res_cnt = $adb->num_rows($sel_result); 915 if($res_cnt > 0) { 916 for($i=0;$i<$res_cnt;$i++) { 917 $id_field_value = $adb->query_result($sel_result,$i,$id_field); 918 $adb->pquery("update $rel_table set $entity_id_field=? where $entity_id_field=? and $id_field=?", 919 array($entityId,$transferId,$id_field_value)); 920 } 921 } 922 } 923 } 924 925 parent::transferRelatedRecords($module, $transferEntityIds, $entityId); 926 $log->debug("Exiting transferRelatedRecords..."); 927 } 928 929 /* 930 * Function to get the primary query part of a report 931 * @param - $module primary module name 932 * returns the query string formed on fetching the related data for report for secondary module 933 */ 934 function generateReportsQuery($module,$queryPlanner){ 935 global $current_user; 936 937 $matrix = $queryPlanner->newDependencyMatrix(); 938 $matrix->setDependency('vtiger_seproductsrel',array('vtiger_crmentityRelServices','vtiger_accountRelServices','vtiger_leaddetailsRelServices','vtiger_servicecf','vtiger_potentialRelServices')); 939 $query = "from vtiger_service 940 inner join vtiger_crmentity on vtiger_crmentity.crmid=vtiger_service.serviceid"; 941 if ($queryPlanner->requireTable("vtiger_servicecf")){ 942 $query .= " left join vtiger_servicecf on vtiger_service.serviceid = vtiger_servicecf.serviceid"; 943 } 944 if ($queryPlanner->requireTable("vtiger_usersServices")){ 945 $query .= " left join vtiger_users as vtiger_usersServices on vtiger_usersServices.id = vtiger_crmentity.smownerid"; 946 } 947 if ($queryPlanner->requireTable("vtiger_groupsServices")){ 948 $query .= " left join vtiger_groups as vtiger_groupsServices on vtiger_groupsServices.groupid = vtiger_crmentity.smownerid"; 949 } 950 if ($queryPlanner->requireTable("vtiger_seproductsrel")){ 951 $query .= " left join vtiger_seproductsrel on vtiger_seproductsrel.productid= vtiger_service.serviceid"; 952 } 953 if ($queryPlanner->requireTable("vtiger_crmentityRelServices")){ 954 $query .= " left join vtiger_crmentity as vtiger_crmentityRelServices on vtiger_crmentityRelServices.crmid = vtiger_seproductsrel.crmid and vtiger_crmentityRelServices.deleted = 0"; 955 } 956 if ($queryPlanner->requireTable("vtiger_accountRelServices")){ 957 $query .= " left join vtiger_account as vtiger_accountRelServices on vtiger_accountRelServices.accountid=vtiger_seproductsrel.crmid"; 958 } 959 if ($queryPlanner->requireTable("vtiger_leaddetailsRelServices")){ 960 $query .= " left join vtiger_leaddetails as vtiger_leaddetailsRelServices on vtiger_leaddetailsRelServices.leadid = vtiger_seproductsrel.crmid"; 961 } 962 if ($queryPlanner->requireTable("vtiger_potentialRelServices")){ 963 $query .= " left join vtiger_potential as vtiger_potentialRelServices on vtiger_potentialRelServices.potentialid = vtiger_seproductsrel.crmid"; 964 } 965 if ($queryPlanner->requireTable("vtiger_lastModifiedByServices")){ 966 $query .= " left join vtiger_users as vtiger_lastModifiedByServices on vtiger_lastModifiedByServices.id = vtiger_crmentity.modifiedby"; 967 } 968 if ($queryPlanner->requireTable("innerService")){ 969 $query .= " LEFT JOIN ( 970 SELECT vtiger_service.serviceid, 971 (CASE WHEN (vtiger_service.currency_id = 1 ) THEN vtiger_service.unit_price 972 ELSE (vtiger_service.unit_price / vtiger_currency_info.conversion_rate) END 973 ) AS actual_unit_price 974 FROM vtiger_service 975 LEFT JOIN vtiger_currency_info ON vtiger_service.currency_id = vtiger_currency_info.id 976 LEFT JOIN vtiger_productcurrencyrel ON vtiger_service.serviceid = vtiger_productcurrencyrel.productid 977 AND vtiger_productcurrencyrel.currencyid = ". $current_user->currency_id . " 978 ) AS innerService ON innerService.serviceid = vtiger_service.serviceid"; 979 } 980 return $query; 981 } 982 983 /* 984 * Function to get the secondary query part of a report 985 * @param - $module primary module name 986 * @param - $secmodule secondary module name 987 * returns the query string formed on fetching the related data for report for secondary module 988 */ 989 function generateReportsSecQuery($module,$secmodule, $queryPlanner) { 990 global $current_user; 991 $matrix = $queryPlanner->newDependencyMatrix(); 992 $matrix->setDependency('vtiger_service',array('actual_unit_price','vtiger_currency_info','vtiger_productcurrencyrel','vtiger_servicecf','vtiger_crmentityServices')); 993 $matrix->setDependency('vtiger_crmentityServices',array('vtiger_usersServices','vtiger_groupsServices','vtiger_lastModifiedByServices')); 994 if (!$queryPlanner->requireTable("vtiger_service",$matrix)){ 995 return ''; 996 } 997 $query = $this->getRelationQuery($module,$secmodule,"vtiger_service","serviceid", $queryPlanner); 998 if ($queryPlanner->requireTable("innerService")){ 999 $query .= " LEFT JOIN ( 1000 SELECT vtiger_service.serviceid, 1001 (CASE WHEN (vtiger_service.currency_id = " . $current_user->currency_id . " ) THEN vtiger_service.unit_price 1002 WHEN (vtiger_productcurrencyrel.actual_price IS NOT NULL) THEN vtiger_productcurrencyrel.actual_price 1003 ELSE (vtiger_service.unit_price / vtiger_currency_info.conversion_rate) * ". $current_user->conv_rate . " END 1004 ) AS actual_unit_price FROM vtiger_service 1005 LEFT JOIN vtiger_currency_info ON vtiger_service.currency_id = vtiger_currency_info.id 1006 LEFT JOIN vtiger_productcurrencyrel ON vtiger_service.serviceid = vtiger_productcurrencyrel.productid 1007 AND vtiger_productcurrencyrel.currencyid = ". $current_user->currency_id . ") 1008 AS innerService ON innerService.serviceid = vtiger_service.serviceid"; 1009 } 1010 if ($queryPlanner->requireTable("vtiger_crmentityServices",$matrix)){ 1011 $query .= " left join vtiger_crmentity as vtiger_crmentityServices on vtiger_crmentityServices.crmid=vtiger_service.serviceid and vtiger_crmentityServices.deleted=0"; 1012 } 1013 if ($queryPlanner->requireTable("vtiger_servicecf")){ 1014 $query .= " left join vtiger_servicecf on vtiger_service.serviceid = vtiger_servicecf.serviceid"; 1015 } 1016 if ($queryPlanner->requireTable("vtiger_usersServices")){ 1017 $query .= " left join vtiger_users as vtiger_usersServices on vtiger_usersServices.id = vtiger_crmentityServices.smownerid"; 1018 } 1019 if ($queryPlanner->requireTable("vtiger_groupsServices")){ 1020 $query .= " left join vtiger_groups as vtiger_groupsServices on vtiger_groupsServices.groupid = vtiger_crmentityServices.smownerid"; 1021 } 1022 if ($queryPlanner->requireTable("vtiger_lastModifiedByServices")){ 1023 $query .= " left join vtiger_users as vtiger_lastModifiedByServices on vtiger_lastModifiedByServices.id = vtiger_crmentityServices.modifiedby "; 1024 } 1025 if ($queryPlanner->requireTable("vtiger_createdbyServices")){ 1026 $query .= " left join vtiger_users as vtiger_createdbyServices on vtiger_createdbyServices.id = vtiger_crmentityServices.smcreatorid "; 1027 } 1028 return $query; 1029 } 1030 1031 /* 1032 * Function to get the relation tables for related modules 1033 * @param - $secmodule secondary module name 1034 * returns the array with table names and fieldnames storing relations between module and this module 1035 */ 1036 function setRelationTables($secmodule){ 1037 $rel_tables = array ( 1038 "Quotes" => array("vtiger_inventoryproductrel"=>array("productid","id"),"vtiger_service"=>"serviceid"), 1039 "PurchaseOrder" => array("vtiger_inventoryproductrel"=>array("productid","id"),"vtiger_service"=>"serviceid"), 1040 "SalesOrder" => array("vtiger_inventoryproductrel"=>array("productid","id"),"vtiger_service"=>"serviceid"), 1041 "Invoice" => array("vtiger_inventoryproductrel"=>array("productid","id"),"vtiger_service"=>"serviceid"), 1042 "PriceBooks" => array("vtiger_pricebookproductrel"=>array("productid","pricebookid"),"vtiger_service"=>"serviceid"), 1043 "Documents" => array("vtiger_senotesrel"=>array("crmid","notesid"),"vtiger_service"=>"serviceid"), 1044 ); 1045 return $rel_tables[$secmodule]; 1046 } 1047 1048 // Function to unlink all the dependent entities of the given Entity by Id 1049 function unlinkDependencies($module, $id) { 1050 global $log; 1051 $this->db->pquery('DELETE from vtiger_seproductsrel WHERE productid=? or crmid=?',array($id,$id)); 1052 1053 parent::unlinkDependencies($module, $id); 1054 } 1055 1056 /** 1057 * Invoked when special actions are performed on the module. 1058 * @param String Module name 1059 * @param String Event Type 1060 */ 1061 function vtlib_handler($moduleName, $eventType) { 1062 1063 require_once ('include/utils/utils.php'); 1064 global $adb; 1065 1066 if($eventType == 'module.postinstall') { 1067 require_once ('vtlib/Vtiger/Module.php'); 1068 1069 $moduleInstance = Vtiger_Module::getInstance($moduleName); 1070 $moduleInstance->allowSharing(); 1071 1072 $ttModuleInstance = Vtiger_Module::getInstance('HelpDesk'); 1073 $ttModuleInstance->setRelatedList($moduleInstance,'Services',array('select')); 1074 1075 $leadModuleInstance = Vtiger_Module::getInstance('Leads'); 1076 $leadModuleInstance->setRelatedList($moduleInstance,'Services',array('select')); 1077 1078 $accModuleInstance = Vtiger_Module::getInstance('Accounts'); 1079 $accModuleInstance->setRelatedList($moduleInstance,'Services',array('select')); 1080 1081 $conModuleInstance = Vtiger_Module::getInstance('Contacts'); 1082 $conModuleInstance->setRelatedList($moduleInstance,'Services',array('select')); 1083 1084 $potModuleInstance = Vtiger_Module::getInstance('Potentials'); 1085 $potModuleInstance->setRelatedList($moduleInstance,'Services',array('select')); 1086 1087 $pbModuleInstance = Vtiger_Module::getInstance('PriceBooks'); 1088 $pbModuleInstance->setRelatedList($moduleInstance,'Services',array('select'),'get_pricebook_services'); 1089 1090 // Initialize module sequence for the module 1091 $adb->pquery("INSERT into vtiger_modentity_num values(?,?,?,?,?,?)",array($adb->getUniqueId("vtiger_modentity_num"),$moduleName,'SER',1,1,1)); 1092 1093 // Mark the module as Standard module 1094 $adb->pquery('UPDATE vtiger_tab SET customized=0 WHERE name=?', array($moduleName)); 1095 1096 } else if($eventType == 'module.disabled') { 1097 // TODO Handle actions when this module is disabled. 1098 } else if($eventType == 'module.enabled') { 1099 // TODO Handle actions when this module is enabled. 1100 } else if($eventType == 'module.preuninstall') { 1101 // TODO Handle actions when this module is about to be deleted. 1102 } else if($eventType == 'module.preupdate') { 1103 // TODO Handle actions before this module is updated. 1104 } else if($eventType == 'module.postupdate') { 1105 // TODO Handle actions after this module is updated. 1106 1107 //adds sharing accsess 1108 $ServicesModule = Vtiger_Module::getInstance('Services'); 1109 Vtiger_Access::setDefaultSharing($ServicesModule); 1110 } 1111 } 1112 1113 /** Function to unlink an entity with given Id from another entity */ 1114 function unlinkRelationship($id, $return_module, $return_id) { 1115 global $log, $currentModule; 1116 $log->fatal('id:--'.$id); 1117 $log->fatal('return_module:--'.$return_module); 1118 $log->fatal('return_id:---'.$return_id); 1119 if($return_module == 'Accounts') { 1120 $focus = CRMEntity::getInstance($return_module); 1121 $entityIds = $focus->getRelatedContactsIds($return_id); 1122 array_push($entityIds, $return_id); 1123 $entityIds = implode(',', $entityIds); 1124 $return_modules = "'Accounts','Contacts'"; 1125 } else { 1126 $entityIds = $return_id; 1127 $return_modules = "'".$return_module."'"; 1128 } 1129 1130 $query = 'DELETE FROM vtiger_crmentityrel WHERE (relcrmid='.$id.' AND module IN ('.$return_modules.') AND crmid IN ('.$entityIds.')) OR (crmid='.$id.' AND relmodule IN ('.$return_modules.') AND relcrmid IN ('.$entityIds.'))'; 1131 $this->db->pquery($query, array()); 1132 } 1133 1134 /** 1135 * Function to get Product's related Products 1136 * @param integer $id - productid 1137 * returns related Products record in array format 1138 */ 1139 function get_services($id, $cur_tab_id, $rel_tab_id, $actions=false) { 1140 global $log, $singlepane_view,$currentModule,$current_user; 1141 $log->debug("Entering get_products(".$id.") method ..."); 1142 $this_module = $currentModule; 1143 1144 $related_module = vtlib_getModuleNameById($rel_tab_id); 1145 require_once("modules/$related_module/$related_module.php"); 1146 $other = new $related_module(); 1147 vtlib_setup_modulevars($related_module, $other); 1148 $singular_modname = vtlib_toSingular($related_module); 1149 1150 $parenttab = getParentTab(); 1151 1152 if($singlepane_view == 'true') 1153 $returnset = '&return_module='.$this_module.'&return_action=DetailView&return_id='.$id; 1154 else 1155 $returnset = '&return_module='.$this_module.'&return_action=CallRelatedList&return_id='.$id; 1156 1157 $button = ''; 1158 1159 if($actions && $this->ismember_check() === 0) { 1160 if(is_string($actions)) $actions = explode(',', strtoupper($actions)); 1161 if(in_array('SELECT', $actions) && isPermitted($related_module,4, '') == 'yes') { 1162 $button .= "<input title='".getTranslatedString('LBL_SELECT')." ". getTranslatedString($related_module). "' class='crmbutton small edit' type='button' onclick=\"return window.open('index.php?module=$related_module&return_module=$currentModule&action=Popup&popuptype=detailview&select=enable&form=EditView&form_submit=false&recordid=$id&parenttab=$parenttab','test','width=640,height=602,resizable=0,scrollbars=0');\" value='". getTranslatedString('LBL_SELECT'). " " . getTranslatedString($related_module) ."'> "; 1163 } 1164 if(in_array('ADD', $actions) && isPermitted($related_module,1, '') == 'yes') { 1165 $button .= "<input type='hidden' name='createmode' id='createmode' value='link' />". 1166 "<input title='".getTranslatedString('LBL_NEW'). " ". getTranslatedString($singular_modname) ."' class='crmbutton small create'" . 1167 " onclick='this.form.action.value=\"EditView\";this.form.module.value=\"$related_module\";' type='submit' name='button'" . 1168 " value='". getTranslatedString('LBL_ADD_NEW'). " " . getTranslatedString($singular_modname) ."'> "; 1169 } 1170 } 1171 1172 $query = "SELECT vtiger_service.serviceid, vtiger_service.servicename, 1173 vtiger_service.service_no, vtiger_service.commissionrate, 1174 vtiger_service.service_usageunit, vtiger_service.unit_price, 1175 vtiger_crmentity.crmid, vtiger_crmentity.smownerid 1176 FROM vtiger_service 1177 INNER JOIN vtiger_crmentity ON vtiger_crmentity.crmid = vtiger_service.serviceid 1178 INNER JOIN vtiger_servicecf 1179 ON vtiger_service.serviceid = vtiger_servicecf.serviceid 1180 LEFT JOIN vtiger_crmentityrel ON vtiger_crmentityrel.relcrmid = vtiger_service.serviceid AND vtiger_crmentityrel.module='Services' 1181 LEFT JOIN vtiger_users 1182 ON vtiger_users.id=vtiger_crmentity.smownerid 1183 LEFT JOIN vtiger_groups 1184 ON vtiger_groups.groupid = vtiger_crmentity.smownerid 1185 WHERE vtiger_crmentity.deleted = 0 AND vtiger_crmentityrel.crmid = $id "; 1186 1187 $return_value = GetRelatedList($this_module, $related_module, $other, $query, $button, $returnset); 1188 1189 if($return_value == null) $return_value = Array(); 1190 $return_value['CUSTOM_BUTTON'] = $button; 1191 1192 $log->debug("Exiting get_products method ..."); 1193 return $return_value; 1194 } 1195 } 1196 ?>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 20:08:37 2014 | Cross-referenced by PHPXref 0.7.1 |