Updates for member import
authorSteve Sutton <steve@gaslightmedia.com>
Wed, 7 Jun 2017 17:47:27 +0000 (13:47 -0400)
committerSteve Sutton <steve@gaslightmedia.com>
Wed, 7 Jun 2017 17:47:27 +0000 (13:47 -0400)
I have these going into the database now:
Amenities
Categories
Cities
Counties
Regions
Members and profile data (w/amenities and categories)

models/admin/import/index.php
views/admin/import/index.html
views/admin/import/process.html
views/admin/import/validate.html

index 091f898..a657d1b 100644 (file)
@@ -36,6 +36,13 @@ class GlmMembersAdmin_import_index
      */
     public $config;
 
+    public $regions = array();
+    public $counties = array();
+    public $amenities = array();
+    public $categories = array();
+    public $cities = array();
+    public $members = array();
+
     /**
      * Constructor
      *
@@ -92,47 +99,59 @@ class GlmMembersAdmin_import_index
      */
     public function modelAction ($actionData = false)
     {
-        $view    = 'index.html';
-        $failure = false;
-        $option  = '';
+        $view      = 'index.html';
+        $failure   = false;
+        $option    = '';
+        $clearData = false;
         $fileData = array(
+            'Amenity' => array(
+                'field'    => 'amenity_file',
+                'name'     => 'amenityData.csv',
+                'exists'   => false,
+                'validate' => array( 'id', 'name' ),
+                'type'     => 'amenity',
+            ),
+            'Category' => array(
+                'field'    => 'category_file',
+                'name'     => 'categoryData.csv',
+                'exists'   => false,
+                'validate' => array( 'id', 'name', 'parent' ),
+                'type'     => 'category',
+            ),
             'City'   => array(
                 'field'    => 'city_file',
                 'name'     => 'cityData.csv',
                 'exists'   => false,
-                'validate' => function( $row ) {
-                    return ( $row === array( 'id', 'name' ) );
-                },
+                'validate' => array( 'id', 'name' ),
                 'type'     => 'city',
             ),
             'Region' => array(
                 'field'    => 'region_file',
                 'name'     => 'regionData.csv',
                 'exists'   => false,
-                'validate' => function( $row ) {
-                    return ( $row === array( 'id', 'name' ) );
-                },
+                'validate' => array( 'id', 'name' ),
                 'type'     => 'region',
             ),
             'County' => array(
                 'field'    => 'county_file',
                 'name'     => 'countyData.csv',
                 'exists'   => false,
-                'validate' => function( $row ) {
-                    return ( $row === array( 'id', 'name' ) );
-                },
+                'validate' => array( 'id', 'name' ),
                 'type'     => 'county',
             ),
             'Member' => array(
                 'field'    => 'member_file',
                 'name'     => 'memberData.csv',
                 'exists'   => false,
-                'validate' => function( $row ) {
-                    return ( $row === array( 'id', 'member_name', 'status', 'descr', 'short_descr', 'addr1', 'addr2', 'city', 'state', 'country', 'zip', 'region', 'county', 'lat', 'lon', 'phone', 'toll_free', 'url', 'reservation_url', 'email', 'logo' ) );
-                },
+                'validate' => array(
+                    'id', 'member_name', 'status', 'descr', 'short_descr',
+                    'addr1', 'addr2', 'city', 'state', 'country', 'zip',
+                    'region', 'county', 'lat', 'lon', 'phone', 'toll_free',
+                    'url', 'reservation_url', 'email', 'logo', 'categories', 'amenities' ),
                 'type'     => 'member',
             ),
         );
+        $readyToProcess = false;
 
         if (isset($_REQUEST['option']) && $_REQUEST['option'] != '') {
             $option = $_REQUEST['option'];
@@ -148,8 +167,10 @@ class GlmMembersAdmin_import_index
 
         switch( $option ) {
 
-        case 'import_files';
-            $view = 'validate.html';
+        case 'validate';
+            $validFiles = 0;
+            $view       = 'validate.html';
+            $fileCount  = count( $fileData );
             // Move any files uploaded
             //echo '<pre>$_FILES: ' . print_r( $_FILES, true ) . '</pre>';
             if ( isset( $_FILES ) ) {
@@ -164,14 +185,35 @@ class GlmMembersAdmin_import_index
                 if ( is_file( $uploadPath . '/' . $file['name'] ) ) {
                     $fileData[$fileHeader]['exists']  = true;
                     $fData = $this->readCSVFileHeaders( $uploadPath . '/' . $file['name'] );
+                    $isValid = ( $file['validate'] == $fData );
+                    if ( $isValid ) {
+                        $validFiles++;
+                    }
                     $fileData[$fileHeader]['data']    = $fData;
-                    $fileData[$fileHeader]['isValid'] = call_user_func( $file['validate'], $fData );
+                    $fileData[$fileHeader]['isValid'] = $isValid;
                 }
             }
-
+            $readyToProcess = ( $validFiles == $fileCount );
+            $clearData = ( filter_var( $_REQUEST['clear_data'], FILTER_VALIDATE_BOOLEAN ) );
             break;
 
         case 'process':
+            $clearData = ( filter_var( $_REQUEST['clear_data'], FILTER_VALIDATE_BOOLEAN ) );
+            if ( $clearData ) {
+                // empty tables
+                $this->wpdb->query('DELETE FROM ' . GLM_MEMBERS_PLUGIN_DB_PREFIX . 'amenity_ref');
+                $this->wpdb->query('DELETE FROM ' . GLM_MEMBERS_PLUGIN_DB_PREFIX . 'amenities');
+                $this->wpdb->query('DELETE FROM ' . GLM_MEMBERS_PLUGIN_DB_PREFIX . 'amenity_groups');
+                $this->wpdb->query('DELETE FROM ' . GLM_MEMBERS_PLUGIN_DB_PREFIX . 'grouped_amenities');
+                $this->wpdb->query('DELETE FROM ' . GLM_MEMBERS_PLUGIN_DB_PREFIX . 'category_member_info');
+                $this->wpdb->query('DELETE FROM ' . GLM_MEMBERS_PLUGIN_DB_PREFIX . 'regions');
+                $this->wpdb->query('DELETE FROM ' . GLM_MEMBERS_PLUGIN_DB_PREFIX . 'counties');
+                $this->wpdb->query('DELETE FROM ' . GLM_MEMBERS_PLUGIN_DB_PREFIX . 'files');
+                $this->wpdb->query('DELETE FROM ' . GLM_MEMBERS_PLUGIN_DB_PREFIX . 'images');
+                $this->wpdb->query('DELETE FROM ' . GLM_MEMBERS_PLUGIN_DB_PREFIX . 'member_detail_stats');
+                $this->wpdb->query('DELETE FROM ' . GLM_MEMBERS_PLUGIN_DB_PREFIX . 'member_info');
+                $this->wpdb->query('DELETE FROM ' . GLM_MEMBERS_PLUGIN_DB_PREFIX . 'members');
+            }
             foreach ( $fileData as $fileHeader => $file ) {
                 if ( is_file( $uploadPath . '/' . $file['name'] ) ) {
                     $fileData[$fileHeader]['results'] = $this->processFile( $uploadPath . '/' . $file['name'], $file['type'] );
@@ -195,9 +237,11 @@ class GlmMembersAdmin_import_index
         }
 
         $templateData = array(
-            'data'     => false,
-            'fileData' => $fileData,
-            'csvData'  => '<pre>$fileData: ' . print_r( $fileData, true ) . '</pre>',
+            'data'           => false,
+            'fileData'       => $fileData,
+            'clearData'      => $clearData,
+            'csvData'        => '<pre>$fileData: ' . print_r( $fileData, true ) . '</pre>',
+            'readyToProcess' => $readyToProcess
         );
         // Return status, suggested view, and data to controller
         return array(
@@ -246,13 +290,67 @@ class GlmMembersAdmin_import_index
 
     public function processFile( $fileName, $type )
     {
-        $city = $region = $county = $member = array();
         $ret = '';
         switch ( $type ) {
+        case 'amenity':
+            $amenityData = $this->readCSVFile( $fileName );
+            $ret .= '<p>Processing Amenity File</p>';
+            foreach ( $amenityData as $data ) {
+                // import amenity names if not found
+                $amenityId = $this->wpdb->get_var(
+                    $this->wpdb->prepare(
+                        "SELECT id
+                           FROM " . GLM_MEMBERS_PLUGIN_DB_PREFIX . "amenities
+                          WHERE name = %s",
+                        $data['name']
+                    )
+                );
+                if ( $amenityId ) {
+                    $this->amenities[$data['id']]['new_id'] = $amenityId;
+                } else {
+                    $this->wpdb->insert(
+                        GLM_MEMBERS_PLUGIN_DB_PREFIX . 'amenities',
+                        array(
+                            'name' => $data['name']
+                        ),
+                        '%s'
+                    );
+                    $this->amenities[$data['id']]['new_id'] = $this->wpdb->insert_id;
+                }
+            }
+            $ret .= '<p>...</p>';
+            break;
+        case 'category':
+            $categoryData = $this->readCSVFile( $fileName );
+            $ret .= '<p>Processing Category File</p>';
+            foreach ( $categoryData as $data ) {
+                // import category names if not found
+                $categoryId = $this->wpdb->get_var(
+                    $this->wpdb->prepare(
+                        "SELECT id
+                           FROM " . GLM_MEMBERS_PLUGIN_DB_PREFIX . "categories
+                          WHERE name = %s",
+                        $data['name']
+                    )
+                );
+                if ( $categoryId ) {
+                    $this->categories[$data['id']]['new_id'] = $categoryId;
+                } else {
+                    $this->wpdb->insert(
+                        GLM_MEMBERS_PLUGIN_DB_PREFIX . 'categories',
+                        array(
+                            'name' => $data['name']
+                        ),
+                        '%s'
+                    );
+                    $this->categories[$data['id']]['new_id'] = $this->wpdb->insert_id;
+                }
+            }
+            $ret .= '<p>...</p>';
+            break;
         case 'city':
             $cityData = $this->readCSVFile( $fileName );
             $ret .= '<p>Processing City File</p>';
-            $ret .= '<pre>$cityData: ' . print_r( $cityData, true ) . '</pre>';
             foreach ( $cityData as $data ) {
                 // import city names if not found
                 $cityId = $this->wpdb->get_var(
@@ -264,7 +362,7 @@ class GlmMembersAdmin_import_index
                     )
                 );
                 if ( $cityId ) {
-                    $city[$data['id']]['new_id'] = $cityId;
+                    $this->cities[$data['id']]['new_id'] = $cityId;
                 } else {
                     $this->wpdb->insert(
                         GLM_MEMBERS_PLUGIN_DB_PREFIX . 'cities',
@@ -273,15 +371,14 @@ class GlmMembersAdmin_import_index
                         ),
                         '%s'
                     );
-                    $city[$data['id']]['new_id'] = $this->wpdb->insert_id;
+                    $this->cities[$data['id']]['new_id'] = $this->wpdb->insert_id;
                 }
             }
-            $ret .= '<pre>$city: ' . print_r( $city, true ) . '</pre>';
+            $ret .= '<p>...</p>';
             break;
         case 'region':
             $regionData = $this->readCSVFile( $fileName );
             $ret .= '<p>Processing Region File</p>';
-            $ret .= '<pre>$regionData: ' . print_r( $regionData, true ) . '</pre>';
             foreach ( $regionData as $data ) {
                 // import region names if not found
                 $regionId = $this->wpdb->get_var(
@@ -294,7 +391,7 @@ class GlmMembersAdmin_import_index
                     )
                 );
                 if ( $regionId ) {
-                    $region[$data['id']]['new_id'] = $regionId;
+                    $this->regions[$data['id']]['new_id'] = $regionId;
                 } else {
                     $this->wpdb->insert(
                         GLM_MEMBERS_PLUGIN_DB_PREFIX . 'regions',
@@ -305,14 +402,14 @@ class GlmMembersAdmin_import_index
                         ),
                         '%s'
                     );
-                    $region[$data['id']]['new_id'] = $this->wpdb->insert_id;
+                    $this->regions[$data['id']]['new_id'] = $this->wpdb->insert_id;
                 }
             }
-            $ret .= '<pre>$region: ' . print_r( $region, true ) . '</pre>';
+            $ret .= '<p>...</p>';
             break;
         case 'county':
             $countyData = $this->readCSVFile( $fileName );
-            $ret = '<pre>$countyData: ' . print_r( $countyData, true ) . '</pre>';
+            $ret .= '<p>Processing County File</p>';
             foreach ( $countyData as $data ) {
                 // import county names if not found
                 $countyId = $this->wpdb->get_var(
@@ -325,7 +422,7 @@ class GlmMembersAdmin_import_index
                     )
                 );
                 if ( $countyId ) {
-                    $county[$data['id']]['new_id'] = $countyId;
+                    $this->counties[$data['id']]['new_id'] = $countyId;
                 } else {
                     $this->wpdb->insert(
                         GLM_MEMBERS_PLUGIN_DB_PREFIX . 'counties',
@@ -336,14 +433,14 @@ class GlmMembersAdmin_import_index
                         ),
                         '%s'
                     );
-                    $county[$data['id']]['new_id'] = $this->wpdb->insert_id;
+                    $this->counties[$data['id']]['new_id'] = $this->wpdb->insert_id;
                 }
             }
-            $ret .= '<pre>$county: ' . print_r( $county, true ) . '</pre>';
+            $ret .= '<p>...</p>';
             break;
         case 'member':
             $memberData = $this->readCSVFile( $fileName );
-            $ret = '<pre>$memberData: ' . print_r( $memberData, true ) . '</pre>';
+            $ret .= '<p>Processing Member File</p>';
             // Get default member type
             $memberTypeId = $this->wpdb->get_var(
                 $this->wpdb->prepare(
@@ -364,6 +461,7 @@ class GlmMembersAdmin_import_index
                 );
                 $memberTypeId = $this->mpdb->insert_id;
             }
+            $dupeNames = 0;
             foreach ( $memberData as $data ) {
                 // Check for duplicate member
                 $memberId = $this->wpdb->get_var(
@@ -375,88 +473,143 @@ class GlmMembersAdmin_import_index
                     )
                 );
                 if ( $memberId ) {
-                    $member[$data['id']]['new_id'] = $memberId;
-                } else {
-                    $access = $this->config['access_numb']['Moderated'];
-                    $this->wpdb->insert(
-                        GLM_MEMBERS_PLUGIN_DB_PREFIX . 'members',
-                        array(
-                            'access'        => $access,
-                            'member_type'   => $memberTypeId,
-                            'created'       => date( 'Y-m-d' ),
-                            'name'          => $data['member_name'],
-                            'member_slug'   => sanitize_title( $data['member_name'] ),
-                            'old_member_id' => $data['id']
-                        ),
-                        array(
-                            '%d',
-                            '%d',
-                            '%s',
-                            '%s',
-                            '%s',
-                            '%d'
-                        )
-                    );
-                    $memberId = $this->wpdb->insert_id;
-                    $member[$data['id']]['new_id'] = $this->wpdb->insert_id;
+                    // We need to get a unique name for this member
+                    $dupeNames++;
+                    $data['member_name'] .= ' DUPE-' . $dupeNames;
+                }
+                $access = $this->config['access_numb']['Moderated'];
+                $this->wpdb->insert(
+                    GLM_MEMBERS_PLUGIN_DB_PREFIX . 'members',
+                    array(
+                        'access'        => $access,
+                        'member_type'   => $memberTypeId,
+                        'created'       => date( 'Y-m-d' ),
+                        'name'          => $data['member_name'],
+                        'member_slug'   => sanitize_title( $data['member_name'] ),
+                        'old_member_id' => $data['id']
+                    ),
+                    array(
+                        '%d',
+                        '%d',
+                        '%s',
+                        '%s',
+                        '%s',
+                        '%d'
+                    )
+                );
+                $memberId = $this->wpdb->insert_id;
+                $this->members[$data['id']]['new_id'] = $this->wpdb->insert_id;
+                // Add the member info record
+                $insert = $this->wpdb->insert(
+                    GLM_MEMBERS_PLUGIN_DB_PREFIX . 'member_info',
+                    array(
+                        'member'         => $memberId,
+                        'member_name'    => $data['member_name'],
+                        'status'         => $this->config['status_numb']['Active'],
+                        'reference_name' => 'Imported Member Information',
+                        'descr'          => $data['descr'],
+                        'short_descr'    => $data['short_descr'],
+                        'addr1'          => $data['addr1'],
+                        'addr2'          => $data['addr2'],
+                        'city'           => ((isset($data['city']) && isset($this->cities[$data['city']]['new_id'])) ? $this->cities[$data['city']]['new_id']: 0),
+                        'state'          => $data['state'],
+                        'country'        => $data['country'],
+                        'region'         => ((isset($data['region']) && isset($this->regions[$data['region']]['new_id'])) ? $this->regions[$data['region']]['new_id']: 0),
+                        'county'         => ((isset($data['county']) && isset($this->counties[$data['county']]['new_id'])) ? $this->counties[$data['county']]['new_id']: 0),
+                        'zip'            => $data['zip'],
+                        'lat'            => $data['lat'],
+                        'lon'            => $data['lon'],
+                        'phone'          => $data['phone'],
+                        'toll_free'      => $data['toll_free'],
+                        'url'            => $data['url'],
+                        'email'          => $data['email'],
+                        'logo'           => $data['logo'],
+                        'notes'          => '',
+                        'create_time'    => date( 'Y-m-d' ),
+                        'modify_time'    => date( 'Y-m-d' ),
+                    ),
+                    array(
+                        '%d',
+                        '%s',
+                        '%d',
+                        '%s',
+                        '%s',
+                        '%s',
+                        '%s',
+                        '%s',
+                        '%d',
+                        '%s',
+                        '%s',
+                        '%d',
+                        '%d',
+                        '%s',
+                        '%s',
+                        '%s',
+                        '%s',
+                        '%s',
+                        '%s',
+                        '%s',
+                        '%s',
+                        '%s',
+                        '%s',
+                        '%s',
+                    )
+                );
+                if ( !$insert ) {
+                    echo '<pre>$data: ' . print_r( $data, true ) . '</pre>';
+                    die( 'Error importing member data' );
+                }
+                // get last id for member_info table to use for profile id
+                $profileId = $this->wpdb->insert_id;
+                // Setup the categories for this profile record
+                if ( $data['categories'] ) {
+                    $categories = explode( ',', $data['categories'] );
+                    foreach ( $categories as $catData ) {
+                        if ( $catId = filter_var( $catData, FILTER_VALIDATE_INT ) ) {
+                            $catMembInfId = $this->wpdb->insert(
+                                GLM_MEMBERS_PLUGIN_DB_PREFIX . 'category_member_info',
+                                array(
+                                    'category'    => $this->categories[$catId]['new_id'],
+                                    'member_info' => $profileId
+                                ),
+                                array(
+                                    '%d',
+                                    '%d'
+                                )
+                            );
+                            if ( !$catMembInfId ) {
+                                die('Something wrong no insert to category_member_info table');
+                            }
+                        }
+                    }
+                }
+                // Setup the amenities for this profile record
+                if ( $data['amenities'] ) {
+                    $amenities = explode( ',', $data['amenities'] );
+                    foreach ( $amenities as $amenData ) {
+                        if ( $amenData = filter_var( $amenData, FILTER_VALIDATE_INT ) ) {
+                            $amenRefId = $this->wpdb->insert(
+                                GLM_MEMBERS_PLUGIN_DB_PREFIX . 'amenity_ref',
+                                array(
+                                    'amenity'  => $this->amenities[$amenData]['new_id'],
+                                    'ref_type' => $this->config['ref_type_numb']['MemberInfo'],
+                                    'ref_dest' => $profileId
+                                ),
+                                array(
+                                    '%d',
+                                    '%d',
+                                    '%d',
+                                )
+                            );
+                            if ( !$amenRefId ) {
+                                die('Something wrong no insert to amenity_ref table');
+                            }
+                        }
+                    }
                 }
             }
-            // Add the member info record
-            $this->wpdb->insert(
-                GLM_MEMBERS_PLUGIN_DB_PREFIX . 'member_info',
-                array(
-                    'member'         => $memberId,
-                    'member_name'    => $data['member_name'],
-                    'status'         => $this->config['status_numb']['Active'],
-                    'reference_name' => 'Imported Member Information',
-                    'descr'          => $data['descr'],
-                    'short_descr'    => $data['short_descr'],
-                    'addr1'          => $data['addr1'],
-                    'addr2'          => $data['addr2'],
-                    'city'           => ((isset($data['city']) && isset($city[$data['city']]['new_id'])) ? $city[$data['city']]['new_id']: 0),
-                    'state'          => $data['state'],
-                    'country'        => $data['country'],
-                    'region'         => ((isset($data['region']) && isset($region[$data['region']]['new_id'])) ? $region[$data['region']]['new_id']: 0),
-                    'county'         => $data['county'],
-                    'zip'            => $data['zip'],
-                    'lat'            => $data['lat'],
-                    'lon'            => $data['lon'],
-                    'phone'          => $data['phone'],
-                    'toll_free'      => $data['toll_free'],
-                    'url'            => $data['url'],
-                    'email'          => $data['email'],
-                    'logo'           => $data['logo'],
-                    'notes'          => '',
-                    'create_time'    => date( 'Y-m-d' ),
-                    'modify_time'    => date( 'Y-m-d' ),
-                ),
-                array(
-                    '%d',
-                    '%s',
-                    '%d',
-                    '%s',
-                    '%s',
-                    '%s',
-                    '%s',
-                    '%s',
-                    '%d',
-                    '%s',
-                    '%s',
-                    '%d',
-                    '%d',
-                    '%s',
-                    '%s',
-                    '%s',
-                    '%s',
-                    '%s',
-                    '%s',
-                    '%s',
-                    '%s',
-                    '%s',
-                    '%s',
-                    '%s',
-                )
-            );
+            //$ret .= '<pre>$this->members: ' . print_r( $this->members, true ) . '</pre>';
+            $ret .= '<p>...</p>';
             break;
         default:
             break;
index 4ce1eea..521c339 100644 (file)
@@ -4,7 +4,7 @@
 
     <form action="{$thisUrl}?page={$thisPage}" method="post" enctype="multipart/form-data">
         <input type="hidden" name="glm_action" value="index" />
-        <input type="hidden" name="option" value="import_files" />
+        <input type="hidden" name="option" value="validate" />
 
         <table class="glm-admin-table">
             {foreach $fileData as $fileHeader => $file}
                 </td>
             </tr>
             {/foreach}
+            <tr>
+                <td>Clear Data</td>
+                <td>
+                    <input type="hidden" name="clear_data" value="0">
+                    <input type="checkbox" name="clear_data" value="1">
+                </td>
+            </tr>
         </table>
 
         <input type="submit" value="Continue" class="button button-primary submit-import">
index 9abc56b..98676f5 100644 (file)
@@ -11,7 +11,6 @@
         </tr>
         {/foreach}
 
-        <a href="{$thisUrl}?page={$thisPage}&glm_action=index&option=process" class="button">Process Files</a>
     </table>
 
 {include file='admin/footer.html'}
index 84610f7..b4c1b55 100644 (file)
         </tr>
         {/foreach}
 
-        <a href="{$thisUrl}?page={$thisPage}&glm_action=index&option=process" class="button">Process Files</a>
+        {if $clearData}
+        <tr>
+            <td colspan="2">
+                All Member Data will be cleared before importing any files.
+            </td>
+        </tr>
+        {/if}
+
+        {if $readyToProcess}
+        <tr>
+            <td colspan="2">
+                <a href="{$thisUrl}?page={$thisPage}&glm_action=index&option=process{if $clearData}&clear_data=1{/if}" class="button">Process Files</a>
+            </td>
+        </tr>
+        {/if}
     </table>
 
 {include file='admin/footer.html'}