private function mergeStart($OldUserID, $NewUserID)
{
$Model = new Gdn_Model('UserMerge');
// Grab the users.
$OldUser = $this->getID($OldUserID, DATASET_TYPE_ARRAY);
$NewUser = $this->getID($NewUserID, DATASET_TYPE_ARRAY);
// First see if there is a record with the same merge.
$Row = $Model->getWhere(['OldUserID' => $OldUserID, 'NewUserID' => $NewUserID])->firstRow(DATASET_TYPE_ARRAY);
if ($Row) {
$MergeID = $Row['MergeID'];
// Save this merge in the log.
if ($Row['Attributes']) {
$Attributes = dbdecode($Row['Attributes']);
} else {
$Attributes = [];
}
$Attributes['Log'][] = ['UserID' => Gdn::session()->UserID, 'Date' => Gdn_Format::toDateTime()];
$Row = ['MergeID' => $MergeID, 'Attributes' => $Attributes];
} else {
$Row = ['OldUserID' => $OldUserID, 'NewUserID' => $NewUserID];
}
$UserSet = [];
$OldUserSet = [];
if (dateCompare($OldUser['DateFirstVisit'], $NewUser['DateFirstVisit']) < 0) {
$UserSet['DateFirstVisit'] = $OldUser['DateFirstVisit'];
}
if (!isset($Row['Attributes']['User']['CountVisits'])) {
$UserSet['CountVisits'] = $OldUser['CountVisits'] + $NewUser['CountVisits'];
$OldUserSet['CountVisits'] = 0;
}
if (!empty($UserSet)) {
// Save the user information on the merge record.
foreach ($UserSet as $Key => $Value) {
// Only save changed values that aren't already there from a previous merge.
if ($NewUser[$Key] != $Value && !isset($Row['Attributes']['User'][$Key])) {
$Row['Attributes']['User'][$Key] = $NewUser[$Key];
}
}
}
$MergeID = $Model->save($Row);
if (val('MergeID', $Row)) {
$MergeID = $Row['MergeID'];
}
if (!$MergeID) {
throw new Gdn_UserException($Model->Validation->resultsText());
}
// Update the user with the new user-level data.
$this->setField($NewUserID, $UserSet);
if (!empty($OldUserSet)) {
$this->setField($OldUserID, $OldUserSet);
}
return $MergeID;
}