/** * Phase for showing the list of campaigns * * @param String $handler_id Name of the request handler * @param array $args Variable arguments * @param array &$data Public request data, passed by reference */ public function _handler_list($handler_id, array $args, array &$data) { midcom::get('auth')->require_valid_user(); if (count($args) == 1) { $this->_request_data['person'] = new org_openpsa_contacts_person_dba($args[0]); if (array_key_exists('add_to_campaign', $_POST)) { // Add person to campaign try { $campaign = new org_openpsa_directmarketing_campaign_dba($_POST['add_to_campaign']); } catch (midcom_error $e) { // FIXME: More informative error message midcom::get('uimessages')->add($this->_l10n->get('org.openpsa.directmarketing'), sprintf($this->_l10n->get('Failed adding person %s to campaign %s'), "{$this->_request_data['person']->firstname} {$this->_request_data['person']->lastname}", $_POST['add_to_campaign']), 'error'); return; } // FIXME: use can_do check to be graceful $campaign->require_do('midgard:create'); $member = new org_openpsa_directmarketing_campaign_member_dba(); $member->orgOpenpsaObType = org_openpsa_directmarketing_campaign_member_dba::NORMAL; $member->person = $this->_request_data['person']->id; $member->campaign = $campaign->id; if ($member->create()) { midcom::get('uimessages')->add($this->_l10n->get('org.openpsa.directmarketing'), sprintf($this->_l10n->get('added person %s to campaign %s'), "{$this->_request_data['person']->firstname} {$this->_request_data['person']->lastname}", $campaign->title), 'ok'); } else { midcom::get('uimessages')->add($this->_l10n->get('org.openpsa.directmarketing'), sprintf($this->_l10n->get('Failed adding person %s to campaign %s'), "{$this->_request_data['person']->firstname} {$this->_request_data['person']->lastname}", $campaign->title), 'error'); } } } }
public function testCRUD() { midcom::get('auth')->request_sudo('org.openpsa.directmarketing'); $member = new org_openpsa_directmarketing_campaign_member_dba(); $stat = $member->create(); $this->assertTrue($stat); $this->register_object($member); $member->suspended = 1; $stat = $member->update(); $this->assertTrue($stat); $member->refresh(); $this->assertEquals(1, $member->suspended); $stat = $member->delete(); $this->assertTrue($stat); midcom::get('auth')->drop_sudo(); }
private function _import_subscribers_campaign_member($subscriber, $person) { // Check if person is already in campaign $member = null; $qb = org_openpsa_directmarketing_campaign_member_dba::new_query_builder(); $qb->add_constraint('person', '=', $person->id); $qb->add_constraint('campaign', '=', $this->_request_data['campaign']->id); $qb->add_constraint('orgOpenpsaObtype', '<>', org_openpsa_directmarketing_campaign_member_dba::TESTER); $members = $qb->execute_unchecked(); if (count($members) > 0) { // User is or has been subscriber earlier, update status $member = $members[0]; // Fix http://trac.midgard-project.org/ticket/1112 if ($member->orgOpenpsaObtype == org_openpsa_directmarketing_campaign_member_dba::UNSUBSCRIBED) { // PONDER: Which code to use ?? //$this->_request_data['import_status']['failed_add']++; // PONDER: What is the difference between these two? $this->_request_data['import_status']['already_subscribed']++; $this->_request_data['import_status']['subscribed_existing']++; // PONDER: Should we skip any updates, they're usually redundant but ne never knows.. return $member; } else { if ($member->orgOpenpsaObtype == org_openpsa_directmarketing_campaign_member_dba::NORMAL) { // PONDER: What is the difference between these two? $this->_request_data['import_status']['already_subscribed']++; $this->_request_data['import_status']['subscribed_existing']++; } else { $member->orgOpenpsaObtype = org_openpsa_directmarketing_campaign_member_dba::NORMAL; if ($member->update()) { if (array_key_exists('person', $this->_request_data['new_objects'])) { $this->_request_data['import_status']['subscribed_new']++; } else { $this->_request_data['import_status']['subscribed_existing']++; } } else { $this->_request_data['import_status']['failed_add']++; return false; } } } } if (!$member) { // Not a subscribed member yet, add $member = new org_openpsa_directmarketing_campaign_member_dba(); $member->person = $person->id; $member->campaign = $this->_request_data['campaign']->id; $member->orgOpenpsaObtype = org_openpsa_directmarketing_campaign_member_dba::NORMAL; if (!$member->create()) { $this->_request_data['import_status']['failed_add']++; return false; } $this->_request_data['new_objects']['campaign_member'] =& $member; $this->_request_data['import_status']['subscribed_new']++; } if (!$this->_datamanager_process('campaign_member', $subscriber, $person)) { // Failed to handle campaign member via DM return false; } return $member; }
/** * Creates/Removes members for this smart campaign based on the rules array * NOTE: This is highly resource intensive for large campaigns * * @return boolean indicating success/failure */ function update_smart_campaign_members() { midcom::get()->disable_limits(); if (!$this->id) { debug_add('This campaign has no id (maybe not created yet?), aborting', MIDCOM_LOG_ERROR); return false; } if ($this->orgOpenpsaObtype != self::TYPE_SMART) { debug_add("This (id #{$this->id}) is not a smart campaign, aborting", MIDCOM_LOG_ERROR); return false; } midcom::get('auth')->request_sudo('org.openpsa.directmarketing'); $this->parameter('org.openpsa.directmarketing_smart_campaign', 'members_update_failed', ''); $this->parameter('org.openpsa.directmarketing_smart_campaign', 'members_update_started', time()); $solver = new org_openpsa_directmarketing_campaign_ruleresolver(); if (!$solver->resolve($this->rules)) { $this->parameter('org.openpsa.directmarketing_smart_campaign', 'members_update_failed', time()); debug_add('Failed to resolve rules', MIDCOM_LOG_ERROR); debug_print_r("this->rules has value:", $this->rules); midcom::get('auth')->drop_sudo(); return false; } //returns now the result array of collector instead array of objects of query builder $rule_persons = $solver->execute(); if (!is_array($rule_persons)) { $this->parameter('org.openpsa.directmarketing_smart_campaign', 'members_update_failed', time()); debug_add('Failure when executing rules based search', MIDCOM_LOG_ERROR); midcom::get('auth')->drop_sudo(); return false; } //Delete (normal) members that should not be here anymore $qb_unwanted = org_openpsa_directmarketing_campaign_member_dba::new_query_builder(); $qb_unwanted->add_constraint('campaign', '=', $this->id); $qb_unwanted->add_constraint('orgOpenpsaObtype', '=', org_openpsa_directmarketing_campaign_member_dba::NORMAL); if (sizeof($rule_persons) > 0) { $qb_unwanted->add_constraint('person', 'NOT IN', array_keys($rule_persons)); } $uwret = $qb_unwanted->execute(); if (is_array($uwret) && !empty($uwret)) { foreach ($uwret as $member) { debug_add("Deleting unwanted member #{$member->id} (linked to person #{$member->person}) in campaign #{$this->id}"); if (!$member->delete()) { debug_add("Failed to delete unwanted member #{$member->id} (linked to person #{$member->person}) in campaign #{$this->id}, reason: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); } } } //List current non-tester members (including unsubscribed etc), and filter those out of rule_persons $qb_current = org_openpsa_directmarketing_campaign_member_dba::new_query_builder(); $qb_current->add_constraint('campaign', '=', $this->id); if (sizeof($rule_persons) > 0) { $qb_current->add_constraint('person', 'IN', array_keys($rule_persons)); } $qb_current->add_constraint('orgOpenpsaObtype', '<>', org_openpsa_directmarketing_campaign_member_dba::TESTER); $cret = $qb_current->execute(); if (is_array($cret) && !empty($cret)) { foreach ($cret as $member) { //Filter the existing member from rule_persons (if present, for example unsubscribed members might not be) debug_add("Removing person #{$member->person} ({$rule_persons[$member->person]['lastname']}, {$rule_persons[$member->person]['firstname']}) from rule_persons list, already a member"); unset($rule_persons[$member->person]); } } //Finally, create members of each person matched by rule left reset($rule_persons); foreach ($rule_persons as $id => $person) { debug_add("Creating new member (linked to person #{$id}) to campaign #{$this->id}"); $member = new org_openpsa_directmarketing_campaign_member_dba(); $member->orgOpenpsaObtype = org_openpsa_directmarketing_campaign_member_dba::NORMAL; $member->campaign = $this->id; $member->person = $id; if (!$member->create()) { debug_add("Failed to create new member (linked to person #{$id}) in campaign #{$this->id}, reason: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); } } //All done, set last updated timestamp $this->parameter('org.openpsa.directmarketing_smart_campaign', 'members_updated', time()); midcom::get('auth')->drop_sudo(); return true; }