public static function processDueItem(OwnedModel $item)
 {
     assert('is_object($item)');
     $itemId = $item->id;
     $itemClass = get_class($item);
     assert('$itemClass === "AutoresponderItem" || $itemClass === "CampaignItem"');
     $contact = $item->contact;
     if (empty($contact) || $contact->id < 0) {
         throw new NotFoundException();
     }
     $ownerModelRelationName = static::resolveItemOwnerModelRelationName($itemClass);
     $itemOwnerModel = $item->{$ownerModelRelationName};
     assert('is_object($itemOwnerModel)');
     assert('get_class($itemOwnerModel) === "Autoresponder" || get_class($itemOwnerModel) === "Campaign"');
     if ($contact->primaryEmail->optOut || get_class($itemOwnerModel) === "Campaign" && MarketingListMember::getByMarketingListIdContactIdAndUnsubscribed($itemOwnerModel->marketingList->id, $contact->id, true) != false) {
         $activityClass = $itemClass . 'Activity';
         $personId = $contact->getClassId('Person');
         $type = $activityClass::TYPE_SKIP;
         $activityClass::createNewActivity($type, $itemId, $personId);
     } else {
         $marketingList = $itemOwnerModel->marketingList;
         assert('is_object($marketingList)');
         assert('get_class($marketingList) === "MarketingList"');
         $textContent = $itemOwnerModel->textContent;
         $htmlContent = null;
         if ($itemClass == 'CampaignItem' && $itemOwnerModel->supportsRichText || $itemClass == 'AutoresponderItem') {
             $htmlContent = $itemOwnerModel->htmlContent;
         }
         static::resolveContent($textContent, $htmlContent, $contact, $itemOwnerModel->enableTracking, (int) $itemId, $itemClass, (int) $marketingList->id);
         try {
             $item->emailMessage = static::resolveEmailMessage($textContent, $htmlContent, $itemOwnerModel, $contact, $marketingList, $itemId, $itemClass);
         } catch (MissingRecipientsForEmailMessageException $e) {
             // TODO: @Shoaibi/@Jason: Medium: Do something about it.
         }
     }
     static::markItemAsProcessed($item);
 }
 protected static function getSkippedContentForDrillDown(CampaignItem $campaignItem)
 {
     $campaignItemActivities = CampaignItemActivity::getByTypeAndModelIdAndPersonIdAndUrl(CampaignItemActivity::TYPE_SKIP, $campaignItem->id, $campaignItem->contact->getClassId('Person'), null, 'latestDateTime');
     $content = Zurmo::t('MarketingModule', 'The message was not created.');
     if ($campaignItem->contact->primaryEmail->emailAddress == null) {
         if ($campaignItem->contact->secondaryEmail->emailAddress == null) {
             $content = Zurmo::t('MarketingModule', 'Contact has no primary email address populated.');
         } else {
             $content = Zurmo::t('MarketingModule', 'The primary email address is not populated. ' . 'The secondary email address is populated, but the primary email address is the one used to send the email message.');
         }
     } elseif (MarketingListMember::getByMarketingListIdContactIdAndUnsubscribed($campaignItem->campaign->marketingList->id, $campaignItem->contact->id, true) != false) {
         $content = Zurmo::t('MarketingModule', 'The contact is not subscribed to the MarketingListsModuleSingularLabel', LabelUtil::getTranslationParamsForAllModules());
     } elseif ($campaignItem->contact->primaryEmail->optOut) {
         if ($campaignItem->contact->secondaryEmail->optOut) {
             $content = Zurmo::t('MarketingModule', 'The primary email address is opted out.');
         } else {
             $content = Zurmo::t('MarketingModule', 'The primary email address is opted out. ' . 'The secondary email address is not opted out but the primary email address is the one used to send the email message.');
         }
     }
     return ZurmoHtml::tag('h4', array(), $content);
 }
 protected function processUnsubscribeFromListAction()
 {
     $actionAttributes = $this->action->getActionAttributes();
     if (count($actionAttributes) > 1 || !isset($actionAttributes['marketingList']) || !$this->triggeredModel instanceof Contact) {
         throw new NotSupportedException();
     }
     $marketingListId = $actionAttributes['marketingList']->value;
     $members = MarketingListMember::getByMarketingListIdContactIdAndUnsubscribed($marketingListId, (int) $this->triggeredModel->id, false);
     if ($members !== false) {
         $member = $members[0];
         $member->unsubscribed = true;
         if (!$member->unrestrictedSave()) {
             throw new FailedToSaveModelException();
         }
     } else {
         try {
             //Does the marketing list still exist
             MarketingList::getById((int) $marketingListId);
         } catch (NotFoundException $e) {
             $this->logAndNotifyOnMissingMarketingListModel(ActionForWorkflowForm::TYPE_UNSUBSCRIBE_FROM_LIST);
         }
     }
 }
 /**
  * @depends testRunWithMultipleRecipientsWithAttachments
  */
 public function testRunWithSubscribedAndUnsubscribedMembers()
 {
     $campaignItemsCountBefore = CampaignItem::getCount();
     $job = new CampaignQueueMessagesInOutboxJob();
     $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 10');
     $marketingListId = $marketingList->id;
     $contacts = array();
     for ($i = 0; $i < 5; $i++) {
         $email = new Email();
         $email->emailAddress = "demo{$i}@zurmo.com";
         $contact = ContactTestHelper::createContactByNameForOwner('contact 0' . ($i + 14), $this->user);
         $contact->primaryEmail = $email;
         $this->assertTrue($contact->save());
         $contacts[] = $contact;
         MarketingListMemberTestHelper::createMarketingListMember($i % 2, $marketingList, $contact);
     }
     $marketingList->forgetAll();
     $marketingList = MarketingList::getById($marketingListId);
     $campaign = CampaignTestHelper::createCampaign('campaign 10', 'subject 10', '[[FIRST^NAME]]', '[[LAST^NAME]]', null, null, null, Campaign::STATUS_PROCESSING, null, 0, $marketingList);
     $this->assertNotNull($campaign);
     $campaignId = $campaign->id;
     foreach ($contacts as $contact) {
         CampaignItemTestHelper::createCampaignItem(0, $campaign, $contact);
     }
     $this->assertTrue($job->run());
     $campaign = Campaign::getById($campaignId);
     $campaignItemsCountExpected = $campaignItemsCountBefore + 5;
     $campaignItemsCountAfter = CampaignItem::getCount();
     $this->assertEquals($campaignItemsCountExpected, $campaignItemsCountAfter);
     $campaignItemsProcessed = CampaignItem::getByProcessedAndCampaignId(1, $campaign->id);
     $this->assertCount(5, $campaignItemsProcessed);
     $skippedCount = 0;
     foreach ($campaignItemsProcessed as $campaignItem) {
         $contact = $campaignItem->contact;
         $member = MarketingListMember::getByMarketingListIdContactIdAndUnsubscribed($campaign->marketingList->id, $contact->id, true);
         if ($member) {
             $personId = $campaignItem->contact->getClassId('Person');
             $type = CampaignItemActivity::TYPE_SKIP;
             $activity = CampaignItemActivity::getByTypeAndModelIdAndPersonIdAndUrl($type, $campaignItem->id, $personId);
             $this->assertNotNull($activity);
             $this->assertNotEmpty($activity);
             $this->assertCount(1, $activity);
             $skippedCount++;
         } else {
             $this->assertNotEmpty($campaignItem->emailMessage);
             $this->assertContains($contact->firstName, $campaignItem->emailMessage->content->textContent);
             $this->assertContains($contact->lastName, $campaignItem->emailMessage->content->htmlContent);
         }
     }
     $this->assertEquals(2, $skippedCount);
 }
 protected function resolveMembers($unsubscribed, Contact $contact, $marketingListId, $optOut)
 {
     if ($optOut) {
         $members = MarketingListMember::getByContactIdAndSubscribed($contact->id, $unsubscribed);
     } else {
         $members = MarketingListMember::getByMarketingListIdContactIdAndUnsubscribed($marketingListId, $contact->id, $unsubscribed);
     }
     if (!is_array($members) && $members !== false) {
         $members = array($members);
     }
     if (empty($members)) {
         $marketingList = MarketingList::getById(intval($marketingListId));
         if ($unsubscribed === 1 && !empty($marketingList) && $marketingList->anyoneCanSubscribe && !$marketingList->memberAlreadyExists($contact->id)) {
             $members[0] = new MarketingListMember();
             $members[0]->contact = $contact;
             $members[0]->marketingList = $marketingList;
         } else {
             return false;
         }
     }
     return $members;
 }
 /**
  * @depends testCreateAndGetMarketingListMemberById
  */
 public function testGetByMarketingListIdContactIdAndUnsubscribed()
 {
     $marketingList = MarketingListTestHelper::createMarketingListByName('test marketing List 06');
     $this->assertNotNull($marketingList);
     $super = User::getByUsername('super');
     $contact = ContactTestHelper::createContactByNameForOwner('contact 01', $super);
     $marketingListMember = MarketingListMember::getByMarketingListIdContactIdAndUnsubscribed($marketingList->id, $contact->id, false);
     $this->assertFalse($marketingListMember);
     MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact);
     $marketingListMember = MarketingListMember::getByMarketingListIdContactIdAndUnsubscribed($marketingList->id, $contact->id, false);
     $this->assertTrue($marketingListMember[0] instanceof MarketingListMember);
     $marketingListMember[0]->unsubscribed = true;
     $this->assertTrue($marketingListMember[0]->unrestrictedSave());
     $marketingListMember = MarketingListMember::getByMarketingListIdContactIdAndUnsubscribed($marketingList->id, $contact->id, false);
     $this->assertFalse($marketingListMember);
 }
 /**
  * @depends testOptOutAction
  */
 public function testSubscribeActionAfterOptOutActionDisableOptOut()
 {
     $this->logoutCurrentUserLoginNewUserAndGetByUsername('super');
     $marketingList = MarketingList::getByName('marketingList 04');
     $this->assertNotEmpty($marketingList);
     $marketingList = $marketingList[0];
     $marketingListId = $marketingList->id;
     $contact = Contact::getByName('contact 05 contact 05son');
     $this->assertNotEmpty($contact);
     $contact = $contact[0];
     $this->assertEquals(1, $contact->primaryEmail->optOut);
     $personId = $contact->getClassId('Person');
     $member = MarketingListMember::getByMarketingListIdContactIdAndUnsubscribed($marketingList->id, $contact->id, 1);
     $this->assertNotEmpty($member);
     Yii::app()->user->userModel = null;
     $hash = GlobalMarketingFooterUtil::resolveHash($personId, $marketingListId, 1, 'AutoresponderItem', false);
     $this->setGetArray(array('hash' => $hash));
     @$this->runControllerWithRedirectExceptionAndGetUrl($this->subscribeUrl);
     $content = $this->runControllerWithNoExceptionsAndGetContent($this->manageSubscriptionsUrl);
     $this->assertContains('<td>marketingList 01</td>', $content);
     $this->assertContains('<td>marketingList 03</td>', $content);
     $this->assertContains('marketingLists/external/subscribe?hash=', $content);
     $this->assertContains('id="marketingListsManage' . 'SubscriptionListView-toggleUnsubscribed_', $content);
     $this->assertContains('id="marketingListsManage' . 'SubscriptionListView-toggleUnsubscribed_', $content);
     $this->assertContains('type="radio" name="marketingListsManage' . 'SubscriptionListView-toggleUnsubscribed_', $content);
     $this->assertContains('id="marketingListsManageSubscriptionListView-toggleUnsubscribed_' . $marketingListId . '_0" checked="checked" type="radio" name="marketingListsManage' . 'SubscriptionListView-toggleUnsubscribed_' . $marketingListId, $content);
     $this->logoutCurrentUserLoginNewUserAndGetByUsername('super');
     $contact = Contact::getByName('contact 05 contact 05son');
     $this->assertNotEmpty($contact);
     $contact = $contact[0];
     $this->assertEquals(0, $contact->primaryEmail->optOut);
 }
 protected static function skipMessage(Contact $contact, Item $itemOwnerModel)
 {
     return $contact->primaryEmail->optOut || get_class($itemOwnerModel) === "Campaign" && MarketingListMember::getByMarketingListIdContactIdAndUnsubscribed($itemOwnerModel->marketingList->id, $contact->id, true) != false;
 }