PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.0.1
MailPoet – Newsletters, Email Marketing, and Automation v5.0.1
5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / lib / Analytics / ReporterCampaignData.php
mailpoet / lib / Analytics Last commit date
Analytics.php 2 years ago Reporter.php 1 year ago ReporterCampaignData.php 2 years ago UnsubscribeReporter.php 3 years ago index.php 3 years ago
ReporterCampaignData.php
470 lines
1 <?php declare(strict_types = 1);
2
3 namespace MailPoet\Analytics;
4
5 if (!defined('ABSPATH')) exit;
6
7
8 use MailPoet\Entities\NewsletterEntity;
9 use MailPoet\Newsletter\Sending\SendingQueuesRepository;
10 use MailPoet\UnexpectedValueException;
11
12 class ReporterCampaignData {
13
14
15 const STANDARD_7_DAYS = 'Number of standard newsletters sent in last 7 days';
16 const STANDARD_30_DAYS = 'Number of standard newsletters sent in last 30 days';
17 const STANDARD_3_MONTHS = 'Number of standard newsletters sent in last 3 months';
18 const STANDARD_SEGMENT_7_DAYS = 'Number of standard newsletters sent to segment in last 7 days';
19 const STANDARD_SEGMENT_30_DAYS = 'Number of standard newsletters sent to segment in last 30 days';
20 const STANDARD_SEGMENT_3_MONTHS = 'Number of standard newsletters sent to segment in last 3 months';
21 const STANDARD_FILTERED_SEGMENT_7_DAYS = 'Number of standard newsletters filtered by segment in last 7 days';
22 const STANDARD_FILTERED_SEGMENT_30_DAYS = 'Number of standard newsletters filtered by segment in last 30 days';
23 const STANDARD_FILTERED_SEGMENT_3_MONTHS = 'Number of standard newsletters filtered by segment in last 3 months';
24 const AUTOMATION_7_DAYS = 'Number of automations campaigns sent in the last 7 days';
25 const AUTOMATION_30_DAYS = 'Number of automations campaigns sent in the last 30 days';
26 const AUTOMATION_3_MONTHS = 'Number of automations campaigns sent in the last 3 months';
27 const RE_ENGAGEMENT_7_DAYS = 'Number of re-engagement campaigns sent in the last 7 days';
28 const RE_ENGAGEMENT_30_DAYS = 'Number of re-engagement campaigns sent in the last 30 days';
29 const RE_ENGAGEMENT_3_MONTHS = 'Number of re-engagement campaigns sent in the last 3 months';
30 const RE_ENGAGEMENT_SEGMENT_7_DAYS = 'Number of re-engagement campaigns sent to segment in the last 7 days';
31 const RE_ENGAGEMENT_SEGMENT_30_DAYS = 'Number of re-engagement campaigns sent to segment in the last 30 days';
32 const RE_ENGAGEMENT_SEGMENT_3_MONTHS = 'Number of re-engagement campaigns sent to segment in the last 3 months';
33 const RE_ENGAGEMENT_FILTERED_SEGMENT_7_DAYS = 'Number of re-engagement campaigns filtered by segment in the last 7 days';
34 const RE_ENGAGEMENT_FILTERED_SEGMENT_30_DAYS = 'Number of re-engagement campaigns filtered by segment in the last 30 days';
35 const RE_ENGAGEMENT_FILTERED_SEGMENT_3_MONTHS = 'Number of re-engagement campaigns filtered by segment in the last 3 months';
36 const POST_NOTIFICATION_7_DAYS = 'Number of post notification campaigns sent in the last 7 days';
37 const POST_NOTIFICATION_30_DAYS = 'Number of post notification campaigns sent in the last 30 days';
38 const POST_NOTIFICATION_3_MONTHS = 'Number of post notification campaigns sent in the last 3 months';
39 const POST_NOTIFICATION_SEGMENT_7_DAYS = 'Number of post notification campaigns sent to segment in the last 7 days';
40 const POST_NOTIFICATION_SEGMENT_30_DAYS = 'Number of post notification campaigns sent to segment in the last 30 days';
41 const POST_NOTIFICATION_SEGMENT_3_MONTHS = 'Number of post notification campaigns sent to segment in the last 3 months';
42 const POST_NOTIFICATION_FILTERED_SEGMENT_7_DAYS = 'Number of post notification campaigns filtered by segment in the last 7 days';
43 const POST_NOTIFICATION_FILTERED_SEGMENT_30_DAYS = 'Number of post notification campaigns filtered by segment in the last 30 days';
44 const POST_NOTIFICATION_FILTERED_SEGMENT_3_MONTHS = 'Number of post notification campaigns filtered by segment in the last 3 months';
45
46 const LEGACY_WELCOME_7_DAYS = 'Number of legacy welcome email campaigns sent in the last 7 days';
47 const LEGACY_WELCOME_30_DAYS = 'Number of legacy welcome email campaigns sent in the last 30 days';
48 const LEGACY_WELCOME_3_MONTHS = 'Number of legacy welcome email campaigns sent in the last 3 months';
49
50 const LEGACY_ABANDONED_CART_7_DAYS = 'Number of legacy abandoned cart campaigns sent in the last 7 days';
51 const LEGACY_ABANDONED_CART_30_DAYS = 'Number of legacy abandoned cart campaigns sent in the last 30 days';
52 const LEGACY_ABANDONED_CART_3_MONTHS = 'Number of legacy abandoned cart campaigns sent in the last 3 months';
53
54 const LEGACY_FIRST_PURCHASE_7_DAYS = 'Number of legacy first purchase campaigns sent in the last 7 days';
55 const LEGACY_FIRST_PURCHASE_30_DAYS = 'Number of legacy first purchase campaigns sent in the last 30 days';
56 const LEGACY_FIRST_PURCHASE_3_MONTHS = 'Number of legacy first purchase campaigns sent in the last 3 months';
57
58 const LEGACY_PURCHASED_IN_CATEGORY_7_DAYS = 'Number of legacy purchased in category campaigns sent in the last 7 days';
59 const LEGACY_PURCHASED_IN_CATEGORY_30_DAYS = 'Number of legacy purchased in category campaigns sent in the last 30 days';
60 const LEGACY_PURCHASED_IN_CATEGORY_3_MONTHS = 'Number of legacy purchased in category campaigns sent in the last 3 months';
61
62 const LEGACY_PURCHASED_PRODUCT_7_DAYS = 'Number of legacy purchased product campaigns sent in the last 7 days';
63 const LEGACY_PURCHASED_PRODUCT_30_DAYS = 'Number of legacy purchased product campaigns sent in the last 30 days';
64 const LEGACY_PURCHASED_PRODUCT_3_MONTHS = 'Number of legacy purchased product campaigns sent in the last 3 months';
65
66 const TOTAL_CAMPAIGNS_7_DAYS = 'Number of campaigns sent in the last 7 days';
67 const TOTAL_CAMPAIGNS_30_DAYS = 'Number of campaigns sent in the last 30 days';
68 const TOTAL_CAMPAIGNS_3_MONTHS = 'Number of campaigns sent in the last 3 months';
69
70
71 const TOTAL_CAMPAIGNS_SEGMENT_7_DAYS = 'Number of campaigns sent to segment in the last 7 days';
72 const TOTAL_CAMPAIGNS_SEGMENT_30_DAYS = 'Number of campaigns sent to segment in the last 30 days';
73 const TOTAL_CAMPAIGNS_SEGMENT_3_MONTHS = 'Number of campaigns sent to segment in the last 3 months';
74
75 const TOTAL_CAMPAIGNS_FILTERED_SEGMENT_7_DAYS = 'Number of campaigns filtered by segment in the last 7 days';
76 const TOTAL_CAMPAIGNS_FILTERED_SEGMENT_30_DAYS = 'Number of campaigns filtered by segment in the last 30 days';
77 const TOTAL_CAMPAIGNS_FILTERED_SEGMENT_3_MONTHS = 'Number of campaigns filtered by segment in the last 3 months';
78
79 /** @var SendingQueuesRepository */
80 private $sendingQueuesRepository;
81
82 public function __construct(
83 SendingQueuesRepository $sendingQueuesRepository
84 ) {
85 $this->sendingQueuesRepository = $sendingQueuesRepository;
86 }
87
88 public function getCampaignAnalyticsProperties(): array {
89 $returnData = [
90 self::STANDARD_7_DAYS => 0,
91 self::STANDARD_30_DAYS => 0,
92 self::STANDARD_3_MONTHS => 0,
93
94 self::STANDARD_SEGMENT_7_DAYS => 0,
95 self::STANDARD_SEGMENT_30_DAYS => 0,
96 self::STANDARD_SEGMENT_3_MONTHS => 0,
97
98 self::STANDARD_FILTERED_SEGMENT_7_DAYS => 0,
99 self::STANDARD_FILTERED_SEGMENT_30_DAYS => 0,
100 self::STANDARD_FILTERED_SEGMENT_3_MONTHS => 0,
101
102 self::AUTOMATION_7_DAYS => 0,
103 self::AUTOMATION_30_DAYS => 0,
104 self::AUTOMATION_3_MONTHS => 0,
105
106 self::RE_ENGAGEMENT_7_DAYS => 0,
107 self::RE_ENGAGEMENT_30_DAYS => 0,
108 self::RE_ENGAGEMENT_3_MONTHS => 0,
109
110 self::RE_ENGAGEMENT_SEGMENT_7_DAYS => 0,
111 self::RE_ENGAGEMENT_SEGMENT_30_DAYS => 0,
112 self::RE_ENGAGEMENT_SEGMENT_3_MONTHS => 0,
113
114 self::RE_ENGAGEMENT_FILTERED_SEGMENT_7_DAYS => 0,
115 self::RE_ENGAGEMENT_FILTERED_SEGMENT_30_DAYS => 0,
116 self::RE_ENGAGEMENT_FILTERED_SEGMENT_3_MONTHS => 0,
117
118 self::POST_NOTIFICATION_7_DAYS => 0,
119 self::POST_NOTIFICATION_30_DAYS => 0,
120 self::POST_NOTIFICATION_3_MONTHS => 0,
121
122 self::POST_NOTIFICATION_SEGMENT_7_DAYS => 0,
123 self::POST_NOTIFICATION_SEGMENT_30_DAYS => 0,
124 self::POST_NOTIFICATION_SEGMENT_3_MONTHS => 0,
125
126 self::POST_NOTIFICATION_FILTERED_SEGMENT_7_DAYS => 0,
127 self::POST_NOTIFICATION_FILTERED_SEGMENT_30_DAYS => 0,
128 self::POST_NOTIFICATION_FILTERED_SEGMENT_3_MONTHS => 0,
129
130 // Legacy
131 self::LEGACY_WELCOME_7_DAYS => 0,
132 self::LEGACY_WELCOME_30_DAYS => 0,
133 self::LEGACY_WELCOME_3_MONTHS => 0,
134
135 self::LEGACY_ABANDONED_CART_7_DAYS => 0,
136 self::LEGACY_ABANDONED_CART_30_DAYS => 0,
137 self::LEGACY_ABANDONED_CART_3_MONTHS => 0,
138
139 self::LEGACY_FIRST_PURCHASE_7_DAYS => 0,
140 self::LEGACY_FIRST_PURCHASE_30_DAYS => 0,
141 self::LEGACY_FIRST_PURCHASE_3_MONTHS => 0,
142
143 self::LEGACY_PURCHASED_IN_CATEGORY_7_DAYS => 0,
144 self::LEGACY_PURCHASED_IN_CATEGORY_30_DAYS => 0,
145 self::LEGACY_PURCHASED_IN_CATEGORY_3_MONTHS => 0,
146
147 self::LEGACY_PURCHASED_PRODUCT_7_DAYS => 0,
148 self::LEGACY_PURCHASED_PRODUCT_30_DAYS => 0,
149 self::LEGACY_PURCHASED_PRODUCT_3_MONTHS => 0,
150
151 // Totals
152 self::TOTAL_CAMPAIGNS_7_DAYS => 0,
153 self::TOTAL_CAMPAIGNS_30_DAYS => 0,
154 self::TOTAL_CAMPAIGNS_3_MONTHS => 0,
155 self::TOTAL_CAMPAIGNS_SEGMENT_7_DAYS => 0,
156 self::TOTAL_CAMPAIGNS_SEGMENT_30_DAYS => 0,
157 self::TOTAL_CAMPAIGNS_SEGMENT_3_MONTHS => 0,
158 self::TOTAL_CAMPAIGNS_FILTERED_SEGMENT_7_DAYS => 0,
159 self::TOTAL_CAMPAIGNS_FILTERED_SEGMENT_30_DAYS => 0,
160 self::TOTAL_CAMPAIGNS_FILTERED_SEGMENT_3_MONTHS => 0,
161 ];
162
163 $processedResults = $this->getProcessedCampaignAnalytics();
164
165 foreach ($processedResults as $campaignId => $processedResult) {
166 $isNewerThan7DaysAgo = $processedResult['sentLast7Days'] ?? false;
167 $isNewerThan30DaysAgo = $processedResult['sentLast30Days'] ?? false;
168 $isNewerThan3MonthsAgo = $processedResult['sentLast3Months'] ?? false;
169
170 $newsletterType = $processedResult['newsletterType'];
171
172 $wasSentToDynamicSegment = $processedResult['sentToSegment'] ?? false;
173 $wasFilteredBySegment = $processedResult['filteredBySegment'] ?? false;
174
175 // Totals
176 if ($isNewerThan7DaysAgo) {
177 $returnData[self::TOTAL_CAMPAIGNS_7_DAYS]++;
178 $returnData[self::TOTAL_CAMPAIGNS_30_DAYS]++;
179 $returnData[self::TOTAL_CAMPAIGNS_3_MONTHS]++;
180 if ($wasSentToDynamicSegment) {
181 $returnData[self::TOTAL_CAMPAIGNS_SEGMENT_7_DAYS]++;
182 $returnData[self::TOTAL_CAMPAIGNS_SEGMENT_30_DAYS]++;
183 $returnData[self::TOTAL_CAMPAIGNS_SEGMENT_3_MONTHS]++;
184 }
185 if ($wasFilteredBySegment) {
186 $returnData[self::TOTAL_CAMPAIGNS_FILTERED_SEGMENT_7_DAYS]++;
187 $returnData[self::TOTAL_CAMPAIGNS_FILTERED_SEGMENT_30_DAYS]++;
188 $returnData[self::TOTAL_CAMPAIGNS_FILTERED_SEGMENT_3_MONTHS]++;
189 }
190 } elseif ($isNewerThan30DaysAgo) {
191 $returnData[self::TOTAL_CAMPAIGNS_30_DAYS]++;
192 $returnData[self::TOTAL_CAMPAIGNS_3_MONTHS]++;
193 if ($wasSentToDynamicSegment) {
194 $returnData[self::TOTAL_CAMPAIGNS_SEGMENT_30_DAYS]++;
195 $returnData[self::TOTAL_CAMPAIGNS_SEGMENT_3_MONTHS]++;
196 }
197 if ($wasFilteredBySegment) {
198 $returnData[self::TOTAL_CAMPAIGNS_FILTERED_SEGMENT_30_DAYS]++;
199 $returnData[self::TOTAL_CAMPAIGNS_FILTERED_SEGMENT_3_MONTHS]++;
200 }
201 } elseif ($isNewerThan3MonthsAgo) {
202 $returnData[self::TOTAL_CAMPAIGNS_3_MONTHS]++;
203 if ($wasSentToDynamicSegment) {
204 $returnData[self::TOTAL_CAMPAIGNS_SEGMENT_3_MONTHS]++;
205 }
206 if ($wasFilteredBySegment) {
207 $returnData[self::TOTAL_CAMPAIGNS_FILTERED_SEGMENT_3_MONTHS]++;
208 }
209 }
210
211 switch ($newsletterType) {
212 case NewsletterEntity::TYPE_STANDARD:
213 if ($isNewerThan7DaysAgo) {
214 $returnData[self::STANDARD_7_DAYS]++;
215 $returnData[self::STANDARD_30_DAYS]++;
216 $returnData[self::STANDARD_3_MONTHS]++;
217 if ($wasFilteredBySegment) {
218 $returnData[self::STANDARD_FILTERED_SEGMENT_7_DAYS]++;
219 $returnData[self::STANDARD_FILTERED_SEGMENT_30_DAYS]++;
220 $returnData[self::STANDARD_FILTERED_SEGMENT_3_MONTHS]++;
221 }
222 if ($wasSentToDynamicSegment) {
223 $returnData[self::STANDARD_SEGMENT_7_DAYS]++;
224 $returnData[self::STANDARD_SEGMENT_30_DAYS]++;
225 $returnData[self::STANDARD_SEGMENT_3_MONTHS]++;
226 }
227 } elseif ($isNewerThan30DaysAgo) {
228 $returnData[self::STANDARD_30_DAYS]++;
229 $returnData[self::STANDARD_3_MONTHS]++;
230 if ($wasFilteredBySegment) {
231 $returnData[self::STANDARD_FILTERED_SEGMENT_30_DAYS]++;
232 $returnData[self::STANDARD_FILTERED_SEGMENT_3_MONTHS]++;
233 }
234 if ($wasSentToDynamicSegment) {
235 $returnData[self::STANDARD_SEGMENT_30_DAYS]++;
236 $returnData[self::STANDARD_SEGMENT_3_MONTHS]++;
237 }
238 } elseif ($isNewerThan3MonthsAgo) {
239 $returnData[self::STANDARD_3_MONTHS]++;
240 if ($wasFilteredBySegment) {
241 $returnData[self::STANDARD_FILTERED_SEGMENT_3_MONTHS]++;
242 }
243 if ($wasSentToDynamicSegment) {
244 $returnData[self::STANDARD_SEGMENT_3_MONTHS]++;
245 }
246 }
247 break;
248 case NewsletterEntity::TYPE_NOTIFICATION_HISTORY:
249 if ($isNewerThan7DaysAgo) {
250 $returnData[self::POST_NOTIFICATION_7_DAYS]++;
251 $returnData[self::POST_NOTIFICATION_30_DAYS]++;
252 $returnData[self::POST_NOTIFICATION_3_MONTHS]++;
253 if ($wasSentToDynamicSegment) {
254 $returnData[self::POST_NOTIFICATION_SEGMENT_7_DAYS]++;
255 $returnData[self::POST_NOTIFICATION_SEGMENT_30_DAYS]++;
256 $returnData[self::POST_NOTIFICATION_SEGMENT_3_MONTHS]++;
257 }
258 if ($wasFilteredBySegment) {
259 $returnData[self::POST_NOTIFICATION_FILTERED_SEGMENT_7_DAYS]++;
260 $returnData[self::POST_NOTIFICATION_FILTERED_SEGMENT_30_DAYS]++;
261 $returnData[self::POST_NOTIFICATION_FILTERED_SEGMENT_3_MONTHS]++;
262 }
263 } elseif ($isNewerThan30DaysAgo) {
264 $returnData[self::POST_NOTIFICATION_30_DAYS]++;
265 $returnData[self::POST_NOTIFICATION_3_MONTHS]++;
266 if ($wasSentToDynamicSegment) {
267 $returnData[self::POST_NOTIFICATION_SEGMENT_30_DAYS]++;
268 $returnData[self::POST_NOTIFICATION_SEGMENT_3_MONTHS]++;
269 }
270 if ($wasFilteredBySegment) {
271 $returnData[self::POST_NOTIFICATION_FILTERED_SEGMENT_30_DAYS]++;
272 $returnData[self::POST_NOTIFICATION_FILTERED_SEGMENT_3_MONTHS]++;
273 }
274 } elseif ($isNewerThan3MonthsAgo) {
275 $returnData[self::POST_NOTIFICATION_3_MONTHS]++;
276 if ($wasSentToDynamicSegment) {
277 $returnData[self::POST_NOTIFICATION_SEGMENT_3_MONTHS]++;
278 }
279 if ($wasFilteredBySegment) {
280 $returnData[self::POST_NOTIFICATION_FILTERED_SEGMENT_3_MONTHS]++;
281 }
282 }
283 break;
284 case NewsletterEntity::TYPE_RE_ENGAGEMENT:
285 if ($isNewerThan7DaysAgo) {
286 $returnData[self::RE_ENGAGEMENT_7_DAYS]++;
287 $returnData[self::RE_ENGAGEMENT_30_DAYS]++;
288 $returnData[self::RE_ENGAGEMENT_3_MONTHS]++;
289 if ($wasSentToDynamicSegment) {
290 $returnData[self::RE_ENGAGEMENT_SEGMENT_7_DAYS]++;
291 $returnData[self::RE_ENGAGEMENT_SEGMENT_30_DAYS]++;
292 $returnData[self::RE_ENGAGEMENT_SEGMENT_3_MONTHS]++;
293 }
294 if ($wasFilteredBySegment) {
295 $returnData[self::RE_ENGAGEMENT_FILTERED_SEGMENT_7_DAYS]++;
296 $returnData[self::RE_ENGAGEMENT_FILTERED_SEGMENT_30_DAYS]++;
297 $returnData[self::RE_ENGAGEMENT_FILTERED_SEGMENT_3_MONTHS]++;
298 }
299 } elseif ($isNewerThan30DaysAgo) {
300 $returnData[self::RE_ENGAGEMENT_30_DAYS]++;
301 $returnData[self::RE_ENGAGEMENT_3_MONTHS]++;
302 if ($wasSentToDynamicSegment) {
303 $returnData[self::RE_ENGAGEMENT_SEGMENT_30_DAYS]++;
304 $returnData[self::RE_ENGAGEMENT_SEGMENT_3_MONTHS]++;
305 }
306 if ($wasFilteredBySegment) {
307 $returnData[self::RE_ENGAGEMENT_FILTERED_SEGMENT_30_DAYS]++;
308 $returnData[self::RE_ENGAGEMENT_FILTERED_SEGMENT_3_MONTHS]++;
309 }
310 } elseif ($isNewerThan3MonthsAgo) {
311 $returnData[self::RE_ENGAGEMENT_3_MONTHS]++;
312 if ($wasSentToDynamicSegment) {
313 $returnData[self::RE_ENGAGEMENT_SEGMENT_3_MONTHS]++;
314 }
315 if ($wasFilteredBySegment) {
316 $returnData[self::RE_ENGAGEMENT_FILTERED_SEGMENT_3_MONTHS]++;
317 }
318 }
319 break;
320 case NewsletterEntity::TYPE_WELCOME:
321 if ($isNewerThan7DaysAgo) {
322 $returnData[self::LEGACY_WELCOME_7_DAYS]++;
323 $returnData[self::LEGACY_WELCOME_30_DAYS]++;
324 $returnData[self::LEGACY_WELCOME_3_MONTHS]++;
325 } elseif ($isNewerThan30DaysAgo) {
326 $returnData[self::LEGACY_WELCOME_30_DAYS]++;
327 $returnData[self::LEGACY_WELCOME_3_MONTHS]++;
328 } elseif ($isNewerThan3MonthsAgo) {
329 $returnData[self::LEGACY_WELCOME_3_MONTHS]++;
330 }
331 break;
332 case NewsletterEntity::TYPE_AUTOMATION:
333 if ($isNewerThan7DaysAgo) {
334 $returnData[self::AUTOMATION_7_DAYS]++;
335 $returnData[self::AUTOMATION_30_DAYS]++;
336 $returnData[self::AUTOMATION_3_MONTHS]++;
337 } elseif ($isNewerThan30DaysAgo) {
338 $returnData[self::AUTOMATION_30_DAYS]++;
339 $returnData[self::AUTOMATION_3_MONTHS]++;
340 } elseif ($isNewerThan3MonthsAgo) {
341 $returnData[self::AUTOMATION_3_MONTHS]++;
342 }
343 break;
344 // Legacy automatic emails.
345 case 'purchasedProduct':
346 if ($isNewerThan7DaysAgo) {
347 $returnData[self::LEGACY_PURCHASED_PRODUCT_7_DAYS]++;
348 $returnData[self::LEGACY_PURCHASED_PRODUCT_30_DAYS]++;
349 $returnData[self::LEGACY_PURCHASED_PRODUCT_3_MONTHS]++;
350 } elseif ($isNewerThan30DaysAgo) {
351 $returnData[self::LEGACY_PURCHASED_PRODUCT_30_DAYS]++;
352 $returnData[self::LEGACY_PURCHASED_PRODUCT_3_MONTHS]++;
353 } elseif ($isNewerThan3MonthsAgo) {
354 $returnData[self::LEGACY_PURCHASED_PRODUCT_3_MONTHS]++;
355 }
356 break;
357 case 'purchasedInCategory':
358 if ($isNewerThan7DaysAgo) {
359 $returnData[self::LEGACY_PURCHASED_IN_CATEGORY_7_DAYS]++;
360 $returnData[self::LEGACY_PURCHASED_IN_CATEGORY_30_DAYS]++;
361 $returnData[self::LEGACY_PURCHASED_IN_CATEGORY_3_MONTHS]++;
362 } elseif ($isNewerThan30DaysAgo) {
363 $returnData[self::LEGACY_PURCHASED_IN_CATEGORY_30_DAYS]++;
364 $returnData[self::LEGACY_PURCHASED_IN_CATEGORY_3_MONTHS]++;
365 } elseif ($isNewerThan3MonthsAgo) {
366 $returnData[self::LEGACY_PURCHASED_IN_CATEGORY_3_MONTHS]++;
367 }
368 break;
369 case 'abandonedCart':
370 if ($isNewerThan7DaysAgo) {
371 $returnData[self::LEGACY_ABANDONED_CART_7_DAYS]++;
372 $returnData[self::LEGACY_ABANDONED_CART_30_DAYS]++;
373 $returnData[self::LEGACY_ABANDONED_CART_3_MONTHS]++;
374 } elseif ($isNewerThan30DaysAgo) {
375 $returnData[self::LEGACY_ABANDONED_CART_30_DAYS]++;
376 $returnData[self::LEGACY_ABANDONED_CART_3_MONTHS]++;
377 } elseif ($isNewerThan3MonthsAgo) {
378 $returnData[self::LEGACY_ABANDONED_CART_3_MONTHS]++;
379 }
380 break;
381 case 'firstPurchase':
382 if ($isNewerThan7DaysAgo) {
383 $returnData[self::LEGACY_FIRST_PURCHASE_7_DAYS]++;
384 $returnData[self::LEGACY_FIRST_PURCHASE_30_DAYS]++;
385 $returnData[self::LEGACY_FIRST_PURCHASE_3_MONTHS]++;
386 } elseif ($isNewerThan30DaysAgo) {
387 $returnData[self::LEGACY_FIRST_PURCHASE_30_DAYS]++;
388 $returnData[self::LEGACY_FIRST_PURCHASE_3_MONTHS]++;
389 } elseif ($isNewerThan3MonthsAgo) {
390 $returnData[self::LEGACY_FIRST_PURCHASE_3_MONTHS]++;
391 }
392 break;
393 }
394 }
395
396 return $returnData;
397 }
398
399 public function getProcessedCampaignAnalytics(): array {
400 $rawData = $this->sendingQueuesRepository->getCampaignAnalyticsQuery()->getArrayResult();
401 $processedResults = [];
402
403 foreach ($rawData as $sendingInfo) {
404 $meta = $sendingInfo['sendingQueueMeta'];
405 $campaignId = $meta['campaignId'] ?? null;
406
407 if (!is_string($campaignId)) {
408 continue;
409 }
410
411 if (!isset($processedResults[$campaignId])) {
412 $newsletterType = $sendingInfo['newsletterType'];
413 $processedData = [
414 'campaignId' => $campaignId,
415 'newsletterType' => $newsletterType,
416 'automaticSubType' => null,
417 'sentToSegment' => (bool)$sendingInfo['sentToSegment'],
418 'sentLast7Days' => (bool)$sendingInfo['sentLast7Days'],
419 'sentLast30Days' => (bool)$sendingInfo['sentLast30Days'],
420 'sentLast3Months' => (bool)$sendingInfo['sentLast3Months'],
421 'filteredBySegment' => !!($meta['filterSegment'] ?? null),
422 ];
423 $processedResults[$campaignId] = $processedData;
424 if ($newsletterType === NewsletterEntity::TYPE_AUTOMATIC) {
425 try {
426 // Although we could determine the subtype by joining the appropriate newsletter option field, using
427 // the meta should be just as reliable, and we need the meta anyway, so this keeps our query simpler.
428 $subType = $this->getLegacyAutomaticEmailSubtypeFromMeta($meta);
429 $processedResults[$campaignId]['newsletterType'] = $subType;
430 } catch (UnexpectedValueException $e) {
431 // Ignore this error, the `automatic` email type won't be counted
432 }
433 }
434 } else {
435 if ($sendingInfo['sentLast7Days']) {
436 $processedResults[$campaignId]['sentLast7Days'] = true;
437 }
438 if ($sendingInfo['sentLast30Days']) {
439 $processedResults[$campaignId]['sentLast30Days'] = true;
440 }
441 if ($sendingInfo['sentLast3Months']) {
442 $processedResults[$campaignId]['sentLast3Months'] = true;
443 }
444 if ($sendingInfo['sentToSegment']) {
445 $processedResults[$campaignId]['sentToSegment'] = true;
446 }
447 }
448 }
449
450 return $processedResults;
451 }
452
453 private function getLegacyAutomaticEmailSubtypeFromMeta(array $meta): string {
454 if (array_key_exists('orderedProducts', $meta)) {
455 return 'purchasedProduct';
456 }
457 if (array_key_exists('orderedProductCategories', $meta)) {
458 return 'purchasedInCategory';
459 }
460 if (array_key_exists('cart_product_ids', $meta)) {
461 return 'abandonedCart';
462 }
463 if (array_key_exists('order_amount', $meta) && array_key_exists('order_date', $meta) && array_key_exists('order_id', $meta)) {
464 return 'firstPurchase';
465 }
466
467 throw new UnexpectedValueException('Unknown automatic email type based on meta data');
468 }
469 }
470