Commit | Line | Data |
---|---|---|
4aef704e | 1 | <?php |
4aef704e | 2 | /* |
3 | +--------------------------------------------------------------------+ | |
39de6fd5 | 4 | | CiviCRM version 4.6 | |
4aef704e | 5 | +--------------------------------------------------------------------+ |
6 | | Copyright CiviCRM LLC (c) 2004-2014 | | |
7 | +--------------------------------------------------------------------+ | |
8 | | This file is a part of CiviCRM. | | |
9 | | | | |
10 | | CiviCRM is free software; you can copy, modify, and distribute it | | |
11 | | under the terms of the GNU Affero General Public License | | |
12 | | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. | | |
13 | | | | |
14 | | CiviCRM is distributed in the hope that it will be useful, but | | |
15 | | WITHOUT ANY WARRANTY; without even the implied warranty of | | |
16 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | | |
17 | | See the GNU Affero General Public License for more details. | | |
18 | | | | |
19 | | You should have received a copy of the GNU Affero General Public | | |
20 | | License and the CiviCRM Licensing Exception along | | |
21 | | with this program; if not, contact CiviCRM LLC | | |
22 | | at info[AT]civicrm[DOT]org. If you have questions about the | | |
23 | | GNU Affero General Public License or the licensing of CiviCRM, | | |
24 | | see the CiviCRM license FAQ at http://civicrm.org/licensing | | |
25 | +--------------------------------------------------------------------+ | |
d25dd0ee | 26 | */ |
4aef704e | 27 | |
28 | /** | |
29 | * | |
30 | * APIv3 functions for registering/processing mailing ab testing events. | |
31 | * | |
32 | * @package CiviCRM_APIv3 | |
4aef704e | 33 | */ |
34 | ||
8b06123b TO |
35 | /** |
36 | * @param array $spec | |
37 | */ | |
38 | function _civicrm_api3_mailing_a_b_create_spec(&$spec) { | |
39 | $spec['created_date']['api.default'] = 'now'; | |
40 | $spec['created_id']['api.required'] = 1; | |
41 | $spec['created_id']['api.default'] = 'user_contact_id'; | |
42 | } | |
43 | ||
4aef704e | 44 | /** |
1747ab99 | 45 | * Handle a create mailing ab testing. |
4aef704e | 46 | * |
47 | * @param array $params | |
4aef704e | 48 | * |
a6c01b45 | 49 | * @return array |
72b3a70c | 50 | * API Success Array |
4aef704e | 51 | */ |
fd843187 | 52 | function civicrm_api3_mailing_a_b_create($params) { |
4aef704e | 53 | return _civicrm_api3_basic_create(_civicrm_api3_get_BAO(__FUNCTION__), $params); |
54 | } | |
55 | ||
56 | /** | |
57 | * Handle a delete event. | |
58 | * | |
59 | * @param array $params | |
4aef704e | 60 | * |
a6c01b45 | 61 | * @return array |
72b3a70c | 62 | * API Success Array |
4aef704e | 63 | */ |
fd843187 | 64 | function civicrm_api3_mailing_a_b_delete($params) { |
4aef704e | 65 | return _civicrm_api3_basic_delete(_civicrm_api3_get_BAO(__FUNCTION__), $params); |
66 | } | |
67 | ||
68 | /** | |
69 | * Handle a get event. | |
70 | * | |
71 | * @param array $params | |
dc64d047 | 72 | * |
4aef704e | 73 | * @return array |
74 | */ | |
fd843187 | 75 | function civicrm_api3_mailing_a_b_get($params) { |
4aef704e | 76 | return _civicrm_api3_basic_get(_civicrm_api3_get_BAO(__FUNCTION__), $params); |
77 | } | |
78 | ||
7811a84b | 79 | /** |
1747ab99 | 80 | * Adjust Metadata for submit action. |
7811a84b | 81 | * |
0aa0303c EM |
82 | * The metadata is used for setting defaults, documentation & validation. |
83 | * | |
481259e3 | 84 | * @param array $spec |
b081365f | 85 | * Array of parameters determined by getfields. |
7811a84b | 86 | */ |
481259e3 | 87 | function _civicrm_api3_mailing_a_b_submit_spec(&$spec) { |
768c558c TO |
88 | $mailingFields = CRM_Mailing_DAO_Mailing::fields(); |
89 | $mailingAbFields = CRM_Mailing_DAO_MailingAB::fields(); | |
90 | $spec['id'] = $mailingAbFields['id']; | |
91 | $spec['status'] = $mailingAbFields['status']; | |
92 | $spec['scheduled_date'] = $mailingFields['scheduled_date']; | |
93 | $spec['approval_date'] = $mailingFields['approval_date']; | |
94 | $spec['approval_status_id'] = $mailingFields['approval_status_id']; | |
95 | $spec['approval_note'] = $mailingFields['approval_note']; | |
96 | // Note: we'll pass through approval_* fields to the underlying mailing, but they may be ignored | |
97 | // if the user doesn't have suitable permission. If separate approvals are required, they must be provided | |
98 | // outside the A/B Test UI. | |
7811a84b | 99 | } |
100 | ||
101 | /** | |
1747ab99 | 102 | * Send A/B mail to A/B recipients respectively. |
7811a84b | 103 | * |
104 | * @param array $params | |
1747ab99 | 105 | * |
7811a84b | 106 | * @return array |
768c558c | 107 | * @throws API_Exception |
7811a84b | 108 | */ |
768c558c TO |
109 | function civicrm_api3_mailing_a_b_submit($params) { |
110 | civicrm_api3_verify_mandatory($params, 'CRM_Mailing_DAO_MailingAB', array('id', 'status')); | |
111 | ||
112 | if (!isset($params['scheduled_date']) && !isset($updateParams['approval_date'])) { | |
113 | throw new API_Exception("Missing parameter scheduled_date and/or approval_date"); | |
114 | } | |
7811a84b | 115 | |
768c558c TO |
116 | $dao = new CRM_Mailing_DAO_MailingAB(); |
117 | $dao->id = $params['id']; | |
118 | if (!$dao->find(TRUE)) { | |
119 | throw new API_Exception("Failed to locate A/B test by ID"); | |
7811a84b | 120 | } |
768c558c TO |
121 | if (empty($dao->mailing_id_a) || empty($dao->mailing_id_b) || empty($dao->mailing_id_c)) { |
122 | throw new API_Exception("Missing mailing IDs for A/B test"); | |
7811a84b | 123 | } |
124 | ||
768c558c TO |
125 | $submitParams = CRM_Utils_Array::subset($params, array( |
126 | 'scheduled_date', | |
127 | 'approval_date', | |
128 | 'approval_note', | |
129 | 'approval_status_id', | |
130 | )); | |
131 | ||
132 | switch ($params['status']) { | |
133 | case 'Testing': | |
134 | if (!empty($dao->status) && $dao->status != 'Draft') { | |
135 | throw new API_Exception("Cannot transition to state 'Testing'"); | |
136 | } | |
137 | civicrm_api3('Mailing', 'submit', $submitParams + array( | |
138 | 'id' => $dao->mailing_id_a, | |
139 | '_skip_evil_bao_auto_recipients_' => 0, | |
140 | )); | |
141 | civicrm_api3('Mailing', 'submit', $submitParams + array( | |
142 | 'id' => $dao->mailing_id_b, | |
143 | '_skip_evil_bao_auto_recipients_' => 1, | |
144 | )); | |
145 | CRM_Mailing_BAO_MailingAB::distributeRecipients($dao); | |
146 | break; | |
7811a84b | 147 | |
768c558c TO |
148 | case 'Final': |
149 | if ($dao->status != 'Testing') { | |
150 | throw new API_Exception("Cannot transition to state 'Final'"); | |
151 | } | |
152 | civicrm_api3('Mailing', 'submit', $submitParams + array( | |
153 | 'id' => $dao->mailing_id_c, | |
154 | '_skip_evil_bao_auto_recipients_' => 1, | |
155 | )); | |
156 | break; | |
157 | ||
158 | default: | |
159 | throw new API_Exception("Unrecognized submission status"); | |
7811a84b | 160 | } |
161 | ||
768c558c TO |
162 | return civicrm_api3('MailingAB', 'create', array( |
163 | 'id' => $dao->id, | |
164 | 'status' => $params['status'], | |
165 | 'options' => array( | |
166 | 'reload' => 1, | |
167 | ), | |
168 | )); | |
467cd00c | 169 | } |
170 | ||
171 | /** | |
1747ab99 | 172 | * Adjust Metadata for graph_stats action. |
467cd00c | 173 | * |
0aa0303c EM |
174 | * The metadata is used for setting defaults, documentation & validation. |
175 | * | |
cf470720 | 176 | * @param array $params |
b081365f | 177 | * Array of parameters determined by getfields. |
467cd00c | 178 | */ |
179 | function _civicrm_api3_mailing_a_b_graph_stats_spec(&$params) { | |
360aaa75 TO |
180 | $params['criteria']['title'] = 'Criteria'; |
181 | $params['criteria']['default'] = 'Open'; | |
182 | // mailing_ab_winner_criteria | |
183 | $params['target_date']['title'] = 'Target Date'; | |
184 | $params['target_date']['type'] = CRM_Utils_Type::T_DATE + CRM_Utils_Type::T_TIME; | |
bd6658bd | 185 | $params['split_count']['title'] = 'Split Count'; |
202ebbab | 186 | $params['split_count']['api.default'] = 6; |
bd6658bd | 187 | $params['split_count_select']['title'] = 'Split Count Select'; |
202ebbab | 188 | $params['split_count_select']['api.required'] = 1; |
360aaa75 | 189 | $params['target_url']['title'] = 'Target URL'; |
202ebbab | 190 | } |
467cd00c | 191 | |
192 | /** | |
1747ab99 | 193 | * Send graph detail for A/B tests mail. |
467cd00c | 194 | * |
195 | * @param array $params | |
1747ab99 | 196 | * |
467cd00c | 197 | * @return array |
360aaa75 | 198 | * @throws API_Exception |
467cd00c | 199 | */ |
200 | function civicrm_api3_mailing_a_b_graph_stats($params) { | |
202ebbab | 201 | civicrm_api3_verify_mandatory($params, |
202 | 'CRM_Mailing_DAO_MailingAB', | |
203 | array('id'), | |
204 | FALSE | |
205 | ); | |
467cd00c | 206 | |
360aaa75 TO |
207 | $defaults = array( |
208 | 'criteria' => 'Open', | |
209 | 'target_date' => CRM_Utils_Time::getTime('YmdHis'), | |
210 | 'split_count' => 6, | |
211 | 'split_count_select' => 1, | |
212 | ); | |
213 | $params = array_merge($defaults, $params); | |
202ebbab | 214 | |
360aaa75 | 215 | $mailingAB = civicrm_api3('MailingAB', 'getsingle', array('id' => $params['id'])); |
202ebbab | 216 | $graphStats = array(); |
467cd00c | 217 | $ABFormat = array('A' => 'mailing_id_a', 'B' => 'mailing_id_b'); |
218 | ||
202ebbab | 219 | foreach ($ABFormat as $name => $column) { |
360aaa75 TO |
220 | switch (strtolower($params['criteria'])) { |
221 | case 'open': | |
768c558c TO |
222 | $result = CRM_Mailing_Event_BAO_Opened::getRows($mailingAB['mailing_id_a'], NULL, TRUE, 0, 1, "civicrm_mailing_event_opened.time_stamp ASC"); |
223 | $startDate = CRM_Utils_Date::processDate($result[0]['date']); | |
360aaa75 TO |
224 | $targetDate = CRM_Utils_Date::processDate($params['target_date']); |
225 | $dateDuration = round(round(strtotime($targetDate) - strtotime($startDate)) / $params['split_count']); | |
202ebbab | 226 | $toDate = strtotime($startDate) + ($dateDuration * $params['split_count_select']); |
227 | $toDate = date('YmdHis', $toDate); | |
228 | $graphStats[$name] = array( | |
229 | $params['split_count_select'] => array( | |
230 | 'count' => CRM_Mailing_Event_BAO_Opened::getTotalCount($mailingAB[$column], NULL, TRUE, $toDate), | |
21dfd5f5 TO |
231 | 'time' => CRM_Utils_Date::customFormat($toDate), |
232 | ), | |
202ebbab | 233 | ); |
234 | break; | |
ea100cb5 | 235 | |
360aaa75 | 236 | case 'total unique clicks': |
202ebbab | 237 | $result = CRM_Mailing_Event_BAO_TrackableURLOpen::getRows($mailingAB['mailing_id_a'], NULL, TRUE, 0, 1, "civicrm_mailing_event_trackable_url_open.time_stamp ASC"); |
238 | $startDate = CRM_Utils_Date::processDate($result[0]['date']); | |
360aaa75 TO |
239 | $targetDate = CRM_Utils_Date::processDate($params['target_date']); |
240 | $dateDuration = round(abs(strtotime($targetDate) - strtotime($startDate)) / $params['split_count']); | |
202ebbab | 241 | $toDate = strtotime($startDate) + ($dateDuration * $params['split_count_select']); |
242 | $toDate = date('YmdHis', $toDate); | |
243 | $graphStats[$name] = array( | |
244 | $params['split_count_select'] => array( | |
245 | 'count' => CRM_Mailing_Event_BAO_TrackableURLOpen::getTotalCount($params['mailing_id'], NULL, FALSE, NULL, $toDate), | |
21dfd5f5 TO |
246 | 'time' => CRM_Utils_Date::customFormat($toDate), |
247 | ), | |
202ebbab | 248 | ); |
249 | break; | |
ea100cb5 | 250 | |
360aaa75 TO |
251 | case 'total clicks on a particular link': |
252 | if (empty($params['target_url'])) { | |
253 | throw new API_Exception("Provide url to get stats result for total clicks on a particular link"); | |
202ebbab | 254 | } |
360aaa75 TO |
255 | // FIXME: doesn't make sense to get url_id mailing_id_(a|b) while getting start date in mailing_id_a |
256 | $url_id = CRM_Mailing_BAO_TrackableURL::getTrackerURLId($mailingAB[$column], $params['target_url']); | |
202ebbab | 257 | $result = CRM_Mailing_Event_BAO_TrackableURLOpen::getRows($mailingAB['mailing_id_a'], NULL, FALSE, $url_id, 0, 1, "civicrm_mailing_event_trackable_url_open.time_stamp ASC"); |
258 | $startDate = CRM_Utils_Date::processDate($result[0]['date']); | |
360aaa75 TO |
259 | $targetDate = CRM_Utils_Date::processDate($params['target_date']); |
260 | $dateDuration = round(abs(strtotime($targetDate) - strtotime($startDate)) / $params['split_count']); | |
202ebbab | 261 | $toDate = strtotime($startDate) + ($dateDuration * $params['split_count_select']); |
262 | $toDate = CRM_Utils_Date::processDate($toDate); | |
263 | $graphStats[$name] = array( | |
264 | $params['split_count_select'] => array( | |
265 | 'count' => CRM_Mailing_Event_BAO_TrackableURLOpen::getTotalCount($params['mailing_id'], NULL, FALSE, $url_id, $toDate), | |
21dfd5f5 TO |
266 | 'time' => CRM_Utils_Date::customFormat($toDate), |
267 | ), | |
202ebbab | 268 | ); |
269 | break; | |
270 | } | |
271 | } | |
272 | ||
273 | return civicrm_api3_create_success($graphStats); | |
b0f9e1df | 274 | } |