[ Index ]

PHP Cross Reference of vtigercrm-6.1.0

title

Body

[close]

/modules/Services/ -> Services.php (source)

   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) ."'>&nbsp;";
 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) ."'>&nbsp;";
 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) ."'>&nbsp;";
 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) ."'>&nbsp;";
 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) ."'>&nbsp;";
 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) ."'>&nbsp;";
 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) ."'>&nbsp;";
 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) ."'>&nbsp;";
 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) ."'>&nbsp;";
 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 .= '&nbsp;|&nbsp;';
 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) ."'>&nbsp;";
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) ."'>&nbsp;";
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  ?>


Generated: Fri Nov 28 20:08:37 2014 Cross-referenced by PHPXref 0.7.1