diff --git a/lib/Models/StatisticsNewsletters.php b/lib/Models/StatisticsNewsletters.php index f52751a080..ec60043909 100644 --- a/lib/Models/StatisticsNewsletters.php +++ b/lib/Models/StatisticsNewsletters.php @@ -34,12 +34,18 @@ class StatisticsNewsletters extends Model { return static::table_alias('statistics') ->select('statistics.newsletter_id', 'newsletter_id') ->select('newsletter_rendered_subject') + ->select('opens.created_at', 'opened_at') ->select('sent_at') ->join( SendingQueue::$_table, array('statistics.queue_id', '=', 'queue.id'), 'queue' ) + ->leftOuterJoin( + StatisticsOpens::$_table, + array('statistics.newsletter_id', '=', 'opens.newsletter_id'), + 'opens' + ) ->where('statistics.subscriber_id', $subscriber->id()) ->orderByAsc('newsletter_id'); } diff --git a/lib/Subscribers/ImportExport/PersonalDataExporters/NewslettersExporter.php b/lib/Subscribers/ImportExport/PersonalDataExporters/NewslettersExporter.php index c17656c73a..21e3bd0f2e 100644 --- a/lib/Subscribers/ImportExport/PersonalDataExporters/NewslettersExporter.php +++ b/lib/Subscribers/ImportExport/PersonalDataExporters/NewslettersExporter.php @@ -40,16 +40,31 @@ class NewslettersExporter { private function exportNewsletter($statistics_row, $newsletters, $subscriber) { $newsletter_data = array(); $newsletter_data[] = array( - 'name' => __('Email subject'), + 'name' => __('Email subject', 'mailpoet'), 'value' => $statistics_row['newsletter_rendered_subject'], ); $newsletter_data[] = array( - 'name' => __('Sent at'), + 'name' => __('Sent at', 'mailpoet'), 'value' => $statistics_row['sent_at'], ); + if(isset($statistics_row['opened_at'])) { + $newsletter_data[] = array( + 'name' => __('Opened', 'mailpoet'), + 'value' => 'Yes', + ); + $newsletter_data[] = array( + 'name' => __('Opened at', 'mailpoet'), + 'value' => $statistics_row['opened_at'], + ); + } else { + $newsletter_data[] = array( + 'name' => __('Opened', 'mailpoet'), + 'value' => __('No', 'mailpoet'), + ); + } if(isset($newsletters[$statistics_row['newsletter_id']])) { $newsletter_data[] = array( - 'name' => __('Email preview'), + 'name' => __('Email preview', 'mailpoet'), 'value' => Url::getViewInBrowserUrl( '', $newsletters[$statistics_row['newsletter_id']], @@ -61,7 +76,7 @@ class NewslettersExporter { } return array( 'group_id' => 'mailpoet-newsletters', - 'group_label' => __('MailPoet Emails Sent'), + 'group_label' => __('MailPoet Emails Sent', 'mailpoet'), 'item_id' => 'newsletter-' . $statistics_row['newsletter_id'], 'data' => $newsletter_data, ); diff --git a/lib/Subscribers/ImportExport/PersonalDataExporters/SegmentsExporter.php b/lib/Subscribers/ImportExport/PersonalDataExporters/SegmentsExporter.php index e3bd962e94..3aee5701c9 100644 --- a/lib/Subscribers/ImportExport/PersonalDataExporters/SegmentsExporter.php +++ b/lib/Subscribers/ImportExport/PersonalDataExporters/SegmentsExporter.php @@ -29,20 +29,20 @@ class SegmentsExporter { private function exportSegment($segment) { $segment_data = array(); $segment_data[] = array( - 'name' => __('List name'), + 'name' => __('List name', 'mailpoet'), 'value' => $segment['name'], ); $segment_data[] = array( - 'name' => __('Subscription status'), + 'name' => __('Subscription status', 'mailpoet'), 'value' => $segment['status'], ); $segment_data[] = array( - 'name' => __('Timestamp of the subscription (or last change of the subscription status)'), + 'name' => __('Timestamp of the subscription (or last change of the subscription status)', 'mailpoet'), 'value' => $segment['updated_at'], ); return array( 'group_id' => 'mailpoet-lists', - 'group_label' => __('MailPoet Mailing Lists'), + 'group_label' => __('MailPoet Mailing Lists', 'mailpoet'), 'item_id' => 'list-' . $segment['segment_id'], 'data' => $segment_data, ); diff --git a/lib/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporter.php b/lib/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporter.php index cc1d05842e..a63212d8a7 100644 --- a/lib/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporter.php +++ b/lib/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporter.php @@ -18,7 +18,7 @@ class SubscriberExporter { if(!$subscriber) return array(); return array(array( 'group_id' => 'mailpoet-subscriber', - 'group_label' => __('MailPoet Subscriber Data'), + 'group_label' => __('MailPoet Subscriber Data', 'mailpoet'), 'item_id' => 'subscriber-' . $subscriber->id, 'data' => $this->getSubscriberExportData($subscriber->withCustomFields()), )); @@ -28,36 +28,36 @@ class SubscriberExporter { $custom_fields = $this->getCustomFields(); $result = array( array( - 'name' => __('First Name'), + 'name' => __('First Name', 'mailpoet'), 'value' => $subscriber->first_name, ), array( - 'name' => __('Last Name'), + 'name' => __('Last Name', 'mailpoet'), 'value' => $subscriber->last_name, ), array( - 'name' => __('Email'), + 'name' => __('Email', 'mailpoet'), 'value' => $subscriber->email, ), array( - 'name' => __('Status'), + 'name' => __('Status', 'mailpoet'), 'value' => $subscriber->status, ), ); if($subscriber->subscribed_ip) { $result[] = array( - 'name' => __('Subscribed IP'), + 'name' => __('Subscribed IP', 'mailpoet'), 'value' => $subscriber->subscribed_ip, ); } if($subscriber->confirmed_ip) { $result[] = array( - 'name' => __('Confirmed IP'), + 'name' => __('Confirmed IP', 'mailpoet'), 'value' => $subscriber->confirmed_ip, ); } $result[] = array( - 'name' => __('Created at timestamp'), + 'name' => __('Created at', 'mailpoet'), 'value' => $subscriber->created_at, ); diff --git a/tests/unit/Subscribers/ImportExport/PersonalDataExporters/NewslettersExporterTest.php b/tests/unit/Subscribers/ImportExport/PersonalDataExporters/NewslettersExporterTest.php index 29974ce733..4b8a8ddc4f 100644 --- a/tests/unit/Subscribers/ImportExport/PersonalDataExporters/NewslettersExporterTest.php +++ b/tests/unit/Subscribers/ImportExport/PersonalDataExporters/NewslettersExporterTest.php @@ -5,6 +5,7 @@ namespace MailPoet\Subscribers\ImportExport\PersonalDataExporters; use MailPoet\Models\Newsletter; use MailPoet\Models\SendingQueue; use MailPoet\Models\StatisticsNewsletters; +use MailPoet\Models\StatisticsOpens; use MailPoet\Models\Subscriber; class NewslettersExporterTest extends \MailPoetTest { @@ -81,7 +82,51 @@ class NewslettersExporterTest extends \MailPoetTest { 'queue_id' => $queue->id(), ))); $result = $this->exporter->export('user1@with.newsletters'); - expect($result['data'][0]['data'][2]['name'])->equals('Email preview'); - expect($result['data'][0]['data'][2]['value'])->contains('mailpoet_router&endpoint=view_in_browser&action=view&data='); + expect($result['data'][0]['data'][3]['name'])->equals('Email preview'); + expect($result['data'][0]['data'][3]['value'])->contains('mailpoet_router&endpoint=view_in_browser&action=view&data='); + } + + function testExportOpens() { + $subscriber = Subscriber::createOrUpdate(array( + 'email' => 'user2@with.newsletters', + )); + $newsletter1 = Newsletter::createOrUpdate(array( + 'subject' => 'Email Subject1', + 'type' => Newsletter::TYPE_STANDARD + )); + $newsletter2 = Newsletter::createOrUpdate(array( + 'subject' => 'Email Subject2', + 'type' => Newsletter::TYPE_STANDARD + )); + $queue1 = SendingQueue::createOrUpdate(array( + 'newsletter_rendered_subject' => 'Email Subject1', + 'task_id' => 2, + 'newsletter_id' => $newsletter1->id(), + )); + $queue2 = SendingQueue::createOrUpdate(array( + 'newsletter_rendered_subject' => 'Email Subject1', + 'task_id' => 2, + 'newsletter_id' => $newsletter1->id(), + )); + StatisticsNewsletters::createMultiple(array(array( + 'newsletter_id' => $newsletter1->id(), + 'subscriber_id' => $subscriber->id(), + 'queue_id' => $queue1->id(), + ))); + StatisticsNewsletters::createMultiple(array(array( + 'newsletter_id' => $newsletter2->id(), + 'subscriber_id' => $subscriber->id(), + 'queue_id' => $queue2->id(), + ))); + StatisticsOpens::createOrUpdate(array( + 'subscriber_id' => $subscriber->id(), + 'newsletter_id' => $newsletter1->id(), + 'queue_id' => $queue1->id(), + 'created_at' => '2017-01-02 12:23:45', + )); + $result = $this->exporter->export('user2@with.newsletters'); + expect($result['data'][0]['data'])->contains(array('name' => 'Opened', 'value' => 'Yes')); + expect($result['data'][0]['data'])->contains(array('name' => 'Opened at', 'value' => '2017-01-02 12:23:45')); + expect($result['data'][1]['data'])->contains(array('name' => 'Opened', 'value' => 'No')); } } diff --git a/tests/unit/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporterTest.php b/tests/unit/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporterTest.php index 164a77b27f..d5fbfc40f8 100644 --- a/tests/unit/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporterTest.php +++ b/tests/unit/Subscribers/ImportExport/PersonalDataExporters/SubscriberExporterTest.php @@ -47,7 +47,7 @@ class SubscriberExporterTest extends \MailPoetTest { array('name' => 'Last Name', 'value' => 'Doe'), array('name' => 'Email', 'value' => 'email.that@has.no.custom.fields'), array('name' => 'Status', 'value' => 'unconfirmed'), - array('name' => 'Created at timestamp', 'value' => '2018-05-03 10:30:08'), + array('name' => 'Created at', 'value' => '2018-05-03 10:30:08'), ); expect($result['data'][0]['data'])->equals($expected); }