From b0f5c3eae02a474df66dfc5226b690e0249ea78e Mon Sep 17 00:00:00 2001 From: bachy Date: Thu, 3 Jan 2013 16:04:59 +0100 Subject: [PATCH] =?UTF-8?q?adhe=CC=81rent=20migration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: bachy --- migrate_materio.adherent.inc | 422 +++++++++++++++++++++++++++++++++++ migrate_materio.info | 3 + 2 files changed, 425 insertions(+) create mode 100644 migrate_materio.adherent.inc diff --git a/migrate_materio.adherent.inc b/migrate_materio.adherent.inc new file mode 100644 index 00000000..9c736b04 --- /dev/null +++ b/migrate_materio.adherent.inc @@ -0,0 +1,422 @@ +description = t('Migrate Materio Members Account Users'); + + // provide better description for source fields + // and add new field source not from sql + $source_fields = array( + 'id_login' => t('Member id from source'), + 'memo'=>t('memo'), + 'roles'=>t('roles'), + 'user_name' => 'User name', + ); + + $query = db_select(MIG_MAT_SRC_DB .'.login_id', 'lid'); + $query->join(MIG_MAT_SRC_DB .'.member_id', 'mid', 'mid.id_member = lid.id_member'); + // $query->join(MIG_MAT_SRC_DB .'.locale_id', 'locid', 'lid.def_locale = locid.id_locale'); + $query->join(MIG_MAT_SRC_DB .'.member_info', 'minf', 'mid.id_member = minf.id_member'); + $query + ->fields('lid', array('id_login', 'status', 'date_creation', 'date_modif', 'date_end', 'type', 'email', 'news_letter', 'def_locale')) + ->fields('mid', array('memo')) + // ->fields('locid', array('name', 'short_name', 'suffix')) + ->fields('minf', array('activity')) + // ->condition('email_general', '', '<>') + ->orderBy('lid.id_login', 'DESC'); + + // $query->groupBy('lid.id_member'); + + $this->source = new MigrateSourceSQL($query, $source_fields); + $this->destination = new MigrateDestinationUser(); + $this->map = new MigrateSQLMap($this->machineName, + array( + 'id_login' => array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'description' => 'OLD Unique member ID', + 'alias' => 'lid', + ) + ), + MigrateDestinationUser::getKeySchema() + ); + + // Make the mappings + $this->addFieldMapping('name', 'user_name'); + $this->addFieldMapping('pass')->defaultValue(NULL); + $this->addFieldMapping('mail', 'email'); + # NOTE : maybe if we provide only init mail, we wiil be able to ask email confirmation for users + $this->addFieldMapping('init', 'email'); + $this->addFieldMapping('language', 'def_locale'); + $this->addFieldMapping('theme')->defaultValue(''); + $this->addFieldMapping('signature')->defaultValue(''); + $this->addFieldMapping('signature_format')->defaultValue('filtered_html'); + $this->addFieldMapping('created', 'date_creation'); + $this->addFieldMapping('access')->defaultValue(0);//, 'date_modif'); + $this->addFieldMapping('login')->defaultValue(0); + $this->addFieldMapping('status')->defaultValue(0); + $this->addFieldMapping('picture')->defaultValue(0); + $this->addFieldMapping('timezone')->defaultValue(NULL); + // $this->addFieldMapping('path')->issueGroup(t('DNM')); + $this->addFieldMapping('pathauto')->defaultValue(1); + $this->addFieldMapping('roles', 'roles');// 7 = utilisateur, 6 = adherent, 8 = premium; ->defaultValue(array(6)); // adhérent + $this->addFieldMapping('is_new')->defaultValue(TRUE); + + $this->addFieldMapping('field_newsletter', 'news_letter'); + + $this->addFieldMapping('field_memo', 'memo'); + + $this->addFieldMapping(NULL, 'activity'); + + $this->addUnmigratedDestinations(array( + 'role_names', 'data', 'field_memo:language', + 'field_company', 'field_company:source_type', 'field_company:create_term', 'field_company:ignore_case', + 'path', + )); + + $this->addUnmigratedSources(array( + 'status', 'date_end', 'type', + )); + } + + public function prepareRow($cr) { + + # change roles by end date + if($cr->date_end == ''){ + $roles[] = 7; + }else{ + $today = time(); + $time_end = strtotime($cr->date_end); + // dsm($time_end, 'time_end'); + + $roles = array(); + if($time_end > $today){ + $roles[] = 6; + }else{ + $roles[] = 7; + } + } + // dsm($roles, 'roles'); + $cr->roles = $roles; + + #user name + $cr->user_name = $this->getUserName($cr->email); + // TODO: set role expiration + + #duplicate email + if($this->checkDupEmail($cr->email)){ + $memo[] = "@dup-email : ".$cr->email; + } + + #language + $cr->def_locale = $cr->def_locale == 1 ? 'en' : 'fr'; + + #memo + $memo[] = "@imported"; + + #statuts + $memo[] = "statut : ".$cr->status; + + #statuts + $memo[] = "type : ".$cr->type; + + #statuts + $memo[] = "activity : ".$cr->activity; + + #memo + $cr->memo = implode("\n", $memo) ."\n\n". $cr->memo; + + return true; + // return FALSE if you wish to skip a particular row + } + + public function prepare($user, stdClass $row) { + // dsm('-- prepare --'); + // dsm($user, '$user'); + // dsm($row, '$row'); + + // $node->field_private_email = array('und'=>array($row->email_contact)); + + } + + public function complete($user, $row) { + // dsm('-- complete --'); + // Do what you need to do to + // dsm($row, '$row'); + // dsm($user, '$user'); + + if(in_array(6, $user->roles)){ + $time_end = strtotime($row->date_end); + $min = strtotime('2013 01 30'); + if($time_end < $min) + $time_end = $min; + + uc_roles_grant($user, 6, $time_end, FALSE, TRUE); + } + + + } + + + /** + * helpers + */ + + + private function getUserName($email){ + // Default implementation of name generation. + $new_name = preg_replace('/@.*$/', '', $email); + // Remove unwanted characters. + $new_name = preg_replace('/[^a-zA-Z0-9.-]/', '', $new_name); + + // if username generated from email record already exists, append underscore and number eg:(chris_123) + if ((bool) db_query("SELECT 1 FROM {users} WHERE LOWER(name) = LOWER(:new_name)", array(':new_name' => $new_name))->fetchField()) { + $name_idx = db_query_range("SELECT SUBSTRING_INDEX(name,'_',-1) FROM {users} WHERE name REGEXP :search ORDER BY CAST(SUBSTRING_INDEX(name,'_',-1) AS UNSIGNED) DESC", 0, 1, array(':search' => '^' . $new_name . '_[0-9]+$'))->fetchField(); + + $new_name .= '_' . ($name_idx + 1); + } + + return $new_name; + } + + private function checkDupEmail($email){ + if ((bool) db_query("SELECT 1 FROM {users} WHERE mail = :email", array(':email' => $email))->fetchField()) { + return true; + } + return false; + } +} + +/** + * MaterioIndustrialProfile2Migration + */ +class MaterioAdherentProfile2Migration extends MaterioBasicMigration { + public function __construct() { + parent::__construct(); + global $user; + $this->description = t('Migrate Materio Member Profiles2'); + + // provide better description for source fields + // and add new field source not from sql + $source_fields = array( + 'id_login' => t('Member id from source'), + 'member_name' => t('Main member name'), + 'member_firstname' => t('Main member first name'), + 'premise'=>'', + 'sub_premise'=>'', + ); + + + $query = db_select(MIG_MAT_SRC_DB .'.login_id', 'lid'); + $query->join(MIG_MAT_SRC_DB .'.member_id', 'mid', 'mid.id_member = lid.id_member'); + $query->join(MIG_MAT_SRC_DB .'.member_info', 'minf', 'mid.id_member = minf.id_member'); + + $query + ->fields('lid', array('id_login', 'status', 'name',)) + // ->fields('mid', array('memo', 'cgv')) + ->fields('minf', array( + 'con_title', 'con_name1', 'con_name2', 'con_quality', 'con_service', 'con_ccode1', 'con_tel1', + 'organization', 'employee', 'naf', 'siret', 'web', 'address', 'city', 'zip', 'country', ) + ) + // ->condition('status', 'A') + ->orderBy('lid.id_login', 'DESC'); + + // $query->groupBy('lid.id_member'); + + + $this->source = new MigrateSourceSQL($query, $source_fields); + // $this->dependencies = array('MaterioIndustrialUser'); + $this->destination = new MigrateDestinationProfile2('adherent'); + + $this->map = new MigrateSQLMap($this->machineName, + array( + 'id_login' => array( + 'type' => 'int', + 'unsigned' => TRUE, + 'not null' => TRUE, + 'description' => 'OLD Unique Member ID', + 'alias' => 'lid', + ) + ), + MigrateDestinationProfile2::getKeySchema() + ); + + // Connecting the profile2 to the user: + $this->addFieldMapping('uid', 'id_login') + ->sourceMigration('MaterioAdherentUser') // If your user migration class was named 'MyUserMigration', the string is 'MyUser' + ->description(t('The assignment of profile2-items to the respective Adherent user')); + + $this->addFieldMapping('revision_uid', 'id_login') + ->sourceMigration('MaterioAdherentUser'); + + // Make the mappings + $this->addFieldMapping('language')->defaultValue(''); + + $this->addFieldMapping('field_name', 'member_name'); + $this->addFieldMapping('field_first_name', 'member_firstname'); + $this->addFieldMapping(NULL, 'con_name1'); + $this->addFieldMapping(NULL, 'con_name2'); + $this->addFieldMapping(NULL, 'name'); + + + $this->addFieldMapping('field_private_quality', 'con_quality'); // http://drupal.org/node/1232028 + $this->addFieldMapping('field_private_name_title', 'con_title'); + + $arguments = array( + 'number' => array('source_field' => 'con_tel1'), + ); + $this->addFieldMapping('field_private_phone', 'con_ccode1') + ->arguments($arguments); + // field_private_phone:number + // field_private_phone:extension + $this->addFieldMapping(NULL, 'con_tel1'); + + $this->addFieldMapping(NULL, 'status'); + + $arguments = array( + 'thoroughfare' => array('source_field' => 'address'), + 'premise' => array('source_field' => 'premise'), + 'sub_premise' => array('source_field' => 'sub_premise'), + 'locality' => array('source_field' => 'city'), + 'postal_code' => array('source_field' => 'zip'), + ); + $this->addFieldMapping('field_adresse', 'country') + ->arguments($arguments); + + $this->addFieldMapping(NULL, 'address'); + $this->addFieldMapping(NULL, 'premise'); + $this->addFieldMapping(NULL, 'sub_premise'); + $this->addFieldMapping(NULL, 'city'); + $this->addFieldMapping(NULL, 'zip'); + $this->addFieldMapping(NULL, 'country'); + + $this->addFieldMapping('field_organization', 'organization'); + $this->addFieldMapping('field_service', 'con_service'); + $this->addFieldMapping('field_employee', 'employee'); + $this->addFieldMapping('field_naf', 'naf'); + $this->addFieldMapping('field_siret', 'siret'); + + + $this->addFieldMapping('field_user_website', 'web'); + + $this->addUnmigratedDestinations(array( + 'field_private_quality:language', 'field_first_name:language', 'field_name:language', + 'field_organization:language', 'field_activity:language', 'field_service:language', 'field_naf:language', 'field_siret:language', + 'field_private_phone:number', 'field_private_phone:extension', + + )); + + + } + + + public function prepareRow($cr) { + + if($cr->status == 'A'){ + # nom prenom + $cr->member_name = $cr->con_name1; + $cr->member_firstname = $cr->con_name2; + + #telephone + if($cr->con_ccode1 != ''){ + $ccs = cck_phone_countrycodes(); + $cc_founded = false; + foreach ($ccs as $cc => $cc_values) { + if('+'.preg_replace('/^\+/', '', trim($cr->con_ccode1)) == $cc_values['code']){ + $cr->con_ccode1 = $cc; + $cc_founded = true; + break; + } + } + if(!$cc_founded){ + // dsm($cr->con_ccode1, '$cr->con_ccode1'); + $cr->con_ccode1 = null; + } + } + + + }else{ + $name = explode(' ', $cr->name); + $cr->member_name = array_shift($name); + $cr->member_firstname = implode(' ', $name); + $cr->con_quality = ''; + $cr->con_title = ''; + $cr->con_ccode1 = ''; + $cr->con_tel1 = ''; + } + + $cr->organization = trim($cr->organization); + + + $cr->address = preg_replace('/\\n/', ', ', $cr->address); + if(strlen($cr->address) > 255){ + $adress = $cr->address; + $cr->address = substr($adress, 0, 250); + $cr->premise = substr($adress, 250, 500); + $sub = substr($adress, 500, 750); + $cr->sub_premise = $sub ? $sub : ''; + }else{ + $cr->premise = ''; + $cr->sub_premise = ''; + } + + $cr->city = preg_replace('/\\n/', ' ', $cr->city); + + if($cr->country != ''){ + require_once DRUPAL_ROOT . '/includes/locale.inc'; + $countries = country_get_list(); + + $c_founded = false; + foreach ($countries as $cc => $c) { + if(stristr($cr->country, $c)){ + $cr->country = $cc; + $c_founded = true; + break; + } + } + + if(!$c_founded){ + $nonISO_cc = array( + 'liban' => 'LB', + 'uk' => 'GB', + 'usa' => 'US', + 'korea, south' => 'KR', + 'brésil' => 'BR', + ); + foreach ($nonISO_cc as $n => $cc) { + if(stristr($cr->country, $n)){ + $cr->country = $cc; + $c_founded = true; + break; + } + } + + if(!$c_founded){ + // dsm($cr->country, '$cr->country'); + $cr->country = null; + } + + } + } + + + return TRUE; + // return FALSE if you wish to skip a particular row + } + + + + // public function prepare($node, stdClass $row) { + // // dsm('-- prepare --'); + // // dsm($node, '$node'); + // // dsm($row, '$row'); + // + // // $node->field_private_email = array('und'=>array($row->email_contact)); + // + // } +} \ No newline at end of file diff --git a/migrate_materio.info b/migrate_materio.info index 80ccd406..7f7b5444 100644 --- a/migrate_materio.info +++ b/migrate_materio.info @@ -13,6 +13,7 @@ core = 7.x ; Loadable code files files[] = migrate_materio.module files[] = migrate_materio.basic.inc + files[] = migrate_materio.adherent.inc files[] = migrate_materio.company.inc files[] = migrate_materio.account.inc files[] = migrate_materio.contact.inc @@ -34,6 +35,8 @@ core = 7.x ; dependencies[] = date dependencies[] = link ; dependencies[] = media + dependencies[] = uc_store + dependencies[] = uc_roles ; Configuration page ; configure = admin/config/migrate_materio