private function get_link_log_qb($kept = false) { $qb = org_openpsa_directmarketing_link_log_dba::new_query_builder(); if ($kept) { $qb->add_constraint('metadata.revised', '>=', $this->get_deletion_timestamp()); } else { $qb->add_constraint('metadata.revised', '<', $this->get_deletion_timestamp()); } return $qb; }
private function _create_link_receipt(&$receipt, &$token, &$target) { if (!array_key_exists('create_status', $this->_request_data)) { $this->_request_data['create_status'] = array('receipts' => array(), 'links' => array()); } //Store the click in database $link = new org_openpsa_directmarketing_link_log_dba(); $link->person = $receipt->person; $link->message = $receipt->message; $link->target = $target; $link->token = $token; $this->_request_data['create_status']['links'][$target] = $link->create(); //Create received and read receipts $read_receipt = new org_openpsa_directmarketing_campaign_messagereceipt_dba(); $read_receipt->person = $receipt->person; $read_receipt->message = $receipt->message; $read_receipt->token = $token; $read_receipt->orgOpenpsaObtype = org_openpsa_directmarketing_campaign_messagereceipt_dba::RECEIVED; $this->_request_data['create_status']['receipts'][$token] = $read_receipt->create(); }
/** * 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; }
private function _get_link_data($segmentation_param) { $this->_request_data['report']['link_data'] = array(); $link_data =& $this->_request_data['report']['link_data']; $link_data['counts'] = array(); $link_data['percentages'] = array('of_links' => array(), 'of_recipients' => array()); $link_data['rules'] = array(); $link_data['tokens'] = array(); if ($segmentation_param) { $link_data['segments'] = array(); } $segment_prototype = array(); $segment_prototype['counts'] = array(); $segment_prototype['percentages'] = array('of_links' => array(), 'of_recipients' => array()); $segment_prototype['rules'] = array(); $segment_prototype['tokens'] = array(); $qb_links = org_openpsa_directmarketing_link_log_dba::new_query_builder(); $qb_links->add_constraint('message', '=', $this->_request_data['message']->id); $qb_links->add_constraint('target', 'NOT LIKE', '%unsubscribe%'); $links = $qb_links->execute_unchecked(); $link_data['total'] = count($links); foreach ($links as $link) { $segment = ''; $segment_notfound = false; if ($segmentation_param && !empty($link->person)) { try { $person = org_openpsa_contacts_person_dba::get_cached($link->person); $segment = $person->parameter('org.openpsa.directmarketing.segments', $segmentation_param); } catch (midcom_error $e) { } if (empty($segment)) { $segment = $this->_l10n->get('no segment'); $segment_notfound = true; } if (!isset($link_data['segments'][$segment])) { $link_data['segments'][$segment] = $segment_prototype; } $segment_data =& $link_data['segments'][$segment]; } else { $segment_data = $segment_prototype; } $this->_increment_totals($link_data, $link); $this->_increment_totals($segment_data, $link); $this->_calculate_percentages($link_data, $link); $this->_calculate_percentages($segment_data, $link); if (!isset($link_data['rules'][$link->target])) { $link_data['rules'][$link->target] = array('comment' => sprintf($this->_l10n->get('all persons who have clicked on link "%s" in message #%d and have not unsubscribed from campaign #%d'), $link->target, $link->message, $this->_request_data['message']->campaign), 'type' => 'AND', 'classes' => array(array('comment' => $this->_l10n->get('link and message limits'), 'type' => 'AND', 'class' => 'org_openpsa_directmarketing_link_log_dba', 'rules' => array(array('property' => 'target', 'match' => '=', 'value' => $link->target), array('property' => 'message', 'match' => '=', 'value' => $link->message))), array('comment' => $this->_l10n->get('not-unsubscribed -limits'), 'type' => 'AND', 'class' => 'org_openpsa_directmarketing_campaign_member_dba', 'rules' => array(array('property' => 'orgOpenpsaObtype', 'match' => '<>', 'value' => org_openpsa_directmarketing_campaign_member_dba::UNSUBSCRIBED), array('property' => 'campaign', 'match' => '=', 'value' => $this->_request_data['message']->campaign))))); } if (!isset($segment_data['rules'][$link->target])) { $segment_data['rules'][$link->target] = $link_data['rules'][$link->target]; if (!$segment_notfound) { $segmentrule = array('comment' => $this->_l10n->get('segment limits'), 'type' => 'AND', 'class' => 'org_openpsa_contacts_person_dba', 'rules' => array(array('property' => 'parameter.domain', 'match' => '=', 'value' => 'org.openpsa.directmarketing.segments'), array('property' => 'parameter.name', 'match' => '=', 'value' => $segmentation_param), array('property' => 'parameter.value', 'match' => '=', 'value' => $segment))); // On a second thought, we cannot query for empty parameter values... $segment_data['rules'][$link->target]['comment'] = sprintf($this->_l10n->get('all persons in market segment "%s" who have clicked on link "%s" in message #%d and have not unsubscribed from campaign #%d'), $segment, $link->target, $link->message, $this->_request_data['message']->campaign); $segment_data['rules'][$link->target]['classes'][] = $segment; } } } arsort($link_data['counts']); arsort($link_data['percentages']['of_links']); arsort($link_data['percentages']['of_recipients']); if ($segmentation_param) { ksort($link_data['segments']); foreach ($link_data['segments'] as $segment => $dummy) { $segment_data =& $link_data['segments'][$segment]; arsort($segment_data['counts']); arsort($segment_data['percentages']['of_links']); arsort($segment_data['percentages']['of_recipients']); } } }