HEX
Server: Apache
System: Linux server1.panigaletech.com 5.4.0-1103-aws #111~18.04.1-Ubuntu SMP Tue May 23 20:04:10 UTC 2023 x86_64
User: ubuntu (1000)
PHP: 7.4.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/dev.captainschairit.com/wp-content/plugins/cf7-salesforce/api/api.php
<?php
// Exit if accessed directly
if( !defined( 'ABSPATH' ) ) exit;

if(!class_exists('vxcf_sales_api')){
    
class vxcf_sales_api extends vxcf_sales{
  
  public $info='' ; // info
  public $error= "";
  public $timeout=30;
  public $api_version='v37.0';
  public $api_res='';
  
function __construct($info) { 
        if(isset($info['data'])){
  $this->info= $info['data'];
      }
if(!empty(self::$api_timeout)){
    $this->timeout=self::$api_timeout;
}

  }
  
  /**
  * Get New Access Token from salesforce
  * @param  array $form_id Form Id
  * @param  array $info (optional) Salesforce Credentials of a form
  * @param  array $posted_form (optional) Form submitted by the user,In case of API error this form will be sent to email
  * @return array  Salesforce API Access Informations
  */
public function get_token($info=""){
  if(!is_array($info)){
  $info=$this->info;
  }
  if(!isset($info['refresh_token']) || empty($info['refresh_token'])){
   return $info;   
  }
  $client=$this->client_info(); 
  ////////it is oauth    
  $body=array("client_id"=>$client['client_id'],"client_secret"=>$client['client_secret'],"redirect_uri"=>$client['call_back'],"grant_type"=>"refresh_token","refresh_token"=>$info['refresh_token']);
     $env='login';
      if( !empty($info['env'])){
       $env='test';  
      }
  $res=$this->post_sales('token',"https://$env.salesforce.com/services/oauth2/token","post",$body);

  $re=json_decode($res,true); 
  if(isset($re['access_token']) && $re['access_token'] !=""){ 
  $info["access_token"]=$re['access_token'];
  $info["instance_url"]=$re['instance_url'];
  $info["issued_at"]=$re['issued_at'];
//  $info["org_id"]=$re['id'];
  $info["class"]='updated';
  $token=$info;
  }else{
  $info['error']=$re['error_description'];
  $info['access_token']="";
   $info["class"]='error';
  $token=array(array('errorCode'=>'406','message'=>$re['error_description']));

  }
  $info["valid_api"]=current_time('timestamp')+86400; //api validity check
  //update salesforce info 
  //got new token , so update it in db
  $this->update_info( array("data"=> $info),$info['id']); 
  return $info; 
  }
public function handle_code(){
      $info=$this->info;
      $id=$info['id'];

        $client=$this->client_info();
  $log_str=$res=""; $token=array();
  if(isset($_REQUEST['code'])){
  $code=$this->post('code');   
  if(!empty($code)){
      $env='login';
      if(!empty($_REQUEST['vx_env']) || !empty($info['env'])){
       $env='test'; $info['env']='test';  
      }
  $body=array("client_id"=>$client['client_id'],"client_secret"=>$client['client_secret'],"redirect_uri"=>$client['call_back'],"grant_type"=>"authorization_code","code"=>$code);
  $res=$this->post_sales("token","https://$env.salesforce.com/services/oauth2/token","post",$body);
  
  $log_str="Getting access token from code";
   $token=json_decode($res,true); 
   if(!isset($token['access_token'])){
      $log_str.=" =".$res; 
   }
  }
  if(isset($_REQUEST['error'])){
   $token['error_description']=$this->post('error_description');   
  }
  }else{  
  //revoke token on user request

  if(isset($info['instance_url']) && $info['instance_url']!="")
  $res=$this->request($info['instance_url']."/services/oauth2/revoke?token=".$info['refresh_token'],"get","");  
  $log_str="Access token Revoked on Request";
  }
 
  $info['instance_url']=$this->post('instance_url',$token);
  $info['access_token']=$this->post('access_token',$token);
  $info['client_id']=$client['client_id'];
  $info['_id']=$this->post('id',$token);
  $info['refresh_token']=$this->post('refresh_token',$token);
  $info['issued_at']=time();
  $info['signature']=$this->post('signature',$token);
  $info['sales_token_time']=current_time('timestamp');
  $info['error']=$this->post('error_description',$token);
  $info['api']="api";
  $info["class"]='error';
  if(!empty($info['access_token'])){
  $info["class"]='updated';
  }
  $this->info=$info;
 // $info=$this->validate_api($info);
  $this->update_info( array('data'=> $info) , $id); 
  return $info;
}
  /**
  * Posts data to salesforce, Get New access token on expiration message from salesforce
  * @param  string $path salesforce path 
  * @param  string $method CURL method 
  * @param  array $body (optional) if you want to post data
  * @return array Salesforce Response array
  */
  public  function post_sales_arr($path,$method,$body=""){
  $info=$this->info;    
  $get_token=false; $error=array(array( 'errorCode'=>'2005' , 'message'=>__('No Access to Salesforce API - 2005','gravity-forms-salesforce-crm'))); 
if(!isset($info['instance_url']) || empty($info['instance_url'])){
    return $error;
}
  $url=$info['instance_url'];
  $dev_key=$info['access_token'];
  $head=array(); 
  if(!empty($body) && is_array($body)){ 
  if(isset($body['disable_rules'])){
  $head['Sforce-Auto-Assign']='false'; 
  unset($body['disable_rules']);   
  }
  $body=json_encode($body);

  }
if(!empty($dev_key)){
  $sales_res=$this->post_sales($dev_key,$url.$path,$method,$body,$head); 
  $sales_response=json_decode($sales_res,true); 
}else{
  $get_token=true;    
}
  if(isset($sales_response[0]['errorCode']) && $sales_response[0]['errorCode'] == "INVALID_SESSION_ID"){ 
  $get_token=true;         
  }

  if($get_token){ 
  ////////////try to get new token
  $token=$this->get_token();     
  if(!empty($token['access_token'])){
  $dev_key=$token['access_token'];     
  $url=$token['instance_url'];
  $sales_res=$this->post_sales($dev_key,$url.$path,$method,$body,$head);
  $sales_response=json_decode($sales_res,true);  
  }else{
      return $error;
  } }
  $this->api_res=$sales_res; 
  return $sales_response;   
  }
  /**
  * Posts data to salesforce
  * @param  string $dev_key Slesforce Access Token 
  * @param  string $path Salesforce Path 
  * @param  string $method CURL method 
  * @param  string $body (optional) if you want to post data 
  * @return string Salesforce Response JSON
  */
  public function post_sales($dev_key,$path,$method,$body="",$head=''){
  
  if($dev_key == 'token'){
  $header=array('content-type'=>'application/x-www-form-urlencoded');   
  }else{
  $header=array("Authorization"=>' Bearer ' . $dev_key,'content-type'=>'application/json');     
  if(!empty($head) && is_array($head)){ $header=array_merge($header,$head);  }
  }
  if(is_array($body)&& count($body)>0)
  { $body=http_build_query($body);
  }
  if($method != "get"){
$header['content-length']= !empty($body) ? strlen($body) : 0;
  }   
  $response = wp_remote_post( $path, array(
  'method' => strtoupper($method),
  'timeout' => $this->timeout,
  'headers' => $header,
  'body' => $body
  )
  );

  return !is_wp_error($response) && isset($response['body']) ? $response['body'] : "";
  }
  /**
  * Get Salesforce Client Information
  * @param  array $info (optional) Salesforce Client Information Saved in Database
  * @return array Salesforce Client Information
  */
  public function client_info(){
      $info=$this->info;
  $client_id= "3MVG9A2kN3Bn17hv8jZKWJ31Px1IqJczU2PfHT4_qS9Fr61h7m5R4PhRELnDAWu.aa_rbBirpGMRR56AFa4kg";
  $client_secret="7441227697513084813";
  $call_back="https://www.crmperks.com/sf_auth/";
  //custom app
  if(is_array($info)){
      if($this->post('custom_app',$info) == "yes" && $this->post('app_id',$info) !="" && $this->post('app_secret',$info) !="" && $this->post('app_url',$info) !=""){
     $client_id=$this->post('app_id',$info);     
     $client_secret=$this->post('app_secret',$info);     
     $call_back=$this->post('app_url',$info);     
      }
  }
  return array("client_id"=>$client_id,"client_secret"=>$client_secret,"call_back"=>$call_back);
  }
  
  /**
  * Get fields from salesforce
  * @param  string $form_id Form Id
  * @param  array $form (optional) Form Settings 
  * @param  array $request (optional) custom array or $_REQUEST 
  * @return array Salesforce fields
  */
  public function get_crm_fields($object,$is_options=false){ 

$sales_response=$this->post_sales_arr('/services/data/'.$this->api_version.'/sobjects/'.ucfirst($object)."/describe","get",""); 
//var_dump($sales_response);
  ///seprating fields
  if(isset($sales_response['fields']) && is_array($sales_response['fields'])){
      
      if(isset($this->id) && $this->id == 'vxc_sales' && in_array($object,array("Order",'Opportunity','Quote'))){
         $line_object=$object.'LineItem';
          if($object == 'Order'){ $line_object='OrderItem';  }
       $item_res=$this->post_sales_arr('/services/data/'.$this->api_version.'/sobjects/'.$line_object."/describe","get",""); 

       if(!empty($item_res['fields'])){ 
           foreach($item_res['fields'] as $v){
               if(isset($v['name']) && !in_array($v['name'],array('OrderId','PricebookEntryId','Id','Quantity','UnitPrice'))){ //
                 $v['is_item']='1';
                 if(isset($v['defaultedOnCreate'])){
                   $v['defaultedOnCreate']='1';  
                 }
                 if(isset($v['custom'])){
                   $v['custom']=false;  
                 }
                 $v['name']='vxline_'.$v['name'];
                 $v['label']='Line Item - '.$v['label'];
                   $sales_response['fields'][]=$v;  
               }
           }
       }   
      }
  $field_info=array();
  foreach($sales_response['fields'] as $k=>$field){ 
  
        if( (isset($field['createable']) && $field['createable'] ==true) || $field['name'] == 'Id' || (isset($field['custom']) && $field['custom'] ==true) ){
        
          $required=""; 
  if( !empty($field['nameField']) || (!empty($field['createable']) && empty($field['nillable']) && empty($field['defaultedOnCreate']) )  ){ // && !in_array($field['name'],array('Quantity','UnitPrice'))
  $required="true";   
  } 
  $type=$field['type'];
  if($type == 'reference' && !empty($field['referenceTo']) && is_array($field['referenceTo'])){
   $type=reset($field['referenceTo']);   
  }
  $field_arr=array('name'=>$field['name'],"type"=>$type);
  $field_arr['label']=$field['label']; 
  $field_arr['req']=$required;
  $field_arr["maxlength"]=$field['length'];
  $field_arr["custom"]=$field['custom']; 
  $field_name=$field['name'];
  if(isset($field['is_item'])){   
  $field_arr["is_item"]='1';  
  }
         if(isset($field['picklistValues']) && is_array($field['picklistValues']) && count($field['picklistValues'])>0){
         $field_arr['options']=$field['picklistValues'];
             $egs=array();
         foreach($field['picklistValues'] as $op){
         $egs[]=$op['value'].'='.$op['label'];    
         }
            $field_arr['eg']=implode(', ',array_slice($egs,0,30));
          }
    
          
      if($is_options ){
          if(!empty($field_arr['options'])){
       $field_info[$field_name]=$field_arr;
          } 
      }else{
  
  $field_info[$field_name]=$field_arr;  
  } }
      
  } 
  if(isset($field_info['Id'])){
     $id=$field_info['Id'];
     unset($field_info['Id']);
   $field_info['Id']=$id;   
  }
   if(in_array($object,array("Lead",'Contact'))){
  $field_info['vx_camp_id']=array('name'=>'vx_camp_id',"type"=>'string','label'=>'Campaign Id','custom'=>true);
  }
  $field_info['vx_list_files']=array('name'=>'vx_list_files',"type"=>'files','label'=>'Files - Related List','custom'=>true);
  $field_info['vx_list_files2']=array('name'=>'vx_list_files2',"type"=>'files','label'=>'Files 2 - Related List','custom'=>true);
  $field_info['vx_list_files3']=array('name'=>'vx_list_files3',"type"=>'files','label'=>'Files 3 - Related List','custom'=>true);
  $field_info['vx_list_files4']=array('name'=>'vx_list_files4',"type"=>'files','label'=>'Files 4 - Related List','custom'=>true);
  $field_info['vx_list_files5']=array('name'=>'vx_list_files5',"type"=>'files','label'=>'Files 5 - Related List','custom'=>true);
  $field_info['vx_list_files6']=array('name'=>'vx_list_files6',"type"=>'files','label'=>'Files 6 - Related List','custom'=>true);
  $field_info['vx_list_files7']=array('name'=>'vx_list_files7',"type"=>'files','label'=>'Files 7 - Related List','custom'=>true);
  $field_info['vx_list_files8']=array('name'=>'vx_list_files8',"type"=>'files','label'=>'Files 8 - Related List','custom'=>true);
  $field_info['vx_list_files9']=array('name'=>'vx_list_files9',"type"=>'files','label'=>'Files 9 - Related List','custom'=>true);
  $field_info['vx_list_files10']=array('name'=>'vx_list_files10',"type"=>'files','label'=>'Files 10 - Related List','custom'=>true);
  if(in_array($object,array("Order",'Opportunity','Quote'))){
  $field_info['vx_ship_total']=array('name'=>'vx_ship_total',"type"=>'number','label'=>'Shipping Total','custom'=>true);
  $field_info['vx_ship_entry']=array('name'=>'vx_ship_entry',"type"=>'text','label'=>'Price Book ID Entry of Shipping Item','custom'=>true);
  }
  return $field_info;
  }
  $msg=__("No Fields Found",'gravity-forms-salesforce-crm');
  if(isset($sales_response[0]['errorCode'])){
  $msg=$sales_response[0]['message'];    
  }
  if(isset($sales_response['error'])){
  $msg=$sales_response['error'];    
  } 

  return $msg;
  }
    
  /**
  * Get campaigns from salesforce
  * @return array Salesforce campaigns
  */
  public function get_campaigns(){ 

$q="SELECT Name,Id FROM Campaign";
  $query='/services/data/'.$this->api_version.'/query?q='.urlencode($q);
  $sales_response=$this->post_sales_arr($query,"get");
  $field_info=__('No Campaigns Found','gravity-forms-salesforce-crm');
  if(!empty($sales_response['records'])){
  $field_info=array();
  foreach($sales_response['records'] as $k=>$field){
  $field_info[$field['Id']]=$field['Name'];     
  }
  }
    if(isset($sales_response[0]['errorCode'])){
   $field_info=$sales_response[0]['message'];   
  }
  return $field_info;
}
  /**
  * Get users from salesforce
  * @return array Salesforce users
  */
  public function get_users(){ 
       $q='SELECT email , name , id from User';
  $sales_response=$this->post_sales_arr("/services/data/v27.0/query?q=".urlencode($q) ,"get","");
  ///seprating fields
  $field_info=__('No Users Found','gravity-forms-salesforce-crm');
  if(isset($sales_response['records']) && is_array($sales_response['records'])){
  $field_info=array();
  foreach($sales_response['records'] as $k=>$field){
  $field_info[$field['Id']]=$field['Name'].' ( '.$field['Email'].' )';     
  }
  $q="SELECT Id,Name FROM GROUP WHERE TYPE='Queue'";
$query='/services/data/'.$this->api_version.'/query?q='.urlencode($q);
$sales_response=$this->post_sales_arr($query,"get");
  if(isset($sales_response['records']) && is_array($sales_response['records'])){
  foreach($sales_response['records'] as $k=>$field){
  $field_info[$field['Id']]=$field['Name'].' (Queue)';     
  }
  }
  }
    if(isset($sales_response[0]['errorCode'])){
   $field_info=$sales_response[0]['message'];   
  } 
  return $field_info;
}
  /**
  * Get users from salesforce
  * @return array Salesforce users
  */
  public function get_price_books(){ 
$q= "SELECT Id,Name,Description from Pricebook2 Limit 3000";
  $sales_response=$this->post_sales_arr('/services/data/'.$this->api_version.'/query?q='.urlencode($q) ,"get","");
  ///seprating fields
  $field_info=__('No Price Book Found','gravity-forms-salesforce-crm');
  if(isset($sales_response['records']) && is_array($sales_response['records'])){
  $field_info=array();
  foreach($sales_response['records'] as $k=>$field){
  $field_info[$field['Id']]=$field['Name'];     
  }
  }
    if(isset($sales_response[0]['errorCode'])){
   $field_info=$sales_response[0]['message'];   
  } 
  return $field_info;
}
/**
* campaign member status list
* 
*/
  public function get_member_status(){ 
  $sales_response=$this->post_sales_arr("/services/data/v27.0/sobjects/CampaignMember/describe","get","");
  $field_info=__('Status List Not Found','gravity-forms-salesforce-crm');
  if(isset($sales_response['fields']) && is_array($sales_response['fields'])){
  $field_info=array();
  foreach($sales_response['fields'] as $field){
      if(isset($field['name']) && $field['name'] == "Status" && isset($field['picklistValues']) && is_array($field['picklistValues'])){
       foreach($field['picklistValues'] as $k=>$v){
       if(isset($v['value'])){ 
         $field_info[$v['value']]=$v['label'];  
       }     
       }
       break;  
      }  
  }
  }
    if(isset($sales_response['errorCode'])){
   $field_info=$sales_response['message'];   
  }
  return $field_info;
}
  /**
  * Get Objects from salesforce
  * @return array
  */
  public function get_crm_objects(){

  $sales_res=$this->post_sales_arr('/services/data/'.$this->api_version.'/sobjects/',"get","");

  $fields=array();
  if(isset($sales_res['sobjects'])){
  foreach($sales_res['sobjects'] as $object){
  if($object['createable'] == true && $object['layoutable'] == true){
  $fields[$object['name']]=$object['label'];  
  }    
  }
  return $fields;
  }
  $msg="No Objects Found";
  if(isset($sales_res[0]['errorCode'])){
  $msg=$sales_res[0]['message'];    
  }
  return $msg;
  }
  /**
  * Send data to Salesforce using wp_remote_post()
  *
  * @filter gf_salesforce_salesforce_debug_email Disable debug emails (even if you have debugging enabled) by returning false.
  * @filter gf_salesforce_salesforce_debug_email_address Modify the email address Salesforce sends debug information to
  * @param  array  $post  Data to send to Salesforce
  * @param  boolean $test Is this just testing the OID configuration and not actually sendinghelpful data?
  * @return array|false         If the Salesforce server returns a non-standard code, an empty array is returned. If there is an error, `false` is returned. Otherwise, the `wp_remote_request` results array is returned.
  */
public function post_web($post,$info,$object='Lead', $test = false) {
  global $wp_version;
  // Web-to-Lead uses `oid` and Web to Case uses `orgid`
  switch($object) {
  case 'Case':
  $post['orgid'] = $this->post('org_id',$info);
  break;
  case 'Lead':
  $post['oid'] =$this->post('org_id',$info);
  break;
  }
//var_dump($post); die();
  // We need an Org ID to post to Salesforce successfully.
  if(empty($post['oid']) && empty($post['orgid'])) {
  
  return NULL;
  }
$header=array(
  'user-agent' => 'Woocommerce Salesforce Plugin plugin - WordPress/'.$wp_version.'; '.get_bloginfo('url')
  );
//in web2lead first name and lasty name and email should be unique  
// $header['Content-Type']='application/x-www-form-urlencoded'; 
//var_dump($post); die('--------');

if(!empty($post) && is_array($post)){
$files=$body=array();
foreach($post as $k=>$v){
    if(is_array($v)){
        foreach($v as $vv){
     $body[]=urlencode($k).'='.urlencode($vv);       
        }
    }else{
  $body[]=urlencode($k).'='.urlencode($v);       
    }
}

$post=implode('&',$body);
}

//$post=http_build_query($post);
  // Set SSL verify to false because of server issues.
  $args = array(
  'body'      => $post,
  'headers'   => $header,
  'timeout' => $this->timeout,
 // 'sslverify' => false
  );
  
  // Use test/www subdomain based on whether this is a test or live
  $sub =$test ? 'test' : 'webto' ;
  $url='https://'.$sub.'.salesforce.com/';
  $org_url=$this->post('org_url',$info);
  if(!empty($org_url)){
      $url=trailingslashit($org_url);
  }
  // Use (test|www) subdomain and WebTo(Lead|Case) based on setting
  $url =$url.sprintf('servlet/servlet.WebTo%s?encoding=UTF-8', $object);
  // POST the data to Salesforce
  $result = wp_remote_post($url, $args);

///var_dump($result,$url,$post); die();
  // There was an error
  if(is_wp_error( $result )) {
 // return NULL;
  }
  $done=array('entry created'=>'TRUE');
  // Find out what the response code is
  $code = wp_remote_retrieve_response_code( $result );
  // Salesforce should ALWAYS return 200, even if there's an error.
  // Otherwise, their server may be down.
  if( intval( $code ) !== 200) {
  return NULL;
  }
  // If `is-processed` isn't set, then there's no error.
  elseif(!isset($result['headers']['is-processed'])) {
  return $done;
  }
  // If `is-processed` is "true", then there's no error.
  else if ($result['headers']['is-processed'] === "true") {
  return $done;
  }
  // But if there's the word "Exception", there's an error.
  /*  else if(strpos($result['headers']['is-processed'], 'Exception')) {
  return NULL;
  }*/
  return NULL;
  }
  
public function verify_files($files,$old=array()){
        if(!is_array($files)){
        $files_temp=json_decode($files,true);
     if(is_array($files_temp)){
    $files=$files_temp;     
     }else if(!empty($files)){ //&& filter_var($files,FILTER_VALIDATE_URL)
      $files=array_map('trim',explode(',',$files));   
     }else{
      $files=array();    
     }   
    }
    if(is_array($files) && is_array($old) && !empty($old)){
   $files=array_merge($old,$files);     
    }
  return $files;  
}  
     /**
  * Posts object to salesforce, Creates/Updates Object or add to object feed
  * @param  array $entry_id Needed to update salesforce response
  * @return array Salesforce Response and Object URL
  */
public function push_object($object,$temp_fields,$meta){  

//$res=$this->get_entry('Lead','00Q0H00001sbljWUAQ');
//$res=$this->post_sales_arr('/services/data/v39.0/sobjects/RecordType/describe','get','');
//var_dump($temp_fields,$meta); die();
  $fields_info=array(); $fields=array(); $extra=array();
  $id=""; $error=""; $action=""; $link=""; $search=$search_response=$status=""; 
  $files=array();
  $debug = isset($_REQUEST['vx_debug']) && current_user_can('manage_options');
  if(is_array($temp_fields)){
  foreach($temp_fields as $k=>$v){
  if($k == 'Id'){
      $id=$v['value']; unset($meta['primary_key']);
  }else{
      $fields[$k]=$v['value'];
  }   
  } } 

    $event=$this->post('event',$meta);
  if(isset($this->info['api']) && $this->info['api'] == "web"){ 
 
  if($this->post('debug_email',$this->info) !=""){
   $fields['debug']="1";   
   $fields['debugEmail']=$this->post('debug_email',$this->info);   
  } 
    //associate lead and campaign
  if($this->post('add_to_camp',$meta) == "1" && in_array($object,array("Lead"))){ 
    $fields['Campaign_ID']=$this->post('web_camp_id',$meta); 
    $fields['member_status']=$this->post('web_mem_status',$meta); 
  } 

  $is_sandbox= !empty($this->info['env']) ? true : false;

  $sales_response=$this->post_web($fields,$this->info,$object,$is_sandbox); 
    
  $status="3"; $action="Added";
  if(empty($sales_response)){ $status=""; $error=sprintf(__('Error While Posting to Salesforce %s'),' (Web2Lead)'); }

  }
  else{
  $fields_info=isset($meta['fields']) && is_array($meta['fields']) ? $meta['fields'] : array();
  if($event!='add_note'){

  //remove related list fields
  $files=array();
  for($i=1; $i<11; $i++){
$field_n='vx_list_files';
if($i>1){ $field_n.=$i; }
  if(isset($fields[$field_n])){
    $files=$this->verify_files($fields[$field_n],$files);
    unset($fields[$field_n]);  
  }
}
if(!empty($fields_info)){
    foreach($fields_info as $k=>$v){
        if(!empty($v['is_item']) && isset($meta['map'][$k])){
        $meta['item_fields'][substr($k,7)]=$meta['map'][$k];
        if(isset($fields[$k])){ unset($fields[$k]); }    
        }
    } 
}


$fields=$this->clean_sf_fields($fields,$fields_info);


if(!empty($meta['owner'])){
    $fields['disable_rules']=1;
}  
}
$camp_id='';
if(isset($fields['vx_camp_id'])){
$camp_id=$fields['vx_camp_id'];
unset($fields['vx_camp_id']);   
}

  if($debug){ ob_start();}
  //check primary key
  $search=array(); $search2=array();
  if( !empty($meta['primary_key']) ){    
  $search=$this->get_search_val($meta['primary_key'],$fields,$fields_info);
  
  if( !empty($meta['primary_key2']) ){
  $search2=$this->get_search_val($meta['primary_key2'],$fields,$fields_info);
  }
  if(!empty($search) || !empty($search2)){
    //  $search=array('FirstName'=>esc_sql("+~'john@"));
    // $search=array('Phone'=>esc_sql("(810) 476-3056"));
    
  //if primary key option is not empty and primary key field value is not empty , then check search object
  $search_response=$sales_response=$this->search_in_sf($object,$search,$search2); 
// var_dump($search_response,$search,$search2); die();
  if($debug){
  ?>
  <pre>
  <h3>Search field</h3>
  <p><?php print_r($search) ?></p>
  <h3>Search term</h3>
  <p><?php print_r($search2) ?></p>
  <h3>Search response</h3>
  <p><?php print_r($sales_response) ?></p>
  </pre>    
  <?php
  }
     
      $extra["Search"]=$search;
      if(!empty($search2)){
      $extra["Search2"]=$search2;
      }
      $extra["response"]=!empty($search_response) ? $search_response : $this->api_res;
  
  if(isset($sales_response[0]['Id'])&& $sales_response[0]['Id']!=""){
   if($object == 'Lead'){
       foreach($sales_response as $v){
           $is_con=isset($v['IsConverted']) && $v['IsConverted'] == true ? true: false;
         if( ! $is_con ){
             $id=$v['Id']; break;
         }
       }
   }else{
  if(is_array($search_response) && count($search_response)>10){
       $search_response=array_slice($search_response,0,10);   //count($search_response)-10 
      }   
  //object found, update old object or add to feed
  $id=$sales_response[0]['Id'];  //count($sales_response)-1
  $extra["response"]=$search_response;
  }}
  
  if(isset($sales_response[0]['errorCode'])){
  $error=$sales_response[0]['message'];
  }
  }
  $sales_response='';
  }
  if(!empty($meta['crm_id'])){
   $id=$meta['crm_id'];   
  } 

     if(in_array($event,array('delete_note','add_note'))){    
  if(isset($meta['related_object'])){
    $extra['Note Object']= $meta['related_object'];
  }
  if(isset($meta['note_object_link'])){
    $extra['note_object_link']=$meta['note_object_link'];
  }
}
 $entry_exists=$sent=false;
//$fields['AccountId']='0016A00000hzWNGQA2';
//$fields['OpportunityId']='0066A00000CH9Q6QAL';
if(!empty($fields['vx_ship_entry'])){
   $meta['vx_ship_entry']=$fields['vx_ship_entry'];
   $meta['vx_ship_total']=$fields['vx_ship_total'];
   unset($fields['vx_ship_entry']);
   unset($fields['vx_ship_total']);

}


$line_items=array();
if(isset($this->id) && $this->id == 'vxc_sales' && !empty($meta['order_items']) && in_array($object,array('Opportunity','Quote'))){
$items=$this->get_items($meta); 
if(!empty($items['price_book'])){
$fields['Pricebook2Id']=$items['price_book'];
if(!empty($items['items'])){
$line_items=$items['items'];
}
}
if(!empty($items['extra'])){
    $extra=array_merge($items['extra'],$extra);
}        
}
$sales_response='';
  $post_data=json_encode($fields);
  //if($error ==""){
  if($id == ""){
  $action="Added";
if(empty($meta['new_entry'])){
    $sent=true;
if( isset($this->id) && $this->id == 'vxc_sales' &&  $object == "Order"){
   $order_res=$this->add_order($fields,$meta);   
  $sales_response=$order_res['res'];
  if(is_array($order_res['extra'])){
  $extra=array_merge($extra, $order_res['extra']);
  }   
}else{  
  //create new lead
$sales_response=$this->post_sales_arr('/services/data/'.$this->api_version.'/sobjects/'.$object,"post",$fields);
  }
  if(isset($sales_response['id'])){
  $id=$sales_response['id'];
  $status="1";
  } }else{
      $error='Entry does not exist';
  }
}else{ 
$entry_exists=true;
  if($event == 'add_note'){     
  $sales_response=$this->post_note($fields,$meta);

    if(isset($sales_response['id'])){
  $id=$sales_response['id'];
  $status="1";
    }  
  }
  else if(in_array($event,array('delete','delete_note'))){
     
  $action="Deleted";
  $sales_response=$this->post_sales_arr('/services/data/'.$this->api_version.'/sobjects/'.$object."/".$id,"DELETE");
    if(empty($sales_response)){ $status="5"; } 
}else{     
  $action="Updated";
  //update old object
   if(empty($meta['update'])){
         if($object == 'CampaignMember'){
       unset($fields['ContactId']);
       unset($fields['CampaignId']);
         } if($object == 'PricebookEntry'){
       unset($fields['Product2Id']);
       unset($fields['Pricebook2Id']);
         }
      //   $fields['Custom_time_type__c']='12:00+00';
        
  $sales_response=$this->post_sales_arr('/services/data/'.$this->api_version.'/sobjects/'.$object."/".$id,"PATCH",$fields);

   if(empty($sales_response)){ $status="2";  $sent=true; } 
 }else{
   $status="2";  
 }
  }
  }
if($status == '1' && !empty($line_items)){
 $k=1;
    foreach($line_items as $item_id=>$item){
       // unset($item['PricebookEntryId']);
       // unset($item['Product2Id']);
        $item[$object.'id']=$id;
  $item_res=$this->post_sales_arr('/services/data/'.$this->api_version.'/sobjects/'.$object."LineItem","POST",$item);  
 $extra['Item Post '.$k]=$item;  
 $extra['Item Response '.$k]=$item_res;  
 $k++;
    }
    
}
if(!empty($id)){
    if(is_array($files) ){
        foreach($files as $k=>$file){ $k++;
         $file_name=substr($file,strrpos($file,'/')+1);   
    $post=array('Title'=>$file_name); 
     if( filter_var($file, FILTER_VALIDATE_URL)) { //!ini_get('allow_url_fopen')
      $upload_dir=wp_upload_dir();
       $file=str_replace($upload_dir['baseurl'],$upload_dir['basedir'],$file); 
    }
  $c=file_get_contents($file);
  
  $post['VersionData']=base64_encode($c);
  $post['PathOnClient']=$file_name;
  $extra['Uploading File '.$k]=$file;
  $post=json_encode($post);
  $file_res=$this->post_sales_arr('/services/data/'.$this->api_version.'/sobjects/ContentVersion','post',$post);
  $extra['Uploaded File '.$k]=$file_res;
  if(!empty($file_res['id'])){ 
    $file_res=$this->post_sales_arr('/services/data/'.$this->api_version.'/sobjects/ContentVersion/'.$file_res['id'],'get','');
    if(!empty($file_res['ContentDocumentId'])){
       $post=array('ContentDocumentId'=>$file_res['ContentDocumentId'],'LinkedEntityId'=>$id,'ShareType'=>'V','Visibility'=>'AllUsers');  
       $post=json_encode($post);
    $link_res=$this->post_sales_arr('/services/data/'.$this->api_version.'/sobjects/ContentDocumentLink','post',$post);
    $extra['Linked File '.$k]=$link_res;
    }  
  }
        }
    }
}
if($this->post('add_to_camp',$meta) == "1"){
    $camp_id=$this->post('campaign',$meta);   
    if($this->post('camp_type',$meta) != ""){
    $camp_id=$this->post('campaign_id',$meta);    
    }   
}
  //associate lead and campaign
  if( !empty($camp_id) && $id !="" && in_array($object,array("Lead","Contact"))){

  $camp_post=array($object."Id"=>$id,"CampaignId"=>$camp_id,"Status"=>$this->post('member_status',$meta));  
  $extra['camp_post']=$camp_post;
  $camp_post=json_encode($camp_post);
$camp_res=$this->post_sales_arr('/services/data/'.$this->api_version.'/sobjects/CampaignMember',"post",$camp_post); 
  if($debug){
  ?>
  <pre>
  <h3>Post to Campaign</h3>
  <p><?php print_r($camp_post) ?></p>
  <h3>Campaign response</h3>
  <p><?php print_r($camp_res) ?></p>
  </pre>    
  <?php
  }
$extra['camp_post']=$camp_post; 
$extra['camp_res']=$camp_res; 
  }
  }
  if($id !="")
  {
  $link=$this->info['instance_url']."/".$id;
  }
  if(isset($sales_response[0]['errorCode'])){
  $error=$sales_response[0]['message'];
  $sales_response=$sales_response[0]; $id='';
  }
  if($debug){
  ?>
  <pre>
  <h3>Salesforce Information</h3>
  <p><?php print_r($this->info) ?></p>
  <h3>Data Sent</h3>
  <p><?php echo json_encode($fields) ?></p>
  <h3>Salesforce response</h3>
  <p><?php print_r($sales_response) ?></p>
  <h3>Object</h3>
  <p><?php print_r($object."--------".$action) ?></p>
  </pre>    
  <?php
  $contents=trim(ob_get_clean());
  if($contents!=""){
  update_option($this->id."_debug",$contents);   
  }
  }
  
         //add entry note
 if(!empty($status) && !empty($meta['__vx_entry_note']) && !empty($id)){
 $disable_note=$this->post('disable_entry_note',$meta); 
   if(!($entry_exists && !empty($disable_note))){  
       $entry_note=$meta['__vx_entry_note'];
 $note_temp=array('Title'=>$entry_note['Title'],'Body'=>$entry_note['Body'],'ParentId'=>$id); 
  $note_response=$this->post_note($note_temp,$meta);

  $extra['Note Title']=$entry_note['Title'];
  $extra['Note Body']=$entry_note['Body'];
  $extra['Note Response']=$note_response;
 
   }  
 }


  return array("error"=>$error,"id"=>$id,"link"=>$link,"action"=>$action,"status"=>$status,"data"=>$fields,"response"=>$sales_response,"extra"=>$extra);
  }

public function get_search_val($field,$fields,$fields_info){
   $search=array();
  if(strpos($field,'FirstName+') !== false ){
      if(!empty($fields['FirstName'])){
          $search['FirstName']=  $fields['FirstName'];
      }
      if(!empty($fields['LastName'])){
          $search['LastName']= $fields['LastName'];
      }
      if(strpos($field,'+Email') !== false ){
         $search['Email']= $fields['Email']; 
      }   
  }else if(strpos($field,'Product2Id+') !== false ){
      if(!empty($fields['Product2Id'])){
          $search['Product2Id']=  $fields['Product2Id'];
      }
      if(!empty($fields['Pricebook2Id'])){
          $search['Pricebook2Id']= $fields['Pricebook2Id'];
      }
     
  }else if(isset($fields[$field]) && $fields[$field] !=''){
      $val=$fields[$field];
      if(isset($fields_info[$field]['type'])){
          $type=$fields_info[$field]['type'];
          if( $type == 'phone'){
        // $val=preg_replace( '/[^0-9]/', '', $val );
          }else if( in_array($type,array('date','datetime'))){
              $val=array('val'=>$val,'type'=>$type);
          }
      }
     $search=array( $field=>$val ); 
  } 
return $search;   
}  
public function post_note($post,$meta,$id=''){
$note_object=!empty($meta['note_list']) ? 'ContentNote' : 'Note'; 
 $object='';
 if(!empty($meta['object'])){
  $object= $meta['object'];  
 }
 if($object == 'Case'){
$note_object='CaseComment';
if(isset($post['Title'])){
   unset($post['Title']); 
}
if(isset($post['Body'])){
  $post['CommentBody']=$post['Body'];
  unset($post['Body']); 
}
$meta['note_list']='';
}else{
     if(!empty($meta['note_list'])){
     $note_body=!empty($post['Body']) ? $post['Body'] : '';
      $note_body_arr=explode("\n",$note_body);
      $note_body='<p>'.implode('</p><p>',$note_body_arr).'</p>';   
     $post['Content']=base64_encode($note_body);
     unset($post['Body']);
      if(!empty($post['ParentId'])){
  $id=$post['ParentId'];
  unset($post['ParentId']);   
 }
     } 
 }
 
$post_data=json_encode($post);  
 $sales_response=$this->post_sales_arr('/services/data/'.$this->api_version.'/sobjects/'.$note_object,"POST",$post_data);
    if(isset($sales_response['id']) && !empty($meta['note_list']) && !empty($id)){
$arr=array('ContentDocumentId'=>$sales_response['id'],'LinkedEntityId'=>$id,'ShareType'=>'V','Visibility'=>'AllUsers');        
$post_data=json_encode($arr);
$sales_response['linkedTo']=$this->post_sales_arr('/services/data/'.$this->api_version.'/sobjects/ContentDocumentLink',"POST",$post_data);      
    }
return $sales_response;
}

/**
  * Create Order and Order items
  * 
  * @param mixed $post
  * @param mixed $meta
  */
public function add_order($post, $meta){ 

    if( !empty($meta['order_items'])){
     $items=$this->get_items($meta);
     $order_items=!empty($items['items']) ? $items['items'] : array();

    $sales_response=array();  $extra=array();

    
if(!empty($items['extra'])){
    $extra=$items['extra'];
}

    if(is_array($order_items) && count($order_items)>0 && !empty($items['price_book'])){


     $post['Pricebook2Id']=$items['price_book'];
     $order_items=array_map(function($v){$v['attributes']=array('type'=>'OrderItem'); unset($v['Product2Id']); return $v;},$order_items);
     $post['OrderItems']=array('records'=>$order_items);
     $extra['Order Items']=$order_items;
     }
    }     
     if(!(is_array($sales_response) && isset($sales_response[0]['errorCode']) ) ){ 
      $path='/services/data/'.$this->api_version.'/commerce/sale/order/';
               //create order
     $att_order=array('attributes'=>array('type'=>'Order'));
     $post=is_array($post) ? $post : array();
     $post=array_merge($att_order,$post);
         if(empty($post['Status'])){
       $post['Status']='Draft';  
     }
$disable=false;
     if(isset($post['disable_rules'])){
         $disable=true;
  unset($post['disable_rules']);   
  }
      $post_json=array("order"=>array($post));   
 if($disable){
  $post_json['disable_rules']='1';   
 }
       $sales_response=$this->post_sales_arr($path,'POST',$post_json);

       if(isset($sales_response['records'][0]) && is_array($sales_response['records'][0]) && isset($sales_response['records'][0]['Id'])){
           $sales_response=array("id"=>$sales_response['records'][0]['Id']);
       }
     }

       return array('res'=>$sales_response,'extra'=>$extra);
  }
public function get_items($meta){
    $items=$this->get_wc_items($meta);
    $order_items=array(); $extra=array();
    $price_book=''; $k=0;
    if(!empty($items)){
        foreach($items as $item_id=>$item){
            $sku=$item['sku'];
            $price_book_id="";
       $k++;
      $path='/services/data/'.$this->api_version.'/query';
    $q="SELECT Id,UnitPrice,ProductCode,Pricebook2Id,Product2Id from PricebookEntry where ProductCode='".$sku."' ";
    if(!empty($meta['price_book'])){
        $price_book=$meta['price_book'];
    $q.="and Pricebook2Id='".$meta['price_book']."'";
    }  if(!empty($meta['map']['CurrencyIsoCode']['value'])){
    $q.=" and CurrencyIsoCode='".$meta['map']['CurrencyIsoCode']['value']."'";
    }
    $q.="  order by Id DESC Limit 1"; 
  $path.='?q='.urlencode($q);
    $sales_response=$this->post_sales_arr($path,'GET');   
        $extra['Search Product '.$k]=array('ProductCode'=>$sku,'Pricebook2Id'=>$price_book);
        $extra['Search Result '.$k]=$sales_response;
     if(isset($sales_response['records']) && is_array($sales_response['records']) && isset($sales_response['records'][0])){
      $price_book_id=$sales_response['records'][0]['Id'];   
      $price_book=$sales_response['records'][0]['Pricebook2Id'];   
      $product_id=$sales_response['records'][0]['Product2Id'];   
     }else{
     $res=$this->search_in_sf('Product2',array('ProductCode'=>$sku) );
  //   var_dump($res);
       $product_id='';
       if(!empty($res[0]['Id'])){
       $product_id=$res[0]['Id'];    
       }else{
       //create product in sf
             $path='/services/data/'.$this->api_version.'/sobjects/Product2';
         $sf_pro=array('IsActive'=>true,'ProductCode'=>$sku,'Name'=>$item['name']);
         if(!empty($meta['pro_desc'])){
             $sf_pro['Description']=$meta['pro_desc'];
         }
       $sf_pro_json=json_encode($sf_pro);
       $sales_response=$this->post_sales_arr($path,'POST',$sf_pro_json);
       $product_id=$sales_response['id'];
       $extra['Create Product '.$k]=$sf_pro;
       $extra['Create Result '.$k]=$sales_response; 
       } 
       if(!empty($product_id) ){
        //add to price book
        $path='/services/data/'.$this->api_version.'/sobjects/PricebookEntry'; 
       $sf_entry=array('IsActive'=>true,'Product2Id'=>$product_id,'Pricebook2Id'=>$price_book,'UnitPrice'=>$item['unit_price']);
         $sf_entry_json=json_encode($sf_entry);
       $sales_response=$this->post_sales_arr($path,'POST',$sf_entry_json);
       $extra['Add PriceBook '.$k]=$sf_entry;
       $extra['PriceBook Redult '.$k]=$sales_response;  
       if(is_array($sales_response) && isset($sales_response['id'])){
           $price_book_id=$sales_response['id'];
       }  
       }    
     }
  //var_dump($sales_response,$q); die();  die('-------------');  
        if(!empty($price_book_id)){
         //add as order item
       $order_item=array('quantity'=>$item['qty'],'PricebookEntryId'=>$price_book_id,'UnitPrice'=>$item['cost_woo']); //,'Product2Id'=>$product_id
    if(!empty($item['fields']) && is_array($meta['fields'])){
        $item['fields']=$this->clean_sf_fields($item['fields'],$meta['fields']);
        foreach($item['fields'] as $k=>$v){
            $order_item[$k]=$v;
        }
    }
       $order_items[]=$order_item; 
        } 
              
        }
       if(!empty($meta['vx_ship_entry'])){ 
           $order_items[]=array('quantity'=>1,'PricebookEntryId'=>$meta['vx_ship_entry'],'UnitPrice'=>$meta['vx_ship_total']);
       } 
    }
    
  return array('items'=>$order_items,'price_book'=>$price_book,'extra'=>$extra);   
}
public function get_wc_items($meta){

      $_order=self::$_order;
    //  $fees=$_order->get_shipping_total();
    //  $fees=$_order-> get_total_discount();
    //  $fees=$_order-> get_total_tax();
     $items=$_order->get_items(); 
     $products=array();  $order_items=array(); 
if(is_array($items) && count($items)>0 ){
foreach($items as $item_id=>$item){
$sku=$desc=$name=''; $qty=$unit_price=$tax=$total=$cost=$cost_woo=$p_id=$var_id=0;
if(method_exists($item,'get_product')){
  // $p_id=$v->get_product_id();  
   $product=$item->get_product();
   if(!$product){ continue; } //product deleted but exists in line items of old order

   $total=(int)$item->get_total();
    if(method_exists($_order,'get_item_total')){
  $cost=$_order->get_item_total($item,false,true); //including woo coupon discuont
  $cost_woo=$_order->get_item_subtotal($item, false, true); // does not include coupon discounts
    }
   $qty = $item->get_quantity();
   $tax = $item->get_total_tax();

   $desc=$product->get_short_description();
   $title=$product->get_title();
   $sku=$product->get_sku();     
   $unit_price=$product->get_price(); 
   $p_id=$product->get_parent_id();
   $var_id=$product->get_id();
   if(empty($p_id)){
       $p_id=$var_id;
   }else{
           $product_simple=wc_get_product($p_id);
           if($product_simple){
         $parent_sku=$product_simple->get_sku(); 
         if($parent_sku == $sku){
             $sku.='-'.$var_id;
         }
           }
   }
   $name=$item->get_name();
 //  $p_id=$product->get_id();
   if(empty($total)){ $unit_price=0; } 
          
}else{ //version_compare( WC_VERSION, '3.0.0', '<' )  , is_array($item) both work
   $p_id=$var_id= !empty($item['variation_id']) ? $item['variation_id'] : $item['product_id'];
        $line_desc=array();
        if(!isset($products[$p_id])){
            try{
        $product=new WC_Product($p_id);
            }catch(Exception $e){
               // echo $e->getMessage();
            }
        }else{
         $product=$products[$p_id];   
        }
       if(!$product){ continue; }  
        $qty=$item['qty'];
        $products[$p_id]=$product;
        $sku=$product->get_sku(); 
        if(empty($sku) && !empty($item['product_id'])){ 
            //if variable product is empty , get simple product sku
            
            $product_simple=new WC_Product($item['product_id']);
            $sku=$product_simple->get_sku(); 
        }
        $unit_price=$product->get_price();
        $title=$product->get_title();
        $desc=$product->get_short_description();
        $p_id=$item['product_id'];
        $name=$item['name'];
 }
  $temp=array('sku'=>$sku,'unit_price'=>$unit_price,'title'=>$title,'qty'=>$qty,'tax'=>$tax,'total'=>$total,'desc'=>$desc,'p_id'=>$p_id,'var_id'=>$var_id,'name'=>$name,'cost'=>$cost,'cost_woo'=>$cost_woo,'fields'=>array());
  
     if(!empty($meta['item_fields'])){
        foreach($meta['item_fields'] as $k=>$v){
        if(isset($v['type'])){
            if($v['type'] == 'value'){
                $temp['fields'][$k]=$this->process_tags($v['value'],$item);
        }else{
         $temp['fields'][$k]=$this->get_field_val($v,$item);   
        }    }
        }   
       }
          if(method_exists($product,'get_stock_quantity')){
   $temp['stock']=$product->get_stock_quantity();
} 

     $order_items[$item_id]=$temp;     
      }
} 
   return $order_items;       
}
  /**
  * Cleans salesrforce fields
  * formates date and checkboxes
  * @param  array $fixed fields to post
  * @param  array $fields_info fields info
  * @return array Salesforce fields
  */
public function clean_sf_fields($fixed,$fields_info){ 
  $sf_fields=array();
  if(is_array($fixed)){  
foreach($fixed as $field_key=>$field_val){ 
  //convert date to salesforce compatible format
  if(isset($fields_info[$field_key])){
 $type=$fields_info[$field_key]['type'];
 if(in_array($type,array('date','datetime')) && empty($field_val)){
  continue;   
 }
   if(in_array($type, array("datetime",'date') ) ){
     
     $date_val=strtotime(str_replace(array("/"),"-",$field_val));

     if( $type == "date"  ){
        /// if(strpos($field_val,'+') === false){$date_val=$date_val.'+00';}
  $field_val=date('Y-m-d',$date_val); 
  }else{ 
    $offset=get_option('gmt_offset');
     $offset=$offset*3600; 
     if(strpos($field_val,'+') === false){ // convert to utc if no timezone(+) does not exist with time string
     $date_val-= $offset;   
     }  
  $field_val=date('c',$date_val); 
  }
  }else if($type == "boolean"){
  $field_val=empty($field_val) || in_array($field_val,array('no','No')) ? 0 : 1 ; 
  }else if( in_array($type, array('Currency','currency'))){
  $field_val=filter_var( $field_val, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION ); 
  }else if($fields_info[$field_key]['type'] == "multipicklist"){
      if(is_array($field_val)){
       $field_val=html_entity_decode(implode(';',$field_val));   
      }
  }else if($type == 'string' && !empty($fields_info[$field_key]['maxlength'])){
      $field_len=$fields_info[$field_key]['maxlength'];
      if(strlen($field_val)> $field_len){
        $field_val=trim(substr($field_val,0,$field_len-1));  
      }
  } 
  if(is_array($field_val)){ 
      $field_val=implode(', ',$field_val);
  }
  $sf_fields[$field_key]=$field_val;      
  }   
}
  }
 //var_dump($sf_fields); die();   
  return $sf_fields;    
  }
  /**
  * Formates Salesforce success or error response into message string
  * @param  array $sales_res Slesforce response 
  * @return string formated string
  */
public function search_in_sf($sales_object,$search,$search2=''){
  $sales_response=array(); 
   /*
   $val='(810) 476-63056';
   $field_type='phone';
  if(in_array($field_type,array("email","phone"))){
    //reomve saleforce reserved characters from key value
  $clean_key=""; $key_val=str_split($val);
  foreach($key_val as $v){
  if(in_array($v,array("?","&","|","!","{","}","[","]","(",")","^","~","*",":",'\\','"',"'","+","-")))
  $v='\\'.$v;
  $clean_key.=$v;    
  }
  $q="FIND {".$clean_key."} IN ".strtoupper($field_type)." FIELDS RETURNING ".$sales_object."(Id)"; 
  $query='/services/data/'.$this->api_version.'/search?q='.urlencode($q);
  $sales_response=$this->post_sales_arr($query,"get");
    if(isset($sales_response['searchRecords'])){
  $sales_response=$sales_response['searchRecords'];
  } }
  */

  $where=array();
  if(!empty($search)){
      $where[]=$search; 
  }
    if(!empty($search2)){
        $where[]=$search2;
  }
  if(!empty($where)){
     $where2=array(); 
    foreach($where as $search){
          $temp=array();
      foreach($search as $k=>$v){
          $type='';
          if(is_array($v)){
              $type=$v['type'];
              $v=$v['val'];
          }
          if(in_array($type,array('date','datetime'))){
         $v=esc_sql($v);
          }else{
          $v="'".esc_sql($v)."'";
          }
          $temp[]=$k." = ".$v; 
      }
    $where2[]=' ( '.implode(' AND ',$temp).' ) '; 
    }  
  $sel='Id';
  if($sales_object == 'Lead'){
      $sel.=' ,IsConverted ';
  }  
  $q="SELECT $sel FROM $sales_object WHERE ".implode(' OR ',$where2);   
  $query='/services/data/'.$this->api_version.'/query?q='.urlencode($q);
  $sales_response=$this->post_sales_arr($query,"get");
 //var_dump($sales_response,$q,$where2); die('-------------');
  if(isset($sales_response['records'])){
  $sales_response=$sales_response['records'];
  }
  }
  return $sales_response;   
  } 
public function get_entry($object,$id){
  return $this->post_sales_arr("/services/data/v27.0/sobjects/".$object.'/'.$id,"get");     
  }
public function create_fields_section($fields){
$arr=array(); 
if(!isset($fields['object'])){
        $objects=array(''=>'Select Object');
    $objects_sf=$this->get_crm_objects(); //var_dump($objects,$this->info);
    if(is_array($objects_sf)){
    $objects=array_merge($objects,$objects_sf);
    }
 $arr['gen_sel']['object']=array('label'=>__('Select Object','gravity-forms-salesforce-crm'),'options'=>$objects,'is_ajax'=>true,'req'=>true);   
}else if(isset($fields['fields']) && !empty($fields['object'])){
    // filter fields
    $crm_fields=$this->get_crm_fields($fields['object']); 
    if(!is_array($crm_fields)){
        $crm_fields=array();
    }
    $add_fields=array();
    if(is_array($fields['fields']) && count($fields['fields'])>0){
        foreach($fields['fields'] as $k=>$v){
           $found=false;
                foreach($crm_fields as $crm_key=>$val){
                    if(strpos($crm_key,$k)!== false){
                        $found=true; break;
                }
            }
         //   echo $found.'---------'.$k.'============'.$crm_key.'<hr>';
         if(!$found){
       $add_fields[$k]=$v;      
         }   
        }
    }
 $arr['fields']=$add_fields;   
}

return $arr;  
}
 
      
}
}
?>