CRM-17718 update repeattransaction to permit the financial_type_id to be passed in
[civicrm-core.git] / CRM / Contribute / BAO / Contribution.php
index 46a830b7c1891fd4b52ca7ed614578ea7de3b50e..3fc2f4ca4bddcd6f1fab3fa04fef75603ebf00d2 100644 (file)
@@ -2040,9 +2040,25 @@ LEFT JOIN  civicrm_contribution contribution ON ( componentPayment.contribution_
         'contribution_recur_id' => $contributionParams['contribution_recur_id'],
         'options' => array('limit' => 1),
       ));
+      if (!empty($contributionParams['contribution_recur_id'])) {
+        $recurringContribution = civicrm_api3('ContributionRecur', 'getsingle', array(
+          'id' => $contributionParams['contribution_recur_id'],
+        ));
+        if (!empty($recurringContribution['campaign_id'])) {
+          // CRM-17718 the campaign id on the contribution recur record should get precedence.
+          $contributionParams['campaign_id'] = $recurringContribution['campaign_id'];
+        }
+      }
+
       $contributionParams['skipLineItem'] = TRUE;
       $contributionParams['status_id'] = 'Pending';
-      $contributionParams['financial_type_id'] = $templateContribution['financial_type_id'];
+      if (isset($contributionParams['financial_type_id'])) {
+        // Give precedence to passed in type.
+        $contribution->financial_type_id = $contributionParams['financial_type_id'];
+      }
+      else {
+        $contributionParams['financial_type_id'] = $templateContribution['financial_type_id'];
+      }
       $contributionParams['contact_id'] = $templateContribution['contact_id'];
       $contributionParams['source'] = empty($templateContribution['source']) ? ts('Recurring contribution') : $templateContribution['source'];
       $createContribution = civicrm_api3('Contribution', 'create', $contributionParams);
@@ -4159,6 +4175,20 @@ WHERE con.id = {$contributionId}
     }
   }
 
+  /**
+   * Is there only one line item attached to the contribution.
+   *
+   * @param int $id
+   *   Contribution ID.
+   *
+   * @return bool
+   * @throws \CiviCRM_API3_Exception
+   */
+  public static function isSingleLineItem($id) {
+    $lineItemCount = civicrm_api3('LineItem', 'getcount', array('id' => $id));
+    return ($lineItemCount == 1);
+  }
+
   /**
    * Complete an order.
    *
@@ -4196,6 +4226,9 @@ WHERE con.id = {$contributionId}
       'campaign_id',
       'receive_date',
     );
+    if (self::isSingleLineItem($primaryContributionID)) {
+      $inputContributionWhiteList[] = 'financial_type_id';
+    }
 
     $contributionParams = array_merge(array(
       'contribution_status_id' => 'Completed',