Exemplo n.º 1
0
 /**
  * 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');
             }
         }
     }
 }
Exemplo n.º 2
0
 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();
 }
Exemplo n.º 3
0
 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;
 }
Exemplo n.º 4
0
 /**
  * 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;
 }