infra updated incorrectly set public functions to private on payment classes
[civicrm-core.git] / api / v3 / MailingAB.php
old mode 100644 (file)
new mode 100755 (executable)
index 4c295ea..0661d49
@@ -1,8 +1,7 @@
 <?php
-
 /*
  +--------------------------------------------------------------------+
- | CiviCRM version 4.5                                                |
+ | CiviCRM version 4.6                                                |
  +--------------------------------------------------------------------+
  | Copyright CiviCRM LLC (c) 2004-2014                                |
  +--------------------------------------------------------------------+
@@ -24,7 +23,7 @@
  | GNU Affero General Public License or the licensing of CiviCRM,     |
  | see the CiviCRM license FAQ at http://civicrm.org/licensing        |
  +--------------------------------------------------------------------+
-*/
+ */
 
 /**
  *
  *
  */
 
-/**
- * Files required for this package
- */
-
 /**
  * Handle a create mailing ab testing
  *
  * @param array $params
- * @param array $ids
  *
- * @return array API Success Array
+ * @return array
+ *   API Success Array
  */
-function civicrm_api3_mailingab_create($params) {
+function civicrm_api3_mailing_a_b_create($params) {
   return _civicrm_api3_basic_create(_civicrm_api3_get_BAO(__FUNCTION__), $params);
 }
 
@@ -57,11 +52,11 @@ function civicrm_api3_mailingab_create($params) {
  * Handle a delete event.
  *
  * @param array $params
- * @param array $ids
  *
- * @return array API Success Array
+ * @return array
+ *   API Success Array
  */
-function civicrm_api3_mailingab_delete($params) {
+function civicrm_api3_mailing_a_b_delete($params) {
   return _civicrm_api3_basic_delete(_civicrm_api3_get_BAO(__FUNCTION__), $params);
 }
 
@@ -71,8 +66,199 @@ function civicrm_api3_mailingab_delete($params) {
  * @param array $params
  * @return array
  */
-function civicrm_api3_mailingab_get($params) {
+function civicrm_api3_mailing_a_b_get($params) {
   return _civicrm_api3_basic_get(_civicrm_api3_get_BAO(__FUNCTION__), $params);
 }
 
+/**
+ * Adjust Metadata for submit action
+ *
+ * The metadata is used for setting defaults, documentation & validation
+ * @param array $params
+ *   Array or parameters determined by getfields.
+ */
+function _civicrm_api3_mailing_a_b_submit_spec(&$params) {
+  $mailingFields = CRM_Mailing_DAO_Mailing::fields();
+  $mailingAbFields = CRM_Mailing_DAO_MailingAB::fields();
+  $spec['id'] = $mailingAbFields['id'];
+  $spec['status'] = $mailingAbFields['status'];
+  $spec['scheduled_date'] = $mailingFields['scheduled_date'];
+  $spec['approval_date'] = $mailingFields['approval_date'];
+  $spec['approval_status_id'] = $mailingFields['approval_status_id'];
+  $spec['approval_note'] = $mailingFields['approval_note'];
+  // Note: we'll pass through approval_* fields to the underlying mailing, but they may be ignored
+  // if the user doesn't have suitable permission. If separate approvals are required, they must be provided
+  // outside the A/B Test UI.
+}
+
+/**
+ * Send A/B mail to A/B recipients respectively
+ *
+ * @param array $params
+ * @return array
+ * @throws API_Exception
+ */
+function civicrm_api3_mailing_a_b_submit($params) {
+  civicrm_api3_verify_mandatory($params, 'CRM_Mailing_DAO_MailingAB', array('id', 'status'));
+
+  if (!isset($params['scheduled_date']) && !isset($updateParams['approval_date'])) {
+    throw new API_Exception("Missing parameter scheduled_date and/or approval_date");
+  }
+
+  $dao = new CRM_Mailing_DAO_MailingAB();
+  $dao->id = $params['id'];
+  if (!$dao->find(TRUE)) {
+    throw new API_Exception("Failed to locate A/B test by ID");
+  }
+  if (empty($dao->mailing_id_a) || empty($dao->mailing_id_b) || empty($dao->mailing_id_c)) {
+    throw new API_Exception("Missing mailing IDs for A/B test");
+  }
+
+  $submitParams = CRM_Utils_Array::subset($params, array(
+    'scheduled_date',
+    'approval_date',
+    'approval_note',
+    'approval_status_id',
+  ));
+
+  switch ($params['status']) {
+    case 'Testing':
+      if (!empty($dao->status) && $dao->status != 'Draft') {
+        throw new API_Exception("Cannot transition to state 'Testing'");
+      }
+      civicrm_api3('Mailing', 'submit', $submitParams + array(
+          'id' => $dao->mailing_id_a,
+          '_skip_evil_bao_auto_recipients_' => 0,
+        ));
+      civicrm_api3('Mailing', 'submit', $submitParams + array(
+          'id' => $dao->mailing_id_b,
+          '_skip_evil_bao_auto_recipients_' => 1,
+        ));
+      CRM_Mailing_BAO_MailingAB::distributeRecipients($dao);
+      break;
+
+    case 'Final':
+      if ($dao->status != 'Testing') {
+        throw new API_Exception("Cannot transition to state 'Final'");
+      }
+      civicrm_api3('Mailing', 'submit', $submitParams + array(
+          'id' => $dao->mailing_id_c,
+          '_skip_evil_bao_auto_recipients_' => 1,
+        ));
+      break;
+
+    default:
+      throw new API_Exception("Unrecognized submission status");
+  }
+
+  return civicrm_api3('MailingAB', 'create', array(
+    'id' => $dao->id,
+    'status' => $params['status'],
+    'options' => array(
+      'reload' => 1,
+    ),
+  ));
+}
+
+/**
+ * Adjust Metadata for graph_stats action
+ *
+ * The metadata is used for setting defaults, documentation & validation
+ * @param array $params
+ *   Array or parameters determined by getfields.
+ */
+function _civicrm_api3_mailing_a_b_graph_stats_spec(&$params) {
+  $params['criteria']['title'] = 'Criteria';
+  $params['criteria']['default'] = 'Open';
+  // mailing_ab_winner_criteria
+  $params['target_date']['title'] = 'Target Date';
+  $params['target_date']['type'] = CRM_Utils_Type::T_DATE + CRM_Utils_Type::T_TIME;
+  $params['split_count']['title'] = 'Split Count';
+  $params['split_count']['api.default'] = 6;
+  $params['split_count_select']['title'] = 'Split Count Select';
+  $params['split_count_select']['api.required'] = 1;
+  $params['target_url']['title'] = 'Target URL';
+}
+
+/**
+ * Send graph detail for A/B tests mail
+ *
+ * @param array $params
+ * @return array
+ * @throws API_Exception
+ */
+function civicrm_api3_mailing_a_b_graph_stats($params) {
+  civicrm_api3_verify_mandatory($params,
+    'CRM_Mailing_DAO_MailingAB',
+    array('id'),
+    FALSE
+  );
+
+  $defaults = array(
+    'criteria' => 'Open',
+    'target_date' => CRM_Utils_Time::getTime('YmdHis'),
+    'split_count' => 6,
+    'split_count_select' => 1,
+  );
+  $params = array_merge($defaults, $params);
 
+  $mailingAB = civicrm_api3('MailingAB', 'getsingle', array('id' => $params['id']));
+  $graphStats = array();
+  $ABFormat = array('A' => 'mailing_id_a', 'B' => 'mailing_id_b');
+
+  foreach ($ABFormat as $name => $column) {
+    switch (strtolower($params['criteria'])) {
+      case 'open':
+        $result = CRM_Mailing_Event_BAO_Opened::getRows($mailingAB['mailing_id_a'], NULL, TRUE, 0, 1, "civicrm_mailing_event_opened.time_stamp ASC");
+        $startDate = CRM_Utils_Date::processDate($result[0]['date']);
+        $targetDate = CRM_Utils_Date::processDate($params['target_date']);
+        $dateDuration = round(round(strtotime($targetDate) - strtotime($startDate)) / $params['split_count']);
+        $toDate = strtotime($startDate) + ($dateDuration * $params['split_count_select']);
+        $toDate = date('YmdHis', $toDate);
+        $graphStats[$name] = array(
+          $params['split_count_select'] => array(
+            'count' => CRM_Mailing_Event_BAO_Opened::getTotalCount($mailingAB[$column], NULL, TRUE, $toDate),
+            'time' => CRM_Utils_Date::customFormat($toDate),
+          ),
+        );
+        break;
+
+      case 'total unique clicks':
+        $result = CRM_Mailing_Event_BAO_TrackableURLOpen::getRows($mailingAB['mailing_id_a'], NULL, TRUE, 0, 1, "civicrm_mailing_event_trackable_url_open.time_stamp ASC");
+        $startDate = CRM_Utils_Date::processDate($result[0]['date']);
+        $targetDate = CRM_Utils_Date::processDate($params['target_date']);
+        $dateDuration = round(abs(strtotime($targetDate) - strtotime($startDate)) / $params['split_count']);
+        $toDate = strtotime($startDate) + ($dateDuration * $params['split_count_select']);
+        $toDate = date('YmdHis', $toDate);
+        $graphStats[$name] = array(
+          $params['split_count_select'] => array(
+            'count' => CRM_Mailing_Event_BAO_TrackableURLOpen::getTotalCount($params['mailing_id'], NULL, FALSE, NULL, $toDate),
+            'time' => CRM_Utils_Date::customFormat($toDate),
+          ),
+        );
+        break;
+
+      case 'total clicks on a particular link':
+        if (empty($params['target_url'])) {
+          throw new API_Exception("Provide url to get stats result for total clicks on a particular link");
+        }
+        // FIXME: doesn't make sense to get url_id mailing_id_(a|b) while getting start date in mailing_id_a
+        $url_id = CRM_Mailing_BAO_TrackableURL::getTrackerURLId($mailingAB[$column], $params['target_url']);
+        $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");
+        $startDate = CRM_Utils_Date::processDate($result[0]['date']);
+        $targetDate = CRM_Utils_Date::processDate($params['target_date']);
+        $dateDuration = round(abs(strtotime($targetDate) - strtotime($startDate)) / $params['split_count']);
+        $toDate = strtotime($startDate) + ($dateDuration * $params['split_count_select']);
+        $toDate = CRM_Utils_Date::processDate($toDate);
+        $graphStats[$name] = array(
+          $params['split_count_select'] => array(
+            'count' => CRM_Mailing_Event_BAO_TrackableURLOpen::getTotalCount($params['mailing_id'], NULL, FALSE, $url_id, $toDate),
+            'time' => CRM_Utils_Date::customFormat($toDate),
+          ),
+        );
+        break;
+    }
+  }
+
+  return civicrm_api3_create_success($graphStats);
+}