public function testRun()
 {
     $count = ExternalApiEmailMessageActivity::getCount();
     $this->assertEquals(0, $count);
     $job = new SendGridTestEmailEventsJob();
     $this->assertTrue($job->run());
     $activities = ExternalApiEmailMessageActivity::getAll();
     $this->assertEquals(3, count($activities));
     $this->assertEquals("550 No Such User Here", trim($activities[0]->reason));
     $this->assertEquals("Bounced Address", trim($activities[1]->reason));
     $this->assertEquals("Marked as spam", $activities[2]->reason);
 }
 public function testGetCountByTypeAndEmailMessageActivity()
 {
     // setup pre-req data
     $contact = ContactTestHelper::createContactByNameForOwner('contact 01', $this->user);
     $marketingList = MarketingListTestHelper::createMarketingListByName('marketingList 01', 'description 01', 'fromName 01', '*****@*****.**');
     $campaign = CampaignTestHelper::createCampaign('campaign 01', 'subject 01', 'text Content 01', 'html Content 01', 'fromName 01', '*****@*****.**', null, null, null, null, $marketingList);
     $processed = 0;
     $campaignItem = CampaignItemTestHelper::createCampaignItem($processed, $campaign, $contact);
     $modelId = $campaignItem->id;
     $modelType = get_class($campaignItem);
     $personId = $contact->getClassId('Person');
     $this->assertNotNull($personId);
     $activityData = array('modelId' => $campaignItem->id, 'modelType' => 'CampaignItem', 'personId' => $personId, 'url' => null, 'type' => CampaignItemActivity::TYPE_OPEN);
     $activityCreatedOrUpdated = CampaignItemActivityUtil::createOrUpdateActivity($activityData);
     $emailMessageActivities = CampaignItemActivity::getByTypeAndModelIdAndPersonIdAndUrl(CampaignItemActivity::TYPE_OPEN, $campaignItem->id, $personId, null);
     $externalMessageActivityCount = ExternalApiEmailMessageActivity::getByTypeAndEmailMessageActivity(CampaignItemActivity::TYPE_OPEN, $emailMessageActivities[0], "sendgrid");
     $this->assertEquals(0, $externalMessageActivityCount);
     $externalApiEmailMessageActivity = new ExternalApiEmailMessageActivity();
     $externalApiEmailMessageActivity->emailMessageActivity = $emailMessageActivities[0];
     $externalApiEmailMessageActivity->api = 'sendgrid';
     $externalApiEmailMessageActivity->type = CampaignItemActivity::TYPE_OPEN;
     $externalApiEmailMessageActivity->reason = 'Test reason';
     $externalApiEmailMessageActivity->emailAddress = '*****@*****.**';
     $externalApiEmailMessageActivity->itemClass = 'CampaignItem';
     $externalApiEmailMessageActivity->itemId = $campaignItem->id;
     $this->assertTrue($externalApiEmailMessageActivity->save());
     $id = $externalApiEmailMessageActivity->id;
     $externalMessageActivityCount = ExternalApiEmailMessageActivity::getByTypeAndEmailMessageActivity(CampaignItemActivity::TYPE_OPEN, $emailMessageActivities[0], "sendgrid");
     $this->assertEquals(1, $externalMessageActivityCount);
     $externalApiActivity = ExternalApiEmailMessageActivity::getById($id);
     $externalApiActivity->reason = 'New reason 1';
     $this->assertTrue($externalApiActivity->save());
     $externalApiActivity = ExternalApiEmailMessageActivity::getById($id);
     $this->assertEquals('New reason 1', $externalApiActivity->reason);
     $activities = ExternalApiEmailMessageActivity::getByEmailAddress('*****@*****.**', "sendgrid", false);
     $this->assertEquals(1, count($activities));
     $this->assertEquals('New reason 1', $activities[0]->reason);
 }
 /**
  * Resolve content for sendgrid bounce or spam email activity.
  * @param CampaignItem $campaignItem
  * @param int $type
  * @return string
  */
 protected static function resolveContentForSendGridBounceOrSpamEventActivity(CampaignItem $campaignItem, $type)
 {
     $typesArray = CampaignItemActivity::getTypesArray();
     $campaignItemActivities = CampaignItemActivity::getByTypeAndModelIdAndPersonIdAndUrl($type, $campaignItem->id, $campaignItem->contact->getClassId('Person'), null, 'latestDateTime');
     $content = null;
     foreach ($campaignItemActivities as $campaignItemActivity) {
         $externalMessageActivities = ExternalApiEmailMessageActivity::getByEmailMessageActivity($campaignItemActivity, "sendgrid", false);
         foreach ($externalMessageActivities as $externalMessageActivity) {
             $content .= '<tr>';
             $content .= '<td>' . $typesArray[$externalMessageActivity->type] . '</td>';
             $content .= '<td>' . DateTimeUtil::convertDbFormattedDateTimeToLocaleFormattedDisplay($campaignItemActivity->latestDateTime) . '</td>';
             $content .= '<td>' . $campaignItemActivity->quantity . '</td>';
             $content .= '<td>' . $campaignItemActivity->latestSourceIP . '</td>';
             $content .= '<td></td>';
             $content .= '</tr>';
         }
     }
     return $content;
 }
 /**
  * Renders email address stage based on last email activity
  * @param String $emailAddress
  * @param RedBeanModel $model
  * @return string $content
  */
 public static function renderEmailAddressState($emailAddress, RedBeanModel $model)
 {
     assert('is_string($emailAddress) || $emailAddress == null');
     if ($emailAddress == null) {
         return;
     }
     $records = ExternalApiEmailMessageActivity::resolveAndGetByEmailAddress($emailAddress, 'sendgrid');
     if (!empty($records)) {
         $record = $records[0];
         if ($record->type == EmailMessageActivity::TYPE_BOUNCE || $record->type == EmailMessageActivity::TYPE_HARD_BOUNCE || $record->type == EmailMessageActivity::TYPE_SOFT_BOUNCE) {
             $tooltipTitle = $record->reason;
             $tooltip = '<span id="last-email-activity-status-tooltip" class="tooltip" title="' . $tooltipTitle . '">?</span>';
             $content = '<i>&#9679;</i><span>' . Zurmo::t('MarketingModule', 'Bounced') . '</span>' . $tooltip;
             $content = ZurmoHtml::tag('div', array('class' => 'email-recipient-stage-status stage-false'), $content);
             $content = ZurmoHtml::tag('div', array('class' => 'clearfix'), $content);
             $content = ZurmoHtml::tag('div', array('class' => 'continuum', 'id' => 'bouncedcontact'), $content);
         }
         if ($record->type == EmailMessageActivity::TYPE_SPAM) {
             $tooltipTitle = $record->reason;
             $tooltip = '<span id="last-email-activity-status-tooltip" class="tooltip" title="' . $tooltipTitle . '">?</span>';
             $content = '<i>&#9679;</i><span>' . Zurmo::t('MarketingModule', 'Spam') . '</span>' . $tooltip;
             $content = ZurmoHtml::tag('div', array('class' => 'email-recipient-stage-status queued'), $content);
             $content = ZurmoHtml::tag('div', array('class' => 'clearfix'), $content);
             $content = ZurmoHtml::tag('div', array('class' => 'continuum', 'id' => 'spammedcontact'), $content);
         }
         $qtip = new ZurmoTip();
         $qtip->addQTip("#last-email-activity-status-tooltip");
         $content = ZurmoHtml::tag('div', array('class' => 'last-email-activity-status'), $content);
         return $content;
     }
     return null;
 }
 /**
  * Process actiity information.
  * @param array $value
  */
 protected function processActivityInformation($value)
 {
     $type = $this->getActivityTypeByEvent($value);
     $activityClassName = EmailMessageActivityUtil::resolveModelClassNameByModelType($value['itemClass']);
     $activityUtilClassName = $activityClassName . 'Util';
     $activityData = array('modelId' => $value['itemId'], 'modelType' => $value['itemClass'], 'personId' => $value['personId'], 'url' => null, 'type' => $type);
     if ($activityUtilClassName::createOrUpdateActivity($activityData)) {
         //$activityClassName = CampaignItemActivity
         $emailMessageActivities = $activityClassName::getByTypeAndModelIdAndPersonIdAndUrl($type, $value['itemId'], $value['personId'], null);
         self::resolveAndUpdateEventInformationByStatus($value);
         $externalMessageActivityCount = ExternalApiEmailMessageActivity::getByTypeAndEmailMessageActivity($value['type'], $emailMessageActivities[0], "sendgrid");
         if ($externalMessageActivityCount == 0) {
             $this->saveExternalApiEmailMessageActivity($emailMessageActivities[0], $value);
         }
     }
 }