}
}
+ //set defaults in create mode
+ if (!$contributionID) {
+ CRM_Core_DAO::setCreateDefaults($params, self::getDefaults());
+ }
+
//if contribution is created with cancelled or refunded status, add credit note id
if (!empty($params['contribution_status_id'])) {
$contributionStatus = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
if (($params['contribution_status_id'] == array_search('Refunded', $contributionStatus)
- || $params['contribution_status_id'] == array_search('Cancelled', $contributionStatus))
+ || $params['contribution_status_id'] == array_search('Cancelled', $contributionStatus))
) {
if (empty($params['creditnote_id']) || $params['creditnote_id'] == "null") {
$params['creditnote_id'] = self::createCreditNoteId();
}
}
}
-
- //set defaults in create mode
- if (!$contributionID) {
- CRM_Core_DAO::setCreateDefaults($params, self::getDefaults());
+ else {
+ // Since the fee amount is expecting this (later on) ensure it is always set.
+ // It would only not be set for an update where it is unchanged.
+ $params['contribution_status_id'] = civicrm_api3('Contribution', 'getvalue', array('id' => $contributionID, 'return' => 'contribution_status_id'));
}
+
self::calculateMissingAmountParams($params, $contributionID);
if (!empty($params['payment_instrument_id'])) {
),
);
+ // CRM-17787
+ $campaignTitle = array(
+ 'contribution_campaign_title' => array(
+ 'title' => ts('Campaign Title'),
+ 'name' => 'campaign_title',
+ 'where' => 'civicrm_campaign.title',
+ 'data_type' => CRM_Utils_Type::T_STRING,
+ ),
+ );
$softCreditFields = array(
'contribution_soft_credit_name' => array(
'name' => 'contribution_soft_credit_name',
);
$fields = array_merge($impFields, $typeField, $contributionStatus, $contributionPage, $optionField, $expFieldProduct,
- $expFieldsContrib, $contributionNote, $contributionRecurId, $extraFields, $softCreditFields, $financialAccount, $premiums,
+ $expFieldsContrib, $contributionNote, $contributionRecurId, $extraFields, $softCreditFields, $financialAccount, $premiums, $campaignTitle,
CRM_Core_BAO_CustomField::getFieldsForImport('Contribution', FALSE, FALSE, FALSE, $checkPermission)
);
if (!empty($input['amount'])) {
$contribution->total_amount = $contributionParams['total_amount'] = $input['amount'];
}
- $templateContribution = civicrm_api3('Contribution', 'getsingle', array(
- 'contribution_recur_id' => $contributionParams['contribution_recur_id'],
- 'options' => array('limit' => 1),
- ));
+ $templateContribution = CRM_Contribute_BAO_ContributionRecur::getTemplateContribution($contributionParams['contribution_recur_id']);
+ 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'];
+ }
+ if (!empty($recurringContribution['financial_type_id'])) {
+ // CRM-17718 the campaign id on the contribution recur record should get precedence.
+ $contributionParams['financial_type_id'] = $recurringContribution['financial_type_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);
empty($params['skipLineItem']) && !$isLineItem
) {
$taxRateParams = $taxRates[$params['financial_type_id']];
- $taxAmount = CRM_Contribute_BAO_Contribution_Utils::calculateTaxAmount($params['total_amount'], $taxRateParams);
+ $taxAmount = CRM_Contribute_BAO_Contribution_Utils::calculateTaxAmount(CRM_Utils_Array::value('total_amount', $params), $taxRateParams);
$params['tax_amount'] = round($taxAmount['tax_amount'], 2);
// Get Line Item on update of contribution
$params['line_item'][$setID][$priceFieldID]['tax_amount'] = $params['tax_amount'];
}
}
- $params['total_amount'] = $params['total_amount'] + $params['tax_amount'];
+ $params['total_amount'] = CRM_Utils_Array::value('total_amount', $params) + $params['tax_amount'];
}
elseif (isset($params['api.line_item.create'])) {
// Update total amount of contribution using lineItem
}
}
+ /**
+ * 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('contribution_id' => $id));
+ return ($lineItemCount == 1);
+ }
+
/**
* Complete an order.
*
'campaign_id',
'receive_date',
);
+ if (self::isSingleLineItem($primaryContributionID)) {
+ $inputContributionWhiteList[] = 'financial_type_id';
+ }
+
+ $participant = CRM_Utils_Array::value('participant', $objects);
+ $memberships = CRM_Utils_Array::value('membership', $objects);
+ $recurContrib = CRM_Utils_Array::value('contributionRecur', $objects);
+ $event = CRM_Utils_Array::value('event', $objects);
$contributionParams = array_merge(array(
'contribution_status_id' => 'Completed',
- 'financial_type_id' => $contribution->financial_type_id,
+ 'source' => self::getRecurringContributionDescription($contribution, $event),
), array_intersect_key($input, array_fill_keys($inputContributionWhiteList, 1)
));
- $participant = CRM_Utils_Array::value('participant', $objects);
- $memberships = CRM_Utils_Array::value('membership', $objects);
- $recurContrib = CRM_Utils_Array::value('contributionRecur', $objects);
if (!empty($recurContrib->id)) {
$contributionParams['contribution_recur_id'] = $recurContrib->id;
}
+ $changeDate = CRM_Utils_Array::value('trxn_date', $input, date('YmdHis'));
+
+ if (empty($contributionParams['receive_date']) && $changeDate) {
+ $contributionParams['receive_date'] = $changeDate;
+ }
+
self::repeatTransaction($contribution, $input, $contributionParams);
+ $contributionParams['financial_type_id'] = $contribution->financial_type_id;
if (is_numeric($memberships)) {
$memberships = array($objects['membership']);
}
- $changeDate = CRM_Utils_Array::value('trxn_date', $input, date('YmdHis'));
-
$values = array();
if (isset($input['is_email_receipt'])) {
$values['is_email_receipt'] = $input['is_email_receipt'];
if ($input['component'] == 'contribute') {
if ($contribution->contribution_page_id) {
+ // Figure out what we gain from this.
CRM_Contribute_BAO_ContributionPage::setValues($contribution->contribution_page_id, $values);
- $contributionParams['source'] = ts('Online Contribution') . ': ' . $values['title'];
}
elseif ($recurContrib && $recurContrib->id) {
- $contributionParams['contribution_page_id'] = NULL;
$values['amount'] = $recurContrib->amount;
$values['financial_type_id'] = $objects['contributionType']->id;
$values['title'] = $source = ts('Offline Recurring Contribution');
$values['receipt_from_email'] = $domainValues[1];
}
- if (empty($contributionParams['receive_date']) && $changeDate) {
- $contributionParams['receive_date'] = $changeDate;
- }
-
if ($recurContrib && $recurContrib->id && !isset($input['is_email_receipt'])) {
//CRM-13273 - is_email_receipt setting on recurring contribution should take precedence over contribution page setting
// but CRM-16124 if $input['is_email_receipt'] is set then that should not be overridden.
}
else {
if (empty($input['IAmAHorribleNastyBeyondExcusableHackInTheCRMEventFORMTaskClassThatNeedsToBERemoved'])) {
- $eventDetail = civicrm_api3('Event', 'getsingle', array('id' => $objects['event']->id));
- $contributionParams['source'] = ts('Online Event Registration') . ': ' . $eventDetail['title'];
- if ($eventDetail['is_email_confirm']) {
+ if ($event->is_email_confirm) {
// @todo this should be set by the function that sends the mail after sending.
$contributionParams['receipt_date'] = $changeDate;
}
return CRM_Core_BAO_FinancialTrxn::create($balanceTrxnParams);
}
+ /**
+ * Get the description (source field) for the recurring contribution.
+ *
+ * @param CRM_Contribute_BAO_Contribution $contribution
+ * @param CRM_Event_DAO_Event|null $event
+ *
+ * @return array
+ * @throws \CiviCRM_API3_Exception
+ */
+ protected static function getRecurringContributionDescription($contribution, $event) {
+ if (!empty($contribution->contribution_page_id)) {
+ $contributionPageTitle = civicrm_api3('ContributionPage', 'getvalue', array(
+ 'id' => $contribution->contribution_page_id,
+ 'return' => 'title',
+ ));
+ return ts('Online Contribution') . ': ' . $contributionPageTitle;
+ }
+ elseif ($event) {
+ return ts('Online Event Registration') . ': ' . $event->title;
+ }
+ return 'recurring contribution';
+ }
+
+ /**
+ * Function to add payments for contribution
+ * for Partially Paid status
+ *
+ * @param array $lineItems
+ * @param array $contributions
+ *
+ */
+ public static function addPayments($lineItems, $contributions) {
+ // get financial trxn which is a payment
+ $ftSql = "SELECT ft.id
+ FROM civicrm_financial_trxn ft
+ INNER JOIN civicrm_entity_financial_trxn eft ON eft.financial_trxn_id = ft.id AND eft.entity_table = 'civicrm_contribution'
+ WHERE eft.entity_id = %1 AND ft.is_payment = 1";
+ $sql = "SELECT fi.id, li.price_field_value_id
+ FROM civicrm_financial_item fi
+ INNER JOIN civicrm_line_item li ON li.id = fi.entity_id
+ WHERE li.contribution_id = %1";
+
+ foreach ($contributions as $k => $contribution) {
+ if ($contribution->contribution_status_id != CRM_Core_OptionGroup::getValue('contribution_status', 'Partially paid', 'name')) {
+ continue;
+ }
+ $ftId = CRM_Core_DAO::singleValueQuery($ftSql, array(1 => array($contribution->id, 'Integer')));
+ // get financial item
+ $dao = CRM_Core_DAO::executeQuery($sql, array(1 => array($contribution->id, 'Integer')));
+ while ($dao->fetch()) {
+ $ftIds[$dao->price_field_value_id] = $dao->id;
+ }
+
+ $params = array(
+ 'entity_table' => 'civicrm_financial_item',
+ 'financial_trxn_id' => $ftId,
+ );
+ foreach ($lineItems as $key => $value) {
+ $paid = $value['line_total'] * ($contribution->net_amount / $contribution->total_amount);
+ // Record Entity Financial Trxn
+ $params['amount'] = $paid;
+ $params['entity_id'] = $ftIds[$value['price_field_value_id']];
+
+ civicrm_api3('EntityFinancialTrxn', 'create', $params);
+ }
+ }
+ }
+
}