INFRA-132 - CRM/Event - phpcbf
[civicrm-core.git] / CRM / Mailing / BAO / MailingAB.php
index 6e2cc44dba1b9e951349b0d055b0b524d6edd2dd..a297aad6d106c2c0bd2374cda78b7ac2b0ae748b 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /*
  +--------------------------------------------------------------------+
- | CiviCRM version 4.5                                                |
+ | CiviCRM version 4.6                                                |
  +--------------------------------------------------------------------+
  | Copyright CiviCRM LLC (c) 2004-2014                                |
  +--------------------------------------------------------------------+
@@ -41,20 +41,20 @@ class CRM_Mailing_BAO_MailingAB extends CRM_Mailing_DAO_MailingAB {
   /**
    * class constructor
    */
-  function __construct() {
+  public function __construct() {
     parent::__construct();
   }
 
   /**
    * Construct a new mailingab object
    *
-   * @params array $params        Form values
+   * @params array $params
+   *   Form values.
    *
    * @param $params
    * @param array $ids
    *
    * @return object $mailingab      The new mailingab object
-   * @access public
    * @static
    */
   public static function create(&$params, $ids = array()) {
@@ -73,15 +73,16 @@ class CRM_Mailing_BAO_MailingAB extends CRM_Mailing_DAO_MailingAB {
   /**
    * function to add the mailings
    *
-   * @param array $params reference array contains the values submitted by the form
-   * @param array $ids reference array contains the id
+   * @param array $params
+   *   Reference array contains the values submitted by the form.
+   * @param array $ids
+   *   Reference array contains the id.
    *
-   * @access public
    * @static
    *
    * @return object
    */
-  static function add(&$params, $ids = array()) {
+  public static function add(&$params, $ids = array()) {
     $id = CRM_Utils_Array::value('mailingab_id', $ids, CRM_Utils_Array::value('id', $params));
 
     if ($id) {
@@ -93,7 +94,9 @@ class CRM_Mailing_BAO_MailingAB extends CRM_Mailing_DAO_MailingAB {
 
     $mailingab = new CRM_Mailing_DAO_MailingAB();
     $mailingab->id = $id;
-    $mailingab->domain_id = CRM_Utils_Array::value('domain_id', $params, CRM_Core_Config::domainID());
+    if (!$id) {
+      $mailingab->domain_id = CRM_Utils_Array::value('domain_id', $params, CRM_Core_Config::domainID());
+    }
 
     $mailingab->copyValues($params);
 
@@ -113,25 +116,53 @@ class CRM_Mailing_BAO_MailingAB extends CRM_Mailing_DAO_MailingAB {
   /**
    * Delete MailingAB and all its associated records
    *
-   * @param  int $id id of the mail to delete
+   * @param int $id
+   *   Id of the mail to delete.
    *
    * @return void
-   * @access public
    * @static
    */
   public static function del($id) {
     if (empty($id)) {
       CRM_Core_Error::fatal();
     }
+    CRM_Core_Transaction::create()->run(function() use ($id) {
+      CRM_Utils_Hook::pre('delete', 'MailingAB', $id, CRM_Core_DAO::$_nullArray);
+
+      $dao = new CRM_Mailing_DAO_MailingAB();
+      $dao->id = $id;
+      if ($dao->find(TRUE)) {
+        $mailing_ids = array($dao->mailing_id_a, $dao->mailing_id_b, $dao->mailing_id_c);
+        $dao->delete();
+        foreach ($mailing_ids as $mailing_id) {
+          if ($mailing_id) {
+            CRM_Mailing_BAO_Mailing::del($mailing_id);
+          }
+        }
+      }
+
+      CRM_Core_Session::setStatus(ts('Selected mailing has been deleted.'), ts('Deleted'), 'success');
+
+      CRM_Utils_Hook::post('delete', 'MailingAB', $id, $dao);
+    });
+  }
 
-    CRM_Utils_Hook::pre('delete', 'MailingAB', $id, CRM_Core_DAO::$_nullArray);
+  /**
+   * Transfer recipients from the canonical mailing A to the other mailings.
+   *
+   * @param CRM_Mailing_DAO_MailingAB $dao
+   */
+  public static function distributeRecipients(CRM_Mailing_DAO_MailingAB $dao) {
+    CRM_Mailing_BAO_Mailing::getRecipients($dao->mailing_id_a, $dao->mailing_id_a, NULL, NULL, TRUE);
 
-    $dao = new CRM_Mailing_DAO_MailingAB();
-    $dao->id = $id;
-    $dao->delete();
+    //calculate total number of random recipients for mail C from group_percentage selected
+    $totalCount = CRM_Mailing_BAO_Recipients::mailingSize($dao->mailing_id_a);
+    $totalSelected = max(1, round(($totalCount * $dao->group_percentage) / 100));
 
-    CRM_Core_Session::setStatus(ts('Selected mailing has been deleted.'), ts('Deleted'), 'success');
+    CRM_Mailing_BAO_Recipients::reassign($dao->mailing_id_a, array(
+      $dao->mailing_id_b => (2 * $totalSelected <= $totalCount) ? $totalSelected : $totalCount - $totalSelected,
+      $dao->mailing_id_c => max(0, $totalCount - $totalSelected - $totalSelected),
+    ));
 
-    CRM_Utils_Hook::post('delete', 'MailingAB', $id, $dao);
   }
 }