Exemple #1
0
 /**
  * Delete GravityView "approved entry" meta
  * @since 1.15
  * @return void
  */
 private function delete_entry_meta()
 {
     global $wpdb;
     $meta_table = class_exists('GFFormsModel') ? GFFormsModel::get_lead_meta_table_name() : $wpdb->prefix . 'rg_lead_meta';
     $sql = "\n\t\t\tDELETE FROM {$meta_table}\n\t\t\tWHERE (\n\t\t\t\t`meta_key` = 'is_approved'\n\t\t\t);\n\t\t";
     $wpdb->query($sql);
 }
 public static function is_valid_table($table_name)
 {
     global $wpdb;
     $tables = array(GFFormsModel::get_form_table_name(), GFFormsModel::get_form_view_table_name(), GFFormsModel::get_meta_table_name(), GFFormsModel::get_lead_table_name(), GFFormsModel::get_lead_notes_table_name(), GFFormsModel::get_lead_details_table_name(), GFFormsModel::get_lead_details_long_table_name(), GFFormsModel::get_lead_meta_table_name(), GFFormsModel::get_incomplete_submissions_table_name(), "{$wpdb->prefix}gf_addon_feed", "{$wpdb->prefix}gf_addon_payment_transaction", "{$wpdb->prefix}gf_addon_payment_callback");
     return in_array($table_name, $tables);
 }
 /**
  * Removes all settings and deactivates the Add-On.
  *
  * Not intended to be overridden or called directly by Add-Ons.
  *
  * @ignore
  */
 public function uninstall_addon()
 {
     if (!$this->current_user_can_any($this->_capabilities_uninstall)) {
         die(__("You don't have adequate permission to uninstall this addon: " . $this->_title, "gravityforms"));
     }
     $continue = $this->uninstall();
     if (false === $continue) {
         return false;
     }
     global $wpdb;
     $lead_meta_table = GFFormsModel::get_lead_meta_table_name();
     $forms = GFFormsModel::get_forms();
     $all_form_ids = array();
     // remove entry meta
     foreach ($forms as $form) {
         $all_form_ids[] = $form->id;
         $entry_meta = $this->get_entry_meta(array(), $form->id);
         if (is_array($entry_meta)) {
             foreach (array_keys($entry_meta) as $meta_key) {
                 $sql = $wpdb->prepare("DELETE from {$lead_meta_table} WHERE meta_key=%s", $meta_key);
                 $wpdb->query($sql);
             }
         }
     }
     //remove form settings
     $form_metas = GFFormsModel::get_form_meta_by_id($all_form_ids);
     require_once GFCommon::get_base_path() . '/form_detail.php';
     foreach ($form_metas as $form_meta) {
         if (isset($form_meta[$this->_slug])) {
             unset($form_meta[$this->_slug]);
             $form_json = json_encode($form_meta);
             GFFormDetail::save_form_info($form_meta["id"], addslashes($form_json));
         }
     }
     //removing options
     delete_option("gravityformsaddon_" . $this->_slug . "_settings");
     delete_option("gravityformsaddon_" . $this->_slug . "_version");
     //Deactivating plugin
     deactivate_plugins($this->_path);
     update_option('recently_activated', array($this->_path => time()) + (array) get_option('recently_activated'));
     return true;
 }
Exemple #4
0
 private static function get_field_filters_where($form_id, $search_criteria)
 {
     global $wpdb;
     $field_filters = rgar($search_criteria, 'field_filters');
     $search_operator = self::get_search_operator($search_criteria);
     if (empty($field_filters)) {
         return false;
     }
     unset($field_filters['mode']);
     $sql_array = array();
     $lead_details_table_name = GFFormsModel::get_lead_details_table_name();
     $lead_meta_table_name = GFFormsModel::get_lead_meta_table_name();
     if (is_array($form_id)) {
         $in_str_arr = array_fill(0, count($form_id), '%d');
         $in_str = join(',', $in_str_arr);
         $form_id_where = $wpdb->prepare("AND form_id IN ({$in_str})", $form_id);
     } else {
         $form_id_where = $form_id > 0 ? $wpdb->prepare('AND form_id=%d', $form_id) : '';
     }
     $info_column_keys = self::get_lead_db_columns();
     $entry_meta = self::get_entry_meta(is_array($form_id) ? 0 : $form_id);
     array_push($info_column_keys, 'id');
     foreach ($field_filters as $search) {
         $key = rgar($search, 'key');
         if ('entry_id' === $key) {
             $key = 'id';
         }
         if (in_array($key, $info_column_keys)) {
             continue;
         }
         $val = rgar($search, 'value');
         $operator = isset($search['operator']) ? strtolower($search['operator']) : '=';
         if ('is' == $operator) {
             $operator = '=';
         }
         if ('isnot' == $operator) {
             $operator = '<>';
         }
         if ('contains' == $operator) {
             $operator = 'like';
         }
         $search_term = 'like' == $operator ? "%{$val}%" : $val;
         $search_type = rgar($search, 'type');
         if (empty($search_type)) {
             if (empty($key)) {
                 $search_type = 'global';
             } elseif (is_numeric($key)) {
                 $search_type = 'field';
             } else {
                 $search_type = 'meta';
             }
         }
         switch ($search_type) {
             case 'field':
                 $is_number_field = false;
                 if ($operator != 'like' && !is_array($form_id) && $form_id > 0) {
                     $form = GFAPI::get_form($form_id);
                     $field = self::get_field($form, $key);
                     if (self::get_input_type($field) == 'number') {
                         $is_number_field = true;
                     }
                 }
                 $search_term_placeholder = rgar($search, 'is_numeric') || $is_number_field ? '%f' : '%s';
                 if (is_array($search_term)) {
                     if (in_array($operator, array('=', 'in'))) {
                         $operator = 'IN';
                         // Override operator
                     } elseif (in_array($operator, array('!=', '<>', 'not in'))) {
                         $operator = 'NOT IN';
                         // Override operator
                     }
                     // Format in SQL and sanitize the strings in the list
                     $search_terms = array_fill(0, count($search_term), '%s');
                     $search_term_placeholder = $wpdb->prepare('( ' . implode(', ', $search_terms) . ' )', $search_term);
                     $search_term = '';
                     // Set to blank, still gets passed to wpdb::prepare below but isn't used
                 }
                 $upper_field_number_limit = (string) (int) $key === $key ? (double) $key + 0.9999 : (double) $key + 0.0001;
                 /* doesn't support "<>" for checkboxes */
                 $field_query = $wpdb->prepare("\n                        l.id IN\n                        (\n                        SELECT\n                        lead_id\n                        from {$lead_details_table_name}\n                        WHERE (field_number BETWEEN %s AND %s AND value {$operator} {$search_term_placeholder})\n                        {$form_id_where}\n                        )", (double) $key - 0.0001, $upper_field_number_limit, $search_term);
                 if (empty($val) || '%%' === $val || '<>' === $operator) {
                     $skipped_field_query = $wpdb->prepare("\n                            l.id NOT IN\n                            (\n                            SELECT\n                            lead_id\n                            from {$lead_details_table_name}\n                            WHERE (field_number BETWEEN %s AND %s)\n                            {$form_id_where}\n                            )", (double) $key - 0.0001, $upper_field_number_limit, $search_term);
                     $field_query = '(' . $field_query . ' OR ' . $skipped_field_query . ')';
                 }
                 $sql_array[] = $field_query;
                 /*
                 //supports '<>' for checkboxes but it doesn't scale
                 $sql_array[] = $wpdb->prepare("l.id IN
                                 (SELECT lead_id
                                 FROM
                                     (
                                         SELECT lead_id, value
                                         FROM $lead_details_table_name
                                         WHERE form_id = %d
                                         AND (field_number BETWEEN %s AND %s)
                                         GROUP BY lead_id
                                         HAVING value $operator %s
                                     ) ld
                                 )
                                 ", $form_id, (float)$key - 0.0001, $upper_field_number_limit, $val );
                 */
                 break;
             case 'global':
                 // include choice text
                 $forms = array();
                 if ($form_id == 0) {
                     $forms = GFAPI::get_forms();
                 } elseif (is_array($form_id)) {
                     foreach ($form_id as $id) {
                         $forms[] = GFAPI::get_form($id);
                     }
                 } else {
                     $forms[] = GFAPI::get_form($form_id);
                 }
                 $choice_texts_clauses = array();
                 foreach ($forms as $form) {
                     if (isset($form['fields'])) {
                         $choice_texts_clauses_for_form = array();
                         foreach ($form['fields'] as $field) {
                             /* @var GF_Field $field */
                             $choice_texts_clauses_for_field = array();
                             if (is_array($field->choices)) {
                                 foreach ($field->choices as $choice) {
                                     if ($operator == '=' && strtolower($choice['text']) == strtolower($val) || $operator == 'like' && !empty($val) && strpos(strtolower($choice['text']), strtolower($val)) !== false) {
                                         if ($field->gsurveyLikertEnableMultipleRows) {
                                             $choice_value = '%' . $choice['value'] . '%';
                                             $choice_search_operator = 'like';
                                         } else {
                                             $choice_value = $choice['value'];
                                             $choice_search_operator = '=';
                                         }
                                         $choice_texts_clauses_for_field[] = $wpdb->prepare("(field_number BETWEEN %s AND %s AND value {$choice_search_operator} %s)", (double) $field->id - 0.0001, (double) $field->id + 0.9999, $choice_value);
                                     }
                                 }
                             }
                             if (!empty($choice_texts_clauses_for_field)) {
                                 $choice_texts_clauses_for_form[] = join(' OR ', $choice_texts_clauses_for_field);
                             }
                         }
                     }
                     if (!empty($choice_texts_clauses_for_form)) {
                         $choice_texts_clauses[] = '(l.form_id = ' . $form['id'] . ' AND (' . join(' OR ', $choice_texts_clauses_for_form) . ' ))';
                     }
                 }
                 $choice_texts_clause = '';
                 if (!empty($choice_texts_clauses)) {
                     $choice_texts_clause = join(' OR ', $choice_texts_clauses);
                     $choice_texts_clause = "\n\t\t\t\t\t\tl.id IN (\n                        SELECT\n                        lead_id\n                        FROM {$lead_details_table_name}\n                        WHERE {$choice_texts_clause} ) OR ";
                 }
                 $choice_value_clause = $wpdb->prepare("value {$operator} %s", $search_term);
                 $sql_array[] = '(' . $choice_texts_clause . $choice_value_clause . ')';
                 break;
             case 'meta':
                 /* doesn't support '<>' for multiple values of the same key */
                 $meta = rgar($entry_meta, $key);
                 $placeholder = rgar($meta, 'is_numeric') ? '%s' : '%s';
                 $search_term = 'like' == $operator ? "%{$val}%" : $val;
                 if (is_array($search_term)) {
                     if (in_array($operator, array('=', 'in'))) {
                         $operator = 'IN';
                     } elseif (in_array($operator, array('!=', '<>', 'not in'))) {
                         $operator = 'NOT IN';
                     }
                     $search_terms = array_fill(0, count($search_term), '%s');
                     $placeholder = $wpdb->prepare('( ' . implode(', ', $search_terms) . ' )', $search_term);
                     $search_term = '';
                 }
                 $sql_array[] = $wpdb->prepare("\n                        l.id IN\n                        (\n                        SELECT\n                        lead_id\n                        FROM {$lead_meta_table_name}\n                        WHERE meta_key=%s AND meta_value {$operator} {$placeholder}\n                        {$form_id_where}\n                        )", $search['key'], $search_term);
                 break;
         }
     }
     $sql = empty($sql_array) ? '' : join(' ' . $search_operator . ' ', $sql_array);
     return $sql;
 }
 private static function get_search_where($form_id, $search_criteria)
 {
     global $wpdb;
     $sql_array = array();
     $lead_details_table_name = GFFormsModel::get_lead_details_table_name();
     $lead_meta_table_name = GFFormsModel::get_lead_meta_table_name();
     $form_id_where = $form_id > 0 ? $wpdb->prepare("WHERE form_id=%d", $form_id) : "";
     foreach ($search_criteria as $search) {
         $key = rgar($search, "key");
         $val = rgar($search, "value");
         switch (rgar($search, "type")) {
             case "field":
                 $upper_field_number_limit = (string) (int) $key === $key ? (double) $key + 0.9999 : (double) $key + 0.0001;
                 $operator = isset($search["operator"]) ? $search["operator"] : "=";
                 $search_term = "LIKE" == $operator ? "%{$val}%" : $val;
                 /* doesn't support "<>" for checkboxes */
                 $sql_array[] = $wpdb->prepare("l.id IN\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\tSELECT\n\t\t\t\t\t\t\t\t\tlead_id\n\t\t\t\t\t\t\t\t\tfrom {$lead_details_table_name}\n\t\t\t\t\t\t\t\t\t{$form_id_where}\n\t\t\t\t\t\t\t\t\tAND (field_number BETWEEN %s AND %s AND value {$operator} %s)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t", (double) $key - 0.0001, $upper_field_number_limit, $search_term);
                 /*
                 //supports "<>" for checkboxes but it doesn't scale
                 $sql_array[] = $wpdb->prepare("l.id IN
                                 (SELECT lead_id
                                 FROM
                                     (
                                         SELECT lead_id, value
                                         FROM $lead_details_table_name
                                         WHERE form_id = %d
                                         AND (field_number BETWEEN %s AND %s)
                                         GROUP BY lead_id
                                         HAVING value $operator %s
                                     ) ld
                                 )
                                 ", $form_id, (float)$key - 0.0001, $upper_field_number_limit, $val );
                 */
                 break;
             case "meta":
                 /* doesn't support "<>" for multiple values of the same key */
                 $operator = isset($search["operator"]) ? $search["operator"] : "=";
                 $search_term = "LIKE" == $operator ? "%{$val}%" : $val;
                 $sql_array[] = $wpdb->prepare("l.id IN\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\tSELECT\n\t\t\t\t\t\t\t\t\tlead_id\n\t\t\t\t\t\t\t\t\tFROM {$lead_meta_table_name}\n\t\t\t\t\t\t\t\t\tWHERE meta_key=%s AND meta_value {$operator} %s\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t", $search["key"], $search_term);
                 break;
         }
     }
     $sql = empty($sql_array) ? "" : join(" AND ", $sql_array);
     return $sql;
 }
 private static function get_field_filters_where($form_id, $search_criteria)
 {
     global $wpdb;
     $field_filters = rgar($search_criteria, "field_filters");
     $search_operator = self::get_search_operator($search_criteria);
     if (empty($field_filters)) {
         return false;
     }
     unset($field_filters["mode"]);
     $sql_array = array();
     $lead_details_table_name = GFFormsModel::get_lead_details_table_name();
     $lead_meta_table_name = GFFormsModel::get_lead_meta_table_name();
     if (is_array($form_id)) {
         $in_str_arr = array_fill(0, count($form_id), '%s');
         $in_str = esc_sql(join(",", $in_str_arr));
         $form_id_where = $wpdb->prepare("AND form_id IN ({$in_str})", $form_id);
     } else {
         $form_id_where = $form_id > 0 ? $wpdb->prepare("AND form_id=%d", $form_id) : "";
     }
     $info_column_keys = self::get_lead_db_columns();
     $entry_meta = self::get_entry_meta(is_array($form_id) ? 0 : $form_id);
     array_push($info_column_keys, "id");
     foreach ($field_filters as $search) {
         $key = rgar($search, "key");
         if ("entry_id" === $key) {
             $key = "id";
         }
         if (in_array($key, $info_column_keys)) {
             continue;
         }
         $val = rgar($search, "value");
         $operator = isset($search["operator"]) ? strtolower($search["operator"]) : "=";
         if ("is" == $operator) {
             $operator = "=";
         }
         if ("isnot" == $operator) {
             $operator = "<>";
         }
         if ("contains" == $operator) {
             $operator = "like";
         }
         $search_term = "like" == $operator ? "%{$val}%" : $val;
         $search_type = rgar($search, "type");
         if (empty($search_type)) {
             if (empty($key)) {
                 $search_type = "global";
             } elseif (is_numeric($key)) {
                 $search_type = "field";
             } elseif (isset($entry_meta[$key])) {
                 $search_type = "meta";
             } else {
                 $search_type = "global";
             }
         }
         switch ($search_type) {
             case "field":
                 $upper_field_number_limit = (string) (int) $key === $key ? (double) $key + 0.9999 : (double) $key + 0.0001;
                 /* doesn't support "<>" for checkboxes */
                 $field_query = $wpdb->prepare("l.id IN\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\tSELECT\n\t\t\t\t\t\t\t\t\tlead_id\n\t\t\t\t\t\t\t\t\tfrom {$lead_details_table_name}\n\t\t\t\t\t\t\t\t\tWHERE (field_number BETWEEN %s AND %s AND value {$operator} %s)\n\t\t\t\t\t\t\t\t\t{$form_id_where}\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t", (double) $key - 0.0001, $upper_field_number_limit, $search_term);
                 if (empty($val) || "%%" === $val || "<>" === $operator) {
                     $skipped_field_query = $wpdb->prepare("l.id NOT IN\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\tSELECT\n\t\t\t\t\t\t\t\t\tlead_id\n\t\t\t\t\t\t\t\t\tfrom {$lead_details_table_name}\n\t\t\t\t\t\t\t\t\tWHERE (field_number BETWEEN %s AND %s)\n\t\t\t\t\t\t\t\t\t{$form_id_where}\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t", (double) $key - 0.0001, $upper_field_number_limit, $search_term);
                     $field_query = "(" . $field_query . " OR " . $skipped_field_query . ")";
                 }
                 $sql_array[] = $field_query;
                 /*
                 //supports "<>" for checkboxes but it doesn't scale
                 $sql_array[] = $wpdb->prepare("l.id IN
                                 (SELECT lead_id
                                 FROM
                                     (
                                         SELECT lead_id, value
                                         FROM $lead_details_table_name
                                         WHERE form_id = %d
                                         AND (field_number BETWEEN %s AND %s)
                                         GROUP BY lead_id
                                         HAVING value $operator %s
                                     ) ld
                                 )
                                 ", $form_id, (float)$key - 0.0001, $upper_field_number_limit, $val );
                 */
                 break;
             case "global":
                 $sql_array[] = $wpdb->prepare("value {$operator} %s", $search_term);
                 break;
             case "meta":
                 /* doesn't support "<>" for multiple values of the same key */
                 $meta = rgar($entry_meta, $key);
                 $placeholder = rgar($meta, "is_numeric") ? "%s" : "%s";
                 $search_term = "like" == $operator ? "%{$val}%" : $val;
                 $sql_array[] = $wpdb->prepare("l.id IN\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\tSELECT\n\t\t\t\t\t\t\t\t\tlead_id\n\t\t\t\t\t\t\t\t\tFROM {$lead_meta_table_name}\n\t\t\t\t\t\t\t\t\tWHERE meta_key=%s AND meta_value {$operator} {$placeholder}\n\t\t\t\t\t\t\t\t\t{$form_id_where}\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t", $search["key"], $search_term);
                 break;
         }
     }
     $sql = empty($sql_array) ? "" : join(" " . $search_operator . " ", $sql_array);
     return $sql;
 }
Exemple #7
0
 private static function get_search_where($form_id, $search_criteria)
 {
     global $wpdb;
     $sql_array = array();
     $lead_details_table_name = GFFormsModel::get_lead_details_table_name();
     $lead_meta_table_name = GFFormsModel::get_lead_meta_table_name();
     if (is_array($form_id)) {
         $in_str_arr = array_fill(0, count($form_id), '%s');
         $in_str = join($in_str_arr, ",");
         $form_id_where = $wpdb->prepare("WHERE form_id IN ({$in_str})", $form_id);
     } else {
         $form_id_where = $form_id > 0 ? $wpdb->prepare("WHERE form_id=%d", $form_id) : "";
     }
     foreach ($search_criteria as $search) {
         $key = rgar($search, "key");
         $val = rgar($search, "value");
         $operator = isset($search["operator"]) ? strtolower($search["operator"]) : "=";
         if ("is" == $operator) {
             $operator = "=";
         }
         if ("isnot" == $operator) {
             $operator = "<>";
         }
         if ("contains" == $operator) {
             $operator = "like";
         }
         switch (rgar($search, "type")) {
             case "field":
                 $upper_field_number_limit = (string) (int) $key === $key ? (double) $key + 0.9999 : (double) $key + 0.0001;
                 $search_term = "like" == $operator ? "%{$val}%" : $val;
                 /* doesn't support "<>" for checkboxes */
                 $sql_array[] = $wpdb->prepare("l.id IN\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\tSELECT\n\t\t\t\t\t\t\t\t\tlead_id\n\t\t\t\t\t\t\t\t\tfrom {$lead_details_table_name}\n\t\t\t\t\t\t\t\t\t{$form_id_where}\n\t\t\t\t\t\t\t\t\tAND (field_number BETWEEN %s AND %s AND value {$operator} %s)\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t", (double) $key - 0.0001, $upper_field_number_limit, $search_term);
                 /*
                 //supports "<>" for checkboxes but it doesn't scale
                 $sql_array[] = $wpdb->prepare("l.id IN
                                 (SELECT lead_id
                                 FROM
                                     (
                                         SELECT lead_id, value
                                         FROM $lead_details_table_name
                                         WHERE form_id = %d
                                         AND (field_number BETWEEN %s AND %s)
                                         GROUP BY lead_id
                                         HAVING value $operator %s
                                     ) ld
                                 )
                                 ", $form_id, (float)$key - 0.0001, $upper_field_number_limit, $val );
                 */
                 break;
             case "meta":
                 /* doesn't support "<>" for multiple values of the same key */
                 $entry_meta = self::get_entry_meta(is_array($form_id) ? 0 : $form_id);
                 $meta = rgar($entry_meta, $key);
                 $placeholder = rgar($meta, "is_numeric") ? "%d" : "%s";
                 $search_term = "like" == $operator ? "%{$val}%" : $val;
                 $sql_array[] = $wpdb->prepare("l.id IN\n\t\t\t\t\t\t\t\t\t(\n\t\t\t\t\t\t\t\t\tSELECT\n\t\t\t\t\t\t\t\t\tlead_id\n\t\t\t\t\t\t\t\t\tFROM {$lead_meta_table_name}\n\t\t\t\t\t\t\t\t\tWHERE meta_key=%s AND meta_value {$operator} {$placeholder}\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t", $search["key"], $search_term);
                 break;
         }
     }
     $sql = empty($sql_array) ? "" : join(" AND ", $sql_array);
     return $sql;
 }
/**
 * Updates a form id of an entry.
 *
 * @param int    $entry_id The ID of the Entry object
 * @param int    $form_id The Form ID of the Entry object
 *
 * @param mixed  $value    The value to which the field should be set
 *
 * @return bool Whether the entry property was updated successfully
 */
function update_entry_form_id($entry_id, $form_id)
{
    global $wpdb;
    $lead_table = GFFormsModel::get_lead_table_name();
    $lead_detail_table = GFFormsModel::get_lead_details_table_name();
    $lead_meta_table = GFFormsModel::get_lead_meta_table_name();
    $result = $wpdb->query($wpdb->prepare("UPDATE {$lead_table} SET form_id={$form_id} WHERE id=%d ", $entry_id));
    $wpdb->query($wpdb->prepare("UPDATE {$lead_detail_table} SET form_id={$form_id} WHERE lead_id=%d ", $entry_id));
    $wpdb->query($wpdb->prepare("UPDATE {$lead_meta_table} SET form_id={$form_id} WHERE lead_id=%d ", $entry_id));
    return $result;
}
 private static function get_field_filters_where($form_id, $search_criteria)
 {
     global $wpdb;
     $field_filters = rgar($search_criteria, "field_filters");
     $search_operator = self::get_search_operator($search_criteria);
     if (empty($field_filters)) {
         return false;
     }
     unset($field_filters["mode"]);
     $sql_array = array();
     $lead_details_table_name = GFFormsModel::get_lead_details_table_name();
     $lead_meta_table_name = GFFormsModel::get_lead_meta_table_name();
     if (is_array($form_id)) {
         $in_str_arr = array_fill(0, count($form_id), '%s');
         $in_str = esc_sql(join(",", $in_str_arr));
         $form_id_where = $wpdb->prepare("AND form_id IN ({$in_str})", $form_id);
     } else {
         $form_id_where = $form_id > 0 ? $wpdb->prepare("AND form_id=%d", $form_id) : "";
     }
     $info_column_keys = self::get_lead_db_columns();
     $entry_meta = self::get_entry_meta(is_array($form_id) ? 0 : $form_id);
     array_push($info_column_keys, "id");
     foreach ($field_filters as $search) {
         $key = rgar($search, "key");
         if ("entry_id" === $key) {
             $key = "id";
         }
         if (in_array($key, $info_column_keys)) {
             continue;
         }
         $val = rgar($search, "value");
         $operator = isset($search["operator"]) ? strtolower($search["operator"]) : "=";
         if ("is" == $operator) {
             $operator = "=";
         }
         if ("isnot" == $operator) {
             $operator = "<>";
         }
         if ("contains" == $operator) {
             $operator = "like";
         }
         $search_term = "like" == $operator ? "%{$val}%" : $val;
         $search_type = rgar($search, "type");
         if (empty($search_type)) {
             if (empty($key)) {
                 $search_type = "global";
             } elseif (is_numeric($key)) {
                 $search_type = "field";
             } else {
                 $search_type = "meta";
             }
         }
         switch ($search_type) {
             case "field":
                 $upper_field_number_limit = (string) (int) $key === $key ? (double) $key + 0.9999 : (double) $key + 0.0001;
                 /* doesn't support "<>" for checkboxes */
                 $field_query = $wpdb->prepare("\n                        l.id IN\n                        (\n                        SELECT\n                        lead_id\n                        from {$lead_details_table_name}\n                        WHERE (field_number BETWEEN %s AND %s AND value {$operator} %s)\n                        {$form_id_where}\n                        )", (double) $key - 0.0001, $upper_field_number_limit, $search_term);
                 if (empty($val) || "%%" === $val || "<>" === $operator) {
                     $skipped_field_query = $wpdb->prepare("\n                            l.id NOT IN\n                            (\n                            SELECT\n                            lead_id\n                            from {$lead_details_table_name}\n                            WHERE (field_number BETWEEN %s AND %s)\n                            {$form_id_where}\n                            )", (double) $key - 0.0001, $upper_field_number_limit, $search_term);
                     $field_query = "(" . $field_query . " OR " . $skipped_field_query . ")";
                 }
                 $sql_array[] = $field_query;
                 /*
                 //supports "<>" for checkboxes but it doesn't scale
                 $sql_array[] = $wpdb->prepare("l.id IN
                                 (SELECT lead_id
                                 FROM
                                     (
                                         SELECT lead_id, value
                                         FROM $lead_details_table_name
                                         WHERE form_id = %d
                                         AND (field_number BETWEEN %s AND %s)
                                         GROUP BY lead_id
                                         HAVING value $operator %s
                                     ) ld
                                 )
                                 ", $form_id, (float)$key - 0.0001, $upper_field_number_limit, $val );
                 */
                 break;
             case "global":
                 // include choice text
                 $forms = array();
                 if ($form_id == 0) {
                     $forms = GFAPI::get_forms();
                 } elseif (is_array($form_id)) {
                     foreach ($form_id as $id) {
                         $forms[] = GFAPI::get_form($id);
                     }
                 } else {
                     $forms[] = GFAPI::get_form($form_id);
                 }
                 $choice_texts_clauses = array();
                 foreach ($forms as $form) {
                     if (isset($form['fields'])) {
                         $choice_texts_clauses_for_form = array();
                         foreach ($form['fields'] as $field) {
                             $choice_texts_clauses_for_field = array();
                             if (isset($field['choices']) && is_array($field['choices'])) {
                                 foreach ($field['choices'] as $choice) {
                                     if ($operator == '=' && strtolower($choice['text']) == strtolower($val) || $operator == 'like' && strpos(strtolower($choice['text']), strtolower($val)) !== false) {
                                         if (rgar($field, 'gsurveyLikertEnableMultipleRows')) {
                                             $choice_value = '%' . $choice['value'] . '%';
                                             $choice_search_operator = 'like';
                                         } else {
                                             $choice_value = $choice['value'];
                                             $choice_search_operator = '=';
                                         }
                                         $choice_texts_clauses_for_field[] = $wpdb->prepare("field_number BETWEEN %s AND %s AND value {$choice_search_operator} %s", (double) $field['id'] - 0.0001, (double) $field['id'] + 0.9999, $choice_value);
                                     }
                                 }
                             }
                             if (!empty($choice_texts_clauses_for_field)) {
                                 $choice_texts_clauses_for_form[] = join(' OR ', $choice_texts_clauses_for_field);
                             }
                         }
                     }
                     if (!empty($choice_texts_clauses_for_form)) {
                         $choice_texts_clauses[] = '(l.form_id = ' . $form['id'] . ' AND (' . join(' OR ', $choice_texts_clauses_for_form) . ' ))';
                     }
                 }
                 $choice_texts_clause = '';
                 if (!empty($choice_texts_clauses)) {
                     $choice_texts_clause = join(' OR ', $choice_texts_clauses);
                     $choice_texts_clause = "\n\t\t\t\t\t\tl.id IN (\n                        SELECT\n                        lead_id\n                        FROM {$lead_details_table_name}\n                        WHERE {$choice_texts_clause} ) OR ";
                 }
                 $choice_value_clause = $wpdb->prepare("value {$operator} %s", $search_term);
                 $sql_array[] = '(' . $choice_texts_clause . $choice_value_clause . ')';
                 break;
             case "meta":
                 /* doesn't support "<>" for multiple values of the same key */
                 $meta = rgar($entry_meta, $key);
                 $placeholder = rgar($meta, "is_numeric") ? "%s" : "%s";
                 $search_term = "like" == $operator ? "%{$val}%" : $val;
                 $sql_array[] = $wpdb->prepare("\n                        l.id IN\n                        (\n                        SELECT\n                        lead_id\n                        FROM {$lead_meta_table_name}\n                        WHERE meta_key=%s AND meta_value {$operator} {$placeholder}\n                        {$form_id_where}\n                        )", $search["key"], $search_term);
                 break;
         }
     }
     $sql = empty($sql_array) ? "" : join(" " . $search_operator . " ", $sql_array);
     return $sql;
 }
 function get_counts($args)
 {
     if (!empty($args['field_filters'])) {
         if (isset($args['form-id'])) {
             $form_ids = absint($args['form-id']);
         } else {
             $form_ids = $this->get_workflow_form_ids();
         }
         $results = new stdClass();
         $results->total = 0;
         $results->pending = 0;
         $results->complete = 0;
         $results->cancelled = 0;
         if (empty($form_ids)) {
             $this->items = array();
             return $results;
         }
         $base_search_criteria = $this->get_search_criteria();
         $pending_search_criteria = $base_search_criteria;
         $pending_search_criteria['field_filters'][] = array('key' => 'workflow_final_status', 'value' => 'pending');
         $complete_search_criteria = $base_search_criteria;
         $complete_search_criteria['field_filters'][] = array('key' => 'workflow_final_status', 'operator' => 'not in', 'value' => array('pending', 'cancelled'));
         $cancelled_search_criteria = $base_search_criteria;
         $cancelled_search_criteria['field_filters'][] = array('key' => 'workflow_final_status', 'value' => 'cancelled');
         $results->total = GFAPI::count_entries($form_ids, $base_search_criteria);
         $results->pending = GFAPI::count_entries($form_ids, $pending_search_criteria);
         $results->complete = GFAPI::count_entries($form_ids, $complete_search_criteria);
         $results->cancelled = GFAPI::count_entries($form_ids, $cancelled_search_criteria);
         return $results;
     }
     global $wpdb;
     if (!empty($args['form-id'])) {
         $form_clause = ' AND l.form_id=' . absint($args['form-id']);
     } else {
         $form_ids = $this->get_workflow_form_ids();
         if (empty($form_ids)) {
             $results = new stdClass();
             $results->pending = 0;
             $results->complete = 0;
             $results->cancelled = 0;
             return $results;
         }
         $form_clause = ' AND l.form_id IN(' . join(',', $form_ids) . ')';
     }
     $start_clause = '';
     if (!empty($args['start-date'])) {
         $start_clause = $wpdb->prepare(' AND l.date_created >= %s', $args['start-date']);
     }
     $end_clause = '';
     if (!empty($args['end-date'])) {
         $end_clause = $wpdb->prepare(' AND l.date_created <= %s', $args['end-date']);
     }
     $user_id_clause = '';
     if (!$this->display_all) {
         $user = wp_get_current_user();
         $user_id_clause = $wpdb->prepare(' AND created_by=%d', $user->ID);
     }
     $lead_table = GFFormsModel::get_lead_table_name();
     $meta_table = GFFormsModel::get_lead_meta_table_name();
     $sql = "SELECT\n\t\t(SELECT count(distinct(l.id)) FROM {$lead_table} l WHERE l.status='active' {$form_clause} {$start_clause} {$end_clause} {$user_id_clause}) as total,\n\t\t(SELECT count(distinct(l.id)) FROM {$lead_table} l INNER JOIN  {$meta_table} m ON l.id = m.lead_id WHERE l.status='active' AND meta_key='workflow_final_status' AND meta_value='pending' {$form_clause} {$start_clause} {$end_clause} {$user_id_clause}) as pending,\n\t\t(SELECT count(distinct(l.id)) FROM {$lead_table} l INNER JOIN  {$meta_table} m ON l.id = m.lead_id WHERE l.status='active' AND meta_key='workflow_final_status' AND meta_value NOT IN('pending', 'cancelled') {$form_clause} {$start_clause} {$end_clause} {$user_id_clause}) as complete,\n\t\t(SELECT count(distinct(l.id)) FROM {$lead_table} l INNER JOIN  {$meta_table} m ON l.id = m.lead_id WHERE l.status='active' AND meta_key='workflow_final_status' AND meta_value='cancelled' {$form_clause} {$start_clause} {$end_clause} {$user_id_clause}) as cancelled\n\t\t";
     $results = $wpdb->get_results($sql);
     return $results[0];
 }
 public function maybe_process_queued_entries()
 {
     $this->log_debug(__METHOD__ . '(): starting');
     $form_ids = $this->get_workflow_form_ids();
     if (empty($form_ids)) {
         return;
     }
     global $wpdb;
     $lead_table = GFFormsModel::get_lead_table_name();
     $meta_table = GFFormsModel::get_lead_meta_table_name();
     $sql = "\nSELECT l.id, l.form_id\nFROM {$lead_table} l\nINNER JOIN {$meta_table} m\nON l.id = m.lead_id\nAND l.status='active'\nAND m.meta_key LIKE 'workflow_step_status_%'\nAND m.meta_value='queued'";
     $results = $wpdb->get_results($sql);
     if (empty($results) || is_wp_error($results)) {
         return;
     }
     $this->log_debug(__METHOD__ . '() Queued entries: ' . print_r($results, true));
     foreach ($results as $result) {
         $form = GFAPI::get_form($result->form_id);
         $entry = GFAPI::get_entry($result->id);
         $step = $this->get_current_step($form, $entry);
         if ($step) {
             $complete = $step->start();
             if ($complete) {
                 $this->process_workflow($form, $entry['id']);
             } else {
                 $this->log_debug(__METHOD__ . '() queued entry started step but step is not complete: ' . $entry['id']);
             }
         } else {
             $this->log_debug(__METHOD__ . '() queued entry not on a step: ' . $entry['id']);
         }
     }
 }