"; //check if migration already had ran ... $migration = Migration::get()->filter('Name', $this->title)->First(); if (!$migration) { //if not create migration and run it... $migration = new Migration(); $migration->Name = $this->title; $migration->Description = $this->description; $migration->Write(); //run migration proc //get migration data from cvs file, //this cvs file contains all Orgs that should be splitted on several //current affiliations $ds = new CvsDataSourceReader("\t"); $cur_path = Director::baseFolder(); $ds->Open($cur_path . "/openstack/code/migrations/data/orgs.csv"); $headers = $ds->getFieldsInfo(); $split_organizations = array(); //and stored those ones on a hash try { while (($row = $ds->getNextRow()) !== FALSE) { $id = $row[$headers["ID"]]; $split = $row[$headers["Split"]]; $name = $row[$headers["Name"]]; if ($split == 'True' || $split == 'SEMICOLON') { $split_organizations[$id] = array( "Split" => $split, "Name" => $name ); } } } catch (Exception $e) { $status = 0; } echo sprintf("Multiple Organization Count %d
", count($split_organizations)); echo 'Procesing Members....
'; $count = DB::query("SELECT COUNT(ID) From Member Where OrgID IS NOT NULL;")->value(); echo sprintf("%d Members to process
", $count); $page = 0; $page_size = 1000; $page_count = ceil($count / $page_size); for ($page = 0; $page <= $page_count; $page++) { echo sprintf("Procesing Member Page %d Of %d ...
", $page, $page_count); $start_from = ($page) * $page_size; //get current org $res = DB::query("SELECT Member.ID AS MemberID, Org.ID AS OrgID, Org.Name AS OrgName , Org.IsStandardizedOrg, Member.JobTitle, Member.Role From Member INNER JOIN Org ON Org.ID=Member.OrgID Where OrgID IS NOT NULL LIMIT {$start_from}, {$page_size};"); $multi_org_id = null; foreach ($res as $record) { $curOrgID = $record["OrgID"]; $curMemberID = $record["MemberID"]; $curRole = $record["Role"]; $curJobTitle = $record["JobTitle"]; //is multiple current affiliations? if (isset($split_organizations[$curOrgID])) { $multi_org_id = $curOrgID; $org_aux = $split_organizations[$curOrgID]; $org_name = $org_aux["Name"]; $mode = $org_aux["Split"]; $affiliations = array(); switch ($mode) { case "True": $affiliations = explode(",", $org_name); break; case "SEMICOLON": $affiliations = explode(";", $org_name); break; } foreach ($affiliations as $a) { $a = Convert::raw2sql(trim($a)); $org_id = DB::query("SELECT ID From Org WHERE Name = '{$a}' AND ID <> {$curOrgID} ORDER BY ID ASC LIMIT 1")->value(); if (is_null($org_id)) $org_id = DB::query("SELECT ID From Org WHERE Name Like '%{$a}%' AND ID <> {$curOrgID} ORDER BY ID ASC LIMIT 1")->value(); if (is_null($org_id)) { //create Org $org_id = $this->writeOrg($a); } //create affiliation $this->writeAffiliation(null, null, null, null, true, $curMemberID, $org_id); //check if we have it on history repeated to get the from date $res2 = DB::query("SELECT NewAffiliation,OldAffiliation,Created,LastEdited FROM AffiliationUpdate WHERE MemberID={$curMemberID} AND NewAffiliation=OldAffiliation AND OldAffiliation='{$curOrgID}' ORDER BY Created ASC;"); if($res2){ foreach ($res2 as $record2) { $this->updateAffiliationStartDate($record2['Created'],$curMemberID,$org_id); break; } } } } else { //single current affiliation //create affiliation $this->writeAffiliation(null, null, $curJobTitle, $curRole, true, $curMemberID, $curOrgID); } //now build affiliation history ... if(!is_null($multi_org_id)){ $res3 = DB::query("SELECT NewAffiliation,OldAffiliation,Created,LastEdited FROM AffiliationUpdate WHERE MemberID={$curMemberID} AND NewAffiliation<>'{$multi_org_id}' AND OldAffiliation<>'{$multi_org_id}' ORDER BY Created ASC;"); } else{ $res3 = DB::query("SELECT NewAffiliation,OldAffiliation,Created,LastEdited FROM AffiliationUpdate WHERE MemberID={$curMemberID} ORDER BY Created ASC;"); } foreach ($res3 as $record3) { $old_org = Convert::raw2sql(trim($record3["OldAffiliation"])); $new_org = Convert::raw2sql(trim($record3["NewAffiliation"])); $created = $record3["Created"]; $new_org_id = $this->getOrgId($new_org); $old_org_id = $this->getOrgId($old_org); if(is_null($new_org_id)) continue; //create affiliation if ($new_org_id == $old_org_id || is_null($old_org_id)) { //check if current $count = DB::query("SELECT COUNT(ID) FROM Affiliation WHERE MemberID={$curMemberID} AND OrganizationID={$new_org_id} AND Current=1;")->value(); if ($count > 0){ $this->updateAffiliationStartDate($created,$curMemberID,$new_org_id); continue; } //check if does not not exists already $count = DB::query("SELECT COUNT(ID) FROM Affiliation WHERE MemberID={$curMemberID} AND OrganizationID={$new_org_id}")->value(); if ($count > 0) continue; //new one $this->writeAffiliation($created, null, null, null, false, $curMemberID, $new_org_id); } else{ //try to update old affiliation $this->updateAffiliationEndDate($created,$curMemberID,$old_org_id); //check if current $count = DB::query("SELECT COUNT(ID) FROM Affiliation WHERE MemberID={$curMemberID} AND OrganizationID={$new_org_id} AND Current=1;")->value(); if ($count > 0) { $this->updateAffiliationStartDate($created,$curMemberID,$new_org_id); continue; } $this->writeAffiliation($created, null, null, null, false, $curMemberID, $new_org_id); } } } } } else{ echo "Migration Already Ran!
"; } echo "Migration Done
"; } private function getOrgId($orgId){ $res = null; if(!is_numeric($orgId)){ $res = DB::query("SELECT ID From Org Where Name ='{$orgId}' ORDER BY ID ASC LIMIT 1;")->value(); if (is_null($res)) $res = DB::query("SELECT ID From Org Where Name Like '%{$orgId}%' ORDER BY ID ASC LIMIT 1;")->value(); } else{ $res = intval($orgId); } return $res; } private function writeAffiliation($start_date, $end_data, $job_title, $role, $current, $member_id, $org_id) { $role = Convert::raw2sql($role); $job_title = Convert::raw2sql($job_title); $current = $current==true?1:0; $query = "INSERT INTO `Affiliation` (`ClassName`,`Created`,`LastEdited`,`StartDate`,`EndDate`,`JobTitle`,`Role`,`MemberID`,`OrganizationID`,`Current`)"; $query .=" VALUES('Affiliation',now(),now(),"; $query .= !is_null($start_date)?"'{$start_date}',":"NULL,"; $query .= !is_null($end_data)?"'{$end_data}',":"NULL,"; $query .= !is_null($job_title)?"'{$job_title}',":"NULL,"; $query .= !is_null($role)?"'{$role}',":"NULL,"; $query .= "{$member_id},{$org_id},{$current});"; //echo sprintf("Query %s
",$query); DB::query($query); } private function updateAffiliationEndDate($end_data,$member_id, $org_id) { $query = "UPDATE `Affiliation` SET `EndDate`= '{$end_data}' WHERE MemberID = {$member_id} AND OrganizationID={$org_id} AND EndDate IS NULL"; DB::query($query); } private function updateAffiliationStartDate($start_data,$member_id, $org_id) { $query = "UPDATE `Affiliation` SET `StartDate`= '{$start_data}' WHERE MemberID = {$member_id} AND OrganizationID={$org_id} AND StartDate IS NULL"; DB::query($query); } private function writeOrg($name){ $name = Convert::raw2sql($name); $query= " INSERT INTO `Org` (`ClassName`,`Created`,`LastEdited`,`Name`,`IsStandardizedOrg`,`FoundationSupportLevel`,`OrgProfileID`) VALUES ('Org',now(),now(),'{$name}',0,'Platinum Member',0); "; DB::query($query); $query = "SELECT ID From Org WHERE Name='{$name}' LIMIT 1;"; return DB::query($query)->value(); } function down() { } }