/** * Support for contacts person merge */ function org_openpsa_contacts_duplicates_merge_person(&$person1, &$person2, $mode) { switch ($mode) { case 'all': break; /* In theory we could have future things (like resource/manager ships), but now we don't support that mode, we just exit */ /* In theory we could have future things (like resource/manager ships), but now we don't support that mode, we just exit */ case 'future': return true; break; default: // Mode not implemented debug_add("mode {$mode} not implemented", MIDCOM_LOG_ERROR); return false; break; } // Transfer links from classes we drive // ** expense reports ** $qb_expense = org_openpsa_expenses_expense::new_query_builder(); $qb_expense->add_constraint('person', '=', $person2->id); $expenses = $qb_expense->execute(); if ($expenses === false) { // Some error with QB debug_add('QB Error / expenses', MIDCOM_LOG_ERROR); return false; } foreach ($expenses as $expense) { debug_add("Transferred expense #{$expense->id} to person #{$person1->id} (from #{$expense->person})", MIDCOM_LOG_INFO); $expense->person = $person1->id; if (!$expense->update()) { // Error updating debug_add("Failed to update expense #{$expense->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return false; } } // Transfer metadata dependencies from classes that we drive $classes = array('org_openpsa_expenses_expense'); $metadata_fields = array('creator' => 'guid', 'revisor' => 'guid'); foreach ($classes as $class) { $ret = org_openpsa_contacts_duplicates_merge::person_metadata_dependencies_helper($class, $person1, $person2, $metadata_fields); if (!$ret) { // Failure updating metadata debug_add("Failed to update metadata dependencies in class {$class}, errsrtr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return false; } } // All done return true; }
/** * Support for contacts person merge */ function org_openpsa_contacts_duplicates_merge_person(&$person1, &$person2, $mode) { switch ($mode) { case 'all': break; /* In theory we could have future things (like resource/manager ships), but now we don't support that mode, we just exit */ /* In theory we could have future things (like resource/manager ships), but now we don't support that mode, we just exit */ case 'future': return true; break; default: // Mode not implemented debug_add("mode {$mode} not implemented", MIDCOM_LOG_ERROR); return false; break; } // Transfer links from classes we drive // ** resources ** $qb_member = org_openpsa_projects_task_resource_dba::new_query_builder(); $qb_member->add_constraint('person', '=', $person2->id); $members = $qb_member->execute(); if ($members === false) { // Some error with QB debug_add('QB Error', MIDCOM_LOG_ERROR); return false; } // Transfer memberships foreach ($members as $member) { // TODO: figure out duplicate memberships and delete unneeded ones $member->person = $person1->id; debug_add("Transferred task resource #{$member->id} to person #{$person1->id} (from #{$member->person})", MIDCOM_LOG_INFO); if (!$member->update()) { debug_add("Failed to update task resource #{$member->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return false; } } // ** task statuses ** $qb_receipt = org_openpsa_projects_task_status_dba::new_query_builder(); $qb_receipt->add_constraint('targetPerson', '=', $person2->id); $receipts = $qb_receipt->execute(); if ($receipts === false) { // Some error with QB debug_add('QB Error / status', MIDCOM_LOG_ERROR); return false; } foreach ($receipts as $receipt) { debug_add("Transferred task_status #{$receipt->id} to person #{$person1->id} (from #{$receipt->person})", MIDCOM_LOG_INFO); $receipt->targetPerson = $person1->id; if (!$receipt->update()) { // Error updating debug_add("Failed to update status #{$receipt->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return false; } } // ** hour reports ** $qb_log = org_openpsa_projects_hour_report_dba::new_query_builder(); $qb_log->add_constraint('person', '=', $person2->id); $logs = $qb_log->execute(); if ($logs === false) { // Some error with QB debug_add('QB Error / hours', MIDCOM_LOG_ERROR); return false; } foreach ($logs as $log) { debug_add("Transferred hour_report #{$log->id} to person #{$person1->id} (from #{$log->person})", MIDCOM_LOG_INFO); $log->person = $person1->id; if (!$log->update()) { // Error updating debug_add("Failed to update hour_report #{$log->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return false; } } // ** Task managers ** $qb_task = org_openpsa_projects_task_dba::new_query_builder(); $qb_task->add_constraint('manager', '=', $person2->id); $tasks = $qb_task->execute(); if ($tasks === false) { // Some error with QB debug_add('QB Error / tasks', MIDCOM_LOG_ERROR); return false; } foreach ($tasks as $task) { debug_add("Transferred task #{$task->id} to person #{$person1->id} (from #{$task->person})", MIDCOM_LOG_INFO); $task->manager = $person1->id; if (!$task->update()) { // Error updating debug_add("Failed to update task #{$task->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return false; } } // Transfer metadata dependencies from classes that we drive $classes = array('org_openpsa_projects_task_resource_dba', 'org_openpsa_projects_task_status_dba', 'org_openpsa_projects_task_dba', 'org_openpsa_projects_hour_report_dba'); $metadata_fields = array('creator' => 'guid', 'revisor' => 'guid'); foreach ($classes as $class) { $ret = org_openpsa_contacts_duplicates_merge::person_metadata_dependencies_helper($class, $person1, $person2, $metadata_fields); if (!$ret) { // Failure updating metadata debug_add("Failed to update metadata dependencies in class {$class}, errsrtr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return false; } } // All done return true; }
/** * Support for contacts person merge */ function org_openpsa_contacts_duplicates_merge_person(&$person1, &$person2, $mode) { switch ($mode) { case 'all': break; case 'future': // Contacts does not have future references so we have nothing to transfer... return true; break; default: // Mode not implemented debug_add("mode {$mode} not implemented", MIDCOM_LOG_ERROR); return false; break; } $qb = midcom_db_member::new_query_builder(); $qb->begin_group('OR'); // We need the remaining persons memberships later when we compare the two $qb->add_constraint('uid', '=', $person1->id); $qb->add_constraint('uid', '=', $person2->id); $qb->end_group(); $members = $qb->execute(); if ($members === false) { // Some error with QB debug_add('QB Error', MIDCOM_LOG_ERROR); return false; } // Transfer memberships $membership_map = array(); foreach ($members as $member) { if ($member->uid != $person1->id) { debug_add("Transferred membership #{$member->id} to person #{$person1->id} (from #{$member->uid})"); $member->uid = $person1->id; } if (!isset($membership_map[$member->gid]) || !is_array($membership_map[$member->gid])) { $membership_map[$member->gid] = array(); } $membership_map[$member->gid][] = $member; } unset($members); // Merge memberships foreach ($membership_map as $members) { foreach ($members as $member) { if (count($members) == 1) { // We only have one membership in this group, skip rest of the logic if (!$member->update()) { // Failure updating member debug_add("Failed to update member #{$member->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return false; } continue; } // TODO: Compare memberships to determine which of them are identical and thus not worth keeping if (!$member->update()) { // Failure updating member debug_add("Failed to update member #{$member->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return false; } } } // Transfer metadata dependencies from classes that we drive $classes = array('midcom_db_member', 'org_openpsa_contacts_person_dba', 'org_openpsa_contacts_group_dba'); $metadata_fields = array('creator' => 'guid', 'revisor' => 'guid'); foreach ($classes as $class) { $ret = org_openpsa_contacts_duplicates_merge::person_metadata_dependencies_helper($class, $person1, $person2, $metadata_fields); if (!$ret) { // Failure updating metadata debug_add("Failed to update metadata dependencies in class {$class}, errsrtr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return false; } } // Copy fields missing from person1 and present in person2 over $skip_properties = array('id' => true, 'guid' => true); $changed = false; foreach ($person2 as $property => $value) { // Copy only simple properties not marked to be skipped missing from person1 if (empty($person2->{$property}) || !empty($person1->{$property}) || isset($skip_properties[$property]) || is_array($value) || is_object($value)) { continue; } $person1->{$property} = $value; $changed = true; } // Avoid unnecessary updates if ($changed) { if (!$person1->update()) { // Error updating person debug_add("Error updating person #{$person1->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return false; } } // PONDER: sensible way to do the same for parameters ?? return true; }
/** * Support for contacts person merge */ function org_openpsa_contacts_duplicates_merge_person(&$person1, &$person2, $mode) { switch ($mode) { case 'all': break; case 'future': // DirMar does not have future references so we have nothing to transfer... return true; break; default: // Mode not implemented debug_add("mode {$mode} not implemented", MIDCOM_LOG_ERROR); return false; break; } // Transfer links from classes we drive // ** Members ** $qb_member = org_openpsa_directmarketing_campaign_member_dba::new_query_builder(); $qb_member->add_constraint('person', '=', $person2->id); $members = $qb_member->execute(); if ($members === false) { // Some error with QB debug_add('QB Error', MIDCOM_LOG_ERROR); return false; } // Transfer memberships foreach ($members as $member) { $member->person = $person1->id; if (!$member->_check_duplicate_membership()) { // This is a duplicate membership, delete it debug_add("Person #{$person1->id} is already member in campaign #{$member->campaign}, removing membership #{$member->id}", MIDCOM_LOG_INFO); if (!$member->delete()) { debug_add("Could not delete campaign member #{$member->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return false; } continue; } debug_add("Transferred campaign membership #{$member->id} to person #{$person1->id} (from #{$member->person})", MIDCOM_LOG_INFO); if (!$member->update()) { debug_add("Failed to update campaign member #{$member->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return false; } } // ** Receipts ** $qb_receipt = org_openpsa_directmarketing_campaign_messagereceipt_dba::new_query_builder(); $qb_receipt->add_constraint('person', '=', $person2->id); $receipts = $qb_receipt->execute(); if ($receipts === false) { // Some error with QB debug_add('QB Error / receipts', MIDCOM_LOG_ERROR); return false; } foreach ($receipts as $receipt) { debug_add("Transferred message_receipt #{$receipt->id} to person #{$person1->id} (from #{$receipt->person})", MIDCOM_LOG_INFO); $receipt->person = $person1->id; if (!$receipt->update()) { // Error updating debug_add("Failed to update receipt #{$receipt->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return false; } } // ** Logs ** $qb_log = org_openpsa_directmarketing_link_log_dba::new_query_builder(); $qb_log->add_constraint('person', '=', $person2->id); $logs = $qb_log->execute(); if ($logs === false) { // Some error with QB debug_add('QB Error / links', MIDCOM_LOG_ERROR); return false; } foreach ($logs as $log) { debug_add("Transferred link_log #{$log->id} to person #{$person1->id} (from #{$log->person})", MIDCOM_LOG_INFO); $log->person = $person1->id; if (!$log->update()) { // Error updating debug_add("Failed to update link #{$log->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return false; } } // Transfer metadata dependencies from classes that we drive $classes = array('org_openpsa_directmarketing_campaign_dba', 'org_openpsa_directmarketing_campaign_member_dba', 'org_openpsa_directmarketing_campaign_message_dba', 'org_openpsa_directmarketing_campaign_messagereceipt_dba', 'org_openpsa_directmarketing_link_log_dba'); foreach ($classes as $class) { // TODO: 1.8 metadata format support $ret = org_openpsa_contacts_duplicates_merge::person_metadata_dependencies_helper($class, $person1, $person2, $metadata_fields); if (!$ret) { // Failure updating metadata debug_add("Failed to update metadata dependencies in class {$class}, errsrtr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return false; } } // All done return true; }
/** * Support for contacts person merge */ function org_openpsa_contacts_duplicates_merge_person(&$person1, &$person2, $mode) { switch ($mode) { case 'all': break; /* case 'future': // Calendar should have future mode but we don't support it yet break; */ /* case 'future': // Calendar should have future mode but we don't support it yet break; */ default: // Mode not implemented debug_add("mode {$mode} not implemented", MIDCOM_LOG_ERROR); return false; break; } $qb = org_openpsa_calendar_event_member_dba::new_query_builder(); $qb->begin_group('OR'); // We need the remaining persons memberships later when we compare the two $qb->add_constraint('uid', '=', $person1->id); $qb->add_constraint('uid', '=', $person2->id); $qb->end_group(); $members = $qb->execute(); if ($members === false) { // Some error with QB debug_add('QB Error', MIDCOM_LOG_ERROR); return false; } // Transfer memberships $membership_map = array(); foreach ($members as $member) { if ($member->uid != $person1->id) { debug_add("Transferred event membership #{$member->id} to person #{$person1->id} (from #{$member->uid})"); $member->uid = $person1->id; } if (!isset($membership_map[$member->eid]) || !is_array($membership_map[$member->eid])) { $membership_map[$member->eid] = array(); } $membership_map[$member->eid][] = $member; } unset($members); // Merge memberships foreach ($membership_map as $members) { foreach ($members as $member) { if (count($members) == 1) { // We only have one membership in this event, skip rest of the logic if (!$member->update()) { // Failure updating member debug_add("Failed to update eventmember #{$member->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return false; } continue; } // TODO: Compare memberships to determine which of them are identical and thus not worth keeping if (!$member->update()) { // Failure updating member debug_add("Failed to update eventmember #{$member->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return false; } } } // Transfer metadata dependencies from classes that we drive $classes = array('org_openpsa_calendar_event_dba', 'org_openpsa_calendar_event_member_dba'); $metadata_fields = array('creator' => 'guid', 'revisor' => 'guid'); foreach ($classes as $class) { $ret = org_openpsa_contacts_duplicates_merge::person_metadata_dependencies_helper($class, $person1, $person2, $metadata_fields); if (!$ret) { // Failure updating metadata debug_add("Failed to update metadata dependencies in class {$class}, errsrtr: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return false; } } return true; }