DB updates and getting the leads and interest fields to import.
authorSteve Sutton <steve@gaslightmedia.com>
Fri, 22 Jul 2016 17:46:35 +0000 (13:46 -0400)
committerSteve Sutton <steve@gaslightmedia.com>
Fri, 22 Jul 2016 17:46:35 +0000 (13:46 -0400)
For importing of the interest fields from the forms I setup new table
for linking the gravity form field id to the interest. This is so we
don't have duplicate named interest but can figure out which ones are
coming from the gravity form on the GF import.
GP import does 200 at a time now.

index.php
models/admin/management/leads.php
setup/databaseScripts/create_database_V0.0.4.sql
setup/databaseScripts/dbVersions.php
setup/databaseScripts/update_database_V0.0.5.sql [new file with mode: 0644]
setup/databaseScripts/update_database_V0.0.6.sql [new file with mode: 0644]
setup/frontHooks.php

index f16f667..1a47576 100644 (file)
--- a/index.php
+++ b/index.php
@@ -38,7 +38,7 @@
  *  version from this plugin.
  */
 define('GLM_MEMBERS_LEADS_PLUGIN_VERSION', '0.0.1');
-define('GLM_MEMBERS_LEADS_PLUGIN_DB_VERSION', '0.0.4');
+define('GLM_MEMBERS_LEADS_PLUGIN_DB_VERSION', '0.0.6');
 
 // This is the minimum version of the GLM Members DB plugin require for this plugin.
 define('GLM_MEMBERS_LEADS_PLUGIN_MIN_MEMBERS_REQUIRED_VERSION', '2.0.5');
index 05c228c..d53f9b8 100644 (file)
@@ -125,7 +125,7 @@ class GlmMembersAdmin_management_leads // extends GlmDataLeadsManagement
         $import_fields = false;
         $importing     = false;
         $option_name   = GLM_MEMBERS_LEADS_PLUGIN_IMPORT_OPTION;
-        $page_size     = 20;
+        $page_size     = 200;
         $offset        = false;
         $next_offset   = false;
 
@@ -155,15 +155,13 @@ class GlmMembersAdmin_management_leads // extends GlmDataLeadsManagement
 
         switch( $option2 ) {
         case 'import':
+            $total_imported_leads = 0;
             $result = '';
             if ( isset( $_REQUEST['form_id'] ) ) {
                 $form_id = filter_var( $_REQUEST['form_id'], FILTER_VALIDATE_INT );
-                //$result = '<pre>$_REQUEST: ' . print_r( $_REQUEST, true ) . '</pre>';
             }
             if ( $form_id ) {
                 $form   = GFAPI::get_form( $form_id );
-                //$result = '<pre>$form: ' . print_r( $form, true ) . '</pre>';
-                //$result = '<pre>$_REQUEST: ' . print_r( $_REQUEST, true ) . '</pre>';
             }
             if ( $form_id ) {
                 $option_name = GLM_MEMBERS_LEADS_PLUGIN_IMPORT_OPTION . '_form_' . $form_id;
@@ -203,15 +201,18 @@ class GlmMembersAdmin_management_leads // extends GlmDataLeadsManagement
                     $paging          = array( 'offset' => $offset, 'page_size' => $page_size );
                     $total_count     = 0;
                     $entries         = GFAPI::get_entries( $form_id, $search_criteria, $sorting, $paging, $total_count );
-                    $result          = '<pre>$import_fields: ' . print_r( $import_fields, true ) . '</pre>';
-                    //$result         .= '<pre>$_REQUEST: ' . print_r( $_REQUEST, true ) . '</pre>';
+                    $result          = '';
+                    //$result          = '<pre>$import_fields: ' . print_r( $import_fields, true ) . '</pre>';
                     $result         .= '<p>Total Count: ' . $total_count . '</p>';
-                    //$result         .= '<pre>$entries: ' . print_r( $entries, true ) . '</pre>';
                     if ( $entries ) {
                         foreach ( $entries as $entry ) {
-                            $this->addEntry( $entry, $import_fields );
+                            if ($this->addEntry( $entry, $import_fields ) ) {
+                                ++$total_imported_leads;
+                            }
                         }
                     }
+                    $result .= '<p>Importing ' . $offset . ' - ' . $next_offset . '</p>';
+                    $result .= '<p>Total Leads Imported: ' . $total_imported_leads . '</p>';
                 } else {
                     $next_offset = 0;
                     /* If your here then it is the first page after the form setup
@@ -227,7 +228,6 @@ class GlmMembersAdmin_management_leads // extends GlmDataLeadsManagement
                             $this->addInterestGroup( $form, $group_id, $group_name );
                         }
                     }
-                    //$result .= '<pre>$form: ' . print_r( $form, true ) . '</pre>';
                     // anything in this $array_diff will be our new interest_groups
 
                 }
@@ -239,7 +239,6 @@ class GlmMembersAdmin_management_leads // extends GlmDataLeadsManagement
 
         default:
             $forms  = GFAPI::get_forms();
-            //$result = '<pre>$forms: ' . print_r( $forms, true ) . '</pre>';
             break;
         }
 
@@ -279,7 +278,6 @@ class GlmMembersAdmin_management_leads // extends GlmDataLeadsManagement
                     case 'checkbox':
                         if ( isset( $fields['inputs'] ) && is_array( $fields['inputs'] ) && !empty( $fields['inputs'] ) ) {
                             $interests = $fields['inputs'];
-                            //echo '<pre>$fields[inputs]: ' . print_r( $fields['inputs'], true ) . '</pre>';
                         }
                         break;
                     }
@@ -293,7 +291,13 @@ class GlmMembersAdmin_management_leads // extends GlmDataLeadsManagement
                 throw Exception( 'Group not added' );
             }
             foreach ( $interests as $interest ) {
-                $this->addInterest( $group_id, $interest['id'], $interest['label'] );
+                $int_object = array(
+                    'group_id'    => $group_id,
+                    'gf_field_id' => $interest['id'],
+                    'name'        => $interest['label'],
+                    'form_id'     => $form['id']
+                );
+                $this->addInterest( $int_object );
             }
         }
     }
@@ -345,9 +349,22 @@ class GlmMembersAdmin_management_leads // extends GlmDataLeadsManagement
      *
      * @return int The id of the Interest
      */
-    public function addInterest( $group_id, $gf_field_id, $name ) {
+    public function addInterest( $object ) {
+        $group_id    = $object['group_id'];
+        $gf_field_id = $object['gf_field_id'];
+        $name        = $object['name'];
+        $form_id     = $object['form_id'];
+        if ( !filter_var( $group_id, FILTER_VALIDATE_INT ) ) {
+            return false;
+        }
+        if ( !filter_var( $form_id, FILTER_VALIDATE_INT ) ) {
+            return false;
+        }
+        if ( !$gf_field_id ) {
+            return false;
+        }
         // check for this interest first.
-        $interest = $this->wpdb->get_var(
+        $interest_id = $this->wpdb->get_var(
             $this->wpdb->prepare(
                 "SELECT id
                    FROM " . GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . "interests
@@ -357,8 +374,31 @@ class GlmMembersAdmin_management_leads // extends GlmDataLeadsManagement
                 $group_id
             )
         );
-        if ( $interest ) {
-            return $interest;
+        if ( $interest_id ) {
+            // Check if the interest has the gf_interests for it.
+            $gf_interests_id = $this->wpdb->get_var(
+                $this->wpdb->prepare(
+                    "SELECT id
+                       FROM " . GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . "gf_interests
+                      WHERE form_id = %d
+                        AND gf_field_id = %s",
+                    $form_id,
+                    $gf_field_id
+                )
+            );
+            if ( !$gf_interests_id ) {
+                // add the record for the gf_field_id
+                $this->wpdb->insert(
+                    GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . 'gf_interests',
+                    array(
+                        'interest_id' => $interest_id,
+                        'gf_field_id' => $gf_field_id,
+                        'form_id'     => $form_id
+                    ),
+                    array( '%d', '%s', '%d' )
+                );
+            }
+            return $interest_id;
         } else {
             // It is not in the db so add it.
             $this->wpdb->insert(
@@ -370,30 +410,66 @@ class GlmMembersAdmin_management_leads // extends GlmDataLeadsManagement
                 ),
                 array( '%s', '%d', '%s' )
             );
-            return $this->wpdb->insert_id;
+            $interest_id = $this->wpdb->insert_id;
+            // add the record for the gf_field_id
+            $this->wpdb->insert(
+                GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . 'gf_interests',
+                array(
+                    'interest_id' => $interest_id,
+                    'gf_field_id' => $gf_field_id,
+                    'form_id'     => $form_id
+                ),
+                array( '%d', '%s', '%d' )
+            );
+            return $interest_id;
         }
     }
+    /**
+     * addEntry
+     *
+     * @param mixed $entry
+     * @param mixed $import_fields
+     *
+     * @access public
+     * @return boolean True if added false if not
+     */
     public function addEntry( $entry, $import_fields ) {
         $lead        = array();
         $mapped_keys = $this->config['mapped_keys'];
 
         if ( $entry ) {
             $entry = array_filter( $entry );
-            echo '<pre>$entry: ' . print_r( $entry, true ) . '</pre>';
             foreach ( $import_fields as $field_id => $mapped_name ) {
                 if ( isset( $entry[$field_id] ) ) {
                     $lead[$mapped_name] = $entry[$field_id];
                 }
             }
-            echo '<pre>$lead: ' . print_r( $lead, true ) . '</pre>';
             // If they don't have email then we cannot add them into leads table.
             if ( !isset( $lead['email'] ) ) {
                 return false;
             }
             $member_lead_id = $this->addMemberLead( $lead );
-            echo '<pre>$member_lead_id: ' . print_r( $member_lead_id, true ) . '</pre>';
-
+            if ( $member_lead_id ) {
+                // see if the gf_entry_id is already in
+                $entry_id = $this->wpdb->get_var(
+                    $this->wpdb->prepare(
+                        "SELECT id
+                           FROM " . GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . "lead_entry
+                          WHERE gf_entry_id = %d",
+                        $entry['id']
+                    )
+                );
+                if ( !$entry_id ) {
+                    $entry_id = $this->addMemberLeadEntry( $member_lead_id, $lead, $entry );
+                }
+                if ( $entry_id ) {
+                    // now we can add the interest field for the entry record
+                    $this->addMemberLeadInterests( $entry_id, $entry );
+                    return true;
+                }
+            }
         }
+        return false;
     }
     /**
      * addMemberLead
@@ -427,14 +503,39 @@ class GlmMembersAdmin_management_leads // extends GlmDataLeadsManagement
                 GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . 'leads',
                 array(
                     'email'     => $lead['email'],
-                    'mail_ok'   => ( $lead['mail_ok'] ) ? 1 : 0,
+                    'mail_ok'   => ( $lead['mail_ok'] )   ? 1 : 0,
                     'member_ok' => ( $lead['member_ok'] ) ? 1 : 0,
+                    'created'   => current_time( 'mysql' ),
                 ),
-                array( '%s', '%s', '%s' )
+                '%s'
             );
             return $this->wpdb->insert_id;
         }
     }
+    public function getSourceId( $form_id ) {
+        $source_id = $this->wpdb->get_var(
+            $this->wpdb->prepare(
+                "SELECT id
+                   FROM " . GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . "sources
+                  WHERE form_id = %d",
+                $form_id
+            )
+        );
+        if ( $source_id ) {
+            return $source_id;
+        }
+        // If no source_id then we have to add the new source and return id.
+        $form = GFAPI::get_form( $form_id );
+        $this->wpdb->insert(
+            GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . 'sources',
+            array(
+                'title'   => $form['title'],
+                'form_id' => $form_id,
+            ),
+            array( '%s', '%d' )
+        );
+        return $this->wpdb->insert_id;
+    }
     /**
      * addMemberLeadEntry
      *
@@ -452,24 +553,96 @@ class GlmMembersAdmin_management_leads // extends GlmDataLeadsManagement
         if ( !isset( $lead ) || !is_array( $lead ) ) {
             return false;
         }
+        $source_id = $this->getSourceId( $entry['form_id'] );
         $this->wpdb->insert(
             GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . 'lead_entry',
             array(
-                'fname'           => '',
-                'lname'           => '',
-                'org'             => '',
-                'addr1'           => '',
-                'addr2'           => '',
-                'city'            => '',
-                'state'           => '',
-                'zip'             => '',
-                'country'         => '',
-                'phone'           => '',
-                'phone2'          => '',
-                'fax'             => '',
-                'user_trace_info' => '',
+                'source_id'       => $source_id,
+                'lead_id'         => $lead_id,
+                'gf_entry_id'     => $entry['id'],
+                'fname'           => ( ( $lead['fname'] )   ? $lead['fname']   : ''),
+                'lname'           => ( ( $lead['lname'] )   ? $lead['lname']   : ''),
+                'org'             => ( ( $lead['org'] )     ? $lead['org']     : ''),
+                'addr1'           => ( ( $lead['addr1'] )   ? $lead['addr1']   : ''),
+                'addr2'           => ( ( $lead['addr2'] )   ? $lead['addr2']   : ''),
+                'city'            => ( ( $lead['city'] )    ? $lead['city']    : ''),
+                'state'           => ( ( $lead['state'] )   ? $lead['state']   : ''),
+                'zip'             => ( ( $lead['zip'] )     ? $lead['zip']     : ''),
+                'country'         => ( ( $lead['country'] ) ? $lead['country'] : ''),
+                'phone'           => ( ( $lead['phone'] )   ? $lead['phone']   : ''),
+                'phone2'          => ( ( $lead['phone2'] )  ? $lead['phone2']  : ''),
+                'fax'             => ( ( $lead['fax'] )     ? $lead['fax']     : ''),
+                'date_submitted'  => current_time( 'mysql' ),
+                'user_trace_info' => $entry['ip'],
             ),
-            array()
+            array(
+                '%s',
+                '%s',
+                '%s',
+                '%s',
+                '%s',
+                '%s',
+                '%s',
+                '%s',
+                '%s',
+                '%s',
+                '%s',
+                '%s',
+                '%s',
+                '%s',
+                '%s',
+            )
+        );
+        return $this->wpdb->insert_id;
+    }
+    public function getMembersInterests( $form_id ) {
+        static $interest = array();
+        if ( empty( $interest ) ) {
+            $ints = $this->wpdb->get_results(
+                $this->wpdb->prepare(
+                    "SELECT i.id, gfi.gf_field_id
+                       FROM " . GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . "interests i,
+                            " . GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX. "gf_interests gfi
+                      WHERE gfi.form_id = %d
+                        AND gfi.interest_id = i.id",
+                    $form_id
+                ),
+                ARRAY_A
+            );
+            if ( $ints ) {
+                foreach ( $ints as $in ) {
+                    $interest[$in['gf_field_id']] = $in['id'];
+                }
+            }
+        }
+        return $interest;
+    }
+    public function addMemberLeadInterests( $entry_id, $entry ) {
+        if ( !filter_var( $entry_id, FILTER_VALIDATE_INT ) ) {
+            return false;
+        }
+        if ( !is_array( $entry ) || empty( $entry ) ) {
+            return false;
+        }
+        $interest      = $this->getMembersInterests( $entry['form_id'] );
+        $interest_keys = array_keys( $interest );
+        // Delete the old ones
+        $this->wpdb->delete(
+            GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . 'lead_interests',
+            array( 'lead_entry_id' => $entry_id ),
+            array( '%d' )
         );
+        foreach ( $entry as $fkey => $fvalue ) {
+            if ( in_array( $fkey, $interest_keys ) ) {
+                $this->wpdb->insert(
+                    GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . 'lead_interests',
+                    array(
+                        'interest_id'   => $interest[$fkey],
+                        'lead_entry_id' => $entry_id
+                    ),
+                    '%d'
+                );
+            }
+        }
     }
 }
index c03cdf9..c6ed18c 100644 (file)
@@ -43,6 +43,7 @@ CREATE TABLE {prefix}lead_entry (
   id INT NOT NULL AUTO_INCREMENT,
   source_id SMALLINT NULL,                  -- Pointer to sources entry - Form used to submit lead data
   lead_id INTEGER NULL,                     -- Pointer to lead - all submissions for same E-Mail address point to same leads entry
+  gf_entry_id INTEGER NULL,                 -- Reference to Gravity Form Entry
   fname TINYTEXT NULL,                      -- First Name
   lname TINYTEXT NULL,                      -- Last Name
   org TINYTEXT NULL,                        -- Organization name
@@ -80,23 +81,36 @@ CREATE TABLE {prefix}interest_groups (
 
 ----
 
--- Interests - Used to buil Interest fields in forms - Forms use ID as value
+-- Interests - Used to build Interest fields in forms - Forms use ID as value
 CREATE TABLE {prefix}interests (
   id INT NOT NULL AUTO_INCREMENT,
   title TINYTEXT NULL,                      -- Title
   group_id SMALLINT NULL,                   -- Pointer to interest group
-  gf_field_id TINYTEXT NULL,                -- The field id from gravity forms for this interest
   PRIMARY KEY (id),
   INDEX (group_id)
 );
 
 ----
 
+-- GF Interests - Used to relate the Gravity Form field id for interests
+CREATE TABLE {prefix}gf_interests (
+  id INT NOT NULL AUTO_INCREMENT,
+  interest_id INTEGER NULL,                 -- Id for the interests
+  gf_field_id TINYTEXT NULL,                -- The field id from gravity forms for this interest
+  form_id INT NULL,                         -- The Gravity Form Id
+  PRIMARY KEY (id),
+  INDEX (gf_field_id(6)),
+  INDEX (interest_id),
+  INDEX (form_id)
+);
+
+----
+
 -- Lead Interests - many to one links to lead-entry table
 CREATE TABLE {prefix}lead_interests (
   id INT NOT NULL AUTO_INCREMENT,
   interest_id SMALLINT NULL,                -- Pointer to Interest table
-  lead_entry_id INTEGER NULL,              -- Pointer to lead_entry table
+  lead_entry_id INTEGER NULL,               -- Pointer to lead_entry table
   PRIMARY KEY (id),
   INDEX (interest_id),
   INDEX (lead_entry_id)
index 3a628d2..7ffdae4 100644 (file)
@@ -18,5 +18,7 @@ $glmMembersLeadsDbVersions = array(
     '0.0.2' => array('version' => '0.0.2', 'tables' => 10, 'date' => '7/12/2016'),
     '0.0.3' => array('version' => '0.0.3', 'tables' => 10, 'date' => '7/19/2016'),
     '0.0.4' => array('version' => '0.0.4', 'tables' => 10, 'date' => '7/21/2016'),
+    '0.0.5' => array('version' => '0.0.5', 'tables' => 10, 'date' => '7/22/2016'),
+    '0.0.6' => array('version' => '0.0.6', 'tables' => 11, 'date' => '7/22/2016'),
 );
 
diff --git a/setup/databaseScripts/update_database_V0.0.5.sql b/setup/databaseScripts/update_database_V0.0.5.sql
new file mode 100644 (file)
index 0000000..d2f2973
--- /dev/null
@@ -0,0 +1,11 @@
+-- Gaslight Media Members Database  - Events Add-On
+-- File Created: 16/07/19 16:16:16
+-- Database Version: 0.0.3
+-- Database Update From Previous Version Script
+--
+-- To permit each query below to be executed separately,
+-- all queries must be separated by a line with four dashses
+
+
+-- Add form_id
+ALTER TABLE {prefix}lead_entry ADD COLUMN gf_entry_id INTEGER DEFAULT NULL;
diff --git a/setup/databaseScripts/update_database_V0.0.6.sql b/setup/databaseScripts/update_database_V0.0.6.sql
new file mode 100644 (file)
index 0000000..b5f6ab9
--- /dev/null
@@ -0,0 +1,24 @@
+-- Gaslight Media Members Database  - Events Add-On
+-- File Created: 16/07/19 16:16:16
+-- Database Version: 0.0.3
+-- Database Update From Previous Version Script
+--
+-- To permit each query below to be executed separately,
+-- all queries must be separated by a line with four dashes
+
+-- drop column for gf_field_id
+ALTER TABLE {prefix}interests DROP COLUMN gf_field_id;
+
+----
+
+-- GF Interests - Used to relate the Gravity Form field id for interests
+CREATE TABLE {prefix}gf_interests (
+  id INT NOT NULL AUTO_INCREMENT,
+  interest_id INTEGER NULL,                 -- Id for the interests
+  gf_field_id TINYTEXT NULL,                -- The field id from gravity forms for this interest
+  form_id INT NULL,                         -- The Gravity Form Id
+  PRIMARY KEY (id),
+  INDEX (gf_field_id(6)),
+  INDEX (interest_id),
+  INDEX (form_id)
+);
index a3279ed..6411622 100644 (file)
@@ -50,11 +50,12 @@ add_filter( 'gform_pre_render', function( $form ) {
     );
     foreach ( $form['fields'] as $k => $v ) {
         $inputs = $choices = array();
-        if ( $v['type'] == 'leads' ) {
+        $groupData = new GlmDataInterestGroups( $this->wpdb, $this->config );
+        $groups    = $groupData->getList();
+        switch ( $v['type'] ) {
+        case 'leads':
             $form_enabled = true;
             // check the inputName to see if it matches a group
-            $groupData = new GlmDataInterestGroups( $this->wpdb, $this->config );
-            $groups    = $groupData->getList();
             if ( $groups ) {
                 foreach ( $groups as $group ) {
                     if ( $v['inputName'] == $group['title'] ) {
@@ -82,7 +83,9 @@ add_filter( 'gform_pre_render', function( $form ) {
                     }
                 }
             }
-
+            break;
+        case 'checkbox':
+            break;
         }
     }
     if ( !$result ) {