/** * Find all old send tokens and clear them. */ public function _on_execute() { //Disable limits, TODO: think if this could be done in smaller chunks to save memory. midcom::get()->disable_limits(); debug_add('_on_execute called'); $days = $this->_config->get('send_token_max_age'); if ($days == 0) { debug_add('send_token_max_age evaluates to zero, aborting'); return; } $th = time() - $days * 3600 * 24; $qb = org_openpsa_directmarketing_campaign_messagereceipt_dba::new_query_builder(); $qb->add_constraint('token', '<>', ''); $qb->add_constraint('timestamp', '<', $th); $qb->add_constraint('orgOpenpsaObtype', '=', org_openpsa_directmarketing_campaign_messagereceipt_dba::SENT); $ret = $qb->execute_unchecked(); if ($ret === false || !is_array($ret)) { //TODO: display some error ? return false; } if (empty($ret)) { debug_add('No results, returning early.'); return; } foreach ($ret as $receipt) { debug_add("clearing token '{$receipt->token}' from receipt #{$receipt->id}"); $receipt->token = ''; $stat = $receipt->update(); if (!$stat) { debug_add("FAILED to update receipt #{$receipt->id}, errstr: " . midcom_connection::get_error_string(), MIDCOM_LOG_WARN); } } debug_add('Done'); return; }
/** * Builds the message report array */ private function _analyze_message_report(&$data) { midcom::get('auth')->require_valid_user(); $this->_request_data['report'] = array(); $qb_receipts = org_openpsa_directmarketing_campaign_messagereceipt_dba::new_query_builder(); $qb_receipts->add_constraint('message', '=', $this->_request_data['message']->id); $qb_receipts->add_constraint('orgOpenpsaObtype', '=', org_openpsa_directmarketing_campaign_messagereceipt_dba::SENT); $receipts = $qb_receipts->execute_unchecked(); $this->_request_data['report']['receipt_data'] = array(); $receipt_data =& $this->_request_data['report']['receipt_data']; $receipt_data['first_send'] = false; $receipt_data['last_send'] = false; $receipt_data['sent'] = count($receipts); $receipt_data['bounced'] = 0; foreach ($receipts as $receipt) { if ($receipt_data['first_send'] === false || $receipt->timestamp < $receipt_data['first_send']) { $receipt_data['first_send'] = $receipt->timestamp; } if ($receipt_data['last_send'] === false || $receipt->timestamp > $receipt_data['last_send']) { $receipt_data['last_send'] = $receipt->timestamp; } if ($receipt->bounced) { $receipt_data['bounced']++; } } $this->_get_campaign_data($receipt_data['first_send']); $segmentation_param = false; if (!empty($data['message_array']['report_segmentation'])) { $segmentation_param = $data['message_array']['report_segmentation']; } $this->_get_link_data($segmentation_param); }
private function get_message_receipt_qb($kept = false) { $qb = org_openpsa_directmarketing_campaign_messagereceipt_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; }
public function testCRUD() { midcom::get('auth')->request_sudo('org.openpsa.directmarketing'); $topic = $this->create_object('midcom_db_topic', array('component' => 'org.openpsa.directmarketing')); $campaign = $this->create_object('org_openpsa_directmarketing_campaign_dba', array('node' => $topic->id)); $message = $this->create_object('org_openpsa_directmarketing_campaign_message_dba', array('campaign' => $campaign->id)); $receipt = new org_openpsa_directmarketing_campaign_messagereceipt_dba(); $stat = $receipt->create(); $this->assertFalse($stat); $receipt = new org_openpsa_directmarketing_campaign_messagereceipt_dba(); $receipt->message = $message->id; $stat = $receipt->create(); $this->assertTrue($stat); $this->register_object($receipt); $receipt->token = 'TEST'; $stat = $receipt->update(); $this->assertTrue($stat); $receipt->refresh(); $this->assertEquals('TEST', $receipt->token); $stat = $receipt->delete(); $this->assertTrue($stat); midcom::get('auth')->drop_sudo(); }
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; }
/** * Creates a random token string that can be used to track a single * email delivery. The returned token string will only contain * lowercase alphanumeric characters and will start with a lowercase * letter to avoid problems with special processing being triggered * by special characters in the token string. * * @return random token string */ private function _create_email_token() { //Testers need dummy token if ($this->test_mode) { return 'dummy'; } //Use mt_rand if possible (faster, more random) if (function_exists('mt_rand')) { $rand = 'mt_rand'; } else { $rand = 'rand'; } $tokenchars = 'abcdefghijklmnopqrstuvwxyz0123456789'; $token = $tokenchars[$rand(0, strlen($tokenchars) - 11)]; for ($i = 1; $i < $this->token_size; $i++) { $token .= $tokenchars[$rand(0, strlen($tokenchars) - 1)]; } //If token is not free or (very, very unlikely) matches our dummy token, recurse. if (!org_openpsa_directmarketing_campaign_messagereceipt_dba::token_is_free($token) || $token === 'dummy') { return $this->_create_email_token(); } return $token; }
/** * Creates a message receipt of type. */ function create_receipt($message_id, $type, $token = '', $parameters = false) { $receipt = new org_openpsa_directmarketing_campaign_messagereceipt_dba(); $receipt->orgOpenpsaObtype = $type; $receipt->person = $this->person; $receipt->message = $message_id; $receipt->token = $token; $receipt->timestamp = time(); midcom::get('auth')->request_sudo('org.openpsa.directmarketing'); $stat = $receipt->create(); if (!$stat) { debug_add('Failed to create, errstr: ' . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); return $stat; } if (is_array($parameters) && !empty($parameters)) { foreach ($parameters as $param_data) { if (empty($param_data['domain']) || empty($param_data['name']) || empty($param_data['value'])) { // TODO: Log warning continue; } $receipt->set_parameter($param_data['domain'], $param_data['name'], $param_data['value']); } } midcom::get('auth')->drop_sudo(); }