public function makeAll(&$demoDataHelper) { assert('$demoDataHelper instanceof DemoDataHelper'); assert('$demoDataHelper->isSetRange("MarketingList")'); $autoresponders = array(); if ($this->loadMagnitude >= 100) { foreach (MarketingList::getAll() as $marketingList) { for ($this->index = 0; $this->index < 2; $this->index++) { $autoresponder = new Autoresponder(); $autoresponder->marketingList = $marketingList; $this->populateModel($autoresponder); $saved = $autoresponder->save(); assert('$saved'); $autoresponders[] = $autoresponder->id; } } } else { for ($this->index = 0; $this->index < 4; $this->index++) { $autoresponder = new Autoresponder(); $autoresponder->marketingList = $demoDataHelper->getRandomByModelName('MarketingList'); $this->populateModel($autoresponder); $saved = $autoresponder->save(); assert('$saved'); $autoresponders[] = $autoresponder->id; } } $demoDataHelper->setRangeByModelName('Autoresponder', $autoresponders[0], $autoresponders[count($autoresponders) - 1]); }
public function teardown() { $marketingLists = MarketingList::getAll(); $this->assertCount(1, $marketingLists); $marketingLists[0]->delete(); parent::teardown(); }
public static function populateAutoresponder($subject, $textContent, $htmlContent, $fromOperationDurationInterval, $operationType, $enableTracking = false, $marketingList = null) { assert('is_string($subject)'); assert('is_string($textContent)'); assert('is_string($htmlContent) || $htmlContent === null'); assert('is_int($fromOperationDurationInterval)'); assert('is_int($operationType)'); assert('is_bool($enableTracking) || is_int($enableTracking)'); assert('is_object($marketingList) || $marketingList === null'); if (empty($marketingList)) { $marketingLists = MarketingList::getAll(); if (!empty($marketingLists)) { $marketingList = RandomDataUtil::getRandomValueFromArray($marketingLists); } } $autoresponder = new Autoresponder(); $autoresponder->subject = $subject; $autoresponder->textContent = $textContent; $autoresponder->htmlContent = $htmlContent; $autoresponder->fromOperationDurationInterval = $fromOperationDurationInterval; $autoresponder->fromOperationDurationType = TimeDurationUtil::DURATION_TYPE_DAY; $autoresponder->operationType = $operationType; $autoresponder->enableTracking = $enableTracking; $autoresponder->marketingList = $marketingList; return $autoresponder; }
public function getStringifiedModelForValue() { if ($this->value != null) { try { return strval(MarketingList::getById((int) $this->value)); } catch (NotFoundException $e) { } } }
public function setUp() { parent::setUp(); $this->user = User::getByUsername('super'); Yii::app()->user->userModel = $this->user; Campaign::deleteAll(); CampaignItem::deleteAll(); Contact::deleteAll(); MarketingList::deleteAll(); }
public static function populateCampaign($name, $subject, $textContent, $htmlContent = null, $fromName = null, $fromAddress = null, $supportsRichText = null, $status = null, $sendOnDateTime = null, $enableTracking = null, $marketingList = null) { assert('is_string($name)'); assert('is_string($subject)'); assert('is_string($textContent) || $textContent === null'); assert('is_string($htmlContent) || $htmlContent === null'); assert('is_string($fromName) || $fromName === null'); assert('is_string($fromAddress) || $fromAddress === null'); assert('is_bool($supportsRichText) || is_int($supportsRichText) || $supportsRichText === null'); assert('is_string($status) || is_int($status) || $status === null'); assert('is_string($sendOnDateTime) || is_int($sendOnDateTime) || $sendOnDateTime === null'); assert('is_bool($enableTracking) || is_int($enableTracking) || $enableTracking === null'); assert('is_object($marketingList) || $marketingList === null'); if ($supportsRichText === null) { $supportsRichText = 1; if ($htmlContent === null) { $htmlContent = 'test html content'; } } if ($sendOnDateTime === null) { $sendOnDateTime = '0000-00-00 00:00:00'; } if ($status === null) { $status = Campaign::STATUS_ACTIVE; } if ($enableTracking === null) { $enableTracking = 1; } if ($fromName === null) { $fromName = 'Support Team'; } if ($fromAddress === null) { $fromAddress = '*****@*****.**'; } if (empty($marketingList)) { $marketingLists = MarketingList::getAll(); if (!empty($marketingLists)) { $marketingList = RandomDataUtil::getRandomValueFromArray($marketingLists); } } $campaign = new Campaign(); $campaign->name = $name; $campaign->subject = $subject; $campaign->textContent = $textContent; $campaign->htmlContent = $htmlContent; $campaign->status = $status; $campaign->fromName = $fromName; $campaign->fromAddress = $fromAddress; $campaign->supportsRichText = $supportsRichText; $campaign->enableTracking = $enableTracking; $campaign->sendOnDateTime = $sendOnDateTime; $campaign->marketingList = $marketingList; return $campaign; }
public function actionCreate($marketingListId, $redirectUrl) { $autoresponder = new Autoresponder(); $autoresponder->marketingList = MarketingList::getById(intval($marketingListId)); ControllerSecurityUtil::resolveAccessCanCurrentUserReadModel($autoresponder->marketingList); $model = $this->attemptToSaveModelFromPost($autoresponder, $redirectUrl); $editAndDetailsView = $this->makeEditAndDetailsView($model, 'Edit'); $breadcrumbLinks = static::getDetailsAndEditBreadcrumbLinks($autoresponder->marketingList); $breadcrumbLinks[] = Zurmo::t('AutorespondersModule', 'Create'); $view = new AutorespondersPageView(MarketingDefaultViewUtil::makeViewWithBreadcrumbsForCurrentUser($this, $editAndDetailsView, $breadcrumbLinks, 'MarketingBreadCrumbView')); echo $view->render(); }
/** * Method for testing creating a simple notification for the current user. */ public function actionGenerateManageSubscriptionHash() { if (Yii::app()->user->userModel->username != 'super') { throw new NotSupportedException(); } $contact = RandomDataUtil::getRandomValueFromArray(Contact::getAll()); $personId = $contact->getClassId('Person'); $marketingList = RandomDataUtil::getRandomValueFromArray(MarketingList::getAll()); $marketingListId = $marketingList->id; $model = RandomDataUtil::getRandomValueFromArray(CampaignItem::getAll()); $modelId = $model->id; $modelType = get_class($model); $hash = EmailMessageActivityUtil::resolveHashForUnsubscribeAndManageSubscriptionsUrls($personId, $marketingListId, $modelId, $modelType, false); echo 'index.php/marketingLists/external/manageSubscriptions?hash=' . $hash; }
/** * Method for testing creating a simple notification for the current user. */ public function actionGenerateManageSubscriptionHash() { if (!Group::isUserASuperAdministrator(Yii::app()->user->userModel)) { throw new NotSupportedException(); } $contact = RandomDataUtil::getRandomValueFromArray(Contact::getAll()); $personId = $contact->getClassId('Person'); $marketingList = RandomDataUtil::getRandomValueFromArray(MarketingList::getAll()); $marketingListId = $marketingList->id; $model = RandomDataUtil::getRandomValueFromArray(CampaignItem::getAll()); $modelId = $model->id; $modelType = get_class($model); $hash = GlobalMarketingFooterUtil::resolveHash($personId, $marketingListId, $modelId, $modelType, false); echo 'index.php/marketingLists/external/manageSubscriptions?hash=' . $hash; }
public static function fillAutoresponder($name, $subject, $textContent, $htmlContent, $secondsFromOperation, $operationType, $marketingList = null) { if (empty($marketingList)) { $marketingLists = MarketingList::getAll(); if (!empty($marketingLists)) { $marketingList = RandomDataUtil::getRandomValueFromArray($marketingLists); } } $autoresponder = new Autoresponder(); $autoresponder->name = $name; $autoresponder->subject = $subject; $autoresponder->textContent = $textContent; $autoresponder->htmlContent = $htmlContent; $autoresponder->secondsFromOperation = $secondsFromOperation; $autoresponder->operationType = $operationType; $autoresponder->marketingList = $marketingList; return $autoresponder; }
public function testCreateAndGetMarketingListMemberById() { $marketingList = RandomDataUtil::getRandomValueFromArray(MarketingList::getAll()); $this->assertNotNull($marketingList); $contact = RandomDataUtil::getRandomValueFromArray(Contact::getAll()); $this->assertNotNull($contact); $marketingListMember = new MarketingListMember(); $marketingListMember->unsubscribed = 0; $marketingListMember->marketingList = $marketingList; $marketingListMember->contact = $contact; $this->assertTrue($marketingListMember->unrestrictedSave()); $id = $marketingListMember->id; $this->assertTrue($id > 0); unset($marketingListMember); $marketingListMember = MarketingListMember::getById($id); $this->assertEquals(0, $marketingListMember->unsubscribed); $this->assertEquals($contact, $marketingListMember->contact); $this->assertEquals($marketingList, $marketingListMember->marketingList); }
/** * @param DemoDataHelper $demoDataHelper */ public function makeAll(&$demoDataHelper) { assert('$demoDataHelper instanceof DemoDataHelper'); assert('$demoDataHelper->isSetRange("User")'); $marketingLists = array(); for ($this->index = 0; $this->index < 5; $this->index++) { $marketingList = new MarketingList(); $marketingList->owner = $demoDataHelper->getRandomByModelName('User'); $this->populateModel($marketingList); $marketingList->addPermissions(Group::getByName(Group::EVERYONE_GROUP_NAME), Permission::READ_WRITE_CHANGE_PERMISSIONS_CHANGE_OWNER); $saved = $marketingList->save(); assert('$saved'); $marketingList = MarketingList::getById($marketingList->id); AllPermissionsOptimizationUtil::securableItemGivenPermissionsForGroup($marketingList, Group::getByName(Group::EVERYONE_GROUP_NAME)); $marketingList->save(); $marketingLists[] = $marketingList->id; } $demoDataHelper->setRangeByModelName('MarketingList', $marketingLists[0], $marketingLists[count($marketingLists) - 1]); }
public static function populateMarketingListMember($unsubscribed = 0, $marketingList = null, $contact = null) { if (empty($marketingList)) { $marketingLists = MarketingList::getAll(); if (!empty($marketingLists)) { $marketingList = RandomDataUtil::getRandomValueFromArray($marketingLists); } } if (empty($contact)) { $contacts = Contact::getAll(); if (!empty($contacts)) { $contact = RandomDataUtil::getRandomValueFromArray($contacts); } } $marketingListMember = new MarketingListMember(); $marketingListMember->unsubscribed = $unsubscribed; $marketingListMember->contact = $contact; $marketingListMember->marketingList = $marketingList; return $marketingListMember; }
/** * @param DemoDataHelper $demoDataHelper */ public function makeAll(&$demoDataHelper) { assert('$demoDataHelper instanceof DemoDataHelper'); assert('$demoDataHelper->isSetRange("Contact")'); assert('$demoDataHelper->isSetRange("MarketingList")'); $members = array(); foreach (MarketingList::getAll() as $marketingList) { foreach (Contact::getAll() as $contact) { $interval = mt_rand(1, 30) * 86400; $member = new MarketingListMember(); $member->setScenario('importModel'); $member->createdDateTime = DateTimeUtil::convertTimestampToDbFormatDateTime(time() - $interval); $member->contact = $contact; $member->marketingList = $marketingList; $this->populateModel($member); $saved = $member->unrestrictedSave(); assert('$saved'); $members[] = $member->id; } } $demoDataHelper->setRangeByModelName('MarketingListMember', $members[0], $members[count($members) - 1]); }
/** * @param string $beginDateTime * @param array $searchAttributeData * @return string */ protected static function makeColumnSqlQuery($beginDateTime, $searchAttributeData) { assert('is_string($beginDateTime)'); $quote = DatabaseCompatibilityUtil::getQuote(); $where = null; $selectDistinct = false; $marketingListTableName = MarketingList::getTableName(); $marketingListMemberTableName = MarketingListMember::getTableName(); $createdDateTimeColumnName = MarketingListMember::getColumnNameByAttribute('createdDateTime'); $unsubscribedColumnName = MarketingListMember::getColumnNameByAttribute('unsubscribed'); $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('MarketingList'); $where = RedBeanModelDataProvider::makeWhere('MarketingList', $searchAttributeData, $joinTablesAdapter); MarketingList::resolveReadPermissionsOptimizationToSqlQuery(Yii::app()->user->userModel, $joinTablesAdapter, $where, $selectDistinct); $selectQueryAdapter = new RedBeanModelSelectQueryAdapter($selectDistinct); $newSubscriberSelectPart = "sum(CASE WHEN {$quote}{$marketingListMemberTableName}{$quote}.{$quote}{$createdDateTimeColumnName}" . $quote . " >= '{$beginDateTime}' THEN 1 ELSE 0 END)"; $existingSubscriberSelectPart = "sum(CASE WHEN {$quote}{$marketingListMemberTableName}{$quote}.{$quote}{$createdDateTimeColumnName}" . $quote . " < '{$beginDateTime}' AND " . "{$quote}{$marketingListMemberTableName}{$quote}.{$quote}" . "{$unsubscribedColumnName}{$quote}=0 THEN 1 ELSE 0 END)"; // Not Coding Standard $selectQueryAdapter->addClauseByQueryString($newSubscriberSelectPart, static::NEW_SUBSCRIBERS_COUNT); $selectQueryAdapter->addClauseByQueryString($existingSubscriberSelectPart, static::EXISTING_SUBSCRIBERS_COUNT); $joinTablesAdapter->addLeftTableAndGetAliasName($marketingListMemberTableName, 'id', $marketingListTableName, 'marketinglist_id'); $sql = SQLQueryUtil::makeQuery($marketingListTableName, $selectQueryAdapter, $joinTablesAdapter, null, null, $where); return $sql; }
public function testRunWithCampaignPausedAfterAllItemsGeneratedAndThenUnpaused() { // Cleanup Campaign::deleteAll(); $this->assertEquals(0, Campaign::getCount()); $this->assertEquals(0, CampaignItem::getCount()); $this->assertEquals(0, CampaignItemActivity::getCount()); MarketingList::deleteAll(); $this->assertEquals(0, MarketingList::getCount()); $this->assertEquals(0, MarketingListMember::getCount()); EmailMessage::deleteAll(); $this->assertEquals(0, EmailMessage::getCount()); $this->assertEquals(0, EmailMessageContent::getCount()); $this->assertEquals(0, EmailMessageSender::getCount()); $this->assertEquals(0, EmailMessageRecipient::getCount()); Contact::deleteAll(); $this->assertEquals(0, Contact::getCount()); // setup an email address for contacts $email = new Email(); $email->emailAddress = '*****@*****.**'; // create a marketing list with 5 members $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 05'); $marketingListId = $marketingList->id; for ($i = 1; $i <= 5; $i++) { $contact = ContactTestHelper::createContactByNameForOwner('campaignContact 0' . $i, $this->user); $contact->primaryEmail = $email; $this->assertTrue($contact->save()); MarketingListMemberTestHelper::createMarketingListMember(0, $marketingList, $contact); } $marketingList->forgetAll(); // create a due campaign with that marketing list $campaign = CampaignTestHelper::createCampaign('campaign 04', 'subject', 'text Content', 'Html Content', null, null, null, null, null, null, MarketingList::getById($marketingListId)); $campaignId = $campaign->id; /* * Run 1: * CampaignGenerateDueCampaignItemsJob * status == processing * items generated but unprocessed * * CampaignQueueMessagesInOutboxJob * status == processing * items processed with email messages generated and queued * * ProcessOutboundEmailJob * status == processing * email items attempted to be sent * * Run 2: * Pause the campaign * items are processed and still present * * Unpause the campaign * status == active * items are processed and still present * * CampaignGenerateDueCampaignItemsJob * status == processing * ensure all items are present and processed * * CampaignQueueMessagesInOutboxJob * status == processing * ensure all items are present and processed * ensure all email messages are present with correct folder type * * ProcessOutboundEmailJob * ensure all email messages are present with correct folder type * status == processing * * * Run 3: * Mark Campaign as Completed * status == completed */ // we have to do this to ensure when we retrieve the data status is updated from db. $campaign->forgetAll(); $this->assertEmpty(CampaignItem::getAll()); // Run 1 starts here // Run CampaignGenerateDueCampaignItemsJob $job = new CampaignGenerateDueCampaignItemsJob(); $this->assertTrue($job->run()); $campaign = Campaign::getById($campaignId); // ensure status is processing $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); // ensure 5 campaign items have been generated $this->assertEquals(5, CampaignItem::getCount()); // ensure all 5 campaign items are unprocessed $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId); $this->assertNotEmpty($campaignItems); $this->assertCount(5, $campaignItems); // Run CampaignQueueMessagesInOutboxJob $job = new CampaignQueueMessagesInOutboxJob(); $this->assertTrue($job->run()); // Ensure campaign status $campaign = Campaign::getById($campaignId); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); // ensure all 5 campaign items are processed $campaignItems = CampaignItem::getByProcessedAndCampaignId(1, $campaignId); $this->assertNotEmpty($campaignItems); $this->assertCount(5, $campaignItems); // Ensure 5 new email messages $this->assertEquals(5, EmailMessage::getCount()); $this->assertEquals(5, EmailHelper::getQueuedCount()); // Run ProcessOutboundEmail $job = new ProcessOutboundEmailJob(); $this->assertTrue($job->run()); // Ensure all email were sent $this->assertEquals(5, EmailMessage::getCount()); $this->assertEquals(0, EmailHelper::getQueuedCount()); foreach (EmailMessage::getAll() as $emailMessage) { $this->assertEquals($emailMessage->folder->type, EmailFolder::TYPE_SENT); } // Ensure campaign status $campaign = Campaign::getById($campaignId); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); // end of Run 1 // Run 2 starts here // Pause the campaign $campaign->status = Campaign::STATUS_PAUSED; $this->assertTrue($campaign->save()); // ensure campaign items are still there $campaignItems = CampaignItem::getByProcessedAndCampaignId(1, $campaignId); $this->assertCount(5, $campaignItems); $this->assertNotEmpty($campaignItems); // Unpause campaign $campaign = Campaign::getById($campaignId); $this->assertEquals(Campaign::STATUS_PAUSED, $campaign->status); $campaign->status = Campaign::STATUS_ACTIVE; $this->assertTrue($campaign->save()); // ensure campaign items are still there $campaignItems = CampaignItem::getByProcessedAndCampaignId(1, $campaignId); $this->assertCount(5, $campaignItems); $this->assertNotEmpty($campaignItems); // Ensure status change $campaign = Campaign::getById($campaignId); $this->assertEquals(Campaign::STATUS_ACTIVE, $campaign->status); // Run CampaignGenerateDueCampaignItemsJob $job = new CampaignGenerateDueCampaignItemsJob(); $this->assertTrue($job->run()); // Ensure campaign status change $campaign = Campaign::getById($campaignId); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); // ensure all 5 (previously created in run1) campaign items are still processed $campaignItems = CampaignItem::getByProcessedAndCampaignId(1, $campaignId); $this->assertNotEmpty($campaignItems); $this->assertCount(5, $campaignItems); // Run CampaignQueueMessagesInOutboxJob $job = new CampaignQueueMessagesInOutboxJob(); $this->assertTrue($job->run()); // Ensure campaign status $campaign = Campaign::getById($campaignId); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); // ensure all 5 (previously created in run1) campaign items are still processed $campaignItems = CampaignItem::getByProcessedAndCampaignId(1, $campaignId); $this->assertNotEmpty($campaignItems); $this->assertCount(5, $campaignItems); // Ensure all 5 (previously created and sent in run1) emails are sent. $this->assertEquals(5, EmailMessage::getCount()); foreach (EmailMessage::getAll() as $emailMessage) { $this->assertEquals($emailMessage->folder->type, EmailFolder::TYPE_SENT); } // Run ProcessOutboundEmail $job = new ProcessOutboundEmailJob(); $this->assertTrue($job->run()); // Ensure all 5 (previously created and sent in run1) emails are sent. $this->assertEquals(5, EmailMessage::getCount()); foreach (EmailMessage::getAll() as $emailMessage) { $this->assertEquals($emailMessage->folder->type, EmailFolder::TYPE_SENT); } // Ensure campaign status $campaign = Campaign::getById($campaignId); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); // end of Run 2 // Run 3 starts here // Run CampaignMarkCompleted $job = new CampaignMarkCompletedJob(); $this->assertTrue($job->run()); // Ensure campaign status change $campaign = Campaign::getById($campaignId); $this->assertEquals(Campaign::STATUS_COMPLETED, $campaign->status); // end of Run 3 }
public function testGetInfoToCopyToCampaign() { $marketingListId = self::getModelIdByModelNameAndName('MarketingList', 'MarketingListName'); $marketingList = MarketingList::getById($marketingListId); $this->setGetArray(array('id' => $marketingListId)); $content = $this->runControllerWithNoExceptionsAndGetContent('marketingLists/default/getInfoToCopyToCampaign'); $decodedContent = CJSON::decode($content); $this->assertNotEmpty($decodedContent); $this->assertArrayHasKey('fromName', $decodedContent); $this->assertArrayHasKey('fromAddress', $decodedContent); $this->assertEquals($marketingList->fromName, $decodedContent['fromName']); $this->assertEquals($marketingList->fromAddress, $decodedContent['fromAddress']); }
/** * @param array $searchAttributeData * @param string $groupBy * @return string */ protected static function makeAutorespondersSqlQuery($searchAttributeData, $groupBy) { $quote = DatabaseCompatibilityUtil::getQuote(); $where = null; $selectDistinct = false; $itemTableName = Item::getTableName('Item'); $marketingListTableName = Autoresponder::getTableName('MarketingList'); $autoresponderTableName = Autoresponder::getTableName('Autoresponder'); $autoresponderItemTableName = AutoresponderItem::getTableName('AutoresponderItem'); $emailMessageTableName = EmailMessage::getTableName('EmailMessage'); $sentDateTimeColumnName = EmailMessage::getColumnNameByAttribute('sentDateTime'); $createdDateTimeColumnName = Item::getColumnNameByAttribute('createdDateTime'); $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('Autoresponder'); MarketingList::resolveReadPermissionsOptimizationToSqlQuery(Yii::app()->user->userModel, $joinTablesAdapter, $where, $selectDistinct); $selectQueryAdapter = new RedBeanModelSelectQueryAdapter($selectDistinct); $queuedEmailsSelectPart = "sum(CASE WHEN {$quote}{$emailMessageTableName}{$quote}.{$quote}{$sentDateTimeColumnName}" . $quote . " = '0000-00-00 00:00:00' OR {$quote}{$emailMessageTableName}{$quote}" . ".{$quote}{$sentDateTimeColumnName}{$quote} IS NULL THEN 1 ELSE 0 END)"; // Not Coding Standard $sentEmailsSelectPart = "sum(CASE WHEN {$quote}{$emailMessageTableName}{$quote}.{$quote}{$sentDateTimeColumnName}" . $quote . " > '0000-00-00 00:00:00' THEN 1 ELSE 0 END)"; $uniqueOpensSelectPart = static::resolveAutoresponderTypeSubQuery(EmailMessageActivity::TYPE_OPEN); $uniqueClicksSelectPart = static::resolveAutoresponderTypeSubQuery(EmailMessageActivity::TYPE_CLICK); $bouncedSelectPart = static::resolveAutoresponderTypeSubQuery(EmailMessageActivity::TYPE_BOUNCE); $optedOutSelectPart = static::resolveAutoresponderTypeSubQuery(EmailMessageActivity::TYPE_UNSUBSCRIBE); $selectQueryAdapter->addDayDateClause($itemTableName, $createdDateTimeColumnName, static::DAY_DATE); $selectQueryAdapter->addFirstDayOfWeekDateClause($itemTableName, $createdDateTimeColumnName, static::FIRST_DAY_OF_WEEK_DATE); $selectQueryAdapter->addFirstDayOfMonthDateClause($itemTableName, $createdDateTimeColumnName, static::FIRST_DAY_OF_MONTH_DATE); $selectQueryAdapter->addNonSpecificCountClause(); $selectQueryAdapter->addClauseByQueryString($queuedEmailsSelectPart, static::QUEUED); $selectQueryAdapter->addClauseByQueryString($sentEmailsSelectPart, static::SENT); $selectQueryAdapter->addClauseByQueryString("count((" . $uniqueOpensSelectPart . "))", static::UNIQUE_OPENS); $selectQueryAdapter->addClauseByQueryString("count((" . $uniqueClicksSelectPart . "))", static::UNIQUE_CLICKS); $selectQueryAdapter->addClauseByQueryString("count((" . $bouncedSelectPart . "))", static::BOUNCED); $selectQueryAdapter->addClauseByQueryString("count((" . $optedOutSelectPart . "))", static::UNSUBSCRIBED); $joinTablesAdapter->addFromTableAndGetAliasName($marketingListTableName, 'marketinglist_id'); $joinTablesAdapter->addLeftTableAndGetAliasName($autoresponderItemTableName, 'id', $autoresponderTableName, 'autoresponder_id'); $joinTablesAdapter->addLeftTableAndGetAliasName($emailMessageTableName, 'emailmessage_id', $autoresponderItemTableName, 'id'); $where = RedBeanModelDataProvider::makeWhere('Autoresponder', $searchAttributeData, $joinTablesAdapter); $sql = SQLQueryUtil::makeQuery($autoresponderTableName, $selectQueryAdapter, $joinTablesAdapter, null, null, $where, null, $groupBy); return $sql; }
/** * @depends testGenerateCampaignItemsForDueCampaigns */ public function testGenerateCampaignItemsForDueCampaignsWithCustomBatchSize() { $contactIds = array(); $marketingListIds = array(); $campaignIds = array(); for ($index = 6; $index < 9; $index++) { $contact = ContactTestHelper::createContactByNameForOwner('campaignContact 0' . $index, $this->user); $contactIds[] = $contact->id; $contact->forgetAll(); } for ($index = 8; $index < 12; $index++) { $suffix = $index; if ($index < 10) { $suffix = "0{$suffix}"; } $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList ' . $suffix); $marketingListId = $marketingList->id; $marketingListIds[] = $marketingListId; foreach ($contactIds as $contactId) { $contact = Contact::getById($contactId); $unsubscribed = rand(10, 20) % 2; MarketingListMemberTestHelper::createMarketingListMember($unsubscribed, $marketingList, $contact); } $marketingList->forgetAll(); $marketingList = MarketingList::getById($marketingListId); $campaignSuffix = substr($marketingList->name, -2); $campaign = CampaignTestHelper::createCampaign('campaign ' . $campaignSuffix, 'subject ' . $campaignSuffix, 'text ' . $campaignSuffix, 'html ' . $campaignSuffix, null, null, null, null, null, null, $marketingList); $this->assertNotNull($campaign); $campaignIds[] = $campaign->id; $campaign->forgetAll(); } foreach ($campaignIds as $campaignId) { $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId); $this->assertEmpty($campaignItems); } $this->assertTrue(CampaignItemsUtil::generateCampaignItemsForDueCampaigns(5)); foreach ($campaignIds as $index => $campaignId) { $campaign = Campaign::getById($campaignId); $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId); if ($index === 0) { $expectedCount = AutoresponderOrCampaignBatchSizeConfigUtil::getBatchSize(); $memberCount = count($campaign->marketingList->marketingListMembers); if ($memberCount < $expectedCount) { $expectedCount = $memberCount; } $this->assertNotEmpty($campaignItems); $this->assertCount($expectedCount, $campaignItems); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); } else { $this->assertEmpty($campaignItems); $this->assertEquals(Campaign::STATUS_ACTIVE, $campaign->status); } } $this->assertTrue(CampaignItemsUtil::generateCampaignItemsForDueCampaigns()); foreach ($campaignIds as $index => $campaignId) { $campaign = Campaign::getById($campaignId); $campaignItems = CampaignItem::getByProcessedAndCampaignId(0, $campaignId); if ($index < 2) { $expectedCount = AutoresponderOrCampaignBatchSizeConfigUtil::getBatchSize(); $memberCount = count($campaign->marketingList->marketingListMembers); if ($memberCount < $expectedCount) { $expectedCount = $memberCount; } $this->assertNotEmpty($campaignItems); $this->assertCount($expectedCount, $campaignItems); $this->assertEquals(Campaign::STATUS_PROCESSING, $campaign->status); } else { $this->assertEmpty($campaignItems); $this->assertEquals(Campaign::STATUS_ACTIVE, $campaign->status); } } // TODO: @Shoaibi: Medium: Add tests for the other campaign type. }
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; }
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); } } }
protected static function processModelForMassSubscribe(&$model) { $marketingListMember = Yii::app()->request->getPost('MarketingListMember'); if ($marketingListMember['marketingList']['id'] > 0) { $marketingList = MarketingList::getById((int) $marketingListMember['marketingList']['id']); $marketingList->addNewMember($model->id); return true; } }
public function testUnsubscribeContactFromList() { //Empty members from the test marketing list $marketingList = MarketingList::getById(self::$marketingListId); foreach ($marketingList->marketingListMembers as $marketingListMember) { $marketingListMember->delete(); } $marketingList->forget(); $marketingList = MarketingList::getById(self::$marketingListId); $this->assertEquals(0, $marketingList->marketingListMembers->count()); //Subscribe new member $contact = ContactTestHelper::createContactByNameForOwner('jason', Yii::app()->user->userModel); $marketingList->addNewMember($contact->id); $marketingList->forget(); $marketingList = MarketingList::getById(self::$marketingListId); $this->assertEquals(1, $marketingList->marketingListMembers->count()); $this->assertEquals(0, $marketingList->marketingListMembers[0]->unsubscribed); //Try to unsubscribe the contact, it should unsubscribe them $action = new ActionForWorkflowForm('Contact', Workflow::TYPE_ON_SAVE); $action->type = ActionForWorkflowForm::TYPE_UNSUBSCRIBE_FROM_LIST; $attributes = array('marketingList' => array('shouldSetValue' => '1', 'type' => WorkflowActionAttributeForm::TYPE_STATIC, 'value' => self::$marketingListId)); $action->setAttributes(array(ActionForWorkflowForm::ACTION_ATTRIBUTES => $attributes)); $helper = new WorkflowActionProcessingHelper(88, 'some name', $action, $contact, Yii::app()->user->userModel); $helper->processNonUpdateSelfAction(); $marketingList->forget(); $marketingList = MarketingList::getById(self::$marketingListId); $this->assertEquals(1, $marketingList->marketingListMembers->count()); $this->assertEquals(1, $marketingList->marketingListMembers[0]->unsubscribed); //Subscribe contact from list, then unsubscribe $marketingListMembers = MarketingListMember::getAll(); $this->assertEquals(1, count($marketingListMembers)); $marketingListMembers[0]->unsubscribed = false; $marketingListMembers[0]->unrestrictedSave(); $marketingList->forget(); $marketingList = MarketingList::getById(self::$marketingListId); $this->assertEquals(1, $marketingList->marketingListMembers->count()); $this->assertEquals(0, $marketingList->marketingListMembers[0]->unsubscribed); //Try to unsubscribe the contact, it should unsubscribe them $helper = new WorkflowActionProcessingHelper(88, 'some name', $action, $contact, Yii::app()->user->userModel); $helper->processNonUpdateSelfAction(); $marketingList->forget(); $marketingList = MarketingList::getById(self::$marketingListId); $this->assertEquals(1, $marketingList->marketingListMembers->count()); $this->assertEquals(1, $marketingList->marketingListMembers[0]->unsubscribed); }
/** * @depends testGetByProcessedAndAutoresponderId */ public function testGetByProcessedAndAutoresponderIdAndTime() { $intervals = array('hour', 'day'); $marketingList = MarketingList::getByName('marketingList 01'); $this->assertNotEmpty($marketingList); $autoresponder3 = AutoresponderTestHelper::createAutoresponder('autoresponder 03', 'subject 03', 'text 03', 'html 03', 10, Autoresponder::OPERATION_UNSUBSCRIBE, $marketingList[0]); $this->assertNotNull($autoresponder3); $autoresponder4 = AutoresponderTestHelper::createAutoresponder('autoresponder 04', 'subject 04', 'text 04', 'html 04', 20, Autoresponder::OPERATION_SUBSCRIBE, $marketingList[0]); $this->assertNotNull($autoresponder4); for ($i = 0; $i < 10; $i++) { if ($i % 3) { $pastOrFuture = "-"; $processed = AutoresponderItem::PROCESSED; } else { $pastOrFuture = "+"; $processed = AutoresponderItem::NOT_PROCESSED; } if ($i % 2) { $autoresponder = $autoresponder3; $interval = $intervals[1]; } else { $autoresponder = $autoresponder4; $interval = $intervals[0]; } $timestamp = strtotime($pastOrFuture . ($i + 1) . ' ' . $interval); $time = DateTimeUtil::convertTimestampToDbFormatDateTime($timestamp); $autoresponderItem = AutoresponderItemTestHelper::createAutoresponderItem($processed, $time, $autoresponder); $this->assertNotNull($autoresponderItem); } $autoresponderItems = AutoresponderItem::getAll(); $this->assertCount(37, $autoresponderItems); $autoresponder3ProcessedBeforeNow = AutoresponderItem::getByProcessedAndAutoresponderIdWithProcessDateTime(AutoresponderItem::PROCESSED, $autoresponder3->id); $this->assertNotEmpty($autoresponder3ProcessedBeforeNow); $this->assertCount(3, $autoresponder3ProcessedBeforeNow); $autoresponder3ProcessedFiveDaysAgo = AutoresponderItem::getByProcessedAndAutoresponderIdWithProcessDateTime(AutoresponderItem::PROCESSED, $autoresponder3->id, strtotime("-5 day")); $this->assertNotEmpty($autoresponder3ProcessedFiveDaysAgo); $this->assertCount(2, $autoresponder3ProcessedFiveDaysAgo); $autoresponder3NotProcessedBeforeNow = AutoresponderItem::getByProcessedAndAutoresponderIdWithProcessDateTime(AutoresponderItem::NOT_PROCESSED, $autoresponder3->id); $this->assertEmpty($autoresponder3NotProcessedBeforeNow); $autoresponder3NotProcessedFiveDaysFromNow = AutoresponderItem::getByProcessedAndAutoresponderIdWithProcessDateTime(AutoresponderItem::NOT_PROCESSED, $autoresponder3->id, strtotime("+5 day")); $this->assertNotEmpty($autoresponder3NotProcessedFiveDaysFromNow); $this->assertCount(1, $autoresponder3NotProcessedFiveDaysFromNow); $autoresponder4ProcessedBeforeNow = AutoresponderItem::getByProcessedAndAutoresponderIdWithProcessDateTime(AutoresponderItem::PROCESSED, $autoresponder4->id); $this->assertNotEmpty($autoresponder4ProcessedBeforeNow); $this->assertCount(3, $autoresponder4ProcessedBeforeNow); $autoresponder4ProcessedFiveDaysAgo = AutoresponderItem::getByProcessedAndAutoresponderIdWithProcessDateTime(AutoresponderItem::PROCESSED, $autoresponder4->id, strtotime("-5 day")); $this->assertEmpty($autoresponder4ProcessedFiveDaysAgo); $autoresponder4NotProcessedBeforeNow = AutoresponderItem::getByProcessedAndAutoresponderIdWithProcessDateTime(AutoresponderItem::NOT_PROCESSED, $autoresponder4->id); $this->assertEmpty($autoresponder4NotProcessedBeforeNow); $autoresponder4NotProcessedFiveDaysFromNow = AutoresponderItem::getByProcessedAndAutoresponderIdWithProcessDateTime(AutoresponderItem::NOT_PROCESSED, $autoresponder4->id, strtotime("+5 day")); $this->assertNotEmpty($autoresponder4NotProcessedFiveDaysFromNow); $this->assertCount(2, $autoresponder4NotProcessedFiveDaysFromNow); }
public function actionEdit($id) { $marketingList = MarketingList::getById(intval($id)); ControllerSecurityUtil::resolveAccessCanCurrentUserWriteModel($marketingList); $breadCrumbLinks = static::getDetailsAndEditBreadcrumbLinks(); $breadCrumbLinks[] = StringUtil::getChoppedStringContent(strval($marketingList), 25); $editView = new MarketingListEditView($this->getId(), $this->getModule()->getId(), $this->attemptToSaveModelFromPost($marketingList), strval($marketingList)); $view = new MarketingListsPageView(MarketingDefaultViewUtil::makeViewWithBreadcrumbsForCurrentUser($this, $editView, $breadCrumbLinks, 'MarketingBreadCrumbView')); echo $view->render(); }
/** * @param array $searchAttributeData * @param string $groupBy * @return string */ protected static function makeAutorespondersSqlQuery($searchAttributeData, $groupBy) { $quote = DatabaseCompatibilityUtil::getQuote(); $where = null; $selectDistinct = false; $marketingListTableName = MarketingList::getTableName(); $autoresponderTableName = Autoresponder::getTableName(); $autoresponderItemTableName = AutoresponderItem::getTableName(); $emailMessageTableName = EmailMessage::getTableName(); $sentDateTimeColumnName = EmailMessage::getColumnNameByAttribute('sentDateTime'); $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('Autoresponder'); $selectQueryAdapter = new RedBeanModelSelectQueryAdapter($selectDistinct); $uniqueOpensSelectPart = static::resolveAutoresponderTypeSubQuery(EmailMessageActivity::TYPE_OPEN); $uniqueClicksSelectPart = static::resolveAutoresponderTypeSubQuery(EmailMessageActivity::TYPE_CLICK); static::addEmailMessageDayDateClause($selectQueryAdapter, $sentDateTimeColumnName); static::addEmailMessageFirstDayOfWeekDateClause($selectQueryAdapter, $sentDateTimeColumnName); static::addEmailMessageFirstDayOfMonthDateClause($selectQueryAdapter, $sentDateTimeColumnName); $selectQueryAdapter->addNonSpecificCountClause(); $selectQueryAdapter->addClauseByQueryString("count((" . $uniqueOpensSelectPart . "))", static::UNIQUE_OPENS); $selectQueryAdapter->addClauseByQueryString("count((" . $uniqueClicksSelectPart . "))", static::UNIQUE_CLICKS); $joinTablesAdapter->addFromTableAndGetAliasName($marketingListTableName, 'marketinglist_id'); $joinTablesAdapter->addLeftTableAndGetAliasName($autoresponderItemTableName, 'id', $autoresponderTableName, 'autoresponder_id'); $joinTablesAdapter->addLeftTableAndGetAliasName($emailMessageTableName, 'emailmessage_id', $autoresponderItemTableName, 'id'); $where = RedBeanModelDataProvider::makeWhere('Autoresponder', $searchAttributeData, $joinTablesAdapter); MarketingList::resolveReadPermissionsOptimizationToSqlQuery(Yii::app()->user->userModel, $joinTablesAdapter, $where, $selectDistinct); $sql = SQLQueryUtil::makeQuery($autoresponderTableName, $selectQueryAdapter, $joinTablesAdapter, null, null, $where, null, $groupBy); return $sql; }
public function testSubscribeContactsForContactType() { $type = 'contact'; $account = AccountTestHelper::createAccountByNameForOwner('superAccount3', $this->user); $contact = ContactTestHelper::createContactWithAccountByNameForOwner('superContact6', $this->user, $account); $contactId = $contact->id; $marketingList = RandomDataUtil::getRandomValueFromArray(MarketingList::getAll()); $marketingListId = $marketingList->id; $this->setGetArray(array('marketingListId' => $marketingListId, 'id' => $contact->id, 'type' => $type)); $content = $this->runControllerWithNoExceptionsAndGetContent('marketingLists/defaultPortlet/subscribeContacts'); $contentArray = CJSON::decode($content); $this->assertNotEmpty($contentArray); $this->assertArrayHasKey('type', $contentArray); $this->assertArrayHasKey('message', $contentArray); $this->assertEquals('1 subscribed.', $contentArray['message']); $this->assertEquals('message', $contentArray['type']); $content = $this->runControllerWithNoExceptionsAndGetContent('marketingLists/defaultPortlet/subscribeContacts'); $contentArray = CJSON::decode($content); $this->assertNotEmpty($contentArray); $this->assertArrayHasKey('type', $contentArray); $this->assertArrayHasKey('message', $contentArray); $this->assertEquals('0 subscribed. 1 skipped, already in the list.', $contentArray['message']); $this->assertEquals('message', $contentArray['type']); }
/** * @depends testMassDeleteActionsForSelectedIds */ public function testMassDeletePagesProperlyAndRemovesAllSelected() { // MassDelete for selected Record Count $listId = self::getModelIdByModelNameAndName('MarketingList', 'MarketingList2'); $this->assertNotEmpty($listId); $list = MarketingList::getById($listId); $this->assertNotEmpty($list); $members = $list->marketingListMembers; $this->assertEquals(17, count($members)); // save Model MassDelete for entire search result $this->setGetArray(array('selectAll' => '1', 'MarketingListMembersPortletView_page' => 1, 'id' => $listId)); $this->setPostArray(array('selectedRecordCount' => 17)); // Run Mass Delete using progress save for page1. $pageSize = Yii::app()->pagination->getForCurrentUserByType('massDeleteProgressPageSize'); $this->assertEquals(5, $pageSize); $this->runControllerWithExitExceptionAndGetContent('marketingLists/member/massDelete'); // check for previous mass delete progress $list->forgetAll(); $list = MarketingList::getById($listId); $this->assertNotEmpty($list); $members = $list->marketingListMembers; $this->assertEquals(12, count($members)); $this->setGetArray(array('selectAll' => '1', 'MarketingListMember_page' => 2, 'id' => $listId)); $this->setPostArray(array('selectedRecordCount' => 17)); // Run Mass Delete using progress save for page2. $pageSize = Yii::app()->pagination->getForCurrentUserByType('massDeleteProgressPageSize'); $this->assertEquals(5, $pageSize); $this->runControllerWithNoExceptionsAndGetContent('marketingLists/member/massDeleteProgress'); $list->forgetAll(); $list = MarketingList::getById($listId); $this->assertNotEmpty($list); $members = $list->marketingListMembers; $this->assertEquals(7, count($members)); $this->setGetArray(array('selectAll' => '1', 'MarketingListMember_page' => 3, 'id' => $listId)); $this->setPostArray(array('selectedRecordCount' => 17)); // Run Mass Delete using progress save for page3. $pageSize = Yii::app()->pagination->getForCurrentUserByType('massDeleteProgressPageSize'); $this->assertEquals(5, $pageSize); $this->runControllerWithNoExceptionsAndGetContent('marketingLists/member/massDeleteProgress'); $list->forgetAll(); $list = MarketingList::getById($listId); $this->assertNotEmpty($list); $members = $list->marketingListMembers; $this->assertEquals(2, count($members)); $this->setGetArray(array('selectAll' => '1', 'MarketingListMember_page' => 4, 'id' => $listId)); $this->setPostArray(array('selectedRecordCount' => 17)); // Run Mass Delete using progress save for page4. $pageSize = Yii::app()->pagination->getForCurrentUserByType('massDeleteProgressPageSize'); $this->assertEquals(5, $pageSize); $this->runControllerWithNoExceptionsAndGetContent('marketingLists/member/massDeleteProgress'); $list->forgetAll(); $list = MarketingList::getById($listId); $this->assertNotEmpty($list); $members = $list->marketingListMembers; $this->assertEquals(0, count($members)); }
protected function addNewSubscribers($marketingListId, $contactIds, $scenario = null) { $subscriberInformation = array('subscribedCount' => 0, 'skippedCount' => 0); $marketingList = MarketingList::getById((int) $marketingListId); ControllerSecurityUtil::resolveAccessCanCurrentUserReadModel($marketingList); foreach ($contactIds as $contactId) { if ($marketingList->addNewMember($contactId, false, null, $scenario)) { $subscriberInformation['subscribedCount']++; } else { $subscriberInformation['skippedCount']++; } } return $subscriberInformation; }
/** * @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); }