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; }