From a6d871455cfd8e9ac3b80ccc678587f61d1325bf Mon Sep 17 00:00:00 2001 From: Steve Sutton Date: Fri, 10 May 2019 16:26:00 -0400 Subject: [PATCH] Updates for uptra Adding uptra feature for importing cleaned leads. New management option for letting members only view cleaned leads. --- defines.php | 1 + index.php | 2 +- models/admin/leads/index.php | 429 ++++++++++++++++-- models/admin/management/leads.php | 6 + ..._V0.0.7.sql => create_database_V0.0.8.sql} | 2 + setup/databaseScripts/dbVersions.php | 1 + .../update_database_V0.0.3.sql | 2 +- .../update_database_V0.0.8.sql | 13 + views/admin/leads/header.html | 8 +- views/admin/leads/import.html | 47 ++ views/admin/leads/index.html | 84 ++-- views/admin/management/leads.html | 9 + 12 files changed, 528 insertions(+), 76 deletions(-) rename setup/databaseScripts/{create_database_V0.0.7.sql => create_database_V0.0.8.sql} (97%) create mode 100644 setup/databaseScripts/update_database_V0.0.8.sql create mode 100644 views/admin/leads/import.html diff --git a/defines.php b/defines.php index 780d49b..a3ad67e 100644 --- a/defines.php +++ b/defines.php @@ -12,6 +12,7 @@ define('GLM_MEMBERS_LEADS_PLUGIN_SHORT_NAME', 'Leads'); define('GLM_MEMBERS_LEADS_PLUGIN_SLUG', 'glm-member-db-leads'); define('GLM_MEMBERS_LEADS_PLUGIN_IMPORT_OPTION', 'glm_member_db_leads_import_option'); define('GLM_MEMBERS_LEADS_PLUGIN_MEMBER_ACCESS_OPTION', 'glm_member_db_leads_member_access'); +define('GLM_MEMBERS_LEADS_PLUGIN_CLEANED_LEADS', 'glm_member_db_leads_cleaned'); // Database table prefixes - change if using add-on tables global $wpdb; diff --git a/index.php b/index.php index 5af9aa0..89a703d 100644 --- a/index.php +++ b/index.php @@ -38,7 +38,7 @@ * version from this plugin. */ define('GLM_MEMBERS_LEADS_PLUGIN_VERSION', '1.1.3'); -define('GLM_MEMBERS_LEADS_PLUGIN_DB_VERSION', '0.0.7'); +define('GLM_MEMBERS_LEADS_PLUGIN_DB_VERSION', '0.0.8'); // 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.11.0'); diff --git a/models/admin/leads/index.php b/models/admin/leads/index.php index 08116b1..1f69847 100644 --- a/models/admin/leads/index.php +++ b/models/admin/leads/index.php @@ -22,6 +22,7 @@ require_once GLM_MEMBERS_LEADS_PLUGIN_CLASS_PATH.'/data/dataInterestGroups.php'; class GlmMembersAdmin_leads_index extends GlmDataLeadEntry { + const CSV_CHARS_PER_LINE = 6000; /** * WordPress Database Object * @@ -38,6 +39,27 @@ class GlmMembersAdmin_leads_index extends GlmDataLeadEntry public $config; public $entryId = false; + + public $imported = 0; + + public $updated = 0; + /** + * Default headers + */ + public $defaultHeaders = array( + 'contact_id', + 'fname', + 'lname', + 'company', + 'address', + 'address2', + 'city', + 'state', + 'zip', + 'phone', + 'fax', + 'email', + ); /* * Constructor * @@ -105,6 +127,9 @@ class GlmMembersAdmin_leads_index extends GlmDataLeadEntry $updating_error = false; $inserting = false; $inserting_error = false; + $processingLeads = false; + $message = ''; + $mLeadCleanedAccess = get_option( GLM_MEMBERS_LEADS_PLUGIN_CLEANED_LEADS ); // Get any provided option if ( isset( $_REQUEST['option'] ) ) { @@ -406,6 +431,76 @@ class GlmMembersAdmin_leads_index extends GlmDataLeadEntry $grouped_interests = array(); switch ( $option ) { + + case 'import': + $view = 'import.html'; + + // Initialize Variables for counts + $verifyHeaders = false; + $imported = 0; + $updated = 0; + + if ( isset( $_FILES ) ) { + // $message .= '
$_FILES: ' . print_r( $_FILES, true ) . '
'; + // Set variable for the upload directory + $wpUploadDir = wp_get_upload_dir(); + + // Set the $uploadPath for import files + $uploadPath = $wpUploadDir['basedir'] . '/' . 'glm-member-leads'; + + // If the folder for the upload import files doesn't exists create one. + if ( !is_dir( $uploadPath ) ) { + // Get old umask + $oldMask = umask( 0 ); + // Set folder permission + mkdir( $uploadPath, 0770 ); + // reset old umask + umask( $oldMask ); + } + + // read file data + $fileHasHeaders = false; + if ( !$_FILES['file']['error'] ) { + $fileName = $_FILES['file']['name']; + if ( move_uploaded_file( $_FILES['file']['tmp_name'], $uploadPath . '/' . $fileName ) ) { + $headers = $this->readCSVFileHeaders( $uploadPath . '/' . $fileName ); + // Need to test if the first line is a header line + if ( is_array( $headers ) && !empty( $headers ) ) { + if ( isset( $headers[0] ) && $headers[0] ) { + if ( $headers[0] === 'contact_id' ) { + $fileHasHeaders = true; + } + } + } else { + // Error + } + if ( $fileHasHeaders ) { + // $message .= '
$headers: ' . print_r( $headers, true ) . '
'; + $leads = $this->readCsvContacts( $uploadPath . '/' . $fileName, $headers ); + } else { + // $message .= '
$headers: ' . print_r( $this->defaultHeaders, true ) . '
'; + $leads = $this->readCsvContacts( $uploadPath . '/' . $fileName, $this->defaultHeaders, true ); + } + + // Set processingLeads to true + $processingLeads = true; + $this->processLeads( $leads ); + + if ( $leads ) { + // $message .= '
$leads: ' . print_r( $leads, true ) . '
'; + $message .= '

Total Imported: ' . $this->imported . '

'; + $message .= '

Total Updated: ' . $this->updated . '

'; + } + } + } + } + $templateData = array( + 'user_can_edit_leads' => $user_can_edit_leads, + 'processing_leads' => $processingLeads, + 'message' => $message, + ); + break; + case 'csv': // Initialize. $out = array(); @@ -422,7 +517,6 @@ class GlmMembersAdmin_leads_index extends GlmDataLeadEntry foreach ( $interest_field_data as $int_field ) { $interest_fields[$int_field['id']] = html_entity_decode( $int_field['title'] ); } - // echo '
$interest_fields: ' . print_r( $interest_fields, true ) . '
'; // Generate the output for the csv file if ( isset( $leads ) && is_array( $leads ) && !empty( $leads ) ) { @@ -436,34 +530,45 @@ class GlmMembersAdmin_leads_index extends GlmDataLeadEntry $lead['source_id'] ) ); - $out = array( - 'fname' => $lead['fname'], - 'lname' => $lead['lname'], - 'email' => $lead['email'], - 'addr1' => $lead['addr1'], - 'addr2' => $lead['addr2'], - 'city' => $lead['city'], - 'state' => $lead['state'], - 'zip' => $lead['zip'], - 'country' => $lead['country'], - 'phone' => $lead['phone'], - 'phone2' => $lead['phone2'], - 'fax' => $lead['fax'], - 'date_submitted' => $lead['date_submitted'], - 'source' => $source_name, - ); + $out = array(); + if ( $user_can_edit_leads && $mLeadCleanedAccess ) { + $out['contact_id'] = $lead['id']; + $out['fname'] = $lead['fname']; + $out['lname'] = $lead['lname']; + $out['company'] = $lead['org']; + $out['address'] = $lead['addr1']; + $out['address2'] = $lead['addr2']; + $out['city'] = $lead['city']; + $out['state'] = $lead['state']; + $out['zip'] = $lead['zip']; + $out['phone'] = $lead['phone']; + $out['fax'] = $lead['fax']; + $out['email'] = $lead['email']; + $out['create_date'] = $lead['date_submitted']; + $out['contact_type'] = $source_name; + } else { + $out['fname'] = $lead['fname']; + $out['lname'] = $lead['lname']; + $out['email'] = $lead['email']; + $out['addr1'] = $lead['addr1']; + $out['addr2'] = $lead['addr2']; + $out['city'] = $lead['city']; + $out['state'] = $lead['state']; + $out['zip'] = $lead['zip']; + $out['country'] = $lead['country']; + $out['phone'] = $lead['phone']; + $out['phone2'] = $lead['phone2']; + $out['fax'] = $lead['fax']; + $out['date_submitted'] = $lead['date_submitted']; + $out['source'] = $source_name; + } + // Add fields for all interest fields if ( $interest_field_data ) { foreach ( $interest_fields as $int_field_id => $int_field_title ) { $out["$int_field_title"] = ''; } } - // Add fields for group names - // if ( $groups ) { - // foreach ( $groups as $group ) { - // $out[$group['title']] = ''; - // } - // } if ( !$user_can_edit_leads ) { unset( $out['source'] @@ -499,11 +604,6 @@ class GlmMembersAdmin_leads_index extends GlmDataLeadEntry foreach ( $interest_fields as $int_field_id => $int_field_title ) { $out["$int_field_title"] = ( $interest_by_groups["$int_field_title"] ) ? $int_field_title : ''; } - // if ( $interest_by_groups ) { - // foreach ( $interest_by_groups as $group_name => $group_interest ) { - // $out[$group_name] = implode( ';', $group_interest ); - // } - // } } // First line should be the header line if ( $lead_counter === 0 ) { @@ -811,7 +911,7 @@ class GlmMembersAdmin_leads_index extends GlmDataLeadEntry 'leads' => $leads, ); break; - } + } // end of switch $option // Fetch the sources $sources = $this->wpdb->get_results( @@ -831,6 +931,7 @@ class GlmMembersAdmin_leads_index extends GlmDataLeadEntry } // Common things to place into the $templateData array + $templateData['option'] = $option; $templateData['sources'] = $sources; $templateData['grouped_interests'] = $grouped_interests; $templateData['haveLeads'] = $haveLeads; @@ -847,6 +948,7 @@ class GlmMembersAdmin_leads_index extends GlmDataLeadEntry $templateData['updating_error'] = $updating_error; $templateData['inserting'] = $inserting; $templateData['inserting_error'] = $inserting_error; + $templateData['leadCleanedAccess'] = $mLeadCleanedAccess; $templateData['prev'] = ( isset( $_REQUEST['prevStart'] ) ) ? $_REQUEST['prevStart'] @@ -871,4 +973,273 @@ class GlmMembersAdmin_leads_index extends GlmDataLeadEntry } + /** + * Read in contacts from a csv file + * + * Header line as follows. Data follows immediately below this line. this + * line and all above it are ignored. + * + * 'member_id','member_name','member_login','member_passwd','contact_email' + * + * @param string $csv Temporary file name of csv file upload + * + * @return array Array of data from CSV file or an error message + */ + public function readCsvContacts( $csv, $headers, $skip = false ) + { + $contacts = array(); + $startImport = false; + if ( $skip === true ) { + $startImport = true; + } + + // Try to open file + if ( ( $handle = fopen( $csv, "r" ) ) !== false ) { + + $firstContact = true; + + // For each line in the file + while ( ( $c = fgetcsv( $handle, SELF::CSV_CHARS_PER_LINE, "," ) ) !== false ) { + + if ( $skip == true && $firstContact === true ) { + // Pad the header array + $headers = array_pad( $headers, count($c), '' ); + } + $firstContact = false; + + // If we're past the header, the first item is numeric, and we have at least 5 fields + if( $startImport && ( $c[0]-0 ) > 0 && count( $c ) >= 5 ) { + // Add this line of data to Contacts + $contacts[] = array_combine( $headers, $c ); + } + + // If we find the header, assume all data is below that + if ( $c[0] == 'contact_id' && $c[1] == 'fname' && $skip === false ) { + $startImport = true; + } + + } + + fclose( $handle ); + + } else { + return "No file submitted."; + } + + // If we never found the header + if ( !$startImport ) { + return "Required header not found in file."; + } + + // If we found no data below the header + if ( count( $contacts ) == 0 ) { + return "Header found but no data followed"; + } + + return $contacts; + } + + /** + * readCSVFileHeaders + * + * Read the cvs file. Just the first line is read. + * + * @param mixed $fileName Name of the file (path) + + * @access public + * @return array + */ + public function readCSVFileHeaders( $fileName ) + { + $fileHeaders = array(); + if ( ( $fp = fopen( $fileName, 'r' ) ) !== false ) { + // get first line to use as headers + $fileHeaders = fgetcsv( $fp, SELF::CSV_CHARS_PER_LINE, ',' ); + fclose( $fp ); + } + + return array_map( 'strtolower', $fileHeaders ); + } + + /** + * processLeads + * + * Do imports and updates to lead_entry records + * + * @param mixed $data Array of lead data + * + * @access public + * @return string + */ + public function processLeads( $data ) + { + // email cannot be in this array. + $validFields = array( + 'fname' => 'fname', + 'lname' => 'lname', + 'company' => 'org', + 'address' => 'addr1', + 'address2' => 'addr2', + 'city' => 'city', + 'state' => 'state', + 'zip' => 'zip', + 'phone' => 'phone', + 'fax' => 'fax', + ); + if ( isset( $data ) && is_array( $data ) && !empty( $data ) ) { + foreach ( $data as $key => $val ) { + $leadData = array(); + // find lead entry + $leadId = $this->wpdb->get_var( + $this->wpdb->prepare( + "SELECT id + FROM " . GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . "lead_entry + WHERE id = %d", + $val['contact_id'] + ) + ); + foreach ( $validFields as $field => $fieldName ) { + if ( isset( $val[$field] ) ) { + $leadData[$fieldName] = $val[$field]; + $leadFormat[] = '%s'; + } + } + // echo '
$leadData: ' . print_r( $leadData, true ) . '
'; + // echo '
$leadId: ' . print_r( $leadId, true ) . '
'; + // return false; + if ( isset( $leadData ) && !empty( $leadData ) ) { + $leadData['cleaned'] = true; + $leadFormat[] = '%s'; + if ( $leadId ) { + // Check that email matches + $email = $this->getEmailByEntryId( $leadId ); + // echo '
$email: ' . print_r( $email, true ) . '
'; + if ( isset( $val['email'] ) + && $val['email'] + && $val['email'] != $email + ) { + // If it doesn't match then find lead id for that email or add one + $this->addNewLead( $val['email'], $leadData, $leadFormat ); + $this->imported++; + } else { + // Update this entry + $this->wpdb->update( + GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . 'lead_entry', + $leadData, + array( 'id' => $val['contact_id'] ), + $leadFormat, + array( '%d' ) + ); + $this->updated++; + } + } else { + $this->addNewLead( $val['email'], $leadData, $leadFormat ); + $this->imported++; + } + } + } // end foreach $data + } // end if $data + } + + public function getLeadIdByEmail( $email ) + { + if ( !isset( $email ) && !$email ) { + return false; + } + $leadId = $this->wpdb->get_var( + $this->wpdb->prepare( + "SELECT id + FROM " . GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . "leads + WHERE email = %s", + $email + ) + ); + return $leadId; + } + + public function getEmailByEntryId( $entryId ) + { + if ( !isset( $entryId ) && !$entryId ) { + return false; + } + $email = $this->wpdb->get_var( + $this->wpdb->prepare( + "SELECT email + FROM " . GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . "leads + WHERE id = (SELECT lead_id + FROM " . GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . "lead_entry + WHERE id = %d)", + $entryId + ) + ); + return $email; + } + + public function getAdminSourceId() + { + static $sourceId; + if ( $sourceId ) { + return $sourceId; + } + $sourceId = $this->wpdb->get_var( + $this->wpdb->prepare( + "SELECT id + FROM " . GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . "sources + WHERE title = %s", + 'Admin' + ) + ); + return $sourceId; + } + + public function addNewLead( $email, $data, $format ) + { + if ( !isset( $email ) && !$email ) { + return false; + } + $leadId = $this->wpdb->get_var( + $this->wpdb->prepare( + "SELECT id + FROM " . GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . "leads + WHERE email = %s", + $email + ) + ); + if ( !$leadId ) { + $this->wpdb->insert( + GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . 'leads', + array( + 'email' => $email, + 'created' => date( 'Y-m-d H:i' ), + 'mail_ok' => true, + 'member_ok' => true, + ), + array( + '%s', + '%s', + '%s', + '%s', + ) + ); + $leadId = $this->insert_id; + } + if ( $leadId ) { + $data['lead_id'] = $leadId; + $format[] = '%d'; + $data['source_id'] = $this->getAdminSourceId(); + $data['cleaned_imported'] = true; + $format[] = '%s'; + $data['date_submitted'] = date( 'Y-m-d' ); + $format[] = '%s'; + + // Insert this entry + $this->wpdb->insert( + GLM_MEMBERS_LEADS_PLUGIN_DB_PREFIX . 'lead_entry', + $data, + $format + ); + + } + return $leadId; + } } diff --git a/models/admin/management/leads.php b/models/admin/management/leads.php index 3a9122c..1ba1db8 100644 --- a/models/admin/management/leads.php +++ b/models/admin/management/leads.php @@ -176,7 +176,11 @@ class GlmMembersAdmin_management_leads // extends GlmDataLeadsManagement if ( isset( $_REQUEST['member_can_access_leads'] ) ) { $memberCanAccessLeads = filter_var( $_REQUEST['member_can_access_leads'], FILTER_VALIDATE_BOOLEAN ); } + if ( isset( $_REQUEST['member_only_cleaned_leads'] ) ) { + $mLeadCleanedAccess = filter_var( $_REQUEST['member_only_cleaned_leads'], FILTER_VALIDATE_BOOLEAN ); + } update_option( GLM_MEMBERS_LEADS_PLUGIN_MEMBER_ACCESS_OPTION, $memberCanAccessLeads ); + update_option( GLM_MEMBERS_LEADS_PLUGIN_CLEANED_LEADS, $mLeadCleanedAccess ); $settingsUpdated = true; break; default: @@ -185,6 +189,7 @@ class GlmMembersAdmin_management_leads // extends GlmDataLeadsManagement } $memberCanAccessLeads = get_option( GLM_MEMBERS_LEADS_PLUGIN_MEMBER_ACCESS_OPTION ); + $mLeadCleanedAccess = get_option( GLM_MEMBERS_LEADS_PLUGIN_CLEANED_LEADS ); switch( $option2 ) { @@ -352,6 +357,7 @@ class GlmMembersAdmin_management_leads // extends GlmDataLeadsManagement 'offset' => $offset, 'next_offset' => $next_offset, 'mLeadAccess' => $memberCanAccessLeads, + 'mLeadCleanedAccess' => $mLeadCleanedAccess, 'settingsUpdated' => $settingsUpdated, 'settingsUpdateError' => $settingsUpdateError, 'db_host' => $this->db_host, diff --git a/setup/databaseScripts/create_database_V0.0.7.sql b/setup/databaseScripts/create_database_V0.0.8.sql similarity index 97% rename from setup/databaseScripts/create_database_V0.0.7.sql rename to setup/databaseScripts/create_database_V0.0.8.sql index dbe65d6..cde36f2 100644 --- a/setup/databaseScripts/create_database_V0.0.7.sql +++ b/setup/databaseScripts/create_database_V0.0.8.sql @@ -60,6 +60,8 @@ CREATE TABLE {prefix}lead_entry ( visit_date DATE NULL, -- Anticipated date of visit date_submitted DATE NULL, -- Date this information was submitted user_trace_info TINYTEXT NULL, -- User IP address and other identifying network info (pos referrer) + cleaned BOOLEAN NULL, -- Cleaned lead + cleaned_imported BOOLEAN NULL, -- Cleaned lead - Imported PRIMARY KEY (id), INDEX (source_id), INDEX (lead_id), diff --git a/setup/databaseScripts/dbVersions.php b/setup/databaseScripts/dbVersions.php index 5452f62..f9da4ad 100644 --- a/setup/databaseScripts/dbVersions.php +++ b/setup/databaseScripts/dbVersions.php @@ -21,5 +21,6 @@ $glmMembersLeadsDbVersions = array( '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'), '0.0.7' => array('version' => '0.0.7', 'tables' => 9, 'date' => '7/26/2016'), + '0.0.8' => array('version' => '0.0.8', 'tables' => 9, 'date' => '5/10/2019'), ); diff --git a/setup/databaseScripts/update_database_V0.0.3.sql b/setup/databaseScripts/update_database_V0.0.3.sql index 2bed376..80cd3e6 100644 --- a/setup/databaseScripts/update_database_V0.0.3.sql +++ b/setup/databaseScripts/update_database_V0.0.3.sql @@ -1,4 +1,4 @@ --- Gaslight Media Members Database - Events Add-On +-- Gaslight Media Members Database - Leads Add-On -- File Created: 16/07/19 16:16:16 -- Database Version: 0.0.3 -- Database Update From Previous Version Script diff --git a/setup/databaseScripts/update_database_V0.0.8.sql b/setup/databaseScripts/update_database_V0.0.8.sql new file mode 100644 index 0000000..471f332 --- /dev/null +++ b/setup/databaseScripts/update_database_V0.0.8.sql @@ -0,0 +1,13 @@ +-- Gaslight Media Members Database - Leads Add-On +-- File Created: 05/10/19 +-- Database Version: 0.0.8 +-- 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 + +ALTER TABLE {prefix}lead_entry ADD COLUMN cleaned BOOLEAN NULL; + +---- + +ALTER TABLE {prefix}lead_entry ADD COLUMN cleaned_imported BOOLEAN NULL; diff --git a/views/admin/leads/header.html b/views/admin/leads/header.html index a70e7ba..6ff35bb 100644 --- a/views/admin/leads/header.html +++ b/views/admin/leads/header.html @@ -1,8 +1,10 @@

All Leads

- - \ No newline at end of file + diff --git a/views/admin/leads/import.html b/views/admin/leads/import.html new file mode 100644 index 0000000..3ffbecd --- /dev/null +++ b/views/admin/leads/import.html @@ -0,0 +1,47 @@ +{include file='admin/leads/header.html'} + +{if !$processing_leads} +
+ + + + + + + + + + +
+

The following script will work with the file that was downloaded from this site. + After the file has been Cleaned (Updated), it can be uploaded. This will only update the following fields. +

+
    +
  1. First Name
  2. +
  3. Last Name
  4. +
  5. Email
  6. +
  7. Address 1
  8. +
  9. Address 2
  10. +
  11. City
  12. +
  13. State
  14. +
  15. ZIP
  16. +
  17. Country
  18. +
  19. Phone
  20. +
  21. Phone 2
  22. +
  23. Fax
  24. +
+

The recordid field is used to properly update the correct contact.

+

Your results will be displayed once the file has been uploaded and database is updated.

+

Sample header of file to be imported

+

recordid,fname,lname,email,addr1,addr2,city,state,zip,country,phone,phone2,fax

+

You can have more fields but these are required in the file

+
+ + +
+
+{else} + {$message} +{/if} + +{include file='admin/footer.html'} diff --git a/views/admin/leads/index.html b/views/admin/leads/index.html index cf62f93..36c7445 100644 --- a/views/admin/leads/index.html +++ b/views/admin/leads/index.html @@ -21,23 +21,23 @@ {if $user_can_edit_leads} - - - - - - - - + + + + + + + + {/if} @@ -51,16 +51,16 @@ {if $user_can_edit_leads} - - - - + + + + {/foreach} @@ -97,17 +97,17 @@

Total found: {$leadCount}  

- {if $paging} - - - {/if} + {if $paging} + + + {/if}
- {if $sources} - - {/if} -
+ {if $sources} + + {/if} +
Date Range
- -
+ +
@@ -77,10 +77,10 @@ {$group_name} {foreach $group as $interest} - - {/foreach} + + {/foreach}
- {if $user_can_edit_leads} - - {/if} + {if $user_can_edit_leads} + + {/if} @@ -136,10 +136,10 @@ {/if}
ContactSourceSourceSubmitted
- {if $paging} - - - {/if} + {if $paging} + + + {/if} {else if $searching} Sorry, Nothing matches your search. {/if} diff --git a/views/admin/management/leads.html b/views/admin/management/leads.html index 3900ec6..faabbb8 100644 --- a/views/admin/management/leads.html +++ b/views/admin/management/leads.html @@ -34,6 +34,15 @@ + + Members only allowed Cleaned leads: + + + + + -- 2.17.1